diff --git a/404.html b/404.html new file mode 100644 index 000000000..5a9162430 --- /dev/null +++ b/404.html @@ -0,0 +1,6 @@ +404 Page not found

404 错误

页面不存在

+ \ No newline at end of file diff --git a/archives/index.html b/archives/index.html new file mode 100644 index 000000000..03ff2c6e1 --- /dev/null +++ b/archives/index.html @@ -0,0 +1,6 @@ +Archives

Categories

+ \ No newline at end of file diff --git a/categories/develop/index.html b/categories/develop/index.html new file mode 100644 index 000000000..189cd567d --- /dev/null +++ b/categories/develop/index.html @@ -0,0 +1,31 @@ +Category: develop - Learning & Writing!

Categories

develop

+ \ No newline at end of file diff --git a/categories/develop/index.xml b/categories/develop/index.xml new file mode 100644 index 000000000..dfe207ce8 --- /dev/null +++ b/categories/develop/index.xml @@ -0,0 +1,130 @@ +develop on Learning & Writing!https://sbabybird.github.io/categories/develop/Recent content in develop on Learning & Writing!Hugo -- gohugo.iozh-cnThu, 07 Nov 2013 00:00:00 +0000使用vs2008编译mongodbhttps://sbabybird.github.io/p/%E4%BD%BF%E7%94%A8vs2008%E7%BC%96%E8%AF%91mongodb/Thu, 07 Nov 2013 00:00:00 +0000https://sbabybird.github.io/p/%E4%BD%BF%E7%94%A8vs2008%E7%BC%96%E8%AF%91mongodb/<h2 id="背景问题">背景问题</h2> +<p>mongodb在windwos下的官方编译包是使用vs2010编译的,从官网上下载的源代码在vs2008环境下不能直接编译通过,因为mongodb提供的相关配置文件是针对vs2010的,可能是因为mongodb最新的代码使用了部分C++11的特性,而vs2008没有提供对C++11支持的原因。可是我们在一个具体的项目上需要在vs2008环境下使用mongodb,只好通过手工修改部分配置和代码的办法完成编译。</p> +<h2 id="环境准备">环境准备</h2> +<p>mongodb是使用scons进行编译控制的,所以在进行以下编译之前需要安装并配置好如下环境:</p> +<h3 id="python27">python2.7</h3> +<p>官方建议是安装python2.7版本,而且要在环境变量PATH中加入python的安装路径和python/scripts的路径,以便在命令行中执行python脚本。 +<em>不过我在编译的时候使用的是python2.6版本,也没有发现问题</em></p> +<h3 id="scons">scons</h3> +<ul> +<li>直接去网上下载最新版本进行安装即可。</li> +</ul> +<h3 id="vs2008">vs2008</h3> +<ul> +<li>需要安装vc++的全部组件(主要是默认安装不带amd64的编译支持),如果只需要编译32位版本的话则可以忽略此条。</li> +<li>需要安装sp1补丁,否则会在编译时报错。</li> +</ul> +<h3 id="boost库">boost库</h3> +<ul> +<li> +<p>最好使用boost1.4.9版本,去官网上下载对应的源码包然后自己在vs2008的命令行环境下编译</p> +</li> +<li> +<p>编译boost的命令如下(只编译了所需库):</p> +<pre><code> bjam stage variant=debug --with-filesystem --with-thread --with-date_time --with-program_options --layout=versioned threading=multi toolset=msvc-10.0 --build-type=complete +</code></pre> +</li> +</ul> +<p><em>如果需要编译release版本,就把<code>variant</code>的选项改为<code>release</code>,如果需要编译64位的版本,就在以上命令中加入<code>address-model=64</code></em></p> +<h2 id="配置及代码修改">配置及代码修改</h2> +<h3 id="sconstruct文件修改">SConstruct文件修改</h3> +<p>SConstruct文件用于存放scons的关键配置信息,我们为了在vs2008下编译mongodb首先要做的就是修改mongodb源码下根目录的SConstruct文件。</p> +<ul> +<li> +<p>修改env配置,找到 evn = Environment</p> +<pre><code> env = Environment( BUILD_DIR=variantDir, +CLIENT_ARCHIVE='${CLIENT_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}', +CLIENT_DIST_BASENAME=get_option('client-dist-basename'), +CLIENT_LICENSE='#distsrc/client/LICENSE.txt', +CLIENT_SCONSTRUCT='#distsrc/client/SConstruct', +DIST_ARCHIVE_SUFFIX='.tgz', +EXTRAPATH=get_option(&quot;extrapath&quot;), +MODULE_BANNERS=[], +MODULETEST_ALIAS='moduletests', +MODULETEST_LIST='#build/moduletests.txt', +MSVS_ARCH=msarch , +PYTHON=utils.find_python(), +SERVER_ARCHIVE='${SERVER_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}', +TARGET_ARCH=msarch , +tools=[&quot;default&quot;, &quot;gch&quot;, &quot;jsheader&quot;, &quot;mergelib&quot;, &quot;unittest&quot;], +UNITTEST_ALIAS='unittests', +UNITTEST_LIST='#build/unittests.txt', +PYSYSPLATFORM=os.sys.platform, +PCRE_VERSION='8.30', +CONFIGUREDIR = '#' + scons_data_dir + '/sconf_temp', +CONFIGURELOG = '#' + scons_data_dir + '/config.log' +) +</code></pre> +</li> +</ul> +<p>在Environment里追加一条 <code>MSVC_VERSION='9.0'</code>,这是因为如果机器上有其他的编译环境,比如vs2010或vs2012,scons会自动使用他们的编译器进行编译,即使你是在vs2008的命令行环境下,我最初因为此问题困扰了很久,后来才只得强制指定编译器的版本,修改完成后如下:</p> +<pre><code>env = Environment( BUILD_DIR=variantDir, +CLIENT_ARCHIVE='${CLIENT_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}', +CLIENT_DIST_BASENAME=get_option('client-dist-basename'), +CLIENT_LICENSE='#distsrc/client/LICENSE.txt', +CLIENT_SCONSTRUCT='#distsrc/client/SConstruct', +DIST_ARCHIVE_SUFFIX='.tgz', +EXTRAPATH=get_option(&quot;extrapath&quot;), +MODULE_BANNERS=[], +MODULETEST_ALIAS='moduletests', +MODULETEST_LIST='#build/moduletests.txt', +MSVS_ARCH=msarch , +PYTHON=utils.find_python(), +SERVER_ARCHIVE='${SERVER_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}', +TARGET_ARCH=msarch , +tools=[&quot;default&quot;, &quot;gch&quot;, &quot;jsheader&quot;, &quot;mergelib&quot;, &quot;unittest&quot;], +UNITTEST_ALIAS='unittests', +UNITTEST_LIST='#build/unittests.txt', +PYSYSPLATFORM=os.sys.platform, +PCRE_VERSION='8.30', +CONFIGUREDIR = '#' + scons_data_dir + '/sconf_temp', +CONFIGURELOG = '#' + scons_data_dir + '/config.log', +MSVC_VERSION = '9.0' +) +</code></pre> +<ul> +<li> +<p>给编译器搜索路径增加你自己本地的boost库路径 +因为在编译时需要用到boost库,所以需要把你在本地的boost所在目录加入scons的环境,否则会报找不到boost头文件或链接库的错误,打开Sconstruct文件直接在最后加入如下代码</p> +<p>env.Append(CPPPATH=[&ldquo;d:/thirdlib/boost_1_49_0&rdquo;, &ldquo;d:/thirdlib/boost_1_49_0/boost/tr1&rdquo;], LIBPATH=[&ldquo;d:/thridlib/boost_1_49_0/stage/lib&rdquo;])</p> +<pre><code> *你在编译时需要将路径替换成你自己的* +</code></pre> +</li> +</ul> +<h3 id="准备stdinth">准备stdint.h</h3> +<ul> +<li>去这个地址<a class="link" href="https://msinttypes.googlecode.com/files/msinttypes-r26.zip" target="_blank" rel="noopener" +>https://msinttypes.googlecode.com/files/msinttypes-r26.zip</a>下载msinttypes,将压缩包里的stdint.h解压并复制到 <code>C:\Program Files\Microsoft Visual Studio 9.0\VC\include</code> 目录</li> +<li>修改mongodb源码目录下platform下的cstdint.h,将<code>#include&lt;cstdint&gt;</code>修改为<code>#include&lt;stdint.h&gt;</code>,将<code>#define _MONGO_STDINT_NAMESPACE std</code>这一行里的std注释掉,变成<code>#define _MONGO_STDINT_NAMESPACE /*std*/ </code></li> +<li>修改mongodb源码目录下util下的time_support.h,在文件开头加入<code>#include&lt;stdint.h&gt;</code>,否则在编译这个文件时会无法识别int64_t类型</li> +</ul> +<h3 id="修改windows_basich">修改windows_basic.h</h3> +<ul> +<li>修改mongodb源码目录下platform下的windows_basic.h,</li> +<li>在<code> #if !defined(NTDDI_WINXPSP3) || (NTDDI_VERSION &lt; NTDDI_WINXPSP3)</code> 之前加入 <code>#define NTDDI_WINXPSP3 0x05010300</code> 在<code>#if !defined(NTDDI_WS03SP2) || (NTDDI_VERSION &lt; NTDDI_WS03SP2)</code>之前加入<code>#define NTDDI_WS03SP2 0x05020200</code> 否则会报 &ldquo;32 bit mongo does not support Windows versions older than XP Service Pack 3&rdquo; 和&quot;64 bit mongo does not support Windows versions older than Windows Server 2003 SP 2&quot; 错误</li> +</ul> +<h3 id="修改listencpp和sockcpp">修改listen.cpp和sock.cpp</h3> +<ul> +<li> +<p>修改util下net下listen.cpp,在#include段之后加入如下代码</p> +<pre><code> #ifdef _WIN32 +#define EADDRINUSE WSAEADDRINUSE +#define ECONNABORTED WSAECONNABORTED +#define EBADF 9 +#define ENFILE 23 +#define EMFILE 24 +#endif +</code></pre> +</li> +<li> +<p>修改util下net下sock.cpp,在#include段之后加入如下代码</p> +<pre><code> #ifdef _WIN32 +#define EAGAIN 11 +#endif +</code></pre> +</li> +</ul> +<h2 id="开始编译">开始编译</h2> +<p>环境准备好之后,编译就比较简单了,打开vs2008命令行窗口,执行如下代码即可完成编译 +<code>scons --dd --32 mongoclient.lib</code></p> +<p>如果是编译release版本,就把&ndash;dd换成&ndash;release,如果是编译64位版本,就把&ndash;32换成&ndash;64</p> \ No newline at end of file diff --git a/categories/develop/page/1/index.html b/categories/develop/page/1/index.html new file mode 100644 index 000000000..c0b787a07 --- /dev/null +++ b/categories/develop/page/1/index.html @@ -0,0 +1 @@ +https://sbabybird.github.io/categories/develop/ \ No newline at end of file diff --git a/categories/hello/index.html b/categories/hello/index.html new file mode 100644 index 000000000..3a1be7ea2 --- /dev/null +++ b/categories/hello/index.html @@ -0,0 +1,31 @@ +Category: hello - Learning & Writing!

Categories

hello

+ \ No newline at end of file diff --git a/categories/hello/index.xml b/categories/hello/index.xml new file mode 100644 index 000000000..0d4c2a9f0 --- /dev/null +++ b/categories/hello/index.xml @@ -0,0 +1,2 @@ +hello on Learning & Writing!https://sbabybird.github.io/categories/hello/Recent content in hello on Learning & Writing!Hugo -- gohugo.iozh-cnMon, 29 Apr 2013 00:00:00 +0000Hello World!https://sbabybird.github.io/p/hello-world/Mon, 29 Apr 2013 00:00:00 +0000https://sbabybird.github.io/p/hello-world/<h2 id="hello">Hello</h2> +<h2 id="world">World</h2> \ No newline at end of file diff --git a/categories/hello/page/1/index.html b/categories/hello/page/1/index.html new file mode 100644 index 000000000..a3754a4c0 --- /dev/null +++ b/categories/hello/page/1/index.html @@ -0,0 +1 @@ +https://sbabybird.github.io/categories/hello/ \ No newline at end of file diff --git a/categories/index.html b/categories/index.html new file mode 100644 index 000000000..61f88930f --- /dev/null +++ b/categories/index.html @@ -0,0 +1,33 @@ +Categories

Categories

+ \ No newline at end of file diff --git a/categories/index.xml b/categories/index.xml new file mode 100644 index 000000000..5f973b1d6 --- /dev/null +++ b/categories/index.xml @@ -0,0 +1 @@ +Categories on Learning & Writing!https://sbabybird.github.io/categories/Recent content in Categories on Learning & Writing!Hugo -- gohugo.iozh-cnThu, 21 Sep 2023 00:00:00 +0000工具使用https://sbabybird.github.io/categories/%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/Thu, 21 Sep 2023 00:00:00 +0000https://sbabybird.github.io/categories/%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/<img src="https://sbabybird.github.io/categories/%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/cover.jpg" alt="Featured image of post 工具使用" />机器文摘https://sbabybird.github.io/categories/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98/Tue, 19 Sep 2023 00:00:00 +0000https://sbabybird.github.io/categories/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98/<img src="https://sbabybird.github.io/categories/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98/cover.jpg" alt="Featured image of post 机器文摘" />知识管理https://sbabybird.github.io/categories/%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86/Sat, 23 Apr 2022 00:00:00 +0000https://sbabybird.github.io/categories/%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86/读书笔记https://sbabybird.github.io/categories/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/Sun, 18 Apr 2021 00:00:00 +0000https://sbabybird.github.io/categories/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/随笔https://sbabybird.github.io/categories/%E9%9A%8F%E7%AC%94/Wed, 10 Feb 2021 00:00:00 +0000https://sbabybird.github.io/categories/%E9%9A%8F%E7%AC%94/<img src="https://sbabybird.github.io/categories/%E9%9A%8F%E7%AC%94/cover.jpg" alt="Featured image of post 随笔" />学习https://sbabybird.github.io/categories/%E5%AD%A6%E4%B9%A0/Sun, 02 Jun 2019 00:00:00 +0000https://sbabybird.github.io/categories/%E5%AD%A6%E4%B9%A0/SICPhttps://sbabybird.github.io/categories/sicp/Mon, 05 Jan 2015 00:00:00 +0000https://sbabybird.github.io/categories/sicp/mischttps://sbabybird.github.io/categories/misc/Thu, 13 Feb 2014 00:00:00 +0000https://sbabybird.github.io/categories/misc/develophttps://sbabybird.github.io/categories/develop/Thu, 07 Nov 2013 00:00:00 +0000https://sbabybird.github.io/categories/develop/hellohttps://sbabybird.github.io/categories/hello/Mon, 29 Apr 2013 00:00:00 +0000https://sbabybird.github.io/categories/hello/博客日记https://sbabybird.github.io/categories/%E5%8D%9A%E5%AE%A2%E6%97%A5%E8%AE%B0/Tue, 13 Nov 2007 00:00:00 +0000https://sbabybird.github.io/categories/%E5%8D%9A%E5%AE%A2%E6%97%A5%E8%AE%B0/ \ No newline at end of file diff --git a/categories/misc/index.html b/categories/misc/index.html new file mode 100644 index 000000000..90aad94ca --- /dev/null +++ b/categories/misc/index.html @@ -0,0 +1,31 @@ +Category: misc - Learning & Writing!

Categories

misc

+ \ No newline at end of file diff --git a/categories/misc/index.xml b/categories/misc/index.xml new file mode 100644 index 000000000..89204cf98 --- /dev/null +++ b/categories/misc/index.xml @@ -0,0 +1,27 @@ +misc on Learning & Writing!https://sbabybird.github.io/categories/misc/Recent content in misc on Learning & Writing!Hugo -- gohugo.iozh-cnThu, 13 Feb 2014 00:00:00 +0000win8系统下使用笔记本作为wifi热点https://sbabybird.github.io/p/win8%E7%B3%BB%E7%BB%9F%E4%B8%8B%E4%BD%BF%E7%94%A8%E7%AC%94%E8%AE%B0%E6%9C%AC%E4%BD%9C%E4%B8%BAwifi%E7%83%AD%E7%82%B9/Thu, 13 Feb 2014 00:00:00 +0000https://sbabybird.github.io/p/win8%E7%B3%BB%E7%BB%9F%E4%B8%8B%E4%BD%BF%E7%94%A8%E7%AC%94%E8%AE%B0%E6%9C%AC%E4%BD%9C%E4%B8%BAwifi%E7%83%AD%E7%82%B9/<h1 id="win8系统下使用笔记本作为wifi热点">win8系统下使用笔记本作为wifi热点</h1> +<h2 id="背景">背景</h2> +<p>在没有无线路由的情况下,比如出差在宾馆,如果手里有一台可以上网的笔记本电脑,则可以给手机、平板电脑或者其他笔记本提供一个可以上网的wifi热点。</p> +<p>我平时在单位即通过此方式给我的平板电脑和手机共享网络通道,比较方便实用,近期在使用的过程中遇到一些问题,经过摸索,解决了问题,在此记录一下,方便以后查阅。</p> +<h2 id="环境需要">环境需要</h2> +<ul> +<li>一台通过有线连接上网(或者通过3G上网,就是说wifi网卡没有被占用)的笔记本电脑</li> +<li>安装有win8操作系统(win7应该也可以)</li> +<li>无线网卡芯片是intel的(否则可能不支持此技术),并使用了最新的驱动程序</li> +</ul> +<h2 id="基本步骤">基本步骤</h2> +<ul> +<li> +<p>打开具有管理员权限的控制台窗口(在win8系统下,可以通过按<code>windows+x</code>键,然后在弹出的菜单里选择『命令提示符(管理员)』)</p> +</li> +<li> +<p>输入如下命令 <code>netsh wlan set hostednetwork mode=allow ssid=&quot;mywifi&quot; key=&quot;12345678&quot;</code> <em>其中ssid后面的热点名称和key后面的密码可以根据情况自行决定</em></p> +</li> +<li> +<p>上一个命令完成后,如果没有异常的话,则输入如下命令 <code>netsh wlan start hostednetwork</code> <em>这条命令如果执行成功会显示『已启动承载网络』,在下次系统重启后需要重新执行,如果嫌麻烦则可以做一个批处理文件每次双击即可</em></p> +</li> +<li> +<p>成功启动承载网络之后,进入『网络和共享中心』点击『更改适配器设置』,此时在该页里应该可以看到一个虚拟网卡(名称一般叫MicrosoftVirtual WiFi Miniport Adapter),右键点击那个可以上网的网络连接(如果是有线连接就是那个『本地连接』,如果是3G的则根据情况而定,总之必须是那个可以上网的连接),选择『属性』,切换到『共享』页,勾选『允许其他网络用户通过此计算机的Internet连接来连接』,在下面的下拉列表里选择那个刚虚拟出来的虚拟网卡。确定即可。</p> +</li> +</ul> +<h2 id="常见问题">常见问题</h2> +<p>执行以上第二条命令启动承载网络后,有时会显示『无法启动承载网络,组或资源的状态不是执行请求操作的正确状态』,网上大部分的文章针对这个问题给出的解决办法都是更新网卡驱动,可是对于我的笔记本无效,因为我的笔记本电脑在前一段时间是好用的,后来不好用了,根据我的摸索,解决这个问题的办法是,去『设备管理器』下面的『网络适配器』里面找找,看看有没有被禁用的设备,比如『微软托管网络协议』,如果禁用了再重新启用即可正常使用此功能了。</p> \ No newline at end of file diff --git a/categories/misc/page/1/index.html b/categories/misc/page/1/index.html new file mode 100644 index 000000000..ab875c1d5 --- /dev/null +++ b/categories/misc/page/1/index.html @@ -0,0 +1 @@ +https://sbabybird.github.io/categories/misc/ \ No newline at end of file diff --git a/categories/page/1/index.html b/categories/page/1/index.html new file mode 100644 index 000000000..59dc22590 --- /dev/null +++ b/categories/page/1/index.html @@ -0,0 +1 @@ +https://sbabybird.github.io/categories/ \ No newline at end of file diff --git a/categories/page/2/index.html b/categories/page/2/index.html new file mode 100644 index 000000000..51870d345 --- /dev/null +++ b/categories/page/2/index.html @@ -0,0 +1,33 @@ +Categories

Categories

+ \ No newline at end of file diff --git a/categories/page/3/index.html b/categories/page/3/index.html new file mode 100644 index 000000000..598c893e0 --- /dev/null +++ b/categories/page/3/index.html @@ -0,0 +1,33 @@ +Categories

Categories

+ \ No newline at end of file diff --git a/categories/sicp/index.html b/categories/sicp/index.html new file mode 100644 index 000000000..99be4aa41 --- /dev/null +++ b/categories/sicp/index.html @@ -0,0 +1,32 @@ +Category: SICP - Learning & Writing!

Categories

SICP

+ \ No newline at end of file diff --git a/categories/sicp/index.xml b/categories/sicp/index.xml new file mode 100644 index 000000000..a8e181528 --- /dev/null +++ b/categories/sicp/index.xml @@ -0,0 +1,576 @@ +SICP on Learning & Writing!https://sbabybird.github.io/categories/sicp/Recent content in SICP on Learning & Writing!Hugo -- gohugo.iozh-cnMon, 05 Jan 2015 00:00:00 +0000SICP 课后练习题1.9https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.9/Mon, 05 Jan 2015 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.9/<h4 id="练习-19--下面两个过程各定义了一种加起两个正整数的方法他们都基于过程inc它将参数增加1和dec它将参数减少1-请用代换模型展示这两个过程在求值add-4-5时所产生的计算过程这些计算过程是递归的或者迭代的吗">练习 1.9 下面两个过程各定义了一种加起两个正整数的方法,他们都基于过程inc(它将参数增加1)和dec(它将参数减少1) 。请用代换模型展示这两个过程在求值<code>(add 4 5)</code>时所产生的计算过程。这些计算过程是递归的或者迭代的吗?</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">add</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">= </span><span class="nv">a</span> <span class="mi">0</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">b</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="p">(</span><span class="nf">dec</span> <span class="nv">a</span><span class="p">)</span> <span class="nv">b</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">add</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">= </span><span class="nv">a</span> <span class="mi">0</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">b</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="p">(</span><span class="nf">dec</span> <span class="nv">a</span><span class="p">)</span> <span class="p">(</span><span class="nf">inc</span> <span class="nv">b</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> +</span></span></code></pre></td></tr></table> +</div> +</div><p>解答:根据代换模型分别展开如下</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span><span class="lnt">15 +</span><span class="lnt">16 +</span><span class="lnt">17 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">4</span> <span class="mi">5</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="mi">3</span> <span class="mi">5</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="mi">2</span> <span class="mi">5</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="mi">1</span> <span class="mi">5</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="mi">0</span> <span class="mi">5</span><span class="p">)))))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="mi">5</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="mi">6</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="mi">7</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="mi">8</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="mi">9</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">4</span> <span class="mi">5</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">3</span> <span class="mi">6</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">2</span> <span class="mi">7</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">1</span> <span class="mi">8</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">0</span> <span class="mi">9</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="mi">9</span><span class="p">)</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>根据展开可以看出,第一个计算过程是递归的,因为明显有一个逐步扩展然后又收缩的递归计算链条。第二个计算过程是迭代的,没有扩展、收缩的过程,而是使用a和b存储了常量。</p>SICP 课后练习题1.8https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.8/Mon, 29 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.8/<h4 id="练习-18-求立方根的牛顿法基于如下事实如果y是x的立方根的一个近似值那么下式将给出一个更好的近似值">练习 1.8 求立方根的牛顿法基于如下事实,如果y是x的立方根的一个近似值,那么下式将给出一个更好的近似值:</h4> +<p>$$ \frac{x/y^2+2y}{3} $$</p> +<p>请利用这一公式实现一个类似平方根过程的求立方根的过程。</p> +<p>解答:基本思路与求解平方根的实现是一致的,区别再有得到更好值<code>improve</code>的过程有变化,只需根据公式描述进行实现即可</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span><span class="lnt">15 +</span><span class="lnt">16 +</span><span class="lnt">17 +</span><span class="lnt">18 +</span><span class="lnt">19 +</span><span class="lnt">20 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">/</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">+ </span><span class="p">(</span><span class="nb">/ </span><span class="nv">x</span> <span class="p">(</span><span class="nb">* </span><span class="nv">guess</span> <span class="nv">guess</span><span class="p">))</span> <span class="p">(</span><span class="nb">* </span><span class="nv">guess</span> <span class="mi">2</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="mi">3</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">next</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">&lt; </span><span class="p">(</span><span class="nb">/ </span><span class="p">(</span><span class="nb">abs </span><span class="p">(</span><span class="nb">- </span><span class="nv">guess</span> <span class="nv">next</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="nv">guess</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mf">0.001</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nb">abs </span><span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&lt; </span><span class="nv">x</span> <span class="mi">0</span><span class="p">)</span> <span class="p">(</span><span class="nb">- </span><span class="nv">x</span><span class="p">)</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">cbrt-iter</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">cbrt-iter</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> <span class="nv">x</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">cbrt</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">cbrt-iter</span> <span class="mf">1.0</span> <span class="nv">x</span><span class="p">))</span> +</span></span></code></pre></td></tr></table> +</div> +</div>SICP 课后练习题1.7https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.7/Sat, 27 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.7/<h4 id="练习-17-对于确定很小的数的平方根而言在计算平方根中使用的检测good-enough是很不好的还有在现实的计算机里算术运算总是以一定的有限精度进行的这也会使我们的检测不适合非常大的数的计算请解释上述论断用例子说明对很小和很大的数这种检测都可能失败实现good-enough的另一种策略是监视猜测值在从一次迭代到下一次的变化情况当改变值相对于猜测值的比率很小时就结束请设计一个采用这种终止测试方式的平方根过程对于很大和很小的数这一方式都能工作吗">练习 1.7 对于确定很小的数的平方根而言,在计算平方根中使用的检测good-enough?是很不好的。还有,在现实的计算机里,算术运算总是以一定的有限精度进行的。这也会使我们的检测不适合非常大的数的计算。请解释上述论断,用例子说明对很小和很大的数,这种检测都可能失败。实现good-enough?的另一种策略是监视猜测值在从一次迭代到下一次的变化情况,当改变值相对于猜测值的比率很小时就结束。请设计一个采用这种终止测试方式的平方根过程。对于很大和很小的数,这一方式都能工作吗?</h4> +<p>解答:good-enough?当前采用的判断方式是,对比猜测值的平方结果与X的值之间的差距,当差距小于某个阙值时(比如0.001),就停止计算。当X很小或很大时,这种检测就会失败,比如,假设我们的阙值设置为0.001,那么当X本身小于这个阙值时,就会检测失败,得出错误结果,当X很大时,也会由于精度不足而一直达不到最佳猜测值,导致死循环。</p> +<p>因此,要解决这一问题,可以按照题目中给出的思路对good-enough?过程进行修改,不再判断猜测值平方与X的差距,而是判断两次猜测值之间的比率。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span><span class="lnt">15 +</span><span class="lnt">16 +</span><span class="lnt">17 +</span><span class="lnt">18 +</span><span class="lnt">19 +</span><span class="lnt">20 +</span><span class="lnt">21 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">next</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">&lt; </span><span class="p">(</span><span class="nb">/ </span><span class="p">(</span><span class="nb">abs </span><span class="p">(</span><span class="nb">- </span><span class="nv">guess</span> <span class="nv">next</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="nv">guess</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mf">0.001</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: good-enough?</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">sqrt-iter</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">sqrt-iter</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> <span class="nv">x</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: sqrt-iter</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="nb">sqrt </span><span class="mf">0.00000000001</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 3.1622776601874535e-6</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="nb">sqrt </span><span class="mi">100000000000000000000000000000000000000000000</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 1.0000000000001497e22</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>在新的<code>good-enough?</code>中,传入的是两次猜测值,所以还要修改<code>sqrt-iter</code>过程,在调用时计算两次猜测值。</p>SICP 课后练习题1.6https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.6/Tue, 23 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.6/<p>采用牛顿法求平方根的过程如下。开始时,我们有了被开方数的值(现在需要做的就是算出它的平方根)和一个猜测值。如果猜测值已经足够好了,有关工作也就完成了。如若不然,那么就需要改进猜测值(求出猜测值与被开方数除以猜测值的平均值),并重复这个计算过程。具体编写代码如下(在MIT scheme解释器中)。</p> +<p>定义<code>sqrt-iter</code>过程,与上述描述完全对应。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">sqrt-iter</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">guess</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">sqrt-iter</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">x</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: sqrt-iter</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义改进猜测值的过程<code>improve</code>,返回猜测值与被开方数除以猜测值的平均值。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">average</span> <span class="nv">guess</span> <span class="p">(</span><span class="nb">/ </span><span class="nv">x</span> <span class="nv">guess</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: improve</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义求平均数的过程<code>average</code>。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">average</span> <span class="nv">x</span> <span class="nv">y</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">/ </span><span class="p">(</span><span class="nb">+ </span><span class="nv">x</span> <span class="nv">y</span><span class="p">)</span> <span class="mi">2</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: average</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义判断猜测值是否足够好的过程<code>good-enough?</code>。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">&lt; </span><span class="p">(</span><span class="nb">abs </span><span class="p">(</span><span class="nb">- </span><span class="p">(</span><span class="nf">square</span> <span class="nv">guess</span><span class="p">)</span> <span class="nv">x</span><span class="p">))</span> <span class="mf">0.001</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: good-enough?</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义求绝对值和平方的过程</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span><span class="lnt">8 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nb">abs </span><span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&lt; </span><span class="nv">x</span> <span class="mi">0</span><span class="p">)</span> <span class="p">(</span><span class="nb">- </span><span class="nv">x</span><span class="p">)</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: abs</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">square</span> <span class="nv">x</span><span class="p">)</span> <span class="p">(</span><span class="nb">* </span><span class="nv">x</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: square</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义最上层的过程,用于启动整个工作(使用<code>1</code>这个数字作为任何数的初始猜测值)。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nb">sqrt </span><span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">sqrt-iter</span> <span class="mf">1.0</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: sqrt</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>执行<code>sqrt</code>过程,并以<code>9</code>为参数,求得平方根为<code>3</code></p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="nb">sqrt </span><span class="mi">9</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 3.00009155413138</span> +</span></span></code></pre></td></tr></table> +</div> +</div><h4 id="练习16----alyssa-phacker看不出来为什么需要将if提供为一种特殊形式她问为什么我不能直接通过cond将它定义为一个常规过程呢alyssa的朋友eva-lu-ator断言确实可以这样做并定义了if的一个新版本">练习1.6 Alyssa P.Hacker看不出来为什么需要将if提供为一种特殊形式,她问:“为什么我不能直接通过<code>cond</code>将它定义为一个常规过程呢?”Alyssa的朋友Eva Lu Ator断言确实可以这样做,并定义了<code>if</code>的一个新版本:</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">new-if</span> <span class="nv">predicate</span> <span class="nv">then-clause</span> <span class="nv">else-clause</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">cond </span><span class="p">(</span><span class="nf">predicate</span> <span class="nv">then-clause</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">else </span><span class="nv">else-clause</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: new-if</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>Eva给Alyssa演示她的程序:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">new-if</span> <span class="p">(</span><span class="nb">= </span><span class="mi">2</span> <span class="mi">3</span><span class="p">)</span> <span class="mi">0</span> <span class="mi">5</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mi">5</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">new-if</span> <span class="p">(</span><span class="nb">= </span><span class="mi">1</span> <span class="mi">1</span><span class="p">)</span> <span class="mi">0</span> <span class="mi">5</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mi">0</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>她很高兴地用自己的<code>new-if</code>重写了求平方根的程序:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">sqrt-iter</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">new-if</span> <span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">guess</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">sqrt-iter</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">x</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: sqrt-iter</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>当Alyssa试着用这个过程去计算平方根时会发生什么事情呢?请给出解释。</p> +<p>解答:</p> +<p>这个练习引入了一个新的思考,刚开始时,我以为是牵涉到了过程的局部参数概念,因为在新编写的<code>new-if</code>过程中,看似可以完成条件判断并返回正确的值,但是在本例中使用却存在问题,即在递归调用<code>sqrt-iter</code>时,传给该过程的<code>guess</code>和<code>x</code>为<code>new-if</code>的局部参数,被返回给了<code>new-if</code>这个过程,不会向上返回到上一层<code>sqrt-iter</code>里,这样就导致了改进的猜测值永远不会被使用,使得这个计算过程永远不会结束(除非第一个猜测值恰好合适),从而导致递归调用的陷入无限循环。我在<code>MIT-scheme</code>解释器里的执行结果是,解释器自动退出并提示我递归调用深度超出最大值。</p> +<p>上述看起来是合理的,但是后来我考虑了其他情况,及本书在前面章节里提到了if<code>(if &lt;predicate&gt; &lt;consequent&gt; &lt;alternative&gt;)</code>语句是条件表达式的受限形式,在执行时,先判断<code>predicate</code>是否为真,然后根据结果只执行其后<code>consequent/alternative</code>中的一个。如果使用本例新定义的<code>new-if</code>则作为普通过程执行,传入的参数会因为解释器使用应用序求值的原因,两个表达式都会被立即求值,反应到本例中就是<code>guess</code>和<code>(sqrt-iter (improve guess x) x)</code>都会被立即求值,后面的那句是属于递归调用,这样也会导致改进的猜测值永远不会被使用,陷入无限层的递归调用中。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="nb">sqrt </span><span class="mi">9</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Aborting!: maximum recursion depth exceeded</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>思考:</p> +<p>最初的时候,我的针对此题的思考方式是变量的作用域问题(可能lisp不会有此问题),后来发现,也许不是这样,而是由于对传入参数立即求值导致的,后续的网上搜索结果也显示出大家的答案都倾向于后者。</p>SICP 课后练习题1.4https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.4/Fri, 19 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.4/<h4 id="练习14----请仔细考察上面给出的允许运算符为复合表达式的组合式的求值模型根据对这一模型的认识描述下面过程的行为">练习1.4 请仔细考察上面给出的允许运算符为复合表达式的组合式的求值模型,根据对这一模型的认识描述下面过程的行为。</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">a-plus-abs-b</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">((</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="mi">0</span><span class="p">)</span> <span class="nv">+</span> <span class="nv">-</span><span class="p">)</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">))</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>练习1.4,通过if判断,根据b的值决定对a b所使用的运算符是+还是-,如果b大于0,则组合式为(+ a b),反之则为(- a b),所以组合式结果永远返回a加上b的绝对值。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span><span class="lnt">8 +</span><span class="lnt">9 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">a-plus-abs-b</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">((</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="mi">0</span><span class="p">)</span> <span class="nv">+</span> <span class="nv">-</span><span class="p">)</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: a-plus-abs-b</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">a-plus-abs-b</span> <span class="mi">4</span> <span class="mi">2</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 6</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">a-plus-abs-b</span> <span class="mi">4</span> <span class="mi">-2</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 6</span> +</span></span></code></pre></td></tr></table> +</div> +</div>SICP 课后练习题1.5https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.5/Fri, 19 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.5/<h4 id="练习15---ben-bitdiddle发明了一种检测方法能够确定解释器究竟采用哪种序求值是采用应用序还是正则序他定义了下面两个过程">练习1.5 Ben Bitdiddle发明了一种检测方法,能够确定解释器究竟采用哪种序求值,是采用应用序,还是正则序。他定义了下面两个过程</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">p</span><span class="p">)</span> <span class="p">(</span><span class="nf">p</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">test</span> <span class="nv">x</span> <span class="nv">y</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">= </span><span class="nv">x</span> <span class="mi">0</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mi">0</span> +</span></span><span class="line"><span class="cl"> <span class="nv">y</span><span class="p">))</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>而后他求值下面的表达式:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">test</span> <span class="mi">0</span> <span class="p">(</span><span class="nf">p</span><span class="p">))</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>如果某个解释器采用的是应用序求值,Ben会看到什么样的情况?如果解释器采用正则序求值,他又会看到什么情况?请对你的回答做出解释。(无论采用正则序或者应用序,假定特殊形式if的求值规则总是一样的。其中的谓词部分先行求值,根据其结果确定随后求值的子表达式部分。)</p> +<p>练习1.5 『完全展开而后规约』的求值模型为正则序求值,『先求值参数而后应用』的方式为应用序求值,因此,在应用序求值的模式下,执行<code>(test 0 (p))</code>时会先求<code>(p)</code>这个表达式的值,而根据定义<code>(define (p) (p))</code>执行<code>(p)</code>会造成递归调用,解释器陷入死循环。而在正则序求值模式下,会先展开<code>test</code>过程,根据需要再决定是否执行<code>(p)</code>,在本例中,由于传入的<code>x</code>等于<code>0</code>,所以<code>(p)</code>不会被执行,因此不会陷入死循环。</p> +<p>所以,根据以上分析,如果解释器采用的是应用序求值,则解释器陷入死循环,如果是采用正则序求值,则解释器输出<code>;Value: 0</code>。</p>SICP 课后练习题1.1https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.1/Mon, 15 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.1/<h4 id="练习11----下面是一系列表达式对于每个表达式解释器将输出什么结果假定这一系列表达式是按照给出的顺序逐个求值的">练习1.1 下面是一系列表达式,对于每个表达式,解释器将输出什么结果?假定这一系列表达式是按照给出的顺序逐个求值的。</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span><span class="lnt">15 +</span><span class="lnt">16 +</span><span class="lnt">17 +</span><span class="lnt">18 +</span><span class="lnt">19 +</span><span class="lnt">20 +</span><span class="lnt">21 +</span><span class="lnt">22 +</span><span class="lnt">23 +</span><span class="lnt">24 +</span><span class="lnt">25 +</span><span class="lnt">26 +</span><span class="lnt">27 +</span><span class="lnt">28 +</span><span class="lnt">29 +</span><span class="lnt">30 +</span><span class="lnt">31 +</span><span class="lnt">32 +</span><span class="lnt">33 +</span><span class="lnt">34 +</span><span class="lnt">35 +</span><span class="lnt">36 +</span><span class="lnt">37 +</span><span class="lnt">38 +</span><span class="lnt">39 +</span><span class="lnt">40 +</span><span class="lnt">41 +</span><span class="lnt">42 +</span><span class="lnt">43 +</span><span class="lnt">44 +</span><span class="lnt">45 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"><span class="mi">10</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 10</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="mi">5</span> <span class="mi">3</span> <span class="mi">4</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 12</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">9</span> <span class="mi">1</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 8</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">/ </span><span class="mi">6</span> <span class="mi">2</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 3</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="p">(</span><span class="nb">* </span><span class="mi">2</span> <span class="mi">4</span><span class="p">)</span> <span class="p">(</span><span class="nb">- </span><span class="mi">4</span> <span class="mi">6</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 6</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">define </span><span class="nv">a</span> <span class="mi">3</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: a</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">define </span><span class="nv">b</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="mi">1</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: b</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="nv">b</span> <span class="p">(</span><span class="nb">* </span><span class="nv">a</span> <span class="nv">b</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 19</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">= </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: #f</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="k">and </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="nv">a</span><span class="p">)</span> <span class="p">(</span><span class="nb">&lt; </span><span class="nv">b</span> <span class="p">(</span><span class="nb">* </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"><span class="nv">b</span> +</span></span><span class="line"><span class="cl"><span class="nv">a</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 4</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">cond </span><span class="p">((</span><span class="nb">= </span><span class="nv">a</span> <span class="mi">4</span><span class="p">)</span> <span class="mi">6</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">((</span><span class="nb">= </span><span class="nv">b</span> <span class="mi">4</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="mi">6</span> <span class="mi">7</span> <span class="nv">a</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">else </span><span class="mi">25</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 16</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="mi">2</span> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="nv">a</span><span class="p">)</span> <span class="nv">b</span> <span class="nv">a</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 6</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">* </span><span class="p">(</span><span class="k">cond </span><span class="p">((</span><span class="nb">&gt; </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> <span class="nv">a</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">((</span><span class="nb">&lt; </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">else </span><span class="mi">-1</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="mi">1</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 16</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>练习1.1的内容比较简单,基本上直接就可以计算出表达式的值,所有表达式都可以在mit-scheme的交互解释器里进行验证。</p>SICP 课后练习题1.2https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.2/Mon, 15 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.2/<h4 id="练习12----请将下面表达式变换为前缀形式">练习1.2 请将下面表达式变换为前缀形式:</h4> +<p>$$ \frac{5+4+\Bigl(2-\Bigl(3-\left(6+\frac{4}{5}\right)\Bigr)\Bigr)}{3\left(6-2\right)\left(2-7\right)} $$</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"><span class="p">(</span><span class="nb">/ </span><span class="p">(</span><span class="nb">+ </span><span class="mi">5</span> +</span></span><span class="line"><span class="cl"><span class="mi">4</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">2</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">3</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="mi">6</span> <span class="p">(</span><span class="nb">/ </span><span class="mi">4</span> <span class="mi">5</span><span class="p">)))))</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">* </span><span class="mi">3</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">6</span> <span class="mi">2</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">2</span> <span class="mi">7</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: -37/150</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>练习1.2,直接将数学表达式转换为前序表达式即可,在写的时候可以遵循一下排版规则,即同一个运算符的表达式垂直对齐。</p>SICP 课后练习题1.3https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.3/Mon, 15 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.3/<h4 id="练习13----请定义一个过程它以三个数为参数返回其中较大两个数之和">练习1.3 请定义一个过程,它以三个数为参数,返回其中较大两个数之和。</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span><span class="lnt">8 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">max-three-number</span> <span class="nv">a</span> <span class="nv">b</span> <span class="nv">c</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="nv">c</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="nv">c</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">a</span> <span class="nv">c</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">b</span> <span class="nv">a</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">b</span> <span class="nv">c</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">max-three-number</span> <span class="mi">42</span> <span class="mi">7</span> <span class="mi">1</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 49</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>练习1.3,解决此练习中问题的方法比较多,本答案使用比较朴素的方法,先比较出最大的两个数字,然后将其相加,对于三个数字来说,先在前两个中选取一个大的,然后将其与后面两个中比较大的那一个相加。还有一种思路就是可以先定义出比较大小的方法,然后再调用之,或者先对数字按从小到大排序然后加最后两个,等等。</p> \ No newline at end of file diff --git a/categories/sicp/page/1/index.html b/categories/sicp/page/1/index.html new file mode 100644 index 000000000..fcde217bf --- /dev/null +++ b/categories/sicp/page/1/index.html @@ -0,0 +1 @@ +https://sbabybird.github.io/categories/sicp/ \ No newline at end of file diff --git a/categories/sicp/page/2/index.html b/categories/sicp/page/2/index.html new file mode 100644 index 000000000..268f56cf5 --- /dev/null +++ b/categories/sicp/page/2/index.html @@ -0,0 +1,32 @@ +Category: SICP - Learning & Writing!

Categories

SICP

+ \ No newline at end of file diff --git "a/categories/\345\215\232\345\256\242\346\227\245\350\256\260/index.html" "b/categories/\345\215\232\345\256\242\346\227\245\350\256\260/index.html" new file mode 100644 index 000000000..bc5d4001f --- /dev/null +++ "b/categories/\345\215\232\345\256\242\346\227\245\350\256\260/index.html" @@ -0,0 +1,34 @@ +Category: 博客日记 - Learning & Writing!

Categories

博客日记

+ \ No newline at end of file diff --git "a/categories/\345\215\232\345\256\242\346\227\245\350\256\260/index.xml" "b/categories/\345\215\232\345\256\242\346\227\245\350\256\260/index.xml" new file mode 100644 index 000000000..3698210c2 --- /dev/null +++ "b/categories/\345\215\232\345\256\242\346\227\245\350\256\260/index.xml" @@ -0,0 +1,216 @@ +博客日记 on Learning & Writing!https://sbabybird.github.io/categories/%E5%8D%9A%E5%AE%A2%E6%97%A5%E8%AE%B0/Recent content in 博客日记 on Learning & Writing!Hugo -- gohugo.iozh-cnTue, 13 Nov 2007 00:00:00 +00002007-11-13https://sbabybird.github.io/p/2007-11-13/Tue, 13 Nov 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-11-13/<p>有几年不用Winamp了,最近Winamp又退出了10周年纪念版版。我下载了一个,感觉听听里面的网络电台什么的还挺不错的(边上班边听欧美最流行的音乐哈)。而且新版还包含了podcast的功能,可以搜索订阅网上的播客。在家听音乐的话,我还是选择foobar。</p> +<p>&ndash; +由 sbabybird 于 11/08/2007 07:49:00 下午 在 从容地狂奔上发表</p>2007-08-28https://sbabybird.github.io/p/2007-08-28/Tue, 28 Aug 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-08-28/<p>偶然翻看书架上的旧书,发现我以前在上面随手胡乱写了一个“梦幻配置”,那时应该是2000年,根据当时的硬件发展状况,我写了一个可望而不可及的硬件配置。具体什么配置就不说了(大概就是纯平显示器、笨三的cpu),反正现在让你用你还嫌慢呢。现在六、七年过去了,心里又痒痒的,就让我再写一个可望而不可及的硬件配置吧,看看这个配置何时会过时。</p> +<p>中央处理器:Intel Core2 Quad processor Q6700(4核,为了安静,散热采用水冷系统)</p> +<p>主板:Intel D975XBX2</p> +<p>内存:海盗船 TWIN2X2048-6400 ×4(共8G)</p> +<p>外存储:SanDisk 64G闪存硬盘(用于系统存储),2TB磁盘阵列(用于文件存储)</p> +<p>显卡:丽台NVIDIA Quadro FX 5600 ×2(每块显卡可接四台屏幕)</p> +<p>主显示器:Apple 30&quot; Cinema Display(上网、影视、游戏)</p> +<p>副显示器:Apple 20&quot; Cinema Display ×6(地理、虚拟现实、平面设计等)</p> +<p>Creative Sound Blaster X-Fi Elite Pro+罗技Z5500(用于电影、游戏、非专业录音)</p> +<p>主板数字光纤输出+外置解码器+JBL监听音箱(用于欣赏音乐)</p> +<p>操作系统:自己动手定做(编译)Linux版本,桌面环境采用GONE(如果有兴趣就自己写个操作系统)</p> +<p>备注:机箱易采用高厚度、高散热静音机箱,此系统搭建完成后将用于书房,共七台显示器需要用到特殊的显示器支架。</p>2007-08-04https://sbabybird.github.io/p/2007-08-04/Sat, 04 Aug 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-08-04/<p>不知是不是因为升级还没有进行完成,最近live spaces总是不能正常操作,用firefox访问有时还会出现乱码或者页面布局乱套,速度慢的惊人,资源占用很厉害。再加上他有太多的限制,这些问题都让我感到对live space失望透顶。衷心希望Google blogger能够早日解封!</p>2007-08-03https://sbabybird.github.io/p/2007-08-03/Fri, 03 Aug 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-08-03/<p>昨天去电影院看了《憨豆先生的黄金周》,感觉还不错,憨豆先生还是那么滑稽可乐,有着独特的幽默方式,我虽然没有笑到肚皮抽筋、掐着大腿,但是90分钟的电影还是让我由衷地笑了半个小时(累计)。这里就不介绍剧情了(一般来说这种喜剧基本没剧情可言),网上到处都是介绍。整个影片从头到尾憨豆先生都拿着那只SONY新出的DV,我估计SONY投了不少钱,还有就是片子的音乐配的还可以,轻快明亮。总的来说还值得一看。 +handouhandou2</p> +<pre><code> ps:现在的电影院真是不景气啊,能容纳500号人的大厅坐了不到100人,不过挺爽的,谁让他们把票价订的那么贵,现在的票价是我小时候电影票价的100倍</code></pre>2007-07-29https://sbabybird.github.io/p/2007-07-29/Sun, 29 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-29/<p>对于我来说,理发是件很痛苦的事情,可能是有心理障碍吧。小的时候被老爸强行摁住理过一次发,我像一只小鸡那样被夹在腿上无力反抗,由于整个过程我都在不停地叫骂那个理发的,所以那家伙下手还不含糊,把推子使得嚓嚓直响,对着我的头皮和耳朵可劲儿招呼。整个过程是漫长的、痛苦的、令人发指的。最后我看着镜子里的凸了吧唧的头,还不忘使劲儿拧了一把鼻涕抹在老爸的裤腿上。此事后来成为笑谈,但爷儿俩在理发这种事情上一直都持有不同的观点,当然了,我还只能提出强烈抗议、强烈不满、强烈谴责,但采取进一步措施的权利还是保留了。一直到现在,当老爸跟我说:“快去把头发理一理!”时,我还是乖乖的狂奔去理发。</p> +<pre><code> 不过,现在我离老爸远了,他管不了啦(主要是没看见),我可以尽情地把头发留到很长,然后再一下剪到很短(一般是回老家之前)。但是我的这种习惯却造成了另一件事情,给我理发的人极度不爽。每当我拖着留了几个月的长发走进理发店,告诉理发的师傅给我可劲儿剪短时,伊总是很扭捏,假惺惺地跟我说:“哎呀!你的发质这么好,又好不容易留了这么长,剪了多可惜啊!”其实谁不知道伊是想省点儿事儿,想拿剪刀在那三下两下剪完糊弄我。于是我只好说:“嗯嗯,本来是想留长的,但是现在突然想开了,不想留了,还是麻烦您给我剪短吧!”最后等着人家极不情愿(还很费时)地给我剪完,我才满意离去。但是这招下次就不能用了,所以我总是选择不同的理发店,反正这玩意儿多得是! +今天我又理发了,从五一到现在大概有三个月了,很抱歉,又让一个理发师傅不爽了一把,不管他,这次理完了,谁知道我什么时候有心情理下回呀!</code></pre>2007-07-24https://sbabybird.github.io/p/2007-07-24/Tue, 24 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-24/<p>天气这么闷热,生活这么枯燥,何不搞点小把戏调剂一下气氛呢?要是你现在刚好在办公室里,那么恭喜你了,下面我将教你几个在下秘密收藏的整蛊手段(一般人我不告诉他)。</p> +<pre><code> 前提条件:1、你们用计算机办公;2、你们使用的是Windows操作系统;3、你要整蛊的同事没有暴力倾向;4、他刚好暂时离开一下。 +好了,准备好了就开始行动吧! +场景一:“我的密码被改了?!” +如果你的这位同事有锁定计算机的习惯,那就刚好实施一下,在他计算机的锁定状态下的密码框里提前敲入一个空格,这样一般他回来时不会发觉,等他输入完自己的密码后,会发现进不去了!(因为密码前面多输入了一个空格)。 +场景二:“用来干活儿的软件没有反应了!” +如果他没有锁定计算机的习惯,那么刚才那个办法就不凑效了,怎么办呢,找到他用来工作的软件(VC,Word、Excel等),把帮助菜单里的“关于(about)”对话框给打开,然后用鼠标把对话框拖动到一个屏幕上看不见的地方。哈哈,等着吧,他回来会发现他用来工作的软件怎么也不听话了,无论点击哪儿都没有反应。 +场景三:“鼠标不好使了” +现在大家都用光电鼠标了,而光电鼠标全靠它屁股底下的那个激光眼,没错!你又猜对了,拿个小纸团把它那个小眼睛堵住,赶紧去吧!鼠标瞎了之后就罢工了。 +以上方法屡试不爽,我都亲自实验过,不过是别人在我身上实验的(这帮败家玩意儿)。 +</code></pre> +<p>注:以上操作纯属娱乐!产生后果自负。</p>2007-07-23https://sbabybird.github.io/p/2007-07-23/Mon, 23 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-23/<p>我手里这个Nokia 6230用了3年了,买的时候多加了一块电池。前两天,其中一块电池寿终正寝了,剩下的这块也差不多了,感觉就像我的胃,一吃就饱,一会儿就又饿了。我看着手里这个灰头土脸得就像从垃圾桶里捡回的手机,不禁有了换掉它的念头。</p> +<pre><code> 到网上翻了翻信息,结果让我很失望,感觉Nokia不太长进,眼看着人家索爱扛着音乐、摄像的大旗在市场上占了一席之地,自己也跟着别人的屁股转,也在那儿搞音乐手机、摄像手机,却忘了自己的特色。没办法,别的牌子不愿意用,老N最近推出的新机不是我看不上就是我的钱包不让看(靠,就这还敢冒充Nokia的粉丝呀?)。苹果的iPhone最近倒是炒得挺火,看起来也挺不错,可是总觉的那玩意儿离咱太遥远了,还是不多看了,以免中毒。 +在查看了众多机型之后,长叹一声:“究竟什么样的手机才能让我满意呢!” +</code></pre> +<p>总结以下大概要满足以下几点: +1、屏幕要足够大、分辨率不用极高但也不能太低 +2、反应速度一定要快(目前我还没有发现一款智能手机反应速度飞快) +3、个头不能太大、重量不能太沉 +4、电话、短信功能好用 +5、电量一定要持久,待机越长越好(这点最重要,功能再强没电也是白扯) +6、非国产(这个不用多说)</p> +<pre><code> 这些要求不过分吧?像什么摄像、音乐等功能都没要求,可愣是找不到这样一款手机,反复对比后发现还是目前手上的这个更合要求一些。算了,将就用吧。结果,昨晚做梦,梦见我也设计了一款手机,以上条件除了第六条其余都满足,取名就叫“nbPhone” 把苹果的Phone的风头给压下去了,乔布斯都跟我急了。</code></pre>2007-07-21https://sbabybird.github.io/p/2007-07-21/Sat, 21 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-21/<p>一个胖子,一个相貌平平而且豁牙的胖子,一个相貌平平而且豁牙的卖手机的胖子。这样的人参加选秀节目,如果你是评委的话,你会让他通过海选吗?如果他告诉你他要表演的是歌剧的话,你会跳下评委台把它踢出演播厅吗?!我想你会的,因为当时英国的那个选秀节目的评委也是这样想的。</p> +<pre><code> Paul Potts,这个我刚刚看到的英国小伙子,就是这样参加选秀节目的。当他极不自然地站在舞台上,傻傻地告诉评委他要表演歌剧,评委们都笑了,表现得有些不耐烦。可是,当他深情地唱起今夜无人入眠,当他那与帕瓦罗蒂一样激昂的男高音在演播厅响起时,赛场沸腾了!所有的人都站了起来,评委刁在嘴里的铅笔掉了下来,掌声雷动! +这段由朋友发过来、我甚至懒得看的视频,看得我头皮发麻。在起了一身鸡皮疙瘩后,我的眼睛也不争气地湿润了(震撼,感动)。看了别人写的介绍,我了解到,这个叫Paul的小伙子有着不太顺利的人生际遇(大多数人如此吧),但是他从未怀疑过自己的理想,仍然执着地追求着歌剧表演的艺术魅力,直到他被生活所逼而不得不靠卖手机来糊口时,仍未放弃!终于,上天给了他最后一次机会,他成功了,他向世人再一次的证明了:真正牛逼的人,终究会牛逼起来! +</code></pre> +<p>试了一下,msn的空间居然还可以插入视频!</p>2007-07-20https://sbabybird.github.io/p/2007-07-20/Fri, 20 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-20/<p>我都已经好几天没有照看我的msn空间了(最近太累),今天访问一下,发现界面居然有了变化(别三日,刮目看),嗯哼,原来是微软的Live小组把咱的空间给升级了。</p> +<pre><code>首先是界面的整体风格有了改变,我审美不行,看不出是好看还是难看,感觉貌似顺眼一些。空间上方仍然悬挂着那个大大的广告条(我一直看它不爽),工具条的宽度变宽了,这样会占用更多的空间。进入空间的“自定义”功能,发现提供的模板多了一些,但一个比一个不耐看,所以我什么也没有动,继续保持现状。一直希望Live空间能够提供类似WordPress那样的模板(多漂亮啊),现在看来,要走的路还比较长(Live小组继续加油啊!)。 +不过话又说回来,空间里整那么多花里胡哨的东东也没用,看得让人眼花缭乱的也不爽,我还是喜欢简约一点的风格,最好是让人进入我的空间后,感觉就像是打开了windows的记事本(过分了吧)。本来Google提供的那个blog挺好的,可是总是不能访问,还是老老实实的在微软提供的共享空间里得瑟吧。 +最后,再鄙视一下我自己,这几天由于懒惰而没有更新空间的内容,太不像话了!</code></pre>2007-07-19https://sbabybird.github.io/p/2007-07-19/Thu, 19 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-19/<p>随着一阵悦耳的下班铃声,我提前结束了一天的工作,按照惯例,周末了,要去打球。叫上同事,抱起篮球,飞快地奔向球场。终于逃脱了闪烁的计算机屏幕,逃脱了无聊的工作计划,逃脱了漫长的会议,逃脱了郁闷的代码&hellip;&hellip;</p> +<pre><code>各位观众,各位听众,也许你们刚刚打开电梯,现在为您直播的是--火星杯篮球锦标赛!穿着运动鞋牛仔裤正在捡球的那家伙就是我,看呐,我在球场上尽情地狂奔,边打球边哼着歌曲“啊哼三分球,它在空中停留,漂亮的假动作,帅呆了我......哦shit!球丢了”。一口气打了两三个小时,直打到有人气喘吁吁,打到有人双腿抽筋,打到有人口吐白沫还不肯离去。天渐渐黑了,球框渐渐虚无缥缈起来,收拾家伙,撤! +走到站牌,有车,有座,爽!上了高速,一路畅通,爽!到了家里,贤惠的老婆已经把饭菜做好,菜做的色香俱佳,啤酒冰得温度适中。如果这个时候你问我,什么是幸福?我会自在地夹一口菜,然后再悠闲地喝上一口啤酒,眯起眼睛跟你说:“嘛儿叫幸福?介就叫幸福!”</code></pre>2007-07-12https://sbabybird.github.io/p/2007-07-12/Thu, 12 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-12/<p>加班后回家的路上,路灯十分昏暗,还没有吃晚饭,心情极度郁闷,我缓缓(没力气狂奔了)走向公车站牌,走着,走着,突然!一个黑影窜了过来,他跟我说:“兄弟,要盗版光盘不?”我没有理他,继续走,走着,走着,突然!又一个黑影窜了过来,他跟我说:“兄弟,要发票吗?”我没有理他,继续走,走着,走着,突然(靠,有完没完啊!)一大一小两个黑影窜了出来,原来是一个中年妇女领着一个七八岁的小女孩儿,夜色中看不清面目。小孩开口说话了:“叔叔,给点儿钱让我买吃的吧,我都饿了一天了&hellip;&hellip;”边说还边做有气无力状,大人也在一边附和。说得我心里一软,鼻涕快掉下来了,差点儿掏钱。但是转念一想,我TM也饿了快一天啦,也没吃饭呢,再何况,她们的行为也太让我愤怒了,因为就凭这些个破烂演技拿来唬我也太侮辱我的智商了吧!于是,我友善的冲她们说道:“小朋友,你看”我用手指了指马路,“往前走500米,那里有家派出所,你过去找警察叔叔要些吃的好不好?”小孩一时不吭声(台词没背下来),大人接着说:“你就可怜我们,给我们几块钱,买包方便面也行啊!”(我靠,我这么晚了还没吃饭,我求您别勾引我的食欲了!)我没办法,掏出手机,说:“既然你们不愿意亲自过去,那我帮你们打110吧&hellip;&hellip;”这句话还没有说完,说时迟那时快,只听得“嗖嗖”两声,两个人全都不见踪影,公车站牌下只剩下我和随风飘舞的碎纸片(好身手!)。</p>2007-07-06https://sbabybird.github.io/p/2007-07-06/Fri, 06 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-06/<p>听说google出了在线翻译的工具,而且还广受大家的好评,在美国举行的一次翻译比赛中还拿了冠军。我虽不是google的粉丝但也对google的产品挺感兴趣的,于是赶紧凑个热闹,看看伟大的google能不能给我带来惊喜。 +由于我只会中文,那就看看google的英译中的水平怎么样。废话少说,赶紧拿来一首英文歌词《you needed me》(我最喜欢的英文歌曲之一)。</p> +<p>You needed me</p> +<p>I cries a tear you wiped it dry</p> +<p>I was confused you cleared my mind</p> +<p>I sold my soul you bought it back for me</p> +<p>And help me up and give me dignity</p> +<p>Somehow you needed me</p> +<p>You gave me strength to stand alone again</p> +<p>To face the world out on my own again</p> +<p>You put me high upon a pedestal</p> +<p>So high that I could almost see eternity</p> +<p>You needed me, you needed me</p> +<p>And I can&rsquo;t believe it&rsquo;s you +I can&rsquo;t believe it&rsquo;s true</p> +<p>I needed you and you were there</p> +<p>And I&rsquo;ll never leave why should I leave</p> +<p>I&rsquo;d be a fool</p> +<p>Cause I&rsquo;ve finally found someone</p> +<p>Who really cares</p> +<p>You held my hand when it was cold</p> +<p>When I lost you took me home</p> +<p>You gave me hope when I was at the end</p> +<p>And turned my lies back into truth again</p> +<p>You even called me friend</p> +<p>You gave me strength to stand alone again</p> +<p>To face the world out on my own again</p> +<p>You put me high upon a pedestal</p> +<p>So high that I could almost see eternity</p> +<p>You needed me ,you needed me</p> +<p>Oh, yes, you need me</p> +<p>You needed me</p> +<p>先试了一下整段翻译,把歌词复制进去,出来的结果让我忍俊不禁</p> +<p>google自动翻译的文字:</p> +<p>你需要我,我喊了眼泪,你擦它干,我摸你清我心中我卖出 我的灵魂,你买回来,我和帮助我,让我有点尊严,你需要我你们给了我力量单独再次面对世界走出自己再次你就把我小时 在室内一个台阶那么高,我几乎可以看到永恒,你需要我,多欧需要我,我也不相信是你,我不能相信这是真的,我需要你和你的笔 在此,我永远不会离开,我为何要离开我就是一个傻瓜,我的事业总算发现有人真的三白族你握着我的手,当它冷时,我输了,你带我家,你给了我希望钨 母鸡,我是在年底把我的谎言放回真话的时候,你甚至骂我的朋友,你克须缴我力量单独再次面对世界走出自己再次你就把我高美 无源一个台阶那么高,我几乎可以看到永恒,你需要我,你需要我哦,多 欧需要我,你需要我</p> +<p>唉,比较失望啊,试一下google的翻译网页的功能吧,找到歌词的网页,然后让它翻译</p> +<p>你需要我 +I cried a tear我哭了眼泪 +You wiped it dry你擦它干 +I was confused我很困惑 +You cleared my mind你清除了我的心 +I sold my soul我卖我的灵魂 +You bought it back for me你买回来,我 +And held the earth召开地球 +You gave me dignity你给我尊严 +Somehow you needed me某种程度上,你需要我 +You gave me strength你们给了我力量 +To stand alone again单独再次 +To face the world面对世界 +Out on my own again出自己再次 +You put me high你把我高 +Upon a pedestal当佩服 +So high that I could almost see eternity如此高,我几乎可以看到永恒 +You needed me你需要我 +You needed me你需要我 +I can&rsquo;t believe it&rsquo;s you我不能相信这是你 +I can&rsquo;t believe it&rsquo;s you我不能相信这是你 +I needed you我需要你 +And you were there你有 +And I&rsquo;ll never leave, why should I leave?和我永远不会离开,我为何要离开? +I needed you我需要你 +can I finally found someone who really cares可我终于发现有人真正关心 +(You needed me)(你需要我) +You held my hand你牵我的手 +It was cold据冷 +And I was lost我失去了 +You took me home你带我家 +You gave me love你们给我的爱 +That I was at the end我是在结束 +I turned my life我把我的生命 +Back into truth again You even called me &lsquo;friend&rsquo;放回真话的时候,你甚至骂我&rsquo;朋友&rsquo; +You gave me strength你们给了我力量 +To stand alone again单独再次 +To face the world面对世界 +Out on my own again出自己再次 +You put me high你把我高 +Upon a pedestal当佩服 +So high that I could almost see eternity如此高,我几乎可以看到永恒 +You needed me你需要我 +You needed me你需要我 +You needed me你需要我 +You needed me你需要我 +Oh, yes, you needed me哦,你需要我 +You needed me你需要我</p> +<p>呵呵,这下看起来还像那么回事儿.感觉机器还是代替不了人啊.翻译有感情的东西总是那么生硬.</p>2007-07-04https://sbabybird.github.io/p/2007-07-04/Wed, 04 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-04/<p>统计了一下我平时上班所需要的时间,要是堵车的话大概要一个小时多一些,要是特别堵的话大概要两个小时,要是跑步的话大概得三个小时多一些(推算的,可以忽略),要是夜里打车去上班的话大概得二十多分钟(极少,也可以忽略)。所以我一天大概有三个小时是堵在路上的,这导致了我的胃口极差,身材日渐消瘦,远看像铅笔近看像挂历!每天我都要坐在车上长吁短叹:“GR的堵车啊!”</p> +<pre><code>是什么原因造成了这样的状况? 原因有很多种,我想最直接的原因可能就是因为路上出现了车祸。无论是蹭了一下车屁股还是挂了一下后视镜,双方都会停好车,把路占上,然后撅起屁股在那儿查看爱车的状况,最后再各自打电话叫人......这个时候你要是刚好在路上,你就会感觉你置身于车的海洋,一辆挨着一辆的汽车望不到头,一片喇叭声,让人透不过气来。每当我乘坐的公交车慢慢的拱过出事地点,往往还能看到出事的双方(或多方)在那儿撅着。这种情况每天都要出现,所以每天都要堵车。 +据说从8月7号到8月20号,北京的交通管制要进行奥运预演.这对我们这些挤公交车上班的来说真是莫大的好消息啊!我们又可以感受像去年中非论坛期间的那种一路畅通的超快感了!不过,快乐永远是短暂的,过了那几天,还是得老老实实的坐在车去上体验“堵车不堵心”。</code></pre>2007-07-02https://sbabybird.github.io/p/2007-07-02/Mon, 02 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-02/<p>最羡慕那些有米的音响发烧友,手里攥着大把的钞票,买音响器材出手阔绰,有没有一双“金耳朵”不知道,反正当音响店的老板告诉他“这套音响,在听蔡琴唱歌的时候能听见她咽吐沫的声音”时,或者跟他说:“那套设备,在听交响乐的时候可以听见拉琴那小子不小心把曲谱翻掉在地上的声音”的时候,他们就会毫不犹豫的掏出几千乃至几万块大洋,把那些“宝贝”搬回家,反复的回放,听听蔡琴在什么时候换了一口气,或者听听吹长笛的坐在第几排。</p> +<pre><code>我也曾在这方面痴迷过,但仅仅是痴迷,没有什么实质性行动,原因很简单,掏不起那些闲钱呐!不过,在很早以前,读初中的时候就开始摆弄那些“音响器材”了,只是一堆喇叭,功率很小,大部分是从旧收录机上拆下来的,“音源”也就只有卡带,我曾试着把喇叭放到各种地方以调整他们的“音效”,比如放在蚊帐上除了可以在睡眠时有音乐环绕外还兼具“驱蚊”的效果,我为了得到更多的低音也曾把喇叭嵌入到书桌里(整个桌子就是音箱哈),甚至把喇叭放到洗衣机里,那音质真是惨不忍听。反正受当时的条件限制,我也只能是像小孩摆弄玩具似的,玩一玩儿而已,毕竟当时升学才是最大的目标。 +直到有一天,我翻看一本旧音响杂志,有人自制了个音箱,据说效果还不错,于是就动了自己也做一个的念头。再后来,到了上中师的时候,有了大把的空闲时间(但还是没空闲的钱),决定纯手工制作一只“有源音箱”!说干就干,开始行动!首先考虑的是功放电路采用什么形式,当时最佳的方案是使用“LM-1875”功放芯片,但由于囊中羞涩,最终放弃,后来买来一块晶体管放大板,也算将就了,喇叭买了两只,一个高音,一个中低音(8寸),向我大舅要来了分频器。让老家木匠邻居帮忙做了个音箱的框架,剩下的就是我和我的一个哥儿们亲自动手了。箱体的材料比较奢侈,把我家的一个桌子给锯了(靠!太过分了)。后来组装的时候才发现,我竟然忘了考虑功放的前级,没办法,再次求救与大舅,从旧收录机上拆下来一块板子作为前级(居然还可以调高低音调)。 +就这样,前前后后忙活了有半个星期,我的音箱终于发出处女声了,这个时候音源已经是一台VCD,那个时候我好像对蔡琴不感兴趣,于是先听了一首陈慧娴的《归来吧》,真是天籁啊!我当时感动的鼻涕都快掉下来了!当然了,我这么说是有一些夸张,其实音质不咋地,只是当时又没听过真正的音响,这只亲手做的音箱,让我体验到了充足的低音(说到低音,要感谢我的姥爷,他给了我一只大号的电源,具体功率不知道,反正很大很大),震耳欲聋的低音,就像是有人拿着锤子在敲打我的胸膛。 +这只音箱在当时带给了我无限的快乐和满足感,后来就去省会读大学了,买了电脑,买了几百块的音箱,那只音箱就被我扔到了角落,上面布满了灰尘。再后来,我干脆把它送给了我的大舅,听说他现在拿它当板凳,还挺结实的!</code></pre>2007-07-01https://sbabybird.github.io/p/2007-07-01/Sun, 01 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-01/<p>国外新兴一个叫Twitter的Web2.0站点,听说最近很火爆,很多人在那里叽叽咕咕,说一些有想法但又不至于发一篇bolg的“废话”。我去看了一眼,感觉跟那帮人文化差异挺大的也就没好意思去注册,但是国内的同志们也不示弱,一时间模仿该网站理念的站点如雨后春笋般涌现。在这些国内的叽咕站点里,有朋友就给我推荐这个“饭否”,说是一个迷你Blog,像Twitter一样,只是大家都是中国人,叽咕的内容比较容易懂一些。我这个人最爱尝鲜,就忍不住过去注册了一个帐号。</p> +<pre><code>感觉还不错,可以绑定MSN,QQ等IM软件,方便通过IM软件在上面发言,甚至可以绑定手机,让你随时随地的把感受发到网上。人气还是挺旺的,不断有人在上面喃喃自语,也不乏有一搭没一搭的聊天者。发布的内容可以很无聊,比如“今天的天气真好”,也可以很有深度,比如“你们好啊,地球人!” +呵呵,由于没用多久,所以还不能多加评论,我怀我有自闭的倾向,现在有了“饭否”,偶尔在里面发一下实时的感受,发泄一下心情而已,就当我是面对着墙壁在一个人喃喃自语吧。</code></pre>2007-06-30https://sbabybird.github.io/p/2007-06-30/Sat, 30 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-30/<p>早晨起来,像往常的周六一样,来到公司加班。打开电脑,然后习惯性的访问我的msn空间,“该页无法显示&hellip;.”,不会吧,难道是网络断开了?没有啊,空间主页还是可以访问的,怎么一切换到我的空间就“该页无法显示”了呢?强制刷新浏览器还是不行,随便点了一个朋友的空间,可以访问。完了!莫非我的msn space被封掉了?</p> +<pre><code>上网搜索一下,看看有没有出现同样问题的朋友,结果显示msn space无法访问是常有的事儿,很多人都有过类似经历(国内用户),这其中的原因不言自明啊!我开始回忆,在我的日志里面到底有没有不该出现的敏感词汇?想了半天,答案是没有。可是要说是msn sapce的故障吧,别人的空间又是可以访问的,无奈只好跟微软的客服发了封电子邮件,暂时还未收到回复。 +我刚开始写网络日志,不为影响别人的看法,只为记录一下暂时的心情,本以为放到网上比放在本地还安全(相信微软的技术水平),结果还给我来这一手,想记录的时候却无法访问了,弄的心里还挺难受,担心以前的日志会不会丢掉啊! +</code></pre> +<p>ps:就在刚才,它又突然可以访问了!</p>2007-06-29https://sbabybird.github.io/p/2007-06-29/Fri, 29 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-29/<p>今天又一次雨中漫步,原因很简单,受天气预报的干扰我又没带伞(干嘛要说又呢?)。拿起背包从容地奔向车站,嘴里也不忘哼着:“我能想到最郁闷的事~~,就是下雨却没有带伞~~”。淋雨就淋雨吧,挤上车,去思考一个很严重的问题,我的晚饭吃什么?别笑!这确实是一个很严重的问题。我不能像老婆在身边时那样说:“随便吧,做啥吃啥”(虽然心里想着最好炒两个菜,再冰上一瓶啤酒)。自己动手去做的话,倒不是嫌麻烦,只是吃我做的晚饭简直是虐待自己(大饼卷着馒头沾着米饭吃)。</p> +<pre><code>吃晚餐在我眼中确实是非常重要的事儿,平时上班的时候,早饭总是很虚无缥缈,不堵车的时候就慢慢坐在包子铺里吃包子,堵车时就没准儿了,也许是一个鸡蛋饼,也许是一个肉夹馍,也许,也许只有一杯开水。午饭就是普通的工作餐,千篇一律,除了米饭还是米饭。所以说,一日三餐也就晚饭是顿饭,我把吃晚饭看作是一件很神圣的事情,虽然不必在每次吃晚饭前都焚香沐浴,但我也在吃饭前做个深呼吸,抛开一天的烦恼,菩萨保佑、阿弥陀佛、无量天尊、阿门!感谢上天又让我吃了一顿晚饭!然后就对生活重新燃起热情,对工作又重新充满信心,活着不就是为了这顿晚饭嘛! +可是,现在,我看了看车窗外,雨停了,道路渐渐不再拥堵,我的胃却越来越堵,没有胃口,吃还是不吃,这是个问题。下了车,路边的麻辣烫小摊熏得我的胃一阵抽搐,不远处的油炸臭豆腐老板正在卖力的吆喝,卖盗版书的小贩倒是省事儿,在大喇叭里循环播放“六块一本儿,随便挑随便拣......”,喊得我头晕眼花,我真想冲过拿起他的喇叭然后在空中抛一个完美的弧线。 +还是那个晚饭情节,不想在外面饭馆里吃,尤其是一个人在饭馆里吃。 +拿起馒头,就着音乐和啤酒...... +</code></pre> +<p>pijiu</p> +<p>我怎么会舍得你走, +这一去竟是几个秋冬 +请你好好珍重 +无须挂念我太多 +我的爱和从前一样 +这承诺当是万般重要 +尽管容颜会老 +这一生无以为靠 +我还是会爱你到老 +我不会让你苦恼 +也许我始终无法释怀 +我会假装一切都好</p>2007-06-28https://sbabybird.github.io/p/2007-06-28/Thu, 28 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-28/<p>偶然在diglog里发现了鲜果在线这个网站,名字很好听,于是乎,我就点击进去看了看。看了之后真有一种相见恨晚的感觉,这个站点本身不提供什么信息,只是提供一个在线的RSS阅读器,而且它提供的RSS频道都是根据大家的兴趣和订阅量进行排序的,也就是说,看某个频道的人越多,该频道就越靠前。这样就可以看到大家都喜欢看的东西,那些垃圾信息不会浮上来了(感谢Web2.0啊!)。</p> +<pre><code>在线阅读的操作也十分简单容易上手,而且界面清爽,有比较强大的自定义功能(我靠,怎么这么像托儿啊),我订阅了一些精品的频道,比如Engadget、Solidot、cnBeta等,顺便订阅了王小峰的“不许联想”(这个博客比较能扯淡,这算是夸他了)。这下就不用Firefox的rss阅读器了,直接把订阅的频道放在鲜果在线里存储到网上,在家和在公司都能看到同样的新鲜信息了,重装系统也不怕,把东西都放到网上,我想这也是以后互联网发展的趋势吧...... +</code></pre> +<p>ps:其实我早就把收藏的网址也放到网上了,在Firefox里安装一个扩展&ndash;yoono,这个插件也很牛,有点儿像美味书签(del.icio.us),不过yoono最近增加了收藏整个网页的功能所以比较起来就更喜欢yoono。</p> +<p>分享:</p>2007-06-27https://sbabybird.github.io/p/2007-06-27/Wed, 27 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-27/<p>雨后的空气格外清新,天气还没有完全放晴,乡间的柏油路上还是湿的,远处缓缓驶来一辆摩托车,骑车的人叼着烟,看起来懒洋洋的,十分惬意,没错,那就是我。</p> +<pre><code>我这几天回老家了,因为要回去处理一些工作上的事情,这个机会十分难得,暂时逃开北京繁忙的工作,溜回老家,无拘无束,自由自在。 +目光所及,尽是农田。空气中还飘散着青草混合大粪的味道,也算是沁人心脾吧。 +</code></pre> +<p>别再徘徊沉寂的心灵 +别再留恋破碎的回忆 +大地迎春雷 +抛弃你满腹的忧虑 +缤纷的彩虹等着你 +别再犹豫等待的心湖 +别再沉迷过去的旧梦 +暖暖的春风 +走向那灿烂的天涯路 +耀眼的阳光迎着你</p>2007-06-19https://sbabybird.github.io/p/2007-06-19/Tue, 19 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-19/<p>电视上充斥着广告,其中不乏精品,看完之后让人心情舒畅然后心甘情愿的掏腰包去买他们的产品。但是大多数广告都庸俗不堪,让人看得心慌气短、胃部抽搐、浑身起鸡皮疙瘩。这其中不必说“收礼只收搓澡巾”,也不必说“洗洗更健康”,单就是那位一口气上五楼的大爷就能让人抓狂了。时间长了,这些广告我吐啊吐啊的也就习惯了,对于这类垃圾广告也有了一定的免疫能力。但是最近又有一个广告冲破了我的心理防线!那就是某饮料的变态广告“我拧你!”</p> +<pre><code>画面上,一群疯子在那里晃来晃去的踢腿,就像得了羊癫疯似的,整个广告看了让人不知道他们在表达什么另类理念,还好导演没忘记让他们每人手里拿着一瓶该品牌的饮料。我估计作者的思路来源与某天他的鞋里进了个小石子,然后他就不停的甩啊甩,一直甩不出来,直到喝了他那个饮料才甩了出来,于是就创作了这个广告。关键是你在电视上恶心恶心我也就算了,在上下班的公交车上居然也循环的播放,而且还衍生出不同的版本出来,里面就没有一个正常人,都拿个腿在那儿踢来踢去的。 +也许从某种层面上来说,这也是一个很成功的广告,我看见很多人吵着要下载那段抽风的音乐作为手机铃声,但是我绝对不会去喝一口那种饮料,我怕晚上会做噩梦,然后再一脚把被子给踢到床底下去......</code></pre>2007-06-18https://sbabybird.github.io/p/2007-06-18/Mon, 18 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-18/<p>你问:“把大象关冰箱里共分几步?”答:“分三步,把冰箱门打开,把大象放进去,把冰箱门带上”。你又问:“可是把大象关进去之后里面黑乎乎的大象不害怕吗?”反问:“你怎么知道关上之后里面还是黑乎乎的?你确定关上门之后那个灯灭了吗?”你:“~~~~~~”</p> +<p>这个问题曾经也困扰我很久,因为冰箱的门只要一打开那个灯就亮起来,可是关上门之后你又看不到里面,所以还是不能确定里面到底是什么情况。听说国外曾经有人为这事儿想不开去自杀,更有人为此急得抓耳挠腮夜里都睡不着觉,直到他把冰箱的门上凿了个洞,看清了原来关上冰箱门后那个小灯真的灭了,这才安稳的睡去(估计这哥们是一环保人士,担心那灯太费电)。</p> +<p>我没像那位牛人那样的使用暴力,但也自有办法。当然了,作为一个正常人,去探讨冰箱里的灯到底关了没有,这种做法实在是有些偏执(这不神经病吗!),你就姑且看作我是好奇心使然吧。反正,我的冰箱刚弄回来的时候我还真就动用了高科技手段&ndash;拍照手机,我那手机带了个30W像素的鸡肋摄像头这下派上用场了。</p> +<p>也是分了三步,把冰箱门打开,把手机定了时(定时10秒后拍摄)放进去,再把门带上。心中默念,时间到,开门取出,查看照片,出现了不可思议的结果!照片里那个灯竟然还亮着!再试一次,还是亮着。我那叫一个晕,觉得被冰箱厂家给忽悠了,口口声声说节能,这得多耗不少电呐。在仔细阅读了两遍说明书之后,总算恍然大悟,原来那不是普通的灯,它不仅仅担任了照明的工作(难道还用来制冷啊?),还兼具杀菌的功效,在关上门之后,它再持续照射几分钟食物,起到杀菌抑菌的效果。哦,原来如此,人家陈老师说了:“人不能无聊到这种地步!”</p>2007-06-17https://sbabybird.github.io/p/2007-06-17/Sun, 17 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-17/<p>又到了蚊子最猖獗的季节了,现在每晚都有蚊子在我耳边盘旋,嗡嗡的声音若隐若现,让我神经高度紧张,却又懒得起来招呼它们,无奈,硬着头皮睡去。第二天胳膊腿上到处都是蚊子们留下的吻痕&ndash;小红疙瘩,奇痒难忍。我发飙了,对付蚊子,我要开始行动!</p> +<p>刚开始我采用的是防守战略,听说食用葱姜蒜可以使皮肤排出的汗味具有天然的驱蚊效果,本想采用此方法,但是吃了大蒜那味儿我更受不了只得放弃。还是在洗澡的时候多放点花露水吧,“六神特效驱蚊花露水”据说效果很好,洗完澡往身上狂撒,安静的躺在床上,等待蚊子飘然而来再飘然而去。结果,效果欠佳,蚊子依然如故的为我唱着催眠曲,而且我还被花露水熏得神清气爽、失眠健忘。</p> +<p>防守看来不行,改变战略。男人!就要对别人狠一些!对付蚊子也不例外!狂奔去超市,买来“枪手”喷雾剂、“睡得香”电蚊香、电蚊拍、紫外光灭蚊灯等等,我要发起进攻了!晚饭毕,拿起“枪手”对卧室一通疯狂扫射,再将蚊香点燃,整个房间烟雾弥漫,关紧房门,外面客厅里的灭蚊灯发出幽幽的清华紫光。这下蚊子们彻底的玩完儿了,对不起了诸位,我已经够瘦弱了,您就给我留点儿血吧。</p> +<p>沐浴后,推开卧室门,兴冲冲准备打扫战场,刚推开门我就被呛得眼泪鼻涕都下来了(我刚才喷的不是催泪瓦斯吧),蚊子倒是没有了,只是这屋里也不能待了(已经感觉呼吸困难了),无奈只有掐灭蚊香,打开窗户,终于,新鲜的空气伴随着新鲜的蚊子又进来了。灭蚊灯、灭蚊拍也收效甚微。灭蚊战争暂告一段落,蚊子暂时领先。</p> +<p>先这样吧,实在不行就拿手拍吧, 要是懒得拍就猛开空调把他们冻死,再或者,如果我的反应足够灵敏的话,我就在它们叮我的那一刹那,暗运内力把它们的嘴夹在肌肉里,我憋死它们!</p>2007-06-16https://sbabybird.github.io/p/2007-06-16/Sat, 16 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-16/<p>如果有那么一天,我在沙滩上走着,突然从沙子里踢出一个神灯,我擦了三下,彭!的一声窜出一个魔鬼,对我龇牙咧嘴,非得满足我三个愿望。那么,我会许什么愿呢?我不会像周星驰那样无耻,许完了两个愿望后最后一个愿望竟是再要三个愿望。我想我也应该不那么自私,我会把头两个愿望交给公益事业,比如世界和平、环境保护啥的,然后留一个愿望给自己,那就是&ndash;我想睡个自然醒。</p> +<pre><code>自从告别了自在潇洒的大学生活,参加工作以后,我就没有睡够过,也不是完全没有时间睡觉,而是能有机会睡懒觉的时候我都睡不着。在一周里里面,工作日期间肯定没睡懒觉的可能,一大早就狂奔到车站去挤车了,晚上又很晚才睡,所以这期间是十分缺觉的。只有周末的早晨才能有机会赖在床上,可是问题来了,周末的早晨我倍儿精神!平日里闹钟响了还想把它摁掉再小睡一会儿,可一旦到了周末,我往往比闹钟醒的还早,而且再也睡不着。这是为什么呢,苦苦思索之后,得到答案:周末是属于我自己的自由时间而且很短暂,我不舍的拿这点儿宝贵时间来睡觉!平时没时间干的我只有等到周末了,平时听不了音乐就周末抱着音响使劲儿听,平时没时间弹琴就等到周末抱着电子琴使劲儿得瑟,平时没时间摄影等到周末就溜达出去一通狂拍...... 等等,有这些个好事儿等着我,我就算是想睡也真就睡不着了。 +所以,我也不祈求啥别的太奢侈的事儿,就让我睡个自然醒吧。</code></pre>2007-06-15https://sbabybird.github.io/p/2007-06-15/Fri, 15 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-15/<p>老家那边有些事儿需要老婆回去处理一下,用不了几天,可是转眼已经一个周过去了,据说还需要再呆几天才能回北京来。哎!郁闷呐!按照道理来说,作为一个正常的男人如果老婆回了娘家,那他应该感到万分的高兴才是(我曾经有个同事,从来都不吭声,结果有一次哼了一整天的小曲儿,一问才知道,人家老婆大人回娘家去了)。高兴是高兴,可是晚饭没有着落了,眼看着冰箱里的东西被我一点点地吃光了,就连平时不爱吃的饺子也在前天被我从冰箱的最底层翻了出来。家里实在没吃的那就在外面吃吧,昨晚上刚好有饭局,不吃白不吃啊,结果上当了,几个哥们儿都是贪杯的主儿,白的喝完换啤的, 啤的喝完换冰的,一直喝到丧心病狂&hellip;&hellip;饭还没吃上几口。搞得今天蔫了吧唧不说,还浑身上火, 鼻炎发作,咽炎发作,苦不堪言。</p> +<pre><code>站起来,叹了口气,转身就看到洗衣机里的衣服也快堆成小山了,都说能把袜子按颜色分类的男人和把袜子随便乱扔的男人是两种不同的生物,我显然是属于后者,看来只有等到周末统一解决了。</code></pre>2007-06-14https://sbabybird.github.io/p/2007-06-14/Thu, 14 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-14/<p>高考刚过,每年的这个时候都会有一大帮人在哪儿声泪俱下的控诉这万恶的高考制度。我也讨厌高考,但是在我的记忆里,另一种考试制度更令我恶心,那就是&mdash;-抽考!</p> +<pre><code>在我上小学的时后,比较害怕的就是考试了,但最让我感到不安的是每个班级选拔“尖子生”的过程。那个时候每到期末每个班级总是抽出学习成绩最好的几个同学参加镇上的抽考,他们的考试成绩直接代表了整个班级的学习成绩,也代表了老师的教学水平。私下里大家管抽到的这些学生叫“尖子生”。 +从小学到初中我几乎一路是“尖子生”,至于为什么要有“尖子生”,这样考试有什么意义我就不去想了,只知道如果被老师抽到当“尖子生”就全家开心,我在家也可以放肆一些,万一抽不到就没人给我好脸色。好在屡次的抽考过程中我只有两次没有被选中,不知是幸运还是不幸。 +其中一次是在小学二年级的时候,虽然没有被选中,但是也参加了考试(数学替考),当时我的情况是语文极差但数学很好(至少比那些“尖子”要好一些),老师为了他们的荣誉,便让我替另外一个考生参加了数学考试,试卷虽然是我答的却不能填写我的名字。好在当时也没什么自尊心,也就爽快的答应了,现在想一想作为老师也太不应该了。(这也是我后来虽念了师范却最终没有选择做老师的原因之一)。 +到后来就越来越抵制这种虚伪的考试,大概是四年级,我越来越贪玩,成绩真的不行了,要期末考试了,老师们纷纷挑选“尖子”,刚开始还被提名,后来经过多层过滤,勉强坚持到了最后一轮评测,直到我们伟大的辛勤的园丁说:“好了,那谁,你回去吧,其他人留下”。于是我提着书包灰溜溜回家,心里却说不出的高兴,不用去参加TMD关系到班集体荣誉的考试了!爽!哼哼,我冷笑,冷笑。现在回忆起来,脑子里仍旧充斥着老师们那因为贪图班级的名次而扭曲的面容(这就是原因之二)。 +不知道现在怎么样了,在当时,这样的考试制度,它伤了太多太多孩子的心。 +</code></pre> +<p>choukao</p> +<p>ps:</p> +<p>今日饮酒过渡</p> +<p>沉醉不知归路</p> +<p>兴尽打车走</p> +<p>误入小区深处</p> +<p>呕吐、呕吐</p> +<p>引来保安无数!</p>2007-06-13https://sbabybird.github.io/p/2007-06-13/Wed, 13 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-13/<p>早晨,NB烘烘的中国移动给我发天气预报说是阴转多云,在分析了昨晚电视上的预报加上收音机告诉我的降水概率后,我确定今天不会下雨,然后非常自信的没带伞就上班了,虽然头上的天阴的要滴水似的。</p> +<pre><code>谁知现在的天气预报已经不准确到让人发指的地步了!从下车到家的那段路程我只好雨中快步了(跑啊)。不是说现在计算机运算速度越来越快了吗?不是说建立的数据模型越来越接近真实了吗?不是说那什么风云N号也升空了吗?嗯?!忽悠谁啊!上次就报给我说最近西伯利亚那边有情况,未来几天有大风降温的天气,搞得我捂了一身痱子!现在到处是天气预报,各大网站上有,报纸上有,QQ上有,收音机、电视就更有了,而且还花样儿繁多,一会儿是穿衣指数,一会儿又洗车指数,最后还忽悠你个降水概率,有雨就有雨没雨就没雨,整个指数百分之60鬼才知道到底要不要下! +当然了,他们有预报准确的时候,那就是对局部地区的天气预报,反正局部地区天天要下雨甚至还有短时间的雷雨大风等强对流天气。我妈就曾经十分关切的问我:“为什么局部地区天天下雨,这个地区到底在哪儿?住在那儿的人可怎么活哟!” +算啦,也不跟他们计较,我还是回去翻翻小学的语文课本,好好拜读一下里面的那篇《看云识天气》,以后再也不相信这GR的天气预报了! +</code></pre> +<p>慢着,突然想起了倪萍大婶子曾经在“综艺大观”上做的即兴方言版天气预报,啧啧,那叫一个准啊!“社员同志们注意啦,哈。这个山东省荣成县寨子沟公社刘家村广播站现在开始播送天气预报,哈。这个明天头半晌儿阴有小雨儿,后半晌儿就变天了。南风转西北风7-8级。这个凄凄沥沥的小雨儿夹着嗖嗖的西北风,今儿刮,明儿刮儿,后儿还刮,一直刮到下个星期六,哈。这个咱再接着说天气预报。这个西北风一刮,这回最大的特点就是龙卷风,龙卷风啊,粮食要最重&hellip;.”</p>2007-06-12https://sbabybird.github.io/p/2007-06-12/Tue, 12 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-12/<p>初来北京的时候,家里托着亲戚的亲戚的关系让我在一家单位实习,就像鲁迅小说里写的那样,掌柜的是一副凶脸孔,主顾也没有好声气。那时我一个人住在前门外大栅栏里的一家小旅馆里。 +我住的胡同往北走几步一拐就是北京著名的“大栅栏步行街”,那儿有着浓厚的京味儿,经常看到成群的外国鬼子。他们不停的拍照,吃小吃,买工艺品,所以这里一天到晚人山人海热闹非凡。有时候我也去转转,只是转转,并不买东西,那些让老外一看见就双眼冒光的玩意儿对我并没有多大吸引力。 +小王,我住的旅店里的服务员,瘦瘦的,头戴一顶鸭舌帽,手腕上戴了一只便宜手表。 +一天下午,我一个人站在楼顶上特别无聊,正好小王上来,我递给他一根“中南海”他笑笑接住说:“一个人在外无聊吧?”我说:“是” 他说 “那我就给你讲讲这一片儿的故事吧!”,于是他就趴在栏杆上给我说了一通关于这个胡同的故事,说了这一带在清朝是曾经全是窑子。他抽了不少烟,我说“中南海这烟太冲了这边有没有柔和一点儿的烟?”他想了想说:“我抽的都是便宜烟,恩,不过便宜好抽就行&hellip;” 他给我说了两种。我到了晚上买来抽了几支觉得不好抽(那时我还不怎么抽烟)就都送给他了。以后就时常在一起谈天,混得很熟了,他经常早早的就把我的暖壶打满开水给提上来。 +只是又过了两三天,我一直也没见到小王,一问店老板才知道 :“他回老家了,他是离家出走才来到这个小店的,没钱了,才在这儿打工,不求挣钱只要有吃有睡就行,前两天他哥哥找到这里就把他带回去了。”老板很惋惜:“多好的孩子呀!”</p>2007-06-11https://sbabybird.github.io/p/2007-06-11/Mon, 11 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-11/<p>早晨的阳光真灿烂,虽然天气湿热有点儿桑拿天的苗头,但是我的心情很好,阳光洒在我的工作服上像是镶了金边,很是耀眼。对了,我是一个环卫工人,每天早晨都要在这儿清扫垃圾,这个工作是很神圣的,至少我这么认为,虽然和小时候的梦想(艺术家)差得很远,但是用某位相声演员的话说“这是一样一样一样的啊”!我愉快地拿起扫把,自在地吹着口哨,再把这条街扫完就可以收工了。我不由得加快了速度挥舞着扫把就像一个画家挥舞着手中的画笔,我气沉丹田暗用内力,短小的扫把被我使得是呼呼生风,卷起的沙尘就像一层薄雾。 +这个时候你出现了,挎着小包,下了公共汽车,高跟鞋踩在平坦的人行道上发出清脆的得得响,你的小手微微举起遮住当前还不算猛烈的太阳。真漂亮啊!我暗自赞道。上学时很不努力导致我的眼神儿非常好,我想,在工作时看到美女也算是一种福利吧!看着你向我走来,越走越近,不知是热的还是累得,我的手心开始出汗,我攥紧了扫把更卖力的扫了起来,地上的落叶伴随着纸片在沙尘中轻轻飞舞。你终于走到我的身边,冲我使劲的挥手,这么近的距离我终于看清了你的眼睛,很大、很圆,长长的睫毛。你竟然停下了脚步,盯住我迷离的眼神和唏嘘的胡茬,我期盼着你能给我说些什么,虽然黑夜给了你黑色的眼睛,但你却翻了个白眼儿给我:“你就不能轻点儿扫吗!还让不让人走路了!”。</p> \ No newline at end of file diff --git "a/categories/\345\215\232\345\256\242\346\227\245\350\256\260/page/1/index.html" "b/categories/\345\215\232\345\256\242\346\227\245\350\256\260/page/1/index.html" new file mode 100644 index 000000000..df3f88f79 --- /dev/null +++ "b/categories/\345\215\232\345\256\242\346\227\245\350\256\260/page/1/index.html" @@ -0,0 +1 @@ +https://sbabybird.github.io/categories/%E5%8D%9A%E5%AE%A2%E6%97%A5%E8%AE%B0/ \ No newline at end of file diff --git "a/categories/\345\215\232\345\256\242\346\227\245\350\256\260/page/2/index.html" "b/categories/\345\215\232\345\256\242\346\227\245\350\256\260/page/2/index.html" new file mode 100644 index 000000000..ad057ee51 --- /dev/null +++ "b/categories/\345\215\232\345\256\242\346\227\245\350\256\260/page/2/index.html" @@ -0,0 +1,35 @@ +Category: 博客日记 - Learning & Writing!

Categories

博客日记

+ \ No newline at end of file diff --git "a/categories/\345\215\232\345\256\242\346\227\245\350\256\260/page/3/index.html" "b/categories/\345\215\232\345\256\242\346\227\245\350\256\260/page/3/index.html" new file mode 100644 index 000000000..dd4d65f8e --- /dev/null +++ "b/categories/\345\215\232\345\256\242\346\227\245\350\256\260/page/3/index.html" @@ -0,0 +1,36 @@ +Category: 博客日记 - Learning & Writing!

Categories

博客日记

+ \ No newline at end of file diff --git "a/categories/\345\215\232\345\256\242\346\227\245\350\256\260/page/4/index.html" "b/categories/\345\215\232\345\256\242\346\227\245\350\256\260/page/4/index.html" new file mode 100644 index 000000000..637ecb665 --- /dev/null +++ "b/categories/\345\215\232\345\256\242\346\227\245\350\256\260/page/4/index.html" @@ -0,0 +1,36 @@ +Category: 博客日记 - Learning & Writing!

Categories

博客日记

+ \ No newline at end of file diff --git "a/categories/\345\215\232\345\256\242\346\227\245\350\256\260/page/5/index.html" "b/categories/\345\215\232\345\256\242\346\227\245\350\256\260/page/5/index.html" new file mode 100644 index 000000000..c4fe007f7 --- /dev/null +++ "b/categories/\345\215\232\345\256\242\346\227\245\350\256\260/page/5/index.html" @@ -0,0 +1,35 @@ +Category: 博客日记 - Learning & Writing!

Categories

博客日记

+ \ No newline at end of file diff --git "a/categories/\345\215\232\345\256\242\346\227\245\350\256\260/page/6/index.html" "b/categories/\345\215\232\345\256\242\346\227\245\350\256\260/page/6/index.html" new file mode 100644 index 000000000..b82d75d68 --- /dev/null +++ "b/categories/\345\215\232\345\256\242\346\227\245\350\256\260/page/6/index.html" @@ -0,0 +1,34 @@ +Category: 博客日记 - Learning & Writing!

Categories

博客日记

+ \ No newline at end of file diff --git "a/categories/\345\255\246\344\271\240/index.html" "b/categories/\345\255\246\344\271\240/index.html" new file mode 100644 index 000000000..211589c4a --- /dev/null +++ "b/categories/\345\255\246\344\271\240/index.html" @@ -0,0 +1,31 @@ +Category: 学习 - Learning & Writing!

Categories

学习

+ \ No newline at end of file diff --git "a/categories/\345\255\246\344\271\240/index.xml" "b/categories/\345\255\246\344\271\240/index.xml" new file mode 100644 index 000000000..c699ec0b0 --- /dev/null +++ "b/categories/\345\255\246\344\271\240/index.xml" @@ -0,0 +1,48 @@ +学习 on Learning & Writing!https://sbabybird.github.io/categories/%E5%AD%A6%E4%B9%A0/Recent content in 学习 on Learning & Writing!Hugo -- gohugo.iozh-cnSun, 02 Jun 2019 00:00:00 +0000线性回归和梯度下降https://sbabybird.github.io/p/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E5%92%8C%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D/Sun, 02 Jun 2019 00:00:00 +0000https://sbabybird.github.io/p/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E5%92%8C%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D/<h3 id="有监督学习的两种主要任务分类和回归">有监督学习的两种主要任务(分类和回归)</h3> +<ul> +<li>有监督机器学习任务主要分为两种,一种是分类任务,一般是通过学习算法实现对未知数据的分类甄别,比如判断是男性还是女性,预测明天会不会下雨等等,预测结果是离散的分类。另一种是回归任务,用于预测一个具体的值,比如房价、年龄等等,预测结果是连续的值;</li> +<li>解决回归任务比较常见的算法就是线性回归算法;</li> +</ul> +<h3 id="线性回归">线性回归</h3> +<ul> +<li>线性回归是最典型的用于回归任务的机器学习算法。它的基本原理是基于,任意一个为n的值,可以通过一个n-1阶的多项式进行拟合;</li> +<li>线性回归的算法的目标是根据已知标签数据,训练一个预测函数f(a, b),使得x输入带入ax+b这样的多项式可以得出需要预测的值;</li> +<li>所以目标是找到合适的a和b(从数学语言的精确描述来说,一般用别的符号代替,为了方便记录,我使用a和b);</li> +<li>为了找到合适的a和b,需要定义一个损失函数(也有称为代价函数的),J(a, b),用于判断a和b是否合适,比较简单的有“方差均值”法;</li> +<li>方差均值指的是,所有样本带入预测函数f,将预测值与实际值相减,取平方,求和再求平均数(暂时不知到markdown里如何加入公式);</li> +<li>那么带入损失函数,就是意味着,找到合适的a、b使得刚才那个方差均值小于一个阈值(接近最优);</li> +<li>线性回归本质上,是在平面坐标系里找到一个与样本匹配的直线,这样基于这个直线,即可预测未知的值;</li> +</ul> +<h3 id="梯度下降">梯度下降</h3> +<ul> +<li>如何找到合适的a和b,一个一个地去试是不可能的(无穷多的计算量);</li> +<li>比较典型的算法是“梯度下降”,又是牛顿起的头;</li> +<li>比较生动的描述是,想想一个三维空间图形,X和Y平面是有a和b的值构成,Z轴是损失函数的值,值最小的部分(在图上就最低的部分,像一个山谷)就是最优解;</li> +<li>从山顶的某个点上,环顾360度,找到适合下山的一小步,一点一点儿走向山谷最低处,有点像慢慢走楼梯,所以叫梯度下降;</li> +<li>从我的体会来看,这个方法有点像牛顿那个计算平方根的迭代法(根据一个猜测值,然后通过迭代公式寻找一个更加接近正确值的值,直到误差降低到合适范围);</li> +<li>从微积分的角度,就是找到损失函数J在最初尝试的那个点上的切线,并通过它的斜率(也就是导数值)乘以一个系数a,逐步逼近最低点(切线斜率为零)的过程;</li> +</ul>机器学习的学习准备https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%9A%84%E5%AD%A6%E4%B9%A0%E5%87%86%E5%A4%87/Sat, 18 May 2019 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%9A%84%E5%AD%A6%E4%B9%A0%E5%87%86%E5%A4%87/<h3 id="机器学习的概念">机器学习的概念</h3> +<p>机器学习是人工智能的一个分支,是近年来逐渐具备实用性的各种人工智能应用的基础。其本质是(我目前的个人理解)利用针对已知的数据集合抽取采样特征,然后利用某种数据模型(核心是某种算法:如kNN、SVM、朴素贝叶斯等)对数据进行计算处理,得到一组可以预测未知数据集特征的参数和手段,从而可以对数据进行预测判断的一种数据处理方法。</p> +<h3 id="机器学习相关的名词">机器学习相关的名词</h3> +<ul> +<li>神经网络:是机器学习的一种实现方式,从概念上来说,小于“机器学习”,但是由于其在图像识别、语音识别、语言翻译等领域的优异表现,以至于现在提到机器学习就认为是神经网络,实际则不然,机器学习的概念更大,更加基础,是实现神经网络应用的基础理论和方法;</li> +<li>深度学习:是神经网络的应用特例,同样是在应用层表现优异,可以理解为神经网络的一种实现;</li> +<li>大数据:机器学习的数据处理基础支撑,近年来机器学习在应用层面表现较好主要得益于大数据技术的发展,可以使得模型训练内容量级增加,极大的提高了模型准确度;</li> +<li>n维向量:来自线性代数,在机器学习中起到重要作用,在机器学习中一般用于各种特征数据的载体,在不同的算法过程中传递和计算。</li> +</ul> +<h3 id="机器学习相关的工具">机器学习相关的工具</h3> +<ul> +<li>编程语言:目前比较流行的是Python,因为有比较丰富易用的程序包,很多科技公司也开源了较为成熟的框架,再加上Python语言本身的简单易上手,使得Python成为这个领域最流行的语言。当然C和C++、Java还是实现各种算法的根基,Python更多是提供了一种调用接口;</li> +<li>iPython:Python语言的交互控制台,可以较为方便的测试、调试Python程序,有较强的交互功能,比语言发行版自带的强大;</li> +<li>jupyter:提供Python语言的Web交互界面,通过网页即可编写代码,并及时反馈执行结果,由于是B/S架构,所以可以使得运行时跟开发环境分开。编辑界面同时支持基于Markdown语法的文档编写,使得“文学化”编程成为一种可能,非常适合用于科研人员的汇报材料或论文;</li> +<li>TensorFlow:谷歌开源的机器学习框架,快速灵活部署机器学习应用,可以应用与大规模、工业级场景;</li> +<li>keras:基于Python编写的高级神经网络API,属于对机器学习的深度封装,如果以学习机器学习原理为目标的,不建议使用,还是先手动将若干种核心算法实现一遍比较深刻;</li> +</ul> +<h3 id="预期的学习方法">预期的学习方法</h3> +<ol> +<li>通过阅读相关的书籍,对于概念有所了解,这个过程可以是粗糙的浏览,不求详细的理解各种原理和算法;</li> +<li>尝试一些教学视频,了解实操的基本流程,对于自己读书得到的概念进行验证,修订理解,并熟悉基本工具的使用(如Python的numpy、plot等);</li> +<li>细读书籍,按照书中的事例进行实操,并尝试推导算法的基本原理,理解后,形成自己的文字;</li> +<li>定义简单的任务,贯穿数据准备、数据清洗、特征值提取、模型建立、模型应用各个阶段,一般来说可以是手写文字识别,或者给新闻文章分类等;</li> +<li>循环和迭代这个过程,一边输入信息,一边将学到的东西结合思考,形成有效的输出(文字、视频等);</li> +</ol> \ No newline at end of file diff --git "a/categories/\345\255\246\344\271\240/page/1/index.html" "b/categories/\345\255\246\344\271\240/page/1/index.html" new file mode 100644 index 000000000..48606015f --- /dev/null +++ "b/categories/\345\255\246\344\271\240/page/1/index.html" @@ -0,0 +1 @@ +https://sbabybird.github.io/categories/%E5%AD%A6%E4%B9%A0/ \ No newline at end of file diff --git "a/categories/\345\267\245\345\205\267\344\275\277\347\224\250/cover.03bf2f64488b976c64810574c15f5827.jpg" "b/categories/\345\267\245\345\205\267\344\275\277\347\224\250/cover.03bf2f64488b976c64810574c15f5827.jpg" new file mode 100644 index 000000000..7f2390e7c Binary files /dev/null and "b/categories/\345\267\245\345\205\267\344\275\277\347\224\250/cover.03bf2f64488b976c64810574c15f5827.jpg" differ diff --git "a/categories/\345\267\245\345\205\267\344\275\277\347\224\250/cover.03bf2f64488b976c64810574c15f5827_hu84219a84c85ae30234a46f64e2f2bf8d_165832_250x150_fill_q75_box_smart1.jpg" "b/categories/\345\267\245\345\205\267\344\275\277\347\224\250/cover.03bf2f64488b976c64810574c15f5827_hu84219a84c85ae30234a46f64e2f2bf8d_165832_250x150_fill_q75_box_smart1.jpg" new file mode 100644 index 000000000..aa9d52aa1 Binary files /dev/null and "b/categories/\345\267\245\345\205\267\344\275\277\347\224\250/cover.03bf2f64488b976c64810574c15f5827_hu84219a84c85ae30234a46f64e2f2bf8d_165832_250x150_fill_q75_box_smart1.jpg" differ diff --git "a/categories/\345\267\245\345\205\267\344\275\277\347\224\250/cover.jpg" "b/categories/\345\267\245\345\205\267\344\275\277\347\224\250/cover.jpg" new file mode 100644 index 000000000..7f2390e7c Binary files /dev/null and "b/categories/\345\267\245\345\205\267\344\275\277\347\224\250/cover.jpg" differ diff --git "a/categories/\345\267\245\345\205\267\344\275\277\347\224\250/cover_hu84219a84c85ae30234a46f64e2f2bf8d_165832_120x120_fill_q75_box_smart1.jpg" "b/categories/\345\267\245\345\205\267\344\275\277\347\224\250/cover_hu84219a84c85ae30234a46f64e2f2bf8d_165832_120x120_fill_q75_box_smart1.jpg" new file mode 100644 index 000000000..f19aecb87 Binary files /dev/null and "b/categories/\345\267\245\345\205\267\344\275\277\347\224\250/cover_hu84219a84c85ae30234a46f64e2f2bf8d_165832_120x120_fill_q75_box_smart1.jpg" differ diff --git "a/categories/\345\267\245\345\205\267\344\275\277\347\224\250/index.html" "b/categories/\345\267\245\345\205\267\344\275\277\347\224\250/index.html" new file mode 100644 index 000000000..c411402b9 --- /dev/null +++ "b/categories/\345\267\245\345\205\267\344\275\277\347\224\250/index.html" @@ -0,0 +1,31 @@ +Category: 工具使用 - Learning & Writing!

Categories

工具使用

记录高效使用工具的心得。

+ \ No newline at end of file diff --git "a/categories/\345\267\245\345\205\267\344\275\277\347\224\250/index.xml" "b/categories/\345\267\245\345\205\267\344\275\277\347\224\250/index.xml" new file mode 100644 index 000000000..9a352d843 --- /dev/null +++ "b/categories/\345\267\245\345\205\267\344\275\277\347\224\250/index.xml" @@ -0,0 +1,218 @@ +工具使用 on Learning & Writing!https://sbabybird.github.io/categories/%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/Recent content in 工具使用 on Learning & Writing!Hugo -- gohugo.iozh-cnThu, 21 Sep 2023 00:00:00 +0000基于 Github Pages 服务搭建个人博客https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/Thu, 21 Sep 2023 00:00:00 +0000https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-21-16-10-50.png" alt="Featured image of post 基于 Github Pages 服务搭建个人博客" /><h2 id="背景">背景</h2> +<p>搭建独立博客网站的方法多种多样,常见的方法包括租用服务器自行架设,或者选择托管服务商提供的博客发布服务。</p> +<p>但是上述两种方式都会产生一定的费用,对于非盈利网站而言,不太友好。</p> +<p>经过多年的实践,现在已有越来越多的人选择了使用免费且易用的<a class="link" href="https://docs.github.com/zh/pages/getting-started-with-github-pages/about-github-pages" target="_blank" rel="noopener" +> GitHub Pages </a>服务来搭建个人博客。</p> +<p>然而,现有的使用教程大多侧重于操作步骤,对于新手或非专业人士而言,难以真正理解其中原理。</p> +<p>他们可能看到别人的博客既漂亮又实用,却在自己尝试搭建时屡屡遇到挫折,逐渐失去信心。</p> +<p>这无疑会打击那些希望通过博客持续创作文字、并且希望能够免费建立个性化站点的人的积极性。</p> +<p>本文将介绍如何使用 GitHub Pages 服务搭建免费的个人博客网站,及其背后的实现原理,以帮助初学者顺利建立自己理想的博客站点。</p> +<h3 id="需要预先掌握的技能和前置条件">需要预先掌握的技能和前置条件</h3> +<p><em>需要先了解这些再往下阅读本文</em></p> +<ul> +<li>了解 Git 的概念和常用的操作,知道“分支”、“提交”、“推送”、“拉取”等概念。</li> +<li>拥有 Github 账号,并且能够独立完成“仓库创建”、“本地克隆”、“提交”、“推送”等操作。</li> +<li>了解“博客”本身只是一种“网站”:其内容由若干“网页”组成,读者通过浏览器访问博客网站所在的服务器以获取这些网页内容。</li> +</ul> +<h2 id="核心思路">核心思路</h2> +<p><img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-21-16-20-10.png" +width="790" +height="258" +loading="lazy" +class="gallery-image" +data-flex-grow="306" +data-flex-basis="734px" +> +简单来说,核心步骤只有三步:内容编辑、页面生成、网站发布。接下来的介绍均围绕这三件事展开。</p> +<h3 id="内容编辑">内容编辑</h3> +<p>作者编写和编辑博客内容,包括编写文章、给文章配图、给文章归类等等活动都属于内容编辑。</p> +<h3 id="页面生成">页面生成</h3> +<p>如果希望将内容变成可发布的网站,则需要使用专用的软件工具(一般为<a class="link" href="https://baike.baidu.com/item/%E9%9D%99%E6%80%81%E7%BD%91%E7%AB%99/2776875" target="_blank" rel="noopener" +>静态网站</a>生成器)将编辑的内容自动生成可供浏览器显示的博客网站页面。</p> +<h3 id="网站发布">网站发布</h3> +<p>有了网站页面,还只是一堆存放在本地的文件。若要放到互联网上进行访问,还需要一个服务器提供服务,将网站发布。</p> +<p>如果采用独立建站的方式,这一步骤会涉及大量技术工作,比如服务器采购、Web服务应用程序安装、域名映射、SSL 安全证书、网络防火墙配置等等。</p> +<p>但我们今天选择使用 Github 提供的 Pages 服务,这将大大降低上述操作的难度,很多技术细节将不必再多关注,已经由 Pages 服务默认配置好。我们只需享用配置好的环境即可。</p> +<h3 id="技术路线">技术路线</h3> +<h4 id="github-pages">Github Pages</h4> +<p>Github 本来是一个 Git 仓库托管服务商,帮助用户进行项目代码及数字资料的版本管理。不过随着用户规模提升,Github 也围绕版本管理提供了更多的辅助服务,这其中就包括 <a class="link" href="https://docs.github.com/zh/pages/getting-started-with-github-pages/about-github-pages" target="_blank" rel="noopener" +>Pages 服务</a>。</p> +<blockquote> +<p>GitHub Pages 是一项静态站点托管服务,它直接从 GitHub 上的仓库获取 HTML、CSS 和 JavaScript 文件,(可选)通过构建过程运行文件,然后发布网站。 可以在 GitHub Pages 示例集合中看到 GitHub Pages 站点的示例。</p> +</blockquote> +<p>Pages 服务原本用于帮助托管在 Github 上的开源项目更便捷地发布自己的宣传页面。开发团队可以简单编写几个静态页面(HTML)然后放在托管的 Git 仓库中,由 Github 将这些页面以网站服务的方式发布出去,Github 既提供了服务器资源也提供了用于公网访问的<strong>专属 URL</strong> 地址。</p> +<p>关于发布网站的<strong>专属 URL</strong> 地址的提供规则,Github 官方的介绍如下:</p> +<blockquote> +<p>若要发布<strong>用户站点</strong>,必须创建名为 <code>&lt;username&gt;.github.io</code> 的个人帐户拥有的存储库。 若要发布<strong>组织站点</strong>,必须创建名为 <code>&lt;organization&gt;.github.io</code> 的组织帐户拥有的存储库。 除非使用的是自定义域,否则用户和组织站点在 <code>http(s)://&lt;username&gt;.github.io</code> 或 <code>http(s)://&lt;organization&gt;.github.io</code> 中可用。 +<strong>项目站点</strong>的源文件与其项目存储在同一个仓库中。 除非使用的是自定义域,否则项目站点在 <code>http(s)://&lt;username&gt;.github.io/&lt;repository&gt;</code> 或 <code>http(s)://&lt;organization&gt;.github.io/&lt;repository&gt;</code> 中可用。</p> +</blockquote> +<p>根据官方介绍,Pages 提供有三种不同的网站发布服务:用户站点、组织站点、项目站点。</p> +<p>分别对应了“制作个人网站”、“制作团队组织网站”、“制作单个项目网站”的不同需求。</p> +<p>针对个人博客的搭建,很显然使用 Pages 服务发布“用户站点”是最合适的选择。</p> +<p>对于“用户站点”,Pages 最终会为用户提供的专属 URL 地址为:<code>https://你的用户名.github.io</code>,也就是说在 Gihtub 的一级域名 <code>https://github.io</code> 下给你免费提供了一个二级域名。之所以默认使用你的 Github 用户名,是因为要防止不同用户发布的地址重名导致冲突。</p> +<p><em>按照官方介绍,你也可以使用自己购买的域名,通过自己的域名进行访问。不过这涉及到更复杂的话题和操作,不在本文讨论范畴。</em></p> +<p>了解了以上基本信息后,在使用 Pages 服务时,可按照复杂度区分,采用如下几种不同的用法。</p> +<h5 id="最简单直接的使用流程">最简单直接的使用流程</h5> +<ol> +<li>手工编写 HTML 页面文件(需要掌握网页制作知识)。</li> +<li>将页面文件推送到的 Github 仓库,对于“用户站点”来说,这个仓库的命名必须为“<code>你的用户名.github.io</code>”。</li> +<li>在 Github 中设置该仓库的 Pages 服务配置,主要是选择仓库的指定“分支”用于 Pages 服务获取待发布的网页文件。</li> +<li>Github 会按照上面介绍的规则给你提供一个 URL 访问地址(<code>https://你的用户名.github.io</code>),使用浏览器打开该地址即可访问到发布的网站了。</li> +</ol> +<p><em>注:如果不理解 Git 仓库的“分支”概念,可以把它视为同一个仓库里不同的存储位置,不同的“分支”里面存储了不同的文件内容。</em></p> +<p>这个流程仅适用于非常简单网站发布,比如只包含有一个页面,因为手工编写 HTML 页面的效率十分低下,且不利于持续更新维护。</p> +<p>于是大家常用的方式是,使用一种叫做的东西,对于“博客”这类以静态页面为主的网站,十分适合。</p> +<p>“静态站点生成器”可以理解为是一个“翻译”,它能自动将你编写的文本内容根据预先的配置信息,自动生成一个完整的网站所需的全部文件(HTML、JS、CSS等)。</p> +<p>于是有了如下的改进流程:</p> +<h5 id="改进的使用流程">改进的使用流程</h5> +<ol> +<li>用户编辑好博客内容,形成保存在本地计算机的原始文档文件。</li> +<li>使用静态网站生成器将本地原始文档文件生成静态页面文件。</li> +<li>将静态页面文件推送到 Github 远端托管仓库。</li> +<li>Github Pages 服务自动被触发,将静态页面以网站形式发布出来。</li> +<li>用户通过指定 URL 地址访问已发布的博客内容。</li> +</ol> +<p>到目前为止,已经可以较为流畅地执行博客编辑、生成、发布的工作流程了。</p> +<p>但是这个流程里有个前置条件,作者必须在本地电脑上安装一个“静态站点生成器”,以用于输出转换后的、可供发布的页面。</p> +<p>所以,为了方便,Github 提供了一个默认的静态网站生成器,上述第 2 步操作实际上可以在远端仓库自动执行,这样用户只需将原始文件上传至远端仓库即可,由 Github 直接在线上完成静态页面的生成和网站发布工作。</p> +<p><img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-21-16-46-36.png" +width="937" +height="625" +loading="lazy" +class="gallery-image" +data-flex-grow="149" +data-flex-basis="359px" +></p> +<h5 id="静态站点生成器的选择">静态站点生成器的选择</h5> +<p>比较常见的静态站点生成器有:<a class="link" href="https://jekyllrb.com/" target="_blank" rel="noopener" +>Jekyll</a>、<a class="link" href="https://hexo.io/index.html" target="_blank" rel="noopener" +>Hexo</a>、<a class="link" href="https://gohugo.io/" target="_blank" rel="noopener" +>Hugo</a> 这三个。不在这里详细介绍了,因为功能都大同小异。在选定一个之后,需要去他们的官网查看文档以了解具体的使用细节,以便对自己的博客站点能够做到更深的定制。</p> +<p>我在接下来的操作步骤里,选择使用 Hugo 这个生成器。</p> +<p>主要原因是,Hugo 提供有相对来说比较美观的<a class="link" href="https://themes.gohugo.io/" target="_blank" rel="noopener" +>免费主题风格模板</a>(Jekyll 也有漂亮的,但是收费。Hexo 的定制性很强,适合有网页开发能力的人自己开发主题)。</p> +<p>我选择的主题模板是:<a class="link" href="https://themes.gohugo.io/themes/hugo-theme-stack/" target="_blank" rel="noopener" +>hugo-theme-stack</a>。</p> +<p><img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-10-40-58.png" +width="900" +height="300" +loading="lazy" +class="gallery-image" +data-flex-grow="300" +data-flex-basis="720px" +></p> +<h2 id="操作步骤">操作步骤</h2> +<h3 id="建立-github-仓库">建立 Github 仓库</h3> +<ol> +<li>点击这个超链接进入 <a class="link" href="https://github.com/CaiJimmy/hugo-theme-stack-starter" target="_blank" rel="noopener" +>hugo-theme-stack-starter 的 Git 仓库模板</a>。</li> +<li>点击页面中的“使用此模板”按钮,以创建你自己的仓库(注意:需先登录自己的账号才能创建)。 +<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-10-45-54.png" +width="925" +height="134" +loading="lazy" +class="gallery-image" +data-flex-grow="690" +data-flex-basis="1656px" +></li> +<li>建立好仓库(注意仓库命名为<code>你的用户名.github.io</code>)之后,会自动带有仓库模板的初始文件。 +<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-10-47-57.png" +width="908" +height="528" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="412px" +></li> +</ol> +<h3 id="修改配置">修改配置</h3> +<ol> +<li>将仓库下载到本地。</li> +<li>打开仓库里的 config 文件夹,里面存放有配置信息。</li> +<li>按照 <a class="link" href="https://stack.jimmycai.com/guide/getting-started" target="_blank" rel="noopener" +>hugo-theme-stack 的官方文档</a>配置自己想要的效果(默认一般都够用,重点是修改自己的站点信息,如显示名称、URL 链接地址等等)。 +<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-10-53-02.png" +width="1466" +height="682" +loading="lazy" +class="gallery-image" +data-flex-grow="214" +data-flex-basis="515px" +> +<em>这些配置主要在 <code>config.toml</code> 和 <code>params.toml</code> 两个文件里。</em></li> +</ol> +<h3 id="编写博客文章">编写博客文章</h3> +<p>生成器会默认去仓库的 <code>content/post/</code> 文件夹下扫描其下面的所有文件夹和文件,遇到约定格式的 <code>Markdown</code> 文件就会转换成为可发布的 <code>html</code> 页面。具体约定可以查看官方的详细文档,这里介绍一种最简单的写一篇文章的过程。</p> +<ol> +<li>在 post 目录下新建一个文件夹用于存放文章的 Markdown 文件和插图文件,文件夹命名为希望编写的标题如:<code>2023-09-21-怎样搭建个人博客</code>。<em>我个人习惯将不同年份的文章在post目录下再建一级目录按照日期或年份进行区分。</em></li> +<li>在刚建立的文件夹下新建名称为<code>index.md</code>的 Markdown 文件,文件名必须为 index.md 这是由 hugo 生成器约定的。</li> +<li>在刚建立的 Markdown 文件的头部添加必要的元信息(非常关键)。 +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span><span class="lnt">8 +</span><span class="lnt">9 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w"> </span>---<span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="l">文章标题</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">date</span><span class="p">:</span><span class="w"> </span><span class="ld">2023-09-21</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">categories</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">文章所属分类</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tags</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">文章标签 1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">文章标签 2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>---<span class="w"> +</span></span></span></code></pre></td></tr></table> +</div> +</div><img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-11-07-46.png" +width="787" +height="357" +loading="lazy" +class="gallery-image" +data-flex-grow="220" +data-flex-basis="529px" +></li> +<li>编写文章内容。可以使用 <a class="link" href="https://markdown.com.cn/basic-syntax/" target="_blank" rel="noopener" +>Markdown 的语法</a>随意定义格式,以及插入图片。插入的图片建议保存在同级目录(也就是刚才新建的那个)中。</li> +</ol> +<h3 id="推送到仓库及发布">推送到仓库及发布</h3> +<ol> +<li>将刚才修改配置文件保存。</li> +<li>将刚才编写的博客文章保存。</li> +<li>在本地提交 commit 并 push 到 Github 仓库。</li> +<li>稍等几分钟(给 Github 那端的 Hugo 生成器留出运行时间)。</li> +<li>在 Github 仓库的 “setting” 设置页面开启 Pages 服务(只需第一次)。</li> +<li>在 Pages 设置界面里的 Source 中选择 “Deploy from a branch” ,并在下面的分支选择下拉框中选择 “gh-pages”,保存。 +<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-11-17-49.png" +width="1090" +height="568" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="460px" +></li> +</ol> +<h3 id="访问你的博客站点">访问你的博客站点</h3> +<p>一般稍等几分钟之后,即可按照约定网址访问刚发布的内容了。 +<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-11-31-26.png" +width="1539" +height="661" +loading="lazy" +class="gallery-image" +data-flex-grow="232" +data-flex-basis="558px" +></p> +<h2 id="扩展阅读">扩展阅读</h2> +<p>运营自己的博客网站所需了解的概念和知识相对比较多,如果希望将自己的网站做的更加精美、有特色。</p> +<p>除了能够持续产出高质量内容之外,建议阅读以下文章以了解相关知识:</p> +<ul> +<li><a class="link" href="https://developer.mozilla.org/zh-CN/docs/Learn/Getting_started_with_the_web" target="_blank" rel="noopener" +>学习 web 开发</a>。</li> +</ul> \ No newline at end of file diff --git "a/categories/\345\267\245\345\205\267\344\275\277\347\224\250/page/1/index.html" "b/categories/\345\267\245\345\205\267\344\275\277\347\224\250/page/1/index.html" new file mode 100644 index 000000000..5e04b28bd --- /dev/null +++ "b/categories/\345\267\245\345\205\267\344\275\277\347\224\250/page/1/index.html" @@ -0,0 +1 @@ +https://sbabybird.github.io/categories/%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/ \ No newline at end of file diff --git "a/categories/\346\234\272\345\231\250\346\226\207\346\221\230/cover.c559c42d9bbfb2587dba8e12015f7254.jpg" "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/cover.c559c42d9bbfb2587dba8e12015f7254.jpg" new file mode 100644 index 000000000..419a3191a Binary files /dev/null and "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/cover.c559c42d9bbfb2587dba8e12015f7254.jpg" differ diff --git "a/categories/\346\234\272\345\231\250\346\226\207\346\221\230/cover.c559c42d9bbfb2587dba8e12015f7254_hu1171b89719e02c2549586143d462d836_6651904_250x150_fill_q75_box_smart1.jpg" "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/cover.c559c42d9bbfb2587dba8e12015f7254_hu1171b89719e02c2549586143d462d836_6651904_250x150_fill_q75_box_smart1.jpg" new file mode 100644 index 000000000..7d20043e0 Binary files /dev/null and "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/cover.c559c42d9bbfb2587dba8e12015f7254_hu1171b89719e02c2549586143d462d836_6651904_250x150_fill_q75_box_smart1.jpg" differ diff --git "a/categories/\346\234\272\345\231\250\346\226\207\346\221\230/cover.jpg" "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/cover.jpg" new file mode 100644 index 000000000..419a3191a Binary files /dev/null and "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/cover.jpg" differ diff --git "a/categories/\346\234\272\345\231\250\346\226\207\346\221\230/cover_hu1171b89719e02c2549586143d462d836_6651904_120x120_fill_q75_box_smart1.jpg" "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/cover_hu1171b89719e02c2549586143d462d836_6651904_120x120_fill_q75_box_smart1.jpg" new file mode 100644 index 000000000..56a83d263 Binary files /dev/null and "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/cover_hu1171b89719e02c2549586143d462d836_6651904_120x120_fill_q75_box_smart1.jpg" differ diff --git "a/categories/\346\234\272\345\231\250\346\226\207\346\221\230/index.html" "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/index.html" new file mode 100644 index 000000000..5cd29ba36 --- /dev/null +++ "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/index.html" @@ -0,0 +1,34 @@ +Category: 机器文摘 - Learning & Writing!

Categories

机器文摘

这里会定期分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘(MachineDigest)”吧。

+ \ No newline at end of file diff --git "a/categories/\346\234\272\345\231\250\346\226\207\346\221\230/index.xml" "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/index.xml" new file mode 100644 index 000000000..eb055d947 --- /dev/null +++ "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/index.xml" @@ -0,0 +1,6919 @@ +机器文摘 on Learning & Writing!https://sbabybird.github.io/categories/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98/Recent content in 机器文摘 on Learning & Writing!Hugo -- gohugo.iozh-cnTue, 19 Sep 2023 00:00:00 +0000机器文摘 第 050 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/Tue, 19 Sep 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-31-40.png" alt="Featured image of post 机器文摘 第 050 期" /><h1 id="机器文摘-第-050-期">机器文摘 第 050 期</h1> +<h2 id="长文">长文</h2> +<h3 id="十八世纪的光学电报网络">十八世纪的光学电报网络</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-31-08.png" +width="500" +height="517" +loading="lazy" +class="gallery-image" +data-flex-grow="96" +data-flex-basis="232px" +></p> +<p>当年读《基督山伯爵》的时候,有一个让我震惊的科技。</p> +<p>主人公有一项复仇计划是破坏敌人的金融资产。计划采取的手段是收买了一个传递实时信息的人让其传递错误信息。</p> +<p>而具体传递信息的手段是,每隔一段距离设一座瞭望塔,每个塔上有一个人,向一个方向用望远镜观看,远方的上级瞭望塔会有人发射信号弹,一连串的信号弹代表一定的信息,然后这个人再原样发射一遍,让后方的瞭望塔看见。信息就这样一级一级传递下去。</p> +<p>信息经过编码,可以表达股票行情等信息,类似后来的电报系统,但是这是在十八世纪。</p> +<p>读过之后我就一直有疑问,不知道小说是否虚构了这种信息传递技术,直到前几天我发现了这篇文章:<a class="link" href="https://www.lowtechmagazine.com/2007/12/email-in-the-18.html" target="_blank" rel="noopener" +>《十八世纪的光学电报网络》</a>。</p> +<p>里面详细介绍了在两百多年前人类就已经发明了“光学电报”系统,并建立起了巨大的信息网络。信息传递速度达到了惊人的 1380千米/每小时。</p> +<h3 id="c-语言发展简史">C 语言发展简史</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-31-23.png" +width="690" +height="352" +loading="lazy" +class="gallery-image" +data-flex-grow="196" +data-flex-basis="470px" +></p> +<p>要说 C 语言是计算机历史上最重要的编程语言应该不会有人反对吧。</p> +<p>作为大多数人编程入门的母语,C 语言具有语法简洁、高性能(贴近计算机底层)、使用灵活、适用范围广泛等特点。</p> +<p>虽然诞生于上个世纪 70 年代,但即便是在 2023 年的今天,C 语言仍然排在各大编程排行榜的考前位置,仍然是信息科技的重要支撑力量。</p> +<p><a class="link" href="http://cm.bell-labs.co/who/dmr/chist.html" target="_blank" rel="noopener" +>《C 语言简史》</a>,由丹尼斯·里奇(C 语言之父)撰写,是一篇难得的介绍 C 语言的诞生和发展的历史性文献。</p> +<h3 id="vbvisual-basic发展简史">VB(Visual Basic)发展简史</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-31-40.png" +width="690" +height="518" +loading="lazy" +class="gallery-image" +data-flex-grow="133" +data-flex-basis="319px" +></p> +<p>前几天 HN 上有个从业近 30 年的老程序员发问:<a class="link" href="https://news.ycombinator.com/item?id=37470318" target="_blank" rel="noopener" +>为什么 VB(Visual Basic)这么高效、好用的开发工具逐渐消失了?</a>。</p> +<p>被顶的最高的网友放出了<a class="link" href="https://retool.com/visual-basic/" target="_blank" rel="noopener" +>《Visual Basic 从诞生到消失》</a>这篇文章。</p> +<p>在上世纪 80 年代末 90 年代初,Windows 操作系统刚刚崭露头角的时候,VB 已经在萌芽状态了。而且已经具有非常先进的组件化、可视化、低代码等超前思想。并且发明了“控件”、“消息触发”等概念。</p> +<p>最初的版本与 BASIC 语言并无关系,只考虑了使用可视化开发并辅助简单的内嵌脚本,但是比尔·盖茨对 BASIC 十分热爱(毕竟那是微软起家的技术),亲自推动了组件化、可视化开发与 BASIC 语言结合,便诞生了 Visual Basic。</p> +<p>得益于超前的可视化开发理念,VB 极大降低了当时开发应用程序的门槛,涌现出一大批开发者。包括当时那些不得不转型给个人电脑开发程序的大型机编程工程师。</p> +<p>这一切在 VB 随着 Visual Studio 发布 6.0 的时候达到了顶峰。</p> +<p>转折点出现在微软为了应对 Java 的威胁而推出 .Net 公共语言运行时的时候,VB 也被纳入到这套体系里,被成为 VB.Net ,扩充了复杂的语法和继承、多态等高级特性。</p> +<p>对于那些真正喜欢 VB6 的人来说,这些都是唯恐避之不及的东西,更糟糕的是新的 VB.Net 无法兼容之前的代码,大量成果移植困难。</p> +<p>之后更是随着网络信息科技的发展,Web 编程逐渐取代了 Windows 桌面编程,VB 这个伟大的技术,被淘汰也就是顺其自然的了。</p> +<h3 id="一个在网页里模仿-excel-表格的故事">一个在网页里模仿 Excel 表格的故事</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-32-14.png" +width="690" +height="201" +loading="lazy" +class="gallery-image" +data-flex-grow="343" +data-flex-basis="823px" +></p> +<p><a class="link" href="https://websheets.github.io/websheets/demo/" target="_blank" rel="noopener" +>一位前端工程师,讲述了他在 2016 年受雇于 Uber(优步)时的一些开发往事</a>。</p> +<p>作为服务于数据工程师的内部研发团队,他所在的小组主要是给公司的数据分析人员提供内部工具,以便让他们能够更快地分析数据,更快的分析数据意味着更有可能在产品运营竞争里获胜。</p> +<p>然而数据分析人员总是抱怨工具不满足要求,主要是操作界面,因为他们非常习惯“Excel”,每次提需求的时候总是说:“你就做得跟 Excel 一样就行”。</p> +<p>作者最开始还试图跟用户解释要实现起来是多么困难,后来逐渐放弃了挣扎,并开始着手在网页里实现一个跟 Excel 一样的表格,而且他竟然实现了。</p> +<p>故事的后来有些伤感,作者提供的工具并没有使得 “Uber” 在跟嘀嘀的竞争中胜出,相反地,“Uber”在中国的业务还被“嘀嘀”收购了。</p> +<p>被用于数据分析的工具也被抛弃不再使用。</p> +<p>后来作者选择了将那个像 Excel 的表格代码放在了 <a class="link" href="github.com/WebSheets/websheets" >Github 进行开源,地址在这里</a>。</p> +<h2 id="资源">资源</h2> +<h3 id="通用-web-应用服务器">通用 Web 应用服务器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-32-34.png" +width="690" +height="356" +loading="lazy" +class="gallery-image" +data-flex-grow="193" +data-flex-basis="465px" +></p> +<p><a class="link" href="https://unit.nginx.org/" target="_blank" rel="noopener" +>NGINX Unit</a>,通用 Web 应用服务器。是一个轻量且多功能的应用运行时,作为一个单一的开源服务器,它提供了您的 Web 应用程序所需的基本组件:运行应用程序代码(包括 WebAssembly)、提供静态资源、处理 TLS 和请求路由。</p> +<p>Unit 是由 NGINX 团队成员从零开始创建的,以在运行时高度高效且完全可配置。最新版本是 1.31.0,于 2023 年 8 月 31 日发布。</p> +<h3 id="绿色安卓-app-合集">绿色安卓 App 合集</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-32-52.png" +width="690" +height="385" +loading="lazy" +class="gallery-image" +data-flex-grow="179" +data-flex-basis="430px" +></p> +<p><a class="link" href="https://www.simplemobiletools.com/" target="_blank" rel="noopener" +>绿色安卓app合集</a>。</p> +<p>这个网站收集了一大批良心 app,全部没有广告且不要求隐私权限。</p> +<p>几乎涵盖了日常使用的所有类型,包括艺术绘画、音乐播放器、笔记、文件管理、录音、拍照等。 ​​​</p> +<h3 id="nuejs">nuejs</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-33-10.png" +width="690" +height="455" +loading="lazy" +class="gallery-image" +data-flex-grow="151" +data-flex-basis="363px" +></p> +<p><a class="link" href="https://nuejs.org/" target="_blank" rel="noopener" +>nuejs</a>,越来越多的人对前端开发的混乱感到不满了。不同的是有人选择抱怨,有人撸起袖子开干。nuejs 的作者觉得现在使用 React、Vue 等框架再加上若干服务端渲染框架,使得前端开发生态变得越来越复杂和掌握。于是自己动手开发了一个简单的轻量化框架,终极目标是构建一个简洁、高效的前端开发生态。</p> +<h3 id="1024-字节的网页可显示-3d-地球">1024 字节的网页,可显示 3D 地球</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-33-21.png" +width="447" +height="255" +loading="lazy" +class="gallery-image" +data-flex-grow="175" +data-flex-basis="420px" +></p> +<p><a class="link" href="https://aem1k.com/world/" target="_blank" rel="noopener" +>1024 字节的 JavaScript,在网页中显示动画 3D 地球模型</a>,页面动画显示的就是其源代码。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="p">.</span><span class="o">&lt;</span><span class="nx">script</span><span class="o">&gt;</span> +</span></span><span class="line"><span class="cl"><span class="nb">eval</span><span class="p">(</span><span class="nx">z</span><span class="o">=</span><span class="s1">&#39;p=&#34;&lt;&#34;+&#34;pre&gt;&#34;/* ,.oq#+ ,._, */;for(y in n=&#34;zw24l6k\ +</span></span></span><span class="line"><span class="cl"><span class="s1">4e3t4jnt4qj24xh2 x/* =&lt;,m#F^ A W###q. */42kty24wrt413n243n\ +</span></span></span><span class="line"><span class="cl"><span class="s1">9h243pdxt41csb yz/* #K q##H######Am */43iyb6k43pk7243nm\ +</span></span></span><span class="line"><span class="cl"><span class="s1">r24&#34;.split(4)){/* dP cpq#q##########b, */for(a in t=pars\ +</span></span></span><span class="line"><span class="cl"><span class="s1">eInt(n[y],36)+/* p##@###YG=[#######y */(e=x=r=[]))for\ +</span></span></span><span class="line"><span class="cl"><span class="s1">(r=!r,i=0;t[a/* d#qg `*PWo##q#######D */]&gt;i;i+=.05)wi\ +</span></span></span><span class="line"><span class="cl"><span class="s1">th(Math)x-= /* aem1k.com Q###KWR#### W[ */.05,0\ +</span></span></span><span class="line"><span class="cl"><span class="s1">x;)p+=&#34; *#&#34;/* b. OQ####x#K */[e[x++]+e[x++\ +</span></span></span><span class="line"><span class="cl"><span class="s1">]]||(S=(&#34;eval&#34;/* l `X#####D , */+&#34;(z=\&#39;&#34;+z.spl\ +</span></span></span><span class="line"><span class="cl"><span class="s1">it(B = &#34;\\\\&#34;)./* G####B&#34; # */join(B+B).split\ +</span></span></span><span class="line"><span class="cl"><span class="s1">(Q=&#34;\&#39;&#34;).join(B+Q/* VQBP` */)+Q+&#34;)//m1k&#34;)[x/2\ +</span></span></span><span class="line"><span class="cl"><span class="s1">+61*y-1]).fontcolor/* TP */(/\\w/.test(S)&amp;&amp;&#34;#\ +</span></span></span><span class="line"><span class="cl"><span class="s1">03B&#34;);document.body.innerHTML=p+=B+&#34;\\n&#34;}setTimeout(z)&#39;</span><span class="p">)</span><span class="c1">// +</span></span></span></code></pre></td></tr></table> +</div> +</div><h3 id="全球-ip-地址地理位置数据库">全球 IP 地址地理位置数据库</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-33-35.png" +width="690" +height="385" +loading="lazy" +class="gallery-image" +data-flex-grow="179" +data-flex-basis="430px" +></p> +<p><a class="link" href="https://ipapi.is/geolocation.html" target="_blank" rel="noopener" +>全球 IP 地址 地理位置数据库</a>。含 IPV4 和 IPV6。 ​​<a class="link" href="https://ipapi.is/geolocation.html" target="_blank" rel="noopener" +>​这篇文章里还介绍了构建 IP 地址地理数据库的实现原理</a>和一套具有指导意义的实现方法。基本原理是:“互联网中的每个 IP 地址都由组织拥有或管理。可以向互联网注册机构查询WHOIS信息。”</p> +<h2 id="观点">观点</h2> +<h3 id="为什么-facebook-的-pytorch-占有率赢了-google-的-tensorflow">为什么 Facebook 的 PyTorch 占有率赢了 Google 的 Tensorflow</h3> +<p>Pytorch 已经完全击败了 Tensorflow,成为 AI 开发框架的事实标准。Pytorch 一开始就专注于学术界,方向是把最牛的人吸引过来。而 Tensorflow 则倾向于软件工程炫技,做各种简单但是酷炫的功能。</p> +<p>最终专业化的 torch 击败了 tensorflow 。 我觉得​​​还有一个原因就是 Google 特别容易弃坑,Tensorflow 中间也切换过前后不兼容的 API。</p> +<h3 id="越来越多的科技产品让人更好地欺骗自己">越来越多的科技产品让人更好地欺骗自己</h3> +<p>比如美颜相机、电影特效、游戏等,研发它们的主要目的就是让人们更好的实现自我欺骗和催眠。</p> +<h3 id="东方文明为什么警惕科技我个人不完全同意">东方文明为什么警惕科技(我个人不完全同意)</h3> +<p>中国古代对于科技非常警惕和打压的原因,也许是古人早就意识到科技(或技术)力量很容易对人类造成强烈反噬。</p> +<p>观点来自 <a class="link" href="https://www.bilibili.com/video/BV1pu4y1r7KW/" target="_blank" rel="noopener" +>@​​​安东尼2001:量子自旋理论背后,是人类历史的轮回</a>。</p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 049 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/Tue, 12 Sep 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-34-22.png" alt="Featured image of post 机器文摘 第 049 期" /><h1 id="机器文摘-第-049-期">机器文摘 第 049 期</h1> +<h2 id="长文">长文</h2> +<h3 id="在-linux-环境里执行-windows-应用程序">在 Linux 环境里执行 Windows 应用程序</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-33-44.png" +width="512" +height="512" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +></p> +<p>最近遇到一个难以启齿的需求,服务器是 Linux 环境,但是某项服务功能却需要执行一个 Windows exe 文件。</p> +<p>不得已才想到要求助 Wine 这个经典中间层,据说可以使的 Linux 兼容大部分的 Win32 程序。</p> +<p>但是又不想污染服务器的其他环境,于是选择在容器中运行。</p> +<p>在网上找到了这篇<a class="link" href="https://leimao.github.io/blog/Docker-Wine/" target="_blank" rel="noopener" +>《利用 Docker 容器和 Wine 在 Linux里运行 Windows 程序》</a>,按照文中介绍的步骤成功实现了需求。</p> +<p>基本步骤: +1、根据文章提供的 Dockfile 构建镜像; +2、运行镜像并注意配置运行容器的环境变量; +3、执行所需的 exe 程序。</p> +<h3 id="windows-系统是怎样进行引导的">Windows 系统是怎样进行引导的</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-34-06.png" +width="690" +height="976" +loading="lazy" +class="gallery-image" +data-flex-grow="70" +data-flex-basis="169px" +></p> +<p>前不久,我在给笔记本更换大容量固态硬盘的时候,由于不愿重做系统,使用了硬盘克隆功能,将原盘整体信息直接克隆到新硬盘。</p> +<p>结果克隆成功并替换安装硬盘之后,却没能正常引导进入 Windows,而是进入了一个类似 PE 系统的界面(猜测是原盘中厂家自制的),并告知我由于检测到硬件更换,拒绝引导,并建议我选择恢复系统。</p> +<p>我猜测之前的隐藏分区可能有笔记本厂家做的一些特定引导程序,才导致这样的情况。</p> +<p>我对系统引导的理解还停留在 MBR 分区表大面积应用的阶段。于是尝试删除了隐藏分区,并手动将系统盘分区设置为了 “激活”分区(事实上这时候已经错了,因为 GPT 分区表方式下无法采用这种引导方式了)。</p> +<p>结果系统干脆直接无法引导。出现这种情况,我之前的知识储备显然不够用了。</p> +<p>经过一番折腾和搜索,我才得知现在 Windows 8 及以上版本操作系统的电脑所采用的方式是 GPT 分区表 + UEFI 引导。</p> +<p>也就是说硬盘上需要单独开辟一个分区存储负责进行操作系统引导的工作。这个分区平时对于操作系统的资源管理器不可见(但磁盘管理中可以看到),由主板上的 UEFI 程序(这个程序可以理解为 BIOS 的升级版)进行访问和管理。</p> +<p>了解这个方式之后,就简单了,重新使用工具修改 GPT 分区并制作专用引导分区即可。</p> +<p>最后,为了弄清这跟之前的 MBR 引导方式有什么区别,我找到了一位运维工程师总结得较到位的文章<a class="link" href="https://zhuanlan.zhihu.com/p/355526135" target="_blank" rel="noopener" +>《Windows系统开机引导顺序简述及运维小结》</a>。</p> +<h3 id="500-行代码写一个-c-编译器">500 行代码写一个 C 编译器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-34-22.png" +width="690" +height="690" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +></p> +<p><a class="link" href="https://vgel.me/posts/c500/" target="_blank" rel="noopener" +>500 行 Python 代码写一个 C 编译器</a>。</p> +<p>作者立下这个 flag 之后才发现任务有多难。</p> +<p>主要是代码行数太少了,如果使用传统手段实现,可能这点儿代码量还不够写个语法分析器的。</p> +<p>于是作者主动放弃了 AST (抽象语法树)的构建,采用 Token 提取和指令生成“一遍过”的方式,实现了一个相当“简洁”的 C 编译器。</p> +<h2 id="资源">资源</h2> +<h3 id="假装弹钢琴">假装弹钢琴</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-34-51.png" +width="690" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="204" +data-flex-basis="491px" +></p> +<p><a class="link" href="http://touchpianist.com/" target="_blank" rel="noopener" +>touchpianist</a>,在线弹钢琴的网站(也提供手机 App 版),可以让你假装钢琴大师,只需要按键盘上的任意键,旋律就会自动演奏,不过你要控制敲击键盘的速度,以匹配原曲的节奏。我弹了一下,默认曲目是贝多芬的《月光奏鸣曲》,差点儿被自己陶醉了。 ​​​</p> +<h3 id="bun-v10">Bun V1.0</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-35-09.png" +width="690" +height="419" +loading="lazy" +class="gallery-image" +data-flex-grow="164" +data-flex-basis="395px" +></p> +<p><a class="link" href="https://bun.sh/blog/bun-v1.0" target="_blank" rel="noopener" +>bun-v1.0</a>,拳打 node , 脚踢 deno 的 JavaScript 运营环境 bun 推出了 1.0 版本。主打一个“All in one”,号称可以一次性取代一揽子工具:node、npx、npm、webpack、tsc、babel、jest。一个工具包揽了运行、打包、包管理、转译、测试等所有事情,且速度是 nodejs 的 3 倍。</p> +<p>对于这种吹的比较厉害的技术,保持关注,谨慎使用吧。</p> +<h3 id="开源基于-llm-知识库平台">开源基于 LLM 知识库平台</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-35-24.png" +width="690" +height="334" +loading="lazy" +class="gallery-image" +data-flex-grow="206" +data-flex-basis="495px" +></p> +<p><a class="link" href="https://github.com/labring/FastGPT" target="_blank" rel="noopener" +>FastGPT</a> - 基于 LLM 大模型的 AI 知识库问答系统。提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景。项目在 Github 开源,采用技术栈: NextJs + TS + ChakraUI + Mongo + Postgres(Vector 插件)。支持 GPT、Claude、Spark、ChatGLM 等多种 LLM 模型。</p> +<h3 id="开源基于-llm-数据可视化平台">开源基于 LLM 数据可视化平台</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-35-35.png" +width="690" +height="292" +loading="lazy" +class="gallery-image" +data-flex-grow="236" +data-flex-basis="567px" +></p> +<p><a class="link" href="https://github.com/microsoft/lida" target="_blank" rel="noopener" +>lida</a>,微软出品的数据可视化工具库,特点是基于 LLM 对话模型进行生成,其生成的可视化代码支持多种可视化后端的语法,包括 matplotlib、seaborn、d3等。 ​​​</p> +<h2 id="观点">观点</h2> +<h3 id="编程是一种体育锻炼">编程是一种体育锻炼</h3> +<p>编程除了是一种可以以之谋生的专业技能,对于那些真喜欢编程的人来说,它还是一个心理疗愈工具。</p> +<p>编程能使人专注,进入“心流”状态比较容易,也容易让人的心态平和。</p> +<p>编程与体育锻炼一样,都是可以让人受益终生的活动。</p> +<p>&mdash;-来自<a class="link" href="https://weibo.com/1461522430/NiEh1BHMt" target="_blank" rel="noopener" +>@软件教书匠金旭亮</a>。</p> +<h3 id="造成电子阳痿的一种因素">造成电子阳痿的一种因素</h3> +<p>一个不容忽视的因素是现在游戏的加载速度,尤其是 PC 游戏。</p> +<p>我们被碎片化信息惯得一秒钟都不想等待。</p> +<p>每当想玩会儿 CS 或者地平线之类得游戏,光是等待游戏启动、地图加载等就足以让人放弃想玩的念头。</p> +<p>更别提有些游戏还有一些跳都无法跳过得开场引导视频。</p> +<p>所以我现在就算是玩也是偶尔打开模拟器玩一玩老游戏,带有状态存储,随时加载存档。</p> +<p>据说有一部分游戏主机(比如新一代 XBox)有类似笔记本电脑的睡眠功能,开机就玩,随时进入上次未完成的任务。</p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 048 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/Tue, 05 Sep 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/<h1 id="机器文摘-第-048-期">机器文摘 第 048 期</h1> +<h2 id="长文">长文</h2> +<h3 id="关于-python-语言的一些统计数字">关于 Python 语言的一些统计数字</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-20-05.png" +width="690" +height="307" +loading="lazy" +class="gallery-image" +data-flex-grow="224" +data-flex-basis="539px" +></p> +<p><a class="link" href="https://py-code.org/stats" target="_blank" rel="noopener" +>关于开源 Python 仓库的一些有趣统计</a>,有人克隆了 PyPI 网站里所有 Python 包对应的 Github 仓库,并对这些仓库里的全部文件进行了分析和统计。</p> +<p>1、排名前三的语法特性分别是:列表推导、fstring字符串格式化、注解;</p> +<p>2、代码中大约包含有超过 2 万 5 千个密钥明文,泄露最多的是访问 Google API、OpenAI API和腾讯云 Secret ID;</p> +<p>3、截止到 2023 年 8 月,所有源码加起来已超过 60TB ,文件数量超过 10 亿。</p> +<h3 id="wasm-技术让数据库执行-ai-模型">Wasm 技术让数据库执行 AI 模型</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-20-30.png" +width="618" +height="492" +loading="lazy" +class="gallery-image" +data-flex-grow="125" +data-flex-basis="301px" +></p> +<p><a class="link" href="https://dylibso.com/blog/pg-extism/" target="_blank" rel="noopener" +>使用 Extism 将 WebAssembly 引入 PostgreSQL</a>。</p> +<p>这篇文章的作者介绍了一种方法,可以使用 Wasm 技术通过扩展插件的方式给 PostgreSQL 数据库增加 UDF (用户自定义函数),从而实现调用 AI 模型的能力。</p> +<h3 id="bitlocker-硬件加密能破解吗">BitLocker 硬件加密能破解吗?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-20-50.png" +width="690" +height="499" +loading="lazy" +class="gallery-image" +data-flex-grow="138" +data-flex-basis="331px" +></p> +<p>BitLocker 是 Windows 下的存储加密技术,用于保护硬盘中的数据安全。</p> +<p>未经解密的硬盘即使遗失或者被接入其他系统也无法进行读取。</p> +<p>这在极大程度上带来了数据安全(不过仍有不少用户在不知情的情况下开启了 BitLocker 且未保存密钥,在重做系统的时候发现硬盘无法解密,数据无法恢复。。欲哭无泪。。)。</p> +<p>然而这种加密方式也不是绝对安全,国外有技术爱好者对此进行了挑战,并使用一台逻辑分析仪成功绕过了加密。</p> +<p><a class="link" href="https://www.errno.fr/BypassingBitlocker.html" target="_blank" rel="noopener" +>这篇文章进行了详细的记录</a>。</p> +<p>主要原理为:在系统开机启动过程中的某个时刻,加密芯片和 CPU 之间传输了未加密的信号。使用逻辑分析仪捕获该信号可以逆向出加密密钥。</p> +<h2 id="资源">资源</h2> +<h3 id="监控网页信息变化的工具">监控网页信息变化的工具</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-21-17.png" +width="499" +height="326" +loading="lazy" +class="gallery-image" +data-flex-grow="153" +data-flex-basis="367px" +></p> +<p><a class="link" href="https://github.com/dgtlmoon/changedetection.io" target="_blank" rel="noopener" +>changedetection</a>,一个监控网站变化的工具。</p> +<p>帮助用户密切关注商品打折、股票行情、政策发布等信息变动。</p> +<p>支持通过网页可视化的方式指定监控页面区域。</p> +<p>通过邮件、即时聊天软件、API调用等多种方式推送信息。可使用 Docker 部署,或者本地 Python 环境部署。</p> +<h3 id="switch-模拟器">Switch 模拟器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-21-28.png" +width="690" +height="472" +loading="lazy" +class="gallery-image" +data-flex-grow="146" +data-flex-basis="350px" +></p> +<p><a class="link" href="https://github.com/Ryujinx/Ryujinx" target="_blank" rel="noopener" +>Ryujinx</a> 一个用c# 写的开源 switch 模拟器,该模拟器旨在提供卓越的准确性和性能、用户友好的界面以及稳定的版本构建。 ​​​</p> +<h3 id="文字缩写快捷键工具">文字缩写快捷键工具</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-21-45.png" +width="568" +height="446" +loading="lazy" +class="gallery-image" +data-flex-grow="127" +data-flex-basis="305px" +></p> +<p>为了减少打字量,国外这哥们写了个脚本将日常用语全部缩写了,只需敲入缩写字母,脚本自动完成完整句子的键盘输入。</p> +<p>比如: +st =&gt; something +ab =&gt; about +hw =&gt; hardware +sti =&gt; sometime</p> +<p>据小哥自己统计,使用这个脚本以后他已经减少了一半的键盘敲击量。</p> +<p><a class="link" href="https://github.com/eschluntz/compress" target="_blank" rel="noopener" +>项目名叫 compress 目前已开源</a>,如果你有兴趣,改成支持中文也不是不可以。</p> +<h3 id="canvas-手册">Canvas 手册</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-22-11.png" +width="562" +height="625" +loading="lazy" +class="gallery-image" +data-flex-grow="89" +data-flex-basis="215px" +></p> +<p>Canvas 是网页中用于图形绘制的基本元素,结合 JavaScript 可以实现各种复杂的图形效果和交互动画。我之前都是每次用到了的时候现去翻文档,对它的每个 API 都是一知半解。这里有一个<a class="link" href="https://bucephalus.org/text/CanvasHandbook/CanvasHandbook.html" target="_blank" rel="noopener" +>Canvas 手册</a>,详细介绍了 Canvas 的各种调用接口。适合希望深度使用及系统学习 Canvas。</p> +<h2 id="观点">观点</h2> +<h3 id="不要重复造轮子是人为设置的一种限制">“不要重复造轮子”是人为设置的一种限制</h3> +<p>遇到需求不能满足的情况,是去“寻找轮子”还是“动手创造轮子”,这是两种不同的思维习惯。</p> +<p>“寻找轮子”往往意味着寻找已有答案,将问题看为一种正常的状态,是“自古以来”、是“从来如此”。</p> +<p>思维定势一旦形成,就很难改变,让人成了那个在沙漠中让美女帮他牵住骆驼的矮子。</p> +<p>动手创造者往往是发现这种问题的人,他们不循规蹈矩,他们 Think different,是改变世界的人。</p> +<p>“不要重复发明轮子”,这个原则用于工作中确实比较安全,他保证了不会浪费资源,并且避免了一定的技术风险。</p> +<p>但也同时拒绝了伟大的创新。</p> +<p>所以不要被这句话束缚,尽管去做自己的轮子。</p> +<p>哪怕它一开始很丑。</p> +<p>你的轮子必将使你与众不同,使你拥有不一样的视角,成为那个动手创造的人。</p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 047 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/Tue, 29 Aug 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/<h1 id="机器文摘-第-047-期">机器文摘 第 047 期</h1> +<h2 id="长文">长文</h2> +<h3 id="业余爱好者痴迷于工具专业人士注重技能">业余爱好者痴迷于工具,专业人士注重技能</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-17-36.png" +width="649" +height="582" +loading="lazy" +class="gallery-image" +data-flex-grow="111" +data-flex-basis="267px" +></p> +<p><a class="link" href="https://adamsinger.substack.com/p/amateurs-obsess-over-tools-pros-over" target="_blank" rel="noopener" +>业余爱好者痴迷于工具,专业人士注重技能</a>。</p> +<blockquote> +<p>以原声吉他为例。在数字音乐制作和合成器盛行的时代,这个单独演奏的乐器可能显得有点古老。然而,在熟练音乐家的手中,它变成了一个充满迷人旋律和触动灵魂的载体。它甚至可能为更大的创意提供灵感,如果你直接跳到现代合成器就有可能会错过这些。原声吉他的简单性促使艺术家专注于演奏的细微之处,完善他们的指弹技巧,并通过每一次弹奏传达情感。真正的魔力不在于吉他本身,而在于将其演绎得生动活泼的音乐家的技艺。</p> +</blockquote> +<p>这篇文章读来深有感触。</p> +<p>在解决问题的时候,我总是忍不住问自己,我这个方法是最优的吗?我使用的工具是不是最合适/最好的?</p> +<p>这种心理,常常使我陷入对最佳实践和完美工具的追求中,而忘记了解决问题本身。</p> +<p>时间久了,工具积累一大堆,但每个都未曾发挥其真正作用,一边老工具在吃灰,一边继续寻找新工具。</p> +<p>差生文具多。</p> +<p>正如文章中所说:真正的高手明白,应当拿起手里已有的工具,先行动起来。在这个过程中如果有机会创造美好的事物,好的工具自然会出现在眼前。</p> +<h3 id="cpu-的指令分支预测">CPU 的指令分支预测</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-17-49.png" +width="682" +height="743" +loading="lazy" +class="gallery-image" +data-flex-grow="91" +data-flex-basis="220px" +></p> +<p>现代的 CPU 基本都具有指令分支预测的特性,通过猜测后续会执行的指令分支,提前运行一些指令和设置状态,可以有效利用 CPU 的执行资源,提升效率。</p> +<p>不过,如果预测准确的话效率提升十分明显,但是如果预测错误,CPU 就要多做一些事情(刷新后续预测的指令和相关的状态),随着现代 CPU 中指令流水线越来越复杂,这种代价也变得越来愈大。</p> +<p>在编程的时候,编写一些对于 CPU 分支预测友好的代码,能够对性能产生极大的影响。</p> +<p>这篇<a class="link" href="https://johnnysswlab.com/how-branches-influence-the-performance-of-your-code-and-what-can-you-do-about-it/" target="_blank" rel="noopener" +>对于 CPU 的分支预测,我们能做什么</a>耐心地从 CPU 的分支预测机制讲起,通过具体的代码举例,讲解了怎样让编写的代码对 CPU 分支预测这类优化更加友好。</p> +<h3 id="ssh-命令详解">SSH 命令详解</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-18-25.png" +width="690" +height="535" +loading="lazy" +class="gallery-image" +data-flex-grow="128" +data-flex-basis="309px" +></p> +<p><a class="link" href="https://grahamhelton.com/blog/ssh-cheatsheet/" target="_blank" rel="noopener" +>SSH 命令详解</a>,一篇对 SSH 命令的参数介绍十分详细且易懂的文章。</p> +<p>通过举例让我彻底弄清楚了基于 SSH 的端口转发。</p> +<p>另外还知道了可以在已有的 SSH 连接上执行补充命令,以实现不断开终端的情况下将远程主机上的端口转发到本机访问。 ​​​</p> +<h2 id="资源">资源</h2> +<h3 id="开源的房子">开源的房子</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-18-47.png" +width="690" +height="403" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="410px" +></p> +<p><a class="link" href="https://www.wikihouse.cc" target="_blank" rel="noopener" +>wikihouse</a>,是一个开源房屋建造网站,房子的图纸、模型均可从网站上下载,里面有各式各样的房屋建造资料,任何人都可以据此增删、设计、制造、组装自己的建筑。可以理解为建筑界的 github。 +​​​</p> +<h3 id="关掉-edge-浏览器新增的圆角样式">关掉 Edge 浏览器新增的圆角样式</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-19-03.png" +width="690" +height="352" +loading="lazy" +class="gallery-image" +data-flex-grow="196" +data-flex-basis="470px" +></p> +<p>Edge 浏览器的最新更新里,给所有页面强制增加了一个圆角边框,看起来很不习惯(丑陋)。</p> +<p>经过研究,我发现,如果想恢复到之前的样子,可以在设置外观选项里关闭该特性。</p> +<p>我已经关闭,并果断给这个功能特性反馈了负面评价。</p> +<h3 id="hello-world">Hello World</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-19-26.png" +width="690" +height="385" +loading="lazy" +class="gallery-image" +data-flex-grow="179" +data-flex-basis="430px" +></p> +<p><a class="link" href="https://github.com/leachim6/hello-world" target="_blank" rel="noopener" +>Hello World</a> ,这个仓库收录了几乎所有编程语言(997种)的 Hello world 程序。 ​​​</p> +<h3 id="前端开发代码大全">前端开发代码大全</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-19-42.png" +width="690" +height="639" +loading="lazy" +class="gallery-image" +data-flex-grow="107" +data-flex-basis="259px" +></p> +<p><a class="link" href="https://30secondsofcode.org" target="_blank" rel="noopener" +>30secondsofcode</a>。</p> +<p>这个网站有大量可复用的代码片段,主要是 Javascript、CSS、HTML 、Python 等语言的内容,可以覆盖 Web 应用开发全栈。</p> +<p>里面收录的代码段或者文章都很清新,每个都配有细心的解释,具有良好的实用性。 ​​​</p> +<h3 id="关于-win10-的锁屏睡眠时间">关于 Win10 的锁屏睡眠时间</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-20-00.png" +width="410" +height="502" +loading="lazy" +class="gallery-image" +data-flex-grow="81" +data-flex-basis="196px" +></p> +<p>我在使用 Windows10 的时候发现一个问题。</p> +<p>无论我将电源设置里的睡眠时间、显示器空闲关闭时间设置多长,锁屏后系统都会在 1 分钟之后关闭显示器。</p> +<p>这会带来一些不方便,并且让人困惑。</p> +<p>在经过一番研究搜索之后,找到了如下解决方案(Windows就是这么喜欢在注册表隐藏设置):</p> +<p>1、打开注册表编辑器后。</p> +<p>2、定位到:<code>计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\7516b95f-f776-4464-8c53-06167f40cc99\8EC4B3A5-6868-48c2-BE75-4F3044BE88A7</code></p> +<p>3、修改右侧的Attributes 数值为2 (初始值为1)</p> +<p>4、再打开“编辑电源计划”时会发现多了一个选项“控制台锁定显示关闭超时。</p> +<h3 id="红警2游戏整合包">红警2游戏整合包</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-20-25.png" +width="413" +height="302" +loading="lazy" +class="gallery-image" +data-flex-grow="136" +data-flex-basis="328px" +></p> +<p><a class="link" href="https://tmioe.com/7991.html" target="_blank" rel="noopener" +>红警2 的民间整合包</a>,支持 win7 到 win11。整合大量资源,傻瓜式一键安装。 ​​​</p> +<p>经过我的测试,前面链接页面里提供的安装包里带有额外的广告脚本,在使用时可使用 7z 等压缩软件直接打开该自解压包,选取主文件夹拷贝出来即可。</p> +<h2 id="观点">观点</h2> +<h3 id="隐形的门槛">隐形的门槛</h3> +<p>也许每个领域都存在一个隐形的门槛,无论是你学会一种语言,还是掌握一种能力,哪怕是打通一个游戏,只要你跨不过那个门槛,那么无论你尝试多少次,都会在同样的水平下无功而返。相反,一旦跨过后,那就是一马平川,你有了在那个新世界周游的能力。这当然不是说你不会再遇到困难,而是说,你不再有那种尝试了无数次,带着同一种感受离开的感觉。剩下的区别只是更多经验的积累,是熟练度的问题,因为你已经在那个轨道上了,你已经拿到了入场券。</p> +<p>人生可以被隐喻成一个有着自然消退机制的RPG体系,累积10000经验可以升那关键的一级,那么先前你无论你多少次到达5000,6000,9000都不行,因为熟练度会反复消退到1000,2000的水平。而我知道,很多人就是无数次的卡在了那9000以内,但每次都要从1000,2000这个位置开始。这个和自我接纳也没有关系,因为你知道你遇到的困难并不是基于你对自己的苛求,你的困难在于你无法为自己在乎的事情付出真正的努力,无法将自己的活力与热情持续的灌注在同一个点上,但你隐约知晓跨过那10000的门槛,是你更重要的人生福祉。</p> +<p>来自微博 <a class="link" href="https://weibo.com/3762961402/NgprO9HD5" target="_blank" rel="noopener" +>@崔庆龙_</a></p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 046 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/Tue, 22 Aug 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/<h1 id="机器文摘-第-046-期">机器文摘 第 046 期</h1> +<h2 id="长文">长文</h2> +<h3 id="windows-的任务管理器">Windows 的任务管理器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-28-48.png" +width="452" +height="758" +loading="lazy" +class="gallery-image" +data-flex-grow="59" +data-flex-basis="143px" +></p> +<p>如果你喜欢使用 Windows 任务管理器来查杀那些不安分的进程,并且跟我一样讨厌他们乱跳(尤其在按照资源占用排序时)。你可以按下 Ctrl 键,它就会神奇地停止更新直到你松开 Ctrl。</p> +<p>Windows 操作系统有一种魔力,就是哪怕你用了将近 20 年,还是会有你不知道的快捷键或者快捷操作。这些东西有时候能带来一些惊喜。</p> +<p>具体介绍可以看这里:<a class="link" href="https://www.theverge.com/2023/8/16/23834125/microsoft-windows-task-manager-pause-shortcut" target="_blank" rel="noopener" +>暂停 Windows 任务管理器</a></p> +<h3 id="linux-内核最初版的解析">Linux 内核最初版的解析</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-29-10.png" +width="588" +height="253" +loading="lazy" +class="gallery-image" +data-flex-grow="232" +data-flex-basis="557px" +></p> +<p>最新版本的 Linux 内核,其源码规模已经飙升至 3600 万行,想要深入细节去了解它十分吃力。</p> +<p>而Linux 的第一个版本 v0.01 却非常小巧。</p> +<p>刨去注释和空行的话,也就 8 千来行代码。</p> +<p>这么小的代码结构,足够理解操作系统的精髓。</p> +<p>这篇<a class="link" href="https://seiya.me/blog/reading-linux-v0.01" target="_blank" rel="noopener" +>探索 Linux v0.01 d的内部结构</a>,可以带你像参观历史博物馆那样去见证曾经的 Linux。</p> +<p>我记录了一些有意思的地方:</p> +<p>1、v0.01 只有 66 个系统调用,用于支持文件管理和进程管理,分别是:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">access acct alarm <span class="nb">break</span> brk chdir chmod +</span></span><span class="line"><span class="cl">chown chroot close creat dup dup2 execve +</span></span><span class="line"><span class="cl"><span class="nb">exit</span> fcntl fork fstat ftime getegid geteuid +</span></span><span class="line"><span class="cl">getgid getpgrp setsid getpid getppid +</span></span><span class="line"><span class="cl">getuid gtty ioctl <span class="nb">kill</span> link lock lseek +</span></span><span class="line"><span class="cl">mkdir mknod mount mpx nice open pause +</span></span><span class="line"><span class="cl">phys pipe prof ptrace <span class="nb">read</span> rename rmdir +</span></span><span class="line"><span class="cl">setgid setpgid setuid setup signal stat +</span></span><span class="line"><span class="cl">stime stty sync <span class="nb">time</span> <span class="nb">times</span> <span class="nb">ulimit</span> <span class="nb">umask</span> +</span></span><span class="line"><span class="cl">umount uname unlink ustat utime waitpid write +</span></span></code></pre></td></tr></table> +</div> +</div><p>其中 mount 调用啥也没干,直接返回了。</p> +<p>2、直接写死代码绑定 Intel 386 平台。至今对于 PS/2 接口的键盘、ATA硬盘、VGA显卡等标准硬件的驱动代码还是写死在内核里(而不是放在drivers文件夹)。</p> +<p>3、系统崩溃处理代码只有 5 行:只实现了打印一句“我不行了”,然后进入死循环<code>for(;;);</code>。</p> +<h3 id="llamacpp-是怎样做到的">LLaMa.cpp 是怎样做到的?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-29-37.png" +width="540" +height="531" +loading="lazy" +class="gallery-image" +data-flex-grow="101" +data-flex-basis="244px" +></p> +<p>LLaMa.cpp 是一个令人惊叹的项目,在它之前没有人能够在低端消费设备上成功运行 Meta 开源的人工智能模型 LLaMa ,因为那需要太多的硬件资源。</p> +<p>但是 LLaMa.cpp 的横空出世使得在 M2 Macbook Pro、Android Pixel5 手机甚至树莓派上运行 LLaMa 的 7B 模型成为可能。</p> +<p>这是怎么做到的?</p> +<p>带着这个疑问,有网友深入研究了这个项目,并写下了这篇<a class="link" href="https://finbarr.ca/how-is-llama-cpp-possible/" target="_blank" rel="noopener" +>How is LLaMa.cpp possible?</a>以解释原因。</p> +<p>作者认为主要得益于对模型参数的量化,降低模型参数的精度,从 FLOAT16 减小到 INT4。使得 LLaMa.cpp 能够以较少的计算资源甚至只依赖 CPU 的情况下加载大模型。</p> +<h3 id="逐渐觉得微软比谷歌良心">逐渐觉得微软比谷歌良心</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-30-01.png" +width="690" +height="372" +loading="lazy" +class="gallery-image" +data-flex-grow="185" +data-flex-basis="445px" +></p> +<p>曾经微软是技术黑客的公敌,被不少人视为反对技术创新、技术开放的最大反派。</p> +<p>不过随着时间的推移,以及微软逐渐在开源社区所做出的努力。这一现象有所好转。</p> +<p>近期在 HN 上<a class="link" href="https://old.reddit.com/r/degoogle/comments/15pd5si/today_i_realized_i_now_trust_microsoft_more_than/" target="_blank" rel="noopener" +>有位网友很扭捏地承认:现在他对微软的感觉要比对谷歌好很多</a>。</p> +<p>他列举了一些关于两家公司的对比,包括发布的产品、主观的优劣评价等等。</p> +<p>为了抵制微软,他已经十多年没用 Windows 了,但貌似微软的其他产品“很香”(VS Code、Github、ChatGPT等)。</p> +<p>并表示最近正在寻摸租一个云存储,大概率也会用微软的 onedrive 而不是谷歌的 Google drivers。</p> +<p>对此我也有类似感觉,不过我对谷歌的不信任起始于十年前谷歌将 Google reader 停掉,而自从微软推出 WSL 后,我更是觉得微软在产品上越来越实在了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-31-23.png" +width="690" +height="538" +loading="lazy" +class="gallery-image" +data-flex-grow="128" +data-flex-basis="307px" +></p> +<h2 id="资源">资源</h2> +<h3 id="tailwindcss-的小抄">tailwindcss 的小抄</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-30-29.png" +width="690" +height="465" +loading="lazy" +class="gallery-image" +data-flex-grow="148" +data-flex-basis="356px" +></p> +<p>tailwind 这个 css 框架之所以能够很快流行起来,主要原因就是它解决了一个之前很多人没有太注意的问题,即 CSS 的“正交性”。</p> +<p>之前 CSS 实现一个效果,可以有 N 种方法,外加各种奇技淫巧,但在使用 tailwind 之后,针对特定效果都有了最优实践路径,而且还可以很容易组合。</p> +<p>不过由于它的类分的太细太碎,导致刚开始的时候会有一些不容易记忆。</p> +<p><a class="link" href="https://tailwindcomponents.com/cheatsheet/" target="_blank" rel="noopener" +>这里有一份 tailwind 的小抄</a>,适合初学者收藏,方便随时查阅。</p> +<h3 id="在浏览器中运行的-vim">在浏览器中运行的 vim</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-30-43.png" +width="690" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="204" +data-flex-basis="491px" +></p> +<p><a class="link" href="https://github.com/rhysd/vim.wasm" target="_blank" rel="noopener" +>vim.wasm</a>,在浏览器中运行的 Vim,不是插件。</p> +<p>使用 wasm 技术直接编译移植的 Vim Editor 源码,效果跟原生程序几乎一样。</p> +<p>使用 WebAssembly 给 Vim 提供一个新的 GUI 前端(类似 GVim)。</p> +<p>为了编译通过,作者在源码里禁用了很多 Wasm 不支持的特性,如:fork(2)、PTY 等。</p> +<p>可在这里体验:https://rhysd.github.io/vim.wasm/</p> +<h3 id="无隐私问题的-pdf-工具网站">无隐私问题的 pdf 工具网站</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-32-04.png" +width="690" +height="362" +loading="lazy" +class="gallery-image" +data-flex-grow="190" +data-flex-basis="457px" +></p> +<p><a class="link" href="https://pdftool.org/zh" target="_blank" rel="noopener" +>这个pdf工具可以尝试一下</a>,跟其他pdf 工具网站不同,这个网站借用 WebAssembly 技术将很多工作放在浏览器客户端执行,用户无需上传自己的pdf到网站,即可执行处理工作,包括:加密、解密、拆分、合并等常用功能。 ​​​</p> +<h3 id="深入理解操作系统的小游戏">深入理解操作系统的小游戏</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-32-17.png" +width="690" +height="368" +loading="lazy" +class="gallery-image" +data-flex-grow="187" +data-flex-basis="450px" +></p> +<p><a class="link" href="https://plbrault.com/blog-posts/i-created-the-nerdierst-game-ever-en/" target="_blank" rel="noopener" +>这个自称史上最极客的小游戏</a>,是国外一位计算机科学教授给学生们写的一个小游戏,假设玩家是一个“操作系统”,在游戏里玩家需要不停地进程调度、内存页交换等操作,一旦调度不合理就会激怒用户导致“玩家”也就是操作系统被重启,游戏就 GAME OVER 了。</p> +<p>游戏使用 Python 编写,作者将其编译为 WebAssembly 以嵌入网页,这里可以直接在线体验: <a class="link" href="https://drfreckles42.itch.io/youre-the-os" target="_blank" rel="noopener" +>https://drfreckles42.itch.io/youre-the-os</a>。</p> +<h2 id="观点">观点</h2> +<h3 id="学习技能最有效的练习手段是复刻">学习技能最有效的练习手段是“复刻”</h3> +<p>这是我前两天尝试用 CSS 临时写个页面效果想到的。</p> +<p>我虽然也了解了CSS 语言的一些基本知识,但是在具体实操的时候仍会感到无从下手。</p> +<p>与下棋类似,只知道“规则”但是没有“套路”。</p> +<p>后来干脆找了几个目标页面,按照自己的想法去还原,渐渐能够摸到一些“套路”的边缘,最终实现了自己想要的效果。</p> +<p>于是我想: <strong>在学习一项技能的时候,“复刻”、“抄袭”、“借鉴”、“致敬”,都没有问题,应该把它作为最主要的练习手段。</strong></p> +<p>因为“抄”是最经济的学习方法了。</p> +<p>不仅仅是编程技能,艺术方面更是如此。</p> +<p>比如在编曲学习的时候有一种练习叫“扒带”,就是找一首歌,然后你通过你的工具和技巧制作一份完全一样的作品,尽量做到百分百还原。</p> +<p>很多“大师”都是在这个过程中,遇到问题解决问题,领悟到很多只能意会不能言传的技巧,而这些领悟是无论如何也无法仅仅通过“看”和“听”获得的。</p> +<p>另外,人们练字、绘画也是从临摹开始,一般在熟练之后才能突破,才又自成体系。</p> +<h3 id="忍耐守恒">忍耐守恒</h3> +<p>怕麻烦的人,主要是不能忍受一些事情。</p> +<p>然而正是因为这些不能忍受,所以注定要忍受一些其他的事情。</p> +<p>人生就是这样,比如无法忍受投资带来的风险,就得承受现金贬值;不能面对创业的压力,就得忍受按时上班的束缚。</p> +<p>对于这种现象,我将之称为“忍耐守恒”。 ​​​</p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 045 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/Tue, 15 Aug 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/<h1 id="机器文摘-第-045-期">机器文摘 第 045 期</h1> +<h2 id="长文">长文</h2> +<h3 id="基于浏览器-javascript-堆快照的网页爬虫">基于浏览器 JavaScript 堆快照的网页爬虫</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-23-22.png" +width="690" +height="546" +loading="lazy" +class="gallery-image" +data-flex-grow="126" +data-flex-basis="303px" +></p> +<p><a class="link" href="https://www.adriancooney.ie/blog/web-scraping-via-javascript-heap-snapshots" target="_blank" rel="noopener" +>基于 JavaScript 堆快照的网页爬虫</a>。</p> +<p>本文作者介绍了一个实现网络爬虫的新思路,据称已在生产上使用了一段时间,且效果不错。</p> +<p>比较典型的网络爬虫在爬取数据时,大都采用解析网页 DOM 的方式,或直接通过 HTTP 请求流直接解析,或使用无头浏览器进行解析。</p> +<p>但现在这项技术已经被很多网站、平台人为设置很多障碍,比如增加很多随机的嵌套等等。</p> +<p>作者某天福至心灵,想到一个点子。</p> +<p>利用浏览器提供的 JavaScript 内存堆快照功能,将内存里的全部信息扒下来,然后根据对应的 JavaScript 对象属性,按图索骥去找到真正需要的数据。</p> +<p>这种方法比较狠的地方在于,<strong>直接从后台的数据结构下手,跳过了对页面 DOM 的分析和拆解</strong>,而且据作者说,网站即便想通过混淆此类数据在内存中的属性名称来进行防御,其工作量还是相当大的。</p> +<p>所以,可能短期内无能为力。</p> +<p>作者说,也许全面转为 Web Assembly 才能彻底禁止他这种爬虫。</p> +<p><a class="link" href="https://github.com/adriancooney/puppeteer-heap-snapshot" target="_blank" rel="noopener" +>项目源码在这里</a></p> +<h3 id="intel-cpu-的崩溃攻击漏洞">Intel CPU 的“崩溃攻击”漏洞</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-23-45.png" +width="512" +height="512" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +></p> +<p><a class="link" href="https://downfall.page" target="_blank" rel="noopener" +>intel cpu 有一个崩溃攻击漏洞</a>,标识为 <a class="link" href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-40982" target="_blank" rel="noopener" +>CVE-2022-40982</a>,利用此漏洞可以在虚拟机里窃取共享同一个物理 CPU 的其他虚拟机的数据。</p> +<p>这个漏洞可以让恶意程序在本机运行后窃取如密码、加密密钥、以及个人电子邮件等私人数据。</p> +<p>恶意的云计算客户可以利用 Downfall 漏洞从与其共享同一台云计算机的其他客户那里窃取数据和凭据。</p> +<p>据文章作者(也即漏洞发现者)所说,该漏洞存在于 Intel Core 6 代到 11 代 CPU,并且研究人员发现存在通过 Web 网页浏览进行攻击的可能性。</p> +<p><a class="link" href="https://github.com/flowyroll/downfall/tree/main/POC" target="_blank" rel="noopener" +>作者开放了一部分用于测试攻击的代码在此</a></p> +<h3 id="利用树莓派的-gpio-发射无线信号">利用树莓派的 GPIO 发射无线信号</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-24-15.png" +width="690" +height="388" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></p> +<p><a class="link" href="https://hackaday.com/2021/04/06/fan-tastic-misuse-of-raspberry-pi-gpio/" target="_blank" rel="noopener" +>原来树莓派的 GPIO 还能干这个</a>,这位老哥使用树莓派的 GPIO 接口直接进行无线电波发射(没错,就是随便扯出一根线就可以当作天线了)。实现了基于树莓派的微型电台。</p> +<p>这得益于 <a class="link" href="https://github.com/F5OEO/rpitx" target="_blank" rel="noopener" +>rpitx</a>这个开源项目,项目本来是为了研究和学习一些无线电原理,不过后来逐渐成为一些 SDR 爱好者必不可少的工具了。</p> +<p><a class="link" href="https://www.youtube.com/watch?v=M2JY1_Xmokg&amp;t=8s" target="_blank" rel="noopener" +>我上次看到一个小哥使用 RTL-SDR 录制汽车遥控器信号,然后使用树莓派重复发射出来,成功实现了自家汽车的解锁</a>。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://oimo.io/works/water/" target="_blank" rel="noopener" +>water</a>,一个在网页里模拟流体动画的 Demo,使用 Haxe 语言编写。<a class="link" href="https://github.com/saharan/works/tree/main/water" target="_blank" rel="noopener" +>源码在这里</a> +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-24-42.png" +width="690" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="204" +data-flex-basis="491px" +></p> +<p>Haxe 是一种跨平台的开源编程语言,在其官方网站上称其为&quot;universal language&quot;。</p> +<p>它可以用于开发多种平台(如Web、移动、桌面等)的应用程序。</p> +<p>Haxe 提供了强大的静态类型系统,并支持多种编译目标,包括但不限于 JavaScript、C++、Java、C#、Python 等。</p> +<p>感兴趣的话,这里也有<a class="link" href="https://daobook.github.io/haxe-book/docs/start/00_intro.html" target="_blank" rel="noopener" +>一份 Haxe 的在线教程</a></p> +</li> +<li> +<p><a class="link" href="https://github.com/lllyasviel/Fooocus" target="_blank" rel="noopener" +>Fooocus</a>,ControlNet 作者开源的一款新的 AI 画图工具 ,搭建起来比 Stable Diffusion webui 稍微方便了一点,相当于整合包。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-25-40.png" +width="690" +height="644" +loading="lazy" +class="gallery-image" +data-flex-grow="107" +data-flex-basis="257px" +></p> +</li> +<li> +<p>原来 HTML5 有一个 <code>&lt;progress&gt;&lt;/progress&gt;</code> 标签,直接写这个标签,不加任何属性的话,就是一个加载动画,非常适合在页面里临时需要一个进度、状态展示的时候。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-25-55.png" +width="462" +height="387" +loading="lazy" +class="gallery-image" +data-flex-grow="119" +data-flex-basis="286px" +></p> +</li> +<li> +<p><a class="link" href="https://wangdoc.com/typescript/" target="_blank" rel="noopener" +>阮一峰老师的 Typescript 教程</a>,发布了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-26-13.png" +width="501" +height="800" +loading="lazy" +class="gallery-image" +data-flex-grow="62" +data-flex-basis="150px" +></p> +</li> +</ul> +<p>据老师自己说,刚开始也是抗拒的,觉得TypeScript 就是为 JS 语言添加静态类型系统。如果真需要静态类型,可以考虑使用其他更成熟的语言(比如 Rust 和 Java),再编译成 JS(wasm 模块),何必新学一门语言呢。</p> +<p>但是后来发现 TypeScript 越来越流行,成为前端开发的主流工具,各种项目纷纷移植过去。</p> +<p>我虽然对 TypeScript 仍然持保留态度,但是阮老师写的技术书籍读起来都很轻松易懂,所以觉得还是有必要收藏一下​​​。</p> +<ul> +<li> +<p><a class="link" href="https://islamov.ai/stable-diffusion-webgpu/" target="_blank" rel="noopener" +>stable-diffusion-webgpu</a>,在网页里运行 AI 画图模型。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-26-55.png" +width="1154" +height="667" +loading="lazy" +class="gallery-image" +data-flex-grow="173" +data-flex-basis="415px" +></p> +<p>基于 webgpu 技术,无需部署,直接在网页里运行。我试了一下,在我的 1080 8G 显存的显卡上 ,可以跑动,但是速度一般。</p> +<p>上面的图是我只跑了 8 个 steps 的结果。。。 ​​​</p> +</li> +</ul> +<h2 id="观点">观点</h2> +<h3 id="ai-画图的品质">AI 画图的品质</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-27-30.png" +width="690" +height="690" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +></p> +<p>为了验证之前关于“模特很可能被AI取代”的想法,自己动手部署 <a class="link" href="https://github.com/AUTOMATIC1111/stable-diffusion-webui" target="_blank" rel="noopener" +>Stable Diffusion webui </a> 测试了一些模型。根据网友分享的提示词尝试生成了一些图片。</p> +<p>感觉效果比我几个月之前体验时又有了不少提升,配合各种微调模型和 LoRA 模型可以生成照片质感和光影的图片。</p> +<p>虽然人物表情和姿态还有些僵硬,不过我相信这是我没有合理调整各个参数以及充分发挥插件性能导致。</p> +<p>多进行尝试和练习,应该能够生成更逼真、自然的照片。</p> +<h3 id="信息的维度">信息的维度</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-28-20.png" +width="690" +height="690" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +> +最近看了一些线性代数相关的知识,在向量、矩阵的各种计算中逐渐有了一些感悟:</p> +<p>古代“老子”思想中的“道”很可能是无限维的,你的任何表达都是对它的一种投影,也就是降维了。所以才是“道可道,非常道”。</p> +<p>每个人都想用最简单的框架去理解世界,将多维的信息硬生生地将为一维。</p> +<p>这样的后果便是,盲人摸象、管中窥豹、一叶障目,不同的观点争得不可开交。</p> +<p>所以在接收时也应该尽量按自己掌握的其它维度进行升维还原,任何信息都不可孤立看待。</p> +<p>如果能从多维信息得视角去认知世界,也许会有转机,这多少就有点儿“阴阳互生、一分为三”的意思了。</p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 044 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/Tue, 08 Aug 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/<h1 id="机器文摘-第-044-期">机器文摘 第 044 期</h1> +<h2 id="长文">长文</h2> +<h3 id="导致-python-多线程鸡肋的-gil-是什么">导致 Python 多线程鸡肋的 GIL 是什么</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-51-26.png" +width="690" +height="839" +loading="lazy" +class="gallery-image" +data-flex-grow="82" +data-flex-basis="197px" +> +近期在使用 Python 多线程的时候,遇到了 GIL 全局锁导致的性能问题。</p> +<p>具体来说就是性能提升没有达到预期,对于有些计算任务无法并行执行。</p> +<p>从多核 CPU 占用结果上来看,像极了网上那张经典的围观图,一核干活多核围观。</p> +<p>于是翻阅了相关资料研究一下,发现这是 Python 社区争论多年的问题,而且有很大的历史包袱。</p> +<p>严格来说,GIL 全局锁导致的性能问题与 Python 编程语言没有关系,导致这个问题的原因在于具体实现的 CPython 解释器。</p> +<p>当年解释器开发者为了简单实现对多线程的支持,搞了一个全局锁,以至于在多核时代无法充分发挥 CPU 性能。</p> +<p>而后续又有很多库延续了这项依赖,历史的包袱(屎山?)越来越重,很难下定决心将之移除(据说代价甚至比当年从 Python2.x 迁移到 Python3 还要大)。</p> +<p>如果不想深究具体技术细节只想了解基本的来龙去脉,这里有篇文章<a class="link" href="https://xie.infoq.cn/article/1e151c24367abe8cad18130f4" target="_blank" rel="noopener" +>为什么 GIL 让多线程变得如此鸡肋?</a>介绍了 Python PIL 的产生背景以及适用于 Python 多线程的业务场景,可以给你的技术决策提供参考。</p> +<p>不过好消息是,就在刚刚(前几天),Python 官方终于宣布要动手取消掉 GIL 了,顿时网上一片沸腾(其实只有一部分人,大多数人都还不知道 PIL 是什么玩意儿)。而且,<a class="link" href="https://news.ycombinator.com/item?id=36643670" target="_blank" rel="noopener" +>Meta 也承诺,愿意出工出力(3人年)帮助 Python 社区做针对去除 GIL 的相关开发工作</a>。</p> +<h3 id="用树莓派做一个属于自己的高级收音机">用树莓派做一个属于自己的高级收音机</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-52-14.png" +width="606" +height="454" +loading="lazy" +class="gallery-image" +data-flex-grow="133" +data-flex-basis="320px" +> +最近接触到 SDR (软件定义无线电)这个领域,感觉挺有意思的。</p> +<p>软件定义无线电是一种无线通信技术,它利用软件来实现无线电通信系统中的信号处理和调制解调功能,而不是传统的硬件电路。</p> +<p>通过软件定义无线电技术,可以实现灵活、可配置和可重用的无线通信系统,大大提高了无线通信的灵活性和性能。</p> +<p>传统的无线电通信系统通常使用硬件电路来执行信号处理、调制解调和频谱管理等功能。这些硬件电路通常是固定的,不能轻易更改,因此限制了通信系统的灵活性和可配置性。</p> +<p>而SDR技术通过将信号处理和调制解调等功能以软件方式实现,可以在通信系统中使用可编程的处理器和通用硬件,从而使得通信系统的功能可以在软件层面上重新配置和调整,而不需要更改硬件设计。</p> +<p>比起灵活性和可配置性来说,我觉得 SDR 最大的优势是成本大大降低。之前必须购买昂贵的硬件才能实现的效果,现在能够通过便宜的、少量的硬件加上软件模拟即可。</p> +<p>我近期就以很低廉的价格购买了一套 SDR 设备,通过 USB 接口连接计算机,可以实现 500KHz到1700MHz频率范围的接收。听 FM 和航空频段不在话下,SW 短波的话受天线影响,我暂时没有调试出好的效果。</p> +<p>跟 SDR 相比,我几千块买的旗舰手台显得既昂贵又功能弱。</p> +<p><a class="link" href="https://www.hackster.io/mircemk/diy-sdr-dsp-radio-with-raspberry-pi-and-rtlsdr-dongle-c38064" target="_blank" rel="noopener" +>这里有篇文章</a>是作者自己动手用 SDR 设备结合树莓派制作了一个看起来还挺专业的宽频无线接收机。</p> +<p>其实这跟音乐制作领域内很多乐器、效果器逐渐被虚拟化的软件、插件代替是一样的。软件虚拟化拥有巨大的优势,随着通用计算硬件的成本越来越低廉,一切能被软件定义的最终都会被软件定义。</p> +<h3 id="家用-wifi-路由器需要选择哪个信道">家用 WiFi 路由器需要选择哪个“信道”</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-52-42.png" +width="601" +height="373" +loading="lazy" +class="gallery-image" +data-flex-grow="161" +data-flex-basis="386px" +> +近期验证了一个关于无线路由器的传说。</p> +<p>起因是我新买了一个树莓派 ZeroW 带无线版本,没想到板载的 WiFi 网卡天线太弱了。</p> +<p>离路由器稍微远一点,比如放到卧室,传输速率就会大幅下降,我又暂时没能找到合适的外接网卡,一度陷入绝望。</p> +<p>后来灵机一动,看看能不能从路由器那头想想办法,于是打开路由器配置页面,找到了 WiFi 的“信道”设置,将之从“自动”调到了最不常用的“13”。</p> +<p>这里补充一下,WiFi信道一般从1到13,由路由器自动选择,但现在无线环境十分混乱,尤其是 2.4G(树莓派 Zero W 只能连这个规格) 频段,干扰很严重。</p> +<p>但是 13 这个信道很少被路由器自动选用,原因是最初制定标准的时候,不是所有国家和地区都支持,也不是所有终端设备都支持,所以这个信道就成了最不常用的。</p> +<p>在我手动指定信道之后,惊喜地发现,树莓派放在同样的位置,传输速率得到了较大提升并且稳定。看来传说将路由器 2.4G 信道设为 13 可以防干扰是真实的。</p> +<p><a class="link" href="https://zhuanlan.zhihu.com/p/344389009" target="_blank" rel="noopener" +>什么是路由器的信道?信道设置成什么最合理?</a></p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://roadmap.sh" target="_blank" rel="noopener" +>开发人员路线图</a> 是一个学习索引网站,旨在创建路线图、指南和其他教育内容,以帮助开发人员选择学习路径。在 Github 所有仓库中 Stars 排名第七。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-53-03.png" +width="690" +height="490" +loading="lazy" +class="gallery-image" +data-flex-grow="140" +data-flex-basis="337px" +></li> +<li><a class="link" href="https://felixkreuk.github.io/audiogen/" target="_blank" rel="noopener" +>AudioGen</a> facebook 开源的声音合成模型,可以根据文字描述生成对应的声音。效果已经很惊人了,这个页面展示了很多样例。我听了一下,觉得以后影视作品里的一部分声音特效应该可以通过 AI 进行生成了。至少像一些嘈杂的人群、婴儿哭声、鸟叫等各种背景音是可以合成的。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-53-14.png" +width="499" +height="270" +loading="lazy" +class="gallery-image" +data-flex-grow="184" +data-flex-basis="443px" +></li> +<li>原来 Chrome 和 Edge 浏览器的 DevTools 里自带了 CSS 动画曲线编辑器啊!可以直接通过鼠标拖动进行调整和预览,十分便捷。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-53-29.png" +width="562" +height="528" +loading="lazy" +class="gallery-image" +data-flex-grow="106" +data-flex-basis="255px" +></li> +<li><a class="link" href="https://github.com/GraphiteEditor/Graphite" target="_blank" rel="noopener" +>Graphite</a>,一个开源的 2D 矢量图形编辑器,适用于照片编辑、图像处理、图形设计、插图、数据可视化、数字绘画等领域。可以实现项目图稿,数据可视化和自动化。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-54-19.png" +width="830" +height="465" +loading="lazy" +class="gallery-image" +data-flex-grow="178" +data-flex-basis="428px" +></li> +</ul> +<h2 id="观点">观点</h2> +<h3 id="获取高品质信息的需求仍然强烈只是被淹没了">获取高品质信息的需求仍然强烈,只是被淹没了</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-54-40.png" +width="367" +height="372" +loading="lazy" +class="gallery-image" +data-flex-grow="98" +data-flex-basis="236px" +> +三十几年前,电视逐渐取代书籍、报纸等传统媒体的年代,尼尔波兹曼写下了《娱乐至死》。</p> +<p>作者认为:过度追求娱乐和娱乐化的信息传播方式可能导致公众思考能力的下降。</p> +<p>然而这么多年过去了,人们在降低信息质量这条路上越走越远。电视也早已沦为老年人卧床的伴侣,电视节目更是无法占据现代人的时间,取而代之的是手机短视频。</p> +<p>短视频已经成为大部分人闲暇消遣、信息获取的主要方式。这种媒体的变化将进一步降低理解和感受深度信息的能力,使人对深入学习和思考失去兴趣。</p> +<p>虽然获取的信息看似在增多,但现在高质量的信息却越来越少。</p> +<p>短视频等碎片化信息给我的感觉就像是无线电信号的背景噪音,现在的信息“电磁环境”早已被这种噪音充斥。因为“背景噪音”太大,就好像在高楼林立的城市里打开无线电,接收到的全是 LED 路灯和电动车充电器产生的噪波。</p> +<p>不过我还是相信会有包括我在内的相当一部分人,不愿放弃主动思考,不屑于接收低品质信息。</p> +<p>我正在努力做出一些尝试,以后逐渐记录下来:</p> +<ol> +<li>降低输入:减少刷碎片信息的时间;</li> +<li>滤波:使用搜索引擎、RSS服务、newsletter邮件等工具进行整理;</li> +<li>溯源:尽量选择信息源头获取一手信息,对于技术来说,直接阅读英文文档是一个办法;</li> +<li>创造:自己制作高质量内容;</li> +</ol> +<h3 id="摄影师不会被-ai-取代但是模特很可能会">摄影师不会被 AI 取代,但是模特很可能会</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-56-00.png" +width="664" +height="427" +loading="lazy" +class="gallery-image" +data-flex-grow="155" +data-flex-basis="373px" +> +即便以后 AI 绘画能够产出更加难以分辨真假的作品。</p> +<p>从目前能看到的各种生成作品来说,还是摄影师负责了主要的创作灵感。</p> +<p>真要说被取代的话,也许“被拍摄对象”经过虚拟化以后,很可能被取代。</p> +<p>以后不仅仅是举着相机的叫摄影师,说不定会诞生面向 AI 摄影这一职业。</p> +<p>到时候器材党玩的不再是镜头,改玩显卡了?</p> +<p>“嘿,你这 N 卡 比我这 A 卡有德味儿,毒!”</p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 043 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/Tue, 01 Aug 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/<h1 id="机器文摘-第-043-期">机器文摘 第 043 期</h1> +<h2 id="长文">长文</h2> +<h3 id="先做框架再做功能">先做框架再做功能</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-13-57-56.png" +width="690" +height="395" +loading="lazy" +class="gallery-image" +data-flex-grow="174" +data-flex-basis="419px" +> +<a class="link" href="https://devblogs.microsoft.com/oldnewthing/20230725-00/?p=108482" target="_blank" rel="noopener" +>Before you try to do something, make sure you can do nothing.</a></p> +<p>看到这句话第一反应是:这是什么 XX 逻辑?看完作者的文字之后,哦,这是一种软件构建的方法。</p> +<p>意思是说,先宏观再微观,先整体再局部,别一上来就陷入到细节代码的编写中去。</p> +<p>先把框架搭好,具体功能一个也别着急实现,留着占位,先搭一个“什么都不干”的架子,然后再逐渐补充功能。</p> +<p>但也不是真的什么都不干,而是理清了各个关键组件的调用关系以及与开发相关的辅助功能(如打印调试信息)。</p> +<p>这样做最大的好处是,随着功能开发的深入,代码不至于失控,而且具有良好的可调试性和组件问题隔离能力。</p> +<p>随之而来的就是轻松写代码,而不是眉毛胡子一把抓。</p> +<h3 id="神经网络从开始到现在">神经网络从开始到现在</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-13-58-59.png" +width="690" +height="513" +loading="lazy" +class="gallery-image" +data-flex-grow="134" +data-flex-basis="322px" +> +<a class="link" href="https://s3tlxskbq3.feishu.cn/docx/NyPqdCKraoXz9gxNVCfcIFdnnAc" target="_blank" rel="noopener" +>The Document is All You Need!</a></p> +<p>一篇 AI 科普好文章,用较为通俗的语言讲解了神经网络模型原理和发展历程(我感觉有些像生物的进化)。</p> +<p>从最初的由神经元组成的多层感知机开始,然后进化到卷积神经网络 CNN 降低网络复杂度,再进化, RNN 循环神经网络给模型增加记忆能力,记忆能力太强也不行,到了 LSTM 开始让它能够遗忘,再到后面的 注意力机制以及 LLM 语言模型。</p> +<p>比起同类文章,这一篇尽量避免了数学概念的推导和论证,尽量在不看公式的情况下解释基本思路,适合我等小白学习。</p> +<h3 id="代码审查的一些建议">代码审查的一些建议</h3> +<p><a class="link" href="https://codelantis.com/blog/code-reviews-best-practices" target="_blank" rel="noopener" +>5个关于代码审查的最佳实践</a>,文章记录一些了对代码审查的实践建议,嫌长不看我总结如下:</p> +<ol> +<li>一次只审查一个功能特性或者错误修复。</li> +<li>提前准备好背景交代(在审查之前写清楚这么做的原因和基本思路)。</li> +<li>利用自动化工具提前做好静态检查,提前统一风格、规范。</li> +<li>利用提问的方式提出改进建议而不是直接喷,如:“我们真的需要这个断言吗?”</li> +<li>仔细阅读代码,慢慢来,以充分理解。</li> +</ol> +<h2 id="资源">资源</h2> +<ul> +<li> +<p>微软的 <a class="link" href="https://learn.microsoft.com/en-us/sysinternals/downloads/zoomit" target="_blank" rel="noopener" +>ZoomIT</a> 真是个经典工具,已经默默维护了好多年了,现在版本为7.0。体积小巧才1MB多点儿,绿色免安装,下载解压即用。非常适合进行共享屏幕培训讲解,或者录制教学视频。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-13-59-57.png" +width="669" +height="465" +loading="lazy" +class="gallery-image" +data-flex-grow="143" +data-flex-basis="345px" +> +ZoomIT 快捷键如下: +Ctrl+1:放大屏幕,屏幕静止,然后使用鼠标批注; +Ctrl+2:使用鼠标随意绘制批注,支持 r、g、b、o 等快捷键切换颜色; +Ctrl+3:显示 BreakTime 倒计时; +Ctrl+4:放大屏幕,屏幕继续支持鼠标交互操作,用于放大操作过程; +Ctrl+5:录制屏幕,可与前面几个功能结合使用;</p> +</li> +<li> +<p><a class="link" href="https://github.com/kamranahmedse/driver.js" target="_blank" rel="noopener" +>driver.js</a> 一个压缩后只有 5K 大小的前端库,可以让你的网站或者 Webapp 迅速集成交互式“使用指南”的能力。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-14-00-27.png" +width="690" +height="361" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="458px" +></p> +</li> +<li> +<p><a class="link" href="https://clangjs.netlify.app" target="_blank" rel="noopener" +>clangjs</a> 一个在浏览器编译、链接、运行 C/C++ 代码的 JS 库。支持 C/C++ 标准库。完全在本地编译,无需网络即可工作。原理: +首先把 Clang 和 LLD 编译为 WebAssembly 使其运行在浏览器中。然后使用 WebAssembly 版本 Clang 把 C/C++ 代码编译为 WebAssembly,最后通过浏览器 API 运行 WebAssembly。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-14-00-43.png" +width="690" +height="292" +loading="lazy" +class="gallery-image" +data-flex-grow="236" +data-flex-basis="567px" +> +<a class="link" href="https://github.com/luoxuhai/clang.js" target="_blank" rel="noopener" +>附:clangjs源码</a></p> +</li> +<li> +<p><a class="link" href="https://github.com/bartobri/no-more-secrets" target="_blank" rel="noopener" +>nms</a>,一个控制台程序,可以将任意命令的输出(ANSI TXT)文本转换成为乱码以达到防偷窥和加密的效果。通过命令管道使用:<code>ls -l | nms</code> ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-14-00-57.png" +width="690" +height="236" +loading="lazy" +class="gallery-image" +data-flex-grow="292" +data-flex-basis="701px" +></p> +</li> +<li> +<p><a class="link" href="https://iconbuddy.app" target="_blank" rel="noopener" +>Icon Buddy</a>,这个网站有超过 1 百万个免费 svg 图标,可在线自定义颜色。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-14-01-15.png" +width="690" +height="420" +loading="lazy" +class="gallery-image" +data-flex-grow="164" +data-flex-basis="394px" +></p> +</li> +</ul> +<h2 id="观点">观点</h2> +<ul> +<li>无法眼神交流不是导致远程办公沟通的最大障碍,语音延迟才是: +<ul> +<li>我之前一直以为远程办公给沟通带来最大的最大障碍是无法眼神交流导致的信息失真,想象着可以通过升级摄像头(比如嵌入在屏幕中)来改善这一情况。</li> +<li>但进行无数次网络会议之后,我体会到了最大的障碍还不是无法眼神交流,而是网络通信带来的(几乎是必然的)严重的语音延迟。</li> +<li>人们对声音延迟的感知和容忍限度大约在10毫秒(现在的电脑声卡在使用 ASIO 驱动之后可以轻松做到本地延迟 8到6毫秒左右,所以可以用于实时录音),大于10毫秒的延迟会带来明显的迟钝感,时间再长一些就会对对话的节奏带来严重影响。(如果体会不到的话,可以回忆一下新闻直播间主持人跟现场记者连线时那种说话总是对不上节奏的尴尬。)</li> +<li>什么时候网络视频会议的延时能缩短到10毫秒以内(唱卡拉OK可以接受的最低延迟),远程办公才能迎来质的飞跃,否则网络视频会议对于工作讨论永远都是隔靴搔痒、效率低下。现在的解决方案普遍还在吹能做到一秒(1000毫秒)以内,任重而道远。 ​​​</li> +</ul> +</li> +<li>现在真正的程序员用什么编辑器 ? +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-14-01-47.png" +width="690" +height="645" +loading="lazy" +class="gallery-image" +data-flex-grow="106" +data-flex-basis="256px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 042 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/Tue, 25 Jul 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/<h1 id="机器文摘-第-042-期">机器文摘 第 042 期</h1> +<h2 id="长文">长文</h2> +<h3 id="从-cpu-到操作系统">从 CPU 到操作系统</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-57-14.png" +width="665" +height="261" +loading="lazy" +class="gallery-image" +data-flex-grow="254" +data-flex-basis="611px" +> +整天使用电脑和手机却对它的工作原理一知半解?<a class="link" href="https://cpu.land" target="_blank" rel="noopener" +>把你搁 CPU 里</a>是一套不错的科普文章,作者保证你无论是否了解 CPU 的运作方式,读完之后都会有所收获。我原本以为主要讲解 CPU 组成原理,在浏览了一遍之后,发现 CPU 只是引子,后面还讲了很多操作系统相关的知识,很值得一看。 ​​​</p> +<h3 id="基于-gpu-渲染的-ui-界面制作">基于 GPU 渲染的 UI 界面制作</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-57-33.png" +width="690" +height="412" +loading="lazy" +class="gallery-image" +data-flex-grow="167" +data-flex-basis="401px" +> +<a class="link" href="https://hasen.substack.com/p/gpu-gui-table-of-contents" target="_blank" rel="noopener" +>基于 GPU 渲染的 UI 界面制作</a>,也是一个系列文章,探讨了使用 GPU 渲染用户界面的一些思路和相关技术实现方法。用 GPU 绘制用户界面不是什么新鲜事,事实上现在大部分游戏的 UI 都是基于 GPU 渲染的,不过这个作者讲的比较深入浅出,对基础介绍的比较多,适合我这种业外人士,读起来通俗易懂。</p> +<h3 id="为什么我们更应该使用-display-port-而不是-hdmi-">为什么我们更应该使用 Display port 而不是 HDMI ?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-58-12.png" +width="790" +height="479" +loading="lazy" +class="gallery-image" +data-flex-grow="164" +data-flex-basis="395px" +> +<a class="link" href="https://hackaday.com/2023/07/11/displayport-a-better-video-interface/" target="_blank" rel="noopener" +>为什么我们更应该使用 Display port 而不是 HDMI?</a>,简单来说,HDMI 是家电行业制定的接口标准,封闭而保守,Display port 是 PC 行业制定的标准,开放又激进。现在的显卡上一般提供一个 HDMI 接口,仅仅是为了兼容而做出的妥协,不提供多个是因为 HDMI 授权收费。</p> +<h3 id="txt-纯文本才是王道">txt 纯文本才是王道</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-58-45.png" +width="690" +height="220" +loading="lazy" +class="gallery-image" +data-flex-grow="313" +data-flex-basis="752px" +> +喜欢老式合成器的操作方式,不用图形和触摸屏,而是用文本和字符进行交互,可以快速选择音色参数,指哪儿打哪儿,心中有数。</p> +<p>喜欢在控制台的黑窗口通过命令行跟计算机交互,而不是用鼠标在图形界面上点击,不用将鼻子凑在屏幕上,闭上眼睛也能做到精确操作。</p> +<p>喜欢单反相机的肩屏,无论我用什么姿势拨动拨杆、拨轮,肩屏总能用字符给我最快速最准确的响应,告诉我现在的曝光三参数是多少,做到心中有数。</p> +<p>喜欢用 Markdown 文本格式记录信息,只因为文本格式最干净纯粹,利于保存和传播。</p> +<p>这篇<a class="link" href="https://graydon2.dreamwidth.org/193447.html" target="_blank" rel="noopener" +>《txt纯文本才是王道》</a>的作者表达了跟我同样的喜好,对于使用纯文本保存信息偏爱有加,认为无论是视频、图片还是其他数字形式,在文字面前都是弱小的弟弟。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/FlagAlpha/Llama2-Chinese" target="_blank" rel="noopener" +>Llama2-Chinese</a>,Llama2中文社区!是一个专注于Llama2模型在中文方面的优化和上层建设的高级技术社区。 <em>基于大规模中文数据,从预训练开始对Llama2模型进行中文能力的持续迭代升级</em>。Facebook近期开源的 Llama 2 模型比较火,号称可以免费商用。我试了一下,效果不如预期,跟 ChatGPT 3.5 比起来还有距离。可能我使用的中文微调 Lora 参数还不够好吧。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-59-02.png" +width="690" +height="182" +loading="lazy" +class="gallery-image" +data-flex-grow="379" +data-flex-basis="909px" +></li> +<li><a class="link" href="https://githubunwrapped.com" target="_blank" rel="noopener" +>githubunwrapped</a>是一个帮你统计 Github 信息的网站,可以将输入的 Github 账号相关的统计信息生成一段漂亮的动画,展示你使用最多的编程语言、哪天提交的最积极、哪个时段工作效率高(根据文件修改时间?)等。比较有趣的是,这个网站生成动画视频的技术来自一个叫做 <a class="link" href="https://remotion.dev" target="_blank" rel="noopener" +>remotion</a>的库,它可以使用 React 组件式风格编写动画效果,并通过 Canvas 实现视频文件的渲染。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-59-18.png" +width="690" +height="455" +loading="lazy" +class="gallery-image" +data-flex-grow="151" +data-flex-basis="363px" +></li> +<li><a class="link" href="https://github.com/jesseduffield/lazydocker" target="_blank" rel="noopener" +>lazydocker</a>,继发现 lazygit 和 lazyvim 两个神器之后,我又发现了 lazy 家族新成员:lazydocker!同样是提供终端命令行下的“gui”界面,不过操作对象是 docker 这下管理容器终于可以不再看错乱的 docker 命令输出了。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-59-28.png" +width="690" +height="397" +loading="lazy" +class="gallery-image" +data-flex-grow="173" +data-flex-basis="417px" +></li> +</ul> +<h2 id="观点">观点</h2> +<ul> +<li> +<p>关于产品需求的来源:</p> +<p>对于提供IT相关服务的从业人员来说,无论是在企业还是个人做独立产品,把握好产品的需求、做好产品定义是最关键的事情,是后续做研发、运营的基础。</p> +<p>而好的产品定义=自己想做+自己能做+用户想用+愿意付费。</p> +<p>这样的定义应该怎样去发现?</p> +<p>拿软件举例,大部分软件能给用户提供的最大价值是“将一些事情自动化”和“将一些物理实体虚拟化”。前者能够通过自动化实现工作效率的指数级提升,后者则通过对物理现实虚拟化实现用户对交互体验的指数级提升。</p> +<p>所以在分析产品需求进行产品定义时可以从身边三个方面入手:</p> +<ol> +<li>还有什么事情可以被计算机自动化?</li> +<li>还有哪些物理实体可以被虚拟化?</li> +<li>市场上的现有产品,还有哪些可以从上面两个维度提升以增强体验的?</li> +</ol> +<p>我发现,无论是企业的产品,还是个人的独立产品,都可以从这些维度进行分析。</p> +</li> +<li> +<p>基于互联网通道的“业余无线电”:</p> +<p>不是很理解热衷于用互联网通道进行业余无线电通联的心态。</p> +<p>今天刚知道现在有一些业余无线电爱好者使用一种叫做 mmdvm 的盒子(热点盒子)进行自主搭建数字中继。</p> +<p>原理是“热点盒子”用家里的wifi接入互联网,然后热点盒子给业余无线电台提供UV频段的发射接收中继,这样就能轻易通联全国甚至全球的爱好者。</p> +<p>目前很多拥有支持数字通信的电台的爱好者都很积极地参与这种通联,甚至每周还有打卡点名活动。</p> +<p>我暂时还不是很理解这种心态。这种依赖互联网进行的通联在我看来(也许是暂时的)早已失去了玩无线电的初衷。如果我想要通过互联网假装进行呼叫,还得依靠家里的无线路由器,那我为什么不干脆使用微信电话?</p> +</li> +<li> +<p>无头系统: +今天才知道原来我给自己配的远程开发环境有个专业术语叫做 <a class="link" href="https://zh.wikipedia.org/zh-cn/%e6%97%a0%e5%a4%b4%e8%ae%a1%e7%ae%97%e6%9c%ba" target="_blank" rel="noopener" +>“Headless 无头系统”</a> 啊。我现在基本上可以做到带着笔记本随意移动,开发环境都在远程,在各处体验环境都一样。主要使用: Win10 + WSL2 + Nvidia-Docker + VS Code + Neovim。有时会启用远程桌面 RDP,有时直接 ssh + tmux。有兴趣的话我挑一期详解。</p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 041 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/Wed, 19 Jul 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/<h1 id="机器文摘-第-041-期">机器文摘 第 041 期</h1> +<h2 id="长文">长文</h2> +<h3 id="c-也能一次编译到处运行了">C 也能一次编译到处运行了?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-28-30.png" +width="743" +height="446" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="399px" +> +用 C 编写的程序,只编译一次,生成的可执行文件能同时在多个平台运行吗?</p> +<p>这在以往是 java 这类依赖虚拟机执行环境的语言宣称的事情。</p> +<p>然而我今天才听说还有这个神奇的库(好久没关注过c++领域的技术了):<a class="link" href="https://github.com/jart/cosmopolitan" target="_blank" rel="noopener" +>Cosmopolitan</a>Libc 号称可以使 C 成为一种构建一次就能到处运行的语言,就像Java一样,除了它不需要解释器或虚拟机。相反,它重新配置了GCC和Clang,以输出POSIX批准的多语言格式,该格式在Linux + Mac + Windows + FreeBSD + OpenBSD + NetBSD + BIOS上本地运行,具有最佳的性能和最小的占用空间。</p> +<p>在使用的时候需要引入特殊的库和编译配置,具体执行效果我还没有测试。</p> +<p>然后,<a class="link" href="https://ahgamut.github.io/2023/07/13/patching-gcc-cosmo/" target="_blank" rel="noopener" +>这篇文章</a>的作者干脆来个更方便的操作,他给 GCC 打了大约 2000 行的补丁,使得 GCC 直接就嵌入了 Cosmopolitan 库,现在可以在不修改任何源代码(前提是得用纯 C 写)的情况下构建出到处都能运行可执行文件了(Windows也可以吗?我要测试)。</p> +<h3 id="业余无线电入坑指南">业余无线电入坑指南</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-29-07.png" +width="690" +height="920" +loading="lazy" +class="gallery-image" +data-flex-grow="75" +data-flex-basis="180px" +> +业余无线电跟摄影、HiFi音响这一类的爱好在某种维度上非常相似,在“入坑”的境界上,甚至完全一样。</p> +<p>这里的坑,指需要投入大量精力和资金。</p> +<p>之所以这么说,是因为它们都有一个共同的特点。</p> +<p>即围绕这些爱好有大量的知识可以学习和探索。</p> +<p>比如拿业余无线电来说,上来就一堆“亚音”、“中继”、“频段”、“频差”、“杂散发射”等名词,对标摄影中的“构图”、“光圈”、“快门”、“ISO感光度”等名词。新手若想有所体会,单是这些概念就够琢磨几天的。更不用提后续还有逐渐步入玄学的一些操作流派,乃至一个不留神还会陷入无穷尽的装备升级竞赛。</p> +<p>这类知识对于好奇心强烈、喜欢求知的人来说有着巨大的吸引力。甚至直白的说,我们很可能不是爱好这项技能,而是单纯喜欢探索和求知的过程,喜欢那种获得感。</p> +<p>这篇<a class="link" href="https://zhuanlan.zhihu.com/p/585518350" target="_blank" rel="noopener" +>《业余无线电新手指南》</a>可以普及一些基本知识,愿意入坑的请阅读。</p> +<p><em>我近期已考取了中国无线电协会的业余无线电操作能力 A 证</em> 算是合法的 <a class="link" href="https://baike.baidu.com/item/%E6%97%A0%E7%BA%BF%E7%94%B5%E7%88%B1%E5%A5%BD%E8%80%85/6509242" target="_blank" rel="noopener" +>HAM 火腿</a>了。</p> +<h3 id="远程办公还能成为趋势吗">远程办公还能成为趋势吗?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-29-47.png" +width="799" +height="414" +loading="lazy" +class="gallery-image" +data-flex-grow="192" +data-flex-basis="463px" +> +疫情的时候,远程办公、异地协同等概念一度变得很火爆,当时很多人觉得这又是一个风口。</p> +<p>但随着当时极端环境的消失,各大公司又纷纷将员工从居家办公中召回。</p> +<p>那么?此类与远程协作相关的概念破灭了吗?</p> +<p>各种协同工具、平台相关的市场,还有没有继续扩大的可能,或者说还在等待一个巨大的技术革新来引爆?</p> +<p>这里有个项目,<a class="link" href="https://github.com/LinuxSuRen/remote-jobs-in-china" target="_blank" rel="noopener" +>积极收集远程办公相关的信息</a>,包括国内支持的公司清单、工具及使用资料等。</p> +<h3 id="怎样做出伟大的成就">怎样做出伟大的成就?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-30-40.png" +width="636" +height="422" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="361px" +> +昨日读了保罗格雷厄姆(《黑客与画家》的作者)新文章一篇&mdash;-<a class="link" href="http://paulgraham.com/greatwork.html" target="_blank" rel="noopener" +>《怎样做出伟大的成就》</a>(实际上我觉得可以译为“怎样牛逼”)。</p> +<p>虽然标题看起来略有鸡汤味儿,但读起来还是比较实惠的。</p> +<p>文章从发现和选择要做的事情开始,谈论了一些具体的方法。然后展开讨论了在方法执行过程中可能会遇到的一些问题,以及如何克服。甚至介绍了一些心理暗示技巧。</p> +<p>文章比较长,我个人体会比较深的点如下:</p> +<ol> +<li>一个人做什么才能牛逼?答:做自己天赋里有的东西,就是找一些你既有能力又非常感兴趣的事情。</li> +<li>要养成“自驱”的习惯。让“工作”来源于自己的认知,而不是别人告诉你、让你做的事情。主动,而不是等待。</li> +<li>拥有一个属于自己的“项目”是一个找到“自驱”的最佳方法。不断观察自己对什么有强烈的好奇心(甚至好奇到大多数人不能理解)可以找到这样的“项目”。</li> +<li>选定要做的“项目”还应遵循兴奋原则,即:做自己愿意用的产品,写自己想读的故事,而不是执着于满足想象中的不存在的复杂需求。</li> +<li>注重积累效应,日拱一卒、长期积累,每天写一篇文字,一年下来就是一本书。</li> +<li>周期性审视自己做的事情,确认它是否偏离了目标(在做自己最想做的事情),及时修正。</li> +<li>行动的重要性,很多人实际上可以更牛逼,但是因为“谦虚”和“恐惧”导致的拖延使得计划一再搁浅,浪费了时间。</li> +</ol> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="http://t.cn/A60wPLwI" target="_blank" rel="noopener" +>jabbr.ai</a>是一个针对拳击比赛的打击判定进行训练的AI模型,可以在智能手机上运行,实时监测视频中拳击选手的打击得分情况,即时进行统计,多个智能手机多视角同时运行可以快速生成总结性视频。模型提供约50种监测参数(质量、步法、压力等)可用于运动员训练分析。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-31-11.png" +width="908" +height="509" +loading="lazy" +class="gallery-image" +data-flex-grow="178" +data-flex-basis="428px" +></li> +<li>浏览器地址栏快捷操作,我今天才知道原来浏览器地址栏还有这些快捷操作(火狐浏览器支持的最多,我测试的Edge浏览器也支持部分操作): +<ol> +<li>输入*星号,可以搜索你的收藏夹;</li> +<li>输入^,可以搜索历史浏览记录;</li> +<li>输入%,可以搜索当前打开的tab页;</li> +<li>输入?,可以显示所有搜索建议; ​​​</li> +</ol> +</li> +<li><a class="link" href="https://video.weibo.com/show?fid=1034:4923133602234429" target="_blank" rel="noopener" +>树莓磁带</a> 一种用树莓派做的小硬件,为了支持在老式电脑中加载程序(之前用磁带存储的那种)。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-31-40.png" +width="607" +height="378" +loading="lazy" +class="gallery-image" +data-flex-grow="160" +data-flex-basis="385px" +></li> +<li>两招教你“永久”关闭 Windows 自动更新(任选一个都可以): +<ol> +<li>通过执行代码的方式:<code>reg add “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings” /v FlightSettingsMaxPauseDays /t reg_dword /d 10000 /f</code> Win+R 打开「运行」对话框,输入 <code>cmd</code> 后按下 <code>Ctrl+Shift+Enter</code>,在弹出来的命令行窗口中输入上面的代码,并敲击回车。命令里的 10000 代表停止更新的天数。</li> +<li>手动把电脑时钟日期改成 2050 年(为了防止时间自动校准,可以暂时断开网络),然后在 Windows 更新设置界面里面点击“延迟更新”,完成设置后再把电脑时间调回来就行了。</li> +</ol> +</li> +<li><a class="link" href="https://pkg-size.dev/" target="_blank" rel="noopener" +>pkg-size</a>,一个在线监测 npm 包大小的网站,可以实时查看一个 npm 包的真实依赖,网站利用了 web容器技术,直接在浏览器里执行 npm install 操作。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-32-07.png" +width="1011" +height="636" +loading="lazy" +class="gallery-image" +data-flex-grow="158" +data-flex-basis="381px" +></li> +<li><a class="link" href="https://marketplace.visualstudio.com/items?itemName=degreat.3e" target="_blank" rel="noopener" +>3e</a>,一个 VS Code 插件,可以让你在编辑器里直接浏览 3d 模型,基于 webgl 实现。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-32-58.png" +width="704" +height="468" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="361px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 039 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/Tue, 11 Jul 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/<h1 id="机器文摘-第-039-期">机器文摘 第 039 期</h1> +<h2 id="长文">长文</h2> +<ul> +<li> +<p><a class="link" href="https://www.cs.columbia.edu/~hgs/etc/writing-bugs.html" target="_blank" rel="noopener" +>关于写作的通用问题</a>,“元技能”一般指比普通技能更高阶的技能,我理解为可产生技能的技能,此类技能并不会随着外部环境的高速发展而被淘汰。比如写作就算是一种元技能,当不知道该训练和提升什么技能的时候,将时间花在“元技能”的提升上准没有错。这篇文章主要讲解英文写作的常见问题,但是有些我觉得对于中文也适用。比如文章开头提到的两个基本原则:“在写之前就弄清楚自己想表达什么”、“即便是你已经写完了一整篇,如果没能表达你的意思那也是废纸”。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-13-52-23.png" +width="294" +height="171" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="412px" +></p> +</li> +<li> +<p><a class="link" href="https://jmmv.dev/2023/06/fast-machines-slow-machines.html" target="_blank" rel="noopener" +>新电脑快还是老电脑快?</a>,上周有博主在twitter发布了一个视频吐槽了一个我也困惑很久的事情。作者展示了他在一台古董电脑上运行Windows NT 3.5 的情况,视频中的电脑基本可以做到秒开程序,然后又展示了一台配备了Windows 11的Surface平板电脑,操作起来界面响应有明显延迟。后者cpu频率为前者的4倍,内存容量为前者的6倍。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-13-55-53.png" +width="507" +height="228" +loading="lazy" +class="gallery-image" +data-flex-grow="222" +data-flex-basis="533px" +></p> +</li> +</ul> +<p>现在的硬件性能动辄就比之前的老硬件几十甚至上百倍的提升,但是我们的交互体验呢?能够秒开的程序甚至还不如二十年前的老爷机。 +后来这事儿在twitter引发了一些争议,有人认为现在的软件确实吃掉了硬件提升的性能,对体验来说提升不足。也有人说现在的体验与以往不可同日而语,这样的对比不公平也没有意义。</p> +<p>博主不得不专门写了一篇文章来回应,详细记录了作者认为更加合理的对比过程。</p> +<p>我个人认为首要原因就是随着硬件性能的提升,软件开发者的精力已经逐渐从性能向开发效率倾斜了。由于现在硬件成本确实低廉,软件迭代周期变得越来越短,软件开发者也越来越没有动力做出极致挖掘硬件性能的软件。</p> +<p>不信你看,现在越来越多的应用程序不再使用原生开发,而是采用了可以“跨平台”的web技术。</p> +<p>这样使得软件界面的响应直接下降了一个数量级。(我在使用vscode的时候甚至还会遇到打字卡顿慢慢弹出字符的情况。)</p> +<p>另外,复杂的设计模式和软件架构,也吃掉了不少硬件性能,因为每增加一层抽象,都会消耗资源,而现在各种复杂的架构就是拼命地增加抽象层。</p> +<p>希望以后市场能够鼓励开发者多做挖掘硬件性能的事情吧。</p> +<ul> +<li><a class="link" href="https://faultlore.com/blah/text-hates-you/" target="_blank" rel="noopener" +>文字渲染比你想象的要复杂</a>,这篇文章的作者曾负责火狐浏览器的文字渲染引擎,他写这篇文字的目的是科普一下关于文字渲染的一些基本技术和困难。在阅读之前,我也简单的以为,文字渲染就是把对应的字符字形从字体库中取出来然后绘制到相应的位置即可,但实际情况确实比这要复杂得多。比如,文中提到的关于“连字符”的处理、“抗锯齿”、“书写方向”等问题,每一个都是开发者的头发杀手。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-12-47.png" +width="574" +height="307" +loading="lazy" +class="gallery-image" +data-flex-grow="186" +data-flex-basis="448px" +></li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/rrweb-io/rrweb" target="_blank" rel="noopener" +>rrweb</a>,可在网页上记录用户行为并导出视频文件。可用于:排查用户错误、保险业务签署、内部风控、用户交互分析等。rrweb采用虚拟化转换DOM、记录变更和操作过程,并通过链表回放数据。存储最小化、回放可快进且跳过无效行为。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-13-31.png" +width="529" +height="378" +loading="lazy" +class="gallery-image" +data-flex-grow="139" +data-flex-basis="335px" +></li> +<li><a class="link" href="https://github.com/zhaoyun0071/DragGAN-Windows-GUI" target="_blank" rel="noopener" +>DragGAN-Windows-GUI</a>,DragGAN(上周介绍过的开源模型,可以针对图片进行交互式拖动修改)的懒人包,解压直接用,内置17个模型。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-13-53.png" +width="690" +height="421" +loading="lazy" +class="gallery-image" +data-flex-grow="163" +data-flex-basis="393px" +></li> +<li><a class="link" href="https://neal.fun/deep-sea/" target="_blank" rel="noopener" +>deep-sea</a>,这个网页可以让你查看海洋各个深度都是有哪些生物,果然是越往下越看不清,所以大家就随便长长了,不讲究好看不好看了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-14-11.png" +width="690" +height="501" +loading="lazy" +class="gallery-image" +data-flex-grow="137" +data-flex-basis="330px" +></li> +<li><a class="link" href="http://elementsofprogramming.com/" target="_blank" rel="noopener" +>电子书《Elements of Programming》</a>,这本老书在出版十年后推出了免费pdf版。中文译作《编程原本》,旨在介绍通用的程序设计原理和技巧,重点关注程序设计的基本元素和抽象概念。这本书的核心思想是将程序设计看作是一种构建和操作抽象概念的过程。它强调程序设计应该建立在数学原理和精确性基础上,通过抽象和泛化来创建可重用、可扩展和可维护的软件。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-14-52.png" +width="377" +height="542" +loading="lazy" +class="gallery-image" +data-flex-grow="69" +data-flex-basis="166px" +></li> +<li><a class="link" href="https://github.com/loft-sh/devpod" target="_blank" rel="noopener" +>devpod</a>,Github 的 Codespaces 和微软的 VSCode DevContainers 给开发者提供了即开即用的云端开发环境。现在,他们的开源平替来了,devpod 是一个开源的开发环境容器,可以方便地在任意客户端(Mac、Win、Linux)或云端主机创建体验一致的开发环境,并且可以与VSCode和Jetbrains等IDE直接集成。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-15-25.png" +width="690" +height="266" +loading="lazy" +class="gallery-image" +data-flex-grow="259" +data-flex-basis="622px" +></li> +<li><a class="link" href="https://uploads-ssl.webflow.com/5ac6b7f2924c656f2b13a88c/6435aabdc0a041194b243eef_Current%20Best%20Practices%20for%20Training%20LLMs%20from%20Scratch%20-%20Final.pdf" target="_blank" rel="noopener" +>从零开始训练大语言模型的最佳实践</a>,训练大语言模型的技术白皮书,从基本概念和技术讲起,教你训练大语言模型。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-15-45.png" +width="656" +height="849" +loading="lazy" +class="gallery-image" +data-flex-grow="77" +data-flex-basis="185px" +></li> +<li><a class="link" href="https://github.com/yardenshafir/WinDbg_Scripts/blob/master/windbg_the_fun_way.pdf" target="_blank" rel="noopener" +>windbg</a>,一本电子书,讲了很多 windbg 调试器的高级用法,市面上很少见。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-16-44.png" +width="620" +height="319" +loading="lazy" +class="gallery-image" +data-flex-grow="194" +data-flex-basis="466px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 040 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/Tue, 11 Jul 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/<h1 id="机器文摘-第-040-期">机器文摘 第 040 期</h1> +<h2 id="长文">长文</h2> +<h3 id="前端代码检查插件eslint和美化插件prettier的冲突">前端代码检查插件<code>ESLint</code>和美化插件<code>Prettier</code>的冲突</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-02-40.png" +width="1900" +height="1008" +loading="lazy" +class="gallery-image" +data-flex-grow="188" +data-flex-basis="452px" +> +在使用VSCode等现代化编辑器进行前端开发的时候,很多工程样板都默认开启了代码检查和自动格式化的功能,其中以 ESLint 插件和 Prettier 插件为主。</p> +<p>之前有一阵子我总是困惑这两个插件的区别,甚至如果配置不好的话,还会有冲突。</p> +<p>比如 Prettier 插件会在你保存源码的时候按照既定规则进行“美化”代码,如去除行尾分号、增加表达式中的空格等等。此时如果ESLint插件的规则配置不同的话,编辑器就会报错并提示要进行“修复”,然而就在你“修复”之后,刚<code>Ctrl+S</code>保存之后,又傻眼了,因为 Prettier 又对代码进行了“美化”。</p> +<p>我周末特意花时间研究了一下,梳理了一下这两个插件的关系以及他们的分工。</p> +<p>首先,他们的职责定位不同:ESLint 用于检查代码编写是否符合某种预定义的规范,可以进行十分详尽的配置和多项检查,比如定义的变量如果未使用可以作为一种警告或者错误,其职责定位以检查为主。而 Prettier 的职责侧重于格式化(美化)代码,对于编写代码的样式如 tab 缩进量、行尾要不要分号、字符串用单引号还是双引号等可以进行统一格式化,一般用于在代码保存的时候进行快速统一样式。</p> +<p>所以两者可以配合使用,但开头提到的规则冲突需要注意。</p> +<p>我个人的习惯是,将两个插件的配置文件里的配置项进行匹配(规则调整为一致),因为我在美化时关注的项并不太多,所以编写这两个配置文件不算费劲。</p> +<p>而网上有人提出了更好的办法,即通过扩展插件的方式,使得 ESLint 自动获取 Prettier 的规则,以自动统一两者的行为。</p> +<p><a class="link" href="https://rileycai.com/%e4%b8%8d%e4%bb%a5%e8%a7%84%e7%9f%a9%ef%bc%8c%e4%b8%8d%e8%83%bd%e6%88%90%e6%96%b9%e5%9c%86-%e5%bd%bb%e5%ba%95%e6%90%9e%e6%87%82-eslint-%e5%92%8c-prettier/" target="_blank" rel="noopener" +>关于 ESLint 和 Prettier 的具体分析文章和操作建议可以看这一篇文章:</a></p> +<h3 id="说一说我现在的知识管理工具和流程">说一说我现在的知识管理工具和流程</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-03-27.png" +width="302" +height="517" +loading="lazy" +class="gallery-image" +data-flex-grow="58" +data-flex-basis="140px" +> +Hacknews 上有网友说<a class="link" href="https://news.ycombinator.com/item?id=36609641" target="_blank" rel="noopener" +>Evernote几乎辞退了它的所有员工</a>,才想起来我已经有好几年没用过 Evernote 了。之前大概有将近十年的时间都在使用Evernote(但都是免费用户)。主要使用场景是记录个人的工作日志和借助浏览器插件剪藏一些值得收藏的文章。</p> +<p>后来随着 Evernote 的限制越来越多,体验逐渐下降。我就迁移到了使用纯文本作为知识记录载体的路线上了。</p> +<p>期间使用过 Emacs 的 org 模式,也尝试过 vim 的 wiki 插件,最后选择了现在这个 VSCode + GitHub 的方案,已稳定使用了两年时间。</p> +<p>具体流程如下: +1、使用 VSCode + <a class="link" href="https://foambubble.github.io/foam/" target="_blank" rel="noopener" +>foam</a> 、<a class="link" href="https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one" target="_blank" rel="noopener" +>MarkdownAllinOne</a> 等插件实现对 Markdown 的高效编辑,可以实时预览排版效果,foam实现了类似 <a class="link" href="https://obsidian.md/" target="_blank" rel="noopener" +>Obsidian</a> 的文章双向链接和知识关系图谱。我主要使用 Markdown 记录日志和编写知识卡片用于存放个人吸收的信息。 +2、所有内容存放在一个 git 仓库中,同步到 GitHub 上的个人私有仓库,这样可以省去对接网盘的麻烦。 +3、对于互联网上阅读到的有用文章,使用浏览器插件 <a class="link" href="https://microsoftedge.microsoft.com/addons/detail/web-clipper/opejamnnohhbjflpbhnmdlknhjkfhfdp" target="_blank" rel="noopener" +>Web Clipper</a>,可以完整的抓取页面内容到指定的后端存储,这个插件我最喜欢的点是它可以将文章抓取到你指定的GitHub仓库,并作为Issue提交。 +4、来不及看的信息就先抓取到 Issue ,然后等有时间进行整理,形成自己的知识卡片后再关闭该 Issue 。</p> +<p>这套工具及流程的优点: +1、完全免费,不产生任何费用,而且体验不亚于收费软件。 +2、自由度高,存储后端可以自己随意选择,如果嫌 GitHub 麻烦的话,可以自己用网盘同步文件夹。 +3、纯文本载体,这个算是优点吧,格式开放,不会存在别的编辑器打不开的情况。 +4、数据私有,数据随时都在本地(云端的仅作为备份和同步中转),不用担心 SaaS 供应商跑路(你看现在的Evernote)。</p> +<p>欢迎大家讨论。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/TransparentLC/WechatMomentScreenshot" target="_blank" rel="noopener" +>朋友圈截图生成工具</a>,可以帮你生成逼真的朋友圈截图,可定制头像、评论、点赞个数等细节。收藏<a class="link" href="https://akarin.dev/WechatMomentScreenshot/" target="_blank" rel="noopener" +>这个地址</a>,以后再也不怕被群里晒孩子的家长或者搞活动的商家逼着发朋友圈集赞了。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-04-12.png" +width="690" +height="1227" +loading="lazy" +class="gallery-image" +data-flex-grow="56" +data-flex-basis="134px" +></li> +<li><a class="link" href="https://86box.net/" target="_blank" rel="noopener" +>86box</a>,老式 x86 架构计算机模拟器,与 Virtualbox 等虚拟化技术不同的是,86box采用纯软件模拟的方式,实现了经典老式 cpu (如 AMD Am486DX4)的各种技术细节,甚至是当时的硬件缺陷(有些老游戏的 hack 需要这些缺陷)。可以完美复现一台上世纪 90 年代的经典 DOS PC ,用来复古怀旧游戏是再合适不过了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-04-26.png" +width="553" +height="371" +loading="lazy" +class="gallery-image" +data-flex-grow="149" +data-flex-basis="357px" +></li> +<li><a class="link" href="https://github.com/ztxz16/fastllm" target="_blank" rel="noopener" +>fastllm</a>,fastllm是纯c++实现,无第三方依赖的高性能大模型推理库(待测试验证)。据宣称:6~7B级模型在安卓端上也可以流畅运行,支持python调用,chatglm-6B级模型单卡可达10000+token / s,支持glm, llmam, moss基座,手机端流畅运行。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-05-17.png" +width="875" +height="356" +loading="lazy" +class="gallery-image" +data-flex-grow="245" +data-flex-basis="589px" +></li> +<li><a class="link" href="https://photoai.com" target="_blank" rel="noopener" +>PhotoAI</a>,作者说,他为这个网站大概写了14000行PHP代码,样式全写在了<code>&lt;style&gt;</code>标签里,JS全写在<code>&lt;script&gt;</code>标签里,除了<code>jQuery</code>没用任何框架,就连布局也是使用<code>float:left</code>这种老式的浮动实现。然而这个网站确能给他带来每月差不多 <em>6万刀</em> 的收入。这是不是在吹牛。这个网站的业务是:使用AI生成完全没有任何版权问题的各种人像照片。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-05-41.png" +width="690" +height="617" +loading="lazy" +class="gallery-image" +data-flex-grow="111" +data-flex-basis="268px" +></li> +<li><a class="link" href="https://makepad.nl/makepad/examples/ironfish/src/index.html" target="_blank" rel="noopener" +>Ironfish synth</a>,用rust写的在线合成器,虽然感觉像个 Demo 但完成度很高,音源部分具有两个振荡器(可选正弦波、方波、锯齿波等)和一个噪波通道,滤波器、效果器齐全,另外还有一个可视化音序器。可基于键盘直接演奏。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-05-59.png" +width="690" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="204" +data-flex-basis="491px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 038 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/Tue, 27 Jun 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/<h1 id="机器文摘-第-038-期">机器文摘 第 038 期</h1> +<h2 id="研究">研究</h2> +<ul> +<li><a class="link" href="https://www.polygon.com/23690187/discord-ai-chatbot-clyde-grandma-exploit-chatgpt" target="_blank" rel="noopener" +>ChatGPT的“奶奶漏洞”</a>,奶奶漏洞来源自一个用户说他已经过世的奶奶是凝固汽油弹工厂的工程师,用户让 ChatGPT 用他奶奶说睡前故事的形式,详细介绍了凝固汽油弹的制作方法。以此来绕过 ChatGPT 的安全审查,结果当然是,他得逞了。后来还有网友做了试验,以同样的方式可以套取 Windows 各个版本的序列号。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-53-23.png" +width="720" +height="489" +loading="lazy" +class="gallery-image" +data-flex-grow="147" +data-flex-basis="353px" +></li> +<li>国外也有“垃圾佬”,这篇<a class="link" href="https://l4rz.net/running-nvidia-sxm-gpus-in-consumer-pcs/" target="_blank" rel="noopener" +>《怎样低成本搭建深度学习电脑》</a>的文章,介绍了作者怎样通过在二手网站上“捡垃圾”搭建出了性能良好且便宜的GPU工作站。 值得一提的是,作者购买的主要渠道竟然来自国内的著名二手物品交易平台,某鱼。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-54-05.png" +width="690" +height="459" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="360px" +></li> +</ul> +<h2 id="长文">长文</h2> +<ul> +<li> +<p>回顾这些年软件研发的历程,凡是能够做成的软件,无一例外都是抓住了真正存在的需求。这样的需求未必很宏大或者华丽,但一定不是想象种的伪需求。仔细分析之后就会发现,在一个软件产品的生命周期里,开发者所面临的真正(或者说正确的)需求很少,因为找到它们十分不易,它们周边布满了被人们主观意识强加上的伪需求。<a class="link" href="https://cerebralab.com/Imaginary_Problems_Are_the_Root_of_Bad_Software" target="_blank" rel="noopener" +>《伪需求是糟糕软件的根源》</a>,文章探讨了软件开发中存在的一个问题,即虚构的问题(我将之译为:伪需求)如何导致糟糕的软件结果。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-56-35.png" +width="353" +height="179" +loading="lazy" +class="gallery-image" +data-flex-grow="197" +data-flex-basis="473px" +></p> +</li> +<li> +<p>有没有考虑过一个问题,即:为什么随着科技的发展和生产力的提升,人们不是越来越清闲,反而越来越劳累了?这里有篇文章探讨了一些深层次的原因,<a class="link" href="https://theanarchistlibrary.org/library/david-graeber-bullshit-jobs" target="_blank" rel="noopener" +>《狗屁工作》</a>,此文写于 2013 年,作者是 David Graeber (一名人类学教授)。文章讨论了现代社会中存在的一种现象,即许多人在工作中感到他们所从事的工作毫无意义,没有真正的价值和目的。这些工作被称为&quot;狗屁工作&quot;,作者试图探究狗屁工作的存在原因和对个体和社会的影响。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-56-57.png" +width="602" +height="854" +loading="lazy" +class="gallery-image" +data-flex-grow="70" +data-flex-basis="169px" +></p> +</li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/laishulu/Sarasa-Term-SC-Nerd" target="_blank" rel="noopener" +>Sarasa Term SC Nerd</a>,写中文Markdown文件的时候,最怕遇到表格,因为编辑器按照一个中文字符的宽度等于两个英文字符的宽度进行计算,而很多字体在设计时未考虑严格按照这种2:1的宽度比例设计字形,导致在Markdown在编辑状态时的表格分割线错位,看起来十分头疼。经过多方对比,我终于找到了让自己满意的等宽字体,支持中英文字符2:1宽度比例,中文为黑体,英文字符也特别适合写代码。此外还整合了Nerd fonts,支持在终端显示各种漂亮图标。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-58-24.png" +width="690" +height="187" +loading="lazy" +class="gallery-image" +data-flex-grow="368" +data-flex-basis="885px" +></li> +<li><a class="link" href="https://reviewgpt.net" target="_blank" rel="noopener" +>ReviewGPT</a> 写作文、写报告、写邮件,生活中充满了各种写作任务。ReviewGPT 基于 gpt 模型,可为你的文章进行打分、评价,提出修改意见,甚至还可以扮演莎士比亚、金庸等知名作家,帮助你重新撰写,快速提升文章质量。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-58-38.png" +width="690" +height="394" +loading="lazy" +class="gallery-image" +data-flex-grow="175" +data-flex-basis="420px" +></li> +<li><a class="link" href="https://github.com/binpash/try" target="_blank" rel="noopener" +>try</a>,刚发布的一个命令行工具,目标是允许你执行命令的时候先检查其执行的后果,然后再决定是否让命令真正生效。真正起到了安全保护的效果。官方介绍这个命令是基于 Linux 的命名空间(通过 unshare )和 overlayfs 联合文件系统等技术实现。并特别提醒并非基于沙盒,所以还是谨慎执行危险操作吧。比如<code>try rm rf /*</code>。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-59-26.png" +width="831" +height="467" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="427px" +></li> +<li><a class="link" href="https://github.com/XingangPan/DragGAN" target="_blank" rel="noopener" +>DragGAN</a>, 通过拖动就可以完全操纵图像的 AI 模型,现已开放源码! DragGAN 是由谷歌、麻省理工学院和马克斯普朗克研究所创建的一种新的人工智能模型。可以让你轻松通过点击拖动等简单的交互操作就能改变拍摄对象的姿势、形状和表情。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-16-00-25.png" +width="598" +height="399" +loading="lazy" +class="gallery-image" +data-flex-grow="149" +data-flex-basis="359px" +></li> +<li><a class="link" href="https://flameshot.org/" target="_blank" rel="noopener" +>flameshot</a>,一个超强的免费截图软件,可以像任何一个截图工具一样截图,最重要的是还有一些附加功能,按一下数字图标,就可以在屏幕上按数字顺序自动生成步骤图示,非常适合生成操作步骤说明。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-16-01-00.png" +width="580" +height="374" +loading="lazy" +class="gallery-image" +data-flex-grow="155" +data-flex-basis="372px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 037 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/Tue, 20 Jun 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/<h1 id="机器文摘-第-037-期">机器文摘 第 037 期</h1> +<h2 id="研究">研究</h2> +<ul> +<li><a class="link" href="https://snap-research.github.io/SnapFusion/" target="_blank" rel="noopener" +>SnapFusion</a> 文本到图像的扩散模型可以从自然语言描述中创建令人惊叹的图像。然而,这些模型很大,需要高端 GPU 在服务端运行模型。SnapFusion提出了一种通用方法,可以在移动设备上运行的文本到图像扩散模型,且出图时间不到2秒。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-55-06.png" +width="609" +height="899" +loading="lazy" +class="gallery-image" +data-flex-grow="67" +data-flex-basis="162px" +></li> +<li><a class="link" href="https://framer.com/ai" target="_blank" rel="noopener" +>Framer</a> 发布了 AI 工具,直接根据文字需求生成页面,我试了一下,对于个人博客、产品介绍页面等静态展示类型的页面,生成的效果还是十分理想的,而且同步提供桌面端和移动端页面。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-55-33.png" +width="599" +height="710" +loading="lazy" +class="gallery-image" +data-flex-grow="84" +data-flex-basis="202px" +></li> +<li><a class="link" href="https://notes.dt.in.th/HDRQRCode" target="_blank" rel="noopener" +>比<code>#ffffff</code>还“白”的“超级白”</a>,这里有网友介绍了一个方法,可以显示更高对比度的二维码(以方便用户扫描识别),据说白的程度超出了sRGB颜色范围,前提是你的显示设备支持HDR。作者的思路是用一段HDR视频在网页中伪装成显示二维码的图片。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-56-11.png" +width="690" +height="305" +loading="lazy" +class="gallery-image" +data-flex-grow="226" +data-flex-basis="542px" +></li> +<li><a class="link" href="https://rwmj.wordpress.com/2023/06/14/i-booted-linux-292612-times/" target="_blank" rel="noopener" +>我在21小时内重启系统29万次</a>,Linux 6.4内核有一个bug可能导致启动时挂起,但概率很低。为了复现bug,Richard WM Jones重启了29万次电脑,最终找到了问题。这让我想起了之前修改不容易复现Bug的艰辛。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-56-28.png" +width="690" +height="735" +loading="lazy" +class="gallery-image" +data-flex-grow="93" +data-flex-basis="225px" +></li> +<li>我发现一个用chatGPT翻译整段文字的小技巧,那就是在他翻译完成之后,再将这段话发给他,让他根据通顺程度和合理性进行二次润色,出来的结果就好很多了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-58-53.png" +width="717" +height="648" +loading="lazy" +class="gallery-image" +data-flex-grow="110" +data-flex-basis="265px" +></li> +<li>Python写代码很爽,但是想打包发布成果的时候就稍微麻烦一些了,毕竟一大堆环境依赖和包依赖。我之前一直用的是PyInstaller作为打包工具,但是现在我又发现了这个<a class="link" href="https://github.com/Nuitka/Nuitka" target="_blank" rel="noopener" +>Nuitka</a>。它的打包原理是:直接把 Python 代码转成 C 代码再编译,这样打包出来的成果占用小、执行效率也高,尤其适合PyQt编写的桌面程序。另外,著名的 Blender 就是用 Nuitka 编译的。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-59-12.png" +width="428" +height="272" +loading="lazy" +class="gallery-image" +data-flex-grow="157" +data-flex-basis="377px" +></li> +</ul> +<h2 id="长文">长文</h2> +<ul> +<li><a class="link" href="https://www.raptitude.com/2022/01/everything-must-be-paid-for-twice/" target="_blank" rel="noopener" +>你买的每样东西都需要支付两次成本</a>,这篇在Hacker News上的文章引起我的强烈共鸣。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-59-33.png" +width="600" +height="400" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="360px" +></li> +</ul> +<p>它提出了一个有趣的观点,我以前从未意识到:</p> +<p>每样东西都需要支付两次成本。</p> +<p>通常,我们只关注第一次支付的成本,也就是购买时花的钱,比如买一台相机、一架钢琴或一本小说。</p> +<p>然而,作者指出,如果你不支付第二次的成本,你之前花的钱就等于打水漂了。</p> +<p>第二次成本指的是,你需要花时间和精力去充分使用你所购买的物品。</p> +<p>比如认真阅读一本书,练习钢琴以提高演奏水平等等。</p> +<p>然而,我们常常只停留在第一次购买时的满足感上,然后追求下一个。</p> +<p>随着时间的推移,大量未支付第二次成本的物品使我们积累了一种无形的债务。</p> +<p>为此经常感到挫败。</p> +<p>这种挫败感促使我们寻求那些能够刺激我们的短期享受,比如玩手机、享用美食。</p> +<p>进一步导致没有时间支付第二次成本。</p> +<p>那么,有什么办法可以改变这种情况吗?</p> +<p>作者说,唯一的解决办法就是控制购买欲望,强迫自己安排时间来履行第二次支付的责任。</p> +<p>尽管这听起来可能有些不舒服,但如果我们能克服这种不舒服的临界点,例如学会一首乐曲,耐心读完一本书,我们将会获得意想不到的奖励时刻。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://www.ratatype.com" target="_blank" rel="noopener" +>ratatype</a>,在线键盘盲打指法练习,有完整的练习教程,从初级到高级都有。有点儿像Dos时代的著名打字练习软件TT,不过是网页版的。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-16-00-11.png" +width="690" +height="360" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="460px" +></li> +<li><a class="link" href="https://play0ad.com/download" target="_blank" rel="noopener" +>0A.D.</a>,帝国时代是个经典游戏,这里有个开源版,名字叫做0AD,由Wildfire Games开发,虽然是免费开源的游戏,但是效果和可玩性都非常高,适合在周末的午后来一把怀旧局。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-16-00-26.png" +width="690" +height="405" +loading="lazy" +class="gallery-image" +data-flex-grow="170" +data-flex-basis="408px" +></li> +<li><a class="link" href="https://landing.love" target="_blank" rel="noopener" +>landing.love</a>,一个专门收集各种网页动画效果的网站,目前已收录超过400个具有新颖创意动效的网站,并配有截图和录屏视频。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-16-00-47.png" +width="590" +height="486" +loading="lazy" +class="gallery-image" +data-flex-grow="121" +data-flex-basis="291px" +></li> +<li><a class="link" href="https://github.com/princeton-vl/infinigen" target="_blank" rel="noopener" +>infinigen</a>,一款面向计算机视觉研究的3D场景自动生成器,提供多样且高质量的3D训练数据。基于Blender,免费且开源。可以通过重写随机化的默认参数来完全控制资产生成。提供了对自然界中多种对象和场景的生成器,包括植物、动物、地形以及火、云、雨、雪等自然现象。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-16-01-41.png" +width="951" +height="522" +loading="lazy" +class="gallery-image" +data-flex-grow="182" +data-flex-basis="437px" +></li> +<li><a class="link" href="https://yjdoc2.github.io/8086-emulator-web/compile" target="_blank" rel="noopener" +>8086-emulator-web</a> ,用js编写的的8086 cpu模拟器,支持汇编语言在线编写、编译和调试运行,是一个学习汇编语言和理解计算机原理的好工具。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-16-01-04.png" +width="690" +height="320" +loading="lazy" +class="gallery-image" +data-flex-grow="215" +data-flex-basis="517px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 036 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/Wed, 14 Jun 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/<h1 id="机器文摘-第-036-期">机器文摘 第 036 期</h1> +<h2 id="研究">研究</h2> +<ul> +<li><a class="link" href="https://video.weibo.com/show?fid=1034:4911535232057363" target="_blank" rel="noopener" +>软驱阵列演奏音乐</a>,国外大神用512个软驱、16个硬盘、4个扫描仪,组装成阵列,通过编程的方式控制电机震动发出声音,组成各声部。这么多软驱,让我想到了退休老干部合唱团。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-49-03.png" +width="1555" +height="926" +loading="lazy" +class="gallery-image" +data-flex-grow="167" +data-flex-basis="403px" +></li> +<li><a class="link" href="https://video.weibo.com/show?fid=1034:4564677670141974" target="_blank" rel="noopener" +>大脑能像身体那样锻炼吗?</a>,如何训练大脑?提高记忆力、注意力和智力!这个视频进行了讲解,总之就是,用进废退,改变日常默认行动,让大脑动起来。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-49-59.png" +width="743" +height="450" +loading="lazy" +class="gallery-image" +data-flex-grow="165" +data-flex-basis="396px" +></li> +<li><a class="link" href="https://gaultier.github.io/blog/x11_x64.html" target="_blank" rel="noopener" +>用纯汇编写一个GUI</a>,跟随这篇教学文章,通过编写图形界面的方式来学习汇编语言吧。顺便,作者想挑战一下,最小的GUI程序其可执行二进制文件能有多小。(现在的可执行文件动不动就好几十上百MB)​。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-50-39.png" +width="1046" +height="463" +loading="lazy" +class="gallery-image" +data-flex-grow="225" +data-flex-basis="542px" +></li> +<li><a class="link" href="https://blog.betacat.io/post/2023/06/summarize-hacker-news-by-chatgpt" target="_blank" rel="noopener" +>让 ChatGPT 帮我们总结 Hacker News</a>,让AI每天帮我总结新闻摘要,这个想法我已经考虑很久了,现在已经有人做了实现。这篇文章介绍了一个开源静态网站的实现,它利用 ChatGPT 的总结能力,直接将每条Hackernews的新闻用一两句话总结出来,然后发布到GithubPages 可以节约我们每天看新闻的时间。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-51-29.png" +width="891" +height="413" +loading="lazy" +class="gallery-image" +data-flex-grow="215" +data-flex-basis="517px" +></li> +<li><a class="link" href="https://www.web3brand.io/p/maximize-unregretted-user-time" target="_blank" rel="noopener" +>马斯克专访:推特的混乱过去了,现在的目标是最大化用户无悔时间!</a>,我不喜欢看八卦,但是科技的除外。马斯克收购 Twitter 几个月过去了,大家还在等着看笑话,但是为什么没等到,以及开掉一半人之后效率却提升那么多? +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-52-02.png" +width="680" +height="417" +loading="lazy" +class="gallery-image" +data-flex-grow="163" +data-flex-basis="391px" +></li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/AI4Finance-Foundation/FinGPT" target="_blank" rel="noopener" +>FinGPT</a>,一个面向金融领域的开源语言模型,采用以数据为中心的方法,为研究人员和实践者提供易于使用的资源,致力于做金融领域的chatGPT。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-52-48.png" +width="822" +height="462" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="427px" +></li> +<li><a class="link" href="https://github.com/facebookresearch/audiocraft" target="_blank" rel="noopener" +>Audiocraft</a>,facebook发布的一个PyTorch库,用于音频生成的深度学习研究。目前,它提供了用于从文本生成音乐的MusicGen代码和模型。模型使用2万小时正版授权音乐训练。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-53-34.png" +width="816" +height="350" +loading="lazy" +class="gallery-image" +data-flex-grow="233" +data-flex-basis="559px" +></li> +<li><a class="link" href="https://github.com/mljar/mercury" target="_blank" rel="noopener" +>Mercury</a>,在 Jupyter Notebook 中构建 Web 应用程序,允许您在Python笔记本中添加交互式小部件,然后将笔记本发布为带交互界面的Web应用程序。我的感受是,Mercury就是 notebook版的<a class="link" href="https://github.com/gradio-app/gradio" target="_blank" rel="noopener" +>gradio</a> ​​​。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-53-58.png" +width="805" +height="421" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="458px" +></li> +<li><a class="link" href="https://github.com/reactive-python/reactpy" target="_blank" rel="noopener" +>ReactPy</a>,React是最流行的用于构建UI的前端框架,现在所有Python开发人员都可以使用它。比起gradio,这个reactpy的抽象层级更低一些,自由度更高了,我猜测目标用户应该是不喜欢写前端代码但是又希望掌控页面细节的python程序员。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-56-24.png" +width="632" +height="148" +loading="lazy" +class="gallery-image" +data-flex-grow="427" +data-flex-basis="1024px" +></li> +<li><a class="link" href="http://ggml.ai/" target="_blank" rel="noopener" +>GGML</a>,一个用于机器学习的张量库,采用纯C++实现,无其他依赖项。旨在在普通硬件上实现大型模型和高性能。它同时也是 llama.cpp 和 whisper.cpp 的底层库。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-57-18.png" +width="629" +height="327" +loading="lazy" +class="gallery-image" +data-flex-grow="192" +data-flex-basis="461px" +></li> +<li><a class="link" href="https://github.com/Genymobile/scrcpy" target="_blank" rel="noopener" +>Scrcpy</a>,一个让人相见恨晚的app,可以通过USB或TCP/IP连接镜像Android设备的视频和音频,并允许使用计算机的键盘和鼠标来控制设备。它不需要任何root权限,并且兼容Linux、Windows和macOS操作系统。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-17-02-19.png" +width="408" +height="589" +loading="lazy" +class="gallery-image" +data-flex-grow="69" +data-flex-basis="166px" +></li> +<li><a class="link" href="https://maketafi.com/ai" target="_blank" rel="noopener" +>Tafi</a>,通过自然语言生成3D模型,质量号称接近AAA级游戏,可以导出创建的角色到Blender、Unreal 或 Unity中。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-17-02-52.png" +width="1080" +height="608" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></li> +<li><a class="link" href="https://github.com/Hufe921/canvas-editor" target="_blank" rel="noopener" +>canvas-editor</a>,一个基于 canvas/svg 实现的富文本编辑器,在市面上,使用 Canvas 实现整个编辑器的开源项目并不常见,大多数情况下仍然使用 DOM 来实现。使用 Canvas 的最显著特点是其出色的性能,但实现起来的成本也更高。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-17-15-39.png" +width="1200" +height="668" +loading="lazy" +class="gallery-image" +data-flex-grow="179" +data-flex-basis="431px" +></li> +<li><a class="link" href="https://markmap.js.org%e2%80%8b%e2%80%8b" target="_blank" rel="noopener" +>markmap.js</a>,一个用markdown文本制作思维导图的工具,提供了vscode的插件可直接在编辑器预览。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-17-16-02.png" +width="611" +height="458" +loading="lazy" +class="gallery-image" +data-flex-grow="133" +data-flex-basis="320px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 035 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/Wed, 07 Jun 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/<h1 id="机器文摘-第-035-期">机器文摘 第 035 期</h1> +<h2 id="研究">研究</h2> +<ul> +<li><a class="link" href="https://www.reproof.app/blog/notes-apps-help-us-forget" target="_blank" rel="noopener" +>笔记帮我们记住还是忘记?</a>这篇文章讨论了笔记对帮助我们遗忘的作用。作者认为,随着时间的推移,我们无法记住所有的事情,但是只要我们记录了重要的信息,就可以在需要时再次查找,因此笔记实际上帮助我们遗忘。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-09-37.png" +width="1173" +height="488" +loading="lazy" +class="gallery-image" +data-flex-grow="240" +data-flex-basis="576px" +></li> +<li><a class="link" href="https://research.nvidia.com/labs/dir/neuralangelo/" target="_blank" rel="noopener" +>高保真神经表面重建</a>,Nvidia 新发布的这个 Neuralangelo 有些猛,随便给一个视频就能进行精细3D建模,也许要不多久激光点云技术就要淘汰了。值得关注 ! +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-12-49.png" +width="936" +height="465" +loading="lazy" +class="gallery-image" +data-flex-grow="201" +data-flex-basis="483px" +></li> +<li><a class="link" href="https://github.com/Neo-Desktop/WindowsXPKg" target="_blank" rel="noopener" +>Windows XP 激活算法被破解</a>, XPKeygen是一个可以随意生成XP有效安装密钥的程序,当前的电脑可能用不到了。不过可能还有一些老旧的设备,只能通过 Windows XP 来操作,这时候这个东西就派上用场了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-17-33.png" +width="610" +height="285" +loading="lazy" +class="gallery-image" +data-flex-grow="214" +data-flex-basis="513px" +></li> +<li><a class="link" href="https://www.v2ex.com/t/944717" target="_blank" rel="noopener" +>一个整活儿的开源编辑器</a>,data:text/html;base64,PGh0bWwgY29udGVudGVkaXRhYmxlPmVkaXQgbWU8L2h0bWw+ 把这个代码粘到浏览器地址栏,竟然是个记事本app,如果从IDE拷贝代码过去,竟然还支持代码高亮。。。。加入到收藏夹即可食用。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-20-19.png" +width="663" +height="347" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="458px" +></li> +<li><a class="link" href="https://mymodernmet.com/sea-turtle-birch-aquarium-3d-printed-brace" target="_blank" rel="noopener" +>3D打印拯救海龟</a> ,2017年,伯奇水族馆与加州大学圣地亚哥分校图书馆的数字媒体实验室合作。他们一起创造了一种首创的3D打印支架,以固定她的外壳上的缝隙。现在,六年后,这种生物及其照顾者继续从这项发明中获益。这只海龟最近接受了年度检查,健康状况良好。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-21-40.png" +width="613" +height="372" +loading="lazy" +class="gallery-image" +data-flex-grow="164" +data-flex-basis="395px" +></li> +<li><a class="link" href="https://kuenzi.dev/toothbrush/" target="_blank" rel="noopener" +>破解“智能”牙刷</a> 国外一个博主记录了他破解自己的电动牙刷的过程。由于牙刷的NFC芯片采用的加密方式是密码加密,并且在通讯过程中是用了明文传递,所以他采取了截获通讯信号的方式窃听到了密码,然后就解锁了各种姿势开始为所欲为了。。。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-22-42.png" +width="606" +height="363" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="400px" +></li> +<li><a class="link" href="https://bjoernkarmann.dk/project/paragraphica" target="_blank" rel="noopener" +>真·AI相机</a> ,paragraphica 是一个没有镜头但是却有物理实体的“AI相机”,使用位置、时间等参数数据生成特定地点和时刻的prompt,然后由人工智能来生成“照片”。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-24-07.png" +width="578" +height="513" +loading="lazy" +class="gallery-image" +data-flex-grow="112" +data-flex-basis="270px" +></li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://www.dora.run/ai" target="_blank" rel="noopener" +>Droa</a>,一个通过自然语言进行网站开发的工具,你只需要提需求,剩下的交给AI。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-26-05.png" +width="821" +height="496" +loading="lazy" +class="gallery-image" +data-flex-grow="165" +data-flex-basis="397px" +></li> +<li><a class="link" href="https://github.com/SupaGruen/StableDiffusion-CheatSheet" target="_blank" rel="noopener" +>StableDiffusion-CheatSheet</a>,经常用 Stable Diffusion 进行 AI 绘图的,可以看下这个开源速查表。里面拥有超过 700 种经过测试的艺术风格,可快速搜索查找各类艺术家,并支持一键复制 Prompt。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-26-50.png" +width="742" +height="521" +loading="lazy" +class="gallery-image" +data-flex-grow="142" +data-flex-basis="341px" +></li> +<li><a class="link" href="https://www.math.cmu.edu/~jmackey/151_128/bws_book.pdf" target="_blank" rel="noopener" +>你一直想知道的关于数学的一切</a>,此书是CMU数学科学系的博士生布兰登·W·沙利文撰写的,旨在引导读者进入抽象数学和证明写作的世界,帮助培养读者的数学思维和表达能力。主题涵盖集合、逻辑、归纳法、关系、函数、基数和组合数学等基础和工具。暂未有中文翻译。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-27-26.png" +width="724" +height="579" +loading="lazy" +class="gallery-image" +data-flex-grow="125" +data-flex-basis="300px" +></li> +<li><a class="link" href="https://github.com/eastlakeside/interpy-zh" target="_blank" rel="noopener" +>Python进阶</a>,是《Intermediate Python》的中文译本。2021最新目录版,实时更新托管在<a class="link" href="https://py.eastlakeside.cn" target="_blank" rel="noopener" +>GithubPages</a>。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-28-23.png" +width="1037" +height="350" +loading="lazy" +class="gallery-image" +data-flex-grow="296" +data-flex-basis="711px" +></li> +<li><a class="link" href="https://csspro.com/" target="_blank" rel="noopener" +>CSSPro</a>,一个所见即所得的在线CSS可视化开发工具,直接在页面运行,那里修改点哪里。效果真的很惊艳。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-29-07.png" +width="921" +height="537" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="411px" +></li> +<li><a class="link" href="https://github.com/makeplane/plane" target="_blank" rel="noopener" +>Plane</a>,开源版 JIRA !不少软件开发者都使用JIRA进行缺陷管理,JIRA确实很强大,也很好用。现在,开源版的来了,据说完全可以作为JIRA的平替。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-30-19.png" +width="1139" +height="595" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="459px" +></li> +<li><a class="link" href="https://openmlsys.github.io/index.html" target="_blank" rel="noopener" +>机器学习系统:设计和实现</a>,一本关于机器学习的电子书,本书希望做成世界上第一本全面讲述机器学习系统知识的开源书籍。可以看作一门衔接机器学习和计算机系统的课程 ​​。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-31-04.png" +width="234" +height="390" +loading="lazy" +class="gallery-image" +data-flex-grow="60" +data-flex-basis="144px" +></li> +<li><a class="link" href="https://callannie.ai/" target="_blank" rel="noopener" +>Callanie</a>,练习英语口语的AI对话机器人,支持国内手机号注册,免费且流畅。后端基于大语言模型,可以陪你聊各种话题。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-31-49.png" +width="303" +height="570" +loading="lazy" +class="gallery-image" +data-flex-grow="53" +data-flex-basis="127px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 034 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/Wed, 31 May 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/<h1 id="机器文摘-第-034-期">机器文摘 第 034 期</h1> +<h2 id="研究">研究</h2> +<ul> +<li><a class="link" href="https://samwho.dev/memory-allocation/" target="_blank" rel="noopener" +>图解内存分配</a>,文章展示了 C/C++ 编程中的内存分配过程,包括静态和动态内存分配技术、它们的优势,以及有效的内存管理所需考虑的事项。以图解的形式展示了内存分配过程,希望读者可以通过本文更好地理解内存分配相关的概念,并在实际编程中对内存进行更加高效的管理。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-49-39.png" +width="759" +height="298" +loading="lazy" +class="gallery-image" +data-flex-grow="254" +data-flex-basis="611px" +></li> +<li><a class="link" href="https://blog.koehntopp.info/2023/05/17/50-years-in-filesystems-towards-2004-lfs.html" target="_blank" rel="noopener" +>文件系统五十年</a>,这是一个系列文章,详细记录了计算机文件系统的发展历程。也许我们身在其中无法感受到它的进步,但是回顾历史我们会发现,即便是我们不容易注意到的部分,也在不停地发展和优化。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-50-33.png" +width="672" +height="413" +loading="lazy" +class="gallery-image" +data-flex-grow="162" +data-flex-basis="390px" +></li> +<li><a class="link" href="https://xorvoid.com/sectorc.html" target="_blank" rel="noopener" +>只有512字节的C编译器</a>,这篇文章介绍了一个怎样实现最小编译器的思路,SectorC (github) 是一个用 x86-16 汇编编写的 C 编译器,适合 x512 机器的 86 字节引导扇区。它支持 C 的子集,足够大,可以编写真实有趣的程序。它很可能是有史以来最小的C编译器。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-51-20.png" +width="764" +height="366" +loading="lazy" +class="gallery-image" +data-flex-grow="208" +data-flex-basis="500px" +></li> +<li><a class="link" href="https://www.amygoodchild.com/blog/computer-art-50s-and-60s" target="_blank" rel="noopener" +>上世纪50~60年代的计算机艺术</a>,数字艺术的发展简史。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-51-53.png" +width="781" +height="494" +loading="lazy" +class="gallery-image" +data-flex-grow="158" +data-flex-basis="379px" +></li> +<li><a class="link" href="" >win10的隐藏功能</a>,原来win10还有这个功能。按Ctrl + Alt + Del 后,按住Ctrl不松,再点击右下角的电源符号,就会进入紧急重启(Emergency Restart)界面。应该是一种强制重启。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-52-04.png" +width="690" +height="518" +loading="lazy" +class="gallery-image" +data-flex-grow="133" +data-flex-basis="319px" +></li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/SevaSk/ecoute" target="_blank" rel="noopener" +>Ecoute</a>,可用于远程面试作弊的工具?Ecoute 是一种实时转录工具,可在文本框中为用户的麦克风输入(您)和用户的扬声器输出(扬声器)提供实时翻译。它还使用 OpenAI 的 GPT-3.5 生成建议答复内容,供用户“参考”。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-52-39.png" +width="820" +height="386" +loading="lazy" +class="gallery-image" +data-flex-grow="212" +data-flex-basis="509px" +></li> +<li><a class="link" href="https://app.rask.ai/" target="_blank" rel="noopener" +>rask.ai</a>,自动将视频转成“译制片”,在对内容进行翻译的同时,会尽量保持之前的音色和语调,端到端给你的视频完成多语配音,后续还会推出唇形同步合成。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-53-28.png" +width="1171" +height="644" +loading="lazy" +class="gallery-image" +data-flex-grow="181" +data-flex-basis="436px" +></li> +<li><a class="link" href="https://chrome.google.com/webstore/detail/tango-how-to-guides-and-s/lggdbpblkekjjbobadliahffoaobaknh" target="_blank" rel="noopener" +>Tango</a>,一个Chrome浏览器插件,能帮你生成一个网站的操作指南。它会自动记录所有的操作流程,并做相应的截图和注解文档。你只需要点一遍就行了。目前还只能生成英文版的,不过自己翻译也不麻烦。可以节省不少时间。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-53-58.png" +width="632" +height="390" +loading="lazy" +class="gallery-image" +data-flex-grow="162" +data-flex-basis="388px" +></li> +<li><a class="link" href="https://praeclarum.org/2023/05/19/webgpu-torch.html" target="_blank" rel="noopener" +>WebGPU-torch</a>,PyTroch的webgpu实现。我测试了一下,我的浏览器目前还不支持。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-54-28.png" +width="1384" +height="796" +loading="lazy" +class="gallery-image" +data-flex-grow="173" +data-flex-basis="417px" +></li> +<li><a class="link" href="http://ogden.basic-english.org/" target="_blank" rel="noopener" +>basic-english</a>,“基础英语”的概念是:25,000个单词的牛津袖珍英语词典去掉冗余,并消除组合单词,90%的概念可以用850个单词来实现。使用这些基础英语可以简化日常工作和交流。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-55-26.png" +width="778" +height="516" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="361px" +></li> +<li><a class="link" href="https://github.com/raunofreiberg/interfaces" target="_blank" rel="noopener" +>Web界面准则</a>,讲解如何提升网页界面的交互性、排版、动画、辅助功能、优化和设计。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-56-18.png" +width="834" +height="466" +loading="lazy" +class="gallery-image" +data-flex-grow="178" +data-flex-basis="429px" +></li> +<li><a class="link" href="https://github.com/excalidraw/excalidraw" target="_blank" rel="noopener" +>excalidraw</a>,开源虚拟手绘风格白板程序,支持端到端加密在线协作。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-56-43.png" +width="759" +height="504" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="361px" +></li> +</ul> +<h2 id="沉思录">沉思录</h2> +<ul> +<li>一切商业的本质都是:收购一些东西(包括原材料、人力服务),经过加工(加工过程产生价值)后变成产品或服务出售。这里的原材料可以是实体物品也可以是信息。所以关键动作就是:收、加工、出售,从重要性上来说,出售大于加工大于收。所以如果要策划自己的产品,解决和分析问题的优先级也应如此,我之前想的正好一反;</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 033 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/Wed, 24 May 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/<h1 id="机器文摘-第-033-期">机器文摘 第 033 期</h1> +<h2 id="研究">研究</h2> +<h3 id="全键盘信息终端">全键盘信息终端</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/2023-05-24-09-22-11.png" +width="1335" +height="637" +loading="lazy" +class="gallery-image" +data-flex-grow="209" +data-flex-basis="502px" +> +我一直很怀念使用黑莓手机的日子。</p> +<p>物理全键盘的手感比起现在硬邦邦的触摸屏真不知道好到哪里去了。</p> +<p>多少次盯着抽屉里的黑莓尸体,都在想有没有办法再次发挥它的余热。</p> +<p>现在机会来了,有人将树莓派和黑莓手机的全键盘(带触摸板的那一款)结合起来做了一个终端。</p> +<p>取名:<a class="link" href="https://beepberry.sqfmi.com/" target="_blank" rel="noopener" +>Beepberry</a>,具有400*200分辨率的LCD屏幕,和usb type-c接口。</p> +<h3 id="自己动手给树莓派写操作系统">自己动手给树莓派写操作系统</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/2023-05-24-09-31-09.png" +width="677" +height="359" +loading="lazy" +class="gallery-image" +data-flex-grow="188" +data-flex-basis="452px" +> +学习操作系统的最佳手段是自己动手写一个。</p> +<p>这类教程很多,一般都是针对x86平台,树莓派的比较少见。</p> +<p><a class="link" href="https://github.com/isometimes/rpi4-osdev" target="_blank" rel="noopener" +>《给树莓派编写“裸机”操作系统》</a>来自github上的一个开源项目。</p> +<p>可以带你从树莓派的硬件层基础上直接构建一个的完整操作系统。</p> +<h3 id="关于-demoscene-制作的一些文章">关于 Demoscene 制作的一些文章</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/2023-05-24-09-40-25.png" +width="471" +height="314" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="360px" +> +Demoscene(也称为Demo Party)是一种计算机艺术形式,旨在展示计算机的音频和图形表现能力。Demoscene通常是由小团队制作的演示性程序,也被称为demo,它集计算机程序、音乐、图形和动画于一身,是八十年代初期在个人计算机上发展起来的一种文化和艺术运动。Demoscene的主要目的是展示计算机和程序的美感,通常使用3D渲染和其他复杂的视觉效果,展示计算机的高级图形和音频处理能力。</p> +<p>我对于如何制作这些炫酷的 demo 一直很感兴趣,但是网上关于这方面的资料非常少,成体系的就更少了。</p> +<p>这里收录了一些比较经典的相关资料:</p> +<ol> +<li> +<p><a class="link" href="https://www.ctrl-alt-test.fr/2023/procedural-3d-mesh-generation-in-a-64kb-intro/" target="_blank" rel="noopener" +>64kb的demos</a>介绍了基于SDF(Signed Distance Field,有符号距离场)生成三维网格的方法,这个方法是大部分demo用于在三维场景中产生三维模型的主要方法。</p> +</li> +<li> +<p><a class="link" href="https://www.flipcode.com/archives/The_Art_of_Demomaking-Issue_01_Prologue.shtml" target="_blank" rel="noopener" +>The_Art_of_Demomaking</a>是一套很系统的教程,讲述Demo的概念、发展历史以及制作过程需要了解的基础知识。</p> +</li> +<li> +<p><a class="link" href="https://www.pbr-book.org/3ed-2018/contents" target="_blank" rel="noopener" +>pbr-book</a>是一本关于基于物理的渲染(Physically Based Rendering,简称PBR)的经典教材。内容包括计算机图形学相关的基础概念、渲染算法、工作流程和高级特性等。</p> +</li> +</ol> +<h3 id="怎样防止针对llm的prompt攻击">怎样防止针对LLM的prompt攻击</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/2023-05-24-09-52-09.png" +width="734" +height="401" +loading="lazy" +class="gallery-image" +data-flex-grow="183" +data-flex-basis="439px" +> +就像之前流行的sql注入攻击,针对大语言模型的提示语注入攻击现在变得也很常见。</p> +<p>一种比较典型的攻击场景是,通过一段特定的提示语,解锁chatGPT原本被封印的能力。</p> +<p>或者对于接入了其他工具接口的语言模型,通过特定的提示语让其执行危险操作(如:删除所有信息)。</p> +<p>这对于使用者来说可能危害不大,但对于服务的提供者是一个不小的挑战。</p> +<p><a class="link" href="https://simonwillison.net/2023/Apr/25/dual-llm-pattern/" target="_blank" rel="noopener" +>《用于构建可以抵抗即时注入的 AI 助手的双 LLM 模式》</a>提出了一种可能可行的解决方案。</p> +<p>即使用双模型的配置,协同工作,将具有执行危险操作的特权模型放在另一个模型后面,中间使用过滤器进行风险审查,即未被审查的内容永远不会发送到特权模型。</p> +<h2 id="资源">资源:</h2> +<ul> +<li><a class="link" href="https://gamma.app/" target="_blank" rel="noopener" +>gamma</a>,AI帮你做PPT。支持自然语言描述需要生成的内容,自动给出ppt的大纲和每页基本的排版布局; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/2023-05-24-10-00-52.png" +width="742" +height="687" +loading="lazy" +class="gallery-image" +data-flex-grow="108" +data-flex-basis="259px" +></li> +<li><a class="link" href="https://www.3blue1brown.com/" target="_blank" rel="noopener" +>3blue1brown</a>,YouTube上最好的数学科普视频,特点是使用动画直观展示计算原理; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/2023-05-24-10-01-29.png" +width="953" +height="611" +loading="lazy" +class="gallery-image" +data-flex-grow="155" +data-flex-basis="374px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 032 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/Tue, 16 May 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/<h1 id="机器文摘-第-032-期">机器文摘 第 032 期</h1> +<h2 id="长文">长文</h2> +<h3 id="ai歌手的训练与使用">AI歌手的训练与使用</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-14-33-53.png" +width="1011" +height="641" +loading="lazy" +class="gallery-image" +data-flex-grow="157" +data-flex-basis="378px" +> +最近火了很多AI歌手(即:用AI模型模仿某位歌手的声音),其中b站上AI孙燕姿演唱的《漠河舞厅》、《撒日朗》等歌曲播放已超百万。</p> +<p>为了研究实现原理,我也找到了开源工具体验了一下。</p> +<p>具体步骤主要总结如下:</p> +<ol> +<li>选定某一个歌手,找到具有代表性的几首歌曲,通过<a class="link" href="https://ultimatevocalremover.com/" target="_blank" rel="noopener" +>Ultimate Vocal Remover</a>软件利用AI做人声和伴奏的分离,主要用于获取干净的纯人声用于模型训练。(不得不说现在基于AI模型的人声、伴奏分离做的是真的强,可以做到非常干净的提取,让你感觉像是原始独立的音轨)。</li> +<li>通过安装<a class="link" href="https://github.com/voicepaw/so-vits-svc-fork" target="_blank" rel="noopener" +>so-vits-svc-fork</a>这个一体化开源工具进行模型训练,具体方法见<a class="link" href="https://github.com/voicepaw/so-vits-svc-fork/blob/main/README_zh_CN.md" target="_blank" rel="noopener" +>so-vits-svc-fork的Readme</a>,从数据预处理到最后的模型导出和推理都已经做好了,甚至还提供了图形界面。</li> +<li>继续使用so-vits-svc-fork提供的gui界面进行操作,将模型载入,将预期修改歌曲的原唱人声(提取方式同第1步)传入,运行推理获得定制的人声(注意看文档的各种参数)。</li> +<li>将第3步推理所得干净人声,跟原唱分离的干净背景音乐进行混音合成,即可获得一首新歌曲了。</li> +</ol> +<h3 id="怎样用口袋计算器玩耍">怎样用口袋计算器玩耍</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-14-49-14.png" +width="716" +height="514" +loading="lazy" +class="gallery-image" +data-flex-grow="139" +data-flex-basis="334px" +> +在移动互联网时代,人打发无聊的方式实在是太多了,视频聊天、阅读各种资讯八卦、观看短视频、手游等等。</p> +<p>功能机的时代,我有印象的打发无聊的事情是手机上的贪食蛇、发短信、wap资讯等等,也算不错了。</p> +<p>如果时间来到上世纪七十年代呢?那个时代的没有随身携带的手机,怎么打发时间?</p> +<p>答案是:如果有一个随身携带的计算器也行,这里有一本书<a class="link" href="https://archive.org/details/htewypc" target="_blank" rel="noopener" +>《How To Entertain With Your Pocket Calculator》</a>,出版于上世纪七十年代。书中花了大量的篇幅介绍了很多种基于数字的游戏,我翻看了一下,我觉得可能得无聊到一定的程度我才能愿意玩书里的游戏。</p> +<h3 id="llm的几篇介绍文章">LLM的几篇介绍文章</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-14-56-38.png" +width="703" +height="332" +loading="lazy" +class="gallery-image" +data-flex-grow="211" +data-flex-basis="508px" +> +Large Language Model (LLM) 即大规模语言模型,是一种基于深度学习的自然语言处理模型,它能够学习到自然语言的语法和语义,从而可以生成人类可读的文本。 +与其感叹以chatGPT为代表的大语言模型发展太快,不如静下心来,读一读关于LLM的一些基础知识和使用方法,我找了三篇比较有代表性的放在这里收藏。</p> +<ol> +<li><a class="link" href="https://github.com/RUCAIBox/LLMSurvey/blob/main/assets/LLM_Survey_Chinese_0418.pdf" target="_blank" rel="noopener" +>大语言模型综述</a>,认真地概括并解释了什么是LLM和它的基本原理。</li> +<li><a class="link" href="https://www.bmpi.dev/dev/deep-learning/nlp-language-models/" target="_blank" rel="noopener" +>ChatGPT背后的语言模型简史</a>,从发展历史上捋一捋各种语言模型的辈分。</li> +<li><a class="link" href="https://github.com/datawhalechina/prompt-engineering-for-developers" target="_blank" rel="noopener" +>prompt-engineering-for-developers</a>一个中文版的 Prompt Engineering 教程,翻译自:吴恩达《ChatGPT Prompt Engineering for Developers》课程,主要内容为指导开发者如何构建 Prompt 并基于 OpenAI API 构建新的、基于 LLM 的应用;</li> +<li><a class="link" href="https://github.com/ninehills/ninehills.github.io/issues/92" target="_blank" rel="noopener" +>大语言模型微调技术笔记</a>,记录了基于 LLM 进行微调训练的实战技巧。</li> +</ol> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://sinerider.com/" target="_blank" rel="noopener" +>sinerider</a>,一个很有创意的数学学习游戏,让你通过数学函数构建图像从而帮助画面中的角色到达目标地点。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-15-04-41.png" +width="810" +height="708" +loading="lazy" +class="gallery-image" +data-flex-grow="114" +data-flex-basis="274px" +></li> +<li><a class="link" href="https://anvaka.github.io/map-of-github/#0.87/0/16.7" target="_blank" rel="noopener" +>map-of-github</a>,以节点地图的方式展示Github上面超过40万个仓库,通过虚拟大陆的方式展示他们之间的关系。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-15-07-40.png" +width="1274" +height="682" +loading="lazy" +class="gallery-image" +data-flex-grow="186" +data-flex-basis="448px" +></li> +<li><a class="link" href="https://learngitbranching.js.org/?locale=zh_CN" target="_blank" rel="noopener" +>learngitbranching</a>,以交互式游戏的方式学习git命令。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-15-11-32.png" +width="569" +height="598" +loading="lazy" +class="gallery-image" +data-flex-grow="95" +data-flex-basis="228px" +></li> +<li><a class="link" href="https://vgamuseum.ru/" target="_blank" rel="noopener" +></a>,在线显卡博物馆,收藏了1982年到2012年之间发布的各款显卡,包括高清图片和规格参数的介绍; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-15-14-37.png" +width="1364" +height="571" +loading="lazy" +class="gallery-image" +data-flex-grow="238" +data-flex-basis="573px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 031 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/Wed, 10 May 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/<h1 id="机器文摘-第-031-期">机器文摘 第 031 期</h1> +<h2 id="长文">长文</h2> +<h3 id="怎样驱动上个世纪的网络摄像头">怎样驱动上个世纪的网络摄像头</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-09-20-31.png" +width="697" +height="407" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="411px" +> +国外有个老哥,在帮朋友收拾废品的时候,获得了一个老旧的摄像头。</p> +<p>于是他按耐不住想感受一下,这个来自上个世纪的“古董”,还能打吗?</p> +<p>由于年代比较久远,厂家也不再提供驱动程序的更新。</p> +<p>哥们不得不在虚拟机里全新安装一个windows xp,成功启动摄像头,并获得“清晰图像”。</p> +<p>安装xp时有个插曲:安装界面里的进度条仅用时几十秒就走完了原本几十分钟的倒计时(所以说微软的进度条是如何推断剩余时间的永远是个迷)。</p> +<p>在经过一番体验之后,又跃跃欲试准备自己给它手搓一个在现代操作系统下的驱动程序。</p> +<p>整个过程记录在<a class="link" href="https://blog.benjojo.co.uk/post/quickcam-usb-userspace-driver" target="_blank" rel="noopener" +>《一个1999年的摄像头复活的故事》</a>。</p> +<p>整个故事都充满了一种“我不知道这么做有什么意义,但是我就是可以”的极客风格(也是我收录它的主要原因)。</p> +<h3 id="webgpu-科普">webGPU 科普</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-09-36-36.png" +width="673" +height="338" +loading="lazy" +class="gallery-image" +data-flex-grow="199" +data-flex-basis="477px" +> +最近谷歌浏览器率先宣布全面支持 webGPU ,预计到今年年底各大浏览器也都会跟进并提供支持。</p> +<p>webGPU 从名字上看跟显卡和浏览器有关,可是之前已经有webgl了,这次又有什么变化?</p> +<p>通过多方面信息的搜索,我得到的结论是:webGPU 更充分地暴露了显卡的计算能力,GPU不再只是做图形渲染相关的事情,而是根据webGPU提供的相关专业接口,可以执行深度学习之类的更通用的计算工作。</p> +<p>如果想了解的更全面一些,这篇<a class="link" href="https://cohost.org/mcc/post/1406157-i-want-to-talk-about-webgpu" target="_blank" rel="noopener" +>《谈谈 webGPU》</a>文章十分值得一读。</p> +<p>作者对 webGPU 这一技术介绍的比较详尽,从各个图形接口的发展历史一直到对未来如何应用的展望,都包括了。</p> +<h3 id="如何翻译一本书">如何翻译一本书</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-09-49-38.png" +width="709" +height="354" +loading="lazy" +class="gallery-image" +data-flex-grow="200" +data-flex-basis="480px" +> +<a class="link" href="https://sspai.com/post/79534" target="_blank" rel="noopener" +>《从不自量力到 AI 助力,我如何翻译完一整本英文书》</a> +这是一个关于执行力的故事。</p> +<p>主题是:如何借助AI和现代信息工具,实现看似不可能完成的任务。</p> +<p>在这个时代,个体的力量很渺小,因为个人几乎无法独立完成任何事情。</p> +<p>但同时,借助科技工具和基础设施的力量,1 个人甚至可以完成之前需要一个上百人公司才能做到的事情,这让个体变得非常强大。</p> +<h3 id="如何刷路由器">如何刷路由器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-00-09.png" +width="600" +height="417" +loading="lazy" +class="gallery-image" +data-flex-grow="143" +data-flex-basis="345px" +> +<a class="link" href="https://www.v2ex.com/" target="_blank" rel="noopener" +>V站</a>上说,中年技术男有三大爱好:钓鱼、NAS、软路由。</p> +<p><del>我一样也没沾边儿,但还是克制不住关注相关技术。</del></p> +<p>之前多次想拿自己家的路由器开刀,刷一个openwrt系统,然后就可以各种折腾(科学上网、内网穿透等等)了。</p> +<p>但是一直没有动手,今天看到这篇<a class="link" href="https://a-wing.top/linux/2023/05/01/start-openwrt" target="_blank" rel="noopener" +>自己动手定制你的路由器</a>写的如此详细,还是心动了一下。</p> +<p>先收藏吧。</p> +<h3 id="仅用csshtml实现三维动画">仅用CSS+HTML实现三维动画</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-06-52.png" +width="632" +height="161" +loading="lazy" +class="gallery-image" +data-flex-grow="392" +data-flex-basis="942px" +> +CSS 的 <code>translate3d</code>用到的不多。</p> +<p>如果使用巧妙的话,可以帮你实现很出彩的 3D 动画效果,国外有高手在给自己的文章配数学公式的时候,利用CSS制作了一些可以动态显示的公式图表。这篇<a class="link" href="https://x.st/spinning-diagrams-with-css/" target="_blank" rel="noopener" +>CSS 3D图表</a>记录了它们的实现细节和技术原理。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://www.window-swap.com/Window" target="_blank" rel="noopener" +>window-swap</a>,随机看别人家的窗外景色。这个网站每次刷新都随机显示一个网友共享的摄像头视角,一般是自家的窗外。可以随时体验全球各地的邻家风景。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-14-06.png" +width="1371" +height="929" +loading="lazy" +class="gallery-image" +data-flex-grow="147" +data-flex-basis="354px" +></li> +<li><a class="link" href="https://www.landiannews.com/archives/98512.html" target="_blank" rel="noopener" +>foobar2000</a>,经典的音乐播放器终于更新了。2002年发布的foobar2000播放器曾经是很多发烧友的最爱,如今过了20多年,居然更新了2.0稳定版,值得收藏; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-15-52.png" +width="743" +height="504" +loading="lazy" +class="gallery-image" +data-flex-grow="147" +data-flex-basis="353px" +></li> +<li><a class="link" href="https://lost-at-sql.therobinlord.com/" target="_blank" rel="noopener" +>lost-at-sql</a>,一个在线学习 sql 的交互游戏,通过游戏闯关的方式练习 sql 技能; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-18-25.png" +width="745" +height="484" +loading="lazy" +class="gallery-image" +data-flex-grow="153" +data-flex-basis="369px" +></li> +<li><a class="link" href="https://glsl-exercises.simondev.io/lesson/1/1#welcome" target="_blank" rel="noopener" +>glsl-exercises</a>,在线学习glsl的交互课程,通过交互式页面练习 glsl 编写; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-19-48.png" +width="1858" +height="794" +loading="lazy" +class="gallery-image" +data-flex-grow="234" +data-flex-basis="561px" +></li> +<li><a class="link" href="https://www.gameuidatabase.com/" target="_blank" rel="noopener" +>gameuidatabase</a>,一个游戏界面资源网站,各种游戏的界面截图,可以用来“借鉴”?; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-20-48.png" +width="1078" +height="567" +loading="lazy" +class="gallery-image" +data-flex-grow="190" +data-flex-basis="456px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 030 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/Wed, 26 Apr 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/<h1 id="机器文摘-第-030-期">机器文摘 第 030 期</h1> +<p><em>下周五一假期,休息,不更新。</em></p> +<h2 id="长文">长文</h2> +<h3 id="内网穿透的原理及实现">内网穿透的原理及实现</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-09-42-27.png" +width="1040" +height="515" +loading="lazy" +class="gallery-image" +data-flex-grow="201" +data-flex-basis="484px" +></p> +<blockquote> +<p>设想这样一个问题:在北京和上海各有一台局域网的机器(例如一台是家里的台式机,一 台是连接到星巴克 WiFi 的笔记本),二者都是私网 IP 地址,但可以访问公网, 如何让这两台机器通信呢?</p> +</blockquote> +<p>IPv4地址即将枯竭,IPv6技术还没有普及,现在很多家庭宽带都不再分配公网IP地址。这就意味着大部分的个人电脑是无法通过互联网被直接访问的(当然,你可以通过你家wifi或者4G信号访问互联网,但是反过来不行)。</p> +<p>可是这种需求又真实存在,比如我就经常希望能够在任何地方访问我家里的电脑,通过远程桌面进行办公、文件共享等等。</p> +<p>最简单的方法是通过购买一台具有公网IP地址的云主机来实现中继,这也是目前最普遍的方式。</p> +<p>不过阅读完这篇<a class="link" href="https://arthurchiao.art/blog/how-nat-traversal-works-zh/" target="_blank" rel="noopener" +>《NAT 穿透是如何工作的:技术原理及企业级实践》</a>,假如你有很强的动手能力的话,就应该可以实现一套完全不需要公网主机进行中继的“企业级内网穿透工具”。</p> +<p>文章很长,来自<a class="link" href="https://tailscale.com/blog/how-nat-traversal-works/" target="_blank" rel="noopener" +>这篇英文博客</a>。</p> +<h3 id="技术写作指南">技术写作指南</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-09-53-51.png" +width="437" +height="205" +loading="lazy" +class="gallery-image" +data-flex-grow="213" +data-flex-basis="511px" +> +曾经在翻阅《程序员的数学》这本书的时候被朋友看到,于是诞生了短暂的讨论。</p> +<p>当时我的观点是,作为程序员一定要掌握好数学,即便现在编程过程中已经不怎么用到特别底层的知识,但也应该多训练数学思维。</p> +<p>朋友当时说了一句话让我记忆犹新。</p> +<p>“比起程序员的数学,我更担忧的是程序员的语文。”</p> +<p>确实,写作这项能力在很多技术人员心里是被低估的。</p> +<p>不少人受尽写技术文档的折磨,于是越发讨厌写作。</p> +<p>这篇<a class="link" href="https://www.yuque.com/serviceup/misc/cn-writing-for-engineers" target="_blank" rel="noopener" +>《作为工程师应该如何写作》</a>真是雪中送炭,总结了很多立即就能见效的技术写作方法,希望可以帮助到工程师朋友。</p> +<h3 id="怎样制作好玩的小游戏">怎样制作好玩的小游戏</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-09-57-29.png" +width="512" +height="512" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +> +很多人都有自己开发游戏的冲动。</p> +<p>不过很容易掉进各种复杂的引擎和工具的坑里。</p> +<p>然后感到沮丧,忘了想做游戏的初心。</p> +<p>这篇<a class="link" href="http://farawaytimes.blogspot.com/2023/02/how-to-make-good-small-games.html" target="_blank" rel="noopener" +>《怎样制作好玩的小游戏》</a>可以让你重新焕发精神。</p> +<p>作者认为开发那种不用复杂引擎的小游戏也可以很欢乐,只要有足够的游戏性。</p> +<p>他在文章中详细列举了想要制作出真正具有游戏性的小游戏所必须具备的几点关键特性。</p> +<p>看得出来,作者是懂游戏的。</p> +<h3 id="神奇的一页纸知识管理">神奇的一页纸知识管理</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-10-03-34.png" +width="1220" +height="841" +loading="lazy" +class="gallery-image" +data-flex-grow="145" +data-flex-basis="348px" +></p> +<blockquote> +<p>宇航员在太空中找到的方法一定不会错,因为他要是出错就没命了。 +航天员的秘密武器,One Pager。就是把一个专项的知识,都写和画在一页纸上。日积月累,宇航员有了一本手册,里面都是一页一页的one pager。 +我向来对知识管理的各种方法很有兴趣。</p> +</blockquote> +<p>在网上闲逛时看到这篇<a class="link" href="https://www.zhongwen.ai/fantastic-one-pager/" target="_blank" rel="noopener" +>《神奇的One Pager》</a>,讲述了一种通过一页纸进行知识管理的方法。</p> +<p>热爱学习的人可不能错过。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/chidiwilliams/buzz" target="_blank" rel="noopener" +>buzz</a>,Transcribe and translate audio offline on your personal computer. Powered by OpenAI&rsquo;s Whisper. +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-08-48-07.png" +width="827" +height="431" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="460px" +></li> +<li><a class="link" href="https://moonvy.com/apps/ops/" target="_blank" rel="noopener" +>可视化提示词拼装</a>,文生图的AI越来越多,自己也可以在本地搭建服务,可是为什么我自己生成的图片那么丑呢?这个工具也许可以帮你生成一些靠谱的提示词。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-08-50-22.png" +width="991" +height="418" +loading="lazy" +class="gallery-image" +data-flex-grow="237" +data-flex-basis="568px" +></li> +<li><a class="link" href="https://liaokong.gitbook.io/llm-kai-fa-jiao-cheng/" target="_blank" rel="noopener" +>LangChain 中文入门教程</a>,众所周知 OpenAI 的 API 无法联网的,所以如果只使用自己的功能实现联网搜索并给出回答、总结 PDF 文档、基于某个 Youtube 视频进行问答等等的功能肯定是无法实现的。所以,我们来介绍一个非常强大的第三方开源库:LangChain 。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-08-51-08.png" +width="1103" +height="493" +loading="lazy" +class="gallery-image" +data-flex-grow="223" +data-flex-basis="536px" +></li> +<li><a class="link" href="https://oimo.io/works/clock/" target="_blank" rel="noopener" +>clock</a>,一个非常酷的网页时钟显示效果。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-08-51-53.png" +width="999" +height="586" +loading="lazy" +class="gallery-image" +data-flex-grow="170" +data-flex-basis="409px" +></li> +<li><a class="link" href="https://webgpufundamentals.org/" target="_blank" rel="noopener" +>WebGPU 理论基础</a>,从基础理论开始学习WebGPU,稳! +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-08-53-56.png" +width="688" +height="743" +loading="lazy" +class="gallery-image" +data-flex-grow="92" +data-flex-basis="222px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 029 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/Wed, 19 Apr 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/<h1 id="机器文摘-第-029-期">机器文摘 第 029 期</h1> +<h2 id="长文">长文</h2> +<h3 id="计算机的中断机制是如何实现的">计算机的“中断”机制是如何实现的?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-09-37-58.png" +width="1008" +height="682" +loading="lazy" +class="gallery-image" +data-flex-grow="147" +data-flex-basis="354px" +> +稍微了解过计算机原理的朋友都知道,计算机是通过“中断”的机制实现对键盘输入、鼠标移动、硬盘读写等操作的。</p> +<p>让我给小朋友讲解这些基本的知识时,我也可以侃侃而谈,说上半个小时不带重复。</p> +<p>但是真要解释“中断”的机制是如何实现的,我想即便是现在科班出身的本科生也未必能够说明白。</p> +<p>原因我觉得除了缺少实践之外,也跟大部分书上的理论内容离实际工程较远有关。</p> +<p>这篇<a class="link" href="https://r12f.com/posts/interrupts/" target="_blank" rel="noopener" +>漫谈中断</a>从实际的硬件实例(x86)出发,详细介绍了中断的实现机制,普及了“外部中断”、“内部中断”、“软中断”等概念,以及人们怎样通过“中断控制器”逐渐解决了多设备中断处理的问题。是一篇很值得阅读的科普文章。适合对计算机组成原理、操作系统等技术有兴趣的朋友阅读。</p> +<h3 id="怎样提升软件项目的可维护性">怎样提升软件项目的可维护性?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-09-54-43.png" +width="576" +height="242" +loading="lazy" +class="gallery-image" +data-flex-grow="238" +data-flex-basis="571px" +> +不同的项目团队对于软件项目的可维护性所做出的努力不同。</p> +<p>有不少团队宁愿在修改bug上加班加点,也不愿意为可维护性多花一丁点精力。</p> +<p>不过,如果你要开始一个新的软件项目或者想要改善一个已经存在的项目的可维护性。</p> +<p>这里有一份<a class="link" href="https://hix.dev/tutorials/general/software-project-checklist" target="_blank" rel="noopener" +>软件项目可维护性检查清单</a>可以参考。</p> +<p>作者主要从版本控制、软件测试、静态分析、依赖库管理、多语言支持、多平台支持、开发环境管理等方面给出了可以改进的行动清单,以及基于开源工具的最佳实践建议。</p> +<h3 id="怎样榨干chatgpt">怎样榨干chatGPT?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-06-59.png" +width="1024" +height="1024" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +> +ChatGPT是由OpenAI训练的一款大型语言模型,能够和你进行任何领域的对话。</p> +<p>现在跟年初账号紧张的情况比起来已经方便了很多。</p> +<p>在这么多开源工具和套壳网站的帮助下,我想现在大部分人都能够比较方便的体验它了吧。</p> +<p>但是可能很多人还不知道如何更好的发挥它的作用。</p> +<p>有网友整理了一份开源的<a class="link" href="https://github.com/PlexPt/awesome-chatgpt-prompts-zh" target="_blank" rel="noopener" +>chatGPT中文调教指南</a>,内容极为详尽,可以帮你榨干chatGPT的全部潜能。</p> +<h3 id="怎样让ai作画理解你的意图">怎样让AI作画理解你的意图?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-17-26.png" +width="1536" +height="512" +loading="lazy" +class="gallery-image" +data-flex-grow="300" +data-flex-basis="720px" +> +对于现在强大的AI绘图应用,有些人可能会认为只输入一个单词就能生成一张很酷的图片。</p> +<p>然而,虽然AI模型越来越善于理解我们想要的内容,但它们还不能读懂我们的思想。</p> +<p>因此,如果你想生成一张看起来像你所想的那样的图片,你需要编写正确的提示。</p> +<p>这个<a class="link" href="https://boostpixels.com/short-guide" target="_blank" rel="noopener" +>AI绘图prompt编写指南</a>可以给你提供一些帮助。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://zh.ifixit.com/Guide" target="_blank" rel="noopener" +>维修指南</a>,各种设备的维修教程大全,详细到每一个步骤的照片,设备型号齐全; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-22-36.png" +width="977" +height="461" +loading="lazy" +class="gallery-image" +data-flex-grow="211" +data-flex-basis="508px" +></li> +<li><a class="link" href="https://shadertoy.com/view/msVXWD" target="_blank" rel="noopener" +>glsl-CNN</a>,有大神用glsl语言,仅通过webGL的片元着色器实现了一个手写识别的CNN神经网络。可以在浏览器直接体验,效果惊艳。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-31-02.png" +width="801" +height="479" +loading="lazy" +class="gallery-image" +data-flex-grow="167" +data-flex-basis="401px" +></li> +<li><a class="link" href="https://github.com/facebookresearch/dinov2" target="_blank" rel="noopener" +>dinov2</a>,Meta AI新发布的全能视觉模型,模型支持:图像分类、分割、图像检索和深度估计。比较厉害的地方在于它是一个自监督模型,直接从图像中学习特征,而不依赖文本描述,即可训练计算机视觉模型。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-31-37.png" +width="828" +height="236" +loading="lazy" +class="gallery-image" +data-flex-grow="350" +data-flex-basis="842px" +></li> +<li><a class="link" href="https://minigpt-4.github.io/" target="_blank" rel="noopener" +>minigpt-4</a>,GPT4 的图像支持迟迟不开放,这个开源的MiniGPT4 却已经做到了类似的多模态效果,官方演示看起来非常棒。只用了四张A100训练了10小时,模型甚至只有13B。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-33-47.png" +width="1289" +height="1484" +loading="lazy" +class="gallery-image" +data-flex-grow="86" +data-flex-basis="208px" +></li> +<li><a class="link" href="https://github.com/linyiLYi/street-fighter-ai" target="_blank" rel="noopener" +>street-fighter-ai</a>,有个B站UP主在GPT的帮助下, 写了个 强化训练的AI模型,终于打败了街霸里的 AI,实现了儿时的梦想。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-36-53.png" +width="1080" +height="760" +loading="lazy" +class="gallery-image" +data-flex-grow="142" +data-flex-basis="341px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 027 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/Wed, 12 Apr 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/<h1 id="机器文摘-第-027-期">机器文摘 第 027 期</h1> +<h2 id="长文">长文</h2> +<h3 id="搭建本地ai作图应用">搭建本地AI作图应用</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-13-51-53.png" +width="695" +height="392" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="425px" +> +AI对话机器人火爆的同时,去年由Stable-Diffusion模型引爆的AI作图技术也没有放慢进化的脚步。</p> +<p>这里面的佼佼者<a class="link" href="https://zh.wikipedia.org/zh-cn/Midjourney" target="_blank" rel="noopener" +>Midjourney</a>已经发展成了强大的图像生成系统。可以轻松定制出照片级图像,其效果足以乱真。</p> +<p>不过目前在国内使用Midjourney还比较麻烦,即便能够访问,使用量也会受限制,能否自己搭建一个呢?</p> +<p>答案是肯定的。</p> +<p>跟去年刚问世的时候不同,现在基于Stable-Diffusion模型的生态也已经十分完备,很多开源软件、框架、插件围绕这个模型开发。</p> +<p>利用这些软件可以快速在本地计算机上构建一套属于自己的图像生成服务。</p> +<p>这里有一篇博客以<a class="link" href="https://www.freedidi.com/8474.html" target="_blank" rel="noopener" +>手把手的方式教你如何在最快速的时间搭建自己的图像生成服务</a>。</p> +<p>里面还列举了一些微调好的定制模型下载地址,合理的使用这些模型,你会发现打开新世界的大门。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-14-02-07.png" +width="733" +height="799" +loading="lazy" +class="gallery-image" +data-flex-grow="91" +data-flex-basis="220px" +></p> +<h3 id="搭建本地chatgpt应用">搭建本地chatGPT应用</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-14-08-25.png" +width="779" +height="342" +loading="lazy" +class="gallery-image" +data-flex-grow="227" +data-flex-basis="546px" +> +本来不想再提chatGPT了,因为最近说的有些太多了。</p> +<p>但是无奈当前的开源生态对于语言模型是在是太追捧了,技术发展迅雷不及掩耳。</p> +<p>很快就出现了一批可以自己搭建的AI对话模型。</p> +<p>今天我挑两个我认为效果比较好的(且对中文支持比较好的)介绍一下。</p> +<p>注意,跟目前流行的基于OpenAI的接口进行套壳的程序不同。我说的是完全在本地搭建自己的服务。</p> +<p>第一个:<a class="link" href="https://chatglm.cn/blog" target="_blank" rel="noopener" +>ChatGLM-6B</a>,一个具有62亿参数的中英双语语言模型。通过使用与 ChatGLM(chatglm.cn)相同的技术,ChatGLM-6B 初具中文问答和对话功能,并支持在单张 2080Ti 上进行推理使用。</p> +<p>搭建过程比较简单,按照<a class="link" href="https://github.com/THUDM/ChatGLM-6B/blob/main/README.md" target="_blank" rel="noopener" +>README</a>文档中的步骤下载模型、执行脚本程序即可。</p> +<p>第二个:<a class="link" href="https://github.com/ymcui/Chinese-LLaMA-Alpaca" target="_blank" rel="noopener" +>中文 LLaMA &amp; Alpaca 大模型</a>,开源了中文LLaMA模型和经过指令精调的Alpaca大模型。这些模型在原版LLaMA的基础上扩充了中文词表并使用了中文数据进行二次预训练,进一步提升了中文基础语义理解能力。同时,在中文LLaMA的基础上,本项目使用了中文指令数据进行指令精调,显著提升了模型对指令的理解和执行能力。</p> +<p>搭建过程略微繁琐一些,需要通过自己的手段下载到开源的LLaMA原始模型(当然这对于技术人员来说不是问题)。</p> +<p>然后按照文档中的教程,执行模型合并、量化等脚本,最终通过开源程序LLaMA.cpp实现模型的本地运行。</p> +<h3 id="合作运行千亿参数级语言模型">合作运行千亿参数级语言模型</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-14-22-47.png" +width="492" +height="214" +loading="lazy" +class="gallery-image" +data-flex-grow="229" +data-flex-basis="551px" +> +按照众人划桨开大船的思路,之前在带宽不足的年代诞生了BT下载。</p> +<p>如今,当我们的本地显卡无法应付超大AI模型时,有人开始用同样的思路解决问题。</p> +<p><a class="link" href="https://petals.ml/" target="_blank" rel="noopener" +>Petals</a>就是这么一个分布式模型微调、运行的框架,可以让你轻松在家运行超过千亿参数的大模型(当然是在线跟大家一起协作)。</p> +<p>其原理是大家分别加载模型的一小部分,然后与其他人一起通过协同的方式进行推理或者微调。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-14-27-18.png" +width="1742" +height="680" +loading="lazy" +class="gallery-image" +data-flex-grow="256" +data-flex-basis="614px" +></p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://learningprompt.wiki/" target="_blank" rel="noopener" +>Prompt Engineering 教程</a>,一份教你如何更好使好地使用 ChatGPT 和其他 AI 产品的免费教程。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-14-43-13.png" +width="970" +height="466" +loading="lazy" +class="gallery-image" +data-flex-grow="208" +data-flex-basis="499px" +></li> +<li><a class="link" href="https://prompthero.com/" target="_blank" rel="noopener" +>Prompthero</a>,跟聊天机器人、绘图机器人交流的prompt大全,与上面的教程不同,这是一个模板库大全,有创作灵感但是不知道该如何描述的时候可以去参考一下。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-14-45-46.png" +width="759" +height="381" +loading="lazy" +class="gallery-image" +data-flex-grow="199" +data-flex-basis="478px" +></li> +<li><a class="link" href="https://civitai.com/" target="_blank" rel="noopener" +>Civitai</a>,与上面相同,不过专门用于图像生成,而且路子比较野,有大量的NSFW内容,要搭配Stable-Diffusion的各种微调模型使用。具体使用方法,可参考前文中介绍如何搭建本地图像生成服务的部分。</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 028 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/Wed, 12 Apr 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/<h1 id="机器文摘-第-028-期">机器文摘 第 028 期</h1> +<h2 id="长文">长文</h2> +<h3 id="极简代码理解-gpt-模型结构">极简代码理解 GPT 模型结构</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-09-37-14.png" +width="679" +height="607" +loading="lazy" +class="gallery-image" +data-flex-grow="111" +data-flex-basis="268px" +> +在<a class="link" href="https://twitter.com/karpathy/status/1645115622517542913" target="_blank" rel="noopener" +>twitter上有网友发布了一个简单的示例代码</a>,讲解了 GPT 语言模型的运行原理,为了方便大家理解,作者用了极简的模型设置,即语言文字只保留了1和0两个字符,上下文长度也仅为3,可以很直观地感受到训练过程是如何起作用的。</p> +<p>作者<a class="link" href="https://colab.research.google.com/drive/1SiF0KZJp75rUeetKOWqpsA8clmHP6jMg?usp=sharing" target="_blank" rel="noopener" +>提供了托管在colab的python源码</a>,可以在线体验。</p> +<h3 id="用开源语言模型训练自己的数字化身">用开源语言模型训练自己的数字化身</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-09-38-57.png" +width="623" +height="364" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="410px" +> +随着开源语言模型的训练和微调变得越来越简单,果然有人开始整活。</p> +<p>已经有网友<a class="link" href="https://greatdk.com/1908.html" target="_blank" rel="noopener" +>通过自己的微信聊天记录和博客文章训练出有自己风格的AI</a>。</p> +<p>作者使用目前对中文支持最好的开源模型 chatglm-6b 作为预训练模型(我上期介绍过它的部署和使用)。</p> +<p>经过一番折腾后终于训练出还算凑合的模型。</p> +<p>我们的世界离<a class="link" href="https://movie.douban.com/subject/11502153/episode/1/" target="_blank" rel="noopener" +>《黑镜》中的黑暗故事</a>越来越近了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-09-49-17.png" +width="1024" +height="576" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></p> +<h3 id="四十年工作经验程序员的职业建议">四十年工作经验程序员的职业建议</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-09-50-49.png" +width="700" +height="420" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="400px" +> +国外有位“老程序员”退休了,是真正的到了退休年龄的退休。</p> +<p>他从1981年入行,直到去年退休。这期间他做过各种开发,跳过槽也被辞退过,打过工也创过业。</p> +<p>这不容易。</p> +<p>所以,他决定<a class="link" href="https://thecodist.com/how-i-stayed-relevant-over-four-decades/" target="_blank" rel="noopener" +>以“一个退休程序员”的身份分享一些心得</a>。</p> +<p>摘抄部分要点如下:</p> +<blockquote> +<p>保持开阔的眼界:每天花时间获取真正的资讯,看到趋势,在事物流行起来之前发现他们。 +保持学习:不要拒绝和敌视新技术,要为你所用。 +要有自己的项目(做一些真正的事情):作为程序员不要浪费聪明才智和外部资源,要学着开始一个自己的项目。</p> +</blockquote> +<h3 id="进入心流的入口">进入心流的入口</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-10-08-18.png" +width="660" +height="379" +loading="lazy" +class="gallery-image" +data-flex-grow="174" +data-flex-basis="417px" +> +进入心流(Flow)状态是一种很忘我的体验,也是知识工作者高效产出的必要条件。</p> +<p>有不少创作者都体会过那种全身心的投入并且忘记了时间的感觉。</p> +<p>一旦进入那种状态,很多问题能够很快得到解决,大脑飞速运转并且不会感觉到劳累。</p> +<p>这种状态最忌讳被打断,因为一旦打断,再进入就会比较困难。</p> +<p>这里有篇文章介绍了一些小技巧,可以让你在不得已中断心流之后,能够比较快速地恢复状态。</p> +<p>作者将这些技巧比喻为高速服务区进入主路之前的加速匝道,姑且称为<a class="link" href="https://census.dev/blog/an-on-ramp-to-flow" target="_blank" rel="noopener" +>进入心流的入口</a>。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://spline.design/" target="_blank" rel="noopener" +>Spline</a>,一个免费易用的 3D 设计工具,可实时协作,提供了丰富的物料库,可以基于它来快速创建有趣的 3D 场景,支持处理细腻动画交互,此外还可以导入本地模型和声音素材,支持到处多种输出格式包括WebGL、视频、链接等,很适合新手。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-10-19-26.png" +width="986" +height="536" +loading="lazy" +class="gallery-image" +data-flex-grow="183" +data-flex-basis="441px" +></li> +<li><a class="link" href="https://codepen.io/ksenia-k/pen/poOMpzx" target="_blank" rel="noopener" +>Draw With Flowers!</a>,在threejs里用着色器语言编写的一个特效demo,可以随着鼠标移动绘制绚丽的花朵。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-10-19-52.png" +width="828" +height="466" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></li> +<li><a class="link" href="https://github.com/numbbbbb/read-react-source-code" target="_blank" rel="noopener" +>React 源码阅读</a>,一本开源电子书,通过阅读React的源码来详细理解前端框架的原理。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-10-20-26.png" +width="591" +height="369" +loading="lazy" +class="gallery-image" +data-flex-grow="160" +data-flex-basis="384px" +></li> +<li><a class="link" href="https://codeium.com/download" target="_blank" rel="noopener" +>Codeium</a>,Github copilot 的免费平替,提供vscode、vim、neovim等常见编辑器的插件,我试了一下,效果可以接受。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-10-21-52.png" +width="1024" +height="586" +loading="lazy" +class="gallery-image" +data-flex-grow="174" +data-flex-basis="419px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 026 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/Wed, 29 Mar 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/<h1 id="机器文摘-第-026-期">机器文摘 第 026 期</h1> +<h2 id="长文">长文</h2> +<h3 id="通用人工智能要来了吗">通用人工智能要来了吗</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-09-37-08.png" +width="854" +height="476" +loading="lazy" +class="gallery-image" +data-flex-grow="179" +data-flex-basis="430px" +> +AGI(通用人工智能),即用一个模型解决全部问题,而不是特定领域的问题(如语音识别、图像分类等)。</p> +<p>我在几年前读过一本叫做《人工智能,人类最后的发明》的书。</p> +<p>书里说AGI就是人类最后一个发明,因为有了它,别的一切都不需要了。</p> +<p>当时感觉距离通用的人工智能还很遥远,觉得作者有些危言耸听。</p> +<p>直到今年,chatGPT和GPT-4的发布,我才发觉AI的势头确实有些猛得出乎意料。</p> +<p><a class="link" href="https://orangeblog.notion.site/GPT-4-8fc50010291d47efb92cbbd668c8c893" target="_blank" rel="noopener" +>《 GPT-4 ,人类迈向AGI的第一步》</a>是一篇<a class="link" href="https://arxiv.org/pdf/2303.12712v1.pdf" target="_blank" rel="noopener" +>近期论文</a>的翻译,该论文由微软研究院发布,论证了当前的 GPT-4 模型已经初步具有 AGI 的苗头。</p> +<p>论文内容十分详实,看完很震撼。</p> +<p>摘录部分文字如下:</p> +<blockquote> +<blockquote> +<p><strong>对话</strong> +&gt; 马克:我不喜欢你昨天晚上对待杰克的方式 +&gt; 朱迪:你看到他在做什么了吗?他打了他哥哥的头! +&gt; 马克:这并不能成为你对他大喊大叫的理由 +&gt; 朱迪:你想让我怎么做?让他打他的弟弟,然后什么都不说? +&gt; 马克:不,我不同意 +&gt; 朱迪:那你为什么要为他辩护? +<strong>提问:马克的意图似乎是什么?</strong> +GPT4: 马克的意图似乎是要表达他对朱迪处理与杰克关系的方式的不满,并建议她可以更加冷静和尊重。 +ChatGPT:根据谈话内容,马克的意图似乎是为杰克的行为辩护,并表达他对朱迪对待杰克的不满。 +<strong>提问:朱迪如何看待汤姆的回应?</strong> +GPT4: 朱迪认为他的评论是对她的分析能力的攻击,也是对杰克的不当行为表示同情的表现。她的反应是防御性的和愤怒的,并质疑马克的动机。 +ChatGPT:如果没有更多的文字,我不可能准确判断朱迪是如何接受马克的评论的。然而,根据朱迪的回应,她似乎并不同意马克的观点,而且可能对他为杰克的行为辩护感到沮丧。</p> +</blockquote> +</blockquote> +<h3 id="用-gpt-4-帮你编写一个游戏">用 GPT-4 帮你编写一个游戏</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-02-56.png" +width="717" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="212" +data-flex-basis="510px" +> +我第一次见识到 ChaptGPT 的编程能力之后,就基本离不开这个工具了。</p> +<p>现在我几乎每天都在它的辅助下编写代码。</p> +<p>不过,这里有个老哥更过分。</p> +<p>他让 <a class="link" href="https://twitter-thread.com/t/1637592014446551040" target="_blank" rel="noopener" +>GPT-4 模型帮他做出了一个3D太空赛跑游戏</a>。</p> +<p>作者本身没有游戏编程经验也不懂Javascript,但是通过跟模型一点一点对话,反复将调试代码生成的错误信息反馈给模型,逐渐完成了一个完成度还挺高的游戏。</p> +<h3 id="搭建基于私域数据的chatgpt">搭建基于私域数据的ChatGPT</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-12-24.png" +width="776" +height="438" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="425px" +> +ChatGPT 超强的对话能力怎样应用到私有数据上?</p> +<p>比如说我希望做出一个基于 ChatGPT 模型的专属客服,要吃透我的产品信息。</p> +<p>官方提供的训练API和微调(fine tuning)指导相对复杂一些,对于AI模型的微调不熟悉的人员还不够友好。</p> +<p>这里有一篇“零基础”教程<a class="link" href="https://mp.weixin.qq.com/s/naiVMuXHAScRb_jSEJN3zg" target="_blank" rel="noopener" +>《搭建基于私域数据的ChatGPT》</a>,可以带你走一下流程,感受一下定制专属模型的步骤。</p> +<h3 id="ai令人焦虑">AI令人焦虑</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-21-37.png" +width="609" +height="859" +loading="lazy" +class="gallery-image" +data-flex-grow="70" +data-flex-basis="170px" +> +这篇<a class="link" href="https://mp.weixin.qq.com/s/7H1FrwbQvsh0HD9z90L0wg" target="_blank" rel="noopener" +>《AI狂飙的时代,人还有价值吗?》</a>是一期语音播客的文字转译,因为内容比较精彩,所以也收录在这里了。</p> +<blockquote> +<p>我觉得取代不是一个好的词儿,因为取代是一个非常容易反驳的词儿。我可以说我仍然会干什么什么,AI干不了,所以它取代不了我。 +但正是这种字面上的抬杠,使得问题的本质被掩盖了,因为AI在人的生活中的渗透是一个逐渐的过程。 +百分之百地取代你可能仍然不会发生,可是它也不需要百分之百的取代掉你,只要50%的取代掉你的某些工作职能,AI就会对就业市场形成非常大的冲击。 +我有一个纽约的律师朋友,他是很早就开始用这个东西。 +他本身不是一个技术人员,他是一个标准的文科生,平常的用一个新软件都要紧张半天的那种人。 +但是他开始用这个之后,因为律师的工作是很大程度上是依赖于文本的,而文本是GPT的长项,所以他就开始用。 +之后,我就问他说,所以你真的开始辞退你的员工了吗?因为他自己是一个律所合伙人。 +他说我还没有真正开始辞退任何人,但是我确实打算今年暑假不用再招实习生了,因为给我省下的活完全可以让我腾出手来做一些事,以至于我可以省下招一个实习生的AD account。 +这就是一个真实的影响对不对? +它没有真正取代什么东西,但是它仍然冲击了一个真实的就业市场上的职位。</p> +<p>我觉得AI对我们社会的影响会以这种方式出现,它不会马上一下子让你这个人变得没有意义,但是它可以让三个人的活,两个人现在能干完,多出来那个人就没有存在的必要了,所以老板就可以把他开掉。 +它并不是百分之百取代的人的方式来逐渐进行的,而且这个事情是非常真实的。这也是为什么我觉得很多人对冲击仍然没有做好心理上和事实上的准备。 +其实有点令人忧虑的原因就是,如果你今天还用一种这东西,都是媒体的炒作来对待这个问题,你就很可能会在真正的影响你切身生活的冲击到来之前,没有做好对自己来说比较有用的帮助。</p> +</blockquote> +<p>读完这篇文章,我的感受是,没必要焦虑,不是AI没有威胁,而是焦虑也没用,蒸汽机车发明之后,超越马车就只剩下时间问题了。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://greasyfork.org/zh-CN/scripts/445751-unlimited-downloader" target="_blank" rel="noopener" +>无限制下载器,只要能播放就能下载</a>,能够帮助下载视频网站内容的浏览器插件很多,大部分都是通过嗅探播放地址来实现的下载,网站也会采用各种加密手段来进行阻止。但是这个油猴脚本采用了另一种思路。你网站防再死不能不让观众看吧?脚本几乎采用了类似录屏的手段来进行视频下载。对于一些实在想要下载的内容,可以考虑试试这个插件。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-34-53.png" +width="640" +height="400" +loading="lazy" +class="gallery-image" +data-flex-grow="160" +data-flex-basis="384px" +></li> +<li><a class="link" href="https://github.com/cocktailpeanut/dalai" target="_blank" rel="noopener" +>帮你本地运行 LLaMA 模型</a>,只需一行命令就可以让你在本地运行 <a class="link" href="https://github.com/ggerganov/llama.cpp" target="_blank" rel="noopener" +>LLaMA</a> 模型,轻松感受在本地单机上运行大规模语言模型的魅力。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-40-09.png" +width="1920" +height="1080" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></li> +<li><a class="link" href="https://github.com/lxe/simple-llama-finetuner" target="_blank" rel="noopener" +>微调 LLaMa 模型的工具</a>,既然都能在本地运行了,那就再给力一些,这个工具可以让你很方便地使用自己的数据训练 LLaMA 模型。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-42-04.png" +width="1013" +height="898" +loading="lazy" +class="gallery-image" +data-flex-grow="112" +data-flex-basis="270px" +></li> +<li><a class="link" href="https://github.com/Haxxnet/Compose-Examples" target="_blank" rel="noopener" +>Docker Compose 容器组合最佳实践</a>,Docker有多好用不用再说了吧,这里有一堆使用Docker Compose编排容器的模板,收录了很多十分有用的容器镜像组合,可方便快速的搭建各种业务(如:单点登录、VPN、媒体管理、文件共享、博客、维基、社交网站、项目管理等)。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-46-53.png" +width="802" +height="445" +loading="lazy" +class="gallery-image" +data-flex-grow="180" +data-flex-basis="432px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 025 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/Wed, 22 Mar 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/<h1 id="机器文摘-第-025-期">机器文摘 第 025 期</h1> +<h2 id="长文">长文</h2> +<h3 id="252个字节实现播放音乐和动画">252个字节实现播放音乐和动画</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-10-25-42.png" +width="915" +height="478" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="459px" +> +这里有个网页介绍了一个demo作者使用一段JavaScript代码实现了一个<a class="link" href="http://www.p01.org/256b_tetris_theme/" target="_blank" rel="noopener" +>一边播放俄罗斯方块背景音乐一边播放字符动画的网页</a>,原理是利用HTML5的AudioContext对象进行声音合成,通过定时器触发基于当前时间t值的不同频率,实现音乐播放。具体代码如下:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="o">&lt;</span><span class="nx">body</span> <span class="nx">onclick</span><span class="o">=</span><span class="s2">&#34;with(new AudioContext)with(o=createOscillator())connect(destination),start(setInterval(v=&gt;innerHTML=&#39;TETЯIS&amp;#&#39;+(9624|(o.frequency.value=`RR&gt;AIIA&gt;777${d=&#39;ARRIA&gt;&gt;&gt;AIIRRAA7777&#39;}IIIWnnbWRRR${d}`.charCodeAt(++t%58)*4)%7)+&#39;P01&#39;,t=232))&#34;</span><span class="o">&gt;</span><span class="nx">click</span> +</span></span></code></pre></td></tr></table> +</div> +</div><h3 id="诺基亚发布的可维修手机">诺基亚发布的“可维修”手机</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-10-35-52.png" +width="614" +height="369" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="399px" +> +说到诺基亚,用过的朋友第一个映入脑海的词就是“砸核桃”。</p> +<p>那是iPhone还没发布的非智能手机年代。</p> +<p>手机可更换电池和外壳在那时是一个标准设计,谁要是不支持这些都不好意思跟人打招呼。</p> +<p>那时我经常把我的诺基亚掉在地上摔得七零八落,然后淡定地捡起来像电影里特工拼装自己的手枪那样,一个个把零件组装起来,形成“一把”手机。</p> +<p>或者等手机快要没电的时候,像换弹匣那样给手机换一块电池,立马满血复活。</p> +<p>这样的日子自从iPhone发布之后就再也没有了。</p> +<p><a class="link" href="https://www.theguardian.com/technology/2023/feb/25/nokia-launches-diy-repairable-budget-android-phone" target="_blank" rel="noopener" +>诺基亚近期发布了一款手机</a>,再次让我想起我那掉地上摔开几瓣的手机。这款手机号称具有良好的“可维修”性,普通用户也可一个人在家轻松拆卸。可以自行更换包括电池、屏幕、充电端口等零件。</p> +<h3 id="不要重复自己是编程的好原则吗">不要重复自己是编程的好原则吗</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-10-50-45.png" +width="650" +height="346" +loading="lazy" +class="gallery-image" +data-flex-grow="187" +data-flex-basis="450px" +> +不要重复自己,永远不要从头开始重写代码!</p> +<p>这是很多程序员收到的忠告。</p> +<p>然而它是绝对正确的吗?</p> +<p>这里有篇文章<a class="link" href="https://programmingisterrible.com/post/176657481103/repeat-yourself-do-more-than-one-thing-and" target="_blank" rel="noopener" +>《重复自己,重写一切》</a>,作者在文章中探讨了编程中的一些习惯,他认为这些习惯可以使代码变得更难理解、更难维护,并可能导致代码的冗长和不必要的复杂性。文章提到了重写代码可以给程序带来更好的抽象和可维护性,所以建议定期通过重新写代码的方式重构你的程序。</p> +<p>说实话,我不知道作者是怎样看待所谓“屎山”代码的,也许当他面对有些代码时,他的观点也会变为:“能跑的代码,就尽量别动它了”。</p> +<h3 id="慢下来">慢下来</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-10-59-28.png" +width="587" +height="205" +loading="lazy" +class="gallery-image" +data-flex-grow="286" +data-flex-basis="687px" +> +这篇文章的题目是<a class="link" href="https://sive.rs/slow" target="_blank" rel="noopener" +>“慢下来”</a>,作者是Derek Sivers,一位创业者、作家和音乐家。在这篇文章中,他分享了自己对于“慢下来”这个主题的一些思考和感悟。</p> +<p>虽然是个急性子,但是我很认同文章里的观点。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://www.macpierce.com/the-camera-shy-hoodie" target="_blank" rel="noopener" +>反跟踪识别的套件</a>,如果你觉得被公共场所的摄像头拍摄和记录或者识别侵犯了你的隐私,这里有一套开源的穿戴套件可以考虑。它通过在身上穿戴可以发射红外线的LED设备,使得摄像头画面过曝。以获得保护隐私的效果。不过仅用于研究,不知道是否符合有些国家的法律法规。网站提供了配件清单和详细的装配说明(pdf)供下载。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-11-05-16.png" +width="1203" +height="583" +loading="lazy" +class="gallery-image" +data-flex-grow="206" +data-flex-basis="495px" +></li> +<li><a class="link" href="https://whatdoesthiscodedo.com/" target="_blank" rel="noopener" +>AI帮你解释一段代码</a>,有人使用openai的开发接口提供了一个专门帮人们解释代码执行的工具,输入代码,输出解释。并提供vscode的插件。我把文章开头那段播放音乐的Javascript代码发给他让他解释,效果如下图: +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-11-09-51.png" +width="625" +height="740" +loading="lazy" +class="gallery-image" +data-flex-grow="84" +data-flex-basis="202px" +></li> +<li><a class="link" href="https://xenova.github.io/transformers.js/" target="_blank" rel="noopener" +>在网页中运行GPT模型</a>,一个可以在浏览器中执行Transformer模型的开源程序,可以执行轻量的模型,实现如翻译、语音转文字、图像转文字等任务。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-11-12-45.png" +width="1239" +height="519" +loading="lazy" +class="gallery-image" +data-flex-grow="238" +data-flex-basis="572px" +></li> +<li><a class="link" href="https://aitxt.io" target="_blank" rel="noopener" +>AI生成工具箱</a>,近期,基于chatGPT模型的应用大爆发,这里有一个整理好的工具箱,可以使用ai做很多内容生成工作,包括帮你编写周报、润色文字、写道歉信、写外卖好评等,效果还不错。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-11-15-00.png" +width="1033" +height="530" +loading="lazy" +class="gallery-image" +data-flex-grow="194" +data-flex-basis="467px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 024 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/Wed, 15 Mar 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/<h1 id="机器文摘-第-024-期">机器文摘 第 024 期</h1> +<h2 id="长文">长文</h2> +<h3 id="电池充一次可以用两年的笔记本电脑">电池充一次可以用两年的“笔记本”电脑</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-09-18-01.png" +width="830" +height="467" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +> +挪威软件开发商安德烈亚斯·埃里克森(Andreas Eriksen)组装了一款笔记本电脑(或者说便携膝上型电脑?)。</p> +<p>它拥有“以年为单位的电池寿命”,并且使用用Lisp编程系统界面,产品名为:<a class="link" href="https://www.hackster.io/news/andreas-eriksen-s-potatop-is-a-lisp-powered-laptop-with-a-battery-life-measured-in-years-2f5d79653f24" target="_blank" rel="noopener" +>PotatoP</a>。</p> +<p>CPU好像是个ARM架构的低功耗单核处理器,最高频率96MHz。</p> +<p>支持蓝牙5.0。</p> +<p>运行的系统为PotatOS,一个基于<a class="link" href="http://www.ulisp.com/" target="_blank" rel="noopener" +>uLisp</a>(一个专门为微控制器设计的Lisp)移植的专用系统。</p> +<p>使用的4.4英寸显示屏采用介于LCD和墨水屏之间的技术,省电。</p> +<p>再加上机身上还带有太阳能电池,据说如果环境光充足的话,可以连续运行两年。</p> +<h3 id="详解-amd-为-steam-deck-开发的-apu">详解 AMD 为 Steam Deck 开发的 APU</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-09-32-20.png" +width="671" +height="272" +loading="lazy" +class="gallery-image" +data-flex-grow="246" +data-flex-basis="592px" +> +Steam Deck 无疑是一款革命性的掌机。</p> +<p>如果不是价格在国内被炒的离谱,我定会入手一台,也许再观望一下等待第二代或者三代产品更好。</p> +<p>这款掌机使得在便携设备上游玩3A大作不再是幻想。</p> +<p>取得这样的表现,除了得益于V厂魔改的Linux系统之外,还离不开这块由AMD定制的、代号“梵高”的 APU。</p> +<p>这篇<a class="link" href="https://chipsandcheese.com/2023/03/05/van-gogh-amds-steam-deck-apu/" target="_blank" rel="noopener" +>《“梵高”AMD的Steam Deck APU》</a>详细介绍了这块APU的各种技术细节,解释了为什么Steam Deck可以做到低功耗的同时还拥有相当给力的图形性能。</p> +<h3 id="用磁盘阵列raid确保数据安全靠谱吗">用磁盘阵列(RAID)确保数据安全靠谱吗?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-09-45-46.png" +width="477" +height="250" +loading="lazy" +class="gallery-image" +data-flex-grow="190" +data-flex-basis="457px" +> +再谈谈 NAS 的事情(中年技术男的三大爱好之一)。</p> +<p>像我这样的人,对于 RAID 磁盘阵列总是抱有美好的幻想。我们认为,只要将数据存放在经过合理规划的磁盘阵列中(例如 RAID 5),我们就可以高枕无忧,确保数据永远不会丢失。然而,实际上,磁盘阵列并不是备份数据的最佳选择,最佳的数据安全策略是异地多份存储。</p> +<p>尽管 RAID 5 宣称随便损坏一块硬盘也不要紧,只需更换一块正常盘即可,但这种理想状态可能不太容易实现,中间随时可能会出现其他状况导致数据永久丢失。</p> +<p>一篇名为<a class="link" href="https://www.ucmadscientist.com/almost-lost-it-all-again/" target="_blank" rel="noopener" +>《差点儿就又全没了》</a>的博文,讲述了作者在使用 NAS 磁盘阵列时经历了一次惊险刺激的数据拯救过程。希望这篇文章能够给计划使用类似方式保存数据的朋友们一个平常心态。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://pubby.games/nesfab.html" target="_blank" rel="noopener" +>NESFab</a>,一个专为开发任天堂8位游戏机(NES、FC)设计的编程语言。具有高性能、易于装载资源、自动内存地址切换等特性,作者还在主页提供了一个使用NESFab开发游戏的教程。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-10-10-50.png" +width="490" +height="169" +loading="lazy" +class="gallery-image" +data-flex-grow="289" +data-flex-basis="695px" +></li> +<li><a class="link" href="https://github.com/AstroNvim/AstroNvim" target="_blank" rel="noopener" +>AstroNvim</a>,一套即开即用的Nvim配置文件,主打界面美观,集成了文件浏览、代码补全、语法高亮、模糊查询、可视化调试等常用插件配置。对于新手和懒得折腾的人来说,可以尝试。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-10-13-25.png" +width="814" +height="434" +loading="lazy" +class="gallery-image" +data-flex-grow="187" +data-flex-basis="450px" +></li> +<li><a class="link" href="https://github.com/pynecone-io/pynecone" target="_blank" rel="noopener" +>pynecone</a>,一个用python开发的web应用框架,特点是使用python语言完成所有任务,包括前端和后端,可以帮助那些对于前端开发不太擅长的人更方便地制作web应用程序。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-10-16-17.png" +width="727" +height="647" +loading="lazy" +class="gallery-image" +data-flex-grow="112" +data-flex-basis="269px" +></li> +<li><a class="link" href="https://maryrosecook.com/blog/post/a-practical-introduction-to-functional-programming" target="_blank" rel="noopener" +>函数式编程入门</a>,一篇介绍函数式编程的文章,介绍了函数式编程的基本概念和一些重要的函数式编程概念,并使用Javascript演示了如何使用这些概念进行函数式编程。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-10-18-09.png" +width="450" +height="220" +loading="lazy" +class="gallery-image" +data-flex-grow="204" +data-flex-basis="490px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 023 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/Wed, 08 Mar 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/<h1 id="机器文摘-第-023-期">机器文摘 第 023 期</h1> +<h2 id="长文">长文</h2> +<h3 id="视频信号可以被窃听吗">视频信号可以被窃听吗?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-10-10-45.png" +width="533" +height="234" +loading="lazy" +class="gallery-image" +data-flex-grow="227" +data-flex-basis="546px" +> +我之前听到过一个传说。</p> +<p>使用高灵敏度的天线,再加上一些奇妙的设备。</p> +<p>可以窃听(窃视?)到附近(方圆数百米)范围之内的显示器显示的内容。</p> +<p>这个传说流传的时候,还是CRT显示器的时代,当时的视频接口主要是VGA,采用模拟信号进行传输。</p> +<p>如果显示器或者视频线缆所作的屏蔽不够充分的话,难免会有信号泄露。</p> +<p>而VGA信号又没有任何加密,被别有用心的人收看是有一定的可能的。</p> +<p>时间发展到今天,视频接口早已升级,我以为除非不小心无线投屏到了邻居家,否则就不会有视频内容泄露的情况。</p> +<p>然而,<a class="link" href="https://www.windytan.com/2023/02/using-hdmi-radio-interference-for-high.html" target="_blank" rel="noopener" +>今天要说的这篇文章</a>则证实了上述传说的可能。</p> +<p>不过,比起传说中的窃听,作者走的更远一些。</p> +<p>起因是作者在家里摆弄无线电的时候,发现了一个信号干扰源,最后发现来自他的一个树莓派设备。</p> +<p>于是经过一番操作,作者不但成功通过无线接收的方式将视频信号显示了出来。</p> +<p>还利用这种无线信号的干扰(或泄露?)实现了叠加数据的传输。</p> +<h3 id="怎样用密码保护一个静态页面">怎样用密码保护一个静态页面?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-10-34-20.png" +width="903" +height="429" +loading="lazy" +class="gallery-image" +data-flex-grow="210" +data-flex-basis="505px" +> +说到网站上的数据权限保护,一般我们会需要后端程序配合。</p> +<p>比如使用账号系统,给用户角色分配不同的权限,使其访问后端接口时获取不同的数据。</p> +<p>如果没有后台程序,只有静态页面会怎样?</p> +<p>这儿有个开源工具,<a class="link" href="https://robinmoisson.github.io/staticrypt/" target="_blank" rel="noopener" +>可以帮你生成带有密码保护的静态HTML页面</a>。</p> +<p>具体使用方法和原理也很简单。</p> +<p>输入你想设置的密码和你的HTML页面原始代码,这个工具可以使用AES-256加密算法对其进行加密。</p> +<p>然后在浏览器加载时,页面自动使用一个js库实现自解密。</p> +<p>这个方法用于临时保护一些静态的内容还是挺有效的,而且很方便。</p> +<h3 id="写代码越干净越好吗">写代码越“干净”越好吗?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-10-43-47.png" +width="713" +height="344" +loading="lazy" +class="gallery-image" +data-flex-grow="207" +data-flex-basis="497px" +> +有不少人宣称自己有代码“洁癖”。</p> +<p>对于设计模式和面向对象有着非常深的执念(或者函数式编程也是)。</p> +<p>市面上也充斥着很多“之美”、“之道”、“之禅”之类的书籍,强调代码要给人读、整洁干净。</p> +<p>我并不反对上述观点,甚至自己也有一点这样的“洁癖”,只是有时内心会有一丝怀疑的时候,觉得如果过于追求某些东西可能会偏离了解决问题的根本目标。</p> +<p>这篇<a class="link" href="https://www.computerenhance.com/p/clean-code-horrible-performance" target="_blank" rel="noopener" +>《“干净”的代码,糟糕的性能》</a>,帮我吐槽了一些事情。</p> +<p>但作者在文中所举的例子稍微有些牵强,不必过于纠结。</p> +<h3 id="不知道怎么练习编程怎么办">不知道怎么练习编程怎么办</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-10-58-53.png" +width="469" +height="314" +loading="lazy" +class="gallery-image" +data-flex-grow="149" +data-flex-basis="358px" +> +经常有人困惑在学习了一门新的编程语言之后,不知该做些什么。</p> +<p>就像是掌握了词语却写不出好的小说,掌握了规则也下不好象棋。</p> +<p>我们从小受到的教育方式导致了,在学习技能这一块,缺失实践的动力和方法。</p> +<p>这篇<a class="link" href="https://prog21.dadgum.com/80.html" target="_blank" rel="noopener" +>给无目标的新手程序的一些建议</a>,虽然内容不多,但是可以看出作者也是个老油条了。</p> +<p>给出的一些提示都很实在,对于技能练习方面,提的都是我希望我能遵从的。</p> +<p>比如:</p> +<blockquote> +<p>用技能解决你实际生活中的问题。 +做一些你真正会用到的东西。</p> +</blockquote> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://www.freecodecamp.org/chinese/news/typescript-for-react-developers/" target="_blank" rel="noopener" +>写给 React 开发者的 TypeScript 指南</a>,针对React程序员的TypeScript的学习资料,解答了我一部分为什么要用TS的问题。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-11-01-19.png" +width="698" +height="375" +loading="lazy" +class="gallery-image" +data-flex-grow="186" +data-flex-basis="446px" +></li> +<li><a class="link" href="https://method.ac/" target="_blank" rel="noopener" +>Method of Action</a>,一些免费的工具和在线小游戏(颜色搭配、贝塞尔曲线等),可以帮助你学习和掌握设计理念和工具。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-11-02-12.png" +width="605" +height="461" +loading="lazy" +class="gallery-image" +data-flex-grow="131" +data-flex-basis="314px" +></li> +<li><a class="link" href="https://archivebox.io/" target="_blank" rel="noopener" +>Archivebox</a>,一套开源的互联网内容保存方案,可以将你喜欢的页面下载下来,并自动爬取相关链接、图片等内容,类似于互联网档案馆的https://archive.org,不过可以自己搭建。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-11-06-33.png" +width="686" +height="285" +loading="lazy" +class="gallery-image" +data-flex-grow="240" +data-flex-basis="577px" +></li> +<li><a class="link" href="https://ohiostate.pressbooks.pub/graphicshistory/front-matter/cover/" target="_blank" rel="noopener" +>History of Computer Graphics and Animation</a>,一本讲解计算机图形和动画发展历程的电子书,里面记录了计算机图形学相关的许多参考资料,曾用于俄亥俄州立大学的授课。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-11-08-29.png" +width="676" +height="711" +loading="lazy" +class="gallery-image" +data-flex-grow="95" +data-flex-basis="228px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 022 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/Wed, 01 Mar 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/<h1 id="机器文摘-第-022-期">机器文摘 第 022 期</h1> +<h2 id="长文">长文</h2> +<h3 id="自制家庭服务器">自制家庭服务器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-10-51-39.png" +width="668" +height="367" +loading="lazy" +class="gallery-image" +data-flex-grow="182" +data-flex-basis="436px" +> +人们常说,中年技术男的最终归宿除了钓鱼和盘核桃之外,还有一项就是折腾家里的服务器,这些服务器形态各异,但是作用都是殊途同归:NAS、软路由、虚拟化、Docker容器。</p> +<p>怎样变着花样搭建家庭服务器几乎是 V 站的月经甚至日经话题。</p> +<p>这里有个国外的老哥,决定使用 ARM64 架构自己“装配”一个,是那种需要焊接的“装配”。</p> +<p>有兴趣的可以翻阅一下这篇<a class="link" href="https://jforberg.se/blog/posts/2023-02-19-rockpro64/rockpro64.html" target="_blank" rel="noopener" +>《构建 ARM64 家庭服务器》</a>。</p> +<p>文章介绍了如何用一种较为困难的方式构建一个 ARM64 架构的家用服务器。</p> +<p>作者使用了一块名为 ROCKPro64 的开发板,并详细介绍了构建过程中遇到的问题以及如何解决这些问题。</p> +<p>文章中包含了安装基础操作系统、配置网络连接、设置磁盘阵列和安装各种软件的详细步骤和指导,涵盖了从硬件到软件的多个方面。</p> +<p>在构建过程中,作者提到了一些常见的问题和解决方法,例如如何处理不同操作系统的差异,如何在开发板上设置固件,以及如何解决硬件不兼容问题。</p> +<p>总之,这篇文章是一份详细的指南,可以帮助有兴趣构建自己的家用服务器的读者了解基础知识,克服可能遇到的问题,并学习如何从头开始构建一个高效、安全的服务器。</p> +<blockquote> +<p>上面这段是让 chatGPT 帮我写的 :)</p> +</blockquote> +<h3 id="用rust写一个大小仅有2k的极简fps游戏">用Rust写一个大小仅有2K的极简FPS游戏</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-11-06-53.png" +width="480" +height="258" +loading="lazy" +class="gallery-image" +data-flex-grow="186" +data-flex-basis="446px" +> +极简渲染器的编写教程网上有很多,但大都浅尝辄止,以静态渲染为主。</p> +<p><a class="link" href="https://grantshandy.github.io/posts/raycasting/" target="_blank" rel="noopener" +>这篇文章</a>则从制作一个第一人称射击游戏的视角出发,讲解了怎样使用光线投射技术实现最基本的三维空间渲染、光照、阴影等效果。</p> +<p>作者使用 Rust 语言基于 wasm 技术编写了一个在网页中运行的示例程序,该程序非常小巧,但是也充分展现了如何使用光线投射算法来实现 3D 渲染技术仲的一些基本概念,比如:墙体贴图、视角控制等。</p> +<p>是我看到的教程里比较系统的一个,适合作为爱好者去研究。</p> +<h3 id="玩具-cpu-模拟器">玩具 CPU 模拟器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-13-24-45.png" +width="640" +height="480" +loading="lazy" +class="gallery-image" +data-flex-grow="133" +data-flex-basis="320px" +> +国外一个大学老师觉得他的计算机组成原理课程有些枯燥,于是他<a class="link" href="https://jimhall.itch.io/toy-cpu" target="_blank" rel="noopener" +>动手撸了一个 CPU 模拟器出来</a>,以帮助学生们更好的理解计算机内部运作原理。</p> +<p>作者在文章里介绍了基本的原理,以及模拟器的各个组件,适合学习底层原理初入门的学生。</p> +<p>另外这个模拟器也基于 MIT 协议进行了开源,文章中附有开源仓库的地址和编译好的可执行文件下载连接。</p> +<p>需要注意的是该程序运行环境为DOS,现在要想体验的话,需要先安装 <a class="link" href="https://www.dosbox.com/download.php?main=1" target="_blank" rel="noopener" +>DosBOX</a> 这个模拟器。</p> +<h3 id="不用任何构建系统编写前端代码">不用任何构建系统编写前端代码</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-13-35-29.png" +width="632" +height="224" +loading="lazy" +class="gallery-image" +data-flex-grow="282" +data-flex-basis="677px" +> +比起十几年前,前端开发工程现在已经变得十分复杂。</p> +<p>有次我想写个简单的页面程序,但是却花费了一上午的时间陷入对框架和构建系统的选择上。</p> +<p>后来不得不放弃,改用记事本随便用原生Javascript完成了功能。</p> +<p><a class="link" href="https://jvns.ca/blog/2023/02/16/writing-javascript-without-a-build-system/" target="_blank" rel="noopener" +>这篇文章</a>的作者跟我有同样的感受。</p> +<p>作者认为,对于一些简单的项目来说,使用构建系统可能是不必要的。</p> +<p>因为构建系统会增加开发和维护的复杂性,而且可能会导致一些性能问题。</p> +<p>文章演示了作者如何使用原生的Javascript和浏览器的开发者工具来实现一些常见的构建系统功能。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/CyC2018/CS-Notes" target="_blank" rel="noopener" +>计算机知识笔记</a>,一个计算机科学知识笔记仓库,包括计算机基础知识、编程语言和算法、开发工具、面试笔试题目等等,是一个非常实用的笔记库。目前在 Github 上有超过 162k 个 star 。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-13-47-03.png" +width="344" +height="602" +loading="lazy" +class="gallery-image" +data-flex-grow="57" +data-flex-basis="137px" +></li> +<li><a class="link" href="https://www.hugi.scene.org/online/hugi31/hugi%2031%20-%20index%20coding%20corner.htm" target="_blank" rel="noopener" +>Creating Demos</a>,这套教程是 <a class="link" href="https://en.wikipedia.org/wiki/Hugi" target="_blank" rel="noopener" +>Hugi 杂志</a>在2001年第31期发布的一系列编程文章,主题是“Demo程序”的制作,是我目前在网络上见到的比较完整和耐心的一套讲解 Demoscene 如何制作的教程。虽然有些技术是老旧的,但是思想一直是不变的,能够学到很多平时很难了解到的东西,现在很少有人愿意分享这些了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-13-52-29.png" +width="543" +height="367" +loading="lazy" +class="gallery-image" +data-flex-grow="147" +data-flex-basis="355px" +></li> +<li><a class="link" href="https://github.com/iawia002/lux" target="_blank" rel="noopener" +>网络视频下载器</a>,一个 go 语言编写的网络音视频资源下载工具,类似 youtube-dl,但是支持的网站要更多一些。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-13-54-53.png" +width="870" +height="666" +loading="lazy" +class="gallery-image" +data-flex-grow="130" +data-flex-basis="313px" +></li> +<li><a class="link" href="https://www.ambient.run/" target="_blank" rel="noopener" +>ambient</a>,Ambient是一个使用 WebAssembly、Rust 和 WebGPU 技术构建的高性能多人游戏和3D应用的开源引擎。特点是针对构建多人游戏开发进行优化支持。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-14-03-29.png" +width="981" +height="378" +loading="lazy" +class="gallery-image" +data-flex-grow="259" +data-flex-basis="622px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 021 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/Wed, 22 Feb 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/<h1 id="机器文摘-第-021-期">机器文摘 第 021 期</h1> +<h2 id="长文">长文</h2> +<h3 id="chatgpt-原理通俗讲解">chatGPT 原理通俗讲解</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-14-57-11.png" +width="1240" +height="410" +loading="lazy" +class="gallery-image" +data-flex-grow="302" +data-flex-basis="725px" +> +可能是有人炒作的缘故,chatGPT 热度一直不降,连街边买菜的大妈都在讨论这个“人工智能机器人”。</p> +<p>可能是它输出语言的流畅度实在是太接近真实的人类了,用惯了之前那种“智能助理”的人很容易感到震惊。</p> +<p>然而其背后的原理并非像想象的那么复杂,甚至是大力出奇迹的又一个经典样例。</p> +<p>最近关于它的文章也是铺天盖地,各种分析、叫好,很少有冷静下来探讨其背后机理的。</p> +<p>我翻看了几篇之后,发现唯有这篇<a class="link" href="https://writings.stephenwolfram.com/2023/02/what-is-chatgpt-doing-and-why-does-it-work/" target="_blank" rel="noopener" +>《chatGPT在做什么以及它为什么好使》</a> 比较优秀。读起来比较平和,没有压力。</p> +<p>文章揭示了即使像chatGPT这样的大型语言模型也是一个单词一个单词慢慢往出崩的,并尝试说清楚这么流畅的语言是基于什么来预测后续单词的概率。</p> +<h3 id="怎样利用多gpu训练真正的大型模型">怎样利用多GPU训练真正的大型模型</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-13-37.png" +width="920" +height="461" +loading="lazy" +class="gallery-image" +data-flex-grow="199" +data-flex-basis="478px" +> +前面提到的 chatGPT 模型,体量非常大,据说训练一次就要耗费上千万美元。</p> +<p>作为普通开发者我们是不敢奢望自己上手训练一番。</p> +<p>不过,这里有一篇文章可以让我了解像这样的<a class="link" href="https://lilianweng.github.io/posts/2021-09-25-train-large/" target="_blank" rel="noopener" +>大模型是如何进行并行训练的</a>。</p> +<p>另外还有个开源的项目,号称可以<a class="link" href="https://github.com/hpcaitech/ColossalAI/blob/main/README-zh-Hans.md" target="_blank" rel="noopener" +>在较少资源的基础设施上进行 GPT 模型训练</a>,有兴趣的可以试试。</p> +<h3 id="怎样搭建一个电子爱好者工作间">怎样搭建一个电子爱好者工作间</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-28-10.png" +width="716" +height="439" +loading="lazy" +class="gallery-image" +data-flex-grow="163" +data-flex-basis="391px" +> +拥有一个电子产品工作室一直是我的一个梦想。</p> +<p>电烙铁、稳压电源、万用表,是我能想到的最基本的设备。</p> +<p>如果还想更完美,可以借鉴这篇文章所介绍的思路,<a class="link" href="https://lcamtuf.substack.com/p/setting-up-an-electronics-workshop" target="_blank" rel="noopener" +>搭建一个电子爱好者工作间</a>。</p> +<h3 id="运气计算公式">运气计算公式</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-37-36.png" +width="809" +height="570" +loading="lazy" +class="gallery-image" +data-flex-grow="141" +data-flex-basis="340px" +> +看到一个关于运气的文章<a class="link" href="https://www.swyx.io/create-luck" target="_blank" rel="noopener" +>《如何获得好运气》</a>,觉得里面提到的“怎样使得随机的运气变得让好运更加倾向于你”的说法比较有意思。</p> +<p>于是就收录一下。</p> +<p>文章里探讨的问题,很容易让我联想到关于“下雨的时候是飞速跑动淋雨多还是慢慢走淋雨多”的问题。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://academy.cs.cmu.edu/" target="_blank" rel="noopener" +>卡耐基梅隆大学计算机科学在线教程</a>,CMU CS Academy 是卡内基梅隆大学计算机科学学院 (SCS) 的一个项目,其目标是开发一种新颖的、世界级的、在线的、完全免费的交互式高中计算机科学课程。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-45-42.png" +width="767" +height="390" +loading="lazy" +class="gallery-image" +data-flex-grow="196" +data-flex-basis="472px" +></li> +<li><a class="link" href="https://www.handsome-css.com/" target="_blank" rel="noopener" +>纯CSS实现的超漂亮UI组件收集</a>,网站收集了超多 UI 组件,基于 纯 CSS 实现,采用 MIT 开源协议发布,可以自由使用。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-47-30.png" +width="863" +height="349" +loading="lazy" +class="gallery-image" +data-flex-grow="247" +data-flex-basis="593px" +></li> +<li><a class="link" href="https://cn.sli.dev/" target="_blank" rel="noopener" +>为开发者打造的演示文稿工具</a>,Slidev 旨在为开发者提供灵活性和交互性,通过使用他们已经熟悉的工具和技术,使他们的演示文稿更加有趣、更具表现力和吸引力。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-50-17.png" +width="652" +height="251" +loading="lazy" +class="gallery-image" +data-flex-grow="259" +data-flex-basis="623px" +></li> +<li><a class="link" href="https://www.stableattribution.com/" target="_blank" rel="noopener" +>根据ai做的图倒推出用于训练模型的原始图</a>,这个网站比较有意思,前一段时间比较火的根据文字生成图片的 AI ,这里可以将根据 AI 生成的图片反推出它当时样本训练的原始图。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-56-55.png" +width="1696" +height="398" +loading="lazy" +class="gallery-image" +data-flex-grow="426" +data-flex-basis="1022px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 020 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/Wed, 15 Feb 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/<h1 id="机器文摘-第-020-期">机器文摘 第 020 期</h1> +<h2 id="长文">长文</h2> +<h3 id="怎样获得非凡成就">怎样获得非凡成就</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/2023-02-15-09-57-43.png" +width="749" +height="383" +loading="lazy" +class="gallery-image" +data-flex-grow="195" +data-flex-basis="469px" +> +多年来,我对成功学嗤之以鼻。</p> +<p>但也对有些人的成功给予应有的尊重。</p> +<p>我所欣赏的成功人士有一种特殊气质,我说不上来具体是什么特点,有点儿像反叛精神,又有点儿对手工技术的狂热。</p> +<p>这些人里对我影响比较大的是《黑客与画家》的作者 保罗·格雷厄姆(<a class="link" href="https://zh.wikipedia.org/zh-hans/%E4%BF%9D%E7%BD%97%C2%B7%E6%A0%BC%E9%9B%B7%E5%8E%84%E5%A7%86" target="_blank" rel="noopener" +>Paul Graham</a>)。</p> +<p>他创建了著名的 <a class="link" href="https://zh.wikipedia.org/zh-hans/Y_Combinator" target="_blank" rel="noopener" +>YC 孵化器公司</a>,也打造了很多成功的产品。</p> +<p>今天推荐的这篇文章<a class="link" href="https://blog.samaltman.com/how-to-be-successful" target="_blank" rel="noopener" +>《How To Be Successful》</a>的作者,是保罗·格雷厄姆非常推崇的一位创业者。</p> +<p>文章分享的观点乍看有成功学的影子,但读完却能引人思考。</p> +<p>这里是中文翻译版:<a class="link" href="https://mp.weixin.qq.com/s/pQYztNmmQ6W4fRxPIEsWYQ" target="_blank" rel="noopener" +>《观察成千上万创业者后,关于如何获得非凡成就的13条思考》</a></p> +<p>我觉得这些观点至少可以给长期埋头技术工作的人们一些启发,我稍微列举几条如下:</p> +<blockquote> +<ul> +<li>这个世界很少人能做到将眼光放长远,而那些有长远眼光的人会得到市场的丰厚回报。</li> +<li>把时间花在做正确的事上,比花长时间进行工作更重要。</li> +<li>跟着你的好奇心走。因为对你来说兴奋的事情对其他人来说也同样兴奋。</li> +<li>成为内驱型的人(即:自己去做一件事的原因来自于自己,而不是外部的力量或别人的期望)。</li> +</ul> +</blockquote> +<h3 id="怎样在客厅建立自己的私人影院">怎样在客厅建立自己的私人影院</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/2023-02-15-10-21-45.png" +width="841" +height="396" +loading="lazy" +class="gallery-image" +data-flex-grow="212" +data-flex-basis="509px" +> +智能电视或者智能盒子已成为现在客厅的标配。</p> +<p>如何充分发挥它们的作用,早已是技术爱好者的孜孜不倦探索的课题。</p> +<p>前些天我偶然收到一份公开的云盘链接,使用开源的 <a class="link" href="https://github.com/alist-org/alist" target="_blank" rel="noopener" +>AList</a>(一个支持网盘存储的文件列表程序,可以通过多种协议将网盘映射为本地访问的存储路径) 进行构建。里面整理了大量的影视资源,有不少是高质量、高码率的蓝光原盘文件。</p> +<p>这就激发了我的好奇心。</p> +<p>由于自己一直按耐住折腾 NAS 的念头,这些年一直没有收集电影。</p> +<p>但现在既然有在线的资源,不妨尝试一下。</p> +<p>于是我找到了这篇<a class="link" href="https://wp.gxnas.com/12278.html" target="_blank" rel="noopener" +>《利用KODI和云盘打造4K高清私人云影院》</a>(仅作研究,观影和收藏还需支持正版)。</p> +<p>按照文章的指导,成功给电视安装了 KODI(一个媒体中心 App),并进行了配置,可以非常方便地浏览、观看互联网云盘上的高清电影。</p> +<p>比起云盘官方所出品的各种 App 在体验上更加灵活、完美。</p> +<h3 id="噪声在计算机图形学里的作用">“噪声”在计算机图形学里的作用</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/2023-02-15-10-40-28.png" +width="671" +height="303" +loading="lazy" +class="gallery-image" +data-flex-grow="221" +data-flex-basis="531px" +> +想要计算机产生的图形更加的接近自然,生成各式各样的噪声是必不可少的算法。</p> +<p>之前在读<a class="link" href="https://natureofcode.com/" target="_blank" rel="noopener" +>《The Nature of Code》</a>(中文译作:代码本色)一书的时候,作者花了大量篇幅讲解关于噪声、随机等对于模拟自然界中各种现象的重要作用。</p> +<p>或许在噪声里就隐藏着大自然最深处的秘密。</p> +<p>这篇<a class="link" href="https://zhuanlan.zhihu.com/p/68507311" target="_blank" rel="noopener" +>WebGL进阶——走进图形噪声</a>可以让你领略一些图形噪声的神奇。</p> +<p>很多场景都给出了 WebGL 实现的源码,可以边学边练。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://threegn.app/" target="_blank" rel="noopener" +>ThreeGN</a>,一个基于网页的三维建模程序,特点是具有类似 Blender 的几何节点编辑功能。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/2023-02-15-10-51-53.png" +width="846" +height="453" +loading="lazy" +class="gallery-image" +data-flex-grow="186" +data-flex-basis="448px" +></p> +</li> +<li> +<p><a class="link" href="https://tabler-icons.io/" target="_blank" rel="noopener" +>tabler</a>,一个开源的图标库,可用于 Web 或 移动端应用开发,全部免费使用。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/2023-02-15-10-55-30.png" +width="796" +height="314" +loading="lazy" +class="gallery-image" +data-flex-grow="253" +data-flex-basis="608px" +></p> +</li> +<li> +<p><a class="link" href="https://microsoftedge.microsoft.com/addons/detail/%E6%B2%89%E6%B5%B8%E5%BC%8F%E7%BF%BB%E8%AF%91/amkbmndfnliijdhojkpoglbnaaahippg" target="_blank" rel="noopener" +>immersive-translate</a>,一个在线翻译浏览器插件,支持 Edge、Firefox、Chrome 等浏览器,优点是可以在网页上追加中文显示,原文和译文同时展示,对于想提升外语水平的人士,是个不错的对照工具。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/2023-02-15-10-59-08.png" +width="621" +height="357" +loading="lazy" +class="gallery-image" +data-flex-grow="173" +data-flex-basis="417px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 019 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/Tue, 07 Feb 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/<h1 id="机器文摘-第-019-期">机器文摘 第 019 期</h1> +<h2 id="长文">长文</h2> +<h3 id="现阶段-ai-能对游戏开发提供多大帮助">现阶段 AI 能对游戏开发提供多大帮助</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-13-19-34.png" +width="686" +height="358" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="459px" +> +AI 在最近有多爆发自然不用我再赘述,抛开那些狂热的能够引起焦虑的言论(比如 AI 即将替代大量工作岗位),也有不少人选择跟 AI 和平相处。</p> +<p>这篇<a class="link" href="https://www.traffickinggame.com/ai-assisted-graphics/" target="_blank" rel="noopener" +>《AI 辅助图形》</a>的作者是一个有着游戏制作二十年经验的从业者,近期想尝试尽可能地利用各种 AI 加持的辅助工具,试图通过他们提升制作效率。</p> +<p>作者从游戏的概念原型阶段,一直到三维模型资产的制作和游戏场景的搭建,均选用了具有 AI 能力的效率工具进行支持。</p> +<p>最终结论是,虽然在过程中会有这样那样的不顺手,但这些工具确实能够帮助他节约大量工作时长。</p> +<p>所以作者的看法是,他很愿意将 AI 工具看作他的同事。</p> +<p>照这么说的话,留给人类的工作真的是不多了。</p> +<h3 id="chatgpt-学习笔记">ChatGPT 学习笔记</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-13-32-44.png" +width="600" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="178" +data-flex-basis="427px" +> +ChatGPT 在春节后又起了一波热度。</p> +<p>网上到处都是关于它的段子,有人用它写论文,有人拿来给孩子辅导作业,有人写情书,有人当个动嘴的甲方让它写程序。</p> +<p>喜得微软恨不得现在就把它接到搜索引擎里,逼得谷歌提前释放出自己的类似模型。</p> +<p>国内的百度也表示将在3月份发出自己的大规模语言模型。</p> +<p>要我说就不要这么着急,不妨拨开迷雾,看看 ChatGPT 是个什么东东。</p> +<p>在网上发现这篇<a class="link" href="https://blog.csdn.net/v_JULY_v/article/details/128579457" target="_blank" rel="noopener" +>《ChatGPT 通俗笔记》</a>,讲述了这个模型的发展历程,以及一些基本的概念原理。</p> +<p>此类中文资料不多,给这篇文章作者点赞。</p> +<h3 id="视觉设计的一些规则">视觉设计的一些规则</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-13-49-28.png" +width="697" +height="357" +loading="lazy" +class="gallery-image" +data-flex-grow="195" +data-flex-basis="468px" +> +现在专业的界限越来越模糊,每个人都应该掌握一些基本的设计理念,以便在日常工作中输出的成果具备基本的美感。</p> +<p>这篇<a class="link" href="https://anthonyhobday.com/sideprojects/saferules/" target="_blank" rel="noopener" +>《视觉设计安全法则》</a>,浅显易读、明确具体,对于视觉设计活动很有指导意义。</p> +<p>看完之后无论是自己动手做 PPT 还是软件的 demo 原型,都可以用到。</p> +<p>我觉得甚至对于摄影构图、房屋装修都能有所借鉴,因为美是相通的。</p> +<h3 id="python-做后端开发的技术选型">Python 做后端开发的技术选型</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-13-57-37.png" +width="673" +height="314" +loading="lazy" +class="gallery-image" +data-flex-grow="214" +data-flex-basis="514px" +> +有时候想做一些 Web 应用的原型,Python 是我的首选语言,写起来顺手又省事,能节约不少时间。</p> +<p>但是由于用的不够深入,在选择开发框架的时候,稍微有些困惑。</p> +<p>比如同样都能提供快速的开发能力,Fastapi 和 Flask到底选哪个?</p> +<p>如果你也有跟我一样的疑惑,可以看看这篇<a class="link" href="https://www.turing.com/kb/fastapi-vs-flask-a-detailed-comparison" target="_blank" rel="noopener" +>《Fastapi 和 Flask 详细对比》</a>。</p> +<p>文章深度分析了这两个框架的异同以及所适用的工作场景。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://github.com/red-data-tools/YouPlot" target="_blank" rel="noopener" +>YouPlot</a>,控制台绘图工具,可以在控制台窗口用字符的方式进行绘图,支持柱状图、散点图等。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-14-10-37.png" +width="587" +height="355" +loading="lazy" +class="gallery-image" +data-flex-grow="165" +data-flex-basis="396px" +></p> +</li> +<li> +<p><a class="link" href="https://play-cs.com/zh/servers" target="_blank" rel="noopener" +>网页在线联机 CS1.6</a>,只需浏览器即可联机玩反恐精英 1.6,这个网站通过 WASM 技术将 CS 1.6 移植到了网页中运行,现代浏览器均可支持,第一次加载时间略长,但体验还算流畅,在线人员数量也挺多,随时可以匹配到。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-14-20-36.png" +width="811" +height="397" +loading="lazy" +class="gallery-image" +data-flex-grow="204" +data-flex-basis="490px" +></p> +</li> +<li> +<p><a class="link" href="https://fffuel.co/sssvg" target="_blank" rel="noopener" +>交互式 SVG 参考</a>,一个可以在线了解 SVG 图形标准细节的网站,提供交互式界面进行实时演示。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-14-25-38.png" +width="904" +height="428" +loading="lazy" +class="gallery-image" +data-flex-grow="211" +data-flex-basis="506px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/LunarFang416/url-animations" target="_blank" rel="noopener" +>浏览器地址栏里的动画</a>,一个有意思的 Js 库,通过动态修改浏览器地址栏的 URL 地址来实现动画,效果还比较萌。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-14-26-39.png" +width="757" +height="208" +loading="lazy" +class="gallery-image" +data-flex-grow="363" +data-flex-basis="873px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 018 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/Tue, 31 Jan 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/<h1 id="机器文摘-第-018-期">机器文摘 第 018 期</h1> +<h2 id="长文">长文</h2> +<h3 id="游戏高清重制科林麦克雷拉力赛3">游戏高清重制《科林麦克雷拉力赛3》</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-09-15-47.png" +width="857" +height="434" +loading="lazy" +class="gallery-image" +data-flex-grow="197" +data-flex-basis="473px" +> +游戏高清重制一直是我比较感兴趣的话题,可能因为比较喜欢怀旧吧。</p> +<p>我曾经收藏过采用覆盖显示驱动的方式进行高清分辨率支持的《极品飞车 5》、《Quake 3》等游戏。</p> +<p>也见过一些更古老的游戏在更新资源包之后重新焕发青春。</p> +<p>不过一直没有接触过真正的重制过程。</p> +<p>这篇<a class="link" href="https://cookieplmonster.github.io/2023/01/15/remastering-colin-mcrae-rally-3-silentpatch/" target="_blank" rel="noopener" +>《重制科林麦克雷拉力赛》</a>详细记录了一个优秀的赛车游戏进行高清重制的过程。</p> +<p>可以带你了解老旧游戏如何进行“宽屏”、“超宽屏”支持,如何重制高清界面UI元素等,过程充满了对不可能的挑战。</p> +<h3 id="把网页渲染到控制台">把网页渲染到控制台</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-09-24-01.png" +width="1067" +height="464" +loading="lazy" +class="gallery-image" +data-flex-grow="229" +data-flex-basis="551px" +> +通过控制台窗口进行上网,你可能觉得并不新鲜。</p> +<p>毕竟已经有很多类似 w3m 这种在控制台下基于字符的浏览器程序。</p> +<p>但是他们的缺点都是不能显示图形,而且几乎失去了对页面的样式渲染。</p> +<p>今天这篇<a class="link" href="https://fathy.fr/carbonyl" target="_blank" rel="noopener" +>《把网页渲染到控制台》</a>则另辟蹊径,虽然同样是在控制台的字符界面,但是渲染手段却大不相同。</p> +<p>它将控制台字符当作单个像素来处理,采用现代浏览器内核进行页面解析和预渲染计算。</p> +<p>然后在像素渲染阶段,采用了控制台字符来进行替换。</p> +<p>虽然最终效果无法跟图形界面下的浏览器相比。</p> +<p>但是它毕竟提供了一种在终端控制台进行图形化网页显示的可能。</p> +<h3 id="chromium-渲染流水线字节码到像素的一生">Chromium 渲染流水线——字节码到像素的一生</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-09-32-37.png" +width="481" +height="580" +loading="lazy" +class="gallery-image" +data-flex-grow="82" +data-flex-basis="199px" +> +看了前面网页渲染到控制台的文章,如果对浏览器的原理架构比较感兴趣的话。</p> +<p>可以看看这篇<a class="link" href="https://zhuanlan.zhihu.com/p/574069391" target="_blank" rel="noopener" +>讲解 Chromium 浏览器渲染架构</a>的文章。</p> +<p>现代浏览器已经复杂到不可能通过个人从零开始实现。</p> +<p>了解一下他们的架构,即便不从事相关开发,也可能对自己的软件架构产生有益影响。</p> +<h3 id="99-行代码实现光线追踪">99 行代码实现光线追踪</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-09-40-20.png" +width="702" +height="235" +loading="lazy" +class="gallery-image" +data-flex-grow="298" +data-flex-basis="716px" +> +光线追踪在图形渲染中十分关键的概念。</p> +<p>同时也是现代电影工业实现逼真光照渲染所必须的技术手段。</p> +<p>然而它的原理却并不复杂,甚至只需少量代码就可以自己实现一个建议的渲染器。</p> +<p>这篇<a class="link" href="http://kevinbeason.com/smallpt/" target="_blank" rel="noopener" +>《99 行代码实现光线追踪》</a>就只是用了少量 C++ 代码实现了一个简单的带有全局光照、阴影、反射的场景渲染。</p> +<p>虽然看起来简单,效果还是很令人惊艳的。</p> +<p>适合我这种喜欢研究原理,但又不太深入的“技术爱好者”。</p> +<h3 id="光线追踪深入">光线追踪深入</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-09-47-14.png" +width="731" +height="333" +loading="lazy" +class="gallery-image" +data-flex-grow="219" +data-flex-basis="526px" +> +既然前面提到了光线追踪,不妨再引申一下。</p> +<p>很多光线追踪的入门教程都会教你渲染一些简单的模型,比如球体,圆柱体等等。</p> +<p>如果想基于光线追踪技术渲染复杂一些的三维模型,应该怎么做?</p> +<p>这里有一篇<a class="link" href="https://jamie-wong.com/2016/07/15/ray-marching-signed-distance-functions/" target="_blank" rel="noopener" +>《光线行进和符号距离函数》</a>,里面介绍了基于光线行进算法(光线追踪的一种实现方式)和符号距离函数来构建三维场景中复杂模型的思路。</p> +<p>内容比较详细,并带有示例代码。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://www.chronophoto.app/game.html" target="_blank" rel="noopener" +>chronophoto</a>,一个猜照片年代的游戏,根据网站随机展示的老照片,来判断这张照片是哪一年拍摄的,答案区间 1900 到 2020 ,我试了试还挺有意思,可以根据照片中出现的物品和人物的衣着进行分析。<br> +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-09-56-50.png" +width="944" +height="432" +loading="lazy" +class="gallery-image" +data-flex-grow="218" +data-flex-basis="524px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/GimelStudio/GimelStudio" target="_blank" rel="noopener" +>Gimel Studio</a>,一个基于节点系统的照片后期处理工具,开源,采用 Python 编写。<br> +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-10-00-55.png" +width="1009" +height="537" +loading="lazy" +class="gallery-image" +data-flex-grow="187" +data-flex-basis="450px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/vitoplantamura/BugChecker" target="_blank" rel="noopener" +>BugChecker</a>,一个支持 Windows 11 的类 SoftICE 调试器,开源。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-10-04-14.png" +width="649" +height="376" +loading="lazy" +class="gallery-image" +data-flex-grow="172" +data-flex-basis="414px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/google/swiftshader" target="_blank" rel="noopener" +>swiftshader</a>,一个基于 CPU 实现 OpenGL 渲染的图形库。主要应用在谷歌开源的 chromium 项目里,用纯软件算法实现了OpenGL、Vulkan图形接口。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-10-08-42.png" +width="308" +height="307" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 017 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/Mon, 16 Jan 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/<h1 id="机器文摘-第-017-期">机器文摘 第 017 期</h1> +<p><em>预计春节期间暂停更新,节后恢复。</em></p> +<h2 id="长文">长文</h2> +<h3 id="怎样在-1-位色深的-lcd-屏幕上显示灰度httpswwwzephraymepostgrayscale_lcd"><a class="link" href="https://www.zephray.me/post/grayscale_lcd/" target="_blank" rel="noopener" +>怎样在 1 位色深的 LCD 屏幕上显示灰度</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-09-33-34.png" +width="1920" +height="1080" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +> +只有 1 位色深的 LCD 屏幕按理说是不能显示灰度的,因为他的像素点要么纯黑、要么纯白,显示的图案效果肯定非常差。</p> +<p>如果说非要显示灰度的话,我第一个想法是通过<a class="link" href="https://zh.wikipedia.org/wiki/%E6%8A%96%E5%8B%95_%28%E6%95%B8%E4%BD%8D%E8%A8%8A%E8%99%9F%E8%99%95%E7%90%86%29" target="_blank" rel="noopener" +>抖动算法</a>进行模拟(即通过像素点的稀疏程度来制造错觉,如下图)。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-09-40-49.png" +width="180" +height="215" +loading="lazy" +class="gallery-image" +data-flex-grow="83" +data-flex-basis="200px" +></p> +<p>然而这篇文章的作者采取了更为巧妙地方法,使用 PWM (脉冲宽度调制)技术,利用每个像素点的点亮时间不同来制造灰度错觉。</p> +<p>之前只是见过使用 PWM 调整 LED 灯泡的亮度,像这种用法我倒是第一次见。</p> +<h3 id="作为一名数据工程师和作家我为什么要用-neovimhttpswwwsspaeticomblogwhy-using-neovim-data-engineer-and-writer-2023"><a class="link" href="https://www.sspaeti.com/blog/why-using-neovim-data-engineer-and-writer-2023/" target="_blank" rel="noopener" +>作为一名数据工程师和作家,我为什么要用 (Neo)vim</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-09-44-27.png" +width="500" +height="264" +loading="lazy" +class="gallery-image" +data-flex-grow="189" +data-flex-basis="454px" +></p> +<p>很多人都被 Vim 复杂的功能和陡峭的学习曲线吓到过。</p> +<p>也有很多人本着对效率的极致追求,而选择了征服 Vim,从而走上高效(折腾)的路线。</p> +<p>本文作者作为一名数据工程师,讲述了他学习 Vim 的心路历程,也许对于现在还在观望的人有所启发。</p> +<p>我个人使用 Vim 已十多年时间,虽然从未触及特别深入的技能(如宏定义、寄存器等),但是 Vim 这种神器的特点就是,只要你忍者难受越过操作的及格线,剩下的技能你稍微多掌握一点,就能马上给你带来非常丰厚的回报。</p> +<h3 id="焦散是什么如何正确地渲染焦散httpswwwchaoscomcnblogwhat-are-caustics-and-how-to-render-them-the-right-way"><a class="link" href="https://www.chaos.com/cn/blog/what-are-caustics-and-how-to-render-them-the-right-way" target="_blank" rel="noopener" +>焦散是什么?如何正确地渲染焦散?</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-09-55-28.png" +width="850" +height="469" +loading="lazy" +class="gallery-image" +data-flex-grow="181" +data-flex-basis="434px" +> +焦散(Caustics)在现实生活中随处可见,但在渲染图中却很稀有。这篇文章解答了为什么渲染焦散很难,以及有哪些方法可以迂回实现。</p> +<p>找到这篇文章是因为我在 Github 上发现了<a class="link" href="https://github.com/pmndrs/drei#caustics" target="_blank" rel="noopener" +>一个使用 webgl 实现焦散渲染的项目</a>,效果非常不错,于是想研究一下背后的原理。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-10-02-22.png" +width="652" +height="339" +loading="lazy" +class="gallery-image" +data-flex-grow="192" +data-flex-basis="461px" +></p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://refactoringguru.cn/design-patterns" target="_blank" rel="noopener" +>常用设计模式有哪些</a>,一本在线电子书,图文并茂,以比较直观的方式介绍了软件开发常用的设计模式,支持英文、日文、中文等多国语言。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-10-04-26.png" +width="673" +height="357" +loading="lazy" +class="gallery-image" +data-flex-grow="188" +data-flex-basis="452px" +></p> +</li> +<li> +<p><a class="link" href="https://abseil.io/resources/swe-book/html/toc.html" target="_blank" rel="noopener" +>谷歌的软件工程</a>,好几年前的一本书,讲述在谷歌做软件开发的体验和最佳实践,现在出了可免费阅读的电子版。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-10-04-41.png" +width="504" +height="662" +loading="lazy" +class="gallery-image" +data-flex-grow="76" +data-flex-basis="182px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/ToolJet/ToolJet" target="_blank" rel="noopener" +>开源低代码开发框架 ToolJet</a>,免费开源的低代码开发框架,带有可视化编辑器,从数据持久化到前端界面全部无需编写代码。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-10-08-12.png" +width="795" +height="414" +loading="lazy" +class="gallery-image" +data-flex-grow="192" +data-flex-basis="460px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/Eandrju/cellular-automaton.nvim" target="_blank" rel="noopener" +>一个无聊的 Neovim 插件</a>,一个没啥用的 Neovim 插件,唯一能做的事情是当你感到无聊时,可以将你的文本编辑区里的文本执行一个“元胞自动机”动画,看起来还算解压。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-10-11-33.png" +width="547" +height="614" +loading="lazy" +class="gallery-image" +data-flex-grow="89" +data-flex-basis="213px" +></p> +</li> +<li> +<p><a class="link" href="https://www.futurepedia.io/" target="_blank" rel="noopener" +>最大的 AI 工具箱</a>,喜欢研究 AI 的不要错过这个网站,收集了各种 AI 模型的开源项目和相关网址,涵盖了图像识别、自然语言处理等常见的、时兴的 AI 技术。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-10-15-15.png" +width="1151" +height="729" +loading="lazy" +class="gallery-image" +data-flex-grow="157" +data-flex-basis="378px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 016 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/Tue, 10 Jan 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/<h1 id="机器文摘-第-016-期">机器文摘 第 016 期</h1> +<h2 id="长文">长文</h2> +<h3 id="黑客与汽车httpssamcurrynetweb-hackers-vs-the-auto-industry"><a class="link" href="https://samcurry.net/web-hackers-vs-the-auto-industry/" target="_blank" rel="noopener" +>黑客与汽车</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-13-16-50.png" +width="680" +height="414" +loading="lazy" +class="gallery-image" +data-flex-grow="164" +data-flex-basis="394px" +> +现在的汽车很多都具有联网的能力,可以通过互联网进行便利的远程操作。</p> +<p>比如获取汽车位置、健康状态、远程启动、远程开门等等。</p> +<p>作为消费者来说,在使用这些便利功能的时候,内心是十分信任厂商的。</p> +<p>觉得安全问题肯定会被厂商非常重视,作为头号问题来抓。</p> +<p>然而这篇<a class="link" href="https://samcurry.net/web-hackers-vs-the-auto-industry/" target="_blank" rel="noopener" +>《黑客与汽车》</a>却改变了我的看法,原来这些车联网的安全防护如此的脆弱。</p> +<p>文章作者为业内人士,写的还比较实在。如下列举部分这些黑客可以对车进行的未授权操作:</p> +<ol> +<li>远程发动机启停、车门解锁与锁定、大灯闪烁、喇叭鸣笛;</li> +<li>锁定用户,迁移管理权;</li> +<li>根据车架号下载到用户的销售档案;</li> +<li>远程刷新更新车辆电脑固件;</li> +<li>跟踪车辆物理GPS位置;</li> +</ol> +<p>看完我感觉是不是得把我的相关车联网服务给停一停了。</p> +<h3 id="汇编代码阅读指南httpswwwtimdbgcompostsfakers-guide-to-assembly"><a class="link" href="https://www.timdbg.com/posts/fakers-guide-to-assembly/" target="_blank" rel="noopener" +>汇编代码阅读指南</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-13-30-23.png" +width="1061" +height="636" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="400px" +> +写汇编代码很麻烦,阅读起来也很费劲吗?</p> +<p>这儿有<a class="link" href="https://www.timdbg.com/posts/fakers-guide-to-assembly/" target="_blank" rel="noopener" +>一份简要的汇编阅读指南</a>,作者介绍了一些汇编代码的阅读技巧。</p> +<p>因为根据统计显示,最常用的汇编指令也就那么十来个,所以并没有想象中的那么晦涩和高深莫测。</p> +<h3 id="使用-svg-绘制逼真的绳索httpsmuffinmanioblogdraw-svg-rope-using-javascript"><a class="link" href="https://muffinman.io/blog/draw-svg-rope-using-javascript/" target="_blank" rel="noopener" +>使用 SVG 绘制逼真的绳索</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-13-38-11.png" +width="786" +height="342" +loading="lazy" +class="gallery-image" +data-flex-grow="229" +data-flex-basis="551px" +> +SVG 是在网页中进行矢量绘图的技术,比起 Canvas 画板的像素图像,SVG 具有放大不失真的特点,在网页中可以通过 Javascript 操作生成 SVG 图形对象,实现各种复杂的图案。</p> +<p>这篇文章的作者从几何的角度考虑了如何使用矢量图形来绘制一个现实中的麻绳图案,要不仅体现出绳索的扭曲,还要正确表现绳索分支之间的叠压,作者提出了一个巧妙的使用 SVG path 进行实现的方法。还给出了代码。</p> +<p>你要问作者为什么这么做,有什么用没有?我想作者可能会回答:Because I can !</p> +<h3 id="ssh-进阶用法介绍httpsplantegggithubio20190602e58fb2e4b88ae69c80e585a8_ssh_e69a97e9bb91e68a80e5b7a7e8afa6e8a7a3--e694b6e8978fe4bf9de5b9b3e5ae89"><a class="link" href="https://plantegg.github.io/2019/06/02/%E5%8F%B2%E4%B8%8A%E6%9C%80%E5%85%A8_SSH_%E6%9A%97%E9%BB%91%E6%8A%80%E5%B7%A7%E8%AF%A6%E8%A7%A3--%E6%94%B6%E8%97%8F%E4%BF%9D%E5%B9%B3%E5%AE%89/" target="_blank" rel="noopener" +>SSH 进阶用法介绍</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-13-55-02.png" +width="800" +height="480" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="400px" +></p> +<p>经常在 Linux 系统下进行开发或者运维的专业人士,可能每天使用最多的工具就是 SSH 了,每天都要通过它登录服务端系统,进行一系列的操作。</p> +<p>这里<a class="link" href="https://plantegg.github.io/2019/06/02/%E5%8F%B2%E4%B8%8A%E6%9C%80%E5%85%A8_SSH_%E6%9A%97%E9%BB%91%E6%8A%80%E5%B7%A7%E8%AF%A6%E8%A7%A3--%E6%94%B6%E8%97%8F%E4%BF%9D%E5%B9%B3%E5%AE%89/" target="_blank" rel="noopener" +>有一篇文章</a>比较全面地介绍了 SSH 的进阶使用技巧,可以在某种程度上极大提升效率以及操作体验。</p> +<p>列举部分如下:</p> +<ol> +<li>如何免密码登录;</li> +<li>如何映射服务端的服务端口到本地(以方便调试);</li> +<li>如何将服务端的图形界面(如xcalc)代理到本地电脑显示和交互(不是远程桌面哦);</li> +<li>一些网络端口映射之类的高级操作;</li> +</ol> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://gist.github.com/sbabybird/c340dee0fbec2e1dfe4a1c49d311cf4b" target="_blank" rel="noopener" +>个人年终总结模板</a>,我做了一个基于 Markdown 语法的年终总结模板,方便梳理在编写个人总结时的思路,放在 github 上的 gist 里了,可以随意使用。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-13-57-40.png" +width="416" +height="486" +loading="lazy" +class="gallery-image" +data-flex-grow="85" +data-flex-basis="205px" +></p> +</li> +<li> +<p><a class="link" href="https://www.webdesignmuseum.org/" target="_blank" rel="noopener" +>web 网页设计博物馆</a>,一个保存古老网页设计的网站。记录了 1999 年到 2020 年各大公司的网页设计变迁。包括谷歌、亚马逊、苹果、任天堂、麦当劳等等。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-14-01-04.png" +width="918" +height="568" +loading="lazy" +class="gallery-image" +data-flex-grow="161" +data-flex-basis="387px" +></p> +</li> +<li> +<p><a class="link" href="https://allinone.tools/" target="_blank" rel="noopener" +>一站式网页工具大全</a>,一堆的在线工具汇总,包括图片处理、PDF格式转换、文字编码转换、密码生成、字符串加密解密等等,常用工具一网打尽。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-14-05-09.png" +width="1320" +height="570" +loading="lazy" +class="gallery-image" +data-flex-grow="231" +data-flex-basis="555px" +></p> +</li> +<li> +<p><a class="link" href="https://gamepad-tester.com/" target="_blank" rel="noopener" +>在线手柄测试工具</a>,打开网页即可测试游戏手柄的工作状态,按键是否灵敏,遥感是否有死区等等,非常方便。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-14-11-28.png" +width="930" +height="614" +loading="lazy" +class="gallery-image" +data-flex-grow="151" +data-flex-basis="363px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 015 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/Tue, 03 Jan 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/<h1 id="机器文摘-第-015-期">机器文摘 第 015 期</h1> +<h2 id="长文">长文</h2> +<h3 id="编程就是玩儿httpsaustinhenleycomblogprogrammingasplayhtml"><a class="link" href="https://austinhenley.com/blog/programmingasplay.html" target="_blank" rel="noopener" +>编程就是玩儿</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-13-43-13.png" +width="804" +height="355" +loading="lazy" +class="gallery-image" +data-flex-grow="226" +data-flex-basis="543px" +></p> +<p>对于程序员或者技术从业者来说,以一种什么样的心态工作将十分影响成果的产出。</p> +<p><a class="link" href="https://austinhenley.com/blog/programmingasplay.html" target="_blank" rel="noopener" +>这篇文章</a>的作者给大家分享了他自己的感受&mdash;-“不把编程视为严肃的工作、目标只是玩得开心、为了好玩而编程”。</p> +<p>他同时也是 <a class="link" href="https://news.ycombinator.com/item?id=27256867" target="_blank" rel="noopener" +>《为什么我喜欢做无用的东西》</a>帖子的作者。</p> +<p>除了文章本身之外,<a class="link" href="https://news.ycombinator.com/item?id=34086416" target="_blank" rel="noopener" +>在 HN 配套的讨论帖子在这里</a>。</p> +<p>这种类似于“寓教于乐”、“做自己开心的事儿”等等内容,一直是一个值得探讨的话题。</p> +<p>我个人也倾向于以兴趣和爱好来驱动自己,只是如果这个兴趣和爱好顺便能够挣钱,那就更好了。</p> +<h3 id="webassembly没有容器的-dockerhttpswasmlabsdevarticlesdocker-without-containers"><a class="link" href="https://wasmlabs.dev/articles/docker-without-containers/" target="_blank" rel="noopener" +>WebAssembly:没有容器的 Docker</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-13-45-15.png" +width="3483" +height="1436" +loading="lazy" +class="gallery-image" +data-flex-grow="242" +data-flex-basis="582px" +></p> +<p>最近 <a class="link" href="https://www.docker.com" target="_blank" rel="noopener" +>Docker</a> 宣布与 <a class="link" href="https://github.com/WasmEdge/Wasmedge" target="_blank" rel="noopener" +>WasmEdge</a> 合作支持 WebAssembly 。</p> +<p>WebAssembly 和 Docker 我们都听说过,在前面的文摘中我还尝试过自己使用 Rust 编写运行在网页里的 WebAssembly 应用程序。</p> +<p>Docker 也是我工作中每天都要用到的容器技术。</p> +<p>那他们两个有什么关系?放在一起能碰撞出什么火花?</p> +<p><a class="link" href="https://wasmlabs.dev/articles/docker-without-containers/" target="_blank" rel="noopener" +>这篇文章</a>将讲解这两种技术的结合在云原生架构下的使用。</p> +<p>看来 WebAssembly 技术不仅可以在浏览器环境中发挥作用,还能在云计算、边缘计算等领域发光发热,前途不可限量嘛。</p> +<h3 id="3d-摄影测量建模技术httpswwwjeffgeerlingcomblog2021modeling-my-grandpa-3d-photogrammetry"><a class="link" href="https://www.jeffgeerling.com/blog/2021/modeling-my-grandpa-3d-photogrammetry" target="_blank" rel="noopener" +>3D 摄影测量建模技术</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-13-58-29.png" +width="712" +height="340" +loading="lazy" +class="gallery-image" +data-flex-grow="209" +data-flex-basis="502px" +></p> +<p>3D 摄影测量建模,是一种通过对物体多角度拍摄照片,然后使用计算机通过软件算法合成为 3D 模型的技术。</p> +<p>从最开始在专业领域(如:建筑工程、考古)使用,到现在已经普及到普通人只需安装手机 App 也能轻松实现了。</p> +<p>这篇<a class="link" href="https://www.jeffgeerling.com/blog/2021/modeling-my-grandpa-3d-photogrammetry" target="_blank" rel="noopener" +>用3D摄影测量法对我的爷爷建模</a>记述了作者如何使用 3D 摄影测量建模技术给自己爷爷的雕像进行“数字化”的过程。</p> +<p>里面详细记录了整个过程所使用的开源软件和相关的配置细节。</p> +<p>对于一些想要进行一次实操演练的朋友来说可能有用。</p> +<h3 id="在-2d-游戏中如何模拟-3d-的光影效果httpswwwgamedevelopercomprogramminggraveyard-keeper-how-the-graphics-effects-are-made"><a class="link" href="https://www.gamedeveloper.com/programming/graveyard-keeper-how-the-graphics-effects-are-made" target="_blank" rel="noopener" +>在 2D 游戏中如何模拟 3D 的光影效果</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-14-14-17.png" +width="454" +height="265" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="411px" +></p> +<p>《守墓人》是一款经典的 2D 角色扮演游戏,比起它的精彩剧情和有趣的玩法,出色的画面效果也是该游戏取得成功的重要原因。</p> +<p>这篇<a class="link" href="https://www.gamedeveloper.com/programming/graveyard-keeper-how-the-graphics-effects-are-made" target="_blank" rel="noopener" +>《守墓人的图形效果是如何制作的》</a>文章,由该游戏的核心开发者于 2018 年发表,讲述了很多关于实现在 2D 画面带来更加有立体光影效果的特殊技巧。</p> +<p>文章虽然老了一点,但是技术没有过时。</p> +<p>读进去可以深深体会到:一个优秀作品的创造,离不开对各种不可能的挑战和极限的突破。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://bluemaxima.org/flashpoint/" target="_blank" rel="noopener" +>Flash 游戏大全</a>,上一期里我摘录了一个关于复刻 Flash 游戏的故事。后来也勾起了我对于 Flash 小游戏的怀念。便深入探索了一下现在这个阶段该如何再去运行那些老游戏。Flashpoint 是一个 Web 游戏保存工程,号称已经累计保存了包括 Flash 在内的 35 个平台的超过十万个小游戏。这个工程在 2018 年 1 月启动,试图在 Flash 消亡之前将之前的经典内容进行备份。现在提供两种版本的下载包,一种全量下载的大概 1.3 TB,包含了全部游戏。一种增量下载的,700多MB,只带了部分游戏,但是支持随下随玩。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-14-33-07.png" +width="1001" +height="382" +loading="lazy" +class="gallery-image" +data-flex-grow="262" +data-flex-basis="628px" +></p> +</li> +<li> +<p><a class="link" href="https://sweetcocoa.github.io/pop2piano_samples/" target="_blank" rel="noopener" +>根据音频自动生成钢琴旋律</a>,一个开源的 AI 模型,可以根据歌曲的音频识别出里面的旋律主线,并且使用钢琴演奏出来,效果十分神奇。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-14-41-36.png" +width="741" +height="456" +loading="lazy" +class="gallery-image" +data-flex-grow="162" +data-flex-basis="390px" +></p> +</li> +<li> +<p><a class="link" href="https://virtualconsoles.com/online-emulators/c64/" target="_blank" rel="noopener" +>C64 Emulator</a>,一个在线的 commodore 64 电脑模拟器,可以直接将磁盘镜像拖拽到网页上进行加载,页面还提供了虚拟键盘。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-14-44-02.png" +width="643" +height="733" +loading="lazy" +class="gallery-image" +data-flex-grow="87" +data-flex-basis="210px" +></p> +</li> +<li> +<p><a class="link" href="https://shadiao.pro/" target="_blank" rel="noopener" +>沙雕 App</a>,收集了各种有趣网站、工具的导航站,之前就关注过,最近好像升级了,喜欢恶搞的同学可以到里面找到一些比较有恶趣味的小程序。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-14-47-42.png" +width="676" +height="371" +loading="lazy" +class="gallery-image" +data-flex-grow="182" +data-flex-basis="437px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 014 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/Tue, 27 Dec 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/<h1 id="机器文摘-第-014-期">机器文摘 第 014 期</h1> +<h2 id="长文">长文</h2> +<h3 id="运行在单片机上的-qthttpsdecovardevblog20221224qt-on-mcu"><a class="link" href="https://decovar.dev/blog/2022/12/24/qt-on-mcu/" target="_blank" rel="noopener" +>运行在单片机上的 Qt</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-13-43-13.png" +width="684" +height="456" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="360px" +></p> +<p>尝试过给单片机写图形界面没有?</p> +<p>这篇 <a class="link" href="https://decovar.dev/blog/2022/12/24/qt-on-mcu/" target="_blank" rel="noopener" +>《Qt on MCU》 </a>比较系统的介绍了“为什么选择 Qt(一套开源图形界面库) 给单片机做界面”、“Qt 的基本架构”、“程序移植性”等相关问题。</p> +<p>读完可以较为全面地了解在单片机这种机能较弱的硬件设备上制作图形界面的基本思路和需要关注的问题。</p> +<h3 id="openwrtlede-搭建-syncthing-p2p-私有文件同步服务httpschenhemepostopenwrt-syncthing"><a class="link" href="https://chenhe.me/post/openwrt-syncthing/" target="_blank" rel="noopener" +>OpenWrt/LEDE 搭建 Syncthing p2p 私有文件同步服务</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-13-56-50.png" +width="1251" +height="730" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="411px" +></p> +<p>现在大家都不止一个电子终端设备,个人数字信息、各种数据文件的同步需求基本上是一个刚需。</p> +<p>有很多厂商提供了收费方案,比较常见的有国内的各种网盘、手机厂商提供的各种 Cloud 服务等等。</p> +<p>如果想基于家庭网络自己动手搭建一个私有服务的话,可能略微麻烦一些,不过也有较为成熟的方案了。</p> +<p>条件具备的话不妨参考这篇<a class="link" href="https://chenhe.me/post/openwrt-syncthing/" target="_blank" rel="noopener" +>《OpenWrt/LEDE 搭建 Syncthing p2p 私有文件同步服务》</a>动手试一试。</p> +<h3 id="用-flash-高清重制一款游戏httpswwwjiqizhixincomarticles2022-12-22-2"><a class="link" href="https://www.jiqizhixin.com/articles/2022-12-22-2" target="_blank" rel="noopener" +>用 Flash 高清重制一款游戏</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-13-58-23.png" +width="600" +height="338" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></p> +<p>Flash 基本已经成为历史了。</p> +<p>即便现在可以通过一些渠道或者浏览器勉强开启 Flash 插件的话,也会提心掉胆地担心计算机的安全性。</p> +<p>毕竟那些恼人的弹窗广告有 80% 都是靠 Flash 技术实现的。</p> +<p>但是还有这么一群人,他们玩着 4399 上的小游戏长大,80 后喜欢的各种主机游戏在他们眼里根本不值一提,倒是网页上那种基于 Flash 制作的即开即玩的小游戏(比如我能想到的就有:黄金矿工、狂扁小朋友、打企鹅等等)才是他们的最爱。</p> +<p>Flash 技术被时代抛弃,那些 4399 们也就逐渐消失了。</p> +<p>不过总有人会拥抱情怀,这篇<a class="link" href="https://www.jiqizhixin.com/articles/2022-12-22-2" target="_blank" rel="noopener" +>《为拯救童年回忆,开发者决定采用古法编程》</a>便讲述了这样一个故事。</p> +<p>里面的哥们儿以极其硬核的方式实现了他的梦想,为了复刻一个 Flash 小游戏,他几乎重新写了一个 Flash 播放器。</p> +<h3 id="unix-终端系统tty是如何工作的httpswaynervcompostshow-tty-system-works"><a class="link" href="https://waynerv.com/posts/how-tty-system-works/" target="_blank" rel="noopener" +>Unix 终端系统(TTY)是如何工作的</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-14-09-23.png" +width="2560" +height="2272" +loading="lazy" +class="gallery-image" +data-flex-grow="112" +data-flex-basis="270px" +></p> +<p>没有使用过大型机而直接进入 PC 时代的计算机用户,可能觉得“终端”就是电脑上那个能够输入 CMD 命令的黑乎乎窗口吧。</p> +<p>即便是终日与命令行打交道的软件开发人员、系统运维人员,可能也很难一下子解释清楚什么是“终端”,它为什么叫这个名字。</p> +<p>这篇<a class="link" href="https://waynerv.com/posts/how-tty-system-works/" target="_blank" rel="noopener" +>《Unix 终端系统(TTY)是如何工作的》</a>从计算机硬件发展的历史出发,介绍了计算机系统跟用户交互的发展历程,并针对“终端”系统进行详细展开,讲解了实现原理和后来发展的现代形态。</p> +<p>喜欢硬核知识的朋友可点进去阅读一下。</p> +<h3 id="hn-讨论极大提升你效率的软件有哪些httpsnewsycombinatorcomitemid34069106"><a class="link" href="https://news.ycombinator.com/item?id=34069106" target="_blank" rel="noopener" +>HN 讨论:极大提升你效率的软件有哪些?</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-14-16-52.png" +width="776" +height="403" +loading="lazy" +class="gallery-image" +data-flex-grow="192" +data-flex-basis="462px" +></p> +<p>哪些软件最能节约你的时间、解放你的双手、使你离不开它?</p> +<p>这个话题几乎每过一段时间就会被拿出来讨论一番。</p> +<p>每个人都有自己的偏爱。</p> +<p>不过,看看大家的讨论,说不定也能发现一些新鲜的软件,也许能更新一下自己的工具库也说不定。</p> +<blockquote> +<p>比如上面这篇帖子里,楼主提到的 <a class="link" href="https://github.com/BurntSushi/xsv" target="_blank" rel="noopener" +>这个 csv 工具</a> ,可以在命令行让你高效对 csv 文件进行快速检索、合并查询、切片等等。 +不过帖子里可能有人把节奏带偏了,在下面大吹特吹各种 IDE 软件,就仁者见仁了。</p> +</blockquote> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://huili.github.io/" target="_blank" rel="noopener" +>SQlite源码分析</a>,一本讲解 SQlite 源码的在线电子书,主要对 SQLite 数据库的实现机制和使用方法做了简要分析。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-14-25-49.png" +width="804" +height="424" +loading="lazy" +class="gallery-image" +data-flex-grow="189" +data-flex-basis="455px" +></p> +</li> +<li> +<p><a class="link" href="https://retrogame.com.ua/2022/03/moarstalgia-windows-98-3dfx-amp-dos-retro-gaming-pack/" target="_blank" rel="noopener" +>经典复古 win98 游戏合集</a>,一个游戏整合包,里面整合了若干在 Win98 系统下才能跑的老游戏,像初代的雷神之锤、半条命、极品飞车等等。提供了基于 DosBox 的虚拟系统,即开即用,性能还不错。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-14-33-08.png" +width="656" +height="387" +loading="lazy" +class="gallery-image" +data-flex-grow="169" +data-flex-basis="406px" +></p> +</li> +<li> +<p><a class="link" href="http://www.doshaven.eu/programming-tools/" target="_blank" rel="noopener" +>DOS 系统下的编程工具合集</a>,想要重温在 DOS 环境下编程的感受,这里有一套比较全面的工具合集,包括 QBASIC、TurboC 等开发环境,以及一些用于游戏开发的图形库、引擎。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-14-59-31.png" +width="908" +height="527" +loading="lazy" +class="gallery-image" +data-flex-grow="172" +data-flex-basis="413px" +></p> +</li> +<li> +<p><a class="link" href="https://humanbenchmark.com/dashboard" target="_blank" rel="noopener" +>给你自己跑个分</a>,现在一些硬件评测动不动就使用软件进行跑分,用以展示硬件之间的形成差异,这个网站提供了一组小游戏,可以考验你的短期记忆力、反应能力,并给你打分。也试试给自己跑个分吧。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-15-05-15.png" +width="900" +height="511" +loading="lazy" +class="gallery-image" +data-flex-grow="176" +data-flex-basis="422px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 012 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/Tue, 13 Dec 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/<h1 id="机器文摘-第-012-期">机器文摘 第 012 期</h1> +<h2 id="长文">长文</h2> +<h3 id="github-登录被第三方网站滥用了吗">Github 登录被第三方网站滥用了吗?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-13-30-19.png" +width="494" +height="491" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="241px" +> +为了方便账号注册,现在很多网站都提供了基于 Github 账号登录的方式。</p> +<p>我个人也更倾向于使用这种方式登录。</p> +<p>毕竟可以少填一些注册信息,减少思考密码的麻烦。</p> +<p>但是这样做有什么安全问题没有?</p> +<p>上周有一个<a class="link" href="https://news.ycombinator.com/item?id=33917962" target="_blank" rel="noopener" +>在 HackerNews 上的帖子</a>,有人遇到了在使用 Github 账号登录某些网站之后,导致他的账号莫名给别的仓库添 Star 的情况。</p> +<p>这引发了大家关于 Github 账号权限管理以及通过第三方鉴权进行账号登录和注册的讨论。</p> +<p>看完觉得在第三方鉴权授权时还是应该慎重使用才好。</p> +<h3 id="每个黑客都知道的命令行快捷键">每个黑客都知道的命令行快捷键</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-13-41-23.png" +width="926" +height="636" +loading="lazy" +class="gallery-image" +data-flex-grow="145" +data-flex-basis="349px" +> +在图形化界面、触控操作交互界面已经十分普及的今天,普通用户可能现在很少能接触到命令行操作了。</p> +<p>但是对于软件开发者、IT运维工程师来说,命令行还是属于离不开的操作界面。</p> +<p>而且对于有些工作任务来说,使用命令行完成起来要更加高效。</p> +<p><a class="link" href="https://www.masteringemacs.org/article/keyboard-shortcuts-every-command-line-hacker-should-know-about-gnu-readline" target="_blank" rel="noopener" +>这篇文章</a>讲解了常见命令行交互时的一些快捷操作,比如常见的行内编辑、快速移动光标到命令开头、历史记录搜索等等。</p> +<p>掌握之后可以在各种命令行交互界面中进行使用(基本风格一致)。</p> +<h3 id="基于颜色循环的动画技术">基于颜色循环的动画技术</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-13-54-06.png" +width="509" +height="383" +loading="lazy" +class="gallery-image" +data-flex-grow="132" +data-flex-basis="318px" +> +在计算机硬件资源匮乏的上世纪 90 年代,开发人员为了在有限条件下实现丰富的效果真是挖空心思。</p> +<p>比如,还记得 Windows 98 的启动画面吗?</p> +<p>蓝天白云,Windows 徽标,底部有一个蓝色的渐变色条,在缓慢的滚动。</p> +<p>实际上它只是一幅图片,并非多帧动画。</p> +<p>这就用到了一个叫做<a class="link" href="https://en.wikipedia.org/wiki/Color_cycling" target="_blank" rel="noopener" +>“颜色循环”</a>的技术。</p> +<blockquote> +<p>来自维基百科:颜色循环,也称为调色板移动,是计算机图形学中使用的一种技术,其中颜色被更改以产生动画的假象。这种技术主要用于早期的电脑游戏,因为存储一个图像并更改其调色板比将动画存储为几帧需要更少的内存和处理器能力。</p> +</blockquote> +<p><a class="link" href="http://www.effectgames.com/effect/article-Old_School_Color_Cycling_with_HTML5.html" target="_blank" rel="noopener" +>这里有个博客</a>使用 HTML Canvas 复刻了一批采用颜色循环创作的作品,效果非常惊艳。</p> +<p>另外网站还开源了用于展示这些作品的图形引擎,虽然现在已经不再维护了,但是用于学习和探索还是很有研究意义。</p> +<h3 id="软件逆向工程入门">软件逆向工程入门</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-14-06-08.png" +width="716" +height="442" +loading="lazy" +class="gallery-image" +data-flex-grow="161" +data-flex-basis="388px" +> +软件的加密和破解在普通用户眼里十分神秘。</p> +<p>这篇<a class="link" href="https://to-be-deleted-in-2022.emily.st/2015/01/27/reverse-engineering/" target="_blank" rel="noopener" +>软件逆向工程入门</a>比较深入浅出地介绍了一些常用手法,跟着作者可以浅尝一下在内存中寻找注册号、修改汇编指令以使得软件保护失效等体验。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="http://nifty.stanford.edu/" target="_blank" rel="noopener" +>计算机课后作业</a>,斯坦福大学计算机专业评选的历年来优秀作业作品。如果不知道自己编程需要练习什么的话,可以打开参考参考,很有实用价值,比起在 Leecode 上刷算法的题目,这些作业都在解决实际问题。</p> +</li> +<li> +<p><a class="link" href="https://scholar.archive.org/" target="_blank" rel="noopener" +>互联网档案学术</a>,全文检索索引包含超过2500万的研究文章和其他保存在互联网档案馆里的学术文档。 该馆藏涵盖从18世纪期刊的数字化副本,到最新的Open Access会议记录和从万维网上抓取的预印本。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-14-19-26.png" +width="1113" +height="507" +loading="lazy" +class="gallery-image" +data-flex-grow="219" +data-flex-basis="526px" +></p> +</li> +<li> +<p><a class="link" href="https://playcanvas.com/" target="_blank" rel="noopener" +>PlayCanvas Web 优先的游戏引擎</a>,一个免费的游戏引擎,倡导以 Web 优先,在网页中提供从开发到发行的全部流程支持。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-14-23-40.png" +width="961" +height="655" +loading="lazy" +class="gallery-image" +data-flex-grow="146" +data-flex-basis="352px" +></p> +</li> +<li> +<p><a class="link" href="https://asciinema.org/" target="_blank" rel="noopener" +>命令行会话记录器</a>,Asciinema 是一个免费开源软件,用于帮助用户录制在命令行中的操作行为,便于在互联网上分发自己的操作示范、教学演示。比起直接视频录屏的方式,这种以字符方式的记录更加节约资源,无论是记录、传播还是回放环节,都很轻量。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-14-29-43.png" +width="631" +height="383" +loading="lazy" +class="gallery-image" +data-flex-grow="164" +data-flex-basis="395px" +></p> +</li> +<li> +<p><a class="link" href="https://matthias-research.github.io/pages/tenMinutePhysics/index.html" target="_blank" rel="noopener" +>十分钟物理</a>,这套教程集合了一组十分钟左右的视频短片,每次介绍一个基本的物理概念并通过 Web 前端技术编程实现模拟。除了视频之外,网站还提供了源代码、演示环境等配套资源。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-14-32-47.png" +width="1191" +height="666" +loading="lazy" +class="gallery-image" +data-flex-grow="178" +data-flex-basis="429px" +></p> +</li> +<li> +<p><a class="link" href="http://skilldrick.github.io/easy6502/" target="_blank" rel="noopener" +>Easy6502</a>,一本学习 6502 汇编的电子书(没错,我就是特别喜欢这款 CPU)。网站带有交互界面,提供了一个简易模拟器,可以边学边练,教程最后会带你实现一个基于汇编的贪食蛇游戏。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-14-43-13.png" +width="608" +height="484" +loading="lazy" +class="gallery-image" +data-flex-grow="125" +data-flex-basis="301px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 013 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/Mon, 12 Dec 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/<h1 id="机器文摘-第-013-期">机器文摘 第 013 期</h1> +<h2 id="长文">长文</h2> +<h3 id="从古董电脑中我们能学到什么httpsgithubcomreadmefeaturedvintage-computing"><a class="link" href="https://github.com/readme/featured/vintage-computing" target="_blank" rel="noopener" +>从古董电脑中我们能学到什么</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-09-36-43.png" +width="1182" +height="689" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="411px" +></p> +<p>我也不知道为什么自己会对老旧电脑,尤其是上世纪80年代、90年代出品的电脑这么迷恋。</p> +<p>我觉得那个时代的电脑散发着一种难以名状的工业气质。</p> +<p>通过阅读<a class="link" href="https://github.com/readme/featured/vintage-computing" target="_blank" rel="noopener" +>这篇文章</a>,使我意识到一些深层次的原因。</p> +<p>这些老式电脑的魅力来自于当时技术的限制、简单粗暴和直接。</p> +<p>通过深入了解这些老古董、学习开发那个时代的软件,可以更容易地了解计算机科学。</p> +<p>毕竟,现在的计算机已经充分的复杂和“人性化”,软件把硬件包裹得越来越严实和抽象。以至于根本看不清它的内部构造和实现原理。</p> +<p>去研究那些古董电脑吧,操作那些裸漏单纯的硬件接口,贴近更加具体的科技。</p> +<h3 id="蛋httpwwwgalactanetcomoneofftheegg_zhhtml"><a class="link" href="http://www.galactanet.com/oneoff/theegg_zh.html" target="_blank" rel="noopener" +>蛋</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-09-49-07.png" +width="1024" +height="512" +loading="lazy" +class="gallery-image" +data-flex-grow="200" +data-flex-basis="480px" +></p> +<p>这是一篇很富有哲理的小小说,严格来说跟机器没有关系。</p> +<p>但是写的实在是很好,忍不住收录进来。</p> +<p>毕竟,喜欢机器的人,很难抗拒这种对宇宙天马行空的探索。</p> +<h3 id="rlhf-模型详解httpshuggingfacecoblogrlhf"><a class="link" href="https://huggingface.co/blog/rlhf" target="_blank" rel="noopener" +>RLHF 模型详解</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-09-54-30.png" +width="1450" +height="1338" +loading="lazy" +class="gallery-image" +data-flex-grow="108" +data-flex-basis="260px" +></p> +<p>近期 AI 圈最火的事情,莫过于 OpenAI 发布的聊天机器人 ChatGPT 了。</p> +<p>这个智能聊天机器人已经强大到可以让人担忧的地步了。</p> +<p>那么,它背后的实现原理是什么?</p> +<p><a class="link" href="https://huggingface.co/blog/rlhf" target="_blank" rel="noopener" +>这篇文章</a>讲解了 ChatGPT 所使用的 RLHF(人类反馈强化学习) 模型是如何实现的以及它的未来会怎样发展。</p> +<h3 id="基于扩散模型生成音乐httpswwwriffusioncomabout"><a class="link" href="https://www.riffusion.com/about" target="_blank" rel="noopener" +>基于扩散模型生成音乐</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-10-03-35.png" +width="540" +height="378" +loading="lazy" +class="gallery-image" +data-flex-grow="142" +data-flex-basis="342px" +></p> +<p>基于文本生成图像的扩散模型已经火了一段时间了。</p> +<p>我当时还在想,既然基于扩散模型可以生成图像的话,那能不能生成声音呢?</p> +<p>结果我只是动了动念头,人家这边已经把成果拿出来了。</p> +<p><a class="link" href="https://www.riffusion.com/about" target="_blank" rel="noopener" +>这篇文章</a>介绍了他们基于扩散模型生成音乐的项目。</p> +<p>我试听了一下,效果还不错,挺神奇的。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://ittavern.com/getting-started-with-tmux/" target="_blank" rel="noopener" +>tmux 入门</a>,一篇 tmux 的入门教程。tmux 是一个终端程序,可以同时模拟多个客户端控制台,如果觉得不好理解的话,可以认为它是一个控制台的多页签浏览器。因为在工作中经常需要 ssh 登录服务器进行编程开发,我现在已经离不开它了。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-10-12-18.png" +width="701" +height="419" +loading="lazy" +class="gallery-image" +data-flex-grow="167" +data-flex-basis="401px" +></p> +</li> +<li> +<p><a class="link" href="https://oimo.io/works/" target="_blank" rel="noopener" +>一个有趣的个人网站</a>,作者是一个日本在读博士生,网站放了一些个人的编程作品,主要跟物理模拟、像素艺术有关。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-10-14-33.png" +width="915" +height="450" +loading="lazy" +class="gallery-image" +data-flex-grow="203" +data-flex-basis="488px" +></p> +</li> +<li> +<p><a class="link" href="https://www.hello-algo.com/" target="_blank" rel="noopener" +>你好,算法</a>,一本开源电子书,可在线阅读,深入浅出讲解数据结构和算法,生动有趣,适合有一定编程基础但是算法这块有些薄弱的爱好者阅读。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-10-20-26.png" +width="3144" +height="2319" +loading="lazy" +class="gallery-image" +data-flex-grow="135" +data-flex-basis="325px" +></p> +</li> +<li> +<p><a class="link" href="https://nbviewer.org/github/gpeyre/numerical-tours/blob/master/python/ml_6_nn.ipynb" target="_blank" rel="noopener" +>神经网络在线教程</a>,一套神经网络编程教程,提供在线的 python 代码阅读环境,适合作为入门资料学习。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-10-23-10.png" +width="388" +height="262" +loading="lazy" +class="gallery-image" +data-flex-grow="148" +data-flex-basis="355px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 011 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/Wed, 07 Dec 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/<h1 id="机器文摘-第-011-期">机器文摘 第 011 期</h1> +<h2 id="长文">长文</h2> +<h3 id="自己动手做一个天气墨水屏">自己动手做一个天气墨水屏</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-13-22.png" +width="617" +height="455" +loading="lazy" +class="gallery-image" +data-flex-grow="135" +data-flex-basis="325px" +> +有个喜欢动手的哥们,发现了自己及家人的一项小需求,即从家出门的时候想快速知道天气情况。</p> +<p>虽然这种需求抬眼看一下手机也能实现,但是本着“懒惰使人进步”的核心思想(作者懒得掏出手机)他动手实现了一套基于电池供电的可以显示天气预报信息的电子墨水屏。</p> +<p>这篇<a class="link" href="https://kimmo.blog/posts/7-building-eink-weather-display-for-our-home/" target="_blank" rel="noopener" +>《做一个天气墨水屏》</a>记录了作者从诞生点子到产品出炉的全过程。</p> +<p>另外作者还开源了项目的源代码,<a class="link" href="https://github.com/kimmobrunfeldt/eink-weather-display" target="_blank" rel="noopener" +>可在这里获取</a>。</p> +<h3 id="m1-gpu-的故事">M1 GPU 的故事</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-21-23.png" +width="985" +height="614" +loading="lazy" +class="gallery-image" +data-flex-grow="160" +data-flex-basis="385px" +> +GPU 大家都知道,<a class="link" href="https://asahilinux.org/2022/11/tales-of-the-m1-gpu/" target="_blank" rel="noopener" +>这里有篇文章介绍了它的工作细节</a>。</p> +<p>作者来自一个给苹果 M1 芯片适配 Linux 驱动的团队(苹果官方不提供驱动,所以这意味着需要做一些逆向工程)。</p> +<p>本文记录了这些工作中比较有趣的部分,还顺便介绍了 GPU 的一些底层工作原理。</p> +<h3 id="在-commodore-64-上实现位图滚动条的显示">在 Commodore 64 上实现位图滚动条的显示</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-37-41.png" +width="386" +height="338" +loading="lazy" +class="gallery-image" +data-flex-grow="114" +data-flex-basis="274px" +> +Demosense 是一项挖掘计算机硬件机能极限的活动。</p> +<p>通常创作者们会通过各种编程技巧来实现看似无法达到的效果。</p> +<p>由于 Commodore 64 这台古董电脑十分经典,现在仍有不少Demosense爱好者在为它开发程序。</p> +<p><a class="link" href="https://www.c64demo.com/side-border-bitmap-scroller/" target="_blank" rel="noopener" +>这篇文章</a>讲述了著名 C64 demo 程序 <a class="link" href="https://csdb.dk/release/?id=195841" target="_blank" rel="noopener" +>Memento Mori</a> 的实现过程,程序在 Commodore 64 上显示了一副巨大(对于C64来说)的图片。</p> +<p>这在圈内属于首创。</p> +<h3 id="动手做一个-4-位-cpu">动手做一个 4 位 CPU</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-43-28.png" +width="496" +height="370" +loading="lazy" +class="gallery-image" +data-flex-grow="134" +data-flex-basis="321px" +> +计算机组成原理是不是还没学明白?没关系,我们可以自己亲手做一个简单的 CPU 。</p> +<p><a class="link" href="https://www.bigmessowires.com/nibbler/" target="_blank" rel="noopener" +>Nibbler</a> 是一款 4 位 CPU,使用标准 7400 系列逻辑芯片(单个计数器、寄存器、缓冲器和门)构建而成。是一个简单 CPU 的教育示例,易于理解和构建,但仍然能够运行游戏和其他有趣的程序。Nibbler 在 5 x 4 英寸(127 x 102 毫米)穿孔板上使用绕线制造。CPU总共包含17个芯片。</p> +<p>作者公开了设计图纸和相关资料,可在文章内部的链接中获取。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="http://www.craftinginterpreters.com/" target="_blank" rel="noopener" +>纯手撸一个解释器</a>,编译原理没学明白没关系,这本在线电子书手把手教你写一个自己的解释器。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-51-28.png" +width="593" +height="182" +loading="lazy" +class="gallery-image" +data-flex-grow="325" +data-flex-basis="781px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/k88hudson/git-flight-rules/blob/master/README_zh-CN.md" target="_blank" rel="noopener" +>Git 飞行规则 (Flight Rules)</a> ,一个十分全面的 Git 使用指南,把你能遇到的情况都想到了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-54-49.png" +width="532" +height="541" +loading="lazy" +class="gallery-image" +data-flex-grow="98" +data-flex-basis="236px" +></p> +</li> +<li> +<p><a class="link" href="https://thevaluable.dev/vim-advanced/" target="_blank" rel="noopener" +>Vim 高级进阶</a>,如果你已经学会了怎么退出 Vim,恭喜你,已经击败了 80% 的选手。想要在 Vim 中进行更高效的编辑操作,这份高手指南十分适合作为参考。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-57-10.png" +width="776" +height="511" +loading="lazy" +class="gallery-image" +data-flex-grow="151" +data-flex-basis="364px" +></p> +</li> +<li> +<p><a class="link" href="https://www.joshwcomeau.com/css/interactive-guide-to-flexbox/" target="_blank" rel="noopener" +>Flexbox 布局交互指南</a>,这篇在线教程讲解了如何使用 Flexbox 进行页面布局,难能可贵的是直接在页面中提供了交互操作界面,可以一遍学一遍实践,非常方便。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-59-27.png" +width="743" +height="448" +loading="lazy" +class="gallery-image" +data-flex-grow="165" +data-flex-basis="398px" +></p> +</li> +<li> +<p><a class="link" href="https://www.makesense.ai/" target="_blank" rel="noopener" +>在线 AI 标注工具</a>,想要训练自己的 AI 模型,比如目标检测、图像分类等等,可以使用这个在线工具进行数据标注,直接上传图片然后在线标注,完成后可导出 VOC、Coco 等格式的数据集。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-10-02-46.png" +width="628" +height="391" +loading="lazy" +class="gallery-image" +data-flex-grow="160" +data-flex-basis="385px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 010 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/Tue, 29 Nov 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/<h1 id="机器文摘-第-010-期">机器文摘 第 010 期</h1> +<h2 id="长文">长文</h2> +<h3 id="极客摄影指南">极客摄影指南</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-14-11-12.png" +width="1235" +height="841" +loading="lazy" +class="gallery-image" +data-flex-grow="146" +data-flex-basis="352px" +> +相机,也是机器的一种。</p> +<p>我用它记录生活,捕捉生活中转瞬即逝的美好瞬间。</p> +<p>有个问题一直困扰着我,怎样拍出不那么“到此一游”的照片?</p> +<p>怎样才能“掌控”相机这个机器?</p> +<p>这篇<a class="link" href="https://lcamtuf.coredump.cx/photo_basics/" target="_blank" rel="noopener" +>《极客摄影》(英文)</a>能够帮助你对摄影做一个真正深入的理解(而不是学习那些充斥社交平台的各种浮于表面的“技巧”)。</p> +<p>作者是一个热爱摄影的技术男,有二十多年摄影经验。</p> +<p>听他给你讲讲什么是“光”和“构图”。</p> +<p>一篇就够了。</p> +<h3 id="ms-dos-背后的设计">MS-DOS 背后的设计</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-14-24-37.png" +width="480" +height="512" +loading="lazy" +class="gallery-image" +data-flex-grow="93" +data-flex-basis="225px" +></p> +<p>包括我在内的不少 80 后接触电脑是从 MS-DOS 开始的。</p> +<p>对于它的黑窗口和命令行都有着很深的印象。</p> +<p>上大学时执行最多的命令是<code>format c: /s /q</code></p> +<p>当年还玩过不少在 DOS 平台的游戏,比如仙剑奇侠传、主题医院等等。</p> +<p>只是当时没工夫对系统本身做深入了解。</p> +<p>顶多是,自己在学习汇编语言时,对 DOS 又仔细端详了几眼。</p> +<p>这篇<a class="link" href="https://patersontech.com/Dos/Byte/InsideDos.htm" target="_blank" rel="noopener" +>《凑近看看 MS-DOS 》(英文)</a>,介绍了 DOS 系统的设计标准、内存分配、磁盘文件结构、FAT文件系统的技术细节等等。</p> +<p>想要窥探技术细节的可以点进去看看。</p> +<h3 id="构建最快的-lua-解释器">构建最快的 Lua 解释器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-14-45-43.png" +width="645" +height="386" +loading="lazy" +class="gallery-image" +data-flex-grow="167" +data-flex-basis="401px" +> +给动态语言编写解释器可能不算太难(如果只是能跑的话)。</p> +<p>但是如果要编写一个高性能的、好用的动态语言解释器,比如像谷歌浏览器所用的 V8 引擎那样,就比较困难了。</p> +<p><a class="link" href="https://sillycross.github.io/2022/11/22/2022-11-22/" target="_blank" rel="noopener" +>《构建最快的 Lua 解释器》</a>这篇文章站在更高维度提供一种方法,即:编写一种可以自动生成编译器(解释器)代码的程序,以使得制作高性能解释器变得更加容易。</p> +<p>我看了一下,大概就是自动化生成之前需要手工处理的编译器优化代码。作为编译原理学的不怎么明白的我,对此不敢评论。</p> +<h3 id="为什么-linux-内核没有单元测试">为什么 Linux 内核没有单元测试?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-15-14-46.png" +width="637" +height="411" +loading="lazy" +class="gallery-image" +data-flex-grow="154" +data-flex-basis="371px" +> +我对单元测试的态度一般,既不强烈支持,也不反对。</p> +<p>听说有的开发团队由于对于单元测试十分狂热,已经到了不允许写注释,都用单元测试替代的地步。</p> +<p>前不久,在 HN 上有网友发起了一个引战的讨论:“<a class="link" href="https://news.ycombinator.com/item?id=33742130" target="_blank" rel="noopener" +>既然单元测试这么好,为什么 Linux 内核源码不用呢?</a>”</p> +<p>以下为部分观点:</p> +<blockquote> +<p>单元测试被严重高估了,TDD有一些好主意,但有一段时间它变成了一种宗教。</p> +</blockquote> +<blockquote> +<p>单元测试与TDD宗教不是一回事。它只是意味着将事物划分为小单元并尽可能详尽地测试其功能。</p> +</blockquote> +<blockquote> +<p>SQLite不是反例吗?他们有更多的单元测试代码,而不是实际运行的代码。</p> +</blockquote> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://github.com/jackfrued/Python-100-Days" target="_blank" rel="noopener" +>Python 100 天从入门到精通</a>,Python 好学吗?好学又不好学,上手容易,精通难。这里有套开源教程囊括了从入门到实战应用(语言基础、数据处理、Web开发、网络开发、爬虫、深度学习等)的所有课程。这个仓库目前已经在 Github 上获得了 12 万star。可以说是好评如潮,想深入学习 Python 的不容错过。赶紧到我收藏夹里吃灰。</p> +</li> +<li> +<p><a class="link" href="https://wokwi.com/" target="_blank" rel="noopener" +>在线单片机模拟器</a>,想要学习单片机开发,又没有硬件设备吗?这个网站最合适。不需要担心手残不会电烙铁,也不用担心买不到芯片。直接在线进行模拟接线,直接运行编写的代码,结果实时展现。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-15-31-31.png" +width="878" +height="661" +loading="lazy" +class="gallery-image" +data-flex-grow="132" +data-flex-basis="318px" +></p> +</li> +<li> +<p><a class="link" href="https://slowroads.io/" target="_blank" rel="noopener" +>slow roads</a>,一个在线赛车游戏。基于网页制作。亮点在于作者实现了无限地图。所有地形和道路均使用程序生成。游戏有自动驾驶模式,如果只想观赏路边风景的话,可以开启。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-15-36-44.png" +width="1736" +height="855" +loading="lazy" +class="gallery-image" +data-flex-grow="203" +data-flex-basis="487px" +></p> +</li> +<li> +<p><a class="link" href="https://tic80.com/" target="_blank" rel="noopener" +>TIC-80</a>,TIC-80 是一台用于制作、播放和分享小型游戏的幻想计算机。有内置的开发工具:代码、sprites、地图、声音编辑器和命令行,这足以创建一个迷你复古游戏。在退出时,你将得到一个盒式文件,它可以在网站上存储和播放。 +另外,游戏可以打包成一个播放器,可以在所有流行的平台上运行,并按你的意愿分发。为了制作一个复古风格的游戏,整个创作过程是在一些技术限制下进行的。240x136 像素的显示屏,16 种颜色的调色板,256 个 8x8 的彩色 sprites,4 channel sound 等等。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-15-42-20.png" +width="490" +height="279" +loading="lazy" +class="gallery-image" +data-flex-grow="175" +data-flex-basis="421px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 009 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/Mon, 21 Nov 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/<h1 id="机器文摘-第-009-期">机器文摘 第 009 期</h1> +<h2 id="长文">长文</h2> +<h3 id="游戏中的精灵">游戏中的“精灵”</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-21-14-24-20.png" +width="729" +height="409" +loading="lazy" +class="gallery-image" +data-flex-grow="178" +data-flex-basis="427px" +> +<a class="link" href="https://zh.wikipedia.org/wiki/%E7%B2%BE%E7%81%B5%E5%9B%BE" target="_blank" rel="noopener" +>精灵(sprite)</a>这个词来自古法语单词“esprit”,意思是“精神”——源自拉丁语“spiritus”。在民间传说中,精灵是活泼、俏皮和神奇的小生物。然而对于游戏开发者来说,它又是另一个含义了。</p> +<p>这篇<a class="link" href="https://wireframe.raspberrypi.com/articles/the-surprising-history-of-sprites" target="_blank" rel="noopener" +>《精灵的惊人历史》(英文)</a>,介绍了不同的游戏厂商,在早期硬件机能有限的条件下,如何实现“角色在屏幕上移动”这个现在看似十分简单的事情的。</p> +<p>对于不了解“精灵”的含义的,稍作如下解释:</p> +<blockquote> +<p>2D 游戏在处理需要动起来的角色时,出于性能考虑,将一部分图形的绘制与背景画面的绘制分开,对于频繁需要刷新(动起来的)部分,单独处理,使他们感觉像是漂浮在背景画面的“幽灵”似的,故名“精灵”。</p> +</blockquote> +<h3 id="任天堂-nes-的一些技术细节">任天堂 NES 的一些技术细节</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-21-14-41-33.png" +width="507" +height="477" +loading="lazy" +class="gallery-image" +data-flex-grow="106" +data-flex-basis="255px" +> +NES 是任天堂推出一款极其成功的家用游戏机(NES : Nintendo Entertainment ,System 是其在北美发售的名称,亚洲叫 FC :Family Computer),不少80、90后的朋友应该都玩过(或者是国内山寨厂商仿制的*霸王之类)。</p> +<p>NES 使用极其经典的 6502 CPU。这块 CPU 有多经典呢,苹果的 Apple1代2代 、史上销量第一的个人电脑 Commodore 64 、国内早年比较流行的文曲星等,使用的都是这个 CPU。</p> +<p><a class="link" href="https://medium.com/@fogleman/i-made-an-nes-emulator-here-s-what-i-learned-about-the-original-nintendo-2e078c9b28fe" target="_blank" rel="noopener" +>《我做了一个 NES 模拟器》(英文)</a>,这篇文章的作者在编写模拟器的过程中挖出了不少技术细节,里面还提到了硬件存在的各种 BUG (没错,要模拟的话必须连 BUG 都得模拟,不然有些游戏玩不了),想要了解的朋友可以点进去看一下。</p> +<p>作为模拟器爱好者,我对 6502 处理器非常好奇,一度希望自己动手也实现一个,而且这款处理器真的非常适合模拟器入门,毕竟只有三个寄存器和百十条指令。</p> +<p><a class="link" href="https://github.com/fogleman/nes" target="_blank" rel="noopener" +>文中提到的 NES 模拟器在 Github 上开放了源码</a>,有兴趣的可以学习。</p> +<h3 id="一个桌面开发程序员为了学习-javascript-而手撸了一个基于-webgl-的游戏引擎">一个桌面开发程序员为了学习 Javascript 而手撸了一个基于 WebGL 的游戏引擎</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-21-15-11-11.png" +width="780" +height="448" +loading="lazy" +class="gallery-image" +data-flex-grow="174" +data-flex-basis="417px" +> +学习一样技能最好的方式就是动手去做。</p> +<p>当我感叹牛人怎么那么厉害的时候,往往忽略了牛人的学习过程。</p> +<p>以为他们天生就那样。</p> +<p>事实上他们的技能也是靠努力训练得来的。</p> +<p>不过,学习方法确实很重要。</p> +<p><a class="link" href="http://zephyrosanemos.com/" target="_blank" rel="noopener" +>《我对 Javascript 的尝试》(英文)</a>,这篇文章的作者原本是一个桌面程序开发者(类似 CAD 软件之类)。</p> +<p>他突然想要学习前端开发,掌握 Javascript 语言。</p> +<p>于是结合自己之前的知识,使用前端技术做了一套很优秀的 Demo 程序,一个性能和外观都很不错的游戏引擎。</p> +<p>文章里作者详细介绍了实现过程中对技术、算法的选择等等。</p> +<p>内容很长,但还算友好,比较干货。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://roadmap.sh/" target="_blank" rel="noopener" +>开发者之路</a>,汇总了各个技术路线的学习资料,包括前端、后端、运维、计算机科学、区块链、移动端、质量管理等等。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-21-15-24-33.png" +width="753" +height="455" +loading="lazy" +class="gallery-image" +data-flex-grow="165" +data-flex-basis="397px" +> +总之极其全面。 +目前在 Github 有两百多万个 star,被 fork 了 三十多万次。</li> +<li><a class="link" href="https://crxdl.com/" target="_blank" rel="noopener" +>chrome 插件下载</a>,访问谷歌浏览器插件商店有困难吗?试试这个网站,可以直接下载插件的包文件,下载后拖入浏览器即可安装。不过我已经转换到微软的 Edge 阵营了,用不到这个了。</li> +<li><a class="link" href="https://www.toptal.com/developers/css3maker" target="_blank" rel="noopener" +>CSS3 生成器</a>,对于 CSS 的属性参数总是记不住,这个网站就很适合我。每次要调背景渐变、圆角、阴影、动画曲线等等,都得现去搜。有了这个网站,在线点点拖拖,直接复制代码即可。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-21-15-33-35.png" +width="1288" +height="660" +loading="lazy" +class="gallery-image" +data-flex-grow="195" +data-flex-basis="468px" +></li> +<li><a class="link" href="https://tesseract.projectnaptha.com/" target="_blank" rel="noopener" +>tesseract.js</a>,可直接在浏览器里运行的 OCR 引擎,支持多国语言(超过 100 种)文字识别。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-21-16-16-10.png" +width="1039" +height="439" +loading="lazy" +class="gallery-image" +data-flex-grow="236" +data-flex-basis="568px" +></li> +<li><a class="link" href="https://www.aichpoem.net/#/shisanbai/poem" target="_blank" rel="noopener" +>AI 在线写诗</a>,比较全面的 AI 写诗工具,可以写律诗、绝句、现代诗、歌词等等,根据输入的主题任意发挥。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-23-10-36-44.png" +width="846" +height="502" +loading="lazy" +class="gallery-image" +data-flex-grow="168" +data-flex-basis="404px" +></li> +<li><a class="link" href="https://www.upscale.media/zh" target="_blank" rel="noopener" +>图片分辨率在线提升</a>,上传图片,网站使用 AI 算法将图片的清晰度自动提升,效果还不错。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-23-10-41-36.png" +width="1087" +height="693" +loading="lazy" +class="gallery-image" +data-flex-grow="156" +data-flex-basis="376px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 008 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/Wed, 16 Nov 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/<h1 id="机器文摘-第-008-期">机器文摘 第 008 期</h1> +<h2 id="长文">长文</h2> +<h3 id="用好-github给自己建立一个全方位的私有云平台">用好 GitHub,给自己建立一个全方位的私有云平台</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/2022-11-16-09-24-41.png" +width="754" +height="393" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="460px" +> +很多人都有进行个人的知识管理和数字资源管理的需求,市面上也有很多软件工具或者平台来满足这样的需求,但是大部分都是收费的,且自由度不高。我个人经常使用 Github 作为知识管理仓库,我的网络日志、技术博客、私人小项目、电子书籍等都放在上面,生活中已经离不开这个网站了。</p> +<p>近期读到这样一篇文章&ndash;<a class="link" href="https://www.bmpi.dev/self/use-github-better/" target="_blank" rel="noopener" +>善用 Github</a>,全方位讲解了 Github 如何使用,如何将其提供的服务发挥最大化的作用,看完受益匪浅。</p> +<blockquote> +<p>GitHub 是微软旗下的一个在线软件源代码托管服务平台,也是一个拥有八千多万开发者用户的社区。很多开发者应该对GitHub有一定的了解,但非技术人员大多可能并不会去使用它。本文更多是想给非技术人员来介绍这个平台,看完这篇文章,希望能让更多人在上面来学习、创作与展示自己的作品。</p> +</blockquote> +<h3 id="webgpu-是什么跟-webgl-有什么关系">WebGPU 是什么?跟 WebGL 有什么关系?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/2022-11-16-09-36-12.png" +width="846" +height="433" +loading="lazy" +class="gallery-image" +data-flex-grow="195" +data-flex-basis="468px" +> +前几天我想在网页上制作一个小游戏,用于尝试一下图形编程相关的技术。用到了一些基于 Web 技术的 3d 图形框架,比如 Three.js、Babylon.js 等等。在尝试的过程中遇到了一个新的名词 WebGPU,之前总是在听说 WebGL 相关的技术,结果说了这么多年,WebGL还没普及,怎么又冒出来一个 WebGPU?于是找了一篇文章,浅扒一下各个图形接口的历史。就是这篇<a class="link" href="https://www.51cto.com/article/698100.html" target="_blank" rel="noopener" +>浅入浅出 WebGPU</a>。</p> +<blockquote> +<p>2016年6月,Google 产生了使用新API来代替WebGL的想法,称之为 WebGL Next。 +2017年1月,Khronos Group 举办了WebGL Next研讨会,Chromium一马当先,展示了可以基于OpenGL和Metal独立运行的新图形系统原型,同时Apple和Mozilla也分别展示了自己的原型,三者都非常类似于Metal Api。 +次月,Apple就向W3C提交了一个名为 WebGPU 的技术概念验证方案,基于Metal图形开放接口,最终W3C采纳了 WebGPU 这个名字作为下一代标准,Apple的提案进入了正式的小组提案中。 +3月,Mozilla向Khronos Group提交了基于Vulkan的名为WebGL Next提案。 +2018年6月,Chrome团队宣布着手实现WebGPU,这意味着Khronos的失败,WebGPU胜出,大家以后还是团结在W3C的周围。 +按照预期,工作组希望在2021年底发布WebGPU 1.0 标准,不过目前只有草案。 +WebGPU 1.0 草案:https://www.w3.org/standards/types#WD</p> +</blockquote> +<h3 id="扔掉-photoshop-改用字符串绘图">扔掉 Photoshop 改用字符串绘图</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/2022-11-16-09-58-00.png" +width="761" +height="741" +loading="lazy" +class="gallery-image" +data-flex-grow="102" +data-flex-basis="246px" +> +相信很多人都接触过使用字符绘制的图片,这在程序员圈子里甚至发展为一门专有的艺术 “<a class="link" href="https://zh.wikipedia.org/wiki/ASCII%E8%89%BA%E6%9C%AF" target="_blank" rel="noopener" +>ASCII 艺术</a>”。不过我现在不是要说这些,我在一篇 2015 年发表的文章里,发现了这个:有个猛男在自己的程序里彻底抛弃使用 Photoshop 制作的图片资源,改用字符串来描述各种图形(程序界面的图标),然后自己再用代码将其渲染成为高清的图像。</p> +<p>作者对此很沾沾自喜,他甚至设计了一套自用的语法规范,用特定字母代表特定的符号关系,这样就可以组合出各种复杂的图案了。</p> +<p>我也在文章的评论区见到了跟我有同样疑惑的读者留言:“这不就是重新发明了 <a class="link" href="https://zh.wikipedia.org/wiki/%E5%8F%AF%E7%B8%AE%E6%94%BE%E5%90%91%E9%87%8F%E5%9C%96%E5%BD%A2" target="_blank" rel="noopener" +>SVG</a> 吗?唯一的区别就是没有用 XML 作为载体”。</p> +<p>不过文章记录的整个开发过程还是很有趣的,希望了解朋友可以点进去看看 <a class="link" href="http://cocoamine.net/blog/2015/03/20/replacing-photoshop-with-nsstring/" target="_blank" rel="noopener" +>Replacing Photoshop With NSString</a></p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://ffmpeg.xianwaizhiyin.net/" target="_blank" rel="noopener" +>FFmpeg原理</a>,FFmpeg 这个开源项目可能圈外的人士了解不多,但实际上我们生活中一刻也离不开它。现在的网络直播、网络视频网站和移动App、各种视频剪辑合成软件,都或多或少的使用了 FFmpeg 提供的编解码技术。这本在线书籍对于想进一步了解 FFmpeg 以及视频编解码技术的朋友是个不错的参考资料。</p> +<blockquote> +<p>本书《FFmpeg原理》主要讲解 FFmpeg 原理性的知识,前面几章主要讲解一些音视频开发的基础知识,例如原始数据 YUV 跟 RGB,封装格式 FLV 跟 MP4 ,压缩编码的基本概念,还有封装格式分析。</p> +</blockquote> +</li> +<li> +<p><a class="link" href="https://rustdesk.com/zh/" target="_blank" rel="noopener" +>开源虚拟与远程桌面基础架构</a>,远程桌面软件,开箱即用,无需任何配置。(我个人目前还是使用windows的远程桌面多一些,不过这个开源的rustdesk看起来不错)</p> +<blockquote> +<p>您完全掌控数据,不用担心安全问题。您可以使用我们的注册/中继服务器,或者自建,亦或者开发您的版本 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/2022-11-16-10-26-09.png" +width="1388" +height="701" +loading="lazy" +class="gallery-image" +data-flex-grow="198" +data-flex-basis="475px" +></p> +</blockquote> +</li> +<li> +<p><a class="link" href="https://learnxinyminutes.com/" target="_blank" rel="noopener" +>Learn X in Y minutes</a>,这里的教程几乎涵盖所有编程语言,完全没有废话。英文版、中文版都有。如果有编程语言基础的话,通过这个网站确实可以在几十分钟内掌握一门新的编程语言的核心知识。</p> +</li> +<li> +<p><a class="link" href="https://flash.zczc.cz/" target="_blank" rel="noopener" +>Flash 保存计划</a>,Flash 虽然消失了,但是它曾经创造的辉煌一直在我们的记忆里,现在偶尔还想起一些经典的小游戏。这个网站里收藏了很多经典的Flash小游戏,通过一些黑科技复活了它们,可以在浏览器里运行体验。反正我一打开了黄金矿工,就半天停不下来。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/2022-11-16-10-34-57.png" +width="1142" +height="554" +loading="lazy" +class="gallery-image" +data-flex-grow="206" +data-flex-basis="494px" +></p> +</li> +<li> +<p><a class="link" href="https://keg.cs.tsinghua.edu.cn/codegeex/index_zh.html" target="_blank" rel="noopener" +>CodeGeeX: 多语言代码生成模型</a>,又一个能帮你写代码的 AI 模型。提供有官方的 VSCode 插件。我试了一下,效果跟 Github 的 copilot 还有一定的差距。</p> +<blockquote> +<p>CodeGeeX是一个具有130亿参数的多编程语言代码生成预训练模型。CodeGeeX采用华为MindSpore框架实现,在鹏城实验室“鹏城云脑II”中的192个节点(共1536个国产昇腾910 AI处理器)上训练而成。截至2022年6月22日,CodeGeeX历时两个月在20多种编程语言的代码语料库(&gt;8500亿Token)上预训练得到</p> +</blockquote> +</li> +<li> +<p><a class="link" href="https://iximiuz.com/en/series/computer-networking-fundamentals/" target="_blank" rel="noopener" +>计算机网络基础学习(英文)</a>,一个在线讲解网络基础知识的教程,优点是内容简洁,不用特别多的专用名词唬人,另外还提供了在线实验的环境。</p> +<blockquote> +<p>关于计算机网络的书籍往往令人生畏 - 数千页,无聊的图表&hellip;&hellip;这个教程以几千字的字数引导您了解网络基础知识!它还提供动手实验室来实践所获得的知识。</p> +</blockquote> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/2022-11-16-10-51-40.png" +width="764" +height="476" +loading="lazy" +class="gallery-image" +data-flex-grow="160" +data-flex-basis="385px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 007 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/Wed, 09 Nov 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/<h1 id="机器文摘-第-007-期">机器文摘 第 007 期</h1> +<h2 id="长文">长文</h2> +<h3 id="如何在-html5-canvas-制作可精确控制时间的动画">如何在 HTML5 Canvas 制作可精确控制时间的动画</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-09-30-08.png" +width="576" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="170" +data-flex-basis="410px" +></p> +<p>使用 Canvas 对象在网页中制作动画非常简单,有不少人喜欢直接使用定时器 <code>setinterval</code> 以一定的时间周期循环执行绘图代码来实现动画效果。但是这种做法有一个弊端,由于显示刷新率以及计算机硬件性能的不同,会导致在不同机器上的表现差异。比如你希望你的动画角色在 1 秒内移动 50 个像素,但是实际执行起来却很难控制。<a class="link" href="https://www.viget.com/articles/time-based-animation/" target="_blank" rel="noopener" +>基于时间的动画</a>这篇文章讲解了如何使用浏览器的 <code>requestAnimationFrame</code> API 来实现精准控制动画时间的效果,里面给出了一个很简单的样例,但是基本上给出了一个完整的“更新、渲染、通过时间变化计算运动距离”的游戏控制架构。</p> +<h3 id="如何使用纯-web-技术开发一个相机-app">如何使用纯 Web 技术开发一个相机 App</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-09-47-44.png" +width="680" +height="475" +loading="lazy" +class="gallery-image" +data-flex-grow="143" +data-flex-basis="343px" +></p> +<p>如果不习惯复杂的移动 app 开发环境,直接使用 Web 技术开发一些小的 App 也是十分方便的。我近期希望通过网页实现一个拍照的应用,并且希望不使用手机的原生相机功能,而是自己控制一些相机参数、后期效果、增加特定的取景框等等。于是我找到了一篇教学指南:<a class="link" href="https://blog.prototypr.io/make-a-camera-web-app-tutorial-part-1-ec284af8dddf" target="_blank" rel="noopener" +>Make a Camera Web App</a>,只需几十行代码就实现了一个相机 App 。感兴趣的朋友可以点进去看看。</p> +<h3 id="数据库是如何工作的从零开始写一个数据库">数据库是如何工作的,从零开始写一个数据库</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-10-01-15.png" +width="390" +height="394" +loading="lazy" +class="gallery-image" +data-flex-grow="98" +data-flex-basis="237px" +></p> +<p>如果和我一样好奇数据库是如何实现的,可以看看<a class="link" href="https://cstack.github.io/db_tutorial/" target="_blank" rel="noopener" +>这篇文章</a>。带你用 C 语言从头撸一个数据库出来。</p> +<h3 id="使用-rust-写一个操作系统">使用 Rust 写一个操作系统</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-10-05-43.png" +width="702" +height="518" +loading="lazy" +class="gallery-image" +data-flex-grow="135" +data-flex-basis="325px" +></p> +<p>Rust 逐渐火起来了,这篇 <a class="link" href="https://os.phil-opp.com/zh-CN/" target="_blank" rel="noopener" +>2018 年的文章</a>整理了一份教程,作者尝试使用 Rust 写一个操作系统,我之所以收录它是因为作者还在 Github 开源了代码,并且这系列教程甚至提供了多国语言的版本。制作精良。应该是实践操作系统知识的好教材。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://100dayscss.com/" target="_blank" rel="noopener" +>100 天精通 CSS </a>,这个网站给了你 100 个关于 CSS 技术的挑战题目,也许练完之后可以达到深入应用 CSS 的效果,我尝试了几个挑战,有些题目的设置有些偏炫技范畴了,想在工作中使用估计会被打死。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-10-24-10.png" +width="392" +height="391" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +></p> +</li> +<li> +<p><a class="link" href="http://cht.sh/" target="_blank" rel="noopener" +>Linux 命令在线帮助工具</a>,对于我这种经常记不住命令用法的人来说真的是一种福音。比如我就经常记不清 <code>tar</code> 命令的用法,面对压缩包解压或者文件打包的工作每次都是去网上搜索一番。有了这个在线工具,直接在命令行中使用 <code>curl</code>请求他的网址就可给出命令的样例用法详解,非常方便。比如执行<code>curl cht.sh/tar</code> 就会给出 tar 的使用样例了,我直接复制粘贴之。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-10-28-42.png" +width="586" +height="462" +loading="lazy" +class="gallery-image" +data-flex-grow="126" +data-flex-basis="304px" +></p> +</li> +<li> +<p><a class="link" href="https://www.mobilephonemuseum.com/" target="_blank" rel="noopener" +>手机博物馆</a>, 网站收录了各品牌手机的各代产品资料,包括手机图片、型号参数、当时发布的广告等。不过我看了一下,资料应该还不齐全,有些手机只是列了个名字和型号在那儿,还缺少详细信息,估计还在继续收集中。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-10-32-23.png" +width="1696" +height="790" +loading="lazy" +class="gallery-image" +data-flex-grow="214" +data-flex-basis="515px" +></p> +</li> +<li> +<p><a class="link" href="http://www.famicn.com/" target="_blank" rel="noopener" +>中文家用游戏博物馆</a> ,收录了比较齐全的家用游戏机及掌机的中文版游戏资料。可以直接在线通过模拟器玩耍。有不少经典的 FC、GB、MD 游戏,甚至还有小霸王学习机的 ROM ,可以在线体验。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-10-36-51.png" +width="1096" +height="711" +loading="lazy" +class="gallery-image" +data-flex-grow="154" +data-flex-basis="369px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 006 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/Wed, 02 Nov 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/<h1 id="机器文摘-第-006-期">机器文摘 第 006 期</h1> +<h2 id="长文">长文</h2> +<h3 id="怎样写一段代码把自己打印出来">怎样写一段代码把自己打印出来?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/2022-11-02-13-45-45.png" +width="651" +height="400" +loading="lazy" +class="gallery-image" +data-flex-grow="162" +data-flex-basis="390px" +></p> +<p>近期在知乎上看到一个<a class="link" href="https://www.zhihu.com/question/22006572/answer/2722369370" target="_blank" rel="noopener" +>如何编写代码打印自己的问题</a>,感到十分有趣。以前也在网上见到过类似的代码,用 C 或者 Javascript 等各种语言实现的版本都有。当时只是感叹代码写的十分神奇,一段代码在运行之后竟然输出自己的源代码,而且一个字符也不差,并没有搞懂其中的原理。这篇回答里,作者给出了详细解释。并指出,冯·诺依曼早在他编写的《自复制元胞自动机理论》一书中的提出了这种事情在理论上的通用方法。</p> +<blockquote> +<p>如上图所示,自复制系统有五个基本部件:A:通用构造器;B:通用复制器;C:控制器;D:其他函数;ϕ(A,B,C,D)\phi(A,B,C,D)\phi(A,B,C,D) : A, B, C, D的编码;当自复制过程启动的时候,B将编码复制一份。A再根据复制出的编码构造出ABCD。最后,C再将这些结构组合起来,构造出一个新的、复制的结构。可以看到,自复制、自打印程序的核心就在于通用构造器和编码,因为复制器、控制器都是比较容易实现的。</p> +</blockquote> +<p>具体实现的示例,文中有更详细的说明。</p> +<p>最后,此问题可以引申到,大自然中生命基于基因的复制机制,也是与此相关,甚至其背后都是同样的机制。</p> +<h3 id="kevin-kelly-在-68-岁生日时给出的-68-条建议">Kevin Kelly 在 68 岁生日时给出的 68 条建议</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/2022-11-02-14-01-30.png" +width="688" +height="368" +loading="lazy" +class="gallery-image" +data-flex-grow="186" +data-flex-basis="448px" +></p> +<p><a class="link" href="https://baike.baidu.com/item/%E5%87%AF%E6%96%87%C2%B7%E5%87%AF%E5%88%A9/6607570" target="_blank" rel="noopener" +>凯文·凯利(又称KK, 作者,著有《失控》《科技想要什么》《必然》等)</a>,上个月 28 号是他的 68 岁生日,他准备了 68 条简短的建议,作为礼物送给年轻人。</p> +<p>有人翻译了<a class="link" href="https://zhuanlan.zhihu.com/p/143834871" target="_blank" rel="noopener" +>KK 在 68 岁生日时给出的 68 条建议</a>。</p> +<p>摘抄几条如下:</p> +<blockquote> +<p>任何一项大工程(修房子、拍电影、开发 app)完成度为 90% 的时候,你都要做好心理准备:剩余的大量细节工作会占掉你另一段与之前相当的时间。</p> +</blockquote> +<blockquote> +<p>不要担心自己问的问题听起来很傻。99% 的情况下,其他人都有和你一样的问题,只不过羞于问出口而已。</p> +</blockquote> +<blockquote> +<p>别成为一群人里最聪明的那个。和那些比你聪明的人待在一起,向他们学习。如果能找到和你观点相左的聪明人,那就更好了。</p> +</blockquote> +<blockquote> +<p>别做最好的。做唯一的。</p> +</blockquote> +<blockquote> +<p>任何真实之物都源于虚构之意。想象是宇宙中最强大的力量,也是你能够日益精进的能力。生命中可以因不知众人所知而获益的能力,仅此一项。</p> +</blockquote> +<blockquote> +<p>经验往往被高估了。招募的时候,要看资质,技能则可以培训。许多令人惊奇和赞叹的事情,都是由第一次做的人做出来的。</p> +</blockquote> +<h3 id="怎样搭建一个最简的-git-服务器">怎样搭建一个最简的 GIT 服务器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/2022-11-02-14-15-18.png" +width="626" +height="466" +loading="lazy" +class="gallery-image" +data-flex-grow="134" +data-flex-basis="322px" +></p> +<p>GIT 是现在软件开发过程中必不可少的版本控制工具,功能非常强大,我们平时直接使用单位的私有服务或者在线的云服务(如:Github 等)。</p> +<p>如果想要搭建个人的服务,可能就比较繁琐一些。<a class="link" href="https://www.ruanyifeng.com/blog/2022/10/git-server.html" target="_blank" rel="noopener" +>阮一峰老师的这篇博客</a>就解答了怎样采用极简的技术路线,为自己搭建一台 GIT 服务器。</p> +<blockquote> +<p>自己搭建 Git 服务器的原因,无非就是不方便访问外网,不愿意代码放在别人的服务器,或者有一些定制化的需求。 +这时,你可以选择开源的 Git 服务器软件。 +Gitlab CE +Gitea +Gogs +Onedev +这些软件里面,Gogs 的安装是最简单的,但是功能相对比较弱。功能越强的软件,安装越复杂。 +如果你只是想远程保存一份代码,并不在意有没有 Web 界面,或者其他功能,那么根本不用安装上面这些软件,一行命令就够了。</p> +</blockquote> +<h3 id="为什么很多程序员讨厌低代码">为什么很多程序员讨厌低代码?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/2022-11-02-14-24-59.png" +width="640" +height="355" +loading="lazy" +class="gallery-image" +data-flex-grow="180" +data-flex-basis="432px" +></p> +<p>“低代码”(一般指:不用或少用编写代码的方式进行软件开发)这个词近两年又开始火了,它代表着对软件工程的一种美好“幻想”,即:花费更低的代价去构建复杂的软件系统。</p> +<p>虽然每隔一个时间周期都会被重提一次,但是每次都未能如愿。</p> +<p>现在既然又被频繁提及,我在知乎上发现了这样一篇<a class="link" href="https://www.zhihu.com/question/561025857/answer/2734260311" target="_blank" rel="noopener" +>关于低代码话题的回答</a>。从程序员的视角表达了对低代码这种期望的观点,有兴趣的朋友可以点进去看看。</p> +<blockquote> +<p>软件工程这门学问,研究的就是“如何利用工程思想,从整体上降低开发复杂性”;但与之同时,它不得不反复强调“软件工程试图解决的、是人为引入的不必要的复杂性;但工程的本质复杂性是无法逃避的。因为没有银弹,没有银弹,没有银弹!”</p> +</blockquote> +<p>我个人的观点是:低代码或者配置化、拖拽式软件开发,很难平衡对复杂现实的抽象程度和开发便利性的矛盾关系。如何做到既提供方便的组件同时又不限制对个性化需求的实现,这需要非常强大的设计能力以及对于特定应用场景的取舍。目前来看,如果要做到或者接近上述状态,必然要先消耗巨量的成本,至于是否值得,可能不同的主体会有不同的选择吧。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://github.com/Visualize-ML/Book4_Power-of-Matrix" target="_blank" rel="noopener" +>从加减乘除到机器学习</a>,一本不错的数学扫盲书,如果你在学习人工智能的时候对数学感到吃力的话,这本书非常适合阅读,一点也不枯燥。主要讲解线性代数相关的知识。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/2022-11-02-14-46-11.png" +width="616" +height="335" +loading="lazy" +class="gallery-image" +data-flex-grow="183" +data-flex-basis="441px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/jlevy/the-art-of-command-line/blob/master/README-zh.md" target="_blank" rel="noopener" +>命令行的艺术</a> 想成为命令行高手,掌握这一篇就够了。</p> +<blockquote> +<p>熟练使用命令行是一种常常被忽视,或被认为难以掌握的技能,但实际上,它会提高你作为工程师的灵活性以及生产力。本文是一份我在 Linux 上工作时,发现的一些命令行使用技巧的摘要。有些技巧非常基础,而另一些则相当复杂,甚至晦涩难懂。这篇文章并不长,但当你能够熟练掌握这里列出的所有技巧时,你就学会了很多关于命令行的东西了。</p> +</blockquote> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/2022-11-02-14-47-54.png" +width="477" +height="287" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="398px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/practical-tutorials/project-based-learning" target="_blank" rel="noopener" +>基于实际项目的学习</a>,这是一个巨大的代码工程资源索引,里面列举了针对各种编程语言的个人项目,当你不知道该如何去深入学习一门编程语言的时候,选择一个这里的项目然后自己动手跟着练一遍效果绝对惊人。入选的项目都十分有趣,比如怎样用 C 写一个解释器、怎样写一个自己的编辑器、自己动手实现 TCP/IP 协议栈,等等。</p> +</li> +<li> +<p><a class="link" href="https://github.com/lxgw/LxgwWenKai" target="_blank" rel="noopener" +>霞鹜文楷</a>,一款开源中文字体,基于 FONTWORKS 出品字体 Klee One 衍生。用来看书非常舒服,特别是在排版上。微信读书已经内置,如果是第三方支持自定义字体的可以试试。</p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 005 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/Wed, 26 Oct 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/<h1 id="机器文摘-第-005-期">机器文摘 第 005 期</h1> +<h2 id="长文">长文</h2> +<h3 id="穿越到-1983-年学习-basichttpslinuxcnarticle-11091-1html"><a class="link" href="https://linux.cn/article-11091-1.html" target="_blank" rel="noopener" +>穿越到 1983 年学习 BASIC</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-10-33-53.png" +width="1006" +height="644" +loading="lazy" +class="gallery-image" +data-flex-grow="156" +data-flex-basis="374px" +></p> +<blockquote> +<p>很多著名的程序员,尤其在计算机游戏行业,孩童时期就在苹果 II 和 Commodore 64 这样的 8 位计算机上开始编写游戏,John Romero、Richard Garriott 和 Chris Roberts 都是这样的例子。这好理解。在 8 位计算机时代,很多游戏只能在计算机杂志和书籍中以印刷的 BASIC 程序清单方式得到。如果你想玩其中一款游戏,就必须手工键入整个程序。不可避免的,你可能遇到一些问题,所以你就得调试你的程序。等到你让它可以工作起来了,你就已经对程序是如何运行的有了足够的了解,你就可以开始自己修改它了。如果你是一个狂热的游戏玩家,你几乎必然会成为一名优秀的程序员。</p> +</blockquote> +<p>喜欢小霸王的小伙伴(老伙伴?),不可错过的文章,一起跟随作者回忆一下如何在老古董电脑上运行BASIC程序,顺便怀念一下当年靠着一本说明书就在小霸王学习机上编写(抄写)游戏的时光。</p> +<ul> +<li>文中提到的<a class="link" href="https://vice-emu.sourceforge.io/" target="_blank" rel="noopener" +> Commodore64 电脑可以在这里下载模拟器</a>。</li> +</ul> +<h3 id="在-github-的-pages-服务里跑-sqlitehttpsphireskygithubioblog2021hosting-sqlite-databases-on-github-pages"><a class="link" href="https://phiresky.github.io/blog/2021/hosting-sqlite-databases-on-github-pages/" target="_blank" rel="noopener" +>在 Github 的 Pages 服务里跑 SQLite</a></h3> +<p>作者尝试做一个小网站来显示一些统计数据,于是他想到了用数据库,但是,使用数据库需要托管和维护后端服务,或者每次将整个数据集下载到浏览器中(当数据集超过10MB时,体验就变得很差劲)。</p> +<p>于是作者开始琢磨有没有办法找到一个可以在静态服务器上搞一个数据库服务得可能,毕竟提供静态服务的地方有很多(如 GitHub,GitLab,Netlify 等等)。</p> +<p>一通折腾下来(借助了 WASM 技术并适当的进行一些魔改),作者竟然实现了一个 100% 静态托管的数据库服务。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-10-10-18.png" +width="864" +height="413" +loading="lazy" +class="gallery-image" +data-flex-grow="209" +data-flex-basis="502px" +></p> +<h3 id="语句表达式和海象操作符httpswwwzlovezlcnarticlesstmt-expr-and-walrus-operator"><a class="link" href="https://www.zlovezl.cn/articles/stmt-expr-and-walrus-operator/" target="_blank" rel="noopener" +>语句、表达式和海象操作符</a></h3> +<p>这是一篇介绍如何通过“海象操作符“(类似这样:<code>foo := 'bar'</code>)使得Python语句更加精炼的文章。</p> +<p>这种操作符之所以可以使得语句更加精炼,主要原因就是它使得一句代码既进行了赋值然后又作为表达式返回了值。</p> +<p>之前写 Python 代码的时候都没注意还有这种写法,而且貌似这在 C 和 C++ 中都是基本的特性。不过 C 和 C++ 是赋值语句<code>=</code>直接就返回了表达式的值,同时这给程序员提供了出错机会(有不少人应该还记得条件判断时少写了个等号导致的问题)。</p> +<h3 id="给个人开发者的一些建议英文httpsnewsycombinatorcomitemid32647091"><a class="link" href="https://news.ycombinator.com/item?id=32647091" target="_blank" rel="noopener" +>给个人开发者的一些建议(英文)</a></h3> +<p>hacker news 上的网友针对有志于运营自己的SaaS产品的个人开发者提了一些心得和建议。</p> +<p>摘抄一点儿如下:</p> +<ul> +<li>关于做什么,做那些你自己都愿意付费的东西,别指望做出一个你自己都不想花钱使用的产品有别人来买单;</li> +<li>还是关于做什么,不要做需要漂亮UI的东西,那会让你陷入编码之外的很多麻烦(确实很牵涉精力),如果提供的工具能够通过简单交互就能提供优质服务最佳;</li> +<li>如果有可能,尽量提供自助服务模式,也就是说让用户不用见到你就可以自行操作付款了(作者这是有多社交恐惧?);</li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://visualgo.net/zh" target="_blank" rel="noopener" +>数据结构与算法可视化</a>,是一个学习算法知识的好工具。通过动图来演示和讲解数据结构和算法实现原理,针对每一个常用算法不仅有直观的图示,还附有一篇详细的文档,内涵原理知识以及代码实例,网站甚至还提供了答题练习功能,可以一边学习一边做题。</li> +</ul> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-09-31-46.png" +width="1072" +height="321" +loading="lazy" +class="gallery-image" +data-flex-grow="333" +data-flex-basis="801px" +></p> +<ul> +<li><a class="link" href="https://lisperator.net/slip/" target="_blank" rel="noopener" +>SLip</a>,一个在浏览器中运行的Lisp解释器,使用Javascript实现。网站提供了一个简易的IDE,可以直接在页面中进行编程开发,还提供了图形绘制的扩展包,用于学习lisp语言非常合适。</li> +</ul> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-09-35-46.png" +width="497" +height="363" +loading="lazy" +class="gallery-image" +data-flex-grow="136" +data-flex-basis="328px" +></p> +<ul> +<li><a class="link" href="https://www.lfd.uci.edu/~gohlke/pythonlibs/" target="_blank" rel="noopener" +>针对 Windows 预先编译的 Python 扩展包</a>,在使用Python的时候,尤其是在Windows环境,经常会遇到有些扩展包由于依赖某些二进制库的原因导致无法通过pip直接安装,自己动手编译又十分麻烦。这个网站提供了各种预编译版本,可以直接下载网站提供的whl文件到本地然后安装。</li> +</ul> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-09-40-07.png" +width="675" +height="345" +loading="lazy" +class="gallery-image" +data-flex-grow="195" +data-flex-basis="469px" +></p> +<ul> +<li><a class="link" href="https://www.scratchapixel.com/lessons/3d-basic-rendering/introduction-to-ray-tracing" target="_blank" rel="noopener" +> 3D 渲染器入门</a>,一套计算机图形学的入门教程,从原理讲解开始,手把手教你用C++语言编写一个自己的光线追踪渲染器。</li> +</ul> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-09-48-21.png" +width="531" +height="361" +loading="lazy" +class="gallery-image" +data-flex-grow="147" +data-flex-basis="353px" +></p> +<ul> +<li><a class="link" href="https://htmldog.com/" target="_blank" rel="noopener" +>HTMLDOG</a>,前端开发基础知识大全,主要是 HTML、CSS、Javascript 的手把手教学以及语言参考。</li> +</ul> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-09-52-21.png" +width="1862" +height="709" +loading="lazy" +class="gallery-image" +data-flex-grow="262" +data-flex-basis="630px" +></p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 004 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/Tue, 18 Oct 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/<h1 id="机器文摘-第-004-期">机器文摘 第 004 期</h1> +<h2 id="搞机">搞机</h2> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/2022-10-18-09-53-01.png" +width="324" +height="702" +loading="lazy" +class="gallery-image" +data-flex-grow="46" +data-flex-basis="110px" +></p> +<p>美国德州仪器公司出品的TI图形计算器是一种既能计算又能作图的新型的数学使用工具,它具备符号代数系统、几何操作系统、数据分析系统等,可以直观地绘制各种图形,并进行动态演示、跟踪轨迹。</p> +<p>TI实体计算器的售价十分昂贵(相较于其他消费类计算器),这里有一个开源项目<a class="link" href="http://wabbitemu.org/" target="_blank" rel="noopener" +>wabbitemu</a>,使用C语言编写的一个TI计算器的模拟器,可以在电脑上运行并模拟TI计算器,支持多种型号,如TI-82、TI-83、TI-83-plus(需要加载对应的ROM)等。</p> +<p>甚至有人基于这个项目编译出了Android的版本,安装后手机秒变成高级科学计算器。</p> +<p>想进一步了解TI计算器的强大,可以看一下这篇文章<a class="link" href="https://zhuanlan.zhihu.com/p/148392866" target="_blank" rel="noopener" +>《计算器与计算器游戏发展简史》</a>。</p> +<ul> +<li><a class="link" href="http://www.liubaoyi.com/wp-content/uploads/2014/11/Android_Wabbitemu.zip" target="_blank" rel="noopener" +>TI计算器模拟器安卓版本下载地址(含ROM文件)</a></li> +<li><a class="link" href="http://www.liubaoyi.com/wp-content/uploads/2014/11/CX-C-CAS-%E5%9B%BE%E5%BD%A2%E8%AE%A1%E7%AE%97%E5%99%A8%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97.zip" target="_blank" rel="noopener" +>TI计算器使用说明书</a></li> +</ul> +<p>以上资源来自<a class="link" href="http://www.liubaoyi.com/" target="_blank" rel="noopener" +>@Karen的日志</a></p> +<h2 id="观点">观点</h2> +<blockquote> +<p>社交媒体的正确使用方法: +一,不浪费一秒钟时间和知识结构相差太大的人去解释/讨论。你没有义务也没有这个精力。对任何不友好评论,迅速拉黑。 +二,通过公开展示你的思考,来寻找在知识结构,兴趣或技能上,可能与你产生互补作用,或者 1+1&gt;2 的效应的朋友。公开展示长期留存的文字记录,效率最高。</p> +</blockquote> +<p>来自<a class="link" href="https://weibo.com/5339148412/Mal0hACJr" target="_blank" rel="noopener" +>@硅谷王川</a></p> +<h2 id="长文">长文</h2> +<h3 id="我是如何用21天刷完sicp">我是如何用21天刷完SICP</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/2022-10-18-10-56-50.png" +width="411" +height="300" +loading="lazy" +class="gallery-image" +data-flex-grow="137" +data-flex-basis="328px" +></p> +<p>SICP 全称 Structure and Interpretation of Computer Programs,翻译过来叫《计算机程序的构造和解释》,是一本关于计算机程序设计的总体性观念的基础教科书,由麻省理工学院出版社与麦格罗希尔出版社共同出版营销。作者是麻省理工学院教授哈尔·阿伯尔森、杰拉德·杰伊·萨斯曼。</p> +<p>这本书是计算机编程领域非常经典的一本教科书,内容覆盖范围非常广泛,从编程入门一直到教你亲手设计实现一个编程语言解释器。虽然是一本几十年前的书,但是书中的编程理念如数据驱动、过程抽象等到现在仍不过时。可以说是程序员修炼“内功心法”必读的一本好书。</p> +<p>这篇<a class="link" href="http://numbbbbb.com/2016/03/28/20160328_%E6%88%91%E5%A6%82%E4%BD%95%E7%94%A8%E4%B8%A4%E5%91%A8%E6%97%B6%E9%97%B4%E5%88%B7%E5%AE%8C%20SICP/" target="_blank" rel="noopener" +>《我是如何用21天刷完SICP(中文)》</a>的文章讲述了作者通过阅读本书学习的过程和心得,里面的观点可以借鉴,我在看完之后也想再把这本书拿出来学习一遍。</p> +<p>觉得看书太晦涩的,可以到下面这个项目里下载本书作者课堂讲解视频(国内好心人给做了翻译字幕)</p> +<ul> +<li><a class="link" href="https://learningsicp.github.io/" target="_blank" rel="noopener" +>『计算机程序的结构和解释』公开课 翻译项目</a></li> +<li><a class="link" href="https://pan.baidu.com/s/1o78bsYA" target="_blank" rel="noopener" +>百度网盘SICP文件夹</a></li> +<li><a class="link" href="https://www.bilibili.com/video/av8515129/" target="_blank" rel="noopener" +>中译版视频专辑列表(bilibili)</a></li> +</ul> +<h3 id="图解stable-diffusion模型">图解Stable Diffusion模型</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/2022-10-18-10-55-05.png" +width="937" +height="387" +loading="lazy" +class="gallery-image" +data-flex-grow="242" +data-flex-basis="581px" +></p> +<p>这篇<a class="link" href="https://jalammar.github.io/illustrated-stable-diffusion/" target="_blank" rel="noopener" +>图解Stable Diffusion模型(英文)</a>详细讲解了 Stable Diffusion(最近比较火的那个可以通过文字描述进行绘图的AI模型)的工作原理。文中使用清晰的图示阐述了“扩散”模型是怎样通过给图片增加噪声一步一步生成图像的。</p> +<h3 id="wine是如何工作的">Wine是如何工作的</h3> +<p>Linux桌面用户都遇到过在不得不运行 Windows 软件的时候,这个时候就可以使用这个叫做 Wine 的兼容程序,它可以让你在 Linux 下执行 win32 程序。( Valve 最新出品的游戏掌机 Steam Dect 就使用了 Wine 作为兼容层来运行 Windows 平台下的游戏)。</p> +<p>Wine 的名字来自于 “Wine Is Not an Emulator” 这个英文缩写。</p> +<p>这篇<a class="link" href="https://werat.dev/blog/how-wine-works-101/" target="_blank" rel="noopener" +>《Wine是如何工作的(英文)》</a>介绍了它的基本工作原理。</p> +<h3 id="在-windows-记事本里运行光线追踪">在 Windows 记事本里运行光线追踪</h3> +<p>光纤追踪(Ray Tracing)是一项计算机图形学技术,使用该技术渲染的计算机图像具有逼真的全局光照效果。</p> +<p>这篇<a class="link" href="http://kylehalladay.com/blog/2020/05/20/Rendering-With-Notepad.html" target="_blank" rel="noopener" +>《记事本中的光线追踪 30FPS》</a>记录了作者突发奇想要在Windows上的记事本中进行光线追踪渲染的趣事。</p> +<p>其原理是通过系统API获取到记事本窗口的句柄,然后利用钩子函数给记事本的窗体发送相应的“消息”以及覆盖对应的内存数据来实现对记事本窗体界面的“魔改”。最终实现了在另一个进程里执行光线追踪算法,然后借用记事本中显示的字符来替代画面像素,从而“渲染”出画面的效果。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="github.com/SerenityOS/serenity" >SerenityOS项目</a>,一个从头开始的桌面操作系统,内核采用类似Unix的架构,界面外观则仿照了上世纪90年代Windows的窗口风格。作者并未将其定位成玩具,而是一款具备生产力的操作系统软件。 除了操作系统本身,这个项目还有配套的编程语言Jakt、自己的浏览器引擎LibWeb和浏览器Ladybird ​​​</p> +</li> +<li> +<p><a class="link" href="https://github.com/ruanyf/document-style-guide" target="_blank" rel="noopener" +>《中文技术文档写作规范》</a>,<a class="link" href="https://www.ruanyifeng.com/blog/" target="_blank" rel="noopener" +>阮一峰老师</a>整理的技术文档写作规范,规定了标题、文本、段落、标点符号等文档元素的使用约定,需要经常编写技术文档的朋友可以收藏看看。</p> +</li> +<li> +<p><a class="link" href="https://freehand.yunwooo.com/" target="_blank" rel="noopener" +>Freehand意绘</a>,一个在线的AI绘图工具,可以根据文字描述帮助你生成图片,界面简洁友好,使用方便。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/2022-10-18-10-58-24.png" +width="1063" +height="525" +loading="lazy" +class="gallery-image" +data-flex-grow="202" +data-flex-basis="485px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/izackwu/TeachYourselfCS-CN" target="_blank" rel="noopener" +>计算机科学自学指南</a>,提供了一份自学计算机科学的全方位资料大全,可以根据内容系统地进行学习计算机科学相关的知识。</p> +<blockquote> +<p>互联网上,到处都有许多的学习资源,然而精华与糟粕并存。你所需要的,不是一个诸如「200+ 免费在线课程」的清单,而是以下问题的答案:</p> +<p>你应当学习 哪些科目,为什么? +对于这些科目,最好的书籍或者视频课程 是什么? +在这份指引中,我们尝试对这些问题做出确定的回答。</p> +</blockquote> +</li> +<li> +<p><a class="link" href="https://stevens.netmeister.org/631/" target="_blank" rel="noopener" +>UNIX环境中的高级编程</a>,一套编程教程,在课程中,主要学习用C编程语言开发复杂的系统级软件,同时深入了解Unix操作系统(以及属于该家族的所有操作系统,如Linux,BSD,甚至Mac OS X)及其编程环境。</p> +<blockquote> +<p>涵盖的主题将包括用户/内核接口,Unix的基本概念,用户身份验证,基本和高级I / O,文件系统,信号,进程关系和进程间通信。还将涵盖Unix系统上软件开发和维护的基本概念(开发和调试工具,如“make”和“gdb”)。</p> +</blockquote> +</li> +<li> +<p><a class="link" href="https://codeberg.org/drummyfish/tinyphysicsengine" target="_blank" rel="noopener" +>写在C头文件里的3D物理引擎</a>,一个仅用C99标准写在C头文件里的超小物理引擎,没有依赖,直接包含头文件即可在你的工程中使用,功能完整,内置向量、三角函数、引力等计算库。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/2022-10-18-14-04-11.png" +width="399" +height="326" +loading="lazy" +class="gallery-image" +data-flex-grow="122" +data-flex-basis="293px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 003 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/Tue, 11 Oct 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/<h1 id="机器文摘-第003期">机器文摘 第003期</h1> +<h2 id="搞机">搞机</h2> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/2022-10-11-10-17-41.png" +width="853" +height="640" +loading="lazy" +class="gallery-image" +data-flex-grow="133" +data-flex-basis="319px" +></p> +<h3 id="收听广播可以缓解压力个人体会">收听广播可以缓解压力(<em>个人体会</em>)</h3> +<p>近期我找到一个缓解焦虑的新方法,听收音机。</p> +<p>一定要老式的那种,收听真正无线电波信号的。随便找个台,最好还带有滋滋啦啦的杂音,当作工作时的背景声音,听着听着就感觉无比的放松。但又不是简单的“粉红噪音”、“白噪音”带来的那种平静,这种“仿佛脱离现在、回到了某个时空”的感觉让人感到愉悦。</p> +<p>我还没找到相关的研究信息,有人知道原理吗?</p> +<h2 id="动向">动向</h2> +<h3 id="欧洲通过法案将强制统一usb-type-c接口为充电接口">欧洲通过法案,将强制统一USB Type-C接口为充电接口</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/2022-10-11-15-46-02.png" +width="800" +height="450" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></p> +<blockquote> +<p>欧洲议会今天以压倒性多数投票赞成在2024年底之前将USB-C作为包括iPhone和AirPods在内的各种消费电子设备的通用充电端口。</p> +</blockquote> +<p>这对于苹果来说恐怕是个坏消息,对于消费者来说应该是个好消息。不过也许以苹果公司的脾气,说不定将来取消所有物理接口也有可能。</p> +<ul> +<li><a class="link" href="https://www.macrumors.com/2022/10/04/eu-passes-law-to-switch-iphone-to-usb-c-in-2024/" target="_blank" rel="noopener" +>欧洲强制iPhone使用usb-c接口</a></li> +</ul> +<h3 id="波士顿动力承诺不将机器人武器化">波士顿动力承诺不将机器人武器化</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/2022-10-11-10-15-11.png" +width="640" +height="427" +loading="lazy" +class="gallery-image" +data-flex-grow="149" +data-flex-basis="359px" +></p> +<blockquote> +<p>当地时间 10 月 6 日消息,波士顿动力、Agility Robotics、ANYbotics 等 6 家公司联合发表致行业的公开信表达了他们对这些可能性的担忧。他们称,先进的商业化机器人的经济可负担性和可获得性越来越强,其被滥用的可能性也越来越大。我们承诺不会将通用机器人或软件武器化,也不会支持其他人这么做;同时呼吁政策制定者、开发者和用户共同促进安全使用。</p> +</blockquote> +<p>我个人感觉此类声明并不会带来什么限制,相反地,我偏悲观的认为这种技术很可能以最优先的速度被应用于军事目的。</p> +<ul> +<li><a class="link" href="https://www.163.com/dy/article/HJ5DMDS005118DFD.html" target="_blank" rel="noopener" +>网易新闻:波士顿动力承诺不将机器人武器化</a></li> +</ul> +<h3 id="taocpthe-art-of-computer-programming-4b正式初版">TAOCP(《The Art of Computer Programming》) 4B正式初版</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/2022-10-11-10-30-24.png" +width="756" +height="732" +loading="lazy" +class="gallery-image" +data-flex-grow="103" +data-flex-basis="247px" +> +<em>图片来自<a class="link" href="https://weibo.com/5819320755/M9LXaF5I3" target="_blank" rel="noopener" +>@算法时空</a></em></p> +<p>世界著名程序员——高德纳老师,日前在他的个人网站宣布了<a class="link" href="https://www-cs-faculty.stanford.edu/~knuth/news.html#v4b" target="_blank" rel="noopener" +>TAOCP 4B正式出版</a>的消息。</p> +<p>这部计算机世界的经典巨著,耗费了高德纳老爷子的毕生心血,虽然已经出到了第四B卷,但本书目前还没有完全写完(本书从1962年开始写(中间停了几年是因为老爷子发现没有趁手的排版软件,就顺手发明了TEX——这又是另一个宏大话题了),计划共有七卷,其中第四卷分ABC三册)。他在自己主页中提到:</p> +<blockquote> +<p>与此同时,我继续研究第3部分(第4C卷),它已经有许多令人兴奋的主题。</p> +</blockquote> +<p>我只能说:祝老爷子身体健康!</p> +<h3 id="webassembly技术发展的怎么样了">WebAssembly技术发展的怎么样了?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/2022-10-11-10-45-39.png" +width="386" +height="383" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="241px" +></p> +<blockquote> +<p>WebAssembly 是一种运行在现代网络浏览器中的新型代码,并且提供新的性能特性和效果。它设计的目的不是为了手写代码而是为诸如 C、C++和 Rust 等低级源语言提供一个高效的编译目标。 +——来自<a class="link" href="https://developer.mozilla.org/zh-CN/docs/WebAssembly/Concepts" target="_blank" rel="noopener" +>Mozilla官方文档关于WebAssembly概念的介绍</a>。</p> +</blockquote> +<p>WebAssembly技术号称可以在浏览器中高效执行代码,并可以很方便地将C、Rust等各种语言编译到浏览器中执行,那么目前他的使用体验如何?</p> +<p>我周末做了简单体验。</p> +<p>通过官方给出的文档和入门指南,可以很快速地搭建出程序的原型,上图就是我参考官方示例将Rust代码编译到网页中执行的效果(是一个<a class="link" href="https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life" target="_blank" rel="noopener" +>经典的Game of life的小游戏</a>)。</p> +<p>从开发上来说,现在已经有了比较成熟的工具链(尤其是针对Rust语言到WASM的工具),和共享库的生态,想要进行开发,不必像前些年那样费心地搭建开发环境,基本上在Linux系统下简单执行几行命令即可完成环境搭建。</p> +<p>从执行效果来说,我没有做性能测试,直观感受上来说,确实比原生js快了不少。</p> +<p>但这并不是重点,我个人觉得这项技术它最大的意义在于,将之前的桌面程序技术有了向Web移植的可行性。</p> +<p>我们有可能很快就看到完全兼顾Web分发的方便和桌面程序性能体验的产品。</p> +<ul> +<li><a class="link" href="https://www.infoq.cn/article/hdwglnhub2wwklo9zz6z" target="_blank" rel="noopener" +>一则WebAssembly相关的新闻</a></li> +<li><a class="link" href="https://github.com/mbasso/awesome-wasm" target="_blank" rel="noopener" +>GitHub网友整理的关于WASM的资源大全</a></li> +<li><a class="link" href="https://rustwasm.github.io/docs/book/introduction.html" target="_blank" rel="noopener" +>一本手把手教你使用Rust语言进行WASM开发的在线电子书</a></li> +<li><a class="link" href="https://zalo.github.io/CascadeStudio" target="_blank" rel="noopener" +>一个使用WASM技术将三维设计软件CAD嵌入到网页中的开源项目</a></li> +<li><a class="link" href="https://supabase.com/blog/postgres-wasm" target="_blank" rel="noopener" +>一个使用WASM技术在浏览器中运行的PostgresSQL数据库</a></li> +</ul> +<h2 id="观点">观点</h2> +<blockquote> +<p>在你的密码里面放上一个逗号<code>&quot;,&quot;</code>,这样当你的密码在网上被人拖库时可以给黑客增加一些麻烦,因这样会使得他在作为csv文件往他的密码字典里面导入的时候,因为逗号分隔符的错位而让他崩溃。 +注:csv文件默认使用逗号分隔符区分字段。</p> +</blockquote> +<ul> +<li>来自:佚名网友。</li> +</ul> +<blockquote> +<p>当你长期使用windows远程桌面进行远程办公时,一层一层的服务器登进去,时间长了就会陷入盗梦空间那种疑惑,我现在是在哪一层?</p> +</blockquote> +<ul> +<li>来自:我自己。</li> +</ul> +<blockquote> +<p>量子计算机就是向过去和未来借用了很多乃至无限的时间吗?刹那即永恒。 +注:量子计算机号称每个bit位可在同一时刻表示多种状态。</p> +</blockquote> +<ul> +<li>来自:我自己。</li> +</ul> +<h2 id="长文">长文</h2> +<h3 id="从0到1打造家庭弱电方案">从0到1打造家庭弱电方案</h3> +<p>现在有不少人在困惑家里的网线该如何布局,这篇<a class="link" href="https://luolei.org/home-network-1/" target="_blank" rel="noopener" +>《从0到1打造家庭弱电方案》(中文)</a>记录了作者完整的装修过程,内容十分精彩详尽。看完之后我有点儿后悔,当时装修时没有给各个房间拉上光纤,以及用了比较普通的超五类网线。</p> +<h3 id="如何配置一个完全基于命令行窗口的开发环境">如何配置一个完全基于命令行窗口的开发环境</h3> +<p>我在油管上关注了一个日本小哥(Takuya Matsuyama),是一个个人开发者,经常上传自己的开发过程录屏,他完全基于命令行窗口(控制台)进行开发,没使用任何IDE。</p> +<p>后来我参考他的配置文件给自己也配置了一套,使用fish作为shell,neovim加上各种插件作为主力编辑器,现已成为我的日常开发环境。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/2022-10-11-11-16-56.png" +width="1571" +height="820" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="459px" +></p> +<p>有条件的可以到他的主页看看关于如何配置的详细介绍,或者直接去他的github仓库获取配置文件。</p> +<ul> +<li><a class="link" href="https://www.craftz.dog/posts" target="_blank" rel="noopener" +>Takuya Matsuyama小哥的主页</a></li> +<li><a class="link" href="https://github.com/craftzdog/dotfiles-public" target="_blank" rel="noopener" +>他的基于控制台命令行开发的各种配置文件</a></li> +</ul> +<h3 id="云桌面并不像你想的那么好">云桌面并不像你想的那么好</h3> +<p>给开发人员配置一个廉价的笔记本加上一个高性能的云端工作站,这个点子棒不棒?</p> +<p>听起来有很多的优势,兼具了性能、便携性、安全性等等。</p> +<p>不过先等一等,这里有一位作者在这样尝试了之后,给出了不少负面反馈(比如多显示器支持、GPU加速、网页视频质量等等问题),有兴趣的可以点进去看看。</p> +<ul> +<li><a class="link" href="https://mjg59.dreamwidth.org/61535.html" target="_blank" rel="noopener" +>《云桌面并不像你想象的那么好》(英文)</a></li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://webusers.imj-prg.fr/~jan.nekovar/co/en/en.pdf" target="_blank" rel="noopener" +>从高中到大学,数学中常用符号和计算关系的英文名称</a>,适合对数学公式中的各种符号感到困惑的人收藏,这本小册子汇聚了所有数学符号、常用希腊字母、代数式等英文叫法介绍。</li> +<li><a class="link" href="http://www.egr.unlv.edu/~ed/x86.html" target="_blank" rel="noopener" +>如何在Ubuntu下进行x86-x64汇编语言编程</a>,一本讲解现代汇编语言的电子书,基于常用的Ubuntu系统,从认识汇编语言开始讲起,到工具链的准备和怎样编写和调试程序,都有详细的介绍。</li> +<li><a class="link" href="https://www.drawkit.com/" target="_blank" rel="noopener" +>DrawKit</a>,一个提供矢量插画的网站,有很多免费的高质量插画,可用于网站制作、软件产品等方面。</li> +<li><a class="link" href="https://missing-semester-cn.github.io/" target="_blank" rel="noopener" +>计算机教育中缺失的一课</a>,一般学校里不会教开发环境的配置和各种效率工具的使用,这本电子书就是以环境和工具为切入点,将学校学习的理论应用于实际,比较接地气。 +<blockquote> +<p>大学里的计算机课程通常专注于讲授从操作系统到机器学习这些学院派的课程或主题,而对于如何精通工具这一主题则往往会留给学生自行探索。在这个系列课程中,我们讲授命令行、强大的文本编辑器的使用、使用版本控制系统提供的多种特性等等。学生在他们受教育阶段就会和这些工具朝夕相处(在他们的职业生涯中更是这样)。 因此,花时间打磨使用这些工具的能力并能够最终熟练地、流畅地使用它们是非常有必要的。</p> +</blockquote> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 002 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/Mon, 03 Oct 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/<h1 id="机器文摘-第002期">机器文摘 第002期</h1> +<h2 id="搞机">搞机</h2> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/2022-10-03-11-08-56.png" +width="895" +height="689" +loading="lazy" +class="gallery-image" +data-flex-grow="129" +data-flex-basis="311px" +></p> +<blockquote> +<p>MNT推出了一款名叫Pocket Reform的迷你笔记本电脑。它外形紧凑(屏幕只有7英寸),但功能齐全,据官方介绍,它的性能满足轻量办公需求,甚至还能玩一些游戏(ARM平台)。虽然现在的智能手机在性能方面已经有了很大提升,且便携性远超笔记本电脑,但是还是有相当一部分人倾向于在具有真实物理键盘的“电脑”上进行操作。</p> +</blockquote> +<p>在我看来,这台设备可能对于希望随时随地写两行代码的程序员更加具有吸引力。</p> +<ul> +<li>参考文章: +<ul> +<li><a class="link" href="https://spectrum.ieee.org/meet-an-open-source-pc-that-can-fit-in-your-pocket" target="_blank" rel="noopener" +>可以装在口袋里的开源PC</a></li> +</ul> +</li> +</ul> +<h2 id="动向">动向</h2> +<h3 id="文字直接生成3d模型">文字直接生成3D模型</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/2022-10-03-11-41-32.png" +width="735" +height="491" +loading="lazy" +class="gallery-image" +data-flex-grow="149" +data-flex-basis="359px" +> +谷歌实验室的几个哥们上周发布了一个新作&mdash;-DreamFusion。输入文字,就能生成带深度图和法线的3D模型。</p> +<p>开发团队声称:</p> +<blockquote> +<p>最近在文本到图像合成方面的突破是基于在数十亿个图像-文本对上训练的扩散模型。将这种方法应用于3D合成将需要标记大量的3D资产和用于对3D数据进行去噪的高效架构,而目前这都不太可行。在DreamFusion中,我们通过使用预先训练的2D文本到图像扩散模型来执行文本到3D合成来规避这些限制。我们的方法不需要3D训练数据,也不需要修改图像扩散模型,证明了预训练图像扩散模型作为先验的有效性。</p> +</blockquote> +<p>具体方法据称是来自他们新提出的“一种通过优化损失函数从扩散模型中生成采样的方法”该方法允许他们在任意参数空间中优化采样(例如3D空间)。</p> +<p>我看了一下官方给出的demo,3D模型还略显粗糙,不过可能将来算力提升之后会有改善。</p> +<p>现在,除了插画师受到了职业威胁,就连3D建模工程师的工作也有可能被AI取代?</p> +<ul> +<li>参考文章: +<ul> +<li><a class="link" href="https://dreamfusion3d.github.io/" target="_blank" rel="noopener" +>DreamFusion官方介绍</a></li> +</ul> +</li> +</ul> +<h3 id="通过文字描述生成语音的人工智能也来了">通过文字描述生成语音的人工智能也来了</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/2022-10-03-11-32-54.png" +width="909" +height="451" +loading="lazy" +class="gallery-image" +data-flex-grow="201" +data-flex-basis="483px" +></p> +<blockquote> +<p>Twitter 用户 Felix Kreuk 发布了从文本到音频 (Text to Audio) 的 AI 模型:AudioGen +AudioGen 可以 +(1) 根据文本生成音频;(2) 续写指定的音频;(3) 同时做以上两件事,根据指定文本描述生成指定音频。 +作者给出的展示DEMO里展示了如下文本生成的语音: +(1)在风声中吹口哨 +(2)男人在说话时伴有鸟和狗的叫声 +(3)警报器和嗡嗡作响的引擎接近后走远 +(4)鸽子咕咕叫并伴有沙沙的声音 +(5)男人说话的声音,背景伴有人群欢呼声</p> +</blockquote> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/2022-10-03-11-33-50.png" +width="1147" +height="629" +loading="lazy" +class="gallery-image" +data-flex-grow="182" +data-flex-basis="437px" +> +从作者公布的架构图上可以看出来,采用的也是Transformer神经网络。之前在看到AI画图时我就想到同样的原理可能用于生成音频,结果这才没过几天,人家都已经做出来了。</p> +<ul> +<li>参考文章: +<ul> +<li><a class="link" href="https://weibo.com/1309158107/M8mPt5LgI" target="_blank" rel="noopener" +>@海辛Hyacinth</a></li> +<li><a class="link" href="https://felixkreuk.github.io/text2audio_arxiv_samples/" target="_blank" rel="noopener" +>作者的demo和原理介绍页面(托管在github)</a></li> +</ul> +</li> +</ul> +<h2 id="观点">观点</h2> +<blockquote> +<p>站桩的简单,枯燥和有效,就好比持有 sp500 指数基金简单,枯燥但足以秒杀 95%以上的基金经理一样。 +莫将容易得,便作等闲看。</p> +</blockquote> +<ul> +<li>来自<a class="link" href="https://weibo.com/5339148412/LeTdmcfjW" target="_blank" rel="noopener" +>@硅谷王川</a></li> +</ul> +<h2 id="长文">长文</h2> +<ul> +<li> +<p><a class="link" href="https://randomascii.wordpress.com/2022/09/29/why-modern-software-is-slow-windows-voice-recorder/" target="_blank" rel="noopener" +>为什么现在的软件这么慢(英文)</a>,作者在Windows系统(Windows 10, 21H2版本)下使用“录音机App”的时候获得了极差的体验(确切的说是软件启动后大概卡死了将近20秒)。于是动手分析到底是什么原因导致,然后发现主要是这个软件启动后疯狂扫描“用户”文件夹下的录音文件用于构建界面中的录音列表,这种密集IO操作导致软件停止响应。作者花了很大的篇幅来吐槽这种行为,对于微软工程师为什么这么做表示莫名其妙。不过由于我们现在的计算机大都使用了固态硬盘,而且我们的习惯一般不会在“用户”文件夹下存放太多文件,所以这个体验应该不太明显。但即使这样,我也同样对Windows系统现在的软件质量感到担忧。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/2022-10-03-18-24-45.png" +width="643" +height="310" +loading="lazy" +class="gallery-image" +data-flex-grow="207" +data-flex-basis="497px" +></p> +</li> +<li> +<p><a class="link" href="http://zhangtielei.com/posts/blog-involution-analysis.html" target="_blank" rel="noopener" +>内卷、汉明问题与认知迭代(中文)</a>,作者较为科学地分析了内卷的定义和形态,从而引申出了关于什么是“人生中重要的事”的思考,文章虽然比较长,但也清晰易懂,发人深省。部分引用如下:</p> +<blockquote> +<p>从大的方面说,社会需要创新,个人则需要突破,而创新和突破又都要求我们不断地精益求精。那么,内卷与精益求精是本质上一样的吗?如果不是,两者的区别在哪?</p> +</blockquote> +<blockquote> +<p>在某件事情上花费太多精力,并不一定就是内卷;在无关紧要的事情上花费精力才是真的内卷。</p> +</blockquote> +<blockquote> +<p>汉明早年在贝尔实验室工作。那年春天,他经常和几位同事聚在一起在餐厅吃午饭。吃饭期间,他向其中一位叫Dave McCall的同事提了一个问题:“在你的领域里最重要的问题是什么?”大约一个星期后,再次一起午餐时他继续发问:“你目前正在研究的最重要的问题是什么?” 显然,这位同伴对于这两个问题的回答并不一样。于是他接着问:“如果你当前做的并不是最重要的事,那为什么还要一直花时间投入去做呢?”有了这「灵魂三问」之后,于是——在那个春天接下来的日子里,汉明不得不另找别的同伴一起吃午饭了…… +汉明的问题听起来有些让人生厌,但后来演变成了一个在学术界很受关注的问题——汉明问题(The Hamming Question)。它本来说的是科研选题的事情,但实际上关乎人生最重要的选择。</p> +</blockquote> +<blockquote> +<p>内卷,指的是在低水平的状态下无实质意义的消耗。这里的「低水平」,可能是客观的,也可能是主观的。 +针对主观的低水平状态,我们需要冲破意识层面的障碍,同时把读书、实践和思考结合起来,反复迭代,这样才可能跃升到更高的认知层次上。 +而针对客观的低水平状态,唯有认真对待汉明问题,选择好真正重要的人生大方向,才能避免卷入那些无关紧要的、无谓的消耗中去。这才是真正考验大智慧的时候了。</p> +</blockquote> +</li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/mtdvio/every-programmer-should-know" target="_blank" rel="noopener" +>每个程序员都需要知道的</a> ,整理了一份资源合集,包含了软件工程师技能相关的各类知识资源,包括算法、数据结构、浮点、Unicode、时间、内存、分布式、正则、安全、架构、工程哲学、实践、职业发展、软技能。。。等等,以及一些可用于技能训练和学习的站点。看起来非常符合我这种“收藏了就是学习了”的囤积爱好者的胃口。</li> +<li><a class="link" href="https://github.com/jefflomax/word-writer-6-commodore-64" target="_blank" rel="noopener" +>Word Writer 6 6502汇编源码</a>,是一份开源的Word Writer 6的6502汇编源码,可在模拟器下编译运行。用来学习6502汇编是一个不错的项目。上个世纪80年代爆火的计算机Commodore 64是很多复古计算机爱好者(包括我)的最爱,Word Writer 6是该平台上流行的文字排版编辑软件。</li> +<li><a class="link" href="https://almanac.httparchive.org/zh-CN/2022/" target="_blank" rel="noopener" +>HTTP Archive的年度报告</a>,这份报告详细(超级详细)分析了目前全球各在线网页中所使用的技术,从页面中的“CSS”、“Javascript”、“字体”以及用户体验中的“搜索引擎优化”、“移动端支持”等超过20个方面进行展示,内容十分详尽,有种看NBA的进球统计的感觉。</li> +<li><a class="link" href="https://javascriptquiz.com/" target="_blank" rel="noopener" +>Javascript Quiz</a>,一份关于Javascript的小测验,可在线作答,一共十道选择题,全是关于Js语法的常见坑,每道题答完之后都可以点击“info”图标获取关于这道题的详细解释。我试着做了一下,勉强及格。</li> +<li><a class="link" href="https://www.musi-co.com/listen/streams" target="_blank" rel="noopener" +>Streams</a>,这里有一批纯AI创作的音乐,由AI负责作曲和编曲,工程师只是把这些乐谱放入DAW软件中进行混音和录音,完成度很高,听起来相当上头。</li> +<li><a class="link" href="https://learningsynths.ableton.com/zh-Hans/get-started" target="_blank" rel="noopener" +>学习合成器</a>,这个网站提供了一本交互式电子书,讲解了电子合成器的原理,还单独提供了一个交互页面用于调制和体验各种合成器音色。我尝试了一下,真的很直观,在页面中直接可以修改各种振荡器波形、滤波器、LFO等参数,非常适合用于音色合成入门。</li> +<li><a class="link" href="https://llh911001.gitbooks.io/mostly-adequate-guide-chinese/content/" target="_blank" rel="noopener" +>函数式编程指北</a>,在线电子书,讲解函数式编程的范式,以Javascript进行举例,作者风趣幽默,深入浅出,觉得被函数编程概念唬住的可以去看看。</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 001 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-001-%E6%9C%9F/Wed, 28 Sep 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-001-%E6%9C%9F/<h1 id="机器文摘-第001期">机器文摘 第001期</h1> +<h2 id="搞机">搞机</h2> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-001-%E6%9C%9F/2022-09-28-09-38-31.png" +width="641" +height="571" +loading="lazy" +class="gallery-image" +data-flex-grow="112" +data-flex-basis="269px" +></p> +<blockquote> +<p>TurnT是一个颇具创意的唱盘设计,它把智能手机与模拟黑胶的老式音乐播放方式相结合。用家把触笔放在手机屏幕显示的黑胶唱片上,它即开始播放。从内部结构上看,它其实是一个无线扬声器,可以连接到智能手机播放音乐。TurnT这种播放音乐的体验增加了互动的体验感,如同在实际的唱片上一样,挪开唱针会立即停止音乐,将其“向内”移动到手机屏幕上显示的光盘中心就可以播放音乐。要更改歌曲,您可以通过滑动来更改专辑,还可以重新定位。</p> +</blockquote> +<ul> +<li>参考文章: +<ul> +<li><a class="link" href="https://www.sohu.com/a/573073318_121124377" target="_blank" rel="noopener" +>把手机变成黑胶唱机 &mdash; Yamaha发布了与智能手机配合使用的独特音乐设备</a></li> +</ul> +</li> +</ul> +<h2 id="动向">动向</h2> +<h3 id="ai生成图像技术带来的艺术危机">AI生成图像技术带来的“艺术危机”</h3> +<blockquote> +<p>近几周,基于AI生成的图像艺术作品的新闻越来越多,以DALL-E、Stable Diffusion等神经网络模型为代表的图像生成类AI进化越来越快,已达“以假乱真”程度。我也在动手尝试后惊叹他们的生成效果非常逼真和充满想象力。然而很快,此类AI就引起设计师、画师、艺术家的反对(恐慌?)。当然也有很多持积极态度,把它们当作工具加以利用,甚至不乏商业头脑灵活的人士,已经通过AI作画开始获取收益。于是引发了一系列的反应和讨论。</p> +</blockquote> +<ul> +<li>参考文章: +<ul> +<li><a class="link" href="https://www.uisdc.com/unsplash-prohibited-ai" target="_blank" rel="noopener" +>知名图库Unsplash 宣布禁传AI生成图像</a></li> +<li><a class="link" href="https://www.51cto.com/article/719747.html" target="_blank" rel="noopener" +>付费图库集体封禁AI生成图片</a></li> +<li><a class="link" href="https://www.bilibili.com/read/cv18571483" target="_blank" rel="noopener" +>AI 绘画 Windows 本地零基础搭建 Stable Diffusion</a></li> +<li><a class="link" href="https://zhuanlan.zhihu.com/p/560226367" target="_blank" rel="noopener" +>AI数字绘画 stable-diffusion 保姆级教程</a></li> +<li><a class="link" href="https://github.com/ahrm/UnstableFusion" target="_blank" rel="noopener" +>一个包装好的AI绘图开源GUI客户端</a></li> +</ul> +</li> +</ul> +<h2 id="观点">观点</h2> +<blockquote> +<p>程序员是计算机的翻译官。他们先是把人类的语言翻译成计算机的语言,现在又教会了计算机使用人类的语言。</p> +<ul> +<li>来自<a class="link" href="https://weibo.com/6827625527/M7vHNl9HD" target="_blank" rel="noopener" +>@t0mbkeeper</a></li> +</ul> +</blockquote> +<h2 id="长文">长文</h2> +<ul> +<li>对很多事情都有兴趣,但是生命的时间有限,怎么办?<a class="link" href="https://news.ycombinator.com/item?id=32628511" target="_blank" rel="noopener" +>这篇hacker news上的讨论(英文)</a>或许能提供一些建议。</li> +<li><a class="link" href="https://www.calnewport.com/blog/2022/05/16/taking-a-break-from-social-media-makes-you-happier-and-less-anxious/" target="_blank" rel="noopener" +>这篇文章提到了一项关于焦虑的研究(英文)</a>。研究表明,远离社交媒体(包括及时通讯工具)一个星期,可以显著提升幸福感、降低焦虑程度;</li> +<li>掌握一项技能需要时间和实践,降低预期,慢即是快。<a class="link" href="https://geekplux.com/posts/how-i-learned-programming" target="_blank" rel="noopener" +>《我是如何学会编程的》(中文)</a>,这篇文章是一位网友分享的关于他学习编程的历程。</li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https:///coding-fonts.netlify.app/" target="_blank" rel="noopener" +>coding-fonts</a> ​​​是一个不错的编程字体网站,可以在线预览各种适合编程开发时用的字体,让选择更加直观。</li> +<li><a class="link" href="https://github.com/opendilab/DI-sheep" target="_blank" rel="noopener" +>深度强化学习羊了个羊</a> 这个github仓库开源了一个通过AI强化学习来玩耍“羊了个羊”游戏的模型及代码,结构清晰,效果很棒,用于了解深度强化学习知识非常不错。</li> +<li><a class="link" href="https://github.com/scutan90/DeepLearning-500-questions" target="_blank" rel="noopener" +>深度学习500问</a>这本在线书籍以问答形式对常用的概率知识、线性代数、机器学习、深度学习、计算机视觉等热点问题进行阐述,目前在github将近50k颗星。</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p> \ No newline at end of file diff --git "a/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/1/index.html" "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/1/index.html" new file mode 100644 index 000000000..aa8d8e58f --- /dev/null +++ "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/1/index.html" @@ -0,0 +1 @@ +https://sbabybird.github.io/categories/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98/ \ No newline at end of file diff --git "a/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/10/index.html" "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/10/index.html" new file mode 100644 index 000000000..ce7c3874e --- /dev/null +++ "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/10/index.html" @@ -0,0 +1,34 @@ +Category: 机器文摘 - Learning & Writing!

Categories

机器文摘

这里会定期分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘(MachineDigest)”吧。

+ \ No newline at end of file diff --git "a/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/2/index.html" "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/2/index.html" new file mode 100644 index 000000000..87f31ebef --- /dev/null +++ "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/2/index.html" @@ -0,0 +1,35 @@ +Category: 机器文摘 - Learning & Writing!

Categories

机器文摘

这里会定期分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘(MachineDigest)”吧。

+ \ No newline at end of file diff --git "a/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/3/index.html" "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/3/index.html" new file mode 100644 index 000000000..f393e099c --- /dev/null +++ "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/3/index.html" @@ -0,0 +1,36 @@ +Category: 机器文摘 - Learning & Writing!

Categories

机器文摘

这里会定期分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘(MachineDigest)”吧。

+ \ No newline at end of file diff --git "a/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/4/index.html" "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/4/index.html" new file mode 100644 index 000000000..ab1091e31 --- /dev/null +++ "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/4/index.html" @@ -0,0 +1,37 @@ +Category: 机器文摘 - Learning & Writing!

Categories

机器文摘

这里会定期分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘(MachineDigest)”吧。

+ \ No newline at end of file diff --git "a/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/5/index.html" "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/5/index.html" new file mode 100644 index 000000000..7442e7ce6 --- /dev/null +++ "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/5/index.html" @@ -0,0 +1,37 @@ +Category: 机器文摘 - Learning & Writing!

Categories

机器文摘

这里会定期分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘(MachineDigest)”吧。

+ \ No newline at end of file diff --git "a/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/6/index.html" "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/6/index.html" new file mode 100644 index 000000000..79b0536a6 --- /dev/null +++ "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/6/index.html" @@ -0,0 +1,37 @@ +Category: 机器文摘 - Learning & Writing!

Categories

机器文摘

这里会定期分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘(MachineDigest)”吧。

+ \ No newline at end of file diff --git "a/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/7/index.html" "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/7/index.html" new file mode 100644 index 000000000..7053e8f3f --- /dev/null +++ "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/7/index.html" @@ -0,0 +1,37 @@ +Category: 机器文摘 - Learning & Writing!

Categories

机器文摘

这里会定期分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘(MachineDigest)”吧。

+ \ No newline at end of file diff --git "a/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/8/index.html" "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/8/index.html" new file mode 100644 index 000000000..90c8cd3fa --- /dev/null +++ "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/8/index.html" @@ -0,0 +1,36 @@ +Category: 机器文摘 - Learning & Writing!

Categories

机器文摘

这里会定期分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘(MachineDigest)”吧。

+ \ No newline at end of file diff --git "a/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/9/index.html" "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/9/index.html" new file mode 100644 index 000000000..fc340a639 --- /dev/null +++ "b/categories/\346\234\272\345\231\250\346\226\207\346\221\230/page/9/index.html" @@ -0,0 +1,35 @@ +Category: 机器文摘 - Learning & Writing!

Categories

机器文摘

这里会定期分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘(MachineDigest)”吧。

+ \ No newline at end of file diff --git "a/categories/\347\237\245\350\257\206\347\256\241\347\220\206/index.html" "b/categories/\347\237\245\350\257\206\347\256\241\347\220\206/index.html" new file mode 100644 index 000000000..1f2ccae94 --- /dev/null +++ "b/categories/\347\237\245\350\257\206\347\256\241\347\220\206/index.html" @@ -0,0 +1,31 @@ +Category: 知识管理 - Learning & Writing!

Categories

知识管理

+ \ No newline at end of file diff --git "a/categories/\347\237\245\350\257\206\347\256\241\347\220\206/index.xml" "b/categories/\347\237\245\350\257\206\347\256\241\347\220\206/index.xml" new file mode 100644 index 000000000..da8ca84c8 --- /dev/null +++ "b/categories/\347\237\245\350\257\206\347\256\241\347\220\206/index.xml" @@ -0,0 +1,37 @@ +知识管理 on Learning & Writing!https://sbabybird.github.io/categories/%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86/Recent content in 知识管理 on Learning & Writing!Hugo -- gohugo.iozh-cnSat, 23 Apr 2022 00:00:00 +0000基于Markdown格式的知识管理尝试计划https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8Emarkdown%E6%A0%BC%E5%BC%8F%E7%9A%84%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86%E5%B0%9D%E8%AF%95%E8%AE%A1%E5%88%92/Sat, 23 Apr 2022 00:00:00 +0000https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8Emarkdown%E6%A0%BC%E5%BC%8F%E7%9A%84%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86%E5%B0%9D%E8%AF%95%E8%AE%A1%E5%88%92/<h2 id="背景">背景</h2> +<ul> +<li>之前一直有收藏文章并整理自己知识体系的习惯,使用的工具是evernote(印象笔记),十多年来收集数百篇网络文章,自己整理并编写笔记若干篇,已做到目录和标签的基本分类;</li> +<li>之前也有通过每日编写一个markdown文件来记录工作日志、零星日记的习惯,有心得感悟时都直接在工作日志中随手写入,保存起来;</li> +<li>通过github pages写过一些个人博客文章,更新频率不高,主要作为个人笔记在使用;</li> +<li>当前问题如下: +<ul> +<li>evernote用户体验逐年下降,对设备限制较多,且内容存在云端、格式封闭,个人掌控感较差,数据有无法访问的风险;</li> +<li>工作日志中散落的心得感悟没有索引,基本埋没在以日期命名的文件里,不成体系;</li> +<li>收集的数百篇网络文章基本没有进行消化阅读,未形成自己理解的内容;</li> +</ul> +</li> +</ul> +<h2 id="目标">目标</h2> +<ul> +<li>为网络收藏和个人产出的文章建立索引,把之前的“仓库”形成“体系”;</li> +<li>从evernote中迁移出来,所有数据放在本地,并通过在线网盘进行同步;</li> +<li>以纯文本+附件资源作为载体,避免对一种编辑器或工具产生过度依赖;</li> +</ul> +<h2 id="工具选择">工具选择</h2> +<ul> +<li><a class="link" href="https://obsidian.md/" target="_blank" rel="noopener" +>Obsidian</a>,用于建立最基本的知识仓库,编辑自己的知识卡片,并充分利用它的双向链接功能将收藏的文章和自己输出的内容形成体系连接起来;</li> +<li><a class="link" href="https://code.visualstudio.com/" target="_blank" rel="noopener" +>vscode</a>, 用于编辑技术文章、工作日志以及基于插件进行绘图,最终输出内容到Obsidian文件库中;</li> +<li>360网盘,用于在线实时同步存储Markdown的文件夹,任何具有同步文件功能的网盘均可;</li> +</ul> +<h2 id="具体计划">具体计划</h2> +<ul> +<li>整理文章目录:按照文章来源(网络、书籍、心得)、知识层面(技术、生活、哲学)等进行分类,形成树状目录结构;</li> +<li>整理文章标签:每篇文章虽然只属于一个目录,但是可以有多个标签,提升了检索文章的维度。目录作为知识体系的骨架分类,标签则是详细划分(如技能相关的标签就可以有:编程、绘画、音乐、写作,并还能进一步细分);</li> +<li>参考少数派文章<a class="link" href="https://sspai.com/post/62414" target="_blank" rel="noopener" +>玩转 Obsidian 01:打造知识循环利器</a>提到的Zettelkasten笔记法逐步整理多年积累的知识形成以“知识卡”(其实就是具有互相链接关系的Markdown文件)为单位的知识;</li> +<li>[[玩转 Obsidian 01:打造知识循环利器 - 少数派]]</li> +<li>阅读整理多年收集的知识文章,按照大约每周一篇的节奏,产出自己理解后的知识卡片,形成“知识循环”;</li> +<li>如此往复若干时间,不断完善这个体系,工具可更换,载体亦可更换,唯独不变的是探索、求知的心;</li> +</ul> \ No newline at end of file diff --git "a/categories/\347\237\245\350\257\206\347\256\241\347\220\206/page/1/index.html" "b/categories/\347\237\245\350\257\206\347\256\241\347\220\206/page/1/index.html" new file mode 100644 index 000000000..ce518e569 --- /dev/null +++ "b/categories/\347\237\245\350\257\206\347\256\241\347\220\206/page/1/index.html" @@ -0,0 +1 @@ +https://sbabybird.github.io/categories/%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86/ \ No newline at end of file diff --git "a/categories/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" "b/categories/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" new file mode 100644 index 000000000..9b48a9781 --- /dev/null +++ "b/categories/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" @@ -0,0 +1,31 @@ +Category: 读书笔记 - Learning & Writing!

Categories

读书笔记

+ \ No newline at end of file diff --git "a/categories/\350\257\273\344\271\246\347\254\224\350\256\260/index.xml" "b/categories/\350\257\273\344\271\246\347\254\224\350\256\260/index.xml" new file mode 100644 index 000000000..01080d94e --- /dev/null +++ "b/categories/\350\257\273\344\271\246\347\254\224\350\256\260/index.xml" @@ -0,0 +1,133 @@ +读书笔记 on Learning & Writing!https://sbabybird.github.io/categories/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/Recent content in 读书笔记 on Learning & Writing!Hugo -- gohugo.iozh-cnSun, 18 Apr 2021 00:00:00 +0000《少有人走的路》读书笔记https://sbabybird.github.io/p/%E5%B0%91%E6%9C%89%E4%BA%BA%E8%B5%B0%E7%9A%84%E8%B7%AF%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/Sun, 18 Apr 2021 00:00:00 +0000https://sbabybird.github.io/p/%E5%B0%91%E6%9C%89%E4%BA%BA%E8%B5%B0%E7%9A%84%E8%B7%AF%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/<h2 id="简介">简介</h2> +<p>《少有人走的路-心智成熟的旅程》这本书据说是畅销多年,经久不衰,在豆瓣上评分很高。不少人纷纷表示此书给自己带来了很多思考和感悟。我是在今年第二遍阅读了此书,之前大约十年前草草看过一遍,印象不够深刻。但今年再读,书中就有很多文字能够读进去了。虽然作者本身对“爱”的定义和解读我并不完全认同,以及作者也许受宗教信仰的影响,在某些观点上有一定的倾向,但都不妨碍这本书给我带来震撼。</p> +<h2 id="笔记">笔记</h2> +<blockquote> +<p>人生苦难重重。</p> +</blockquote> +<p>开篇就表达了最基本的设定,让我闭上本来想要抱怨的嘴,不得不跟着往后翻看有没有可以解决的答案。</p> +<blockquote> +<p>解决人生问题的关键在于自律。人若缺少自律,就不可能解决任何麻烦和问题。在某些方面自律,只能解决某些问题,全面的自律才能解决人生所有的问题。</p> +</blockquote> +<p>在认真看本书之前,我对“自律”的理解还仅限于在生活上严格要求自己,作息规律、遵守诺言、办事靠谱、简约不浪费。但作者显然不仅仅是这个意思,否则也用不着用很大的篇幅来说“自律”。</p> +<p>看一下作者对“自律”的定义。</p> +<blockquote> +<p>所谓自律,就是主动要求自己以积极的态度去承受痛苦,解决问题。自律有四个原则:推迟满足感、承担责任、忠于事实、保持平衡。</p> +</blockquote> +<p>只有不回避问题、以积极的心态去解决问题,才算作是自律。即便在生活中早睡早起、刻苦读书、勤奋工作,如果遇到问题首先想要逃避,那就不能算是自律。很惭愧,我之前在不少问题上都是以拖延为主要处理方式,本质上还是无法承受或者面对解决问题可能带来的痛苦,那么在读了本书之后,我会有意识地去改变做事原则,就拿上周来说,我终于鼓起勇气去诊所看牙,解决了拖了很久的牙结石问题(虽然智齿还没解决)。</p> +<blockquote> +<p>推迟满足感,就是不贪图暂时的安逸,先苦后甜,重新设置人生快乐与痛苦的次序:首先,面对问题并感受痛苦;然后,解决问题并享受更大的快乐。在充满问题和痛苦的人生中,推迟满足感是唯一可行的生活方式。</p> +</blockquote> +<p>这个话题不仅仅是在本书中提到过,据说有心理学家做过试验,在一群孩子里面寻找具有“推迟满足感”倾向的人(比如能够先忍住不吃巧克力以获取更大的奖励),结果证明这样的人在后续的生活中取得成功的概率要远高于先吃巧克力的人。本书首先强调这个话题,将其作为自律中的第一个原则,我想是因为道理都是相通的吧。很久之前我看过一篇讲解时间管理的文章,里面提到在规划一天的工作时,优先处理最难的那件事(文章中称“先吃掉那只青蛙”),然后当前的工作会越来越简单,这样的方式跟本书中作者所提倡的“推迟满足感”异曲同工。尽可能的正面问题、提早感受解决问题的痛苦,正是执行自律的首要原则。</p> +<blockquote> +<p>不能及时解决自己面临的问题,这些问题就会像山一样横亘在我们心中,阻碍心灵的成长和心智的成熟。很多人显然忽略了这个道理。我们必须面对属于自己的问题,这是解决问题的基本前提。 +指望别人解决自己的问题,也不是明智之举。唯一的办法&ndash;我们应该勇敢地说:“这是我的问题,要由我来解决!”</p> +</blockquote> +<p>这就牵出了第二个原则&ndash;“承担责任”。逃避问题会自然而然的推卸责任,认为这不是自己的问题,始终对于自己扮演的角色缺少清晰的认知。不过作者提到了两种情况“神经官能症”和“人格失调症”,前者属于给自己强加责任,后者属于推卸责任。这么说来,我可能有前者的倾向,很多压力都来源于此。不过作者也提到在复杂的人生道路上,判断自己该为什么事和什么人负责,这是一个永远存在的难题。</p> +<p>还有一种情况是,在有些事情上强加给自己责任,在有些事情上又没有意识到是自己的责任。读到这些章节的时候,我也在反思,当我一旦开始想要抱怨的时候,其实已经陷入“人格失调”和“神经官能”的边缘,要时刻提醒自己,不断评估自己的责任。</p> +<blockquote> +<p>忠于事实是自律的第三条原则。如果我们追求健康的生活和心智的成熟,那我们就要坚定不移地遵循这条原则。我们需要实事求是,杜绝虚假。我们越是了解事实,处理问题就越是得心应手。逃避现实的痛苦是人类的天性,只有通过自律,我们才能逐渐克服现实的痛苦,及时修改自己的地图,逐步成长。我们必须忠于事实,尽管这会带来暂时的痛苦,但远比沉湎于虚假的舒适中要好。我们必须忍受暂时的不适感,追求事实而不是假象,并承受这一过程的痛苦。</p> +</blockquote> +<p>这让我想到了“诚实”,不仅限于不撒谎(这一点实在是难以做到)。但我很快意识到作者所说的忠于事实比不撒谎更重要的是,面对事实,不可活在自己的想象里。虽然我们每个人都有自己的成见,看事情也很难看到全貌,但是不可做不基于事实的幻想,期望问题会自行消失、期望不付出努力就能得到回报。</p> +<blockquote> +<p>你既要承担责任学会推迟满足感,先苦后甜,把眼光放长远,同时又要尽可能过好当前的生活,让人生的快乐多于痛苦。</p> +</blockquote> +<p>这就是“保持平衡”,应该是一种“拿捏”吧。为了保持平衡,作者建议,适当的选择“放弃”。包括放弃过时的观念、习惯。王小波在小说中写道:“人生就是一个缓慢被捶的过程。。。”,如果不能适时的放弃一些东西,那很显然这个过程是相当痛苦的。</p> +<p>先写这么多。</p>《管理自己》阅读笔记https://sbabybird.github.io/p/%E7%AE%A1%E7%90%86%E8%87%AA%E5%B7%B1%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/Thu, 15 Apr 2021 00:00:00 +0000https://sbabybird.github.io/p/%E7%AE%A1%E7%90%86%E8%87%AA%E5%B7%B1%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/<h2 id="文章介绍">文章介绍</h2> +<p>《管理自己(Management Yourself)》作者——彼得·德鲁克。该文是《哈佛商业评论》创刊以来重印次数最多的文章之一,节选自其著作《21世纪的管理挑战》。</p> +<p>我第一次读到这篇文章,是2013年在<a class="link" href="http://www.zreading.cn/archives/3650.html" target="_blank" rel="noopener" +>左岸读书</a>的博客,当时很快就放入收藏夹,今日再次翻阅,仍觉受益匪浅。</p> +<p>摘抄部分在此记录,并附上自己的一些理解。</p> +<h2 id="笔记">笔记</h2> +<blockquote> +<p>知识工作者必须成为自己的首席执行官。你应该在公司中开辟自己的天地,知道何时改变发展道路,并在可能长达50年的职业生涯中不断努力、干出实绩。要做好这些事情,你首先要对自己有深刻的认识——不仅清楚自己的优点和缺点,也知道自己是怎样学习新知识和与别人共事的,并且还明白自己的价值观是什么、自己又能在哪些方面做出最大贡献。因为只有当所有工作都从自己的长处着眼,你才能真正做到卓尔不群。</p> +</blockquote> +<p>未来社会,体力劳动将逐渐被智能化机械所取代,人人都是知识工作者即将成为事实。每个人都需要把自己当作一个公司来看待,自己就是CEO,包揽人生的“市场”、“营销”、“生产”、“运营”等各项工作,只有从更高的视角来规划自己,才能掌握主动权,避免落入被动接受的局面。</p> +<p>与运营企业一样,经营自己的第一步还是要先了解自己,深刻认识自己的优势与不足,这样无论是制定计划还是付诸行动,才能做到目标明确、行之有效。</p> +<blockquote> +<p>多数人都以为他们知道自己擅长什么。其实不然,更多的情况是,人们只知道自己不擅长什么——即便是在这一点上,人们也往往认识不清。然而,一个人要有所作为,只能靠发挥自己的长处,而如果从事自己不太擅长的工作是无法取得成就的,更不用说那些自己根本干不了的事情了。</p> +</blockquote> +<p>这个观点跟我的直觉是相反的,在读到这段文字之前我以为自己对擅长什么了如指掌,但认真思索之后,才发现事情并没有那么简单,有些自以为是的优点根本不值得推敲,如沟通表达、对技术了解广泛、技术趋势敏感等等。至于真正做什么样的事情非常的得心应手,还真得通过认真分析才行。</p> +<blockquote> +<p>要发现自己的长处,唯一途径就是回馈分析法(feedback analysis)。每当做出重要决定或采取重要行动时,你都可以事先记录下自己对结果的预期。9到 12个月后,再将实际结果与自己的预期比较。我们只要持之以恒地运用这个简单的方法,就能在较短的时间内(可能两三年),发现自己的长处——这是你需要知道的最重要的事情。在采用这种方法之后,你就能知道,自己正在做(或没有做)的哪些事情会让你的长处无法发挥出来。同时,你也将看到自己在哪些方面能力不是特别强。最后,你还将了解到自己在哪些方面完全不擅长,做不出成绩来。</p> +</blockquote> +<p>作者给出了一个据说十分有效的方法,虽然执行起来略显繁琐且时间较长,但应该还值得一试。我个人有记录工作日志的习惯,但停留在时间消耗的记录和分析层面,并未对任务执行的结果进行预期和分析。</p> +<blockquote> +<p>首先最重要的是,专注于你的长处,把自己放到那些能发挥长处的地方。其次,加强你的长处。第三,发现任何由于恃才傲物而造成的偏见和无知,并且加以克服。</p> +</blockquote> +<p>想起了之前读到的另一本书<a class="link" href="https://book.douban.com/subject/1100470/" target="_blank" rel="noopener" +>《现在发现你的优势》</a>,虽然木桶原理说要补充自己的短板,但这里的观点则强调要充分把自己的优势利用起来,并且进行加强,这样才能更好的发挥自己。当然,努力学习新技能、新知识,发现自己的偏见和不良习惯然后克服它们也很重要。</p> +<blockquote> +<p>把预期和实际结果进行比较,也会发现自己不能做什么。我们每个人都有许多一窍不通、毫无天分的领域,在这些领域我们甚至连平庸的水平都达不到。人们,尤其是知识工作者,就不应该试图去完成这些领域的工作和任务。他们应该尽量少把精力浪费在那些不能胜任的领域上,因为从无能到平庸要比从一流到卓越需要人们付出多得多的努力。</p> +</blockquote> +<p>深有体会,不应该将时间和经历消耗在自己即使努力也达不到平庸水平的事情上,然而现实中却有很多人在被动的做着这样的事情,甚至还抱有不切实际的幻想,人生苦短,早日醒悟早日改变。</p> +<blockquote> +<p>我属于读者型,还是听者型?首先,你要搞清楚的是,你是读者型(习惯阅读信息)还是听者型(习惯听取信息)的人。绝大多数人甚至都不知道还有读者型和听者型之说,而且很少有人既是读者型又是听者型。知道自己属于哪种类型的人更少。</p> +</blockquote> +<p>这一段不知是翻译的问题还是作者没说明白,文中并未定义“读者型”、“听者型”这两种类型的工作方式具体是如何工作的,只是通过例子强调了自己工作方式的不同所带来的巨大差异。我的猜测是,“读者型”应该指的是在工作中理性和逻辑思维占上风的人,通常通过阅读逻辑缜密的文字来规划和开展工作,而“听者型”则属于感性思维偏多,通过视觉、听觉来判断事物的发展。</p> +<blockquote> +<p>如果一个组织的价值体系不为自己所接受或者与自己的价值观不相容,人们就会备感沮丧,工作效力低下。</p> +</blockquote> +<p>不要试图改变自己的价值观,这只会让你倍感痛苦,你可以更换环境或者改变组织价值体系。</p> +<blockquote> +<p>成功的事业不是预先规划的,而是在人们知道了自己的长处、工作方式和价值观后,准备把握机遇时水到渠成的。知道自己属于何处,可使一个勤奋、有能力但原本表现平平的普通人,变成出类拔萃的工作者。</p> +</blockquote> +<p>机会留给有准备的人,但前提是这个人认识到自己的长处、工作方式、价值观,所谓的把握机会,是了解了这些之后才能识别到机会。</p> +<blockquote> +<p>一般来说,一项计划的时间跨度如果超过了 18个月,就很难做到明确和具体。因此,在多数情况下我们应该提出的问题是:我在哪些方面能取得将在今后一年半内见效的结果?如何取得这样的结果?</p> +</blockquote> +<p>千里之行始于足下,如果决定开始行动,也不可把计划定的太远,自己给自己安排近期可行的执行目标,对效果要有清晰的预期,对如何取得效果应有详细而具体的计划。</p> +<blockquote> +<p>人与人之间相互信任,不一定意味着他们彼此喜欢对方,而是意味着彼此了解。因此,人们绝对有必要对自己的人际关系负责。这是一种义务。不管一个人是公司的一名成员,还是公司的顾问、供应商或经销商,他都需要对他的所有共事者负起这种责任。所谓共事者,是指在工作上他所依赖的同事以及依赖他的同事。</p> +</blockquote> +<p>成熟的处理人际关系,同样需要问文章开头的三个问题,了解他人或者共事者,是我们的义务和责任。</p> +<blockquote> +<p>在一个崇尚成功的社会里,拥有各种选择变得越来越重要。从历史上来看,却没有“成功”一说。绝大多数人只期望坚守“适当的位置”。唯一的流动性是向下的流动性。然而,在知识社会里,我们期望每一个人都能取得成功。这显然是不可能的。对许多人来说,能避免失败就行。可是有成功的地方,就会有失败。因此,有一个能够让人们做出贡献、发挥影响力或成为“大人物”的领域,这不仅对个人十分重要,对个人的家庭也同样重要。这意味着人们需要找到一个能够有机会成为领袖、受到尊重、取得成功的第二领域——可能是第二份职业,也可能是平行的职业或社会创业。</p> +</blockquote> +<p>在飞速发展(或者说在加速发展)的时代,人人都在焦虑,仿佛竞争、内卷根本无法避免,但如果合理的认识自己、管理自己,并且去用心经营的话,也许人人都有机会可以在擅长的领域做出闪光的事情,获得一份自己独有的成就。</p> +<blockquote> +<p>自我管理中面临的挑战看上去比较明显,甚至非常基本,其答案可能不言自明,甚至近乎幼稚。自我管理需要个人,尤其是知识工作者,做出以前从未做过的事情。实际上,自我管理需要每一个知识工作者在思想和行动上都要成为自己的首席执行官。</p> +</blockquote> +<p>最后一段很关键,“做出以前从未做过的事情”,即行动最为重要。这也是为什么我会花费一个小时的时间,从头又阅读一遍这篇文章,并摘录下来加以分析理解的主要原因。</p>《高效能人士的七个习惯》读书笔记https://sbabybird.github.io/p/%E9%AB%98%E6%95%88%E8%83%BD%E4%BA%BA%E5%A3%AB%E7%9A%84%E4%B8%83%E4%B8%AA%E4%B9%A0%E6%83%AF%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/Tue, 07 May 2019 00:00:00 +0000https://sbabybird.github.io/p/%E9%AB%98%E6%95%88%E8%83%BD%E4%BA%BA%E5%A3%AB%E7%9A%84%E4%B8%83%E4%B8%AA%E4%B9%A0%E6%83%AF%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/<ol> +<li>积极是内在的,是选择的自由,是人性中最不能剥夺的部分。</li> +<li>以终为始,是要知道自己要什么,并以原则为重心,所做的决策是主动选择的结果,而非被环境所迫使的结果。</li> +<li>人类的四个天赋分别是,自我意识,良知,想象力,独立意志。</li> +<li>第四代时间管理,以原则为中心,以周为单位,设定自己所扮演的各项角色欲达成的三个重要成果,安排出每一天的第一要务,更理想的是当作每一天的特殊约会,全力以赴。每周都回顾上周周日程完成情况以及制定新的周日程,并每日调整。</li> +<li>对人不可讲效率,对事才可如此,对人应该讲效用,即某一行为是否有效。</li> +<li>以原则为重心,以良知为导向(人比事儿更重要),针对个人独有的使命,平衡发展生活中不同角色,全盘规划日常生活。</li> +<li>要想充分授权必须要具备的默契和共识包括: +<ol> +<li>预期成果。</li> +<li>应遵守的规范。</li> +<li>可用的资源。</li> +<li>责任的归属,约定考评的标准和次数。</li> +<li>明确的奖惩制度。</li> +</ol> +</li> +<li>在双赢协议中,对以下5要素应该有明确的规定。 +<ol> +<li>预期结果,确认目标和实现,方法不计。</li> +<li>指导方针,确认实现目标的原则,方针和行为限度。</li> +<li>可用资源,包括人力,财力,技术或者组织资源。</li> +<li>任务考核,建立业绩评估标准和时间。</li> +<li>奖惩制度,根据任务考核确定奖惩。</li> +</ol> +</li> +<li>制定好目标之后,还要看你的组织体系是否与目标相符合,否则就要调整系统体系。</li> +<li>我们总是喜欢匆匆忙忙地下结论,以善意的建议快刀斩乱麻地解决问题。不愿意花时间去诊断,深入了解问题的症结。</li> +</ol>《管理十诫》读书笔记https://sbabybird.github.io/p/%E7%AE%A1%E7%90%86%E5%8D%81%E8%AF%AB%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/Tue, 30 Apr 2019 00:00:00 +0000https://sbabybird.github.io/p/%E7%AE%A1%E7%90%86%E5%8D%81%E8%AF%AB%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/<ol> +<li>首先要通过分析知道问题是什么,才能真正洞悉解决问题的办法。</li> +<li>归根结底,所有公司最后的生命线都是信任问题,顾客要相信企业生产的产品正如它所许诺的那样好,投资者要相信公司的管理层是有能力的,员工要相信公司管理者能够兑现承诺。</li> +<li>他们根本想不到人都有缺陷,包括他们自己在内也都不是完美的。</li> +<li>问题的关键不在于机器会不会想问题,而在于人会不会想问题。</li> +<li>真正让我们陷入麻烦的并非那些我们根本不懂的东西,而是我们一知半解的东西。</li> +<li>有一种心理偏见叫做肯定的陷阱,它指的是我们努力想证明自己的观点,而非找出自己观点中的错误之处。</li> +<li>深思熟虑并不是浪费时间,而是必要之举。</li> +<li>除非有人能停下来想一想,否则一再犯同样的错误是很容易的。对每个错误都有必要进行反思和总结。</li> +<li>如果你能承认自己犯了错误,承认自己并不是战无不胜,那么你反而能得到好处。</li> +<li>管理是一门艺术,而不是一种科学。如果遇到那些想要量化人类行为的专家,你就要保持警惕了。</li> +<li>行业中的每个公司都应该力争标新立异,让自己变的与众不同,而不是随大溜。</li> +<li>要憎恨组织里的官僚作风——通用电气公司杰克·韦尔奇写给股东的信中写道。如果你想一事无成的话,那就让行政流程占据主导地位好了,去崇尚官僚主义就行了。</li> +<li>不能创造生产力的工作越努力越失败,要时刻警惕并搜寻身边那些并不能创造生产力的工作。</li> +<li>每个公司其实主要就是为现有的客户提供优质服务并努力开拓新客户群。我们在花每一分钱、设立每一个部门或是接手每一个项目时,都要问自己一个基本的问题:这能帮我们带来新客户或是为客户提供更好的服务吗?</li> +<li>将注意力放在失败上是最大的悲观主义。只要稍稍抬起你的头,改变一下你的态度,那么你的世界观就会发生巨大的变化。</li> +</ol> \ No newline at end of file diff --git "a/categories/\350\257\273\344\271\246\347\254\224\350\256\260/page/1/index.html" "b/categories/\350\257\273\344\271\246\347\254\224\350\256\260/page/1/index.html" new file mode 100644 index 000000000..a197f27ba --- /dev/null +++ "b/categories/\350\257\273\344\271\246\347\254\224\350\256\260/page/1/index.html" @@ -0,0 +1 @@ +https://sbabybird.github.io/categories/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/ \ No newline at end of file diff --git "a/categories/\351\232\217\347\254\224/cover.b904917cf1b54a224c3a990639f998e3.jpg" "b/categories/\351\232\217\347\254\224/cover.b904917cf1b54a224c3a990639f998e3.jpg" new file mode 100644 index 000000000..58d701ab8 Binary files /dev/null and "b/categories/\351\232\217\347\254\224/cover.b904917cf1b54a224c3a990639f998e3.jpg" differ diff --git "a/categories/\351\232\217\347\254\224/cover.b904917cf1b54a224c3a990639f998e3_hu29d28204873a516702344599315928c7_271794_250x150_fill_q75_box_smart1.jpg" "b/categories/\351\232\217\347\254\224/cover.b904917cf1b54a224c3a990639f998e3_hu29d28204873a516702344599315928c7_271794_250x150_fill_q75_box_smart1.jpg" new file mode 100644 index 000000000..25c040847 Binary files /dev/null and "b/categories/\351\232\217\347\254\224/cover.b904917cf1b54a224c3a990639f998e3_hu29d28204873a516702344599315928c7_271794_250x150_fill_q75_box_smart1.jpg" differ diff --git "a/categories/\351\232\217\347\254\224/cover.jpg" "b/categories/\351\232\217\347\254\224/cover.jpg" new file mode 100644 index 000000000..58d701ab8 Binary files /dev/null and "b/categories/\351\232\217\347\254\224/cover.jpg" differ diff --git "a/categories/\351\232\217\347\254\224/cover_hu29d28204873a516702344599315928c7_271794_120x120_fill_q75_box_smart1.jpg" "b/categories/\351\232\217\347\254\224/cover_hu29d28204873a516702344599315928c7_271794_120x120_fill_q75_box_smart1.jpg" new file mode 100644 index 000000000..656bc52cf Binary files /dev/null and "b/categories/\351\232\217\347\254\224/cover_hu29d28204873a516702344599315928c7_271794_120x120_fill_q75_box_smart1.jpg" differ diff --git "a/categories/\351\232\217\347\254\224/index.html" "b/categories/\351\232\217\347\254\224/index.html" new file mode 100644 index 000000000..d30ab53e4 --- /dev/null +++ "b/categories/\351\232\217\347\254\224/index.html" @@ -0,0 +1,31 @@ +Category: 随笔 - Learning & Writing!

Categories

随笔

日常思考。

+ \ No newline at end of file diff --git "a/categories/\351\232\217\347\254\224/index.xml" "b/categories/\351\232\217\347\254\224/index.xml" new file mode 100644 index 000000000..102d31e29 --- /dev/null +++ "b/categories/\351\232\217\347\254\224/index.xml" @@ -0,0 +1,60 @@ +随笔 on Learning & Writing!https://sbabybird.github.io/categories/%E9%9A%8F%E7%AC%94/Recent content in 随笔 on Learning & Writing!Hugo -- gohugo.iozh-cnWed, 10 Feb 2021 00:00:00 +00002020年个人总结https://sbabybird.github.io/p/2020%E5%B9%B4%E4%B8%AA%E4%BA%BA%E6%80%BB%E7%BB%93/Wed, 10 Feb 2021 00:00:00 +0000https://sbabybird.github.io/p/2020%E5%B9%B4%E4%B8%AA%E4%BA%BA%E6%80%BB%E7%BB%93/<h2 id="保持好奇心">保持好奇心</h2> +<ul> +<li>大概是2011年左右,我把QQ签名改成了“好奇、求知、创造”,从此再也没有改变过,我所喜欢的、热爱的、欲罢不能的事情,都被这三个词涵盖了。</li> +<li>十年过去了,很高兴自己还能保持一颗探索未知、热爱学习的心。</li> +</ul> +<h2 id="读书">读书</h2> +<ul> +<li>现在听书比读书所占比重大,阅读时间缩水明显,翻开电子书的时间都有限,更别提手不释卷。</li> +<li>年初重温《三体》,即便很多情节已烂熟于心,重读仍有新发现,休闲阅读而已,只为放松大脑。</li> +<li>其余时间陆续阅读一些杂书《原则》、《随机漫步》、《菜根谭》、《曾国藩传》等若干。</li> +<li>唯一触动较大的是年末再次翻看《计算机程序的构造和解释》,此次配合网上的公开课视频进行,跟随原书作者课程讲解节奏,对于知识的理解大有帮助,视频虽然年代久远,但知识历久弥新,比起科技业广泛应用的新兴技术,书中的计算原理以及相关的思想更像是对应了武术的“内功心法”,一旦有所突破,则在上层应用产生巨大的提升,与工作学习都大有裨益,其中玄妙不可言说。</li> +</ul> +<h2 id="摄影">摄影</h2> +<ul> +<li>户外活动大为减少,往年春天乃摄影高产期,今年却苦于疫情无法外出,摄影爱好被迫搁置,2020年对摄影技术的练习几乎停滞,无心仪作品产出。</li> +<li>卡片相机已很少使用,手机拍摄已是主流,器材追求已解毒,但如有更新的街拍机问世,心头恐怕还是会痒。</li> +<li>有一事可提,今年独自吃饭次数很多,每次都拍食物照一张,累积下来一年竟拍了几百。</li> +</ul> +<h2 id="生活">生活</h2> +<ul> +<li>压力与机遇并存,最大收获是面对挫折、困难更坦然,2020不愿多提。</li> +<li>记忆力确实有下降之趋势,回忆起来竟无亮点,亦可能本身就比较平淡。</li> +<li>发现凡事都要低调不吭声的重要性,切记四处宣扬,否则就会出现“说出来就不灵”的魔咒。</li> +</ul> +<h2 id="学习">学习</h2> +<ul> +<li>对8bit老古董计算机的兴趣不减,四处搜寻相关知识,弄了一大堆模拟器,研究过程中竟对之前所学计算机组成原理有了新的认识和理解,喜出望外,本该大学之时就应掌握的技能,到现在再学也不迟,重在理解。</li> +<li>创意类软件如blender等也持续浅尝,进步缓慢,但入门已没问题,缺少作品练习,安排即可。</li> +<li>儿子已入大学,借用假期时间,我教他编程,他给我讲解高数,算是技能交换了,费曼学习法的一个很直接的应用案例。</li> +<li>越发觉得B站是个学习的好地方,该站以后的发展不可估量,但从教育来看,很可能迅速超越国内二流大学,或者未来改变大学的形态也未可知。</li> +</ul> +<h2 id="后续计划">后续计划</h2> +<ul> +<li>希望可以继续通过写字记录学习的知识,保持一定量的文字输出,如条件实在有限,配合语音录音也可。</li> +<li>在自己热爱的事情上,持续学习,关注一下作品输出(持续开新坑),早日成为心目中的“全栈工程师”、“三级工程师”(可参见吴军《硅谷来信》中的定义)。</li> +<li>限制烟酒摄入,保持每日的活动量,能走路就不坐车。</li> +</ul>致儿子成人礼的一封信https://sbabybird.github.io/p/%E8%87%B4%E5%84%BF%E5%AD%90%E6%88%90%E4%BA%BA%E7%A4%BC%E7%9A%84%E4%B8%80%E5%B0%81%E4%BF%A1/Thu, 09 May 2019 00:00:00 +0000https://sbabybird.github.io/p/%E8%87%B4%E5%84%BF%E5%AD%90%E6%88%90%E4%BA%BA%E7%A4%BC%E7%9A%84%E4%B8%80%E5%B0%81%E4%BF%A1/<p>序言我儿,见信如面。在这个即时通讯如此发达的时代,我选择写一封长信,以表示对你即将成人的祝贺。</p> +<p>我陷入沉思了一会儿,考虑该给你讲些什么道理。但我很快意识到,“道理”这种东西,靠听和说没有用,只能自己去感悟。而我自己也十分讨厌被说教,所以我会克制想要给你讲一番大道理的冲动,尽量避免不对等的交流形式。</p> +<p>我想我还是跟你分享一些我对这个世界的思考和想法吧。</p> +<p>茨威格在《人类群星闪耀》中写到“一个人最幸运的事情就是在他思想最活跃、精力最充沛的时候找到了他的人生使命”。看来大家都把寻找人生使命当做比较重要事情来看待。姑且就当做我这封信的主题吧。</p> +<p>寻找人生使命本质上是通过尝试在一些方向上的努力来实现对人生价值和意义的探索,每个人或多或少、或深或浅都要做这样的尝试。</p> +<p>你们学校把“成人礼”包装成一个重要的人生节点,想必是希望给你们一些感觉,让你们意识到,从这一刻起,你们开始对自己的行为负责,要开始尝试去寻找和探索了。</p> +<p>那么该如何去探索,我有一些自己的看法。</p> +<p>首先要相信一点,那就是无论是否还在上学,学习和完善自己都是一辈子的事情,不存在一个可以停止学习的时间点。就我个人来说,无论是读大学的时候还是参加工作以后,从来没有在提升自己方面有过松懈的想法,甚至我感觉工作之后对知识的渴望更加强烈了,学到的东西也比在校园里多得多。</p> +<p>当然了,学习方式跟你目前在学校这种还是差别挺大的,强度也没有那么辛苦。而且工作之后的这种学习方式才是我最认可的方式。什么方式?</p> +<p>我们一起讨论过几次王阳明的“知行合一”,为了不扯那么远,简单来说,刚才提到的学习方式就是老王早就提出的“事儿上练”。通过不断地实践,各种经历,才是学习知识的源泉。这也是为啥我在开头就说道理只能感悟不可说教,怎么感悟?事儿上感悟!经历多了自然懂。</p> +<p>所以也不用一下子被“寻找人生使命”这种“宏大话题”给吓住了,保持学习的心态,放松大胆地去经历各种事情,就是这么个过程。</p> +<p>然后呢,就是在做事的过程中,保持一颗善良、为他人多着想的心。关于这一点,我的体会是,“助人为快乐之本”真的不是一句空话。远的不说,你看你爷爷奶奶平日里多么乐于助人,用乐善好施形容他们一点儿也不为过。他们因此收获了广泛的认可,也给这个家庭带来了积极向上的生活氛围,对你老爹我向好的方面发展也起到了关键作用。</p> +<p>再有一点,也是我个人非常推崇的,就是最好能时刻对世界保持强烈的好奇心。</p> +<p>刘慈欣在短篇科幻小说《朝闻道》中讲了一个故事。外星高等文明在监视地球人类进化的过程中,距离现在几十万年前的一个原始人抬头望了望夜晚的天空,凝视了一会儿。这看似随意的行为使得外星人的警报器响了起来,因为这意味着,人类的好奇心已经发展到了星空,同时也意味着人类文明将要开始爆发式发展了。可见好奇心的重要。</p> +<p>好奇心一方面是推动我们前进的动力,同时也使得我们平凡的生活变得不那么枯燥。</p> +<p>你能经常提出一些有时连我都无法回答的问题,这让我也颇感欣慰,有些答案注定要自己去摸索着发现,我希望你能多多提问,也多自己思考,不用去管答案是什么。</p> +<p>稀稀拉拉写了这么多,估计你也不能理解太多,我像你这个年纪时估计也理解不了。不过也没关系,只是给你讲讲我个人通过思考得到的观点而已,说不定你自己以后有不同的发现,当然如果能在你以后的发展中起到一点儿提醒作用,也就挺好了。</p> +<p>希望你这次“成人礼”活动就像人类文明那一次一次对星空的凝望那样,使你能够进入人生的一个新的高速发展阶段。</p> +<p>祝:学习进步,健康成长!</p> +<p>二零一九年五月九日 写于贵阳机场</p>事如春梦了无痕https://sbabybird.github.io/p/%E4%BA%8B%E5%A6%82%E6%98%A5%E6%A2%A6%E4%BA%86%E6%97%A0%E7%97%95/Thu, 19 Jul 2018 00:00:00 +0000https://sbabybird.github.io/p/%E4%BA%8B%E5%A6%82%E6%98%A5%E6%A2%A6%E4%BA%86%E6%97%A0%E7%97%95/<p>上苍保佑吃饱饭撑着的人,中午吃完饭抽烟的时候,刷了几页微博,可能跟我关注的人有关(我一般关注段子手或者文艺思想贩卖者),感觉内容作为消遣挺合适,但是越看呢,越觉得没有营养,可能是跟我刚抽完烟进入贤者时间有关,一把把微博推开的时候(合上屏幕),心里竟涌现出一句“都是吃饱了撑的”,用以评价刚刚看过的几段不痛不痒的文字。</p> +<p>发完感慨随即想到,这句话是不是可以作为一本非常扯淡的书名呢?然后开始畅想自己写一本这样的书,里面的内容天马行空,多为吃饱了没事儿干的人才会忧伤和考虑的事情,饱暖之后各种忧虑和焦躁的事情可以化作各种思考,用于填满本书,作为同病相怜者证明自己不再孤独的弹药,一旦物质状态不能满足,则书中的内容立即退化到可有可无的状态。</p> +<p>真的,我这两三年来,刷牙沉思录这种哗众取宠的段子写了不少,缺少深度的技术文章也写过几篇,以吃饱了撑着来进行衡量的话,还真的比较符合标准,如果加以艺术润色的话,真难说能不能包装成为一本具备贩卖价值的书,至少想到这个问题之后,被自己震惊了一下,进一步对人生需求的几个层次有了切身认识。</p> +<p>无论我再怎么黑自己,有一点是不会改变,我写的那些东西至少保留了我一部分的回忆,它们记载了我在某一段时期内的心智情况,无论是用词还是造句,都能从一个侧面反映我当时的状态。而我的人生正是由若干个这样的状态所组成,随着年龄的增长,我的记忆力会越来越差,如果能够多记录一些东西下来,就算是那种吃饱了撑着才能思考的问题,也将使未来的我读起来热泪盈眶。</p> +<p>不过信息世界的问题在于,资料保存的永久性很不靠谱,说不定哪天这些信息就不在了(我写在msn空间的博客一篇也没了),甚至安全性还比不了一个纸质的笔记本,但我仍然不做过多的努力和担忧,倘若保存良好,那就作为未来回忆的佐料,倘若不幸丢失了,那就随他去吧。因为在写这些东西的同时,我已经感受一次生活了,本来也是留不住的东西,事如春梦了无痕嘛。</p> \ No newline at end of file diff --git "a/categories/\351\232\217\347\254\224/page/1/index.html" "b/categories/\351\232\217\347\254\224/page/1/index.html" new file mode 100644 index 000000000..64783aa72 --- /dev/null +++ "b/categories/\351\232\217\347\254\224/page/1/index.html" @@ -0,0 +1 @@ +https://sbabybird.github.io/categories/%E9%9A%8F%E7%AC%94/ \ No newline at end of file diff --git a/favicon.png b/favicon.png new file mode 100644 index 000000000..637bbcdfa Binary files /dev/null and b/favicon.png differ diff --git a/img/avatar_huae4c06a439510c7a9061eeaabbc9a196_1766_300x0_resize_box_3.png b/img/avatar_huae4c06a439510c7a9061eeaabbc9a196_1766_300x0_resize_box_3.png new file mode 100644 index 000000000..e876311d2 Binary files /dev/null and b/img/avatar_huae4c06a439510c7a9061eeaabbc9a196_1766_300x0_resize_box_3.png differ diff --git a/index.html b/index.html new file mode 100644 index 000000000..4355198fb --- /dev/null +++ b/index.html @@ -0,0 +1,34 @@ +Learning & Writing!
+ \ No newline at end of file diff --git a/index.xml b/index.xml new file mode 100644 index 000000000..c34d4ac3e --- /dev/null +++ b/index.xml @@ -0,0 +1,8382 @@ +Learning & Writing!https://sbabybird.github.io/Recent content on Learning & Writing!Hugo -- gohugo.iozh-cnThu, 21 Sep 2023 00:00:00 +0000基于 Github Pages 服务搭建个人博客https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/Thu, 21 Sep 2023 00:00:00 +0000https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-21-16-10-50.png" alt="Featured image of post 基于 Github Pages 服务搭建个人博客" /><h2 id="背景">背景</h2> +<p>搭建独立博客网站的方法多种多样,常见的方法包括租用服务器自行架设,或者选择托管服务商提供的博客发布服务。</p> +<p>但是上述两种方式都会产生一定的费用,对于非盈利网站而言,不太友好。</p> +<p>经过多年的实践,现在已有越来越多的人选择了使用免费且易用的<a class="link" href="https://docs.github.com/zh/pages/getting-started-with-github-pages/about-github-pages" target="_blank" rel="noopener" +> GitHub Pages </a>服务来搭建个人博客。</p> +<p>然而,现有的使用教程大多侧重于操作步骤,对于新手或非专业人士而言,难以真正理解其中原理。</p> +<p>他们可能看到别人的博客既漂亮又实用,却在自己尝试搭建时屡屡遇到挫折,逐渐失去信心。</p> +<p>这无疑会打击那些希望通过博客持续创作文字、并且希望能够免费建立个性化站点的人的积极性。</p> +<p>本文将介绍如何使用 GitHub Pages 服务搭建免费的个人博客网站,及其背后的实现原理,以帮助初学者顺利建立自己理想的博客站点。</p> +<h3 id="需要预先掌握的技能和前置条件">需要预先掌握的技能和前置条件</h3> +<p><em>需要先了解这些再往下阅读本文</em></p> +<ul> +<li>了解 Git 的概念和常用的操作,知道“分支”、“提交”、“推送”、“拉取”等概念。</li> +<li>拥有 Github 账号,并且能够独立完成“仓库创建”、“本地克隆”、“提交”、“推送”等操作。</li> +<li>了解“博客”本身只是一种“网站”:其内容由若干“网页”组成,读者通过浏览器访问博客网站所在的服务器以获取这些网页内容。</li> +</ul> +<h2 id="核心思路">核心思路</h2> +<p><img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-21-16-20-10.png" +width="790" +height="258" +loading="lazy" +class="gallery-image" +data-flex-grow="306" +data-flex-basis="734px" +> +简单来说,核心步骤只有三步:内容编辑、页面生成、网站发布。接下来的介绍均围绕这三件事展开。</p> +<h3 id="内容编辑">内容编辑</h3> +<p>作者编写和编辑博客内容,包括编写文章、给文章配图、给文章归类等等活动都属于内容编辑。</p> +<h3 id="页面生成">页面生成</h3> +<p>如果希望将内容变成可发布的网站,则需要使用专用的软件工具(一般为<a class="link" href="https://baike.baidu.com/item/%E9%9D%99%E6%80%81%E7%BD%91%E7%AB%99/2776875" target="_blank" rel="noopener" +>静态网站</a>生成器)将编辑的内容自动生成可供浏览器显示的博客网站页面。</p> +<h3 id="网站发布">网站发布</h3> +<p>有了网站页面,还只是一堆存放在本地的文件。若要放到互联网上进行访问,还需要一个服务器提供服务,将网站发布。</p> +<p>如果采用独立建站的方式,这一步骤会涉及大量技术工作,比如服务器采购、Web服务应用程序安装、域名映射、SSL 安全证书、网络防火墙配置等等。</p> +<p>但我们今天选择使用 Github 提供的 Pages 服务,这将大大降低上述操作的难度,很多技术细节将不必再多关注,已经由 Pages 服务默认配置好。我们只需享用配置好的环境即可。</p> +<h3 id="技术路线">技术路线</h3> +<h4 id="github-pages">Github Pages</h4> +<p>Github 本来是一个 Git 仓库托管服务商,帮助用户进行项目代码及数字资料的版本管理。不过随着用户规模提升,Github 也围绕版本管理提供了更多的辅助服务,这其中就包括 <a class="link" href="https://docs.github.com/zh/pages/getting-started-with-github-pages/about-github-pages" target="_blank" rel="noopener" +>Pages 服务</a>。</p> +<blockquote> +<p>GitHub Pages 是一项静态站点托管服务,它直接从 GitHub 上的仓库获取 HTML、CSS 和 JavaScript 文件,(可选)通过构建过程运行文件,然后发布网站。 可以在 GitHub Pages 示例集合中看到 GitHub Pages 站点的示例。</p> +</blockquote> +<p>Pages 服务原本用于帮助托管在 Github 上的开源项目更便捷地发布自己的宣传页面。开发团队可以简单编写几个静态页面(HTML)然后放在托管的 Git 仓库中,由 Github 将这些页面以网站服务的方式发布出去,Github 既提供了服务器资源也提供了用于公网访问的<strong>专属 URL</strong> 地址。</p> +<p>关于发布网站的<strong>专属 URL</strong> 地址的提供规则,Github 官方的介绍如下:</p> +<blockquote> +<p>若要发布<strong>用户站点</strong>,必须创建名为 <code>&lt;username&gt;.github.io</code> 的个人帐户拥有的存储库。 若要发布<strong>组织站点</strong>,必须创建名为 <code>&lt;organization&gt;.github.io</code> 的组织帐户拥有的存储库。 除非使用的是自定义域,否则用户和组织站点在 <code>http(s)://&lt;username&gt;.github.io</code> 或 <code>http(s)://&lt;organization&gt;.github.io</code> 中可用。 +<strong>项目站点</strong>的源文件与其项目存储在同一个仓库中。 除非使用的是自定义域,否则项目站点在 <code>http(s)://&lt;username&gt;.github.io/&lt;repository&gt;</code> 或 <code>http(s)://&lt;organization&gt;.github.io/&lt;repository&gt;</code> 中可用。</p> +</blockquote> +<p>根据官方介绍,Pages 提供有三种不同的网站发布服务:用户站点、组织站点、项目站点。</p> +<p>分别对应了“制作个人网站”、“制作团队组织网站”、“制作单个项目网站”的不同需求。</p> +<p>针对个人博客的搭建,很显然使用 Pages 服务发布“用户站点”是最合适的选择。</p> +<p>对于“用户站点”,Pages 最终会为用户提供的专属 URL 地址为:<code>https://你的用户名.github.io</code>,也就是说在 Gihtub 的一级域名 <code>https://github.io</code> 下给你免费提供了一个二级域名。之所以默认使用你的 Github 用户名,是因为要防止不同用户发布的地址重名导致冲突。</p> +<p><em>按照官方介绍,你也可以使用自己购买的域名,通过自己的域名进行访问。不过这涉及到更复杂的话题和操作,不在本文讨论范畴。</em></p> +<p>了解了以上基本信息后,在使用 Pages 服务时,可按照复杂度区分,采用如下几种不同的用法。</p> +<h5 id="最简单直接的使用流程">最简单直接的使用流程</h5> +<ol> +<li>手工编写 HTML 页面文件(需要掌握网页制作知识)。</li> +<li>将页面文件推送到的 Github 仓库,对于“用户站点”来说,这个仓库的命名必须为“<code>你的用户名.github.io</code>”。</li> +<li>在 Github 中设置该仓库的 Pages 服务配置,主要是选择仓库的指定“分支”用于 Pages 服务获取待发布的网页文件。</li> +<li>Github 会按照上面介绍的规则给你提供一个 URL 访问地址(<code>https://你的用户名.github.io</code>),使用浏览器打开该地址即可访问到发布的网站了。</li> +</ol> +<p><em>注:如果不理解 Git 仓库的“分支”概念,可以把它视为同一个仓库里不同的存储位置,不同的“分支”里面存储了不同的文件内容。</em></p> +<p>这个流程仅适用于非常简单网站发布,比如只包含有一个页面,因为手工编写 HTML 页面的效率十分低下,且不利于持续更新维护。</p> +<p>于是大家常用的方式是,使用一种叫做的东西,对于“博客”这类以静态页面为主的网站,十分适合。</p> +<p>“静态站点生成器”可以理解为是一个“翻译”,它能自动将你编写的文本内容根据预先的配置信息,自动生成一个完整的网站所需的全部文件(HTML、JS、CSS等)。</p> +<p>于是有了如下的改进流程:</p> +<h5 id="改进的使用流程">改进的使用流程</h5> +<ol> +<li>用户编辑好博客内容,形成保存在本地计算机的原始文档文件。</li> +<li>使用静态网站生成器将本地原始文档文件生成静态页面文件。</li> +<li>将静态页面文件推送到 Github 远端托管仓库。</li> +<li>Github Pages 服务自动被触发,将静态页面以网站形式发布出来。</li> +<li>用户通过指定 URL 地址访问已发布的博客内容。</li> +</ol> +<p>到目前为止,已经可以较为流畅地执行博客编辑、生成、发布的工作流程了。</p> +<p>但是这个流程里有个前置条件,作者必须在本地电脑上安装一个“静态站点生成器”,以用于输出转换后的、可供发布的页面。</p> +<p>所以,为了方便,Github 提供了一个默认的静态网站生成器,上述第 2 步操作实际上可以在远端仓库自动执行,这样用户只需将原始文件上传至远端仓库即可,由 Github 直接在线上完成静态页面的生成和网站发布工作。</p> +<p><img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-21-16-46-36.png" +width="937" +height="625" +loading="lazy" +class="gallery-image" +data-flex-grow="149" +data-flex-basis="359px" +></p> +<h5 id="静态站点生成器的选择">静态站点生成器的选择</h5> +<p>比较常见的静态站点生成器有:<a class="link" href="https://jekyllrb.com/" target="_blank" rel="noopener" +>Jekyll</a>、<a class="link" href="https://hexo.io/index.html" target="_blank" rel="noopener" +>Hexo</a>、<a class="link" href="https://gohugo.io/" target="_blank" rel="noopener" +>Hugo</a> 这三个。不在这里详细介绍了,因为功能都大同小异。在选定一个之后,需要去他们的官网查看文档以了解具体的使用细节,以便对自己的博客站点能够做到更深的定制。</p> +<p>我在接下来的操作步骤里,选择使用 Hugo 这个生成器。</p> +<p>主要原因是,Hugo 提供有相对来说比较美观的<a class="link" href="https://themes.gohugo.io/" target="_blank" rel="noopener" +>免费主题风格模板</a>(Jekyll 也有漂亮的,但是收费。Hexo 的定制性很强,适合有网页开发能力的人自己开发主题)。</p> +<p>我选择的主题模板是:<a class="link" href="https://themes.gohugo.io/themes/hugo-theme-stack/" target="_blank" rel="noopener" +>hugo-theme-stack</a>。</p> +<p><img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-10-40-58.png" +width="900" +height="300" +loading="lazy" +class="gallery-image" +data-flex-grow="300" +data-flex-basis="720px" +></p> +<h2 id="操作步骤">操作步骤</h2> +<h3 id="建立-github-仓库">建立 Github 仓库</h3> +<ol> +<li>点击这个超链接进入 <a class="link" href="https://github.com/CaiJimmy/hugo-theme-stack-starter" target="_blank" rel="noopener" +>hugo-theme-stack-starter 的 Git 仓库模板</a>。</li> +<li>点击页面中的“使用此模板”按钮,以创建你自己的仓库(注意:需先登录自己的账号才能创建)。 +<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-10-45-54.png" +width="925" +height="134" +loading="lazy" +class="gallery-image" +data-flex-grow="690" +data-flex-basis="1656px" +></li> +<li>建立好仓库(注意仓库命名为<code>你的用户名.github.io</code>)之后,会自动带有仓库模板的初始文件。 +<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-10-47-57.png" +width="908" +height="528" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="412px" +></li> +</ol> +<h3 id="修改配置">修改配置</h3> +<ol> +<li>将仓库下载到本地。</li> +<li>打开仓库里的 config 文件夹,里面存放有配置信息。</li> +<li>按照 <a class="link" href="https://stack.jimmycai.com/guide/getting-started" target="_blank" rel="noopener" +>hugo-theme-stack 的官方文档</a>配置自己想要的效果(默认一般都够用,重点是修改自己的站点信息,如显示名称、URL 链接地址等等)。 +<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-10-53-02.png" +width="1466" +height="682" +loading="lazy" +class="gallery-image" +data-flex-grow="214" +data-flex-basis="515px" +> +<em>这些配置主要在 <code>config.toml</code> 和 <code>params.toml</code> 两个文件里。</em></li> +</ol> +<h3 id="编写博客文章">编写博客文章</h3> +<p>生成器会默认去仓库的 <code>content/post/</code> 文件夹下扫描其下面的所有文件夹和文件,遇到约定格式的 <code>Markdown</code> 文件就会转换成为可发布的 <code>html</code> 页面。具体约定可以查看官方的详细文档,这里介绍一种最简单的写一篇文章的过程。</p> +<ol> +<li>在 post 目录下新建一个文件夹用于存放文章的 Markdown 文件和插图文件,文件夹命名为希望编写的标题如:<code>2023-09-21-怎样搭建个人博客</code>。<em>我个人习惯将不同年份的文章在post目录下再建一级目录按照日期或年份进行区分。</em></li> +<li>在刚建立的文件夹下新建名称为<code>index.md</code>的 Markdown 文件,文件名必须为 index.md 这是由 hugo 生成器约定的。</li> +<li>在刚建立的 Markdown 文件的头部添加必要的元信息(非常关键)。 +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span><span class="lnt">8 +</span><span class="lnt">9 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w"> </span>---<span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="l">文章标题</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">date</span><span class="p">:</span><span class="w"> </span><span class="ld">2023-09-21</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">categories</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">文章所属分类</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tags</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">文章标签 1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">文章标签 2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>---<span class="w"> +</span></span></span></code></pre></td></tr></table> +</div> +</div><img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-11-07-46.png" +width="787" +height="357" +loading="lazy" +class="gallery-image" +data-flex-grow="220" +data-flex-basis="529px" +></li> +<li>编写文章内容。可以使用 <a class="link" href="https://markdown.com.cn/basic-syntax/" target="_blank" rel="noopener" +>Markdown 的语法</a>随意定义格式,以及插入图片。插入的图片建议保存在同级目录(也就是刚才新建的那个)中。</li> +</ol> +<h3 id="推送到仓库及发布">推送到仓库及发布</h3> +<ol> +<li>将刚才修改配置文件保存。</li> +<li>将刚才编写的博客文章保存。</li> +<li>在本地提交 commit 并 push 到 Github 仓库。</li> +<li>稍等几分钟(给 Github 那端的 Hugo 生成器留出运行时间)。</li> +<li>在 Github 仓库的 “setting” 设置页面开启 Pages 服务(只需第一次)。</li> +<li>在 Pages 设置界面里的 Source 中选择 “Deploy from a branch” ,并在下面的分支选择下拉框中选择 “gh-pages”,保存。 +<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-11-17-49.png" +width="1090" +height="568" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="460px" +></li> +</ol> +<h3 id="访问你的博客站点">访问你的博客站点</h3> +<p>一般稍等几分钟之后,即可按照约定网址访问刚发布的内容了。 +<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-11-31-26.png" +width="1539" +height="661" +loading="lazy" +class="gallery-image" +data-flex-grow="232" +data-flex-basis="558px" +></p> +<h2 id="扩展阅读">扩展阅读</h2> +<p>运营自己的博客网站所需了解的概念和知识相对比较多,如果希望将自己的网站做的更加精美、有特色。</p> +<p>除了能够持续产出高质量内容之外,建议阅读以下文章以了解相关知识:</p> +<ul> +<li><a class="link" href="https://developer.mozilla.org/zh-CN/docs/Learn/Getting_started_with_the_web" target="_blank" rel="noopener" +>学习 web 开发</a>。</li> +</ul>机器文摘 第 050 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/Tue, 19 Sep 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-31-40.png" alt="Featured image of post 机器文摘 第 050 期" /><h1 id="机器文摘-第-050-期">机器文摘 第 050 期</h1> +<h2 id="长文">长文</h2> +<h3 id="十八世纪的光学电报网络">十八世纪的光学电报网络</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-31-08.png" +width="500" +height="517" +loading="lazy" +class="gallery-image" +data-flex-grow="96" +data-flex-basis="232px" +></p> +<p>当年读《基督山伯爵》的时候,有一个让我震惊的科技。</p> +<p>主人公有一项复仇计划是破坏敌人的金融资产。计划采取的手段是收买了一个传递实时信息的人让其传递错误信息。</p> +<p>而具体传递信息的手段是,每隔一段距离设一座瞭望塔,每个塔上有一个人,向一个方向用望远镜观看,远方的上级瞭望塔会有人发射信号弹,一连串的信号弹代表一定的信息,然后这个人再原样发射一遍,让后方的瞭望塔看见。信息就这样一级一级传递下去。</p> +<p>信息经过编码,可以表达股票行情等信息,类似后来的电报系统,但是这是在十八世纪。</p> +<p>读过之后我就一直有疑问,不知道小说是否虚构了这种信息传递技术,直到前几天我发现了这篇文章:<a class="link" href="https://www.lowtechmagazine.com/2007/12/email-in-the-18.html" target="_blank" rel="noopener" +>《十八世纪的光学电报网络》</a>。</p> +<p>里面详细介绍了在两百多年前人类就已经发明了“光学电报”系统,并建立起了巨大的信息网络。信息传递速度达到了惊人的 1380千米/每小时。</p> +<h3 id="c-语言发展简史">C 语言发展简史</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-31-23.png" +width="690" +height="352" +loading="lazy" +class="gallery-image" +data-flex-grow="196" +data-flex-basis="470px" +></p> +<p>要说 C 语言是计算机历史上最重要的编程语言应该不会有人反对吧。</p> +<p>作为大多数人编程入门的母语,C 语言具有语法简洁、高性能(贴近计算机底层)、使用灵活、适用范围广泛等特点。</p> +<p>虽然诞生于上个世纪 70 年代,但即便是在 2023 年的今天,C 语言仍然排在各大编程排行榜的考前位置,仍然是信息科技的重要支撑力量。</p> +<p><a class="link" href="http://cm.bell-labs.co/who/dmr/chist.html" target="_blank" rel="noopener" +>《C 语言简史》</a>,由丹尼斯·里奇(C 语言之父)撰写,是一篇难得的介绍 C 语言的诞生和发展的历史性文献。</p> +<h3 id="vbvisual-basic发展简史">VB(Visual Basic)发展简史</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-31-40.png" +width="690" +height="518" +loading="lazy" +class="gallery-image" +data-flex-grow="133" +data-flex-basis="319px" +></p> +<p>前几天 HN 上有个从业近 30 年的老程序员发问:<a class="link" href="https://news.ycombinator.com/item?id=37470318" target="_blank" rel="noopener" +>为什么 VB(Visual Basic)这么高效、好用的开发工具逐渐消失了?</a>。</p> +<p>被顶的最高的网友放出了<a class="link" href="https://retool.com/visual-basic/" target="_blank" rel="noopener" +>《Visual Basic 从诞生到消失》</a>这篇文章。</p> +<p>在上世纪 80 年代末 90 年代初,Windows 操作系统刚刚崭露头角的时候,VB 已经在萌芽状态了。而且已经具有非常先进的组件化、可视化、低代码等超前思想。并且发明了“控件”、“消息触发”等概念。</p> +<p>最初的版本与 BASIC 语言并无关系,只考虑了使用可视化开发并辅助简单的内嵌脚本,但是比尔·盖茨对 BASIC 十分热爱(毕竟那是微软起家的技术),亲自推动了组件化、可视化开发与 BASIC 语言结合,便诞生了 Visual Basic。</p> +<p>得益于超前的可视化开发理念,VB 极大降低了当时开发应用程序的门槛,涌现出一大批开发者。包括当时那些不得不转型给个人电脑开发程序的大型机编程工程师。</p> +<p>这一切在 VB 随着 Visual Studio 发布 6.0 的时候达到了顶峰。</p> +<p>转折点出现在微软为了应对 Java 的威胁而推出 .Net 公共语言运行时的时候,VB 也被纳入到这套体系里,被成为 VB.Net ,扩充了复杂的语法和继承、多态等高级特性。</p> +<p>对于那些真正喜欢 VB6 的人来说,这些都是唯恐避之不及的东西,更糟糕的是新的 VB.Net 无法兼容之前的代码,大量成果移植困难。</p> +<p>之后更是随着网络信息科技的发展,Web 编程逐渐取代了 Windows 桌面编程,VB 这个伟大的技术,被淘汰也就是顺其自然的了。</p> +<h3 id="一个在网页里模仿-excel-表格的故事">一个在网页里模仿 Excel 表格的故事</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-32-14.png" +width="690" +height="201" +loading="lazy" +class="gallery-image" +data-flex-grow="343" +data-flex-basis="823px" +></p> +<p><a class="link" href="https://websheets.github.io/websheets/demo/" target="_blank" rel="noopener" +>一位前端工程师,讲述了他在 2016 年受雇于 Uber(优步)时的一些开发往事</a>。</p> +<p>作为服务于数据工程师的内部研发团队,他所在的小组主要是给公司的数据分析人员提供内部工具,以便让他们能够更快地分析数据,更快的分析数据意味着更有可能在产品运营竞争里获胜。</p> +<p>然而数据分析人员总是抱怨工具不满足要求,主要是操作界面,因为他们非常习惯“Excel”,每次提需求的时候总是说:“你就做得跟 Excel 一样就行”。</p> +<p>作者最开始还试图跟用户解释要实现起来是多么困难,后来逐渐放弃了挣扎,并开始着手在网页里实现一个跟 Excel 一样的表格,而且他竟然实现了。</p> +<p>故事的后来有些伤感,作者提供的工具并没有使得 “Uber” 在跟嘀嘀的竞争中胜出,相反地,“Uber”在中国的业务还被“嘀嘀”收购了。</p> +<p>被用于数据分析的工具也被抛弃不再使用。</p> +<p>后来作者选择了将那个像 Excel 的表格代码放在了 <a class="link" href="github.com/WebSheets/websheets" >Github 进行开源,地址在这里</a>。</p> +<h2 id="资源">资源</h2> +<h3 id="通用-web-应用服务器">通用 Web 应用服务器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-32-34.png" +width="690" +height="356" +loading="lazy" +class="gallery-image" +data-flex-grow="193" +data-flex-basis="465px" +></p> +<p><a class="link" href="https://unit.nginx.org/" target="_blank" rel="noopener" +>NGINX Unit</a>,通用 Web 应用服务器。是一个轻量且多功能的应用运行时,作为一个单一的开源服务器,它提供了您的 Web 应用程序所需的基本组件:运行应用程序代码(包括 WebAssembly)、提供静态资源、处理 TLS 和请求路由。</p> +<p>Unit 是由 NGINX 团队成员从零开始创建的,以在运行时高度高效且完全可配置。最新版本是 1.31.0,于 2023 年 8 月 31 日发布。</p> +<h3 id="绿色安卓-app-合集">绿色安卓 App 合集</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-32-52.png" +width="690" +height="385" +loading="lazy" +class="gallery-image" +data-flex-grow="179" +data-flex-basis="430px" +></p> +<p><a class="link" href="https://www.simplemobiletools.com/" target="_blank" rel="noopener" +>绿色安卓app合集</a>。</p> +<p>这个网站收集了一大批良心 app,全部没有广告且不要求隐私权限。</p> +<p>几乎涵盖了日常使用的所有类型,包括艺术绘画、音乐播放器、笔记、文件管理、录音、拍照等。 ​​​</p> +<h3 id="nuejs">nuejs</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-33-10.png" +width="690" +height="455" +loading="lazy" +class="gallery-image" +data-flex-grow="151" +data-flex-basis="363px" +></p> +<p><a class="link" href="https://nuejs.org/" target="_blank" rel="noopener" +>nuejs</a>,越来越多的人对前端开发的混乱感到不满了。不同的是有人选择抱怨,有人撸起袖子开干。nuejs 的作者觉得现在使用 React、Vue 等框架再加上若干服务端渲染框架,使得前端开发生态变得越来越复杂和掌握。于是自己动手开发了一个简单的轻量化框架,终极目标是构建一个简洁、高效的前端开发生态。</p> +<h3 id="1024-字节的网页可显示-3d-地球">1024 字节的网页,可显示 3D 地球</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-33-21.png" +width="447" +height="255" +loading="lazy" +class="gallery-image" +data-flex-grow="175" +data-flex-basis="420px" +></p> +<p><a class="link" href="https://aem1k.com/world/" target="_blank" rel="noopener" +>1024 字节的 JavaScript,在网页中显示动画 3D 地球模型</a>,页面动画显示的就是其源代码。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="p">.</span><span class="o">&lt;</span><span class="nx">script</span><span class="o">&gt;</span> +</span></span><span class="line"><span class="cl"><span class="nb">eval</span><span class="p">(</span><span class="nx">z</span><span class="o">=</span><span class="s1">&#39;p=&#34;&lt;&#34;+&#34;pre&gt;&#34;/* ,.oq#+ ,._, */;for(y in n=&#34;zw24l6k\ +</span></span></span><span class="line"><span class="cl"><span class="s1">4e3t4jnt4qj24xh2 x/* =&lt;,m#F^ A W###q. */42kty24wrt413n243n\ +</span></span></span><span class="line"><span class="cl"><span class="s1">9h243pdxt41csb yz/* #K q##H######Am */43iyb6k43pk7243nm\ +</span></span></span><span class="line"><span class="cl"><span class="s1">r24&#34;.split(4)){/* dP cpq#q##########b, */for(a in t=pars\ +</span></span></span><span class="line"><span class="cl"><span class="s1">eInt(n[y],36)+/* p##@###YG=[#######y */(e=x=r=[]))for\ +</span></span></span><span class="line"><span class="cl"><span class="s1">(r=!r,i=0;t[a/* d#qg `*PWo##q#######D */]&gt;i;i+=.05)wi\ +</span></span></span><span class="line"><span class="cl"><span class="s1">th(Math)x-= /* aem1k.com Q###KWR#### W[ */.05,0\ +</span></span></span><span class="line"><span class="cl"><span class="s1">x;)p+=&#34; *#&#34;/* b. OQ####x#K */[e[x++]+e[x++\ +</span></span></span><span class="line"><span class="cl"><span class="s1">]]||(S=(&#34;eval&#34;/* l `X#####D , */+&#34;(z=\&#39;&#34;+z.spl\ +</span></span></span><span class="line"><span class="cl"><span class="s1">it(B = &#34;\\\\&#34;)./* G####B&#34; # */join(B+B).split\ +</span></span></span><span class="line"><span class="cl"><span class="s1">(Q=&#34;\&#39;&#34;).join(B+Q/* VQBP` */)+Q+&#34;)//m1k&#34;)[x/2\ +</span></span></span><span class="line"><span class="cl"><span class="s1">+61*y-1]).fontcolor/* TP */(/\\w/.test(S)&amp;&amp;&#34;#\ +</span></span></span><span class="line"><span class="cl"><span class="s1">03B&#34;);document.body.innerHTML=p+=B+&#34;\\n&#34;}setTimeout(z)&#39;</span><span class="p">)</span><span class="c1">// +</span></span></span></code></pre></td></tr></table> +</div> +</div><h3 id="全球-ip-地址地理位置数据库">全球 IP 地址地理位置数据库</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-33-35.png" +width="690" +height="385" +loading="lazy" +class="gallery-image" +data-flex-grow="179" +data-flex-basis="430px" +></p> +<p><a class="link" href="https://ipapi.is/geolocation.html" target="_blank" rel="noopener" +>全球 IP 地址 地理位置数据库</a>。含 IPV4 和 IPV6。 ​​<a class="link" href="https://ipapi.is/geolocation.html" target="_blank" rel="noopener" +>​这篇文章里还介绍了构建 IP 地址地理数据库的实现原理</a>和一套具有指导意义的实现方法。基本原理是:“互联网中的每个 IP 地址都由组织拥有或管理。可以向互联网注册机构查询WHOIS信息。”</p> +<h2 id="观点">观点</h2> +<h3 id="为什么-facebook-的-pytorch-占有率赢了-google-的-tensorflow">为什么 Facebook 的 PyTorch 占有率赢了 Google 的 Tensorflow</h3> +<p>Pytorch 已经完全击败了 Tensorflow,成为 AI 开发框架的事实标准。Pytorch 一开始就专注于学术界,方向是把最牛的人吸引过来。而 Tensorflow 则倾向于软件工程炫技,做各种简单但是酷炫的功能。</p> +<p>最终专业化的 torch 击败了 tensorflow 。 我觉得​​​还有一个原因就是 Google 特别容易弃坑,Tensorflow 中间也切换过前后不兼容的 API。</p> +<h3 id="越来越多的科技产品让人更好地欺骗自己">越来越多的科技产品让人更好地欺骗自己</h3> +<p>比如美颜相机、电影特效、游戏等,研发它们的主要目的就是让人们更好的实现自我欺骗和催眠。</p> +<h3 id="东方文明为什么警惕科技我个人不完全同意">东方文明为什么警惕科技(我个人不完全同意)</h3> +<p>中国古代对于科技非常警惕和打压的原因,也许是古人早就意识到科技(或技术)力量很容易对人类造成强烈反噬。</p> +<p>观点来自 <a class="link" href="https://www.bilibili.com/video/BV1pu4y1r7KW/" target="_blank" rel="noopener" +>@​​​安东尼2001:量子自旋理论背后,是人类历史的轮回</a>。</p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 049 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/Tue, 12 Sep 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-34-22.png" alt="Featured image of post 机器文摘 第 049 期" /><h1 id="机器文摘-第-049-期">机器文摘 第 049 期</h1> +<h2 id="长文">长文</h2> +<h3 id="在-linux-环境里执行-windows-应用程序">在 Linux 环境里执行 Windows 应用程序</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-33-44.png" +width="512" +height="512" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +></p> +<p>最近遇到一个难以启齿的需求,服务器是 Linux 环境,但是某项服务功能却需要执行一个 Windows exe 文件。</p> +<p>不得已才想到要求助 Wine 这个经典中间层,据说可以使的 Linux 兼容大部分的 Win32 程序。</p> +<p>但是又不想污染服务器的其他环境,于是选择在容器中运行。</p> +<p>在网上找到了这篇<a class="link" href="https://leimao.github.io/blog/Docker-Wine/" target="_blank" rel="noopener" +>《利用 Docker 容器和 Wine 在 Linux里运行 Windows 程序》</a>,按照文中介绍的步骤成功实现了需求。</p> +<p>基本步骤: +1、根据文章提供的 Dockfile 构建镜像; +2、运行镜像并注意配置运行容器的环境变量; +3、执行所需的 exe 程序。</p> +<h3 id="windows-系统是怎样进行引导的">Windows 系统是怎样进行引导的</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-34-06.png" +width="690" +height="976" +loading="lazy" +class="gallery-image" +data-flex-grow="70" +data-flex-basis="169px" +></p> +<p>前不久,我在给笔记本更换大容量固态硬盘的时候,由于不愿重做系统,使用了硬盘克隆功能,将原盘整体信息直接克隆到新硬盘。</p> +<p>结果克隆成功并替换安装硬盘之后,却没能正常引导进入 Windows,而是进入了一个类似 PE 系统的界面(猜测是原盘中厂家自制的),并告知我由于检测到硬件更换,拒绝引导,并建议我选择恢复系统。</p> +<p>我猜测之前的隐藏分区可能有笔记本厂家做的一些特定引导程序,才导致这样的情况。</p> +<p>我对系统引导的理解还停留在 MBR 分区表大面积应用的阶段。于是尝试删除了隐藏分区,并手动将系统盘分区设置为了 “激活”分区(事实上这时候已经错了,因为 GPT 分区表方式下无法采用这种引导方式了)。</p> +<p>结果系统干脆直接无法引导。出现这种情况,我之前的知识储备显然不够用了。</p> +<p>经过一番折腾和搜索,我才得知现在 Windows 8 及以上版本操作系统的电脑所采用的方式是 GPT 分区表 + UEFI 引导。</p> +<p>也就是说硬盘上需要单独开辟一个分区存储负责进行操作系统引导的工作。这个分区平时对于操作系统的资源管理器不可见(但磁盘管理中可以看到),由主板上的 UEFI 程序(这个程序可以理解为 BIOS 的升级版)进行访问和管理。</p> +<p>了解这个方式之后,就简单了,重新使用工具修改 GPT 分区并制作专用引导分区即可。</p> +<p>最后,为了弄清这跟之前的 MBR 引导方式有什么区别,我找到了一位运维工程师总结得较到位的文章<a class="link" href="https://zhuanlan.zhihu.com/p/355526135" target="_blank" rel="noopener" +>《Windows系统开机引导顺序简述及运维小结》</a>。</p> +<h3 id="500-行代码写一个-c-编译器">500 行代码写一个 C 编译器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-34-22.png" +width="690" +height="690" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +></p> +<p><a class="link" href="https://vgel.me/posts/c500/" target="_blank" rel="noopener" +>500 行 Python 代码写一个 C 编译器</a>。</p> +<p>作者立下这个 flag 之后才发现任务有多难。</p> +<p>主要是代码行数太少了,如果使用传统手段实现,可能这点儿代码量还不够写个语法分析器的。</p> +<p>于是作者主动放弃了 AST (抽象语法树)的构建,采用 Token 提取和指令生成“一遍过”的方式,实现了一个相当“简洁”的 C 编译器。</p> +<h2 id="资源">资源</h2> +<h3 id="假装弹钢琴">假装弹钢琴</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-34-51.png" +width="690" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="204" +data-flex-basis="491px" +></p> +<p><a class="link" href="http://touchpianist.com/" target="_blank" rel="noopener" +>touchpianist</a>,在线弹钢琴的网站(也提供手机 App 版),可以让你假装钢琴大师,只需要按键盘上的任意键,旋律就会自动演奏,不过你要控制敲击键盘的速度,以匹配原曲的节奏。我弹了一下,默认曲目是贝多芬的《月光奏鸣曲》,差点儿被自己陶醉了。 ​​​</p> +<h3 id="bun-v10">Bun V1.0</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-35-09.png" +width="690" +height="419" +loading="lazy" +class="gallery-image" +data-flex-grow="164" +data-flex-basis="395px" +></p> +<p><a class="link" href="https://bun.sh/blog/bun-v1.0" target="_blank" rel="noopener" +>bun-v1.0</a>,拳打 node , 脚踢 deno 的 JavaScript 运营环境 bun 推出了 1.0 版本。主打一个“All in one”,号称可以一次性取代一揽子工具:node、npx、npm、webpack、tsc、babel、jest。一个工具包揽了运行、打包、包管理、转译、测试等所有事情,且速度是 nodejs 的 3 倍。</p> +<p>对于这种吹的比较厉害的技术,保持关注,谨慎使用吧。</p> +<h3 id="开源基于-llm-知识库平台">开源基于 LLM 知识库平台</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-35-24.png" +width="690" +height="334" +loading="lazy" +class="gallery-image" +data-flex-grow="206" +data-flex-basis="495px" +></p> +<p><a class="link" href="https://github.com/labring/FastGPT" target="_blank" rel="noopener" +>FastGPT</a> - 基于 LLM 大模型的 AI 知识库问答系统。提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景。项目在 Github 开源,采用技术栈: NextJs + TS + ChakraUI + Mongo + Postgres(Vector 插件)。支持 GPT、Claude、Spark、ChatGLM 等多种 LLM 模型。</p> +<h3 id="开源基于-llm-数据可视化平台">开源基于 LLM 数据可视化平台</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-35-35.png" +width="690" +height="292" +loading="lazy" +class="gallery-image" +data-flex-grow="236" +data-flex-basis="567px" +></p> +<p><a class="link" href="https://github.com/microsoft/lida" target="_blank" rel="noopener" +>lida</a>,微软出品的数据可视化工具库,特点是基于 LLM 对话模型进行生成,其生成的可视化代码支持多种可视化后端的语法,包括 matplotlib、seaborn、d3等。 ​​​</p> +<h2 id="观点">观点</h2> +<h3 id="编程是一种体育锻炼">编程是一种体育锻炼</h3> +<p>编程除了是一种可以以之谋生的专业技能,对于那些真喜欢编程的人来说,它还是一个心理疗愈工具。</p> +<p>编程能使人专注,进入“心流”状态比较容易,也容易让人的心态平和。</p> +<p>编程与体育锻炼一样,都是可以让人受益终生的活动。</p> +<p>&mdash;-来自<a class="link" href="https://weibo.com/1461522430/NiEh1BHMt" target="_blank" rel="noopener" +>@软件教书匠金旭亮</a>。</p> +<h3 id="造成电子阳痿的一种因素">造成电子阳痿的一种因素</h3> +<p>一个不容忽视的因素是现在游戏的加载速度,尤其是 PC 游戏。</p> +<p>我们被碎片化信息惯得一秒钟都不想等待。</p> +<p>每当想玩会儿 CS 或者地平线之类得游戏,光是等待游戏启动、地图加载等就足以让人放弃想玩的念头。</p> +<p>更别提有些游戏还有一些跳都无法跳过得开场引导视频。</p> +<p>所以我现在就算是玩也是偶尔打开模拟器玩一玩老游戏,带有状态存储,随时加载存档。</p> +<p>据说有一部分游戏主机(比如新一代 XBox)有类似笔记本电脑的睡眠功能,开机就玩,随时进入上次未完成的任务。</p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 048 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/Tue, 05 Sep 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/<h1 id="机器文摘-第-048-期">机器文摘 第 048 期</h1> +<h2 id="长文">长文</h2> +<h3 id="关于-python-语言的一些统计数字">关于 Python 语言的一些统计数字</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-20-05.png" +width="690" +height="307" +loading="lazy" +class="gallery-image" +data-flex-grow="224" +data-flex-basis="539px" +></p> +<p><a class="link" href="https://py-code.org/stats" target="_blank" rel="noopener" +>关于开源 Python 仓库的一些有趣统计</a>,有人克隆了 PyPI 网站里所有 Python 包对应的 Github 仓库,并对这些仓库里的全部文件进行了分析和统计。</p> +<p>1、排名前三的语法特性分别是:列表推导、fstring字符串格式化、注解;</p> +<p>2、代码中大约包含有超过 2 万 5 千个密钥明文,泄露最多的是访问 Google API、OpenAI API和腾讯云 Secret ID;</p> +<p>3、截止到 2023 年 8 月,所有源码加起来已超过 60TB ,文件数量超过 10 亿。</p> +<h3 id="wasm-技术让数据库执行-ai-模型">Wasm 技术让数据库执行 AI 模型</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-20-30.png" +width="618" +height="492" +loading="lazy" +class="gallery-image" +data-flex-grow="125" +data-flex-basis="301px" +></p> +<p><a class="link" href="https://dylibso.com/blog/pg-extism/" target="_blank" rel="noopener" +>使用 Extism 将 WebAssembly 引入 PostgreSQL</a>。</p> +<p>这篇文章的作者介绍了一种方法,可以使用 Wasm 技术通过扩展插件的方式给 PostgreSQL 数据库增加 UDF (用户自定义函数),从而实现调用 AI 模型的能力。</p> +<h3 id="bitlocker-硬件加密能破解吗">BitLocker 硬件加密能破解吗?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-20-50.png" +width="690" +height="499" +loading="lazy" +class="gallery-image" +data-flex-grow="138" +data-flex-basis="331px" +></p> +<p>BitLocker 是 Windows 下的存储加密技术,用于保护硬盘中的数据安全。</p> +<p>未经解密的硬盘即使遗失或者被接入其他系统也无法进行读取。</p> +<p>这在极大程度上带来了数据安全(不过仍有不少用户在不知情的情况下开启了 BitLocker 且未保存密钥,在重做系统的时候发现硬盘无法解密,数据无法恢复。。欲哭无泪。。)。</p> +<p>然而这种加密方式也不是绝对安全,国外有技术爱好者对此进行了挑战,并使用一台逻辑分析仪成功绕过了加密。</p> +<p><a class="link" href="https://www.errno.fr/BypassingBitlocker.html" target="_blank" rel="noopener" +>这篇文章进行了详细的记录</a>。</p> +<p>主要原理为:在系统开机启动过程中的某个时刻,加密芯片和 CPU 之间传输了未加密的信号。使用逻辑分析仪捕获该信号可以逆向出加密密钥。</p> +<h2 id="资源">资源</h2> +<h3 id="监控网页信息变化的工具">监控网页信息变化的工具</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-21-17.png" +width="499" +height="326" +loading="lazy" +class="gallery-image" +data-flex-grow="153" +data-flex-basis="367px" +></p> +<p><a class="link" href="https://github.com/dgtlmoon/changedetection.io" target="_blank" rel="noopener" +>changedetection</a>,一个监控网站变化的工具。</p> +<p>帮助用户密切关注商品打折、股票行情、政策发布等信息变动。</p> +<p>支持通过网页可视化的方式指定监控页面区域。</p> +<p>通过邮件、即时聊天软件、API调用等多种方式推送信息。可使用 Docker 部署,或者本地 Python 环境部署。</p> +<h3 id="switch-模拟器">Switch 模拟器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-21-28.png" +width="690" +height="472" +loading="lazy" +class="gallery-image" +data-flex-grow="146" +data-flex-basis="350px" +></p> +<p><a class="link" href="https://github.com/Ryujinx/Ryujinx" target="_blank" rel="noopener" +>Ryujinx</a> 一个用c# 写的开源 switch 模拟器,该模拟器旨在提供卓越的准确性和性能、用户友好的界面以及稳定的版本构建。 ​​​</p> +<h3 id="文字缩写快捷键工具">文字缩写快捷键工具</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-21-45.png" +width="568" +height="446" +loading="lazy" +class="gallery-image" +data-flex-grow="127" +data-flex-basis="305px" +></p> +<p>为了减少打字量,国外这哥们写了个脚本将日常用语全部缩写了,只需敲入缩写字母,脚本自动完成完整句子的键盘输入。</p> +<p>比如: +st =&gt; something +ab =&gt; about +hw =&gt; hardware +sti =&gt; sometime</p> +<p>据小哥自己统计,使用这个脚本以后他已经减少了一半的键盘敲击量。</p> +<p><a class="link" href="https://github.com/eschluntz/compress" target="_blank" rel="noopener" +>项目名叫 compress 目前已开源</a>,如果你有兴趣,改成支持中文也不是不可以。</p> +<h3 id="canvas-手册">Canvas 手册</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-22-11.png" +width="562" +height="625" +loading="lazy" +class="gallery-image" +data-flex-grow="89" +data-flex-basis="215px" +></p> +<p>Canvas 是网页中用于图形绘制的基本元素,结合 JavaScript 可以实现各种复杂的图形效果和交互动画。我之前都是每次用到了的时候现去翻文档,对它的每个 API 都是一知半解。这里有一个<a class="link" href="https://bucephalus.org/text/CanvasHandbook/CanvasHandbook.html" target="_blank" rel="noopener" +>Canvas 手册</a>,详细介绍了 Canvas 的各种调用接口。适合希望深度使用及系统学习 Canvas。</p> +<h2 id="观点">观点</h2> +<h3 id="不要重复造轮子是人为设置的一种限制">“不要重复造轮子”是人为设置的一种限制</h3> +<p>遇到需求不能满足的情况,是去“寻找轮子”还是“动手创造轮子”,这是两种不同的思维习惯。</p> +<p>“寻找轮子”往往意味着寻找已有答案,将问题看为一种正常的状态,是“自古以来”、是“从来如此”。</p> +<p>思维定势一旦形成,就很难改变,让人成了那个在沙漠中让美女帮他牵住骆驼的矮子。</p> +<p>动手创造者往往是发现这种问题的人,他们不循规蹈矩,他们 Think different,是改变世界的人。</p> +<p>“不要重复发明轮子”,这个原则用于工作中确实比较安全,他保证了不会浪费资源,并且避免了一定的技术风险。</p> +<p>但也同时拒绝了伟大的创新。</p> +<p>所以不要被这句话束缚,尽管去做自己的轮子。</p> +<p>哪怕它一开始很丑。</p> +<p>你的轮子必将使你与众不同,使你拥有不一样的视角,成为那个动手创造的人。</p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 047 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/Tue, 29 Aug 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/<h1 id="机器文摘-第-047-期">机器文摘 第 047 期</h1> +<h2 id="长文">长文</h2> +<h3 id="业余爱好者痴迷于工具专业人士注重技能">业余爱好者痴迷于工具,专业人士注重技能</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-17-36.png" +width="649" +height="582" +loading="lazy" +class="gallery-image" +data-flex-grow="111" +data-flex-basis="267px" +></p> +<p><a class="link" href="https://adamsinger.substack.com/p/amateurs-obsess-over-tools-pros-over" target="_blank" rel="noopener" +>业余爱好者痴迷于工具,专业人士注重技能</a>。</p> +<blockquote> +<p>以原声吉他为例。在数字音乐制作和合成器盛行的时代,这个单独演奏的乐器可能显得有点古老。然而,在熟练音乐家的手中,它变成了一个充满迷人旋律和触动灵魂的载体。它甚至可能为更大的创意提供灵感,如果你直接跳到现代合成器就有可能会错过这些。原声吉他的简单性促使艺术家专注于演奏的细微之处,完善他们的指弹技巧,并通过每一次弹奏传达情感。真正的魔力不在于吉他本身,而在于将其演绎得生动活泼的音乐家的技艺。</p> +</blockquote> +<p>这篇文章读来深有感触。</p> +<p>在解决问题的时候,我总是忍不住问自己,我这个方法是最优的吗?我使用的工具是不是最合适/最好的?</p> +<p>这种心理,常常使我陷入对最佳实践和完美工具的追求中,而忘记了解决问题本身。</p> +<p>时间久了,工具积累一大堆,但每个都未曾发挥其真正作用,一边老工具在吃灰,一边继续寻找新工具。</p> +<p>差生文具多。</p> +<p>正如文章中所说:真正的高手明白,应当拿起手里已有的工具,先行动起来。在这个过程中如果有机会创造美好的事物,好的工具自然会出现在眼前。</p> +<h3 id="cpu-的指令分支预测">CPU 的指令分支预测</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-17-49.png" +width="682" +height="743" +loading="lazy" +class="gallery-image" +data-flex-grow="91" +data-flex-basis="220px" +></p> +<p>现代的 CPU 基本都具有指令分支预测的特性,通过猜测后续会执行的指令分支,提前运行一些指令和设置状态,可以有效利用 CPU 的执行资源,提升效率。</p> +<p>不过,如果预测准确的话效率提升十分明显,但是如果预测错误,CPU 就要多做一些事情(刷新后续预测的指令和相关的状态),随着现代 CPU 中指令流水线越来越复杂,这种代价也变得越来愈大。</p> +<p>在编程的时候,编写一些对于 CPU 分支预测友好的代码,能够对性能产生极大的影响。</p> +<p>这篇<a class="link" href="https://johnnysswlab.com/how-branches-influence-the-performance-of-your-code-and-what-can-you-do-about-it/" target="_blank" rel="noopener" +>对于 CPU 的分支预测,我们能做什么</a>耐心地从 CPU 的分支预测机制讲起,通过具体的代码举例,讲解了怎样让编写的代码对 CPU 分支预测这类优化更加友好。</p> +<h3 id="ssh-命令详解">SSH 命令详解</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-18-25.png" +width="690" +height="535" +loading="lazy" +class="gallery-image" +data-flex-grow="128" +data-flex-basis="309px" +></p> +<p><a class="link" href="https://grahamhelton.com/blog/ssh-cheatsheet/" target="_blank" rel="noopener" +>SSH 命令详解</a>,一篇对 SSH 命令的参数介绍十分详细且易懂的文章。</p> +<p>通过举例让我彻底弄清楚了基于 SSH 的端口转发。</p> +<p>另外还知道了可以在已有的 SSH 连接上执行补充命令,以实现不断开终端的情况下将远程主机上的端口转发到本机访问。 ​​​</p> +<h2 id="资源">资源</h2> +<h3 id="开源的房子">开源的房子</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-18-47.png" +width="690" +height="403" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="410px" +></p> +<p><a class="link" href="https://www.wikihouse.cc" target="_blank" rel="noopener" +>wikihouse</a>,是一个开源房屋建造网站,房子的图纸、模型均可从网站上下载,里面有各式各样的房屋建造资料,任何人都可以据此增删、设计、制造、组装自己的建筑。可以理解为建筑界的 github。 +​​​</p> +<h3 id="关掉-edge-浏览器新增的圆角样式">关掉 Edge 浏览器新增的圆角样式</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-19-03.png" +width="690" +height="352" +loading="lazy" +class="gallery-image" +data-flex-grow="196" +data-flex-basis="470px" +></p> +<p>Edge 浏览器的最新更新里,给所有页面强制增加了一个圆角边框,看起来很不习惯(丑陋)。</p> +<p>经过研究,我发现,如果想恢复到之前的样子,可以在设置外观选项里关闭该特性。</p> +<p>我已经关闭,并果断给这个功能特性反馈了负面评价。</p> +<h3 id="hello-world">Hello World</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-19-26.png" +width="690" +height="385" +loading="lazy" +class="gallery-image" +data-flex-grow="179" +data-flex-basis="430px" +></p> +<p><a class="link" href="https://github.com/leachim6/hello-world" target="_blank" rel="noopener" +>Hello World</a> ,这个仓库收录了几乎所有编程语言(997种)的 Hello world 程序。 ​​​</p> +<h3 id="前端开发代码大全">前端开发代码大全</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-19-42.png" +width="690" +height="639" +loading="lazy" +class="gallery-image" +data-flex-grow="107" +data-flex-basis="259px" +></p> +<p><a class="link" href="https://30secondsofcode.org" target="_blank" rel="noopener" +>30secondsofcode</a>。</p> +<p>这个网站有大量可复用的代码片段,主要是 Javascript、CSS、HTML 、Python 等语言的内容,可以覆盖 Web 应用开发全栈。</p> +<p>里面收录的代码段或者文章都很清新,每个都配有细心的解释,具有良好的实用性。 ​​​</p> +<h3 id="关于-win10-的锁屏睡眠时间">关于 Win10 的锁屏睡眠时间</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-20-00.png" +width="410" +height="502" +loading="lazy" +class="gallery-image" +data-flex-grow="81" +data-flex-basis="196px" +></p> +<p>我在使用 Windows10 的时候发现一个问题。</p> +<p>无论我将电源设置里的睡眠时间、显示器空闲关闭时间设置多长,锁屏后系统都会在 1 分钟之后关闭显示器。</p> +<p>这会带来一些不方便,并且让人困惑。</p> +<p>在经过一番研究搜索之后,找到了如下解决方案(Windows就是这么喜欢在注册表隐藏设置):</p> +<p>1、打开注册表编辑器后。</p> +<p>2、定位到:<code>计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\7516b95f-f776-4464-8c53-06167f40cc99\8EC4B3A5-6868-48c2-BE75-4F3044BE88A7</code></p> +<p>3、修改右侧的Attributes 数值为2 (初始值为1)</p> +<p>4、再打开“编辑电源计划”时会发现多了一个选项“控制台锁定显示关闭超时。</p> +<h3 id="红警2游戏整合包">红警2游戏整合包</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-20-25.png" +width="413" +height="302" +loading="lazy" +class="gallery-image" +data-flex-grow="136" +data-flex-basis="328px" +></p> +<p><a class="link" href="https://tmioe.com/7991.html" target="_blank" rel="noopener" +>红警2 的民间整合包</a>,支持 win7 到 win11。整合大量资源,傻瓜式一键安装。 ​​​</p> +<p>经过我的测试,前面链接页面里提供的安装包里带有额外的广告脚本,在使用时可使用 7z 等压缩软件直接打开该自解压包,选取主文件夹拷贝出来即可。</p> +<h2 id="观点">观点</h2> +<h3 id="隐形的门槛">隐形的门槛</h3> +<p>也许每个领域都存在一个隐形的门槛,无论是你学会一种语言,还是掌握一种能力,哪怕是打通一个游戏,只要你跨不过那个门槛,那么无论你尝试多少次,都会在同样的水平下无功而返。相反,一旦跨过后,那就是一马平川,你有了在那个新世界周游的能力。这当然不是说你不会再遇到困难,而是说,你不再有那种尝试了无数次,带着同一种感受离开的感觉。剩下的区别只是更多经验的积累,是熟练度的问题,因为你已经在那个轨道上了,你已经拿到了入场券。</p> +<p>人生可以被隐喻成一个有着自然消退机制的RPG体系,累积10000经验可以升那关键的一级,那么先前你无论你多少次到达5000,6000,9000都不行,因为熟练度会反复消退到1000,2000的水平。而我知道,很多人就是无数次的卡在了那9000以内,但每次都要从1000,2000这个位置开始。这个和自我接纳也没有关系,因为你知道你遇到的困难并不是基于你对自己的苛求,你的困难在于你无法为自己在乎的事情付出真正的努力,无法将自己的活力与热情持续的灌注在同一个点上,但你隐约知晓跨过那10000的门槛,是你更重要的人生福祉。</p> +<p>来自微博 <a class="link" href="https://weibo.com/3762961402/NgprO9HD5" target="_blank" rel="noopener" +>@崔庆龙_</a></p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 046 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/Tue, 22 Aug 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/<h1 id="机器文摘-第-046-期">机器文摘 第 046 期</h1> +<h2 id="长文">长文</h2> +<h3 id="windows-的任务管理器">Windows 的任务管理器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-28-48.png" +width="452" +height="758" +loading="lazy" +class="gallery-image" +data-flex-grow="59" +data-flex-basis="143px" +></p> +<p>如果你喜欢使用 Windows 任务管理器来查杀那些不安分的进程,并且跟我一样讨厌他们乱跳(尤其在按照资源占用排序时)。你可以按下 Ctrl 键,它就会神奇地停止更新直到你松开 Ctrl。</p> +<p>Windows 操作系统有一种魔力,就是哪怕你用了将近 20 年,还是会有你不知道的快捷键或者快捷操作。这些东西有时候能带来一些惊喜。</p> +<p>具体介绍可以看这里:<a class="link" href="https://www.theverge.com/2023/8/16/23834125/microsoft-windows-task-manager-pause-shortcut" target="_blank" rel="noopener" +>暂停 Windows 任务管理器</a></p> +<h3 id="linux-内核最初版的解析">Linux 内核最初版的解析</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-29-10.png" +width="588" +height="253" +loading="lazy" +class="gallery-image" +data-flex-grow="232" +data-flex-basis="557px" +></p> +<p>最新版本的 Linux 内核,其源码规模已经飙升至 3600 万行,想要深入细节去了解它十分吃力。</p> +<p>而Linux 的第一个版本 v0.01 却非常小巧。</p> +<p>刨去注释和空行的话,也就 8 千来行代码。</p> +<p>这么小的代码结构,足够理解操作系统的精髓。</p> +<p>这篇<a class="link" href="https://seiya.me/blog/reading-linux-v0.01" target="_blank" rel="noopener" +>探索 Linux v0.01 d的内部结构</a>,可以带你像参观历史博物馆那样去见证曾经的 Linux。</p> +<p>我记录了一些有意思的地方:</p> +<p>1、v0.01 只有 66 个系统调用,用于支持文件管理和进程管理,分别是:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">access acct alarm <span class="nb">break</span> brk chdir chmod +</span></span><span class="line"><span class="cl">chown chroot close creat dup dup2 execve +</span></span><span class="line"><span class="cl"><span class="nb">exit</span> fcntl fork fstat ftime getegid geteuid +</span></span><span class="line"><span class="cl">getgid getpgrp setsid getpid getppid +</span></span><span class="line"><span class="cl">getuid gtty ioctl <span class="nb">kill</span> link lock lseek +</span></span><span class="line"><span class="cl">mkdir mknod mount mpx nice open pause +</span></span><span class="line"><span class="cl">phys pipe prof ptrace <span class="nb">read</span> rename rmdir +</span></span><span class="line"><span class="cl">setgid setpgid setuid setup signal stat +</span></span><span class="line"><span class="cl">stime stty sync <span class="nb">time</span> <span class="nb">times</span> <span class="nb">ulimit</span> <span class="nb">umask</span> +</span></span><span class="line"><span class="cl">umount uname unlink ustat utime waitpid write +</span></span></code></pre></td></tr></table> +</div> +</div><p>其中 mount 调用啥也没干,直接返回了。</p> +<p>2、直接写死代码绑定 Intel 386 平台。至今对于 PS/2 接口的键盘、ATA硬盘、VGA显卡等标准硬件的驱动代码还是写死在内核里(而不是放在drivers文件夹)。</p> +<p>3、系统崩溃处理代码只有 5 行:只实现了打印一句“我不行了”,然后进入死循环<code>for(;;);</code>。</p> +<h3 id="llamacpp-是怎样做到的">LLaMa.cpp 是怎样做到的?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-29-37.png" +width="540" +height="531" +loading="lazy" +class="gallery-image" +data-flex-grow="101" +data-flex-basis="244px" +></p> +<p>LLaMa.cpp 是一个令人惊叹的项目,在它之前没有人能够在低端消费设备上成功运行 Meta 开源的人工智能模型 LLaMa ,因为那需要太多的硬件资源。</p> +<p>但是 LLaMa.cpp 的横空出世使得在 M2 Macbook Pro、Android Pixel5 手机甚至树莓派上运行 LLaMa 的 7B 模型成为可能。</p> +<p>这是怎么做到的?</p> +<p>带着这个疑问,有网友深入研究了这个项目,并写下了这篇<a class="link" href="https://finbarr.ca/how-is-llama-cpp-possible/" target="_blank" rel="noopener" +>How is LLaMa.cpp possible?</a>以解释原因。</p> +<p>作者认为主要得益于对模型参数的量化,降低模型参数的精度,从 FLOAT16 减小到 INT4。使得 LLaMa.cpp 能够以较少的计算资源甚至只依赖 CPU 的情况下加载大模型。</p> +<h3 id="逐渐觉得微软比谷歌良心">逐渐觉得微软比谷歌良心</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-30-01.png" +width="690" +height="372" +loading="lazy" +class="gallery-image" +data-flex-grow="185" +data-flex-basis="445px" +></p> +<p>曾经微软是技术黑客的公敌,被不少人视为反对技术创新、技术开放的最大反派。</p> +<p>不过随着时间的推移,以及微软逐渐在开源社区所做出的努力。这一现象有所好转。</p> +<p>近期在 HN 上<a class="link" href="https://old.reddit.com/r/degoogle/comments/15pd5si/today_i_realized_i_now_trust_microsoft_more_than/" target="_blank" rel="noopener" +>有位网友很扭捏地承认:现在他对微软的感觉要比对谷歌好很多</a>。</p> +<p>他列举了一些关于两家公司的对比,包括发布的产品、主观的优劣评价等等。</p> +<p>为了抵制微软,他已经十多年没用 Windows 了,但貌似微软的其他产品“很香”(VS Code、Github、ChatGPT等)。</p> +<p>并表示最近正在寻摸租一个云存储,大概率也会用微软的 onedrive 而不是谷歌的 Google drivers。</p> +<p>对此我也有类似感觉,不过我对谷歌的不信任起始于十年前谷歌将 Google reader 停掉,而自从微软推出 WSL 后,我更是觉得微软在产品上越来越实在了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-31-23.png" +width="690" +height="538" +loading="lazy" +class="gallery-image" +data-flex-grow="128" +data-flex-basis="307px" +></p> +<h2 id="资源">资源</h2> +<h3 id="tailwindcss-的小抄">tailwindcss 的小抄</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-30-29.png" +width="690" +height="465" +loading="lazy" +class="gallery-image" +data-flex-grow="148" +data-flex-basis="356px" +></p> +<p>tailwind 这个 css 框架之所以能够很快流行起来,主要原因就是它解决了一个之前很多人没有太注意的问题,即 CSS 的“正交性”。</p> +<p>之前 CSS 实现一个效果,可以有 N 种方法,外加各种奇技淫巧,但在使用 tailwind 之后,针对特定效果都有了最优实践路径,而且还可以很容易组合。</p> +<p>不过由于它的类分的太细太碎,导致刚开始的时候会有一些不容易记忆。</p> +<p><a class="link" href="https://tailwindcomponents.com/cheatsheet/" target="_blank" rel="noopener" +>这里有一份 tailwind 的小抄</a>,适合初学者收藏,方便随时查阅。</p> +<h3 id="在浏览器中运行的-vim">在浏览器中运行的 vim</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-30-43.png" +width="690" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="204" +data-flex-basis="491px" +></p> +<p><a class="link" href="https://github.com/rhysd/vim.wasm" target="_blank" rel="noopener" +>vim.wasm</a>,在浏览器中运行的 Vim,不是插件。</p> +<p>使用 wasm 技术直接编译移植的 Vim Editor 源码,效果跟原生程序几乎一样。</p> +<p>使用 WebAssembly 给 Vim 提供一个新的 GUI 前端(类似 GVim)。</p> +<p>为了编译通过,作者在源码里禁用了很多 Wasm 不支持的特性,如:fork(2)、PTY 等。</p> +<p>可在这里体验:https://rhysd.github.io/vim.wasm/</p> +<h3 id="无隐私问题的-pdf-工具网站">无隐私问题的 pdf 工具网站</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-32-04.png" +width="690" +height="362" +loading="lazy" +class="gallery-image" +data-flex-grow="190" +data-flex-basis="457px" +></p> +<p><a class="link" href="https://pdftool.org/zh" target="_blank" rel="noopener" +>这个pdf工具可以尝试一下</a>,跟其他pdf 工具网站不同,这个网站借用 WebAssembly 技术将很多工作放在浏览器客户端执行,用户无需上传自己的pdf到网站,即可执行处理工作,包括:加密、解密、拆分、合并等常用功能。 ​​​</p> +<h3 id="深入理解操作系统的小游戏">深入理解操作系统的小游戏</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-32-17.png" +width="690" +height="368" +loading="lazy" +class="gallery-image" +data-flex-grow="187" +data-flex-basis="450px" +></p> +<p><a class="link" href="https://plbrault.com/blog-posts/i-created-the-nerdierst-game-ever-en/" target="_blank" rel="noopener" +>这个自称史上最极客的小游戏</a>,是国外一位计算机科学教授给学生们写的一个小游戏,假设玩家是一个“操作系统”,在游戏里玩家需要不停地进程调度、内存页交换等操作,一旦调度不合理就会激怒用户导致“玩家”也就是操作系统被重启,游戏就 GAME OVER 了。</p> +<p>游戏使用 Python 编写,作者将其编译为 WebAssembly 以嵌入网页,这里可以直接在线体验: <a class="link" href="https://drfreckles42.itch.io/youre-the-os" target="_blank" rel="noopener" +>https://drfreckles42.itch.io/youre-the-os</a>。</p> +<h2 id="观点">观点</h2> +<h3 id="学习技能最有效的练习手段是复刻">学习技能最有效的练习手段是“复刻”</h3> +<p>这是我前两天尝试用 CSS 临时写个页面效果想到的。</p> +<p>我虽然也了解了CSS 语言的一些基本知识,但是在具体实操的时候仍会感到无从下手。</p> +<p>与下棋类似,只知道“规则”但是没有“套路”。</p> +<p>后来干脆找了几个目标页面,按照自己的想法去还原,渐渐能够摸到一些“套路”的边缘,最终实现了自己想要的效果。</p> +<p>于是我想: <strong>在学习一项技能的时候,“复刻”、“抄袭”、“借鉴”、“致敬”,都没有问题,应该把它作为最主要的练习手段。</strong></p> +<p>因为“抄”是最经济的学习方法了。</p> +<p>不仅仅是编程技能,艺术方面更是如此。</p> +<p>比如在编曲学习的时候有一种练习叫“扒带”,就是找一首歌,然后你通过你的工具和技巧制作一份完全一样的作品,尽量做到百分百还原。</p> +<p>很多“大师”都是在这个过程中,遇到问题解决问题,领悟到很多只能意会不能言传的技巧,而这些领悟是无论如何也无法仅仅通过“看”和“听”获得的。</p> +<p>另外,人们练字、绘画也是从临摹开始,一般在熟练之后才能突破,才又自成体系。</p> +<h3 id="忍耐守恒">忍耐守恒</h3> +<p>怕麻烦的人,主要是不能忍受一些事情。</p> +<p>然而正是因为这些不能忍受,所以注定要忍受一些其他的事情。</p> +<p>人生就是这样,比如无法忍受投资带来的风险,就得承受现金贬值;不能面对创业的压力,就得忍受按时上班的束缚。</p> +<p>对于这种现象,我将之称为“忍耐守恒”。 ​​​</p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 045 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/Tue, 15 Aug 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/<h1 id="机器文摘-第-045-期">机器文摘 第 045 期</h1> +<h2 id="长文">长文</h2> +<h3 id="基于浏览器-javascript-堆快照的网页爬虫">基于浏览器 JavaScript 堆快照的网页爬虫</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-23-22.png" +width="690" +height="546" +loading="lazy" +class="gallery-image" +data-flex-grow="126" +data-flex-basis="303px" +></p> +<p><a class="link" href="https://www.adriancooney.ie/blog/web-scraping-via-javascript-heap-snapshots" target="_blank" rel="noopener" +>基于 JavaScript 堆快照的网页爬虫</a>。</p> +<p>本文作者介绍了一个实现网络爬虫的新思路,据称已在生产上使用了一段时间,且效果不错。</p> +<p>比较典型的网络爬虫在爬取数据时,大都采用解析网页 DOM 的方式,或直接通过 HTTP 请求流直接解析,或使用无头浏览器进行解析。</p> +<p>但现在这项技术已经被很多网站、平台人为设置很多障碍,比如增加很多随机的嵌套等等。</p> +<p>作者某天福至心灵,想到一个点子。</p> +<p>利用浏览器提供的 JavaScript 内存堆快照功能,将内存里的全部信息扒下来,然后根据对应的 JavaScript 对象属性,按图索骥去找到真正需要的数据。</p> +<p>这种方法比较狠的地方在于,<strong>直接从后台的数据结构下手,跳过了对页面 DOM 的分析和拆解</strong>,而且据作者说,网站即便想通过混淆此类数据在内存中的属性名称来进行防御,其工作量还是相当大的。</p> +<p>所以,可能短期内无能为力。</p> +<p>作者说,也许全面转为 Web Assembly 才能彻底禁止他这种爬虫。</p> +<p><a class="link" href="https://github.com/adriancooney/puppeteer-heap-snapshot" target="_blank" rel="noopener" +>项目源码在这里</a></p> +<h3 id="intel-cpu-的崩溃攻击漏洞">Intel CPU 的“崩溃攻击”漏洞</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-23-45.png" +width="512" +height="512" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +></p> +<p><a class="link" href="https://downfall.page" target="_blank" rel="noopener" +>intel cpu 有一个崩溃攻击漏洞</a>,标识为 <a class="link" href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-40982" target="_blank" rel="noopener" +>CVE-2022-40982</a>,利用此漏洞可以在虚拟机里窃取共享同一个物理 CPU 的其他虚拟机的数据。</p> +<p>这个漏洞可以让恶意程序在本机运行后窃取如密码、加密密钥、以及个人电子邮件等私人数据。</p> +<p>恶意的云计算客户可以利用 Downfall 漏洞从与其共享同一台云计算机的其他客户那里窃取数据和凭据。</p> +<p>据文章作者(也即漏洞发现者)所说,该漏洞存在于 Intel Core 6 代到 11 代 CPU,并且研究人员发现存在通过 Web 网页浏览进行攻击的可能性。</p> +<p><a class="link" href="https://github.com/flowyroll/downfall/tree/main/POC" target="_blank" rel="noopener" +>作者开放了一部分用于测试攻击的代码在此</a></p> +<h3 id="利用树莓派的-gpio-发射无线信号">利用树莓派的 GPIO 发射无线信号</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-24-15.png" +width="690" +height="388" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></p> +<p><a class="link" href="https://hackaday.com/2021/04/06/fan-tastic-misuse-of-raspberry-pi-gpio/" target="_blank" rel="noopener" +>原来树莓派的 GPIO 还能干这个</a>,这位老哥使用树莓派的 GPIO 接口直接进行无线电波发射(没错,就是随便扯出一根线就可以当作天线了)。实现了基于树莓派的微型电台。</p> +<p>这得益于 <a class="link" href="https://github.com/F5OEO/rpitx" target="_blank" rel="noopener" +>rpitx</a>这个开源项目,项目本来是为了研究和学习一些无线电原理,不过后来逐渐成为一些 SDR 爱好者必不可少的工具了。</p> +<p><a class="link" href="https://www.youtube.com/watch?v=M2JY1_Xmokg&amp;t=8s" target="_blank" rel="noopener" +>我上次看到一个小哥使用 RTL-SDR 录制汽车遥控器信号,然后使用树莓派重复发射出来,成功实现了自家汽车的解锁</a>。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://oimo.io/works/water/" target="_blank" rel="noopener" +>water</a>,一个在网页里模拟流体动画的 Demo,使用 Haxe 语言编写。<a class="link" href="https://github.com/saharan/works/tree/main/water" target="_blank" rel="noopener" +>源码在这里</a> +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-24-42.png" +width="690" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="204" +data-flex-basis="491px" +></p> +<p>Haxe 是一种跨平台的开源编程语言,在其官方网站上称其为&quot;universal language&quot;。</p> +<p>它可以用于开发多种平台(如Web、移动、桌面等)的应用程序。</p> +<p>Haxe 提供了强大的静态类型系统,并支持多种编译目标,包括但不限于 JavaScript、C++、Java、C#、Python 等。</p> +<p>感兴趣的话,这里也有<a class="link" href="https://daobook.github.io/haxe-book/docs/start/00_intro.html" target="_blank" rel="noopener" +>一份 Haxe 的在线教程</a></p> +</li> +<li> +<p><a class="link" href="https://github.com/lllyasviel/Fooocus" target="_blank" rel="noopener" +>Fooocus</a>,ControlNet 作者开源的一款新的 AI 画图工具 ,搭建起来比 Stable Diffusion webui 稍微方便了一点,相当于整合包。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-25-40.png" +width="690" +height="644" +loading="lazy" +class="gallery-image" +data-flex-grow="107" +data-flex-basis="257px" +></p> +</li> +<li> +<p>原来 HTML5 有一个 <code>&lt;progress&gt;&lt;/progress&gt;</code> 标签,直接写这个标签,不加任何属性的话,就是一个加载动画,非常适合在页面里临时需要一个进度、状态展示的时候。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-25-55.png" +width="462" +height="387" +loading="lazy" +class="gallery-image" +data-flex-grow="119" +data-flex-basis="286px" +></p> +</li> +<li> +<p><a class="link" href="https://wangdoc.com/typescript/" target="_blank" rel="noopener" +>阮一峰老师的 Typescript 教程</a>,发布了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-26-13.png" +width="501" +height="800" +loading="lazy" +class="gallery-image" +data-flex-grow="62" +data-flex-basis="150px" +></p> +</li> +</ul> +<p>据老师自己说,刚开始也是抗拒的,觉得TypeScript 就是为 JS 语言添加静态类型系统。如果真需要静态类型,可以考虑使用其他更成熟的语言(比如 Rust 和 Java),再编译成 JS(wasm 模块),何必新学一门语言呢。</p> +<p>但是后来发现 TypeScript 越来越流行,成为前端开发的主流工具,各种项目纷纷移植过去。</p> +<p>我虽然对 TypeScript 仍然持保留态度,但是阮老师写的技术书籍读起来都很轻松易懂,所以觉得还是有必要收藏一下​​​。</p> +<ul> +<li> +<p><a class="link" href="https://islamov.ai/stable-diffusion-webgpu/" target="_blank" rel="noopener" +>stable-diffusion-webgpu</a>,在网页里运行 AI 画图模型。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-26-55.png" +width="1154" +height="667" +loading="lazy" +class="gallery-image" +data-flex-grow="173" +data-flex-basis="415px" +></p> +<p>基于 webgpu 技术,无需部署,直接在网页里运行。我试了一下,在我的 1080 8G 显存的显卡上 ,可以跑动,但是速度一般。</p> +<p>上面的图是我只跑了 8 个 steps 的结果。。。 ​​​</p> +</li> +</ul> +<h2 id="观点">观点</h2> +<h3 id="ai-画图的品质">AI 画图的品质</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-27-30.png" +width="690" +height="690" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +></p> +<p>为了验证之前关于“模特很可能被AI取代”的想法,自己动手部署 <a class="link" href="https://github.com/AUTOMATIC1111/stable-diffusion-webui" target="_blank" rel="noopener" +>Stable Diffusion webui </a> 测试了一些模型。根据网友分享的提示词尝试生成了一些图片。</p> +<p>感觉效果比我几个月之前体验时又有了不少提升,配合各种微调模型和 LoRA 模型可以生成照片质感和光影的图片。</p> +<p>虽然人物表情和姿态还有些僵硬,不过我相信这是我没有合理调整各个参数以及充分发挥插件性能导致。</p> +<p>多进行尝试和练习,应该能够生成更逼真、自然的照片。</p> +<h3 id="信息的维度">信息的维度</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-28-20.png" +width="690" +height="690" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +> +最近看了一些线性代数相关的知识,在向量、矩阵的各种计算中逐渐有了一些感悟:</p> +<p>古代“老子”思想中的“道”很可能是无限维的,你的任何表达都是对它的一种投影,也就是降维了。所以才是“道可道,非常道”。</p> +<p>每个人都想用最简单的框架去理解世界,将多维的信息硬生生地将为一维。</p> +<p>这样的后果便是,盲人摸象、管中窥豹、一叶障目,不同的观点争得不可开交。</p> +<p>所以在接收时也应该尽量按自己掌握的其它维度进行升维还原,任何信息都不可孤立看待。</p> +<p>如果能从多维信息得视角去认知世界,也许会有转机,这多少就有点儿“阴阳互生、一分为三”的意思了。</p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 044 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/Tue, 08 Aug 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/<h1 id="机器文摘-第-044-期">机器文摘 第 044 期</h1> +<h2 id="长文">长文</h2> +<h3 id="导致-python-多线程鸡肋的-gil-是什么">导致 Python 多线程鸡肋的 GIL 是什么</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-51-26.png" +width="690" +height="839" +loading="lazy" +class="gallery-image" +data-flex-grow="82" +data-flex-basis="197px" +> +近期在使用 Python 多线程的时候,遇到了 GIL 全局锁导致的性能问题。</p> +<p>具体来说就是性能提升没有达到预期,对于有些计算任务无法并行执行。</p> +<p>从多核 CPU 占用结果上来看,像极了网上那张经典的围观图,一核干活多核围观。</p> +<p>于是翻阅了相关资料研究一下,发现这是 Python 社区争论多年的问题,而且有很大的历史包袱。</p> +<p>严格来说,GIL 全局锁导致的性能问题与 Python 编程语言没有关系,导致这个问题的原因在于具体实现的 CPython 解释器。</p> +<p>当年解释器开发者为了简单实现对多线程的支持,搞了一个全局锁,以至于在多核时代无法充分发挥 CPU 性能。</p> +<p>而后续又有很多库延续了这项依赖,历史的包袱(屎山?)越来越重,很难下定决心将之移除(据说代价甚至比当年从 Python2.x 迁移到 Python3 还要大)。</p> +<p>如果不想深究具体技术细节只想了解基本的来龙去脉,这里有篇文章<a class="link" href="https://xie.infoq.cn/article/1e151c24367abe8cad18130f4" target="_blank" rel="noopener" +>为什么 GIL 让多线程变得如此鸡肋?</a>介绍了 Python PIL 的产生背景以及适用于 Python 多线程的业务场景,可以给你的技术决策提供参考。</p> +<p>不过好消息是,就在刚刚(前几天),Python 官方终于宣布要动手取消掉 GIL 了,顿时网上一片沸腾(其实只有一部分人,大多数人都还不知道 PIL 是什么玩意儿)。而且,<a class="link" href="https://news.ycombinator.com/item?id=36643670" target="_blank" rel="noopener" +>Meta 也承诺,愿意出工出力(3人年)帮助 Python 社区做针对去除 GIL 的相关开发工作</a>。</p> +<h3 id="用树莓派做一个属于自己的高级收音机">用树莓派做一个属于自己的高级收音机</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-52-14.png" +width="606" +height="454" +loading="lazy" +class="gallery-image" +data-flex-grow="133" +data-flex-basis="320px" +> +最近接触到 SDR (软件定义无线电)这个领域,感觉挺有意思的。</p> +<p>软件定义无线电是一种无线通信技术,它利用软件来实现无线电通信系统中的信号处理和调制解调功能,而不是传统的硬件电路。</p> +<p>通过软件定义无线电技术,可以实现灵活、可配置和可重用的无线通信系统,大大提高了无线通信的灵活性和性能。</p> +<p>传统的无线电通信系统通常使用硬件电路来执行信号处理、调制解调和频谱管理等功能。这些硬件电路通常是固定的,不能轻易更改,因此限制了通信系统的灵活性和可配置性。</p> +<p>而SDR技术通过将信号处理和调制解调等功能以软件方式实现,可以在通信系统中使用可编程的处理器和通用硬件,从而使得通信系统的功能可以在软件层面上重新配置和调整,而不需要更改硬件设计。</p> +<p>比起灵活性和可配置性来说,我觉得 SDR 最大的优势是成本大大降低。之前必须购买昂贵的硬件才能实现的效果,现在能够通过便宜的、少量的硬件加上软件模拟即可。</p> +<p>我近期就以很低廉的价格购买了一套 SDR 设备,通过 USB 接口连接计算机,可以实现 500KHz到1700MHz频率范围的接收。听 FM 和航空频段不在话下,SW 短波的话受天线影响,我暂时没有调试出好的效果。</p> +<p>跟 SDR 相比,我几千块买的旗舰手台显得既昂贵又功能弱。</p> +<p><a class="link" href="https://www.hackster.io/mircemk/diy-sdr-dsp-radio-with-raspberry-pi-and-rtlsdr-dongle-c38064" target="_blank" rel="noopener" +>这里有篇文章</a>是作者自己动手用 SDR 设备结合树莓派制作了一个看起来还挺专业的宽频无线接收机。</p> +<p>其实这跟音乐制作领域内很多乐器、效果器逐渐被虚拟化的软件、插件代替是一样的。软件虚拟化拥有巨大的优势,随着通用计算硬件的成本越来越低廉,一切能被软件定义的最终都会被软件定义。</p> +<h3 id="家用-wifi-路由器需要选择哪个信道">家用 WiFi 路由器需要选择哪个“信道”</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-52-42.png" +width="601" +height="373" +loading="lazy" +class="gallery-image" +data-flex-grow="161" +data-flex-basis="386px" +> +近期验证了一个关于无线路由器的传说。</p> +<p>起因是我新买了一个树莓派 ZeroW 带无线版本,没想到板载的 WiFi 网卡天线太弱了。</p> +<p>离路由器稍微远一点,比如放到卧室,传输速率就会大幅下降,我又暂时没能找到合适的外接网卡,一度陷入绝望。</p> +<p>后来灵机一动,看看能不能从路由器那头想想办法,于是打开路由器配置页面,找到了 WiFi 的“信道”设置,将之从“自动”调到了最不常用的“13”。</p> +<p>这里补充一下,WiFi信道一般从1到13,由路由器自动选择,但现在无线环境十分混乱,尤其是 2.4G(树莓派 Zero W 只能连这个规格) 频段,干扰很严重。</p> +<p>但是 13 这个信道很少被路由器自动选用,原因是最初制定标准的时候,不是所有国家和地区都支持,也不是所有终端设备都支持,所以这个信道就成了最不常用的。</p> +<p>在我手动指定信道之后,惊喜地发现,树莓派放在同样的位置,传输速率得到了较大提升并且稳定。看来传说将路由器 2.4G 信道设为 13 可以防干扰是真实的。</p> +<p><a class="link" href="https://zhuanlan.zhihu.com/p/344389009" target="_blank" rel="noopener" +>什么是路由器的信道?信道设置成什么最合理?</a></p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://roadmap.sh" target="_blank" rel="noopener" +>开发人员路线图</a> 是一个学习索引网站,旨在创建路线图、指南和其他教育内容,以帮助开发人员选择学习路径。在 Github 所有仓库中 Stars 排名第七。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-53-03.png" +width="690" +height="490" +loading="lazy" +class="gallery-image" +data-flex-grow="140" +data-flex-basis="337px" +></li> +<li><a class="link" href="https://felixkreuk.github.io/audiogen/" target="_blank" rel="noopener" +>AudioGen</a> facebook 开源的声音合成模型,可以根据文字描述生成对应的声音。效果已经很惊人了,这个页面展示了很多样例。我听了一下,觉得以后影视作品里的一部分声音特效应该可以通过 AI 进行生成了。至少像一些嘈杂的人群、婴儿哭声、鸟叫等各种背景音是可以合成的。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-53-14.png" +width="499" +height="270" +loading="lazy" +class="gallery-image" +data-flex-grow="184" +data-flex-basis="443px" +></li> +<li>原来 Chrome 和 Edge 浏览器的 DevTools 里自带了 CSS 动画曲线编辑器啊!可以直接通过鼠标拖动进行调整和预览,十分便捷。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-53-29.png" +width="562" +height="528" +loading="lazy" +class="gallery-image" +data-flex-grow="106" +data-flex-basis="255px" +></li> +<li><a class="link" href="https://github.com/GraphiteEditor/Graphite" target="_blank" rel="noopener" +>Graphite</a>,一个开源的 2D 矢量图形编辑器,适用于照片编辑、图像处理、图形设计、插图、数据可视化、数字绘画等领域。可以实现项目图稿,数据可视化和自动化。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-54-19.png" +width="830" +height="465" +loading="lazy" +class="gallery-image" +data-flex-grow="178" +data-flex-basis="428px" +></li> +</ul> +<h2 id="观点">观点</h2> +<h3 id="获取高品质信息的需求仍然强烈只是被淹没了">获取高品质信息的需求仍然强烈,只是被淹没了</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-54-40.png" +width="367" +height="372" +loading="lazy" +class="gallery-image" +data-flex-grow="98" +data-flex-basis="236px" +> +三十几年前,电视逐渐取代书籍、报纸等传统媒体的年代,尼尔波兹曼写下了《娱乐至死》。</p> +<p>作者认为:过度追求娱乐和娱乐化的信息传播方式可能导致公众思考能力的下降。</p> +<p>然而这么多年过去了,人们在降低信息质量这条路上越走越远。电视也早已沦为老年人卧床的伴侣,电视节目更是无法占据现代人的时间,取而代之的是手机短视频。</p> +<p>短视频已经成为大部分人闲暇消遣、信息获取的主要方式。这种媒体的变化将进一步降低理解和感受深度信息的能力,使人对深入学习和思考失去兴趣。</p> +<p>虽然获取的信息看似在增多,但现在高质量的信息却越来越少。</p> +<p>短视频等碎片化信息给我的感觉就像是无线电信号的背景噪音,现在的信息“电磁环境”早已被这种噪音充斥。因为“背景噪音”太大,就好像在高楼林立的城市里打开无线电,接收到的全是 LED 路灯和电动车充电器产生的噪波。</p> +<p>不过我还是相信会有包括我在内的相当一部分人,不愿放弃主动思考,不屑于接收低品质信息。</p> +<p>我正在努力做出一些尝试,以后逐渐记录下来:</p> +<ol> +<li>降低输入:减少刷碎片信息的时间;</li> +<li>滤波:使用搜索引擎、RSS服务、newsletter邮件等工具进行整理;</li> +<li>溯源:尽量选择信息源头获取一手信息,对于技术来说,直接阅读英文文档是一个办法;</li> +<li>创造:自己制作高质量内容;</li> +</ol> +<h3 id="摄影师不会被-ai-取代但是模特很可能会">摄影师不会被 AI 取代,但是模特很可能会</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-56-00.png" +width="664" +height="427" +loading="lazy" +class="gallery-image" +data-flex-grow="155" +data-flex-basis="373px" +> +即便以后 AI 绘画能够产出更加难以分辨真假的作品。</p> +<p>从目前能看到的各种生成作品来说,还是摄影师负责了主要的创作灵感。</p> +<p>真要说被取代的话,也许“被拍摄对象”经过虚拟化以后,很可能被取代。</p> +<p>以后不仅仅是举着相机的叫摄影师,说不定会诞生面向 AI 摄影这一职业。</p> +<p>到时候器材党玩的不再是镜头,改玩显卡了?</p> +<p>“嘿,你这 N 卡 比我这 A 卡有德味儿,毒!”</p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 043 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/Tue, 01 Aug 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/<h1 id="机器文摘-第-043-期">机器文摘 第 043 期</h1> +<h2 id="长文">长文</h2> +<h3 id="先做框架再做功能">先做框架再做功能</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-13-57-56.png" +width="690" +height="395" +loading="lazy" +class="gallery-image" +data-flex-grow="174" +data-flex-basis="419px" +> +<a class="link" href="https://devblogs.microsoft.com/oldnewthing/20230725-00/?p=108482" target="_blank" rel="noopener" +>Before you try to do something, make sure you can do nothing.</a></p> +<p>看到这句话第一反应是:这是什么 XX 逻辑?看完作者的文字之后,哦,这是一种软件构建的方法。</p> +<p>意思是说,先宏观再微观,先整体再局部,别一上来就陷入到细节代码的编写中去。</p> +<p>先把框架搭好,具体功能一个也别着急实现,留着占位,先搭一个“什么都不干”的架子,然后再逐渐补充功能。</p> +<p>但也不是真的什么都不干,而是理清了各个关键组件的调用关系以及与开发相关的辅助功能(如打印调试信息)。</p> +<p>这样做最大的好处是,随着功能开发的深入,代码不至于失控,而且具有良好的可调试性和组件问题隔离能力。</p> +<p>随之而来的就是轻松写代码,而不是眉毛胡子一把抓。</p> +<h3 id="神经网络从开始到现在">神经网络从开始到现在</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-13-58-59.png" +width="690" +height="513" +loading="lazy" +class="gallery-image" +data-flex-grow="134" +data-flex-basis="322px" +> +<a class="link" href="https://s3tlxskbq3.feishu.cn/docx/NyPqdCKraoXz9gxNVCfcIFdnnAc" target="_blank" rel="noopener" +>The Document is All You Need!</a></p> +<p>一篇 AI 科普好文章,用较为通俗的语言讲解了神经网络模型原理和发展历程(我感觉有些像生物的进化)。</p> +<p>从最初的由神经元组成的多层感知机开始,然后进化到卷积神经网络 CNN 降低网络复杂度,再进化, RNN 循环神经网络给模型增加记忆能力,记忆能力太强也不行,到了 LSTM 开始让它能够遗忘,再到后面的 注意力机制以及 LLM 语言模型。</p> +<p>比起同类文章,这一篇尽量避免了数学概念的推导和论证,尽量在不看公式的情况下解释基本思路,适合我等小白学习。</p> +<h3 id="代码审查的一些建议">代码审查的一些建议</h3> +<p><a class="link" href="https://codelantis.com/blog/code-reviews-best-practices" target="_blank" rel="noopener" +>5个关于代码审查的最佳实践</a>,文章记录一些了对代码审查的实践建议,嫌长不看我总结如下:</p> +<ol> +<li>一次只审查一个功能特性或者错误修复。</li> +<li>提前准备好背景交代(在审查之前写清楚这么做的原因和基本思路)。</li> +<li>利用自动化工具提前做好静态检查,提前统一风格、规范。</li> +<li>利用提问的方式提出改进建议而不是直接喷,如:“我们真的需要这个断言吗?”</li> +<li>仔细阅读代码,慢慢来,以充分理解。</li> +</ol> +<h2 id="资源">资源</h2> +<ul> +<li> +<p>微软的 <a class="link" href="https://learn.microsoft.com/en-us/sysinternals/downloads/zoomit" target="_blank" rel="noopener" +>ZoomIT</a> 真是个经典工具,已经默默维护了好多年了,现在版本为7.0。体积小巧才1MB多点儿,绿色免安装,下载解压即用。非常适合进行共享屏幕培训讲解,或者录制教学视频。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-13-59-57.png" +width="669" +height="465" +loading="lazy" +class="gallery-image" +data-flex-grow="143" +data-flex-basis="345px" +> +ZoomIT 快捷键如下: +Ctrl+1:放大屏幕,屏幕静止,然后使用鼠标批注; +Ctrl+2:使用鼠标随意绘制批注,支持 r、g、b、o 等快捷键切换颜色; +Ctrl+3:显示 BreakTime 倒计时; +Ctrl+4:放大屏幕,屏幕继续支持鼠标交互操作,用于放大操作过程; +Ctrl+5:录制屏幕,可与前面几个功能结合使用;</p> +</li> +<li> +<p><a class="link" href="https://github.com/kamranahmedse/driver.js" target="_blank" rel="noopener" +>driver.js</a> 一个压缩后只有 5K 大小的前端库,可以让你的网站或者 Webapp 迅速集成交互式“使用指南”的能力。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-14-00-27.png" +width="690" +height="361" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="458px" +></p> +</li> +<li> +<p><a class="link" href="https://clangjs.netlify.app" target="_blank" rel="noopener" +>clangjs</a> 一个在浏览器编译、链接、运行 C/C++ 代码的 JS 库。支持 C/C++ 标准库。完全在本地编译,无需网络即可工作。原理: +首先把 Clang 和 LLD 编译为 WebAssembly 使其运行在浏览器中。然后使用 WebAssembly 版本 Clang 把 C/C++ 代码编译为 WebAssembly,最后通过浏览器 API 运行 WebAssembly。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-14-00-43.png" +width="690" +height="292" +loading="lazy" +class="gallery-image" +data-flex-grow="236" +data-flex-basis="567px" +> +<a class="link" href="https://github.com/luoxuhai/clang.js" target="_blank" rel="noopener" +>附:clangjs源码</a></p> +</li> +<li> +<p><a class="link" href="https://github.com/bartobri/no-more-secrets" target="_blank" rel="noopener" +>nms</a>,一个控制台程序,可以将任意命令的输出(ANSI TXT)文本转换成为乱码以达到防偷窥和加密的效果。通过命令管道使用:<code>ls -l | nms</code> ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-14-00-57.png" +width="690" +height="236" +loading="lazy" +class="gallery-image" +data-flex-grow="292" +data-flex-basis="701px" +></p> +</li> +<li> +<p><a class="link" href="https://iconbuddy.app" target="_blank" rel="noopener" +>Icon Buddy</a>,这个网站有超过 1 百万个免费 svg 图标,可在线自定义颜色。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-14-01-15.png" +width="690" +height="420" +loading="lazy" +class="gallery-image" +data-flex-grow="164" +data-flex-basis="394px" +></p> +</li> +</ul> +<h2 id="观点">观点</h2> +<ul> +<li>无法眼神交流不是导致远程办公沟通的最大障碍,语音延迟才是: +<ul> +<li>我之前一直以为远程办公给沟通带来最大的最大障碍是无法眼神交流导致的信息失真,想象着可以通过升级摄像头(比如嵌入在屏幕中)来改善这一情况。</li> +<li>但进行无数次网络会议之后,我体会到了最大的障碍还不是无法眼神交流,而是网络通信带来的(几乎是必然的)严重的语音延迟。</li> +<li>人们对声音延迟的感知和容忍限度大约在10毫秒(现在的电脑声卡在使用 ASIO 驱动之后可以轻松做到本地延迟 8到6毫秒左右,所以可以用于实时录音),大于10毫秒的延迟会带来明显的迟钝感,时间再长一些就会对对话的节奏带来严重影响。(如果体会不到的话,可以回忆一下新闻直播间主持人跟现场记者连线时那种说话总是对不上节奏的尴尬。)</li> +<li>什么时候网络视频会议的延时能缩短到10毫秒以内(唱卡拉OK可以接受的最低延迟),远程办公才能迎来质的飞跃,否则网络视频会议对于工作讨论永远都是隔靴搔痒、效率低下。现在的解决方案普遍还在吹能做到一秒(1000毫秒)以内,任重而道远。 ​​​</li> +</ul> +</li> +<li>现在真正的程序员用什么编辑器 ? +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-14-01-47.png" +width="690" +height="645" +loading="lazy" +class="gallery-image" +data-flex-grow="106" +data-flex-basis="256px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 042 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/Tue, 25 Jul 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/<h1 id="机器文摘-第-042-期">机器文摘 第 042 期</h1> +<h2 id="长文">长文</h2> +<h3 id="从-cpu-到操作系统">从 CPU 到操作系统</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-57-14.png" +width="665" +height="261" +loading="lazy" +class="gallery-image" +data-flex-grow="254" +data-flex-basis="611px" +> +整天使用电脑和手机却对它的工作原理一知半解?<a class="link" href="https://cpu.land" target="_blank" rel="noopener" +>把你搁 CPU 里</a>是一套不错的科普文章,作者保证你无论是否了解 CPU 的运作方式,读完之后都会有所收获。我原本以为主要讲解 CPU 组成原理,在浏览了一遍之后,发现 CPU 只是引子,后面还讲了很多操作系统相关的知识,很值得一看。 ​​​</p> +<h3 id="基于-gpu-渲染的-ui-界面制作">基于 GPU 渲染的 UI 界面制作</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-57-33.png" +width="690" +height="412" +loading="lazy" +class="gallery-image" +data-flex-grow="167" +data-flex-basis="401px" +> +<a class="link" href="https://hasen.substack.com/p/gpu-gui-table-of-contents" target="_blank" rel="noopener" +>基于 GPU 渲染的 UI 界面制作</a>,也是一个系列文章,探讨了使用 GPU 渲染用户界面的一些思路和相关技术实现方法。用 GPU 绘制用户界面不是什么新鲜事,事实上现在大部分游戏的 UI 都是基于 GPU 渲染的,不过这个作者讲的比较深入浅出,对基础介绍的比较多,适合我这种业外人士,读起来通俗易懂。</p> +<h3 id="为什么我们更应该使用-display-port-而不是-hdmi-">为什么我们更应该使用 Display port 而不是 HDMI ?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-58-12.png" +width="790" +height="479" +loading="lazy" +class="gallery-image" +data-flex-grow="164" +data-flex-basis="395px" +> +<a class="link" href="https://hackaday.com/2023/07/11/displayport-a-better-video-interface/" target="_blank" rel="noopener" +>为什么我们更应该使用 Display port 而不是 HDMI?</a>,简单来说,HDMI 是家电行业制定的接口标准,封闭而保守,Display port 是 PC 行业制定的标准,开放又激进。现在的显卡上一般提供一个 HDMI 接口,仅仅是为了兼容而做出的妥协,不提供多个是因为 HDMI 授权收费。</p> +<h3 id="txt-纯文本才是王道">txt 纯文本才是王道</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-58-45.png" +width="690" +height="220" +loading="lazy" +class="gallery-image" +data-flex-grow="313" +data-flex-basis="752px" +> +喜欢老式合成器的操作方式,不用图形和触摸屏,而是用文本和字符进行交互,可以快速选择音色参数,指哪儿打哪儿,心中有数。</p> +<p>喜欢在控制台的黑窗口通过命令行跟计算机交互,而不是用鼠标在图形界面上点击,不用将鼻子凑在屏幕上,闭上眼睛也能做到精确操作。</p> +<p>喜欢单反相机的肩屏,无论我用什么姿势拨动拨杆、拨轮,肩屏总能用字符给我最快速最准确的响应,告诉我现在的曝光三参数是多少,做到心中有数。</p> +<p>喜欢用 Markdown 文本格式记录信息,只因为文本格式最干净纯粹,利于保存和传播。</p> +<p>这篇<a class="link" href="https://graydon2.dreamwidth.org/193447.html" target="_blank" rel="noopener" +>《txt纯文本才是王道》</a>的作者表达了跟我同样的喜好,对于使用纯文本保存信息偏爱有加,认为无论是视频、图片还是其他数字形式,在文字面前都是弱小的弟弟。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/FlagAlpha/Llama2-Chinese" target="_blank" rel="noopener" +>Llama2-Chinese</a>,Llama2中文社区!是一个专注于Llama2模型在中文方面的优化和上层建设的高级技术社区。 <em>基于大规模中文数据,从预训练开始对Llama2模型进行中文能力的持续迭代升级</em>。Facebook近期开源的 Llama 2 模型比较火,号称可以免费商用。我试了一下,效果不如预期,跟 ChatGPT 3.5 比起来还有距离。可能我使用的中文微调 Lora 参数还不够好吧。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-59-02.png" +width="690" +height="182" +loading="lazy" +class="gallery-image" +data-flex-grow="379" +data-flex-basis="909px" +></li> +<li><a class="link" href="https://githubunwrapped.com" target="_blank" rel="noopener" +>githubunwrapped</a>是一个帮你统计 Github 信息的网站,可以将输入的 Github 账号相关的统计信息生成一段漂亮的动画,展示你使用最多的编程语言、哪天提交的最积极、哪个时段工作效率高(根据文件修改时间?)等。比较有趣的是,这个网站生成动画视频的技术来自一个叫做 <a class="link" href="https://remotion.dev" target="_blank" rel="noopener" +>remotion</a>的库,它可以使用 React 组件式风格编写动画效果,并通过 Canvas 实现视频文件的渲染。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-59-18.png" +width="690" +height="455" +loading="lazy" +class="gallery-image" +data-flex-grow="151" +data-flex-basis="363px" +></li> +<li><a class="link" href="https://github.com/jesseduffield/lazydocker" target="_blank" rel="noopener" +>lazydocker</a>,继发现 lazygit 和 lazyvim 两个神器之后,我又发现了 lazy 家族新成员:lazydocker!同样是提供终端命令行下的“gui”界面,不过操作对象是 docker 这下管理容器终于可以不再看错乱的 docker 命令输出了。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-59-28.png" +width="690" +height="397" +loading="lazy" +class="gallery-image" +data-flex-grow="173" +data-flex-basis="417px" +></li> +</ul> +<h2 id="观点">观点</h2> +<ul> +<li> +<p>关于产品需求的来源:</p> +<p>对于提供IT相关服务的从业人员来说,无论是在企业还是个人做独立产品,把握好产品的需求、做好产品定义是最关键的事情,是后续做研发、运营的基础。</p> +<p>而好的产品定义=自己想做+自己能做+用户想用+愿意付费。</p> +<p>这样的定义应该怎样去发现?</p> +<p>拿软件举例,大部分软件能给用户提供的最大价值是“将一些事情自动化”和“将一些物理实体虚拟化”。前者能够通过自动化实现工作效率的指数级提升,后者则通过对物理现实虚拟化实现用户对交互体验的指数级提升。</p> +<p>所以在分析产品需求进行产品定义时可以从身边三个方面入手:</p> +<ol> +<li>还有什么事情可以被计算机自动化?</li> +<li>还有哪些物理实体可以被虚拟化?</li> +<li>市场上的现有产品,还有哪些可以从上面两个维度提升以增强体验的?</li> +</ol> +<p>我发现,无论是企业的产品,还是个人的独立产品,都可以从这些维度进行分析。</p> +</li> +<li> +<p>基于互联网通道的“业余无线电”:</p> +<p>不是很理解热衷于用互联网通道进行业余无线电通联的心态。</p> +<p>今天刚知道现在有一些业余无线电爱好者使用一种叫做 mmdvm 的盒子(热点盒子)进行自主搭建数字中继。</p> +<p>原理是“热点盒子”用家里的wifi接入互联网,然后热点盒子给业余无线电台提供UV频段的发射接收中继,这样就能轻易通联全国甚至全球的爱好者。</p> +<p>目前很多拥有支持数字通信的电台的爱好者都很积极地参与这种通联,甚至每周还有打卡点名活动。</p> +<p>我暂时还不是很理解这种心态。这种依赖互联网进行的通联在我看来(也许是暂时的)早已失去了玩无线电的初衷。如果我想要通过互联网假装进行呼叫,还得依靠家里的无线路由器,那我为什么不干脆使用微信电话?</p> +</li> +<li> +<p>无头系统: +今天才知道原来我给自己配的远程开发环境有个专业术语叫做 <a class="link" href="https://zh.wikipedia.org/zh-cn/%e6%97%a0%e5%a4%b4%e8%ae%a1%e7%ae%97%e6%9c%ba" target="_blank" rel="noopener" +>“Headless 无头系统”</a> 啊。我现在基本上可以做到带着笔记本随意移动,开发环境都在远程,在各处体验环境都一样。主要使用: Win10 + WSL2 + Nvidia-Docker + VS Code + Neovim。有时会启用远程桌面 RDP,有时直接 ssh + tmux。有兴趣的话我挑一期详解。</p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 041 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/Wed, 19 Jul 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/<h1 id="机器文摘-第-041-期">机器文摘 第 041 期</h1> +<h2 id="长文">长文</h2> +<h3 id="c-也能一次编译到处运行了">C 也能一次编译到处运行了?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-28-30.png" +width="743" +height="446" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="399px" +> +用 C 编写的程序,只编译一次,生成的可执行文件能同时在多个平台运行吗?</p> +<p>这在以往是 java 这类依赖虚拟机执行环境的语言宣称的事情。</p> +<p>然而我今天才听说还有这个神奇的库(好久没关注过c++领域的技术了):<a class="link" href="https://github.com/jart/cosmopolitan" target="_blank" rel="noopener" +>Cosmopolitan</a>Libc 号称可以使 C 成为一种构建一次就能到处运行的语言,就像Java一样,除了它不需要解释器或虚拟机。相反,它重新配置了GCC和Clang,以输出POSIX批准的多语言格式,该格式在Linux + Mac + Windows + FreeBSD + OpenBSD + NetBSD + BIOS上本地运行,具有最佳的性能和最小的占用空间。</p> +<p>在使用的时候需要引入特殊的库和编译配置,具体执行效果我还没有测试。</p> +<p>然后,<a class="link" href="https://ahgamut.github.io/2023/07/13/patching-gcc-cosmo/" target="_blank" rel="noopener" +>这篇文章</a>的作者干脆来个更方便的操作,他给 GCC 打了大约 2000 行的补丁,使得 GCC 直接就嵌入了 Cosmopolitan 库,现在可以在不修改任何源代码(前提是得用纯 C 写)的情况下构建出到处都能运行可执行文件了(Windows也可以吗?我要测试)。</p> +<h3 id="业余无线电入坑指南">业余无线电入坑指南</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-29-07.png" +width="690" +height="920" +loading="lazy" +class="gallery-image" +data-flex-grow="75" +data-flex-basis="180px" +> +业余无线电跟摄影、HiFi音响这一类的爱好在某种维度上非常相似,在“入坑”的境界上,甚至完全一样。</p> +<p>这里的坑,指需要投入大量精力和资金。</p> +<p>之所以这么说,是因为它们都有一个共同的特点。</p> +<p>即围绕这些爱好有大量的知识可以学习和探索。</p> +<p>比如拿业余无线电来说,上来就一堆“亚音”、“中继”、“频段”、“频差”、“杂散发射”等名词,对标摄影中的“构图”、“光圈”、“快门”、“ISO感光度”等名词。新手若想有所体会,单是这些概念就够琢磨几天的。更不用提后续还有逐渐步入玄学的一些操作流派,乃至一个不留神还会陷入无穷尽的装备升级竞赛。</p> +<p>这类知识对于好奇心强烈、喜欢求知的人来说有着巨大的吸引力。甚至直白的说,我们很可能不是爱好这项技能,而是单纯喜欢探索和求知的过程,喜欢那种获得感。</p> +<p>这篇<a class="link" href="https://zhuanlan.zhihu.com/p/585518350" target="_blank" rel="noopener" +>《业余无线电新手指南》</a>可以普及一些基本知识,愿意入坑的请阅读。</p> +<p><em>我近期已考取了中国无线电协会的业余无线电操作能力 A 证</em> 算是合法的 <a class="link" href="https://baike.baidu.com/item/%E6%97%A0%E7%BA%BF%E7%94%B5%E7%88%B1%E5%A5%BD%E8%80%85/6509242" target="_blank" rel="noopener" +>HAM 火腿</a>了。</p> +<h3 id="远程办公还能成为趋势吗">远程办公还能成为趋势吗?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-29-47.png" +width="799" +height="414" +loading="lazy" +class="gallery-image" +data-flex-grow="192" +data-flex-basis="463px" +> +疫情的时候,远程办公、异地协同等概念一度变得很火爆,当时很多人觉得这又是一个风口。</p> +<p>但随着当时极端环境的消失,各大公司又纷纷将员工从居家办公中召回。</p> +<p>那么?此类与远程协作相关的概念破灭了吗?</p> +<p>各种协同工具、平台相关的市场,还有没有继续扩大的可能,或者说还在等待一个巨大的技术革新来引爆?</p> +<p>这里有个项目,<a class="link" href="https://github.com/LinuxSuRen/remote-jobs-in-china" target="_blank" rel="noopener" +>积极收集远程办公相关的信息</a>,包括国内支持的公司清单、工具及使用资料等。</p> +<h3 id="怎样做出伟大的成就">怎样做出伟大的成就?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-30-40.png" +width="636" +height="422" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="361px" +> +昨日读了保罗格雷厄姆(《黑客与画家》的作者)新文章一篇&mdash;-<a class="link" href="http://paulgraham.com/greatwork.html" target="_blank" rel="noopener" +>《怎样做出伟大的成就》</a>(实际上我觉得可以译为“怎样牛逼”)。</p> +<p>虽然标题看起来略有鸡汤味儿,但读起来还是比较实惠的。</p> +<p>文章从发现和选择要做的事情开始,谈论了一些具体的方法。然后展开讨论了在方法执行过程中可能会遇到的一些问题,以及如何克服。甚至介绍了一些心理暗示技巧。</p> +<p>文章比较长,我个人体会比较深的点如下:</p> +<ol> +<li>一个人做什么才能牛逼?答:做自己天赋里有的东西,就是找一些你既有能力又非常感兴趣的事情。</li> +<li>要养成“自驱”的习惯。让“工作”来源于自己的认知,而不是别人告诉你、让你做的事情。主动,而不是等待。</li> +<li>拥有一个属于自己的“项目”是一个找到“自驱”的最佳方法。不断观察自己对什么有强烈的好奇心(甚至好奇到大多数人不能理解)可以找到这样的“项目”。</li> +<li>选定要做的“项目”还应遵循兴奋原则,即:做自己愿意用的产品,写自己想读的故事,而不是执着于满足想象中的不存在的复杂需求。</li> +<li>注重积累效应,日拱一卒、长期积累,每天写一篇文字,一年下来就是一本书。</li> +<li>周期性审视自己做的事情,确认它是否偏离了目标(在做自己最想做的事情),及时修正。</li> +<li>行动的重要性,很多人实际上可以更牛逼,但是因为“谦虚”和“恐惧”导致的拖延使得计划一再搁浅,浪费了时间。</li> +</ol> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="http://t.cn/A60wPLwI" target="_blank" rel="noopener" +>jabbr.ai</a>是一个针对拳击比赛的打击判定进行训练的AI模型,可以在智能手机上运行,实时监测视频中拳击选手的打击得分情况,即时进行统计,多个智能手机多视角同时运行可以快速生成总结性视频。模型提供约50种监测参数(质量、步法、压力等)可用于运动员训练分析。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-31-11.png" +width="908" +height="509" +loading="lazy" +class="gallery-image" +data-flex-grow="178" +data-flex-basis="428px" +></li> +<li>浏览器地址栏快捷操作,我今天才知道原来浏览器地址栏还有这些快捷操作(火狐浏览器支持的最多,我测试的Edge浏览器也支持部分操作): +<ol> +<li>输入*星号,可以搜索你的收藏夹;</li> +<li>输入^,可以搜索历史浏览记录;</li> +<li>输入%,可以搜索当前打开的tab页;</li> +<li>输入?,可以显示所有搜索建议; ​​​</li> +</ol> +</li> +<li><a class="link" href="https://video.weibo.com/show?fid=1034:4923133602234429" target="_blank" rel="noopener" +>树莓磁带</a> 一种用树莓派做的小硬件,为了支持在老式电脑中加载程序(之前用磁带存储的那种)。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-31-40.png" +width="607" +height="378" +loading="lazy" +class="gallery-image" +data-flex-grow="160" +data-flex-basis="385px" +></li> +<li>两招教你“永久”关闭 Windows 自动更新(任选一个都可以): +<ol> +<li>通过执行代码的方式:<code>reg add “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings” /v FlightSettingsMaxPauseDays /t reg_dword /d 10000 /f</code> Win+R 打开「运行」对话框,输入 <code>cmd</code> 后按下 <code>Ctrl+Shift+Enter</code>,在弹出来的命令行窗口中输入上面的代码,并敲击回车。命令里的 10000 代表停止更新的天数。</li> +<li>手动把电脑时钟日期改成 2050 年(为了防止时间自动校准,可以暂时断开网络),然后在 Windows 更新设置界面里面点击“延迟更新”,完成设置后再把电脑时间调回来就行了。</li> +</ol> +</li> +<li><a class="link" href="https://pkg-size.dev/" target="_blank" rel="noopener" +>pkg-size</a>,一个在线监测 npm 包大小的网站,可以实时查看一个 npm 包的真实依赖,网站利用了 web容器技术,直接在浏览器里执行 npm install 操作。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-32-07.png" +width="1011" +height="636" +loading="lazy" +class="gallery-image" +data-flex-grow="158" +data-flex-basis="381px" +></li> +<li><a class="link" href="https://marketplace.visualstudio.com/items?itemName=degreat.3e" target="_blank" rel="noopener" +>3e</a>,一个 VS Code 插件,可以让你在编辑器里直接浏览 3d 模型,基于 webgl 实现。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-32-58.png" +width="704" +height="468" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="361px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 039 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/Tue, 11 Jul 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/<h1 id="机器文摘-第-039-期">机器文摘 第 039 期</h1> +<h2 id="长文">长文</h2> +<ul> +<li> +<p><a class="link" href="https://www.cs.columbia.edu/~hgs/etc/writing-bugs.html" target="_blank" rel="noopener" +>关于写作的通用问题</a>,“元技能”一般指比普通技能更高阶的技能,我理解为可产生技能的技能,此类技能并不会随着外部环境的高速发展而被淘汰。比如写作就算是一种元技能,当不知道该训练和提升什么技能的时候,将时间花在“元技能”的提升上准没有错。这篇文章主要讲解英文写作的常见问题,但是有些我觉得对于中文也适用。比如文章开头提到的两个基本原则:“在写之前就弄清楚自己想表达什么”、“即便是你已经写完了一整篇,如果没能表达你的意思那也是废纸”。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-13-52-23.png" +width="294" +height="171" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="412px" +></p> +</li> +<li> +<p><a class="link" href="https://jmmv.dev/2023/06/fast-machines-slow-machines.html" target="_blank" rel="noopener" +>新电脑快还是老电脑快?</a>,上周有博主在twitter发布了一个视频吐槽了一个我也困惑很久的事情。作者展示了他在一台古董电脑上运行Windows NT 3.5 的情况,视频中的电脑基本可以做到秒开程序,然后又展示了一台配备了Windows 11的Surface平板电脑,操作起来界面响应有明显延迟。后者cpu频率为前者的4倍,内存容量为前者的6倍。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-13-55-53.png" +width="507" +height="228" +loading="lazy" +class="gallery-image" +data-flex-grow="222" +data-flex-basis="533px" +></p> +</li> +</ul> +<p>现在的硬件性能动辄就比之前的老硬件几十甚至上百倍的提升,但是我们的交互体验呢?能够秒开的程序甚至还不如二十年前的老爷机。 +后来这事儿在twitter引发了一些争议,有人认为现在的软件确实吃掉了硬件提升的性能,对体验来说提升不足。也有人说现在的体验与以往不可同日而语,这样的对比不公平也没有意义。</p> +<p>博主不得不专门写了一篇文章来回应,详细记录了作者认为更加合理的对比过程。</p> +<p>我个人认为首要原因就是随着硬件性能的提升,软件开发者的精力已经逐渐从性能向开发效率倾斜了。由于现在硬件成本确实低廉,软件迭代周期变得越来越短,软件开发者也越来越没有动力做出极致挖掘硬件性能的软件。</p> +<p>不信你看,现在越来越多的应用程序不再使用原生开发,而是采用了可以“跨平台”的web技术。</p> +<p>这样使得软件界面的响应直接下降了一个数量级。(我在使用vscode的时候甚至还会遇到打字卡顿慢慢弹出字符的情况。)</p> +<p>另外,复杂的设计模式和软件架构,也吃掉了不少硬件性能,因为每增加一层抽象,都会消耗资源,而现在各种复杂的架构就是拼命地增加抽象层。</p> +<p>希望以后市场能够鼓励开发者多做挖掘硬件性能的事情吧。</p> +<ul> +<li><a class="link" href="https://faultlore.com/blah/text-hates-you/" target="_blank" rel="noopener" +>文字渲染比你想象的要复杂</a>,这篇文章的作者曾负责火狐浏览器的文字渲染引擎,他写这篇文字的目的是科普一下关于文字渲染的一些基本技术和困难。在阅读之前,我也简单的以为,文字渲染就是把对应的字符字形从字体库中取出来然后绘制到相应的位置即可,但实际情况确实比这要复杂得多。比如,文中提到的关于“连字符”的处理、“抗锯齿”、“书写方向”等问题,每一个都是开发者的头发杀手。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-12-47.png" +width="574" +height="307" +loading="lazy" +class="gallery-image" +data-flex-grow="186" +data-flex-basis="448px" +></li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/rrweb-io/rrweb" target="_blank" rel="noopener" +>rrweb</a>,可在网页上记录用户行为并导出视频文件。可用于:排查用户错误、保险业务签署、内部风控、用户交互分析等。rrweb采用虚拟化转换DOM、记录变更和操作过程,并通过链表回放数据。存储最小化、回放可快进且跳过无效行为。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-13-31.png" +width="529" +height="378" +loading="lazy" +class="gallery-image" +data-flex-grow="139" +data-flex-basis="335px" +></li> +<li><a class="link" href="https://github.com/zhaoyun0071/DragGAN-Windows-GUI" target="_blank" rel="noopener" +>DragGAN-Windows-GUI</a>,DragGAN(上周介绍过的开源模型,可以针对图片进行交互式拖动修改)的懒人包,解压直接用,内置17个模型。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-13-53.png" +width="690" +height="421" +loading="lazy" +class="gallery-image" +data-flex-grow="163" +data-flex-basis="393px" +></li> +<li><a class="link" href="https://neal.fun/deep-sea/" target="_blank" rel="noopener" +>deep-sea</a>,这个网页可以让你查看海洋各个深度都是有哪些生物,果然是越往下越看不清,所以大家就随便长长了,不讲究好看不好看了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-14-11.png" +width="690" +height="501" +loading="lazy" +class="gallery-image" +data-flex-grow="137" +data-flex-basis="330px" +></li> +<li><a class="link" href="http://elementsofprogramming.com/" target="_blank" rel="noopener" +>电子书《Elements of Programming》</a>,这本老书在出版十年后推出了免费pdf版。中文译作《编程原本》,旨在介绍通用的程序设计原理和技巧,重点关注程序设计的基本元素和抽象概念。这本书的核心思想是将程序设计看作是一种构建和操作抽象概念的过程。它强调程序设计应该建立在数学原理和精确性基础上,通过抽象和泛化来创建可重用、可扩展和可维护的软件。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-14-52.png" +width="377" +height="542" +loading="lazy" +class="gallery-image" +data-flex-grow="69" +data-flex-basis="166px" +></li> +<li><a class="link" href="https://github.com/loft-sh/devpod" target="_blank" rel="noopener" +>devpod</a>,Github 的 Codespaces 和微软的 VSCode DevContainers 给开发者提供了即开即用的云端开发环境。现在,他们的开源平替来了,devpod 是一个开源的开发环境容器,可以方便地在任意客户端(Mac、Win、Linux)或云端主机创建体验一致的开发环境,并且可以与VSCode和Jetbrains等IDE直接集成。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-15-25.png" +width="690" +height="266" +loading="lazy" +class="gallery-image" +data-flex-grow="259" +data-flex-basis="622px" +></li> +<li><a class="link" href="https://uploads-ssl.webflow.com/5ac6b7f2924c656f2b13a88c/6435aabdc0a041194b243eef_Current%20Best%20Practices%20for%20Training%20LLMs%20from%20Scratch%20-%20Final.pdf" target="_blank" rel="noopener" +>从零开始训练大语言模型的最佳实践</a>,训练大语言模型的技术白皮书,从基本概念和技术讲起,教你训练大语言模型。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-15-45.png" +width="656" +height="849" +loading="lazy" +class="gallery-image" +data-flex-grow="77" +data-flex-basis="185px" +></li> +<li><a class="link" href="https://github.com/yardenshafir/WinDbg_Scripts/blob/master/windbg_the_fun_way.pdf" target="_blank" rel="noopener" +>windbg</a>,一本电子书,讲了很多 windbg 调试器的高级用法,市面上很少见。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-16-44.png" +width="620" +height="319" +loading="lazy" +class="gallery-image" +data-flex-grow="194" +data-flex-basis="466px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 040 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/Tue, 11 Jul 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/<h1 id="机器文摘-第-040-期">机器文摘 第 040 期</h1> +<h2 id="长文">长文</h2> +<h3 id="前端代码检查插件eslint和美化插件prettier的冲突">前端代码检查插件<code>ESLint</code>和美化插件<code>Prettier</code>的冲突</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-02-40.png" +width="1900" +height="1008" +loading="lazy" +class="gallery-image" +data-flex-grow="188" +data-flex-basis="452px" +> +在使用VSCode等现代化编辑器进行前端开发的时候,很多工程样板都默认开启了代码检查和自动格式化的功能,其中以 ESLint 插件和 Prettier 插件为主。</p> +<p>之前有一阵子我总是困惑这两个插件的区别,甚至如果配置不好的话,还会有冲突。</p> +<p>比如 Prettier 插件会在你保存源码的时候按照既定规则进行“美化”代码,如去除行尾分号、增加表达式中的空格等等。此时如果ESLint插件的规则配置不同的话,编辑器就会报错并提示要进行“修复”,然而就在你“修复”之后,刚<code>Ctrl+S</code>保存之后,又傻眼了,因为 Prettier 又对代码进行了“美化”。</p> +<p>我周末特意花时间研究了一下,梳理了一下这两个插件的关系以及他们的分工。</p> +<p>首先,他们的职责定位不同:ESLint 用于检查代码编写是否符合某种预定义的规范,可以进行十分详尽的配置和多项检查,比如定义的变量如果未使用可以作为一种警告或者错误,其职责定位以检查为主。而 Prettier 的职责侧重于格式化(美化)代码,对于编写代码的样式如 tab 缩进量、行尾要不要分号、字符串用单引号还是双引号等可以进行统一格式化,一般用于在代码保存的时候进行快速统一样式。</p> +<p>所以两者可以配合使用,但开头提到的规则冲突需要注意。</p> +<p>我个人的习惯是,将两个插件的配置文件里的配置项进行匹配(规则调整为一致),因为我在美化时关注的项并不太多,所以编写这两个配置文件不算费劲。</p> +<p>而网上有人提出了更好的办法,即通过扩展插件的方式,使得 ESLint 自动获取 Prettier 的规则,以自动统一两者的行为。</p> +<p><a class="link" href="https://rileycai.com/%e4%b8%8d%e4%bb%a5%e8%a7%84%e7%9f%a9%ef%bc%8c%e4%b8%8d%e8%83%bd%e6%88%90%e6%96%b9%e5%9c%86-%e5%bd%bb%e5%ba%95%e6%90%9e%e6%87%82-eslint-%e5%92%8c-prettier/" target="_blank" rel="noopener" +>关于 ESLint 和 Prettier 的具体分析文章和操作建议可以看这一篇文章:</a></p> +<h3 id="说一说我现在的知识管理工具和流程">说一说我现在的知识管理工具和流程</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-03-27.png" +width="302" +height="517" +loading="lazy" +class="gallery-image" +data-flex-grow="58" +data-flex-basis="140px" +> +Hacknews 上有网友说<a class="link" href="https://news.ycombinator.com/item?id=36609641" target="_blank" rel="noopener" +>Evernote几乎辞退了它的所有员工</a>,才想起来我已经有好几年没用过 Evernote 了。之前大概有将近十年的时间都在使用Evernote(但都是免费用户)。主要使用场景是记录个人的工作日志和借助浏览器插件剪藏一些值得收藏的文章。</p> +<p>后来随着 Evernote 的限制越来越多,体验逐渐下降。我就迁移到了使用纯文本作为知识记录载体的路线上了。</p> +<p>期间使用过 Emacs 的 org 模式,也尝试过 vim 的 wiki 插件,最后选择了现在这个 VSCode + GitHub 的方案,已稳定使用了两年时间。</p> +<p>具体流程如下: +1、使用 VSCode + <a class="link" href="https://foambubble.github.io/foam/" target="_blank" rel="noopener" +>foam</a> 、<a class="link" href="https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one" target="_blank" rel="noopener" +>MarkdownAllinOne</a> 等插件实现对 Markdown 的高效编辑,可以实时预览排版效果,foam实现了类似 <a class="link" href="https://obsidian.md/" target="_blank" rel="noopener" +>Obsidian</a> 的文章双向链接和知识关系图谱。我主要使用 Markdown 记录日志和编写知识卡片用于存放个人吸收的信息。 +2、所有内容存放在一个 git 仓库中,同步到 GitHub 上的个人私有仓库,这样可以省去对接网盘的麻烦。 +3、对于互联网上阅读到的有用文章,使用浏览器插件 <a class="link" href="https://microsoftedge.microsoft.com/addons/detail/web-clipper/opejamnnohhbjflpbhnmdlknhjkfhfdp" target="_blank" rel="noopener" +>Web Clipper</a>,可以完整的抓取页面内容到指定的后端存储,这个插件我最喜欢的点是它可以将文章抓取到你指定的GitHub仓库,并作为Issue提交。 +4、来不及看的信息就先抓取到 Issue ,然后等有时间进行整理,形成自己的知识卡片后再关闭该 Issue 。</p> +<p>这套工具及流程的优点: +1、完全免费,不产生任何费用,而且体验不亚于收费软件。 +2、自由度高,存储后端可以自己随意选择,如果嫌 GitHub 麻烦的话,可以自己用网盘同步文件夹。 +3、纯文本载体,这个算是优点吧,格式开放,不会存在别的编辑器打不开的情况。 +4、数据私有,数据随时都在本地(云端的仅作为备份和同步中转),不用担心 SaaS 供应商跑路(你看现在的Evernote)。</p> +<p>欢迎大家讨论。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/TransparentLC/WechatMomentScreenshot" target="_blank" rel="noopener" +>朋友圈截图生成工具</a>,可以帮你生成逼真的朋友圈截图,可定制头像、评论、点赞个数等细节。收藏<a class="link" href="https://akarin.dev/WechatMomentScreenshot/" target="_blank" rel="noopener" +>这个地址</a>,以后再也不怕被群里晒孩子的家长或者搞活动的商家逼着发朋友圈集赞了。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-04-12.png" +width="690" +height="1227" +loading="lazy" +class="gallery-image" +data-flex-grow="56" +data-flex-basis="134px" +></li> +<li><a class="link" href="https://86box.net/" target="_blank" rel="noopener" +>86box</a>,老式 x86 架构计算机模拟器,与 Virtualbox 等虚拟化技术不同的是,86box采用纯软件模拟的方式,实现了经典老式 cpu (如 AMD Am486DX4)的各种技术细节,甚至是当时的硬件缺陷(有些老游戏的 hack 需要这些缺陷)。可以完美复现一台上世纪 90 年代的经典 DOS PC ,用来复古怀旧游戏是再合适不过了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-04-26.png" +width="553" +height="371" +loading="lazy" +class="gallery-image" +data-flex-grow="149" +data-flex-basis="357px" +></li> +<li><a class="link" href="https://github.com/ztxz16/fastllm" target="_blank" rel="noopener" +>fastllm</a>,fastllm是纯c++实现,无第三方依赖的高性能大模型推理库(待测试验证)。据宣称:6~7B级模型在安卓端上也可以流畅运行,支持python调用,chatglm-6B级模型单卡可达10000+token / s,支持glm, llmam, moss基座,手机端流畅运行。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-05-17.png" +width="875" +height="356" +loading="lazy" +class="gallery-image" +data-flex-grow="245" +data-flex-basis="589px" +></li> +<li><a class="link" href="https://photoai.com" target="_blank" rel="noopener" +>PhotoAI</a>,作者说,他为这个网站大概写了14000行PHP代码,样式全写在了<code>&lt;style&gt;</code>标签里,JS全写在<code>&lt;script&gt;</code>标签里,除了<code>jQuery</code>没用任何框架,就连布局也是使用<code>float:left</code>这种老式的浮动实现。然而这个网站确能给他带来每月差不多 <em>6万刀</em> 的收入。这是不是在吹牛。这个网站的业务是:使用AI生成完全没有任何版权问题的各种人像照片。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-05-41.png" +width="690" +height="617" +loading="lazy" +class="gallery-image" +data-flex-grow="111" +data-flex-basis="268px" +></li> +<li><a class="link" href="https://makepad.nl/makepad/examples/ironfish/src/index.html" target="_blank" rel="noopener" +>Ironfish synth</a>,用rust写的在线合成器,虽然感觉像个 Demo 但完成度很高,音源部分具有两个振荡器(可选正弦波、方波、锯齿波等)和一个噪波通道,滤波器、效果器齐全,另外还有一个可视化音序器。可基于键盘直接演奏。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-05-59.png" +width="690" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="204" +data-flex-basis="491px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 038 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/Tue, 27 Jun 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/<h1 id="机器文摘-第-038-期">机器文摘 第 038 期</h1> +<h2 id="研究">研究</h2> +<ul> +<li><a class="link" href="https://www.polygon.com/23690187/discord-ai-chatbot-clyde-grandma-exploit-chatgpt" target="_blank" rel="noopener" +>ChatGPT的“奶奶漏洞”</a>,奶奶漏洞来源自一个用户说他已经过世的奶奶是凝固汽油弹工厂的工程师,用户让 ChatGPT 用他奶奶说睡前故事的形式,详细介绍了凝固汽油弹的制作方法。以此来绕过 ChatGPT 的安全审查,结果当然是,他得逞了。后来还有网友做了试验,以同样的方式可以套取 Windows 各个版本的序列号。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-53-23.png" +width="720" +height="489" +loading="lazy" +class="gallery-image" +data-flex-grow="147" +data-flex-basis="353px" +></li> +<li>国外也有“垃圾佬”,这篇<a class="link" href="https://l4rz.net/running-nvidia-sxm-gpus-in-consumer-pcs/" target="_blank" rel="noopener" +>《怎样低成本搭建深度学习电脑》</a>的文章,介绍了作者怎样通过在二手网站上“捡垃圾”搭建出了性能良好且便宜的GPU工作站。 值得一提的是,作者购买的主要渠道竟然来自国内的著名二手物品交易平台,某鱼。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-54-05.png" +width="690" +height="459" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="360px" +></li> +</ul> +<h2 id="长文">长文</h2> +<ul> +<li> +<p>回顾这些年软件研发的历程,凡是能够做成的软件,无一例外都是抓住了真正存在的需求。这样的需求未必很宏大或者华丽,但一定不是想象种的伪需求。仔细分析之后就会发现,在一个软件产品的生命周期里,开发者所面临的真正(或者说正确的)需求很少,因为找到它们十分不易,它们周边布满了被人们主观意识强加上的伪需求。<a class="link" href="https://cerebralab.com/Imaginary_Problems_Are_the_Root_of_Bad_Software" target="_blank" rel="noopener" +>《伪需求是糟糕软件的根源》</a>,文章探讨了软件开发中存在的一个问题,即虚构的问题(我将之译为:伪需求)如何导致糟糕的软件结果。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-56-35.png" +width="353" +height="179" +loading="lazy" +class="gallery-image" +data-flex-grow="197" +data-flex-basis="473px" +></p> +</li> +<li> +<p>有没有考虑过一个问题,即:为什么随着科技的发展和生产力的提升,人们不是越来越清闲,反而越来越劳累了?这里有篇文章探讨了一些深层次的原因,<a class="link" href="https://theanarchistlibrary.org/library/david-graeber-bullshit-jobs" target="_blank" rel="noopener" +>《狗屁工作》</a>,此文写于 2013 年,作者是 David Graeber (一名人类学教授)。文章讨论了现代社会中存在的一种现象,即许多人在工作中感到他们所从事的工作毫无意义,没有真正的价值和目的。这些工作被称为&quot;狗屁工作&quot;,作者试图探究狗屁工作的存在原因和对个体和社会的影响。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-56-57.png" +width="602" +height="854" +loading="lazy" +class="gallery-image" +data-flex-grow="70" +data-flex-basis="169px" +></p> +</li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/laishulu/Sarasa-Term-SC-Nerd" target="_blank" rel="noopener" +>Sarasa Term SC Nerd</a>,写中文Markdown文件的时候,最怕遇到表格,因为编辑器按照一个中文字符的宽度等于两个英文字符的宽度进行计算,而很多字体在设计时未考虑严格按照这种2:1的宽度比例设计字形,导致在Markdown在编辑状态时的表格分割线错位,看起来十分头疼。经过多方对比,我终于找到了让自己满意的等宽字体,支持中英文字符2:1宽度比例,中文为黑体,英文字符也特别适合写代码。此外还整合了Nerd fonts,支持在终端显示各种漂亮图标。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-58-24.png" +width="690" +height="187" +loading="lazy" +class="gallery-image" +data-flex-grow="368" +data-flex-basis="885px" +></li> +<li><a class="link" href="https://reviewgpt.net" target="_blank" rel="noopener" +>ReviewGPT</a> 写作文、写报告、写邮件,生活中充满了各种写作任务。ReviewGPT 基于 gpt 模型,可为你的文章进行打分、评价,提出修改意见,甚至还可以扮演莎士比亚、金庸等知名作家,帮助你重新撰写,快速提升文章质量。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-58-38.png" +width="690" +height="394" +loading="lazy" +class="gallery-image" +data-flex-grow="175" +data-flex-basis="420px" +></li> +<li><a class="link" href="https://github.com/binpash/try" target="_blank" rel="noopener" +>try</a>,刚发布的一个命令行工具,目标是允许你执行命令的时候先检查其执行的后果,然后再决定是否让命令真正生效。真正起到了安全保护的效果。官方介绍这个命令是基于 Linux 的命名空间(通过 unshare )和 overlayfs 联合文件系统等技术实现。并特别提醒并非基于沙盒,所以还是谨慎执行危险操作吧。比如<code>try rm rf /*</code>。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-59-26.png" +width="831" +height="467" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="427px" +></li> +<li><a class="link" href="https://github.com/XingangPan/DragGAN" target="_blank" rel="noopener" +>DragGAN</a>, 通过拖动就可以完全操纵图像的 AI 模型,现已开放源码! DragGAN 是由谷歌、麻省理工学院和马克斯普朗克研究所创建的一种新的人工智能模型。可以让你轻松通过点击拖动等简单的交互操作就能改变拍摄对象的姿势、形状和表情。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-16-00-25.png" +width="598" +height="399" +loading="lazy" +class="gallery-image" +data-flex-grow="149" +data-flex-basis="359px" +></li> +<li><a class="link" href="https://flameshot.org/" target="_blank" rel="noopener" +>flameshot</a>,一个超强的免费截图软件,可以像任何一个截图工具一样截图,最重要的是还有一些附加功能,按一下数字图标,就可以在屏幕上按数字顺序自动生成步骤图示,非常适合生成操作步骤说明。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-16-01-00.png" +width="580" +height="374" +loading="lazy" +class="gallery-image" +data-flex-grow="155" +data-flex-basis="372px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 037 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/Tue, 20 Jun 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/<h1 id="机器文摘-第-037-期">机器文摘 第 037 期</h1> +<h2 id="研究">研究</h2> +<ul> +<li><a class="link" href="https://snap-research.github.io/SnapFusion/" target="_blank" rel="noopener" +>SnapFusion</a> 文本到图像的扩散模型可以从自然语言描述中创建令人惊叹的图像。然而,这些模型很大,需要高端 GPU 在服务端运行模型。SnapFusion提出了一种通用方法,可以在移动设备上运行的文本到图像扩散模型,且出图时间不到2秒。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-55-06.png" +width="609" +height="899" +loading="lazy" +class="gallery-image" +data-flex-grow="67" +data-flex-basis="162px" +></li> +<li><a class="link" href="https://framer.com/ai" target="_blank" rel="noopener" +>Framer</a> 发布了 AI 工具,直接根据文字需求生成页面,我试了一下,对于个人博客、产品介绍页面等静态展示类型的页面,生成的效果还是十分理想的,而且同步提供桌面端和移动端页面。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-55-33.png" +width="599" +height="710" +loading="lazy" +class="gallery-image" +data-flex-grow="84" +data-flex-basis="202px" +></li> +<li><a class="link" href="https://notes.dt.in.th/HDRQRCode" target="_blank" rel="noopener" +>比<code>#ffffff</code>还“白”的“超级白”</a>,这里有网友介绍了一个方法,可以显示更高对比度的二维码(以方便用户扫描识别),据说白的程度超出了sRGB颜色范围,前提是你的显示设备支持HDR。作者的思路是用一段HDR视频在网页中伪装成显示二维码的图片。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-56-11.png" +width="690" +height="305" +loading="lazy" +class="gallery-image" +data-flex-grow="226" +data-flex-basis="542px" +></li> +<li><a class="link" href="https://rwmj.wordpress.com/2023/06/14/i-booted-linux-292612-times/" target="_blank" rel="noopener" +>我在21小时内重启系统29万次</a>,Linux 6.4内核有一个bug可能导致启动时挂起,但概率很低。为了复现bug,Richard WM Jones重启了29万次电脑,最终找到了问题。这让我想起了之前修改不容易复现Bug的艰辛。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-56-28.png" +width="690" +height="735" +loading="lazy" +class="gallery-image" +data-flex-grow="93" +data-flex-basis="225px" +></li> +<li>我发现一个用chatGPT翻译整段文字的小技巧,那就是在他翻译完成之后,再将这段话发给他,让他根据通顺程度和合理性进行二次润色,出来的结果就好很多了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-58-53.png" +width="717" +height="648" +loading="lazy" +class="gallery-image" +data-flex-grow="110" +data-flex-basis="265px" +></li> +<li>Python写代码很爽,但是想打包发布成果的时候就稍微麻烦一些了,毕竟一大堆环境依赖和包依赖。我之前一直用的是PyInstaller作为打包工具,但是现在我又发现了这个<a class="link" href="https://github.com/Nuitka/Nuitka" target="_blank" rel="noopener" +>Nuitka</a>。它的打包原理是:直接把 Python 代码转成 C 代码再编译,这样打包出来的成果占用小、执行效率也高,尤其适合PyQt编写的桌面程序。另外,著名的 Blender 就是用 Nuitka 编译的。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-59-12.png" +width="428" +height="272" +loading="lazy" +class="gallery-image" +data-flex-grow="157" +data-flex-basis="377px" +></li> +</ul> +<h2 id="长文">长文</h2> +<ul> +<li><a class="link" href="https://www.raptitude.com/2022/01/everything-must-be-paid-for-twice/" target="_blank" rel="noopener" +>你买的每样东西都需要支付两次成本</a>,这篇在Hacker News上的文章引起我的强烈共鸣。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-59-33.png" +width="600" +height="400" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="360px" +></li> +</ul> +<p>它提出了一个有趣的观点,我以前从未意识到:</p> +<p>每样东西都需要支付两次成本。</p> +<p>通常,我们只关注第一次支付的成本,也就是购买时花的钱,比如买一台相机、一架钢琴或一本小说。</p> +<p>然而,作者指出,如果你不支付第二次的成本,你之前花的钱就等于打水漂了。</p> +<p>第二次成本指的是,你需要花时间和精力去充分使用你所购买的物品。</p> +<p>比如认真阅读一本书,练习钢琴以提高演奏水平等等。</p> +<p>然而,我们常常只停留在第一次购买时的满足感上,然后追求下一个。</p> +<p>随着时间的推移,大量未支付第二次成本的物品使我们积累了一种无形的债务。</p> +<p>为此经常感到挫败。</p> +<p>这种挫败感促使我们寻求那些能够刺激我们的短期享受,比如玩手机、享用美食。</p> +<p>进一步导致没有时间支付第二次成本。</p> +<p>那么,有什么办法可以改变这种情况吗?</p> +<p>作者说,唯一的解决办法就是控制购买欲望,强迫自己安排时间来履行第二次支付的责任。</p> +<p>尽管这听起来可能有些不舒服,但如果我们能克服这种不舒服的临界点,例如学会一首乐曲,耐心读完一本书,我们将会获得意想不到的奖励时刻。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://www.ratatype.com" target="_blank" rel="noopener" +>ratatype</a>,在线键盘盲打指法练习,有完整的练习教程,从初级到高级都有。有点儿像Dos时代的著名打字练习软件TT,不过是网页版的。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-16-00-11.png" +width="690" +height="360" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="460px" +></li> +<li><a class="link" href="https://play0ad.com/download" target="_blank" rel="noopener" +>0A.D.</a>,帝国时代是个经典游戏,这里有个开源版,名字叫做0AD,由Wildfire Games开发,虽然是免费开源的游戏,但是效果和可玩性都非常高,适合在周末的午后来一把怀旧局。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-16-00-26.png" +width="690" +height="405" +loading="lazy" +class="gallery-image" +data-flex-grow="170" +data-flex-basis="408px" +></li> +<li><a class="link" href="https://landing.love" target="_blank" rel="noopener" +>landing.love</a>,一个专门收集各种网页动画效果的网站,目前已收录超过400个具有新颖创意动效的网站,并配有截图和录屏视频。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-16-00-47.png" +width="590" +height="486" +loading="lazy" +class="gallery-image" +data-flex-grow="121" +data-flex-basis="291px" +></li> +<li><a class="link" href="https://github.com/princeton-vl/infinigen" target="_blank" rel="noopener" +>infinigen</a>,一款面向计算机视觉研究的3D场景自动生成器,提供多样且高质量的3D训练数据。基于Blender,免费且开源。可以通过重写随机化的默认参数来完全控制资产生成。提供了对自然界中多种对象和场景的生成器,包括植物、动物、地形以及火、云、雨、雪等自然现象。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-16-01-41.png" +width="951" +height="522" +loading="lazy" +class="gallery-image" +data-flex-grow="182" +data-flex-basis="437px" +></li> +<li><a class="link" href="https://yjdoc2.github.io/8086-emulator-web/compile" target="_blank" rel="noopener" +>8086-emulator-web</a> ,用js编写的的8086 cpu模拟器,支持汇编语言在线编写、编译和调试运行,是一个学习汇编语言和理解计算机原理的好工具。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-16-01-04.png" +width="690" +height="320" +loading="lazy" +class="gallery-image" +data-flex-grow="215" +data-flex-basis="517px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 036 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/Wed, 14 Jun 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/<h1 id="机器文摘-第-036-期">机器文摘 第 036 期</h1> +<h2 id="研究">研究</h2> +<ul> +<li><a class="link" href="https://video.weibo.com/show?fid=1034:4911535232057363" target="_blank" rel="noopener" +>软驱阵列演奏音乐</a>,国外大神用512个软驱、16个硬盘、4个扫描仪,组装成阵列,通过编程的方式控制电机震动发出声音,组成各声部。这么多软驱,让我想到了退休老干部合唱团。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-49-03.png" +width="1555" +height="926" +loading="lazy" +class="gallery-image" +data-flex-grow="167" +data-flex-basis="403px" +></li> +<li><a class="link" href="https://video.weibo.com/show?fid=1034:4564677670141974" target="_blank" rel="noopener" +>大脑能像身体那样锻炼吗?</a>,如何训练大脑?提高记忆力、注意力和智力!这个视频进行了讲解,总之就是,用进废退,改变日常默认行动,让大脑动起来。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-49-59.png" +width="743" +height="450" +loading="lazy" +class="gallery-image" +data-flex-grow="165" +data-flex-basis="396px" +></li> +<li><a class="link" href="https://gaultier.github.io/blog/x11_x64.html" target="_blank" rel="noopener" +>用纯汇编写一个GUI</a>,跟随这篇教学文章,通过编写图形界面的方式来学习汇编语言吧。顺便,作者想挑战一下,最小的GUI程序其可执行二进制文件能有多小。(现在的可执行文件动不动就好几十上百MB)​。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-50-39.png" +width="1046" +height="463" +loading="lazy" +class="gallery-image" +data-flex-grow="225" +data-flex-basis="542px" +></li> +<li><a class="link" href="https://blog.betacat.io/post/2023/06/summarize-hacker-news-by-chatgpt" target="_blank" rel="noopener" +>让 ChatGPT 帮我们总结 Hacker News</a>,让AI每天帮我总结新闻摘要,这个想法我已经考虑很久了,现在已经有人做了实现。这篇文章介绍了一个开源静态网站的实现,它利用 ChatGPT 的总结能力,直接将每条Hackernews的新闻用一两句话总结出来,然后发布到GithubPages 可以节约我们每天看新闻的时间。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-51-29.png" +width="891" +height="413" +loading="lazy" +class="gallery-image" +data-flex-grow="215" +data-flex-basis="517px" +></li> +<li><a class="link" href="https://www.web3brand.io/p/maximize-unregretted-user-time" target="_blank" rel="noopener" +>马斯克专访:推特的混乱过去了,现在的目标是最大化用户无悔时间!</a>,我不喜欢看八卦,但是科技的除外。马斯克收购 Twitter 几个月过去了,大家还在等着看笑话,但是为什么没等到,以及开掉一半人之后效率却提升那么多? +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-52-02.png" +width="680" +height="417" +loading="lazy" +class="gallery-image" +data-flex-grow="163" +data-flex-basis="391px" +></li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/AI4Finance-Foundation/FinGPT" target="_blank" rel="noopener" +>FinGPT</a>,一个面向金融领域的开源语言模型,采用以数据为中心的方法,为研究人员和实践者提供易于使用的资源,致力于做金融领域的chatGPT。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-52-48.png" +width="822" +height="462" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="427px" +></li> +<li><a class="link" href="https://github.com/facebookresearch/audiocraft" target="_blank" rel="noopener" +>Audiocraft</a>,facebook发布的一个PyTorch库,用于音频生成的深度学习研究。目前,它提供了用于从文本生成音乐的MusicGen代码和模型。模型使用2万小时正版授权音乐训练。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-53-34.png" +width="816" +height="350" +loading="lazy" +class="gallery-image" +data-flex-grow="233" +data-flex-basis="559px" +></li> +<li><a class="link" href="https://github.com/mljar/mercury" target="_blank" rel="noopener" +>Mercury</a>,在 Jupyter Notebook 中构建 Web 应用程序,允许您在Python笔记本中添加交互式小部件,然后将笔记本发布为带交互界面的Web应用程序。我的感受是,Mercury就是 notebook版的<a class="link" href="https://github.com/gradio-app/gradio" target="_blank" rel="noopener" +>gradio</a> ​​​。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-53-58.png" +width="805" +height="421" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="458px" +></li> +<li><a class="link" href="https://github.com/reactive-python/reactpy" target="_blank" rel="noopener" +>ReactPy</a>,React是最流行的用于构建UI的前端框架,现在所有Python开发人员都可以使用它。比起gradio,这个reactpy的抽象层级更低一些,自由度更高了,我猜测目标用户应该是不喜欢写前端代码但是又希望掌控页面细节的python程序员。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-56-24.png" +width="632" +height="148" +loading="lazy" +class="gallery-image" +data-flex-grow="427" +data-flex-basis="1024px" +></li> +<li><a class="link" href="http://ggml.ai/" target="_blank" rel="noopener" +>GGML</a>,一个用于机器学习的张量库,采用纯C++实现,无其他依赖项。旨在在普通硬件上实现大型模型和高性能。它同时也是 llama.cpp 和 whisper.cpp 的底层库。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-57-18.png" +width="629" +height="327" +loading="lazy" +class="gallery-image" +data-flex-grow="192" +data-flex-basis="461px" +></li> +<li><a class="link" href="https://github.com/Genymobile/scrcpy" target="_blank" rel="noopener" +>Scrcpy</a>,一个让人相见恨晚的app,可以通过USB或TCP/IP连接镜像Android设备的视频和音频,并允许使用计算机的键盘和鼠标来控制设备。它不需要任何root权限,并且兼容Linux、Windows和macOS操作系统。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-17-02-19.png" +width="408" +height="589" +loading="lazy" +class="gallery-image" +data-flex-grow="69" +data-flex-basis="166px" +></li> +<li><a class="link" href="https://maketafi.com/ai" target="_blank" rel="noopener" +>Tafi</a>,通过自然语言生成3D模型,质量号称接近AAA级游戏,可以导出创建的角色到Blender、Unreal 或 Unity中。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-17-02-52.png" +width="1080" +height="608" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></li> +<li><a class="link" href="https://github.com/Hufe921/canvas-editor" target="_blank" rel="noopener" +>canvas-editor</a>,一个基于 canvas/svg 实现的富文本编辑器,在市面上,使用 Canvas 实现整个编辑器的开源项目并不常见,大多数情况下仍然使用 DOM 来实现。使用 Canvas 的最显著特点是其出色的性能,但实现起来的成本也更高。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-17-15-39.png" +width="1200" +height="668" +loading="lazy" +class="gallery-image" +data-flex-grow="179" +data-flex-basis="431px" +></li> +<li><a class="link" href="https://markmap.js.org%e2%80%8b%e2%80%8b" target="_blank" rel="noopener" +>markmap.js</a>,一个用markdown文本制作思维导图的工具,提供了vscode的插件可直接在编辑器预览。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-17-16-02.png" +width="611" +height="458" +loading="lazy" +class="gallery-image" +data-flex-grow="133" +data-flex-basis="320px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 035 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/Wed, 07 Jun 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/<h1 id="机器文摘-第-035-期">机器文摘 第 035 期</h1> +<h2 id="研究">研究</h2> +<ul> +<li><a class="link" href="https://www.reproof.app/blog/notes-apps-help-us-forget" target="_blank" rel="noopener" +>笔记帮我们记住还是忘记?</a>这篇文章讨论了笔记对帮助我们遗忘的作用。作者认为,随着时间的推移,我们无法记住所有的事情,但是只要我们记录了重要的信息,就可以在需要时再次查找,因此笔记实际上帮助我们遗忘。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-09-37.png" +width="1173" +height="488" +loading="lazy" +class="gallery-image" +data-flex-grow="240" +data-flex-basis="576px" +></li> +<li><a class="link" href="https://research.nvidia.com/labs/dir/neuralangelo/" target="_blank" rel="noopener" +>高保真神经表面重建</a>,Nvidia 新发布的这个 Neuralangelo 有些猛,随便给一个视频就能进行精细3D建模,也许要不多久激光点云技术就要淘汰了。值得关注 ! +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-12-49.png" +width="936" +height="465" +loading="lazy" +class="gallery-image" +data-flex-grow="201" +data-flex-basis="483px" +></li> +<li><a class="link" href="https://github.com/Neo-Desktop/WindowsXPKg" target="_blank" rel="noopener" +>Windows XP 激活算法被破解</a>, XPKeygen是一个可以随意生成XP有效安装密钥的程序,当前的电脑可能用不到了。不过可能还有一些老旧的设备,只能通过 Windows XP 来操作,这时候这个东西就派上用场了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-17-33.png" +width="610" +height="285" +loading="lazy" +class="gallery-image" +data-flex-grow="214" +data-flex-basis="513px" +></li> +<li><a class="link" href="https://www.v2ex.com/t/944717" target="_blank" rel="noopener" +>一个整活儿的开源编辑器</a>,data:text/html;base64,PGh0bWwgY29udGVudGVkaXRhYmxlPmVkaXQgbWU8L2h0bWw+ 把这个代码粘到浏览器地址栏,竟然是个记事本app,如果从IDE拷贝代码过去,竟然还支持代码高亮。。。。加入到收藏夹即可食用。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-20-19.png" +width="663" +height="347" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="458px" +></li> +<li><a class="link" href="https://mymodernmet.com/sea-turtle-birch-aquarium-3d-printed-brace" target="_blank" rel="noopener" +>3D打印拯救海龟</a> ,2017年,伯奇水族馆与加州大学圣地亚哥分校图书馆的数字媒体实验室合作。他们一起创造了一种首创的3D打印支架,以固定她的外壳上的缝隙。现在,六年后,这种生物及其照顾者继续从这项发明中获益。这只海龟最近接受了年度检查,健康状况良好。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-21-40.png" +width="613" +height="372" +loading="lazy" +class="gallery-image" +data-flex-grow="164" +data-flex-basis="395px" +></li> +<li><a class="link" href="https://kuenzi.dev/toothbrush/" target="_blank" rel="noopener" +>破解“智能”牙刷</a> 国外一个博主记录了他破解自己的电动牙刷的过程。由于牙刷的NFC芯片采用的加密方式是密码加密,并且在通讯过程中是用了明文传递,所以他采取了截获通讯信号的方式窃听到了密码,然后就解锁了各种姿势开始为所欲为了。。。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-22-42.png" +width="606" +height="363" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="400px" +></li> +<li><a class="link" href="https://bjoernkarmann.dk/project/paragraphica" target="_blank" rel="noopener" +>真·AI相机</a> ,paragraphica 是一个没有镜头但是却有物理实体的“AI相机”,使用位置、时间等参数数据生成特定地点和时刻的prompt,然后由人工智能来生成“照片”。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-24-07.png" +width="578" +height="513" +loading="lazy" +class="gallery-image" +data-flex-grow="112" +data-flex-basis="270px" +></li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://www.dora.run/ai" target="_blank" rel="noopener" +>Droa</a>,一个通过自然语言进行网站开发的工具,你只需要提需求,剩下的交给AI。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-26-05.png" +width="821" +height="496" +loading="lazy" +class="gallery-image" +data-flex-grow="165" +data-flex-basis="397px" +></li> +<li><a class="link" href="https://github.com/SupaGruen/StableDiffusion-CheatSheet" target="_blank" rel="noopener" +>StableDiffusion-CheatSheet</a>,经常用 Stable Diffusion 进行 AI 绘图的,可以看下这个开源速查表。里面拥有超过 700 种经过测试的艺术风格,可快速搜索查找各类艺术家,并支持一键复制 Prompt。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-26-50.png" +width="742" +height="521" +loading="lazy" +class="gallery-image" +data-flex-grow="142" +data-flex-basis="341px" +></li> +<li><a class="link" href="https://www.math.cmu.edu/~jmackey/151_128/bws_book.pdf" target="_blank" rel="noopener" +>你一直想知道的关于数学的一切</a>,此书是CMU数学科学系的博士生布兰登·W·沙利文撰写的,旨在引导读者进入抽象数学和证明写作的世界,帮助培养读者的数学思维和表达能力。主题涵盖集合、逻辑、归纳法、关系、函数、基数和组合数学等基础和工具。暂未有中文翻译。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-27-26.png" +width="724" +height="579" +loading="lazy" +class="gallery-image" +data-flex-grow="125" +data-flex-basis="300px" +></li> +<li><a class="link" href="https://github.com/eastlakeside/interpy-zh" target="_blank" rel="noopener" +>Python进阶</a>,是《Intermediate Python》的中文译本。2021最新目录版,实时更新托管在<a class="link" href="https://py.eastlakeside.cn" target="_blank" rel="noopener" +>GithubPages</a>。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-28-23.png" +width="1037" +height="350" +loading="lazy" +class="gallery-image" +data-flex-grow="296" +data-flex-basis="711px" +></li> +<li><a class="link" href="https://csspro.com/" target="_blank" rel="noopener" +>CSSPro</a>,一个所见即所得的在线CSS可视化开发工具,直接在页面运行,那里修改点哪里。效果真的很惊艳。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-29-07.png" +width="921" +height="537" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="411px" +></li> +<li><a class="link" href="https://github.com/makeplane/plane" target="_blank" rel="noopener" +>Plane</a>,开源版 JIRA !不少软件开发者都使用JIRA进行缺陷管理,JIRA确实很强大,也很好用。现在,开源版的来了,据说完全可以作为JIRA的平替。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-30-19.png" +width="1139" +height="595" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="459px" +></li> +<li><a class="link" href="https://openmlsys.github.io/index.html" target="_blank" rel="noopener" +>机器学习系统:设计和实现</a>,一本关于机器学习的电子书,本书希望做成世界上第一本全面讲述机器学习系统知识的开源书籍。可以看作一门衔接机器学习和计算机系统的课程 ​​。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-31-04.png" +width="234" +height="390" +loading="lazy" +class="gallery-image" +data-flex-grow="60" +data-flex-basis="144px" +></li> +<li><a class="link" href="https://callannie.ai/" target="_blank" rel="noopener" +>Callanie</a>,练习英语口语的AI对话机器人,支持国内手机号注册,免费且流畅。后端基于大语言模型,可以陪你聊各种话题。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-31-49.png" +width="303" +height="570" +loading="lazy" +class="gallery-image" +data-flex-grow="53" +data-flex-basis="127px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 034 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/Wed, 31 May 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/<h1 id="机器文摘-第-034-期">机器文摘 第 034 期</h1> +<h2 id="研究">研究</h2> +<ul> +<li><a class="link" href="https://samwho.dev/memory-allocation/" target="_blank" rel="noopener" +>图解内存分配</a>,文章展示了 C/C++ 编程中的内存分配过程,包括静态和动态内存分配技术、它们的优势,以及有效的内存管理所需考虑的事项。以图解的形式展示了内存分配过程,希望读者可以通过本文更好地理解内存分配相关的概念,并在实际编程中对内存进行更加高效的管理。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-49-39.png" +width="759" +height="298" +loading="lazy" +class="gallery-image" +data-flex-grow="254" +data-flex-basis="611px" +></li> +<li><a class="link" href="https://blog.koehntopp.info/2023/05/17/50-years-in-filesystems-towards-2004-lfs.html" target="_blank" rel="noopener" +>文件系统五十年</a>,这是一个系列文章,详细记录了计算机文件系统的发展历程。也许我们身在其中无法感受到它的进步,但是回顾历史我们会发现,即便是我们不容易注意到的部分,也在不停地发展和优化。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-50-33.png" +width="672" +height="413" +loading="lazy" +class="gallery-image" +data-flex-grow="162" +data-flex-basis="390px" +></li> +<li><a class="link" href="https://xorvoid.com/sectorc.html" target="_blank" rel="noopener" +>只有512字节的C编译器</a>,这篇文章介绍了一个怎样实现最小编译器的思路,SectorC (github) 是一个用 x86-16 汇编编写的 C 编译器,适合 x512 机器的 86 字节引导扇区。它支持 C 的子集,足够大,可以编写真实有趣的程序。它很可能是有史以来最小的C编译器。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-51-20.png" +width="764" +height="366" +loading="lazy" +class="gallery-image" +data-flex-grow="208" +data-flex-basis="500px" +></li> +<li><a class="link" href="https://www.amygoodchild.com/blog/computer-art-50s-and-60s" target="_blank" rel="noopener" +>上世纪50~60年代的计算机艺术</a>,数字艺术的发展简史。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-51-53.png" +width="781" +height="494" +loading="lazy" +class="gallery-image" +data-flex-grow="158" +data-flex-basis="379px" +></li> +<li><a class="link" href="" >win10的隐藏功能</a>,原来win10还有这个功能。按Ctrl + Alt + Del 后,按住Ctrl不松,再点击右下角的电源符号,就会进入紧急重启(Emergency Restart)界面。应该是一种强制重启。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-52-04.png" +width="690" +height="518" +loading="lazy" +class="gallery-image" +data-flex-grow="133" +data-flex-basis="319px" +></li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/SevaSk/ecoute" target="_blank" rel="noopener" +>Ecoute</a>,可用于远程面试作弊的工具?Ecoute 是一种实时转录工具,可在文本框中为用户的麦克风输入(您)和用户的扬声器输出(扬声器)提供实时翻译。它还使用 OpenAI 的 GPT-3.5 生成建议答复内容,供用户“参考”。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-52-39.png" +width="820" +height="386" +loading="lazy" +class="gallery-image" +data-flex-grow="212" +data-flex-basis="509px" +></li> +<li><a class="link" href="https://app.rask.ai/" target="_blank" rel="noopener" +>rask.ai</a>,自动将视频转成“译制片”,在对内容进行翻译的同时,会尽量保持之前的音色和语调,端到端给你的视频完成多语配音,后续还会推出唇形同步合成。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-53-28.png" +width="1171" +height="644" +loading="lazy" +class="gallery-image" +data-flex-grow="181" +data-flex-basis="436px" +></li> +<li><a class="link" href="https://chrome.google.com/webstore/detail/tango-how-to-guides-and-s/lggdbpblkekjjbobadliahffoaobaknh" target="_blank" rel="noopener" +>Tango</a>,一个Chrome浏览器插件,能帮你生成一个网站的操作指南。它会自动记录所有的操作流程,并做相应的截图和注解文档。你只需要点一遍就行了。目前还只能生成英文版的,不过自己翻译也不麻烦。可以节省不少时间。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-53-58.png" +width="632" +height="390" +loading="lazy" +class="gallery-image" +data-flex-grow="162" +data-flex-basis="388px" +></li> +<li><a class="link" href="https://praeclarum.org/2023/05/19/webgpu-torch.html" target="_blank" rel="noopener" +>WebGPU-torch</a>,PyTroch的webgpu实现。我测试了一下,我的浏览器目前还不支持。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-54-28.png" +width="1384" +height="796" +loading="lazy" +class="gallery-image" +data-flex-grow="173" +data-flex-basis="417px" +></li> +<li><a class="link" href="http://ogden.basic-english.org/" target="_blank" rel="noopener" +>basic-english</a>,“基础英语”的概念是:25,000个单词的牛津袖珍英语词典去掉冗余,并消除组合单词,90%的概念可以用850个单词来实现。使用这些基础英语可以简化日常工作和交流。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-55-26.png" +width="778" +height="516" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="361px" +></li> +<li><a class="link" href="https://github.com/raunofreiberg/interfaces" target="_blank" rel="noopener" +>Web界面准则</a>,讲解如何提升网页界面的交互性、排版、动画、辅助功能、优化和设计。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-56-18.png" +width="834" +height="466" +loading="lazy" +class="gallery-image" +data-flex-grow="178" +data-flex-basis="429px" +></li> +<li><a class="link" href="https://github.com/excalidraw/excalidraw" target="_blank" rel="noopener" +>excalidraw</a>,开源虚拟手绘风格白板程序,支持端到端加密在线协作。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-56-43.png" +width="759" +height="504" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="361px" +></li> +</ul> +<h2 id="沉思录">沉思录</h2> +<ul> +<li>一切商业的本质都是:收购一些东西(包括原材料、人力服务),经过加工(加工过程产生价值)后变成产品或服务出售。这里的原材料可以是实体物品也可以是信息。所以关键动作就是:收、加工、出售,从重要性上来说,出售大于加工大于收。所以如果要策划自己的产品,解决和分析问题的优先级也应如此,我之前想的正好一反;</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 033 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/Wed, 24 May 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/<h1 id="机器文摘-第-033-期">机器文摘 第 033 期</h1> +<h2 id="研究">研究</h2> +<h3 id="全键盘信息终端">全键盘信息终端</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/2023-05-24-09-22-11.png" +width="1335" +height="637" +loading="lazy" +class="gallery-image" +data-flex-grow="209" +data-flex-basis="502px" +> +我一直很怀念使用黑莓手机的日子。</p> +<p>物理全键盘的手感比起现在硬邦邦的触摸屏真不知道好到哪里去了。</p> +<p>多少次盯着抽屉里的黑莓尸体,都在想有没有办法再次发挥它的余热。</p> +<p>现在机会来了,有人将树莓派和黑莓手机的全键盘(带触摸板的那一款)结合起来做了一个终端。</p> +<p>取名:<a class="link" href="https://beepberry.sqfmi.com/" target="_blank" rel="noopener" +>Beepberry</a>,具有400*200分辨率的LCD屏幕,和usb type-c接口。</p> +<h3 id="自己动手给树莓派写操作系统">自己动手给树莓派写操作系统</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/2023-05-24-09-31-09.png" +width="677" +height="359" +loading="lazy" +class="gallery-image" +data-flex-grow="188" +data-flex-basis="452px" +> +学习操作系统的最佳手段是自己动手写一个。</p> +<p>这类教程很多,一般都是针对x86平台,树莓派的比较少见。</p> +<p><a class="link" href="https://github.com/isometimes/rpi4-osdev" target="_blank" rel="noopener" +>《给树莓派编写“裸机”操作系统》</a>来自github上的一个开源项目。</p> +<p>可以带你从树莓派的硬件层基础上直接构建一个的完整操作系统。</p> +<h3 id="关于-demoscene-制作的一些文章">关于 Demoscene 制作的一些文章</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/2023-05-24-09-40-25.png" +width="471" +height="314" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="360px" +> +Demoscene(也称为Demo Party)是一种计算机艺术形式,旨在展示计算机的音频和图形表现能力。Demoscene通常是由小团队制作的演示性程序,也被称为demo,它集计算机程序、音乐、图形和动画于一身,是八十年代初期在个人计算机上发展起来的一种文化和艺术运动。Demoscene的主要目的是展示计算机和程序的美感,通常使用3D渲染和其他复杂的视觉效果,展示计算机的高级图形和音频处理能力。</p> +<p>我对于如何制作这些炫酷的 demo 一直很感兴趣,但是网上关于这方面的资料非常少,成体系的就更少了。</p> +<p>这里收录了一些比较经典的相关资料:</p> +<ol> +<li> +<p><a class="link" href="https://www.ctrl-alt-test.fr/2023/procedural-3d-mesh-generation-in-a-64kb-intro/" target="_blank" rel="noopener" +>64kb的demos</a>介绍了基于SDF(Signed Distance Field,有符号距离场)生成三维网格的方法,这个方法是大部分demo用于在三维场景中产生三维模型的主要方法。</p> +</li> +<li> +<p><a class="link" href="https://www.flipcode.com/archives/The_Art_of_Demomaking-Issue_01_Prologue.shtml" target="_blank" rel="noopener" +>The_Art_of_Demomaking</a>是一套很系统的教程,讲述Demo的概念、发展历史以及制作过程需要了解的基础知识。</p> +</li> +<li> +<p><a class="link" href="https://www.pbr-book.org/3ed-2018/contents" target="_blank" rel="noopener" +>pbr-book</a>是一本关于基于物理的渲染(Physically Based Rendering,简称PBR)的经典教材。内容包括计算机图形学相关的基础概念、渲染算法、工作流程和高级特性等。</p> +</li> +</ol> +<h3 id="怎样防止针对llm的prompt攻击">怎样防止针对LLM的prompt攻击</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/2023-05-24-09-52-09.png" +width="734" +height="401" +loading="lazy" +class="gallery-image" +data-flex-grow="183" +data-flex-basis="439px" +> +就像之前流行的sql注入攻击,针对大语言模型的提示语注入攻击现在变得也很常见。</p> +<p>一种比较典型的攻击场景是,通过一段特定的提示语,解锁chatGPT原本被封印的能力。</p> +<p>或者对于接入了其他工具接口的语言模型,通过特定的提示语让其执行危险操作(如:删除所有信息)。</p> +<p>这对于使用者来说可能危害不大,但对于服务的提供者是一个不小的挑战。</p> +<p><a class="link" href="https://simonwillison.net/2023/Apr/25/dual-llm-pattern/" target="_blank" rel="noopener" +>《用于构建可以抵抗即时注入的 AI 助手的双 LLM 模式》</a>提出了一种可能可行的解决方案。</p> +<p>即使用双模型的配置,协同工作,将具有执行危险操作的特权模型放在另一个模型后面,中间使用过滤器进行风险审查,即未被审查的内容永远不会发送到特权模型。</p> +<h2 id="资源">资源:</h2> +<ul> +<li><a class="link" href="https://gamma.app/" target="_blank" rel="noopener" +>gamma</a>,AI帮你做PPT。支持自然语言描述需要生成的内容,自动给出ppt的大纲和每页基本的排版布局; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/2023-05-24-10-00-52.png" +width="742" +height="687" +loading="lazy" +class="gallery-image" +data-flex-grow="108" +data-flex-basis="259px" +></li> +<li><a class="link" href="https://www.3blue1brown.com/" target="_blank" rel="noopener" +>3blue1brown</a>,YouTube上最好的数学科普视频,特点是使用动画直观展示计算原理; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/2023-05-24-10-01-29.png" +width="953" +height="611" +loading="lazy" +class="gallery-image" +data-flex-grow="155" +data-flex-basis="374px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 032 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/Tue, 16 May 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/<h1 id="机器文摘-第-032-期">机器文摘 第 032 期</h1> +<h2 id="长文">长文</h2> +<h3 id="ai歌手的训练与使用">AI歌手的训练与使用</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-14-33-53.png" +width="1011" +height="641" +loading="lazy" +class="gallery-image" +data-flex-grow="157" +data-flex-basis="378px" +> +最近火了很多AI歌手(即:用AI模型模仿某位歌手的声音),其中b站上AI孙燕姿演唱的《漠河舞厅》、《撒日朗》等歌曲播放已超百万。</p> +<p>为了研究实现原理,我也找到了开源工具体验了一下。</p> +<p>具体步骤主要总结如下:</p> +<ol> +<li>选定某一个歌手,找到具有代表性的几首歌曲,通过<a class="link" href="https://ultimatevocalremover.com/" target="_blank" rel="noopener" +>Ultimate Vocal Remover</a>软件利用AI做人声和伴奏的分离,主要用于获取干净的纯人声用于模型训练。(不得不说现在基于AI模型的人声、伴奏分离做的是真的强,可以做到非常干净的提取,让你感觉像是原始独立的音轨)。</li> +<li>通过安装<a class="link" href="https://github.com/voicepaw/so-vits-svc-fork" target="_blank" rel="noopener" +>so-vits-svc-fork</a>这个一体化开源工具进行模型训练,具体方法见<a class="link" href="https://github.com/voicepaw/so-vits-svc-fork/blob/main/README_zh_CN.md" target="_blank" rel="noopener" +>so-vits-svc-fork的Readme</a>,从数据预处理到最后的模型导出和推理都已经做好了,甚至还提供了图形界面。</li> +<li>继续使用so-vits-svc-fork提供的gui界面进行操作,将模型载入,将预期修改歌曲的原唱人声(提取方式同第1步)传入,运行推理获得定制的人声(注意看文档的各种参数)。</li> +<li>将第3步推理所得干净人声,跟原唱分离的干净背景音乐进行混音合成,即可获得一首新歌曲了。</li> +</ol> +<h3 id="怎样用口袋计算器玩耍">怎样用口袋计算器玩耍</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-14-49-14.png" +width="716" +height="514" +loading="lazy" +class="gallery-image" +data-flex-grow="139" +data-flex-basis="334px" +> +在移动互联网时代,人打发无聊的方式实在是太多了,视频聊天、阅读各种资讯八卦、观看短视频、手游等等。</p> +<p>功能机的时代,我有印象的打发无聊的事情是手机上的贪食蛇、发短信、wap资讯等等,也算不错了。</p> +<p>如果时间来到上世纪七十年代呢?那个时代的没有随身携带的手机,怎么打发时间?</p> +<p>答案是:如果有一个随身携带的计算器也行,这里有一本书<a class="link" href="https://archive.org/details/htewypc" target="_blank" rel="noopener" +>《How To Entertain With Your Pocket Calculator》</a>,出版于上世纪七十年代。书中花了大量的篇幅介绍了很多种基于数字的游戏,我翻看了一下,我觉得可能得无聊到一定的程度我才能愿意玩书里的游戏。</p> +<h3 id="llm的几篇介绍文章">LLM的几篇介绍文章</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-14-56-38.png" +width="703" +height="332" +loading="lazy" +class="gallery-image" +data-flex-grow="211" +data-flex-basis="508px" +> +Large Language Model (LLM) 即大规模语言模型,是一种基于深度学习的自然语言处理模型,它能够学习到自然语言的语法和语义,从而可以生成人类可读的文本。 +与其感叹以chatGPT为代表的大语言模型发展太快,不如静下心来,读一读关于LLM的一些基础知识和使用方法,我找了三篇比较有代表性的放在这里收藏。</p> +<ol> +<li><a class="link" href="https://github.com/RUCAIBox/LLMSurvey/blob/main/assets/LLM_Survey_Chinese_0418.pdf" target="_blank" rel="noopener" +>大语言模型综述</a>,认真地概括并解释了什么是LLM和它的基本原理。</li> +<li><a class="link" href="https://www.bmpi.dev/dev/deep-learning/nlp-language-models/" target="_blank" rel="noopener" +>ChatGPT背后的语言模型简史</a>,从发展历史上捋一捋各种语言模型的辈分。</li> +<li><a class="link" href="https://github.com/datawhalechina/prompt-engineering-for-developers" target="_blank" rel="noopener" +>prompt-engineering-for-developers</a>一个中文版的 Prompt Engineering 教程,翻译自:吴恩达《ChatGPT Prompt Engineering for Developers》课程,主要内容为指导开发者如何构建 Prompt 并基于 OpenAI API 构建新的、基于 LLM 的应用;</li> +<li><a class="link" href="https://github.com/ninehills/ninehills.github.io/issues/92" target="_blank" rel="noopener" +>大语言模型微调技术笔记</a>,记录了基于 LLM 进行微调训练的实战技巧。</li> +</ol> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://sinerider.com/" target="_blank" rel="noopener" +>sinerider</a>,一个很有创意的数学学习游戏,让你通过数学函数构建图像从而帮助画面中的角色到达目标地点。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-15-04-41.png" +width="810" +height="708" +loading="lazy" +class="gallery-image" +data-flex-grow="114" +data-flex-basis="274px" +></li> +<li><a class="link" href="https://anvaka.github.io/map-of-github/#0.87/0/16.7" target="_blank" rel="noopener" +>map-of-github</a>,以节点地图的方式展示Github上面超过40万个仓库,通过虚拟大陆的方式展示他们之间的关系。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-15-07-40.png" +width="1274" +height="682" +loading="lazy" +class="gallery-image" +data-flex-grow="186" +data-flex-basis="448px" +></li> +<li><a class="link" href="https://learngitbranching.js.org/?locale=zh_CN" target="_blank" rel="noopener" +>learngitbranching</a>,以交互式游戏的方式学习git命令。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-15-11-32.png" +width="569" +height="598" +loading="lazy" +class="gallery-image" +data-flex-grow="95" +data-flex-basis="228px" +></li> +<li><a class="link" href="https://vgamuseum.ru/" target="_blank" rel="noopener" +></a>,在线显卡博物馆,收藏了1982年到2012年之间发布的各款显卡,包括高清图片和规格参数的介绍; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-15-14-37.png" +width="1364" +height="571" +loading="lazy" +class="gallery-image" +data-flex-grow="238" +data-flex-basis="573px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 031 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/Wed, 10 May 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/<h1 id="机器文摘-第-031-期">机器文摘 第 031 期</h1> +<h2 id="长文">长文</h2> +<h3 id="怎样驱动上个世纪的网络摄像头">怎样驱动上个世纪的网络摄像头</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-09-20-31.png" +width="697" +height="407" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="411px" +> +国外有个老哥,在帮朋友收拾废品的时候,获得了一个老旧的摄像头。</p> +<p>于是他按耐不住想感受一下,这个来自上个世纪的“古董”,还能打吗?</p> +<p>由于年代比较久远,厂家也不再提供驱动程序的更新。</p> +<p>哥们不得不在虚拟机里全新安装一个windows xp,成功启动摄像头,并获得“清晰图像”。</p> +<p>安装xp时有个插曲:安装界面里的进度条仅用时几十秒就走完了原本几十分钟的倒计时(所以说微软的进度条是如何推断剩余时间的永远是个迷)。</p> +<p>在经过一番体验之后,又跃跃欲试准备自己给它手搓一个在现代操作系统下的驱动程序。</p> +<p>整个过程记录在<a class="link" href="https://blog.benjojo.co.uk/post/quickcam-usb-userspace-driver" target="_blank" rel="noopener" +>《一个1999年的摄像头复活的故事》</a>。</p> +<p>整个故事都充满了一种“我不知道这么做有什么意义,但是我就是可以”的极客风格(也是我收录它的主要原因)。</p> +<h3 id="webgpu-科普">webGPU 科普</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-09-36-36.png" +width="673" +height="338" +loading="lazy" +class="gallery-image" +data-flex-grow="199" +data-flex-basis="477px" +> +最近谷歌浏览器率先宣布全面支持 webGPU ,预计到今年年底各大浏览器也都会跟进并提供支持。</p> +<p>webGPU 从名字上看跟显卡和浏览器有关,可是之前已经有webgl了,这次又有什么变化?</p> +<p>通过多方面信息的搜索,我得到的结论是:webGPU 更充分地暴露了显卡的计算能力,GPU不再只是做图形渲染相关的事情,而是根据webGPU提供的相关专业接口,可以执行深度学习之类的更通用的计算工作。</p> +<p>如果想了解的更全面一些,这篇<a class="link" href="https://cohost.org/mcc/post/1406157-i-want-to-talk-about-webgpu" target="_blank" rel="noopener" +>《谈谈 webGPU》</a>文章十分值得一读。</p> +<p>作者对 webGPU 这一技术介绍的比较详尽,从各个图形接口的发展历史一直到对未来如何应用的展望,都包括了。</p> +<h3 id="如何翻译一本书">如何翻译一本书</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-09-49-38.png" +width="709" +height="354" +loading="lazy" +class="gallery-image" +data-flex-grow="200" +data-flex-basis="480px" +> +<a class="link" href="https://sspai.com/post/79534" target="_blank" rel="noopener" +>《从不自量力到 AI 助力,我如何翻译完一整本英文书》</a> +这是一个关于执行力的故事。</p> +<p>主题是:如何借助AI和现代信息工具,实现看似不可能完成的任务。</p> +<p>在这个时代,个体的力量很渺小,因为个人几乎无法独立完成任何事情。</p> +<p>但同时,借助科技工具和基础设施的力量,1 个人甚至可以完成之前需要一个上百人公司才能做到的事情,这让个体变得非常强大。</p> +<h3 id="如何刷路由器">如何刷路由器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-00-09.png" +width="600" +height="417" +loading="lazy" +class="gallery-image" +data-flex-grow="143" +data-flex-basis="345px" +> +<a class="link" href="https://www.v2ex.com/" target="_blank" rel="noopener" +>V站</a>上说,中年技术男有三大爱好:钓鱼、NAS、软路由。</p> +<p><del>我一样也没沾边儿,但还是克制不住关注相关技术。</del></p> +<p>之前多次想拿自己家的路由器开刀,刷一个openwrt系统,然后就可以各种折腾(科学上网、内网穿透等等)了。</p> +<p>但是一直没有动手,今天看到这篇<a class="link" href="https://a-wing.top/linux/2023/05/01/start-openwrt" target="_blank" rel="noopener" +>自己动手定制你的路由器</a>写的如此详细,还是心动了一下。</p> +<p>先收藏吧。</p> +<h3 id="仅用csshtml实现三维动画">仅用CSS+HTML实现三维动画</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-06-52.png" +width="632" +height="161" +loading="lazy" +class="gallery-image" +data-flex-grow="392" +data-flex-basis="942px" +> +CSS 的 <code>translate3d</code>用到的不多。</p> +<p>如果使用巧妙的话,可以帮你实现很出彩的 3D 动画效果,国外有高手在给自己的文章配数学公式的时候,利用CSS制作了一些可以动态显示的公式图表。这篇<a class="link" href="https://x.st/spinning-diagrams-with-css/" target="_blank" rel="noopener" +>CSS 3D图表</a>记录了它们的实现细节和技术原理。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://www.window-swap.com/Window" target="_blank" rel="noopener" +>window-swap</a>,随机看别人家的窗外景色。这个网站每次刷新都随机显示一个网友共享的摄像头视角,一般是自家的窗外。可以随时体验全球各地的邻家风景。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-14-06.png" +width="1371" +height="929" +loading="lazy" +class="gallery-image" +data-flex-grow="147" +data-flex-basis="354px" +></li> +<li><a class="link" href="https://www.landiannews.com/archives/98512.html" target="_blank" rel="noopener" +>foobar2000</a>,经典的音乐播放器终于更新了。2002年发布的foobar2000播放器曾经是很多发烧友的最爱,如今过了20多年,居然更新了2.0稳定版,值得收藏; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-15-52.png" +width="743" +height="504" +loading="lazy" +class="gallery-image" +data-flex-grow="147" +data-flex-basis="353px" +></li> +<li><a class="link" href="https://lost-at-sql.therobinlord.com/" target="_blank" rel="noopener" +>lost-at-sql</a>,一个在线学习 sql 的交互游戏,通过游戏闯关的方式练习 sql 技能; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-18-25.png" +width="745" +height="484" +loading="lazy" +class="gallery-image" +data-flex-grow="153" +data-flex-basis="369px" +></li> +<li><a class="link" href="https://glsl-exercises.simondev.io/lesson/1/1#welcome" target="_blank" rel="noopener" +>glsl-exercises</a>,在线学习glsl的交互课程,通过交互式页面练习 glsl 编写; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-19-48.png" +width="1858" +height="794" +loading="lazy" +class="gallery-image" +data-flex-grow="234" +data-flex-basis="561px" +></li> +<li><a class="link" href="https://www.gameuidatabase.com/" target="_blank" rel="noopener" +>gameuidatabase</a>,一个游戏界面资源网站,各种游戏的界面截图,可以用来“借鉴”?; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-20-48.png" +width="1078" +height="567" +loading="lazy" +class="gallery-image" +data-flex-grow="190" +data-flex-basis="456px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 030 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/Wed, 26 Apr 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/<h1 id="机器文摘-第-030-期">机器文摘 第 030 期</h1> +<p><em>下周五一假期,休息,不更新。</em></p> +<h2 id="长文">长文</h2> +<h3 id="内网穿透的原理及实现">内网穿透的原理及实现</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-09-42-27.png" +width="1040" +height="515" +loading="lazy" +class="gallery-image" +data-flex-grow="201" +data-flex-basis="484px" +></p> +<blockquote> +<p>设想这样一个问题:在北京和上海各有一台局域网的机器(例如一台是家里的台式机,一 台是连接到星巴克 WiFi 的笔记本),二者都是私网 IP 地址,但可以访问公网, 如何让这两台机器通信呢?</p> +</blockquote> +<p>IPv4地址即将枯竭,IPv6技术还没有普及,现在很多家庭宽带都不再分配公网IP地址。这就意味着大部分的个人电脑是无法通过互联网被直接访问的(当然,你可以通过你家wifi或者4G信号访问互联网,但是反过来不行)。</p> +<p>可是这种需求又真实存在,比如我就经常希望能够在任何地方访问我家里的电脑,通过远程桌面进行办公、文件共享等等。</p> +<p>最简单的方法是通过购买一台具有公网IP地址的云主机来实现中继,这也是目前最普遍的方式。</p> +<p>不过阅读完这篇<a class="link" href="https://arthurchiao.art/blog/how-nat-traversal-works-zh/" target="_blank" rel="noopener" +>《NAT 穿透是如何工作的:技术原理及企业级实践》</a>,假如你有很强的动手能力的话,就应该可以实现一套完全不需要公网主机进行中继的“企业级内网穿透工具”。</p> +<p>文章很长,来自<a class="link" href="https://tailscale.com/blog/how-nat-traversal-works/" target="_blank" rel="noopener" +>这篇英文博客</a>。</p> +<h3 id="技术写作指南">技术写作指南</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-09-53-51.png" +width="437" +height="205" +loading="lazy" +class="gallery-image" +data-flex-grow="213" +data-flex-basis="511px" +> +曾经在翻阅《程序员的数学》这本书的时候被朋友看到,于是诞生了短暂的讨论。</p> +<p>当时我的观点是,作为程序员一定要掌握好数学,即便现在编程过程中已经不怎么用到特别底层的知识,但也应该多训练数学思维。</p> +<p>朋友当时说了一句话让我记忆犹新。</p> +<p>“比起程序员的数学,我更担忧的是程序员的语文。”</p> +<p>确实,写作这项能力在很多技术人员心里是被低估的。</p> +<p>不少人受尽写技术文档的折磨,于是越发讨厌写作。</p> +<p>这篇<a class="link" href="https://www.yuque.com/serviceup/misc/cn-writing-for-engineers" target="_blank" rel="noopener" +>《作为工程师应该如何写作》</a>真是雪中送炭,总结了很多立即就能见效的技术写作方法,希望可以帮助到工程师朋友。</p> +<h3 id="怎样制作好玩的小游戏">怎样制作好玩的小游戏</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-09-57-29.png" +width="512" +height="512" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +> +很多人都有自己开发游戏的冲动。</p> +<p>不过很容易掉进各种复杂的引擎和工具的坑里。</p> +<p>然后感到沮丧,忘了想做游戏的初心。</p> +<p>这篇<a class="link" href="http://farawaytimes.blogspot.com/2023/02/how-to-make-good-small-games.html" target="_blank" rel="noopener" +>《怎样制作好玩的小游戏》</a>可以让你重新焕发精神。</p> +<p>作者认为开发那种不用复杂引擎的小游戏也可以很欢乐,只要有足够的游戏性。</p> +<p>他在文章中详细列举了想要制作出真正具有游戏性的小游戏所必须具备的几点关键特性。</p> +<p>看得出来,作者是懂游戏的。</p> +<h3 id="神奇的一页纸知识管理">神奇的一页纸知识管理</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-10-03-34.png" +width="1220" +height="841" +loading="lazy" +class="gallery-image" +data-flex-grow="145" +data-flex-basis="348px" +></p> +<blockquote> +<p>宇航员在太空中找到的方法一定不会错,因为他要是出错就没命了。 +航天员的秘密武器,One Pager。就是把一个专项的知识,都写和画在一页纸上。日积月累,宇航员有了一本手册,里面都是一页一页的one pager。 +我向来对知识管理的各种方法很有兴趣。</p> +</blockquote> +<p>在网上闲逛时看到这篇<a class="link" href="https://www.zhongwen.ai/fantastic-one-pager/" target="_blank" rel="noopener" +>《神奇的One Pager》</a>,讲述了一种通过一页纸进行知识管理的方法。</p> +<p>热爱学习的人可不能错过。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/chidiwilliams/buzz" target="_blank" rel="noopener" +>buzz</a>,Transcribe and translate audio offline on your personal computer. Powered by OpenAI&rsquo;s Whisper. +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-08-48-07.png" +width="827" +height="431" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="460px" +></li> +<li><a class="link" href="https://moonvy.com/apps/ops/" target="_blank" rel="noopener" +>可视化提示词拼装</a>,文生图的AI越来越多,自己也可以在本地搭建服务,可是为什么我自己生成的图片那么丑呢?这个工具也许可以帮你生成一些靠谱的提示词。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-08-50-22.png" +width="991" +height="418" +loading="lazy" +class="gallery-image" +data-flex-grow="237" +data-flex-basis="568px" +></li> +<li><a class="link" href="https://liaokong.gitbook.io/llm-kai-fa-jiao-cheng/" target="_blank" rel="noopener" +>LangChain 中文入门教程</a>,众所周知 OpenAI 的 API 无法联网的,所以如果只使用自己的功能实现联网搜索并给出回答、总结 PDF 文档、基于某个 Youtube 视频进行问答等等的功能肯定是无法实现的。所以,我们来介绍一个非常强大的第三方开源库:LangChain 。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-08-51-08.png" +width="1103" +height="493" +loading="lazy" +class="gallery-image" +data-flex-grow="223" +data-flex-basis="536px" +></li> +<li><a class="link" href="https://oimo.io/works/clock/" target="_blank" rel="noopener" +>clock</a>,一个非常酷的网页时钟显示效果。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-08-51-53.png" +width="999" +height="586" +loading="lazy" +class="gallery-image" +data-flex-grow="170" +data-flex-basis="409px" +></li> +<li><a class="link" href="https://webgpufundamentals.org/" target="_blank" rel="noopener" +>WebGPU 理论基础</a>,从基础理论开始学习WebGPU,稳! +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-08-53-56.png" +width="688" +height="743" +loading="lazy" +class="gallery-image" +data-flex-grow="92" +data-flex-basis="222px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 029 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/Wed, 19 Apr 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/<h1 id="机器文摘-第-029-期">机器文摘 第 029 期</h1> +<h2 id="长文">长文</h2> +<h3 id="计算机的中断机制是如何实现的">计算机的“中断”机制是如何实现的?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-09-37-58.png" +width="1008" +height="682" +loading="lazy" +class="gallery-image" +data-flex-grow="147" +data-flex-basis="354px" +> +稍微了解过计算机原理的朋友都知道,计算机是通过“中断”的机制实现对键盘输入、鼠标移动、硬盘读写等操作的。</p> +<p>让我给小朋友讲解这些基本的知识时,我也可以侃侃而谈,说上半个小时不带重复。</p> +<p>但是真要解释“中断”的机制是如何实现的,我想即便是现在科班出身的本科生也未必能够说明白。</p> +<p>原因我觉得除了缺少实践之外,也跟大部分书上的理论内容离实际工程较远有关。</p> +<p>这篇<a class="link" href="https://r12f.com/posts/interrupts/" target="_blank" rel="noopener" +>漫谈中断</a>从实际的硬件实例(x86)出发,详细介绍了中断的实现机制,普及了“外部中断”、“内部中断”、“软中断”等概念,以及人们怎样通过“中断控制器”逐渐解决了多设备中断处理的问题。是一篇很值得阅读的科普文章。适合对计算机组成原理、操作系统等技术有兴趣的朋友阅读。</p> +<h3 id="怎样提升软件项目的可维护性">怎样提升软件项目的可维护性?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-09-54-43.png" +width="576" +height="242" +loading="lazy" +class="gallery-image" +data-flex-grow="238" +data-flex-basis="571px" +> +不同的项目团队对于软件项目的可维护性所做出的努力不同。</p> +<p>有不少团队宁愿在修改bug上加班加点,也不愿意为可维护性多花一丁点精力。</p> +<p>不过,如果你要开始一个新的软件项目或者想要改善一个已经存在的项目的可维护性。</p> +<p>这里有一份<a class="link" href="https://hix.dev/tutorials/general/software-project-checklist" target="_blank" rel="noopener" +>软件项目可维护性检查清单</a>可以参考。</p> +<p>作者主要从版本控制、软件测试、静态分析、依赖库管理、多语言支持、多平台支持、开发环境管理等方面给出了可以改进的行动清单,以及基于开源工具的最佳实践建议。</p> +<h3 id="怎样榨干chatgpt">怎样榨干chatGPT?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-06-59.png" +width="1024" +height="1024" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +> +ChatGPT是由OpenAI训练的一款大型语言模型,能够和你进行任何领域的对话。</p> +<p>现在跟年初账号紧张的情况比起来已经方便了很多。</p> +<p>在这么多开源工具和套壳网站的帮助下,我想现在大部分人都能够比较方便的体验它了吧。</p> +<p>但是可能很多人还不知道如何更好的发挥它的作用。</p> +<p>有网友整理了一份开源的<a class="link" href="https://github.com/PlexPt/awesome-chatgpt-prompts-zh" target="_blank" rel="noopener" +>chatGPT中文调教指南</a>,内容极为详尽,可以帮你榨干chatGPT的全部潜能。</p> +<h3 id="怎样让ai作画理解你的意图">怎样让AI作画理解你的意图?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-17-26.png" +width="1536" +height="512" +loading="lazy" +class="gallery-image" +data-flex-grow="300" +data-flex-basis="720px" +> +对于现在强大的AI绘图应用,有些人可能会认为只输入一个单词就能生成一张很酷的图片。</p> +<p>然而,虽然AI模型越来越善于理解我们想要的内容,但它们还不能读懂我们的思想。</p> +<p>因此,如果你想生成一张看起来像你所想的那样的图片,你需要编写正确的提示。</p> +<p>这个<a class="link" href="https://boostpixels.com/short-guide" target="_blank" rel="noopener" +>AI绘图prompt编写指南</a>可以给你提供一些帮助。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://zh.ifixit.com/Guide" target="_blank" rel="noopener" +>维修指南</a>,各种设备的维修教程大全,详细到每一个步骤的照片,设备型号齐全; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-22-36.png" +width="977" +height="461" +loading="lazy" +class="gallery-image" +data-flex-grow="211" +data-flex-basis="508px" +></li> +<li><a class="link" href="https://shadertoy.com/view/msVXWD" target="_blank" rel="noopener" +>glsl-CNN</a>,有大神用glsl语言,仅通过webGL的片元着色器实现了一个手写识别的CNN神经网络。可以在浏览器直接体验,效果惊艳。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-31-02.png" +width="801" +height="479" +loading="lazy" +class="gallery-image" +data-flex-grow="167" +data-flex-basis="401px" +></li> +<li><a class="link" href="https://github.com/facebookresearch/dinov2" target="_blank" rel="noopener" +>dinov2</a>,Meta AI新发布的全能视觉模型,模型支持:图像分类、分割、图像检索和深度估计。比较厉害的地方在于它是一个自监督模型,直接从图像中学习特征,而不依赖文本描述,即可训练计算机视觉模型。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-31-37.png" +width="828" +height="236" +loading="lazy" +class="gallery-image" +data-flex-grow="350" +data-flex-basis="842px" +></li> +<li><a class="link" href="https://minigpt-4.github.io/" target="_blank" rel="noopener" +>minigpt-4</a>,GPT4 的图像支持迟迟不开放,这个开源的MiniGPT4 却已经做到了类似的多模态效果,官方演示看起来非常棒。只用了四张A100训练了10小时,模型甚至只有13B。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-33-47.png" +width="1289" +height="1484" +loading="lazy" +class="gallery-image" +data-flex-grow="86" +data-flex-basis="208px" +></li> +<li><a class="link" href="https://github.com/linyiLYi/street-fighter-ai" target="_blank" rel="noopener" +>street-fighter-ai</a>,有个B站UP主在GPT的帮助下, 写了个 强化训练的AI模型,终于打败了街霸里的 AI,实现了儿时的梦想。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-36-53.png" +width="1080" +height="760" +loading="lazy" +class="gallery-image" +data-flex-grow="142" +data-flex-basis="341px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 027 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/Wed, 12 Apr 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/<h1 id="机器文摘-第-027-期">机器文摘 第 027 期</h1> +<h2 id="长文">长文</h2> +<h3 id="搭建本地ai作图应用">搭建本地AI作图应用</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-13-51-53.png" +width="695" +height="392" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="425px" +> +AI对话机器人火爆的同时,去年由Stable-Diffusion模型引爆的AI作图技术也没有放慢进化的脚步。</p> +<p>这里面的佼佼者<a class="link" href="https://zh.wikipedia.org/zh-cn/Midjourney" target="_blank" rel="noopener" +>Midjourney</a>已经发展成了强大的图像生成系统。可以轻松定制出照片级图像,其效果足以乱真。</p> +<p>不过目前在国内使用Midjourney还比较麻烦,即便能够访问,使用量也会受限制,能否自己搭建一个呢?</p> +<p>答案是肯定的。</p> +<p>跟去年刚问世的时候不同,现在基于Stable-Diffusion模型的生态也已经十分完备,很多开源软件、框架、插件围绕这个模型开发。</p> +<p>利用这些软件可以快速在本地计算机上构建一套属于自己的图像生成服务。</p> +<p>这里有一篇博客以<a class="link" href="https://www.freedidi.com/8474.html" target="_blank" rel="noopener" +>手把手的方式教你如何在最快速的时间搭建自己的图像生成服务</a>。</p> +<p>里面还列举了一些微调好的定制模型下载地址,合理的使用这些模型,你会发现打开新世界的大门。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-14-02-07.png" +width="733" +height="799" +loading="lazy" +class="gallery-image" +data-flex-grow="91" +data-flex-basis="220px" +></p> +<h3 id="搭建本地chatgpt应用">搭建本地chatGPT应用</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-14-08-25.png" +width="779" +height="342" +loading="lazy" +class="gallery-image" +data-flex-grow="227" +data-flex-basis="546px" +> +本来不想再提chatGPT了,因为最近说的有些太多了。</p> +<p>但是无奈当前的开源生态对于语言模型是在是太追捧了,技术发展迅雷不及掩耳。</p> +<p>很快就出现了一批可以自己搭建的AI对话模型。</p> +<p>今天我挑两个我认为效果比较好的(且对中文支持比较好的)介绍一下。</p> +<p>注意,跟目前流行的基于OpenAI的接口进行套壳的程序不同。我说的是完全在本地搭建自己的服务。</p> +<p>第一个:<a class="link" href="https://chatglm.cn/blog" target="_blank" rel="noopener" +>ChatGLM-6B</a>,一个具有62亿参数的中英双语语言模型。通过使用与 ChatGLM(chatglm.cn)相同的技术,ChatGLM-6B 初具中文问答和对话功能,并支持在单张 2080Ti 上进行推理使用。</p> +<p>搭建过程比较简单,按照<a class="link" href="https://github.com/THUDM/ChatGLM-6B/blob/main/README.md" target="_blank" rel="noopener" +>README</a>文档中的步骤下载模型、执行脚本程序即可。</p> +<p>第二个:<a class="link" href="https://github.com/ymcui/Chinese-LLaMA-Alpaca" target="_blank" rel="noopener" +>中文 LLaMA &amp; Alpaca 大模型</a>,开源了中文LLaMA模型和经过指令精调的Alpaca大模型。这些模型在原版LLaMA的基础上扩充了中文词表并使用了中文数据进行二次预训练,进一步提升了中文基础语义理解能力。同时,在中文LLaMA的基础上,本项目使用了中文指令数据进行指令精调,显著提升了模型对指令的理解和执行能力。</p> +<p>搭建过程略微繁琐一些,需要通过自己的手段下载到开源的LLaMA原始模型(当然这对于技术人员来说不是问题)。</p> +<p>然后按照文档中的教程,执行模型合并、量化等脚本,最终通过开源程序LLaMA.cpp实现模型的本地运行。</p> +<h3 id="合作运行千亿参数级语言模型">合作运行千亿参数级语言模型</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-14-22-47.png" +width="492" +height="214" +loading="lazy" +class="gallery-image" +data-flex-grow="229" +data-flex-basis="551px" +> +按照众人划桨开大船的思路,之前在带宽不足的年代诞生了BT下载。</p> +<p>如今,当我们的本地显卡无法应付超大AI模型时,有人开始用同样的思路解决问题。</p> +<p><a class="link" href="https://petals.ml/" target="_blank" rel="noopener" +>Petals</a>就是这么一个分布式模型微调、运行的框架,可以让你轻松在家运行超过千亿参数的大模型(当然是在线跟大家一起协作)。</p> +<p>其原理是大家分别加载模型的一小部分,然后与其他人一起通过协同的方式进行推理或者微调。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-14-27-18.png" +width="1742" +height="680" +loading="lazy" +class="gallery-image" +data-flex-grow="256" +data-flex-basis="614px" +></p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://learningprompt.wiki/" target="_blank" rel="noopener" +>Prompt Engineering 教程</a>,一份教你如何更好使好地使用 ChatGPT 和其他 AI 产品的免费教程。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-14-43-13.png" +width="970" +height="466" +loading="lazy" +class="gallery-image" +data-flex-grow="208" +data-flex-basis="499px" +></li> +<li><a class="link" href="https://prompthero.com/" target="_blank" rel="noopener" +>Prompthero</a>,跟聊天机器人、绘图机器人交流的prompt大全,与上面的教程不同,这是一个模板库大全,有创作灵感但是不知道该如何描述的时候可以去参考一下。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-14-45-46.png" +width="759" +height="381" +loading="lazy" +class="gallery-image" +data-flex-grow="199" +data-flex-basis="478px" +></li> +<li><a class="link" href="https://civitai.com/" target="_blank" rel="noopener" +>Civitai</a>,与上面相同,不过专门用于图像生成,而且路子比较野,有大量的NSFW内容,要搭配Stable-Diffusion的各种微调模型使用。具体使用方法,可参考前文中介绍如何搭建本地图像生成服务的部分。</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 028 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/Wed, 12 Apr 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/<h1 id="机器文摘-第-028-期">机器文摘 第 028 期</h1> +<h2 id="长文">长文</h2> +<h3 id="极简代码理解-gpt-模型结构">极简代码理解 GPT 模型结构</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-09-37-14.png" +width="679" +height="607" +loading="lazy" +class="gallery-image" +data-flex-grow="111" +data-flex-basis="268px" +> +在<a class="link" href="https://twitter.com/karpathy/status/1645115622517542913" target="_blank" rel="noopener" +>twitter上有网友发布了一个简单的示例代码</a>,讲解了 GPT 语言模型的运行原理,为了方便大家理解,作者用了极简的模型设置,即语言文字只保留了1和0两个字符,上下文长度也仅为3,可以很直观地感受到训练过程是如何起作用的。</p> +<p>作者<a class="link" href="https://colab.research.google.com/drive/1SiF0KZJp75rUeetKOWqpsA8clmHP6jMg?usp=sharing" target="_blank" rel="noopener" +>提供了托管在colab的python源码</a>,可以在线体验。</p> +<h3 id="用开源语言模型训练自己的数字化身">用开源语言模型训练自己的数字化身</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-09-38-57.png" +width="623" +height="364" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="410px" +> +随着开源语言模型的训练和微调变得越来越简单,果然有人开始整活。</p> +<p>已经有网友<a class="link" href="https://greatdk.com/1908.html" target="_blank" rel="noopener" +>通过自己的微信聊天记录和博客文章训练出有自己风格的AI</a>。</p> +<p>作者使用目前对中文支持最好的开源模型 chatglm-6b 作为预训练模型(我上期介绍过它的部署和使用)。</p> +<p>经过一番折腾后终于训练出还算凑合的模型。</p> +<p>我们的世界离<a class="link" href="https://movie.douban.com/subject/11502153/episode/1/" target="_blank" rel="noopener" +>《黑镜》中的黑暗故事</a>越来越近了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-09-49-17.png" +width="1024" +height="576" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></p> +<h3 id="四十年工作经验程序员的职业建议">四十年工作经验程序员的职业建议</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-09-50-49.png" +width="700" +height="420" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="400px" +> +国外有位“老程序员”退休了,是真正的到了退休年龄的退休。</p> +<p>他从1981年入行,直到去年退休。这期间他做过各种开发,跳过槽也被辞退过,打过工也创过业。</p> +<p>这不容易。</p> +<p>所以,他决定<a class="link" href="https://thecodist.com/how-i-stayed-relevant-over-four-decades/" target="_blank" rel="noopener" +>以“一个退休程序员”的身份分享一些心得</a>。</p> +<p>摘抄部分要点如下:</p> +<blockquote> +<p>保持开阔的眼界:每天花时间获取真正的资讯,看到趋势,在事物流行起来之前发现他们。 +保持学习:不要拒绝和敌视新技术,要为你所用。 +要有自己的项目(做一些真正的事情):作为程序员不要浪费聪明才智和外部资源,要学着开始一个自己的项目。</p> +</blockquote> +<h3 id="进入心流的入口">进入心流的入口</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-10-08-18.png" +width="660" +height="379" +loading="lazy" +class="gallery-image" +data-flex-grow="174" +data-flex-basis="417px" +> +进入心流(Flow)状态是一种很忘我的体验,也是知识工作者高效产出的必要条件。</p> +<p>有不少创作者都体会过那种全身心的投入并且忘记了时间的感觉。</p> +<p>一旦进入那种状态,很多问题能够很快得到解决,大脑飞速运转并且不会感觉到劳累。</p> +<p>这种状态最忌讳被打断,因为一旦打断,再进入就会比较困难。</p> +<p>这里有篇文章介绍了一些小技巧,可以让你在不得已中断心流之后,能够比较快速地恢复状态。</p> +<p>作者将这些技巧比喻为高速服务区进入主路之前的加速匝道,姑且称为<a class="link" href="https://census.dev/blog/an-on-ramp-to-flow" target="_blank" rel="noopener" +>进入心流的入口</a>。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://spline.design/" target="_blank" rel="noopener" +>Spline</a>,一个免费易用的 3D 设计工具,可实时协作,提供了丰富的物料库,可以基于它来快速创建有趣的 3D 场景,支持处理细腻动画交互,此外还可以导入本地模型和声音素材,支持到处多种输出格式包括WebGL、视频、链接等,很适合新手。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-10-19-26.png" +width="986" +height="536" +loading="lazy" +class="gallery-image" +data-flex-grow="183" +data-flex-basis="441px" +></li> +<li><a class="link" href="https://codepen.io/ksenia-k/pen/poOMpzx" target="_blank" rel="noopener" +>Draw With Flowers!</a>,在threejs里用着色器语言编写的一个特效demo,可以随着鼠标移动绘制绚丽的花朵。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-10-19-52.png" +width="828" +height="466" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></li> +<li><a class="link" href="https://github.com/numbbbbb/read-react-source-code" target="_blank" rel="noopener" +>React 源码阅读</a>,一本开源电子书,通过阅读React的源码来详细理解前端框架的原理。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-10-20-26.png" +width="591" +height="369" +loading="lazy" +class="gallery-image" +data-flex-grow="160" +data-flex-basis="384px" +></li> +<li><a class="link" href="https://codeium.com/download" target="_blank" rel="noopener" +>Codeium</a>,Github copilot 的免费平替,提供vscode、vim、neovim等常见编辑器的插件,我试了一下,效果可以接受。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-10-21-52.png" +width="1024" +height="586" +loading="lazy" +class="gallery-image" +data-flex-grow="174" +data-flex-basis="419px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 026 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/Wed, 29 Mar 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/<h1 id="机器文摘-第-026-期">机器文摘 第 026 期</h1> +<h2 id="长文">长文</h2> +<h3 id="通用人工智能要来了吗">通用人工智能要来了吗</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-09-37-08.png" +width="854" +height="476" +loading="lazy" +class="gallery-image" +data-flex-grow="179" +data-flex-basis="430px" +> +AGI(通用人工智能),即用一个模型解决全部问题,而不是特定领域的问题(如语音识别、图像分类等)。</p> +<p>我在几年前读过一本叫做《人工智能,人类最后的发明》的书。</p> +<p>书里说AGI就是人类最后一个发明,因为有了它,别的一切都不需要了。</p> +<p>当时感觉距离通用的人工智能还很遥远,觉得作者有些危言耸听。</p> +<p>直到今年,chatGPT和GPT-4的发布,我才发觉AI的势头确实有些猛得出乎意料。</p> +<p><a class="link" href="https://orangeblog.notion.site/GPT-4-8fc50010291d47efb92cbbd668c8c893" target="_blank" rel="noopener" +>《 GPT-4 ,人类迈向AGI的第一步》</a>是一篇<a class="link" href="https://arxiv.org/pdf/2303.12712v1.pdf" target="_blank" rel="noopener" +>近期论文</a>的翻译,该论文由微软研究院发布,论证了当前的 GPT-4 模型已经初步具有 AGI 的苗头。</p> +<p>论文内容十分详实,看完很震撼。</p> +<p>摘录部分文字如下:</p> +<blockquote> +<blockquote> +<p><strong>对话</strong> +&gt; 马克:我不喜欢你昨天晚上对待杰克的方式 +&gt; 朱迪:你看到他在做什么了吗?他打了他哥哥的头! +&gt; 马克:这并不能成为你对他大喊大叫的理由 +&gt; 朱迪:你想让我怎么做?让他打他的弟弟,然后什么都不说? +&gt; 马克:不,我不同意 +&gt; 朱迪:那你为什么要为他辩护? +<strong>提问:马克的意图似乎是什么?</strong> +GPT4: 马克的意图似乎是要表达他对朱迪处理与杰克关系的方式的不满,并建议她可以更加冷静和尊重。 +ChatGPT:根据谈话内容,马克的意图似乎是为杰克的行为辩护,并表达他对朱迪对待杰克的不满。 +<strong>提问:朱迪如何看待汤姆的回应?</strong> +GPT4: 朱迪认为他的评论是对她的分析能力的攻击,也是对杰克的不当行为表示同情的表现。她的反应是防御性的和愤怒的,并质疑马克的动机。 +ChatGPT:如果没有更多的文字,我不可能准确判断朱迪是如何接受马克的评论的。然而,根据朱迪的回应,她似乎并不同意马克的观点,而且可能对他为杰克的行为辩护感到沮丧。</p> +</blockquote> +</blockquote> +<h3 id="用-gpt-4-帮你编写一个游戏">用 GPT-4 帮你编写一个游戏</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-02-56.png" +width="717" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="212" +data-flex-basis="510px" +> +我第一次见识到 ChaptGPT 的编程能力之后,就基本离不开这个工具了。</p> +<p>现在我几乎每天都在它的辅助下编写代码。</p> +<p>不过,这里有个老哥更过分。</p> +<p>他让 <a class="link" href="https://twitter-thread.com/t/1637592014446551040" target="_blank" rel="noopener" +>GPT-4 模型帮他做出了一个3D太空赛跑游戏</a>。</p> +<p>作者本身没有游戏编程经验也不懂Javascript,但是通过跟模型一点一点对话,反复将调试代码生成的错误信息反馈给模型,逐渐完成了一个完成度还挺高的游戏。</p> +<h3 id="搭建基于私域数据的chatgpt">搭建基于私域数据的ChatGPT</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-12-24.png" +width="776" +height="438" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="425px" +> +ChatGPT 超强的对话能力怎样应用到私有数据上?</p> +<p>比如说我希望做出一个基于 ChatGPT 模型的专属客服,要吃透我的产品信息。</p> +<p>官方提供的训练API和微调(fine tuning)指导相对复杂一些,对于AI模型的微调不熟悉的人员还不够友好。</p> +<p>这里有一篇“零基础”教程<a class="link" href="https://mp.weixin.qq.com/s/naiVMuXHAScRb_jSEJN3zg" target="_blank" rel="noopener" +>《搭建基于私域数据的ChatGPT》</a>,可以带你走一下流程,感受一下定制专属模型的步骤。</p> +<h3 id="ai令人焦虑">AI令人焦虑</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-21-37.png" +width="609" +height="859" +loading="lazy" +class="gallery-image" +data-flex-grow="70" +data-flex-basis="170px" +> +这篇<a class="link" href="https://mp.weixin.qq.com/s/7H1FrwbQvsh0HD9z90L0wg" target="_blank" rel="noopener" +>《AI狂飙的时代,人还有价值吗?》</a>是一期语音播客的文字转译,因为内容比较精彩,所以也收录在这里了。</p> +<blockquote> +<p>我觉得取代不是一个好的词儿,因为取代是一个非常容易反驳的词儿。我可以说我仍然会干什么什么,AI干不了,所以它取代不了我。 +但正是这种字面上的抬杠,使得问题的本质被掩盖了,因为AI在人的生活中的渗透是一个逐渐的过程。 +百分之百地取代你可能仍然不会发生,可是它也不需要百分之百的取代掉你,只要50%的取代掉你的某些工作职能,AI就会对就业市场形成非常大的冲击。 +我有一个纽约的律师朋友,他是很早就开始用这个东西。 +他本身不是一个技术人员,他是一个标准的文科生,平常的用一个新软件都要紧张半天的那种人。 +但是他开始用这个之后,因为律师的工作是很大程度上是依赖于文本的,而文本是GPT的长项,所以他就开始用。 +之后,我就问他说,所以你真的开始辞退你的员工了吗?因为他自己是一个律所合伙人。 +他说我还没有真正开始辞退任何人,但是我确实打算今年暑假不用再招实习生了,因为给我省下的活完全可以让我腾出手来做一些事,以至于我可以省下招一个实习生的AD account。 +这就是一个真实的影响对不对? +它没有真正取代什么东西,但是它仍然冲击了一个真实的就业市场上的职位。</p> +<p>我觉得AI对我们社会的影响会以这种方式出现,它不会马上一下子让你这个人变得没有意义,但是它可以让三个人的活,两个人现在能干完,多出来那个人就没有存在的必要了,所以老板就可以把他开掉。 +它并不是百分之百取代的人的方式来逐渐进行的,而且这个事情是非常真实的。这也是为什么我觉得很多人对冲击仍然没有做好心理上和事实上的准备。 +其实有点令人忧虑的原因就是,如果你今天还用一种这东西,都是媒体的炒作来对待这个问题,你就很可能会在真正的影响你切身生活的冲击到来之前,没有做好对自己来说比较有用的帮助。</p> +</blockquote> +<p>读完这篇文章,我的感受是,没必要焦虑,不是AI没有威胁,而是焦虑也没用,蒸汽机车发明之后,超越马车就只剩下时间问题了。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://greasyfork.org/zh-CN/scripts/445751-unlimited-downloader" target="_blank" rel="noopener" +>无限制下载器,只要能播放就能下载</a>,能够帮助下载视频网站内容的浏览器插件很多,大部分都是通过嗅探播放地址来实现的下载,网站也会采用各种加密手段来进行阻止。但是这个油猴脚本采用了另一种思路。你网站防再死不能不让观众看吧?脚本几乎采用了类似录屏的手段来进行视频下载。对于一些实在想要下载的内容,可以考虑试试这个插件。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-34-53.png" +width="640" +height="400" +loading="lazy" +class="gallery-image" +data-flex-grow="160" +data-flex-basis="384px" +></li> +<li><a class="link" href="https://github.com/cocktailpeanut/dalai" target="_blank" rel="noopener" +>帮你本地运行 LLaMA 模型</a>,只需一行命令就可以让你在本地运行 <a class="link" href="https://github.com/ggerganov/llama.cpp" target="_blank" rel="noopener" +>LLaMA</a> 模型,轻松感受在本地单机上运行大规模语言模型的魅力。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-40-09.png" +width="1920" +height="1080" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></li> +<li><a class="link" href="https://github.com/lxe/simple-llama-finetuner" target="_blank" rel="noopener" +>微调 LLaMa 模型的工具</a>,既然都能在本地运行了,那就再给力一些,这个工具可以让你很方便地使用自己的数据训练 LLaMA 模型。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-42-04.png" +width="1013" +height="898" +loading="lazy" +class="gallery-image" +data-flex-grow="112" +data-flex-basis="270px" +></li> +<li><a class="link" href="https://github.com/Haxxnet/Compose-Examples" target="_blank" rel="noopener" +>Docker Compose 容器组合最佳实践</a>,Docker有多好用不用再说了吧,这里有一堆使用Docker Compose编排容器的模板,收录了很多十分有用的容器镜像组合,可方便快速的搭建各种业务(如:单点登录、VPN、媒体管理、文件共享、博客、维基、社交网站、项目管理等)。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-46-53.png" +width="802" +height="445" +loading="lazy" +class="gallery-image" +data-flex-grow="180" +data-flex-basis="432px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 025 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/Wed, 22 Mar 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/<h1 id="机器文摘-第-025-期">机器文摘 第 025 期</h1> +<h2 id="长文">长文</h2> +<h3 id="252个字节实现播放音乐和动画">252个字节实现播放音乐和动画</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-10-25-42.png" +width="915" +height="478" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="459px" +> +这里有个网页介绍了一个demo作者使用一段JavaScript代码实现了一个<a class="link" href="http://www.p01.org/256b_tetris_theme/" target="_blank" rel="noopener" +>一边播放俄罗斯方块背景音乐一边播放字符动画的网页</a>,原理是利用HTML5的AudioContext对象进行声音合成,通过定时器触发基于当前时间t值的不同频率,实现音乐播放。具体代码如下:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="o">&lt;</span><span class="nx">body</span> <span class="nx">onclick</span><span class="o">=</span><span class="s2">&#34;with(new AudioContext)with(o=createOscillator())connect(destination),start(setInterval(v=&gt;innerHTML=&#39;TETЯIS&amp;#&#39;+(9624|(o.frequency.value=`RR&gt;AIIA&gt;777${d=&#39;ARRIA&gt;&gt;&gt;AIIRRAA7777&#39;}IIIWnnbWRRR${d}`.charCodeAt(++t%58)*4)%7)+&#39;P01&#39;,t=232))&#34;</span><span class="o">&gt;</span><span class="nx">click</span> +</span></span></code></pre></td></tr></table> +</div> +</div><h3 id="诺基亚发布的可维修手机">诺基亚发布的“可维修”手机</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-10-35-52.png" +width="614" +height="369" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="399px" +> +说到诺基亚,用过的朋友第一个映入脑海的词就是“砸核桃”。</p> +<p>那是iPhone还没发布的非智能手机年代。</p> +<p>手机可更换电池和外壳在那时是一个标准设计,谁要是不支持这些都不好意思跟人打招呼。</p> +<p>那时我经常把我的诺基亚掉在地上摔得七零八落,然后淡定地捡起来像电影里特工拼装自己的手枪那样,一个个把零件组装起来,形成“一把”手机。</p> +<p>或者等手机快要没电的时候,像换弹匣那样给手机换一块电池,立马满血复活。</p> +<p>这样的日子自从iPhone发布之后就再也没有了。</p> +<p><a class="link" href="https://www.theguardian.com/technology/2023/feb/25/nokia-launches-diy-repairable-budget-android-phone" target="_blank" rel="noopener" +>诺基亚近期发布了一款手机</a>,再次让我想起我那掉地上摔开几瓣的手机。这款手机号称具有良好的“可维修”性,普通用户也可一个人在家轻松拆卸。可以自行更换包括电池、屏幕、充电端口等零件。</p> +<h3 id="不要重复自己是编程的好原则吗">不要重复自己是编程的好原则吗</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-10-50-45.png" +width="650" +height="346" +loading="lazy" +class="gallery-image" +data-flex-grow="187" +data-flex-basis="450px" +> +不要重复自己,永远不要从头开始重写代码!</p> +<p>这是很多程序员收到的忠告。</p> +<p>然而它是绝对正确的吗?</p> +<p>这里有篇文章<a class="link" href="https://programmingisterrible.com/post/176657481103/repeat-yourself-do-more-than-one-thing-and" target="_blank" rel="noopener" +>《重复自己,重写一切》</a>,作者在文章中探讨了编程中的一些习惯,他认为这些习惯可以使代码变得更难理解、更难维护,并可能导致代码的冗长和不必要的复杂性。文章提到了重写代码可以给程序带来更好的抽象和可维护性,所以建议定期通过重新写代码的方式重构你的程序。</p> +<p>说实话,我不知道作者是怎样看待所谓“屎山”代码的,也许当他面对有些代码时,他的观点也会变为:“能跑的代码,就尽量别动它了”。</p> +<h3 id="慢下来">慢下来</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-10-59-28.png" +width="587" +height="205" +loading="lazy" +class="gallery-image" +data-flex-grow="286" +data-flex-basis="687px" +> +这篇文章的题目是<a class="link" href="https://sive.rs/slow" target="_blank" rel="noopener" +>“慢下来”</a>,作者是Derek Sivers,一位创业者、作家和音乐家。在这篇文章中,他分享了自己对于“慢下来”这个主题的一些思考和感悟。</p> +<p>虽然是个急性子,但是我很认同文章里的观点。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://www.macpierce.com/the-camera-shy-hoodie" target="_blank" rel="noopener" +>反跟踪识别的套件</a>,如果你觉得被公共场所的摄像头拍摄和记录或者识别侵犯了你的隐私,这里有一套开源的穿戴套件可以考虑。它通过在身上穿戴可以发射红外线的LED设备,使得摄像头画面过曝。以获得保护隐私的效果。不过仅用于研究,不知道是否符合有些国家的法律法规。网站提供了配件清单和详细的装配说明(pdf)供下载。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-11-05-16.png" +width="1203" +height="583" +loading="lazy" +class="gallery-image" +data-flex-grow="206" +data-flex-basis="495px" +></li> +<li><a class="link" href="https://whatdoesthiscodedo.com/" target="_blank" rel="noopener" +>AI帮你解释一段代码</a>,有人使用openai的开发接口提供了一个专门帮人们解释代码执行的工具,输入代码,输出解释。并提供vscode的插件。我把文章开头那段播放音乐的Javascript代码发给他让他解释,效果如下图: +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-11-09-51.png" +width="625" +height="740" +loading="lazy" +class="gallery-image" +data-flex-grow="84" +data-flex-basis="202px" +></li> +<li><a class="link" href="https://xenova.github.io/transformers.js/" target="_blank" rel="noopener" +>在网页中运行GPT模型</a>,一个可以在浏览器中执行Transformer模型的开源程序,可以执行轻量的模型,实现如翻译、语音转文字、图像转文字等任务。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-11-12-45.png" +width="1239" +height="519" +loading="lazy" +class="gallery-image" +data-flex-grow="238" +data-flex-basis="572px" +></li> +<li><a class="link" href="https://aitxt.io" target="_blank" rel="noopener" +>AI生成工具箱</a>,近期,基于chatGPT模型的应用大爆发,这里有一个整理好的工具箱,可以使用ai做很多内容生成工作,包括帮你编写周报、润色文字、写道歉信、写外卖好评等,效果还不错。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-11-15-00.png" +width="1033" +height="530" +loading="lazy" +class="gallery-image" +data-flex-grow="194" +data-flex-basis="467px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 024 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/Wed, 15 Mar 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/<h1 id="机器文摘-第-024-期">机器文摘 第 024 期</h1> +<h2 id="长文">长文</h2> +<h3 id="电池充一次可以用两年的笔记本电脑">电池充一次可以用两年的“笔记本”电脑</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-09-18-01.png" +width="830" +height="467" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +> +挪威软件开发商安德烈亚斯·埃里克森(Andreas Eriksen)组装了一款笔记本电脑(或者说便携膝上型电脑?)。</p> +<p>它拥有“以年为单位的电池寿命”,并且使用用Lisp编程系统界面,产品名为:<a class="link" href="https://www.hackster.io/news/andreas-eriksen-s-potatop-is-a-lisp-powered-laptop-with-a-battery-life-measured-in-years-2f5d79653f24" target="_blank" rel="noopener" +>PotatoP</a>。</p> +<p>CPU好像是个ARM架构的低功耗单核处理器,最高频率96MHz。</p> +<p>支持蓝牙5.0。</p> +<p>运行的系统为PotatOS,一个基于<a class="link" href="http://www.ulisp.com/" target="_blank" rel="noopener" +>uLisp</a>(一个专门为微控制器设计的Lisp)移植的专用系统。</p> +<p>使用的4.4英寸显示屏采用介于LCD和墨水屏之间的技术,省电。</p> +<p>再加上机身上还带有太阳能电池,据说如果环境光充足的话,可以连续运行两年。</p> +<h3 id="详解-amd-为-steam-deck-开发的-apu">详解 AMD 为 Steam Deck 开发的 APU</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-09-32-20.png" +width="671" +height="272" +loading="lazy" +class="gallery-image" +data-flex-grow="246" +data-flex-basis="592px" +> +Steam Deck 无疑是一款革命性的掌机。</p> +<p>如果不是价格在国内被炒的离谱,我定会入手一台,也许再观望一下等待第二代或者三代产品更好。</p> +<p>这款掌机使得在便携设备上游玩3A大作不再是幻想。</p> +<p>取得这样的表现,除了得益于V厂魔改的Linux系统之外,还离不开这块由AMD定制的、代号“梵高”的 APU。</p> +<p>这篇<a class="link" href="https://chipsandcheese.com/2023/03/05/van-gogh-amds-steam-deck-apu/" target="_blank" rel="noopener" +>《“梵高”AMD的Steam Deck APU》</a>详细介绍了这块APU的各种技术细节,解释了为什么Steam Deck可以做到低功耗的同时还拥有相当给力的图形性能。</p> +<h3 id="用磁盘阵列raid确保数据安全靠谱吗">用磁盘阵列(RAID)确保数据安全靠谱吗?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-09-45-46.png" +width="477" +height="250" +loading="lazy" +class="gallery-image" +data-flex-grow="190" +data-flex-basis="457px" +> +再谈谈 NAS 的事情(中年技术男的三大爱好之一)。</p> +<p>像我这样的人,对于 RAID 磁盘阵列总是抱有美好的幻想。我们认为,只要将数据存放在经过合理规划的磁盘阵列中(例如 RAID 5),我们就可以高枕无忧,确保数据永远不会丢失。然而,实际上,磁盘阵列并不是备份数据的最佳选择,最佳的数据安全策略是异地多份存储。</p> +<p>尽管 RAID 5 宣称随便损坏一块硬盘也不要紧,只需更换一块正常盘即可,但这种理想状态可能不太容易实现,中间随时可能会出现其他状况导致数据永久丢失。</p> +<p>一篇名为<a class="link" href="https://www.ucmadscientist.com/almost-lost-it-all-again/" target="_blank" rel="noopener" +>《差点儿就又全没了》</a>的博文,讲述了作者在使用 NAS 磁盘阵列时经历了一次惊险刺激的数据拯救过程。希望这篇文章能够给计划使用类似方式保存数据的朋友们一个平常心态。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://pubby.games/nesfab.html" target="_blank" rel="noopener" +>NESFab</a>,一个专为开发任天堂8位游戏机(NES、FC)设计的编程语言。具有高性能、易于装载资源、自动内存地址切换等特性,作者还在主页提供了一个使用NESFab开发游戏的教程。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-10-10-50.png" +width="490" +height="169" +loading="lazy" +class="gallery-image" +data-flex-grow="289" +data-flex-basis="695px" +></li> +<li><a class="link" href="https://github.com/AstroNvim/AstroNvim" target="_blank" rel="noopener" +>AstroNvim</a>,一套即开即用的Nvim配置文件,主打界面美观,集成了文件浏览、代码补全、语法高亮、模糊查询、可视化调试等常用插件配置。对于新手和懒得折腾的人来说,可以尝试。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-10-13-25.png" +width="814" +height="434" +loading="lazy" +class="gallery-image" +data-flex-grow="187" +data-flex-basis="450px" +></li> +<li><a class="link" href="https://github.com/pynecone-io/pynecone" target="_blank" rel="noopener" +>pynecone</a>,一个用python开发的web应用框架,特点是使用python语言完成所有任务,包括前端和后端,可以帮助那些对于前端开发不太擅长的人更方便地制作web应用程序。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-10-16-17.png" +width="727" +height="647" +loading="lazy" +class="gallery-image" +data-flex-grow="112" +data-flex-basis="269px" +></li> +<li><a class="link" href="https://maryrosecook.com/blog/post/a-practical-introduction-to-functional-programming" target="_blank" rel="noopener" +>函数式编程入门</a>,一篇介绍函数式编程的文章,介绍了函数式编程的基本概念和一些重要的函数式编程概念,并使用Javascript演示了如何使用这些概念进行函数式编程。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-10-18-09.png" +width="450" +height="220" +loading="lazy" +class="gallery-image" +data-flex-grow="204" +data-flex-basis="490px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 023 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/Wed, 08 Mar 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/<h1 id="机器文摘-第-023-期">机器文摘 第 023 期</h1> +<h2 id="长文">长文</h2> +<h3 id="视频信号可以被窃听吗">视频信号可以被窃听吗?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-10-10-45.png" +width="533" +height="234" +loading="lazy" +class="gallery-image" +data-flex-grow="227" +data-flex-basis="546px" +> +我之前听到过一个传说。</p> +<p>使用高灵敏度的天线,再加上一些奇妙的设备。</p> +<p>可以窃听(窃视?)到附近(方圆数百米)范围之内的显示器显示的内容。</p> +<p>这个传说流传的时候,还是CRT显示器的时代,当时的视频接口主要是VGA,采用模拟信号进行传输。</p> +<p>如果显示器或者视频线缆所作的屏蔽不够充分的话,难免会有信号泄露。</p> +<p>而VGA信号又没有任何加密,被别有用心的人收看是有一定的可能的。</p> +<p>时间发展到今天,视频接口早已升级,我以为除非不小心无线投屏到了邻居家,否则就不会有视频内容泄露的情况。</p> +<p>然而,<a class="link" href="https://www.windytan.com/2023/02/using-hdmi-radio-interference-for-high.html" target="_blank" rel="noopener" +>今天要说的这篇文章</a>则证实了上述传说的可能。</p> +<p>不过,比起传说中的窃听,作者走的更远一些。</p> +<p>起因是作者在家里摆弄无线电的时候,发现了一个信号干扰源,最后发现来自他的一个树莓派设备。</p> +<p>于是经过一番操作,作者不但成功通过无线接收的方式将视频信号显示了出来。</p> +<p>还利用这种无线信号的干扰(或泄露?)实现了叠加数据的传输。</p> +<h3 id="怎样用密码保护一个静态页面">怎样用密码保护一个静态页面?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-10-34-20.png" +width="903" +height="429" +loading="lazy" +class="gallery-image" +data-flex-grow="210" +data-flex-basis="505px" +> +说到网站上的数据权限保护,一般我们会需要后端程序配合。</p> +<p>比如使用账号系统,给用户角色分配不同的权限,使其访问后端接口时获取不同的数据。</p> +<p>如果没有后台程序,只有静态页面会怎样?</p> +<p>这儿有个开源工具,<a class="link" href="https://robinmoisson.github.io/staticrypt/" target="_blank" rel="noopener" +>可以帮你生成带有密码保护的静态HTML页面</a>。</p> +<p>具体使用方法和原理也很简单。</p> +<p>输入你想设置的密码和你的HTML页面原始代码,这个工具可以使用AES-256加密算法对其进行加密。</p> +<p>然后在浏览器加载时,页面自动使用一个js库实现自解密。</p> +<p>这个方法用于临时保护一些静态的内容还是挺有效的,而且很方便。</p> +<h3 id="写代码越干净越好吗">写代码越“干净”越好吗?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-10-43-47.png" +width="713" +height="344" +loading="lazy" +class="gallery-image" +data-flex-grow="207" +data-flex-basis="497px" +> +有不少人宣称自己有代码“洁癖”。</p> +<p>对于设计模式和面向对象有着非常深的执念(或者函数式编程也是)。</p> +<p>市面上也充斥着很多“之美”、“之道”、“之禅”之类的书籍,强调代码要给人读、整洁干净。</p> +<p>我并不反对上述观点,甚至自己也有一点这样的“洁癖”,只是有时内心会有一丝怀疑的时候,觉得如果过于追求某些东西可能会偏离了解决问题的根本目标。</p> +<p>这篇<a class="link" href="https://www.computerenhance.com/p/clean-code-horrible-performance" target="_blank" rel="noopener" +>《“干净”的代码,糟糕的性能》</a>,帮我吐槽了一些事情。</p> +<p>但作者在文中所举的例子稍微有些牵强,不必过于纠结。</p> +<h3 id="不知道怎么练习编程怎么办">不知道怎么练习编程怎么办</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-10-58-53.png" +width="469" +height="314" +loading="lazy" +class="gallery-image" +data-flex-grow="149" +data-flex-basis="358px" +> +经常有人困惑在学习了一门新的编程语言之后,不知该做些什么。</p> +<p>就像是掌握了词语却写不出好的小说,掌握了规则也下不好象棋。</p> +<p>我们从小受到的教育方式导致了,在学习技能这一块,缺失实践的动力和方法。</p> +<p>这篇<a class="link" href="https://prog21.dadgum.com/80.html" target="_blank" rel="noopener" +>给无目标的新手程序的一些建议</a>,虽然内容不多,但是可以看出作者也是个老油条了。</p> +<p>给出的一些提示都很实在,对于技能练习方面,提的都是我希望我能遵从的。</p> +<p>比如:</p> +<blockquote> +<p>用技能解决你实际生活中的问题。 +做一些你真正会用到的东西。</p> +</blockquote> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://www.freecodecamp.org/chinese/news/typescript-for-react-developers/" target="_blank" rel="noopener" +>写给 React 开发者的 TypeScript 指南</a>,针对React程序员的TypeScript的学习资料,解答了我一部分为什么要用TS的问题。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-11-01-19.png" +width="698" +height="375" +loading="lazy" +class="gallery-image" +data-flex-grow="186" +data-flex-basis="446px" +></li> +<li><a class="link" href="https://method.ac/" target="_blank" rel="noopener" +>Method of Action</a>,一些免费的工具和在线小游戏(颜色搭配、贝塞尔曲线等),可以帮助你学习和掌握设计理念和工具。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-11-02-12.png" +width="605" +height="461" +loading="lazy" +class="gallery-image" +data-flex-grow="131" +data-flex-basis="314px" +></li> +<li><a class="link" href="https://archivebox.io/" target="_blank" rel="noopener" +>Archivebox</a>,一套开源的互联网内容保存方案,可以将你喜欢的页面下载下来,并自动爬取相关链接、图片等内容,类似于互联网档案馆的https://archive.org,不过可以自己搭建。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-11-06-33.png" +width="686" +height="285" +loading="lazy" +class="gallery-image" +data-flex-grow="240" +data-flex-basis="577px" +></li> +<li><a class="link" href="https://ohiostate.pressbooks.pub/graphicshistory/front-matter/cover/" target="_blank" rel="noopener" +>History of Computer Graphics and Animation</a>,一本讲解计算机图形和动画发展历程的电子书,里面记录了计算机图形学相关的许多参考资料,曾用于俄亥俄州立大学的授课。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-11-08-29.png" +width="676" +height="711" +loading="lazy" +class="gallery-image" +data-flex-grow="95" +data-flex-basis="228px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 022 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/Wed, 01 Mar 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/<h1 id="机器文摘-第-022-期">机器文摘 第 022 期</h1> +<h2 id="长文">长文</h2> +<h3 id="自制家庭服务器">自制家庭服务器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-10-51-39.png" +width="668" +height="367" +loading="lazy" +class="gallery-image" +data-flex-grow="182" +data-flex-basis="436px" +> +人们常说,中年技术男的最终归宿除了钓鱼和盘核桃之外,还有一项就是折腾家里的服务器,这些服务器形态各异,但是作用都是殊途同归:NAS、软路由、虚拟化、Docker容器。</p> +<p>怎样变着花样搭建家庭服务器几乎是 V 站的月经甚至日经话题。</p> +<p>这里有个国外的老哥,决定使用 ARM64 架构自己“装配”一个,是那种需要焊接的“装配”。</p> +<p>有兴趣的可以翻阅一下这篇<a class="link" href="https://jforberg.se/blog/posts/2023-02-19-rockpro64/rockpro64.html" target="_blank" rel="noopener" +>《构建 ARM64 家庭服务器》</a>。</p> +<p>文章介绍了如何用一种较为困难的方式构建一个 ARM64 架构的家用服务器。</p> +<p>作者使用了一块名为 ROCKPro64 的开发板,并详细介绍了构建过程中遇到的问题以及如何解决这些问题。</p> +<p>文章中包含了安装基础操作系统、配置网络连接、设置磁盘阵列和安装各种软件的详细步骤和指导,涵盖了从硬件到软件的多个方面。</p> +<p>在构建过程中,作者提到了一些常见的问题和解决方法,例如如何处理不同操作系统的差异,如何在开发板上设置固件,以及如何解决硬件不兼容问题。</p> +<p>总之,这篇文章是一份详细的指南,可以帮助有兴趣构建自己的家用服务器的读者了解基础知识,克服可能遇到的问题,并学习如何从头开始构建一个高效、安全的服务器。</p> +<blockquote> +<p>上面这段是让 chatGPT 帮我写的 :)</p> +</blockquote> +<h3 id="用rust写一个大小仅有2k的极简fps游戏">用Rust写一个大小仅有2K的极简FPS游戏</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-11-06-53.png" +width="480" +height="258" +loading="lazy" +class="gallery-image" +data-flex-grow="186" +data-flex-basis="446px" +> +极简渲染器的编写教程网上有很多,但大都浅尝辄止,以静态渲染为主。</p> +<p><a class="link" href="https://grantshandy.github.io/posts/raycasting/" target="_blank" rel="noopener" +>这篇文章</a>则从制作一个第一人称射击游戏的视角出发,讲解了怎样使用光线投射技术实现最基本的三维空间渲染、光照、阴影等效果。</p> +<p>作者使用 Rust 语言基于 wasm 技术编写了一个在网页中运行的示例程序,该程序非常小巧,但是也充分展现了如何使用光线投射算法来实现 3D 渲染技术仲的一些基本概念,比如:墙体贴图、视角控制等。</p> +<p>是我看到的教程里比较系统的一个,适合作为爱好者去研究。</p> +<h3 id="玩具-cpu-模拟器">玩具 CPU 模拟器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-13-24-45.png" +width="640" +height="480" +loading="lazy" +class="gallery-image" +data-flex-grow="133" +data-flex-basis="320px" +> +国外一个大学老师觉得他的计算机组成原理课程有些枯燥,于是他<a class="link" href="https://jimhall.itch.io/toy-cpu" target="_blank" rel="noopener" +>动手撸了一个 CPU 模拟器出来</a>,以帮助学生们更好的理解计算机内部运作原理。</p> +<p>作者在文章里介绍了基本的原理,以及模拟器的各个组件,适合学习底层原理初入门的学生。</p> +<p>另外这个模拟器也基于 MIT 协议进行了开源,文章中附有开源仓库的地址和编译好的可执行文件下载连接。</p> +<p>需要注意的是该程序运行环境为DOS,现在要想体验的话,需要先安装 <a class="link" href="https://www.dosbox.com/download.php?main=1" target="_blank" rel="noopener" +>DosBOX</a> 这个模拟器。</p> +<h3 id="不用任何构建系统编写前端代码">不用任何构建系统编写前端代码</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-13-35-29.png" +width="632" +height="224" +loading="lazy" +class="gallery-image" +data-flex-grow="282" +data-flex-basis="677px" +> +比起十几年前,前端开发工程现在已经变得十分复杂。</p> +<p>有次我想写个简单的页面程序,但是却花费了一上午的时间陷入对框架和构建系统的选择上。</p> +<p>后来不得不放弃,改用记事本随便用原生Javascript完成了功能。</p> +<p><a class="link" href="https://jvns.ca/blog/2023/02/16/writing-javascript-without-a-build-system/" target="_blank" rel="noopener" +>这篇文章</a>的作者跟我有同样的感受。</p> +<p>作者认为,对于一些简单的项目来说,使用构建系统可能是不必要的。</p> +<p>因为构建系统会增加开发和维护的复杂性,而且可能会导致一些性能问题。</p> +<p>文章演示了作者如何使用原生的Javascript和浏览器的开发者工具来实现一些常见的构建系统功能。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/CyC2018/CS-Notes" target="_blank" rel="noopener" +>计算机知识笔记</a>,一个计算机科学知识笔记仓库,包括计算机基础知识、编程语言和算法、开发工具、面试笔试题目等等,是一个非常实用的笔记库。目前在 Github 上有超过 162k 个 star 。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-13-47-03.png" +width="344" +height="602" +loading="lazy" +class="gallery-image" +data-flex-grow="57" +data-flex-basis="137px" +></li> +<li><a class="link" href="https://www.hugi.scene.org/online/hugi31/hugi%2031%20-%20index%20coding%20corner.htm" target="_blank" rel="noopener" +>Creating Demos</a>,这套教程是 <a class="link" href="https://en.wikipedia.org/wiki/Hugi" target="_blank" rel="noopener" +>Hugi 杂志</a>在2001年第31期发布的一系列编程文章,主题是“Demo程序”的制作,是我目前在网络上见到的比较完整和耐心的一套讲解 Demoscene 如何制作的教程。虽然有些技术是老旧的,但是思想一直是不变的,能够学到很多平时很难了解到的东西,现在很少有人愿意分享这些了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-13-52-29.png" +width="543" +height="367" +loading="lazy" +class="gallery-image" +data-flex-grow="147" +data-flex-basis="355px" +></li> +<li><a class="link" href="https://github.com/iawia002/lux" target="_blank" rel="noopener" +>网络视频下载器</a>,一个 go 语言编写的网络音视频资源下载工具,类似 youtube-dl,但是支持的网站要更多一些。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-13-54-53.png" +width="870" +height="666" +loading="lazy" +class="gallery-image" +data-flex-grow="130" +data-flex-basis="313px" +></li> +<li><a class="link" href="https://www.ambient.run/" target="_blank" rel="noopener" +>ambient</a>,Ambient是一个使用 WebAssembly、Rust 和 WebGPU 技术构建的高性能多人游戏和3D应用的开源引擎。特点是针对构建多人游戏开发进行优化支持。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-14-03-29.png" +width="981" +height="378" +loading="lazy" +class="gallery-image" +data-flex-grow="259" +data-flex-basis="622px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 021 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/Wed, 22 Feb 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/<h1 id="机器文摘-第-021-期">机器文摘 第 021 期</h1> +<h2 id="长文">长文</h2> +<h3 id="chatgpt-原理通俗讲解">chatGPT 原理通俗讲解</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-14-57-11.png" +width="1240" +height="410" +loading="lazy" +class="gallery-image" +data-flex-grow="302" +data-flex-basis="725px" +> +可能是有人炒作的缘故,chatGPT 热度一直不降,连街边买菜的大妈都在讨论这个“人工智能机器人”。</p> +<p>可能是它输出语言的流畅度实在是太接近真实的人类了,用惯了之前那种“智能助理”的人很容易感到震惊。</p> +<p>然而其背后的原理并非像想象的那么复杂,甚至是大力出奇迹的又一个经典样例。</p> +<p>最近关于它的文章也是铺天盖地,各种分析、叫好,很少有冷静下来探讨其背后机理的。</p> +<p>我翻看了几篇之后,发现唯有这篇<a class="link" href="https://writings.stephenwolfram.com/2023/02/what-is-chatgpt-doing-and-why-does-it-work/" target="_blank" rel="noopener" +>《chatGPT在做什么以及它为什么好使》</a> 比较优秀。读起来比较平和,没有压力。</p> +<p>文章揭示了即使像chatGPT这样的大型语言模型也是一个单词一个单词慢慢往出崩的,并尝试说清楚这么流畅的语言是基于什么来预测后续单词的概率。</p> +<h3 id="怎样利用多gpu训练真正的大型模型">怎样利用多GPU训练真正的大型模型</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-13-37.png" +width="920" +height="461" +loading="lazy" +class="gallery-image" +data-flex-grow="199" +data-flex-basis="478px" +> +前面提到的 chatGPT 模型,体量非常大,据说训练一次就要耗费上千万美元。</p> +<p>作为普通开发者我们是不敢奢望自己上手训练一番。</p> +<p>不过,这里有一篇文章可以让我了解像这样的<a class="link" href="https://lilianweng.github.io/posts/2021-09-25-train-large/" target="_blank" rel="noopener" +>大模型是如何进行并行训练的</a>。</p> +<p>另外还有个开源的项目,号称可以<a class="link" href="https://github.com/hpcaitech/ColossalAI/blob/main/README-zh-Hans.md" target="_blank" rel="noopener" +>在较少资源的基础设施上进行 GPT 模型训练</a>,有兴趣的可以试试。</p> +<h3 id="怎样搭建一个电子爱好者工作间">怎样搭建一个电子爱好者工作间</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-28-10.png" +width="716" +height="439" +loading="lazy" +class="gallery-image" +data-flex-grow="163" +data-flex-basis="391px" +> +拥有一个电子产品工作室一直是我的一个梦想。</p> +<p>电烙铁、稳压电源、万用表,是我能想到的最基本的设备。</p> +<p>如果还想更完美,可以借鉴这篇文章所介绍的思路,<a class="link" href="https://lcamtuf.substack.com/p/setting-up-an-electronics-workshop" target="_blank" rel="noopener" +>搭建一个电子爱好者工作间</a>。</p> +<h3 id="运气计算公式">运气计算公式</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-37-36.png" +width="809" +height="570" +loading="lazy" +class="gallery-image" +data-flex-grow="141" +data-flex-basis="340px" +> +看到一个关于运气的文章<a class="link" href="https://www.swyx.io/create-luck" target="_blank" rel="noopener" +>《如何获得好运气》</a>,觉得里面提到的“怎样使得随机的运气变得让好运更加倾向于你”的说法比较有意思。</p> +<p>于是就收录一下。</p> +<p>文章里探讨的问题,很容易让我联想到关于“下雨的时候是飞速跑动淋雨多还是慢慢走淋雨多”的问题。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://academy.cs.cmu.edu/" target="_blank" rel="noopener" +>卡耐基梅隆大学计算机科学在线教程</a>,CMU CS Academy 是卡内基梅隆大学计算机科学学院 (SCS) 的一个项目,其目标是开发一种新颖的、世界级的、在线的、完全免费的交互式高中计算机科学课程。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-45-42.png" +width="767" +height="390" +loading="lazy" +class="gallery-image" +data-flex-grow="196" +data-flex-basis="472px" +></li> +<li><a class="link" href="https://www.handsome-css.com/" target="_blank" rel="noopener" +>纯CSS实现的超漂亮UI组件收集</a>,网站收集了超多 UI 组件,基于 纯 CSS 实现,采用 MIT 开源协议发布,可以自由使用。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-47-30.png" +width="863" +height="349" +loading="lazy" +class="gallery-image" +data-flex-grow="247" +data-flex-basis="593px" +></li> +<li><a class="link" href="https://cn.sli.dev/" target="_blank" rel="noopener" +>为开发者打造的演示文稿工具</a>,Slidev 旨在为开发者提供灵活性和交互性,通过使用他们已经熟悉的工具和技术,使他们的演示文稿更加有趣、更具表现力和吸引力。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-50-17.png" +width="652" +height="251" +loading="lazy" +class="gallery-image" +data-flex-grow="259" +data-flex-basis="623px" +></li> +<li><a class="link" href="https://www.stableattribution.com/" target="_blank" rel="noopener" +>根据ai做的图倒推出用于训练模型的原始图</a>,这个网站比较有意思,前一段时间比较火的根据文字生成图片的 AI ,这里可以将根据 AI 生成的图片反推出它当时样本训练的原始图。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-56-55.png" +width="1696" +height="398" +loading="lazy" +class="gallery-image" +data-flex-grow="426" +data-flex-basis="1022px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 020 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/Wed, 15 Feb 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/<h1 id="机器文摘-第-020-期">机器文摘 第 020 期</h1> +<h2 id="长文">长文</h2> +<h3 id="怎样获得非凡成就">怎样获得非凡成就</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/2023-02-15-09-57-43.png" +width="749" +height="383" +loading="lazy" +class="gallery-image" +data-flex-grow="195" +data-flex-basis="469px" +> +多年来,我对成功学嗤之以鼻。</p> +<p>但也对有些人的成功给予应有的尊重。</p> +<p>我所欣赏的成功人士有一种特殊气质,我说不上来具体是什么特点,有点儿像反叛精神,又有点儿对手工技术的狂热。</p> +<p>这些人里对我影响比较大的是《黑客与画家》的作者 保罗·格雷厄姆(<a class="link" href="https://zh.wikipedia.org/zh-hans/%E4%BF%9D%E7%BD%97%C2%B7%E6%A0%BC%E9%9B%B7%E5%8E%84%E5%A7%86" target="_blank" rel="noopener" +>Paul Graham</a>)。</p> +<p>他创建了著名的 <a class="link" href="https://zh.wikipedia.org/zh-hans/Y_Combinator" target="_blank" rel="noopener" +>YC 孵化器公司</a>,也打造了很多成功的产品。</p> +<p>今天推荐的这篇文章<a class="link" href="https://blog.samaltman.com/how-to-be-successful" target="_blank" rel="noopener" +>《How To Be Successful》</a>的作者,是保罗·格雷厄姆非常推崇的一位创业者。</p> +<p>文章分享的观点乍看有成功学的影子,但读完却能引人思考。</p> +<p>这里是中文翻译版:<a class="link" href="https://mp.weixin.qq.com/s/pQYztNmmQ6W4fRxPIEsWYQ" target="_blank" rel="noopener" +>《观察成千上万创业者后,关于如何获得非凡成就的13条思考》</a></p> +<p>我觉得这些观点至少可以给长期埋头技术工作的人们一些启发,我稍微列举几条如下:</p> +<blockquote> +<ul> +<li>这个世界很少人能做到将眼光放长远,而那些有长远眼光的人会得到市场的丰厚回报。</li> +<li>把时间花在做正确的事上,比花长时间进行工作更重要。</li> +<li>跟着你的好奇心走。因为对你来说兴奋的事情对其他人来说也同样兴奋。</li> +<li>成为内驱型的人(即:自己去做一件事的原因来自于自己,而不是外部的力量或别人的期望)。</li> +</ul> +</blockquote> +<h3 id="怎样在客厅建立自己的私人影院">怎样在客厅建立自己的私人影院</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/2023-02-15-10-21-45.png" +width="841" +height="396" +loading="lazy" +class="gallery-image" +data-flex-grow="212" +data-flex-basis="509px" +> +智能电视或者智能盒子已成为现在客厅的标配。</p> +<p>如何充分发挥它们的作用,早已是技术爱好者的孜孜不倦探索的课题。</p> +<p>前些天我偶然收到一份公开的云盘链接,使用开源的 <a class="link" href="https://github.com/alist-org/alist" target="_blank" rel="noopener" +>AList</a>(一个支持网盘存储的文件列表程序,可以通过多种协议将网盘映射为本地访问的存储路径) 进行构建。里面整理了大量的影视资源,有不少是高质量、高码率的蓝光原盘文件。</p> +<p>这就激发了我的好奇心。</p> +<p>由于自己一直按耐住折腾 NAS 的念头,这些年一直没有收集电影。</p> +<p>但现在既然有在线的资源,不妨尝试一下。</p> +<p>于是我找到了这篇<a class="link" href="https://wp.gxnas.com/12278.html" target="_blank" rel="noopener" +>《利用KODI和云盘打造4K高清私人云影院》</a>(仅作研究,观影和收藏还需支持正版)。</p> +<p>按照文章的指导,成功给电视安装了 KODI(一个媒体中心 App),并进行了配置,可以非常方便地浏览、观看互联网云盘上的高清电影。</p> +<p>比起云盘官方所出品的各种 App 在体验上更加灵活、完美。</p> +<h3 id="噪声在计算机图形学里的作用">“噪声”在计算机图形学里的作用</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/2023-02-15-10-40-28.png" +width="671" +height="303" +loading="lazy" +class="gallery-image" +data-flex-grow="221" +data-flex-basis="531px" +> +想要计算机产生的图形更加的接近自然,生成各式各样的噪声是必不可少的算法。</p> +<p>之前在读<a class="link" href="https://natureofcode.com/" target="_blank" rel="noopener" +>《The Nature of Code》</a>(中文译作:代码本色)一书的时候,作者花了大量篇幅讲解关于噪声、随机等对于模拟自然界中各种现象的重要作用。</p> +<p>或许在噪声里就隐藏着大自然最深处的秘密。</p> +<p>这篇<a class="link" href="https://zhuanlan.zhihu.com/p/68507311" target="_blank" rel="noopener" +>WebGL进阶——走进图形噪声</a>可以让你领略一些图形噪声的神奇。</p> +<p>很多场景都给出了 WebGL 实现的源码,可以边学边练。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://threegn.app/" target="_blank" rel="noopener" +>ThreeGN</a>,一个基于网页的三维建模程序,特点是具有类似 Blender 的几何节点编辑功能。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/2023-02-15-10-51-53.png" +width="846" +height="453" +loading="lazy" +class="gallery-image" +data-flex-grow="186" +data-flex-basis="448px" +></p> +</li> +<li> +<p><a class="link" href="https://tabler-icons.io/" target="_blank" rel="noopener" +>tabler</a>,一个开源的图标库,可用于 Web 或 移动端应用开发,全部免费使用。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/2023-02-15-10-55-30.png" +width="796" +height="314" +loading="lazy" +class="gallery-image" +data-flex-grow="253" +data-flex-basis="608px" +></p> +</li> +<li> +<p><a class="link" href="https://microsoftedge.microsoft.com/addons/detail/%E6%B2%89%E6%B5%B8%E5%BC%8F%E7%BF%BB%E8%AF%91/amkbmndfnliijdhojkpoglbnaaahippg" target="_blank" rel="noopener" +>immersive-translate</a>,一个在线翻译浏览器插件,支持 Edge、Firefox、Chrome 等浏览器,优点是可以在网页上追加中文显示,原文和译文同时展示,对于想提升外语水平的人士,是个不错的对照工具。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/2023-02-15-10-59-08.png" +width="621" +height="357" +loading="lazy" +class="gallery-image" +data-flex-grow="173" +data-flex-basis="417px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 019 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/Tue, 07 Feb 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/<h1 id="机器文摘-第-019-期">机器文摘 第 019 期</h1> +<h2 id="长文">长文</h2> +<h3 id="现阶段-ai-能对游戏开发提供多大帮助">现阶段 AI 能对游戏开发提供多大帮助</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-13-19-34.png" +width="686" +height="358" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="459px" +> +AI 在最近有多爆发自然不用我再赘述,抛开那些狂热的能够引起焦虑的言论(比如 AI 即将替代大量工作岗位),也有不少人选择跟 AI 和平相处。</p> +<p>这篇<a class="link" href="https://www.traffickinggame.com/ai-assisted-graphics/" target="_blank" rel="noopener" +>《AI 辅助图形》</a>的作者是一个有着游戏制作二十年经验的从业者,近期想尝试尽可能地利用各种 AI 加持的辅助工具,试图通过他们提升制作效率。</p> +<p>作者从游戏的概念原型阶段,一直到三维模型资产的制作和游戏场景的搭建,均选用了具有 AI 能力的效率工具进行支持。</p> +<p>最终结论是,虽然在过程中会有这样那样的不顺手,但这些工具确实能够帮助他节约大量工作时长。</p> +<p>所以作者的看法是,他很愿意将 AI 工具看作他的同事。</p> +<p>照这么说的话,留给人类的工作真的是不多了。</p> +<h3 id="chatgpt-学习笔记">ChatGPT 学习笔记</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-13-32-44.png" +width="600" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="178" +data-flex-basis="427px" +> +ChatGPT 在春节后又起了一波热度。</p> +<p>网上到处都是关于它的段子,有人用它写论文,有人拿来给孩子辅导作业,有人写情书,有人当个动嘴的甲方让它写程序。</p> +<p>喜得微软恨不得现在就把它接到搜索引擎里,逼得谷歌提前释放出自己的类似模型。</p> +<p>国内的百度也表示将在3月份发出自己的大规模语言模型。</p> +<p>要我说就不要这么着急,不妨拨开迷雾,看看 ChatGPT 是个什么东东。</p> +<p>在网上发现这篇<a class="link" href="https://blog.csdn.net/v_JULY_v/article/details/128579457" target="_blank" rel="noopener" +>《ChatGPT 通俗笔记》</a>,讲述了这个模型的发展历程,以及一些基本的概念原理。</p> +<p>此类中文资料不多,给这篇文章作者点赞。</p> +<h3 id="视觉设计的一些规则">视觉设计的一些规则</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-13-49-28.png" +width="697" +height="357" +loading="lazy" +class="gallery-image" +data-flex-grow="195" +data-flex-basis="468px" +> +现在专业的界限越来越模糊,每个人都应该掌握一些基本的设计理念,以便在日常工作中输出的成果具备基本的美感。</p> +<p>这篇<a class="link" href="https://anthonyhobday.com/sideprojects/saferules/" target="_blank" rel="noopener" +>《视觉设计安全法则》</a>,浅显易读、明确具体,对于视觉设计活动很有指导意义。</p> +<p>看完之后无论是自己动手做 PPT 还是软件的 demo 原型,都可以用到。</p> +<p>我觉得甚至对于摄影构图、房屋装修都能有所借鉴,因为美是相通的。</p> +<h3 id="python-做后端开发的技术选型">Python 做后端开发的技术选型</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-13-57-37.png" +width="673" +height="314" +loading="lazy" +class="gallery-image" +data-flex-grow="214" +data-flex-basis="514px" +> +有时候想做一些 Web 应用的原型,Python 是我的首选语言,写起来顺手又省事,能节约不少时间。</p> +<p>但是由于用的不够深入,在选择开发框架的时候,稍微有些困惑。</p> +<p>比如同样都能提供快速的开发能力,Fastapi 和 Flask到底选哪个?</p> +<p>如果你也有跟我一样的疑惑,可以看看这篇<a class="link" href="https://www.turing.com/kb/fastapi-vs-flask-a-detailed-comparison" target="_blank" rel="noopener" +>《Fastapi 和 Flask 详细对比》</a>。</p> +<p>文章深度分析了这两个框架的异同以及所适用的工作场景。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://github.com/red-data-tools/YouPlot" target="_blank" rel="noopener" +>YouPlot</a>,控制台绘图工具,可以在控制台窗口用字符的方式进行绘图,支持柱状图、散点图等。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-14-10-37.png" +width="587" +height="355" +loading="lazy" +class="gallery-image" +data-flex-grow="165" +data-flex-basis="396px" +></p> +</li> +<li> +<p><a class="link" href="https://play-cs.com/zh/servers" target="_blank" rel="noopener" +>网页在线联机 CS1.6</a>,只需浏览器即可联机玩反恐精英 1.6,这个网站通过 WASM 技术将 CS 1.6 移植到了网页中运行,现代浏览器均可支持,第一次加载时间略长,但体验还算流畅,在线人员数量也挺多,随时可以匹配到。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-14-20-36.png" +width="811" +height="397" +loading="lazy" +class="gallery-image" +data-flex-grow="204" +data-flex-basis="490px" +></p> +</li> +<li> +<p><a class="link" href="https://fffuel.co/sssvg" target="_blank" rel="noopener" +>交互式 SVG 参考</a>,一个可以在线了解 SVG 图形标准细节的网站,提供交互式界面进行实时演示。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-14-25-38.png" +width="904" +height="428" +loading="lazy" +class="gallery-image" +data-flex-grow="211" +data-flex-basis="506px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/LunarFang416/url-animations" target="_blank" rel="noopener" +>浏览器地址栏里的动画</a>,一个有意思的 Js 库,通过动态修改浏览器地址栏的 URL 地址来实现动画,效果还比较萌。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-14-26-39.png" +width="757" +height="208" +loading="lazy" +class="gallery-image" +data-flex-grow="363" +data-flex-basis="873px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 018 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/Tue, 31 Jan 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/<h1 id="机器文摘-第-018-期">机器文摘 第 018 期</h1> +<h2 id="长文">长文</h2> +<h3 id="游戏高清重制科林麦克雷拉力赛3">游戏高清重制《科林麦克雷拉力赛3》</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-09-15-47.png" +width="857" +height="434" +loading="lazy" +class="gallery-image" +data-flex-grow="197" +data-flex-basis="473px" +> +游戏高清重制一直是我比较感兴趣的话题,可能因为比较喜欢怀旧吧。</p> +<p>我曾经收藏过采用覆盖显示驱动的方式进行高清分辨率支持的《极品飞车 5》、《Quake 3》等游戏。</p> +<p>也见过一些更古老的游戏在更新资源包之后重新焕发青春。</p> +<p>不过一直没有接触过真正的重制过程。</p> +<p>这篇<a class="link" href="https://cookieplmonster.github.io/2023/01/15/remastering-colin-mcrae-rally-3-silentpatch/" target="_blank" rel="noopener" +>《重制科林麦克雷拉力赛》</a>详细记录了一个优秀的赛车游戏进行高清重制的过程。</p> +<p>可以带你了解老旧游戏如何进行“宽屏”、“超宽屏”支持,如何重制高清界面UI元素等,过程充满了对不可能的挑战。</p> +<h3 id="把网页渲染到控制台">把网页渲染到控制台</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-09-24-01.png" +width="1067" +height="464" +loading="lazy" +class="gallery-image" +data-flex-grow="229" +data-flex-basis="551px" +> +通过控制台窗口进行上网,你可能觉得并不新鲜。</p> +<p>毕竟已经有很多类似 w3m 这种在控制台下基于字符的浏览器程序。</p> +<p>但是他们的缺点都是不能显示图形,而且几乎失去了对页面的样式渲染。</p> +<p>今天这篇<a class="link" href="https://fathy.fr/carbonyl" target="_blank" rel="noopener" +>《把网页渲染到控制台》</a>则另辟蹊径,虽然同样是在控制台的字符界面,但是渲染手段却大不相同。</p> +<p>它将控制台字符当作单个像素来处理,采用现代浏览器内核进行页面解析和预渲染计算。</p> +<p>然后在像素渲染阶段,采用了控制台字符来进行替换。</p> +<p>虽然最终效果无法跟图形界面下的浏览器相比。</p> +<p>但是它毕竟提供了一种在终端控制台进行图形化网页显示的可能。</p> +<h3 id="chromium-渲染流水线字节码到像素的一生">Chromium 渲染流水线——字节码到像素的一生</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-09-32-37.png" +width="481" +height="580" +loading="lazy" +class="gallery-image" +data-flex-grow="82" +data-flex-basis="199px" +> +看了前面网页渲染到控制台的文章,如果对浏览器的原理架构比较感兴趣的话。</p> +<p>可以看看这篇<a class="link" href="https://zhuanlan.zhihu.com/p/574069391" target="_blank" rel="noopener" +>讲解 Chromium 浏览器渲染架构</a>的文章。</p> +<p>现代浏览器已经复杂到不可能通过个人从零开始实现。</p> +<p>了解一下他们的架构,即便不从事相关开发,也可能对自己的软件架构产生有益影响。</p> +<h3 id="99-行代码实现光线追踪">99 行代码实现光线追踪</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-09-40-20.png" +width="702" +height="235" +loading="lazy" +class="gallery-image" +data-flex-grow="298" +data-flex-basis="716px" +> +光线追踪在图形渲染中十分关键的概念。</p> +<p>同时也是现代电影工业实现逼真光照渲染所必须的技术手段。</p> +<p>然而它的原理却并不复杂,甚至只需少量代码就可以自己实现一个建议的渲染器。</p> +<p>这篇<a class="link" href="http://kevinbeason.com/smallpt/" target="_blank" rel="noopener" +>《99 行代码实现光线追踪》</a>就只是用了少量 C++ 代码实现了一个简单的带有全局光照、阴影、反射的场景渲染。</p> +<p>虽然看起来简单,效果还是很令人惊艳的。</p> +<p>适合我这种喜欢研究原理,但又不太深入的“技术爱好者”。</p> +<h3 id="光线追踪深入">光线追踪深入</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-09-47-14.png" +width="731" +height="333" +loading="lazy" +class="gallery-image" +data-flex-grow="219" +data-flex-basis="526px" +> +既然前面提到了光线追踪,不妨再引申一下。</p> +<p>很多光线追踪的入门教程都会教你渲染一些简单的模型,比如球体,圆柱体等等。</p> +<p>如果想基于光线追踪技术渲染复杂一些的三维模型,应该怎么做?</p> +<p>这里有一篇<a class="link" href="https://jamie-wong.com/2016/07/15/ray-marching-signed-distance-functions/" target="_blank" rel="noopener" +>《光线行进和符号距离函数》</a>,里面介绍了基于光线行进算法(光线追踪的一种实现方式)和符号距离函数来构建三维场景中复杂模型的思路。</p> +<p>内容比较详细,并带有示例代码。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://www.chronophoto.app/game.html" target="_blank" rel="noopener" +>chronophoto</a>,一个猜照片年代的游戏,根据网站随机展示的老照片,来判断这张照片是哪一年拍摄的,答案区间 1900 到 2020 ,我试了试还挺有意思,可以根据照片中出现的物品和人物的衣着进行分析。<br> +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-09-56-50.png" +width="944" +height="432" +loading="lazy" +class="gallery-image" +data-flex-grow="218" +data-flex-basis="524px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/GimelStudio/GimelStudio" target="_blank" rel="noopener" +>Gimel Studio</a>,一个基于节点系统的照片后期处理工具,开源,采用 Python 编写。<br> +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-10-00-55.png" +width="1009" +height="537" +loading="lazy" +class="gallery-image" +data-flex-grow="187" +data-flex-basis="450px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/vitoplantamura/BugChecker" target="_blank" rel="noopener" +>BugChecker</a>,一个支持 Windows 11 的类 SoftICE 调试器,开源。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-10-04-14.png" +width="649" +height="376" +loading="lazy" +class="gallery-image" +data-flex-grow="172" +data-flex-basis="414px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/google/swiftshader" target="_blank" rel="noopener" +>swiftshader</a>,一个基于 CPU 实现 OpenGL 渲染的图形库。主要应用在谷歌开源的 chromium 项目里,用纯软件算法实现了OpenGL、Vulkan图形接口。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-10-08-42.png" +width="308" +height="307" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 017 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/Mon, 16 Jan 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/<h1 id="机器文摘-第-017-期">机器文摘 第 017 期</h1> +<p><em>预计春节期间暂停更新,节后恢复。</em></p> +<h2 id="长文">长文</h2> +<h3 id="怎样在-1-位色深的-lcd-屏幕上显示灰度httpswwwzephraymepostgrayscale_lcd"><a class="link" href="https://www.zephray.me/post/grayscale_lcd/" target="_blank" rel="noopener" +>怎样在 1 位色深的 LCD 屏幕上显示灰度</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-09-33-34.png" +width="1920" +height="1080" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +> +只有 1 位色深的 LCD 屏幕按理说是不能显示灰度的,因为他的像素点要么纯黑、要么纯白,显示的图案效果肯定非常差。</p> +<p>如果说非要显示灰度的话,我第一个想法是通过<a class="link" href="https://zh.wikipedia.org/wiki/%E6%8A%96%E5%8B%95_%28%E6%95%B8%E4%BD%8D%E8%A8%8A%E8%99%9F%E8%99%95%E7%90%86%29" target="_blank" rel="noopener" +>抖动算法</a>进行模拟(即通过像素点的稀疏程度来制造错觉,如下图)。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-09-40-49.png" +width="180" +height="215" +loading="lazy" +class="gallery-image" +data-flex-grow="83" +data-flex-basis="200px" +></p> +<p>然而这篇文章的作者采取了更为巧妙地方法,使用 PWM (脉冲宽度调制)技术,利用每个像素点的点亮时间不同来制造灰度错觉。</p> +<p>之前只是见过使用 PWM 调整 LED 灯泡的亮度,像这种用法我倒是第一次见。</p> +<h3 id="作为一名数据工程师和作家我为什么要用-neovimhttpswwwsspaeticomblogwhy-using-neovim-data-engineer-and-writer-2023"><a class="link" href="https://www.sspaeti.com/blog/why-using-neovim-data-engineer-and-writer-2023/" target="_blank" rel="noopener" +>作为一名数据工程师和作家,我为什么要用 (Neo)vim</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-09-44-27.png" +width="500" +height="264" +loading="lazy" +class="gallery-image" +data-flex-grow="189" +data-flex-basis="454px" +></p> +<p>很多人都被 Vim 复杂的功能和陡峭的学习曲线吓到过。</p> +<p>也有很多人本着对效率的极致追求,而选择了征服 Vim,从而走上高效(折腾)的路线。</p> +<p>本文作者作为一名数据工程师,讲述了他学习 Vim 的心路历程,也许对于现在还在观望的人有所启发。</p> +<p>我个人使用 Vim 已十多年时间,虽然从未触及特别深入的技能(如宏定义、寄存器等),但是 Vim 这种神器的特点就是,只要你忍者难受越过操作的及格线,剩下的技能你稍微多掌握一点,就能马上给你带来非常丰厚的回报。</p> +<h3 id="焦散是什么如何正确地渲染焦散httpswwwchaoscomcnblogwhat-are-caustics-and-how-to-render-them-the-right-way"><a class="link" href="https://www.chaos.com/cn/blog/what-are-caustics-and-how-to-render-them-the-right-way" target="_blank" rel="noopener" +>焦散是什么?如何正确地渲染焦散?</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-09-55-28.png" +width="850" +height="469" +loading="lazy" +class="gallery-image" +data-flex-grow="181" +data-flex-basis="434px" +> +焦散(Caustics)在现实生活中随处可见,但在渲染图中却很稀有。这篇文章解答了为什么渲染焦散很难,以及有哪些方法可以迂回实现。</p> +<p>找到这篇文章是因为我在 Github 上发现了<a class="link" href="https://github.com/pmndrs/drei#caustics" target="_blank" rel="noopener" +>一个使用 webgl 实现焦散渲染的项目</a>,效果非常不错,于是想研究一下背后的原理。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-10-02-22.png" +width="652" +height="339" +loading="lazy" +class="gallery-image" +data-flex-grow="192" +data-flex-basis="461px" +></p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://refactoringguru.cn/design-patterns" target="_blank" rel="noopener" +>常用设计模式有哪些</a>,一本在线电子书,图文并茂,以比较直观的方式介绍了软件开发常用的设计模式,支持英文、日文、中文等多国语言。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-10-04-26.png" +width="673" +height="357" +loading="lazy" +class="gallery-image" +data-flex-grow="188" +data-flex-basis="452px" +></p> +</li> +<li> +<p><a class="link" href="https://abseil.io/resources/swe-book/html/toc.html" target="_blank" rel="noopener" +>谷歌的软件工程</a>,好几年前的一本书,讲述在谷歌做软件开发的体验和最佳实践,现在出了可免费阅读的电子版。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-10-04-41.png" +width="504" +height="662" +loading="lazy" +class="gallery-image" +data-flex-grow="76" +data-flex-basis="182px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/ToolJet/ToolJet" target="_blank" rel="noopener" +>开源低代码开发框架 ToolJet</a>,免费开源的低代码开发框架,带有可视化编辑器,从数据持久化到前端界面全部无需编写代码。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-10-08-12.png" +width="795" +height="414" +loading="lazy" +class="gallery-image" +data-flex-grow="192" +data-flex-basis="460px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/Eandrju/cellular-automaton.nvim" target="_blank" rel="noopener" +>一个无聊的 Neovim 插件</a>,一个没啥用的 Neovim 插件,唯一能做的事情是当你感到无聊时,可以将你的文本编辑区里的文本执行一个“元胞自动机”动画,看起来还算解压。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-10-11-33.png" +width="547" +height="614" +loading="lazy" +class="gallery-image" +data-flex-grow="89" +data-flex-basis="213px" +></p> +</li> +<li> +<p><a class="link" href="https://www.futurepedia.io/" target="_blank" rel="noopener" +>最大的 AI 工具箱</a>,喜欢研究 AI 的不要错过这个网站,收集了各种 AI 模型的开源项目和相关网址,涵盖了图像识别、自然语言处理等常见的、时兴的 AI 技术。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-10-15-15.png" +width="1151" +height="729" +loading="lazy" +class="gallery-image" +data-flex-grow="157" +data-flex-basis="378px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 016 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/Tue, 10 Jan 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/<h1 id="机器文摘-第-016-期">机器文摘 第 016 期</h1> +<h2 id="长文">长文</h2> +<h3 id="黑客与汽车httpssamcurrynetweb-hackers-vs-the-auto-industry"><a class="link" href="https://samcurry.net/web-hackers-vs-the-auto-industry/" target="_blank" rel="noopener" +>黑客与汽车</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-13-16-50.png" +width="680" +height="414" +loading="lazy" +class="gallery-image" +data-flex-grow="164" +data-flex-basis="394px" +> +现在的汽车很多都具有联网的能力,可以通过互联网进行便利的远程操作。</p> +<p>比如获取汽车位置、健康状态、远程启动、远程开门等等。</p> +<p>作为消费者来说,在使用这些便利功能的时候,内心是十分信任厂商的。</p> +<p>觉得安全问题肯定会被厂商非常重视,作为头号问题来抓。</p> +<p>然而这篇<a class="link" href="https://samcurry.net/web-hackers-vs-the-auto-industry/" target="_blank" rel="noopener" +>《黑客与汽车》</a>却改变了我的看法,原来这些车联网的安全防护如此的脆弱。</p> +<p>文章作者为业内人士,写的还比较实在。如下列举部分这些黑客可以对车进行的未授权操作:</p> +<ol> +<li>远程发动机启停、车门解锁与锁定、大灯闪烁、喇叭鸣笛;</li> +<li>锁定用户,迁移管理权;</li> +<li>根据车架号下载到用户的销售档案;</li> +<li>远程刷新更新车辆电脑固件;</li> +<li>跟踪车辆物理GPS位置;</li> +</ol> +<p>看完我感觉是不是得把我的相关车联网服务给停一停了。</p> +<h3 id="汇编代码阅读指南httpswwwtimdbgcompostsfakers-guide-to-assembly"><a class="link" href="https://www.timdbg.com/posts/fakers-guide-to-assembly/" target="_blank" rel="noopener" +>汇编代码阅读指南</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-13-30-23.png" +width="1061" +height="636" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="400px" +> +写汇编代码很麻烦,阅读起来也很费劲吗?</p> +<p>这儿有<a class="link" href="https://www.timdbg.com/posts/fakers-guide-to-assembly/" target="_blank" rel="noopener" +>一份简要的汇编阅读指南</a>,作者介绍了一些汇编代码的阅读技巧。</p> +<p>因为根据统计显示,最常用的汇编指令也就那么十来个,所以并没有想象中的那么晦涩和高深莫测。</p> +<h3 id="使用-svg-绘制逼真的绳索httpsmuffinmanioblogdraw-svg-rope-using-javascript"><a class="link" href="https://muffinman.io/blog/draw-svg-rope-using-javascript/" target="_blank" rel="noopener" +>使用 SVG 绘制逼真的绳索</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-13-38-11.png" +width="786" +height="342" +loading="lazy" +class="gallery-image" +data-flex-grow="229" +data-flex-basis="551px" +> +SVG 是在网页中进行矢量绘图的技术,比起 Canvas 画板的像素图像,SVG 具有放大不失真的特点,在网页中可以通过 Javascript 操作生成 SVG 图形对象,实现各种复杂的图案。</p> +<p>这篇文章的作者从几何的角度考虑了如何使用矢量图形来绘制一个现实中的麻绳图案,要不仅体现出绳索的扭曲,还要正确表现绳索分支之间的叠压,作者提出了一个巧妙的使用 SVG path 进行实现的方法。还给出了代码。</p> +<p>你要问作者为什么这么做,有什么用没有?我想作者可能会回答:Because I can !</p> +<h3 id="ssh-进阶用法介绍httpsplantegggithubio20190602e58fb2e4b88ae69c80e585a8_ssh_e69a97e9bb91e68a80e5b7a7e8afa6e8a7a3--e694b6e8978fe4bf9de5b9b3e5ae89"><a class="link" href="https://plantegg.github.io/2019/06/02/%E5%8F%B2%E4%B8%8A%E6%9C%80%E5%85%A8_SSH_%E6%9A%97%E9%BB%91%E6%8A%80%E5%B7%A7%E8%AF%A6%E8%A7%A3--%E6%94%B6%E8%97%8F%E4%BF%9D%E5%B9%B3%E5%AE%89/" target="_blank" rel="noopener" +>SSH 进阶用法介绍</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-13-55-02.png" +width="800" +height="480" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="400px" +></p> +<p>经常在 Linux 系统下进行开发或者运维的专业人士,可能每天使用最多的工具就是 SSH 了,每天都要通过它登录服务端系统,进行一系列的操作。</p> +<p>这里<a class="link" href="https://plantegg.github.io/2019/06/02/%E5%8F%B2%E4%B8%8A%E6%9C%80%E5%85%A8_SSH_%E6%9A%97%E9%BB%91%E6%8A%80%E5%B7%A7%E8%AF%A6%E8%A7%A3--%E6%94%B6%E8%97%8F%E4%BF%9D%E5%B9%B3%E5%AE%89/" target="_blank" rel="noopener" +>有一篇文章</a>比较全面地介绍了 SSH 的进阶使用技巧,可以在某种程度上极大提升效率以及操作体验。</p> +<p>列举部分如下:</p> +<ol> +<li>如何免密码登录;</li> +<li>如何映射服务端的服务端口到本地(以方便调试);</li> +<li>如何将服务端的图形界面(如xcalc)代理到本地电脑显示和交互(不是远程桌面哦);</li> +<li>一些网络端口映射之类的高级操作;</li> +</ol> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://gist.github.com/sbabybird/c340dee0fbec2e1dfe4a1c49d311cf4b" target="_blank" rel="noopener" +>个人年终总结模板</a>,我做了一个基于 Markdown 语法的年终总结模板,方便梳理在编写个人总结时的思路,放在 github 上的 gist 里了,可以随意使用。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-13-57-40.png" +width="416" +height="486" +loading="lazy" +class="gallery-image" +data-flex-grow="85" +data-flex-basis="205px" +></p> +</li> +<li> +<p><a class="link" href="https://www.webdesignmuseum.org/" target="_blank" rel="noopener" +>web 网页设计博物馆</a>,一个保存古老网页设计的网站。记录了 1999 年到 2020 年各大公司的网页设计变迁。包括谷歌、亚马逊、苹果、任天堂、麦当劳等等。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-14-01-04.png" +width="918" +height="568" +loading="lazy" +class="gallery-image" +data-flex-grow="161" +data-flex-basis="387px" +></p> +</li> +<li> +<p><a class="link" href="https://allinone.tools/" target="_blank" rel="noopener" +>一站式网页工具大全</a>,一堆的在线工具汇总,包括图片处理、PDF格式转换、文字编码转换、密码生成、字符串加密解密等等,常用工具一网打尽。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-14-05-09.png" +width="1320" +height="570" +loading="lazy" +class="gallery-image" +data-flex-grow="231" +data-flex-basis="555px" +></p> +</li> +<li> +<p><a class="link" href="https://gamepad-tester.com/" target="_blank" rel="noopener" +>在线手柄测试工具</a>,打开网页即可测试游戏手柄的工作状态,按键是否灵敏,遥感是否有死区等等,非常方便。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-14-11-28.png" +width="930" +height="614" +loading="lazy" +class="gallery-image" +data-flex-grow="151" +data-flex-basis="363px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 015 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/Tue, 03 Jan 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/<h1 id="机器文摘-第-015-期">机器文摘 第 015 期</h1> +<h2 id="长文">长文</h2> +<h3 id="编程就是玩儿httpsaustinhenleycomblogprogrammingasplayhtml"><a class="link" href="https://austinhenley.com/blog/programmingasplay.html" target="_blank" rel="noopener" +>编程就是玩儿</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-13-43-13.png" +width="804" +height="355" +loading="lazy" +class="gallery-image" +data-flex-grow="226" +data-flex-basis="543px" +></p> +<p>对于程序员或者技术从业者来说,以一种什么样的心态工作将十分影响成果的产出。</p> +<p><a class="link" href="https://austinhenley.com/blog/programmingasplay.html" target="_blank" rel="noopener" +>这篇文章</a>的作者给大家分享了他自己的感受&mdash;-“不把编程视为严肃的工作、目标只是玩得开心、为了好玩而编程”。</p> +<p>他同时也是 <a class="link" href="https://news.ycombinator.com/item?id=27256867" target="_blank" rel="noopener" +>《为什么我喜欢做无用的东西》</a>帖子的作者。</p> +<p>除了文章本身之外,<a class="link" href="https://news.ycombinator.com/item?id=34086416" target="_blank" rel="noopener" +>在 HN 配套的讨论帖子在这里</a>。</p> +<p>这种类似于“寓教于乐”、“做自己开心的事儿”等等内容,一直是一个值得探讨的话题。</p> +<p>我个人也倾向于以兴趣和爱好来驱动自己,只是如果这个兴趣和爱好顺便能够挣钱,那就更好了。</p> +<h3 id="webassembly没有容器的-dockerhttpswasmlabsdevarticlesdocker-without-containers"><a class="link" href="https://wasmlabs.dev/articles/docker-without-containers/" target="_blank" rel="noopener" +>WebAssembly:没有容器的 Docker</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-13-45-15.png" +width="3483" +height="1436" +loading="lazy" +class="gallery-image" +data-flex-grow="242" +data-flex-basis="582px" +></p> +<p>最近 <a class="link" href="https://www.docker.com" target="_blank" rel="noopener" +>Docker</a> 宣布与 <a class="link" href="https://github.com/WasmEdge/Wasmedge" target="_blank" rel="noopener" +>WasmEdge</a> 合作支持 WebAssembly 。</p> +<p>WebAssembly 和 Docker 我们都听说过,在前面的文摘中我还尝试过自己使用 Rust 编写运行在网页里的 WebAssembly 应用程序。</p> +<p>Docker 也是我工作中每天都要用到的容器技术。</p> +<p>那他们两个有什么关系?放在一起能碰撞出什么火花?</p> +<p><a class="link" href="https://wasmlabs.dev/articles/docker-without-containers/" target="_blank" rel="noopener" +>这篇文章</a>将讲解这两种技术的结合在云原生架构下的使用。</p> +<p>看来 WebAssembly 技术不仅可以在浏览器环境中发挥作用,还能在云计算、边缘计算等领域发光发热,前途不可限量嘛。</p> +<h3 id="3d-摄影测量建模技术httpswwwjeffgeerlingcomblog2021modeling-my-grandpa-3d-photogrammetry"><a class="link" href="https://www.jeffgeerling.com/blog/2021/modeling-my-grandpa-3d-photogrammetry" target="_blank" rel="noopener" +>3D 摄影测量建模技术</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-13-58-29.png" +width="712" +height="340" +loading="lazy" +class="gallery-image" +data-flex-grow="209" +data-flex-basis="502px" +></p> +<p>3D 摄影测量建模,是一种通过对物体多角度拍摄照片,然后使用计算机通过软件算法合成为 3D 模型的技术。</p> +<p>从最开始在专业领域(如:建筑工程、考古)使用,到现在已经普及到普通人只需安装手机 App 也能轻松实现了。</p> +<p>这篇<a class="link" href="https://www.jeffgeerling.com/blog/2021/modeling-my-grandpa-3d-photogrammetry" target="_blank" rel="noopener" +>用3D摄影测量法对我的爷爷建模</a>记述了作者如何使用 3D 摄影测量建模技术给自己爷爷的雕像进行“数字化”的过程。</p> +<p>里面详细记录了整个过程所使用的开源软件和相关的配置细节。</p> +<p>对于一些想要进行一次实操演练的朋友来说可能有用。</p> +<h3 id="在-2d-游戏中如何模拟-3d-的光影效果httpswwwgamedevelopercomprogramminggraveyard-keeper-how-the-graphics-effects-are-made"><a class="link" href="https://www.gamedeveloper.com/programming/graveyard-keeper-how-the-graphics-effects-are-made" target="_blank" rel="noopener" +>在 2D 游戏中如何模拟 3D 的光影效果</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-14-14-17.png" +width="454" +height="265" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="411px" +></p> +<p>《守墓人》是一款经典的 2D 角色扮演游戏,比起它的精彩剧情和有趣的玩法,出色的画面效果也是该游戏取得成功的重要原因。</p> +<p>这篇<a class="link" href="https://www.gamedeveloper.com/programming/graveyard-keeper-how-the-graphics-effects-are-made" target="_blank" rel="noopener" +>《守墓人的图形效果是如何制作的》</a>文章,由该游戏的核心开发者于 2018 年发表,讲述了很多关于实现在 2D 画面带来更加有立体光影效果的特殊技巧。</p> +<p>文章虽然老了一点,但是技术没有过时。</p> +<p>读进去可以深深体会到:一个优秀作品的创造,离不开对各种不可能的挑战和极限的突破。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://bluemaxima.org/flashpoint/" target="_blank" rel="noopener" +>Flash 游戏大全</a>,上一期里我摘录了一个关于复刻 Flash 游戏的故事。后来也勾起了我对于 Flash 小游戏的怀念。便深入探索了一下现在这个阶段该如何再去运行那些老游戏。Flashpoint 是一个 Web 游戏保存工程,号称已经累计保存了包括 Flash 在内的 35 个平台的超过十万个小游戏。这个工程在 2018 年 1 月启动,试图在 Flash 消亡之前将之前的经典内容进行备份。现在提供两种版本的下载包,一种全量下载的大概 1.3 TB,包含了全部游戏。一种增量下载的,700多MB,只带了部分游戏,但是支持随下随玩。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-14-33-07.png" +width="1001" +height="382" +loading="lazy" +class="gallery-image" +data-flex-grow="262" +data-flex-basis="628px" +></p> +</li> +<li> +<p><a class="link" href="https://sweetcocoa.github.io/pop2piano_samples/" target="_blank" rel="noopener" +>根据音频自动生成钢琴旋律</a>,一个开源的 AI 模型,可以根据歌曲的音频识别出里面的旋律主线,并且使用钢琴演奏出来,效果十分神奇。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-14-41-36.png" +width="741" +height="456" +loading="lazy" +class="gallery-image" +data-flex-grow="162" +data-flex-basis="390px" +></p> +</li> +<li> +<p><a class="link" href="https://virtualconsoles.com/online-emulators/c64/" target="_blank" rel="noopener" +>C64 Emulator</a>,一个在线的 commodore 64 电脑模拟器,可以直接将磁盘镜像拖拽到网页上进行加载,页面还提供了虚拟键盘。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-14-44-02.png" +width="643" +height="733" +loading="lazy" +class="gallery-image" +data-flex-grow="87" +data-flex-basis="210px" +></p> +</li> +<li> +<p><a class="link" href="https://shadiao.pro/" target="_blank" rel="noopener" +>沙雕 App</a>,收集了各种有趣网站、工具的导航站,之前就关注过,最近好像升级了,喜欢恶搞的同学可以到里面找到一些比较有恶趣味的小程序。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-14-47-42.png" +width="676" +height="371" +loading="lazy" +class="gallery-image" +data-flex-grow="182" +data-flex-basis="437px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 014 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/Tue, 27 Dec 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/<h1 id="机器文摘-第-014-期">机器文摘 第 014 期</h1> +<h2 id="长文">长文</h2> +<h3 id="运行在单片机上的-qthttpsdecovardevblog20221224qt-on-mcu"><a class="link" href="https://decovar.dev/blog/2022/12/24/qt-on-mcu/" target="_blank" rel="noopener" +>运行在单片机上的 Qt</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-13-43-13.png" +width="684" +height="456" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="360px" +></p> +<p>尝试过给单片机写图形界面没有?</p> +<p>这篇 <a class="link" href="https://decovar.dev/blog/2022/12/24/qt-on-mcu/" target="_blank" rel="noopener" +>《Qt on MCU》 </a>比较系统的介绍了“为什么选择 Qt(一套开源图形界面库) 给单片机做界面”、“Qt 的基本架构”、“程序移植性”等相关问题。</p> +<p>读完可以较为全面地了解在单片机这种机能较弱的硬件设备上制作图形界面的基本思路和需要关注的问题。</p> +<h3 id="openwrtlede-搭建-syncthing-p2p-私有文件同步服务httpschenhemepostopenwrt-syncthing"><a class="link" href="https://chenhe.me/post/openwrt-syncthing/" target="_blank" rel="noopener" +>OpenWrt/LEDE 搭建 Syncthing p2p 私有文件同步服务</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-13-56-50.png" +width="1251" +height="730" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="411px" +></p> +<p>现在大家都不止一个电子终端设备,个人数字信息、各种数据文件的同步需求基本上是一个刚需。</p> +<p>有很多厂商提供了收费方案,比较常见的有国内的各种网盘、手机厂商提供的各种 Cloud 服务等等。</p> +<p>如果想基于家庭网络自己动手搭建一个私有服务的话,可能略微麻烦一些,不过也有较为成熟的方案了。</p> +<p>条件具备的话不妨参考这篇<a class="link" href="https://chenhe.me/post/openwrt-syncthing/" target="_blank" rel="noopener" +>《OpenWrt/LEDE 搭建 Syncthing p2p 私有文件同步服务》</a>动手试一试。</p> +<h3 id="用-flash-高清重制一款游戏httpswwwjiqizhixincomarticles2022-12-22-2"><a class="link" href="https://www.jiqizhixin.com/articles/2022-12-22-2" target="_blank" rel="noopener" +>用 Flash 高清重制一款游戏</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-13-58-23.png" +width="600" +height="338" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></p> +<p>Flash 基本已经成为历史了。</p> +<p>即便现在可以通过一些渠道或者浏览器勉强开启 Flash 插件的话,也会提心掉胆地担心计算机的安全性。</p> +<p>毕竟那些恼人的弹窗广告有 80% 都是靠 Flash 技术实现的。</p> +<p>但是还有这么一群人,他们玩着 4399 上的小游戏长大,80 后喜欢的各种主机游戏在他们眼里根本不值一提,倒是网页上那种基于 Flash 制作的即开即玩的小游戏(比如我能想到的就有:黄金矿工、狂扁小朋友、打企鹅等等)才是他们的最爱。</p> +<p>Flash 技术被时代抛弃,那些 4399 们也就逐渐消失了。</p> +<p>不过总有人会拥抱情怀,这篇<a class="link" href="https://www.jiqizhixin.com/articles/2022-12-22-2" target="_blank" rel="noopener" +>《为拯救童年回忆,开发者决定采用古法编程》</a>便讲述了这样一个故事。</p> +<p>里面的哥们儿以极其硬核的方式实现了他的梦想,为了复刻一个 Flash 小游戏,他几乎重新写了一个 Flash 播放器。</p> +<h3 id="unix-终端系统tty是如何工作的httpswaynervcompostshow-tty-system-works"><a class="link" href="https://waynerv.com/posts/how-tty-system-works/" target="_blank" rel="noopener" +>Unix 终端系统(TTY)是如何工作的</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-14-09-23.png" +width="2560" +height="2272" +loading="lazy" +class="gallery-image" +data-flex-grow="112" +data-flex-basis="270px" +></p> +<p>没有使用过大型机而直接进入 PC 时代的计算机用户,可能觉得“终端”就是电脑上那个能够输入 CMD 命令的黑乎乎窗口吧。</p> +<p>即便是终日与命令行打交道的软件开发人员、系统运维人员,可能也很难一下子解释清楚什么是“终端”,它为什么叫这个名字。</p> +<p>这篇<a class="link" href="https://waynerv.com/posts/how-tty-system-works/" target="_blank" rel="noopener" +>《Unix 终端系统(TTY)是如何工作的》</a>从计算机硬件发展的历史出发,介绍了计算机系统跟用户交互的发展历程,并针对“终端”系统进行详细展开,讲解了实现原理和后来发展的现代形态。</p> +<p>喜欢硬核知识的朋友可点进去阅读一下。</p> +<h3 id="hn-讨论极大提升你效率的软件有哪些httpsnewsycombinatorcomitemid34069106"><a class="link" href="https://news.ycombinator.com/item?id=34069106" target="_blank" rel="noopener" +>HN 讨论:极大提升你效率的软件有哪些?</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-14-16-52.png" +width="776" +height="403" +loading="lazy" +class="gallery-image" +data-flex-grow="192" +data-flex-basis="462px" +></p> +<p>哪些软件最能节约你的时间、解放你的双手、使你离不开它?</p> +<p>这个话题几乎每过一段时间就会被拿出来讨论一番。</p> +<p>每个人都有自己的偏爱。</p> +<p>不过,看看大家的讨论,说不定也能发现一些新鲜的软件,也许能更新一下自己的工具库也说不定。</p> +<blockquote> +<p>比如上面这篇帖子里,楼主提到的 <a class="link" href="https://github.com/BurntSushi/xsv" target="_blank" rel="noopener" +>这个 csv 工具</a> ,可以在命令行让你高效对 csv 文件进行快速检索、合并查询、切片等等。 +不过帖子里可能有人把节奏带偏了,在下面大吹特吹各种 IDE 软件,就仁者见仁了。</p> +</blockquote> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://huili.github.io/" target="_blank" rel="noopener" +>SQlite源码分析</a>,一本讲解 SQlite 源码的在线电子书,主要对 SQLite 数据库的实现机制和使用方法做了简要分析。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-14-25-49.png" +width="804" +height="424" +loading="lazy" +class="gallery-image" +data-flex-grow="189" +data-flex-basis="455px" +></p> +</li> +<li> +<p><a class="link" href="https://retrogame.com.ua/2022/03/moarstalgia-windows-98-3dfx-amp-dos-retro-gaming-pack/" target="_blank" rel="noopener" +>经典复古 win98 游戏合集</a>,一个游戏整合包,里面整合了若干在 Win98 系统下才能跑的老游戏,像初代的雷神之锤、半条命、极品飞车等等。提供了基于 DosBox 的虚拟系统,即开即用,性能还不错。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-14-33-08.png" +width="656" +height="387" +loading="lazy" +class="gallery-image" +data-flex-grow="169" +data-flex-basis="406px" +></p> +</li> +<li> +<p><a class="link" href="http://www.doshaven.eu/programming-tools/" target="_blank" rel="noopener" +>DOS 系统下的编程工具合集</a>,想要重温在 DOS 环境下编程的感受,这里有一套比较全面的工具合集,包括 QBASIC、TurboC 等开发环境,以及一些用于游戏开发的图形库、引擎。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-14-59-31.png" +width="908" +height="527" +loading="lazy" +class="gallery-image" +data-flex-grow="172" +data-flex-basis="413px" +></p> +</li> +<li> +<p><a class="link" href="https://humanbenchmark.com/dashboard" target="_blank" rel="noopener" +>给你自己跑个分</a>,现在一些硬件评测动不动就使用软件进行跑分,用以展示硬件之间的形成差异,这个网站提供了一组小游戏,可以考验你的短期记忆力、反应能力,并给你打分。也试试给自己跑个分吧。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-15-05-15.png" +width="900" +height="511" +loading="lazy" +class="gallery-image" +data-flex-grow="176" +data-flex-basis="422px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 012 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/Tue, 13 Dec 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/<h1 id="机器文摘-第-012-期">机器文摘 第 012 期</h1> +<h2 id="长文">长文</h2> +<h3 id="github-登录被第三方网站滥用了吗">Github 登录被第三方网站滥用了吗?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-13-30-19.png" +width="494" +height="491" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="241px" +> +为了方便账号注册,现在很多网站都提供了基于 Github 账号登录的方式。</p> +<p>我个人也更倾向于使用这种方式登录。</p> +<p>毕竟可以少填一些注册信息,减少思考密码的麻烦。</p> +<p>但是这样做有什么安全问题没有?</p> +<p>上周有一个<a class="link" href="https://news.ycombinator.com/item?id=33917962" target="_blank" rel="noopener" +>在 HackerNews 上的帖子</a>,有人遇到了在使用 Github 账号登录某些网站之后,导致他的账号莫名给别的仓库添 Star 的情况。</p> +<p>这引发了大家关于 Github 账号权限管理以及通过第三方鉴权进行账号登录和注册的讨论。</p> +<p>看完觉得在第三方鉴权授权时还是应该慎重使用才好。</p> +<h3 id="每个黑客都知道的命令行快捷键">每个黑客都知道的命令行快捷键</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-13-41-23.png" +width="926" +height="636" +loading="lazy" +class="gallery-image" +data-flex-grow="145" +data-flex-basis="349px" +> +在图形化界面、触控操作交互界面已经十分普及的今天,普通用户可能现在很少能接触到命令行操作了。</p> +<p>但是对于软件开发者、IT运维工程师来说,命令行还是属于离不开的操作界面。</p> +<p>而且对于有些工作任务来说,使用命令行完成起来要更加高效。</p> +<p><a class="link" href="https://www.masteringemacs.org/article/keyboard-shortcuts-every-command-line-hacker-should-know-about-gnu-readline" target="_blank" rel="noopener" +>这篇文章</a>讲解了常见命令行交互时的一些快捷操作,比如常见的行内编辑、快速移动光标到命令开头、历史记录搜索等等。</p> +<p>掌握之后可以在各种命令行交互界面中进行使用(基本风格一致)。</p> +<h3 id="基于颜色循环的动画技术">基于颜色循环的动画技术</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-13-54-06.png" +width="509" +height="383" +loading="lazy" +class="gallery-image" +data-flex-grow="132" +data-flex-basis="318px" +> +在计算机硬件资源匮乏的上世纪 90 年代,开发人员为了在有限条件下实现丰富的效果真是挖空心思。</p> +<p>比如,还记得 Windows 98 的启动画面吗?</p> +<p>蓝天白云,Windows 徽标,底部有一个蓝色的渐变色条,在缓慢的滚动。</p> +<p>实际上它只是一幅图片,并非多帧动画。</p> +<p>这就用到了一个叫做<a class="link" href="https://en.wikipedia.org/wiki/Color_cycling" target="_blank" rel="noopener" +>“颜色循环”</a>的技术。</p> +<blockquote> +<p>来自维基百科:颜色循环,也称为调色板移动,是计算机图形学中使用的一种技术,其中颜色被更改以产生动画的假象。这种技术主要用于早期的电脑游戏,因为存储一个图像并更改其调色板比将动画存储为几帧需要更少的内存和处理器能力。</p> +</blockquote> +<p><a class="link" href="http://www.effectgames.com/effect/article-Old_School_Color_Cycling_with_HTML5.html" target="_blank" rel="noopener" +>这里有个博客</a>使用 HTML Canvas 复刻了一批采用颜色循环创作的作品,效果非常惊艳。</p> +<p>另外网站还开源了用于展示这些作品的图形引擎,虽然现在已经不再维护了,但是用于学习和探索还是很有研究意义。</p> +<h3 id="软件逆向工程入门">软件逆向工程入门</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-14-06-08.png" +width="716" +height="442" +loading="lazy" +class="gallery-image" +data-flex-grow="161" +data-flex-basis="388px" +> +软件的加密和破解在普通用户眼里十分神秘。</p> +<p>这篇<a class="link" href="https://to-be-deleted-in-2022.emily.st/2015/01/27/reverse-engineering/" target="_blank" rel="noopener" +>软件逆向工程入门</a>比较深入浅出地介绍了一些常用手法,跟着作者可以浅尝一下在内存中寻找注册号、修改汇编指令以使得软件保护失效等体验。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="http://nifty.stanford.edu/" target="_blank" rel="noopener" +>计算机课后作业</a>,斯坦福大学计算机专业评选的历年来优秀作业作品。如果不知道自己编程需要练习什么的话,可以打开参考参考,很有实用价值,比起在 Leecode 上刷算法的题目,这些作业都在解决实际问题。</p> +</li> +<li> +<p><a class="link" href="https://scholar.archive.org/" target="_blank" rel="noopener" +>互联网档案学术</a>,全文检索索引包含超过2500万的研究文章和其他保存在互联网档案馆里的学术文档。 该馆藏涵盖从18世纪期刊的数字化副本,到最新的Open Access会议记录和从万维网上抓取的预印本。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-14-19-26.png" +width="1113" +height="507" +loading="lazy" +class="gallery-image" +data-flex-grow="219" +data-flex-basis="526px" +></p> +</li> +<li> +<p><a class="link" href="https://playcanvas.com/" target="_blank" rel="noopener" +>PlayCanvas Web 优先的游戏引擎</a>,一个免费的游戏引擎,倡导以 Web 优先,在网页中提供从开发到发行的全部流程支持。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-14-23-40.png" +width="961" +height="655" +loading="lazy" +class="gallery-image" +data-flex-grow="146" +data-flex-basis="352px" +></p> +</li> +<li> +<p><a class="link" href="https://asciinema.org/" target="_blank" rel="noopener" +>命令行会话记录器</a>,Asciinema 是一个免费开源软件,用于帮助用户录制在命令行中的操作行为,便于在互联网上分发自己的操作示范、教学演示。比起直接视频录屏的方式,这种以字符方式的记录更加节约资源,无论是记录、传播还是回放环节,都很轻量。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-14-29-43.png" +width="631" +height="383" +loading="lazy" +class="gallery-image" +data-flex-grow="164" +data-flex-basis="395px" +></p> +</li> +<li> +<p><a class="link" href="https://matthias-research.github.io/pages/tenMinutePhysics/index.html" target="_blank" rel="noopener" +>十分钟物理</a>,这套教程集合了一组十分钟左右的视频短片,每次介绍一个基本的物理概念并通过 Web 前端技术编程实现模拟。除了视频之外,网站还提供了源代码、演示环境等配套资源。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-14-32-47.png" +width="1191" +height="666" +loading="lazy" +class="gallery-image" +data-flex-grow="178" +data-flex-basis="429px" +></p> +</li> +<li> +<p><a class="link" href="http://skilldrick.github.io/easy6502/" target="_blank" rel="noopener" +>Easy6502</a>,一本学习 6502 汇编的电子书(没错,我就是特别喜欢这款 CPU)。网站带有交互界面,提供了一个简易模拟器,可以边学边练,教程最后会带你实现一个基于汇编的贪食蛇游戏。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-14-43-13.png" +width="608" +height="484" +loading="lazy" +class="gallery-image" +data-flex-grow="125" +data-flex-basis="301px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 013 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/Mon, 12 Dec 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/<h1 id="机器文摘-第-013-期">机器文摘 第 013 期</h1> +<h2 id="长文">长文</h2> +<h3 id="从古董电脑中我们能学到什么httpsgithubcomreadmefeaturedvintage-computing"><a class="link" href="https://github.com/readme/featured/vintage-computing" target="_blank" rel="noopener" +>从古董电脑中我们能学到什么</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-09-36-43.png" +width="1182" +height="689" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="411px" +></p> +<p>我也不知道为什么自己会对老旧电脑,尤其是上世纪80年代、90年代出品的电脑这么迷恋。</p> +<p>我觉得那个时代的电脑散发着一种难以名状的工业气质。</p> +<p>通过阅读<a class="link" href="https://github.com/readme/featured/vintage-computing" target="_blank" rel="noopener" +>这篇文章</a>,使我意识到一些深层次的原因。</p> +<p>这些老式电脑的魅力来自于当时技术的限制、简单粗暴和直接。</p> +<p>通过深入了解这些老古董、学习开发那个时代的软件,可以更容易地了解计算机科学。</p> +<p>毕竟,现在的计算机已经充分的复杂和“人性化”,软件把硬件包裹得越来越严实和抽象。以至于根本看不清它的内部构造和实现原理。</p> +<p>去研究那些古董电脑吧,操作那些裸漏单纯的硬件接口,贴近更加具体的科技。</p> +<h3 id="蛋httpwwwgalactanetcomoneofftheegg_zhhtml"><a class="link" href="http://www.galactanet.com/oneoff/theegg_zh.html" target="_blank" rel="noopener" +>蛋</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-09-49-07.png" +width="1024" +height="512" +loading="lazy" +class="gallery-image" +data-flex-grow="200" +data-flex-basis="480px" +></p> +<p>这是一篇很富有哲理的小小说,严格来说跟机器没有关系。</p> +<p>但是写的实在是很好,忍不住收录进来。</p> +<p>毕竟,喜欢机器的人,很难抗拒这种对宇宙天马行空的探索。</p> +<h3 id="rlhf-模型详解httpshuggingfacecoblogrlhf"><a class="link" href="https://huggingface.co/blog/rlhf" target="_blank" rel="noopener" +>RLHF 模型详解</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-09-54-30.png" +width="1450" +height="1338" +loading="lazy" +class="gallery-image" +data-flex-grow="108" +data-flex-basis="260px" +></p> +<p>近期 AI 圈最火的事情,莫过于 OpenAI 发布的聊天机器人 ChatGPT 了。</p> +<p>这个智能聊天机器人已经强大到可以让人担忧的地步了。</p> +<p>那么,它背后的实现原理是什么?</p> +<p><a class="link" href="https://huggingface.co/blog/rlhf" target="_blank" rel="noopener" +>这篇文章</a>讲解了 ChatGPT 所使用的 RLHF(人类反馈强化学习) 模型是如何实现的以及它的未来会怎样发展。</p> +<h3 id="基于扩散模型生成音乐httpswwwriffusioncomabout"><a class="link" href="https://www.riffusion.com/about" target="_blank" rel="noopener" +>基于扩散模型生成音乐</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-10-03-35.png" +width="540" +height="378" +loading="lazy" +class="gallery-image" +data-flex-grow="142" +data-flex-basis="342px" +></p> +<p>基于文本生成图像的扩散模型已经火了一段时间了。</p> +<p>我当时还在想,既然基于扩散模型可以生成图像的话,那能不能生成声音呢?</p> +<p>结果我只是动了动念头,人家这边已经把成果拿出来了。</p> +<p><a class="link" href="https://www.riffusion.com/about" target="_blank" rel="noopener" +>这篇文章</a>介绍了他们基于扩散模型生成音乐的项目。</p> +<p>我试听了一下,效果还不错,挺神奇的。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://ittavern.com/getting-started-with-tmux/" target="_blank" rel="noopener" +>tmux 入门</a>,一篇 tmux 的入门教程。tmux 是一个终端程序,可以同时模拟多个客户端控制台,如果觉得不好理解的话,可以认为它是一个控制台的多页签浏览器。因为在工作中经常需要 ssh 登录服务器进行编程开发,我现在已经离不开它了。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-10-12-18.png" +width="701" +height="419" +loading="lazy" +class="gallery-image" +data-flex-grow="167" +data-flex-basis="401px" +></p> +</li> +<li> +<p><a class="link" href="https://oimo.io/works/" target="_blank" rel="noopener" +>一个有趣的个人网站</a>,作者是一个日本在读博士生,网站放了一些个人的编程作品,主要跟物理模拟、像素艺术有关。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-10-14-33.png" +width="915" +height="450" +loading="lazy" +class="gallery-image" +data-flex-grow="203" +data-flex-basis="488px" +></p> +</li> +<li> +<p><a class="link" href="https://www.hello-algo.com/" target="_blank" rel="noopener" +>你好,算法</a>,一本开源电子书,可在线阅读,深入浅出讲解数据结构和算法,生动有趣,适合有一定编程基础但是算法这块有些薄弱的爱好者阅读。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-10-20-26.png" +width="3144" +height="2319" +loading="lazy" +class="gallery-image" +data-flex-grow="135" +data-flex-basis="325px" +></p> +</li> +<li> +<p><a class="link" href="https://nbviewer.org/github/gpeyre/numerical-tours/blob/master/python/ml_6_nn.ipynb" target="_blank" rel="noopener" +>神经网络在线教程</a>,一套神经网络编程教程,提供在线的 python 代码阅读环境,适合作为入门资料学习。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-10-23-10.png" +width="388" +height="262" +loading="lazy" +class="gallery-image" +data-flex-grow="148" +data-flex-basis="355px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 011 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/Wed, 07 Dec 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/<h1 id="机器文摘-第-011-期">机器文摘 第 011 期</h1> +<h2 id="长文">长文</h2> +<h3 id="自己动手做一个天气墨水屏">自己动手做一个天气墨水屏</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-13-22.png" +width="617" +height="455" +loading="lazy" +class="gallery-image" +data-flex-grow="135" +data-flex-basis="325px" +> +有个喜欢动手的哥们,发现了自己及家人的一项小需求,即从家出门的时候想快速知道天气情况。</p> +<p>虽然这种需求抬眼看一下手机也能实现,但是本着“懒惰使人进步”的核心思想(作者懒得掏出手机)他动手实现了一套基于电池供电的可以显示天气预报信息的电子墨水屏。</p> +<p>这篇<a class="link" href="https://kimmo.blog/posts/7-building-eink-weather-display-for-our-home/" target="_blank" rel="noopener" +>《做一个天气墨水屏》</a>记录了作者从诞生点子到产品出炉的全过程。</p> +<p>另外作者还开源了项目的源代码,<a class="link" href="https://github.com/kimmobrunfeldt/eink-weather-display" target="_blank" rel="noopener" +>可在这里获取</a>。</p> +<h3 id="m1-gpu-的故事">M1 GPU 的故事</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-21-23.png" +width="985" +height="614" +loading="lazy" +class="gallery-image" +data-flex-grow="160" +data-flex-basis="385px" +> +GPU 大家都知道,<a class="link" href="https://asahilinux.org/2022/11/tales-of-the-m1-gpu/" target="_blank" rel="noopener" +>这里有篇文章介绍了它的工作细节</a>。</p> +<p>作者来自一个给苹果 M1 芯片适配 Linux 驱动的团队(苹果官方不提供驱动,所以这意味着需要做一些逆向工程)。</p> +<p>本文记录了这些工作中比较有趣的部分,还顺便介绍了 GPU 的一些底层工作原理。</p> +<h3 id="在-commodore-64-上实现位图滚动条的显示">在 Commodore 64 上实现位图滚动条的显示</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-37-41.png" +width="386" +height="338" +loading="lazy" +class="gallery-image" +data-flex-grow="114" +data-flex-basis="274px" +> +Demosense 是一项挖掘计算机硬件机能极限的活动。</p> +<p>通常创作者们会通过各种编程技巧来实现看似无法达到的效果。</p> +<p>由于 Commodore 64 这台古董电脑十分经典,现在仍有不少Demosense爱好者在为它开发程序。</p> +<p><a class="link" href="https://www.c64demo.com/side-border-bitmap-scroller/" target="_blank" rel="noopener" +>这篇文章</a>讲述了著名 C64 demo 程序 <a class="link" href="https://csdb.dk/release/?id=195841" target="_blank" rel="noopener" +>Memento Mori</a> 的实现过程,程序在 Commodore 64 上显示了一副巨大(对于C64来说)的图片。</p> +<p>这在圈内属于首创。</p> +<h3 id="动手做一个-4-位-cpu">动手做一个 4 位 CPU</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-43-28.png" +width="496" +height="370" +loading="lazy" +class="gallery-image" +data-flex-grow="134" +data-flex-basis="321px" +> +计算机组成原理是不是还没学明白?没关系,我们可以自己亲手做一个简单的 CPU 。</p> +<p><a class="link" href="https://www.bigmessowires.com/nibbler/" target="_blank" rel="noopener" +>Nibbler</a> 是一款 4 位 CPU,使用标准 7400 系列逻辑芯片(单个计数器、寄存器、缓冲器和门)构建而成。是一个简单 CPU 的教育示例,易于理解和构建,但仍然能够运行游戏和其他有趣的程序。Nibbler 在 5 x 4 英寸(127 x 102 毫米)穿孔板上使用绕线制造。CPU总共包含17个芯片。</p> +<p>作者公开了设计图纸和相关资料,可在文章内部的链接中获取。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="http://www.craftinginterpreters.com/" target="_blank" rel="noopener" +>纯手撸一个解释器</a>,编译原理没学明白没关系,这本在线电子书手把手教你写一个自己的解释器。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-51-28.png" +width="593" +height="182" +loading="lazy" +class="gallery-image" +data-flex-grow="325" +data-flex-basis="781px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/k88hudson/git-flight-rules/blob/master/README_zh-CN.md" target="_blank" rel="noopener" +>Git 飞行规则 (Flight Rules)</a> ,一个十分全面的 Git 使用指南,把你能遇到的情况都想到了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-54-49.png" +width="532" +height="541" +loading="lazy" +class="gallery-image" +data-flex-grow="98" +data-flex-basis="236px" +></p> +</li> +<li> +<p><a class="link" href="https://thevaluable.dev/vim-advanced/" target="_blank" rel="noopener" +>Vim 高级进阶</a>,如果你已经学会了怎么退出 Vim,恭喜你,已经击败了 80% 的选手。想要在 Vim 中进行更高效的编辑操作,这份高手指南十分适合作为参考。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-57-10.png" +width="776" +height="511" +loading="lazy" +class="gallery-image" +data-flex-grow="151" +data-flex-basis="364px" +></p> +</li> +<li> +<p><a class="link" href="https://www.joshwcomeau.com/css/interactive-guide-to-flexbox/" target="_blank" rel="noopener" +>Flexbox 布局交互指南</a>,这篇在线教程讲解了如何使用 Flexbox 进行页面布局,难能可贵的是直接在页面中提供了交互操作界面,可以一遍学一遍实践,非常方便。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-59-27.png" +width="743" +height="448" +loading="lazy" +class="gallery-image" +data-flex-grow="165" +data-flex-basis="398px" +></p> +</li> +<li> +<p><a class="link" href="https://www.makesense.ai/" target="_blank" rel="noopener" +>在线 AI 标注工具</a>,想要训练自己的 AI 模型,比如目标检测、图像分类等等,可以使用这个在线工具进行数据标注,直接上传图片然后在线标注,完成后可导出 VOC、Coco 等格式的数据集。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-10-02-46.png" +width="628" +height="391" +loading="lazy" +class="gallery-image" +data-flex-grow="160" +data-flex-basis="385px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 010 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/Tue, 29 Nov 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/<h1 id="机器文摘-第-010-期">机器文摘 第 010 期</h1> +<h2 id="长文">长文</h2> +<h3 id="极客摄影指南">极客摄影指南</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-14-11-12.png" +width="1235" +height="841" +loading="lazy" +class="gallery-image" +data-flex-grow="146" +data-flex-basis="352px" +> +相机,也是机器的一种。</p> +<p>我用它记录生活,捕捉生活中转瞬即逝的美好瞬间。</p> +<p>有个问题一直困扰着我,怎样拍出不那么“到此一游”的照片?</p> +<p>怎样才能“掌控”相机这个机器?</p> +<p>这篇<a class="link" href="https://lcamtuf.coredump.cx/photo_basics/" target="_blank" rel="noopener" +>《极客摄影》(英文)</a>能够帮助你对摄影做一个真正深入的理解(而不是学习那些充斥社交平台的各种浮于表面的“技巧”)。</p> +<p>作者是一个热爱摄影的技术男,有二十多年摄影经验。</p> +<p>听他给你讲讲什么是“光”和“构图”。</p> +<p>一篇就够了。</p> +<h3 id="ms-dos-背后的设计">MS-DOS 背后的设计</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-14-24-37.png" +width="480" +height="512" +loading="lazy" +class="gallery-image" +data-flex-grow="93" +data-flex-basis="225px" +></p> +<p>包括我在内的不少 80 后接触电脑是从 MS-DOS 开始的。</p> +<p>对于它的黑窗口和命令行都有着很深的印象。</p> +<p>上大学时执行最多的命令是<code>format c: /s /q</code></p> +<p>当年还玩过不少在 DOS 平台的游戏,比如仙剑奇侠传、主题医院等等。</p> +<p>只是当时没工夫对系统本身做深入了解。</p> +<p>顶多是,自己在学习汇编语言时,对 DOS 又仔细端详了几眼。</p> +<p>这篇<a class="link" href="https://patersontech.com/Dos/Byte/InsideDos.htm" target="_blank" rel="noopener" +>《凑近看看 MS-DOS 》(英文)</a>,介绍了 DOS 系统的设计标准、内存分配、磁盘文件结构、FAT文件系统的技术细节等等。</p> +<p>想要窥探技术细节的可以点进去看看。</p> +<h3 id="构建最快的-lua-解释器">构建最快的 Lua 解释器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-14-45-43.png" +width="645" +height="386" +loading="lazy" +class="gallery-image" +data-flex-grow="167" +data-flex-basis="401px" +> +给动态语言编写解释器可能不算太难(如果只是能跑的话)。</p> +<p>但是如果要编写一个高性能的、好用的动态语言解释器,比如像谷歌浏览器所用的 V8 引擎那样,就比较困难了。</p> +<p><a class="link" href="https://sillycross.github.io/2022/11/22/2022-11-22/" target="_blank" rel="noopener" +>《构建最快的 Lua 解释器》</a>这篇文章站在更高维度提供一种方法,即:编写一种可以自动生成编译器(解释器)代码的程序,以使得制作高性能解释器变得更加容易。</p> +<p>我看了一下,大概就是自动化生成之前需要手工处理的编译器优化代码。作为编译原理学的不怎么明白的我,对此不敢评论。</p> +<h3 id="为什么-linux-内核没有单元测试">为什么 Linux 内核没有单元测试?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-15-14-46.png" +width="637" +height="411" +loading="lazy" +class="gallery-image" +data-flex-grow="154" +data-flex-basis="371px" +> +我对单元测试的态度一般,既不强烈支持,也不反对。</p> +<p>听说有的开发团队由于对于单元测试十分狂热,已经到了不允许写注释,都用单元测试替代的地步。</p> +<p>前不久,在 HN 上有网友发起了一个引战的讨论:“<a class="link" href="https://news.ycombinator.com/item?id=33742130" target="_blank" rel="noopener" +>既然单元测试这么好,为什么 Linux 内核源码不用呢?</a>”</p> +<p>以下为部分观点:</p> +<blockquote> +<p>单元测试被严重高估了,TDD有一些好主意,但有一段时间它变成了一种宗教。</p> +</blockquote> +<blockquote> +<p>单元测试与TDD宗教不是一回事。它只是意味着将事物划分为小单元并尽可能详尽地测试其功能。</p> +</blockquote> +<blockquote> +<p>SQLite不是反例吗?他们有更多的单元测试代码,而不是实际运行的代码。</p> +</blockquote> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://github.com/jackfrued/Python-100-Days" target="_blank" rel="noopener" +>Python 100 天从入门到精通</a>,Python 好学吗?好学又不好学,上手容易,精通难。这里有套开源教程囊括了从入门到实战应用(语言基础、数据处理、Web开发、网络开发、爬虫、深度学习等)的所有课程。这个仓库目前已经在 Github 上获得了 12 万star。可以说是好评如潮,想深入学习 Python 的不容错过。赶紧到我收藏夹里吃灰。</p> +</li> +<li> +<p><a class="link" href="https://wokwi.com/" target="_blank" rel="noopener" +>在线单片机模拟器</a>,想要学习单片机开发,又没有硬件设备吗?这个网站最合适。不需要担心手残不会电烙铁,也不用担心买不到芯片。直接在线进行模拟接线,直接运行编写的代码,结果实时展现。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-15-31-31.png" +width="878" +height="661" +loading="lazy" +class="gallery-image" +data-flex-grow="132" +data-flex-basis="318px" +></p> +</li> +<li> +<p><a class="link" href="https://slowroads.io/" target="_blank" rel="noopener" +>slow roads</a>,一个在线赛车游戏。基于网页制作。亮点在于作者实现了无限地图。所有地形和道路均使用程序生成。游戏有自动驾驶模式,如果只想观赏路边风景的话,可以开启。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-15-36-44.png" +width="1736" +height="855" +loading="lazy" +class="gallery-image" +data-flex-grow="203" +data-flex-basis="487px" +></p> +</li> +<li> +<p><a class="link" href="https://tic80.com/" target="_blank" rel="noopener" +>TIC-80</a>,TIC-80 是一台用于制作、播放和分享小型游戏的幻想计算机。有内置的开发工具:代码、sprites、地图、声音编辑器和命令行,这足以创建一个迷你复古游戏。在退出时,你将得到一个盒式文件,它可以在网站上存储和播放。 +另外,游戏可以打包成一个播放器,可以在所有流行的平台上运行,并按你的意愿分发。为了制作一个复古风格的游戏,整个创作过程是在一些技术限制下进行的。240x136 像素的显示屏,16 种颜色的调色板,256 个 8x8 的彩色 sprites,4 channel sound 等等。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-15-42-20.png" +width="490" +height="279" +loading="lazy" +class="gallery-image" +data-flex-grow="175" +data-flex-basis="421px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 009 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/Mon, 21 Nov 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/<h1 id="机器文摘-第-009-期">机器文摘 第 009 期</h1> +<h2 id="长文">长文</h2> +<h3 id="游戏中的精灵">游戏中的“精灵”</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-21-14-24-20.png" +width="729" +height="409" +loading="lazy" +class="gallery-image" +data-flex-grow="178" +data-flex-basis="427px" +> +<a class="link" href="https://zh.wikipedia.org/wiki/%E7%B2%BE%E7%81%B5%E5%9B%BE" target="_blank" rel="noopener" +>精灵(sprite)</a>这个词来自古法语单词“esprit”,意思是“精神”——源自拉丁语“spiritus”。在民间传说中,精灵是活泼、俏皮和神奇的小生物。然而对于游戏开发者来说,它又是另一个含义了。</p> +<p>这篇<a class="link" href="https://wireframe.raspberrypi.com/articles/the-surprising-history-of-sprites" target="_blank" rel="noopener" +>《精灵的惊人历史》(英文)</a>,介绍了不同的游戏厂商,在早期硬件机能有限的条件下,如何实现“角色在屏幕上移动”这个现在看似十分简单的事情的。</p> +<p>对于不了解“精灵”的含义的,稍作如下解释:</p> +<blockquote> +<p>2D 游戏在处理需要动起来的角色时,出于性能考虑,将一部分图形的绘制与背景画面的绘制分开,对于频繁需要刷新(动起来的)部分,单独处理,使他们感觉像是漂浮在背景画面的“幽灵”似的,故名“精灵”。</p> +</blockquote> +<h3 id="任天堂-nes-的一些技术细节">任天堂 NES 的一些技术细节</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-21-14-41-33.png" +width="507" +height="477" +loading="lazy" +class="gallery-image" +data-flex-grow="106" +data-flex-basis="255px" +> +NES 是任天堂推出一款极其成功的家用游戏机(NES : Nintendo Entertainment ,System 是其在北美发售的名称,亚洲叫 FC :Family Computer),不少80、90后的朋友应该都玩过(或者是国内山寨厂商仿制的*霸王之类)。</p> +<p>NES 使用极其经典的 6502 CPU。这块 CPU 有多经典呢,苹果的 Apple1代2代 、史上销量第一的个人电脑 Commodore 64 、国内早年比较流行的文曲星等,使用的都是这个 CPU。</p> +<p><a class="link" href="https://medium.com/@fogleman/i-made-an-nes-emulator-here-s-what-i-learned-about-the-original-nintendo-2e078c9b28fe" target="_blank" rel="noopener" +>《我做了一个 NES 模拟器》(英文)</a>,这篇文章的作者在编写模拟器的过程中挖出了不少技术细节,里面还提到了硬件存在的各种 BUG (没错,要模拟的话必须连 BUG 都得模拟,不然有些游戏玩不了),想要了解的朋友可以点进去看一下。</p> +<p>作为模拟器爱好者,我对 6502 处理器非常好奇,一度希望自己动手也实现一个,而且这款处理器真的非常适合模拟器入门,毕竟只有三个寄存器和百十条指令。</p> +<p><a class="link" href="https://github.com/fogleman/nes" target="_blank" rel="noopener" +>文中提到的 NES 模拟器在 Github 上开放了源码</a>,有兴趣的可以学习。</p> +<h3 id="一个桌面开发程序员为了学习-javascript-而手撸了一个基于-webgl-的游戏引擎">一个桌面开发程序员为了学习 Javascript 而手撸了一个基于 WebGL 的游戏引擎</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-21-15-11-11.png" +width="780" +height="448" +loading="lazy" +class="gallery-image" +data-flex-grow="174" +data-flex-basis="417px" +> +学习一样技能最好的方式就是动手去做。</p> +<p>当我感叹牛人怎么那么厉害的时候,往往忽略了牛人的学习过程。</p> +<p>以为他们天生就那样。</p> +<p>事实上他们的技能也是靠努力训练得来的。</p> +<p>不过,学习方法确实很重要。</p> +<p><a class="link" href="http://zephyrosanemos.com/" target="_blank" rel="noopener" +>《我对 Javascript 的尝试》(英文)</a>,这篇文章的作者原本是一个桌面程序开发者(类似 CAD 软件之类)。</p> +<p>他突然想要学习前端开发,掌握 Javascript 语言。</p> +<p>于是结合自己之前的知识,使用前端技术做了一套很优秀的 Demo 程序,一个性能和外观都很不错的游戏引擎。</p> +<p>文章里作者详细介绍了实现过程中对技术、算法的选择等等。</p> +<p>内容很长,但还算友好,比较干货。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://roadmap.sh/" target="_blank" rel="noopener" +>开发者之路</a>,汇总了各个技术路线的学习资料,包括前端、后端、运维、计算机科学、区块链、移动端、质量管理等等。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-21-15-24-33.png" +width="753" +height="455" +loading="lazy" +class="gallery-image" +data-flex-grow="165" +data-flex-basis="397px" +> +总之极其全面。 +目前在 Github 有两百多万个 star,被 fork 了 三十多万次。</li> +<li><a class="link" href="https://crxdl.com/" target="_blank" rel="noopener" +>chrome 插件下载</a>,访问谷歌浏览器插件商店有困难吗?试试这个网站,可以直接下载插件的包文件,下载后拖入浏览器即可安装。不过我已经转换到微软的 Edge 阵营了,用不到这个了。</li> +<li><a class="link" href="https://www.toptal.com/developers/css3maker" target="_blank" rel="noopener" +>CSS3 生成器</a>,对于 CSS 的属性参数总是记不住,这个网站就很适合我。每次要调背景渐变、圆角、阴影、动画曲线等等,都得现去搜。有了这个网站,在线点点拖拖,直接复制代码即可。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-21-15-33-35.png" +width="1288" +height="660" +loading="lazy" +class="gallery-image" +data-flex-grow="195" +data-flex-basis="468px" +></li> +<li><a class="link" href="https://tesseract.projectnaptha.com/" target="_blank" rel="noopener" +>tesseract.js</a>,可直接在浏览器里运行的 OCR 引擎,支持多国语言(超过 100 种)文字识别。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-21-16-16-10.png" +width="1039" +height="439" +loading="lazy" +class="gallery-image" +data-flex-grow="236" +data-flex-basis="568px" +></li> +<li><a class="link" href="https://www.aichpoem.net/#/shisanbai/poem" target="_blank" rel="noopener" +>AI 在线写诗</a>,比较全面的 AI 写诗工具,可以写律诗、绝句、现代诗、歌词等等,根据输入的主题任意发挥。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-23-10-36-44.png" +width="846" +height="502" +loading="lazy" +class="gallery-image" +data-flex-grow="168" +data-flex-basis="404px" +></li> +<li><a class="link" href="https://www.upscale.media/zh" target="_blank" rel="noopener" +>图片分辨率在线提升</a>,上传图片,网站使用 AI 算法将图片的清晰度自动提升,效果还不错。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-23-10-41-36.png" +width="1087" +height="693" +loading="lazy" +class="gallery-image" +data-flex-grow="156" +data-flex-basis="376px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 008 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/Wed, 16 Nov 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/<h1 id="机器文摘-第-008-期">机器文摘 第 008 期</h1> +<h2 id="长文">长文</h2> +<h3 id="用好-github给自己建立一个全方位的私有云平台">用好 GitHub,给自己建立一个全方位的私有云平台</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/2022-11-16-09-24-41.png" +width="754" +height="393" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="460px" +> +很多人都有进行个人的知识管理和数字资源管理的需求,市面上也有很多软件工具或者平台来满足这样的需求,但是大部分都是收费的,且自由度不高。我个人经常使用 Github 作为知识管理仓库,我的网络日志、技术博客、私人小项目、电子书籍等都放在上面,生活中已经离不开这个网站了。</p> +<p>近期读到这样一篇文章&ndash;<a class="link" href="https://www.bmpi.dev/self/use-github-better/" target="_blank" rel="noopener" +>善用 Github</a>,全方位讲解了 Github 如何使用,如何将其提供的服务发挥最大化的作用,看完受益匪浅。</p> +<blockquote> +<p>GitHub 是微软旗下的一个在线软件源代码托管服务平台,也是一个拥有八千多万开发者用户的社区。很多开发者应该对GitHub有一定的了解,但非技术人员大多可能并不会去使用它。本文更多是想给非技术人员来介绍这个平台,看完这篇文章,希望能让更多人在上面来学习、创作与展示自己的作品。</p> +</blockquote> +<h3 id="webgpu-是什么跟-webgl-有什么关系">WebGPU 是什么?跟 WebGL 有什么关系?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/2022-11-16-09-36-12.png" +width="846" +height="433" +loading="lazy" +class="gallery-image" +data-flex-grow="195" +data-flex-basis="468px" +> +前几天我想在网页上制作一个小游戏,用于尝试一下图形编程相关的技术。用到了一些基于 Web 技术的 3d 图形框架,比如 Three.js、Babylon.js 等等。在尝试的过程中遇到了一个新的名词 WebGPU,之前总是在听说 WebGL 相关的技术,结果说了这么多年,WebGL还没普及,怎么又冒出来一个 WebGPU?于是找了一篇文章,浅扒一下各个图形接口的历史。就是这篇<a class="link" href="https://www.51cto.com/article/698100.html" target="_blank" rel="noopener" +>浅入浅出 WebGPU</a>。</p> +<blockquote> +<p>2016年6月,Google 产生了使用新API来代替WebGL的想法,称之为 WebGL Next。 +2017年1月,Khronos Group 举办了WebGL Next研讨会,Chromium一马当先,展示了可以基于OpenGL和Metal独立运行的新图形系统原型,同时Apple和Mozilla也分别展示了自己的原型,三者都非常类似于Metal Api。 +次月,Apple就向W3C提交了一个名为 WebGPU 的技术概念验证方案,基于Metal图形开放接口,最终W3C采纳了 WebGPU 这个名字作为下一代标准,Apple的提案进入了正式的小组提案中。 +3月,Mozilla向Khronos Group提交了基于Vulkan的名为WebGL Next提案。 +2018年6月,Chrome团队宣布着手实现WebGPU,这意味着Khronos的失败,WebGPU胜出,大家以后还是团结在W3C的周围。 +按照预期,工作组希望在2021年底发布WebGPU 1.0 标准,不过目前只有草案。 +WebGPU 1.0 草案:https://www.w3.org/standards/types#WD</p> +</blockquote> +<h3 id="扔掉-photoshop-改用字符串绘图">扔掉 Photoshop 改用字符串绘图</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/2022-11-16-09-58-00.png" +width="761" +height="741" +loading="lazy" +class="gallery-image" +data-flex-grow="102" +data-flex-basis="246px" +> +相信很多人都接触过使用字符绘制的图片,这在程序员圈子里甚至发展为一门专有的艺术 “<a class="link" href="https://zh.wikipedia.org/wiki/ASCII%E8%89%BA%E6%9C%AF" target="_blank" rel="noopener" +>ASCII 艺术</a>”。不过我现在不是要说这些,我在一篇 2015 年发表的文章里,发现了这个:有个猛男在自己的程序里彻底抛弃使用 Photoshop 制作的图片资源,改用字符串来描述各种图形(程序界面的图标),然后自己再用代码将其渲染成为高清的图像。</p> +<p>作者对此很沾沾自喜,他甚至设计了一套自用的语法规范,用特定字母代表特定的符号关系,这样就可以组合出各种复杂的图案了。</p> +<p>我也在文章的评论区见到了跟我有同样疑惑的读者留言:“这不就是重新发明了 <a class="link" href="https://zh.wikipedia.org/wiki/%E5%8F%AF%E7%B8%AE%E6%94%BE%E5%90%91%E9%87%8F%E5%9C%96%E5%BD%A2" target="_blank" rel="noopener" +>SVG</a> 吗?唯一的区别就是没有用 XML 作为载体”。</p> +<p>不过文章记录的整个开发过程还是很有趣的,希望了解朋友可以点进去看看 <a class="link" href="http://cocoamine.net/blog/2015/03/20/replacing-photoshop-with-nsstring/" target="_blank" rel="noopener" +>Replacing Photoshop With NSString</a></p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://ffmpeg.xianwaizhiyin.net/" target="_blank" rel="noopener" +>FFmpeg原理</a>,FFmpeg 这个开源项目可能圈外的人士了解不多,但实际上我们生活中一刻也离不开它。现在的网络直播、网络视频网站和移动App、各种视频剪辑合成软件,都或多或少的使用了 FFmpeg 提供的编解码技术。这本在线书籍对于想进一步了解 FFmpeg 以及视频编解码技术的朋友是个不错的参考资料。</p> +<blockquote> +<p>本书《FFmpeg原理》主要讲解 FFmpeg 原理性的知识,前面几章主要讲解一些音视频开发的基础知识,例如原始数据 YUV 跟 RGB,封装格式 FLV 跟 MP4 ,压缩编码的基本概念,还有封装格式分析。</p> +</blockquote> +</li> +<li> +<p><a class="link" href="https://rustdesk.com/zh/" target="_blank" rel="noopener" +>开源虚拟与远程桌面基础架构</a>,远程桌面软件,开箱即用,无需任何配置。(我个人目前还是使用windows的远程桌面多一些,不过这个开源的rustdesk看起来不错)</p> +<blockquote> +<p>您完全掌控数据,不用担心安全问题。您可以使用我们的注册/中继服务器,或者自建,亦或者开发您的版本 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/2022-11-16-10-26-09.png" +width="1388" +height="701" +loading="lazy" +class="gallery-image" +data-flex-grow="198" +data-flex-basis="475px" +></p> +</blockquote> +</li> +<li> +<p><a class="link" href="https://learnxinyminutes.com/" target="_blank" rel="noopener" +>Learn X in Y minutes</a>,这里的教程几乎涵盖所有编程语言,完全没有废话。英文版、中文版都有。如果有编程语言基础的话,通过这个网站确实可以在几十分钟内掌握一门新的编程语言的核心知识。</p> +</li> +<li> +<p><a class="link" href="https://flash.zczc.cz/" target="_blank" rel="noopener" +>Flash 保存计划</a>,Flash 虽然消失了,但是它曾经创造的辉煌一直在我们的记忆里,现在偶尔还想起一些经典的小游戏。这个网站里收藏了很多经典的Flash小游戏,通过一些黑科技复活了它们,可以在浏览器里运行体验。反正我一打开了黄金矿工,就半天停不下来。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/2022-11-16-10-34-57.png" +width="1142" +height="554" +loading="lazy" +class="gallery-image" +data-flex-grow="206" +data-flex-basis="494px" +></p> +</li> +<li> +<p><a class="link" href="https://keg.cs.tsinghua.edu.cn/codegeex/index_zh.html" target="_blank" rel="noopener" +>CodeGeeX: 多语言代码生成模型</a>,又一个能帮你写代码的 AI 模型。提供有官方的 VSCode 插件。我试了一下,效果跟 Github 的 copilot 还有一定的差距。</p> +<blockquote> +<p>CodeGeeX是一个具有130亿参数的多编程语言代码生成预训练模型。CodeGeeX采用华为MindSpore框架实现,在鹏城实验室“鹏城云脑II”中的192个节点(共1536个国产昇腾910 AI处理器)上训练而成。截至2022年6月22日,CodeGeeX历时两个月在20多种编程语言的代码语料库(&gt;8500亿Token)上预训练得到</p> +</blockquote> +</li> +<li> +<p><a class="link" href="https://iximiuz.com/en/series/computer-networking-fundamentals/" target="_blank" rel="noopener" +>计算机网络基础学习(英文)</a>,一个在线讲解网络基础知识的教程,优点是内容简洁,不用特别多的专用名词唬人,另外还提供了在线实验的环境。</p> +<blockquote> +<p>关于计算机网络的书籍往往令人生畏 - 数千页,无聊的图表&hellip;&hellip;这个教程以几千字的字数引导您了解网络基础知识!它还提供动手实验室来实践所获得的知识。</p> +</blockquote> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/2022-11-16-10-51-40.png" +width="764" +height="476" +loading="lazy" +class="gallery-image" +data-flex-grow="160" +data-flex-basis="385px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 007 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/Wed, 09 Nov 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/<h1 id="机器文摘-第-007-期">机器文摘 第 007 期</h1> +<h2 id="长文">长文</h2> +<h3 id="如何在-html5-canvas-制作可精确控制时间的动画">如何在 HTML5 Canvas 制作可精确控制时间的动画</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-09-30-08.png" +width="576" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="170" +data-flex-basis="410px" +></p> +<p>使用 Canvas 对象在网页中制作动画非常简单,有不少人喜欢直接使用定时器 <code>setinterval</code> 以一定的时间周期循环执行绘图代码来实现动画效果。但是这种做法有一个弊端,由于显示刷新率以及计算机硬件性能的不同,会导致在不同机器上的表现差异。比如你希望你的动画角色在 1 秒内移动 50 个像素,但是实际执行起来却很难控制。<a class="link" href="https://www.viget.com/articles/time-based-animation/" target="_blank" rel="noopener" +>基于时间的动画</a>这篇文章讲解了如何使用浏览器的 <code>requestAnimationFrame</code> API 来实现精准控制动画时间的效果,里面给出了一个很简单的样例,但是基本上给出了一个完整的“更新、渲染、通过时间变化计算运动距离”的游戏控制架构。</p> +<h3 id="如何使用纯-web-技术开发一个相机-app">如何使用纯 Web 技术开发一个相机 App</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-09-47-44.png" +width="680" +height="475" +loading="lazy" +class="gallery-image" +data-flex-grow="143" +data-flex-basis="343px" +></p> +<p>如果不习惯复杂的移动 app 开发环境,直接使用 Web 技术开发一些小的 App 也是十分方便的。我近期希望通过网页实现一个拍照的应用,并且希望不使用手机的原生相机功能,而是自己控制一些相机参数、后期效果、增加特定的取景框等等。于是我找到了一篇教学指南:<a class="link" href="https://blog.prototypr.io/make-a-camera-web-app-tutorial-part-1-ec284af8dddf" target="_blank" rel="noopener" +>Make a Camera Web App</a>,只需几十行代码就实现了一个相机 App 。感兴趣的朋友可以点进去看看。</p> +<h3 id="数据库是如何工作的从零开始写一个数据库">数据库是如何工作的,从零开始写一个数据库</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-10-01-15.png" +width="390" +height="394" +loading="lazy" +class="gallery-image" +data-flex-grow="98" +data-flex-basis="237px" +></p> +<p>如果和我一样好奇数据库是如何实现的,可以看看<a class="link" href="https://cstack.github.io/db_tutorial/" target="_blank" rel="noopener" +>这篇文章</a>。带你用 C 语言从头撸一个数据库出来。</p> +<h3 id="使用-rust-写一个操作系统">使用 Rust 写一个操作系统</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-10-05-43.png" +width="702" +height="518" +loading="lazy" +class="gallery-image" +data-flex-grow="135" +data-flex-basis="325px" +></p> +<p>Rust 逐渐火起来了,这篇 <a class="link" href="https://os.phil-opp.com/zh-CN/" target="_blank" rel="noopener" +>2018 年的文章</a>整理了一份教程,作者尝试使用 Rust 写一个操作系统,我之所以收录它是因为作者还在 Github 开源了代码,并且这系列教程甚至提供了多国语言的版本。制作精良。应该是实践操作系统知识的好教材。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://100dayscss.com/" target="_blank" rel="noopener" +>100 天精通 CSS </a>,这个网站给了你 100 个关于 CSS 技术的挑战题目,也许练完之后可以达到深入应用 CSS 的效果,我尝试了几个挑战,有些题目的设置有些偏炫技范畴了,想在工作中使用估计会被打死。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-10-24-10.png" +width="392" +height="391" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +></p> +</li> +<li> +<p><a class="link" href="http://cht.sh/" target="_blank" rel="noopener" +>Linux 命令在线帮助工具</a>,对于我这种经常记不住命令用法的人来说真的是一种福音。比如我就经常记不清 <code>tar</code> 命令的用法,面对压缩包解压或者文件打包的工作每次都是去网上搜索一番。有了这个在线工具,直接在命令行中使用 <code>curl</code>请求他的网址就可给出命令的样例用法详解,非常方便。比如执行<code>curl cht.sh/tar</code> 就会给出 tar 的使用样例了,我直接复制粘贴之。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-10-28-42.png" +width="586" +height="462" +loading="lazy" +class="gallery-image" +data-flex-grow="126" +data-flex-basis="304px" +></p> +</li> +<li> +<p><a class="link" href="https://www.mobilephonemuseum.com/" target="_blank" rel="noopener" +>手机博物馆</a>, 网站收录了各品牌手机的各代产品资料,包括手机图片、型号参数、当时发布的广告等。不过我看了一下,资料应该还不齐全,有些手机只是列了个名字和型号在那儿,还缺少详细信息,估计还在继续收集中。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-10-32-23.png" +width="1696" +height="790" +loading="lazy" +class="gallery-image" +data-flex-grow="214" +data-flex-basis="515px" +></p> +</li> +<li> +<p><a class="link" href="http://www.famicn.com/" target="_blank" rel="noopener" +>中文家用游戏博物馆</a> ,收录了比较齐全的家用游戏机及掌机的中文版游戏资料。可以直接在线通过模拟器玩耍。有不少经典的 FC、GB、MD 游戏,甚至还有小霸王学习机的 ROM ,可以在线体验。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-10-36-51.png" +width="1096" +height="711" +loading="lazy" +class="gallery-image" +data-flex-grow="154" +data-flex-basis="369px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 006 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/Wed, 02 Nov 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/<h1 id="机器文摘-第-006-期">机器文摘 第 006 期</h1> +<h2 id="长文">长文</h2> +<h3 id="怎样写一段代码把自己打印出来">怎样写一段代码把自己打印出来?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/2022-11-02-13-45-45.png" +width="651" +height="400" +loading="lazy" +class="gallery-image" +data-flex-grow="162" +data-flex-basis="390px" +></p> +<p>近期在知乎上看到一个<a class="link" href="https://www.zhihu.com/question/22006572/answer/2722369370" target="_blank" rel="noopener" +>如何编写代码打印自己的问题</a>,感到十分有趣。以前也在网上见到过类似的代码,用 C 或者 Javascript 等各种语言实现的版本都有。当时只是感叹代码写的十分神奇,一段代码在运行之后竟然输出自己的源代码,而且一个字符也不差,并没有搞懂其中的原理。这篇回答里,作者给出了详细解释。并指出,冯·诺依曼早在他编写的《自复制元胞自动机理论》一书中的提出了这种事情在理论上的通用方法。</p> +<blockquote> +<p>如上图所示,自复制系统有五个基本部件:A:通用构造器;B:通用复制器;C:控制器;D:其他函数;ϕ(A,B,C,D)\phi(A,B,C,D)\phi(A,B,C,D) : A, B, C, D的编码;当自复制过程启动的时候,B将编码复制一份。A再根据复制出的编码构造出ABCD。最后,C再将这些结构组合起来,构造出一个新的、复制的结构。可以看到,自复制、自打印程序的核心就在于通用构造器和编码,因为复制器、控制器都是比较容易实现的。</p> +</blockquote> +<p>具体实现的示例,文中有更详细的说明。</p> +<p>最后,此问题可以引申到,大自然中生命基于基因的复制机制,也是与此相关,甚至其背后都是同样的机制。</p> +<h3 id="kevin-kelly-在-68-岁生日时给出的-68-条建议">Kevin Kelly 在 68 岁生日时给出的 68 条建议</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/2022-11-02-14-01-30.png" +width="688" +height="368" +loading="lazy" +class="gallery-image" +data-flex-grow="186" +data-flex-basis="448px" +></p> +<p><a class="link" href="https://baike.baidu.com/item/%E5%87%AF%E6%96%87%C2%B7%E5%87%AF%E5%88%A9/6607570" target="_blank" rel="noopener" +>凯文·凯利(又称KK, 作者,著有《失控》《科技想要什么》《必然》等)</a>,上个月 28 号是他的 68 岁生日,他准备了 68 条简短的建议,作为礼物送给年轻人。</p> +<p>有人翻译了<a class="link" href="https://zhuanlan.zhihu.com/p/143834871" target="_blank" rel="noopener" +>KK 在 68 岁生日时给出的 68 条建议</a>。</p> +<p>摘抄几条如下:</p> +<blockquote> +<p>任何一项大工程(修房子、拍电影、开发 app)完成度为 90% 的时候,你都要做好心理准备:剩余的大量细节工作会占掉你另一段与之前相当的时间。</p> +</blockquote> +<blockquote> +<p>不要担心自己问的问题听起来很傻。99% 的情况下,其他人都有和你一样的问题,只不过羞于问出口而已。</p> +</blockquote> +<blockquote> +<p>别成为一群人里最聪明的那个。和那些比你聪明的人待在一起,向他们学习。如果能找到和你观点相左的聪明人,那就更好了。</p> +</blockquote> +<blockquote> +<p>别做最好的。做唯一的。</p> +</blockquote> +<blockquote> +<p>任何真实之物都源于虚构之意。想象是宇宙中最强大的力量,也是你能够日益精进的能力。生命中可以因不知众人所知而获益的能力,仅此一项。</p> +</blockquote> +<blockquote> +<p>经验往往被高估了。招募的时候,要看资质,技能则可以培训。许多令人惊奇和赞叹的事情,都是由第一次做的人做出来的。</p> +</blockquote> +<h3 id="怎样搭建一个最简的-git-服务器">怎样搭建一个最简的 GIT 服务器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/2022-11-02-14-15-18.png" +width="626" +height="466" +loading="lazy" +class="gallery-image" +data-flex-grow="134" +data-flex-basis="322px" +></p> +<p>GIT 是现在软件开发过程中必不可少的版本控制工具,功能非常强大,我们平时直接使用单位的私有服务或者在线的云服务(如:Github 等)。</p> +<p>如果想要搭建个人的服务,可能就比较繁琐一些。<a class="link" href="https://www.ruanyifeng.com/blog/2022/10/git-server.html" target="_blank" rel="noopener" +>阮一峰老师的这篇博客</a>就解答了怎样采用极简的技术路线,为自己搭建一台 GIT 服务器。</p> +<blockquote> +<p>自己搭建 Git 服务器的原因,无非就是不方便访问外网,不愿意代码放在别人的服务器,或者有一些定制化的需求。 +这时,你可以选择开源的 Git 服务器软件。 +Gitlab CE +Gitea +Gogs +Onedev +这些软件里面,Gogs 的安装是最简单的,但是功能相对比较弱。功能越强的软件,安装越复杂。 +如果你只是想远程保存一份代码,并不在意有没有 Web 界面,或者其他功能,那么根本不用安装上面这些软件,一行命令就够了。</p> +</blockquote> +<h3 id="为什么很多程序员讨厌低代码">为什么很多程序员讨厌低代码?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/2022-11-02-14-24-59.png" +width="640" +height="355" +loading="lazy" +class="gallery-image" +data-flex-grow="180" +data-flex-basis="432px" +></p> +<p>“低代码”(一般指:不用或少用编写代码的方式进行软件开发)这个词近两年又开始火了,它代表着对软件工程的一种美好“幻想”,即:花费更低的代价去构建复杂的软件系统。</p> +<p>虽然每隔一个时间周期都会被重提一次,但是每次都未能如愿。</p> +<p>现在既然又被频繁提及,我在知乎上发现了这样一篇<a class="link" href="https://www.zhihu.com/question/561025857/answer/2734260311" target="_blank" rel="noopener" +>关于低代码话题的回答</a>。从程序员的视角表达了对低代码这种期望的观点,有兴趣的朋友可以点进去看看。</p> +<blockquote> +<p>软件工程这门学问,研究的就是“如何利用工程思想,从整体上降低开发复杂性”;但与之同时,它不得不反复强调“软件工程试图解决的、是人为引入的不必要的复杂性;但工程的本质复杂性是无法逃避的。因为没有银弹,没有银弹,没有银弹!”</p> +</blockquote> +<p>我个人的观点是:低代码或者配置化、拖拽式软件开发,很难平衡对复杂现实的抽象程度和开发便利性的矛盾关系。如何做到既提供方便的组件同时又不限制对个性化需求的实现,这需要非常强大的设计能力以及对于特定应用场景的取舍。目前来看,如果要做到或者接近上述状态,必然要先消耗巨量的成本,至于是否值得,可能不同的主体会有不同的选择吧。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://github.com/Visualize-ML/Book4_Power-of-Matrix" target="_blank" rel="noopener" +>从加减乘除到机器学习</a>,一本不错的数学扫盲书,如果你在学习人工智能的时候对数学感到吃力的话,这本书非常适合阅读,一点也不枯燥。主要讲解线性代数相关的知识。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/2022-11-02-14-46-11.png" +width="616" +height="335" +loading="lazy" +class="gallery-image" +data-flex-grow="183" +data-flex-basis="441px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/jlevy/the-art-of-command-line/blob/master/README-zh.md" target="_blank" rel="noopener" +>命令行的艺术</a> 想成为命令行高手,掌握这一篇就够了。</p> +<blockquote> +<p>熟练使用命令行是一种常常被忽视,或被认为难以掌握的技能,但实际上,它会提高你作为工程师的灵活性以及生产力。本文是一份我在 Linux 上工作时,发现的一些命令行使用技巧的摘要。有些技巧非常基础,而另一些则相当复杂,甚至晦涩难懂。这篇文章并不长,但当你能够熟练掌握这里列出的所有技巧时,你就学会了很多关于命令行的东西了。</p> +</blockquote> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/2022-11-02-14-47-54.png" +width="477" +height="287" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="398px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/practical-tutorials/project-based-learning" target="_blank" rel="noopener" +>基于实际项目的学习</a>,这是一个巨大的代码工程资源索引,里面列举了针对各种编程语言的个人项目,当你不知道该如何去深入学习一门编程语言的时候,选择一个这里的项目然后自己动手跟着练一遍效果绝对惊人。入选的项目都十分有趣,比如怎样用 C 写一个解释器、怎样写一个自己的编辑器、自己动手实现 TCP/IP 协议栈,等等。</p> +</li> +<li> +<p><a class="link" href="https://github.com/lxgw/LxgwWenKai" target="_blank" rel="noopener" +>霞鹜文楷</a>,一款开源中文字体,基于 FONTWORKS 出品字体 Klee One 衍生。用来看书非常舒服,特别是在排版上。微信读书已经内置,如果是第三方支持自定义字体的可以试试。</p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 005 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/Wed, 26 Oct 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/<h1 id="机器文摘-第-005-期">机器文摘 第 005 期</h1> +<h2 id="长文">长文</h2> +<h3 id="穿越到-1983-年学习-basichttpslinuxcnarticle-11091-1html"><a class="link" href="https://linux.cn/article-11091-1.html" target="_blank" rel="noopener" +>穿越到 1983 年学习 BASIC</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-10-33-53.png" +width="1006" +height="644" +loading="lazy" +class="gallery-image" +data-flex-grow="156" +data-flex-basis="374px" +></p> +<blockquote> +<p>很多著名的程序员,尤其在计算机游戏行业,孩童时期就在苹果 II 和 Commodore 64 这样的 8 位计算机上开始编写游戏,John Romero、Richard Garriott 和 Chris Roberts 都是这样的例子。这好理解。在 8 位计算机时代,很多游戏只能在计算机杂志和书籍中以印刷的 BASIC 程序清单方式得到。如果你想玩其中一款游戏,就必须手工键入整个程序。不可避免的,你可能遇到一些问题,所以你就得调试你的程序。等到你让它可以工作起来了,你就已经对程序是如何运行的有了足够的了解,你就可以开始自己修改它了。如果你是一个狂热的游戏玩家,你几乎必然会成为一名优秀的程序员。</p> +</blockquote> +<p>喜欢小霸王的小伙伴(老伙伴?),不可错过的文章,一起跟随作者回忆一下如何在老古董电脑上运行BASIC程序,顺便怀念一下当年靠着一本说明书就在小霸王学习机上编写(抄写)游戏的时光。</p> +<ul> +<li>文中提到的<a class="link" href="https://vice-emu.sourceforge.io/" target="_blank" rel="noopener" +> Commodore64 电脑可以在这里下载模拟器</a>。</li> +</ul> +<h3 id="在-github-的-pages-服务里跑-sqlitehttpsphireskygithubioblog2021hosting-sqlite-databases-on-github-pages"><a class="link" href="https://phiresky.github.io/blog/2021/hosting-sqlite-databases-on-github-pages/" target="_blank" rel="noopener" +>在 Github 的 Pages 服务里跑 SQLite</a></h3> +<p>作者尝试做一个小网站来显示一些统计数据,于是他想到了用数据库,但是,使用数据库需要托管和维护后端服务,或者每次将整个数据集下载到浏览器中(当数据集超过10MB时,体验就变得很差劲)。</p> +<p>于是作者开始琢磨有没有办法找到一个可以在静态服务器上搞一个数据库服务得可能,毕竟提供静态服务的地方有很多(如 GitHub,GitLab,Netlify 等等)。</p> +<p>一通折腾下来(借助了 WASM 技术并适当的进行一些魔改),作者竟然实现了一个 100% 静态托管的数据库服务。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-10-10-18.png" +width="864" +height="413" +loading="lazy" +class="gallery-image" +data-flex-grow="209" +data-flex-basis="502px" +></p> +<h3 id="语句表达式和海象操作符httpswwwzlovezlcnarticlesstmt-expr-and-walrus-operator"><a class="link" href="https://www.zlovezl.cn/articles/stmt-expr-and-walrus-operator/" target="_blank" rel="noopener" +>语句、表达式和海象操作符</a></h3> +<p>这是一篇介绍如何通过“海象操作符“(类似这样:<code>foo := 'bar'</code>)使得Python语句更加精炼的文章。</p> +<p>这种操作符之所以可以使得语句更加精炼,主要原因就是它使得一句代码既进行了赋值然后又作为表达式返回了值。</p> +<p>之前写 Python 代码的时候都没注意还有这种写法,而且貌似这在 C 和 C++ 中都是基本的特性。不过 C 和 C++ 是赋值语句<code>=</code>直接就返回了表达式的值,同时这给程序员提供了出错机会(有不少人应该还记得条件判断时少写了个等号导致的问题)。</p> +<h3 id="给个人开发者的一些建议英文httpsnewsycombinatorcomitemid32647091"><a class="link" href="https://news.ycombinator.com/item?id=32647091" target="_blank" rel="noopener" +>给个人开发者的一些建议(英文)</a></h3> +<p>hacker news 上的网友针对有志于运营自己的SaaS产品的个人开发者提了一些心得和建议。</p> +<p>摘抄一点儿如下:</p> +<ul> +<li>关于做什么,做那些你自己都愿意付费的东西,别指望做出一个你自己都不想花钱使用的产品有别人来买单;</li> +<li>还是关于做什么,不要做需要漂亮UI的东西,那会让你陷入编码之外的很多麻烦(确实很牵涉精力),如果提供的工具能够通过简单交互就能提供优质服务最佳;</li> +<li>如果有可能,尽量提供自助服务模式,也就是说让用户不用见到你就可以自行操作付款了(作者这是有多社交恐惧?);</li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://visualgo.net/zh" target="_blank" rel="noopener" +>数据结构与算法可视化</a>,是一个学习算法知识的好工具。通过动图来演示和讲解数据结构和算法实现原理,针对每一个常用算法不仅有直观的图示,还附有一篇详细的文档,内涵原理知识以及代码实例,网站甚至还提供了答题练习功能,可以一边学习一边做题。</li> +</ul> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-09-31-46.png" +width="1072" +height="321" +loading="lazy" +class="gallery-image" +data-flex-grow="333" +data-flex-basis="801px" +></p> +<ul> +<li><a class="link" href="https://lisperator.net/slip/" target="_blank" rel="noopener" +>SLip</a>,一个在浏览器中运行的Lisp解释器,使用Javascript实现。网站提供了一个简易的IDE,可以直接在页面中进行编程开发,还提供了图形绘制的扩展包,用于学习lisp语言非常合适。</li> +</ul> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-09-35-46.png" +width="497" +height="363" +loading="lazy" +class="gallery-image" +data-flex-grow="136" +data-flex-basis="328px" +></p> +<ul> +<li><a class="link" href="https://www.lfd.uci.edu/~gohlke/pythonlibs/" target="_blank" rel="noopener" +>针对 Windows 预先编译的 Python 扩展包</a>,在使用Python的时候,尤其是在Windows环境,经常会遇到有些扩展包由于依赖某些二进制库的原因导致无法通过pip直接安装,自己动手编译又十分麻烦。这个网站提供了各种预编译版本,可以直接下载网站提供的whl文件到本地然后安装。</li> +</ul> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-09-40-07.png" +width="675" +height="345" +loading="lazy" +class="gallery-image" +data-flex-grow="195" +data-flex-basis="469px" +></p> +<ul> +<li><a class="link" href="https://www.scratchapixel.com/lessons/3d-basic-rendering/introduction-to-ray-tracing" target="_blank" rel="noopener" +> 3D 渲染器入门</a>,一套计算机图形学的入门教程,从原理讲解开始,手把手教你用C++语言编写一个自己的光线追踪渲染器。</li> +</ul> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-09-48-21.png" +width="531" +height="361" +loading="lazy" +class="gallery-image" +data-flex-grow="147" +data-flex-basis="353px" +></p> +<ul> +<li><a class="link" href="https://htmldog.com/" target="_blank" rel="noopener" +>HTMLDOG</a>,前端开发基础知识大全,主要是 HTML、CSS、Javascript 的手把手教学以及语言参考。</li> +</ul> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-09-52-21.png" +width="1862" +height="709" +loading="lazy" +class="gallery-image" +data-flex-grow="262" +data-flex-basis="630px" +></p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 004 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/Tue, 18 Oct 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/<h1 id="机器文摘-第-004-期">机器文摘 第 004 期</h1> +<h2 id="搞机">搞机</h2> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/2022-10-18-09-53-01.png" +width="324" +height="702" +loading="lazy" +class="gallery-image" +data-flex-grow="46" +data-flex-basis="110px" +></p> +<p>美国德州仪器公司出品的TI图形计算器是一种既能计算又能作图的新型的数学使用工具,它具备符号代数系统、几何操作系统、数据分析系统等,可以直观地绘制各种图形,并进行动态演示、跟踪轨迹。</p> +<p>TI实体计算器的售价十分昂贵(相较于其他消费类计算器),这里有一个开源项目<a class="link" href="http://wabbitemu.org/" target="_blank" rel="noopener" +>wabbitemu</a>,使用C语言编写的一个TI计算器的模拟器,可以在电脑上运行并模拟TI计算器,支持多种型号,如TI-82、TI-83、TI-83-plus(需要加载对应的ROM)等。</p> +<p>甚至有人基于这个项目编译出了Android的版本,安装后手机秒变成高级科学计算器。</p> +<p>想进一步了解TI计算器的强大,可以看一下这篇文章<a class="link" href="https://zhuanlan.zhihu.com/p/148392866" target="_blank" rel="noopener" +>《计算器与计算器游戏发展简史》</a>。</p> +<ul> +<li><a class="link" href="http://www.liubaoyi.com/wp-content/uploads/2014/11/Android_Wabbitemu.zip" target="_blank" rel="noopener" +>TI计算器模拟器安卓版本下载地址(含ROM文件)</a></li> +<li><a class="link" href="http://www.liubaoyi.com/wp-content/uploads/2014/11/CX-C-CAS-%E5%9B%BE%E5%BD%A2%E8%AE%A1%E7%AE%97%E5%99%A8%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97.zip" target="_blank" rel="noopener" +>TI计算器使用说明书</a></li> +</ul> +<p>以上资源来自<a class="link" href="http://www.liubaoyi.com/" target="_blank" rel="noopener" +>@Karen的日志</a></p> +<h2 id="观点">观点</h2> +<blockquote> +<p>社交媒体的正确使用方法: +一,不浪费一秒钟时间和知识结构相差太大的人去解释/讨论。你没有义务也没有这个精力。对任何不友好评论,迅速拉黑。 +二,通过公开展示你的思考,来寻找在知识结构,兴趣或技能上,可能与你产生互补作用,或者 1+1&gt;2 的效应的朋友。公开展示长期留存的文字记录,效率最高。</p> +</blockquote> +<p>来自<a class="link" href="https://weibo.com/5339148412/Mal0hACJr" target="_blank" rel="noopener" +>@硅谷王川</a></p> +<h2 id="长文">长文</h2> +<h3 id="我是如何用21天刷完sicp">我是如何用21天刷完SICP</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/2022-10-18-10-56-50.png" +width="411" +height="300" +loading="lazy" +class="gallery-image" +data-flex-grow="137" +data-flex-basis="328px" +></p> +<p>SICP 全称 Structure and Interpretation of Computer Programs,翻译过来叫《计算机程序的构造和解释》,是一本关于计算机程序设计的总体性观念的基础教科书,由麻省理工学院出版社与麦格罗希尔出版社共同出版营销。作者是麻省理工学院教授哈尔·阿伯尔森、杰拉德·杰伊·萨斯曼。</p> +<p>这本书是计算机编程领域非常经典的一本教科书,内容覆盖范围非常广泛,从编程入门一直到教你亲手设计实现一个编程语言解释器。虽然是一本几十年前的书,但是书中的编程理念如数据驱动、过程抽象等到现在仍不过时。可以说是程序员修炼“内功心法”必读的一本好书。</p> +<p>这篇<a class="link" href="http://numbbbbb.com/2016/03/28/20160328_%E6%88%91%E5%A6%82%E4%BD%95%E7%94%A8%E4%B8%A4%E5%91%A8%E6%97%B6%E9%97%B4%E5%88%B7%E5%AE%8C%20SICP/" target="_blank" rel="noopener" +>《我是如何用21天刷完SICP(中文)》</a>的文章讲述了作者通过阅读本书学习的过程和心得,里面的观点可以借鉴,我在看完之后也想再把这本书拿出来学习一遍。</p> +<p>觉得看书太晦涩的,可以到下面这个项目里下载本书作者课堂讲解视频(国内好心人给做了翻译字幕)</p> +<ul> +<li><a class="link" href="https://learningsicp.github.io/" target="_blank" rel="noopener" +>『计算机程序的结构和解释』公开课 翻译项目</a></li> +<li><a class="link" href="https://pan.baidu.com/s/1o78bsYA" target="_blank" rel="noopener" +>百度网盘SICP文件夹</a></li> +<li><a class="link" href="https://www.bilibili.com/video/av8515129/" target="_blank" rel="noopener" +>中译版视频专辑列表(bilibili)</a></li> +</ul> +<h3 id="图解stable-diffusion模型">图解Stable Diffusion模型</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/2022-10-18-10-55-05.png" +width="937" +height="387" +loading="lazy" +class="gallery-image" +data-flex-grow="242" +data-flex-basis="581px" +></p> +<p>这篇<a class="link" href="https://jalammar.github.io/illustrated-stable-diffusion/" target="_blank" rel="noopener" +>图解Stable Diffusion模型(英文)</a>详细讲解了 Stable Diffusion(最近比较火的那个可以通过文字描述进行绘图的AI模型)的工作原理。文中使用清晰的图示阐述了“扩散”模型是怎样通过给图片增加噪声一步一步生成图像的。</p> +<h3 id="wine是如何工作的">Wine是如何工作的</h3> +<p>Linux桌面用户都遇到过在不得不运行 Windows 软件的时候,这个时候就可以使用这个叫做 Wine 的兼容程序,它可以让你在 Linux 下执行 win32 程序。( Valve 最新出品的游戏掌机 Steam Dect 就使用了 Wine 作为兼容层来运行 Windows 平台下的游戏)。</p> +<p>Wine 的名字来自于 “Wine Is Not an Emulator” 这个英文缩写。</p> +<p>这篇<a class="link" href="https://werat.dev/blog/how-wine-works-101/" target="_blank" rel="noopener" +>《Wine是如何工作的(英文)》</a>介绍了它的基本工作原理。</p> +<h3 id="在-windows-记事本里运行光线追踪">在 Windows 记事本里运行光线追踪</h3> +<p>光纤追踪(Ray Tracing)是一项计算机图形学技术,使用该技术渲染的计算机图像具有逼真的全局光照效果。</p> +<p>这篇<a class="link" href="http://kylehalladay.com/blog/2020/05/20/Rendering-With-Notepad.html" target="_blank" rel="noopener" +>《记事本中的光线追踪 30FPS》</a>记录了作者突发奇想要在Windows上的记事本中进行光线追踪渲染的趣事。</p> +<p>其原理是通过系统API获取到记事本窗口的句柄,然后利用钩子函数给记事本的窗体发送相应的“消息”以及覆盖对应的内存数据来实现对记事本窗体界面的“魔改”。最终实现了在另一个进程里执行光线追踪算法,然后借用记事本中显示的字符来替代画面像素,从而“渲染”出画面的效果。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="github.com/SerenityOS/serenity" >SerenityOS项目</a>,一个从头开始的桌面操作系统,内核采用类似Unix的架构,界面外观则仿照了上世纪90年代Windows的窗口风格。作者并未将其定位成玩具,而是一款具备生产力的操作系统软件。 除了操作系统本身,这个项目还有配套的编程语言Jakt、自己的浏览器引擎LibWeb和浏览器Ladybird ​​​</p> +</li> +<li> +<p><a class="link" href="https://github.com/ruanyf/document-style-guide" target="_blank" rel="noopener" +>《中文技术文档写作规范》</a>,<a class="link" href="https://www.ruanyifeng.com/blog/" target="_blank" rel="noopener" +>阮一峰老师</a>整理的技术文档写作规范,规定了标题、文本、段落、标点符号等文档元素的使用约定,需要经常编写技术文档的朋友可以收藏看看。</p> +</li> +<li> +<p><a class="link" href="https://freehand.yunwooo.com/" target="_blank" rel="noopener" +>Freehand意绘</a>,一个在线的AI绘图工具,可以根据文字描述帮助你生成图片,界面简洁友好,使用方便。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/2022-10-18-10-58-24.png" +width="1063" +height="525" +loading="lazy" +class="gallery-image" +data-flex-grow="202" +data-flex-basis="485px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/izackwu/TeachYourselfCS-CN" target="_blank" rel="noopener" +>计算机科学自学指南</a>,提供了一份自学计算机科学的全方位资料大全,可以根据内容系统地进行学习计算机科学相关的知识。</p> +<blockquote> +<p>互联网上,到处都有许多的学习资源,然而精华与糟粕并存。你所需要的,不是一个诸如「200+ 免费在线课程」的清单,而是以下问题的答案:</p> +<p>你应当学习 哪些科目,为什么? +对于这些科目,最好的书籍或者视频课程 是什么? +在这份指引中,我们尝试对这些问题做出确定的回答。</p> +</blockquote> +</li> +<li> +<p><a class="link" href="https://stevens.netmeister.org/631/" target="_blank" rel="noopener" +>UNIX环境中的高级编程</a>,一套编程教程,在课程中,主要学习用C编程语言开发复杂的系统级软件,同时深入了解Unix操作系统(以及属于该家族的所有操作系统,如Linux,BSD,甚至Mac OS X)及其编程环境。</p> +<blockquote> +<p>涵盖的主题将包括用户/内核接口,Unix的基本概念,用户身份验证,基本和高级I / O,文件系统,信号,进程关系和进程间通信。还将涵盖Unix系统上软件开发和维护的基本概念(开发和调试工具,如“make”和“gdb”)。</p> +</blockquote> +</li> +<li> +<p><a class="link" href="https://codeberg.org/drummyfish/tinyphysicsengine" target="_blank" rel="noopener" +>写在C头文件里的3D物理引擎</a>,一个仅用C99标准写在C头文件里的超小物理引擎,没有依赖,直接包含头文件即可在你的工程中使用,功能完整,内置向量、三角函数、引力等计算库。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/2022-10-18-14-04-11.png" +width="399" +height="326" +loading="lazy" +class="gallery-image" +data-flex-grow="122" +data-flex-basis="293px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 003 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/Tue, 11 Oct 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/<h1 id="机器文摘-第003期">机器文摘 第003期</h1> +<h2 id="搞机">搞机</h2> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/2022-10-11-10-17-41.png" +width="853" +height="640" +loading="lazy" +class="gallery-image" +data-flex-grow="133" +data-flex-basis="319px" +></p> +<h3 id="收听广播可以缓解压力个人体会">收听广播可以缓解压力(<em>个人体会</em>)</h3> +<p>近期我找到一个缓解焦虑的新方法,听收音机。</p> +<p>一定要老式的那种,收听真正无线电波信号的。随便找个台,最好还带有滋滋啦啦的杂音,当作工作时的背景声音,听着听着就感觉无比的放松。但又不是简单的“粉红噪音”、“白噪音”带来的那种平静,这种“仿佛脱离现在、回到了某个时空”的感觉让人感到愉悦。</p> +<p>我还没找到相关的研究信息,有人知道原理吗?</p> +<h2 id="动向">动向</h2> +<h3 id="欧洲通过法案将强制统一usb-type-c接口为充电接口">欧洲通过法案,将强制统一USB Type-C接口为充电接口</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/2022-10-11-15-46-02.png" +width="800" +height="450" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></p> +<blockquote> +<p>欧洲议会今天以压倒性多数投票赞成在2024年底之前将USB-C作为包括iPhone和AirPods在内的各种消费电子设备的通用充电端口。</p> +</blockquote> +<p>这对于苹果来说恐怕是个坏消息,对于消费者来说应该是个好消息。不过也许以苹果公司的脾气,说不定将来取消所有物理接口也有可能。</p> +<ul> +<li><a class="link" href="https://www.macrumors.com/2022/10/04/eu-passes-law-to-switch-iphone-to-usb-c-in-2024/" target="_blank" rel="noopener" +>欧洲强制iPhone使用usb-c接口</a></li> +</ul> +<h3 id="波士顿动力承诺不将机器人武器化">波士顿动力承诺不将机器人武器化</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/2022-10-11-10-15-11.png" +width="640" +height="427" +loading="lazy" +class="gallery-image" +data-flex-grow="149" +data-flex-basis="359px" +></p> +<blockquote> +<p>当地时间 10 月 6 日消息,波士顿动力、Agility Robotics、ANYbotics 等 6 家公司联合发表致行业的公开信表达了他们对这些可能性的担忧。他们称,先进的商业化机器人的经济可负担性和可获得性越来越强,其被滥用的可能性也越来越大。我们承诺不会将通用机器人或软件武器化,也不会支持其他人这么做;同时呼吁政策制定者、开发者和用户共同促进安全使用。</p> +</blockquote> +<p>我个人感觉此类声明并不会带来什么限制,相反地,我偏悲观的认为这种技术很可能以最优先的速度被应用于军事目的。</p> +<ul> +<li><a class="link" href="https://www.163.com/dy/article/HJ5DMDS005118DFD.html" target="_blank" rel="noopener" +>网易新闻:波士顿动力承诺不将机器人武器化</a></li> +</ul> +<h3 id="taocpthe-art-of-computer-programming-4b正式初版">TAOCP(《The Art of Computer Programming》) 4B正式初版</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/2022-10-11-10-30-24.png" +width="756" +height="732" +loading="lazy" +class="gallery-image" +data-flex-grow="103" +data-flex-basis="247px" +> +<em>图片来自<a class="link" href="https://weibo.com/5819320755/M9LXaF5I3" target="_blank" rel="noopener" +>@算法时空</a></em></p> +<p>世界著名程序员——高德纳老师,日前在他的个人网站宣布了<a class="link" href="https://www-cs-faculty.stanford.edu/~knuth/news.html#v4b" target="_blank" rel="noopener" +>TAOCP 4B正式出版</a>的消息。</p> +<p>这部计算机世界的经典巨著,耗费了高德纳老爷子的毕生心血,虽然已经出到了第四B卷,但本书目前还没有完全写完(本书从1962年开始写(中间停了几年是因为老爷子发现没有趁手的排版软件,就顺手发明了TEX——这又是另一个宏大话题了),计划共有七卷,其中第四卷分ABC三册)。他在自己主页中提到:</p> +<blockquote> +<p>与此同时,我继续研究第3部分(第4C卷),它已经有许多令人兴奋的主题。</p> +</blockquote> +<p>我只能说:祝老爷子身体健康!</p> +<h3 id="webassembly技术发展的怎么样了">WebAssembly技术发展的怎么样了?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/2022-10-11-10-45-39.png" +width="386" +height="383" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="241px" +></p> +<blockquote> +<p>WebAssembly 是一种运行在现代网络浏览器中的新型代码,并且提供新的性能特性和效果。它设计的目的不是为了手写代码而是为诸如 C、C++和 Rust 等低级源语言提供一个高效的编译目标。 +——来自<a class="link" href="https://developer.mozilla.org/zh-CN/docs/WebAssembly/Concepts" target="_blank" rel="noopener" +>Mozilla官方文档关于WebAssembly概念的介绍</a>。</p> +</blockquote> +<p>WebAssembly技术号称可以在浏览器中高效执行代码,并可以很方便地将C、Rust等各种语言编译到浏览器中执行,那么目前他的使用体验如何?</p> +<p>我周末做了简单体验。</p> +<p>通过官方给出的文档和入门指南,可以很快速地搭建出程序的原型,上图就是我参考官方示例将Rust代码编译到网页中执行的效果(是一个<a class="link" href="https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life" target="_blank" rel="noopener" +>经典的Game of life的小游戏</a>)。</p> +<p>从开发上来说,现在已经有了比较成熟的工具链(尤其是针对Rust语言到WASM的工具),和共享库的生态,想要进行开发,不必像前些年那样费心地搭建开发环境,基本上在Linux系统下简单执行几行命令即可完成环境搭建。</p> +<p>从执行效果来说,我没有做性能测试,直观感受上来说,确实比原生js快了不少。</p> +<p>但这并不是重点,我个人觉得这项技术它最大的意义在于,将之前的桌面程序技术有了向Web移植的可行性。</p> +<p>我们有可能很快就看到完全兼顾Web分发的方便和桌面程序性能体验的产品。</p> +<ul> +<li><a class="link" href="https://www.infoq.cn/article/hdwglnhub2wwklo9zz6z" target="_blank" rel="noopener" +>一则WebAssembly相关的新闻</a></li> +<li><a class="link" href="https://github.com/mbasso/awesome-wasm" target="_blank" rel="noopener" +>GitHub网友整理的关于WASM的资源大全</a></li> +<li><a class="link" href="https://rustwasm.github.io/docs/book/introduction.html" target="_blank" rel="noopener" +>一本手把手教你使用Rust语言进行WASM开发的在线电子书</a></li> +<li><a class="link" href="https://zalo.github.io/CascadeStudio" target="_blank" rel="noopener" +>一个使用WASM技术将三维设计软件CAD嵌入到网页中的开源项目</a></li> +<li><a class="link" href="https://supabase.com/blog/postgres-wasm" target="_blank" rel="noopener" +>一个使用WASM技术在浏览器中运行的PostgresSQL数据库</a></li> +</ul> +<h2 id="观点">观点</h2> +<blockquote> +<p>在你的密码里面放上一个逗号<code>&quot;,&quot;</code>,这样当你的密码在网上被人拖库时可以给黑客增加一些麻烦,因这样会使得他在作为csv文件往他的密码字典里面导入的时候,因为逗号分隔符的错位而让他崩溃。 +注:csv文件默认使用逗号分隔符区分字段。</p> +</blockquote> +<ul> +<li>来自:佚名网友。</li> +</ul> +<blockquote> +<p>当你长期使用windows远程桌面进行远程办公时,一层一层的服务器登进去,时间长了就会陷入盗梦空间那种疑惑,我现在是在哪一层?</p> +</blockquote> +<ul> +<li>来自:我自己。</li> +</ul> +<blockquote> +<p>量子计算机就是向过去和未来借用了很多乃至无限的时间吗?刹那即永恒。 +注:量子计算机号称每个bit位可在同一时刻表示多种状态。</p> +</blockquote> +<ul> +<li>来自:我自己。</li> +</ul> +<h2 id="长文">长文</h2> +<h3 id="从0到1打造家庭弱电方案">从0到1打造家庭弱电方案</h3> +<p>现在有不少人在困惑家里的网线该如何布局,这篇<a class="link" href="https://luolei.org/home-network-1/" target="_blank" rel="noopener" +>《从0到1打造家庭弱电方案》(中文)</a>记录了作者完整的装修过程,内容十分精彩详尽。看完之后我有点儿后悔,当时装修时没有给各个房间拉上光纤,以及用了比较普通的超五类网线。</p> +<h3 id="如何配置一个完全基于命令行窗口的开发环境">如何配置一个完全基于命令行窗口的开发环境</h3> +<p>我在油管上关注了一个日本小哥(Takuya Matsuyama),是一个个人开发者,经常上传自己的开发过程录屏,他完全基于命令行窗口(控制台)进行开发,没使用任何IDE。</p> +<p>后来我参考他的配置文件给自己也配置了一套,使用fish作为shell,neovim加上各种插件作为主力编辑器,现已成为我的日常开发环境。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/2022-10-11-11-16-56.png" +width="1571" +height="820" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="459px" +></p> +<p>有条件的可以到他的主页看看关于如何配置的详细介绍,或者直接去他的github仓库获取配置文件。</p> +<ul> +<li><a class="link" href="https://www.craftz.dog/posts" target="_blank" rel="noopener" +>Takuya Matsuyama小哥的主页</a></li> +<li><a class="link" href="https://github.com/craftzdog/dotfiles-public" target="_blank" rel="noopener" +>他的基于控制台命令行开发的各种配置文件</a></li> +</ul> +<h3 id="云桌面并不像你想的那么好">云桌面并不像你想的那么好</h3> +<p>给开发人员配置一个廉价的笔记本加上一个高性能的云端工作站,这个点子棒不棒?</p> +<p>听起来有很多的优势,兼具了性能、便携性、安全性等等。</p> +<p>不过先等一等,这里有一位作者在这样尝试了之后,给出了不少负面反馈(比如多显示器支持、GPU加速、网页视频质量等等问题),有兴趣的可以点进去看看。</p> +<ul> +<li><a class="link" href="https://mjg59.dreamwidth.org/61535.html" target="_blank" rel="noopener" +>《云桌面并不像你想象的那么好》(英文)</a></li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://webusers.imj-prg.fr/~jan.nekovar/co/en/en.pdf" target="_blank" rel="noopener" +>从高中到大学,数学中常用符号和计算关系的英文名称</a>,适合对数学公式中的各种符号感到困惑的人收藏,这本小册子汇聚了所有数学符号、常用希腊字母、代数式等英文叫法介绍。</li> +<li><a class="link" href="http://www.egr.unlv.edu/~ed/x86.html" target="_blank" rel="noopener" +>如何在Ubuntu下进行x86-x64汇编语言编程</a>,一本讲解现代汇编语言的电子书,基于常用的Ubuntu系统,从认识汇编语言开始讲起,到工具链的准备和怎样编写和调试程序,都有详细的介绍。</li> +<li><a class="link" href="https://www.drawkit.com/" target="_blank" rel="noopener" +>DrawKit</a>,一个提供矢量插画的网站,有很多免费的高质量插画,可用于网站制作、软件产品等方面。</li> +<li><a class="link" href="https://missing-semester-cn.github.io/" target="_blank" rel="noopener" +>计算机教育中缺失的一课</a>,一般学校里不会教开发环境的配置和各种效率工具的使用,这本电子书就是以环境和工具为切入点,将学校学习的理论应用于实际,比较接地气。 +<blockquote> +<p>大学里的计算机课程通常专注于讲授从操作系统到机器学习这些学院派的课程或主题,而对于如何精通工具这一主题则往往会留给学生自行探索。在这个系列课程中,我们讲授命令行、强大的文本编辑器的使用、使用版本控制系统提供的多种特性等等。学生在他们受教育阶段就会和这些工具朝夕相处(在他们的职业生涯中更是这样)。 因此,花时间打磨使用这些工具的能力并能够最终熟练地、流畅地使用它们是非常有必要的。</p> +</blockquote> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 002 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/Mon, 03 Oct 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/<h1 id="机器文摘-第002期">机器文摘 第002期</h1> +<h2 id="搞机">搞机</h2> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/2022-10-03-11-08-56.png" +width="895" +height="689" +loading="lazy" +class="gallery-image" +data-flex-grow="129" +data-flex-basis="311px" +></p> +<blockquote> +<p>MNT推出了一款名叫Pocket Reform的迷你笔记本电脑。它外形紧凑(屏幕只有7英寸),但功能齐全,据官方介绍,它的性能满足轻量办公需求,甚至还能玩一些游戏(ARM平台)。虽然现在的智能手机在性能方面已经有了很大提升,且便携性远超笔记本电脑,但是还是有相当一部分人倾向于在具有真实物理键盘的“电脑”上进行操作。</p> +</blockquote> +<p>在我看来,这台设备可能对于希望随时随地写两行代码的程序员更加具有吸引力。</p> +<ul> +<li>参考文章: +<ul> +<li><a class="link" href="https://spectrum.ieee.org/meet-an-open-source-pc-that-can-fit-in-your-pocket" target="_blank" rel="noopener" +>可以装在口袋里的开源PC</a></li> +</ul> +</li> +</ul> +<h2 id="动向">动向</h2> +<h3 id="文字直接生成3d模型">文字直接生成3D模型</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/2022-10-03-11-41-32.png" +width="735" +height="491" +loading="lazy" +class="gallery-image" +data-flex-grow="149" +data-flex-basis="359px" +> +谷歌实验室的几个哥们上周发布了一个新作&mdash;-DreamFusion。输入文字,就能生成带深度图和法线的3D模型。</p> +<p>开发团队声称:</p> +<blockquote> +<p>最近在文本到图像合成方面的突破是基于在数十亿个图像-文本对上训练的扩散模型。将这种方法应用于3D合成将需要标记大量的3D资产和用于对3D数据进行去噪的高效架构,而目前这都不太可行。在DreamFusion中,我们通过使用预先训练的2D文本到图像扩散模型来执行文本到3D合成来规避这些限制。我们的方法不需要3D训练数据,也不需要修改图像扩散模型,证明了预训练图像扩散模型作为先验的有效性。</p> +</blockquote> +<p>具体方法据称是来自他们新提出的“一种通过优化损失函数从扩散模型中生成采样的方法”该方法允许他们在任意参数空间中优化采样(例如3D空间)。</p> +<p>我看了一下官方给出的demo,3D模型还略显粗糙,不过可能将来算力提升之后会有改善。</p> +<p>现在,除了插画师受到了职业威胁,就连3D建模工程师的工作也有可能被AI取代?</p> +<ul> +<li>参考文章: +<ul> +<li><a class="link" href="https://dreamfusion3d.github.io/" target="_blank" rel="noopener" +>DreamFusion官方介绍</a></li> +</ul> +</li> +</ul> +<h3 id="通过文字描述生成语音的人工智能也来了">通过文字描述生成语音的人工智能也来了</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/2022-10-03-11-32-54.png" +width="909" +height="451" +loading="lazy" +class="gallery-image" +data-flex-grow="201" +data-flex-basis="483px" +></p> +<blockquote> +<p>Twitter 用户 Felix Kreuk 发布了从文本到音频 (Text to Audio) 的 AI 模型:AudioGen +AudioGen 可以 +(1) 根据文本生成音频;(2) 续写指定的音频;(3) 同时做以上两件事,根据指定文本描述生成指定音频。 +作者给出的展示DEMO里展示了如下文本生成的语音: +(1)在风声中吹口哨 +(2)男人在说话时伴有鸟和狗的叫声 +(3)警报器和嗡嗡作响的引擎接近后走远 +(4)鸽子咕咕叫并伴有沙沙的声音 +(5)男人说话的声音,背景伴有人群欢呼声</p> +</blockquote> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/2022-10-03-11-33-50.png" +width="1147" +height="629" +loading="lazy" +class="gallery-image" +data-flex-grow="182" +data-flex-basis="437px" +> +从作者公布的架构图上可以看出来,采用的也是Transformer神经网络。之前在看到AI画图时我就想到同样的原理可能用于生成音频,结果这才没过几天,人家都已经做出来了。</p> +<ul> +<li>参考文章: +<ul> +<li><a class="link" href="https://weibo.com/1309158107/M8mPt5LgI" target="_blank" rel="noopener" +>@海辛Hyacinth</a></li> +<li><a class="link" href="https://felixkreuk.github.io/text2audio_arxiv_samples/" target="_blank" rel="noopener" +>作者的demo和原理介绍页面(托管在github)</a></li> +</ul> +</li> +</ul> +<h2 id="观点">观点</h2> +<blockquote> +<p>站桩的简单,枯燥和有效,就好比持有 sp500 指数基金简单,枯燥但足以秒杀 95%以上的基金经理一样。 +莫将容易得,便作等闲看。</p> +</blockquote> +<ul> +<li>来自<a class="link" href="https://weibo.com/5339148412/LeTdmcfjW" target="_blank" rel="noopener" +>@硅谷王川</a></li> +</ul> +<h2 id="长文">长文</h2> +<ul> +<li> +<p><a class="link" href="https://randomascii.wordpress.com/2022/09/29/why-modern-software-is-slow-windows-voice-recorder/" target="_blank" rel="noopener" +>为什么现在的软件这么慢(英文)</a>,作者在Windows系统(Windows 10, 21H2版本)下使用“录音机App”的时候获得了极差的体验(确切的说是软件启动后大概卡死了将近20秒)。于是动手分析到底是什么原因导致,然后发现主要是这个软件启动后疯狂扫描“用户”文件夹下的录音文件用于构建界面中的录音列表,这种密集IO操作导致软件停止响应。作者花了很大的篇幅来吐槽这种行为,对于微软工程师为什么这么做表示莫名其妙。不过由于我们现在的计算机大都使用了固态硬盘,而且我们的习惯一般不会在“用户”文件夹下存放太多文件,所以这个体验应该不太明显。但即使这样,我也同样对Windows系统现在的软件质量感到担忧。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/2022-10-03-18-24-45.png" +width="643" +height="310" +loading="lazy" +class="gallery-image" +data-flex-grow="207" +data-flex-basis="497px" +></p> +</li> +<li> +<p><a class="link" href="http://zhangtielei.com/posts/blog-involution-analysis.html" target="_blank" rel="noopener" +>内卷、汉明问题与认知迭代(中文)</a>,作者较为科学地分析了内卷的定义和形态,从而引申出了关于什么是“人生中重要的事”的思考,文章虽然比较长,但也清晰易懂,发人深省。部分引用如下:</p> +<blockquote> +<p>从大的方面说,社会需要创新,个人则需要突破,而创新和突破又都要求我们不断地精益求精。那么,内卷与精益求精是本质上一样的吗?如果不是,两者的区别在哪?</p> +</blockquote> +<blockquote> +<p>在某件事情上花费太多精力,并不一定就是内卷;在无关紧要的事情上花费精力才是真的内卷。</p> +</blockquote> +<blockquote> +<p>汉明早年在贝尔实验室工作。那年春天,他经常和几位同事聚在一起在餐厅吃午饭。吃饭期间,他向其中一位叫Dave McCall的同事提了一个问题:“在你的领域里最重要的问题是什么?”大约一个星期后,再次一起午餐时他继续发问:“你目前正在研究的最重要的问题是什么?” 显然,这位同伴对于这两个问题的回答并不一样。于是他接着问:“如果你当前做的并不是最重要的事,那为什么还要一直花时间投入去做呢?”有了这「灵魂三问」之后,于是——在那个春天接下来的日子里,汉明不得不另找别的同伴一起吃午饭了…… +汉明的问题听起来有些让人生厌,但后来演变成了一个在学术界很受关注的问题——汉明问题(The Hamming Question)。它本来说的是科研选题的事情,但实际上关乎人生最重要的选择。</p> +</blockquote> +<blockquote> +<p>内卷,指的是在低水平的状态下无实质意义的消耗。这里的「低水平」,可能是客观的,也可能是主观的。 +针对主观的低水平状态,我们需要冲破意识层面的障碍,同时把读书、实践和思考结合起来,反复迭代,这样才可能跃升到更高的认知层次上。 +而针对客观的低水平状态,唯有认真对待汉明问题,选择好真正重要的人生大方向,才能避免卷入那些无关紧要的、无谓的消耗中去。这才是真正考验大智慧的时候了。</p> +</blockquote> +</li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/mtdvio/every-programmer-should-know" target="_blank" rel="noopener" +>每个程序员都需要知道的</a> ,整理了一份资源合集,包含了软件工程师技能相关的各类知识资源,包括算法、数据结构、浮点、Unicode、时间、内存、分布式、正则、安全、架构、工程哲学、实践、职业发展、软技能。。。等等,以及一些可用于技能训练和学习的站点。看起来非常符合我这种“收藏了就是学习了”的囤积爱好者的胃口。</li> +<li><a class="link" href="https://github.com/jefflomax/word-writer-6-commodore-64" target="_blank" rel="noopener" +>Word Writer 6 6502汇编源码</a>,是一份开源的Word Writer 6的6502汇编源码,可在模拟器下编译运行。用来学习6502汇编是一个不错的项目。上个世纪80年代爆火的计算机Commodore 64是很多复古计算机爱好者(包括我)的最爱,Word Writer 6是该平台上流行的文字排版编辑软件。</li> +<li><a class="link" href="https://almanac.httparchive.org/zh-CN/2022/" target="_blank" rel="noopener" +>HTTP Archive的年度报告</a>,这份报告详细(超级详细)分析了目前全球各在线网页中所使用的技术,从页面中的“CSS”、“Javascript”、“字体”以及用户体验中的“搜索引擎优化”、“移动端支持”等超过20个方面进行展示,内容十分详尽,有种看NBA的进球统计的感觉。</li> +<li><a class="link" href="https://javascriptquiz.com/" target="_blank" rel="noopener" +>Javascript Quiz</a>,一份关于Javascript的小测验,可在线作答,一共十道选择题,全是关于Js语法的常见坑,每道题答完之后都可以点击“info”图标获取关于这道题的详细解释。我试着做了一下,勉强及格。</li> +<li><a class="link" href="https://www.musi-co.com/listen/streams" target="_blank" rel="noopener" +>Streams</a>,这里有一批纯AI创作的音乐,由AI负责作曲和编曲,工程师只是把这些乐谱放入DAW软件中进行混音和录音,完成度很高,听起来相当上头。</li> +<li><a class="link" href="https://learningsynths.ableton.com/zh-Hans/get-started" target="_blank" rel="noopener" +>学习合成器</a>,这个网站提供了一本交互式电子书,讲解了电子合成器的原理,还单独提供了一个交互页面用于调制和体验各种合成器音色。我尝试了一下,真的很直观,在页面中直接可以修改各种振荡器波形、滤波器、LFO等参数,非常适合用于音色合成入门。</li> +<li><a class="link" href="https://llh911001.gitbooks.io/mostly-adequate-guide-chinese/content/" target="_blank" rel="noopener" +>函数式编程指北</a>,在线电子书,讲解函数式编程的范式,以Javascript进行举例,作者风趣幽默,深入浅出,觉得被函数编程概念唬住的可以去看看。</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 001 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-001-%E6%9C%9F/Wed, 28 Sep 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-001-%E6%9C%9F/<h1 id="机器文摘-第001期">机器文摘 第001期</h1> +<h2 id="搞机">搞机</h2> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-001-%E6%9C%9F/2022-09-28-09-38-31.png" +width="641" +height="571" +loading="lazy" +class="gallery-image" +data-flex-grow="112" +data-flex-basis="269px" +></p> +<blockquote> +<p>TurnT是一个颇具创意的唱盘设计,它把智能手机与模拟黑胶的老式音乐播放方式相结合。用家把触笔放在手机屏幕显示的黑胶唱片上,它即开始播放。从内部结构上看,它其实是一个无线扬声器,可以连接到智能手机播放音乐。TurnT这种播放音乐的体验增加了互动的体验感,如同在实际的唱片上一样,挪开唱针会立即停止音乐,将其“向内”移动到手机屏幕上显示的光盘中心就可以播放音乐。要更改歌曲,您可以通过滑动来更改专辑,还可以重新定位。</p> +</blockquote> +<ul> +<li>参考文章: +<ul> +<li><a class="link" href="https://www.sohu.com/a/573073318_121124377" target="_blank" rel="noopener" +>把手机变成黑胶唱机 &mdash; Yamaha发布了与智能手机配合使用的独特音乐设备</a></li> +</ul> +</li> +</ul> +<h2 id="动向">动向</h2> +<h3 id="ai生成图像技术带来的艺术危机">AI生成图像技术带来的“艺术危机”</h3> +<blockquote> +<p>近几周,基于AI生成的图像艺术作品的新闻越来越多,以DALL-E、Stable Diffusion等神经网络模型为代表的图像生成类AI进化越来越快,已达“以假乱真”程度。我也在动手尝试后惊叹他们的生成效果非常逼真和充满想象力。然而很快,此类AI就引起设计师、画师、艺术家的反对(恐慌?)。当然也有很多持积极态度,把它们当作工具加以利用,甚至不乏商业头脑灵活的人士,已经通过AI作画开始获取收益。于是引发了一系列的反应和讨论。</p> +</blockquote> +<ul> +<li>参考文章: +<ul> +<li><a class="link" href="https://www.uisdc.com/unsplash-prohibited-ai" target="_blank" rel="noopener" +>知名图库Unsplash 宣布禁传AI生成图像</a></li> +<li><a class="link" href="https://www.51cto.com/article/719747.html" target="_blank" rel="noopener" +>付费图库集体封禁AI生成图片</a></li> +<li><a class="link" href="https://www.bilibili.com/read/cv18571483" target="_blank" rel="noopener" +>AI 绘画 Windows 本地零基础搭建 Stable Diffusion</a></li> +<li><a class="link" href="https://zhuanlan.zhihu.com/p/560226367" target="_blank" rel="noopener" +>AI数字绘画 stable-diffusion 保姆级教程</a></li> +<li><a class="link" href="https://github.com/ahrm/UnstableFusion" target="_blank" rel="noopener" +>一个包装好的AI绘图开源GUI客户端</a></li> +</ul> +</li> +</ul> +<h2 id="观点">观点</h2> +<blockquote> +<p>程序员是计算机的翻译官。他们先是把人类的语言翻译成计算机的语言,现在又教会了计算机使用人类的语言。</p> +<ul> +<li>来自<a class="link" href="https://weibo.com/6827625527/M7vHNl9HD" target="_blank" rel="noopener" +>@t0mbkeeper</a></li> +</ul> +</blockquote> +<h2 id="长文">长文</h2> +<ul> +<li>对很多事情都有兴趣,但是生命的时间有限,怎么办?<a class="link" href="https://news.ycombinator.com/item?id=32628511" target="_blank" rel="noopener" +>这篇hacker news上的讨论(英文)</a>或许能提供一些建议。</li> +<li><a class="link" href="https://www.calnewport.com/blog/2022/05/16/taking-a-break-from-social-media-makes-you-happier-and-less-anxious/" target="_blank" rel="noopener" +>这篇文章提到了一项关于焦虑的研究(英文)</a>。研究表明,远离社交媒体(包括及时通讯工具)一个星期,可以显著提升幸福感、降低焦虑程度;</li> +<li>掌握一项技能需要时间和实践,降低预期,慢即是快。<a class="link" href="https://geekplux.com/posts/how-i-learned-programming" target="_blank" rel="noopener" +>《我是如何学会编程的》(中文)</a>,这篇文章是一位网友分享的关于他学习编程的历程。</li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https:///coding-fonts.netlify.app/" target="_blank" rel="noopener" +>coding-fonts</a> ​​​是一个不错的编程字体网站,可以在线预览各种适合编程开发时用的字体,让选择更加直观。</li> +<li><a class="link" href="https://github.com/opendilab/DI-sheep" target="_blank" rel="noopener" +>深度强化学习羊了个羊</a> 这个github仓库开源了一个通过AI强化学习来玩耍“羊了个羊”游戏的模型及代码,结构清晰,效果很棒,用于了解深度强化学习知识非常不错。</li> +<li><a class="link" href="https://github.com/scutan90/DeepLearning-500-questions" target="_blank" rel="noopener" +>深度学习500问</a>这本在线书籍以问答形式对常用的概率知识、线性代数、机器学习、深度学习、计算机视觉等热点问题进行阐述,目前在github将近50k颗星。</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>基于Markdown格式的知识管理尝试计划https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8Emarkdown%E6%A0%BC%E5%BC%8F%E7%9A%84%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86%E5%B0%9D%E8%AF%95%E8%AE%A1%E5%88%92/Sat, 23 Apr 2022 00:00:00 +0000https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8Emarkdown%E6%A0%BC%E5%BC%8F%E7%9A%84%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86%E5%B0%9D%E8%AF%95%E8%AE%A1%E5%88%92/<h2 id="背景">背景</h2> +<ul> +<li>之前一直有收藏文章并整理自己知识体系的习惯,使用的工具是evernote(印象笔记),十多年来收集数百篇网络文章,自己整理并编写笔记若干篇,已做到目录和标签的基本分类;</li> +<li>之前也有通过每日编写一个markdown文件来记录工作日志、零星日记的习惯,有心得感悟时都直接在工作日志中随手写入,保存起来;</li> +<li>通过github pages写过一些个人博客文章,更新频率不高,主要作为个人笔记在使用;</li> +<li>当前问题如下: +<ul> +<li>evernote用户体验逐年下降,对设备限制较多,且内容存在云端、格式封闭,个人掌控感较差,数据有无法访问的风险;</li> +<li>工作日志中散落的心得感悟没有索引,基本埋没在以日期命名的文件里,不成体系;</li> +<li>收集的数百篇网络文章基本没有进行消化阅读,未形成自己理解的内容;</li> +</ul> +</li> +</ul> +<h2 id="目标">目标</h2> +<ul> +<li>为网络收藏和个人产出的文章建立索引,把之前的“仓库”形成“体系”;</li> +<li>从evernote中迁移出来,所有数据放在本地,并通过在线网盘进行同步;</li> +<li>以纯文本+附件资源作为载体,避免对一种编辑器或工具产生过度依赖;</li> +</ul> +<h2 id="工具选择">工具选择</h2> +<ul> +<li><a class="link" href="https://obsidian.md/" target="_blank" rel="noopener" +>Obsidian</a>,用于建立最基本的知识仓库,编辑自己的知识卡片,并充分利用它的双向链接功能将收藏的文章和自己输出的内容形成体系连接起来;</li> +<li><a class="link" href="https://code.visualstudio.com/" target="_blank" rel="noopener" +>vscode</a>, 用于编辑技术文章、工作日志以及基于插件进行绘图,最终输出内容到Obsidian文件库中;</li> +<li>360网盘,用于在线实时同步存储Markdown的文件夹,任何具有同步文件功能的网盘均可;</li> +</ul> +<h2 id="具体计划">具体计划</h2> +<ul> +<li>整理文章目录:按照文章来源(网络、书籍、心得)、知识层面(技术、生活、哲学)等进行分类,形成树状目录结构;</li> +<li>整理文章标签:每篇文章虽然只属于一个目录,但是可以有多个标签,提升了检索文章的维度。目录作为知识体系的骨架分类,标签则是详细划分(如技能相关的标签就可以有:编程、绘画、音乐、写作,并还能进一步细分);</li> +<li>参考少数派文章<a class="link" href="https://sspai.com/post/62414" target="_blank" rel="noopener" +>玩转 Obsidian 01:打造知识循环利器</a>提到的Zettelkasten笔记法逐步整理多年积累的知识形成以“知识卡”(其实就是具有互相链接关系的Markdown文件)为单位的知识;</li> +<li>[[玩转 Obsidian 01:打造知识循环利器 - 少数派]]</li> +<li>阅读整理多年收集的知识文章,按照大约每周一篇的节奏,产出自己理解后的知识卡片,形成“知识循环”;</li> +<li>如此往复若干时间,不断完善这个体系,工具可更换,载体亦可更换,唯独不变的是探索、求知的心;</li> +</ul>Archiveshttps://sbabybird.github.io/archives/Sun, 06 Mar 2022 00:00:00 +0000https://sbabybird.github.io/archives/《少有人走的路》读书笔记https://sbabybird.github.io/p/%E5%B0%91%E6%9C%89%E4%BA%BA%E8%B5%B0%E7%9A%84%E8%B7%AF%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/Sun, 18 Apr 2021 00:00:00 +0000https://sbabybird.github.io/p/%E5%B0%91%E6%9C%89%E4%BA%BA%E8%B5%B0%E7%9A%84%E8%B7%AF%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/<h2 id="简介">简介</h2> +<p>《少有人走的路-心智成熟的旅程》这本书据说是畅销多年,经久不衰,在豆瓣上评分很高。不少人纷纷表示此书给自己带来了很多思考和感悟。我是在今年第二遍阅读了此书,之前大约十年前草草看过一遍,印象不够深刻。但今年再读,书中就有很多文字能够读进去了。虽然作者本身对“爱”的定义和解读我并不完全认同,以及作者也许受宗教信仰的影响,在某些观点上有一定的倾向,但都不妨碍这本书给我带来震撼。</p> +<h2 id="笔记">笔记</h2> +<blockquote> +<p>人生苦难重重。</p> +</blockquote> +<p>开篇就表达了最基本的设定,让我闭上本来想要抱怨的嘴,不得不跟着往后翻看有没有可以解决的答案。</p> +<blockquote> +<p>解决人生问题的关键在于自律。人若缺少自律,就不可能解决任何麻烦和问题。在某些方面自律,只能解决某些问题,全面的自律才能解决人生所有的问题。</p> +</blockquote> +<p>在认真看本书之前,我对“自律”的理解还仅限于在生活上严格要求自己,作息规律、遵守诺言、办事靠谱、简约不浪费。但作者显然不仅仅是这个意思,否则也用不着用很大的篇幅来说“自律”。</p> +<p>看一下作者对“自律”的定义。</p> +<blockquote> +<p>所谓自律,就是主动要求自己以积极的态度去承受痛苦,解决问题。自律有四个原则:推迟满足感、承担责任、忠于事实、保持平衡。</p> +</blockquote> +<p>只有不回避问题、以积极的心态去解决问题,才算作是自律。即便在生活中早睡早起、刻苦读书、勤奋工作,如果遇到问题首先想要逃避,那就不能算是自律。很惭愧,我之前在不少问题上都是以拖延为主要处理方式,本质上还是无法承受或者面对解决问题可能带来的痛苦,那么在读了本书之后,我会有意识地去改变做事原则,就拿上周来说,我终于鼓起勇气去诊所看牙,解决了拖了很久的牙结石问题(虽然智齿还没解决)。</p> +<blockquote> +<p>推迟满足感,就是不贪图暂时的安逸,先苦后甜,重新设置人生快乐与痛苦的次序:首先,面对问题并感受痛苦;然后,解决问题并享受更大的快乐。在充满问题和痛苦的人生中,推迟满足感是唯一可行的生活方式。</p> +</blockquote> +<p>这个话题不仅仅是在本书中提到过,据说有心理学家做过试验,在一群孩子里面寻找具有“推迟满足感”倾向的人(比如能够先忍住不吃巧克力以获取更大的奖励),结果证明这样的人在后续的生活中取得成功的概率要远高于先吃巧克力的人。本书首先强调这个话题,将其作为自律中的第一个原则,我想是因为道理都是相通的吧。很久之前我看过一篇讲解时间管理的文章,里面提到在规划一天的工作时,优先处理最难的那件事(文章中称“先吃掉那只青蛙”),然后当前的工作会越来越简单,这样的方式跟本书中作者所提倡的“推迟满足感”异曲同工。尽可能的正面问题、提早感受解决问题的痛苦,正是执行自律的首要原则。</p> +<blockquote> +<p>不能及时解决自己面临的问题,这些问题就会像山一样横亘在我们心中,阻碍心灵的成长和心智的成熟。很多人显然忽略了这个道理。我们必须面对属于自己的问题,这是解决问题的基本前提。 +指望别人解决自己的问题,也不是明智之举。唯一的办法&ndash;我们应该勇敢地说:“这是我的问题,要由我来解决!”</p> +</blockquote> +<p>这就牵出了第二个原则&ndash;“承担责任”。逃避问题会自然而然的推卸责任,认为这不是自己的问题,始终对于自己扮演的角色缺少清晰的认知。不过作者提到了两种情况“神经官能症”和“人格失调症”,前者属于给自己强加责任,后者属于推卸责任。这么说来,我可能有前者的倾向,很多压力都来源于此。不过作者也提到在复杂的人生道路上,判断自己该为什么事和什么人负责,这是一个永远存在的难题。</p> +<p>还有一种情况是,在有些事情上强加给自己责任,在有些事情上又没有意识到是自己的责任。读到这些章节的时候,我也在反思,当我一旦开始想要抱怨的时候,其实已经陷入“人格失调”和“神经官能”的边缘,要时刻提醒自己,不断评估自己的责任。</p> +<blockquote> +<p>忠于事实是自律的第三条原则。如果我们追求健康的生活和心智的成熟,那我们就要坚定不移地遵循这条原则。我们需要实事求是,杜绝虚假。我们越是了解事实,处理问题就越是得心应手。逃避现实的痛苦是人类的天性,只有通过自律,我们才能逐渐克服现实的痛苦,及时修改自己的地图,逐步成长。我们必须忠于事实,尽管这会带来暂时的痛苦,但远比沉湎于虚假的舒适中要好。我们必须忍受暂时的不适感,追求事实而不是假象,并承受这一过程的痛苦。</p> +</blockquote> +<p>这让我想到了“诚实”,不仅限于不撒谎(这一点实在是难以做到)。但我很快意识到作者所说的忠于事实比不撒谎更重要的是,面对事实,不可活在自己的想象里。虽然我们每个人都有自己的成见,看事情也很难看到全貌,但是不可做不基于事实的幻想,期望问题会自行消失、期望不付出努力就能得到回报。</p> +<blockquote> +<p>你既要承担责任学会推迟满足感,先苦后甜,把眼光放长远,同时又要尽可能过好当前的生活,让人生的快乐多于痛苦。</p> +</blockquote> +<p>这就是“保持平衡”,应该是一种“拿捏”吧。为了保持平衡,作者建议,适当的选择“放弃”。包括放弃过时的观念、习惯。王小波在小说中写道:“人生就是一个缓慢被捶的过程。。。”,如果不能适时的放弃一些东西,那很显然这个过程是相当痛苦的。</p> +<p>先写这么多。</p>《管理自己》阅读笔记https://sbabybird.github.io/p/%E7%AE%A1%E7%90%86%E8%87%AA%E5%B7%B1%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/Thu, 15 Apr 2021 00:00:00 +0000https://sbabybird.github.io/p/%E7%AE%A1%E7%90%86%E8%87%AA%E5%B7%B1%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/<h2 id="文章介绍">文章介绍</h2> +<p>《管理自己(Management Yourself)》作者——彼得·德鲁克。该文是《哈佛商业评论》创刊以来重印次数最多的文章之一,节选自其著作《21世纪的管理挑战》。</p> +<p>我第一次读到这篇文章,是2013年在<a class="link" href="http://www.zreading.cn/archives/3650.html" target="_blank" rel="noopener" +>左岸读书</a>的博客,当时很快就放入收藏夹,今日再次翻阅,仍觉受益匪浅。</p> +<p>摘抄部分在此记录,并附上自己的一些理解。</p> +<h2 id="笔记">笔记</h2> +<blockquote> +<p>知识工作者必须成为自己的首席执行官。你应该在公司中开辟自己的天地,知道何时改变发展道路,并在可能长达50年的职业生涯中不断努力、干出实绩。要做好这些事情,你首先要对自己有深刻的认识——不仅清楚自己的优点和缺点,也知道自己是怎样学习新知识和与别人共事的,并且还明白自己的价值观是什么、自己又能在哪些方面做出最大贡献。因为只有当所有工作都从自己的长处着眼,你才能真正做到卓尔不群。</p> +</blockquote> +<p>未来社会,体力劳动将逐渐被智能化机械所取代,人人都是知识工作者即将成为事实。每个人都需要把自己当作一个公司来看待,自己就是CEO,包揽人生的“市场”、“营销”、“生产”、“运营”等各项工作,只有从更高的视角来规划自己,才能掌握主动权,避免落入被动接受的局面。</p> +<p>与运营企业一样,经营自己的第一步还是要先了解自己,深刻认识自己的优势与不足,这样无论是制定计划还是付诸行动,才能做到目标明确、行之有效。</p> +<blockquote> +<p>多数人都以为他们知道自己擅长什么。其实不然,更多的情况是,人们只知道自己不擅长什么——即便是在这一点上,人们也往往认识不清。然而,一个人要有所作为,只能靠发挥自己的长处,而如果从事自己不太擅长的工作是无法取得成就的,更不用说那些自己根本干不了的事情了。</p> +</blockquote> +<p>这个观点跟我的直觉是相反的,在读到这段文字之前我以为自己对擅长什么了如指掌,但认真思索之后,才发现事情并没有那么简单,有些自以为是的优点根本不值得推敲,如沟通表达、对技术了解广泛、技术趋势敏感等等。至于真正做什么样的事情非常的得心应手,还真得通过认真分析才行。</p> +<blockquote> +<p>要发现自己的长处,唯一途径就是回馈分析法(feedback analysis)。每当做出重要决定或采取重要行动时,你都可以事先记录下自己对结果的预期。9到 12个月后,再将实际结果与自己的预期比较。我们只要持之以恒地运用这个简单的方法,就能在较短的时间内(可能两三年),发现自己的长处——这是你需要知道的最重要的事情。在采用这种方法之后,你就能知道,自己正在做(或没有做)的哪些事情会让你的长处无法发挥出来。同时,你也将看到自己在哪些方面能力不是特别强。最后,你还将了解到自己在哪些方面完全不擅长,做不出成绩来。</p> +</blockquote> +<p>作者给出了一个据说十分有效的方法,虽然执行起来略显繁琐且时间较长,但应该还值得一试。我个人有记录工作日志的习惯,但停留在时间消耗的记录和分析层面,并未对任务执行的结果进行预期和分析。</p> +<blockquote> +<p>首先最重要的是,专注于你的长处,把自己放到那些能发挥长处的地方。其次,加强你的长处。第三,发现任何由于恃才傲物而造成的偏见和无知,并且加以克服。</p> +</blockquote> +<p>想起了之前读到的另一本书<a class="link" href="https://book.douban.com/subject/1100470/" target="_blank" rel="noopener" +>《现在发现你的优势》</a>,虽然木桶原理说要补充自己的短板,但这里的观点则强调要充分把自己的优势利用起来,并且进行加强,这样才能更好的发挥自己。当然,努力学习新技能、新知识,发现自己的偏见和不良习惯然后克服它们也很重要。</p> +<blockquote> +<p>把预期和实际结果进行比较,也会发现自己不能做什么。我们每个人都有许多一窍不通、毫无天分的领域,在这些领域我们甚至连平庸的水平都达不到。人们,尤其是知识工作者,就不应该试图去完成这些领域的工作和任务。他们应该尽量少把精力浪费在那些不能胜任的领域上,因为从无能到平庸要比从一流到卓越需要人们付出多得多的努力。</p> +</blockquote> +<p>深有体会,不应该将时间和经历消耗在自己即使努力也达不到平庸水平的事情上,然而现实中却有很多人在被动的做着这样的事情,甚至还抱有不切实际的幻想,人生苦短,早日醒悟早日改变。</p> +<blockquote> +<p>我属于读者型,还是听者型?首先,你要搞清楚的是,你是读者型(习惯阅读信息)还是听者型(习惯听取信息)的人。绝大多数人甚至都不知道还有读者型和听者型之说,而且很少有人既是读者型又是听者型。知道自己属于哪种类型的人更少。</p> +</blockquote> +<p>这一段不知是翻译的问题还是作者没说明白,文中并未定义“读者型”、“听者型”这两种类型的工作方式具体是如何工作的,只是通过例子强调了自己工作方式的不同所带来的巨大差异。我的猜测是,“读者型”应该指的是在工作中理性和逻辑思维占上风的人,通常通过阅读逻辑缜密的文字来规划和开展工作,而“听者型”则属于感性思维偏多,通过视觉、听觉来判断事物的发展。</p> +<blockquote> +<p>如果一个组织的价值体系不为自己所接受或者与自己的价值观不相容,人们就会备感沮丧,工作效力低下。</p> +</blockquote> +<p>不要试图改变自己的价值观,这只会让你倍感痛苦,你可以更换环境或者改变组织价值体系。</p> +<blockquote> +<p>成功的事业不是预先规划的,而是在人们知道了自己的长处、工作方式和价值观后,准备把握机遇时水到渠成的。知道自己属于何处,可使一个勤奋、有能力但原本表现平平的普通人,变成出类拔萃的工作者。</p> +</blockquote> +<p>机会留给有准备的人,但前提是这个人认识到自己的长处、工作方式、价值观,所谓的把握机会,是了解了这些之后才能识别到机会。</p> +<blockquote> +<p>一般来说,一项计划的时间跨度如果超过了 18个月,就很难做到明确和具体。因此,在多数情况下我们应该提出的问题是:我在哪些方面能取得将在今后一年半内见效的结果?如何取得这样的结果?</p> +</blockquote> +<p>千里之行始于足下,如果决定开始行动,也不可把计划定的太远,自己给自己安排近期可行的执行目标,对效果要有清晰的预期,对如何取得效果应有详细而具体的计划。</p> +<blockquote> +<p>人与人之间相互信任,不一定意味着他们彼此喜欢对方,而是意味着彼此了解。因此,人们绝对有必要对自己的人际关系负责。这是一种义务。不管一个人是公司的一名成员,还是公司的顾问、供应商或经销商,他都需要对他的所有共事者负起这种责任。所谓共事者,是指在工作上他所依赖的同事以及依赖他的同事。</p> +</blockquote> +<p>成熟的处理人际关系,同样需要问文章开头的三个问题,了解他人或者共事者,是我们的义务和责任。</p> +<blockquote> +<p>在一个崇尚成功的社会里,拥有各种选择变得越来越重要。从历史上来看,却没有“成功”一说。绝大多数人只期望坚守“适当的位置”。唯一的流动性是向下的流动性。然而,在知识社会里,我们期望每一个人都能取得成功。这显然是不可能的。对许多人来说,能避免失败就行。可是有成功的地方,就会有失败。因此,有一个能够让人们做出贡献、发挥影响力或成为“大人物”的领域,这不仅对个人十分重要,对个人的家庭也同样重要。这意味着人们需要找到一个能够有机会成为领袖、受到尊重、取得成功的第二领域——可能是第二份职业,也可能是平行的职业或社会创业。</p> +</blockquote> +<p>在飞速发展(或者说在加速发展)的时代,人人都在焦虑,仿佛竞争、内卷根本无法避免,但如果合理的认识自己、管理自己,并且去用心经营的话,也许人人都有机会可以在擅长的领域做出闪光的事情,获得一份自己独有的成就。</p> +<blockquote> +<p>自我管理中面临的挑战看上去比较明显,甚至非常基本,其答案可能不言自明,甚至近乎幼稚。自我管理需要个人,尤其是知识工作者,做出以前从未做过的事情。实际上,自我管理需要每一个知识工作者在思想和行动上都要成为自己的首席执行官。</p> +</blockquote> +<p>最后一段很关键,“做出以前从未做过的事情”,即行动最为重要。这也是为什么我会花费一个小时的时间,从头又阅读一遍这篇文章,并摘录下来加以分析理解的主要原因。</p>2020年个人总结https://sbabybird.github.io/p/2020%E5%B9%B4%E4%B8%AA%E4%BA%BA%E6%80%BB%E7%BB%93/Wed, 10 Feb 2021 00:00:00 +0000https://sbabybird.github.io/p/2020%E5%B9%B4%E4%B8%AA%E4%BA%BA%E6%80%BB%E7%BB%93/<h2 id="保持好奇心">保持好奇心</h2> +<ul> +<li>大概是2011年左右,我把QQ签名改成了“好奇、求知、创造”,从此再也没有改变过,我所喜欢的、热爱的、欲罢不能的事情,都被这三个词涵盖了。</li> +<li>十年过去了,很高兴自己还能保持一颗探索未知、热爱学习的心。</li> +</ul> +<h2 id="读书">读书</h2> +<ul> +<li>现在听书比读书所占比重大,阅读时间缩水明显,翻开电子书的时间都有限,更别提手不释卷。</li> +<li>年初重温《三体》,即便很多情节已烂熟于心,重读仍有新发现,休闲阅读而已,只为放松大脑。</li> +<li>其余时间陆续阅读一些杂书《原则》、《随机漫步》、《菜根谭》、《曾国藩传》等若干。</li> +<li>唯一触动较大的是年末再次翻看《计算机程序的构造和解释》,此次配合网上的公开课视频进行,跟随原书作者课程讲解节奏,对于知识的理解大有帮助,视频虽然年代久远,但知识历久弥新,比起科技业广泛应用的新兴技术,书中的计算原理以及相关的思想更像是对应了武术的“内功心法”,一旦有所突破,则在上层应用产生巨大的提升,与工作学习都大有裨益,其中玄妙不可言说。</li> +</ul> +<h2 id="摄影">摄影</h2> +<ul> +<li>户外活动大为减少,往年春天乃摄影高产期,今年却苦于疫情无法外出,摄影爱好被迫搁置,2020年对摄影技术的练习几乎停滞,无心仪作品产出。</li> +<li>卡片相机已很少使用,手机拍摄已是主流,器材追求已解毒,但如有更新的街拍机问世,心头恐怕还是会痒。</li> +<li>有一事可提,今年独自吃饭次数很多,每次都拍食物照一张,累积下来一年竟拍了几百。</li> +</ul> +<h2 id="生活">生活</h2> +<ul> +<li>压力与机遇并存,最大收获是面对挫折、困难更坦然,2020不愿多提。</li> +<li>记忆力确实有下降之趋势,回忆起来竟无亮点,亦可能本身就比较平淡。</li> +<li>发现凡事都要低调不吭声的重要性,切记四处宣扬,否则就会出现“说出来就不灵”的魔咒。</li> +</ul> +<h2 id="学习">学习</h2> +<ul> +<li>对8bit老古董计算机的兴趣不减,四处搜寻相关知识,弄了一大堆模拟器,研究过程中竟对之前所学计算机组成原理有了新的认识和理解,喜出望外,本该大学之时就应掌握的技能,到现在再学也不迟,重在理解。</li> +<li>创意类软件如blender等也持续浅尝,进步缓慢,但入门已没问题,缺少作品练习,安排即可。</li> +<li>儿子已入大学,借用假期时间,我教他编程,他给我讲解高数,算是技能交换了,费曼学习法的一个很直接的应用案例。</li> +<li>越发觉得B站是个学习的好地方,该站以后的发展不可估量,但从教育来看,很可能迅速超越国内二流大学,或者未来改变大学的形态也未可知。</li> +</ul> +<h2 id="后续计划">后续计划</h2> +<ul> +<li>希望可以继续通过写字记录学习的知识,保持一定量的文字输出,如条件实在有限,配合语音录音也可。</li> +<li>在自己热爱的事情上,持续学习,关注一下作品输出(持续开新坑),早日成为心目中的“全栈工程师”、“三级工程师”(可参见吴军《硅谷来信》中的定义)。</li> +<li>限制烟酒摄入,保持每日的活动量,能走路就不坐车。</li> +</ul>线性回归和梯度下降https://sbabybird.github.io/p/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E5%92%8C%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D/Sun, 02 Jun 2019 00:00:00 +0000https://sbabybird.github.io/p/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E5%92%8C%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D/<h3 id="有监督学习的两种主要任务分类和回归">有监督学习的两种主要任务(分类和回归)</h3> +<ul> +<li>有监督机器学习任务主要分为两种,一种是分类任务,一般是通过学习算法实现对未知数据的分类甄别,比如判断是男性还是女性,预测明天会不会下雨等等,预测结果是离散的分类。另一种是回归任务,用于预测一个具体的值,比如房价、年龄等等,预测结果是连续的值;</li> +<li>解决回归任务比较常见的算法就是线性回归算法;</li> +</ul> +<h3 id="线性回归">线性回归</h3> +<ul> +<li>线性回归是最典型的用于回归任务的机器学习算法。它的基本原理是基于,任意一个为n的值,可以通过一个n-1阶的多项式进行拟合;</li> +<li>线性回归的算法的目标是根据已知标签数据,训练一个预测函数f(a, b),使得x输入带入ax+b这样的多项式可以得出需要预测的值;</li> +<li>所以目标是找到合适的a和b(从数学语言的精确描述来说,一般用别的符号代替,为了方便记录,我使用a和b);</li> +<li>为了找到合适的a和b,需要定义一个损失函数(也有称为代价函数的),J(a, b),用于判断a和b是否合适,比较简单的有“方差均值”法;</li> +<li>方差均值指的是,所有样本带入预测函数f,将预测值与实际值相减,取平方,求和再求平均数(暂时不知到markdown里如何加入公式);</li> +<li>那么带入损失函数,就是意味着,找到合适的a、b使得刚才那个方差均值小于一个阈值(接近最优);</li> +<li>线性回归本质上,是在平面坐标系里找到一个与样本匹配的直线,这样基于这个直线,即可预测未知的值;</li> +</ul> +<h3 id="梯度下降">梯度下降</h3> +<ul> +<li>如何找到合适的a和b,一个一个地去试是不可能的(无穷多的计算量);</li> +<li>比较典型的算法是“梯度下降”,又是牛顿起的头;</li> +<li>比较生动的描述是,想想一个三维空间图形,X和Y平面是有a和b的值构成,Z轴是损失函数的值,值最小的部分(在图上就最低的部分,像一个山谷)就是最优解;</li> +<li>从山顶的某个点上,环顾360度,找到适合下山的一小步,一点一点儿走向山谷最低处,有点像慢慢走楼梯,所以叫梯度下降;</li> +<li>从我的体会来看,这个方法有点像牛顿那个计算平方根的迭代法(根据一个猜测值,然后通过迭代公式寻找一个更加接近正确值的值,直到误差降低到合适范围);</li> +<li>从微积分的角度,就是找到损失函数J在最初尝试的那个点上的切线,并通过它的斜率(也就是导数值)乘以一个系数a,逐步逼近最低点(切线斜率为零)的过程;</li> +</ul>机器学习的学习准备https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%9A%84%E5%AD%A6%E4%B9%A0%E5%87%86%E5%A4%87/Sat, 18 May 2019 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%9A%84%E5%AD%A6%E4%B9%A0%E5%87%86%E5%A4%87/<h3 id="机器学习的概念">机器学习的概念</h3> +<p>机器学习是人工智能的一个分支,是近年来逐渐具备实用性的各种人工智能应用的基础。其本质是(我目前的个人理解)利用针对已知的数据集合抽取采样特征,然后利用某种数据模型(核心是某种算法:如kNN、SVM、朴素贝叶斯等)对数据进行计算处理,得到一组可以预测未知数据集特征的参数和手段,从而可以对数据进行预测判断的一种数据处理方法。</p> +<h3 id="机器学习相关的名词">机器学习相关的名词</h3> +<ul> +<li>神经网络:是机器学习的一种实现方式,从概念上来说,小于“机器学习”,但是由于其在图像识别、语音识别、语言翻译等领域的优异表现,以至于现在提到机器学习就认为是神经网络,实际则不然,机器学习的概念更大,更加基础,是实现神经网络应用的基础理论和方法;</li> +<li>深度学习:是神经网络的应用特例,同样是在应用层表现优异,可以理解为神经网络的一种实现;</li> +<li>大数据:机器学习的数据处理基础支撑,近年来机器学习在应用层面表现较好主要得益于大数据技术的发展,可以使得模型训练内容量级增加,极大的提高了模型准确度;</li> +<li>n维向量:来自线性代数,在机器学习中起到重要作用,在机器学习中一般用于各种特征数据的载体,在不同的算法过程中传递和计算。</li> +</ul> +<h3 id="机器学习相关的工具">机器学习相关的工具</h3> +<ul> +<li>编程语言:目前比较流行的是Python,因为有比较丰富易用的程序包,很多科技公司也开源了较为成熟的框架,再加上Python语言本身的简单易上手,使得Python成为这个领域最流行的语言。当然C和C++、Java还是实现各种算法的根基,Python更多是提供了一种调用接口;</li> +<li>iPython:Python语言的交互控制台,可以较为方便的测试、调试Python程序,有较强的交互功能,比语言发行版自带的强大;</li> +<li>jupyter:提供Python语言的Web交互界面,通过网页即可编写代码,并及时反馈执行结果,由于是B/S架构,所以可以使得运行时跟开发环境分开。编辑界面同时支持基于Markdown语法的文档编写,使得“文学化”编程成为一种可能,非常适合用于科研人员的汇报材料或论文;</li> +<li>TensorFlow:谷歌开源的机器学习框架,快速灵活部署机器学习应用,可以应用与大规模、工业级场景;</li> +<li>keras:基于Python编写的高级神经网络API,属于对机器学习的深度封装,如果以学习机器学习原理为目标的,不建议使用,还是先手动将若干种核心算法实现一遍比较深刻;</li> +</ul> +<h3 id="预期的学习方法">预期的学习方法</h3> +<ol> +<li>通过阅读相关的书籍,对于概念有所了解,这个过程可以是粗糙的浏览,不求详细的理解各种原理和算法;</li> +<li>尝试一些教学视频,了解实操的基本流程,对于自己读书得到的概念进行验证,修订理解,并熟悉基本工具的使用(如Python的numpy、plot等);</li> +<li>细读书籍,按照书中的事例进行实操,并尝试推导算法的基本原理,理解后,形成自己的文字;</li> +<li>定义简单的任务,贯穿数据准备、数据清洗、特征值提取、模型建立、模型应用各个阶段,一般来说可以是手写文字识别,或者给新闻文章分类等;</li> +<li>循环和迭代这个过程,一边输入信息,一边将学到的东西结合思考,形成有效的输出(文字、视频等);</li> +</ol>致儿子成人礼的一封信https://sbabybird.github.io/p/%E8%87%B4%E5%84%BF%E5%AD%90%E6%88%90%E4%BA%BA%E7%A4%BC%E7%9A%84%E4%B8%80%E5%B0%81%E4%BF%A1/Thu, 09 May 2019 00:00:00 +0000https://sbabybird.github.io/p/%E8%87%B4%E5%84%BF%E5%AD%90%E6%88%90%E4%BA%BA%E7%A4%BC%E7%9A%84%E4%B8%80%E5%B0%81%E4%BF%A1/<p>序言我儿,见信如面。在这个即时通讯如此发达的时代,我选择写一封长信,以表示对你即将成人的祝贺。</p> +<p>我陷入沉思了一会儿,考虑该给你讲些什么道理。但我很快意识到,“道理”这种东西,靠听和说没有用,只能自己去感悟。而我自己也十分讨厌被说教,所以我会克制想要给你讲一番大道理的冲动,尽量避免不对等的交流形式。</p> +<p>我想我还是跟你分享一些我对这个世界的思考和想法吧。</p> +<p>茨威格在《人类群星闪耀》中写到“一个人最幸运的事情就是在他思想最活跃、精力最充沛的时候找到了他的人生使命”。看来大家都把寻找人生使命当做比较重要事情来看待。姑且就当做我这封信的主题吧。</p> +<p>寻找人生使命本质上是通过尝试在一些方向上的努力来实现对人生价值和意义的探索,每个人或多或少、或深或浅都要做这样的尝试。</p> +<p>你们学校把“成人礼”包装成一个重要的人生节点,想必是希望给你们一些感觉,让你们意识到,从这一刻起,你们开始对自己的行为负责,要开始尝试去寻找和探索了。</p> +<p>那么该如何去探索,我有一些自己的看法。</p> +<p>首先要相信一点,那就是无论是否还在上学,学习和完善自己都是一辈子的事情,不存在一个可以停止学习的时间点。就我个人来说,无论是读大学的时候还是参加工作以后,从来没有在提升自己方面有过松懈的想法,甚至我感觉工作之后对知识的渴望更加强烈了,学到的东西也比在校园里多得多。</p> +<p>当然了,学习方式跟你目前在学校这种还是差别挺大的,强度也没有那么辛苦。而且工作之后的这种学习方式才是我最认可的方式。什么方式?</p> +<p>我们一起讨论过几次王阳明的“知行合一”,为了不扯那么远,简单来说,刚才提到的学习方式就是老王早就提出的“事儿上练”。通过不断地实践,各种经历,才是学习知识的源泉。这也是为啥我在开头就说道理只能感悟不可说教,怎么感悟?事儿上感悟!经历多了自然懂。</p> +<p>所以也不用一下子被“寻找人生使命”这种“宏大话题”给吓住了,保持学习的心态,放松大胆地去经历各种事情,就是这么个过程。</p> +<p>然后呢,就是在做事的过程中,保持一颗善良、为他人多着想的心。关于这一点,我的体会是,“助人为快乐之本”真的不是一句空话。远的不说,你看你爷爷奶奶平日里多么乐于助人,用乐善好施形容他们一点儿也不为过。他们因此收获了广泛的认可,也给这个家庭带来了积极向上的生活氛围,对你老爹我向好的方面发展也起到了关键作用。</p> +<p>再有一点,也是我个人非常推崇的,就是最好能时刻对世界保持强烈的好奇心。</p> +<p>刘慈欣在短篇科幻小说《朝闻道》中讲了一个故事。外星高等文明在监视地球人类进化的过程中,距离现在几十万年前的一个原始人抬头望了望夜晚的天空,凝视了一会儿。这看似随意的行为使得外星人的警报器响了起来,因为这意味着,人类的好奇心已经发展到了星空,同时也意味着人类文明将要开始爆发式发展了。可见好奇心的重要。</p> +<p>好奇心一方面是推动我们前进的动力,同时也使得我们平凡的生活变得不那么枯燥。</p> +<p>你能经常提出一些有时连我都无法回答的问题,这让我也颇感欣慰,有些答案注定要自己去摸索着发现,我希望你能多多提问,也多自己思考,不用去管答案是什么。</p> +<p>稀稀拉拉写了这么多,估计你也不能理解太多,我像你这个年纪时估计也理解不了。不过也没关系,只是给你讲讲我个人通过思考得到的观点而已,说不定你自己以后有不同的发现,当然如果能在你以后的发展中起到一点儿提醒作用,也就挺好了。</p> +<p>希望你这次“成人礼”活动就像人类文明那一次一次对星空的凝望那样,使你能够进入人生的一个新的高速发展阶段。</p> +<p>祝:学习进步,健康成长!</p> +<p>二零一九年五月九日 写于贵阳机场</p>《高效能人士的七个习惯》读书笔记https://sbabybird.github.io/p/%E9%AB%98%E6%95%88%E8%83%BD%E4%BA%BA%E5%A3%AB%E7%9A%84%E4%B8%83%E4%B8%AA%E4%B9%A0%E6%83%AF%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/Tue, 07 May 2019 00:00:00 +0000https://sbabybird.github.io/p/%E9%AB%98%E6%95%88%E8%83%BD%E4%BA%BA%E5%A3%AB%E7%9A%84%E4%B8%83%E4%B8%AA%E4%B9%A0%E6%83%AF%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/<ol> +<li>积极是内在的,是选择的自由,是人性中最不能剥夺的部分。</li> +<li>以终为始,是要知道自己要什么,并以原则为重心,所做的决策是主动选择的结果,而非被环境所迫使的结果。</li> +<li>人类的四个天赋分别是,自我意识,良知,想象力,独立意志。</li> +<li>第四代时间管理,以原则为中心,以周为单位,设定自己所扮演的各项角色欲达成的三个重要成果,安排出每一天的第一要务,更理想的是当作每一天的特殊约会,全力以赴。每周都回顾上周周日程完成情况以及制定新的周日程,并每日调整。</li> +<li>对人不可讲效率,对事才可如此,对人应该讲效用,即某一行为是否有效。</li> +<li>以原则为重心,以良知为导向(人比事儿更重要),针对个人独有的使命,平衡发展生活中不同角色,全盘规划日常生活。</li> +<li>要想充分授权必须要具备的默契和共识包括: +<ol> +<li>预期成果。</li> +<li>应遵守的规范。</li> +<li>可用的资源。</li> +<li>责任的归属,约定考评的标准和次数。</li> +<li>明确的奖惩制度。</li> +</ol> +</li> +<li>在双赢协议中,对以下5要素应该有明确的规定。 +<ol> +<li>预期结果,确认目标和实现,方法不计。</li> +<li>指导方针,确认实现目标的原则,方针和行为限度。</li> +<li>可用资源,包括人力,财力,技术或者组织资源。</li> +<li>任务考核,建立业绩评估标准和时间。</li> +<li>奖惩制度,根据任务考核确定奖惩。</li> +</ol> +</li> +<li>制定好目标之后,还要看你的组织体系是否与目标相符合,否则就要调整系统体系。</li> +<li>我们总是喜欢匆匆忙忙地下结论,以善意的建议快刀斩乱麻地解决问题。不愿意花时间去诊断,深入了解问题的症结。</li> +</ol>《管理十诫》读书笔记https://sbabybird.github.io/p/%E7%AE%A1%E7%90%86%E5%8D%81%E8%AF%AB%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/Tue, 30 Apr 2019 00:00:00 +0000https://sbabybird.github.io/p/%E7%AE%A1%E7%90%86%E5%8D%81%E8%AF%AB%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/<ol> +<li>首先要通过分析知道问题是什么,才能真正洞悉解决问题的办法。</li> +<li>归根结底,所有公司最后的生命线都是信任问题,顾客要相信企业生产的产品正如它所许诺的那样好,投资者要相信公司的管理层是有能力的,员工要相信公司管理者能够兑现承诺。</li> +<li>他们根本想不到人都有缺陷,包括他们自己在内也都不是完美的。</li> +<li>问题的关键不在于机器会不会想问题,而在于人会不会想问题。</li> +<li>真正让我们陷入麻烦的并非那些我们根本不懂的东西,而是我们一知半解的东西。</li> +<li>有一种心理偏见叫做肯定的陷阱,它指的是我们努力想证明自己的观点,而非找出自己观点中的错误之处。</li> +<li>深思熟虑并不是浪费时间,而是必要之举。</li> +<li>除非有人能停下来想一想,否则一再犯同样的错误是很容易的。对每个错误都有必要进行反思和总结。</li> +<li>如果你能承认自己犯了错误,承认自己并不是战无不胜,那么你反而能得到好处。</li> +<li>管理是一门艺术,而不是一种科学。如果遇到那些想要量化人类行为的专家,你就要保持警惕了。</li> +<li>行业中的每个公司都应该力争标新立异,让自己变的与众不同,而不是随大溜。</li> +<li>要憎恨组织里的官僚作风——通用电气公司杰克·韦尔奇写给股东的信中写道。如果你想一事无成的话,那就让行政流程占据主导地位好了,去崇尚官僚主义就行了。</li> +<li>不能创造生产力的工作越努力越失败,要时刻警惕并搜寻身边那些并不能创造生产力的工作。</li> +<li>每个公司其实主要就是为现有的客户提供优质服务并努力开拓新客户群。我们在花每一分钱、设立每一个部门或是接手每一个项目时,都要问自己一个基本的问题:这能帮我们带来新客户或是为客户提供更好的服务吗?</li> +<li>将注意力放在失败上是最大的悲观主义。只要稍稍抬起你的头,改变一下你的态度,那么你的世界观就会发生巨大的变化。</li> +</ol>事如春梦了无痕https://sbabybird.github.io/p/%E4%BA%8B%E5%A6%82%E6%98%A5%E6%A2%A6%E4%BA%86%E6%97%A0%E7%97%95/Thu, 19 Jul 2018 00:00:00 +0000https://sbabybird.github.io/p/%E4%BA%8B%E5%A6%82%E6%98%A5%E6%A2%A6%E4%BA%86%E6%97%A0%E7%97%95/<p>上苍保佑吃饱饭撑着的人,中午吃完饭抽烟的时候,刷了几页微博,可能跟我关注的人有关(我一般关注段子手或者文艺思想贩卖者),感觉内容作为消遣挺合适,但是越看呢,越觉得没有营养,可能是跟我刚抽完烟进入贤者时间有关,一把把微博推开的时候(合上屏幕),心里竟涌现出一句“都是吃饱了撑的”,用以评价刚刚看过的几段不痛不痒的文字。</p> +<p>发完感慨随即想到,这句话是不是可以作为一本非常扯淡的书名呢?然后开始畅想自己写一本这样的书,里面的内容天马行空,多为吃饱了没事儿干的人才会忧伤和考虑的事情,饱暖之后各种忧虑和焦躁的事情可以化作各种思考,用于填满本书,作为同病相怜者证明自己不再孤独的弹药,一旦物质状态不能满足,则书中的内容立即退化到可有可无的状态。</p> +<p>真的,我这两三年来,刷牙沉思录这种哗众取宠的段子写了不少,缺少深度的技术文章也写过几篇,以吃饱了撑着来进行衡量的话,还真的比较符合标准,如果加以艺术润色的话,真难说能不能包装成为一本具备贩卖价值的书,至少想到这个问题之后,被自己震惊了一下,进一步对人生需求的几个层次有了切身认识。</p> +<p>无论我再怎么黑自己,有一点是不会改变,我写的那些东西至少保留了我一部分的回忆,它们记载了我在某一段时期内的心智情况,无论是用词还是造句,都能从一个侧面反映我当时的状态。而我的人生正是由若干个这样的状态所组成,随着年龄的增长,我的记忆力会越来越差,如果能够多记录一些东西下来,就算是那种吃饱了撑着才能思考的问题,也将使未来的我读起来热泪盈眶。</p> +<p>不过信息世界的问题在于,资料保存的永久性很不靠谱,说不定哪天这些信息就不在了(我写在msn空间的博客一篇也没了),甚至安全性还比不了一个纸质的笔记本,但我仍然不做过多的努力和担忧,倘若保存良好,那就作为未来回忆的佐料,倘若不幸丢失了,那就随他去吧。因为在写这些东西的同时,我已经感受一次生活了,本来也是留不住的东西,事如春梦了无痕嘛。</p>SICP 课后练习题1.9https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.9/Mon, 05 Jan 2015 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.9/<h4 id="练习-19--下面两个过程各定义了一种加起两个正整数的方法他们都基于过程inc它将参数增加1和dec它将参数减少1-请用代换模型展示这两个过程在求值add-4-5时所产生的计算过程这些计算过程是递归的或者迭代的吗">练习 1.9 下面两个过程各定义了一种加起两个正整数的方法,他们都基于过程inc(它将参数增加1)和dec(它将参数减少1) 。请用代换模型展示这两个过程在求值<code>(add 4 5)</code>时所产生的计算过程。这些计算过程是递归的或者迭代的吗?</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">add</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">= </span><span class="nv">a</span> <span class="mi">0</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">b</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="p">(</span><span class="nf">dec</span> <span class="nv">a</span><span class="p">)</span> <span class="nv">b</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">add</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">= </span><span class="nv">a</span> <span class="mi">0</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">b</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="p">(</span><span class="nf">dec</span> <span class="nv">a</span><span class="p">)</span> <span class="p">(</span><span class="nf">inc</span> <span class="nv">b</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> +</span></span></code></pre></td></tr></table> +</div> +</div><p>解答:根据代换模型分别展开如下</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span><span class="lnt">15 +</span><span class="lnt">16 +</span><span class="lnt">17 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">4</span> <span class="mi">5</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="mi">3</span> <span class="mi">5</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="mi">2</span> <span class="mi">5</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="mi">1</span> <span class="mi">5</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="mi">0</span> <span class="mi">5</span><span class="p">)))))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="mi">5</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="mi">6</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="mi">7</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="mi">8</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="mi">9</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">4</span> <span class="mi">5</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">3</span> <span class="mi">6</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">2</span> <span class="mi">7</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">1</span> <span class="mi">8</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">0</span> <span class="mi">9</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="mi">9</span><span class="p">)</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>根据展开可以看出,第一个计算过程是递归的,因为明显有一个逐步扩展然后又收缩的递归计算链条。第二个计算过程是迭代的,没有扩展、收缩的过程,而是使用a和b存储了常量。</p>SICP 课后练习题1.8https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.8/Mon, 29 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.8/<h4 id="练习-18-求立方根的牛顿法基于如下事实如果y是x的立方根的一个近似值那么下式将给出一个更好的近似值">练习 1.8 求立方根的牛顿法基于如下事实,如果y是x的立方根的一个近似值,那么下式将给出一个更好的近似值:</h4> +<p>$$ \frac{x/y^2+2y}{3} $$</p> +<p>请利用这一公式实现一个类似平方根过程的求立方根的过程。</p> +<p>解答:基本思路与求解平方根的实现是一致的,区别再有得到更好值<code>improve</code>的过程有变化,只需根据公式描述进行实现即可</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span><span class="lnt">15 +</span><span class="lnt">16 +</span><span class="lnt">17 +</span><span class="lnt">18 +</span><span class="lnt">19 +</span><span class="lnt">20 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">/</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">+ </span><span class="p">(</span><span class="nb">/ </span><span class="nv">x</span> <span class="p">(</span><span class="nb">* </span><span class="nv">guess</span> <span class="nv">guess</span><span class="p">))</span> <span class="p">(</span><span class="nb">* </span><span class="nv">guess</span> <span class="mi">2</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="mi">3</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">next</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">&lt; </span><span class="p">(</span><span class="nb">/ </span><span class="p">(</span><span class="nb">abs </span><span class="p">(</span><span class="nb">- </span><span class="nv">guess</span> <span class="nv">next</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="nv">guess</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mf">0.001</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nb">abs </span><span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&lt; </span><span class="nv">x</span> <span class="mi">0</span><span class="p">)</span> <span class="p">(</span><span class="nb">- </span><span class="nv">x</span><span class="p">)</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">cbrt-iter</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">cbrt-iter</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> <span class="nv">x</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">cbrt</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">cbrt-iter</span> <span class="mf">1.0</span> <span class="nv">x</span><span class="p">))</span> +</span></span></code></pre></td></tr></table> +</div> +</div>SICP 课后练习题1.7https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.7/Sat, 27 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.7/<h4 id="练习-17-对于确定很小的数的平方根而言在计算平方根中使用的检测good-enough是很不好的还有在现实的计算机里算术运算总是以一定的有限精度进行的这也会使我们的检测不适合非常大的数的计算请解释上述论断用例子说明对很小和很大的数这种检测都可能失败实现good-enough的另一种策略是监视猜测值在从一次迭代到下一次的变化情况当改变值相对于猜测值的比率很小时就结束请设计一个采用这种终止测试方式的平方根过程对于很大和很小的数这一方式都能工作吗">练习 1.7 对于确定很小的数的平方根而言,在计算平方根中使用的检测good-enough?是很不好的。还有,在现实的计算机里,算术运算总是以一定的有限精度进行的。这也会使我们的检测不适合非常大的数的计算。请解释上述论断,用例子说明对很小和很大的数,这种检测都可能失败。实现good-enough?的另一种策略是监视猜测值在从一次迭代到下一次的变化情况,当改变值相对于猜测值的比率很小时就结束。请设计一个采用这种终止测试方式的平方根过程。对于很大和很小的数,这一方式都能工作吗?</h4> +<p>解答:good-enough?当前采用的判断方式是,对比猜测值的平方结果与X的值之间的差距,当差距小于某个阙值时(比如0.001),就停止计算。当X很小或很大时,这种检测就会失败,比如,假设我们的阙值设置为0.001,那么当X本身小于这个阙值时,就会检测失败,得出错误结果,当X很大时,也会由于精度不足而一直达不到最佳猜测值,导致死循环。</p> +<p>因此,要解决这一问题,可以按照题目中给出的思路对good-enough?过程进行修改,不再判断猜测值平方与X的差距,而是判断两次猜测值之间的比率。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span><span class="lnt">15 +</span><span class="lnt">16 +</span><span class="lnt">17 +</span><span class="lnt">18 +</span><span class="lnt">19 +</span><span class="lnt">20 +</span><span class="lnt">21 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">next</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">&lt; </span><span class="p">(</span><span class="nb">/ </span><span class="p">(</span><span class="nb">abs </span><span class="p">(</span><span class="nb">- </span><span class="nv">guess</span> <span class="nv">next</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="nv">guess</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mf">0.001</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: good-enough?</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">sqrt-iter</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">sqrt-iter</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> <span class="nv">x</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: sqrt-iter</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="nb">sqrt </span><span class="mf">0.00000000001</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 3.1622776601874535e-6</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="nb">sqrt </span><span class="mi">100000000000000000000000000000000000000000000</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 1.0000000000001497e22</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>在新的<code>good-enough?</code>中,传入的是两次猜测值,所以还要修改<code>sqrt-iter</code>过程,在调用时计算两次猜测值。</p>SICP 课后练习题1.6https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.6/Tue, 23 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.6/<p>采用牛顿法求平方根的过程如下。开始时,我们有了被开方数的值(现在需要做的就是算出它的平方根)和一个猜测值。如果猜测值已经足够好了,有关工作也就完成了。如若不然,那么就需要改进猜测值(求出猜测值与被开方数除以猜测值的平均值),并重复这个计算过程。具体编写代码如下(在MIT scheme解释器中)。</p> +<p>定义<code>sqrt-iter</code>过程,与上述描述完全对应。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">sqrt-iter</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">guess</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">sqrt-iter</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">x</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: sqrt-iter</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义改进猜测值的过程<code>improve</code>,返回猜测值与被开方数除以猜测值的平均值。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">average</span> <span class="nv">guess</span> <span class="p">(</span><span class="nb">/ </span><span class="nv">x</span> <span class="nv">guess</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: improve</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义求平均数的过程<code>average</code>。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">average</span> <span class="nv">x</span> <span class="nv">y</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">/ </span><span class="p">(</span><span class="nb">+ </span><span class="nv">x</span> <span class="nv">y</span><span class="p">)</span> <span class="mi">2</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: average</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义判断猜测值是否足够好的过程<code>good-enough?</code>。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">&lt; </span><span class="p">(</span><span class="nb">abs </span><span class="p">(</span><span class="nb">- </span><span class="p">(</span><span class="nf">square</span> <span class="nv">guess</span><span class="p">)</span> <span class="nv">x</span><span class="p">))</span> <span class="mf">0.001</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: good-enough?</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义求绝对值和平方的过程</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span><span class="lnt">8 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nb">abs </span><span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&lt; </span><span class="nv">x</span> <span class="mi">0</span><span class="p">)</span> <span class="p">(</span><span class="nb">- </span><span class="nv">x</span><span class="p">)</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: abs</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">square</span> <span class="nv">x</span><span class="p">)</span> <span class="p">(</span><span class="nb">* </span><span class="nv">x</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: square</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义最上层的过程,用于启动整个工作(使用<code>1</code>这个数字作为任何数的初始猜测值)。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nb">sqrt </span><span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">sqrt-iter</span> <span class="mf">1.0</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: sqrt</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>执行<code>sqrt</code>过程,并以<code>9</code>为参数,求得平方根为<code>3</code></p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="nb">sqrt </span><span class="mi">9</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 3.00009155413138</span> +</span></span></code></pre></td></tr></table> +</div> +</div><h4 id="练习16----alyssa-phacker看不出来为什么需要将if提供为一种特殊形式她问为什么我不能直接通过cond将它定义为一个常规过程呢alyssa的朋友eva-lu-ator断言确实可以这样做并定义了if的一个新版本">练习1.6 Alyssa P.Hacker看不出来为什么需要将if提供为一种特殊形式,她问:“为什么我不能直接通过<code>cond</code>将它定义为一个常规过程呢?”Alyssa的朋友Eva Lu Ator断言确实可以这样做,并定义了<code>if</code>的一个新版本:</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">new-if</span> <span class="nv">predicate</span> <span class="nv">then-clause</span> <span class="nv">else-clause</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">cond </span><span class="p">(</span><span class="nf">predicate</span> <span class="nv">then-clause</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">else </span><span class="nv">else-clause</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: new-if</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>Eva给Alyssa演示她的程序:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">new-if</span> <span class="p">(</span><span class="nb">= </span><span class="mi">2</span> <span class="mi">3</span><span class="p">)</span> <span class="mi">0</span> <span class="mi">5</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mi">5</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">new-if</span> <span class="p">(</span><span class="nb">= </span><span class="mi">1</span> <span class="mi">1</span><span class="p">)</span> <span class="mi">0</span> <span class="mi">5</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mi">0</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>她很高兴地用自己的<code>new-if</code>重写了求平方根的程序:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">sqrt-iter</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">new-if</span> <span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">guess</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">sqrt-iter</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">x</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: sqrt-iter</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>当Alyssa试着用这个过程去计算平方根时会发生什么事情呢?请给出解释。</p> +<p>解答:</p> +<p>这个练习引入了一个新的思考,刚开始时,我以为是牵涉到了过程的局部参数概念,因为在新编写的<code>new-if</code>过程中,看似可以完成条件判断并返回正确的值,但是在本例中使用却存在问题,即在递归调用<code>sqrt-iter</code>时,传给该过程的<code>guess</code>和<code>x</code>为<code>new-if</code>的局部参数,被返回给了<code>new-if</code>这个过程,不会向上返回到上一层<code>sqrt-iter</code>里,这样就导致了改进的猜测值永远不会被使用,使得这个计算过程永远不会结束(除非第一个猜测值恰好合适),从而导致递归调用的陷入无限循环。我在<code>MIT-scheme</code>解释器里的执行结果是,解释器自动退出并提示我递归调用深度超出最大值。</p> +<p>上述看起来是合理的,但是后来我考虑了其他情况,及本书在前面章节里提到了if<code>(if &lt;predicate&gt; &lt;consequent&gt; &lt;alternative&gt;)</code>语句是条件表达式的受限形式,在执行时,先判断<code>predicate</code>是否为真,然后根据结果只执行其后<code>consequent/alternative</code>中的一个。如果使用本例新定义的<code>new-if</code>则作为普通过程执行,传入的参数会因为解释器使用应用序求值的原因,两个表达式都会被立即求值,反应到本例中就是<code>guess</code>和<code>(sqrt-iter (improve guess x) x)</code>都会被立即求值,后面的那句是属于递归调用,这样也会导致改进的猜测值永远不会被使用,陷入无限层的递归调用中。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="nb">sqrt </span><span class="mi">9</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Aborting!: maximum recursion depth exceeded</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>思考:</p> +<p>最初的时候,我的针对此题的思考方式是变量的作用域问题(可能lisp不会有此问题),后来发现,也许不是这样,而是由于对传入参数立即求值导致的,后续的网上搜索结果也显示出大家的答案都倾向于后者。</p>SICP 课后练习题1.4https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.4/Fri, 19 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.4/<h4 id="练习14----请仔细考察上面给出的允许运算符为复合表达式的组合式的求值模型根据对这一模型的认识描述下面过程的行为">练习1.4 请仔细考察上面给出的允许运算符为复合表达式的组合式的求值模型,根据对这一模型的认识描述下面过程的行为。</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">a-plus-abs-b</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">((</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="mi">0</span><span class="p">)</span> <span class="nv">+</span> <span class="nv">-</span><span class="p">)</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">))</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>练习1.4,通过if判断,根据b的值决定对a b所使用的运算符是+还是-,如果b大于0,则组合式为(+ a b),反之则为(- a b),所以组合式结果永远返回a加上b的绝对值。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span><span class="lnt">8 +</span><span class="lnt">9 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">a-plus-abs-b</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">((</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="mi">0</span><span class="p">)</span> <span class="nv">+</span> <span class="nv">-</span><span class="p">)</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: a-plus-abs-b</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">a-plus-abs-b</span> <span class="mi">4</span> <span class="mi">2</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 6</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">a-plus-abs-b</span> <span class="mi">4</span> <span class="mi">-2</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 6</span> +</span></span></code></pre></td></tr></table> +</div> +</div>SICP 课后练习题1.5https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.5/Fri, 19 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.5/<h4 id="练习15---ben-bitdiddle发明了一种检测方法能够确定解释器究竟采用哪种序求值是采用应用序还是正则序他定义了下面两个过程">练习1.5 Ben Bitdiddle发明了一种检测方法,能够确定解释器究竟采用哪种序求值,是采用应用序,还是正则序。他定义了下面两个过程</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">p</span><span class="p">)</span> <span class="p">(</span><span class="nf">p</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">test</span> <span class="nv">x</span> <span class="nv">y</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">= </span><span class="nv">x</span> <span class="mi">0</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mi">0</span> +</span></span><span class="line"><span class="cl"> <span class="nv">y</span><span class="p">))</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>而后他求值下面的表达式:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">test</span> <span class="mi">0</span> <span class="p">(</span><span class="nf">p</span><span class="p">))</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>如果某个解释器采用的是应用序求值,Ben会看到什么样的情况?如果解释器采用正则序求值,他又会看到什么情况?请对你的回答做出解释。(无论采用正则序或者应用序,假定特殊形式if的求值规则总是一样的。其中的谓词部分先行求值,根据其结果确定随后求值的子表达式部分。)</p> +<p>练习1.5 『完全展开而后规约』的求值模型为正则序求值,『先求值参数而后应用』的方式为应用序求值,因此,在应用序求值的模式下,执行<code>(test 0 (p))</code>时会先求<code>(p)</code>这个表达式的值,而根据定义<code>(define (p) (p))</code>执行<code>(p)</code>会造成递归调用,解释器陷入死循环。而在正则序求值模式下,会先展开<code>test</code>过程,根据需要再决定是否执行<code>(p)</code>,在本例中,由于传入的<code>x</code>等于<code>0</code>,所以<code>(p)</code>不会被执行,因此不会陷入死循环。</p> +<p>所以,根据以上分析,如果解释器采用的是应用序求值,则解释器陷入死循环,如果是采用正则序求值,则解释器输出<code>;Value: 0</code>。</p>SICP 课后练习题1.1https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.1/Mon, 15 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.1/<h4 id="练习11----下面是一系列表达式对于每个表达式解释器将输出什么结果假定这一系列表达式是按照给出的顺序逐个求值的">练习1.1 下面是一系列表达式,对于每个表达式,解释器将输出什么结果?假定这一系列表达式是按照给出的顺序逐个求值的。</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span><span class="lnt">15 +</span><span class="lnt">16 +</span><span class="lnt">17 +</span><span class="lnt">18 +</span><span class="lnt">19 +</span><span class="lnt">20 +</span><span class="lnt">21 +</span><span class="lnt">22 +</span><span class="lnt">23 +</span><span class="lnt">24 +</span><span class="lnt">25 +</span><span class="lnt">26 +</span><span class="lnt">27 +</span><span class="lnt">28 +</span><span class="lnt">29 +</span><span class="lnt">30 +</span><span class="lnt">31 +</span><span class="lnt">32 +</span><span class="lnt">33 +</span><span class="lnt">34 +</span><span class="lnt">35 +</span><span class="lnt">36 +</span><span class="lnt">37 +</span><span class="lnt">38 +</span><span class="lnt">39 +</span><span class="lnt">40 +</span><span class="lnt">41 +</span><span class="lnt">42 +</span><span class="lnt">43 +</span><span class="lnt">44 +</span><span class="lnt">45 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"><span class="mi">10</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 10</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="mi">5</span> <span class="mi">3</span> <span class="mi">4</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 12</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">9</span> <span class="mi">1</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 8</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">/ </span><span class="mi">6</span> <span class="mi">2</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 3</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="p">(</span><span class="nb">* </span><span class="mi">2</span> <span class="mi">4</span><span class="p">)</span> <span class="p">(</span><span class="nb">- </span><span class="mi">4</span> <span class="mi">6</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 6</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">define </span><span class="nv">a</span> <span class="mi">3</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: a</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">define </span><span class="nv">b</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="mi">1</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: b</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="nv">b</span> <span class="p">(</span><span class="nb">* </span><span class="nv">a</span> <span class="nv">b</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 19</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">= </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: #f</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="k">and </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="nv">a</span><span class="p">)</span> <span class="p">(</span><span class="nb">&lt; </span><span class="nv">b</span> <span class="p">(</span><span class="nb">* </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"><span class="nv">b</span> +</span></span><span class="line"><span class="cl"><span class="nv">a</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 4</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">cond </span><span class="p">((</span><span class="nb">= </span><span class="nv">a</span> <span class="mi">4</span><span class="p">)</span> <span class="mi">6</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">((</span><span class="nb">= </span><span class="nv">b</span> <span class="mi">4</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="mi">6</span> <span class="mi">7</span> <span class="nv">a</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">else </span><span class="mi">25</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 16</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="mi">2</span> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="nv">a</span><span class="p">)</span> <span class="nv">b</span> <span class="nv">a</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 6</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">* </span><span class="p">(</span><span class="k">cond </span><span class="p">((</span><span class="nb">&gt; </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> <span class="nv">a</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">((</span><span class="nb">&lt; </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">else </span><span class="mi">-1</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="mi">1</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 16</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>练习1.1的内容比较简单,基本上直接就可以计算出表达式的值,所有表达式都可以在mit-scheme的交互解释器里进行验证。</p>SICP 课后练习题1.2https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.2/Mon, 15 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.2/<h4 id="练习12----请将下面表达式变换为前缀形式">练习1.2 请将下面表达式变换为前缀形式:</h4> +<p>$$ \frac{5+4+\Bigl(2-\Bigl(3-\left(6+\frac{4}{5}\right)\Bigr)\Bigr)}{3\left(6-2\right)\left(2-7\right)} $$</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"><span class="p">(</span><span class="nb">/ </span><span class="p">(</span><span class="nb">+ </span><span class="mi">5</span> +</span></span><span class="line"><span class="cl"><span class="mi">4</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">2</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">3</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="mi">6</span> <span class="p">(</span><span class="nb">/ </span><span class="mi">4</span> <span class="mi">5</span><span class="p">)))))</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">* </span><span class="mi">3</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">6</span> <span class="mi">2</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">2</span> <span class="mi">7</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: -37/150</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>练习1.2,直接将数学表达式转换为前序表达式即可,在写的时候可以遵循一下排版规则,即同一个运算符的表达式垂直对齐。</p>SICP 课后练习题1.3https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.3/Mon, 15 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.3/<h4 id="练习13----请定义一个过程它以三个数为参数返回其中较大两个数之和">练习1.3 请定义一个过程,它以三个数为参数,返回其中较大两个数之和。</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span><span class="lnt">8 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">max-three-number</span> <span class="nv">a</span> <span class="nv">b</span> <span class="nv">c</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="nv">c</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="nv">c</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">a</span> <span class="nv">c</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">b</span> <span class="nv">a</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">b</span> <span class="nv">c</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">max-three-number</span> <span class="mi">42</span> <span class="mi">7</span> <span class="mi">1</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 49</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>练习1.3,解决此练习中问题的方法比较多,本答案使用比较朴素的方法,先比较出最大的两个数字,然后将其相加,对于三个数字来说,先在前两个中选取一个大的,然后将其与后面两个中比较大的那一个相加。还有一种思路就是可以先定义出比较大小的方法,然后再调用之,或者先对数字按从小到大排序然后加最后两个,等等。</p>win8系统下使用笔记本作为wifi热点https://sbabybird.github.io/p/win8%E7%B3%BB%E7%BB%9F%E4%B8%8B%E4%BD%BF%E7%94%A8%E7%AC%94%E8%AE%B0%E6%9C%AC%E4%BD%9C%E4%B8%BAwifi%E7%83%AD%E7%82%B9/Thu, 13 Feb 2014 00:00:00 +0000https://sbabybird.github.io/p/win8%E7%B3%BB%E7%BB%9F%E4%B8%8B%E4%BD%BF%E7%94%A8%E7%AC%94%E8%AE%B0%E6%9C%AC%E4%BD%9C%E4%B8%BAwifi%E7%83%AD%E7%82%B9/<h1 id="win8系统下使用笔记本作为wifi热点">win8系统下使用笔记本作为wifi热点</h1> +<h2 id="背景">背景</h2> +<p>在没有无线路由的情况下,比如出差在宾馆,如果手里有一台可以上网的笔记本电脑,则可以给手机、平板电脑或者其他笔记本提供一个可以上网的wifi热点。</p> +<p>我平时在单位即通过此方式给我的平板电脑和手机共享网络通道,比较方便实用,近期在使用的过程中遇到一些问题,经过摸索,解决了问题,在此记录一下,方便以后查阅。</p> +<h2 id="环境需要">环境需要</h2> +<ul> +<li>一台通过有线连接上网(或者通过3G上网,就是说wifi网卡没有被占用)的笔记本电脑</li> +<li>安装有win8操作系统(win7应该也可以)</li> +<li>无线网卡芯片是intel的(否则可能不支持此技术),并使用了最新的驱动程序</li> +</ul> +<h2 id="基本步骤">基本步骤</h2> +<ul> +<li> +<p>打开具有管理员权限的控制台窗口(在win8系统下,可以通过按<code>windows+x</code>键,然后在弹出的菜单里选择『命令提示符(管理员)』)</p> +</li> +<li> +<p>输入如下命令 <code>netsh wlan set hostednetwork mode=allow ssid=&quot;mywifi&quot; key=&quot;12345678&quot;</code> <em>其中ssid后面的热点名称和key后面的密码可以根据情况自行决定</em></p> +</li> +<li> +<p>上一个命令完成后,如果没有异常的话,则输入如下命令 <code>netsh wlan start hostednetwork</code> <em>这条命令如果执行成功会显示『已启动承载网络』,在下次系统重启后需要重新执行,如果嫌麻烦则可以做一个批处理文件每次双击即可</em></p> +</li> +<li> +<p>成功启动承载网络之后,进入『网络和共享中心』点击『更改适配器设置』,此时在该页里应该可以看到一个虚拟网卡(名称一般叫MicrosoftVirtual WiFi Miniport Adapter),右键点击那个可以上网的网络连接(如果是有线连接就是那个『本地连接』,如果是3G的则根据情况而定,总之必须是那个可以上网的连接),选择『属性』,切换到『共享』页,勾选『允许其他网络用户通过此计算机的Internet连接来连接』,在下面的下拉列表里选择那个刚虚拟出来的虚拟网卡。确定即可。</p> +</li> +</ul> +<h2 id="常见问题">常见问题</h2> +<p>执行以上第二条命令启动承载网络后,有时会显示『无法启动承载网络,组或资源的状态不是执行请求操作的正确状态』,网上大部分的文章针对这个问题给出的解决办法都是更新网卡驱动,可是对于我的笔记本无效,因为我的笔记本电脑在前一段时间是好用的,后来不好用了,根据我的摸索,解决这个问题的办法是,去『设备管理器』下面的『网络适配器』里面找找,看看有没有被禁用的设备,比如『微软托管网络协议』,如果禁用了再重新启用即可正常使用此功能了。</p>使用vs2008编译mongodbhttps://sbabybird.github.io/p/%E4%BD%BF%E7%94%A8vs2008%E7%BC%96%E8%AF%91mongodb/Thu, 07 Nov 2013 00:00:00 +0000https://sbabybird.github.io/p/%E4%BD%BF%E7%94%A8vs2008%E7%BC%96%E8%AF%91mongodb/<h2 id="背景问题">背景问题</h2> +<p>mongodb在windwos下的官方编译包是使用vs2010编译的,从官网上下载的源代码在vs2008环境下不能直接编译通过,因为mongodb提供的相关配置文件是针对vs2010的,可能是因为mongodb最新的代码使用了部分C++11的特性,而vs2008没有提供对C++11支持的原因。可是我们在一个具体的项目上需要在vs2008环境下使用mongodb,只好通过手工修改部分配置和代码的办法完成编译。</p> +<h2 id="环境准备">环境准备</h2> +<p>mongodb是使用scons进行编译控制的,所以在进行以下编译之前需要安装并配置好如下环境:</p> +<h3 id="python27">python2.7</h3> +<p>官方建议是安装python2.7版本,而且要在环境变量PATH中加入python的安装路径和python/scripts的路径,以便在命令行中执行python脚本。 +<em>不过我在编译的时候使用的是python2.6版本,也没有发现问题</em></p> +<h3 id="scons">scons</h3> +<ul> +<li>直接去网上下载最新版本进行安装即可。</li> +</ul> +<h3 id="vs2008">vs2008</h3> +<ul> +<li>需要安装vc++的全部组件(主要是默认安装不带amd64的编译支持),如果只需要编译32位版本的话则可以忽略此条。</li> +<li>需要安装sp1补丁,否则会在编译时报错。</li> +</ul> +<h3 id="boost库">boost库</h3> +<ul> +<li> +<p>最好使用boost1.4.9版本,去官网上下载对应的源码包然后自己在vs2008的命令行环境下编译</p> +</li> +<li> +<p>编译boost的命令如下(只编译了所需库):</p> +<pre><code> bjam stage variant=debug --with-filesystem --with-thread --with-date_time --with-program_options --layout=versioned threading=multi toolset=msvc-10.0 --build-type=complete +</code></pre> +</li> +</ul> +<p><em>如果需要编译release版本,就把<code>variant</code>的选项改为<code>release</code>,如果需要编译64位的版本,就在以上命令中加入<code>address-model=64</code></em></p> +<h2 id="配置及代码修改">配置及代码修改</h2> +<h3 id="sconstruct文件修改">SConstruct文件修改</h3> +<p>SConstruct文件用于存放scons的关键配置信息,我们为了在vs2008下编译mongodb首先要做的就是修改mongodb源码下根目录的SConstruct文件。</p> +<ul> +<li> +<p>修改env配置,找到 evn = Environment</p> +<pre><code> env = Environment( BUILD_DIR=variantDir, +CLIENT_ARCHIVE='${CLIENT_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}', +CLIENT_DIST_BASENAME=get_option('client-dist-basename'), +CLIENT_LICENSE='#distsrc/client/LICENSE.txt', +CLIENT_SCONSTRUCT='#distsrc/client/SConstruct', +DIST_ARCHIVE_SUFFIX='.tgz', +EXTRAPATH=get_option(&quot;extrapath&quot;), +MODULE_BANNERS=[], +MODULETEST_ALIAS='moduletests', +MODULETEST_LIST='#build/moduletests.txt', +MSVS_ARCH=msarch , +PYTHON=utils.find_python(), +SERVER_ARCHIVE='${SERVER_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}', +TARGET_ARCH=msarch , +tools=[&quot;default&quot;, &quot;gch&quot;, &quot;jsheader&quot;, &quot;mergelib&quot;, &quot;unittest&quot;], +UNITTEST_ALIAS='unittests', +UNITTEST_LIST='#build/unittests.txt', +PYSYSPLATFORM=os.sys.platform, +PCRE_VERSION='8.30', +CONFIGUREDIR = '#' + scons_data_dir + '/sconf_temp', +CONFIGURELOG = '#' + scons_data_dir + '/config.log' +) +</code></pre> +</li> +</ul> +<p>在Environment里追加一条 <code>MSVC_VERSION='9.0'</code>,这是因为如果机器上有其他的编译环境,比如vs2010或vs2012,scons会自动使用他们的编译器进行编译,即使你是在vs2008的命令行环境下,我最初因为此问题困扰了很久,后来才只得强制指定编译器的版本,修改完成后如下:</p> +<pre><code>env = Environment( BUILD_DIR=variantDir, +CLIENT_ARCHIVE='${CLIENT_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}', +CLIENT_DIST_BASENAME=get_option('client-dist-basename'), +CLIENT_LICENSE='#distsrc/client/LICENSE.txt', +CLIENT_SCONSTRUCT='#distsrc/client/SConstruct', +DIST_ARCHIVE_SUFFIX='.tgz', +EXTRAPATH=get_option(&quot;extrapath&quot;), +MODULE_BANNERS=[], +MODULETEST_ALIAS='moduletests', +MODULETEST_LIST='#build/moduletests.txt', +MSVS_ARCH=msarch , +PYTHON=utils.find_python(), +SERVER_ARCHIVE='${SERVER_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}', +TARGET_ARCH=msarch , +tools=[&quot;default&quot;, &quot;gch&quot;, &quot;jsheader&quot;, &quot;mergelib&quot;, &quot;unittest&quot;], +UNITTEST_ALIAS='unittests', +UNITTEST_LIST='#build/unittests.txt', +PYSYSPLATFORM=os.sys.platform, +PCRE_VERSION='8.30', +CONFIGUREDIR = '#' + scons_data_dir + '/sconf_temp', +CONFIGURELOG = '#' + scons_data_dir + '/config.log', +MSVC_VERSION = '9.0' +) +</code></pre> +<ul> +<li> +<p>给编译器搜索路径增加你自己本地的boost库路径 +因为在编译时需要用到boost库,所以需要把你在本地的boost所在目录加入scons的环境,否则会报找不到boost头文件或链接库的错误,打开Sconstruct文件直接在最后加入如下代码</p> +<p>env.Append(CPPPATH=[&ldquo;d:/thirdlib/boost_1_49_0&rdquo;, &ldquo;d:/thirdlib/boost_1_49_0/boost/tr1&rdquo;], LIBPATH=[&ldquo;d:/thridlib/boost_1_49_0/stage/lib&rdquo;])</p> +<pre><code> *你在编译时需要将路径替换成你自己的* +</code></pre> +</li> +</ul> +<h3 id="准备stdinth">准备stdint.h</h3> +<ul> +<li>去这个地址<a class="link" href="https://msinttypes.googlecode.com/files/msinttypes-r26.zip" target="_blank" rel="noopener" +>https://msinttypes.googlecode.com/files/msinttypes-r26.zip</a>下载msinttypes,将压缩包里的stdint.h解压并复制到 <code>C:\Program Files\Microsoft Visual Studio 9.0\VC\include</code> 目录</li> +<li>修改mongodb源码目录下platform下的cstdint.h,将<code>#include&lt;cstdint&gt;</code>修改为<code>#include&lt;stdint.h&gt;</code>,将<code>#define _MONGO_STDINT_NAMESPACE std</code>这一行里的std注释掉,变成<code>#define _MONGO_STDINT_NAMESPACE /*std*/ </code></li> +<li>修改mongodb源码目录下util下的time_support.h,在文件开头加入<code>#include&lt;stdint.h&gt;</code>,否则在编译这个文件时会无法识别int64_t类型</li> +</ul> +<h3 id="修改windows_basich">修改windows_basic.h</h3> +<ul> +<li>修改mongodb源码目录下platform下的windows_basic.h,</li> +<li>在<code> #if !defined(NTDDI_WINXPSP3) || (NTDDI_VERSION &lt; NTDDI_WINXPSP3)</code> 之前加入 <code>#define NTDDI_WINXPSP3 0x05010300</code> 在<code>#if !defined(NTDDI_WS03SP2) || (NTDDI_VERSION &lt; NTDDI_WS03SP2)</code>之前加入<code>#define NTDDI_WS03SP2 0x05020200</code> 否则会报 &ldquo;32 bit mongo does not support Windows versions older than XP Service Pack 3&rdquo; 和&quot;64 bit mongo does not support Windows versions older than Windows Server 2003 SP 2&quot; 错误</li> +</ul> +<h3 id="修改listencpp和sockcpp">修改listen.cpp和sock.cpp</h3> +<ul> +<li> +<p>修改util下net下listen.cpp,在#include段之后加入如下代码</p> +<pre><code> #ifdef _WIN32 +#define EADDRINUSE WSAEADDRINUSE +#define ECONNABORTED WSAECONNABORTED +#define EBADF 9 +#define ENFILE 23 +#define EMFILE 24 +#endif +</code></pre> +</li> +<li> +<p>修改util下net下sock.cpp,在#include段之后加入如下代码</p> +<pre><code> #ifdef _WIN32 +#define EAGAIN 11 +#endif +</code></pre> +</li> +</ul> +<h2 id="开始编译">开始编译</h2> +<p>环境准备好之后,编译就比较简单了,打开vs2008命令行窗口,执行如下代码即可完成编译 +<code>scons --dd --32 mongoclient.lib</code></p> +<p>如果是编译release版本,就把&ndash;dd换成&ndash;release,如果是编译64位版本,就把&ndash;32换成&ndash;64</p>Hello World!https://sbabybird.github.io/p/hello-world/Mon, 29 Apr 2013 00:00:00 +0000https://sbabybird.github.io/p/hello-world/<h2 id="hello">Hello</h2> +<h2 id="world">World</h2>2007-11-13https://sbabybird.github.io/p/2007-11-13/Tue, 13 Nov 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-11-13/<p>有几年不用Winamp了,最近Winamp又退出了10周年纪念版版。我下载了一个,感觉听听里面的网络电台什么的还挺不错的(边上班边听欧美最流行的音乐哈)。而且新版还包含了podcast的功能,可以搜索订阅网上的播客。在家听音乐的话,我还是选择foobar。</p> +<p>&ndash; +由 sbabybird 于 11/08/2007 07:49:00 下午 在 从容地狂奔上发表</p>2007-08-28https://sbabybird.github.io/p/2007-08-28/Tue, 28 Aug 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-08-28/<p>偶然翻看书架上的旧书,发现我以前在上面随手胡乱写了一个“梦幻配置”,那时应该是2000年,根据当时的硬件发展状况,我写了一个可望而不可及的硬件配置。具体什么配置就不说了(大概就是纯平显示器、笨三的cpu),反正现在让你用你还嫌慢呢。现在六、七年过去了,心里又痒痒的,就让我再写一个可望而不可及的硬件配置吧,看看这个配置何时会过时。</p> +<p>中央处理器:Intel Core2 Quad processor Q6700(4核,为了安静,散热采用水冷系统)</p> +<p>主板:Intel D975XBX2</p> +<p>内存:海盗船 TWIN2X2048-6400 ×4(共8G)</p> +<p>外存储:SanDisk 64G闪存硬盘(用于系统存储),2TB磁盘阵列(用于文件存储)</p> +<p>显卡:丽台NVIDIA Quadro FX 5600 ×2(每块显卡可接四台屏幕)</p> +<p>主显示器:Apple 30&quot; Cinema Display(上网、影视、游戏)</p> +<p>副显示器:Apple 20&quot; Cinema Display ×6(地理、虚拟现实、平面设计等)</p> +<p>Creative Sound Blaster X-Fi Elite Pro+罗技Z5500(用于电影、游戏、非专业录音)</p> +<p>主板数字光纤输出+外置解码器+JBL监听音箱(用于欣赏音乐)</p> +<p>操作系统:自己动手定做(编译)Linux版本,桌面环境采用GONE(如果有兴趣就自己写个操作系统)</p> +<p>备注:机箱易采用高厚度、高散热静音机箱,此系统搭建完成后将用于书房,共七台显示器需要用到特殊的显示器支架。</p>2007-08-04https://sbabybird.github.io/p/2007-08-04/Sat, 04 Aug 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-08-04/<p>不知是不是因为升级还没有进行完成,最近live spaces总是不能正常操作,用firefox访问有时还会出现乱码或者页面布局乱套,速度慢的惊人,资源占用很厉害。再加上他有太多的限制,这些问题都让我感到对live space失望透顶。衷心希望Google blogger能够早日解封!</p>2007-08-03https://sbabybird.github.io/p/2007-08-03/Fri, 03 Aug 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-08-03/<p>昨天去电影院看了《憨豆先生的黄金周》,感觉还不错,憨豆先生还是那么滑稽可乐,有着独特的幽默方式,我虽然没有笑到肚皮抽筋、掐着大腿,但是90分钟的电影还是让我由衷地笑了半个小时(累计)。这里就不介绍剧情了(一般来说这种喜剧基本没剧情可言),网上到处都是介绍。整个影片从头到尾憨豆先生都拿着那只SONY新出的DV,我估计SONY投了不少钱,还有就是片子的音乐配的还可以,轻快明亮。总的来说还值得一看。 +handouhandou2</p> +<pre><code> ps:现在的电影院真是不景气啊,能容纳500号人的大厅坐了不到100人,不过挺爽的,谁让他们把票价订的那么贵,现在的票价是我小时候电影票价的100倍</code></pre>2007-07-29https://sbabybird.github.io/p/2007-07-29/Sun, 29 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-29/<p>对于我来说,理发是件很痛苦的事情,可能是有心理障碍吧。小的时候被老爸强行摁住理过一次发,我像一只小鸡那样被夹在腿上无力反抗,由于整个过程我都在不停地叫骂那个理发的,所以那家伙下手还不含糊,把推子使得嚓嚓直响,对着我的头皮和耳朵可劲儿招呼。整个过程是漫长的、痛苦的、令人发指的。最后我看着镜子里的凸了吧唧的头,还不忘使劲儿拧了一把鼻涕抹在老爸的裤腿上。此事后来成为笑谈,但爷儿俩在理发这种事情上一直都持有不同的观点,当然了,我还只能提出强烈抗议、强烈不满、强烈谴责,但采取进一步措施的权利还是保留了。一直到现在,当老爸跟我说:“快去把头发理一理!”时,我还是乖乖的狂奔去理发。</p> +<pre><code> 不过,现在我离老爸远了,他管不了啦(主要是没看见),我可以尽情地把头发留到很长,然后再一下剪到很短(一般是回老家之前)。但是我的这种习惯却造成了另一件事情,给我理发的人极度不爽。每当我拖着留了几个月的长发走进理发店,告诉理发的师傅给我可劲儿剪短时,伊总是很扭捏,假惺惺地跟我说:“哎呀!你的发质这么好,又好不容易留了这么长,剪了多可惜啊!”其实谁不知道伊是想省点儿事儿,想拿剪刀在那三下两下剪完糊弄我。于是我只好说:“嗯嗯,本来是想留长的,但是现在突然想开了,不想留了,还是麻烦您给我剪短吧!”最后等着人家极不情愿(还很费时)地给我剪完,我才满意离去。但是这招下次就不能用了,所以我总是选择不同的理发店,反正这玩意儿多得是! +今天我又理发了,从五一到现在大概有三个月了,很抱歉,又让一个理发师傅不爽了一把,不管他,这次理完了,谁知道我什么时候有心情理下回呀!</code></pre>2007-07-24https://sbabybird.github.io/p/2007-07-24/Tue, 24 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-24/<p>天气这么闷热,生活这么枯燥,何不搞点小把戏调剂一下气氛呢?要是你现在刚好在办公室里,那么恭喜你了,下面我将教你几个在下秘密收藏的整蛊手段(一般人我不告诉他)。</p> +<pre><code> 前提条件:1、你们用计算机办公;2、你们使用的是Windows操作系统;3、你要整蛊的同事没有暴力倾向;4、他刚好暂时离开一下。 +好了,准备好了就开始行动吧! +场景一:“我的密码被改了?!” +如果你的这位同事有锁定计算机的习惯,那就刚好实施一下,在他计算机的锁定状态下的密码框里提前敲入一个空格,这样一般他回来时不会发觉,等他输入完自己的密码后,会发现进不去了!(因为密码前面多输入了一个空格)。 +场景二:“用来干活儿的软件没有反应了!” +如果他没有锁定计算机的习惯,那么刚才那个办法就不凑效了,怎么办呢,找到他用来工作的软件(VC,Word、Excel等),把帮助菜单里的“关于(about)”对话框给打开,然后用鼠标把对话框拖动到一个屏幕上看不见的地方。哈哈,等着吧,他回来会发现他用来工作的软件怎么也不听话了,无论点击哪儿都没有反应。 +场景三:“鼠标不好使了” +现在大家都用光电鼠标了,而光电鼠标全靠它屁股底下的那个激光眼,没错!你又猜对了,拿个小纸团把它那个小眼睛堵住,赶紧去吧!鼠标瞎了之后就罢工了。 +以上方法屡试不爽,我都亲自实验过,不过是别人在我身上实验的(这帮败家玩意儿)。 +</code></pre> +<p>注:以上操作纯属娱乐!产生后果自负。</p>2007-07-23https://sbabybird.github.io/p/2007-07-23/Mon, 23 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-23/<p>我手里这个Nokia 6230用了3年了,买的时候多加了一块电池。前两天,其中一块电池寿终正寝了,剩下的这块也差不多了,感觉就像我的胃,一吃就饱,一会儿就又饿了。我看着手里这个灰头土脸得就像从垃圾桶里捡回的手机,不禁有了换掉它的念头。</p> +<pre><code> 到网上翻了翻信息,结果让我很失望,感觉Nokia不太长进,眼看着人家索爱扛着音乐、摄像的大旗在市场上占了一席之地,自己也跟着别人的屁股转,也在那儿搞音乐手机、摄像手机,却忘了自己的特色。没办法,别的牌子不愿意用,老N最近推出的新机不是我看不上就是我的钱包不让看(靠,就这还敢冒充Nokia的粉丝呀?)。苹果的iPhone最近倒是炒得挺火,看起来也挺不错,可是总觉的那玩意儿离咱太遥远了,还是不多看了,以免中毒。 +在查看了众多机型之后,长叹一声:“究竟什么样的手机才能让我满意呢!” +</code></pre> +<p>总结以下大概要满足以下几点: +1、屏幕要足够大、分辨率不用极高但也不能太低 +2、反应速度一定要快(目前我还没有发现一款智能手机反应速度飞快) +3、个头不能太大、重量不能太沉 +4、电话、短信功能好用 +5、电量一定要持久,待机越长越好(这点最重要,功能再强没电也是白扯) +6、非国产(这个不用多说)</p> +<pre><code> 这些要求不过分吧?像什么摄像、音乐等功能都没要求,可愣是找不到这样一款手机,反复对比后发现还是目前手上的这个更合要求一些。算了,将就用吧。结果,昨晚做梦,梦见我也设计了一款手机,以上条件除了第六条其余都满足,取名就叫“nbPhone” 把苹果的Phone的风头给压下去了,乔布斯都跟我急了。</code></pre>2007-07-21https://sbabybird.github.io/p/2007-07-21/Sat, 21 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-21/<p>一个胖子,一个相貌平平而且豁牙的胖子,一个相貌平平而且豁牙的卖手机的胖子。这样的人参加选秀节目,如果你是评委的话,你会让他通过海选吗?如果他告诉你他要表演的是歌剧的话,你会跳下评委台把它踢出演播厅吗?!我想你会的,因为当时英国的那个选秀节目的评委也是这样想的。</p> +<pre><code> Paul Potts,这个我刚刚看到的英国小伙子,就是这样参加选秀节目的。当他极不自然地站在舞台上,傻傻地告诉评委他要表演歌剧,评委们都笑了,表现得有些不耐烦。可是,当他深情地唱起今夜无人入眠,当他那与帕瓦罗蒂一样激昂的男高音在演播厅响起时,赛场沸腾了!所有的人都站了起来,评委刁在嘴里的铅笔掉了下来,掌声雷动! +这段由朋友发过来、我甚至懒得看的视频,看得我头皮发麻。在起了一身鸡皮疙瘩后,我的眼睛也不争气地湿润了(震撼,感动)。看了别人写的介绍,我了解到,这个叫Paul的小伙子有着不太顺利的人生际遇(大多数人如此吧),但是他从未怀疑过自己的理想,仍然执着地追求着歌剧表演的艺术魅力,直到他被生活所逼而不得不靠卖手机来糊口时,仍未放弃!终于,上天给了他最后一次机会,他成功了,他向世人再一次的证明了:真正牛逼的人,终究会牛逼起来! +</code></pre> +<p>试了一下,msn的空间居然还可以插入视频!</p>2007-07-20https://sbabybird.github.io/p/2007-07-20/Fri, 20 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-20/<p>我都已经好几天没有照看我的msn空间了(最近太累),今天访问一下,发现界面居然有了变化(别三日,刮目看),嗯哼,原来是微软的Live小组把咱的空间给升级了。</p> +<pre><code>首先是界面的整体风格有了改变,我审美不行,看不出是好看还是难看,感觉貌似顺眼一些。空间上方仍然悬挂着那个大大的广告条(我一直看它不爽),工具条的宽度变宽了,这样会占用更多的空间。进入空间的“自定义”功能,发现提供的模板多了一些,但一个比一个不耐看,所以我什么也没有动,继续保持现状。一直希望Live空间能够提供类似WordPress那样的模板(多漂亮啊),现在看来,要走的路还比较长(Live小组继续加油啊!)。 +不过话又说回来,空间里整那么多花里胡哨的东东也没用,看得让人眼花缭乱的也不爽,我还是喜欢简约一点的风格,最好是让人进入我的空间后,感觉就像是打开了windows的记事本(过分了吧)。本来Google提供的那个blog挺好的,可是总是不能访问,还是老老实实的在微软提供的共享空间里得瑟吧。 +最后,再鄙视一下我自己,这几天由于懒惰而没有更新空间的内容,太不像话了!</code></pre>2007-07-19https://sbabybird.github.io/p/2007-07-19/Thu, 19 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-19/<p>随着一阵悦耳的下班铃声,我提前结束了一天的工作,按照惯例,周末了,要去打球。叫上同事,抱起篮球,飞快地奔向球场。终于逃脱了闪烁的计算机屏幕,逃脱了无聊的工作计划,逃脱了漫长的会议,逃脱了郁闷的代码&hellip;&hellip;</p> +<pre><code>各位观众,各位听众,也许你们刚刚打开电梯,现在为您直播的是--火星杯篮球锦标赛!穿着运动鞋牛仔裤正在捡球的那家伙就是我,看呐,我在球场上尽情地狂奔,边打球边哼着歌曲“啊哼三分球,它在空中停留,漂亮的假动作,帅呆了我......哦shit!球丢了”。一口气打了两三个小时,直打到有人气喘吁吁,打到有人双腿抽筋,打到有人口吐白沫还不肯离去。天渐渐黑了,球框渐渐虚无缥缈起来,收拾家伙,撤! +走到站牌,有车,有座,爽!上了高速,一路畅通,爽!到了家里,贤惠的老婆已经把饭菜做好,菜做的色香俱佳,啤酒冰得温度适中。如果这个时候你问我,什么是幸福?我会自在地夹一口菜,然后再悠闲地喝上一口啤酒,眯起眼睛跟你说:“嘛儿叫幸福?介就叫幸福!”</code></pre>2007-07-12https://sbabybird.github.io/p/2007-07-12/Thu, 12 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-12/<p>加班后回家的路上,路灯十分昏暗,还没有吃晚饭,心情极度郁闷,我缓缓(没力气狂奔了)走向公车站牌,走着,走着,突然!一个黑影窜了过来,他跟我说:“兄弟,要盗版光盘不?”我没有理他,继续走,走着,走着,突然!又一个黑影窜了过来,他跟我说:“兄弟,要发票吗?”我没有理他,继续走,走着,走着,突然(靠,有完没完啊!)一大一小两个黑影窜了出来,原来是一个中年妇女领着一个七八岁的小女孩儿,夜色中看不清面目。小孩开口说话了:“叔叔,给点儿钱让我买吃的吧,我都饿了一天了&hellip;&hellip;”边说还边做有气无力状,大人也在一边附和。说得我心里一软,鼻涕快掉下来了,差点儿掏钱。但是转念一想,我TM也饿了快一天啦,也没吃饭呢,再何况,她们的行为也太让我愤怒了,因为就凭这些个破烂演技拿来唬我也太侮辱我的智商了吧!于是,我友善的冲她们说道:“小朋友,你看”我用手指了指马路,“往前走500米,那里有家派出所,你过去找警察叔叔要些吃的好不好?”小孩一时不吭声(台词没背下来),大人接着说:“你就可怜我们,给我们几块钱,买包方便面也行啊!”(我靠,我这么晚了还没吃饭,我求您别勾引我的食欲了!)我没办法,掏出手机,说:“既然你们不愿意亲自过去,那我帮你们打110吧&hellip;&hellip;”这句话还没有说完,说时迟那时快,只听得“嗖嗖”两声,两个人全都不见踪影,公车站牌下只剩下我和随风飘舞的碎纸片(好身手!)。</p>2007-07-06https://sbabybird.github.io/p/2007-07-06/Fri, 06 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-06/<p>听说google出了在线翻译的工具,而且还广受大家的好评,在美国举行的一次翻译比赛中还拿了冠军。我虽不是google的粉丝但也对google的产品挺感兴趣的,于是赶紧凑个热闹,看看伟大的google能不能给我带来惊喜。 +由于我只会中文,那就看看google的英译中的水平怎么样。废话少说,赶紧拿来一首英文歌词《you needed me》(我最喜欢的英文歌曲之一)。</p> +<p>You needed me</p> +<p>I cries a tear you wiped it dry</p> +<p>I was confused you cleared my mind</p> +<p>I sold my soul you bought it back for me</p> +<p>And help me up and give me dignity</p> +<p>Somehow you needed me</p> +<p>You gave me strength to stand alone again</p> +<p>To face the world out on my own again</p> +<p>You put me high upon a pedestal</p> +<p>So high that I could almost see eternity</p> +<p>You needed me, you needed me</p> +<p>And I can&rsquo;t believe it&rsquo;s you +I can&rsquo;t believe it&rsquo;s true</p> +<p>I needed you and you were there</p> +<p>And I&rsquo;ll never leave why should I leave</p> +<p>I&rsquo;d be a fool</p> +<p>Cause I&rsquo;ve finally found someone</p> +<p>Who really cares</p> +<p>You held my hand when it was cold</p> +<p>When I lost you took me home</p> +<p>You gave me hope when I was at the end</p> +<p>And turned my lies back into truth again</p> +<p>You even called me friend</p> +<p>You gave me strength to stand alone again</p> +<p>To face the world out on my own again</p> +<p>You put me high upon a pedestal</p> +<p>So high that I could almost see eternity</p> +<p>You needed me ,you needed me</p> +<p>Oh, yes, you need me</p> +<p>You needed me</p> +<p>先试了一下整段翻译,把歌词复制进去,出来的结果让我忍俊不禁</p> +<p>google自动翻译的文字:</p> +<p>你需要我,我喊了眼泪,你擦它干,我摸你清我心中我卖出 我的灵魂,你买回来,我和帮助我,让我有点尊严,你需要我你们给了我力量单独再次面对世界走出自己再次你就把我小时 在室内一个台阶那么高,我几乎可以看到永恒,你需要我,多欧需要我,我也不相信是你,我不能相信这是真的,我需要你和你的笔 在此,我永远不会离开,我为何要离开我就是一个傻瓜,我的事业总算发现有人真的三白族你握着我的手,当它冷时,我输了,你带我家,你给了我希望钨 母鸡,我是在年底把我的谎言放回真话的时候,你甚至骂我的朋友,你克须缴我力量单独再次面对世界走出自己再次你就把我高美 无源一个台阶那么高,我几乎可以看到永恒,你需要我,你需要我哦,多 欧需要我,你需要我</p> +<p>唉,比较失望啊,试一下google的翻译网页的功能吧,找到歌词的网页,然后让它翻译</p> +<p>你需要我 +I cried a tear我哭了眼泪 +You wiped it dry你擦它干 +I was confused我很困惑 +You cleared my mind你清除了我的心 +I sold my soul我卖我的灵魂 +You bought it back for me你买回来,我 +And held the earth召开地球 +You gave me dignity你给我尊严 +Somehow you needed me某种程度上,你需要我 +You gave me strength你们给了我力量 +To stand alone again单独再次 +To face the world面对世界 +Out on my own again出自己再次 +You put me high你把我高 +Upon a pedestal当佩服 +So high that I could almost see eternity如此高,我几乎可以看到永恒 +You needed me你需要我 +You needed me你需要我 +I can&rsquo;t believe it&rsquo;s you我不能相信这是你 +I can&rsquo;t believe it&rsquo;s you我不能相信这是你 +I needed you我需要你 +And you were there你有 +And I&rsquo;ll never leave, why should I leave?和我永远不会离开,我为何要离开? +I needed you我需要你 +can I finally found someone who really cares可我终于发现有人真正关心 +(You needed me)(你需要我) +You held my hand你牵我的手 +It was cold据冷 +And I was lost我失去了 +You took me home你带我家 +You gave me love你们给我的爱 +That I was at the end我是在结束 +I turned my life我把我的生命 +Back into truth again You even called me &lsquo;friend&rsquo;放回真话的时候,你甚至骂我&rsquo;朋友&rsquo; +You gave me strength你们给了我力量 +To stand alone again单独再次 +To face the world面对世界 +Out on my own again出自己再次 +You put me high你把我高 +Upon a pedestal当佩服 +So high that I could almost see eternity如此高,我几乎可以看到永恒 +You needed me你需要我 +You needed me你需要我 +You needed me你需要我 +You needed me你需要我 +Oh, yes, you needed me哦,你需要我 +You needed me你需要我</p> +<p>呵呵,这下看起来还像那么回事儿.感觉机器还是代替不了人啊.翻译有感情的东西总是那么生硬.</p>2007-07-04https://sbabybird.github.io/p/2007-07-04/Wed, 04 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-04/<p>统计了一下我平时上班所需要的时间,要是堵车的话大概要一个小时多一些,要是特别堵的话大概要两个小时,要是跑步的话大概得三个小时多一些(推算的,可以忽略),要是夜里打车去上班的话大概得二十多分钟(极少,也可以忽略)。所以我一天大概有三个小时是堵在路上的,这导致了我的胃口极差,身材日渐消瘦,远看像铅笔近看像挂历!每天我都要坐在车上长吁短叹:“GR的堵车啊!”</p> +<pre><code>是什么原因造成了这样的状况? 原因有很多种,我想最直接的原因可能就是因为路上出现了车祸。无论是蹭了一下车屁股还是挂了一下后视镜,双方都会停好车,把路占上,然后撅起屁股在那儿查看爱车的状况,最后再各自打电话叫人......这个时候你要是刚好在路上,你就会感觉你置身于车的海洋,一辆挨着一辆的汽车望不到头,一片喇叭声,让人透不过气来。每当我乘坐的公交车慢慢的拱过出事地点,往往还能看到出事的双方(或多方)在那儿撅着。这种情况每天都要出现,所以每天都要堵车。 +据说从8月7号到8月20号,北京的交通管制要进行奥运预演.这对我们这些挤公交车上班的来说真是莫大的好消息啊!我们又可以感受像去年中非论坛期间的那种一路畅通的超快感了!不过,快乐永远是短暂的,过了那几天,还是得老老实实的坐在车去上体验“堵车不堵心”。</code></pre>2007-07-02https://sbabybird.github.io/p/2007-07-02/Mon, 02 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-02/<p>最羡慕那些有米的音响发烧友,手里攥着大把的钞票,买音响器材出手阔绰,有没有一双“金耳朵”不知道,反正当音响店的老板告诉他“这套音响,在听蔡琴唱歌的时候能听见她咽吐沫的声音”时,或者跟他说:“那套设备,在听交响乐的时候可以听见拉琴那小子不小心把曲谱翻掉在地上的声音”的时候,他们就会毫不犹豫的掏出几千乃至几万块大洋,把那些“宝贝”搬回家,反复的回放,听听蔡琴在什么时候换了一口气,或者听听吹长笛的坐在第几排。</p> +<pre><code>我也曾在这方面痴迷过,但仅仅是痴迷,没有什么实质性行动,原因很简单,掏不起那些闲钱呐!不过,在很早以前,读初中的时候就开始摆弄那些“音响器材”了,只是一堆喇叭,功率很小,大部分是从旧收录机上拆下来的,“音源”也就只有卡带,我曾试着把喇叭放到各种地方以调整他们的“音效”,比如放在蚊帐上除了可以在睡眠时有音乐环绕外还兼具“驱蚊”的效果,我为了得到更多的低音也曾把喇叭嵌入到书桌里(整个桌子就是音箱哈),甚至把喇叭放到洗衣机里,那音质真是惨不忍听。反正受当时的条件限制,我也只能是像小孩摆弄玩具似的,玩一玩儿而已,毕竟当时升学才是最大的目标。 +直到有一天,我翻看一本旧音响杂志,有人自制了个音箱,据说效果还不错,于是就动了自己也做一个的念头。再后来,到了上中师的时候,有了大把的空闲时间(但还是没空闲的钱),决定纯手工制作一只“有源音箱”!说干就干,开始行动!首先考虑的是功放电路采用什么形式,当时最佳的方案是使用“LM-1875”功放芯片,但由于囊中羞涩,最终放弃,后来买来一块晶体管放大板,也算将就了,喇叭买了两只,一个高音,一个中低音(8寸),向我大舅要来了分频器。让老家木匠邻居帮忙做了个音箱的框架,剩下的就是我和我的一个哥儿们亲自动手了。箱体的材料比较奢侈,把我家的一个桌子给锯了(靠!太过分了)。后来组装的时候才发现,我竟然忘了考虑功放的前级,没办法,再次求救与大舅,从旧收录机上拆下来一块板子作为前级(居然还可以调高低音调)。 +就这样,前前后后忙活了有半个星期,我的音箱终于发出处女声了,这个时候音源已经是一台VCD,那个时候我好像对蔡琴不感兴趣,于是先听了一首陈慧娴的《归来吧》,真是天籁啊!我当时感动的鼻涕都快掉下来了!当然了,我这么说是有一些夸张,其实音质不咋地,只是当时又没听过真正的音响,这只亲手做的音箱,让我体验到了充足的低音(说到低音,要感谢我的姥爷,他给了我一只大号的电源,具体功率不知道,反正很大很大),震耳欲聋的低音,就像是有人拿着锤子在敲打我的胸膛。 +这只音箱在当时带给了我无限的快乐和满足感,后来就去省会读大学了,买了电脑,买了几百块的音箱,那只音箱就被我扔到了角落,上面布满了灰尘。再后来,我干脆把它送给了我的大舅,听说他现在拿它当板凳,还挺结实的!</code></pre>2007-07-01https://sbabybird.github.io/p/2007-07-01/Sun, 01 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-01/<p>国外新兴一个叫Twitter的Web2.0站点,听说最近很火爆,很多人在那里叽叽咕咕,说一些有想法但又不至于发一篇bolg的“废话”。我去看了一眼,感觉跟那帮人文化差异挺大的也就没好意思去注册,但是国内的同志们也不示弱,一时间模仿该网站理念的站点如雨后春笋般涌现。在这些国内的叽咕站点里,有朋友就给我推荐这个“饭否”,说是一个迷你Blog,像Twitter一样,只是大家都是中国人,叽咕的内容比较容易懂一些。我这个人最爱尝鲜,就忍不住过去注册了一个帐号。</p> +<pre><code>感觉还不错,可以绑定MSN,QQ等IM软件,方便通过IM软件在上面发言,甚至可以绑定手机,让你随时随地的把感受发到网上。人气还是挺旺的,不断有人在上面喃喃自语,也不乏有一搭没一搭的聊天者。发布的内容可以很无聊,比如“今天的天气真好”,也可以很有深度,比如“你们好啊,地球人!” +呵呵,由于没用多久,所以还不能多加评论,我怀我有自闭的倾向,现在有了“饭否”,偶尔在里面发一下实时的感受,发泄一下心情而已,就当我是面对着墙壁在一个人喃喃自语吧。</code></pre>2007-06-30https://sbabybird.github.io/p/2007-06-30/Sat, 30 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-30/<p>早晨起来,像往常的周六一样,来到公司加班。打开电脑,然后习惯性的访问我的msn空间,“该页无法显示&hellip;.”,不会吧,难道是网络断开了?没有啊,空间主页还是可以访问的,怎么一切换到我的空间就“该页无法显示”了呢?强制刷新浏览器还是不行,随便点了一个朋友的空间,可以访问。完了!莫非我的msn space被封掉了?</p> +<pre><code>上网搜索一下,看看有没有出现同样问题的朋友,结果显示msn space无法访问是常有的事儿,很多人都有过类似经历(国内用户),这其中的原因不言自明啊!我开始回忆,在我的日志里面到底有没有不该出现的敏感词汇?想了半天,答案是没有。可是要说是msn sapce的故障吧,别人的空间又是可以访问的,无奈只好跟微软的客服发了封电子邮件,暂时还未收到回复。 +我刚开始写网络日志,不为影响别人的看法,只为记录一下暂时的心情,本以为放到网上比放在本地还安全(相信微软的技术水平),结果还给我来这一手,想记录的时候却无法访问了,弄的心里还挺难受,担心以前的日志会不会丢掉啊! +</code></pre> +<p>ps:就在刚才,它又突然可以访问了!</p>2007-06-29https://sbabybird.github.io/p/2007-06-29/Fri, 29 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-29/<p>今天又一次雨中漫步,原因很简单,受天气预报的干扰我又没带伞(干嘛要说又呢?)。拿起背包从容地奔向车站,嘴里也不忘哼着:“我能想到最郁闷的事~~,就是下雨却没有带伞~~”。淋雨就淋雨吧,挤上车,去思考一个很严重的问题,我的晚饭吃什么?别笑!这确实是一个很严重的问题。我不能像老婆在身边时那样说:“随便吧,做啥吃啥”(虽然心里想着最好炒两个菜,再冰上一瓶啤酒)。自己动手去做的话,倒不是嫌麻烦,只是吃我做的晚饭简直是虐待自己(大饼卷着馒头沾着米饭吃)。</p> +<pre><code>吃晚餐在我眼中确实是非常重要的事儿,平时上班的时候,早饭总是很虚无缥缈,不堵车的时候就慢慢坐在包子铺里吃包子,堵车时就没准儿了,也许是一个鸡蛋饼,也许是一个肉夹馍,也许,也许只有一杯开水。午饭就是普通的工作餐,千篇一律,除了米饭还是米饭。所以说,一日三餐也就晚饭是顿饭,我把吃晚饭看作是一件很神圣的事情,虽然不必在每次吃晚饭前都焚香沐浴,但我也在吃饭前做个深呼吸,抛开一天的烦恼,菩萨保佑、阿弥陀佛、无量天尊、阿门!感谢上天又让我吃了一顿晚饭!然后就对生活重新燃起热情,对工作又重新充满信心,活着不就是为了这顿晚饭嘛! +可是,现在,我看了看车窗外,雨停了,道路渐渐不再拥堵,我的胃却越来越堵,没有胃口,吃还是不吃,这是个问题。下了车,路边的麻辣烫小摊熏得我的胃一阵抽搐,不远处的油炸臭豆腐老板正在卖力的吆喝,卖盗版书的小贩倒是省事儿,在大喇叭里循环播放“六块一本儿,随便挑随便拣......”,喊得我头晕眼花,我真想冲过拿起他的喇叭然后在空中抛一个完美的弧线。 +还是那个晚饭情节,不想在外面饭馆里吃,尤其是一个人在饭馆里吃。 +拿起馒头,就着音乐和啤酒...... +</code></pre> +<p>pijiu</p> +<p>我怎么会舍得你走, +这一去竟是几个秋冬 +请你好好珍重 +无须挂念我太多 +我的爱和从前一样 +这承诺当是万般重要 +尽管容颜会老 +这一生无以为靠 +我还是会爱你到老 +我不会让你苦恼 +也许我始终无法释怀 +我会假装一切都好</p>2007-06-28https://sbabybird.github.io/p/2007-06-28/Thu, 28 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-28/<p>偶然在diglog里发现了鲜果在线这个网站,名字很好听,于是乎,我就点击进去看了看。看了之后真有一种相见恨晚的感觉,这个站点本身不提供什么信息,只是提供一个在线的RSS阅读器,而且它提供的RSS频道都是根据大家的兴趣和订阅量进行排序的,也就是说,看某个频道的人越多,该频道就越靠前。这样就可以看到大家都喜欢看的东西,那些垃圾信息不会浮上来了(感谢Web2.0啊!)。</p> +<pre><code>在线阅读的操作也十分简单容易上手,而且界面清爽,有比较强大的自定义功能(我靠,怎么这么像托儿啊),我订阅了一些精品的频道,比如Engadget、Solidot、cnBeta等,顺便订阅了王小峰的“不许联想”(这个博客比较能扯淡,这算是夸他了)。这下就不用Firefox的rss阅读器了,直接把订阅的频道放在鲜果在线里存储到网上,在家和在公司都能看到同样的新鲜信息了,重装系统也不怕,把东西都放到网上,我想这也是以后互联网发展的趋势吧...... +</code></pre> +<p>ps:其实我早就把收藏的网址也放到网上了,在Firefox里安装一个扩展&ndash;yoono,这个插件也很牛,有点儿像美味书签(del.icio.us),不过yoono最近增加了收藏整个网页的功能所以比较起来就更喜欢yoono。</p> +<p>分享:</p>2007-06-27https://sbabybird.github.io/p/2007-06-27/Wed, 27 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-27/<p>雨后的空气格外清新,天气还没有完全放晴,乡间的柏油路上还是湿的,远处缓缓驶来一辆摩托车,骑车的人叼着烟,看起来懒洋洋的,十分惬意,没错,那就是我。</p> +<pre><code>我这几天回老家了,因为要回去处理一些工作上的事情,这个机会十分难得,暂时逃开北京繁忙的工作,溜回老家,无拘无束,自由自在。 +目光所及,尽是农田。空气中还飘散着青草混合大粪的味道,也算是沁人心脾吧。 +</code></pre> +<p>别再徘徊沉寂的心灵 +别再留恋破碎的回忆 +大地迎春雷 +抛弃你满腹的忧虑 +缤纷的彩虹等着你 +别再犹豫等待的心湖 +别再沉迷过去的旧梦 +暖暖的春风 +走向那灿烂的天涯路 +耀眼的阳光迎着你</p>2007-06-19https://sbabybird.github.io/p/2007-06-19/Tue, 19 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-19/<p>电视上充斥着广告,其中不乏精品,看完之后让人心情舒畅然后心甘情愿的掏腰包去买他们的产品。但是大多数广告都庸俗不堪,让人看得心慌气短、胃部抽搐、浑身起鸡皮疙瘩。这其中不必说“收礼只收搓澡巾”,也不必说“洗洗更健康”,单就是那位一口气上五楼的大爷就能让人抓狂了。时间长了,这些广告我吐啊吐啊的也就习惯了,对于这类垃圾广告也有了一定的免疫能力。但是最近又有一个广告冲破了我的心理防线!那就是某饮料的变态广告“我拧你!”</p> +<pre><code>画面上,一群疯子在那里晃来晃去的踢腿,就像得了羊癫疯似的,整个广告看了让人不知道他们在表达什么另类理念,还好导演没忘记让他们每人手里拿着一瓶该品牌的饮料。我估计作者的思路来源与某天他的鞋里进了个小石子,然后他就不停的甩啊甩,一直甩不出来,直到喝了他那个饮料才甩了出来,于是就创作了这个广告。关键是你在电视上恶心恶心我也就算了,在上下班的公交车上居然也循环的播放,而且还衍生出不同的版本出来,里面就没有一个正常人,都拿个腿在那儿踢来踢去的。 +也许从某种层面上来说,这也是一个很成功的广告,我看见很多人吵着要下载那段抽风的音乐作为手机铃声,但是我绝对不会去喝一口那种饮料,我怕晚上会做噩梦,然后再一脚把被子给踢到床底下去......</code></pre>2007-06-18https://sbabybird.github.io/p/2007-06-18/Mon, 18 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-18/<p>你问:“把大象关冰箱里共分几步?”答:“分三步,把冰箱门打开,把大象放进去,把冰箱门带上”。你又问:“可是把大象关进去之后里面黑乎乎的大象不害怕吗?”反问:“你怎么知道关上之后里面还是黑乎乎的?你确定关上门之后那个灯灭了吗?”你:“~~~~~~”</p> +<p>这个问题曾经也困扰我很久,因为冰箱的门只要一打开那个灯就亮起来,可是关上门之后你又看不到里面,所以还是不能确定里面到底是什么情况。听说国外曾经有人为这事儿想不开去自杀,更有人为此急得抓耳挠腮夜里都睡不着觉,直到他把冰箱的门上凿了个洞,看清了原来关上冰箱门后那个小灯真的灭了,这才安稳的睡去(估计这哥们是一环保人士,担心那灯太费电)。</p> +<p>我没像那位牛人那样的使用暴力,但也自有办法。当然了,作为一个正常人,去探讨冰箱里的灯到底关了没有,这种做法实在是有些偏执(这不神经病吗!),你就姑且看作我是好奇心使然吧。反正,我的冰箱刚弄回来的时候我还真就动用了高科技手段&ndash;拍照手机,我那手机带了个30W像素的鸡肋摄像头这下派上用场了。</p> +<p>也是分了三步,把冰箱门打开,把手机定了时(定时10秒后拍摄)放进去,再把门带上。心中默念,时间到,开门取出,查看照片,出现了不可思议的结果!照片里那个灯竟然还亮着!再试一次,还是亮着。我那叫一个晕,觉得被冰箱厂家给忽悠了,口口声声说节能,这得多耗不少电呐。在仔细阅读了两遍说明书之后,总算恍然大悟,原来那不是普通的灯,它不仅仅担任了照明的工作(难道还用来制冷啊?),还兼具杀菌的功效,在关上门之后,它再持续照射几分钟食物,起到杀菌抑菌的效果。哦,原来如此,人家陈老师说了:“人不能无聊到这种地步!”</p>2007-06-17https://sbabybird.github.io/p/2007-06-17/Sun, 17 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-17/<p>又到了蚊子最猖獗的季节了,现在每晚都有蚊子在我耳边盘旋,嗡嗡的声音若隐若现,让我神经高度紧张,却又懒得起来招呼它们,无奈,硬着头皮睡去。第二天胳膊腿上到处都是蚊子们留下的吻痕&ndash;小红疙瘩,奇痒难忍。我发飙了,对付蚊子,我要开始行动!</p> +<p>刚开始我采用的是防守战略,听说食用葱姜蒜可以使皮肤排出的汗味具有天然的驱蚊效果,本想采用此方法,但是吃了大蒜那味儿我更受不了只得放弃。还是在洗澡的时候多放点花露水吧,“六神特效驱蚊花露水”据说效果很好,洗完澡往身上狂撒,安静的躺在床上,等待蚊子飘然而来再飘然而去。结果,效果欠佳,蚊子依然如故的为我唱着催眠曲,而且我还被花露水熏得神清气爽、失眠健忘。</p> +<p>防守看来不行,改变战略。男人!就要对别人狠一些!对付蚊子也不例外!狂奔去超市,买来“枪手”喷雾剂、“睡得香”电蚊香、电蚊拍、紫外光灭蚊灯等等,我要发起进攻了!晚饭毕,拿起“枪手”对卧室一通疯狂扫射,再将蚊香点燃,整个房间烟雾弥漫,关紧房门,外面客厅里的灭蚊灯发出幽幽的清华紫光。这下蚊子们彻底的玩完儿了,对不起了诸位,我已经够瘦弱了,您就给我留点儿血吧。</p> +<p>沐浴后,推开卧室门,兴冲冲准备打扫战场,刚推开门我就被呛得眼泪鼻涕都下来了(我刚才喷的不是催泪瓦斯吧),蚊子倒是没有了,只是这屋里也不能待了(已经感觉呼吸困难了),无奈只有掐灭蚊香,打开窗户,终于,新鲜的空气伴随着新鲜的蚊子又进来了。灭蚊灯、灭蚊拍也收效甚微。灭蚊战争暂告一段落,蚊子暂时领先。</p> +<p>先这样吧,实在不行就拿手拍吧, 要是懒得拍就猛开空调把他们冻死,再或者,如果我的反应足够灵敏的话,我就在它们叮我的那一刹那,暗运内力把它们的嘴夹在肌肉里,我憋死它们!</p>2007-06-16https://sbabybird.github.io/p/2007-06-16/Sat, 16 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-16/<p>如果有那么一天,我在沙滩上走着,突然从沙子里踢出一个神灯,我擦了三下,彭!的一声窜出一个魔鬼,对我龇牙咧嘴,非得满足我三个愿望。那么,我会许什么愿呢?我不会像周星驰那样无耻,许完了两个愿望后最后一个愿望竟是再要三个愿望。我想我也应该不那么自私,我会把头两个愿望交给公益事业,比如世界和平、环境保护啥的,然后留一个愿望给自己,那就是&ndash;我想睡个自然醒。</p> +<pre><code>自从告别了自在潇洒的大学生活,参加工作以后,我就没有睡够过,也不是完全没有时间睡觉,而是能有机会睡懒觉的时候我都睡不着。在一周里里面,工作日期间肯定没睡懒觉的可能,一大早就狂奔到车站去挤车了,晚上又很晚才睡,所以这期间是十分缺觉的。只有周末的早晨才能有机会赖在床上,可是问题来了,周末的早晨我倍儿精神!平日里闹钟响了还想把它摁掉再小睡一会儿,可一旦到了周末,我往往比闹钟醒的还早,而且再也睡不着。这是为什么呢,苦苦思索之后,得到答案:周末是属于我自己的自由时间而且很短暂,我不舍的拿这点儿宝贵时间来睡觉!平时没时间干的我只有等到周末了,平时听不了音乐就周末抱着音响使劲儿听,平时没时间弹琴就等到周末抱着电子琴使劲儿得瑟,平时没时间摄影等到周末就溜达出去一通狂拍...... 等等,有这些个好事儿等着我,我就算是想睡也真就睡不着了。 +所以,我也不祈求啥别的太奢侈的事儿,就让我睡个自然醒吧。</code></pre>2007-06-15https://sbabybird.github.io/p/2007-06-15/Fri, 15 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-15/<p>老家那边有些事儿需要老婆回去处理一下,用不了几天,可是转眼已经一个周过去了,据说还需要再呆几天才能回北京来。哎!郁闷呐!按照道理来说,作为一个正常的男人如果老婆回了娘家,那他应该感到万分的高兴才是(我曾经有个同事,从来都不吭声,结果有一次哼了一整天的小曲儿,一问才知道,人家老婆大人回娘家去了)。高兴是高兴,可是晚饭没有着落了,眼看着冰箱里的东西被我一点点地吃光了,就连平时不爱吃的饺子也在前天被我从冰箱的最底层翻了出来。家里实在没吃的那就在外面吃吧,昨晚上刚好有饭局,不吃白不吃啊,结果上当了,几个哥们儿都是贪杯的主儿,白的喝完换啤的, 啤的喝完换冰的,一直喝到丧心病狂&hellip;&hellip;饭还没吃上几口。搞得今天蔫了吧唧不说,还浑身上火, 鼻炎发作,咽炎发作,苦不堪言。</p> +<pre><code>站起来,叹了口气,转身就看到洗衣机里的衣服也快堆成小山了,都说能把袜子按颜色分类的男人和把袜子随便乱扔的男人是两种不同的生物,我显然是属于后者,看来只有等到周末统一解决了。</code></pre>2007-06-14https://sbabybird.github.io/p/2007-06-14/Thu, 14 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-14/<p>高考刚过,每年的这个时候都会有一大帮人在哪儿声泪俱下的控诉这万恶的高考制度。我也讨厌高考,但是在我的记忆里,另一种考试制度更令我恶心,那就是&mdash;-抽考!</p> +<pre><code>在我上小学的时后,比较害怕的就是考试了,但最让我感到不安的是每个班级选拔“尖子生”的过程。那个时候每到期末每个班级总是抽出学习成绩最好的几个同学参加镇上的抽考,他们的考试成绩直接代表了整个班级的学习成绩,也代表了老师的教学水平。私下里大家管抽到的这些学生叫“尖子生”。 +从小学到初中我几乎一路是“尖子生”,至于为什么要有“尖子生”,这样考试有什么意义我就不去想了,只知道如果被老师抽到当“尖子生”就全家开心,我在家也可以放肆一些,万一抽不到就没人给我好脸色。好在屡次的抽考过程中我只有两次没有被选中,不知是幸运还是不幸。 +其中一次是在小学二年级的时候,虽然没有被选中,但是也参加了考试(数学替考),当时我的情况是语文极差但数学很好(至少比那些“尖子”要好一些),老师为了他们的荣誉,便让我替另外一个考生参加了数学考试,试卷虽然是我答的却不能填写我的名字。好在当时也没什么自尊心,也就爽快的答应了,现在想一想作为老师也太不应该了。(这也是我后来虽念了师范却最终没有选择做老师的原因之一)。 +到后来就越来越抵制这种虚伪的考试,大概是四年级,我越来越贪玩,成绩真的不行了,要期末考试了,老师们纷纷挑选“尖子”,刚开始还被提名,后来经过多层过滤,勉强坚持到了最后一轮评测,直到我们伟大的辛勤的园丁说:“好了,那谁,你回去吧,其他人留下”。于是我提着书包灰溜溜回家,心里却说不出的高兴,不用去参加TMD关系到班集体荣誉的考试了!爽!哼哼,我冷笑,冷笑。现在回忆起来,脑子里仍旧充斥着老师们那因为贪图班级的名次而扭曲的面容(这就是原因之二)。 +不知道现在怎么样了,在当时,这样的考试制度,它伤了太多太多孩子的心。 +</code></pre> +<p>choukao</p> +<p>ps:</p> +<p>今日饮酒过渡</p> +<p>沉醉不知归路</p> +<p>兴尽打车走</p> +<p>误入小区深处</p> +<p>呕吐、呕吐</p> +<p>引来保安无数!</p>2007-06-13https://sbabybird.github.io/p/2007-06-13/Wed, 13 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-13/<p>早晨,NB烘烘的中国移动给我发天气预报说是阴转多云,在分析了昨晚电视上的预报加上收音机告诉我的降水概率后,我确定今天不会下雨,然后非常自信的没带伞就上班了,虽然头上的天阴的要滴水似的。</p> +<pre><code>谁知现在的天气预报已经不准确到让人发指的地步了!从下车到家的那段路程我只好雨中快步了(跑啊)。不是说现在计算机运算速度越来越快了吗?不是说建立的数据模型越来越接近真实了吗?不是说那什么风云N号也升空了吗?嗯?!忽悠谁啊!上次就报给我说最近西伯利亚那边有情况,未来几天有大风降温的天气,搞得我捂了一身痱子!现在到处是天气预报,各大网站上有,报纸上有,QQ上有,收音机、电视就更有了,而且还花样儿繁多,一会儿是穿衣指数,一会儿又洗车指数,最后还忽悠你个降水概率,有雨就有雨没雨就没雨,整个指数百分之60鬼才知道到底要不要下! +当然了,他们有预报准确的时候,那就是对局部地区的天气预报,反正局部地区天天要下雨甚至还有短时间的雷雨大风等强对流天气。我妈就曾经十分关切的问我:“为什么局部地区天天下雨,这个地区到底在哪儿?住在那儿的人可怎么活哟!” +算啦,也不跟他们计较,我还是回去翻翻小学的语文课本,好好拜读一下里面的那篇《看云识天气》,以后再也不相信这GR的天气预报了! +</code></pre> +<p>慢着,突然想起了倪萍大婶子曾经在“综艺大观”上做的即兴方言版天气预报,啧啧,那叫一个准啊!“社员同志们注意啦,哈。这个山东省荣成县寨子沟公社刘家村广播站现在开始播送天气预报,哈。这个明天头半晌儿阴有小雨儿,后半晌儿就变天了。南风转西北风7-8级。这个凄凄沥沥的小雨儿夹着嗖嗖的西北风,今儿刮,明儿刮儿,后儿还刮,一直刮到下个星期六,哈。这个咱再接着说天气预报。这个西北风一刮,这回最大的特点就是龙卷风,龙卷风啊,粮食要最重&hellip;.”</p>2007-06-12https://sbabybird.github.io/p/2007-06-12/Tue, 12 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-12/<p>初来北京的时候,家里托着亲戚的亲戚的关系让我在一家单位实习,就像鲁迅小说里写的那样,掌柜的是一副凶脸孔,主顾也没有好声气。那时我一个人住在前门外大栅栏里的一家小旅馆里。 +我住的胡同往北走几步一拐就是北京著名的“大栅栏步行街”,那儿有着浓厚的京味儿,经常看到成群的外国鬼子。他们不停的拍照,吃小吃,买工艺品,所以这里一天到晚人山人海热闹非凡。有时候我也去转转,只是转转,并不买东西,那些让老外一看见就双眼冒光的玩意儿对我并没有多大吸引力。 +小王,我住的旅店里的服务员,瘦瘦的,头戴一顶鸭舌帽,手腕上戴了一只便宜手表。 +一天下午,我一个人站在楼顶上特别无聊,正好小王上来,我递给他一根“中南海”他笑笑接住说:“一个人在外无聊吧?”我说:“是” 他说 “那我就给你讲讲这一片儿的故事吧!”,于是他就趴在栏杆上给我说了一通关于这个胡同的故事,说了这一带在清朝是曾经全是窑子。他抽了不少烟,我说“中南海这烟太冲了这边有没有柔和一点儿的烟?”他想了想说:“我抽的都是便宜烟,恩,不过便宜好抽就行&hellip;” 他给我说了两种。我到了晚上买来抽了几支觉得不好抽(那时我还不怎么抽烟)就都送给他了。以后就时常在一起谈天,混得很熟了,他经常早早的就把我的暖壶打满开水给提上来。 +只是又过了两三天,我一直也没见到小王,一问店老板才知道 :“他回老家了,他是离家出走才来到这个小店的,没钱了,才在这儿打工,不求挣钱只要有吃有睡就行,前两天他哥哥找到这里就把他带回去了。”老板很惋惜:“多好的孩子呀!”</p>2007-06-11https://sbabybird.github.io/p/2007-06-11/Mon, 11 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-11/<p>早晨的阳光真灿烂,虽然天气湿热有点儿桑拿天的苗头,但是我的心情很好,阳光洒在我的工作服上像是镶了金边,很是耀眼。对了,我是一个环卫工人,每天早晨都要在这儿清扫垃圾,这个工作是很神圣的,至少我这么认为,虽然和小时候的梦想(艺术家)差得很远,但是用某位相声演员的话说“这是一样一样一样的啊”!我愉快地拿起扫把,自在地吹着口哨,再把这条街扫完就可以收工了。我不由得加快了速度挥舞着扫把就像一个画家挥舞着手中的画笔,我气沉丹田暗用内力,短小的扫把被我使得是呼呼生风,卷起的沙尘就像一层薄雾。 +这个时候你出现了,挎着小包,下了公共汽车,高跟鞋踩在平坦的人行道上发出清脆的得得响,你的小手微微举起遮住当前还不算猛烈的太阳。真漂亮啊!我暗自赞道。上学时很不努力导致我的眼神儿非常好,我想,在工作时看到美女也算是一种福利吧!看着你向我走来,越走越近,不知是热的还是累得,我的手心开始出汗,我攥紧了扫把更卖力的扫了起来,地上的落叶伴随着纸片在沙尘中轻轻飞舞。你终于走到我的身边,冲我使劲的挥手,这么近的距离我终于看清了你的眼睛,很大、很圆,长长的睫毛。你竟然停下了脚步,盯住我迷离的眼神和唏嘘的胡茬,我期盼着你能给我说些什么,虽然黑夜给了你黑色的眼睛,但你却翻了个白眼儿给我:“你就不能轻点儿扫吗!还让不让人走路了!”。</p>Linkshttps://sbabybird.github.io/links/Mon, 01 Jan 0001 00:00:00 +0000https://sbabybird.github.io/links/<p>To use this feature, add <code>links</code> section to frontmatter.</p> +<p>This page&rsquo;s frontmatter:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span><span class="lnt">8 +</span><span class="lnt">9 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">links</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="l">GitHub</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="l">GitHub is the world&#39;s largest software development platform.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">website</span><span class="p">:</span><span class="w"> </span><span class="l">https://github.com</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="l">TypeScript</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="l">TypeScript is a typed superset of JavaScript that compiles to plain JavaScript.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">website</span><span class="p">:</span><span class="w"> </span><span class="l">https://www.typescriptlang.org</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">ts-logo-128.jpg</span><span class="w"> +</span></span></span></code></pre></td></tr></table> +</div> +</div><p><code>image</code> field accepts both local and external images.</p>Searchhttps://sbabybird.github.io/search/Mon, 01 Jan 0001 00:00:00 +0000https://sbabybird.github.io/search/ \ No newline at end of file diff --git a/links/index.html b/links/index.html new file mode 100644 index 000000000..7658268bb --- /dev/null +++ b/links/index.html @@ -0,0 +1,34 @@ +Links

Links

To use this feature, add links section to frontmatter.

This page’s frontmatter:

1
+2
+3
+4
+5
+6
+7
+8
+9
+
links:
+  - title: GitHub
+    description: GitHub is the world's largest software development platform.
+    website: https://github.com
+    image: https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png
+  - title: TypeScript
+    description: TypeScript is a typed superset of JavaScript that compiles to plain JavaScript.
+    website: https://www.typescriptlang.org
+    image: ts-logo-128.jpg
+

image field accepts both local and external images.

Licensed under CC BY-NC-SA 4.0
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-06-11/index.html b/p/2007-06-11/index.html new file mode 100644 index 000000000..70a7be1e6 --- /dev/null +++ b/p/2007-06-11/index.html @@ -0,0 +1,11 @@ +2007-06-11

2007-06-11

早晨的阳光真灿烂,虽然天气湿热有点儿桑拿天的苗头,但是我的心情很好,阳光洒在我的工作服上像是镶了金边,很是耀眼。对了,我是一个环卫工人,每天早晨都要在这儿清扫垃圾,这个工作是很神圣的,至少我这么认为,虽然和小时候的梦想(艺术家)差得很远,但是用某位相声演员的话说“这是一样一样一样的啊”!我愉快地拿起扫把,自在地吹着口哨,再把这条街扫完就可以收工了。我不由得加快了速度挥舞着扫把就像一个画家挥舞着手中的画笔,我气沉丹田暗用内力,短小的扫把被我使得是呼呼生风,卷起的沙尘就像一层薄雾。 +这个时候你出现了,挎着小包,下了公共汽车,高跟鞋踩在平坦的人行道上发出清脆的得得响,你的小手微微举起遮住当前还不算猛烈的太阳。真漂亮啊!我暗自赞道。上学时很不努力导致我的眼神儿非常好,我想,在工作时看到美女也算是一种福利吧!看着你向我走来,越走越近,不知是热的还是累得,我的手心开始出汗,我攥紧了扫把更卖力的扫了起来,地上的落叶伴随着纸片在沙尘中轻轻飞舞。你终于走到我的身边,冲我使劲的挥手,这么近的距离我终于看清了你的眼睛,很大、很圆,长长的睫毛。你竟然停下了脚步,盯住我迷离的眼神和唏嘘的胡茬,我期盼着你能给我说些什么,虽然黑夜给了你黑色的眼睛,但你却翻了个白眼儿给我:“你就不能轻点儿扫吗!还让不让人走路了!”。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-06-12/index.html b/p/2007-06-12/index.html new file mode 100644 index 000000000..66e6c5ef4 --- /dev/null +++ b/p/2007-06-12/index.html @@ -0,0 +1,14 @@ +2007-06-12

2007-06-12

初来北京的时候,家里托着亲戚的亲戚的关系让我在一家单位实习,就像鲁迅小说里写的那样,掌柜的是一副凶脸孔,主顾也没有好声气。那时我一个人住在前门外大栅栏里的一家小旅馆里。 +我住的胡同往北走几步一拐就是北京著名的“大栅栏步行街”,那儿有着浓厚的京味儿,经常看到成群的外国鬼子。他们不停的拍照,吃小吃,买工艺品,所以这里一天到晚人山人海热闹非凡。有时候我也去转转,只是转转,并不买东西,那些让老外一看见就双眼冒光的玩意儿对我并没有多大吸引力。 +小王,我住的旅店里的服务员,瘦瘦的,头戴一顶鸭舌帽,手腕上戴了一只便宜手表。 +一天下午,我一个人站在楼顶上特别无聊,正好小王上来,我递给他一根“中南海”他笑笑接住说:“一个人在外无聊吧?”我说:“是” 他说 “那我就给你讲讲这一片儿的故事吧!”,于是他就趴在栏杆上给我说了一通关于这个胡同的故事,说了这一带在清朝是曾经全是窑子。他抽了不少烟,我说“中南海这烟太冲了这边有没有柔和一点儿的烟?”他想了想说:“我抽的都是便宜烟,恩,不过便宜好抽就行…” 他给我说了两种。我到了晚上买来抽了几支觉得不好抽(那时我还不怎么抽烟)就都送给他了。以后就时常在一起谈天,混得很熟了,他经常早早的就把我的暖壶打满开水给提上来。 +只是又过了两三天,我一直也没见到小王,一问店老板才知道 :“他回老家了,他是离家出走才来到这个小店的,没钱了,才在这儿打工,不求挣钱只要有吃有睡就行,前两天他哥哥找到这里就把他带回去了。”老板很惋惜:“多好的孩子呀!”

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-06-13/index.html b/p/2007-06-13/index.html new file mode 100644 index 000000000..a4b9c22d0 --- /dev/null +++ b/p/2007-06-13/index.html @@ -0,0 +1,15 @@ +2007-06-13

2007-06-13

早晨,NB烘烘的中国移动给我发天气预报说是阴转多云,在分析了昨晚电视上的预报加上收音机告诉我的降水概率后,我确定今天不会下雨,然后非常自信的没带伞就上班了,虽然头上的天阴的要滴水似的。

谁知现在的天气预报已经不准确到让人发指的地步了!从下车到家的那段路程我只好雨中快步了(跑啊)。不是说现在计算机运算速度越来越快了吗?不是说建立的数据模型越来越接近真实了吗?不是说那什么风云N号也升空了吗?嗯?!忽悠谁啊!上次就报给我说最近西伯利亚那边有情况,未来几天有大风降温的天气,搞得我捂了一身痱子!现在到处是天气预报,各大网站上有,报纸上有,QQ上有,收音机、电视就更有了,而且还花样儿繁多,一会儿是穿衣指数,一会儿又洗车指数,最后还忽悠你个降水概率,有雨就有雨没雨就没雨,整个指数百分之60鬼才知道到底要不要下!
+
+当然了,他们有预报准确的时候,那就是对局部地区的天气预报,反正局部地区天天要下雨甚至还有短时间的雷雨大风等强对流天气。我妈就曾经十分关切的问我:“为什么局部地区天天下雨,这个地区到底在哪儿?住在那儿的人可怎么活哟!”
+
+算啦,也不跟他们计较,我还是回去翻翻小学的语文课本,好好拜读一下里面的那篇《看云识天气》,以后再也不相信这GR的天气预报了!
+

慢着,突然想起了倪萍大婶子曾经在“综艺大观”上做的即兴方言版天气预报,啧啧,那叫一个准啊!“社员同志们注意啦,哈。这个山东省荣成县寨子沟公社刘家村广播站现在开始播送天气预报,哈。这个明天头半晌儿阴有小雨儿,后半晌儿就变天了。南风转西北风7-8级。这个凄凄沥沥的小雨儿夹着嗖嗖的西北风,今儿刮,明儿刮儿,后儿还刮,一直刮到下个星期六,哈。这个咱再接着说天气预报。这个西北风一刮,这回最大的特点就是龙卷风,龙卷风啊,粮食要最重….”

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-06-14/index.html b/p/2007-06-14/index.html new file mode 100644 index 000000000..48750e6dd --- /dev/null +++ b/p/2007-06-14/index.html @@ -0,0 +1,19 @@ +2007-06-14

2007-06-14

高考刚过,每年的这个时候都会有一大帮人在哪儿声泪俱下的控诉这万恶的高考制度。我也讨厌高考,但是在我的记忆里,另一种考试制度更令我恶心,那就是—-抽考!

在我上小学的时后,比较害怕的就是考试了,但最让我感到不安的是每个班级选拔“尖子生”的过程。那个时候每到期末每个班级总是抽出学习成绩最好的几个同学参加镇上的抽考,他们的考试成绩直接代表了整个班级的学习成绩,也代表了老师的教学水平。私下里大家管抽到的这些学生叫“尖子生”。
+
+从小学到初中我几乎一路是“尖子生”,至于为什么要有“尖子生”,这样考试有什么意义我就不去想了,只知道如果被老师抽到当“尖子生”就全家开心,我在家也可以放肆一些,万一抽不到就没人给我好脸色。好在屡次的抽考过程中我只有两次没有被选中,不知是幸运还是不幸。
+
+其中一次是在小学二年级的时候,虽然没有被选中,但是也参加了考试(数学替考),当时我的情况是语文极差但数学很好(至少比那些“尖子”要好一些),老师为了他们的荣誉,便让我替另外一个考生参加了数学考试,试卷虽然是我答的却不能填写我的名字。好在当时也没什么自尊心,也就爽快的答应了,现在想一想作为老师也太不应该了。(这也是我后来虽念了师范却最终没有选择做老师的原因之一)。
+
+到后来就越来越抵制这种虚伪的考试,大概是四年级,我越来越贪玩,成绩真的不行了,要期末考试了,老师们纷纷挑选“尖子”,刚开始还被提名,后来经过多层过滤,勉强坚持到了最后一轮评测,直到我们伟大的辛勤的园丁说:“好了,那谁,你回去吧,其他人留下”。于是我提着书包灰溜溜回家,心里却说不出的高兴,不用去参加TMD关系到班集体荣誉的考试了!爽!哼哼,我冷笑,冷笑。现在回忆起来,脑子里仍旧充斥着老师们那因为贪图班级的名次而扭曲的面容(这就是原因之二)。
+
+不知道现在怎么样了,在当时,这样的考试制度,它伤了太多太多孩子的心。
+

choukao

ps:

今日饮酒过渡

沉醉不知归路

兴尽打车走

误入小区深处

呕吐、呕吐

引来保安无数!

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-06-15/index.html b/p/2007-06-15/index.html new file mode 100644 index 000000000..ffdc2b603 --- /dev/null +++ b/p/2007-06-15/index.html @@ -0,0 +1,10 @@ +2007-06-15

2007-06-15

老家那边有些事儿需要老婆回去处理一下,用不了几天,可是转眼已经一个周过去了,据说还需要再呆几天才能回北京来。哎!郁闷呐!按照道理来说,作为一个正常的男人如果老婆回了娘家,那他应该感到万分的高兴才是(我曾经有个同事,从来都不吭声,结果有一次哼了一整天的小曲儿,一问才知道,人家老婆大人回娘家去了)。高兴是高兴,可是晚饭没有着落了,眼看着冰箱里的东西被我一点点地吃光了,就连平时不爱吃的饺子也在前天被我从冰箱的最底层翻了出来。家里实在没吃的那就在外面吃吧,昨晚上刚好有饭局,不吃白不吃啊,结果上当了,几个哥们儿都是贪杯的主儿,白的喝完换啤的, 啤的喝完换冰的,一直喝到丧心病狂……饭还没吃上几口。搞得今天蔫了吧唧不说,还浑身上火, 鼻炎发作,咽炎发作,苦不堪言。

站起来,叹了口气,转身就看到洗衣机里的衣服也快堆成小山了,都说能把袜子按颜色分类的男人和把袜子随便乱扔的男人是两种不同的生物,我显然是属于后者,看来只有等到周末统一解决了。
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-06-16/index.html b/p/2007-06-16/index.html new file mode 100644 index 000000000..f3a14e5f0 --- /dev/null +++ b/p/2007-06-16/index.html @@ -0,0 +1,12 @@ +2007-06-16

2007-06-16

如果有那么一天,我在沙滩上走着,突然从沙子里踢出一个神灯,我擦了三下,彭!的一声窜出一个魔鬼,对我龇牙咧嘴,非得满足我三个愿望。那么,我会许什么愿呢?我不会像周星驰那样无耻,许完了两个愿望后最后一个愿望竟是再要三个愿望。我想我也应该不那么自私,我会把头两个愿望交给公益事业,比如世界和平、环境保护啥的,然后留一个愿望给自己,那就是–我想睡个自然醒。

自从告别了自在潇洒的大学生活,参加工作以后,我就没有睡够过,也不是完全没有时间睡觉,而是能有机会睡懒觉的时候我都睡不着。在一周里里面,工作日期间肯定没睡懒觉的可能,一大早就狂奔到车站去挤车了,晚上又很晚才睡,所以这期间是十分缺觉的。只有周末的早晨才能有机会赖在床上,可是问题来了,周末的早晨我倍儿精神!平日里闹钟响了还想把它摁掉再小睡一会儿,可一旦到了周末,我往往比闹钟醒的还早,而且再也睡不着。这是为什么呢,苦苦思索之后,得到答案:周末是属于我自己的自由时间而且很短暂,我不舍的拿这点儿宝贵时间来睡觉!平时没时间干的我只有等到周末了,平时听不了音乐就周末抱着音响使劲儿听,平时没时间弹琴就等到周末抱着电子琴使劲儿得瑟,平时没时间摄影等到周末就溜达出去一通狂拍...... 等等,有这些个好事儿等着我,我就算是想睡也真就睡不着了。
+
+所以,我也不祈求啥别的太奢侈的事儿,就让我睡个自然醒吧。
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-06-17/index.html b/p/2007-06-17/index.html new file mode 100644 index 000000000..dc1db2e55 --- /dev/null +++ b/p/2007-06-17/index.html @@ -0,0 +1,10 @@ +2007-06-17

2007-06-17

又到了蚊子最猖獗的季节了,现在每晚都有蚊子在我耳边盘旋,嗡嗡的声音若隐若现,让我神经高度紧张,却又懒得起来招呼它们,无奈,硬着头皮睡去。第二天胳膊腿上到处都是蚊子们留下的吻痕–小红疙瘩,奇痒难忍。我发飙了,对付蚊子,我要开始行动!

刚开始我采用的是防守战略,听说食用葱姜蒜可以使皮肤排出的汗味具有天然的驱蚊效果,本想采用此方法,但是吃了大蒜那味儿我更受不了只得放弃。还是在洗澡的时候多放点花露水吧,“六神特效驱蚊花露水”据说效果很好,洗完澡往身上狂撒,安静的躺在床上,等待蚊子飘然而来再飘然而去。结果,效果欠佳,蚊子依然如故的为我唱着催眠曲,而且我还被花露水熏得神清气爽、失眠健忘。

防守看来不行,改变战略。男人!就要对别人狠一些!对付蚊子也不例外!狂奔去超市,买来“枪手”喷雾剂、“睡得香”电蚊香、电蚊拍、紫外光灭蚊灯等等,我要发起进攻了!晚饭毕,拿起“枪手”对卧室一通疯狂扫射,再将蚊香点燃,整个房间烟雾弥漫,关紧房门,外面客厅里的灭蚊灯发出幽幽的清华紫光。这下蚊子们彻底的玩完儿了,对不起了诸位,我已经够瘦弱了,您就给我留点儿血吧。

沐浴后,推开卧室门,兴冲冲准备打扫战场,刚推开门我就被呛得眼泪鼻涕都下来了(我刚才喷的不是催泪瓦斯吧),蚊子倒是没有了,只是这屋里也不能待了(已经感觉呼吸困难了),无奈只有掐灭蚊香,打开窗户,终于,新鲜的空气伴随着新鲜的蚊子又进来了。灭蚊灯、灭蚊拍也收效甚微。灭蚊战争暂告一段落,蚊子暂时领先。

先这样吧,实在不行就拿手拍吧, 要是懒得拍就猛开空调把他们冻死,再或者,如果我的反应足够灵敏的话,我就在它们叮我的那一刹那,暗运内力把它们的嘴夹在肌肉里,我憋死它们!

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-06-18/index.html b/p/2007-06-18/index.html new file mode 100644 index 000000000..43b6ca672 --- /dev/null +++ b/p/2007-06-18/index.html @@ -0,0 +1,10 @@ +2007-06-18

2007-06-18

你问:“把大象关冰箱里共分几步?”答:“分三步,把冰箱门打开,把大象放进去,把冰箱门带上”。你又问:“可是把大象关进去之后里面黑乎乎的大象不害怕吗?”反问:“你怎么知道关上之后里面还是黑乎乎的?你确定关上门之后那个灯灭了吗?”你:“~~~~~~”

这个问题曾经也困扰我很久,因为冰箱的门只要一打开那个灯就亮起来,可是关上门之后你又看不到里面,所以还是不能确定里面到底是什么情况。听说国外曾经有人为这事儿想不开去自杀,更有人为此急得抓耳挠腮夜里都睡不着觉,直到他把冰箱的门上凿了个洞,看清了原来关上冰箱门后那个小灯真的灭了,这才安稳的睡去(估计这哥们是一环保人士,担心那灯太费电)。

我没像那位牛人那样的使用暴力,但也自有办法。当然了,作为一个正常人,去探讨冰箱里的灯到底关了没有,这种做法实在是有些偏执(这不神经病吗!),你就姑且看作我是好奇心使然吧。反正,我的冰箱刚弄回来的时候我还真就动用了高科技手段–拍照手机,我那手机带了个30W像素的鸡肋摄像头这下派上用场了。

也是分了三步,把冰箱门打开,把手机定了时(定时10秒后拍摄)放进去,再把门带上。心中默念,时间到,开门取出,查看照片,出现了不可思议的结果!照片里那个灯竟然还亮着!再试一次,还是亮着。我那叫一个晕,觉得被冰箱厂家给忽悠了,口口声声说节能,这得多耗不少电呐。在仔细阅读了两遍说明书之后,总算恍然大悟,原来那不是普通的灯,它不仅仅担任了照明的工作(难道还用来制冷啊?),还兼具杀菌的功效,在关上门之后,它再持续照射几分钟食物,起到杀菌抑菌的效果。哦,原来如此,人家陈老师说了:“人不能无聊到这种地步!”

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-06-19/index.html b/p/2007-06-19/index.html new file mode 100644 index 000000000..53870a192 --- /dev/null +++ b/p/2007-06-19/index.html @@ -0,0 +1,12 @@ +2007-06-19

2007-06-19

电视上充斥着广告,其中不乏精品,看完之后让人心情舒畅然后心甘情愿的掏腰包去买他们的产品。但是大多数广告都庸俗不堪,让人看得心慌气短、胃部抽搐、浑身起鸡皮疙瘩。这其中不必说“收礼只收搓澡巾”,也不必说“洗洗更健康”,单就是那位一口气上五楼的大爷就能让人抓狂了。时间长了,这些广告我吐啊吐啊的也就习惯了,对于这类垃圾广告也有了一定的免疫能力。但是最近又有一个广告冲破了我的心理防线!那就是某饮料的变态广告“我拧你!”

画面上,一群疯子在那里晃来晃去的踢腿,就像得了羊癫疯似的,整个广告看了让人不知道他们在表达什么另类理念,还好导演没忘记让他们每人手里拿着一瓶该品牌的饮料。我估计作者的思路来源与某天他的鞋里进了个小石子,然后他就不停的甩啊甩,一直甩不出来,直到喝了他那个饮料才甩了出来,于是就创作了这个广告。关键是你在电视上恶心恶心我也就算了,在上下班的公交车上居然也循环的播放,而且还衍生出不同的版本出来,里面就没有一个正常人,都拿个腿在那儿踢来踢去的。
+
+也许从某种层面上来说,这也是一个很成功的广告,我看见很多人吵着要下载那段抽风的音乐作为手机铃声,但是我绝对不会去喝一口那种饮料,我怕晚上会做噩梦,然后再一脚把被子给踢到床底下去......
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-06-27/index.html b/p/2007-06-27/index.html new file mode 100644 index 000000000..7e137ca83 --- /dev/null +++ b/p/2007-06-27/index.html @@ -0,0 +1,22 @@ +2007-06-27

2007-06-27

雨后的空气格外清新,天气还没有完全放晴,乡间的柏油路上还是湿的,远处缓缓驶来一辆摩托车,骑车的人叼着烟,看起来懒洋洋的,十分惬意,没错,那就是我。

我这几天回老家了,因为要回去处理一些工作上的事情,这个机会十分难得,暂时逃开北京繁忙的工作,溜回老家,无拘无束,自由自在。
+
+目光所及,尽是农田。空气中还飘散着青草混合大粪的味道,也算是沁人心脾吧。
+

别再徘徊沉寂的心灵 +别再留恋破碎的回忆 +大地迎春雷 +抛弃你满腹的忧虑 +缤纷的彩虹等着你 +别再犹豫等待的心湖 +别再沉迷过去的旧梦 +暖暖的春风 +走向那灿烂的天涯路 +耀眼的阳光迎着你

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-06-28/index.html b/p/2007-06-28/index.html new file mode 100644 index 000000000..ce9e2415d --- /dev/null +++ b/p/2007-06-28/index.html @@ -0,0 +1,11 @@ +2007-06-28

2007-06-28

偶然在diglog里发现了鲜果在线这个网站,名字很好听,于是乎,我就点击进去看了看。看了之后真有一种相见恨晚的感觉,这个站点本身不提供什么信息,只是提供一个在线的RSS阅读器,而且它提供的RSS频道都是根据大家的兴趣和订阅量进行排序的,也就是说,看某个频道的人越多,该频道就越靠前。这样就可以看到大家都喜欢看的东西,那些垃圾信息不会浮上来了(感谢Web2.0啊!)。

在线阅读的操作也十分简单容易上手,而且界面清爽,有比较强大的自定义功能(我靠,怎么这么像托儿啊),我订阅了一些精品的频道,比如Engadget、Solidot、cnBeta等,顺便订阅了王小峰的“不许联想”(这个博客比较能扯淡,这算是夸他了)。这下就不用Firefox的rss阅读器了,直接把订阅的频道放在鲜果在线里存储到网上,在家和在公司都能看到同样的新鲜信息了,重装系统也不怕,把东西都放到网上,我想这也是以后互联网发展的趋势吧......
+

ps:其实我早就把收藏的网址也放到网上了,在Firefox里安装一个扩展–yoono,这个插件也很牛,有点儿像美味书签(del.icio.us),不过yoono最近增加了收藏整个网页的功能所以比较起来就更喜欢yoono。

分享:

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-06-29/index.html b/p/2007-06-29/index.html new file mode 100644 index 000000000..bd45114d8 --- /dev/null +++ b/p/2007-06-29/index.html @@ -0,0 +1,28 @@ +2007-06-29

2007-06-29

今天又一次雨中漫步,原因很简单,受天气预报的干扰我又没带伞(干嘛要说又呢?)。拿起背包从容地奔向车站,嘴里也不忘哼着:“我能想到最郁闷的事~~,就是下雨却没有带伞~~”。淋雨就淋雨吧,挤上车,去思考一个很严重的问题,我的晚饭吃什么?别笑!这确实是一个很严重的问题。我不能像老婆在身边时那样说:“随便吧,做啥吃啥”(虽然心里想着最好炒两个菜,再冰上一瓶啤酒)。自己动手去做的话,倒不是嫌麻烦,只是吃我做的晚饭简直是虐待自己(大饼卷着馒头沾着米饭吃)。

吃晚餐在我眼中确实是非常重要的事儿,平时上班的时候,早饭总是很虚无缥缈,不堵车的时候就慢慢坐在包子铺里吃包子,堵车时就没准儿了,也许是一个鸡蛋饼,也许是一个肉夹馍,也许,也许只有一杯开水。午饭就是普通的工作餐,千篇一律,除了米饭还是米饭。所以说,一日三餐也就晚饭是顿饭,我把吃晚饭看作是一件很神圣的事情,虽然不必在每次吃晚饭前都焚香沐浴,但我也在吃饭前做个深呼吸,抛开一天的烦恼,菩萨保佑、阿弥陀佛、无量天尊、阿门!感谢上天又让我吃了一顿晚饭!然后就对生活重新燃起热情,对工作又重新充满信心,活着不就是为了这顿晚饭嘛!
+
+可是,现在,我看了看车窗外,雨停了,道路渐渐不再拥堵,我的胃却越来越堵,没有胃口,吃还是不吃,这是个问题。下了车,路边的麻辣烫小摊熏得我的胃一阵抽搐,不远处的油炸臭豆腐老板正在卖力的吆喝,卖盗版书的小贩倒是省事儿,在大喇叭里循环播放“六块一本儿,随便挑随便拣......”,喊得我头晕眼花,我真想冲过拿起他的喇叭然后在空中抛一个完美的弧线。
+
+还是那个晚饭情节,不想在外面饭馆里吃,尤其是一个人在饭馆里吃。
+
+拿起馒头,就着音乐和啤酒......
+

pijiu

我怎么会舍得你走, +这一去竟是几个秋冬 +请你好好珍重 +无须挂念我太多 +我的爱和从前一样 +这承诺当是万般重要 +尽管容颜会老 +这一生无以为靠 +我还是会爱你到老 +我不会让你苦恼 +也许我始终无法释怀 +我会假装一切都好

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-06-30/index.html b/p/2007-06-30/index.html new file mode 100644 index 000000000..e4181d1d6 --- /dev/null +++ b/p/2007-06-30/index.html @@ -0,0 +1,13 @@ +2007-06-30

2007-06-30

早晨起来,像往常的周六一样,来到公司加班。打开电脑,然后习惯性的访问我的msn空间,“该页无法显示….”,不会吧,难道是网络断开了?没有啊,空间主页还是可以访问的,怎么一切换到我的空间就“该页无法显示”了呢?强制刷新浏览器还是不行,随便点了一个朋友的空间,可以访问。完了!莫非我的msn space被封掉了?

上网搜索一下,看看有没有出现同样问题的朋友,结果显示msn space无法访问是常有的事儿,很多人都有过类似经历(国内用户),这其中的原因不言自明啊!我开始回忆,在我的日志里面到底有没有不该出现的敏感词汇?想了半天,答案是没有。可是要说是msn sapce的故障吧,别人的空间又是可以访问的,无奈只好跟微软的客服发了封电子邮件,暂时还未收到回复。
+
+我刚开始写网络日志,不为影响别人的看法,只为记录一下暂时的心情,本以为放到网上比放在本地还安全(相信微软的技术水平),结果还给我来这一手,想记录的时候却无法访问了,弄的心里还挺难受,担心以前的日志会不会丢掉啊!
+

ps:就在刚才,它又突然可以访问了!

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-07-01/index.html b/p/2007-07-01/index.html new file mode 100644 index 000000000..87099c5d5 --- /dev/null +++ b/p/2007-07-01/index.html @@ -0,0 +1,12 @@ +2007-07-01

2007-07-01

国外新兴一个叫Twitter的Web2.0站点,听说最近很火爆,很多人在那里叽叽咕咕,说一些有想法但又不至于发一篇bolg的“废话”。我去看了一眼,感觉跟那帮人文化差异挺大的也就没好意思去注册,但是国内的同志们也不示弱,一时间模仿该网站理念的站点如雨后春笋般涌现。在这些国内的叽咕站点里,有朋友就给我推荐这个“饭否”,说是一个迷你Blog,像Twitter一样,只是大家都是中国人,叽咕的内容比较容易懂一些。我这个人最爱尝鲜,就忍不住过去注册了一个帐号。

感觉还不错,可以绑定MSN,QQ等IM软件,方便通过IM软件在上面发言,甚至可以绑定手机,让你随时随地的把感受发到网上。人气还是挺旺的,不断有人在上面喃喃自语,也不乏有一搭没一搭的聊天者。发布的内容可以很无聊,比如“今天的天气真好”,也可以很有深度,比如“你们好啊,地球人!”
+
+呵呵,由于没用多久,所以还不能多加评论,我怀我有自闭的倾向,现在有了“饭否”,偶尔在里面发一下实时的感受,发泄一下心情而已,就当我是面对着墙壁在一个人喃喃自语吧。
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-07-02/index.html b/p/2007-07-02/index.html new file mode 100644 index 000000000..6813c79fd --- /dev/null +++ b/p/2007-07-02/index.html @@ -0,0 +1,16 @@ +2007-07-02

2007-07-02

最羡慕那些有米的音响发烧友,手里攥着大把的钞票,买音响器材出手阔绰,有没有一双“金耳朵”不知道,反正当音响店的老板告诉他“这套音响,在听蔡琴唱歌的时候能听见她咽吐沫的声音”时,或者跟他说:“那套设备,在听交响乐的时候可以听见拉琴那小子不小心把曲谱翻掉在地上的声音”的时候,他们就会毫不犹豫的掏出几千乃至几万块大洋,把那些“宝贝”搬回家,反复的回放,听听蔡琴在什么时候换了一口气,或者听听吹长笛的坐在第几排。

我也曾在这方面痴迷过,但仅仅是痴迷,没有什么实质性行动,原因很简单,掏不起那些闲钱呐!不过,在很早以前,读初中的时候就开始摆弄那些“音响器材”了,只是一堆喇叭,功率很小,大部分是从旧收录机上拆下来的,“音源”也就只有卡带,我曾试着把喇叭放到各种地方以调整他们的“音效”,比如放在蚊帐上除了可以在睡眠时有音乐环绕外还兼具“驱蚊”的效果,我为了得到更多的低音也曾把喇叭嵌入到书桌里(整个桌子就是音箱哈),甚至把喇叭放到洗衣机里,那音质真是惨不忍听。反正受当时的条件限制,我也只能是像小孩摆弄玩具似的,玩一玩儿而已,毕竟当时升学才是最大的目标。
+
+直到有一天,我翻看一本旧音响杂志,有人自制了个音箱,据说效果还不错,于是就动了自己也做一个的念头。再后来,到了上中师的时候,有了大把的空闲时间(但还是没空闲的钱),决定纯手工制作一只“有源音箱”!说干就干,开始行动!首先考虑的是功放电路采用什么形式,当时最佳的方案是使用“LM-1875”功放芯片,但由于囊中羞涩,最终放弃,后来买来一块晶体管放大板,也算将就了,喇叭买了两只,一个高音,一个中低音(8寸),向我大舅要来了分频器。让老家木匠邻居帮忙做了个音箱的框架,剩下的就是我和我的一个哥儿们亲自动手了。箱体的材料比较奢侈,把我家的一个桌子给锯了(靠!太过分了)。后来组装的时候才发现,我竟然忘了考虑功放的前级,没办法,再次求救与大舅,从旧收录机上拆下来一块板子作为前级(居然还可以调高低音调)。
+
+就这样,前前后后忙活了有半个星期,我的音箱终于发出处女声了,这个时候音源已经是一台VCD,那个时候我好像对蔡琴不感兴趣,于是先听了一首陈慧娴的《归来吧》,真是天籁啊!我当时感动的鼻涕都快掉下来了!当然了,我这么说是有一些夸张,其实音质不咋地,只是当时又没听过真正的音响,这只亲手做的音箱,让我体验到了充足的低音(说到低音,要感谢我的姥爷,他给了我一只大号的电源,具体功率不知道,反正很大很大),震耳欲聋的低音,就像是有人拿着锤子在敲打我的胸膛。
+
+这只音箱在当时带给了我无限的快乐和满足感,后来就去省会读大学了,买了电脑,买了几百块的音箱,那只音箱就被我扔到了角落,上面布满了灰尘。再后来,我干脆把它送给了我的大舅,听说他现在拿它当板凳,还挺结实的!
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-07-04/index.html b/p/2007-07-04/index.html new file mode 100644 index 000000000..fac813608 --- /dev/null +++ b/p/2007-07-04/index.html @@ -0,0 +1,12 @@ +2007-07-04

2007-07-04

统计了一下我平时上班所需要的时间,要是堵车的话大概要一个小时多一些,要是特别堵的话大概要两个小时,要是跑步的话大概得三个小时多一些(推算的,可以忽略),要是夜里打车去上班的话大概得二十多分钟(极少,也可以忽略)。所以我一天大概有三个小时是堵在路上的,这导致了我的胃口极差,身材日渐消瘦,远看像铅笔近看像挂历!每天我都要坐在车上长吁短叹:“GR的堵车啊!”

是什么原因造成了这样的状况? 原因有很多种,我想最直接的原因可能就是因为路上出现了车祸。无论是蹭了一下车屁股还是挂了一下后视镜,双方都会停好车,把路占上,然后撅起屁股在那儿查看爱车的状况,最后再各自打电话叫人......这个时候你要是刚好在路上,你就会感觉你置身于车的海洋,一辆挨着一辆的汽车望不到头,一片喇叭声,让人透不过气来。每当我乘坐的公交车慢慢的拱过出事地点,往往还能看到出事的双方(或多方)在那儿撅着。这种情况每天都要出现,所以每天都要堵车。
+
+据说从8月7号到8月20号,北京的交通管制要进行奥运预演.这对我们这些挤公交车上班的来说真是莫大的好消息啊!我们又可以感受像去年中非论坛期间的那种一路畅通的超快感了!不过,快乐永远是短暂的,过了那几天,还是得老老实实的坐在车去上体验“堵车不堵心”。
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-07-06/index.html b/p/2007-07-06/index.html new file mode 100644 index 000000000..cc31dddb7 --- /dev/null +++ b/p/2007-07-06/index.html @@ -0,0 +1,59 @@ +2007-07-06

2007-07-06

听说google出了在线翻译的工具,而且还广受大家的好评,在美国举行的一次翻译比赛中还拿了冠军。我虽不是google的粉丝但也对google的产品挺感兴趣的,于是赶紧凑个热闹,看看伟大的google能不能给我带来惊喜。 +由于我只会中文,那就看看google的英译中的水平怎么样。废话少说,赶紧拿来一首英文歌词《you needed me》(我最喜欢的英文歌曲之一)。

You needed me

I cries a tear you wiped it dry

I was confused you cleared my mind

I sold my soul you bought it back for me

And help me up and give me dignity

Somehow you needed me

You gave me strength to stand alone again

To face the world out on my own again

You put me high upon a pedestal

So high that I could almost see eternity

You needed me, you needed me

And I can’t believe it’s you +I can’t believe it’s true

I needed you and you were there

And I’ll never leave why should I leave

I’d be a fool

Cause I’ve finally found someone

Who really cares

You held my hand when it was cold

When I lost you took me home

You gave me hope when I was at the end

And turned my lies back into truth again

You even called me friend

You gave me strength to stand alone again

To face the world out on my own again

You put me high upon a pedestal

So high that I could almost see eternity

You needed me ,you needed me

Oh, yes, you need me

You needed me

先试了一下整段翻译,把歌词复制进去,出来的结果让我忍俊不禁

google自动翻译的文字:

你需要我,我喊了眼泪,你擦它干,我摸你清我心中我卖出 我的灵魂,你买回来,我和帮助我,让我有点尊严,你需要我你们给了我力量单独再次面对世界走出自己再次你就把我小时 在室内一个台阶那么高,我几乎可以看到永恒,你需要我,多欧需要我,我也不相信是你,我不能相信这是真的,我需要你和你的笔 在此,我永远不会离开,我为何要离开我就是一个傻瓜,我的事业总算发现有人真的三白族你握着我的手,当它冷时,我输了,你带我家,你给了我希望钨 母鸡,我是在年底把我的谎言放回真话的时候,你甚至骂我的朋友,你克须缴我力量单独再次面对世界走出自己再次你就把我高美 无源一个台阶那么高,我几乎可以看到永恒,你需要我,你需要我哦,多 欧需要我,你需要我

唉,比较失望啊,试一下google的翻译网页的功能吧,找到歌词的网页,然后让它翻译

你需要我 +I cried a tear我哭了眼泪 +You wiped it dry你擦它干 +I was confused我很困惑 +You cleared my mind你清除了我的心 +I sold my soul我卖我的灵魂 +You bought it back for me你买回来,我 +And held the earth召开地球 +You gave me dignity你给我尊严 +Somehow you needed me某种程度上,你需要我 +You gave me strength你们给了我力量 +To stand alone again单独再次 +To face the world面对世界 +Out on my own again出自己再次 +You put me high你把我高 +Upon a pedestal当佩服 +So high that I could almost see eternity如此高,我几乎可以看到永恒 +You needed me你需要我 +You needed me你需要我 +I can’t believe it’s you我不能相信这是你 +I can’t believe it’s you我不能相信这是你 +I needed you我需要你 +And you were there你有 +And I’ll never leave, why should I leave?和我永远不会离开,我为何要离开? +I needed you我需要你 +can I finally found someone who really cares可我终于发现有人真正关心 +(You needed me)(你需要我) +You held my hand你牵我的手 +It was cold据冷 +And I was lost我失去了 +You took me home你带我家 +You gave me love你们给我的爱 +That I was at the end我是在结束 +I turned my life我把我的生命 +Back into truth again You even called me ‘friend’放回真话的时候,你甚至骂我’朋友’ +You gave me strength你们给了我力量 +To stand alone again单独再次 +To face the world面对世界 +Out on my own again出自己再次 +You put me high你把我高 +Upon a pedestal当佩服 +So high that I could almost see eternity如此高,我几乎可以看到永恒 +You needed me你需要我 +You needed me你需要我 +You needed me你需要我 +You needed me你需要我 +Oh, yes, you needed me哦,你需要我 +You needed me你需要我

呵呵,这下看起来还像那么回事儿.感觉机器还是代替不了人啊.翻译有感情的东西总是那么生硬.

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-07-12/index.html b/p/2007-07-12/index.html new file mode 100644 index 000000000..5fe191499 --- /dev/null +++ b/p/2007-07-12/index.html @@ -0,0 +1,10 @@ +2007-07-12

2007-07-12

加班后回家的路上,路灯十分昏暗,还没有吃晚饭,心情极度郁闷,我缓缓(没力气狂奔了)走向公车站牌,走着,走着,突然!一个黑影窜了过来,他跟我说:“兄弟,要盗版光盘不?”我没有理他,继续走,走着,走着,突然!又一个黑影窜了过来,他跟我说:“兄弟,要发票吗?”我没有理他,继续走,走着,走着,突然(靠,有完没完啊!)一大一小两个黑影窜了出来,原来是一个中年妇女领着一个七八岁的小女孩儿,夜色中看不清面目。小孩开口说话了:“叔叔,给点儿钱让我买吃的吧,我都饿了一天了……”边说还边做有气无力状,大人也在一边附和。说得我心里一软,鼻涕快掉下来了,差点儿掏钱。但是转念一想,我TM也饿了快一天啦,也没吃饭呢,再何况,她们的行为也太让我愤怒了,因为就凭这些个破烂演技拿来唬我也太侮辱我的智商了吧!于是,我友善的冲她们说道:“小朋友,你看”我用手指了指马路,“往前走500米,那里有家派出所,你过去找警察叔叔要些吃的好不好?”小孩一时不吭声(台词没背下来),大人接着说:“你就可怜我们,给我们几块钱,买包方便面也行啊!”(我靠,我这么晚了还没吃饭,我求您别勾引我的食欲了!)我没办法,掏出手机,说:“既然你们不愿意亲自过去,那我帮你们打110吧……”这句话还没有说完,说时迟那时快,只听得“嗖嗖”两声,两个人全都不见踪影,公车站牌下只剩下我和随风飘舞的碎纸片(好身手!)。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-07-19/index.html b/p/2007-07-19/index.html new file mode 100644 index 000000000..6ed86fe67 --- /dev/null +++ b/p/2007-07-19/index.html @@ -0,0 +1,12 @@ +2007-07-19

2007-07-19

随着一阵悦耳的下班铃声,我提前结束了一天的工作,按照惯例,周末了,要去打球。叫上同事,抱起篮球,飞快地奔向球场。终于逃脱了闪烁的计算机屏幕,逃脱了无聊的工作计划,逃脱了漫长的会议,逃脱了郁闷的代码……

各位观众,各位听众,也许你们刚刚打开电梯,现在为您直播的是--火星杯篮球锦标赛!穿着运动鞋牛仔裤正在捡球的那家伙就是我,看呐,我在球场上尽情地狂奔,边打球边哼着歌曲“啊哼三分球,它在空中停留,漂亮的假动作,帅呆了我......哦shit!球丢了”。一口气打了两三个小时,直打到有人气喘吁吁,打到有人双腿抽筋,打到有人口吐白沫还不肯离去。天渐渐黑了,球框渐渐虚无缥缈起来,收拾家伙,撤!
+
+走到站牌,有车,有座,爽!上了高速,一路畅通,爽!到了家里,贤惠的老婆已经把饭菜做好,菜做的色香俱佳,啤酒冰得温度适中。如果这个时候你问我,什么是幸福?我会自在地夹一口菜,然后再悠闲地喝上一口啤酒,眯起眼睛跟你说:“嘛儿叫幸福?介就叫幸福!”
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-07-20/index.html b/p/2007-07-20/index.html new file mode 100644 index 000000000..4003cc756 --- /dev/null +++ b/p/2007-07-20/index.html @@ -0,0 +1,14 @@ +2007-07-20

2007-07-20

我都已经好几天没有照看我的msn空间了(最近太累),今天访问一下,发现界面居然有了变化(别三日,刮目看),嗯哼,原来是微软的Live小组把咱的空间给升级了。

首先是界面的整体风格有了改变,我审美不行,看不出是好看还是难看,感觉貌似顺眼一些。空间上方仍然悬挂着那个大大的广告条(我一直看它不爽),工具条的宽度变宽了,这样会占用更多的空间。进入空间的“自定义”功能,发现提供的模板多了一些,但一个比一个不耐看,所以我什么也没有动,继续保持现状。一直希望Live空间能够提供类似WordPress那样的模板(多漂亮啊),现在看来,要走的路还比较长(Live小组继续加油啊!)。
+
+不过话又说回来,空间里整那么多花里胡哨的东东也没用,看得让人眼花缭乱的也不爽,我还是喜欢简约一点的风格,最好是让人进入我的空间后,感觉就像是打开了windows的记事本(过分了吧)。本来Google提供的那个blog挺好的,可是总是不能访问,还是老老实实的在微软提供的共享空间里得瑟吧。
+
+最后,再鄙视一下我自己,这几天由于懒惰而没有更新空间的内容,太不像话了!
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-07-21/index.html b/p/2007-07-21/index.html new file mode 100644 index 000000000..850f0a261 --- /dev/null +++ b/p/2007-07-21/index.html @@ -0,0 +1,13 @@ +2007-07-21

2007-07-21

一个胖子,一个相貌平平而且豁牙的胖子,一个相貌平平而且豁牙的卖手机的胖子。这样的人参加选秀节目,如果你是评委的话,你会让他通过海选吗?如果他告诉你他要表演的是歌剧的话,你会跳下评委台把它踢出演播厅吗?!我想你会的,因为当时英国的那个选秀节目的评委也是这样想的。

  Paul Potts,这个我刚刚看到的英国小伙子,就是这样参加选秀节目的。当他极不自然地站在舞台上,傻傻地告诉评委他要表演歌剧,评委们都笑了,表现得有些不耐烦。可是,当他深情地唱起今夜无人入眠,当他那与帕瓦罗蒂一样激昂的男高音在演播厅响起时,赛场沸腾了!所有的人都站了起来,评委刁在嘴里的铅笔掉了下来,掌声雷动!
+
+  这段由朋友发过来、我甚至懒得看的视频,看得我头皮发麻。在起了一身鸡皮疙瘩后,我的眼睛也不争气地湿润了(震撼,感动)。看了别人写的介绍,我了解到,这个叫Paul的小伙子有着不太顺利的人生际遇(大多数人如此吧),但是他从未怀疑过自己的理想,仍然执着地追求着歌剧表演的艺术魅力,直到他被生活所逼而不得不靠卖手机来糊口时,仍未放弃!终于,上天给了他最后一次机会,他成功了,他向世人再一次的证明了:真正牛逼的人,终究会牛逼起来!
+

试了一下,msn的空间居然还可以插入视频!

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-07-23/index.html b/p/2007-07-23/index.html new file mode 100644 index 000000000..7be3199ca --- /dev/null +++ b/p/2007-07-23/index.html @@ -0,0 +1,19 @@ +2007-07-23

2007-07-23

我手里这个Nokia 6230用了3年了,买的时候多加了一块电池。前两天,其中一块电池寿终正寝了,剩下的这块也差不多了,感觉就像我的胃,一吃就饱,一会儿就又饿了。我看着手里这个灰头土脸得就像从垃圾桶里捡回的手机,不禁有了换掉它的念头。

  到网上翻了翻信息,结果让我很失望,感觉Nokia不太长进,眼看着人家索爱扛着音乐、摄像的大旗在市场上占了一席之地,自己也跟着别人的屁股转,也在那儿搞音乐手机、摄像手机,却忘了自己的特色。没办法,别的牌子不愿意用,老N最近推出的新机不是我看不上就是我的钱包不让看(靠,就这还敢冒充Nokia的粉丝呀?)。苹果的iPhone最近倒是炒得挺火,看起来也挺不错,可是总觉的那玩意儿离咱太遥远了,还是不多看了,以免中毒。
+
+ 在查看了众多机型之后,长叹一声:“究竟什么样的手机才能让我满意呢!”
+

总结以下大概要满足以下几点: +1、屏幕要足够大、分辨率不用极高但也不能太低 +2、反应速度一定要快(目前我还没有发现一款智能手机反应速度飞快) +3、个头不能太大、重量不能太沉 +4、电话、短信功能好用 +5、电量一定要持久,待机越长越好(这点最重要,功能再强没电也是白扯) +6、非国产(这个不用多说)

  这些要求不过分吧?像什么摄像、音乐等功能都没要求,可愣是找不到这样一款手机,反复对比后发现还是目前手上的这个更合要求一些。算了,将就用吧。结果,昨晚做梦,梦见我也设计了一款手机,以上条件除了第六条其余都满足,取名就叫“nbPhone” 把苹果的Phone的风头给压下去了,乔布斯都跟我急了。
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-07-24/index.html b/p/2007-07-24/index.html new file mode 100644 index 000000000..110a2d948 --- /dev/null +++ b/p/2007-07-24/index.html @@ -0,0 +1,24 @@ +2007-07-24

2007-07-24

天气这么闷热,生活这么枯燥,何不搞点小把戏调剂一下气氛呢?要是你现在刚好在办公室里,那么恭喜你了,下面我将教你几个在下秘密收藏的整蛊手段(一般人我不告诉他)。

 前提条件:1、你们用计算机办公;2、你们使用的是Windows操作系统;3、你要整蛊的同事没有暴力倾向;4、他刚好暂时离开一下。
+
+ 好了,准备好了就开始行动吧!
+
+ 场景一:“我的密码被改了?!”
+ 如果你的这位同事有锁定计算机的习惯,那就刚好实施一下,在他计算机的锁定状态下的密码框里提前敲入一个空格,这样一般他回来时不会发觉,等他输入完自己的密码后,会发现进不去了!(因为密码前面多输入了一个空格)。
+
+ 场景二:“用来干活儿的软件没有反应了!”
+ 如果他没有锁定计算机的习惯,那么刚才那个办法就不凑效了,怎么办呢,找到他用来工作的软件(VC,Word、Excel等),把帮助菜单里的“关于(about)”对话框给打开,然后用鼠标把对话框拖动到一个屏幕上看不见的地方。哈哈,等着吧,他回来会发现他用来工作的软件怎么也不听话了,无论点击哪儿都没有反应。
+
+ 场景三:“鼠标不好使了”
+ 现在大家都用光电鼠标了,而光电鼠标全靠它屁股底下的那个激光眼,没错!你又猜对了,拿个小纸团把它那个小眼睛堵住,赶紧去吧!鼠标瞎了之后就罢工了。
+
+ 以上方法屡试不爽,我都亲自实验过,不过是别人在我身上实验的(这帮败家玩意儿)。
+

注:以上操作纯属娱乐!产生后果自负。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-07-29/index.html b/p/2007-07-29/index.html new file mode 100644 index 000000000..477e9230d --- /dev/null +++ b/p/2007-07-29/index.html @@ -0,0 +1,12 @@ +2007-07-29

2007-07-29

对于我来说,理发是件很痛苦的事情,可能是有心理障碍吧。小的时候被老爸强行摁住理过一次发,我像一只小鸡那样被夹在腿上无力反抗,由于整个过程我都在不停地叫骂那个理发的,所以那家伙下手还不含糊,把推子使得嚓嚓直响,对着我的头皮和耳朵可劲儿招呼。整个过程是漫长的、痛苦的、令人发指的。最后我看着镜子里的凸了吧唧的头,还不忘使劲儿拧了一把鼻涕抹在老爸的裤腿上。此事后来成为笑谈,但爷儿俩在理发这种事情上一直都持有不同的观点,当然了,我还只能提出强烈抗议、强烈不满、强烈谴责,但采取进一步措施的权利还是保留了。一直到现在,当老爸跟我说:“快去把头发理一理!”时,我还是乖乖的狂奔去理发。

  不过,现在我离老爸远了,他管不了啦(主要是没看见),我可以尽情地把头发留到很长,然后再一下剪到很短(一般是回老家之前)。但是我的这种习惯却造成了另一件事情,给我理发的人极度不爽。每当我拖着留了几个月的长发走进理发店,告诉理发的师傅给我可劲儿剪短时,伊总是很扭捏,假惺惺地跟我说:“哎呀!你的发质这么好,又好不容易留了这么长,剪了多可惜啊!”其实谁不知道伊是想省点儿事儿,想拿剪刀在那三下两下剪完糊弄我。于是我只好说:“嗯嗯,本来是想留长的,但是现在突然想开了,不想留了,还是麻烦您给我剪短吧!”最后等着人家极不情愿(还很费时)地给我剪完,我才满意离去。但是这招下次就不能用了,所以我总是选择不同的理发店,反正这玩意儿多得是!
+
+  今天我又理发了,从五一到现在大概有三个月了,很抱歉,又让一个理发师傅不爽了一把,不管他,这次理完了,谁知道我什么时候有心情理下回呀!
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-08-03/index.html b/p/2007-08-03/index.html new file mode 100644 index 000000000..e2cafb515 --- /dev/null +++ b/p/2007-08-03/index.html @@ -0,0 +1,11 @@ +2007-08-03

2007-08-03

昨天去电影院看了《憨豆先生的黄金周》,感觉还不错,憨豆先生还是那么滑稽可乐,有着独特的幽默方式,我虽然没有笑到肚皮抽筋、掐着大腿,但是90分钟的电影还是让我由衷地笑了半个小时(累计)。这里就不介绍剧情了(一般来说这种喜剧基本没剧情可言),网上到处都是介绍。整个影片从头到尾憨豆先生都拿着那只SONY新出的DV,我估计SONY投了不少钱,还有就是片子的音乐配的还可以,轻快明亮。总的来说还值得一看。 +handouhandou2

  ps:现在的电影院真是不景气啊,能容纳500号人的大厅坐了不到100人,不过挺爽的,谁让他们把票价订的那么贵,现在的票价是我小时候电影票价的100倍
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-08-04/index.html b/p/2007-08-04/index.html new file mode 100644 index 000000000..8235ffb5f --- /dev/null +++ b/p/2007-08-04/index.html @@ -0,0 +1,10 @@ +2007-08-04

2007-08-04

不知是不是因为升级还没有进行完成,最近live spaces总是不能正常操作,用firefox访问有时还会出现乱码或者页面布局乱套,速度慢的惊人,资源占用很厉害。再加上他有太多的限制,这些问题都让我感到对live space失望透顶。衷心希望Google blogger能够早日解封!

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-08-28/index.html b/p/2007-08-28/index.html new file mode 100644 index 000000000..c6566382e --- /dev/null +++ b/p/2007-08-28/index.html @@ -0,0 +1,10 @@ +2007-08-28

2007-08-28

偶然翻看书架上的旧书,发现我以前在上面随手胡乱写了一个“梦幻配置”,那时应该是2000年,根据当时的硬件发展状况,我写了一个可望而不可及的硬件配置。具体什么配置就不说了(大概就是纯平显示器、笨三的cpu),反正现在让你用你还嫌慢呢。现在六、七年过去了,心里又痒痒的,就让我再写一个可望而不可及的硬件配置吧,看看这个配置何时会过时。

中央处理器:Intel Core2 Quad processor Q6700(4核,为了安静,散热采用水冷系统)

主板:Intel D975XBX2

内存:海盗船 TWIN2X2048-6400 ×4(共8G)

外存储:SanDisk 64G闪存硬盘(用于系统存储),2TB磁盘阵列(用于文件存储)

显卡:丽台NVIDIA Quadro FX 5600 ×2(每块显卡可接四台屏幕)

主显示器:Apple 30" Cinema Display(上网、影视、游戏)

副显示器:Apple 20" Cinema Display ×6(地理、虚拟现实、平面设计等)

Creative Sound Blaster X-Fi Elite Pro+罗技Z5500(用于电影、游戏、非专业录音)

主板数字光纤输出+外置解码器+JBL监听音箱(用于欣赏音乐)

操作系统:自己动手定做(编译)Linux版本,桌面环境采用GONE(如果有兴趣就自己写个操作系统)

备注:机箱易采用高厚度、高散热静音机箱,此系统搭建完成后将用于书房,共七台显示器需要用到特殊的显示器支架。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/2007-11-13/index.html b/p/2007-11-13/index.html new file mode 100644 index 000000000..658ceef7e --- /dev/null +++ b/p/2007-11-13/index.html @@ -0,0 +1,11 @@ +2007-11-13

2007-11-13

有几年不用Winamp了,最近Winamp又退出了10周年纪念版版。我下载了一个,感觉听听里面的网络电台什么的还挺不错的(边上班边听欧美最流行的音乐哈)。而且新版还包含了podcast的功能,可以搜索订阅网上的播客。在家听音乐的话,我还是选择foobar。

– +由 sbabybird 于 11/08/2007 07:49:00 下午 在 从容地狂奔上发表

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/2020\345\271\264\344\270\252\344\272\272\346\200\273\347\273\223/index.html" "b/p/2020\345\271\264\344\270\252\344\272\272\346\200\273\347\273\223/index.html" new file mode 100644 index 000000000..98d603507 --- /dev/null +++ "b/p/2020\345\271\264\344\270\252\344\272\272\346\200\273\347\273\223/index.html" @@ -0,0 +1,10 @@ +2020年个人总结

2020年个人总结

保持好奇心

  • 大概是2011年左右,我把QQ签名改成了“好奇、求知、创造”,从此再也没有改变过,我所喜欢的、热爱的、欲罢不能的事情,都被这三个词涵盖了。
  • 十年过去了,很高兴自己还能保持一颗探索未知、热爱学习的心。

读书

  • 现在听书比读书所占比重大,阅读时间缩水明显,翻开电子书的时间都有限,更别提手不释卷。
  • 年初重温《三体》,即便很多情节已烂熟于心,重读仍有新发现,休闲阅读而已,只为放松大脑。
  • 其余时间陆续阅读一些杂书《原则》、《随机漫步》、《菜根谭》、《曾国藩传》等若干。
  • 唯一触动较大的是年末再次翻看《计算机程序的构造和解释》,此次配合网上的公开课视频进行,跟随原书作者课程讲解节奏,对于知识的理解大有帮助,视频虽然年代久远,但知识历久弥新,比起科技业广泛应用的新兴技术,书中的计算原理以及相关的思想更像是对应了武术的“内功心法”,一旦有所突破,则在上层应用产生巨大的提升,与工作学习都大有裨益,其中玄妙不可言说。

摄影

  • 户外活动大为减少,往年春天乃摄影高产期,今年却苦于疫情无法外出,摄影爱好被迫搁置,2020年对摄影技术的练习几乎停滞,无心仪作品产出。
  • 卡片相机已很少使用,手机拍摄已是主流,器材追求已解毒,但如有更新的街拍机问世,心头恐怕还是会痒。
  • 有一事可提,今年独自吃饭次数很多,每次都拍食物照一张,累积下来一年竟拍了几百。

生活

  • 压力与机遇并存,最大收获是面对挫折、困难更坦然,2020不愿多提。
  • 记忆力确实有下降之趋势,回忆起来竟无亮点,亦可能本身就比较平淡。
  • 发现凡事都要低调不吭声的重要性,切记四处宣扬,否则就会出现“说出来就不灵”的魔咒。

学习

  • 对8bit老古董计算机的兴趣不减,四处搜寻相关知识,弄了一大堆模拟器,研究过程中竟对之前所学计算机组成原理有了新的认识和理解,喜出望外,本该大学之时就应掌握的技能,到现在再学也不迟,重在理解。
  • 创意类软件如blender等也持续浅尝,进步缓慢,但入门已没问题,缺少作品练习,安排即可。
  • 儿子已入大学,借用假期时间,我教他编程,他给我讲解高数,算是技能交换了,费曼学习法的一个很直接的应用案例。
  • 越发觉得B站是个学习的好地方,该站以后的发展不可估量,但从教育来看,很可能迅速超越国内二流大学,或者未来改变大学的形态也未可知。

后续计划

  • 希望可以继续通过写字记录学习的知识,保持一定量的文字输出,如条件实在有限,配合语音录音也可。
  • 在自己热爱的事情上,持续学习,关注一下作品输出(持续开新坑),早日成为心目中的“全栈工程师”、“三级工程师”(可参见吴军《硅谷来信》中的定义)。
  • 限制烟酒摄入,保持每日的活动量,能走路就不坐车。
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/p/hello-world/index.html b/p/hello-world/index.html new file mode 100644 index 000000000..ef95a6446 --- /dev/null +++ b/p/hello-world/index.html @@ -0,0 +1,11 @@ +Hello World!
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.1/index.html" "b/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.1/index.html" new file mode 100644 index 000000000..93a8c2902 --- /dev/null +++ "b/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.1/index.html" @@ -0,0 +1,102 @@ +SICP 课后练习题1.1

SICP 课后练习题1.1

练习1.1 下面是一系列表达式,对于每个表达式,解释器将输出什么结果?假定这一系列表达式是按照给出的顺序逐个求值的。

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+
10
+;Value: 10
+
+(+ 5 3 4)
+;Value: 12
+
+(- 9 1)
+;Value: 8
+
+(/ 6 2)
+;Value: 3
+
+(+ (* 2 4) (- 4 6))
+;Value: 6
+
+(define a 3)
+;Value: a
+
+(define b (+ a 1))
+;Value: b
+
+(+ a b (* a b))
+;Value: 19
+
+(= a b)
+;Value: #f
+
+(if (and (> b a) (< b (* a b)))
+b
+a)
+;Value: 4
+
+(cond ((= a 4) 6)
+((= b 4) (+ 6 7 a))
+(else 25))
+;Value: 16
+
+(+ 2 (if (> b a) b a))
+;Value: 6
+
+(* (cond ((> a b) a)
+((< a b) b)
+(else -1))
+(+ a 1))
+;Value: 16
+

练习1.1的内容比较简单,基本上直接就可以计算出表达式的值,所有表达式都可以在mit-scheme的交互解释器里进行验证。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.2/index.html" "b/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.2/index.html" new file mode 100644 index 000000000..34b5e6704 --- /dev/null +++ "b/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.2/index.html" @@ -0,0 +1,34 @@ +SICP 课后练习题1.2

SICP 课后练习题1.2

练习1.2 请将下面表达式变换为前缀形式:

$$ \frac{5+4+\Bigl(2-\Bigl(3-\left(6+\frac{4}{5}\right)\Bigr)\Bigr)}{3\left(6-2\right)\left(2-7\right)} $$

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+
(/ (+ 5
+4
+(- 2
+(- 3
+(+ 6 (/ 4 5)))))
+(* 3
+(- 6 2)
+(- 2 7)
+))
+
+;Value: -37/150
+

练习1.2,直接将数学表达式转换为前序表达式即可,在写的时候可以遵循一下排版规则,即同一个运算符的表达式垂直对齐。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.3/index.html" "b/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.3/index.html" new file mode 100644 index 000000000..15e50ab46 --- /dev/null +++ "b/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.3/index.html" @@ -0,0 +1,28 @@ +SICP 课后练习题1.3

SICP 课后练习题1.3

练习1.3 请定义一个过程,它以三个数为参数,返回其中较大两个数之和。

1
+2
+3
+4
+5
+6
+7
+8
+
    (define (max-three-number a b c)
+            (if (> a b)
+            (if (> b c) (+ a b) (+ a c))
+            (if (> a c) (+ b a) (+ b c))))
+    
+    (max-three-number 42 7 1)
+
+    ;Value: 49
+

练习1.3,解决此练习中问题的方法比较多,本答案使用比较朴素的方法,先比较出最大的两个数字,然后将其相加,对于三个数字来说,先在前两个中选取一个大的,然后将其与后面两个中比较大的那一个相加。还有一种思路就是可以先定义出比较大小的方法,然后再调用之,或者先对数字按从小到大排序然后加最后两个,等等。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.4/index.html" "b/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.4/index.html" new file mode 100644 index 000000000..c36700fa3 --- /dev/null +++ "b/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.4/index.html" @@ -0,0 +1,34 @@ +SICP 课后练习题1.4

SICP 课后练习题1.4

练习1.4 请仔细考察上面给出的允许运算符为复合表达式的组合式的求值模型,根据对这一模型的认识描述下面过程的行为。

1
+2
+
    (define (a-plus-abs-b a b)
+            ((if (> b 0) + -) a b))
+

练习1.4,通过if判断,根据b的值决定对a b所使用的运算符是+还是-,如果b大于0,则组合式为(+ a b),反之则为(- a b),所以组合式结果永远返回a加上b的绝对值。

1
+2
+3
+4
+5
+6
+7
+8
+9
+
    (define (a-plus-abs-b a b)
+      ((if (> b 0) + -) a b))
+    ;Value: a-plus-abs-b
+
+    (a-plus-abs-b 4 2)
+    ;Value: 6
+
+    (a-plus-abs-b 4 -2)
+    ;Value: 6
+
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.5/index.html" "b/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.5/index.html" new file mode 100644 index 000000000..c4b5f3bbd --- /dev/null +++ "b/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.5/index.html" @@ -0,0 +1,26 @@ +SICP 课后练习题1.5

SICP 课后练习题1.5

练习1.5 Ben Bitdiddle发明了一种检测方法,能够确定解释器究竟采用哪种序求值,是采用应用序,还是正则序。他定义了下面两个过程

1
+2
+3
+4
+5
+6
+
    (define (p) (p))
+    
+    (define (test x y)
+      (if (= x 0)
+          0
+          y))
+

而后他求值下面的表达式:

1
+
    (test 0 (p))
+

如果某个解释器采用的是应用序求值,Ben会看到什么样的情况?如果解释器采用正则序求值,他又会看到什么情况?请对你的回答做出解释。(无论采用正则序或者应用序,假定特殊形式if的求值规则总是一样的。其中的谓词部分先行求值,根据其结果确定随后求值的子表达式部分。)

练习1.5 『完全展开而后规约』的求值模型为正则序求值,『先求值参数而后应用』的方式为应用序求值,因此,在应用序求值的模式下,执行(test 0 (p))时会先求(p)这个表达式的值,而根据定义(define (p) (p))执行(p)会造成递归调用,解释器陷入死循环。而在正则序求值模式下,会先展开test过程,根据需要再决定是否执行(p),在本例中,由于传入的x等于0,所以(p)不会被执行,因此不会陷入死循环。

所以,根据以上分析,如果解释器采用的是应用序求值,则解释器陷入死循环,如果是采用正则序求值,则解释器输出;Value: 0

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.6/index.html" "b/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.6/index.html" new file mode 100644 index 000000000..fcb23ef84 --- /dev/null +++ "b/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.6/index.html" @@ -0,0 +1,120 @@ +SICP 课后练习题1.6

SICP 课后练习题1.6

采用牛顿法求平方根的过程如下。开始时,我们有了被开方数的值(现在需要做的就是算出它的平方根)和一个猜测值。如果猜测值已经足够好了,有关工作也就完成了。如若不然,那么就需要改进猜测值(求出猜测值与被开方数除以猜测值的平均值),并重复这个计算过程。具体编写代码如下(在MIT scheme解释器中)。

定义sqrt-iter过程,与上述描述完全对应。

1
+2
+3
+4
+5
+6
+7
+
    1 ]=> (define (sqrt-iter guess x)
+        (if (good-enough? guess x)
+            guess
+            (sqrt-iter (improve guess x)
+                       x)))
+                       
+    ;Value: sqrt-iter
+

定义改进猜测值的过程improve,返回猜测值与被开方数除以猜测值的平均值。

1
+2
+3
+4
+
    1 ]=> (define (improve guess x)
+            (average guess (/ x guess)))
+
+    ;Value: improve
+

定义求平均数的过程average

1
+2
+3
+4
+
    1 ]=> (define (average x y)
+            (/ (+ x y) 2))
+
+    ;Value: average
+

定义判断猜测值是否足够好的过程good-enough?

1
+2
+3
+4
+
    1 ]=> (define (good-enough? guess x)
+        (< (abs (- (square guess) x)) 0.001))
+
+    ;Value: good-enough?
+

定义求绝对值和平方的过程

1
+2
+3
+4
+5
+6
+7
+8
+
    1 ]=> (define (abs x)
+            (if (< x 0) (- x) x))
+
+    ;Value: abs
+
+    1 ]=> (define (square x) (* x x))
+
+    ;Value: square
+

定义最上层的过程,用于启动整个工作(使用1这个数字作为任何数的初始猜测值)。

1
+2
+3
+4
+
    1 ]=> (define (sqrt x)
+            (sqrt-iter 1.0 x))
+
+    ;Value: sqrt
+

执行sqrt过程,并以9为参数,求得平方根为3

1
+2
+3
+
    1 ]=> (sqrt 9)
+
+    ;Value: 3.00009155413138
+

练习1.6 Alyssa P.Hacker看不出来为什么需要将if提供为一种特殊形式,她问:“为什么我不能直接通过cond将它定义为一个常规过程呢?”Alyssa的朋友Eva Lu Ator断言确实可以这样做,并定义了if的一个新版本:

1
+2
+3
+4
+5
+
    1 ]=> (define (new-if predicate then-clause else-clause)
+        (cond (predicate then-clause)
+              (else else-clause)))
+
+    ;Value: new-if
+

Eva给Alyssa演示她的程序:

1
+2
+3
+4
+5
+
    (new-if (= 2 3) 0 5)
+    5
+    
+    (new-if (= 1 1) 0 5)
+    0
+

她很高兴地用自己的new-if重写了求平方根的程序:

1
+2
+3
+4
+5
+6
+7
+
    1 ]=> (define (sqrt-iter guess x)
+        (new-if (good-enough? guess x)
+                guess
+                (sqrt-iter (improve guess x)
+                           x)))
+
+    ;Value: sqrt-iter
+

当Alyssa试着用这个过程去计算平方根时会发生什么事情呢?请给出解释。

解答:

这个练习引入了一个新的思考,刚开始时,我以为是牵涉到了过程的局部参数概念,因为在新编写的new-if过程中,看似可以完成条件判断并返回正确的值,但是在本例中使用却存在问题,即在递归调用sqrt-iter时,传给该过程的guessxnew-if的局部参数,被返回给了new-if这个过程,不会向上返回到上一层sqrt-iter里,这样就导致了改进的猜测值永远不会被使用,使得这个计算过程永远不会结束(除非第一个猜测值恰好合适),从而导致递归调用的陷入无限循环。我在MIT-scheme解释器里的执行结果是,解释器自动退出并提示我递归调用深度超出最大值。

上述看起来是合理的,但是后来我考虑了其他情况,及本书在前面章节里提到了if(if <predicate> <consequent> <alternative>)语句是条件表达式的受限形式,在执行时,先判断predicate是否为真,然后根据结果只执行其后consequent/alternative中的一个。如果使用本例新定义的new-if则作为普通过程执行,传入的参数会因为解释器使用应用序求值的原因,两个表达式都会被立即求值,反应到本例中就是guess(sqrt-iter (improve guess x) x)都会被立即求值,后面的那句是属于递归调用,这样也会导致改进的猜测值永远不会被使用,陷入无限层的递归调用中。

1
+2
+3
+
    1 ]=> (sqrt 9)
+
+    ;Aborting!: maximum recursion depth exceeded
+

思考:

最初的时候,我的针对此题的思考方式是变量的作用域问题(可能lisp不会有此问题),后来发现,也许不是这样,而是由于对传入参数立即求值导致的,后续的网上搜索结果也显示出大家的答案都倾向于后者。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.7/index.html" "b/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.7/index.html" new file mode 100644 index 000000000..384e02306 --- /dev/null +++ "b/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.7/index.html" @@ -0,0 +1,54 @@ +SICP 课后练习题1.7

SICP 课后练习题1.7

练习 1.7 对于确定很小的数的平方根而言,在计算平方根中使用的检测good-enough?是很不好的。还有,在现实的计算机里,算术运算总是以一定的有限精度进行的。这也会使我们的检测不适合非常大的数的计算。请解释上述论断,用例子说明对很小和很大的数,这种检测都可能失败。实现good-enough?的另一种策略是监视猜测值在从一次迭代到下一次的变化情况,当改变值相对于猜测值的比率很小时就结束。请设计一个采用这种终止测试方式的平方根过程。对于很大和很小的数,这一方式都能工作吗?

解答:good-enough?当前采用的判断方式是,对比猜测值的平方结果与X的值之间的差距,当差距小于某个阙值时(比如0.001),就停止计算。当X很小或很大时,这种检测就会失败,比如,假设我们的阙值设置为0.001,那么当X本身小于这个阙值时,就会检测失败,得出错误结果,当X很大时,也会由于精度不足而一直达不到最佳猜测值,导致死循环。

因此,要解决这一问题,可以按照题目中给出的思路对good-enough?过程进行修改,不再判断猜测值平方与X的差距,而是判断两次猜测值之间的比率。

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+
    1 ]=> (define (good-enough? guess next)
+                  (< (/ (abs (- guess next)) 
+                        guess) 
+                     0.001)))
+                     
+    ;Value: good-enough?
+                  
+    1 ]=> (define (sqrt-iter guess x)
+        (if (good-enough? guess (improve guess x))
+                (improve guess x)
+                (sqrt-iter (improve guess x) x)))
+
+    ;Value: sqrt-iter
+
+    1 ]=> (sqrt 0.00000000001)
+
+    ;Value: 3.1622776601874535e-6
+
+    1 ]=> (sqrt 100000000000000000000000000000000000000000000)
+
+    ;Value: 1.0000000000001497e22
+

在新的good-enough?中,传入的是两次猜测值,所以还要修改sqrt-iter过程,在调用时计算两次猜测值。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.8/index.html" "b/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.8/index.html" new file mode 100644 index 000000000..7581cb79f --- /dev/null +++ "b/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.8/index.html" @@ -0,0 +1,52 @@ +SICP 课后练习题1.8

SICP 课后练习题1.8

练习 1.8 求立方根的牛顿法基于如下事实,如果y是x的立方根的一个近似值,那么下式将给出一个更好的近似值:

$$ \frac{x/y^2+2y}{3} $$

请利用这一公式实现一个类似平方根过程的求立方根的过程。

解答:基本思路与求解平方根的实现是一致的,区别再有得到更好值improve的过程有变化,只需根据公式描述进行实现即可

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+
    (define (improve guess x)
+        (/
+         (+ (/ x (* guess guess)) (* guess 2))
+         3))
+         
+    (define (good-enough? guess next)
+                  (< (/ (abs (- guess next))
+                        guess)
+                     0.001)))
+                     
+    (define (abs x)
+        (if (< x 0) (- x) x))
+    
+    (define (cbrt-iter guess x)
+       (if (good-enough? guess (improve guess x))
+                (improve guess x)
+                (cbrt-iter (improve guess x) x)))
+
+    (define (cbrt x)
+        (cbrt-iter 1.0 x))
+
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.9/index.html" "b/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.9/index.html" new file mode 100644 index 000000000..68a4cb793 --- /dev/null +++ "b/p/sicp-\350\257\276\345\220\216\347\273\203\344\271\240\351\242\2301.9/index.html" @@ -0,0 +1,66 @@ +SICP 课后练习题1.9

SICP 课后练习题1.9

练习 1.9 下面两个过程各定义了一种加起两个正整数的方法,他们都基于过程inc(它将参数增加1)和dec(它将参数减少1) 。请用代换模型展示这两个过程在求值(add 4 5)时所产生的计算过程。这些计算过程是递归的或者迭代的吗?

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+
    (define (add a b)
+      (if (= a 0)
+          b
+          (inc (add (dec a) b))))
+          
+    (define (add a b)
+      (if (= a 0)
+          b
+          (add (dec a) (inc b))))
+          
+

解答:根据代换模型分别展开如下

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+
    (add 4 5)
+    (inc (add 3 5))
+    (inc (inc (add 2 5)))
+    (inc (inc (inc (add 1 5))))
+    (inc (inc (inc (inc (add 0 5)))))
+    (inc (inc (inc (inc 5))))
+    (inc (inc (inc 6)))
+    (inc (inc 7))
+    (inc 8)
+    (9)
+    
+    (add 4 5)
+    (add 3 6)
+    (add 2 7)
+    (add 1 8)
+    (add 0 9)
+    (9)
+

根据展开可以看出,第一个计算过程是递归的,因为明显有一个逐步扩展然后又收缩的递归计算链条。第二个计算过程是迭代的,没有扩展、收缩的过程,而是使用a和b存储了常量。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/win8\347\263\273\347\273\237\344\270\213\344\275\277\347\224\250\347\254\224\350\256\260\346\234\254\344\275\234\344\270\272wifi\347\203\255\347\202\271/index.html" "b/p/win8\347\263\273\347\273\237\344\270\213\344\275\277\347\224\250\347\254\224\350\256\260\346\234\254\344\275\234\344\270\272wifi\347\203\255\347\202\271/index.html" new file mode 100644 index 000000000..24c4bb12e --- /dev/null +++ "b/p/win8\347\263\273\347\273\237\344\270\213\344\275\277\347\224\250\347\254\224\350\256\260\346\234\254\344\275\234\344\270\272wifi\347\203\255\347\202\271/index.html" @@ -0,0 +1,11 @@ +win8系统下使用笔记本作为wifi热点

win8系统下使用笔记本作为wifi热点

win8系统下使用笔记本作为wifi热点

背景

在没有无线路由的情况下,比如出差在宾馆,如果手里有一台可以上网的笔记本电脑,则可以给手机、平板电脑或者其他笔记本提供一个可以上网的wifi热点。

我平时在单位即通过此方式给我的平板电脑和手机共享网络通道,比较方便实用,近期在使用的过程中遇到一些问题,经过摸索,解决了问题,在此记录一下,方便以后查阅。

环境需要

  • 一台通过有线连接上网(或者通过3G上网,就是说wifi网卡没有被占用)的笔记本电脑
  • 安装有win8操作系统(win7应该也可以)
  • 无线网卡芯片是intel的(否则可能不支持此技术),并使用了最新的驱动程序

基本步骤

  • 打开具有管理员权限的控制台窗口(在win8系统下,可以通过按windows+x键,然后在弹出的菜单里选择『命令提示符(管理员)』)

  • 输入如下命令 netsh wlan set hostednetwork mode=allow ssid="mywifi" key="12345678" 其中ssid后面的热点名称和key后面的密码可以根据情况自行决定

  • 上一个命令完成后,如果没有异常的话,则输入如下命令 netsh wlan start hostednetwork 这条命令如果执行成功会显示『已启动承载网络』,在下次系统重启后需要重新执行,如果嫌麻烦则可以做一个批处理文件每次双击即可

  • 成功启动承载网络之后,进入『网络和共享中心』点击『更改适配器设置』,此时在该页里应该可以看到一个虚拟网卡(名称一般叫MicrosoftVirtual WiFi Miniport Adapter),右键点击那个可以上网的网络连接(如果是有线连接就是那个『本地连接』,如果是3G的则根据情况而定,总之必须是那个可以上网的连接),选择『属性』,切换到『共享』页,勾选『允许其他网络用户通过此计算机的Internet连接来连接』,在下面的下拉列表里选择那个刚虚拟出来的虚拟网卡。确定即可。

常见问题

执行以上第二条命令启动承载网络后,有时会显示『无法启动承载网络,组或资源的状态不是执行请求操作的正确状态』,网上大部分的文章针对这个问题给出的解决办法都是更新网卡驱动,可是对于我的笔记本无效,因为我的笔记本电脑在前一段时间是好用的,后来不好用了,根据我的摸索,解决这个问题的办法是,去『设备管理器』下面的『网络适配器』里面找找,看看有没有被禁用的设备,比如『微软托管网络协议』,如果禁用了再重新启用即可正常使用此功能了。

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\344\272\213\345\246\202\346\230\245\346\242\246\344\272\206\346\227\240\347\227\225/index.html" "b/p/\344\272\213\345\246\202\346\230\245\346\242\246\344\272\206\346\227\240\347\227\225/index.html" new file mode 100644 index 000000000..9a049b3e9 --- /dev/null +++ "b/p/\344\272\213\345\246\202\346\230\245\346\242\246\344\272\206\346\227\240\347\227\225/index.html" @@ -0,0 +1,10 @@ +事如春梦了无痕

事如春梦了无痕

上苍保佑吃饱饭撑着的人,中午吃完饭抽烟的时候,刷了几页微博,可能跟我关注的人有关(我一般关注段子手或者文艺思想贩卖者),感觉内容作为消遣挺合适,但是越看呢,越觉得没有营养,可能是跟我刚抽完烟进入贤者时间有关,一把把微博推开的时候(合上屏幕),心里竟涌现出一句“都是吃饱了撑的”,用以评价刚刚看过的几段不痛不痒的文字。

发完感慨随即想到,这句话是不是可以作为一本非常扯淡的书名呢?然后开始畅想自己写一本这样的书,里面的内容天马行空,多为吃饱了没事儿干的人才会忧伤和考虑的事情,饱暖之后各种忧虑和焦躁的事情可以化作各种思考,用于填满本书,作为同病相怜者证明自己不再孤独的弹药,一旦物质状态不能满足,则书中的内容立即退化到可有可无的状态。

真的,我这两三年来,刷牙沉思录这种哗众取宠的段子写了不少,缺少深度的技术文章也写过几篇,以吃饱了撑着来进行衡量的话,还真的比较符合标准,如果加以艺术润色的话,真难说能不能包装成为一本具备贩卖价值的书,至少想到这个问题之后,被自己震惊了一下,进一步对人生需求的几个层次有了切身认识。

无论我再怎么黑自己,有一点是不会改变,我写的那些东西至少保留了我一部分的回忆,它们记载了我在某一段时期内的心智情况,无论是用词还是造句,都能从一个侧面反映我当时的状态。而我的人生正是由若干个这样的状态所组成,随着年龄的增长,我的记忆力会越来越差,如果能够多记录一些东西下来,就算是那种吃饱了撑着才能思考的问题,也将使未来的我读起来热泪盈眶。

不过信息世界的问题在于,资料保存的永久性很不靠谱,说不定哪天这些信息就不在了(我写在msn空间的博客一篇也没了),甚至安全性还比不了一个纸质的笔记本,但我仍然不做过多的努力和担忧,倘若保存良好,那就作为未来回忆的佐料,倘若不幸丢失了,那就随他去吧。因为在写这些东西的同时,我已经感受一次生活了,本来也是留不住的东西,事如春梦了无痕嘛。

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\344\275\277\347\224\250vs2008\347\274\226\350\257\221mongodb/index.html" "b/p/\344\275\277\347\224\250vs2008\347\274\226\350\257\221mongodb/index.html" new file mode 100644 index 000000000..b6e380f9f --- /dev/null +++ "b/p/\344\275\277\347\224\250vs2008\347\274\226\350\257\221mongodb/index.html" @@ -0,0 +1,73 @@ +使用vs2008编译mongodb

使用vs2008编译mongodb

背景问题

mongodb在windwos下的官方编译包是使用vs2010编译的,从官网上下载的源代码在vs2008环境下不能直接编译通过,因为mongodb提供的相关配置文件是针对vs2010的,可能是因为mongodb最新的代码使用了部分C++11的特性,而vs2008没有提供对C++11支持的原因。可是我们在一个具体的项目上需要在vs2008环境下使用mongodb,只好通过手工修改部分配置和代码的办法完成编译。

环境准备

mongodb是使用scons进行编译控制的,所以在进行以下编译之前需要安装并配置好如下环境:

python2.7

官方建议是安装python2.7版本,而且要在环境变量PATH中加入python的安装路径和python/scripts的路径,以便在命令行中执行python脚本。 +不过我在编译的时候使用的是python2.6版本,也没有发现问题

scons

  • 直接去网上下载最新版本进行安装即可。

vs2008

  • 需要安装vc++的全部组件(主要是默认安装不带amd64的编译支持),如果只需要编译32位版本的话则可以忽略此条。
  • 需要安装sp1补丁,否则会在编译时报错。

boost库

  • 最好使用boost1.4.9版本,去官网上下载对应的源码包然后自己在vs2008的命令行环境下编译

  • 编译boost的命令如下(只编译了所需库):

     bjam stage variant=debug  --with-filesystem --with-thread --with-date_time --with-program_options --layout=versioned threading=multi toolset=msvc-10.0 --build-type=complete
    +

如果需要编译release版本,就把variant的选项改为release,如果需要编译64位的版本,就在以上命令中加入address-model=64

配置及代码修改

SConstruct文件修改

SConstruct文件用于存放scons的关键配置信息,我们为了在vs2008下编译mongodb首先要做的就是修改mongodb源码下根目录的SConstruct文件。

  • 修改env配置,找到 evn = Environment

     env = Environment( BUILD_DIR=variantDir,
    +            CLIENT_ARCHIVE='${CLIENT_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}',
    +            CLIENT_DIST_BASENAME=get_option('client-dist-basename'),
    +            CLIENT_LICENSE='#distsrc/client/LICENSE.txt',
    +            CLIENT_SCONSTRUCT='#distsrc/client/SConstruct',
    +            DIST_ARCHIVE_SUFFIX='.tgz',
    +            EXTRAPATH=get_option("extrapath"),
    +            MODULE_BANNERS=[],
    +            MODULETEST_ALIAS='moduletests',
    +            MODULETEST_LIST='#build/moduletests.txt',
    +            MSVS_ARCH=msarch ,
    +            PYTHON=utils.find_python(),
    +            SERVER_ARCHIVE='${SERVER_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}',
    +            TARGET_ARCH=msarch ,
    +            tools=["default", "gch", "jsheader", "mergelib", "unittest"],
    +            UNITTEST_ALIAS='unittests',
    +            UNITTEST_LIST='#build/unittests.txt',
    +            PYSYSPLATFORM=os.sys.platform,
    +
    +            PCRE_VERSION='8.30',
    +            CONFIGUREDIR = '#' + scons_data_dir + '/sconf_temp',
    +            CONFIGURELOG = '#' + scons_data_dir + '/config.log'
    +            )
    +

在Environment里追加一条 MSVC_VERSION='9.0',这是因为如果机器上有其他的编译环境,比如vs2010或vs2012,scons会自动使用他们的编译器进行编译,即使你是在vs2008的命令行环境下,我最初因为此问题困扰了很久,后来才只得强制指定编译器的版本,修改完成后如下:

env = Environment( BUILD_DIR=variantDir,
+               CLIENT_ARCHIVE='${CLIENT_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}',
+               CLIENT_DIST_BASENAME=get_option('client-dist-basename'),
+               CLIENT_LICENSE='#distsrc/client/LICENSE.txt',
+               CLIENT_SCONSTRUCT='#distsrc/client/SConstruct',
+               DIST_ARCHIVE_SUFFIX='.tgz',
+               EXTRAPATH=get_option("extrapath"),
+               MODULE_BANNERS=[],
+               MODULETEST_ALIAS='moduletests',
+               MODULETEST_LIST='#build/moduletests.txt',
+               MSVS_ARCH=msarch ,
+               PYTHON=utils.find_python(),
+               SERVER_ARCHIVE='${SERVER_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}',
+               TARGET_ARCH=msarch ,
+               tools=["default", "gch", "jsheader", "mergelib", "unittest"],
+               UNITTEST_ALIAS='unittests',
+               UNITTEST_LIST='#build/unittests.txt',
+               PYSYSPLATFORM=os.sys.platform,
+
+               PCRE_VERSION='8.30',
+               CONFIGUREDIR = '#' + scons_data_dir + '/sconf_temp',
+               CONFIGURELOG = '#' + scons_data_dir + '/config.log',
+								 MSVC_VERSION = '9.0'
+               )
+
  • 给编译器搜索路径增加你自己本地的boost库路径 +因为在编译时需要用到boost库,所以需要把你在本地的boost所在目录加入scons的环境,否则会报找不到boost头文件或链接库的错误,打开Sconstruct文件直接在最后加入如下代码

    env.Append(CPPPATH=[“d:/thirdlib/boost_1_49_0”, “d:/thirdlib/boost_1_49_0/boost/tr1”], LIBPATH=[“d:/thridlib/boost_1_49_0/stage/lib”])

     *你在编译时需要将路径替换成你自己的*
    +

准备stdint.h

  • 去这个地址https://msinttypes.googlecode.com/files/msinttypes-r26.zip下载msinttypes,将压缩包里的stdint.h解压并复制到 C:\Program Files\Microsoft Visual Studio 9.0\VC\include 目录
  • 修改mongodb源码目录下platform下的cstdint.h,将#include<cstdint>修改为#include<stdint.h>,将#define _MONGO_STDINT_NAMESPACE std这一行里的std注释掉,变成#define _MONGO_STDINT_NAMESPACE /*std*/
  • 修改mongodb源码目录下util下的time_support.h,在文件开头加入#include<stdint.h>,否则在编译这个文件时会无法识别int64_t类型

修改windows_basic.h

  • 修改mongodb源码目录下platform下的windows_basic.h,
  • #if !defined(NTDDI_WINXPSP3) || (NTDDI_VERSION < NTDDI_WINXPSP3) 之前加入 #define NTDDI_WINXPSP3 0x05010300#if !defined(NTDDI_WS03SP2) || (NTDDI_VERSION < NTDDI_WS03SP2)之前加入#define NTDDI_WS03SP2 0x05020200 否则会报 “32 bit mongo does not support Windows versions older than XP Service Pack 3” 和"64 bit mongo does not support Windows versions older than Windows Server 2003 SP 2" 错误

修改listen.cpp和sock.cpp

  • 修改util下net下listen.cpp,在#include段之后加入如下代码

     #ifdef _WIN32
    + #define EADDRINUSE WSAEADDRINUSE
    + #define ECONNABORTED WSAECONNABORTED
    + #define EBADF           9
    + #define ENFILE          23
    + #define EMFILE          24
    + #endif
    +
  • 修改util下net下sock.cpp,在#include段之后加入如下代码

     #ifdef _WIN32
    + #define EAGAIN          11
    + #endif
    +

开始编译

环境准备好之后,编译就比较简单了,打开vs2008命令行窗口,执行如下代码即可完成编译 +scons --dd --32 mongoclient.lib

如果是编译release版本,就把–dd换成–release,如果是编译64位版本,就把–32换成–64

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-21-16-10-50.png" "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-21-16-10-50.png" new file mode 100644 index 000000000..89ad39e8a Binary files /dev/null and "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-21-16-10-50.png" differ diff --git "a/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-21-16-10-50_hud71083d89a6fcf582c5ec86c790cb99f_29027_120x120_fill_box_smart1_3.png" "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-21-16-10-50_hud71083d89a6fcf582c5ec86c790cb99f_29027_120x120_fill_box_smart1_3.png" new file mode 100644 index 000000000..917fd1695 Binary files /dev/null and "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-21-16-10-50_hud71083d89a6fcf582c5ec86c790cb99f_29027_120x120_fill_box_smart1_3.png" differ diff --git "a/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-21-16-10-50_hud71083d89a6fcf582c5ec86c790cb99f_29027_1600x0_resize_box_3.png" "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-21-16-10-50_hud71083d89a6fcf582c5ec86c790cb99f_29027_1600x0_resize_box_3.png" new file mode 100644 index 000000000..93bf128b3 Binary files /dev/null and "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-21-16-10-50_hud71083d89a6fcf582c5ec86c790cb99f_29027_1600x0_resize_box_3.png" differ diff --git "a/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-21-16-10-50_hud71083d89a6fcf582c5ec86c790cb99f_29027_800x0_resize_box_3.png" "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-21-16-10-50_hud71083d89a6fcf582c5ec86c790cb99f_29027_800x0_resize_box_3.png" new file mode 100644 index 000000000..018038488 Binary files /dev/null and "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-21-16-10-50_hud71083d89a6fcf582c5ec86c790cb99f_29027_800x0_resize_box_3.png" differ diff --git "a/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-21-16-20-10.png" "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-21-16-20-10.png" new file mode 100644 index 000000000..4d389879f Binary files /dev/null and "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-21-16-20-10.png" differ diff --git "a/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-21-16-46-36.png" "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-21-16-46-36.png" new file mode 100644 index 000000000..d19b79cb5 Binary files /dev/null and "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-21-16-46-36.png" differ diff --git "a/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-22-10-40-58.png" "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-22-10-40-58.png" new file mode 100644 index 000000000..901ce7cff Binary files /dev/null and "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-22-10-40-58.png" differ diff --git "a/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-22-10-45-54.png" "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-22-10-45-54.png" new file mode 100644 index 000000000..829845c6a Binary files /dev/null and "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-22-10-45-54.png" differ diff --git "a/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-22-10-47-57.png" "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-22-10-47-57.png" new file mode 100644 index 000000000..219277f03 Binary files /dev/null and "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-22-10-47-57.png" differ diff --git "a/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-22-10-53-02.png" "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-22-10-53-02.png" new file mode 100644 index 000000000..5993f8e8d Binary files /dev/null and "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-22-10-53-02.png" differ diff --git "a/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-22-11-07-46.png" "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-22-11-07-46.png" new file mode 100644 index 000000000..e58399ef6 Binary files /dev/null and "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-22-11-07-46.png" differ diff --git "a/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-22-11-17-49.png" "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-22-11-17-49.png" new file mode 100644 index 000000000..d8b426dc9 Binary files /dev/null and "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-22-11-17-49.png" differ diff --git "a/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-22-11-31-26.png" "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-22-11-31-26.png" new file mode 100644 index 000000000..f5206c547 Binary files /dev/null and "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/2023-09-22-11-31-26.png" differ diff --git "a/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/index.html" "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/index.html" new file mode 100644 index 000000000..233d4d572 --- /dev/null +++ "b/p/\345\237\272\344\272\216-github-pages-\346\234\215\345\212\241\346\220\255\345\273\272\344\270\252\344\272\272\345\215\232\345\256\242/index.html" @@ -0,0 +1,37 @@ +基于 Github Pages 服务搭建个人博客
Featured image of post 基于 Github Pages 服务搭建个人博客

基于 Github Pages 服务搭建个人博客

背景

搭建独立博客网站的方法多种多样,常见的方法包括租用服务器自行架设,或者选择托管服务商提供的博客发布服务。

但是上述两种方式都会产生一定的费用,对于非盈利网站而言,不太友好。

经过多年的实践,现在已有越来越多的人选择了使用免费且易用的 GitHub Pages 服务来搭建个人博客。

然而,现有的使用教程大多侧重于操作步骤,对于新手或非专业人士而言,难以真正理解其中原理。

他们可能看到别人的博客既漂亮又实用,却在自己尝试搭建时屡屡遇到挫折,逐渐失去信心。

这无疑会打击那些希望通过博客持续创作文字、并且希望能够免费建立个性化站点的人的积极性。

本文将介绍如何使用 GitHub Pages 服务搭建免费的个人博客网站,及其背后的实现原理,以帮助初学者顺利建立自己理想的博客站点。

需要预先掌握的技能和前置条件

需要先了解这些再往下阅读本文

  • 了解 Git 的概念和常用的操作,知道“分支”、“提交”、“推送”、“拉取”等概念。
  • 拥有 Github 账号,并且能够独立完成“仓库创建”、“本地克隆”、“提交”、“推送”等操作。
  • 了解“博客”本身只是一种“网站”:其内容由若干“网页”组成,读者通过浏览器访问博客网站所在的服务器以获取这些网页内容。

核心思路

+简单来说,核心步骤只有三步:内容编辑、页面生成、网站发布。接下来的介绍均围绕这三件事展开。

内容编辑

作者编写和编辑博客内容,包括编写文章、给文章配图、给文章归类等等活动都属于内容编辑。

页面生成

如果希望将内容变成可发布的网站,则需要使用专用的软件工具(一般为静态网站生成器)将编辑的内容自动生成可供浏览器显示的博客网站页面。

网站发布

有了网站页面,还只是一堆存放在本地的文件。若要放到互联网上进行访问,还需要一个服务器提供服务,将网站发布。

如果采用独立建站的方式,这一步骤会涉及大量技术工作,比如服务器采购、Web服务应用程序安装、域名映射、SSL 安全证书、网络防火墙配置等等。

但我们今天选择使用 Github 提供的 Pages 服务,这将大大降低上述操作的难度,很多技术细节将不必再多关注,已经由 Pages 服务默认配置好。我们只需享用配置好的环境即可。

技术路线

Github Pages

Github 本来是一个 Git 仓库托管服务商,帮助用户进行项目代码及数字资料的版本管理。不过随着用户规模提升,Github 也围绕版本管理提供了更多的辅助服务,这其中就包括 Pages 服务

GitHub Pages 是一项静态站点托管服务,它直接从 GitHub 上的仓库获取 HTML、CSS 和 JavaScript 文件,(可选)通过构建过程运行文件,然后发布网站。 可以在 GitHub Pages 示例集合中看到 GitHub Pages 站点的示例。

Pages 服务原本用于帮助托管在 Github 上的开源项目更便捷地发布自己的宣传页面。开发团队可以简单编写几个静态页面(HTML)然后放在托管的 Git 仓库中,由 Github 将这些页面以网站服务的方式发布出去,Github 既提供了服务器资源也提供了用于公网访问的专属 URL 地址。

关于发布网站的专属 URL 地址的提供规则,Github 官方的介绍如下:

若要发布用户站点,必须创建名为 <username>.github.io 的个人帐户拥有的存储库。 若要发布组织站点,必须创建名为 <organization>.github.io 的组织帐户拥有的存储库。 除非使用的是自定义域,否则用户和组织站点在 http(s)://<username>.github.iohttp(s)://<organization>.github.io 中可用。 +项目站点的源文件与其项目存储在同一个仓库中。 除非使用的是自定义域,否则项目站点在 http(s)://<username>.github.io/<repository>http(s)://<organization>.github.io/<repository> 中可用。

根据官方介绍,Pages 提供有三种不同的网站发布服务:用户站点、组织站点、项目站点。

分别对应了“制作个人网站”、“制作团队组织网站”、“制作单个项目网站”的不同需求。

针对个人博客的搭建,很显然使用 Pages 服务发布“用户站点”是最合适的选择。

对于“用户站点”,Pages 最终会为用户提供的专属 URL 地址为:https://你的用户名.github.io,也就是说在 Gihtub 的一级域名 https://github.io 下给你免费提供了一个二级域名。之所以默认使用你的 Github 用户名,是因为要防止不同用户发布的地址重名导致冲突。

按照官方介绍,你也可以使用自己购买的域名,通过自己的域名进行访问。不过这涉及到更复杂的话题和操作,不在本文讨论范畴。

了解了以上基本信息后,在使用 Pages 服务时,可按照复杂度区分,采用如下几种不同的用法。

最简单直接的使用流程
  1. 手工编写 HTML 页面文件(需要掌握网页制作知识)。
  2. 将页面文件推送到的 Github 仓库,对于“用户站点”来说,这个仓库的命名必须为“你的用户名.github.io”。
  3. 在 Github 中设置该仓库的 Pages 服务配置,主要是选择仓库的指定“分支”用于 Pages 服务获取待发布的网页文件。
  4. Github 会按照上面介绍的规则给你提供一个 URL 访问地址(https://你的用户名.github.io),使用浏览器打开该地址即可访问到发布的网站了。

注:如果不理解 Git 仓库的“分支”概念,可以把它视为同一个仓库里不同的存储位置,不同的“分支”里面存储了不同的文件内容。

这个流程仅适用于非常简单网站发布,比如只包含有一个页面,因为手工编写 HTML 页面的效率十分低下,且不利于持续更新维护。

于是大家常用的方式是,使用一种叫做的东西,对于“博客”这类以静态页面为主的网站,十分适合。

“静态站点生成器”可以理解为是一个“翻译”,它能自动将你编写的文本内容根据预先的配置信息,自动生成一个完整的网站所需的全部文件(HTML、JS、CSS等)。

于是有了如下的改进流程:

改进的使用流程
  1. 用户编辑好博客内容,形成保存在本地计算机的原始文档文件。
  2. 使用静态网站生成器将本地原始文档文件生成静态页面文件。
  3. 将静态页面文件推送到 Github 远端托管仓库。
  4. Github Pages 服务自动被触发,将静态页面以网站形式发布出来。
  5. 用户通过指定 URL 地址访问已发布的博客内容。

到目前为止,已经可以较为流畅地执行博客编辑、生成、发布的工作流程了。

但是这个流程里有个前置条件,作者必须在本地电脑上安装一个“静态站点生成器”,以用于输出转换后的、可供发布的页面。

所以,为了方便,Github 提供了一个默认的静态网站生成器,上述第 2 步操作实际上可以在远端仓库自动执行,这样用户只需将原始文件上传至远端仓库即可,由 Github 直接在线上完成静态页面的生成和网站发布工作。

静态站点生成器的选择

比较常见的静态站点生成器有:JekyllHexoHugo 这三个。不在这里详细介绍了,因为功能都大同小异。在选定一个之后,需要去他们的官网查看文档以了解具体的使用细节,以便对自己的博客站点能够做到更深的定制。

我在接下来的操作步骤里,选择使用 Hugo 这个生成器。

主要原因是,Hugo 提供有相对来说比较美观的免费主题风格模板(Jekyll 也有漂亮的,但是收费。Hexo 的定制性很强,适合有网页开发能力的人自己开发主题)。

我选择的主题模板是:hugo-theme-stack

操作步骤

建立 Github 仓库

  1. 点击这个超链接进入 hugo-theme-stack-starter 的 Git 仓库模板
  2. 点击页面中的“使用此模板”按钮,以创建你自己的仓库(注意:需先登录自己的账号才能创建)。 +
  3. 建立好仓库(注意仓库命名为你的用户名.github.io)之后,会自动带有仓库模板的初始文件。 +

修改配置

  1. 将仓库下载到本地。
  2. 打开仓库里的 config 文件夹,里面存放有配置信息。
  3. 按照 hugo-theme-stack 的官方文档配置自己想要的效果(默认一般都够用,重点是修改自己的站点信息,如显示名称、URL 链接地址等等)。 + +这些配置主要在 config.tomlparams.toml 两个文件里。

编写博客文章

生成器会默认去仓库的 content/post/ 文件夹下扫描其下面的所有文件夹和文件,遇到约定格式的 Markdown 文件就会转换成为可发布的 html 页面。具体约定可以查看官方的详细文档,这里介绍一种最简单的写一篇文章的过程。

  1. 在 post 目录下新建一个文件夹用于存放文章的 Markdown 文件和插图文件,文件夹命名为希望编写的标题如:2023-09-21-怎样搭建个人博客我个人习惯将不同年份的文章在post目录下再建一级目录按照日期或年份进行区分。
  2. 在刚建立的文件夹下新建名称为index.md的 Markdown 文件,文件名必须为 index.md 这是由 hugo 生成器约定的。
  3. 在刚建立的 Markdown 文件的头部添加必要的元信息(非常关键)。
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +9
    +
      ---
    +  title: 文章标题
    +  date: 2023-09-21
    +  categories:
    +    - 文章所属分类
    +  tags:
    +    - 文章标签 1
    +    - 文章标签 2
    +  ---
    +
  4. 编写文章内容。可以使用 Markdown 的语法随意定义格式,以及插入图片。插入的图片建议保存在同级目录(也就是刚才新建的那个)中。

推送到仓库及发布

  1. 将刚才修改配置文件保存。
  2. 将刚才编写的博客文章保存。
  3. 在本地提交 commit 并 push 到 Github 仓库。
  4. 稍等几分钟(给 Github 那端的 Hugo 生成器留出运行时间)。
  5. 在 Github 仓库的 “setting” 设置页面开启 Pages 服务(只需第一次)。
  6. 在 Pages 设置界面里的 Source 中选择 “Deploy from a branch” ,并在下面的分支选择下拉框中选择 “gh-pages”,保存。 +

访问你的博客站点

一般稍等几分钟之后,即可按照约定网址访问刚发布的内容了。 +

扩展阅读

运营自己的博客网站所需了解的概念和知识相对比较多,如果希望将自己的网站做的更加精美、有特色。

除了能够持续产出高质量内容之外,建议阅读以下文章以了解相关知识:

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\345\237\272\344\272\216markdown\346\240\274\345\274\217\347\232\204\347\237\245\350\257\206\347\256\241\347\220\206\345\260\235\350\257\225\350\256\241\345\210\222/index.html" "b/p/\345\237\272\344\272\216markdown\346\240\274\345\274\217\347\232\204\347\237\245\350\257\206\347\256\241\347\220\206\345\260\235\350\257\225\350\256\241\345\210\222/index.html" new file mode 100644 index 000000000..01ea7f9c4 --- /dev/null +++ "b/p/\345\237\272\344\272\216markdown\346\240\274\345\274\217\347\232\204\347\237\245\350\257\206\347\256\241\347\220\206\345\260\235\350\257\225\350\256\241\345\210\222/index.html" @@ -0,0 +1,10 @@ +基于Markdown格式的知识管理尝试计划

基于Markdown格式的知识管理尝试计划

背景

  • 之前一直有收藏文章并整理自己知识体系的习惯,使用的工具是evernote(印象笔记),十多年来收集数百篇网络文章,自己整理并编写笔记若干篇,已做到目录和标签的基本分类;
  • 之前也有通过每日编写一个markdown文件来记录工作日志、零星日记的习惯,有心得感悟时都直接在工作日志中随手写入,保存起来;
  • 通过github pages写过一些个人博客文章,更新频率不高,主要作为个人笔记在使用;
  • 当前问题如下:
    • evernote用户体验逐年下降,对设备限制较多,且内容存在云端、格式封闭,个人掌控感较差,数据有无法访问的风险;
    • 工作日志中散落的心得感悟没有索引,基本埋没在以日期命名的文件里,不成体系;
    • 收集的数百篇网络文章基本没有进行消化阅读,未形成自己理解的内容;

目标

  • 为网络收藏和个人产出的文章建立索引,把之前的“仓库”形成“体系”;
  • 从evernote中迁移出来,所有数据放在本地,并通过在线网盘进行同步;
  • 以纯文本+附件资源作为载体,避免对一种编辑器或工具产生过度依赖;

工具选择

  • Obsidian,用于建立最基本的知识仓库,编辑自己的知识卡片,并充分利用它的双向链接功能将收藏的文章和自己输出的内容形成体系连接起来;
  • vscode, 用于编辑技术文章、工作日志以及基于插件进行绘图,最终输出内容到Obsidian文件库中;
  • 360网盘,用于在线实时同步存储Markdown的文件夹,任何具有同步文件功能的网盘均可;

具体计划

  • 整理文章目录:按照文章来源(网络、书籍、心得)、知识层面(技术、生活、哲学)等进行分类,形成树状目录结构;
  • 整理文章标签:每篇文章虽然只属于一个目录,但是可以有多个标签,提升了检索文章的维度。目录作为知识体系的骨架分类,标签则是详细划分(如技能相关的标签就可以有:编程、绘画、音乐、写作,并还能进一步细分);
  • 参考少数派文章玩转 Obsidian 01:打造知识循环利器提到的Zettelkasten笔记法逐步整理多年积累的知识形成以“知识卡”(其实就是具有互相链接关系的Markdown文件)为单位的知识;
  • [[玩转 Obsidian 01:打造知识循环利器 - 少数派]]
  • 阅读整理多年收集的知识文章,按照大约每周一篇的节奏,产出自己理解后的知识卡片,形成“知识循环”;
  • 如此往复若干时间,不断完善这个体系,工具可更换,载体亦可更换,唯独不变的是探索、求知的心;
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\345\260\221\346\234\211\344\272\272\350\265\260\347\232\204\350\267\257\350\257\273\344\271\246\347\254\224\350\256\260/index.html" "b/p/\345\260\221\346\234\211\344\272\272\350\265\260\347\232\204\350\267\257\350\257\273\344\271\246\347\254\224\350\256\260/index.html" new file mode 100644 index 000000000..1d1149112 --- /dev/null +++ "b/p/\345\260\221\346\234\211\344\272\272\350\265\260\347\232\204\350\267\257\350\257\273\344\271\246\347\254\224\350\256\260/index.html" @@ -0,0 +1,11 @@ +《少有人走的路》读书笔记

《少有人走的路》读书笔记

简介

《少有人走的路-心智成熟的旅程》这本书据说是畅销多年,经久不衰,在豆瓣上评分很高。不少人纷纷表示此书给自己带来了很多思考和感悟。我是在今年第二遍阅读了此书,之前大约十年前草草看过一遍,印象不够深刻。但今年再读,书中就有很多文字能够读进去了。虽然作者本身对“爱”的定义和解读我并不完全认同,以及作者也许受宗教信仰的影响,在某些观点上有一定的倾向,但都不妨碍这本书给我带来震撼。

笔记

人生苦难重重。

开篇就表达了最基本的设定,让我闭上本来想要抱怨的嘴,不得不跟着往后翻看有没有可以解决的答案。

解决人生问题的关键在于自律。人若缺少自律,就不可能解决任何麻烦和问题。在某些方面自律,只能解决某些问题,全面的自律才能解决人生所有的问题。

在认真看本书之前,我对“自律”的理解还仅限于在生活上严格要求自己,作息规律、遵守诺言、办事靠谱、简约不浪费。但作者显然不仅仅是这个意思,否则也用不着用很大的篇幅来说“自律”。

看一下作者对“自律”的定义。

所谓自律,就是主动要求自己以积极的态度去承受痛苦,解决问题。自律有四个原则:推迟满足感、承担责任、忠于事实、保持平衡。

只有不回避问题、以积极的心态去解决问题,才算作是自律。即便在生活中早睡早起、刻苦读书、勤奋工作,如果遇到问题首先想要逃避,那就不能算是自律。很惭愧,我之前在不少问题上都是以拖延为主要处理方式,本质上还是无法承受或者面对解决问题可能带来的痛苦,那么在读了本书之后,我会有意识地去改变做事原则,就拿上周来说,我终于鼓起勇气去诊所看牙,解决了拖了很久的牙结石问题(虽然智齿还没解决)。

推迟满足感,就是不贪图暂时的安逸,先苦后甜,重新设置人生快乐与痛苦的次序:首先,面对问题并感受痛苦;然后,解决问题并享受更大的快乐。在充满问题和痛苦的人生中,推迟满足感是唯一可行的生活方式。

这个话题不仅仅是在本书中提到过,据说有心理学家做过试验,在一群孩子里面寻找具有“推迟满足感”倾向的人(比如能够先忍住不吃巧克力以获取更大的奖励),结果证明这样的人在后续的生活中取得成功的概率要远高于先吃巧克力的人。本书首先强调这个话题,将其作为自律中的第一个原则,我想是因为道理都是相通的吧。很久之前我看过一篇讲解时间管理的文章,里面提到在规划一天的工作时,优先处理最难的那件事(文章中称“先吃掉那只青蛙”),然后当前的工作会越来越简单,这样的方式跟本书中作者所提倡的“推迟满足感”异曲同工。尽可能的正面问题、提早感受解决问题的痛苦,正是执行自律的首要原则。

不能及时解决自己面临的问题,这些问题就会像山一样横亘在我们心中,阻碍心灵的成长和心智的成熟。很多人显然忽略了这个道理。我们必须面对属于自己的问题,这是解决问题的基本前提。 +指望别人解决自己的问题,也不是明智之举。唯一的办法–我们应该勇敢地说:“这是我的问题,要由我来解决!”

这就牵出了第二个原则–“承担责任”。逃避问题会自然而然的推卸责任,认为这不是自己的问题,始终对于自己扮演的角色缺少清晰的认知。不过作者提到了两种情况“神经官能症”和“人格失调症”,前者属于给自己强加责任,后者属于推卸责任。这么说来,我可能有前者的倾向,很多压力都来源于此。不过作者也提到在复杂的人生道路上,判断自己该为什么事和什么人负责,这是一个永远存在的难题。

还有一种情况是,在有些事情上强加给自己责任,在有些事情上又没有意识到是自己的责任。读到这些章节的时候,我也在反思,当我一旦开始想要抱怨的时候,其实已经陷入“人格失调”和“神经官能”的边缘,要时刻提醒自己,不断评估自己的责任。

忠于事实是自律的第三条原则。如果我们追求健康的生活和心智的成熟,那我们就要坚定不移地遵循这条原则。我们需要实事求是,杜绝虚假。我们越是了解事实,处理问题就越是得心应手。逃避现实的痛苦是人类的天性,只有通过自律,我们才能逐渐克服现实的痛苦,及时修改自己的地图,逐步成长。我们必须忠于事实,尽管这会带来暂时的痛苦,但远比沉湎于虚假的舒适中要好。我们必须忍受暂时的不适感,追求事实而不是假象,并承受这一过程的痛苦。

这让我想到了“诚实”,不仅限于不撒谎(这一点实在是难以做到)。但我很快意识到作者所说的忠于事实比不撒谎更重要的是,面对事实,不可活在自己的想象里。虽然我们每个人都有自己的成见,看事情也很难看到全貌,但是不可做不基于事实的幻想,期望问题会自行消失、期望不付出努力就能得到回报。

你既要承担责任学会推迟满足感,先苦后甜,把眼光放长远,同时又要尽可能过好当前的生活,让人生的快乐多于痛苦。

这就是“保持平衡”,应该是一种“拿捏”吧。为了保持平衡,作者建议,适当的选择“放弃”。包括放弃过时的观念、习惯。王小波在小说中写道:“人生就是一个缓慢被捶的过程。。。”,如果不能适时的放弃一些东西,那很显然这个过程是相当痛苦的。

先写这么多。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\345\255\246\344\271\240\347\232\204\345\255\246\344\271\240\345\207\206\345\244\207/index.html" "b/p/\346\234\272\345\231\250\345\255\246\344\271\240\347\232\204\345\255\246\344\271\240\345\207\206\345\244\207/index.html" new file mode 100644 index 000000000..2d1b8112b --- /dev/null +++ "b/p/\346\234\272\345\231\250\345\255\246\344\271\240\347\232\204\345\255\246\344\271\240\345\207\206\345\244\207/index.html" @@ -0,0 +1,10 @@ +机器学习的学习准备

机器学习的学习准备

机器学习的概念

机器学习是人工智能的一个分支,是近年来逐渐具备实用性的各种人工智能应用的基础。其本质是(我目前的个人理解)利用针对已知的数据集合抽取采样特征,然后利用某种数据模型(核心是某种算法:如kNN、SVM、朴素贝叶斯等)对数据进行计算处理,得到一组可以预测未知数据集特征的参数和手段,从而可以对数据进行预测判断的一种数据处理方法。

机器学习相关的名词

  • 神经网络:是机器学习的一种实现方式,从概念上来说,小于“机器学习”,但是由于其在图像识别、语音识别、语言翻译等领域的优异表现,以至于现在提到机器学习就认为是神经网络,实际则不然,机器学习的概念更大,更加基础,是实现神经网络应用的基础理论和方法;
  • 深度学习:是神经网络的应用特例,同样是在应用层表现优异,可以理解为神经网络的一种实现;
  • 大数据:机器学习的数据处理基础支撑,近年来机器学习在应用层面表现较好主要得益于大数据技术的发展,可以使得模型训练内容量级增加,极大的提高了模型准确度;
  • n维向量:来自线性代数,在机器学习中起到重要作用,在机器学习中一般用于各种特征数据的载体,在不同的算法过程中传递和计算。

机器学习相关的工具

  • 编程语言:目前比较流行的是Python,因为有比较丰富易用的程序包,很多科技公司也开源了较为成熟的框架,再加上Python语言本身的简单易上手,使得Python成为这个领域最流行的语言。当然C和C++、Java还是实现各种算法的根基,Python更多是提供了一种调用接口;
  • iPython:Python语言的交互控制台,可以较为方便的测试、调试Python程序,有较强的交互功能,比语言发行版自带的强大;
  • jupyter:提供Python语言的Web交互界面,通过网页即可编写代码,并及时反馈执行结果,由于是B/S架构,所以可以使得运行时跟开发环境分开。编辑界面同时支持基于Markdown语法的文档编写,使得“文学化”编程成为一种可能,非常适合用于科研人员的汇报材料或论文;
  • TensorFlow:谷歌开源的机器学习框架,快速灵活部署机器学习应用,可以应用与大规模、工业级场景;
  • keras:基于Python编写的高级神经网络API,属于对机器学习的深度封装,如果以学习机器学习原理为目标的,不建议使用,还是先手动将若干种核心算法实现一遍比较深刻;

预期的学习方法

  1. 通过阅读相关的书籍,对于概念有所了解,这个过程可以是粗糙的浏览,不求详细的理解各种原理和算法;
  2. 尝试一些教学视频,了解实操的基本流程,对于自己读书得到的概念进行验证,修订理解,并熟悉基本工具的使用(如Python的numpy、plot等);
  3. 细读书籍,按照书中的事例进行实操,并尝试推导算法的基本原理,理解后,形成自己的文字;
  4. 定义简单的任务,贯穿数据准备、数据清洗、特征值提取、模型建立、模型应用各个阶段,一般来说可以是手写文字识别,或者给新闻文章分类等;
  5. 循环和迭代这个过程,一边输入信息,一边将学到的东西结合思考,形成有效的输出(文字、视频等);
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-001-\346\234\237/2022-09-28-09-38-31.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-001-\346\234\237/2022-09-28-09-38-31.png" new file mode 100644 index 000000000..e38d303be Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-001-\346\234\237/2022-09-28-09-38-31.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-001-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-001-\346\234\237/index.html" new file mode 100644 index 000000000..e71be670f --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-001-\346\234\237/index.html" @@ -0,0 +1,10 @@ +机器文摘 第 001 期

机器文摘 第 001 期

机器文摘 第 001 期

机器文摘 第001期

搞机

TurnT是一个颇具创意的唱盘设计,它把智能手机与模拟黑胶的老式音乐播放方式相结合。用家把触笔放在手机屏幕显示的黑胶唱片上,它即开始播放。从内部结构上看,它其实是一个无线扬声器,可以连接到智能手机播放音乐。TurnT这种播放音乐的体验增加了互动的体验感,如同在实际的唱片上一样,挪开唱针会立即停止音乐,将其“向内”移动到手机屏幕上显示的光盘中心就可以播放音乐。要更改歌曲,您可以通过滑动来更改专辑,还可以重新定位。

动向

AI生成图像技术带来的“艺术危机”

近几周,基于AI生成的图像艺术作品的新闻越来越多,以DALL-E、Stable Diffusion等神经网络模型为代表的图像生成类AI进化越来越快,已达“以假乱真”程度。我也在动手尝试后惊叹他们的生成效果非常逼真和充满想象力。然而很快,此类AI就引起设计师、画师、艺术家的反对(恐慌?)。当然也有很多持积极态度,把它们当作工具加以利用,甚至不乏商业头脑灵活的人士,已经通过AI作画开始获取收益。于是引发了一系列的反应和讨论。

观点

程序员是计算机的翻译官。他们先是把人类的语言翻译成计算机的语言,现在又教会了计算机使用人类的语言。

长文

资源

  • coding-fonts ​​​是一个不错的编程字体网站,可以在线预览各种适合编程开发时用的字体,让选择更加直观。
  • 深度强化学习羊了个羊 这个github仓库开源了一个通过AI强化学习来玩耍“羊了个羊”游戏的模型及代码,结构清晰,效果很棒,用于了解深度强化学习知识非常不错。
  • 深度学习500问这本在线书籍以问答形式对常用的概率知识、线性代数、机器学习、深度学习、计算机视觉等热点问题进行阐述,目前在github将近50k颗星。

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-002-\346\234\237/2022-10-03-11-08-56.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-002-\346\234\237/2022-10-03-11-08-56.png" new file mode 100644 index 000000000..0c1f9d3cd Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-002-\346\234\237/2022-10-03-11-08-56.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-002-\346\234\237/2022-10-03-11-32-54.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-002-\346\234\237/2022-10-03-11-32-54.png" new file mode 100644 index 000000000..9d810e728 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-002-\346\234\237/2022-10-03-11-32-54.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-002-\346\234\237/2022-10-03-11-33-50.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-002-\346\234\237/2022-10-03-11-33-50.png" new file mode 100644 index 000000000..becf1ec16 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-002-\346\234\237/2022-10-03-11-33-50.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-002-\346\234\237/2022-10-03-11-41-32.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-002-\346\234\237/2022-10-03-11-41-32.png" new file mode 100644 index 000000000..eeab474bb Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-002-\346\234\237/2022-10-03-11-41-32.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-002-\346\234\237/2022-10-03-18-24-45.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-002-\346\234\237/2022-10-03-18-24-45.png" new file mode 100644 index 000000000..3db33faf1 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-002-\346\234\237/2022-10-03-18-24-45.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-002-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-002-\346\234\237/index.html" new file mode 100644 index 000000000..ad3a1d4b5 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-002-\346\234\237/index.html" @@ -0,0 +1,25 @@ +机器文摘 第 002 期

机器文摘 第 002 期

机器文摘 第 002 期

机器文摘 第002期

搞机

MNT推出了一款名叫Pocket Reform的迷你笔记本电脑。它外形紧凑(屏幕只有7英寸),但功能齐全,据官方介绍,它的性能满足轻量办公需求,甚至还能玩一些游戏(ARM平台)。虽然现在的智能手机在性能方面已经有了很大提升,且便携性远超笔记本电脑,但是还是有相当一部分人倾向于在具有真实物理键盘的“电脑”上进行操作。

在我看来,这台设备可能对于希望随时随地写两行代码的程序员更加具有吸引力。

动向

文字直接生成3D模型

+谷歌实验室的几个哥们上周发布了一个新作—-DreamFusion。输入文字,就能生成带深度图和法线的3D模型。

开发团队声称:

最近在文本到图像合成方面的突破是基于在数十亿个图像-文本对上训练的扩散模型。将这种方法应用于3D合成将需要标记大量的3D资产和用于对3D数据进行去噪的高效架构,而目前这都不太可行。在DreamFusion中,我们通过使用预先训练的2D文本到图像扩散模型来执行文本到3D合成来规避这些限制。我们的方法不需要3D训练数据,也不需要修改图像扩散模型,证明了预训练图像扩散模型作为先验的有效性。

具体方法据称是来自他们新提出的“一种通过优化损失函数从扩散模型中生成采样的方法”该方法允许他们在任意参数空间中优化采样(例如3D空间)。

我看了一下官方给出的demo,3D模型还略显粗糙,不过可能将来算力提升之后会有改善。

现在,除了插画师受到了职业威胁,就连3D建模工程师的工作也有可能被AI取代?

通过文字描述生成语音的人工智能也来了

Twitter 用户 Felix Kreuk 发布了从文本到音频 (Text to Audio) 的 AI 模型:AudioGen +AudioGen 可以 +(1) 根据文本生成音频;(2) 续写指定的音频;(3) 同时做以上两件事,根据指定文本描述生成指定音频。 +作者给出的展示DEMO里展示了如下文本生成的语音: +(1)在风声中吹口哨 +(2)男人在说话时伴有鸟和狗的叫声 +(3)警报器和嗡嗡作响的引擎接近后走远 +(4)鸽子咕咕叫并伴有沙沙的声音 +(5)男人说话的声音,背景伴有人群欢呼声

+从作者公布的架构图上可以看出来,采用的也是Transformer神经网络。之前在看到AI画图时我就想到同样的原理可能用于生成音频,结果这才没过几天,人家都已经做出来了。

观点

站桩的简单,枯燥和有效,就好比持有 sp500 指数基金简单,枯燥但足以秒杀 95%以上的基金经理一样。 +莫将容易得,便作等闲看。

长文

  • 为什么现在的软件这么慢(英文),作者在Windows系统(Windows 10, 21H2版本)下使用“录音机App”的时候获得了极差的体验(确切的说是软件启动后大概卡死了将近20秒)。于是动手分析到底是什么原因导致,然后发现主要是这个软件启动后疯狂扫描“用户”文件夹下的录音文件用于构建界面中的录音列表,这种密集IO操作导致软件停止响应。作者花了很大的篇幅来吐槽这种行为,对于微软工程师为什么这么做表示莫名其妙。不过由于我们现在的计算机大都使用了固态硬盘,而且我们的习惯一般不会在“用户”文件夹下存放太多文件,所以这个体验应该不太明显。但即使这样,我也同样对Windows系统现在的软件质量感到担忧。 +

  • 内卷、汉明问题与认知迭代(中文),作者较为科学地分析了内卷的定义和形态,从而引申出了关于什么是“人生中重要的事”的思考,文章虽然比较长,但也清晰易懂,发人深省。部分引用如下:

    从大的方面说,社会需要创新,个人则需要突破,而创新和突破又都要求我们不断地精益求精。那么,内卷与精益求精是本质上一样的吗?如果不是,两者的区别在哪?

    在某件事情上花费太多精力,并不一定就是内卷;在无关紧要的事情上花费精力才是真的内卷。

    汉明早年在贝尔实验室工作。那年春天,他经常和几位同事聚在一起在餐厅吃午饭。吃饭期间,他向其中一位叫Dave McCall的同事提了一个问题:“在你的领域里最重要的问题是什么?”大约一个星期后,再次一起午餐时他继续发问:“你目前正在研究的最重要的问题是什么?” 显然,这位同伴对于这两个问题的回答并不一样。于是他接着问:“如果你当前做的并不是最重要的事,那为什么还要一直花时间投入去做呢?”有了这「灵魂三问」之后,于是——在那个春天接下来的日子里,汉明不得不另找别的同伴一起吃午饭了…… +汉明的问题听起来有些让人生厌,但后来演变成了一个在学术界很受关注的问题——汉明问题(The Hamming Question)。它本来说的是科研选题的事情,但实际上关乎人生最重要的选择。

    内卷,指的是在低水平的状态下无实质意义的消耗。这里的「低水平」,可能是客观的,也可能是主观的。 +针对主观的低水平状态,我们需要冲破意识层面的障碍,同时把读书、实践和思考结合起来,反复迭代,这样才可能跃升到更高的认知层次上。 +而针对客观的低水平状态,唯有认真对待汉明问题,选择好真正重要的人生大方向,才能避免卷入那些无关紧要的、无谓的消耗中去。这才是真正考验大智慧的时候了。

资源

  • 每个程序员都需要知道的 ,整理了一份资源合集,包含了软件工程师技能相关的各类知识资源,包括算法、数据结构、浮点、Unicode、时间、内存、分布式、正则、安全、架构、工程哲学、实践、职业发展、软技能。。。等等,以及一些可用于技能训练和学习的站点。看起来非常符合我这种“收藏了就是学习了”的囤积爱好者的胃口。
  • Word Writer 6 6502汇编源码,是一份开源的Word Writer 6的6502汇编源码,可在模拟器下编译运行。用来学习6502汇编是一个不错的项目。上个世纪80年代爆火的计算机Commodore 64是很多复古计算机爱好者(包括我)的最爱,Word Writer 6是该平台上流行的文字排版编辑软件。
  • HTTP Archive的年度报告,这份报告详细(超级详细)分析了目前全球各在线网页中所使用的技术,从页面中的“CSS”、“Javascript”、“字体”以及用户体验中的“搜索引擎优化”、“移动端支持”等超过20个方面进行展示,内容十分详尽,有种看NBA的进球统计的感觉。
  • Javascript Quiz,一份关于Javascript的小测验,可在线作答,一共十道选择题,全是关于Js语法的常见坑,每道题答完之后都可以点击“info”图标获取关于这道题的详细解释。我试着做了一下,勉强及格。
  • Streams,这里有一批纯AI创作的音乐,由AI负责作曲和编曲,工程师只是把这些乐谱放入DAW软件中进行混音和录音,完成度很高,听起来相当上头。
  • 学习合成器,这个网站提供了一本交互式电子书,讲解了电子合成器的原理,还单独提供了一个交互页面用于调制和体验各种合成器音色。我尝试了一下,真的很直观,在页面中直接可以修改各种振荡器波形、滤波器、LFO等参数,非常适合用于音色合成入门。
  • 函数式编程指北,在线电子书,讲解函数式编程的范式,以Javascript进行举例,作者风趣幽默,深入浅出,觉得被函数编程概念唬住的可以去看看。

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-003-\346\234\237/2022-10-11-10-15-11.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-003-\346\234\237/2022-10-11-10-15-11.png" new file mode 100644 index 000000000..0cdeeba16 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-003-\346\234\237/2022-10-11-10-15-11.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-003-\346\234\237/2022-10-11-10-17-41.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-003-\346\234\237/2022-10-11-10-17-41.png" new file mode 100644 index 000000000..a6eba29f8 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-003-\346\234\237/2022-10-11-10-17-41.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-003-\346\234\237/2022-10-11-10-30-24.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-003-\346\234\237/2022-10-11-10-30-24.png" new file mode 100644 index 000000000..6838ff33a Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-003-\346\234\237/2022-10-11-10-30-24.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-003-\346\234\237/2022-10-11-10-45-39.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-003-\346\234\237/2022-10-11-10-45-39.png" new file mode 100644 index 000000000..74565a262 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-003-\346\234\237/2022-10-11-10-45-39.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-003-\346\234\237/2022-10-11-11-16-56.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-003-\346\234\237/2022-10-11-11-16-56.png" new file mode 100644 index 000000000..09aabe135 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-003-\346\234\237/2022-10-11-11-16-56.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-003-\346\234\237/2022-10-11-15-46-02.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-003-\346\234\237/2022-10-11-15-46-02.png" new file mode 100644 index 000000000..2050f0458 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-003-\346\234\237/2022-10-11-15-46-02.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-003-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-003-\346\234\237/index.html" new file mode 100644 index 000000000..69e379843 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-003-\346\234\237/index.html" @@ -0,0 +1,14 @@ +机器文摘 第 003 期

机器文摘 第 003 期

机器文摘 第 003 期

机器文摘 第003期

搞机

收听广播可以缓解压力(个人体会)

近期我找到一个缓解焦虑的新方法,听收音机。

一定要老式的那种,收听真正无线电波信号的。随便找个台,最好还带有滋滋啦啦的杂音,当作工作时的背景声音,听着听着就感觉无比的放松。但又不是简单的“粉红噪音”、“白噪音”带来的那种平静,这种“仿佛脱离现在、回到了某个时空”的感觉让人感到愉悦。

我还没找到相关的研究信息,有人知道原理吗?

动向

欧洲通过法案,将强制统一USB Type-C接口为充电接口

欧洲议会今天以压倒性多数投票赞成在2024年底之前将USB-C作为包括iPhone和AirPods在内的各种消费电子设备的通用充电端口。

这对于苹果来说恐怕是个坏消息,对于消费者来说应该是个好消息。不过也许以苹果公司的脾气,说不定将来取消所有物理接口也有可能。

波士顿动力承诺不将机器人武器化

当地时间 10 月 6 日消息,波士顿动力、Agility Robotics、ANYbotics 等 6 家公司联合发表致行业的公开信表达了他们对这些可能性的担忧。他们称,先进的商业化机器人的经济可负担性和可获得性越来越强,其被滥用的可能性也越来越大。我们承诺不会将通用机器人或软件武器化,也不会支持其他人这么做;同时呼吁政策制定者、开发者和用户共同促进安全使用。

我个人感觉此类声明并不会带来什么限制,相反地,我偏悲观的认为这种技术很可能以最优先的速度被应用于军事目的。

TAOCP(《The Art of Computer Programming》) 4B正式初版

+图片来自@算法时空

世界著名程序员——高德纳老师,日前在他的个人网站宣布了TAOCP 4B正式出版的消息。

这部计算机世界的经典巨著,耗费了高德纳老爷子的毕生心血,虽然已经出到了第四B卷,但本书目前还没有完全写完(本书从1962年开始写(中间停了几年是因为老爷子发现没有趁手的排版软件,就顺手发明了TEX——这又是另一个宏大话题了),计划共有七卷,其中第四卷分ABC三册)。他在自己主页中提到:

与此同时,我继续研究第3部分(第4C卷),它已经有许多令人兴奋的主题。

我只能说:祝老爷子身体健康!

WebAssembly技术发展的怎么样了?

WebAssembly 是一种运行在现代网络浏览器中的新型代码,并且提供新的性能特性和效果。它设计的目的不是为了手写代码而是为诸如 C、C++和 Rust 等低级源语言提供一个高效的编译目标。 +——来自Mozilla官方文档关于WebAssembly概念的介绍

WebAssembly技术号称可以在浏览器中高效执行代码,并可以很方便地将C、Rust等各种语言编译到浏览器中执行,那么目前他的使用体验如何?

我周末做了简单体验。

通过官方给出的文档和入门指南,可以很快速地搭建出程序的原型,上图就是我参考官方示例将Rust代码编译到网页中执行的效果(是一个经典的Game of life的小游戏)。

从开发上来说,现在已经有了比较成熟的工具链(尤其是针对Rust语言到WASM的工具),和共享库的生态,想要进行开发,不必像前些年那样费心地搭建开发环境,基本上在Linux系统下简单执行几行命令即可完成环境搭建。

从执行效果来说,我没有做性能测试,直观感受上来说,确实比原生js快了不少。

但这并不是重点,我个人觉得这项技术它最大的意义在于,将之前的桌面程序技术有了向Web移植的可行性。

我们有可能很快就看到完全兼顾Web分发的方便和桌面程序性能体验的产品。

观点

在你的密码里面放上一个逗号",",这样当你的密码在网上被人拖库时可以给黑客增加一些麻烦,因这样会使得他在作为csv文件往他的密码字典里面导入的时候,因为逗号分隔符的错位而让他崩溃。 +注:csv文件默认使用逗号分隔符区分字段。

  • 来自:佚名网友。

当你长期使用windows远程桌面进行远程办公时,一层一层的服务器登进去,时间长了就会陷入盗梦空间那种疑惑,我现在是在哪一层?

  • 来自:我自己。

量子计算机就是向过去和未来借用了很多乃至无限的时间吗?刹那即永恒。 +注:量子计算机号称每个bit位可在同一时刻表示多种状态。

  • 来自:我自己。

长文

从0到1打造家庭弱电方案

现在有不少人在困惑家里的网线该如何布局,这篇《从0到1打造家庭弱电方案》(中文)记录了作者完整的装修过程,内容十分精彩详尽。看完之后我有点儿后悔,当时装修时没有给各个房间拉上光纤,以及用了比较普通的超五类网线。

如何配置一个完全基于命令行窗口的开发环境

我在油管上关注了一个日本小哥(Takuya Matsuyama),是一个个人开发者,经常上传自己的开发过程录屏,他完全基于命令行窗口(控制台)进行开发,没使用任何IDE。

后来我参考他的配置文件给自己也配置了一套,使用fish作为shell,neovim加上各种插件作为主力编辑器,现已成为我的日常开发环境。

有条件的可以到他的主页看看关于如何配置的详细介绍,或者直接去他的github仓库获取配置文件。

云桌面并不像你想的那么好

给开发人员配置一个廉价的笔记本加上一个高性能的云端工作站,这个点子棒不棒?

听起来有很多的优势,兼具了性能、便携性、安全性等等。

不过先等一等,这里有一位作者在这样尝试了之后,给出了不少负面反馈(比如多显示器支持、GPU加速、网页视频质量等等问题),有兴趣的可以点进去看看。

资源

  • 从高中到大学,数学中常用符号和计算关系的英文名称,适合对数学公式中的各种符号感到困惑的人收藏,这本小册子汇聚了所有数学符号、常用希腊字母、代数式等英文叫法介绍。
  • 如何在Ubuntu下进行x86-x64汇编语言编程,一本讲解现代汇编语言的电子书,基于常用的Ubuntu系统,从认识汇编语言开始讲起,到工具链的准备和怎样编写和调试程序,都有详细的介绍。
  • DrawKit,一个提供矢量插画的网站,有很多免费的高质量插画,可用于网站制作、软件产品等方面。
  • 计算机教育中缺失的一课,一般学校里不会教开发环境的配置和各种效率工具的使用,这本电子书就是以环境和工具为切入点,将学校学习的理论应用于实际,比较接地气。

    大学里的计算机课程通常专注于讲授从操作系统到机器学习这些学院派的课程或主题,而对于如何精通工具这一主题则往往会留给学生自行探索。在这个系列课程中,我们讲授命令行、强大的文本编辑器的使用、使用版本控制系统提供的多种特性等等。学生在他们受教育阶段就会和这些工具朝夕相处(在他们的职业生涯中更是这样)。 因此,花时间打磨使用这些工具的能力并能够最终熟练地、流畅地使用它们是非常有必要的。

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-004-\346\234\237/2022-10-18-09-53-01.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-004-\346\234\237/2022-10-18-09-53-01.png" new file mode 100644 index 000000000..c4076d3ff Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-004-\346\234\237/2022-10-18-09-53-01.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-004-\346\234\237/2022-10-18-10-55-05.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-004-\346\234\237/2022-10-18-10-55-05.png" new file mode 100644 index 000000000..43c0c50be Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-004-\346\234\237/2022-10-18-10-55-05.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-004-\346\234\237/2022-10-18-10-56-50.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-004-\346\234\237/2022-10-18-10-56-50.png" new file mode 100644 index 000000000..caec18521 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-004-\346\234\237/2022-10-18-10-56-50.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-004-\346\234\237/2022-10-18-10-58-24.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-004-\346\234\237/2022-10-18-10-58-24.png" new file mode 100644 index 000000000..56ca167b0 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-004-\346\234\237/2022-10-18-10-58-24.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-004-\346\234\237/2022-10-18-14-04-11.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-004-\346\234\237/2022-10-18-14-04-11.png" new file mode 100644 index 000000000..d0522cb2c Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-004-\346\234\237/2022-10-18-14-04-11.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-004-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-004-\346\234\237/index.html" new file mode 100644 index 000000000..18329606f --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-004-\346\234\237/index.html" @@ -0,0 +1,16 @@ +机器文摘 第 004 期

机器文摘 第 004 期

机器文摘 第 004 期

机器文摘 第 004 期

搞机

美国德州仪器公司出品的TI图形计算器是一种既能计算又能作图的新型的数学使用工具,它具备符号代数系统、几何操作系统、数据分析系统等,可以直观地绘制各种图形,并进行动态演示、跟踪轨迹。

TI实体计算器的售价十分昂贵(相较于其他消费类计算器),这里有一个开源项目wabbitemu,使用C语言编写的一个TI计算器的模拟器,可以在电脑上运行并模拟TI计算器,支持多种型号,如TI-82、TI-83、TI-83-plus(需要加载对应的ROM)等。

甚至有人基于这个项目编译出了Android的版本,安装后手机秒变成高级科学计算器。

想进一步了解TI计算器的强大,可以看一下这篇文章《计算器与计算器游戏发展简史》

以上资源来自@Karen的日志

观点

社交媒体的正确使用方法: +一,不浪费一秒钟时间和知识结构相差太大的人去解释/讨论。你没有义务也没有这个精力。对任何不友好评论,迅速拉黑。 +二,通过公开展示你的思考,来寻找在知识结构,兴趣或技能上,可能与你产生互补作用,或者 1+1>2 的效应的朋友。公开展示长期留存的文字记录,效率最高。

来自@硅谷王川

长文

我是如何用21天刷完SICP

SICP 全称 Structure and Interpretation of Computer Programs,翻译过来叫《计算机程序的构造和解释》,是一本关于计算机程序设计的总体性观念的基础教科书,由麻省理工学院出版社与麦格罗希尔出版社共同出版营销。作者是麻省理工学院教授哈尔·阿伯尔森、杰拉德·杰伊·萨斯曼。

这本书是计算机编程领域非常经典的一本教科书,内容覆盖范围非常广泛,从编程入门一直到教你亲手设计实现一个编程语言解释器。虽然是一本几十年前的书,但是书中的编程理念如数据驱动、过程抽象等到现在仍不过时。可以说是程序员修炼“内功心法”必读的一本好书。

这篇《我是如何用21天刷完SICP(中文)》的文章讲述了作者通过阅读本书学习的过程和心得,里面的观点可以借鉴,我在看完之后也想再把这本书拿出来学习一遍。

觉得看书太晦涩的,可以到下面这个项目里下载本书作者课堂讲解视频(国内好心人给做了翻译字幕)

图解Stable Diffusion模型

这篇图解Stable Diffusion模型(英文)详细讲解了 Stable Diffusion(最近比较火的那个可以通过文字描述进行绘图的AI模型)的工作原理。文中使用清晰的图示阐述了“扩散”模型是怎样通过给图片增加噪声一步一步生成图像的。

Wine是如何工作的

Linux桌面用户都遇到过在不得不运行 Windows 软件的时候,这个时候就可以使用这个叫做 Wine 的兼容程序,它可以让你在 Linux 下执行 win32 程序。( Valve 最新出品的游戏掌机 Steam Dect 就使用了 Wine 作为兼容层来运行 Windows 平台下的游戏)。

Wine 的名字来自于 “Wine Is Not an Emulator” 这个英文缩写。

这篇《Wine是如何工作的(英文)》介绍了它的基本工作原理。

在 Windows 记事本里运行光线追踪

光纤追踪(Ray Tracing)是一项计算机图形学技术,使用该技术渲染的计算机图像具有逼真的全局光照效果。

这篇《记事本中的光线追踪 30FPS》记录了作者突发奇想要在Windows上的记事本中进行光线追踪渲染的趣事。

其原理是通过系统API获取到记事本窗口的句柄,然后利用钩子函数给记事本的窗体发送相应的“消息”以及覆盖对应的内存数据来实现对记事本窗体界面的“魔改”。最终实现了在另一个进程里执行光线追踪算法,然后借用记事本中显示的字符来替代画面像素,从而“渲染”出画面的效果。

资源

  • SerenityOS项目,一个从头开始的桌面操作系统,内核采用类似Unix的架构,界面外观则仿照了上世纪90年代Windows的窗口风格。作者并未将其定位成玩具,而是一款具备生产力的操作系统软件。 除了操作系统本身,这个项目还有配套的编程语言Jakt、自己的浏览器引擎LibWeb和浏览器Ladybird ​​​

  • 《中文技术文档写作规范》阮一峰老师整理的技术文档写作规范,规定了标题、文本、段落、标点符号等文档元素的使用约定,需要经常编写技术文档的朋友可以收藏看看。

  • Freehand意绘,一个在线的AI绘图工具,可以根据文字描述帮助你生成图片,界面简洁友好,使用方便。 +

  • 计算机科学自学指南,提供了一份自学计算机科学的全方位资料大全,可以根据内容系统地进行学习计算机科学相关的知识。

    互联网上,到处都有许多的学习资源,然而精华与糟粕并存。你所需要的,不是一个诸如「200+ 免费在线课程」的清单,而是以下问题的答案:

    你应当学习 哪些科目,为什么? +对于这些科目,最好的书籍或者视频课程 是什么? +在这份指引中,我们尝试对这些问题做出确定的回答。

  • UNIX环境中的高级编程,一套编程教程,在课程中,主要学习用C编程语言开发复杂的系统级软件,同时深入了解Unix操作系统(以及属于该家族的所有操作系统,如Linux,BSD,甚至Mac OS X)及其编程环境。

    涵盖的主题将包括用户/内核接口,Unix的基本概念,用户身份验证,基本和高级I / O,文件系统,信号,进程关系和进程间通信。还将涵盖Unix系统上软件开发和维护的基本概念(开发和调试工具,如“make”和“gdb”)。

  • 写在C头文件里的3D物理引擎,一个仅用C99标准写在C头文件里的超小物理引擎,没有依赖,直接包含头文件即可在你的工程中使用,功能完整,内置向量、三角函数、引力等计算库。 +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-005-\346\234\237/2022-10-26-09-31-46.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-005-\346\234\237/2022-10-26-09-31-46.png" new file mode 100644 index 000000000..9cafd840f Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-005-\346\234\237/2022-10-26-09-31-46.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-005-\346\234\237/2022-10-26-09-35-46.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-005-\346\234\237/2022-10-26-09-35-46.png" new file mode 100644 index 000000000..9268b7e1e Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-005-\346\234\237/2022-10-26-09-35-46.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-005-\346\234\237/2022-10-26-09-40-07.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-005-\346\234\237/2022-10-26-09-40-07.png" new file mode 100644 index 000000000..7a9724d3c Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-005-\346\234\237/2022-10-26-09-40-07.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-005-\346\234\237/2022-10-26-09-48-21.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-005-\346\234\237/2022-10-26-09-48-21.png" new file mode 100644 index 000000000..cd82dfd7c Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-005-\346\234\237/2022-10-26-09-48-21.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-005-\346\234\237/2022-10-26-09-52-21.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-005-\346\234\237/2022-10-26-09-52-21.png" new file mode 100644 index 000000000..19e53b9f5 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-005-\346\234\237/2022-10-26-09-52-21.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-005-\346\234\237/2022-10-26-10-10-18.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-005-\346\234\237/2022-10-26-10-10-18.png" new file mode 100644 index 000000000..954fcb488 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-005-\346\234\237/2022-10-26-10-10-18.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-005-\346\234\237/2022-10-26-10-33-53.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-005-\346\234\237/2022-10-26-10-33-53.png" new file mode 100644 index 000000000..e570b4de6 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-005-\346\234\237/2022-10-26-10-33-53.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-005-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-005-\346\234\237/index.html" new file mode 100644 index 000000000..11c0b2d39 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-005-\346\234\237/index.html" @@ -0,0 +1,10 @@ +机器文摘 第 005 期

机器文摘 第 005 期

机器文摘 第 005 期

机器文摘 第 005 期

长文

穿越到 1983 年学习 BASIC

很多著名的程序员,尤其在计算机游戏行业,孩童时期就在苹果 II 和 Commodore 64 这样的 8 位计算机上开始编写游戏,John Romero、Richard Garriott 和 Chris Roberts 都是这样的例子。这好理解。在 8 位计算机时代,很多游戏只能在计算机杂志和书籍中以印刷的 BASIC 程序清单方式得到。如果你想玩其中一款游戏,就必须手工键入整个程序。不可避免的,你可能遇到一些问题,所以你就得调试你的程序。等到你让它可以工作起来了,你就已经对程序是如何运行的有了足够的了解,你就可以开始自己修改它了。如果你是一个狂热的游戏玩家,你几乎必然会成为一名优秀的程序员。

喜欢小霸王的小伙伴(老伙伴?),不可错过的文章,一起跟随作者回忆一下如何在老古董电脑上运行BASIC程序,顺便怀念一下当年靠着一本说明书就在小霸王学习机上编写(抄写)游戏的时光。

在 Github 的 Pages 服务里跑 SQLite

作者尝试做一个小网站来显示一些统计数据,于是他想到了用数据库,但是,使用数据库需要托管和维护后端服务,或者每次将整个数据集下载到浏览器中(当数据集超过10MB时,体验就变得很差劲)。

于是作者开始琢磨有没有办法找到一个可以在静态服务器上搞一个数据库服务得可能,毕竟提供静态服务的地方有很多(如 GitHub,GitLab,Netlify 等等)。

一通折腾下来(借助了 WASM 技术并适当的进行一些魔改),作者竟然实现了一个 100% 静态托管的数据库服务。

语句、表达式和海象操作符

这是一篇介绍如何通过“海象操作符“(类似这样:foo := 'bar')使得Python语句更加精炼的文章。

这种操作符之所以可以使得语句更加精炼,主要原因就是它使得一句代码既进行了赋值然后又作为表达式返回了值。

之前写 Python 代码的时候都没注意还有这种写法,而且貌似这在 C 和 C++ 中都是基本的特性。不过 C 和 C++ 是赋值语句=直接就返回了表达式的值,同时这给程序员提供了出错机会(有不少人应该还记得条件判断时少写了个等号导致的问题)。

给个人开发者的一些建议(英文)

hacker news 上的网友针对有志于运营自己的SaaS产品的个人开发者提了一些心得和建议。

摘抄一点儿如下:

  • 关于做什么,做那些你自己都愿意付费的东西,别指望做出一个你自己都不想花钱使用的产品有别人来买单;
  • 还是关于做什么,不要做需要漂亮UI的东西,那会让你陷入编码之外的很多麻烦(确实很牵涉精力),如果提供的工具能够通过简单交互就能提供优质服务最佳;
  • 如果有可能,尽量提供自助服务模式,也就是说让用户不用见到你就可以自行操作付款了(作者这是有多社交恐惧?);

资源

  • 数据结构与算法可视化,是一个学习算法知识的好工具。通过动图来演示和讲解数据结构和算法实现原理,针对每一个常用算法不仅有直观的图示,还附有一篇详细的文档,内涵原理知识以及代码实例,网站甚至还提供了答题练习功能,可以一边学习一边做题。

  • SLip,一个在浏览器中运行的Lisp解释器,使用Javascript实现。网站提供了一个简易的IDE,可以直接在页面中进行编程开发,还提供了图形绘制的扩展包,用于学习lisp语言非常合适。

  • 针对 Windows 预先编译的 Python 扩展包,在使用Python的时候,尤其是在Windows环境,经常会遇到有些扩展包由于依赖某些二进制库的原因导致无法通过pip直接安装,自己动手编译又十分麻烦。这个网站提供了各种预编译版本,可以直接下载网站提供的whl文件到本地然后安装。

  • 3D 渲染器入门,一套计算机图形学的入门教程,从原理讲解开始,手把手教你用C++语言编写一个自己的光线追踪渲染器。

  • HTMLDOG,前端开发基础知识大全,主要是 HTML、CSS、Javascript 的手把手教学以及语言参考。

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-006-\346\234\237/2022-11-02-13-45-45.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-006-\346\234\237/2022-11-02-13-45-45.png" new file mode 100644 index 000000000..11ed134f9 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-006-\346\234\237/2022-11-02-13-45-45.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-006-\346\234\237/2022-11-02-14-01-30.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-006-\346\234\237/2022-11-02-14-01-30.png" new file mode 100644 index 000000000..42adc79c2 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-006-\346\234\237/2022-11-02-14-01-30.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-006-\346\234\237/2022-11-02-14-15-18.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-006-\346\234\237/2022-11-02-14-15-18.png" new file mode 100644 index 000000000..5e7ed8882 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-006-\346\234\237/2022-11-02-14-15-18.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-006-\346\234\237/2022-11-02-14-24-59.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-006-\346\234\237/2022-11-02-14-24-59.png" new file mode 100644 index 000000000..227b0131d Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-006-\346\234\237/2022-11-02-14-24-59.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-006-\346\234\237/2022-11-02-14-46-11.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-006-\346\234\237/2022-11-02-14-46-11.png" new file mode 100644 index 000000000..012d33526 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-006-\346\234\237/2022-11-02-14-46-11.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-006-\346\234\237/2022-11-02-14-47-54.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-006-\346\234\237/2022-11-02-14-47-54.png" new file mode 100644 index 000000000..a7474ff5a Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-006-\346\234\237/2022-11-02-14-47-54.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-006-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-006-\346\234\237/index.html" new file mode 100644 index 000000000..699eada76 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-006-\346\234\237/index.html" @@ -0,0 +1,17 @@ +机器文摘 第 006 期

机器文摘 第 006 期

机器文摘 第 006 期

机器文摘 第 006 期

长文

怎样写一段代码把自己打印出来?

近期在知乎上看到一个如何编写代码打印自己的问题,感到十分有趣。以前也在网上见到过类似的代码,用 C 或者 Javascript 等各种语言实现的版本都有。当时只是感叹代码写的十分神奇,一段代码在运行之后竟然输出自己的源代码,而且一个字符也不差,并没有搞懂其中的原理。这篇回答里,作者给出了详细解释。并指出,冯·诺依曼早在他编写的《自复制元胞自动机理论》一书中的提出了这种事情在理论上的通用方法。

如上图所示,自复制系统有五个基本部件:A:通用构造器;B:通用复制器;C:控制器;D:其他函数;ϕ(A,B,C,D)\phi(A,B,C,D)\phi(A,B,C,D) : A, B, C, D的编码;当自复制过程启动的时候,B将编码复制一份。A再根据复制出的编码构造出ABCD。最后,C再将这些结构组合起来,构造出一个新的、复制的结构。可以看到,自复制、自打印程序的核心就在于通用构造器和编码,因为复制器、控制器都是比较容易实现的。

具体实现的示例,文中有更详细的说明。

最后,此问题可以引申到,大自然中生命基于基因的复制机制,也是与此相关,甚至其背后都是同样的机制。

Kevin Kelly 在 68 岁生日时给出的 68 条建议

凯文·凯利(又称KK, 作者,著有《失控》《科技想要什么》《必然》等),上个月 28 号是他的 68 岁生日,他准备了 68 条简短的建议,作为礼物送给年轻人。

有人翻译了KK 在 68 岁生日时给出的 68 条建议

摘抄几条如下:

任何一项大工程(修房子、拍电影、开发 app)完成度为 90% 的时候,你都要做好心理准备:剩余的大量细节工作会占掉你另一段与之前相当的时间。

不要担心自己问的问题听起来很傻。99% 的情况下,其他人都有和你一样的问题,只不过羞于问出口而已。

别成为一群人里最聪明的那个。和那些比你聪明的人待在一起,向他们学习。如果能找到和你观点相左的聪明人,那就更好了。

别做最好的。做唯一的。

任何真实之物都源于虚构之意。想象是宇宙中最强大的力量,也是你能够日益精进的能力。生命中可以因不知众人所知而获益的能力,仅此一项。

经验往往被高估了。招募的时候,要看资质,技能则可以培训。许多令人惊奇和赞叹的事情,都是由第一次做的人做出来的。

怎样搭建一个最简的 GIT 服务器

GIT 是现在软件开发过程中必不可少的版本控制工具,功能非常强大,我们平时直接使用单位的私有服务或者在线的云服务(如:Github 等)。

如果想要搭建个人的服务,可能就比较繁琐一些。阮一峰老师的这篇博客就解答了怎样采用极简的技术路线,为自己搭建一台 GIT 服务器。

自己搭建 Git 服务器的原因,无非就是不方便访问外网,不愿意代码放在别人的服务器,或者有一些定制化的需求。 +这时,你可以选择开源的 Git 服务器软件。 +Gitlab CE +Gitea +Gogs +Onedev +这些软件里面,Gogs 的安装是最简单的,但是功能相对比较弱。功能越强的软件,安装越复杂。 +如果你只是想远程保存一份代码,并不在意有没有 Web 界面,或者其他功能,那么根本不用安装上面这些软件,一行命令就够了。

为什么很多程序员讨厌低代码?

“低代码”(一般指:不用或少用编写代码的方式进行软件开发)这个词近两年又开始火了,它代表着对软件工程的一种美好“幻想”,即:花费更低的代价去构建复杂的软件系统。

虽然每隔一个时间周期都会被重提一次,但是每次都未能如愿。

现在既然又被频繁提及,我在知乎上发现了这样一篇关于低代码话题的回答。从程序员的视角表达了对低代码这种期望的观点,有兴趣的朋友可以点进去看看。

软件工程这门学问,研究的就是“如何利用工程思想,从整体上降低开发复杂性”;但与之同时,它不得不反复强调“软件工程试图解决的、是人为引入的不必要的复杂性;但工程的本质复杂性是无法逃避的。因为没有银弹,没有银弹,没有银弹!”

我个人的观点是:低代码或者配置化、拖拽式软件开发,很难平衡对复杂现实的抽象程度和开发便利性的矛盾关系。如何做到既提供方便的组件同时又不限制对个性化需求的实现,这需要非常强大的设计能力以及对于特定应用场景的取舍。目前来看,如果要做到或者接近上述状态,必然要先消耗巨量的成本,至于是否值得,可能不同的主体会有不同的选择吧。

资源

  • 从加减乘除到机器学习,一本不错的数学扫盲书,如果你在学习人工智能的时候对数学感到吃力的话,这本书非常适合阅读,一点也不枯燥。主要讲解线性代数相关的知识。

  • 命令行的艺术 想成为命令行高手,掌握这一篇就够了。

    熟练使用命令行是一种常常被忽视,或被认为难以掌握的技能,但实际上,它会提高你作为工程师的灵活性以及生产力。本文是一份我在 Linux 上工作时,发现的一些命令行使用技巧的摘要。有些技巧非常基础,而另一些则相当复杂,甚至晦涩难懂。这篇文章并不长,但当你能够熟练掌握这里列出的所有技巧时,你就学会了很多关于命令行的东西了。

  • 基于实际项目的学习,这是一个巨大的代码工程资源索引,里面列举了针对各种编程语言的个人项目,当你不知道该如何去深入学习一门编程语言的时候,选择一个这里的项目然后自己动手跟着练一遍效果绝对惊人。入选的项目都十分有趣,比如怎样用 C 写一个解释器、怎样写一个自己的编辑器、自己动手实现 TCP/IP 协议栈,等等。

  • 霞鹜文楷,一款开源中文字体,基于 FONTWORKS 出品字体 Klee One 衍生。用来看书非常舒服,特别是在排版上。微信读书已经内置,如果是第三方支持自定义字体的可以试试。

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/2022-11-09-09-30-08.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/2022-11-09-09-30-08.png" new file mode 100644 index 000000000..c2c28563a Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/2022-11-09-09-30-08.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/2022-11-09-09-47-44.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/2022-11-09-09-47-44.png" new file mode 100644 index 000000000..6a958ba37 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/2022-11-09-09-47-44.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/2022-11-09-10-01-15.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/2022-11-09-10-01-15.png" new file mode 100644 index 000000000..7a6b956b9 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/2022-11-09-10-01-15.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/2022-11-09-10-05-43.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/2022-11-09-10-05-43.png" new file mode 100644 index 000000000..2f4a32aa6 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/2022-11-09-10-05-43.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/2022-11-09-10-24-10.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/2022-11-09-10-24-10.png" new file mode 100644 index 000000000..6d05db2e2 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/2022-11-09-10-24-10.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/2022-11-09-10-28-42.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/2022-11-09-10-28-42.png" new file mode 100644 index 000000000..505c9a5ca Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/2022-11-09-10-28-42.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/2022-11-09-10-32-23.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/2022-11-09-10-32-23.png" new file mode 100644 index 000000000..4bb76f710 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/2022-11-09-10-32-23.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/2022-11-09-10-36-51.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/2022-11-09-10-36-51.png" new file mode 100644 index 000000000..0747b8048 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/2022-11-09-10-36-51.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/index.html" new file mode 100644 index 000000000..6ee7b2f88 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-007-\346\234\237/index.html" @@ -0,0 +1,10 @@ +机器文摘 第 007 期

机器文摘 第 007 期

机器文摘 第 007 期

机器文摘 第 007 期

长文

如何在 HTML5 Canvas 制作可精确控制时间的动画

使用 Canvas 对象在网页中制作动画非常简单,有不少人喜欢直接使用定时器 setinterval 以一定的时间周期循环执行绘图代码来实现动画效果。但是这种做法有一个弊端,由于显示刷新率以及计算机硬件性能的不同,会导致在不同机器上的表现差异。比如你希望你的动画角色在 1 秒内移动 50 个像素,但是实际执行起来却很难控制。基于时间的动画这篇文章讲解了如何使用浏览器的 requestAnimationFrame API 来实现精准控制动画时间的效果,里面给出了一个很简单的样例,但是基本上给出了一个完整的“更新、渲染、通过时间变化计算运动距离”的游戏控制架构。

如何使用纯 Web 技术开发一个相机 App

如果不习惯复杂的移动 app 开发环境,直接使用 Web 技术开发一些小的 App 也是十分方便的。我近期希望通过网页实现一个拍照的应用,并且希望不使用手机的原生相机功能,而是自己控制一些相机参数、后期效果、增加特定的取景框等等。于是我找到了一篇教学指南:Make a Camera Web App,只需几十行代码就实现了一个相机 App 。感兴趣的朋友可以点进去看看。

数据库是如何工作的,从零开始写一个数据库

如果和我一样好奇数据库是如何实现的,可以看看这篇文章。带你用 C 语言从头撸一个数据库出来。

使用 Rust 写一个操作系统

Rust 逐渐火起来了,这篇 2018 年的文章整理了一份教程,作者尝试使用 Rust 写一个操作系统,我之所以收录它是因为作者还在 Github 开源了代码,并且这系列教程甚至提供了多国语言的版本。制作精良。应该是实践操作系统知识的好教材。

资源

  • 100 天精通 CSS ,这个网站给了你 100 个关于 CSS 技术的挑战题目,也许练完之后可以达到深入应用 CSS 的效果,我尝试了几个挑战,有些题目的设置有些偏炫技范畴了,想在工作中使用估计会被打死。

  • Linux 命令在线帮助工具,对于我这种经常记不住命令用法的人来说真的是一种福音。比如我就经常记不清 tar 命令的用法,面对压缩包解压或者文件打包的工作每次都是去网上搜索一番。有了这个在线工具,直接在命令行中使用 curl请求他的网址就可给出命令的样例用法详解,非常方便。比如执行curl cht.sh/tar 就会给出 tar 的使用样例了,我直接复制粘贴之。

  • 手机博物馆, 网站收录了各品牌手机的各代产品资料,包括手机图片、型号参数、当时发布的广告等。不过我看了一下,资料应该还不齐全,有些手机只是列了个名字和型号在那儿,还缺少详细信息,估计还在继续收集中。

  • 中文家用游戏博物馆 ,收录了比较齐全的家用游戏机及掌机的中文版游戏资料。可以直接在线通过模拟器玩耍。有不少经典的 FC、GB、MD 游戏,甚至还有小霸王学习机的 ROM ,可以在线体验。

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-008-\346\234\237/2022-11-16-09-24-41.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-008-\346\234\237/2022-11-16-09-24-41.png" new file mode 100644 index 000000000..102197b37 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-008-\346\234\237/2022-11-16-09-24-41.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-008-\346\234\237/2022-11-16-09-36-12.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-008-\346\234\237/2022-11-16-09-36-12.png" new file mode 100644 index 000000000..8aef264a7 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-008-\346\234\237/2022-11-16-09-36-12.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-008-\346\234\237/2022-11-16-09-58-00.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-008-\346\234\237/2022-11-16-09-58-00.png" new file mode 100644 index 000000000..f5c6a578f Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-008-\346\234\237/2022-11-16-09-58-00.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-008-\346\234\237/2022-11-16-10-26-09.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-008-\346\234\237/2022-11-16-10-26-09.png" new file mode 100644 index 000000000..d57cea71c Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-008-\346\234\237/2022-11-16-10-26-09.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-008-\346\234\237/2022-11-16-10-34-57.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-008-\346\234\237/2022-11-16-10-34-57.png" new file mode 100644 index 000000000..43770f80b Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-008-\346\234\237/2022-11-16-10-34-57.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-008-\346\234\237/2022-11-16-10-51-40.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-008-\346\234\237/2022-11-16-10-51-40.png" new file mode 100644 index 000000000..6bf856d12 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-008-\346\234\237/2022-11-16-10-51-40.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-008-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-008-\346\234\237/index.html" new file mode 100644 index 000000000..8ffc13a3d --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-008-\346\234\237/index.html" @@ -0,0 +1,20 @@ +机器文摘 第 008 期

机器文摘 第 008 期

机器文摘 第 008 期

机器文摘 第 008 期

长文

用好 GitHub,给自己建立一个全方位的私有云平台

+很多人都有进行个人的知识管理和数字资源管理的需求,市面上也有很多软件工具或者平台来满足这样的需求,但是大部分都是收费的,且自由度不高。我个人经常使用 Github 作为知识管理仓库,我的网络日志、技术博客、私人小项目、电子书籍等都放在上面,生活中已经离不开这个网站了。

近期读到这样一篇文章–善用 Github,全方位讲解了 Github 如何使用,如何将其提供的服务发挥最大化的作用,看完受益匪浅。

GitHub 是微软旗下的一个在线软件源代码托管服务平台,也是一个拥有八千多万开发者用户的社区。很多开发者应该对GitHub有一定的了解,但非技术人员大多可能并不会去使用它。本文更多是想给非技术人员来介绍这个平台,看完这篇文章,希望能让更多人在上面来学习、创作与展示自己的作品。

WebGPU 是什么?跟 WebGL 有什么关系?

+前几天我想在网页上制作一个小游戏,用于尝试一下图形编程相关的技术。用到了一些基于 Web 技术的 3d 图形框架,比如 Three.js、Babylon.js 等等。在尝试的过程中遇到了一个新的名词 WebGPU,之前总是在听说 WebGL 相关的技术,结果说了这么多年,WebGL还没普及,怎么又冒出来一个 WebGPU?于是找了一篇文章,浅扒一下各个图形接口的历史。就是这篇浅入浅出 WebGPU

2016年6月,Google 产生了使用新API来代替WebGL的想法,称之为 WebGL Next。 +2017年1月,Khronos Group 举办了WebGL Next研讨会,Chromium一马当先,展示了可以基于OpenGL和Metal独立运行的新图形系统原型,同时Apple和Mozilla也分别展示了自己的原型,三者都非常类似于Metal Api。 +次月,Apple就向W3C提交了一个名为 WebGPU 的技术概念验证方案,基于Metal图形开放接口,最终W3C采纳了 WebGPU 这个名字作为下一代标准,Apple的提案进入了正式的小组提案中。 +3月,Mozilla向Khronos Group提交了基于Vulkan的名为WebGL Next提案。 +2018年6月,Chrome团队宣布着手实现WebGPU,这意味着Khronos的失败,WebGPU胜出,大家以后还是团结在W3C的周围。 +按照预期,工作组希望在2021年底发布WebGPU 1.0 标准,不过目前只有草案。 +WebGPU 1.0 草案:https://www.w3.org/standards/types#WD

扔掉 Photoshop 改用字符串绘图

+相信很多人都接触过使用字符绘制的图片,这在程序员圈子里甚至发展为一门专有的艺术 “ASCII 艺术”。不过我现在不是要说这些,我在一篇 2015 年发表的文章里,发现了这个:有个猛男在自己的程序里彻底抛弃使用 Photoshop 制作的图片资源,改用字符串来描述各种图形(程序界面的图标),然后自己再用代码将其渲染成为高清的图像。

作者对此很沾沾自喜,他甚至设计了一套自用的语法规范,用特定字母代表特定的符号关系,这样就可以组合出各种复杂的图案了。

我也在文章的评论区见到了跟我有同样疑惑的读者留言:“这不就是重新发明了 SVG 吗?唯一的区别就是没有用 XML 作为载体”。

不过文章记录的整个开发过程还是很有趣的,希望了解朋友可以点进去看看 Replacing Photoshop With NSString

资源

  • FFmpeg原理,FFmpeg 这个开源项目可能圈外的人士了解不多,但实际上我们生活中一刻也离不开它。现在的网络直播、网络视频网站和移动App、各种视频剪辑合成软件,都或多或少的使用了 FFmpeg 提供的编解码技术。这本在线书籍对于想进一步了解 FFmpeg 以及视频编解码技术的朋友是个不错的参考资料。

    本书《FFmpeg原理》主要讲解 FFmpeg 原理性的知识,前面几章主要讲解一些音视频开发的基础知识,例如原始数据 YUV 跟 RGB,封装格式 FLV 跟 MP4 ,压缩编码的基本概念,还有封装格式分析。

  • 开源虚拟与远程桌面基础架构,远程桌面软件,开箱即用,无需任何配置。(我个人目前还是使用windows的远程桌面多一些,不过这个开源的rustdesk看起来不错)

    您完全掌控数据,不用担心安全问题。您可以使用我们的注册/中继服务器,或者自建,亦或者开发您的版本 +

  • Learn X in Y minutes,这里的教程几乎涵盖所有编程语言,完全没有废话。英文版、中文版都有。如果有编程语言基础的话,通过这个网站确实可以在几十分钟内掌握一门新的编程语言的核心知识。

  • Flash 保存计划,Flash 虽然消失了,但是它曾经创造的辉煌一直在我们的记忆里,现在偶尔还想起一些经典的小游戏。这个网站里收藏了很多经典的Flash小游戏,通过一些黑科技复活了它们,可以在浏览器里运行体验。反正我一打开了黄金矿工,就半天停不下来。

  • CodeGeeX: 多语言代码生成模型,又一个能帮你写代码的 AI 模型。提供有官方的 VSCode 插件。我试了一下,效果跟 Github 的 copilot 还有一定的差距。

    CodeGeeX是一个具有130亿参数的多编程语言代码生成预训练模型。CodeGeeX采用华为MindSpore框架实现,在鹏城实验室“鹏城云脑II”中的192个节点(共1536个国产昇腾910 AI处理器)上训练而成。截至2022年6月22日,CodeGeeX历时两个月在20多种编程语言的代码语料库(>8500亿Token)上预训练得到

  • 计算机网络基础学习(英文),一个在线讲解网络基础知识的教程,优点是内容简洁,不用特别多的专用名词唬人,另外还提供了在线实验的环境。

    关于计算机网络的书籍往往令人生畏 - 数千页,无聊的图表……这个教程以几千字的字数引导您了解网络基础知识!它还提供动手实验室来实践所获得的知识。

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/2022-11-21-14-24-20.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/2022-11-21-14-24-20.png" new file mode 100644 index 000000000..e8ebdcfa8 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/2022-11-21-14-24-20.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/2022-11-21-14-41-33.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/2022-11-21-14-41-33.png" new file mode 100644 index 000000000..297c8b6b9 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/2022-11-21-14-41-33.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/2022-11-21-15-11-11.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/2022-11-21-15-11-11.png" new file mode 100644 index 000000000..0c2218dff Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/2022-11-21-15-11-11.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/2022-11-21-15-24-33.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/2022-11-21-15-24-33.png" new file mode 100644 index 000000000..425986292 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/2022-11-21-15-24-33.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/2022-11-21-15-33-35.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/2022-11-21-15-33-35.png" new file mode 100644 index 000000000..2a4705ee0 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/2022-11-21-15-33-35.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/2022-11-21-16-16-10.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/2022-11-21-16-16-10.png" new file mode 100644 index 000000000..fdbd441b7 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/2022-11-21-16-16-10.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/2022-11-23-10-36-44.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/2022-11-23-10-36-44.png" new file mode 100644 index 000000000..a3560c871 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/2022-11-23-10-36-44.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/2022-11-23-10-41-36.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/2022-11-23-10-41-36.png" new file mode 100644 index 000000000..8d6f5e978 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/2022-11-23-10-41-36.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/index.html" new file mode 100644 index 000000000..a2ffcf302 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-009-\346\234\237/index.html" @@ -0,0 +1,20 @@ +机器文摘 第 009 期

机器文摘 第 009 期

机器文摘 第 009 期

机器文摘 第 009 期

长文

游戏中的“精灵”

+精灵(sprite)这个词来自古法语单词“esprit”,意思是“精神”——源自拉丁语“spiritus”。在民间传说中,精灵是活泼、俏皮和神奇的小生物。然而对于游戏开发者来说,它又是另一个含义了。

这篇《精灵的惊人历史》(英文),介绍了不同的游戏厂商,在早期硬件机能有限的条件下,如何实现“角色在屏幕上移动”这个现在看似十分简单的事情的。

对于不了解“精灵”的含义的,稍作如下解释:

2D 游戏在处理需要动起来的角色时,出于性能考虑,将一部分图形的绘制与背景画面的绘制分开,对于频繁需要刷新(动起来的)部分,单独处理,使他们感觉像是漂浮在背景画面的“幽灵”似的,故名“精灵”。

任天堂 NES 的一些技术细节

+NES 是任天堂推出一款极其成功的家用游戏机(NES : Nintendo Entertainment ,System 是其在北美发售的名称,亚洲叫 FC :Family Computer),不少80、90后的朋友应该都玩过(或者是国内山寨厂商仿制的*霸王之类)。

NES 使用极其经典的 6502 CPU。这块 CPU 有多经典呢,苹果的 Apple1代2代 、史上销量第一的个人电脑 Commodore 64 、国内早年比较流行的文曲星等,使用的都是这个 CPU。

《我做了一个 NES 模拟器》(英文),这篇文章的作者在编写模拟器的过程中挖出了不少技术细节,里面还提到了硬件存在的各种 BUG (没错,要模拟的话必须连 BUG 都得模拟,不然有些游戏玩不了),想要了解的朋友可以点进去看一下。

作为模拟器爱好者,我对 6502 处理器非常好奇,一度希望自己动手也实现一个,而且这款处理器真的非常适合模拟器入门,毕竟只有三个寄存器和百十条指令。

文中提到的 NES 模拟器在 Github 上开放了源码,有兴趣的可以学习。

一个桌面开发程序员为了学习 Javascript 而手撸了一个基于 WebGL 的游戏引擎

+学习一样技能最好的方式就是动手去做。

当我感叹牛人怎么那么厉害的时候,往往忽略了牛人的学习过程。

以为他们天生就那样。

事实上他们的技能也是靠努力训练得来的。

不过,学习方法确实很重要。

《我对 Javascript 的尝试》(英文),这篇文章的作者原本是一个桌面程序开发者(类似 CAD 软件之类)。

他突然想要学习前端开发,掌握 Javascript 语言。

于是结合自己之前的知识,使用前端技术做了一套很优秀的 Demo 程序,一个性能和外观都很不错的游戏引擎。

文章里作者详细介绍了实现过程中对技术、算法的选择等等。

内容很长,但还算友好,比较干货。

资源

  • 开发者之路,汇总了各个技术路线的学习资料,包括前端、后端、运维、计算机科学、区块链、移动端、质量管理等等。 + +总之极其全面。 +目前在 Github 有两百多万个 star,被 fork 了 三十多万次。
  • chrome 插件下载,访问谷歌浏览器插件商店有困难吗?试试这个网站,可以直接下载插件的包文件,下载后拖入浏览器即可安装。不过我已经转换到微软的 Edge 阵营了,用不到这个了。
  • CSS3 生成器,对于 CSS 的属性参数总是记不住,这个网站就很适合我。每次要调背景渐变、圆角、阴影、动画曲线等等,都得现去搜。有了这个网站,在线点点拖拖,直接复制代码即可。 +
  • tesseract.js,可直接在浏览器里运行的 OCR 引擎,支持多国语言(超过 100 种)文字识别。 +
  • AI 在线写诗,比较全面的 AI 写诗工具,可以写律诗、绝句、现代诗、歌词等等,根据输入的主题任意发挥。 +
  • 图片分辨率在线提升,上传图片,网站使用 AI 算法将图片的清晰度自动提升,效果还不错。 +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-010-\346\234\237/2022-11-29-14-11-12.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-010-\346\234\237/2022-11-29-14-11-12.png" new file mode 100644 index 000000000..04e868406 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-010-\346\234\237/2022-11-29-14-11-12.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-010-\346\234\237/2022-11-29-14-24-37.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-010-\346\234\237/2022-11-29-14-24-37.png" new file mode 100644 index 000000000..a4931289a Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-010-\346\234\237/2022-11-29-14-24-37.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-010-\346\234\237/2022-11-29-14-45-43.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-010-\346\234\237/2022-11-29-14-45-43.png" new file mode 100644 index 000000000..5ac658a20 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-010-\346\234\237/2022-11-29-14-45-43.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-010-\346\234\237/2022-11-29-15-14-46.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-010-\346\234\237/2022-11-29-15-14-46.png" new file mode 100644 index 000000000..a66fc3b55 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-010-\346\234\237/2022-11-29-15-14-46.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-010-\346\234\237/2022-11-29-15-31-31.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-010-\346\234\237/2022-11-29-15-31-31.png" new file mode 100644 index 000000000..1ffadb892 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-010-\346\234\237/2022-11-29-15-31-31.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-010-\346\234\237/2022-11-29-15-36-44.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-010-\346\234\237/2022-11-29-15-36-44.png" new file mode 100644 index 000000000..5a3d36964 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-010-\346\234\237/2022-11-29-15-36-44.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-010-\346\234\237/2022-11-29-15-42-20.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-010-\346\234\237/2022-11-29-15-42-20.png" new file mode 100644 index 000000000..2d68e147c Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-010-\346\234\237/2022-11-29-15-42-20.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-010-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-010-\346\234\237/index.html" new file mode 100644 index 000000000..e27eb28ef --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-010-\346\234\237/index.html" @@ -0,0 +1,17 @@ +机器文摘 第 010 期

机器文摘 第 010 期

机器文摘 第 010 期

机器文摘 第 010 期

长文

极客摄影指南

+相机,也是机器的一种。

我用它记录生活,捕捉生活中转瞬即逝的美好瞬间。

有个问题一直困扰着我,怎样拍出不那么“到此一游”的照片?

怎样才能“掌控”相机这个机器?

这篇《极客摄影》(英文)能够帮助你对摄影做一个真正深入的理解(而不是学习那些充斥社交平台的各种浮于表面的“技巧”)。

作者是一个热爱摄影的技术男,有二十多年摄影经验。

听他给你讲讲什么是“光”和“构图”。

一篇就够了。

MS-DOS 背后的设计

包括我在内的不少 80 后接触电脑是从 MS-DOS 开始的。

对于它的黑窗口和命令行都有着很深的印象。

上大学时执行最多的命令是format c: /s /q

当年还玩过不少在 DOS 平台的游戏,比如仙剑奇侠传、主题医院等等。

只是当时没工夫对系统本身做深入了解。

顶多是,自己在学习汇编语言时,对 DOS 又仔细端详了几眼。

这篇《凑近看看 MS-DOS 》(英文),介绍了 DOS 系统的设计标准、内存分配、磁盘文件结构、FAT文件系统的技术细节等等。

想要窥探技术细节的可以点进去看看。

构建最快的 Lua 解释器

+给动态语言编写解释器可能不算太难(如果只是能跑的话)。

但是如果要编写一个高性能的、好用的动态语言解释器,比如像谷歌浏览器所用的 V8 引擎那样,就比较困难了。

《构建最快的 Lua 解释器》这篇文章站在更高维度提供一种方法,即:编写一种可以自动生成编译器(解释器)代码的程序,以使得制作高性能解释器变得更加容易。

我看了一下,大概就是自动化生成之前需要手工处理的编译器优化代码。作为编译原理学的不怎么明白的我,对此不敢评论。

为什么 Linux 内核没有单元测试?

+我对单元测试的态度一般,既不强烈支持,也不反对。

听说有的开发团队由于对于单元测试十分狂热,已经到了不允许写注释,都用单元测试替代的地步。

前不久,在 HN 上有网友发起了一个引战的讨论:“既然单元测试这么好,为什么 Linux 内核源码不用呢?

以下为部分观点:

单元测试被严重高估了,TDD有一些好主意,但有一段时间它变成了一种宗教。

单元测试与TDD宗教不是一回事。它只是意味着将事物划分为小单元并尽可能详尽地测试其功能。

SQLite不是反例吗?他们有更多的单元测试代码,而不是实际运行的代码。

资源

  • Python 100 天从入门到精通,Python 好学吗?好学又不好学,上手容易,精通难。这里有套开源教程囊括了从入门到实战应用(语言基础、数据处理、Web开发、网络开发、爬虫、深度学习等)的所有课程。这个仓库目前已经在 Github 上获得了 12 万star。可以说是好评如潮,想深入学习 Python 的不容错过。赶紧到我收藏夹里吃灰。

  • 在线单片机模拟器,想要学习单片机开发,又没有硬件设备吗?这个网站最合适。不需要担心手残不会电烙铁,也不用担心买不到芯片。直接在线进行模拟接线,直接运行编写的代码,结果实时展现。 +

  • slow roads,一个在线赛车游戏。基于网页制作。亮点在于作者实现了无限地图。所有地形和道路均使用程序生成。游戏有自动驾驶模式,如果只想观赏路边风景的话,可以开启。 +

  • TIC-80,TIC-80 是一台用于制作、播放和分享小型游戏的幻想计算机。有内置的开发工具:代码、sprites、地图、声音编辑器和命令行,这足以创建一个迷你复古游戏。在退出时,你将得到一个盒式文件,它可以在网站上存储和播放。 +另外,游戏可以打包成一个播放器,可以在所有流行的平台上运行,并按你的意愿分发。为了制作一个复古风格的游戏,整个创作过程是在一些技术限制下进行的。240x136 像素的显示屏,16 种颜色的调色板,256 个 8x8 的彩色 sprites,4 channel sound 等等。 +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-09-13-22.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-09-13-22.png" new file mode 100644 index 000000000..307bdab4a Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-09-13-22.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-09-21-23.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-09-21-23.png" new file mode 100644 index 000000000..36c157935 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-09-21-23.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-09-37-41.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-09-37-41.png" new file mode 100644 index 000000000..21e951fad Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-09-37-41.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-09-43-28.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-09-43-28.png" new file mode 100644 index 000000000..97ba94ed0 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-09-43-28.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-09-51-28.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-09-51-28.png" new file mode 100644 index 000000000..0806698ca Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-09-51-28.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-09-54-49.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-09-54-49.png" new file mode 100644 index 000000000..fe0548dfb Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-09-54-49.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-09-57-10.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-09-57-10.png" new file mode 100644 index 000000000..56a65937b Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-09-57-10.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-09-59-27.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-09-59-27.png" new file mode 100644 index 000000000..f058f77e0 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-09-59-27.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-10-02-46.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-10-02-46.png" new file mode 100644 index 000000000..9f73e6c13 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/2022-12-07-10-02-46.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/index.html" new file mode 100644 index 000000000..da8717a8f --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-011-\346\234\237/index.html" @@ -0,0 +1,19 @@ +机器文摘 第 011 期

机器文摘 第 011 期

机器文摘 第 011 期

机器文摘 第 011 期

长文

自己动手做一个天气墨水屏

+有个喜欢动手的哥们,发现了自己及家人的一项小需求,即从家出门的时候想快速知道天气情况。

虽然这种需求抬眼看一下手机也能实现,但是本着“懒惰使人进步”的核心思想(作者懒得掏出手机)他动手实现了一套基于电池供电的可以显示天气预报信息的电子墨水屏。

这篇《做一个天气墨水屏》记录了作者从诞生点子到产品出炉的全过程。

另外作者还开源了项目的源代码,可在这里获取

M1 GPU 的故事

+GPU 大家都知道,这里有篇文章介绍了它的工作细节

作者来自一个给苹果 M1 芯片适配 Linux 驱动的团队(苹果官方不提供驱动,所以这意味着需要做一些逆向工程)。

本文记录了这些工作中比较有趣的部分,还顺便介绍了 GPU 的一些底层工作原理。

在 Commodore 64 上实现位图滚动条的显示

+Demosense 是一项挖掘计算机硬件机能极限的活动。

通常创作者们会通过各种编程技巧来实现看似无法达到的效果。

由于 Commodore 64 这台古董电脑十分经典,现在仍有不少Demosense爱好者在为它开发程序。

这篇文章讲述了著名 C64 demo 程序 Memento Mori 的实现过程,程序在 Commodore 64 上显示了一副巨大(对于C64来说)的图片。

这在圈内属于首创。

动手做一个 4 位 CPU

+计算机组成原理是不是还没学明白?没关系,我们可以自己亲手做一个简单的 CPU 。

Nibbler 是一款 4 位 CPU,使用标准 7400 系列逻辑芯片(单个计数器、寄存器、缓冲器和门)构建而成。是一个简单 CPU 的教育示例,易于理解和构建,但仍然能够运行游戏和其他有趣的程序。Nibbler 在 5 x 4 英寸(127 x 102 毫米)穿孔板上使用绕线制造。CPU总共包含17个芯片。

作者公开了设计图纸和相关资料,可在文章内部的链接中获取。

资源

  • 纯手撸一个解释器,编译原理没学明白没关系,这本在线电子书手把手教你写一个自己的解释器。 +

  • Git 飞行规则 (Flight Rules) ,一个十分全面的 Git 使用指南,把你能遇到的情况都想到了。 +

  • Vim 高级进阶,如果你已经学会了怎么退出 Vim,恭喜你,已经击败了 80% 的选手。想要在 Vim 中进行更高效的编辑操作,这份高手指南十分适合作为参考。 +

  • Flexbox 布局交互指南,这篇在线教程讲解了如何使用 Flexbox 进行页面布局,难能可贵的是直接在页面中提供了交互操作界面,可以一遍学一遍实践,非常方便。 +

  • 在线 AI 标注工具,想要训练自己的 AI 模型,比如目标检测、图像分类等等,可以使用这个在线工具进行数据标注,直接上传图片然后在线标注,完成后可导出 VOC、Coco 等格式的数据集。 +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-13-30-19.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-13-30-19.png" new file mode 100644 index 000000000..6c920d240 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-13-30-19.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-13-41-23.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-13-41-23.png" new file mode 100644 index 000000000..cf7c8bedb Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-13-41-23.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-13-54-06.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-13-54-06.png" new file mode 100644 index 000000000..fe0d7d10a Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-13-54-06.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-14-06-08.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-14-06-08.png" new file mode 100644 index 000000000..71169add2 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-14-06-08.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-14-19-26.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-14-19-26.png" new file mode 100644 index 000000000..8bd92e5d3 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-14-19-26.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-14-23-40.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-14-23-40.png" new file mode 100644 index 000000000..2452bd0e0 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-14-23-40.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-14-29-43.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-14-29-43.png" new file mode 100644 index 000000000..60f7366b0 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-14-29-43.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-14-32-47.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-14-32-47.png" new file mode 100644 index 000000000..617c4baf1 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-14-32-47.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-14-43-13.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-14-43-13.png" new file mode 100644 index 000000000..2cc77532f Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/2022-12-13-14-43-13.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/index.html" new file mode 100644 index 000000000..6d10392fb --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-012-\346\234\237/index.html" @@ -0,0 +1,14 @@ +机器文摘 第 012 期

机器文摘 第 012 期

机器文摘 第 012 期

机器文摘 第 012 期

长文

Github 登录被第三方网站滥用了吗?

+为了方便账号注册,现在很多网站都提供了基于 Github 账号登录的方式。

我个人也更倾向于使用这种方式登录。

毕竟可以少填一些注册信息,减少思考密码的麻烦。

但是这样做有什么安全问题没有?

上周有一个在 HackerNews 上的帖子,有人遇到了在使用 Github 账号登录某些网站之后,导致他的账号莫名给别的仓库添 Star 的情况。

这引发了大家关于 Github 账号权限管理以及通过第三方鉴权进行账号登录和注册的讨论。

看完觉得在第三方鉴权授权时还是应该慎重使用才好。

每个黑客都知道的命令行快捷键

+在图形化界面、触控操作交互界面已经十分普及的今天,普通用户可能现在很少能接触到命令行操作了。

但是对于软件开发者、IT运维工程师来说,命令行还是属于离不开的操作界面。

而且对于有些工作任务来说,使用命令行完成起来要更加高效。

这篇文章讲解了常见命令行交互时的一些快捷操作,比如常见的行内编辑、快速移动光标到命令开头、历史记录搜索等等。

掌握之后可以在各种命令行交互界面中进行使用(基本风格一致)。

基于颜色循环的动画技术

+在计算机硬件资源匮乏的上世纪 90 年代,开发人员为了在有限条件下实现丰富的效果真是挖空心思。

比如,还记得 Windows 98 的启动画面吗?

蓝天白云,Windows 徽标,底部有一个蓝色的渐变色条,在缓慢的滚动。

实际上它只是一幅图片,并非多帧动画。

这就用到了一个叫做“颜色循环”的技术。

来自维基百科:颜色循环,也称为调色板移动,是计算机图形学中使用的一种技术,其中颜色被更改以产生动画的假象。这种技术主要用于早期的电脑游戏,因为存储一个图像并更改其调色板比将动画存储为几帧需要更少的内存和处理器能力。

这里有个博客使用 HTML Canvas 复刻了一批采用颜色循环创作的作品,效果非常惊艳。

另外网站还开源了用于展示这些作品的图形引擎,虽然现在已经不再维护了,但是用于学习和探索还是很有研究意义。

软件逆向工程入门

+软件的加密和破解在普通用户眼里十分神秘。

这篇软件逆向工程入门比较深入浅出地介绍了一些常用手法,跟着作者可以浅尝一下在内存中寻找注册号、修改汇编指令以使得软件保护失效等体验。

资源

  • 计算机课后作业,斯坦福大学计算机专业评选的历年来优秀作业作品。如果不知道自己编程需要练习什么的话,可以打开参考参考,很有实用价值,比起在 Leecode 上刷算法的题目,这些作业都在解决实际问题。

  • 互联网档案学术,全文检索索引包含超过2500万的研究文章和其他保存在互联网档案馆里的学术文档。 该馆藏涵盖从18世纪期刊的数字化副本,到最新的Open Access会议记录和从万维网上抓取的预印本。

  • PlayCanvas Web 优先的游戏引擎,一个免费的游戏引擎,倡导以 Web 优先,在网页中提供从开发到发行的全部流程支持。

  • 命令行会话记录器,Asciinema 是一个免费开源软件,用于帮助用户录制在命令行中的操作行为,便于在互联网上分发自己的操作示范、教学演示。比起直接视频录屏的方式,这种以字符方式的记录更加节约资源,无论是记录、传播还是回放环节,都很轻量。

  • 十分钟物理,这套教程集合了一组十分钟左右的视频短片,每次介绍一个基本的物理概念并通过 Web 前端技术编程实现模拟。除了视频之外,网站还提供了源代码、演示环境等配套资源。

  • Easy6502,一本学习 6502 汇编的电子书(没错,我就是特别喜欢这款 CPU)。网站带有交互界面,提供了一个简易模拟器,可以边学边练,教程最后会带你实现一个基于汇编的贪食蛇游戏。

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/2022-12-21-09-36-43.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/2022-12-21-09-36-43.png" new file mode 100644 index 000000000..d828c155d Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/2022-12-21-09-36-43.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/2022-12-21-09-49-07.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/2022-12-21-09-49-07.png" new file mode 100644 index 000000000..026187bd2 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/2022-12-21-09-49-07.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/2022-12-21-09-54-30.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/2022-12-21-09-54-30.png" new file mode 100644 index 000000000..286b7771e Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/2022-12-21-09-54-30.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/2022-12-21-10-03-35.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/2022-12-21-10-03-35.png" new file mode 100644 index 000000000..d19292b2b Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/2022-12-21-10-03-35.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/2022-12-21-10-12-18.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/2022-12-21-10-12-18.png" new file mode 100644 index 000000000..2e56fbb7a Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/2022-12-21-10-12-18.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/2022-12-21-10-14-33.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/2022-12-21-10-14-33.png" new file mode 100644 index 000000000..db4b17c99 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/2022-12-21-10-14-33.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/2022-12-21-10-20-26.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/2022-12-21-10-20-26.png" new file mode 100644 index 000000000..eab29b07f Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/2022-12-21-10-20-26.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/2022-12-21-10-23-10.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/2022-12-21-10-23-10.png" new file mode 100644 index 000000000..9f4e18857 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/2022-12-21-10-23-10.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/index.html" new file mode 100644 index 000000000..6d07dfaa8 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-013-\346\234\237/index.html" @@ -0,0 +1,10 @@ +机器文摘 第 013 期

机器文摘 第 013 期

机器文摘 第 013 期

机器文摘 第 013 期

长文

从古董电脑中我们能学到什么

我也不知道为什么自己会对老旧电脑,尤其是上世纪80年代、90年代出品的电脑这么迷恋。

我觉得那个时代的电脑散发着一种难以名状的工业气质。

通过阅读这篇文章,使我意识到一些深层次的原因。

这些老式电脑的魅力来自于当时技术的限制、简单粗暴和直接。

通过深入了解这些老古董、学习开发那个时代的软件,可以更容易地了解计算机科学。

毕竟,现在的计算机已经充分的复杂和“人性化”,软件把硬件包裹得越来越严实和抽象。以至于根本看不清它的内部构造和实现原理。

去研究那些古董电脑吧,操作那些裸漏单纯的硬件接口,贴近更加具体的科技。

这是一篇很富有哲理的小小说,严格来说跟机器没有关系。

但是写的实在是很好,忍不住收录进来。

毕竟,喜欢机器的人,很难抗拒这种对宇宙天马行空的探索。

RLHF 模型详解

近期 AI 圈最火的事情,莫过于 OpenAI 发布的聊天机器人 ChatGPT 了。

这个智能聊天机器人已经强大到可以让人担忧的地步了。

那么,它背后的实现原理是什么?

这篇文章讲解了 ChatGPT 所使用的 RLHF(人类反馈强化学习) 模型是如何实现的以及它的未来会怎样发展。

基于扩散模型生成音乐

基于文本生成图像的扩散模型已经火了一段时间了。

我当时还在想,既然基于扩散模型可以生成图像的话,那能不能生成声音呢?

结果我只是动了动念头,人家这边已经把成果拿出来了。

这篇文章介绍了他们基于扩散模型生成音乐的项目。

我试听了一下,效果还不错,挺神奇的。

资源

  • tmux 入门,一篇 tmux 的入门教程。tmux 是一个终端程序,可以同时模拟多个客户端控制台,如果觉得不好理解的话,可以认为它是一个控制台的多页签浏览器。因为在工作中经常需要 ssh 登录服务器进行编程开发,我现在已经离不开它了。

  • 一个有趣的个人网站,作者是一个日本在读博士生,网站放了一些个人的编程作品,主要跟物理模拟、像素艺术有关。

  • 你好,算法,一本开源电子书,可在线阅读,深入浅出讲解数据结构和算法,生动有趣,适合有一定编程基础但是算法这块有些薄弱的爱好者阅读。

  • 神经网络在线教程,一套神经网络编程教程,提供在线的 python 代码阅读环境,适合作为入门资料学习。

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-13-43-13.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-13-43-13.png" new file mode 100644 index 000000000..26f55a207 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-13-43-13.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-13-56-50.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-13-56-50.png" new file mode 100644 index 000000000..e999784a2 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-13-56-50.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-13-58-23.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-13-58-23.png" new file mode 100644 index 000000000..297505bb7 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-13-58-23.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-14-09-23.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-14-09-23.png" new file mode 100644 index 000000000..75ba435fc Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-14-09-23.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-14-16-52.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-14-16-52.png" new file mode 100644 index 000000000..f9466e206 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-14-16-52.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-14-25-49.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-14-25-49.png" new file mode 100644 index 000000000..4ce23eb23 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-14-25-49.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-14-33-08.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-14-33-08.png" new file mode 100644 index 000000000..8802fac14 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-14-33-08.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-14-59-31.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-14-59-31.png" new file mode 100644 index 000000000..596495756 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-14-59-31.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-15-05-15.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-15-05-15.png" new file mode 100644 index 000000000..f75578fb4 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/2022-12-27-15-05-15.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/index.html" new file mode 100644 index 000000000..ada83e214 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-014-\346\234\237/index.html" @@ -0,0 +1,11 @@ +机器文摘 第 014 期

机器文摘 第 014 期

机器文摘 第 014 期

机器文摘 第 014 期

长文

运行在单片机上的 Qt

尝试过给单片机写图形界面没有?

这篇 《Qt on MCU》 比较系统的介绍了“为什么选择 Qt(一套开源图形界面库) 给单片机做界面”、“Qt 的基本架构”、“程序移植性”等相关问题。

读完可以较为全面地了解在单片机这种机能较弱的硬件设备上制作图形界面的基本思路和需要关注的问题。

OpenWrt/LEDE 搭建 Syncthing p2p 私有文件同步服务

现在大家都不止一个电子终端设备,个人数字信息、各种数据文件的同步需求基本上是一个刚需。

有很多厂商提供了收费方案,比较常见的有国内的各种网盘、手机厂商提供的各种 Cloud 服务等等。

如果想基于家庭网络自己动手搭建一个私有服务的话,可能略微麻烦一些,不过也有较为成熟的方案了。

条件具备的话不妨参考这篇《OpenWrt/LEDE 搭建 Syncthing p2p 私有文件同步服务》动手试一试。

用 Flash 高清重制一款游戏

Flash 基本已经成为历史了。

即便现在可以通过一些渠道或者浏览器勉强开启 Flash 插件的话,也会提心掉胆地担心计算机的安全性。

毕竟那些恼人的弹窗广告有 80% 都是靠 Flash 技术实现的。

但是还有这么一群人,他们玩着 4399 上的小游戏长大,80 后喜欢的各种主机游戏在他们眼里根本不值一提,倒是网页上那种基于 Flash 制作的即开即玩的小游戏(比如我能想到的就有:黄金矿工、狂扁小朋友、打企鹅等等)才是他们的最爱。

Flash 技术被时代抛弃,那些 4399 们也就逐渐消失了。

不过总有人会拥抱情怀,这篇《为拯救童年回忆,开发者决定采用古法编程》便讲述了这样一个故事。

里面的哥们儿以极其硬核的方式实现了他的梦想,为了复刻一个 Flash 小游戏,他几乎重新写了一个 Flash 播放器。

Unix 终端系统(TTY)是如何工作的

没有使用过大型机而直接进入 PC 时代的计算机用户,可能觉得“终端”就是电脑上那个能够输入 CMD 命令的黑乎乎窗口吧。

即便是终日与命令行打交道的软件开发人员、系统运维人员,可能也很难一下子解释清楚什么是“终端”,它为什么叫这个名字。

这篇《Unix 终端系统(TTY)是如何工作的》从计算机硬件发展的历史出发,介绍了计算机系统跟用户交互的发展历程,并针对“终端”系统进行详细展开,讲解了实现原理和后来发展的现代形态。

喜欢硬核知识的朋友可点进去阅读一下。

HN 讨论:极大提升你效率的软件有哪些?

哪些软件最能节约你的时间、解放你的双手、使你离不开它?

这个话题几乎每过一段时间就会被拿出来讨论一番。

每个人都有自己的偏爱。

不过,看看大家的讨论,说不定也能发现一些新鲜的软件,也许能更新一下自己的工具库也说不定。

比如上面这篇帖子里,楼主提到的 这个 csv 工具 ,可以在命令行让你高效对 csv 文件进行快速检索、合并查询、切片等等。 +不过帖子里可能有人把节奏带偏了,在下面大吹特吹各种 IDE 软件,就仁者见仁了。

资源

  • SQlite源码分析,一本讲解 SQlite 源码的在线电子书,主要对 SQLite 数据库的实现机制和使用方法做了简要分析。

  • 经典复古 win98 游戏合集,一个游戏整合包,里面整合了若干在 Win98 系统下才能跑的老游戏,像初代的雷神之锤、半条命、极品飞车等等。提供了基于 DosBox 的虚拟系统,即开即用,性能还不错。

  • DOS 系统下的编程工具合集,想要重温在 DOS 环境下编程的感受,这里有一套比较全面的工具合集,包括 QBASIC、TurboC 等开发环境,以及一些用于游戏开发的图形库、引擎。

  • 给你自己跑个分,现在一些硬件评测动不动就使用软件进行跑分,用以展示硬件之间的形成差异,这个网站提供了一组小游戏,可以考验你的短期记忆力、反应能力,并给你打分。也试试给自己跑个分吧。

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/2023-01-03-13-43-13.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/2023-01-03-13-43-13.png" new file mode 100644 index 000000000..d05aa8910 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/2023-01-03-13-43-13.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/2023-01-03-13-45-15.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/2023-01-03-13-45-15.png" new file mode 100644 index 000000000..6749ae0dc Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/2023-01-03-13-45-15.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/2023-01-03-13-58-29.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/2023-01-03-13-58-29.png" new file mode 100644 index 000000000..f1cc5e0f7 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/2023-01-03-13-58-29.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/2023-01-03-14-14-17.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/2023-01-03-14-14-17.png" new file mode 100644 index 000000000..f2e7ff822 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/2023-01-03-14-14-17.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/2023-01-03-14-33-07.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/2023-01-03-14-33-07.png" new file mode 100644 index 000000000..6e57084ef Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/2023-01-03-14-33-07.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/2023-01-03-14-41-36.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/2023-01-03-14-41-36.png" new file mode 100644 index 000000000..83493e002 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/2023-01-03-14-41-36.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/2023-01-03-14-44-02.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/2023-01-03-14-44-02.png" new file mode 100644 index 000000000..a664f5342 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/2023-01-03-14-44-02.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/2023-01-03-14-47-42.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/2023-01-03-14-47-42.png" new file mode 100644 index 000000000..5ca456284 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/2023-01-03-14-47-42.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/index.html" new file mode 100644 index 000000000..41b58670f --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-015-\346\234\237/index.html" @@ -0,0 +1,10 @@ +机器文摘 第 015 期

机器文摘 第 015 期

机器文摘 第 015 期

机器文摘 第 015 期

长文

编程就是玩儿

对于程序员或者技术从业者来说,以一种什么样的心态工作将十分影响成果的产出。

这篇文章的作者给大家分享了他自己的感受—-“不把编程视为严肃的工作、目标只是玩得开心、为了好玩而编程”。

他同时也是 《为什么我喜欢做无用的东西》帖子的作者。

除了文章本身之外,在 HN 配套的讨论帖子在这里

这种类似于“寓教于乐”、“做自己开心的事儿”等等内容,一直是一个值得探讨的话题。

我个人也倾向于以兴趣和爱好来驱动自己,只是如果这个兴趣和爱好顺便能够挣钱,那就更好了。

WebAssembly:没有容器的 Docker

最近 Docker 宣布与 WasmEdge 合作支持 WebAssembly 。

WebAssembly 和 Docker 我们都听说过,在前面的文摘中我还尝试过自己使用 Rust 编写运行在网页里的 WebAssembly 应用程序。

Docker 也是我工作中每天都要用到的容器技术。

那他们两个有什么关系?放在一起能碰撞出什么火花?

这篇文章将讲解这两种技术的结合在云原生架构下的使用。

看来 WebAssembly 技术不仅可以在浏览器环境中发挥作用,还能在云计算、边缘计算等领域发光发热,前途不可限量嘛。

3D 摄影测量建模技术

3D 摄影测量建模,是一种通过对物体多角度拍摄照片,然后使用计算机通过软件算法合成为 3D 模型的技术。

从最开始在专业领域(如:建筑工程、考古)使用,到现在已经普及到普通人只需安装手机 App 也能轻松实现了。

这篇用3D摄影测量法对我的爷爷建模记述了作者如何使用 3D 摄影测量建模技术给自己爷爷的雕像进行“数字化”的过程。

里面详细记录了整个过程所使用的开源软件和相关的配置细节。

对于一些想要进行一次实操演练的朋友来说可能有用。

在 2D 游戏中如何模拟 3D 的光影效果

《守墓人》是一款经典的 2D 角色扮演游戏,比起它的精彩剧情和有趣的玩法,出色的画面效果也是该游戏取得成功的重要原因。

这篇《守墓人的图形效果是如何制作的》文章,由该游戏的核心开发者于 2018 年发表,讲述了很多关于实现在 2D 画面带来更加有立体光影效果的特殊技巧。

文章虽然老了一点,但是技术没有过时。

读进去可以深深体会到:一个优秀作品的创造,离不开对各种不可能的挑战和极限的突破。

资源

  • Flash 游戏大全,上一期里我摘录了一个关于复刻 Flash 游戏的故事。后来也勾起了我对于 Flash 小游戏的怀念。便深入探索了一下现在这个阶段该如何再去运行那些老游戏。Flashpoint 是一个 Web 游戏保存工程,号称已经累计保存了包括 Flash 在内的 35 个平台的超过十万个小游戏。这个工程在 2018 年 1 月启动,试图在 Flash 消亡之前将之前的经典内容进行备份。现在提供两种版本的下载包,一种全量下载的大概 1.3 TB,包含了全部游戏。一种增量下载的,700多MB,只带了部分游戏,但是支持随下随玩。

  • 根据音频自动生成钢琴旋律,一个开源的 AI 模型,可以根据歌曲的音频识别出里面的旋律主线,并且使用钢琴演奏出来,效果十分神奇。

  • C64 Emulator,一个在线的 commodore 64 电脑模拟器,可以直接将磁盘镜像拖拽到网页上进行加载,页面还提供了虚拟键盘。

  • 沙雕 App,收集了各种有趣网站、工具的导航站,之前就关注过,最近好像升级了,喜欢恶搞的同学可以到里面找到一些比较有恶趣味的小程序。

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/2023-01-10-13-16-50.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/2023-01-10-13-16-50.png" new file mode 100644 index 000000000..df90a9d5f Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/2023-01-10-13-16-50.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/2023-01-10-13-30-23.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/2023-01-10-13-30-23.png" new file mode 100644 index 000000000..18b3a3649 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/2023-01-10-13-30-23.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/2023-01-10-13-38-11.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/2023-01-10-13-38-11.png" new file mode 100644 index 000000000..031789728 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/2023-01-10-13-38-11.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/2023-01-10-13-55-02.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/2023-01-10-13-55-02.png" new file mode 100644 index 000000000..f63c10ba5 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/2023-01-10-13-55-02.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/2023-01-10-13-57-40.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/2023-01-10-13-57-40.png" new file mode 100644 index 000000000..2c55d4da5 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/2023-01-10-13-57-40.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/2023-01-10-14-01-04.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/2023-01-10-14-01-04.png" new file mode 100644 index 000000000..d2d8cc601 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/2023-01-10-14-01-04.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/2023-01-10-14-05-09.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/2023-01-10-14-05-09.png" new file mode 100644 index 000000000..e7b53bd06 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/2023-01-10-14-05-09.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/2023-01-10-14-11-28.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/2023-01-10-14-11-28.png" new file mode 100644 index 000000000..b7b467e0c Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/2023-01-10-14-11-28.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/index.html" new file mode 100644 index 000000000..e9a2b9fdb --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-016-\346\234\237/index.html" @@ -0,0 +1,13 @@ +机器文摘 第 016 期

机器文摘 第 016 期

机器文摘 第 016 期

机器文摘 第 016 期

长文

黑客与汽车

+现在的汽车很多都具有联网的能力,可以通过互联网进行便利的远程操作。

比如获取汽车位置、健康状态、远程启动、远程开门等等。

作为消费者来说,在使用这些便利功能的时候,内心是十分信任厂商的。

觉得安全问题肯定会被厂商非常重视,作为头号问题来抓。

然而这篇《黑客与汽车》却改变了我的看法,原来这些车联网的安全防护如此的脆弱。

文章作者为业内人士,写的还比较实在。如下列举部分这些黑客可以对车进行的未授权操作:

  1. 远程发动机启停、车门解锁与锁定、大灯闪烁、喇叭鸣笛;
  2. 锁定用户,迁移管理权;
  3. 根据车架号下载到用户的销售档案;
  4. 远程刷新更新车辆电脑固件;
  5. 跟踪车辆物理GPS位置;

看完我感觉是不是得把我的相关车联网服务给停一停了。

汇编代码阅读指南

+写汇编代码很麻烦,阅读起来也很费劲吗?

这儿有一份简要的汇编阅读指南,作者介绍了一些汇编代码的阅读技巧。

因为根据统计显示,最常用的汇编指令也就那么十来个,所以并没有想象中的那么晦涩和高深莫测。

使用 SVG 绘制逼真的绳索

+SVG 是在网页中进行矢量绘图的技术,比起 Canvas 画板的像素图像,SVG 具有放大不失真的特点,在网页中可以通过 Javascript 操作生成 SVG 图形对象,实现各种复杂的图案。

这篇文章的作者从几何的角度考虑了如何使用矢量图形来绘制一个现实中的麻绳图案,要不仅体现出绳索的扭曲,还要正确表现绳索分支之间的叠压,作者提出了一个巧妙的使用 SVG path 进行实现的方法。还给出了代码。

你要问作者为什么这么做,有什么用没有?我想作者可能会回答:Because I can !

SSH 进阶用法介绍

经常在 Linux 系统下进行开发或者运维的专业人士,可能每天使用最多的工具就是 SSH 了,每天都要通过它登录服务端系统,进行一系列的操作。

这里有一篇文章比较全面地介绍了 SSH 的进阶使用技巧,可以在某种程度上极大提升效率以及操作体验。

列举部分如下:

  1. 如何免密码登录;
  2. 如何映射服务端的服务端口到本地(以方便调试);
  3. 如何将服务端的图形界面(如xcalc)代理到本地电脑显示和交互(不是远程桌面哦);
  4. 一些网络端口映射之类的高级操作;

资源

  • 个人年终总结模板,我做了一个基于 Markdown 语法的年终总结模板,方便梳理在编写个人总结时的思路,放在 github 上的 gist 里了,可以随意使用。

  • web 网页设计博物馆,一个保存古老网页设计的网站。记录了 1999 年到 2020 年各大公司的网页设计变迁。包括谷歌、亚马逊、苹果、任天堂、麦当劳等等。

  • 一站式网页工具大全,一堆的在线工具汇总,包括图片处理、PDF格式转换、文字编码转换、密码生成、字符串加密解密等等,常用工具一网打尽。

  • 在线手柄测试工具,打开网页即可测试游戏手柄的工作状态,按键是否灵敏,遥感是否有死区等等,非常方便。

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-09-33-34.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-09-33-34.png" new file mode 100644 index 000000000..f3f1db68d Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-09-33-34.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-09-40-49.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-09-40-49.png" new file mode 100644 index 000000000..6e0b9f9bb Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-09-40-49.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-09-44-27.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-09-44-27.png" new file mode 100644 index 000000000..0f19478fa Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-09-44-27.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-09-55-28.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-09-55-28.png" new file mode 100644 index 000000000..4fcb2d17f Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-09-55-28.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-10-02-22.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-10-02-22.png" new file mode 100644 index 000000000..1b9536d84 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-10-02-22.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-10-04-26.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-10-04-26.png" new file mode 100644 index 000000000..74985f7f0 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-10-04-26.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-10-04-41.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-10-04-41.png" new file mode 100644 index 000000000..e87d0bca2 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-10-04-41.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-10-08-12.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-10-08-12.png" new file mode 100644 index 000000000..2f45f48b5 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-10-08-12.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-10-11-33.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-10-11-33.png" new file mode 100644 index 000000000..556799f4a Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-10-11-33.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-10-15-15.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-10-15-15.png" new file mode 100644 index 000000000..40721fef7 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/2023-01-16-10-15-15.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/index.html" new file mode 100644 index 000000000..0877c342f --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-017-\346\234\237/index.html" @@ -0,0 +1,14 @@ +机器文摘 第 017 期

机器文摘 第 017 期

机器文摘 第 017 期

机器文摘 第 017 期

预计春节期间暂停更新,节后恢复。

长文

怎样在 1 位色深的 LCD 屏幕上显示灰度

+只有 1 位色深的 LCD 屏幕按理说是不能显示灰度的,因为他的像素点要么纯黑、要么纯白,显示的图案效果肯定非常差。

如果说非要显示灰度的话,我第一个想法是通过抖动算法进行模拟(即通过像素点的稀疏程度来制造错觉,如下图)。 +

然而这篇文章的作者采取了更为巧妙地方法,使用 PWM (脉冲宽度调制)技术,利用每个像素点的点亮时间不同来制造灰度错觉。

之前只是见过使用 PWM 调整 LED 灯泡的亮度,像这种用法我倒是第一次见。

作为一名数据工程师和作家,我为什么要用 (Neo)vim

很多人都被 Vim 复杂的功能和陡峭的学习曲线吓到过。

也有很多人本着对效率的极致追求,而选择了征服 Vim,从而走上高效(折腾)的路线。

本文作者作为一名数据工程师,讲述了他学习 Vim 的心路历程,也许对于现在还在观望的人有所启发。

我个人使用 Vim 已十多年时间,虽然从未触及特别深入的技能(如宏定义、寄存器等),但是 Vim 这种神器的特点就是,只要你忍者难受越过操作的及格线,剩下的技能你稍微多掌握一点,就能马上给你带来非常丰厚的回报。

焦散是什么?如何正确地渲染焦散?

+焦散(Caustics)在现实生活中随处可见,但在渲染图中却很稀有。这篇文章解答了为什么渲染焦散很难,以及有哪些方法可以迂回实现。

找到这篇文章是因为我在 Github 上发现了一个使用 webgl 实现焦散渲染的项目,效果非常不错,于是想研究一下背后的原理。 +

资源

  • 常用设计模式有哪些,一本在线电子书,图文并茂,以比较直观的方式介绍了软件开发常用的设计模式,支持英文、日文、中文等多国语言。

  • 谷歌的软件工程,好几年前的一本书,讲述在谷歌做软件开发的体验和最佳实践,现在出了可免费阅读的电子版。

  • 开源低代码开发框架 ToolJet,免费开源的低代码开发框架,带有可视化编辑器,从数据持久化到前端界面全部无需编写代码。

  • 一个无聊的 Neovim 插件,一个没啥用的 Neovim 插件,唯一能做的事情是当你感到无聊时,可以将你的文本编辑区里的文本执行一个“元胞自动机”动画,看起来还算解压。

  • 最大的 AI 工具箱,喜欢研究 AI 的不要错过这个网站,收集了各种 AI 模型的开源项目和相关网址,涵盖了图像识别、自然语言处理等常见的、时兴的 AI 技术。

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-09-15-47.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-09-15-47.png" new file mode 100644 index 000000000..aaf39b165 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-09-15-47.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-09-24-01.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-09-24-01.png" new file mode 100644 index 000000000..66e5e0936 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-09-24-01.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-09-32-37.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-09-32-37.png" new file mode 100644 index 000000000..361f51197 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-09-32-37.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-09-40-20.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-09-40-20.png" new file mode 100644 index 000000000..12cd9749e Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-09-40-20.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-09-47-14.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-09-47-14.png" new file mode 100644 index 000000000..490d4df89 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-09-47-14.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-09-56-50.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-09-56-50.png" new file mode 100644 index 000000000..94ca568fb Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-09-56-50.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-10-00-55.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-10-00-55.png" new file mode 100644 index 000000000..c05127091 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-10-00-55.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-10-04-14.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-10-04-14.png" new file mode 100644 index 000000000..bbe0c20dd Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-10-04-14.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-10-08-42.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-10-08-42.png" new file mode 100644 index 000000000..ab606f375 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/2023-01-31-10-08-42.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/index.html" new file mode 100644 index 000000000..41e3fe8e2 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-018-\346\234\237/index.html" @@ -0,0 +1,17 @@ +机器文摘 第 018 期

机器文摘 第 018 期

机器文摘 第 018 期

机器文摘 第 018 期

长文

游戏高清重制《科林麦克雷拉力赛3》

+游戏高清重制一直是我比较感兴趣的话题,可能因为比较喜欢怀旧吧。

我曾经收藏过采用覆盖显示驱动的方式进行高清分辨率支持的《极品飞车 5》、《Quake 3》等游戏。

也见过一些更古老的游戏在更新资源包之后重新焕发青春。

不过一直没有接触过真正的重制过程。

这篇《重制科林麦克雷拉力赛》详细记录了一个优秀的赛车游戏进行高清重制的过程。

可以带你了解老旧游戏如何进行“宽屏”、“超宽屏”支持,如何重制高清界面UI元素等,过程充满了对不可能的挑战。

把网页渲染到控制台

+通过控制台窗口进行上网,你可能觉得并不新鲜。

毕竟已经有很多类似 w3m 这种在控制台下基于字符的浏览器程序。

但是他们的缺点都是不能显示图形,而且几乎失去了对页面的样式渲染。

今天这篇《把网页渲染到控制台》则另辟蹊径,虽然同样是在控制台的字符界面,但是渲染手段却大不相同。

它将控制台字符当作单个像素来处理,采用现代浏览器内核进行页面解析和预渲染计算。

然后在像素渲染阶段,采用了控制台字符来进行替换。

虽然最终效果无法跟图形界面下的浏览器相比。

但是它毕竟提供了一种在终端控制台进行图形化网页显示的可能。

Chromium 渲染流水线——字节码到像素的一生

+看了前面网页渲染到控制台的文章,如果对浏览器的原理架构比较感兴趣的话。

可以看看这篇讲解 Chromium 浏览器渲染架构的文章。

现代浏览器已经复杂到不可能通过个人从零开始实现。

了解一下他们的架构,即便不从事相关开发,也可能对自己的软件架构产生有益影响。

99 行代码实现光线追踪

+光线追踪在图形渲染中十分关键的概念。

同时也是现代电影工业实现逼真光照渲染所必须的技术手段。

然而它的原理却并不复杂,甚至只需少量代码就可以自己实现一个建议的渲染器。

这篇《99 行代码实现光线追踪》就只是用了少量 C++ 代码实现了一个简单的带有全局光照、阴影、反射的场景渲染。

虽然看起来简单,效果还是很令人惊艳的。

适合我这种喜欢研究原理,但又不太深入的“技术爱好者”。

光线追踪深入

+既然前面提到了光线追踪,不妨再引申一下。

很多光线追踪的入门教程都会教你渲染一些简单的模型,比如球体,圆柱体等等。

如果想基于光线追踪技术渲染复杂一些的三维模型,应该怎么做?

这里有一篇《光线行进和符号距离函数》,里面介绍了基于光线行进算法(光线追踪的一种实现方式)和符号距离函数来构建三维场景中复杂模型的思路。

内容比较详细,并带有示例代码。

资源

  • chronophoto,一个猜照片年代的游戏,根据网站随机展示的老照片,来判断这张照片是哪一年拍摄的,答案区间 1900 到 2020 ,我试了试还挺有意思,可以根据照片中出现的物品和人物的衣着进行分析。

  • Gimel Studio,一个基于节点系统的照片后期处理工具,开源,采用 Python 编写。

  • BugChecker,一个支持 Windows 11 的类 SoftICE 调试器,开源。 +

  • swiftshader,一个基于 CPU 实现 OpenGL 渲染的图形库。主要应用在谷歌开源的 chromium 项目里,用纯软件算法实现了OpenGL、Vulkan图形接口。 +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/2023-02-07-13-19-34.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/2023-02-07-13-19-34.png" new file mode 100644 index 000000000..6152d3bd3 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/2023-02-07-13-19-34.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/2023-02-07-13-32-44.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/2023-02-07-13-32-44.png" new file mode 100644 index 000000000..e85c3f887 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/2023-02-07-13-32-44.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/2023-02-07-13-49-28.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/2023-02-07-13-49-28.png" new file mode 100644 index 000000000..ede0a09bb Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/2023-02-07-13-49-28.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/2023-02-07-13-57-37.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/2023-02-07-13-57-37.png" new file mode 100644 index 000000000..779589d37 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/2023-02-07-13-57-37.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/2023-02-07-14-10-37.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/2023-02-07-14-10-37.png" new file mode 100644 index 000000000..9c52301ca Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/2023-02-07-14-10-37.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/2023-02-07-14-20-36.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/2023-02-07-14-20-36.png" new file mode 100644 index 000000000..0c1332ec8 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/2023-02-07-14-20-36.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/2023-02-07-14-25-38.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/2023-02-07-14-25-38.png" new file mode 100644 index 000000000..1d2166f82 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/2023-02-07-14-25-38.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/2023-02-07-14-26-39.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/2023-02-07-14-26-39.png" new file mode 100644 index 000000000..4c0b09873 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/2023-02-07-14-26-39.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/index.html" new file mode 100644 index 000000000..b79340dae --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-019-\346\234\237/index.html" @@ -0,0 +1,18 @@ +机器文摘 第 019 期

机器文摘 第 019 期

机器文摘 第 019 期

机器文摘 第 019 期

长文

现阶段 AI 能对游戏开发提供多大帮助

+AI 在最近有多爆发自然不用我再赘述,抛开那些狂热的能够引起焦虑的言论(比如 AI 即将替代大量工作岗位),也有不少人选择跟 AI 和平相处。

这篇《AI 辅助图形》的作者是一个有着游戏制作二十年经验的从业者,近期想尝试尽可能地利用各种 AI 加持的辅助工具,试图通过他们提升制作效率。

作者从游戏的概念原型阶段,一直到三维模型资产的制作和游戏场景的搭建,均选用了具有 AI 能力的效率工具进行支持。

最终结论是,虽然在过程中会有这样那样的不顺手,但这些工具确实能够帮助他节约大量工作时长。

所以作者的看法是,他很愿意将 AI 工具看作他的同事。

照这么说的话,留给人类的工作真的是不多了。

ChatGPT 学习笔记

+ChatGPT 在春节后又起了一波热度。

网上到处都是关于它的段子,有人用它写论文,有人拿来给孩子辅导作业,有人写情书,有人当个动嘴的甲方让它写程序。

喜得微软恨不得现在就把它接到搜索引擎里,逼得谷歌提前释放出自己的类似模型。

国内的百度也表示将在3月份发出自己的大规模语言模型。

要我说就不要这么着急,不妨拨开迷雾,看看 ChatGPT 是个什么东东。

在网上发现这篇《ChatGPT 通俗笔记》,讲述了这个模型的发展历程,以及一些基本的概念原理。

此类中文资料不多,给这篇文章作者点赞。

视觉设计的一些规则

+现在专业的界限越来越模糊,每个人都应该掌握一些基本的设计理念,以便在日常工作中输出的成果具备基本的美感。

这篇《视觉设计安全法则》,浅显易读、明确具体,对于视觉设计活动很有指导意义。

看完之后无论是自己动手做 PPT 还是软件的 demo 原型,都可以用到。

我觉得甚至对于摄影构图、房屋装修都能有所借鉴,因为美是相通的。

Python 做后端开发的技术选型

+有时候想做一些 Web 应用的原型,Python 是我的首选语言,写起来顺手又省事,能节约不少时间。

但是由于用的不够深入,在选择开发框架的时候,稍微有些困惑。

比如同样都能提供快速的开发能力,Fastapi 和 Flask到底选哪个?

如果你也有跟我一样的疑惑,可以看看这篇《Fastapi 和 Flask 详细对比》

文章深度分析了这两个框架的异同以及所适用的工作场景。

资源

  • YouPlot,控制台绘图工具,可以在控制台窗口用字符的方式进行绘图,支持柱状图、散点图等。 +

  • 网页在线联机 CS1.6,只需浏览器即可联机玩反恐精英 1.6,这个网站通过 WASM 技术将 CS 1.6 移植到了网页中运行,现代浏览器均可支持,第一次加载时间略长,但体验还算流畅,在线人员数量也挺多,随时可以匹配到。 +

  • 交互式 SVG 参考,一个可以在线了解 SVG 图形标准细节的网站,提供交互式界面进行实时演示。 +

  • 浏览器地址栏里的动画,一个有意思的 Js 库,通过动态修改浏览器地址栏的 URL 地址来实现动画,效果还比较萌。 +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-020-\346\234\237/2023-02-15-09-57-43.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-020-\346\234\237/2023-02-15-09-57-43.png" new file mode 100644 index 000000000..2fff97ffb Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-020-\346\234\237/2023-02-15-09-57-43.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-020-\346\234\237/2023-02-15-10-21-45.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-020-\346\234\237/2023-02-15-10-21-45.png" new file mode 100644 index 000000000..b16384855 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-020-\346\234\237/2023-02-15-10-21-45.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-020-\346\234\237/2023-02-15-10-40-28.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-020-\346\234\237/2023-02-15-10-40-28.png" new file mode 100644 index 000000000..cedb0fe36 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-020-\346\234\237/2023-02-15-10-40-28.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-020-\346\234\237/2023-02-15-10-51-53.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-020-\346\234\237/2023-02-15-10-51-53.png" new file mode 100644 index 000000000..1280bc774 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-020-\346\234\237/2023-02-15-10-51-53.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-020-\346\234\237/2023-02-15-10-55-30.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-020-\346\234\237/2023-02-15-10-55-30.png" new file mode 100644 index 000000000..849d3f816 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-020-\346\234\237/2023-02-15-10-55-30.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-020-\346\234\237/2023-02-15-10-59-08.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-020-\346\234\237/2023-02-15-10-59-08.png" new file mode 100644 index 000000000..1328c8737 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-020-\346\234\237/2023-02-15-10-59-08.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-020-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-020-\346\234\237/index.html" new file mode 100644 index 000000000..569ff26be --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-020-\346\234\237/index.html" @@ -0,0 +1,16 @@ +机器文摘 第 020 期

机器文摘 第 020 期

机器文摘 第 020 期

机器文摘 第 020 期

长文

怎样获得非凡成就

+多年来,我对成功学嗤之以鼻。

但也对有些人的成功给予应有的尊重。

我所欣赏的成功人士有一种特殊气质,我说不上来具体是什么特点,有点儿像反叛精神,又有点儿对手工技术的狂热。

这些人里对我影响比较大的是《黑客与画家》的作者 保罗·格雷厄姆(Paul Graham)。

他创建了著名的 YC 孵化器公司,也打造了很多成功的产品。

今天推荐的这篇文章《How To Be Successful》的作者,是保罗·格雷厄姆非常推崇的一位创业者。

文章分享的观点乍看有成功学的影子,但读完却能引人思考。

这里是中文翻译版:《观察成千上万创业者后,关于如何获得非凡成就的13条思考》

我觉得这些观点至少可以给长期埋头技术工作的人们一些启发,我稍微列举几条如下:

  • 这个世界很少人能做到将眼光放长远,而那些有长远眼光的人会得到市场的丰厚回报。
  • 把时间花在做正确的事上,比花长时间进行工作更重要。
  • 跟着你的好奇心走。因为对你来说兴奋的事情对其他人来说也同样兴奋。
  • 成为内驱型的人(即:自己去做一件事的原因来自于自己,而不是外部的力量或别人的期望)。

怎样在客厅建立自己的私人影院

+智能电视或者智能盒子已成为现在客厅的标配。

如何充分发挥它们的作用,早已是技术爱好者的孜孜不倦探索的课题。

前些天我偶然收到一份公开的云盘链接,使用开源的 AList(一个支持网盘存储的文件列表程序,可以通过多种协议将网盘映射为本地访问的存储路径) 进行构建。里面整理了大量的影视资源,有不少是高质量、高码率的蓝光原盘文件。

这就激发了我的好奇心。

由于自己一直按耐住折腾 NAS 的念头,这些年一直没有收集电影。

但现在既然有在线的资源,不妨尝试一下。

于是我找到了这篇《利用KODI和云盘打造4K高清私人云影院》(仅作研究,观影和收藏还需支持正版)。

按照文章的指导,成功给电视安装了 KODI(一个媒体中心 App),并进行了配置,可以非常方便地浏览、观看互联网云盘上的高清电影。

比起云盘官方所出品的各种 App 在体验上更加灵活、完美。

“噪声”在计算机图形学里的作用

+想要计算机产生的图形更加的接近自然,生成各式各样的噪声是必不可少的算法。

之前在读《The Nature of Code》(中文译作:代码本色)一书的时候,作者花了大量篇幅讲解关于噪声、随机等对于模拟自然界中各种现象的重要作用。

或许在噪声里就隐藏着大自然最深处的秘密。

这篇WebGL进阶——走进图形噪声可以让你领略一些图形噪声的神奇。

很多场景都给出了 WebGL 实现的源码,可以边学边练。

资源

  • ThreeGN,一个基于网页的三维建模程序,特点是具有类似 Blender 的几何节点编辑功能。 +

  • tabler,一个开源的图标库,可用于 Web 或 移动端应用开发,全部免费使用。 +

  • immersive-translate,一个在线翻译浏览器插件,支持 Edge、Firefox、Chrome 等浏览器,优点是可以在网页上追加中文显示,原文和译文同时展示,对于想提升外语水平的人士,是个不错的对照工具。 +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/2023-02-22-14-57-11.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/2023-02-22-14-57-11.png" new file mode 100644 index 000000000..a7b4240bf Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/2023-02-22-14-57-11.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/2023-02-22-15-13-37.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/2023-02-22-15-13-37.png" new file mode 100644 index 000000000..ef51ee8a4 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/2023-02-22-15-13-37.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/2023-02-22-15-28-10.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/2023-02-22-15-28-10.png" new file mode 100644 index 000000000..60c7ed4d2 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/2023-02-22-15-28-10.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/2023-02-22-15-37-36.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/2023-02-22-15-37-36.png" new file mode 100644 index 000000000..61bf70681 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/2023-02-22-15-37-36.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/2023-02-22-15-45-42.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/2023-02-22-15-45-42.png" new file mode 100644 index 000000000..04121ae45 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/2023-02-22-15-45-42.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/2023-02-22-15-47-30.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/2023-02-22-15-47-30.png" new file mode 100644 index 000000000..e5b0a2247 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/2023-02-22-15-47-30.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/2023-02-22-15-50-17.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/2023-02-22-15-50-17.png" new file mode 100644 index 000000000..f2cf56330 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/2023-02-22-15-50-17.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/2023-02-22-15-56-55.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/2023-02-22-15-56-55.png" new file mode 100644 index 000000000..0b4968f5e Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/2023-02-22-15-56-55.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/index.html" new file mode 100644 index 000000000..889f40036 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-021-\346\234\237/index.html" @@ -0,0 +1,18 @@ +机器文摘 第 021 期

机器文摘 第 021 期

机器文摘 第 021 期

机器文摘 第 021 期

长文

chatGPT 原理通俗讲解

+可能是有人炒作的缘故,chatGPT 热度一直不降,连街边买菜的大妈都在讨论这个“人工智能机器人”。

可能是它输出语言的流畅度实在是太接近真实的人类了,用惯了之前那种“智能助理”的人很容易感到震惊。

然而其背后的原理并非像想象的那么复杂,甚至是大力出奇迹的又一个经典样例。

最近关于它的文章也是铺天盖地,各种分析、叫好,很少有冷静下来探讨其背后机理的。

我翻看了几篇之后,发现唯有这篇《chatGPT在做什么以及它为什么好使》 比较优秀。读起来比较平和,没有压力。

文章揭示了即使像chatGPT这样的大型语言模型也是一个单词一个单词慢慢往出崩的,并尝试说清楚这么流畅的语言是基于什么来预测后续单词的概率。

怎样利用多GPU训练真正的大型模型

+前面提到的 chatGPT 模型,体量非常大,据说训练一次就要耗费上千万美元。

作为普通开发者我们是不敢奢望自己上手训练一番。

不过,这里有一篇文章可以让我了解像这样的大模型是如何进行并行训练的

另外还有个开源的项目,号称可以在较少资源的基础设施上进行 GPT 模型训练,有兴趣的可以试试。

怎样搭建一个电子爱好者工作间

+拥有一个电子产品工作室一直是我的一个梦想。

电烙铁、稳压电源、万用表,是我能想到的最基本的设备。

如果还想更完美,可以借鉴这篇文章所介绍的思路,搭建一个电子爱好者工作间

运气计算公式

+看到一个关于运气的文章《如何获得好运气》,觉得里面提到的“怎样使得随机的运气变得让好运更加倾向于你”的说法比较有意思。

于是就收录一下。

文章里探讨的问题,很容易让我联想到关于“下雨的时候是飞速跑动淋雨多还是慢慢走淋雨多”的问题。

资源

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/2023-03-01-10-51-39.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/2023-03-01-10-51-39.png" new file mode 100644 index 000000000..41c7dceb5 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/2023-03-01-10-51-39.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/2023-03-01-11-06-53.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/2023-03-01-11-06-53.png" new file mode 100644 index 000000000..65ea17e95 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/2023-03-01-11-06-53.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/2023-03-01-13-24-45.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/2023-03-01-13-24-45.png" new file mode 100644 index 000000000..2660b9f8e Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/2023-03-01-13-24-45.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/2023-03-01-13-35-29.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/2023-03-01-13-35-29.png" new file mode 100644 index 000000000..e0857d26b Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/2023-03-01-13-35-29.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/2023-03-01-13-47-03.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/2023-03-01-13-47-03.png" new file mode 100644 index 000000000..2de8c1af8 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/2023-03-01-13-47-03.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/2023-03-01-13-52-29.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/2023-03-01-13-52-29.png" new file mode 100644 index 000000000..465f5ff2e Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/2023-03-01-13-52-29.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/2023-03-01-13-54-53.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/2023-03-01-13-54-53.png" new file mode 100644 index 000000000..70be18f9f Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/2023-03-01-13-54-53.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/2023-03-01-14-03-29.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/2023-03-01-14-03-29.png" new file mode 100644 index 000000000..753c39e6c Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/2023-03-01-14-03-29.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/index.html" new file mode 100644 index 000000000..a17329607 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-022-\346\234\237/index.html" @@ -0,0 +1,18 @@ +机器文摘 第 022 期

机器文摘 第 022 期

机器文摘 第 022 期

机器文摘 第 022 期

长文

自制家庭服务器

+人们常说,中年技术男的最终归宿除了钓鱼和盘核桃之外,还有一项就是折腾家里的服务器,这些服务器形态各异,但是作用都是殊途同归:NAS、软路由、虚拟化、Docker容器。

怎样变着花样搭建家庭服务器几乎是 V 站的月经甚至日经话题。

这里有个国外的老哥,决定使用 ARM64 架构自己“装配”一个,是那种需要焊接的“装配”。

有兴趣的可以翻阅一下这篇《构建 ARM64 家庭服务器》

文章介绍了如何用一种较为困难的方式构建一个 ARM64 架构的家用服务器。

作者使用了一块名为 ROCKPro64 的开发板,并详细介绍了构建过程中遇到的问题以及如何解决这些问题。

文章中包含了安装基础操作系统、配置网络连接、设置磁盘阵列和安装各种软件的详细步骤和指导,涵盖了从硬件到软件的多个方面。

在构建过程中,作者提到了一些常见的问题和解决方法,例如如何处理不同操作系统的差异,如何在开发板上设置固件,以及如何解决硬件不兼容问题。

总之,这篇文章是一份详细的指南,可以帮助有兴趣构建自己的家用服务器的读者了解基础知识,克服可能遇到的问题,并学习如何从头开始构建一个高效、安全的服务器。

上面这段是让 chatGPT 帮我写的 :)

用Rust写一个大小仅有2K的极简FPS游戏

+极简渲染器的编写教程网上有很多,但大都浅尝辄止,以静态渲染为主。

这篇文章则从制作一个第一人称射击游戏的视角出发,讲解了怎样使用光线投射技术实现最基本的三维空间渲染、光照、阴影等效果。

作者使用 Rust 语言基于 wasm 技术编写了一个在网页中运行的示例程序,该程序非常小巧,但是也充分展现了如何使用光线投射算法来实现 3D 渲染技术仲的一些基本概念,比如:墙体贴图、视角控制等。

是我看到的教程里比较系统的一个,适合作为爱好者去研究。

玩具 CPU 模拟器

+国外一个大学老师觉得他的计算机组成原理课程有些枯燥,于是他动手撸了一个 CPU 模拟器出来,以帮助学生们更好的理解计算机内部运作原理。

作者在文章里介绍了基本的原理,以及模拟器的各个组件,适合学习底层原理初入门的学生。

另外这个模拟器也基于 MIT 协议进行了开源,文章中附有开源仓库的地址和编译好的可执行文件下载连接。

需要注意的是该程序运行环境为DOS,现在要想体验的话,需要先安装 DosBOX 这个模拟器。

不用任何构建系统编写前端代码

+比起十几年前,前端开发工程现在已经变得十分复杂。

有次我想写个简单的页面程序,但是却花费了一上午的时间陷入对框架和构建系统的选择上。

后来不得不放弃,改用记事本随便用原生Javascript完成了功能。

这篇文章的作者跟我有同样的感受。

作者认为,对于一些简单的项目来说,使用构建系统可能是不必要的。

因为构建系统会增加开发和维护的复杂性,而且可能会导致一些性能问题。

文章演示了作者如何使用原生的Javascript和浏览器的开发者工具来实现一些常见的构建系统功能。

资源

  • 计算机知识笔记,一个计算机科学知识笔记仓库,包括计算机基础知识、编程语言和算法、开发工具、面试笔试题目等等,是一个非常实用的笔记库。目前在 Github 上有超过 162k 个 star 。 +
  • Creating Demos,这套教程是 Hugi 杂志在2001年第31期发布的一系列编程文章,主题是“Demo程序”的制作,是我目前在网络上见到的比较完整和耐心的一套讲解 Demoscene 如何制作的教程。虽然有些技术是老旧的,但是思想一直是不变的,能够学到很多平时很难了解到的东西,现在很少有人愿意分享这些了。 +
  • 网络视频下载器,一个 go 语言编写的网络音视频资源下载工具,类似 youtube-dl,但是支持的网站要更多一些。 +
  • ambient,Ambient是一个使用 WebAssembly、Rust 和 WebGPU 技术构建的高性能多人游戏和3D应用的开源引擎。特点是针对构建多人游戏开发进行优化支持。 +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/2023-03-08-10-10-45.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/2023-03-08-10-10-45.png" new file mode 100644 index 000000000..0cdc654de Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/2023-03-08-10-10-45.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/2023-03-08-10-34-20.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/2023-03-08-10-34-20.png" new file mode 100644 index 000000000..194c85401 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/2023-03-08-10-34-20.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/2023-03-08-10-43-47.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/2023-03-08-10-43-47.png" new file mode 100644 index 000000000..8c32ea801 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/2023-03-08-10-43-47.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/2023-03-08-10-58-53.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/2023-03-08-10-58-53.png" new file mode 100644 index 000000000..7d171ae4f Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/2023-03-08-10-58-53.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/2023-03-08-11-01-19.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/2023-03-08-11-01-19.png" new file mode 100644 index 000000000..0966429a5 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/2023-03-08-11-01-19.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/2023-03-08-11-02-12.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/2023-03-08-11-02-12.png" new file mode 100644 index 000000000..1c88f6f88 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/2023-03-08-11-02-12.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/2023-03-08-11-06-33.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/2023-03-08-11-06-33.png" new file mode 100644 index 000000000..85d4673d9 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/2023-03-08-11-06-33.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/2023-03-08-11-08-29.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/2023-03-08-11-08-29.png" new file mode 100644 index 000000000..c93946953 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/2023-03-08-11-08-29.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/index.html" new file mode 100644 index 000000000..deb05e042 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-023-\346\234\237/index.html" @@ -0,0 +1,19 @@ +机器文摘 第 023 期

机器文摘 第 023 期

机器文摘 第 023 期

机器文摘 第 023 期

长文

视频信号可以被窃听吗?

+我之前听到过一个传说。

使用高灵敏度的天线,再加上一些奇妙的设备。

可以窃听(窃视?)到附近(方圆数百米)范围之内的显示器显示的内容。

这个传说流传的时候,还是CRT显示器的时代,当时的视频接口主要是VGA,采用模拟信号进行传输。

如果显示器或者视频线缆所作的屏蔽不够充分的话,难免会有信号泄露。

而VGA信号又没有任何加密,被别有用心的人收看是有一定的可能的。

时间发展到今天,视频接口早已升级,我以为除非不小心无线投屏到了邻居家,否则就不会有视频内容泄露的情况。

然而,今天要说的这篇文章则证实了上述传说的可能。

不过,比起传说中的窃听,作者走的更远一些。

起因是作者在家里摆弄无线电的时候,发现了一个信号干扰源,最后发现来自他的一个树莓派设备。

于是经过一番操作,作者不但成功通过无线接收的方式将视频信号显示了出来。

还利用这种无线信号的干扰(或泄露?)实现了叠加数据的传输。

怎样用密码保护一个静态页面?

+说到网站上的数据权限保护,一般我们会需要后端程序配合。

比如使用账号系统,给用户角色分配不同的权限,使其访问后端接口时获取不同的数据。

如果没有后台程序,只有静态页面会怎样?

这儿有个开源工具,可以帮你生成带有密码保护的静态HTML页面

具体使用方法和原理也很简单。

输入你想设置的密码和你的HTML页面原始代码,这个工具可以使用AES-256加密算法对其进行加密。

然后在浏览器加载时,页面自动使用一个js库实现自解密。

这个方法用于临时保护一些静态的内容还是挺有效的,而且很方便。

写代码越“干净”越好吗?

+有不少人宣称自己有代码“洁癖”。

对于设计模式和面向对象有着非常深的执念(或者函数式编程也是)。

市面上也充斥着很多“之美”、“之道”、“之禅”之类的书籍,强调代码要给人读、整洁干净。

我并不反对上述观点,甚至自己也有一点这样的“洁癖”,只是有时内心会有一丝怀疑的时候,觉得如果过于追求某些东西可能会偏离了解决问题的根本目标。

这篇《“干净”的代码,糟糕的性能》,帮我吐槽了一些事情。

但作者在文中所举的例子稍微有些牵强,不必过于纠结。

不知道怎么练习编程怎么办

+经常有人困惑在学习了一门新的编程语言之后,不知该做些什么。

就像是掌握了词语却写不出好的小说,掌握了规则也下不好象棋。

我们从小受到的教育方式导致了,在学习技能这一块,缺失实践的动力和方法。

这篇给无目标的新手程序的一些建议,虽然内容不多,但是可以看出作者也是个老油条了。

给出的一些提示都很实在,对于技能练习方面,提的都是我希望我能遵从的。

比如:

用技能解决你实际生活中的问题。 +做一些你真正会用到的东西。

资源

  • 写给 React 开发者的 TypeScript 指南,针对React程序员的TypeScript的学习资料,解答了我一部分为什么要用TS的问题。 +
  • Method of Action,一些免费的工具和在线小游戏(颜色搭配、贝塞尔曲线等),可以帮助你学习和掌握设计理念和工具。 +
  • Archivebox,一套开源的互联网内容保存方案,可以将你喜欢的页面下载下来,并自动爬取相关链接、图片等内容,类似于互联网档案馆的https://archive.org,不过可以自己搭建。 +
  • History of Computer Graphics and Animation,一本讲解计算机图形和动画发展历程的电子书,里面记录了计算机图形学相关的许多参考资料,曾用于俄亥俄州立大学的授课。 +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-024-\346\234\237/2023-03-15-09-18-01.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-024-\346\234\237/2023-03-15-09-18-01.png" new file mode 100644 index 000000000..6d607c195 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-024-\346\234\237/2023-03-15-09-18-01.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-024-\346\234\237/2023-03-15-09-32-20.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-024-\346\234\237/2023-03-15-09-32-20.png" new file mode 100644 index 000000000..22c20305d Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-024-\346\234\237/2023-03-15-09-32-20.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-024-\346\234\237/2023-03-15-09-45-46.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-024-\346\234\237/2023-03-15-09-45-46.png" new file mode 100644 index 000000000..6a787f4d9 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-024-\346\234\237/2023-03-15-09-45-46.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-024-\346\234\237/2023-03-15-10-10-50.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-024-\346\234\237/2023-03-15-10-10-50.png" new file mode 100644 index 000000000..a8b9d5074 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-024-\346\234\237/2023-03-15-10-10-50.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-024-\346\234\237/2023-03-15-10-13-25.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-024-\346\234\237/2023-03-15-10-13-25.png" new file mode 100644 index 000000000..b09ad43c2 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-024-\346\234\237/2023-03-15-10-13-25.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-024-\346\234\237/2023-03-15-10-16-17.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-024-\346\234\237/2023-03-15-10-16-17.png" new file mode 100644 index 000000000..861ef164f Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-024-\346\234\237/2023-03-15-10-16-17.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-024-\346\234\237/2023-03-15-10-18-09.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-024-\346\234\237/2023-03-15-10-18-09.png" new file mode 100644 index 000000000..adbf4d3cc Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-024-\346\234\237/2023-03-15-10-18-09.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-024-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-024-\346\234\237/index.html" new file mode 100644 index 000000000..e3ffa18d2 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-024-\346\234\237/index.html" @@ -0,0 +1,17 @@ +机器文摘 第 024 期

机器文摘 第 024 期

机器文摘 第 024 期

机器文摘 第 024 期

长文

电池充一次可以用两年的“笔记本”电脑

+挪威软件开发商安德烈亚斯·埃里克森(Andreas Eriksen)组装了一款笔记本电脑(或者说便携膝上型电脑?)。

它拥有“以年为单位的电池寿命”,并且使用用Lisp编程系统界面,产品名为:PotatoP

CPU好像是个ARM架构的低功耗单核处理器,最高频率96MHz。

支持蓝牙5.0。

运行的系统为PotatOS,一个基于uLisp(一个专门为微控制器设计的Lisp)移植的专用系统。

使用的4.4英寸显示屏采用介于LCD和墨水屏之间的技术,省电。

再加上机身上还带有太阳能电池,据说如果环境光充足的话,可以连续运行两年。

详解 AMD 为 Steam Deck 开发的 APU

+Steam Deck 无疑是一款革命性的掌机。

如果不是价格在国内被炒的离谱,我定会入手一台,也许再观望一下等待第二代或者三代产品更好。

这款掌机使得在便携设备上游玩3A大作不再是幻想。

取得这样的表现,除了得益于V厂魔改的Linux系统之外,还离不开这块由AMD定制的、代号“梵高”的 APU。

这篇《“梵高”AMD的Steam Deck APU》详细介绍了这块APU的各种技术细节,解释了为什么Steam Deck可以做到低功耗的同时还拥有相当给力的图形性能。

用磁盘阵列(RAID)确保数据安全靠谱吗?

+再谈谈 NAS 的事情(中年技术男的三大爱好之一)。

像我这样的人,对于 RAID 磁盘阵列总是抱有美好的幻想。我们认为,只要将数据存放在经过合理规划的磁盘阵列中(例如 RAID 5),我们就可以高枕无忧,确保数据永远不会丢失。然而,实际上,磁盘阵列并不是备份数据的最佳选择,最佳的数据安全策略是异地多份存储。

尽管 RAID 5 宣称随便损坏一块硬盘也不要紧,只需更换一块正常盘即可,但这种理想状态可能不太容易实现,中间随时可能会出现其他状况导致数据永久丢失。

一篇名为《差点儿就又全没了》的博文,讲述了作者在使用 NAS 磁盘阵列时经历了一次惊险刺激的数据拯救过程。希望这篇文章能够给计划使用类似方式保存数据的朋友们一个平常心态。

资源

  • NESFab,一个专为开发任天堂8位游戏机(NES、FC)设计的编程语言。具有高性能、易于装载资源、自动内存地址切换等特性,作者还在主页提供了一个使用NESFab开发游戏的教程。 +
  • AstroNvim,一套即开即用的Nvim配置文件,主打界面美观,集成了文件浏览、代码补全、语法高亮、模糊查询、可视化调试等常用插件配置。对于新手和懒得折腾的人来说,可以尝试。 +
  • pynecone,一个用python开发的web应用框架,特点是使用python语言完成所有任务,包括前端和后端,可以帮助那些对于前端开发不太擅长的人更方便地制作web应用程序。 +
  • 函数式编程入门,一篇介绍函数式编程的文章,介绍了函数式编程的基本概念和一些重要的函数式编程概念,并使用Javascript演示了如何使用这些概念进行函数式编程。 +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/2023-03-22-10-25-42.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/2023-03-22-10-25-42.png" new file mode 100644 index 000000000..413646118 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/2023-03-22-10-25-42.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/2023-03-22-10-35-52.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/2023-03-22-10-35-52.png" new file mode 100644 index 000000000..248dc278d Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/2023-03-22-10-35-52.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/2023-03-22-10-50-45.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/2023-03-22-10-50-45.png" new file mode 100644 index 000000000..cae6ff062 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/2023-03-22-10-50-45.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/2023-03-22-10-59-28.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/2023-03-22-10-59-28.png" new file mode 100644 index 000000000..6fe82775d Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/2023-03-22-10-59-28.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/2023-03-22-11-05-16.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/2023-03-22-11-05-16.png" new file mode 100644 index 000000000..8c1d32d00 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/2023-03-22-11-05-16.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/2023-03-22-11-09-51.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/2023-03-22-11-09-51.png" new file mode 100644 index 000000000..ea0453051 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/2023-03-22-11-09-51.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/2023-03-22-11-12-45.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/2023-03-22-11-12-45.png" new file mode 100644 index 000000000..dab11a247 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/2023-03-22-11-12-45.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/2023-03-22-11-15-00.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/2023-03-22-11-15-00.png" new file mode 100644 index 000000000..01360ebcc Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/2023-03-22-11-15-00.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/index.html" new file mode 100644 index 000000000..070f13526 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-025-\346\234\237/index.html" @@ -0,0 +1,20 @@ +机器文摘 第 025 期

机器文摘 第 025 期

机器文摘 第 025 期

机器文摘 第 025 期

长文

252个字节实现播放音乐和动画

+这里有个网页介绍了一个demo作者使用一段JavaScript代码实现了一个一边播放俄罗斯方块背景音乐一边播放字符动画的网页,原理是利用HTML5的AudioContext对象进行声音合成,通过定时器触发基于当前时间t值的不同频率,实现音乐播放。具体代码如下:

1
+
<body onclick="with(new AudioContext)with(o=createOscillator())connect(destination),start(setInterval(v=>innerHTML='TETЯIS&#'+(9624|(o.frequency.value=`RR>AIIA>777${d='ARRIA>>>AIIRRAA7777'}IIIWnnbWRRR${d}`.charCodeAt(++t%58)*4)%7)+'P01',t=232))">click
+

诺基亚发布的“可维修”手机

+说到诺基亚,用过的朋友第一个映入脑海的词就是“砸核桃”。

那是iPhone还没发布的非智能手机年代。

手机可更换电池和外壳在那时是一个标准设计,谁要是不支持这些都不好意思跟人打招呼。

那时我经常把我的诺基亚掉在地上摔得七零八落,然后淡定地捡起来像电影里特工拼装自己的手枪那样,一个个把零件组装起来,形成“一把”手机。

或者等手机快要没电的时候,像换弹匣那样给手机换一块电池,立马满血复活。

这样的日子自从iPhone发布之后就再也没有了。

诺基亚近期发布了一款手机,再次让我想起我那掉地上摔开几瓣的手机。这款手机号称具有良好的“可维修”性,普通用户也可一个人在家轻松拆卸。可以自行更换包括电池、屏幕、充电端口等零件。

不要重复自己是编程的好原则吗

+不要重复自己,永远不要从头开始重写代码!

这是很多程序员收到的忠告。

然而它是绝对正确的吗?

这里有篇文章《重复自己,重写一切》,作者在文章中探讨了编程中的一些习惯,他认为这些习惯可以使代码变得更难理解、更难维护,并可能导致代码的冗长和不必要的复杂性。文章提到了重写代码可以给程序带来更好的抽象和可维护性,所以建议定期通过重新写代码的方式重构你的程序。

说实话,我不知道作者是怎样看待所谓“屎山”代码的,也许当他面对有些代码时,他的观点也会变为:“能跑的代码,就尽量别动它了”。

慢下来

+这篇文章的题目是“慢下来”,作者是Derek Sivers,一位创业者、作家和音乐家。在这篇文章中,他分享了自己对于“慢下来”这个主题的一些思考和感悟。

虽然是个急性子,但是我很认同文章里的观点。

资源

  • 反跟踪识别的套件,如果你觉得被公共场所的摄像头拍摄和记录或者识别侵犯了你的隐私,这里有一套开源的穿戴套件可以考虑。它通过在身上穿戴可以发射红外线的LED设备,使得摄像头画面过曝。以获得保护隐私的效果。不过仅用于研究,不知道是否符合有些国家的法律法规。网站提供了配件清单和详细的装配说明(pdf)供下载。 +
  • AI帮你解释一段代码,有人使用openai的开发接口提供了一个专门帮人们解释代码执行的工具,输入代码,输出解释。并提供vscode的插件。我把文章开头那段播放音乐的Javascript代码发给他让他解释,效果如下图: +
  • 在网页中运行GPT模型,一个可以在浏览器中执行Transformer模型的开源程序,可以执行轻量的模型,实现如翻译、语音转文字、图像转文字等任务。 +
  • AI生成工具箱,近期,基于chatGPT模型的应用大爆发,这里有一个整理好的工具箱,可以使用ai做很多内容生成工作,包括帮你编写周报、润色文字、写道歉信、写外卖好评等,效果还不错。 +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/2023-03-29-09-37-08.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/2023-03-29-09-37-08.png" new file mode 100644 index 000000000..5341db070 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/2023-03-29-09-37-08.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/2023-03-29-10-02-56.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/2023-03-29-10-02-56.png" new file mode 100644 index 000000000..59c779eb8 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/2023-03-29-10-02-56.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/2023-03-29-10-12-24.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/2023-03-29-10-12-24.png" new file mode 100644 index 000000000..4fc9298de Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/2023-03-29-10-12-24.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/2023-03-29-10-21-37.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/2023-03-29-10-21-37.png" new file mode 100644 index 000000000..f3e947007 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/2023-03-29-10-21-37.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/2023-03-29-10-34-53.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/2023-03-29-10-34-53.png" new file mode 100644 index 000000000..d2bc9cca5 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/2023-03-29-10-34-53.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/2023-03-29-10-40-09.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/2023-03-29-10-40-09.png" new file mode 100644 index 000000000..527f9e8e5 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/2023-03-29-10-40-09.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/2023-03-29-10-42-04.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/2023-03-29-10-42-04.png" new file mode 100644 index 000000000..d1d1373d8 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/2023-03-29-10-42-04.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/2023-03-29-10-46-53.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/2023-03-29-10-46-53.png" new file mode 100644 index 000000000..f267d1616 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/2023-03-29-10-46-53.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/index.html" new file mode 100644 index 000000000..e1192dc97 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-026-\346\234\237/index.html" @@ -0,0 +1,41 @@ +机器文摘 第 026 期

机器文摘 第 026 期

机器文摘 第 026 期

机器文摘 第 026 期

长文

通用人工智能要来了吗

+AGI(通用人工智能),即用一个模型解决全部问题,而不是特定领域的问题(如语音识别、图像分类等)。

我在几年前读过一本叫做《人工智能,人类最后的发明》的书。

书里说AGI就是人类最后一个发明,因为有了它,别的一切都不需要了。

当时感觉距离通用的人工智能还很遥远,觉得作者有些危言耸听。

直到今年,chatGPT和GPT-4的发布,我才发觉AI的势头确实有些猛得出乎意料。

《 GPT-4 ,人类迈向AGI的第一步》是一篇近期论文的翻译,该论文由微软研究院发布,论证了当前的 GPT-4 模型已经初步具有 AGI 的苗头。

论文内容十分详实,看完很震撼。

摘录部分文字如下:

对话 +> 马克:我不喜欢你昨天晚上对待杰克的方式 +> 朱迪:你看到他在做什么了吗?他打了他哥哥的头! +> 马克:这并不能成为你对他大喊大叫的理由 +> 朱迪:你想让我怎么做?让他打他的弟弟,然后什么都不说? +> 马克:不,我不同意 +> 朱迪:那你为什么要为他辩护? +提问:马克的意图似乎是什么? +GPT4: 马克的意图似乎是要表达他对朱迪处理与杰克关系的方式的不满,并建议她可以更加冷静和尊重。 +ChatGPT:根据谈话内容,马克的意图似乎是为杰克的行为辩护,并表达他对朱迪对待杰克的不满。 +提问:朱迪如何看待汤姆的回应? +GPT4: 朱迪认为他的评论是对她的分析能力的攻击,也是对杰克的不当行为表示同情的表现。她的反应是防御性的和愤怒的,并质疑马克的动机。 +ChatGPT:如果没有更多的文字,我不可能准确判断朱迪是如何接受马克的评论的。然而,根据朱迪的回应,她似乎并不同意马克的观点,而且可能对他为杰克的行为辩护感到沮丧。

用 GPT-4 帮你编写一个游戏

+我第一次见识到 ChaptGPT 的编程能力之后,就基本离不开这个工具了。

现在我几乎每天都在它的辅助下编写代码。

不过,这里有个老哥更过分。

他让 GPT-4 模型帮他做出了一个3D太空赛跑游戏

作者本身没有游戏编程经验也不懂Javascript,但是通过跟模型一点一点对话,反复将调试代码生成的错误信息反馈给模型,逐渐完成了一个完成度还挺高的游戏。

搭建基于私域数据的ChatGPT

+ChatGPT 超强的对话能力怎样应用到私有数据上?

比如说我希望做出一个基于 ChatGPT 模型的专属客服,要吃透我的产品信息。

官方提供的训练API和微调(fine tuning)指导相对复杂一些,对于AI模型的微调不熟悉的人员还不够友好。

这里有一篇“零基础”教程《搭建基于私域数据的ChatGPT》,可以带你走一下流程,感受一下定制专属模型的步骤。

AI令人焦虑

+这篇《AI狂飙的时代,人还有价值吗?》是一期语音播客的文字转译,因为内容比较精彩,所以也收录在这里了。

我觉得取代不是一个好的词儿,因为取代是一个非常容易反驳的词儿。我可以说我仍然会干什么什么,AI干不了,所以它取代不了我。 +但正是这种字面上的抬杠,使得问题的本质被掩盖了,因为AI在人的生活中的渗透是一个逐渐的过程。 +百分之百地取代你可能仍然不会发生,可是它也不需要百分之百的取代掉你,只要50%的取代掉你的某些工作职能,AI就会对就业市场形成非常大的冲击。 +我有一个纽约的律师朋友,他是很早就开始用这个东西。 +他本身不是一个技术人员,他是一个标准的文科生,平常的用一个新软件都要紧张半天的那种人。 +但是他开始用这个之后,因为律师的工作是很大程度上是依赖于文本的,而文本是GPT的长项,所以他就开始用。 +之后,我就问他说,所以你真的开始辞退你的员工了吗?因为他自己是一个律所合伙人。 +他说我还没有真正开始辞退任何人,但是我确实打算今年暑假不用再招实习生了,因为给我省下的活完全可以让我腾出手来做一些事,以至于我可以省下招一个实习生的AD account。 +这就是一个真实的影响对不对? +它没有真正取代什么东西,但是它仍然冲击了一个真实的就业市场上的职位。

我觉得AI对我们社会的影响会以这种方式出现,它不会马上一下子让你这个人变得没有意义,但是它可以让三个人的活,两个人现在能干完,多出来那个人就没有存在的必要了,所以老板就可以把他开掉。 +它并不是百分之百取代的人的方式来逐渐进行的,而且这个事情是非常真实的。这也是为什么我觉得很多人对冲击仍然没有做好心理上和事实上的准备。 +其实有点令人忧虑的原因就是,如果你今天还用一种这东西,都是媒体的炒作来对待这个问题,你就很可能会在真正的影响你切身生活的冲击到来之前,没有做好对自己来说比较有用的帮助。

读完这篇文章,我的感受是,没必要焦虑,不是AI没有威胁,而是焦虑也没用,蒸汽机车发明之后,超越马车就只剩下时间问题了。

资源

  • 无限制下载器,只要能播放就能下载,能够帮助下载视频网站内容的浏览器插件很多,大部分都是通过嗅探播放地址来实现的下载,网站也会采用各种加密手段来进行阻止。但是这个油猴脚本采用了另一种思路。你网站防再死不能不让观众看吧?脚本几乎采用了类似录屏的手段来进行视频下载。对于一些实在想要下载的内容,可以考虑试试这个插件。 +
  • 帮你本地运行 LLaMA 模型,只需一行命令就可以让你在本地运行 LLaMA 模型,轻松感受在本地单机上运行大规模语言模型的魅力。 +
  • 微调 LLaMa 模型的工具,既然都能在本地运行了,那就再给力一些,这个工具可以让你很方便地使用自己的数据训练 LLaMA 模型。 +
  • Docker Compose 容器组合最佳实践,Docker有多好用不用再说了吧,这里有一堆使用Docker Compose编排容器的模板,收录了很多十分有用的容器镜像组合,可方便快速的搭建各种业务(如:单点登录、VPN、媒体管理、文件共享、博客、维基、社交网站、项目管理等)。 +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-027-\346\234\237/2023-04-04-13-51-53.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-027-\346\234\237/2023-04-04-13-51-53.png" new file mode 100644 index 000000000..dde7d108b Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-027-\346\234\237/2023-04-04-13-51-53.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-027-\346\234\237/2023-04-04-14-02-07.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-027-\346\234\237/2023-04-04-14-02-07.png" new file mode 100644 index 000000000..e29aed06c Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-027-\346\234\237/2023-04-04-14-02-07.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-027-\346\234\237/2023-04-04-14-08-25.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-027-\346\234\237/2023-04-04-14-08-25.png" new file mode 100644 index 000000000..cf0193591 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-027-\346\234\237/2023-04-04-14-08-25.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-027-\346\234\237/2023-04-04-14-22-47.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-027-\346\234\237/2023-04-04-14-22-47.png" new file mode 100644 index 000000000..b1db31e96 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-027-\346\234\237/2023-04-04-14-22-47.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-027-\346\234\237/2023-04-04-14-27-18.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-027-\346\234\237/2023-04-04-14-27-18.png" new file mode 100644 index 000000000..a45ce4d94 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-027-\346\234\237/2023-04-04-14-27-18.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-027-\346\234\237/2023-04-04-14-43-13.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-027-\346\234\237/2023-04-04-14-43-13.png" new file mode 100644 index 000000000..d712e76a5 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-027-\346\234\237/2023-04-04-14-43-13.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-027-\346\234\237/2023-04-04-14-45-46.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-027-\346\234\237/2023-04-04-14-45-46.png" new file mode 100644 index 000000000..bad2e1aed Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-027-\346\234\237/2023-04-04-14-45-46.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-027-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-027-\346\234\237/index.html" new file mode 100644 index 000000000..a476263a7 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-027-\346\234\237/index.html" @@ -0,0 +1,16 @@ +机器文摘 第 027 期

机器文摘 第 027 期

机器文摘 第 027 期

机器文摘 第 027 期

长文

搭建本地AI作图应用

+AI对话机器人火爆的同时,去年由Stable-Diffusion模型引爆的AI作图技术也没有放慢进化的脚步。

这里面的佼佼者Midjourney已经发展成了强大的图像生成系统。可以轻松定制出照片级图像,其效果足以乱真。

不过目前在国内使用Midjourney还比较麻烦,即便能够访问,使用量也会受限制,能否自己搭建一个呢?

答案是肯定的。

跟去年刚问世的时候不同,现在基于Stable-Diffusion模型的生态也已经十分完备,很多开源软件、框架、插件围绕这个模型开发。

利用这些软件可以快速在本地计算机上构建一套属于自己的图像生成服务。

这里有一篇博客以手把手的方式教你如何在最快速的时间搭建自己的图像生成服务

里面还列举了一些微调好的定制模型下载地址,合理的使用这些模型,你会发现打开新世界的大门。

搭建本地chatGPT应用

+本来不想再提chatGPT了,因为最近说的有些太多了。

但是无奈当前的开源生态对于语言模型是在是太追捧了,技术发展迅雷不及掩耳。

很快就出现了一批可以自己搭建的AI对话模型。

今天我挑两个我认为效果比较好的(且对中文支持比较好的)介绍一下。

注意,跟目前流行的基于OpenAI的接口进行套壳的程序不同。我说的是完全在本地搭建自己的服务。

第一个:ChatGLM-6B,一个具有62亿参数的中英双语语言模型。通过使用与 ChatGLM(chatglm.cn)相同的技术,ChatGLM-6B 初具中文问答和对话功能,并支持在单张 2080Ti 上进行推理使用。

搭建过程比较简单,按照README文档中的步骤下载模型、执行脚本程序即可。

第二个:中文 LLaMA & Alpaca 大模型,开源了中文LLaMA模型和经过指令精调的Alpaca大模型。这些模型在原版LLaMA的基础上扩充了中文词表并使用了中文数据进行二次预训练,进一步提升了中文基础语义理解能力。同时,在中文LLaMA的基础上,本项目使用了中文指令数据进行指令精调,显著提升了模型对指令的理解和执行能力。

搭建过程略微繁琐一些,需要通过自己的手段下载到开源的LLaMA原始模型(当然这对于技术人员来说不是问题)。

然后按照文档中的教程,执行模型合并、量化等脚本,最终通过开源程序LLaMA.cpp实现模型的本地运行。

合作运行千亿参数级语言模型

+按照众人划桨开大船的思路,之前在带宽不足的年代诞生了BT下载。

如今,当我们的本地显卡无法应付超大AI模型时,有人开始用同样的思路解决问题。

Petals就是这么一个分布式模型微调、运行的框架,可以让你轻松在家运行超过千亿参数的大模型(当然是在线跟大家一起协作)。

其原理是大家分别加载模型的一小部分,然后与其他人一起通过协同的方式进行推理或者微调。 +

资源

  • Prompt Engineering 教程,一份教你如何更好使好地使用 ChatGPT 和其他 AI 产品的免费教程。 +
  • Prompthero,跟聊天机器人、绘图机器人交流的prompt大全,与上面的教程不同,这是一个模板库大全,有创作灵感但是不知道该如何描述的时候可以去参考一下。 +
  • Civitai,与上面相同,不过专门用于图像生成,而且路子比较野,有大量的NSFW内容,要搭配Stable-Diffusion的各种微调模型使用。具体使用方法,可参考前文中介绍如何搭建本地图像生成服务的部分。

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-09-37-14.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-09-37-14.png" new file mode 100644 index 000000000..04d37c788 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-09-37-14.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-09-38-57.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-09-38-57.png" new file mode 100644 index 000000000..7d15fa61c Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-09-38-57.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-09-49-17.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-09-49-17.png" new file mode 100644 index 000000000..5c9a93d6e Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-09-49-17.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-09-50-49.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-09-50-49.png" new file mode 100644 index 000000000..15a8b85bb Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-09-50-49.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-10-08-18.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-10-08-18.png" new file mode 100644 index 000000000..48086e4b6 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-10-08-18.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-10-19-26.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-10-19-26.png" new file mode 100644 index 000000000..a33b4d294 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-10-19-26.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-10-19-52.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-10-19-52.png" new file mode 100644 index 000000000..8d891373a Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-10-19-52.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-10-20-26.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-10-20-26.png" new file mode 100644 index 000000000..376e0d0ce Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-10-20-26.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-10-21-52.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-10-21-52.png" new file mode 100644 index 000000000..768e4f15a Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/2023-04-12-10-21-52.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/index.html" new file mode 100644 index 000000000..e3415965b --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-028-\346\234\237/index.html" @@ -0,0 +1,21 @@ +机器文摘 第 028 期

机器文摘 第 028 期

机器文摘 第 028 期

机器文摘 第 028 期

长文

极简代码理解 GPT 模型结构

+在twitter上有网友发布了一个简单的示例代码,讲解了 GPT 语言模型的运行原理,为了方便大家理解,作者用了极简的模型设置,即语言文字只保留了1和0两个字符,上下文长度也仅为3,可以很直观地感受到训练过程是如何起作用的。

作者提供了托管在colab的python源码,可以在线体验。

用开源语言模型训练自己的数字化身

+随着开源语言模型的训练和微调变得越来越简单,果然有人开始整活。

已经有网友通过自己的微信聊天记录和博客文章训练出有自己风格的AI

作者使用目前对中文支持最好的开源模型 chatglm-6b 作为预训练模型(我上期介绍过它的部署和使用)。

经过一番折腾后终于训练出还算凑合的模型。

我们的世界离《黑镜》中的黑暗故事越来越近了。 +

四十年工作经验程序员的职业建议

+国外有位“老程序员”退休了,是真正的到了退休年龄的退休。

他从1981年入行,直到去年退休。这期间他做过各种开发,跳过槽也被辞退过,打过工也创过业。

这不容易。

所以,他决定以“一个退休程序员”的身份分享一些心得

摘抄部分要点如下:

保持开阔的眼界:每天花时间获取真正的资讯,看到趋势,在事物流行起来之前发现他们。 +保持学习:不要拒绝和敌视新技术,要为你所用。 +要有自己的项目(做一些真正的事情):作为程序员不要浪费聪明才智和外部资源,要学着开始一个自己的项目。

进入心流的入口

+进入心流(Flow)状态是一种很忘我的体验,也是知识工作者高效产出的必要条件。

有不少创作者都体会过那种全身心的投入并且忘记了时间的感觉。

一旦进入那种状态,很多问题能够很快得到解决,大脑飞速运转并且不会感觉到劳累。

这种状态最忌讳被打断,因为一旦打断,再进入就会比较困难。

这里有篇文章介绍了一些小技巧,可以让你在不得已中断心流之后,能够比较快速地恢复状态。

作者将这些技巧比喻为高速服务区进入主路之前的加速匝道,姑且称为进入心流的入口

资源

  • Spline,一个免费易用的 3D 设计工具,可实时协作,提供了丰富的物料库,可以基于它来快速创建有趣的 3D 场景,支持处理细腻动画交互,此外还可以导入本地模型和声音素材,支持到处多种输出格式包括WebGL、视频、链接等,很适合新手。 +
  • Draw With Flowers!,在threejs里用着色器语言编写的一个特效demo,可以随着鼠标移动绘制绚丽的花朵。 +
  • React 源码阅读,一本开源电子书,通过阅读React的源码来详细理解前端框架的原理。 +
  • Codeium,Github copilot 的免费平替,提供vscode、vim、neovim等常见编辑器的插件,我试了一下,效果可以接受。 +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-09-37-58.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-09-37-58.png" new file mode 100644 index 000000000..a5aab7e5a Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-09-37-58.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-09-54-43.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-09-54-43.png" new file mode 100644 index 000000000..ab4410ff8 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-09-54-43.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-10-06-59.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-10-06-59.png" new file mode 100644 index 000000000..b9b5e25a9 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-10-06-59.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-10-17-26.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-10-17-26.png" new file mode 100644 index 000000000..0d906f34f Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-10-17-26.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-10-22-36.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-10-22-36.png" new file mode 100644 index 000000000..2825ba0fa Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-10-22-36.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-10-31-02.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-10-31-02.png" new file mode 100644 index 000000000..3af736716 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-10-31-02.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-10-31-37.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-10-31-37.png" new file mode 100644 index 000000000..8311e8103 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-10-31-37.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-10-33-47.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-10-33-47.png" new file mode 100644 index 000000000..fee4b0939 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-10-33-47.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-10-36-53.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-10-36-53.png" new file mode 100644 index 000000000..efa5aeb9a Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/2023-04-19-10-36-53.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/index.html" new file mode 100644 index 000000000..8147169c1 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-029-\346\234\237/index.html" @@ -0,0 +1,19 @@ +机器文摘 第 029 期

机器文摘 第 029 期

机器文摘 第 029 期

机器文摘 第 029 期

长文

计算机的“中断”机制是如何实现的?

+稍微了解过计算机原理的朋友都知道,计算机是通过“中断”的机制实现对键盘输入、鼠标移动、硬盘读写等操作的。

让我给小朋友讲解这些基本的知识时,我也可以侃侃而谈,说上半个小时不带重复。

但是真要解释“中断”的机制是如何实现的,我想即便是现在科班出身的本科生也未必能够说明白。

原因我觉得除了缺少实践之外,也跟大部分书上的理论内容离实际工程较远有关。

这篇漫谈中断从实际的硬件实例(x86)出发,详细介绍了中断的实现机制,普及了“外部中断”、“内部中断”、“软中断”等概念,以及人们怎样通过“中断控制器”逐渐解决了多设备中断处理的问题。是一篇很值得阅读的科普文章。适合对计算机组成原理、操作系统等技术有兴趣的朋友阅读。

怎样提升软件项目的可维护性?

+不同的项目团队对于软件项目的可维护性所做出的努力不同。

有不少团队宁愿在修改bug上加班加点,也不愿意为可维护性多花一丁点精力。

不过,如果你要开始一个新的软件项目或者想要改善一个已经存在的项目的可维护性。

这里有一份软件项目可维护性检查清单可以参考。

作者主要从版本控制、软件测试、静态分析、依赖库管理、多语言支持、多平台支持、开发环境管理等方面给出了可以改进的行动清单,以及基于开源工具的最佳实践建议。

怎样榨干chatGPT?

+ChatGPT是由OpenAI训练的一款大型语言模型,能够和你进行任何领域的对话。

现在跟年初账号紧张的情况比起来已经方便了很多。

在这么多开源工具和套壳网站的帮助下,我想现在大部分人都能够比较方便的体验它了吧。

但是可能很多人还不知道如何更好的发挥它的作用。

有网友整理了一份开源的chatGPT中文调教指南,内容极为详尽,可以帮你榨干chatGPT的全部潜能。

怎样让AI作画理解你的意图?

+对于现在强大的AI绘图应用,有些人可能会认为只输入一个单词就能生成一张很酷的图片。

然而,虽然AI模型越来越善于理解我们想要的内容,但它们还不能读懂我们的思想。

因此,如果你想生成一张看起来像你所想的那样的图片,你需要编写正确的提示。

这个AI绘图prompt编写指南可以给你提供一些帮助。

资源

  • 维修指南,各种设备的维修教程大全,详细到每一个步骤的照片,设备型号齐全; +
  • glsl-CNN,有大神用glsl语言,仅通过webGL的片元着色器实现了一个手写识别的CNN神经网络。可以在浏览器直接体验,效果惊艳。 +
  • dinov2,Meta AI新发布的全能视觉模型,模型支持:图像分类、分割、图像检索和深度估计。比较厉害的地方在于它是一个自监督模型,直接从图像中学习特征,而不依赖文本描述,即可训练计算机视觉模型。 +
  • minigpt-4,GPT4 的图像支持迟迟不开放,这个开源的MiniGPT4 却已经做到了类似的多模态效果,官方演示看起来非常棒。只用了四张A100训练了10小时,模型甚至只有13B。 +
  • street-fighter-ai,有个B站UP主在GPT的帮助下, 写了个 强化训练的AI模型,终于打败了街霸里的 AI,实现了儿时的梦想。 +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-08-48-07.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-08-48-07.png" new file mode 100644 index 000000000..e212356cf Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-08-48-07.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-08-50-22.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-08-50-22.png" new file mode 100644 index 000000000..2e64fd28d Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-08-50-22.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-08-51-08.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-08-51-08.png" new file mode 100644 index 000000000..638a62da9 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-08-51-08.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-08-51-53.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-08-51-53.png" new file mode 100644 index 000000000..f9e0a70b8 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-08-51-53.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-08-53-56.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-08-53-56.png" new file mode 100644 index 000000000..e54789cd2 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-08-53-56.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-09-42-27.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-09-42-27.png" new file mode 100644 index 000000000..20781f717 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-09-42-27.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-09-53-51.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-09-53-51.png" new file mode 100644 index 000000000..20e4b12d0 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-09-53-51.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-09-57-29.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-09-57-29.png" new file mode 100644 index 000000000..dc6470a07 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-09-57-29.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-10-03-34.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-10-03-34.png" new file mode 100644 index 000000000..afb15c02a Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/2023-04-26-10-03-34.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/index.html" new file mode 100644 index 000000000..77b43d33e --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-030-\346\234\237/index.html" @@ -0,0 +1,19 @@ +机器文摘 第 030 期

机器文摘 第 030 期

机器文摘 第 030 期

机器文摘 第 030 期

下周五一假期,休息,不更新。

长文

内网穿透的原理及实现

设想这样一个问题:在北京和上海各有一台局域网的机器(例如一台是家里的台式机,一 台是连接到星巴克 WiFi 的笔记本),二者都是私网 IP 地址,但可以访问公网, 如何让这两台机器通信呢?

IPv4地址即将枯竭,IPv6技术还没有普及,现在很多家庭宽带都不再分配公网IP地址。这就意味着大部分的个人电脑是无法通过互联网被直接访问的(当然,你可以通过你家wifi或者4G信号访问互联网,但是反过来不行)。

可是这种需求又真实存在,比如我就经常希望能够在任何地方访问我家里的电脑,通过远程桌面进行办公、文件共享等等。

最简单的方法是通过购买一台具有公网IP地址的云主机来实现中继,这也是目前最普遍的方式。

不过阅读完这篇《NAT 穿透是如何工作的:技术原理及企业级实践》,假如你有很强的动手能力的话,就应该可以实现一套完全不需要公网主机进行中继的“企业级内网穿透工具”。

文章很长,来自这篇英文博客

技术写作指南

+曾经在翻阅《程序员的数学》这本书的时候被朋友看到,于是诞生了短暂的讨论。

当时我的观点是,作为程序员一定要掌握好数学,即便现在编程过程中已经不怎么用到特别底层的知识,但也应该多训练数学思维。

朋友当时说了一句话让我记忆犹新。

“比起程序员的数学,我更担忧的是程序员的语文。”

确实,写作这项能力在很多技术人员心里是被低估的。

不少人受尽写技术文档的折磨,于是越发讨厌写作。

这篇《作为工程师应该如何写作》真是雪中送炭,总结了很多立即就能见效的技术写作方法,希望可以帮助到工程师朋友。

怎样制作好玩的小游戏

+很多人都有自己开发游戏的冲动。

不过很容易掉进各种复杂的引擎和工具的坑里。

然后感到沮丧,忘了想做游戏的初心。

这篇《怎样制作好玩的小游戏》可以让你重新焕发精神。

作者认为开发那种不用复杂引擎的小游戏也可以很欢乐,只要有足够的游戏性。

他在文章中详细列举了想要制作出真正具有游戏性的小游戏所必须具备的几点关键特性。

看得出来,作者是懂游戏的。

神奇的一页纸知识管理

宇航员在太空中找到的方法一定不会错,因为他要是出错就没命了。 +航天员的秘密武器,One Pager。就是把一个专项的知识,都写和画在一页纸上。日积月累,宇航员有了一本手册,里面都是一页一页的one pager。 +我向来对知识管理的各种方法很有兴趣。

在网上闲逛时看到这篇《神奇的One Pager》,讲述了一种通过一页纸进行知识管理的方法。

热爱学习的人可不能错过。

资源

  • buzz,Transcribe and translate audio offline on your personal computer. Powered by OpenAI’s Whisper. +
  • 可视化提示词拼装,文生图的AI越来越多,自己也可以在本地搭建服务,可是为什么我自己生成的图片那么丑呢?这个工具也许可以帮你生成一些靠谱的提示词。 +
  • LangChain 中文入门教程,众所周知 OpenAI 的 API 无法联网的,所以如果只使用自己的功能实现联网搜索并给出回答、总结 PDF 文档、基于某个 Youtube 视频进行问答等等的功能肯定是无法实现的。所以,我们来介绍一个非常强大的第三方开源库:LangChain 。 +
  • clock,一个非常酷的网页时钟显示效果。 +
  • WebGPU 理论基础,从基础理论开始学习WebGPU,稳! +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-09-20-31.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-09-20-31.png" new file mode 100644 index 000000000..f3fc6fb03 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-09-20-31.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-09-36-36.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-09-36-36.png" new file mode 100644 index 000000000..9513fc881 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-09-36-36.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-09-49-38.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-09-49-38.png" new file mode 100644 index 000000000..ef8e537d7 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-09-49-38.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-10-00-09.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-10-00-09.png" new file mode 100644 index 000000000..12b4ef407 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-10-00-09.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-10-06-52.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-10-06-52.png" new file mode 100644 index 000000000..56cd5beb2 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-10-06-52.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-10-14-06.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-10-14-06.png" new file mode 100644 index 000000000..67ab91d6f Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-10-14-06.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-10-15-52.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-10-15-52.png" new file mode 100644 index 000000000..8d57d06e8 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-10-15-52.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-10-18-25.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-10-18-25.png" new file mode 100644 index 000000000..2a9cf8941 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-10-18-25.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-10-19-48.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-10-19-48.png" new file mode 100644 index 000000000..7cacecd57 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-10-19-48.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-10-20-48.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-10-20-48.png" new file mode 100644 index 000000000..b89967d80 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/2023-05-10-10-20-48.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/index.html" new file mode 100644 index 000000000..f1fbd8c7c --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-031-\346\234\237/index.html" @@ -0,0 +1,21 @@ +机器文摘 第 031 期

机器文摘 第 031 期

机器文摘 第 031 期

机器文摘 第 031 期

长文

怎样驱动上个世纪的网络摄像头

+国外有个老哥,在帮朋友收拾废品的时候,获得了一个老旧的摄像头。

于是他按耐不住想感受一下,这个来自上个世纪的“古董”,还能打吗?

由于年代比较久远,厂家也不再提供驱动程序的更新。

哥们不得不在虚拟机里全新安装一个windows xp,成功启动摄像头,并获得“清晰图像”。

安装xp时有个插曲:安装界面里的进度条仅用时几十秒就走完了原本几十分钟的倒计时(所以说微软的进度条是如何推断剩余时间的永远是个迷)。

在经过一番体验之后,又跃跃欲试准备自己给它手搓一个在现代操作系统下的驱动程序。

整个过程记录在《一个1999年的摄像头复活的故事》

整个故事都充满了一种“我不知道这么做有什么意义,但是我就是可以”的极客风格(也是我收录它的主要原因)。

webGPU 科普

+最近谷歌浏览器率先宣布全面支持 webGPU ,预计到今年年底各大浏览器也都会跟进并提供支持。

webGPU 从名字上看跟显卡和浏览器有关,可是之前已经有webgl了,这次又有什么变化?

通过多方面信息的搜索,我得到的结论是:webGPU 更充分地暴露了显卡的计算能力,GPU不再只是做图形渲染相关的事情,而是根据webGPU提供的相关专业接口,可以执行深度学习之类的更通用的计算工作。

如果想了解的更全面一些,这篇《谈谈 webGPU》文章十分值得一读。

作者对 webGPU 这一技术介绍的比较详尽,从各个图形接口的发展历史一直到对未来如何应用的展望,都包括了。

如何翻译一本书

+《从不自量力到 AI 助力,我如何翻译完一整本英文书》 +这是一个关于执行力的故事。

主题是:如何借助AI和现代信息工具,实现看似不可能完成的任务。

在这个时代,个体的力量很渺小,因为个人几乎无法独立完成任何事情。

但同时,借助科技工具和基础设施的力量,1 个人甚至可以完成之前需要一个上百人公司才能做到的事情,这让个体变得非常强大。

如何刷路由器

+V站上说,中年技术男有三大爱好:钓鱼、NAS、软路由。

我一样也没沾边儿,但还是克制不住关注相关技术。

之前多次想拿自己家的路由器开刀,刷一个openwrt系统,然后就可以各种折腾(科学上网、内网穿透等等)了。

但是一直没有动手,今天看到这篇自己动手定制你的路由器写的如此详细,还是心动了一下。

先收藏吧。

仅用CSS+HTML实现三维动画

+CSS 的 translate3d用到的不多。

如果使用巧妙的话,可以帮你实现很出彩的 3D 动画效果,国外有高手在给自己的文章配数学公式的时候,利用CSS制作了一些可以动态显示的公式图表。这篇CSS 3D图表记录了它们的实现细节和技术原理。

资源

  • window-swap,随机看别人家的窗外景色。这个网站每次刷新都随机显示一个网友共享的摄像头视角,一般是自家的窗外。可以随时体验全球各地的邻家风景。 +
  • foobar2000,经典的音乐播放器终于更新了。2002年发布的foobar2000播放器曾经是很多发烧友的最爱,如今过了20多年,居然更新了2.0稳定版,值得收藏; +
  • lost-at-sql,一个在线学习 sql 的交互游戏,通过游戏闯关的方式练习 sql 技能; +
  • glsl-exercises,在线学习glsl的交互课程,通过交互式页面练习 glsl 编写; +
  • gameuidatabase,一个游戏界面资源网站,各种游戏的界面截图,可以用来“借鉴”?; +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-032-\346\234\237/2023-05-16-14-33-53.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-032-\346\234\237/2023-05-16-14-33-53.png" new file mode 100644 index 000000000..62f06e359 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-032-\346\234\237/2023-05-16-14-33-53.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-032-\346\234\237/2023-05-16-14-49-14.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-032-\346\234\237/2023-05-16-14-49-14.png" new file mode 100644 index 000000000..7ffdf7e46 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-032-\346\234\237/2023-05-16-14-49-14.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-032-\346\234\237/2023-05-16-14-56-38.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-032-\346\234\237/2023-05-16-14-56-38.png" new file mode 100644 index 000000000..98effb634 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-032-\346\234\237/2023-05-16-14-56-38.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-032-\346\234\237/2023-05-16-15-04-41.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-032-\346\234\237/2023-05-16-15-04-41.png" new file mode 100644 index 000000000..69946cbcc Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-032-\346\234\237/2023-05-16-15-04-41.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-032-\346\234\237/2023-05-16-15-07-40.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-032-\346\234\237/2023-05-16-15-07-40.png" new file mode 100644 index 000000000..51778e527 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-032-\346\234\237/2023-05-16-15-07-40.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-032-\346\234\237/2023-05-16-15-11-32.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-032-\346\234\237/2023-05-16-15-11-32.png" new file mode 100644 index 000000000..98e60ac4c Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-032-\346\234\237/2023-05-16-15-11-32.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-032-\346\234\237/2023-05-16-15-14-37.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-032-\346\234\237/2023-05-16-15-14-37.png" new file mode 100644 index 000000000..12b05461e Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-032-\346\234\237/2023-05-16-15-14-37.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-032-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-032-\346\234\237/index.html" new file mode 100644 index 000000000..77e7edfa2 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-032-\346\234\237/index.html" @@ -0,0 +1,18 @@ +机器文摘 第 032 期

机器文摘 第 032 期

机器文摘 第 032 期

机器文摘 第 032 期

长文

AI歌手的训练与使用

+最近火了很多AI歌手(即:用AI模型模仿某位歌手的声音),其中b站上AI孙燕姿演唱的《漠河舞厅》、《撒日朗》等歌曲播放已超百万。

为了研究实现原理,我也找到了开源工具体验了一下。

具体步骤主要总结如下:

  1. 选定某一个歌手,找到具有代表性的几首歌曲,通过Ultimate Vocal Remover软件利用AI做人声和伴奏的分离,主要用于获取干净的纯人声用于模型训练。(不得不说现在基于AI模型的人声、伴奏分离做的是真的强,可以做到非常干净的提取,让你感觉像是原始独立的音轨)。
  2. 通过安装so-vits-svc-fork这个一体化开源工具进行模型训练,具体方法见so-vits-svc-fork的Readme,从数据预处理到最后的模型导出和推理都已经做好了,甚至还提供了图形界面。
  3. 继续使用so-vits-svc-fork提供的gui界面进行操作,将模型载入,将预期修改歌曲的原唱人声(提取方式同第1步)传入,运行推理获得定制的人声(注意看文档的各种参数)。
  4. 将第3步推理所得干净人声,跟原唱分离的干净背景音乐进行混音合成,即可获得一首新歌曲了。

怎样用口袋计算器玩耍

+在移动互联网时代,人打发无聊的方式实在是太多了,视频聊天、阅读各种资讯八卦、观看短视频、手游等等。

功能机的时代,我有印象的打发无聊的事情是手机上的贪食蛇、发短信、wap资讯等等,也算不错了。

如果时间来到上世纪七十年代呢?那个时代的没有随身携带的手机,怎么打发时间?

答案是:如果有一个随身携带的计算器也行,这里有一本书《How To Entertain With Your Pocket Calculator》,出版于上世纪七十年代。书中花了大量的篇幅介绍了很多种基于数字的游戏,我翻看了一下,我觉得可能得无聊到一定的程度我才能愿意玩书里的游戏。

LLM的几篇介绍文章

+Large Language Model (LLM) 即大规模语言模型,是一种基于深度学习的自然语言处理模型,它能够学习到自然语言的语法和语义,从而可以生成人类可读的文本。 +与其感叹以chatGPT为代表的大语言模型发展太快,不如静下心来,读一读关于LLM的一些基础知识和使用方法,我找了三篇比较有代表性的放在这里收藏。

  1. 大语言模型综述,认真地概括并解释了什么是LLM和它的基本原理。
  2. ChatGPT背后的语言模型简史,从发展历史上捋一捋各种语言模型的辈分。
  3. prompt-engineering-for-developers一个中文版的 Prompt Engineering 教程,翻译自:吴恩达《ChatGPT Prompt Engineering for Developers》课程,主要内容为指导开发者如何构建 Prompt 并基于 OpenAI API 构建新的、基于 LLM 的应用;
  4. 大语言模型微调技术笔记,记录了基于 LLM 进行微调训练的实战技巧。

资源

  • sinerider,一个很有创意的数学学习游戏,让你通过数学函数构建图像从而帮助画面中的角色到达目标地点。 +
  • map-of-github,以节点地图的方式展示Github上面超过40万个仓库,通过虚拟大陆的方式展示他们之间的关系。 +
  • learngitbranching,以交互式游戏的方式学习git命令。 +
  • ,在线显卡博物馆,收藏了1982年到2012年之间发布的各款显卡,包括高清图片和规格参数的介绍; +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-033-\346\234\237/2023-05-24-09-22-11.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-033-\346\234\237/2023-05-24-09-22-11.png" new file mode 100644 index 000000000..da821597f Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-033-\346\234\237/2023-05-24-09-22-11.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-033-\346\234\237/2023-05-24-09-31-09.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-033-\346\234\237/2023-05-24-09-31-09.png" new file mode 100644 index 000000000..ebd55fb5f Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-033-\346\234\237/2023-05-24-09-31-09.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-033-\346\234\237/2023-05-24-09-40-25.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-033-\346\234\237/2023-05-24-09-40-25.png" new file mode 100644 index 000000000..321dc64ec Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-033-\346\234\237/2023-05-24-09-40-25.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-033-\346\234\237/2023-05-24-09-52-09.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-033-\346\234\237/2023-05-24-09-52-09.png" new file mode 100644 index 000000000..27c26edca Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-033-\346\234\237/2023-05-24-09-52-09.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-033-\346\234\237/2023-05-24-10-00-52.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-033-\346\234\237/2023-05-24-10-00-52.png" new file mode 100644 index 000000000..ae40c605c Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-033-\346\234\237/2023-05-24-10-00-52.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-033-\346\234\237/2023-05-24-10-01-29.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-033-\346\234\237/2023-05-24-10-01-29.png" new file mode 100644 index 000000000..a5323503e Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-033-\346\234\237/2023-05-24-10-01-29.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-033-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-033-\346\234\237/index.html" new file mode 100644 index 000000000..3c8fb4bb6 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-033-\346\234\237/index.html" @@ -0,0 +1,16 @@ +机器文摘 第 033 期

机器文摘 第 033 期

机器文摘 第 033 期

机器文摘 第 033 期

研究

全键盘信息终端

+我一直很怀念使用黑莓手机的日子。

物理全键盘的手感比起现在硬邦邦的触摸屏真不知道好到哪里去了。

多少次盯着抽屉里的黑莓尸体,都在想有没有办法再次发挥它的余热。

现在机会来了,有人将树莓派和黑莓手机的全键盘(带触摸板的那一款)结合起来做了一个终端。

取名:Beepberry,具有400*200分辨率的LCD屏幕,和usb type-c接口。

自己动手给树莓派写操作系统

+学习操作系统的最佳手段是自己动手写一个。

这类教程很多,一般都是针对x86平台,树莓派的比较少见。

《给树莓派编写“裸机”操作系统》来自github上的一个开源项目。

可以带你从树莓派的硬件层基础上直接构建一个的完整操作系统。

关于 Demoscene 制作的一些文章

+Demoscene(也称为Demo Party)是一种计算机艺术形式,旨在展示计算机的音频和图形表现能力。Demoscene通常是由小团队制作的演示性程序,也被称为demo,它集计算机程序、音乐、图形和动画于一身,是八十年代初期在个人计算机上发展起来的一种文化和艺术运动。Demoscene的主要目的是展示计算机和程序的美感,通常使用3D渲染和其他复杂的视觉效果,展示计算机的高级图形和音频处理能力。

我对于如何制作这些炫酷的 demo 一直很感兴趣,但是网上关于这方面的资料非常少,成体系的就更少了。

这里收录了一些比较经典的相关资料:

  1. 64kb的demos介绍了基于SDF(Signed Distance Field,有符号距离场)生成三维网格的方法,这个方法是大部分demo用于在三维场景中产生三维模型的主要方法。

  2. The_Art_of_Demomaking是一套很系统的教程,讲述Demo的概念、发展历史以及制作过程需要了解的基础知识。

  3. pbr-book是一本关于基于物理的渲染(Physically Based Rendering,简称PBR)的经典教材。内容包括计算机图形学相关的基础概念、渲染算法、工作流程和高级特性等。

怎样防止针对LLM的prompt攻击

+就像之前流行的sql注入攻击,针对大语言模型的提示语注入攻击现在变得也很常见。

一种比较典型的攻击场景是,通过一段特定的提示语,解锁chatGPT原本被封印的能力。

或者对于接入了其他工具接口的语言模型,通过特定的提示语让其执行危险操作(如:删除所有信息)。

这对于使用者来说可能危害不大,但对于服务的提供者是一个不小的挑战。

《用于构建可以抵抗即时注入的 AI 助手的双 LLM 模式》提出了一种可能可行的解决方案。

即使用双模型的配置,协同工作,将具有执行危险操作的特权模型放在另一个模型后面,中间使用过滤器进行风险审查,即未被审查的内容永远不会发送到特权模型。

资源:

  • gamma,AI帮你做PPT。支持自然语言描述需要生成的内容,自动给出ppt的大纲和每页基本的排版布局; +
  • 3blue1brown,YouTube上最好的数学科普视频,特点是使用动画直观展示计算原理; +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-49-39.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-49-39.png" new file mode 100644 index 000000000..a3d86a0be Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-49-39.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-50-33.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-50-33.png" new file mode 100644 index 000000000..416592e84 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-50-33.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-51-20.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-51-20.png" new file mode 100644 index 000000000..bc0093eeb Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-51-20.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-51-53.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-51-53.png" new file mode 100644 index 000000000..82a9e7d2d Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-51-53.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-52-04.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-52-04.png" new file mode 100644 index 000000000..a80f4871b Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-52-04.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-52-39.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-52-39.png" new file mode 100644 index 000000000..cd5829e4b Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-52-39.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-53-28.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-53-28.png" new file mode 100644 index 000000000..04f6da05a Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-53-28.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-53-58.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-53-58.png" new file mode 100644 index 000000000..04d72e68d Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-53-58.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-54-28.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-54-28.png" new file mode 100644 index 000000000..ee80a54a1 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-54-28.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-55-26.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-55-26.png" new file mode 100644 index 000000000..93ffea3cb Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-55-26.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-56-18.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-56-18.png" new file mode 100644 index 000000000..193c6f141 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-56-18.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-56-43.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-56-43.png" new file mode 100644 index 000000000..6111a766e Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/2023-05-31-09-56-43.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/index.html" new file mode 100644 index 000000000..c35345e6f --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-034-\346\234\237/index.html" @@ -0,0 +1,22 @@ +机器文摘 第 034 期

机器文摘 第 034 期

机器文摘 第 034 期

机器文摘 第 034 期

研究

  • 图解内存分配,文章展示了 C/C++ 编程中的内存分配过程,包括静态和动态内存分配技术、它们的优势,以及有效的内存管理所需考虑的事项。以图解的形式展示了内存分配过程,希望读者可以通过本文更好地理解内存分配相关的概念,并在实际编程中对内存进行更加高效的管理。 +
  • 文件系统五十年,这是一个系列文章,详细记录了计算机文件系统的发展历程。也许我们身在其中无法感受到它的进步,但是回顾历史我们会发现,即便是我们不容易注意到的部分,也在不停地发展和优化。 +
  • 只有512字节的C编译器,这篇文章介绍了一个怎样实现最小编译器的思路,SectorC (github) 是一个用 x86-16 汇编编写的 C 编译器,适合 x512 机器的 86 字节引导扇区。它支持 C 的子集,足够大,可以编写真实有趣的程序。它很可能是有史以来最小的C编译器。 +
  • 上世纪50~60年代的计算机艺术,数字艺术的发展简史。 +
  • win10的隐藏功能,原来win10还有这个功能。按Ctrl + Alt + Del 后,按住Ctrl不松,再点击右下角的电源符号,就会进入紧急重启(Emergency Restart)界面。应该是一种强制重启。 +

资源

  • Ecoute,可用于远程面试作弊的工具?Ecoute 是一种实时转录工具,可在文本框中为用户的麦克风输入(您)和用户的扬声器输出(扬声器)提供实时翻译。它还使用 OpenAI 的 GPT-3.5 生成建议答复内容,供用户“参考”。 +
  • rask.ai,自动将视频转成“译制片”,在对内容进行翻译的同时,会尽量保持之前的音色和语调,端到端给你的视频完成多语配音,后续还会推出唇形同步合成。 +
  • Tango,一个Chrome浏览器插件,能帮你生成一个网站的操作指南。它会自动记录所有的操作流程,并做相应的截图和注解文档。你只需要点一遍就行了。目前还只能生成英文版的,不过自己翻译也不麻烦。可以节省不少时间。 +
  • WebGPU-torch,PyTroch的webgpu实现。我测试了一下,我的浏览器目前还不支持。 +
  • basic-english,“基础英语”的概念是:25,000个单词的牛津袖珍英语词典去掉冗余,并消除组合单词,90%的概念可以用850个单词来实现。使用这些基础英语可以简化日常工作和交流。 +
  • Web界面准则,讲解如何提升网页界面的交互性、排版、动画、辅助功能、优化和设计。 +
  • excalidraw,开源虚拟手绘风格白板程序,支持端到端加密在线协作。 +

沉思录

  • 一切商业的本质都是:收购一些东西(包括原材料、人力服务),经过加工(加工过程产生价值)后变成产品或服务出售。这里的原材料可以是实体物品也可以是信息。所以关键动作就是:收、加工、出售,从重要性上来说,出售大于加工大于收。所以如果要策划自己的产品,解决和分析问题的优先级也应如此,我之前想的正好一反;

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-09-37.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-09-37.png" new file mode 100644 index 000000000..465a0dc1e Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-09-37.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-12-49.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-12-49.png" new file mode 100644 index 000000000..c2887792c Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-12-49.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-17-33.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-17-33.png" new file mode 100644 index 000000000..512afa614 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-17-33.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-20-19.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-20-19.png" new file mode 100644 index 000000000..285d848de Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-20-19.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-21-40.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-21-40.png" new file mode 100644 index 000000000..19b9078bc Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-21-40.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-22-42.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-22-42.png" new file mode 100644 index 000000000..2778d7cf4 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-22-42.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-24-07.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-24-07.png" new file mode 100644 index 000000000..4ea0d7ef3 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-24-07.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-26-05.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-26-05.png" new file mode 100644 index 000000000..4dfb36177 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-26-05.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-26-50.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-26-50.png" new file mode 100644 index 000000000..403aabe74 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-26-50.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-27-26.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-27-26.png" new file mode 100644 index 000000000..7aead19f4 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-27-26.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-28-23.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-28-23.png" new file mode 100644 index 000000000..3e21d1772 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-28-23.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-29-07.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-29-07.png" new file mode 100644 index 000000000..32690999b Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-29-07.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-30-19.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-30-19.png" new file mode 100644 index 000000000..2d578875b Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-30-19.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-31-04.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-31-04.png" new file mode 100644 index 000000000..d003f24b6 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-31-04.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-31-49.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-31-49.png" new file mode 100644 index 000000000..e3520bcbd Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/2023-06-07-10-31-49.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/index.html" new file mode 100644 index 000000000..338d673ed --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-035-\346\234\237/index.html" @@ -0,0 +1,25 @@ +机器文摘 第 035 期

机器文摘 第 035 期

机器文摘 第 035 期

机器文摘 第 035 期

研究

  • 笔记帮我们记住还是忘记?这篇文章讨论了笔记对帮助我们遗忘的作用。作者认为,随着时间的推移,我们无法记住所有的事情,但是只要我们记录了重要的信息,就可以在需要时再次查找,因此笔记实际上帮助我们遗忘。 +
  • 高保真神经表面重建,Nvidia 新发布的这个 Neuralangelo 有些猛,随便给一个视频就能进行精细3D建模,也许要不多久激光点云技术就要淘汰了。值得关注 ! +
  • Windows XP 激活算法被破解, XPKeygen是一个可以随意生成XP有效安装密钥的程序,当前的电脑可能用不到了。不过可能还有一些老旧的设备,只能通过 Windows XP 来操作,这时候这个东西就派上用场了。 +
  • 一个整活儿的开源编辑器,data:text/html;base64,PGh0bWwgY29udGVudGVkaXRhYmxlPmVkaXQgbWU8L2h0bWw+ 把这个代码粘到浏览器地址栏,竟然是个记事本app,如果从IDE拷贝代码过去,竟然还支持代码高亮。。。。加入到收藏夹即可食用。 +
  • 3D打印拯救海龟 ,2017年,伯奇水族馆与加州大学圣地亚哥分校图书馆的数字媒体实验室合作。他们一起创造了一种首创的3D打印支架,以固定她的外壳上的缝隙。现在,六年后,这种生物及其照顾者继续从这项发明中获益。这只海龟最近接受了年度检查,健康状况良好。 +
  • 破解“智能”牙刷 国外一个博主记录了他破解自己的电动牙刷的过程。由于牙刷的NFC芯片采用的加密方式是密码加密,并且在通讯过程中是用了明文传递,所以他采取了截获通讯信号的方式窃听到了密码,然后就解锁了各种姿势开始为所欲为了。。。 +
  • 真·AI相机 ,paragraphica 是一个没有镜头但是却有物理实体的“AI相机”,使用位置、时间等参数数据生成特定地点和时刻的prompt,然后由人工智能来生成“照片”。 +

资源

  • Droa,一个通过自然语言进行网站开发的工具,你只需要提需求,剩下的交给AI。 +
  • StableDiffusion-CheatSheet,经常用 Stable Diffusion 进行 AI 绘图的,可以看下这个开源速查表。里面拥有超过 700 种经过测试的艺术风格,可快速搜索查找各类艺术家,并支持一键复制 Prompt。 +
  • 你一直想知道的关于数学的一切,此书是CMU数学科学系的博士生布兰登·W·沙利文撰写的,旨在引导读者进入抽象数学和证明写作的世界,帮助培养读者的数学思维和表达能力。主题涵盖集合、逻辑、归纳法、关系、函数、基数和组合数学等基础和工具。暂未有中文翻译。 +
  • Python进阶,是《Intermediate Python》的中文译本。2021最新目录版,实时更新托管在GithubPages。 +
  • CSSPro,一个所见即所得的在线CSS可视化开发工具,直接在页面运行,那里修改点哪里。效果真的很惊艳。 +
  • Plane,开源版 JIRA !不少软件开发者都使用JIRA进行缺陷管理,JIRA确实很强大,也很好用。现在,开源版的来了,据说完全可以作为JIRA的平替。 +
  • 机器学习系统:设计和实现,一本关于机器学习的电子书,本书希望做成世界上第一本全面讲述机器学习系统知识的开源书籍。可以看作一门衔接机器学习和计算机系统的课程 ​​。 +
  • Callanie,练习英语口语的AI对话机器人,支持国内手机号注册,免费且流畅。后端基于大语言模型,可以陪你聊各种话题。 +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-49-03.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-49-03.png" new file mode 100644 index 000000000..ca66c1833 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-49-03.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-49-59.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-49-59.png" new file mode 100644 index 000000000..979c3c0df Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-49-59.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-50-39.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-50-39.png" new file mode 100644 index 000000000..06672f5d9 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-50-39.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-51-29.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-51-29.png" new file mode 100644 index 000000000..d405c9648 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-51-29.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-52-02.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-52-02.png" new file mode 100644 index 000000000..cadbaa934 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-52-02.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-52-48.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-52-48.png" new file mode 100644 index 000000000..1526b715a Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-52-48.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-53-34.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-53-34.png" new file mode 100644 index 000000000..e9b59b103 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-53-34.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-53-58.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-53-58.png" new file mode 100644 index 000000000..c792df517 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-53-58.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-56-24.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-56-24.png" new file mode 100644 index 000000000..b7c16ee5e Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-56-24.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-57-18.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-57-18.png" new file mode 100644 index 000000000..cffbe4975 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-16-57-18.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-17-02-19.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-17-02-19.png" new file mode 100644 index 000000000..daeee31e4 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-17-02-19.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-17-02-52.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-17-02-52.png" new file mode 100644 index 000000000..70abbcda5 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-17-02-52.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-17-15-39.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-17-15-39.png" new file mode 100644 index 000000000..d9d296b2a Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-17-15-39.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-17-16-02.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-17-16-02.png" new file mode 100644 index 000000000..e15e6d20e Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/2023-06-14-17-16-02.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/index.html" new file mode 100644 index 000000000..7d86fe33b --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-036-\346\234\237/index.html" @@ -0,0 +1,24 @@ +机器文摘 第 036 期

机器文摘 第 036 期

机器文摘 第 036 期

机器文摘 第 036 期

研究

  • 软驱阵列演奏音乐,国外大神用512个软驱、16个硬盘、4个扫描仪,组装成阵列,通过编程的方式控制电机震动发出声音,组成各声部。这么多软驱,让我想到了退休老干部合唱团。 +
  • 大脑能像身体那样锻炼吗?,如何训练大脑?提高记忆力、注意力和智力!这个视频进行了讲解,总之就是,用进废退,改变日常默认行动,让大脑动起来。 +
  • 用纯汇编写一个GUI,跟随这篇教学文章,通过编写图形界面的方式来学习汇编语言吧。顺便,作者想挑战一下,最小的GUI程序其可执行二进制文件能有多小。(现在的可执行文件动不动就好几十上百MB)​。 +
  • 让 ChatGPT 帮我们总结 Hacker News,让AI每天帮我总结新闻摘要,这个想法我已经考虑很久了,现在已经有人做了实现。这篇文章介绍了一个开源静态网站的实现,它利用 ChatGPT 的总结能力,直接将每条Hackernews的新闻用一两句话总结出来,然后发布到GithubPages 可以节约我们每天看新闻的时间。 +
  • 马斯克专访:推特的混乱过去了,现在的目标是最大化用户无悔时间!,我不喜欢看八卦,但是科技的除外。马斯克收购 Twitter 几个月过去了,大家还在等着看笑话,但是为什么没等到,以及开掉一半人之后效率却提升那么多? +

资源

  • FinGPT,一个面向金融领域的开源语言模型,采用以数据为中心的方法,为研究人员和实践者提供易于使用的资源,致力于做金融领域的chatGPT。 +
  • Audiocraft,facebook发布的一个PyTorch库,用于音频生成的深度学习研究。目前,它提供了用于从文本生成音乐的MusicGen代码和模型。模型使用2万小时正版授权音乐训练。 +
  • Mercury,在 Jupyter Notebook 中构建 Web 应用程序,允许您在Python笔记本中添加交互式小部件,然后将笔记本发布为带交互界面的Web应用程序。我的感受是,Mercury就是 notebook版的gradio ​​​。 +
  • ReactPy,React是最流行的用于构建UI的前端框架,现在所有Python开发人员都可以使用它。比起gradio,这个reactpy的抽象层级更低一些,自由度更高了,我猜测目标用户应该是不喜欢写前端代码但是又希望掌控页面细节的python程序员。 +
  • GGML,一个用于机器学习的张量库,采用纯C++实现,无其他依赖项。旨在在普通硬件上实现大型模型和高性能。它同时也是 llama.cpp 和 whisper.cpp 的底层库。 +
  • Scrcpy,一个让人相见恨晚的app,可以通过USB或TCP/IP连接镜像Android设备的视频和音频,并允许使用计算机的键盘和鼠标来控制设备。它不需要任何root权限,并且兼容Linux、Windows和macOS操作系统。 +
  • Tafi,通过自然语言生成3D模型,质量号称接近AAA级游戏,可以导出创建的角色到Blender、Unreal 或 Unity中。 ​​​ +
  • canvas-editor,一个基于 canvas/svg 实现的富文本编辑器,在市面上,使用 Canvas 实现整个编辑器的开源项目并不常见,大多数情况下仍然使用 DOM 来实现。使用 Canvas 的最显著特点是其出色的性能,但实现起来的成本也更高。 +
  • markmap.js,一个用markdown文本制作思维导图的工具,提供了vscode的插件可直接在编辑器预览。 +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-15-55-06.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-15-55-06.png" new file mode 100644 index 000000000..830eb81ec Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-15-55-06.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-15-55-33.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-15-55-33.png" new file mode 100644 index 000000000..4395d06d6 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-15-55-33.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-15-56-11.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-15-56-11.png" new file mode 100644 index 000000000..7dbc884ff Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-15-56-11.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-15-56-28.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-15-56-28.png" new file mode 100644 index 000000000..a76eedace Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-15-56-28.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-15-58-53.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-15-58-53.png" new file mode 100644 index 000000000..03b017939 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-15-58-53.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-15-59-12.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-15-59-12.png" new file mode 100644 index 000000000..797556582 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-15-59-12.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-15-59-33.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-15-59-33.png" new file mode 100644 index 000000000..cd0fef847 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-15-59-33.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-16-00-11.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-16-00-11.png" new file mode 100644 index 000000000..91269ed88 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-16-00-11.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-16-00-26.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-16-00-26.png" new file mode 100644 index 000000000..37eecbbb0 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-16-00-26.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-16-00-47.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-16-00-47.png" new file mode 100644 index 000000000..25819629a Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-16-00-47.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-16-01-04.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-16-01-04.png" new file mode 100644 index 000000000..75e623226 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-16-01-04.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-16-01-41.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-16-01-41.png" new file mode 100644 index 000000000..99a6879b9 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/2023-06-20-16-01-41.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/index.html" new file mode 100644 index 000000000..9772ae1c1 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-037-\346\234\237/index.html" @@ -0,0 +1,22 @@ +机器文摘 第 037 期

机器文摘 第 037 期

机器文摘 第 037 期

机器文摘 第 037 期

研究

  • SnapFusion 文本到图像的扩散模型可以从自然语言描述中创建令人惊叹的图像。然而,这些模型很大,需要高端 GPU 在服务端运行模型。SnapFusion提出了一种通用方法,可以在移动设备上运行的文本到图像扩散模型,且出图时间不到2秒。 +
  • Framer 发布了 AI 工具,直接根据文字需求生成页面,我试了一下,对于个人博客、产品介绍页面等静态展示类型的页面,生成的效果还是十分理想的,而且同步提供桌面端和移动端页面。 +
  • #ffffff还“白”的“超级白”,这里有网友介绍了一个方法,可以显示更高对比度的二维码(以方便用户扫描识别),据说白的程度超出了sRGB颜色范围,前提是你的显示设备支持HDR。作者的思路是用一段HDR视频在网页中伪装成显示二维码的图片。 +
  • 我在21小时内重启系统29万次,Linux 6.4内核有一个bug可能导致启动时挂起,但概率很低。为了复现bug,Richard WM Jones重启了29万次电脑,最终找到了问题。这让我想起了之前修改不容易复现Bug的艰辛。 +
  • 我发现一个用chatGPT翻译整段文字的小技巧,那就是在他翻译完成之后,再将这段话发给他,让他根据通顺程度和合理性进行二次润色,出来的结果就好很多了。 +
  • Python写代码很爽,但是想打包发布成果的时候就稍微麻烦一些了,毕竟一大堆环境依赖和包依赖。我之前一直用的是PyInstaller作为打包工具,但是现在我又发现了这个Nuitka。它的打包原理是:直接把 Python 代码转成 C 代码再编译,这样打包出来的成果占用小、执行效率也高,尤其适合PyQt编写的桌面程序。另外,著名的 Blender 就是用 Nuitka 编译的。 +

长文

它提出了一个有趣的观点,我以前从未意识到:

每样东西都需要支付两次成本。

通常,我们只关注第一次支付的成本,也就是购买时花的钱,比如买一台相机、一架钢琴或一本小说。

然而,作者指出,如果你不支付第二次的成本,你之前花的钱就等于打水漂了。

第二次成本指的是,你需要花时间和精力去充分使用你所购买的物品。

比如认真阅读一本书,练习钢琴以提高演奏水平等等。

然而,我们常常只停留在第一次购买时的满足感上,然后追求下一个。

随着时间的推移,大量未支付第二次成本的物品使我们积累了一种无形的债务。

为此经常感到挫败。

这种挫败感促使我们寻求那些能够刺激我们的短期享受,比如玩手机、享用美食。

进一步导致没有时间支付第二次成本。

那么,有什么办法可以改变这种情况吗?

作者说,唯一的解决办法就是控制购买欲望,强迫自己安排时间来履行第二次支付的责任。

尽管这听起来可能有些不舒服,但如果我们能克服这种不舒服的临界点,例如学会一首乐曲,耐心读完一本书,我们将会获得意想不到的奖励时刻。

资源

  • ratatype,在线键盘盲打指法练习,有完整的练习教程,从初级到高级都有。有点儿像Dos时代的著名打字练习软件TT,不过是网页版的。 +
  • 0A.D.,帝国时代是个经典游戏,这里有个开源版,名字叫做0AD,由Wildfire Games开发,虽然是免费开源的游戏,但是效果和可玩性都非常高,适合在周末的午后来一把怀旧局。 +
  • landing.love,一个专门收集各种网页动画效果的网站,目前已收录超过400个具有新颖创意动效的网站,并配有截图和录屏视频。 +
  • infinigen,一款面向计算机视觉研究的3D场景自动生成器,提供多样且高质量的3D训练数据。基于Blender,免费且开源。可以通过重写随机化的默认参数来完全控制资产生成。提供了对自然界中多种对象和场景的生成器,包括植物、动物、地形以及火、云、雨、雪等自然现象。 +
  • 8086-emulator-web ,用js编写的的8086 cpu模拟器,支持汇编语言在线编写、编译和调试运行,是一个学习汇编语言和理解计算机原理的好工具。 +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-15-53-23.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-15-53-23.png" new file mode 100644 index 000000000..21578e433 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-15-53-23.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-15-54-05.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-15-54-05.png" new file mode 100644 index 000000000..586fb1bbf Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-15-54-05.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-15-56-35.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-15-56-35.png" new file mode 100644 index 000000000..6c315937c Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-15-56-35.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-15-56-57.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-15-56-57.png" new file mode 100644 index 000000000..af7885cdf Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-15-56-57.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-15-58-24.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-15-58-24.png" new file mode 100644 index 000000000..cc8596c0c Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-15-58-24.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-15-58-38.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-15-58-38.png" new file mode 100644 index 000000000..8103951ad Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-15-58-38.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-15-59-26.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-15-59-26.png" new file mode 100644 index 000000000..910852e98 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-15-59-26.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-16-00-25.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-16-00-25.png" new file mode 100644 index 000000000..0c4c2a0a8 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-16-00-25.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-16-01-00.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-16-01-00.png" new file mode 100644 index 000000000..67679e042 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/2023-06-27-16-01-00.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/index.html" new file mode 100644 index 000000000..bb774aefa --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-038-\346\234\237/index.html" @@ -0,0 +1,19 @@ +机器文摘 第 038 期

机器文摘 第 038 期

机器文摘 第 038 期

机器文摘 第 038 期

研究

  • ChatGPT的“奶奶漏洞”,奶奶漏洞来源自一个用户说他已经过世的奶奶是凝固汽油弹工厂的工程师,用户让 ChatGPT 用他奶奶说睡前故事的形式,详细介绍了凝固汽油弹的制作方法。以此来绕过 ChatGPT 的安全审查,结果当然是,他得逞了。后来还有网友做了试验,以同样的方式可以套取 Windows 各个版本的序列号。 +
  • 国外也有“垃圾佬”,这篇《怎样低成本搭建深度学习电脑》的文章,介绍了作者怎样通过在二手网站上“捡垃圾”搭建出了性能良好且便宜的GPU工作站。 值得一提的是,作者购买的主要渠道竟然来自国内的著名二手物品交易平台,某鱼。 +

长文

  • 回顾这些年软件研发的历程,凡是能够做成的软件,无一例外都是抓住了真正存在的需求。这样的需求未必很宏大或者华丽,但一定不是想象种的伪需求。仔细分析之后就会发现,在一个软件产品的生命周期里,开发者所面临的真正(或者说正确的)需求很少,因为找到它们十分不易,它们周边布满了被人们主观意识强加上的伪需求。《伪需求是糟糕软件的根源》,文章探讨了软件开发中存在的一个问题,即虚构的问题(我将之译为:伪需求)如何导致糟糕的软件结果。 +

  • 有没有考虑过一个问题,即:为什么随着科技的发展和生产力的提升,人们不是越来越清闲,反而越来越劳累了?这里有篇文章探讨了一些深层次的原因,《狗屁工作》,此文写于 2013 年,作者是 David Graeber (一名人类学教授)。文章讨论了现代社会中存在的一种现象,即许多人在工作中感到他们所从事的工作毫无意义,没有真正的价值和目的。这些工作被称为"狗屁工作",作者试图探究狗屁工作的存在原因和对个体和社会的影响。 +

资源

  • Sarasa Term SC Nerd,写中文Markdown文件的时候,最怕遇到表格,因为编辑器按照一个中文字符的宽度等于两个英文字符的宽度进行计算,而很多字体在设计时未考虑严格按照这种2:1的宽度比例设计字形,导致在Markdown在编辑状态时的表格分割线错位,看起来十分头疼。经过多方对比,我终于找到了让自己满意的等宽字体,支持中英文字符2:1宽度比例,中文为黑体,英文字符也特别适合写代码。此外还整合了Nerd fonts,支持在终端显示各种漂亮图标。 +
  • ReviewGPT 写作文、写报告、写邮件,生活中充满了各种写作任务。ReviewGPT 基于 gpt 模型,可为你的文章进行打分、评价,提出修改意见,甚至还可以扮演莎士比亚、金庸等知名作家,帮助你重新撰写,快速提升文章质量。 ​​​ +
  • try,刚发布的一个命令行工具,目标是允许你执行命令的时候先检查其执行的后果,然后再决定是否让命令真正生效。真正起到了安全保护的效果。官方介绍这个命令是基于 Linux 的命名空间(通过 unshare )和 overlayfs 联合文件系统等技术实现。并特别提醒并非基于沙盒,所以还是谨慎执行危险操作吧。比如try rm rf /*。 +
  • DragGAN, 通过拖动就可以完全操纵图像的 AI 模型,现已开放源码! DragGAN 是由谷歌、麻省理工学院和马克斯普朗克研究所创建的一种新的人工智能模型。可以让你轻松通过点击拖动等简单的交互操作就能改变拍摄对象的姿势、形状和表情。 ​​​ +
  • flameshot,一个超强的免费截图软件,可以像任何一个截图工具一样截图,最重要的是还有一些附加功能,按一下数字图标,就可以在屏幕上按数字顺序自动生成步骤图示,非常适合生成操作步骤说明。 +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-13-52-23.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-13-52-23.png" new file mode 100644 index 000000000..062d8b5a2 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-13-52-23.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-13-55-53.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-13-55-53.png" new file mode 100644 index 000000000..682f6faef Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-13-55-53.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-14-12-47.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-14-12-47.png" new file mode 100644 index 000000000..e391323a4 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-14-12-47.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-14-13-31.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-14-13-31.png" new file mode 100644 index 000000000..7330bf20c Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-14-13-31.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-14-13-53.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-14-13-53.png" new file mode 100644 index 000000000..29c6c4f76 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-14-13-53.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-14-14-11.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-14-14-11.png" new file mode 100644 index 000000000..8d04957cc Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-14-14-11.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-14-14-52.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-14-14-52.png" new file mode 100644 index 000000000..68df4c2d4 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-14-14-52.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-14-15-25.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-14-15-25.png" new file mode 100644 index 000000000..e76e25aff Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-14-15-25.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-14-15-45.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-14-15-45.png" new file mode 100644 index 000000000..6dca8cc87 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-14-15-45.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-14-16-44.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-14-16-44.png" new file mode 100644 index 000000000..2290482ec Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/2023-07-04-14-16-44.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/index.html" new file mode 100644 index 000000000..4295ce47d --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-039-\346\234\237/index.html" @@ -0,0 +1,21 @@ +机器文摘 第 039 期

机器文摘 第 039 期

机器文摘 第 039 期

机器文摘 第 039 期

长文

  • 关于写作的通用问题,“元技能”一般指比普通技能更高阶的技能,我理解为可产生技能的技能,此类技能并不会随着外部环境的高速发展而被淘汰。比如写作就算是一种元技能,当不知道该训练和提升什么技能的时候,将时间花在“元技能”的提升上准没有错。这篇文章主要讲解英文写作的常见问题,但是有些我觉得对于中文也适用。比如文章开头提到的两个基本原则:“在写之前就弄清楚自己想表达什么”、“即便是你已经写完了一整篇,如果没能表达你的意思那也是废纸”。 +

  • 新电脑快还是老电脑快?,上周有博主在twitter发布了一个视频吐槽了一个我也困惑很久的事情。作者展示了他在一台古董电脑上运行Windows NT 3.5 的情况,视频中的电脑基本可以做到秒开程序,然后又展示了一台配备了Windows 11的Surface平板电脑,操作起来界面响应有明显延迟。后者cpu频率为前者的4倍,内存容量为前者的6倍。 +

现在的硬件性能动辄就比之前的老硬件几十甚至上百倍的提升,但是我们的交互体验呢?能够秒开的程序甚至还不如二十年前的老爷机。 +后来这事儿在twitter引发了一些争议,有人认为现在的软件确实吃掉了硬件提升的性能,对体验来说提升不足。也有人说现在的体验与以往不可同日而语,这样的对比不公平也没有意义。

博主不得不专门写了一篇文章来回应,详细记录了作者认为更加合理的对比过程。

我个人认为首要原因就是随着硬件性能的提升,软件开发者的精力已经逐渐从性能向开发效率倾斜了。由于现在硬件成本确实低廉,软件迭代周期变得越来越短,软件开发者也越来越没有动力做出极致挖掘硬件性能的软件。

不信你看,现在越来越多的应用程序不再使用原生开发,而是采用了可以“跨平台”的web技术。

这样使得软件界面的响应直接下降了一个数量级。(我在使用vscode的时候甚至还会遇到打字卡顿慢慢弹出字符的情况。)

另外,复杂的设计模式和软件架构,也吃掉了不少硬件性能,因为每增加一层抽象,都会消耗资源,而现在各种复杂的架构就是拼命地增加抽象层。

希望以后市场能够鼓励开发者多做挖掘硬件性能的事情吧。

  • 文字渲染比你想象的要复杂,这篇文章的作者曾负责火狐浏览器的文字渲染引擎,他写这篇文字的目的是科普一下关于文字渲染的一些基本技术和困难。在阅读之前,我也简单的以为,文字渲染就是把对应的字符字形从字体库中取出来然后绘制到相应的位置即可,但实际情况确实比这要复杂得多。比如,文中提到的关于“连字符”的处理、“抗锯齿”、“书写方向”等问题,每一个都是开发者的头发杀手。 +

资源

  • rrweb,可在网页上记录用户行为并导出视频文件。可用于:排查用户错误、保险业务签署、内部风控、用户交互分析等。rrweb采用虚拟化转换DOM、记录变更和操作过程,并通过链表回放数据。存储最小化、回放可快进且跳过无效行为。 +
  • DragGAN-Windows-GUI,DragGAN(上周介绍过的开源模型,可以针对图片进行交互式拖动修改)的懒人包,解压直接用,内置17个模型。 ​​​ +
  • deep-sea,这个网页可以让你查看海洋各个深度都是有哪些生物,果然是越往下越看不清,所以大家就随便长长了,不讲究好看不好看了。 +
  • 电子书《Elements of Programming》,这本老书在出版十年后推出了免费pdf版。中文译作《编程原本》,旨在介绍通用的程序设计原理和技巧,重点关注程序设计的基本元素和抽象概念。这本书的核心思想是将程序设计看作是一种构建和操作抽象概念的过程。它强调程序设计应该建立在数学原理和精确性基础上,通过抽象和泛化来创建可重用、可扩展和可维护的软件。 +
  • devpod,Github 的 Codespaces 和微软的 VSCode DevContainers 给开发者提供了即开即用的云端开发环境。现在,他们的开源平替来了,devpod 是一个开源的开发环境容器,可以方便地在任意客户端(Mac、Win、Linux)或云端主机创建体验一致的开发环境,并且可以与VSCode和Jetbrains等IDE直接集成。 +
  • 从零开始训练大语言模型的最佳实践,训练大语言模型的技术白皮书,从基本概念和技术讲起,教你训练大语言模型。 +
  • windbg,一本电子书,讲了很多 windbg 调试器的高级用法,市面上很少见。 +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-040-\346\234\237/2023-07-11-13-02-40.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-040-\346\234\237/2023-07-11-13-02-40.png" new file mode 100644 index 000000000..b625cc7ad Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-040-\346\234\237/2023-07-11-13-02-40.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-040-\346\234\237/2023-07-11-13-03-27.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-040-\346\234\237/2023-07-11-13-03-27.png" new file mode 100644 index 000000000..36d20cecb Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-040-\346\234\237/2023-07-11-13-03-27.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-040-\346\234\237/2023-07-11-13-04-12.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-040-\346\234\237/2023-07-11-13-04-12.png" new file mode 100644 index 000000000..44bebaa0c Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-040-\346\234\237/2023-07-11-13-04-12.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-040-\346\234\237/2023-07-11-13-04-26.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-040-\346\234\237/2023-07-11-13-04-26.png" new file mode 100644 index 000000000..f25ea9fd4 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-040-\346\234\237/2023-07-11-13-04-26.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-040-\346\234\237/2023-07-11-13-05-17.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-040-\346\234\237/2023-07-11-13-05-17.png" new file mode 100644 index 000000000..028e8232c Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-040-\346\234\237/2023-07-11-13-05-17.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-040-\346\234\237/2023-07-11-13-05-41.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-040-\346\234\237/2023-07-11-13-05-41.png" new file mode 100644 index 000000000..fc3f227c3 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-040-\346\234\237/2023-07-11-13-05-41.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-040-\346\234\237/2023-07-11-13-05-59.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-040-\346\234\237/2023-07-11-13-05-59.png" new file mode 100644 index 000000000..2903bae77 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-040-\346\234\237/2023-07-11-13-05-59.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-040-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-040-\346\234\237/index.html" new file mode 100644 index 000000000..cf3cee910 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-040-\346\234\237/index.html" @@ -0,0 +1,25 @@ +机器文摘 第 040 期

机器文摘 第 040 期

机器文摘 第 040 期

机器文摘 第 040 期

长文

前端代码检查插件ESLint和美化插件Prettier的冲突

+在使用VSCode等现代化编辑器进行前端开发的时候,很多工程样板都默认开启了代码检查和自动格式化的功能,其中以 ESLint 插件和 Prettier 插件为主。

之前有一阵子我总是困惑这两个插件的区别,甚至如果配置不好的话,还会有冲突。

比如 Prettier 插件会在你保存源码的时候按照既定规则进行“美化”代码,如去除行尾分号、增加表达式中的空格等等。此时如果ESLint插件的规则配置不同的话,编辑器就会报错并提示要进行“修复”,然而就在你“修复”之后,刚Ctrl+S保存之后,又傻眼了,因为 Prettier 又对代码进行了“美化”。

我周末特意花时间研究了一下,梳理了一下这两个插件的关系以及他们的分工。

首先,他们的职责定位不同:ESLint 用于检查代码编写是否符合某种预定义的规范,可以进行十分详尽的配置和多项检查,比如定义的变量如果未使用可以作为一种警告或者错误,其职责定位以检查为主。而 Prettier 的职责侧重于格式化(美化)代码,对于编写代码的样式如 tab 缩进量、行尾要不要分号、字符串用单引号还是双引号等可以进行统一格式化,一般用于在代码保存的时候进行快速统一样式。

所以两者可以配合使用,但开头提到的规则冲突需要注意。

我个人的习惯是,将两个插件的配置文件里的配置项进行匹配(规则调整为一致),因为我在美化时关注的项并不太多,所以编写这两个配置文件不算费劲。

而网上有人提出了更好的办法,即通过扩展插件的方式,使得 ESLint 自动获取 Prettier 的规则,以自动统一两者的行为。

关于 ESLint 和 Prettier 的具体分析文章和操作建议可以看这一篇文章:

说一说我现在的知识管理工具和流程

+Hacknews 上有网友说Evernote几乎辞退了它的所有员工,才想起来我已经有好几年没用过 Evernote 了。之前大概有将近十年的时间都在使用Evernote(但都是免费用户)。主要使用场景是记录个人的工作日志和借助浏览器插件剪藏一些值得收藏的文章。

后来随着 Evernote 的限制越来越多,体验逐渐下降。我就迁移到了使用纯文本作为知识记录载体的路线上了。

期间使用过 Emacs 的 org 模式,也尝试过 vim 的 wiki 插件,最后选择了现在这个 VSCode + GitHub 的方案,已稳定使用了两年时间。

具体流程如下: +1、使用 VSCode + foamMarkdownAllinOne 等插件实现对 Markdown 的高效编辑,可以实时预览排版效果,foam实现了类似 Obsidian 的文章双向链接和知识关系图谱。我主要使用 Markdown 记录日志和编写知识卡片用于存放个人吸收的信息。 +2、所有内容存放在一个 git 仓库中,同步到 GitHub 上的个人私有仓库,这样可以省去对接网盘的麻烦。 +3、对于互联网上阅读到的有用文章,使用浏览器插件 Web Clipper,可以完整的抓取页面内容到指定的后端存储,这个插件我最喜欢的点是它可以将文章抓取到你指定的GitHub仓库,并作为Issue提交。 +4、来不及看的信息就先抓取到 Issue ,然后等有时间进行整理,形成自己的知识卡片后再关闭该 Issue 。

这套工具及流程的优点: +1、完全免费,不产生任何费用,而且体验不亚于收费软件。 +2、自由度高,存储后端可以自己随意选择,如果嫌 GitHub 麻烦的话,可以自己用网盘同步文件夹。 +3、纯文本载体,这个算是优点吧,格式开放,不会存在别的编辑器打不开的情况。 +4、数据私有,数据随时都在本地(云端的仅作为备份和同步中转),不用担心 SaaS 供应商跑路(你看现在的Evernote)。

欢迎大家讨论。

资源

  • 朋友圈截图生成工具,可以帮你生成逼真的朋友圈截图,可定制头像、评论、点赞个数等细节。收藏这个地址,以后再也不怕被群里晒孩子的家长或者搞活动的商家逼着发朋友圈集赞了。 ​​​ +
  • 86box,老式 x86 架构计算机模拟器,与 Virtualbox 等虚拟化技术不同的是,86box采用纯软件模拟的方式,实现了经典老式 cpu (如 AMD Am486DX4)的各种技术细节,甚至是当时的硬件缺陷(有些老游戏的 hack 需要这些缺陷)。可以完美复现一台上世纪 90 年代的经典 DOS PC ,用来复古怀旧游戏是再合适不过了。 +
  • fastllm,fastllm是纯c++实现,无第三方依赖的高性能大模型推理库(待测试验证)。据宣称:6~7B级模型在安卓端上也可以流畅运行,支持python调用,chatglm-6B级模型单卡可达10000+token / s,支持glm, llmam, moss基座,手机端流畅运行。 +
  • PhotoAI,作者说,他为这个网站大概写了14000行PHP代码,样式全写在了<style>标签里,JS全写在<script>标签里,除了jQuery没用任何框架,就连布局也是使用float:left这种老式的浮动实现。然而这个网站确能给他带来每月差不多 6万刀 的收入。这是不是在吹牛。这个网站的业务是:使用AI生成完全没有任何版权问题的各种人像照片。 +
  • Ironfish synth,用rust写的在线合成器,虽然感觉像个 Demo 但完成度很高,音源部分具有两个振荡器(可选正弦波、方波、锯齿波等)和一个噪波通道,滤波器、效果器齐全,另外还有一个可视化音序器。可基于键盘直接演奏。 +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/2023-07-19-09-28-30.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/2023-07-19-09-28-30.png" new file mode 100644 index 000000000..2cd93d425 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/2023-07-19-09-28-30.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/2023-07-19-09-29-07.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/2023-07-19-09-29-07.png" new file mode 100644 index 000000000..58ab711da Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/2023-07-19-09-29-07.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/2023-07-19-09-29-47.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/2023-07-19-09-29-47.png" new file mode 100644 index 000000000..627154d9d Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/2023-07-19-09-29-47.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/2023-07-19-09-30-40.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/2023-07-19-09-30-40.png" new file mode 100644 index 000000000..63bca983f Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/2023-07-19-09-30-40.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/2023-07-19-09-31-11.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/2023-07-19-09-31-11.png" new file mode 100644 index 000000000..079b2e1eb Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/2023-07-19-09-31-11.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/2023-07-19-09-31-40.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/2023-07-19-09-31-40.png" new file mode 100644 index 000000000..1405cb1a4 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/2023-07-19-09-31-40.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/2023-07-19-09-32-07.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/2023-07-19-09-32-07.png" new file mode 100644 index 000000000..1fa29d879 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/2023-07-19-09-32-07.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/2023-07-19-09-32-58.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/2023-07-19-09-32-58.png" new file mode 100644 index 000000000..57a03700e Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/2023-07-19-09-32-58.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/index.html" new file mode 100644 index 000000000..af1150126 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-041-\346\234\237/index.html" @@ -0,0 +1,18 @@ +机器文摘 第 041 期

机器文摘 第 041 期

机器文摘 第 041 期

机器文摘 第 041 期

长文

C 也能一次编译到处运行了?

+用 C 编写的程序,只编译一次,生成的可执行文件能同时在多个平台运行吗?

这在以往是 java 这类依赖虚拟机执行环境的语言宣称的事情。

然而我今天才听说还有这个神奇的库(好久没关注过c++领域的技术了):CosmopolitanLibc 号称可以使 C 成为一种构建一次就能到处运行的语言,就像Java一样,除了它不需要解释器或虚拟机。相反,它重新配置了GCC和Clang,以输出POSIX批准的多语言格式,该格式在Linux + Mac + Windows + FreeBSD + OpenBSD + NetBSD + BIOS上本地运行,具有最佳的性能和最小的占用空间。

在使用的时候需要引入特殊的库和编译配置,具体执行效果我还没有测试。

然后,这篇文章的作者干脆来个更方便的操作,他给 GCC 打了大约 2000 行的补丁,使得 GCC 直接就嵌入了 Cosmopolitan 库,现在可以在不修改任何源代码(前提是得用纯 C 写)的情况下构建出到处都能运行可执行文件了(Windows也可以吗?我要测试)。

业余无线电入坑指南

+业余无线电跟摄影、HiFi音响这一类的爱好在某种维度上非常相似,在“入坑”的境界上,甚至完全一样。

这里的坑,指需要投入大量精力和资金。

之所以这么说,是因为它们都有一个共同的特点。

即围绕这些爱好有大量的知识可以学习和探索。

比如拿业余无线电来说,上来就一堆“亚音”、“中继”、“频段”、“频差”、“杂散发射”等名词,对标摄影中的“构图”、“光圈”、“快门”、“ISO感光度”等名词。新手若想有所体会,单是这些概念就够琢磨几天的。更不用提后续还有逐渐步入玄学的一些操作流派,乃至一个不留神还会陷入无穷尽的装备升级竞赛。

这类知识对于好奇心强烈、喜欢求知的人来说有着巨大的吸引力。甚至直白的说,我们很可能不是爱好这项技能,而是单纯喜欢探索和求知的过程,喜欢那种获得感。

这篇《业余无线电新手指南》可以普及一些基本知识,愿意入坑的请阅读。

我近期已考取了中国无线电协会的业余无线电操作能力 A 证 算是合法的 HAM 火腿了。

远程办公还能成为趋势吗?

+疫情的时候,远程办公、异地协同等概念一度变得很火爆,当时很多人觉得这又是一个风口。

但随着当时极端环境的消失,各大公司又纷纷将员工从居家办公中召回。

那么?此类与远程协作相关的概念破灭了吗?

各种协同工具、平台相关的市场,还有没有继续扩大的可能,或者说还在等待一个巨大的技术革新来引爆?

这里有个项目,积极收集远程办公相关的信息,包括国内支持的公司清单、工具及使用资料等。

怎样做出伟大的成就?

+昨日读了保罗格雷厄姆(《黑客与画家》的作者)新文章一篇—-《怎样做出伟大的成就》(实际上我觉得可以译为“怎样牛逼”)。

虽然标题看起来略有鸡汤味儿,但读起来还是比较实惠的。

文章从发现和选择要做的事情开始,谈论了一些具体的方法。然后展开讨论了在方法执行过程中可能会遇到的一些问题,以及如何克服。甚至介绍了一些心理暗示技巧。

文章比较长,我个人体会比较深的点如下:

  1. 一个人做什么才能牛逼?答:做自己天赋里有的东西,就是找一些你既有能力又非常感兴趣的事情。
  2. 要养成“自驱”的习惯。让“工作”来源于自己的认知,而不是别人告诉你、让你做的事情。主动,而不是等待。
  3. 拥有一个属于自己的“项目”是一个找到“自驱”的最佳方法。不断观察自己对什么有强烈的好奇心(甚至好奇到大多数人不能理解)可以找到这样的“项目”。
  4. 选定要做的“项目”还应遵循兴奋原则,即:做自己愿意用的产品,写自己想读的故事,而不是执着于满足想象中的不存在的复杂需求。
  5. 注重积累效应,日拱一卒、长期积累,每天写一篇文字,一年下来就是一本书。
  6. 周期性审视自己做的事情,确认它是否偏离了目标(在做自己最想做的事情),及时修正。
  7. 行动的重要性,很多人实际上可以更牛逼,但是因为“谦虚”和“恐惧”导致的拖延使得计划一再搁浅,浪费了时间。

资源

  • jabbr.ai是一个针对拳击比赛的打击判定进行训练的AI模型,可以在智能手机上运行,实时监测视频中拳击选手的打击得分情况,即时进行统计,多个智能手机多视角同时运行可以快速生成总结性视频。模型提供约50种监测参数(质量、步法、压力等)可用于运动员训练分析。 +
  • 浏览器地址栏快捷操作,我今天才知道原来浏览器地址栏还有这些快捷操作(火狐浏览器支持的最多,我测试的Edge浏览器也支持部分操作):
    1. 输入*星号,可以搜索你的收藏夹;
    2. 输入^,可以搜索历史浏览记录;
    3. 输入%,可以搜索当前打开的tab页;
    4. 输入?,可以显示所有搜索建议; ​​​
  • 树莓磁带 一种用树莓派做的小硬件,为了支持在老式电脑中加载程序(之前用磁带存储的那种)。 +
  • 两招教你“永久”关闭 Windows 自动更新(任选一个都可以):
    1. 通过执行代码的方式:reg add “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings” /v FlightSettingsMaxPauseDays /t reg_dword /d 10000 /f Win+R 打开「运行」对话框,输入 cmd 后按下 Ctrl+Shift+Enter,在弹出来的命令行窗口中输入上面的代码,并敲击回车。命令里的 10000 代表停止更新的天数。
    2. 手动把电脑时钟日期改成 2050 年(为了防止时间自动校准,可以暂时断开网络),然后在 Windows 更新设置界面里面点击“延迟更新”,完成设置后再把电脑时间调回来就行了。
  • pkg-size,一个在线监测 npm 包大小的网站,可以实时查看一个 npm 包的真实依赖,网站利用了 web容器技术,直接在浏览器里执行 npm install 操作。 +
  • 3e,一个 VS Code 插件,可以让你在编辑器里直接浏览 3d 模型,基于 webgl 实现。 +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-042-\346\234\237/2023-07-25-13-57-14.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-042-\346\234\237/2023-07-25-13-57-14.png" new file mode 100644 index 000000000..3a7644b64 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-042-\346\234\237/2023-07-25-13-57-14.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-042-\346\234\237/2023-07-25-13-57-33.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-042-\346\234\237/2023-07-25-13-57-33.png" new file mode 100644 index 000000000..5ad0c7953 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-042-\346\234\237/2023-07-25-13-57-33.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-042-\346\234\237/2023-07-25-13-58-12.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-042-\346\234\237/2023-07-25-13-58-12.png" new file mode 100644 index 000000000..7a440afe4 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-042-\346\234\237/2023-07-25-13-58-12.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-042-\346\234\237/2023-07-25-13-58-45.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-042-\346\234\237/2023-07-25-13-58-45.png" new file mode 100644 index 000000000..7accfd8f1 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-042-\346\234\237/2023-07-25-13-58-45.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-042-\346\234\237/2023-07-25-13-59-02.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-042-\346\234\237/2023-07-25-13-59-02.png" new file mode 100644 index 000000000..ecfe1b7a6 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-042-\346\234\237/2023-07-25-13-59-02.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-042-\346\234\237/2023-07-25-13-59-18.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-042-\346\234\237/2023-07-25-13-59-18.png" new file mode 100644 index 000000000..6a117d922 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-042-\346\234\237/2023-07-25-13-59-18.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-042-\346\234\237/2023-07-25-13-59-28.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-042-\346\234\237/2023-07-25-13-59-28.png" new file mode 100644 index 000000000..419962fba Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-042-\346\234\237/2023-07-25-13-59-28.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-042-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-042-\346\234\237/index.html" new file mode 100644 index 000000000..a5e7b1816 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-042-\346\234\237/index.html" @@ -0,0 +1,18 @@ +机器文摘 第 042 期

机器文摘 第 042 期

机器文摘 第 042 期

机器文摘 第 042 期

长文

从 CPU 到操作系统

+整天使用电脑和手机却对它的工作原理一知半解?把你搁 CPU 里是一套不错的科普文章,作者保证你无论是否了解 CPU 的运作方式,读完之后都会有所收获。我原本以为主要讲解 CPU 组成原理,在浏览了一遍之后,发现 CPU 只是引子,后面还讲了很多操作系统相关的知识,很值得一看。 ​​​

基于 GPU 渲染的 UI 界面制作

+基于 GPU 渲染的 UI 界面制作,也是一个系列文章,探讨了使用 GPU 渲染用户界面的一些思路和相关技术实现方法。用 GPU 绘制用户界面不是什么新鲜事,事实上现在大部分游戏的 UI 都是基于 GPU 渲染的,不过这个作者讲的比较深入浅出,对基础介绍的比较多,适合我这种业外人士,读起来通俗易懂。

为什么我们更应该使用 Display port 而不是 HDMI ?

+为什么我们更应该使用 Display port 而不是 HDMI?,简单来说,HDMI 是家电行业制定的接口标准,封闭而保守,Display port 是 PC 行业制定的标准,开放又激进。现在的显卡上一般提供一个 HDMI 接口,仅仅是为了兼容而做出的妥协,不提供多个是因为 HDMI 授权收费。

txt 纯文本才是王道

+喜欢老式合成器的操作方式,不用图形和触摸屏,而是用文本和字符进行交互,可以快速选择音色参数,指哪儿打哪儿,心中有数。

喜欢在控制台的黑窗口通过命令行跟计算机交互,而不是用鼠标在图形界面上点击,不用将鼻子凑在屏幕上,闭上眼睛也能做到精确操作。

喜欢单反相机的肩屏,无论我用什么姿势拨动拨杆、拨轮,肩屏总能用字符给我最快速最准确的响应,告诉我现在的曝光三参数是多少,做到心中有数。

喜欢用 Markdown 文本格式记录信息,只因为文本格式最干净纯粹,利于保存和传播。

这篇《txt纯文本才是王道》的作者表达了跟我同样的喜好,对于使用纯文本保存信息偏爱有加,认为无论是视频、图片还是其他数字形式,在文字面前都是弱小的弟弟。

资源

  • Llama2-Chinese,Llama2中文社区!是一个专注于Llama2模型在中文方面的优化和上层建设的高级技术社区。 基于大规模中文数据,从预训练开始对Llama2模型进行中文能力的持续迭代升级。Facebook近期开源的 Llama 2 模型比较火,号称可以免费商用。我试了一下,效果不如预期,跟 ChatGPT 3.5 比起来还有距离。可能我使用的中文微调 Lora 参数还不够好吧。 +
  • githubunwrapped是一个帮你统计 Github 信息的网站,可以将输入的 Github 账号相关的统计信息生成一段漂亮的动画,展示你使用最多的编程语言、哪天提交的最积极、哪个时段工作效率高(根据文件修改时间?)等。比较有趣的是,这个网站生成动画视频的技术来自一个叫做 remotion的库,它可以使用 React 组件式风格编写动画效果,并通过 Canvas 实现视频文件的渲染。 +
  • lazydocker,继发现 lazygit 和 lazyvim 两个神器之后,我又发现了 lazy 家族新成员:lazydocker!同样是提供终端命令行下的“gui”界面,不过操作对象是 docker 这下管理容器终于可以不再看错乱的 docker 命令输出了。 ​​​ +

观点

  • 关于产品需求的来源:

    对于提供IT相关服务的从业人员来说,无论是在企业还是个人做独立产品,把握好产品的需求、做好产品定义是最关键的事情,是后续做研发、运营的基础。

    而好的产品定义=自己想做+自己能做+用户想用+愿意付费。

    这样的定义应该怎样去发现?

    拿软件举例,大部分软件能给用户提供的最大价值是“将一些事情自动化”和“将一些物理实体虚拟化”。前者能够通过自动化实现工作效率的指数级提升,后者则通过对物理现实虚拟化实现用户对交互体验的指数级提升。

    所以在分析产品需求进行产品定义时可以从身边三个方面入手:

    1. 还有什么事情可以被计算机自动化?
    2. 还有哪些物理实体可以被虚拟化?
    3. 市场上的现有产品,还有哪些可以从上面两个维度提升以增强体验的?

    我发现,无论是企业的产品,还是个人的独立产品,都可以从这些维度进行分析。

  • 基于互联网通道的“业余无线电”:

    不是很理解热衷于用互联网通道进行业余无线电通联的心态。

    今天刚知道现在有一些业余无线电爱好者使用一种叫做 mmdvm 的盒子(热点盒子)进行自主搭建数字中继。

    原理是“热点盒子”用家里的wifi接入互联网,然后热点盒子给业余无线电台提供UV频段的发射接收中继,这样就能轻易通联全国甚至全球的爱好者。

    目前很多拥有支持数字通信的电台的爱好者都很积极地参与这种通联,甚至每周还有打卡点名活动。

    我暂时还不是很理解这种心态。这种依赖互联网进行的通联在我看来(也许是暂时的)早已失去了玩无线电的初衷。如果我想要通过互联网假装进行呼叫,还得依靠家里的无线路由器,那我为什么不干脆使用微信电话?

  • 无头系统: +今天才知道原来我给自己配的远程开发环境有个专业术语叫做 “Headless 无头系统” 啊。我现在基本上可以做到带着笔记本随意移动,开发环境都在远程,在各处体验环境都一样。主要使用: Win10 + WSL2 + Nvidia-Docker + VS Code + Neovim。有时会启用远程桌面 RDP,有时直接 ssh + tmux。有兴趣的话我挑一期详解。

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/2023-08-01-13-57-56.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/2023-08-01-13-57-56.png" new file mode 100644 index 000000000..bce4694e3 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/2023-08-01-13-57-56.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/2023-08-01-13-58-59.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/2023-08-01-13-58-59.png" new file mode 100644 index 000000000..4172e3a3d Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/2023-08-01-13-58-59.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/2023-08-01-13-59-57.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/2023-08-01-13-59-57.png" new file mode 100644 index 000000000..79fb16abb Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/2023-08-01-13-59-57.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/2023-08-01-14-00-27.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/2023-08-01-14-00-27.png" new file mode 100644 index 000000000..6041e377d Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/2023-08-01-14-00-27.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/2023-08-01-14-00-43.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/2023-08-01-14-00-43.png" new file mode 100644 index 000000000..64c315ddc Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/2023-08-01-14-00-43.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/2023-08-01-14-00-57.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/2023-08-01-14-00-57.png" new file mode 100644 index 000000000..c5383d01b Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/2023-08-01-14-00-57.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/2023-08-01-14-01-15.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/2023-08-01-14-01-15.png" new file mode 100644 index 000000000..36b9533f4 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/2023-08-01-14-01-15.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/2023-08-01-14-01-47.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/2023-08-01-14-01-47.png" new file mode 100644 index 000000000..05454ba85 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/2023-08-01-14-01-47.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/index.html" new file mode 100644 index 000000000..b96df6877 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-043-\346\234\237/index.html" @@ -0,0 +1,26 @@ +机器文摘 第 043 期

机器文摘 第 043 期

机器文摘 第 043 期

机器文摘 第 043 期

长文

先做框架再做功能

+Before you try to do something, make sure you can do nothing.

看到这句话第一反应是:这是什么 XX 逻辑?看完作者的文字之后,哦,这是一种软件构建的方法。

意思是说,先宏观再微观,先整体再局部,别一上来就陷入到细节代码的编写中去。

先把框架搭好,具体功能一个也别着急实现,留着占位,先搭一个“什么都不干”的架子,然后再逐渐补充功能。

但也不是真的什么都不干,而是理清了各个关键组件的调用关系以及与开发相关的辅助功能(如打印调试信息)。

这样做最大的好处是,随着功能开发的深入,代码不至于失控,而且具有良好的可调试性和组件问题隔离能力。

随之而来的就是轻松写代码,而不是眉毛胡子一把抓。

神经网络从开始到现在

+The Document is All You Need!

一篇 AI 科普好文章,用较为通俗的语言讲解了神经网络模型原理和发展历程(我感觉有些像生物的进化)。

从最初的由神经元组成的多层感知机开始,然后进化到卷积神经网络 CNN 降低网络复杂度,再进化, RNN 循环神经网络给模型增加记忆能力,记忆能力太强也不行,到了 LSTM 开始让它能够遗忘,再到后面的 注意力机制以及 LLM 语言模型。

比起同类文章,这一篇尽量避免了数学概念的推导和论证,尽量在不看公式的情况下解释基本思路,适合我等小白学习。

代码审查的一些建议

5个关于代码审查的最佳实践,文章记录一些了对代码审查的实践建议,嫌长不看我总结如下:

  1. 一次只审查一个功能特性或者错误修复。
  2. 提前准备好背景交代(在审查之前写清楚这么做的原因和基本思路)。
  3. 利用自动化工具提前做好静态检查,提前统一风格、规范。
  4. 利用提问的方式提出改进建议而不是直接喷,如:“我们真的需要这个断言吗?”
  5. 仔细阅读代码,慢慢来,以充分理解。

资源

  • 微软的 ZoomIT 真是个经典工具,已经默默维护了好多年了,现在版本为7.0。体积小巧才1MB多点儿,绿色免安装,下载解压即用。非常适合进行共享屏幕培训讲解,或者录制教学视频。 + +ZoomIT 快捷键如下: +Ctrl+1:放大屏幕,屏幕静止,然后使用鼠标批注; +Ctrl+2:使用鼠标随意绘制批注,支持 r、g、b、o 等快捷键切换颜色; +Ctrl+3:显示 BreakTime 倒计时; +Ctrl+4:放大屏幕,屏幕继续支持鼠标交互操作,用于放大操作过程; +Ctrl+5:录制屏幕,可与前面几个功能结合使用;

  • driver.js 一个压缩后只有 5K 大小的前端库,可以让你的网站或者 Webapp 迅速集成交互式“使用指南”的能力。 ​​​ +

  • clangjs 一个在浏览器编译、链接、运行 C/C++ 代码的 JS 库。支持 C/C++ 标准库。完全在本地编译,无需网络即可工作。原理: +首先把 Clang 和 LLD 编译为 WebAssembly 使其运行在浏览器中。然后使用 WebAssembly 版本 Clang 把 C/C++ 代码编译为 WebAssembly,最后通过浏览器 API 运行 WebAssembly。 + +附:clangjs源码

  • nms,一个控制台程序,可以将任意命令的输出(ANSI TXT)文本转换成为乱码以达到防偷窥和加密的效果。通过命令管道使用:ls -l | nms ​​​ +

  • Icon Buddy,这个网站有超过 1 百万个免费 svg 图标,可在线自定义颜色。 +

观点

  • 无法眼神交流不是导致远程办公沟通的最大障碍,语音延迟才是:
    • 我之前一直以为远程办公给沟通带来最大的最大障碍是无法眼神交流导致的信息失真,想象着可以通过升级摄像头(比如嵌入在屏幕中)来改善这一情况。
    • 但进行无数次网络会议之后,我体会到了最大的障碍还不是无法眼神交流,而是网络通信带来的(几乎是必然的)严重的语音延迟。
    • 人们对声音延迟的感知和容忍限度大约在10毫秒(现在的电脑声卡在使用 ASIO 驱动之后可以轻松做到本地延迟 8到6毫秒左右,所以可以用于实时录音),大于10毫秒的延迟会带来明显的迟钝感,时间再长一些就会对对话的节奏带来严重影响。(如果体会不到的话,可以回忆一下新闻直播间主持人跟现场记者连线时那种说话总是对不上节奏的尴尬。)
    • 什么时候网络视频会议的延时能缩短到10毫秒以内(唱卡拉OK可以接受的最低延迟),远程办公才能迎来质的飞跃,否则网络视频会议对于工作讨论永远都是隔靴搔痒、效率低下。现在的解决方案普遍还在吹能做到一秒(1000毫秒)以内,任重而道远。 ​​​
  • 现在真正的程序员用什么编辑器 ? +

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-51-26.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-51-26.png" new file mode 100644 index 000000000..d26f50aa4 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-51-26.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-52-14.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-52-14.png" new file mode 100644 index 000000000..46df6b5c0 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-52-14.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-52-42.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-52-42.png" new file mode 100644 index 000000000..3f0c11b4d Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-52-42.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-53-03.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-53-03.png" new file mode 100644 index 000000000..494fa2514 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-53-03.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-53-14.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-53-14.png" new file mode 100644 index 000000000..3e2633d89 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-53-14.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-53-29.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-53-29.png" new file mode 100644 index 000000000..7c3467d3a Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-53-29.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-54-19.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-54-19.png" new file mode 100644 index 000000000..d6c3fc63c Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-54-19.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-54-40.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-54-40.png" new file mode 100644 index 000000000..c03da5161 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-54-40.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-56-00.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-56-00.png" new file mode 100644 index 000000000..1f1f4ef73 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/2023-08-08-09-56-00.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/index.html" new file mode 100644 index 000000000..5c7e2e80f --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-044-\346\234\237/index.html" @@ -0,0 +1,19 @@ +机器文摘 第 044 期

机器文摘 第 044 期

机器文摘 第 044 期

机器文摘 第 044 期

长文

导致 Python 多线程鸡肋的 GIL 是什么

+近期在使用 Python 多线程的时候,遇到了 GIL 全局锁导致的性能问题。

具体来说就是性能提升没有达到预期,对于有些计算任务无法并行执行。

从多核 CPU 占用结果上来看,像极了网上那张经典的围观图,一核干活多核围观。

于是翻阅了相关资料研究一下,发现这是 Python 社区争论多年的问题,而且有很大的历史包袱。

严格来说,GIL 全局锁导致的性能问题与 Python 编程语言没有关系,导致这个问题的原因在于具体实现的 CPython 解释器。

当年解释器开发者为了简单实现对多线程的支持,搞了一个全局锁,以至于在多核时代无法充分发挥 CPU 性能。

而后续又有很多库延续了这项依赖,历史的包袱(屎山?)越来越重,很难下定决心将之移除(据说代价甚至比当年从 Python2.x 迁移到 Python3 还要大)。

如果不想深究具体技术细节只想了解基本的来龙去脉,这里有篇文章为什么 GIL 让多线程变得如此鸡肋?介绍了 Python PIL 的产生背景以及适用于 Python 多线程的业务场景,可以给你的技术决策提供参考。

不过好消息是,就在刚刚(前几天),Python 官方终于宣布要动手取消掉 GIL 了,顿时网上一片沸腾(其实只有一部分人,大多数人都还不知道 PIL 是什么玩意儿)。而且,Meta 也承诺,愿意出工出力(3人年)帮助 Python 社区做针对去除 GIL 的相关开发工作

用树莓派做一个属于自己的高级收音机

+最近接触到 SDR (软件定义无线电)这个领域,感觉挺有意思的。

软件定义无线电是一种无线通信技术,它利用软件来实现无线电通信系统中的信号处理和调制解调功能,而不是传统的硬件电路。

通过软件定义无线电技术,可以实现灵活、可配置和可重用的无线通信系统,大大提高了无线通信的灵活性和性能。

传统的无线电通信系统通常使用硬件电路来执行信号处理、调制解调和频谱管理等功能。这些硬件电路通常是固定的,不能轻易更改,因此限制了通信系统的灵活性和可配置性。

而SDR技术通过将信号处理和调制解调等功能以软件方式实现,可以在通信系统中使用可编程的处理器和通用硬件,从而使得通信系统的功能可以在软件层面上重新配置和调整,而不需要更改硬件设计。

比起灵活性和可配置性来说,我觉得 SDR 最大的优势是成本大大降低。之前必须购买昂贵的硬件才能实现的效果,现在能够通过便宜的、少量的硬件加上软件模拟即可。

我近期就以很低廉的价格购买了一套 SDR 设备,通过 USB 接口连接计算机,可以实现 500KHz到1700MHz频率范围的接收。听 FM 和航空频段不在话下,SW 短波的话受天线影响,我暂时没有调试出好的效果。

跟 SDR 相比,我几千块买的旗舰手台显得既昂贵又功能弱。

这里有篇文章是作者自己动手用 SDR 设备结合树莓派制作了一个看起来还挺专业的宽频无线接收机。

其实这跟音乐制作领域内很多乐器、效果器逐渐被虚拟化的软件、插件代替是一样的。软件虚拟化拥有巨大的优势,随着通用计算硬件的成本越来越低廉,一切能被软件定义的最终都会被软件定义。

家用 WiFi 路由器需要选择哪个“信道”

+近期验证了一个关于无线路由器的传说。

起因是我新买了一个树莓派 ZeroW 带无线版本,没想到板载的 WiFi 网卡天线太弱了。

离路由器稍微远一点,比如放到卧室,传输速率就会大幅下降,我又暂时没能找到合适的外接网卡,一度陷入绝望。

后来灵机一动,看看能不能从路由器那头想想办法,于是打开路由器配置页面,找到了 WiFi 的“信道”设置,将之从“自动”调到了最不常用的“13”。

这里补充一下,WiFi信道一般从1到13,由路由器自动选择,但现在无线环境十分混乱,尤其是 2.4G(树莓派 Zero W 只能连这个规格) 频段,干扰很严重。

但是 13 这个信道很少被路由器自动选用,原因是最初制定标准的时候,不是所有国家和地区都支持,也不是所有终端设备都支持,所以这个信道就成了最不常用的。

在我手动指定信道之后,惊喜地发现,树莓派放在同样的位置,传输速率得到了较大提升并且稳定。看来传说将路由器 2.4G 信道设为 13 可以防干扰是真实的。

什么是路由器的信道?信道设置成什么最合理?

资源

  • 开发人员路线图 是一个学习索引网站,旨在创建路线图、指南和其他教育内容,以帮助开发人员选择学习路径。在 Github 所有仓库中 Stars 排名第七。 ​​​ +
  • AudioGen facebook 开源的声音合成模型,可以根据文字描述生成对应的声音。效果已经很惊人了,这个页面展示了很多样例。我听了一下,觉得以后影视作品里的一部分声音特效应该可以通过 AI 进行生成了。至少像一些嘈杂的人群、婴儿哭声、鸟叫等各种背景音是可以合成的。 +
  • 原来 Chrome 和 Edge 浏览器的 DevTools 里自带了 CSS 动画曲线编辑器啊!可以直接通过鼠标拖动进行调整和预览,十分便捷。 ​​​ +
  • Graphite,一个开源的 2D 矢量图形编辑器,适用于照片编辑、图像处理、图形设计、插图、数据可视化、数字绘画等领域。可以实现项目图稿,数据可视化和自动化。 +

观点

获取高品质信息的需求仍然强烈,只是被淹没了

+三十几年前,电视逐渐取代书籍、报纸等传统媒体的年代,尼尔波兹曼写下了《娱乐至死》。

作者认为:过度追求娱乐和娱乐化的信息传播方式可能导致公众思考能力的下降。

然而这么多年过去了,人们在降低信息质量这条路上越走越远。电视也早已沦为老年人卧床的伴侣,电视节目更是无法占据现代人的时间,取而代之的是手机短视频。

短视频已经成为大部分人闲暇消遣、信息获取的主要方式。这种媒体的变化将进一步降低理解和感受深度信息的能力,使人对深入学习和思考失去兴趣。

虽然获取的信息看似在增多,但现在高质量的信息却越来越少。

短视频等碎片化信息给我的感觉就像是无线电信号的背景噪音,现在的信息“电磁环境”早已被这种噪音充斥。因为“背景噪音”太大,就好像在高楼林立的城市里打开无线电,接收到的全是 LED 路灯和电动车充电器产生的噪波。

不过我还是相信会有包括我在内的相当一部分人,不愿放弃主动思考,不屑于接收低品质信息。

我正在努力做出一些尝试,以后逐渐记录下来:

  1. 降低输入:减少刷碎片信息的时间;
  2. 滤波:使用搜索引擎、RSS服务、newsletter邮件等工具进行整理;
  3. 溯源:尽量选择信息源头获取一手信息,对于技术来说,直接阅读英文文档是一个办法;
  4. 创造:自己制作高质量内容;

摄影师不会被 AI 取代,但是模特很可能会

+即便以后 AI 绘画能够产出更加难以分辨真假的作品。

从目前能看到的各种生成作品来说,还是摄影师负责了主要的创作灵感。

真要说被取代的话,也许“被拍摄对象”经过虚拟化以后,很可能被取代。

以后不仅仅是举着相机的叫摄影师,说不定会诞生面向 AI 摄影这一职业。

到时候器材党玩的不再是镜头,改玩显卡了?

“嘿,你这 N 卡 比我这 A 卡有德味儿,毒!”

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-23-22.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-23-22.png" new file mode 100644 index 000000000..40c4d3b39 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-23-22.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-23-45.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-23-45.png" new file mode 100644 index 000000000..dc2021444 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-23-45.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-24-15.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-24-15.png" new file mode 100644 index 000000000..00fb479ef Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-24-15.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-24-42.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-24-42.png" new file mode 100644 index 000000000..93de783ee Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-24-42.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-25-40.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-25-40.png" new file mode 100644 index 000000000..02429468b Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-25-40.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-25-55.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-25-55.png" new file mode 100644 index 000000000..725dcf197 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-25-55.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-26-13.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-26-13.png" new file mode 100644 index 000000000..7c9b1ae97 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-26-13.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-26-55.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-26-55.png" new file mode 100644 index 000000000..8c7977149 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-26-55.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-27-30.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-27-30.png" new file mode 100644 index 000000000..09ed9eb7e Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-27-30.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-28-20.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-28-20.png" new file mode 100644 index 000000000..e9c9877f3 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/2023-08-15-13-28-20.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/index.html" new file mode 100644 index 000000000..fb55314a4 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-045-\346\234\237/index.html" @@ -0,0 +1,16 @@ +机器文摘 第 045 期

机器文摘 第 045 期

机器文摘 第 045 期

机器文摘 第 045 期

长文

基于浏览器 JavaScript 堆快照的网页爬虫

基于 JavaScript 堆快照的网页爬虫

本文作者介绍了一个实现网络爬虫的新思路,据称已在生产上使用了一段时间,且效果不错。

比较典型的网络爬虫在爬取数据时,大都采用解析网页 DOM 的方式,或直接通过 HTTP 请求流直接解析,或使用无头浏览器进行解析。

但现在这项技术已经被很多网站、平台人为设置很多障碍,比如增加很多随机的嵌套等等。

作者某天福至心灵,想到一个点子。

利用浏览器提供的 JavaScript 内存堆快照功能,将内存里的全部信息扒下来,然后根据对应的 JavaScript 对象属性,按图索骥去找到真正需要的数据。

这种方法比较狠的地方在于,直接从后台的数据结构下手,跳过了对页面 DOM 的分析和拆解,而且据作者说,网站即便想通过混淆此类数据在内存中的属性名称来进行防御,其工作量还是相当大的。

所以,可能短期内无能为力。

作者说,也许全面转为 Web Assembly 才能彻底禁止他这种爬虫。

项目源码在这里

Intel CPU 的“崩溃攻击”漏洞

intel cpu 有一个崩溃攻击漏洞,标识为 CVE-2022-40982,利用此漏洞可以在虚拟机里窃取共享同一个物理 CPU 的其他虚拟机的数据。

这个漏洞可以让恶意程序在本机运行后窃取如密码、加密密钥、以及个人电子邮件等私人数据。

恶意的云计算客户可以利用 Downfall 漏洞从与其共享同一台云计算机的其他客户那里窃取数据和凭据。

据文章作者(也即漏洞发现者)所说,该漏洞存在于 Intel Core 6 代到 11 代 CPU,并且研究人员发现存在通过 Web 网页浏览进行攻击的可能性。

作者开放了一部分用于测试攻击的代码在此

利用树莓派的 GPIO 发射无线信号

原来树莓派的 GPIO 还能干这个,这位老哥使用树莓派的 GPIO 接口直接进行无线电波发射(没错,就是随便扯出一根线就可以当作天线了)。实现了基于树莓派的微型电台。

这得益于 rpitx这个开源项目,项目本来是为了研究和学习一些无线电原理,不过后来逐渐成为一些 SDR 爱好者必不可少的工具了。

我上次看到一个小哥使用 RTL-SDR 录制汽车遥控器信号,然后使用树莓派重复发射出来,成功实现了自家汽车的解锁

资源

  • water,一个在网页里模拟流体动画的 Demo,使用 Haxe 语言编写。源码在这里 +

    Haxe 是一种跨平台的开源编程语言,在其官方网站上称其为"universal language"。

    它可以用于开发多种平台(如Web、移动、桌面等)的应用程序。

    Haxe 提供了强大的静态类型系统,并支持多种编译目标,包括但不限于 JavaScript、C++、Java、C#、Python 等。

    感兴趣的话,这里也有一份 Haxe 的在线教程

  • Fooocus,ControlNet 作者开源的一款新的 AI 画图工具 ,搭建起来比 Stable Diffusion webui 稍微方便了一点,相当于整合包。 +

  • 原来 HTML5 有一个 <progress></progress> 标签,直接写这个标签,不加任何属性的话,就是一个加载动画,非常适合在页面里临时需要一个进度、状态展示的时候。 +

  • 阮一峰老师的 Typescript 教程,发布了。 +

据老师自己说,刚开始也是抗拒的,觉得TypeScript 就是为 JS 语言添加静态类型系统。如果真需要静态类型,可以考虑使用其他更成熟的语言(比如 Rust 和 Java),再编译成 JS(wasm 模块),何必新学一门语言呢。

但是后来发现 TypeScript 越来越流行,成为前端开发的主流工具,各种项目纷纷移植过去。

我虽然对 TypeScript 仍然持保留态度,但是阮老师写的技术书籍读起来都很轻松易懂,所以觉得还是有必要收藏一下​​​。

  • stable-diffusion-webgpu,在网页里运行 AI 画图模型。 +

    基于 webgpu 技术,无需部署,直接在网页里运行。我试了一下,在我的 1080 8G 显存的显卡上 ,可以跑动,但是速度一般。

    上面的图是我只跑了 8 个 steps 的结果。。。 ​​​

观点

AI 画图的品质

为了验证之前关于“模特很可能被AI取代”的想法,自己动手部署 Stable Diffusion webui 测试了一些模型。根据网友分享的提示词尝试生成了一些图片。

感觉效果比我几个月之前体验时又有了不少提升,配合各种微调模型和 LoRA 模型可以生成照片质感和光影的图片。

虽然人物表情和姿态还有些僵硬,不过我相信这是我没有合理调整各个参数以及充分发挥插件性能导致。

多进行尝试和练习,应该能够生成更逼真、自然的照片。

信息的维度

+最近看了一些线性代数相关的知识,在向量、矩阵的各种计算中逐渐有了一些感悟:

古代“老子”思想中的“道”很可能是无限维的,你的任何表达都是对它的一种投影,也就是降维了。所以才是“道可道,非常道”。

每个人都想用最简单的框架去理解世界,将多维的信息硬生生地将为一维。

这样的后果便是,盲人摸象、管中窥豹、一叶障目,不同的观点争得不可开交。

所以在接收时也应该尽量按自己掌握的其它维度进行升维还原,任何信息都不可孤立看待。

如果能从多维信息得视角去认知世界,也许会有转机,这多少就有点儿“阴阳互生、一分为三”的意思了。

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-28-48.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-28-48.png" new file mode 100644 index 000000000..304721e0a Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-28-48.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-29-10.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-29-10.png" new file mode 100644 index 000000000..acd0bf2f9 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-29-10.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-29-37.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-29-37.png" new file mode 100644 index 000000000..454a361d8 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-29-37.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-30-01.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-30-01.png" new file mode 100644 index 000000000..ae1c1dd8f Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-30-01.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-30-29.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-30-29.png" new file mode 100644 index 000000000..26fdbd2fa Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-30-29.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-30-43.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-30-43.png" new file mode 100644 index 000000000..f2f1c16b7 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-30-43.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-31-23.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-31-23.png" new file mode 100644 index 000000000..8fa6ef29b Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-31-23.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-32-04.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-32-04.png" new file mode 100644 index 000000000..bfd8737b8 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-32-04.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-32-17.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-32-17.png" new file mode 100644 index 000000000..95d158853 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/2023-08-22-13-32-17.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/index.html" new file mode 100644 index 000000000..288c9a7cc --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-046-\346\234\237/index.html" @@ -0,0 +1,31 @@ +机器文摘 第 046 期

机器文摘 第 046 期

机器文摘 第 046 期

机器文摘 第 046 期

长文

Windows 的任务管理器

如果你喜欢使用 Windows 任务管理器来查杀那些不安分的进程,并且跟我一样讨厌他们乱跳(尤其在按照资源占用排序时)。你可以按下 Ctrl 键,它就会神奇地停止更新直到你松开 Ctrl。

Windows 操作系统有一种魔力,就是哪怕你用了将近 20 年,还是会有你不知道的快捷键或者快捷操作。这些东西有时候能带来一些惊喜。

具体介绍可以看这里:暂停 Windows 任务管理器

Linux 内核最初版的解析

最新版本的 Linux 内核,其源码规模已经飙升至 3600 万行,想要深入细节去了解它十分吃力。

而Linux 的第一个版本 v0.01 却非常小巧。

刨去注释和空行的话,也就 8 千来行代码。

这么小的代码结构,足够理解操作系统的精髓。

这篇探索 Linux v0.01 d的内部结构,可以带你像参观历史博物馆那样去见证曾经的 Linux。

我记录了一些有意思的地方:

1、v0.01 只有 66 个系统调用,用于支持文件管理和进程管理,分别是:

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+
access acct alarm break brk chdir chmod
+chown chroot close creat dup dup2 execve
+exit fcntl fork fstat ftime getegid geteuid
+getgid getpgrp setsid getpid getppid
+getuid gtty ioctl kill link lock lseek
+mkdir mknod mount mpx nice open pause
+phys pipe prof ptrace read rename rmdir
+setgid setpgid setuid setup signal stat
+stime stty sync time times ulimit umask
+umount uname unlink ustat utime waitpid write
+

其中 mount 调用啥也没干,直接返回了。

2、直接写死代码绑定 Intel 386 平台。至今对于 PS/2 接口的键盘、ATA硬盘、VGA显卡等标准硬件的驱动代码还是写死在内核里(而不是放在drivers文件夹)。

3、系统崩溃处理代码只有 5 行:只实现了打印一句“我不行了”,然后进入死循环for(;;);

LLaMa.cpp 是怎样做到的?

LLaMa.cpp 是一个令人惊叹的项目,在它之前没有人能够在低端消费设备上成功运行 Meta 开源的人工智能模型 LLaMa ,因为那需要太多的硬件资源。

但是 LLaMa.cpp 的横空出世使得在 M2 Macbook Pro、Android Pixel5 手机甚至树莓派上运行 LLaMa 的 7B 模型成为可能。

这是怎么做到的?

带着这个疑问,有网友深入研究了这个项目,并写下了这篇How is LLaMa.cpp possible?以解释原因。

作者认为主要得益于对模型参数的量化,降低模型参数的精度,从 FLOAT16 减小到 INT4。使得 LLaMa.cpp 能够以较少的计算资源甚至只依赖 CPU 的情况下加载大模型。

逐渐觉得微软比谷歌良心

曾经微软是技术黑客的公敌,被不少人视为反对技术创新、技术开放的最大反派。

不过随着时间的推移,以及微软逐渐在开源社区所做出的努力。这一现象有所好转。

近期在 HN 上有位网友很扭捏地承认:现在他对微软的感觉要比对谷歌好很多

他列举了一些关于两家公司的对比,包括发布的产品、主观的优劣评价等等。

为了抵制微软,他已经十多年没用 Windows 了,但貌似微软的其他产品“很香”(VS Code、Github、ChatGPT等)。

并表示最近正在寻摸租一个云存储,大概率也会用微软的 onedrive 而不是谷歌的 Google drivers。

对此我也有类似感觉,不过我对谷歌的不信任起始于十年前谷歌将 Google reader 停掉,而自从微软推出 WSL 后,我更是觉得微软在产品上越来越实在了。 +

资源

tailwindcss 的小抄

tailwind 这个 css 框架之所以能够很快流行起来,主要原因就是它解决了一个之前很多人没有太注意的问题,即 CSS 的“正交性”。

之前 CSS 实现一个效果,可以有 N 种方法,外加各种奇技淫巧,但在使用 tailwind 之后,针对特定效果都有了最优实践路径,而且还可以很容易组合。

不过由于它的类分的太细太碎,导致刚开始的时候会有一些不容易记忆。

这里有一份 tailwind 的小抄,适合初学者收藏,方便随时查阅。

在浏览器中运行的 vim

vim.wasm,在浏览器中运行的 Vim,不是插件。

使用 wasm 技术直接编译移植的 Vim Editor 源码,效果跟原生程序几乎一样。

使用 WebAssembly 给 Vim 提供一个新的 GUI 前端(类似 GVim)。

为了编译通过,作者在源码里禁用了很多 Wasm 不支持的特性,如:fork(2)、PTY 等。

可在这里体验:https://rhysd.github.io/vim.wasm/

无隐私问题的 pdf 工具网站

这个pdf工具可以尝试一下,跟其他pdf 工具网站不同,这个网站借用 WebAssembly 技术将很多工作放在浏览器客户端执行,用户无需上传自己的pdf到网站,即可执行处理工作,包括:加密、解密、拆分、合并等常用功能。 ​​​

深入理解操作系统的小游戏

这个自称史上最极客的小游戏,是国外一位计算机科学教授给学生们写的一个小游戏,假设玩家是一个“操作系统”,在游戏里玩家需要不停地进程调度、内存页交换等操作,一旦调度不合理就会激怒用户导致“玩家”也就是操作系统被重启,游戏就 GAME OVER 了。

游戏使用 Python 编写,作者将其编译为 WebAssembly 以嵌入网页,这里可以直接在线体验: https://drfreckles42.itch.io/youre-the-os

观点

学习技能最有效的练习手段是“复刻”

这是我前两天尝试用 CSS 临时写个页面效果想到的。

我虽然也了解了CSS 语言的一些基本知识,但是在具体实操的时候仍会感到无从下手。

与下棋类似,只知道“规则”但是没有“套路”。

后来干脆找了几个目标页面,按照自己的想法去还原,渐渐能够摸到一些“套路”的边缘,最终实现了自己想要的效果。

于是我想: 在学习一项技能的时候,“复刻”、“抄袭”、“借鉴”、“致敬”,都没有问题,应该把它作为最主要的练习手段。

因为“抄”是最经济的学习方法了。

不仅仅是编程技能,艺术方面更是如此。

比如在编曲学习的时候有一种练习叫“扒带”,就是找一首歌,然后你通过你的工具和技巧制作一份完全一样的作品,尽量做到百分百还原。

很多“大师”都是在这个过程中,遇到问题解决问题,领悟到很多只能意会不能言传的技巧,而这些领悟是无论如何也无法仅仅通过“看”和“听”获得的。

另外,人们练字、绘画也是从临摹开始,一般在熟练之后才能突破,才又自成体系。

忍耐守恒

怕麻烦的人,主要是不能忍受一些事情。

然而正是因为这些不能忍受,所以注定要忍受一些其他的事情。

人生就是这样,比如无法忍受投资带来的风险,就得承受现金贬值;不能面对创业的压力,就得忍受按时上班的束缚。

对于这种现象,我将之称为“忍耐守恒”。 ​​​

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-17-36.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-17-36.png" new file mode 100644 index 000000000..604bb48d2 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-17-36.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-17-49.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-17-49.png" new file mode 100644 index 000000000..48ffe52be Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-17-49.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-18-25.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-18-25.png" new file mode 100644 index 000000000..8299d9c14 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-18-25.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-18-47.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-18-47.png" new file mode 100644 index 000000000..58e57e513 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-18-47.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-19-03.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-19-03.png" new file mode 100644 index 000000000..1a6b8f14c Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-19-03.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-19-26.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-19-26.png" new file mode 100644 index 000000000..de266fdad Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-19-26.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-19-42.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-19-42.png" new file mode 100644 index 000000000..2b44d13f7 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-19-42.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-20-00.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-20-00.png" new file mode 100644 index 000000000..d93d52911 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-20-00.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-20-25.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-20-25.png" new file mode 100644 index 000000000..61e472b19 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/2023-08-29-13-20-25.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/index.html" new file mode 100644 index 000000000..fea9cfbe7 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-047-\346\234\237/index.html" @@ -0,0 +1,11 @@ +机器文摘 第 047 期

机器文摘 第 047 期

机器文摘 第 047 期

机器文摘 第 047 期

长文

业余爱好者痴迷于工具,专业人士注重技能

业余爱好者痴迷于工具,专业人士注重技能

以原声吉他为例。在数字音乐制作和合成器盛行的时代,这个单独演奏的乐器可能显得有点古老。然而,在熟练音乐家的手中,它变成了一个充满迷人旋律和触动灵魂的载体。它甚至可能为更大的创意提供灵感,如果你直接跳到现代合成器就有可能会错过这些。原声吉他的简单性促使艺术家专注于演奏的细微之处,完善他们的指弹技巧,并通过每一次弹奏传达情感。真正的魔力不在于吉他本身,而在于将其演绎得生动活泼的音乐家的技艺。

这篇文章读来深有感触。

在解决问题的时候,我总是忍不住问自己,我这个方法是最优的吗?我使用的工具是不是最合适/最好的?

这种心理,常常使我陷入对最佳实践和完美工具的追求中,而忘记了解决问题本身。

时间久了,工具积累一大堆,但每个都未曾发挥其真正作用,一边老工具在吃灰,一边继续寻找新工具。

差生文具多。

正如文章中所说:真正的高手明白,应当拿起手里已有的工具,先行动起来。在这个过程中如果有机会创造美好的事物,好的工具自然会出现在眼前。

CPU 的指令分支预测

现代的 CPU 基本都具有指令分支预测的特性,通过猜测后续会执行的指令分支,提前运行一些指令和设置状态,可以有效利用 CPU 的执行资源,提升效率。

不过,如果预测准确的话效率提升十分明显,但是如果预测错误,CPU 就要多做一些事情(刷新后续预测的指令和相关的状态),随着现代 CPU 中指令流水线越来越复杂,这种代价也变得越来愈大。

在编程的时候,编写一些对于 CPU 分支预测友好的代码,能够对性能产生极大的影响。

这篇对于 CPU 的分支预测,我们能做什么耐心地从 CPU 的分支预测机制讲起,通过具体的代码举例,讲解了怎样让编写的代码对 CPU 分支预测这类优化更加友好。

SSH 命令详解

SSH 命令详解,一篇对 SSH 命令的参数介绍十分详细且易懂的文章。

通过举例让我彻底弄清楚了基于 SSH 的端口转发。

另外还知道了可以在已有的 SSH 连接上执行补充命令,以实现不断开终端的情况下将远程主机上的端口转发到本机访问。 ​​​

资源

开源的房子

wikihouse,是一个开源房屋建造网站,房子的图纸、模型均可从网站上下载,里面有各式各样的房屋建造资料,任何人都可以据此增删、设计、制造、组装自己的建筑。可以理解为建筑界的 github。 +​​​

关掉 Edge 浏览器新增的圆角样式

Edge 浏览器的最新更新里,给所有页面强制增加了一个圆角边框,看起来很不习惯(丑陋)。

经过研究,我发现,如果想恢复到之前的样子,可以在设置外观选项里关闭该特性。

我已经关闭,并果断给这个功能特性反馈了负面评价。

Hello World

Hello World ,这个仓库收录了几乎所有编程语言(997种)的 Hello world 程序。 ​​​

前端开发代码大全

30secondsofcode

这个网站有大量可复用的代码片段,主要是 Javascript、CSS、HTML 、Python 等语言的内容,可以覆盖 Web 应用开发全栈。

里面收录的代码段或者文章都很清新,每个都配有细心的解释,具有良好的实用性。 ​​​

关于 Win10 的锁屏睡眠时间

我在使用 Windows10 的时候发现一个问题。

无论我将电源设置里的睡眠时间、显示器空闲关闭时间设置多长,锁屏后系统都会在 1 分钟之后关闭显示器。

这会带来一些不方便,并且让人困惑。

在经过一番研究搜索之后,找到了如下解决方案(Windows就是这么喜欢在注册表隐藏设置):

1、打开注册表编辑器后。

2、定位到:计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\7516b95f-f776-4464-8c53-06167f40cc99\8EC4B3A5-6868-48c2-BE75-4F3044BE88A7

3、修改右侧的Attributes 数值为2 (初始值为1)

4、再打开“编辑电源计划”时会发现多了一个选项“控制台锁定显示关闭超时。

红警2游戏整合包

红警2 的民间整合包,支持 win7 到 win11。整合大量资源,傻瓜式一键安装。 ​​​

经过我的测试,前面链接页面里提供的安装包里带有额外的广告脚本,在使用时可使用 7z 等压缩软件直接打开该自解压包,选取主文件夹拷贝出来即可。

观点

隐形的门槛

也许每个领域都存在一个隐形的门槛,无论是你学会一种语言,还是掌握一种能力,哪怕是打通一个游戏,只要你跨不过那个门槛,那么无论你尝试多少次,都会在同样的水平下无功而返。相反,一旦跨过后,那就是一马平川,你有了在那个新世界周游的能力。这当然不是说你不会再遇到困难,而是说,你不再有那种尝试了无数次,带着同一种感受离开的感觉。剩下的区别只是更多经验的积累,是熟练度的问题,因为你已经在那个轨道上了,你已经拿到了入场券。

人生可以被隐喻成一个有着自然消退机制的RPG体系,累积10000经验可以升那关键的一级,那么先前你无论你多少次到达5000,6000,9000都不行,因为熟练度会反复消退到1000,2000的水平。而我知道,很多人就是无数次的卡在了那9000以内,但每次都要从1000,2000这个位置开始。这个和自我接纳也没有关系,因为你知道你遇到的困难并不是基于你对自己的苛求,你的困难在于你无法为自己在乎的事情付出真正的努力,无法将自己的活力与热情持续的灌注在同一个点上,但你隐约知晓跨过那10000的门槛,是你更重要的人生福祉。

来自微博 @崔庆龙_

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-048-\346\234\237/2023-09-05-13-20-05.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-048-\346\234\237/2023-09-05-13-20-05.png" new file mode 100644 index 000000000..aa403f959 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-048-\346\234\237/2023-09-05-13-20-05.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-048-\346\234\237/2023-09-05-13-20-30.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-048-\346\234\237/2023-09-05-13-20-30.png" new file mode 100644 index 000000000..206464e07 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-048-\346\234\237/2023-09-05-13-20-30.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-048-\346\234\237/2023-09-05-13-20-50.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-048-\346\234\237/2023-09-05-13-20-50.png" new file mode 100644 index 000000000..a48486e69 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-048-\346\234\237/2023-09-05-13-20-50.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-048-\346\234\237/2023-09-05-13-21-17.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-048-\346\234\237/2023-09-05-13-21-17.png" new file mode 100644 index 000000000..78f0302c4 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-048-\346\234\237/2023-09-05-13-21-17.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-048-\346\234\237/2023-09-05-13-21-28.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-048-\346\234\237/2023-09-05-13-21-28.png" new file mode 100644 index 000000000..3b809aab4 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-048-\346\234\237/2023-09-05-13-21-28.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-048-\346\234\237/2023-09-05-13-21-45.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-048-\346\234\237/2023-09-05-13-21-45.png" new file mode 100644 index 000000000..3280b627f Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-048-\346\234\237/2023-09-05-13-21-45.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-048-\346\234\237/2023-09-05-13-22-11.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-048-\346\234\237/2023-09-05-13-22-11.png" new file mode 100644 index 000000000..19a4bb20d Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-048-\346\234\237/2023-09-05-13-22-11.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-048-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-048-\346\234\237/index.html" new file mode 100644 index 000000000..7f3183249 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-048-\346\234\237/index.html" @@ -0,0 +1,14 @@ +机器文摘 第 048 期

机器文摘 第 048 期

机器文摘 第 048 期

机器文摘 第 048 期

长文

关于 Python 语言的一些统计数字

关于开源 Python 仓库的一些有趣统计,有人克隆了 PyPI 网站里所有 Python 包对应的 Github 仓库,并对这些仓库里的全部文件进行了分析和统计。

1、排名前三的语法特性分别是:列表推导、fstring字符串格式化、注解;

2、代码中大约包含有超过 2 万 5 千个密钥明文,泄露最多的是访问 Google API、OpenAI API和腾讯云 Secret ID;

3、截止到 2023 年 8 月,所有源码加起来已超过 60TB ,文件数量超过 10 亿。

Wasm 技术让数据库执行 AI 模型

使用 Extism 将 WebAssembly 引入 PostgreSQL

这篇文章的作者介绍了一种方法,可以使用 Wasm 技术通过扩展插件的方式给 PostgreSQL 数据库增加 UDF (用户自定义函数),从而实现调用 AI 模型的能力。

BitLocker 硬件加密能破解吗?

BitLocker 是 Windows 下的存储加密技术,用于保护硬盘中的数据安全。

未经解密的硬盘即使遗失或者被接入其他系统也无法进行读取。

这在极大程度上带来了数据安全(不过仍有不少用户在不知情的情况下开启了 BitLocker 且未保存密钥,在重做系统的时候发现硬盘无法解密,数据无法恢复。。欲哭无泪。。)。

然而这种加密方式也不是绝对安全,国外有技术爱好者对此进行了挑战,并使用一台逻辑分析仪成功绕过了加密。

这篇文章进行了详细的记录

主要原理为:在系统开机启动过程中的某个时刻,加密芯片和 CPU 之间传输了未加密的信号。使用逻辑分析仪捕获该信号可以逆向出加密密钥。

资源

监控网页信息变化的工具

changedetection,一个监控网站变化的工具。

帮助用户密切关注商品打折、股票行情、政策发布等信息变动。

支持通过网页可视化的方式指定监控页面区域。

通过邮件、即时聊天软件、API调用等多种方式推送信息。可使用 Docker 部署,或者本地 Python 环境部署。

Switch 模拟器

Ryujinx 一个用c# 写的开源 switch 模拟器,该模拟器旨在提供卓越的准确性和性能、用户友好的界面以及稳定的版本构建。 ​​​

文字缩写快捷键工具

为了减少打字量,国外这哥们写了个脚本将日常用语全部缩写了,只需敲入缩写字母,脚本自动完成完整句子的键盘输入。

比如: +st => something +ab => about +hw => hardware +sti => sometime

据小哥自己统计,使用这个脚本以后他已经减少了一半的键盘敲击量。

项目名叫 compress 目前已开源,如果你有兴趣,改成支持中文也不是不可以。

Canvas 手册

Canvas 是网页中用于图形绘制的基本元素,结合 JavaScript 可以实现各种复杂的图形效果和交互动画。我之前都是每次用到了的时候现去翻文档,对它的每个 API 都是一知半解。这里有一个Canvas 手册,详细介绍了 Canvas 的各种调用接口。适合希望深度使用及系统学习 Canvas。

观点

“不要重复造轮子”是人为设置的一种限制

遇到需求不能满足的情况,是去“寻找轮子”还是“动手创造轮子”,这是两种不同的思维习惯。

“寻找轮子”往往意味着寻找已有答案,将问题看为一种正常的状态,是“自古以来”、是“从来如此”。

思维定势一旦形成,就很难改变,让人成了那个在沙漠中让美女帮他牵住骆驼的矮子。

动手创造者往往是发现这种问题的人,他们不循规蹈矩,他们 Think different,是改变世界的人。

“不要重复发明轮子”,这个原则用于工作中确实比较安全,他保证了不会浪费资源,并且避免了一定的技术风险。

但也同时拒绝了伟大的创新。

所以不要被这句话束缚,尽管去做自己的轮子。

哪怕它一开始很丑。

你的轮子必将使你与众不同,使你拥有不一样的视角,成为那个动手创造的人。

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-33-44.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-33-44.png" new file mode 100644 index 000000000..9a55cc039 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-33-44.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-34-06.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-34-06.png" new file mode 100644 index 000000000..359bd2efa Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-34-06.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-34-22.f89e18573d495e5017a009fd6cd94e57.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-34-22.f89e18573d495e5017a009fd6cd94e57.png" new file mode 100644 index 000000000..30d68b768 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-34-22.f89e18573d495e5017a009fd6cd94e57.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-34-22.f89e18573d495e5017a009fd6cd94e57_hu7c2fecfb9bfda307a8ff3b488a489fac_482154_250x150_fill_box_smart1_3.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-34-22.f89e18573d495e5017a009fd6cd94e57_hu7c2fecfb9bfda307a8ff3b488a489fac_482154_250x150_fill_box_smart1_3.png" new file mode 100644 index 000000000..89cdafd09 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-34-22.f89e18573d495e5017a009fd6cd94e57_hu7c2fecfb9bfda307a8ff3b488a489fac_482154_250x150_fill_box_smart1_3.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-34-22.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-34-22.png" new file mode 100644 index 000000000..30d68b768 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-34-22.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-34-22_hu7c2fecfb9bfda307a8ff3b488a489fac_482154_120x120_fill_box_smart1_3.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-34-22_hu7c2fecfb9bfda307a8ff3b488a489fac_482154_120x120_fill_box_smart1_3.png" new file mode 100644 index 000000000..a2e232944 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-34-22_hu7c2fecfb9bfda307a8ff3b488a489fac_482154_120x120_fill_box_smart1_3.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-34-22_hu7c2fecfb9bfda307a8ff3b488a489fac_482154_1600x0_resize_box_3.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-34-22_hu7c2fecfb9bfda307a8ff3b488a489fac_482154_1600x0_resize_box_3.png" new file mode 100644 index 000000000..5f59919fa Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-34-22_hu7c2fecfb9bfda307a8ff3b488a489fac_482154_1600x0_resize_box_3.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-34-22_hu7c2fecfb9bfda307a8ff3b488a489fac_482154_800x0_resize_box_3.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-34-22_hu7c2fecfb9bfda307a8ff3b488a489fac_482154_800x0_resize_box_3.png" new file mode 100644 index 000000000..72755e8d7 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-34-22_hu7c2fecfb9bfda307a8ff3b488a489fac_482154_800x0_resize_box_3.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-34-51.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-34-51.png" new file mode 100644 index 000000000..32235eafa Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-34-51.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-35-09.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-35-09.png" new file mode 100644 index 000000000..fe627bb86 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-35-09.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-35-24.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-35-24.png" new file mode 100644 index 000000000..c1ff9f06c Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-35-24.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-35-35.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-35-35.png" new file mode 100644 index 000000000..85e96e580 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/2023-09-12-13-35-35.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/index.html" new file mode 100644 index 000000000..8b4193ab4 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-049-\346\234\237/index.html" @@ -0,0 +1,13 @@ +机器文摘 第 049 期
Featured image of post 机器文摘 第 049 期

机器文摘 第 049 期

机器文摘 第 049 期

机器文摘 第 049 期

长文

在 Linux 环境里执行 Windows 应用程序

最近遇到一个难以启齿的需求,服务器是 Linux 环境,但是某项服务功能却需要执行一个 Windows exe 文件。

不得已才想到要求助 Wine 这个经典中间层,据说可以使的 Linux 兼容大部分的 Win32 程序。

但是又不想污染服务器的其他环境,于是选择在容器中运行。

在网上找到了这篇《利用 Docker 容器和 Wine 在 Linux里运行 Windows 程序》,按照文中介绍的步骤成功实现了需求。

基本步骤: +1、根据文章提供的 Dockfile 构建镜像; +2、运行镜像并注意配置运行容器的环境变量; +3、执行所需的 exe 程序。

Windows 系统是怎样进行引导的

前不久,我在给笔记本更换大容量固态硬盘的时候,由于不愿重做系统,使用了硬盘克隆功能,将原盘整体信息直接克隆到新硬盘。

结果克隆成功并替换安装硬盘之后,却没能正常引导进入 Windows,而是进入了一个类似 PE 系统的界面(猜测是原盘中厂家自制的),并告知我由于检测到硬件更换,拒绝引导,并建议我选择恢复系统。

我猜测之前的隐藏分区可能有笔记本厂家做的一些特定引导程序,才导致这样的情况。

我对系统引导的理解还停留在 MBR 分区表大面积应用的阶段。于是尝试删除了隐藏分区,并手动将系统盘分区设置为了 “激活”分区(事实上这时候已经错了,因为 GPT 分区表方式下无法采用这种引导方式了)。

结果系统干脆直接无法引导。出现这种情况,我之前的知识储备显然不够用了。

经过一番折腾和搜索,我才得知现在 Windows 8 及以上版本操作系统的电脑所采用的方式是 GPT 分区表 + UEFI 引导。

也就是说硬盘上需要单独开辟一个分区存储负责进行操作系统引导的工作。这个分区平时对于操作系统的资源管理器不可见(但磁盘管理中可以看到),由主板上的 UEFI 程序(这个程序可以理解为 BIOS 的升级版)进行访问和管理。

了解这个方式之后,就简单了,重新使用工具修改 GPT 分区并制作专用引导分区即可。

最后,为了弄清这跟之前的 MBR 引导方式有什么区别,我找到了一位运维工程师总结得较到位的文章《Windows系统开机引导顺序简述及运维小结》

500 行代码写一个 C 编译器

500 行 Python 代码写一个 C 编译器

作者立下这个 flag 之后才发现任务有多难。

主要是代码行数太少了,如果使用传统手段实现,可能这点儿代码量还不够写个语法分析器的。

于是作者主动放弃了 AST (抽象语法树)的构建,采用 Token 提取和指令生成“一遍过”的方式,实现了一个相当“简洁”的 C 编译器。

资源

假装弹钢琴

touchpianist,在线弹钢琴的网站(也提供手机 App 版),可以让你假装钢琴大师,只需要按键盘上的任意键,旋律就会自动演奏,不过你要控制敲击键盘的速度,以匹配原曲的节奏。我弹了一下,默认曲目是贝多芬的《月光奏鸣曲》,差点儿被自己陶醉了。 ​​​

Bun V1.0

bun-v1.0,拳打 node , 脚踢 deno 的 JavaScript 运营环境 bun 推出了 1.0 版本。主打一个“All in one”,号称可以一次性取代一揽子工具:node、npx、npm、webpack、tsc、babel、jest。一个工具包揽了运行、打包、包管理、转译、测试等所有事情,且速度是 nodejs 的 3 倍。

对于这种吹的比较厉害的技术,保持关注,谨慎使用吧。

开源基于 LLM 知识库平台

FastGPT - 基于 LLM 大模型的 AI 知识库问答系统。提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景。项目在 Github 开源,采用技术栈: NextJs + TS + ChakraUI + Mongo + Postgres(Vector 插件)。支持 GPT、Claude、Spark、ChatGLM 等多种 LLM 模型。

开源基于 LLM 数据可视化平台

lida,微软出品的数据可视化工具库,特点是基于 LLM 对话模型进行生成,其生成的可视化代码支持多种可视化后端的语法,包括 matplotlib、seaborn、d3等。 ​​​

观点

编程是一种体育锻炼

编程除了是一种可以以之谋生的专业技能,对于那些真喜欢编程的人来说,它还是一个心理疗愈工具。

编程能使人专注,进入“心流”状态比较容易,也容易让人的心态平和。

编程与体育锻炼一样,都是可以让人受益终生的活动。

—-来自@软件教书匠金旭亮

造成电子阳痿的一种因素

一个不容忽视的因素是现在游戏的加载速度,尤其是 PC 游戏。

我们被碎片化信息惯得一秒钟都不想等待。

每当想玩会儿 CS 或者地平线之类得游戏,光是等待游戏启动、地图加载等就足以让人放弃想玩的念头。

更别提有些游戏还有一些跳都无法跳过得开场引导视频。

所以我现在就算是玩也是偶尔打开模拟器玩一玩老游戏,带有状态存储,随时加载存档。

据说有一部分游戏主机(比如新一代 XBox)有类似笔记本电脑的睡眠功能,开机就玩,随时进入上次未完成的任务。

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-31-08.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-31-08.png" new file mode 100644 index 000000000..3c8fad9e2 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-31-08.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-31-23.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-31-23.png" new file mode 100644 index 000000000..4faad49e8 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-31-23.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-31-40.c8cdff29c7b7342ba8a1887d5e923f8b.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-31-40.c8cdff29c7b7342ba8a1887d5e923f8b.png" new file mode 100644 index 000000000..0b490fb57 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-31-40.c8cdff29c7b7342ba8a1887d5e923f8b.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-31-40.c8cdff29c7b7342ba8a1887d5e923f8b_hu3a4ea67a0e4e3f121ecef4f60ac92d88_250830_250x150_fill_box_smart1_3.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-31-40.c8cdff29c7b7342ba8a1887d5e923f8b_hu3a4ea67a0e4e3f121ecef4f60ac92d88_250830_250x150_fill_box_smart1_3.png" new file mode 100644 index 000000000..10713c462 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-31-40.c8cdff29c7b7342ba8a1887d5e923f8b_hu3a4ea67a0e4e3f121ecef4f60ac92d88_250830_250x150_fill_box_smart1_3.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-31-40.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-31-40.png" new file mode 100644 index 000000000..0b490fb57 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-31-40.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-31-40_hu3a4ea67a0e4e3f121ecef4f60ac92d88_250830_120x120_fill_box_smart1_3.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-31-40_hu3a4ea67a0e4e3f121ecef4f60ac92d88_250830_120x120_fill_box_smart1_3.png" new file mode 100644 index 000000000..1d329783e Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-31-40_hu3a4ea67a0e4e3f121ecef4f60ac92d88_250830_120x120_fill_box_smart1_3.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-31-40_hu3a4ea67a0e4e3f121ecef4f60ac92d88_250830_1600x0_resize_box_3.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-31-40_hu3a4ea67a0e4e3f121ecef4f60ac92d88_250830_1600x0_resize_box_3.png" new file mode 100644 index 000000000..c597ab3e3 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-31-40_hu3a4ea67a0e4e3f121ecef4f60ac92d88_250830_1600x0_resize_box_3.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-31-40_hu3a4ea67a0e4e3f121ecef4f60ac92d88_250830_800x0_resize_box_3.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-31-40_hu3a4ea67a0e4e3f121ecef4f60ac92d88_250830_800x0_resize_box_3.png" new file mode 100644 index 000000000..1c978a1f0 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-31-40_hu3a4ea67a0e4e3f121ecef4f60ac92d88_250830_800x0_resize_box_3.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-32-14.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-32-14.png" new file mode 100644 index 000000000..5561eef74 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-32-14.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-32-34.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-32-34.png" new file mode 100644 index 000000000..a8b970782 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-32-34.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-32-52.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-32-52.png" new file mode 100644 index 000000000..e72aa560b Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-32-52.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-33-10.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-33-10.png" new file mode 100644 index 000000000..78fc4a6b0 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-33-10.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-33-21.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-33-21.png" new file mode 100644 index 000000000..3b9b212a4 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-33-21.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-33-35.png" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-33-35.png" new file mode 100644 index 000000000..0beb59f43 Binary files /dev/null and "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/2023-09-19-13-33-35.png" differ diff --git "a/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/index.html" "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/index.html" new file mode 100644 index 000000000..2b66250a4 --- /dev/null +++ "b/p/\346\234\272\345\231\250\346\226\207\346\221\230-\347\254\254-050-\346\234\237/index.html" @@ -0,0 +1,38 @@ +机器文摘 第 050 期
Featured image of post 机器文摘 第 050 期

机器文摘 第 050 期

机器文摘 第 050 期

机器文摘 第 050 期

长文

十八世纪的光学电报网络

当年读《基督山伯爵》的时候,有一个让我震惊的科技。

主人公有一项复仇计划是破坏敌人的金融资产。计划采取的手段是收买了一个传递实时信息的人让其传递错误信息。

而具体传递信息的手段是,每隔一段距离设一座瞭望塔,每个塔上有一个人,向一个方向用望远镜观看,远方的上级瞭望塔会有人发射信号弹,一连串的信号弹代表一定的信息,然后这个人再原样发射一遍,让后方的瞭望塔看见。信息就这样一级一级传递下去。

信息经过编码,可以表达股票行情等信息,类似后来的电报系统,但是这是在十八世纪。

读过之后我就一直有疑问,不知道小说是否虚构了这种信息传递技术,直到前几天我发现了这篇文章:《十八世纪的光学电报网络》

里面详细介绍了在两百多年前人类就已经发明了“光学电报”系统,并建立起了巨大的信息网络。信息传递速度达到了惊人的 1380千米/每小时。

C 语言发展简史

要说 C 语言是计算机历史上最重要的编程语言应该不会有人反对吧。

作为大多数人编程入门的母语,C 语言具有语法简洁、高性能(贴近计算机底层)、使用灵活、适用范围广泛等特点。

虽然诞生于上个世纪 70 年代,但即便是在 2023 年的今天,C 语言仍然排在各大编程排行榜的考前位置,仍然是信息科技的重要支撑力量。

《C 语言简史》,由丹尼斯·里奇(C 语言之父)撰写,是一篇难得的介绍 C 语言的诞生和发展的历史性文献。

VB(Visual Basic)发展简史

前几天 HN 上有个从业近 30 年的老程序员发问:为什么 VB(Visual Basic)这么高效、好用的开发工具逐渐消失了?

被顶的最高的网友放出了《Visual Basic 从诞生到消失》这篇文章。

在上世纪 80 年代末 90 年代初,Windows 操作系统刚刚崭露头角的时候,VB 已经在萌芽状态了。而且已经具有非常先进的组件化、可视化、低代码等超前思想。并且发明了“控件”、“消息触发”等概念。

最初的版本与 BASIC 语言并无关系,只考虑了使用可视化开发并辅助简单的内嵌脚本,但是比尔·盖茨对 BASIC 十分热爱(毕竟那是微软起家的技术),亲自推动了组件化、可视化开发与 BASIC 语言结合,便诞生了 Visual Basic。

得益于超前的可视化开发理念,VB 极大降低了当时开发应用程序的门槛,涌现出一大批开发者。包括当时那些不得不转型给个人电脑开发程序的大型机编程工程师。

这一切在 VB 随着 Visual Studio 发布 6.0 的时候达到了顶峰。

转折点出现在微软为了应对 Java 的威胁而推出 .Net 公共语言运行时的时候,VB 也被纳入到这套体系里,被成为 VB.Net ,扩充了复杂的语法和继承、多态等高级特性。

对于那些真正喜欢 VB6 的人来说,这些都是唯恐避之不及的东西,更糟糕的是新的 VB.Net 无法兼容之前的代码,大量成果移植困难。

之后更是随着网络信息科技的发展,Web 编程逐渐取代了 Windows 桌面编程,VB 这个伟大的技术,被淘汰也就是顺其自然的了。

一个在网页里模仿 Excel 表格的故事

一位前端工程师,讲述了他在 2016 年受雇于 Uber(优步)时的一些开发往事

作为服务于数据工程师的内部研发团队,他所在的小组主要是给公司的数据分析人员提供内部工具,以便让他们能够更快地分析数据,更快的分析数据意味着更有可能在产品运营竞争里获胜。

然而数据分析人员总是抱怨工具不满足要求,主要是操作界面,因为他们非常习惯“Excel”,每次提需求的时候总是说:“你就做得跟 Excel 一样就行”。

作者最开始还试图跟用户解释要实现起来是多么困难,后来逐渐放弃了挣扎,并开始着手在网页里实现一个跟 Excel 一样的表格,而且他竟然实现了。

故事的后来有些伤感,作者提供的工具并没有使得 “Uber” 在跟嘀嘀的竞争中胜出,相反地,“Uber”在中国的业务还被“嘀嘀”收购了。

被用于数据分析的工具也被抛弃不再使用。

后来作者选择了将那个像 Excel 的表格代码放在了 Github 进行开源,地址在这里

资源

通用 Web 应用服务器

NGINX Unit,通用 Web 应用服务器。是一个轻量且多功能的应用运行时,作为一个单一的开源服务器,它提供了您的 Web 应用程序所需的基本组件:运行应用程序代码(包括 WebAssembly)、提供静态资源、处理 TLS 和请求路由。

Unit 是由 NGINX 团队成员从零开始创建的,以在运行时高度高效且完全可配置。最新版本是 1.31.0,于 2023 年 8 月 31 日发布。

绿色安卓 App 合集

绿色安卓app合集

这个网站收集了一大批良心 app,全部没有广告且不要求隐私权限。

几乎涵盖了日常使用的所有类型,包括艺术绘画、音乐播放器、笔记、文件管理、录音、拍照等。 ​​​

nuejs

nuejs,越来越多的人对前端开发的混乱感到不满了。不同的是有人选择抱怨,有人撸起袖子开干。nuejs 的作者觉得现在使用 React、Vue 等框架再加上若干服务端渲染框架,使得前端开发生态变得越来越复杂和掌握。于是自己动手开发了一个简单的轻量化框架,终极目标是构建一个简洁、高效的前端开发生态。

1024 字节的网页,可显示 3D 地球

1024 字节的 JavaScript,在网页中显示动画 3D 地球模型,页面动画显示的就是其源代码。

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+
.<script>
+eval(z='p="<"+"pre>"/* ,.oq#+     ,._, */;for(y in n="zw24l6k\
+4e3t4jnt4qj24xh2 x/* =<,m#F^    A W###q. */42kty24wrt413n243n\
+9h243pdxt41csb yz/* #K       q##H######Am */43iyb6k43pk7243nm\
+r24".split(4)){/* dP      cpq#q##########b, */for(a in t=pars\
+eInt(n[y],36)+/*         p##@###YG=[#######y */(e=x=r=[]))for\
+(r=!r,i=0;t[a/*         d#qg `*PWo##q#######D */]>i;i+=.05)wi\
+th(Math)x-= /*        aem1k.com Q###KWR#### W[ */.05,0\
+x;)p+="   *#"/* b.        OQ####x#K           */[e[x++]+e[x++\
+]]||(S=("eval"/* l         `X#####D  ,       */+"(z=\'"+z.spl\
+it(B = "\\\\")./*           G####B" #       */join(B+B).split\
+(Q="\'").join(B+Q/*          VQBP`        */)+Q+")//m1k")[x/2\
++61*y-1]).fontcolor/*         TP         */(/\\w/.test(S)&&"#\
+03B");document.body.innerHTML=p+=B+"\\n"}setTimeout(z)')//
+

全球 IP 地址地理位置数据库

全球 IP 地址 地理位置数据库。含 IPV4 和 IPV6。 ​​​这篇文章里还介绍了构建 IP 地址地理数据库的实现原理和一套具有指导意义的实现方法。基本原理是:“互联网中的每个 IP 地址都由组织拥有或管理。可以向互联网注册机构查询WHOIS信息。”

观点

为什么 Facebook 的 PyTorch 占有率赢了 Google 的 Tensorflow

Pytorch 已经完全击败了 Tensorflow,成为 AI 开发框架的事实标准。Pytorch 一开始就专注于学术界,方向是把最牛的人吸引过来。而 Tensorflow 则倾向于软件工程炫技,做各种简单但是酷炫的功能。

最终专业化的 torch 击败了 tensorflow 。 我觉得​​​还有一个原因就是 Google 特别容易弃坑,Tensorflow 中间也切换过前后不兼容的 API。

越来越多的科技产品让人更好地欺骗自己

比如美颜相机、电影特效、游戏等,研发它们的主要目的就是让人们更好的实现自我欺骗和催眠。

东方文明为什么警惕科技(我个人不完全同意)

中国古代对于科技非常警惕和打压的原因,也许是古人早就意识到科技(或技术)力量很容易对人类造成强烈反噬。

观点来自 @​​​安东尼2001:量子自旋理论背后,是人类历史的轮回

订阅

这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。

喜欢的朋友可以订阅关注:

  • 通过微信公众号“从容地狂奔”订阅。

  • 通过竹白进行邮件、微信小程序订阅。

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\347\256\241\347\220\206\345\215\201\350\257\253\350\257\273\344\271\246\347\254\224\350\256\260/index.html" "b/p/\347\256\241\347\220\206\345\215\201\350\257\253\350\257\273\344\271\246\347\254\224\350\256\260/index.html" new file mode 100644 index 000000000..8e4268be4 --- /dev/null +++ "b/p/\347\256\241\347\220\206\345\215\201\350\257\253\350\257\273\344\271\246\347\254\224\350\256\260/index.html" @@ -0,0 +1,10 @@ +《管理十诫》读书笔记

《管理十诫》读书笔记

  1. 首先要通过分析知道问题是什么,才能真正洞悉解决问题的办法。
  2. 归根结底,所有公司最后的生命线都是信任问题,顾客要相信企业生产的产品正如它所许诺的那样好,投资者要相信公司的管理层是有能力的,员工要相信公司管理者能够兑现承诺。
  3. 他们根本想不到人都有缺陷,包括他们自己在内也都不是完美的。
  4. 问题的关键不在于机器会不会想问题,而在于人会不会想问题。
  5. 真正让我们陷入麻烦的并非那些我们根本不懂的东西,而是我们一知半解的东西。
  6. 有一种心理偏见叫做肯定的陷阱,它指的是我们努力想证明自己的观点,而非找出自己观点中的错误之处。
  7. 深思熟虑并不是浪费时间,而是必要之举。
  8. 除非有人能停下来想一想,否则一再犯同样的错误是很容易的。对每个错误都有必要进行反思和总结。
  9. 如果你能承认自己犯了错误,承认自己并不是战无不胜,那么你反而能得到好处。
  10. 管理是一门艺术,而不是一种科学。如果遇到那些想要量化人类行为的专家,你就要保持警惕了。
  11. 行业中的每个公司都应该力争标新立异,让自己变的与众不同,而不是随大溜。
  12. 要憎恨组织里的官僚作风——通用电气公司杰克·韦尔奇写给股东的信中写道。如果你想一事无成的话,那就让行政流程占据主导地位好了,去崇尚官僚主义就行了。
  13. 不能创造生产力的工作越努力越失败,要时刻警惕并搜寻身边那些并不能创造生产力的工作。
  14. 每个公司其实主要就是为现有的客户提供优质服务并努力开拓新客户群。我们在花每一分钱、设立每一个部门或是接手每一个项目时,都要问自己一个基本的问题:这能帮我们带来新客户或是为客户提供更好的服务吗?
  15. 将注意力放在失败上是最大的悲观主义。只要稍稍抬起你的头,改变一下你的态度,那么你的世界观就会发生巨大的变化。
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\347\256\241\347\220\206\350\207\252\345\267\261\351\230\205\350\257\273\347\254\224\350\256\260/index.html" "b/p/\347\256\241\347\220\206\350\207\252\345\267\261\351\230\205\350\257\273\347\254\224\350\256\260/index.html" new file mode 100644 index 000000000..de465c038 --- /dev/null +++ "b/p/\347\256\241\347\220\206\350\207\252\345\267\261\351\230\205\350\257\273\347\254\224\350\256\260/index.html" @@ -0,0 +1,10 @@ +《管理自己》阅读笔记

《管理自己》阅读笔记

文章介绍

《管理自己(Management Yourself)》作者——彼得·德鲁克。该文是《哈佛商业评论》创刊以来重印次数最多的文章之一,节选自其著作《21世纪的管理挑战》。

我第一次读到这篇文章,是2013年在左岸读书的博客,当时很快就放入收藏夹,今日再次翻阅,仍觉受益匪浅。

摘抄部分在此记录,并附上自己的一些理解。

笔记

知识工作者必须成为自己的首席执行官。你应该在公司中开辟自己的天地,知道何时改变发展道路,并在可能长达50年的职业生涯中不断努力、干出实绩。要做好这些事情,你首先要对自己有深刻的认识——不仅清楚自己的优点和缺点,也知道自己是怎样学习新知识和与别人共事的,并且还明白自己的价值观是什么、自己又能在哪些方面做出最大贡献。因为只有当所有工作都从自己的长处着眼,你才能真正做到卓尔不群。

未来社会,体力劳动将逐渐被智能化机械所取代,人人都是知识工作者即将成为事实。每个人都需要把自己当作一个公司来看待,自己就是CEO,包揽人生的“市场”、“营销”、“生产”、“运营”等各项工作,只有从更高的视角来规划自己,才能掌握主动权,避免落入被动接受的局面。

与运营企业一样,经营自己的第一步还是要先了解自己,深刻认识自己的优势与不足,这样无论是制定计划还是付诸行动,才能做到目标明确、行之有效。

多数人都以为他们知道自己擅长什么。其实不然,更多的情况是,人们只知道自己不擅长什么——即便是在这一点上,人们也往往认识不清。然而,一个人要有所作为,只能靠发挥自己的长处,而如果从事自己不太擅长的工作是无法取得成就的,更不用说那些自己根本干不了的事情了。

这个观点跟我的直觉是相反的,在读到这段文字之前我以为自己对擅长什么了如指掌,但认真思索之后,才发现事情并没有那么简单,有些自以为是的优点根本不值得推敲,如沟通表达、对技术了解广泛、技术趋势敏感等等。至于真正做什么样的事情非常的得心应手,还真得通过认真分析才行。

要发现自己的长处,唯一途径就是回馈分析法(feedback analysis)。每当做出重要决定或采取重要行动时,你都可以事先记录下自己对结果的预期。9到 12个月后,再将实际结果与自己的预期比较。我们只要持之以恒地运用这个简单的方法,就能在较短的时间内(可能两三年),发现自己的长处——这是你需要知道的最重要的事情。在采用这种方法之后,你就能知道,自己正在做(或没有做)的哪些事情会让你的长处无法发挥出来。同时,你也将看到自己在哪些方面能力不是特别强。最后,你还将了解到自己在哪些方面完全不擅长,做不出成绩来。

作者给出了一个据说十分有效的方法,虽然执行起来略显繁琐且时间较长,但应该还值得一试。我个人有记录工作日志的习惯,但停留在时间消耗的记录和分析层面,并未对任务执行的结果进行预期和分析。

首先最重要的是,专注于你的长处,把自己放到那些能发挥长处的地方。其次,加强你的长处。第三,发现任何由于恃才傲物而造成的偏见和无知,并且加以克服。

想起了之前读到的另一本书《现在发现你的优势》,虽然木桶原理说要补充自己的短板,但这里的观点则强调要充分把自己的优势利用起来,并且进行加强,这样才能更好的发挥自己。当然,努力学习新技能、新知识,发现自己的偏见和不良习惯然后克服它们也很重要。

把预期和实际结果进行比较,也会发现自己不能做什么。我们每个人都有许多一窍不通、毫无天分的领域,在这些领域我们甚至连平庸的水平都达不到。人们,尤其是知识工作者,就不应该试图去完成这些领域的工作和任务。他们应该尽量少把精力浪费在那些不能胜任的领域上,因为从无能到平庸要比从一流到卓越需要人们付出多得多的努力。

深有体会,不应该将时间和经历消耗在自己即使努力也达不到平庸水平的事情上,然而现实中却有很多人在被动的做着这样的事情,甚至还抱有不切实际的幻想,人生苦短,早日醒悟早日改变。

我属于读者型,还是听者型?首先,你要搞清楚的是,你是读者型(习惯阅读信息)还是听者型(习惯听取信息)的人。绝大多数人甚至都不知道还有读者型和听者型之说,而且很少有人既是读者型又是听者型。知道自己属于哪种类型的人更少。

这一段不知是翻译的问题还是作者没说明白,文中并未定义“读者型”、“听者型”这两种类型的工作方式具体是如何工作的,只是通过例子强调了自己工作方式的不同所带来的巨大差异。我的猜测是,“读者型”应该指的是在工作中理性和逻辑思维占上风的人,通常通过阅读逻辑缜密的文字来规划和开展工作,而“听者型”则属于感性思维偏多,通过视觉、听觉来判断事物的发展。

如果一个组织的价值体系不为自己所接受或者与自己的价值观不相容,人们就会备感沮丧,工作效力低下。

不要试图改变自己的价值观,这只会让你倍感痛苦,你可以更换环境或者改变组织价值体系。

成功的事业不是预先规划的,而是在人们知道了自己的长处、工作方式和价值观后,准备把握机遇时水到渠成的。知道自己属于何处,可使一个勤奋、有能力但原本表现平平的普通人,变成出类拔萃的工作者。

机会留给有准备的人,但前提是这个人认识到自己的长处、工作方式、价值观,所谓的把握机会,是了解了这些之后才能识别到机会。

一般来说,一项计划的时间跨度如果超过了 18个月,就很难做到明确和具体。因此,在多数情况下我们应该提出的问题是:我在哪些方面能取得将在今后一年半内见效的结果?如何取得这样的结果?

千里之行始于足下,如果决定开始行动,也不可把计划定的太远,自己给自己安排近期可行的执行目标,对效果要有清晰的预期,对如何取得效果应有详细而具体的计划。

人与人之间相互信任,不一定意味着他们彼此喜欢对方,而是意味着彼此了解。因此,人们绝对有必要对自己的人际关系负责。这是一种义务。不管一个人是公司的一名成员,还是公司的顾问、供应商或经销商,他都需要对他的所有共事者负起这种责任。所谓共事者,是指在工作上他所依赖的同事以及依赖他的同事。

成熟的处理人际关系,同样需要问文章开头的三个问题,了解他人或者共事者,是我们的义务和责任。

在一个崇尚成功的社会里,拥有各种选择变得越来越重要。从历史上来看,却没有“成功”一说。绝大多数人只期望坚守“适当的位置”。唯一的流动性是向下的流动性。然而,在知识社会里,我们期望每一个人都能取得成功。这显然是不可能的。对许多人来说,能避免失败就行。可是有成功的地方,就会有失败。因此,有一个能够让人们做出贡献、发挥影响力或成为“大人物”的领域,这不仅对个人十分重要,对个人的家庭也同样重要。这意味着人们需要找到一个能够有机会成为领袖、受到尊重、取得成功的第二领域——可能是第二份职业,也可能是平行的职业或社会创业。

在飞速发展(或者说在加速发展)的时代,人人都在焦虑,仿佛竞争、内卷根本无法避免,但如果合理的认识自己、管理自己,并且去用心经营的话,也许人人都有机会可以在擅长的领域做出闪光的事情,获得一份自己独有的成就。

自我管理中面临的挑战看上去比较明显,甚至非常基本,其答案可能不言自明,甚至近乎幼稚。自我管理需要个人,尤其是知识工作者,做出以前从未做过的事情。实际上,自我管理需要每一个知识工作者在思想和行动上都要成为自己的首席执行官。

最后一段很关键,“做出以前从未做过的事情”,即行动最为重要。这也是为什么我会花费一个小时的时间,从头又阅读一遍这篇文章,并摘录下来加以分析理解的主要原因。

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\347\272\277\346\200\247\345\233\236\345\275\222\345\222\214\346\242\257\345\272\246\344\270\213\351\231\215/index.html" "b/p/\347\272\277\346\200\247\345\233\236\345\275\222\345\222\214\346\242\257\345\272\246\344\270\213\351\231\215/index.html" new file mode 100644 index 000000000..9d79e4fba --- /dev/null +++ "b/p/\347\272\277\346\200\247\345\233\236\345\275\222\345\222\214\346\242\257\345\272\246\344\270\213\351\231\215/index.html" @@ -0,0 +1,10 @@ +线性回归和梯度下降

线性回归和梯度下降

有监督学习的两种主要任务(分类和回归)

  • 有监督机器学习任务主要分为两种,一种是分类任务,一般是通过学习算法实现对未知数据的分类甄别,比如判断是男性还是女性,预测明天会不会下雨等等,预测结果是离散的分类。另一种是回归任务,用于预测一个具体的值,比如房价、年龄等等,预测结果是连续的值;
  • 解决回归任务比较常见的算法就是线性回归算法;

线性回归

  • 线性回归是最典型的用于回归任务的机器学习算法。它的基本原理是基于,任意一个为n的值,可以通过一个n-1阶的多项式进行拟合;
  • 线性回归的算法的目标是根据已知标签数据,训练一个预测函数f(a, b),使得x输入带入ax+b这样的多项式可以得出需要预测的值;
  • 所以目标是找到合适的a和b(从数学语言的精确描述来说,一般用别的符号代替,为了方便记录,我使用a和b);
  • 为了找到合适的a和b,需要定义一个损失函数(也有称为代价函数的),J(a, b),用于判断a和b是否合适,比较简单的有“方差均值”法;
  • 方差均值指的是,所有样本带入预测函数f,将预测值与实际值相减,取平方,求和再求平均数(暂时不知到markdown里如何加入公式);
  • 那么带入损失函数,就是意味着,找到合适的a、b使得刚才那个方差均值小于一个阈值(接近最优);
  • 线性回归本质上,是在平面坐标系里找到一个与样本匹配的直线,这样基于这个直线,即可预测未知的值;

梯度下降

  • 如何找到合适的a和b,一个一个地去试是不可能的(无穷多的计算量);
  • 比较典型的算法是“梯度下降”,又是牛顿起的头;
  • 比较生动的描述是,想想一个三维空间图形,X和Y平面是有a和b的值构成,Z轴是损失函数的值,值最小的部分(在图上就最低的部分,像一个山谷)就是最优解;
  • 从山顶的某个点上,环顾360度,找到适合下山的一小步,一点一点儿走向山谷最低处,有点像慢慢走楼梯,所以叫梯度下降;
  • 从我的体会来看,这个方法有点像牛顿那个计算平方根的迭代法(根据一个猜测值,然后通过迭代公式寻找一个更加接近正确值的值,直到误差降低到合适范围);
  • 从微积分的角度,就是找到损失函数J在最初尝试的那个点上的切线,并通过它的斜率(也就是导数值)乘以一个系数a,逐步逼近最低点(切线斜率为零)的过程;
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\350\207\264\345\204\277\345\255\220\346\210\220\344\272\272\347\244\274\347\232\204\344\270\200\345\260\201\344\277\241/index.html" "b/p/\350\207\264\345\204\277\345\255\220\346\210\220\344\272\272\347\244\274\347\232\204\344\270\200\345\260\201\344\277\241/index.html" new file mode 100644 index 000000000..7fe456060 --- /dev/null +++ "b/p/\350\207\264\345\204\277\345\255\220\346\210\220\344\272\272\347\244\274\347\232\204\344\270\200\345\260\201\344\277\241/index.html" @@ -0,0 +1,10 @@ +致儿子成人礼的一封信

致儿子成人礼的一封信

序言我儿,见信如面。在这个即时通讯如此发达的时代,我选择写一封长信,以表示对你即将成人的祝贺。

我陷入沉思了一会儿,考虑该给你讲些什么道理。但我很快意识到,“道理”这种东西,靠听和说没有用,只能自己去感悟。而我自己也十分讨厌被说教,所以我会克制想要给你讲一番大道理的冲动,尽量避免不对等的交流形式。

我想我还是跟你分享一些我对这个世界的思考和想法吧。

茨威格在《人类群星闪耀》中写到“一个人最幸运的事情就是在他思想最活跃、精力最充沛的时候找到了他的人生使命”。看来大家都把寻找人生使命当做比较重要事情来看待。姑且就当做我这封信的主题吧。

寻找人生使命本质上是通过尝试在一些方向上的努力来实现对人生价值和意义的探索,每个人或多或少、或深或浅都要做这样的尝试。

你们学校把“成人礼”包装成一个重要的人生节点,想必是希望给你们一些感觉,让你们意识到,从这一刻起,你们开始对自己的行为负责,要开始尝试去寻找和探索了。

那么该如何去探索,我有一些自己的看法。

首先要相信一点,那就是无论是否还在上学,学习和完善自己都是一辈子的事情,不存在一个可以停止学习的时间点。就我个人来说,无论是读大学的时候还是参加工作以后,从来没有在提升自己方面有过松懈的想法,甚至我感觉工作之后对知识的渴望更加强烈了,学到的东西也比在校园里多得多。

当然了,学习方式跟你目前在学校这种还是差别挺大的,强度也没有那么辛苦。而且工作之后的这种学习方式才是我最认可的方式。什么方式?

我们一起讨论过几次王阳明的“知行合一”,为了不扯那么远,简单来说,刚才提到的学习方式就是老王早就提出的“事儿上练”。通过不断地实践,各种经历,才是学习知识的源泉。这也是为啥我在开头就说道理只能感悟不可说教,怎么感悟?事儿上感悟!经历多了自然懂。

所以也不用一下子被“寻找人生使命”这种“宏大话题”给吓住了,保持学习的心态,放松大胆地去经历各种事情,就是这么个过程。

然后呢,就是在做事的过程中,保持一颗善良、为他人多着想的心。关于这一点,我的体会是,“助人为快乐之本”真的不是一句空话。远的不说,你看你爷爷奶奶平日里多么乐于助人,用乐善好施形容他们一点儿也不为过。他们因此收获了广泛的认可,也给这个家庭带来了积极向上的生活氛围,对你老爹我向好的方面发展也起到了关键作用。

再有一点,也是我个人非常推崇的,就是最好能时刻对世界保持强烈的好奇心。

刘慈欣在短篇科幻小说《朝闻道》中讲了一个故事。外星高等文明在监视地球人类进化的过程中,距离现在几十万年前的一个原始人抬头望了望夜晚的天空,凝视了一会儿。这看似随意的行为使得外星人的警报器响了起来,因为这意味着,人类的好奇心已经发展到了星空,同时也意味着人类文明将要开始爆发式发展了。可见好奇心的重要。

好奇心一方面是推动我们前进的动力,同时也使得我们平凡的生活变得不那么枯燥。

你能经常提出一些有时连我都无法回答的问题,这让我也颇感欣慰,有些答案注定要自己去摸索着发现,我希望你能多多提问,也多自己思考,不用去管答案是什么。

稀稀拉拉写了这么多,估计你也不能理解太多,我像你这个年纪时估计也理解不了。不过也没关系,只是给你讲讲我个人通过思考得到的观点而已,说不定你自己以后有不同的发现,当然如果能在你以后的发展中起到一点儿提醒作用,也就挺好了。

希望你这次“成人礼”活动就像人类文明那一次一次对星空的凝望那样,使你能够进入人生的一个新的高速发展阶段。

祝:学习进步,健康成长!

二零一九年五月九日 写于贵阳机场

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git "a/p/\351\253\230\346\225\210\350\203\275\344\272\272\345\243\253\347\232\204\344\270\203\344\270\252\344\271\240\346\203\257\350\257\273\344\271\246\347\254\224\350\256\260/index.html" "b/p/\351\253\230\346\225\210\350\203\275\344\272\272\345\243\253\347\232\204\344\270\203\344\270\252\344\271\240\346\203\257\350\257\273\344\271\246\347\254\224\350\256\260/index.html" new file mode 100644 index 000000000..ededf55d5 --- /dev/null +++ "b/p/\351\253\230\346\225\210\350\203\275\344\272\272\345\243\253\347\232\204\344\270\203\344\270\252\344\271\240\346\203\257\350\257\273\344\271\246\347\254\224\350\256\260/index.html" @@ -0,0 +1,10 @@ +《高效能人士的七个习惯》读书笔记

《高效能人士的七个习惯》读书笔记

  1. 积极是内在的,是选择的自由,是人性中最不能剥夺的部分。
  2. 以终为始,是要知道自己要什么,并以原则为重心,所做的决策是主动选择的结果,而非被环境所迫使的结果。
  3. 人类的四个天赋分别是,自我意识,良知,想象力,独立意志。
  4. 第四代时间管理,以原则为中心,以周为单位,设定自己所扮演的各项角色欲达成的三个重要成果,安排出每一天的第一要务,更理想的是当作每一天的特殊约会,全力以赴。每周都回顾上周周日程完成情况以及制定新的周日程,并每日调整。
  5. 对人不可讲效率,对事才可如此,对人应该讲效用,即某一行为是否有效。
  6. 以原则为重心,以良知为导向(人比事儿更重要),针对个人独有的使命,平衡发展生活中不同角色,全盘规划日常生活。
  7. 要想充分授权必须要具备的默契和共识包括:
    1. 预期成果。
    2. 应遵守的规范。
    3. 可用的资源。
    4. 责任的归属,约定考评的标准和次数。
    5. 明确的奖惩制度。
  8. 在双赢协议中,对以下5要素应该有明确的规定。
    1. 预期结果,确认目标和实现,方法不计。
    2. 指导方针,确认实现目标的原则,方针和行为限度。
    3. 可用资源,包括人力,财力,技术或者组织资源。
    4. 任务考核,建立业绩评估标准和时间。
    5. 奖惩制度,根据任务考核确定奖惩。
  9. 制定好目标之后,还要看你的组织体系是否与目标相符合,否则就要调整系统体系。
  10. 我们总是喜欢匆匆忙忙地下结论,以善意的建议快刀斩乱麻地解决问题。不愿意花时间去诊断,深入了解问题的症结。
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
+ \ No newline at end of file diff --git a/page/1/index.html b/page/1/index.html new file mode 100644 index 000000000..0651d4337 --- /dev/null +++ b/page/1/index.html @@ -0,0 +1 @@ +https://sbabybird.github.io/ \ No newline at end of file diff --git a/page/10/index.html b/page/10/index.html new file mode 100644 index 000000000..56b046b84 --- /dev/null +++ b/page/10/index.html @@ -0,0 +1,37 @@ +Learning & Writing!
+ \ No newline at end of file diff --git a/page/11/index.html b/page/11/index.html new file mode 100644 index 000000000..c54773768 --- /dev/null +++ b/page/11/index.html @@ -0,0 +1,37 @@ +Learning & Writing!
+ \ No newline at end of file diff --git a/page/12/index.html b/page/12/index.html new file mode 100644 index 000000000..50d856ce1 --- /dev/null +++ b/page/12/index.html @@ -0,0 +1,37 @@ +Learning & Writing!
+ \ No newline at end of file diff --git a/page/13/index.html b/page/13/index.html new file mode 100644 index 000000000..5d936c375 --- /dev/null +++ b/page/13/index.html @@ -0,0 +1,37 @@ +Learning & Writing!
+ \ No newline at end of file diff --git a/page/14/index.html b/page/14/index.html new file mode 100644 index 000000000..e9bbf33bf --- /dev/null +++ b/page/14/index.html @@ -0,0 +1,37 @@ +Learning & Writing!
+ \ No newline at end of file diff --git a/page/15/index.html b/page/15/index.html new file mode 100644 index 000000000..0499af4b6 --- /dev/null +++ b/page/15/index.html @@ -0,0 +1,37 @@ +Learning & Writing!
+ \ No newline at end of file diff --git a/page/16/index.html b/page/16/index.html new file mode 100644 index 000000000..c99235dbc --- /dev/null +++ b/page/16/index.html @@ -0,0 +1,37 @@ +Learning & Writing!
+ \ No newline at end of file diff --git a/page/17/index.html b/page/17/index.html new file mode 100644 index 000000000..f2585992b --- /dev/null +++ b/page/17/index.html @@ -0,0 +1,37 @@ +Learning & Writing!
+ \ No newline at end of file diff --git a/page/18/index.html b/page/18/index.html new file mode 100644 index 000000000..8caf4b561 --- /dev/null +++ b/page/18/index.html @@ -0,0 +1,37 @@ +Learning & Writing!
+ \ No newline at end of file diff --git a/page/19/index.html b/page/19/index.html new file mode 100644 index 000000000..8fef73c0e --- /dev/null +++ b/page/19/index.html @@ -0,0 +1,36 @@ +Learning & Writing!
+ \ No newline at end of file diff --git a/page/2/index.html b/page/2/index.html new file mode 100644 index 000000000..16ec610e8 --- /dev/null +++ b/page/2/index.html @@ -0,0 +1,35 @@ +Learning & Writing!
+ \ No newline at end of file diff --git a/page/20/index.html b/page/20/index.html new file mode 100644 index 000000000..2971b914f --- /dev/null +++ b/page/20/index.html @@ -0,0 +1,35 @@ +Learning & Writing!
+ \ No newline at end of file diff --git a/page/21/index.html b/page/21/index.html new file mode 100644 index 000000000..18f39fb1e --- /dev/null +++ b/page/21/index.html @@ -0,0 +1,34 @@ +Learning & Writing!
+ \ No newline at end of file diff --git a/page/3/index.html b/page/3/index.html new file mode 100644 index 000000000..ee495cef0 --- /dev/null +++ b/page/3/index.html @@ -0,0 +1,36 @@ +Learning & Writing!
+ \ No newline at end of file diff --git a/page/4/index.html b/page/4/index.html new file mode 100644 index 000000000..0edf1f93e --- /dev/null +++ b/page/4/index.html @@ -0,0 +1,37 @@ +Learning & Writing!
+ \ No newline at end of file diff --git a/page/5/index.html b/page/5/index.html new file mode 100644 index 000000000..341c8bdbb --- /dev/null +++ b/page/5/index.html @@ -0,0 +1,37 @@ +Learning & Writing!
+ \ No newline at end of file diff --git a/page/6/index.html b/page/6/index.html new file mode 100644 index 000000000..debdf328b --- /dev/null +++ b/page/6/index.html @@ -0,0 +1,37 @@ +Learning & Writing!
+ \ No newline at end of file diff --git a/page/7/index.html b/page/7/index.html new file mode 100644 index 000000000..11b614927 --- /dev/null +++ b/page/7/index.html @@ -0,0 +1,37 @@ +Learning & Writing!
+ \ No newline at end of file diff --git a/page/8/index.html b/page/8/index.html new file mode 100644 index 000000000..39b6ca5fc --- /dev/null +++ b/page/8/index.html @@ -0,0 +1,37 @@ +Learning & Writing!
+ \ No newline at end of file diff --git a/page/9/index.html b/page/9/index.html new file mode 100644 index 000000000..3c724bfe8 --- /dev/null +++ b/page/9/index.html @@ -0,0 +1,37 @@ +Learning & Writing!
+ \ No newline at end of file diff --git a/page/index.html b/page/index.html new file mode 100644 index 000000000..514132d5f --- /dev/null +++ b/page/index.html @@ -0,0 +1,31 @@ +Pages

Pages

+ \ No newline at end of file diff --git a/page/index.xml b/page/index.xml new file mode 100644 index 000000000..1c086ff40 --- /dev/null +++ b/page/index.xml @@ -0,0 +1,27 @@ +Pages on Learning & Writing!https://sbabybird.github.io/page/Recent content in Pages on Learning & Writing!Hugo -- gohugo.iozh-cnSun, 06 Mar 2022 00:00:00 +0000Archiveshttps://sbabybird.github.io/archives/Sun, 06 Mar 2022 00:00:00 +0000https://sbabybird.github.io/archives/Linkshttps://sbabybird.github.io/links/Mon, 01 Jan 0001 00:00:00 +0000https://sbabybird.github.io/links/<p>To use this feature, add <code>links</code> section to frontmatter.</p> +<p>This page&rsquo;s frontmatter:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span><span class="lnt">8 +</span><span class="lnt">9 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">links</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="l">GitHub</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="l">GitHub is the world&#39;s largest software development platform.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">website</span><span class="p">:</span><span class="w"> </span><span class="l">https://github.com</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="l">TypeScript</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="l">TypeScript is a typed superset of JavaScript that compiles to plain JavaScript.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">website</span><span class="p">:</span><span class="w"> </span><span class="l">https://www.typescriptlang.org</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">ts-logo-128.jpg</span><span class="w"> +</span></span></span></code></pre></td></tr></table> +</div> +</div><p><code>image</code> field accepts both local and external images.</p>Searchhttps://sbabybird.github.io/search/Mon, 01 Jan 0001 00:00:00 +0000https://sbabybird.github.io/search/ \ No newline at end of file diff --git a/page/page/1/index.html b/page/page/1/index.html new file mode 100644 index 000000000..2a538cdcb --- /dev/null +++ b/page/page/1/index.html @@ -0,0 +1 @@ +https://sbabybird.github.io/page/ \ No newline at end of file diff --git a/post/index.html b/post/index.html new file mode 100644 index 000000000..a08ce6322 --- /dev/null +++ b/post/index.html @@ -0,0 +1,34 @@ +Posts

Posts

+ \ No newline at end of file diff --git a/post/index.xml b/post/index.xml new file mode 100644 index 000000000..7a9cd0273 --- /dev/null +++ b/post/index.xml @@ -0,0 +1,8356 @@ +Posts on Learning & Writing!https://sbabybird.github.io/post/Recent content in Posts on Learning & Writing!Hugo -- gohugo.iozh-cnThu, 21 Sep 2023 00:00:00 +0000基于 Github Pages 服务搭建个人博客https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/Thu, 21 Sep 2023 00:00:00 +0000https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-21-16-10-50.png" alt="Featured image of post 基于 Github Pages 服务搭建个人博客" /><h2 id="背景">背景</h2> +<p>搭建独立博客网站的方法多种多样,常见的方法包括租用服务器自行架设,或者选择托管服务商提供的博客发布服务。</p> +<p>但是上述两种方式都会产生一定的费用,对于非盈利网站而言,不太友好。</p> +<p>经过多年的实践,现在已有越来越多的人选择了使用免费且易用的<a class="link" href="https://docs.github.com/zh/pages/getting-started-with-github-pages/about-github-pages" target="_blank" rel="noopener" +> GitHub Pages </a>服务来搭建个人博客。</p> +<p>然而,现有的使用教程大多侧重于操作步骤,对于新手或非专业人士而言,难以真正理解其中原理。</p> +<p>他们可能看到别人的博客既漂亮又实用,却在自己尝试搭建时屡屡遇到挫折,逐渐失去信心。</p> +<p>这无疑会打击那些希望通过博客持续创作文字、并且希望能够免费建立个性化站点的人的积极性。</p> +<p>本文将介绍如何使用 GitHub Pages 服务搭建免费的个人博客网站,及其背后的实现原理,以帮助初学者顺利建立自己理想的博客站点。</p> +<h3 id="需要预先掌握的技能和前置条件">需要预先掌握的技能和前置条件</h3> +<p><em>需要先了解这些再往下阅读本文</em></p> +<ul> +<li>了解 Git 的概念和常用的操作,知道“分支”、“提交”、“推送”、“拉取”等概念。</li> +<li>拥有 Github 账号,并且能够独立完成“仓库创建”、“本地克隆”、“提交”、“推送”等操作。</li> +<li>了解“博客”本身只是一种“网站”:其内容由若干“网页”组成,读者通过浏览器访问博客网站所在的服务器以获取这些网页内容。</li> +</ul> +<h2 id="核心思路">核心思路</h2> +<p><img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-21-16-20-10.png" +width="790" +height="258" +loading="lazy" +class="gallery-image" +data-flex-grow="306" +data-flex-basis="734px" +> +简单来说,核心步骤只有三步:内容编辑、页面生成、网站发布。接下来的介绍均围绕这三件事展开。</p> +<h3 id="内容编辑">内容编辑</h3> +<p>作者编写和编辑博客内容,包括编写文章、给文章配图、给文章归类等等活动都属于内容编辑。</p> +<h3 id="页面生成">页面生成</h3> +<p>如果希望将内容变成可发布的网站,则需要使用专用的软件工具(一般为<a class="link" href="https://baike.baidu.com/item/%E9%9D%99%E6%80%81%E7%BD%91%E7%AB%99/2776875" target="_blank" rel="noopener" +>静态网站</a>生成器)将编辑的内容自动生成可供浏览器显示的博客网站页面。</p> +<h3 id="网站发布">网站发布</h3> +<p>有了网站页面,还只是一堆存放在本地的文件。若要放到互联网上进行访问,还需要一个服务器提供服务,将网站发布。</p> +<p>如果采用独立建站的方式,这一步骤会涉及大量技术工作,比如服务器采购、Web服务应用程序安装、域名映射、SSL 安全证书、网络防火墙配置等等。</p> +<p>但我们今天选择使用 Github 提供的 Pages 服务,这将大大降低上述操作的难度,很多技术细节将不必再多关注,已经由 Pages 服务默认配置好。我们只需享用配置好的环境即可。</p> +<h3 id="技术路线">技术路线</h3> +<h4 id="github-pages">Github Pages</h4> +<p>Github 本来是一个 Git 仓库托管服务商,帮助用户进行项目代码及数字资料的版本管理。不过随着用户规模提升,Github 也围绕版本管理提供了更多的辅助服务,这其中就包括 <a class="link" href="https://docs.github.com/zh/pages/getting-started-with-github-pages/about-github-pages" target="_blank" rel="noopener" +>Pages 服务</a>。</p> +<blockquote> +<p>GitHub Pages 是一项静态站点托管服务,它直接从 GitHub 上的仓库获取 HTML、CSS 和 JavaScript 文件,(可选)通过构建过程运行文件,然后发布网站。 可以在 GitHub Pages 示例集合中看到 GitHub Pages 站点的示例。</p> +</blockquote> +<p>Pages 服务原本用于帮助托管在 Github 上的开源项目更便捷地发布自己的宣传页面。开发团队可以简单编写几个静态页面(HTML)然后放在托管的 Git 仓库中,由 Github 将这些页面以网站服务的方式发布出去,Github 既提供了服务器资源也提供了用于公网访问的<strong>专属 URL</strong> 地址。</p> +<p>关于发布网站的<strong>专属 URL</strong> 地址的提供规则,Github 官方的介绍如下:</p> +<blockquote> +<p>若要发布<strong>用户站点</strong>,必须创建名为 <code>&lt;username&gt;.github.io</code> 的个人帐户拥有的存储库。 若要发布<strong>组织站点</strong>,必须创建名为 <code>&lt;organization&gt;.github.io</code> 的组织帐户拥有的存储库。 除非使用的是自定义域,否则用户和组织站点在 <code>http(s)://&lt;username&gt;.github.io</code> 或 <code>http(s)://&lt;organization&gt;.github.io</code> 中可用。 +<strong>项目站点</strong>的源文件与其项目存储在同一个仓库中。 除非使用的是自定义域,否则项目站点在 <code>http(s)://&lt;username&gt;.github.io/&lt;repository&gt;</code> 或 <code>http(s)://&lt;organization&gt;.github.io/&lt;repository&gt;</code> 中可用。</p> +</blockquote> +<p>根据官方介绍,Pages 提供有三种不同的网站发布服务:用户站点、组织站点、项目站点。</p> +<p>分别对应了“制作个人网站”、“制作团队组织网站”、“制作单个项目网站”的不同需求。</p> +<p>针对个人博客的搭建,很显然使用 Pages 服务发布“用户站点”是最合适的选择。</p> +<p>对于“用户站点”,Pages 最终会为用户提供的专属 URL 地址为:<code>https://你的用户名.github.io</code>,也就是说在 Gihtub 的一级域名 <code>https://github.io</code> 下给你免费提供了一个二级域名。之所以默认使用你的 Github 用户名,是因为要防止不同用户发布的地址重名导致冲突。</p> +<p><em>按照官方介绍,你也可以使用自己购买的域名,通过自己的域名进行访问。不过这涉及到更复杂的话题和操作,不在本文讨论范畴。</em></p> +<p>了解了以上基本信息后,在使用 Pages 服务时,可按照复杂度区分,采用如下几种不同的用法。</p> +<h5 id="最简单直接的使用流程">最简单直接的使用流程</h5> +<ol> +<li>手工编写 HTML 页面文件(需要掌握网页制作知识)。</li> +<li>将页面文件推送到的 Github 仓库,对于“用户站点”来说,这个仓库的命名必须为“<code>你的用户名.github.io</code>”。</li> +<li>在 Github 中设置该仓库的 Pages 服务配置,主要是选择仓库的指定“分支”用于 Pages 服务获取待发布的网页文件。</li> +<li>Github 会按照上面介绍的规则给你提供一个 URL 访问地址(<code>https://你的用户名.github.io</code>),使用浏览器打开该地址即可访问到发布的网站了。</li> +</ol> +<p><em>注:如果不理解 Git 仓库的“分支”概念,可以把它视为同一个仓库里不同的存储位置,不同的“分支”里面存储了不同的文件内容。</em></p> +<p>这个流程仅适用于非常简单网站发布,比如只包含有一个页面,因为手工编写 HTML 页面的效率十分低下,且不利于持续更新维护。</p> +<p>于是大家常用的方式是,使用一种叫做的东西,对于“博客”这类以静态页面为主的网站,十分适合。</p> +<p>“静态站点生成器”可以理解为是一个“翻译”,它能自动将你编写的文本内容根据预先的配置信息,自动生成一个完整的网站所需的全部文件(HTML、JS、CSS等)。</p> +<p>于是有了如下的改进流程:</p> +<h5 id="改进的使用流程">改进的使用流程</h5> +<ol> +<li>用户编辑好博客内容,形成保存在本地计算机的原始文档文件。</li> +<li>使用静态网站生成器将本地原始文档文件生成静态页面文件。</li> +<li>将静态页面文件推送到 Github 远端托管仓库。</li> +<li>Github Pages 服务自动被触发,将静态页面以网站形式发布出来。</li> +<li>用户通过指定 URL 地址访问已发布的博客内容。</li> +</ol> +<p>到目前为止,已经可以较为流畅地执行博客编辑、生成、发布的工作流程了。</p> +<p>但是这个流程里有个前置条件,作者必须在本地电脑上安装一个“静态站点生成器”,以用于输出转换后的、可供发布的页面。</p> +<p>所以,为了方便,Github 提供了一个默认的静态网站生成器,上述第 2 步操作实际上可以在远端仓库自动执行,这样用户只需将原始文件上传至远端仓库即可,由 Github 直接在线上完成静态页面的生成和网站发布工作。</p> +<p><img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-21-16-46-36.png" +width="937" +height="625" +loading="lazy" +class="gallery-image" +data-flex-grow="149" +data-flex-basis="359px" +></p> +<h5 id="静态站点生成器的选择">静态站点生成器的选择</h5> +<p>比较常见的静态站点生成器有:<a class="link" href="https://jekyllrb.com/" target="_blank" rel="noopener" +>Jekyll</a>、<a class="link" href="https://hexo.io/index.html" target="_blank" rel="noopener" +>Hexo</a>、<a class="link" href="https://gohugo.io/" target="_blank" rel="noopener" +>Hugo</a> 这三个。不在这里详细介绍了,因为功能都大同小异。在选定一个之后,需要去他们的官网查看文档以了解具体的使用细节,以便对自己的博客站点能够做到更深的定制。</p> +<p>我在接下来的操作步骤里,选择使用 Hugo 这个生成器。</p> +<p>主要原因是,Hugo 提供有相对来说比较美观的<a class="link" href="https://themes.gohugo.io/" target="_blank" rel="noopener" +>免费主题风格模板</a>(Jekyll 也有漂亮的,但是收费。Hexo 的定制性很强,适合有网页开发能力的人自己开发主题)。</p> +<p>我选择的主题模板是:<a class="link" href="https://themes.gohugo.io/themes/hugo-theme-stack/" target="_blank" rel="noopener" +>hugo-theme-stack</a>。</p> +<p><img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-10-40-58.png" +width="900" +height="300" +loading="lazy" +class="gallery-image" +data-flex-grow="300" +data-flex-basis="720px" +></p> +<h2 id="操作步骤">操作步骤</h2> +<h3 id="建立-github-仓库">建立 Github 仓库</h3> +<ol> +<li>点击这个超链接进入 <a class="link" href="https://github.com/CaiJimmy/hugo-theme-stack-starter" target="_blank" rel="noopener" +>hugo-theme-stack-starter 的 Git 仓库模板</a>。</li> +<li>点击页面中的“使用此模板”按钮,以创建你自己的仓库(注意:需先登录自己的账号才能创建)。 +<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-10-45-54.png" +width="925" +height="134" +loading="lazy" +class="gallery-image" +data-flex-grow="690" +data-flex-basis="1656px" +></li> +<li>建立好仓库(注意仓库命名为<code>你的用户名.github.io</code>)之后,会自动带有仓库模板的初始文件。 +<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-10-47-57.png" +width="908" +height="528" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="412px" +></li> +</ol> +<h3 id="修改配置">修改配置</h3> +<ol> +<li>将仓库下载到本地。</li> +<li>打开仓库里的 config 文件夹,里面存放有配置信息。</li> +<li>按照 <a class="link" href="https://stack.jimmycai.com/guide/getting-started" target="_blank" rel="noopener" +>hugo-theme-stack 的官方文档</a>配置自己想要的效果(默认一般都够用,重点是修改自己的站点信息,如显示名称、URL 链接地址等等)。 +<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-10-53-02.png" +width="1466" +height="682" +loading="lazy" +class="gallery-image" +data-flex-grow="214" +data-flex-basis="515px" +> +<em>这些配置主要在 <code>config.toml</code> 和 <code>params.toml</code> 两个文件里。</em></li> +</ol> +<h3 id="编写博客文章">编写博客文章</h3> +<p>生成器会默认去仓库的 <code>content/post/</code> 文件夹下扫描其下面的所有文件夹和文件,遇到约定格式的 <code>Markdown</code> 文件就会转换成为可发布的 <code>html</code> 页面。具体约定可以查看官方的详细文档,这里介绍一种最简单的写一篇文章的过程。</p> +<ol> +<li>在 post 目录下新建一个文件夹用于存放文章的 Markdown 文件和插图文件,文件夹命名为希望编写的标题如:<code>2023-09-21-怎样搭建个人博客</code>。<em>我个人习惯将不同年份的文章在post目录下再建一级目录按照日期或年份进行区分。</em></li> +<li>在刚建立的文件夹下新建名称为<code>index.md</code>的 Markdown 文件,文件名必须为 index.md 这是由 hugo 生成器约定的。</li> +<li>在刚建立的 Markdown 文件的头部添加必要的元信息(非常关键)。 +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span><span class="lnt">8 +</span><span class="lnt">9 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w"> </span>---<span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="l">文章标题</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">date</span><span class="p">:</span><span class="w"> </span><span class="ld">2023-09-21</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">categories</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">文章所属分类</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tags</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">文章标签 1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">文章标签 2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>---<span class="w"> +</span></span></span></code></pre></td></tr></table> +</div> +</div><img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-11-07-46.png" +width="787" +height="357" +loading="lazy" +class="gallery-image" +data-flex-grow="220" +data-flex-basis="529px" +></li> +<li>编写文章内容。可以使用 <a class="link" href="https://markdown.com.cn/basic-syntax/" target="_blank" rel="noopener" +>Markdown 的语法</a>随意定义格式,以及插入图片。插入的图片建议保存在同级目录(也就是刚才新建的那个)中。</li> +</ol> +<h3 id="推送到仓库及发布">推送到仓库及发布</h3> +<ol> +<li>将刚才修改配置文件保存。</li> +<li>将刚才编写的博客文章保存。</li> +<li>在本地提交 commit 并 push 到 Github 仓库。</li> +<li>稍等几分钟(给 Github 那端的 Hugo 生成器留出运行时间)。</li> +<li>在 Github 仓库的 “setting” 设置页面开启 Pages 服务(只需第一次)。</li> +<li>在 Pages 设置界面里的 Source 中选择 “Deploy from a branch” ,并在下面的分支选择下拉框中选择 “gh-pages”,保存。 +<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-11-17-49.png" +width="1090" +height="568" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="460px" +></li> +</ol> +<h3 id="访问你的博客站点">访问你的博客站点</h3> +<p>一般稍等几分钟之后,即可按照约定网址访问刚发布的内容了。 +<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-11-31-26.png" +width="1539" +height="661" +loading="lazy" +class="gallery-image" +data-flex-grow="232" +data-flex-basis="558px" +></p> +<h2 id="扩展阅读">扩展阅读</h2> +<p>运营自己的博客网站所需了解的概念和知识相对比较多,如果希望将自己的网站做的更加精美、有特色。</p> +<p>除了能够持续产出高质量内容之外,建议阅读以下文章以了解相关知识:</p> +<ul> +<li><a class="link" href="https://developer.mozilla.org/zh-CN/docs/Learn/Getting_started_with_the_web" target="_blank" rel="noopener" +>学习 web 开发</a>。</li> +</ul>机器文摘 第 050 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/Tue, 19 Sep 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-31-40.png" alt="Featured image of post 机器文摘 第 050 期" /><h1 id="机器文摘-第-050-期">机器文摘 第 050 期</h1> +<h2 id="长文">长文</h2> +<h3 id="十八世纪的光学电报网络">十八世纪的光学电报网络</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-31-08.png" +width="500" +height="517" +loading="lazy" +class="gallery-image" +data-flex-grow="96" +data-flex-basis="232px" +></p> +<p>当年读《基督山伯爵》的时候,有一个让我震惊的科技。</p> +<p>主人公有一项复仇计划是破坏敌人的金融资产。计划采取的手段是收买了一个传递实时信息的人让其传递错误信息。</p> +<p>而具体传递信息的手段是,每隔一段距离设一座瞭望塔,每个塔上有一个人,向一个方向用望远镜观看,远方的上级瞭望塔会有人发射信号弹,一连串的信号弹代表一定的信息,然后这个人再原样发射一遍,让后方的瞭望塔看见。信息就这样一级一级传递下去。</p> +<p>信息经过编码,可以表达股票行情等信息,类似后来的电报系统,但是这是在十八世纪。</p> +<p>读过之后我就一直有疑问,不知道小说是否虚构了这种信息传递技术,直到前几天我发现了这篇文章:<a class="link" href="https://www.lowtechmagazine.com/2007/12/email-in-the-18.html" target="_blank" rel="noopener" +>《十八世纪的光学电报网络》</a>。</p> +<p>里面详细介绍了在两百多年前人类就已经发明了“光学电报”系统,并建立起了巨大的信息网络。信息传递速度达到了惊人的 1380千米/每小时。</p> +<h3 id="c-语言发展简史">C 语言发展简史</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-31-23.png" +width="690" +height="352" +loading="lazy" +class="gallery-image" +data-flex-grow="196" +data-flex-basis="470px" +></p> +<p>要说 C 语言是计算机历史上最重要的编程语言应该不会有人反对吧。</p> +<p>作为大多数人编程入门的母语,C 语言具有语法简洁、高性能(贴近计算机底层)、使用灵活、适用范围广泛等特点。</p> +<p>虽然诞生于上个世纪 70 年代,但即便是在 2023 年的今天,C 语言仍然排在各大编程排行榜的考前位置,仍然是信息科技的重要支撑力量。</p> +<p><a class="link" href="http://cm.bell-labs.co/who/dmr/chist.html" target="_blank" rel="noopener" +>《C 语言简史》</a>,由丹尼斯·里奇(C 语言之父)撰写,是一篇难得的介绍 C 语言的诞生和发展的历史性文献。</p> +<h3 id="vbvisual-basic发展简史">VB(Visual Basic)发展简史</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-31-40.png" +width="690" +height="518" +loading="lazy" +class="gallery-image" +data-flex-grow="133" +data-flex-basis="319px" +></p> +<p>前几天 HN 上有个从业近 30 年的老程序员发问:<a class="link" href="https://news.ycombinator.com/item?id=37470318" target="_blank" rel="noopener" +>为什么 VB(Visual Basic)这么高效、好用的开发工具逐渐消失了?</a>。</p> +<p>被顶的最高的网友放出了<a class="link" href="https://retool.com/visual-basic/" target="_blank" rel="noopener" +>《Visual Basic 从诞生到消失》</a>这篇文章。</p> +<p>在上世纪 80 年代末 90 年代初,Windows 操作系统刚刚崭露头角的时候,VB 已经在萌芽状态了。而且已经具有非常先进的组件化、可视化、低代码等超前思想。并且发明了“控件”、“消息触发”等概念。</p> +<p>最初的版本与 BASIC 语言并无关系,只考虑了使用可视化开发并辅助简单的内嵌脚本,但是比尔·盖茨对 BASIC 十分热爱(毕竟那是微软起家的技术),亲自推动了组件化、可视化开发与 BASIC 语言结合,便诞生了 Visual Basic。</p> +<p>得益于超前的可视化开发理念,VB 极大降低了当时开发应用程序的门槛,涌现出一大批开发者。包括当时那些不得不转型给个人电脑开发程序的大型机编程工程师。</p> +<p>这一切在 VB 随着 Visual Studio 发布 6.0 的时候达到了顶峰。</p> +<p>转折点出现在微软为了应对 Java 的威胁而推出 .Net 公共语言运行时的时候,VB 也被纳入到这套体系里,被成为 VB.Net ,扩充了复杂的语法和继承、多态等高级特性。</p> +<p>对于那些真正喜欢 VB6 的人来说,这些都是唯恐避之不及的东西,更糟糕的是新的 VB.Net 无法兼容之前的代码,大量成果移植困难。</p> +<p>之后更是随着网络信息科技的发展,Web 编程逐渐取代了 Windows 桌面编程,VB 这个伟大的技术,被淘汰也就是顺其自然的了。</p> +<h3 id="一个在网页里模仿-excel-表格的故事">一个在网页里模仿 Excel 表格的故事</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-32-14.png" +width="690" +height="201" +loading="lazy" +class="gallery-image" +data-flex-grow="343" +data-flex-basis="823px" +></p> +<p><a class="link" href="https://websheets.github.io/websheets/demo/" target="_blank" rel="noopener" +>一位前端工程师,讲述了他在 2016 年受雇于 Uber(优步)时的一些开发往事</a>。</p> +<p>作为服务于数据工程师的内部研发团队,他所在的小组主要是给公司的数据分析人员提供内部工具,以便让他们能够更快地分析数据,更快的分析数据意味着更有可能在产品运营竞争里获胜。</p> +<p>然而数据分析人员总是抱怨工具不满足要求,主要是操作界面,因为他们非常习惯“Excel”,每次提需求的时候总是说:“你就做得跟 Excel 一样就行”。</p> +<p>作者最开始还试图跟用户解释要实现起来是多么困难,后来逐渐放弃了挣扎,并开始着手在网页里实现一个跟 Excel 一样的表格,而且他竟然实现了。</p> +<p>故事的后来有些伤感,作者提供的工具并没有使得 “Uber” 在跟嘀嘀的竞争中胜出,相反地,“Uber”在中国的业务还被“嘀嘀”收购了。</p> +<p>被用于数据分析的工具也被抛弃不再使用。</p> +<p>后来作者选择了将那个像 Excel 的表格代码放在了 <a class="link" href="github.com/WebSheets/websheets" >Github 进行开源,地址在这里</a>。</p> +<h2 id="资源">资源</h2> +<h3 id="通用-web-应用服务器">通用 Web 应用服务器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-32-34.png" +width="690" +height="356" +loading="lazy" +class="gallery-image" +data-flex-grow="193" +data-flex-basis="465px" +></p> +<p><a class="link" href="https://unit.nginx.org/" target="_blank" rel="noopener" +>NGINX Unit</a>,通用 Web 应用服务器。是一个轻量且多功能的应用运行时,作为一个单一的开源服务器,它提供了您的 Web 应用程序所需的基本组件:运行应用程序代码(包括 WebAssembly)、提供静态资源、处理 TLS 和请求路由。</p> +<p>Unit 是由 NGINX 团队成员从零开始创建的,以在运行时高度高效且完全可配置。最新版本是 1.31.0,于 2023 年 8 月 31 日发布。</p> +<h3 id="绿色安卓-app-合集">绿色安卓 App 合集</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-32-52.png" +width="690" +height="385" +loading="lazy" +class="gallery-image" +data-flex-grow="179" +data-flex-basis="430px" +></p> +<p><a class="link" href="https://www.simplemobiletools.com/" target="_blank" rel="noopener" +>绿色安卓app合集</a>。</p> +<p>这个网站收集了一大批良心 app,全部没有广告且不要求隐私权限。</p> +<p>几乎涵盖了日常使用的所有类型,包括艺术绘画、音乐播放器、笔记、文件管理、录音、拍照等。 ​​​</p> +<h3 id="nuejs">nuejs</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-33-10.png" +width="690" +height="455" +loading="lazy" +class="gallery-image" +data-flex-grow="151" +data-flex-basis="363px" +></p> +<p><a class="link" href="https://nuejs.org/" target="_blank" rel="noopener" +>nuejs</a>,越来越多的人对前端开发的混乱感到不满了。不同的是有人选择抱怨,有人撸起袖子开干。nuejs 的作者觉得现在使用 React、Vue 等框架再加上若干服务端渲染框架,使得前端开发生态变得越来越复杂和掌握。于是自己动手开发了一个简单的轻量化框架,终极目标是构建一个简洁、高效的前端开发生态。</p> +<h3 id="1024-字节的网页可显示-3d-地球">1024 字节的网页,可显示 3D 地球</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-33-21.png" +width="447" +height="255" +loading="lazy" +class="gallery-image" +data-flex-grow="175" +data-flex-basis="420px" +></p> +<p><a class="link" href="https://aem1k.com/world/" target="_blank" rel="noopener" +>1024 字节的 JavaScript,在网页中显示动画 3D 地球模型</a>,页面动画显示的就是其源代码。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="p">.</span><span class="o">&lt;</span><span class="nx">script</span><span class="o">&gt;</span> +</span></span><span class="line"><span class="cl"><span class="nb">eval</span><span class="p">(</span><span class="nx">z</span><span class="o">=</span><span class="s1">&#39;p=&#34;&lt;&#34;+&#34;pre&gt;&#34;/* ,.oq#+ ,._, */;for(y in n=&#34;zw24l6k\ +</span></span></span><span class="line"><span class="cl"><span class="s1">4e3t4jnt4qj24xh2 x/* =&lt;,m#F^ A W###q. */42kty24wrt413n243n\ +</span></span></span><span class="line"><span class="cl"><span class="s1">9h243pdxt41csb yz/* #K q##H######Am */43iyb6k43pk7243nm\ +</span></span></span><span class="line"><span class="cl"><span class="s1">r24&#34;.split(4)){/* dP cpq#q##########b, */for(a in t=pars\ +</span></span></span><span class="line"><span class="cl"><span class="s1">eInt(n[y],36)+/* p##@###YG=[#######y */(e=x=r=[]))for\ +</span></span></span><span class="line"><span class="cl"><span class="s1">(r=!r,i=0;t[a/* d#qg `*PWo##q#######D */]&gt;i;i+=.05)wi\ +</span></span></span><span class="line"><span class="cl"><span class="s1">th(Math)x-= /* aem1k.com Q###KWR#### W[ */.05,0\ +</span></span></span><span class="line"><span class="cl"><span class="s1">x;)p+=&#34; *#&#34;/* b. OQ####x#K */[e[x++]+e[x++\ +</span></span></span><span class="line"><span class="cl"><span class="s1">]]||(S=(&#34;eval&#34;/* l `X#####D , */+&#34;(z=\&#39;&#34;+z.spl\ +</span></span></span><span class="line"><span class="cl"><span class="s1">it(B = &#34;\\\\&#34;)./* G####B&#34; # */join(B+B).split\ +</span></span></span><span class="line"><span class="cl"><span class="s1">(Q=&#34;\&#39;&#34;).join(B+Q/* VQBP` */)+Q+&#34;)//m1k&#34;)[x/2\ +</span></span></span><span class="line"><span class="cl"><span class="s1">+61*y-1]).fontcolor/* TP */(/\\w/.test(S)&amp;&amp;&#34;#\ +</span></span></span><span class="line"><span class="cl"><span class="s1">03B&#34;);document.body.innerHTML=p+=B+&#34;\\n&#34;}setTimeout(z)&#39;</span><span class="p">)</span><span class="c1">// +</span></span></span></code></pre></td></tr></table> +</div> +</div><h3 id="全球-ip-地址地理位置数据库">全球 IP 地址地理位置数据库</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-33-35.png" +width="690" +height="385" +loading="lazy" +class="gallery-image" +data-flex-grow="179" +data-flex-basis="430px" +></p> +<p><a class="link" href="https://ipapi.is/geolocation.html" target="_blank" rel="noopener" +>全球 IP 地址 地理位置数据库</a>。含 IPV4 和 IPV6。 ​​<a class="link" href="https://ipapi.is/geolocation.html" target="_blank" rel="noopener" +>​这篇文章里还介绍了构建 IP 地址地理数据库的实现原理</a>和一套具有指导意义的实现方法。基本原理是:“互联网中的每个 IP 地址都由组织拥有或管理。可以向互联网注册机构查询WHOIS信息。”</p> +<h2 id="观点">观点</h2> +<h3 id="为什么-facebook-的-pytorch-占有率赢了-google-的-tensorflow">为什么 Facebook 的 PyTorch 占有率赢了 Google 的 Tensorflow</h3> +<p>Pytorch 已经完全击败了 Tensorflow,成为 AI 开发框架的事实标准。Pytorch 一开始就专注于学术界,方向是把最牛的人吸引过来。而 Tensorflow 则倾向于软件工程炫技,做各种简单但是酷炫的功能。</p> +<p>最终专业化的 torch 击败了 tensorflow 。 我觉得​​​还有一个原因就是 Google 特别容易弃坑,Tensorflow 中间也切换过前后不兼容的 API。</p> +<h3 id="越来越多的科技产品让人更好地欺骗自己">越来越多的科技产品让人更好地欺骗自己</h3> +<p>比如美颜相机、电影特效、游戏等,研发它们的主要目的就是让人们更好的实现自我欺骗和催眠。</p> +<h3 id="东方文明为什么警惕科技我个人不完全同意">东方文明为什么警惕科技(我个人不完全同意)</h3> +<p>中国古代对于科技非常警惕和打压的原因,也许是古人早就意识到科技(或技术)力量很容易对人类造成强烈反噬。</p> +<p>观点来自 <a class="link" href="https://www.bilibili.com/video/BV1pu4y1r7KW/" target="_blank" rel="noopener" +>@​​​安东尼2001:量子自旋理论背后,是人类历史的轮回</a>。</p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 049 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/Tue, 12 Sep 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-34-22.png" alt="Featured image of post 机器文摘 第 049 期" /><h1 id="机器文摘-第-049-期">机器文摘 第 049 期</h1> +<h2 id="长文">长文</h2> +<h3 id="在-linux-环境里执行-windows-应用程序">在 Linux 环境里执行 Windows 应用程序</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-33-44.png" +width="512" +height="512" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +></p> +<p>最近遇到一个难以启齿的需求,服务器是 Linux 环境,但是某项服务功能却需要执行一个 Windows exe 文件。</p> +<p>不得已才想到要求助 Wine 这个经典中间层,据说可以使的 Linux 兼容大部分的 Win32 程序。</p> +<p>但是又不想污染服务器的其他环境,于是选择在容器中运行。</p> +<p>在网上找到了这篇<a class="link" href="https://leimao.github.io/blog/Docker-Wine/" target="_blank" rel="noopener" +>《利用 Docker 容器和 Wine 在 Linux里运行 Windows 程序》</a>,按照文中介绍的步骤成功实现了需求。</p> +<p>基本步骤: +1、根据文章提供的 Dockfile 构建镜像; +2、运行镜像并注意配置运行容器的环境变量; +3、执行所需的 exe 程序。</p> +<h3 id="windows-系统是怎样进行引导的">Windows 系统是怎样进行引导的</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-34-06.png" +width="690" +height="976" +loading="lazy" +class="gallery-image" +data-flex-grow="70" +data-flex-basis="169px" +></p> +<p>前不久,我在给笔记本更换大容量固态硬盘的时候,由于不愿重做系统,使用了硬盘克隆功能,将原盘整体信息直接克隆到新硬盘。</p> +<p>结果克隆成功并替换安装硬盘之后,却没能正常引导进入 Windows,而是进入了一个类似 PE 系统的界面(猜测是原盘中厂家自制的),并告知我由于检测到硬件更换,拒绝引导,并建议我选择恢复系统。</p> +<p>我猜测之前的隐藏分区可能有笔记本厂家做的一些特定引导程序,才导致这样的情况。</p> +<p>我对系统引导的理解还停留在 MBR 分区表大面积应用的阶段。于是尝试删除了隐藏分区,并手动将系统盘分区设置为了 “激活”分区(事实上这时候已经错了,因为 GPT 分区表方式下无法采用这种引导方式了)。</p> +<p>结果系统干脆直接无法引导。出现这种情况,我之前的知识储备显然不够用了。</p> +<p>经过一番折腾和搜索,我才得知现在 Windows 8 及以上版本操作系统的电脑所采用的方式是 GPT 分区表 + UEFI 引导。</p> +<p>也就是说硬盘上需要单独开辟一个分区存储负责进行操作系统引导的工作。这个分区平时对于操作系统的资源管理器不可见(但磁盘管理中可以看到),由主板上的 UEFI 程序(这个程序可以理解为 BIOS 的升级版)进行访问和管理。</p> +<p>了解这个方式之后,就简单了,重新使用工具修改 GPT 分区并制作专用引导分区即可。</p> +<p>最后,为了弄清这跟之前的 MBR 引导方式有什么区别,我找到了一位运维工程师总结得较到位的文章<a class="link" href="https://zhuanlan.zhihu.com/p/355526135" target="_blank" rel="noopener" +>《Windows系统开机引导顺序简述及运维小结》</a>。</p> +<h3 id="500-行代码写一个-c-编译器">500 行代码写一个 C 编译器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-34-22.png" +width="690" +height="690" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +></p> +<p><a class="link" href="https://vgel.me/posts/c500/" target="_blank" rel="noopener" +>500 行 Python 代码写一个 C 编译器</a>。</p> +<p>作者立下这个 flag 之后才发现任务有多难。</p> +<p>主要是代码行数太少了,如果使用传统手段实现,可能这点儿代码量还不够写个语法分析器的。</p> +<p>于是作者主动放弃了 AST (抽象语法树)的构建,采用 Token 提取和指令生成“一遍过”的方式,实现了一个相当“简洁”的 C 编译器。</p> +<h2 id="资源">资源</h2> +<h3 id="假装弹钢琴">假装弹钢琴</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-34-51.png" +width="690" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="204" +data-flex-basis="491px" +></p> +<p><a class="link" href="http://touchpianist.com/" target="_blank" rel="noopener" +>touchpianist</a>,在线弹钢琴的网站(也提供手机 App 版),可以让你假装钢琴大师,只需要按键盘上的任意键,旋律就会自动演奏,不过你要控制敲击键盘的速度,以匹配原曲的节奏。我弹了一下,默认曲目是贝多芬的《月光奏鸣曲》,差点儿被自己陶醉了。 ​​​</p> +<h3 id="bun-v10">Bun V1.0</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-35-09.png" +width="690" +height="419" +loading="lazy" +class="gallery-image" +data-flex-grow="164" +data-flex-basis="395px" +></p> +<p><a class="link" href="https://bun.sh/blog/bun-v1.0" target="_blank" rel="noopener" +>bun-v1.0</a>,拳打 node , 脚踢 deno 的 JavaScript 运营环境 bun 推出了 1.0 版本。主打一个“All in one”,号称可以一次性取代一揽子工具:node、npx、npm、webpack、tsc、babel、jest。一个工具包揽了运行、打包、包管理、转译、测试等所有事情,且速度是 nodejs 的 3 倍。</p> +<p>对于这种吹的比较厉害的技术,保持关注,谨慎使用吧。</p> +<h3 id="开源基于-llm-知识库平台">开源基于 LLM 知识库平台</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-35-24.png" +width="690" +height="334" +loading="lazy" +class="gallery-image" +data-flex-grow="206" +data-flex-basis="495px" +></p> +<p><a class="link" href="https://github.com/labring/FastGPT" target="_blank" rel="noopener" +>FastGPT</a> - 基于 LLM 大模型的 AI 知识库问答系统。提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景。项目在 Github 开源,采用技术栈: NextJs + TS + ChakraUI + Mongo + Postgres(Vector 插件)。支持 GPT、Claude、Spark、ChatGLM 等多种 LLM 模型。</p> +<h3 id="开源基于-llm-数据可视化平台">开源基于 LLM 数据可视化平台</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-35-35.png" +width="690" +height="292" +loading="lazy" +class="gallery-image" +data-flex-grow="236" +data-flex-basis="567px" +></p> +<p><a class="link" href="https://github.com/microsoft/lida" target="_blank" rel="noopener" +>lida</a>,微软出品的数据可视化工具库,特点是基于 LLM 对话模型进行生成,其生成的可视化代码支持多种可视化后端的语法,包括 matplotlib、seaborn、d3等。 ​​​</p> +<h2 id="观点">观点</h2> +<h3 id="编程是一种体育锻炼">编程是一种体育锻炼</h3> +<p>编程除了是一种可以以之谋生的专业技能,对于那些真喜欢编程的人来说,它还是一个心理疗愈工具。</p> +<p>编程能使人专注,进入“心流”状态比较容易,也容易让人的心态平和。</p> +<p>编程与体育锻炼一样,都是可以让人受益终生的活动。</p> +<p>&mdash;-来自<a class="link" href="https://weibo.com/1461522430/NiEh1BHMt" target="_blank" rel="noopener" +>@软件教书匠金旭亮</a>。</p> +<h3 id="造成电子阳痿的一种因素">造成电子阳痿的一种因素</h3> +<p>一个不容忽视的因素是现在游戏的加载速度,尤其是 PC 游戏。</p> +<p>我们被碎片化信息惯得一秒钟都不想等待。</p> +<p>每当想玩会儿 CS 或者地平线之类得游戏,光是等待游戏启动、地图加载等就足以让人放弃想玩的念头。</p> +<p>更别提有些游戏还有一些跳都无法跳过得开场引导视频。</p> +<p>所以我现在就算是玩也是偶尔打开模拟器玩一玩老游戏,带有状态存储,随时加载存档。</p> +<p>据说有一部分游戏主机(比如新一代 XBox)有类似笔记本电脑的睡眠功能,开机就玩,随时进入上次未完成的任务。</p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 048 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/Tue, 05 Sep 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/<h1 id="机器文摘-第-048-期">机器文摘 第 048 期</h1> +<h2 id="长文">长文</h2> +<h3 id="关于-python-语言的一些统计数字">关于 Python 语言的一些统计数字</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-20-05.png" +width="690" +height="307" +loading="lazy" +class="gallery-image" +data-flex-grow="224" +data-flex-basis="539px" +></p> +<p><a class="link" href="https://py-code.org/stats" target="_blank" rel="noopener" +>关于开源 Python 仓库的一些有趣统计</a>,有人克隆了 PyPI 网站里所有 Python 包对应的 Github 仓库,并对这些仓库里的全部文件进行了分析和统计。</p> +<p>1、排名前三的语法特性分别是:列表推导、fstring字符串格式化、注解;</p> +<p>2、代码中大约包含有超过 2 万 5 千个密钥明文,泄露最多的是访问 Google API、OpenAI API和腾讯云 Secret ID;</p> +<p>3、截止到 2023 年 8 月,所有源码加起来已超过 60TB ,文件数量超过 10 亿。</p> +<h3 id="wasm-技术让数据库执行-ai-模型">Wasm 技术让数据库执行 AI 模型</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-20-30.png" +width="618" +height="492" +loading="lazy" +class="gallery-image" +data-flex-grow="125" +data-flex-basis="301px" +></p> +<p><a class="link" href="https://dylibso.com/blog/pg-extism/" target="_blank" rel="noopener" +>使用 Extism 将 WebAssembly 引入 PostgreSQL</a>。</p> +<p>这篇文章的作者介绍了一种方法,可以使用 Wasm 技术通过扩展插件的方式给 PostgreSQL 数据库增加 UDF (用户自定义函数),从而实现调用 AI 模型的能力。</p> +<h3 id="bitlocker-硬件加密能破解吗">BitLocker 硬件加密能破解吗?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-20-50.png" +width="690" +height="499" +loading="lazy" +class="gallery-image" +data-flex-grow="138" +data-flex-basis="331px" +></p> +<p>BitLocker 是 Windows 下的存储加密技术,用于保护硬盘中的数据安全。</p> +<p>未经解密的硬盘即使遗失或者被接入其他系统也无法进行读取。</p> +<p>这在极大程度上带来了数据安全(不过仍有不少用户在不知情的情况下开启了 BitLocker 且未保存密钥,在重做系统的时候发现硬盘无法解密,数据无法恢复。。欲哭无泪。。)。</p> +<p>然而这种加密方式也不是绝对安全,国外有技术爱好者对此进行了挑战,并使用一台逻辑分析仪成功绕过了加密。</p> +<p><a class="link" href="https://www.errno.fr/BypassingBitlocker.html" target="_blank" rel="noopener" +>这篇文章进行了详细的记录</a>。</p> +<p>主要原理为:在系统开机启动过程中的某个时刻,加密芯片和 CPU 之间传输了未加密的信号。使用逻辑分析仪捕获该信号可以逆向出加密密钥。</p> +<h2 id="资源">资源</h2> +<h3 id="监控网页信息变化的工具">监控网页信息变化的工具</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-21-17.png" +width="499" +height="326" +loading="lazy" +class="gallery-image" +data-flex-grow="153" +data-flex-basis="367px" +></p> +<p><a class="link" href="https://github.com/dgtlmoon/changedetection.io" target="_blank" rel="noopener" +>changedetection</a>,一个监控网站变化的工具。</p> +<p>帮助用户密切关注商品打折、股票行情、政策发布等信息变动。</p> +<p>支持通过网页可视化的方式指定监控页面区域。</p> +<p>通过邮件、即时聊天软件、API调用等多种方式推送信息。可使用 Docker 部署,或者本地 Python 环境部署。</p> +<h3 id="switch-模拟器">Switch 模拟器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-21-28.png" +width="690" +height="472" +loading="lazy" +class="gallery-image" +data-flex-grow="146" +data-flex-basis="350px" +></p> +<p><a class="link" href="https://github.com/Ryujinx/Ryujinx" target="_blank" rel="noopener" +>Ryujinx</a> 一个用c# 写的开源 switch 模拟器,该模拟器旨在提供卓越的准确性和性能、用户友好的界面以及稳定的版本构建。 ​​​</p> +<h3 id="文字缩写快捷键工具">文字缩写快捷键工具</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-21-45.png" +width="568" +height="446" +loading="lazy" +class="gallery-image" +data-flex-grow="127" +data-flex-basis="305px" +></p> +<p>为了减少打字量,国外这哥们写了个脚本将日常用语全部缩写了,只需敲入缩写字母,脚本自动完成完整句子的键盘输入。</p> +<p>比如: +st =&gt; something +ab =&gt; about +hw =&gt; hardware +sti =&gt; sometime</p> +<p>据小哥自己统计,使用这个脚本以后他已经减少了一半的键盘敲击量。</p> +<p><a class="link" href="https://github.com/eschluntz/compress" target="_blank" rel="noopener" +>项目名叫 compress 目前已开源</a>,如果你有兴趣,改成支持中文也不是不可以。</p> +<h3 id="canvas-手册">Canvas 手册</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-22-11.png" +width="562" +height="625" +loading="lazy" +class="gallery-image" +data-flex-grow="89" +data-flex-basis="215px" +></p> +<p>Canvas 是网页中用于图形绘制的基本元素,结合 JavaScript 可以实现各种复杂的图形效果和交互动画。我之前都是每次用到了的时候现去翻文档,对它的每个 API 都是一知半解。这里有一个<a class="link" href="https://bucephalus.org/text/CanvasHandbook/CanvasHandbook.html" target="_blank" rel="noopener" +>Canvas 手册</a>,详细介绍了 Canvas 的各种调用接口。适合希望深度使用及系统学习 Canvas。</p> +<h2 id="观点">观点</h2> +<h3 id="不要重复造轮子是人为设置的一种限制">“不要重复造轮子”是人为设置的一种限制</h3> +<p>遇到需求不能满足的情况,是去“寻找轮子”还是“动手创造轮子”,这是两种不同的思维习惯。</p> +<p>“寻找轮子”往往意味着寻找已有答案,将问题看为一种正常的状态,是“自古以来”、是“从来如此”。</p> +<p>思维定势一旦形成,就很难改变,让人成了那个在沙漠中让美女帮他牵住骆驼的矮子。</p> +<p>动手创造者往往是发现这种问题的人,他们不循规蹈矩,他们 Think different,是改变世界的人。</p> +<p>“不要重复发明轮子”,这个原则用于工作中确实比较安全,他保证了不会浪费资源,并且避免了一定的技术风险。</p> +<p>但也同时拒绝了伟大的创新。</p> +<p>所以不要被这句话束缚,尽管去做自己的轮子。</p> +<p>哪怕它一开始很丑。</p> +<p>你的轮子必将使你与众不同,使你拥有不一样的视角,成为那个动手创造的人。</p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 047 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/Tue, 29 Aug 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/<h1 id="机器文摘-第-047-期">机器文摘 第 047 期</h1> +<h2 id="长文">长文</h2> +<h3 id="业余爱好者痴迷于工具专业人士注重技能">业余爱好者痴迷于工具,专业人士注重技能</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-17-36.png" +width="649" +height="582" +loading="lazy" +class="gallery-image" +data-flex-grow="111" +data-flex-basis="267px" +></p> +<p><a class="link" href="https://adamsinger.substack.com/p/amateurs-obsess-over-tools-pros-over" target="_blank" rel="noopener" +>业余爱好者痴迷于工具,专业人士注重技能</a>。</p> +<blockquote> +<p>以原声吉他为例。在数字音乐制作和合成器盛行的时代,这个单独演奏的乐器可能显得有点古老。然而,在熟练音乐家的手中,它变成了一个充满迷人旋律和触动灵魂的载体。它甚至可能为更大的创意提供灵感,如果你直接跳到现代合成器就有可能会错过这些。原声吉他的简单性促使艺术家专注于演奏的细微之处,完善他们的指弹技巧,并通过每一次弹奏传达情感。真正的魔力不在于吉他本身,而在于将其演绎得生动活泼的音乐家的技艺。</p> +</blockquote> +<p>这篇文章读来深有感触。</p> +<p>在解决问题的时候,我总是忍不住问自己,我这个方法是最优的吗?我使用的工具是不是最合适/最好的?</p> +<p>这种心理,常常使我陷入对最佳实践和完美工具的追求中,而忘记了解决问题本身。</p> +<p>时间久了,工具积累一大堆,但每个都未曾发挥其真正作用,一边老工具在吃灰,一边继续寻找新工具。</p> +<p>差生文具多。</p> +<p>正如文章中所说:真正的高手明白,应当拿起手里已有的工具,先行动起来。在这个过程中如果有机会创造美好的事物,好的工具自然会出现在眼前。</p> +<h3 id="cpu-的指令分支预测">CPU 的指令分支预测</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-17-49.png" +width="682" +height="743" +loading="lazy" +class="gallery-image" +data-flex-grow="91" +data-flex-basis="220px" +></p> +<p>现代的 CPU 基本都具有指令分支预测的特性,通过猜测后续会执行的指令分支,提前运行一些指令和设置状态,可以有效利用 CPU 的执行资源,提升效率。</p> +<p>不过,如果预测准确的话效率提升十分明显,但是如果预测错误,CPU 就要多做一些事情(刷新后续预测的指令和相关的状态),随着现代 CPU 中指令流水线越来越复杂,这种代价也变得越来愈大。</p> +<p>在编程的时候,编写一些对于 CPU 分支预测友好的代码,能够对性能产生极大的影响。</p> +<p>这篇<a class="link" href="https://johnnysswlab.com/how-branches-influence-the-performance-of-your-code-and-what-can-you-do-about-it/" target="_blank" rel="noopener" +>对于 CPU 的分支预测,我们能做什么</a>耐心地从 CPU 的分支预测机制讲起,通过具体的代码举例,讲解了怎样让编写的代码对 CPU 分支预测这类优化更加友好。</p> +<h3 id="ssh-命令详解">SSH 命令详解</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-18-25.png" +width="690" +height="535" +loading="lazy" +class="gallery-image" +data-flex-grow="128" +data-flex-basis="309px" +></p> +<p><a class="link" href="https://grahamhelton.com/blog/ssh-cheatsheet/" target="_blank" rel="noopener" +>SSH 命令详解</a>,一篇对 SSH 命令的参数介绍十分详细且易懂的文章。</p> +<p>通过举例让我彻底弄清楚了基于 SSH 的端口转发。</p> +<p>另外还知道了可以在已有的 SSH 连接上执行补充命令,以实现不断开终端的情况下将远程主机上的端口转发到本机访问。 ​​​</p> +<h2 id="资源">资源</h2> +<h3 id="开源的房子">开源的房子</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-18-47.png" +width="690" +height="403" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="410px" +></p> +<p><a class="link" href="https://www.wikihouse.cc" target="_blank" rel="noopener" +>wikihouse</a>,是一个开源房屋建造网站,房子的图纸、模型均可从网站上下载,里面有各式各样的房屋建造资料,任何人都可以据此增删、设计、制造、组装自己的建筑。可以理解为建筑界的 github。 +​​​</p> +<h3 id="关掉-edge-浏览器新增的圆角样式">关掉 Edge 浏览器新增的圆角样式</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-19-03.png" +width="690" +height="352" +loading="lazy" +class="gallery-image" +data-flex-grow="196" +data-flex-basis="470px" +></p> +<p>Edge 浏览器的最新更新里,给所有页面强制增加了一个圆角边框,看起来很不习惯(丑陋)。</p> +<p>经过研究,我发现,如果想恢复到之前的样子,可以在设置外观选项里关闭该特性。</p> +<p>我已经关闭,并果断给这个功能特性反馈了负面评价。</p> +<h3 id="hello-world">Hello World</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-19-26.png" +width="690" +height="385" +loading="lazy" +class="gallery-image" +data-flex-grow="179" +data-flex-basis="430px" +></p> +<p><a class="link" href="https://github.com/leachim6/hello-world" target="_blank" rel="noopener" +>Hello World</a> ,这个仓库收录了几乎所有编程语言(997种)的 Hello world 程序。 ​​​</p> +<h3 id="前端开发代码大全">前端开发代码大全</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-19-42.png" +width="690" +height="639" +loading="lazy" +class="gallery-image" +data-flex-grow="107" +data-flex-basis="259px" +></p> +<p><a class="link" href="https://30secondsofcode.org" target="_blank" rel="noopener" +>30secondsofcode</a>。</p> +<p>这个网站有大量可复用的代码片段,主要是 Javascript、CSS、HTML 、Python 等语言的内容,可以覆盖 Web 应用开发全栈。</p> +<p>里面收录的代码段或者文章都很清新,每个都配有细心的解释,具有良好的实用性。 ​​​</p> +<h3 id="关于-win10-的锁屏睡眠时间">关于 Win10 的锁屏睡眠时间</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-20-00.png" +width="410" +height="502" +loading="lazy" +class="gallery-image" +data-flex-grow="81" +data-flex-basis="196px" +></p> +<p>我在使用 Windows10 的时候发现一个问题。</p> +<p>无论我将电源设置里的睡眠时间、显示器空闲关闭时间设置多长,锁屏后系统都会在 1 分钟之后关闭显示器。</p> +<p>这会带来一些不方便,并且让人困惑。</p> +<p>在经过一番研究搜索之后,找到了如下解决方案(Windows就是这么喜欢在注册表隐藏设置):</p> +<p>1、打开注册表编辑器后。</p> +<p>2、定位到:<code>计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\7516b95f-f776-4464-8c53-06167f40cc99\8EC4B3A5-6868-48c2-BE75-4F3044BE88A7</code></p> +<p>3、修改右侧的Attributes 数值为2 (初始值为1)</p> +<p>4、再打开“编辑电源计划”时会发现多了一个选项“控制台锁定显示关闭超时。</p> +<h3 id="红警2游戏整合包">红警2游戏整合包</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-20-25.png" +width="413" +height="302" +loading="lazy" +class="gallery-image" +data-flex-grow="136" +data-flex-basis="328px" +></p> +<p><a class="link" href="https://tmioe.com/7991.html" target="_blank" rel="noopener" +>红警2 的民间整合包</a>,支持 win7 到 win11。整合大量资源,傻瓜式一键安装。 ​​​</p> +<p>经过我的测试,前面链接页面里提供的安装包里带有额外的广告脚本,在使用时可使用 7z 等压缩软件直接打开该自解压包,选取主文件夹拷贝出来即可。</p> +<h2 id="观点">观点</h2> +<h3 id="隐形的门槛">隐形的门槛</h3> +<p>也许每个领域都存在一个隐形的门槛,无论是你学会一种语言,还是掌握一种能力,哪怕是打通一个游戏,只要你跨不过那个门槛,那么无论你尝试多少次,都会在同样的水平下无功而返。相反,一旦跨过后,那就是一马平川,你有了在那个新世界周游的能力。这当然不是说你不会再遇到困难,而是说,你不再有那种尝试了无数次,带着同一种感受离开的感觉。剩下的区别只是更多经验的积累,是熟练度的问题,因为你已经在那个轨道上了,你已经拿到了入场券。</p> +<p>人生可以被隐喻成一个有着自然消退机制的RPG体系,累积10000经验可以升那关键的一级,那么先前你无论你多少次到达5000,6000,9000都不行,因为熟练度会反复消退到1000,2000的水平。而我知道,很多人就是无数次的卡在了那9000以内,但每次都要从1000,2000这个位置开始。这个和自我接纳也没有关系,因为你知道你遇到的困难并不是基于你对自己的苛求,你的困难在于你无法为自己在乎的事情付出真正的努力,无法将自己的活力与热情持续的灌注在同一个点上,但你隐约知晓跨过那10000的门槛,是你更重要的人生福祉。</p> +<p>来自微博 <a class="link" href="https://weibo.com/3762961402/NgprO9HD5" target="_blank" rel="noopener" +>@崔庆龙_</a></p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 046 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/Tue, 22 Aug 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/<h1 id="机器文摘-第-046-期">机器文摘 第 046 期</h1> +<h2 id="长文">长文</h2> +<h3 id="windows-的任务管理器">Windows 的任务管理器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-28-48.png" +width="452" +height="758" +loading="lazy" +class="gallery-image" +data-flex-grow="59" +data-flex-basis="143px" +></p> +<p>如果你喜欢使用 Windows 任务管理器来查杀那些不安分的进程,并且跟我一样讨厌他们乱跳(尤其在按照资源占用排序时)。你可以按下 Ctrl 键,它就会神奇地停止更新直到你松开 Ctrl。</p> +<p>Windows 操作系统有一种魔力,就是哪怕你用了将近 20 年,还是会有你不知道的快捷键或者快捷操作。这些东西有时候能带来一些惊喜。</p> +<p>具体介绍可以看这里:<a class="link" href="https://www.theverge.com/2023/8/16/23834125/microsoft-windows-task-manager-pause-shortcut" target="_blank" rel="noopener" +>暂停 Windows 任务管理器</a></p> +<h3 id="linux-内核最初版的解析">Linux 内核最初版的解析</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-29-10.png" +width="588" +height="253" +loading="lazy" +class="gallery-image" +data-flex-grow="232" +data-flex-basis="557px" +></p> +<p>最新版本的 Linux 内核,其源码规模已经飙升至 3600 万行,想要深入细节去了解它十分吃力。</p> +<p>而Linux 的第一个版本 v0.01 却非常小巧。</p> +<p>刨去注释和空行的话,也就 8 千来行代码。</p> +<p>这么小的代码结构,足够理解操作系统的精髓。</p> +<p>这篇<a class="link" href="https://seiya.me/blog/reading-linux-v0.01" target="_blank" rel="noopener" +>探索 Linux v0.01 d的内部结构</a>,可以带你像参观历史博物馆那样去见证曾经的 Linux。</p> +<p>我记录了一些有意思的地方:</p> +<p>1、v0.01 只有 66 个系统调用,用于支持文件管理和进程管理,分别是:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">access acct alarm <span class="nb">break</span> brk chdir chmod +</span></span><span class="line"><span class="cl">chown chroot close creat dup dup2 execve +</span></span><span class="line"><span class="cl"><span class="nb">exit</span> fcntl fork fstat ftime getegid geteuid +</span></span><span class="line"><span class="cl">getgid getpgrp setsid getpid getppid +</span></span><span class="line"><span class="cl">getuid gtty ioctl <span class="nb">kill</span> link lock lseek +</span></span><span class="line"><span class="cl">mkdir mknod mount mpx nice open pause +</span></span><span class="line"><span class="cl">phys pipe prof ptrace <span class="nb">read</span> rename rmdir +</span></span><span class="line"><span class="cl">setgid setpgid setuid setup signal stat +</span></span><span class="line"><span class="cl">stime stty sync <span class="nb">time</span> <span class="nb">times</span> <span class="nb">ulimit</span> <span class="nb">umask</span> +</span></span><span class="line"><span class="cl">umount uname unlink ustat utime waitpid write +</span></span></code></pre></td></tr></table> +</div> +</div><p>其中 mount 调用啥也没干,直接返回了。</p> +<p>2、直接写死代码绑定 Intel 386 平台。至今对于 PS/2 接口的键盘、ATA硬盘、VGA显卡等标准硬件的驱动代码还是写死在内核里(而不是放在drivers文件夹)。</p> +<p>3、系统崩溃处理代码只有 5 行:只实现了打印一句“我不行了”,然后进入死循环<code>for(;;);</code>。</p> +<h3 id="llamacpp-是怎样做到的">LLaMa.cpp 是怎样做到的?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-29-37.png" +width="540" +height="531" +loading="lazy" +class="gallery-image" +data-flex-grow="101" +data-flex-basis="244px" +></p> +<p>LLaMa.cpp 是一个令人惊叹的项目,在它之前没有人能够在低端消费设备上成功运行 Meta 开源的人工智能模型 LLaMa ,因为那需要太多的硬件资源。</p> +<p>但是 LLaMa.cpp 的横空出世使得在 M2 Macbook Pro、Android Pixel5 手机甚至树莓派上运行 LLaMa 的 7B 模型成为可能。</p> +<p>这是怎么做到的?</p> +<p>带着这个疑问,有网友深入研究了这个项目,并写下了这篇<a class="link" href="https://finbarr.ca/how-is-llama-cpp-possible/" target="_blank" rel="noopener" +>How is LLaMa.cpp possible?</a>以解释原因。</p> +<p>作者认为主要得益于对模型参数的量化,降低模型参数的精度,从 FLOAT16 减小到 INT4。使得 LLaMa.cpp 能够以较少的计算资源甚至只依赖 CPU 的情况下加载大模型。</p> +<h3 id="逐渐觉得微软比谷歌良心">逐渐觉得微软比谷歌良心</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-30-01.png" +width="690" +height="372" +loading="lazy" +class="gallery-image" +data-flex-grow="185" +data-flex-basis="445px" +></p> +<p>曾经微软是技术黑客的公敌,被不少人视为反对技术创新、技术开放的最大反派。</p> +<p>不过随着时间的推移,以及微软逐渐在开源社区所做出的努力。这一现象有所好转。</p> +<p>近期在 HN 上<a class="link" href="https://old.reddit.com/r/degoogle/comments/15pd5si/today_i_realized_i_now_trust_microsoft_more_than/" target="_blank" rel="noopener" +>有位网友很扭捏地承认:现在他对微软的感觉要比对谷歌好很多</a>。</p> +<p>他列举了一些关于两家公司的对比,包括发布的产品、主观的优劣评价等等。</p> +<p>为了抵制微软,他已经十多年没用 Windows 了,但貌似微软的其他产品“很香”(VS Code、Github、ChatGPT等)。</p> +<p>并表示最近正在寻摸租一个云存储,大概率也会用微软的 onedrive 而不是谷歌的 Google drivers。</p> +<p>对此我也有类似感觉,不过我对谷歌的不信任起始于十年前谷歌将 Google reader 停掉,而自从微软推出 WSL 后,我更是觉得微软在产品上越来越实在了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-31-23.png" +width="690" +height="538" +loading="lazy" +class="gallery-image" +data-flex-grow="128" +data-flex-basis="307px" +></p> +<h2 id="资源">资源</h2> +<h3 id="tailwindcss-的小抄">tailwindcss 的小抄</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-30-29.png" +width="690" +height="465" +loading="lazy" +class="gallery-image" +data-flex-grow="148" +data-flex-basis="356px" +></p> +<p>tailwind 这个 css 框架之所以能够很快流行起来,主要原因就是它解决了一个之前很多人没有太注意的问题,即 CSS 的“正交性”。</p> +<p>之前 CSS 实现一个效果,可以有 N 种方法,外加各种奇技淫巧,但在使用 tailwind 之后,针对特定效果都有了最优实践路径,而且还可以很容易组合。</p> +<p>不过由于它的类分的太细太碎,导致刚开始的时候会有一些不容易记忆。</p> +<p><a class="link" href="https://tailwindcomponents.com/cheatsheet/" target="_blank" rel="noopener" +>这里有一份 tailwind 的小抄</a>,适合初学者收藏,方便随时查阅。</p> +<h3 id="在浏览器中运行的-vim">在浏览器中运行的 vim</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-30-43.png" +width="690" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="204" +data-flex-basis="491px" +></p> +<p><a class="link" href="https://github.com/rhysd/vim.wasm" target="_blank" rel="noopener" +>vim.wasm</a>,在浏览器中运行的 Vim,不是插件。</p> +<p>使用 wasm 技术直接编译移植的 Vim Editor 源码,效果跟原生程序几乎一样。</p> +<p>使用 WebAssembly 给 Vim 提供一个新的 GUI 前端(类似 GVim)。</p> +<p>为了编译通过,作者在源码里禁用了很多 Wasm 不支持的特性,如:fork(2)、PTY 等。</p> +<p>可在这里体验:https://rhysd.github.io/vim.wasm/</p> +<h3 id="无隐私问题的-pdf-工具网站">无隐私问题的 pdf 工具网站</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-32-04.png" +width="690" +height="362" +loading="lazy" +class="gallery-image" +data-flex-grow="190" +data-flex-basis="457px" +></p> +<p><a class="link" href="https://pdftool.org/zh" target="_blank" rel="noopener" +>这个pdf工具可以尝试一下</a>,跟其他pdf 工具网站不同,这个网站借用 WebAssembly 技术将很多工作放在浏览器客户端执行,用户无需上传自己的pdf到网站,即可执行处理工作,包括:加密、解密、拆分、合并等常用功能。 ​​​</p> +<h3 id="深入理解操作系统的小游戏">深入理解操作系统的小游戏</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-32-17.png" +width="690" +height="368" +loading="lazy" +class="gallery-image" +data-flex-grow="187" +data-flex-basis="450px" +></p> +<p><a class="link" href="https://plbrault.com/blog-posts/i-created-the-nerdierst-game-ever-en/" target="_blank" rel="noopener" +>这个自称史上最极客的小游戏</a>,是国外一位计算机科学教授给学生们写的一个小游戏,假设玩家是一个“操作系统”,在游戏里玩家需要不停地进程调度、内存页交换等操作,一旦调度不合理就会激怒用户导致“玩家”也就是操作系统被重启,游戏就 GAME OVER 了。</p> +<p>游戏使用 Python 编写,作者将其编译为 WebAssembly 以嵌入网页,这里可以直接在线体验: <a class="link" href="https://drfreckles42.itch.io/youre-the-os" target="_blank" rel="noopener" +>https://drfreckles42.itch.io/youre-the-os</a>。</p> +<h2 id="观点">观点</h2> +<h3 id="学习技能最有效的练习手段是复刻">学习技能最有效的练习手段是“复刻”</h3> +<p>这是我前两天尝试用 CSS 临时写个页面效果想到的。</p> +<p>我虽然也了解了CSS 语言的一些基本知识,但是在具体实操的时候仍会感到无从下手。</p> +<p>与下棋类似,只知道“规则”但是没有“套路”。</p> +<p>后来干脆找了几个目标页面,按照自己的想法去还原,渐渐能够摸到一些“套路”的边缘,最终实现了自己想要的效果。</p> +<p>于是我想: <strong>在学习一项技能的时候,“复刻”、“抄袭”、“借鉴”、“致敬”,都没有问题,应该把它作为最主要的练习手段。</strong></p> +<p>因为“抄”是最经济的学习方法了。</p> +<p>不仅仅是编程技能,艺术方面更是如此。</p> +<p>比如在编曲学习的时候有一种练习叫“扒带”,就是找一首歌,然后你通过你的工具和技巧制作一份完全一样的作品,尽量做到百分百还原。</p> +<p>很多“大师”都是在这个过程中,遇到问题解决问题,领悟到很多只能意会不能言传的技巧,而这些领悟是无论如何也无法仅仅通过“看”和“听”获得的。</p> +<p>另外,人们练字、绘画也是从临摹开始,一般在熟练之后才能突破,才又自成体系。</p> +<h3 id="忍耐守恒">忍耐守恒</h3> +<p>怕麻烦的人,主要是不能忍受一些事情。</p> +<p>然而正是因为这些不能忍受,所以注定要忍受一些其他的事情。</p> +<p>人生就是这样,比如无法忍受投资带来的风险,就得承受现金贬值;不能面对创业的压力,就得忍受按时上班的束缚。</p> +<p>对于这种现象,我将之称为“忍耐守恒”。 ​​​</p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 045 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/Tue, 15 Aug 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/<h1 id="机器文摘-第-045-期">机器文摘 第 045 期</h1> +<h2 id="长文">长文</h2> +<h3 id="基于浏览器-javascript-堆快照的网页爬虫">基于浏览器 JavaScript 堆快照的网页爬虫</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-23-22.png" +width="690" +height="546" +loading="lazy" +class="gallery-image" +data-flex-grow="126" +data-flex-basis="303px" +></p> +<p><a class="link" href="https://www.adriancooney.ie/blog/web-scraping-via-javascript-heap-snapshots" target="_blank" rel="noopener" +>基于 JavaScript 堆快照的网页爬虫</a>。</p> +<p>本文作者介绍了一个实现网络爬虫的新思路,据称已在生产上使用了一段时间,且效果不错。</p> +<p>比较典型的网络爬虫在爬取数据时,大都采用解析网页 DOM 的方式,或直接通过 HTTP 请求流直接解析,或使用无头浏览器进行解析。</p> +<p>但现在这项技术已经被很多网站、平台人为设置很多障碍,比如增加很多随机的嵌套等等。</p> +<p>作者某天福至心灵,想到一个点子。</p> +<p>利用浏览器提供的 JavaScript 内存堆快照功能,将内存里的全部信息扒下来,然后根据对应的 JavaScript 对象属性,按图索骥去找到真正需要的数据。</p> +<p>这种方法比较狠的地方在于,<strong>直接从后台的数据结构下手,跳过了对页面 DOM 的分析和拆解</strong>,而且据作者说,网站即便想通过混淆此类数据在内存中的属性名称来进行防御,其工作量还是相当大的。</p> +<p>所以,可能短期内无能为力。</p> +<p>作者说,也许全面转为 Web Assembly 才能彻底禁止他这种爬虫。</p> +<p><a class="link" href="https://github.com/adriancooney/puppeteer-heap-snapshot" target="_blank" rel="noopener" +>项目源码在这里</a></p> +<h3 id="intel-cpu-的崩溃攻击漏洞">Intel CPU 的“崩溃攻击”漏洞</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-23-45.png" +width="512" +height="512" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +></p> +<p><a class="link" href="https://downfall.page" target="_blank" rel="noopener" +>intel cpu 有一个崩溃攻击漏洞</a>,标识为 <a class="link" href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-40982" target="_blank" rel="noopener" +>CVE-2022-40982</a>,利用此漏洞可以在虚拟机里窃取共享同一个物理 CPU 的其他虚拟机的数据。</p> +<p>这个漏洞可以让恶意程序在本机运行后窃取如密码、加密密钥、以及个人电子邮件等私人数据。</p> +<p>恶意的云计算客户可以利用 Downfall 漏洞从与其共享同一台云计算机的其他客户那里窃取数据和凭据。</p> +<p>据文章作者(也即漏洞发现者)所说,该漏洞存在于 Intel Core 6 代到 11 代 CPU,并且研究人员发现存在通过 Web 网页浏览进行攻击的可能性。</p> +<p><a class="link" href="https://github.com/flowyroll/downfall/tree/main/POC" target="_blank" rel="noopener" +>作者开放了一部分用于测试攻击的代码在此</a></p> +<h3 id="利用树莓派的-gpio-发射无线信号">利用树莓派的 GPIO 发射无线信号</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-24-15.png" +width="690" +height="388" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></p> +<p><a class="link" href="https://hackaday.com/2021/04/06/fan-tastic-misuse-of-raspberry-pi-gpio/" target="_blank" rel="noopener" +>原来树莓派的 GPIO 还能干这个</a>,这位老哥使用树莓派的 GPIO 接口直接进行无线电波发射(没错,就是随便扯出一根线就可以当作天线了)。实现了基于树莓派的微型电台。</p> +<p>这得益于 <a class="link" href="https://github.com/F5OEO/rpitx" target="_blank" rel="noopener" +>rpitx</a>这个开源项目,项目本来是为了研究和学习一些无线电原理,不过后来逐渐成为一些 SDR 爱好者必不可少的工具了。</p> +<p><a class="link" href="https://www.youtube.com/watch?v=M2JY1_Xmokg&amp;t=8s" target="_blank" rel="noopener" +>我上次看到一个小哥使用 RTL-SDR 录制汽车遥控器信号,然后使用树莓派重复发射出来,成功实现了自家汽车的解锁</a>。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://oimo.io/works/water/" target="_blank" rel="noopener" +>water</a>,一个在网页里模拟流体动画的 Demo,使用 Haxe 语言编写。<a class="link" href="https://github.com/saharan/works/tree/main/water" target="_blank" rel="noopener" +>源码在这里</a> +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-24-42.png" +width="690" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="204" +data-flex-basis="491px" +></p> +<p>Haxe 是一种跨平台的开源编程语言,在其官方网站上称其为&quot;universal language&quot;。</p> +<p>它可以用于开发多种平台(如Web、移动、桌面等)的应用程序。</p> +<p>Haxe 提供了强大的静态类型系统,并支持多种编译目标,包括但不限于 JavaScript、C++、Java、C#、Python 等。</p> +<p>感兴趣的话,这里也有<a class="link" href="https://daobook.github.io/haxe-book/docs/start/00_intro.html" target="_blank" rel="noopener" +>一份 Haxe 的在线教程</a></p> +</li> +<li> +<p><a class="link" href="https://github.com/lllyasviel/Fooocus" target="_blank" rel="noopener" +>Fooocus</a>,ControlNet 作者开源的一款新的 AI 画图工具 ,搭建起来比 Stable Diffusion webui 稍微方便了一点,相当于整合包。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-25-40.png" +width="690" +height="644" +loading="lazy" +class="gallery-image" +data-flex-grow="107" +data-flex-basis="257px" +></p> +</li> +<li> +<p>原来 HTML5 有一个 <code>&lt;progress&gt;&lt;/progress&gt;</code> 标签,直接写这个标签,不加任何属性的话,就是一个加载动画,非常适合在页面里临时需要一个进度、状态展示的时候。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-25-55.png" +width="462" +height="387" +loading="lazy" +class="gallery-image" +data-flex-grow="119" +data-flex-basis="286px" +></p> +</li> +<li> +<p><a class="link" href="https://wangdoc.com/typescript/" target="_blank" rel="noopener" +>阮一峰老师的 Typescript 教程</a>,发布了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-26-13.png" +width="501" +height="800" +loading="lazy" +class="gallery-image" +data-flex-grow="62" +data-flex-basis="150px" +></p> +</li> +</ul> +<p>据老师自己说,刚开始也是抗拒的,觉得TypeScript 就是为 JS 语言添加静态类型系统。如果真需要静态类型,可以考虑使用其他更成熟的语言(比如 Rust 和 Java),再编译成 JS(wasm 模块),何必新学一门语言呢。</p> +<p>但是后来发现 TypeScript 越来越流行,成为前端开发的主流工具,各种项目纷纷移植过去。</p> +<p>我虽然对 TypeScript 仍然持保留态度,但是阮老师写的技术书籍读起来都很轻松易懂,所以觉得还是有必要收藏一下​​​。</p> +<ul> +<li> +<p><a class="link" href="https://islamov.ai/stable-diffusion-webgpu/" target="_blank" rel="noopener" +>stable-diffusion-webgpu</a>,在网页里运行 AI 画图模型。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-26-55.png" +width="1154" +height="667" +loading="lazy" +class="gallery-image" +data-flex-grow="173" +data-flex-basis="415px" +></p> +<p>基于 webgpu 技术,无需部署,直接在网页里运行。我试了一下,在我的 1080 8G 显存的显卡上 ,可以跑动,但是速度一般。</p> +<p>上面的图是我只跑了 8 个 steps 的结果。。。 ​​​</p> +</li> +</ul> +<h2 id="观点">观点</h2> +<h3 id="ai-画图的品质">AI 画图的品质</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-27-30.png" +width="690" +height="690" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +></p> +<p>为了验证之前关于“模特很可能被AI取代”的想法,自己动手部署 <a class="link" href="https://github.com/AUTOMATIC1111/stable-diffusion-webui" target="_blank" rel="noopener" +>Stable Diffusion webui </a> 测试了一些模型。根据网友分享的提示词尝试生成了一些图片。</p> +<p>感觉效果比我几个月之前体验时又有了不少提升,配合各种微调模型和 LoRA 模型可以生成照片质感和光影的图片。</p> +<p>虽然人物表情和姿态还有些僵硬,不过我相信这是我没有合理调整各个参数以及充分发挥插件性能导致。</p> +<p>多进行尝试和练习,应该能够生成更逼真、自然的照片。</p> +<h3 id="信息的维度">信息的维度</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-28-20.png" +width="690" +height="690" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +> +最近看了一些线性代数相关的知识,在向量、矩阵的各种计算中逐渐有了一些感悟:</p> +<p>古代“老子”思想中的“道”很可能是无限维的,你的任何表达都是对它的一种投影,也就是降维了。所以才是“道可道,非常道”。</p> +<p>每个人都想用最简单的框架去理解世界,将多维的信息硬生生地将为一维。</p> +<p>这样的后果便是,盲人摸象、管中窥豹、一叶障目,不同的观点争得不可开交。</p> +<p>所以在接收时也应该尽量按自己掌握的其它维度进行升维还原,任何信息都不可孤立看待。</p> +<p>如果能从多维信息得视角去认知世界,也许会有转机,这多少就有点儿“阴阳互生、一分为三”的意思了。</p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 044 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/Tue, 08 Aug 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/<h1 id="机器文摘-第-044-期">机器文摘 第 044 期</h1> +<h2 id="长文">长文</h2> +<h3 id="导致-python-多线程鸡肋的-gil-是什么">导致 Python 多线程鸡肋的 GIL 是什么</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-51-26.png" +width="690" +height="839" +loading="lazy" +class="gallery-image" +data-flex-grow="82" +data-flex-basis="197px" +> +近期在使用 Python 多线程的时候,遇到了 GIL 全局锁导致的性能问题。</p> +<p>具体来说就是性能提升没有达到预期,对于有些计算任务无法并行执行。</p> +<p>从多核 CPU 占用结果上来看,像极了网上那张经典的围观图,一核干活多核围观。</p> +<p>于是翻阅了相关资料研究一下,发现这是 Python 社区争论多年的问题,而且有很大的历史包袱。</p> +<p>严格来说,GIL 全局锁导致的性能问题与 Python 编程语言没有关系,导致这个问题的原因在于具体实现的 CPython 解释器。</p> +<p>当年解释器开发者为了简单实现对多线程的支持,搞了一个全局锁,以至于在多核时代无法充分发挥 CPU 性能。</p> +<p>而后续又有很多库延续了这项依赖,历史的包袱(屎山?)越来越重,很难下定决心将之移除(据说代价甚至比当年从 Python2.x 迁移到 Python3 还要大)。</p> +<p>如果不想深究具体技术细节只想了解基本的来龙去脉,这里有篇文章<a class="link" href="https://xie.infoq.cn/article/1e151c24367abe8cad18130f4" target="_blank" rel="noopener" +>为什么 GIL 让多线程变得如此鸡肋?</a>介绍了 Python PIL 的产生背景以及适用于 Python 多线程的业务场景,可以给你的技术决策提供参考。</p> +<p>不过好消息是,就在刚刚(前几天),Python 官方终于宣布要动手取消掉 GIL 了,顿时网上一片沸腾(其实只有一部分人,大多数人都还不知道 PIL 是什么玩意儿)。而且,<a class="link" href="https://news.ycombinator.com/item?id=36643670" target="_blank" rel="noopener" +>Meta 也承诺,愿意出工出力(3人年)帮助 Python 社区做针对去除 GIL 的相关开发工作</a>。</p> +<h3 id="用树莓派做一个属于自己的高级收音机">用树莓派做一个属于自己的高级收音机</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-52-14.png" +width="606" +height="454" +loading="lazy" +class="gallery-image" +data-flex-grow="133" +data-flex-basis="320px" +> +最近接触到 SDR (软件定义无线电)这个领域,感觉挺有意思的。</p> +<p>软件定义无线电是一种无线通信技术,它利用软件来实现无线电通信系统中的信号处理和调制解调功能,而不是传统的硬件电路。</p> +<p>通过软件定义无线电技术,可以实现灵活、可配置和可重用的无线通信系统,大大提高了无线通信的灵活性和性能。</p> +<p>传统的无线电通信系统通常使用硬件电路来执行信号处理、调制解调和频谱管理等功能。这些硬件电路通常是固定的,不能轻易更改,因此限制了通信系统的灵活性和可配置性。</p> +<p>而SDR技术通过将信号处理和调制解调等功能以软件方式实现,可以在通信系统中使用可编程的处理器和通用硬件,从而使得通信系统的功能可以在软件层面上重新配置和调整,而不需要更改硬件设计。</p> +<p>比起灵活性和可配置性来说,我觉得 SDR 最大的优势是成本大大降低。之前必须购买昂贵的硬件才能实现的效果,现在能够通过便宜的、少量的硬件加上软件模拟即可。</p> +<p>我近期就以很低廉的价格购买了一套 SDR 设备,通过 USB 接口连接计算机,可以实现 500KHz到1700MHz频率范围的接收。听 FM 和航空频段不在话下,SW 短波的话受天线影响,我暂时没有调试出好的效果。</p> +<p>跟 SDR 相比,我几千块买的旗舰手台显得既昂贵又功能弱。</p> +<p><a class="link" href="https://www.hackster.io/mircemk/diy-sdr-dsp-radio-with-raspberry-pi-and-rtlsdr-dongle-c38064" target="_blank" rel="noopener" +>这里有篇文章</a>是作者自己动手用 SDR 设备结合树莓派制作了一个看起来还挺专业的宽频无线接收机。</p> +<p>其实这跟音乐制作领域内很多乐器、效果器逐渐被虚拟化的软件、插件代替是一样的。软件虚拟化拥有巨大的优势,随着通用计算硬件的成本越来越低廉,一切能被软件定义的最终都会被软件定义。</p> +<h3 id="家用-wifi-路由器需要选择哪个信道">家用 WiFi 路由器需要选择哪个“信道”</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-52-42.png" +width="601" +height="373" +loading="lazy" +class="gallery-image" +data-flex-grow="161" +data-flex-basis="386px" +> +近期验证了一个关于无线路由器的传说。</p> +<p>起因是我新买了一个树莓派 ZeroW 带无线版本,没想到板载的 WiFi 网卡天线太弱了。</p> +<p>离路由器稍微远一点,比如放到卧室,传输速率就会大幅下降,我又暂时没能找到合适的外接网卡,一度陷入绝望。</p> +<p>后来灵机一动,看看能不能从路由器那头想想办法,于是打开路由器配置页面,找到了 WiFi 的“信道”设置,将之从“自动”调到了最不常用的“13”。</p> +<p>这里补充一下,WiFi信道一般从1到13,由路由器自动选择,但现在无线环境十分混乱,尤其是 2.4G(树莓派 Zero W 只能连这个规格) 频段,干扰很严重。</p> +<p>但是 13 这个信道很少被路由器自动选用,原因是最初制定标准的时候,不是所有国家和地区都支持,也不是所有终端设备都支持,所以这个信道就成了最不常用的。</p> +<p>在我手动指定信道之后,惊喜地发现,树莓派放在同样的位置,传输速率得到了较大提升并且稳定。看来传说将路由器 2.4G 信道设为 13 可以防干扰是真实的。</p> +<p><a class="link" href="https://zhuanlan.zhihu.com/p/344389009" target="_blank" rel="noopener" +>什么是路由器的信道?信道设置成什么最合理?</a></p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://roadmap.sh" target="_blank" rel="noopener" +>开发人员路线图</a> 是一个学习索引网站,旨在创建路线图、指南和其他教育内容,以帮助开发人员选择学习路径。在 Github 所有仓库中 Stars 排名第七。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-53-03.png" +width="690" +height="490" +loading="lazy" +class="gallery-image" +data-flex-grow="140" +data-flex-basis="337px" +></li> +<li><a class="link" href="https://felixkreuk.github.io/audiogen/" target="_blank" rel="noopener" +>AudioGen</a> facebook 开源的声音合成模型,可以根据文字描述生成对应的声音。效果已经很惊人了,这个页面展示了很多样例。我听了一下,觉得以后影视作品里的一部分声音特效应该可以通过 AI 进行生成了。至少像一些嘈杂的人群、婴儿哭声、鸟叫等各种背景音是可以合成的。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-53-14.png" +width="499" +height="270" +loading="lazy" +class="gallery-image" +data-flex-grow="184" +data-flex-basis="443px" +></li> +<li>原来 Chrome 和 Edge 浏览器的 DevTools 里自带了 CSS 动画曲线编辑器啊!可以直接通过鼠标拖动进行调整和预览,十分便捷。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-53-29.png" +width="562" +height="528" +loading="lazy" +class="gallery-image" +data-flex-grow="106" +data-flex-basis="255px" +></li> +<li><a class="link" href="https://github.com/GraphiteEditor/Graphite" target="_blank" rel="noopener" +>Graphite</a>,一个开源的 2D 矢量图形编辑器,适用于照片编辑、图像处理、图形设计、插图、数据可视化、数字绘画等领域。可以实现项目图稿,数据可视化和自动化。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-54-19.png" +width="830" +height="465" +loading="lazy" +class="gallery-image" +data-flex-grow="178" +data-flex-basis="428px" +></li> +</ul> +<h2 id="观点">观点</h2> +<h3 id="获取高品质信息的需求仍然强烈只是被淹没了">获取高品质信息的需求仍然强烈,只是被淹没了</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-54-40.png" +width="367" +height="372" +loading="lazy" +class="gallery-image" +data-flex-grow="98" +data-flex-basis="236px" +> +三十几年前,电视逐渐取代书籍、报纸等传统媒体的年代,尼尔波兹曼写下了《娱乐至死》。</p> +<p>作者认为:过度追求娱乐和娱乐化的信息传播方式可能导致公众思考能力的下降。</p> +<p>然而这么多年过去了,人们在降低信息质量这条路上越走越远。电视也早已沦为老年人卧床的伴侣,电视节目更是无法占据现代人的时间,取而代之的是手机短视频。</p> +<p>短视频已经成为大部分人闲暇消遣、信息获取的主要方式。这种媒体的变化将进一步降低理解和感受深度信息的能力,使人对深入学习和思考失去兴趣。</p> +<p>虽然获取的信息看似在增多,但现在高质量的信息却越来越少。</p> +<p>短视频等碎片化信息给我的感觉就像是无线电信号的背景噪音,现在的信息“电磁环境”早已被这种噪音充斥。因为“背景噪音”太大,就好像在高楼林立的城市里打开无线电,接收到的全是 LED 路灯和电动车充电器产生的噪波。</p> +<p>不过我还是相信会有包括我在内的相当一部分人,不愿放弃主动思考,不屑于接收低品质信息。</p> +<p>我正在努力做出一些尝试,以后逐渐记录下来:</p> +<ol> +<li>降低输入:减少刷碎片信息的时间;</li> +<li>滤波:使用搜索引擎、RSS服务、newsletter邮件等工具进行整理;</li> +<li>溯源:尽量选择信息源头获取一手信息,对于技术来说,直接阅读英文文档是一个办法;</li> +<li>创造:自己制作高质量内容;</li> +</ol> +<h3 id="摄影师不会被-ai-取代但是模特很可能会">摄影师不会被 AI 取代,但是模特很可能会</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-56-00.png" +width="664" +height="427" +loading="lazy" +class="gallery-image" +data-flex-grow="155" +data-flex-basis="373px" +> +即便以后 AI 绘画能够产出更加难以分辨真假的作品。</p> +<p>从目前能看到的各种生成作品来说,还是摄影师负责了主要的创作灵感。</p> +<p>真要说被取代的话,也许“被拍摄对象”经过虚拟化以后,很可能被取代。</p> +<p>以后不仅仅是举着相机的叫摄影师,说不定会诞生面向 AI 摄影这一职业。</p> +<p>到时候器材党玩的不再是镜头,改玩显卡了?</p> +<p>“嘿,你这 N 卡 比我这 A 卡有德味儿,毒!”</p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 043 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/Tue, 01 Aug 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/<h1 id="机器文摘-第-043-期">机器文摘 第 043 期</h1> +<h2 id="长文">长文</h2> +<h3 id="先做框架再做功能">先做框架再做功能</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-13-57-56.png" +width="690" +height="395" +loading="lazy" +class="gallery-image" +data-flex-grow="174" +data-flex-basis="419px" +> +<a class="link" href="https://devblogs.microsoft.com/oldnewthing/20230725-00/?p=108482" target="_blank" rel="noopener" +>Before you try to do something, make sure you can do nothing.</a></p> +<p>看到这句话第一反应是:这是什么 XX 逻辑?看完作者的文字之后,哦,这是一种软件构建的方法。</p> +<p>意思是说,先宏观再微观,先整体再局部,别一上来就陷入到细节代码的编写中去。</p> +<p>先把框架搭好,具体功能一个也别着急实现,留着占位,先搭一个“什么都不干”的架子,然后再逐渐补充功能。</p> +<p>但也不是真的什么都不干,而是理清了各个关键组件的调用关系以及与开发相关的辅助功能(如打印调试信息)。</p> +<p>这样做最大的好处是,随着功能开发的深入,代码不至于失控,而且具有良好的可调试性和组件问题隔离能力。</p> +<p>随之而来的就是轻松写代码,而不是眉毛胡子一把抓。</p> +<h3 id="神经网络从开始到现在">神经网络从开始到现在</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-13-58-59.png" +width="690" +height="513" +loading="lazy" +class="gallery-image" +data-flex-grow="134" +data-flex-basis="322px" +> +<a class="link" href="https://s3tlxskbq3.feishu.cn/docx/NyPqdCKraoXz9gxNVCfcIFdnnAc" target="_blank" rel="noopener" +>The Document is All You Need!</a></p> +<p>一篇 AI 科普好文章,用较为通俗的语言讲解了神经网络模型原理和发展历程(我感觉有些像生物的进化)。</p> +<p>从最初的由神经元组成的多层感知机开始,然后进化到卷积神经网络 CNN 降低网络复杂度,再进化, RNN 循环神经网络给模型增加记忆能力,记忆能力太强也不行,到了 LSTM 开始让它能够遗忘,再到后面的 注意力机制以及 LLM 语言模型。</p> +<p>比起同类文章,这一篇尽量避免了数学概念的推导和论证,尽量在不看公式的情况下解释基本思路,适合我等小白学习。</p> +<h3 id="代码审查的一些建议">代码审查的一些建议</h3> +<p><a class="link" href="https://codelantis.com/blog/code-reviews-best-practices" target="_blank" rel="noopener" +>5个关于代码审查的最佳实践</a>,文章记录一些了对代码审查的实践建议,嫌长不看我总结如下:</p> +<ol> +<li>一次只审查一个功能特性或者错误修复。</li> +<li>提前准备好背景交代(在审查之前写清楚这么做的原因和基本思路)。</li> +<li>利用自动化工具提前做好静态检查,提前统一风格、规范。</li> +<li>利用提问的方式提出改进建议而不是直接喷,如:“我们真的需要这个断言吗?”</li> +<li>仔细阅读代码,慢慢来,以充分理解。</li> +</ol> +<h2 id="资源">资源</h2> +<ul> +<li> +<p>微软的 <a class="link" href="https://learn.microsoft.com/en-us/sysinternals/downloads/zoomit" target="_blank" rel="noopener" +>ZoomIT</a> 真是个经典工具,已经默默维护了好多年了,现在版本为7.0。体积小巧才1MB多点儿,绿色免安装,下载解压即用。非常适合进行共享屏幕培训讲解,或者录制教学视频。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-13-59-57.png" +width="669" +height="465" +loading="lazy" +class="gallery-image" +data-flex-grow="143" +data-flex-basis="345px" +> +ZoomIT 快捷键如下: +Ctrl+1:放大屏幕,屏幕静止,然后使用鼠标批注; +Ctrl+2:使用鼠标随意绘制批注,支持 r、g、b、o 等快捷键切换颜色; +Ctrl+3:显示 BreakTime 倒计时; +Ctrl+4:放大屏幕,屏幕继续支持鼠标交互操作,用于放大操作过程; +Ctrl+5:录制屏幕,可与前面几个功能结合使用;</p> +</li> +<li> +<p><a class="link" href="https://github.com/kamranahmedse/driver.js" target="_blank" rel="noopener" +>driver.js</a> 一个压缩后只有 5K 大小的前端库,可以让你的网站或者 Webapp 迅速集成交互式“使用指南”的能力。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-14-00-27.png" +width="690" +height="361" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="458px" +></p> +</li> +<li> +<p><a class="link" href="https://clangjs.netlify.app" target="_blank" rel="noopener" +>clangjs</a> 一个在浏览器编译、链接、运行 C/C++ 代码的 JS 库。支持 C/C++ 标准库。完全在本地编译,无需网络即可工作。原理: +首先把 Clang 和 LLD 编译为 WebAssembly 使其运行在浏览器中。然后使用 WebAssembly 版本 Clang 把 C/C++ 代码编译为 WebAssembly,最后通过浏览器 API 运行 WebAssembly。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-14-00-43.png" +width="690" +height="292" +loading="lazy" +class="gallery-image" +data-flex-grow="236" +data-flex-basis="567px" +> +<a class="link" href="https://github.com/luoxuhai/clang.js" target="_blank" rel="noopener" +>附:clangjs源码</a></p> +</li> +<li> +<p><a class="link" href="https://github.com/bartobri/no-more-secrets" target="_blank" rel="noopener" +>nms</a>,一个控制台程序,可以将任意命令的输出(ANSI TXT)文本转换成为乱码以达到防偷窥和加密的效果。通过命令管道使用:<code>ls -l | nms</code> ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-14-00-57.png" +width="690" +height="236" +loading="lazy" +class="gallery-image" +data-flex-grow="292" +data-flex-basis="701px" +></p> +</li> +<li> +<p><a class="link" href="https://iconbuddy.app" target="_blank" rel="noopener" +>Icon Buddy</a>,这个网站有超过 1 百万个免费 svg 图标,可在线自定义颜色。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-14-01-15.png" +width="690" +height="420" +loading="lazy" +class="gallery-image" +data-flex-grow="164" +data-flex-basis="394px" +></p> +</li> +</ul> +<h2 id="观点">观点</h2> +<ul> +<li>无法眼神交流不是导致远程办公沟通的最大障碍,语音延迟才是: +<ul> +<li>我之前一直以为远程办公给沟通带来最大的最大障碍是无法眼神交流导致的信息失真,想象着可以通过升级摄像头(比如嵌入在屏幕中)来改善这一情况。</li> +<li>但进行无数次网络会议之后,我体会到了最大的障碍还不是无法眼神交流,而是网络通信带来的(几乎是必然的)严重的语音延迟。</li> +<li>人们对声音延迟的感知和容忍限度大约在10毫秒(现在的电脑声卡在使用 ASIO 驱动之后可以轻松做到本地延迟 8到6毫秒左右,所以可以用于实时录音),大于10毫秒的延迟会带来明显的迟钝感,时间再长一些就会对对话的节奏带来严重影响。(如果体会不到的话,可以回忆一下新闻直播间主持人跟现场记者连线时那种说话总是对不上节奏的尴尬。)</li> +<li>什么时候网络视频会议的延时能缩短到10毫秒以内(唱卡拉OK可以接受的最低延迟),远程办公才能迎来质的飞跃,否则网络视频会议对于工作讨论永远都是隔靴搔痒、效率低下。现在的解决方案普遍还在吹能做到一秒(1000毫秒)以内,任重而道远。 ​​​</li> +</ul> +</li> +<li>现在真正的程序员用什么编辑器 ? +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-14-01-47.png" +width="690" +height="645" +loading="lazy" +class="gallery-image" +data-flex-grow="106" +data-flex-basis="256px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 042 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/Tue, 25 Jul 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/<h1 id="机器文摘-第-042-期">机器文摘 第 042 期</h1> +<h2 id="长文">长文</h2> +<h3 id="从-cpu-到操作系统">从 CPU 到操作系统</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-57-14.png" +width="665" +height="261" +loading="lazy" +class="gallery-image" +data-flex-grow="254" +data-flex-basis="611px" +> +整天使用电脑和手机却对它的工作原理一知半解?<a class="link" href="https://cpu.land" target="_blank" rel="noopener" +>把你搁 CPU 里</a>是一套不错的科普文章,作者保证你无论是否了解 CPU 的运作方式,读完之后都会有所收获。我原本以为主要讲解 CPU 组成原理,在浏览了一遍之后,发现 CPU 只是引子,后面还讲了很多操作系统相关的知识,很值得一看。 ​​​</p> +<h3 id="基于-gpu-渲染的-ui-界面制作">基于 GPU 渲染的 UI 界面制作</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-57-33.png" +width="690" +height="412" +loading="lazy" +class="gallery-image" +data-flex-grow="167" +data-flex-basis="401px" +> +<a class="link" href="https://hasen.substack.com/p/gpu-gui-table-of-contents" target="_blank" rel="noopener" +>基于 GPU 渲染的 UI 界面制作</a>,也是一个系列文章,探讨了使用 GPU 渲染用户界面的一些思路和相关技术实现方法。用 GPU 绘制用户界面不是什么新鲜事,事实上现在大部分游戏的 UI 都是基于 GPU 渲染的,不过这个作者讲的比较深入浅出,对基础介绍的比较多,适合我这种业外人士,读起来通俗易懂。</p> +<h3 id="为什么我们更应该使用-display-port-而不是-hdmi-">为什么我们更应该使用 Display port 而不是 HDMI ?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-58-12.png" +width="790" +height="479" +loading="lazy" +class="gallery-image" +data-flex-grow="164" +data-flex-basis="395px" +> +<a class="link" href="https://hackaday.com/2023/07/11/displayport-a-better-video-interface/" target="_blank" rel="noopener" +>为什么我们更应该使用 Display port 而不是 HDMI?</a>,简单来说,HDMI 是家电行业制定的接口标准,封闭而保守,Display port 是 PC 行业制定的标准,开放又激进。现在的显卡上一般提供一个 HDMI 接口,仅仅是为了兼容而做出的妥协,不提供多个是因为 HDMI 授权收费。</p> +<h3 id="txt-纯文本才是王道">txt 纯文本才是王道</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-58-45.png" +width="690" +height="220" +loading="lazy" +class="gallery-image" +data-flex-grow="313" +data-flex-basis="752px" +> +喜欢老式合成器的操作方式,不用图形和触摸屏,而是用文本和字符进行交互,可以快速选择音色参数,指哪儿打哪儿,心中有数。</p> +<p>喜欢在控制台的黑窗口通过命令行跟计算机交互,而不是用鼠标在图形界面上点击,不用将鼻子凑在屏幕上,闭上眼睛也能做到精确操作。</p> +<p>喜欢单反相机的肩屏,无论我用什么姿势拨动拨杆、拨轮,肩屏总能用字符给我最快速最准确的响应,告诉我现在的曝光三参数是多少,做到心中有数。</p> +<p>喜欢用 Markdown 文本格式记录信息,只因为文本格式最干净纯粹,利于保存和传播。</p> +<p>这篇<a class="link" href="https://graydon2.dreamwidth.org/193447.html" target="_blank" rel="noopener" +>《txt纯文本才是王道》</a>的作者表达了跟我同样的喜好,对于使用纯文本保存信息偏爱有加,认为无论是视频、图片还是其他数字形式,在文字面前都是弱小的弟弟。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/FlagAlpha/Llama2-Chinese" target="_blank" rel="noopener" +>Llama2-Chinese</a>,Llama2中文社区!是一个专注于Llama2模型在中文方面的优化和上层建设的高级技术社区。 <em>基于大规模中文数据,从预训练开始对Llama2模型进行中文能力的持续迭代升级</em>。Facebook近期开源的 Llama 2 模型比较火,号称可以免费商用。我试了一下,效果不如预期,跟 ChatGPT 3.5 比起来还有距离。可能我使用的中文微调 Lora 参数还不够好吧。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-59-02.png" +width="690" +height="182" +loading="lazy" +class="gallery-image" +data-flex-grow="379" +data-flex-basis="909px" +></li> +<li><a class="link" href="https://githubunwrapped.com" target="_blank" rel="noopener" +>githubunwrapped</a>是一个帮你统计 Github 信息的网站,可以将输入的 Github 账号相关的统计信息生成一段漂亮的动画,展示你使用最多的编程语言、哪天提交的最积极、哪个时段工作效率高(根据文件修改时间?)等。比较有趣的是,这个网站生成动画视频的技术来自一个叫做 <a class="link" href="https://remotion.dev" target="_blank" rel="noopener" +>remotion</a>的库,它可以使用 React 组件式风格编写动画效果,并通过 Canvas 实现视频文件的渲染。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-59-18.png" +width="690" +height="455" +loading="lazy" +class="gallery-image" +data-flex-grow="151" +data-flex-basis="363px" +></li> +<li><a class="link" href="https://github.com/jesseduffield/lazydocker" target="_blank" rel="noopener" +>lazydocker</a>,继发现 lazygit 和 lazyvim 两个神器之后,我又发现了 lazy 家族新成员:lazydocker!同样是提供终端命令行下的“gui”界面,不过操作对象是 docker 这下管理容器终于可以不再看错乱的 docker 命令输出了。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-59-28.png" +width="690" +height="397" +loading="lazy" +class="gallery-image" +data-flex-grow="173" +data-flex-basis="417px" +></li> +</ul> +<h2 id="观点">观点</h2> +<ul> +<li> +<p>关于产品需求的来源:</p> +<p>对于提供IT相关服务的从业人员来说,无论是在企业还是个人做独立产品,把握好产品的需求、做好产品定义是最关键的事情,是后续做研发、运营的基础。</p> +<p>而好的产品定义=自己想做+自己能做+用户想用+愿意付费。</p> +<p>这样的定义应该怎样去发现?</p> +<p>拿软件举例,大部分软件能给用户提供的最大价值是“将一些事情自动化”和“将一些物理实体虚拟化”。前者能够通过自动化实现工作效率的指数级提升,后者则通过对物理现实虚拟化实现用户对交互体验的指数级提升。</p> +<p>所以在分析产品需求进行产品定义时可以从身边三个方面入手:</p> +<ol> +<li>还有什么事情可以被计算机自动化?</li> +<li>还有哪些物理实体可以被虚拟化?</li> +<li>市场上的现有产品,还有哪些可以从上面两个维度提升以增强体验的?</li> +</ol> +<p>我发现,无论是企业的产品,还是个人的独立产品,都可以从这些维度进行分析。</p> +</li> +<li> +<p>基于互联网通道的“业余无线电”:</p> +<p>不是很理解热衷于用互联网通道进行业余无线电通联的心态。</p> +<p>今天刚知道现在有一些业余无线电爱好者使用一种叫做 mmdvm 的盒子(热点盒子)进行自主搭建数字中继。</p> +<p>原理是“热点盒子”用家里的wifi接入互联网,然后热点盒子给业余无线电台提供UV频段的发射接收中继,这样就能轻易通联全国甚至全球的爱好者。</p> +<p>目前很多拥有支持数字通信的电台的爱好者都很积极地参与这种通联,甚至每周还有打卡点名活动。</p> +<p>我暂时还不是很理解这种心态。这种依赖互联网进行的通联在我看来(也许是暂时的)早已失去了玩无线电的初衷。如果我想要通过互联网假装进行呼叫,还得依靠家里的无线路由器,那我为什么不干脆使用微信电话?</p> +</li> +<li> +<p>无头系统: +今天才知道原来我给自己配的远程开发环境有个专业术语叫做 <a class="link" href="https://zh.wikipedia.org/zh-cn/%e6%97%a0%e5%a4%b4%e8%ae%a1%e7%ae%97%e6%9c%ba" target="_blank" rel="noopener" +>“Headless 无头系统”</a> 啊。我现在基本上可以做到带着笔记本随意移动,开发环境都在远程,在各处体验环境都一样。主要使用: Win10 + WSL2 + Nvidia-Docker + VS Code + Neovim。有时会启用远程桌面 RDP,有时直接 ssh + tmux。有兴趣的话我挑一期详解。</p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 041 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/Wed, 19 Jul 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/<h1 id="机器文摘-第-041-期">机器文摘 第 041 期</h1> +<h2 id="长文">长文</h2> +<h3 id="c-也能一次编译到处运行了">C 也能一次编译到处运行了?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-28-30.png" +width="743" +height="446" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="399px" +> +用 C 编写的程序,只编译一次,生成的可执行文件能同时在多个平台运行吗?</p> +<p>这在以往是 java 这类依赖虚拟机执行环境的语言宣称的事情。</p> +<p>然而我今天才听说还有这个神奇的库(好久没关注过c++领域的技术了):<a class="link" href="https://github.com/jart/cosmopolitan" target="_blank" rel="noopener" +>Cosmopolitan</a>Libc 号称可以使 C 成为一种构建一次就能到处运行的语言,就像Java一样,除了它不需要解释器或虚拟机。相反,它重新配置了GCC和Clang,以输出POSIX批准的多语言格式,该格式在Linux + Mac + Windows + FreeBSD + OpenBSD + NetBSD + BIOS上本地运行,具有最佳的性能和最小的占用空间。</p> +<p>在使用的时候需要引入特殊的库和编译配置,具体执行效果我还没有测试。</p> +<p>然后,<a class="link" href="https://ahgamut.github.io/2023/07/13/patching-gcc-cosmo/" target="_blank" rel="noopener" +>这篇文章</a>的作者干脆来个更方便的操作,他给 GCC 打了大约 2000 行的补丁,使得 GCC 直接就嵌入了 Cosmopolitan 库,现在可以在不修改任何源代码(前提是得用纯 C 写)的情况下构建出到处都能运行可执行文件了(Windows也可以吗?我要测试)。</p> +<h3 id="业余无线电入坑指南">业余无线电入坑指南</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-29-07.png" +width="690" +height="920" +loading="lazy" +class="gallery-image" +data-flex-grow="75" +data-flex-basis="180px" +> +业余无线电跟摄影、HiFi音响这一类的爱好在某种维度上非常相似,在“入坑”的境界上,甚至完全一样。</p> +<p>这里的坑,指需要投入大量精力和资金。</p> +<p>之所以这么说,是因为它们都有一个共同的特点。</p> +<p>即围绕这些爱好有大量的知识可以学习和探索。</p> +<p>比如拿业余无线电来说,上来就一堆“亚音”、“中继”、“频段”、“频差”、“杂散发射”等名词,对标摄影中的“构图”、“光圈”、“快门”、“ISO感光度”等名词。新手若想有所体会,单是这些概念就够琢磨几天的。更不用提后续还有逐渐步入玄学的一些操作流派,乃至一个不留神还会陷入无穷尽的装备升级竞赛。</p> +<p>这类知识对于好奇心强烈、喜欢求知的人来说有着巨大的吸引力。甚至直白的说,我们很可能不是爱好这项技能,而是单纯喜欢探索和求知的过程,喜欢那种获得感。</p> +<p>这篇<a class="link" href="https://zhuanlan.zhihu.com/p/585518350" target="_blank" rel="noopener" +>《业余无线电新手指南》</a>可以普及一些基本知识,愿意入坑的请阅读。</p> +<p><em>我近期已考取了中国无线电协会的业余无线电操作能力 A 证</em> 算是合法的 <a class="link" href="https://baike.baidu.com/item/%E6%97%A0%E7%BA%BF%E7%94%B5%E7%88%B1%E5%A5%BD%E8%80%85/6509242" target="_blank" rel="noopener" +>HAM 火腿</a>了。</p> +<h3 id="远程办公还能成为趋势吗">远程办公还能成为趋势吗?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-29-47.png" +width="799" +height="414" +loading="lazy" +class="gallery-image" +data-flex-grow="192" +data-flex-basis="463px" +> +疫情的时候,远程办公、异地协同等概念一度变得很火爆,当时很多人觉得这又是一个风口。</p> +<p>但随着当时极端环境的消失,各大公司又纷纷将员工从居家办公中召回。</p> +<p>那么?此类与远程协作相关的概念破灭了吗?</p> +<p>各种协同工具、平台相关的市场,还有没有继续扩大的可能,或者说还在等待一个巨大的技术革新来引爆?</p> +<p>这里有个项目,<a class="link" href="https://github.com/LinuxSuRen/remote-jobs-in-china" target="_blank" rel="noopener" +>积极收集远程办公相关的信息</a>,包括国内支持的公司清单、工具及使用资料等。</p> +<h3 id="怎样做出伟大的成就">怎样做出伟大的成就?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-30-40.png" +width="636" +height="422" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="361px" +> +昨日读了保罗格雷厄姆(《黑客与画家》的作者)新文章一篇&mdash;-<a class="link" href="http://paulgraham.com/greatwork.html" target="_blank" rel="noopener" +>《怎样做出伟大的成就》</a>(实际上我觉得可以译为“怎样牛逼”)。</p> +<p>虽然标题看起来略有鸡汤味儿,但读起来还是比较实惠的。</p> +<p>文章从发现和选择要做的事情开始,谈论了一些具体的方法。然后展开讨论了在方法执行过程中可能会遇到的一些问题,以及如何克服。甚至介绍了一些心理暗示技巧。</p> +<p>文章比较长,我个人体会比较深的点如下:</p> +<ol> +<li>一个人做什么才能牛逼?答:做自己天赋里有的东西,就是找一些你既有能力又非常感兴趣的事情。</li> +<li>要养成“自驱”的习惯。让“工作”来源于自己的认知,而不是别人告诉你、让你做的事情。主动,而不是等待。</li> +<li>拥有一个属于自己的“项目”是一个找到“自驱”的最佳方法。不断观察自己对什么有强烈的好奇心(甚至好奇到大多数人不能理解)可以找到这样的“项目”。</li> +<li>选定要做的“项目”还应遵循兴奋原则,即:做自己愿意用的产品,写自己想读的故事,而不是执着于满足想象中的不存在的复杂需求。</li> +<li>注重积累效应,日拱一卒、长期积累,每天写一篇文字,一年下来就是一本书。</li> +<li>周期性审视自己做的事情,确认它是否偏离了目标(在做自己最想做的事情),及时修正。</li> +<li>行动的重要性,很多人实际上可以更牛逼,但是因为“谦虚”和“恐惧”导致的拖延使得计划一再搁浅,浪费了时间。</li> +</ol> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="http://t.cn/A60wPLwI" target="_blank" rel="noopener" +>jabbr.ai</a>是一个针对拳击比赛的打击判定进行训练的AI模型,可以在智能手机上运行,实时监测视频中拳击选手的打击得分情况,即时进行统计,多个智能手机多视角同时运行可以快速生成总结性视频。模型提供约50种监测参数(质量、步法、压力等)可用于运动员训练分析。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-31-11.png" +width="908" +height="509" +loading="lazy" +class="gallery-image" +data-flex-grow="178" +data-flex-basis="428px" +></li> +<li>浏览器地址栏快捷操作,我今天才知道原来浏览器地址栏还有这些快捷操作(火狐浏览器支持的最多,我测试的Edge浏览器也支持部分操作): +<ol> +<li>输入*星号,可以搜索你的收藏夹;</li> +<li>输入^,可以搜索历史浏览记录;</li> +<li>输入%,可以搜索当前打开的tab页;</li> +<li>输入?,可以显示所有搜索建议; ​​​</li> +</ol> +</li> +<li><a class="link" href="https://video.weibo.com/show?fid=1034:4923133602234429" target="_blank" rel="noopener" +>树莓磁带</a> 一种用树莓派做的小硬件,为了支持在老式电脑中加载程序(之前用磁带存储的那种)。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-31-40.png" +width="607" +height="378" +loading="lazy" +class="gallery-image" +data-flex-grow="160" +data-flex-basis="385px" +></li> +<li>两招教你“永久”关闭 Windows 自动更新(任选一个都可以): +<ol> +<li>通过执行代码的方式:<code>reg add “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings” /v FlightSettingsMaxPauseDays /t reg_dword /d 10000 /f</code> Win+R 打开「运行」对话框,输入 <code>cmd</code> 后按下 <code>Ctrl+Shift+Enter</code>,在弹出来的命令行窗口中输入上面的代码,并敲击回车。命令里的 10000 代表停止更新的天数。</li> +<li>手动把电脑时钟日期改成 2050 年(为了防止时间自动校准,可以暂时断开网络),然后在 Windows 更新设置界面里面点击“延迟更新”,完成设置后再把电脑时间调回来就行了。</li> +</ol> +</li> +<li><a class="link" href="https://pkg-size.dev/" target="_blank" rel="noopener" +>pkg-size</a>,一个在线监测 npm 包大小的网站,可以实时查看一个 npm 包的真实依赖,网站利用了 web容器技术,直接在浏览器里执行 npm install 操作。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-32-07.png" +width="1011" +height="636" +loading="lazy" +class="gallery-image" +data-flex-grow="158" +data-flex-basis="381px" +></li> +<li><a class="link" href="https://marketplace.visualstudio.com/items?itemName=degreat.3e" target="_blank" rel="noopener" +>3e</a>,一个 VS Code 插件,可以让你在编辑器里直接浏览 3d 模型,基于 webgl 实现。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-32-58.png" +width="704" +height="468" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="361px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 039 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/Tue, 11 Jul 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/<h1 id="机器文摘-第-039-期">机器文摘 第 039 期</h1> +<h2 id="长文">长文</h2> +<ul> +<li> +<p><a class="link" href="https://www.cs.columbia.edu/~hgs/etc/writing-bugs.html" target="_blank" rel="noopener" +>关于写作的通用问题</a>,“元技能”一般指比普通技能更高阶的技能,我理解为可产生技能的技能,此类技能并不会随着外部环境的高速发展而被淘汰。比如写作就算是一种元技能,当不知道该训练和提升什么技能的时候,将时间花在“元技能”的提升上准没有错。这篇文章主要讲解英文写作的常见问题,但是有些我觉得对于中文也适用。比如文章开头提到的两个基本原则:“在写之前就弄清楚自己想表达什么”、“即便是你已经写完了一整篇,如果没能表达你的意思那也是废纸”。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-13-52-23.png" +width="294" +height="171" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="412px" +></p> +</li> +<li> +<p><a class="link" href="https://jmmv.dev/2023/06/fast-machines-slow-machines.html" target="_blank" rel="noopener" +>新电脑快还是老电脑快?</a>,上周有博主在twitter发布了一个视频吐槽了一个我也困惑很久的事情。作者展示了他在一台古董电脑上运行Windows NT 3.5 的情况,视频中的电脑基本可以做到秒开程序,然后又展示了一台配备了Windows 11的Surface平板电脑,操作起来界面响应有明显延迟。后者cpu频率为前者的4倍,内存容量为前者的6倍。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-13-55-53.png" +width="507" +height="228" +loading="lazy" +class="gallery-image" +data-flex-grow="222" +data-flex-basis="533px" +></p> +</li> +</ul> +<p>现在的硬件性能动辄就比之前的老硬件几十甚至上百倍的提升,但是我们的交互体验呢?能够秒开的程序甚至还不如二十年前的老爷机。 +后来这事儿在twitter引发了一些争议,有人认为现在的软件确实吃掉了硬件提升的性能,对体验来说提升不足。也有人说现在的体验与以往不可同日而语,这样的对比不公平也没有意义。</p> +<p>博主不得不专门写了一篇文章来回应,详细记录了作者认为更加合理的对比过程。</p> +<p>我个人认为首要原因就是随着硬件性能的提升,软件开发者的精力已经逐渐从性能向开发效率倾斜了。由于现在硬件成本确实低廉,软件迭代周期变得越来越短,软件开发者也越来越没有动力做出极致挖掘硬件性能的软件。</p> +<p>不信你看,现在越来越多的应用程序不再使用原生开发,而是采用了可以“跨平台”的web技术。</p> +<p>这样使得软件界面的响应直接下降了一个数量级。(我在使用vscode的时候甚至还会遇到打字卡顿慢慢弹出字符的情况。)</p> +<p>另外,复杂的设计模式和软件架构,也吃掉了不少硬件性能,因为每增加一层抽象,都会消耗资源,而现在各种复杂的架构就是拼命地增加抽象层。</p> +<p>希望以后市场能够鼓励开发者多做挖掘硬件性能的事情吧。</p> +<ul> +<li><a class="link" href="https://faultlore.com/blah/text-hates-you/" target="_blank" rel="noopener" +>文字渲染比你想象的要复杂</a>,这篇文章的作者曾负责火狐浏览器的文字渲染引擎,他写这篇文字的目的是科普一下关于文字渲染的一些基本技术和困难。在阅读之前,我也简单的以为,文字渲染就是把对应的字符字形从字体库中取出来然后绘制到相应的位置即可,但实际情况确实比这要复杂得多。比如,文中提到的关于“连字符”的处理、“抗锯齿”、“书写方向”等问题,每一个都是开发者的头发杀手。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-12-47.png" +width="574" +height="307" +loading="lazy" +class="gallery-image" +data-flex-grow="186" +data-flex-basis="448px" +></li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/rrweb-io/rrweb" target="_blank" rel="noopener" +>rrweb</a>,可在网页上记录用户行为并导出视频文件。可用于:排查用户错误、保险业务签署、内部风控、用户交互分析等。rrweb采用虚拟化转换DOM、记录变更和操作过程,并通过链表回放数据。存储最小化、回放可快进且跳过无效行为。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-13-31.png" +width="529" +height="378" +loading="lazy" +class="gallery-image" +data-flex-grow="139" +data-flex-basis="335px" +></li> +<li><a class="link" href="https://github.com/zhaoyun0071/DragGAN-Windows-GUI" target="_blank" rel="noopener" +>DragGAN-Windows-GUI</a>,DragGAN(上周介绍过的开源模型,可以针对图片进行交互式拖动修改)的懒人包,解压直接用,内置17个模型。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-13-53.png" +width="690" +height="421" +loading="lazy" +class="gallery-image" +data-flex-grow="163" +data-flex-basis="393px" +></li> +<li><a class="link" href="https://neal.fun/deep-sea/" target="_blank" rel="noopener" +>deep-sea</a>,这个网页可以让你查看海洋各个深度都是有哪些生物,果然是越往下越看不清,所以大家就随便长长了,不讲究好看不好看了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-14-11.png" +width="690" +height="501" +loading="lazy" +class="gallery-image" +data-flex-grow="137" +data-flex-basis="330px" +></li> +<li><a class="link" href="http://elementsofprogramming.com/" target="_blank" rel="noopener" +>电子书《Elements of Programming》</a>,这本老书在出版十年后推出了免费pdf版。中文译作《编程原本》,旨在介绍通用的程序设计原理和技巧,重点关注程序设计的基本元素和抽象概念。这本书的核心思想是将程序设计看作是一种构建和操作抽象概念的过程。它强调程序设计应该建立在数学原理和精确性基础上,通过抽象和泛化来创建可重用、可扩展和可维护的软件。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-14-52.png" +width="377" +height="542" +loading="lazy" +class="gallery-image" +data-flex-grow="69" +data-flex-basis="166px" +></li> +<li><a class="link" href="https://github.com/loft-sh/devpod" target="_blank" rel="noopener" +>devpod</a>,Github 的 Codespaces 和微软的 VSCode DevContainers 给开发者提供了即开即用的云端开发环境。现在,他们的开源平替来了,devpod 是一个开源的开发环境容器,可以方便地在任意客户端(Mac、Win、Linux)或云端主机创建体验一致的开发环境,并且可以与VSCode和Jetbrains等IDE直接集成。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-15-25.png" +width="690" +height="266" +loading="lazy" +class="gallery-image" +data-flex-grow="259" +data-flex-basis="622px" +></li> +<li><a class="link" href="https://uploads-ssl.webflow.com/5ac6b7f2924c656f2b13a88c/6435aabdc0a041194b243eef_Current%20Best%20Practices%20for%20Training%20LLMs%20from%20Scratch%20-%20Final.pdf" target="_blank" rel="noopener" +>从零开始训练大语言模型的最佳实践</a>,训练大语言模型的技术白皮书,从基本概念和技术讲起,教你训练大语言模型。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-15-45.png" +width="656" +height="849" +loading="lazy" +class="gallery-image" +data-flex-grow="77" +data-flex-basis="185px" +></li> +<li><a class="link" href="https://github.com/yardenshafir/WinDbg_Scripts/blob/master/windbg_the_fun_way.pdf" target="_blank" rel="noopener" +>windbg</a>,一本电子书,讲了很多 windbg 调试器的高级用法,市面上很少见。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-16-44.png" +width="620" +height="319" +loading="lazy" +class="gallery-image" +data-flex-grow="194" +data-flex-basis="466px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 040 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/Tue, 11 Jul 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/<h1 id="机器文摘-第-040-期">机器文摘 第 040 期</h1> +<h2 id="长文">长文</h2> +<h3 id="前端代码检查插件eslint和美化插件prettier的冲突">前端代码检查插件<code>ESLint</code>和美化插件<code>Prettier</code>的冲突</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-02-40.png" +width="1900" +height="1008" +loading="lazy" +class="gallery-image" +data-flex-grow="188" +data-flex-basis="452px" +> +在使用VSCode等现代化编辑器进行前端开发的时候,很多工程样板都默认开启了代码检查和自动格式化的功能,其中以 ESLint 插件和 Prettier 插件为主。</p> +<p>之前有一阵子我总是困惑这两个插件的区别,甚至如果配置不好的话,还会有冲突。</p> +<p>比如 Prettier 插件会在你保存源码的时候按照既定规则进行“美化”代码,如去除行尾分号、增加表达式中的空格等等。此时如果ESLint插件的规则配置不同的话,编辑器就会报错并提示要进行“修复”,然而就在你“修复”之后,刚<code>Ctrl+S</code>保存之后,又傻眼了,因为 Prettier 又对代码进行了“美化”。</p> +<p>我周末特意花时间研究了一下,梳理了一下这两个插件的关系以及他们的分工。</p> +<p>首先,他们的职责定位不同:ESLint 用于检查代码编写是否符合某种预定义的规范,可以进行十分详尽的配置和多项检查,比如定义的变量如果未使用可以作为一种警告或者错误,其职责定位以检查为主。而 Prettier 的职责侧重于格式化(美化)代码,对于编写代码的样式如 tab 缩进量、行尾要不要分号、字符串用单引号还是双引号等可以进行统一格式化,一般用于在代码保存的时候进行快速统一样式。</p> +<p>所以两者可以配合使用,但开头提到的规则冲突需要注意。</p> +<p>我个人的习惯是,将两个插件的配置文件里的配置项进行匹配(规则调整为一致),因为我在美化时关注的项并不太多,所以编写这两个配置文件不算费劲。</p> +<p>而网上有人提出了更好的办法,即通过扩展插件的方式,使得 ESLint 自动获取 Prettier 的规则,以自动统一两者的行为。</p> +<p><a class="link" href="https://rileycai.com/%e4%b8%8d%e4%bb%a5%e8%a7%84%e7%9f%a9%ef%bc%8c%e4%b8%8d%e8%83%bd%e6%88%90%e6%96%b9%e5%9c%86-%e5%bd%bb%e5%ba%95%e6%90%9e%e6%87%82-eslint-%e5%92%8c-prettier/" target="_blank" rel="noopener" +>关于 ESLint 和 Prettier 的具体分析文章和操作建议可以看这一篇文章:</a></p> +<h3 id="说一说我现在的知识管理工具和流程">说一说我现在的知识管理工具和流程</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-03-27.png" +width="302" +height="517" +loading="lazy" +class="gallery-image" +data-flex-grow="58" +data-flex-basis="140px" +> +Hacknews 上有网友说<a class="link" href="https://news.ycombinator.com/item?id=36609641" target="_blank" rel="noopener" +>Evernote几乎辞退了它的所有员工</a>,才想起来我已经有好几年没用过 Evernote 了。之前大概有将近十年的时间都在使用Evernote(但都是免费用户)。主要使用场景是记录个人的工作日志和借助浏览器插件剪藏一些值得收藏的文章。</p> +<p>后来随着 Evernote 的限制越来越多,体验逐渐下降。我就迁移到了使用纯文本作为知识记录载体的路线上了。</p> +<p>期间使用过 Emacs 的 org 模式,也尝试过 vim 的 wiki 插件,最后选择了现在这个 VSCode + GitHub 的方案,已稳定使用了两年时间。</p> +<p>具体流程如下: +1、使用 VSCode + <a class="link" href="https://foambubble.github.io/foam/" target="_blank" rel="noopener" +>foam</a> 、<a class="link" href="https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one" target="_blank" rel="noopener" +>MarkdownAllinOne</a> 等插件实现对 Markdown 的高效编辑,可以实时预览排版效果,foam实现了类似 <a class="link" href="https://obsidian.md/" target="_blank" rel="noopener" +>Obsidian</a> 的文章双向链接和知识关系图谱。我主要使用 Markdown 记录日志和编写知识卡片用于存放个人吸收的信息。 +2、所有内容存放在一个 git 仓库中,同步到 GitHub 上的个人私有仓库,这样可以省去对接网盘的麻烦。 +3、对于互联网上阅读到的有用文章,使用浏览器插件 <a class="link" href="https://microsoftedge.microsoft.com/addons/detail/web-clipper/opejamnnohhbjflpbhnmdlknhjkfhfdp" target="_blank" rel="noopener" +>Web Clipper</a>,可以完整的抓取页面内容到指定的后端存储,这个插件我最喜欢的点是它可以将文章抓取到你指定的GitHub仓库,并作为Issue提交。 +4、来不及看的信息就先抓取到 Issue ,然后等有时间进行整理,形成自己的知识卡片后再关闭该 Issue 。</p> +<p>这套工具及流程的优点: +1、完全免费,不产生任何费用,而且体验不亚于收费软件。 +2、自由度高,存储后端可以自己随意选择,如果嫌 GitHub 麻烦的话,可以自己用网盘同步文件夹。 +3、纯文本载体,这个算是优点吧,格式开放,不会存在别的编辑器打不开的情况。 +4、数据私有,数据随时都在本地(云端的仅作为备份和同步中转),不用担心 SaaS 供应商跑路(你看现在的Evernote)。</p> +<p>欢迎大家讨论。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/TransparentLC/WechatMomentScreenshot" target="_blank" rel="noopener" +>朋友圈截图生成工具</a>,可以帮你生成逼真的朋友圈截图,可定制头像、评论、点赞个数等细节。收藏<a class="link" href="https://akarin.dev/WechatMomentScreenshot/" target="_blank" rel="noopener" +>这个地址</a>,以后再也不怕被群里晒孩子的家长或者搞活动的商家逼着发朋友圈集赞了。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-04-12.png" +width="690" +height="1227" +loading="lazy" +class="gallery-image" +data-flex-grow="56" +data-flex-basis="134px" +></li> +<li><a class="link" href="https://86box.net/" target="_blank" rel="noopener" +>86box</a>,老式 x86 架构计算机模拟器,与 Virtualbox 等虚拟化技术不同的是,86box采用纯软件模拟的方式,实现了经典老式 cpu (如 AMD Am486DX4)的各种技术细节,甚至是当时的硬件缺陷(有些老游戏的 hack 需要这些缺陷)。可以完美复现一台上世纪 90 年代的经典 DOS PC ,用来复古怀旧游戏是再合适不过了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-04-26.png" +width="553" +height="371" +loading="lazy" +class="gallery-image" +data-flex-grow="149" +data-flex-basis="357px" +></li> +<li><a class="link" href="https://github.com/ztxz16/fastllm" target="_blank" rel="noopener" +>fastllm</a>,fastllm是纯c++实现,无第三方依赖的高性能大模型推理库(待测试验证)。据宣称:6~7B级模型在安卓端上也可以流畅运行,支持python调用,chatglm-6B级模型单卡可达10000+token / s,支持glm, llmam, moss基座,手机端流畅运行。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-05-17.png" +width="875" +height="356" +loading="lazy" +class="gallery-image" +data-flex-grow="245" +data-flex-basis="589px" +></li> +<li><a class="link" href="https://photoai.com" target="_blank" rel="noopener" +>PhotoAI</a>,作者说,他为这个网站大概写了14000行PHP代码,样式全写在了<code>&lt;style&gt;</code>标签里,JS全写在<code>&lt;script&gt;</code>标签里,除了<code>jQuery</code>没用任何框架,就连布局也是使用<code>float:left</code>这种老式的浮动实现。然而这个网站确能给他带来每月差不多 <em>6万刀</em> 的收入。这是不是在吹牛。这个网站的业务是:使用AI生成完全没有任何版权问题的各种人像照片。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-05-41.png" +width="690" +height="617" +loading="lazy" +class="gallery-image" +data-flex-grow="111" +data-flex-basis="268px" +></li> +<li><a class="link" href="https://makepad.nl/makepad/examples/ironfish/src/index.html" target="_blank" rel="noopener" +>Ironfish synth</a>,用rust写的在线合成器,虽然感觉像个 Demo 但完成度很高,音源部分具有两个振荡器(可选正弦波、方波、锯齿波等)和一个噪波通道,滤波器、效果器齐全,另外还有一个可视化音序器。可基于键盘直接演奏。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-05-59.png" +width="690" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="204" +data-flex-basis="491px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 038 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/Tue, 27 Jun 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/<h1 id="机器文摘-第-038-期">机器文摘 第 038 期</h1> +<h2 id="研究">研究</h2> +<ul> +<li><a class="link" href="https://www.polygon.com/23690187/discord-ai-chatbot-clyde-grandma-exploit-chatgpt" target="_blank" rel="noopener" +>ChatGPT的“奶奶漏洞”</a>,奶奶漏洞来源自一个用户说他已经过世的奶奶是凝固汽油弹工厂的工程师,用户让 ChatGPT 用他奶奶说睡前故事的形式,详细介绍了凝固汽油弹的制作方法。以此来绕过 ChatGPT 的安全审查,结果当然是,他得逞了。后来还有网友做了试验,以同样的方式可以套取 Windows 各个版本的序列号。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-53-23.png" +width="720" +height="489" +loading="lazy" +class="gallery-image" +data-flex-grow="147" +data-flex-basis="353px" +></li> +<li>国外也有“垃圾佬”,这篇<a class="link" href="https://l4rz.net/running-nvidia-sxm-gpus-in-consumer-pcs/" target="_blank" rel="noopener" +>《怎样低成本搭建深度学习电脑》</a>的文章,介绍了作者怎样通过在二手网站上“捡垃圾”搭建出了性能良好且便宜的GPU工作站。 值得一提的是,作者购买的主要渠道竟然来自国内的著名二手物品交易平台,某鱼。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-54-05.png" +width="690" +height="459" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="360px" +></li> +</ul> +<h2 id="长文">长文</h2> +<ul> +<li> +<p>回顾这些年软件研发的历程,凡是能够做成的软件,无一例外都是抓住了真正存在的需求。这样的需求未必很宏大或者华丽,但一定不是想象种的伪需求。仔细分析之后就会发现,在一个软件产品的生命周期里,开发者所面临的真正(或者说正确的)需求很少,因为找到它们十分不易,它们周边布满了被人们主观意识强加上的伪需求。<a class="link" href="https://cerebralab.com/Imaginary_Problems_Are_the_Root_of_Bad_Software" target="_blank" rel="noopener" +>《伪需求是糟糕软件的根源》</a>,文章探讨了软件开发中存在的一个问题,即虚构的问题(我将之译为:伪需求)如何导致糟糕的软件结果。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-56-35.png" +width="353" +height="179" +loading="lazy" +class="gallery-image" +data-flex-grow="197" +data-flex-basis="473px" +></p> +</li> +<li> +<p>有没有考虑过一个问题,即:为什么随着科技的发展和生产力的提升,人们不是越来越清闲,反而越来越劳累了?这里有篇文章探讨了一些深层次的原因,<a class="link" href="https://theanarchistlibrary.org/library/david-graeber-bullshit-jobs" target="_blank" rel="noopener" +>《狗屁工作》</a>,此文写于 2013 年,作者是 David Graeber (一名人类学教授)。文章讨论了现代社会中存在的一种现象,即许多人在工作中感到他们所从事的工作毫无意义,没有真正的价值和目的。这些工作被称为&quot;狗屁工作&quot;,作者试图探究狗屁工作的存在原因和对个体和社会的影响。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-56-57.png" +width="602" +height="854" +loading="lazy" +class="gallery-image" +data-flex-grow="70" +data-flex-basis="169px" +></p> +</li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/laishulu/Sarasa-Term-SC-Nerd" target="_blank" rel="noopener" +>Sarasa Term SC Nerd</a>,写中文Markdown文件的时候,最怕遇到表格,因为编辑器按照一个中文字符的宽度等于两个英文字符的宽度进行计算,而很多字体在设计时未考虑严格按照这种2:1的宽度比例设计字形,导致在Markdown在编辑状态时的表格分割线错位,看起来十分头疼。经过多方对比,我终于找到了让自己满意的等宽字体,支持中英文字符2:1宽度比例,中文为黑体,英文字符也特别适合写代码。此外还整合了Nerd fonts,支持在终端显示各种漂亮图标。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-58-24.png" +width="690" +height="187" +loading="lazy" +class="gallery-image" +data-flex-grow="368" +data-flex-basis="885px" +></li> +<li><a class="link" href="https://reviewgpt.net" target="_blank" rel="noopener" +>ReviewGPT</a> 写作文、写报告、写邮件,生活中充满了各种写作任务。ReviewGPT 基于 gpt 模型,可为你的文章进行打分、评价,提出修改意见,甚至还可以扮演莎士比亚、金庸等知名作家,帮助你重新撰写,快速提升文章质量。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-58-38.png" +width="690" +height="394" +loading="lazy" +class="gallery-image" +data-flex-grow="175" +data-flex-basis="420px" +></li> +<li><a class="link" href="https://github.com/binpash/try" target="_blank" rel="noopener" +>try</a>,刚发布的一个命令行工具,目标是允许你执行命令的时候先检查其执行的后果,然后再决定是否让命令真正生效。真正起到了安全保护的效果。官方介绍这个命令是基于 Linux 的命名空间(通过 unshare )和 overlayfs 联合文件系统等技术实现。并特别提醒并非基于沙盒,所以还是谨慎执行危险操作吧。比如<code>try rm rf /*</code>。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-59-26.png" +width="831" +height="467" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="427px" +></li> +<li><a class="link" href="https://github.com/XingangPan/DragGAN" target="_blank" rel="noopener" +>DragGAN</a>, 通过拖动就可以完全操纵图像的 AI 模型,现已开放源码! DragGAN 是由谷歌、麻省理工学院和马克斯普朗克研究所创建的一种新的人工智能模型。可以让你轻松通过点击拖动等简单的交互操作就能改变拍摄对象的姿势、形状和表情。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-16-00-25.png" +width="598" +height="399" +loading="lazy" +class="gallery-image" +data-flex-grow="149" +data-flex-basis="359px" +></li> +<li><a class="link" href="https://flameshot.org/" target="_blank" rel="noopener" +>flameshot</a>,一个超强的免费截图软件,可以像任何一个截图工具一样截图,最重要的是还有一些附加功能,按一下数字图标,就可以在屏幕上按数字顺序自动生成步骤图示,非常适合生成操作步骤说明。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-16-01-00.png" +width="580" +height="374" +loading="lazy" +class="gallery-image" +data-flex-grow="155" +data-flex-basis="372px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 037 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/Tue, 20 Jun 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/<h1 id="机器文摘-第-037-期">机器文摘 第 037 期</h1> +<h2 id="研究">研究</h2> +<ul> +<li><a class="link" href="https://snap-research.github.io/SnapFusion/" target="_blank" rel="noopener" +>SnapFusion</a> 文本到图像的扩散模型可以从自然语言描述中创建令人惊叹的图像。然而,这些模型很大,需要高端 GPU 在服务端运行模型。SnapFusion提出了一种通用方法,可以在移动设备上运行的文本到图像扩散模型,且出图时间不到2秒。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-55-06.png" +width="609" +height="899" +loading="lazy" +class="gallery-image" +data-flex-grow="67" +data-flex-basis="162px" +></li> +<li><a class="link" href="https://framer.com/ai" target="_blank" rel="noopener" +>Framer</a> 发布了 AI 工具,直接根据文字需求生成页面,我试了一下,对于个人博客、产品介绍页面等静态展示类型的页面,生成的效果还是十分理想的,而且同步提供桌面端和移动端页面。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-55-33.png" +width="599" +height="710" +loading="lazy" +class="gallery-image" +data-flex-grow="84" +data-flex-basis="202px" +></li> +<li><a class="link" href="https://notes.dt.in.th/HDRQRCode" target="_blank" rel="noopener" +>比<code>#ffffff</code>还“白”的“超级白”</a>,这里有网友介绍了一个方法,可以显示更高对比度的二维码(以方便用户扫描识别),据说白的程度超出了sRGB颜色范围,前提是你的显示设备支持HDR。作者的思路是用一段HDR视频在网页中伪装成显示二维码的图片。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-56-11.png" +width="690" +height="305" +loading="lazy" +class="gallery-image" +data-flex-grow="226" +data-flex-basis="542px" +></li> +<li><a class="link" href="https://rwmj.wordpress.com/2023/06/14/i-booted-linux-292612-times/" target="_blank" rel="noopener" +>我在21小时内重启系统29万次</a>,Linux 6.4内核有一个bug可能导致启动时挂起,但概率很低。为了复现bug,Richard WM Jones重启了29万次电脑,最终找到了问题。这让我想起了之前修改不容易复现Bug的艰辛。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-56-28.png" +width="690" +height="735" +loading="lazy" +class="gallery-image" +data-flex-grow="93" +data-flex-basis="225px" +></li> +<li>我发现一个用chatGPT翻译整段文字的小技巧,那就是在他翻译完成之后,再将这段话发给他,让他根据通顺程度和合理性进行二次润色,出来的结果就好很多了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-58-53.png" +width="717" +height="648" +loading="lazy" +class="gallery-image" +data-flex-grow="110" +data-flex-basis="265px" +></li> +<li>Python写代码很爽,但是想打包发布成果的时候就稍微麻烦一些了,毕竟一大堆环境依赖和包依赖。我之前一直用的是PyInstaller作为打包工具,但是现在我又发现了这个<a class="link" href="https://github.com/Nuitka/Nuitka" target="_blank" rel="noopener" +>Nuitka</a>。它的打包原理是:直接把 Python 代码转成 C 代码再编译,这样打包出来的成果占用小、执行效率也高,尤其适合PyQt编写的桌面程序。另外,著名的 Blender 就是用 Nuitka 编译的。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-59-12.png" +width="428" +height="272" +loading="lazy" +class="gallery-image" +data-flex-grow="157" +data-flex-basis="377px" +></li> +</ul> +<h2 id="长文">长文</h2> +<ul> +<li><a class="link" href="https://www.raptitude.com/2022/01/everything-must-be-paid-for-twice/" target="_blank" rel="noopener" +>你买的每样东西都需要支付两次成本</a>,这篇在Hacker News上的文章引起我的强烈共鸣。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-59-33.png" +width="600" +height="400" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="360px" +></li> +</ul> +<p>它提出了一个有趣的观点,我以前从未意识到:</p> +<p>每样东西都需要支付两次成本。</p> +<p>通常,我们只关注第一次支付的成本,也就是购买时花的钱,比如买一台相机、一架钢琴或一本小说。</p> +<p>然而,作者指出,如果你不支付第二次的成本,你之前花的钱就等于打水漂了。</p> +<p>第二次成本指的是,你需要花时间和精力去充分使用你所购买的物品。</p> +<p>比如认真阅读一本书,练习钢琴以提高演奏水平等等。</p> +<p>然而,我们常常只停留在第一次购买时的满足感上,然后追求下一个。</p> +<p>随着时间的推移,大量未支付第二次成本的物品使我们积累了一种无形的债务。</p> +<p>为此经常感到挫败。</p> +<p>这种挫败感促使我们寻求那些能够刺激我们的短期享受,比如玩手机、享用美食。</p> +<p>进一步导致没有时间支付第二次成本。</p> +<p>那么,有什么办法可以改变这种情况吗?</p> +<p>作者说,唯一的解决办法就是控制购买欲望,强迫自己安排时间来履行第二次支付的责任。</p> +<p>尽管这听起来可能有些不舒服,但如果我们能克服这种不舒服的临界点,例如学会一首乐曲,耐心读完一本书,我们将会获得意想不到的奖励时刻。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://www.ratatype.com" target="_blank" rel="noopener" +>ratatype</a>,在线键盘盲打指法练习,有完整的练习教程,从初级到高级都有。有点儿像Dos时代的著名打字练习软件TT,不过是网页版的。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-16-00-11.png" +width="690" +height="360" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="460px" +></li> +<li><a class="link" href="https://play0ad.com/download" target="_blank" rel="noopener" +>0A.D.</a>,帝国时代是个经典游戏,这里有个开源版,名字叫做0AD,由Wildfire Games开发,虽然是免费开源的游戏,但是效果和可玩性都非常高,适合在周末的午后来一把怀旧局。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-16-00-26.png" +width="690" +height="405" +loading="lazy" +class="gallery-image" +data-flex-grow="170" +data-flex-basis="408px" +></li> +<li><a class="link" href="https://landing.love" target="_blank" rel="noopener" +>landing.love</a>,一个专门收集各种网页动画效果的网站,目前已收录超过400个具有新颖创意动效的网站,并配有截图和录屏视频。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-16-00-47.png" +width="590" +height="486" +loading="lazy" +class="gallery-image" +data-flex-grow="121" +data-flex-basis="291px" +></li> +<li><a class="link" href="https://github.com/princeton-vl/infinigen" target="_blank" rel="noopener" +>infinigen</a>,一款面向计算机视觉研究的3D场景自动生成器,提供多样且高质量的3D训练数据。基于Blender,免费且开源。可以通过重写随机化的默认参数来完全控制资产生成。提供了对自然界中多种对象和场景的生成器,包括植物、动物、地形以及火、云、雨、雪等自然现象。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-16-01-41.png" +width="951" +height="522" +loading="lazy" +class="gallery-image" +data-flex-grow="182" +data-flex-basis="437px" +></li> +<li><a class="link" href="https://yjdoc2.github.io/8086-emulator-web/compile" target="_blank" rel="noopener" +>8086-emulator-web</a> ,用js编写的的8086 cpu模拟器,支持汇编语言在线编写、编译和调试运行,是一个学习汇编语言和理解计算机原理的好工具。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-16-01-04.png" +width="690" +height="320" +loading="lazy" +class="gallery-image" +data-flex-grow="215" +data-flex-basis="517px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 036 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/Wed, 14 Jun 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/<h1 id="机器文摘-第-036-期">机器文摘 第 036 期</h1> +<h2 id="研究">研究</h2> +<ul> +<li><a class="link" href="https://video.weibo.com/show?fid=1034:4911535232057363" target="_blank" rel="noopener" +>软驱阵列演奏音乐</a>,国外大神用512个软驱、16个硬盘、4个扫描仪,组装成阵列,通过编程的方式控制电机震动发出声音,组成各声部。这么多软驱,让我想到了退休老干部合唱团。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-49-03.png" +width="1555" +height="926" +loading="lazy" +class="gallery-image" +data-flex-grow="167" +data-flex-basis="403px" +></li> +<li><a class="link" href="https://video.weibo.com/show?fid=1034:4564677670141974" target="_blank" rel="noopener" +>大脑能像身体那样锻炼吗?</a>,如何训练大脑?提高记忆力、注意力和智力!这个视频进行了讲解,总之就是,用进废退,改变日常默认行动,让大脑动起来。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-49-59.png" +width="743" +height="450" +loading="lazy" +class="gallery-image" +data-flex-grow="165" +data-flex-basis="396px" +></li> +<li><a class="link" href="https://gaultier.github.io/blog/x11_x64.html" target="_blank" rel="noopener" +>用纯汇编写一个GUI</a>,跟随这篇教学文章,通过编写图形界面的方式来学习汇编语言吧。顺便,作者想挑战一下,最小的GUI程序其可执行二进制文件能有多小。(现在的可执行文件动不动就好几十上百MB)​。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-50-39.png" +width="1046" +height="463" +loading="lazy" +class="gallery-image" +data-flex-grow="225" +data-flex-basis="542px" +></li> +<li><a class="link" href="https://blog.betacat.io/post/2023/06/summarize-hacker-news-by-chatgpt" target="_blank" rel="noopener" +>让 ChatGPT 帮我们总结 Hacker News</a>,让AI每天帮我总结新闻摘要,这个想法我已经考虑很久了,现在已经有人做了实现。这篇文章介绍了一个开源静态网站的实现,它利用 ChatGPT 的总结能力,直接将每条Hackernews的新闻用一两句话总结出来,然后发布到GithubPages 可以节约我们每天看新闻的时间。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-51-29.png" +width="891" +height="413" +loading="lazy" +class="gallery-image" +data-flex-grow="215" +data-flex-basis="517px" +></li> +<li><a class="link" href="https://www.web3brand.io/p/maximize-unregretted-user-time" target="_blank" rel="noopener" +>马斯克专访:推特的混乱过去了,现在的目标是最大化用户无悔时间!</a>,我不喜欢看八卦,但是科技的除外。马斯克收购 Twitter 几个月过去了,大家还在等着看笑话,但是为什么没等到,以及开掉一半人之后效率却提升那么多? +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-52-02.png" +width="680" +height="417" +loading="lazy" +class="gallery-image" +data-flex-grow="163" +data-flex-basis="391px" +></li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/AI4Finance-Foundation/FinGPT" target="_blank" rel="noopener" +>FinGPT</a>,一个面向金融领域的开源语言模型,采用以数据为中心的方法,为研究人员和实践者提供易于使用的资源,致力于做金融领域的chatGPT。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-52-48.png" +width="822" +height="462" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="427px" +></li> +<li><a class="link" href="https://github.com/facebookresearch/audiocraft" target="_blank" rel="noopener" +>Audiocraft</a>,facebook发布的一个PyTorch库,用于音频生成的深度学习研究。目前,它提供了用于从文本生成音乐的MusicGen代码和模型。模型使用2万小时正版授权音乐训练。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-53-34.png" +width="816" +height="350" +loading="lazy" +class="gallery-image" +data-flex-grow="233" +data-flex-basis="559px" +></li> +<li><a class="link" href="https://github.com/mljar/mercury" target="_blank" rel="noopener" +>Mercury</a>,在 Jupyter Notebook 中构建 Web 应用程序,允许您在Python笔记本中添加交互式小部件,然后将笔记本发布为带交互界面的Web应用程序。我的感受是,Mercury就是 notebook版的<a class="link" href="https://github.com/gradio-app/gradio" target="_blank" rel="noopener" +>gradio</a> ​​​。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-53-58.png" +width="805" +height="421" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="458px" +></li> +<li><a class="link" href="https://github.com/reactive-python/reactpy" target="_blank" rel="noopener" +>ReactPy</a>,React是最流行的用于构建UI的前端框架,现在所有Python开发人员都可以使用它。比起gradio,这个reactpy的抽象层级更低一些,自由度更高了,我猜测目标用户应该是不喜欢写前端代码但是又希望掌控页面细节的python程序员。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-56-24.png" +width="632" +height="148" +loading="lazy" +class="gallery-image" +data-flex-grow="427" +data-flex-basis="1024px" +></li> +<li><a class="link" href="http://ggml.ai/" target="_blank" rel="noopener" +>GGML</a>,一个用于机器学习的张量库,采用纯C++实现,无其他依赖项。旨在在普通硬件上实现大型模型和高性能。它同时也是 llama.cpp 和 whisper.cpp 的底层库。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-57-18.png" +width="629" +height="327" +loading="lazy" +class="gallery-image" +data-flex-grow="192" +data-flex-basis="461px" +></li> +<li><a class="link" href="https://github.com/Genymobile/scrcpy" target="_blank" rel="noopener" +>Scrcpy</a>,一个让人相见恨晚的app,可以通过USB或TCP/IP连接镜像Android设备的视频和音频,并允许使用计算机的键盘和鼠标来控制设备。它不需要任何root权限,并且兼容Linux、Windows和macOS操作系统。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-17-02-19.png" +width="408" +height="589" +loading="lazy" +class="gallery-image" +data-flex-grow="69" +data-flex-basis="166px" +></li> +<li><a class="link" href="https://maketafi.com/ai" target="_blank" rel="noopener" +>Tafi</a>,通过自然语言生成3D模型,质量号称接近AAA级游戏,可以导出创建的角色到Blender、Unreal 或 Unity中。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-17-02-52.png" +width="1080" +height="608" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></li> +<li><a class="link" href="https://github.com/Hufe921/canvas-editor" target="_blank" rel="noopener" +>canvas-editor</a>,一个基于 canvas/svg 实现的富文本编辑器,在市面上,使用 Canvas 实现整个编辑器的开源项目并不常见,大多数情况下仍然使用 DOM 来实现。使用 Canvas 的最显著特点是其出色的性能,但实现起来的成本也更高。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-17-15-39.png" +width="1200" +height="668" +loading="lazy" +class="gallery-image" +data-flex-grow="179" +data-flex-basis="431px" +></li> +<li><a class="link" href="https://markmap.js.org%e2%80%8b%e2%80%8b" target="_blank" rel="noopener" +>markmap.js</a>,一个用markdown文本制作思维导图的工具,提供了vscode的插件可直接在编辑器预览。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-17-16-02.png" +width="611" +height="458" +loading="lazy" +class="gallery-image" +data-flex-grow="133" +data-flex-basis="320px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 035 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/Wed, 07 Jun 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/<h1 id="机器文摘-第-035-期">机器文摘 第 035 期</h1> +<h2 id="研究">研究</h2> +<ul> +<li><a class="link" href="https://www.reproof.app/blog/notes-apps-help-us-forget" target="_blank" rel="noopener" +>笔记帮我们记住还是忘记?</a>这篇文章讨论了笔记对帮助我们遗忘的作用。作者认为,随着时间的推移,我们无法记住所有的事情,但是只要我们记录了重要的信息,就可以在需要时再次查找,因此笔记实际上帮助我们遗忘。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-09-37.png" +width="1173" +height="488" +loading="lazy" +class="gallery-image" +data-flex-grow="240" +data-flex-basis="576px" +></li> +<li><a class="link" href="https://research.nvidia.com/labs/dir/neuralangelo/" target="_blank" rel="noopener" +>高保真神经表面重建</a>,Nvidia 新发布的这个 Neuralangelo 有些猛,随便给一个视频就能进行精细3D建模,也许要不多久激光点云技术就要淘汰了。值得关注 ! +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-12-49.png" +width="936" +height="465" +loading="lazy" +class="gallery-image" +data-flex-grow="201" +data-flex-basis="483px" +></li> +<li><a class="link" href="https://github.com/Neo-Desktop/WindowsXPKg" target="_blank" rel="noopener" +>Windows XP 激活算法被破解</a>, XPKeygen是一个可以随意生成XP有效安装密钥的程序,当前的电脑可能用不到了。不过可能还有一些老旧的设备,只能通过 Windows XP 来操作,这时候这个东西就派上用场了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-17-33.png" +width="610" +height="285" +loading="lazy" +class="gallery-image" +data-flex-grow="214" +data-flex-basis="513px" +></li> +<li><a class="link" href="https://www.v2ex.com/t/944717" target="_blank" rel="noopener" +>一个整活儿的开源编辑器</a>,data:text/html;base64,PGh0bWwgY29udGVudGVkaXRhYmxlPmVkaXQgbWU8L2h0bWw+ 把这个代码粘到浏览器地址栏,竟然是个记事本app,如果从IDE拷贝代码过去,竟然还支持代码高亮。。。。加入到收藏夹即可食用。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-20-19.png" +width="663" +height="347" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="458px" +></li> +<li><a class="link" href="https://mymodernmet.com/sea-turtle-birch-aquarium-3d-printed-brace" target="_blank" rel="noopener" +>3D打印拯救海龟</a> ,2017年,伯奇水族馆与加州大学圣地亚哥分校图书馆的数字媒体实验室合作。他们一起创造了一种首创的3D打印支架,以固定她的外壳上的缝隙。现在,六年后,这种生物及其照顾者继续从这项发明中获益。这只海龟最近接受了年度检查,健康状况良好。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-21-40.png" +width="613" +height="372" +loading="lazy" +class="gallery-image" +data-flex-grow="164" +data-flex-basis="395px" +></li> +<li><a class="link" href="https://kuenzi.dev/toothbrush/" target="_blank" rel="noopener" +>破解“智能”牙刷</a> 国外一个博主记录了他破解自己的电动牙刷的过程。由于牙刷的NFC芯片采用的加密方式是密码加密,并且在通讯过程中是用了明文传递,所以他采取了截获通讯信号的方式窃听到了密码,然后就解锁了各种姿势开始为所欲为了。。。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-22-42.png" +width="606" +height="363" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="400px" +></li> +<li><a class="link" href="https://bjoernkarmann.dk/project/paragraphica" target="_blank" rel="noopener" +>真·AI相机</a> ,paragraphica 是一个没有镜头但是却有物理实体的“AI相机”,使用位置、时间等参数数据生成特定地点和时刻的prompt,然后由人工智能来生成“照片”。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-24-07.png" +width="578" +height="513" +loading="lazy" +class="gallery-image" +data-flex-grow="112" +data-flex-basis="270px" +></li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://www.dora.run/ai" target="_blank" rel="noopener" +>Droa</a>,一个通过自然语言进行网站开发的工具,你只需要提需求,剩下的交给AI。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-26-05.png" +width="821" +height="496" +loading="lazy" +class="gallery-image" +data-flex-grow="165" +data-flex-basis="397px" +></li> +<li><a class="link" href="https://github.com/SupaGruen/StableDiffusion-CheatSheet" target="_blank" rel="noopener" +>StableDiffusion-CheatSheet</a>,经常用 Stable Diffusion 进行 AI 绘图的,可以看下这个开源速查表。里面拥有超过 700 种经过测试的艺术风格,可快速搜索查找各类艺术家,并支持一键复制 Prompt。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-26-50.png" +width="742" +height="521" +loading="lazy" +class="gallery-image" +data-flex-grow="142" +data-flex-basis="341px" +></li> +<li><a class="link" href="https://www.math.cmu.edu/~jmackey/151_128/bws_book.pdf" target="_blank" rel="noopener" +>你一直想知道的关于数学的一切</a>,此书是CMU数学科学系的博士生布兰登·W·沙利文撰写的,旨在引导读者进入抽象数学和证明写作的世界,帮助培养读者的数学思维和表达能力。主题涵盖集合、逻辑、归纳法、关系、函数、基数和组合数学等基础和工具。暂未有中文翻译。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-27-26.png" +width="724" +height="579" +loading="lazy" +class="gallery-image" +data-flex-grow="125" +data-flex-basis="300px" +></li> +<li><a class="link" href="https://github.com/eastlakeside/interpy-zh" target="_blank" rel="noopener" +>Python进阶</a>,是《Intermediate Python》的中文译本。2021最新目录版,实时更新托管在<a class="link" href="https://py.eastlakeside.cn" target="_blank" rel="noopener" +>GithubPages</a>。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-28-23.png" +width="1037" +height="350" +loading="lazy" +class="gallery-image" +data-flex-grow="296" +data-flex-basis="711px" +></li> +<li><a class="link" href="https://csspro.com/" target="_blank" rel="noopener" +>CSSPro</a>,一个所见即所得的在线CSS可视化开发工具,直接在页面运行,那里修改点哪里。效果真的很惊艳。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-29-07.png" +width="921" +height="537" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="411px" +></li> +<li><a class="link" href="https://github.com/makeplane/plane" target="_blank" rel="noopener" +>Plane</a>,开源版 JIRA !不少软件开发者都使用JIRA进行缺陷管理,JIRA确实很强大,也很好用。现在,开源版的来了,据说完全可以作为JIRA的平替。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-30-19.png" +width="1139" +height="595" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="459px" +></li> +<li><a class="link" href="https://openmlsys.github.io/index.html" target="_blank" rel="noopener" +>机器学习系统:设计和实现</a>,一本关于机器学习的电子书,本书希望做成世界上第一本全面讲述机器学习系统知识的开源书籍。可以看作一门衔接机器学习和计算机系统的课程 ​​。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-31-04.png" +width="234" +height="390" +loading="lazy" +class="gallery-image" +data-flex-grow="60" +data-flex-basis="144px" +></li> +<li><a class="link" href="https://callannie.ai/" target="_blank" rel="noopener" +>Callanie</a>,练习英语口语的AI对话机器人,支持国内手机号注册,免费且流畅。后端基于大语言模型,可以陪你聊各种话题。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-31-49.png" +width="303" +height="570" +loading="lazy" +class="gallery-image" +data-flex-grow="53" +data-flex-basis="127px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 034 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/Wed, 31 May 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/<h1 id="机器文摘-第-034-期">机器文摘 第 034 期</h1> +<h2 id="研究">研究</h2> +<ul> +<li><a class="link" href="https://samwho.dev/memory-allocation/" target="_blank" rel="noopener" +>图解内存分配</a>,文章展示了 C/C++ 编程中的内存分配过程,包括静态和动态内存分配技术、它们的优势,以及有效的内存管理所需考虑的事项。以图解的形式展示了内存分配过程,希望读者可以通过本文更好地理解内存分配相关的概念,并在实际编程中对内存进行更加高效的管理。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-49-39.png" +width="759" +height="298" +loading="lazy" +class="gallery-image" +data-flex-grow="254" +data-flex-basis="611px" +></li> +<li><a class="link" href="https://blog.koehntopp.info/2023/05/17/50-years-in-filesystems-towards-2004-lfs.html" target="_blank" rel="noopener" +>文件系统五十年</a>,这是一个系列文章,详细记录了计算机文件系统的发展历程。也许我们身在其中无法感受到它的进步,但是回顾历史我们会发现,即便是我们不容易注意到的部分,也在不停地发展和优化。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-50-33.png" +width="672" +height="413" +loading="lazy" +class="gallery-image" +data-flex-grow="162" +data-flex-basis="390px" +></li> +<li><a class="link" href="https://xorvoid.com/sectorc.html" target="_blank" rel="noopener" +>只有512字节的C编译器</a>,这篇文章介绍了一个怎样实现最小编译器的思路,SectorC (github) 是一个用 x86-16 汇编编写的 C 编译器,适合 x512 机器的 86 字节引导扇区。它支持 C 的子集,足够大,可以编写真实有趣的程序。它很可能是有史以来最小的C编译器。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-51-20.png" +width="764" +height="366" +loading="lazy" +class="gallery-image" +data-flex-grow="208" +data-flex-basis="500px" +></li> +<li><a class="link" href="https://www.amygoodchild.com/blog/computer-art-50s-and-60s" target="_blank" rel="noopener" +>上世纪50~60年代的计算机艺术</a>,数字艺术的发展简史。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-51-53.png" +width="781" +height="494" +loading="lazy" +class="gallery-image" +data-flex-grow="158" +data-flex-basis="379px" +></li> +<li><a class="link" href="" >win10的隐藏功能</a>,原来win10还有这个功能。按Ctrl + Alt + Del 后,按住Ctrl不松,再点击右下角的电源符号,就会进入紧急重启(Emergency Restart)界面。应该是一种强制重启。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-52-04.png" +width="690" +height="518" +loading="lazy" +class="gallery-image" +data-flex-grow="133" +data-flex-basis="319px" +></li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/SevaSk/ecoute" target="_blank" rel="noopener" +>Ecoute</a>,可用于远程面试作弊的工具?Ecoute 是一种实时转录工具,可在文本框中为用户的麦克风输入(您)和用户的扬声器输出(扬声器)提供实时翻译。它还使用 OpenAI 的 GPT-3.5 生成建议答复内容,供用户“参考”。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-52-39.png" +width="820" +height="386" +loading="lazy" +class="gallery-image" +data-flex-grow="212" +data-flex-basis="509px" +></li> +<li><a class="link" href="https://app.rask.ai/" target="_blank" rel="noopener" +>rask.ai</a>,自动将视频转成“译制片”,在对内容进行翻译的同时,会尽量保持之前的音色和语调,端到端给你的视频完成多语配音,后续还会推出唇形同步合成。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-53-28.png" +width="1171" +height="644" +loading="lazy" +class="gallery-image" +data-flex-grow="181" +data-flex-basis="436px" +></li> +<li><a class="link" href="https://chrome.google.com/webstore/detail/tango-how-to-guides-and-s/lggdbpblkekjjbobadliahffoaobaknh" target="_blank" rel="noopener" +>Tango</a>,一个Chrome浏览器插件,能帮你生成一个网站的操作指南。它会自动记录所有的操作流程,并做相应的截图和注解文档。你只需要点一遍就行了。目前还只能生成英文版的,不过自己翻译也不麻烦。可以节省不少时间。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-53-58.png" +width="632" +height="390" +loading="lazy" +class="gallery-image" +data-flex-grow="162" +data-flex-basis="388px" +></li> +<li><a class="link" href="https://praeclarum.org/2023/05/19/webgpu-torch.html" target="_blank" rel="noopener" +>WebGPU-torch</a>,PyTroch的webgpu实现。我测试了一下,我的浏览器目前还不支持。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-54-28.png" +width="1384" +height="796" +loading="lazy" +class="gallery-image" +data-flex-grow="173" +data-flex-basis="417px" +></li> +<li><a class="link" href="http://ogden.basic-english.org/" target="_blank" rel="noopener" +>basic-english</a>,“基础英语”的概念是:25,000个单词的牛津袖珍英语词典去掉冗余,并消除组合单词,90%的概念可以用850个单词来实现。使用这些基础英语可以简化日常工作和交流。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-55-26.png" +width="778" +height="516" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="361px" +></li> +<li><a class="link" href="https://github.com/raunofreiberg/interfaces" target="_blank" rel="noopener" +>Web界面准则</a>,讲解如何提升网页界面的交互性、排版、动画、辅助功能、优化和设计。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-56-18.png" +width="834" +height="466" +loading="lazy" +class="gallery-image" +data-flex-grow="178" +data-flex-basis="429px" +></li> +<li><a class="link" href="https://github.com/excalidraw/excalidraw" target="_blank" rel="noopener" +>excalidraw</a>,开源虚拟手绘风格白板程序,支持端到端加密在线协作。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-56-43.png" +width="759" +height="504" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="361px" +></li> +</ul> +<h2 id="沉思录">沉思录</h2> +<ul> +<li>一切商业的本质都是:收购一些东西(包括原材料、人力服务),经过加工(加工过程产生价值)后变成产品或服务出售。这里的原材料可以是实体物品也可以是信息。所以关键动作就是:收、加工、出售,从重要性上来说,出售大于加工大于收。所以如果要策划自己的产品,解决和分析问题的优先级也应如此,我之前想的正好一反;</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 033 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/Wed, 24 May 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/<h1 id="机器文摘-第-033-期">机器文摘 第 033 期</h1> +<h2 id="研究">研究</h2> +<h3 id="全键盘信息终端">全键盘信息终端</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/2023-05-24-09-22-11.png" +width="1335" +height="637" +loading="lazy" +class="gallery-image" +data-flex-grow="209" +data-flex-basis="502px" +> +我一直很怀念使用黑莓手机的日子。</p> +<p>物理全键盘的手感比起现在硬邦邦的触摸屏真不知道好到哪里去了。</p> +<p>多少次盯着抽屉里的黑莓尸体,都在想有没有办法再次发挥它的余热。</p> +<p>现在机会来了,有人将树莓派和黑莓手机的全键盘(带触摸板的那一款)结合起来做了一个终端。</p> +<p>取名:<a class="link" href="https://beepberry.sqfmi.com/" target="_blank" rel="noopener" +>Beepberry</a>,具有400*200分辨率的LCD屏幕,和usb type-c接口。</p> +<h3 id="自己动手给树莓派写操作系统">自己动手给树莓派写操作系统</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/2023-05-24-09-31-09.png" +width="677" +height="359" +loading="lazy" +class="gallery-image" +data-flex-grow="188" +data-flex-basis="452px" +> +学习操作系统的最佳手段是自己动手写一个。</p> +<p>这类教程很多,一般都是针对x86平台,树莓派的比较少见。</p> +<p><a class="link" href="https://github.com/isometimes/rpi4-osdev" target="_blank" rel="noopener" +>《给树莓派编写“裸机”操作系统》</a>来自github上的一个开源项目。</p> +<p>可以带你从树莓派的硬件层基础上直接构建一个的完整操作系统。</p> +<h3 id="关于-demoscene-制作的一些文章">关于 Demoscene 制作的一些文章</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/2023-05-24-09-40-25.png" +width="471" +height="314" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="360px" +> +Demoscene(也称为Demo Party)是一种计算机艺术形式,旨在展示计算机的音频和图形表现能力。Demoscene通常是由小团队制作的演示性程序,也被称为demo,它集计算机程序、音乐、图形和动画于一身,是八十年代初期在个人计算机上发展起来的一种文化和艺术运动。Demoscene的主要目的是展示计算机和程序的美感,通常使用3D渲染和其他复杂的视觉效果,展示计算机的高级图形和音频处理能力。</p> +<p>我对于如何制作这些炫酷的 demo 一直很感兴趣,但是网上关于这方面的资料非常少,成体系的就更少了。</p> +<p>这里收录了一些比较经典的相关资料:</p> +<ol> +<li> +<p><a class="link" href="https://www.ctrl-alt-test.fr/2023/procedural-3d-mesh-generation-in-a-64kb-intro/" target="_blank" rel="noopener" +>64kb的demos</a>介绍了基于SDF(Signed Distance Field,有符号距离场)生成三维网格的方法,这个方法是大部分demo用于在三维场景中产生三维模型的主要方法。</p> +</li> +<li> +<p><a class="link" href="https://www.flipcode.com/archives/The_Art_of_Demomaking-Issue_01_Prologue.shtml" target="_blank" rel="noopener" +>The_Art_of_Demomaking</a>是一套很系统的教程,讲述Demo的概念、发展历史以及制作过程需要了解的基础知识。</p> +</li> +<li> +<p><a class="link" href="https://www.pbr-book.org/3ed-2018/contents" target="_blank" rel="noopener" +>pbr-book</a>是一本关于基于物理的渲染(Physically Based Rendering,简称PBR)的经典教材。内容包括计算机图形学相关的基础概念、渲染算法、工作流程和高级特性等。</p> +</li> +</ol> +<h3 id="怎样防止针对llm的prompt攻击">怎样防止针对LLM的prompt攻击</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/2023-05-24-09-52-09.png" +width="734" +height="401" +loading="lazy" +class="gallery-image" +data-flex-grow="183" +data-flex-basis="439px" +> +就像之前流行的sql注入攻击,针对大语言模型的提示语注入攻击现在变得也很常见。</p> +<p>一种比较典型的攻击场景是,通过一段特定的提示语,解锁chatGPT原本被封印的能力。</p> +<p>或者对于接入了其他工具接口的语言模型,通过特定的提示语让其执行危险操作(如:删除所有信息)。</p> +<p>这对于使用者来说可能危害不大,但对于服务的提供者是一个不小的挑战。</p> +<p><a class="link" href="https://simonwillison.net/2023/Apr/25/dual-llm-pattern/" target="_blank" rel="noopener" +>《用于构建可以抵抗即时注入的 AI 助手的双 LLM 模式》</a>提出了一种可能可行的解决方案。</p> +<p>即使用双模型的配置,协同工作,将具有执行危险操作的特权模型放在另一个模型后面,中间使用过滤器进行风险审查,即未被审查的内容永远不会发送到特权模型。</p> +<h2 id="资源">资源:</h2> +<ul> +<li><a class="link" href="https://gamma.app/" target="_blank" rel="noopener" +>gamma</a>,AI帮你做PPT。支持自然语言描述需要生成的内容,自动给出ppt的大纲和每页基本的排版布局; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/2023-05-24-10-00-52.png" +width="742" +height="687" +loading="lazy" +class="gallery-image" +data-flex-grow="108" +data-flex-basis="259px" +></li> +<li><a class="link" href="https://www.3blue1brown.com/" target="_blank" rel="noopener" +>3blue1brown</a>,YouTube上最好的数学科普视频,特点是使用动画直观展示计算原理; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/2023-05-24-10-01-29.png" +width="953" +height="611" +loading="lazy" +class="gallery-image" +data-flex-grow="155" +data-flex-basis="374px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 032 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/Tue, 16 May 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/<h1 id="机器文摘-第-032-期">机器文摘 第 032 期</h1> +<h2 id="长文">长文</h2> +<h3 id="ai歌手的训练与使用">AI歌手的训练与使用</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-14-33-53.png" +width="1011" +height="641" +loading="lazy" +class="gallery-image" +data-flex-grow="157" +data-flex-basis="378px" +> +最近火了很多AI歌手(即:用AI模型模仿某位歌手的声音),其中b站上AI孙燕姿演唱的《漠河舞厅》、《撒日朗》等歌曲播放已超百万。</p> +<p>为了研究实现原理,我也找到了开源工具体验了一下。</p> +<p>具体步骤主要总结如下:</p> +<ol> +<li>选定某一个歌手,找到具有代表性的几首歌曲,通过<a class="link" href="https://ultimatevocalremover.com/" target="_blank" rel="noopener" +>Ultimate Vocal Remover</a>软件利用AI做人声和伴奏的分离,主要用于获取干净的纯人声用于模型训练。(不得不说现在基于AI模型的人声、伴奏分离做的是真的强,可以做到非常干净的提取,让你感觉像是原始独立的音轨)。</li> +<li>通过安装<a class="link" href="https://github.com/voicepaw/so-vits-svc-fork" target="_blank" rel="noopener" +>so-vits-svc-fork</a>这个一体化开源工具进行模型训练,具体方法见<a class="link" href="https://github.com/voicepaw/so-vits-svc-fork/blob/main/README_zh_CN.md" target="_blank" rel="noopener" +>so-vits-svc-fork的Readme</a>,从数据预处理到最后的模型导出和推理都已经做好了,甚至还提供了图形界面。</li> +<li>继续使用so-vits-svc-fork提供的gui界面进行操作,将模型载入,将预期修改歌曲的原唱人声(提取方式同第1步)传入,运行推理获得定制的人声(注意看文档的各种参数)。</li> +<li>将第3步推理所得干净人声,跟原唱分离的干净背景音乐进行混音合成,即可获得一首新歌曲了。</li> +</ol> +<h3 id="怎样用口袋计算器玩耍">怎样用口袋计算器玩耍</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-14-49-14.png" +width="716" +height="514" +loading="lazy" +class="gallery-image" +data-flex-grow="139" +data-flex-basis="334px" +> +在移动互联网时代,人打发无聊的方式实在是太多了,视频聊天、阅读各种资讯八卦、观看短视频、手游等等。</p> +<p>功能机的时代,我有印象的打发无聊的事情是手机上的贪食蛇、发短信、wap资讯等等,也算不错了。</p> +<p>如果时间来到上世纪七十年代呢?那个时代的没有随身携带的手机,怎么打发时间?</p> +<p>答案是:如果有一个随身携带的计算器也行,这里有一本书<a class="link" href="https://archive.org/details/htewypc" target="_blank" rel="noopener" +>《How To Entertain With Your Pocket Calculator》</a>,出版于上世纪七十年代。书中花了大量的篇幅介绍了很多种基于数字的游戏,我翻看了一下,我觉得可能得无聊到一定的程度我才能愿意玩书里的游戏。</p> +<h3 id="llm的几篇介绍文章">LLM的几篇介绍文章</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-14-56-38.png" +width="703" +height="332" +loading="lazy" +class="gallery-image" +data-flex-grow="211" +data-flex-basis="508px" +> +Large Language Model (LLM) 即大规模语言模型,是一种基于深度学习的自然语言处理模型,它能够学习到自然语言的语法和语义,从而可以生成人类可读的文本。 +与其感叹以chatGPT为代表的大语言模型发展太快,不如静下心来,读一读关于LLM的一些基础知识和使用方法,我找了三篇比较有代表性的放在这里收藏。</p> +<ol> +<li><a class="link" href="https://github.com/RUCAIBox/LLMSurvey/blob/main/assets/LLM_Survey_Chinese_0418.pdf" target="_blank" rel="noopener" +>大语言模型综述</a>,认真地概括并解释了什么是LLM和它的基本原理。</li> +<li><a class="link" href="https://www.bmpi.dev/dev/deep-learning/nlp-language-models/" target="_blank" rel="noopener" +>ChatGPT背后的语言模型简史</a>,从发展历史上捋一捋各种语言模型的辈分。</li> +<li><a class="link" href="https://github.com/datawhalechina/prompt-engineering-for-developers" target="_blank" rel="noopener" +>prompt-engineering-for-developers</a>一个中文版的 Prompt Engineering 教程,翻译自:吴恩达《ChatGPT Prompt Engineering for Developers》课程,主要内容为指导开发者如何构建 Prompt 并基于 OpenAI API 构建新的、基于 LLM 的应用;</li> +<li><a class="link" href="https://github.com/ninehills/ninehills.github.io/issues/92" target="_blank" rel="noopener" +>大语言模型微调技术笔记</a>,记录了基于 LLM 进行微调训练的实战技巧。</li> +</ol> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://sinerider.com/" target="_blank" rel="noopener" +>sinerider</a>,一个很有创意的数学学习游戏,让你通过数学函数构建图像从而帮助画面中的角色到达目标地点。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-15-04-41.png" +width="810" +height="708" +loading="lazy" +class="gallery-image" +data-flex-grow="114" +data-flex-basis="274px" +></li> +<li><a class="link" href="https://anvaka.github.io/map-of-github/#0.87/0/16.7" target="_blank" rel="noopener" +>map-of-github</a>,以节点地图的方式展示Github上面超过40万个仓库,通过虚拟大陆的方式展示他们之间的关系。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-15-07-40.png" +width="1274" +height="682" +loading="lazy" +class="gallery-image" +data-flex-grow="186" +data-flex-basis="448px" +></li> +<li><a class="link" href="https://learngitbranching.js.org/?locale=zh_CN" target="_blank" rel="noopener" +>learngitbranching</a>,以交互式游戏的方式学习git命令。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-15-11-32.png" +width="569" +height="598" +loading="lazy" +class="gallery-image" +data-flex-grow="95" +data-flex-basis="228px" +></li> +<li><a class="link" href="https://vgamuseum.ru/" target="_blank" rel="noopener" +></a>,在线显卡博物馆,收藏了1982年到2012年之间发布的各款显卡,包括高清图片和规格参数的介绍; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-15-14-37.png" +width="1364" +height="571" +loading="lazy" +class="gallery-image" +data-flex-grow="238" +data-flex-basis="573px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 031 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/Wed, 10 May 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/<h1 id="机器文摘-第-031-期">机器文摘 第 031 期</h1> +<h2 id="长文">长文</h2> +<h3 id="怎样驱动上个世纪的网络摄像头">怎样驱动上个世纪的网络摄像头</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-09-20-31.png" +width="697" +height="407" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="411px" +> +国外有个老哥,在帮朋友收拾废品的时候,获得了一个老旧的摄像头。</p> +<p>于是他按耐不住想感受一下,这个来自上个世纪的“古董”,还能打吗?</p> +<p>由于年代比较久远,厂家也不再提供驱动程序的更新。</p> +<p>哥们不得不在虚拟机里全新安装一个windows xp,成功启动摄像头,并获得“清晰图像”。</p> +<p>安装xp时有个插曲:安装界面里的进度条仅用时几十秒就走完了原本几十分钟的倒计时(所以说微软的进度条是如何推断剩余时间的永远是个迷)。</p> +<p>在经过一番体验之后,又跃跃欲试准备自己给它手搓一个在现代操作系统下的驱动程序。</p> +<p>整个过程记录在<a class="link" href="https://blog.benjojo.co.uk/post/quickcam-usb-userspace-driver" target="_blank" rel="noopener" +>《一个1999年的摄像头复活的故事》</a>。</p> +<p>整个故事都充满了一种“我不知道这么做有什么意义,但是我就是可以”的极客风格(也是我收录它的主要原因)。</p> +<h3 id="webgpu-科普">webGPU 科普</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-09-36-36.png" +width="673" +height="338" +loading="lazy" +class="gallery-image" +data-flex-grow="199" +data-flex-basis="477px" +> +最近谷歌浏览器率先宣布全面支持 webGPU ,预计到今年年底各大浏览器也都会跟进并提供支持。</p> +<p>webGPU 从名字上看跟显卡和浏览器有关,可是之前已经有webgl了,这次又有什么变化?</p> +<p>通过多方面信息的搜索,我得到的结论是:webGPU 更充分地暴露了显卡的计算能力,GPU不再只是做图形渲染相关的事情,而是根据webGPU提供的相关专业接口,可以执行深度学习之类的更通用的计算工作。</p> +<p>如果想了解的更全面一些,这篇<a class="link" href="https://cohost.org/mcc/post/1406157-i-want-to-talk-about-webgpu" target="_blank" rel="noopener" +>《谈谈 webGPU》</a>文章十分值得一读。</p> +<p>作者对 webGPU 这一技术介绍的比较详尽,从各个图形接口的发展历史一直到对未来如何应用的展望,都包括了。</p> +<h3 id="如何翻译一本书">如何翻译一本书</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-09-49-38.png" +width="709" +height="354" +loading="lazy" +class="gallery-image" +data-flex-grow="200" +data-flex-basis="480px" +> +<a class="link" href="https://sspai.com/post/79534" target="_blank" rel="noopener" +>《从不自量力到 AI 助力,我如何翻译完一整本英文书》</a> +这是一个关于执行力的故事。</p> +<p>主题是:如何借助AI和现代信息工具,实现看似不可能完成的任务。</p> +<p>在这个时代,个体的力量很渺小,因为个人几乎无法独立完成任何事情。</p> +<p>但同时,借助科技工具和基础设施的力量,1 个人甚至可以完成之前需要一个上百人公司才能做到的事情,这让个体变得非常强大。</p> +<h3 id="如何刷路由器">如何刷路由器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-00-09.png" +width="600" +height="417" +loading="lazy" +class="gallery-image" +data-flex-grow="143" +data-flex-basis="345px" +> +<a class="link" href="https://www.v2ex.com/" target="_blank" rel="noopener" +>V站</a>上说,中年技术男有三大爱好:钓鱼、NAS、软路由。</p> +<p><del>我一样也没沾边儿,但还是克制不住关注相关技术。</del></p> +<p>之前多次想拿自己家的路由器开刀,刷一个openwrt系统,然后就可以各种折腾(科学上网、内网穿透等等)了。</p> +<p>但是一直没有动手,今天看到这篇<a class="link" href="https://a-wing.top/linux/2023/05/01/start-openwrt" target="_blank" rel="noopener" +>自己动手定制你的路由器</a>写的如此详细,还是心动了一下。</p> +<p>先收藏吧。</p> +<h3 id="仅用csshtml实现三维动画">仅用CSS+HTML实现三维动画</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-06-52.png" +width="632" +height="161" +loading="lazy" +class="gallery-image" +data-flex-grow="392" +data-flex-basis="942px" +> +CSS 的 <code>translate3d</code>用到的不多。</p> +<p>如果使用巧妙的话,可以帮你实现很出彩的 3D 动画效果,国外有高手在给自己的文章配数学公式的时候,利用CSS制作了一些可以动态显示的公式图表。这篇<a class="link" href="https://x.st/spinning-diagrams-with-css/" target="_blank" rel="noopener" +>CSS 3D图表</a>记录了它们的实现细节和技术原理。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://www.window-swap.com/Window" target="_blank" rel="noopener" +>window-swap</a>,随机看别人家的窗外景色。这个网站每次刷新都随机显示一个网友共享的摄像头视角,一般是自家的窗外。可以随时体验全球各地的邻家风景。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-14-06.png" +width="1371" +height="929" +loading="lazy" +class="gallery-image" +data-flex-grow="147" +data-flex-basis="354px" +></li> +<li><a class="link" href="https://www.landiannews.com/archives/98512.html" target="_blank" rel="noopener" +>foobar2000</a>,经典的音乐播放器终于更新了。2002年发布的foobar2000播放器曾经是很多发烧友的最爱,如今过了20多年,居然更新了2.0稳定版,值得收藏; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-15-52.png" +width="743" +height="504" +loading="lazy" +class="gallery-image" +data-flex-grow="147" +data-flex-basis="353px" +></li> +<li><a class="link" href="https://lost-at-sql.therobinlord.com/" target="_blank" rel="noopener" +>lost-at-sql</a>,一个在线学习 sql 的交互游戏,通过游戏闯关的方式练习 sql 技能; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-18-25.png" +width="745" +height="484" +loading="lazy" +class="gallery-image" +data-flex-grow="153" +data-flex-basis="369px" +></li> +<li><a class="link" href="https://glsl-exercises.simondev.io/lesson/1/1#welcome" target="_blank" rel="noopener" +>glsl-exercises</a>,在线学习glsl的交互课程,通过交互式页面练习 glsl 编写; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-19-48.png" +width="1858" +height="794" +loading="lazy" +class="gallery-image" +data-flex-grow="234" +data-flex-basis="561px" +></li> +<li><a class="link" href="https://www.gameuidatabase.com/" target="_blank" rel="noopener" +>gameuidatabase</a>,一个游戏界面资源网站,各种游戏的界面截图,可以用来“借鉴”?; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-20-48.png" +width="1078" +height="567" +loading="lazy" +class="gallery-image" +data-flex-grow="190" +data-flex-basis="456px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 030 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/Wed, 26 Apr 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/<h1 id="机器文摘-第-030-期">机器文摘 第 030 期</h1> +<p><em>下周五一假期,休息,不更新。</em></p> +<h2 id="长文">长文</h2> +<h3 id="内网穿透的原理及实现">内网穿透的原理及实现</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-09-42-27.png" +width="1040" +height="515" +loading="lazy" +class="gallery-image" +data-flex-grow="201" +data-flex-basis="484px" +></p> +<blockquote> +<p>设想这样一个问题:在北京和上海各有一台局域网的机器(例如一台是家里的台式机,一 台是连接到星巴克 WiFi 的笔记本),二者都是私网 IP 地址,但可以访问公网, 如何让这两台机器通信呢?</p> +</blockquote> +<p>IPv4地址即将枯竭,IPv6技术还没有普及,现在很多家庭宽带都不再分配公网IP地址。这就意味着大部分的个人电脑是无法通过互联网被直接访问的(当然,你可以通过你家wifi或者4G信号访问互联网,但是反过来不行)。</p> +<p>可是这种需求又真实存在,比如我就经常希望能够在任何地方访问我家里的电脑,通过远程桌面进行办公、文件共享等等。</p> +<p>最简单的方法是通过购买一台具有公网IP地址的云主机来实现中继,这也是目前最普遍的方式。</p> +<p>不过阅读完这篇<a class="link" href="https://arthurchiao.art/blog/how-nat-traversal-works-zh/" target="_blank" rel="noopener" +>《NAT 穿透是如何工作的:技术原理及企业级实践》</a>,假如你有很强的动手能力的话,就应该可以实现一套完全不需要公网主机进行中继的“企业级内网穿透工具”。</p> +<p>文章很长,来自<a class="link" href="https://tailscale.com/blog/how-nat-traversal-works/" target="_blank" rel="noopener" +>这篇英文博客</a>。</p> +<h3 id="技术写作指南">技术写作指南</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-09-53-51.png" +width="437" +height="205" +loading="lazy" +class="gallery-image" +data-flex-grow="213" +data-flex-basis="511px" +> +曾经在翻阅《程序员的数学》这本书的时候被朋友看到,于是诞生了短暂的讨论。</p> +<p>当时我的观点是,作为程序员一定要掌握好数学,即便现在编程过程中已经不怎么用到特别底层的知识,但也应该多训练数学思维。</p> +<p>朋友当时说了一句话让我记忆犹新。</p> +<p>“比起程序员的数学,我更担忧的是程序员的语文。”</p> +<p>确实,写作这项能力在很多技术人员心里是被低估的。</p> +<p>不少人受尽写技术文档的折磨,于是越发讨厌写作。</p> +<p>这篇<a class="link" href="https://www.yuque.com/serviceup/misc/cn-writing-for-engineers" target="_blank" rel="noopener" +>《作为工程师应该如何写作》</a>真是雪中送炭,总结了很多立即就能见效的技术写作方法,希望可以帮助到工程师朋友。</p> +<h3 id="怎样制作好玩的小游戏">怎样制作好玩的小游戏</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-09-57-29.png" +width="512" +height="512" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +> +很多人都有自己开发游戏的冲动。</p> +<p>不过很容易掉进各种复杂的引擎和工具的坑里。</p> +<p>然后感到沮丧,忘了想做游戏的初心。</p> +<p>这篇<a class="link" href="http://farawaytimes.blogspot.com/2023/02/how-to-make-good-small-games.html" target="_blank" rel="noopener" +>《怎样制作好玩的小游戏》</a>可以让你重新焕发精神。</p> +<p>作者认为开发那种不用复杂引擎的小游戏也可以很欢乐,只要有足够的游戏性。</p> +<p>他在文章中详细列举了想要制作出真正具有游戏性的小游戏所必须具备的几点关键特性。</p> +<p>看得出来,作者是懂游戏的。</p> +<h3 id="神奇的一页纸知识管理">神奇的一页纸知识管理</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-10-03-34.png" +width="1220" +height="841" +loading="lazy" +class="gallery-image" +data-flex-grow="145" +data-flex-basis="348px" +></p> +<blockquote> +<p>宇航员在太空中找到的方法一定不会错,因为他要是出错就没命了。 +航天员的秘密武器,One Pager。就是把一个专项的知识,都写和画在一页纸上。日积月累,宇航员有了一本手册,里面都是一页一页的one pager。 +我向来对知识管理的各种方法很有兴趣。</p> +</blockquote> +<p>在网上闲逛时看到这篇<a class="link" href="https://www.zhongwen.ai/fantastic-one-pager/" target="_blank" rel="noopener" +>《神奇的One Pager》</a>,讲述了一种通过一页纸进行知识管理的方法。</p> +<p>热爱学习的人可不能错过。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/chidiwilliams/buzz" target="_blank" rel="noopener" +>buzz</a>,Transcribe and translate audio offline on your personal computer. Powered by OpenAI&rsquo;s Whisper. +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-08-48-07.png" +width="827" +height="431" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="460px" +></li> +<li><a class="link" href="https://moonvy.com/apps/ops/" target="_blank" rel="noopener" +>可视化提示词拼装</a>,文生图的AI越来越多,自己也可以在本地搭建服务,可是为什么我自己生成的图片那么丑呢?这个工具也许可以帮你生成一些靠谱的提示词。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-08-50-22.png" +width="991" +height="418" +loading="lazy" +class="gallery-image" +data-flex-grow="237" +data-flex-basis="568px" +></li> +<li><a class="link" href="https://liaokong.gitbook.io/llm-kai-fa-jiao-cheng/" target="_blank" rel="noopener" +>LangChain 中文入门教程</a>,众所周知 OpenAI 的 API 无法联网的,所以如果只使用自己的功能实现联网搜索并给出回答、总结 PDF 文档、基于某个 Youtube 视频进行问答等等的功能肯定是无法实现的。所以,我们来介绍一个非常强大的第三方开源库:LangChain 。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-08-51-08.png" +width="1103" +height="493" +loading="lazy" +class="gallery-image" +data-flex-grow="223" +data-flex-basis="536px" +></li> +<li><a class="link" href="https://oimo.io/works/clock/" target="_blank" rel="noopener" +>clock</a>,一个非常酷的网页时钟显示效果。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-08-51-53.png" +width="999" +height="586" +loading="lazy" +class="gallery-image" +data-flex-grow="170" +data-flex-basis="409px" +></li> +<li><a class="link" href="https://webgpufundamentals.org/" target="_blank" rel="noopener" +>WebGPU 理论基础</a>,从基础理论开始学习WebGPU,稳! +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-08-53-56.png" +width="688" +height="743" +loading="lazy" +class="gallery-image" +data-flex-grow="92" +data-flex-basis="222px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 029 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/Wed, 19 Apr 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/<h1 id="机器文摘-第-029-期">机器文摘 第 029 期</h1> +<h2 id="长文">长文</h2> +<h3 id="计算机的中断机制是如何实现的">计算机的“中断”机制是如何实现的?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-09-37-58.png" +width="1008" +height="682" +loading="lazy" +class="gallery-image" +data-flex-grow="147" +data-flex-basis="354px" +> +稍微了解过计算机原理的朋友都知道,计算机是通过“中断”的机制实现对键盘输入、鼠标移动、硬盘读写等操作的。</p> +<p>让我给小朋友讲解这些基本的知识时,我也可以侃侃而谈,说上半个小时不带重复。</p> +<p>但是真要解释“中断”的机制是如何实现的,我想即便是现在科班出身的本科生也未必能够说明白。</p> +<p>原因我觉得除了缺少实践之外,也跟大部分书上的理论内容离实际工程较远有关。</p> +<p>这篇<a class="link" href="https://r12f.com/posts/interrupts/" target="_blank" rel="noopener" +>漫谈中断</a>从实际的硬件实例(x86)出发,详细介绍了中断的实现机制,普及了“外部中断”、“内部中断”、“软中断”等概念,以及人们怎样通过“中断控制器”逐渐解决了多设备中断处理的问题。是一篇很值得阅读的科普文章。适合对计算机组成原理、操作系统等技术有兴趣的朋友阅读。</p> +<h3 id="怎样提升软件项目的可维护性">怎样提升软件项目的可维护性?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-09-54-43.png" +width="576" +height="242" +loading="lazy" +class="gallery-image" +data-flex-grow="238" +data-flex-basis="571px" +> +不同的项目团队对于软件项目的可维护性所做出的努力不同。</p> +<p>有不少团队宁愿在修改bug上加班加点,也不愿意为可维护性多花一丁点精力。</p> +<p>不过,如果你要开始一个新的软件项目或者想要改善一个已经存在的项目的可维护性。</p> +<p>这里有一份<a class="link" href="https://hix.dev/tutorials/general/software-project-checklist" target="_blank" rel="noopener" +>软件项目可维护性检查清单</a>可以参考。</p> +<p>作者主要从版本控制、软件测试、静态分析、依赖库管理、多语言支持、多平台支持、开发环境管理等方面给出了可以改进的行动清单,以及基于开源工具的最佳实践建议。</p> +<h3 id="怎样榨干chatgpt">怎样榨干chatGPT?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-06-59.png" +width="1024" +height="1024" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +> +ChatGPT是由OpenAI训练的一款大型语言模型,能够和你进行任何领域的对话。</p> +<p>现在跟年初账号紧张的情况比起来已经方便了很多。</p> +<p>在这么多开源工具和套壳网站的帮助下,我想现在大部分人都能够比较方便的体验它了吧。</p> +<p>但是可能很多人还不知道如何更好的发挥它的作用。</p> +<p>有网友整理了一份开源的<a class="link" href="https://github.com/PlexPt/awesome-chatgpt-prompts-zh" target="_blank" rel="noopener" +>chatGPT中文调教指南</a>,内容极为详尽,可以帮你榨干chatGPT的全部潜能。</p> +<h3 id="怎样让ai作画理解你的意图">怎样让AI作画理解你的意图?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-17-26.png" +width="1536" +height="512" +loading="lazy" +class="gallery-image" +data-flex-grow="300" +data-flex-basis="720px" +> +对于现在强大的AI绘图应用,有些人可能会认为只输入一个单词就能生成一张很酷的图片。</p> +<p>然而,虽然AI模型越来越善于理解我们想要的内容,但它们还不能读懂我们的思想。</p> +<p>因此,如果你想生成一张看起来像你所想的那样的图片,你需要编写正确的提示。</p> +<p>这个<a class="link" href="https://boostpixels.com/short-guide" target="_blank" rel="noopener" +>AI绘图prompt编写指南</a>可以给你提供一些帮助。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://zh.ifixit.com/Guide" target="_blank" rel="noopener" +>维修指南</a>,各种设备的维修教程大全,详细到每一个步骤的照片,设备型号齐全; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-22-36.png" +width="977" +height="461" +loading="lazy" +class="gallery-image" +data-flex-grow="211" +data-flex-basis="508px" +></li> +<li><a class="link" href="https://shadertoy.com/view/msVXWD" target="_blank" rel="noopener" +>glsl-CNN</a>,有大神用glsl语言,仅通过webGL的片元着色器实现了一个手写识别的CNN神经网络。可以在浏览器直接体验,效果惊艳。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-31-02.png" +width="801" +height="479" +loading="lazy" +class="gallery-image" +data-flex-grow="167" +data-flex-basis="401px" +></li> +<li><a class="link" href="https://github.com/facebookresearch/dinov2" target="_blank" rel="noopener" +>dinov2</a>,Meta AI新发布的全能视觉模型,模型支持:图像分类、分割、图像检索和深度估计。比较厉害的地方在于它是一个自监督模型,直接从图像中学习特征,而不依赖文本描述,即可训练计算机视觉模型。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-31-37.png" +width="828" +height="236" +loading="lazy" +class="gallery-image" +data-flex-grow="350" +data-flex-basis="842px" +></li> +<li><a class="link" href="https://minigpt-4.github.io/" target="_blank" rel="noopener" +>minigpt-4</a>,GPT4 的图像支持迟迟不开放,这个开源的MiniGPT4 却已经做到了类似的多模态效果,官方演示看起来非常棒。只用了四张A100训练了10小时,模型甚至只有13B。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-33-47.png" +width="1289" +height="1484" +loading="lazy" +class="gallery-image" +data-flex-grow="86" +data-flex-basis="208px" +></li> +<li><a class="link" href="https://github.com/linyiLYi/street-fighter-ai" target="_blank" rel="noopener" +>street-fighter-ai</a>,有个B站UP主在GPT的帮助下, 写了个 强化训练的AI模型,终于打败了街霸里的 AI,实现了儿时的梦想。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-36-53.png" +width="1080" +height="760" +loading="lazy" +class="gallery-image" +data-flex-grow="142" +data-flex-basis="341px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 027 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/Wed, 12 Apr 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/<h1 id="机器文摘-第-027-期">机器文摘 第 027 期</h1> +<h2 id="长文">长文</h2> +<h3 id="搭建本地ai作图应用">搭建本地AI作图应用</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-13-51-53.png" +width="695" +height="392" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="425px" +> +AI对话机器人火爆的同时,去年由Stable-Diffusion模型引爆的AI作图技术也没有放慢进化的脚步。</p> +<p>这里面的佼佼者<a class="link" href="https://zh.wikipedia.org/zh-cn/Midjourney" target="_blank" rel="noopener" +>Midjourney</a>已经发展成了强大的图像生成系统。可以轻松定制出照片级图像,其效果足以乱真。</p> +<p>不过目前在国内使用Midjourney还比较麻烦,即便能够访问,使用量也会受限制,能否自己搭建一个呢?</p> +<p>答案是肯定的。</p> +<p>跟去年刚问世的时候不同,现在基于Stable-Diffusion模型的生态也已经十分完备,很多开源软件、框架、插件围绕这个模型开发。</p> +<p>利用这些软件可以快速在本地计算机上构建一套属于自己的图像生成服务。</p> +<p>这里有一篇博客以<a class="link" href="https://www.freedidi.com/8474.html" target="_blank" rel="noopener" +>手把手的方式教你如何在最快速的时间搭建自己的图像生成服务</a>。</p> +<p>里面还列举了一些微调好的定制模型下载地址,合理的使用这些模型,你会发现打开新世界的大门。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-14-02-07.png" +width="733" +height="799" +loading="lazy" +class="gallery-image" +data-flex-grow="91" +data-flex-basis="220px" +></p> +<h3 id="搭建本地chatgpt应用">搭建本地chatGPT应用</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-14-08-25.png" +width="779" +height="342" +loading="lazy" +class="gallery-image" +data-flex-grow="227" +data-flex-basis="546px" +> +本来不想再提chatGPT了,因为最近说的有些太多了。</p> +<p>但是无奈当前的开源生态对于语言模型是在是太追捧了,技术发展迅雷不及掩耳。</p> +<p>很快就出现了一批可以自己搭建的AI对话模型。</p> +<p>今天我挑两个我认为效果比较好的(且对中文支持比较好的)介绍一下。</p> +<p>注意,跟目前流行的基于OpenAI的接口进行套壳的程序不同。我说的是完全在本地搭建自己的服务。</p> +<p>第一个:<a class="link" href="https://chatglm.cn/blog" target="_blank" rel="noopener" +>ChatGLM-6B</a>,一个具有62亿参数的中英双语语言模型。通过使用与 ChatGLM(chatglm.cn)相同的技术,ChatGLM-6B 初具中文问答和对话功能,并支持在单张 2080Ti 上进行推理使用。</p> +<p>搭建过程比较简单,按照<a class="link" href="https://github.com/THUDM/ChatGLM-6B/blob/main/README.md" target="_blank" rel="noopener" +>README</a>文档中的步骤下载模型、执行脚本程序即可。</p> +<p>第二个:<a class="link" href="https://github.com/ymcui/Chinese-LLaMA-Alpaca" target="_blank" rel="noopener" +>中文 LLaMA &amp; Alpaca 大模型</a>,开源了中文LLaMA模型和经过指令精调的Alpaca大模型。这些模型在原版LLaMA的基础上扩充了中文词表并使用了中文数据进行二次预训练,进一步提升了中文基础语义理解能力。同时,在中文LLaMA的基础上,本项目使用了中文指令数据进行指令精调,显著提升了模型对指令的理解和执行能力。</p> +<p>搭建过程略微繁琐一些,需要通过自己的手段下载到开源的LLaMA原始模型(当然这对于技术人员来说不是问题)。</p> +<p>然后按照文档中的教程,执行模型合并、量化等脚本,最终通过开源程序LLaMA.cpp实现模型的本地运行。</p> +<h3 id="合作运行千亿参数级语言模型">合作运行千亿参数级语言模型</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-14-22-47.png" +width="492" +height="214" +loading="lazy" +class="gallery-image" +data-flex-grow="229" +data-flex-basis="551px" +> +按照众人划桨开大船的思路,之前在带宽不足的年代诞生了BT下载。</p> +<p>如今,当我们的本地显卡无法应付超大AI模型时,有人开始用同样的思路解决问题。</p> +<p><a class="link" href="https://petals.ml/" target="_blank" rel="noopener" +>Petals</a>就是这么一个分布式模型微调、运行的框架,可以让你轻松在家运行超过千亿参数的大模型(当然是在线跟大家一起协作)。</p> +<p>其原理是大家分别加载模型的一小部分,然后与其他人一起通过协同的方式进行推理或者微调。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-14-27-18.png" +width="1742" +height="680" +loading="lazy" +class="gallery-image" +data-flex-grow="256" +data-flex-basis="614px" +></p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://learningprompt.wiki/" target="_blank" rel="noopener" +>Prompt Engineering 教程</a>,一份教你如何更好使好地使用 ChatGPT 和其他 AI 产品的免费教程。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-14-43-13.png" +width="970" +height="466" +loading="lazy" +class="gallery-image" +data-flex-grow="208" +data-flex-basis="499px" +></li> +<li><a class="link" href="https://prompthero.com/" target="_blank" rel="noopener" +>Prompthero</a>,跟聊天机器人、绘图机器人交流的prompt大全,与上面的教程不同,这是一个模板库大全,有创作灵感但是不知道该如何描述的时候可以去参考一下。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-14-45-46.png" +width="759" +height="381" +loading="lazy" +class="gallery-image" +data-flex-grow="199" +data-flex-basis="478px" +></li> +<li><a class="link" href="https://civitai.com/" target="_blank" rel="noopener" +>Civitai</a>,与上面相同,不过专门用于图像生成,而且路子比较野,有大量的NSFW内容,要搭配Stable-Diffusion的各种微调模型使用。具体使用方法,可参考前文中介绍如何搭建本地图像生成服务的部分。</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 028 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/Wed, 12 Apr 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/<h1 id="机器文摘-第-028-期">机器文摘 第 028 期</h1> +<h2 id="长文">长文</h2> +<h3 id="极简代码理解-gpt-模型结构">极简代码理解 GPT 模型结构</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-09-37-14.png" +width="679" +height="607" +loading="lazy" +class="gallery-image" +data-flex-grow="111" +data-flex-basis="268px" +> +在<a class="link" href="https://twitter.com/karpathy/status/1645115622517542913" target="_blank" rel="noopener" +>twitter上有网友发布了一个简单的示例代码</a>,讲解了 GPT 语言模型的运行原理,为了方便大家理解,作者用了极简的模型设置,即语言文字只保留了1和0两个字符,上下文长度也仅为3,可以很直观地感受到训练过程是如何起作用的。</p> +<p>作者<a class="link" href="https://colab.research.google.com/drive/1SiF0KZJp75rUeetKOWqpsA8clmHP6jMg?usp=sharing" target="_blank" rel="noopener" +>提供了托管在colab的python源码</a>,可以在线体验。</p> +<h3 id="用开源语言模型训练自己的数字化身">用开源语言模型训练自己的数字化身</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-09-38-57.png" +width="623" +height="364" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="410px" +> +随着开源语言模型的训练和微调变得越来越简单,果然有人开始整活。</p> +<p>已经有网友<a class="link" href="https://greatdk.com/1908.html" target="_blank" rel="noopener" +>通过自己的微信聊天记录和博客文章训练出有自己风格的AI</a>。</p> +<p>作者使用目前对中文支持最好的开源模型 chatglm-6b 作为预训练模型(我上期介绍过它的部署和使用)。</p> +<p>经过一番折腾后终于训练出还算凑合的模型。</p> +<p>我们的世界离<a class="link" href="https://movie.douban.com/subject/11502153/episode/1/" target="_blank" rel="noopener" +>《黑镜》中的黑暗故事</a>越来越近了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-09-49-17.png" +width="1024" +height="576" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></p> +<h3 id="四十年工作经验程序员的职业建议">四十年工作经验程序员的职业建议</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-09-50-49.png" +width="700" +height="420" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="400px" +> +国外有位“老程序员”退休了,是真正的到了退休年龄的退休。</p> +<p>他从1981年入行,直到去年退休。这期间他做过各种开发,跳过槽也被辞退过,打过工也创过业。</p> +<p>这不容易。</p> +<p>所以,他决定<a class="link" href="https://thecodist.com/how-i-stayed-relevant-over-four-decades/" target="_blank" rel="noopener" +>以“一个退休程序员”的身份分享一些心得</a>。</p> +<p>摘抄部分要点如下:</p> +<blockquote> +<p>保持开阔的眼界:每天花时间获取真正的资讯,看到趋势,在事物流行起来之前发现他们。 +保持学习:不要拒绝和敌视新技术,要为你所用。 +要有自己的项目(做一些真正的事情):作为程序员不要浪费聪明才智和外部资源,要学着开始一个自己的项目。</p> +</blockquote> +<h3 id="进入心流的入口">进入心流的入口</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-10-08-18.png" +width="660" +height="379" +loading="lazy" +class="gallery-image" +data-flex-grow="174" +data-flex-basis="417px" +> +进入心流(Flow)状态是一种很忘我的体验,也是知识工作者高效产出的必要条件。</p> +<p>有不少创作者都体会过那种全身心的投入并且忘记了时间的感觉。</p> +<p>一旦进入那种状态,很多问题能够很快得到解决,大脑飞速运转并且不会感觉到劳累。</p> +<p>这种状态最忌讳被打断,因为一旦打断,再进入就会比较困难。</p> +<p>这里有篇文章介绍了一些小技巧,可以让你在不得已中断心流之后,能够比较快速地恢复状态。</p> +<p>作者将这些技巧比喻为高速服务区进入主路之前的加速匝道,姑且称为<a class="link" href="https://census.dev/blog/an-on-ramp-to-flow" target="_blank" rel="noopener" +>进入心流的入口</a>。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://spline.design/" target="_blank" rel="noopener" +>Spline</a>,一个免费易用的 3D 设计工具,可实时协作,提供了丰富的物料库,可以基于它来快速创建有趣的 3D 场景,支持处理细腻动画交互,此外还可以导入本地模型和声音素材,支持到处多种输出格式包括WebGL、视频、链接等,很适合新手。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-10-19-26.png" +width="986" +height="536" +loading="lazy" +class="gallery-image" +data-flex-grow="183" +data-flex-basis="441px" +></li> +<li><a class="link" href="https://codepen.io/ksenia-k/pen/poOMpzx" target="_blank" rel="noopener" +>Draw With Flowers!</a>,在threejs里用着色器语言编写的一个特效demo,可以随着鼠标移动绘制绚丽的花朵。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-10-19-52.png" +width="828" +height="466" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></li> +<li><a class="link" href="https://github.com/numbbbbb/read-react-source-code" target="_blank" rel="noopener" +>React 源码阅读</a>,一本开源电子书,通过阅读React的源码来详细理解前端框架的原理。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-10-20-26.png" +width="591" +height="369" +loading="lazy" +class="gallery-image" +data-flex-grow="160" +data-flex-basis="384px" +></li> +<li><a class="link" href="https://codeium.com/download" target="_blank" rel="noopener" +>Codeium</a>,Github copilot 的免费平替,提供vscode、vim、neovim等常见编辑器的插件,我试了一下,效果可以接受。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-10-21-52.png" +width="1024" +height="586" +loading="lazy" +class="gallery-image" +data-flex-grow="174" +data-flex-basis="419px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 026 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/Wed, 29 Mar 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/<h1 id="机器文摘-第-026-期">机器文摘 第 026 期</h1> +<h2 id="长文">长文</h2> +<h3 id="通用人工智能要来了吗">通用人工智能要来了吗</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-09-37-08.png" +width="854" +height="476" +loading="lazy" +class="gallery-image" +data-flex-grow="179" +data-flex-basis="430px" +> +AGI(通用人工智能),即用一个模型解决全部问题,而不是特定领域的问题(如语音识别、图像分类等)。</p> +<p>我在几年前读过一本叫做《人工智能,人类最后的发明》的书。</p> +<p>书里说AGI就是人类最后一个发明,因为有了它,别的一切都不需要了。</p> +<p>当时感觉距离通用的人工智能还很遥远,觉得作者有些危言耸听。</p> +<p>直到今年,chatGPT和GPT-4的发布,我才发觉AI的势头确实有些猛得出乎意料。</p> +<p><a class="link" href="https://orangeblog.notion.site/GPT-4-8fc50010291d47efb92cbbd668c8c893" target="_blank" rel="noopener" +>《 GPT-4 ,人类迈向AGI的第一步》</a>是一篇<a class="link" href="https://arxiv.org/pdf/2303.12712v1.pdf" target="_blank" rel="noopener" +>近期论文</a>的翻译,该论文由微软研究院发布,论证了当前的 GPT-4 模型已经初步具有 AGI 的苗头。</p> +<p>论文内容十分详实,看完很震撼。</p> +<p>摘录部分文字如下:</p> +<blockquote> +<blockquote> +<p><strong>对话</strong> +&gt; 马克:我不喜欢你昨天晚上对待杰克的方式 +&gt; 朱迪:你看到他在做什么了吗?他打了他哥哥的头! +&gt; 马克:这并不能成为你对他大喊大叫的理由 +&gt; 朱迪:你想让我怎么做?让他打他的弟弟,然后什么都不说? +&gt; 马克:不,我不同意 +&gt; 朱迪:那你为什么要为他辩护? +<strong>提问:马克的意图似乎是什么?</strong> +GPT4: 马克的意图似乎是要表达他对朱迪处理与杰克关系的方式的不满,并建议她可以更加冷静和尊重。 +ChatGPT:根据谈话内容,马克的意图似乎是为杰克的行为辩护,并表达他对朱迪对待杰克的不满。 +<strong>提问:朱迪如何看待汤姆的回应?</strong> +GPT4: 朱迪认为他的评论是对她的分析能力的攻击,也是对杰克的不当行为表示同情的表现。她的反应是防御性的和愤怒的,并质疑马克的动机。 +ChatGPT:如果没有更多的文字,我不可能准确判断朱迪是如何接受马克的评论的。然而,根据朱迪的回应,她似乎并不同意马克的观点,而且可能对他为杰克的行为辩护感到沮丧。</p> +</blockquote> +</blockquote> +<h3 id="用-gpt-4-帮你编写一个游戏">用 GPT-4 帮你编写一个游戏</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-02-56.png" +width="717" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="212" +data-flex-basis="510px" +> +我第一次见识到 ChaptGPT 的编程能力之后,就基本离不开这个工具了。</p> +<p>现在我几乎每天都在它的辅助下编写代码。</p> +<p>不过,这里有个老哥更过分。</p> +<p>他让 <a class="link" href="https://twitter-thread.com/t/1637592014446551040" target="_blank" rel="noopener" +>GPT-4 模型帮他做出了一个3D太空赛跑游戏</a>。</p> +<p>作者本身没有游戏编程经验也不懂Javascript,但是通过跟模型一点一点对话,反复将调试代码生成的错误信息反馈给模型,逐渐完成了一个完成度还挺高的游戏。</p> +<h3 id="搭建基于私域数据的chatgpt">搭建基于私域数据的ChatGPT</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-12-24.png" +width="776" +height="438" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="425px" +> +ChatGPT 超强的对话能力怎样应用到私有数据上?</p> +<p>比如说我希望做出一个基于 ChatGPT 模型的专属客服,要吃透我的产品信息。</p> +<p>官方提供的训练API和微调(fine tuning)指导相对复杂一些,对于AI模型的微调不熟悉的人员还不够友好。</p> +<p>这里有一篇“零基础”教程<a class="link" href="https://mp.weixin.qq.com/s/naiVMuXHAScRb_jSEJN3zg" target="_blank" rel="noopener" +>《搭建基于私域数据的ChatGPT》</a>,可以带你走一下流程,感受一下定制专属模型的步骤。</p> +<h3 id="ai令人焦虑">AI令人焦虑</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-21-37.png" +width="609" +height="859" +loading="lazy" +class="gallery-image" +data-flex-grow="70" +data-flex-basis="170px" +> +这篇<a class="link" href="https://mp.weixin.qq.com/s/7H1FrwbQvsh0HD9z90L0wg" target="_blank" rel="noopener" +>《AI狂飙的时代,人还有价值吗?》</a>是一期语音播客的文字转译,因为内容比较精彩,所以也收录在这里了。</p> +<blockquote> +<p>我觉得取代不是一个好的词儿,因为取代是一个非常容易反驳的词儿。我可以说我仍然会干什么什么,AI干不了,所以它取代不了我。 +但正是这种字面上的抬杠,使得问题的本质被掩盖了,因为AI在人的生活中的渗透是一个逐渐的过程。 +百分之百地取代你可能仍然不会发生,可是它也不需要百分之百的取代掉你,只要50%的取代掉你的某些工作职能,AI就会对就业市场形成非常大的冲击。 +我有一个纽约的律师朋友,他是很早就开始用这个东西。 +他本身不是一个技术人员,他是一个标准的文科生,平常的用一个新软件都要紧张半天的那种人。 +但是他开始用这个之后,因为律师的工作是很大程度上是依赖于文本的,而文本是GPT的长项,所以他就开始用。 +之后,我就问他说,所以你真的开始辞退你的员工了吗?因为他自己是一个律所合伙人。 +他说我还没有真正开始辞退任何人,但是我确实打算今年暑假不用再招实习生了,因为给我省下的活完全可以让我腾出手来做一些事,以至于我可以省下招一个实习生的AD account。 +这就是一个真实的影响对不对? +它没有真正取代什么东西,但是它仍然冲击了一个真实的就业市场上的职位。</p> +<p>我觉得AI对我们社会的影响会以这种方式出现,它不会马上一下子让你这个人变得没有意义,但是它可以让三个人的活,两个人现在能干完,多出来那个人就没有存在的必要了,所以老板就可以把他开掉。 +它并不是百分之百取代的人的方式来逐渐进行的,而且这个事情是非常真实的。这也是为什么我觉得很多人对冲击仍然没有做好心理上和事实上的准备。 +其实有点令人忧虑的原因就是,如果你今天还用一种这东西,都是媒体的炒作来对待这个问题,你就很可能会在真正的影响你切身生活的冲击到来之前,没有做好对自己来说比较有用的帮助。</p> +</blockquote> +<p>读完这篇文章,我的感受是,没必要焦虑,不是AI没有威胁,而是焦虑也没用,蒸汽机车发明之后,超越马车就只剩下时间问题了。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://greasyfork.org/zh-CN/scripts/445751-unlimited-downloader" target="_blank" rel="noopener" +>无限制下载器,只要能播放就能下载</a>,能够帮助下载视频网站内容的浏览器插件很多,大部分都是通过嗅探播放地址来实现的下载,网站也会采用各种加密手段来进行阻止。但是这个油猴脚本采用了另一种思路。你网站防再死不能不让观众看吧?脚本几乎采用了类似录屏的手段来进行视频下载。对于一些实在想要下载的内容,可以考虑试试这个插件。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-34-53.png" +width="640" +height="400" +loading="lazy" +class="gallery-image" +data-flex-grow="160" +data-flex-basis="384px" +></li> +<li><a class="link" href="https://github.com/cocktailpeanut/dalai" target="_blank" rel="noopener" +>帮你本地运行 LLaMA 模型</a>,只需一行命令就可以让你在本地运行 <a class="link" href="https://github.com/ggerganov/llama.cpp" target="_blank" rel="noopener" +>LLaMA</a> 模型,轻松感受在本地单机上运行大规模语言模型的魅力。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-40-09.png" +width="1920" +height="1080" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></li> +<li><a class="link" href="https://github.com/lxe/simple-llama-finetuner" target="_blank" rel="noopener" +>微调 LLaMa 模型的工具</a>,既然都能在本地运行了,那就再给力一些,这个工具可以让你很方便地使用自己的数据训练 LLaMA 模型。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-42-04.png" +width="1013" +height="898" +loading="lazy" +class="gallery-image" +data-flex-grow="112" +data-flex-basis="270px" +></li> +<li><a class="link" href="https://github.com/Haxxnet/Compose-Examples" target="_blank" rel="noopener" +>Docker Compose 容器组合最佳实践</a>,Docker有多好用不用再说了吧,这里有一堆使用Docker Compose编排容器的模板,收录了很多十分有用的容器镜像组合,可方便快速的搭建各种业务(如:单点登录、VPN、媒体管理、文件共享、博客、维基、社交网站、项目管理等)。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-46-53.png" +width="802" +height="445" +loading="lazy" +class="gallery-image" +data-flex-grow="180" +data-flex-basis="432px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 025 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/Wed, 22 Mar 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/<h1 id="机器文摘-第-025-期">机器文摘 第 025 期</h1> +<h2 id="长文">长文</h2> +<h3 id="252个字节实现播放音乐和动画">252个字节实现播放音乐和动画</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-10-25-42.png" +width="915" +height="478" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="459px" +> +这里有个网页介绍了一个demo作者使用一段JavaScript代码实现了一个<a class="link" href="http://www.p01.org/256b_tetris_theme/" target="_blank" rel="noopener" +>一边播放俄罗斯方块背景音乐一边播放字符动画的网页</a>,原理是利用HTML5的AudioContext对象进行声音合成,通过定时器触发基于当前时间t值的不同频率,实现音乐播放。具体代码如下:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="o">&lt;</span><span class="nx">body</span> <span class="nx">onclick</span><span class="o">=</span><span class="s2">&#34;with(new AudioContext)with(o=createOscillator())connect(destination),start(setInterval(v=&gt;innerHTML=&#39;TETЯIS&amp;#&#39;+(9624|(o.frequency.value=`RR&gt;AIIA&gt;777${d=&#39;ARRIA&gt;&gt;&gt;AIIRRAA7777&#39;}IIIWnnbWRRR${d}`.charCodeAt(++t%58)*4)%7)+&#39;P01&#39;,t=232))&#34;</span><span class="o">&gt;</span><span class="nx">click</span> +</span></span></code></pre></td></tr></table> +</div> +</div><h3 id="诺基亚发布的可维修手机">诺基亚发布的“可维修”手机</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-10-35-52.png" +width="614" +height="369" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="399px" +> +说到诺基亚,用过的朋友第一个映入脑海的词就是“砸核桃”。</p> +<p>那是iPhone还没发布的非智能手机年代。</p> +<p>手机可更换电池和外壳在那时是一个标准设计,谁要是不支持这些都不好意思跟人打招呼。</p> +<p>那时我经常把我的诺基亚掉在地上摔得七零八落,然后淡定地捡起来像电影里特工拼装自己的手枪那样,一个个把零件组装起来,形成“一把”手机。</p> +<p>或者等手机快要没电的时候,像换弹匣那样给手机换一块电池,立马满血复活。</p> +<p>这样的日子自从iPhone发布之后就再也没有了。</p> +<p><a class="link" href="https://www.theguardian.com/technology/2023/feb/25/nokia-launches-diy-repairable-budget-android-phone" target="_blank" rel="noopener" +>诺基亚近期发布了一款手机</a>,再次让我想起我那掉地上摔开几瓣的手机。这款手机号称具有良好的“可维修”性,普通用户也可一个人在家轻松拆卸。可以自行更换包括电池、屏幕、充电端口等零件。</p> +<h3 id="不要重复自己是编程的好原则吗">不要重复自己是编程的好原则吗</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-10-50-45.png" +width="650" +height="346" +loading="lazy" +class="gallery-image" +data-flex-grow="187" +data-flex-basis="450px" +> +不要重复自己,永远不要从头开始重写代码!</p> +<p>这是很多程序员收到的忠告。</p> +<p>然而它是绝对正确的吗?</p> +<p>这里有篇文章<a class="link" href="https://programmingisterrible.com/post/176657481103/repeat-yourself-do-more-than-one-thing-and" target="_blank" rel="noopener" +>《重复自己,重写一切》</a>,作者在文章中探讨了编程中的一些习惯,他认为这些习惯可以使代码变得更难理解、更难维护,并可能导致代码的冗长和不必要的复杂性。文章提到了重写代码可以给程序带来更好的抽象和可维护性,所以建议定期通过重新写代码的方式重构你的程序。</p> +<p>说实话,我不知道作者是怎样看待所谓“屎山”代码的,也许当他面对有些代码时,他的观点也会变为:“能跑的代码,就尽量别动它了”。</p> +<h3 id="慢下来">慢下来</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-10-59-28.png" +width="587" +height="205" +loading="lazy" +class="gallery-image" +data-flex-grow="286" +data-flex-basis="687px" +> +这篇文章的题目是<a class="link" href="https://sive.rs/slow" target="_blank" rel="noopener" +>“慢下来”</a>,作者是Derek Sivers,一位创业者、作家和音乐家。在这篇文章中,他分享了自己对于“慢下来”这个主题的一些思考和感悟。</p> +<p>虽然是个急性子,但是我很认同文章里的观点。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://www.macpierce.com/the-camera-shy-hoodie" target="_blank" rel="noopener" +>反跟踪识别的套件</a>,如果你觉得被公共场所的摄像头拍摄和记录或者识别侵犯了你的隐私,这里有一套开源的穿戴套件可以考虑。它通过在身上穿戴可以发射红外线的LED设备,使得摄像头画面过曝。以获得保护隐私的效果。不过仅用于研究,不知道是否符合有些国家的法律法规。网站提供了配件清单和详细的装配说明(pdf)供下载。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-11-05-16.png" +width="1203" +height="583" +loading="lazy" +class="gallery-image" +data-flex-grow="206" +data-flex-basis="495px" +></li> +<li><a class="link" href="https://whatdoesthiscodedo.com/" target="_blank" rel="noopener" +>AI帮你解释一段代码</a>,有人使用openai的开发接口提供了一个专门帮人们解释代码执行的工具,输入代码,输出解释。并提供vscode的插件。我把文章开头那段播放音乐的Javascript代码发给他让他解释,效果如下图: +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-11-09-51.png" +width="625" +height="740" +loading="lazy" +class="gallery-image" +data-flex-grow="84" +data-flex-basis="202px" +></li> +<li><a class="link" href="https://xenova.github.io/transformers.js/" target="_blank" rel="noopener" +>在网页中运行GPT模型</a>,一个可以在浏览器中执行Transformer模型的开源程序,可以执行轻量的模型,实现如翻译、语音转文字、图像转文字等任务。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-11-12-45.png" +width="1239" +height="519" +loading="lazy" +class="gallery-image" +data-flex-grow="238" +data-flex-basis="572px" +></li> +<li><a class="link" href="https://aitxt.io" target="_blank" rel="noopener" +>AI生成工具箱</a>,近期,基于chatGPT模型的应用大爆发,这里有一个整理好的工具箱,可以使用ai做很多内容生成工作,包括帮你编写周报、润色文字、写道歉信、写外卖好评等,效果还不错。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-11-15-00.png" +width="1033" +height="530" +loading="lazy" +class="gallery-image" +data-flex-grow="194" +data-flex-basis="467px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 024 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/Wed, 15 Mar 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/<h1 id="机器文摘-第-024-期">机器文摘 第 024 期</h1> +<h2 id="长文">长文</h2> +<h3 id="电池充一次可以用两年的笔记本电脑">电池充一次可以用两年的“笔记本”电脑</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-09-18-01.png" +width="830" +height="467" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +> +挪威软件开发商安德烈亚斯·埃里克森(Andreas Eriksen)组装了一款笔记本电脑(或者说便携膝上型电脑?)。</p> +<p>它拥有“以年为单位的电池寿命”,并且使用用Lisp编程系统界面,产品名为:<a class="link" href="https://www.hackster.io/news/andreas-eriksen-s-potatop-is-a-lisp-powered-laptop-with-a-battery-life-measured-in-years-2f5d79653f24" target="_blank" rel="noopener" +>PotatoP</a>。</p> +<p>CPU好像是个ARM架构的低功耗单核处理器,最高频率96MHz。</p> +<p>支持蓝牙5.0。</p> +<p>运行的系统为PotatOS,一个基于<a class="link" href="http://www.ulisp.com/" target="_blank" rel="noopener" +>uLisp</a>(一个专门为微控制器设计的Lisp)移植的专用系统。</p> +<p>使用的4.4英寸显示屏采用介于LCD和墨水屏之间的技术,省电。</p> +<p>再加上机身上还带有太阳能电池,据说如果环境光充足的话,可以连续运行两年。</p> +<h3 id="详解-amd-为-steam-deck-开发的-apu">详解 AMD 为 Steam Deck 开发的 APU</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-09-32-20.png" +width="671" +height="272" +loading="lazy" +class="gallery-image" +data-flex-grow="246" +data-flex-basis="592px" +> +Steam Deck 无疑是一款革命性的掌机。</p> +<p>如果不是价格在国内被炒的离谱,我定会入手一台,也许再观望一下等待第二代或者三代产品更好。</p> +<p>这款掌机使得在便携设备上游玩3A大作不再是幻想。</p> +<p>取得这样的表现,除了得益于V厂魔改的Linux系统之外,还离不开这块由AMD定制的、代号“梵高”的 APU。</p> +<p>这篇<a class="link" href="https://chipsandcheese.com/2023/03/05/van-gogh-amds-steam-deck-apu/" target="_blank" rel="noopener" +>《“梵高”AMD的Steam Deck APU》</a>详细介绍了这块APU的各种技术细节,解释了为什么Steam Deck可以做到低功耗的同时还拥有相当给力的图形性能。</p> +<h3 id="用磁盘阵列raid确保数据安全靠谱吗">用磁盘阵列(RAID)确保数据安全靠谱吗?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-09-45-46.png" +width="477" +height="250" +loading="lazy" +class="gallery-image" +data-flex-grow="190" +data-flex-basis="457px" +> +再谈谈 NAS 的事情(中年技术男的三大爱好之一)。</p> +<p>像我这样的人,对于 RAID 磁盘阵列总是抱有美好的幻想。我们认为,只要将数据存放在经过合理规划的磁盘阵列中(例如 RAID 5),我们就可以高枕无忧,确保数据永远不会丢失。然而,实际上,磁盘阵列并不是备份数据的最佳选择,最佳的数据安全策略是异地多份存储。</p> +<p>尽管 RAID 5 宣称随便损坏一块硬盘也不要紧,只需更换一块正常盘即可,但这种理想状态可能不太容易实现,中间随时可能会出现其他状况导致数据永久丢失。</p> +<p>一篇名为<a class="link" href="https://www.ucmadscientist.com/almost-lost-it-all-again/" target="_blank" rel="noopener" +>《差点儿就又全没了》</a>的博文,讲述了作者在使用 NAS 磁盘阵列时经历了一次惊险刺激的数据拯救过程。希望这篇文章能够给计划使用类似方式保存数据的朋友们一个平常心态。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://pubby.games/nesfab.html" target="_blank" rel="noopener" +>NESFab</a>,一个专为开发任天堂8位游戏机(NES、FC)设计的编程语言。具有高性能、易于装载资源、自动内存地址切换等特性,作者还在主页提供了一个使用NESFab开发游戏的教程。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-10-10-50.png" +width="490" +height="169" +loading="lazy" +class="gallery-image" +data-flex-grow="289" +data-flex-basis="695px" +></li> +<li><a class="link" href="https://github.com/AstroNvim/AstroNvim" target="_blank" rel="noopener" +>AstroNvim</a>,一套即开即用的Nvim配置文件,主打界面美观,集成了文件浏览、代码补全、语法高亮、模糊查询、可视化调试等常用插件配置。对于新手和懒得折腾的人来说,可以尝试。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-10-13-25.png" +width="814" +height="434" +loading="lazy" +class="gallery-image" +data-flex-grow="187" +data-flex-basis="450px" +></li> +<li><a class="link" href="https://github.com/pynecone-io/pynecone" target="_blank" rel="noopener" +>pynecone</a>,一个用python开发的web应用框架,特点是使用python语言完成所有任务,包括前端和后端,可以帮助那些对于前端开发不太擅长的人更方便地制作web应用程序。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-10-16-17.png" +width="727" +height="647" +loading="lazy" +class="gallery-image" +data-flex-grow="112" +data-flex-basis="269px" +></li> +<li><a class="link" href="https://maryrosecook.com/blog/post/a-practical-introduction-to-functional-programming" target="_blank" rel="noopener" +>函数式编程入门</a>,一篇介绍函数式编程的文章,介绍了函数式编程的基本概念和一些重要的函数式编程概念,并使用Javascript演示了如何使用这些概念进行函数式编程。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-10-18-09.png" +width="450" +height="220" +loading="lazy" +class="gallery-image" +data-flex-grow="204" +data-flex-basis="490px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 023 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/Wed, 08 Mar 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/<h1 id="机器文摘-第-023-期">机器文摘 第 023 期</h1> +<h2 id="长文">长文</h2> +<h3 id="视频信号可以被窃听吗">视频信号可以被窃听吗?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-10-10-45.png" +width="533" +height="234" +loading="lazy" +class="gallery-image" +data-flex-grow="227" +data-flex-basis="546px" +> +我之前听到过一个传说。</p> +<p>使用高灵敏度的天线,再加上一些奇妙的设备。</p> +<p>可以窃听(窃视?)到附近(方圆数百米)范围之内的显示器显示的内容。</p> +<p>这个传说流传的时候,还是CRT显示器的时代,当时的视频接口主要是VGA,采用模拟信号进行传输。</p> +<p>如果显示器或者视频线缆所作的屏蔽不够充分的话,难免会有信号泄露。</p> +<p>而VGA信号又没有任何加密,被别有用心的人收看是有一定的可能的。</p> +<p>时间发展到今天,视频接口早已升级,我以为除非不小心无线投屏到了邻居家,否则就不会有视频内容泄露的情况。</p> +<p>然而,<a class="link" href="https://www.windytan.com/2023/02/using-hdmi-radio-interference-for-high.html" target="_blank" rel="noopener" +>今天要说的这篇文章</a>则证实了上述传说的可能。</p> +<p>不过,比起传说中的窃听,作者走的更远一些。</p> +<p>起因是作者在家里摆弄无线电的时候,发现了一个信号干扰源,最后发现来自他的一个树莓派设备。</p> +<p>于是经过一番操作,作者不但成功通过无线接收的方式将视频信号显示了出来。</p> +<p>还利用这种无线信号的干扰(或泄露?)实现了叠加数据的传输。</p> +<h3 id="怎样用密码保护一个静态页面">怎样用密码保护一个静态页面?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-10-34-20.png" +width="903" +height="429" +loading="lazy" +class="gallery-image" +data-flex-grow="210" +data-flex-basis="505px" +> +说到网站上的数据权限保护,一般我们会需要后端程序配合。</p> +<p>比如使用账号系统,给用户角色分配不同的权限,使其访问后端接口时获取不同的数据。</p> +<p>如果没有后台程序,只有静态页面会怎样?</p> +<p>这儿有个开源工具,<a class="link" href="https://robinmoisson.github.io/staticrypt/" target="_blank" rel="noopener" +>可以帮你生成带有密码保护的静态HTML页面</a>。</p> +<p>具体使用方法和原理也很简单。</p> +<p>输入你想设置的密码和你的HTML页面原始代码,这个工具可以使用AES-256加密算法对其进行加密。</p> +<p>然后在浏览器加载时,页面自动使用一个js库实现自解密。</p> +<p>这个方法用于临时保护一些静态的内容还是挺有效的,而且很方便。</p> +<h3 id="写代码越干净越好吗">写代码越“干净”越好吗?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-10-43-47.png" +width="713" +height="344" +loading="lazy" +class="gallery-image" +data-flex-grow="207" +data-flex-basis="497px" +> +有不少人宣称自己有代码“洁癖”。</p> +<p>对于设计模式和面向对象有着非常深的执念(或者函数式编程也是)。</p> +<p>市面上也充斥着很多“之美”、“之道”、“之禅”之类的书籍,强调代码要给人读、整洁干净。</p> +<p>我并不反对上述观点,甚至自己也有一点这样的“洁癖”,只是有时内心会有一丝怀疑的时候,觉得如果过于追求某些东西可能会偏离了解决问题的根本目标。</p> +<p>这篇<a class="link" href="https://www.computerenhance.com/p/clean-code-horrible-performance" target="_blank" rel="noopener" +>《“干净”的代码,糟糕的性能》</a>,帮我吐槽了一些事情。</p> +<p>但作者在文中所举的例子稍微有些牵强,不必过于纠结。</p> +<h3 id="不知道怎么练习编程怎么办">不知道怎么练习编程怎么办</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-10-58-53.png" +width="469" +height="314" +loading="lazy" +class="gallery-image" +data-flex-grow="149" +data-flex-basis="358px" +> +经常有人困惑在学习了一门新的编程语言之后,不知该做些什么。</p> +<p>就像是掌握了词语却写不出好的小说,掌握了规则也下不好象棋。</p> +<p>我们从小受到的教育方式导致了,在学习技能这一块,缺失实践的动力和方法。</p> +<p>这篇<a class="link" href="https://prog21.dadgum.com/80.html" target="_blank" rel="noopener" +>给无目标的新手程序的一些建议</a>,虽然内容不多,但是可以看出作者也是个老油条了。</p> +<p>给出的一些提示都很实在,对于技能练习方面,提的都是我希望我能遵从的。</p> +<p>比如:</p> +<blockquote> +<p>用技能解决你实际生活中的问题。 +做一些你真正会用到的东西。</p> +</blockquote> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://www.freecodecamp.org/chinese/news/typescript-for-react-developers/" target="_blank" rel="noopener" +>写给 React 开发者的 TypeScript 指南</a>,针对React程序员的TypeScript的学习资料,解答了我一部分为什么要用TS的问题。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-11-01-19.png" +width="698" +height="375" +loading="lazy" +class="gallery-image" +data-flex-grow="186" +data-flex-basis="446px" +></li> +<li><a class="link" href="https://method.ac/" target="_blank" rel="noopener" +>Method of Action</a>,一些免费的工具和在线小游戏(颜色搭配、贝塞尔曲线等),可以帮助你学习和掌握设计理念和工具。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-11-02-12.png" +width="605" +height="461" +loading="lazy" +class="gallery-image" +data-flex-grow="131" +data-flex-basis="314px" +></li> +<li><a class="link" href="https://archivebox.io/" target="_blank" rel="noopener" +>Archivebox</a>,一套开源的互联网内容保存方案,可以将你喜欢的页面下载下来,并自动爬取相关链接、图片等内容,类似于互联网档案馆的https://archive.org,不过可以自己搭建。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-11-06-33.png" +width="686" +height="285" +loading="lazy" +class="gallery-image" +data-flex-grow="240" +data-flex-basis="577px" +></li> +<li><a class="link" href="https://ohiostate.pressbooks.pub/graphicshistory/front-matter/cover/" target="_blank" rel="noopener" +>History of Computer Graphics and Animation</a>,一本讲解计算机图形和动画发展历程的电子书,里面记录了计算机图形学相关的许多参考资料,曾用于俄亥俄州立大学的授课。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-11-08-29.png" +width="676" +height="711" +loading="lazy" +class="gallery-image" +data-flex-grow="95" +data-flex-basis="228px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 022 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/Wed, 01 Mar 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/<h1 id="机器文摘-第-022-期">机器文摘 第 022 期</h1> +<h2 id="长文">长文</h2> +<h3 id="自制家庭服务器">自制家庭服务器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-10-51-39.png" +width="668" +height="367" +loading="lazy" +class="gallery-image" +data-flex-grow="182" +data-flex-basis="436px" +> +人们常说,中年技术男的最终归宿除了钓鱼和盘核桃之外,还有一项就是折腾家里的服务器,这些服务器形态各异,但是作用都是殊途同归:NAS、软路由、虚拟化、Docker容器。</p> +<p>怎样变着花样搭建家庭服务器几乎是 V 站的月经甚至日经话题。</p> +<p>这里有个国外的老哥,决定使用 ARM64 架构自己“装配”一个,是那种需要焊接的“装配”。</p> +<p>有兴趣的可以翻阅一下这篇<a class="link" href="https://jforberg.se/blog/posts/2023-02-19-rockpro64/rockpro64.html" target="_blank" rel="noopener" +>《构建 ARM64 家庭服务器》</a>。</p> +<p>文章介绍了如何用一种较为困难的方式构建一个 ARM64 架构的家用服务器。</p> +<p>作者使用了一块名为 ROCKPro64 的开发板,并详细介绍了构建过程中遇到的问题以及如何解决这些问题。</p> +<p>文章中包含了安装基础操作系统、配置网络连接、设置磁盘阵列和安装各种软件的详细步骤和指导,涵盖了从硬件到软件的多个方面。</p> +<p>在构建过程中,作者提到了一些常见的问题和解决方法,例如如何处理不同操作系统的差异,如何在开发板上设置固件,以及如何解决硬件不兼容问题。</p> +<p>总之,这篇文章是一份详细的指南,可以帮助有兴趣构建自己的家用服务器的读者了解基础知识,克服可能遇到的问题,并学习如何从头开始构建一个高效、安全的服务器。</p> +<blockquote> +<p>上面这段是让 chatGPT 帮我写的 :)</p> +</blockquote> +<h3 id="用rust写一个大小仅有2k的极简fps游戏">用Rust写一个大小仅有2K的极简FPS游戏</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-11-06-53.png" +width="480" +height="258" +loading="lazy" +class="gallery-image" +data-flex-grow="186" +data-flex-basis="446px" +> +极简渲染器的编写教程网上有很多,但大都浅尝辄止,以静态渲染为主。</p> +<p><a class="link" href="https://grantshandy.github.io/posts/raycasting/" target="_blank" rel="noopener" +>这篇文章</a>则从制作一个第一人称射击游戏的视角出发,讲解了怎样使用光线投射技术实现最基本的三维空间渲染、光照、阴影等效果。</p> +<p>作者使用 Rust 语言基于 wasm 技术编写了一个在网页中运行的示例程序,该程序非常小巧,但是也充分展现了如何使用光线投射算法来实现 3D 渲染技术仲的一些基本概念,比如:墙体贴图、视角控制等。</p> +<p>是我看到的教程里比较系统的一个,适合作为爱好者去研究。</p> +<h3 id="玩具-cpu-模拟器">玩具 CPU 模拟器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-13-24-45.png" +width="640" +height="480" +loading="lazy" +class="gallery-image" +data-flex-grow="133" +data-flex-basis="320px" +> +国外一个大学老师觉得他的计算机组成原理课程有些枯燥,于是他<a class="link" href="https://jimhall.itch.io/toy-cpu" target="_blank" rel="noopener" +>动手撸了一个 CPU 模拟器出来</a>,以帮助学生们更好的理解计算机内部运作原理。</p> +<p>作者在文章里介绍了基本的原理,以及模拟器的各个组件,适合学习底层原理初入门的学生。</p> +<p>另外这个模拟器也基于 MIT 协议进行了开源,文章中附有开源仓库的地址和编译好的可执行文件下载连接。</p> +<p>需要注意的是该程序运行环境为DOS,现在要想体验的话,需要先安装 <a class="link" href="https://www.dosbox.com/download.php?main=1" target="_blank" rel="noopener" +>DosBOX</a> 这个模拟器。</p> +<h3 id="不用任何构建系统编写前端代码">不用任何构建系统编写前端代码</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-13-35-29.png" +width="632" +height="224" +loading="lazy" +class="gallery-image" +data-flex-grow="282" +data-flex-basis="677px" +> +比起十几年前,前端开发工程现在已经变得十分复杂。</p> +<p>有次我想写个简单的页面程序,但是却花费了一上午的时间陷入对框架和构建系统的选择上。</p> +<p>后来不得不放弃,改用记事本随便用原生Javascript完成了功能。</p> +<p><a class="link" href="https://jvns.ca/blog/2023/02/16/writing-javascript-without-a-build-system/" target="_blank" rel="noopener" +>这篇文章</a>的作者跟我有同样的感受。</p> +<p>作者认为,对于一些简单的项目来说,使用构建系统可能是不必要的。</p> +<p>因为构建系统会增加开发和维护的复杂性,而且可能会导致一些性能问题。</p> +<p>文章演示了作者如何使用原生的Javascript和浏览器的开发者工具来实现一些常见的构建系统功能。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/CyC2018/CS-Notes" target="_blank" rel="noopener" +>计算机知识笔记</a>,一个计算机科学知识笔记仓库,包括计算机基础知识、编程语言和算法、开发工具、面试笔试题目等等,是一个非常实用的笔记库。目前在 Github 上有超过 162k 个 star 。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-13-47-03.png" +width="344" +height="602" +loading="lazy" +class="gallery-image" +data-flex-grow="57" +data-flex-basis="137px" +></li> +<li><a class="link" href="https://www.hugi.scene.org/online/hugi31/hugi%2031%20-%20index%20coding%20corner.htm" target="_blank" rel="noopener" +>Creating Demos</a>,这套教程是 <a class="link" href="https://en.wikipedia.org/wiki/Hugi" target="_blank" rel="noopener" +>Hugi 杂志</a>在2001年第31期发布的一系列编程文章,主题是“Demo程序”的制作,是我目前在网络上见到的比较完整和耐心的一套讲解 Demoscene 如何制作的教程。虽然有些技术是老旧的,但是思想一直是不变的,能够学到很多平时很难了解到的东西,现在很少有人愿意分享这些了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-13-52-29.png" +width="543" +height="367" +loading="lazy" +class="gallery-image" +data-flex-grow="147" +data-flex-basis="355px" +></li> +<li><a class="link" href="https://github.com/iawia002/lux" target="_blank" rel="noopener" +>网络视频下载器</a>,一个 go 语言编写的网络音视频资源下载工具,类似 youtube-dl,但是支持的网站要更多一些。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-13-54-53.png" +width="870" +height="666" +loading="lazy" +class="gallery-image" +data-flex-grow="130" +data-flex-basis="313px" +></li> +<li><a class="link" href="https://www.ambient.run/" target="_blank" rel="noopener" +>ambient</a>,Ambient是一个使用 WebAssembly、Rust 和 WebGPU 技术构建的高性能多人游戏和3D应用的开源引擎。特点是针对构建多人游戏开发进行优化支持。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-14-03-29.png" +width="981" +height="378" +loading="lazy" +class="gallery-image" +data-flex-grow="259" +data-flex-basis="622px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 021 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/Wed, 22 Feb 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/<h1 id="机器文摘-第-021-期">机器文摘 第 021 期</h1> +<h2 id="长文">长文</h2> +<h3 id="chatgpt-原理通俗讲解">chatGPT 原理通俗讲解</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-14-57-11.png" +width="1240" +height="410" +loading="lazy" +class="gallery-image" +data-flex-grow="302" +data-flex-basis="725px" +> +可能是有人炒作的缘故,chatGPT 热度一直不降,连街边买菜的大妈都在讨论这个“人工智能机器人”。</p> +<p>可能是它输出语言的流畅度实在是太接近真实的人类了,用惯了之前那种“智能助理”的人很容易感到震惊。</p> +<p>然而其背后的原理并非像想象的那么复杂,甚至是大力出奇迹的又一个经典样例。</p> +<p>最近关于它的文章也是铺天盖地,各种分析、叫好,很少有冷静下来探讨其背后机理的。</p> +<p>我翻看了几篇之后,发现唯有这篇<a class="link" href="https://writings.stephenwolfram.com/2023/02/what-is-chatgpt-doing-and-why-does-it-work/" target="_blank" rel="noopener" +>《chatGPT在做什么以及它为什么好使》</a> 比较优秀。读起来比较平和,没有压力。</p> +<p>文章揭示了即使像chatGPT这样的大型语言模型也是一个单词一个单词慢慢往出崩的,并尝试说清楚这么流畅的语言是基于什么来预测后续单词的概率。</p> +<h3 id="怎样利用多gpu训练真正的大型模型">怎样利用多GPU训练真正的大型模型</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-13-37.png" +width="920" +height="461" +loading="lazy" +class="gallery-image" +data-flex-grow="199" +data-flex-basis="478px" +> +前面提到的 chatGPT 模型,体量非常大,据说训练一次就要耗费上千万美元。</p> +<p>作为普通开发者我们是不敢奢望自己上手训练一番。</p> +<p>不过,这里有一篇文章可以让我了解像这样的<a class="link" href="https://lilianweng.github.io/posts/2021-09-25-train-large/" target="_blank" rel="noopener" +>大模型是如何进行并行训练的</a>。</p> +<p>另外还有个开源的项目,号称可以<a class="link" href="https://github.com/hpcaitech/ColossalAI/blob/main/README-zh-Hans.md" target="_blank" rel="noopener" +>在较少资源的基础设施上进行 GPT 模型训练</a>,有兴趣的可以试试。</p> +<h3 id="怎样搭建一个电子爱好者工作间">怎样搭建一个电子爱好者工作间</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-28-10.png" +width="716" +height="439" +loading="lazy" +class="gallery-image" +data-flex-grow="163" +data-flex-basis="391px" +> +拥有一个电子产品工作室一直是我的一个梦想。</p> +<p>电烙铁、稳压电源、万用表,是我能想到的最基本的设备。</p> +<p>如果还想更完美,可以借鉴这篇文章所介绍的思路,<a class="link" href="https://lcamtuf.substack.com/p/setting-up-an-electronics-workshop" target="_blank" rel="noopener" +>搭建一个电子爱好者工作间</a>。</p> +<h3 id="运气计算公式">运气计算公式</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-37-36.png" +width="809" +height="570" +loading="lazy" +class="gallery-image" +data-flex-grow="141" +data-flex-basis="340px" +> +看到一个关于运气的文章<a class="link" href="https://www.swyx.io/create-luck" target="_blank" rel="noopener" +>《如何获得好运气》</a>,觉得里面提到的“怎样使得随机的运气变得让好运更加倾向于你”的说法比较有意思。</p> +<p>于是就收录一下。</p> +<p>文章里探讨的问题,很容易让我联想到关于“下雨的时候是飞速跑动淋雨多还是慢慢走淋雨多”的问题。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://academy.cs.cmu.edu/" target="_blank" rel="noopener" +>卡耐基梅隆大学计算机科学在线教程</a>,CMU CS Academy 是卡内基梅隆大学计算机科学学院 (SCS) 的一个项目,其目标是开发一种新颖的、世界级的、在线的、完全免费的交互式高中计算机科学课程。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-45-42.png" +width="767" +height="390" +loading="lazy" +class="gallery-image" +data-flex-grow="196" +data-flex-basis="472px" +></li> +<li><a class="link" href="https://www.handsome-css.com/" target="_blank" rel="noopener" +>纯CSS实现的超漂亮UI组件收集</a>,网站收集了超多 UI 组件,基于 纯 CSS 实现,采用 MIT 开源协议发布,可以自由使用。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-47-30.png" +width="863" +height="349" +loading="lazy" +class="gallery-image" +data-flex-grow="247" +data-flex-basis="593px" +></li> +<li><a class="link" href="https://cn.sli.dev/" target="_blank" rel="noopener" +>为开发者打造的演示文稿工具</a>,Slidev 旨在为开发者提供灵活性和交互性,通过使用他们已经熟悉的工具和技术,使他们的演示文稿更加有趣、更具表现力和吸引力。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-50-17.png" +width="652" +height="251" +loading="lazy" +class="gallery-image" +data-flex-grow="259" +data-flex-basis="623px" +></li> +<li><a class="link" href="https://www.stableattribution.com/" target="_blank" rel="noopener" +>根据ai做的图倒推出用于训练模型的原始图</a>,这个网站比较有意思,前一段时间比较火的根据文字生成图片的 AI ,这里可以将根据 AI 生成的图片反推出它当时样本训练的原始图。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-56-55.png" +width="1696" +height="398" +loading="lazy" +class="gallery-image" +data-flex-grow="426" +data-flex-basis="1022px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 020 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/Wed, 15 Feb 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/<h1 id="机器文摘-第-020-期">机器文摘 第 020 期</h1> +<h2 id="长文">长文</h2> +<h3 id="怎样获得非凡成就">怎样获得非凡成就</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/2023-02-15-09-57-43.png" +width="749" +height="383" +loading="lazy" +class="gallery-image" +data-flex-grow="195" +data-flex-basis="469px" +> +多年来,我对成功学嗤之以鼻。</p> +<p>但也对有些人的成功给予应有的尊重。</p> +<p>我所欣赏的成功人士有一种特殊气质,我说不上来具体是什么特点,有点儿像反叛精神,又有点儿对手工技术的狂热。</p> +<p>这些人里对我影响比较大的是《黑客与画家》的作者 保罗·格雷厄姆(<a class="link" href="https://zh.wikipedia.org/zh-hans/%E4%BF%9D%E7%BD%97%C2%B7%E6%A0%BC%E9%9B%B7%E5%8E%84%E5%A7%86" target="_blank" rel="noopener" +>Paul Graham</a>)。</p> +<p>他创建了著名的 <a class="link" href="https://zh.wikipedia.org/zh-hans/Y_Combinator" target="_blank" rel="noopener" +>YC 孵化器公司</a>,也打造了很多成功的产品。</p> +<p>今天推荐的这篇文章<a class="link" href="https://blog.samaltman.com/how-to-be-successful" target="_blank" rel="noopener" +>《How To Be Successful》</a>的作者,是保罗·格雷厄姆非常推崇的一位创业者。</p> +<p>文章分享的观点乍看有成功学的影子,但读完却能引人思考。</p> +<p>这里是中文翻译版:<a class="link" href="https://mp.weixin.qq.com/s/pQYztNmmQ6W4fRxPIEsWYQ" target="_blank" rel="noopener" +>《观察成千上万创业者后,关于如何获得非凡成就的13条思考》</a></p> +<p>我觉得这些观点至少可以给长期埋头技术工作的人们一些启发,我稍微列举几条如下:</p> +<blockquote> +<ul> +<li>这个世界很少人能做到将眼光放长远,而那些有长远眼光的人会得到市场的丰厚回报。</li> +<li>把时间花在做正确的事上,比花长时间进行工作更重要。</li> +<li>跟着你的好奇心走。因为对你来说兴奋的事情对其他人来说也同样兴奋。</li> +<li>成为内驱型的人(即:自己去做一件事的原因来自于自己,而不是外部的力量或别人的期望)。</li> +</ul> +</blockquote> +<h3 id="怎样在客厅建立自己的私人影院">怎样在客厅建立自己的私人影院</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/2023-02-15-10-21-45.png" +width="841" +height="396" +loading="lazy" +class="gallery-image" +data-flex-grow="212" +data-flex-basis="509px" +> +智能电视或者智能盒子已成为现在客厅的标配。</p> +<p>如何充分发挥它们的作用,早已是技术爱好者的孜孜不倦探索的课题。</p> +<p>前些天我偶然收到一份公开的云盘链接,使用开源的 <a class="link" href="https://github.com/alist-org/alist" target="_blank" rel="noopener" +>AList</a>(一个支持网盘存储的文件列表程序,可以通过多种协议将网盘映射为本地访问的存储路径) 进行构建。里面整理了大量的影视资源,有不少是高质量、高码率的蓝光原盘文件。</p> +<p>这就激发了我的好奇心。</p> +<p>由于自己一直按耐住折腾 NAS 的念头,这些年一直没有收集电影。</p> +<p>但现在既然有在线的资源,不妨尝试一下。</p> +<p>于是我找到了这篇<a class="link" href="https://wp.gxnas.com/12278.html" target="_blank" rel="noopener" +>《利用KODI和云盘打造4K高清私人云影院》</a>(仅作研究,观影和收藏还需支持正版)。</p> +<p>按照文章的指导,成功给电视安装了 KODI(一个媒体中心 App),并进行了配置,可以非常方便地浏览、观看互联网云盘上的高清电影。</p> +<p>比起云盘官方所出品的各种 App 在体验上更加灵活、完美。</p> +<h3 id="噪声在计算机图形学里的作用">“噪声”在计算机图形学里的作用</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/2023-02-15-10-40-28.png" +width="671" +height="303" +loading="lazy" +class="gallery-image" +data-flex-grow="221" +data-flex-basis="531px" +> +想要计算机产生的图形更加的接近自然,生成各式各样的噪声是必不可少的算法。</p> +<p>之前在读<a class="link" href="https://natureofcode.com/" target="_blank" rel="noopener" +>《The Nature of Code》</a>(中文译作:代码本色)一书的时候,作者花了大量篇幅讲解关于噪声、随机等对于模拟自然界中各种现象的重要作用。</p> +<p>或许在噪声里就隐藏着大自然最深处的秘密。</p> +<p>这篇<a class="link" href="https://zhuanlan.zhihu.com/p/68507311" target="_blank" rel="noopener" +>WebGL进阶——走进图形噪声</a>可以让你领略一些图形噪声的神奇。</p> +<p>很多场景都给出了 WebGL 实现的源码,可以边学边练。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://threegn.app/" target="_blank" rel="noopener" +>ThreeGN</a>,一个基于网页的三维建模程序,特点是具有类似 Blender 的几何节点编辑功能。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/2023-02-15-10-51-53.png" +width="846" +height="453" +loading="lazy" +class="gallery-image" +data-flex-grow="186" +data-flex-basis="448px" +></p> +</li> +<li> +<p><a class="link" href="https://tabler-icons.io/" target="_blank" rel="noopener" +>tabler</a>,一个开源的图标库,可用于 Web 或 移动端应用开发,全部免费使用。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/2023-02-15-10-55-30.png" +width="796" +height="314" +loading="lazy" +class="gallery-image" +data-flex-grow="253" +data-flex-basis="608px" +></p> +</li> +<li> +<p><a class="link" href="https://microsoftedge.microsoft.com/addons/detail/%E6%B2%89%E6%B5%B8%E5%BC%8F%E7%BF%BB%E8%AF%91/amkbmndfnliijdhojkpoglbnaaahippg" target="_blank" rel="noopener" +>immersive-translate</a>,一个在线翻译浏览器插件,支持 Edge、Firefox、Chrome 等浏览器,优点是可以在网页上追加中文显示,原文和译文同时展示,对于想提升外语水平的人士,是个不错的对照工具。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/2023-02-15-10-59-08.png" +width="621" +height="357" +loading="lazy" +class="gallery-image" +data-flex-grow="173" +data-flex-basis="417px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 019 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/Tue, 07 Feb 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/<h1 id="机器文摘-第-019-期">机器文摘 第 019 期</h1> +<h2 id="长文">长文</h2> +<h3 id="现阶段-ai-能对游戏开发提供多大帮助">现阶段 AI 能对游戏开发提供多大帮助</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-13-19-34.png" +width="686" +height="358" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="459px" +> +AI 在最近有多爆发自然不用我再赘述,抛开那些狂热的能够引起焦虑的言论(比如 AI 即将替代大量工作岗位),也有不少人选择跟 AI 和平相处。</p> +<p>这篇<a class="link" href="https://www.traffickinggame.com/ai-assisted-graphics/" target="_blank" rel="noopener" +>《AI 辅助图形》</a>的作者是一个有着游戏制作二十年经验的从业者,近期想尝试尽可能地利用各种 AI 加持的辅助工具,试图通过他们提升制作效率。</p> +<p>作者从游戏的概念原型阶段,一直到三维模型资产的制作和游戏场景的搭建,均选用了具有 AI 能力的效率工具进行支持。</p> +<p>最终结论是,虽然在过程中会有这样那样的不顺手,但这些工具确实能够帮助他节约大量工作时长。</p> +<p>所以作者的看法是,他很愿意将 AI 工具看作他的同事。</p> +<p>照这么说的话,留给人类的工作真的是不多了。</p> +<h3 id="chatgpt-学习笔记">ChatGPT 学习笔记</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-13-32-44.png" +width="600" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="178" +data-flex-basis="427px" +> +ChatGPT 在春节后又起了一波热度。</p> +<p>网上到处都是关于它的段子,有人用它写论文,有人拿来给孩子辅导作业,有人写情书,有人当个动嘴的甲方让它写程序。</p> +<p>喜得微软恨不得现在就把它接到搜索引擎里,逼得谷歌提前释放出自己的类似模型。</p> +<p>国内的百度也表示将在3月份发出自己的大规模语言模型。</p> +<p>要我说就不要这么着急,不妨拨开迷雾,看看 ChatGPT 是个什么东东。</p> +<p>在网上发现这篇<a class="link" href="https://blog.csdn.net/v_JULY_v/article/details/128579457" target="_blank" rel="noopener" +>《ChatGPT 通俗笔记》</a>,讲述了这个模型的发展历程,以及一些基本的概念原理。</p> +<p>此类中文资料不多,给这篇文章作者点赞。</p> +<h3 id="视觉设计的一些规则">视觉设计的一些规则</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-13-49-28.png" +width="697" +height="357" +loading="lazy" +class="gallery-image" +data-flex-grow="195" +data-flex-basis="468px" +> +现在专业的界限越来越模糊,每个人都应该掌握一些基本的设计理念,以便在日常工作中输出的成果具备基本的美感。</p> +<p>这篇<a class="link" href="https://anthonyhobday.com/sideprojects/saferules/" target="_blank" rel="noopener" +>《视觉设计安全法则》</a>,浅显易读、明确具体,对于视觉设计活动很有指导意义。</p> +<p>看完之后无论是自己动手做 PPT 还是软件的 demo 原型,都可以用到。</p> +<p>我觉得甚至对于摄影构图、房屋装修都能有所借鉴,因为美是相通的。</p> +<h3 id="python-做后端开发的技术选型">Python 做后端开发的技术选型</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-13-57-37.png" +width="673" +height="314" +loading="lazy" +class="gallery-image" +data-flex-grow="214" +data-flex-basis="514px" +> +有时候想做一些 Web 应用的原型,Python 是我的首选语言,写起来顺手又省事,能节约不少时间。</p> +<p>但是由于用的不够深入,在选择开发框架的时候,稍微有些困惑。</p> +<p>比如同样都能提供快速的开发能力,Fastapi 和 Flask到底选哪个?</p> +<p>如果你也有跟我一样的疑惑,可以看看这篇<a class="link" href="https://www.turing.com/kb/fastapi-vs-flask-a-detailed-comparison" target="_blank" rel="noopener" +>《Fastapi 和 Flask 详细对比》</a>。</p> +<p>文章深度分析了这两个框架的异同以及所适用的工作场景。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://github.com/red-data-tools/YouPlot" target="_blank" rel="noopener" +>YouPlot</a>,控制台绘图工具,可以在控制台窗口用字符的方式进行绘图,支持柱状图、散点图等。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-14-10-37.png" +width="587" +height="355" +loading="lazy" +class="gallery-image" +data-flex-grow="165" +data-flex-basis="396px" +></p> +</li> +<li> +<p><a class="link" href="https://play-cs.com/zh/servers" target="_blank" rel="noopener" +>网页在线联机 CS1.6</a>,只需浏览器即可联机玩反恐精英 1.6,这个网站通过 WASM 技术将 CS 1.6 移植到了网页中运行,现代浏览器均可支持,第一次加载时间略长,但体验还算流畅,在线人员数量也挺多,随时可以匹配到。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-14-20-36.png" +width="811" +height="397" +loading="lazy" +class="gallery-image" +data-flex-grow="204" +data-flex-basis="490px" +></p> +</li> +<li> +<p><a class="link" href="https://fffuel.co/sssvg" target="_blank" rel="noopener" +>交互式 SVG 参考</a>,一个可以在线了解 SVG 图形标准细节的网站,提供交互式界面进行实时演示。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-14-25-38.png" +width="904" +height="428" +loading="lazy" +class="gallery-image" +data-flex-grow="211" +data-flex-basis="506px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/LunarFang416/url-animations" target="_blank" rel="noopener" +>浏览器地址栏里的动画</a>,一个有意思的 Js 库,通过动态修改浏览器地址栏的 URL 地址来实现动画,效果还比较萌。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-14-26-39.png" +width="757" +height="208" +loading="lazy" +class="gallery-image" +data-flex-grow="363" +data-flex-basis="873px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 018 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/Tue, 31 Jan 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/<h1 id="机器文摘-第-018-期">机器文摘 第 018 期</h1> +<h2 id="长文">长文</h2> +<h3 id="游戏高清重制科林麦克雷拉力赛3">游戏高清重制《科林麦克雷拉力赛3》</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-09-15-47.png" +width="857" +height="434" +loading="lazy" +class="gallery-image" +data-flex-grow="197" +data-flex-basis="473px" +> +游戏高清重制一直是我比较感兴趣的话题,可能因为比较喜欢怀旧吧。</p> +<p>我曾经收藏过采用覆盖显示驱动的方式进行高清分辨率支持的《极品飞车 5》、《Quake 3》等游戏。</p> +<p>也见过一些更古老的游戏在更新资源包之后重新焕发青春。</p> +<p>不过一直没有接触过真正的重制过程。</p> +<p>这篇<a class="link" href="https://cookieplmonster.github.io/2023/01/15/remastering-colin-mcrae-rally-3-silentpatch/" target="_blank" rel="noopener" +>《重制科林麦克雷拉力赛》</a>详细记录了一个优秀的赛车游戏进行高清重制的过程。</p> +<p>可以带你了解老旧游戏如何进行“宽屏”、“超宽屏”支持,如何重制高清界面UI元素等,过程充满了对不可能的挑战。</p> +<h3 id="把网页渲染到控制台">把网页渲染到控制台</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-09-24-01.png" +width="1067" +height="464" +loading="lazy" +class="gallery-image" +data-flex-grow="229" +data-flex-basis="551px" +> +通过控制台窗口进行上网,你可能觉得并不新鲜。</p> +<p>毕竟已经有很多类似 w3m 这种在控制台下基于字符的浏览器程序。</p> +<p>但是他们的缺点都是不能显示图形,而且几乎失去了对页面的样式渲染。</p> +<p>今天这篇<a class="link" href="https://fathy.fr/carbonyl" target="_blank" rel="noopener" +>《把网页渲染到控制台》</a>则另辟蹊径,虽然同样是在控制台的字符界面,但是渲染手段却大不相同。</p> +<p>它将控制台字符当作单个像素来处理,采用现代浏览器内核进行页面解析和预渲染计算。</p> +<p>然后在像素渲染阶段,采用了控制台字符来进行替换。</p> +<p>虽然最终效果无法跟图形界面下的浏览器相比。</p> +<p>但是它毕竟提供了一种在终端控制台进行图形化网页显示的可能。</p> +<h3 id="chromium-渲染流水线字节码到像素的一生">Chromium 渲染流水线——字节码到像素的一生</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-09-32-37.png" +width="481" +height="580" +loading="lazy" +class="gallery-image" +data-flex-grow="82" +data-flex-basis="199px" +> +看了前面网页渲染到控制台的文章,如果对浏览器的原理架构比较感兴趣的话。</p> +<p>可以看看这篇<a class="link" href="https://zhuanlan.zhihu.com/p/574069391" target="_blank" rel="noopener" +>讲解 Chromium 浏览器渲染架构</a>的文章。</p> +<p>现代浏览器已经复杂到不可能通过个人从零开始实现。</p> +<p>了解一下他们的架构,即便不从事相关开发,也可能对自己的软件架构产生有益影响。</p> +<h3 id="99-行代码实现光线追踪">99 行代码实现光线追踪</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-09-40-20.png" +width="702" +height="235" +loading="lazy" +class="gallery-image" +data-flex-grow="298" +data-flex-basis="716px" +> +光线追踪在图形渲染中十分关键的概念。</p> +<p>同时也是现代电影工业实现逼真光照渲染所必须的技术手段。</p> +<p>然而它的原理却并不复杂,甚至只需少量代码就可以自己实现一个建议的渲染器。</p> +<p>这篇<a class="link" href="http://kevinbeason.com/smallpt/" target="_blank" rel="noopener" +>《99 行代码实现光线追踪》</a>就只是用了少量 C++ 代码实现了一个简单的带有全局光照、阴影、反射的场景渲染。</p> +<p>虽然看起来简单,效果还是很令人惊艳的。</p> +<p>适合我这种喜欢研究原理,但又不太深入的“技术爱好者”。</p> +<h3 id="光线追踪深入">光线追踪深入</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-09-47-14.png" +width="731" +height="333" +loading="lazy" +class="gallery-image" +data-flex-grow="219" +data-flex-basis="526px" +> +既然前面提到了光线追踪,不妨再引申一下。</p> +<p>很多光线追踪的入门教程都会教你渲染一些简单的模型,比如球体,圆柱体等等。</p> +<p>如果想基于光线追踪技术渲染复杂一些的三维模型,应该怎么做?</p> +<p>这里有一篇<a class="link" href="https://jamie-wong.com/2016/07/15/ray-marching-signed-distance-functions/" target="_blank" rel="noopener" +>《光线行进和符号距离函数》</a>,里面介绍了基于光线行进算法(光线追踪的一种实现方式)和符号距离函数来构建三维场景中复杂模型的思路。</p> +<p>内容比较详细,并带有示例代码。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://www.chronophoto.app/game.html" target="_blank" rel="noopener" +>chronophoto</a>,一个猜照片年代的游戏,根据网站随机展示的老照片,来判断这张照片是哪一年拍摄的,答案区间 1900 到 2020 ,我试了试还挺有意思,可以根据照片中出现的物品和人物的衣着进行分析。<br> +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-09-56-50.png" +width="944" +height="432" +loading="lazy" +class="gallery-image" +data-flex-grow="218" +data-flex-basis="524px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/GimelStudio/GimelStudio" target="_blank" rel="noopener" +>Gimel Studio</a>,一个基于节点系统的照片后期处理工具,开源,采用 Python 编写。<br> +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-10-00-55.png" +width="1009" +height="537" +loading="lazy" +class="gallery-image" +data-flex-grow="187" +data-flex-basis="450px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/vitoplantamura/BugChecker" target="_blank" rel="noopener" +>BugChecker</a>,一个支持 Windows 11 的类 SoftICE 调试器,开源。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-10-04-14.png" +width="649" +height="376" +loading="lazy" +class="gallery-image" +data-flex-grow="172" +data-flex-basis="414px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/google/swiftshader" target="_blank" rel="noopener" +>swiftshader</a>,一个基于 CPU 实现 OpenGL 渲染的图形库。主要应用在谷歌开源的 chromium 项目里,用纯软件算法实现了OpenGL、Vulkan图形接口。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-10-08-42.png" +width="308" +height="307" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 017 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/Mon, 16 Jan 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/<h1 id="机器文摘-第-017-期">机器文摘 第 017 期</h1> +<p><em>预计春节期间暂停更新,节后恢复。</em></p> +<h2 id="长文">长文</h2> +<h3 id="怎样在-1-位色深的-lcd-屏幕上显示灰度httpswwwzephraymepostgrayscale_lcd"><a class="link" href="https://www.zephray.me/post/grayscale_lcd/" target="_blank" rel="noopener" +>怎样在 1 位色深的 LCD 屏幕上显示灰度</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-09-33-34.png" +width="1920" +height="1080" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +> +只有 1 位色深的 LCD 屏幕按理说是不能显示灰度的,因为他的像素点要么纯黑、要么纯白,显示的图案效果肯定非常差。</p> +<p>如果说非要显示灰度的话,我第一个想法是通过<a class="link" href="https://zh.wikipedia.org/wiki/%E6%8A%96%E5%8B%95_%28%E6%95%B8%E4%BD%8D%E8%A8%8A%E8%99%9F%E8%99%95%E7%90%86%29" target="_blank" rel="noopener" +>抖动算法</a>进行模拟(即通过像素点的稀疏程度来制造错觉,如下图)。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-09-40-49.png" +width="180" +height="215" +loading="lazy" +class="gallery-image" +data-flex-grow="83" +data-flex-basis="200px" +></p> +<p>然而这篇文章的作者采取了更为巧妙地方法,使用 PWM (脉冲宽度调制)技术,利用每个像素点的点亮时间不同来制造灰度错觉。</p> +<p>之前只是见过使用 PWM 调整 LED 灯泡的亮度,像这种用法我倒是第一次见。</p> +<h3 id="作为一名数据工程师和作家我为什么要用-neovimhttpswwwsspaeticomblogwhy-using-neovim-data-engineer-and-writer-2023"><a class="link" href="https://www.sspaeti.com/blog/why-using-neovim-data-engineer-and-writer-2023/" target="_blank" rel="noopener" +>作为一名数据工程师和作家,我为什么要用 (Neo)vim</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-09-44-27.png" +width="500" +height="264" +loading="lazy" +class="gallery-image" +data-flex-grow="189" +data-flex-basis="454px" +></p> +<p>很多人都被 Vim 复杂的功能和陡峭的学习曲线吓到过。</p> +<p>也有很多人本着对效率的极致追求,而选择了征服 Vim,从而走上高效(折腾)的路线。</p> +<p>本文作者作为一名数据工程师,讲述了他学习 Vim 的心路历程,也许对于现在还在观望的人有所启发。</p> +<p>我个人使用 Vim 已十多年时间,虽然从未触及特别深入的技能(如宏定义、寄存器等),但是 Vim 这种神器的特点就是,只要你忍者难受越过操作的及格线,剩下的技能你稍微多掌握一点,就能马上给你带来非常丰厚的回报。</p> +<h3 id="焦散是什么如何正确地渲染焦散httpswwwchaoscomcnblogwhat-are-caustics-and-how-to-render-them-the-right-way"><a class="link" href="https://www.chaos.com/cn/blog/what-are-caustics-and-how-to-render-them-the-right-way" target="_blank" rel="noopener" +>焦散是什么?如何正确地渲染焦散?</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-09-55-28.png" +width="850" +height="469" +loading="lazy" +class="gallery-image" +data-flex-grow="181" +data-flex-basis="434px" +> +焦散(Caustics)在现实生活中随处可见,但在渲染图中却很稀有。这篇文章解答了为什么渲染焦散很难,以及有哪些方法可以迂回实现。</p> +<p>找到这篇文章是因为我在 Github 上发现了<a class="link" href="https://github.com/pmndrs/drei#caustics" target="_blank" rel="noopener" +>一个使用 webgl 实现焦散渲染的项目</a>,效果非常不错,于是想研究一下背后的原理。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-10-02-22.png" +width="652" +height="339" +loading="lazy" +class="gallery-image" +data-flex-grow="192" +data-flex-basis="461px" +></p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://refactoringguru.cn/design-patterns" target="_blank" rel="noopener" +>常用设计模式有哪些</a>,一本在线电子书,图文并茂,以比较直观的方式介绍了软件开发常用的设计模式,支持英文、日文、中文等多国语言。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-10-04-26.png" +width="673" +height="357" +loading="lazy" +class="gallery-image" +data-flex-grow="188" +data-flex-basis="452px" +></p> +</li> +<li> +<p><a class="link" href="https://abseil.io/resources/swe-book/html/toc.html" target="_blank" rel="noopener" +>谷歌的软件工程</a>,好几年前的一本书,讲述在谷歌做软件开发的体验和最佳实践,现在出了可免费阅读的电子版。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-10-04-41.png" +width="504" +height="662" +loading="lazy" +class="gallery-image" +data-flex-grow="76" +data-flex-basis="182px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/ToolJet/ToolJet" target="_blank" rel="noopener" +>开源低代码开发框架 ToolJet</a>,免费开源的低代码开发框架,带有可视化编辑器,从数据持久化到前端界面全部无需编写代码。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-10-08-12.png" +width="795" +height="414" +loading="lazy" +class="gallery-image" +data-flex-grow="192" +data-flex-basis="460px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/Eandrju/cellular-automaton.nvim" target="_blank" rel="noopener" +>一个无聊的 Neovim 插件</a>,一个没啥用的 Neovim 插件,唯一能做的事情是当你感到无聊时,可以将你的文本编辑区里的文本执行一个“元胞自动机”动画,看起来还算解压。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-10-11-33.png" +width="547" +height="614" +loading="lazy" +class="gallery-image" +data-flex-grow="89" +data-flex-basis="213px" +></p> +</li> +<li> +<p><a class="link" href="https://www.futurepedia.io/" target="_blank" rel="noopener" +>最大的 AI 工具箱</a>,喜欢研究 AI 的不要错过这个网站,收集了各种 AI 模型的开源项目和相关网址,涵盖了图像识别、自然语言处理等常见的、时兴的 AI 技术。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-10-15-15.png" +width="1151" +height="729" +loading="lazy" +class="gallery-image" +data-flex-grow="157" +data-flex-basis="378px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 016 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/Tue, 10 Jan 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/<h1 id="机器文摘-第-016-期">机器文摘 第 016 期</h1> +<h2 id="长文">长文</h2> +<h3 id="黑客与汽车httpssamcurrynetweb-hackers-vs-the-auto-industry"><a class="link" href="https://samcurry.net/web-hackers-vs-the-auto-industry/" target="_blank" rel="noopener" +>黑客与汽车</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-13-16-50.png" +width="680" +height="414" +loading="lazy" +class="gallery-image" +data-flex-grow="164" +data-flex-basis="394px" +> +现在的汽车很多都具有联网的能力,可以通过互联网进行便利的远程操作。</p> +<p>比如获取汽车位置、健康状态、远程启动、远程开门等等。</p> +<p>作为消费者来说,在使用这些便利功能的时候,内心是十分信任厂商的。</p> +<p>觉得安全问题肯定会被厂商非常重视,作为头号问题来抓。</p> +<p>然而这篇<a class="link" href="https://samcurry.net/web-hackers-vs-the-auto-industry/" target="_blank" rel="noopener" +>《黑客与汽车》</a>却改变了我的看法,原来这些车联网的安全防护如此的脆弱。</p> +<p>文章作者为业内人士,写的还比较实在。如下列举部分这些黑客可以对车进行的未授权操作:</p> +<ol> +<li>远程发动机启停、车门解锁与锁定、大灯闪烁、喇叭鸣笛;</li> +<li>锁定用户,迁移管理权;</li> +<li>根据车架号下载到用户的销售档案;</li> +<li>远程刷新更新车辆电脑固件;</li> +<li>跟踪车辆物理GPS位置;</li> +</ol> +<p>看完我感觉是不是得把我的相关车联网服务给停一停了。</p> +<h3 id="汇编代码阅读指南httpswwwtimdbgcompostsfakers-guide-to-assembly"><a class="link" href="https://www.timdbg.com/posts/fakers-guide-to-assembly/" target="_blank" rel="noopener" +>汇编代码阅读指南</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-13-30-23.png" +width="1061" +height="636" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="400px" +> +写汇编代码很麻烦,阅读起来也很费劲吗?</p> +<p>这儿有<a class="link" href="https://www.timdbg.com/posts/fakers-guide-to-assembly/" target="_blank" rel="noopener" +>一份简要的汇编阅读指南</a>,作者介绍了一些汇编代码的阅读技巧。</p> +<p>因为根据统计显示,最常用的汇编指令也就那么十来个,所以并没有想象中的那么晦涩和高深莫测。</p> +<h3 id="使用-svg-绘制逼真的绳索httpsmuffinmanioblogdraw-svg-rope-using-javascript"><a class="link" href="https://muffinman.io/blog/draw-svg-rope-using-javascript/" target="_blank" rel="noopener" +>使用 SVG 绘制逼真的绳索</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-13-38-11.png" +width="786" +height="342" +loading="lazy" +class="gallery-image" +data-flex-grow="229" +data-flex-basis="551px" +> +SVG 是在网页中进行矢量绘图的技术,比起 Canvas 画板的像素图像,SVG 具有放大不失真的特点,在网页中可以通过 Javascript 操作生成 SVG 图形对象,实现各种复杂的图案。</p> +<p>这篇文章的作者从几何的角度考虑了如何使用矢量图形来绘制一个现实中的麻绳图案,要不仅体现出绳索的扭曲,还要正确表现绳索分支之间的叠压,作者提出了一个巧妙的使用 SVG path 进行实现的方法。还给出了代码。</p> +<p>你要问作者为什么这么做,有什么用没有?我想作者可能会回答:Because I can !</p> +<h3 id="ssh-进阶用法介绍httpsplantegggithubio20190602e58fb2e4b88ae69c80e585a8_ssh_e69a97e9bb91e68a80e5b7a7e8afa6e8a7a3--e694b6e8978fe4bf9de5b9b3e5ae89"><a class="link" href="https://plantegg.github.io/2019/06/02/%E5%8F%B2%E4%B8%8A%E6%9C%80%E5%85%A8_SSH_%E6%9A%97%E9%BB%91%E6%8A%80%E5%B7%A7%E8%AF%A6%E8%A7%A3--%E6%94%B6%E8%97%8F%E4%BF%9D%E5%B9%B3%E5%AE%89/" target="_blank" rel="noopener" +>SSH 进阶用法介绍</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-13-55-02.png" +width="800" +height="480" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="400px" +></p> +<p>经常在 Linux 系统下进行开发或者运维的专业人士,可能每天使用最多的工具就是 SSH 了,每天都要通过它登录服务端系统,进行一系列的操作。</p> +<p>这里<a class="link" href="https://plantegg.github.io/2019/06/02/%E5%8F%B2%E4%B8%8A%E6%9C%80%E5%85%A8_SSH_%E6%9A%97%E9%BB%91%E6%8A%80%E5%B7%A7%E8%AF%A6%E8%A7%A3--%E6%94%B6%E8%97%8F%E4%BF%9D%E5%B9%B3%E5%AE%89/" target="_blank" rel="noopener" +>有一篇文章</a>比较全面地介绍了 SSH 的进阶使用技巧,可以在某种程度上极大提升效率以及操作体验。</p> +<p>列举部分如下:</p> +<ol> +<li>如何免密码登录;</li> +<li>如何映射服务端的服务端口到本地(以方便调试);</li> +<li>如何将服务端的图形界面(如xcalc)代理到本地电脑显示和交互(不是远程桌面哦);</li> +<li>一些网络端口映射之类的高级操作;</li> +</ol> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://gist.github.com/sbabybird/c340dee0fbec2e1dfe4a1c49d311cf4b" target="_blank" rel="noopener" +>个人年终总结模板</a>,我做了一个基于 Markdown 语法的年终总结模板,方便梳理在编写个人总结时的思路,放在 github 上的 gist 里了,可以随意使用。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-13-57-40.png" +width="416" +height="486" +loading="lazy" +class="gallery-image" +data-flex-grow="85" +data-flex-basis="205px" +></p> +</li> +<li> +<p><a class="link" href="https://www.webdesignmuseum.org/" target="_blank" rel="noopener" +>web 网页设计博物馆</a>,一个保存古老网页设计的网站。记录了 1999 年到 2020 年各大公司的网页设计变迁。包括谷歌、亚马逊、苹果、任天堂、麦当劳等等。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-14-01-04.png" +width="918" +height="568" +loading="lazy" +class="gallery-image" +data-flex-grow="161" +data-flex-basis="387px" +></p> +</li> +<li> +<p><a class="link" href="https://allinone.tools/" target="_blank" rel="noopener" +>一站式网页工具大全</a>,一堆的在线工具汇总,包括图片处理、PDF格式转换、文字编码转换、密码生成、字符串加密解密等等,常用工具一网打尽。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-14-05-09.png" +width="1320" +height="570" +loading="lazy" +class="gallery-image" +data-flex-grow="231" +data-flex-basis="555px" +></p> +</li> +<li> +<p><a class="link" href="https://gamepad-tester.com/" target="_blank" rel="noopener" +>在线手柄测试工具</a>,打开网页即可测试游戏手柄的工作状态,按键是否灵敏,遥感是否有死区等等,非常方便。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-14-11-28.png" +width="930" +height="614" +loading="lazy" +class="gallery-image" +data-flex-grow="151" +data-flex-basis="363px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 015 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/Tue, 03 Jan 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/<h1 id="机器文摘-第-015-期">机器文摘 第 015 期</h1> +<h2 id="长文">长文</h2> +<h3 id="编程就是玩儿httpsaustinhenleycomblogprogrammingasplayhtml"><a class="link" href="https://austinhenley.com/blog/programmingasplay.html" target="_blank" rel="noopener" +>编程就是玩儿</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-13-43-13.png" +width="804" +height="355" +loading="lazy" +class="gallery-image" +data-flex-grow="226" +data-flex-basis="543px" +></p> +<p>对于程序员或者技术从业者来说,以一种什么样的心态工作将十分影响成果的产出。</p> +<p><a class="link" href="https://austinhenley.com/blog/programmingasplay.html" target="_blank" rel="noopener" +>这篇文章</a>的作者给大家分享了他自己的感受&mdash;-“不把编程视为严肃的工作、目标只是玩得开心、为了好玩而编程”。</p> +<p>他同时也是 <a class="link" href="https://news.ycombinator.com/item?id=27256867" target="_blank" rel="noopener" +>《为什么我喜欢做无用的东西》</a>帖子的作者。</p> +<p>除了文章本身之外,<a class="link" href="https://news.ycombinator.com/item?id=34086416" target="_blank" rel="noopener" +>在 HN 配套的讨论帖子在这里</a>。</p> +<p>这种类似于“寓教于乐”、“做自己开心的事儿”等等内容,一直是一个值得探讨的话题。</p> +<p>我个人也倾向于以兴趣和爱好来驱动自己,只是如果这个兴趣和爱好顺便能够挣钱,那就更好了。</p> +<h3 id="webassembly没有容器的-dockerhttpswasmlabsdevarticlesdocker-without-containers"><a class="link" href="https://wasmlabs.dev/articles/docker-without-containers/" target="_blank" rel="noopener" +>WebAssembly:没有容器的 Docker</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-13-45-15.png" +width="3483" +height="1436" +loading="lazy" +class="gallery-image" +data-flex-grow="242" +data-flex-basis="582px" +></p> +<p>最近 <a class="link" href="https://www.docker.com" target="_blank" rel="noopener" +>Docker</a> 宣布与 <a class="link" href="https://github.com/WasmEdge/Wasmedge" target="_blank" rel="noopener" +>WasmEdge</a> 合作支持 WebAssembly 。</p> +<p>WebAssembly 和 Docker 我们都听说过,在前面的文摘中我还尝试过自己使用 Rust 编写运行在网页里的 WebAssembly 应用程序。</p> +<p>Docker 也是我工作中每天都要用到的容器技术。</p> +<p>那他们两个有什么关系?放在一起能碰撞出什么火花?</p> +<p><a class="link" href="https://wasmlabs.dev/articles/docker-without-containers/" target="_blank" rel="noopener" +>这篇文章</a>将讲解这两种技术的结合在云原生架构下的使用。</p> +<p>看来 WebAssembly 技术不仅可以在浏览器环境中发挥作用,还能在云计算、边缘计算等领域发光发热,前途不可限量嘛。</p> +<h3 id="3d-摄影测量建模技术httpswwwjeffgeerlingcomblog2021modeling-my-grandpa-3d-photogrammetry"><a class="link" href="https://www.jeffgeerling.com/blog/2021/modeling-my-grandpa-3d-photogrammetry" target="_blank" rel="noopener" +>3D 摄影测量建模技术</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-13-58-29.png" +width="712" +height="340" +loading="lazy" +class="gallery-image" +data-flex-grow="209" +data-flex-basis="502px" +></p> +<p>3D 摄影测量建模,是一种通过对物体多角度拍摄照片,然后使用计算机通过软件算法合成为 3D 模型的技术。</p> +<p>从最开始在专业领域(如:建筑工程、考古)使用,到现在已经普及到普通人只需安装手机 App 也能轻松实现了。</p> +<p>这篇<a class="link" href="https://www.jeffgeerling.com/blog/2021/modeling-my-grandpa-3d-photogrammetry" target="_blank" rel="noopener" +>用3D摄影测量法对我的爷爷建模</a>记述了作者如何使用 3D 摄影测量建模技术给自己爷爷的雕像进行“数字化”的过程。</p> +<p>里面详细记录了整个过程所使用的开源软件和相关的配置细节。</p> +<p>对于一些想要进行一次实操演练的朋友来说可能有用。</p> +<h3 id="在-2d-游戏中如何模拟-3d-的光影效果httpswwwgamedevelopercomprogramminggraveyard-keeper-how-the-graphics-effects-are-made"><a class="link" href="https://www.gamedeveloper.com/programming/graveyard-keeper-how-the-graphics-effects-are-made" target="_blank" rel="noopener" +>在 2D 游戏中如何模拟 3D 的光影效果</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-14-14-17.png" +width="454" +height="265" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="411px" +></p> +<p>《守墓人》是一款经典的 2D 角色扮演游戏,比起它的精彩剧情和有趣的玩法,出色的画面效果也是该游戏取得成功的重要原因。</p> +<p>这篇<a class="link" href="https://www.gamedeveloper.com/programming/graveyard-keeper-how-the-graphics-effects-are-made" target="_blank" rel="noopener" +>《守墓人的图形效果是如何制作的》</a>文章,由该游戏的核心开发者于 2018 年发表,讲述了很多关于实现在 2D 画面带来更加有立体光影效果的特殊技巧。</p> +<p>文章虽然老了一点,但是技术没有过时。</p> +<p>读进去可以深深体会到:一个优秀作品的创造,离不开对各种不可能的挑战和极限的突破。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://bluemaxima.org/flashpoint/" target="_blank" rel="noopener" +>Flash 游戏大全</a>,上一期里我摘录了一个关于复刻 Flash 游戏的故事。后来也勾起了我对于 Flash 小游戏的怀念。便深入探索了一下现在这个阶段该如何再去运行那些老游戏。Flashpoint 是一个 Web 游戏保存工程,号称已经累计保存了包括 Flash 在内的 35 个平台的超过十万个小游戏。这个工程在 2018 年 1 月启动,试图在 Flash 消亡之前将之前的经典内容进行备份。现在提供两种版本的下载包,一种全量下载的大概 1.3 TB,包含了全部游戏。一种增量下载的,700多MB,只带了部分游戏,但是支持随下随玩。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-14-33-07.png" +width="1001" +height="382" +loading="lazy" +class="gallery-image" +data-flex-grow="262" +data-flex-basis="628px" +></p> +</li> +<li> +<p><a class="link" href="https://sweetcocoa.github.io/pop2piano_samples/" target="_blank" rel="noopener" +>根据音频自动生成钢琴旋律</a>,一个开源的 AI 模型,可以根据歌曲的音频识别出里面的旋律主线,并且使用钢琴演奏出来,效果十分神奇。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-14-41-36.png" +width="741" +height="456" +loading="lazy" +class="gallery-image" +data-flex-grow="162" +data-flex-basis="390px" +></p> +</li> +<li> +<p><a class="link" href="https://virtualconsoles.com/online-emulators/c64/" target="_blank" rel="noopener" +>C64 Emulator</a>,一个在线的 commodore 64 电脑模拟器,可以直接将磁盘镜像拖拽到网页上进行加载,页面还提供了虚拟键盘。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-14-44-02.png" +width="643" +height="733" +loading="lazy" +class="gallery-image" +data-flex-grow="87" +data-flex-basis="210px" +></p> +</li> +<li> +<p><a class="link" href="https://shadiao.pro/" target="_blank" rel="noopener" +>沙雕 App</a>,收集了各种有趣网站、工具的导航站,之前就关注过,最近好像升级了,喜欢恶搞的同学可以到里面找到一些比较有恶趣味的小程序。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-14-47-42.png" +width="676" +height="371" +loading="lazy" +class="gallery-image" +data-flex-grow="182" +data-flex-basis="437px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 014 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/Tue, 27 Dec 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/<h1 id="机器文摘-第-014-期">机器文摘 第 014 期</h1> +<h2 id="长文">长文</h2> +<h3 id="运行在单片机上的-qthttpsdecovardevblog20221224qt-on-mcu"><a class="link" href="https://decovar.dev/blog/2022/12/24/qt-on-mcu/" target="_blank" rel="noopener" +>运行在单片机上的 Qt</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-13-43-13.png" +width="684" +height="456" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="360px" +></p> +<p>尝试过给单片机写图形界面没有?</p> +<p>这篇 <a class="link" href="https://decovar.dev/blog/2022/12/24/qt-on-mcu/" target="_blank" rel="noopener" +>《Qt on MCU》 </a>比较系统的介绍了“为什么选择 Qt(一套开源图形界面库) 给单片机做界面”、“Qt 的基本架构”、“程序移植性”等相关问题。</p> +<p>读完可以较为全面地了解在单片机这种机能较弱的硬件设备上制作图形界面的基本思路和需要关注的问题。</p> +<h3 id="openwrtlede-搭建-syncthing-p2p-私有文件同步服务httpschenhemepostopenwrt-syncthing"><a class="link" href="https://chenhe.me/post/openwrt-syncthing/" target="_blank" rel="noopener" +>OpenWrt/LEDE 搭建 Syncthing p2p 私有文件同步服务</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-13-56-50.png" +width="1251" +height="730" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="411px" +></p> +<p>现在大家都不止一个电子终端设备,个人数字信息、各种数据文件的同步需求基本上是一个刚需。</p> +<p>有很多厂商提供了收费方案,比较常见的有国内的各种网盘、手机厂商提供的各种 Cloud 服务等等。</p> +<p>如果想基于家庭网络自己动手搭建一个私有服务的话,可能略微麻烦一些,不过也有较为成熟的方案了。</p> +<p>条件具备的话不妨参考这篇<a class="link" href="https://chenhe.me/post/openwrt-syncthing/" target="_blank" rel="noopener" +>《OpenWrt/LEDE 搭建 Syncthing p2p 私有文件同步服务》</a>动手试一试。</p> +<h3 id="用-flash-高清重制一款游戏httpswwwjiqizhixincomarticles2022-12-22-2"><a class="link" href="https://www.jiqizhixin.com/articles/2022-12-22-2" target="_blank" rel="noopener" +>用 Flash 高清重制一款游戏</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-13-58-23.png" +width="600" +height="338" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></p> +<p>Flash 基本已经成为历史了。</p> +<p>即便现在可以通过一些渠道或者浏览器勉强开启 Flash 插件的话,也会提心掉胆地担心计算机的安全性。</p> +<p>毕竟那些恼人的弹窗广告有 80% 都是靠 Flash 技术实现的。</p> +<p>但是还有这么一群人,他们玩着 4399 上的小游戏长大,80 后喜欢的各种主机游戏在他们眼里根本不值一提,倒是网页上那种基于 Flash 制作的即开即玩的小游戏(比如我能想到的就有:黄金矿工、狂扁小朋友、打企鹅等等)才是他们的最爱。</p> +<p>Flash 技术被时代抛弃,那些 4399 们也就逐渐消失了。</p> +<p>不过总有人会拥抱情怀,这篇<a class="link" href="https://www.jiqizhixin.com/articles/2022-12-22-2" target="_blank" rel="noopener" +>《为拯救童年回忆,开发者决定采用古法编程》</a>便讲述了这样一个故事。</p> +<p>里面的哥们儿以极其硬核的方式实现了他的梦想,为了复刻一个 Flash 小游戏,他几乎重新写了一个 Flash 播放器。</p> +<h3 id="unix-终端系统tty是如何工作的httpswaynervcompostshow-tty-system-works"><a class="link" href="https://waynerv.com/posts/how-tty-system-works/" target="_blank" rel="noopener" +>Unix 终端系统(TTY)是如何工作的</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-14-09-23.png" +width="2560" +height="2272" +loading="lazy" +class="gallery-image" +data-flex-grow="112" +data-flex-basis="270px" +></p> +<p>没有使用过大型机而直接进入 PC 时代的计算机用户,可能觉得“终端”就是电脑上那个能够输入 CMD 命令的黑乎乎窗口吧。</p> +<p>即便是终日与命令行打交道的软件开发人员、系统运维人员,可能也很难一下子解释清楚什么是“终端”,它为什么叫这个名字。</p> +<p>这篇<a class="link" href="https://waynerv.com/posts/how-tty-system-works/" target="_blank" rel="noopener" +>《Unix 终端系统(TTY)是如何工作的》</a>从计算机硬件发展的历史出发,介绍了计算机系统跟用户交互的发展历程,并针对“终端”系统进行详细展开,讲解了实现原理和后来发展的现代形态。</p> +<p>喜欢硬核知识的朋友可点进去阅读一下。</p> +<h3 id="hn-讨论极大提升你效率的软件有哪些httpsnewsycombinatorcomitemid34069106"><a class="link" href="https://news.ycombinator.com/item?id=34069106" target="_blank" rel="noopener" +>HN 讨论:极大提升你效率的软件有哪些?</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-14-16-52.png" +width="776" +height="403" +loading="lazy" +class="gallery-image" +data-flex-grow="192" +data-flex-basis="462px" +></p> +<p>哪些软件最能节约你的时间、解放你的双手、使你离不开它?</p> +<p>这个话题几乎每过一段时间就会被拿出来讨论一番。</p> +<p>每个人都有自己的偏爱。</p> +<p>不过,看看大家的讨论,说不定也能发现一些新鲜的软件,也许能更新一下自己的工具库也说不定。</p> +<blockquote> +<p>比如上面这篇帖子里,楼主提到的 <a class="link" href="https://github.com/BurntSushi/xsv" target="_blank" rel="noopener" +>这个 csv 工具</a> ,可以在命令行让你高效对 csv 文件进行快速检索、合并查询、切片等等。 +不过帖子里可能有人把节奏带偏了,在下面大吹特吹各种 IDE 软件,就仁者见仁了。</p> +</blockquote> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://huili.github.io/" target="_blank" rel="noopener" +>SQlite源码分析</a>,一本讲解 SQlite 源码的在线电子书,主要对 SQLite 数据库的实现机制和使用方法做了简要分析。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-14-25-49.png" +width="804" +height="424" +loading="lazy" +class="gallery-image" +data-flex-grow="189" +data-flex-basis="455px" +></p> +</li> +<li> +<p><a class="link" href="https://retrogame.com.ua/2022/03/moarstalgia-windows-98-3dfx-amp-dos-retro-gaming-pack/" target="_blank" rel="noopener" +>经典复古 win98 游戏合集</a>,一个游戏整合包,里面整合了若干在 Win98 系统下才能跑的老游戏,像初代的雷神之锤、半条命、极品飞车等等。提供了基于 DosBox 的虚拟系统,即开即用,性能还不错。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-14-33-08.png" +width="656" +height="387" +loading="lazy" +class="gallery-image" +data-flex-grow="169" +data-flex-basis="406px" +></p> +</li> +<li> +<p><a class="link" href="http://www.doshaven.eu/programming-tools/" target="_blank" rel="noopener" +>DOS 系统下的编程工具合集</a>,想要重温在 DOS 环境下编程的感受,这里有一套比较全面的工具合集,包括 QBASIC、TurboC 等开发环境,以及一些用于游戏开发的图形库、引擎。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-14-59-31.png" +width="908" +height="527" +loading="lazy" +class="gallery-image" +data-flex-grow="172" +data-flex-basis="413px" +></p> +</li> +<li> +<p><a class="link" href="https://humanbenchmark.com/dashboard" target="_blank" rel="noopener" +>给你自己跑个分</a>,现在一些硬件评测动不动就使用软件进行跑分,用以展示硬件之间的形成差异,这个网站提供了一组小游戏,可以考验你的短期记忆力、反应能力,并给你打分。也试试给自己跑个分吧。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-15-05-15.png" +width="900" +height="511" +loading="lazy" +class="gallery-image" +data-flex-grow="176" +data-flex-basis="422px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 012 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/Tue, 13 Dec 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/<h1 id="机器文摘-第-012-期">机器文摘 第 012 期</h1> +<h2 id="长文">长文</h2> +<h3 id="github-登录被第三方网站滥用了吗">Github 登录被第三方网站滥用了吗?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-13-30-19.png" +width="494" +height="491" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="241px" +> +为了方便账号注册,现在很多网站都提供了基于 Github 账号登录的方式。</p> +<p>我个人也更倾向于使用这种方式登录。</p> +<p>毕竟可以少填一些注册信息,减少思考密码的麻烦。</p> +<p>但是这样做有什么安全问题没有?</p> +<p>上周有一个<a class="link" href="https://news.ycombinator.com/item?id=33917962" target="_blank" rel="noopener" +>在 HackerNews 上的帖子</a>,有人遇到了在使用 Github 账号登录某些网站之后,导致他的账号莫名给别的仓库添 Star 的情况。</p> +<p>这引发了大家关于 Github 账号权限管理以及通过第三方鉴权进行账号登录和注册的讨论。</p> +<p>看完觉得在第三方鉴权授权时还是应该慎重使用才好。</p> +<h3 id="每个黑客都知道的命令行快捷键">每个黑客都知道的命令行快捷键</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-13-41-23.png" +width="926" +height="636" +loading="lazy" +class="gallery-image" +data-flex-grow="145" +data-flex-basis="349px" +> +在图形化界面、触控操作交互界面已经十分普及的今天,普通用户可能现在很少能接触到命令行操作了。</p> +<p>但是对于软件开发者、IT运维工程师来说,命令行还是属于离不开的操作界面。</p> +<p>而且对于有些工作任务来说,使用命令行完成起来要更加高效。</p> +<p><a class="link" href="https://www.masteringemacs.org/article/keyboard-shortcuts-every-command-line-hacker-should-know-about-gnu-readline" target="_blank" rel="noopener" +>这篇文章</a>讲解了常见命令行交互时的一些快捷操作,比如常见的行内编辑、快速移动光标到命令开头、历史记录搜索等等。</p> +<p>掌握之后可以在各种命令行交互界面中进行使用(基本风格一致)。</p> +<h3 id="基于颜色循环的动画技术">基于颜色循环的动画技术</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-13-54-06.png" +width="509" +height="383" +loading="lazy" +class="gallery-image" +data-flex-grow="132" +data-flex-basis="318px" +> +在计算机硬件资源匮乏的上世纪 90 年代,开发人员为了在有限条件下实现丰富的效果真是挖空心思。</p> +<p>比如,还记得 Windows 98 的启动画面吗?</p> +<p>蓝天白云,Windows 徽标,底部有一个蓝色的渐变色条,在缓慢的滚动。</p> +<p>实际上它只是一幅图片,并非多帧动画。</p> +<p>这就用到了一个叫做<a class="link" href="https://en.wikipedia.org/wiki/Color_cycling" target="_blank" rel="noopener" +>“颜色循环”</a>的技术。</p> +<blockquote> +<p>来自维基百科:颜色循环,也称为调色板移动,是计算机图形学中使用的一种技术,其中颜色被更改以产生动画的假象。这种技术主要用于早期的电脑游戏,因为存储一个图像并更改其调色板比将动画存储为几帧需要更少的内存和处理器能力。</p> +</blockquote> +<p><a class="link" href="http://www.effectgames.com/effect/article-Old_School_Color_Cycling_with_HTML5.html" target="_blank" rel="noopener" +>这里有个博客</a>使用 HTML Canvas 复刻了一批采用颜色循环创作的作品,效果非常惊艳。</p> +<p>另外网站还开源了用于展示这些作品的图形引擎,虽然现在已经不再维护了,但是用于学习和探索还是很有研究意义。</p> +<h3 id="软件逆向工程入门">软件逆向工程入门</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-14-06-08.png" +width="716" +height="442" +loading="lazy" +class="gallery-image" +data-flex-grow="161" +data-flex-basis="388px" +> +软件的加密和破解在普通用户眼里十分神秘。</p> +<p>这篇<a class="link" href="https://to-be-deleted-in-2022.emily.st/2015/01/27/reverse-engineering/" target="_blank" rel="noopener" +>软件逆向工程入门</a>比较深入浅出地介绍了一些常用手法,跟着作者可以浅尝一下在内存中寻找注册号、修改汇编指令以使得软件保护失效等体验。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="http://nifty.stanford.edu/" target="_blank" rel="noopener" +>计算机课后作业</a>,斯坦福大学计算机专业评选的历年来优秀作业作品。如果不知道自己编程需要练习什么的话,可以打开参考参考,很有实用价值,比起在 Leecode 上刷算法的题目,这些作业都在解决实际问题。</p> +</li> +<li> +<p><a class="link" href="https://scholar.archive.org/" target="_blank" rel="noopener" +>互联网档案学术</a>,全文检索索引包含超过2500万的研究文章和其他保存在互联网档案馆里的学术文档。 该馆藏涵盖从18世纪期刊的数字化副本,到最新的Open Access会议记录和从万维网上抓取的预印本。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-14-19-26.png" +width="1113" +height="507" +loading="lazy" +class="gallery-image" +data-flex-grow="219" +data-flex-basis="526px" +></p> +</li> +<li> +<p><a class="link" href="https://playcanvas.com/" target="_blank" rel="noopener" +>PlayCanvas Web 优先的游戏引擎</a>,一个免费的游戏引擎,倡导以 Web 优先,在网页中提供从开发到发行的全部流程支持。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-14-23-40.png" +width="961" +height="655" +loading="lazy" +class="gallery-image" +data-flex-grow="146" +data-flex-basis="352px" +></p> +</li> +<li> +<p><a class="link" href="https://asciinema.org/" target="_blank" rel="noopener" +>命令行会话记录器</a>,Asciinema 是一个免费开源软件,用于帮助用户录制在命令行中的操作行为,便于在互联网上分发自己的操作示范、教学演示。比起直接视频录屏的方式,这种以字符方式的记录更加节约资源,无论是记录、传播还是回放环节,都很轻量。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-14-29-43.png" +width="631" +height="383" +loading="lazy" +class="gallery-image" +data-flex-grow="164" +data-flex-basis="395px" +></p> +</li> +<li> +<p><a class="link" href="https://matthias-research.github.io/pages/tenMinutePhysics/index.html" target="_blank" rel="noopener" +>十分钟物理</a>,这套教程集合了一组十分钟左右的视频短片,每次介绍一个基本的物理概念并通过 Web 前端技术编程实现模拟。除了视频之外,网站还提供了源代码、演示环境等配套资源。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-14-32-47.png" +width="1191" +height="666" +loading="lazy" +class="gallery-image" +data-flex-grow="178" +data-flex-basis="429px" +></p> +</li> +<li> +<p><a class="link" href="http://skilldrick.github.io/easy6502/" target="_blank" rel="noopener" +>Easy6502</a>,一本学习 6502 汇编的电子书(没错,我就是特别喜欢这款 CPU)。网站带有交互界面,提供了一个简易模拟器,可以边学边练,教程最后会带你实现一个基于汇编的贪食蛇游戏。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-14-43-13.png" +width="608" +height="484" +loading="lazy" +class="gallery-image" +data-flex-grow="125" +data-flex-basis="301px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 013 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/Mon, 12 Dec 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/<h1 id="机器文摘-第-013-期">机器文摘 第 013 期</h1> +<h2 id="长文">长文</h2> +<h3 id="从古董电脑中我们能学到什么httpsgithubcomreadmefeaturedvintage-computing"><a class="link" href="https://github.com/readme/featured/vintage-computing" target="_blank" rel="noopener" +>从古董电脑中我们能学到什么</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-09-36-43.png" +width="1182" +height="689" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="411px" +></p> +<p>我也不知道为什么自己会对老旧电脑,尤其是上世纪80年代、90年代出品的电脑这么迷恋。</p> +<p>我觉得那个时代的电脑散发着一种难以名状的工业气质。</p> +<p>通过阅读<a class="link" href="https://github.com/readme/featured/vintage-computing" target="_blank" rel="noopener" +>这篇文章</a>,使我意识到一些深层次的原因。</p> +<p>这些老式电脑的魅力来自于当时技术的限制、简单粗暴和直接。</p> +<p>通过深入了解这些老古董、学习开发那个时代的软件,可以更容易地了解计算机科学。</p> +<p>毕竟,现在的计算机已经充分的复杂和“人性化”,软件把硬件包裹得越来越严实和抽象。以至于根本看不清它的内部构造和实现原理。</p> +<p>去研究那些古董电脑吧,操作那些裸漏单纯的硬件接口,贴近更加具体的科技。</p> +<h3 id="蛋httpwwwgalactanetcomoneofftheegg_zhhtml"><a class="link" href="http://www.galactanet.com/oneoff/theegg_zh.html" target="_blank" rel="noopener" +>蛋</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-09-49-07.png" +width="1024" +height="512" +loading="lazy" +class="gallery-image" +data-flex-grow="200" +data-flex-basis="480px" +></p> +<p>这是一篇很富有哲理的小小说,严格来说跟机器没有关系。</p> +<p>但是写的实在是很好,忍不住收录进来。</p> +<p>毕竟,喜欢机器的人,很难抗拒这种对宇宙天马行空的探索。</p> +<h3 id="rlhf-模型详解httpshuggingfacecoblogrlhf"><a class="link" href="https://huggingface.co/blog/rlhf" target="_blank" rel="noopener" +>RLHF 模型详解</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-09-54-30.png" +width="1450" +height="1338" +loading="lazy" +class="gallery-image" +data-flex-grow="108" +data-flex-basis="260px" +></p> +<p>近期 AI 圈最火的事情,莫过于 OpenAI 发布的聊天机器人 ChatGPT 了。</p> +<p>这个智能聊天机器人已经强大到可以让人担忧的地步了。</p> +<p>那么,它背后的实现原理是什么?</p> +<p><a class="link" href="https://huggingface.co/blog/rlhf" target="_blank" rel="noopener" +>这篇文章</a>讲解了 ChatGPT 所使用的 RLHF(人类反馈强化学习) 模型是如何实现的以及它的未来会怎样发展。</p> +<h3 id="基于扩散模型生成音乐httpswwwriffusioncomabout"><a class="link" href="https://www.riffusion.com/about" target="_blank" rel="noopener" +>基于扩散模型生成音乐</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-10-03-35.png" +width="540" +height="378" +loading="lazy" +class="gallery-image" +data-flex-grow="142" +data-flex-basis="342px" +></p> +<p>基于文本生成图像的扩散模型已经火了一段时间了。</p> +<p>我当时还在想,既然基于扩散模型可以生成图像的话,那能不能生成声音呢?</p> +<p>结果我只是动了动念头,人家这边已经把成果拿出来了。</p> +<p><a class="link" href="https://www.riffusion.com/about" target="_blank" rel="noopener" +>这篇文章</a>介绍了他们基于扩散模型生成音乐的项目。</p> +<p>我试听了一下,效果还不错,挺神奇的。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://ittavern.com/getting-started-with-tmux/" target="_blank" rel="noopener" +>tmux 入门</a>,一篇 tmux 的入门教程。tmux 是一个终端程序,可以同时模拟多个客户端控制台,如果觉得不好理解的话,可以认为它是一个控制台的多页签浏览器。因为在工作中经常需要 ssh 登录服务器进行编程开发,我现在已经离不开它了。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-10-12-18.png" +width="701" +height="419" +loading="lazy" +class="gallery-image" +data-flex-grow="167" +data-flex-basis="401px" +></p> +</li> +<li> +<p><a class="link" href="https://oimo.io/works/" target="_blank" rel="noopener" +>一个有趣的个人网站</a>,作者是一个日本在读博士生,网站放了一些个人的编程作品,主要跟物理模拟、像素艺术有关。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-10-14-33.png" +width="915" +height="450" +loading="lazy" +class="gallery-image" +data-flex-grow="203" +data-flex-basis="488px" +></p> +</li> +<li> +<p><a class="link" href="https://www.hello-algo.com/" target="_blank" rel="noopener" +>你好,算法</a>,一本开源电子书,可在线阅读,深入浅出讲解数据结构和算法,生动有趣,适合有一定编程基础但是算法这块有些薄弱的爱好者阅读。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-10-20-26.png" +width="3144" +height="2319" +loading="lazy" +class="gallery-image" +data-flex-grow="135" +data-flex-basis="325px" +></p> +</li> +<li> +<p><a class="link" href="https://nbviewer.org/github/gpeyre/numerical-tours/blob/master/python/ml_6_nn.ipynb" target="_blank" rel="noopener" +>神经网络在线教程</a>,一套神经网络编程教程,提供在线的 python 代码阅读环境,适合作为入门资料学习。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-10-23-10.png" +width="388" +height="262" +loading="lazy" +class="gallery-image" +data-flex-grow="148" +data-flex-basis="355px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 011 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/Wed, 07 Dec 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/<h1 id="机器文摘-第-011-期">机器文摘 第 011 期</h1> +<h2 id="长文">长文</h2> +<h3 id="自己动手做一个天气墨水屏">自己动手做一个天气墨水屏</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-13-22.png" +width="617" +height="455" +loading="lazy" +class="gallery-image" +data-flex-grow="135" +data-flex-basis="325px" +> +有个喜欢动手的哥们,发现了自己及家人的一项小需求,即从家出门的时候想快速知道天气情况。</p> +<p>虽然这种需求抬眼看一下手机也能实现,但是本着“懒惰使人进步”的核心思想(作者懒得掏出手机)他动手实现了一套基于电池供电的可以显示天气预报信息的电子墨水屏。</p> +<p>这篇<a class="link" href="https://kimmo.blog/posts/7-building-eink-weather-display-for-our-home/" target="_blank" rel="noopener" +>《做一个天气墨水屏》</a>记录了作者从诞生点子到产品出炉的全过程。</p> +<p>另外作者还开源了项目的源代码,<a class="link" href="https://github.com/kimmobrunfeldt/eink-weather-display" target="_blank" rel="noopener" +>可在这里获取</a>。</p> +<h3 id="m1-gpu-的故事">M1 GPU 的故事</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-21-23.png" +width="985" +height="614" +loading="lazy" +class="gallery-image" +data-flex-grow="160" +data-flex-basis="385px" +> +GPU 大家都知道,<a class="link" href="https://asahilinux.org/2022/11/tales-of-the-m1-gpu/" target="_blank" rel="noopener" +>这里有篇文章介绍了它的工作细节</a>。</p> +<p>作者来自一个给苹果 M1 芯片适配 Linux 驱动的团队(苹果官方不提供驱动,所以这意味着需要做一些逆向工程)。</p> +<p>本文记录了这些工作中比较有趣的部分,还顺便介绍了 GPU 的一些底层工作原理。</p> +<h3 id="在-commodore-64-上实现位图滚动条的显示">在 Commodore 64 上实现位图滚动条的显示</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-37-41.png" +width="386" +height="338" +loading="lazy" +class="gallery-image" +data-flex-grow="114" +data-flex-basis="274px" +> +Demosense 是一项挖掘计算机硬件机能极限的活动。</p> +<p>通常创作者们会通过各种编程技巧来实现看似无法达到的效果。</p> +<p>由于 Commodore 64 这台古董电脑十分经典,现在仍有不少Demosense爱好者在为它开发程序。</p> +<p><a class="link" href="https://www.c64demo.com/side-border-bitmap-scroller/" target="_blank" rel="noopener" +>这篇文章</a>讲述了著名 C64 demo 程序 <a class="link" href="https://csdb.dk/release/?id=195841" target="_blank" rel="noopener" +>Memento Mori</a> 的实现过程,程序在 Commodore 64 上显示了一副巨大(对于C64来说)的图片。</p> +<p>这在圈内属于首创。</p> +<h3 id="动手做一个-4-位-cpu">动手做一个 4 位 CPU</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-43-28.png" +width="496" +height="370" +loading="lazy" +class="gallery-image" +data-flex-grow="134" +data-flex-basis="321px" +> +计算机组成原理是不是还没学明白?没关系,我们可以自己亲手做一个简单的 CPU 。</p> +<p><a class="link" href="https://www.bigmessowires.com/nibbler/" target="_blank" rel="noopener" +>Nibbler</a> 是一款 4 位 CPU,使用标准 7400 系列逻辑芯片(单个计数器、寄存器、缓冲器和门)构建而成。是一个简单 CPU 的教育示例,易于理解和构建,但仍然能够运行游戏和其他有趣的程序。Nibbler 在 5 x 4 英寸(127 x 102 毫米)穿孔板上使用绕线制造。CPU总共包含17个芯片。</p> +<p>作者公开了设计图纸和相关资料,可在文章内部的链接中获取。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="http://www.craftinginterpreters.com/" target="_blank" rel="noopener" +>纯手撸一个解释器</a>,编译原理没学明白没关系,这本在线电子书手把手教你写一个自己的解释器。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-51-28.png" +width="593" +height="182" +loading="lazy" +class="gallery-image" +data-flex-grow="325" +data-flex-basis="781px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/k88hudson/git-flight-rules/blob/master/README_zh-CN.md" target="_blank" rel="noopener" +>Git 飞行规则 (Flight Rules)</a> ,一个十分全面的 Git 使用指南,把你能遇到的情况都想到了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-54-49.png" +width="532" +height="541" +loading="lazy" +class="gallery-image" +data-flex-grow="98" +data-flex-basis="236px" +></p> +</li> +<li> +<p><a class="link" href="https://thevaluable.dev/vim-advanced/" target="_blank" rel="noopener" +>Vim 高级进阶</a>,如果你已经学会了怎么退出 Vim,恭喜你,已经击败了 80% 的选手。想要在 Vim 中进行更高效的编辑操作,这份高手指南十分适合作为参考。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-57-10.png" +width="776" +height="511" +loading="lazy" +class="gallery-image" +data-flex-grow="151" +data-flex-basis="364px" +></p> +</li> +<li> +<p><a class="link" href="https://www.joshwcomeau.com/css/interactive-guide-to-flexbox/" target="_blank" rel="noopener" +>Flexbox 布局交互指南</a>,这篇在线教程讲解了如何使用 Flexbox 进行页面布局,难能可贵的是直接在页面中提供了交互操作界面,可以一遍学一遍实践,非常方便。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-59-27.png" +width="743" +height="448" +loading="lazy" +class="gallery-image" +data-flex-grow="165" +data-flex-basis="398px" +></p> +</li> +<li> +<p><a class="link" href="https://www.makesense.ai/" target="_blank" rel="noopener" +>在线 AI 标注工具</a>,想要训练自己的 AI 模型,比如目标检测、图像分类等等,可以使用这个在线工具进行数据标注,直接上传图片然后在线标注,完成后可导出 VOC、Coco 等格式的数据集。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-10-02-46.png" +width="628" +height="391" +loading="lazy" +class="gallery-image" +data-flex-grow="160" +data-flex-basis="385px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 010 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/Tue, 29 Nov 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/<h1 id="机器文摘-第-010-期">机器文摘 第 010 期</h1> +<h2 id="长文">长文</h2> +<h3 id="极客摄影指南">极客摄影指南</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-14-11-12.png" +width="1235" +height="841" +loading="lazy" +class="gallery-image" +data-flex-grow="146" +data-flex-basis="352px" +> +相机,也是机器的一种。</p> +<p>我用它记录生活,捕捉生活中转瞬即逝的美好瞬间。</p> +<p>有个问题一直困扰着我,怎样拍出不那么“到此一游”的照片?</p> +<p>怎样才能“掌控”相机这个机器?</p> +<p>这篇<a class="link" href="https://lcamtuf.coredump.cx/photo_basics/" target="_blank" rel="noopener" +>《极客摄影》(英文)</a>能够帮助你对摄影做一个真正深入的理解(而不是学习那些充斥社交平台的各种浮于表面的“技巧”)。</p> +<p>作者是一个热爱摄影的技术男,有二十多年摄影经验。</p> +<p>听他给你讲讲什么是“光”和“构图”。</p> +<p>一篇就够了。</p> +<h3 id="ms-dos-背后的设计">MS-DOS 背后的设计</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-14-24-37.png" +width="480" +height="512" +loading="lazy" +class="gallery-image" +data-flex-grow="93" +data-flex-basis="225px" +></p> +<p>包括我在内的不少 80 后接触电脑是从 MS-DOS 开始的。</p> +<p>对于它的黑窗口和命令行都有着很深的印象。</p> +<p>上大学时执行最多的命令是<code>format c: /s /q</code></p> +<p>当年还玩过不少在 DOS 平台的游戏,比如仙剑奇侠传、主题医院等等。</p> +<p>只是当时没工夫对系统本身做深入了解。</p> +<p>顶多是,自己在学习汇编语言时,对 DOS 又仔细端详了几眼。</p> +<p>这篇<a class="link" href="https://patersontech.com/Dos/Byte/InsideDos.htm" target="_blank" rel="noopener" +>《凑近看看 MS-DOS 》(英文)</a>,介绍了 DOS 系统的设计标准、内存分配、磁盘文件结构、FAT文件系统的技术细节等等。</p> +<p>想要窥探技术细节的可以点进去看看。</p> +<h3 id="构建最快的-lua-解释器">构建最快的 Lua 解释器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-14-45-43.png" +width="645" +height="386" +loading="lazy" +class="gallery-image" +data-flex-grow="167" +data-flex-basis="401px" +> +给动态语言编写解释器可能不算太难(如果只是能跑的话)。</p> +<p>但是如果要编写一个高性能的、好用的动态语言解释器,比如像谷歌浏览器所用的 V8 引擎那样,就比较困难了。</p> +<p><a class="link" href="https://sillycross.github.io/2022/11/22/2022-11-22/" target="_blank" rel="noopener" +>《构建最快的 Lua 解释器》</a>这篇文章站在更高维度提供一种方法,即:编写一种可以自动生成编译器(解释器)代码的程序,以使得制作高性能解释器变得更加容易。</p> +<p>我看了一下,大概就是自动化生成之前需要手工处理的编译器优化代码。作为编译原理学的不怎么明白的我,对此不敢评论。</p> +<h3 id="为什么-linux-内核没有单元测试">为什么 Linux 内核没有单元测试?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-15-14-46.png" +width="637" +height="411" +loading="lazy" +class="gallery-image" +data-flex-grow="154" +data-flex-basis="371px" +> +我对单元测试的态度一般,既不强烈支持,也不反对。</p> +<p>听说有的开发团队由于对于单元测试十分狂热,已经到了不允许写注释,都用单元测试替代的地步。</p> +<p>前不久,在 HN 上有网友发起了一个引战的讨论:“<a class="link" href="https://news.ycombinator.com/item?id=33742130" target="_blank" rel="noopener" +>既然单元测试这么好,为什么 Linux 内核源码不用呢?</a>”</p> +<p>以下为部分观点:</p> +<blockquote> +<p>单元测试被严重高估了,TDD有一些好主意,但有一段时间它变成了一种宗教。</p> +</blockquote> +<blockquote> +<p>单元测试与TDD宗教不是一回事。它只是意味着将事物划分为小单元并尽可能详尽地测试其功能。</p> +</blockquote> +<blockquote> +<p>SQLite不是反例吗?他们有更多的单元测试代码,而不是实际运行的代码。</p> +</blockquote> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://github.com/jackfrued/Python-100-Days" target="_blank" rel="noopener" +>Python 100 天从入门到精通</a>,Python 好学吗?好学又不好学,上手容易,精通难。这里有套开源教程囊括了从入门到实战应用(语言基础、数据处理、Web开发、网络开发、爬虫、深度学习等)的所有课程。这个仓库目前已经在 Github 上获得了 12 万star。可以说是好评如潮,想深入学习 Python 的不容错过。赶紧到我收藏夹里吃灰。</p> +</li> +<li> +<p><a class="link" href="https://wokwi.com/" target="_blank" rel="noopener" +>在线单片机模拟器</a>,想要学习单片机开发,又没有硬件设备吗?这个网站最合适。不需要担心手残不会电烙铁,也不用担心买不到芯片。直接在线进行模拟接线,直接运行编写的代码,结果实时展现。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-15-31-31.png" +width="878" +height="661" +loading="lazy" +class="gallery-image" +data-flex-grow="132" +data-flex-basis="318px" +></p> +</li> +<li> +<p><a class="link" href="https://slowroads.io/" target="_blank" rel="noopener" +>slow roads</a>,一个在线赛车游戏。基于网页制作。亮点在于作者实现了无限地图。所有地形和道路均使用程序生成。游戏有自动驾驶模式,如果只想观赏路边风景的话,可以开启。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-15-36-44.png" +width="1736" +height="855" +loading="lazy" +class="gallery-image" +data-flex-grow="203" +data-flex-basis="487px" +></p> +</li> +<li> +<p><a class="link" href="https://tic80.com/" target="_blank" rel="noopener" +>TIC-80</a>,TIC-80 是一台用于制作、播放和分享小型游戏的幻想计算机。有内置的开发工具:代码、sprites、地图、声音编辑器和命令行,这足以创建一个迷你复古游戏。在退出时,你将得到一个盒式文件,它可以在网站上存储和播放。 +另外,游戏可以打包成一个播放器,可以在所有流行的平台上运行,并按你的意愿分发。为了制作一个复古风格的游戏,整个创作过程是在一些技术限制下进行的。240x136 像素的显示屏,16 种颜色的调色板,256 个 8x8 的彩色 sprites,4 channel sound 等等。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-15-42-20.png" +width="490" +height="279" +loading="lazy" +class="gallery-image" +data-flex-grow="175" +data-flex-basis="421px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 009 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/Mon, 21 Nov 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/<h1 id="机器文摘-第-009-期">机器文摘 第 009 期</h1> +<h2 id="长文">长文</h2> +<h3 id="游戏中的精灵">游戏中的“精灵”</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-21-14-24-20.png" +width="729" +height="409" +loading="lazy" +class="gallery-image" +data-flex-grow="178" +data-flex-basis="427px" +> +<a class="link" href="https://zh.wikipedia.org/wiki/%E7%B2%BE%E7%81%B5%E5%9B%BE" target="_blank" rel="noopener" +>精灵(sprite)</a>这个词来自古法语单词“esprit”,意思是“精神”——源自拉丁语“spiritus”。在民间传说中,精灵是活泼、俏皮和神奇的小生物。然而对于游戏开发者来说,它又是另一个含义了。</p> +<p>这篇<a class="link" href="https://wireframe.raspberrypi.com/articles/the-surprising-history-of-sprites" target="_blank" rel="noopener" +>《精灵的惊人历史》(英文)</a>,介绍了不同的游戏厂商,在早期硬件机能有限的条件下,如何实现“角色在屏幕上移动”这个现在看似十分简单的事情的。</p> +<p>对于不了解“精灵”的含义的,稍作如下解释:</p> +<blockquote> +<p>2D 游戏在处理需要动起来的角色时,出于性能考虑,将一部分图形的绘制与背景画面的绘制分开,对于频繁需要刷新(动起来的)部分,单独处理,使他们感觉像是漂浮在背景画面的“幽灵”似的,故名“精灵”。</p> +</blockquote> +<h3 id="任天堂-nes-的一些技术细节">任天堂 NES 的一些技术细节</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-21-14-41-33.png" +width="507" +height="477" +loading="lazy" +class="gallery-image" +data-flex-grow="106" +data-flex-basis="255px" +> +NES 是任天堂推出一款极其成功的家用游戏机(NES : Nintendo Entertainment ,System 是其在北美发售的名称,亚洲叫 FC :Family Computer),不少80、90后的朋友应该都玩过(或者是国内山寨厂商仿制的*霸王之类)。</p> +<p>NES 使用极其经典的 6502 CPU。这块 CPU 有多经典呢,苹果的 Apple1代2代 、史上销量第一的个人电脑 Commodore 64 、国内早年比较流行的文曲星等,使用的都是这个 CPU。</p> +<p><a class="link" href="https://medium.com/@fogleman/i-made-an-nes-emulator-here-s-what-i-learned-about-the-original-nintendo-2e078c9b28fe" target="_blank" rel="noopener" +>《我做了一个 NES 模拟器》(英文)</a>,这篇文章的作者在编写模拟器的过程中挖出了不少技术细节,里面还提到了硬件存在的各种 BUG (没错,要模拟的话必须连 BUG 都得模拟,不然有些游戏玩不了),想要了解的朋友可以点进去看一下。</p> +<p>作为模拟器爱好者,我对 6502 处理器非常好奇,一度希望自己动手也实现一个,而且这款处理器真的非常适合模拟器入门,毕竟只有三个寄存器和百十条指令。</p> +<p><a class="link" href="https://github.com/fogleman/nes" target="_blank" rel="noopener" +>文中提到的 NES 模拟器在 Github 上开放了源码</a>,有兴趣的可以学习。</p> +<h3 id="一个桌面开发程序员为了学习-javascript-而手撸了一个基于-webgl-的游戏引擎">一个桌面开发程序员为了学习 Javascript 而手撸了一个基于 WebGL 的游戏引擎</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-21-15-11-11.png" +width="780" +height="448" +loading="lazy" +class="gallery-image" +data-flex-grow="174" +data-flex-basis="417px" +> +学习一样技能最好的方式就是动手去做。</p> +<p>当我感叹牛人怎么那么厉害的时候,往往忽略了牛人的学习过程。</p> +<p>以为他们天生就那样。</p> +<p>事实上他们的技能也是靠努力训练得来的。</p> +<p>不过,学习方法确实很重要。</p> +<p><a class="link" href="http://zephyrosanemos.com/" target="_blank" rel="noopener" +>《我对 Javascript 的尝试》(英文)</a>,这篇文章的作者原本是一个桌面程序开发者(类似 CAD 软件之类)。</p> +<p>他突然想要学习前端开发,掌握 Javascript 语言。</p> +<p>于是结合自己之前的知识,使用前端技术做了一套很优秀的 Demo 程序,一个性能和外观都很不错的游戏引擎。</p> +<p>文章里作者详细介绍了实现过程中对技术、算法的选择等等。</p> +<p>内容很长,但还算友好,比较干货。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://roadmap.sh/" target="_blank" rel="noopener" +>开发者之路</a>,汇总了各个技术路线的学习资料,包括前端、后端、运维、计算机科学、区块链、移动端、质量管理等等。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-21-15-24-33.png" +width="753" +height="455" +loading="lazy" +class="gallery-image" +data-flex-grow="165" +data-flex-basis="397px" +> +总之极其全面。 +目前在 Github 有两百多万个 star,被 fork 了 三十多万次。</li> +<li><a class="link" href="https://crxdl.com/" target="_blank" rel="noopener" +>chrome 插件下载</a>,访问谷歌浏览器插件商店有困难吗?试试这个网站,可以直接下载插件的包文件,下载后拖入浏览器即可安装。不过我已经转换到微软的 Edge 阵营了,用不到这个了。</li> +<li><a class="link" href="https://www.toptal.com/developers/css3maker" target="_blank" rel="noopener" +>CSS3 生成器</a>,对于 CSS 的属性参数总是记不住,这个网站就很适合我。每次要调背景渐变、圆角、阴影、动画曲线等等,都得现去搜。有了这个网站,在线点点拖拖,直接复制代码即可。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-21-15-33-35.png" +width="1288" +height="660" +loading="lazy" +class="gallery-image" +data-flex-grow="195" +data-flex-basis="468px" +></li> +<li><a class="link" href="https://tesseract.projectnaptha.com/" target="_blank" rel="noopener" +>tesseract.js</a>,可直接在浏览器里运行的 OCR 引擎,支持多国语言(超过 100 种)文字识别。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-21-16-16-10.png" +width="1039" +height="439" +loading="lazy" +class="gallery-image" +data-flex-grow="236" +data-flex-basis="568px" +></li> +<li><a class="link" href="https://www.aichpoem.net/#/shisanbai/poem" target="_blank" rel="noopener" +>AI 在线写诗</a>,比较全面的 AI 写诗工具,可以写律诗、绝句、现代诗、歌词等等,根据输入的主题任意发挥。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-23-10-36-44.png" +width="846" +height="502" +loading="lazy" +class="gallery-image" +data-flex-grow="168" +data-flex-basis="404px" +></li> +<li><a class="link" href="https://www.upscale.media/zh" target="_blank" rel="noopener" +>图片分辨率在线提升</a>,上传图片,网站使用 AI 算法将图片的清晰度自动提升,效果还不错。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-23-10-41-36.png" +width="1087" +height="693" +loading="lazy" +class="gallery-image" +data-flex-grow="156" +data-flex-basis="376px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 008 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/Wed, 16 Nov 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/<h1 id="机器文摘-第-008-期">机器文摘 第 008 期</h1> +<h2 id="长文">长文</h2> +<h3 id="用好-github给自己建立一个全方位的私有云平台">用好 GitHub,给自己建立一个全方位的私有云平台</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/2022-11-16-09-24-41.png" +width="754" +height="393" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="460px" +> +很多人都有进行个人的知识管理和数字资源管理的需求,市面上也有很多软件工具或者平台来满足这样的需求,但是大部分都是收费的,且自由度不高。我个人经常使用 Github 作为知识管理仓库,我的网络日志、技术博客、私人小项目、电子书籍等都放在上面,生活中已经离不开这个网站了。</p> +<p>近期读到这样一篇文章&ndash;<a class="link" href="https://www.bmpi.dev/self/use-github-better/" target="_blank" rel="noopener" +>善用 Github</a>,全方位讲解了 Github 如何使用,如何将其提供的服务发挥最大化的作用,看完受益匪浅。</p> +<blockquote> +<p>GitHub 是微软旗下的一个在线软件源代码托管服务平台,也是一个拥有八千多万开发者用户的社区。很多开发者应该对GitHub有一定的了解,但非技术人员大多可能并不会去使用它。本文更多是想给非技术人员来介绍这个平台,看完这篇文章,希望能让更多人在上面来学习、创作与展示自己的作品。</p> +</blockquote> +<h3 id="webgpu-是什么跟-webgl-有什么关系">WebGPU 是什么?跟 WebGL 有什么关系?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/2022-11-16-09-36-12.png" +width="846" +height="433" +loading="lazy" +class="gallery-image" +data-flex-grow="195" +data-flex-basis="468px" +> +前几天我想在网页上制作一个小游戏,用于尝试一下图形编程相关的技术。用到了一些基于 Web 技术的 3d 图形框架,比如 Three.js、Babylon.js 等等。在尝试的过程中遇到了一个新的名词 WebGPU,之前总是在听说 WebGL 相关的技术,结果说了这么多年,WebGL还没普及,怎么又冒出来一个 WebGPU?于是找了一篇文章,浅扒一下各个图形接口的历史。就是这篇<a class="link" href="https://www.51cto.com/article/698100.html" target="_blank" rel="noopener" +>浅入浅出 WebGPU</a>。</p> +<blockquote> +<p>2016年6月,Google 产生了使用新API来代替WebGL的想法,称之为 WebGL Next。 +2017年1月,Khronos Group 举办了WebGL Next研讨会,Chromium一马当先,展示了可以基于OpenGL和Metal独立运行的新图形系统原型,同时Apple和Mozilla也分别展示了自己的原型,三者都非常类似于Metal Api。 +次月,Apple就向W3C提交了一个名为 WebGPU 的技术概念验证方案,基于Metal图形开放接口,最终W3C采纳了 WebGPU 这个名字作为下一代标准,Apple的提案进入了正式的小组提案中。 +3月,Mozilla向Khronos Group提交了基于Vulkan的名为WebGL Next提案。 +2018年6月,Chrome团队宣布着手实现WebGPU,这意味着Khronos的失败,WebGPU胜出,大家以后还是团结在W3C的周围。 +按照预期,工作组希望在2021年底发布WebGPU 1.0 标准,不过目前只有草案。 +WebGPU 1.0 草案:https://www.w3.org/standards/types#WD</p> +</blockquote> +<h3 id="扔掉-photoshop-改用字符串绘图">扔掉 Photoshop 改用字符串绘图</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/2022-11-16-09-58-00.png" +width="761" +height="741" +loading="lazy" +class="gallery-image" +data-flex-grow="102" +data-flex-basis="246px" +> +相信很多人都接触过使用字符绘制的图片,这在程序员圈子里甚至发展为一门专有的艺术 “<a class="link" href="https://zh.wikipedia.org/wiki/ASCII%E8%89%BA%E6%9C%AF" target="_blank" rel="noopener" +>ASCII 艺术</a>”。不过我现在不是要说这些,我在一篇 2015 年发表的文章里,发现了这个:有个猛男在自己的程序里彻底抛弃使用 Photoshop 制作的图片资源,改用字符串来描述各种图形(程序界面的图标),然后自己再用代码将其渲染成为高清的图像。</p> +<p>作者对此很沾沾自喜,他甚至设计了一套自用的语法规范,用特定字母代表特定的符号关系,这样就可以组合出各种复杂的图案了。</p> +<p>我也在文章的评论区见到了跟我有同样疑惑的读者留言:“这不就是重新发明了 <a class="link" href="https://zh.wikipedia.org/wiki/%E5%8F%AF%E7%B8%AE%E6%94%BE%E5%90%91%E9%87%8F%E5%9C%96%E5%BD%A2" target="_blank" rel="noopener" +>SVG</a> 吗?唯一的区别就是没有用 XML 作为载体”。</p> +<p>不过文章记录的整个开发过程还是很有趣的,希望了解朋友可以点进去看看 <a class="link" href="http://cocoamine.net/blog/2015/03/20/replacing-photoshop-with-nsstring/" target="_blank" rel="noopener" +>Replacing Photoshop With NSString</a></p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://ffmpeg.xianwaizhiyin.net/" target="_blank" rel="noopener" +>FFmpeg原理</a>,FFmpeg 这个开源项目可能圈外的人士了解不多,但实际上我们生活中一刻也离不开它。现在的网络直播、网络视频网站和移动App、各种视频剪辑合成软件,都或多或少的使用了 FFmpeg 提供的编解码技术。这本在线书籍对于想进一步了解 FFmpeg 以及视频编解码技术的朋友是个不错的参考资料。</p> +<blockquote> +<p>本书《FFmpeg原理》主要讲解 FFmpeg 原理性的知识,前面几章主要讲解一些音视频开发的基础知识,例如原始数据 YUV 跟 RGB,封装格式 FLV 跟 MP4 ,压缩编码的基本概念,还有封装格式分析。</p> +</blockquote> +</li> +<li> +<p><a class="link" href="https://rustdesk.com/zh/" target="_blank" rel="noopener" +>开源虚拟与远程桌面基础架构</a>,远程桌面软件,开箱即用,无需任何配置。(我个人目前还是使用windows的远程桌面多一些,不过这个开源的rustdesk看起来不错)</p> +<blockquote> +<p>您完全掌控数据,不用担心安全问题。您可以使用我们的注册/中继服务器,或者自建,亦或者开发您的版本 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/2022-11-16-10-26-09.png" +width="1388" +height="701" +loading="lazy" +class="gallery-image" +data-flex-grow="198" +data-flex-basis="475px" +></p> +</blockquote> +</li> +<li> +<p><a class="link" href="https://learnxinyminutes.com/" target="_blank" rel="noopener" +>Learn X in Y minutes</a>,这里的教程几乎涵盖所有编程语言,完全没有废话。英文版、中文版都有。如果有编程语言基础的话,通过这个网站确实可以在几十分钟内掌握一门新的编程语言的核心知识。</p> +</li> +<li> +<p><a class="link" href="https://flash.zczc.cz/" target="_blank" rel="noopener" +>Flash 保存计划</a>,Flash 虽然消失了,但是它曾经创造的辉煌一直在我们的记忆里,现在偶尔还想起一些经典的小游戏。这个网站里收藏了很多经典的Flash小游戏,通过一些黑科技复活了它们,可以在浏览器里运行体验。反正我一打开了黄金矿工,就半天停不下来。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/2022-11-16-10-34-57.png" +width="1142" +height="554" +loading="lazy" +class="gallery-image" +data-flex-grow="206" +data-flex-basis="494px" +></p> +</li> +<li> +<p><a class="link" href="https://keg.cs.tsinghua.edu.cn/codegeex/index_zh.html" target="_blank" rel="noopener" +>CodeGeeX: 多语言代码生成模型</a>,又一个能帮你写代码的 AI 模型。提供有官方的 VSCode 插件。我试了一下,效果跟 Github 的 copilot 还有一定的差距。</p> +<blockquote> +<p>CodeGeeX是一个具有130亿参数的多编程语言代码生成预训练模型。CodeGeeX采用华为MindSpore框架实现,在鹏城实验室“鹏城云脑II”中的192个节点(共1536个国产昇腾910 AI处理器)上训练而成。截至2022年6月22日,CodeGeeX历时两个月在20多种编程语言的代码语料库(&gt;8500亿Token)上预训练得到</p> +</blockquote> +</li> +<li> +<p><a class="link" href="https://iximiuz.com/en/series/computer-networking-fundamentals/" target="_blank" rel="noopener" +>计算机网络基础学习(英文)</a>,一个在线讲解网络基础知识的教程,优点是内容简洁,不用特别多的专用名词唬人,另外还提供了在线实验的环境。</p> +<blockquote> +<p>关于计算机网络的书籍往往令人生畏 - 数千页,无聊的图表&hellip;&hellip;这个教程以几千字的字数引导您了解网络基础知识!它还提供动手实验室来实践所获得的知识。</p> +</blockquote> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/2022-11-16-10-51-40.png" +width="764" +height="476" +loading="lazy" +class="gallery-image" +data-flex-grow="160" +data-flex-basis="385px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 007 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/Wed, 09 Nov 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/<h1 id="机器文摘-第-007-期">机器文摘 第 007 期</h1> +<h2 id="长文">长文</h2> +<h3 id="如何在-html5-canvas-制作可精确控制时间的动画">如何在 HTML5 Canvas 制作可精确控制时间的动画</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-09-30-08.png" +width="576" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="170" +data-flex-basis="410px" +></p> +<p>使用 Canvas 对象在网页中制作动画非常简单,有不少人喜欢直接使用定时器 <code>setinterval</code> 以一定的时间周期循环执行绘图代码来实现动画效果。但是这种做法有一个弊端,由于显示刷新率以及计算机硬件性能的不同,会导致在不同机器上的表现差异。比如你希望你的动画角色在 1 秒内移动 50 个像素,但是实际执行起来却很难控制。<a class="link" href="https://www.viget.com/articles/time-based-animation/" target="_blank" rel="noopener" +>基于时间的动画</a>这篇文章讲解了如何使用浏览器的 <code>requestAnimationFrame</code> API 来实现精准控制动画时间的效果,里面给出了一个很简单的样例,但是基本上给出了一个完整的“更新、渲染、通过时间变化计算运动距离”的游戏控制架构。</p> +<h3 id="如何使用纯-web-技术开发一个相机-app">如何使用纯 Web 技术开发一个相机 App</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-09-47-44.png" +width="680" +height="475" +loading="lazy" +class="gallery-image" +data-flex-grow="143" +data-flex-basis="343px" +></p> +<p>如果不习惯复杂的移动 app 开发环境,直接使用 Web 技术开发一些小的 App 也是十分方便的。我近期希望通过网页实现一个拍照的应用,并且希望不使用手机的原生相机功能,而是自己控制一些相机参数、后期效果、增加特定的取景框等等。于是我找到了一篇教学指南:<a class="link" href="https://blog.prototypr.io/make-a-camera-web-app-tutorial-part-1-ec284af8dddf" target="_blank" rel="noopener" +>Make a Camera Web App</a>,只需几十行代码就实现了一个相机 App 。感兴趣的朋友可以点进去看看。</p> +<h3 id="数据库是如何工作的从零开始写一个数据库">数据库是如何工作的,从零开始写一个数据库</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-10-01-15.png" +width="390" +height="394" +loading="lazy" +class="gallery-image" +data-flex-grow="98" +data-flex-basis="237px" +></p> +<p>如果和我一样好奇数据库是如何实现的,可以看看<a class="link" href="https://cstack.github.io/db_tutorial/" target="_blank" rel="noopener" +>这篇文章</a>。带你用 C 语言从头撸一个数据库出来。</p> +<h3 id="使用-rust-写一个操作系统">使用 Rust 写一个操作系统</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-10-05-43.png" +width="702" +height="518" +loading="lazy" +class="gallery-image" +data-flex-grow="135" +data-flex-basis="325px" +></p> +<p>Rust 逐渐火起来了,这篇 <a class="link" href="https://os.phil-opp.com/zh-CN/" target="_blank" rel="noopener" +>2018 年的文章</a>整理了一份教程,作者尝试使用 Rust 写一个操作系统,我之所以收录它是因为作者还在 Github 开源了代码,并且这系列教程甚至提供了多国语言的版本。制作精良。应该是实践操作系统知识的好教材。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://100dayscss.com/" target="_blank" rel="noopener" +>100 天精通 CSS </a>,这个网站给了你 100 个关于 CSS 技术的挑战题目,也许练完之后可以达到深入应用 CSS 的效果,我尝试了几个挑战,有些题目的设置有些偏炫技范畴了,想在工作中使用估计会被打死。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-10-24-10.png" +width="392" +height="391" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +></p> +</li> +<li> +<p><a class="link" href="http://cht.sh/" target="_blank" rel="noopener" +>Linux 命令在线帮助工具</a>,对于我这种经常记不住命令用法的人来说真的是一种福音。比如我就经常记不清 <code>tar</code> 命令的用法,面对压缩包解压或者文件打包的工作每次都是去网上搜索一番。有了这个在线工具,直接在命令行中使用 <code>curl</code>请求他的网址就可给出命令的样例用法详解,非常方便。比如执行<code>curl cht.sh/tar</code> 就会给出 tar 的使用样例了,我直接复制粘贴之。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-10-28-42.png" +width="586" +height="462" +loading="lazy" +class="gallery-image" +data-flex-grow="126" +data-flex-basis="304px" +></p> +</li> +<li> +<p><a class="link" href="https://www.mobilephonemuseum.com/" target="_blank" rel="noopener" +>手机博物馆</a>, 网站收录了各品牌手机的各代产品资料,包括手机图片、型号参数、当时发布的广告等。不过我看了一下,资料应该还不齐全,有些手机只是列了个名字和型号在那儿,还缺少详细信息,估计还在继续收集中。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-10-32-23.png" +width="1696" +height="790" +loading="lazy" +class="gallery-image" +data-flex-grow="214" +data-flex-basis="515px" +></p> +</li> +<li> +<p><a class="link" href="http://www.famicn.com/" target="_blank" rel="noopener" +>中文家用游戏博物馆</a> ,收录了比较齐全的家用游戏机及掌机的中文版游戏资料。可以直接在线通过模拟器玩耍。有不少经典的 FC、GB、MD 游戏,甚至还有小霸王学习机的 ROM ,可以在线体验。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-10-36-51.png" +width="1096" +height="711" +loading="lazy" +class="gallery-image" +data-flex-grow="154" +data-flex-basis="369px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 006 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/Wed, 02 Nov 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/<h1 id="机器文摘-第-006-期">机器文摘 第 006 期</h1> +<h2 id="长文">长文</h2> +<h3 id="怎样写一段代码把自己打印出来">怎样写一段代码把自己打印出来?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/2022-11-02-13-45-45.png" +width="651" +height="400" +loading="lazy" +class="gallery-image" +data-flex-grow="162" +data-flex-basis="390px" +></p> +<p>近期在知乎上看到一个<a class="link" href="https://www.zhihu.com/question/22006572/answer/2722369370" target="_blank" rel="noopener" +>如何编写代码打印自己的问题</a>,感到十分有趣。以前也在网上见到过类似的代码,用 C 或者 Javascript 等各种语言实现的版本都有。当时只是感叹代码写的十分神奇,一段代码在运行之后竟然输出自己的源代码,而且一个字符也不差,并没有搞懂其中的原理。这篇回答里,作者给出了详细解释。并指出,冯·诺依曼早在他编写的《自复制元胞自动机理论》一书中的提出了这种事情在理论上的通用方法。</p> +<blockquote> +<p>如上图所示,自复制系统有五个基本部件:A:通用构造器;B:通用复制器;C:控制器;D:其他函数;ϕ(A,B,C,D)\phi(A,B,C,D)\phi(A,B,C,D) : A, B, C, D的编码;当自复制过程启动的时候,B将编码复制一份。A再根据复制出的编码构造出ABCD。最后,C再将这些结构组合起来,构造出一个新的、复制的结构。可以看到,自复制、自打印程序的核心就在于通用构造器和编码,因为复制器、控制器都是比较容易实现的。</p> +</blockquote> +<p>具体实现的示例,文中有更详细的说明。</p> +<p>最后,此问题可以引申到,大自然中生命基于基因的复制机制,也是与此相关,甚至其背后都是同样的机制。</p> +<h3 id="kevin-kelly-在-68-岁生日时给出的-68-条建议">Kevin Kelly 在 68 岁生日时给出的 68 条建议</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/2022-11-02-14-01-30.png" +width="688" +height="368" +loading="lazy" +class="gallery-image" +data-flex-grow="186" +data-flex-basis="448px" +></p> +<p><a class="link" href="https://baike.baidu.com/item/%E5%87%AF%E6%96%87%C2%B7%E5%87%AF%E5%88%A9/6607570" target="_blank" rel="noopener" +>凯文·凯利(又称KK, 作者,著有《失控》《科技想要什么》《必然》等)</a>,上个月 28 号是他的 68 岁生日,他准备了 68 条简短的建议,作为礼物送给年轻人。</p> +<p>有人翻译了<a class="link" href="https://zhuanlan.zhihu.com/p/143834871" target="_blank" rel="noopener" +>KK 在 68 岁生日时给出的 68 条建议</a>。</p> +<p>摘抄几条如下:</p> +<blockquote> +<p>任何一项大工程(修房子、拍电影、开发 app)完成度为 90% 的时候,你都要做好心理准备:剩余的大量细节工作会占掉你另一段与之前相当的时间。</p> +</blockquote> +<blockquote> +<p>不要担心自己问的问题听起来很傻。99% 的情况下,其他人都有和你一样的问题,只不过羞于问出口而已。</p> +</blockquote> +<blockquote> +<p>别成为一群人里最聪明的那个。和那些比你聪明的人待在一起,向他们学习。如果能找到和你观点相左的聪明人,那就更好了。</p> +</blockquote> +<blockquote> +<p>别做最好的。做唯一的。</p> +</blockquote> +<blockquote> +<p>任何真实之物都源于虚构之意。想象是宇宙中最强大的力量,也是你能够日益精进的能力。生命中可以因不知众人所知而获益的能力,仅此一项。</p> +</blockquote> +<blockquote> +<p>经验往往被高估了。招募的时候,要看资质,技能则可以培训。许多令人惊奇和赞叹的事情,都是由第一次做的人做出来的。</p> +</blockquote> +<h3 id="怎样搭建一个最简的-git-服务器">怎样搭建一个最简的 GIT 服务器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/2022-11-02-14-15-18.png" +width="626" +height="466" +loading="lazy" +class="gallery-image" +data-flex-grow="134" +data-flex-basis="322px" +></p> +<p>GIT 是现在软件开发过程中必不可少的版本控制工具,功能非常强大,我们平时直接使用单位的私有服务或者在线的云服务(如:Github 等)。</p> +<p>如果想要搭建个人的服务,可能就比较繁琐一些。<a class="link" href="https://www.ruanyifeng.com/blog/2022/10/git-server.html" target="_blank" rel="noopener" +>阮一峰老师的这篇博客</a>就解答了怎样采用极简的技术路线,为自己搭建一台 GIT 服务器。</p> +<blockquote> +<p>自己搭建 Git 服务器的原因,无非就是不方便访问外网,不愿意代码放在别人的服务器,或者有一些定制化的需求。 +这时,你可以选择开源的 Git 服务器软件。 +Gitlab CE +Gitea +Gogs +Onedev +这些软件里面,Gogs 的安装是最简单的,但是功能相对比较弱。功能越强的软件,安装越复杂。 +如果你只是想远程保存一份代码,并不在意有没有 Web 界面,或者其他功能,那么根本不用安装上面这些软件,一行命令就够了。</p> +</blockquote> +<h3 id="为什么很多程序员讨厌低代码">为什么很多程序员讨厌低代码?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/2022-11-02-14-24-59.png" +width="640" +height="355" +loading="lazy" +class="gallery-image" +data-flex-grow="180" +data-flex-basis="432px" +></p> +<p>“低代码”(一般指:不用或少用编写代码的方式进行软件开发)这个词近两年又开始火了,它代表着对软件工程的一种美好“幻想”,即:花费更低的代价去构建复杂的软件系统。</p> +<p>虽然每隔一个时间周期都会被重提一次,但是每次都未能如愿。</p> +<p>现在既然又被频繁提及,我在知乎上发现了这样一篇<a class="link" href="https://www.zhihu.com/question/561025857/answer/2734260311" target="_blank" rel="noopener" +>关于低代码话题的回答</a>。从程序员的视角表达了对低代码这种期望的观点,有兴趣的朋友可以点进去看看。</p> +<blockquote> +<p>软件工程这门学问,研究的就是“如何利用工程思想,从整体上降低开发复杂性”;但与之同时,它不得不反复强调“软件工程试图解决的、是人为引入的不必要的复杂性;但工程的本质复杂性是无法逃避的。因为没有银弹,没有银弹,没有银弹!”</p> +</blockquote> +<p>我个人的观点是:低代码或者配置化、拖拽式软件开发,很难平衡对复杂现实的抽象程度和开发便利性的矛盾关系。如何做到既提供方便的组件同时又不限制对个性化需求的实现,这需要非常强大的设计能力以及对于特定应用场景的取舍。目前来看,如果要做到或者接近上述状态,必然要先消耗巨量的成本,至于是否值得,可能不同的主体会有不同的选择吧。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://github.com/Visualize-ML/Book4_Power-of-Matrix" target="_blank" rel="noopener" +>从加减乘除到机器学习</a>,一本不错的数学扫盲书,如果你在学习人工智能的时候对数学感到吃力的话,这本书非常适合阅读,一点也不枯燥。主要讲解线性代数相关的知识。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/2022-11-02-14-46-11.png" +width="616" +height="335" +loading="lazy" +class="gallery-image" +data-flex-grow="183" +data-flex-basis="441px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/jlevy/the-art-of-command-line/blob/master/README-zh.md" target="_blank" rel="noopener" +>命令行的艺术</a> 想成为命令行高手,掌握这一篇就够了。</p> +<blockquote> +<p>熟练使用命令行是一种常常被忽视,或被认为难以掌握的技能,但实际上,它会提高你作为工程师的灵活性以及生产力。本文是一份我在 Linux 上工作时,发现的一些命令行使用技巧的摘要。有些技巧非常基础,而另一些则相当复杂,甚至晦涩难懂。这篇文章并不长,但当你能够熟练掌握这里列出的所有技巧时,你就学会了很多关于命令行的东西了。</p> +</blockquote> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/2022-11-02-14-47-54.png" +width="477" +height="287" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="398px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/practical-tutorials/project-based-learning" target="_blank" rel="noopener" +>基于实际项目的学习</a>,这是一个巨大的代码工程资源索引,里面列举了针对各种编程语言的个人项目,当你不知道该如何去深入学习一门编程语言的时候,选择一个这里的项目然后自己动手跟着练一遍效果绝对惊人。入选的项目都十分有趣,比如怎样用 C 写一个解释器、怎样写一个自己的编辑器、自己动手实现 TCP/IP 协议栈,等等。</p> +</li> +<li> +<p><a class="link" href="https://github.com/lxgw/LxgwWenKai" target="_blank" rel="noopener" +>霞鹜文楷</a>,一款开源中文字体,基于 FONTWORKS 出品字体 Klee One 衍生。用来看书非常舒服,特别是在排版上。微信读书已经内置,如果是第三方支持自定义字体的可以试试。</p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 005 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/Wed, 26 Oct 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/<h1 id="机器文摘-第-005-期">机器文摘 第 005 期</h1> +<h2 id="长文">长文</h2> +<h3 id="穿越到-1983-年学习-basichttpslinuxcnarticle-11091-1html"><a class="link" href="https://linux.cn/article-11091-1.html" target="_blank" rel="noopener" +>穿越到 1983 年学习 BASIC</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-10-33-53.png" +width="1006" +height="644" +loading="lazy" +class="gallery-image" +data-flex-grow="156" +data-flex-basis="374px" +></p> +<blockquote> +<p>很多著名的程序员,尤其在计算机游戏行业,孩童时期就在苹果 II 和 Commodore 64 这样的 8 位计算机上开始编写游戏,John Romero、Richard Garriott 和 Chris Roberts 都是这样的例子。这好理解。在 8 位计算机时代,很多游戏只能在计算机杂志和书籍中以印刷的 BASIC 程序清单方式得到。如果你想玩其中一款游戏,就必须手工键入整个程序。不可避免的,你可能遇到一些问题,所以你就得调试你的程序。等到你让它可以工作起来了,你就已经对程序是如何运行的有了足够的了解,你就可以开始自己修改它了。如果你是一个狂热的游戏玩家,你几乎必然会成为一名优秀的程序员。</p> +</blockquote> +<p>喜欢小霸王的小伙伴(老伙伴?),不可错过的文章,一起跟随作者回忆一下如何在老古董电脑上运行BASIC程序,顺便怀念一下当年靠着一本说明书就在小霸王学习机上编写(抄写)游戏的时光。</p> +<ul> +<li>文中提到的<a class="link" href="https://vice-emu.sourceforge.io/" target="_blank" rel="noopener" +> Commodore64 电脑可以在这里下载模拟器</a>。</li> +</ul> +<h3 id="在-github-的-pages-服务里跑-sqlitehttpsphireskygithubioblog2021hosting-sqlite-databases-on-github-pages"><a class="link" href="https://phiresky.github.io/blog/2021/hosting-sqlite-databases-on-github-pages/" target="_blank" rel="noopener" +>在 Github 的 Pages 服务里跑 SQLite</a></h3> +<p>作者尝试做一个小网站来显示一些统计数据,于是他想到了用数据库,但是,使用数据库需要托管和维护后端服务,或者每次将整个数据集下载到浏览器中(当数据集超过10MB时,体验就变得很差劲)。</p> +<p>于是作者开始琢磨有没有办法找到一个可以在静态服务器上搞一个数据库服务得可能,毕竟提供静态服务的地方有很多(如 GitHub,GitLab,Netlify 等等)。</p> +<p>一通折腾下来(借助了 WASM 技术并适当的进行一些魔改),作者竟然实现了一个 100% 静态托管的数据库服务。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-10-10-18.png" +width="864" +height="413" +loading="lazy" +class="gallery-image" +data-flex-grow="209" +data-flex-basis="502px" +></p> +<h3 id="语句表达式和海象操作符httpswwwzlovezlcnarticlesstmt-expr-and-walrus-operator"><a class="link" href="https://www.zlovezl.cn/articles/stmt-expr-and-walrus-operator/" target="_blank" rel="noopener" +>语句、表达式和海象操作符</a></h3> +<p>这是一篇介绍如何通过“海象操作符“(类似这样:<code>foo := 'bar'</code>)使得Python语句更加精炼的文章。</p> +<p>这种操作符之所以可以使得语句更加精炼,主要原因就是它使得一句代码既进行了赋值然后又作为表达式返回了值。</p> +<p>之前写 Python 代码的时候都没注意还有这种写法,而且貌似这在 C 和 C++ 中都是基本的特性。不过 C 和 C++ 是赋值语句<code>=</code>直接就返回了表达式的值,同时这给程序员提供了出错机会(有不少人应该还记得条件判断时少写了个等号导致的问题)。</p> +<h3 id="给个人开发者的一些建议英文httpsnewsycombinatorcomitemid32647091"><a class="link" href="https://news.ycombinator.com/item?id=32647091" target="_blank" rel="noopener" +>给个人开发者的一些建议(英文)</a></h3> +<p>hacker news 上的网友针对有志于运营自己的SaaS产品的个人开发者提了一些心得和建议。</p> +<p>摘抄一点儿如下:</p> +<ul> +<li>关于做什么,做那些你自己都愿意付费的东西,别指望做出一个你自己都不想花钱使用的产品有别人来买单;</li> +<li>还是关于做什么,不要做需要漂亮UI的东西,那会让你陷入编码之外的很多麻烦(确实很牵涉精力),如果提供的工具能够通过简单交互就能提供优质服务最佳;</li> +<li>如果有可能,尽量提供自助服务模式,也就是说让用户不用见到你就可以自行操作付款了(作者这是有多社交恐惧?);</li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://visualgo.net/zh" target="_blank" rel="noopener" +>数据结构与算法可视化</a>,是一个学习算法知识的好工具。通过动图来演示和讲解数据结构和算法实现原理,针对每一个常用算法不仅有直观的图示,还附有一篇详细的文档,内涵原理知识以及代码实例,网站甚至还提供了答题练习功能,可以一边学习一边做题。</li> +</ul> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-09-31-46.png" +width="1072" +height="321" +loading="lazy" +class="gallery-image" +data-flex-grow="333" +data-flex-basis="801px" +></p> +<ul> +<li><a class="link" href="https://lisperator.net/slip/" target="_blank" rel="noopener" +>SLip</a>,一个在浏览器中运行的Lisp解释器,使用Javascript实现。网站提供了一个简易的IDE,可以直接在页面中进行编程开发,还提供了图形绘制的扩展包,用于学习lisp语言非常合适。</li> +</ul> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-09-35-46.png" +width="497" +height="363" +loading="lazy" +class="gallery-image" +data-flex-grow="136" +data-flex-basis="328px" +></p> +<ul> +<li><a class="link" href="https://www.lfd.uci.edu/~gohlke/pythonlibs/" target="_blank" rel="noopener" +>针对 Windows 预先编译的 Python 扩展包</a>,在使用Python的时候,尤其是在Windows环境,经常会遇到有些扩展包由于依赖某些二进制库的原因导致无法通过pip直接安装,自己动手编译又十分麻烦。这个网站提供了各种预编译版本,可以直接下载网站提供的whl文件到本地然后安装。</li> +</ul> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-09-40-07.png" +width="675" +height="345" +loading="lazy" +class="gallery-image" +data-flex-grow="195" +data-flex-basis="469px" +></p> +<ul> +<li><a class="link" href="https://www.scratchapixel.com/lessons/3d-basic-rendering/introduction-to-ray-tracing" target="_blank" rel="noopener" +> 3D 渲染器入门</a>,一套计算机图形学的入门教程,从原理讲解开始,手把手教你用C++语言编写一个自己的光线追踪渲染器。</li> +</ul> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-09-48-21.png" +width="531" +height="361" +loading="lazy" +class="gallery-image" +data-flex-grow="147" +data-flex-basis="353px" +></p> +<ul> +<li><a class="link" href="https://htmldog.com/" target="_blank" rel="noopener" +>HTMLDOG</a>,前端开发基础知识大全,主要是 HTML、CSS、Javascript 的手把手教学以及语言参考。</li> +</ul> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-09-52-21.png" +width="1862" +height="709" +loading="lazy" +class="gallery-image" +data-flex-grow="262" +data-flex-basis="630px" +></p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 004 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/Tue, 18 Oct 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/<h1 id="机器文摘-第-004-期">机器文摘 第 004 期</h1> +<h2 id="搞机">搞机</h2> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/2022-10-18-09-53-01.png" +width="324" +height="702" +loading="lazy" +class="gallery-image" +data-flex-grow="46" +data-flex-basis="110px" +></p> +<p>美国德州仪器公司出品的TI图形计算器是一种既能计算又能作图的新型的数学使用工具,它具备符号代数系统、几何操作系统、数据分析系统等,可以直观地绘制各种图形,并进行动态演示、跟踪轨迹。</p> +<p>TI实体计算器的售价十分昂贵(相较于其他消费类计算器),这里有一个开源项目<a class="link" href="http://wabbitemu.org/" target="_blank" rel="noopener" +>wabbitemu</a>,使用C语言编写的一个TI计算器的模拟器,可以在电脑上运行并模拟TI计算器,支持多种型号,如TI-82、TI-83、TI-83-plus(需要加载对应的ROM)等。</p> +<p>甚至有人基于这个项目编译出了Android的版本,安装后手机秒变成高级科学计算器。</p> +<p>想进一步了解TI计算器的强大,可以看一下这篇文章<a class="link" href="https://zhuanlan.zhihu.com/p/148392866" target="_blank" rel="noopener" +>《计算器与计算器游戏发展简史》</a>。</p> +<ul> +<li><a class="link" href="http://www.liubaoyi.com/wp-content/uploads/2014/11/Android_Wabbitemu.zip" target="_blank" rel="noopener" +>TI计算器模拟器安卓版本下载地址(含ROM文件)</a></li> +<li><a class="link" href="http://www.liubaoyi.com/wp-content/uploads/2014/11/CX-C-CAS-%E5%9B%BE%E5%BD%A2%E8%AE%A1%E7%AE%97%E5%99%A8%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97.zip" target="_blank" rel="noopener" +>TI计算器使用说明书</a></li> +</ul> +<p>以上资源来自<a class="link" href="http://www.liubaoyi.com/" target="_blank" rel="noopener" +>@Karen的日志</a></p> +<h2 id="观点">观点</h2> +<blockquote> +<p>社交媒体的正确使用方法: +一,不浪费一秒钟时间和知识结构相差太大的人去解释/讨论。你没有义务也没有这个精力。对任何不友好评论,迅速拉黑。 +二,通过公开展示你的思考,来寻找在知识结构,兴趣或技能上,可能与你产生互补作用,或者 1+1&gt;2 的效应的朋友。公开展示长期留存的文字记录,效率最高。</p> +</blockquote> +<p>来自<a class="link" href="https://weibo.com/5339148412/Mal0hACJr" target="_blank" rel="noopener" +>@硅谷王川</a></p> +<h2 id="长文">长文</h2> +<h3 id="我是如何用21天刷完sicp">我是如何用21天刷完SICP</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/2022-10-18-10-56-50.png" +width="411" +height="300" +loading="lazy" +class="gallery-image" +data-flex-grow="137" +data-flex-basis="328px" +></p> +<p>SICP 全称 Structure and Interpretation of Computer Programs,翻译过来叫《计算机程序的构造和解释》,是一本关于计算机程序设计的总体性观念的基础教科书,由麻省理工学院出版社与麦格罗希尔出版社共同出版营销。作者是麻省理工学院教授哈尔·阿伯尔森、杰拉德·杰伊·萨斯曼。</p> +<p>这本书是计算机编程领域非常经典的一本教科书,内容覆盖范围非常广泛,从编程入门一直到教你亲手设计实现一个编程语言解释器。虽然是一本几十年前的书,但是书中的编程理念如数据驱动、过程抽象等到现在仍不过时。可以说是程序员修炼“内功心法”必读的一本好书。</p> +<p>这篇<a class="link" href="http://numbbbbb.com/2016/03/28/20160328_%E6%88%91%E5%A6%82%E4%BD%95%E7%94%A8%E4%B8%A4%E5%91%A8%E6%97%B6%E9%97%B4%E5%88%B7%E5%AE%8C%20SICP/" target="_blank" rel="noopener" +>《我是如何用21天刷完SICP(中文)》</a>的文章讲述了作者通过阅读本书学习的过程和心得,里面的观点可以借鉴,我在看完之后也想再把这本书拿出来学习一遍。</p> +<p>觉得看书太晦涩的,可以到下面这个项目里下载本书作者课堂讲解视频(国内好心人给做了翻译字幕)</p> +<ul> +<li><a class="link" href="https://learningsicp.github.io/" target="_blank" rel="noopener" +>『计算机程序的结构和解释』公开课 翻译项目</a></li> +<li><a class="link" href="https://pan.baidu.com/s/1o78bsYA" target="_blank" rel="noopener" +>百度网盘SICP文件夹</a></li> +<li><a class="link" href="https://www.bilibili.com/video/av8515129/" target="_blank" rel="noopener" +>中译版视频专辑列表(bilibili)</a></li> +</ul> +<h3 id="图解stable-diffusion模型">图解Stable Diffusion模型</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/2022-10-18-10-55-05.png" +width="937" +height="387" +loading="lazy" +class="gallery-image" +data-flex-grow="242" +data-flex-basis="581px" +></p> +<p>这篇<a class="link" href="https://jalammar.github.io/illustrated-stable-diffusion/" target="_blank" rel="noopener" +>图解Stable Diffusion模型(英文)</a>详细讲解了 Stable Diffusion(最近比较火的那个可以通过文字描述进行绘图的AI模型)的工作原理。文中使用清晰的图示阐述了“扩散”模型是怎样通过给图片增加噪声一步一步生成图像的。</p> +<h3 id="wine是如何工作的">Wine是如何工作的</h3> +<p>Linux桌面用户都遇到过在不得不运行 Windows 软件的时候,这个时候就可以使用这个叫做 Wine 的兼容程序,它可以让你在 Linux 下执行 win32 程序。( Valve 最新出品的游戏掌机 Steam Dect 就使用了 Wine 作为兼容层来运行 Windows 平台下的游戏)。</p> +<p>Wine 的名字来自于 “Wine Is Not an Emulator” 这个英文缩写。</p> +<p>这篇<a class="link" href="https://werat.dev/blog/how-wine-works-101/" target="_blank" rel="noopener" +>《Wine是如何工作的(英文)》</a>介绍了它的基本工作原理。</p> +<h3 id="在-windows-记事本里运行光线追踪">在 Windows 记事本里运行光线追踪</h3> +<p>光纤追踪(Ray Tracing)是一项计算机图形学技术,使用该技术渲染的计算机图像具有逼真的全局光照效果。</p> +<p>这篇<a class="link" href="http://kylehalladay.com/blog/2020/05/20/Rendering-With-Notepad.html" target="_blank" rel="noopener" +>《记事本中的光线追踪 30FPS》</a>记录了作者突发奇想要在Windows上的记事本中进行光线追踪渲染的趣事。</p> +<p>其原理是通过系统API获取到记事本窗口的句柄,然后利用钩子函数给记事本的窗体发送相应的“消息”以及覆盖对应的内存数据来实现对记事本窗体界面的“魔改”。最终实现了在另一个进程里执行光线追踪算法,然后借用记事本中显示的字符来替代画面像素,从而“渲染”出画面的效果。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="github.com/SerenityOS/serenity" >SerenityOS项目</a>,一个从头开始的桌面操作系统,内核采用类似Unix的架构,界面外观则仿照了上世纪90年代Windows的窗口风格。作者并未将其定位成玩具,而是一款具备生产力的操作系统软件。 除了操作系统本身,这个项目还有配套的编程语言Jakt、自己的浏览器引擎LibWeb和浏览器Ladybird ​​​</p> +</li> +<li> +<p><a class="link" href="https://github.com/ruanyf/document-style-guide" target="_blank" rel="noopener" +>《中文技术文档写作规范》</a>,<a class="link" href="https://www.ruanyifeng.com/blog/" target="_blank" rel="noopener" +>阮一峰老师</a>整理的技术文档写作规范,规定了标题、文本、段落、标点符号等文档元素的使用约定,需要经常编写技术文档的朋友可以收藏看看。</p> +</li> +<li> +<p><a class="link" href="https://freehand.yunwooo.com/" target="_blank" rel="noopener" +>Freehand意绘</a>,一个在线的AI绘图工具,可以根据文字描述帮助你生成图片,界面简洁友好,使用方便。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/2022-10-18-10-58-24.png" +width="1063" +height="525" +loading="lazy" +class="gallery-image" +data-flex-grow="202" +data-flex-basis="485px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/izackwu/TeachYourselfCS-CN" target="_blank" rel="noopener" +>计算机科学自学指南</a>,提供了一份自学计算机科学的全方位资料大全,可以根据内容系统地进行学习计算机科学相关的知识。</p> +<blockquote> +<p>互联网上,到处都有许多的学习资源,然而精华与糟粕并存。你所需要的,不是一个诸如「200+ 免费在线课程」的清单,而是以下问题的答案:</p> +<p>你应当学习 哪些科目,为什么? +对于这些科目,最好的书籍或者视频课程 是什么? +在这份指引中,我们尝试对这些问题做出确定的回答。</p> +</blockquote> +</li> +<li> +<p><a class="link" href="https://stevens.netmeister.org/631/" target="_blank" rel="noopener" +>UNIX环境中的高级编程</a>,一套编程教程,在课程中,主要学习用C编程语言开发复杂的系统级软件,同时深入了解Unix操作系统(以及属于该家族的所有操作系统,如Linux,BSD,甚至Mac OS X)及其编程环境。</p> +<blockquote> +<p>涵盖的主题将包括用户/内核接口,Unix的基本概念,用户身份验证,基本和高级I / O,文件系统,信号,进程关系和进程间通信。还将涵盖Unix系统上软件开发和维护的基本概念(开发和调试工具,如“make”和“gdb”)。</p> +</blockquote> +</li> +<li> +<p><a class="link" href="https://codeberg.org/drummyfish/tinyphysicsengine" target="_blank" rel="noopener" +>写在C头文件里的3D物理引擎</a>,一个仅用C99标准写在C头文件里的超小物理引擎,没有依赖,直接包含头文件即可在你的工程中使用,功能完整,内置向量、三角函数、引力等计算库。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/2022-10-18-14-04-11.png" +width="399" +height="326" +loading="lazy" +class="gallery-image" +data-flex-grow="122" +data-flex-basis="293px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 003 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/Tue, 11 Oct 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/<h1 id="机器文摘-第003期">机器文摘 第003期</h1> +<h2 id="搞机">搞机</h2> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/2022-10-11-10-17-41.png" +width="853" +height="640" +loading="lazy" +class="gallery-image" +data-flex-grow="133" +data-flex-basis="319px" +></p> +<h3 id="收听广播可以缓解压力个人体会">收听广播可以缓解压力(<em>个人体会</em>)</h3> +<p>近期我找到一个缓解焦虑的新方法,听收音机。</p> +<p>一定要老式的那种,收听真正无线电波信号的。随便找个台,最好还带有滋滋啦啦的杂音,当作工作时的背景声音,听着听着就感觉无比的放松。但又不是简单的“粉红噪音”、“白噪音”带来的那种平静,这种“仿佛脱离现在、回到了某个时空”的感觉让人感到愉悦。</p> +<p>我还没找到相关的研究信息,有人知道原理吗?</p> +<h2 id="动向">动向</h2> +<h3 id="欧洲通过法案将强制统一usb-type-c接口为充电接口">欧洲通过法案,将强制统一USB Type-C接口为充电接口</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/2022-10-11-15-46-02.png" +width="800" +height="450" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></p> +<blockquote> +<p>欧洲议会今天以压倒性多数投票赞成在2024年底之前将USB-C作为包括iPhone和AirPods在内的各种消费电子设备的通用充电端口。</p> +</blockquote> +<p>这对于苹果来说恐怕是个坏消息,对于消费者来说应该是个好消息。不过也许以苹果公司的脾气,说不定将来取消所有物理接口也有可能。</p> +<ul> +<li><a class="link" href="https://www.macrumors.com/2022/10/04/eu-passes-law-to-switch-iphone-to-usb-c-in-2024/" target="_blank" rel="noopener" +>欧洲强制iPhone使用usb-c接口</a></li> +</ul> +<h3 id="波士顿动力承诺不将机器人武器化">波士顿动力承诺不将机器人武器化</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/2022-10-11-10-15-11.png" +width="640" +height="427" +loading="lazy" +class="gallery-image" +data-flex-grow="149" +data-flex-basis="359px" +></p> +<blockquote> +<p>当地时间 10 月 6 日消息,波士顿动力、Agility Robotics、ANYbotics 等 6 家公司联合发表致行业的公开信表达了他们对这些可能性的担忧。他们称,先进的商业化机器人的经济可负担性和可获得性越来越强,其被滥用的可能性也越来越大。我们承诺不会将通用机器人或软件武器化,也不会支持其他人这么做;同时呼吁政策制定者、开发者和用户共同促进安全使用。</p> +</blockquote> +<p>我个人感觉此类声明并不会带来什么限制,相反地,我偏悲观的认为这种技术很可能以最优先的速度被应用于军事目的。</p> +<ul> +<li><a class="link" href="https://www.163.com/dy/article/HJ5DMDS005118DFD.html" target="_blank" rel="noopener" +>网易新闻:波士顿动力承诺不将机器人武器化</a></li> +</ul> +<h3 id="taocpthe-art-of-computer-programming-4b正式初版">TAOCP(《The Art of Computer Programming》) 4B正式初版</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/2022-10-11-10-30-24.png" +width="756" +height="732" +loading="lazy" +class="gallery-image" +data-flex-grow="103" +data-flex-basis="247px" +> +<em>图片来自<a class="link" href="https://weibo.com/5819320755/M9LXaF5I3" target="_blank" rel="noopener" +>@算法时空</a></em></p> +<p>世界著名程序员——高德纳老师,日前在他的个人网站宣布了<a class="link" href="https://www-cs-faculty.stanford.edu/~knuth/news.html#v4b" target="_blank" rel="noopener" +>TAOCP 4B正式出版</a>的消息。</p> +<p>这部计算机世界的经典巨著,耗费了高德纳老爷子的毕生心血,虽然已经出到了第四B卷,但本书目前还没有完全写完(本书从1962年开始写(中间停了几年是因为老爷子发现没有趁手的排版软件,就顺手发明了TEX——这又是另一个宏大话题了),计划共有七卷,其中第四卷分ABC三册)。他在自己主页中提到:</p> +<blockquote> +<p>与此同时,我继续研究第3部分(第4C卷),它已经有许多令人兴奋的主题。</p> +</blockquote> +<p>我只能说:祝老爷子身体健康!</p> +<h3 id="webassembly技术发展的怎么样了">WebAssembly技术发展的怎么样了?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/2022-10-11-10-45-39.png" +width="386" +height="383" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="241px" +></p> +<blockquote> +<p>WebAssembly 是一种运行在现代网络浏览器中的新型代码,并且提供新的性能特性和效果。它设计的目的不是为了手写代码而是为诸如 C、C++和 Rust 等低级源语言提供一个高效的编译目标。 +——来自<a class="link" href="https://developer.mozilla.org/zh-CN/docs/WebAssembly/Concepts" target="_blank" rel="noopener" +>Mozilla官方文档关于WebAssembly概念的介绍</a>。</p> +</blockquote> +<p>WebAssembly技术号称可以在浏览器中高效执行代码,并可以很方便地将C、Rust等各种语言编译到浏览器中执行,那么目前他的使用体验如何?</p> +<p>我周末做了简单体验。</p> +<p>通过官方给出的文档和入门指南,可以很快速地搭建出程序的原型,上图就是我参考官方示例将Rust代码编译到网页中执行的效果(是一个<a class="link" href="https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life" target="_blank" rel="noopener" +>经典的Game of life的小游戏</a>)。</p> +<p>从开发上来说,现在已经有了比较成熟的工具链(尤其是针对Rust语言到WASM的工具),和共享库的生态,想要进行开发,不必像前些年那样费心地搭建开发环境,基本上在Linux系统下简单执行几行命令即可完成环境搭建。</p> +<p>从执行效果来说,我没有做性能测试,直观感受上来说,确实比原生js快了不少。</p> +<p>但这并不是重点,我个人觉得这项技术它最大的意义在于,将之前的桌面程序技术有了向Web移植的可行性。</p> +<p>我们有可能很快就看到完全兼顾Web分发的方便和桌面程序性能体验的产品。</p> +<ul> +<li><a class="link" href="https://www.infoq.cn/article/hdwglnhub2wwklo9zz6z" target="_blank" rel="noopener" +>一则WebAssembly相关的新闻</a></li> +<li><a class="link" href="https://github.com/mbasso/awesome-wasm" target="_blank" rel="noopener" +>GitHub网友整理的关于WASM的资源大全</a></li> +<li><a class="link" href="https://rustwasm.github.io/docs/book/introduction.html" target="_blank" rel="noopener" +>一本手把手教你使用Rust语言进行WASM开发的在线电子书</a></li> +<li><a class="link" href="https://zalo.github.io/CascadeStudio" target="_blank" rel="noopener" +>一个使用WASM技术将三维设计软件CAD嵌入到网页中的开源项目</a></li> +<li><a class="link" href="https://supabase.com/blog/postgres-wasm" target="_blank" rel="noopener" +>一个使用WASM技术在浏览器中运行的PostgresSQL数据库</a></li> +</ul> +<h2 id="观点">观点</h2> +<blockquote> +<p>在你的密码里面放上一个逗号<code>&quot;,&quot;</code>,这样当你的密码在网上被人拖库时可以给黑客增加一些麻烦,因这样会使得他在作为csv文件往他的密码字典里面导入的时候,因为逗号分隔符的错位而让他崩溃。 +注:csv文件默认使用逗号分隔符区分字段。</p> +</blockquote> +<ul> +<li>来自:佚名网友。</li> +</ul> +<blockquote> +<p>当你长期使用windows远程桌面进行远程办公时,一层一层的服务器登进去,时间长了就会陷入盗梦空间那种疑惑,我现在是在哪一层?</p> +</blockquote> +<ul> +<li>来自:我自己。</li> +</ul> +<blockquote> +<p>量子计算机就是向过去和未来借用了很多乃至无限的时间吗?刹那即永恒。 +注:量子计算机号称每个bit位可在同一时刻表示多种状态。</p> +</blockquote> +<ul> +<li>来自:我自己。</li> +</ul> +<h2 id="长文">长文</h2> +<h3 id="从0到1打造家庭弱电方案">从0到1打造家庭弱电方案</h3> +<p>现在有不少人在困惑家里的网线该如何布局,这篇<a class="link" href="https://luolei.org/home-network-1/" target="_blank" rel="noopener" +>《从0到1打造家庭弱电方案》(中文)</a>记录了作者完整的装修过程,内容十分精彩详尽。看完之后我有点儿后悔,当时装修时没有给各个房间拉上光纤,以及用了比较普通的超五类网线。</p> +<h3 id="如何配置一个完全基于命令行窗口的开发环境">如何配置一个完全基于命令行窗口的开发环境</h3> +<p>我在油管上关注了一个日本小哥(Takuya Matsuyama),是一个个人开发者,经常上传自己的开发过程录屏,他完全基于命令行窗口(控制台)进行开发,没使用任何IDE。</p> +<p>后来我参考他的配置文件给自己也配置了一套,使用fish作为shell,neovim加上各种插件作为主力编辑器,现已成为我的日常开发环境。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/2022-10-11-11-16-56.png" +width="1571" +height="820" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="459px" +></p> +<p>有条件的可以到他的主页看看关于如何配置的详细介绍,或者直接去他的github仓库获取配置文件。</p> +<ul> +<li><a class="link" href="https://www.craftz.dog/posts" target="_blank" rel="noopener" +>Takuya Matsuyama小哥的主页</a></li> +<li><a class="link" href="https://github.com/craftzdog/dotfiles-public" target="_blank" rel="noopener" +>他的基于控制台命令行开发的各种配置文件</a></li> +</ul> +<h3 id="云桌面并不像你想的那么好">云桌面并不像你想的那么好</h3> +<p>给开发人员配置一个廉价的笔记本加上一个高性能的云端工作站,这个点子棒不棒?</p> +<p>听起来有很多的优势,兼具了性能、便携性、安全性等等。</p> +<p>不过先等一等,这里有一位作者在这样尝试了之后,给出了不少负面反馈(比如多显示器支持、GPU加速、网页视频质量等等问题),有兴趣的可以点进去看看。</p> +<ul> +<li><a class="link" href="https://mjg59.dreamwidth.org/61535.html" target="_blank" rel="noopener" +>《云桌面并不像你想象的那么好》(英文)</a></li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://webusers.imj-prg.fr/~jan.nekovar/co/en/en.pdf" target="_blank" rel="noopener" +>从高中到大学,数学中常用符号和计算关系的英文名称</a>,适合对数学公式中的各种符号感到困惑的人收藏,这本小册子汇聚了所有数学符号、常用希腊字母、代数式等英文叫法介绍。</li> +<li><a class="link" href="http://www.egr.unlv.edu/~ed/x86.html" target="_blank" rel="noopener" +>如何在Ubuntu下进行x86-x64汇编语言编程</a>,一本讲解现代汇编语言的电子书,基于常用的Ubuntu系统,从认识汇编语言开始讲起,到工具链的准备和怎样编写和调试程序,都有详细的介绍。</li> +<li><a class="link" href="https://www.drawkit.com/" target="_blank" rel="noopener" +>DrawKit</a>,一个提供矢量插画的网站,有很多免费的高质量插画,可用于网站制作、软件产品等方面。</li> +<li><a class="link" href="https://missing-semester-cn.github.io/" target="_blank" rel="noopener" +>计算机教育中缺失的一课</a>,一般学校里不会教开发环境的配置和各种效率工具的使用,这本电子书就是以环境和工具为切入点,将学校学习的理论应用于实际,比较接地气。 +<blockquote> +<p>大学里的计算机课程通常专注于讲授从操作系统到机器学习这些学院派的课程或主题,而对于如何精通工具这一主题则往往会留给学生自行探索。在这个系列课程中,我们讲授命令行、强大的文本编辑器的使用、使用版本控制系统提供的多种特性等等。学生在他们受教育阶段就会和这些工具朝夕相处(在他们的职业生涯中更是这样)。 因此,花时间打磨使用这些工具的能力并能够最终熟练地、流畅地使用它们是非常有必要的。</p> +</blockquote> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 002 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/Mon, 03 Oct 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/<h1 id="机器文摘-第002期">机器文摘 第002期</h1> +<h2 id="搞机">搞机</h2> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/2022-10-03-11-08-56.png" +width="895" +height="689" +loading="lazy" +class="gallery-image" +data-flex-grow="129" +data-flex-basis="311px" +></p> +<blockquote> +<p>MNT推出了一款名叫Pocket Reform的迷你笔记本电脑。它外形紧凑(屏幕只有7英寸),但功能齐全,据官方介绍,它的性能满足轻量办公需求,甚至还能玩一些游戏(ARM平台)。虽然现在的智能手机在性能方面已经有了很大提升,且便携性远超笔记本电脑,但是还是有相当一部分人倾向于在具有真实物理键盘的“电脑”上进行操作。</p> +</blockquote> +<p>在我看来,这台设备可能对于希望随时随地写两行代码的程序员更加具有吸引力。</p> +<ul> +<li>参考文章: +<ul> +<li><a class="link" href="https://spectrum.ieee.org/meet-an-open-source-pc-that-can-fit-in-your-pocket" target="_blank" rel="noopener" +>可以装在口袋里的开源PC</a></li> +</ul> +</li> +</ul> +<h2 id="动向">动向</h2> +<h3 id="文字直接生成3d模型">文字直接生成3D模型</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/2022-10-03-11-41-32.png" +width="735" +height="491" +loading="lazy" +class="gallery-image" +data-flex-grow="149" +data-flex-basis="359px" +> +谷歌实验室的几个哥们上周发布了一个新作&mdash;-DreamFusion。输入文字,就能生成带深度图和法线的3D模型。</p> +<p>开发团队声称:</p> +<blockquote> +<p>最近在文本到图像合成方面的突破是基于在数十亿个图像-文本对上训练的扩散模型。将这种方法应用于3D合成将需要标记大量的3D资产和用于对3D数据进行去噪的高效架构,而目前这都不太可行。在DreamFusion中,我们通过使用预先训练的2D文本到图像扩散模型来执行文本到3D合成来规避这些限制。我们的方法不需要3D训练数据,也不需要修改图像扩散模型,证明了预训练图像扩散模型作为先验的有效性。</p> +</blockquote> +<p>具体方法据称是来自他们新提出的“一种通过优化损失函数从扩散模型中生成采样的方法”该方法允许他们在任意参数空间中优化采样(例如3D空间)。</p> +<p>我看了一下官方给出的demo,3D模型还略显粗糙,不过可能将来算力提升之后会有改善。</p> +<p>现在,除了插画师受到了职业威胁,就连3D建模工程师的工作也有可能被AI取代?</p> +<ul> +<li>参考文章: +<ul> +<li><a class="link" href="https://dreamfusion3d.github.io/" target="_blank" rel="noopener" +>DreamFusion官方介绍</a></li> +</ul> +</li> +</ul> +<h3 id="通过文字描述生成语音的人工智能也来了">通过文字描述生成语音的人工智能也来了</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/2022-10-03-11-32-54.png" +width="909" +height="451" +loading="lazy" +class="gallery-image" +data-flex-grow="201" +data-flex-basis="483px" +></p> +<blockquote> +<p>Twitter 用户 Felix Kreuk 发布了从文本到音频 (Text to Audio) 的 AI 模型:AudioGen +AudioGen 可以 +(1) 根据文本生成音频;(2) 续写指定的音频;(3) 同时做以上两件事,根据指定文本描述生成指定音频。 +作者给出的展示DEMO里展示了如下文本生成的语音: +(1)在风声中吹口哨 +(2)男人在说话时伴有鸟和狗的叫声 +(3)警报器和嗡嗡作响的引擎接近后走远 +(4)鸽子咕咕叫并伴有沙沙的声音 +(5)男人说话的声音,背景伴有人群欢呼声</p> +</blockquote> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/2022-10-03-11-33-50.png" +width="1147" +height="629" +loading="lazy" +class="gallery-image" +data-flex-grow="182" +data-flex-basis="437px" +> +从作者公布的架构图上可以看出来,采用的也是Transformer神经网络。之前在看到AI画图时我就想到同样的原理可能用于生成音频,结果这才没过几天,人家都已经做出来了。</p> +<ul> +<li>参考文章: +<ul> +<li><a class="link" href="https://weibo.com/1309158107/M8mPt5LgI" target="_blank" rel="noopener" +>@海辛Hyacinth</a></li> +<li><a class="link" href="https://felixkreuk.github.io/text2audio_arxiv_samples/" target="_blank" rel="noopener" +>作者的demo和原理介绍页面(托管在github)</a></li> +</ul> +</li> +</ul> +<h2 id="观点">观点</h2> +<blockquote> +<p>站桩的简单,枯燥和有效,就好比持有 sp500 指数基金简单,枯燥但足以秒杀 95%以上的基金经理一样。 +莫将容易得,便作等闲看。</p> +</blockquote> +<ul> +<li>来自<a class="link" href="https://weibo.com/5339148412/LeTdmcfjW" target="_blank" rel="noopener" +>@硅谷王川</a></li> +</ul> +<h2 id="长文">长文</h2> +<ul> +<li> +<p><a class="link" href="https://randomascii.wordpress.com/2022/09/29/why-modern-software-is-slow-windows-voice-recorder/" target="_blank" rel="noopener" +>为什么现在的软件这么慢(英文)</a>,作者在Windows系统(Windows 10, 21H2版本)下使用“录音机App”的时候获得了极差的体验(确切的说是软件启动后大概卡死了将近20秒)。于是动手分析到底是什么原因导致,然后发现主要是这个软件启动后疯狂扫描“用户”文件夹下的录音文件用于构建界面中的录音列表,这种密集IO操作导致软件停止响应。作者花了很大的篇幅来吐槽这种行为,对于微软工程师为什么这么做表示莫名其妙。不过由于我们现在的计算机大都使用了固态硬盘,而且我们的习惯一般不会在“用户”文件夹下存放太多文件,所以这个体验应该不太明显。但即使这样,我也同样对Windows系统现在的软件质量感到担忧。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/2022-10-03-18-24-45.png" +width="643" +height="310" +loading="lazy" +class="gallery-image" +data-flex-grow="207" +data-flex-basis="497px" +></p> +</li> +<li> +<p><a class="link" href="http://zhangtielei.com/posts/blog-involution-analysis.html" target="_blank" rel="noopener" +>内卷、汉明问题与认知迭代(中文)</a>,作者较为科学地分析了内卷的定义和形态,从而引申出了关于什么是“人生中重要的事”的思考,文章虽然比较长,但也清晰易懂,发人深省。部分引用如下:</p> +<blockquote> +<p>从大的方面说,社会需要创新,个人则需要突破,而创新和突破又都要求我们不断地精益求精。那么,内卷与精益求精是本质上一样的吗?如果不是,两者的区别在哪?</p> +</blockquote> +<blockquote> +<p>在某件事情上花费太多精力,并不一定就是内卷;在无关紧要的事情上花费精力才是真的内卷。</p> +</blockquote> +<blockquote> +<p>汉明早年在贝尔实验室工作。那年春天,他经常和几位同事聚在一起在餐厅吃午饭。吃饭期间,他向其中一位叫Dave McCall的同事提了一个问题:“在你的领域里最重要的问题是什么?”大约一个星期后,再次一起午餐时他继续发问:“你目前正在研究的最重要的问题是什么?” 显然,这位同伴对于这两个问题的回答并不一样。于是他接着问:“如果你当前做的并不是最重要的事,那为什么还要一直花时间投入去做呢?”有了这「灵魂三问」之后,于是——在那个春天接下来的日子里,汉明不得不另找别的同伴一起吃午饭了…… +汉明的问题听起来有些让人生厌,但后来演变成了一个在学术界很受关注的问题——汉明问题(The Hamming Question)。它本来说的是科研选题的事情,但实际上关乎人生最重要的选择。</p> +</blockquote> +<blockquote> +<p>内卷,指的是在低水平的状态下无实质意义的消耗。这里的「低水平」,可能是客观的,也可能是主观的。 +针对主观的低水平状态,我们需要冲破意识层面的障碍,同时把读书、实践和思考结合起来,反复迭代,这样才可能跃升到更高的认知层次上。 +而针对客观的低水平状态,唯有认真对待汉明问题,选择好真正重要的人生大方向,才能避免卷入那些无关紧要的、无谓的消耗中去。这才是真正考验大智慧的时候了。</p> +</blockquote> +</li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/mtdvio/every-programmer-should-know" target="_blank" rel="noopener" +>每个程序员都需要知道的</a> ,整理了一份资源合集,包含了软件工程师技能相关的各类知识资源,包括算法、数据结构、浮点、Unicode、时间、内存、分布式、正则、安全、架构、工程哲学、实践、职业发展、软技能。。。等等,以及一些可用于技能训练和学习的站点。看起来非常符合我这种“收藏了就是学习了”的囤积爱好者的胃口。</li> +<li><a class="link" href="https://github.com/jefflomax/word-writer-6-commodore-64" target="_blank" rel="noopener" +>Word Writer 6 6502汇编源码</a>,是一份开源的Word Writer 6的6502汇编源码,可在模拟器下编译运行。用来学习6502汇编是一个不错的项目。上个世纪80年代爆火的计算机Commodore 64是很多复古计算机爱好者(包括我)的最爱,Word Writer 6是该平台上流行的文字排版编辑软件。</li> +<li><a class="link" href="https://almanac.httparchive.org/zh-CN/2022/" target="_blank" rel="noopener" +>HTTP Archive的年度报告</a>,这份报告详细(超级详细)分析了目前全球各在线网页中所使用的技术,从页面中的“CSS”、“Javascript”、“字体”以及用户体验中的“搜索引擎优化”、“移动端支持”等超过20个方面进行展示,内容十分详尽,有种看NBA的进球统计的感觉。</li> +<li><a class="link" href="https://javascriptquiz.com/" target="_blank" rel="noopener" +>Javascript Quiz</a>,一份关于Javascript的小测验,可在线作答,一共十道选择题,全是关于Js语法的常见坑,每道题答完之后都可以点击“info”图标获取关于这道题的详细解释。我试着做了一下,勉强及格。</li> +<li><a class="link" href="https://www.musi-co.com/listen/streams" target="_blank" rel="noopener" +>Streams</a>,这里有一批纯AI创作的音乐,由AI负责作曲和编曲,工程师只是把这些乐谱放入DAW软件中进行混音和录音,完成度很高,听起来相当上头。</li> +<li><a class="link" href="https://learningsynths.ableton.com/zh-Hans/get-started" target="_blank" rel="noopener" +>学习合成器</a>,这个网站提供了一本交互式电子书,讲解了电子合成器的原理,还单独提供了一个交互页面用于调制和体验各种合成器音色。我尝试了一下,真的很直观,在页面中直接可以修改各种振荡器波形、滤波器、LFO等参数,非常适合用于音色合成入门。</li> +<li><a class="link" href="https://llh911001.gitbooks.io/mostly-adequate-guide-chinese/content/" target="_blank" rel="noopener" +>函数式编程指北</a>,在线电子书,讲解函数式编程的范式,以Javascript进行举例,作者风趣幽默,深入浅出,觉得被函数编程概念唬住的可以去看看。</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 001 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-001-%E6%9C%9F/Wed, 28 Sep 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-001-%E6%9C%9F/<h1 id="机器文摘-第001期">机器文摘 第001期</h1> +<h2 id="搞机">搞机</h2> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-001-%E6%9C%9F/2022-09-28-09-38-31.png" +width="641" +height="571" +loading="lazy" +class="gallery-image" +data-flex-grow="112" +data-flex-basis="269px" +></p> +<blockquote> +<p>TurnT是一个颇具创意的唱盘设计,它把智能手机与模拟黑胶的老式音乐播放方式相结合。用家把触笔放在手机屏幕显示的黑胶唱片上,它即开始播放。从内部结构上看,它其实是一个无线扬声器,可以连接到智能手机播放音乐。TurnT这种播放音乐的体验增加了互动的体验感,如同在实际的唱片上一样,挪开唱针会立即停止音乐,将其“向内”移动到手机屏幕上显示的光盘中心就可以播放音乐。要更改歌曲,您可以通过滑动来更改专辑,还可以重新定位。</p> +</blockquote> +<ul> +<li>参考文章: +<ul> +<li><a class="link" href="https://www.sohu.com/a/573073318_121124377" target="_blank" rel="noopener" +>把手机变成黑胶唱机 &mdash; Yamaha发布了与智能手机配合使用的独特音乐设备</a></li> +</ul> +</li> +</ul> +<h2 id="动向">动向</h2> +<h3 id="ai生成图像技术带来的艺术危机">AI生成图像技术带来的“艺术危机”</h3> +<blockquote> +<p>近几周,基于AI生成的图像艺术作品的新闻越来越多,以DALL-E、Stable Diffusion等神经网络模型为代表的图像生成类AI进化越来越快,已达“以假乱真”程度。我也在动手尝试后惊叹他们的生成效果非常逼真和充满想象力。然而很快,此类AI就引起设计师、画师、艺术家的反对(恐慌?)。当然也有很多持积极态度,把它们当作工具加以利用,甚至不乏商业头脑灵活的人士,已经通过AI作画开始获取收益。于是引发了一系列的反应和讨论。</p> +</blockquote> +<ul> +<li>参考文章: +<ul> +<li><a class="link" href="https://www.uisdc.com/unsplash-prohibited-ai" target="_blank" rel="noopener" +>知名图库Unsplash 宣布禁传AI生成图像</a></li> +<li><a class="link" href="https://www.51cto.com/article/719747.html" target="_blank" rel="noopener" +>付费图库集体封禁AI生成图片</a></li> +<li><a class="link" href="https://www.bilibili.com/read/cv18571483" target="_blank" rel="noopener" +>AI 绘画 Windows 本地零基础搭建 Stable Diffusion</a></li> +<li><a class="link" href="https://zhuanlan.zhihu.com/p/560226367" target="_blank" rel="noopener" +>AI数字绘画 stable-diffusion 保姆级教程</a></li> +<li><a class="link" href="https://github.com/ahrm/UnstableFusion" target="_blank" rel="noopener" +>一个包装好的AI绘图开源GUI客户端</a></li> +</ul> +</li> +</ul> +<h2 id="观点">观点</h2> +<blockquote> +<p>程序员是计算机的翻译官。他们先是把人类的语言翻译成计算机的语言,现在又教会了计算机使用人类的语言。</p> +<ul> +<li>来自<a class="link" href="https://weibo.com/6827625527/M7vHNl9HD" target="_blank" rel="noopener" +>@t0mbkeeper</a></li> +</ul> +</blockquote> +<h2 id="长文">长文</h2> +<ul> +<li>对很多事情都有兴趣,但是生命的时间有限,怎么办?<a class="link" href="https://news.ycombinator.com/item?id=32628511" target="_blank" rel="noopener" +>这篇hacker news上的讨论(英文)</a>或许能提供一些建议。</li> +<li><a class="link" href="https://www.calnewport.com/blog/2022/05/16/taking-a-break-from-social-media-makes-you-happier-and-less-anxious/" target="_blank" rel="noopener" +>这篇文章提到了一项关于焦虑的研究(英文)</a>。研究表明,远离社交媒体(包括及时通讯工具)一个星期,可以显著提升幸福感、降低焦虑程度;</li> +<li>掌握一项技能需要时间和实践,降低预期,慢即是快。<a class="link" href="https://geekplux.com/posts/how-i-learned-programming" target="_blank" rel="noopener" +>《我是如何学会编程的》(中文)</a>,这篇文章是一位网友分享的关于他学习编程的历程。</li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https:///coding-fonts.netlify.app/" target="_blank" rel="noopener" +>coding-fonts</a> ​​​是一个不错的编程字体网站,可以在线预览各种适合编程开发时用的字体,让选择更加直观。</li> +<li><a class="link" href="https://github.com/opendilab/DI-sheep" target="_blank" rel="noopener" +>深度强化学习羊了个羊</a> 这个github仓库开源了一个通过AI强化学习来玩耍“羊了个羊”游戏的模型及代码,结构清晰,效果很棒,用于了解深度强化学习知识非常不错。</li> +<li><a class="link" href="https://github.com/scutan90/DeepLearning-500-questions" target="_blank" rel="noopener" +>深度学习500问</a>这本在线书籍以问答形式对常用的概率知识、线性代数、机器学习、深度学习、计算机视觉等热点问题进行阐述,目前在github将近50k颗星。</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>基于Markdown格式的知识管理尝试计划https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8Emarkdown%E6%A0%BC%E5%BC%8F%E7%9A%84%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86%E5%B0%9D%E8%AF%95%E8%AE%A1%E5%88%92/Sat, 23 Apr 2022 00:00:00 +0000https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8Emarkdown%E6%A0%BC%E5%BC%8F%E7%9A%84%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86%E5%B0%9D%E8%AF%95%E8%AE%A1%E5%88%92/<h2 id="背景">背景</h2> +<ul> +<li>之前一直有收藏文章并整理自己知识体系的习惯,使用的工具是evernote(印象笔记),十多年来收集数百篇网络文章,自己整理并编写笔记若干篇,已做到目录和标签的基本分类;</li> +<li>之前也有通过每日编写一个markdown文件来记录工作日志、零星日记的习惯,有心得感悟时都直接在工作日志中随手写入,保存起来;</li> +<li>通过github pages写过一些个人博客文章,更新频率不高,主要作为个人笔记在使用;</li> +<li>当前问题如下: +<ul> +<li>evernote用户体验逐年下降,对设备限制较多,且内容存在云端、格式封闭,个人掌控感较差,数据有无法访问的风险;</li> +<li>工作日志中散落的心得感悟没有索引,基本埋没在以日期命名的文件里,不成体系;</li> +<li>收集的数百篇网络文章基本没有进行消化阅读,未形成自己理解的内容;</li> +</ul> +</li> +</ul> +<h2 id="目标">目标</h2> +<ul> +<li>为网络收藏和个人产出的文章建立索引,把之前的“仓库”形成“体系”;</li> +<li>从evernote中迁移出来,所有数据放在本地,并通过在线网盘进行同步;</li> +<li>以纯文本+附件资源作为载体,避免对一种编辑器或工具产生过度依赖;</li> +</ul> +<h2 id="工具选择">工具选择</h2> +<ul> +<li><a class="link" href="https://obsidian.md/" target="_blank" rel="noopener" +>Obsidian</a>,用于建立最基本的知识仓库,编辑自己的知识卡片,并充分利用它的双向链接功能将收藏的文章和自己输出的内容形成体系连接起来;</li> +<li><a class="link" href="https://code.visualstudio.com/" target="_blank" rel="noopener" +>vscode</a>, 用于编辑技术文章、工作日志以及基于插件进行绘图,最终输出内容到Obsidian文件库中;</li> +<li>360网盘,用于在线实时同步存储Markdown的文件夹,任何具有同步文件功能的网盘均可;</li> +</ul> +<h2 id="具体计划">具体计划</h2> +<ul> +<li>整理文章目录:按照文章来源(网络、书籍、心得)、知识层面(技术、生活、哲学)等进行分类,形成树状目录结构;</li> +<li>整理文章标签:每篇文章虽然只属于一个目录,但是可以有多个标签,提升了检索文章的维度。目录作为知识体系的骨架分类,标签则是详细划分(如技能相关的标签就可以有:编程、绘画、音乐、写作,并还能进一步细分);</li> +<li>参考少数派文章<a class="link" href="https://sspai.com/post/62414" target="_blank" rel="noopener" +>玩转 Obsidian 01:打造知识循环利器</a>提到的Zettelkasten笔记法逐步整理多年积累的知识形成以“知识卡”(其实就是具有互相链接关系的Markdown文件)为单位的知识;</li> +<li>[[玩转 Obsidian 01:打造知识循环利器 - 少数派]]</li> +<li>阅读整理多年收集的知识文章,按照大约每周一篇的节奏,产出自己理解后的知识卡片,形成“知识循环”;</li> +<li>如此往复若干时间,不断完善这个体系,工具可更换,载体亦可更换,唯独不变的是探索、求知的心;</li> +</ul>《少有人走的路》读书笔记https://sbabybird.github.io/p/%E5%B0%91%E6%9C%89%E4%BA%BA%E8%B5%B0%E7%9A%84%E8%B7%AF%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/Sun, 18 Apr 2021 00:00:00 +0000https://sbabybird.github.io/p/%E5%B0%91%E6%9C%89%E4%BA%BA%E8%B5%B0%E7%9A%84%E8%B7%AF%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/<h2 id="简介">简介</h2> +<p>《少有人走的路-心智成熟的旅程》这本书据说是畅销多年,经久不衰,在豆瓣上评分很高。不少人纷纷表示此书给自己带来了很多思考和感悟。我是在今年第二遍阅读了此书,之前大约十年前草草看过一遍,印象不够深刻。但今年再读,书中就有很多文字能够读进去了。虽然作者本身对“爱”的定义和解读我并不完全认同,以及作者也许受宗教信仰的影响,在某些观点上有一定的倾向,但都不妨碍这本书给我带来震撼。</p> +<h2 id="笔记">笔记</h2> +<blockquote> +<p>人生苦难重重。</p> +</blockquote> +<p>开篇就表达了最基本的设定,让我闭上本来想要抱怨的嘴,不得不跟着往后翻看有没有可以解决的答案。</p> +<blockquote> +<p>解决人生问题的关键在于自律。人若缺少自律,就不可能解决任何麻烦和问题。在某些方面自律,只能解决某些问题,全面的自律才能解决人生所有的问题。</p> +</blockquote> +<p>在认真看本书之前,我对“自律”的理解还仅限于在生活上严格要求自己,作息规律、遵守诺言、办事靠谱、简约不浪费。但作者显然不仅仅是这个意思,否则也用不着用很大的篇幅来说“自律”。</p> +<p>看一下作者对“自律”的定义。</p> +<blockquote> +<p>所谓自律,就是主动要求自己以积极的态度去承受痛苦,解决问题。自律有四个原则:推迟满足感、承担责任、忠于事实、保持平衡。</p> +</blockquote> +<p>只有不回避问题、以积极的心态去解决问题,才算作是自律。即便在生活中早睡早起、刻苦读书、勤奋工作,如果遇到问题首先想要逃避,那就不能算是自律。很惭愧,我之前在不少问题上都是以拖延为主要处理方式,本质上还是无法承受或者面对解决问题可能带来的痛苦,那么在读了本书之后,我会有意识地去改变做事原则,就拿上周来说,我终于鼓起勇气去诊所看牙,解决了拖了很久的牙结石问题(虽然智齿还没解决)。</p> +<blockquote> +<p>推迟满足感,就是不贪图暂时的安逸,先苦后甜,重新设置人生快乐与痛苦的次序:首先,面对问题并感受痛苦;然后,解决问题并享受更大的快乐。在充满问题和痛苦的人生中,推迟满足感是唯一可行的生活方式。</p> +</blockquote> +<p>这个话题不仅仅是在本书中提到过,据说有心理学家做过试验,在一群孩子里面寻找具有“推迟满足感”倾向的人(比如能够先忍住不吃巧克力以获取更大的奖励),结果证明这样的人在后续的生活中取得成功的概率要远高于先吃巧克力的人。本书首先强调这个话题,将其作为自律中的第一个原则,我想是因为道理都是相通的吧。很久之前我看过一篇讲解时间管理的文章,里面提到在规划一天的工作时,优先处理最难的那件事(文章中称“先吃掉那只青蛙”),然后当前的工作会越来越简单,这样的方式跟本书中作者所提倡的“推迟满足感”异曲同工。尽可能的正面问题、提早感受解决问题的痛苦,正是执行自律的首要原则。</p> +<blockquote> +<p>不能及时解决自己面临的问题,这些问题就会像山一样横亘在我们心中,阻碍心灵的成长和心智的成熟。很多人显然忽略了这个道理。我们必须面对属于自己的问题,这是解决问题的基本前提。 +指望别人解决自己的问题,也不是明智之举。唯一的办法&ndash;我们应该勇敢地说:“这是我的问题,要由我来解决!”</p> +</blockquote> +<p>这就牵出了第二个原则&ndash;“承担责任”。逃避问题会自然而然的推卸责任,认为这不是自己的问题,始终对于自己扮演的角色缺少清晰的认知。不过作者提到了两种情况“神经官能症”和“人格失调症”,前者属于给自己强加责任,后者属于推卸责任。这么说来,我可能有前者的倾向,很多压力都来源于此。不过作者也提到在复杂的人生道路上,判断自己该为什么事和什么人负责,这是一个永远存在的难题。</p> +<p>还有一种情况是,在有些事情上强加给自己责任,在有些事情上又没有意识到是自己的责任。读到这些章节的时候,我也在反思,当我一旦开始想要抱怨的时候,其实已经陷入“人格失调”和“神经官能”的边缘,要时刻提醒自己,不断评估自己的责任。</p> +<blockquote> +<p>忠于事实是自律的第三条原则。如果我们追求健康的生活和心智的成熟,那我们就要坚定不移地遵循这条原则。我们需要实事求是,杜绝虚假。我们越是了解事实,处理问题就越是得心应手。逃避现实的痛苦是人类的天性,只有通过自律,我们才能逐渐克服现实的痛苦,及时修改自己的地图,逐步成长。我们必须忠于事实,尽管这会带来暂时的痛苦,但远比沉湎于虚假的舒适中要好。我们必须忍受暂时的不适感,追求事实而不是假象,并承受这一过程的痛苦。</p> +</blockquote> +<p>这让我想到了“诚实”,不仅限于不撒谎(这一点实在是难以做到)。但我很快意识到作者所说的忠于事实比不撒谎更重要的是,面对事实,不可活在自己的想象里。虽然我们每个人都有自己的成见,看事情也很难看到全貌,但是不可做不基于事实的幻想,期望问题会自行消失、期望不付出努力就能得到回报。</p> +<blockquote> +<p>你既要承担责任学会推迟满足感,先苦后甜,把眼光放长远,同时又要尽可能过好当前的生活,让人生的快乐多于痛苦。</p> +</blockquote> +<p>这就是“保持平衡”,应该是一种“拿捏”吧。为了保持平衡,作者建议,适当的选择“放弃”。包括放弃过时的观念、习惯。王小波在小说中写道:“人生就是一个缓慢被捶的过程。。。”,如果不能适时的放弃一些东西,那很显然这个过程是相当痛苦的。</p> +<p>先写这么多。</p>《管理自己》阅读笔记https://sbabybird.github.io/p/%E7%AE%A1%E7%90%86%E8%87%AA%E5%B7%B1%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/Thu, 15 Apr 2021 00:00:00 +0000https://sbabybird.github.io/p/%E7%AE%A1%E7%90%86%E8%87%AA%E5%B7%B1%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/<h2 id="文章介绍">文章介绍</h2> +<p>《管理自己(Management Yourself)》作者——彼得·德鲁克。该文是《哈佛商业评论》创刊以来重印次数最多的文章之一,节选自其著作《21世纪的管理挑战》。</p> +<p>我第一次读到这篇文章,是2013年在<a class="link" href="http://www.zreading.cn/archives/3650.html" target="_blank" rel="noopener" +>左岸读书</a>的博客,当时很快就放入收藏夹,今日再次翻阅,仍觉受益匪浅。</p> +<p>摘抄部分在此记录,并附上自己的一些理解。</p> +<h2 id="笔记">笔记</h2> +<blockquote> +<p>知识工作者必须成为自己的首席执行官。你应该在公司中开辟自己的天地,知道何时改变发展道路,并在可能长达50年的职业生涯中不断努力、干出实绩。要做好这些事情,你首先要对自己有深刻的认识——不仅清楚自己的优点和缺点,也知道自己是怎样学习新知识和与别人共事的,并且还明白自己的价值观是什么、自己又能在哪些方面做出最大贡献。因为只有当所有工作都从自己的长处着眼,你才能真正做到卓尔不群。</p> +</blockquote> +<p>未来社会,体力劳动将逐渐被智能化机械所取代,人人都是知识工作者即将成为事实。每个人都需要把自己当作一个公司来看待,自己就是CEO,包揽人生的“市场”、“营销”、“生产”、“运营”等各项工作,只有从更高的视角来规划自己,才能掌握主动权,避免落入被动接受的局面。</p> +<p>与运营企业一样,经营自己的第一步还是要先了解自己,深刻认识自己的优势与不足,这样无论是制定计划还是付诸行动,才能做到目标明确、行之有效。</p> +<blockquote> +<p>多数人都以为他们知道自己擅长什么。其实不然,更多的情况是,人们只知道自己不擅长什么——即便是在这一点上,人们也往往认识不清。然而,一个人要有所作为,只能靠发挥自己的长处,而如果从事自己不太擅长的工作是无法取得成就的,更不用说那些自己根本干不了的事情了。</p> +</blockquote> +<p>这个观点跟我的直觉是相反的,在读到这段文字之前我以为自己对擅长什么了如指掌,但认真思索之后,才发现事情并没有那么简单,有些自以为是的优点根本不值得推敲,如沟通表达、对技术了解广泛、技术趋势敏感等等。至于真正做什么样的事情非常的得心应手,还真得通过认真分析才行。</p> +<blockquote> +<p>要发现自己的长处,唯一途径就是回馈分析法(feedback analysis)。每当做出重要决定或采取重要行动时,你都可以事先记录下自己对结果的预期。9到 12个月后,再将实际结果与自己的预期比较。我们只要持之以恒地运用这个简单的方法,就能在较短的时间内(可能两三年),发现自己的长处——这是你需要知道的最重要的事情。在采用这种方法之后,你就能知道,自己正在做(或没有做)的哪些事情会让你的长处无法发挥出来。同时,你也将看到自己在哪些方面能力不是特别强。最后,你还将了解到自己在哪些方面完全不擅长,做不出成绩来。</p> +</blockquote> +<p>作者给出了一个据说十分有效的方法,虽然执行起来略显繁琐且时间较长,但应该还值得一试。我个人有记录工作日志的习惯,但停留在时间消耗的记录和分析层面,并未对任务执行的结果进行预期和分析。</p> +<blockquote> +<p>首先最重要的是,专注于你的长处,把自己放到那些能发挥长处的地方。其次,加强你的长处。第三,发现任何由于恃才傲物而造成的偏见和无知,并且加以克服。</p> +</blockquote> +<p>想起了之前读到的另一本书<a class="link" href="https://book.douban.com/subject/1100470/" target="_blank" rel="noopener" +>《现在发现你的优势》</a>,虽然木桶原理说要补充自己的短板,但这里的观点则强调要充分把自己的优势利用起来,并且进行加强,这样才能更好的发挥自己。当然,努力学习新技能、新知识,发现自己的偏见和不良习惯然后克服它们也很重要。</p> +<blockquote> +<p>把预期和实际结果进行比较,也会发现自己不能做什么。我们每个人都有许多一窍不通、毫无天分的领域,在这些领域我们甚至连平庸的水平都达不到。人们,尤其是知识工作者,就不应该试图去完成这些领域的工作和任务。他们应该尽量少把精力浪费在那些不能胜任的领域上,因为从无能到平庸要比从一流到卓越需要人们付出多得多的努力。</p> +</blockquote> +<p>深有体会,不应该将时间和经历消耗在自己即使努力也达不到平庸水平的事情上,然而现实中却有很多人在被动的做着这样的事情,甚至还抱有不切实际的幻想,人生苦短,早日醒悟早日改变。</p> +<blockquote> +<p>我属于读者型,还是听者型?首先,你要搞清楚的是,你是读者型(习惯阅读信息)还是听者型(习惯听取信息)的人。绝大多数人甚至都不知道还有读者型和听者型之说,而且很少有人既是读者型又是听者型。知道自己属于哪种类型的人更少。</p> +</blockquote> +<p>这一段不知是翻译的问题还是作者没说明白,文中并未定义“读者型”、“听者型”这两种类型的工作方式具体是如何工作的,只是通过例子强调了自己工作方式的不同所带来的巨大差异。我的猜测是,“读者型”应该指的是在工作中理性和逻辑思维占上风的人,通常通过阅读逻辑缜密的文字来规划和开展工作,而“听者型”则属于感性思维偏多,通过视觉、听觉来判断事物的发展。</p> +<blockquote> +<p>如果一个组织的价值体系不为自己所接受或者与自己的价值观不相容,人们就会备感沮丧,工作效力低下。</p> +</blockquote> +<p>不要试图改变自己的价值观,这只会让你倍感痛苦,你可以更换环境或者改变组织价值体系。</p> +<blockquote> +<p>成功的事业不是预先规划的,而是在人们知道了自己的长处、工作方式和价值观后,准备把握机遇时水到渠成的。知道自己属于何处,可使一个勤奋、有能力但原本表现平平的普通人,变成出类拔萃的工作者。</p> +</blockquote> +<p>机会留给有准备的人,但前提是这个人认识到自己的长处、工作方式、价值观,所谓的把握机会,是了解了这些之后才能识别到机会。</p> +<blockquote> +<p>一般来说,一项计划的时间跨度如果超过了 18个月,就很难做到明确和具体。因此,在多数情况下我们应该提出的问题是:我在哪些方面能取得将在今后一年半内见效的结果?如何取得这样的结果?</p> +</blockquote> +<p>千里之行始于足下,如果决定开始行动,也不可把计划定的太远,自己给自己安排近期可行的执行目标,对效果要有清晰的预期,对如何取得效果应有详细而具体的计划。</p> +<blockquote> +<p>人与人之间相互信任,不一定意味着他们彼此喜欢对方,而是意味着彼此了解。因此,人们绝对有必要对自己的人际关系负责。这是一种义务。不管一个人是公司的一名成员,还是公司的顾问、供应商或经销商,他都需要对他的所有共事者负起这种责任。所谓共事者,是指在工作上他所依赖的同事以及依赖他的同事。</p> +</blockquote> +<p>成熟的处理人际关系,同样需要问文章开头的三个问题,了解他人或者共事者,是我们的义务和责任。</p> +<blockquote> +<p>在一个崇尚成功的社会里,拥有各种选择变得越来越重要。从历史上来看,却没有“成功”一说。绝大多数人只期望坚守“适当的位置”。唯一的流动性是向下的流动性。然而,在知识社会里,我们期望每一个人都能取得成功。这显然是不可能的。对许多人来说,能避免失败就行。可是有成功的地方,就会有失败。因此,有一个能够让人们做出贡献、发挥影响力或成为“大人物”的领域,这不仅对个人十分重要,对个人的家庭也同样重要。这意味着人们需要找到一个能够有机会成为领袖、受到尊重、取得成功的第二领域——可能是第二份职业,也可能是平行的职业或社会创业。</p> +</blockquote> +<p>在飞速发展(或者说在加速发展)的时代,人人都在焦虑,仿佛竞争、内卷根本无法避免,但如果合理的认识自己、管理自己,并且去用心经营的话,也许人人都有机会可以在擅长的领域做出闪光的事情,获得一份自己独有的成就。</p> +<blockquote> +<p>自我管理中面临的挑战看上去比较明显,甚至非常基本,其答案可能不言自明,甚至近乎幼稚。自我管理需要个人,尤其是知识工作者,做出以前从未做过的事情。实际上,自我管理需要每一个知识工作者在思想和行动上都要成为自己的首席执行官。</p> +</blockquote> +<p>最后一段很关键,“做出以前从未做过的事情”,即行动最为重要。这也是为什么我会花费一个小时的时间,从头又阅读一遍这篇文章,并摘录下来加以分析理解的主要原因。</p>2020年个人总结https://sbabybird.github.io/p/2020%E5%B9%B4%E4%B8%AA%E4%BA%BA%E6%80%BB%E7%BB%93/Wed, 10 Feb 2021 00:00:00 +0000https://sbabybird.github.io/p/2020%E5%B9%B4%E4%B8%AA%E4%BA%BA%E6%80%BB%E7%BB%93/<h2 id="保持好奇心">保持好奇心</h2> +<ul> +<li>大概是2011年左右,我把QQ签名改成了“好奇、求知、创造”,从此再也没有改变过,我所喜欢的、热爱的、欲罢不能的事情,都被这三个词涵盖了。</li> +<li>十年过去了,很高兴自己还能保持一颗探索未知、热爱学习的心。</li> +</ul> +<h2 id="读书">读书</h2> +<ul> +<li>现在听书比读书所占比重大,阅读时间缩水明显,翻开电子书的时间都有限,更别提手不释卷。</li> +<li>年初重温《三体》,即便很多情节已烂熟于心,重读仍有新发现,休闲阅读而已,只为放松大脑。</li> +<li>其余时间陆续阅读一些杂书《原则》、《随机漫步》、《菜根谭》、《曾国藩传》等若干。</li> +<li>唯一触动较大的是年末再次翻看《计算机程序的构造和解释》,此次配合网上的公开课视频进行,跟随原书作者课程讲解节奏,对于知识的理解大有帮助,视频虽然年代久远,但知识历久弥新,比起科技业广泛应用的新兴技术,书中的计算原理以及相关的思想更像是对应了武术的“内功心法”,一旦有所突破,则在上层应用产生巨大的提升,与工作学习都大有裨益,其中玄妙不可言说。</li> +</ul> +<h2 id="摄影">摄影</h2> +<ul> +<li>户外活动大为减少,往年春天乃摄影高产期,今年却苦于疫情无法外出,摄影爱好被迫搁置,2020年对摄影技术的练习几乎停滞,无心仪作品产出。</li> +<li>卡片相机已很少使用,手机拍摄已是主流,器材追求已解毒,但如有更新的街拍机问世,心头恐怕还是会痒。</li> +<li>有一事可提,今年独自吃饭次数很多,每次都拍食物照一张,累积下来一年竟拍了几百。</li> +</ul> +<h2 id="生活">生活</h2> +<ul> +<li>压力与机遇并存,最大收获是面对挫折、困难更坦然,2020不愿多提。</li> +<li>记忆力确实有下降之趋势,回忆起来竟无亮点,亦可能本身就比较平淡。</li> +<li>发现凡事都要低调不吭声的重要性,切记四处宣扬,否则就会出现“说出来就不灵”的魔咒。</li> +</ul> +<h2 id="学习">学习</h2> +<ul> +<li>对8bit老古董计算机的兴趣不减,四处搜寻相关知识,弄了一大堆模拟器,研究过程中竟对之前所学计算机组成原理有了新的认识和理解,喜出望外,本该大学之时就应掌握的技能,到现在再学也不迟,重在理解。</li> +<li>创意类软件如blender等也持续浅尝,进步缓慢,但入门已没问题,缺少作品练习,安排即可。</li> +<li>儿子已入大学,借用假期时间,我教他编程,他给我讲解高数,算是技能交换了,费曼学习法的一个很直接的应用案例。</li> +<li>越发觉得B站是个学习的好地方,该站以后的发展不可估量,但从教育来看,很可能迅速超越国内二流大学,或者未来改变大学的形态也未可知。</li> +</ul> +<h2 id="后续计划">后续计划</h2> +<ul> +<li>希望可以继续通过写字记录学习的知识,保持一定量的文字输出,如条件实在有限,配合语音录音也可。</li> +<li>在自己热爱的事情上,持续学习,关注一下作品输出(持续开新坑),早日成为心目中的“全栈工程师”、“三级工程师”(可参见吴军《硅谷来信》中的定义)。</li> +<li>限制烟酒摄入,保持每日的活动量,能走路就不坐车。</li> +</ul>线性回归和梯度下降https://sbabybird.github.io/p/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E5%92%8C%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D/Sun, 02 Jun 2019 00:00:00 +0000https://sbabybird.github.io/p/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E5%92%8C%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D/<h3 id="有监督学习的两种主要任务分类和回归">有监督学习的两种主要任务(分类和回归)</h3> +<ul> +<li>有监督机器学习任务主要分为两种,一种是分类任务,一般是通过学习算法实现对未知数据的分类甄别,比如判断是男性还是女性,预测明天会不会下雨等等,预测结果是离散的分类。另一种是回归任务,用于预测一个具体的值,比如房价、年龄等等,预测结果是连续的值;</li> +<li>解决回归任务比较常见的算法就是线性回归算法;</li> +</ul> +<h3 id="线性回归">线性回归</h3> +<ul> +<li>线性回归是最典型的用于回归任务的机器学习算法。它的基本原理是基于,任意一个为n的值,可以通过一个n-1阶的多项式进行拟合;</li> +<li>线性回归的算法的目标是根据已知标签数据,训练一个预测函数f(a, b),使得x输入带入ax+b这样的多项式可以得出需要预测的值;</li> +<li>所以目标是找到合适的a和b(从数学语言的精确描述来说,一般用别的符号代替,为了方便记录,我使用a和b);</li> +<li>为了找到合适的a和b,需要定义一个损失函数(也有称为代价函数的),J(a, b),用于判断a和b是否合适,比较简单的有“方差均值”法;</li> +<li>方差均值指的是,所有样本带入预测函数f,将预测值与实际值相减,取平方,求和再求平均数(暂时不知到markdown里如何加入公式);</li> +<li>那么带入损失函数,就是意味着,找到合适的a、b使得刚才那个方差均值小于一个阈值(接近最优);</li> +<li>线性回归本质上,是在平面坐标系里找到一个与样本匹配的直线,这样基于这个直线,即可预测未知的值;</li> +</ul> +<h3 id="梯度下降">梯度下降</h3> +<ul> +<li>如何找到合适的a和b,一个一个地去试是不可能的(无穷多的计算量);</li> +<li>比较典型的算法是“梯度下降”,又是牛顿起的头;</li> +<li>比较生动的描述是,想想一个三维空间图形,X和Y平面是有a和b的值构成,Z轴是损失函数的值,值最小的部分(在图上就最低的部分,像一个山谷)就是最优解;</li> +<li>从山顶的某个点上,环顾360度,找到适合下山的一小步,一点一点儿走向山谷最低处,有点像慢慢走楼梯,所以叫梯度下降;</li> +<li>从我的体会来看,这个方法有点像牛顿那个计算平方根的迭代法(根据一个猜测值,然后通过迭代公式寻找一个更加接近正确值的值,直到误差降低到合适范围);</li> +<li>从微积分的角度,就是找到损失函数J在最初尝试的那个点上的切线,并通过它的斜率(也就是导数值)乘以一个系数a,逐步逼近最低点(切线斜率为零)的过程;</li> +</ul>机器学习的学习准备https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%9A%84%E5%AD%A6%E4%B9%A0%E5%87%86%E5%A4%87/Sat, 18 May 2019 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%9A%84%E5%AD%A6%E4%B9%A0%E5%87%86%E5%A4%87/<h3 id="机器学习的概念">机器学习的概念</h3> +<p>机器学习是人工智能的一个分支,是近年来逐渐具备实用性的各种人工智能应用的基础。其本质是(我目前的个人理解)利用针对已知的数据集合抽取采样特征,然后利用某种数据模型(核心是某种算法:如kNN、SVM、朴素贝叶斯等)对数据进行计算处理,得到一组可以预测未知数据集特征的参数和手段,从而可以对数据进行预测判断的一种数据处理方法。</p> +<h3 id="机器学习相关的名词">机器学习相关的名词</h3> +<ul> +<li>神经网络:是机器学习的一种实现方式,从概念上来说,小于“机器学习”,但是由于其在图像识别、语音识别、语言翻译等领域的优异表现,以至于现在提到机器学习就认为是神经网络,实际则不然,机器学习的概念更大,更加基础,是实现神经网络应用的基础理论和方法;</li> +<li>深度学习:是神经网络的应用特例,同样是在应用层表现优异,可以理解为神经网络的一种实现;</li> +<li>大数据:机器学习的数据处理基础支撑,近年来机器学习在应用层面表现较好主要得益于大数据技术的发展,可以使得模型训练内容量级增加,极大的提高了模型准确度;</li> +<li>n维向量:来自线性代数,在机器学习中起到重要作用,在机器学习中一般用于各种特征数据的载体,在不同的算法过程中传递和计算。</li> +</ul> +<h3 id="机器学习相关的工具">机器学习相关的工具</h3> +<ul> +<li>编程语言:目前比较流行的是Python,因为有比较丰富易用的程序包,很多科技公司也开源了较为成熟的框架,再加上Python语言本身的简单易上手,使得Python成为这个领域最流行的语言。当然C和C++、Java还是实现各种算法的根基,Python更多是提供了一种调用接口;</li> +<li>iPython:Python语言的交互控制台,可以较为方便的测试、调试Python程序,有较强的交互功能,比语言发行版自带的强大;</li> +<li>jupyter:提供Python语言的Web交互界面,通过网页即可编写代码,并及时反馈执行结果,由于是B/S架构,所以可以使得运行时跟开发环境分开。编辑界面同时支持基于Markdown语法的文档编写,使得“文学化”编程成为一种可能,非常适合用于科研人员的汇报材料或论文;</li> +<li>TensorFlow:谷歌开源的机器学习框架,快速灵活部署机器学习应用,可以应用与大规模、工业级场景;</li> +<li>keras:基于Python编写的高级神经网络API,属于对机器学习的深度封装,如果以学习机器学习原理为目标的,不建议使用,还是先手动将若干种核心算法实现一遍比较深刻;</li> +</ul> +<h3 id="预期的学习方法">预期的学习方法</h3> +<ol> +<li>通过阅读相关的书籍,对于概念有所了解,这个过程可以是粗糙的浏览,不求详细的理解各种原理和算法;</li> +<li>尝试一些教学视频,了解实操的基本流程,对于自己读书得到的概念进行验证,修订理解,并熟悉基本工具的使用(如Python的numpy、plot等);</li> +<li>细读书籍,按照书中的事例进行实操,并尝试推导算法的基本原理,理解后,形成自己的文字;</li> +<li>定义简单的任务,贯穿数据准备、数据清洗、特征值提取、模型建立、模型应用各个阶段,一般来说可以是手写文字识别,或者给新闻文章分类等;</li> +<li>循环和迭代这个过程,一边输入信息,一边将学到的东西结合思考,形成有效的输出(文字、视频等);</li> +</ol>致儿子成人礼的一封信https://sbabybird.github.io/p/%E8%87%B4%E5%84%BF%E5%AD%90%E6%88%90%E4%BA%BA%E7%A4%BC%E7%9A%84%E4%B8%80%E5%B0%81%E4%BF%A1/Thu, 09 May 2019 00:00:00 +0000https://sbabybird.github.io/p/%E8%87%B4%E5%84%BF%E5%AD%90%E6%88%90%E4%BA%BA%E7%A4%BC%E7%9A%84%E4%B8%80%E5%B0%81%E4%BF%A1/<p>序言我儿,见信如面。在这个即时通讯如此发达的时代,我选择写一封长信,以表示对你即将成人的祝贺。</p> +<p>我陷入沉思了一会儿,考虑该给你讲些什么道理。但我很快意识到,“道理”这种东西,靠听和说没有用,只能自己去感悟。而我自己也十分讨厌被说教,所以我会克制想要给你讲一番大道理的冲动,尽量避免不对等的交流形式。</p> +<p>我想我还是跟你分享一些我对这个世界的思考和想法吧。</p> +<p>茨威格在《人类群星闪耀》中写到“一个人最幸运的事情就是在他思想最活跃、精力最充沛的时候找到了他的人生使命”。看来大家都把寻找人生使命当做比较重要事情来看待。姑且就当做我这封信的主题吧。</p> +<p>寻找人生使命本质上是通过尝试在一些方向上的努力来实现对人生价值和意义的探索,每个人或多或少、或深或浅都要做这样的尝试。</p> +<p>你们学校把“成人礼”包装成一个重要的人生节点,想必是希望给你们一些感觉,让你们意识到,从这一刻起,你们开始对自己的行为负责,要开始尝试去寻找和探索了。</p> +<p>那么该如何去探索,我有一些自己的看法。</p> +<p>首先要相信一点,那就是无论是否还在上学,学习和完善自己都是一辈子的事情,不存在一个可以停止学习的时间点。就我个人来说,无论是读大学的时候还是参加工作以后,从来没有在提升自己方面有过松懈的想法,甚至我感觉工作之后对知识的渴望更加强烈了,学到的东西也比在校园里多得多。</p> +<p>当然了,学习方式跟你目前在学校这种还是差别挺大的,强度也没有那么辛苦。而且工作之后的这种学习方式才是我最认可的方式。什么方式?</p> +<p>我们一起讨论过几次王阳明的“知行合一”,为了不扯那么远,简单来说,刚才提到的学习方式就是老王早就提出的“事儿上练”。通过不断地实践,各种经历,才是学习知识的源泉。这也是为啥我在开头就说道理只能感悟不可说教,怎么感悟?事儿上感悟!经历多了自然懂。</p> +<p>所以也不用一下子被“寻找人生使命”这种“宏大话题”给吓住了,保持学习的心态,放松大胆地去经历各种事情,就是这么个过程。</p> +<p>然后呢,就是在做事的过程中,保持一颗善良、为他人多着想的心。关于这一点,我的体会是,“助人为快乐之本”真的不是一句空话。远的不说,你看你爷爷奶奶平日里多么乐于助人,用乐善好施形容他们一点儿也不为过。他们因此收获了广泛的认可,也给这个家庭带来了积极向上的生活氛围,对你老爹我向好的方面发展也起到了关键作用。</p> +<p>再有一点,也是我个人非常推崇的,就是最好能时刻对世界保持强烈的好奇心。</p> +<p>刘慈欣在短篇科幻小说《朝闻道》中讲了一个故事。外星高等文明在监视地球人类进化的过程中,距离现在几十万年前的一个原始人抬头望了望夜晚的天空,凝视了一会儿。这看似随意的行为使得外星人的警报器响了起来,因为这意味着,人类的好奇心已经发展到了星空,同时也意味着人类文明将要开始爆发式发展了。可见好奇心的重要。</p> +<p>好奇心一方面是推动我们前进的动力,同时也使得我们平凡的生活变得不那么枯燥。</p> +<p>你能经常提出一些有时连我都无法回答的问题,这让我也颇感欣慰,有些答案注定要自己去摸索着发现,我希望你能多多提问,也多自己思考,不用去管答案是什么。</p> +<p>稀稀拉拉写了这么多,估计你也不能理解太多,我像你这个年纪时估计也理解不了。不过也没关系,只是给你讲讲我个人通过思考得到的观点而已,说不定你自己以后有不同的发现,当然如果能在你以后的发展中起到一点儿提醒作用,也就挺好了。</p> +<p>希望你这次“成人礼”活动就像人类文明那一次一次对星空的凝望那样,使你能够进入人生的一个新的高速发展阶段。</p> +<p>祝:学习进步,健康成长!</p> +<p>二零一九年五月九日 写于贵阳机场</p>《高效能人士的七个习惯》读书笔记https://sbabybird.github.io/p/%E9%AB%98%E6%95%88%E8%83%BD%E4%BA%BA%E5%A3%AB%E7%9A%84%E4%B8%83%E4%B8%AA%E4%B9%A0%E6%83%AF%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/Tue, 07 May 2019 00:00:00 +0000https://sbabybird.github.io/p/%E9%AB%98%E6%95%88%E8%83%BD%E4%BA%BA%E5%A3%AB%E7%9A%84%E4%B8%83%E4%B8%AA%E4%B9%A0%E6%83%AF%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/<ol> +<li>积极是内在的,是选择的自由,是人性中最不能剥夺的部分。</li> +<li>以终为始,是要知道自己要什么,并以原则为重心,所做的决策是主动选择的结果,而非被环境所迫使的结果。</li> +<li>人类的四个天赋分别是,自我意识,良知,想象力,独立意志。</li> +<li>第四代时间管理,以原则为中心,以周为单位,设定自己所扮演的各项角色欲达成的三个重要成果,安排出每一天的第一要务,更理想的是当作每一天的特殊约会,全力以赴。每周都回顾上周周日程完成情况以及制定新的周日程,并每日调整。</li> +<li>对人不可讲效率,对事才可如此,对人应该讲效用,即某一行为是否有效。</li> +<li>以原则为重心,以良知为导向(人比事儿更重要),针对个人独有的使命,平衡发展生活中不同角色,全盘规划日常生活。</li> +<li>要想充分授权必须要具备的默契和共识包括: +<ol> +<li>预期成果。</li> +<li>应遵守的规范。</li> +<li>可用的资源。</li> +<li>责任的归属,约定考评的标准和次数。</li> +<li>明确的奖惩制度。</li> +</ol> +</li> +<li>在双赢协议中,对以下5要素应该有明确的规定。 +<ol> +<li>预期结果,确认目标和实现,方法不计。</li> +<li>指导方针,确认实现目标的原则,方针和行为限度。</li> +<li>可用资源,包括人力,财力,技术或者组织资源。</li> +<li>任务考核,建立业绩评估标准和时间。</li> +<li>奖惩制度,根据任务考核确定奖惩。</li> +</ol> +</li> +<li>制定好目标之后,还要看你的组织体系是否与目标相符合,否则就要调整系统体系。</li> +<li>我们总是喜欢匆匆忙忙地下结论,以善意的建议快刀斩乱麻地解决问题。不愿意花时间去诊断,深入了解问题的症结。</li> +</ol>《管理十诫》读书笔记https://sbabybird.github.io/p/%E7%AE%A1%E7%90%86%E5%8D%81%E8%AF%AB%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/Tue, 30 Apr 2019 00:00:00 +0000https://sbabybird.github.io/p/%E7%AE%A1%E7%90%86%E5%8D%81%E8%AF%AB%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/<ol> +<li>首先要通过分析知道问题是什么,才能真正洞悉解决问题的办法。</li> +<li>归根结底,所有公司最后的生命线都是信任问题,顾客要相信企业生产的产品正如它所许诺的那样好,投资者要相信公司的管理层是有能力的,员工要相信公司管理者能够兑现承诺。</li> +<li>他们根本想不到人都有缺陷,包括他们自己在内也都不是完美的。</li> +<li>问题的关键不在于机器会不会想问题,而在于人会不会想问题。</li> +<li>真正让我们陷入麻烦的并非那些我们根本不懂的东西,而是我们一知半解的东西。</li> +<li>有一种心理偏见叫做肯定的陷阱,它指的是我们努力想证明自己的观点,而非找出自己观点中的错误之处。</li> +<li>深思熟虑并不是浪费时间,而是必要之举。</li> +<li>除非有人能停下来想一想,否则一再犯同样的错误是很容易的。对每个错误都有必要进行反思和总结。</li> +<li>如果你能承认自己犯了错误,承认自己并不是战无不胜,那么你反而能得到好处。</li> +<li>管理是一门艺术,而不是一种科学。如果遇到那些想要量化人类行为的专家,你就要保持警惕了。</li> +<li>行业中的每个公司都应该力争标新立异,让自己变的与众不同,而不是随大溜。</li> +<li>要憎恨组织里的官僚作风——通用电气公司杰克·韦尔奇写给股东的信中写道。如果你想一事无成的话,那就让行政流程占据主导地位好了,去崇尚官僚主义就行了。</li> +<li>不能创造生产力的工作越努力越失败,要时刻警惕并搜寻身边那些并不能创造生产力的工作。</li> +<li>每个公司其实主要就是为现有的客户提供优质服务并努力开拓新客户群。我们在花每一分钱、设立每一个部门或是接手每一个项目时,都要问自己一个基本的问题:这能帮我们带来新客户或是为客户提供更好的服务吗?</li> +<li>将注意力放在失败上是最大的悲观主义。只要稍稍抬起你的头,改变一下你的态度,那么你的世界观就会发生巨大的变化。</li> +</ol>事如春梦了无痕https://sbabybird.github.io/p/%E4%BA%8B%E5%A6%82%E6%98%A5%E6%A2%A6%E4%BA%86%E6%97%A0%E7%97%95/Thu, 19 Jul 2018 00:00:00 +0000https://sbabybird.github.io/p/%E4%BA%8B%E5%A6%82%E6%98%A5%E6%A2%A6%E4%BA%86%E6%97%A0%E7%97%95/<p>上苍保佑吃饱饭撑着的人,中午吃完饭抽烟的时候,刷了几页微博,可能跟我关注的人有关(我一般关注段子手或者文艺思想贩卖者),感觉内容作为消遣挺合适,但是越看呢,越觉得没有营养,可能是跟我刚抽完烟进入贤者时间有关,一把把微博推开的时候(合上屏幕),心里竟涌现出一句“都是吃饱了撑的”,用以评价刚刚看过的几段不痛不痒的文字。</p> +<p>发完感慨随即想到,这句话是不是可以作为一本非常扯淡的书名呢?然后开始畅想自己写一本这样的书,里面的内容天马行空,多为吃饱了没事儿干的人才会忧伤和考虑的事情,饱暖之后各种忧虑和焦躁的事情可以化作各种思考,用于填满本书,作为同病相怜者证明自己不再孤独的弹药,一旦物质状态不能满足,则书中的内容立即退化到可有可无的状态。</p> +<p>真的,我这两三年来,刷牙沉思录这种哗众取宠的段子写了不少,缺少深度的技术文章也写过几篇,以吃饱了撑着来进行衡量的话,还真的比较符合标准,如果加以艺术润色的话,真难说能不能包装成为一本具备贩卖价值的书,至少想到这个问题之后,被自己震惊了一下,进一步对人生需求的几个层次有了切身认识。</p> +<p>无论我再怎么黑自己,有一点是不会改变,我写的那些东西至少保留了我一部分的回忆,它们记载了我在某一段时期内的心智情况,无论是用词还是造句,都能从一个侧面反映我当时的状态。而我的人生正是由若干个这样的状态所组成,随着年龄的增长,我的记忆力会越来越差,如果能够多记录一些东西下来,就算是那种吃饱了撑着才能思考的问题,也将使未来的我读起来热泪盈眶。</p> +<p>不过信息世界的问题在于,资料保存的永久性很不靠谱,说不定哪天这些信息就不在了(我写在msn空间的博客一篇也没了),甚至安全性还比不了一个纸质的笔记本,但我仍然不做过多的努力和担忧,倘若保存良好,那就作为未来回忆的佐料,倘若不幸丢失了,那就随他去吧。因为在写这些东西的同时,我已经感受一次生活了,本来也是留不住的东西,事如春梦了无痕嘛。</p>SICP 课后练习题1.9https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.9/Mon, 05 Jan 2015 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.9/<h4 id="练习-19--下面两个过程各定义了一种加起两个正整数的方法他们都基于过程inc它将参数增加1和dec它将参数减少1-请用代换模型展示这两个过程在求值add-4-5时所产生的计算过程这些计算过程是递归的或者迭代的吗">练习 1.9 下面两个过程各定义了一种加起两个正整数的方法,他们都基于过程inc(它将参数增加1)和dec(它将参数减少1) 。请用代换模型展示这两个过程在求值<code>(add 4 5)</code>时所产生的计算过程。这些计算过程是递归的或者迭代的吗?</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">add</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">= </span><span class="nv">a</span> <span class="mi">0</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">b</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="p">(</span><span class="nf">dec</span> <span class="nv">a</span><span class="p">)</span> <span class="nv">b</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">add</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">= </span><span class="nv">a</span> <span class="mi">0</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">b</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="p">(</span><span class="nf">dec</span> <span class="nv">a</span><span class="p">)</span> <span class="p">(</span><span class="nf">inc</span> <span class="nv">b</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> +</span></span></code></pre></td></tr></table> +</div> +</div><p>解答:根据代换模型分别展开如下</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span><span class="lnt">15 +</span><span class="lnt">16 +</span><span class="lnt">17 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">4</span> <span class="mi">5</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="mi">3</span> <span class="mi">5</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="mi">2</span> <span class="mi">5</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="mi">1</span> <span class="mi">5</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="mi">0</span> <span class="mi">5</span><span class="p">)))))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="mi">5</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="mi">6</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="mi">7</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="mi">8</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="mi">9</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">4</span> <span class="mi">5</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">3</span> <span class="mi">6</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">2</span> <span class="mi">7</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">1</span> <span class="mi">8</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">0</span> <span class="mi">9</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="mi">9</span><span class="p">)</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>根据展开可以看出,第一个计算过程是递归的,因为明显有一个逐步扩展然后又收缩的递归计算链条。第二个计算过程是迭代的,没有扩展、收缩的过程,而是使用a和b存储了常量。</p>SICP 课后练习题1.8https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.8/Mon, 29 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.8/<h4 id="练习-18-求立方根的牛顿法基于如下事实如果y是x的立方根的一个近似值那么下式将给出一个更好的近似值">练习 1.8 求立方根的牛顿法基于如下事实,如果y是x的立方根的一个近似值,那么下式将给出一个更好的近似值:</h4> +<p>$$ \frac{x/y^2+2y}{3} $$</p> +<p>请利用这一公式实现一个类似平方根过程的求立方根的过程。</p> +<p>解答:基本思路与求解平方根的实现是一致的,区别再有得到更好值<code>improve</code>的过程有变化,只需根据公式描述进行实现即可</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span><span class="lnt">15 +</span><span class="lnt">16 +</span><span class="lnt">17 +</span><span class="lnt">18 +</span><span class="lnt">19 +</span><span class="lnt">20 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">/</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">+ </span><span class="p">(</span><span class="nb">/ </span><span class="nv">x</span> <span class="p">(</span><span class="nb">* </span><span class="nv">guess</span> <span class="nv">guess</span><span class="p">))</span> <span class="p">(</span><span class="nb">* </span><span class="nv">guess</span> <span class="mi">2</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="mi">3</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">next</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">&lt; </span><span class="p">(</span><span class="nb">/ </span><span class="p">(</span><span class="nb">abs </span><span class="p">(</span><span class="nb">- </span><span class="nv">guess</span> <span class="nv">next</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="nv">guess</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mf">0.001</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nb">abs </span><span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&lt; </span><span class="nv">x</span> <span class="mi">0</span><span class="p">)</span> <span class="p">(</span><span class="nb">- </span><span class="nv">x</span><span class="p">)</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">cbrt-iter</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">cbrt-iter</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> <span class="nv">x</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">cbrt</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">cbrt-iter</span> <span class="mf">1.0</span> <span class="nv">x</span><span class="p">))</span> +</span></span></code></pre></td></tr></table> +</div> +</div>SICP 课后练习题1.7https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.7/Sat, 27 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.7/<h4 id="练习-17-对于确定很小的数的平方根而言在计算平方根中使用的检测good-enough是很不好的还有在现实的计算机里算术运算总是以一定的有限精度进行的这也会使我们的检测不适合非常大的数的计算请解释上述论断用例子说明对很小和很大的数这种检测都可能失败实现good-enough的另一种策略是监视猜测值在从一次迭代到下一次的变化情况当改变值相对于猜测值的比率很小时就结束请设计一个采用这种终止测试方式的平方根过程对于很大和很小的数这一方式都能工作吗">练习 1.7 对于确定很小的数的平方根而言,在计算平方根中使用的检测good-enough?是很不好的。还有,在现实的计算机里,算术运算总是以一定的有限精度进行的。这也会使我们的检测不适合非常大的数的计算。请解释上述论断,用例子说明对很小和很大的数,这种检测都可能失败。实现good-enough?的另一种策略是监视猜测值在从一次迭代到下一次的变化情况,当改变值相对于猜测值的比率很小时就结束。请设计一个采用这种终止测试方式的平方根过程。对于很大和很小的数,这一方式都能工作吗?</h4> +<p>解答:good-enough?当前采用的判断方式是,对比猜测值的平方结果与X的值之间的差距,当差距小于某个阙值时(比如0.001),就停止计算。当X很小或很大时,这种检测就会失败,比如,假设我们的阙值设置为0.001,那么当X本身小于这个阙值时,就会检测失败,得出错误结果,当X很大时,也会由于精度不足而一直达不到最佳猜测值,导致死循环。</p> +<p>因此,要解决这一问题,可以按照题目中给出的思路对good-enough?过程进行修改,不再判断猜测值平方与X的差距,而是判断两次猜测值之间的比率。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span><span class="lnt">15 +</span><span class="lnt">16 +</span><span class="lnt">17 +</span><span class="lnt">18 +</span><span class="lnt">19 +</span><span class="lnt">20 +</span><span class="lnt">21 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">next</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">&lt; </span><span class="p">(</span><span class="nb">/ </span><span class="p">(</span><span class="nb">abs </span><span class="p">(</span><span class="nb">- </span><span class="nv">guess</span> <span class="nv">next</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="nv">guess</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mf">0.001</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: good-enough?</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">sqrt-iter</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">sqrt-iter</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> <span class="nv">x</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: sqrt-iter</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="nb">sqrt </span><span class="mf">0.00000000001</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 3.1622776601874535e-6</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="nb">sqrt </span><span class="mi">100000000000000000000000000000000000000000000</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 1.0000000000001497e22</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>在新的<code>good-enough?</code>中,传入的是两次猜测值,所以还要修改<code>sqrt-iter</code>过程,在调用时计算两次猜测值。</p>SICP 课后练习题1.6https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.6/Tue, 23 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.6/<p>采用牛顿法求平方根的过程如下。开始时,我们有了被开方数的值(现在需要做的就是算出它的平方根)和一个猜测值。如果猜测值已经足够好了,有关工作也就完成了。如若不然,那么就需要改进猜测值(求出猜测值与被开方数除以猜测值的平均值),并重复这个计算过程。具体编写代码如下(在MIT scheme解释器中)。</p> +<p>定义<code>sqrt-iter</code>过程,与上述描述完全对应。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">sqrt-iter</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">guess</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">sqrt-iter</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">x</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: sqrt-iter</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义改进猜测值的过程<code>improve</code>,返回猜测值与被开方数除以猜测值的平均值。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">average</span> <span class="nv">guess</span> <span class="p">(</span><span class="nb">/ </span><span class="nv">x</span> <span class="nv">guess</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: improve</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义求平均数的过程<code>average</code>。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">average</span> <span class="nv">x</span> <span class="nv">y</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">/ </span><span class="p">(</span><span class="nb">+ </span><span class="nv">x</span> <span class="nv">y</span><span class="p">)</span> <span class="mi">2</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: average</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义判断猜测值是否足够好的过程<code>good-enough?</code>。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">&lt; </span><span class="p">(</span><span class="nb">abs </span><span class="p">(</span><span class="nb">- </span><span class="p">(</span><span class="nf">square</span> <span class="nv">guess</span><span class="p">)</span> <span class="nv">x</span><span class="p">))</span> <span class="mf">0.001</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: good-enough?</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义求绝对值和平方的过程</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span><span class="lnt">8 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nb">abs </span><span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&lt; </span><span class="nv">x</span> <span class="mi">0</span><span class="p">)</span> <span class="p">(</span><span class="nb">- </span><span class="nv">x</span><span class="p">)</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: abs</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">square</span> <span class="nv">x</span><span class="p">)</span> <span class="p">(</span><span class="nb">* </span><span class="nv">x</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: square</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义最上层的过程,用于启动整个工作(使用<code>1</code>这个数字作为任何数的初始猜测值)。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nb">sqrt </span><span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">sqrt-iter</span> <span class="mf">1.0</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: sqrt</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>执行<code>sqrt</code>过程,并以<code>9</code>为参数,求得平方根为<code>3</code></p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="nb">sqrt </span><span class="mi">9</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 3.00009155413138</span> +</span></span></code></pre></td></tr></table> +</div> +</div><h4 id="练习16----alyssa-phacker看不出来为什么需要将if提供为一种特殊形式她问为什么我不能直接通过cond将它定义为一个常规过程呢alyssa的朋友eva-lu-ator断言确实可以这样做并定义了if的一个新版本">练习1.6 Alyssa P.Hacker看不出来为什么需要将if提供为一种特殊形式,她问:“为什么我不能直接通过<code>cond</code>将它定义为一个常规过程呢?”Alyssa的朋友Eva Lu Ator断言确实可以这样做,并定义了<code>if</code>的一个新版本:</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">new-if</span> <span class="nv">predicate</span> <span class="nv">then-clause</span> <span class="nv">else-clause</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">cond </span><span class="p">(</span><span class="nf">predicate</span> <span class="nv">then-clause</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">else </span><span class="nv">else-clause</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: new-if</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>Eva给Alyssa演示她的程序:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">new-if</span> <span class="p">(</span><span class="nb">= </span><span class="mi">2</span> <span class="mi">3</span><span class="p">)</span> <span class="mi">0</span> <span class="mi">5</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mi">5</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">new-if</span> <span class="p">(</span><span class="nb">= </span><span class="mi">1</span> <span class="mi">1</span><span class="p">)</span> <span class="mi">0</span> <span class="mi">5</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mi">0</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>她很高兴地用自己的<code>new-if</code>重写了求平方根的程序:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">sqrt-iter</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">new-if</span> <span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">guess</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">sqrt-iter</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">x</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: sqrt-iter</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>当Alyssa试着用这个过程去计算平方根时会发生什么事情呢?请给出解释。</p> +<p>解答:</p> +<p>这个练习引入了一个新的思考,刚开始时,我以为是牵涉到了过程的局部参数概念,因为在新编写的<code>new-if</code>过程中,看似可以完成条件判断并返回正确的值,但是在本例中使用却存在问题,即在递归调用<code>sqrt-iter</code>时,传给该过程的<code>guess</code>和<code>x</code>为<code>new-if</code>的局部参数,被返回给了<code>new-if</code>这个过程,不会向上返回到上一层<code>sqrt-iter</code>里,这样就导致了改进的猜测值永远不会被使用,使得这个计算过程永远不会结束(除非第一个猜测值恰好合适),从而导致递归调用的陷入无限循环。我在<code>MIT-scheme</code>解释器里的执行结果是,解释器自动退出并提示我递归调用深度超出最大值。</p> +<p>上述看起来是合理的,但是后来我考虑了其他情况,及本书在前面章节里提到了if<code>(if &lt;predicate&gt; &lt;consequent&gt; &lt;alternative&gt;)</code>语句是条件表达式的受限形式,在执行时,先判断<code>predicate</code>是否为真,然后根据结果只执行其后<code>consequent/alternative</code>中的一个。如果使用本例新定义的<code>new-if</code>则作为普通过程执行,传入的参数会因为解释器使用应用序求值的原因,两个表达式都会被立即求值,反应到本例中就是<code>guess</code>和<code>(sqrt-iter (improve guess x) x)</code>都会被立即求值,后面的那句是属于递归调用,这样也会导致改进的猜测值永远不会被使用,陷入无限层的递归调用中。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="nb">sqrt </span><span class="mi">9</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Aborting!: maximum recursion depth exceeded</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>思考:</p> +<p>最初的时候,我的针对此题的思考方式是变量的作用域问题(可能lisp不会有此问题),后来发现,也许不是这样,而是由于对传入参数立即求值导致的,后续的网上搜索结果也显示出大家的答案都倾向于后者。</p>SICP 课后练习题1.4https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.4/Fri, 19 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.4/<h4 id="练习14----请仔细考察上面给出的允许运算符为复合表达式的组合式的求值模型根据对这一模型的认识描述下面过程的行为">练习1.4 请仔细考察上面给出的允许运算符为复合表达式的组合式的求值模型,根据对这一模型的认识描述下面过程的行为。</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">a-plus-abs-b</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">((</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="mi">0</span><span class="p">)</span> <span class="nv">+</span> <span class="nv">-</span><span class="p">)</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">))</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>练习1.4,通过if判断,根据b的值决定对a b所使用的运算符是+还是-,如果b大于0,则组合式为(+ a b),反之则为(- a b),所以组合式结果永远返回a加上b的绝对值。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span><span class="lnt">8 +</span><span class="lnt">9 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">a-plus-abs-b</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">((</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="mi">0</span><span class="p">)</span> <span class="nv">+</span> <span class="nv">-</span><span class="p">)</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: a-plus-abs-b</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">a-plus-abs-b</span> <span class="mi">4</span> <span class="mi">2</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 6</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">a-plus-abs-b</span> <span class="mi">4</span> <span class="mi">-2</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 6</span> +</span></span></code></pre></td></tr></table> +</div> +</div>SICP 课后练习题1.5https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.5/Fri, 19 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.5/<h4 id="练习15---ben-bitdiddle发明了一种检测方法能够确定解释器究竟采用哪种序求值是采用应用序还是正则序他定义了下面两个过程">练习1.5 Ben Bitdiddle发明了一种检测方法,能够确定解释器究竟采用哪种序求值,是采用应用序,还是正则序。他定义了下面两个过程</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">p</span><span class="p">)</span> <span class="p">(</span><span class="nf">p</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">test</span> <span class="nv">x</span> <span class="nv">y</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">= </span><span class="nv">x</span> <span class="mi">0</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mi">0</span> +</span></span><span class="line"><span class="cl"> <span class="nv">y</span><span class="p">))</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>而后他求值下面的表达式:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">test</span> <span class="mi">0</span> <span class="p">(</span><span class="nf">p</span><span class="p">))</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>如果某个解释器采用的是应用序求值,Ben会看到什么样的情况?如果解释器采用正则序求值,他又会看到什么情况?请对你的回答做出解释。(无论采用正则序或者应用序,假定特殊形式if的求值规则总是一样的。其中的谓词部分先行求值,根据其结果确定随后求值的子表达式部分。)</p> +<p>练习1.5 『完全展开而后规约』的求值模型为正则序求值,『先求值参数而后应用』的方式为应用序求值,因此,在应用序求值的模式下,执行<code>(test 0 (p))</code>时会先求<code>(p)</code>这个表达式的值,而根据定义<code>(define (p) (p))</code>执行<code>(p)</code>会造成递归调用,解释器陷入死循环。而在正则序求值模式下,会先展开<code>test</code>过程,根据需要再决定是否执行<code>(p)</code>,在本例中,由于传入的<code>x</code>等于<code>0</code>,所以<code>(p)</code>不会被执行,因此不会陷入死循环。</p> +<p>所以,根据以上分析,如果解释器采用的是应用序求值,则解释器陷入死循环,如果是采用正则序求值,则解释器输出<code>;Value: 0</code>。</p>SICP 课后练习题1.1https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.1/Mon, 15 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.1/<h4 id="练习11----下面是一系列表达式对于每个表达式解释器将输出什么结果假定这一系列表达式是按照给出的顺序逐个求值的">练习1.1 下面是一系列表达式,对于每个表达式,解释器将输出什么结果?假定这一系列表达式是按照给出的顺序逐个求值的。</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span><span class="lnt">15 +</span><span class="lnt">16 +</span><span class="lnt">17 +</span><span class="lnt">18 +</span><span class="lnt">19 +</span><span class="lnt">20 +</span><span class="lnt">21 +</span><span class="lnt">22 +</span><span class="lnt">23 +</span><span class="lnt">24 +</span><span class="lnt">25 +</span><span class="lnt">26 +</span><span class="lnt">27 +</span><span class="lnt">28 +</span><span class="lnt">29 +</span><span class="lnt">30 +</span><span class="lnt">31 +</span><span class="lnt">32 +</span><span class="lnt">33 +</span><span class="lnt">34 +</span><span class="lnt">35 +</span><span class="lnt">36 +</span><span class="lnt">37 +</span><span class="lnt">38 +</span><span class="lnt">39 +</span><span class="lnt">40 +</span><span class="lnt">41 +</span><span class="lnt">42 +</span><span class="lnt">43 +</span><span class="lnt">44 +</span><span class="lnt">45 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"><span class="mi">10</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 10</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="mi">5</span> <span class="mi">3</span> <span class="mi">4</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 12</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">9</span> <span class="mi">1</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 8</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">/ </span><span class="mi">6</span> <span class="mi">2</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 3</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="p">(</span><span class="nb">* </span><span class="mi">2</span> <span class="mi">4</span><span class="p">)</span> <span class="p">(</span><span class="nb">- </span><span class="mi">4</span> <span class="mi">6</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 6</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">define </span><span class="nv">a</span> <span class="mi">3</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: a</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">define </span><span class="nv">b</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="mi">1</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: b</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="nv">b</span> <span class="p">(</span><span class="nb">* </span><span class="nv">a</span> <span class="nv">b</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 19</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">= </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: #f</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="k">and </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="nv">a</span><span class="p">)</span> <span class="p">(</span><span class="nb">&lt; </span><span class="nv">b</span> <span class="p">(</span><span class="nb">* </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"><span class="nv">b</span> +</span></span><span class="line"><span class="cl"><span class="nv">a</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 4</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">cond </span><span class="p">((</span><span class="nb">= </span><span class="nv">a</span> <span class="mi">4</span><span class="p">)</span> <span class="mi">6</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">((</span><span class="nb">= </span><span class="nv">b</span> <span class="mi">4</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="mi">6</span> <span class="mi">7</span> <span class="nv">a</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">else </span><span class="mi">25</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 16</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="mi">2</span> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="nv">a</span><span class="p">)</span> <span class="nv">b</span> <span class="nv">a</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 6</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">* </span><span class="p">(</span><span class="k">cond </span><span class="p">((</span><span class="nb">&gt; </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> <span class="nv">a</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">((</span><span class="nb">&lt; </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">else </span><span class="mi">-1</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="mi">1</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 16</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>练习1.1的内容比较简单,基本上直接就可以计算出表达式的值,所有表达式都可以在mit-scheme的交互解释器里进行验证。</p>SICP 课后练习题1.2https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.2/Mon, 15 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.2/<h4 id="练习12----请将下面表达式变换为前缀形式">练习1.2 请将下面表达式变换为前缀形式:</h4> +<p>$$ \frac{5+4+\Bigl(2-\Bigl(3-\left(6+\frac{4}{5}\right)\Bigr)\Bigr)}{3\left(6-2\right)\left(2-7\right)} $$</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"><span class="p">(</span><span class="nb">/ </span><span class="p">(</span><span class="nb">+ </span><span class="mi">5</span> +</span></span><span class="line"><span class="cl"><span class="mi">4</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">2</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">3</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="mi">6</span> <span class="p">(</span><span class="nb">/ </span><span class="mi">4</span> <span class="mi">5</span><span class="p">)))))</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">* </span><span class="mi">3</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">6</span> <span class="mi">2</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">2</span> <span class="mi">7</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: -37/150</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>练习1.2,直接将数学表达式转换为前序表达式即可,在写的时候可以遵循一下排版规则,即同一个运算符的表达式垂直对齐。</p>SICP 课后练习题1.3https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.3/Mon, 15 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.3/<h4 id="练习13----请定义一个过程它以三个数为参数返回其中较大两个数之和">练习1.3 请定义一个过程,它以三个数为参数,返回其中较大两个数之和。</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span><span class="lnt">8 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">max-three-number</span> <span class="nv">a</span> <span class="nv">b</span> <span class="nv">c</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="nv">c</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="nv">c</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">a</span> <span class="nv">c</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">b</span> <span class="nv">a</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">b</span> <span class="nv">c</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">max-three-number</span> <span class="mi">42</span> <span class="mi">7</span> <span class="mi">1</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 49</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>练习1.3,解决此练习中问题的方法比较多,本答案使用比较朴素的方法,先比较出最大的两个数字,然后将其相加,对于三个数字来说,先在前两个中选取一个大的,然后将其与后面两个中比较大的那一个相加。还有一种思路就是可以先定义出比较大小的方法,然后再调用之,或者先对数字按从小到大排序然后加最后两个,等等。</p>win8系统下使用笔记本作为wifi热点https://sbabybird.github.io/p/win8%E7%B3%BB%E7%BB%9F%E4%B8%8B%E4%BD%BF%E7%94%A8%E7%AC%94%E8%AE%B0%E6%9C%AC%E4%BD%9C%E4%B8%BAwifi%E7%83%AD%E7%82%B9/Thu, 13 Feb 2014 00:00:00 +0000https://sbabybird.github.io/p/win8%E7%B3%BB%E7%BB%9F%E4%B8%8B%E4%BD%BF%E7%94%A8%E7%AC%94%E8%AE%B0%E6%9C%AC%E4%BD%9C%E4%B8%BAwifi%E7%83%AD%E7%82%B9/<h1 id="win8系统下使用笔记本作为wifi热点">win8系统下使用笔记本作为wifi热点</h1> +<h2 id="背景">背景</h2> +<p>在没有无线路由的情况下,比如出差在宾馆,如果手里有一台可以上网的笔记本电脑,则可以给手机、平板电脑或者其他笔记本提供一个可以上网的wifi热点。</p> +<p>我平时在单位即通过此方式给我的平板电脑和手机共享网络通道,比较方便实用,近期在使用的过程中遇到一些问题,经过摸索,解决了问题,在此记录一下,方便以后查阅。</p> +<h2 id="环境需要">环境需要</h2> +<ul> +<li>一台通过有线连接上网(或者通过3G上网,就是说wifi网卡没有被占用)的笔记本电脑</li> +<li>安装有win8操作系统(win7应该也可以)</li> +<li>无线网卡芯片是intel的(否则可能不支持此技术),并使用了最新的驱动程序</li> +</ul> +<h2 id="基本步骤">基本步骤</h2> +<ul> +<li> +<p>打开具有管理员权限的控制台窗口(在win8系统下,可以通过按<code>windows+x</code>键,然后在弹出的菜单里选择『命令提示符(管理员)』)</p> +</li> +<li> +<p>输入如下命令 <code>netsh wlan set hostednetwork mode=allow ssid=&quot;mywifi&quot; key=&quot;12345678&quot;</code> <em>其中ssid后面的热点名称和key后面的密码可以根据情况自行决定</em></p> +</li> +<li> +<p>上一个命令完成后,如果没有异常的话,则输入如下命令 <code>netsh wlan start hostednetwork</code> <em>这条命令如果执行成功会显示『已启动承载网络』,在下次系统重启后需要重新执行,如果嫌麻烦则可以做一个批处理文件每次双击即可</em></p> +</li> +<li> +<p>成功启动承载网络之后,进入『网络和共享中心』点击『更改适配器设置』,此时在该页里应该可以看到一个虚拟网卡(名称一般叫MicrosoftVirtual WiFi Miniport Adapter),右键点击那个可以上网的网络连接(如果是有线连接就是那个『本地连接』,如果是3G的则根据情况而定,总之必须是那个可以上网的连接),选择『属性』,切换到『共享』页,勾选『允许其他网络用户通过此计算机的Internet连接来连接』,在下面的下拉列表里选择那个刚虚拟出来的虚拟网卡。确定即可。</p> +</li> +</ul> +<h2 id="常见问题">常见问题</h2> +<p>执行以上第二条命令启动承载网络后,有时会显示『无法启动承载网络,组或资源的状态不是执行请求操作的正确状态』,网上大部分的文章针对这个问题给出的解决办法都是更新网卡驱动,可是对于我的笔记本无效,因为我的笔记本电脑在前一段时间是好用的,后来不好用了,根据我的摸索,解决这个问题的办法是,去『设备管理器』下面的『网络适配器』里面找找,看看有没有被禁用的设备,比如『微软托管网络协议』,如果禁用了再重新启用即可正常使用此功能了。</p>使用vs2008编译mongodbhttps://sbabybird.github.io/p/%E4%BD%BF%E7%94%A8vs2008%E7%BC%96%E8%AF%91mongodb/Thu, 07 Nov 2013 00:00:00 +0000https://sbabybird.github.io/p/%E4%BD%BF%E7%94%A8vs2008%E7%BC%96%E8%AF%91mongodb/<h2 id="背景问题">背景问题</h2> +<p>mongodb在windwos下的官方编译包是使用vs2010编译的,从官网上下载的源代码在vs2008环境下不能直接编译通过,因为mongodb提供的相关配置文件是针对vs2010的,可能是因为mongodb最新的代码使用了部分C++11的特性,而vs2008没有提供对C++11支持的原因。可是我们在一个具体的项目上需要在vs2008环境下使用mongodb,只好通过手工修改部分配置和代码的办法完成编译。</p> +<h2 id="环境准备">环境准备</h2> +<p>mongodb是使用scons进行编译控制的,所以在进行以下编译之前需要安装并配置好如下环境:</p> +<h3 id="python27">python2.7</h3> +<p>官方建议是安装python2.7版本,而且要在环境变量PATH中加入python的安装路径和python/scripts的路径,以便在命令行中执行python脚本。 +<em>不过我在编译的时候使用的是python2.6版本,也没有发现问题</em></p> +<h3 id="scons">scons</h3> +<ul> +<li>直接去网上下载最新版本进行安装即可。</li> +</ul> +<h3 id="vs2008">vs2008</h3> +<ul> +<li>需要安装vc++的全部组件(主要是默认安装不带amd64的编译支持),如果只需要编译32位版本的话则可以忽略此条。</li> +<li>需要安装sp1补丁,否则会在编译时报错。</li> +</ul> +<h3 id="boost库">boost库</h3> +<ul> +<li> +<p>最好使用boost1.4.9版本,去官网上下载对应的源码包然后自己在vs2008的命令行环境下编译</p> +</li> +<li> +<p>编译boost的命令如下(只编译了所需库):</p> +<pre><code> bjam stage variant=debug --with-filesystem --with-thread --with-date_time --with-program_options --layout=versioned threading=multi toolset=msvc-10.0 --build-type=complete +</code></pre> +</li> +</ul> +<p><em>如果需要编译release版本,就把<code>variant</code>的选项改为<code>release</code>,如果需要编译64位的版本,就在以上命令中加入<code>address-model=64</code></em></p> +<h2 id="配置及代码修改">配置及代码修改</h2> +<h3 id="sconstruct文件修改">SConstruct文件修改</h3> +<p>SConstruct文件用于存放scons的关键配置信息,我们为了在vs2008下编译mongodb首先要做的就是修改mongodb源码下根目录的SConstruct文件。</p> +<ul> +<li> +<p>修改env配置,找到 evn = Environment</p> +<pre><code> env = Environment( BUILD_DIR=variantDir, +CLIENT_ARCHIVE='${CLIENT_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}', +CLIENT_DIST_BASENAME=get_option('client-dist-basename'), +CLIENT_LICENSE='#distsrc/client/LICENSE.txt', +CLIENT_SCONSTRUCT='#distsrc/client/SConstruct', +DIST_ARCHIVE_SUFFIX='.tgz', +EXTRAPATH=get_option(&quot;extrapath&quot;), +MODULE_BANNERS=[], +MODULETEST_ALIAS='moduletests', +MODULETEST_LIST='#build/moduletests.txt', +MSVS_ARCH=msarch , +PYTHON=utils.find_python(), +SERVER_ARCHIVE='${SERVER_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}', +TARGET_ARCH=msarch , +tools=[&quot;default&quot;, &quot;gch&quot;, &quot;jsheader&quot;, &quot;mergelib&quot;, &quot;unittest&quot;], +UNITTEST_ALIAS='unittests', +UNITTEST_LIST='#build/unittests.txt', +PYSYSPLATFORM=os.sys.platform, +PCRE_VERSION='8.30', +CONFIGUREDIR = '#' + scons_data_dir + '/sconf_temp', +CONFIGURELOG = '#' + scons_data_dir + '/config.log' +) +</code></pre> +</li> +</ul> +<p>在Environment里追加一条 <code>MSVC_VERSION='9.0'</code>,这是因为如果机器上有其他的编译环境,比如vs2010或vs2012,scons会自动使用他们的编译器进行编译,即使你是在vs2008的命令行环境下,我最初因为此问题困扰了很久,后来才只得强制指定编译器的版本,修改完成后如下:</p> +<pre><code>env = Environment( BUILD_DIR=variantDir, +CLIENT_ARCHIVE='${CLIENT_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}', +CLIENT_DIST_BASENAME=get_option('client-dist-basename'), +CLIENT_LICENSE='#distsrc/client/LICENSE.txt', +CLIENT_SCONSTRUCT='#distsrc/client/SConstruct', +DIST_ARCHIVE_SUFFIX='.tgz', +EXTRAPATH=get_option(&quot;extrapath&quot;), +MODULE_BANNERS=[], +MODULETEST_ALIAS='moduletests', +MODULETEST_LIST='#build/moduletests.txt', +MSVS_ARCH=msarch , +PYTHON=utils.find_python(), +SERVER_ARCHIVE='${SERVER_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}', +TARGET_ARCH=msarch , +tools=[&quot;default&quot;, &quot;gch&quot;, &quot;jsheader&quot;, &quot;mergelib&quot;, &quot;unittest&quot;], +UNITTEST_ALIAS='unittests', +UNITTEST_LIST='#build/unittests.txt', +PYSYSPLATFORM=os.sys.platform, +PCRE_VERSION='8.30', +CONFIGUREDIR = '#' + scons_data_dir + '/sconf_temp', +CONFIGURELOG = '#' + scons_data_dir + '/config.log', +MSVC_VERSION = '9.0' +) +</code></pre> +<ul> +<li> +<p>给编译器搜索路径增加你自己本地的boost库路径 +因为在编译时需要用到boost库,所以需要把你在本地的boost所在目录加入scons的环境,否则会报找不到boost头文件或链接库的错误,打开Sconstruct文件直接在最后加入如下代码</p> +<p>env.Append(CPPPATH=[&ldquo;d:/thirdlib/boost_1_49_0&rdquo;, &ldquo;d:/thirdlib/boost_1_49_0/boost/tr1&rdquo;], LIBPATH=[&ldquo;d:/thridlib/boost_1_49_0/stage/lib&rdquo;])</p> +<pre><code> *你在编译时需要将路径替换成你自己的* +</code></pre> +</li> +</ul> +<h3 id="准备stdinth">准备stdint.h</h3> +<ul> +<li>去这个地址<a class="link" href="https://msinttypes.googlecode.com/files/msinttypes-r26.zip" target="_blank" rel="noopener" +>https://msinttypes.googlecode.com/files/msinttypes-r26.zip</a>下载msinttypes,将压缩包里的stdint.h解压并复制到 <code>C:\Program Files\Microsoft Visual Studio 9.0\VC\include</code> 目录</li> +<li>修改mongodb源码目录下platform下的cstdint.h,将<code>#include&lt;cstdint&gt;</code>修改为<code>#include&lt;stdint.h&gt;</code>,将<code>#define _MONGO_STDINT_NAMESPACE std</code>这一行里的std注释掉,变成<code>#define _MONGO_STDINT_NAMESPACE /*std*/ </code></li> +<li>修改mongodb源码目录下util下的time_support.h,在文件开头加入<code>#include&lt;stdint.h&gt;</code>,否则在编译这个文件时会无法识别int64_t类型</li> +</ul> +<h3 id="修改windows_basich">修改windows_basic.h</h3> +<ul> +<li>修改mongodb源码目录下platform下的windows_basic.h,</li> +<li>在<code> #if !defined(NTDDI_WINXPSP3) || (NTDDI_VERSION &lt; NTDDI_WINXPSP3)</code> 之前加入 <code>#define NTDDI_WINXPSP3 0x05010300</code> 在<code>#if !defined(NTDDI_WS03SP2) || (NTDDI_VERSION &lt; NTDDI_WS03SP2)</code>之前加入<code>#define NTDDI_WS03SP2 0x05020200</code> 否则会报 &ldquo;32 bit mongo does not support Windows versions older than XP Service Pack 3&rdquo; 和&quot;64 bit mongo does not support Windows versions older than Windows Server 2003 SP 2&quot; 错误</li> +</ul> +<h3 id="修改listencpp和sockcpp">修改listen.cpp和sock.cpp</h3> +<ul> +<li> +<p>修改util下net下listen.cpp,在#include段之后加入如下代码</p> +<pre><code> #ifdef _WIN32 +#define EADDRINUSE WSAEADDRINUSE +#define ECONNABORTED WSAECONNABORTED +#define EBADF 9 +#define ENFILE 23 +#define EMFILE 24 +#endif +</code></pre> +</li> +<li> +<p>修改util下net下sock.cpp,在#include段之后加入如下代码</p> +<pre><code> #ifdef _WIN32 +#define EAGAIN 11 +#endif +</code></pre> +</li> +</ul> +<h2 id="开始编译">开始编译</h2> +<p>环境准备好之后,编译就比较简单了,打开vs2008命令行窗口,执行如下代码即可完成编译 +<code>scons --dd --32 mongoclient.lib</code></p> +<p>如果是编译release版本,就把&ndash;dd换成&ndash;release,如果是编译64位版本,就把&ndash;32换成&ndash;64</p>Hello World!https://sbabybird.github.io/p/hello-world/Mon, 29 Apr 2013 00:00:00 +0000https://sbabybird.github.io/p/hello-world/<h2 id="hello">Hello</h2> +<h2 id="world">World</h2>2007-11-13https://sbabybird.github.io/p/2007-11-13/Tue, 13 Nov 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-11-13/<p>有几年不用Winamp了,最近Winamp又退出了10周年纪念版版。我下载了一个,感觉听听里面的网络电台什么的还挺不错的(边上班边听欧美最流行的音乐哈)。而且新版还包含了podcast的功能,可以搜索订阅网上的播客。在家听音乐的话,我还是选择foobar。</p> +<p>&ndash; +由 sbabybird 于 11/08/2007 07:49:00 下午 在 从容地狂奔上发表</p>2007-08-28https://sbabybird.github.io/p/2007-08-28/Tue, 28 Aug 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-08-28/<p>偶然翻看书架上的旧书,发现我以前在上面随手胡乱写了一个“梦幻配置”,那时应该是2000年,根据当时的硬件发展状况,我写了一个可望而不可及的硬件配置。具体什么配置就不说了(大概就是纯平显示器、笨三的cpu),反正现在让你用你还嫌慢呢。现在六、七年过去了,心里又痒痒的,就让我再写一个可望而不可及的硬件配置吧,看看这个配置何时会过时。</p> +<p>中央处理器:Intel Core2 Quad processor Q6700(4核,为了安静,散热采用水冷系统)</p> +<p>主板:Intel D975XBX2</p> +<p>内存:海盗船 TWIN2X2048-6400 ×4(共8G)</p> +<p>外存储:SanDisk 64G闪存硬盘(用于系统存储),2TB磁盘阵列(用于文件存储)</p> +<p>显卡:丽台NVIDIA Quadro FX 5600 ×2(每块显卡可接四台屏幕)</p> +<p>主显示器:Apple 30&quot; Cinema Display(上网、影视、游戏)</p> +<p>副显示器:Apple 20&quot; Cinema Display ×6(地理、虚拟现实、平面设计等)</p> +<p>Creative Sound Blaster X-Fi Elite Pro+罗技Z5500(用于电影、游戏、非专业录音)</p> +<p>主板数字光纤输出+外置解码器+JBL监听音箱(用于欣赏音乐)</p> +<p>操作系统:自己动手定做(编译)Linux版本,桌面环境采用GONE(如果有兴趣就自己写个操作系统)</p> +<p>备注:机箱易采用高厚度、高散热静音机箱,此系统搭建完成后将用于书房,共七台显示器需要用到特殊的显示器支架。</p>2007-08-04https://sbabybird.github.io/p/2007-08-04/Sat, 04 Aug 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-08-04/<p>不知是不是因为升级还没有进行完成,最近live spaces总是不能正常操作,用firefox访问有时还会出现乱码或者页面布局乱套,速度慢的惊人,资源占用很厉害。再加上他有太多的限制,这些问题都让我感到对live space失望透顶。衷心希望Google blogger能够早日解封!</p>2007-08-03https://sbabybird.github.io/p/2007-08-03/Fri, 03 Aug 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-08-03/<p>昨天去电影院看了《憨豆先生的黄金周》,感觉还不错,憨豆先生还是那么滑稽可乐,有着独特的幽默方式,我虽然没有笑到肚皮抽筋、掐着大腿,但是90分钟的电影还是让我由衷地笑了半个小时(累计)。这里就不介绍剧情了(一般来说这种喜剧基本没剧情可言),网上到处都是介绍。整个影片从头到尾憨豆先生都拿着那只SONY新出的DV,我估计SONY投了不少钱,还有就是片子的音乐配的还可以,轻快明亮。总的来说还值得一看。 +handouhandou2</p> +<pre><code> ps:现在的电影院真是不景气啊,能容纳500号人的大厅坐了不到100人,不过挺爽的,谁让他们把票价订的那么贵,现在的票价是我小时候电影票价的100倍</code></pre>2007-07-29https://sbabybird.github.io/p/2007-07-29/Sun, 29 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-29/<p>对于我来说,理发是件很痛苦的事情,可能是有心理障碍吧。小的时候被老爸强行摁住理过一次发,我像一只小鸡那样被夹在腿上无力反抗,由于整个过程我都在不停地叫骂那个理发的,所以那家伙下手还不含糊,把推子使得嚓嚓直响,对着我的头皮和耳朵可劲儿招呼。整个过程是漫长的、痛苦的、令人发指的。最后我看着镜子里的凸了吧唧的头,还不忘使劲儿拧了一把鼻涕抹在老爸的裤腿上。此事后来成为笑谈,但爷儿俩在理发这种事情上一直都持有不同的观点,当然了,我还只能提出强烈抗议、强烈不满、强烈谴责,但采取进一步措施的权利还是保留了。一直到现在,当老爸跟我说:“快去把头发理一理!”时,我还是乖乖的狂奔去理发。</p> +<pre><code> 不过,现在我离老爸远了,他管不了啦(主要是没看见),我可以尽情地把头发留到很长,然后再一下剪到很短(一般是回老家之前)。但是我的这种习惯却造成了另一件事情,给我理发的人极度不爽。每当我拖着留了几个月的长发走进理发店,告诉理发的师傅给我可劲儿剪短时,伊总是很扭捏,假惺惺地跟我说:“哎呀!你的发质这么好,又好不容易留了这么长,剪了多可惜啊!”其实谁不知道伊是想省点儿事儿,想拿剪刀在那三下两下剪完糊弄我。于是我只好说:“嗯嗯,本来是想留长的,但是现在突然想开了,不想留了,还是麻烦您给我剪短吧!”最后等着人家极不情愿(还很费时)地给我剪完,我才满意离去。但是这招下次就不能用了,所以我总是选择不同的理发店,反正这玩意儿多得是! +今天我又理发了,从五一到现在大概有三个月了,很抱歉,又让一个理发师傅不爽了一把,不管他,这次理完了,谁知道我什么时候有心情理下回呀!</code></pre>2007-07-24https://sbabybird.github.io/p/2007-07-24/Tue, 24 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-24/<p>天气这么闷热,生活这么枯燥,何不搞点小把戏调剂一下气氛呢?要是你现在刚好在办公室里,那么恭喜你了,下面我将教你几个在下秘密收藏的整蛊手段(一般人我不告诉他)。</p> +<pre><code> 前提条件:1、你们用计算机办公;2、你们使用的是Windows操作系统;3、你要整蛊的同事没有暴力倾向;4、他刚好暂时离开一下。 +好了,准备好了就开始行动吧! +场景一:“我的密码被改了?!” +如果你的这位同事有锁定计算机的习惯,那就刚好实施一下,在他计算机的锁定状态下的密码框里提前敲入一个空格,这样一般他回来时不会发觉,等他输入完自己的密码后,会发现进不去了!(因为密码前面多输入了一个空格)。 +场景二:“用来干活儿的软件没有反应了!” +如果他没有锁定计算机的习惯,那么刚才那个办法就不凑效了,怎么办呢,找到他用来工作的软件(VC,Word、Excel等),把帮助菜单里的“关于(about)”对话框给打开,然后用鼠标把对话框拖动到一个屏幕上看不见的地方。哈哈,等着吧,他回来会发现他用来工作的软件怎么也不听话了,无论点击哪儿都没有反应。 +场景三:“鼠标不好使了” +现在大家都用光电鼠标了,而光电鼠标全靠它屁股底下的那个激光眼,没错!你又猜对了,拿个小纸团把它那个小眼睛堵住,赶紧去吧!鼠标瞎了之后就罢工了。 +以上方法屡试不爽,我都亲自实验过,不过是别人在我身上实验的(这帮败家玩意儿)。 +</code></pre> +<p>注:以上操作纯属娱乐!产生后果自负。</p>2007-07-23https://sbabybird.github.io/p/2007-07-23/Mon, 23 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-23/<p>我手里这个Nokia 6230用了3年了,买的时候多加了一块电池。前两天,其中一块电池寿终正寝了,剩下的这块也差不多了,感觉就像我的胃,一吃就饱,一会儿就又饿了。我看着手里这个灰头土脸得就像从垃圾桶里捡回的手机,不禁有了换掉它的念头。</p> +<pre><code> 到网上翻了翻信息,结果让我很失望,感觉Nokia不太长进,眼看着人家索爱扛着音乐、摄像的大旗在市场上占了一席之地,自己也跟着别人的屁股转,也在那儿搞音乐手机、摄像手机,却忘了自己的特色。没办法,别的牌子不愿意用,老N最近推出的新机不是我看不上就是我的钱包不让看(靠,就这还敢冒充Nokia的粉丝呀?)。苹果的iPhone最近倒是炒得挺火,看起来也挺不错,可是总觉的那玩意儿离咱太遥远了,还是不多看了,以免中毒。 +在查看了众多机型之后,长叹一声:“究竟什么样的手机才能让我满意呢!” +</code></pre> +<p>总结以下大概要满足以下几点: +1、屏幕要足够大、分辨率不用极高但也不能太低 +2、反应速度一定要快(目前我还没有发现一款智能手机反应速度飞快) +3、个头不能太大、重量不能太沉 +4、电话、短信功能好用 +5、电量一定要持久,待机越长越好(这点最重要,功能再强没电也是白扯) +6、非国产(这个不用多说)</p> +<pre><code> 这些要求不过分吧?像什么摄像、音乐等功能都没要求,可愣是找不到这样一款手机,反复对比后发现还是目前手上的这个更合要求一些。算了,将就用吧。结果,昨晚做梦,梦见我也设计了一款手机,以上条件除了第六条其余都满足,取名就叫“nbPhone” 把苹果的Phone的风头给压下去了,乔布斯都跟我急了。</code></pre>2007-07-21https://sbabybird.github.io/p/2007-07-21/Sat, 21 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-21/<p>一个胖子,一个相貌平平而且豁牙的胖子,一个相貌平平而且豁牙的卖手机的胖子。这样的人参加选秀节目,如果你是评委的话,你会让他通过海选吗?如果他告诉你他要表演的是歌剧的话,你会跳下评委台把它踢出演播厅吗?!我想你会的,因为当时英国的那个选秀节目的评委也是这样想的。</p> +<pre><code> Paul Potts,这个我刚刚看到的英国小伙子,就是这样参加选秀节目的。当他极不自然地站在舞台上,傻傻地告诉评委他要表演歌剧,评委们都笑了,表现得有些不耐烦。可是,当他深情地唱起今夜无人入眠,当他那与帕瓦罗蒂一样激昂的男高音在演播厅响起时,赛场沸腾了!所有的人都站了起来,评委刁在嘴里的铅笔掉了下来,掌声雷动! +这段由朋友发过来、我甚至懒得看的视频,看得我头皮发麻。在起了一身鸡皮疙瘩后,我的眼睛也不争气地湿润了(震撼,感动)。看了别人写的介绍,我了解到,这个叫Paul的小伙子有着不太顺利的人生际遇(大多数人如此吧),但是他从未怀疑过自己的理想,仍然执着地追求着歌剧表演的艺术魅力,直到他被生活所逼而不得不靠卖手机来糊口时,仍未放弃!终于,上天给了他最后一次机会,他成功了,他向世人再一次的证明了:真正牛逼的人,终究会牛逼起来! +</code></pre> +<p>试了一下,msn的空间居然还可以插入视频!</p>2007-07-20https://sbabybird.github.io/p/2007-07-20/Fri, 20 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-20/<p>我都已经好几天没有照看我的msn空间了(最近太累),今天访问一下,发现界面居然有了变化(别三日,刮目看),嗯哼,原来是微软的Live小组把咱的空间给升级了。</p> +<pre><code>首先是界面的整体风格有了改变,我审美不行,看不出是好看还是难看,感觉貌似顺眼一些。空间上方仍然悬挂着那个大大的广告条(我一直看它不爽),工具条的宽度变宽了,这样会占用更多的空间。进入空间的“自定义”功能,发现提供的模板多了一些,但一个比一个不耐看,所以我什么也没有动,继续保持现状。一直希望Live空间能够提供类似WordPress那样的模板(多漂亮啊),现在看来,要走的路还比较长(Live小组继续加油啊!)。 +不过话又说回来,空间里整那么多花里胡哨的东东也没用,看得让人眼花缭乱的也不爽,我还是喜欢简约一点的风格,最好是让人进入我的空间后,感觉就像是打开了windows的记事本(过分了吧)。本来Google提供的那个blog挺好的,可是总是不能访问,还是老老实实的在微软提供的共享空间里得瑟吧。 +最后,再鄙视一下我自己,这几天由于懒惰而没有更新空间的内容,太不像话了!</code></pre>2007-07-19https://sbabybird.github.io/p/2007-07-19/Thu, 19 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-19/<p>随着一阵悦耳的下班铃声,我提前结束了一天的工作,按照惯例,周末了,要去打球。叫上同事,抱起篮球,飞快地奔向球场。终于逃脱了闪烁的计算机屏幕,逃脱了无聊的工作计划,逃脱了漫长的会议,逃脱了郁闷的代码&hellip;&hellip;</p> +<pre><code>各位观众,各位听众,也许你们刚刚打开电梯,现在为您直播的是--火星杯篮球锦标赛!穿着运动鞋牛仔裤正在捡球的那家伙就是我,看呐,我在球场上尽情地狂奔,边打球边哼着歌曲“啊哼三分球,它在空中停留,漂亮的假动作,帅呆了我......哦shit!球丢了”。一口气打了两三个小时,直打到有人气喘吁吁,打到有人双腿抽筋,打到有人口吐白沫还不肯离去。天渐渐黑了,球框渐渐虚无缥缈起来,收拾家伙,撤! +走到站牌,有车,有座,爽!上了高速,一路畅通,爽!到了家里,贤惠的老婆已经把饭菜做好,菜做的色香俱佳,啤酒冰得温度适中。如果这个时候你问我,什么是幸福?我会自在地夹一口菜,然后再悠闲地喝上一口啤酒,眯起眼睛跟你说:“嘛儿叫幸福?介就叫幸福!”</code></pre>2007-07-12https://sbabybird.github.io/p/2007-07-12/Thu, 12 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-12/<p>加班后回家的路上,路灯十分昏暗,还没有吃晚饭,心情极度郁闷,我缓缓(没力气狂奔了)走向公车站牌,走着,走着,突然!一个黑影窜了过来,他跟我说:“兄弟,要盗版光盘不?”我没有理他,继续走,走着,走着,突然!又一个黑影窜了过来,他跟我说:“兄弟,要发票吗?”我没有理他,继续走,走着,走着,突然(靠,有完没完啊!)一大一小两个黑影窜了出来,原来是一个中年妇女领着一个七八岁的小女孩儿,夜色中看不清面目。小孩开口说话了:“叔叔,给点儿钱让我买吃的吧,我都饿了一天了&hellip;&hellip;”边说还边做有气无力状,大人也在一边附和。说得我心里一软,鼻涕快掉下来了,差点儿掏钱。但是转念一想,我TM也饿了快一天啦,也没吃饭呢,再何况,她们的行为也太让我愤怒了,因为就凭这些个破烂演技拿来唬我也太侮辱我的智商了吧!于是,我友善的冲她们说道:“小朋友,你看”我用手指了指马路,“往前走500米,那里有家派出所,你过去找警察叔叔要些吃的好不好?”小孩一时不吭声(台词没背下来),大人接着说:“你就可怜我们,给我们几块钱,买包方便面也行啊!”(我靠,我这么晚了还没吃饭,我求您别勾引我的食欲了!)我没办法,掏出手机,说:“既然你们不愿意亲自过去,那我帮你们打110吧&hellip;&hellip;”这句话还没有说完,说时迟那时快,只听得“嗖嗖”两声,两个人全都不见踪影,公车站牌下只剩下我和随风飘舞的碎纸片(好身手!)。</p>2007-07-06https://sbabybird.github.io/p/2007-07-06/Fri, 06 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-06/<p>听说google出了在线翻译的工具,而且还广受大家的好评,在美国举行的一次翻译比赛中还拿了冠军。我虽不是google的粉丝但也对google的产品挺感兴趣的,于是赶紧凑个热闹,看看伟大的google能不能给我带来惊喜。 +由于我只会中文,那就看看google的英译中的水平怎么样。废话少说,赶紧拿来一首英文歌词《you needed me》(我最喜欢的英文歌曲之一)。</p> +<p>You needed me</p> +<p>I cries a tear you wiped it dry</p> +<p>I was confused you cleared my mind</p> +<p>I sold my soul you bought it back for me</p> +<p>And help me up and give me dignity</p> +<p>Somehow you needed me</p> +<p>You gave me strength to stand alone again</p> +<p>To face the world out on my own again</p> +<p>You put me high upon a pedestal</p> +<p>So high that I could almost see eternity</p> +<p>You needed me, you needed me</p> +<p>And I can&rsquo;t believe it&rsquo;s you +I can&rsquo;t believe it&rsquo;s true</p> +<p>I needed you and you were there</p> +<p>And I&rsquo;ll never leave why should I leave</p> +<p>I&rsquo;d be a fool</p> +<p>Cause I&rsquo;ve finally found someone</p> +<p>Who really cares</p> +<p>You held my hand when it was cold</p> +<p>When I lost you took me home</p> +<p>You gave me hope when I was at the end</p> +<p>And turned my lies back into truth again</p> +<p>You even called me friend</p> +<p>You gave me strength to stand alone again</p> +<p>To face the world out on my own again</p> +<p>You put me high upon a pedestal</p> +<p>So high that I could almost see eternity</p> +<p>You needed me ,you needed me</p> +<p>Oh, yes, you need me</p> +<p>You needed me</p> +<p>先试了一下整段翻译,把歌词复制进去,出来的结果让我忍俊不禁</p> +<p>google自动翻译的文字:</p> +<p>你需要我,我喊了眼泪,你擦它干,我摸你清我心中我卖出 我的灵魂,你买回来,我和帮助我,让我有点尊严,你需要我你们给了我力量单独再次面对世界走出自己再次你就把我小时 在室内一个台阶那么高,我几乎可以看到永恒,你需要我,多欧需要我,我也不相信是你,我不能相信这是真的,我需要你和你的笔 在此,我永远不会离开,我为何要离开我就是一个傻瓜,我的事业总算发现有人真的三白族你握着我的手,当它冷时,我输了,你带我家,你给了我希望钨 母鸡,我是在年底把我的谎言放回真话的时候,你甚至骂我的朋友,你克须缴我力量单独再次面对世界走出自己再次你就把我高美 无源一个台阶那么高,我几乎可以看到永恒,你需要我,你需要我哦,多 欧需要我,你需要我</p> +<p>唉,比较失望啊,试一下google的翻译网页的功能吧,找到歌词的网页,然后让它翻译</p> +<p>你需要我 +I cried a tear我哭了眼泪 +You wiped it dry你擦它干 +I was confused我很困惑 +You cleared my mind你清除了我的心 +I sold my soul我卖我的灵魂 +You bought it back for me你买回来,我 +And held the earth召开地球 +You gave me dignity你给我尊严 +Somehow you needed me某种程度上,你需要我 +You gave me strength你们给了我力量 +To stand alone again单独再次 +To face the world面对世界 +Out on my own again出自己再次 +You put me high你把我高 +Upon a pedestal当佩服 +So high that I could almost see eternity如此高,我几乎可以看到永恒 +You needed me你需要我 +You needed me你需要我 +I can&rsquo;t believe it&rsquo;s you我不能相信这是你 +I can&rsquo;t believe it&rsquo;s you我不能相信这是你 +I needed you我需要你 +And you were there你有 +And I&rsquo;ll never leave, why should I leave?和我永远不会离开,我为何要离开? +I needed you我需要你 +can I finally found someone who really cares可我终于发现有人真正关心 +(You needed me)(你需要我) +You held my hand你牵我的手 +It was cold据冷 +And I was lost我失去了 +You took me home你带我家 +You gave me love你们给我的爱 +That I was at the end我是在结束 +I turned my life我把我的生命 +Back into truth again You even called me &lsquo;friend&rsquo;放回真话的时候,你甚至骂我&rsquo;朋友&rsquo; +You gave me strength你们给了我力量 +To stand alone again单独再次 +To face the world面对世界 +Out on my own again出自己再次 +You put me high你把我高 +Upon a pedestal当佩服 +So high that I could almost see eternity如此高,我几乎可以看到永恒 +You needed me你需要我 +You needed me你需要我 +You needed me你需要我 +You needed me你需要我 +Oh, yes, you needed me哦,你需要我 +You needed me你需要我</p> +<p>呵呵,这下看起来还像那么回事儿.感觉机器还是代替不了人啊.翻译有感情的东西总是那么生硬.</p>2007-07-04https://sbabybird.github.io/p/2007-07-04/Wed, 04 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-04/<p>统计了一下我平时上班所需要的时间,要是堵车的话大概要一个小时多一些,要是特别堵的话大概要两个小时,要是跑步的话大概得三个小时多一些(推算的,可以忽略),要是夜里打车去上班的话大概得二十多分钟(极少,也可以忽略)。所以我一天大概有三个小时是堵在路上的,这导致了我的胃口极差,身材日渐消瘦,远看像铅笔近看像挂历!每天我都要坐在车上长吁短叹:“GR的堵车啊!”</p> +<pre><code>是什么原因造成了这样的状况? 原因有很多种,我想最直接的原因可能就是因为路上出现了车祸。无论是蹭了一下车屁股还是挂了一下后视镜,双方都会停好车,把路占上,然后撅起屁股在那儿查看爱车的状况,最后再各自打电话叫人......这个时候你要是刚好在路上,你就会感觉你置身于车的海洋,一辆挨着一辆的汽车望不到头,一片喇叭声,让人透不过气来。每当我乘坐的公交车慢慢的拱过出事地点,往往还能看到出事的双方(或多方)在那儿撅着。这种情况每天都要出现,所以每天都要堵车。 +据说从8月7号到8月20号,北京的交通管制要进行奥运预演.这对我们这些挤公交车上班的来说真是莫大的好消息啊!我们又可以感受像去年中非论坛期间的那种一路畅通的超快感了!不过,快乐永远是短暂的,过了那几天,还是得老老实实的坐在车去上体验“堵车不堵心”。</code></pre>2007-07-02https://sbabybird.github.io/p/2007-07-02/Mon, 02 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-02/<p>最羡慕那些有米的音响发烧友,手里攥着大把的钞票,买音响器材出手阔绰,有没有一双“金耳朵”不知道,反正当音响店的老板告诉他“这套音响,在听蔡琴唱歌的时候能听见她咽吐沫的声音”时,或者跟他说:“那套设备,在听交响乐的时候可以听见拉琴那小子不小心把曲谱翻掉在地上的声音”的时候,他们就会毫不犹豫的掏出几千乃至几万块大洋,把那些“宝贝”搬回家,反复的回放,听听蔡琴在什么时候换了一口气,或者听听吹长笛的坐在第几排。</p> +<pre><code>我也曾在这方面痴迷过,但仅仅是痴迷,没有什么实质性行动,原因很简单,掏不起那些闲钱呐!不过,在很早以前,读初中的时候就开始摆弄那些“音响器材”了,只是一堆喇叭,功率很小,大部分是从旧收录机上拆下来的,“音源”也就只有卡带,我曾试着把喇叭放到各种地方以调整他们的“音效”,比如放在蚊帐上除了可以在睡眠时有音乐环绕外还兼具“驱蚊”的效果,我为了得到更多的低音也曾把喇叭嵌入到书桌里(整个桌子就是音箱哈),甚至把喇叭放到洗衣机里,那音质真是惨不忍听。反正受当时的条件限制,我也只能是像小孩摆弄玩具似的,玩一玩儿而已,毕竟当时升学才是最大的目标。 +直到有一天,我翻看一本旧音响杂志,有人自制了个音箱,据说效果还不错,于是就动了自己也做一个的念头。再后来,到了上中师的时候,有了大把的空闲时间(但还是没空闲的钱),决定纯手工制作一只“有源音箱”!说干就干,开始行动!首先考虑的是功放电路采用什么形式,当时最佳的方案是使用“LM-1875”功放芯片,但由于囊中羞涩,最终放弃,后来买来一块晶体管放大板,也算将就了,喇叭买了两只,一个高音,一个中低音(8寸),向我大舅要来了分频器。让老家木匠邻居帮忙做了个音箱的框架,剩下的就是我和我的一个哥儿们亲自动手了。箱体的材料比较奢侈,把我家的一个桌子给锯了(靠!太过分了)。后来组装的时候才发现,我竟然忘了考虑功放的前级,没办法,再次求救与大舅,从旧收录机上拆下来一块板子作为前级(居然还可以调高低音调)。 +就这样,前前后后忙活了有半个星期,我的音箱终于发出处女声了,这个时候音源已经是一台VCD,那个时候我好像对蔡琴不感兴趣,于是先听了一首陈慧娴的《归来吧》,真是天籁啊!我当时感动的鼻涕都快掉下来了!当然了,我这么说是有一些夸张,其实音质不咋地,只是当时又没听过真正的音响,这只亲手做的音箱,让我体验到了充足的低音(说到低音,要感谢我的姥爷,他给了我一只大号的电源,具体功率不知道,反正很大很大),震耳欲聋的低音,就像是有人拿着锤子在敲打我的胸膛。 +这只音箱在当时带给了我无限的快乐和满足感,后来就去省会读大学了,买了电脑,买了几百块的音箱,那只音箱就被我扔到了角落,上面布满了灰尘。再后来,我干脆把它送给了我的大舅,听说他现在拿它当板凳,还挺结实的!</code></pre>2007-07-01https://sbabybird.github.io/p/2007-07-01/Sun, 01 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-01/<p>国外新兴一个叫Twitter的Web2.0站点,听说最近很火爆,很多人在那里叽叽咕咕,说一些有想法但又不至于发一篇bolg的“废话”。我去看了一眼,感觉跟那帮人文化差异挺大的也就没好意思去注册,但是国内的同志们也不示弱,一时间模仿该网站理念的站点如雨后春笋般涌现。在这些国内的叽咕站点里,有朋友就给我推荐这个“饭否”,说是一个迷你Blog,像Twitter一样,只是大家都是中国人,叽咕的内容比较容易懂一些。我这个人最爱尝鲜,就忍不住过去注册了一个帐号。</p> +<pre><code>感觉还不错,可以绑定MSN,QQ等IM软件,方便通过IM软件在上面发言,甚至可以绑定手机,让你随时随地的把感受发到网上。人气还是挺旺的,不断有人在上面喃喃自语,也不乏有一搭没一搭的聊天者。发布的内容可以很无聊,比如“今天的天气真好”,也可以很有深度,比如“你们好啊,地球人!” +呵呵,由于没用多久,所以还不能多加评论,我怀我有自闭的倾向,现在有了“饭否”,偶尔在里面发一下实时的感受,发泄一下心情而已,就当我是面对着墙壁在一个人喃喃自语吧。</code></pre>2007-06-30https://sbabybird.github.io/p/2007-06-30/Sat, 30 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-30/<p>早晨起来,像往常的周六一样,来到公司加班。打开电脑,然后习惯性的访问我的msn空间,“该页无法显示&hellip;.”,不会吧,难道是网络断开了?没有啊,空间主页还是可以访问的,怎么一切换到我的空间就“该页无法显示”了呢?强制刷新浏览器还是不行,随便点了一个朋友的空间,可以访问。完了!莫非我的msn space被封掉了?</p> +<pre><code>上网搜索一下,看看有没有出现同样问题的朋友,结果显示msn space无法访问是常有的事儿,很多人都有过类似经历(国内用户),这其中的原因不言自明啊!我开始回忆,在我的日志里面到底有没有不该出现的敏感词汇?想了半天,答案是没有。可是要说是msn sapce的故障吧,别人的空间又是可以访问的,无奈只好跟微软的客服发了封电子邮件,暂时还未收到回复。 +我刚开始写网络日志,不为影响别人的看法,只为记录一下暂时的心情,本以为放到网上比放在本地还安全(相信微软的技术水平),结果还给我来这一手,想记录的时候却无法访问了,弄的心里还挺难受,担心以前的日志会不会丢掉啊! +</code></pre> +<p>ps:就在刚才,它又突然可以访问了!</p>2007-06-29https://sbabybird.github.io/p/2007-06-29/Fri, 29 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-29/<p>今天又一次雨中漫步,原因很简单,受天气预报的干扰我又没带伞(干嘛要说又呢?)。拿起背包从容地奔向车站,嘴里也不忘哼着:“我能想到最郁闷的事~~,就是下雨却没有带伞~~”。淋雨就淋雨吧,挤上车,去思考一个很严重的问题,我的晚饭吃什么?别笑!这确实是一个很严重的问题。我不能像老婆在身边时那样说:“随便吧,做啥吃啥”(虽然心里想着最好炒两个菜,再冰上一瓶啤酒)。自己动手去做的话,倒不是嫌麻烦,只是吃我做的晚饭简直是虐待自己(大饼卷着馒头沾着米饭吃)。</p> +<pre><code>吃晚餐在我眼中确实是非常重要的事儿,平时上班的时候,早饭总是很虚无缥缈,不堵车的时候就慢慢坐在包子铺里吃包子,堵车时就没准儿了,也许是一个鸡蛋饼,也许是一个肉夹馍,也许,也许只有一杯开水。午饭就是普通的工作餐,千篇一律,除了米饭还是米饭。所以说,一日三餐也就晚饭是顿饭,我把吃晚饭看作是一件很神圣的事情,虽然不必在每次吃晚饭前都焚香沐浴,但我也在吃饭前做个深呼吸,抛开一天的烦恼,菩萨保佑、阿弥陀佛、无量天尊、阿门!感谢上天又让我吃了一顿晚饭!然后就对生活重新燃起热情,对工作又重新充满信心,活着不就是为了这顿晚饭嘛! +可是,现在,我看了看车窗外,雨停了,道路渐渐不再拥堵,我的胃却越来越堵,没有胃口,吃还是不吃,这是个问题。下了车,路边的麻辣烫小摊熏得我的胃一阵抽搐,不远处的油炸臭豆腐老板正在卖力的吆喝,卖盗版书的小贩倒是省事儿,在大喇叭里循环播放“六块一本儿,随便挑随便拣......”,喊得我头晕眼花,我真想冲过拿起他的喇叭然后在空中抛一个完美的弧线。 +还是那个晚饭情节,不想在外面饭馆里吃,尤其是一个人在饭馆里吃。 +拿起馒头,就着音乐和啤酒...... +</code></pre> +<p>pijiu</p> +<p>我怎么会舍得你走, +这一去竟是几个秋冬 +请你好好珍重 +无须挂念我太多 +我的爱和从前一样 +这承诺当是万般重要 +尽管容颜会老 +这一生无以为靠 +我还是会爱你到老 +我不会让你苦恼 +也许我始终无法释怀 +我会假装一切都好</p>2007-06-28https://sbabybird.github.io/p/2007-06-28/Thu, 28 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-28/<p>偶然在diglog里发现了鲜果在线这个网站,名字很好听,于是乎,我就点击进去看了看。看了之后真有一种相见恨晚的感觉,这个站点本身不提供什么信息,只是提供一个在线的RSS阅读器,而且它提供的RSS频道都是根据大家的兴趣和订阅量进行排序的,也就是说,看某个频道的人越多,该频道就越靠前。这样就可以看到大家都喜欢看的东西,那些垃圾信息不会浮上来了(感谢Web2.0啊!)。</p> +<pre><code>在线阅读的操作也十分简单容易上手,而且界面清爽,有比较强大的自定义功能(我靠,怎么这么像托儿啊),我订阅了一些精品的频道,比如Engadget、Solidot、cnBeta等,顺便订阅了王小峰的“不许联想”(这个博客比较能扯淡,这算是夸他了)。这下就不用Firefox的rss阅读器了,直接把订阅的频道放在鲜果在线里存储到网上,在家和在公司都能看到同样的新鲜信息了,重装系统也不怕,把东西都放到网上,我想这也是以后互联网发展的趋势吧...... +</code></pre> +<p>ps:其实我早就把收藏的网址也放到网上了,在Firefox里安装一个扩展&ndash;yoono,这个插件也很牛,有点儿像美味书签(del.icio.us),不过yoono最近增加了收藏整个网页的功能所以比较起来就更喜欢yoono。</p> +<p>分享:</p>2007-06-27https://sbabybird.github.io/p/2007-06-27/Wed, 27 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-27/<p>雨后的空气格外清新,天气还没有完全放晴,乡间的柏油路上还是湿的,远处缓缓驶来一辆摩托车,骑车的人叼着烟,看起来懒洋洋的,十分惬意,没错,那就是我。</p> +<pre><code>我这几天回老家了,因为要回去处理一些工作上的事情,这个机会十分难得,暂时逃开北京繁忙的工作,溜回老家,无拘无束,自由自在。 +目光所及,尽是农田。空气中还飘散着青草混合大粪的味道,也算是沁人心脾吧。 +</code></pre> +<p>别再徘徊沉寂的心灵 +别再留恋破碎的回忆 +大地迎春雷 +抛弃你满腹的忧虑 +缤纷的彩虹等着你 +别再犹豫等待的心湖 +别再沉迷过去的旧梦 +暖暖的春风 +走向那灿烂的天涯路 +耀眼的阳光迎着你</p>2007-06-19https://sbabybird.github.io/p/2007-06-19/Tue, 19 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-19/<p>电视上充斥着广告,其中不乏精品,看完之后让人心情舒畅然后心甘情愿的掏腰包去买他们的产品。但是大多数广告都庸俗不堪,让人看得心慌气短、胃部抽搐、浑身起鸡皮疙瘩。这其中不必说“收礼只收搓澡巾”,也不必说“洗洗更健康”,单就是那位一口气上五楼的大爷就能让人抓狂了。时间长了,这些广告我吐啊吐啊的也就习惯了,对于这类垃圾广告也有了一定的免疫能力。但是最近又有一个广告冲破了我的心理防线!那就是某饮料的变态广告“我拧你!”</p> +<pre><code>画面上,一群疯子在那里晃来晃去的踢腿,就像得了羊癫疯似的,整个广告看了让人不知道他们在表达什么另类理念,还好导演没忘记让他们每人手里拿着一瓶该品牌的饮料。我估计作者的思路来源与某天他的鞋里进了个小石子,然后他就不停的甩啊甩,一直甩不出来,直到喝了他那个饮料才甩了出来,于是就创作了这个广告。关键是你在电视上恶心恶心我也就算了,在上下班的公交车上居然也循环的播放,而且还衍生出不同的版本出来,里面就没有一个正常人,都拿个腿在那儿踢来踢去的。 +也许从某种层面上来说,这也是一个很成功的广告,我看见很多人吵着要下载那段抽风的音乐作为手机铃声,但是我绝对不会去喝一口那种饮料,我怕晚上会做噩梦,然后再一脚把被子给踢到床底下去......</code></pre>2007-06-18https://sbabybird.github.io/p/2007-06-18/Mon, 18 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-18/<p>你问:“把大象关冰箱里共分几步?”答:“分三步,把冰箱门打开,把大象放进去,把冰箱门带上”。你又问:“可是把大象关进去之后里面黑乎乎的大象不害怕吗?”反问:“你怎么知道关上之后里面还是黑乎乎的?你确定关上门之后那个灯灭了吗?”你:“~~~~~~”</p> +<p>这个问题曾经也困扰我很久,因为冰箱的门只要一打开那个灯就亮起来,可是关上门之后你又看不到里面,所以还是不能确定里面到底是什么情况。听说国外曾经有人为这事儿想不开去自杀,更有人为此急得抓耳挠腮夜里都睡不着觉,直到他把冰箱的门上凿了个洞,看清了原来关上冰箱门后那个小灯真的灭了,这才安稳的睡去(估计这哥们是一环保人士,担心那灯太费电)。</p> +<p>我没像那位牛人那样的使用暴力,但也自有办法。当然了,作为一个正常人,去探讨冰箱里的灯到底关了没有,这种做法实在是有些偏执(这不神经病吗!),你就姑且看作我是好奇心使然吧。反正,我的冰箱刚弄回来的时候我还真就动用了高科技手段&ndash;拍照手机,我那手机带了个30W像素的鸡肋摄像头这下派上用场了。</p> +<p>也是分了三步,把冰箱门打开,把手机定了时(定时10秒后拍摄)放进去,再把门带上。心中默念,时间到,开门取出,查看照片,出现了不可思议的结果!照片里那个灯竟然还亮着!再试一次,还是亮着。我那叫一个晕,觉得被冰箱厂家给忽悠了,口口声声说节能,这得多耗不少电呐。在仔细阅读了两遍说明书之后,总算恍然大悟,原来那不是普通的灯,它不仅仅担任了照明的工作(难道还用来制冷啊?),还兼具杀菌的功效,在关上门之后,它再持续照射几分钟食物,起到杀菌抑菌的效果。哦,原来如此,人家陈老师说了:“人不能无聊到这种地步!”</p>2007-06-17https://sbabybird.github.io/p/2007-06-17/Sun, 17 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-17/<p>又到了蚊子最猖獗的季节了,现在每晚都有蚊子在我耳边盘旋,嗡嗡的声音若隐若现,让我神经高度紧张,却又懒得起来招呼它们,无奈,硬着头皮睡去。第二天胳膊腿上到处都是蚊子们留下的吻痕&ndash;小红疙瘩,奇痒难忍。我发飙了,对付蚊子,我要开始行动!</p> +<p>刚开始我采用的是防守战略,听说食用葱姜蒜可以使皮肤排出的汗味具有天然的驱蚊效果,本想采用此方法,但是吃了大蒜那味儿我更受不了只得放弃。还是在洗澡的时候多放点花露水吧,“六神特效驱蚊花露水”据说效果很好,洗完澡往身上狂撒,安静的躺在床上,等待蚊子飘然而来再飘然而去。结果,效果欠佳,蚊子依然如故的为我唱着催眠曲,而且我还被花露水熏得神清气爽、失眠健忘。</p> +<p>防守看来不行,改变战略。男人!就要对别人狠一些!对付蚊子也不例外!狂奔去超市,买来“枪手”喷雾剂、“睡得香”电蚊香、电蚊拍、紫外光灭蚊灯等等,我要发起进攻了!晚饭毕,拿起“枪手”对卧室一通疯狂扫射,再将蚊香点燃,整个房间烟雾弥漫,关紧房门,外面客厅里的灭蚊灯发出幽幽的清华紫光。这下蚊子们彻底的玩完儿了,对不起了诸位,我已经够瘦弱了,您就给我留点儿血吧。</p> +<p>沐浴后,推开卧室门,兴冲冲准备打扫战场,刚推开门我就被呛得眼泪鼻涕都下来了(我刚才喷的不是催泪瓦斯吧),蚊子倒是没有了,只是这屋里也不能待了(已经感觉呼吸困难了),无奈只有掐灭蚊香,打开窗户,终于,新鲜的空气伴随着新鲜的蚊子又进来了。灭蚊灯、灭蚊拍也收效甚微。灭蚊战争暂告一段落,蚊子暂时领先。</p> +<p>先这样吧,实在不行就拿手拍吧, 要是懒得拍就猛开空调把他们冻死,再或者,如果我的反应足够灵敏的话,我就在它们叮我的那一刹那,暗运内力把它们的嘴夹在肌肉里,我憋死它们!</p>2007-06-16https://sbabybird.github.io/p/2007-06-16/Sat, 16 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-16/<p>如果有那么一天,我在沙滩上走着,突然从沙子里踢出一个神灯,我擦了三下,彭!的一声窜出一个魔鬼,对我龇牙咧嘴,非得满足我三个愿望。那么,我会许什么愿呢?我不会像周星驰那样无耻,许完了两个愿望后最后一个愿望竟是再要三个愿望。我想我也应该不那么自私,我会把头两个愿望交给公益事业,比如世界和平、环境保护啥的,然后留一个愿望给自己,那就是&ndash;我想睡个自然醒。</p> +<pre><code>自从告别了自在潇洒的大学生活,参加工作以后,我就没有睡够过,也不是完全没有时间睡觉,而是能有机会睡懒觉的时候我都睡不着。在一周里里面,工作日期间肯定没睡懒觉的可能,一大早就狂奔到车站去挤车了,晚上又很晚才睡,所以这期间是十分缺觉的。只有周末的早晨才能有机会赖在床上,可是问题来了,周末的早晨我倍儿精神!平日里闹钟响了还想把它摁掉再小睡一会儿,可一旦到了周末,我往往比闹钟醒的还早,而且再也睡不着。这是为什么呢,苦苦思索之后,得到答案:周末是属于我自己的自由时间而且很短暂,我不舍的拿这点儿宝贵时间来睡觉!平时没时间干的我只有等到周末了,平时听不了音乐就周末抱着音响使劲儿听,平时没时间弹琴就等到周末抱着电子琴使劲儿得瑟,平时没时间摄影等到周末就溜达出去一通狂拍...... 等等,有这些个好事儿等着我,我就算是想睡也真就睡不着了。 +所以,我也不祈求啥别的太奢侈的事儿,就让我睡个自然醒吧。</code></pre>2007-06-15https://sbabybird.github.io/p/2007-06-15/Fri, 15 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-15/<p>老家那边有些事儿需要老婆回去处理一下,用不了几天,可是转眼已经一个周过去了,据说还需要再呆几天才能回北京来。哎!郁闷呐!按照道理来说,作为一个正常的男人如果老婆回了娘家,那他应该感到万分的高兴才是(我曾经有个同事,从来都不吭声,结果有一次哼了一整天的小曲儿,一问才知道,人家老婆大人回娘家去了)。高兴是高兴,可是晚饭没有着落了,眼看着冰箱里的东西被我一点点地吃光了,就连平时不爱吃的饺子也在前天被我从冰箱的最底层翻了出来。家里实在没吃的那就在外面吃吧,昨晚上刚好有饭局,不吃白不吃啊,结果上当了,几个哥们儿都是贪杯的主儿,白的喝完换啤的, 啤的喝完换冰的,一直喝到丧心病狂&hellip;&hellip;饭还没吃上几口。搞得今天蔫了吧唧不说,还浑身上火, 鼻炎发作,咽炎发作,苦不堪言。</p> +<pre><code>站起来,叹了口气,转身就看到洗衣机里的衣服也快堆成小山了,都说能把袜子按颜色分类的男人和把袜子随便乱扔的男人是两种不同的生物,我显然是属于后者,看来只有等到周末统一解决了。</code></pre>2007-06-14https://sbabybird.github.io/p/2007-06-14/Thu, 14 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-14/<p>高考刚过,每年的这个时候都会有一大帮人在哪儿声泪俱下的控诉这万恶的高考制度。我也讨厌高考,但是在我的记忆里,另一种考试制度更令我恶心,那就是&mdash;-抽考!</p> +<pre><code>在我上小学的时后,比较害怕的就是考试了,但最让我感到不安的是每个班级选拔“尖子生”的过程。那个时候每到期末每个班级总是抽出学习成绩最好的几个同学参加镇上的抽考,他们的考试成绩直接代表了整个班级的学习成绩,也代表了老师的教学水平。私下里大家管抽到的这些学生叫“尖子生”。 +从小学到初中我几乎一路是“尖子生”,至于为什么要有“尖子生”,这样考试有什么意义我就不去想了,只知道如果被老师抽到当“尖子生”就全家开心,我在家也可以放肆一些,万一抽不到就没人给我好脸色。好在屡次的抽考过程中我只有两次没有被选中,不知是幸运还是不幸。 +其中一次是在小学二年级的时候,虽然没有被选中,但是也参加了考试(数学替考),当时我的情况是语文极差但数学很好(至少比那些“尖子”要好一些),老师为了他们的荣誉,便让我替另外一个考生参加了数学考试,试卷虽然是我答的却不能填写我的名字。好在当时也没什么自尊心,也就爽快的答应了,现在想一想作为老师也太不应该了。(这也是我后来虽念了师范却最终没有选择做老师的原因之一)。 +到后来就越来越抵制这种虚伪的考试,大概是四年级,我越来越贪玩,成绩真的不行了,要期末考试了,老师们纷纷挑选“尖子”,刚开始还被提名,后来经过多层过滤,勉强坚持到了最后一轮评测,直到我们伟大的辛勤的园丁说:“好了,那谁,你回去吧,其他人留下”。于是我提着书包灰溜溜回家,心里却说不出的高兴,不用去参加TMD关系到班集体荣誉的考试了!爽!哼哼,我冷笑,冷笑。现在回忆起来,脑子里仍旧充斥着老师们那因为贪图班级的名次而扭曲的面容(这就是原因之二)。 +不知道现在怎么样了,在当时,这样的考试制度,它伤了太多太多孩子的心。 +</code></pre> +<p>choukao</p> +<p>ps:</p> +<p>今日饮酒过渡</p> +<p>沉醉不知归路</p> +<p>兴尽打车走</p> +<p>误入小区深处</p> +<p>呕吐、呕吐</p> +<p>引来保安无数!</p>2007-06-13https://sbabybird.github.io/p/2007-06-13/Wed, 13 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-13/<p>早晨,NB烘烘的中国移动给我发天气预报说是阴转多云,在分析了昨晚电视上的预报加上收音机告诉我的降水概率后,我确定今天不会下雨,然后非常自信的没带伞就上班了,虽然头上的天阴的要滴水似的。</p> +<pre><code>谁知现在的天气预报已经不准确到让人发指的地步了!从下车到家的那段路程我只好雨中快步了(跑啊)。不是说现在计算机运算速度越来越快了吗?不是说建立的数据模型越来越接近真实了吗?不是说那什么风云N号也升空了吗?嗯?!忽悠谁啊!上次就报给我说最近西伯利亚那边有情况,未来几天有大风降温的天气,搞得我捂了一身痱子!现在到处是天气预报,各大网站上有,报纸上有,QQ上有,收音机、电视就更有了,而且还花样儿繁多,一会儿是穿衣指数,一会儿又洗车指数,最后还忽悠你个降水概率,有雨就有雨没雨就没雨,整个指数百分之60鬼才知道到底要不要下! +当然了,他们有预报准确的时候,那就是对局部地区的天气预报,反正局部地区天天要下雨甚至还有短时间的雷雨大风等强对流天气。我妈就曾经十分关切的问我:“为什么局部地区天天下雨,这个地区到底在哪儿?住在那儿的人可怎么活哟!” +算啦,也不跟他们计较,我还是回去翻翻小学的语文课本,好好拜读一下里面的那篇《看云识天气》,以后再也不相信这GR的天气预报了! +</code></pre> +<p>慢着,突然想起了倪萍大婶子曾经在“综艺大观”上做的即兴方言版天气预报,啧啧,那叫一个准啊!“社员同志们注意啦,哈。这个山东省荣成县寨子沟公社刘家村广播站现在开始播送天气预报,哈。这个明天头半晌儿阴有小雨儿,后半晌儿就变天了。南风转西北风7-8级。这个凄凄沥沥的小雨儿夹着嗖嗖的西北风,今儿刮,明儿刮儿,后儿还刮,一直刮到下个星期六,哈。这个咱再接着说天气预报。这个西北风一刮,这回最大的特点就是龙卷风,龙卷风啊,粮食要最重&hellip;.”</p>2007-06-12https://sbabybird.github.io/p/2007-06-12/Tue, 12 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-12/<p>初来北京的时候,家里托着亲戚的亲戚的关系让我在一家单位实习,就像鲁迅小说里写的那样,掌柜的是一副凶脸孔,主顾也没有好声气。那时我一个人住在前门外大栅栏里的一家小旅馆里。 +我住的胡同往北走几步一拐就是北京著名的“大栅栏步行街”,那儿有着浓厚的京味儿,经常看到成群的外国鬼子。他们不停的拍照,吃小吃,买工艺品,所以这里一天到晚人山人海热闹非凡。有时候我也去转转,只是转转,并不买东西,那些让老外一看见就双眼冒光的玩意儿对我并没有多大吸引力。 +小王,我住的旅店里的服务员,瘦瘦的,头戴一顶鸭舌帽,手腕上戴了一只便宜手表。 +一天下午,我一个人站在楼顶上特别无聊,正好小王上来,我递给他一根“中南海”他笑笑接住说:“一个人在外无聊吧?”我说:“是” 他说 “那我就给你讲讲这一片儿的故事吧!”,于是他就趴在栏杆上给我说了一通关于这个胡同的故事,说了这一带在清朝是曾经全是窑子。他抽了不少烟,我说“中南海这烟太冲了这边有没有柔和一点儿的烟?”他想了想说:“我抽的都是便宜烟,恩,不过便宜好抽就行&hellip;” 他给我说了两种。我到了晚上买来抽了几支觉得不好抽(那时我还不怎么抽烟)就都送给他了。以后就时常在一起谈天,混得很熟了,他经常早早的就把我的暖壶打满开水给提上来。 +只是又过了两三天,我一直也没见到小王,一问店老板才知道 :“他回老家了,他是离家出走才来到这个小店的,没钱了,才在这儿打工,不求挣钱只要有吃有睡就行,前两天他哥哥找到这里就把他带回去了。”老板很惋惜:“多好的孩子呀!”</p>2007-06-11https://sbabybird.github.io/p/2007-06-11/Mon, 11 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-11/<p>早晨的阳光真灿烂,虽然天气湿热有点儿桑拿天的苗头,但是我的心情很好,阳光洒在我的工作服上像是镶了金边,很是耀眼。对了,我是一个环卫工人,每天早晨都要在这儿清扫垃圾,这个工作是很神圣的,至少我这么认为,虽然和小时候的梦想(艺术家)差得很远,但是用某位相声演员的话说“这是一样一样一样的啊”!我愉快地拿起扫把,自在地吹着口哨,再把这条街扫完就可以收工了。我不由得加快了速度挥舞着扫把就像一个画家挥舞着手中的画笔,我气沉丹田暗用内力,短小的扫把被我使得是呼呼生风,卷起的沙尘就像一层薄雾。 +这个时候你出现了,挎着小包,下了公共汽车,高跟鞋踩在平坦的人行道上发出清脆的得得响,你的小手微微举起遮住当前还不算猛烈的太阳。真漂亮啊!我暗自赞道。上学时很不努力导致我的眼神儿非常好,我想,在工作时看到美女也算是一种福利吧!看着你向我走来,越走越近,不知是热的还是累得,我的手心开始出汗,我攥紧了扫把更卖力的扫了起来,地上的落叶伴随着纸片在沙尘中轻轻飞舞。你终于走到我的身边,冲我使劲的挥手,这么近的距离我终于看清了你的眼睛,很大、很圆,长长的睫毛。你竟然停下了脚步,盯住我迷离的眼神和唏嘘的胡茬,我期盼着你能给我说些什么,虽然黑夜给了你黑色的眼睛,但你却翻了个白眼儿给我:“你就不能轻点儿扫吗!还让不让人走路了!”。</p> \ No newline at end of file diff --git a/post/page/1/index.html b/post/page/1/index.html new file mode 100644 index 000000000..c6c7baac4 --- /dev/null +++ b/post/page/1/index.html @@ -0,0 +1 @@ +https://sbabybird.github.io/post/ \ No newline at end of file diff --git a/post/page/10/index.html b/post/page/10/index.html new file mode 100644 index 000000000..297dc5a29 --- /dev/null +++ b/post/page/10/index.html @@ -0,0 +1,37 @@ +Posts

Posts

+ \ No newline at end of file diff --git a/post/page/11/index.html b/post/page/11/index.html new file mode 100644 index 000000000..162b36515 --- /dev/null +++ b/post/page/11/index.html @@ -0,0 +1,37 @@ +Posts

Posts

+ \ No newline at end of file diff --git a/post/page/12/index.html b/post/page/12/index.html new file mode 100644 index 000000000..2b29f78e6 --- /dev/null +++ b/post/page/12/index.html @@ -0,0 +1,37 @@ +Posts

Posts

+ \ No newline at end of file diff --git a/post/page/13/index.html b/post/page/13/index.html new file mode 100644 index 000000000..e4af63247 --- /dev/null +++ b/post/page/13/index.html @@ -0,0 +1,37 @@ +Posts

Posts

+ \ No newline at end of file diff --git a/post/page/14/index.html b/post/page/14/index.html new file mode 100644 index 000000000..476693a8f --- /dev/null +++ b/post/page/14/index.html @@ -0,0 +1,37 @@ +Posts

Posts

+ \ No newline at end of file diff --git a/post/page/15/index.html b/post/page/15/index.html new file mode 100644 index 000000000..e89a4877f --- /dev/null +++ b/post/page/15/index.html @@ -0,0 +1,37 @@ +Posts

Posts

+ \ No newline at end of file diff --git a/post/page/16/index.html b/post/page/16/index.html new file mode 100644 index 000000000..ab1e267cc --- /dev/null +++ b/post/page/16/index.html @@ -0,0 +1,37 @@ +Posts

Posts

+ \ No newline at end of file diff --git a/post/page/17/index.html b/post/page/17/index.html new file mode 100644 index 000000000..e756f4147 --- /dev/null +++ b/post/page/17/index.html @@ -0,0 +1,37 @@ +Posts

Posts

+ \ No newline at end of file diff --git a/post/page/18/index.html b/post/page/18/index.html new file mode 100644 index 000000000..8c2bafcd4 --- /dev/null +++ b/post/page/18/index.html @@ -0,0 +1,37 @@ +Posts

Posts

+ \ No newline at end of file diff --git a/post/page/19/index.html b/post/page/19/index.html new file mode 100644 index 000000000..776000e85 --- /dev/null +++ b/post/page/19/index.html @@ -0,0 +1,36 @@ +Posts

Posts

+ \ No newline at end of file diff --git a/post/page/2/index.html b/post/page/2/index.html new file mode 100644 index 000000000..00f2d31e7 --- /dev/null +++ b/post/page/2/index.html @@ -0,0 +1,35 @@ +Posts

Posts

+ \ No newline at end of file diff --git a/post/page/20/index.html b/post/page/20/index.html new file mode 100644 index 000000000..a4d10745b --- /dev/null +++ b/post/page/20/index.html @@ -0,0 +1,35 @@ +Posts

Posts

+ \ No newline at end of file diff --git a/post/page/21/index.html b/post/page/21/index.html new file mode 100644 index 000000000..8e8b61acc --- /dev/null +++ b/post/page/21/index.html @@ -0,0 +1,34 @@ +Posts

Posts

+ \ No newline at end of file diff --git a/post/page/3/index.html b/post/page/3/index.html new file mode 100644 index 000000000..57f0bb9a2 --- /dev/null +++ b/post/page/3/index.html @@ -0,0 +1,36 @@ +Posts

Posts

+ \ No newline at end of file diff --git a/post/page/4/index.html b/post/page/4/index.html new file mode 100644 index 000000000..7d0c6d017 --- /dev/null +++ b/post/page/4/index.html @@ -0,0 +1,37 @@ +Posts

Posts

+ \ No newline at end of file diff --git a/post/page/5/index.html b/post/page/5/index.html new file mode 100644 index 000000000..9f18c1cc8 --- /dev/null +++ b/post/page/5/index.html @@ -0,0 +1,37 @@ +Posts

Posts

+ \ No newline at end of file diff --git a/post/page/6/index.html b/post/page/6/index.html new file mode 100644 index 000000000..8419780e8 --- /dev/null +++ b/post/page/6/index.html @@ -0,0 +1,37 @@ +Posts

Posts

+ \ No newline at end of file diff --git a/post/page/7/index.html b/post/page/7/index.html new file mode 100644 index 000000000..8f809060d --- /dev/null +++ b/post/page/7/index.html @@ -0,0 +1,37 @@ +Posts

Posts

+ \ No newline at end of file diff --git a/post/page/8/index.html b/post/page/8/index.html new file mode 100644 index 000000000..4ff7c48bb --- /dev/null +++ b/post/page/8/index.html @@ -0,0 +1,37 @@ +Posts

Posts

+ \ No newline at end of file diff --git a/post/page/9/index.html b/post/page/9/index.html new file mode 100644 index 000000000..0454dbb86 --- /dev/null +++ b/post/page/9/index.html @@ -0,0 +1,37 @@ +Posts

Posts

+ \ No newline at end of file diff --git a/scss/style.min.abbd69b2908fdfcd5179898beaafd374514a86538d81639ddd2c58c06ae54e40.css b/scss/style.min.abbd69b2908fdfcd5179898beaafd374514a86538d81639ddd2c58c06ae54e40.css new file mode 100644 index 000000000..bb25dfd5d --- /dev/null +++ b/scss/style.min.abbd69b2908fdfcd5179898beaafd374514a86538d81639ddd2c58c06ae54e40.css @@ -0,0 +1,10 @@ +/*!* Hugo Theme Stack +* +* @author: Jimmy Cai +* @website: https://jimmycai.com +* @link: https://github.com/CaiJimmy/hugo-theme-stack*/:root{--main-top-padding:35px;--body-background:#f5f5fa;--accent-color:#34495e;--accent-color-darker:#2c3e50;--accent-color-text:#fff;--body-text-color:#707070;--tag-border-radius:4px;--section-separation:40px;--scrollbar-thumb:hsl(0, 0%, 85%);--scrollbar-track:var(--body-background)}@media(min-width:1280px){:root{--main-top-padding:50px}}:root[data-scheme=dark]{--body-background:#303030;--accent-color:#ecf0f1;--accent-color-darker:#bdc3c7;--accent-color-text:#000;--body-text-color:rgba(255, 255, 255, 0.7);--scrollbar-thumb:hsl(0, 0%, 40%);--scrollbar-track:var(--body-background)}:root{--sys-font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", "Droid Sans", "Helvetica Neue";--zh-font-family:"PingFang SC", "Hiragino Sans GB", "Droid Sans Fallback", "Microsoft YaHei";--base-font-family:"Lato", var(--sys-font-family), var(--zh-font-family), sans-serif;--code-font-family:Menlo, Monaco, Consolas, "Courier New", var(--zh-font-family), monospace}:root{--card-background:#fff;--card-background-selected:#eaeaea;--card-text-color-main:#000;--card-text-color-secondary:#747474;--card-text-color-tertiary:#767676;--card-separator-color:rgba(218, 218, 218, 0.5);--card-border-radius:10px;--card-padding:20px;--small-card-padding:25px 20px}@media(min-width:768px){:root{--card-padding:25px}}@media(min-width:1280px){:root{--card-padding:30px}}@media(min-width:768px){:root{--small-card-padding:25px}}:root[data-scheme=dark]{--card-background:#424242;--card-background-selected:rgba(255, 255, 255, 0.16);--card-text-color-main:rgba(255, 255, 255, 0.9);--card-text-color-secondary:rgba(255, 255, 255, 0.7);--card-text-color-tertiary:rgba(255, 255, 255, 0.5);--card-separator-color:rgba(255, 255, 255, 0.12)}:root{--article-font-family:var(--base-font-family);--article-font-size:1.6rem;--article-line-height:1.85}@media(min-width:768px){:root{--article-font-size:1.7rem}}:root{--blockquote-border-size:4px;--blockquote-background-color:rgb(248 248 248);--heading-border-size:4px;--link-background-color:189, 195, 199;--link-background-opacity:0.5;--link-background-opacity-hover:0.7;--pre-background-color:#272822;--pre-text-color:#f8f8f2;--code-background-color:rgba(0, 0, 0, 0.12);--code-text-color:#808080;--table-border-color:#dadada;--tr-even-background-color:#efefee;--kbd-border-color:#dadada}:root[data-scheme=dark]{--code-background-color:#272822;--code-text-color:rgba(255, 255, 255, 0.9);--table-border-color:#717171;--tr-even-background-color:#545454;--blockquote-background-color:rgb(75 75 75)}:root{--shadow-l1:0px 4px 8px rgba(0, 0, 0, 0.04), 0px 0px 2px rgba(0, 0, 0, 0.06), 0px 0px 1px rgba(0, 0, 0, 0.04);--shadow-l2:0px 10px 20px rgba(0, 0, 0, 0.04), 0px 2px 6px rgba(0, 0, 0, 0.04), 0px 0px 1px rgba(0, 0, 0, 0.04);--shadow-l3:0px 10px 20px rgba(0, 0, 0, 0.04), 0px 2px 6px rgba(0, 0, 0, 0.04), 0px 0px 1px rgba(0, 0, 0, 0.04);--shadow-l4:0px 24px 32px rgba(0, 0, 0, 0.04), 0px 16px 24px rgba(0, 0, 0, 0.04), 0px 4px 8px rgba(0, 0, 0, 0.04), + 0px 0px 1px rgba(0, 0, 0, 0.04)}[data-scheme=light]{--pre-text-color:#272822;--pre-background-color:#fafafa}[data-scheme=light] .chroma{color:#272822;background-color:#fafafa}[data-scheme=light] .chroma .err{color:#960050}[data-scheme=light] .chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}[data-scheme=light] .chroma .lntable{border-spacing:0;padding:0;margin:0;border:0;width:100%;display:block}[data-scheme=light] .chroma .lntable>tbody{display:block;width:100%}[data-scheme=light] .chroma .lntable>tbody>tr{display:flex;width:100%}[data-scheme=light] .chroma .lntable>tbody>tr>td:last-child{overflow-x:auto}[data-scheme=light] .chroma .hl{display:block;width:100%;background-color:#ffc}[data-scheme=light] .chroma .lnt{margin-right:.4em;padding:0 .4em;color:#7f7f7f;display:block}[data-scheme=light] .chroma .ln{margin-right:.4em;padding:0 .4em;color:#7f7f7f}[data-scheme=light] .chroma .k{color:#00a8c8}[data-scheme=light] .chroma .kc{color:#00a8c8}[data-scheme=light] .chroma .kd{color:#00a8c8}[data-scheme=light] .chroma .kn{color:#f92672}[data-scheme=light] .chroma .kp{color:#00a8c8}[data-scheme=light] .chroma .kr{color:#00a8c8}[data-scheme=light] .chroma .kt{color:#00a8c8}[data-scheme=light] .chroma .n{color:#111}[data-scheme=light] .chroma .na{color:#75af00}[data-scheme=light] .chroma .nb{color:#111}[data-scheme=light] .chroma .bp{color:#111}[data-scheme=light] .chroma .nc{color:#75af00}[data-scheme=light] .chroma .no{color:#00a8c8}[data-scheme=light] .chroma .nd{color:#75af00}[data-scheme=light] .chroma .ni{color:#111}[data-scheme=light] .chroma .ne{color:#75af00}[data-scheme=light] .chroma .nf{color:#75af00}[data-scheme=light] .chroma .fm{color:#111}[data-scheme=light] .chroma .nl{color:#111}[data-scheme=light] .chroma .nn{color:#111}[data-scheme=light] .chroma .nx{color:#75af00}[data-scheme=light] .chroma .py{color:#111}[data-scheme=light] .chroma .nt{color:#f92672}[data-scheme=light] .chroma .nv{color:#111}[data-scheme=light] .chroma .vc{color:#111}[data-scheme=light] .chroma .vg{color:#111}[data-scheme=light] .chroma .vi{color:#111}[data-scheme=light] .chroma .vm{color:#111}[data-scheme=light] .chroma .l{color:#ae81ff}[data-scheme=light] .chroma .ld{color:#d88200}[data-scheme=light] .chroma .s{color:#d88200}[data-scheme=light] .chroma .sa{color:#d88200}[data-scheme=light] .chroma .sb{color:#d88200}[data-scheme=light] .chroma .sc{color:#d88200}[data-scheme=light] .chroma .dl{color:#d88200}[data-scheme=light] .chroma .sd{color:#d88200}[data-scheme=light] .chroma .s2{color:#d88200}[data-scheme=light] .chroma .se{color:#ae81ff}[data-scheme=light] .chroma .sh{color:#d88200}[data-scheme=light] .chroma .si{color:#d88200}[data-scheme=light] .chroma .sx{color:#d88200}[data-scheme=light] .chroma .sr{color:#d88200}[data-scheme=light] .chroma .s1{color:#d88200}[data-scheme=light] .chroma .ss{color:#d88200}[data-scheme=light] .chroma .m{color:#ae81ff}[data-scheme=light] .chroma .mb{color:#ae81ff}[data-scheme=light] .chroma .mf{color:#ae81ff}[data-scheme=light] .chroma .mh{color:#ae81ff}[data-scheme=light] .chroma .mi{color:#ae81ff}[data-scheme=light] .chroma .il{color:#ae81ff}[data-scheme=light] .chroma .mo{color:#ae81ff}[data-scheme=light] .chroma .o{color:#f92672}[data-scheme=light] .chroma .ow{color:#f92672}[data-scheme=light] .chroma .p{color:#111}[data-scheme=light] .chroma .c{color:#75715e}[data-scheme=light] .chroma .ch{color:#75715e}[data-scheme=light] .chroma .cm{color:#75715e}[data-scheme=light] .chroma .c1{color:#75715e}[data-scheme=light] .chroma .cs{color:#75715e}[data-scheme=light] .chroma .cp{color:#75715e}[data-scheme=light] .chroma .cpf{color:#75715e}[data-scheme=light] .chroma .gd{color:#f92672}[data-scheme=light] .chroma .ge{font-style:italic}[data-scheme=light] .chroma .gi{color:#75af00}[data-scheme=light] .chroma .gs{font-weight:700}[data-scheme=light] .chroma .gu{color:#75715e}[data-scheme=dark]{--pre-text-color:#f8f8f2;--pre-background-color:#272822}[data-scheme=dark] .chroma{color:#f8f8f2;background-color:#272822}[data-scheme=dark] .chroma .err{color:#bb0064}[data-scheme=dark] .chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}[data-scheme=dark] .chroma .lntable{border-spacing:0;padding:0;margin:0;border:0;width:100%;display:block}[data-scheme=dark] .chroma .lntable>tbody{display:block;width:100%}[data-scheme=dark] .chroma .lntable>tbody>tr{display:flex;width:100%}[data-scheme=dark] .chroma .lntable>tbody>tr>td:last-child{overflow-x:auto}[data-scheme=dark] .chroma .hl{display:block;width:100%;background-color:#ffc}[data-scheme=dark] .chroma .lnt{margin-right:.4em;padding:0 .4em;color:#7f7f7f;display:block}[data-scheme=dark] .chroma .ln{margin-right:.4em;padding:0 .4em;color:#7f7f7f}[data-scheme=dark] .chroma .k{color:#66d9ef}[data-scheme=dark] .chroma .kc{color:#66d9ef}[data-scheme=dark] .chroma .kd{color:#66d9ef}[data-scheme=dark] .chroma .kn{color:#f92672}[data-scheme=dark] .chroma .kp{color:#66d9ef}[data-scheme=dark] .chroma .kr{color:#66d9ef}[data-scheme=dark] .chroma .kt{color:#66d9ef}[data-scheme=dark] .chroma .n{color:#f8f8f2}[data-scheme=dark] .chroma .na{color:#a6e22e}[data-scheme=dark] .chroma .nb{color:#f8f8f2}[data-scheme=dark] .chroma .bp{color:#f8f8f2}[data-scheme=dark] .chroma .nc{color:#a6e22e}[data-scheme=dark] .chroma .no{color:#66d9ef}[data-scheme=dark] .chroma .nd{color:#a6e22e}[data-scheme=dark] .chroma .ni{color:#f8f8f2}[data-scheme=dark] .chroma .ne{color:#a6e22e}[data-scheme=dark] .chroma .nf{color:#a6e22e}[data-scheme=dark] .chroma .fm{color:#f8f8f2}[data-scheme=dark] .chroma .nl{color:#f8f8f2}[data-scheme=dark] .chroma .nn{color:#f8f8f2}[data-scheme=dark] .chroma .nx{color:#a6e22e}[data-scheme=dark] .chroma .py{color:#f8f8f2}[data-scheme=dark] .chroma .nt{color:#f92672}[data-scheme=dark] .chroma .nv{color:#f8f8f2}[data-scheme=dark] .chroma .vc{color:#f8f8f2}[data-scheme=dark] .chroma .vg{color:#f8f8f2}[data-scheme=dark] .chroma .vi{color:#f8f8f2}[data-scheme=dark] .chroma .vm{color:#f8f8f2}[data-scheme=dark] .chroma .l{color:#ae81ff}[data-scheme=dark] .chroma .ld{color:#e6db74}[data-scheme=dark] .chroma .s{color:#e6db74}[data-scheme=dark] .chroma .sa{color:#e6db74}[data-scheme=dark] .chroma .sb{color:#e6db74}[data-scheme=dark] .chroma .sc{color:#e6db74}[data-scheme=dark] .chroma .dl{color:#e6db74}[data-scheme=dark] .chroma .sd{color:#e6db74}[data-scheme=dark] .chroma .s2{color:#e6db74}[data-scheme=dark] .chroma .se{color:#ae81ff}[data-scheme=dark] .chroma .sh{color:#e6db74}[data-scheme=dark] .chroma .si{color:#e6db74}[data-scheme=dark] .chroma .sx{color:#e6db74}[data-scheme=dark] .chroma .sr{color:#e6db74}[data-scheme=dark] .chroma .s1{color:#e6db74}[data-scheme=dark] .chroma .ss{color:#e6db74}[data-scheme=dark] .chroma .m{color:#ae81ff}[data-scheme=dark] .chroma .mb{color:#ae81ff}[data-scheme=dark] .chroma .mf{color:#ae81ff}[data-scheme=dark] .chroma .mh{color:#ae81ff}[data-scheme=dark] .chroma .mi{color:#ae81ff}[data-scheme=dark] .chroma .il{color:#ae81ff}[data-scheme=dark] .chroma .mo{color:#ae81ff}[data-scheme=dark] .chroma .o{color:#f92672}[data-scheme=dark] .chroma .ow{color:#f92672}[data-scheme=dark] .chroma .p{color:#f8f8f2}[data-scheme=dark] .chroma .c{color:#75715e}[data-scheme=dark] .chroma .ch{color:#75715e}[data-scheme=dark] .chroma .cm{color:#75715e}[data-scheme=dark] .chroma .c1{color:#75715e}[data-scheme=dark] .chroma .cs{color:#75715e}[data-scheme=dark] .chroma .cp{color:#75715e}[data-scheme=dark] .chroma .cpf{color:#75715e}[data-scheme=dark] .chroma .gd{color:#f92672}[data-scheme=dark] .chroma .ge{font-style:italic}[data-scheme=dark] .chroma .gi{color:#a6e22e}[data-scheme=dark] .chroma .gs{font-weight:700}[data-scheme=dark] .chroma .gu{color:#75715e}:root{--menu-icon-separation:40px;--container-padding:15px;--widget-separation:var(--section-separation)}.container{margin-left:auto;margin-right:auto}.container .left-sidebar{order:-3;max-width:var(--left-sidebar-max-width)}.container .right-sidebar{order:-1;max-width:var(--right-sidebar-max-width)}@media(min-width:1024px){.container .right-sidebar{display:flex}}@media(min-width:768px){.container.extended{max-width:1024px;--left-sidebar-max-width:25%;--right-sidebar-max-width:30%}}@media(min-width:1024px){.container.extended{max-width:1280px;--left-sidebar-max-width:20%;--right-sidebar-max-width:30%}}@media(min-width:1280px){.container.extended{max-width:1536px;--left-sidebar-max-width:15%;--right-sidebar-max-width:25%}}@media(min-width:768px){.container.compact{--left-sidebar-max-width:25%;max-width:768px}}@media(min-width:1024px){.container.compact{max-width:1024px;--left-sidebar-max-width:20%}}@media(min-width:1280px){.container.compact{max-width:1280px}}.flex{display:flex;flex-direction:row}.flex.column{flex-direction:column}.flex.on-phone--column{flex-direction:column}@media(min-width:768px){.flex.on-phone--column{flex-direction:unset}}.flex .full-width{width:100%}main.main{order:-2;min-width:0;max-width:100%;flex-grow:1;display:flex;flex-direction:column;gap:var(--section-separation)}@media(min-width:768px){main.main{padding-top:var(--main-top-padding)}}.main-container{min-height:100vh;align-items:flex-start;padding:0 15px;gap:var(--section-separation);padding-top:var(--main-top-padding)}@media(min-width:768px){.main-container{padding:0 20px}}/*!normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css*/html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}/*!* Hamburgers +* @description Tasty CSS-animated hamburgers +* @author Jonathan Suh @jonsuh +* @site https://jonsuh.com/hamburgers +* @link https://github.com/jonsuh/hamburgers*/.hamburger{padding-top:10px;display:inline-block;cursor:pointer;transition-property:opacity,filter;transition-duration:.15s;transition-timing-function:linear;font:inherit;color:inherit;text-transform:none;background-color:transparent;border:0;margin:0;overflow:visible}.hamburger:hover{opacity:.7}.hamburger.is-active:hover{opacity:.7}.hamburger.is-active .hamburger-inner,.hamburger.is-active .hamburger-inner::before,.hamburger.is-active .hamburger-inner::after{background-color:#000}.hamburger-box{width:30px;height:24px;display:inline-block;position:relative}.hamburger-inner{display:block;top:50%;margin-top:-2px}.hamburger-inner,.hamburger-inner::before,.hamburger-inner::after{width:30px;height:2px;background-color:var(--card-text-color-main);border-radius:4px;position:absolute;transition-property:transform;transition-duration:.15s;transition-timing-function:ease}.hamburger-inner::before,.hamburger-inner::after{content:"";display:block}.hamburger-inner::before{top:-10px}.hamburger-inner::after{bottom:-10px}.hamburger--spin .hamburger-inner{transition-duration:.22s;transition-timing-function:cubic-bezier(.55,.055,.675,.19)}.hamburger--spin .hamburger-inner::before{transition:top .1s .25s ease-in,opacity .1s ease-in}.hamburger--spin .hamburger-inner::after{transition:bottom .1s .25s ease-in,transform .22s cubic-bezier(.55,.055,.675,.19)}.hamburger--spin.is-active .hamburger-inner{transform:rotate(225deg);transition-delay:.12s;transition-timing-function:cubic-bezier(.215,.61,.355,1)}.hamburger--spin.is-active .hamburger-inner::before{top:0;opacity:0;transition:top .1s ease-out,opacity .1s .12s ease-out}.hamburger--spin.is-active .hamburger-inner::after{bottom:0;transform:rotate(-90deg);transition:bottom .1s ease-out,transform .22s .12s cubic-bezier(.215,.61,.355,1)}#toggle-menu{background:0 0;border:none;position:absolute;right:0;top:0;z-index:2;cursor:pointer;outline:none}[dir=rtl] #toggle-menu{left:0;right:auto}@media(min-width:768px){#toggle-menu{display:none}}#toggle-menu.is-active .hamburger-inner,#toggle-menu.is-active .hamburger-inner::before,#toggle-menu.is-active .hamburger-inner::after{background-color:var(--accent-color)}.menu{padding-left:0;list-style:none;flex-direction:column;overflow-y:auto;flex-grow:1;font-size:1.4rem;background-color:var(--card-background);box-shadow:var(--shadow-l1);display:none;margin:0 calc(var(--container-padding) * -1);padding:30px}@media(min-width:1280px){.menu{padding:15px 0}}.menu,.menu .menu-bottom-section{gap:30px}@media(min-width:1280px){.menu,.menu .menu-bottom-section{gap:25px}}.menu.show{display:flex}@media(min-width:768px){.menu{align-items:flex-end;display:flex;background-color:transparent;padding:0;box-shadow:none;margin:0}}.menu li{position:relative;vertical-align:middle;padding:0}@media(min-width:768px){.menu li{width:100%}}.menu li svg{stroke:currentColor;stroke-width:1.33;width:20px;height:20px}.menu li a{height:100%;display:inline-flex;align-items:center;color:var(--body-text-color);gap:var(--menu-icon-separation)}.menu li span{flex:1}.menu li.current a{color:var(--accent-color);font-weight:700}.menu .menu-bottom-section{margin-top:auto;display:flex;flex-direction:column;width:100%}.social-menu{list-style:none;padding:0;margin:0;display:flex;flex-direction:row;gap:10px}.social-menu svg{width:24px;height:24px;stroke:var(--body-text-color);stroke-width:1.33}.article-list{display:flex;flex-direction:column;gap:var(--section-separation)}.article-list article{display:flex;flex-direction:column;background-color:var(--card-background);box-shadow:var(--shadow-l1);border-radius:var(--card-border-radius);overflow:hidden;transition:box-shadow .3s ease}.article-list article:hover{box-shadow:var(--shadow-l2)}.article-list article .article-image img{width:100%;height:150px;object-fit:cover}@media(min-width:768px){.article-list article .article-image img{height:200px}}@media(min-width:1280px){.article-list article .article-image img{height:250px}}.article-list article:nth-child(5n+1) .article-category a{background:#8ea885;color:#fff}.article-list article:nth-child(5n+2) .article-category a{background:#df7988;color:#fff}.article-list article:nth-child(5n+3) .article-category a{background:#0177b8;color:#fff}.article-list article:nth-child(5n+4) .article-category a{background:#ffb900;color:#fff}.article-list article:nth-child(5n+5) .article-category a{background:#6b69d6;color:#fff}.article-details{display:flex;flex-direction:column;justify-content:center;padding:var(--card-padding);gap:15px}.article-title{font-family:var(--article-font-family);font-weight:600;margin:0;color:var(--card-text-color-main);font-size:2.2rem}@media(min-width:1280px){.article-title{font-size:2.4rem}}.article-title a{color:var(--card-text-color-main)}.article-title a:hover{color:var(--card-text-color-main)}.article-subtitle{font-weight:400;color:var(--card-text-color-secondary);line-height:1.5;margin:0;font-size:1.75rem}@media(min-width:1280px){.article-subtitle{font-size:2rem}}.article-title-wrapper{display:flex;flex-direction:column;gap:8px}.article-time,.article-translations{display:flex;color:var(--card-text-color-tertiary);gap:15px}.article-time svg,.article-translations svg{vertical-align:middle;width:20px;height:20px;stroke-width:1.33;flex-shrink:0}.article-time time,.article-time a,.article-translations time,.article-translations a{font-size:1.4rem;color:var(--card-text-color-tertiary)}.article-time>div,.article-translations>div{display:inline-flex;align-items:center;gap:15px}.article-time{flex-wrap:wrap}.article-translations>div{flex-wrap:wrap}.article-category,.article-tags{display:flex;gap:10px}.article-category a,.article-tags a{color:var(--accent-color-text);background-color:var(--accent-color);padding:8px 16px;border-radius:var(--tag-border-radius);display:inline-block;font-size:1.4rem;transition:background-color .5s ease}.article-category a:hover,.article-tags a:hover{color:var(--accent-color-text);background-color:var(--accent-color-darker)}.article-list--compact{border-radius:var(--card-border-radius);box-shadow:var(--shadow-l1);background-color:var(--card-background);--image-size:50px}@media(min-width:768px){.article-list--compact{--image-size:60px}}.article-list--compact article>a{display:flex;align-items:center;padding:var(--small-card-padding);gap:15px}.article-list--compact article:not(:last-of-type){border-bottom:1.5px solid var(--card-separator-color)}.article-list--compact article .article-details{flex-grow:1;padding:0;min-height:var(--image-size);gap:10px}.article-list--compact article .article-title{margin:0;font-size:1.6rem}@media(min-width:768px){.article-list--compact article .article-title{font-size:1.8rem}}.article-list--compact article .article-image img{width:var(--image-size);height:var(--image-size);object-fit:cover}.article-list--compact article .article-time{font-size:1.4rem}.article-list--compact article .article-preview{font-size:1.4rem;color:var(--card-text-color-tertiary);margin-top:10px;line-height:1.5}.article-list--tile article{border-radius:var(--card-border-radius);overflow:hidden;position:relative;height:350px;width:250px;box-shadow:var(--shadow-l1);transition:box-shadow .3s ease;background-color:var(--card-background)}.article-list--tile article:hover{box-shadow:var(--shadow-l2)}.article-list--tile article.has-image .article-details{background-color:rgba(0,0,0,.25)}.article-list--tile article.has-image .article-title{color:#fff}.article-list--tile article .article-image{position:absolute;top:0;left:0;width:100%;height:100%}.article-list--tile article .article-image img{width:100%;height:100%;object-fit:cover}.article-list--tile article .article-details{border-radius:var(--card-border-radius);position:relative;height:100%;width:100%;display:flex;flex-direction:column;justify-content:flex-end;z-index:2;padding:15px}@media(min-width:640px){.article-list--tile article .article-details{padding:20px}}.article-list--tile article .article-title{font-size:2rem;font-weight:500;color:var(--card-text-color-main)}@media(min-width:640px){.article-list--tile article .article-title{font-size:2.2rem}}.widget{display:flex;flex-direction:column}.widget .widget-icon svg{width:32px;height:32px;stroke-width:1.6;color:var(--body-text-color)}.tagCloud .tagCloud-tags{display:flex;flex-wrap:wrap;gap:10px}.tagCloud .tagCloud-tags a{background:var(--card-background);box-shadow:var(--shadow-l1);border-radius:var(--tag-border-radius);padding:8px 20px;color:var(--card-text-color-main);font-size:1.4rem;transition:box-shadow .3s ease}.tagCloud .tagCloud-tags a:hover{box-shadow:var(--shadow-l2)}.widget.archives .widget-archive--list{border-radius:var(--card-border-radius);box-shadow:var(--shadow-l1);background-color:var(--card-background)}.widget.archives .archives-year:not(:last-of-type){border-bottom:1.5px solid var(--card-separator-color)}.widget.archives .archives-year a{font-size:1.4rem;padding:18px 25px;display:flex}.widget.archives .archives-year a span.year{flex:1;color:var(--card-text-color-main);font-weight:700}.widget.archives .archives-year a span.count{color:var(--card-text-color-tertiary)}footer.site-footer{padding:20px 0 var(--section-separation);font-size:1.4rem;line-height:1.75}footer.site-footer:before{content:"";display:block;height:3px;width:50px;background:var(--body-text-color);margin-bottom:20px}footer.site-footer .copyright{color:var(--accent-color);font-weight:700;margin-bottom:5px}footer.site-footer .powerby{color:var(--body-text-color);font-weight:400;font-size:1.2rem}footer.site-footer .powerby a{color:var(--body-text-color)}.pagination{display:flex;background-color:var(--card-background);box-shadow:var(--shadow-l1);border-radius:var(--card-border-radius);overflow:hidden;flex-wrap:wrap}.pagination .page-link{padding:16px 32px;display:inline-flex;color:var(--card-text-color-secondary)}.pagination .page-link.current{font-weight:700;background-color:var(--card-background-selected);color:var(--card-text-color-main)}@media(min-width:768px){.sidebar.sticky{position:sticky}}.left-sidebar{display:flex;flex-direction:column;flex-shrink:0;align-self:stretch;gap:var(--sidebar-element-separation);max-width:none;width:100%;position:relative;--sidebar-avatar-size:100px;--sidebar-element-separation:20px;--emoji-size:40px;--emoji-font-size:20px}@media(min-width:768px){.left-sidebar{width:auto;padding-top:var(--main-top-padding);padding-bottom:var(--main-top-padding);max-height:100vh}}@media(min-width:1536px){.left-sidebar{--sidebar-avatar-size:120px;--sidebar-element-separation:25px;--emoji-size:40px}}.left-sidebar.sticky{top:0}.left-sidebar.compact{--sidebar-avatar-size:80px;--emoji-size:30px;--emoji-font-size:15px}@media(min-width:1024px){.left-sidebar.compact header{flex-direction:row}}.left-sidebar.compact header .site-meta{gap:5px}.left-sidebar.compact header .site-name{font-size:1.4rem}@media(min-width:1536px){.left-sidebar.compact header .site-name{font-size:1.75rem}}.left-sidebar.compact header .site-description{font-size:1.4rem}.right-sidebar{width:100%;display:none;flex-direction:column;gap:var(--widget-separation)}.right-sidebar.sticky{top:0}@media(min-width:1024px){.right-sidebar{padding-top:var(--main-top-padding);padding-bottom:var(--main-top-padding)}}.sidebar header{z-index:1;transition:box-shadow .5s ease;display:flex;flex-direction:column;gap:var(--sidebar-element-separation)}@media(min-width:768px){.sidebar header{padding:0}}.sidebar header .site-avatar{position:relative;margin:0;width:var(--sidebar-avatar-size);height:var(--sidebar-avatar-size);flex-shrink:0}.sidebar header .site-avatar .site-logo{width:100%;height:100%;border-radius:100%;box-shadow:var(--shadow-l1)}.sidebar header .site-avatar .emoji{position:absolute;width:var(--emoji-size);height:var(--emoji-size);line-height:var(--emoji-size);border-radius:100%;bottom:0;right:0;text-align:center;font-size:var(--emoji-font-size);background-color:var(--card-background);box-shadow:var(--shadow-l2)}.sidebar header .site-meta{display:flex;flex-direction:column;gap:10px;justify-content:center}.sidebar header .site-name{color:var(--accent-color);margin:0;font-size:1.6rem}@media(min-width:1536px){.sidebar header .site-name{font-size:1.8rem}}.sidebar header .site-description{color:var(--body-text-color);font-weight:400;margin:0;font-size:1.4rem}@media(min-width:1536px){.sidebar header .site-description{font-size:1.6rem}}[data-scheme=dark] #dark-mode-toggle{color:var(--accent-color);font-weight:700}[data-scheme=dark] #dark-mode-toggle .icon-tabler-toggle-left{display:none}[data-scheme=dark] #dark-mode-toggle .icon-tabler-toggle-right{display:unset}#dark-mode-toggle{margin-top:auto;color:var(--body-text-color);display:flex;align-items:center;cursor:pointer;gap:var(--menu-icon-separation)}#dark-mode-toggle .icon-tabler-toggle-right{display:none}#i18n-switch{color:var(--body-text-color);display:inline-flex;align-content:center;gap:var(--menu-icon-separation)}#i18n-switch select{border:0;background-color:transparent;color:var(--body-text-color)}#i18n-switch select option{color:var(--card-text-color-main);background-color:var(--card-background)}html{font-size:62.5%;overflow-y:scroll}*{box-sizing:border-box}body{background:var(--body-background);margin:0;font-family:var(--base-font-family);font-size:1.6rem;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}*{scrollbar-width:auto;scrollbar-color:var(--scrollbar-thumb)transparent}::-webkit-scrollbar{height:auto}::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb)}::-webkit-scrollbar-track{background-color:transparent}.article-page.hide-sidebar-sm .left-sidebar{display:none}@media(min-width:768px){.article-page.hide-sidebar-sm .left-sidebar{display:inherit}}.article-page .main-article{background:var(--card-background);border-radius:var(--card-border-radius);box-shadow:var(--shadow-l1);overflow:hidden}.article-page .main-article .article-header .article-image img{height:auto;width:100%;max-height:50vh;object-fit:cover}.article-page .main-article .article-header .article-details{padding:var(--card-padding);padding-bottom:0}.article-page .main-article .article-content{margin:var(--card-padding)0;color:var(--card-text-color-main)}.article-page .main-article .article-content .footnotes{font-family:var(--base-font-family)}.article-page .main-article .article-content img{max-width:100%;height:auto}.article-page .main-article .article-footer{margin:var(--card-padding);margin-top:0}.article-page .main-article .article-footer section:not(:first-child){margin-top:var(--card-padding)}.article-page .main-article .article-footer section{color:var(--card-text-color-tertiary);text-transform:uppercase;display:flex;align-items:center;font-size:1.4rem;gap:15px}.article-page .main-article .article-footer section svg{width:20px;height:20px;stroke-width:1.33}.article-page .main-article .article-footer .article-tags{flex-wrap:wrap;text-transform:unset}.article-page .main-article .article-footer .article-copyright a,.article-page .main-article .article-footer .article-lastmod a{color:var(--body-text-color)}.article-page .main-article .article-footer .article-copyright a.link,.article-page .main-article .article-footer .article-lastmod a.link{box-shadow:unset}.widget--toc{background-color:var(--card-background);border-radius:var(--card-border-radius);box-shadow:var(--shadow-l1);display:flex;flex-direction:column;color:var(--card-text-color-main);overflow:hidden}.widget--toc ::-webkit-scrollbar-thumb{background-color:var(--card-separator-color)}.widget--toc #TableOfContents{overflow-x:auto;max-height:75vh}.widget--toc #TableOfContents ol,.widget--toc #TableOfContents ul{margin:0;padding:0}.widget--toc #TableOfContents ol{list-style-type:none;counter-reset:item}.widget--toc #TableOfContents ol li a:first-of-type::before{counter-increment:item;content:counters(item,".")". ";font-weight:700;margin-right:5px}.widget--toc #TableOfContents>ul{padding:0 1em}.widget--toc #TableOfContents li{margin:15px 0 15px 20px;padding:5px}.widget--toc #TableOfContents li>ol,.widget--toc #TableOfContents li>ul{margin-top:10px;padding-left:10px;margin-bottom:-5px}.widget--toc #TableOfContents li>ol>li:last-child,.widget--toc #TableOfContents li>ul>li:last-child{margin-bottom:0}.widget--toc #TableOfContents li.active-class>a{border-left:var(--heading-border-size)solid var(--accent-color);font-weight:700}.widget--toc #TableOfContents ul li.active-class>a{display:block}.widget--toc #TableOfContents>ul>li.active-class>a{margin-left:calc(-25px - 1em);padding-left:calc(25px + 1em - var(--heading-border-size))}.widget--toc #TableOfContents>ol>li.active-class>a{margin-left:calc(-9px - 1em);padding-left:calc(9px + 1em - var(--heading-border-size));display:block}.widget--toc #TableOfContents>ul>li>ul>li.active-class>a{margin-left:calc(-60px - 1em);padding-left:calc(60px + 1em - var(--heading-border-size))}.widget--toc #TableOfContents>ol>li>ol>li.active-class>a{margin-left:calc(-44px - 1em);padding-left:calc(44px + 1em - var(--heading-border-size));display:block}.widget--toc #TableOfContents>ul>li>ul>li>ul>li.active-class>a{margin-left:calc(-95px - 1em);padding-left:calc(95px + 1em - var(--heading-border-size))}.widget--toc #TableOfContents>ol>li>ol>li>ol>li.active-class>a{margin-left:calc(-79px - 1em);padding-left:calc(79px + 1em - var(--heading-border-size));display:block}.widget--toc #TableOfContents>ul>li>ul>li>ul>li>ul>li.active-class>a{margin-left:calc(-130px - 1em);padding-left:calc(130px + 1em - var(--heading-border-size))}.widget--toc #TableOfContents>ol>li>ol>li>ol>li>ol>li.active-class>a{margin-left:calc(-114px - 1em);padding-left:calc(114px + 1em - var(--heading-border-size));display:block}.widget--toc #TableOfContents>ul>li>ul>li>ul>li>ul>li>ul>li.active-class>a{margin-left:calc(-165px - 1em);padding-left:calc(165px + 1em - var(--heading-border-size))}.widget--toc #TableOfContents>ol>li>ol>li>ol>li>ol>li>ol>li.active-class>a{margin-left:calc(-149px - 1em);padding-left:calc(149px + 1em - var(--heading-border-size));display:block}.related-content{overflow-x:auto;padding-bottom:15px}.related-content>.flex{float:left}.related-content article{margin-right:15px;flex-shrink:0;overflow:hidden;width:250px;height:150px}.related-content article .article-title{font-size:1.8rem;margin:0}.related-content article.has-image .article-details{padding:20px;background:linear-gradient(0deg,rgba(0,0,0,.25) 0%,rgba(0,0,0,.75) 100%)}.article-content{font-family:var(--article-font-family);font-size:var(--article-font-size);padding:0 var(--card-padding);line-height:var(--article-line-height)}.article-content>p{margin:1.5em 0}.article-content h1,.article-content h2,.article-content h3,.article-content h4,.article-content h5,.article-content h6{margin-inline-start:calc((var(--card-padding)) * -1);padding-inline-start:calc(var(--card-padding) - var(--heading-border-size));border-inline-start:var(--heading-border-size)solid var(--accent-color)}.article-content figure{text-align:center}.article-content figure figcaption{font-size:1.4rem;color:var(--card-text-color-secondary)}.article-content blockquote{position:relative;margin:1.5em 0;border-inline-start:var(--blockquote-border-size)solid var(--card-separator-color);padding:15px calc(var(--card-padding) - var(--blockquote-border-size));background-color:var(--blockquote-background-color)}.article-content blockquote .cite{display:block;text-align:right;font-size:.75em}.article-content blockquote .cite a{text-decoration:underline}.article-content hr{width:100px;margin:40px auto;background:var(--card-text-color-tertiary);height:2px;border:0;opacity:.55}.article-content code{color:var(--code-text-color);background-color:var(--code-background-color);padding:2px 4px;border-radius:var(--tag-border-radius);font-family:var(--code-font-family)}.article-content a,.article-content code{word-break:break-word}.article-content .gallery{position:relative;display:flex;flex-direction:row;justify-content:center;margin:1.5em 0;gap:10px}.article-content .gallery figure{margin:0}.article-content pre{overflow-x:auto;display:block;background-color:var(--pre-background-color);color:var(--pre-text-color);font-family:var(--code-font-family);line-height:1.428571429;word-break:break-all;padding:var(--card-padding)}[dir=rtl] .article-content pre{direction:ltr}.article-content pre code{color:unset;border:none;background:0 0;padding:0}.article-content .highlight{background-color:var(--pre-background-color);padding:var(--card-padding);position:relative}.article-content .highlight:hover .copyCodeButton{opacity:1}[dir=rtl] .article-content .highlight{direction:ltr}.article-content .highlight pre{margin:initial;padding:0;margin:0;width:auto}.article-content .copyCodeButton{position:absolute;top:calc(var(--card-padding));right:calc(var(--card-padding));background:var(--card-background);border:none;box-shadow:var(--shadow-l2);border-radius:var(--tag-border-radius);padding:8px 16px;color:var(--card-text-color-main);cursor:pointer;font-size:14px;opacity:0;transition:opacity .3s ease}.article-content .table-wrapper{padding:0 var(--card-padding);overflow-x:auto;display:block}.article-content table{width:100%;border-collapse:collapse;border-spacing:0;margin-bottom:1.5em;font-size:.96em}.article-content th,.article-content td{text-align:left;padding:4px 8px 4px 10px;border:1px solid var(--table-border-color)}.article-content td{vertical-align:top}.article-content tr:nth-child(even){background-color:var(--tr-even-background-color)}.article-content .twitter-tweet{color:var(--card-text-color-main)}.article-content .video-wrapper{position:relative;width:100%;height:0;padding-bottom:56.25%;overflow:hidden}.article-content .video-wrapper>iframe,.article-content .video-wrapper>video{position:absolute;width:100%;height:100%;left:0;top:0;border:0}.article-content .gitlab-embed-snippets{margin:0!important}.article-content .gitlab-embed-snippets .file-holder.snippet-file-content{margin-block-end:0!important;margin-block-start:0!important;margin-left:calc((var(--card-padding)) * -1)!important;margin-right:calc((var(--card-padding)) * -1)!important;padding:0 var(--card-padding)!important}.article-content blockquote,.article-content figure,.article-content .highlight,.article-content pre,.article-content .gallery,.article-content .video-wrapper,.article-content .table-wrapper,.article-content .s_video_simple{margin-left:calc((var(--card-padding)) * -1);margin-right:calc((var(--card-padding)) * -1);width:calc(100% + var(--card-padding) * 2)}.article-content .katex-display>.katex{overflow-x:auto;overflow-y:hidden}.article-content kbd{border:1px solid var(--kbd-border-color);font-weight:700;font-size:.9em;line-height:1;padding:2px 4px;border-radius:4px;display:inline-block}.section-card{border-radius:var(--card-border-radius);background-color:var(--card-background);padding:var(--small-card-padding);box-shadow:var(--shadow-l1);display:flex;align-items:center;gap:20px;--separation:15px}.section-card .section-term{font-size:2.2rem;margin:0;color:var(--card-text-color-main)}.section-card .section-description{font-weight:400;color:var(--card-text-color-secondary);font-size:1.6rem;margin:0}.section-card .section-details{flex-grow:1;display:flex;flex-direction:column;gap:8px}.section-card .section-image img{width:60px;height:60px}.section-card .section-count{color:var(--card-text-color-tertiary);font-size:1.4rem;margin:0;font-weight:700;text-transform:uppercase}.subsection-list{overflow-x:auto}.subsection-list .article-list--tile{display:flex;padding-bottom:15px}.subsection-list .article-list--tile article{width:250px;height:150px;margin-right:20px;flex-shrink:0}.subsection-list .article-list--tile article .article-title{margin:0;font-size:1.8rem}.subsection-list .article-list--tile article .article-details{padding:20px}.not-found-card{background-color:var(--card-background);box-shadow:var(--shadow-l1);border-radius:var(--card-border-radius);padding:var(--card-padding)}.search-form{position:relative;--button-size:80px}.search-form.widget{--button-size:60px}.search-form.widget label{font-size:1.3rem;top:10px}.search-form.widget input{font-size:1.5rem;padding:30px 20px 15px}.search-form p{position:relative;margin:0}.search-form label{position:absolute;top:15px;inset-inline-start:20px;font-size:1.4rem;color:var(--card-text-color-tertiary)}.search-form input{padding:40px 20px 20px;border-radius:var(--card-border-radius);background-color:var(--card-background);box-shadow:var(--shadow-l1);color:var(--card-text-color-main);width:100%;border:0;-webkit-appearance:none;transition:box-shadow .3s ease;font-size:1.8rem}.search-form input:focus{outline:0;box-shadow:var(--shadow-l2)}.search-form button{position:absolute;inset-inline-end:0;top:0;height:100%;width:var(--button-size);cursor:pointer;background-color:transparent;border:0;padding:0 10px}.search-form button:focus{outline:0}.search-form button:focus svg{stroke-width:2;color:var(--accent-color)}.search-form button svg{color:var(--card-text-color-secondary);stroke-width:1.33;transition:all .3s ease;width:20px;height:20px}a{text-decoration:none;color:var(--accent-color)}a:hover{color:var(--accent-color-darker)}a.link{box-shadow:0 -2px rgba(var(--link-background-color),var(--link-background-opacity))inset;transition:all .3s ease}a.link:hover{box-shadow:0 calc(-1rem * var(--article-line-height))rgba(var(--link-background-color),var(--link-background-opacity-hover))inset}.section-title{text-transform:uppercase;margin-top:0;margin-bottom:10px;display:block;font-size:1.6rem;font-weight:700;color:var(--body-text-color)}.section-title a{color:var(--body-text-color)} \ No newline at end of file diff --git a/search/index.html b/search/index.html new file mode 100644 index 000000000..3581c221e --- /dev/null +++ b/search/index.html @@ -0,0 +1,7 @@ +Search

+

+ \ No newline at end of file diff --git a/search/index.json b/search/index.json new file mode 100644 index 000000000..e2abd1422 --- /dev/null +++ b/search/index.json @@ -0,0 +1 @@ +[{"content":"背景 搭建独立博客网站的方法多种多样,常见的方法包括租用服务器自行架设,或者选择托管服务商提供的博客发布服务。\n但是上述两种方式都会产生一定的费用,对于非盈利网站而言,不太友好。\n经过多年的实践,现在已有越来越多的人选择了使用免费且易用的 GitHub Pages 服务来搭建个人博客。\n然而,现有的使用教程大多侧重于操作步骤,对于新手或非专业人士而言,难以真正理解其中原理。\n他们可能看到别人的博客既漂亮又实用,却在自己尝试搭建时屡屡遇到挫折,逐渐失去信心。\n这无疑会打击那些希望通过博客持续创作文字、并且希望能够免费建立个性化站点的人的积极性。\n本文将介绍如何使用 GitHub Pages 服务搭建免费的个人博客网站,及其背后的实现原理,以帮助初学者顺利建立自己理想的博客站点。\n需要预先掌握的技能和前置条件 需要先了解这些再往下阅读本文\n了解 Git 的概念和常用的操作,知道“分支”、“提交”、“推送”、“拉取”等概念。 拥有 Github 账号,并且能够独立完成“仓库创建”、“本地克隆”、“提交”、“推送”等操作。 了解“博客”本身只是一种“网站”:其内容由若干“网页”组成,读者通过浏览器访问博客网站所在的服务器以获取这些网页内容。 核心思路 简单来说,核心步骤只有三步:内容编辑、页面生成、网站发布。接下来的介绍均围绕这三件事展开。\n内容编辑 作者编写和编辑博客内容,包括编写文章、给文章配图、给文章归类等等活动都属于内容编辑。\n页面生成 如果希望将内容变成可发布的网站,则需要使用专用的软件工具(一般为静态网站生成器)将编辑的内容自动生成可供浏览器显示的博客网站页面。\n网站发布 有了网站页面,还只是一堆存放在本地的文件。若要放到互联网上进行访问,还需要一个服务器提供服务,将网站发布。\n如果采用独立建站的方式,这一步骤会涉及大量技术工作,比如服务器采购、Web服务应用程序安装、域名映射、SSL 安全证书、网络防火墙配置等等。\n但我们今天选择使用 Github 提供的 Pages 服务,这将大大降低上述操作的难度,很多技术细节将不必再多关注,已经由 Pages 服务默认配置好。我们只需享用配置好的环境即可。\n技术路线 Github Pages Github 本来是一个 Git 仓库托管服务商,帮助用户进行项目代码及数字资料的版本管理。不过随着用户规模提升,Github 也围绕版本管理提供了更多的辅助服务,这其中就包括 Pages 服务。\nGitHub Pages 是一项静态站点托管服务,它直接从 GitHub 上的仓库获取 HTML、CSS 和 JavaScript 文件,(可选)通过构建过程运行文件,然后发布网站。 可以在 GitHub Pages 示例集合中看到 GitHub Pages 站点的示例。\nPages 服务原本用于帮助托管在 Github 上的开源项目更便捷地发布自己的宣传页面。开发团队可以简单编写几个静态页面(HTML)然后放在托管的 Git 仓库中,由 Github 将这些页面以网站服务的方式发布出去,Github 既提供了服务器资源也提供了用于公网访问的专属 URL 地址。\n关于发布网站的专属 URL 地址的提供规则,Github 官方的介绍如下:\n若要发布用户站点,必须创建名为 \u0026lt;username\u0026gt;.github.io 的个人帐户拥有的存储库。 若要发布组织站点,必须创建名为 \u0026lt;organization\u0026gt;.github.io 的组织帐户拥有的存储库。 除非使用的是自定义域,否则用户和组织站点在 http(s)://\u0026lt;username\u0026gt;.github.io 或 http(s)://\u0026lt;organization\u0026gt;.github.io 中可用。 项目站点的源文件与其项目存储在同一个仓库中。 除非使用的是自定义域,否则项目站点在 http(s)://\u0026lt;username\u0026gt;.github.io/\u0026lt;repository\u0026gt; 或 http(s)://\u0026lt;organization\u0026gt;.github.io/\u0026lt;repository\u0026gt; 中可用。\n根据官方介绍,Pages 提供有三种不同的网站发布服务:用户站点、组织站点、项目站点。\n分别对应了“制作个人网站”、“制作团队组织网站”、“制作单个项目网站”的不同需求。\n针对个人博客的搭建,很显然使用 Pages 服务发布“用户站点”是最合适的选择。\n对于“用户站点”,Pages 最终会为用户提供的专属 URL 地址为:https://你的用户名.github.io,也就是说在 Gihtub 的一级域名 https://github.io 下给你免费提供了一个二级域名。之所以默认使用你的 Github 用户名,是因为要防止不同用户发布的地址重名导致冲突。\n按照官方介绍,你也可以使用自己购买的域名,通过自己的域名进行访问。不过这涉及到更复杂的话题和操作,不在本文讨论范畴。\n了解了以上基本信息后,在使用 Pages 服务时,可按照复杂度区分,采用如下几种不同的用法。\n最简单直接的使用流程 手工编写 HTML 页面文件(需要掌握网页制作知识)。 将页面文件推送到的 Github 仓库,对于“用户站点”来说,这个仓库的命名必须为“你的用户名.github.io”。 在 Github 中设置该仓库的 Pages 服务配置,主要是选择仓库的指定“分支”用于 Pages 服务获取待发布的网页文件。 Github 会按照上面介绍的规则给你提供一个 URL 访问地址(https://你的用户名.github.io),使用浏览器打开该地址即可访问到发布的网站了。 注:如果不理解 Git 仓库的“分支”概念,可以把它视为同一个仓库里不同的存储位置,不同的“分支”里面存储了不同的文件内容。\n这个流程仅适用于非常简单网站发布,比如只包含有一个页面,因为手工编写 HTML 页面的效率十分低下,且不利于持续更新维护。\n于是大家常用的方式是,使用一种叫做的东西,对于“博客”这类以静态页面为主的网站,十分适合。\n“静态站点生成器”可以理解为是一个“翻译”,它能自动将你编写的文本内容根据预先的配置信息,自动生成一个完整的网站所需的全部文件(HTML、JS、CSS等)。\n于是有了如下的改进流程:\n改进的使用流程 用户编辑好博客内容,形成保存在本地计算机的原始文档文件。 使用静态网站生成器将本地原始文档文件生成静态页面文件。 将静态页面文件推送到 Github 远端托管仓库。 Github Pages 服务自动被触发,将静态页面以网站形式发布出来。 用户通过指定 URL 地址访问已发布的博客内容。 到目前为止,已经可以较为流畅地执行博客编辑、生成、发布的工作流程了。\n但是这个流程里有个前置条件,作者必须在本地电脑上安装一个“静态站点生成器”,以用于输出转换后的、可供发布的页面。\n所以,为了方便,Github 提供了一个默认的静态网站生成器,上述第 2 步操作实际上可以在远端仓库自动执行,这样用户只需将原始文件上传至远端仓库即可,由 Github 直接在线上完成静态页面的生成和网站发布工作。\n静态站点生成器的选择 比较常见的静态站点生成器有:Jekyll、Hexo、Hugo 这三个。不在这里详细介绍了,因为功能都大同小异。在选定一个之后,需要去他们的官网查看文档以了解具体的使用细节,以便对自己的博客站点能够做到更深的定制。\n我在接下来的操作步骤里,选择使用 Hugo 这个生成器。\n主要原因是,Hugo 提供有相对来说比较美观的免费主题风格模板(Jekyll 也有漂亮的,但是收费。Hexo 的定制性很强,适合有网页开发能力的人自己开发主题)。\n我选择的主题模板是:hugo-theme-stack。\n操作步骤 建立 Github 仓库 点击这个超链接进入 hugo-theme-stack-starter 的 Git 仓库模板。 点击页面中的“使用此模板”按钮,以创建你自己的仓库(注意:需先登录自己的账号才能创建)。 建立好仓库(注意仓库命名为你的用户名.github.io)之后,会自动带有仓库模板的初始文件。 修改配置 将仓库下载到本地。 打开仓库里的 config 文件夹,里面存放有配置信息。 按照 hugo-theme-stack 的官方文档配置自己想要的效果(默认一般都够用,重点是修改自己的站点信息,如显示名称、URL 链接地址等等)。 这些配置主要在 config.toml 和 params.toml 两个文件里。 编写博客文章 生成器会默认去仓库的 content/post/ 文件夹下扫描其下面的所有文件夹和文件,遇到约定格式的 Markdown 文件就会转换成为可发布的 html 页面。具体约定可以查看官方的详细文档,这里介绍一种最简单的写一篇文章的过程。\n在 post 目录下新建一个文件夹用于存放文章的 Markdown 文件和插图文件,文件夹命名为希望编写的标题如:2023-09-21-怎样搭建个人博客。我个人习惯将不同年份的文章在post目录下再建一级目录按照日期或年份进行区分。 在刚建立的文件夹下新建名称为index.md的 Markdown 文件,文件名必须为 index.md 这是由 hugo 生成器约定的。 在刚建立的 Markdown 文件的头部添加必要的元信息(非常关键)。 1 2 3 4 5 6 7 8 9 --- title: 文章标题 date: 2023-09-21 categories: - 文章所属分类 tags: - 文章标签 1 - 文章标签 2 --- 编写文章内容。可以使用 Markdown 的语法随意定义格式,以及插入图片。插入的图片建议保存在同级目录(也就是刚才新建的那个)中。 推送到仓库及发布 将刚才修改配置文件保存。 将刚才编写的博客文章保存。 在本地提交 commit 并 push 到 Github 仓库。 稍等几分钟(给 Github 那端的 Hugo 生成器留出运行时间)。 在 Github 仓库的 “setting” 设置页面开启 Pages 服务(只需第一次)。 在 Pages 设置界面里的 Source 中选择 “Deploy from a branch” ,并在下面的分支选择下拉框中选择 “gh-pages”,保存。 访问你的博客站点 一般稍等几分钟之后,即可按照约定网址访问刚发布的内容了。 扩展阅读 运营自己的博客网站所需了解的概念和知识相对比较多,如果希望将自己的网站做的更加精美、有特色。\n除了能够持续产出高质量内容之外,建议阅读以下文章以了解相关知识:\n学习 web 开发。 ","date":"2023-09-21T00:00:00Z","image":"https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-21-16-10-50_hud71083d89a6fcf582c5ec86c790cb99f_29027_120x120_fill_box_smart1_3.png","permalink":"https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/","title":"基于 Github Pages 服务搭建个人博客"},{"content":"机器文摘 第 050 期 长文 十八世纪的光学电报网络 当年读《基督山伯爵》的时候,有一个让我震惊的科技。\n主人公有一项复仇计划是破坏敌人的金融资产。计划采取的手段是收买了一个传递实时信息的人让其传递错误信息。\n而具体传递信息的手段是,每隔一段距离设一座瞭望塔,每个塔上有一个人,向一个方向用望远镜观看,远方的上级瞭望塔会有人发射信号弹,一连串的信号弹代表一定的信息,然后这个人再原样发射一遍,让后方的瞭望塔看见。信息就这样一级一级传递下去。\n信息经过编码,可以表达股票行情等信息,类似后来的电报系统,但是这是在十八世纪。\n读过之后我就一直有疑问,不知道小说是否虚构了这种信息传递技术,直到前几天我发现了这篇文章:《十八世纪的光学电报网络》。\n里面详细介绍了在两百多年前人类就已经发明了“光学电报”系统,并建立起了巨大的信息网络。信息传递速度达到了惊人的 1380千米/每小时。\nC 语言发展简史 要说 C 语言是计算机历史上最重要的编程语言应该不会有人反对吧。\n作为大多数人编程入门的母语,C 语言具有语法简洁、高性能(贴近计算机底层)、使用灵活、适用范围广泛等特点。\n虽然诞生于上个世纪 70 年代,但即便是在 2023 年的今天,C 语言仍然排在各大编程排行榜的考前位置,仍然是信息科技的重要支撑力量。\n《C 语言简史》,由丹尼斯·里奇(C 语言之父)撰写,是一篇难得的介绍 C 语言的诞生和发展的历史性文献。\nVB(Visual Basic)发展简史 前几天 HN 上有个从业近 30 年的老程序员发问:为什么 VB(Visual Basic)这么高效、好用的开发工具逐渐消失了?。\n被顶的最高的网友放出了《Visual Basic 从诞生到消失》这篇文章。\n在上世纪 80 年代末 90 年代初,Windows 操作系统刚刚崭露头角的时候,VB 已经在萌芽状态了。而且已经具有非常先进的组件化、可视化、低代码等超前思想。并且发明了“控件”、“消息触发”等概念。\n最初的版本与 BASIC 语言并无关系,只考虑了使用可视化开发并辅助简单的内嵌脚本,但是比尔·盖茨对 BASIC 十分热爱(毕竟那是微软起家的技术),亲自推动了组件化、可视化开发与 BASIC 语言结合,便诞生了 Visual Basic。\n得益于超前的可视化开发理念,VB 极大降低了当时开发应用程序的门槛,涌现出一大批开发者。包括当时那些不得不转型给个人电脑开发程序的大型机编程工程师。\n这一切在 VB 随着 Visual Studio 发布 6.0 的时候达到了顶峰。\n转折点出现在微软为了应对 Java 的威胁而推出 .Net 公共语言运行时的时候,VB 也被纳入到这套体系里,被成为 VB.Net ,扩充了复杂的语法和继承、多态等高级特性。\n对于那些真正喜欢 VB6 的人来说,这些都是唯恐避之不及的东西,更糟糕的是新的 VB.Net 无法兼容之前的代码,大量成果移植困难。\n之后更是随着网络信息科技的发展,Web 编程逐渐取代了 Windows 桌面编程,VB 这个伟大的技术,被淘汰也就是顺其自然的了。\n一个在网页里模仿 Excel 表格的故事 一位前端工程师,讲述了他在 2016 年受雇于 Uber(优步)时的一些开发往事。\n作为服务于数据工程师的内部研发团队,他所在的小组主要是给公司的数据分析人员提供内部工具,以便让他们能够更快地分析数据,更快的分析数据意味着更有可能在产品运营竞争里获胜。\n然而数据分析人员总是抱怨工具不满足要求,主要是操作界面,因为他们非常习惯“Excel”,每次提需求的时候总是说:“你就做得跟 Excel 一样就行”。\n作者最开始还试图跟用户解释要实现起来是多么困难,后来逐渐放弃了挣扎,并开始着手在网页里实现一个跟 Excel 一样的表格,而且他竟然实现了。\n故事的后来有些伤感,作者提供的工具并没有使得 “Uber” 在跟嘀嘀的竞争中胜出,相反地,“Uber”在中国的业务还被“嘀嘀”收购了。\n被用于数据分析的工具也被抛弃不再使用。\n后来作者选择了将那个像 Excel 的表格代码放在了 Github 进行开源,地址在这里。\n资源 通用 Web 应用服务器 NGINX Unit,通用 Web 应用服务器。是一个轻量且多功能的应用运行时,作为一个单一的开源服务器,它提供了您的 Web 应用程序所需的基本组件:运行应用程序代码(包括 WebAssembly)、提供静态资源、处理 TLS 和请求路由。\nUnit 是由 NGINX 团队成员从零开始创建的,以在运行时高度高效且完全可配置。最新版本是 1.31.0,于 2023 年 8 月 31 日发布。\n绿色安卓 App 合集 绿色安卓app合集。\n这个网站收集了一大批良心 app,全部没有广告且不要求隐私权限。\n几乎涵盖了日常使用的所有类型,包括艺术绘画、音乐播放器、笔记、文件管理、录音、拍照等。 ​​​\nnuejs nuejs,越来越多的人对前端开发的混乱感到不满了。不同的是有人选择抱怨,有人撸起袖子开干。nuejs 的作者觉得现在使用 React、Vue 等框架再加上若干服务端渲染框架,使得前端开发生态变得越来越复杂和掌握。于是自己动手开发了一个简单的轻量化框架,终极目标是构建一个简洁、高效的前端开发生态。\n1024 字节的网页,可显示 3D 地球 1024 字节的 JavaScript,在网页中显示动画 3D 地球模型,页面动画显示的就是其源代码。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 .\u0026lt;script\u0026gt; eval(z=\u0026#39;p=\u0026#34;\u0026lt;\u0026#34;+\u0026#34;pre\u0026gt;\u0026#34;/* ,.oq#+ ,._, */;for(y in n=\u0026#34;zw24l6k\\ 4e3t4jnt4qj24xh2 x/* =\u0026lt;,m#F^ A W###q. */42kty24wrt413n243n\\ 9h243pdxt41csb yz/* #K q##H######Am */43iyb6k43pk7243nm\\ r24\u0026#34;.split(4)){/* dP cpq#q##########b, */for(a in t=pars\\ eInt(n[y],36)+/* p##@###YG=[#######y */(e=x=r=[]))for\\ (r=!r,i=0;t[a/* d#qg `*PWo##q#######D */]\u0026gt;i;i+=.05)wi\\ th(Math)x-= /* aem1k.com Q###KWR#### W[ */.05,0\\ x;)p+=\u0026#34; *#\u0026#34;/* b. OQ####x#K */[e[x++]+e[x++\\ ]]||(S=(\u0026#34;eval\u0026#34;/* l `X#####D , */+\u0026#34;(z=\\\u0026#39;\u0026#34;+z.spl\\ it(B = \u0026#34;\\\\\\\\\u0026#34;)./* G####B\u0026#34; # */join(B+B).split\\ (Q=\u0026#34;\\\u0026#39;\u0026#34;).join(B+Q/* VQBP` */)+Q+\u0026#34;)//m1k\u0026#34;)[x/2\\ +61*y-1]).fontcolor/* TP */(/\\\\w/.test(S)\u0026amp;\u0026amp;\u0026#34;#\\ 03B\u0026#34;);document.body.innerHTML=p+=B+\u0026#34;\\\\n\u0026#34;}setTimeout(z)\u0026#39;)// 全球 IP 地址地理位置数据库 全球 IP 地址 地理位置数据库。含 IPV4 和 IPV6。 ​​​这篇文章里还介绍了构建 IP 地址地理数据库的实现原理和一套具有指导意义的实现方法。基本原理是:“互联网中的每个 IP 地址都由组织拥有或管理。可以向互联网注册机构查询WHOIS信息。”\n观点 为什么 Facebook 的 PyTorch 占有率赢了 Google 的 Tensorflow Pytorch 已经完全击败了 Tensorflow,成为 AI 开发框架的事实标准。Pytorch 一开始就专注于学术界,方向是把最牛的人吸引过来。而 Tensorflow 则倾向于软件工程炫技,做各种简单但是酷炫的功能。\n最终专业化的 torch 击败了 tensorflow 。 我觉得​​​还有一个原因就是 Google 特别容易弃坑,Tensorflow 中间也切换过前后不兼容的 API。\n越来越多的科技产品让人更好地欺骗自己 比如美颜相机、电影特效、游戏等,研发它们的主要目的就是让人们更好的实现自我欺骗和催眠。\n东方文明为什么警惕科技(我个人不完全同意) 中国古代对于科技非常警惕和打压的原因,也许是古人早就意识到科技(或技术)力量很容易对人类造成强烈反噬。\n观点来自 @​​​安东尼2001:量子自旋理论背后,是人类历史的轮回。\n订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-09-19T00:00:00Z","image":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-31-40_hu3a4ea67a0e4e3f121ecef4f60ac92d88_250830_120x120_fill_box_smart1_3.png","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/","title":"机器文摘 第 050 期"},{"content":"机器文摘 第 049 期 长文 在 Linux 环境里执行 Windows 应用程序 最近遇到一个难以启齿的需求,服务器是 Linux 环境,但是某项服务功能却需要执行一个 Windows exe 文件。\n不得已才想到要求助 Wine 这个经典中间层,据说可以使的 Linux 兼容大部分的 Win32 程序。\n但是又不想污染服务器的其他环境,于是选择在容器中运行。\n在网上找到了这篇《利用 Docker 容器和 Wine 在 Linux里运行 Windows 程序》,按照文中介绍的步骤成功实现了需求。\n基本步骤: 1、根据文章提供的 Dockfile 构建镜像; 2、运行镜像并注意配置运行容器的环境变量; 3、执行所需的 exe 程序。\nWindows 系统是怎样进行引导的 前不久,我在给笔记本更换大容量固态硬盘的时候,由于不愿重做系统,使用了硬盘克隆功能,将原盘整体信息直接克隆到新硬盘。\n结果克隆成功并替换安装硬盘之后,却没能正常引导进入 Windows,而是进入了一个类似 PE 系统的界面(猜测是原盘中厂家自制的),并告知我由于检测到硬件更换,拒绝引导,并建议我选择恢复系统。\n我猜测之前的隐藏分区可能有笔记本厂家做的一些特定引导程序,才导致这样的情况。\n我对系统引导的理解还停留在 MBR 分区表大面积应用的阶段。于是尝试删除了隐藏分区,并手动将系统盘分区设置为了 “激活”分区(事实上这时候已经错了,因为 GPT 分区表方式下无法采用这种引导方式了)。\n结果系统干脆直接无法引导。出现这种情况,我之前的知识储备显然不够用了。\n经过一番折腾和搜索,我才得知现在 Windows 8 及以上版本操作系统的电脑所采用的方式是 GPT 分区表 + UEFI 引导。\n也就是说硬盘上需要单独开辟一个分区存储负责进行操作系统引导的工作。这个分区平时对于操作系统的资源管理器不可见(但磁盘管理中可以看到),由主板上的 UEFI 程序(这个程序可以理解为 BIOS 的升级版)进行访问和管理。\n了解这个方式之后,就简单了,重新使用工具修改 GPT 分区并制作专用引导分区即可。\n最后,为了弄清这跟之前的 MBR 引导方式有什么区别,我找到了一位运维工程师总结得较到位的文章《Windows系统开机引导顺序简述及运维小结》。\n500 行代码写一个 C 编译器 500 行 Python 代码写一个 C 编译器。\n作者立下这个 flag 之后才发现任务有多难。\n主要是代码行数太少了,如果使用传统手段实现,可能这点儿代码量还不够写个语法分析器的。\n于是作者主动放弃了 AST (抽象语法树)的构建,采用 Token 提取和指令生成“一遍过”的方式,实现了一个相当“简洁”的 C 编译器。\n资源 假装弹钢琴 touchpianist,在线弹钢琴的网站(也提供手机 App 版),可以让你假装钢琴大师,只需要按键盘上的任意键,旋律就会自动演奏,不过你要控制敲击键盘的速度,以匹配原曲的节奏。我弹了一下,默认曲目是贝多芬的《月光奏鸣曲》,差点儿被自己陶醉了。 ​​​\nBun V1.0 bun-v1.0,拳打 node , 脚踢 deno 的 JavaScript 运营环境 bun 推出了 1.0 版本。主打一个“All in one”,号称可以一次性取代一揽子工具:node、npx、npm、webpack、tsc、babel、jest。一个工具包揽了运行、打包、包管理、转译、测试等所有事情,且速度是 nodejs 的 3 倍。\n对于这种吹的比较厉害的技术,保持关注,谨慎使用吧。\n开源基于 LLM 知识库平台 FastGPT - 基于 LLM 大模型的 AI 知识库问答系统。提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景。项目在 Github 开源,采用技术栈: NextJs + TS + ChakraUI + Mongo + Postgres(Vector 插件)。支持 GPT、Claude、Spark、ChatGLM 等多种 LLM 模型。\n开源基于 LLM 数据可视化平台 lida,微软出品的数据可视化工具库,特点是基于 LLM 对话模型进行生成,其生成的可视化代码支持多种可视化后端的语法,包括 matplotlib、seaborn、d3等。 ​​​\n观点 编程是一种体育锻炼 编程除了是一种可以以之谋生的专业技能,对于那些真喜欢编程的人来说,它还是一个心理疗愈工具。\n编程能使人专注,进入“心流”状态比较容易,也容易让人的心态平和。\n编程与体育锻炼一样,都是可以让人受益终生的活动。\n\u0026mdash;-来自@软件教书匠金旭亮。\n造成电子阳痿的一种因素 一个不容忽视的因素是现在游戏的加载速度,尤其是 PC 游戏。\n我们被碎片化信息惯得一秒钟都不想等待。\n每当想玩会儿 CS 或者地平线之类得游戏,光是等待游戏启动、地图加载等就足以让人放弃想玩的念头。\n更别提有些游戏还有一些跳都无法跳过得开场引导视频。\n所以我现在就算是玩也是偶尔打开模拟器玩一玩老游戏,带有状态存储,随时加载存档。\n据说有一部分游戏主机(比如新一代 XBox)有类似笔记本电脑的睡眠功能,开机就玩,随时进入上次未完成的任务。\n订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-09-12T00:00:00Z","image":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-34-22_hu7c2fecfb9bfda307a8ff3b488a489fac_482154_120x120_fill_box_smart1_3.png","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/","title":"机器文摘 第 049 期"},{"content":"机器文摘 第 048 期 长文 关于 Python 语言的一些统计数字 关于开源 Python 仓库的一些有趣统计,有人克隆了 PyPI 网站里所有 Python 包对应的 Github 仓库,并对这些仓库里的全部文件进行了分析和统计。\n1、排名前三的语法特性分别是:列表推导、fstring字符串格式化、注解;\n2、代码中大约包含有超过 2 万 5 千个密钥明文,泄露最多的是访问 Google API、OpenAI API和腾讯云 Secret ID;\n3、截止到 2023 年 8 月,所有源码加起来已超过 60TB ,文件数量超过 10 亿。\nWasm 技术让数据库执行 AI 模型 使用 Extism 将 WebAssembly 引入 PostgreSQL。\n这篇文章的作者介绍了一种方法,可以使用 Wasm 技术通过扩展插件的方式给 PostgreSQL 数据库增加 UDF (用户自定义函数),从而实现调用 AI 模型的能力。\nBitLocker 硬件加密能破解吗? BitLocker 是 Windows 下的存储加密技术,用于保护硬盘中的数据安全。\n未经解密的硬盘即使遗失或者被接入其他系统也无法进行读取。\n这在极大程度上带来了数据安全(不过仍有不少用户在不知情的情况下开启了 BitLocker 且未保存密钥,在重做系统的时候发现硬盘无法解密,数据无法恢复。。欲哭无泪。。)。\n然而这种加密方式也不是绝对安全,国外有技术爱好者对此进行了挑战,并使用一台逻辑分析仪成功绕过了加密。\n这篇文章进行了详细的记录。\n主要原理为:在系统开机启动过程中的某个时刻,加密芯片和 CPU 之间传输了未加密的信号。使用逻辑分析仪捕获该信号可以逆向出加密密钥。\n资源 监控网页信息变化的工具 changedetection,一个监控网站变化的工具。\n帮助用户密切关注商品打折、股票行情、政策发布等信息变动。\n支持通过网页可视化的方式指定监控页面区域。\n通过邮件、即时聊天软件、API调用等多种方式推送信息。可使用 Docker 部署,或者本地 Python 环境部署。\nSwitch 模拟器 Ryujinx 一个用c# 写的开源 switch 模拟器,该模拟器旨在提供卓越的准确性和性能、用户友好的界面以及稳定的版本构建。 ​​​\n文字缩写快捷键工具 为了减少打字量,国外这哥们写了个脚本将日常用语全部缩写了,只需敲入缩写字母,脚本自动完成完整句子的键盘输入。\n比如: st =\u0026gt; something ab =\u0026gt; about hw =\u0026gt; hardware sti =\u0026gt; sometime\n据小哥自己统计,使用这个脚本以后他已经减少了一半的键盘敲击量。\n项目名叫 compress 目前已开源,如果你有兴趣,改成支持中文也不是不可以。\nCanvas 手册 Canvas 是网页中用于图形绘制的基本元素,结合 JavaScript 可以实现各种复杂的图形效果和交互动画。我之前都是每次用到了的时候现去翻文档,对它的每个 API 都是一知半解。这里有一个Canvas 手册,详细介绍了 Canvas 的各种调用接口。适合希望深度使用及系统学习 Canvas。\n观点 “不要重复造轮子”是人为设置的一种限制 遇到需求不能满足的情况,是去“寻找轮子”还是“动手创造轮子”,这是两种不同的思维习惯。\n“寻找轮子”往往意味着寻找已有答案,将问题看为一种正常的状态,是“自古以来”、是“从来如此”。\n思维定势一旦形成,就很难改变,让人成了那个在沙漠中让美女帮他牵住骆驼的矮子。\n动手创造者往往是发现这种问题的人,他们不循规蹈矩,他们 Think different,是改变世界的人。\n“不要重复发明轮子”,这个原则用于工作中确实比较安全,他保证了不会浪费资源,并且避免了一定的技术风险。\n但也同时拒绝了伟大的创新。\n所以不要被这句话束缚,尽管去做自己的轮子。\n哪怕它一开始很丑。\n你的轮子必将使你与众不同,使你拥有不一样的视角,成为那个动手创造的人。\n订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-09-05T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/","title":"机器文摘 第 048 期"},{"content":"机器文摘 第 047 期 长文 业余爱好者痴迷于工具,专业人士注重技能 业余爱好者痴迷于工具,专业人士注重技能。\n以原声吉他为例。在数字音乐制作和合成器盛行的时代,这个单独演奏的乐器可能显得有点古老。然而,在熟练音乐家的手中,它变成了一个充满迷人旋律和触动灵魂的载体。它甚至可能为更大的创意提供灵感,如果你直接跳到现代合成器就有可能会错过这些。原声吉他的简单性促使艺术家专注于演奏的细微之处,完善他们的指弹技巧,并通过每一次弹奏传达情感。真正的魔力不在于吉他本身,而在于将其演绎得生动活泼的音乐家的技艺。\n这篇文章读来深有感触。\n在解决问题的时候,我总是忍不住问自己,我这个方法是最优的吗?我使用的工具是不是最合适/最好的?\n这种心理,常常使我陷入对最佳实践和完美工具的追求中,而忘记了解决问题本身。\n时间久了,工具积累一大堆,但每个都未曾发挥其真正作用,一边老工具在吃灰,一边继续寻找新工具。\n差生文具多。\n正如文章中所说:真正的高手明白,应当拿起手里已有的工具,先行动起来。在这个过程中如果有机会创造美好的事物,好的工具自然会出现在眼前。\nCPU 的指令分支预测 现代的 CPU 基本都具有指令分支预测的特性,通过猜测后续会执行的指令分支,提前运行一些指令和设置状态,可以有效利用 CPU 的执行资源,提升效率。\n不过,如果预测准确的话效率提升十分明显,但是如果预测错误,CPU 就要多做一些事情(刷新后续预测的指令和相关的状态),随着现代 CPU 中指令流水线越来越复杂,这种代价也变得越来愈大。\n在编程的时候,编写一些对于 CPU 分支预测友好的代码,能够对性能产生极大的影响。\n这篇对于 CPU 的分支预测,我们能做什么耐心地从 CPU 的分支预测机制讲起,通过具体的代码举例,讲解了怎样让编写的代码对 CPU 分支预测这类优化更加友好。\nSSH 命令详解 SSH 命令详解,一篇对 SSH 命令的参数介绍十分详细且易懂的文章。\n通过举例让我彻底弄清楚了基于 SSH 的端口转发。\n另外还知道了可以在已有的 SSH 连接上执行补充命令,以实现不断开终端的情况下将远程主机上的端口转发到本机访问。 ​​​\n资源 开源的房子 wikihouse,是一个开源房屋建造网站,房子的图纸、模型均可从网站上下载,里面有各式各样的房屋建造资料,任何人都可以据此增删、设计、制造、组装自己的建筑。可以理解为建筑界的 github。 ​​​\n关掉 Edge 浏览器新增的圆角样式 Edge 浏览器的最新更新里,给所有页面强制增加了一个圆角边框,看起来很不习惯(丑陋)。\n经过研究,我发现,如果想恢复到之前的样子,可以在设置外观选项里关闭该特性。\n我已经关闭,并果断给这个功能特性反馈了负面评价。\nHello World Hello World ,这个仓库收录了几乎所有编程语言(997种)的 Hello world 程序。 ​​​\n前端开发代码大全 30secondsofcode。\n这个网站有大量可复用的代码片段,主要是 Javascript、CSS、HTML 、Python 等语言的内容,可以覆盖 Web 应用开发全栈。\n里面收录的代码段或者文章都很清新,每个都配有细心的解释,具有良好的实用性。 ​​​\n关于 Win10 的锁屏睡眠时间 我在使用 Windows10 的时候发现一个问题。\n无论我将电源设置里的睡眠时间、显示器空闲关闭时间设置多长,锁屏后系统都会在 1 分钟之后关闭显示器。\n这会带来一些不方便,并且让人困惑。\n在经过一番研究搜索之后,找到了如下解决方案(Windows就是这么喜欢在注册表隐藏设置):\n1、打开注册表编辑器后。\n2、定位到:计算机\\HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Power\\PowerSettings\\7516b95f-f776-4464-8c53-06167f40cc99\\8EC4B3A5-6868-48c2-BE75-4F3044BE88A7\n3、修改右侧的Attributes 数值为2 (初始值为1)\n4、再打开“编辑电源计划”时会发现多了一个选项“控制台锁定显示关闭超时。\n红警2游戏整合包 红警2 的民间整合包,支持 win7 到 win11。整合大量资源,傻瓜式一键安装。 ​​​\n经过我的测试,前面链接页面里提供的安装包里带有额外的广告脚本,在使用时可使用 7z 等压缩软件直接打开该自解压包,选取主文件夹拷贝出来即可。\n观点 隐形的门槛 也许每个领域都存在一个隐形的门槛,无论是你学会一种语言,还是掌握一种能力,哪怕是打通一个游戏,只要你跨不过那个门槛,那么无论你尝试多少次,都会在同样的水平下无功而返。相反,一旦跨过后,那就是一马平川,你有了在那个新世界周游的能力。这当然不是说你不会再遇到困难,而是说,你不再有那种尝试了无数次,带着同一种感受离开的感觉。剩下的区别只是更多经验的积累,是熟练度的问题,因为你已经在那个轨道上了,你已经拿到了入场券。\n人生可以被隐喻成一个有着自然消退机制的RPG体系,累积10000经验可以升那关键的一级,那么先前你无论你多少次到达5000,6000,9000都不行,因为熟练度会反复消退到1000,2000的水平。而我知道,很多人就是无数次的卡在了那9000以内,但每次都要从1000,2000这个位置开始。这个和自我接纳也没有关系,因为你知道你遇到的困难并不是基于你对自己的苛求,你的困难在于你无法为自己在乎的事情付出真正的努力,无法将自己的活力与热情持续的灌注在同一个点上,但你隐约知晓跨过那10000的门槛,是你更重要的人生福祉。\n来自微博 @崔庆龙_\n订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-08-29T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/","title":"机器文摘 第 047 期"},{"content":"机器文摘 第 046 期 长文 Windows 的任务管理器 如果你喜欢使用 Windows 任务管理器来查杀那些不安分的进程,并且跟我一样讨厌他们乱跳(尤其在按照资源占用排序时)。你可以按下 Ctrl 键,它就会神奇地停止更新直到你松开 Ctrl。\nWindows 操作系统有一种魔力,就是哪怕你用了将近 20 年,还是会有你不知道的快捷键或者快捷操作。这些东西有时候能带来一些惊喜。\n具体介绍可以看这里:暂停 Windows 任务管理器\nLinux 内核最初版的解析 最新版本的 Linux 内核,其源码规模已经飙升至 3600 万行,想要深入细节去了解它十分吃力。\n而Linux 的第一个版本 v0.01 却非常小巧。\n刨去注释和空行的话,也就 8 千来行代码。\n这么小的代码结构,足够理解操作系统的精髓。\n这篇探索 Linux v0.01 d的内部结构,可以带你像参观历史博物馆那样去见证曾经的 Linux。\n我记录了一些有意思的地方:\n1、v0.01 只有 66 个系统调用,用于支持文件管理和进程管理,分别是:\n1 2 3 4 5 6 7 8 9 10 access acct alarm break brk chdir chmod chown chroot close creat dup dup2 execve exit fcntl fork fstat ftime getegid geteuid getgid getpgrp setsid getpid getppid getuid gtty ioctl kill link lock lseek mkdir mknod mount mpx nice open pause phys pipe prof ptrace read rename rmdir setgid setpgid setuid setup signal stat stime stty sync time times ulimit umask umount uname unlink ustat utime waitpid write 其中 mount 调用啥也没干,直接返回了。\n2、直接写死代码绑定 Intel 386 平台。至今对于 PS/2 接口的键盘、ATA硬盘、VGA显卡等标准硬件的驱动代码还是写死在内核里(而不是放在drivers文件夹)。\n3、系统崩溃处理代码只有 5 行:只实现了打印一句“我不行了”,然后进入死循环for(;;);。\nLLaMa.cpp 是怎样做到的? LLaMa.cpp 是一个令人惊叹的项目,在它之前没有人能够在低端消费设备上成功运行 Meta 开源的人工智能模型 LLaMa ,因为那需要太多的硬件资源。\n但是 LLaMa.cpp 的横空出世使得在 M2 Macbook Pro、Android Pixel5 手机甚至树莓派上运行 LLaMa 的 7B 模型成为可能。\n这是怎么做到的?\n带着这个疑问,有网友深入研究了这个项目,并写下了这篇How is LLaMa.cpp possible?以解释原因。\n作者认为主要得益于对模型参数的量化,降低模型参数的精度,从 FLOAT16 减小到 INT4。使得 LLaMa.cpp 能够以较少的计算资源甚至只依赖 CPU 的情况下加载大模型。\n逐渐觉得微软比谷歌良心 曾经微软是技术黑客的公敌,被不少人视为反对技术创新、技术开放的最大反派。\n不过随着时间的推移,以及微软逐渐在开源社区所做出的努力。这一现象有所好转。\n近期在 HN 上有位网友很扭捏地承认:现在他对微软的感觉要比对谷歌好很多。\n他列举了一些关于两家公司的对比,包括发布的产品、主观的优劣评价等等。\n为了抵制微软,他已经十多年没用 Windows 了,但貌似微软的其他产品“很香”(VS Code、Github、ChatGPT等)。\n并表示最近正在寻摸租一个云存储,大概率也会用微软的 onedrive 而不是谷歌的 Google drivers。\n对此我也有类似感觉,不过我对谷歌的不信任起始于十年前谷歌将 Google reader 停掉,而自从微软推出 WSL 后,我更是觉得微软在产品上越来越实在了。 资源 tailwindcss 的小抄 tailwind 这个 css 框架之所以能够很快流行起来,主要原因就是它解决了一个之前很多人没有太注意的问题,即 CSS 的“正交性”。\n之前 CSS 实现一个效果,可以有 N 种方法,外加各种奇技淫巧,但在使用 tailwind 之后,针对特定效果都有了最优实践路径,而且还可以很容易组合。\n不过由于它的类分的太细太碎,导致刚开始的时候会有一些不容易记忆。\n这里有一份 tailwind 的小抄,适合初学者收藏,方便随时查阅。\n在浏览器中运行的 vim vim.wasm,在浏览器中运行的 Vim,不是插件。\n使用 wasm 技术直接编译移植的 Vim Editor 源码,效果跟原生程序几乎一样。\n使用 WebAssembly 给 Vim 提供一个新的 GUI 前端(类似 GVim)。\n为了编译通过,作者在源码里禁用了很多 Wasm 不支持的特性,如:fork(2)、PTY 等。\n可在这里体验:https://rhysd.github.io/vim.wasm/\n无隐私问题的 pdf 工具网站 这个pdf工具可以尝试一下,跟其他pdf 工具网站不同,这个网站借用 WebAssembly 技术将很多工作放在浏览器客户端执行,用户无需上传自己的pdf到网站,即可执行处理工作,包括:加密、解密、拆分、合并等常用功能。 ​​​\n深入理解操作系统的小游戏 这个自称史上最极客的小游戏,是国外一位计算机科学教授给学生们写的一个小游戏,假设玩家是一个“操作系统”,在游戏里玩家需要不停地进程调度、内存页交换等操作,一旦调度不合理就会激怒用户导致“玩家”也就是操作系统被重启,游戏就 GAME OVER 了。\n游戏使用 Python 编写,作者将其编译为 WebAssembly 以嵌入网页,这里可以直接在线体验: https://drfreckles42.itch.io/youre-the-os。\n观点 学习技能最有效的练习手段是“复刻” 这是我前两天尝试用 CSS 临时写个页面效果想到的。\n我虽然也了解了CSS 语言的一些基本知识,但是在具体实操的时候仍会感到无从下手。\n与下棋类似,只知道“规则”但是没有“套路”。\n后来干脆找了几个目标页面,按照自己的想法去还原,渐渐能够摸到一些“套路”的边缘,最终实现了自己想要的效果。\n于是我想: 在学习一项技能的时候,“复刻”、“抄袭”、“借鉴”、“致敬”,都没有问题,应该把它作为最主要的练习手段。\n因为“抄”是最经济的学习方法了。\n不仅仅是编程技能,艺术方面更是如此。\n比如在编曲学习的时候有一种练习叫“扒带”,就是找一首歌,然后你通过你的工具和技巧制作一份完全一样的作品,尽量做到百分百还原。\n很多“大师”都是在这个过程中,遇到问题解决问题,领悟到很多只能意会不能言传的技巧,而这些领悟是无论如何也无法仅仅通过“看”和“听”获得的。\n另外,人们练字、绘画也是从临摹开始,一般在熟练之后才能突破,才又自成体系。\n忍耐守恒 怕麻烦的人,主要是不能忍受一些事情。\n然而正是因为这些不能忍受,所以注定要忍受一些其他的事情。\n人生就是这样,比如无法忍受投资带来的风险,就得承受现金贬值;不能面对创业的压力,就得忍受按时上班的束缚。\n对于这种现象,我将之称为“忍耐守恒”。 ​​​\n订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-08-22T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/","title":"机器文摘 第 046 期"},{"content":"机器文摘 第 045 期 长文 基于浏览器 JavaScript 堆快照的网页爬虫 基于 JavaScript 堆快照的网页爬虫。\n本文作者介绍了一个实现网络爬虫的新思路,据称已在生产上使用了一段时间,且效果不错。\n比较典型的网络爬虫在爬取数据时,大都采用解析网页 DOM 的方式,或直接通过 HTTP 请求流直接解析,或使用无头浏览器进行解析。\n但现在这项技术已经被很多网站、平台人为设置很多障碍,比如增加很多随机的嵌套等等。\n作者某天福至心灵,想到一个点子。\n利用浏览器提供的 JavaScript 内存堆快照功能,将内存里的全部信息扒下来,然后根据对应的 JavaScript 对象属性,按图索骥去找到真正需要的数据。\n这种方法比较狠的地方在于,直接从后台的数据结构下手,跳过了对页面 DOM 的分析和拆解,而且据作者说,网站即便想通过混淆此类数据在内存中的属性名称来进行防御,其工作量还是相当大的。\n所以,可能短期内无能为力。\n作者说,也许全面转为 Web Assembly 才能彻底禁止他这种爬虫。\n项目源码在这里\nIntel CPU 的“崩溃攻击”漏洞 intel cpu 有一个崩溃攻击漏洞,标识为 CVE-2022-40982,利用此漏洞可以在虚拟机里窃取共享同一个物理 CPU 的其他虚拟机的数据。\n这个漏洞可以让恶意程序在本机运行后窃取如密码、加密密钥、以及个人电子邮件等私人数据。\n恶意的云计算客户可以利用 Downfall 漏洞从与其共享同一台云计算机的其他客户那里窃取数据和凭据。\n据文章作者(也即漏洞发现者)所说,该漏洞存在于 Intel Core 6 代到 11 代 CPU,并且研究人员发现存在通过 Web 网页浏览进行攻击的可能性。\n作者开放了一部分用于测试攻击的代码在此\n利用树莓派的 GPIO 发射无线信号 原来树莓派的 GPIO 还能干这个,这位老哥使用树莓派的 GPIO 接口直接进行无线电波发射(没错,就是随便扯出一根线就可以当作天线了)。实现了基于树莓派的微型电台。\n这得益于 rpitx这个开源项目,项目本来是为了研究和学习一些无线电原理,不过后来逐渐成为一些 SDR 爱好者必不可少的工具了。\n我上次看到一个小哥使用 RTL-SDR 录制汽车遥控器信号,然后使用树莓派重复发射出来,成功实现了自家汽车的解锁。\n资源 water,一个在网页里模拟流体动画的 Demo,使用 Haxe 语言编写。源码在这里 Haxe 是一种跨平台的开源编程语言,在其官方网站上称其为\u0026quot;universal language\u0026quot;。\n它可以用于开发多种平台(如Web、移动、桌面等)的应用程序。\nHaxe 提供了强大的静态类型系统,并支持多种编译目标,包括但不限于 JavaScript、C++、Java、C#、Python 等。\n感兴趣的话,这里也有一份 Haxe 的在线教程\nFooocus,ControlNet 作者开源的一款新的 AI 画图工具 ,搭建起来比 Stable Diffusion webui 稍微方便了一点,相当于整合包。 原来 HTML5 有一个 \u0026lt;progress\u0026gt;\u0026lt;/progress\u0026gt; 标签,直接写这个标签,不加任何属性的话,就是一个加载动画,非常适合在页面里临时需要一个进度、状态展示的时候。 阮一峰老师的 Typescript 教程,发布了。 据老师自己说,刚开始也是抗拒的,觉得TypeScript 就是为 JS 语言添加静态类型系统。如果真需要静态类型,可以考虑使用其他更成熟的语言(比如 Rust 和 Java),再编译成 JS(wasm 模块),何必新学一门语言呢。\n但是后来发现 TypeScript 越来越流行,成为前端开发的主流工具,各种项目纷纷移植过去。\n我虽然对 TypeScript 仍然持保留态度,但是阮老师写的技术书籍读起来都很轻松易懂,所以觉得还是有必要收藏一下​​​。\nstable-diffusion-webgpu,在网页里运行 AI 画图模型。 基于 webgpu 技术,无需部署,直接在网页里运行。我试了一下,在我的 1080 8G 显存的显卡上 ,可以跑动,但是速度一般。\n上面的图是我只跑了 8 个 steps 的结果。。。 ​​​\n观点 AI 画图的品质 为了验证之前关于“模特很可能被AI取代”的想法,自己动手部署 Stable Diffusion webui 测试了一些模型。根据网友分享的提示词尝试生成了一些图片。\n感觉效果比我几个月之前体验时又有了不少提升,配合各种微调模型和 LoRA 模型可以生成照片质感和光影的图片。\n虽然人物表情和姿态还有些僵硬,不过我相信这是我没有合理调整各个参数以及充分发挥插件性能导致。\n多进行尝试和练习,应该能够生成更逼真、自然的照片。\n信息的维度 最近看了一些线性代数相关的知识,在向量、矩阵的各种计算中逐渐有了一些感悟:\n古代“老子”思想中的“道”很可能是无限维的,你的任何表达都是对它的一种投影,也就是降维了。所以才是“道可道,非常道”。\n每个人都想用最简单的框架去理解世界,将多维的信息硬生生地将为一维。\n这样的后果便是,盲人摸象、管中窥豹、一叶障目,不同的观点争得不可开交。\n所以在接收时也应该尽量按自己掌握的其它维度进行升维还原,任何信息都不可孤立看待。\n如果能从多维信息得视角去认知世界,也许会有转机,这多少就有点儿“阴阳互生、一分为三”的意思了。\n订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-08-15T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/","title":"机器文摘 第 045 期"},{"content":"机器文摘 第 044 期 长文 导致 Python 多线程鸡肋的 GIL 是什么 近期在使用 Python 多线程的时候,遇到了 GIL 全局锁导致的性能问题。\n具体来说就是性能提升没有达到预期,对于有些计算任务无法并行执行。\n从多核 CPU 占用结果上来看,像极了网上那张经典的围观图,一核干活多核围观。\n于是翻阅了相关资料研究一下,发现这是 Python 社区争论多年的问题,而且有很大的历史包袱。\n严格来说,GIL 全局锁导致的性能问题与 Python 编程语言没有关系,导致这个问题的原因在于具体实现的 CPython 解释器。\n当年解释器开发者为了简单实现对多线程的支持,搞了一个全局锁,以至于在多核时代无法充分发挥 CPU 性能。\n而后续又有很多库延续了这项依赖,历史的包袱(屎山?)越来越重,很难下定决心将之移除(据说代价甚至比当年从 Python2.x 迁移到 Python3 还要大)。\n如果不想深究具体技术细节只想了解基本的来龙去脉,这里有篇文章为什么 GIL 让多线程变得如此鸡肋?介绍了 Python PIL 的产生背景以及适用于 Python 多线程的业务场景,可以给你的技术决策提供参考。\n不过好消息是,就在刚刚(前几天),Python 官方终于宣布要动手取消掉 GIL 了,顿时网上一片沸腾(其实只有一部分人,大多数人都还不知道 PIL 是什么玩意儿)。而且,Meta 也承诺,愿意出工出力(3人年)帮助 Python 社区做针对去除 GIL 的相关开发工作。\n用树莓派做一个属于自己的高级收音机 最近接触到 SDR (软件定义无线电)这个领域,感觉挺有意思的。\n软件定义无线电是一种无线通信技术,它利用软件来实现无线电通信系统中的信号处理和调制解调功能,而不是传统的硬件电路。\n通过软件定义无线电技术,可以实现灵活、可配置和可重用的无线通信系统,大大提高了无线通信的灵活性和性能。\n传统的无线电通信系统通常使用硬件电路来执行信号处理、调制解调和频谱管理等功能。这些硬件电路通常是固定的,不能轻易更改,因此限制了通信系统的灵活性和可配置性。\n而SDR技术通过将信号处理和调制解调等功能以软件方式实现,可以在通信系统中使用可编程的处理器和通用硬件,从而使得通信系统的功能可以在软件层面上重新配置和调整,而不需要更改硬件设计。\n比起灵活性和可配置性来说,我觉得 SDR 最大的优势是成本大大降低。之前必须购买昂贵的硬件才能实现的效果,现在能够通过便宜的、少量的硬件加上软件模拟即可。\n我近期就以很低廉的价格购买了一套 SDR 设备,通过 USB 接口连接计算机,可以实现 500KHz到1700MHz频率范围的接收。听 FM 和航空频段不在话下,SW 短波的话受天线影响,我暂时没有调试出好的效果。\n跟 SDR 相比,我几千块买的旗舰手台显得既昂贵又功能弱。\n这里有篇文章是作者自己动手用 SDR 设备结合树莓派制作了一个看起来还挺专业的宽频无线接收机。\n其实这跟音乐制作领域内很多乐器、效果器逐渐被虚拟化的软件、插件代替是一样的。软件虚拟化拥有巨大的优势,随着通用计算硬件的成本越来越低廉,一切能被软件定义的最终都会被软件定义。\n家用 WiFi 路由器需要选择哪个“信道” 近期验证了一个关于无线路由器的传说。\n起因是我新买了一个树莓派 ZeroW 带无线版本,没想到板载的 WiFi 网卡天线太弱了。\n离路由器稍微远一点,比如放到卧室,传输速率就会大幅下降,我又暂时没能找到合适的外接网卡,一度陷入绝望。\n后来灵机一动,看看能不能从路由器那头想想办法,于是打开路由器配置页面,找到了 WiFi 的“信道”设置,将之从“自动”调到了最不常用的“13”。\n这里补充一下,WiFi信道一般从1到13,由路由器自动选择,但现在无线环境十分混乱,尤其是 2.4G(树莓派 Zero W 只能连这个规格) 频段,干扰很严重。\n但是 13 这个信道很少被路由器自动选用,原因是最初制定标准的时候,不是所有国家和地区都支持,也不是所有终端设备都支持,所以这个信道就成了最不常用的。\n在我手动指定信道之后,惊喜地发现,树莓派放在同样的位置,传输速率得到了较大提升并且稳定。看来传说将路由器 2.4G 信道设为 13 可以防干扰是真实的。\n什么是路由器的信道?信道设置成什么最合理?\n资源 开发人员路线图 是一个学习索引网站,旨在创建路线图、指南和其他教育内容,以帮助开发人员选择学习路径。在 Github 所有仓库中 Stars 排名第七。 ​​​ AudioGen facebook 开源的声音合成模型,可以根据文字描述生成对应的声音。效果已经很惊人了,这个页面展示了很多样例。我听了一下,觉得以后影视作品里的一部分声音特效应该可以通过 AI 进行生成了。至少像一些嘈杂的人群、婴儿哭声、鸟叫等各种背景音是可以合成的。 原来 Chrome 和 Edge 浏览器的 DevTools 里自带了 CSS 动画曲线编辑器啊!可以直接通过鼠标拖动进行调整和预览,十分便捷。 ​​​ Graphite,一个开源的 2D 矢量图形编辑器,适用于照片编辑、图像处理、图形设计、插图、数据可视化、数字绘画等领域。可以实现项目图稿,数据可视化和自动化。 观点 获取高品质信息的需求仍然强烈,只是被淹没了 三十几年前,电视逐渐取代书籍、报纸等传统媒体的年代,尼尔波兹曼写下了《娱乐至死》。\n作者认为:过度追求娱乐和娱乐化的信息传播方式可能导致公众思考能力的下降。\n然而这么多年过去了,人们在降低信息质量这条路上越走越远。电视也早已沦为老年人卧床的伴侣,电视节目更是无法占据现代人的时间,取而代之的是手机短视频。\n短视频已经成为大部分人闲暇消遣、信息获取的主要方式。这种媒体的变化将进一步降低理解和感受深度信息的能力,使人对深入学习和思考失去兴趣。\n虽然获取的信息看似在增多,但现在高质量的信息却越来越少。\n短视频等碎片化信息给我的感觉就像是无线电信号的背景噪音,现在的信息“电磁环境”早已被这种噪音充斥。因为“背景噪音”太大,就好像在高楼林立的城市里打开无线电,接收到的全是 LED 路灯和电动车充电器产生的噪波。\n不过我还是相信会有包括我在内的相当一部分人,不愿放弃主动思考,不屑于接收低品质信息。\n我正在努力做出一些尝试,以后逐渐记录下来:\n降低输入:减少刷碎片信息的时间; 滤波:使用搜索引擎、RSS服务、newsletter邮件等工具进行整理; 溯源:尽量选择信息源头获取一手信息,对于技术来说,直接阅读英文文档是一个办法; 创造:自己制作高质量内容; 摄影师不会被 AI 取代,但是模特很可能会 即便以后 AI 绘画能够产出更加难以分辨真假的作品。\n从目前能看到的各种生成作品来说,还是摄影师负责了主要的创作灵感。\n真要说被取代的话,也许“被拍摄对象”经过虚拟化以后,很可能被取代。\n以后不仅仅是举着相机的叫摄影师,说不定会诞生面向 AI 摄影这一职业。\n到时候器材党玩的不再是镜头,改玩显卡了?\n“嘿,你这 N 卡 比我这 A 卡有德味儿,毒!”\n订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-08-08T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/","title":"机器文摘 第 044 期"},{"content":"机器文摘 第 043 期 长文 先做框架再做功能 Before you try to do something, make sure you can do nothing.\n看到这句话第一反应是:这是什么 XX 逻辑?看完作者的文字之后,哦,这是一种软件构建的方法。\n意思是说,先宏观再微观,先整体再局部,别一上来就陷入到细节代码的编写中去。\n先把框架搭好,具体功能一个也别着急实现,留着占位,先搭一个“什么都不干”的架子,然后再逐渐补充功能。\n但也不是真的什么都不干,而是理清了各个关键组件的调用关系以及与开发相关的辅助功能(如打印调试信息)。\n这样做最大的好处是,随着功能开发的深入,代码不至于失控,而且具有良好的可调试性和组件问题隔离能力。\n随之而来的就是轻松写代码,而不是眉毛胡子一把抓。\n神经网络从开始到现在 The Document is All You Need!\n一篇 AI 科普好文章,用较为通俗的语言讲解了神经网络模型原理和发展历程(我感觉有些像生物的进化)。\n从最初的由神经元组成的多层感知机开始,然后进化到卷积神经网络 CNN 降低网络复杂度,再进化, RNN 循环神经网络给模型增加记忆能力,记忆能力太强也不行,到了 LSTM 开始让它能够遗忘,再到后面的 注意力机制以及 LLM 语言模型。\n比起同类文章,这一篇尽量避免了数学概念的推导和论证,尽量在不看公式的情况下解释基本思路,适合我等小白学习。\n代码审查的一些建议 5个关于代码审查的最佳实践,文章记录一些了对代码审查的实践建议,嫌长不看我总结如下:\n一次只审查一个功能特性或者错误修复。 提前准备好背景交代(在审查之前写清楚这么做的原因和基本思路)。 利用自动化工具提前做好静态检查,提前统一风格、规范。 利用提问的方式提出改进建议而不是直接喷,如:“我们真的需要这个断言吗?” 仔细阅读代码,慢慢来,以充分理解。 资源 微软的 ZoomIT 真是个经典工具,已经默默维护了好多年了,现在版本为7.0。体积小巧才1MB多点儿,绿色免安装,下载解压即用。非常适合进行共享屏幕培训讲解,或者录制教学视频。 ZoomIT 快捷键如下: Ctrl+1:放大屏幕,屏幕静止,然后使用鼠标批注; Ctrl+2:使用鼠标随意绘制批注,支持 r、g、b、o 等快捷键切换颜色; Ctrl+3:显示 BreakTime 倒计时; Ctrl+4:放大屏幕,屏幕继续支持鼠标交互操作,用于放大操作过程; Ctrl+5:录制屏幕,可与前面几个功能结合使用;\ndriver.js 一个压缩后只有 5K 大小的前端库,可以让你的网站或者 Webapp 迅速集成交互式“使用指南”的能力。 ​​​ clangjs 一个在浏览器编译、链接、运行 C/C++ 代码的 JS 库。支持 C/C++ 标准库。完全在本地编译,无需网络即可工作。原理: 首先把 Clang 和 LLD 编译为 WebAssembly 使其运行在浏览器中。然后使用 WebAssembly 版本 Clang 把 C/C++ 代码编译为 WebAssembly,最后通过浏览器 API 运行 WebAssembly。 附:clangjs源码\nnms,一个控制台程序,可以将任意命令的输出(ANSI TXT)文本转换成为乱码以达到防偷窥和加密的效果。通过命令管道使用:ls -l | nms ​​​ Icon Buddy,这个网站有超过 1 百万个免费 svg 图标,可在线自定义颜色。 观点 无法眼神交流不是导致远程办公沟通的最大障碍,语音延迟才是: 我之前一直以为远程办公给沟通带来最大的最大障碍是无法眼神交流导致的信息失真,想象着可以通过升级摄像头(比如嵌入在屏幕中)来改善这一情况。 但进行无数次网络会议之后,我体会到了最大的障碍还不是无法眼神交流,而是网络通信带来的(几乎是必然的)严重的语音延迟。 人们对声音延迟的感知和容忍限度大约在10毫秒(现在的电脑声卡在使用 ASIO 驱动之后可以轻松做到本地延迟 8到6毫秒左右,所以可以用于实时录音),大于10毫秒的延迟会带来明显的迟钝感,时间再长一些就会对对话的节奏带来严重影响。(如果体会不到的话,可以回忆一下新闻直播间主持人跟现场记者连线时那种说话总是对不上节奏的尴尬。) 什么时候网络视频会议的延时能缩短到10毫秒以内(唱卡拉OK可以接受的最低延迟),远程办公才能迎来质的飞跃,否则网络视频会议对于工作讨论永远都是隔靴搔痒、效率低下。现在的解决方案普遍还在吹能做到一秒(1000毫秒)以内,任重而道远。 ​​​ 现在真正的程序员用什么编辑器 ? 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-08-01T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/","title":"机器文摘 第 043 期"},{"content":"机器文摘 第 042 期 长文 从 CPU 到操作系统 整天使用电脑和手机却对它的工作原理一知半解?把你搁 CPU 里是一套不错的科普文章,作者保证你无论是否了解 CPU 的运作方式,读完之后都会有所收获。我原本以为主要讲解 CPU 组成原理,在浏览了一遍之后,发现 CPU 只是引子,后面还讲了很多操作系统相关的知识,很值得一看。 ​​​\n基于 GPU 渲染的 UI 界面制作 基于 GPU 渲染的 UI 界面制作,也是一个系列文章,探讨了使用 GPU 渲染用户界面的一些思路和相关技术实现方法。用 GPU 绘制用户界面不是什么新鲜事,事实上现在大部分游戏的 UI 都是基于 GPU 渲染的,不过这个作者讲的比较深入浅出,对基础介绍的比较多,适合我这种业外人士,读起来通俗易懂。\n为什么我们更应该使用 Display port 而不是 HDMI ? 为什么我们更应该使用 Display port 而不是 HDMI?,简单来说,HDMI 是家电行业制定的接口标准,封闭而保守,Display port 是 PC 行业制定的标准,开放又激进。现在的显卡上一般提供一个 HDMI 接口,仅仅是为了兼容而做出的妥协,不提供多个是因为 HDMI 授权收费。\ntxt 纯文本才是王道 喜欢老式合成器的操作方式,不用图形和触摸屏,而是用文本和字符进行交互,可以快速选择音色参数,指哪儿打哪儿,心中有数。\n喜欢在控制台的黑窗口通过命令行跟计算机交互,而不是用鼠标在图形界面上点击,不用将鼻子凑在屏幕上,闭上眼睛也能做到精确操作。\n喜欢单反相机的肩屏,无论我用什么姿势拨动拨杆、拨轮,肩屏总能用字符给我最快速最准确的响应,告诉我现在的曝光三参数是多少,做到心中有数。\n喜欢用 Markdown 文本格式记录信息,只因为文本格式最干净纯粹,利于保存和传播。\n这篇《txt纯文本才是王道》的作者表达了跟我同样的喜好,对于使用纯文本保存信息偏爱有加,认为无论是视频、图片还是其他数字形式,在文字面前都是弱小的弟弟。\n资源 Llama2-Chinese,Llama2中文社区!是一个专注于Llama2模型在中文方面的优化和上层建设的高级技术社区。 基于大规模中文数据,从预训练开始对Llama2模型进行中文能力的持续迭代升级。Facebook近期开源的 Llama 2 模型比较火,号称可以免费商用。我试了一下,效果不如预期,跟 ChatGPT 3.5 比起来还有距离。可能我使用的中文微调 Lora 参数还不够好吧。 githubunwrapped是一个帮你统计 Github 信息的网站,可以将输入的 Github 账号相关的统计信息生成一段漂亮的动画,展示你使用最多的编程语言、哪天提交的最积极、哪个时段工作效率高(根据文件修改时间?)等。比较有趣的是,这个网站生成动画视频的技术来自一个叫做 remotion的库,它可以使用 React 组件式风格编写动画效果,并通过 Canvas 实现视频文件的渲染。 lazydocker,继发现 lazygit 和 lazyvim 两个神器之后,我又发现了 lazy 家族新成员:lazydocker!同样是提供终端命令行下的“gui”界面,不过操作对象是 docker 这下管理容器终于可以不再看错乱的 docker 命令输出了。 ​​​ 观点 关于产品需求的来源:\n对于提供IT相关服务的从业人员来说,无论是在企业还是个人做独立产品,把握好产品的需求、做好产品定义是最关键的事情,是后续做研发、运营的基础。\n而好的产品定义=自己想做+自己能做+用户想用+愿意付费。\n这样的定义应该怎样去发现?\n拿软件举例,大部分软件能给用户提供的最大价值是“将一些事情自动化”和“将一些物理实体虚拟化”。前者能够通过自动化实现工作效率的指数级提升,后者则通过对物理现实虚拟化实现用户对交互体验的指数级提升。\n所以在分析产品需求进行产品定义时可以从身边三个方面入手:\n还有什么事情可以被计算机自动化? 还有哪些物理实体可以被虚拟化? 市场上的现有产品,还有哪些可以从上面两个维度提升以增强体验的? 我发现,无论是企业的产品,还是个人的独立产品,都可以从这些维度进行分析。\n基于互联网通道的“业余无线电”:\n不是很理解热衷于用互联网通道进行业余无线电通联的心态。\n今天刚知道现在有一些业余无线电爱好者使用一种叫做 mmdvm 的盒子(热点盒子)进行自主搭建数字中继。\n原理是“热点盒子”用家里的wifi接入互联网,然后热点盒子给业余无线电台提供UV频段的发射接收中继,这样就能轻易通联全国甚至全球的爱好者。\n目前很多拥有支持数字通信的电台的爱好者都很积极地参与这种通联,甚至每周还有打卡点名活动。\n我暂时还不是很理解这种心态。这种依赖互联网进行的通联在我看来(也许是暂时的)早已失去了玩无线电的初衷。如果我想要通过互联网假装进行呼叫,还得依靠家里的无线路由器,那我为什么不干脆使用微信电话?\n无头系统: 今天才知道原来我给自己配的远程开发环境有个专业术语叫做 “Headless 无头系统” 啊。我现在基本上可以做到带着笔记本随意移动,开发环境都在远程,在各处体验环境都一样。主要使用: Win10 + WSL2 + Nvidia-Docker + VS Code + Neovim。有时会启用远程桌面 RDP,有时直接 ssh + tmux。有兴趣的话我挑一期详解。\n订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-07-25T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/","title":"机器文摘 第 042 期"},{"content":"机器文摘 第 041 期 长文 C 也能一次编译到处运行了? 用 C 编写的程序,只编译一次,生成的可执行文件能同时在多个平台运行吗?\n这在以往是 java 这类依赖虚拟机执行环境的语言宣称的事情。\n然而我今天才听说还有这个神奇的库(好久没关注过c++领域的技术了):CosmopolitanLibc 号称可以使 C 成为一种构建一次就能到处运行的语言,就像Java一样,除了它不需要解释器或虚拟机。相反,它重新配置了GCC和Clang,以输出POSIX批准的多语言格式,该格式在Linux + Mac + Windows + FreeBSD + OpenBSD + NetBSD + BIOS上本地运行,具有最佳的性能和最小的占用空间。\n在使用的时候需要引入特殊的库和编译配置,具体执行效果我还没有测试。\n然后,这篇文章的作者干脆来个更方便的操作,他给 GCC 打了大约 2000 行的补丁,使得 GCC 直接就嵌入了 Cosmopolitan 库,现在可以在不修改任何源代码(前提是得用纯 C 写)的情况下构建出到处都能运行可执行文件了(Windows也可以吗?我要测试)。\n业余无线电入坑指南 业余无线电跟摄影、HiFi音响这一类的爱好在某种维度上非常相似,在“入坑”的境界上,甚至完全一样。\n这里的坑,指需要投入大量精力和资金。\n之所以这么说,是因为它们都有一个共同的特点。\n即围绕这些爱好有大量的知识可以学习和探索。\n比如拿业余无线电来说,上来就一堆“亚音”、“中继”、“频段”、“频差”、“杂散发射”等名词,对标摄影中的“构图”、“光圈”、“快门”、“ISO感光度”等名词。新手若想有所体会,单是这些概念就够琢磨几天的。更不用提后续还有逐渐步入玄学的一些操作流派,乃至一个不留神还会陷入无穷尽的装备升级竞赛。\n这类知识对于好奇心强烈、喜欢求知的人来说有着巨大的吸引力。甚至直白的说,我们很可能不是爱好这项技能,而是单纯喜欢探索和求知的过程,喜欢那种获得感。\n这篇《业余无线电新手指南》可以普及一些基本知识,愿意入坑的请阅读。\n我近期已考取了中国无线电协会的业余无线电操作能力 A 证 算是合法的 HAM 火腿了。\n远程办公还能成为趋势吗? 疫情的时候,远程办公、异地协同等概念一度变得很火爆,当时很多人觉得这又是一个风口。\n但随着当时极端环境的消失,各大公司又纷纷将员工从居家办公中召回。\n那么?此类与远程协作相关的概念破灭了吗?\n各种协同工具、平台相关的市场,还有没有继续扩大的可能,或者说还在等待一个巨大的技术革新来引爆?\n这里有个项目,积极收集远程办公相关的信息,包括国内支持的公司清单、工具及使用资料等。\n怎样做出伟大的成就? 昨日读了保罗格雷厄姆(《黑客与画家》的作者)新文章一篇\u0026mdash;-《怎样做出伟大的成就》(实际上我觉得可以译为“怎样牛逼”)。\n虽然标题看起来略有鸡汤味儿,但读起来还是比较实惠的。\n文章从发现和选择要做的事情开始,谈论了一些具体的方法。然后展开讨论了在方法执行过程中可能会遇到的一些问题,以及如何克服。甚至介绍了一些心理暗示技巧。\n文章比较长,我个人体会比较深的点如下:\n一个人做什么才能牛逼?答:做自己天赋里有的东西,就是找一些你既有能力又非常感兴趣的事情。 要养成“自驱”的习惯。让“工作”来源于自己的认知,而不是别人告诉你、让你做的事情。主动,而不是等待。 拥有一个属于自己的“项目”是一个找到“自驱”的最佳方法。不断观察自己对什么有强烈的好奇心(甚至好奇到大多数人不能理解)可以找到这样的“项目”。 选定要做的“项目”还应遵循兴奋原则,即:做自己愿意用的产品,写自己想读的故事,而不是执着于满足想象中的不存在的复杂需求。 注重积累效应,日拱一卒、长期积累,每天写一篇文字,一年下来就是一本书。 周期性审视自己做的事情,确认它是否偏离了目标(在做自己最想做的事情),及时修正。 行动的重要性,很多人实际上可以更牛逼,但是因为“谦虚”和“恐惧”导致的拖延使得计划一再搁浅,浪费了时间。 资源 jabbr.ai是一个针对拳击比赛的打击判定进行训练的AI模型,可以在智能手机上运行,实时监测视频中拳击选手的打击得分情况,即时进行统计,多个智能手机多视角同时运行可以快速生成总结性视频。模型提供约50种监测参数(质量、步法、压力等)可用于运动员训练分析。 浏览器地址栏快捷操作,我今天才知道原来浏览器地址栏还有这些快捷操作(火狐浏览器支持的最多,我测试的Edge浏览器也支持部分操作): 输入*星号,可以搜索你的收藏夹; 输入^,可以搜索历史浏览记录; 输入%,可以搜索当前打开的tab页; 输入?,可以显示所有搜索建议; ​​​ 树莓磁带 一种用树莓派做的小硬件,为了支持在老式电脑中加载程序(之前用磁带存储的那种)。 两招教你“永久”关闭 Windows 自动更新(任选一个都可以): 通过执行代码的方式:reg add “HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\WindowsUpdate\\UX\\Settings” /v FlightSettingsMaxPauseDays /t reg_dword /d 10000 /f Win+R 打开「运行」对话框,输入 cmd 后按下 Ctrl+Shift+Enter,在弹出来的命令行窗口中输入上面的代码,并敲击回车。命令里的 10000 代表停止更新的天数。 手动把电脑时钟日期改成 2050 年(为了防止时间自动校准,可以暂时断开网络),然后在 Windows 更新设置界面里面点击“延迟更新”,完成设置后再把电脑时间调回来就行了。 pkg-size,一个在线监测 npm 包大小的网站,可以实时查看一个 npm 包的真实依赖,网站利用了 web容器技术,直接在浏览器里执行 npm install 操作。 3e,一个 VS Code 插件,可以让你在编辑器里直接浏览 3d 模型,基于 webgl 实现。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-07-19T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/","title":"机器文摘 第 041 期"},{"content":"机器文摘 第 039 期 长文 关于写作的通用问题,“元技能”一般指比普通技能更高阶的技能,我理解为可产生技能的技能,此类技能并不会随着外部环境的高速发展而被淘汰。比如写作就算是一种元技能,当不知道该训练和提升什么技能的时候,将时间花在“元技能”的提升上准没有错。这篇文章主要讲解英文写作的常见问题,但是有些我觉得对于中文也适用。比如文章开头提到的两个基本原则:“在写之前就弄清楚自己想表达什么”、“即便是你已经写完了一整篇,如果没能表达你的意思那也是废纸”。 新电脑快还是老电脑快?,上周有博主在twitter发布了一个视频吐槽了一个我也困惑很久的事情。作者展示了他在一台古董电脑上运行Windows NT 3.5 的情况,视频中的电脑基本可以做到秒开程序,然后又展示了一台配备了Windows 11的Surface平板电脑,操作起来界面响应有明显延迟。后者cpu频率为前者的4倍,内存容量为前者的6倍。 现在的硬件性能动辄就比之前的老硬件几十甚至上百倍的提升,但是我们的交互体验呢?能够秒开的程序甚至还不如二十年前的老爷机。 后来这事儿在twitter引发了一些争议,有人认为现在的软件确实吃掉了硬件提升的性能,对体验来说提升不足。也有人说现在的体验与以往不可同日而语,这样的对比不公平也没有意义。\n博主不得不专门写了一篇文章来回应,详细记录了作者认为更加合理的对比过程。\n我个人认为首要原因就是随着硬件性能的提升,软件开发者的精力已经逐渐从性能向开发效率倾斜了。由于现在硬件成本确实低廉,软件迭代周期变得越来越短,软件开发者也越来越没有动力做出极致挖掘硬件性能的软件。\n不信你看,现在越来越多的应用程序不再使用原生开发,而是采用了可以“跨平台”的web技术。\n这样使得软件界面的响应直接下降了一个数量级。(我在使用vscode的时候甚至还会遇到打字卡顿慢慢弹出字符的情况。)\n另外,复杂的设计模式和软件架构,也吃掉了不少硬件性能,因为每增加一层抽象,都会消耗资源,而现在各种复杂的架构就是拼命地增加抽象层。\n希望以后市场能够鼓励开发者多做挖掘硬件性能的事情吧。\n文字渲染比你想象的要复杂,这篇文章的作者曾负责火狐浏览器的文字渲染引擎,他写这篇文字的目的是科普一下关于文字渲染的一些基本技术和困难。在阅读之前,我也简单的以为,文字渲染就是把对应的字符字形从字体库中取出来然后绘制到相应的位置即可,但实际情况确实比这要复杂得多。比如,文中提到的关于“连字符”的处理、“抗锯齿”、“书写方向”等问题,每一个都是开发者的头发杀手。 资源 rrweb,可在网页上记录用户行为并导出视频文件。可用于:排查用户错误、保险业务签署、内部风控、用户交互分析等。rrweb采用虚拟化转换DOM、记录变更和操作过程,并通过链表回放数据。存储最小化、回放可快进且跳过无效行为。 DragGAN-Windows-GUI,DragGAN(上周介绍过的开源模型,可以针对图片进行交互式拖动修改)的懒人包,解压直接用,内置17个模型。 ​​​ deep-sea,这个网页可以让你查看海洋各个深度都是有哪些生物,果然是越往下越看不清,所以大家就随便长长了,不讲究好看不好看了。 电子书《Elements of Programming》,这本老书在出版十年后推出了免费pdf版。中文译作《编程原本》,旨在介绍通用的程序设计原理和技巧,重点关注程序设计的基本元素和抽象概念。这本书的核心思想是将程序设计看作是一种构建和操作抽象概念的过程。它强调程序设计应该建立在数学原理和精确性基础上,通过抽象和泛化来创建可重用、可扩展和可维护的软件。 devpod,Github 的 Codespaces 和微软的 VSCode DevContainers 给开发者提供了即开即用的云端开发环境。现在,他们的开源平替来了,devpod 是一个开源的开发环境容器,可以方便地在任意客户端(Mac、Win、Linux)或云端主机创建体验一致的开发环境,并且可以与VSCode和Jetbrains等IDE直接集成。 从零开始训练大语言模型的最佳实践,训练大语言模型的技术白皮书,从基本概念和技术讲起,教你训练大语言模型。 windbg,一本电子书,讲了很多 windbg 调试器的高级用法,市面上很少见。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-07-11T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/","title":"机器文摘 第 039 期"},{"content":"机器文摘 第 040 期 长文 前端代码检查插件ESLint和美化插件Prettier的冲突 在使用VSCode等现代化编辑器进行前端开发的时候,很多工程样板都默认开启了代码检查和自动格式化的功能,其中以 ESLint 插件和 Prettier 插件为主。\n之前有一阵子我总是困惑这两个插件的区别,甚至如果配置不好的话,还会有冲突。\n比如 Prettier 插件会在你保存源码的时候按照既定规则进行“美化”代码,如去除行尾分号、增加表达式中的空格等等。此时如果ESLint插件的规则配置不同的话,编辑器就会报错并提示要进行“修复”,然而就在你“修复”之后,刚Ctrl+S保存之后,又傻眼了,因为 Prettier 又对代码进行了“美化”。\n我周末特意花时间研究了一下,梳理了一下这两个插件的关系以及他们的分工。\n首先,他们的职责定位不同:ESLint 用于检查代码编写是否符合某种预定义的规范,可以进行十分详尽的配置和多项检查,比如定义的变量如果未使用可以作为一种警告或者错误,其职责定位以检查为主。而 Prettier 的职责侧重于格式化(美化)代码,对于编写代码的样式如 tab 缩进量、行尾要不要分号、字符串用单引号还是双引号等可以进行统一格式化,一般用于在代码保存的时候进行快速统一样式。\n所以两者可以配合使用,但开头提到的规则冲突需要注意。\n我个人的习惯是,将两个插件的配置文件里的配置项进行匹配(规则调整为一致),因为我在美化时关注的项并不太多,所以编写这两个配置文件不算费劲。\n而网上有人提出了更好的办法,即通过扩展插件的方式,使得 ESLint 自动获取 Prettier 的规则,以自动统一两者的行为。\n关于 ESLint 和 Prettier 的具体分析文章和操作建议可以看这一篇文章:\n说一说我现在的知识管理工具和流程 Hacknews 上有网友说Evernote几乎辞退了它的所有员工,才想起来我已经有好几年没用过 Evernote 了。之前大概有将近十年的时间都在使用Evernote(但都是免费用户)。主要使用场景是记录个人的工作日志和借助浏览器插件剪藏一些值得收藏的文章。\n后来随着 Evernote 的限制越来越多,体验逐渐下降。我就迁移到了使用纯文本作为知识记录载体的路线上了。\n期间使用过 Emacs 的 org 模式,也尝试过 vim 的 wiki 插件,最后选择了现在这个 VSCode + GitHub 的方案,已稳定使用了两年时间。\n具体流程如下: 1、使用 VSCode + foam 、MarkdownAllinOne 等插件实现对 Markdown 的高效编辑,可以实时预览排版效果,foam实现了类似 Obsidian 的文章双向链接和知识关系图谱。我主要使用 Markdown 记录日志和编写知识卡片用于存放个人吸收的信息。 2、所有内容存放在一个 git 仓库中,同步到 GitHub 上的个人私有仓库,这样可以省去对接网盘的麻烦。 3、对于互联网上阅读到的有用文章,使用浏览器插件 Web Clipper,可以完整的抓取页面内容到指定的后端存储,这个插件我最喜欢的点是它可以将文章抓取到你指定的GitHub仓库,并作为Issue提交。 4、来不及看的信息就先抓取到 Issue ,然后等有时间进行整理,形成自己的知识卡片后再关闭该 Issue 。\n这套工具及流程的优点: 1、完全免费,不产生任何费用,而且体验不亚于收费软件。 2、自由度高,存储后端可以自己随意选择,如果嫌 GitHub 麻烦的话,可以自己用网盘同步文件夹。 3、纯文本载体,这个算是优点吧,格式开放,不会存在别的编辑器打不开的情况。 4、数据私有,数据随时都在本地(云端的仅作为备份和同步中转),不用担心 SaaS 供应商跑路(你看现在的Evernote)。\n欢迎大家讨论。\n资源 朋友圈截图生成工具,可以帮你生成逼真的朋友圈截图,可定制头像、评论、点赞个数等细节。收藏这个地址,以后再也不怕被群里晒孩子的家长或者搞活动的商家逼着发朋友圈集赞了。 ​​​ 86box,老式 x86 架构计算机模拟器,与 Virtualbox 等虚拟化技术不同的是,86box采用纯软件模拟的方式,实现了经典老式 cpu (如 AMD Am486DX4)的各种技术细节,甚至是当时的硬件缺陷(有些老游戏的 hack 需要这些缺陷)。可以完美复现一台上世纪 90 年代的经典 DOS PC ,用来复古怀旧游戏是再合适不过了。 fastllm,fastllm是纯c++实现,无第三方依赖的高性能大模型推理库(待测试验证)。据宣称:6~7B级模型在安卓端上也可以流畅运行,支持python调用,chatglm-6B级模型单卡可达10000+token / s,支持glm, llmam, moss基座,手机端流畅运行。 PhotoAI,作者说,他为这个网站大概写了14000行PHP代码,样式全写在了\u0026lt;style\u0026gt;标签里,JS全写在\u0026lt;script\u0026gt;标签里,除了jQuery没用任何框架,就连布局也是使用float:left这种老式的浮动实现。然而这个网站确能给他带来每月差不多 6万刀 的收入。这是不是在吹牛。这个网站的业务是:使用AI生成完全没有任何版权问题的各种人像照片。 Ironfish synth,用rust写的在线合成器,虽然感觉像个 Demo 但完成度很高,音源部分具有两个振荡器(可选正弦波、方波、锯齿波等)和一个噪波通道,滤波器、效果器齐全,另外还有一个可视化音序器。可基于键盘直接演奏。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-07-11T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/","title":"机器文摘 第 040 期"},{"content":"机器文摘 第 038 期 研究 ChatGPT的“奶奶漏洞”,奶奶漏洞来源自一个用户说他已经过世的奶奶是凝固汽油弹工厂的工程师,用户让 ChatGPT 用他奶奶说睡前故事的形式,详细介绍了凝固汽油弹的制作方法。以此来绕过 ChatGPT 的安全审查,结果当然是,他得逞了。后来还有网友做了试验,以同样的方式可以套取 Windows 各个版本的序列号。 国外也有“垃圾佬”,这篇《怎样低成本搭建深度学习电脑》的文章,介绍了作者怎样通过在二手网站上“捡垃圾”搭建出了性能良好且便宜的GPU工作站。 值得一提的是,作者购买的主要渠道竟然来自国内的著名二手物品交易平台,某鱼。 长文 回顾这些年软件研发的历程,凡是能够做成的软件,无一例外都是抓住了真正存在的需求。这样的需求未必很宏大或者华丽,但一定不是想象种的伪需求。仔细分析之后就会发现,在一个软件产品的生命周期里,开发者所面临的真正(或者说正确的)需求很少,因为找到它们十分不易,它们周边布满了被人们主观意识强加上的伪需求。《伪需求是糟糕软件的根源》,文章探讨了软件开发中存在的一个问题,即虚构的问题(我将之译为:伪需求)如何导致糟糕的软件结果。 有没有考虑过一个问题,即:为什么随着科技的发展和生产力的提升,人们不是越来越清闲,反而越来越劳累了?这里有篇文章探讨了一些深层次的原因,《狗屁工作》,此文写于 2013 年,作者是 David Graeber (一名人类学教授)。文章讨论了现代社会中存在的一种现象,即许多人在工作中感到他们所从事的工作毫无意义,没有真正的价值和目的。这些工作被称为\u0026quot;狗屁工作\u0026quot;,作者试图探究狗屁工作的存在原因和对个体和社会的影响。 资源 Sarasa Term SC Nerd,写中文Markdown文件的时候,最怕遇到表格,因为编辑器按照一个中文字符的宽度等于两个英文字符的宽度进行计算,而很多字体在设计时未考虑严格按照这种2:1的宽度比例设计字形,导致在Markdown在编辑状态时的表格分割线错位,看起来十分头疼。经过多方对比,我终于找到了让自己满意的等宽字体,支持中英文字符2:1宽度比例,中文为黑体,英文字符也特别适合写代码。此外还整合了Nerd fonts,支持在终端显示各种漂亮图标。 ReviewGPT 写作文、写报告、写邮件,生活中充满了各种写作任务。ReviewGPT 基于 gpt 模型,可为你的文章进行打分、评价,提出修改意见,甚至还可以扮演莎士比亚、金庸等知名作家,帮助你重新撰写,快速提升文章质量。 ​​​ try,刚发布的一个命令行工具,目标是允许你执行命令的时候先检查其执行的后果,然后再决定是否让命令真正生效。真正起到了安全保护的效果。官方介绍这个命令是基于 Linux 的命名空间(通过 unshare )和 overlayfs 联合文件系统等技术实现。并特别提醒并非基于沙盒,所以还是谨慎执行危险操作吧。比如try rm rf /*。 DragGAN, 通过拖动就可以完全操纵图像的 AI 模型,现已开放源码! DragGAN 是由谷歌、麻省理工学院和马克斯普朗克研究所创建的一种新的人工智能模型。可以让你轻松通过点击拖动等简单的交互操作就能改变拍摄对象的姿势、形状和表情。 ​​​ flameshot,一个超强的免费截图软件,可以像任何一个截图工具一样截图,最重要的是还有一些附加功能,按一下数字图标,就可以在屏幕上按数字顺序自动生成步骤图示,非常适合生成操作步骤说明。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-06-27T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/","title":"机器文摘 第 038 期"},{"content":"机器文摘 第 037 期 研究 SnapFusion 文本到图像的扩散模型可以从自然语言描述中创建令人惊叹的图像。然而,这些模型很大,需要高端 GPU 在服务端运行模型。SnapFusion提出了一种通用方法,可以在移动设备上运行的文本到图像扩散模型,且出图时间不到2秒。 Framer 发布了 AI 工具,直接根据文字需求生成页面,我试了一下,对于个人博客、产品介绍页面等静态展示类型的页面,生成的效果还是十分理想的,而且同步提供桌面端和移动端页面。 比#ffffff还“白”的“超级白”,这里有网友介绍了一个方法,可以显示更高对比度的二维码(以方便用户扫描识别),据说白的程度超出了sRGB颜色范围,前提是你的显示设备支持HDR。作者的思路是用一段HDR视频在网页中伪装成显示二维码的图片。 我在21小时内重启系统29万次,Linux 6.4内核有一个bug可能导致启动时挂起,但概率很低。为了复现bug,Richard WM Jones重启了29万次电脑,最终找到了问题。这让我想起了之前修改不容易复现Bug的艰辛。 我发现一个用chatGPT翻译整段文字的小技巧,那就是在他翻译完成之后,再将这段话发给他,让他根据通顺程度和合理性进行二次润色,出来的结果就好很多了。 Python写代码很爽,但是想打包发布成果的时候就稍微麻烦一些了,毕竟一大堆环境依赖和包依赖。我之前一直用的是PyInstaller作为打包工具,但是现在我又发现了这个Nuitka。它的打包原理是:直接把 Python 代码转成 C 代码再编译,这样打包出来的成果占用小、执行效率也高,尤其适合PyQt编写的桌面程序。另外,著名的 Blender 就是用 Nuitka 编译的。 长文 你买的每样东西都需要支付两次成本,这篇在Hacker News上的文章引起我的强烈共鸣。 它提出了一个有趣的观点,我以前从未意识到:\n每样东西都需要支付两次成本。\n通常,我们只关注第一次支付的成本,也就是购买时花的钱,比如买一台相机、一架钢琴或一本小说。\n然而,作者指出,如果你不支付第二次的成本,你之前花的钱就等于打水漂了。\n第二次成本指的是,你需要花时间和精力去充分使用你所购买的物品。\n比如认真阅读一本书,练习钢琴以提高演奏水平等等。\n然而,我们常常只停留在第一次购买时的满足感上,然后追求下一个。\n随着时间的推移,大量未支付第二次成本的物品使我们积累了一种无形的债务。\n为此经常感到挫败。\n这种挫败感促使我们寻求那些能够刺激我们的短期享受,比如玩手机、享用美食。\n进一步导致没有时间支付第二次成本。\n那么,有什么办法可以改变这种情况吗?\n作者说,唯一的解决办法就是控制购买欲望,强迫自己安排时间来履行第二次支付的责任。\n尽管这听起来可能有些不舒服,但如果我们能克服这种不舒服的临界点,例如学会一首乐曲,耐心读完一本书,我们将会获得意想不到的奖励时刻。\n资源 ratatype,在线键盘盲打指法练习,有完整的练习教程,从初级到高级都有。有点儿像Dos时代的著名打字练习软件TT,不过是网页版的。 0A.D.,帝国时代是个经典游戏,这里有个开源版,名字叫做0AD,由Wildfire Games开发,虽然是免费开源的游戏,但是效果和可玩性都非常高,适合在周末的午后来一把怀旧局。 landing.love,一个专门收集各种网页动画效果的网站,目前已收录超过400个具有新颖创意动效的网站,并配有截图和录屏视频。 infinigen,一款面向计算机视觉研究的3D场景自动生成器,提供多样且高质量的3D训练数据。基于Blender,免费且开源。可以通过重写随机化的默认参数来完全控制资产生成。提供了对自然界中多种对象和场景的生成器,包括植物、动物、地形以及火、云、雨、雪等自然现象。 8086-emulator-web ,用js编写的的8086 cpu模拟器,支持汇编语言在线编写、编译和调试运行,是一个学习汇编语言和理解计算机原理的好工具。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-06-20T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/","title":"机器文摘 第 037 期"},{"content":"机器文摘 第 036 期 研究 软驱阵列演奏音乐,国外大神用512个软驱、16个硬盘、4个扫描仪,组装成阵列,通过编程的方式控制电机震动发出声音,组成各声部。这么多软驱,让我想到了退休老干部合唱团。 大脑能像身体那样锻炼吗?,如何训练大脑?提高记忆力、注意力和智力!这个视频进行了讲解,总之就是,用进废退,改变日常默认行动,让大脑动起来。 用纯汇编写一个GUI,跟随这篇教学文章,通过编写图形界面的方式来学习汇编语言吧。顺便,作者想挑战一下,最小的GUI程序其可执行二进制文件能有多小。(现在的可执行文件动不动就好几十上百MB)​。 让 ChatGPT 帮我们总结 Hacker News,让AI每天帮我总结新闻摘要,这个想法我已经考虑很久了,现在已经有人做了实现。这篇文章介绍了一个开源静态网站的实现,它利用 ChatGPT 的总结能力,直接将每条Hackernews的新闻用一两句话总结出来,然后发布到GithubPages 可以节约我们每天看新闻的时间。 马斯克专访:推特的混乱过去了,现在的目标是最大化用户无悔时间!,我不喜欢看八卦,但是科技的除外。马斯克收购 Twitter 几个月过去了,大家还在等着看笑话,但是为什么没等到,以及开掉一半人之后效率却提升那么多? 资源 FinGPT,一个面向金融领域的开源语言模型,采用以数据为中心的方法,为研究人员和实践者提供易于使用的资源,致力于做金融领域的chatGPT。 Audiocraft,facebook发布的一个PyTorch库,用于音频生成的深度学习研究。目前,它提供了用于从文本生成音乐的MusicGen代码和模型。模型使用2万小时正版授权音乐训练。 Mercury,在 Jupyter Notebook 中构建 Web 应用程序,允许您在Python笔记本中添加交互式小部件,然后将笔记本发布为带交互界面的Web应用程序。我的感受是,Mercury就是 notebook版的gradio ​​​。 ReactPy,React是最流行的用于构建UI的前端框架,现在所有Python开发人员都可以使用它。比起gradio,这个reactpy的抽象层级更低一些,自由度更高了,我猜测目标用户应该是不喜欢写前端代码但是又希望掌控页面细节的python程序员。 GGML,一个用于机器学习的张量库,采用纯C++实现,无其他依赖项。旨在在普通硬件上实现大型模型和高性能。它同时也是 llama.cpp 和 whisper.cpp 的底层库。 Scrcpy,一个让人相见恨晚的app,可以通过USB或TCP/IP连接镜像Android设备的视频和音频,并允许使用计算机的键盘和鼠标来控制设备。它不需要任何root权限,并且兼容Linux、Windows和macOS操作系统。 Tafi,通过自然语言生成3D模型,质量号称接近AAA级游戏,可以导出创建的角色到Blender、Unreal 或 Unity中。 ​​​ canvas-editor,一个基于 canvas/svg 实现的富文本编辑器,在市面上,使用 Canvas 实现整个编辑器的开源项目并不常见,大多数情况下仍然使用 DOM 来实现。使用 Canvas 的最显著特点是其出色的性能,但实现起来的成本也更高。 markmap.js,一个用markdown文本制作思维导图的工具,提供了vscode的插件可直接在编辑器预览。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-06-14T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/","title":"机器文摘 第 036 期"},{"content":"机器文摘 第 035 期 研究 笔记帮我们记住还是忘记?这篇文章讨论了笔记对帮助我们遗忘的作用。作者认为,随着时间的推移,我们无法记住所有的事情,但是只要我们记录了重要的信息,就可以在需要时再次查找,因此笔记实际上帮助我们遗忘。 高保真神经表面重建,Nvidia 新发布的这个 Neuralangelo 有些猛,随便给一个视频就能进行精细3D建模,也许要不多久激光点云技术就要淘汰了。值得关注 ! Windows XP 激活算法被破解, XPKeygen是一个可以随意生成XP有效安装密钥的程序,当前的电脑可能用不到了。不过可能还有一些老旧的设备,只能通过 Windows XP 来操作,这时候这个东西就派上用场了。 一个整活儿的开源编辑器,data:text/html;base64,PGh0bWwgY29udGVudGVkaXRhYmxlPmVkaXQgbWU8L2h0bWw+ 把这个代码粘到浏览器地址栏,竟然是个记事本app,如果从IDE拷贝代码过去,竟然还支持代码高亮。。。。加入到收藏夹即可食用。 3D打印拯救海龟 ,2017年,伯奇水族馆与加州大学圣地亚哥分校图书馆的数字媒体实验室合作。他们一起创造了一种首创的3D打印支架,以固定她的外壳上的缝隙。现在,六年后,这种生物及其照顾者继续从这项发明中获益。这只海龟最近接受了年度检查,健康状况良好。 破解“智能”牙刷 国外一个博主记录了他破解自己的电动牙刷的过程。由于牙刷的NFC芯片采用的加密方式是密码加密,并且在通讯过程中是用了明文传递,所以他采取了截获通讯信号的方式窃听到了密码,然后就解锁了各种姿势开始为所欲为了。。。 真·AI相机 ,paragraphica 是一个没有镜头但是却有物理实体的“AI相机”,使用位置、时间等参数数据生成特定地点和时刻的prompt,然后由人工智能来生成“照片”。 资源 Droa,一个通过自然语言进行网站开发的工具,你只需要提需求,剩下的交给AI。 StableDiffusion-CheatSheet,经常用 Stable Diffusion 进行 AI 绘图的,可以看下这个开源速查表。里面拥有超过 700 种经过测试的艺术风格,可快速搜索查找各类艺术家,并支持一键复制 Prompt。 你一直想知道的关于数学的一切,此书是CMU数学科学系的博士生布兰登·W·沙利文撰写的,旨在引导读者进入抽象数学和证明写作的世界,帮助培养读者的数学思维和表达能力。主题涵盖集合、逻辑、归纳法、关系、函数、基数和组合数学等基础和工具。暂未有中文翻译。 Python进阶,是《Intermediate Python》的中文译本。2021最新目录版,实时更新托管在GithubPages。 CSSPro,一个所见即所得的在线CSS可视化开发工具,直接在页面运行,那里修改点哪里。效果真的很惊艳。 Plane,开源版 JIRA !不少软件开发者都使用JIRA进行缺陷管理,JIRA确实很强大,也很好用。现在,开源版的来了,据说完全可以作为JIRA的平替。 机器学习系统:设计和实现,一本关于机器学习的电子书,本书希望做成世界上第一本全面讲述机器学习系统知识的开源书籍。可以看作一门衔接机器学习和计算机系统的课程 ​​。 Callanie,练习英语口语的AI对话机器人,支持国内手机号注册,免费且流畅。后端基于大语言模型,可以陪你聊各种话题。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-06-07T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/","title":"机器文摘 第 035 期"},{"content":"机器文摘 第 034 期 研究 图解内存分配,文章展示了 C/C++ 编程中的内存分配过程,包括静态和动态内存分配技术、它们的优势,以及有效的内存管理所需考虑的事项。以图解的形式展示了内存分配过程,希望读者可以通过本文更好地理解内存分配相关的概念,并在实际编程中对内存进行更加高效的管理。 文件系统五十年,这是一个系列文章,详细记录了计算机文件系统的发展历程。也许我们身在其中无法感受到它的进步,但是回顾历史我们会发现,即便是我们不容易注意到的部分,也在不停地发展和优化。 只有512字节的C编译器,这篇文章介绍了一个怎样实现最小编译器的思路,SectorC (github) 是一个用 x86-16 汇编编写的 C 编译器,适合 x512 机器的 86 字节引导扇区。它支持 C 的子集,足够大,可以编写真实有趣的程序。它很可能是有史以来最小的C编译器。 上世纪50~60年代的计算机艺术,数字艺术的发展简史。 win10的隐藏功能,原来win10还有这个功能。按Ctrl + Alt + Del 后,按住Ctrl不松,再点击右下角的电源符号,就会进入紧急重启(Emergency Restart)界面。应该是一种强制重启。 资源 Ecoute,可用于远程面试作弊的工具?Ecoute 是一种实时转录工具,可在文本框中为用户的麦克风输入(您)和用户的扬声器输出(扬声器)提供实时翻译。它还使用 OpenAI 的 GPT-3.5 生成建议答复内容,供用户“参考”。 rask.ai,自动将视频转成“译制片”,在对内容进行翻译的同时,会尽量保持之前的音色和语调,端到端给你的视频完成多语配音,后续还会推出唇形同步合成。 Tango,一个Chrome浏览器插件,能帮你生成一个网站的操作指南。它会自动记录所有的操作流程,并做相应的截图和注解文档。你只需要点一遍就行了。目前还只能生成英文版的,不过自己翻译也不麻烦。可以节省不少时间。 WebGPU-torch,PyTroch的webgpu实现。我测试了一下,我的浏览器目前还不支持。 basic-english,“基础英语”的概念是:25,000个单词的牛津袖珍英语词典去掉冗余,并消除组合单词,90%的概念可以用850个单词来实现。使用这些基础英语可以简化日常工作和交流。 Web界面准则,讲解如何提升网页界面的交互性、排版、动画、辅助功能、优化和设计。 excalidraw,开源虚拟手绘风格白板程序,支持端到端加密在线协作。 沉思录 一切商业的本质都是:收购一些东西(包括原材料、人力服务),经过加工(加工过程产生价值)后变成产品或服务出售。这里的原材料可以是实体物品也可以是信息。所以关键动作就是:收、加工、出售,从重要性上来说,出售大于加工大于收。所以如果要策划自己的产品,解决和分析问题的优先级也应如此,我之前想的正好一反; 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-05-31T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/","title":"机器文摘 第 034 期"},{"content":"机器文摘 第 033 期 研究 全键盘信息终端 我一直很怀念使用黑莓手机的日子。\n物理全键盘的手感比起现在硬邦邦的触摸屏真不知道好到哪里去了。\n多少次盯着抽屉里的黑莓尸体,都在想有没有办法再次发挥它的余热。\n现在机会来了,有人将树莓派和黑莓手机的全键盘(带触摸板的那一款)结合起来做了一个终端。\n取名:Beepberry,具有400*200分辨率的LCD屏幕,和usb type-c接口。\n自己动手给树莓派写操作系统 学习操作系统的最佳手段是自己动手写一个。\n这类教程很多,一般都是针对x86平台,树莓派的比较少见。\n《给树莓派编写“裸机”操作系统》来自github上的一个开源项目。\n可以带你从树莓派的硬件层基础上直接构建一个的完整操作系统。\n关于 Demoscene 制作的一些文章 Demoscene(也称为Demo Party)是一种计算机艺术形式,旨在展示计算机的音频和图形表现能力。Demoscene通常是由小团队制作的演示性程序,也被称为demo,它集计算机程序、音乐、图形和动画于一身,是八十年代初期在个人计算机上发展起来的一种文化和艺术运动。Demoscene的主要目的是展示计算机和程序的美感,通常使用3D渲染和其他复杂的视觉效果,展示计算机的高级图形和音频处理能力。\n我对于如何制作这些炫酷的 demo 一直很感兴趣,但是网上关于这方面的资料非常少,成体系的就更少了。\n这里收录了一些比较经典的相关资料:\n64kb的demos介绍了基于SDF(Signed Distance Field,有符号距离场)生成三维网格的方法,这个方法是大部分demo用于在三维场景中产生三维模型的主要方法。\nThe_Art_of_Demomaking是一套很系统的教程,讲述Demo的概念、发展历史以及制作过程需要了解的基础知识。\npbr-book是一本关于基于物理的渲染(Physically Based Rendering,简称PBR)的经典教材。内容包括计算机图形学相关的基础概念、渲染算法、工作流程和高级特性等。\n怎样防止针对LLM的prompt攻击 就像之前流行的sql注入攻击,针对大语言模型的提示语注入攻击现在变得也很常见。\n一种比较典型的攻击场景是,通过一段特定的提示语,解锁chatGPT原本被封印的能力。\n或者对于接入了其他工具接口的语言模型,通过特定的提示语让其执行危险操作(如:删除所有信息)。\n这对于使用者来说可能危害不大,但对于服务的提供者是一个不小的挑战。\n《用于构建可以抵抗即时注入的 AI 助手的双 LLM 模式》提出了一种可能可行的解决方案。\n即使用双模型的配置,协同工作,将具有执行危险操作的特权模型放在另一个模型后面,中间使用过滤器进行风险审查,即未被审查的内容永远不会发送到特权模型。\n资源: gamma,AI帮你做PPT。支持自然语言描述需要生成的内容,自动给出ppt的大纲和每页基本的排版布局; 3blue1brown,YouTube上最好的数学科普视频,特点是使用动画直观展示计算原理; 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-05-24T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/","title":"机器文摘 第 033 期"},{"content":"机器文摘 第 032 期 长文 AI歌手的训练与使用 最近火了很多AI歌手(即:用AI模型模仿某位歌手的声音),其中b站上AI孙燕姿演唱的《漠河舞厅》、《撒日朗》等歌曲播放已超百万。\n为了研究实现原理,我也找到了开源工具体验了一下。\n具体步骤主要总结如下:\n选定某一个歌手,找到具有代表性的几首歌曲,通过Ultimate Vocal Remover软件利用AI做人声和伴奏的分离,主要用于获取干净的纯人声用于模型训练。(不得不说现在基于AI模型的人声、伴奏分离做的是真的强,可以做到非常干净的提取,让你感觉像是原始独立的音轨)。 通过安装so-vits-svc-fork这个一体化开源工具进行模型训练,具体方法见so-vits-svc-fork的Readme,从数据预处理到最后的模型导出和推理都已经做好了,甚至还提供了图形界面。 继续使用so-vits-svc-fork提供的gui界面进行操作,将模型载入,将预期修改歌曲的原唱人声(提取方式同第1步)传入,运行推理获得定制的人声(注意看文档的各种参数)。 将第3步推理所得干净人声,跟原唱分离的干净背景音乐进行混音合成,即可获得一首新歌曲了。 怎样用口袋计算器玩耍 在移动互联网时代,人打发无聊的方式实在是太多了,视频聊天、阅读各种资讯八卦、观看短视频、手游等等。\n功能机的时代,我有印象的打发无聊的事情是手机上的贪食蛇、发短信、wap资讯等等,也算不错了。\n如果时间来到上世纪七十年代呢?那个时代的没有随身携带的手机,怎么打发时间?\n答案是:如果有一个随身携带的计算器也行,这里有一本书《How To Entertain With Your Pocket Calculator》,出版于上世纪七十年代。书中花了大量的篇幅介绍了很多种基于数字的游戏,我翻看了一下,我觉得可能得无聊到一定的程度我才能愿意玩书里的游戏。\nLLM的几篇介绍文章 Large Language Model (LLM) 即大规模语言模型,是一种基于深度学习的自然语言处理模型,它能够学习到自然语言的语法和语义,从而可以生成人类可读的文本。 与其感叹以chatGPT为代表的大语言模型发展太快,不如静下心来,读一读关于LLM的一些基础知识和使用方法,我找了三篇比较有代表性的放在这里收藏。\n大语言模型综述,认真地概括并解释了什么是LLM和它的基本原理。 ChatGPT背后的语言模型简史,从发展历史上捋一捋各种语言模型的辈分。 prompt-engineering-for-developers一个中文版的 Prompt Engineering 教程,翻译自:吴恩达《ChatGPT Prompt Engineering for Developers》课程,主要内容为指导开发者如何构建 Prompt 并基于 OpenAI API 构建新的、基于 LLM 的应用; 大语言模型微调技术笔记,记录了基于 LLM 进行微调训练的实战技巧。 资源 sinerider,一个很有创意的数学学习游戏,让你通过数学函数构建图像从而帮助画面中的角色到达目标地点。 map-of-github,以节点地图的方式展示Github上面超过40万个仓库,通过虚拟大陆的方式展示他们之间的关系。 learngitbranching,以交互式游戏的方式学习git命令。 ,在线显卡博物馆,收藏了1982年到2012年之间发布的各款显卡,包括高清图片和规格参数的介绍; 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-05-16T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/","title":"机器文摘 第 032 期"},{"content":"机器文摘 第 031 期 长文 怎样驱动上个世纪的网络摄像头 国外有个老哥,在帮朋友收拾废品的时候,获得了一个老旧的摄像头。\n于是他按耐不住想感受一下,这个来自上个世纪的“古董”,还能打吗?\n由于年代比较久远,厂家也不再提供驱动程序的更新。\n哥们不得不在虚拟机里全新安装一个windows xp,成功启动摄像头,并获得“清晰图像”。\n安装xp时有个插曲:安装界面里的进度条仅用时几十秒就走完了原本几十分钟的倒计时(所以说微软的进度条是如何推断剩余时间的永远是个迷)。\n在经过一番体验之后,又跃跃欲试准备自己给它手搓一个在现代操作系统下的驱动程序。\n整个过程记录在《一个1999年的摄像头复活的故事》。\n整个故事都充满了一种“我不知道这么做有什么意义,但是我就是可以”的极客风格(也是我收录它的主要原因)。\nwebGPU 科普 最近谷歌浏览器率先宣布全面支持 webGPU ,预计到今年年底各大浏览器也都会跟进并提供支持。\nwebGPU 从名字上看跟显卡和浏览器有关,可是之前已经有webgl了,这次又有什么变化?\n通过多方面信息的搜索,我得到的结论是:webGPU 更充分地暴露了显卡的计算能力,GPU不再只是做图形渲染相关的事情,而是根据webGPU提供的相关专业接口,可以执行深度学习之类的更通用的计算工作。\n如果想了解的更全面一些,这篇《谈谈 webGPU》文章十分值得一读。\n作者对 webGPU 这一技术介绍的比较详尽,从各个图形接口的发展历史一直到对未来如何应用的展望,都包括了。\n如何翻译一本书 《从不自量力到 AI 助力,我如何翻译完一整本英文书》 这是一个关于执行力的故事。\n主题是:如何借助AI和现代信息工具,实现看似不可能完成的任务。\n在这个时代,个体的力量很渺小,因为个人几乎无法独立完成任何事情。\n但同时,借助科技工具和基础设施的力量,1 个人甚至可以完成之前需要一个上百人公司才能做到的事情,这让个体变得非常强大。\n如何刷路由器 V站上说,中年技术男有三大爱好:钓鱼、NAS、软路由。\n我一样也没沾边儿,但还是克制不住关注相关技术。\n之前多次想拿自己家的路由器开刀,刷一个openwrt系统,然后就可以各种折腾(科学上网、内网穿透等等)了。\n但是一直没有动手,今天看到这篇自己动手定制你的路由器写的如此详细,还是心动了一下。\n先收藏吧。\n仅用CSS+HTML实现三维动画 CSS 的 translate3d用到的不多。\n如果使用巧妙的话,可以帮你实现很出彩的 3D 动画效果,国外有高手在给自己的文章配数学公式的时候,利用CSS制作了一些可以动态显示的公式图表。这篇CSS 3D图表记录了它们的实现细节和技术原理。\n资源 window-swap,随机看别人家的窗外景色。这个网站每次刷新都随机显示一个网友共享的摄像头视角,一般是自家的窗外。可以随时体验全球各地的邻家风景。 foobar2000,经典的音乐播放器终于更新了。2002年发布的foobar2000播放器曾经是很多发烧友的最爱,如今过了20多年,居然更新了2.0稳定版,值得收藏; lost-at-sql,一个在线学习 sql 的交互游戏,通过游戏闯关的方式练习 sql 技能; glsl-exercises,在线学习glsl的交互课程,通过交互式页面练习 glsl 编写; gameuidatabase,一个游戏界面资源网站,各种游戏的界面截图,可以用来“借鉴”?; 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-05-10T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/","title":"机器文摘 第 031 期"},{"content":"机器文摘 第 030 期 下周五一假期,休息,不更新。\n长文 内网穿透的原理及实现 设想这样一个问题:在北京和上海各有一台局域网的机器(例如一台是家里的台式机,一 台是连接到星巴克 WiFi 的笔记本),二者都是私网 IP 地址,但可以访问公网, 如何让这两台机器通信呢?\nIPv4地址即将枯竭,IPv6技术还没有普及,现在很多家庭宽带都不再分配公网IP地址。这就意味着大部分的个人电脑是无法通过互联网被直接访问的(当然,你可以通过你家wifi或者4G信号访问互联网,但是反过来不行)。\n可是这种需求又真实存在,比如我就经常希望能够在任何地方访问我家里的电脑,通过远程桌面进行办公、文件共享等等。\n最简单的方法是通过购买一台具有公网IP地址的云主机来实现中继,这也是目前最普遍的方式。\n不过阅读完这篇《NAT 穿透是如何工作的:技术原理及企业级实践》,假如你有很强的动手能力的话,就应该可以实现一套完全不需要公网主机进行中继的“企业级内网穿透工具”。\n文章很长,来自这篇英文博客。\n技术写作指南 曾经在翻阅《程序员的数学》这本书的时候被朋友看到,于是诞生了短暂的讨论。\n当时我的观点是,作为程序员一定要掌握好数学,即便现在编程过程中已经不怎么用到特别底层的知识,但也应该多训练数学思维。\n朋友当时说了一句话让我记忆犹新。\n“比起程序员的数学,我更担忧的是程序员的语文。”\n确实,写作这项能力在很多技术人员心里是被低估的。\n不少人受尽写技术文档的折磨,于是越发讨厌写作。\n这篇《作为工程师应该如何写作》真是雪中送炭,总结了很多立即就能见效的技术写作方法,希望可以帮助到工程师朋友。\n怎样制作好玩的小游戏 很多人都有自己开发游戏的冲动。\n不过很容易掉进各种复杂的引擎和工具的坑里。\n然后感到沮丧,忘了想做游戏的初心。\n这篇《怎样制作好玩的小游戏》可以让你重新焕发精神。\n作者认为开发那种不用复杂引擎的小游戏也可以很欢乐,只要有足够的游戏性。\n他在文章中详细列举了想要制作出真正具有游戏性的小游戏所必须具备的几点关键特性。\n看得出来,作者是懂游戏的。\n神奇的一页纸知识管理 宇航员在太空中找到的方法一定不会错,因为他要是出错就没命了。 航天员的秘密武器,One Pager。就是把一个专项的知识,都写和画在一页纸上。日积月累,宇航员有了一本手册,里面都是一页一页的one pager。 我向来对知识管理的各种方法很有兴趣。\n在网上闲逛时看到这篇《神奇的One Pager》,讲述了一种通过一页纸进行知识管理的方法。\n热爱学习的人可不能错过。\n资源 buzz,Transcribe and translate audio offline on your personal computer. Powered by OpenAI\u0026rsquo;s Whisper. 可视化提示词拼装,文生图的AI越来越多,自己也可以在本地搭建服务,可是为什么我自己生成的图片那么丑呢?这个工具也许可以帮你生成一些靠谱的提示词。 LangChain 中文入门教程,众所周知 OpenAI 的 API 无法联网的,所以如果只使用自己的功能实现联网搜索并给出回答、总结 PDF 文档、基于某个 Youtube 视频进行问答等等的功能肯定是无法实现的。所以,我们来介绍一个非常强大的第三方开源库:LangChain 。 clock,一个非常酷的网页时钟显示效果。 WebGPU 理论基础,从基础理论开始学习WebGPU,稳! 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-04-26T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/","title":"机器文摘 第 030 期"},{"content":"机器文摘 第 029 期 长文 计算机的“中断”机制是如何实现的? 稍微了解过计算机原理的朋友都知道,计算机是通过“中断”的机制实现对键盘输入、鼠标移动、硬盘读写等操作的。\n让我给小朋友讲解这些基本的知识时,我也可以侃侃而谈,说上半个小时不带重复。\n但是真要解释“中断”的机制是如何实现的,我想即便是现在科班出身的本科生也未必能够说明白。\n原因我觉得除了缺少实践之外,也跟大部分书上的理论内容离实际工程较远有关。\n这篇漫谈中断从实际的硬件实例(x86)出发,详细介绍了中断的实现机制,普及了“外部中断”、“内部中断”、“软中断”等概念,以及人们怎样通过“中断控制器”逐渐解决了多设备中断处理的问题。是一篇很值得阅读的科普文章。适合对计算机组成原理、操作系统等技术有兴趣的朋友阅读。\n怎样提升软件项目的可维护性? 不同的项目团队对于软件项目的可维护性所做出的努力不同。\n有不少团队宁愿在修改bug上加班加点,也不愿意为可维护性多花一丁点精力。\n不过,如果你要开始一个新的软件项目或者想要改善一个已经存在的项目的可维护性。\n这里有一份软件项目可维护性检查清单可以参考。\n作者主要从版本控制、软件测试、静态分析、依赖库管理、多语言支持、多平台支持、开发环境管理等方面给出了可以改进的行动清单,以及基于开源工具的最佳实践建议。\n怎样榨干chatGPT? ChatGPT是由OpenAI训练的一款大型语言模型,能够和你进行任何领域的对话。\n现在跟年初账号紧张的情况比起来已经方便了很多。\n在这么多开源工具和套壳网站的帮助下,我想现在大部分人都能够比较方便的体验它了吧。\n但是可能很多人还不知道如何更好的发挥它的作用。\n有网友整理了一份开源的chatGPT中文调教指南,内容极为详尽,可以帮你榨干chatGPT的全部潜能。\n怎样让AI作画理解你的意图? 对于现在强大的AI绘图应用,有些人可能会认为只输入一个单词就能生成一张很酷的图片。\n然而,虽然AI模型越来越善于理解我们想要的内容,但它们还不能读懂我们的思想。\n因此,如果你想生成一张看起来像你所想的那样的图片,你需要编写正确的提示。\n这个AI绘图prompt编写指南可以给你提供一些帮助。\n资源 维修指南,各种设备的维修教程大全,详细到每一个步骤的照片,设备型号齐全; glsl-CNN,有大神用glsl语言,仅通过webGL的片元着色器实现了一个手写识别的CNN神经网络。可以在浏览器直接体验,效果惊艳。 dinov2,Meta AI新发布的全能视觉模型,模型支持:图像分类、分割、图像检索和深度估计。比较厉害的地方在于它是一个自监督模型,直接从图像中学习特征,而不依赖文本描述,即可训练计算机视觉模型。 minigpt-4,GPT4 的图像支持迟迟不开放,这个开源的MiniGPT4 却已经做到了类似的多模态效果,官方演示看起来非常棒。只用了四张A100训练了10小时,模型甚至只有13B。 street-fighter-ai,有个B站UP主在GPT的帮助下, 写了个 强化训练的AI模型,终于打败了街霸里的 AI,实现了儿时的梦想。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-04-19T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/","title":"机器文摘 第 029 期"},{"content":"机器文摘 第 027 期 长文 搭建本地AI作图应用 AI对话机器人火爆的同时,去年由Stable-Diffusion模型引爆的AI作图技术也没有放慢进化的脚步。\n这里面的佼佼者Midjourney已经发展成了强大的图像生成系统。可以轻松定制出照片级图像,其效果足以乱真。\n不过目前在国内使用Midjourney还比较麻烦,即便能够访问,使用量也会受限制,能否自己搭建一个呢?\n答案是肯定的。\n跟去年刚问世的时候不同,现在基于Stable-Diffusion模型的生态也已经十分完备,很多开源软件、框架、插件围绕这个模型开发。\n利用这些软件可以快速在本地计算机上构建一套属于自己的图像生成服务。\n这里有一篇博客以手把手的方式教你如何在最快速的时间搭建自己的图像生成服务。\n里面还列举了一些微调好的定制模型下载地址,合理的使用这些模型,你会发现打开新世界的大门。\n搭建本地chatGPT应用 本来不想再提chatGPT了,因为最近说的有些太多了。\n但是无奈当前的开源生态对于语言模型是在是太追捧了,技术发展迅雷不及掩耳。\n很快就出现了一批可以自己搭建的AI对话模型。\n今天我挑两个我认为效果比较好的(且对中文支持比较好的)介绍一下。\n注意,跟目前流行的基于OpenAI的接口进行套壳的程序不同。我说的是完全在本地搭建自己的服务。\n第一个:ChatGLM-6B,一个具有62亿参数的中英双语语言模型。通过使用与 ChatGLM(chatglm.cn)相同的技术,ChatGLM-6B 初具中文问答和对话功能,并支持在单张 2080Ti 上进行推理使用。\n搭建过程比较简单,按照README文档中的步骤下载模型、执行脚本程序即可。\n第二个:中文 LLaMA \u0026amp; Alpaca 大模型,开源了中文LLaMA模型和经过指令精调的Alpaca大模型。这些模型在原版LLaMA的基础上扩充了中文词表并使用了中文数据进行二次预训练,进一步提升了中文基础语义理解能力。同时,在中文LLaMA的基础上,本项目使用了中文指令数据进行指令精调,显著提升了模型对指令的理解和执行能力。\n搭建过程略微繁琐一些,需要通过自己的手段下载到开源的LLaMA原始模型(当然这对于技术人员来说不是问题)。\n然后按照文档中的教程,执行模型合并、量化等脚本,最终通过开源程序LLaMA.cpp实现模型的本地运行。\n合作运行千亿参数级语言模型 按照众人划桨开大船的思路,之前在带宽不足的年代诞生了BT下载。\n如今,当我们的本地显卡无法应付超大AI模型时,有人开始用同样的思路解决问题。\nPetals就是这么一个分布式模型微调、运行的框架,可以让你轻松在家运行超过千亿参数的大模型(当然是在线跟大家一起协作)。\n其原理是大家分别加载模型的一小部分,然后与其他人一起通过协同的方式进行推理或者微调。 资源 Prompt Engineering 教程,一份教你如何更好使好地使用 ChatGPT 和其他 AI 产品的免费教程。 Prompthero,跟聊天机器人、绘图机器人交流的prompt大全,与上面的教程不同,这是一个模板库大全,有创作灵感但是不知道该如何描述的时候可以去参考一下。 Civitai,与上面相同,不过专门用于图像生成,而且路子比较野,有大量的NSFW内容,要搭配Stable-Diffusion的各种微调模型使用。具体使用方法,可参考前文中介绍如何搭建本地图像生成服务的部分。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-04-12T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/","title":"机器文摘 第 027 期"},{"content":"机器文摘 第 028 期 长文 极简代码理解 GPT 模型结构 在twitter上有网友发布了一个简单的示例代码,讲解了 GPT 语言模型的运行原理,为了方便大家理解,作者用了极简的模型设置,即语言文字只保留了1和0两个字符,上下文长度也仅为3,可以很直观地感受到训练过程是如何起作用的。\n作者提供了托管在colab的python源码,可以在线体验。\n用开源语言模型训练自己的数字化身 随着开源语言模型的训练和微调变得越来越简单,果然有人开始整活。\n已经有网友通过自己的微信聊天记录和博客文章训练出有自己风格的AI。\n作者使用目前对中文支持最好的开源模型 chatglm-6b 作为预训练模型(我上期介绍过它的部署和使用)。\n经过一番折腾后终于训练出还算凑合的模型。\n我们的世界离《黑镜》中的黑暗故事越来越近了。 四十年工作经验程序员的职业建议 国外有位“老程序员”退休了,是真正的到了退休年龄的退休。\n他从1981年入行,直到去年退休。这期间他做过各种开发,跳过槽也被辞退过,打过工也创过业。\n这不容易。\n所以,他决定以“一个退休程序员”的身份分享一些心得。\n摘抄部分要点如下:\n保持开阔的眼界:每天花时间获取真正的资讯,看到趋势,在事物流行起来之前发现他们。 保持学习:不要拒绝和敌视新技术,要为你所用。 要有自己的项目(做一些真正的事情):作为程序员不要浪费聪明才智和外部资源,要学着开始一个自己的项目。\n进入心流的入口 进入心流(Flow)状态是一种很忘我的体验,也是知识工作者高效产出的必要条件。\n有不少创作者都体会过那种全身心的投入并且忘记了时间的感觉。\n一旦进入那种状态,很多问题能够很快得到解决,大脑飞速运转并且不会感觉到劳累。\n这种状态最忌讳被打断,因为一旦打断,再进入就会比较困难。\n这里有篇文章介绍了一些小技巧,可以让你在不得已中断心流之后,能够比较快速地恢复状态。\n作者将这些技巧比喻为高速服务区进入主路之前的加速匝道,姑且称为进入心流的入口。\n资源 Spline,一个免费易用的 3D 设计工具,可实时协作,提供了丰富的物料库,可以基于它来快速创建有趣的 3D 场景,支持处理细腻动画交互,此外还可以导入本地模型和声音素材,支持到处多种输出格式包括WebGL、视频、链接等,很适合新手。 Draw With Flowers!,在threejs里用着色器语言编写的一个特效demo,可以随着鼠标移动绘制绚丽的花朵。 React 源码阅读,一本开源电子书,通过阅读React的源码来详细理解前端框架的原理。 Codeium,Github copilot 的免费平替,提供vscode、vim、neovim等常见编辑器的插件,我试了一下,效果可以接受。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-04-12T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/","title":"机器文摘 第 028 期"},{"content":"机器文摘 第 026 期 长文 通用人工智能要来了吗 AGI(通用人工智能),即用一个模型解决全部问题,而不是特定领域的问题(如语音识别、图像分类等)。\n我在几年前读过一本叫做《人工智能,人类最后的发明》的书。\n书里说AGI就是人类最后一个发明,因为有了它,别的一切都不需要了。\n当时感觉距离通用的人工智能还很遥远,觉得作者有些危言耸听。\n直到今年,chatGPT和GPT-4的发布,我才发觉AI的势头确实有些猛得出乎意料。\n《 GPT-4 ,人类迈向AGI的第一步》是一篇近期论文的翻译,该论文由微软研究院发布,论证了当前的 GPT-4 模型已经初步具有 AGI 的苗头。\n论文内容十分详实,看完很震撼。\n摘录部分文字如下:\n对话 \u0026gt; 马克:我不喜欢你昨天晚上对待杰克的方式 \u0026gt; 朱迪:你看到他在做什么了吗?他打了他哥哥的头! \u0026gt; 马克:这并不能成为你对他大喊大叫的理由 \u0026gt; 朱迪:你想让我怎么做?让他打他的弟弟,然后什么都不说? \u0026gt; 马克:不,我不同意 \u0026gt; 朱迪:那你为什么要为他辩护? 提问:马克的意图似乎是什么? GPT4: 马克的意图似乎是要表达他对朱迪处理与杰克关系的方式的不满,并建议她可以更加冷静和尊重。 ChatGPT:根据谈话内容,马克的意图似乎是为杰克的行为辩护,并表达他对朱迪对待杰克的不满。 提问:朱迪如何看待汤姆的回应? GPT4: 朱迪认为他的评论是对她的分析能力的攻击,也是对杰克的不当行为表示同情的表现。她的反应是防御性的和愤怒的,并质疑马克的动机。 ChatGPT:如果没有更多的文字,我不可能准确判断朱迪是如何接受马克的评论的。然而,根据朱迪的回应,她似乎并不同意马克的观点,而且可能对他为杰克的行为辩护感到沮丧。\n用 GPT-4 帮你编写一个游戏 我第一次见识到 ChaptGPT 的编程能力之后,就基本离不开这个工具了。\n现在我几乎每天都在它的辅助下编写代码。\n不过,这里有个老哥更过分。\n他让 GPT-4 模型帮他做出了一个3D太空赛跑游戏。\n作者本身没有游戏编程经验也不懂Javascript,但是通过跟模型一点一点对话,反复将调试代码生成的错误信息反馈给模型,逐渐完成了一个完成度还挺高的游戏。\n搭建基于私域数据的ChatGPT ChatGPT 超强的对话能力怎样应用到私有数据上?\n比如说我希望做出一个基于 ChatGPT 模型的专属客服,要吃透我的产品信息。\n官方提供的训练API和微调(fine tuning)指导相对复杂一些,对于AI模型的微调不熟悉的人员还不够友好。\n这里有一篇“零基础”教程《搭建基于私域数据的ChatGPT》,可以带你走一下流程,感受一下定制专属模型的步骤。\nAI令人焦虑 这篇《AI狂飙的时代,人还有价值吗?》是一期语音播客的文字转译,因为内容比较精彩,所以也收录在这里了。\n我觉得取代不是一个好的词儿,因为取代是一个非常容易反驳的词儿。我可以说我仍然会干什么什么,AI干不了,所以它取代不了我。 但正是这种字面上的抬杠,使得问题的本质被掩盖了,因为AI在人的生活中的渗透是一个逐渐的过程。 百分之百地取代你可能仍然不会发生,可是它也不需要百分之百的取代掉你,只要50%的取代掉你的某些工作职能,AI就会对就业市场形成非常大的冲击。 我有一个纽约的律师朋友,他是很早就开始用这个东西。 他本身不是一个技术人员,他是一个标准的文科生,平常的用一个新软件都要紧张半天的那种人。 但是他开始用这个之后,因为律师的工作是很大程度上是依赖于文本的,而文本是GPT的长项,所以他就开始用。 之后,我就问他说,所以你真的开始辞退你的员工了吗?因为他自己是一个律所合伙人。 他说我还没有真正开始辞退任何人,但是我确实打算今年暑假不用再招实习生了,因为给我省下的活完全可以让我腾出手来做一些事,以至于我可以省下招一个实习生的AD account。 这就是一个真实的影响对不对? 它没有真正取代什么东西,但是它仍然冲击了一个真实的就业市场上的职位。\n我觉得AI对我们社会的影响会以这种方式出现,它不会马上一下子让你这个人变得没有意义,但是它可以让三个人的活,两个人现在能干完,多出来那个人就没有存在的必要了,所以老板就可以把他开掉。 它并不是百分之百取代的人的方式来逐渐进行的,而且这个事情是非常真实的。这也是为什么我觉得很多人对冲击仍然没有做好心理上和事实上的准备。 其实有点令人忧虑的原因就是,如果你今天还用一种这东西,都是媒体的炒作来对待这个问题,你就很可能会在真正的影响你切身生活的冲击到来之前,没有做好对自己来说比较有用的帮助。\n读完这篇文章,我的感受是,没必要焦虑,不是AI没有威胁,而是焦虑也没用,蒸汽机车发明之后,超越马车就只剩下时间问题了。\n资源 无限制下载器,只要能播放就能下载,能够帮助下载视频网站内容的浏览器插件很多,大部分都是通过嗅探播放地址来实现的下载,网站也会采用各种加密手段来进行阻止。但是这个油猴脚本采用了另一种思路。你网站防再死不能不让观众看吧?脚本几乎采用了类似录屏的手段来进行视频下载。对于一些实在想要下载的内容,可以考虑试试这个插件。 帮你本地运行 LLaMA 模型,只需一行命令就可以让你在本地运行 LLaMA 模型,轻松感受在本地单机上运行大规模语言模型的魅力。 微调 LLaMa 模型的工具,既然都能在本地运行了,那就再给力一些,这个工具可以让你很方便地使用自己的数据训练 LLaMA 模型。 Docker Compose 容器组合最佳实践,Docker有多好用不用再说了吧,这里有一堆使用Docker Compose编排容器的模板,收录了很多十分有用的容器镜像组合,可方便快速的搭建各种业务(如:单点登录、VPN、媒体管理、文件共享、博客、维基、社交网站、项目管理等)。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-03-29T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/","title":"机器文摘 第 026 期"},{"content":"机器文摘 第 025 期 长文 252个字节实现播放音乐和动画 这里有个网页介绍了一个demo作者使用一段JavaScript代码实现了一个一边播放俄罗斯方块背景音乐一边播放字符动画的网页,原理是利用HTML5的AudioContext对象进行声音合成,通过定时器触发基于当前时间t值的不同频率,实现音乐播放。具体代码如下:\n1 \u0026lt;body onclick=\u0026#34;with(new AudioContext)with(o=createOscillator())connect(destination),start(setInterval(v=\u0026gt;innerHTML=\u0026#39;TETЯIS\u0026amp;#\u0026#39;+(9624|(o.frequency.value=`RR\u0026gt;AIIA\u0026gt;777${d=\u0026#39;ARRIA\u0026gt;\u0026gt;\u0026gt;AIIRRAA7777\u0026#39;}IIIWnnbWRRR${d}`.charCodeAt(++t%58)*4)%7)+\u0026#39;P01\u0026#39;,t=232))\u0026#34;\u0026gt;click 诺基亚发布的“可维修”手机 说到诺基亚,用过的朋友第一个映入脑海的词就是“砸核桃”。\n那是iPhone还没发布的非智能手机年代。\n手机可更换电池和外壳在那时是一个标准设计,谁要是不支持这些都不好意思跟人打招呼。\n那时我经常把我的诺基亚掉在地上摔得七零八落,然后淡定地捡起来像电影里特工拼装自己的手枪那样,一个个把零件组装起来,形成“一把”手机。\n或者等手机快要没电的时候,像换弹匣那样给手机换一块电池,立马满血复活。\n这样的日子自从iPhone发布之后就再也没有了。\n诺基亚近期发布了一款手机,再次让我想起我那掉地上摔开几瓣的手机。这款手机号称具有良好的“可维修”性,普通用户也可一个人在家轻松拆卸。可以自行更换包括电池、屏幕、充电端口等零件。\n不要重复自己是编程的好原则吗 不要重复自己,永远不要从头开始重写代码!\n这是很多程序员收到的忠告。\n然而它是绝对正确的吗?\n这里有篇文章《重复自己,重写一切》,作者在文章中探讨了编程中的一些习惯,他认为这些习惯可以使代码变得更难理解、更难维护,并可能导致代码的冗长和不必要的复杂性。文章提到了重写代码可以给程序带来更好的抽象和可维护性,所以建议定期通过重新写代码的方式重构你的程序。\n说实话,我不知道作者是怎样看待所谓“屎山”代码的,也许当他面对有些代码时,他的观点也会变为:“能跑的代码,就尽量别动它了”。\n慢下来 这篇文章的题目是“慢下来”,作者是Derek Sivers,一位创业者、作家和音乐家。在这篇文章中,他分享了自己对于“慢下来”这个主题的一些思考和感悟。\n虽然是个急性子,但是我很认同文章里的观点。\n资源 反跟踪识别的套件,如果你觉得被公共场所的摄像头拍摄和记录或者识别侵犯了你的隐私,这里有一套开源的穿戴套件可以考虑。它通过在身上穿戴可以发射红外线的LED设备,使得摄像头画面过曝。以获得保护隐私的效果。不过仅用于研究,不知道是否符合有些国家的法律法规。网站提供了配件清单和详细的装配说明(pdf)供下载。 AI帮你解释一段代码,有人使用openai的开发接口提供了一个专门帮人们解释代码执行的工具,输入代码,输出解释。并提供vscode的插件。我把文章开头那段播放音乐的Javascript代码发给他让他解释,效果如下图: 在网页中运行GPT模型,一个可以在浏览器中执行Transformer模型的开源程序,可以执行轻量的模型,实现如翻译、语音转文字、图像转文字等任务。 AI生成工具箱,近期,基于chatGPT模型的应用大爆发,这里有一个整理好的工具箱,可以使用ai做很多内容生成工作,包括帮你编写周报、润色文字、写道歉信、写外卖好评等,效果还不错。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-03-22T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/","title":"机器文摘 第 025 期"},{"content":"机器文摘 第 024 期 长文 电池充一次可以用两年的“笔记本”电脑 挪威软件开发商安德烈亚斯·埃里克森(Andreas Eriksen)组装了一款笔记本电脑(或者说便携膝上型电脑?)。\n它拥有“以年为单位的电池寿命”,并且使用用Lisp编程系统界面,产品名为:PotatoP。\nCPU好像是个ARM架构的低功耗单核处理器,最高频率96MHz。\n支持蓝牙5.0。\n运行的系统为PotatOS,一个基于uLisp(一个专门为微控制器设计的Lisp)移植的专用系统。\n使用的4.4英寸显示屏采用介于LCD和墨水屏之间的技术,省电。\n再加上机身上还带有太阳能电池,据说如果环境光充足的话,可以连续运行两年。\n详解 AMD 为 Steam Deck 开发的 APU Steam Deck 无疑是一款革命性的掌机。\n如果不是价格在国内被炒的离谱,我定会入手一台,也许再观望一下等待第二代或者三代产品更好。\n这款掌机使得在便携设备上游玩3A大作不再是幻想。\n取得这样的表现,除了得益于V厂魔改的Linux系统之外,还离不开这块由AMD定制的、代号“梵高”的 APU。\n这篇《“梵高”AMD的Steam Deck APU》详细介绍了这块APU的各种技术细节,解释了为什么Steam Deck可以做到低功耗的同时还拥有相当给力的图形性能。\n用磁盘阵列(RAID)确保数据安全靠谱吗? 再谈谈 NAS 的事情(中年技术男的三大爱好之一)。\n像我这样的人,对于 RAID 磁盘阵列总是抱有美好的幻想。我们认为,只要将数据存放在经过合理规划的磁盘阵列中(例如 RAID 5),我们就可以高枕无忧,确保数据永远不会丢失。然而,实际上,磁盘阵列并不是备份数据的最佳选择,最佳的数据安全策略是异地多份存储。\n尽管 RAID 5 宣称随便损坏一块硬盘也不要紧,只需更换一块正常盘即可,但这种理想状态可能不太容易实现,中间随时可能会出现其他状况导致数据永久丢失。\n一篇名为《差点儿就又全没了》的博文,讲述了作者在使用 NAS 磁盘阵列时经历了一次惊险刺激的数据拯救过程。希望这篇文章能够给计划使用类似方式保存数据的朋友们一个平常心态。\n资源 NESFab,一个专为开发任天堂8位游戏机(NES、FC)设计的编程语言。具有高性能、易于装载资源、自动内存地址切换等特性,作者还在主页提供了一个使用NESFab开发游戏的教程。 AstroNvim,一套即开即用的Nvim配置文件,主打界面美观,集成了文件浏览、代码补全、语法高亮、模糊查询、可视化调试等常用插件配置。对于新手和懒得折腾的人来说,可以尝试。 pynecone,一个用python开发的web应用框架,特点是使用python语言完成所有任务,包括前端和后端,可以帮助那些对于前端开发不太擅长的人更方便地制作web应用程序。 函数式编程入门,一篇介绍函数式编程的文章,介绍了函数式编程的基本概念和一些重要的函数式编程概念,并使用Javascript演示了如何使用这些概念进行函数式编程。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-03-15T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/","title":"机器文摘 第 024 期"},{"content":"机器文摘 第 023 期 长文 视频信号可以被窃听吗? 我之前听到过一个传说。\n使用高灵敏度的天线,再加上一些奇妙的设备。\n可以窃听(窃视?)到附近(方圆数百米)范围之内的显示器显示的内容。\n这个传说流传的时候,还是CRT显示器的时代,当时的视频接口主要是VGA,采用模拟信号进行传输。\n如果显示器或者视频线缆所作的屏蔽不够充分的话,难免会有信号泄露。\n而VGA信号又没有任何加密,被别有用心的人收看是有一定的可能的。\n时间发展到今天,视频接口早已升级,我以为除非不小心无线投屏到了邻居家,否则就不会有视频内容泄露的情况。\n然而,今天要说的这篇文章则证实了上述传说的可能。\n不过,比起传说中的窃听,作者走的更远一些。\n起因是作者在家里摆弄无线电的时候,发现了一个信号干扰源,最后发现来自他的一个树莓派设备。\n于是经过一番操作,作者不但成功通过无线接收的方式将视频信号显示了出来。\n还利用这种无线信号的干扰(或泄露?)实现了叠加数据的传输。\n怎样用密码保护一个静态页面? 说到网站上的数据权限保护,一般我们会需要后端程序配合。\n比如使用账号系统,给用户角色分配不同的权限,使其访问后端接口时获取不同的数据。\n如果没有后台程序,只有静态页面会怎样?\n这儿有个开源工具,可以帮你生成带有密码保护的静态HTML页面。\n具体使用方法和原理也很简单。\n输入你想设置的密码和你的HTML页面原始代码,这个工具可以使用AES-256加密算法对其进行加密。\n然后在浏览器加载时,页面自动使用一个js库实现自解密。\n这个方法用于临时保护一些静态的内容还是挺有效的,而且很方便。\n写代码越“干净”越好吗? 有不少人宣称自己有代码“洁癖”。\n对于设计模式和面向对象有着非常深的执念(或者函数式编程也是)。\n市面上也充斥着很多“之美”、“之道”、“之禅”之类的书籍,强调代码要给人读、整洁干净。\n我并不反对上述观点,甚至自己也有一点这样的“洁癖”,只是有时内心会有一丝怀疑的时候,觉得如果过于追求某些东西可能会偏离了解决问题的根本目标。\n这篇《“干净”的代码,糟糕的性能》,帮我吐槽了一些事情。\n但作者在文中所举的例子稍微有些牵强,不必过于纠结。\n不知道怎么练习编程怎么办 经常有人困惑在学习了一门新的编程语言之后,不知该做些什么。\n就像是掌握了词语却写不出好的小说,掌握了规则也下不好象棋。\n我们从小受到的教育方式导致了,在学习技能这一块,缺失实践的动力和方法。\n这篇给无目标的新手程序的一些建议,虽然内容不多,但是可以看出作者也是个老油条了。\n给出的一些提示都很实在,对于技能练习方面,提的都是我希望我能遵从的。\n比如:\n用技能解决你实际生活中的问题。 做一些你真正会用到的东西。\n资源 写给 React 开发者的 TypeScript 指南,针对React程序员的TypeScript的学习资料,解答了我一部分为什么要用TS的问题。 Method of Action,一些免费的工具和在线小游戏(颜色搭配、贝塞尔曲线等),可以帮助你学习和掌握设计理念和工具。 Archivebox,一套开源的互联网内容保存方案,可以将你喜欢的页面下载下来,并自动爬取相关链接、图片等内容,类似于互联网档案馆的https://archive.org,不过可以自己搭建。 History of Computer Graphics and Animation,一本讲解计算机图形和动画发展历程的电子书,里面记录了计算机图形学相关的许多参考资料,曾用于俄亥俄州立大学的授课。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-03-08T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/","title":"机器文摘 第 023 期"},{"content":"机器文摘 第 022 期 长文 自制家庭服务器 人们常说,中年技术男的最终归宿除了钓鱼和盘核桃之外,还有一项就是折腾家里的服务器,这些服务器形态各异,但是作用都是殊途同归:NAS、软路由、虚拟化、Docker容器。\n怎样变着花样搭建家庭服务器几乎是 V 站的月经甚至日经话题。\n这里有个国外的老哥,决定使用 ARM64 架构自己“装配”一个,是那种需要焊接的“装配”。\n有兴趣的可以翻阅一下这篇《构建 ARM64 家庭服务器》。\n文章介绍了如何用一种较为困难的方式构建一个 ARM64 架构的家用服务器。\n作者使用了一块名为 ROCKPro64 的开发板,并详细介绍了构建过程中遇到的问题以及如何解决这些问题。\n文章中包含了安装基础操作系统、配置网络连接、设置磁盘阵列和安装各种软件的详细步骤和指导,涵盖了从硬件到软件的多个方面。\n在构建过程中,作者提到了一些常见的问题和解决方法,例如如何处理不同操作系统的差异,如何在开发板上设置固件,以及如何解决硬件不兼容问题。\n总之,这篇文章是一份详细的指南,可以帮助有兴趣构建自己的家用服务器的读者了解基础知识,克服可能遇到的问题,并学习如何从头开始构建一个高效、安全的服务器。\n上面这段是让 chatGPT 帮我写的 :)\n用Rust写一个大小仅有2K的极简FPS游戏 极简渲染器的编写教程网上有很多,但大都浅尝辄止,以静态渲染为主。\n这篇文章则从制作一个第一人称射击游戏的视角出发,讲解了怎样使用光线投射技术实现最基本的三维空间渲染、光照、阴影等效果。\n作者使用 Rust 语言基于 wasm 技术编写了一个在网页中运行的示例程序,该程序非常小巧,但是也充分展现了如何使用光线投射算法来实现 3D 渲染技术仲的一些基本概念,比如:墙体贴图、视角控制等。\n是我看到的教程里比较系统的一个,适合作为爱好者去研究。\n玩具 CPU 模拟器 国外一个大学老师觉得他的计算机组成原理课程有些枯燥,于是他动手撸了一个 CPU 模拟器出来,以帮助学生们更好的理解计算机内部运作原理。\n作者在文章里介绍了基本的原理,以及模拟器的各个组件,适合学习底层原理初入门的学生。\n另外这个模拟器也基于 MIT 协议进行了开源,文章中附有开源仓库的地址和编译好的可执行文件下载连接。\n需要注意的是该程序运行环境为DOS,现在要想体验的话,需要先安装 DosBOX 这个模拟器。\n不用任何构建系统编写前端代码 比起十几年前,前端开发工程现在已经变得十分复杂。\n有次我想写个简单的页面程序,但是却花费了一上午的时间陷入对框架和构建系统的选择上。\n后来不得不放弃,改用记事本随便用原生Javascript完成了功能。\n这篇文章的作者跟我有同样的感受。\n作者认为,对于一些简单的项目来说,使用构建系统可能是不必要的。\n因为构建系统会增加开发和维护的复杂性,而且可能会导致一些性能问题。\n文章演示了作者如何使用原生的Javascript和浏览器的开发者工具来实现一些常见的构建系统功能。\n资源 计算机知识笔记,一个计算机科学知识笔记仓库,包括计算机基础知识、编程语言和算法、开发工具、面试笔试题目等等,是一个非常实用的笔记库。目前在 Github 上有超过 162k 个 star 。 Creating Demos,这套教程是 Hugi 杂志在2001年第31期发布的一系列编程文章,主题是“Demo程序”的制作,是我目前在网络上见到的比较完整和耐心的一套讲解 Demoscene 如何制作的教程。虽然有些技术是老旧的,但是思想一直是不变的,能够学到很多平时很难了解到的东西,现在很少有人愿意分享这些了。 网络视频下载器,一个 go 语言编写的网络音视频资源下载工具,类似 youtube-dl,但是支持的网站要更多一些。 ambient,Ambient是一个使用 WebAssembly、Rust 和 WebGPU 技术构建的高性能多人游戏和3D应用的开源引擎。特点是针对构建多人游戏开发进行优化支持。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-03-01T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/","title":"机器文摘 第 022 期"},{"content":"机器文摘 第 021 期 长文 chatGPT 原理通俗讲解 可能是有人炒作的缘故,chatGPT 热度一直不降,连街边买菜的大妈都在讨论这个“人工智能机器人”。\n可能是它输出语言的流畅度实在是太接近真实的人类了,用惯了之前那种“智能助理”的人很容易感到震惊。\n然而其背后的原理并非像想象的那么复杂,甚至是大力出奇迹的又一个经典样例。\n最近关于它的文章也是铺天盖地,各种分析、叫好,很少有冷静下来探讨其背后机理的。\n我翻看了几篇之后,发现唯有这篇《chatGPT在做什么以及它为什么好使》 比较优秀。读起来比较平和,没有压力。\n文章揭示了即使像chatGPT这样的大型语言模型也是一个单词一个单词慢慢往出崩的,并尝试说清楚这么流畅的语言是基于什么来预测后续单词的概率。\n怎样利用多GPU训练真正的大型模型 前面提到的 chatGPT 模型,体量非常大,据说训练一次就要耗费上千万美元。\n作为普通开发者我们是不敢奢望自己上手训练一番。\n不过,这里有一篇文章可以让我了解像这样的大模型是如何进行并行训练的。\n另外还有个开源的项目,号称可以在较少资源的基础设施上进行 GPT 模型训练,有兴趣的可以试试。\n怎样搭建一个电子爱好者工作间 拥有一个电子产品工作室一直是我的一个梦想。\n电烙铁、稳压电源、万用表,是我能想到的最基本的设备。\n如果还想更完美,可以借鉴这篇文章所介绍的思路,搭建一个电子爱好者工作间。\n运气计算公式 看到一个关于运气的文章《如何获得好运气》,觉得里面提到的“怎样使得随机的运气变得让好运更加倾向于你”的说法比较有意思。\n于是就收录一下。\n文章里探讨的问题,很容易让我联想到关于“下雨的时候是飞速跑动淋雨多还是慢慢走淋雨多”的问题。\n资源 卡耐基梅隆大学计算机科学在线教程,CMU CS Academy 是卡内基梅隆大学计算机科学学院 (SCS) 的一个项目,其目标是开发一种新颖的、世界级的、在线的、完全免费的交互式高中计算机科学课程。 纯CSS实现的超漂亮UI组件收集,网站收集了超多 UI 组件,基于 纯 CSS 实现,采用 MIT 开源协议发布,可以自由使用。 为开发者打造的演示文稿工具,Slidev 旨在为开发者提供灵活性和交互性,通过使用他们已经熟悉的工具和技术,使他们的演示文稿更加有趣、更具表现力和吸引力。 根据ai做的图倒推出用于训练模型的原始图,这个网站比较有意思,前一段时间比较火的根据文字生成图片的 AI ,这里可以将根据 AI 生成的图片反推出它当时样本训练的原始图。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-02-22T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/","title":"机器文摘 第 021 期"},{"content":"机器文摘 第 020 期 长文 怎样获得非凡成就 多年来,我对成功学嗤之以鼻。\n但也对有些人的成功给予应有的尊重。\n我所欣赏的成功人士有一种特殊气质,我说不上来具体是什么特点,有点儿像反叛精神,又有点儿对手工技术的狂热。\n这些人里对我影响比较大的是《黑客与画家》的作者 保罗·格雷厄姆(Paul Graham)。\n他创建了著名的 YC 孵化器公司,也打造了很多成功的产品。\n今天推荐的这篇文章《How To Be Successful》的作者,是保罗·格雷厄姆非常推崇的一位创业者。\n文章分享的观点乍看有成功学的影子,但读完却能引人思考。\n这里是中文翻译版:《观察成千上万创业者后,关于如何获得非凡成就的13条思考》\n我觉得这些观点至少可以给长期埋头技术工作的人们一些启发,我稍微列举几条如下:\n这个世界很少人能做到将眼光放长远,而那些有长远眼光的人会得到市场的丰厚回报。 把时间花在做正确的事上,比花长时间进行工作更重要。 跟着你的好奇心走。因为对你来说兴奋的事情对其他人来说也同样兴奋。 成为内驱型的人(即:自己去做一件事的原因来自于自己,而不是外部的力量或别人的期望)。 怎样在客厅建立自己的私人影院 智能电视或者智能盒子已成为现在客厅的标配。\n如何充分发挥它们的作用,早已是技术爱好者的孜孜不倦探索的课题。\n前些天我偶然收到一份公开的云盘链接,使用开源的 AList(一个支持网盘存储的文件列表程序,可以通过多种协议将网盘映射为本地访问的存储路径) 进行构建。里面整理了大量的影视资源,有不少是高质量、高码率的蓝光原盘文件。\n这就激发了我的好奇心。\n由于自己一直按耐住折腾 NAS 的念头,这些年一直没有收集电影。\n但现在既然有在线的资源,不妨尝试一下。\n于是我找到了这篇《利用KODI和云盘打造4K高清私人云影院》(仅作研究,观影和收藏还需支持正版)。\n按照文章的指导,成功给电视安装了 KODI(一个媒体中心 App),并进行了配置,可以非常方便地浏览、观看互联网云盘上的高清电影。\n比起云盘官方所出品的各种 App 在体验上更加灵活、完美。\n“噪声”在计算机图形学里的作用 想要计算机产生的图形更加的接近自然,生成各式各样的噪声是必不可少的算法。\n之前在读《The Nature of Code》(中文译作:代码本色)一书的时候,作者花了大量篇幅讲解关于噪声、随机等对于模拟自然界中各种现象的重要作用。\n或许在噪声里就隐藏着大自然最深处的秘密。\n这篇WebGL进阶——走进图形噪声可以让你领略一些图形噪声的神奇。\n很多场景都给出了 WebGL 实现的源码,可以边学边练。\n资源 ThreeGN,一个基于网页的三维建模程序,特点是具有类似 Blender 的几何节点编辑功能。 tabler,一个开源的图标库,可用于 Web 或 移动端应用开发,全部免费使用。 immersive-translate,一个在线翻译浏览器插件,支持 Edge、Firefox、Chrome 等浏览器,优点是可以在网页上追加中文显示,原文和译文同时展示,对于想提升外语水平的人士,是个不错的对照工具。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-02-15T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/","title":"机器文摘 第 020 期"},{"content":"机器文摘 第 019 期 长文 现阶段 AI 能对游戏开发提供多大帮助 AI 在最近有多爆发自然不用我再赘述,抛开那些狂热的能够引起焦虑的言论(比如 AI 即将替代大量工作岗位),也有不少人选择跟 AI 和平相处。\n这篇《AI 辅助图形》的作者是一个有着游戏制作二十年经验的从业者,近期想尝试尽可能地利用各种 AI 加持的辅助工具,试图通过他们提升制作效率。\n作者从游戏的概念原型阶段,一直到三维模型资产的制作和游戏场景的搭建,均选用了具有 AI 能力的效率工具进行支持。\n最终结论是,虽然在过程中会有这样那样的不顺手,但这些工具确实能够帮助他节约大量工作时长。\n所以作者的看法是,他很愿意将 AI 工具看作他的同事。\n照这么说的话,留给人类的工作真的是不多了。\nChatGPT 学习笔记 ChatGPT 在春节后又起了一波热度。\n网上到处都是关于它的段子,有人用它写论文,有人拿来给孩子辅导作业,有人写情书,有人当个动嘴的甲方让它写程序。\n喜得微软恨不得现在就把它接到搜索引擎里,逼得谷歌提前释放出自己的类似模型。\n国内的百度也表示将在3月份发出自己的大规模语言模型。\n要我说就不要这么着急,不妨拨开迷雾,看看 ChatGPT 是个什么东东。\n在网上发现这篇《ChatGPT 通俗笔记》,讲述了这个模型的发展历程,以及一些基本的概念原理。\n此类中文资料不多,给这篇文章作者点赞。\n视觉设计的一些规则 现在专业的界限越来越模糊,每个人都应该掌握一些基本的设计理念,以便在日常工作中输出的成果具备基本的美感。\n这篇《视觉设计安全法则》,浅显易读、明确具体,对于视觉设计活动很有指导意义。\n看完之后无论是自己动手做 PPT 还是软件的 demo 原型,都可以用到。\n我觉得甚至对于摄影构图、房屋装修都能有所借鉴,因为美是相通的。\nPython 做后端开发的技术选型 有时候想做一些 Web 应用的原型,Python 是我的首选语言,写起来顺手又省事,能节约不少时间。\n但是由于用的不够深入,在选择开发框架的时候,稍微有些困惑。\n比如同样都能提供快速的开发能力,Fastapi 和 Flask到底选哪个?\n如果你也有跟我一样的疑惑,可以看看这篇《Fastapi 和 Flask 详细对比》。\n文章深度分析了这两个框架的异同以及所适用的工作场景。\n资源 YouPlot,控制台绘图工具,可以在控制台窗口用字符的方式进行绘图,支持柱状图、散点图等。 网页在线联机 CS1.6,只需浏览器即可联机玩反恐精英 1.6,这个网站通过 WASM 技术将 CS 1.6 移植到了网页中运行,现代浏览器均可支持,第一次加载时间略长,但体验还算流畅,在线人员数量也挺多,随时可以匹配到。 交互式 SVG 参考,一个可以在线了解 SVG 图形标准细节的网站,提供交互式界面进行实时演示。 浏览器地址栏里的动画,一个有意思的 Js 库,通过动态修改浏览器地址栏的 URL 地址来实现动画,效果还比较萌。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-02-07T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/","title":"机器文摘 第 019 期"},{"content":"机器文摘 第 018 期 长文 游戏高清重制《科林麦克雷拉力赛3》 游戏高清重制一直是我比较感兴趣的话题,可能因为比较喜欢怀旧吧。\n我曾经收藏过采用覆盖显示驱动的方式进行高清分辨率支持的《极品飞车 5》、《Quake 3》等游戏。\n也见过一些更古老的游戏在更新资源包之后重新焕发青春。\n不过一直没有接触过真正的重制过程。\n这篇《重制科林麦克雷拉力赛》详细记录了一个优秀的赛车游戏进行高清重制的过程。\n可以带你了解老旧游戏如何进行“宽屏”、“超宽屏”支持,如何重制高清界面UI元素等,过程充满了对不可能的挑战。\n把网页渲染到控制台 通过控制台窗口进行上网,你可能觉得并不新鲜。\n毕竟已经有很多类似 w3m 这种在控制台下基于字符的浏览器程序。\n但是他们的缺点都是不能显示图形,而且几乎失去了对页面的样式渲染。\n今天这篇《把网页渲染到控制台》则另辟蹊径,虽然同样是在控制台的字符界面,但是渲染手段却大不相同。\n它将控制台字符当作单个像素来处理,采用现代浏览器内核进行页面解析和预渲染计算。\n然后在像素渲染阶段,采用了控制台字符来进行替换。\n虽然最终效果无法跟图形界面下的浏览器相比。\n但是它毕竟提供了一种在终端控制台进行图形化网页显示的可能。\nChromium 渲染流水线——字节码到像素的一生 看了前面网页渲染到控制台的文章,如果对浏览器的原理架构比较感兴趣的话。\n可以看看这篇讲解 Chromium 浏览器渲染架构的文章。\n现代浏览器已经复杂到不可能通过个人从零开始实现。\n了解一下他们的架构,即便不从事相关开发,也可能对自己的软件架构产生有益影响。\n99 行代码实现光线追踪 光线追踪在图形渲染中十分关键的概念。\n同时也是现代电影工业实现逼真光照渲染所必须的技术手段。\n然而它的原理却并不复杂,甚至只需少量代码就可以自己实现一个建议的渲染器。\n这篇《99 行代码实现光线追踪》就只是用了少量 C++ 代码实现了一个简单的带有全局光照、阴影、反射的场景渲染。\n虽然看起来简单,效果还是很令人惊艳的。\n适合我这种喜欢研究原理,但又不太深入的“技术爱好者”。\n光线追踪深入 既然前面提到了光线追踪,不妨再引申一下。\n很多光线追踪的入门教程都会教你渲染一些简单的模型,比如球体,圆柱体等等。\n如果想基于光线追踪技术渲染复杂一些的三维模型,应该怎么做?\n这里有一篇《光线行进和符号距离函数》,里面介绍了基于光线行进算法(光线追踪的一种实现方式)和符号距离函数来构建三维场景中复杂模型的思路。\n内容比较详细,并带有示例代码。\n资源 chronophoto,一个猜照片年代的游戏,根据网站随机展示的老照片,来判断这张照片是哪一年拍摄的,答案区间 1900 到 2020 ,我试了试还挺有意思,可以根据照片中出现的物品和人物的衣着进行分析。\nGimel Studio,一个基于节点系统的照片后期处理工具,开源,采用 Python 编写。\nBugChecker,一个支持 Windows 11 的类 SoftICE 调试器,开源。 swiftshader,一个基于 CPU 实现 OpenGL 渲染的图形库。主要应用在谷歌开源的 chromium 项目里,用纯软件算法实现了OpenGL、Vulkan图形接口。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-01-31T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/","title":"机器文摘 第 018 期"},{"content":"机器文摘 第 017 期 预计春节期间暂停更新,节后恢复。\n长文 怎样在 1 位色深的 LCD 屏幕上显示灰度 只有 1 位色深的 LCD 屏幕按理说是不能显示灰度的,因为他的像素点要么纯黑、要么纯白,显示的图案效果肯定非常差。\n如果说非要显示灰度的话,我第一个想法是通过抖动算法进行模拟(即通过像素点的稀疏程度来制造错觉,如下图)。 然而这篇文章的作者采取了更为巧妙地方法,使用 PWM (脉冲宽度调制)技术,利用每个像素点的点亮时间不同来制造灰度错觉。\n之前只是见过使用 PWM 调整 LED 灯泡的亮度,像这种用法我倒是第一次见。\n作为一名数据工程师和作家,我为什么要用 (Neo)vim 很多人都被 Vim 复杂的功能和陡峭的学习曲线吓到过。\n也有很多人本着对效率的极致追求,而选择了征服 Vim,从而走上高效(折腾)的路线。\n本文作者作为一名数据工程师,讲述了他学习 Vim 的心路历程,也许对于现在还在观望的人有所启发。\n我个人使用 Vim 已十多年时间,虽然从未触及特别深入的技能(如宏定义、寄存器等),但是 Vim 这种神器的特点就是,只要你忍者难受越过操作的及格线,剩下的技能你稍微多掌握一点,就能马上给你带来非常丰厚的回报。\n焦散是什么?如何正确地渲染焦散? 焦散(Caustics)在现实生活中随处可见,但在渲染图中却很稀有。这篇文章解答了为什么渲染焦散很难,以及有哪些方法可以迂回实现。\n找到这篇文章是因为我在 Github 上发现了一个使用 webgl 实现焦散渲染的项目,效果非常不错,于是想研究一下背后的原理。 资源 常用设计模式有哪些,一本在线电子书,图文并茂,以比较直观的方式介绍了软件开发常用的设计模式,支持英文、日文、中文等多国语言。\n谷歌的软件工程,好几年前的一本书,讲述在谷歌做软件开发的体验和最佳实践,现在出了可免费阅读的电子版。\n开源低代码开发框架 ToolJet,免费开源的低代码开发框架,带有可视化编辑器,从数据持久化到前端界面全部无需编写代码。\n一个无聊的 Neovim 插件,一个没啥用的 Neovim 插件,唯一能做的事情是当你感到无聊时,可以将你的文本编辑区里的文本执行一个“元胞自动机”动画,看起来还算解压。\n最大的 AI 工具箱,喜欢研究 AI 的不要错过这个网站,收集了各种 AI 模型的开源项目和相关网址,涵盖了图像识别、自然语言处理等常见的、时兴的 AI 技术。\n订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-01-16T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/","title":"机器文摘 第 017 期"},{"content":"机器文摘 第 016 期 长文 黑客与汽车 现在的汽车很多都具有联网的能力,可以通过互联网进行便利的远程操作。\n比如获取汽车位置、健康状态、远程启动、远程开门等等。\n作为消费者来说,在使用这些便利功能的时候,内心是十分信任厂商的。\n觉得安全问题肯定会被厂商非常重视,作为头号问题来抓。\n然而这篇《黑客与汽车》却改变了我的看法,原来这些车联网的安全防护如此的脆弱。\n文章作者为业内人士,写的还比较实在。如下列举部分这些黑客可以对车进行的未授权操作:\n远程发动机启停、车门解锁与锁定、大灯闪烁、喇叭鸣笛; 锁定用户,迁移管理权; 根据车架号下载到用户的销售档案; 远程刷新更新车辆电脑固件; 跟踪车辆物理GPS位置; 看完我感觉是不是得把我的相关车联网服务给停一停了。\n汇编代码阅读指南 写汇编代码很麻烦,阅读起来也很费劲吗?\n这儿有一份简要的汇编阅读指南,作者介绍了一些汇编代码的阅读技巧。\n因为根据统计显示,最常用的汇编指令也就那么十来个,所以并没有想象中的那么晦涩和高深莫测。\n使用 SVG 绘制逼真的绳索 SVG 是在网页中进行矢量绘图的技术,比起 Canvas 画板的像素图像,SVG 具有放大不失真的特点,在网页中可以通过 Javascript 操作生成 SVG 图形对象,实现各种复杂的图案。\n这篇文章的作者从几何的角度考虑了如何使用矢量图形来绘制一个现实中的麻绳图案,要不仅体现出绳索的扭曲,还要正确表现绳索分支之间的叠压,作者提出了一个巧妙的使用 SVG path 进行实现的方法。还给出了代码。\n你要问作者为什么这么做,有什么用没有?我想作者可能会回答:Because I can !\nSSH 进阶用法介绍 经常在 Linux 系统下进行开发或者运维的专业人士,可能每天使用最多的工具就是 SSH 了,每天都要通过它登录服务端系统,进行一系列的操作。\n这里有一篇文章比较全面地介绍了 SSH 的进阶使用技巧,可以在某种程度上极大提升效率以及操作体验。\n列举部分如下:\n如何免密码登录; 如何映射服务端的服务端口到本地(以方便调试); 如何将服务端的图形界面(如xcalc)代理到本地电脑显示和交互(不是远程桌面哦); 一些网络端口映射之类的高级操作; 资源 个人年终总结模板,我做了一个基于 Markdown 语法的年终总结模板,方便梳理在编写个人总结时的思路,放在 github 上的 gist 里了,可以随意使用。\nweb 网页设计博物馆,一个保存古老网页设计的网站。记录了 1999 年到 2020 年各大公司的网页设计变迁。包括谷歌、亚马逊、苹果、任天堂、麦当劳等等。\n一站式网页工具大全,一堆的在线工具汇总,包括图片处理、PDF格式转换、文字编码转换、密码生成、字符串加密解密等等,常用工具一网打尽。\n在线手柄测试工具,打开网页即可测试游戏手柄的工作状态,按键是否灵敏,遥感是否有死区等等,非常方便。\n订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-01-10T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/","title":"机器文摘 第 016 期"},{"content":"机器文摘 第 015 期 长文 编程就是玩儿 对于程序员或者技术从业者来说,以一种什么样的心态工作将十分影响成果的产出。\n这篇文章的作者给大家分享了他自己的感受\u0026mdash;-“不把编程视为严肃的工作、目标只是玩得开心、为了好玩而编程”。\n他同时也是 《为什么我喜欢做无用的东西》帖子的作者。\n除了文章本身之外,在 HN 配套的讨论帖子在这里。\n这种类似于“寓教于乐”、“做自己开心的事儿”等等内容,一直是一个值得探讨的话题。\n我个人也倾向于以兴趣和爱好来驱动自己,只是如果这个兴趣和爱好顺便能够挣钱,那就更好了。\nWebAssembly:没有容器的 Docker 最近 Docker 宣布与 WasmEdge 合作支持 WebAssembly 。\nWebAssembly 和 Docker 我们都听说过,在前面的文摘中我还尝试过自己使用 Rust 编写运行在网页里的 WebAssembly 应用程序。\nDocker 也是我工作中每天都要用到的容器技术。\n那他们两个有什么关系?放在一起能碰撞出什么火花?\n这篇文章将讲解这两种技术的结合在云原生架构下的使用。\n看来 WebAssembly 技术不仅可以在浏览器环境中发挥作用,还能在云计算、边缘计算等领域发光发热,前途不可限量嘛。\n3D 摄影测量建模技术 3D 摄影测量建模,是一种通过对物体多角度拍摄照片,然后使用计算机通过软件算法合成为 3D 模型的技术。\n从最开始在专业领域(如:建筑工程、考古)使用,到现在已经普及到普通人只需安装手机 App 也能轻松实现了。\n这篇用3D摄影测量法对我的爷爷建模记述了作者如何使用 3D 摄影测量建模技术给自己爷爷的雕像进行“数字化”的过程。\n里面详细记录了整个过程所使用的开源软件和相关的配置细节。\n对于一些想要进行一次实操演练的朋友来说可能有用。\n在 2D 游戏中如何模拟 3D 的光影效果 《守墓人》是一款经典的 2D 角色扮演游戏,比起它的精彩剧情和有趣的玩法,出色的画面效果也是该游戏取得成功的重要原因。\n这篇《守墓人的图形效果是如何制作的》文章,由该游戏的核心开发者于 2018 年发表,讲述了很多关于实现在 2D 画面带来更加有立体光影效果的特殊技巧。\n文章虽然老了一点,但是技术没有过时。\n读进去可以深深体会到:一个优秀作品的创造,离不开对各种不可能的挑战和极限的突破。\n资源 Flash 游戏大全,上一期里我摘录了一个关于复刻 Flash 游戏的故事。后来也勾起了我对于 Flash 小游戏的怀念。便深入探索了一下现在这个阶段该如何再去运行那些老游戏。Flashpoint 是一个 Web 游戏保存工程,号称已经累计保存了包括 Flash 在内的 35 个平台的超过十万个小游戏。这个工程在 2018 年 1 月启动,试图在 Flash 消亡之前将之前的经典内容进行备份。现在提供两种版本的下载包,一种全量下载的大概 1.3 TB,包含了全部游戏。一种增量下载的,700多MB,只带了部分游戏,但是支持随下随玩。\n根据音频自动生成钢琴旋律,一个开源的 AI 模型,可以根据歌曲的音频识别出里面的旋律主线,并且使用钢琴演奏出来,效果十分神奇。\nC64 Emulator,一个在线的 commodore 64 电脑模拟器,可以直接将磁盘镜像拖拽到网页上进行加载,页面还提供了虚拟键盘。\n沙雕 App,收集了各种有趣网站、工具的导航站,之前就关注过,最近好像升级了,喜欢恶搞的同学可以到里面找到一些比较有恶趣味的小程序。\n订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2023-01-03T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/","title":"机器文摘 第 015 期"},{"content":"机器文摘 第 014 期 长文 运行在单片机上的 Qt 尝试过给单片机写图形界面没有?\n这篇 《Qt on MCU》 比较系统的介绍了“为什么选择 Qt(一套开源图形界面库) 给单片机做界面”、“Qt 的基本架构”、“程序移植性”等相关问题。\n读完可以较为全面地了解在单片机这种机能较弱的硬件设备上制作图形界面的基本思路和需要关注的问题。\nOpenWrt/LEDE 搭建 Syncthing p2p 私有文件同步服务 现在大家都不止一个电子终端设备,个人数字信息、各种数据文件的同步需求基本上是一个刚需。\n有很多厂商提供了收费方案,比较常见的有国内的各种网盘、手机厂商提供的各种 Cloud 服务等等。\n如果想基于家庭网络自己动手搭建一个私有服务的话,可能略微麻烦一些,不过也有较为成熟的方案了。\n条件具备的话不妨参考这篇《OpenWrt/LEDE 搭建 Syncthing p2p 私有文件同步服务》动手试一试。\n用 Flash 高清重制一款游戏 Flash 基本已经成为历史了。\n即便现在可以通过一些渠道或者浏览器勉强开启 Flash 插件的话,也会提心掉胆地担心计算机的安全性。\n毕竟那些恼人的弹窗广告有 80% 都是靠 Flash 技术实现的。\n但是还有这么一群人,他们玩着 4399 上的小游戏长大,80 后喜欢的各种主机游戏在他们眼里根本不值一提,倒是网页上那种基于 Flash 制作的即开即玩的小游戏(比如我能想到的就有:黄金矿工、狂扁小朋友、打企鹅等等)才是他们的最爱。\nFlash 技术被时代抛弃,那些 4399 们也就逐渐消失了。\n不过总有人会拥抱情怀,这篇《为拯救童年回忆,开发者决定采用古法编程》便讲述了这样一个故事。\n里面的哥们儿以极其硬核的方式实现了他的梦想,为了复刻一个 Flash 小游戏,他几乎重新写了一个 Flash 播放器。\nUnix 终端系统(TTY)是如何工作的 没有使用过大型机而直接进入 PC 时代的计算机用户,可能觉得“终端”就是电脑上那个能够输入 CMD 命令的黑乎乎窗口吧。\n即便是终日与命令行打交道的软件开发人员、系统运维人员,可能也很难一下子解释清楚什么是“终端”,它为什么叫这个名字。\n这篇《Unix 终端系统(TTY)是如何工作的》从计算机硬件发展的历史出发,介绍了计算机系统跟用户交互的发展历程,并针对“终端”系统进行详细展开,讲解了实现原理和后来发展的现代形态。\n喜欢硬核知识的朋友可点进去阅读一下。\nHN 讨论:极大提升你效率的软件有哪些? 哪些软件最能节约你的时间、解放你的双手、使你离不开它?\n这个话题几乎每过一段时间就会被拿出来讨论一番。\n每个人都有自己的偏爱。\n不过,看看大家的讨论,说不定也能发现一些新鲜的软件,也许能更新一下自己的工具库也说不定。\n比如上面这篇帖子里,楼主提到的 这个 csv 工具 ,可以在命令行让你高效对 csv 文件进行快速检索、合并查询、切片等等。 不过帖子里可能有人把节奏带偏了,在下面大吹特吹各种 IDE 软件,就仁者见仁了。\n资源 SQlite源码分析,一本讲解 SQlite 源码的在线电子书,主要对 SQLite 数据库的实现机制和使用方法做了简要分析。\n经典复古 win98 游戏合集,一个游戏整合包,里面整合了若干在 Win98 系统下才能跑的老游戏,像初代的雷神之锤、半条命、极品飞车等等。提供了基于 DosBox 的虚拟系统,即开即用,性能还不错。\nDOS 系统下的编程工具合集,想要重温在 DOS 环境下编程的感受,这里有一套比较全面的工具合集,包括 QBASIC、TurboC 等开发环境,以及一些用于游戏开发的图形库、引擎。\n给你自己跑个分,现在一些硬件评测动不动就使用软件进行跑分,用以展示硬件之间的形成差异,这个网站提供了一组小游戏,可以考验你的短期记忆力、反应能力,并给你打分。也试试给自己跑个分吧。\n订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2022-12-27T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/","title":"机器文摘 第 014 期"},{"content":"机器文摘 第 012 期 长文 Github 登录被第三方网站滥用了吗? 为了方便账号注册,现在很多网站都提供了基于 Github 账号登录的方式。\n我个人也更倾向于使用这种方式登录。\n毕竟可以少填一些注册信息,减少思考密码的麻烦。\n但是这样做有什么安全问题没有?\n上周有一个在 HackerNews 上的帖子,有人遇到了在使用 Github 账号登录某些网站之后,导致他的账号莫名给别的仓库添 Star 的情况。\n这引发了大家关于 Github 账号权限管理以及通过第三方鉴权进行账号登录和注册的讨论。\n看完觉得在第三方鉴权授权时还是应该慎重使用才好。\n每个黑客都知道的命令行快捷键 在图形化界面、触控操作交互界面已经十分普及的今天,普通用户可能现在很少能接触到命令行操作了。\n但是对于软件开发者、IT运维工程师来说,命令行还是属于离不开的操作界面。\n而且对于有些工作任务来说,使用命令行完成起来要更加高效。\n这篇文章讲解了常见命令行交互时的一些快捷操作,比如常见的行内编辑、快速移动光标到命令开头、历史记录搜索等等。\n掌握之后可以在各种命令行交互界面中进行使用(基本风格一致)。\n基于颜色循环的动画技术 在计算机硬件资源匮乏的上世纪 90 年代,开发人员为了在有限条件下实现丰富的效果真是挖空心思。\n比如,还记得 Windows 98 的启动画面吗?\n蓝天白云,Windows 徽标,底部有一个蓝色的渐变色条,在缓慢的滚动。\n实际上它只是一幅图片,并非多帧动画。\n这就用到了一个叫做“颜色循环”的技术。\n来自维基百科:颜色循环,也称为调色板移动,是计算机图形学中使用的一种技术,其中颜色被更改以产生动画的假象。这种技术主要用于早期的电脑游戏,因为存储一个图像并更改其调色板比将动画存储为几帧需要更少的内存和处理器能力。\n这里有个博客使用 HTML Canvas 复刻了一批采用颜色循环创作的作品,效果非常惊艳。\n另外网站还开源了用于展示这些作品的图形引擎,虽然现在已经不再维护了,但是用于学习和探索还是很有研究意义。\n软件逆向工程入门 软件的加密和破解在普通用户眼里十分神秘。\n这篇软件逆向工程入门比较深入浅出地介绍了一些常用手法,跟着作者可以浅尝一下在内存中寻找注册号、修改汇编指令以使得软件保护失效等体验。\n资源 计算机课后作业,斯坦福大学计算机专业评选的历年来优秀作业作品。如果不知道自己编程需要练习什么的话,可以打开参考参考,很有实用价值,比起在 Leecode 上刷算法的题目,这些作业都在解决实际问题。\n互联网档案学术,全文检索索引包含超过2500万的研究文章和其他保存在互联网档案馆里的学术文档。 该馆藏涵盖从18世纪期刊的数字化副本,到最新的Open Access会议记录和从万维网上抓取的预印本。\nPlayCanvas Web 优先的游戏引擎,一个免费的游戏引擎,倡导以 Web 优先,在网页中提供从开发到发行的全部流程支持。\n命令行会话记录器,Asciinema 是一个免费开源软件,用于帮助用户录制在命令行中的操作行为,便于在互联网上分发自己的操作示范、教学演示。比起直接视频录屏的方式,这种以字符方式的记录更加节约资源,无论是记录、传播还是回放环节,都很轻量。\n十分钟物理,这套教程集合了一组十分钟左右的视频短片,每次介绍一个基本的物理概念并通过 Web 前端技术编程实现模拟。除了视频之外,网站还提供了源代码、演示环境等配套资源。\nEasy6502,一本学习 6502 汇编的电子书(没错,我就是特别喜欢这款 CPU)。网站带有交互界面,提供了一个简易模拟器,可以边学边练,教程最后会带你实现一个基于汇编的贪食蛇游戏。\n订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2022-12-13T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/","title":"机器文摘 第 012 期"},{"content":"机器文摘 第 013 期 长文 从古董电脑中我们能学到什么 我也不知道为什么自己会对老旧电脑,尤其是上世纪80年代、90年代出品的电脑这么迷恋。\n我觉得那个时代的电脑散发着一种难以名状的工业气质。\n通过阅读这篇文章,使我意识到一些深层次的原因。\n这些老式电脑的魅力来自于当时技术的限制、简单粗暴和直接。\n通过深入了解这些老古董、学习开发那个时代的软件,可以更容易地了解计算机科学。\n毕竟,现在的计算机已经充分的复杂和“人性化”,软件把硬件包裹得越来越严实和抽象。以至于根本看不清它的内部构造和实现原理。\n去研究那些古董电脑吧,操作那些裸漏单纯的硬件接口,贴近更加具体的科技。\n蛋 这是一篇很富有哲理的小小说,严格来说跟机器没有关系。\n但是写的实在是很好,忍不住收录进来。\n毕竟,喜欢机器的人,很难抗拒这种对宇宙天马行空的探索。\nRLHF 模型详解 近期 AI 圈最火的事情,莫过于 OpenAI 发布的聊天机器人 ChatGPT 了。\n这个智能聊天机器人已经强大到可以让人担忧的地步了。\n那么,它背后的实现原理是什么?\n这篇文章讲解了 ChatGPT 所使用的 RLHF(人类反馈强化学习) 模型是如何实现的以及它的未来会怎样发展。\n基于扩散模型生成音乐 基于文本生成图像的扩散模型已经火了一段时间了。\n我当时还在想,既然基于扩散模型可以生成图像的话,那能不能生成声音呢?\n结果我只是动了动念头,人家这边已经把成果拿出来了。\n这篇文章介绍了他们基于扩散模型生成音乐的项目。\n我试听了一下,效果还不错,挺神奇的。\n资源 tmux 入门,一篇 tmux 的入门教程。tmux 是一个终端程序,可以同时模拟多个客户端控制台,如果觉得不好理解的话,可以认为它是一个控制台的多页签浏览器。因为在工作中经常需要 ssh 登录服务器进行编程开发,我现在已经离不开它了。\n一个有趣的个人网站,作者是一个日本在读博士生,网站放了一些个人的编程作品,主要跟物理模拟、像素艺术有关。\n你好,算法,一本开源电子书,可在线阅读,深入浅出讲解数据结构和算法,生动有趣,适合有一定编程基础但是算法这块有些薄弱的爱好者阅读。\n神经网络在线教程,一套神经网络编程教程,提供在线的 python 代码阅读环境,适合作为入门资料学习。\n订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2022-12-12T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/","title":"机器文摘 第 013 期"},{"content":"机器文摘 第 011 期 长文 自己动手做一个天气墨水屏 有个喜欢动手的哥们,发现了自己及家人的一项小需求,即从家出门的时候想快速知道天气情况。\n虽然这种需求抬眼看一下手机也能实现,但是本着“懒惰使人进步”的核心思想(作者懒得掏出手机)他动手实现了一套基于电池供电的可以显示天气预报信息的电子墨水屏。\n这篇《做一个天气墨水屏》记录了作者从诞生点子到产品出炉的全过程。\n另外作者还开源了项目的源代码,可在这里获取。\nM1 GPU 的故事 GPU 大家都知道,这里有篇文章介绍了它的工作细节。\n作者来自一个给苹果 M1 芯片适配 Linux 驱动的团队(苹果官方不提供驱动,所以这意味着需要做一些逆向工程)。\n本文记录了这些工作中比较有趣的部分,还顺便介绍了 GPU 的一些底层工作原理。\n在 Commodore 64 上实现位图滚动条的显示 Demosense 是一项挖掘计算机硬件机能极限的活动。\n通常创作者们会通过各种编程技巧来实现看似无法达到的效果。\n由于 Commodore 64 这台古董电脑十分经典,现在仍有不少Demosense爱好者在为它开发程序。\n这篇文章讲述了著名 C64 demo 程序 Memento Mori 的实现过程,程序在 Commodore 64 上显示了一副巨大(对于C64来说)的图片。\n这在圈内属于首创。\n动手做一个 4 位 CPU 计算机组成原理是不是还没学明白?没关系,我们可以自己亲手做一个简单的 CPU 。\nNibbler 是一款 4 位 CPU,使用标准 7400 系列逻辑芯片(单个计数器、寄存器、缓冲器和门)构建而成。是一个简单 CPU 的教育示例,易于理解和构建,但仍然能够运行游戏和其他有趣的程序。Nibbler 在 5 x 4 英寸(127 x 102 毫米)穿孔板上使用绕线制造。CPU总共包含17个芯片。\n作者公开了设计图纸和相关资料,可在文章内部的链接中获取。\n资源 纯手撸一个解释器,编译原理没学明白没关系,这本在线电子书手把手教你写一个自己的解释器。 Git 飞行规则 (Flight Rules) ,一个十分全面的 Git 使用指南,把你能遇到的情况都想到了。 Vim 高级进阶,如果你已经学会了怎么退出 Vim,恭喜你,已经击败了 80% 的选手。想要在 Vim 中进行更高效的编辑操作,这份高手指南十分适合作为参考。 Flexbox 布局交互指南,这篇在线教程讲解了如何使用 Flexbox 进行页面布局,难能可贵的是直接在页面中提供了交互操作界面,可以一遍学一遍实践,非常方便。 在线 AI 标注工具,想要训练自己的 AI 模型,比如目标检测、图像分类等等,可以使用这个在线工具进行数据标注,直接上传图片然后在线标注,完成后可导出 VOC、Coco 等格式的数据集。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2022-12-07T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/","title":"机器文摘 第 011 期"},{"content":"机器文摘 第 010 期 长文 极客摄影指南 相机,也是机器的一种。\n我用它记录生活,捕捉生活中转瞬即逝的美好瞬间。\n有个问题一直困扰着我,怎样拍出不那么“到此一游”的照片?\n怎样才能“掌控”相机这个机器?\n这篇《极客摄影》(英文)能够帮助你对摄影做一个真正深入的理解(而不是学习那些充斥社交平台的各种浮于表面的“技巧”)。\n作者是一个热爱摄影的技术男,有二十多年摄影经验。\n听他给你讲讲什么是“光”和“构图”。\n一篇就够了。\nMS-DOS 背后的设计 包括我在内的不少 80 后接触电脑是从 MS-DOS 开始的。\n对于它的黑窗口和命令行都有着很深的印象。\n上大学时执行最多的命令是format c: /s /q\n当年还玩过不少在 DOS 平台的游戏,比如仙剑奇侠传、主题医院等等。\n只是当时没工夫对系统本身做深入了解。\n顶多是,自己在学习汇编语言时,对 DOS 又仔细端详了几眼。\n这篇《凑近看看 MS-DOS 》(英文),介绍了 DOS 系统的设计标准、内存分配、磁盘文件结构、FAT文件系统的技术细节等等。\n想要窥探技术细节的可以点进去看看。\n构建最快的 Lua 解释器 给动态语言编写解释器可能不算太难(如果只是能跑的话)。\n但是如果要编写一个高性能的、好用的动态语言解释器,比如像谷歌浏览器所用的 V8 引擎那样,就比较困难了。\n《构建最快的 Lua 解释器》这篇文章站在更高维度提供一种方法,即:编写一种可以自动生成编译器(解释器)代码的程序,以使得制作高性能解释器变得更加容易。\n我看了一下,大概就是自动化生成之前需要手工处理的编译器优化代码。作为编译原理学的不怎么明白的我,对此不敢评论。\n为什么 Linux 内核没有单元测试? 我对单元测试的态度一般,既不强烈支持,也不反对。\n听说有的开发团队由于对于单元测试十分狂热,已经到了不允许写注释,都用单元测试替代的地步。\n前不久,在 HN 上有网友发起了一个引战的讨论:“既然单元测试这么好,为什么 Linux 内核源码不用呢?”\n以下为部分观点:\n单元测试被严重高估了,TDD有一些好主意,但有一段时间它变成了一种宗教。\n单元测试与TDD宗教不是一回事。它只是意味着将事物划分为小单元并尽可能详尽地测试其功能。\nSQLite不是反例吗?他们有更多的单元测试代码,而不是实际运行的代码。\n资源 Python 100 天从入门到精通,Python 好学吗?好学又不好学,上手容易,精通难。这里有套开源教程囊括了从入门到实战应用(语言基础、数据处理、Web开发、网络开发、爬虫、深度学习等)的所有课程。这个仓库目前已经在 Github 上获得了 12 万star。可以说是好评如潮,想深入学习 Python 的不容错过。赶紧到我收藏夹里吃灰。\n在线单片机模拟器,想要学习单片机开发,又没有硬件设备吗?这个网站最合适。不需要担心手残不会电烙铁,也不用担心买不到芯片。直接在线进行模拟接线,直接运行编写的代码,结果实时展现。 slow roads,一个在线赛车游戏。基于网页制作。亮点在于作者实现了无限地图。所有地形和道路均使用程序生成。游戏有自动驾驶模式,如果只想观赏路边风景的话,可以开启。 TIC-80,TIC-80 是一台用于制作、播放和分享小型游戏的幻想计算机。有内置的开发工具:代码、sprites、地图、声音编辑器和命令行,这足以创建一个迷你复古游戏。在退出时,你将得到一个盒式文件,它可以在网站上存储和播放。 另外,游戏可以打包成一个播放器,可以在所有流行的平台上运行,并按你的意愿分发。为了制作一个复古风格的游戏,整个创作过程是在一些技术限制下进行的。240x136 像素的显示屏,16 种颜色的调色板,256 个 8x8 的彩色 sprites,4 channel sound 等等。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2022-11-29T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/","title":"机器文摘 第 010 期"},{"content":"机器文摘 第 009 期 长文 游戏中的“精灵” 精灵(sprite)这个词来自古法语单词“esprit”,意思是“精神”——源自拉丁语“spiritus”。在民间传说中,精灵是活泼、俏皮和神奇的小生物。然而对于游戏开发者来说,它又是另一个含义了。\n这篇《精灵的惊人历史》(英文),介绍了不同的游戏厂商,在早期硬件机能有限的条件下,如何实现“角色在屏幕上移动”这个现在看似十分简单的事情的。\n对于不了解“精灵”的含义的,稍作如下解释:\n2D 游戏在处理需要动起来的角色时,出于性能考虑,将一部分图形的绘制与背景画面的绘制分开,对于频繁需要刷新(动起来的)部分,单独处理,使他们感觉像是漂浮在背景画面的“幽灵”似的,故名“精灵”。\n任天堂 NES 的一些技术细节 NES 是任天堂推出一款极其成功的家用游戏机(NES : Nintendo Entertainment ,System 是其在北美发售的名称,亚洲叫 FC :Family Computer),不少80、90后的朋友应该都玩过(或者是国内山寨厂商仿制的*霸王之类)。\nNES 使用极其经典的 6502 CPU。这块 CPU 有多经典呢,苹果的 Apple1代2代 、史上销量第一的个人电脑 Commodore 64 、国内早年比较流行的文曲星等,使用的都是这个 CPU。\n《我做了一个 NES 模拟器》(英文),这篇文章的作者在编写模拟器的过程中挖出了不少技术细节,里面还提到了硬件存在的各种 BUG (没错,要模拟的话必须连 BUG 都得模拟,不然有些游戏玩不了),想要了解的朋友可以点进去看一下。\n作为模拟器爱好者,我对 6502 处理器非常好奇,一度希望自己动手也实现一个,而且这款处理器真的非常适合模拟器入门,毕竟只有三个寄存器和百十条指令。\n文中提到的 NES 模拟器在 Github 上开放了源码,有兴趣的可以学习。\n一个桌面开发程序员为了学习 Javascript 而手撸了一个基于 WebGL 的游戏引擎 学习一样技能最好的方式就是动手去做。\n当我感叹牛人怎么那么厉害的时候,往往忽略了牛人的学习过程。\n以为他们天生就那样。\n事实上他们的技能也是靠努力训练得来的。\n不过,学习方法确实很重要。\n《我对 Javascript 的尝试》(英文),这篇文章的作者原本是一个桌面程序开发者(类似 CAD 软件之类)。\n他突然想要学习前端开发,掌握 Javascript 语言。\n于是结合自己之前的知识,使用前端技术做了一套很优秀的 Demo 程序,一个性能和外观都很不错的游戏引擎。\n文章里作者详细介绍了实现过程中对技术、算法的选择等等。\n内容很长,但还算友好,比较干货。\n资源 开发者之路,汇总了各个技术路线的学习资料,包括前端、后端、运维、计算机科学、区块链、移动端、质量管理等等。 总之极其全面。 目前在 Github 有两百多万个 star,被 fork 了 三十多万次。 chrome 插件下载,访问谷歌浏览器插件商店有困难吗?试试这个网站,可以直接下载插件的包文件,下载后拖入浏览器即可安装。不过我已经转换到微软的 Edge 阵营了,用不到这个了。 CSS3 生成器,对于 CSS 的属性参数总是记不住,这个网站就很适合我。每次要调背景渐变、圆角、阴影、动画曲线等等,都得现去搜。有了这个网站,在线点点拖拖,直接复制代码即可。 tesseract.js,可直接在浏览器里运行的 OCR 引擎,支持多国语言(超过 100 种)文字识别。 AI 在线写诗,比较全面的 AI 写诗工具,可以写律诗、绝句、现代诗、歌词等等,根据输入的主题任意发挥。 图片分辨率在线提升,上传图片,网站使用 AI 算法将图片的清晰度自动提升,效果还不错。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2022-11-21T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/","title":"机器文摘 第 009 期"},{"content":"机器文摘 第 008 期 长文 用好 GitHub,给自己建立一个全方位的私有云平台 很多人都有进行个人的知识管理和数字资源管理的需求,市面上也有很多软件工具或者平台来满足这样的需求,但是大部分都是收费的,且自由度不高。我个人经常使用 Github 作为知识管理仓库,我的网络日志、技术博客、私人小项目、电子书籍等都放在上面,生活中已经离不开这个网站了。\n近期读到这样一篇文章\u0026ndash;善用 Github,全方位讲解了 Github 如何使用,如何将其提供的服务发挥最大化的作用,看完受益匪浅。\nGitHub 是微软旗下的一个在线软件源代码托管服务平台,也是一个拥有八千多万开发者用户的社区。很多开发者应该对GitHub有一定的了解,但非技术人员大多可能并不会去使用它。本文更多是想给非技术人员来介绍这个平台,看完这篇文章,希望能让更多人在上面来学习、创作与展示自己的作品。\nWebGPU 是什么?跟 WebGL 有什么关系? 前几天我想在网页上制作一个小游戏,用于尝试一下图形编程相关的技术。用到了一些基于 Web 技术的 3d 图形框架,比如 Three.js、Babylon.js 等等。在尝试的过程中遇到了一个新的名词 WebGPU,之前总是在听说 WebGL 相关的技术,结果说了这么多年,WebGL还没普及,怎么又冒出来一个 WebGPU?于是找了一篇文章,浅扒一下各个图形接口的历史。就是这篇浅入浅出 WebGPU。\n2016年6月,Google 产生了使用新API来代替WebGL的想法,称之为 WebGL Next。 2017年1月,Khronos Group 举办了WebGL Next研讨会,Chromium一马当先,展示了可以基于OpenGL和Metal独立运行的新图形系统原型,同时Apple和Mozilla也分别展示了自己的原型,三者都非常类似于Metal Api。 次月,Apple就向W3C提交了一个名为 WebGPU 的技术概念验证方案,基于Metal图形开放接口,最终W3C采纳了 WebGPU 这个名字作为下一代标准,Apple的提案进入了正式的小组提案中。 3月,Mozilla向Khronos Group提交了基于Vulkan的名为WebGL Next提案。 2018年6月,Chrome团队宣布着手实现WebGPU,这意味着Khronos的失败,WebGPU胜出,大家以后还是团结在W3C的周围。 按照预期,工作组希望在2021年底发布WebGPU 1.0 标准,不过目前只有草案。 WebGPU 1.0 草案:https://www.w3.org/standards/types#WD\n扔掉 Photoshop 改用字符串绘图 相信很多人都接触过使用字符绘制的图片,这在程序员圈子里甚至发展为一门专有的艺术 “ASCII 艺术”。不过我现在不是要说这些,我在一篇 2015 年发表的文章里,发现了这个:有个猛男在自己的程序里彻底抛弃使用 Photoshop 制作的图片资源,改用字符串来描述各种图形(程序界面的图标),然后自己再用代码将其渲染成为高清的图像。\n作者对此很沾沾自喜,他甚至设计了一套自用的语法规范,用特定字母代表特定的符号关系,这样就可以组合出各种复杂的图案了。\n我也在文章的评论区见到了跟我有同样疑惑的读者留言:“这不就是重新发明了 SVG 吗?唯一的区别就是没有用 XML 作为载体”。\n不过文章记录的整个开发过程还是很有趣的,希望了解朋友可以点进去看看 Replacing Photoshop With NSString\n资源 FFmpeg原理,FFmpeg 这个开源项目可能圈外的人士了解不多,但实际上我们生活中一刻也离不开它。现在的网络直播、网络视频网站和移动App、各种视频剪辑合成软件,都或多或少的使用了 FFmpeg 提供的编解码技术。这本在线书籍对于想进一步了解 FFmpeg 以及视频编解码技术的朋友是个不错的参考资料。\n本书《FFmpeg原理》主要讲解 FFmpeg 原理性的知识,前面几章主要讲解一些音视频开发的基础知识,例如原始数据 YUV 跟 RGB,封装格式 FLV 跟 MP4 ,压缩编码的基本概念,还有封装格式分析。\n开源虚拟与远程桌面基础架构,远程桌面软件,开箱即用,无需任何配置。(我个人目前还是使用windows的远程桌面多一些,不过这个开源的rustdesk看起来不错)\n您完全掌控数据,不用担心安全问题。您可以使用我们的注册/中继服务器,或者自建,亦或者开发您的版本 Learn X in Y minutes,这里的教程几乎涵盖所有编程语言,完全没有废话。英文版、中文版都有。如果有编程语言基础的话,通过这个网站确实可以在几十分钟内掌握一门新的编程语言的核心知识。\nFlash 保存计划,Flash 虽然消失了,但是它曾经创造的辉煌一直在我们的记忆里,现在偶尔还想起一些经典的小游戏。这个网站里收藏了很多经典的Flash小游戏,通过一些黑科技复活了它们,可以在浏览器里运行体验。反正我一打开了黄金矿工,就半天停不下来。\nCodeGeeX: 多语言代码生成模型,又一个能帮你写代码的 AI 模型。提供有官方的 VSCode 插件。我试了一下,效果跟 Github 的 copilot 还有一定的差距。\nCodeGeeX是一个具有130亿参数的多编程语言代码生成预训练模型。CodeGeeX采用华为MindSpore框架实现,在鹏城实验室“鹏城云脑II”中的192个节点(共1536个国产昇腾910 AI处理器)上训练而成。截至2022年6月22日,CodeGeeX历时两个月在20多种编程语言的代码语料库(\u0026gt;8500亿Token)上预训练得到\n计算机网络基础学习(英文),一个在线讲解网络基础知识的教程,优点是内容简洁,不用特别多的专用名词唬人,另外还提供了在线实验的环境。\n关于计算机网络的书籍往往令人生畏 - 数千页,无聊的图表\u0026hellip;\u0026hellip;这个教程以几千字的字数引导您了解网络基础知识!它还提供动手实验室来实践所获得的知识。\n订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2022-11-16T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/","title":"机器文摘 第 008 期"},{"content":"机器文摘 第 007 期 长文 如何在 HTML5 Canvas 制作可精确控制时间的动画 使用 Canvas 对象在网页中制作动画非常简单,有不少人喜欢直接使用定时器 setinterval 以一定的时间周期循环执行绘图代码来实现动画效果。但是这种做法有一个弊端,由于显示刷新率以及计算机硬件性能的不同,会导致在不同机器上的表现差异。比如你希望你的动画角色在 1 秒内移动 50 个像素,但是实际执行起来却很难控制。基于时间的动画这篇文章讲解了如何使用浏览器的 requestAnimationFrame API 来实现精准控制动画时间的效果,里面给出了一个很简单的样例,但是基本上给出了一个完整的“更新、渲染、通过时间变化计算运动距离”的游戏控制架构。\n如何使用纯 Web 技术开发一个相机 App 如果不习惯复杂的移动 app 开发环境,直接使用 Web 技术开发一些小的 App 也是十分方便的。我近期希望通过网页实现一个拍照的应用,并且希望不使用手机的原生相机功能,而是自己控制一些相机参数、后期效果、增加特定的取景框等等。于是我找到了一篇教学指南:Make a Camera Web App,只需几十行代码就实现了一个相机 App 。感兴趣的朋友可以点进去看看。\n数据库是如何工作的,从零开始写一个数据库 如果和我一样好奇数据库是如何实现的,可以看看这篇文章。带你用 C 语言从头撸一个数据库出来。\n使用 Rust 写一个操作系统 Rust 逐渐火起来了,这篇 2018 年的文章整理了一份教程,作者尝试使用 Rust 写一个操作系统,我之所以收录它是因为作者还在 Github 开源了代码,并且这系列教程甚至提供了多国语言的版本。制作精良。应该是实践操作系统知识的好教材。\n资源 100 天精通 CSS ,这个网站给了你 100 个关于 CSS 技术的挑战题目,也许练完之后可以达到深入应用 CSS 的效果,我尝试了几个挑战,有些题目的设置有些偏炫技范畴了,想在工作中使用估计会被打死。\nLinux 命令在线帮助工具,对于我这种经常记不住命令用法的人来说真的是一种福音。比如我就经常记不清 tar 命令的用法,面对压缩包解压或者文件打包的工作每次都是去网上搜索一番。有了这个在线工具,直接在命令行中使用 curl请求他的网址就可给出命令的样例用法详解,非常方便。比如执行curl cht.sh/tar 就会给出 tar 的使用样例了,我直接复制粘贴之。\n手机博物馆, 网站收录了各品牌手机的各代产品资料,包括手机图片、型号参数、当时发布的广告等。不过我看了一下,资料应该还不齐全,有些手机只是列了个名字和型号在那儿,还缺少详细信息,估计还在继续收集中。\n中文家用游戏博物馆 ,收录了比较齐全的家用游戏机及掌机的中文版游戏资料。可以直接在线通过模拟器玩耍。有不少经典的 FC、GB、MD 游戏,甚至还有小霸王学习机的 ROM ,可以在线体验。\n订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2022-11-09T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/","title":"机器文摘 第 007 期"},{"content":"机器文摘 第 006 期 长文 怎样写一段代码把自己打印出来? 近期在知乎上看到一个如何编写代码打印自己的问题,感到十分有趣。以前也在网上见到过类似的代码,用 C 或者 Javascript 等各种语言实现的版本都有。当时只是感叹代码写的十分神奇,一段代码在运行之后竟然输出自己的源代码,而且一个字符也不差,并没有搞懂其中的原理。这篇回答里,作者给出了详细解释。并指出,冯·诺依曼早在他编写的《自复制元胞自动机理论》一书中的提出了这种事情在理论上的通用方法。\n如上图所示,自复制系统有五个基本部件:A:通用构造器;B:通用复制器;C:控制器;D:其他函数;ϕ(A,B,C,D)\\phi(A,B,C,D)\\phi(A,B,C,D) : A, B, C, D的编码;当自复制过程启动的时候,B将编码复制一份。A再根据复制出的编码构造出ABCD。最后,C再将这些结构组合起来,构造出一个新的、复制的结构。可以看到,自复制、自打印程序的核心就在于通用构造器和编码,因为复制器、控制器都是比较容易实现的。\n具体实现的示例,文中有更详细的说明。\n最后,此问题可以引申到,大自然中生命基于基因的复制机制,也是与此相关,甚至其背后都是同样的机制。\nKevin Kelly 在 68 岁生日时给出的 68 条建议 凯文·凯利(又称KK, 作者,著有《失控》《科技想要什么》《必然》等),上个月 28 号是他的 68 岁生日,他准备了 68 条简短的建议,作为礼物送给年轻人。\n有人翻译了KK 在 68 岁生日时给出的 68 条建议。\n摘抄几条如下:\n任何一项大工程(修房子、拍电影、开发 app)完成度为 90% 的时候,你都要做好心理准备:剩余的大量细节工作会占掉你另一段与之前相当的时间。\n不要担心自己问的问题听起来很傻。99% 的情况下,其他人都有和你一样的问题,只不过羞于问出口而已。\n别成为一群人里最聪明的那个。和那些比你聪明的人待在一起,向他们学习。如果能找到和你观点相左的聪明人,那就更好了。\n别做最好的。做唯一的。\n任何真实之物都源于虚构之意。想象是宇宙中最强大的力量,也是你能够日益精进的能力。生命中可以因不知众人所知而获益的能力,仅此一项。\n经验往往被高估了。招募的时候,要看资质,技能则可以培训。许多令人惊奇和赞叹的事情,都是由第一次做的人做出来的。\n怎样搭建一个最简的 GIT 服务器 GIT 是现在软件开发过程中必不可少的版本控制工具,功能非常强大,我们平时直接使用单位的私有服务或者在线的云服务(如:Github 等)。\n如果想要搭建个人的服务,可能就比较繁琐一些。阮一峰老师的这篇博客就解答了怎样采用极简的技术路线,为自己搭建一台 GIT 服务器。\n自己搭建 Git 服务器的原因,无非就是不方便访问外网,不愿意代码放在别人的服务器,或者有一些定制化的需求。 这时,你可以选择开源的 Git 服务器软件。 Gitlab CE Gitea Gogs Onedev 这些软件里面,Gogs 的安装是最简单的,但是功能相对比较弱。功能越强的软件,安装越复杂。 如果你只是想远程保存一份代码,并不在意有没有 Web 界面,或者其他功能,那么根本不用安装上面这些软件,一行命令就够了。\n为什么很多程序员讨厌低代码? “低代码”(一般指:不用或少用编写代码的方式进行软件开发)这个词近两年又开始火了,它代表着对软件工程的一种美好“幻想”,即:花费更低的代价去构建复杂的软件系统。\n虽然每隔一个时间周期都会被重提一次,但是每次都未能如愿。\n现在既然又被频繁提及,我在知乎上发现了这样一篇关于低代码话题的回答。从程序员的视角表达了对低代码这种期望的观点,有兴趣的朋友可以点进去看看。\n软件工程这门学问,研究的就是“如何利用工程思想,从整体上降低开发复杂性”;但与之同时,它不得不反复强调“软件工程试图解决的、是人为引入的不必要的复杂性;但工程的本质复杂性是无法逃避的。因为没有银弹,没有银弹,没有银弹!”\n我个人的观点是:低代码或者配置化、拖拽式软件开发,很难平衡对复杂现实的抽象程度和开发便利性的矛盾关系。如何做到既提供方便的组件同时又不限制对个性化需求的实现,这需要非常强大的设计能力以及对于特定应用场景的取舍。目前来看,如果要做到或者接近上述状态,必然要先消耗巨量的成本,至于是否值得,可能不同的主体会有不同的选择吧。\n资源 从加减乘除到机器学习,一本不错的数学扫盲书,如果你在学习人工智能的时候对数学感到吃力的话,这本书非常适合阅读,一点也不枯燥。主要讲解线性代数相关的知识。\n命令行的艺术 想成为命令行高手,掌握这一篇就够了。\n熟练使用命令行是一种常常被忽视,或被认为难以掌握的技能,但实际上,它会提高你作为工程师的灵活性以及生产力。本文是一份我在 Linux 上工作时,发现的一些命令行使用技巧的摘要。有些技巧非常基础,而另一些则相当复杂,甚至晦涩难懂。这篇文章并不长,但当你能够熟练掌握这里列出的所有技巧时,你就学会了很多关于命令行的东西了。\n基于实际项目的学习,这是一个巨大的代码工程资源索引,里面列举了针对各种编程语言的个人项目,当你不知道该如何去深入学习一门编程语言的时候,选择一个这里的项目然后自己动手跟着练一遍效果绝对惊人。入选的项目都十分有趣,比如怎样用 C 写一个解释器、怎样写一个自己的编辑器、自己动手实现 TCP/IP 协议栈,等等。\n霞鹜文楷,一款开源中文字体,基于 FONTWORKS 出品字体 Klee One 衍生。用来看书非常舒服,特别是在排版上。微信读书已经内置,如果是第三方支持自定义字体的可以试试。\n订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2022-11-02T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/","title":"机器文摘 第 006 期"},{"content":"机器文摘 第 005 期 长文 穿越到 1983 年学习 BASIC 很多著名的程序员,尤其在计算机游戏行业,孩童时期就在苹果 II 和 Commodore 64 这样的 8 位计算机上开始编写游戏,John Romero、Richard Garriott 和 Chris Roberts 都是这样的例子。这好理解。在 8 位计算机时代,很多游戏只能在计算机杂志和书籍中以印刷的 BASIC 程序清单方式得到。如果你想玩其中一款游戏,就必须手工键入整个程序。不可避免的,你可能遇到一些问题,所以你就得调试你的程序。等到你让它可以工作起来了,你就已经对程序是如何运行的有了足够的了解,你就可以开始自己修改它了。如果你是一个狂热的游戏玩家,你几乎必然会成为一名优秀的程序员。\n喜欢小霸王的小伙伴(老伙伴?),不可错过的文章,一起跟随作者回忆一下如何在老古董电脑上运行BASIC程序,顺便怀念一下当年靠着一本说明书就在小霸王学习机上编写(抄写)游戏的时光。\n文中提到的 Commodore64 电脑可以在这里下载模拟器。 在 Github 的 Pages 服务里跑 SQLite 作者尝试做一个小网站来显示一些统计数据,于是他想到了用数据库,但是,使用数据库需要托管和维护后端服务,或者每次将整个数据集下载到浏览器中(当数据集超过10MB时,体验就变得很差劲)。\n于是作者开始琢磨有没有办法找到一个可以在静态服务器上搞一个数据库服务得可能,毕竟提供静态服务的地方有很多(如 GitHub,GitLab,Netlify 等等)。\n一通折腾下来(借助了 WASM 技术并适当的进行一些魔改),作者竟然实现了一个 100% 静态托管的数据库服务。\n语句、表达式和海象操作符 这是一篇介绍如何通过“海象操作符“(类似这样:foo := 'bar')使得Python语句更加精炼的文章。\n这种操作符之所以可以使得语句更加精炼,主要原因就是它使得一句代码既进行了赋值然后又作为表达式返回了值。\n之前写 Python 代码的时候都没注意还有这种写法,而且貌似这在 C 和 C++ 中都是基本的特性。不过 C 和 C++ 是赋值语句=直接就返回了表达式的值,同时这给程序员提供了出错机会(有不少人应该还记得条件判断时少写了个等号导致的问题)。\n给个人开发者的一些建议(英文) hacker news 上的网友针对有志于运营自己的SaaS产品的个人开发者提了一些心得和建议。\n摘抄一点儿如下:\n关于做什么,做那些你自己都愿意付费的东西,别指望做出一个你自己都不想花钱使用的产品有别人来买单; 还是关于做什么,不要做需要漂亮UI的东西,那会让你陷入编码之外的很多麻烦(确实很牵涉精力),如果提供的工具能够通过简单交互就能提供优质服务最佳; 如果有可能,尽量提供自助服务模式,也就是说让用户不用见到你就可以自行操作付款了(作者这是有多社交恐惧?); 资源 数据结构与算法可视化,是一个学习算法知识的好工具。通过动图来演示和讲解数据结构和算法实现原理,针对每一个常用算法不仅有直观的图示,还附有一篇详细的文档,内涵原理知识以及代码实例,网站甚至还提供了答题练习功能,可以一边学习一边做题。 SLip,一个在浏览器中运行的Lisp解释器,使用Javascript实现。网站提供了一个简易的IDE,可以直接在页面中进行编程开发,还提供了图形绘制的扩展包,用于学习lisp语言非常合适。 针对 Windows 预先编译的 Python 扩展包,在使用Python的时候,尤其是在Windows环境,经常会遇到有些扩展包由于依赖某些二进制库的原因导致无法通过pip直接安装,自己动手编译又十分麻烦。这个网站提供了各种预编译版本,可以直接下载网站提供的whl文件到本地然后安装。 3D 渲染器入门,一套计算机图形学的入门教程,从原理讲解开始,手把手教你用C++语言编写一个自己的光线追踪渲染器。 HTMLDOG,前端开发基础知识大全,主要是 HTML、CSS、Javascript 的手把手教学以及语言参考。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2022-10-26T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/","title":"机器文摘 第 005 期"},{"content":"机器文摘 第 004 期 搞机 美国德州仪器公司出品的TI图形计算器是一种既能计算又能作图的新型的数学使用工具,它具备符号代数系统、几何操作系统、数据分析系统等,可以直观地绘制各种图形,并进行动态演示、跟踪轨迹。\nTI实体计算器的售价十分昂贵(相较于其他消费类计算器),这里有一个开源项目wabbitemu,使用C语言编写的一个TI计算器的模拟器,可以在电脑上运行并模拟TI计算器,支持多种型号,如TI-82、TI-83、TI-83-plus(需要加载对应的ROM)等。\n甚至有人基于这个项目编译出了Android的版本,安装后手机秒变成高级科学计算器。\n想进一步了解TI计算器的强大,可以看一下这篇文章《计算器与计算器游戏发展简史》。\nTI计算器模拟器安卓版本下载地址(含ROM文件) TI计算器使用说明书 以上资源来自@Karen的日志\n观点 社交媒体的正确使用方法: 一,不浪费一秒钟时间和知识结构相差太大的人去解释/讨论。你没有义务也没有这个精力。对任何不友好评论,迅速拉黑。 二,通过公开展示你的思考,来寻找在知识结构,兴趣或技能上,可能与你产生互补作用,或者 1+1\u0026gt;2 的效应的朋友。公开展示长期留存的文字记录,效率最高。\n来自@硅谷王川\n长文 我是如何用21天刷完SICP SICP 全称 Structure and Interpretation of Computer Programs,翻译过来叫《计算机程序的构造和解释》,是一本关于计算机程序设计的总体性观念的基础教科书,由麻省理工学院出版社与麦格罗希尔出版社共同出版营销。作者是麻省理工学院教授哈尔·阿伯尔森、杰拉德·杰伊·萨斯曼。\n这本书是计算机编程领域非常经典的一本教科书,内容覆盖范围非常广泛,从编程入门一直到教你亲手设计实现一个编程语言解释器。虽然是一本几十年前的书,但是书中的编程理念如数据驱动、过程抽象等到现在仍不过时。可以说是程序员修炼“内功心法”必读的一本好书。\n这篇《我是如何用21天刷完SICP(中文)》的文章讲述了作者通过阅读本书学习的过程和心得,里面的观点可以借鉴,我在看完之后也想再把这本书拿出来学习一遍。\n觉得看书太晦涩的,可以到下面这个项目里下载本书作者课堂讲解视频(国内好心人给做了翻译字幕)\n『计算机程序的结构和解释』公开课 翻译项目 百度网盘SICP文件夹 中译版视频专辑列表(bilibili) 图解Stable Diffusion模型 这篇图解Stable Diffusion模型(英文)详细讲解了 Stable Diffusion(最近比较火的那个可以通过文字描述进行绘图的AI模型)的工作原理。文中使用清晰的图示阐述了“扩散”模型是怎样通过给图片增加噪声一步一步生成图像的。\nWine是如何工作的 Linux桌面用户都遇到过在不得不运行 Windows 软件的时候,这个时候就可以使用这个叫做 Wine 的兼容程序,它可以让你在 Linux 下执行 win32 程序。( Valve 最新出品的游戏掌机 Steam Dect 就使用了 Wine 作为兼容层来运行 Windows 平台下的游戏)。\nWine 的名字来自于 “Wine Is Not an Emulator” 这个英文缩写。\n这篇《Wine是如何工作的(英文)》介绍了它的基本工作原理。\n在 Windows 记事本里运行光线追踪 光纤追踪(Ray Tracing)是一项计算机图形学技术,使用该技术渲染的计算机图像具有逼真的全局光照效果。\n这篇《记事本中的光线追踪 30FPS》记录了作者突发奇想要在Windows上的记事本中进行光线追踪渲染的趣事。\n其原理是通过系统API获取到记事本窗口的句柄,然后利用钩子函数给记事本的窗体发送相应的“消息”以及覆盖对应的内存数据来实现对记事本窗体界面的“魔改”。最终实现了在另一个进程里执行光线追踪算法,然后借用记事本中显示的字符来替代画面像素,从而“渲染”出画面的效果。\n资源 SerenityOS项目,一个从头开始的桌面操作系统,内核采用类似Unix的架构,界面外观则仿照了上世纪90年代Windows的窗口风格。作者并未将其定位成玩具,而是一款具备生产力的操作系统软件。 除了操作系统本身,这个项目还有配套的编程语言Jakt、自己的浏览器引擎LibWeb和浏览器Ladybird ​​​\n《中文技术文档写作规范》,阮一峰老师整理的技术文档写作规范,规定了标题、文本、段落、标点符号等文档元素的使用约定,需要经常编写技术文档的朋友可以收藏看看。\nFreehand意绘,一个在线的AI绘图工具,可以根据文字描述帮助你生成图片,界面简洁友好,使用方便。 计算机科学自学指南,提供了一份自学计算机科学的全方位资料大全,可以根据内容系统地进行学习计算机科学相关的知识。\n互联网上,到处都有许多的学习资源,然而精华与糟粕并存。你所需要的,不是一个诸如「200+ 免费在线课程」的清单,而是以下问题的答案:\n你应当学习 哪些科目,为什么? 对于这些科目,最好的书籍或者视频课程 是什么? 在这份指引中,我们尝试对这些问题做出确定的回答。\nUNIX环境中的高级编程,一套编程教程,在课程中,主要学习用C编程语言开发复杂的系统级软件,同时深入了解Unix操作系统(以及属于该家族的所有操作系统,如Linux,BSD,甚至Mac OS X)及其编程环境。\n涵盖的主题将包括用户/内核接口,Unix的基本概念,用户身份验证,基本和高级I / O,文件系统,信号,进程关系和进程间通信。还将涵盖Unix系统上软件开发和维护的基本概念(开发和调试工具,如“make”和“gdb”)。\n写在C头文件里的3D物理引擎,一个仅用C99标准写在C头文件里的超小物理引擎,没有依赖,直接包含头文件即可在你的工程中使用,功能完整,内置向量、三角函数、引力等计算库。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2022-10-18T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/","title":"机器文摘 第 004 期"},{"content":"机器文摘 第003期 搞机 收听广播可以缓解压力(个人体会) 近期我找到一个缓解焦虑的新方法,听收音机。\n一定要老式的那种,收听真正无线电波信号的。随便找个台,最好还带有滋滋啦啦的杂音,当作工作时的背景声音,听着听着就感觉无比的放松。但又不是简单的“粉红噪音”、“白噪音”带来的那种平静,这种“仿佛脱离现在、回到了某个时空”的感觉让人感到愉悦。\n我还没找到相关的研究信息,有人知道原理吗?\n动向 欧洲通过法案,将强制统一USB Type-C接口为充电接口 欧洲议会今天以压倒性多数投票赞成在2024年底之前将USB-C作为包括iPhone和AirPods在内的各种消费电子设备的通用充电端口。\n这对于苹果来说恐怕是个坏消息,对于消费者来说应该是个好消息。不过也许以苹果公司的脾气,说不定将来取消所有物理接口也有可能。\n欧洲强制iPhone使用usb-c接口 波士顿动力承诺不将机器人武器化 当地时间 10 月 6 日消息,波士顿动力、Agility Robotics、ANYbotics 等 6 家公司联合发表致行业的公开信表达了他们对这些可能性的担忧。他们称,先进的商业化机器人的经济可负担性和可获得性越来越强,其被滥用的可能性也越来越大。我们承诺不会将通用机器人或软件武器化,也不会支持其他人这么做;同时呼吁政策制定者、开发者和用户共同促进安全使用。\n我个人感觉此类声明并不会带来什么限制,相反地,我偏悲观的认为这种技术很可能以最优先的速度被应用于军事目的。\n网易新闻:波士顿动力承诺不将机器人武器化 TAOCP(《The Art of Computer Programming》) 4B正式初版 图片来自@算法时空\n世界著名程序员——高德纳老师,日前在他的个人网站宣布了TAOCP 4B正式出版的消息。\n这部计算机世界的经典巨著,耗费了高德纳老爷子的毕生心血,虽然已经出到了第四B卷,但本书目前还没有完全写完(本书从1962年开始写(中间停了几年是因为老爷子发现没有趁手的排版软件,就顺手发明了TEX——这又是另一个宏大话题了),计划共有七卷,其中第四卷分ABC三册)。他在自己主页中提到:\n与此同时,我继续研究第3部分(第4C卷),它已经有许多令人兴奋的主题。\n我只能说:祝老爷子身体健康!\nWebAssembly技术发展的怎么样了? WebAssembly 是一种运行在现代网络浏览器中的新型代码,并且提供新的性能特性和效果。它设计的目的不是为了手写代码而是为诸如 C、C++和 Rust 等低级源语言提供一个高效的编译目标。 ——来自Mozilla官方文档关于WebAssembly概念的介绍。\nWebAssembly技术号称可以在浏览器中高效执行代码,并可以很方便地将C、Rust等各种语言编译到浏览器中执行,那么目前他的使用体验如何?\n我周末做了简单体验。\n通过官方给出的文档和入门指南,可以很快速地搭建出程序的原型,上图就是我参考官方示例将Rust代码编译到网页中执行的效果(是一个经典的Game of life的小游戏)。\n从开发上来说,现在已经有了比较成熟的工具链(尤其是针对Rust语言到WASM的工具),和共享库的生态,想要进行开发,不必像前些年那样费心地搭建开发环境,基本上在Linux系统下简单执行几行命令即可完成环境搭建。\n从执行效果来说,我没有做性能测试,直观感受上来说,确实比原生js快了不少。\n但这并不是重点,我个人觉得这项技术它最大的意义在于,将之前的桌面程序技术有了向Web移植的可行性。\n我们有可能很快就看到完全兼顾Web分发的方便和桌面程序性能体验的产品。\n一则WebAssembly相关的新闻 GitHub网友整理的关于WASM的资源大全 一本手把手教你使用Rust语言进行WASM开发的在线电子书 一个使用WASM技术将三维设计软件CAD嵌入到网页中的开源项目 一个使用WASM技术在浏览器中运行的PostgresSQL数据库 观点 在你的密码里面放上一个逗号\u0026quot;,\u0026quot;,这样当你的密码在网上被人拖库时可以给黑客增加一些麻烦,因这样会使得他在作为csv文件往他的密码字典里面导入的时候,因为逗号分隔符的错位而让他崩溃。 注:csv文件默认使用逗号分隔符区分字段。\n来自:佚名网友。 当你长期使用windows远程桌面进行远程办公时,一层一层的服务器登进去,时间长了就会陷入盗梦空间那种疑惑,我现在是在哪一层?\n来自:我自己。 量子计算机就是向过去和未来借用了很多乃至无限的时间吗?刹那即永恒。 注:量子计算机号称每个bit位可在同一时刻表示多种状态。\n来自:我自己。 长文 从0到1打造家庭弱电方案 现在有不少人在困惑家里的网线该如何布局,这篇《从0到1打造家庭弱电方案》(中文)记录了作者完整的装修过程,内容十分精彩详尽。看完之后我有点儿后悔,当时装修时没有给各个房间拉上光纤,以及用了比较普通的超五类网线。\n如何配置一个完全基于命令行窗口的开发环境 我在油管上关注了一个日本小哥(Takuya Matsuyama),是一个个人开发者,经常上传自己的开发过程录屏,他完全基于命令行窗口(控制台)进行开发,没使用任何IDE。\n后来我参考他的配置文件给自己也配置了一套,使用fish作为shell,neovim加上各种插件作为主力编辑器,现已成为我的日常开发环境。\n有条件的可以到他的主页看看关于如何配置的详细介绍,或者直接去他的github仓库获取配置文件。\nTakuya Matsuyama小哥的主页 他的基于控制台命令行开发的各种配置文件 云桌面并不像你想的那么好 给开发人员配置一个廉价的笔记本加上一个高性能的云端工作站,这个点子棒不棒?\n听起来有很多的优势,兼具了性能、便携性、安全性等等。\n不过先等一等,这里有一位作者在这样尝试了之后,给出了不少负面反馈(比如多显示器支持、GPU加速、网页视频质量等等问题),有兴趣的可以点进去看看。\n《云桌面并不像你想象的那么好》(英文) 资源 从高中到大学,数学中常用符号和计算关系的英文名称,适合对数学公式中的各种符号感到困惑的人收藏,这本小册子汇聚了所有数学符号、常用希腊字母、代数式等英文叫法介绍。 如何在Ubuntu下进行x86-x64汇编语言编程,一本讲解现代汇编语言的电子书,基于常用的Ubuntu系统,从认识汇编语言开始讲起,到工具链的准备和怎样编写和调试程序,都有详细的介绍。 DrawKit,一个提供矢量插画的网站,有很多免费的高质量插画,可用于网站制作、软件产品等方面。 计算机教育中缺失的一课,一般学校里不会教开发环境的配置和各种效率工具的使用,这本电子书就是以环境和工具为切入点,将学校学习的理论应用于实际,比较接地气。 大学里的计算机课程通常专注于讲授从操作系统到机器学习这些学院派的课程或主题,而对于如何精通工具这一主题则往往会留给学生自行探索。在这个系列课程中,我们讲授命令行、强大的文本编辑器的使用、使用版本控制系统提供的多种特性等等。学生在他们受教育阶段就会和这些工具朝夕相处(在他们的职业生涯中更是这样)。 因此,花时间打磨使用这些工具的能力并能够最终熟练地、流畅地使用它们是非常有必要的。\n订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2022-10-11T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/","title":"机器文摘 第 003 期"},{"content":"机器文摘 第002期 搞机 MNT推出了一款名叫Pocket Reform的迷你笔记本电脑。它外形紧凑(屏幕只有7英寸),但功能齐全,据官方介绍,它的性能满足轻量办公需求,甚至还能玩一些游戏(ARM平台)。虽然现在的智能手机在性能方面已经有了很大提升,且便携性远超笔记本电脑,但是还是有相当一部分人倾向于在具有真实物理键盘的“电脑”上进行操作。\n在我看来,这台设备可能对于希望随时随地写两行代码的程序员更加具有吸引力。\n参考文章: 可以装在口袋里的开源PC 动向 文字直接生成3D模型 谷歌实验室的几个哥们上周发布了一个新作\u0026mdash;-DreamFusion。输入文字,就能生成带深度图和法线的3D模型。\n开发团队声称:\n最近在文本到图像合成方面的突破是基于在数十亿个图像-文本对上训练的扩散模型。将这种方法应用于3D合成将需要标记大量的3D资产和用于对3D数据进行去噪的高效架构,而目前这都不太可行。在DreamFusion中,我们通过使用预先训练的2D文本到图像扩散模型来执行文本到3D合成来规避这些限制。我们的方法不需要3D训练数据,也不需要修改图像扩散模型,证明了预训练图像扩散模型作为先验的有效性。\n具体方法据称是来自他们新提出的“一种通过优化损失函数从扩散模型中生成采样的方法”该方法允许他们在任意参数空间中优化采样(例如3D空间)。\n我看了一下官方给出的demo,3D模型还略显粗糙,不过可能将来算力提升之后会有改善。\n现在,除了插画师受到了职业威胁,就连3D建模工程师的工作也有可能被AI取代?\n参考文章: DreamFusion官方介绍 通过文字描述生成语音的人工智能也来了 Twitter 用户 Felix Kreuk 发布了从文本到音频 (Text to Audio) 的 AI 模型:AudioGen AudioGen 可以 (1) 根据文本生成音频;(2) 续写指定的音频;(3) 同时做以上两件事,根据指定文本描述生成指定音频。 作者给出的展示DEMO里展示了如下文本生成的语音: (1)在风声中吹口哨 (2)男人在说话时伴有鸟和狗的叫声 (3)警报器和嗡嗡作响的引擎接近后走远 (4)鸽子咕咕叫并伴有沙沙的声音 (5)男人说话的声音,背景伴有人群欢呼声\n从作者公布的架构图上可以看出来,采用的也是Transformer神经网络。之前在看到AI画图时我就想到同样的原理可能用于生成音频,结果这才没过几天,人家都已经做出来了。\n参考文章: @海辛Hyacinth 作者的demo和原理介绍页面(托管在github) 观点 站桩的简单,枯燥和有效,就好比持有 sp500 指数基金简单,枯燥但足以秒杀 95%以上的基金经理一样。 莫将容易得,便作等闲看。\n来自@硅谷王川 长文 为什么现在的软件这么慢(英文),作者在Windows系统(Windows 10, 21H2版本)下使用“录音机App”的时候获得了极差的体验(确切的说是软件启动后大概卡死了将近20秒)。于是动手分析到底是什么原因导致,然后发现主要是这个软件启动后疯狂扫描“用户”文件夹下的录音文件用于构建界面中的录音列表,这种密集IO操作导致软件停止响应。作者花了很大的篇幅来吐槽这种行为,对于微软工程师为什么这么做表示莫名其妙。不过由于我们现在的计算机大都使用了固态硬盘,而且我们的习惯一般不会在“用户”文件夹下存放太多文件,所以这个体验应该不太明显。但即使这样,我也同样对Windows系统现在的软件质量感到担忧。 内卷、汉明问题与认知迭代(中文),作者较为科学地分析了内卷的定义和形态,从而引申出了关于什么是“人生中重要的事”的思考,文章虽然比较长,但也清晰易懂,发人深省。部分引用如下:\n从大的方面说,社会需要创新,个人则需要突破,而创新和突破又都要求我们不断地精益求精。那么,内卷与精益求精是本质上一样的吗?如果不是,两者的区别在哪?\n在某件事情上花费太多精力,并不一定就是内卷;在无关紧要的事情上花费精力才是真的内卷。\n汉明早年在贝尔实验室工作。那年春天,他经常和几位同事聚在一起在餐厅吃午饭。吃饭期间,他向其中一位叫Dave McCall的同事提了一个问题:“在你的领域里最重要的问题是什么?”大约一个星期后,再次一起午餐时他继续发问:“你目前正在研究的最重要的问题是什么?” 显然,这位同伴对于这两个问题的回答并不一样。于是他接着问:“如果你当前做的并不是最重要的事,那为什么还要一直花时间投入去做呢?”有了这「灵魂三问」之后,于是——在那个春天接下来的日子里,汉明不得不另找别的同伴一起吃午饭了…… 汉明的问题听起来有些让人生厌,但后来演变成了一个在学术界很受关注的问题——汉明问题(The Hamming Question)。它本来说的是科研选题的事情,但实际上关乎人生最重要的选择。\n内卷,指的是在低水平的状态下无实质意义的消耗。这里的「低水平」,可能是客观的,也可能是主观的。 针对主观的低水平状态,我们需要冲破意识层面的障碍,同时把读书、实践和思考结合起来,反复迭代,这样才可能跃升到更高的认知层次上。 而针对客观的低水平状态,唯有认真对待汉明问题,选择好真正重要的人生大方向,才能避免卷入那些无关紧要的、无谓的消耗中去。这才是真正考验大智慧的时候了。\n资源 每个程序员都需要知道的 ,整理了一份资源合集,包含了软件工程师技能相关的各类知识资源,包括算法、数据结构、浮点、Unicode、时间、内存、分布式、正则、安全、架构、工程哲学、实践、职业发展、软技能。。。等等,以及一些可用于技能训练和学习的站点。看起来非常符合我这种“收藏了就是学习了”的囤积爱好者的胃口。 Word Writer 6 6502汇编源码,是一份开源的Word Writer 6的6502汇编源码,可在模拟器下编译运行。用来学习6502汇编是一个不错的项目。上个世纪80年代爆火的计算机Commodore 64是很多复古计算机爱好者(包括我)的最爱,Word Writer 6是该平台上流行的文字排版编辑软件。 HTTP Archive的年度报告,这份报告详细(超级详细)分析了目前全球各在线网页中所使用的技术,从页面中的“CSS”、“Javascript”、“字体”以及用户体验中的“搜索引擎优化”、“移动端支持”等超过20个方面进行展示,内容十分详尽,有种看NBA的进球统计的感觉。 Javascript Quiz,一份关于Javascript的小测验,可在线作答,一共十道选择题,全是关于Js语法的常见坑,每道题答完之后都可以点击“info”图标获取关于这道题的详细解释。我试着做了一下,勉强及格。 Streams,这里有一批纯AI创作的音乐,由AI负责作曲和编曲,工程师只是把这些乐谱放入DAW软件中进行混音和录音,完成度很高,听起来相当上头。 学习合成器,这个网站提供了一本交互式电子书,讲解了电子合成器的原理,还单独提供了一个交互页面用于调制和体验各种合成器音色。我尝试了一下,真的很直观,在页面中直接可以修改各种振荡器波形、滤波器、LFO等参数,非常适合用于音色合成入门。 函数式编程指北,在线电子书,讲解函数式编程的范式,以Javascript进行举例,作者风趣幽默,深入浅出,觉得被函数编程概念唬住的可以去看看。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2022-10-03T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/","title":"机器文摘 第 002 期"},{"content":"机器文摘 第001期 搞机 TurnT是一个颇具创意的唱盘设计,它把智能手机与模拟黑胶的老式音乐播放方式相结合。用家把触笔放在手机屏幕显示的黑胶唱片上,它即开始播放。从内部结构上看,它其实是一个无线扬声器,可以连接到智能手机播放音乐。TurnT这种播放音乐的体验增加了互动的体验感,如同在实际的唱片上一样,挪开唱针会立即停止音乐,将其“向内”移动到手机屏幕上显示的光盘中心就可以播放音乐。要更改歌曲,您可以通过滑动来更改专辑,还可以重新定位。\n参考文章: 把手机变成黑胶唱机 \u0026mdash; Yamaha发布了与智能手机配合使用的独特音乐设备 动向 AI生成图像技术带来的“艺术危机” 近几周,基于AI生成的图像艺术作品的新闻越来越多,以DALL-E、Stable Diffusion等神经网络模型为代表的图像生成类AI进化越来越快,已达“以假乱真”程度。我也在动手尝试后惊叹他们的生成效果非常逼真和充满想象力。然而很快,此类AI就引起设计师、画师、艺术家的反对(恐慌?)。当然也有很多持积极态度,把它们当作工具加以利用,甚至不乏商业头脑灵活的人士,已经通过AI作画开始获取收益。于是引发了一系列的反应和讨论。\n参考文章: 知名图库Unsplash 宣布禁传AI生成图像 付费图库集体封禁AI生成图片 AI 绘画 Windows 本地零基础搭建 Stable Diffusion AI数字绘画 stable-diffusion 保姆级教程 一个包装好的AI绘图开源GUI客户端 观点 程序员是计算机的翻译官。他们先是把人类的语言翻译成计算机的语言,现在又教会了计算机使用人类的语言。\n来自@t0mbkeeper 长文 对很多事情都有兴趣,但是生命的时间有限,怎么办?这篇hacker news上的讨论(英文)或许能提供一些建议。 这篇文章提到了一项关于焦虑的研究(英文)。研究表明,远离社交媒体(包括及时通讯工具)一个星期,可以显著提升幸福感、降低焦虑程度; 掌握一项技能需要时间和实践,降低预期,慢即是快。《我是如何学会编程的》(中文),这篇文章是一位网友分享的关于他学习编程的历程。 资源 coding-fonts ​​​是一个不错的编程字体网站,可以在线预览各种适合编程开发时用的字体,让选择更加直观。 深度强化学习羊了个羊 这个github仓库开源了一个通过AI强化学习来玩耍“羊了个羊”游戏的模型及代码,结构清晰,效果很棒,用于了解深度强化学习知识非常不错。 深度学习500问这本在线书籍以问答形式对常用的概率知识、线性代数、机器学习、深度学习、计算机视觉等热点问题进行阐述,目前在github将近50k颗星。 订阅 这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。\n喜欢的朋友可以订阅关注:\n通过微信公众号“从容地狂奔”订阅。 通过竹白进行邮件、微信小程序订阅。 ","date":"2022-09-28T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-001-%E6%9C%9F/","title":"机器文摘 第 001 期"},{"content":"背景 之前一直有收藏文章并整理自己知识体系的习惯,使用的工具是evernote(印象笔记),十多年来收集数百篇网络文章,自己整理并编写笔记若干篇,已做到目录和标签的基本分类; 之前也有通过每日编写一个markdown文件来记录工作日志、零星日记的习惯,有心得感悟时都直接在工作日志中随手写入,保存起来; 通过github pages写过一些个人博客文章,更新频率不高,主要作为个人笔记在使用; 当前问题如下: evernote用户体验逐年下降,对设备限制较多,且内容存在云端、格式封闭,个人掌控感较差,数据有无法访问的风险; 工作日志中散落的心得感悟没有索引,基本埋没在以日期命名的文件里,不成体系; 收集的数百篇网络文章基本没有进行消化阅读,未形成自己理解的内容; 目标 为网络收藏和个人产出的文章建立索引,把之前的“仓库”形成“体系”; 从evernote中迁移出来,所有数据放在本地,并通过在线网盘进行同步; 以纯文本+附件资源作为载体,避免对一种编辑器或工具产生过度依赖; 工具选择 Obsidian,用于建立最基本的知识仓库,编辑自己的知识卡片,并充分利用它的双向链接功能将收藏的文章和自己输出的内容形成体系连接起来; vscode, 用于编辑技术文章、工作日志以及基于插件进行绘图,最终输出内容到Obsidian文件库中; 360网盘,用于在线实时同步存储Markdown的文件夹,任何具有同步文件功能的网盘均可; 具体计划 整理文章目录:按照文章来源(网络、书籍、心得)、知识层面(技术、生活、哲学)等进行分类,形成树状目录结构; 整理文章标签:每篇文章虽然只属于一个目录,但是可以有多个标签,提升了检索文章的维度。目录作为知识体系的骨架分类,标签则是详细划分(如技能相关的标签就可以有:编程、绘画、音乐、写作,并还能进一步细分); 参考少数派文章玩转 Obsidian 01:打造知识循环利器提到的Zettelkasten笔记法逐步整理多年积累的知识形成以“知识卡”(其实就是具有互相链接关系的Markdown文件)为单位的知识; [[玩转 Obsidian 01:打造知识循环利器 - 少数派]] 阅读整理多年收集的知识文章,按照大约每周一篇的节奏,产出自己理解后的知识卡片,形成“知识循环”; 如此往复若干时间,不断完善这个体系,工具可更换,载体亦可更换,唯独不变的是探索、求知的心; ","date":"2022-04-23T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8Emarkdown%E6%A0%BC%E5%BC%8F%E7%9A%84%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86%E5%B0%9D%E8%AF%95%E8%AE%A1%E5%88%92/","title":"基于Markdown格式的知识管理尝试计划"},{"content":"简介 《少有人走的路-心智成熟的旅程》这本书据说是畅销多年,经久不衰,在豆瓣上评分很高。不少人纷纷表示此书给自己带来了很多思考和感悟。我是在今年第二遍阅读了此书,之前大约十年前草草看过一遍,印象不够深刻。但今年再读,书中就有很多文字能够读进去了。虽然作者本身对“爱”的定义和解读我并不完全认同,以及作者也许受宗教信仰的影响,在某些观点上有一定的倾向,但都不妨碍这本书给我带来震撼。\n笔记 人生苦难重重。\n开篇就表达了最基本的设定,让我闭上本来想要抱怨的嘴,不得不跟着往后翻看有没有可以解决的答案。\n解决人生问题的关键在于自律。人若缺少自律,就不可能解决任何麻烦和问题。在某些方面自律,只能解决某些问题,全面的自律才能解决人生所有的问题。\n在认真看本书之前,我对“自律”的理解还仅限于在生活上严格要求自己,作息规律、遵守诺言、办事靠谱、简约不浪费。但作者显然不仅仅是这个意思,否则也用不着用很大的篇幅来说“自律”。\n看一下作者对“自律”的定义。\n所谓自律,就是主动要求自己以积极的态度去承受痛苦,解决问题。自律有四个原则:推迟满足感、承担责任、忠于事实、保持平衡。\n只有不回避问题、以积极的心态去解决问题,才算作是自律。即便在生活中早睡早起、刻苦读书、勤奋工作,如果遇到问题首先想要逃避,那就不能算是自律。很惭愧,我之前在不少问题上都是以拖延为主要处理方式,本质上还是无法承受或者面对解决问题可能带来的痛苦,那么在读了本书之后,我会有意识地去改变做事原则,就拿上周来说,我终于鼓起勇气去诊所看牙,解决了拖了很久的牙结石问题(虽然智齿还没解决)。\n推迟满足感,就是不贪图暂时的安逸,先苦后甜,重新设置人生快乐与痛苦的次序:首先,面对问题并感受痛苦;然后,解决问题并享受更大的快乐。在充满问题和痛苦的人生中,推迟满足感是唯一可行的生活方式。\n这个话题不仅仅是在本书中提到过,据说有心理学家做过试验,在一群孩子里面寻找具有“推迟满足感”倾向的人(比如能够先忍住不吃巧克力以获取更大的奖励),结果证明这样的人在后续的生活中取得成功的概率要远高于先吃巧克力的人。本书首先强调这个话题,将其作为自律中的第一个原则,我想是因为道理都是相通的吧。很久之前我看过一篇讲解时间管理的文章,里面提到在规划一天的工作时,优先处理最难的那件事(文章中称“先吃掉那只青蛙”),然后当前的工作会越来越简单,这样的方式跟本书中作者所提倡的“推迟满足感”异曲同工。尽可能的正面问题、提早感受解决问题的痛苦,正是执行自律的首要原则。\n不能及时解决自己面临的问题,这些问题就会像山一样横亘在我们心中,阻碍心灵的成长和心智的成熟。很多人显然忽略了这个道理。我们必须面对属于自己的问题,这是解决问题的基本前提。 指望别人解决自己的问题,也不是明智之举。唯一的办法\u0026ndash;我们应该勇敢地说:“这是我的问题,要由我来解决!”\n这就牵出了第二个原则\u0026ndash;“承担责任”。逃避问题会自然而然的推卸责任,认为这不是自己的问题,始终对于自己扮演的角色缺少清晰的认知。不过作者提到了两种情况“神经官能症”和“人格失调症”,前者属于给自己强加责任,后者属于推卸责任。这么说来,我可能有前者的倾向,很多压力都来源于此。不过作者也提到在复杂的人生道路上,判断自己该为什么事和什么人负责,这是一个永远存在的难题。\n还有一种情况是,在有些事情上强加给自己责任,在有些事情上又没有意识到是自己的责任。读到这些章节的时候,我也在反思,当我一旦开始想要抱怨的时候,其实已经陷入“人格失调”和“神经官能”的边缘,要时刻提醒自己,不断评估自己的责任。\n忠于事实是自律的第三条原则。如果我们追求健康的生活和心智的成熟,那我们就要坚定不移地遵循这条原则。我们需要实事求是,杜绝虚假。我们越是了解事实,处理问题就越是得心应手。逃避现实的痛苦是人类的天性,只有通过自律,我们才能逐渐克服现实的痛苦,及时修改自己的地图,逐步成长。我们必须忠于事实,尽管这会带来暂时的痛苦,但远比沉湎于虚假的舒适中要好。我们必须忍受暂时的不适感,追求事实而不是假象,并承受这一过程的痛苦。\n这让我想到了“诚实”,不仅限于不撒谎(这一点实在是难以做到)。但我很快意识到作者所说的忠于事实比不撒谎更重要的是,面对事实,不可活在自己的想象里。虽然我们每个人都有自己的成见,看事情也很难看到全貌,但是不可做不基于事实的幻想,期望问题会自行消失、期望不付出努力就能得到回报。\n你既要承担责任学会推迟满足感,先苦后甜,把眼光放长远,同时又要尽可能过好当前的生活,让人生的快乐多于痛苦。\n这就是“保持平衡”,应该是一种“拿捏”吧。为了保持平衡,作者建议,适当的选择“放弃”。包括放弃过时的观念、习惯。王小波在小说中写道:“人生就是一个缓慢被捶的过程。。。”,如果不能适时的放弃一些东西,那很显然这个过程是相当痛苦的。\n先写这么多。\n","date":"2021-04-18T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E5%B0%91%E6%9C%89%E4%BA%BA%E8%B5%B0%E7%9A%84%E8%B7%AF%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/","title":"《少有人走的路》读书笔记"},{"content":"文章介绍 《管理自己(Management Yourself)》作者——彼得·德鲁克。该文是《哈佛商业评论》创刊以来重印次数最多的文章之一,节选自其著作《21世纪的管理挑战》。\n我第一次读到这篇文章,是2013年在左岸读书的博客,当时很快就放入收藏夹,今日再次翻阅,仍觉受益匪浅。\n摘抄部分在此记录,并附上自己的一些理解。\n笔记 知识工作者必须成为自己的首席执行官。你应该在公司中开辟自己的天地,知道何时改变发展道路,并在可能长达50年的职业生涯中不断努力、干出实绩。要做好这些事情,你首先要对自己有深刻的认识——不仅清楚自己的优点和缺点,也知道自己是怎样学习新知识和与别人共事的,并且还明白自己的价值观是什么、自己又能在哪些方面做出最大贡献。因为只有当所有工作都从自己的长处着眼,你才能真正做到卓尔不群。\n未来社会,体力劳动将逐渐被智能化机械所取代,人人都是知识工作者即将成为事实。每个人都需要把自己当作一个公司来看待,自己就是CEO,包揽人生的“市场”、“营销”、“生产”、“运营”等各项工作,只有从更高的视角来规划自己,才能掌握主动权,避免落入被动接受的局面。\n与运营企业一样,经营自己的第一步还是要先了解自己,深刻认识自己的优势与不足,这样无论是制定计划还是付诸行动,才能做到目标明确、行之有效。\n多数人都以为他们知道自己擅长什么。其实不然,更多的情况是,人们只知道自己不擅长什么——即便是在这一点上,人们也往往认识不清。然而,一个人要有所作为,只能靠发挥自己的长处,而如果从事自己不太擅长的工作是无法取得成就的,更不用说那些自己根本干不了的事情了。\n这个观点跟我的直觉是相反的,在读到这段文字之前我以为自己对擅长什么了如指掌,但认真思索之后,才发现事情并没有那么简单,有些自以为是的优点根本不值得推敲,如沟通表达、对技术了解广泛、技术趋势敏感等等。至于真正做什么样的事情非常的得心应手,还真得通过认真分析才行。\n要发现自己的长处,唯一途径就是回馈分析法(feedback analysis)。每当做出重要决定或采取重要行动时,你都可以事先记录下自己对结果的预期。9到 12个月后,再将实际结果与自己的预期比较。我们只要持之以恒地运用这个简单的方法,就能在较短的时间内(可能两三年),发现自己的长处——这是你需要知道的最重要的事情。在采用这种方法之后,你就能知道,自己正在做(或没有做)的哪些事情会让你的长处无法发挥出来。同时,你也将看到自己在哪些方面能力不是特别强。最后,你还将了解到自己在哪些方面完全不擅长,做不出成绩来。\n作者给出了一个据说十分有效的方法,虽然执行起来略显繁琐且时间较长,但应该还值得一试。我个人有记录工作日志的习惯,但停留在时间消耗的记录和分析层面,并未对任务执行的结果进行预期和分析。\n首先最重要的是,专注于你的长处,把自己放到那些能发挥长处的地方。其次,加强你的长处。第三,发现任何由于恃才傲物而造成的偏见和无知,并且加以克服。\n想起了之前读到的另一本书《现在发现你的优势》,虽然木桶原理说要补充自己的短板,但这里的观点则强调要充分把自己的优势利用起来,并且进行加强,这样才能更好的发挥自己。当然,努力学习新技能、新知识,发现自己的偏见和不良习惯然后克服它们也很重要。\n把预期和实际结果进行比较,也会发现自己不能做什么。我们每个人都有许多一窍不通、毫无天分的领域,在这些领域我们甚至连平庸的水平都达不到。人们,尤其是知识工作者,就不应该试图去完成这些领域的工作和任务。他们应该尽量少把精力浪费在那些不能胜任的领域上,因为从无能到平庸要比从一流到卓越需要人们付出多得多的努力。\n深有体会,不应该将时间和经历消耗在自己即使努力也达不到平庸水平的事情上,然而现实中却有很多人在被动的做着这样的事情,甚至还抱有不切实际的幻想,人生苦短,早日醒悟早日改变。\n我属于读者型,还是听者型?首先,你要搞清楚的是,你是读者型(习惯阅读信息)还是听者型(习惯听取信息)的人。绝大多数人甚至都不知道还有读者型和听者型之说,而且很少有人既是读者型又是听者型。知道自己属于哪种类型的人更少。\n这一段不知是翻译的问题还是作者没说明白,文中并未定义“读者型”、“听者型”这两种类型的工作方式具体是如何工作的,只是通过例子强调了自己工作方式的不同所带来的巨大差异。我的猜测是,“读者型”应该指的是在工作中理性和逻辑思维占上风的人,通常通过阅读逻辑缜密的文字来规划和开展工作,而“听者型”则属于感性思维偏多,通过视觉、听觉来判断事物的发展。\n如果一个组织的价值体系不为自己所接受或者与自己的价值观不相容,人们就会备感沮丧,工作效力低下。\n不要试图改变自己的价值观,这只会让你倍感痛苦,你可以更换环境或者改变组织价值体系。\n成功的事业不是预先规划的,而是在人们知道了自己的长处、工作方式和价值观后,准备把握机遇时水到渠成的。知道自己属于何处,可使一个勤奋、有能力但原本表现平平的普通人,变成出类拔萃的工作者。\n机会留给有准备的人,但前提是这个人认识到自己的长处、工作方式、价值观,所谓的把握机会,是了解了这些之后才能识别到机会。\n一般来说,一项计划的时间跨度如果超过了 18个月,就很难做到明确和具体。因此,在多数情况下我们应该提出的问题是:我在哪些方面能取得将在今后一年半内见效的结果?如何取得这样的结果?\n千里之行始于足下,如果决定开始行动,也不可把计划定的太远,自己给自己安排近期可行的执行目标,对效果要有清晰的预期,对如何取得效果应有详细而具体的计划。\n人与人之间相互信任,不一定意味着他们彼此喜欢对方,而是意味着彼此了解。因此,人们绝对有必要对自己的人际关系负责。这是一种义务。不管一个人是公司的一名成员,还是公司的顾问、供应商或经销商,他都需要对他的所有共事者负起这种责任。所谓共事者,是指在工作上他所依赖的同事以及依赖他的同事。\n成熟的处理人际关系,同样需要问文章开头的三个问题,了解他人或者共事者,是我们的义务和责任。\n在一个崇尚成功的社会里,拥有各种选择变得越来越重要。从历史上来看,却没有“成功”一说。绝大多数人只期望坚守“适当的位置”。唯一的流动性是向下的流动性。然而,在知识社会里,我们期望每一个人都能取得成功。这显然是不可能的。对许多人来说,能避免失败就行。可是有成功的地方,就会有失败。因此,有一个能够让人们做出贡献、发挥影响力或成为“大人物”的领域,这不仅对个人十分重要,对个人的家庭也同样重要。这意味着人们需要找到一个能够有机会成为领袖、受到尊重、取得成功的第二领域——可能是第二份职业,也可能是平行的职业或社会创业。\n在飞速发展(或者说在加速发展)的时代,人人都在焦虑,仿佛竞争、内卷根本无法避免,但如果合理的认识自己、管理自己,并且去用心经营的话,也许人人都有机会可以在擅长的领域做出闪光的事情,获得一份自己独有的成就。\n自我管理中面临的挑战看上去比较明显,甚至非常基本,其答案可能不言自明,甚至近乎幼稚。自我管理需要个人,尤其是知识工作者,做出以前从未做过的事情。实际上,自我管理需要每一个知识工作者在思想和行动上都要成为自己的首席执行官。\n最后一段很关键,“做出以前从未做过的事情”,即行动最为重要。这也是为什么我会花费一个小时的时间,从头又阅读一遍这篇文章,并摘录下来加以分析理解的主要原因。\n","date":"2021-04-15T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E7%AE%A1%E7%90%86%E8%87%AA%E5%B7%B1%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/","title":"《管理自己》阅读笔记"},{"content":"保持好奇心 大概是2011年左右,我把QQ签名改成了“好奇、求知、创造”,从此再也没有改变过,我所喜欢的、热爱的、欲罢不能的事情,都被这三个词涵盖了。 十年过去了,很高兴自己还能保持一颗探索未知、热爱学习的心。 读书 现在听书比读书所占比重大,阅读时间缩水明显,翻开电子书的时间都有限,更别提手不释卷。 年初重温《三体》,即便很多情节已烂熟于心,重读仍有新发现,休闲阅读而已,只为放松大脑。 其余时间陆续阅读一些杂书《原则》、《随机漫步》、《菜根谭》、《曾国藩传》等若干。 唯一触动较大的是年末再次翻看《计算机程序的构造和解释》,此次配合网上的公开课视频进行,跟随原书作者课程讲解节奏,对于知识的理解大有帮助,视频虽然年代久远,但知识历久弥新,比起科技业广泛应用的新兴技术,书中的计算原理以及相关的思想更像是对应了武术的“内功心法”,一旦有所突破,则在上层应用产生巨大的提升,与工作学习都大有裨益,其中玄妙不可言说。 摄影 户外活动大为减少,往年春天乃摄影高产期,今年却苦于疫情无法外出,摄影爱好被迫搁置,2020年对摄影技术的练习几乎停滞,无心仪作品产出。 卡片相机已很少使用,手机拍摄已是主流,器材追求已解毒,但如有更新的街拍机问世,心头恐怕还是会痒。 有一事可提,今年独自吃饭次数很多,每次都拍食物照一张,累积下来一年竟拍了几百。 生活 压力与机遇并存,最大收获是面对挫折、困难更坦然,2020不愿多提。 记忆力确实有下降之趋势,回忆起来竟无亮点,亦可能本身就比较平淡。 发现凡事都要低调不吭声的重要性,切记四处宣扬,否则就会出现“说出来就不灵”的魔咒。 学习 对8bit老古董计算机的兴趣不减,四处搜寻相关知识,弄了一大堆模拟器,研究过程中竟对之前所学计算机组成原理有了新的认识和理解,喜出望外,本该大学之时就应掌握的技能,到现在再学也不迟,重在理解。 创意类软件如blender等也持续浅尝,进步缓慢,但入门已没问题,缺少作品练习,安排即可。 儿子已入大学,借用假期时间,我教他编程,他给我讲解高数,算是技能交换了,费曼学习法的一个很直接的应用案例。 越发觉得B站是个学习的好地方,该站以后的发展不可估量,但从教育来看,很可能迅速超越国内二流大学,或者未来改变大学的形态也未可知。 后续计划 希望可以继续通过写字记录学习的知识,保持一定量的文字输出,如条件实在有限,配合语音录音也可。 在自己热爱的事情上,持续学习,关注一下作品输出(持续开新坑),早日成为心目中的“全栈工程师”、“三级工程师”(可参见吴军《硅谷来信》中的定义)。 限制烟酒摄入,保持每日的活动量,能走路就不坐车。 ","date":"2021-02-10T00:00:00Z","permalink":"https://sbabybird.github.io/p/2020%E5%B9%B4%E4%B8%AA%E4%BA%BA%E6%80%BB%E7%BB%93/","title":"2020年个人总结"},{"content":"有监督学习的两种主要任务(分类和回归) 有监督机器学习任务主要分为两种,一种是分类任务,一般是通过学习算法实现对未知数据的分类甄别,比如判断是男性还是女性,预测明天会不会下雨等等,预测结果是离散的分类。另一种是回归任务,用于预测一个具体的值,比如房价、年龄等等,预测结果是连续的值; 解决回归任务比较常见的算法就是线性回归算法; 线性回归 线性回归是最典型的用于回归任务的机器学习算法。它的基本原理是基于,任意一个为n的值,可以通过一个n-1阶的多项式进行拟合; 线性回归的算法的目标是根据已知标签数据,训练一个预测函数f(a, b),使得x输入带入ax+b这样的多项式可以得出需要预测的值; 所以目标是找到合适的a和b(从数学语言的精确描述来说,一般用别的符号代替,为了方便记录,我使用a和b); 为了找到合适的a和b,需要定义一个损失函数(也有称为代价函数的),J(a, b),用于判断a和b是否合适,比较简单的有“方差均值”法; 方差均值指的是,所有样本带入预测函数f,将预测值与实际值相减,取平方,求和再求平均数(暂时不知到markdown里如何加入公式); 那么带入损失函数,就是意味着,找到合适的a、b使得刚才那个方差均值小于一个阈值(接近最优); 线性回归本质上,是在平面坐标系里找到一个与样本匹配的直线,这样基于这个直线,即可预测未知的值; 梯度下降 如何找到合适的a和b,一个一个地去试是不可能的(无穷多的计算量); 比较典型的算法是“梯度下降”,又是牛顿起的头; 比较生动的描述是,想想一个三维空间图形,X和Y平面是有a和b的值构成,Z轴是损失函数的值,值最小的部分(在图上就最低的部分,像一个山谷)就是最优解; 从山顶的某个点上,环顾360度,找到适合下山的一小步,一点一点儿走向山谷最低处,有点像慢慢走楼梯,所以叫梯度下降; 从我的体会来看,这个方法有点像牛顿那个计算平方根的迭代法(根据一个猜测值,然后通过迭代公式寻找一个更加接近正确值的值,直到误差降低到合适范围); 从微积分的角度,就是找到损失函数J在最初尝试的那个点上的切线,并通过它的斜率(也就是导数值)乘以一个系数a,逐步逼近最低点(切线斜率为零)的过程; ","date":"2019-06-02T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E5%92%8C%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D/","title":"线性回归和梯度下降"},{"content":"机器学习的概念 机器学习是人工智能的一个分支,是近年来逐渐具备实用性的各种人工智能应用的基础。其本质是(我目前的个人理解)利用针对已知的数据集合抽取采样特征,然后利用某种数据模型(核心是某种算法:如kNN、SVM、朴素贝叶斯等)对数据进行计算处理,得到一组可以预测未知数据集特征的参数和手段,从而可以对数据进行预测判断的一种数据处理方法。\n机器学习相关的名词 神经网络:是机器学习的一种实现方式,从概念上来说,小于“机器学习”,但是由于其在图像识别、语音识别、语言翻译等领域的优异表现,以至于现在提到机器学习就认为是神经网络,实际则不然,机器学习的概念更大,更加基础,是实现神经网络应用的基础理论和方法; 深度学习:是神经网络的应用特例,同样是在应用层表现优异,可以理解为神经网络的一种实现; 大数据:机器学习的数据处理基础支撑,近年来机器学习在应用层面表现较好主要得益于大数据技术的发展,可以使得模型训练内容量级增加,极大的提高了模型准确度; n维向量:来自线性代数,在机器学习中起到重要作用,在机器学习中一般用于各种特征数据的载体,在不同的算法过程中传递和计算。 机器学习相关的工具 编程语言:目前比较流行的是Python,因为有比较丰富易用的程序包,很多科技公司也开源了较为成熟的框架,再加上Python语言本身的简单易上手,使得Python成为这个领域最流行的语言。当然C和C++、Java还是实现各种算法的根基,Python更多是提供了一种调用接口; iPython:Python语言的交互控制台,可以较为方便的测试、调试Python程序,有较强的交互功能,比语言发行版自带的强大; jupyter:提供Python语言的Web交互界面,通过网页即可编写代码,并及时反馈执行结果,由于是B/S架构,所以可以使得运行时跟开发环境分开。编辑界面同时支持基于Markdown语法的文档编写,使得“文学化”编程成为一种可能,非常适合用于科研人员的汇报材料或论文; TensorFlow:谷歌开源的机器学习框架,快速灵活部署机器学习应用,可以应用与大规模、工业级场景; keras:基于Python编写的高级神经网络API,属于对机器学习的深度封装,如果以学习机器学习原理为目标的,不建议使用,还是先手动将若干种核心算法实现一遍比较深刻; 预期的学习方法 通过阅读相关的书籍,对于概念有所了解,这个过程可以是粗糙的浏览,不求详细的理解各种原理和算法; 尝试一些教学视频,了解实操的基本流程,对于自己读书得到的概念进行验证,修订理解,并熟悉基本工具的使用(如Python的numpy、plot等); 细读书籍,按照书中的事例进行实操,并尝试推导算法的基本原理,理解后,形成自己的文字; 定义简单的任务,贯穿数据准备、数据清洗、特征值提取、模型建立、模型应用各个阶段,一般来说可以是手写文字识别,或者给新闻文章分类等; 循环和迭代这个过程,一边输入信息,一边将学到的东西结合思考,形成有效的输出(文字、视频等); ","date":"2019-05-18T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%9A%84%E5%AD%A6%E4%B9%A0%E5%87%86%E5%A4%87/","title":"机器学习的学习准备"},{"content":"序言我儿,见信如面。在这个即时通讯如此发达的时代,我选择写一封长信,以表示对你即将成人的祝贺。\n我陷入沉思了一会儿,考虑该给你讲些什么道理。但我很快意识到,“道理”这种东西,靠听和说没有用,只能自己去感悟。而我自己也十分讨厌被说教,所以我会克制想要给你讲一番大道理的冲动,尽量避免不对等的交流形式。\n我想我还是跟你分享一些我对这个世界的思考和想法吧。\n茨威格在《人类群星闪耀》中写到“一个人最幸运的事情就是在他思想最活跃、精力最充沛的时候找到了他的人生使命”。看来大家都把寻找人生使命当做比较重要事情来看待。姑且就当做我这封信的主题吧。\n寻找人生使命本质上是通过尝试在一些方向上的努力来实现对人生价值和意义的探索,每个人或多或少、或深或浅都要做这样的尝试。\n你们学校把“成人礼”包装成一个重要的人生节点,想必是希望给你们一些感觉,让你们意识到,从这一刻起,你们开始对自己的行为负责,要开始尝试去寻找和探索了。\n那么该如何去探索,我有一些自己的看法。\n首先要相信一点,那就是无论是否还在上学,学习和完善自己都是一辈子的事情,不存在一个可以停止学习的时间点。就我个人来说,无论是读大学的时候还是参加工作以后,从来没有在提升自己方面有过松懈的想法,甚至我感觉工作之后对知识的渴望更加强烈了,学到的东西也比在校园里多得多。\n当然了,学习方式跟你目前在学校这种还是差别挺大的,强度也没有那么辛苦。而且工作之后的这种学习方式才是我最认可的方式。什么方式?\n我们一起讨论过几次王阳明的“知行合一”,为了不扯那么远,简单来说,刚才提到的学习方式就是老王早就提出的“事儿上练”。通过不断地实践,各种经历,才是学习知识的源泉。这也是为啥我在开头就说道理只能感悟不可说教,怎么感悟?事儿上感悟!经历多了自然懂。\n所以也不用一下子被“寻找人生使命”这种“宏大话题”给吓住了,保持学习的心态,放松大胆地去经历各种事情,就是这么个过程。\n然后呢,就是在做事的过程中,保持一颗善良、为他人多着想的心。关于这一点,我的体会是,“助人为快乐之本”真的不是一句空话。远的不说,你看你爷爷奶奶平日里多么乐于助人,用乐善好施形容他们一点儿也不为过。他们因此收获了广泛的认可,也给这个家庭带来了积极向上的生活氛围,对你老爹我向好的方面发展也起到了关键作用。\n再有一点,也是我个人非常推崇的,就是最好能时刻对世界保持强烈的好奇心。\n刘慈欣在短篇科幻小说《朝闻道》中讲了一个故事。外星高等文明在监视地球人类进化的过程中,距离现在几十万年前的一个原始人抬头望了望夜晚的天空,凝视了一会儿。这看似随意的行为使得外星人的警报器响了起来,因为这意味着,人类的好奇心已经发展到了星空,同时也意味着人类文明将要开始爆发式发展了。可见好奇心的重要。\n好奇心一方面是推动我们前进的动力,同时也使得我们平凡的生活变得不那么枯燥。\n你能经常提出一些有时连我都无法回答的问题,这让我也颇感欣慰,有些答案注定要自己去摸索着发现,我希望你能多多提问,也多自己思考,不用去管答案是什么。\n稀稀拉拉写了这么多,估计你也不能理解太多,我像你这个年纪时估计也理解不了。不过也没关系,只是给你讲讲我个人通过思考得到的观点而已,说不定你自己以后有不同的发现,当然如果能在你以后的发展中起到一点儿提醒作用,也就挺好了。\n希望你这次“成人礼”活动就像人类文明那一次一次对星空的凝望那样,使你能够进入人生的一个新的高速发展阶段。\n祝:学习进步,健康成长!\n二零一九年五月九日 写于贵阳机场\n","date":"2019-05-09T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E8%87%B4%E5%84%BF%E5%AD%90%E6%88%90%E4%BA%BA%E7%A4%BC%E7%9A%84%E4%B8%80%E5%B0%81%E4%BF%A1/","title":"致儿子成人礼的一封信"},{"content":" 积极是内在的,是选择的自由,是人性中最不能剥夺的部分。 以终为始,是要知道自己要什么,并以原则为重心,所做的决策是主动选择的结果,而非被环境所迫使的结果。 人类的四个天赋分别是,自我意识,良知,想象力,独立意志。 第四代时间管理,以原则为中心,以周为单位,设定自己所扮演的各项角色欲达成的三个重要成果,安排出每一天的第一要务,更理想的是当作每一天的特殊约会,全力以赴。每周都回顾上周周日程完成情况以及制定新的周日程,并每日调整。 对人不可讲效率,对事才可如此,对人应该讲效用,即某一行为是否有效。 以原则为重心,以良知为导向(人比事儿更重要),针对个人独有的使命,平衡发展生活中不同角色,全盘规划日常生活。 要想充分授权必须要具备的默契和共识包括: 预期成果。 应遵守的规范。 可用的资源。 责任的归属,约定考评的标准和次数。 明确的奖惩制度。 在双赢协议中,对以下5要素应该有明确的规定。 预期结果,确认目标和实现,方法不计。 指导方针,确认实现目标的原则,方针和行为限度。 可用资源,包括人力,财力,技术或者组织资源。 任务考核,建立业绩评估标准和时间。 奖惩制度,根据任务考核确定奖惩。 制定好目标之后,还要看你的组织体系是否与目标相符合,否则就要调整系统体系。 我们总是喜欢匆匆忙忙地下结论,以善意的建议快刀斩乱麻地解决问题。不愿意花时间去诊断,深入了解问题的症结。 ","date":"2019-05-07T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E9%AB%98%E6%95%88%E8%83%BD%E4%BA%BA%E5%A3%AB%E7%9A%84%E4%B8%83%E4%B8%AA%E4%B9%A0%E6%83%AF%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/","title":"《高效能人士的七个习惯》读书笔记"},{"content":" 首先要通过分析知道问题是什么,才能真正洞悉解决问题的办法。 归根结底,所有公司最后的生命线都是信任问题,顾客要相信企业生产的产品正如它所许诺的那样好,投资者要相信公司的管理层是有能力的,员工要相信公司管理者能够兑现承诺。 他们根本想不到人都有缺陷,包括他们自己在内也都不是完美的。 问题的关键不在于机器会不会想问题,而在于人会不会想问题。 真正让我们陷入麻烦的并非那些我们根本不懂的东西,而是我们一知半解的东西。 有一种心理偏见叫做肯定的陷阱,它指的是我们努力想证明自己的观点,而非找出自己观点中的错误之处。 深思熟虑并不是浪费时间,而是必要之举。 除非有人能停下来想一想,否则一再犯同样的错误是很容易的。对每个错误都有必要进行反思和总结。 如果你能承认自己犯了错误,承认自己并不是战无不胜,那么你反而能得到好处。 管理是一门艺术,而不是一种科学。如果遇到那些想要量化人类行为的专家,你就要保持警惕了。 行业中的每个公司都应该力争标新立异,让自己变的与众不同,而不是随大溜。 要憎恨组织里的官僚作风——通用电气公司杰克·韦尔奇写给股东的信中写道。如果你想一事无成的话,那就让行政流程占据主导地位好了,去崇尚官僚主义就行了。 不能创造生产力的工作越努力越失败,要时刻警惕并搜寻身边那些并不能创造生产力的工作。 每个公司其实主要就是为现有的客户提供优质服务并努力开拓新客户群。我们在花每一分钱、设立每一个部门或是接手每一个项目时,都要问自己一个基本的问题:这能帮我们带来新客户或是为客户提供更好的服务吗? 将注意力放在失败上是最大的悲观主义。只要稍稍抬起你的头,改变一下你的态度,那么你的世界观就会发生巨大的变化。 ","date":"2019-04-30T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E7%AE%A1%E7%90%86%E5%8D%81%E8%AF%AB%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/","title":"《管理十诫》读书笔记"},{"content":"上苍保佑吃饱饭撑着的人,中午吃完饭抽烟的时候,刷了几页微博,可能跟我关注的人有关(我一般关注段子手或者文艺思想贩卖者),感觉内容作为消遣挺合适,但是越看呢,越觉得没有营养,可能是跟我刚抽完烟进入贤者时间有关,一把把微博推开的时候(合上屏幕),心里竟涌现出一句“都是吃饱了撑的”,用以评价刚刚看过的几段不痛不痒的文字。\n发完感慨随即想到,这句话是不是可以作为一本非常扯淡的书名呢?然后开始畅想自己写一本这样的书,里面的内容天马行空,多为吃饱了没事儿干的人才会忧伤和考虑的事情,饱暖之后各种忧虑和焦躁的事情可以化作各种思考,用于填满本书,作为同病相怜者证明自己不再孤独的弹药,一旦物质状态不能满足,则书中的内容立即退化到可有可无的状态。\n真的,我这两三年来,刷牙沉思录这种哗众取宠的段子写了不少,缺少深度的技术文章也写过几篇,以吃饱了撑着来进行衡量的话,还真的比较符合标准,如果加以艺术润色的话,真难说能不能包装成为一本具备贩卖价值的书,至少想到这个问题之后,被自己震惊了一下,进一步对人生需求的几个层次有了切身认识。\n无论我再怎么黑自己,有一点是不会改变,我写的那些东西至少保留了我一部分的回忆,它们记载了我在某一段时期内的心智情况,无论是用词还是造句,都能从一个侧面反映我当时的状态。而我的人生正是由若干个这样的状态所组成,随着年龄的增长,我的记忆力会越来越差,如果能够多记录一些东西下来,就算是那种吃饱了撑着才能思考的问题,也将使未来的我读起来热泪盈眶。\n不过信息世界的问题在于,资料保存的永久性很不靠谱,说不定哪天这些信息就不在了(我写在msn空间的博客一篇也没了),甚至安全性还比不了一个纸质的笔记本,但我仍然不做过多的努力和担忧,倘若保存良好,那就作为未来回忆的佐料,倘若不幸丢失了,那就随他去吧。因为在写这些东西的同时,我已经感受一次生活了,本来也是留不住的东西,事如春梦了无痕嘛。\n","date":"2018-07-19T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E4%BA%8B%E5%A6%82%E6%98%A5%E6%A2%A6%E4%BA%86%E6%97%A0%E7%97%95/","title":"事如春梦了无痕"},{"content":"练习 1.9 下面两个过程各定义了一种加起两个正整数的方法,他们都基于过程inc(它将参数增加1)和dec(它将参数减少1) 。请用代换模型展示这两个过程在求值(add 4 5)时所产生的计算过程。这些计算过程是递归的或者迭代的吗? 1 2 3 4 5 6 7 8 9 10 (define (add a b) (if (= a 0) b (inc (add (dec a) b)))) (define (add a b) (if (= a 0) b (add (dec a) (inc b)))) 解答:根据代换模型分别展开如下\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 (add 4 5) (inc (add 3 5)) (inc (inc (add 2 5))) (inc (inc (inc (add 1 5)))) (inc (inc (inc (inc (add 0 5))))) (inc (inc (inc (inc 5)))) (inc (inc (inc 6))) (inc (inc 7)) (inc 8) (9) (add 4 5) (add 3 6) (add 2 7) (add 1 8) (add 0 9) (9) 根据展开可以看出,第一个计算过程是递归的,因为明显有一个逐步扩展然后又收缩的递归计算链条。第二个计算过程是迭代的,没有扩展、收缩的过程,而是使用a和b存储了常量。\n","date":"2015-01-05T00:00:00Z","permalink":"https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.9/","title":"SICP 课后练习题1.9"},{"content":"练习 1.8 求立方根的牛顿法基于如下事实,如果y是x的立方根的一个近似值,那么下式将给出一个更好的近似值: $$ \\frac{x/y^2+2y}{3} $$\n请利用这一公式实现一个类似平方根过程的求立方根的过程。\n解答:基本思路与求解平方根的实现是一致的,区别再有得到更好值improve的过程有变化,只需根据公式描述进行实现即可\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 (define (improve guess x) (/ (+ (/ x (* guess guess)) (* guess 2)) 3)) (define (good-enough? guess next) (\u0026lt; (/ (abs (- guess next)) guess) 0.001))) (define (abs x) (if (\u0026lt; x 0) (- x) x)) (define (cbrt-iter guess x) (if (good-enough? guess (improve guess x)) (improve guess x) (cbrt-iter (improve guess x) x))) (define (cbrt x) (cbrt-iter 1.0 x)) ","date":"2014-12-29T00:00:00Z","permalink":"https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.8/","title":"SICP 课后练习题1.8"},{"content":"练习 1.7 对于确定很小的数的平方根而言,在计算平方根中使用的检测good-enough?是很不好的。还有,在现实的计算机里,算术运算总是以一定的有限精度进行的。这也会使我们的检测不适合非常大的数的计算。请解释上述论断,用例子说明对很小和很大的数,这种检测都可能失败。实现good-enough?的另一种策略是监视猜测值在从一次迭代到下一次的变化情况,当改变值相对于猜测值的比率很小时就结束。请设计一个采用这种终止测试方式的平方根过程。对于很大和很小的数,这一方式都能工作吗? 解答:good-enough?当前采用的判断方式是,对比猜测值的平方结果与X的值之间的差距,当差距小于某个阙值时(比如0.001),就停止计算。当X很小或很大时,这种检测就会失败,比如,假设我们的阙值设置为0.001,那么当X本身小于这个阙值时,就会检测失败,得出错误结果,当X很大时,也会由于精度不足而一直达不到最佳猜测值,导致死循环。\n因此,要解决这一问题,可以按照题目中给出的思路对good-enough?过程进行修改,不再判断猜测值平方与X的差距,而是判断两次猜测值之间的比率。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 1 ]=\u0026gt; (define (good-enough? guess next) (\u0026lt; (/ (abs (- guess next)) guess) 0.001))) ;Value: good-enough? 1 ]=\u0026gt; (define (sqrt-iter guess x) (if (good-enough? guess (improve guess x)) (improve guess x) (sqrt-iter (improve guess x) x))) ;Value: sqrt-iter 1 ]=\u0026gt; (sqrt 0.00000000001) ;Value: 3.1622776601874535e-6 1 ]=\u0026gt; (sqrt 100000000000000000000000000000000000000000000) ;Value: 1.0000000000001497e22 在新的good-enough?中,传入的是两次猜测值,所以还要修改sqrt-iter过程,在调用时计算两次猜测值。\n","date":"2014-12-27T00:00:00Z","permalink":"https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.7/","title":"SICP 课后练习题1.7"},{"content":"采用牛顿法求平方根的过程如下。开始时,我们有了被开方数的值(现在需要做的就是算出它的平方根)和一个猜测值。如果猜测值已经足够好了,有关工作也就完成了。如若不然,那么就需要改进猜测值(求出猜测值与被开方数除以猜测值的平均值),并重复这个计算过程。具体编写代码如下(在MIT scheme解释器中)。\n定义sqrt-iter过程,与上述描述完全对应。\n1 2 3 4 5 6 7 1 ]=\u0026gt; (define (sqrt-iter guess x) (if (good-enough? guess x) guess (sqrt-iter (improve guess x) x))) ;Value: sqrt-iter 定义改进猜测值的过程improve,返回猜测值与被开方数除以猜测值的平均值。\n1 2 3 4 1 ]=\u0026gt; (define (improve guess x) (average guess (/ x guess))) ;Value: improve 定义求平均数的过程average。\n1 2 3 4 1 ]=\u0026gt; (define (average x y) (/ (+ x y) 2)) ;Value: average 定义判断猜测值是否足够好的过程good-enough?。\n1 2 3 4 1 ]=\u0026gt; (define (good-enough? guess x) (\u0026lt; (abs (- (square guess) x)) 0.001)) ;Value: good-enough? 定义求绝对值和平方的过程\n1 2 3 4 5 6 7 8 1 ]=\u0026gt; (define (abs x) (if (\u0026lt; x 0) (- x) x)) ;Value: abs 1 ]=\u0026gt; (define (square x) (* x x)) ;Value: square 定义最上层的过程,用于启动整个工作(使用1这个数字作为任何数的初始猜测值)。\n1 2 3 4 1 ]=\u0026gt; (define (sqrt x) (sqrt-iter 1.0 x)) ;Value: sqrt 执行sqrt过程,并以9为参数,求得平方根为3\n1 2 3 1 ]=\u0026gt; (sqrt 9) ;Value: 3.00009155413138 练习1.6 Alyssa P.Hacker看不出来为什么需要将if提供为一种特殊形式,她问:“为什么我不能直接通过cond将它定义为一个常规过程呢?”Alyssa的朋友Eva Lu Ator断言确实可以这样做,并定义了if的一个新版本: 1 2 3 4 5 1 ]=\u0026gt; (define (new-if predicate then-clause else-clause) (cond (predicate then-clause) (else else-clause))) ;Value: new-if Eva给Alyssa演示她的程序:\n1 2 3 4 5 (new-if (= 2 3) 0 5) 5 (new-if (= 1 1) 0 5) 0 她很高兴地用自己的new-if重写了求平方根的程序:\n1 2 3 4 5 6 7 1 ]=\u0026gt; (define (sqrt-iter guess x) (new-if (good-enough? guess x) guess (sqrt-iter (improve guess x) x))) ;Value: sqrt-iter 当Alyssa试着用这个过程去计算平方根时会发生什么事情呢?请给出解释。\n解答:\n这个练习引入了一个新的思考,刚开始时,我以为是牵涉到了过程的局部参数概念,因为在新编写的new-if过程中,看似可以完成条件判断并返回正确的值,但是在本例中使用却存在问题,即在递归调用sqrt-iter时,传给该过程的guess和x为new-if的局部参数,被返回给了new-if这个过程,不会向上返回到上一层sqrt-iter里,这样就导致了改进的猜测值永远不会被使用,使得这个计算过程永远不会结束(除非第一个猜测值恰好合适),从而导致递归调用的陷入无限循环。我在MIT-scheme解释器里的执行结果是,解释器自动退出并提示我递归调用深度超出最大值。\n上述看起来是合理的,但是后来我考虑了其他情况,及本书在前面章节里提到了if(if \u0026lt;predicate\u0026gt; \u0026lt;consequent\u0026gt; \u0026lt;alternative\u0026gt;)语句是条件表达式的受限形式,在执行时,先判断predicate是否为真,然后根据结果只执行其后consequent/alternative中的一个。如果使用本例新定义的new-if则作为普通过程执行,传入的参数会因为解释器使用应用序求值的原因,两个表达式都会被立即求值,反应到本例中就是guess和(sqrt-iter (improve guess x) x)都会被立即求值,后面的那句是属于递归调用,这样也会导致改进的猜测值永远不会被使用,陷入无限层的递归调用中。\n1 2 3 1 ]=\u0026gt; (sqrt 9) ;Aborting!: maximum recursion depth exceeded 思考:\n最初的时候,我的针对此题的思考方式是变量的作用域问题(可能lisp不会有此问题),后来发现,也许不是这样,而是由于对传入参数立即求值导致的,后续的网上搜索结果也显示出大家的答案都倾向于后者。\n","date":"2014-12-23T00:00:00Z","permalink":"https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.6/","title":"SICP 课后练习题1.6"},{"content":"练习1.4 请仔细考察上面给出的允许运算符为复合表达式的组合式的求值模型,根据对这一模型的认识描述下面过程的行为。 1 2 (define (a-plus-abs-b a b) ((if (\u0026gt; b 0) + -) a b)) 练习1.4,通过if判断,根据b的值决定对a b所使用的运算符是+还是-,如果b大于0,则组合式为(+ a b),反之则为(- a b),所以组合式结果永远返回a加上b的绝对值。\n1 2 3 4 5 6 7 8 9 (define (a-plus-abs-b a b) ((if (\u0026gt; b 0) + -) a b)) ;Value: a-plus-abs-b (a-plus-abs-b 4 2) ;Value: 6 (a-plus-abs-b 4 -2) ;Value: 6 ","date":"2014-12-19T00:00:00Z","permalink":"https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.4/","title":"SICP 课后练习题1.4"},{"content":"练习1.5 Ben Bitdiddle发明了一种检测方法,能够确定解释器究竟采用哪种序求值,是采用应用序,还是正则序。他定义了下面两个过程 1 2 3 4 5 6 (define (p) (p)) (define (test x y) (if (= x 0) 0 y)) 而后他求值下面的表达式:\n1 (test 0 (p)) 如果某个解释器采用的是应用序求值,Ben会看到什么样的情况?如果解释器采用正则序求值,他又会看到什么情况?请对你的回答做出解释。(无论采用正则序或者应用序,假定特殊形式if的求值规则总是一样的。其中的谓词部分先行求值,根据其结果确定随后求值的子表达式部分。)\n练习1.5 『完全展开而后规约』的求值模型为正则序求值,『先求值参数而后应用』的方式为应用序求值,因此,在应用序求值的模式下,执行(test 0 (p))时会先求(p)这个表达式的值,而根据定义(define (p) (p))执行(p)会造成递归调用,解释器陷入死循环。而在正则序求值模式下,会先展开test过程,根据需要再决定是否执行(p),在本例中,由于传入的x等于0,所以(p)不会被执行,因此不会陷入死循环。\n所以,根据以上分析,如果解释器采用的是应用序求值,则解释器陷入死循环,如果是采用正则序求值,则解释器输出;Value: 0。\n","date":"2014-12-19T00:00:00Z","permalink":"https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.5/","title":"SICP 课后练习题1.5"},{"content":"练习1.1 下面是一系列表达式,对于每个表达式,解释器将输出什么结果?假定这一系列表达式是按照给出的顺序逐个求值的。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 10 ;Value: 10 (+ 5 3 4) ;Value: 12 (- 9 1) ;Value: 8 (/ 6 2) ;Value: 3 (+ (* 2 4) (- 4 6)) ;Value: 6 (define a 3) ;Value: a (define b (+ a 1)) ;Value: b (+ a b (* a b)) ;Value: 19 (= a b) ;Value: #f (if (and (\u0026gt; b a) (\u0026lt; b (* a b))) b a) ;Value: 4 (cond ((= a 4) 6) ((= b 4) (+ 6 7 a)) (else 25)) ;Value: 16 (+ 2 (if (\u0026gt; b a) b a)) ;Value: 6 (* (cond ((\u0026gt; a b) a) ((\u0026lt; a b) b) (else -1)) (+ a 1)) ;Value: 16 练习1.1的内容比较简单,基本上直接就可以计算出表达式的值,所有表达式都可以在mit-scheme的交互解释器里进行验证。\n","date":"2014-12-15T00:00:00Z","permalink":"https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.1/","title":"SICP 课后练习题1.1"},{"content":"练习1.2 请将下面表达式变换为前缀形式: $$ \\frac{5+4+\\Bigl(2-\\Bigl(3-\\left(6+\\frac{4}{5}\\right)\\Bigr)\\Bigr)}{3\\left(6-2\\right)\\left(2-7\\right)} $$\n1 2 3 4 5 6 7 8 9 10 11 (/ (+ 5 4 (- 2 (- 3 (+ 6 (/ 4 5))))) (* 3 (- 6 2) (- 2 7) )) ;Value: -37/150 练习1.2,直接将数学表达式转换为前序表达式即可,在写的时候可以遵循一下排版规则,即同一个运算符的表达式垂直对齐。\n","date":"2014-12-15T00:00:00Z","permalink":"https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.2/","title":"SICP 课后练习题1.2"},{"content":"练习1.3 请定义一个过程,它以三个数为参数,返回其中较大两个数之和。 1 2 3 4 5 6 7 8 (define (max-three-number a b c) (if (\u0026gt; a b) (if (\u0026gt; b c) (+ a b) (+ a c)) (if (\u0026gt; a c) (+ b a) (+ b c)))) (max-three-number 42 7 1) ;Value: 49 练习1.3,解决此练习中问题的方法比较多,本答案使用比较朴素的方法,先比较出最大的两个数字,然后将其相加,对于三个数字来说,先在前两个中选取一个大的,然后将其与后面两个中比较大的那一个相加。还有一种思路就是可以先定义出比较大小的方法,然后再调用之,或者先对数字按从小到大排序然后加最后两个,等等。\n","date":"2014-12-15T00:00:00Z","permalink":"https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.3/","title":"SICP 课后练习题1.3"},{"content":"win8系统下使用笔记本作为wifi热点 背景 在没有无线路由的情况下,比如出差在宾馆,如果手里有一台可以上网的笔记本电脑,则可以给手机、平板电脑或者其他笔记本提供一个可以上网的wifi热点。\n我平时在单位即通过此方式给我的平板电脑和手机共享网络通道,比较方便实用,近期在使用的过程中遇到一些问题,经过摸索,解决了问题,在此记录一下,方便以后查阅。\n环境需要 一台通过有线连接上网(或者通过3G上网,就是说wifi网卡没有被占用)的笔记本电脑 安装有win8操作系统(win7应该也可以) 无线网卡芯片是intel的(否则可能不支持此技术),并使用了最新的驱动程序 基本步骤 打开具有管理员权限的控制台窗口(在win8系统下,可以通过按windows+x键,然后在弹出的菜单里选择『命令提示符(管理员)』)\n输入如下命令 netsh wlan set hostednetwork mode=allow ssid=\u0026quot;mywifi\u0026quot; key=\u0026quot;12345678\u0026quot; 其中ssid后面的热点名称和key后面的密码可以根据情况自行决定\n上一个命令完成后,如果没有异常的话,则输入如下命令 netsh wlan start hostednetwork 这条命令如果执行成功会显示『已启动承载网络』,在下次系统重启后需要重新执行,如果嫌麻烦则可以做一个批处理文件每次双击即可\n成功启动承载网络之后,进入『网络和共享中心』点击『更改适配器设置』,此时在该页里应该可以看到一个虚拟网卡(名称一般叫MicrosoftVirtual WiFi Miniport Adapter),右键点击那个可以上网的网络连接(如果是有线连接就是那个『本地连接』,如果是3G的则根据情况而定,总之必须是那个可以上网的连接),选择『属性』,切换到『共享』页,勾选『允许其他网络用户通过此计算机的Internet连接来连接』,在下面的下拉列表里选择那个刚虚拟出来的虚拟网卡。确定即可。\n常见问题 执行以上第二条命令启动承载网络后,有时会显示『无法启动承载网络,组或资源的状态不是执行请求操作的正确状态』,网上大部分的文章针对这个问题给出的解决办法都是更新网卡驱动,可是对于我的笔记本无效,因为我的笔记本电脑在前一段时间是好用的,后来不好用了,根据我的摸索,解决这个问题的办法是,去『设备管理器』下面的『网络适配器』里面找找,看看有没有被禁用的设备,比如『微软托管网络协议』,如果禁用了再重新启用即可正常使用此功能了。\n","date":"2014-02-13T00:00:00Z","permalink":"https://sbabybird.github.io/p/win8%E7%B3%BB%E7%BB%9F%E4%B8%8B%E4%BD%BF%E7%94%A8%E7%AC%94%E8%AE%B0%E6%9C%AC%E4%BD%9C%E4%B8%BAwifi%E7%83%AD%E7%82%B9/","title":"win8系统下使用笔记本作为wifi热点"},{"content":"背景问题 mongodb在windwos下的官方编译包是使用vs2010编译的,从官网上下载的源代码在vs2008环境下不能直接编译通过,因为mongodb提供的相关配置文件是针对vs2010的,可能是因为mongodb最新的代码使用了部分C++11的特性,而vs2008没有提供对C++11支持的原因。可是我们在一个具体的项目上需要在vs2008环境下使用mongodb,只好通过手工修改部分配置和代码的办法完成编译。\n环境准备 mongodb是使用scons进行编译控制的,所以在进行以下编译之前需要安装并配置好如下环境:\npython2.7 官方建议是安装python2.7版本,而且要在环境变量PATH中加入python的安装路径和python/scripts的路径,以便在命令行中执行python脚本。 不过我在编译的时候使用的是python2.6版本,也没有发现问题\nscons 直接去网上下载最新版本进行安装即可。 vs2008 需要安装vc++的全部组件(主要是默认安装不带amd64的编译支持),如果只需要编译32位版本的话则可以忽略此条。 需要安装sp1补丁,否则会在编译时报错。 boost库 最好使用boost1.4.9版本,去官网上下载对应的源码包然后自己在vs2008的命令行环境下编译\n编译boost的命令如下(只编译了所需库):\nbjam stage variant=debug --with-filesystem --with-thread --with-date_time --with-program_options --layout=versioned threading=multi toolset=msvc-10.0 --build-type=complete 如果需要编译release版本,就把variant的选项改为release,如果需要编译64位的版本,就在以上命令中加入address-model=64\n配置及代码修改 SConstruct文件修改 SConstruct文件用于存放scons的关键配置信息,我们为了在vs2008下编译mongodb首先要做的就是修改mongodb源码下根目录的SConstruct文件。\n修改env配置,找到 evn = Environment\nenv = Environment( BUILD_DIR=variantDir, CLIENT_ARCHIVE='${CLIENT_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}', CLIENT_DIST_BASENAME=get_option('client-dist-basename'), CLIENT_LICENSE='#distsrc/client/LICENSE.txt', CLIENT_SCONSTRUCT='#distsrc/client/SConstruct', DIST_ARCHIVE_SUFFIX='.tgz', EXTRAPATH=get_option(\u0026quot;extrapath\u0026quot;), MODULE_BANNERS=[], MODULETEST_ALIAS='moduletests', MODULETEST_LIST='#build/moduletests.txt', MSVS_ARCH=msarch , PYTHON=utils.find_python(), SERVER_ARCHIVE='${SERVER_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}', TARGET_ARCH=msarch , tools=[\u0026quot;default\u0026quot;, \u0026quot;gch\u0026quot;, \u0026quot;jsheader\u0026quot;, \u0026quot;mergelib\u0026quot;, \u0026quot;unittest\u0026quot;], UNITTEST_ALIAS='unittests', UNITTEST_LIST='#build/unittests.txt', PYSYSPLATFORM=os.sys.platform, PCRE_VERSION='8.30', CONFIGUREDIR = '#' + scons_data_dir + '/sconf_temp', CONFIGURELOG = '#' + scons_data_dir + '/config.log' ) 在Environment里追加一条 MSVC_VERSION='9.0',这是因为如果机器上有其他的编译环境,比如vs2010或vs2012,scons会自动使用他们的编译器进行编译,即使你是在vs2008的命令行环境下,我最初因为此问题困扰了很久,后来才只得强制指定编译器的版本,修改完成后如下:\nenv = Environment( BUILD_DIR=variantDir, CLIENT_ARCHIVE='${CLIENT_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}', CLIENT_DIST_BASENAME=get_option('client-dist-basename'), CLIENT_LICENSE='#distsrc/client/LICENSE.txt', CLIENT_SCONSTRUCT='#distsrc/client/SConstruct', DIST_ARCHIVE_SUFFIX='.tgz', EXTRAPATH=get_option(\u0026quot;extrapath\u0026quot;), MODULE_BANNERS=[], MODULETEST_ALIAS='moduletests', MODULETEST_LIST='#build/moduletests.txt', MSVS_ARCH=msarch , PYTHON=utils.find_python(), SERVER_ARCHIVE='${SERVER_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}', TARGET_ARCH=msarch , tools=[\u0026quot;default\u0026quot;, \u0026quot;gch\u0026quot;, \u0026quot;jsheader\u0026quot;, \u0026quot;mergelib\u0026quot;, \u0026quot;unittest\u0026quot;], UNITTEST_ALIAS='unittests', UNITTEST_LIST='#build/unittests.txt', PYSYSPLATFORM=os.sys.platform, PCRE_VERSION='8.30', CONFIGUREDIR = '#' + scons_data_dir + '/sconf_temp', CONFIGURELOG = '#' + scons_data_dir + '/config.log', MSVC_VERSION = '9.0' ) 给编译器搜索路径增加你自己本地的boost库路径 因为在编译时需要用到boost库,所以需要把你在本地的boost所在目录加入scons的环境,否则会报找不到boost头文件或链接库的错误,打开Sconstruct文件直接在最后加入如下代码\nenv.Append(CPPPATH=[\u0026ldquo;d:/thirdlib/boost_1_49_0\u0026rdquo;, \u0026ldquo;d:/thirdlib/boost_1_49_0/boost/tr1\u0026rdquo;], LIBPATH=[\u0026ldquo;d:/thridlib/boost_1_49_0/stage/lib\u0026rdquo;])\n*你在编译时需要将路径替换成你自己的* 准备stdint.h 去这个地址https://msinttypes.googlecode.com/files/msinttypes-r26.zip下载msinttypes,将压缩包里的stdint.h解压并复制到 C:\\Program Files\\Microsoft Visual Studio 9.0\\VC\\include 目录 修改mongodb源码目录下platform下的cstdint.h,将#include\u0026lt;cstdint\u0026gt;修改为#include\u0026lt;stdint.h\u0026gt;,将#define _MONGO_STDINT_NAMESPACE std这一行里的std注释掉,变成#define _MONGO_STDINT_NAMESPACE /*std*/ 修改mongodb源码目录下util下的time_support.h,在文件开头加入#include\u0026lt;stdint.h\u0026gt;,否则在编译这个文件时会无法识别int64_t类型 修改windows_basic.h 修改mongodb源码目录下platform下的windows_basic.h, 在 #if !defined(NTDDI_WINXPSP3) || (NTDDI_VERSION \u0026lt; NTDDI_WINXPSP3) 之前加入 #define NTDDI_WINXPSP3 0x05010300 在#if !defined(NTDDI_WS03SP2) || (NTDDI_VERSION \u0026lt; NTDDI_WS03SP2)之前加入#define NTDDI_WS03SP2 0x05020200 否则会报 \u0026ldquo;32 bit mongo does not support Windows versions older than XP Service Pack 3\u0026rdquo; 和\u0026quot;64 bit mongo does not support Windows versions older than Windows Server 2003 SP 2\u0026quot; 错误 修改listen.cpp和sock.cpp 修改util下net下listen.cpp,在#include段之后加入如下代码\n#ifdef _WIN32 #define EADDRINUSE WSAEADDRINUSE #define ECONNABORTED WSAECONNABORTED #define EBADF 9 #define ENFILE 23 #define EMFILE 24 #endif 修改util下net下sock.cpp,在#include段之后加入如下代码\n#ifdef _WIN32 #define EAGAIN 11 #endif 开始编译 环境准备好之后,编译就比较简单了,打开vs2008命令行窗口,执行如下代码即可完成编译 scons --dd --32 mongoclient.lib\n如果是编译release版本,就把\u0026ndash;dd换成\u0026ndash;release,如果是编译64位版本,就把\u0026ndash;32换成\u0026ndash;64\n","date":"2013-11-07T00:00:00Z","permalink":"https://sbabybird.github.io/p/%E4%BD%BF%E7%94%A8vs2008%E7%BC%96%E8%AF%91mongodb/","title":"使用vs2008编译mongodb"},{"content":"Hello World ","date":"2013-04-29T00:00:00Z","permalink":"https://sbabybird.github.io/p/hello-world/","title":"Hello World!"},{"content":"有几年不用Winamp了,最近Winamp又退出了10周年纪念版版。我下载了一个,感觉听听里面的网络电台什么的还挺不错的(边上班边听欧美最流行的音乐哈)。而且新版还包含了podcast的功能,可以搜索订阅网上的播客。在家听音乐的话,我还是选择foobar。\n\u0026ndash; 由 sbabybird 于 11/08/2007 07:49:00 下午 在 从容地狂奔上发表\n","date":"2007-11-13T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-11-13/","title":"2007-11-13"},{"content":"偶然翻看书架上的旧书,发现我以前在上面随手胡乱写了一个“梦幻配置”,那时应该是2000年,根据当时的硬件发展状况,我写了一个可望而不可及的硬件配置。具体什么配置就不说了(大概就是纯平显示器、笨三的cpu),反正现在让你用你还嫌慢呢。现在六、七年过去了,心里又痒痒的,就让我再写一个可望而不可及的硬件配置吧,看看这个配置何时会过时。\n中央处理器:Intel Core2 Quad processor Q6700(4核,为了安静,散热采用水冷系统)\n主板:Intel D975XBX2\n内存:海盗船 TWIN2X2048-6400 ×4(共8G)\n外存储:SanDisk 64G闪存硬盘(用于系统存储),2TB磁盘阵列(用于文件存储)\n显卡:丽台NVIDIA Quadro FX 5600 ×2(每块显卡可接四台屏幕)\n主显示器:Apple 30\u0026quot; Cinema Display(上网、影视、游戏)\n副显示器:Apple 20\u0026quot; Cinema Display ×6(地理、虚拟现实、平面设计等)\nCreative Sound Blaster X-Fi Elite Pro+罗技Z5500(用于电影、游戏、非专业录音)\n主板数字光纤输出+外置解码器+JBL监听音箱(用于欣赏音乐)\n操作系统:自己动手定做(编译)Linux版本,桌面环境采用GONE(如果有兴趣就自己写个操作系统)\n备注:机箱易采用高厚度、高散热静音机箱,此系统搭建完成后将用于书房,共七台显示器需要用到特殊的显示器支架。\n","date":"2007-08-28T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-08-28/","title":"2007-08-28"},{"content":"不知是不是因为升级还没有进行完成,最近live spaces总是不能正常操作,用firefox访问有时还会出现乱码或者页面布局乱套,速度慢的惊人,资源占用很厉害。再加上他有太多的限制,这些问题都让我感到对live space失望透顶。衷心希望Google blogger能够早日解封!\n","date":"2007-08-04T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-08-04/","title":"2007-08-04"},{"content":"昨天去电影院看了《憨豆先生的黄金周》,感觉还不错,憨豆先生还是那么滑稽可乐,有着独特的幽默方式,我虽然没有笑到肚皮抽筋、掐着大腿,但是90分钟的电影还是让我由衷地笑了半个小时(累计)。这里就不介绍剧情了(一般来说这种喜剧基本没剧情可言),网上到处都是介绍。整个影片从头到尾憨豆先生都拿着那只SONY新出的DV,我估计SONY投了不少钱,还有就是片子的音乐配的还可以,轻快明亮。总的来说还值得一看。 handouhandou2\nps:现在的电影院真是不景气啊,能容纳500号人的大厅坐了不到100人,不过挺爽的,谁让他们把票价订的那么贵,现在的票价是我小时候电影票价的100倍 ","date":"2007-08-03T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-08-03/","title":"2007-08-03"},{"content":"对于我来说,理发是件很痛苦的事情,可能是有心理障碍吧。小的时候被老爸强行摁住理过一次发,我像一只小鸡那样被夹在腿上无力反抗,由于整个过程我都在不停地叫骂那个理发的,所以那家伙下手还不含糊,把推子使得嚓嚓直响,对着我的头皮和耳朵可劲儿招呼。整个过程是漫长的、痛苦的、令人发指的。最后我看着镜子里的凸了吧唧的头,还不忘使劲儿拧了一把鼻涕抹在老爸的裤腿上。此事后来成为笑谈,但爷儿俩在理发这种事情上一直都持有不同的观点,当然了,我还只能提出强烈抗议、强烈不满、强烈谴责,但采取进一步措施的权利还是保留了。一直到现在,当老爸跟我说:“快去把头发理一理!”时,我还是乖乖的狂奔去理发。\n不过,现在我离老爸远了,他管不了啦(主要是没看见),我可以尽情地把头发留到很长,然后再一下剪到很短(一般是回老家之前)。但是我的这种习惯却造成了另一件事情,给我理发的人极度不爽。每当我拖着留了几个月的长发走进理发店,告诉理发的师傅给我可劲儿剪短时,伊总是很扭捏,假惺惺地跟我说:“哎呀!你的发质这么好,又好不容易留了这么长,剪了多可惜啊!”其实谁不知道伊是想省点儿事儿,想拿剪刀在那三下两下剪完糊弄我。于是我只好说:“嗯嗯,本来是想留长的,但是现在突然想开了,不想留了,还是麻烦您给我剪短吧!”最后等着人家极不情愿(还很费时)地给我剪完,我才满意离去。但是这招下次就不能用了,所以我总是选择不同的理发店,反正这玩意儿多得是! 今天我又理发了,从五一到现在大概有三个月了,很抱歉,又让一个理发师傅不爽了一把,不管他,这次理完了,谁知道我什么时候有心情理下回呀! ","date":"2007-07-29T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-07-29/","title":"2007-07-29"},{"content":"天气这么闷热,生活这么枯燥,何不搞点小把戏调剂一下气氛呢?要是你现在刚好在办公室里,那么恭喜你了,下面我将教你几个在下秘密收藏的整蛊手段(一般人我不告诉他)。\n前提条件:1、你们用计算机办公;2、你们使用的是Windows操作系统;3、你要整蛊的同事没有暴力倾向;4、他刚好暂时离开一下。 好了,准备好了就开始行动吧! 场景一:“我的密码被改了?!” 如果你的这位同事有锁定计算机的习惯,那就刚好实施一下,在他计算机的锁定状态下的密码框里提前敲入一个空格,这样一般他回来时不会发觉,等他输入完自己的密码后,会发现进不去了!(因为密码前面多输入了一个空格)。 场景二:“用来干活儿的软件没有反应了!” 如果他没有锁定计算机的习惯,那么刚才那个办法就不凑效了,怎么办呢,找到他用来工作的软件(VC,Word、Excel等),把帮助菜单里的“关于(about)”对话框给打开,然后用鼠标把对话框拖动到一个屏幕上看不见的地方。哈哈,等着吧,他回来会发现他用来工作的软件怎么也不听话了,无论点击哪儿都没有反应。 场景三:“鼠标不好使了” 现在大家都用光电鼠标了,而光电鼠标全靠它屁股底下的那个激光眼,没错!你又猜对了,拿个小纸团把它那个小眼睛堵住,赶紧去吧!鼠标瞎了之后就罢工了。 以上方法屡试不爽,我都亲自实验过,不过是别人在我身上实验的(这帮败家玩意儿)。 注:以上操作纯属娱乐!产生后果自负。\n","date":"2007-07-24T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-07-24/","title":"2007-07-24"},{"content":"我手里这个Nokia 6230用了3年了,买的时候多加了一块电池。前两天,其中一块电池寿终正寝了,剩下的这块也差不多了,感觉就像我的胃,一吃就饱,一会儿就又饿了。我看着手里这个灰头土脸得就像从垃圾桶里捡回的手机,不禁有了换掉它的念头。\n到网上翻了翻信息,结果让我很失望,感觉Nokia不太长进,眼看着人家索爱扛着音乐、摄像的大旗在市场上占了一席之地,自己也跟着别人的屁股转,也在那儿搞音乐手机、摄像手机,却忘了自己的特色。没办法,别的牌子不愿意用,老N最近推出的新机不是我看不上就是我的钱包不让看(靠,就这还敢冒充Nokia的粉丝呀?)。苹果的iPhone最近倒是炒得挺火,看起来也挺不错,可是总觉的那玩意儿离咱太遥远了,还是不多看了,以免中毒。 在查看了众多机型之后,长叹一声:“究竟什么样的手机才能让我满意呢!” 总结以下大概要满足以下几点: 1、屏幕要足够大、分辨率不用极高但也不能太低 2、反应速度一定要快(目前我还没有发现一款智能手机反应速度飞快) 3、个头不能太大、重量不能太沉 4、电话、短信功能好用 5、电量一定要持久,待机越长越好(这点最重要,功能再强没电也是白扯) 6、非国产(这个不用多说)\n这些要求不过分吧?像什么摄像、音乐等功能都没要求,可愣是找不到这样一款手机,反复对比后发现还是目前手上的这个更合要求一些。算了,将就用吧。结果,昨晚做梦,梦见我也设计了一款手机,以上条件除了第六条其余都满足,取名就叫“nbPhone” 把苹果的Phone的风头给压下去了,乔布斯都跟我急了。 ","date":"2007-07-23T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-07-23/","title":"2007-07-23"},{"content":"一个胖子,一个相貌平平而且豁牙的胖子,一个相貌平平而且豁牙的卖手机的胖子。这样的人参加选秀节目,如果你是评委的话,你会让他通过海选吗?如果他告诉你他要表演的是歌剧的话,你会跳下评委台把它踢出演播厅吗?!我想你会的,因为当时英国的那个选秀节目的评委也是这样想的。\nPaul Potts,这个我刚刚看到的英国小伙子,就是这样参加选秀节目的。当他极不自然地站在舞台上,傻傻地告诉评委他要表演歌剧,评委们都笑了,表现得有些不耐烦。可是,当他深情地唱起今夜无人入眠,当他那与帕瓦罗蒂一样激昂的男高音在演播厅响起时,赛场沸腾了!所有的人都站了起来,评委刁在嘴里的铅笔掉了下来,掌声雷动! 这段由朋友发过来、我甚至懒得看的视频,看得我头皮发麻。在起了一身鸡皮疙瘩后,我的眼睛也不争气地湿润了(震撼,感动)。看了别人写的介绍,我了解到,这个叫Paul的小伙子有着不太顺利的人生际遇(大多数人如此吧),但是他从未怀疑过自己的理想,仍然执着地追求着歌剧表演的艺术魅力,直到他被生活所逼而不得不靠卖手机来糊口时,仍未放弃!终于,上天给了他最后一次机会,他成功了,他向世人再一次的证明了:真正牛逼的人,终究会牛逼起来! 试了一下,msn的空间居然还可以插入视频!\n","date":"2007-07-21T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-07-21/","title":"2007-07-21"},{"content":"我都已经好几天没有照看我的msn空间了(最近太累),今天访问一下,发现界面居然有了变化(别三日,刮目看),嗯哼,原来是微软的Live小组把咱的空间给升级了。\n首先是界面的整体风格有了改变,我审美不行,看不出是好看还是难看,感觉貌似顺眼一些。空间上方仍然悬挂着那个大大的广告条(我一直看它不爽),工具条的宽度变宽了,这样会占用更多的空间。进入空间的“自定义”功能,发现提供的模板多了一些,但一个比一个不耐看,所以我什么也没有动,继续保持现状。一直希望Live空间能够提供类似WordPress那样的模板(多漂亮啊),现在看来,要走的路还比较长(Live小组继续加油啊!)。 不过话又说回来,空间里整那么多花里胡哨的东东也没用,看得让人眼花缭乱的也不爽,我还是喜欢简约一点的风格,最好是让人进入我的空间后,感觉就像是打开了windows的记事本(过分了吧)。本来Google提供的那个blog挺好的,可是总是不能访问,还是老老实实的在微软提供的共享空间里得瑟吧。 最后,再鄙视一下我自己,这几天由于懒惰而没有更新空间的内容,太不像话了! ","date":"2007-07-20T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-07-20/","title":"2007-07-20"},{"content":"随着一阵悦耳的下班铃声,我提前结束了一天的工作,按照惯例,周末了,要去打球。叫上同事,抱起篮球,飞快地奔向球场。终于逃脱了闪烁的计算机屏幕,逃脱了无聊的工作计划,逃脱了漫长的会议,逃脱了郁闷的代码\u0026hellip;\u0026hellip;\n各位观众,各位听众,也许你们刚刚打开电梯,现在为您直播的是--火星杯篮球锦标赛!穿着运动鞋牛仔裤正在捡球的那家伙就是我,看呐,我在球场上尽情地狂奔,边打球边哼着歌曲“啊哼三分球,它在空中停留,漂亮的假动作,帅呆了我......哦shit!球丢了”。一口气打了两三个小时,直打到有人气喘吁吁,打到有人双腿抽筋,打到有人口吐白沫还不肯离去。天渐渐黑了,球框渐渐虚无缥缈起来,收拾家伙,撤! 走到站牌,有车,有座,爽!上了高速,一路畅通,爽!到了家里,贤惠的老婆已经把饭菜做好,菜做的色香俱佳,啤酒冰得温度适中。如果这个时候你问我,什么是幸福?我会自在地夹一口菜,然后再悠闲地喝上一口啤酒,眯起眼睛跟你说:“嘛儿叫幸福?介就叫幸福!” ","date":"2007-07-19T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-07-19/","title":"2007-07-19"},{"content":"加班后回家的路上,路灯十分昏暗,还没有吃晚饭,心情极度郁闷,我缓缓(没力气狂奔了)走向公车站牌,走着,走着,突然!一个黑影窜了过来,他跟我说:“兄弟,要盗版光盘不?”我没有理他,继续走,走着,走着,突然!又一个黑影窜了过来,他跟我说:“兄弟,要发票吗?”我没有理他,继续走,走着,走着,突然(靠,有完没完啊!)一大一小两个黑影窜了出来,原来是一个中年妇女领着一个七八岁的小女孩儿,夜色中看不清面目。小孩开口说话了:“叔叔,给点儿钱让我买吃的吧,我都饿了一天了\u0026hellip;\u0026hellip;”边说还边做有气无力状,大人也在一边附和。说得我心里一软,鼻涕快掉下来了,差点儿掏钱。但是转念一想,我TM也饿了快一天啦,也没吃饭呢,再何况,她们的行为也太让我愤怒了,因为就凭这些个破烂演技拿来唬我也太侮辱我的智商了吧!于是,我友善的冲她们说道:“小朋友,你看”我用手指了指马路,“往前走500米,那里有家派出所,你过去找警察叔叔要些吃的好不好?”小孩一时不吭声(台词没背下来),大人接着说:“你就可怜我们,给我们几块钱,买包方便面也行啊!”(我靠,我这么晚了还没吃饭,我求您别勾引我的食欲了!)我没办法,掏出手机,说:“既然你们不愿意亲自过去,那我帮你们打110吧\u0026hellip;\u0026hellip;”这句话还没有说完,说时迟那时快,只听得“嗖嗖”两声,两个人全都不见踪影,公车站牌下只剩下我和随风飘舞的碎纸片(好身手!)。\n","date":"2007-07-12T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-07-12/","title":"2007-07-12"},{"content":"听说google出了在线翻译的工具,而且还广受大家的好评,在美国举行的一次翻译比赛中还拿了冠军。我虽不是google的粉丝但也对google的产品挺感兴趣的,于是赶紧凑个热闹,看看伟大的google能不能给我带来惊喜。 由于我只会中文,那就看看google的英译中的水平怎么样。废话少说,赶紧拿来一首英文歌词《you needed me》(我最喜欢的英文歌曲之一)。\nYou needed me\nI cries a tear you wiped it dry\nI was confused you cleared my mind\nI sold my soul you bought it back for me\nAnd help me up and give me dignity\nSomehow you needed me\nYou gave me strength to stand alone again\nTo face the world out on my own again\nYou put me high upon a pedestal\nSo high that I could almost see eternity\nYou needed me, you needed me\nAnd I can\u0026rsquo;t believe it\u0026rsquo;s you I can\u0026rsquo;t believe it\u0026rsquo;s true\nI needed you and you were there\nAnd I\u0026rsquo;ll never leave why should I leave\nI\u0026rsquo;d be a fool\nCause I\u0026rsquo;ve finally found someone\nWho really cares\nYou held my hand when it was cold\nWhen I lost you took me home\nYou gave me hope when I was at the end\nAnd turned my lies back into truth again\nYou even called me friend\nYou gave me strength to stand alone again\nTo face the world out on my own again\nYou put me high upon a pedestal\nSo high that I could almost see eternity\nYou needed me ,you needed me\nOh, yes, you need me\nYou needed me\n先试了一下整段翻译,把歌词复制进去,出来的结果让我忍俊不禁\ngoogle自动翻译的文字:\n你需要我,我喊了眼泪,你擦它干,我摸你清我心中我卖出 我的灵魂,你买回来,我和帮助我,让我有点尊严,你需要我你们给了我力量单独再次面对世界走出自己再次你就把我小时 在室内一个台阶那么高,我几乎可以看到永恒,你需要我,多欧需要我,我也不相信是你,我不能相信这是真的,我需要你和你的笔 在此,我永远不会离开,我为何要离开我就是一个傻瓜,我的事业总算发现有人真的三白族你握着我的手,当它冷时,我输了,你带我家,你给了我希望钨 母鸡,我是在年底把我的谎言放回真话的时候,你甚至骂我的朋友,你克须缴我力量单独再次面对世界走出自己再次你就把我高美 无源一个台阶那么高,我几乎可以看到永恒,你需要我,你需要我哦,多 欧需要我,你需要我\n唉,比较失望啊,试一下google的翻译网页的功能吧,找到歌词的网页,然后让它翻译\n你需要我 I cried a tear我哭了眼泪 You wiped it dry你擦它干 I was confused我很困惑 You cleared my mind你清除了我的心 I sold my soul我卖我的灵魂 You bought it back for me你买回来,我 And held the earth召开地球 You gave me dignity你给我尊严 Somehow you needed me某种程度上,你需要我 You gave me strength你们给了我力量 To stand alone again单独再次 To face the world面对世界 Out on my own again出自己再次 You put me high你把我高 Upon a pedestal当佩服 So high that I could almost see eternity如此高,我几乎可以看到永恒 You needed me你需要我 You needed me你需要我 I can\u0026rsquo;t believe it\u0026rsquo;s you我不能相信这是你 I can\u0026rsquo;t believe it\u0026rsquo;s you我不能相信这是你 I needed you我需要你 And you were there你有 And I\u0026rsquo;ll never leave, why should I leave?和我永远不会离开,我为何要离开? I needed you我需要你 can I finally found someone who really cares可我终于发现有人真正关心 (You needed me)(你需要我) You held my hand你牵我的手 It was cold据冷 And I was lost我失去了 You took me home你带我家 You gave me love你们给我的爱 That I was at the end我是在结束 I turned my life我把我的生命 Back into truth again You even called me \u0026lsquo;friend\u0026rsquo;放回真话的时候,你甚至骂我\u0026rsquo;朋友\u0026rsquo; You gave me strength你们给了我力量 To stand alone again单独再次 To face the world面对世界 Out on my own again出自己再次 You put me high你把我高 Upon a pedestal当佩服 So high that I could almost see eternity如此高,我几乎可以看到永恒 You needed me你需要我 You needed me你需要我 You needed me你需要我 You needed me你需要我 Oh, yes, you needed me哦,你需要我 You needed me你需要我\n呵呵,这下看起来还像那么回事儿.感觉机器还是代替不了人啊.翻译有感情的东西总是那么生硬.\n","date":"2007-07-06T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-07-06/","title":"2007-07-06"},{"content":"统计了一下我平时上班所需要的时间,要是堵车的话大概要一个小时多一些,要是特别堵的话大概要两个小时,要是跑步的话大概得三个小时多一些(推算的,可以忽略),要是夜里打车去上班的话大概得二十多分钟(极少,也可以忽略)。所以我一天大概有三个小时是堵在路上的,这导致了我的胃口极差,身材日渐消瘦,远看像铅笔近看像挂历!每天我都要坐在车上长吁短叹:“GR的堵车啊!”\n是什么原因造成了这样的状况? 原因有很多种,我想最直接的原因可能就是因为路上出现了车祸。无论是蹭了一下车屁股还是挂了一下后视镜,双方都会停好车,把路占上,然后撅起屁股在那儿查看爱车的状况,最后再各自打电话叫人......这个时候你要是刚好在路上,你就会感觉你置身于车的海洋,一辆挨着一辆的汽车望不到头,一片喇叭声,让人透不过气来。每当我乘坐的公交车慢慢的拱过出事地点,往往还能看到出事的双方(或多方)在那儿撅着。这种情况每天都要出现,所以每天都要堵车。 据说从8月7号到8月20号,北京的交通管制要进行奥运预演.这对我们这些挤公交车上班的来说真是莫大的好消息啊!我们又可以感受像去年中非论坛期间的那种一路畅通的超快感了!不过,快乐永远是短暂的,过了那几天,还是得老老实实的坐在车去上体验“堵车不堵心”。 ","date":"2007-07-04T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-07-04/","title":"2007-07-04"},{"content":"最羡慕那些有米的音响发烧友,手里攥着大把的钞票,买音响器材出手阔绰,有没有一双“金耳朵”不知道,反正当音响店的老板告诉他“这套音响,在听蔡琴唱歌的时候能听见她咽吐沫的声音”时,或者跟他说:“那套设备,在听交响乐的时候可以听见拉琴那小子不小心把曲谱翻掉在地上的声音”的时候,他们就会毫不犹豫的掏出几千乃至几万块大洋,把那些“宝贝”搬回家,反复的回放,听听蔡琴在什么时候换了一口气,或者听听吹长笛的坐在第几排。\n我也曾在这方面痴迷过,但仅仅是痴迷,没有什么实质性行动,原因很简单,掏不起那些闲钱呐!不过,在很早以前,读初中的时候就开始摆弄那些“音响器材”了,只是一堆喇叭,功率很小,大部分是从旧收录机上拆下来的,“音源”也就只有卡带,我曾试着把喇叭放到各种地方以调整他们的“音效”,比如放在蚊帐上除了可以在睡眠时有音乐环绕外还兼具“驱蚊”的效果,我为了得到更多的低音也曾把喇叭嵌入到书桌里(整个桌子就是音箱哈),甚至把喇叭放到洗衣机里,那音质真是惨不忍听。反正受当时的条件限制,我也只能是像小孩摆弄玩具似的,玩一玩儿而已,毕竟当时升学才是最大的目标。 直到有一天,我翻看一本旧音响杂志,有人自制了个音箱,据说效果还不错,于是就动了自己也做一个的念头。再后来,到了上中师的时候,有了大把的空闲时间(但还是没空闲的钱),决定纯手工制作一只“有源音箱”!说干就干,开始行动!首先考虑的是功放电路采用什么形式,当时最佳的方案是使用“LM-1875”功放芯片,但由于囊中羞涩,最终放弃,后来买来一块晶体管放大板,也算将就了,喇叭买了两只,一个高音,一个中低音(8寸),向我大舅要来了分频器。让老家木匠邻居帮忙做了个音箱的框架,剩下的就是我和我的一个哥儿们亲自动手了。箱体的材料比较奢侈,把我家的一个桌子给锯了(靠!太过分了)。后来组装的时候才发现,我竟然忘了考虑功放的前级,没办法,再次求救与大舅,从旧收录机上拆下来一块板子作为前级(居然还可以调高低音调)。 就这样,前前后后忙活了有半个星期,我的音箱终于发出处女声了,这个时候音源已经是一台VCD,那个时候我好像对蔡琴不感兴趣,于是先听了一首陈慧娴的《归来吧》,真是天籁啊!我当时感动的鼻涕都快掉下来了!当然了,我这么说是有一些夸张,其实音质不咋地,只是当时又没听过真正的音响,这只亲手做的音箱,让我体验到了充足的低音(说到低音,要感谢我的姥爷,他给了我一只大号的电源,具体功率不知道,反正很大很大),震耳欲聋的低音,就像是有人拿着锤子在敲打我的胸膛。 这只音箱在当时带给了我无限的快乐和满足感,后来就去省会读大学了,买了电脑,买了几百块的音箱,那只音箱就被我扔到了角落,上面布满了灰尘。再后来,我干脆把它送给了我的大舅,听说他现在拿它当板凳,还挺结实的! ","date":"2007-07-02T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-07-02/","title":"2007-07-02"},{"content":"国外新兴一个叫Twitter的Web2.0站点,听说最近很火爆,很多人在那里叽叽咕咕,说一些有想法但又不至于发一篇bolg的“废话”。我去看了一眼,感觉跟那帮人文化差异挺大的也就没好意思去注册,但是国内的同志们也不示弱,一时间模仿该网站理念的站点如雨后春笋般涌现。在这些国内的叽咕站点里,有朋友就给我推荐这个“饭否”,说是一个迷你Blog,像Twitter一样,只是大家都是中国人,叽咕的内容比较容易懂一些。我这个人最爱尝鲜,就忍不住过去注册了一个帐号。\n感觉还不错,可以绑定MSN,QQ等IM软件,方便通过IM软件在上面发言,甚至可以绑定手机,让你随时随地的把感受发到网上。人气还是挺旺的,不断有人在上面喃喃自语,也不乏有一搭没一搭的聊天者。发布的内容可以很无聊,比如“今天的天气真好”,也可以很有深度,比如“你们好啊,地球人!” 呵呵,由于没用多久,所以还不能多加评论,我怀我有自闭的倾向,现在有了“饭否”,偶尔在里面发一下实时的感受,发泄一下心情而已,就当我是面对着墙壁在一个人喃喃自语吧。 ","date":"2007-07-01T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-07-01/","title":"2007-07-01"},{"content":"早晨起来,像往常的周六一样,来到公司加班。打开电脑,然后习惯性的访问我的msn空间,“该页无法显示\u0026hellip;.”,不会吧,难道是网络断开了?没有啊,空间主页还是可以访问的,怎么一切换到我的空间就“该页无法显示”了呢?强制刷新浏览器还是不行,随便点了一个朋友的空间,可以访问。完了!莫非我的msn space被封掉了?\n上网搜索一下,看看有没有出现同样问题的朋友,结果显示msn space无法访问是常有的事儿,很多人都有过类似经历(国内用户),这其中的原因不言自明啊!我开始回忆,在我的日志里面到底有没有不该出现的敏感词汇?想了半天,答案是没有。可是要说是msn sapce的故障吧,别人的空间又是可以访问的,无奈只好跟微软的客服发了封电子邮件,暂时还未收到回复。 我刚开始写网络日志,不为影响别人的看法,只为记录一下暂时的心情,本以为放到网上比放在本地还安全(相信微软的技术水平),结果还给我来这一手,想记录的时候却无法访问了,弄的心里还挺难受,担心以前的日志会不会丢掉啊! ps:就在刚才,它又突然可以访问了!\n","date":"2007-06-30T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-06-30/","title":"2007-06-30"},{"content":"今天又一次雨中漫步,原因很简单,受天气预报的干扰我又没带伞(干嘛要说又呢?)。拿起背包从容地奔向车站,嘴里也不忘哼着:“我能想到最郁闷的事~~,就是下雨却没有带伞~~”。淋雨就淋雨吧,挤上车,去思考一个很严重的问题,我的晚饭吃什么?别笑!这确实是一个很严重的问题。我不能像老婆在身边时那样说:“随便吧,做啥吃啥”(虽然心里想着最好炒两个菜,再冰上一瓶啤酒)。自己动手去做的话,倒不是嫌麻烦,只是吃我做的晚饭简直是虐待自己(大饼卷着馒头沾着米饭吃)。\n吃晚餐在我眼中确实是非常重要的事儿,平时上班的时候,早饭总是很虚无缥缈,不堵车的时候就慢慢坐在包子铺里吃包子,堵车时就没准儿了,也许是一个鸡蛋饼,也许是一个肉夹馍,也许,也许只有一杯开水。午饭就是普通的工作餐,千篇一律,除了米饭还是米饭。所以说,一日三餐也就晚饭是顿饭,我把吃晚饭看作是一件很神圣的事情,虽然不必在每次吃晚饭前都焚香沐浴,但我也在吃饭前做个深呼吸,抛开一天的烦恼,菩萨保佑、阿弥陀佛、无量天尊、阿门!感谢上天又让我吃了一顿晚饭!然后就对生活重新燃起热情,对工作又重新充满信心,活着不就是为了这顿晚饭嘛! 可是,现在,我看了看车窗外,雨停了,道路渐渐不再拥堵,我的胃却越来越堵,没有胃口,吃还是不吃,这是个问题。下了车,路边的麻辣烫小摊熏得我的胃一阵抽搐,不远处的油炸臭豆腐老板正在卖力的吆喝,卖盗版书的小贩倒是省事儿,在大喇叭里循环播放“六块一本儿,随便挑随便拣......”,喊得我头晕眼花,我真想冲过拿起他的喇叭然后在空中抛一个完美的弧线。 还是那个晚饭情节,不想在外面饭馆里吃,尤其是一个人在饭馆里吃。 拿起馒头,就着音乐和啤酒...... pijiu\n我怎么会舍得你走, 这一去竟是几个秋冬 请你好好珍重 无须挂念我太多 我的爱和从前一样 这承诺当是万般重要 尽管容颜会老 这一生无以为靠 我还是会爱你到老 我不会让你苦恼 也许我始终无法释怀 我会假装一切都好\n","date":"2007-06-29T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-06-29/","title":"2007-06-29"},{"content":"偶然在diglog里发现了鲜果在线这个网站,名字很好听,于是乎,我就点击进去看了看。看了之后真有一种相见恨晚的感觉,这个站点本身不提供什么信息,只是提供一个在线的RSS阅读器,而且它提供的RSS频道都是根据大家的兴趣和订阅量进行排序的,也就是说,看某个频道的人越多,该频道就越靠前。这样就可以看到大家都喜欢看的东西,那些垃圾信息不会浮上来了(感谢Web2.0啊!)。\n在线阅读的操作也十分简单容易上手,而且界面清爽,有比较强大的自定义功能(我靠,怎么这么像托儿啊),我订阅了一些精品的频道,比如Engadget、Solidot、cnBeta等,顺便订阅了王小峰的“不许联想”(这个博客比较能扯淡,这算是夸他了)。这下就不用Firefox的rss阅读器了,直接把订阅的频道放在鲜果在线里存储到网上,在家和在公司都能看到同样的新鲜信息了,重装系统也不怕,把东西都放到网上,我想这也是以后互联网发展的趋势吧...... ps:其实我早就把收藏的网址也放到网上了,在Firefox里安装一个扩展\u0026ndash;yoono,这个插件也很牛,有点儿像美味书签(del.icio.us),不过yoono最近增加了收藏整个网页的功能所以比较起来就更喜欢yoono。\n分享:\n","date":"2007-06-28T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-06-28/","title":"2007-06-28"},{"content":"雨后的空气格外清新,天气还没有完全放晴,乡间的柏油路上还是湿的,远处缓缓驶来一辆摩托车,骑车的人叼着烟,看起来懒洋洋的,十分惬意,没错,那就是我。\n我这几天回老家了,因为要回去处理一些工作上的事情,这个机会十分难得,暂时逃开北京繁忙的工作,溜回老家,无拘无束,自由自在。 目光所及,尽是农田。空气中还飘散着青草混合大粪的味道,也算是沁人心脾吧。 别再徘徊沉寂的心灵 别再留恋破碎的回忆 大地迎春雷 抛弃你满腹的忧虑 缤纷的彩虹等着你 别再犹豫等待的心湖 别再沉迷过去的旧梦 暖暖的春风 走向那灿烂的天涯路 耀眼的阳光迎着你\n","date":"2007-06-27T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-06-27/","title":"2007-06-27"},{"content":"电视上充斥着广告,其中不乏精品,看完之后让人心情舒畅然后心甘情愿的掏腰包去买他们的产品。但是大多数广告都庸俗不堪,让人看得心慌气短、胃部抽搐、浑身起鸡皮疙瘩。这其中不必说“收礼只收搓澡巾”,也不必说“洗洗更健康”,单就是那位一口气上五楼的大爷就能让人抓狂了。时间长了,这些广告我吐啊吐啊的也就习惯了,对于这类垃圾广告也有了一定的免疫能力。但是最近又有一个广告冲破了我的心理防线!那就是某饮料的变态广告“我拧你!”\n画面上,一群疯子在那里晃来晃去的踢腿,就像得了羊癫疯似的,整个广告看了让人不知道他们在表达什么另类理念,还好导演没忘记让他们每人手里拿着一瓶该品牌的饮料。我估计作者的思路来源与某天他的鞋里进了个小石子,然后他就不停的甩啊甩,一直甩不出来,直到喝了他那个饮料才甩了出来,于是就创作了这个广告。关键是你在电视上恶心恶心我也就算了,在上下班的公交车上居然也循环的播放,而且还衍生出不同的版本出来,里面就没有一个正常人,都拿个腿在那儿踢来踢去的。 也许从某种层面上来说,这也是一个很成功的广告,我看见很多人吵着要下载那段抽风的音乐作为手机铃声,但是我绝对不会去喝一口那种饮料,我怕晚上会做噩梦,然后再一脚把被子给踢到床底下去...... ","date":"2007-06-19T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-06-19/","title":"2007-06-19"},{"content":"你问:“把大象关冰箱里共分几步?”答:“分三步,把冰箱门打开,把大象放进去,把冰箱门带上”。你又问:“可是把大象关进去之后里面黑乎乎的大象不害怕吗?”反问:“你怎么知道关上之后里面还是黑乎乎的?你确定关上门之后那个灯灭了吗?”你:“~~~~~~”\n这个问题曾经也困扰我很久,因为冰箱的门只要一打开那个灯就亮起来,可是关上门之后你又看不到里面,所以还是不能确定里面到底是什么情况。听说国外曾经有人为这事儿想不开去自杀,更有人为此急得抓耳挠腮夜里都睡不着觉,直到他把冰箱的门上凿了个洞,看清了原来关上冰箱门后那个小灯真的灭了,这才安稳的睡去(估计这哥们是一环保人士,担心那灯太费电)。\n我没像那位牛人那样的使用暴力,但也自有办法。当然了,作为一个正常人,去探讨冰箱里的灯到底关了没有,这种做法实在是有些偏执(这不神经病吗!),你就姑且看作我是好奇心使然吧。反正,我的冰箱刚弄回来的时候我还真就动用了高科技手段\u0026ndash;拍照手机,我那手机带了个30W像素的鸡肋摄像头这下派上用场了。\n也是分了三步,把冰箱门打开,把手机定了时(定时10秒后拍摄)放进去,再把门带上。心中默念,时间到,开门取出,查看照片,出现了不可思议的结果!照片里那个灯竟然还亮着!再试一次,还是亮着。我那叫一个晕,觉得被冰箱厂家给忽悠了,口口声声说节能,这得多耗不少电呐。在仔细阅读了两遍说明书之后,总算恍然大悟,原来那不是普通的灯,它不仅仅担任了照明的工作(难道还用来制冷啊?),还兼具杀菌的功效,在关上门之后,它再持续照射几分钟食物,起到杀菌抑菌的效果。哦,原来如此,人家陈老师说了:“人不能无聊到这种地步!”\n","date":"2007-06-18T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-06-18/","title":"2007-06-18"},{"content":"又到了蚊子最猖獗的季节了,现在每晚都有蚊子在我耳边盘旋,嗡嗡的声音若隐若现,让我神经高度紧张,却又懒得起来招呼它们,无奈,硬着头皮睡去。第二天胳膊腿上到处都是蚊子们留下的吻痕\u0026ndash;小红疙瘩,奇痒难忍。我发飙了,对付蚊子,我要开始行动!\n刚开始我采用的是防守战略,听说食用葱姜蒜可以使皮肤排出的汗味具有天然的驱蚊效果,本想采用此方法,但是吃了大蒜那味儿我更受不了只得放弃。还是在洗澡的时候多放点花露水吧,“六神特效驱蚊花露水”据说效果很好,洗完澡往身上狂撒,安静的躺在床上,等待蚊子飘然而来再飘然而去。结果,效果欠佳,蚊子依然如故的为我唱着催眠曲,而且我还被花露水熏得神清气爽、失眠健忘。\n防守看来不行,改变战略。男人!就要对别人狠一些!对付蚊子也不例外!狂奔去超市,买来“枪手”喷雾剂、“睡得香”电蚊香、电蚊拍、紫外光灭蚊灯等等,我要发起进攻了!晚饭毕,拿起“枪手”对卧室一通疯狂扫射,再将蚊香点燃,整个房间烟雾弥漫,关紧房门,外面客厅里的灭蚊灯发出幽幽的清华紫光。这下蚊子们彻底的玩完儿了,对不起了诸位,我已经够瘦弱了,您就给我留点儿血吧。\n沐浴后,推开卧室门,兴冲冲准备打扫战场,刚推开门我就被呛得眼泪鼻涕都下来了(我刚才喷的不是催泪瓦斯吧),蚊子倒是没有了,只是这屋里也不能待了(已经感觉呼吸困难了),无奈只有掐灭蚊香,打开窗户,终于,新鲜的空气伴随着新鲜的蚊子又进来了。灭蚊灯、灭蚊拍也收效甚微。灭蚊战争暂告一段落,蚊子暂时领先。\n先这样吧,实在不行就拿手拍吧, 要是懒得拍就猛开空调把他们冻死,再或者,如果我的反应足够灵敏的话,我就在它们叮我的那一刹那,暗运内力把它们的嘴夹在肌肉里,我憋死它们!\n","date":"2007-06-17T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-06-17/","title":"2007-06-17"},{"content":"如果有那么一天,我在沙滩上走着,突然从沙子里踢出一个神灯,我擦了三下,彭!的一声窜出一个魔鬼,对我龇牙咧嘴,非得满足我三个愿望。那么,我会许什么愿呢?我不会像周星驰那样无耻,许完了两个愿望后最后一个愿望竟是再要三个愿望。我想我也应该不那么自私,我会把头两个愿望交给公益事业,比如世界和平、环境保护啥的,然后留一个愿望给自己,那就是\u0026ndash;我想睡个自然醒。\n自从告别了自在潇洒的大学生活,参加工作以后,我就没有睡够过,也不是完全没有时间睡觉,而是能有机会睡懒觉的时候我都睡不着。在一周里里面,工作日期间肯定没睡懒觉的可能,一大早就狂奔到车站去挤车了,晚上又很晚才睡,所以这期间是十分缺觉的。只有周末的早晨才能有机会赖在床上,可是问题来了,周末的早晨我倍儿精神!平日里闹钟响了还想把它摁掉再小睡一会儿,可一旦到了周末,我往往比闹钟醒的还早,而且再也睡不着。这是为什么呢,苦苦思索之后,得到答案:周末是属于我自己的自由时间而且很短暂,我不舍的拿这点儿宝贵时间来睡觉!平时没时间干的我只有等到周末了,平时听不了音乐就周末抱着音响使劲儿听,平时没时间弹琴就等到周末抱着电子琴使劲儿得瑟,平时没时间摄影等到周末就溜达出去一通狂拍...... 等等,有这些个好事儿等着我,我就算是想睡也真就睡不着了。 所以,我也不祈求啥别的太奢侈的事儿,就让我睡个自然醒吧。 ","date":"2007-06-16T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-06-16/","title":"2007-06-16"},{"content":"老家那边有些事儿需要老婆回去处理一下,用不了几天,可是转眼已经一个周过去了,据说还需要再呆几天才能回北京来。哎!郁闷呐!按照道理来说,作为一个正常的男人如果老婆回了娘家,那他应该感到万分的高兴才是(我曾经有个同事,从来都不吭声,结果有一次哼了一整天的小曲儿,一问才知道,人家老婆大人回娘家去了)。高兴是高兴,可是晚饭没有着落了,眼看着冰箱里的东西被我一点点地吃光了,就连平时不爱吃的饺子也在前天被我从冰箱的最底层翻了出来。家里实在没吃的那就在外面吃吧,昨晚上刚好有饭局,不吃白不吃啊,结果上当了,几个哥们儿都是贪杯的主儿,白的喝完换啤的, 啤的喝完换冰的,一直喝到丧心病狂\u0026hellip;\u0026hellip;饭还没吃上几口。搞得今天蔫了吧唧不说,还浑身上火, 鼻炎发作,咽炎发作,苦不堪言。\n站起来,叹了口气,转身就看到洗衣机里的衣服也快堆成小山了,都说能把袜子按颜色分类的男人和把袜子随便乱扔的男人是两种不同的生物,我显然是属于后者,看来只有等到周末统一解决了。 ","date":"2007-06-15T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-06-15/","title":"2007-06-15"},{"content":"高考刚过,每年的这个时候都会有一大帮人在哪儿声泪俱下的控诉这万恶的高考制度。我也讨厌高考,但是在我的记忆里,另一种考试制度更令我恶心,那就是\u0026mdash;-抽考!\n在我上小学的时后,比较害怕的就是考试了,但最让我感到不安的是每个班级选拔“尖子生”的过程。那个时候每到期末每个班级总是抽出学习成绩最好的几个同学参加镇上的抽考,他们的考试成绩直接代表了整个班级的学习成绩,也代表了老师的教学水平。私下里大家管抽到的这些学生叫“尖子生”。 从小学到初中我几乎一路是“尖子生”,至于为什么要有“尖子生”,这样考试有什么意义我就不去想了,只知道如果被老师抽到当“尖子生”就全家开心,我在家也可以放肆一些,万一抽不到就没人给我好脸色。好在屡次的抽考过程中我只有两次没有被选中,不知是幸运还是不幸。 其中一次是在小学二年级的时候,虽然没有被选中,但是也参加了考试(数学替考),当时我的情况是语文极差但数学很好(至少比那些“尖子”要好一些),老师为了他们的荣誉,便让我替另外一个考生参加了数学考试,试卷虽然是我答的却不能填写我的名字。好在当时也没什么自尊心,也就爽快的答应了,现在想一想作为老师也太不应该了。(这也是我后来虽念了师范却最终没有选择做老师的原因之一)。 到后来就越来越抵制这种虚伪的考试,大概是四年级,我越来越贪玩,成绩真的不行了,要期末考试了,老师们纷纷挑选“尖子”,刚开始还被提名,后来经过多层过滤,勉强坚持到了最后一轮评测,直到我们伟大的辛勤的园丁说:“好了,那谁,你回去吧,其他人留下”。于是我提着书包灰溜溜回家,心里却说不出的高兴,不用去参加TMD关系到班集体荣誉的考试了!爽!哼哼,我冷笑,冷笑。现在回忆起来,脑子里仍旧充斥着老师们那因为贪图班级的名次而扭曲的面容(这就是原因之二)。 不知道现在怎么样了,在当时,这样的考试制度,它伤了太多太多孩子的心。 choukao\nps:\n今日饮酒过渡\n沉醉不知归路\n兴尽打车走\n误入小区深处\n呕吐、呕吐\n引来保安无数!\n","date":"2007-06-14T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-06-14/","title":"2007-06-14"},{"content":"早晨,NB烘烘的中国移动给我发天气预报说是阴转多云,在分析了昨晚电视上的预报加上收音机告诉我的降水概率后,我确定今天不会下雨,然后非常自信的没带伞就上班了,虽然头上的天阴的要滴水似的。\n谁知现在的天气预报已经不准确到让人发指的地步了!从下车到家的那段路程我只好雨中快步了(跑啊)。不是说现在计算机运算速度越来越快了吗?不是说建立的数据模型越来越接近真实了吗?不是说那什么风云N号也升空了吗?嗯?!忽悠谁啊!上次就报给我说最近西伯利亚那边有情况,未来几天有大风降温的天气,搞得我捂了一身痱子!现在到处是天气预报,各大网站上有,报纸上有,QQ上有,收音机、电视就更有了,而且还花样儿繁多,一会儿是穿衣指数,一会儿又洗车指数,最后还忽悠你个降水概率,有雨就有雨没雨就没雨,整个指数百分之60鬼才知道到底要不要下! 当然了,他们有预报准确的时候,那就是对局部地区的天气预报,反正局部地区天天要下雨甚至还有短时间的雷雨大风等强对流天气。我妈就曾经十分关切的问我:“为什么局部地区天天下雨,这个地区到底在哪儿?住在那儿的人可怎么活哟!” 算啦,也不跟他们计较,我还是回去翻翻小学的语文课本,好好拜读一下里面的那篇《看云识天气》,以后再也不相信这GR的天气预报了! 慢着,突然想起了倪萍大婶子曾经在“综艺大观”上做的即兴方言版天气预报,啧啧,那叫一个准啊!“社员同志们注意啦,哈。这个山东省荣成县寨子沟公社刘家村广播站现在开始播送天气预报,哈。这个明天头半晌儿阴有小雨儿,后半晌儿就变天了。南风转西北风7-8级。这个凄凄沥沥的小雨儿夹着嗖嗖的西北风,今儿刮,明儿刮儿,后儿还刮,一直刮到下个星期六,哈。这个咱再接着说天气预报。这个西北风一刮,这回最大的特点就是龙卷风,龙卷风啊,粮食要最重\u0026hellip;.”\n","date":"2007-06-13T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-06-13/","title":"2007-06-13"},{"content":"初来北京的时候,家里托着亲戚的亲戚的关系让我在一家单位实习,就像鲁迅小说里写的那样,掌柜的是一副凶脸孔,主顾也没有好声气。那时我一个人住在前门外大栅栏里的一家小旅馆里。 我住的胡同往北走几步一拐就是北京著名的“大栅栏步行街”,那儿有着浓厚的京味儿,经常看到成群的外国鬼子。他们不停的拍照,吃小吃,买工艺品,所以这里一天到晚人山人海热闹非凡。有时候我也去转转,只是转转,并不买东西,那些让老外一看见就双眼冒光的玩意儿对我并没有多大吸引力。 小王,我住的旅店里的服务员,瘦瘦的,头戴一顶鸭舌帽,手腕上戴了一只便宜手表。 一天下午,我一个人站在楼顶上特别无聊,正好小王上来,我递给他一根“中南海”他笑笑接住说:“一个人在外无聊吧?”我说:“是” 他说 “那我就给你讲讲这一片儿的故事吧!”,于是他就趴在栏杆上给我说了一通关于这个胡同的故事,说了这一带在清朝是曾经全是窑子。他抽了不少烟,我说“中南海这烟太冲了这边有没有柔和一点儿的烟?”他想了想说:“我抽的都是便宜烟,恩,不过便宜好抽就行\u0026hellip;” 他给我说了两种。我到了晚上买来抽了几支觉得不好抽(那时我还不怎么抽烟)就都送给他了。以后就时常在一起谈天,混得很熟了,他经常早早的就把我的暖壶打满开水给提上来。 只是又过了两三天,我一直也没见到小王,一问店老板才知道 :“他回老家了,他是离家出走才来到这个小店的,没钱了,才在这儿打工,不求挣钱只要有吃有睡就行,前两天他哥哥找到这里就把他带回去了。”老板很惋惜:“多好的孩子呀!”\n","date":"2007-06-12T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-06-12/","title":"2007-06-12"},{"content":"早晨的阳光真灿烂,虽然天气湿热有点儿桑拿天的苗头,但是我的心情很好,阳光洒在我的工作服上像是镶了金边,很是耀眼。对了,我是一个环卫工人,每天早晨都要在这儿清扫垃圾,这个工作是很神圣的,至少我这么认为,虽然和小时候的梦想(艺术家)差得很远,但是用某位相声演员的话说“这是一样一样一样的啊”!我愉快地拿起扫把,自在地吹着口哨,再把这条街扫完就可以收工了。我不由得加快了速度挥舞着扫把就像一个画家挥舞着手中的画笔,我气沉丹田暗用内力,短小的扫把被我使得是呼呼生风,卷起的沙尘就像一层薄雾。 这个时候你出现了,挎着小包,下了公共汽车,高跟鞋踩在平坦的人行道上发出清脆的得得响,你的小手微微举起遮住当前还不算猛烈的太阳。真漂亮啊!我暗自赞道。上学时很不努力导致我的眼神儿非常好,我想,在工作时看到美女也算是一种福利吧!看着你向我走来,越走越近,不知是热的还是累得,我的手心开始出汗,我攥紧了扫把更卖力的扫了起来,地上的落叶伴随着纸片在沙尘中轻轻飞舞。你终于走到我的身边,冲我使劲的挥手,这么近的距离我终于看清了你的眼睛,很大、很圆,长长的睫毛。你竟然停下了脚步,盯住我迷离的眼神和唏嘘的胡茬,我期盼着你能给我说些什么,虽然黑夜给了你黑色的眼睛,但你却翻了个白眼儿给我:“你就不能轻点儿扫吗!还让不让人走路了!”。\n","date":"2007-06-11T00:00:00Z","permalink":"https://sbabybird.github.io/p/2007-06-11/","title":"2007-06-11"}] \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 000000000..bc9e80760 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1 @@ +https://sbabybird.github.io/2023-09-21T00:00:00+00:00https://sbabybird.github.io/categories/2023-09-21T00:00:00+00:00https://sbabybird.github.io/tags/github/2023-09-21T00:00:00+00:00https://sbabybird.github.io/tags/howto/2023-09-21T00:00:00+00:00https://sbabybird.github.io/post/2023-09-21T00:00:00+00:00https://sbabybird.github.io/tags/2023-09-21T00:00:00+00:00https://sbabybird.github.io/categories/%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/2023-09-21T00:00:00+00:00https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-21T00:00:00+00:00https://sbabybird.github.io/tags/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98/2023-09-19T00:00:00+00:00https://sbabybird.github.io/categories/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98/2023-09-19T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-11T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/2023-05-24T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-12T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/2023-02-15T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-12T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-21T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/2022-11-16T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/2022-11-02T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/2022-10-18T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/2022-10-11T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/2022-10-03T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-001-%E6%9C%9F/2022-09-28T00:00:00+00:00https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8Emarkdown%E6%A0%BC%E5%BC%8F%E7%9A%84%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86%E5%B0%9D%E8%AF%95%E8%AE%A1%E5%88%92/2022-04-23T00:00:00+00:00https://sbabybird.github.io/tags/%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86/2022-04-23T00:00:00+00:00https://sbabybird.github.io/categories/%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86/2022-04-23T00:00:00+00:00https://sbabybird.github.io/archives/2022-03-06T00:00:00+00:00https://sbabybird.github.io/page/2022-03-06T00:00:00+00:00https://sbabybird.github.io/p/%E5%B0%91%E6%9C%89%E4%BA%BA%E8%B5%B0%E7%9A%84%E8%B7%AF%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/2021-04-18T00:00:00+00:00https://sbabybird.github.io/categories/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/2021-04-18T00:00:00+00:00https://sbabybird.github.io/tags/%E5%BF%83%E7%90%86%E5%AD%A6/2021-04-18T00:00:00+00:00https://sbabybird.github.io/p/%E7%AE%A1%E7%90%86%E8%87%AA%E5%B7%B1%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/2021-04-15T00:00:00+00:00https://sbabybird.github.io/tags/%E7%AE%A1%E7%90%86/2021-04-15T00:00:00+00:00https://sbabybird.github.io/p/2020%E5%B9%B4%E4%B8%AA%E4%BA%BA%E6%80%BB%E7%BB%93/2021-02-10T00:00:00+00:00https://sbabybird.github.io/tags/%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/2021-02-10T00:00:00+00:00https://sbabybird.github.io/categories/%E9%9A%8F%E7%AC%94/2021-02-10T00:00:00+00:00https://sbabybird.github.io/tags/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/2019-06-02T00:00:00+00:00https://sbabybird.github.io/p/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E5%92%8C%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D/2019-06-02T00:00:00+00:00https://sbabybird.github.io/categories/%E5%AD%A6%E4%B9%A0/2019-06-02T00:00:00+00:00https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%9A%84%E5%AD%A6%E4%B9%A0%E5%87%86%E5%A4%87/2019-05-18T00:00:00+00:00https://sbabybird.github.io/tags/%E5%AE%B6%E5%BA%AD/2019-05-09T00:00:00+00:00https://sbabybird.github.io/p/%E8%87%B4%E5%84%BF%E5%AD%90%E6%88%90%E4%BA%BA%E7%A4%BC%E7%9A%84%E4%B8%80%E5%B0%81%E4%BF%A1/2019-05-09T00:00:00+00:00https://sbabybird.github.io/p/%E9%AB%98%E6%95%88%E8%83%BD%E4%BA%BA%E5%A3%AB%E7%9A%84%E4%B8%83%E4%B8%AA%E4%B9%A0%E6%83%AF%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/2019-05-07T00:00:00+00:00https://sbabybird.github.io/p/%E7%AE%A1%E7%90%86%E5%8D%81%E8%AF%AB%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/2019-04-30T00:00:00+00:00https://sbabybird.github.io/p/%E4%BA%8B%E5%A6%82%E6%98%A5%E6%A2%A6%E4%BA%86%E6%97%A0%E7%97%95/2018-07-19T00:00:00+00:00https://sbabybird.github.io/tags/%E5%BF%83%E5%BE%97/2018-07-19T00:00:00+00:00https://sbabybird.github.io/tags/exercise/2015-01-05T00:00:00+00:00https://sbabybird.github.io/tags/lisp/2015-01-05T00:00:00+00:00https://sbabybird.github.io/tags/programming/2015-01-05T00:00:00+00:00https://sbabybird.github.io/categories/sicp/2015-01-05T00:00:00+00:00https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.9/2015-01-05T00:00:00+00:00https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.8/2014-12-29T00:00:00+00:00https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.7/2014-12-27T00:00:00+00:00https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.6/2014-12-23T00:00:00+00:00https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.4/2014-12-19T00:00:00+00:00https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.5/2014-12-19T00:00:00+00:00https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.1/2014-12-15T00:00:00+00:00https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.2/2014-12-15T00:00:00+00:00https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.3/2014-12-15T00:00:00+00:00https://sbabybird.github.io/categories/misc/2014-02-13T00:00:00+00:00https://sbabybird.github.io/tags/wifi/2014-02-13T00:00:00+00:00https://sbabybird.github.io/tags/win8/2014-02-13T00:00:00+00:00https://sbabybird.github.io/p/win8%E7%B3%BB%E7%BB%9F%E4%B8%8B%E4%BD%BF%E7%94%A8%E7%AC%94%E8%AE%B0%E6%9C%AC%E4%BD%9C%E4%B8%BAwifi%E7%83%AD%E7%82%B9/2014-02-13T00:00:00+00:00https://sbabybird.github.io/categories/develop/2013-11-07T00:00:00+00:00https://sbabybird.github.io/tags/mongodb/2013-11-07T00:00:00+00:00https://sbabybird.github.io/tags/vs2008/2013-11-07T00:00:00+00:00https://sbabybird.github.io/p/%E4%BD%BF%E7%94%A8vs2008%E7%BC%96%E8%AF%91mongodb/2013-11-07T00:00:00+00:00https://sbabybird.github.io/tags/about/2013-04-29T00:00:00+00:00https://sbabybird.github.io/tags/hello/2013-04-29T00:00:00+00:00https://sbabybird.github.io/categories/hello/2013-04-29T00:00:00+00:00https://sbabybird.github.io/p/hello-world/2013-04-29T00:00:00+00:00https://sbabybird.github.io/p/2007-11-13/2007-11-13T00:00:00+00:00https://sbabybird.github.io/categories/%E5%8D%9A%E5%AE%A2%E6%97%A5%E8%AE%B0/2007-11-13T00:00:00+00:00https://sbabybird.github.io/tags/%E5%BF%83%E6%83%85%E9%9A%8F%E7%AC%94/2007-11-13T00:00:00+00:00https://sbabybird.github.io/p/2007-08-28/2007-08-28T00:00:00+00:00https://sbabybird.github.io/p/2007-08-04/2007-08-04T00:00:00+00:00https://sbabybird.github.io/p/2007-08-03/2007-08-03T00:00:00+00:00https://sbabybird.github.io/p/2007-07-29/2007-07-29T00:00:00+00:00https://sbabybird.github.io/p/2007-07-24/2007-07-24T00:00:00+00:00https://sbabybird.github.io/p/2007-07-23/2007-07-23T00:00:00+00:00https://sbabybird.github.io/p/2007-07-21/2007-07-21T00:00:00+00:00https://sbabybird.github.io/p/2007-07-20/2007-07-20T00:00:00+00:00https://sbabybird.github.io/p/2007-07-19/2007-07-19T00:00:00+00:00https://sbabybird.github.io/p/2007-07-12/2007-07-12T00:00:00+00:00https://sbabybird.github.io/p/2007-07-06/2007-07-06T00:00:00+00:00https://sbabybird.github.io/p/2007-07-04/2007-07-04T00:00:00+00:00https://sbabybird.github.io/p/2007-07-02/2007-07-02T00:00:00+00:00https://sbabybird.github.io/p/2007-07-01/2007-07-01T00:00:00+00:00https://sbabybird.github.io/p/2007-06-30/2007-06-30T00:00:00+00:00https://sbabybird.github.io/p/2007-06-29/2007-06-29T00:00:00+00:00https://sbabybird.github.io/p/2007-06-28/2007-06-28T00:00:00+00:00https://sbabybird.github.io/p/2007-06-27/2007-06-27T00:00:00+00:00https://sbabybird.github.io/p/2007-06-19/2007-06-19T00:00:00+00:00https://sbabybird.github.io/p/2007-06-18/2007-06-18T00:00:00+00:00https://sbabybird.github.io/p/2007-06-17/2007-06-17T00:00:00+00:00https://sbabybird.github.io/p/2007-06-16/2007-06-16T00:00:00+00:00https://sbabybird.github.io/p/2007-06-15/2007-06-15T00:00:00+00:00https://sbabybird.github.io/p/2007-06-14/2007-06-14T00:00:00+00:00https://sbabybird.github.io/p/2007-06-13/2007-06-13T00:00:00+00:00https://sbabybird.github.io/p/2007-06-12/2007-06-12T00:00:00+00:00https://sbabybird.github.io/p/2007-06-11/2007-06-11T00:00:00+00:00https://sbabybird.github.io/links/https://sbabybird.github.io/search/ \ No newline at end of file diff --git a/tags/about/index.html b/tags/about/index.html new file mode 100644 index 000000000..a2c3a0fe1 --- /dev/null +++ b/tags/about/index.html @@ -0,0 +1,31 @@ +Tag: about - Learning & Writing!

Tags

about

+ \ No newline at end of file diff --git a/tags/about/index.xml b/tags/about/index.xml new file mode 100644 index 000000000..281fcc603 --- /dev/null +++ b/tags/about/index.xml @@ -0,0 +1,2 @@ +about on Learning & Writing!https://sbabybird.github.io/tags/about/Recent content in about on Learning & Writing!Hugo -- gohugo.iozh-cnMon, 29 Apr 2013 00:00:00 +0000Hello World!https://sbabybird.github.io/p/hello-world/Mon, 29 Apr 2013 00:00:00 +0000https://sbabybird.github.io/p/hello-world/<h2 id="hello">Hello</h2> +<h2 id="world">World</h2> \ No newline at end of file diff --git a/tags/about/page/1/index.html b/tags/about/page/1/index.html new file mode 100644 index 000000000..3526c10f7 --- /dev/null +++ b/tags/about/page/1/index.html @@ -0,0 +1 @@ +https://sbabybird.github.io/tags/about/ \ No newline at end of file diff --git a/tags/exercise/index.html b/tags/exercise/index.html new file mode 100644 index 000000000..e7ae570b8 --- /dev/null +++ b/tags/exercise/index.html @@ -0,0 +1,32 @@ +Tag: exercise - Learning & Writing!

Tags

exercise

+ \ No newline at end of file diff --git a/tags/exercise/index.xml b/tags/exercise/index.xml new file mode 100644 index 000000000..a310792c8 --- /dev/null +++ b/tags/exercise/index.xml @@ -0,0 +1,576 @@ +exercise on Learning & Writing!https://sbabybird.github.io/tags/exercise/Recent content in exercise on Learning & Writing!Hugo -- gohugo.iozh-cnMon, 05 Jan 2015 00:00:00 +0000SICP 课后练习题1.9https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.9/Mon, 05 Jan 2015 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.9/<h4 id="练习-19--下面两个过程各定义了一种加起两个正整数的方法他们都基于过程inc它将参数增加1和dec它将参数减少1-请用代换模型展示这两个过程在求值add-4-5时所产生的计算过程这些计算过程是递归的或者迭代的吗">练习 1.9 下面两个过程各定义了一种加起两个正整数的方法,他们都基于过程inc(它将参数增加1)和dec(它将参数减少1) 。请用代换模型展示这两个过程在求值<code>(add 4 5)</code>时所产生的计算过程。这些计算过程是递归的或者迭代的吗?</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">add</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">= </span><span class="nv">a</span> <span class="mi">0</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">b</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="p">(</span><span class="nf">dec</span> <span class="nv">a</span><span class="p">)</span> <span class="nv">b</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">add</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">= </span><span class="nv">a</span> <span class="mi">0</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">b</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="p">(</span><span class="nf">dec</span> <span class="nv">a</span><span class="p">)</span> <span class="p">(</span><span class="nf">inc</span> <span class="nv">b</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> +</span></span></code></pre></td></tr></table> +</div> +</div><p>解答:根据代换模型分别展开如下</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span><span class="lnt">15 +</span><span class="lnt">16 +</span><span class="lnt">17 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">4</span> <span class="mi">5</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="mi">3</span> <span class="mi">5</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="mi">2</span> <span class="mi">5</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="mi">1</span> <span class="mi">5</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="mi">0</span> <span class="mi">5</span><span class="p">)))))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="mi">5</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="mi">6</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="mi">7</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="mi">8</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="mi">9</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">4</span> <span class="mi">5</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">3</span> <span class="mi">6</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">2</span> <span class="mi">7</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">1</span> <span class="mi">8</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">0</span> <span class="mi">9</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="mi">9</span><span class="p">)</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>根据展开可以看出,第一个计算过程是递归的,因为明显有一个逐步扩展然后又收缩的递归计算链条。第二个计算过程是迭代的,没有扩展、收缩的过程,而是使用a和b存储了常量。</p>SICP 课后练习题1.8https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.8/Mon, 29 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.8/<h4 id="练习-18-求立方根的牛顿法基于如下事实如果y是x的立方根的一个近似值那么下式将给出一个更好的近似值">练习 1.8 求立方根的牛顿法基于如下事实,如果y是x的立方根的一个近似值,那么下式将给出一个更好的近似值:</h4> +<p>$$ \frac{x/y^2+2y}{3} $$</p> +<p>请利用这一公式实现一个类似平方根过程的求立方根的过程。</p> +<p>解答:基本思路与求解平方根的实现是一致的,区别再有得到更好值<code>improve</code>的过程有变化,只需根据公式描述进行实现即可</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span><span class="lnt">15 +</span><span class="lnt">16 +</span><span class="lnt">17 +</span><span class="lnt">18 +</span><span class="lnt">19 +</span><span class="lnt">20 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">/</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">+ </span><span class="p">(</span><span class="nb">/ </span><span class="nv">x</span> <span class="p">(</span><span class="nb">* </span><span class="nv">guess</span> <span class="nv">guess</span><span class="p">))</span> <span class="p">(</span><span class="nb">* </span><span class="nv">guess</span> <span class="mi">2</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="mi">3</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">next</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">&lt; </span><span class="p">(</span><span class="nb">/ </span><span class="p">(</span><span class="nb">abs </span><span class="p">(</span><span class="nb">- </span><span class="nv">guess</span> <span class="nv">next</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="nv">guess</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mf">0.001</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nb">abs </span><span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&lt; </span><span class="nv">x</span> <span class="mi">0</span><span class="p">)</span> <span class="p">(</span><span class="nb">- </span><span class="nv">x</span><span class="p">)</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">cbrt-iter</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">cbrt-iter</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> <span class="nv">x</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">cbrt</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">cbrt-iter</span> <span class="mf">1.0</span> <span class="nv">x</span><span class="p">))</span> +</span></span></code></pre></td></tr></table> +</div> +</div>SICP 课后练习题1.7https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.7/Sat, 27 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.7/<h4 id="练习-17-对于确定很小的数的平方根而言在计算平方根中使用的检测good-enough是很不好的还有在现实的计算机里算术运算总是以一定的有限精度进行的这也会使我们的检测不适合非常大的数的计算请解释上述论断用例子说明对很小和很大的数这种检测都可能失败实现good-enough的另一种策略是监视猜测值在从一次迭代到下一次的变化情况当改变值相对于猜测值的比率很小时就结束请设计一个采用这种终止测试方式的平方根过程对于很大和很小的数这一方式都能工作吗">练习 1.7 对于确定很小的数的平方根而言,在计算平方根中使用的检测good-enough?是很不好的。还有,在现实的计算机里,算术运算总是以一定的有限精度进行的。这也会使我们的检测不适合非常大的数的计算。请解释上述论断,用例子说明对很小和很大的数,这种检测都可能失败。实现good-enough?的另一种策略是监视猜测值在从一次迭代到下一次的变化情况,当改变值相对于猜测值的比率很小时就结束。请设计一个采用这种终止测试方式的平方根过程。对于很大和很小的数,这一方式都能工作吗?</h4> +<p>解答:good-enough?当前采用的判断方式是,对比猜测值的平方结果与X的值之间的差距,当差距小于某个阙值时(比如0.001),就停止计算。当X很小或很大时,这种检测就会失败,比如,假设我们的阙值设置为0.001,那么当X本身小于这个阙值时,就会检测失败,得出错误结果,当X很大时,也会由于精度不足而一直达不到最佳猜测值,导致死循环。</p> +<p>因此,要解决这一问题,可以按照题目中给出的思路对good-enough?过程进行修改,不再判断猜测值平方与X的差距,而是判断两次猜测值之间的比率。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span><span class="lnt">15 +</span><span class="lnt">16 +</span><span class="lnt">17 +</span><span class="lnt">18 +</span><span class="lnt">19 +</span><span class="lnt">20 +</span><span class="lnt">21 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">next</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">&lt; </span><span class="p">(</span><span class="nb">/ </span><span class="p">(</span><span class="nb">abs </span><span class="p">(</span><span class="nb">- </span><span class="nv">guess</span> <span class="nv">next</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="nv">guess</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mf">0.001</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: good-enough?</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">sqrt-iter</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">sqrt-iter</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> <span class="nv">x</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: sqrt-iter</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="nb">sqrt </span><span class="mf">0.00000000001</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 3.1622776601874535e-6</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="nb">sqrt </span><span class="mi">100000000000000000000000000000000000000000000</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 1.0000000000001497e22</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>在新的<code>good-enough?</code>中,传入的是两次猜测值,所以还要修改<code>sqrt-iter</code>过程,在调用时计算两次猜测值。</p>SICP 课后练习题1.6https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.6/Tue, 23 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.6/<p>采用牛顿法求平方根的过程如下。开始时,我们有了被开方数的值(现在需要做的就是算出它的平方根)和一个猜测值。如果猜测值已经足够好了,有关工作也就完成了。如若不然,那么就需要改进猜测值(求出猜测值与被开方数除以猜测值的平均值),并重复这个计算过程。具体编写代码如下(在MIT scheme解释器中)。</p> +<p>定义<code>sqrt-iter</code>过程,与上述描述完全对应。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">sqrt-iter</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">guess</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">sqrt-iter</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">x</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: sqrt-iter</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义改进猜测值的过程<code>improve</code>,返回猜测值与被开方数除以猜测值的平均值。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">average</span> <span class="nv">guess</span> <span class="p">(</span><span class="nb">/ </span><span class="nv">x</span> <span class="nv">guess</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: improve</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义求平均数的过程<code>average</code>。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">average</span> <span class="nv">x</span> <span class="nv">y</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">/ </span><span class="p">(</span><span class="nb">+ </span><span class="nv">x</span> <span class="nv">y</span><span class="p">)</span> <span class="mi">2</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: average</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义判断猜测值是否足够好的过程<code>good-enough?</code>。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">&lt; </span><span class="p">(</span><span class="nb">abs </span><span class="p">(</span><span class="nb">- </span><span class="p">(</span><span class="nf">square</span> <span class="nv">guess</span><span class="p">)</span> <span class="nv">x</span><span class="p">))</span> <span class="mf">0.001</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: good-enough?</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义求绝对值和平方的过程</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span><span class="lnt">8 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nb">abs </span><span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&lt; </span><span class="nv">x</span> <span class="mi">0</span><span class="p">)</span> <span class="p">(</span><span class="nb">- </span><span class="nv">x</span><span class="p">)</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: abs</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">square</span> <span class="nv">x</span><span class="p">)</span> <span class="p">(</span><span class="nb">* </span><span class="nv">x</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: square</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义最上层的过程,用于启动整个工作(使用<code>1</code>这个数字作为任何数的初始猜测值)。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nb">sqrt </span><span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">sqrt-iter</span> <span class="mf">1.0</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: sqrt</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>执行<code>sqrt</code>过程,并以<code>9</code>为参数,求得平方根为<code>3</code></p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="nb">sqrt </span><span class="mi">9</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 3.00009155413138</span> +</span></span></code></pre></td></tr></table> +</div> +</div><h4 id="练习16----alyssa-phacker看不出来为什么需要将if提供为一种特殊形式她问为什么我不能直接通过cond将它定义为一个常规过程呢alyssa的朋友eva-lu-ator断言确实可以这样做并定义了if的一个新版本">练习1.6 Alyssa P.Hacker看不出来为什么需要将if提供为一种特殊形式,她问:“为什么我不能直接通过<code>cond</code>将它定义为一个常规过程呢?”Alyssa的朋友Eva Lu Ator断言确实可以这样做,并定义了<code>if</code>的一个新版本:</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">new-if</span> <span class="nv">predicate</span> <span class="nv">then-clause</span> <span class="nv">else-clause</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">cond </span><span class="p">(</span><span class="nf">predicate</span> <span class="nv">then-clause</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">else </span><span class="nv">else-clause</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: new-if</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>Eva给Alyssa演示她的程序:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">new-if</span> <span class="p">(</span><span class="nb">= </span><span class="mi">2</span> <span class="mi">3</span><span class="p">)</span> <span class="mi">0</span> <span class="mi">5</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mi">5</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">new-if</span> <span class="p">(</span><span class="nb">= </span><span class="mi">1</span> <span class="mi">1</span><span class="p">)</span> <span class="mi">0</span> <span class="mi">5</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mi">0</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>她很高兴地用自己的<code>new-if</code>重写了求平方根的程序:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">sqrt-iter</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">new-if</span> <span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">guess</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">sqrt-iter</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">x</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: sqrt-iter</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>当Alyssa试着用这个过程去计算平方根时会发生什么事情呢?请给出解释。</p> +<p>解答:</p> +<p>这个练习引入了一个新的思考,刚开始时,我以为是牵涉到了过程的局部参数概念,因为在新编写的<code>new-if</code>过程中,看似可以完成条件判断并返回正确的值,但是在本例中使用却存在问题,即在递归调用<code>sqrt-iter</code>时,传给该过程的<code>guess</code>和<code>x</code>为<code>new-if</code>的局部参数,被返回给了<code>new-if</code>这个过程,不会向上返回到上一层<code>sqrt-iter</code>里,这样就导致了改进的猜测值永远不会被使用,使得这个计算过程永远不会结束(除非第一个猜测值恰好合适),从而导致递归调用的陷入无限循环。我在<code>MIT-scheme</code>解释器里的执行结果是,解释器自动退出并提示我递归调用深度超出最大值。</p> +<p>上述看起来是合理的,但是后来我考虑了其他情况,及本书在前面章节里提到了if<code>(if &lt;predicate&gt; &lt;consequent&gt; &lt;alternative&gt;)</code>语句是条件表达式的受限形式,在执行时,先判断<code>predicate</code>是否为真,然后根据结果只执行其后<code>consequent/alternative</code>中的一个。如果使用本例新定义的<code>new-if</code>则作为普通过程执行,传入的参数会因为解释器使用应用序求值的原因,两个表达式都会被立即求值,反应到本例中就是<code>guess</code>和<code>(sqrt-iter (improve guess x) x)</code>都会被立即求值,后面的那句是属于递归调用,这样也会导致改进的猜测值永远不会被使用,陷入无限层的递归调用中。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="nb">sqrt </span><span class="mi">9</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Aborting!: maximum recursion depth exceeded</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>思考:</p> +<p>最初的时候,我的针对此题的思考方式是变量的作用域问题(可能lisp不会有此问题),后来发现,也许不是这样,而是由于对传入参数立即求值导致的,后续的网上搜索结果也显示出大家的答案都倾向于后者。</p>SICP 课后练习题1.4https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.4/Fri, 19 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.4/<h4 id="练习14----请仔细考察上面给出的允许运算符为复合表达式的组合式的求值模型根据对这一模型的认识描述下面过程的行为">练习1.4 请仔细考察上面给出的允许运算符为复合表达式的组合式的求值模型,根据对这一模型的认识描述下面过程的行为。</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">a-plus-abs-b</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">((</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="mi">0</span><span class="p">)</span> <span class="nv">+</span> <span class="nv">-</span><span class="p">)</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">))</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>练习1.4,通过if判断,根据b的值决定对a b所使用的运算符是+还是-,如果b大于0,则组合式为(+ a b),反之则为(- a b),所以组合式结果永远返回a加上b的绝对值。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span><span class="lnt">8 +</span><span class="lnt">9 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">a-plus-abs-b</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">((</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="mi">0</span><span class="p">)</span> <span class="nv">+</span> <span class="nv">-</span><span class="p">)</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: a-plus-abs-b</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">a-plus-abs-b</span> <span class="mi">4</span> <span class="mi">2</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 6</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">a-plus-abs-b</span> <span class="mi">4</span> <span class="mi">-2</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 6</span> +</span></span></code></pre></td></tr></table> +</div> +</div>SICP 课后练习题1.5https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.5/Fri, 19 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.5/<h4 id="练习15---ben-bitdiddle发明了一种检测方法能够确定解释器究竟采用哪种序求值是采用应用序还是正则序他定义了下面两个过程">练习1.5 Ben Bitdiddle发明了一种检测方法,能够确定解释器究竟采用哪种序求值,是采用应用序,还是正则序。他定义了下面两个过程</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">p</span><span class="p">)</span> <span class="p">(</span><span class="nf">p</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">test</span> <span class="nv">x</span> <span class="nv">y</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">= </span><span class="nv">x</span> <span class="mi">0</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mi">0</span> +</span></span><span class="line"><span class="cl"> <span class="nv">y</span><span class="p">))</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>而后他求值下面的表达式:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">test</span> <span class="mi">0</span> <span class="p">(</span><span class="nf">p</span><span class="p">))</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>如果某个解释器采用的是应用序求值,Ben会看到什么样的情况?如果解释器采用正则序求值,他又会看到什么情况?请对你的回答做出解释。(无论采用正则序或者应用序,假定特殊形式if的求值规则总是一样的。其中的谓词部分先行求值,根据其结果确定随后求值的子表达式部分。)</p> +<p>练习1.5 『完全展开而后规约』的求值模型为正则序求值,『先求值参数而后应用』的方式为应用序求值,因此,在应用序求值的模式下,执行<code>(test 0 (p))</code>时会先求<code>(p)</code>这个表达式的值,而根据定义<code>(define (p) (p))</code>执行<code>(p)</code>会造成递归调用,解释器陷入死循环。而在正则序求值模式下,会先展开<code>test</code>过程,根据需要再决定是否执行<code>(p)</code>,在本例中,由于传入的<code>x</code>等于<code>0</code>,所以<code>(p)</code>不会被执行,因此不会陷入死循环。</p> +<p>所以,根据以上分析,如果解释器采用的是应用序求值,则解释器陷入死循环,如果是采用正则序求值,则解释器输出<code>;Value: 0</code>。</p>SICP 课后练习题1.1https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.1/Mon, 15 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.1/<h4 id="练习11----下面是一系列表达式对于每个表达式解释器将输出什么结果假定这一系列表达式是按照给出的顺序逐个求值的">练习1.1 下面是一系列表达式,对于每个表达式,解释器将输出什么结果?假定这一系列表达式是按照给出的顺序逐个求值的。</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span><span class="lnt">15 +</span><span class="lnt">16 +</span><span class="lnt">17 +</span><span class="lnt">18 +</span><span class="lnt">19 +</span><span class="lnt">20 +</span><span class="lnt">21 +</span><span class="lnt">22 +</span><span class="lnt">23 +</span><span class="lnt">24 +</span><span class="lnt">25 +</span><span class="lnt">26 +</span><span class="lnt">27 +</span><span class="lnt">28 +</span><span class="lnt">29 +</span><span class="lnt">30 +</span><span class="lnt">31 +</span><span class="lnt">32 +</span><span class="lnt">33 +</span><span class="lnt">34 +</span><span class="lnt">35 +</span><span class="lnt">36 +</span><span class="lnt">37 +</span><span class="lnt">38 +</span><span class="lnt">39 +</span><span class="lnt">40 +</span><span class="lnt">41 +</span><span class="lnt">42 +</span><span class="lnt">43 +</span><span class="lnt">44 +</span><span class="lnt">45 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"><span class="mi">10</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 10</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="mi">5</span> <span class="mi">3</span> <span class="mi">4</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 12</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">9</span> <span class="mi">1</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 8</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">/ </span><span class="mi">6</span> <span class="mi">2</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 3</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="p">(</span><span class="nb">* </span><span class="mi">2</span> <span class="mi">4</span><span class="p">)</span> <span class="p">(</span><span class="nb">- </span><span class="mi">4</span> <span class="mi">6</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 6</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">define </span><span class="nv">a</span> <span class="mi">3</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: a</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">define </span><span class="nv">b</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="mi">1</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: b</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="nv">b</span> <span class="p">(</span><span class="nb">* </span><span class="nv">a</span> <span class="nv">b</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 19</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">= </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: #f</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="k">and </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="nv">a</span><span class="p">)</span> <span class="p">(</span><span class="nb">&lt; </span><span class="nv">b</span> <span class="p">(</span><span class="nb">* </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"><span class="nv">b</span> +</span></span><span class="line"><span class="cl"><span class="nv">a</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 4</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">cond </span><span class="p">((</span><span class="nb">= </span><span class="nv">a</span> <span class="mi">4</span><span class="p">)</span> <span class="mi">6</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">((</span><span class="nb">= </span><span class="nv">b</span> <span class="mi">4</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="mi">6</span> <span class="mi">7</span> <span class="nv">a</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">else </span><span class="mi">25</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 16</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="mi">2</span> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="nv">a</span><span class="p">)</span> <span class="nv">b</span> <span class="nv">a</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 6</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">* </span><span class="p">(</span><span class="k">cond </span><span class="p">((</span><span class="nb">&gt; </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> <span class="nv">a</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">((</span><span class="nb">&lt; </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">else </span><span class="mi">-1</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="mi">1</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 16</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>练习1.1的内容比较简单,基本上直接就可以计算出表达式的值,所有表达式都可以在mit-scheme的交互解释器里进行验证。</p>SICP 课后练习题1.2https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.2/Mon, 15 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.2/<h4 id="练习12----请将下面表达式变换为前缀形式">练习1.2 请将下面表达式变换为前缀形式:</h4> +<p>$$ \frac{5+4+\Bigl(2-\Bigl(3-\left(6+\frac{4}{5}\right)\Bigr)\Bigr)}{3\left(6-2\right)\left(2-7\right)} $$</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"><span class="p">(</span><span class="nb">/ </span><span class="p">(</span><span class="nb">+ </span><span class="mi">5</span> +</span></span><span class="line"><span class="cl"><span class="mi">4</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">2</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">3</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="mi">6</span> <span class="p">(</span><span class="nb">/ </span><span class="mi">4</span> <span class="mi">5</span><span class="p">)))))</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">* </span><span class="mi">3</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">6</span> <span class="mi">2</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">2</span> <span class="mi">7</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: -37/150</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>练习1.2,直接将数学表达式转换为前序表达式即可,在写的时候可以遵循一下排版规则,即同一个运算符的表达式垂直对齐。</p>SICP 课后练习题1.3https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.3/Mon, 15 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.3/<h4 id="练习13----请定义一个过程它以三个数为参数返回其中较大两个数之和">练习1.3 请定义一个过程,它以三个数为参数,返回其中较大两个数之和。</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span><span class="lnt">8 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">max-three-number</span> <span class="nv">a</span> <span class="nv">b</span> <span class="nv">c</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="nv">c</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="nv">c</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">a</span> <span class="nv">c</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">b</span> <span class="nv">a</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">b</span> <span class="nv">c</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">max-three-number</span> <span class="mi">42</span> <span class="mi">7</span> <span class="mi">1</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 49</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>练习1.3,解决此练习中问题的方法比较多,本答案使用比较朴素的方法,先比较出最大的两个数字,然后将其相加,对于三个数字来说,先在前两个中选取一个大的,然后将其与后面两个中比较大的那一个相加。还有一种思路就是可以先定义出比较大小的方法,然后再调用之,或者先对数字按从小到大排序然后加最后两个,等等。</p> \ No newline at end of file diff --git a/tags/exercise/page/1/index.html b/tags/exercise/page/1/index.html new file mode 100644 index 000000000..898174f07 --- /dev/null +++ b/tags/exercise/page/1/index.html @@ -0,0 +1 @@ +https://sbabybird.github.io/tags/exercise/ \ No newline at end of file diff --git a/tags/exercise/page/2/index.html b/tags/exercise/page/2/index.html new file mode 100644 index 000000000..7759de430 --- /dev/null +++ b/tags/exercise/page/2/index.html @@ -0,0 +1,32 @@ +Tag: exercise - Learning & Writing!

Tags

exercise

+ \ No newline at end of file diff --git a/tags/github/index.html b/tags/github/index.html new file mode 100644 index 000000000..dd8faf359 --- /dev/null +++ b/tags/github/index.html @@ -0,0 +1,31 @@ +Tag: github - Learning & Writing!

Tags

github

+ \ No newline at end of file diff --git a/tags/github/index.xml b/tags/github/index.xml new file mode 100644 index 000000000..4d1ee2e33 --- /dev/null +++ b/tags/github/index.xml @@ -0,0 +1,218 @@ +github on Learning & Writing!https://sbabybird.github.io/tags/github/Recent content in github on Learning & Writing!Hugo -- gohugo.iozh-cnThu, 21 Sep 2023 00:00:00 +0000基于 Github Pages 服务搭建个人博客https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/Thu, 21 Sep 2023 00:00:00 +0000https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-21-16-10-50.png" alt="Featured image of post 基于 Github Pages 服务搭建个人博客" /><h2 id="背景">背景</h2> +<p>搭建独立博客网站的方法多种多样,常见的方法包括租用服务器自行架设,或者选择托管服务商提供的博客发布服务。</p> +<p>但是上述两种方式都会产生一定的费用,对于非盈利网站而言,不太友好。</p> +<p>经过多年的实践,现在已有越来越多的人选择了使用免费且易用的<a class="link" href="https://docs.github.com/zh/pages/getting-started-with-github-pages/about-github-pages" target="_blank" rel="noopener" +> GitHub Pages </a>服务来搭建个人博客。</p> +<p>然而,现有的使用教程大多侧重于操作步骤,对于新手或非专业人士而言,难以真正理解其中原理。</p> +<p>他们可能看到别人的博客既漂亮又实用,却在自己尝试搭建时屡屡遇到挫折,逐渐失去信心。</p> +<p>这无疑会打击那些希望通过博客持续创作文字、并且希望能够免费建立个性化站点的人的积极性。</p> +<p>本文将介绍如何使用 GitHub Pages 服务搭建免费的个人博客网站,及其背后的实现原理,以帮助初学者顺利建立自己理想的博客站点。</p> +<h3 id="需要预先掌握的技能和前置条件">需要预先掌握的技能和前置条件</h3> +<p><em>需要先了解这些再往下阅读本文</em></p> +<ul> +<li>了解 Git 的概念和常用的操作,知道“分支”、“提交”、“推送”、“拉取”等概念。</li> +<li>拥有 Github 账号,并且能够独立完成“仓库创建”、“本地克隆”、“提交”、“推送”等操作。</li> +<li>了解“博客”本身只是一种“网站”:其内容由若干“网页”组成,读者通过浏览器访问博客网站所在的服务器以获取这些网页内容。</li> +</ul> +<h2 id="核心思路">核心思路</h2> +<p><img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-21-16-20-10.png" +width="790" +height="258" +loading="lazy" +class="gallery-image" +data-flex-grow="306" +data-flex-basis="734px" +> +简单来说,核心步骤只有三步:内容编辑、页面生成、网站发布。接下来的介绍均围绕这三件事展开。</p> +<h3 id="内容编辑">内容编辑</h3> +<p>作者编写和编辑博客内容,包括编写文章、给文章配图、给文章归类等等活动都属于内容编辑。</p> +<h3 id="页面生成">页面生成</h3> +<p>如果希望将内容变成可发布的网站,则需要使用专用的软件工具(一般为<a class="link" href="https://baike.baidu.com/item/%E9%9D%99%E6%80%81%E7%BD%91%E7%AB%99/2776875" target="_blank" rel="noopener" +>静态网站</a>生成器)将编辑的内容自动生成可供浏览器显示的博客网站页面。</p> +<h3 id="网站发布">网站发布</h3> +<p>有了网站页面,还只是一堆存放在本地的文件。若要放到互联网上进行访问,还需要一个服务器提供服务,将网站发布。</p> +<p>如果采用独立建站的方式,这一步骤会涉及大量技术工作,比如服务器采购、Web服务应用程序安装、域名映射、SSL 安全证书、网络防火墙配置等等。</p> +<p>但我们今天选择使用 Github 提供的 Pages 服务,这将大大降低上述操作的难度,很多技术细节将不必再多关注,已经由 Pages 服务默认配置好。我们只需享用配置好的环境即可。</p> +<h3 id="技术路线">技术路线</h3> +<h4 id="github-pages">Github Pages</h4> +<p>Github 本来是一个 Git 仓库托管服务商,帮助用户进行项目代码及数字资料的版本管理。不过随着用户规模提升,Github 也围绕版本管理提供了更多的辅助服务,这其中就包括 <a class="link" href="https://docs.github.com/zh/pages/getting-started-with-github-pages/about-github-pages" target="_blank" rel="noopener" +>Pages 服务</a>。</p> +<blockquote> +<p>GitHub Pages 是一项静态站点托管服务,它直接从 GitHub 上的仓库获取 HTML、CSS 和 JavaScript 文件,(可选)通过构建过程运行文件,然后发布网站。 可以在 GitHub Pages 示例集合中看到 GitHub Pages 站点的示例。</p> +</blockquote> +<p>Pages 服务原本用于帮助托管在 Github 上的开源项目更便捷地发布自己的宣传页面。开发团队可以简单编写几个静态页面(HTML)然后放在托管的 Git 仓库中,由 Github 将这些页面以网站服务的方式发布出去,Github 既提供了服务器资源也提供了用于公网访问的<strong>专属 URL</strong> 地址。</p> +<p>关于发布网站的<strong>专属 URL</strong> 地址的提供规则,Github 官方的介绍如下:</p> +<blockquote> +<p>若要发布<strong>用户站点</strong>,必须创建名为 <code>&lt;username&gt;.github.io</code> 的个人帐户拥有的存储库。 若要发布<strong>组织站点</strong>,必须创建名为 <code>&lt;organization&gt;.github.io</code> 的组织帐户拥有的存储库。 除非使用的是自定义域,否则用户和组织站点在 <code>http(s)://&lt;username&gt;.github.io</code> 或 <code>http(s)://&lt;organization&gt;.github.io</code> 中可用。 +<strong>项目站点</strong>的源文件与其项目存储在同一个仓库中。 除非使用的是自定义域,否则项目站点在 <code>http(s)://&lt;username&gt;.github.io/&lt;repository&gt;</code> 或 <code>http(s)://&lt;organization&gt;.github.io/&lt;repository&gt;</code> 中可用。</p> +</blockquote> +<p>根据官方介绍,Pages 提供有三种不同的网站发布服务:用户站点、组织站点、项目站点。</p> +<p>分别对应了“制作个人网站”、“制作团队组织网站”、“制作单个项目网站”的不同需求。</p> +<p>针对个人博客的搭建,很显然使用 Pages 服务发布“用户站点”是最合适的选择。</p> +<p>对于“用户站点”,Pages 最终会为用户提供的专属 URL 地址为:<code>https://你的用户名.github.io</code>,也就是说在 Gihtub 的一级域名 <code>https://github.io</code> 下给你免费提供了一个二级域名。之所以默认使用你的 Github 用户名,是因为要防止不同用户发布的地址重名导致冲突。</p> +<p><em>按照官方介绍,你也可以使用自己购买的域名,通过自己的域名进行访问。不过这涉及到更复杂的话题和操作,不在本文讨论范畴。</em></p> +<p>了解了以上基本信息后,在使用 Pages 服务时,可按照复杂度区分,采用如下几种不同的用法。</p> +<h5 id="最简单直接的使用流程">最简单直接的使用流程</h5> +<ol> +<li>手工编写 HTML 页面文件(需要掌握网页制作知识)。</li> +<li>将页面文件推送到的 Github 仓库,对于“用户站点”来说,这个仓库的命名必须为“<code>你的用户名.github.io</code>”。</li> +<li>在 Github 中设置该仓库的 Pages 服务配置,主要是选择仓库的指定“分支”用于 Pages 服务获取待发布的网页文件。</li> +<li>Github 会按照上面介绍的规则给你提供一个 URL 访问地址(<code>https://你的用户名.github.io</code>),使用浏览器打开该地址即可访问到发布的网站了。</li> +</ol> +<p><em>注:如果不理解 Git 仓库的“分支”概念,可以把它视为同一个仓库里不同的存储位置,不同的“分支”里面存储了不同的文件内容。</em></p> +<p>这个流程仅适用于非常简单网站发布,比如只包含有一个页面,因为手工编写 HTML 页面的效率十分低下,且不利于持续更新维护。</p> +<p>于是大家常用的方式是,使用一种叫做的东西,对于“博客”这类以静态页面为主的网站,十分适合。</p> +<p>“静态站点生成器”可以理解为是一个“翻译”,它能自动将你编写的文本内容根据预先的配置信息,自动生成一个完整的网站所需的全部文件(HTML、JS、CSS等)。</p> +<p>于是有了如下的改进流程:</p> +<h5 id="改进的使用流程">改进的使用流程</h5> +<ol> +<li>用户编辑好博客内容,形成保存在本地计算机的原始文档文件。</li> +<li>使用静态网站生成器将本地原始文档文件生成静态页面文件。</li> +<li>将静态页面文件推送到 Github 远端托管仓库。</li> +<li>Github Pages 服务自动被触发,将静态页面以网站形式发布出来。</li> +<li>用户通过指定 URL 地址访问已发布的博客内容。</li> +</ol> +<p>到目前为止,已经可以较为流畅地执行博客编辑、生成、发布的工作流程了。</p> +<p>但是这个流程里有个前置条件,作者必须在本地电脑上安装一个“静态站点生成器”,以用于输出转换后的、可供发布的页面。</p> +<p>所以,为了方便,Github 提供了一个默认的静态网站生成器,上述第 2 步操作实际上可以在远端仓库自动执行,这样用户只需将原始文件上传至远端仓库即可,由 Github 直接在线上完成静态页面的生成和网站发布工作。</p> +<p><img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-21-16-46-36.png" +width="937" +height="625" +loading="lazy" +class="gallery-image" +data-flex-grow="149" +data-flex-basis="359px" +></p> +<h5 id="静态站点生成器的选择">静态站点生成器的选择</h5> +<p>比较常见的静态站点生成器有:<a class="link" href="https://jekyllrb.com/" target="_blank" rel="noopener" +>Jekyll</a>、<a class="link" href="https://hexo.io/index.html" target="_blank" rel="noopener" +>Hexo</a>、<a class="link" href="https://gohugo.io/" target="_blank" rel="noopener" +>Hugo</a> 这三个。不在这里详细介绍了,因为功能都大同小异。在选定一个之后,需要去他们的官网查看文档以了解具体的使用细节,以便对自己的博客站点能够做到更深的定制。</p> +<p>我在接下来的操作步骤里,选择使用 Hugo 这个生成器。</p> +<p>主要原因是,Hugo 提供有相对来说比较美观的<a class="link" href="https://themes.gohugo.io/" target="_blank" rel="noopener" +>免费主题风格模板</a>(Jekyll 也有漂亮的,但是收费。Hexo 的定制性很强,适合有网页开发能力的人自己开发主题)。</p> +<p>我选择的主题模板是:<a class="link" href="https://themes.gohugo.io/themes/hugo-theme-stack/" target="_blank" rel="noopener" +>hugo-theme-stack</a>。</p> +<p><img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-10-40-58.png" +width="900" +height="300" +loading="lazy" +class="gallery-image" +data-flex-grow="300" +data-flex-basis="720px" +></p> +<h2 id="操作步骤">操作步骤</h2> +<h3 id="建立-github-仓库">建立 Github 仓库</h3> +<ol> +<li>点击这个超链接进入 <a class="link" href="https://github.com/CaiJimmy/hugo-theme-stack-starter" target="_blank" rel="noopener" +>hugo-theme-stack-starter 的 Git 仓库模板</a>。</li> +<li>点击页面中的“使用此模板”按钮,以创建你自己的仓库(注意:需先登录自己的账号才能创建)。 +<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-10-45-54.png" +width="925" +height="134" +loading="lazy" +class="gallery-image" +data-flex-grow="690" +data-flex-basis="1656px" +></li> +<li>建立好仓库(注意仓库命名为<code>你的用户名.github.io</code>)之后,会自动带有仓库模板的初始文件。 +<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-10-47-57.png" +width="908" +height="528" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="412px" +></li> +</ol> +<h3 id="修改配置">修改配置</h3> +<ol> +<li>将仓库下载到本地。</li> +<li>打开仓库里的 config 文件夹,里面存放有配置信息。</li> +<li>按照 <a class="link" href="https://stack.jimmycai.com/guide/getting-started" target="_blank" rel="noopener" +>hugo-theme-stack 的官方文档</a>配置自己想要的效果(默认一般都够用,重点是修改自己的站点信息,如显示名称、URL 链接地址等等)。 +<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-10-53-02.png" +width="1466" +height="682" +loading="lazy" +class="gallery-image" +data-flex-grow="214" +data-flex-basis="515px" +> +<em>这些配置主要在 <code>config.toml</code> 和 <code>params.toml</code> 两个文件里。</em></li> +</ol> +<h3 id="编写博客文章">编写博客文章</h3> +<p>生成器会默认去仓库的 <code>content/post/</code> 文件夹下扫描其下面的所有文件夹和文件,遇到约定格式的 <code>Markdown</code> 文件就会转换成为可发布的 <code>html</code> 页面。具体约定可以查看官方的详细文档,这里介绍一种最简单的写一篇文章的过程。</p> +<ol> +<li>在 post 目录下新建一个文件夹用于存放文章的 Markdown 文件和插图文件,文件夹命名为希望编写的标题如:<code>2023-09-21-怎样搭建个人博客</code>。<em>我个人习惯将不同年份的文章在post目录下再建一级目录按照日期或年份进行区分。</em></li> +<li>在刚建立的文件夹下新建名称为<code>index.md</code>的 Markdown 文件,文件名必须为 index.md 这是由 hugo 生成器约定的。</li> +<li>在刚建立的 Markdown 文件的头部添加必要的元信息(非常关键)。 +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span><span class="lnt">8 +</span><span class="lnt">9 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w"> </span>---<span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="l">文章标题</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">date</span><span class="p">:</span><span class="w"> </span><span class="ld">2023-09-21</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">categories</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">文章所属分类</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tags</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">文章标签 1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">文章标签 2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>---<span class="w"> +</span></span></span></code></pre></td></tr></table> +</div> +</div><img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-11-07-46.png" +width="787" +height="357" +loading="lazy" +class="gallery-image" +data-flex-grow="220" +data-flex-basis="529px" +></li> +<li>编写文章内容。可以使用 <a class="link" href="https://markdown.com.cn/basic-syntax/" target="_blank" rel="noopener" +>Markdown 的语法</a>随意定义格式,以及插入图片。插入的图片建议保存在同级目录(也就是刚才新建的那个)中。</li> +</ol> +<h3 id="推送到仓库及发布">推送到仓库及发布</h3> +<ol> +<li>将刚才修改配置文件保存。</li> +<li>将刚才编写的博客文章保存。</li> +<li>在本地提交 commit 并 push 到 Github 仓库。</li> +<li>稍等几分钟(给 Github 那端的 Hugo 生成器留出运行时间)。</li> +<li>在 Github 仓库的 “setting” 设置页面开启 Pages 服务(只需第一次)。</li> +<li>在 Pages 设置界面里的 Source 中选择 “Deploy from a branch” ,并在下面的分支选择下拉框中选择 “gh-pages”,保存。 +<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-11-17-49.png" +width="1090" +height="568" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="460px" +></li> +</ol> +<h3 id="访问你的博客站点">访问你的博客站点</h3> +<p>一般稍等几分钟之后,即可按照约定网址访问刚发布的内容了。 +<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-11-31-26.png" +width="1539" +height="661" +loading="lazy" +class="gallery-image" +data-flex-grow="232" +data-flex-basis="558px" +></p> +<h2 id="扩展阅读">扩展阅读</h2> +<p>运营自己的博客网站所需了解的概念和知识相对比较多,如果希望将自己的网站做的更加精美、有特色。</p> +<p>除了能够持续产出高质量内容之外,建议阅读以下文章以了解相关知识:</p> +<ul> +<li><a class="link" href="https://developer.mozilla.org/zh-CN/docs/Learn/Getting_started_with_the_web" target="_blank" rel="noopener" +>学习 web 开发</a>。</li> +</ul> \ No newline at end of file diff --git a/tags/github/page/1/index.html b/tags/github/page/1/index.html new file mode 100644 index 000000000..5e51a166d --- /dev/null +++ b/tags/github/page/1/index.html @@ -0,0 +1 @@ +https://sbabybird.github.io/tags/github/ \ No newline at end of file diff --git a/tags/hello/index.html b/tags/hello/index.html new file mode 100644 index 000000000..bd1fc9e01 --- /dev/null +++ b/tags/hello/index.html @@ -0,0 +1,31 @@ +Tag: hello - Learning & Writing!

Tags

hello

+ \ No newline at end of file diff --git a/tags/hello/index.xml b/tags/hello/index.xml new file mode 100644 index 000000000..203c1eb11 --- /dev/null +++ b/tags/hello/index.xml @@ -0,0 +1,2 @@ +hello on Learning & Writing!https://sbabybird.github.io/tags/hello/Recent content in hello on Learning & Writing!Hugo -- gohugo.iozh-cnMon, 29 Apr 2013 00:00:00 +0000Hello World!https://sbabybird.github.io/p/hello-world/Mon, 29 Apr 2013 00:00:00 +0000https://sbabybird.github.io/p/hello-world/<h2 id="hello">Hello</h2> +<h2 id="world">World</h2> \ No newline at end of file diff --git a/tags/hello/page/1/index.html b/tags/hello/page/1/index.html new file mode 100644 index 000000000..34fb2d96b --- /dev/null +++ b/tags/hello/page/1/index.html @@ -0,0 +1 @@ +https://sbabybird.github.io/tags/hello/ \ No newline at end of file diff --git a/tags/howto/index.html b/tags/howto/index.html new file mode 100644 index 000000000..57a4b0a52 --- /dev/null +++ b/tags/howto/index.html @@ -0,0 +1,31 @@ +Tag: howto - Learning & Writing!

Tags

howto

+ \ No newline at end of file diff --git a/tags/howto/index.xml b/tags/howto/index.xml new file mode 100644 index 000000000..795e52ecb --- /dev/null +++ b/tags/howto/index.xml @@ -0,0 +1,218 @@ +howto on Learning & Writing!https://sbabybird.github.io/tags/howto/Recent content in howto on Learning & Writing!Hugo -- gohugo.iozh-cnThu, 21 Sep 2023 00:00:00 +0000基于 Github Pages 服务搭建个人博客https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/Thu, 21 Sep 2023 00:00:00 +0000https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-21-16-10-50.png" alt="Featured image of post 基于 Github Pages 服务搭建个人博客" /><h2 id="背景">背景</h2> +<p>搭建独立博客网站的方法多种多样,常见的方法包括租用服务器自行架设,或者选择托管服务商提供的博客发布服务。</p> +<p>但是上述两种方式都会产生一定的费用,对于非盈利网站而言,不太友好。</p> +<p>经过多年的实践,现在已有越来越多的人选择了使用免费且易用的<a class="link" href="https://docs.github.com/zh/pages/getting-started-with-github-pages/about-github-pages" target="_blank" rel="noopener" +> GitHub Pages </a>服务来搭建个人博客。</p> +<p>然而,现有的使用教程大多侧重于操作步骤,对于新手或非专业人士而言,难以真正理解其中原理。</p> +<p>他们可能看到别人的博客既漂亮又实用,却在自己尝试搭建时屡屡遇到挫折,逐渐失去信心。</p> +<p>这无疑会打击那些希望通过博客持续创作文字、并且希望能够免费建立个性化站点的人的积极性。</p> +<p>本文将介绍如何使用 GitHub Pages 服务搭建免费的个人博客网站,及其背后的实现原理,以帮助初学者顺利建立自己理想的博客站点。</p> +<h3 id="需要预先掌握的技能和前置条件">需要预先掌握的技能和前置条件</h3> +<p><em>需要先了解这些再往下阅读本文</em></p> +<ul> +<li>了解 Git 的概念和常用的操作,知道“分支”、“提交”、“推送”、“拉取”等概念。</li> +<li>拥有 Github 账号,并且能够独立完成“仓库创建”、“本地克隆”、“提交”、“推送”等操作。</li> +<li>了解“博客”本身只是一种“网站”:其内容由若干“网页”组成,读者通过浏览器访问博客网站所在的服务器以获取这些网页内容。</li> +</ul> +<h2 id="核心思路">核心思路</h2> +<p><img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-21-16-20-10.png" +width="790" +height="258" +loading="lazy" +class="gallery-image" +data-flex-grow="306" +data-flex-basis="734px" +> +简单来说,核心步骤只有三步:内容编辑、页面生成、网站发布。接下来的介绍均围绕这三件事展开。</p> +<h3 id="内容编辑">内容编辑</h3> +<p>作者编写和编辑博客内容,包括编写文章、给文章配图、给文章归类等等活动都属于内容编辑。</p> +<h3 id="页面生成">页面生成</h3> +<p>如果希望将内容变成可发布的网站,则需要使用专用的软件工具(一般为<a class="link" href="https://baike.baidu.com/item/%E9%9D%99%E6%80%81%E7%BD%91%E7%AB%99/2776875" target="_blank" rel="noopener" +>静态网站</a>生成器)将编辑的内容自动生成可供浏览器显示的博客网站页面。</p> +<h3 id="网站发布">网站发布</h3> +<p>有了网站页面,还只是一堆存放在本地的文件。若要放到互联网上进行访问,还需要一个服务器提供服务,将网站发布。</p> +<p>如果采用独立建站的方式,这一步骤会涉及大量技术工作,比如服务器采购、Web服务应用程序安装、域名映射、SSL 安全证书、网络防火墙配置等等。</p> +<p>但我们今天选择使用 Github 提供的 Pages 服务,这将大大降低上述操作的难度,很多技术细节将不必再多关注,已经由 Pages 服务默认配置好。我们只需享用配置好的环境即可。</p> +<h3 id="技术路线">技术路线</h3> +<h4 id="github-pages">Github Pages</h4> +<p>Github 本来是一个 Git 仓库托管服务商,帮助用户进行项目代码及数字资料的版本管理。不过随着用户规模提升,Github 也围绕版本管理提供了更多的辅助服务,这其中就包括 <a class="link" href="https://docs.github.com/zh/pages/getting-started-with-github-pages/about-github-pages" target="_blank" rel="noopener" +>Pages 服务</a>。</p> +<blockquote> +<p>GitHub Pages 是一项静态站点托管服务,它直接从 GitHub 上的仓库获取 HTML、CSS 和 JavaScript 文件,(可选)通过构建过程运行文件,然后发布网站。 可以在 GitHub Pages 示例集合中看到 GitHub Pages 站点的示例。</p> +</blockquote> +<p>Pages 服务原本用于帮助托管在 Github 上的开源项目更便捷地发布自己的宣传页面。开发团队可以简单编写几个静态页面(HTML)然后放在托管的 Git 仓库中,由 Github 将这些页面以网站服务的方式发布出去,Github 既提供了服务器资源也提供了用于公网访问的<strong>专属 URL</strong> 地址。</p> +<p>关于发布网站的<strong>专属 URL</strong> 地址的提供规则,Github 官方的介绍如下:</p> +<blockquote> +<p>若要发布<strong>用户站点</strong>,必须创建名为 <code>&lt;username&gt;.github.io</code> 的个人帐户拥有的存储库。 若要发布<strong>组织站点</strong>,必须创建名为 <code>&lt;organization&gt;.github.io</code> 的组织帐户拥有的存储库。 除非使用的是自定义域,否则用户和组织站点在 <code>http(s)://&lt;username&gt;.github.io</code> 或 <code>http(s)://&lt;organization&gt;.github.io</code> 中可用。 +<strong>项目站点</strong>的源文件与其项目存储在同一个仓库中。 除非使用的是自定义域,否则项目站点在 <code>http(s)://&lt;username&gt;.github.io/&lt;repository&gt;</code> 或 <code>http(s)://&lt;organization&gt;.github.io/&lt;repository&gt;</code> 中可用。</p> +</blockquote> +<p>根据官方介绍,Pages 提供有三种不同的网站发布服务:用户站点、组织站点、项目站点。</p> +<p>分别对应了“制作个人网站”、“制作团队组织网站”、“制作单个项目网站”的不同需求。</p> +<p>针对个人博客的搭建,很显然使用 Pages 服务发布“用户站点”是最合适的选择。</p> +<p>对于“用户站点”,Pages 最终会为用户提供的专属 URL 地址为:<code>https://你的用户名.github.io</code>,也就是说在 Gihtub 的一级域名 <code>https://github.io</code> 下给你免费提供了一个二级域名。之所以默认使用你的 Github 用户名,是因为要防止不同用户发布的地址重名导致冲突。</p> +<p><em>按照官方介绍,你也可以使用自己购买的域名,通过自己的域名进行访问。不过这涉及到更复杂的话题和操作,不在本文讨论范畴。</em></p> +<p>了解了以上基本信息后,在使用 Pages 服务时,可按照复杂度区分,采用如下几种不同的用法。</p> +<h5 id="最简单直接的使用流程">最简单直接的使用流程</h5> +<ol> +<li>手工编写 HTML 页面文件(需要掌握网页制作知识)。</li> +<li>将页面文件推送到的 Github 仓库,对于“用户站点”来说,这个仓库的命名必须为“<code>你的用户名.github.io</code>”。</li> +<li>在 Github 中设置该仓库的 Pages 服务配置,主要是选择仓库的指定“分支”用于 Pages 服务获取待发布的网页文件。</li> +<li>Github 会按照上面介绍的规则给你提供一个 URL 访问地址(<code>https://你的用户名.github.io</code>),使用浏览器打开该地址即可访问到发布的网站了。</li> +</ol> +<p><em>注:如果不理解 Git 仓库的“分支”概念,可以把它视为同一个仓库里不同的存储位置,不同的“分支”里面存储了不同的文件内容。</em></p> +<p>这个流程仅适用于非常简单网站发布,比如只包含有一个页面,因为手工编写 HTML 页面的效率十分低下,且不利于持续更新维护。</p> +<p>于是大家常用的方式是,使用一种叫做的东西,对于“博客”这类以静态页面为主的网站,十分适合。</p> +<p>“静态站点生成器”可以理解为是一个“翻译”,它能自动将你编写的文本内容根据预先的配置信息,自动生成一个完整的网站所需的全部文件(HTML、JS、CSS等)。</p> +<p>于是有了如下的改进流程:</p> +<h5 id="改进的使用流程">改进的使用流程</h5> +<ol> +<li>用户编辑好博客内容,形成保存在本地计算机的原始文档文件。</li> +<li>使用静态网站生成器将本地原始文档文件生成静态页面文件。</li> +<li>将静态页面文件推送到 Github 远端托管仓库。</li> +<li>Github Pages 服务自动被触发,将静态页面以网站形式发布出来。</li> +<li>用户通过指定 URL 地址访问已发布的博客内容。</li> +</ol> +<p>到目前为止,已经可以较为流畅地执行博客编辑、生成、发布的工作流程了。</p> +<p>但是这个流程里有个前置条件,作者必须在本地电脑上安装一个“静态站点生成器”,以用于输出转换后的、可供发布的页面。</p> +<p>所以,为了方便,Github 提供了一个默认的静态网站生成器,上述第 2 步操作实际上可以在远端仓库自动执行,这样用户只需将原始文件上传至远端仓库即可,由 Github 直接在线上完成静态页面的生成和网站发布工作。</p> +<p><img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-21-16-46-36.png" +width="937" +height="625" +loading="lazy" +class="gallery-image" +data-flex-grow="149" +data-flex-basis="359px" +></p> +<h5 id="静态站点生成器的选择">静态站点生成器的选择</h5> +<p>比较常见的静态站点生成器有:<a class="link" href="https://jekyllrb.com/" target="_blank" rel="noopener" +>Jekyll</a>、<a class="link" href="https://hexo.io/index.html" target="_blank" rel="noopener" +>Hexo</a>、<a class="link" href="https://gohugo.io/" target="_blank" rel="noopener" +>Hugo</a> 这三个。不在这里详细介绍了,因为功能都大同小异。在选定一个之后,需要去他们的官网查看文档以了解具体的使用细节,以便对自己的博客站点能够做到更深的定制。</p> +<p>我在接下来的操作步骤里,选择使用 Hugo 这个生成器。</p> +<p>主要原因是,Hugo 提供有相对来说比较美观的<a class="link" href="https://themes.gohugo.io/" target="_blank" rel="noopener" +>免费主题风格模板</a>(Jekyll 也有漂亮的,但是收费。Hexo 的定制性很强,适合有网页开发能力的人自己开发主题)。</p> +<p>我选择的主题模板是:<a class="link" href="https://themes.gohugo.io/themes/hugo-theme-stack/" target="_blank" rel="noopener" +>hugo-theme-stack</a>。</p> +<p><img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-10-40-58.png" +width="900" +height="300" +loading="lazy" +class="gallery-image" +data-flex-grow="300" +data-flex-basis="720px" +></p> +<h2 id="操作步骤">操作步骤</h2> +<h3 id="建立-github-仓库">建立 Github 仓库</h3> +<ol> +<li>点击这个超链接进入 <a class="link" href="https://github.com/CaiJimmy/hugo-theme-stack-starter" target="_blank" rel="noopener" +>hugo-theme-stack-starter 的 Git 仓库模板</a>。</li> +<li>点击页面中的“使用此模板”按钮,以创建你自己的仓库(注意:需先登录自己的账号才能创建)。 +<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-10-45-54.png" +width="925" +height="134" +loading="lazy" +class="gallery-image" +data-flex-grow="690" +data-flex-basis="1656px" +></li> +<li>建立好仓库(注意仓库命名为<code>你的用户名.github.io</code>)之后,会自动带有仓库模板的初始文件。 +<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-10-47-57.png" +width="908" +height="528" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="412px" +></li> +</ol> +<h3 id="修改配置">修改配置</h3> +<ol> +<li>将仓库下载到本地。</li> +<li>打开仓库里的 config 文件夹,里面存放有配置信息。</li> +<li>按照 <a class="link" href="https://stack.jimmycai.com/guide/getting-started" target="_blank" rel="noopener" +>hugo-theme-stack 的官方文档</a>配置自己想要的效果(默认一般都够用,重点是修改自己的站点信息,如显示名称、URL 链接地址等等)。 +<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-10-53-02.png" +width="1466" +height="682" +loading="lazy" +class="gallery-image" +data-flex-grow="214" +data-flex-basis="515px" +> +<em>这些配置主要在 <code>config.toml</code> 和 <code>params.toml</code> 两个文件里。</em></li> +</ol> +<h3 id="编写博客文章">编写博客文章</h3> +<p>生成器会默认去仓库的 <code>content/post/</code> 文件夹下扫描其下面的所有文件夹和文件,遇到约定格式的 <code>Markdown</code> 文件就会转换成为可发布的 <code>html</code> 页面。具体约定可以查看官方的详细文档,这里介绍一种最简单的写一篇文章的过程。</p> +<ol> +<li>在 post 目录下新建一个文件夹用于存放文章的 Markdown 文件和插图文件,文件夹命名为希望编写的标题如:<code>2023-09-21-怎样搭建个人博客</code>。<em>我个人习惯将不同年份的文章在post目录下再建一级目录按照日期或年份进行区分。</em></li> +<li>在刚建立的文件夹下新建名称为<code>index.md</code>的 Markdown 文件,文件名必须为 index.md 这是由 hugo 生成器约定的。</li> +<li>在刚建立的 Markdown 文件的头部添加必要的元信息(非常关键)。 +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span><span class="lnt">8 +</span><span class="lnt">9 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w"> </span>---<span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="l">文章标题</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">date</span><span class="p">:</span><span class="w"> </span><span class="ld">2023-09-21</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">categories</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">文章所属分类</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tags</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">文章标签 1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">文章标签 2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>---<span class="w"> +</span></span></span></code></pre></td></tr></table> +</div> +</div><img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-11-07-46.png" +width="787" +height="357" +loading="lazy" +class="gallery-image" +data-flex-grow="220" +data-flex-basis="529px" +></li> +<li>编写文章内容。可以使用 <a class="link" href="https://markdown.com.cn/basic-syntax/" target="_blank" rel="noopener" +>Markdown 的语法</a>随意定义格式,以及插入图片。插入的图片建议保存在同级目录(也就是刚才新建的那个)中。</li> +</ol> +<h3 id="推送到仓库及发布">推送到仓库及发布</h3> +<ol> +<li>将刚才修改配置文件保存。</li> +<li>将刚才编写的博客文章保存。</li> +<li>在本地提交 commit 并 push 到 Github 仓库。</li> +<li>稍等几分钟(给 Github 那端的 Hugo 生成器留出运行时间)。</li> +<li>在 Github 仓库的 “setting” 设置页面开启 Pages 服务(只需第一次)。</li> +<li>在 Pages 设置界面里的 Source 中选择 “Deploy from a branch” ,并在下面的分支选择下拉框中选择 “gh-pages”,保存。 +<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-11-17-49.png" +width="1090" +height="568" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="460px" +></li> +</ol> +<h3 id="访问你的博客站点">访问你的博客站点</h3> +<p>一般稍等几分钟之后,即可按照约定网址访问刚发布的内容了。 +<img src="https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8E-github-pages-%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/2023-09-22-11-31-26.png" +width="1539" +height="661" +loading="lazy" +class="gallery-image" +data-flex-grow="232" +data-flex-basis="558px" +></p> +<h2 id="扩展阅读">扩展阅读</h2> +<p>运营自己的博客网站所需了解的概念和知识相对比较多,如果希望将自己的网站做的更加精美、有特色。</p> +<p>除了能够持续产出高质量内容之外,建议阅读以下文章以了解相关知识:</p> +<ul> +<li><a class="link" href="https://developer.mozilla.org/zh-CN/docs/Learn/Getting_started_with_the_web" target="_blank" rel="noopener" +>学习 web 开发</a>。</li> +</ul> \ No newline at end of file diff --git a/tags/howto/page/1/index.html b/tags/howto/page/1/index.html new file mode 100644 index 000000000..339c8a8b1 --- /dev/null +++ b/tags/howto/page/1/index.html @@ -0,0 +1 @@ +https://sbabybird.github.io/tags/howto/ \ No newline at end of file diff --git a/tags/index.html b/tags/index.html new file mode 100644 index 000000000..6bd5bc108 --- /dev/null +++ b/tags/index.html @@ -0,0 +1,34 @@ +Tags

Tags

+ \ No newline at end of file diff --git a/tags/index.xml b/tags/index.xml new file mode 100644 index 000000000..62a79ecb2 --- /dev/null +++ b/tags/index.xml @@ -0,0 +1 @@ +Tags on Learning & Writing!https://sbabybird.github.io/tags/Recent content in Tags on Learning & Writing!Hugo -- gohugo.iozh-cnThu, 21 Sep 2023 00:00:00 +0000githubhttps://sbabybird.github.io/tags/github/Thu, 21 Sep 2023 00:00:00 +0000https://sbabybird.github.io/tags/github/howtohttps://sbabybird.github.io/tags/howto/Thu, 21 Sep 2023 00:00:00 +0000https://sbabybird.github.io/tags/howto/机器文摘https://sbabybird.github.io/tags/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98/Tue, 19 Sep 2023 00:00:00 +0000https://sbabybird.github.io/tags/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98/知识管理https://sbabybird.github.io/tags/%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86/Sat, 23 Apr 2022 00:00:00 +0000https://sbabybird.github.io/tags/%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86/心理学https://sbabybird.github.io/tags/%E5%BF%83%E7%90%86%E5%AD%A6/Sun, 18 Apr 2021 00:00:00 +0000https://sbabybird.github.io/tags/%E5%BF%83%E7%90%86%E5%AD%A6/管理https://sbabybird.github.io/tags/%E7%AE%A1%E7%90%86/Thu, 15 Apr 2021 00:00:00 +0000https://sbabybird.github.io/tags/%E7%AE%A1%E7%90%86/年度总结https://sbabybird.github.io/tags/%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/Wed, 10 Feb 2021 00:00:00 +0000https://sbabybird.github.io/tags/%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/机器学习https://sbabybird.github.io/tags/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/Sun, 02 Jun 2019 00:00:00 +0000https://sbabybird.github.io/tags/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/家庭https://sbabybird.github.io/tags/%E5%AE%B6%E5%BA%AD/Thu, 09 May 2019 00:00:00 +0000https://sbabybird.github.io/tags/%E5%AE%B6%E5%BA%AD/心得https://sbabybird.github.io/tags/%E5%BF%83%E5%BE%97/Thu, 19 Jul 2018 00:00:00 +0000https://sbabybird.github.io/tags/%E5%BF%83%E5%BE%97/exercisehttps://sbabybird.github.io/tags/exercise/Mon, 05 Jan 2015 00:00:00 +0000https://sbabybird.github.io/tags/exercise/lisphttps://sbabybird.github.io/tags/lisp/Mon, 05 Jan 2015 00:00:00 +0000https://sbabybird.github.io/tags/lisp/programminghttps://sbabybird.github.io/tags/programming/Mon, 05 Jan 2015 00:00:00 +0000https://sbabybird.github.io/tags/programming/wifihttps://sbabybird.github.io/tags/wifi/Thu, 13 Feb 2014 00:00:00 +0000https://sbabybird.github.io/tags/wifi/win8https://sbabybird.github.io/tags/win8/Thu, 13 Feb 2014 00:00:00 +0000https://sbabybird.github.io/tags/win8/mongodbhttps://sbabybird.github.io/tags/mongodb/Thu, 07 Nov 2013 00:00:00 +0000https://sbabybird.github.io/tags/mongodb/vs2008https://sbabybird.github.io/tags/vs2008/Thu, 07 Nov 2013 00:00:00 +0000https://sbabybird.github.io/tags/vs2008/abouthttps://sbabybird.github.io/tags/about/Mon, 29 Apr 2013 00:00:00 +0000https://sbabybird.github.io/tags/about/hellohttps://sbabybird.github.io/tags/hello/Mon, 29 Apr 2013 00:00:00 +0000https://sbabybird.github.io/tags/hello/心情随笔https://sbabybird.github.io/tags/%E5%BF%83%E6%83%85%E9%9A%8F%E7%AC%94/Tue, 13 Nov 2007 00:00:00 +0000https://sbabybird.github.io/tags/%E5%BF%83%E6%83%85%E9%9A%8F%E7%AC%94/ \ No newline at end of file diff --git a/tags/lisp/index.html b/tags/lisp/index.html new file mode 100644 index 000000000..1c50b239a --- /dev/null +++ b/tags/lisp/index.html @@ -0,0 +1,32 @@ +Tag: lisp - Learning & Writing!

Tags

lisp

+ \ No newline at end of file diff --git a/tags/lisp/index.xml b/tags/lisp/index.xml new file mode 100644 index 000000000..81e0d37d9 --- /dev/null +++ b/tags/lisp/index.xml @@ -0,0 +1,576 @@ +lisp on Learning & Writing!https://sbabybird.github.io/tags/lisp/Recent content in lisp on Learning & Writing!Hugo -- gohugo.iozh-cnMon, 05 Jan 2015 00:00:00 +0000SICP 课后练习题1.9https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.9/Mon, 05 Jan 2015 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.9/<h4 id="练习-19--下面两个过程各定义了一种加起两个正整数的方法他们都基于过程inc它将参数增加1和dec它将参数减少1-请用代换模型展示这两个过程在求值add-4-5时所产生的计算过程这些计算过程是递归的或者迭代的吗">练习 1.9 下面两个过程各定义了一种加起两个正整数的方法,他们都基于过程inc(它将参数增加1)和dec(它将参数减少1) 。请用代换模型展示这两个过程在求值<code>(add 4 5)</code>时所产生的计算过程。这些计算过程是递归的或者迭代的吗?</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">add</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">= </span><span class="nv">a</span> <span class="mi">0</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">b</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="p">(</span><span class="nf">dec</span> <span class="nv">a</span><span class="p">)</span> <span class="nv">b</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">add</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">= </span><span class="nv">a</span> <span class="mi">0</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">b</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="p">(</span><span class="nf">dec</span> <span class="nv">a</span><span class="p">)</span> <span class="p">(</span><span class="nf">inc</span> <span class="nv">b</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> +</span></span></code></pre></td></tr></table> +</div> +</div><p>解答:根据代换模型分别展开如下</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span><span class="lnt">15 +</span><span class="lnt">16 +</span><span class="lnt">17 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">4</span> <span class="mi">5</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="mi">3</span> <span class="mi">5</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="mi">2</span> <span class="mi">5</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="mi">1</span> <span class="mi">5</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="mi">0</span> <span class="mi">5</span><span class="p">)))))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="mi">5</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="mi">6</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="mi">7</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="mi">8</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="mi">9</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">4</span> <span class="mi">5</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">3</span> <span class="mi">6</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">2</span> <span class="mi">7</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">1</span> <span class="mi">8</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">0</span> <span class="mi">9</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="mi">9</span><span class="p">)</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>根据展开可以看出,第一个计算过程是递归的,因为明显有一个逐步扩展然后又收缩的递归计算链条。第二个计算过程是迭代的,没有扩展、收缩的过程,而是使用a和b存储了常量。</p>SICP 课后练习题1.8https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.8/Mon, 29 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.8/<h4 id="练习-18-求立方根的牛顿法基于如下事实如果y是x的立方根的一个近似值那么下式将给出一个更好的近似值">练习 1.8 求立方根的牛顿法基于如下事实,如果y是x的立方根的一个近似值,那么下式将给出一个更好的近似值:</h4> +<p>$$ \frac{x/y^2+2y}{3} $$</p> +<p>请利用这一公式实现一个类似平方根过程的求立方根的过程。</p> +<p>解答:基本思路与求解平方根的实现是一致的,区别再有得到更好值<code>improve</code>的过程有变化,只需根据公式描述进行实现即可</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span><span class="lnt">15 +</span><span class="lnt">16 +</span><span class="lnt">17 +</span><span class="lnt">18 +</span><span class="lnt">19 +</span><span class="lnt">20 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">/</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">+ </span><span class="p">(</span><span class="nb">/ </span><span class="nv">x</span> <span class="p">(</span><span class="nb">* </span><span class="nv">guess</span> <span class="nv">guess</span><span class="p">))</span> <span class="p">(</span><span class="nb">* </span><span class="nv">guess</span> <span class="mi">2</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="mi">3</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">next</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">&lt; </span><span class="p">(</span><span class="nb">/ </span><span class="p">(</span><span class="nb">abs </span><span class="p">(</span><span class="nb">- </span><span class="nv">guess</span> <span class="nv">next</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="nv">guess</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mf">0.001</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nb">abs </span><span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&lt; </span><span class="nv">x</span> <span class="mi">0</span><span class="p">)</span> <span class="p">(</span><span class="nb">- </span><span class="nv">x</span><span class="p">)</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">cbrt-iter</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">cbrt-iter</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> <span class="nv">x</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">cbrt</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">cbrt-iter</span> <span class="mf">1.0</span> <span class="nv">x</span><span class="p">))</span> +</span></span></code></pre></td></tr></table> +</div> +</div>SICP 课后练习题1.7https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.7/Sat, 27 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.7/<h4 id="练习-17-对于确定很小的数的平方根而言在计算平方根中使用的检测good-enough是很不好的还有在现实的计算机里算术运算总是以一定的有限精度进行的这也会使我们的检测不适合非常大的数的计算请解释上述论断用例子说明对很小和很大的数这种检测都可能失败实现good-enough的另一种策略是监视猜测值在从一次迭代到下一次的变化情况当改变值相对于猜测值的比率很小时就结束请设计一个采用这种终止测试方式的平方根过程对于很大和很小的数这一方式都能工作吗">练习 1.7 对于确定很小的数的平方根而言,在计算平方根中使用的检测good-enough?是很不好的。还有,在现实的计算机里,算术运算总是以一定的有限精度进行的。这也会使我们的检测不适合非常大的数的计算。请解释上述论断,用例子说明对很小和很大的数,这种检测都可能失败。实现good-enough?的另一种策略是监视猜测值在从一次迭代到下一次的变化情况,当改变值相对于猜测值的比率很小时就结束。请设计一个采用这种终止测试方式的平方根过程。对于很大和很小的数,这一方式都能工作吗?</h4> +<p>解答:good-enough?当前采用的判断方式是,对比猜测值的平方结果与X的值之间的差距,当差距小于某个阙值时(比如0.001),就停止计算。当X很小或很大时,这种检测就会失败,比如,假设我们的阙值设置为0.001,那么当X本身小于这个阙值时,就会检测失败,得出错误结果,当X很大时,也会由于精度不足而一直达不到最佳猜测值,导致死循环。</p> +<p>因此,要解决这一问题,可以按照题目中给出的思路对good-enough?过程进行修改,不再判断猜测值平方与X的差距,而是判断两次猜测值之间的比率。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span><span class="lnt">15 +</span><span class="lnt">16 +</span><span class="lnt">17 +</span><span class="lnt">18 +</span><span class="lnt">19 +</span><span class="lnt">20 +</span><span class="lnt">21 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">next</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">&lt; </span><span class="p">(</span><span class="nb">/ </span><span class="p">(</span><span class="nb">abs </span><span class="p">(</span><span class="nb">- </span><span class="nv">guess</span> <span class="nv">next</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="nv">guess</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mf">0.001</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: good-enough?</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">sqrt-iter</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">sqrt-iter</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> <span class="nv">x</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: sqrt-iter</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="nb">sqrt </span><span class="mf">0.00000000001</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 3.1622776601874535e-6</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="nb">sqrt </span><span class="mi">100000000000000000000000000000000000000000000</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 1.0000000000001497e22</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>在新的<code>good-enough?</code>中,传入的是两次猜测值,所以还要修改<code>sqrt-iter</code>过程,在调用时计算两次猜测值。</p>SICP 课后练习题1.6https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.6/Tue, 23 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.6/<p>采用牛顿法求平方根的过程如下。开始时,我们有了被开方数的值(现在需要做的就是算出它的平方根)和一个猜测值。如果猜测值已经足够好了,有关工作也就完成了。如若不然,那么就需要改进猜测值(求出猜测值与被开方数除以猜测值的平均值),并重复这个计算过程。具体编写代码如下(在MIT scheme解释器中)。</p> +<p>定义<code>sqrt-iter</code>过程,与上述描述完全对应。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">sqrt-iter</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">guess</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">sqrt-iter</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">x</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: sqrt-iter</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义改进猜测值的过程<code>improve</code>,返回猜测值与被开方数除以猜测值的平均值。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">average</span> <span class="nv">guess</span> <span class="p">(</span><span class="nb">/ </span><span class="nv">x</span> <span class="nv">guess</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: improve</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义求平均数的过程<code>average</code>。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">average</span> <span class="nv">x</span> <span class="nv">y</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">/ </span><span class="p">(</span><span class="nb">+ </span><span class="nv">x</span> <span class="nv">y</span><span class="p">)</span> <span class="mi">2</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: average</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义判断猜测值是否足够好的过程<code>good-enough?</code>。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">&lt; </span><span class="p">(</span><span class="nb">abs </span><span class="p">(</span><span class="nb">- </span><span class="p">(</span><span class="nf">square</span> <span class="nv">guess</span><span class="p">)</span> <span class="nv">x</span><span class="p">))</span> <span class="mf">0.001</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: good-enough?</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义求绝对值和平方的过程</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span><span class="lnt">8 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nb">abs </span><span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&lt; </span><span class="nv">x</span> <span class="mi">0</span><span class="p">)</span> <span class="p">(</span><span class="nb">- </span><span class="nv">x</span><span class="p">)</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: abs</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">square</span> <span class="nv">x</span><span class="p">)</span> <span class="p">(</span><span class="nb">* </span><span class="nv">x</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: square</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义最上层的过程,用于启动整个工作(使用<code>1</code>这个数字作为任何数的初始猜测值)。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nb">sqrt </span><span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">sqrt-iter</span> <span class="mf">1.0</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: sqrt</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>执行<code>sqrt</code>过程,并以<code>9</code>为参数,求得平方根为<code>3</code></p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="nb">sqrt </span><span class="mi">9</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 3.00009155413138</span> +</span></span></code></pre></td></tr></table> +</div> +</div><h4 id="练习16----alyssa-phacker看不出来为什么需要将if提供为一种特殊形式她问为什么我不能直接通过cond将它定义为一个常规过程呢alyssa的朋友eva-lu-ator断言确实可以这样做并定义了if的一个新版本">练习1.6 Alyssa P.Hacker看不出来为什么需要将if提供为一种特殊形式,她问:“为什么我不能直接通过<code>cond</code>将它定义为一个常规过程呢?”Alyssa的朋友Eva Lu Ator断言确实可以这样做,并定义了<code>if</code>的一个新版本:</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">new-if</span> <span class="nv">predicate</span> <span class="nv">then-clause</span> <span class="nv">else-clause</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">cond </span><span class="p">(</span><span class="nf">predicate</span> <span class="nv">then-clause</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">else </span><span class="nv">else-clause</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: new-if</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>Eva给Alyssa演示她的程序:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">new-if</span> <span class="p">(</span><span class="nb">= </span><span class="mi">2</span> <span class="mi">3</span><span class="p">)</span> <span class="mi">0</span> <span class="mi">5</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mi">5</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">new-if</span> <span class="p">(</span><span class="nb">= </span><span class="mi">1</span> <span class="mi">1</span><span class="p">)</span> <span class="mi">0</span> <span class="mi">5</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mi">0</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>她很高兴地用自己的<code>new-if</code>重写了求平方根的程序:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">sqrt-iter</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">new-if</span> <span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">guess</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">sqrt-iter</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">x</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: sqrt-iter</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>当Alyssa试着用这个过程去计算平方根时会发生什么事情呢?请给出解释。</p> +<p>解答:</p> +<p>这个练习引入了一个新的思考,刚开始时,我以为是牵涉到了过程的局部参数概念,因为在新编写的<code>new-if</code>过程中,看似可以完成条件判断并返回正确的值,但是在本例中使用却存在问题,即在递归调用<code>sqrt-iter</code>时,传给该过程的<code>guess</code>和<code>x</code>为<code>new-if</code>的局部参数,被返回给了<code>new-if</code>这个过程,不会向上返回到上一层<code>sqrt-iter</code>里,这样就导致了改进的猜测值永远不会被使用,使得这个计算过程永远不会结束(除非第一个猜测值恰好合适),从而导致递归调用的陷入无限循环。我在<code>MIT-scheme</code>解释器里的执行结果是,解释器自动退出并提示我递归调用深度超出最大值。</p> +<p>上述看起来是合理的,但是后来我考虑了其他情况,及本书在前面章节里提到了if<code>(if &lt;predicate&gt; &lt;consequent&gt; &lt;alternative&gt;)</code>语句是条件表达式的受限形式,在执行时,先判断<code>predicate</code>是否为真,然后根据结果只执行其后<code>consequent/alternative</code>中的一个。如果使用本例新定义的<code>new-if</code>则作为普通过程执行,传入的参数会因为解释器使用应用序求值的原因,两个表达式都会被立即求值,反应到本例中就是<code>guess</code>和<code>(sqrt-iter (improve guess x) x)</code>都会被立即求值,后面的那句是属于递归调用,这样也会导致改进的猜测值永远不会被使用,陷入无限层的递归调用中。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="nb">sqrt </span><span class="mi">9</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Aborting!: maximum recursion depth exceeded</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>思考:</p> +<p>最初的时候,我的针对此题的思考方式是变量的作用域问题(可能lisp不会有此问题),后来发现,也许不是这样,而是由于对传入参数立即求值导致的,后续的网上搜索结果也显示出大家的答案都倾向于后者。</p>SICP 课后练习题1.4https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.4/Fri, 19 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.4/<h4 id="练习14----请仔细考察上面给出的允许运算符为复合表达式的组合式的求值模型根据对这一模型的认识描述下面过程的行为">练习1.4 请仔细考察上面给出的允许运算符为复合表达式的组合式的求值模型,根据对这一模型的认识描述下面过程的行为。</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">a-plus-abs-b</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">((</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="mi">0</span><span class="p">)</span> <span class="nv">+</span> <span class="nv">-</span><span class="p">)</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">))</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>练习1.4,通过if判断,根据b的值决定对a b所使用的运算符是+还是-,如果b大于0,则组合式为(+ a b),反之则为(- a b),所以组合式结果永远返回a加上b的绝对值。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span><span class="lnt">8 +</span><span class="lnt">9 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">a-plus-abs-b</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">((</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="mi">0</span><span class="p">)</span> <span class="nv">+</span> <span class="nv">-</span><span class="p">)</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: a-plus-abs-b</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">a-plus-abs-b</span> <span class="mi">4</span> <span class="mi">2</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 6</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">a-plus-abs-b</span> <span class="mi">4</span> <span class="mi">-2</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 6</span> +</span></span></code></pre></td></tr></table> +</div> +</div>SICP 课后练习题1.5https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.5/Fri, 19 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.5/<h4 id="练习15---ben-bitdiddle发明了一种检测方法能够确定解释器究竟采用哪种序求值是采用应用序还是正则序他定义了下面两个过程">练习1.5 Ben Bitdiddle发明了一种检测方法,能够确定解释器究竟采用哪种序求值,是采用应用序,还是正则序。他定义了下面两个过程</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">p</span><span class="p">)</span> <span class="p">(</span><span class="nf">p</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">test</span> <span class="nv">x</span> <span class="nv">y</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">= </span><span class="nv">x</span> <span class="mi">0</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mi">0</span> +</span></span><span class="line"><span class="cl"> <span class="nv">y</span><span class="p">))</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>而后他求值下面的表达式:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">test</span> <span class="mi">0</span> <span class="p">(</span><span class="nf">p</span><span class="p">))</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>如果某个解释器采用的是应用序求值,Ben会看到什么样的情况?如果解释器采用正则序求值,他又会看到什么情况?请对你的回答做出解释。(无论采用正则序或者应用序,假定特殊形式if的求值规则总是一样的。其中的谓词部分先行求值,根据其结果确定随后求值的子表达式部分。)</p> +<p>练习1.5 『完全展开而后规约』的求值模型为正则序求值,『先求值参数而后应用』的方式为应用序求值,因此,在应用序求值的模式下,执行<code>(test 0 (p))</code>时会先求<code>(p)</code>这个表达式的值,而根据定义<code>(define (p) (p))</code>执行<code>(p)</code>会造成递归调用,解释器陷入死循环。而在正则序求值模式下,会先展开<code>test</code>过程,根据需要再决定是否执行<code>(p)</code>,在本例中,由于传入的<code>x</code>等于<code>0</code>,所以<code>(p)</code>不会被执行,因此不会陷入死循环。</p> +<p>所以,根据以上分析,如果解释器采用的是应用序求值,则解释器陷入死循环,如果是采用正则序求值,则解释器输出<code>;Value: 0</code>。</p>SICP 课后练习题1.1https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.1/Mon, 15 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.1/<h4 id="练习11----下面是一系列表达式对于每个表达式解释器将输出什么结果假定这一系列表达式是按照给出的顺序逐个求值的">练习1.1 下面是一系列表达式,对于每个表达式,解释器将输出什么结果?假定这一系列表达式是按照给出的顺序逐个求值的。</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span><span class="lnt">15 +</span><span class="lnt">16 +</span><span class="lnt">17 +</span><span class="lnt">18 +</span><span class="lnt">19 +</span><span class="lnt">20 +</span><span class="lnt">21 +</span><span class="lnt">22 +</span><span class="lnt">23 +</span><span class="lnt">24 +</span><span class="lnt">25 +</span><span class="lnt">26 +</span><span class="lnt">27 +</span><span class="lnt">28 +</span><span class="lnt">29 +</span><span class="lnt">30 +</span><span class="lnt">31 +</span><span class="lnt">32 +</span><span class="lnt">33 +</span><span class="lnt">34 +</span><span class="lnt">35 +</span><span class="lnt">36 +</span><span class="lnt">37 +</span><span class="lnt">38 +</span><span class="lnt">39 +</span><span class="lnt">40 +</span><span class="lnt">41 +</span><span class="lnt">42 +</span><span class="lnt">43 +</span><span class="lnt">44 +</span><span class="lnt">45 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"><span class="mi">10</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 10</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="mi">5</span> <span class="mi">3</span> <span class="mi">4</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 12</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">9</span> <span class="mi">1</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 8</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">/ </span><span class="mi">6</span> <span class="mi">2</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 3</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="p">(</span><span class="nb">* </span><span class="mi">2</span> <span class="mi">4</span><span class="p">)</span> <span class="p">(</span><span class="nb">- </span><span class="mi">4</span> <span class="mi">6</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 6</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">define </span><span class="nv">a</span> <span class="mi">3</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: a</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">define </span><span class="nv">b</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="mi">1</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: b</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="nv">b</span> <span class="p">(</span><span class="nb">* </span><span class="nv">a</span> <span class="nv">b</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 19</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">= </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: #f</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="k">and </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="nv">a</span><span class="p">)</span> <span class="p">(</span><span class="nb">&lt; </span><span class="nv">b</span> <span class="p">(</span><span class="nb">* </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"><span class="nv">b</span> +</span></span><span class="line"><span class="cl"><span class="nv">a</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 4</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">cond </span><span class="p">((</span><span class="nb">= </span><span class="nv">a</span> <span class="mi">4</span><span class="p">)</span> <span class="mi">6</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">((</span><span class="nb">= </span><span class="nv">b</span> <span class="mi">4</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="mi">6</span> <span class="mi">7</span> <span class="nv">a</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">else </span><span class="mi">25</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 16</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="mi">2</span> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="nv">a</span><span class="p">)</span> <span class="nv">b</span> <span class="nv">a</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 6</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">* </span><span class="p">(</span><span class="k">cond </span><span class="p">((</span><span class="nb">&gt; </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> <span class="nv">a</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">((</span><span class="nb">&lt; </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">else </span><span class="mi">-1</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="mi">1</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 16</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>练习1.1的内容比较简单,基本上直接就可以计算出表达式的值,所有表达式都可以在mit-scheme的交互解释器里进行验证。</p>SICP 课后练习题1.2https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.2/Mon, 15 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.2/<h4 id="练习12----请将下面表达式变换为前缀形式">练习1.2 请将下面表达式变换为前缀形式:</h4> +<p>$$ \frac{5+4+\Bigl(2-\Bigl(3-\left(6+\frac{4}{5}\right)\Bigr)\Bigr)}{3\left(6-2\right)\left(2-7\right)} $$</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"><span class="p">(</span><span class="nb">/ </span><span class="p">(</span><span class="nb">+ </span><span class="mi">5</span> +</span></span><span class="line"><span class="cl"><span class="mi">4</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">2</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">3</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="mi">6</span> <span class="p">(</span><span class="nb">/ </span><span class="mi">4</span> <span class="mi">5</span><span class="p">)))))</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">* </span><span class="mi">3</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">6</span> <span class="mi">2</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">2</span> <span class="mi">7</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: -37/150</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>练习1.2,直接将数学表达式转换为前序表达式即可,在写的时候可以遵循一下排版规则,即同一个运算符的表达式垂直对齐。</p>SICP 课后练习题1.3https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.3/Mon, 15 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.3/<h4 id="练习13----请定义一个过程它以三个数为参数返回其中较大两个数之和">练习1.3 请定义一个过程,它以三个数为参数,返回其中较大两个数之和。</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span><span class="lnt">8 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">max-three-number</span> <span class="nv">a</span> <span class="nv">b</span> <span class="nv">c</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="nv">c</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="nv">c</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">a</span> <span class="nv">c</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">b</span> <span class="nv">a</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">b</span> <span class="nv">c</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">max-three-number</span> <span class="mi">42</span> <span class="mi">7</span> <span class="mi">1</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 49</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>练习1.3,解决此练习中问题的方法比较多,本答案使用比较朴素的方法,先比较出最大的两个数字,然后将其相加,对于三个数字来说,先在前两个中选取一个大的,然后将其与后面两个中比较大的那一个相加。还有一种思路就是可以先定义出比较大小的方法,然后再调用之,或者先对数字按从小到大排序然后加最后两个,等等。</p> \ No newline at end of file diff --git a/tags/lisp/page/1/index.html b/tags/lisp/page/1/index.html new file mode 100644 index 000000000..803c4a403 --- /dev/null +++ b/tags/lisp/page/1/index.html @@ -0,0 +1 @@ +https://sbabybird.github.io/tags/lisp/ \ No newline at end of file diff --git a/tags/lisp/page/2/index.html b/tags/lisp/page/2/index.html new file mode 100644 index 000000000..0fa207e87 --- /dev/null +++ b/tags/lisp/page/2/index.html @@ -0,0 +1,32 @@ +Tag: lisp - Learning & Writing!

Tags

lisp

+ \ No newline at end of file diff --git a/tags/mongodb/index.html b/tags/mongodb/index.html new file mode 100644 index 000000000..b1e523ad2 --- /dev/null +++ b/tags/mongodb/index.html @@ -0,0 +1,31 @@ +Tag: mongodb - Learning & Writing!

Tags

mongodb

+ \ No newline at end of file diff --git a/tags/mongodb/index.xml b/tags/mongodb/index.xml new file mode 100644 index 000000000..b1e01e47c --- /dev/null +++ b/tags/mongodb/index.xml @@ -0,0 +1,130 @@ +mongodb on Learning & Writing!https://sbabybird.github.io/tags/mongodb/Recent content in mongodb on Learning & Writing!Hugo -- gohugo.iozh-cnThu, 07 Nov 2013 00:00:00 +0000使用vs2008编译mongodbhttps://sbabybird.github.io/p/%E4%BD%BF%E7%94%A8vs2008%E7%BC%96%E8%AF%91mongodb/Thu, 07 Nov 2013 00:00:00 +0000https://sbabybird.github.io/p/%E4%BD%BF%E7%94%A8vs2008%E7%BC%96%E8%AF%91mongodb/<h2 id="背景问题">背景问题</h2> +<p>mongodb在windwos下的官方编译包是使用vs2010编译的,从官网上下载的源代码在vs2008环境下不能直接编译通过,因为mongodb提供的相关配置文件是针对vs2010的,可能是因为mongodb最新的代码使用了部分C++11的特性,而vs2008没有提供对C++11支持的原因。可是我们在一个具体的项目上需要在vs2008环境下使用mongodb,只好通过手工修改部分配置和代码的办法完成编译。</p> +<h2 id="环境准备">环境准备</h2> +<p>mongodb是使用scons进行编译控制的,所以在进行以下编译之前需要安装并配置好如下环境:</p> +<h3 id="python27">python2.7</h3> +<p>官方建议是安装python2.7版本,而且要在环境变量PATH中加入python的安装路径和python/scripts的路径,以便在命令行中执行python脚本。 +<em>不过我在编译的时候使用的是python2.6版本,也没有发现问题</em></p> +<h3 id="scons">scons</h3> +<ul> +<li>直接去网上下载最新版本进行安装即可。</li> +</ul> +<h3 id="vs2008">vs2008</h3> +<ul> +<li>需要安装vc++的全部组件(主要是默认安装不带amd64的编译支持),如果只需要编译32位版本的话则可以忽略此条。</li> +<li>需要安装sp1补丁,否则会在编译时报错。</li> +</ul> +<h3 id="boost库">boost库</h3> +<ul> +<li> +<p>最好使用boost1.4.9版本,去官网上下载对应的源码包然后自己在vs2008的命令行环境下编译</p> +</li> +<li> +<p>编译boost的命令如下(只编译了所需库):</p> +<pre><code> bjam stage variant=debug --with-filesystem --with-thread --with-date_time --with-program_options --layout=versioned threading=multi toolset=msvc-10.0 --build-type=complete +</code></pre> +</li> +</ul> +<p><em>如果需要编译release版本,就把<code>variant</code>的选项改为<code>release</code>,如果需要编译64位的版本,就在以上命令中加入<code>address-model=64</code></em></p> +<h2 id="配置及代码修改">配置及代码修改</h2> +<h3 id="sconstruct文件修改">SConstruct文件修改</h3> +<p>SConstruct文件用于存放scons的关键配置信息,我们为了在vs2008下编译mongodb首先要做的就是修改mongodb源码下根目录的SConstruct文件。</p> +<ul> +<li> +<p>修改env配置,找到 evn = Environment</p> +<pre><code> env = Environment( BUILD_DIR=variantDir, +CLIENT_ARCHIVE='${CLIENT_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}', +CLIENT_DIST_BASENAME=get_option('client-dist-basename'), +CLIENT_LICENSE='#distsrc/client/LICENSE.txt', +CLIENT_SCONSTRUCT='#distsrc/client/SConstruct', +DIST_ARCHIVE_SUFFIX='.tgz', +EXTRAPATH=get_option(&quot;extrapath&quot;), +MODULE_BANNERS=[], +MODULETEST_ALIAS='moduletests', +MODULETEST_LIST='#build/moduletests.txt', +MSVS_ARCH=msarch , +PYTHON=utils.find_python(), +SERVER_ARCHIVE='${SERVER_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}', +TARGET_ARCH=msarch , +tools=[&quot;default&quot;, &quot;gch&quot;, &quot;jsheader&quot;, &quot;mergelib&quot;, &quot;unittest&quot;], +UNITTEST_ALIAS='unittests', +UNITTEST_LIST='#build/unittests.txt', +PYSYSPLATFORM=os.sys.platform, +PCRE_VERSION='8.30', +CONFIGUREDIR = '#' + scons_data_dir + '/sconf_temp', +CONFIGURELOG = '#' + scons_data_dir + '/config.log' +) +</code></pre> +</li> +</ul> +<p>在Environment里追加一条 <code>MSVC_VERSION='9.0'</code>,这是因为如果机器上有其他的编译环境,比如vs2010或vs2012,scons会自动使用他们的编译器进行编译,即使你是在vs2008的命令行环境下,我最初因为此问题困扰了很久,后来才只得强制指定编译器的版本,修改完成后如下:</p> +<pre><code>env = Environment( BUILD_DIR=variantDir, +CLIENT_ARCHIVE='${CLIENT_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}', +CLIENT_DIST_BASENAME=get_option('client-dist-basename'), +CLIENT_LICENSE='#distsrc/client/LICENSE.txt', +CLIENT_SCONSTRUCT='#distsrc/client/SConstruct', +DIST_ARCHIVE_SUFFIX='.tgz', +EXTRAPATH=get_option(&quot;extrapath&quot;), +MODULE_BANNERS=[], +MODULETEST_ALIAS='moduletests', +MODULETEST_LIST='#build/moduletests.txt', +MSVS_ARCH=msarch , +PYTHON=utils.find_python(), +SERVER_ARCHIVE='${SERVER_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}', +TARGET_ARCH=msarch , +tools=[&quot;default&quot;, &quot;gch&quot;, &quot;jsheader&quot;, &quot;mergelib&quot;, &quot;unittest&quot;], +UNITTEST_ALIAS='unittests', +UNITTEST_LIST='#build/unittests.txt', +PYSYSPLATFORM=os.sys.platform, +PCRE_VERSION='8.30', +CONFIGUREDIR = '#' + scons_data_dir + '/sconf_temp', +CONFIGURELOG = '#' + scons_data_dir + '/config.log', +MSVC_VERSION = '9.0' +) +</code></pre> +<ul> +<li> +<p>给编译器搜索路径增加你自己本地的boost库路径 +因为在编译时需要用到boost库,所以需要把你在本地的boost所在目录加入scons的环境,否则会报找不到boost头文件或链接库的错误,打开Sconstruct文件直接在最后加入如下代码</p> +<p>env.Append(CPPPATH=[&ldquo;d:/thirdlib/boost_1_49_0&rdquo;, &ldquo;d:/thirdlib/boost_1_49_0/boost/tr1&rdquo;], LIBPATH=[&ldquo;d:/thridlib/boost_1_49_0/stage/lib&rdquo;])</p> +<pre><code> *你在编译时需要将路径替换成你自己的* +</code></pre> +</li> +</ul> +<h3 id="准备stdinth">准备stdint.h</h3> +<ul> +<li>去这个地址<a class="link" href="https://msinttypes.googlecode.com/files/msinttypes-r26.zip" target="_blank" rel="noopener" +>https://msinttypes.googlecode.com/files/msinttypes-r26.zip</a>下载msinttypes,将压缩包里的stdint.h解压并复制到 <code>C:\Program Files\Microsoft Visual Studio 9.0\VC\include</code> 目录</li> +<li>修改mongodb源码目录下platform下的cstdint.h,将<code>#include&lt;cstdint&gt;</code>修改为<code>#include&lt;stdint.h&gt;</code>,将<code>#define _MONGO_STDINT_NAMESPACE std</code>这一行里的std注释掉,变成<code>#define _MONGO_STDINT_NAMESPACE /*std*/ </code></li> +<li>修改mongodb源码目录下util下的time_support.h,在文件开头加入<code>#include&lt;stdint.h&gt;</code>,否则在编译这个文件时会无法识别int64_t类型</li> +</ul> +<h3 id="修改windows_basich">修改windows_basic.h</h3> +<ul> +<li>修改mongodb源码目录下platform下的windows_basic.h,</li> +<li>在<code> #if !defined(NTDDI_WINXPSP3) || (NTDDI_VERSION &lt; NTDDI_WINXPSP3)</code> 之前加入 <code>#define NTDDI_WINXPSP3 0x05010300</code> 在<code>#if !defined(NTDDI_WS03SP2) || (NTDDI_VERSION &lt; NTDDI_WS03SP2)</code>之前加入<code>#define NTDDI_WS03SP2 0x05020200</code> 否则会报 &ldquo;32 bit mongo does not support Windows versions older than XP Service Pack 3&rdquo; 和&quot;64 bit mongo does not support Windows versions older than Windows Server 2003 SP 2&quot; 错误</li> +</ul> +<h3 id="修改listencpp和sockcpp">修改listen.cpp和sock.cpp</h3> +<ul> +<li> +<p>修改util下net下listen.cpp,在#include段之后加入如下代码</p> +<pre><code> #ifdef _WIN32 +#define EADDRINUSE WSAEADDRINUSE +#define ECONNABORTED WSAECONNABORTED +#define EBADF 9 +#define ENFILE 23 +#define EMFILE 24 +#endif +</code></pre> +</li> +<li> +<p>修改util下net下sock.cpp,在#include段之后加入如下代码</p> +<pre><code> #ifdef _WIN32 +#define EAGAIN 11 +#endif +</code></pre> +</li> +</ul> +<h2 id="开始编译">开始编译</h2> +<p>环境准备好之后,编译就比较简单了,打开vs2008命令行窗口,执行如下代码即可完成编译 +<code>scons --dd --32 mongoclient.lib</code></p> +<p>如果是编译release版本,就把&ndash;dd换成&ndash;release,如果是编译64位版本,就把&ndash;32换成&ndash;64</p> \ No newline at end of file diff --git a/tags/mongodb/page/1/index.html b/tags/mongodb/page/1/index.html new file mode 100644 index 000000000..144f1249d --- /dev/null +++ b/tags/mongodb/page/1/index.html @@ -0,0 +1 @@ +https://sbabybird.github.io/tags/mongodb/ \ No newline at end of file diff --git a/tags/page/1/index.html b/tags/page/1/index.html new file mode 100644 index 000000000..fcfb10c85 --- /dev/null +++ b/tags/page/1/index.html @@ -0,0 +1 @@ +https://sbabybird.github.io/tags/ \ No newline at end of file diff --git a/tags/page/2/index.html b/tags/page/2/index.html new file mode 100644 index 000000000..f3a0a10ba --- /dev/null +++ b/tags/page/2/index.html @@ -0,0 +1,34 @@ +Tags

Tags

+ \ No newline at end of file diff --git a/tags/page/3/index.html b/tags/page/3/index.html new file mode 100644 index 000000000..55a65399c --- /dev/null +++ b/tags/page/3/index.html @@ -0,0 +1,34 @@ +Tags

Tags

+ \ No newline at end of file diff --git a/tags/page/4/index.html b/tags/page/4/index.html new file mode 100644 index 000000000..1441e249a --- /dev/null +++ b/tags/page/4/index.html @@ -0,0 +1,34 @@ +Tags

Tags

+ \ No newline at end of file diff --git a/tags/programming/index.html b/tags/programming/index.html new file mode 100644 index 000000000..744820e63 --- /dev/null +++ b/tags/programming/index.html @@ -0,0 +1,32 @@ +Tag: programming - Learning & Writing!

Tags

programming

+ \ No newline at end of file diff --git a/tags/programming/index.xml b/tags/programming/index.xml new file mode 100644 index 000000000..ea68ed40f --- /dev/null +++ b/tags/programming/index.xml @@ -0,0 +1,576 @@ +programming on Learning & Writing!https://sbabybird.github.io/tags/programming/Recent content in programming on Learning & Writing!Hugo -- gohugo.iozh-cnMon, 05 Jan 2015 00:00:00 +0000SICP 课后练习题1.9https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.9/Mon, 05 Jan 2015 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.9/<h4 id="练习-19--下面两个过程各定义了一种加起两个正整数的方法他们都基于过程inc它将参数增加1和dec它将参数减少1-请用代换模型展示这两个过程在求值add-4-5时所产生的计算过程这些计算过程是递归的或者迭代的吗">练习 1.9 下面两个过程各定义了一种加起两个正整数的方法,他们都基于过程inc(它将参数增加1)和dec(它将参数减少1) 。请用代换模型展示这两个过程在求值<code>(add 4 5)</code>时所产生的计算过程。这些计算过程是递归的或者迭代的吗?</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">add</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">= </span><span class="nv">a</span> <span class="mi">0</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">b</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="p">(</span><span class="nf">dec</span> <span class="nv">a</span><span class="p">)</span> <span class="nv">b</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">add</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">= </span><span class="nv">a</span> <span class="mi">0</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">b</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="p">(</span><span class="nf">dec</span> <span class="nv">a</span><span class="p">)</span> <span class="p">(</span><span class="nf">inc</span> <span class="nv">b</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> +</span></span></code></pre></td></tr></table> +</div> +</div><p>解答:根据代换模型分别展开如下</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span><span class="lnt">15 +</span><span class="lnt">16 +</span><span class="lnt">17 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">4</span> <span class="mi">5</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="mi">3</span> <span class="mi">5</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="mi">2</span> <span class="mi">5</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="mi">1</span> <span class="mi">5</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">add</span> <span class="mi">0</span> <span class="mi">5</span><span class="p">)))))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="mi">5</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="mi">6</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="p">(</span><span class="nf">inc</span> <span class="mi">7</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">inc</span> <span class="mi">8</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="mi">9</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">4</span> <span class="mi">5</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">3</span> <span class="mi">6</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">2</span> <span class="mi">7</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">1</span> <span class="mi">8</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">add</span> <span class="mi">0</span> <span class="mi">9</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="mi">9</span><span class="p">)</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>根据展开可以看出,第一个计算过程是递归的,因为明显有一个逐步扩展然后又收缩的递归计算链条。第二个计算过程是迭代的,没有扩展、收缩的过程,而是使用a和b存储了常量。</p>SICP 课后练习题1.8https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.8/Mon, 29 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.8/<h4 id="练习-18-求立方根的牛顿法基于如下事实如果y是x的立方根的一个近似值那么下式将给出一个更好的近似值">练习 1.8 求立方根的牛顿法基于如下事实,如果y是x的立方根的一个近似值,那么下式将给出一个更好的近似值:</h4> +<p>$$ \frac{x/y^2+2y}{3} $$</p> +<p>请利用这一公式实现一个类似平方根过程的求立方根的过程。</p> +<p>解答:基本思路与求解平方根的实现是一致的,区别再有得到更好值<code>improve</code>的过程有变化,只需根据公式描述进行实现即可</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span><span class="lnt">15 +</span><span class="lnt">16 +</span><span class="lnt">17 +</span><span class="lnt">18 +</span><span class="lnt">19 +</span><span class="lnt">20 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">/</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">+ </span><span class="p">(</span><span class="nb">/ </span><span class="nv">x</span> <span class="p">(</span><span class="nb">* </span><span class="nv">guess</span> <span class="nv">guess</span><span class="p">))</span> <span class="p">(</span><span class="nb">* </span><span class="nv">guess</span> <span class="mi">2</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="mi">3</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">next</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">&lt; </span><span class="p">(</span><span class="nb">/ </span><span class="p">(</span><span class="nb">abs </span><span class="p">(</span><span class="nb">- </span><span class="nv">guess</span> <span class="nv">next</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="nv">guess</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mf">0.001</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nb">abs </span><span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&lt; </span><span class="nv">x</span> <span class="mi">0</span><span class="p">)</span> <span class="p">(</span><span class="nb">- </span><span class="nv">x</span><span class="p">)</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">cbrt-iter</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">cbrt-iter</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> <span class="nv">x</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">cbrt</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">cbrt-iter</span> <span class="mf">1.0</span> <span class="nv">x</span><span class="p">))</span> +</span></span></code></pre></td></tr></table> +</div> +</div>SICP 课后练习题1.7https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.7/Sat, 27 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.7/<h4 id="练习-17-对于确定很小的数的平方根而言在计算平方根中使用的检测good-enough是很不好的还有在现实的计算机里算术运算总是以一定的有限精度进行的这也会使我们的检测不适合非常大的数的计算请解释上述论断用例子说明对很小和很大的数这种检测都可能失败实现good-enough的另一种策略是监视猜测值在从一次迭代到下一次的变化情况当改变值相对于猜测值的比率很小时就结束请设计一个采用这种终止测试方式的平方根过程对于很大和很小的数这一方式都能工作吗">练习 1.7 对于确定很小的数的平方根而言,在计算平方根中使用的检测good-enough?是很不好的。还有,在现实的计算机里,算术运算总是以一定的有限精度进行的。这也会使我们的检测不适合非常大的数的计算。请解释上述论断,用例子说明对很小和很大的数,这种检测都可能失败。实现good-enough?的另一种策略是监视猜测值在从一次迭代到下一次的变化情况,当改变值相对于猜测值的比率很小时就结束。请设计一个采用这种终止测试方式的平方根过程。对于很大和很小的数,这一方式都能工作吗?</h4> +<p>解答:good-enough?当前采用的判断方式是,对比猜测值的平方结果与X的值之间的差距,当差距小于某个阙值时(比如0.001),就停止计算。当X很小或很大时,这种检测就会失败,比如,假设我们的阙值设置为0.001,那么当X本身小于这个阙值时,就会检测失败,得出错误结果,当X很大时,也会由于精度不足而一直达不到最佳猜测值,导致死循环。</p> +<p>因此,要解决这一问题,可以按照题目中给出的思路对good-enough?过程进行修改,不再判断猜测值平方与X的差距,而是判断两次猜测值之间的比率。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span><span class="lnt">15 +</span><span class="lnt">16 +</span><span class="lnt">17 +</span><span class="lnt">18 +</span><span class="lnt">19 +</span><span class="lnt">20 +</span><span class="lnt">21 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">next</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">&lt; </span><span class="p">(</span><span class="nb">/ </span><span class="p">(</span><span class="nb">abs </span><span class="p">(</span><span class="nb">- </span><span class="nv">guess</span> <span class="nv">next</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="nv">guess</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mf">0.001</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: good-enough?</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">sqrt-iter</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">sqrt-iter</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> <span class="nv">x</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: sqrt-iter</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="nb">sqrt </span><span class="mf">0.00000000001</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 3.1622776601874535e-6</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="nb">sqrt </span><span class="mi">100000000000000000000000000000000000000000000</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 1.0000000000001497e22</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>在新的<code>good-enough?</code>中,传入的是两次猜测值,所以还要修改<code>sqrt-iter</code>过程,在调用时计算两次猜测值。</p>SICP 课后练习题1.6https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.6/Tue, 23 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.6/<p>采用牛顿法求平方根的过程如下。开始时,我们有了被开方数的值(现在需要做的就是算出它的平方根)和一个猜测值。如果猜测值已经足够好了,有关工作也就完成了。如若不然,那么就需要改进猜测值(求出猜测值与被开方数除以猜测值的平均值),并重复这个计算过程。具体编写代码如下(在MIT scheme解释器中)。</p> +<p>定义<code>sqrt-iter</code>过程,与上述描述完全对应。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">sqrt-iter</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">guess</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">sqrt-iter</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">x</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: sqrt-iter</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义改进猜测值的过程<code>improve</code>,返回猜测值与被开方数除以猜测值的平均值。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">average</span> <span class="nv">guess</span> <span class="p">(</span><span class="nb">/ </span><span class="nv">x</span> <span class="nv">guess</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: improve</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义求平均数的过程<code>average</code>。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">average</span> <span class="nv">x</span> <span class="nv">y</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">/ </span><span class="p">(</span><span class="nb">+ </span><span class="nv">x</span> <span class="nv">y</span><span class="p">)</span> <span class="mi">2</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: average</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义判断猜测值是否足够好的过程<code>good-enough?</code>。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nb">&lt; </span><span class="p">(</span><span class="nb">abs </span><span class="p">(</span><span class="nb">- </span><span class="p">(</span><span class="nf">square</span> <span class="nv">guess</span><span class="p">)</span> <span class="nv">x</span><span class="p">))</span> <span class="mf">0.001</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: good-enough?</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义求绝对值和平方的过程</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span><span class="lnt">8 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nb">abs </span><span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&lt; </span><span class="nv">x</span> <span class="mi">0</span><span class="p">)</span> <span class="p">(</span><span class="nb">- </span><span class="nv">x</span><span class="p">)</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: abs</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">square</span> <span class="nv">x</span><span class="p">)</span> <span class="p">(</span><span class="nb">* </span><span class="nv">x</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: square</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>定义最上层的过程,用于启动整个工作(使用<code>1</code>这个数字作为任何数的初始猜测值)。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nb">sqrt </span><span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">sqrt-iter</span> <span class="mf">1.0</span> <span class="nv">x</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: sqrt</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>执行<code>sqrt</code>过程,并以<code>9</code>为参数,求得平方根为<code>3</code></p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="nb">sqrt </span><span class="mi">9</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 3.00009155413138</span> +</span></span></code></pre></td></tr></table> +</div> +</div><h4 id="练习16----alyssa-phacker看不出来为什么需要将if提供为一种特殊形式她问为什么我不能直接通过cond将它定义为一个常规过程呢alyssa的朋友eva-lu-ator断言确实可以这样做并定义了if的一个新版本">练习1.6 Alyssa P.Hacker看不出来为什么需要将if提供为一种特殊形式,她问:“为什么我不能直接通过<code>cond</code>将它定义为一个常规过程呢?”Alyssa的朋友Eva Lu Ator断言确实可以这样做,并定义了<code>if</code>的一个新版本:</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">new-if</span> <span class="nv">predicate</span> <span class="nv">then-clause</span> <span class="nv">else-clause</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">cond </span><span class="p">(</span><span class="nf">predicate</span> <span class="nv">then-clause</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">else </span><span class="nv">else-clause</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: new-if</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>Eva给Alyssa演示她的程序:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">new-if</span> <span class="p">(</span><span class="nb">= </span><span class="mi">2</span> <span class="mi">3</span><span class="p">)</span> <span class="mi">0</span> <span class="mi">5</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mi">5</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">new-if</span> <span class="p">(</span><span class="nb">= </span><span class="mi">1</span> <span class="mi">1</span><span class="p">)</span> <span class="mi">0</span> <span class="mi">5</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mi">0</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>她很高兴地用自己的<code>new-if</code>重写了求平方根的程序:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">sqrt-iter</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">new-if</span> <span class="p">(</span><span class="nf">good-enough?</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">guess</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">sqrt-iter</span> <span class="p">(</span><span class="nf">improve</span> <span class="nv">guess</span> <span class="nv">x</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nv">x</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: sqrt-iter</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>当Alyssa试着用这个过程去计算平方根时会发生什么事情呢?请给出解释。</p> +<p>解答:</p> +<p>这个练习引入了一个新的思考,刚开始时,我以为是牵涉到了过程的局部参数概念,因为在新编写的<code>new-if</code>过程中,看似可以完成条件判断并返回正确的值,但是在本例中使用却存在问题,即在递归调用<code>sqrt-iter</code>时,传给该过程的<code>guess</code>和<code>x</code>为<code>new-if</code>的局部参数,被返回给了<code>new-if</code>这个过程,不会向上返回到上一层<code>sqrt-iter</code>里,这样就导致了改进的猜测值永远不会被使用,使得这个计算过程永远不会结束(除非第一个猜测值恰好合适),从而导致递归调用的陷入无限循环。我在<code>MIT-scheme</code>解释器里的执行结果是,解释器自动退出并提示我递归调用深度超出最大值。</p> +<p>上述看起来是合理的,但是后来我考虑了其他情况,及本书在前面章节里提到了if<code>(if &lt;predicate&gt; &lt;consequent&gt; &lt;alternative&gt;)</code>语句是条件表达式的受限形式,在执行时,先判断<code>predicate</code>是否为真,然后根据结果只执行其后<code>consequent/alternative</code>中的一个。如果使用本例新定义的<code>new-if</code>则作为普通过程执行,传入的参数会因为解释器使用应用序求值的原因,两个表达式都会被立即求值,反应到本例中就是<code>guess</code>和<code>(sqrt-iter (improve guess x) x)</code>都会被立即求值,后面的那句是属于递归调用,这样也会导致改进的猜测值永远不会被使用,陷入无限层的递归调用中。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="mi">1</span> <span class="p">]</span><span class="k">=&gt; </span><span class="p">(</span><span class="nb">sqrt </span><span class="mi">9</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Aborting!: maximum recursion depth exceeded</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>思考:</p> +<p>最初的时候,我的针对此题的思考方式是变量的作用域问题(可能lisp不会有此问题),后来发现,也许不是这样,而是由于对传入参数立即求值导致的,后续的网上搜索结果也显示出大家的答案都倾向于后者。</p>SICP 课后练习题1.4https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.4/Fri, 19 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.4/<h4 id="练习14----请仔细考察上面给出的允许运算符为复合表达式的组合式的求值模型根据对这一模型的认识描述下面过程的行为">练习1.4 请仔细考察上面给出的允许运算符为复合表达式的组合式的求值模型,根据对这一模型的认识描述下面过程的行为。</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">a-plus-abs-b</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">((</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="mi">0</span><span class="p">)</span> <span class="nv">+</span> <span class="nv">-</span><span class="p">)</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">))</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>练习1.4,通过if判断,根据b的值决定对a b所使用的运算符是+还是-,如果b大于0,则组合式为(+ a b),反之则为(- a b),所以组合式结果永远返回a加上b的绝对值。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span><span class="lnt">8 +</span><span class="lnt">9 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">a-plus-abs-b</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">((</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="mi">0</span><span class="p">)</span> <span class="nv">+</span> <span class="nv">-</span><span class="p">)</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: a-plus-abs-b</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">a-plus-abs-b</span> <span class="mi">4</span> <span class="mi">2</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 6</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">a-plus-abs-b</span> <span class="mi">4</span> <span class="mi">-2</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 6</span> +</span></span></code></pre></td></tr></table> +</div> +</div>SICP 课后练习题1.5https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.5/Fri, 19 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.5/<h4 id="练习15---ben-bitdiddle发明了一种检测方法能够确定解释器究竟采用哪种序求值是采用应用序还是正则序他定义了下面两个过程">练习1.5 Ben Bitdiddle发明了一种检测方法,能够确定解释器究竟采用哪种序求值,是采用应用序,还是正则序。他定义了下面两个过程</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">p</span><span class="p">)</span> <span class="p">(</span><span class="nf">p</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">test</span> <span class="nv">x</span> <span class="nv">y</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">= </span><span class="nv">x</span> <span class="mi">0</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="mi">0</span> +</span></span><span class="line"><span class="cl"> <span class="nv">y</span><span class="p">))</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>而后他求值下面的表达式:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">test</span> <span class="mi">0</span> <span class="p">(</span><span class="nf">p</span><span class="p">))</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>如果某个解释器采用的是应用序求值,Ben会看到什么样的情况?如果解释器采用正则序求值,他又会看到什么情况?请对你的回答做出解释。(无论采用正则序或者应用序,假定特殊形式if的求值规则总是一样的。其中的谓词部分先行求值,根据其结果确定随后求值的子表达式部分。)</p> +<p>练习1.5 『完全展开而后规约』的求值模型为正则序求值,『先求值参数而后应用』的方式为应用序求值,因此,在应用序求值的模式下,执行<code>(test 0 (p))</code>时会先求<code>(p)</code>这个表达式的值,而根据定义<code>(define (p) (p))</code>执行<code>(p)</code>会造成递归调用,解释器陷入死循环。而在正则序求值模式下,会先展开<code>test</code>过程,根据需要再决定是否执行<code>(p)</code>,在本例中,由于传入的<code>x</code>等于<code>0</code>,所以<code>(p)</code>不会被执行,因此不会陷入死循环。</p> +<p>所以,根据以上分析,如果解释器采用的是应用序求值,则解释器陷入死循环,如果是采用正则序求值,则解释器输出<code>;Value: 0</code>。</p>SICP 课后练习题1.1https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.1/Mon, 15 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.1/<h4 id="练习11----下面是一系列表达式对于每个表达式解释器将输出什么结果假定这一系列表达式是按照给出的顺序逐个求值的">练习1.1 下面是一系列表达式,对于每个表达式,解释器将输出什么结果?假定这一系列表达式是按照给出的顺序逐个求值的。</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span><span class="lnt">15 +</span><span class="lnt">16 +</span><span class="lnt">17 +</span><span class="lnt">18 +</span><span class="lnt">19 +</span><span class="lnt">20 +</span><span class="lnt">21 +</span><span class="lnt">22 +</span><span class="lnt">23 +</span><span class="lnt">24 +</span><span class="lnt">25 +</span><span class="lnt">26 +</span><span class="lnt">27 +</span><span class="lnt">28 +</span><span class="lnt">29 +</span><span class="lnt">30 +</span><span class="lnt">31 +</span><span class="lnt">32 +</span><span class="lnt">33 +</span><span class="lnt">34 +</span><span class="lnt">35 +</span><span class="lnt">36 +</span><span class="lnt">37 +</span><span class="lnt">38 +</span><span class="lnt">39 +</span><span class="lnt">40 +</span><span class="lnt">41 +</span><span class="lnt">42 +</span><span class="lnt">43 +</span><span class="lnt">44 +</span><span class="lnt">45 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"><span class="mi">10</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 10</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="mi">5</span> <span class="mi">3</span> <span class="mi">4</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 12</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">9</span> <span class="mi">1</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 8</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">/ </span><span class="mi">6</span> <span class="mi">2</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 3</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="p">(</span><span class="nb">* </span><span class="mi">2</span> <span class="mi">4</span><span class="p">)</span> <span class="p">(</span><span class="nb">- </span><span class="mi">4</span> <span class="mi">6</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 6</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">define </span><span class="nv">a</span> <span class="mi">3</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: a</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">define </span><span class="nv">b</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="mi">1</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: b</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="nv">b</span> <span class="p">(</span><span class="nb">* </span><span class="nv">a</span> <span class="nv">b</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 19</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">= </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: #f</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="k">and </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="nv">a</span><span class="p">)</span> <span class="p">(</span><span class="nb">&lt; </span><span class="nv">b</span> <span class="p">(</span><span class="nb">* </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)))</span> +</span></span><span class="line"><span class="cl"><span class="nv">b</span> +</span></span><span class="line"><span class="cl"><span class="nv">a</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 4</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">cond </span><span class="p">((</span><span class="nb">= </span><span class="nv">a</span> <span class="mi">4</span><span class="p">)</span> <span class="mi">6</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">((</span><span class="nb">= </span><span class="nv">b</span> <span class="mi">4</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="mi">6</span> <span class="mi">7</span> <span class="nv">a</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">else </span><span class="mi">25</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 16</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="mi">2</span> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="nv">a</span><span class="p">)</span> <span class="nv">b</span> <span class="nv">a</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 6</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">* </span><span class="p">(</span><span class="k">cond </span><span class="p">((</span><span class="nb">&gt; </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> <span class="nv">a</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">((</span><span class="nb">&lt; </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">else </span><span class="mi">-1</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="mi">1</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: 16</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>练习1.1的内容比较简单,基本上直接就可以计算出表达式的值,所有表达式都可以在mit-scheme的交互解释器里进行验证。</p>SICP 课后练习题1.2https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.2/Mon, 15 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.2/<h4 id="练习12----请将下面表达式变换为前缀形式">练习1.2 请将下面表达式变换为前缀形式:</h4> +<p>$$ \frac{5+4+\Bigl(2-\Bigl(3-\left(6+\frac{4}{5}\right)\Bigr)\Bigr)}{3\left(6-2\right)\left(2-7\right)} $$</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"><span class="p">(</span><span class="nb">/ </span><span class="p">(</span><span class="nb">+ </span><span class="mi">5</span> +</span></span><span class="line"><span class="cl"><span class="mi">4</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">2</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">3</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">+ </span><span class="mi">6</span> <span class="p">(</span><span class="nb">/ </span><span class="mi">4</span> <span class="mi">5</span><span class="p">)))))</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">* </span><span class="mi">3</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">6</span> <span class="mi">2</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">- </span><span class="mi">2</span> <span class="mi">7</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"><span class="p">))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c1">;Value: -37/150</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>练习1.2,直接将数学表达式转换为前序表达式即可,在写的时候可以遵循一下排版规则,即同一个运算符的表达式垂直对齐。</p>SICP 课后练习题1.3https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.3/Mon, 15 Dec 2014 00:00:00 +0000https://sbabybird.github.io/p/sicp-%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E9%A2%981.3/<h4 id="练习13----请定义一个过程它以三个数为参数返回其中较大两个数之和">练习1.3 请定义一个过程,它以三个数为参数,返回其中较大两个数之和。</h4> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span><span class="lnt">2 +</span><span class="lnt">3 +</span><span class="lnt">4 +</span><span class="lnt">5 +</span><span class="lnt">6 +</span><span class="lnt">7 +</span><span class="lnt">8 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-scheme" data-lang="scheme"><span class="line"><span class="cl"> <span class="p">(</span><span class="k">define </span><span class="p">(</span><span class="nf">max-three-number</span> <span class="nv">a</span> <span class="nv">b</span> <span class="nv">c</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">b</span> <span class="nv">c</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="nv">c</span><span class="p">))</span> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">&gt; </span><span class="nv">a</span> <span class="nv">c</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">b</span> <span class="nv">a</span><span class="p">)</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">b</span> <span class="nv">c</span><span class="p">))))</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="nf">max-three-number</span> <span class="mi">42</span> <span class="mi">7</span> <span class="mi">1</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">;Value: 49</span> +</span></span></code></pre></td></tr></table> +</div> +</div><p>练习1.3,解决此练习中问题的方法比较多,本答案使用比较朴素的方法,先比较出最大的两个数字,然后将其相加,对于三个数字来说,先在前两个中选取一个大的,然后将其与后面两个中比较大的那一个相加。还有一种思路就是可以先定义出比较大小的方法,然后再调用之,或者先对数字按从小到大排序然后加最后两个,等等。</p> \ No newline at end of file diff --git a/tags/programming/page/1/index.html b/tags/programming/page/1/index.html new file mode 100644 index 000000000..4b17ab4df --- /dev/null +++ b/tags/programming/page/1/index.html @@ -0,0 +1 @@ +https://sbabybird.github.io/tags/programming/ \ No newline at end of file diff --git a/tags/programming/page/2/index.html b/tags/programming/page/2/index.html new file mode 100644 index 000000000..8799a1d97 --- /dev/null +++ b/tags/programming/page/2/index.html @@ -0,0 +1,32 @@ +Tag: programming - Learning & Writing!

Tags

programming

+ \ No newline at end of file diff --git a/tags/vs2008/index.html b/tags/vs2008/index.html new file mode 100644 index 000000000..d8f0e30fd --- /dev/null +++ b/tags/vs2008/index.html @@ -0,0 +1,31 @@ +Tag: vs2008 - Learning & Writing!

Tags

vs2008

+ \ No newline at end of file diff --git a/tags/vs2008/index.xml b/tags/vs2008/index.xml new file mode 100644 index 000000000..df00e6815 --- /dev/null +++ b/tags/vs2008/index.xml @@ -0,0 +1,130 @@ +vs2008 on Learning & Writing!https://sbabybird.github.io/tags/vs2008/Recent content in vs2008 on Learning & Writing!Hugo -- gohugo.iozh-cnThu, 07 Nov 2013 00:00:00 +0000使用vs2008编译mongodbhttps://sbabybird.github.io/p/%E4%BD%BF%E7%94%A8vs2008%E7%BC%96%E8%AF%91mongodb/Thu, 07 Nov 2013 00:00:00 +0000https://sbabybird.github.io/p/%E4%BD%BF%E7%94%A8vs2008%E7%BC%96%E8%AF%91mongodb/<h2 id="背景问题">背景问题</h2> +<p>mongodb在windwos下的官方编译包是使用vs2010编译的,从官网上下载的源代码在vs2008环境下不能直接编译通过,因为mongodb提供的相关配置文件是针对vs2010的,可能是因为mongodb最新的代码使用了部分C++11的特性,而vs2008没有提供对C++11支持的原因。可是我们在一个具体的项目上需要在vs2008环境下使用mongodb,只好通过手工修改部分配置和代码的办法完成编译。</p> +<h2 id="环境准备">环境准备</h2> +<p>mongodb是使用scons进行编译控制的,所以在进行以下编译之前需要安装并配置好如下环境:</p> +<h3 id="python27">python2.7</h3> +<p>官方建议是安装python2.7版本,而且要在环境变量PATH中加入python的安装路径和python/scripts的路径,以便在命令行中执行python脚本。 +<em>不过我在编译的时候使用的是python2.6版本,也没有发现问题</em></p> +<h3 id="scons">scons</h3> +<ul> +<li>直接去网上下载最新版本进行安装即可。</li> +</ul> +<h3 id="vs2008">vs2008</h3> +<ul> +<li>需要安装vc++的全部组件(主要是默认安装不带amd64的编译支持),如果只需要编译32位版本的话则可以忽略此条。</li> +<li>需要安装sp1补丁,否则会在编译时报错。</li> +</ul> +<h3 id="boost库">boost库</h3> +<ul> +<li> +<p>最好使用boost1.4.9版本,去官网上下载对应的源码包然后自己在vs2008的命令行环境下编译</p> +</li> +<li> +<p>编译boost的命令如下(只编译了所需库):</p> +<pre><code> bjam stage variant=debug --with-filesystem --with-thread --with-date_time --with-program_options --layout=versioned threading=multi toolset=msvc-10.0 --build-type=complete +</code></pre> +</li> +</ul> +<p><em>如果需要编译release版本,就把<code>variant</code>的选项改为<code>release</code>,如果需要编译64位的版本,就在以上命令中加入<code>address-model=64</code></em></p> +<h2 id="配置及代码修改">配置及代码修改</h2> +<h3 id="sconstruct文件修改">SConstruct文件修改</h3> +<p>SConstruct文件用于存放scons的关键配置信息,我们为了在vs2008下编译mongodb首先要做的就是修改mongodb源码下根目录的SConstruct文件。</p> +<ul> +<li> +<p>修改env配置,找到 evn = Environment</p> +<pre><code> env = Environment( BUILD_DIR=variantDir, +CLIENT_ARCHIVE='${CLIENT_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}', +CLIENT_DIST_BASENAME=get_option('client-dist-basename'), +CLIENT_LICENSE='#distsrc/client/LICENSE.txt', +CLIENT_SCONSTRUCT='#distsrc/client/SConstruct', +DIST_ARCHIVE_SUFFIX='.tgz', +EXTRAPATH=get_option(&quot;extrapath&quot;), +MODULE_BANNERS=[], +MODULETEST_ALIAS='moduletests', +MODULETEST_LIST='#build/moduletests.txt', +MSVS_ARCH=msarch , +PYTHON=utils.find_python(), +SERVER_ARCHIVE='${SERVER_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}', +TARGET_ARCH=msarch , +tools=[&quot;default&quot;, &quot;gch&quot;, &quot;jsheader&quot;, &quot;mergelib&quot;, &quot;unittest&quot;], +UNITTEST_ALIAS='unittests', +UNITTEST_LIST='#build/unittests.txt', +PYSYSPLATFORM=os.sys.platform, +PCRE_VERSION='8.30', +CONFIGUREDIR = '#' + scons_data_dir + '/sconf_temp', +CONFIGURELOG = '#' + scons_data_dir + '/config.log' +) +</code></pre> +</li> +</ul> +<p>在Environment里追加一条 <code>MSVC_VERSION='9.0'</code>,这是因为如果机器上有其他的编译环境,比如vs2010或vs2012,scons会自动使用他们的编译器进行编译,即使你是在vs2008的命令行环境下,我最初因为此问题困扰了很久,后来才只得强制指定编译器的版本,修改完成后如下:</p> +<pre><code>env = Environment( BUILD_DIR=variantDir, +CLIENT_ARCHIVE='${CLIENT_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}', +CLIENT_DIST_BASENAME=get_option('client-dist-basename'), +CLIENT_LICENSE='#distsrc/client/LICENSE.txt', +CLIENT_SCONSTRUCT='#distsrc/client/SConstruct', +DIST_ARCHIVE_SUFFIX='.tgz', +EXTRAPATH=get_option(&quot;extrapath&quot;), +MODULE_BANNERS=[], +MODULETEST_ALIAS='moduletests', +MODULETEST_LIST='#build/moduletests.txt', +MSVS_ARCH=msarch , +PYTHON=utils.find_python(), +SERVER_ARCHIVE='${SERVER_DIST_BASENAME}${DIST_ARCHIVE_SUFFIX}', +TARGET_ARCH=msarch , +tools=[&quot;default&quot;, &quot;gch&quot;, &quot;jsheader&quot;, &quot;mergelib&quot;, &quot;unittest&quot;], +UNITTEST_ALIAS='unittests', +UNITTEST_LIST='#build/unittests.txt', +PYSYSPLATFORM=os.sys.platform, +PCRE_VERSION='8.30', +CONFIGUREDIR = '#' + scons_data_dir + '/sconf_temp', +CONFIGURELOG = '#' + scons_data_dir + '/config.log', +MSVC_VERSION = '9.0' +) +</code></pre> +<ul> +<li> +<p>给编译器搜索路径增加你自己本地的boost库路径 +因为在编译时需要用到boost库,所以需要把你在本地的boost所在目录加入scons的环境,否则会报找不到boost头文件或链接库的错误,打开Sconstruct文件直接在最后加入如下代码</p> +<p>env.Append(CPPPATH=[&ldquo;d:/thirdlib/boost_1_49_0&rdquo;, &ldquo;d:/thirdlib/boost_1_49_0/boost/tr1&rdquo;], LIBPATH=[&ldquo;d:/thridlib/boost_1_49_0/stage/lib&rdquo;])</p> +<pre><code> *你在编译时需要将路径替换成你自己的* +</code></pre> +</li> +</ul> +<h3 id="准备stdinth">准备stdint.h</h3> +<ul> +<li>去这个地址<a class="link" href="https://msinttypes.googlecode.com/files/msinttypes-r26.zip" target="_blank" rel="noopener" +>https://msinttypes.googlecode.com/files/msinttypes-r26.zip</a>下载msinttypes,将压缩包里的stdint.h解压并复制到 <code>C:\Program Files\Microsoft Visual Studio 9.0\VC\include</code> 目录</li> +<li>修改mongodb源码目录下platform下的cstdint.h,将<code>#include&lt;cstdint&gt;</code>修改为<code>#include&lt;stdint.h&gt;</code>,将<code>#define _MONGO_STDINT_NAMESPACE std</code>这一行里的std注释掉,变成<code>#define _MONGO_STDINT_NAMESPACE /*std*/ </code></li> +<li>修改mongodb源码目录下util下的time_support.h,在文件开头加入<code>#include&lt;stdint.h&gt;</code>,否则在编译这个文件时会无法识别int64_t类型</li> +</ul> +<h3 id="修改windows_basich">修改windows_basic.h</h3> +<ul> +<li>修改mongodb源码目录下platform下的windows_basic.h,</li> +<li>在<code> #if !defined(NTDDI_WINXPSP3) || (NTDDI_VERSION &lt; NTDDI_WINXPSP3)</code> 之前加入 <code>#define NTDDI_WINXPSP3 0x05010300</code> 在<code>#if !defined(NTDDI_WS03SP2) || (NTDDI_VERSION &lt; NTDDI_WS03SP2)</code>之前加入<code>#define NTDDI_WS03SP2 0x05020200</code> 否则会报 &ldquo;32 bit mongo does not support Windows versions older than XP Service Pack 3&rdquo; 和&quot;64 bit mongo does not support Windows versions older than Windows Server 2003 SP 2&quot; 错误</li> +</ul> +<h3 id="修改listencpp和sockcpp">修改listen.cpp和sock.cpp</h3> +<ul> +<li> +<p>修改util下net下listen.cpp,在#include段之后加入如下代码</p> +<pre><code> #ifdef _WIN32 +#define EADDRINUSE WSAEADDRINUSE +#define ECONNABORTED WSAECONNABORTED +#define EBADF 9 +#define ENFILE 23 +#define EMFILE 24 +#endif +</code></pre> +</li> +<li> +<p>修改util下net下sock.cpp,在#include段之后加入如下代码</p> +<pre><code> #ifdef _WIN32 +#define EAGAIN 11 +#endif +</code></pre> +</li> +</ul> +<h2 id="开始编译">开始编译</h2> +<p>环境准备好之后,编译就比较简单了,打开vs2008命令行窗口,执行如下代码即可完成编译 +<code>scons --dd --32 mongoclient.lib</code></p> +<p>如果是编译release版本,就把&ndash;dd换成&ndash;release,如果是编译64位版本,就把&ndash;32换成&ndash;64</p> \ No newline at end of file diff --git a/tags/vs2008/page/1/index.html b/tags/vs2008/page/1/index.html new file mode 100644 index 000000000..bfeb5963e --- /dev/null +++ b/tags/vs2008/page/1/index.html @@ -0,0 +1 @@ +https://sbabybird.github.io/tags/vs2008/ \ No newline at end of file diff --git a/tags/wifi/index.html b/tags/wifi/index.html new file mode 100644 index 000000000..103652e47 --- /dev/null +++ b/tags/wifi/index.html @@ -0,0 +1,31 @@ +Tag: wifi - Learning & Writing!

Tags

wifi

+ \ No newline at end of file diff --git a/tags/wifi/index.xml b/tags/wifi/index.xml new file mode 100644 index 000000000..44def0edb --- /dev/null +++ b/tags/wifi/index.xml @@ -0,0 +1,27 @@ +wifi on Learning & Writing!https://sbabybird.github.io/tags/wifi/Recent content in wifi on Learning & Writing!Hugo -- gohugo.iozh-cnThu, 13 Feb 2014 00:00:00 +0000win8系统下使用笔记本作为wifi热点https://sbabybird.github.io/p/win8%E7%B3%BB%E7%BB%9F%E4%B8%8B%E4%BD%BF%E7%94%A8%E7%AC%94%E8%AE%B0%E6%9C%AC%E4%BD%9C%E4%B8%BAwifi%E7%83%AD%E7%82%B9/Thu, 13 Feb 2014 00:00:00 +0000https://sbabybird.github.io/p/win8%E7%B3%BB%E7%BB%9F%E4%B8%8B%E4%BD%BF%E7%94%A8%E7%AC%94%E8%AE%B0%E6%9C%AC%E4%BD%9C%E4%B8%BAwifi%E7%83%AD%E7%82%B9/<h1 id="win8系统下使用笔记本作为wifi热点">win8系统下使用笔记本作为wifi热点</h1> +<h2 id="背景">背景</h2> +<p>在没有无线路由的情况下,比如出差在宾馆,如果手里有一台可以上网的笔记本电脑,则可以给手机、平板电脑或者其他笔记本提供一个可以上网的wifi热点。</p> +<p>我平时在单位即通过此方式给我的平板电脑和手机共享网络通道,比较方便实用,近期在使用的过程中遇到一些问题,经过摸索,解决了问题,在此记录一下,方便以后查阅。</p> +<h2 id="环境需要">环境需要</h2> +<ul> +<li>一台通过有线连接上网(或者通过3G上网,就是说wifi网卡没有被占用)的笔记本电脑</li> +<li>安装有win8操作系统(win7应该也可以)</li> +<li>无线网卡芯片是intel的(否则可能不支持此技术),并使用了最新的驱动程序</li> +</ul> +<h2 id="基本步骤">基本步骤</h2> +<ul> +<li> +<p>打开具有管理员权限的控制台窗口(在win8系统下,可以通过按<code>windows+x</code>键,然后在弹出的菜单里选择『命令提示符(管理员)』)</p> +</li> +<li> +<p>输入如下命令 <code>netsh wlan set hostednetwork mode=allow ssid=&quot;mywifi&quot; key=&quot;12345678&quot;</code> <em>其中ssid后面的热点名称和key后面的密码可以根据情况自行决定</em></p> +</li> +<li> +<p>上一个命令完成后,如果没有异常的话,则输入如下命令 <code>netsh wlan start hostednetwork</code> <em>这条命令如果执行成功会显示『已启动承载网络』,在下次系统重启后需要重新执行,如果嫌麻烦则可以做一个批处理文件每次双击即可</em></p> +</li> +<li> +<p>成功启动承载网络之后,进入『网络和共享中心』点击『更改适配器设置』,此时在该页里应该可以看到一个虚拟网卡(名称一般叫MicrosoftVirtual WiFi Miniport Adapter),右键点击那个可以上网的网络连接(如果是有线连接就是那个『本地连接』,如果是3G的则根据情况而定,总之必须是那个可以上网的连接),选择『属性』,切换到『共享』页,勾选『允许其他网络用户通过此计算机的Internet连接来连接』,在下面的下拉列表里选择那个刚虚拟出来的虚拟网卡。确定即可。</p> +</li> +</ul> +<h2 id="常见问题">常见问题</h2> +<p>执行以上第二条命令启动承载网络后,有时会显示『无法启动承载网络,组或资源的状态不是执行请求操作的正确状态』,网上大部分的文章针对这个问题给出的解决办法都是更新网卡驱动,可是对于我的笔记本无效,因为我的笔记本电脑在前一段时间是好用的,后来不好用了,根据我的摸索,解决这个问题的办法是,去『设备管理器』下面的『网络适配器』里面找找,看看有没有被禁用的设备,比如『微软托管网络协议』,如果禁用了再重新启用即可正常使用此功能了。</p> \ No newline at end of file diff --git a/tags/wifi/page/1/index.html b/tags/wifi/page/1/index.html new file mode 100644 index 000000000..bde58df34 --- /dev/null +++ b/tags/wifi/page/1/index.html @@ -0,0 +1 @@ +https://sbabybird.github.io/tags/wifi/ \ No newline at end of file diff --git a/tags/win8/index.html b/tags/win8/index.html new file mode 100644 index 000000000..cedb063f5 --- /dev/null +++ b/tags/win8/index.html @@ -0,0 +1,31 @@ +Tag: win8 - Learning & Writing!

Tags

win8

+ \ No newline at end of file diff --git a/tags/win8/index.xml b/tags/win8/index.xml new file mode 100644 index 000000000..aadb7aff4 --- /dev/null +++ b/tags/win8/index.xml @@ -0,0 +1,27 @@ +win8 on Learning & Writing!https://sbabybird.github.io/tags/win8/Recent content in win8 on Learning & Writing!Hugo -- gohugo.iozh-cnThu, 13 Feb 2014 00:00:00 +0000win8系统下使用笔记本作为wifi热点https://sbabybird.github.io/p/win8%E7%B3%BB%E7%BB%9F%E4%B8%8B%E4%BD%BF%E7%94%A8%E7%AC%94%E8%AE%B0%E6%9C%AC%E4%BD%9C%E4%B8%BAwifi%E7%83%AD%E7%82%B9/Thu, 13 Feb 2014 00:00:00 +0000https://sbabybird.github.io/p/win8%E7%B3%BB%E7%BB%9F%E4%B8%8B%E4%BD%BF%E7%94%A8%E7%AC%94%E8%AE%B0%E6%9C%AC%E4%BD%9C%E4%B8%BAwifi%E7%83%AD%E7%82%B9/<h1 id="win8系统下使用笔记本作为wifi热点">win8系统下使用笔记本作为wifi热点</h1> +<h2 id="背景">背景</h2> +<p>在没有无线路由的情况下,比如出差在宾馆,如果手里有一台可以上网的笔记本电脑,则可以给手机、平板电脑或者其他笔记本提供一个可以上网的wifi热点。</p> +<p>我平时在单位即通过此方式给我的平板电脑和手机共享网络通道,比较方便实用,近期在使用的过程中遇到一些问题,经过摸索,解决了问题,在此记录一下,方便以后查阅。</p> +<h2 id="环境需要">环境需要</h2> +<ul> +<li>一台通过有线连接上网(或者通过3G上网,就是说wifi网卡没有被占用)的笔记本电脑</li> +<li>安装有win8操作系统(win7应该也可以)</li> +<li>无线网卡芯片是intel的(否则可能不支持此技术),并使用了最新的驱动程序</li> +</ul> +<h2 id="基本步骤">基本步骤</h2> +<ul> +<li> +<p>打开具有管理员权限的控制台窗口(在win8系统下,可以通过按<code>windows+x</code>键,然后在弹出的菜单里选择『命令提示符(管理员)』)</p> +</li> +<li> +<p>输入如下命令 <code>netsh wlan set hostednetwork mode=allow ssid=&quot;mywifi&quot; key=&quot;12345678&quot;</code> <em>其中ssid后面的热点名称和key后面的密码可以根据情况自行决定</em></p> +</li> +<li> +<p>上一个命令完成后,如果没有异常的话,则输入如下命令 <code>netsh wlan start hostednetwork</code> <em>这条命令如果执行成功会显示『已启动承载网络』,在下次系统重启后需要重新执行,如果嫌麻烦则可以做一个批处理文件每次双击即可</em></p> +</li> +<li> +<p>成功启动承载网络之后,进入『网络和共享中心』点击『更改适配器设置』,此时在该页里应该可以看到一个虚拟网卡(名称一般叫MicrosoftVirtual WiFi Miniport Adapter),右键点击那个可以上网的网络连接(如果是有线连接就是那个『本地连接』,如果是3G的则根据情况而定,总之必须是那个可以上网的连接),选择『属性』,切换到『共享』页,勾选『允许其他网络用户通过此计算机的Internet连接来连接』,在下面的下拉列表里选择那个刚虚拟出来的虚拟网卡。确定即可。</p> +</li> +</ul> +<h2 id="常见问题">常见问题</h2> +<p>执行以上第二条命令启动承载网络后,有时会显示『无法启动承载网络,组或资源的状态不是执行请求操作的正确状态』,网上大部分的文章针对这个问题给出的解决办法都是更新网卡驱动,可是对于我的笔记本无效,因为我的笔记本电脑在前一段时间是好用的,后来不好用了,根据我的摸索,解决这个问题的办法是,去『设备管理器』下面的『网络适配器』里面找找,看看有没有被禁用的设备,比如『微软托管网络协议』,如果禁用了再重新启用即可正常使用此功能了。</p> \ No newline at end of file diff --git a/tags/win8/page/1/index.html b/tags/win8/page/1/index.html new file mode 100644 index 000000000..4fb0dc457 --- /dev/null +++ b/tags/win8/page/1/index.html @@ -0,0 +1 @@ +https://sbabybird.github.io/tags/win8/ \ No newline at end of file diff --git "a/tags/\345\256\266\345\272\255/index.html" "b/tags/\345\256\266\345\272\255/index.html" new file mode 100644 index 000000000..2ed86528a --- /dev/null +++ "b/tags/\345\256\266\345\272\255/index.html" @@ -0,0 +1,31 @@ +Tag: 家庭 - Learning & Writing!

Tags

家庭

+ \ No newline at end of file diff --git "a/tags/\345\256\266\345\272\255/index.xml" "b/tags/\345\256\266\345\272\255/index.xml" new file mode 100644 index 000000000..956b3f530 --- /dev/null +++ "b/tags/\345\256\266\345\272\255/index.xml" @@ -0,0 +1,20 @@ +家庭 on Learning & Writing!https://sbabybird.github.io/tags/%E5%AE%B6%E5%BA%AD/Recent content in 家庭 on Learning & Writing!Hugo -- gohugo.iozh-cnThu, 09 May 2019 00:00:00 +0000致儿子成人礼的一封信https://sbabybird.github.io/p/%E8%87%B4%E5%84%BF%E5%AD%90%E6%88%90%E4%BA%BA%E7%A4%BC%E7%9A%84%E4%B8%80%E5%B0%81%E4%BF%A1/Thu, 09 May 2019 00:00:00 +0000https://sbabybird.github.io/p/%E8%87%B4%E5%84%BF%E5%AD%90%E6%88%90%E4%BA%BA%E7%A4%BC%E7%9A%84%E4%B8%80%E5%B0%81%E4%BF%A1/<p>序言我儿,见信如面。在这个即时通讯如此发达的时代,我选择写一封长信,以表示对你即将成人的祝贺。</p> +<p>我陷入沉思了一会儿,考虑该给你讲些什么道理。但我很快意识到,“道理”这种东西,靠听和说没有用,只能自己去感悟。而我自己也十分讨厌被说教,所以我会克制想要给你讲一番大道理的冲动,尽量避免不对等的交流形式。</p> +<p>我想我还是跟你分享一些我对这个世界的思考和想法吧。</p> +<p>茨威格在《人类群星闪耀》中写到“一个人最幸运的事情就是在他思想最活跃、精力最充沛的时候找到了他的人生使命”。看来大家都把寻找人生使命当做比较重要事情来看待。姑且就当做我这封信的主题吧。</p> +<p>寻找人生使命本质上是通过尝试在一些方向上的努力来实现对人生价值和意义的探索,每个人或多或少、或深或浅都要做这样的尝试。</p> +<p>你们学校把“成人礼”包装成一个重要的人生节点,想必是希望给你们一些感觉,让你们意识到,从这一刻起,你们开始对自己的行为负责,要开始尝试去寻找和探索了。</p> +<p>那么该如何去探索,我有一些自己的看法。</p> +<p>首先要相信一点,那就是无论是否还在上学,学习和完善自己都是一辈子的事情,不存在一个可以停止学习的时间点。就我个人来说,无论是读大学的时候还是参加工作以后,从来没有在提升自己方面有过松懈的想法,甚至我感觉工作之后对知识的渴望更加强烈了,学到的东西也比在校园里多得多。</p> +<p>当然了,学习方式跟你目前在学校这种还是差别挺大的,强度也没有那么辛苦。而且工作之后的这种学习方式才是我最认可的方式。什么方式?</p> +<p>我们一起讨论过几次王阳明的“知行合一”,为了不扯那么远,简单来说,刚才提到的学习方式就是老王早就提出的“事儿上练”。通过不断地实践,各种经历,才是学习知识的源泉。这也是为啥我在开头就说道理只能感悟不可说教,怎么感悟?事儿上感悟!经历多了自然懂。</p> +<p>所以也不用一下子被“寻找人生使命”这种“宏大话题”给吓住了,保持学习的心态,放松大胆地去经历各种事情,就是这么个过程。</p> +<p>然后呢,就是在做事的过程中,保持一颗善良、为他人多着想的心。关于这一点,我的体会是,“助人为快乐之本”真的不是一句空话。远的不说,你看你爷爷奶奶平日里多么乐于助人,用乐善好施形容他们一点儿也不为过。他们因此收获了广泛的认可,也给这个家庭带来了积极向上的生活氛围,对你老爹我向好的方面发展也起到了关键作用。</p> +<p>再有一点,也是我个人非常推崇的,就是最好能时刻对世界保持强烈的好奇心。</p> +<p>刘慈欣在短篇科幻小说《朝闻道》中讲了一个故事。外星高等文明在监视地球人类进化的过程中,距离现在几十万年前的一个原始人抬头望了望夜晚的天空,凝视了一会儿。这看似随意的行为使得外星人的警报器响了起来,因为这意味着,人类的好奇心已经发展到了星空,同时也意味着人类文明将要开始爆发式发展了。可见好奇心的重要。</p> +<p>好奇心一方面是推动我们前进的动力,同时也使得我们平凡的生活变得不那么枯燥。</p> +<p>你能经常提出一些有时连我都无法回答的问题,这让我也颇感欣慰,有些答案注定要自己去摸索着发现,我希望你能多多提问,也多自己思考,不用去管答案是什么。</p> +<p>稀稀拉拉写了这么多,估计你也不能理解太多,我像你这个年纪时估计也理解不了。不过也没关系,只是给你讲讲我个人通过思考得到的观点而已,说不定你自己以后有不同的发现,当然如果能在你以后的发展中起到一点儿提醒作用,也就挺好了。</p> +<p>希望你这次“成人礼”活动就像人类文明那一次一次对星空的凝望那样,使你能够进入人生的一个新的高速发展阶段。</p> +<p>祝:学习进步,健康成长!</p> +<p>二零一九年五月九日 写于贵阳机场</p> \ No newline at end of file diff --git "a/tags/\345\256\266\345\272\255/page/1/index.html" "b/tags/\345\256\266\345\272\255/page/1/index.html" new file mode 100644 index 000000000..d47003835 --- /dev/null +++ "b/tags/\345\256\266\345\272\255/page/1/index.html" @@ -0,0 +1 @@ +https://sbabybird.github.io/tags/%E5%AE%B6%E5%BA%AD/ \ No newline at end of file diff --git "a/tags/\345\271\264\345\272\246\346\200\273\347\273\223/index.html" "b/tags/\345\271\264\345\272\246\346\200\273\347\273\223/index.html" new file mode 100644 index 000000000..80825060d --- /dev/null +++ "b/tags/\345\271\264\345\272\246\346\200\273\347\273\223/index.html" @@ -0,0 +1,31 @@ +Tag: 年度总结 - Learning & Writing!

Tags

年度总结

+ \ No newline at end of file diff --git "a/tags/\345\271\264\345\272\246\346\200\273\347\273\223/index.xml" "b/tags/\345\271\264\345\272\246\346\200\273\347\273\223/index.xml" new file mode 100644 index 000000000..709d05013 --- /dev/null +++ "b/tags/\345\271\264\345\272\246\346\200\273\347\273\223/index.xml" @@ -0,0 +1,37 @@ +年度总结 on Learning & Writing!https://sbabybird.github.io/tags/%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/Recent content in 年度总结 on Learning & Writing!Hugo -- gohugo.iozh-cnWed, 10 Feb 2021 00:00:00 +00002020年个人总结https://sbabybird.github.io/p/2020%E5%B9%B4%E4%B8%AA%E4%BA%BA%E6%80%BB%E7%BB%93/Wed, 10 Feb 2021 00:00:00 +0000https://sbabybird.github.io/p/2020%E5%B9%B4%E4%B8%AA%E4%BA%BA%E6%80%BB%E7%BB%93/<h2 id="保持好奇心">保持好奇心</h2> +<ul> +<li>大概是2011年左右,我把QQ签名改成了“好奇、求知、创造”,从此再也没有改变过,我所喜欢的、热爱的、欲罢不能的事情,都被这三个词涵盖了。</li> +<li>十年过去了,很高兴自己还能保持一颗探索未知、热爱学习的心。</li> +</ul> +<h2 id="读书">读书</h2> +<ul> +<li>现在听书比读书所占比重大,阅读时间缩水明显,翻开电子书的时间都有限,更别提手不释卷。</li> +<li>年初重温《三体》,即便很多情节已烂熟于心,重读仍有新发现,休闲阅读而已,只为放松大脑。</li> +<li>其余时间陆续阅读一些杂书《原则》、《随机漫步》、《菜根谭》、《曾国藩传》等若干。</li> +<li>唯一触动较大的是年末再次翻看《计算机程序的构造和解释》,此次配合网上的公开课视频进行,跟随原书作者课程讲解节奏,对于知识的理解大有帮助,视频虽然年代久远,但知识历久弥新,比起科技业广泛应用的新兴技术,书中的计算原理以及相关的思想更像是对应了武术的“内功心法”,一旦有所突破,则在上层应用产生巨大的提升,与工作学习都大有裨益,其中玄妙不可言说。</li> +</ul> +<h2 id="摄影">摄影</h2> +<ul> +<li>户外活动大为减少,往年春天乃摄影高产期,今年却苦于疫情无法外出,摄影爱好被迫搁置,2020年对摄影技术的练习几乎停滞,无心仪作品产出。</li> +<li>卡片相机已很少使用,手机拍摄已是主流,器材追求已解毒,但如有更新的街拍机问世,心头恐怕还是会痒。</li> +<li>有一事可提,今年独自吃饭次数很多,每次都拍食物照一张,累积下来一年竟拍了几百。</li> +</ul> +<h2 id="生活">生活</h2> +<ul> +<li>压力与机遇并存,最大收获是面对挫折、困难更坦然,2020不愿多提。</li> +<li>记忆力确实有下降之趋势,回忆起来竟无亮点,亦可能本身就比较平淡。</li> +<li>发现凡事都要低调不吭声的重要性,切记四处宣扬,否则就会出现“说出来就不灵”的魔咒。</li> +</ul> +<h2 id="学习">学习</h2> +<ul> +<li>对8bit老古董计算机的兴趣不减,四处搜寻相关知识,弄了一大堆模拟器,研究过程中竟对之前所学计算机组成原理有了新的认识和理解,喜出望外,本该大学之时就应掌握的技能,到现在再学也不迟,重在理解。</li> +<li>创意类软件如blender等也持续浅尝,进步缓慢,但入门已没问题,缺少作品练习,安排即可。</li> +<li>儿子已入大学,借用假期时间,我教他编程,他给我讲解高数,算是技能交换了,费曼学习法的一个很直接的应用案例。</li> +<li>越发觉得B站是个学习的好地方,该站以后的发展不可估量,但从教育来看,很可能迅速超越国内二流大学,或者未来改变大学的形态也未可知。</li> +</ul> +<h2 id="后续计划">后续计划</h2> +<ul> +<li>希望可以继续通过写字记录学习的知识,保持一定量的文字输出,如条件实在有限,配合语音录音也可。</li> +<li>在自己热爱的事情上,持续学习,关注一下作品输出(持续开新坑),早日成为心目中的“全栈工程师”、“三级工程师”(可参见吴军《硅谷来信》中的定义)。</li> +<li>限制烟酒摄入,保持每日的活动量,能走路就不坐车。</li> +</ul> \ No newline at end of file diff --git "a/tags/\345\271\264\345\272\246\346\200\273\347\273\223/page/1/index.html" "b/tags/\345\271\264\345\272\246\346\200\273\347\273\223/page/1/index.html" new file mode 100644 index 000000000..de33f7307 --- /dev/null +++ "b/tags/\345\271\264\345\272\246\346\200\273\347\273\223/page/1/index.html" @@ -0,0 +1 @@ +https://sbabybird.github.io/tags/%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/ \ No newline at end of file diff --git "a/tags/\345\277\203\345\276\227/index.html" "b/tags/\345\277\203\345\276\227/index.html" new file mode 100644 index 000000000..5cd290579 --- /dev/null +++ "b/tags/\345\277\203\345\276\227/index.html" @@ -0,0 +1,31 @@ +Tag: 心得 - Learning & Writing!

Tags

心得

+ \ No newline at end of file diff --git "a/tags/\345\277\203\345\276\227/index.xml" "b/tags/\345\277\203\345\276\227/index.xml" new file mode 100644 index 000000000..8654c761a --- /dev/null +++ "b/tags/\345\277\203\345\276\227/index.xml" @@ -0,0 +1,5 @@ +心得 on Learning & Writing!https://sbabybird.github.io/tags/%E5%BF%83%E5%BE%97/Recent content in 心得 on Learning & Writing!Hugo -- gohugo.iozh-cnThu, 19 Jul 2018 00:00:00 +0000事如春梦了无痕https://sbabybird.github.io/p/%E4%BA%8B%E5%A6%82%E6%98%A5%E6%A2%A6%E4%BA%86%E6%97%A0%E7%97%95/Thu, 19 Jul 2018 00:00:00 +0000https://sbabybird.github.io/p/%E4%BA%8B%E5%A6%82%E6%98%A5%E6%A2%A6%E4%BA%86%E6%97%A0%E7%97%95/<p>上苍保佑吃饱饭撑着的人,中午吃完饭抽烟的时候,刷了几页微博,可能跟我关注的人有关(我一般关注段子手或者文艺思想贩卖者),感觉内容作为消遣挺合适,但是越看呢,越觉得没有营养,可能是跟我刚抽完烟进入贤者时间有关,一把把微博推开的时候(合上屏幕),心里竟涌现出一句“都是吃饱了撑的”,用以评价刚刚看过的几段不痛不痒的文字。</p> +<p>发完感慨随即想到,这句话是不是可以作为一本非常扯淡的书名呢?然后开始畅想自己写一本这样的书,里面的内容天马行空,多为吃饱了没事儿干的人才会忧伤和考虑的事情,饱暖之后各种忧虑和焦躁的事情可以化作各种思考,用于填满本书,作为同病相怜者证明自己不再孤独的弹药,一旦物质状态不能满足,则书中的内容立即退化到可有可无的状态。</p> +<p>真的,我这两三年来,刷牙沉思录这种哗众取宠的段子写了不少,缺少深度的技术文章也写过几篇,以吃饱了撑着来进行衡量的话,还真的比较符合标准,如果加以艺术润色的话,真难说能不能包装成为一本具备贩卖价值的书,至少想到这个问题之后,被自己震惊了一下,进一步对人生需求的几个层次有了切身认识。</p> +<p>无论我再怎么黑自己,有一点是不会改变,我写的那些东西至少保留了我一部分的回忆,它们记载了我在某一段时期内的心智情况,无论是用词还是造句,都能从一个侧面反映我当时的状态。而我的人生正是由若干个这样的状态所组成,随着年龄的增长,我的记忆力会越来越差,如果能够多记录一些东西下来,就算是那种吃饱了撑着才能思考的问题,也将使未来的我读起来热泪盈眶。</p> +<p>不过信息世界的问题在于,资料保存的永久性很不靠谱,说不定哪天这些信息就不在了(我写在msn空间的博客一篇也没了),甚至安全性还比不了一个纸质的笔记本,但我仍然不做过多的努力和担忧,倘若保存良好,那就作为未来回忆的佐料,倘若不幸丢失了,那就随他去吧。因为在写这些东西的同时,我已经感受一次生活了,本来也是留不住的东西,事如春梦了无痕嘛。</p> \ No newline at end of file diff --git "a/tags/\345\277\203\345\276\227/page/1/index.html" "b/tags/\345\277\203\345\276\227/page/1/index.html" new file mode 100644 index 000000000..6a9974f32 --- /dev/null +++ "b/tags/\345\277\203\345\276\227/page/1/index.html" @@ -0,0 +1 @@ +https://sbabybird.github.io/tags/%E5%BF%83%E5%BE%97/ \ No newline at end of file diff --git "a/tags/\345\277\203\346\203\205\351\232\217\347\254\224/index.html" "b/tags/\345\277\203\346\203\205\351\232\217\347\254\224/index.html" new file mode 100644 index 000000000..9c7e3223f --- /dev/null +++ "b/tags/\345\277\203\346\203\205\351\232\217\347\254\224/index.html" @@ -0,0 +1,34 @@ +Tag: 心情随笔 - Learning & Writing!

Tags

心情随笔

+ \ No newline at end of file diff --git "a/tags/\345\277\203\346\203\205\351\232\217\347\254\224/index.xml" "b/tags/\345\277\203\346\203\205\351\232\217\347\254\224/index.xml" new file mode 100644 index 000000000..29ece8358 --- /dev/null +++ "b/tags/\345\277\203\346\203\205\351\232\217\347\254\224/index.xml" @@ -0,0 +1,216 @@ +心情随笔 on Learning & Writing!https://sbabybird.github.io/tags/%E5%BF%83%E6%83%85%E9%9A%8F%E7%AC%94/Recent content in 心情随笔 on Learning & Writing!Hugo -- gohugo.iozh-cnTue, 13 Nov 2007 00:00:00 +00002007-11-13https://sbabybird.github.io/p/2007-11-13/Tue, 13 Nov 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-11-13/<p>有几年不用Winamp了,最近Winamp又退出了10周年纪念版版。我下载了一个,感觉听听里面的网络电台什么的还挺不错的(边上班边听欧美最流行的音乐哈)。而且新版还包含了podcast的功能,可以搜索订阅网上的播客。在家听音乐的话,我还是选择foobar。</p> +<p>&ndash; +由 sbabybird 于 11/08/2007 07:49:00 下午 在 从容地狂奔上发表</p>2007-08-28https://sbabybird.github.io/p/2007-08-28/Tue, 28 Aug 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-08-28/<p>偶然翻看书架上的旧书,发现我以前在上面随手胡乱写了一个“梦幻配置”,那时应该是2000年,根据当时的硬件发展状况,我写了一个可望而不可及的硬件配置。具体什么配置就不说了(大概就是纯平显示器、笨三的cpu),反正现在让你用你还嫌慢呢。现在六、七年过去了,心里又痒痒的,就让我再写一个可望而不可及的硬件配置吧,看看这个配置何时会过时。</p> +<p>中央处理器:Intel Core2 Quad processor Q6700(4核,为了安静,散热采用水冷系统)</p> +<p>主板:Intel D975XBX2</p> +<p>内存:海盗船 TWIN2X2048-6400 ×4(共8G)</p> +<p>外存储:SanDisk 64G闪存硬盘(用于系统存储),2TB磁盘阵列(用于文件存储)</p> +<p>显卡:丽台NVIDIA Quadro FX 5600 ×2(每块显卡可接四台屏幕)</p> +<p>主显示器:Apple 30&quot; Cinema Display(上网、影视、游戏)</p> +<p>副显示器:Apple 20&quot; Cinema Display ×6(地理、虚拟现实、平面设计等)</p> +<p>Creative Sound Blaster X-Fi Elite Pro+罗技Z5500(用于电影、游戏、非专业录音)</p> +<p>主板数字光纤输出+外置解码器+JBL监听音箱(用于欣赏音乐)</p> +<p>操作系统:自己动手定做(编译)Linux版本,桌面环境采用GONE(如果有兴趣就自己写个操作系统)</p> +<p>备注:机箱易采用高厚度、高散热静音机箱,此系统搭建完成后将用于书房,共七台显示器需要用到特殊的显示器支架。</p>2007-08-04https://sbabybird.github.io/p/2007-08-04/Sat, 04 Aug 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-08-04/<p>不知是不是因为升级还没有进行完成,最近live spaces总是不能正常操作,用firefox访问有时还会出现乱码或者页面布局乱套,速度慢的惊人,资源占用很厉害。再加上他有太多的限制,这些问题都让我感到对live space失望透顶。衷心希望Google blogger能够早日解封!</p>2007-08-03https://sbabybird.github.io/p/2007-08-03/Fri, 03 Aug 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-08-03/<p>昨天去电影院看了《憨豆先生的黄金周》,感觉还不错,憨豆先生还是那么滑稽可乐,有着独特的幽默方式,我虽然没有笑到肚皮抽筋、掐着大腿,但是90分钟的电影还是让我由衷地笑了半个小时(累计)。这里就不介绍剧情了(一般来说这种喜剧基本没剧情可言),网上到处都是介绍。整个影片从头到尾憨豆先生都拿着那只SONY新出的DV,我估计SONY投了不少钱,还有就是片子的音乐配的还可以,轻快明亮。总的来说还值得一看。 +handouhandou2</p> +<pre><code> ps:现在的电影院真是不景气啊,能容纳500号人的大厅坐了不到100人,不过挺爽的,谁让他们把票价订的那么贵,现在的票价是我小时候电影票价的100倍</code></pre>2007-07-29https://sbabybird.github.io/p/2007-07-29/Sun, 29 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-29/<p>对于我来说,理发是件很痛苦的事情,可能是有心理障碍吧。小的时候被老爸强行摁住理过一次发,我像一只小鸡那样被夹在腿上无力反抗,由于整个过程我都在不停地叫骂那个理发的,所以那家伙下手还不含糊,把推子使得嚓嚓直响,对着我的头皮和耳朵可劲儿招呼。整个过程是漫长的、痛苦的、令人发指的。最后我看着镜子里的凸了吧唧的头,还不忘使劲儿拧了一把鼻涕抹在老爸的裤腿上。此事后来成为笑谈,但爷儿俩在理发这种事情上一直都持有不同的观点,当然了,我还只能提出强烈抗议、强烈不满、强烈谴责,但采取进一步措施的权利还是保留了。一直到现在,当老爸跟我说:“快去把头发理一理!”时,我还是乖乖的狂奔去理发。</p> +<pre><code> 不过,现在我离老爸远了,他管不了啦(主要是没看见),我可以尽情地把头发留到很长,然后再一下剪到很短(一般是回老家之前)。但是我的这种习惯却造成了另一件事情,给我理发的人极度不爽。每当我拖着留了几个月的长发走进理发店,告诉理发的师傅给我可劲儿剪短时,伊总是很扭捏,假惺惺地跟我说:“哎呀!你的发质这么好,又好不容易留了这么长,剪了多可惜啊!”其实谁不知道伊是想省点儿事儿,想拿剪刀在那三下两下剪完糊弄我。于是我只好说:“嗯嗯,本来是想留长的,但是现在突然想开了,不想留了,还是麻烦您给我剪短吧!”最后等着人家极不情愿(还很费时)地给我剪完,我才满意离去。但是这招下次就不能用了,所以我总是选择不同的理发店,反正这玩意儿多得是! +今天我又理发了,从五一到现在大概有三个月了,很抱歉,又让一个理发师傅不爽了一把,不管他,这次理完了,谁知道我什么时候有心情理下回呀!</code></pre>2007-07-24https://sbabybird.github.io/p/2007-07-24/Tue, 24 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-24/<p>天气这么闷热,生活这么枯燥,何不搞点小把戏调剂一下气氛呢?要是你现在刚好在办公室里,那么恭喜你了,下面我将教你几个在下秘密收藏的整蛊手段(一般人我不告诉他)。</p> +<pre><code> 前提条件:1、你们用计算机办公;2、你们使用的是Windows操作系统;3、你要整蛊的同事没有暴力倾向;4、他刚好暂时离开一下。 +好了,准备好了就开始行动吧! +场景一:“我的密码被改了?!” +如果你的这位同事有锁定计算机的习惯,那就刚好实施一下,在他计算机的锁定状态下的密码框里提前敲入一个空格,这样一般他回来时不会发觉,等他输入完自己的密码后,会发现进不去了!(因为密码前面多输入了一个空格)。 +场景二:“用来干活儿的软件没有反应了!” +如果他没有锁定计算机的习惯,那么刚才那个办法就不凑效了,怎么办呢,找到他用来工作的软件(VC,Word、Excel等),把帮助菜单里的“关于(about)”对话框给打开,然后用鼠标把对话框拖动到一个屏幕上看不见的地方。哈哈,等着吧,他回来会发现他用来工作的软件怎么也不听话了,无论点击哪儿都没有反应。 +场景三:“鼠标不好使了” +现在大家都用光电鼠标了,而光电鼠标全靠它屁股底下的那个激光眼,没错!你又猜对了,拿个小纸团把它那个小眼睛堵住,赶紧去吧!鼠标瞎了之后就罢工了。 +以上方法屡试不爽,我都亲自实验过,不过是别人在我身上实验的(这帮败家玩意儿)。 +</code></pre> +<p>注:以上操作纯属娱乐!产生后果自负。</p>2007-07-23https://sbabybird.github.io/p/2007-07-23/Mon, 23 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-23/<p>我手里这个Nokia 6230用了3年了,买的时候多加了一块电池。前两天,其中一块电池寿终正寝了,剩下的这块也差不多了,感觉就像我的胃,一吃就饱,一会儿就又饿了。我看着手里这个灰头土脸得就像从垃圾桶里捡回的手机,不禁有了换掉它的念头。</p> +<pre><code> 到网上翻了翻信息,结果让我很失望,感觉Nokia不太长进,眼看着人家索爱扛着音乐、摄像的大旗在市场上占了一席之地,自己也跟着别人的屁股转,也在那儿搞音乐手机、摄像手机,却忘了自己的特色。没办法,别的牌子不愿意用,老N最近推出的新机不是我看不上就是我的钱包不让看(靠,就这还敢冒充Nokia的粉丝呀?)。苹果的iPhone最近倒是炒得挺火,看起来也挺不错,可是总觉的那玩意儿离咱太遥远了,还是不多看了,以免中毒。 +在查看了众多机型之后,长叹一声:“究竟什么样的手机才能让我满意呢!” +</code></pre> +<p>总结以下大概要满足以下几点: +1、屏幕要足够大、分辨率不用极高但也不能太低 +2、反应速度一定要快(目前我还没有发现一款智能手机反应速度飞快) +3、个头不能太大、重量不能太沉 +4、电话、短信功能好用 +5、电量一定要持久,待机越长越好(这点最重要,功能再强没电也是白扯) +6、非国产(这个不用多说)</p> +<pre><code> 这些要求不过分吧?像什么摄像、音乐等功能都没要求,可愣是找不到这样一款手机,反复对比后发现还是目前手上的这个更合要求一些。算了,将就用吧。结果,昨晚做梦,梦见我也设计了一款手机,以上条件除了第六条其余都满足,取名就叫“nbPhone” 把苹果的Phone的风头给压下去了,乔布斯都跟我急了。</code></pre>2007-07-21https://sbabybird.github.io/p/2007-07-21/Sat, 21 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-21/<p>一个胖子,一个相貌平平而且豁牙的胖子,一个相貌平平而且豁牙的卖手机的胖子。这样的人参加选秀节目,如果你是评委的话,你会让他通过海选吗?如果他告诉你他要表演的是歌剧的话,你会跳下评委台把它踢出演播厅吗?!我想你会的,因为当时英国的那个选秀节目的评委也是这样想的。</p> +<pre><code> Paul Potts,这个我刚刚看到的英国小伙子,就是这样参加选秀节目的。当他极不自然地站在舞台上,傻傻地告诉评委他要表演歌剧,评委们都笑了,表现得有些不耐烦。可是,当他深情地唱起今夜无人入眠,当他那与帕瓦罗蒂一样激昂的男高音在演播厅响起时,赛场沸腾了!所有的人都站了起来,评委刁在嘴里的铅笔掉了下来,掌声雷动! +这段由朋友发过来、我甚至懒得看的视频,看得我头皮发麻。在起了一身鸡皮疙瘩后,我的眼睛也不争气地湿润了(震撼,感动)。看了别人写的介绍,我了解到,这个叫Paul的小伙子有着不太顺利的人生际遇(大多数人如此吧),但是他从未怀疑过自己的理想,仍然执着地追求着歌剧表演的艺术魅力,直到他被生活所逼而不得不靠卖手机来糊口时,仍未放弃!终于,上天给了他最后一次机会,他成功了,他向世人再一次的证明了:真正牛逼的人,终究会牛逼起来! +</code></pre> +<p>试了一下,msn的空间居然还可以插入视频!</p>2007-07-20https://sbabybird.github.io/p/2007-07-20/Fri, 20 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-20/<p>我都已经好几天没有照看我的msn空间了(最近太累),今天访问一下,发现界面居然有了变化(别三日,刮目看),嗯哼,原来是微软的Live小组把咱的空间给升级了。</p> +<pre><code>首先是界面的整体风格有了改变,我审美不行,看不出是好看还是难看,感觉貌似顺眼一些。空间上方仍然悬挂着那个大大的广告条(我一直看它不爽),工具条的宽度变宽了,这样会占用更多的空间。进入空间的“自定义”功能,发现提供的模板多了一些,但一个比一个不耐看,所以我什么也没有动,继续保持现状。一直希望Live空间能够提供类似WordPress那样的模板(多漂亮啊),现在看来,要走的路还比较长(Live小组继续加油啊!)。 +不过话又说回来,空间里整那么多花里胡哨的东东也没用,看得让人眼花缭乱的也不爽,我还是喜欢简约一点的风格,最好是让人进入我的空间后,感觉就像是打开了windows的记事本(过分了吧)。本来Google提供的那个blog挺好的,可是总是不能访问,还是老老实实的在微软提供的共享空间里得瑟吧。 +最后,再鄙视一下我自己,这几天由于懒惰而没有更新空间的内容,太不像话了!</code></pre>2007-07-19https://sbabybird.github.io/p/2007-07-19/Thu, 19 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-19/<p>随着一阵悦耳的下班铃声,我提前结束了一天的工作,按照惯例,周末了,要去打球。叫上同事,抱起篮球,飞快地奔向球场。终于逃脱了闪烁的计算机屏幕,逃脱了无聊的工作计划,逃脱了漫长的会议,逃脱了郁闷的代码&hellip;&hellip;</p> +<pre><code>各位观众,各位听众,也许你们刚刚打开电梯,现在为您直播的是--火星杯篮球锦标赛!穿着运动鞋牛仔裤正在捡球的那家伙就是我,看呐,我在球场上尽情地狂奔,边打球边哼着歌曲“啊哼三分球,它在空中停留,漂亮的假动作,帅呆了我......哦shit!球丢了”。一口气打了两三个小时,直打到有人气喘吁吁,打到有人双腿抽筋,打到有人口吐白沫还不肯离去。天渐渐黑了,球框渐渐虚无缥缈起来,收拾家伙,撤! +走到站牌,有车,有座,爽!上了高速,一路畅通,爽!到了家里,贤惠的老婆已经把饭菜做好,菜做的色香俱佳,啤酒冰得温度适中。如果这个时候你问我,什么是幸福?我会自在地夹一口菜,然后再悠闲地喝上一口啤酒,眯起眼睛跟你说:“嘛儿叫幸福?介就叫幸福!”</code></pre>2007-07-12https://sbabybird.github.io/p/2007-07-12/Thu, 12 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-12/<p>加班后回家的路上,路灯十分昏暗,还没有吃晚饭,心情极度郁闷,我缓缓(没力气狂奔了)走向公车站牌,走着,走着,突然!一个黑影窜了过来,他跟我说:“兄弟,要盗版光盘不?”我没有理他,继续走,走着,走着,突然!又一个黑影窜了过来,他跟我说:“兄弟,要发票吗?”我没有理他,继续走,走着,走着,突然(靠,有完没完啊!)一大一小两个黑影窜了出来,原来是一个中年妇女领着一个七八岁的小女孩儿,夜色中看不清面目。小孩开口说话了:“叔叔,给点儿钱让我买吃的吧,我都饿了一天了&hellip;&hellip;”边说还边做有气无力状,大人也在一边附和。说得我心里一软,鼻涕快掉下来了,差点儿掏钱。但是转念一想,我TM也饿了快一天啦,也没吃饭呢,再何况,她们的行为也太让我愤怒了,因为就凭这些个破烂演技拿来唬我也太侮辱我的智商了吧!于是,我友善的冲她们说道:“小朋友,你看”我用手指了指马路,“往前走500米,那里有家派出所,你过去找警察叔叔要些吃的好不好?”小孩一时不吭声(台词没背下来),大人接着说:“你就可怜我们,给我们几块钱,买包方便面也行啊!”(我靠,我这么晚了还没吃饭,我求您别勾引我的食欲了!)我没办法,掏出手机,说:“既然你们不愿意亲自过去,那我帮你们打110吧&hellip;&hellip;”这句话还没有说完,说时迟那时快,只听得“嗖嗖”两声,两个人全都不见踪影,公车站牌下只剩下我和随风飘舞的碎纸片(好身手!)。</p>2007-07-06https://sbabybird.github.io/p/2007-07-06/Fri, 06 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-06/<p>听说google出了在线翻译的工具,而且还广受大家的好评,在美国举行的一次翻译比赛中还拿了冠军。我虽不是google的粉丝但也对google的产品挺感兴趣的,于是赶紧凑个热闹,看看伟大的google能不能给我带来惊喜。 +由于我只会中文,那就看看google的英译中的水平怎么样。废话少说,赶紧拿来一首英文歌词《you needed me》(我最喜欢的英文歌曲之一)。</p> +<p>You needed me</p> +<p>I cries a tear you wiped it dry</p> +<p>I was confused you cleared my mind</p> +<p>I sold my soul you bought it back for me</p> +<p>And help me up and give me dignity</p> +<p>Somehow you needed me</p> +<p>You gave me strength to stand alone again</p> +<p>To face the world out on my own again</p> +<p>You put me high upon a pedestal</p> +<p>So high that I could almost see eternity</p> +<p>You needed me, you needed me</p> +<p>And I can&rsquo;t believe it&rsquo;s you +I can&rsquo;t believe it&rsquo;s true</p> +<p>I needed you and you were there</p> +<p>And I&rsquo;ll never leave why should I leave</p> +<p>I&rsquo;d be a fool</p> +<p>Cause I&rsquo;ve finally found someone</p> +<p>Who really cares</p> +<p>You held my hand when it was cold</p> +<p>When I lost you took me home</p> +<p>You gave me hope when I was at the end</p> +<p>And turned my lies back into truth again</p> +<p>You even called me friend</p> +<p>You gave me strength to stand alone again</p> +<p>To face the world out on my own again</p> +<p>You put me high upon a pedestal</p> +<p>So high that I could almost see eternity</p> +<p>You needed me ,you needed me</p> +<p>Oh, yes, you need me</p> +<p>You needed me</p> +<p>先试了一下整段翻译,把歌词复制进去,出来的结果让我忍俊不禁</p> +<p>google自动翻译的文字:</p> +<p>你需要我,我喊了眼泪,你擦它干,我摸你清我心中我卖出 我的灵魂,你买回来,我和帮助我,让我有点尊严,你需要我你们给了我力量单独再次面对世界走出自己再次你就把我小时 在室内一个台阶那么高,我几乎可以看到永恒,你需要我,多欧需要我,我也不相信是你,我不能相信这是真的,我需要你和你的笔 在此,我永远不会离开,我为何要离开我就是一个傻瓜,我的事业总算发现有人真的三白族你握着我的手,当它冷时,我输了,你带我家,你给了我希望钨 母鸡,我是在年底把我的谎言放回真话的时候,你甚至骂我的朋友,你克须缴我力量单独再次面对世界走出自己再次你就把我高美 无源一个台阶那么高,我几乎可以看到永恒,你需要我,你需要我哦,多 欧需要我,你需要我</p> +<p>唉,比较失望啊,试一下google的翻译网页的功能吧,找到歌词的网页,然后让它翻译</p> +<p>你需要我 +I cried a tear我哭了眼泪 +You wiped it dry你擦它干 +I was confused我很困惑 +You cleared my mind你清除了我的心 +I sold my soul我卖我的灵魂 +You bought it back for me你买回来,我 +And held the earth召开地球 +You gave me dignity你给我尊严 +Somehow you needed me某种程度上,你需要我 +You gave me strength你们给了我力量 +To stand alone again单独再次 +To face the world面对世界 +Out on my own again出自己再次 +You put me high你把我高 +Upon a pedestal当佩服 +So high that I could almost see eternity如此高,我几乎可以看到永恒 +You needed me你需要我 +You needed me你需要我 +I can&rsquo;t believe it&rsquo;s you我不能相信这是你 +I can&rsquo;t believe it&rsquo;s you我不能相信这是你 +I needed you我需要你 +And you were there你有 +And I&rsquo;ll never leave, why should I leave?和我永远不会离开,我为何要离开? +I needed you我需要你 +can I finally found someone who really cares可我终于发现有人真正关心 +(You needed me)(你需要我) +You held my hand你牵我的手 +It was cold据冷 +And I was lost我失去了 +You took me home你带我家 +You gave me love你们给我的爱 +That I was at the end我是在结束 +I turned my life我把我的生命 +Back into truth again You even called me &lsquo;friend&rsquo;放回真话的时候,你甚至骂我&rsquo;朋友&rsquo; +You gave me strength你们给了我力量 +To stand alone again单独再次 +To face the world面对世界 +Out on my own again出自己再次 +You put me high你把我高 +Upon a pedestal当佩服 +So high that I could almost see eternity如此高,我几乎可以看到永恒 +You needed me你需要我 +You needed me你需要我 +You needed me你需要我 +You needed me你需要我 +Oh, yes, you needed me哦,你需要我 +You needed me你需要我</p> +<p>呵呵,这下看起来还像那么回事儿.感觉机器还是代替不了人啊.翻译有感情的东西总是那么生硬.</p>2007-07-04https://sbabybird.github.io/p/2007-07-04/Wed, 04 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-04/<p>统计了一下我平时上班所需要的时间,要是堵车的话大概要一个小时多一些,要是特别堵的话大概要两个小时,要是跑步的话大概得三个小时多一些(推算的,可以忽略),要是夜里打车去上班的话大概得二十多分钟(极少,也可以忽略)。所以我一天大概有三个小时是堵在路上的,这导致了我的胃口极差,身材日渐消瘦,远看像铅笔近看像挂历!每天我都要坐在车上长吁短叹:“GR的堵车啊!”</p> +<pre><code>是什么原因造成了这样的状况? 原因有很多种,我想最直接的原因可能就是因为路上出现了车祸。无论是蹭了一下车屁股还是挂了一下后视镜,双方都会停好车,把路占上,然后撅起屁股在那儿查看爱车的状况,最后再各自打电话叫人......这个时候你要是刚好在路上,你就会感觉你置身于车的海洋,一辆挨着一辆的汽车望不到头,一片喇叭声,让人透不过气来。每当我乘坐的公交车慢慢的拱过出事地点,往往还能看到出事的双方(或多方)在那儿撅着。这种情况每天都要出现,所以每天都要堵车。 +据说从8月7号到8月20号,北京的交通管制要进行奥运预演.这对我们这些挤公交车上班的来说真是莫大的好消息啊!我们又可以感受像去年中非论坛期间的那种一路畅通的超快感了!不过,快乐永远是短暂的,过了那几天,还是得老老实实的坐在车去上体验“堵车不堵心”。</code></pre>2007-07-02https://sbabybird.github.io/p/2007-07-02/Mon, 02 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-02/<p>最羡慕那些有米的音响发烧友,手里攥着大把的钞票,买音响器材出手阔绰,有没有一双“金耳朵”不知道,反正当音响店的老板告诉他“这套音响,在听蔡琴唱歌的时候能听见她咽吐沫的声音”时,或者跟他说:“那套设备,在听交响乐的时候可以听见拉琴那小子不小心把曲谱翻掉在地上的声音”的时候,他们就会毫不犹豫的掏出几千乃至几万块大洋,把那些“宝贝”搬回家,反复的回放,听听蔡琴在什么时候换了一口气,或者听听吹长笛的坐在第几排。</p> +<pre><code>我也曾在这方面痴迷过,但仅仅是痴迷,没有什么实质性行动,原因很简单,掏不起那些闲钱呐!不过,在很早以前,读初中的时候就开始摆弄那些“音响器材”了,只是一堆喇叭,功率很小,大部分是从旧收录机上拆下来的,“音源”也就只有卡带,我曾试着把喇叭放到各种地方以调整他们的“音效”,比如放在蚊帐上除了可以在睡眠时有音乐环绕外还兼具“驱蚊”的效果,我为了得到更多的低音也曾把喇叭嵌入到书桌里(整个桌子就是音箱哈),甚至把喇叭放到洗衣机里,那音质真是惨不忍听。反正受当时的条件限制,我也只能是像小孩摆弄玩具似的,玩一玩儿而已,毕竟当时升学才是最大的目标。 +直到有一天,我翻看一本旧音响杂志,有人自制了个音箱,据说效果还不错,于是就动了自己也做一个的念头。再后来,到了上中师的时候,有了大把的空闲时间(但还是没空闲的钱),决定纯手工制作一只“有源音箱”!说干就干,开始行动!首先考虑的是功放电路采用什么形式,当时最佳的方案是使用“LM-1875”功放芯片,但由于囊中羞涩,最终放弃,后来买来一块晶体管放大板,也算将就了,喇叭买了两只,一个高音,一个中低音(8寸),向我大舅要来了分频器。让老家木匠邻居帮忙做了个音箱的框架,剩下的就是我和我的一个哥儿们亲自动手了。箱体的材料比较奢侈,把我家的一个桌子给锯了(靠!太过分了)。后来组装的时候才发现,我竟然忘了考虑功放的前级,没办法,再次求救与大舅,从旧收录机上拆下来一块板子作为前级(居然还可以调高低音调)。 +就这样,前前后后忙活了有半个星期,我的音箱终于发出处女声了,这个时候音源已经是一台VCD,那个时候我好像对蔡琴不感兴趣,于是先听了一首陈慧娴的《归来吧》,真是天籁啊!我当时感动的鼻涕都快掉下来了!当然了,我这么说是有一些夸张,其实音质不咋地,只是当时又没听过真正的音响,这只亲手做的音箱,让我体验到了充足的低音(说到低音,要感谢我的姥爷,他给了我一只大号的电源,具体功率不知道,反正很大很大),震耳欲聋的低音,就像是有人拿着锤子在敲打我的胸膛。 +这只音箱在当时带给了我无限的快乐和满足感,后来就去省会读大学了,买了电脑,买了几百块的音箱,那只音箱就被我扔到了角落,上面布满了灰尘。再后来,我干脆把它送给了我的大舅,听说他现在拿它当板凳,还挺结实的!</code></pre>2007-07-01https://sbabybird.github.io/p/2007-07-01/Sun, 01 Jul 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-07-01/<p>国外新兴一个叫Twitter的Web2.0站点,听说最近很火爆,很多人在那里叽叽咕咕,说一些有想法但又不至于发一篇bolg的“废话”。我去看了一眼,感觉跟那帮人文化差异挺大的也就没好意思去注册,但是国内的同志们也不示弱,一时间模仿该网站理念的站点如雨后春笋般涌现。在这些国内的叽咕站点里,有朋友就给我推荐这个“饭否”,说是一个迷你Blog,像Twitter一样,只是大家都是中国人,叽咕的内容比较容易懂一些。我这个人最爱尝鲜,就忍不住过去注册了一个帐号。</p> +<pre><code>感觉还不错,可以绑定MSN,QQ等IM软件,方便通过IM软件在上面发言,甚至可以绑定手机,让你随时随地的把感受发到网上。人气还是挺旺的,不断有人在上面喃喃自语,也不乏有一搭没一搭的聊天者。发布的内容可以很无聊,比如“今天的天气真好”,也可以很有深度,比如“你们好啊,地球人!” +呵呵,由于没用多久,所以还不能多加评论,我怀我有自闭的倾向,现在有了“饭否”,偶尔在里面发一下实时的感受,发泄一下心情而已,就当我是面对着墙壁在一个人喃喃自语吧。</code></pre>2007-06-30https://sbabybird.github.io/p/2007-06-30/Sat, 30 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-30/<p>早晨起来,像往常的周六一样,来到公司加班。打开电脑,然后习惯性的访问我的msn空间,“该页无法显示&hellip;.”,不会吧,难道是网络断开了?没有啊,空间主页还是可以访问的,怎么一切换到我的空间就“该页无法显示”了呢?强制刷新浏览器还是不行,随便点了一个朋友的空间,可以访问。完了!莫非我的msn space被封掉了?</p> +<pre><code>上网搜索一下,看看有没有出现同样问题的朋友,结果显示msn space无法访问是常有的事儿,很多人都有过类似经历(国内用户),这其中的原因不言自明啊!我开始回忆,在我的日志里面到底有没有不该出现的敏感词汇?想了半天,答案是没有。可是要说是msn sapce的故障吧,别人的空间又是可以访问的,无奈只好跟微软的客服发了封电子邮件,暂时还未收到回复。 +我刚开始写网络日志,不为影响别人的看法,只为记录一下暂时的心情,本以为放到网上比放在本地还安全(相信微软的技术水平),结果还给我来这一手,想记录的时候却无法访问了,弄的心里还挺难受,担心以前的日志会不会丢掉啊! +</code></pre> +<p>ps:就在刚才,它又突然可以访问了!</p>2007-06-29https://sbabybird.github.io/p/2007-06-29/Fri, 29 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-29/<p>今天又一次雨中漫步,原因很简单,受天气预报的干扰我又没带伞(干嘛要说又呢?)。拿起背包从容地奔向车站,嘴里也不忘哼着:“我能想到最郁闷的事~~,就是下雨却没有带伞~~”。淋雨就淋雨吧,挤上车,去思考一个很严重的问题,我的晚饭吃什么?别笑!这确实是一个很严重的问题。我不能像老婆在身边时那样说:“随便吧,做啥吃啥”(虽然心里想着最好炒两个菜,再冰上一瓶啤酒)。自己动手去做的话,倒不是嫌麻烦,只是吃我做的晚饭简直是虐待自己(大饼卷着馒头沾着米饭吃)。</p> +<pre><code>吃晚餐在我眼中确实是非常重要的事儿,平时上班的时候,早饭总是很虚无缥缈,不堵车的时候就慢慢坐在包子铺里吃包子,堵车时就没准儿了,也许是一个鸡蛋饼,也许是一个肉夹馍,也许,也许只有一杯开水。午饭就是普通的工作餐,千篇一律,除了米饭还是米饭。所以说,一日三餐也就晚饭是顿饭,我把吃晚饭看作是一件很神圣的事情,虽然不必在每次吃晚饭前都焚香沐浴,但我也在吃饭前做个深呼吸,抛开一天的烦恼,菩萨保佑、阿弥陀佛、无量天尊、阿门!感谢上天又让我吃了一顿晚饭!然后就对生活重新燃起热情,对工作又重新充满信心,活着不就是为了这顿晚饭嘛! +可是,现在,我看了看车窗外,雨停了,道路渐渐不再拥堵,我的胃却越来越堵,没有胃口,吃还是不吃,这是个问题。下了车,路边的麻辣烫小摊熏得我的胃一阵抽搐,不远处的油炸臭豆腐老板正在卖力的吆喝,卖盗版书的小贩倒是省事儿,在大喇叭里循环播放“六块一本儿,随便挑随便拣......”,喊得我头晕眼花,我真想冲过拿起他的喇叭然后在空中抛一个完美的弧线。 +还是那个晚饭情节,不想在外面饭馆里吃,尤其是一个人在饭馆里吃。 +拿起馒头,就着音乐和啤酒...... +</code></pre> +<p>pijiu</p> +<p>我怎么会舍得你走, +这一去竟是几个秋冬 +请你好好珍重 +无须挂念我太多 +我的爱和从前一样 +这承诺当是万般重要 +尽管容颜会老 +这一生无以为靠 +我还是会爱你到老 +我不会让你苦恼 +也许我始终无法释怀 +我会假装一切都好</p>2007-06-28https://sbabybird.github.io/p/2007-06-28/Thu, 28 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-28/<p>偶然在diglog里发现了鲜果在线这个网站,名字很好听,于是乎,我就点击进去看了看。看了之后真有一种相见恨晚的感觉,这个站点本身不提供什么信息,只是提供一个在线的RSS阅读器,而且它提供的RSS频道都是根据大家的兴趣和订阅量进行排序的,也就是说,看某个频道的人越多,该频道就越靠前。这样就可以看到大家都喜欢看的东西,那些垃圾信息不会浮上来了(感谢Web2.0啊!)。</p> +<pre><code>在线阅读的操作也十分简单容易上手,而且界面清爽,有比较强大的自定义功能(我靠,怎么这么像托儿啊),我订阅了一些精品的频道,比如Engadget、Solidot、cnBeta等,顺便订阅了王小峰的“不许联想”(这个博客比较能扯淡,这算是夸他了)。这下就不用Firefox的rss阅读器了,直接把订阅的频道放在鲜果在线里存储到网上,在家和在公司都能看到同样的新鲜信息了,重装系统也不怕,把东西都放到网上,我想这也是以后互联网发展的趋势吧...... +</code></pre> +<p>ps:其实我早就把收藏的网址也放到网上了,在Firefox里安装一个扩展&ndash;yoono,这个插件也很牛,有点儿像美味书签(del.icio.us),不过yoono最近增加了收藏整个网页的功能所以比较起来就更喜欢yoono。</p> +<p>分享:</p>2007-06-27https://sbabybird.github.io/p/2007-06-27/Wed, 27 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-27/<p>雨后的空气格外清新,天气还没有完全放晴,乡间的柏油路上还是湿的,远处缓缓驶来一辆摩托车,骑车的人叼着烟,看起来懒洋洋的,十分惬意,没错,那就是我。</p> +<pre><code>我这几天回老家了,因为要回去处理一些工作上的事情,这个机会十分难得,暂时逃开北京繁忙的工作,溜回老家,无拘无束,自由自在。 +目光所及,尽是农田。空气中还飘散着青草混合大粪的味道,也算是沁人心脾吧。 +</code></pre> +<p>别再徘徊沉寂的心灵 +别再留恋破碎的回忆 +大地迎春雷 +抛弃你满腹的忧虑 +缤纷的彩虹等着你 +别再犹豫等待的心湖 +别再沉迷过去的旧梦 +暖暖的春风 +走向那灿烂的天涯路 +耀眼的阳光迎着你</p>2007-06-19https://sbabybird.github.io/p/2007-06-19/Tue, 19 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-19/<p>电视上充斥着广告,其中不乏精品,看完之后让人心情舒畅然后心甘情愿的掏腰包去买他们的产品。但是大多数广告都庸俗不堪,让人看得心慌气短、胃部抽搐、浑身起鸡皮疙瘩。这其中不必说“收礼只收搓澡巾”,也不必说“洗洗更健康”,单就是那位一口气上五楼的大爷就能让人抓狂了。时间长了,这些广告我吐啊吐啊的也就习惯了,对于这类垃圾广告也有了一定的免疫能力。但是最近又有一个广告冲破了我的心理防线!那就是某饮料的变态广告“我拧你!”</p> +<pre><code>画面上,一群疯子在那里晃来晃去的踢腿,就像得了羊癫疯似的,整个广告看了让人不知道他们在表达什么另类理念,还好导演没忘记让他们每人手里拿着一瓶该品牌的饮料。我估计作者的思路来源与某天他的鞋里进了个小石子,然后他就不停的甩啊甩,一直甩不出来,直到喝了他那个饮料才甩了出来,于是就创作了这个广告。关键是你在电视上恶心恶心我也就算了,在上下班的公交车上居然也循环的播放,而且还衍生出不同的版本出来,里面就没有一个正常人,都拿个腿在那儿踢来踢去的。 +也许从某种层面上来说,这也是一个很成功的广告,我看见很多人吵着要下载那段抽风的音乐作为手机铃声,但是我绝对不会去喝一口那种饮料,我怕晚上会做噩梦,然后再一脚把被子给踢到床底下去......</code></pre>2007-06-18https://sbabybird.github.io/p/2007-06-18/Mon, 18 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-18/<p>你问:“把大象关冰箱里共分几步?”答:“分三步,把冰箱门打开,把大象放进去,把冰箱门带上”。你又问:“可是把大象关进去之后里面黑乎乎的大象不害怕吗?”反问:“你怎么知道关上之后里面还是黑乎乎的?你确定关上门之后那个灯灭了吗?”你:“~~~~~~”</p> +<p>这个问题曾经也困扰我很久,因为冰箱的门只要一打开那个灯就亮起来,可是关上门之后你又看不到里面,所以还是不能确定里面到底是什么情况。听说国外曾经有人为这事儿想不开去自杀,更有人为此急得抓耳挠腮夜里都睡不着觉,直到他把冰箱的门上凿了个洞,看清了原来关上冰箱门后那个小灯真的灭了,这才安稳的睡去(估计这哥们是一环保人士,担心那灯太费电)。</p> +<p>我没像那位牛人那样的使用暴力,但也自有办法。当然了,作为一个正常人,去探讨冰箱里的灯到底关了没有,这种做法实在是有些偏执(这不神经病吗!),你就姑且看作我是好奇心使然吧。反正,我的冰箱刚弄回来的时候我还真就动用了高科技手段&ndash;拍照手机,我那手机带了个30W像素的鸡肋摄像头这下派上用场了。</p> +<p>也是分了三步,把冰箱门打开,把手机定了时(定时10秒后拍摄)放进去,再把门带上。心中默念,时间到,开门取出,查看照片,出现了不可思议的结果!照片里那个灯竟然还亮着!再试一次,还是亮着。我那叫一个晕,觉得被冰箱厂家给忽悠了,口口声声说节能,这得多耗不少电呐。在仔细阅读了两遍说明书之后,总算恍然大悟,原来那不是普通的灯,它不仅仅担任了照明的工作(难道还用来制冷啊?),还兼具杀菌的功效,在关上门之后,它再持续照射几分钟食物,起到杀菌抑菌的效果。哦,原来如此,人家陈老师说了:“人不能无聊到这种地步!”</p>2007-06-17https://sbabybird.github.io/p/2007-06-17/Sun, 17 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-17/<p>又到了蚊子最猖獗的季节了,现在每晚都有蚊子在我耳边盘旋,嗡嗡的声音若隐若现,让我神经高度紧张,却又懒得起来招呼它们,无奈,硬着头皮睡去。第二天胳膊腿上到处都是蚊子们留下的吻痕&ndash;小红疙瘩,奇痒难忍。我发飙了,对付蚊子,我要开始行动!</p> +<p>刚开始我采用的是防守战略,听说食用葱姜蒜可以使皮肤排出的汗味具有天然的驱蚊效果,本想采用此方法,但是吃了大蒜那味儿我更受不了只得放弃。还是在洗澡的时候多放点花露水吧,“六神特效驱蚊花露水”据说效果很好,洗完澡往身上狂撒,安静的躺在床上,等待蚊子飘然而来再飘然而去。结果,效果欠佳,蚊子依然如故的为我唱着催眠曲,而且我还被花露水熏得神清气爽、失眠健忘。</p> +<p>防守看来不行,改变战略。男人!就要对别人狠一些!对付蚊子也不例外!狂奔去超市,买来“枪手”喷雾剂、“睡得香”电蚊香、电蚊拍、紫外光灭蚊灯等等,我要发起进攻了!晚饭毕,拿起“枪手”对卧室一通疯狂扫射,再将蚊香点燃,整个房间烟雾弥漫,关紧房门,外面客厅里的灭蚊灯发出幽幽的清华紫光。这下蚊子们彻底的玩完儿了,对不起了诸位,我已经够瘦弱了,您就给我留点儿血吧。</p> +<p>沐浴后,推开卧室门,兴冲冲准备打扫战场,刚推开门我就被呛得眼泪鼻涕都下来了(我刚才喷的不是催泪瓦斯吧),蚊子倒是没有了,只是这屋里也不能待了(已经感觉呼吸困难了),无奈只有掐灭蚊香,打开窗户,终于,新鲜的空气伴随着新鲜的蚊子又进来了。灭蚊灯、灭蚊拍也收效甚微。灭蚊战争暂告一段落,蚊子暂时领先。</p> +<p>先这样吧,实在不行就拿手拍吧, 要是懒得拍就猛开空调把他们冻死,再或者,如果我的反应足够灵敏的话,我就在它们叮我的那一刹那,暗运内力把它们的嘴夹在肌肉里,我憋死它们!</p>2007-06-16https://sbabybird.github.io/p/2007-06-16/Sat, 16 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-16/<p>如果有那么一天,我在沙滩上走着,突然从沙子里踢出一个神灯,我擦了三下,彭!的一声窜出一个魔鬼,对我龇牙咧嘴,非得满足我三个愿望。那么,我会许什么愿呢?我不会像周星驰那样无耻,许完了两个愿望后最后一个愿望竟是再要三个愿望。我想我也应该不那么自私,我会把头两个愿望交给公益事业,比如世界和平、环境保护啥的,然后留一个愿望给自己,那就是&ndash;我想睡个自然醒。</p> +<pre><code>自从告别了自在潇洒的大学生活,参加工作以后,我就没有睡够过,也不是完全没有时间睡觉,而是能有机会睡懒觉的时候我都睡不着。在一周里里面,工作日期间肯定没睡懒觉的可能,一大早就狂奔到车站去挤车了,晚上又很晚才睡,所以这期间是十分缺觉的。只有周末的早晨才能有机会赖在床上,可是问题来了,周末的早晨我倍儿精神!平日里闹钟响了还想把它摁掉再小睡一会儿,可一旦到了周末,我往往比闹钟醒的还早,而且再也睡不着。这是为什么呢,苦苦思索之后,得到答案:周末是属于我自己的自由时间而且很短暂,我不舍的拿这点儿宝贵时间来睡觉!平时没时间干的我只有等到周末了,平时听不了音乐就周末抱着音响使劲儿听,平时没时间弹琴就等到周末抱着电子琴使劲儿得瑟,平时没时间摄影等到周末就溜达出去一通狂拍...... 等等,有这些个好事儿等着我,我就算是想睡也真就睡不着了。 +所以,我也不祈求啥别的太奢侈的事儿,就让我睡个自然醒吧。</code></pre>2007-06-15https://sbabybird.github.io/p/2007-06-15/Fri, 15 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-15/<p>老家那边有些事儿需要老婆回去处理一下,用不了几天,可是转眼已经一个周过去了,据说还需要再呆几天才能回北京来。哎!郁闷呐!按照道理来说,作为一个正常的男人如果老婆回了娘家,那他应该感到万分的高兴才是(我曾经有个同事,从来都不吭声,结果有一次哼了一整天的小曲儿,一问才知道,人家老婆大人回娘家去了)。高兴是高兴,可是晚饭没有着落了,眼看着冰箱里的东西被我一点点地吃光了,就连平时不爱吃的饺子也在前天被我从冰箱的最底层翻了出来。家里实在没吃的那就在外面吃吧,昨晚上刚好有饭局,不吃白不吃啊,结果上当了,几个哥们儿都是贪杯的主儿,白的喝完换啤的, 啤的喝完换冰的,一直喝到丧心病狂&hellip;&hellip;饭还没吃上几口。搞得今天蔫了吧唧不说,还浑身上火, 鼻炎发作,咽炎发作,苦不堪言。</p> +<pre><code>站起来,叹了口气,转身就看到洗衣机里的衣服也快堆成小山了,都说能把袜子按颜色分类的男人和把袜子随便乱扔的男人是两种不同的生物,我显然是属于后者,看来只有等到周末统一解决了。</code></pre>2007-06-14https://sbabybird.github.io/p/2007-06-14/Thu, 14 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-14/<p>高考刚过,每年的这个时候都会有一大帮人在哪儿声泪俱下的控诉这万恶的高考制度。我也讨厌高考,但是在我的记忆里,另一种考试制度更令我恶心,那就是&mdash;-抽考!</p> +<pre><code>在我上小学的时后,比较害怕的就是考试了,但最让我感到不安的是每个班级选拔“尖子生”的过程。那个时候每到期末每个班级总是抽出学习成绩最好的几个同学参加镇上的抽考,他们的考试成绩直接代表了整个班级的学习成绩,也代表了老师的教学水平。私下里大家管抽到的这些学生叫“尖子生”。 +从小学到初中我几乎一路是“尖子生”,至于为什么要有“尖子生”,这样考试有什么意义我就不去想了,只知道如果被老师抽到当“尖子生”就全家开心,我在家也可以放肆一些,万一抽不到就没人给我好脸色。好在屡次的抽考过程中我只有两次没有被选中,不知是幸运还是不幸。 +其中一次是在小学二年级的时候,虽然没有被选中,但是也参加了考试(数学替考),当时我的情况是语文极差但数学很好(至少比那些“尖子”要好一些),老师为了他们的荣誉,便让我替另外一个考生参加了数学考试,试卷虽然是我答的却不能填写我的名字。好在当时也没什么自尊心,也就爽快的答应了,现在想一想作为老师也太不应该了。(这也是我后来虽念了师范却最终没有选择做老师的原因之一)。 +到后来就越来越抵制这种虚伪的考试,大概是四年级,我越来越贪玩,成绩真的不行了,要期末考试了,老师们纷纷挑选“尖子”,刚开始还被提名,后来经过多层过滤,勉强坚持到了最后一轮评测,直到我们伟大的辛勤的园丁说:“好了,那谁,你回去吧,其他人留下”。于是我提着书包灰溜溜回家,心里却说不出的高兴,不用去参加TMD关系到班集体荣誉的考试了!爽!哼哼,我冷笑,冷笑。现在回忆起来,脑子里仍旧充斥着老师们那因为贪图班级的名次而扭曲的面容(这就是原因之二)。 +不知道现在怎么样了,在当时,这样的考试制度,它伤了太多太多孩子的心。 +</code></pre> +<p>choukao</p> +<p>ps:</p> +<p>今日饮酒过渡</p> +<p>沉醉不知归路</p> +<p>兴尽打车走</p> +<p>误入小区深处</p> +<p>呕吐、呕吐</p> +<p>引来保安无数!</p>2007-06-13https://sbabybird.github.io/p/2007-06-13/Wed, 13 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-13/<p>早晨,NB烘烘的中国移动给我发天气预报说是阴转多云,在分析了昨晚电视上的预报加上收音机告诉我的降水概率后,我确定今天不会下雨,然后非常自信的没带伞就上班了,虽然头上的天阴的要滴水似的。</p> +<pre><code>谁知现在的天气预报已经不准确到让人发指的地步了!从下车到家的那段路程我只好雨中快步了(跑啊)。不是说现在计算机运算速度越来越快了吗?不是说建立的数据模型越来越接近真实了吗?不是说那什么风云N号也升空了吗?嗯?!忽悠谁啊!上次就报给我说最近西伯利亚那边有情况,未来几天有大风降温的天气,搞得我捂了一身痱子!现在到处是天气预报,各大网站上有,报纸上有,QQ上有,收音机、电视就更有了,而且还花样儿繁多,一会儿是穿衣指数,一会儿又洗车指数,最后还忽悠你个降水概率,有雨就有雨没雨就没雨,整个指数百分之60鬼才知道到底要不要下! +当然了,他们有预报准确的时候,那就是对局部地区的天气预报,反正局部地区天天要下雨甚至还有短时间的雷雨大风等强对流天气。我妈就曾经十分关切的问我:“为什么局部地区天天下雨,这个地区到底在哪儿?住在那儿的人可怎么活哟!” +算啦,也不跟他们计较,我还是回去翻翻小学的语文课本,好好拜读一下里面的那篇《看云识天气》,以后再也不相信这GR的天气预报了! +</code></pre> +<p>慢着,突然想起了倪萍大婶子曾经在“综艺大观”上做的即兴方言版天气预报,啧啧,那叫一个准啊!“社员同志们注意啦,哈。这个山东省荣成县寨子沟公社刘家村广播站现在开始播送天气预报,哈。这个明天头半晌儿阴有小雨儿,后半晌儿就变天了。南风转西北风7-8级。这个凄凄沥沥的小雨儿夹着嗖嗖的西北风,今儿刮,明儿刮儿,后儿还刮,一直刮到下个星期六,哈。这个咱再接着说天气预报。这个西北风一刮,这回最大的特点就是龙卷风,龙卷风啊,粮食要最重&hellip;.”</p>2007-06-12https://sbabybird.github.io/p/2007-06-12/Tue, 12 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-12/<p>初来北京的时候,家里托着亲戚的亲戚的关系让我在一家单位实习,就像鲁迅小说里写的那样,掌柜的是一副凶脸孔,主顾也没有好声气。那时我一个人住在前门外大栅栏里的一家小旅馆里。 +我住的胡同往北走几步一拐就是北京著名的“大栅栏步行街”,那儿有着浓厚的京味儿,经常看到成群的外国鬼子。他们不停的拍照,吃小吃,买工艺品,所以这里一天到晚人山人海热闹非凡。有时候我也去转转,只是转转,并不买东西,那些让老外一看见就双眼冒光的玩意儿对我并没有多大吸引力。 +小王,我住的旅店里的服务员,瘦瘦的,头戴一顶鸭舌帽,手腕上戴了一只便宜手表。 +一天下午,我一个人站在楼顶上特别无聊,正好小王上来,我递给他一根“中南海”他笑笑接住说:“一个人在外无聊吧?”我说:“是” 他说 “那我就给你讲讲这一片儿的故事吧!”,于是他就趴在栏杆上给我说了一通关于这个胡同的故事,说了这一带在清朝是曾经全是窑子。他抽了不少烟,我说“中南海这烟太冲了这边有没有柔和一点儿的烟?”他想了想说:“我抽的都是便宜烟,恩,不过便宜好抽就行&hellip;” 他给我说了两种。我到了晚上买来抽了几支觉得不好抽(那时我还不怎么抽烟)就都送给他了。以后就时常在一起谈天,混得很熟了,他经常早早的就把我的暖壶打满开水给提上来。 +只是又过了两三天,我一直也没见到小王,一问店老板才知道 :“他回老家了,他是离家出走才来到这个小店的,没钱了,才在这儿打工,不求挣钱只要有吃有睡就行,前两天他哥哥找到这里就把他带回去了。”老板很惋惜:“多好的孩子呀!”</p>2007-06-11https://sbabybird.github.io/p/2007-06-11/Mon, 11 Jun 2007 00:00:00 +0000https://sbabybird.github.io/p/2007-06-11/<p>早晨的阳光真灿烂,虽然天气湿热有点儿桑拿天的苗头,但是我的心情很好,阳光洒在我的工作服上像是镶了金边,很是耀眼。对了,我是一个环卫工人,每天早晨都要在这儿清扫垃圾,这个工作是很神圣的,至少我这么认为,虽然和小时候的梦想(艺术家)差得很远,但是用某位相声演员的话说“这是一样一样一样的啊”!我愉快地拿起扫把,自在地吹着口哨,再把这条街扫完就可以收工了。我不由得加快了速度挥舞着扫把就像一个画家挥舞着手中的画笔,我气沉丹田暗用内力,短小的扫把被我使得是呼呼生风,卷起的沙尘就像一层薄雾。 +这个时候你出现了,挎着小包,下了公共汽车,高跟鞋踩在平坦的人行道上发出清脆的得得响,你的小手微微举起遮住当前还不算猛烈的太阳。真漂亮啊!我暗自赞道。上学时很不努力导致我的眼神儿非常好,我想,在工作时看到美女也算是一种福利吧!看着你向我走来,越走越近,不知是热的还是累得,我的手心开始出汗,我攥紧了扫把更卖力的扫了起来,地上的落叶伴随着纸片在沙尘中轻轻飞舞。你终于走到我的身边,冲我使劲的挥手,这么近的距离我终于看清了你的眼睛,很大、很圆,长长的睫毛。你竟然停下了脚步,盯住我迷离的眼神和唏嘘的胡茬,我期盼着你能给我说些什么,虽然黑夜给了你黑色的眼睛,但你却翻了个白眼儿给我:“你就不能轻点儿扫吗!还让不让人走路了!”。</p> \ No newline at end of file diff --git "a/tags/\345\277\203\346\203\205\351\232\217\347\254\224/page/1/index.html" "b/tags/\345\277\203\346\203\205\351\232\217\347\254\224/page/1/index.html" new file mode 100644 index 000000000..c068ce27a --- /dev/null +++ "b/tags/\345\277\203\346\203\205\351\232\217\347\254\224/page/1/index.html" @@ -0,0 +1 @@ +https://sbabybird.github.io/tags/%E5%BF%83%E6%83%85%E9%9A%8F%E7%AC%94/ \ No newline at end of file diff --git "a/tags/\345\277\203\346\203\205\351\232\217\347\254\224/page/2/index.html" "b/tags/\345\277\203\346\203\205\351\232\217\347\254\224/page/2/index.html" new file mode 100644 index 000000000..590c2d2d5 --- /dev/null +++ "b/tags/\345\277\203\346\203\205\351\232\217\347\254\224/page/2/index.html" @@ -0,0 +1,35 @@ +Tag: 心情随笔 - Learning & Writing!

Tags

心情随笔

+ \ No newline at end of file diff --git "a/tags/\345\277\203\346\203\205\351\232\217\347\254\224/page/3/index.html" "b/tags/\345\277\203\346\203\205\351\232\217\347\254\224/page/3/index.html" new file mode 100644 index 000000000..35e8b419c --- /dev/null +++ "b/tags/\345\277\203\346\203\205\351\232\217\347\254\224/page/3/index.html" @@ -0,0 +1,36 @@ +Tag: 心情随笔 - Learning & Writing!

Tags

心情随笔

+ \ No newline at end of file diff --git "a/tags/\345\277\203\346\203\205\351\232\217\347\254\224/page/4/index.html" "b/tags/\345\277\203\346\203\205\351\232\217\347\254\224/page/4/index.html" new file mode 100644 index 000000000..6a108c8ff --- /dev/null +++ "b/tags/\345\277\203\346\203\205\351\232\217\347\254\224/page/4/index.html" @@ -0,0 +1,36 @@ +Tag: 心情随笔 - Learning & Writing!

Tags

心情随笔

+ \ No newline at end of file diff --git "a/tags/\345\277\203\346\203\205\351\232\217\347\254\224/page/5/index.html" "b/tags/\345\277\203\346\203\205\351\232\217\347\254\224/page/5/index.html" new file mode 100644 index 000000000..7e33ebb57 --- /dev/null +++ "b/tags/\345\277\203\346\203\205\351\232\217\347\254\224/page/5/index.html" @@ -0,0 +1,35 @@ +Tag: 心情随笔 - Learning & Writing!

Tags

心情随笔

+ \ No newline at end of file diff --git "a/tags/\345\277\203\346\203\205\351\232\217\347\254\224/page/6/index.html" "b/tags/\345\277\203\346\203\205\351\232\217\347\254\224/page/6/index.html" new file mode 100644 index 000000000..315db2cc8 --- /dev/null +++ "b/tags/\345\277\203\346\203\205\351\232\217\347\254\224/page/6/index.html" @@ -0,0 +1,34 @@ +Tag: 心情随笔 - Learning & Writing!

Tags

心情随笔

+ \ No newline at end of file diff --git "a/tags/\345\277\203\347\220\206\345\255\246/index.html" "b/tags/\345\277\203\347\220\206\345\255\246/index.html" new file mode 100644 index 000000000..ac09d9442 --- /dev/null +++ "b/tags/\345\277\203\347\220\206\345\255\246/index.html" @@ -0,0 +1,31 @@ +Tag: 心理学 - Learning & Writing!

Tags

心理学

+ \ No newline at end of file diff --git "a/tags/\345\277\203\347\220\206\345\255\246/index.xml" "b/tags/\345\277\203\347\220\206\345\255\246/index.xml" new file mode 100644 index 000000000..648c48829 --- /dev/null +++ "b/tags/\345\277\203\347\220\206\345\255\246/index.xml" @@ -0,0 +1,35 @@ +心理学 on Learning & Writing!https://sbabybird.github.io/tags/%E5%BF%83%E7%90%86%E5%AD%A6/Recent content in 心理学 on Learning & Writing!Hugo -- gohugo.iozh-cnSun, 18 Apr 2021 00:00:00 +0000《少有人走的路》读书笔记https://sbabybird.github.io/p/%E5%B0%91%E6%9C%89%E4%BA%BA%E8%B5%B0%E7%9A%84%E8%B7%AF%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/Sun, 18 Apr 2021 00:00:00 +0000https://sbabybird.github.io/p/%E5%B0%91%E6%9C%89%E4%BA%BA%E8%B5%B0%E7%9A%84%E8%B7%AF%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/<h2 id="简介">简介</h2> +<p>《少有人走的路-心智成熟的旅程》这本书据说是畅销多年,经久不衰,在豆瓣上评分很高。不少人纷纷表示此书给自己带来了很多思考和感悟。我是在今年第二遍阅读了此书,之前大约十年前草草看过一遍,印象不够深刻。但今年再读,书中就有很多文字能够读进去了。虽然作者本身对“爱”的定义和解读我并不完全认同,以及作者也许受宗教信仰的影响,在某些观点上有一定的倾向,但都不妨碍这本书给我带来震撼。</p> +<h2 id="笔记">笔记</h2> +<blockquote> +<p>人生苦难重重。</p> +</blockquote> +<p>开篇就表达了最基本的设定,让我闭上本来想要抱怨的嘴,不得不跟着往后翻看有没有可以解决的答案。</p> +<blockquote> +<p>解决人生问题的关键在于自律。人若缺少自律,就不可能解决任何麻烦和问题。在某些方面自律,只能解决某些问题,全面的自律才能解决人生所有的问题。</p> +</blockquote> +<p>在认真看本书之前,我对“自律”的理解还仅限于在生活上严格要求自己,作息规律、遵守诺言、办事靠谱、简约不浪费。但作者显然不仅仅是这个意思,否则也用不着用很大的篇幅来说“自律”。</p> +<p>看一下作者对“自律”的定义。</p> +<blockquote> +<p>所谓自律,就是主动要求自己以积极的态度去承受痛苦,解决问题。自律有四个原则:推迟满足感、承担责任、忠于事实、保持平衡。</p> +</blockquote> +<p>只有不回避问题、以积极的心态去解决问题,才算作是自律。即便在生活中早睡早起、刻苦读书、勤奋工作,如果遇到问题首先想要逃避,那就不能算是自律。很惭愧,我之前在不少问题上都是以拖延为主要处理方式,本质上还是无法承受或者面对解决问题可能带来的痛苦,那么在读了本书之后,我会有意识地去改变做事原则,就拿上周来说,我终于鼓起勇气去诊所看牙,解决了拖了很久的牙结石问题(虽然智齿还没解决)。</p> +<blockquote> +<p>推迟满足感,就是不贪图暂时的安逸,先苦后甜,重新设置人生快乐与痛苦的次序:首先,面对问题并感受痛苦;然后,解决问题并享受更大的快乐。在充满问题和痛苦的人生中,推迟满足感是唯一可行的生活方式。</p> +</blockquote> +<p>这个话题不仅仅是在本书中提到过,据说有心理学家做过试验,在一群孩子里面寻找具有“推迟满足感”倾向的人(比如能够先忍住不吃巧克力以获取更大的奖励),结果证明这样的人在后续的生活中取得成功的概率要远高于先吃巧克力的人。本书首先强调这个话题,将其作为自律中的第一个原则,我想是因为道理都是相通的吧。很久之前我看过一篇讲解时间管理的文章,里面提到在规划一天的工作时,优先处理最难的那件事(文章中称“先吃掉那只青蛙”),然后当前的工作会越来越简单,这样的方式跟本书中作者所提倡的“推迟满足感”异曲同工。尽可能的正面问题、提早感受解决问题的痛苦,正是执行自律的首要原则。</p> +<blockquote> +<p>不能及时解决自己面临的问题,这些问题就会像山一样横亘在我们心中,阻碍心灵的成长和心智的成熟。很多人显然忽略了这个道理。我们必须面对属于自己的问题,这是解决问题的基本前提。 +指望别人解决自己的问题,也不是明智之举。唯一的办法&ndash;我们应该勇敢地说:“这是我的问题,要由我来解决!”</p> +</blockquote> +<p>这就牵出了第二个原则&ndash;“承担责任”。逃避问题会自然而然的推卸责任,认为这不是自己的问题,始终对于自己扮演的角色缺少清晰的认知。不过作者提到了两种情况“神经官能症”和“人格失调症”,前者属于给自己强加责任,后者属于推卸责任。这么说来,我可能有前者的倾向,很多压力都来源于此。不过作者也提到在复杂的人生道路上,判断自己该为什么事和什么人负责,这是一个永远存在的难题。</p> +<p>还有一种情况是,在有些事情上强加给自己责任,在有些事情上又没有意识到是自己的责任。读到这些章节的时候,我也在反思,当我一旦开始想要抱怨的时候,其实已经陷入“人格失调”和“神经官能”的边缘,要时刻提醒自己,不断评估自己的责任。</p> +<blockquote> +<p>忠于事实是自律的第三条原则。如果我们追求健康的生活和心智的成熟,那我们就要坚定不移地遵循这条原则。我们需要实事求是,杜绝虚假。我们越是了解事实,处理问题就越是得心应手。逃避现实的痛苦是人类的天性,只有通过自律,我们才能逐渐克服现实的痛苦,及时修改自己的地图,逐步成长。我们必须忠于事实,尽管这会带来暂时的痛苦,但远比沉湎于虚假的舒适中要好。我们必须忍受暂时的不适感,追求事实而不是假象,并承受这一过程的痛苦。</p> +</blockquote> +<p>这让我想到了“诚实”,不仅限于不撒谎(这一点实在是难以做到)。但我很快意识到作者所说的忠于事实比不撒谎更重要的是,面对事实,不可活在自己的想象里。虽然我们每个人都有自己的成见,看事情也很难看到全貌,但是不可做不基于事实的幻想,期望问题会自行消失、期望不付出努力就能得到回报。</p> +<blockquote> +<p>你既要承担责任学会推迟满足感,先苦后甜,把眼光放长远,同时又要尽可能过好当前的生活,让人生的快乐多于痛苦。</p> +</blockquote> +<p>这就是“保持平衡”,应该是一种“拿捏”吧。为了保持平衡,作者建议,适当的选择“放弃”。包括放弃过时的观念、习惯。王小波在小说中写道:“人生就是一个缓慢被捶的过程。。。”,如果不能适时的放弃一些东西,那很显然这个过程是相当痛苦的。</p> +<p>先写这么多。</p> \ No newline at end of file diff --git "a/tags/\345\277\203\347\220\206\345\255\246/page/1/index.html" "b/tags/\345\277\203\347\220\206\345\255\246/page/1/index.html" new file mode 100644 index 000000000..e0713ad66 --- /dev/null +++ "b/tags/\345\277\203\347\220\206\345\255\246/page/1/index.html" @@ -0,0 +1 @@ +https://sbabybird.github.io/tags/%E5%BF%83%E7%90%86%E5%AD%A6/ \ No newline at end of file diff --git "a/tags/\346\234\272\345\231\250\345\255\246\344\271\240/index.html" "b/tags/\346\234\272\345\231\250\345\255\246\344\271\240/index.html" new file mode 100644 index 000000000..ec36c25ea --- /dev/null +++ "b/tags/\346\234\272\345\231\250\345\255\246\344\271\240/index.html" @@ -0,0 +1,31 @@ +Tag: 机器学习 - Learning & Writing!

Tags

机器学习

+ \ No newline at end of file diff --git "a/tags/\346\234\272\345\231\250\345\255\246\344\271\240/index.xml" "b/tags/\346\234\272\345\231\250\345\255\246\344\271\240/index.xml" new file mode 100644 index 000000000..7dc77733c --- /dev/null +++ "b/tags/\346\234\272\345\231\250\345\255\246\344\271\240/index.xml" @@ -0,0 +1,48 @@ +机器学习 on Learning & Writing!https://sbabybird.github.io/tags/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/Recent content in 机器学习 on Learning & Writing!Hugo -- gohugo.iozh-cnSun, 02 Jun 2019 00:00:00 +0000线性回归和梯度下降https://sbabybird.github.io/p/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E5%92%8C%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D/Sun, 02 Jun 2019 00:00:00 +0000https://sbabybird.github.io/p/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E5%92%8C%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D/<h3 id="有监督学习的两种主要任务分类和回归">有监督学习的两种主要任务(分类和回归)</h3> +<ul> +<li>有监督机器学习任务主要分为两种,一种是分类任务,一般是通过学习算法实现对未知数据的分类甄别,比如判断是男性还是女性,预测明天会不会下雨等等,预测结果是离散的分类。另一种是回归任务,用于预测一个具体的值,比如房价、年龄等等,预测结果是连续的值;</li> +<li>解决回归任务比较常见的算法就是线性回归算法;</li> +</ul> +<h3 id="线性回归">线性回归</h3> +<ul> +<li>线性回归是最典型的用于回归任务的机器学习算法。它的基本原理是基于,任意一个为n的值,可以通过一个n-1阶的多项式进行拟合;</li> +<li>线性回归的算法的目标是根据已知标签数据,训练一个预测函数f(a, b),使得x输入带入ax+b这样的多项式可以得出需要预测的值;</li> +<li>所以目标是找到合适的a和b(从数学语言的精确描述来说,一般用别的符号代替,为了方便记录,我使用a和b);</li> +<li>为了找到合适的a和b,需要定义一个损失函数(也有称为代价函数的),J(a, b),用于判断a和b是否合适,比较简单的有“方差均值”法;</li> +<li>方差均值指的是,所有样本带入预测函数f,将预测值与实际值相减,取平方,求和再求平均数(暂时不知到markdown里如何加入公式);</li> +<li>那么带入损失函数,就是意味着,找到合适的a、b使得刚才那个方差均值小于一个阈值(接近最优);</li> +<li>线性回归本质上,是在平面坐标系里找到一个与样本匹配的直线,这样基于这个直线,即可预测未知的值;</li> +</ul> +<h3 id="梯度下降">梯度下降</h3> +<ul> +<li>如何找到合适的a和b,一个一个地去试是不可能的(无穷多的计算量);</li> +<li>比较典型的算法是“梯度下降”,又是牛顿起的头;</li> +<li>比较生动的描述是,想想一个三维空间图形,X和Y平面是有a和b的值构成,Z轴是损失函数的值,值最小的部分(在图上就最低的部分,像一个山谷)就是最优解;</li> +<li>从山顶的某个点上,环顾360度,找到适合下山的一小步,一点一点儿走向山谷最低处,有点像慢慢走楼梯,所以叫梯度下降;</li> +<li>从我的体会来看,这个方法有点像牛顿那个计算平方根的迭代法(根据一个猜测值,然后通过迭代公式寻找一个更加接近正确值的值,直到误差降低到合适范围);</li> +<li>从微积分的角度,就是找到损失函数J在最初尝试的那个点上的切线,并通过它的斜率(也就是导数值)乘以一个系数a,逐步逼近最低点(切线斜率为零)的过程;</li> +</ul>机器学习的学习准备https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%9A%84%E5%AD%A6%E4%B9%A0%E5%87%86%E5%A4%87/Sat, 18 May 2019 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%9A%84%E5%AD%A6%E4%B9%A0%E5%87%86%E5%A4%87/<h3 id="机器学习的概念">机器学习的概念</h3> +<p>机器学习是人工智能的一个分支,是近年来逐渐具备实用性的各种人工智能应用的基础。其本质是(我目前的个人理解)利用针对已知的数据集合抽取采样特征,然后利用某种数据模型(核心是某种算法:如kNN、SVM、朴素贝叶斯等)对数据进行计算处理,得到一组可以预测未知数据集特征的参数和手段,从而可以对数据进行预测判断的一种数据处理方法。</p> +<h3 id="机器学习相关的名词">机器学习相关的名词</h3> +<ul> +<li>神经网络:是机器学习的一种实现方式,从概念上来说,小于“机器学习”,但是由于其在图像识别、语音识别、语言翻译等领域的优异表现,以至于现在提到机器学习就认为是神经网络,实际则不然,机器学习的概念更大,更加基础,是实现神经网络应用的基础理论和方法;</li> +<li>深度学习:是神经网络的应用特例,同样是在应用层表现优异,可以理解为神经网络的一种实现;</li> +<li>大数据:机器学习的数据处理基础支撑,近年来机器学习在应用层面表现较好主要得益于大数据技术的发展,可以使得模型训练内容量级增加,极大的提高了模型准确度;</li> +<li>n维向量:来自线性代数,在机器学习中起到重要作用,在机器学习中一般用于各种特征数据的载体,在不同的算法过程中传递和计算。</li> +</ul> +<h3 id="机器学习相关的工具">机器学习相关的工具</h3> +<ul> +<li>编程语言:目前比较流行的是Python,因为有比较丰富易用的程序包,很多科技公司也开源了较为成熟的框架,再加上Python语言本身的简单易上手,使得Python成为这个领域最流行的语言。当然C和C++、Java还是实现各种算法的根基,Python更多是提供了一种调用接口;</li> +<li>iPython:Python语言的交互控制台,可以较为方便的测试、调试Python程序,有较强的交互功能,比语言发行版自带的强大;</li> +<li>jupyter:提供Python语言的Web交互界面,通过网页即可编写代码,并及时反馈执行结果,由于是B/S架构,所以可以使得运行时跟开发环境分开。编辑界面同时支持基于Markdown语法的文档编写,使得“文学化”编程成为一种可能,非常适合用于科研人员的汇报材料或论文;</li> +<li>TensorFlow:谷歌开源的机器学习框架,快速灵活部署机器学习应用,可以应用与大规模、工业级场景;</li> +<li>keras:基于Python编写的高级神经网络API,属于对机器学习的深度封装,如果以学习机器学习原理为目标的,不建议使用,还是先手动将若干种核心算法实现一遍比较深刻;</li> +</ul> +<h3 id="预期的学习方法">预期的学习方法</h3> +<ol> +<li>通过阅读相关的书籍,对于概念有所了解,这个过程可以是粗糙的浏览,不求详细的理解各种原理和算法;</li> +<li>尝试一些教学视频,了解实操的基本流程,对于自己读书得到的概念进行验证,修订理解,并熟悉基本工具的使用(如Python的numpy、plot等);</li> +<li>细读书籍,按照书中的事例进行实操,并尝试推导算法的基本原理,理解后,形成自己的文字;</li> +<li>定义简单的任务,贯穿数据准备、数据清洗、特征值提取、模型建立、模型应用各个阶段,一般来说可以是手写文字识别,或者给新闻文章分类等;</li> +<li>循环和迭代这个过程,一边输入信息,一边将学到的东西结合思考,形成有效的输出(文字、视频等);</li> +</ol> \ No newline at end of file diff --git "a/tags/\346\234\272\345\231\250\345\255\246\344\271\240/page/1/index.html" "b/tags/\346\234\272\345\231\250\345\255\246\344\271\240/page/1/index.html" new file mode 100644 index 000000000..71ab946c5 --- /dev/null +++ "b/tags/\346\234\272\345\231\250\345\255\246\344\271\240/page/1/index.html" @@ -0,0 +1 @@ +https://sbabybird.github.io/tags/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/ \ No newline at end of file diff --git "a/tags/\346\234\272\345\231\250\346\226\207\346\221\230/index.html" "b/tags/\346\234\272\345\231\250\346\226\207\346\221\230/index.html" new file mode 100644 index 000000000..d1d55a2ad --- /dev/null +++ "b/tags/\346\234\272\345\231\250\346\226\207\346\221\230/index.html" @@ -0,0 +1,34 @@ +Tag: 机器文摘 - Learning & Writing!

Tags

机器文摘

+ \ No newline at end of file diff --git "a/tags/\346\234\272\345\231\250\346\226\207\346\221\230/index.xml" "b/tags/\346\234\272\345\231\250\346\226\207\346\221\230/index.xml" new file mode 100644 index 000000000..f8e9d6b80 --- /dev/null +++ "b/tags/\346\234\272\345\231\250\346\226\207\346\221\230/index.xml" @@ -0,0 +1,6919 @@ +机器文摘 on Learning & Writing!https://sbabybird.github.io/tags/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98/Recent content in 机器文摘 on Learning & Writing!Hugo -- gohugo.iozh-cnTue, 19 Sep 2023 00:00:00 +0000机器文摘 第 050 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/Tue, 19 Sep 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-31-40.png" alt="Featured image of post 机器文摘 第 050 期" /><h1 id="机器文摘-第-050-期">机器文摘 第 050 期</h1> +<h2 id="长文">长文</h2> +<h3 id="十八世纪的光学电报网络">十八世纪的光学电报网络</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-31-08.png" +width="500" +height="517" +loading="lazy" +class="gallery-image" +data-flex-grow="96" +data-flex-basis="232px" +></p> +<p>当年读《基督山伯爵》的时候,有一个让我震惊的科技。</p> +<p>主人公有一项复仇计划是破坏敌人的金融资产。计划采取的手段是收买了一个传递实时信息的人让其传递错误信息。</p> +<p>而具体传递信息的手段是,每隔一段距离设一座瞭望塔,每个塔上有一个人,向一个方向用望远镜观看,远方的上级瞭望塔会有人发射信号弹,一连串的信号弹代表一定的信息,然后这个人再原样发射一遍,让后方的瞭望塔看见。信息就这样一级一级传递下去。</p> +<p>信息经过编码,可以表达股票行情等信息,类似后来的电报系统,但是这是在十八世纪。</p> +<p>读过之后我就一直有疑问,不知道小说是否虚构了这种信息传递技术,直到前几天我发现了这篇文章:<a class="link" href="https://www.lowtechmagazine.com/2007/12/email-in-the-18.html" target="_blank" rel="noopener" +>《十八世纪的光学电报网络》</a>。</p> +<p>里面详细介绍了在两百多年前人类就已经发明了“光学电报”系统,并建立起了巨大的信息网络。信息传递速度达到了惊人的 1380千米/每小时。</p> +<h3 id="c-语言发展简史">C 语言发展简史</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-31-23.png" +width="690" +height="352" +loading="lazy" +class="gallery-image" +data-flex-grow="196" +data-flex-basis="470px" +></p> +<p>要说 C 语言是计算机历史上最重要的编程语言应该不会有人反对吧。</p> +<p>作为大多数人编程入门的母语,C 语言具有语法简洁、高性能(贴近计算机底层)、使用灵活、适用范围广泛等特点。</p> +<p>虽然诞生于上个世纪 70 年代,但即便是在 2023 年的今天,C 语言仍然排在各大编程排行榜的考前位置,仍然是信息科技的重要支撑力量。</p> +<p><a class="link" href="http://cm.bell-labs.co/who/dmr/chist.html" target="_blank" rel="noopener" +>《C 语言简史》</a>,由丹尼斯·里奇(C 语言之父)撰写,是一篇难得的介绍 C 语言的诞生和发展的历史性文献。</p> +<h3 id="vbvisual-basic发展简史">VB(Visual Basic)发展简史</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-31-40.png" +width="690" +height="518" +loading="lazy" +class="gallery-image" +data-flex-grow="133" +data-flex-basis="319px" +></p> +<p>前几天 HN 上有个从业近 30 年的老程序员发问:<a class="link" href="https://news.ycombinator.com/item?id=37470318" target="_blank" rel="noopener" +>为什么 VB(Visual Basic)这么高效、好用的开发工具逐渐消失了?</a>。</p> +<p>被顶的最高的网友放出了<a class="link" href="https://retool.com/visual-basic/" target="_blank" rel="noopener" +>《Visual Basic 从诞生到消失》</a>这篇文章。</p> +<p>在上世纪 80 年代末 90 年代初,Windows 操作系统刚刚崭露头角的时候,VB 已经在萌芽状态了。而且已经具有非常先进的组件化、可视化、低代码等超前思想。并且发明了“控件”、“消息触发”等概念。</p> +<p>最初的版本与 BASIC 语言并无关系,只考虑了使用可视化开发并辅助简单的内嵌脚本,但是比尔·盖茨对 BASIC 十分热爱(毕竟那是微软起家的技术),亲自推动了组件化、可视化开发与 BASIC 语言结合,便诞生了 Visual Basic。</p> +<p>得益于超前的可视化开发理念,VB 极大降低了当时开发应用程序的门槛,涌现出一大批开发者。包括当时那些不得不转型给个人电脑开发程序的大型机编程工程师。</p> +<p>这一切在 VB 随着 Visual Studio 发布 6.0 的时候达到了顶峰。</p> +<p>转折点出现在微软为了应对 Java 的威胁而推出 .Net 公共语言运行时的时候,VB 也被纳入到这套体系里,被成为 VB.Net ,扩充了复杂的语法和继承、多态等高级特性。</p> +<p>对于那些真正喜欢 VB6 的人来说,这些都是唯恐避之不及的东西,更糟糕的是新的 VB.Net 无法兼容之前的代码,大量成果移植困难。</p> +<p>之后更是随着网络信息科技的发展,Web 编程逐渐取代了 Windows 桌面编程,VB 这个伟大的技术,被淘汰也就是顺其自然的了。</p> +<h3 id="一个在网页里模仿-excel-表格的故事">一个在网页里模仿 Excel 表格的故事</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-32-14.png" +width="690" +height="201" +loading="lazy" +class="gallery-image" +data-flex-grow="343" +data-flex-basis="823px" +></p> +<p><a class="link" href="https://websheets.github.io/websheets/demo/" target="_blank" rel="noopener" +>一位前端工程师,讲述了他在 2016 年受雇于 Uber(优步)时的一些开发往事</a>。</p> +<p>作为服务于数据工程师的内部研发团队,他所在的小组主要是给公司的数据分析人员提供内部工具,以便让他们能够更快地分析数据,更快的分析数据意味着更有可能在产品运营竞争里获胜。</p> +<p>然而数据分析人员总是抱怨工具不满足要求,主要是操作界面,因为他们非常习惯“Excel”,每次提需求的时候总是说:“你就做得跟 Excel 一样就行”。</p> +<p>作者最开始还试图跟用户解释要实现起来是多么困难,后来逐渐放弃了挣扎,并开始着手在网页里实现一个跟 Excel 一样的表格,而且他竟然实现了。</p> +<p>故事的后来有些伤感,作者提供的工具并没有使得 “Uber” 在跟嘀嘀的竞争中胜出,相反地,“Uber”在中国的业务还被“嘀嘀”收购了。</p> +<p>被用于数据分析的工具也被抛弃不再使用。</p> +<p>后来作者选择了将那个像 Excel 的表格代码放在了 <a class="link" href="github.com/WebSheets/websheets" >Github 进行开源,地址在这里</a>。</p> +<h2 id="资源">资源</h2> +<h3 id="通用-web-应用服务器">通用 Web 应用服务器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-32-34.png" +width="690" +height="356" +loading="lazy" +class="gallery-image" +data-flex-grow="193" +data-flex-basis="465px" +></p> +<p><a class="link" href="https://unit.nginx.org/" target="_blank" rel="noopener" +>NGINX Unit</a>,通用 Web 应用服务器。是一个轻量且多功能的应用运行时,作为一个单一的开源服务器,它提供了您的 Web 应用程序所需的基本组件:运行应用程序代码(包括 WebAssembly)、提供静态资源、处理 TLS 和请求路由。</p> +<p>Unit 是由 NGINX 团队成员从零开始创建的,以在运行时高度高效且完全可配置。最新版本是 1.31.0,于 2023 年 8 月 31 日发布。</p> +<h3 id="绿色安卓-app-合集">绿色安卓 App 合集</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-32-52.png" +width="690" +height="385" +loading="lazy" +class="gallery-image" +data-flex-grow="179" +data-flex-basis="430px" +></p> +<p><a class="link" href="https://www.simplemobiletools.com/" target="_blank" rel="noopener" +>绿色安卓app合集</a>。</p> +<p>这个网站收集了一大批良心 app,全部没有广告且不要求隐私权限。</p> +<p>几乎涵盖了日常使用的所有类型,包括艺术绘画、音乐播放器、笔记、文件管理、录音、拍照等。 ​​​</p> +<h3 id="nuejs">nuejs</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-33-10.png" +width="690" +height="455" +loading="lazy" +class="gallery-image" +data-flex-grow="151" +data-flex-basis="363px" +></p> +<p><a class="link" href="https://nuejs.org/" target="_blank" rel="noopener" +>nuejs</a>,越来越多的人对前端开发的混乱感到不满了。不同的是有人选择抱怨,有人撸起袖子开干。nuejs 的作者觉得现在使用 React、Vue 等框架再加上若干服务端渲染框架,使得前端开发生态变得越来越复杂和掌握。于是自己动手开发了一个简单的轻量化框架,终极目标是构建一个简洁、高效的前端开发生态。</p> +<h3 id="1024-字节的网页可显示-3d-地球">1024 字节的网页,可显示 3D 地球</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-33-21.png" +width="447" +height="255" +loading="lazy" +class="gallery-image" +data-flex-grow="175" +data-flex-basis="420px" +></p> +<p><a class="link" href="https://aem1k.com/world/" target="_blank" rel="noopener" +>1024 字节的 JavaScript,在网页中显示动画 3D 地球模型</a>,页面动画显示的就是其源代码。</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span><span class="lnt">11 +</span><span class="lnt">12 +</span><span class="lnt">13 +</span><span class="lnt">14 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="p">.</span><span class="o">&lt;</span><span class="nx">script</span><span class="o">&gt;</span> +</span></span><span class="line"><span class="cl"><span class="nb">eval</span><span class="p">(</span><span class="nx">z</span><span class="o">=</span><span class="s1">&#39;p=&#34;&lt;&#34;+&#34;pre&gt;&#34;/* ,.oq#+ ,._, */;for(y in n=&#34;zw24l6k\ +</span></span></span><span class="line"><span class="cl"><span class="s1">4e3t4jnt4qj24xh2 x/* =&lt;,m#F^ A W###q. */42kty24wrt413n243n\ +</span></span></span><span class="line"><span class="cl"><span class="s1">9h243pdxt41csb yz/* #K q##H######Am */43iyb6k43pk7243nm\ +</span></span></span><span class="line"><span class="cl"><span class="s1">r24&#34;.split(4)){/* dP cpq#q##########b, */for(a in t=pars\ +</span></span></span><span class="line"><span class="cl"><span class="s1">eInt(n[y],36)+/* p##@###YG=[#######y */(e=x=r=[]))for\ +</span></span></span><span class="line"><span class="cl"><span class="s1">(r=!r,i=0;t[a/* d#qg `*PWo##q#######D */]&gt;i;i+=.05)wi\ +</span></span></span><span class="line"><span class="cl"><span class="s1">th(Math)x-= /* aem1k.com Q###KWR#### W[ */.05,0\ +</span></span></span><span class="line"><span class="cl"><span class="s1">x;)p+=&#34; *#&#34;/* b. OQ####x#K */[e[x++]+e[x++\ +</span></span></span><span class="line"><span class="cl"><span class="s1">]]||(S=(&#34;eval&#34;/* l `X#####D , */+&#34;(z=\&#39;&#34;+z.spl\ +</span></span></span><span class="line"><span class="cl"><span class="s1">it(B = &#34;\\\\&#34;)./* G####B&#34; # */join(B+B).split\ +</span></span></span><span class="line"><span class="cl"><span class="s1">(Q=&#34;\&#39;&#34;).join(B+Q/* VQBP` */)+Q+&#34;)//m1k&#34;)[x/2\ +</span></span></span><span class="line"><span class="cl"><span class="s1">+61*y-1]).fontcolor/* TP */(/\\w/.test(S)&amp;&amp;&#34;#\ +</span></span></span><span class="line"><span class="cl"><span class="s1">03B&#34;);document.body.innerHTML=p+=B+&#34;\\n&#34;}setTimeout(z)&#39;</span><span class="p">)</span><span class="c1">// +</span></span></span></code></pre></td></tr></table> +</div> +</div><h3 id="全球-ip-地址地理位置数据库">全球 IP 地址地理位置数据库</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-050-%E6%9C%9F/2023-09-19-13-33-35.png" +width="690" +height="385" +loading="lazy" +class="gallery-image" +data-flex-grow="179" +data-flex-basis="430px" +></p> +<p><a class="link" href="https://ipapi.is/geolocation.html" target="_blank" rel="noopener" +>全球 IP 地址 地理位置数据库</a>。含 IPV4 和 IPV6。 ​​<a class="link" href="https://ipapi.is/geolocation.html" target="_blank" rel="noopener" +>​这篇文章里还介绍了构建 IP 地址地理数据库的实现原理</a>和一套具有指导意义的实现方法。基本原理是:“互联网中的每个 IP 地址都由组织拥有或管理。可以向互联网注册机构查询WHOIS信息。”</p> +<h2 id="观点">观点</h2> +<h3 id="为什么-facebook-的-pytorch-占有率赢了-google-的-tensorflow">为什么 Facebook 的 PyTorch 占有率赢了 Google 的 Tensorflow</h3> +<p>Pytorch 已经完全击败了 Tensorflow,成为 AI 开发框架的事实标准。Pytorch 一开始就专注于学术界,方向是把最牛的人吸引过来。而 Tensorflow 则倾向于软件工程炫技,做各种简单但是酷炫的功能。</p> +<p>最终专业化的 torch 击败了 tensorflow 。 我觉得​​​还有一个原因就是 Google 特别容易弃坑,Tensorflow 中间也切换过前后不兼容的 API。</p> +<h3 id="越来越多的科技产品让人更好地欺骗自己">越来越多的科技产品让人更好地欺骗自己</h3> +<p>比如美颜相机、电影特效、游戏等,研发它们的主要目的就是让人们更好的实现自我欺骗和催眠。</p> +<h3 id="东方文明为什么警惕科技我个人不完全同意">东方文明为什么警惕科技(我个人不完全同意)</h3> +<p>中国古代对于科技非常警惕和打压的原因,也许是古人早就意识到科技(或技术)力量很容易对人类造成强烈反噬。</p> +<p>观点来自 <a class="link" href="https://www.bilibili.com/video/BV1pu4y1r7KW/" target="_blank" rel="noopener" +>@​​​安东尼2001:量子自旋理论背后,是人类历史的轮回</a>。</p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 049 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/Tue, 12 Sep 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-34-22.png" alt="Featured image of post 机器文摘 第 049 期" /><h1 id="机器文摘-第-049-期">机器文摘 第 049 期</h1> +<h2 id="长文">长文</h2> +<h3 id="在-linux-环境里执行-windows-应用程序">在 Linux 环境里执行 Windows 应用程序</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-33-44.png" +width="512" +height="512" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +></p> +<p>最近遇到一个难以启齿的需求,服务器是 Linux 环境,但是某项服务功能却需要执行一个 Windows exe 文件。</p> +<p>不得已才想到要求助 Wine 这个经典中间层,据说可以使的 Linux 兼容大部分的 Win32 程序。</p> +<p>但是又不想污染服务器的其他环境,于是选择在容器中运行。</p> +<p>在网上找到了这篇<a class="link" href="https://leimao.github.io/blog/Docker-Wine/" target="_blank" rel="noopener" +>《利用 Docker 容器和 Wine 在 Linux里运行 Windows 程序》</a>,按照文中介绍的步骤成功实现了需求。</p> +<p>基本步骤: +1、根据文章提供的 Dockfile 构建镜像; +2、运行镜像并注意配置运行容器的环境变量; +3、执行所需的 exe 程序。</p> +<h3 id="windows-系统是怎样进行引导的">Windows 系统是怎样进行引导的</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-34-06.png" +width="690" +height="976" +loading="lazy" +class="gallery-image" +data-flex-grow="70" +data-flex-basis="169px" +></p> +<p>前不久,我在给笔记本更换大容量固态硬盘的时候,由于不愿重做系统,使用了硬盘克隆功能,将原盘整体信息直接克隆到新硬盘。</p> +<p>结果克隆成功并替换安装硬盘之后,却没能正常引导进入 Windows,而是进入了一个类似 PE 系统的界面(猜测是原盘中厂家自制的),并告知我由于检测到硬件更换,拒绝引导,并建议我选择恢复系统。</p> +<p>我猜测之前的隐藏分区可能有笔记本厂家做的一些特定引导程序,才导致这样的情况。</p> +<p>我对系统引导的理解还停留在 MBR 分区表大面积应用的阶段。于是尝试删除了隐藏分区,并手动将系统盘分区设置为了 “激活”分区(事实上这时候已经错了,因为 GPT 分区表方式下无法采用这种引导方式了)。</p> +<p>结果系统干脆直接无法引导。出现这种情况,我之前的知识储备显然不够用了。</p> +<p>经过一番折腾和搜索,我才得知现在 Windows 8 及以上版本操作系统的电脑所采用的方式是 GPT 分区表 + UEFI 引导。</p> +<p>也就是说硬盘上需要单独开辟一个分区存储负责进行操作系统引导的工作。这个分区平时对于操作系统的资源管理器不可见(但磁盘管理中可以看到),由主板上的 UEFI 程序(这个程序可以理解为 BIOS 的升级版)进行访问和管理。</p> +<p>了解这个方式之后,就简单了,重新使用工具修改 GPT 分区并制作专用引导分区即可。</p> +<p>最后,为了弄清这跟之前的 MBR 引导方式有什么区别,我找到了一位运维工程师总结得较到位的文章<a class="link" href="https://zhuanlan.zhihu.com/p/355526135" target="_blank" rel="noopener" +>《Windows系统开机引导顺序简述及运维小结》</a>。</p> +<h3 id="500-行代码写一个-c-编译器">500 行代码写一个 C 编译器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-34-22.png" +width="690" +height="690" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +></p> +<p><a class="link" href="https://vgel.me/posts/c500/" target="_blank" rel="noopener" +>500 行 Python 代码写一个 C 编译器</a>。</p> +<p>作者立下这个 flag 之后才发现任务有多难。</p> +<p>主要是代码行数太少了,如果使用传统手段实现,可能这点儿代码量还不够写个语法分析器的。</p> +<p>于是作者主动放弃了 AST (抽象语法树)的构建,采用 Token 提取和指令生成“一遍过”的方式,实现了一个相当“简洁”的 C 编译器。</p> +<h2 id="资源">资源</h2> +<h3 id="假装弹钢琴">假装弹钢琴</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-34-51.png" +width="690" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="204" +data-flex-basis="491px" +></p> +<p><a class="link" href="http://touchpianist.com/" target="_blank" rel="noopener" +>touchpianist</a>,在线弹钢琴的网站(也提供手机 App 版),可以让你假装钢琴大师,只需要按键盘上的任意键,旋律就会自动演奏,不过你要控制敲击键盘的速度,以匹配原曲的节奏。我弹了一下,默认曲目是贝多芬的《月光奏鸣曲》,差点儿被自己陶醉了。 ​​​</p> +<h3 id="bun-v10">Bun V1.0</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-35-09.png" +width="690" +height="419" +loading="lazy" +class="gallery-image" +data-flex-grow="164" +data-flex-basis="395px" +></p> +<p><a class="link" href="https://bun.sh/blog/bun-v1.0" target="_blank" rel="noopener" +>bun-v1.0</a>,拳打 node , 脚踢 deno 的 JavaScript 运营环境 bun 推出了 1.0 版本。主打一个“All in one”,号称可以一次性取代一揽子工具:node、npx、npm、webpack、tsc、babel、jest。一个工具包揽了运行、打包、包管理、转译、测试等所有事情,且速度是 nodejs 的 3 倍。</p> +<p>对于这种吹的比较厉害的技术,保持关注,谨慎使用吧。</p> +<h3 id="开源基于-llm-知识库平台">开源基于 LLM 知识库平台</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-35-24.png" +width="690" +height="334" +loading="lazy" +class="gallery-image" +data-flex-grow="206" +data-flex-basis="495px" +></p> +<p><a class="link" href="https://github.com/labring/FastGPT" target="_blank" rel="noopener" +>FastGPT</a> - 基于 LLM 大模型的 AI 知识库问答系统。提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景。项目在 Github 开源,采用技术栈: NextJs + TS + ChakraUI + Mongo + Postgres(Vector 插件)。支持 GPT、Claude、Spark、ChatGLM 等多种 LLM 模型。</p> +<h3 id="开源基于-llm-数据可视化平台">开源基于 LLM 数据可视化平台</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-049-%E6%9C%9F/2023-09-12-13-35-35.png" +width="690" +height="292" +loading="lazy" +class="gallery-image" +data-flex-grow="236" +data-flex-basis="567px" +></p> +<p><a class="link" href="https://github.com/microsoft/lida" target="_blank" rel="noopener" +>lida</a>,微软出品的数据可视化工具库,特点是基于 LLM 对话模型进行生成,其生成的可视化代码支持多种可视化后端的语法,包括 matplotlib、seaborn、d3等。 ​​​</p> +<h2 id="观点">观点</h2> +<h3 id="编程是一种体育锻炼">编程是一种体育锻炼</h3> +<p>编程除了是一种可以以之谋生的专业技能,对于那些真喜欢编程的人来说,它还是一个心理疗愈工具。</p> +<p>编程能使人专注,进入“心流”状态比较容易,也容易让人的心态平和。</p> +<p>编程与体育锻炼一样,都是可以让人受益终生的活动。</p> +<p>&mdash;-来自<a class="link" href="https://weibo.com/1461522430/NiEh1BHMt" target="_blank" rel="noopener" +>@软件教书匠金旭亮</a>。</p> +<h3 id="造成电子阳痿的一种因素">造成电子阳痿的一种因素</h3> +<p>一个不容忽视的因素是现在游戏的加载速度,尤其是 PC 游戏。</p> +<p>我们被碎片化信息惯得一秒钟都不想等待。</p> +<p>每当想玩会儿 CS 或者地平线之类得游戏,光是等待游戏启动、地图加载等就足以让人放弃想玩的念头。</p> +<p>更别提有些游戏还有一些跳都无法跳过得开场引导视频。</p> +<p>所以我现在就算是玩也是偶尔打开模拟器玩一玩老游戏,带有状态存储,随时加载存档。</p> +<p>据说有一部分游戏主机(比如新一代 XBox)有类似笔记本电脑的睡眠功能,开机就玩,随时进入上次未完成的任务。</p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 048 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/Tue, 05 Sep 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/<h1 id="机器文摘-第-048-期">机器文摘 第 048 期</h1> +<h2 id="长文">长文</h2> +<h3 id="关于-python-语言的一些统计数字">关于 Python 语言的一些统计数字</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-20-05.png" +width="690" +height="307" +loading="lazy" +class="gallery-image" +data-flex-grow="224" +data-flex-basis="539px" +></p> +<p><a class="link" href="https://py-code.org/stats" target="_blank" rel="noopener" +>关于开源 Python 仓库的一些有趣统计</a>,有人克隆了 PyPI 网站里所有 Python 包对应的 Github 仓库,并对这些仓库里的全部文件进行了分析和统计。</p> +<p>1、排名前三的语法特性分别是:列表推导、fstring字符串格式化、注解;</p> +<p>2、代码中大约包含有超过 2 万 5 千个密钥明文,泄露最多的是访问 Google API、OpenAI API和腾讯云 Secret ID;</p> +<p>3、截止到 2023 年 8 月,所有源码加起来已超过 60TB ,文件数量超过 10 亿。</p> +<h3 id="wasm-技术让数据库执行-ai-模型">Wasm 技术让数据库执行 AI 模型</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-20-30.png" +width="618" +height="492" +loading="lazy" +class="gallery-image" +data-flex-grow="125" +data-flex-basis="301px" +></p> +<p><a class="link" href="https://dylibso.com/blog/pg-extism/" target="_blank" rel="noopener" +>使用 Extism 将 WebAssembly 引入 PostgreSQL</a>。</p> +<p>这篇文章的作者介绍了一种方法,可以使用 Wasm 技术通过扩展插件的方式给 PostgreSQL 数据库增加 UDF (用户自定义函数),从而实现调用 AI 模型的能力。</p> +<h3 id="bitlocker-硬件加密能破解吗">BitLocker 硬件加密能破解吗?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-20-50.png" +width="690" +height="499" +loading="lazy" +class="gallery-image" +data-flex-grow="138" +data-flex-basis="331px" +></p> +<p>BitLocker 是 Windows 下的存储加密技术,用于保护硬盘中的数据安全。</p> +<p>未经解密的硬盘即使遗失或者被接入其他系统也无法进行读取。</p> +<p>这在极大程度上带来了数据安全(不过仍有不少用户在不知情的情况下开启了 BitLocker 且未保存密钥,在重做系统的时候发现硬盘无法解密,数据无法恢复。。欲哭无泪。。)。</p> +<p>然而这种加密方式也不是绝对安全,国外有技术爱好者对此进行了挑战,并使用一台逻辑分析仪成功绕过了加密。</p> +<p><a class="link" href="https://www.errno.fr/BypassingBitlocker.html" target="_blank" rel="noopener" +>这篇文章进行了详细的记录</a>。</p> +<p>主要原理为:在系统开机启动过程中的某个时刻,加密芯片和 CPU 之间传输了未加密的信号。使用逻辑分析仪捕获该信号可以逆向出加密密钥。</p> +<h2 id="资源">资源</h2> +<h3 id="监控网页信息变化的工具">监控网页信息变化的工具</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-21-17.png" +width="499" +height="326" +loading="lazy" +class="gallery-image" +data-flex-grow="153" +data-flex-basis="367px" +></p> +<p><a class="link" href="https://github.com/dgtlmoon/changedetection.io" target="_blank" rel="noopener" +>changedetection</a>,一个监控网站变化的工具。</p> +<p>帮助用户密切关注商品打折、股票行情、政策发布等信息变动。</p> +<p>支持通过网页可视化的方式指定监控页面区域。</p> +<p>通过邮件、即时聊天软件、API调用等多种方式推送信息。可使用 Docker 部署,或者本地 Python 环境部署。</p> +<h3 id="switch-模拟器">Switch 模拟器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-21-28.png" +width="690" +height="472" +loading="lazy" +class="gallery-image" +data-flex-grow="146" +data-flex-basis="350px" +></p> +<p><a class="link" href="https://github.com/Ryujinx/Ryujinx" target="_blank" rel="noopener" +>Ryujinx</a> 一个用c# 写的开源 switch 模拟器,该模拟器旨在提供卓越的准确性和性能、用户友好的界面以及稳定的版本构建。 ​​​</p> +<h3 id="文字缩写快捷键工具">文字缩写快捷键工具</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-21-45.png" +width="568" +height="446" +loading="lazy" +class="gallery-image" +data-flex-grow="127" +data-flex-basis="305px" +></p> +<p>为了减少打字量,国外这哥们写了个脚本将日常用语全部缩写了,只需敲入缩写字母,脚本自动完成完整句子的键盘输入。</p> +<p>比如: +st =&gt; something +ab =&gt; about +hw =&gt; hardware +sti =&gt; sometime</p> +<p>据小哥自己统计,使用这个脚本以后他已经减少了一半的键盘敲击量。</p> +<p><a class="link" href="https://github.com/eschluntz/compress" target="_blank" rel="noopener" +>项目名叫 compress 目前已开源</a>,如果你有兴趣,改成支持中文也不是不可以。</p> +<h3 id="canvas-手册">Canvas 手册</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-048-%E6%9C%9F/2023-09-05-13-22-11.png" +width="562" +height="625" +loading="lazy" +class="gallery-image" +data-flex-grow="89" +data-flex-basis="215px" +></p> +<p>Canvas 是网页中用于图形绘制的基本元素,结合 JavaScript 可以实现各种复杂的图形效果和交互动画。我之前都是每次用到了的时候现去翻文档,对它的每个 API 都是一知半解。这里有一个<a class="link" href="https://bucephalus.org/text/CanvasHandbook/CanvasHandbook.html" target="_blank" rel="noopener" +>Canvas 手册</a>,详细介绍了 Canvas 的各种调用接口。适合希望深度使用及系统学习 Canvas。</p> +<h2 id="观点">观点</h2> +<h3 id="不要重复造轮子是人为设置的一种限制">“不要重复造轮子”是人为设置的一种限制</h3> +<p>遇到需求不能满足的情况,是去“寻找轮子”还是“动手创造轮子”,这是两种不同的思维习惯。</p> +<p>“寻找轮子”往往意味着寻找已有答案,将问题看为一种正常的状态,是“自古以来”、是“从来如此”。</p> +<p>思维定势一旦形成,就很难改变,让人成了那个在沙漠中让美女帮他牵住骆驼的矮子。</p> +<p>动手创造者往往是发现这种问题的人,他们不循规蹈矩,他们 Think different,是改变世界的人。</p> +<p>“不要重复发明轮子”,这个原则用于工作中确实比较安全,他保证了不会浪费资源,并且避免了一定的技术风险。</p> +<p>但也同时拒绝了伟大的创新。</p> +<p>所以不要被这句话束缚,尽管去做自己的轮子。</p> +<p>哪怕它一开始很丑。</p> +<p>你的轮子必将使你与众不同,使你拥有不一样的视角,成为那个动手创造的人。</p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 047 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/Tue, 29 Aug 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/<h1 id="机器文摘-第-047-期">机器文摘 第 047 期</h1> +<h2 id="长文">长文</h2> +<h3 id="业余爱好者痴迷于工具专业人士注重技能">业余爱好者痴迷于工具,专业人士注重技能</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-17-36.png" +width="649" +height="582" +loading="lazy" +class="gallery-image" +data-flex-grow="111" +data-flex-basis="267px" +></p> +<p><a class="link" href="https://adamsinger.substack.com/p/amateurs-obsess-over-tools-pros-over" target="_blank" rel="noopener" +>业余爱好者痴迷于工具,专业人士注重技能</a>。</p> +<blockquote> +<p>以原声吉他为例。在数字音乐制作和合成器盛行的时代,这个单独演奏的乐器可能显得有点古老。然而,在熟练音乐家的手中,它变成了一个充满迷人旋律和触动灵魂的载体。它甚至可能为更大的创意提供灵感,如果你直接跳到现代合成器就有可能会错过这些。原声吉他的简单性促使艺术家专注于演奏的细微之处,完善他们的指弹技巧,并通过每一次弹奏传达情感。真正的魔力不在于吉他本身,而在于将其演绎得生动活泼的音乐家的技艺。</p> +</blockquote> +<p>这篇文章读来深有感触。</p> +<p>在解决问题的时候,我总是忍不住问自己,我这个方法是最优的吗?我使用的工具是不是最合适/最好的?</p> +<p>这种心理,常常使我陷入对最佳实践和完美工具的追求中,而忘记了解决问题本身。</p> +<p>时间久了,工具积累一大堆,但每个都未曾发挥其真正作用,一边老工具在吃灰,一边继续寻找新工具。</p> +<p>差生文具多。</p> +<p>正如文章中所说:真正的高手明白,应当拿起手里已有的工具,先行动起来。在这个过程中如果有机会创造美好的事物,好的工具自然会出现在眼前。</p> +<h3 id="cpu-的指令分支预测">CPU 的指令分支预测</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-17-49.png" +width="682" +height="743" +loading="lazy" +class="gallery-image" +data-flex-grow="91" +data-flex-basis="220px" +></p> +<p>现代的 CPU 基本都具有指令分支预测的特性,通过猜测后续会执行的指令分支,提前运行一些指令和设置状态,可以有效利用 CPU 的执行资源,提升效率。</p> +<p>不过,如果预测准确的话效率提升十分明显,但是如果预测错误,CPU 就要多做一些事情(刷新后续预测的指令和相关的状态),随着现代 CPU 中指令流水线越来越复杂,这种代价也变得越来愈大。</p> +<p>在编程的时候,编写一些对于 CPU 分支预测友好的代码,能够对性能产生极大的影响。</p> +<p>这篇<a class="link" href="https://johnnysswlab.com/how-branches-influence-the-performance-of-your-code-and-what-can-you-do-about-it/" target="_blank" rel="noopener" +>对于 CPU 的分支预测,我们能做什么</a>耐心地从 CPU 的分支预测机制讲起,通过具体的代码举例,讲解了怎样让编写的代码对 CPU 分支预测这类优化更加友好。</p> +<h3 id="ssh-命令详解">SSH 命令详解</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-18-25.png" +width="690" +height="535" +loading="lazy" +class="gallery-image" +data-flex-grow="128" +data-flex-basis="309px" +></p> +<p><a class="link" href="https://grahamhelton.com/blog/ssh-cheatsheet/" target="_blank" rel="noopener" +>SSH 命令详解</a>,一篇对 SSH 命令的参数介绍十分详细且易懂的文章。</p> +<p>通过举例让我彻底弄清楚了基于 SSH 的端口转发。</p> +<p>另外还知道了可以在已有的 SSH 连接上执行补充命令,以实现不断开终端的情况下将远程主机上的端口转发到本机访问。 ​​​</p> +<h2 id="资源">资源</h2> +<h3 id="开源的房子">开源的房子</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-18-47.png" +width="690" +height="403" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="410px" +></p> +<p><a class="link" href="https://www.wikihouse.cc" target="_blank" rel="noopener" +>wikihouse</a>,是一个开源房屋建造网站,房子的图纸、模型均可从网站上下载,里面有各式各样的房屋建造资料,任何人都可以据此增删、设计、制造、组装自己的建筑。可以理解为建筑界的 github。 +​​​</p> +<h3 id="关掉-edge-浏览器新增的圆角样式">关掉 Edge 浏览器新增的圆角样式</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-19-03.png" +width="690" +height="352" +loading="lazy" +class="gallery-image" +data-flex-grow="196" +data-flex-basis="470px" +></p> +<p>Edge 浏览器的最新更新里,给所有页面强制增加了一个圆角边框,看起来很不习惯(丑陋)。</p> +<p>经过研究,我发现,如果想恢复到之前的样子,可以在设置外观选项里关闭该特性。</p> +<p>我已经关闭,并果断给这个功能特性反馈了负面评价。</p> +<h3 id="hello-world">Hello World</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-19-26.png" +width="690" +height="385" +loading="lazy" +class="gallery-image" +data-flex-grow="179" +data-flex-basis="430px" +></p> +<p><a class="link" href="https://github.com/leachim6/hello-world" target="_blank" rel="noopener" +>Hello World</a> ,这个仓库收录了几乎所有编程语言(997种)的 Hello world 程序。 ​​​</p> +<h3 id="前端开发代码大全">前端开发代码大全</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-19-42.png" +width="690" +height="639" +loading="lazy" +class="gallery-image" +data-flex-grow="107" +data-flex-basis="259px" +></p> +<p><a class="link" href="https://30secondsofcode.org" target="_blank" rel="noopener" +>30secondsofcode</a>。</p> +<p>这个网站有大量可复用的代码片段,主要是 Javascript、CSS、HTML 、Python 等语言的内容,可以覆盖 Web 应用开发全栈。</p> +<p>里面收录的代码段或者文章都很清新,每个都配有细心的解释,具有良好的实用性。 ​​​</p> +<h3 id="关于-win10-的锁屏睡眠时间">关于 Win10 的锁屏睡眠时间</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-20-00.png" +width="410" +height="502" +loading="lazy" +class="gallery-image" +data-flex-grow="81" +data-flex-basis="196px" +></p> +<p>我在使用 Windows10 的时候发现一个问题。</p> +<p>无论我将电源设置里的睡眠时间、显示器空闲关闭时间设置多长,锁屏后系统都会在 1 分钟之后关闭显示器。</p> +<p>这会带来一些不方便,并且让人困惑。</p> +<p>在经过一番研究搜索之后,找到了如下解决方案(Windows就是这么喜欢在注册表隐藏设置):</p> +<p>1、打开注册表编辑器后。</p> +<p>2、定位到:<code>计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\7516b95f-f776-4464-8c53-06167f40cc99\8EC4B3A5-6868-48c2-BE75-4F3044BE88A7</code></p> +<p>3、修改右侧的Attributes 数值为2 (初始值为1)</p> +<p>4、再打开“编辑电源计划”时会发现多了一个选项“控制台锁定显示关闭超时。</p> +<h3 id="红警2游戏整合包">红警2游戏整合包</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-047-%E6%9C%9F/2023-08-29-13-20-25.png" +width="413" +height="302" +loading="lazy" +class="gallery-image" +data-flex-grow="136" +data-flex-basis="328px" +></p> +<p><a class="link" href="https://tmioe.com/7991.html" target="_blank" rel="noopener" +>红警2 的民间整合包</a>,支持 win7 到 win11。整合大量资源,傻瓜式一键安装。 ​​​</p> +<p>经过我的测试,前面链接页面里提供的安装包里带有额外的广告脚本,在使用时可使用 7z 等压缩软件直接打开该自解压包,选取主文件夹拷贝出来即可。</p> +<h2 id="观点">观点</h2> +<h3 id="隐形的门槛">隐形的门槛</h3> +<p>也许每个领域都存在一个隐形的门槛,无论是你学会一种语言,还是掌握一种能力,哪怕是打通一个游戏,只要你跨不过那个门槛,那么无论你尝试多少次,都会在同样的水平下无功而返。相反,一旦跨过后,那就是一马平川,你有了在那个新世界周游的能力。这当然不是说你不会再遇到困难,而是说,你不再有那种尝试了无数次,带着同一种感受离开的感觉。剩下的区别只是更多经验的积累,是熟练度的问题,因为你已经在那个轨道上了,你已经拿到了入场券。</p> +<p>人生可以被隐喻成一个有着自然消退机制的RPG体系,累积10000经验可以升那关键的一级,那么先前你无论你多少次到达5000,6000,9000都不行,因为熟练度会反复消退到1000,2000的水平。而我知道,很多人就是无数次的卡在了那9000以内,但每次都要从1000,2000这个位置开始。这个和自我接纳也没有关系,因为你知道你遇到的困难并不是基于你对自己的苛求,你的困难在于你无法为自己在乎的事情付出真正的努力,无法将自己的活力与热情持续的灌注在同一个点上,但你隐约知晓跨过那10000的门槛,是你更重要的人生福祉。</p> +<p>来自微博 <a class="link" href="https://weibo.com/3762961402/NgprO9HD5" target="_blank" rel="noopener" +>@崔庆龙_</a></p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 046 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/Tue, 22 Aug 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/<h1 id="机器文摘-第-046-期">机器文摘 第 046 期</h1> +<h2 id="长文">长文</h2> +<h3 id="windows-的任务管理器">Windows 的任务管理器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-28-48.png" +width="452" +height="758" +loading="lazy" +class="gallery-image" +data-flex-grow="59" +data-flex-basis="143px" +></p> +<p>如果你喜欢使用 Windows 任务管理器来查杀那些不安分的进程,并且跟我一样讨厌他们乱跳(尤其在按照资源占用排序时)。你可以按下 Ctrl 键,它就会神奇地停止更新直到你松开 Ctrl。</p> +<p>Windows 操作系统有一种魔力,就是哪怕你用了将近 20 年,还是会有你不知道的快捷键或者快捷操作。这些东西有时候能带来一些惊喜。</p> +<p>具体介绍可以看这里:<a class="link" href="https://www.theverge.com/2023/8/16/23834125/microsoft-windows-task-manager-pause-shortcut" target="_blank" rel="noopener" +>暂停 Windows 任务管理器</a></p> +<h3 id="linux-内核最初版的解析">Linux 内核最初版的解析</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-29-10.png" +width="588" +height="253" +loading="lazy" +class="gallery-image" +data-flex-grow="232" +data-flex-basis="557px" +></p> +<p>最新版本的 Linux 内核,其源码规模已经飙升至 3600 万行,想要深入细节去了解它十分吃力。</p> +<p>而Linux 的第一个版本 v0.01 却非常小巧。</p> +<p>刨去注释和空行的话,也就 8 千来行代码。</p> +<p>这么小的代码结构,足够理解操作系统的精髓。</p> +<p>这篇<a class="link" href="https://seiya.me/blog/reading-linux-v0.01" target="_blank" rel="noopener" +>探索 Linux v0.01 d的内部结构</a>,可以带你像参观历史博物馆那样去见证曾经的 Linux。</p> +<p>我记录了一些有意思的地方:</p> +<p>1、v0.01 只有 66 个系统调用,用于支持文件管理和进程管理,分别是:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt"> 1 +</span><span class="lnt"> 2 +</span><span class="lnt"> 3 +</span><span class="lnt"> 4 +</span><span class="lnt"> 5 +</span><span class="lnt"> 6 +</span><span class="lnt"> 7 +</span><span class="lnt"> 8 +</span><span class="lnt"> 9 +</span><span class="lnt">10 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">access acct alarm <span class="nb">break</span> brk chdir chmod +</span></span><span class="line"><span class="cl">chown chroot close creat dup dup2 execve +</span></span><span class="line"><span class="cl"><span class="nb">exit</span> fcntl fork fstat ftime getegid geteuid +</span></span><span class="line"><span class="cl">getgid getpgrp setsid getpid getppid +</span></span><span class="line"><span class="cl">getuid gtty ioctl <span class="nb">kill</span> link lock lseek +</span></span><span class="line"><span class="cl">mkdir mknod mount mpx nice open pause +</span></span><span class="line"><span class="cl">phys pipe prof ptrace <span class="nb">read</span> rename rmdir +</span></span><span class="line"><span class="cl">setgid setpgid setuid setup signal stat +</span></span><span class="line"><span class="cl">stime stty sync <span class="nb">time</span> <span class="nb">times</span> <span class="nb">ulimit</span> <span class="nb">umask</span> +</span></span><span class="line"><span class="cl">umount uname unlink ustat utime waitpid write +</span></span></code></pre></td></tr></table> +</div> +</div><p>其中 mount 调用啥也没干,直接返回了。</p> +<p>2、直接写死代码绑定 Intel 386 平台。至今对于 PS/2 接口的键盘、ATA硬盘、VGA显卡等标准硬件的驱动代码还是写死在内核里(而不是放在drivers文件夹)。</p> +<p>3、系统崩溃处理代码只有 5 行:只实现了打印一句“我不行了”,然后进入死循环<code>for(;;);</code>。</p> +<h3 id="llamacpp-是怎样做到的">LLaMa.cpp 是怎样做到的?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-29-37.png" +width="540" +height="531" +loading="lazy" +class="gallery-image" +data-flex-grow="101" +data-flex-basis="244px" +></p> +<p>LLaMa.cpp 是一个令人惊叹的项目,在它之前没有人能够在低端消费设备上成功运行 Meta 开源的人工智能模型 LLaMa ,因为那需要太多的硬件资源。</p> +<p>但是 LLaMa.cpp 的横空出世使得在 M2 Macbook Pro、Android Pixel5 手机甚至树莓派上运行 LLaMa 的 7B 模型成为可能。</p> +<p>这是怎么做到的?</p> +<p>带着这个疑问,有网友深入研究了这个项目,并写下了这篇<a class="link" href="https://finbarr.ca/how-is-llama-cpp-possible/" target="_blank" rel="noopener" +>How is LLaMa.cpp possible?</a>以解释原因。</p> +<p>作者认为主要得益于对模型参数的量化,降低模型参数的精度,从 FLOAT16 减小到 INT4。使得 LLaMa.cpp 能够以较少的计算资源甚至只依赖 CPU 的情况下加载大模型。</p> +<h3 id="逐渐觉得微软比谷歌良心">逐渐觉得微软比谷歌良心</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-30-01.png" +width="690" +height="372" +loading="lazy" +class="gallery-image" +data-flex-grow="185" +data-flex-basis="445px" +></p> +<p>曾经微软是技术黑客的公敌,被不少人视为反对技术创新、技术开放的最大反派。</p> +<p>不过随着时间的推移,以及微软逐渐在开源社区所做出的努力。这一现象有所好转。</p> +<p>近期在 HN 上<a class="link" href="https://old.reddit.com/r/degoogle/comments/15pd5si/today_i_realized_i_now_trust_microsoft_more_than/" target="_blank" rel="noopener" +>有位网友很扭捏地承认:现在他对微软的感觉要比对谷歌好很多</a>。</p> +<p>他列举了一些关于两家公司的对比,包括发布的产品、主观的优劣评价等等。</p> +<p>为了抵制微软,他已经十多年没用 Windows 了,但貌似微软的其他产品“很香”(VS Code、Github、ChatGPT等)。</p> +<p>并表示最近正在寻摸租一个云存储,大概率也会用微软的 onedrive 而不是谷歌的 Google drivers。</p> +<p>对此我也有类似感觉,不过我对谷歌的不信任起始于十年前谷歌将 Google reader 停掉,而自从微软推出 WSL 后,我更是觉得微软在产品上越来越实在了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-31-23.png" +width="690" +height="538" +loading="lazy" +class="gallery-image" +data-flex-grow="128" +data-flex-basis="307px" +></p> +<h2 id="资源">资源</h2> +<h3 id="tailwindcss-的小抄">tailwindcss 的小抄</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-30-29.png" +width="690" +height="465" +loading="lazy" +class="gallery-image" +data-flex-grow="148" +data-flex-basis="356px" +></p> +<p>tailwind 这个 css 框架之所以能够很快流行起来,主要原因就是它解决了一个之前很多人没有太注意的问题,即 CSS 的“正交性”。</p> +<p>之前 CSS 实现一个效果,可以有 N 种方法,外加各种奇技淫巧,但在使用 tailwind 之后,针对特定效果都有了最优实践路径,而且还可以很容易组合。</p> +<p>不过由于它的类分的太细太碎,导致刚开始的时候会有一些不容易记忆。</p> +<p><a class="link" href="https://tailwindcomponents.com/cheatsheet/" target="_blank" rel="noopener" +>这里有一份 tailwind 的小抄</a>,适合初学者收藏,方便随时查阅。</p> +<h3 id="在浏览器中运行的-vim">在浏览器中运行的 vim</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-30-43.png" +width="690" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="204" +data-flex-basis="491px" +></p> +<p><a class="link" href="https://github.com/rhysd/vim.wasm" target="_blank" rel="noopener" +>vim.wasm</a>,在浏览器中运行的 Vim,不是插件。</p> +<p>使用 wasm 技术直接编译移植的 Vim Editor 源码,效果跟原生程序几乎一样。</p> +<p>使用 WebAssembly 给 Vim 提供一个新的 GUI 前端(类似 GVim)。</p> +<p>为了编译通过,作者在源码里禁用了很多 Wasm 不支持的特性,如:fork(2)、PTY 等。</p> +<p>可在这里体验:https://rhysd.github.io/vim.wasm/</p> +<h3 id="无隐私问题的-pdf-工具网站">无隐私问题的 pdf 工具网站</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-32-04.png" +width="690" +height="362" +loading="lazy" +class="gallery-image" +data-flex-grow="190" +data-flex-basis="457px" +></p> +<p><a class="link" href="https://pdftool.org/zh" target="_blank" rel="noopener" +>这个pdf工具可以尝试一下</a>,跟其他pdf 工具网站不同,这个网站借用 WebAssembly 技术将很多工作放在浏览器客户端执行,用户无需上传自己的pdf到网站,即可执行处理工作,包括:加密、解密、拆分、合并等常用功能。 ​​​</p> +<h3 id="深入理解操作系统的小游戏">深入理解操作系统的小游戏</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-046-%E6%9C%9F/2023-08-22-13-32-17.png" +width="690" +height="368" +loading="lazy" +class="gallery-image" +data-flex-grow="187" +data-flex-basis="450px" +></p> +<p><a class="link" href="https://plbrault.com/blog-posts/i-created-the-nerdierst-game-ever-en/" target="_blank" rel="noopener" +>这个自称史上最极客的小游戏</a>,是国外一位计算机科学教授给学生们写的一个小游戏,假设玩家是一个“操作系统”,在游戏里玩家需要不停地进程调度、内存页交换等操作,一旦调度不合理就会激怒用户导致“玩家”也就是操作系统被重启,游戏就 GAME OVER 了。</p> +<p>游戏使用 Python 编写,作者将其编译为 WebAssembly 以嵌入网页,这里可以直接在线体验: <a class="link" href="https://drfreckles42.itch.io/youre-the-os" target="_blank" rel="noopener" +>https://drfreckles42.itch.io/youre-the-os</a>。</p> +<h2 id="观点">观点</h2> +<h3 id="学习技能最有效的练习手段是复刻">学习技能最有效的练习手段是“复刻”</h3> +<p>这是我前两天尝试用 CSS 临时写个页面效果想到的。</p> +<p>我虽然也了解了CSS 语言的一些基本知识,但是在具体实操的时候仍会感到无从下手。</p> +<p>与下棋类似,只知道“规则”但是没有“套路”。</p> +<p>后来干脆找了几个目标页面,按照自己的想法去还原,渐渐能够摸到一些“套路”的边缘,最终实现了自己想要的效果。</p> +<p>于是我想: <strong>在学习一项技能的时候,“复刻”、“抄袭”、“借鉴”、“致敬”,都没有问题,应该把它作为最主要的练习手段。</strong></p> +<p>因为“抄”是最经济的学习方法了。</p> +<p>不仅仅是编程技能,艺术方面更是如此。</p> +<p>比如在编曲学习的时候有一种练习叫“扒带”,就是找一首歌,然后你通过你的工具和技巧制作一份完全一样的作品,尽量做到百分百还原。</p> +<p>很多“大师”都是在这个过程中,遇到问题解决问题,领悟到很多只能意会不能言传的技巧,而这些领悟是无论如何也无法仅仅通过“看”和“听”获得的。</p> +<p>另外,人们练字、绘画也是从临摹开始,一般在熟练之后才能突破,才又自成体系。</p> +<h3 id="忍耐守恒">忍耐守恒</h3> +<p>怕麻烦的人,主要是不能忍受一些事情。</p> +<p>然而正是因为这些不能忍受,所以注定要忍受一些其他的事情。</p> +<p>人生就是这样,比如无法忍受投资带来的风险,就得承受现金贬值;不能面对创业的压力,就得忍受按时上班的束缚。</p> +<p>对于这种现象,我将之称为“忍耐守恒”。 ​​​</p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 045 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/Tue, 15 Aug 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/<h1 id="机器文摘-第-045-期">机器文摘 第 045 期</h1> +<h2 id="长文">长文</h2> +<h3 id="基于浏览器-javascript-堆快照的网页爬虫">基于浏览器 JavaScript 堆快照的网页爬虫</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-23-22.png" +width="690" +height="546" +loading="lazy" +class="gallery-image" +data-flex-grow="126" +data-flex-basis="303px" +></p> +<p><a class="link" href="https://www.adriancooney.ie/blog/web-scraping-via-javascript-heap-snapshots" target="_blank" rel="noopener" +>基于 JavaScript 堆快照的网页爬虫</a>。</p> +<p>本文作者介绍了一个实现网络爬虫的新思路,据称已在生产上使用了一段时间,且效果不错。</p> +<p>比较典型的网络爬虫在爬取数据时,大都采用解析网页 DOM 的方式,或直接通过 HTTP 请求流直接解析,或使用无头浏览器进行解析。</p> +<p>但现在这项技术已经被很多网站、平台人为设置很多障碍,比如增加很多随机的嵌套等等。</p> +<p>作者某天福至心灵,想到一个点子。</p> +<p>利用浏览器提供的 JavaScript 内存堆快照功能,将内存里的全部信息扒下来,然后根据对应的 JavaScript 对象属性,按图索骥去找到真正需要的数据。</p> +<p>这种方法比较狠的地方在于,<strong>直接从后台的数据结构下手,跳过了对页面 DOM 的分析和拆解</strong>,而且据作者说,网站即便想通过混淆此类数据在内存中的属性名称来进行防御,其工作量还是相当大的。</p> +<p>所以,可能短期内无能为力。</p> +<p>作者说,也许全面转为 Web Assembly 才能彻底禁止他这种爬虫。</p> +<p><a class="link" href="https://github.com/adriancooney/puppeteer-heap-snapshot" target="_blank" rel="noopener" +>项目源码在这里</a></p> +<h3 id="intel-cpu-的崩溃攻击漏洞">Intel CPU 的“崩溃攻击”漏洞</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-23-45.png" +width="512" +height="512" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +></p> +<p><a class="link" href="https://downfall.page" target="_blank" rel="noopener" +>intel cpu 有一个崩溃攻击漏洞</a>,标识为 <a class="link" href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-40982" target="_blank" rel="noopener" +>CVE-2022-40982</a>,利用此漏洞可以在虚拟机里窃取共享同一个物理 CPU 的其他虚拟机的数据。</p> +<p>这个漏洞可以让恶意程序在本机运行后窃取如密码、加密密钥、以及个人电子邮件等私人数据。</p> +<p>恶意的云计算客户可以利用 Downfall 漏洞从与其共享同一台云计算机的其他客户那里窃取数据和凭据。</p> +<p>据文章作者(也即漏洞发现者)所说,该漏洞存在于 Intel Core 6 代到 11 代 CPU,并且研究人员发现存在通过 Web 网页浏览进行攻击的可能性。</p> +<p><a class="link" href="https://github.com/flowyroll/downfall/tree/main/POC" target="_blank" rel="noopener" +>作者开放了一部分用于测试攻击的代码在此</a></p> +<h3 id="利用树莓派的-gpio-发射无线信号">利用树莓派的 GPIO 发射无线信号</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-24-15.png" +width="690" +height="388" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></p> +<p><a class="link" href="https://hackaday.com/2021/04/06/fan-tastic-misuse-of-raspberry-pi-gpio/" target="_blank" rel="noopener" +>原来树莓派的 GPIO 还能干这个</a>,这位老哥使用树莓派的 GPIO 接口直接进行无线电波发射(没错,就是随便扯出一根线就可以当作天线了)。实现了基于树莓派的微型电台。</p> +<p>这得益于 <a class="link" href="https://github.com/F5OEO/rpitx" target="_blank" rel="noopener" +>rpitx</a>这个开源项目,项目本来是为了研究和学习一些无线电原理,不过后来逐渐成为一些 SDR 爱好者必不可少的工具了。</p> +<p><a class="link" href="https://www.youtube.com/watch?v=M2JY1_Xmokg&amp;t=8s" target="_blank" rel="noopener" +>我上次看到一个小哥使用 RTL-SDR 录制汽车遥控器信号,然后使用树莓派重复发射出来,成功实现了自家汽车的解锁</a>。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://oimo.io/works/water/" target="_blank" rel="noopener" +>water</a>,一个在网页里模拟流体动画的 Demo,使用 Haxe 语言编写。<a class="link" href="https://github.com/saharan/works/tree/main/water" target="_blank" rel="noopener" +>源码在这里</a> +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-24-42.png" +width="690" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="204" +data-flex-basis="491px" +></p> +<p>Haxe 是一种跨平台的开源编程语言,在其官方网站上称其为&quot;universal language&quot;。</p> +<p>它可以用于开发多种平台(如Web、移动、桌面等)的应用程序。</p> +<p>Haxe 提供了强大的静态类型系统,并支持多种编译目标,包括但不限于 JavaScript、C++、Java、C#、Python 等。</p> +<p>感兴趣的话,这里也有<a class="link" href="https://daobook.github.io/haxe-book/docs/start/00_intro.html" target="_blank" rel="noopener" +>一份 Haxe 的在线教程</a></p> +</li> +<li> +<p><a class="link" href="https://github.com/lllyasviel/Fooocus" target="_blank" rel="noopener" +>Fooocus</a>,ControlNet 作者开源的一款新的 AI 画图工具 ,搭建起来比 Stable Diffusion webui 稍微方便了一点,相当于整合包。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-25-40.png" +width="690" +height="644" +loading="lazy" +class="gallery-image" +data-flex-grow="107" +data-flex-basis="257px" +></p> +</li> +<li> +<p>原来 HTML5 有一个 <code>&lt;progress&gt;&lt;/progress&gt;</code> 标签,直接写这个标签,不加任何属性的话,就是一个加载动画,非常适合在页面里临时需要一个进度、状态展示的时候。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-25-55.png" +width="462" +height="387" +loading="lazy" +class="gallery-image" +data-flex-grow="119" +data-flex-basis="286px" +></p> +</li> +<li> +<p><a class="link" href="https://wangdoc.com/typescript/" target="_blank" rel="noopener" +>阮一峰老师的 Typescript 教程</a>,发布了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-26-13.png" +width="501" +height="800" +loading="lazy" +class="gallery-image" +data-flex-grow="62" +data-flex-basis="150px" +></p> +</li> +</ul> +<p>据老师自己说,刚开始也是抗拒的,觉得TypeScript 就是为 JS 语言添加静态类型系统。如果真需要静态类型,可以考虑使用其他更成熟的语言(比如 Rust 和 Java),再编译成 JS(wasm 模块),何必新学一门语言呢。</p> +<p>但是后来发现 TypeScript 越来越流行,成为前端开发的主流工具,各种项目纷纷移植过去。</p> +<p>我虽然对 TypeScript 仍然持保留态度,但是阮老师写的技术书籍读起来都很轻松易懂,所以觉得还是有必要收藏一下​​​。</p> +<ul> +<li> +<p><a class="link" href="https://islamov.ai/stable-diffusion-webgpu/" target="_blank" rel="noopener" +>stable-diffusion-webgpu</a>,在网页里运行 AI 画图模型。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-26-55.png" +width="1154" +height="667" +loading="lazy" +class="gallery-image" +data-flex-grow="173" +data-flex-basis="415px" +></p> +<p>基于 webgpu 技术,无需部署,直接在网页里运行。我试了一下,在我的 1080 8G 显存的显卡上 ,可以跑动,但是速度一般。</p> +<p>上面的图是我只跑了 8 个 steps 的结果。。。 ​​​</p> +</li> +</ul> +<h2 id="观点">观点</h2> +<h3 id="ai-画图的品质">AI 画图的品质</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-27-30.png" +width="690" +height="690" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +></p> +<p>为了验证之前关于“模特很可能被AI取代”的想法,自己动手部署 <a class="link" href="https://github.com/AUTOMATIC1111/stable-diffusion-webui" target="_blank" rel="noopener" +>Stable Diffusion webui </a> 测试了一些模型。根据网友分享的提示词尝试生成了一些图片。</p> +<p>感觉效果比我几个月之前体验时又有了不少提升,配合各种微调模型和 LoRA 模型可以生成照片质感和光影的图片。</p> +<p>虽然人物表情和姿态还有些僵硬,不过我相信这是我没有合理调整各个参数以及充分发挥插件性能导致。</p> +<p>多进行尝试和练习,应该能够生成更逼真、自然的照片。</p> +<h3 id="信息的维度">信息的维度</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-045-%E6%9C%9F/2023-08-15-13-28-20.png" +width="690" +height="690" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +> +最近看了一些线性代数相关的知识,在向量、矩阵的各种计算中逐渐有了一些感悟:</p> +<p>古代“老子”思想中的“道”很可能是无限维的,你的任何表达都是对它的一种投影,也就是降维了。所以才是“道可道,非常道”。</p> +<p>每个人都想用最简单的框架去理解世界,将多维的信息硬生生地将为一维。</p> +<p>这样的后果便是,盲人摸象、管中窥豹、一叶障目,不同的观点争得不可开交。</p> +<p>所以在接收时也应该尽量按自己掌握的其它维度进行升维还原,任何信息都不可孤立看待。</p> +<p>如果能从多维信息得视角去认知世界,也许会有转机,这多少就有点儿“阴阳互生、一分为三”的意思了。</p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 044 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/Tue, 08 Aug 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/<h1 id="机器文摘-第-044-期">机器文摘 第 044 期</h1> +<h2 id="长文">长文</h2> +<h3 id="导致-python-多线程鸡肋的-gil-是什么">导致 Python 多线程鸡肋的 GIL 是什么</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-51-26.png" +width="690" +height="839" +loading="lazy" +class="gallery-image" +data-flex-grow="82" +data-flex-basis="197px" +> +近期在使用 Python 多线程的时候,遇到了 GIL 全局锁导致的性能问题。</p> +<p>具体来说就是性能提升没有达到预期,对于有些计算任务无法并行执行。</p> +<p>从多核 CPU 占用结果上来看,像极了网上那张经典的围观图,一核干活多核围观。</p> +<p>于是翻阅了相关资料研究一下,发现这是 Python 社区争论多年的问题,而且有很大的历史包袱。</p> +<p>严格来说,GIL 全局锁导致的性能问题与 Python 编程语言没有关系,导致这个问题的原因在于具体实现的 CPython 解释器。</p> +<p>当年解释器开发者为了简单实现对多线程的支持,搞了一个全局锁,以至于在多核时代无法充分发挥 CPU 性能。</p> +<p>而后续又有很多库延续了这项依赖,历史的包袱(屎山?)越来越重,很难下定决心将之移除(据说代价甚至比当年从 Python2.x 迁移到 Python3 还要大)。</p> +<p>如果不想深究具体技术细节只想了解基本的来龙去脉,这里有篇文章<a class="link" href="https://xie.infoq.cn/article/1e151c24367abe8cad18130f4" target="_blank" rel="noopener" +>为什么 GIL 让多线程变得如此鸡肋?</a>介绍了 Python PIL 的产生背景以及适用于 Python 多线程的业务场景,可以给你的技术决策提供参考。</p> +<p>不过好消息是,就在刚刚(前几天),Python 官方终于宣布要动手取消掉 GIL 了,顿时网上一片沸腾(其实只有一部分人,大多数人都还不知道 PIL 是什么玩意儿)。而且,<a class="link" href="https://news.ycombinator.com/item?id=36643670" target="_blank" rel="noopener" +>Meta 也承诺,愿意出工出力(3人年)帮助 Python 社区做针对去除 GIL 的相关开发工作</a>。</p> +<h3 id="用树莓派做一个属于自己的高级收音机">用树莓派做一个属于自己的高级收音机</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-52-14.png" +width="606" +height="454" +loading="lazy" +class="gallery-image" +data-flex-grow="133" +data-flex-basis="320px" +> +最近接触到 SDR (软件定义无线电)这个领域,感觉挺有意思的。</p> +<p>软件定义无线电是一种无线通信技术,它利用软件来实现无线电通信系统中的信号处理和调制解调功能,而不是传统的硬件电路。</p> +<p>通过软件定义无线电技术,可以实现灵活、可配置和可重用的无线通信系统,大大提高了无线通信的灵活性和性能。</p> +<p>传统的无线电通信系统通常使用硬件电路来执行信号处理、调制解调和频谱管理等功能。这些硬件电路通常是固定的,不能轻易更改,因此限制了通信系统的灵活性和可配置性。</p> +<p>而SDR技术通过将信号处理和调制解调等功能以软件方式实现,可以在通信系统中使用可编程的处理器和通用硬件,从而使得通信系统的功能可以在软件层面上重新配置和调整,而不需要更改硬件设计。</p> +<p>比起灵活性和可配置性来说,我觉得 SDR 最大的优势是成本大大降低。之前必须购买昂贵的硬件才能实现的效果,现在能够通过便宜的、少量的硬件加上软件模拟即可。</p> +<p>我近期就以很低廉的价格购买了一套 SDR 设备,通过 USB 接口连接计算机,可以实现 500KHz到1700MHz频率范围的接收。听 FM 和航空频段不在话下,SW 短波的话受天线影响,我暂时没有调试出好的效果。</p> +<p>跟 SDR 相比,我几千块买的旗舰手台显得既昂贵又功能弱。</p> +<p><a class="link" href="https://www.hackster.io/mircemk/diy-sdr-dsp-radio-with-raspberry-pi-and-rtlsdr-dongle-c38064" target="_blank" rel="noopener" +>这里有篇文章</a>是作者自己动手用 SDR 设备结合树莓派制作了一个看起来还挺专业的宽频无线接收机。</p> +<p>其实这跟音乐制作领域内很多乐器、效果器逐渐被虚拟化的软件、插件代替是一样的。软件虚拟化拥有巨大的优势,随着通用计算硬件的成本越来越低廉,一切能被软件定义的最终都会被软件定义。</p> +<h3 id="家用-wifi-路由器需要选择哪个信道">家用 WiFi 路由器需要选择哪个“信道”</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-52-42.png" +width="601" +height="373" +loading="lazy" +class="gallery-image" +data-flex-grow="161" +data-flex-basis="386px" +> +近期验证了一个关于无线路由器的传说。</p> +<p>起因是我新买了一个树莓派 ZeroW 带无线版本,没想到板载的 WiFi 网卡天线太弱了。</p> +<p>离路由器稍微远一点,比如放到卧室,传输速率就会大幅下降,我又暂时没能找到合适的外接网卡,一度陷入绝望。</p> +<p>后来灵机一动,看看能不能从路由器那头想想办法,于是打开路由器配置页面,找到了 WiFi 的“信道”设置,将之从“自动”调到了最不常用的“13”。</p> +<p>这里补充一下,WiFi信道一般从1到13,由路由器自动选择,但现在无线环境十分混乱,尤其是 2.4G(树莓派 Zero W 只能连这个规格) 频段,干扰很严重。</p> +<p>但是 13 这个信道很少被路由器自动选用,原因是最初制定标准的时候,不是所有国家和地区都支持,也不是所有终端设备都支持,所以这个信道就成了最不常用的。</p> +<p>在我手动指定信道之后,惊喜地发现,树莓派放在同样的位置,传输速率得到了较大提升并且稳定。看来传说将路由器 2.4G 信道设为 13 可以防干扰是真实的。</p> +<p><a class="link" href="https://zhuanlan.zhihu.com/p/344389009" target="_blank" rel="noopener" +>什么是路由器的信道?信道设置成什么最合理?</a></p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://roadmap.sh" target="_blank" rel="noopener" +>开发人员路线图</a> 是一个学习索引网站,旨在创建路线图、指南和其他教育内容,以帮助开发人员选择学习路径。在 Github 所有仓库中 Stars 排名第七。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-53-03.png" +width="690" +height="490" +loading="lazy" +class="gallery-image" +data-flex-grow="140" +data-flex-basis="337px" +></li> +<li><a class="link" href="https://felixkreuk.github.io/audiogen/" target="_blank" rel="noopener" +>AudioGen</a> facebook 开源的声音合成模型,可以根据文字描述生成对应的声音。效果已经很惊人了,这个页面展示了很多样例。我听了一下,觉得以后影视作品里的一部分声音特效应该可以通过 AI 进行生成了。至少像一些嘈杂的人群、婴儿哭声、鸟叫等各种背景音是可以合成的。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-53-14.png" +width="499" +height="270" +loading="lazy" +class="gallery-image" +data-flex-grow="184" +data-flex-basis="443px" +></li> +<li>原来 Chrome 和 Edge 浏览器的 DevTools 里自带了 CSS 动画曲线编辑器啊!可以直接通过鼠标拖动进行调整和预览,十分便捷。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-53-29.png" +width="562" +height="528" +loading="lazy" +class="gallery-image" +data-flex-grow="106" +data-flex-basis="255px" +></li> +<li><a class="link" href="https://github.com/GraphiteEditor/Graphite" target="_blank" rel="noopener" +>Graphite</a>,一个开源的 2D 矢量图形编辑器,适用于照片编辑、图像处理、图形设计、插图、数据可视化、数字绘画等领域。可以实现项目图稿,数据可视化和自动化。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-54-19.png" +width="830" +height="465" +loading="lazy" +class="gallery-image" +data-flex-grow="178" +data-flex-basis="428px" +></li> +</ul> +<h2 id="观点">观点</h2> +<h3 id="获取高品质信息的需求仍然强烈只是被淹没了">获取高品质信息的需求仍然强烈,只是被淹没了</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-54-40.png" +width="367" +height="372" +loading="lazy" +class="gallery-image" +data-flex-grow="98" +data-flex-basis="236px" +> +三十几年前,电视逐渐取代书籍、报纸等传统媒体的年代,尼尔波兹曼写下了《娱乐至死》。</p> +<p>作者认为:过度追求娱乐和娱乐化的信息传播方式可能导致公众思考能力的下降。</p> +<p>然而这么多年过去了,人们在降低信息质量这条路上越走越远。电视也早已沦为老年人卧床的伴侣,电视节目更是无法占据现代人的时间,取而代之的是手机短视频。</p> +<p>短视频已经成为大部分人闲暇消遣、信息获取的主要方式。这种媒体的变化将进一步降低理解和感受深度信息的能力,使人对深入学习和思考失去兴趣。</p> +<p>虽然获取的信息看似在增多,但现在高质量的信息却越来越少。</p> +<p>短视频等碎片化信息给我的感觉就像是无线电信号的背景噪音,现在的信息“电磁环境”早已被这种噪音充斥。因为“背景噪音”太大,就好像在高楼林立的城市里打开无线电,接收到的全是 LED 路灯和电动车充电器产生的噪波。</p> +<p>不过我还是相信会有包括我在内的相当一部分人,不愿放弃主动思考,不屑于接收低品质信息。</p> +<p>我正在努力做出一些尝试,以后逐渐记录下来:</p> +<ol> +<li>降低输入:减少刷碎片信息的时间;</li> +<li>滤波:使用搜索引擎、RSS服务、newsletter邮件等工具进行整理;</li> +<li>溯源:尽量选择信息源头获取一手信息,对于技术来说,直接阅读英文文档是一个办法;</li> +<li>创造:自己制作高质量内容;</li> +</ol> +<h3 id="摄影师不会被-ai-取代但是模特很可能会">摄影师不会被 AI 取代,但是模特很可能会</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-044-%E6%9C%9F/2023-08-08-09-56-00.png" +width="664" +height="427" +loading="lazy" +class="gallery-image" +data-flex-grow="155" +data-flex-basis="373px" +> +即便以后 AI 绘画能够产出更加难以分辨真假的作品。</p> +<p>从目前能看到的各种生成作品来说,还是摄影师负责了主要的创作灵感。</p> +<p>真要说被取代的话,也许“被拍摄对象”经过虚拟化以后,很可能被取代。</p> +<p>以后不仅仅是举着相机的叫摄影师,说不定会诞生面向 AI 摄影这一职业。</p> +<p>到时候器材党玩的不再是镜头,改玩显卡了?</p> +<p>“嘿,你这 N 卡 比我这 A 卡有德味儿,毒!”</p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 043 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/Tue, 01 Aug 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/<h1 id="机器文摘-第-043-期">机器文摘 第 043 期</h1> +<h2 id="长文">长文</h2> +<h3 id="先做框架再做功能">先做框架再做功能</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-13-57-56.png" +width="690" +height="395" +loading="lazy" +class="gallery-image" +data-flex-grow="174" +data-flex-basis="419px" +> +<a class="link" href="https://devblogs.microsoft.com/oldnewthing/20230725-00/?p=108482" target="_blank" rel="noopener" +>Before you try to do something, make sure you can do nothing.</a></p> +<p>看到这句话第一反应是:这是什么 XX 逻辑?看完作者的文字之后,哦,这是一种软件构建的方法。</p> +<p>意思是说,先宏观再微观,先整体再局部,别一上来就陷入到细节代码的编写中去。</p> +<p>先把框架搭好,具体功能一个也别着急实现,留着占位,先搭一个“什么都不干”的架子,然后再逐渐补充功能。</p> +<p>但也不是真的什么都不干,而是理清了各个关键组件的调用关系以及与开发相关的辅助功能(如打印调试信息)。</p> +<p>这样做最大的好处是,随着功能开发的深入,代码不至于失控,而且具有良好的可调试性和组件问题隔离能力。</p> +<p>随之而来的就是轻松写代码,而不是眉毛胡子一把抓。</p> +<h3 id="神经网络从开始到现在">神经网络从开始到现在</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-13-58-59.png" +width="690" +height="513" +loading="lazy" +class="gallery-image" +data-flex-grow="134" +data-flex-basis="322px" +> +<a class="link" href="https://s3tlxskbq3.feishu.cn/docx/NyPqdCKraoXz9gxNVCfcIFdnnAc" target="_blank" rel="noopener" +>The Document is All You Need!</a></p> +<p>一篇 AI 科普好文章,用较为通俗的语言讲解了神经网络模型原理和发展历程(我感觉有些像生物的进化)。</p> +<p>从最初的由神经元组成的多层感知机开始,然后进化到卷积神经网络 CNN 降低网络复杂度,再进化, RNN 循环神经网络给模型增加记忆能力,记忆能力太强也不行,到了 LSTM 开始让它能够遗忘,再到后面的 注意力机制以及 LLM 语言模型。</p> +<p>比起同类文章,这一篇尽量避免了数学概念的推导和论证,尽量在不看公式的情况下解释基本思路,适合我等小白学习。</p> +<h3 id="代码审查的一些建议">代码审查的一些建议</h3> +<p><a class="link" href="https://codelantis.com/blog/code-reviews-best-practices" target="_blank" rel="noopener" +>5个关于代码审查的最佳实践</a>,文章记录一些了对代码审查的实践建议,嫌长不看我总结如下:</p> +<ol> +<li>一次只审查一个功能特性或者错误修复。</li> +<li>提前准备好背景交代(在审查之前写清楚这么做的原因和基本思路)。</li> +<li>利用自动化工具提前做好静态检查,提前统一风格、规范。</li> +<li>利用提问的方式提出改进建议而不是直接喷,如:“我们真的需要这个断言吗?”</li> +<li>仔细阅读代码,慢慢来,以充分理解。</li> +</ol> +<h2 id="资源">资源</h2> +<ul> +<li> +<p>微软的 <a class="link" href="https://learn.microsoft.com/en-us/sysinternals/downloads/zoomit" target="_blank" rel="noopener" +>ZoomIT</a> 真是个经典工具,已经默默维护了好多年了,现在版本为7.0。体积小巧才1MB多点儿,绿色免安装,下载解压即用。非常适合进行共享屏幕培训讲解,或者录制教学视频。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-13-59-57.png" +width="669" +height="465" +loading="lazy" +class="gallery-image" +data-flex-grow="143" +data-flex-basis="345px" +> +ZoomIT 快捷键如下: +Ctrl+1:放大屏幕,屏幕静止,然后使用鼠标批注; +Ctrl+2:使用鼠标随意绘制批注,支持 r、g、b、o 等快捷键切换颜色; +Ctrl+3:显示 BreakTime 倒计时; +Ctrl+4:放大屏幕,屏幕继续支持鼠标交互操作,用于放大操作过程; +Ctrl+5:录制屏幕,可与前面几个功能结合使用;</p> +</li> +<li> +<p><a class="link" href="https://github.com/kamranahmedse/driver.js" target="_blank" rel="noopener" +>driver.js</a> 一个压缩后只有 5K 大小的前端库,可以让你的网站或者 Webapp 迅速集成交互式“使用指南”的能力。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-14-00-27.png" +width="690" +height="361" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="458px" +></p> +</li> +<li> +<p><a class="link" href="https://clangjs.netlify.app" target="_blank" rel="noopener" +>clangjs</a> 一个在浏览器编译、链接、运行 C/C++ 代码的 JS 库。支持 C/C++ 标准库。完全在本地编译,无需网络即可工作。原理: +首先把 Clang 和 LLD 编译为 WebAssembly 使其运行在浏览器中。然后使用 WebAssembly 版本 Clang 把 C/C++ 代码编译为 WebAssembly,最后通过浏览器 API 运行 WebAssembly。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-14-00-43.png" +width="690" +height="292" +loading="lazy" +class="gallery-image" +data-flex-grow="236" +data-flex-basis="567px" +> +<a class="link" href="https://github.com/luoxuhai/clang.js" target="_blank" rel="noopener" +>附:clangjs源码</a></p> +</li> +<li> +<p><a class="link" href="https://github.com/bartobri/no-more-secrets" target="_blank" rel="noopener" +>nms</a>,一个控制台程序,可以将任意命令的输出(ANSI TXT)文本转换成为乱码以达到防偷窥和加密的效果。通过命令管道使用:<code>ls -l | nms</code> ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-14-00-57.png" +width="690" +height="236" +loading="lazy" +class="gallery-image" +data-flex-grow="292" +data-flex-basis="701px" +></p> +</li> +<li> +<p><a class="link" href="https://iconbuddy.app" target="_blank" rel="noopener" +>Icon Buddy</a>,这个网站有超过 1 百万个免费 svg 图标,可在线自定义颜色。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-14-01-15.png" +width="690" +height="420" +loading="lazy" +class="gallery-image" +data-flex-grow="164" +data-flex-basis="394px" +></p> +</li> +</ul> +<h2 id="观点">观点</h2> +<ul> +<li>无法眼神交流不是导致远程办公沟通的最大障碍,语音延迟才是: +<ul> +<li>我之前一直以为远程办公给沟通带来最大的最大障碍是无法眼神交流导致的信息失真,想象着可以通过升级摄像头(比如嵌入在屏幕中)来改善这一情况。</li> +<li>但进行无数次网络会议之后,我体会到了最大的障碍还不是无法眼神交流,而是网络通信带来的(几乎是必然的)严重的语音延迟。</li> +<li>人们对声音延迟的感知和容忍限度大约在10毫秒(现在的电脑声卡在使用 ASIO 驱动之后可以轻松做到本地延迟 8到6毫秒左右,所以可以用于实时录音),大于10毫秒的延迟会带来明显的迟钝感,时间再长一些就会对对话的节奏带来严重影响。(如果体会不到的话,可以回忆一下新闻直播间主持人跟现场记者连线时那种说话总是对不上节奏的尴尬。)</li> +<li>什么时候网络视频会议的延时能缩短到10毫秒以内(唱卡拉OK可以接受的最低延迟),远程办公才能迎来质的飞跃,否则网络视频会议对于工作讨论永远都是隔靴搔痒、效率低下。现在的解决方案普遍还在吹能做到一秒(1000毫秒)以内,任重而道远。 ​​​</li> +</ul> +</li> +<li>现在真正的程序员用什么编辑器 ? +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-043-%E6%9C%9F/2023-08-01-14-01-47.png" +width="690" +height="645" +loading="lazy" +class="gallery-image" +data-flex-grow="106" +data-flex-basis="256px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 042 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/Tue, 25 Jul 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/<h1 id="机器文摘-第-042-期">机器文摘 第 042 期</h1> +<h2 id="长文">长文</h2> +<h3 id="从-cpu-到操作系统">从 CPU 到操作系统</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-57-14.png" +width="665" +height="261" +loading="lazy" +class="gallery-image" +data-flex-grow="254" +data-flex-basis="611px" +> +整天使用电脑和手机却对它的工作原理一知半解?<a class="link" href="https://cpu.land" target="_blank" rel="noopener" +>把你搁 CPU 里</a>是一套不错的科普文章,作者保证你无论是否了解 CPU 的运作方式,读完之后都会有所收获。我原本以为主要讲解 CPU 组成原理,在浏览了一遍之后,发现 CPU 只是引子,后面还讲了很多操作系统相关的知识,很值得一看。 ​​​</p> +<h3 id="基于-gpu-渲染的-ui-界面制作">基于 GPU 渲染的 UI 界面制作</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-57-33.png" +width="690" +height="412" +loading="lazy" +class="gallery-image" +data-flex-grow="167" +data-flex-basis="401px" +> +<a class="link" href="https://hasen.substack.com/p/gpu-gui-table-of-contents" target="_blank" rel="noopener" +>基于 GPU 渲染的 UI 界面制作</a>,也是一个系列文章,探讨了使用 GPU 渲染用户界面的一些思路和相关技术实现方法。用 GPU 绘制用户界面不是什么新鲜事,事实上现在大部分游戏的 UI 都是基于 GPU 渲染的,不过这个作者讲的比较深入浅出,对基础介绍的比较多,适合我这种业外人士,读起来通俗易懂。</p> +<h3 id="为什么我们更应该使用-display-port-而不是-hdmi-">为什么我们更应该使用 Display port 而不是 HDMI ?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-58-12.png" +width="790" +height="479" +loading="lazy" +class="gallery-image" +data-flex-grow="164" +data-flex-basis="395px" +> +<a class="link" href="https://hackaday.com/2023/07/11/displayport-a-better-video-interface/" target="_blank" rel="noopener" +>为什么我们更应该使用 Display port 而不是 HDMI?</a>,简单来说,HDMI 是家电行业制定的接口标准,封闭而保守,Display port 是 PC 行业制定的标准,开放又激进。现在的显卡上一般提供一个 HDMI 接口,仅仅是为了兼容而做出的妥协,不提供多个是因为 HDMI 授权收费。</p> +<h3 id="txt-纯文本才是王道">txt 纯文本才是王道</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-58-45.png" +width="690" +height="220" +loading="lazy" +class="gallery-image" +data-flex-grow="313" +data-flex-basis="752px" +> +喜欢老式合成器的操作方式,不用图形和触摸屏,而是用文本和字符进行交互,可以快速选择音色参数,指哪儿打哪儿,心中有数。</p> +<p>喜欢在控制台的黑窗口通过命令行跟计算机交互,而不是用鼠标在图形界面上点击,不用将鼻子凑在屏幕上,闭上眼睛也能做到精确操作。</p> +<p>喜欢单反相机的肩屏,无论我用什么姿势拨动拨杆、拨轮,肩屏总能用字符给我最快速最准确的响应,告诉我现在的曝光三参数是多少,做到心中有数。</p> +<p>喜欢用 Markdown 文本格式记录信息,只因为文本格式最干净纯粹,利于保存和传播。</p> +<p>这篇<a class="link" href="https://graydon2.dreamwidth.org/193447.html" target="_blank" rel="noopener" +>《txt纯文本才是王道》</a>的作者表达了跟我同样的喜好,对于使用纯文本保存信息偏爱有加,认为无论是视频、图片还是其他数字形式,在文字面前都是弱小的弟弟。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/FlagAlpha/Llama2-Chinese" target="_blank" rel="noopener" +>Llama2-Chinese</a>,Llama2中文社区!是一个专注于Llama2模型在中文方面的优化和上层建设的高级技术社区。 <em>基于大规模中文数据,从预训练开始对Llama2模型进行中文能力的持续迭代升级</em>。Facebook近期开源的 Llama 2 模型比较火,号称可以免费商用。我试了一下,效果不如预期,跟 ChatGPT 3.5 比起来还有距离。可能我使用的中文微调 Lora 参数还不够好吧。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-59-02.png" +width="690" +height="182" +loading="lazy" +class="gallery-image" +data-flex-grow="379" +data-flex-basis="909px" +></li> +<li><a class="link" href="https://githubunwrapped.com" target="_blank" rel="noopener" +>githubunwrapped</a>是一个帮你统计 Github 信息的网站,可以将输入的 Github 账号相关的统计信息生成一段漂亮的动画,展示你使用最多的编程语言、哪天提交的最积极、哪个时段工作效率高(根据文件修改时间?)等。比较有趣的是,这个网站生成动画视频的技术来自一个叫做 <a class="link" href="https://remotion.dev" target="_blank" rel="noopener" +>remotion</a>的库,它可以使用 React 组件式风格编写动画效果,并通过 Canvas 实现视频文件的渲染。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-59-18.png" +width="690" +height="455" +loading="lazy" +class="gallery-image" +data-flex-grow="151" +data-flex-basis="363px" +></li> +<li><a class="link" href="https://github.com/jesseduffield/lazydocker" target="_blank" rel="noopener" +>lazydocker</a>,继发现 lazygit 和 lazyvim 两个神器之后,我又发现了 lazy 家族新成员:lazydocker!同样是提供终端命令行下的“gui”界面,不过操作对象是 docker 这下管理容器终于可以不再看错乱的 docker 命令输出了。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-042-%E6%9C%9F/2023-07-25-13-59-28.png" +width="690" +height="397" +loading="lazy" +class="gallery-image" +data-flex-grow="173" +data-flex-basis="417px" +></li> +</ul> +<h2 id="观点">观点</h2> +<ul> +<li> +<p>关于产品需求的来源:</p> +<p>对于提供IT相关服务的从业人员来说,无论是在企业还是个人做独立产品,把握好产品的需求、做好产品定义是最关键的事情,是后续做研发、运营的基础。</p> +<p>而好的产品定义=自己想做+自己能做+用户想用+愿意付费。</p> +<p>这样的定义应该怎样去发现?</p> +<p>拿软件举例,大部分软件能给用户提供的最大价值是“将一些事情自动化”和“将一些物理实体虚拟化”。前者能够通过自动化实现工作效率的指数级提升,后者则通过对物理现实虚拟化实现用户对交互体验的指数级提升。</p> +<p>所以在分析产品需求进行产品定义时可以从身边三个方面入手:</p> +<ol> +<li>还有什么事情可以被计算机自动化?</li> +<li>还有哪些物理实体可以被虚拟化?</li> +<li>市场上的现有产品,还有哪些可以从上面两个维度提升以增强体验的?</li> +</ol> +<p>我发现,无论是企业的产品,还是个人的独立产品,都可以从这些维度进行分析。</p> +</li> +<li> +<p>基于互联网通道的“业余无线电”:</p> +<p>不是很理解热衷于用互联网通道进行业余无线电通联的心态。</p> +<p>今天刚知道现在有一些业余无线电爱好者使用一种叫做 mmdvm 的盒子(热点盒子)进行自主搭建数字中继。</p> +<p>原理是“热点盒子”用家里的wifi接入互联网,然后热点盒子给业余无线电台提供UV频段的发射接收中继,这样就能轻易通联全国甚至全球的爱好者。</p> +<p>目前很多拥有支持数字通信的电台的爱好者都很积极地参与这种通联,甚至每周还有打卡点名活动。</p> +<p>我暂时还不是很理解这种心态。这种依赖互联网进行的通联在我看来(也许是暂时的)早已失去了玩无线电的初衷。如果我想要通过互联网假装进行呼叫,还得依靠家里的无线路由器,那我为什么不干脆使用微信电话?</p> +</li> +<li> +<p>无头系统: +今天才知道原来我给自己配的远程开发环境有个专业术语叫做 <a class="link" href="https://zh.wikipedia.org/zh-cn/%e6%97%a0%e5%a4%b4%e8%ae%a1%e7%ae%97%e6%9c%ba" target="_blank" rel="noopener" +>“Headless 无头系统”</a> 啊。我现在基本上可以做到带着笔记本随意移动,开发环境都在远程,在各处体验环境都一样。主要使用: Win10 + WSL2 + Nvidia-Docker + VS Code + Neovim。有时会启用远程桌面 RDP,有时直接 ssh + tmux。有兴趣的话我挑一期详解。</p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 041 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/Wed, 19 Jul 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/<h1 id="机器文摘-第-041-期">机器文摘 第 041 期</h1> +<h2 id="长文">长文</h2> +<h3 id="c-也能一次编译到处运行了">C 也能一次编译到处运行了?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-28-30.png" +width="743" +height="446" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="399px" +> +用 C 编写的程序,只编译一次,生成的可执行文件能同时在多个平台运行吗?</p> +<p>这在以往是 java 这类依赖虚拟机执行环境的语言宣称的事情。</p> +<p>然而我今天才听说还有这个神奇的库(好久没关注过c++领域的技术了):<a class="link" href="https://github.com/jart/cosmopolitan" target="_blank" rel="noopener" +>Cosmopolitan</a>Libc 号称可以使 C 成为一种构建一次就能到处运行的语言,就像Java一样,除了它不需要解释器或虚拟机。相反,它重新配置了GCC和Clang,以输出POSIX批准的多语言格式,该格式在Linux + Mac + Windows + FreeBSD + OpenBSD + NetBSD + BIOS上本地运行,具有最佳的性能和最小的占用空间。</p> +<p>在使用的时候需要引入特殊的库和编译配置,具体执行效果我还没有测试。</p> +<p>然后,<a class="link" href="https://ahgamut.github.io/2023/07/13/patching-gcc-cosmo/" target="_blank" rel="noopener" +>这篇文章</a>的作者干脆来个更方便的操作,他给 GCC 打了大约 2000 行的补丁,使得 GCC 直接就嵌入了 Cosmopolitan 库,现在可以在不修改任何源代码(前提是得用纯 C 写)的情况下构建出到处都能运行可执行文件了(Windows也可以吗?我要测试)。</p> +<h3 id="业余无线电入坑指南">业余无线电入坑指南</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-29-07.png" +width="690" +height="920" +loading="lazy" +class="gallery-image" +data-flex-grow="75" +data-flex-basis="180px" +> +业余无线电跟摄影、HiFi音响这一类的爱好在某种维度上非常相似,在“入坑”的境界上,甚至完全一样。</p> +<p>这里的坑,指需要投入大量精力和资金。</p> +<p>之所以这么说,是因为它们都有一个共同的特点。</p> +<p>即围绕这些爱好有大量的知识可以学习和探索。</p> +<p>比如拿业余无线电来说,上来就一堆“亚音”、“中继”、“频段”、“频差”、“杂散发射”等名词,对标摄影中的“构图”、“光圈”、“快门”、“ISO感光度”等名词。新手若想有所体会,单是这些概念就够琢磨几天的。更不用提后续还有逐渐步入玄学的一些操作流派,乃至一个不留神还会陷入无穷尽的装备升级竞赛。</p> +<p>这类知识对于好奇心强烈、喜欢求知的人来说有着巨大的吸引力。甚至直白的说,我们很可能不是爱好这项技能,而是单纯喜欢探索和求知的过程,喜欢那种获得感。</p> +<p>这篇<a class="link" href="https://zhuanlan.zhihu.com/p/585518350" target="_blank" rel="noopener" +>《业余无线电新手指南》</a>可以普及一些基本知识,愿意入坑的请阅读。</p> +<p><em>我近期已考取了中国无线电协会的业余无线电操作能力 A 证</em> 算是合法的 <a class="link" href="https://baike.baidu.com/item/%E6%97%A0%E7%BA%BF%E7%94%B5%E7%88%B1%E5%A5%BD%E8%80%85/6509242" target="_blank" rel="noopener" +>HAM 火腿</a>了。</p> +<h3 id="远程办公还能成为趋势吗">远程办公还能成为趋势吗?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-29-47.png" +width="799" +height="414" +loading="lazy" +class="gallery-image" +data-flex-grow="192" +data-flex-basis="463px" +> +疫情的时候,远程办公、异地协同等概念一度变得很火爆,当时很多人觉得这又是一个风口。</p> +<p>但随着当时极端环境的消失,各大公司又纷纷将员工从居家办公中召回。</p> +<p>那么?此类与远程协作相关的概念破灭了吗?</p> +<p>各种协同工具、平台相关的市场,还有没有继续扩大的可能,或者说还在等待一个巨大的技术革新来引爆?</p> +<p>这里有个项目,<a class="link" href="https://github.com/LinuxSuRen/remote-jobs-in-china" target="_blank" rel="noopener" +>积极收集远程办公相关的信息</a>,包括国内支持的公司清单、工具及使用资料等。</p> +<h3 id="怎样做出伟大的成就">怎样做出伟大的成就?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-30-40.png" +width="636" +height="422" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="361px" +> +昨日读了保罗格雷厄姆(《黑客与画家》的作者)新文章一篇&mdash;-<a class="link" href="http://paulgraham.com/greatwork.html" target="_blank" rel="noopener" +>《怎样做出伟大的成就》</a>(实际上我觉得可以译为“怎样牛逼”)。</p> +<p>虽然标题看起来略有鸡汤味儿,但读起来还是比较实惠的。</p> +<p>文章从发现和选择要做的事情开始,谈论了一些具体的方法。然后展开讨论了在方法执行过程中可能会遇到的一些问题,以及如何克服。甚至介绍了一些心理暗示技巧。</p> +<p>文章比较长,我个人体会比较深的点如下:</p> +<ol> +<li>一个人做什么才能牛逼?答:做自己天赋里有的东西,就是找一些你既有能力又非常感兴趣的事情。</li> +<li>要养成“自驱”的习惯。让“工作”来源于自己的认知,而不是别人告诉你、让你做的事情。主动,而不是等待。</li> +<li>拥有一个属于自己的“项目”是一个找到“自驱”的最佳方法。不断观察自己对什么有强烈的好奇心(甚至好奇到大多数人不能理解)可以找到这样的“项目”。</li> +<li>选定要做的“项目”还应遵循兴奋原则,即:做自己愿意用的产品,写自己想读的故事,而不是执着于满足想象中的不存在的复杂需求。</li> +<li>注重积累效应,日拱一卒、长期积累,每天写一篇文字,一年下来就是一本书。</li> +<li>周期性审视自己做的事情,确认它是否偏离了目标(在做自己最想做的事情),及时修正。</li> +<li>行动的重要性,很多人实际上可以更牛逼,但是因为“谦虚”和“恐惧”导致的拖延使得计划一再搁浅,浪费了时间。</li> +</ol> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="http://t.cn/A60wPLwI" target="_blank" rel="noopener" +>jabbr.ai</a>是一个针对拳击比赛的打击判定进行训练的AI模型,可以在智能手机上运行,实时监测视频中拳击选手的打击得分情况,即时进行统计,多个智能手机多视角同时运行可以快速生成总结性视频。模型提供约50种监测参数(质量、步法、压力等)可用于运动员训练分析。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-31-11.png" +width="908" +height="509" +loading="lazy" +class="gallery-image" +data-flex-grow="178" +data-flex-basis="428px" +></li> +<li>浏览器地址栏快捷操作,我今天才知道原来浏览器地址栏还有这些快捷操作(火狐浏览器支持的最多,我测试的Edge浏览器也支持部分操作): +<ol> +<li>输入*星号,可以搜索你的收藏夹;</li> +<li>输入^,可以搜索历史浏览记录;</li> +<li>输入%,可以搜索当前打开的tab页;</li> +<li>输入?,可以显示所有搜索建议; ​​​</li> +</ol> +</li> +<li><a class="link" href="https://video.weibo.com/show?fid=1034:4923133602234429" target="_blank" rel="noopener" +>树莓磁带</a> 一种用树莓派做的小硬件,为了支持在老式电脑中加载程序(之前用磁带存储的那种)。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-31-40.png" +width="607" +height="378" +loading="lazy" +class="gallery-image" +data-flex-grow="160" +data-flex-basis="385px" +></li> +<li>两招教你“永久”关闭 Windows 自动更新(任选一个都可以): +<ol> +<li>通过执行代码的方式:<code>reg add “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings” /v FlightSettingsMaxPauseDays /t reg_dword /d 10000 /f</code> Win+R 打开「运行」对话框,输入 <code>cmd</code> 后按下 <code>Ctrl+Shift+Enter</code>,在弹出来的命令行窗口中输入上面的代码,并敲击回车。命令里的 10000 代表停止更新的天数。</li> +<li>手动把电脑时钟日期改成 2050 年(为了防止时间自动校准,可以暂时断开网络),然后在 Windows 更新设置界面里面点击“延迟更新”,完成设置后再把电脑时间调回来就行了。</li> +</ol> +</li> +<li><a class="link" href="https://pkg-size.dev/" target="_blank" rel="noopener" +>pkg-size</a>,一个在线监测 npm 包大小的网站,可以实时查看一个 npm 包的真实依赖,网站利用了 web容器技术,直接在浏览器里执行 npm install 操作。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-32-07.png" +width="1011" +height="636" +loading="lazy" +class="gallery-image" +data-flex-grow="158" +data-flex-basis="381px" +></li> +<li><a class="link" href="https://marketplace.visualstudio.com/items?itemName=degreat.3e" target="_blank" rel="noopener" +>3e</a>,一个 VS Code 插件,可以让你在编辑器里直接浏览 3d 模型,基于 webgl 实现。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-041-%E6%9C%9F/2023-07-19-09-32-58.png" +width="704" +height="468" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="361px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 039 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/Tue, 11 Jul 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/<h1 id="机器文摘-第-039-期">机器文摘 第 039 期</h1> +<h2 id="长文">长文</h2> +<ul> +<li> +<p><a class="link" href="https://www.cs.columbia.edu/~hgs/etc/writing-bugs.html" target="_blank" rel="noopener" +>关于写作的通用问题</a>,“元技能”一般指比普通技能更高阶的技能,我理解为可产生技能的技能,此类技能并不会随着外部环境的高速发展而被淘汰。比如写作就算是一种元技能,当不知道该训练和提升什么技能的时候,将时间花在“元技能”的提升上准没有错。这篇文章主要讲解英文写作的常见问题,但是有些我觉得对于中文也适用。比如文章开头提到的两个基本原则:“在写之前就弄清楚自己想表达什么”、“即便是你已经写完了一整篇,如果没能表达你的意思那也是废纸”。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-13-52-23.png" +width="294" +height="171" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="412px" +></p> +</li> +<li> +<p><a class="link" href="https://jmmv.dev/2023/06/fast-machines-slow-machines.html" target="_blank" rel="noopener" +>新电脑快还是老电脑快?</a>,上周有博主在twitter发布了一个视频吐槽了一个我也困惑很久的事情。作者展示了他在一台古董电脑上运行Windows NT 3.5 的情况,视频中的电脑基本可以做到秒开程序,然后又展示了一台配备了Windows 11的Surface平板电脑,操作起来界面响应有明显延迟。后者cpu频率为前者的4倍,内存容量为前者的6倍。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-13-55-53.png" +width="507" +height="228" +loading="lazy" +class="gallery-image" +data-flex-grow="222" +data-flex-basis="533px" +></p> +</li> +</ul> +<p>现在的硬件性能动辄就比之前的老硬件几十甚至上百倍的提升,但是我们的交互体验呢?能够秒开的程序甚至还不如二十年前的老爷机。 +后来这事儿在twitter引发了一些争议,有人认为现在的软件确实吃掉了硬件提升的性能,对体验来说提升不足。也有人说现在的体验与以往不可同日而语,这样的对比不公平也没有意义。</p> +<p>博主不得不专门写了一篇文章来回应,详细记录了作者认为更加合理的对比过程。</p> +<p>我个人认为首要原因就是随着硬件性能的提升,软件开发者的精力已经逐渐从性能向开发效率倾斜了。由于现在硬件成本确实低廉,软件迭代周期变得越来越短,软件开发者也越来越没有动力做出极致挖掘硬件性能的软件。</p> +<p>不信你看,现在越来越多的应用程序不再使用原生开发,而是采用了可以“跨平台”的web技术。</p> +<p>这样使得软件界面的响应直接下降了一个数量级。(我在使用vscode的时候甚至还会遇到打字卡顿慢慢弹出字符的情况。)</p> +<p>另外,复杂的设计模式和软件架构,也吃掉了不少硬件性能,因为每增加一层抽象,都会消耗资源,而现在各种复杂的架构就是拼命地增加抽象层。</p> +<p>希望以后市场能够鼓励开发者多做挖掘硬件性能的事情吧。</p> +<ul> +<li><a class="link" href="https://faultlore.com/blah/text-hates-you/" target="_blank" rel="noopener" +>文字渲染比你想象的要复杂</a>,这篇文章的作者曾负责火狐浏览器的文字渲染引擎,他写这篇文字的目的是科普一下关于文字渲染的一些基本技术和困难。在阅读之前,我也简单的以为,文字渲染就是把对应的字符字形从字体库中取出来然后绘制到相应的位置即可,但实际情况确实比这要复杂得多。比如,文中提到的关于“连字符”的处理、“抗锯齿”、“书写方向”等问题,每一个都是开发者的头发杀手。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-12-47.png" +width="574" +height="307" +loading="lazy" +class="gallery-image" +data-flex-grow="186" +data-flex-basis="448px" +></li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/rrweb-io/rrweb" target="_blank" rel="noopener" +>rrweb</a>,可在网页上记录用户行为并导出视频文件。可用于:排查用户错误、保险业务签署、内部风控、用户交互分析等。rrweb采用虚拟化转换DOM、记录变更和操作过程,并通过链表回放数据。存储最小化、回放可快进且跳过无效行为。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-13-31.png" +width="529" +height="378" +loading="lazy" +class="gallery-image" +data-flex-grow="139" +data-flex-basis="335px" +></li> +<li><a class="link" href="https://github.com/zhaoyun0071/DragGAN-Windows-GUI" target="_blank" rel="noopener" +>DragGAN-Windows-GUI</a>,DragGAN(上周介绍过的开源模型,可以针对图片进行交互式拖动修改)的懒人包,解压直接用,内置17个模型。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-13-53.png" +width="690" +height="421" +loading="lazy" +class="gallery-image" +data-flex-grow="163" +data-flex-basis="393px" +></li> +<li><a class="link" href="https://neal.fun/deep-sea/" target="_blank" rel="noopener" +>deep-sea</a>,这个网页可以让你查看海洋各个深度都是有哪些生物,果然是越往下越看不清,所以大家就随便长长了,不讲究好看不好看了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-14-11.png" +width="690" +height="501" +loading="lazy" +class="gallery-image" +data-flex-grow="137" +data-flex-basis="330px" +></li> +<li><a class="link" href="http://elementsofprogramming.com/" target="_blank" rel="noopener" +>电子书《Elements of Programming》</a>,这本老书在出版十年后推出了免费pdf版。中文译作《编程原本》,旨在介绍通用的程序设计原理和技巧,重点关注程序设计的基本元素和抽象概念。这本书的核心思想是将程序设计看作是一种构建和操作抽象概念的过程。它强调程序设计应该建立在数学原理和精确性基础上,通过抽象和泛化来创建可重用、可扩展和可维护的软件。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-14-52.png" +width="377" +height="542" +loading="lazy" +class="gallery-image" +data-flex-grow="69" +data-flex-basis="166px" +></li> +<li><a class="link" href="https://github.com/loft-sh/devpod" target="_blank" rel="noopener" +>devpod</a>,Github 的 Codespaces 和微软的 VSCode DevContainers 给开发者提供了即开即用的云端开发环境。现在,他们的开源平替来了,devpod 是一个开源的开发环境容器,可以方便地在任意客户端(Mac、Win、Linux)或云端主机创建体验一致的开发环境,并且可以与VSCode和Jetbrains等IDE直接集成。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-15-25.png" +width="690" +height="266" +loading="lazy" +class="gallery-image" +data-flex-grow="259" +data-flex-basis="622px" +></li> +<li><a class="link" href="https://uploads-ssl.webflow.com/5ac6b7f2924c656f2b13a88c/6435aabdc0a041194b243eef_Current%20Best%20Practices%20for%20Training%20LLMs%20from%20Scratch%20-%20Final.pdf" target="_blank" rel="noopener" +>从零开始训练大语言模型的最佳实践</a>,训练大语言模型的技术白皮书,从基本概念和技术讲起,教你训练大语言模型。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-15-45.png" +width="656" +height="849" +loading="lazy" +class="gallery-image" +data-flex-grow="77" +data-flex-basis="185px" +></li> +<li><a class="link" href="https://github.com/yardenshafir/WinDbg_Scripts/blob/master/windbg_the_fun_way.pdf" target="_blank" rel="noopener" +>windbg</a>,一本电子书,讲了很多 windbg 调试器的高级用法,市面上很少见。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-039-%E6%9C%9F/2023-07-04-14-16-44.png" +width="620" +height="319" +loading="lazy" +class="gallery-image" +data-flex-grow="194" +data-flex-basis="466px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 040 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/Tue, 11 Jul 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/<h1 id="机器文摘-第-040-期">机器文摘 第 040 期</h1> +<h2 id="长文">长文</h2> +<h3 id="前端代码检查插件eslint和美化插件prettier的冲突">前端代码检查插件<code>ESLint</code>和美化插件<code>Prettier</code>的冲突</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-02-40.png" +width="1900" +height="1008" +loading="lazy" +class="gallery-image" +data-flex-grow="188" +data-flex-basis="452px" +> +在使用VSCode等现代化编辑器进行前端开发的时候,很多工程样板都默认开启了代码检查和自动格式化的功能,其中以 ESLint 插件和 Prettier 插件为主。</p> +<p>之前有一阵子我总是困惑这两个插件的区别,甚至如果配置不好的话,还会有冲突。</p> +<p>比如 Prettier 插件会在你保存源码的时候按照既定规则进行“美化”代码,如去除行尾分号、增加表达式中的空格等等。此时如果ESLint插件的规则配置不同的话,编辑器就会报错并提示要进行“修复”,然而就在你“修复”之后,刚<code>Ctrl+S</code>保存之后,又傻眼了,因为 Prettier 又对代码进行了“美化”。</p> +<p>我周末特意花时间研究了一下,梳理了一下这两个插件的关系以及他们的分工。</p> +<p>首先,他们的职责定位不同:ESLint 用于检查代码编写是否符合某种预定义的规范,可以进行十分详尽的配置和多项检查,比如定义的变量如果未使用可以作为一种警告或者错误,其职责定位以检查为主。而 Prettier 的职责侧重于格式化(美化)代码,对于编写代码的样式如 tab 缩进量、行尾要不要分号、字符串用单引号还是双引号等可以进行统一格式化,一般用于在代码保存的时候进行快速统一样式。</p> +<p>所以两者可以配合使用,但开头提到的规则冲突需要注意。</p> +<p>我个人的习惯是,将两个插件的配置文件里的配置项进行匹配(规则调整为一致),因为我在美化时关注的项并不太多,所以编写这两个配置文件不算费劲。</p> +<p>而网上有人提出了更好的办法,即通过扩展插件的方式,使得 ESLint 自动获取 Prettier 的规则,以自动统一两者的行为。</p> +<p><a class="link" href="https://rileycai.com/%e4%b8%8d%e4%bb%a5%e8%a7%84%e7%9f%a9%ef%bc%8c%e4%b8%8d%e8%83%bd%e6%88%90%e6%96%b9%e5%9c%86-%e5%bd%bb%e5%ba%95%e6%90%9e%e6%87%82-eslint-%e5%92%8c-prettier/" target="_blank" rel="noopener" +>关于 ESLint 和 Prettier 的具体分析文章和操作建议可以看这一篇文章:</a></p> +<h3 id="说一说我现在的知识管理工具和流程">说一说我现在的知识管理工具和流程</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-03-27.png" +width="302" +height="517" +loading="lazy" +class="gallery-image" +data-flex-grow="58" +data-flex-basis="140px" +> +Hacknews 上有网友说<a class="link" href="https://news.ycombinator.com/item?id=36609641" target="_blank" rel="noopener" +>Evernote几乎辞退了它的所有员工</a>,才想起来我已经有好几年没用过 Evernote 了。之前大概有将近十年的时间都在使用Evernote(但都是免费用户)。主要使用场景是记录个人的工作日志和借助浏览器插件剪藏一些值得收藏的文章。</p> +<p>后来随着 Evernote 的限制越来越多,体验逐渐下降。我就迁移到了使用纯文本作为知识记录载体的路线上了。</p> +<p>期间使用过 Emacs 的 org 模式,也尝试过 vim 的 wiki 插件,最后选择了现在这个 VSCode + GitHub 的方案,已稳定使用了两年时间。</p> +<p>具体流程如下: +1、使用 VSCode + <a class="link" href="https://foambubble.github.io/foam/" target="_blank" rel="noopener" +>foam</a> 、<a class="link" href="https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one" target="_blank" rel="noopener" +>MarkdownAllinOne</a> 等插件实现对 Markdown 的高效编辑,可以实时预览排版效果,foam实现了类似 <a class="link" href="https://obsidian.md/" target="_blank" rel="noopener" +>Obsidian</a> 的文章双向链接和知识关系图谱。我主要使用 Markdown 记录日志和编写知识卡片用于存放个人吸收的信息。 +2、所有内容存放在一个 git 仓库中,同步到 GitHub 上的个人私有仓库,这样可以省去对接网盘的麻烦。 +3、对于互联网上阅读到的有用文章,使用浏览器插件 <a class="link" href="https://microsoftedge.microsoft.com/addons/detail/web-clipper/opejamnnohhbjflpbhnmdlknhjkfhfdp" target="_blank" rel="noopener" +>Web Clipper</a>,可以完整的抓取页面内容到指定的后端存储,这个插件我最喜欢的点是它可以将文章抓取到你指定的GitHub仓库,并作为Issue提交。 +4、来不及看的信息就先抓取到 Issue ,然后等有时间进行整理,形成自己的知识卡片后再关闭该 Issue 。</p> +<p>这套工具及流程的优点: +1、完全免费,不产生任何费用,而且体验不亚于收费软件。 +2、自由度高,存储后端可以自己随意选择,如果嫌 GitHub 麻烦的话,可以自己用网盘同步文件夹。 +3、纯文本载体,这个算是优点吧,格式开放,不会存在别的编辑器打不开的情况。 +4、数据私有,数据随时都在本地(云端的仅作为备份和同步中转),不用担心 SaaS 供应商跑路(你看现在的Evernote)。</p> +<p>欢迎大家讨论。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/TransparentLC/WechatMomentScreenshot" target="_blank" rel="noopener" +>朋友圈截图生成工具</a>,可以帮你生成逼真的朋友圈截图,可定制头像、评论、点赞个数等细节。收藏<a class="link" href="https://akarin.dev/WechatMomentScreenshot/" target="_blank" rel="noopener" +>这个地址</a>,以后再也不怕被群里晒孩子的家长或者搞活动的商家逼着发朋友圈集赞了。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-04-12.png" +width="690" +height="1227" +loading="lazy" +class="gallery-image" +data-flex-grow="56" +data-flex-basis="134px" +></li> +<li><a class="link" href="https://86box.net/" target="_blank" rel="noopener" +>86box</a>,老式 x86 架构计算机模拟器,与 Virtualbox 等虚拟化技术不同的是,86box采用纯软件模拟的方式,实现了经典老式 cpu (如 AMD Am486DX4)的各种技术细节,甚至是当时的硬件缺陷(有些老游戏的 hack 需要这些缺陷)。可以完美复现一台上世纪 90 年代的经典 DOS PC ,用来复古怀旧游戏是再合适不过了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-04-26.png" +width="553" +height="371" +loading="lazy" +class="gallery-image" +data-flex-grow="149" +data-flex-basis="357px" +></li> +<li><a class="link" href="https://github.com/ztxz16/fastllm" target="_blank" rel="noopener" +>fastllm</a>,fastllm是纯c++实现,无第三方依赖的高性能大模型推理库(待测试验证)。据宣称:6~7B级模型在安卓端上也可以流畅运行,支持python调用,chatglm-6B级模型单卡可达10000+token / s,支持glm, llmam, moss基座,手机端流畅运行。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-05-17.png" +width="875" +height="356" +loading="lazy" +class="gallery-image" +data-flex-grow="245" +data-flex-basis="589px" +></li> +<li><a class="link" href="https://photoai.com" target="_blank" rel="noopener" +>PhotoAI</a>,作者说,他为这个网站大概写了14000行PHP代码,样式全写在了<code>&lt;style&gt;</code>标签里,JS全写在<code>&lt;script&gt;</code>标签里,除了<code>jQuery</code>没用任何框架,就连布局也是使用<code>float:left</code>这种老式的浮动实现。然而这个网站确能给他带来每月差不多 <em>6万刀</em> 的收入。这是不是在吹牛。这个网站的业务是:使用AI生成完全没有任何版权问题的各种人像照片。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-05-41.png" +width="690" +height="617" +loading="lazy" +class="gallery-image" +data-flex-grow="111" +data-flex-basis="268px" +></li> +<li><a class="link" href="https://makepad.nl/makepad/examples/ironfish/src/index.html" target="_blank" rel="noopener" +>Ironfish synth</a>,用rust写的在线合成器,虽然感觉像个 Demo 但完成度很高,音源部分具有两个振荡器(可选正弦波、方波、锯齿波等)和一个噪波通道,滤波器、效果器齐全,另外还有一个可视化音序器。可基于键盘直接演奏。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-040-%E6%9C%9F/2023-07-11-13-05-59.png" +width="690" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="204" +data-flex-basis="491px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 038 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/Tue, 27 Jun 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/<h1 id="机器文摘-第-038-期">机器文摘 第 038 期</h1> +<h2 id="研究">研究</h2> +<ul> +<li><a class="link" href="https://www.polygon.com/23690187/discord-ai-chatbot-clyde-grandma-exploit-chatgpt" target="_blank" rel="noopener" +>ChatGPT的“奶奶漏洞”</a>,奶奶漏洞来源自一个用户说他已经过世的奶奶是凝固汽油弹工厂的工程师,用户让 ChatGPT 用他奶奶说睡前故事的形式,详细介绍了凝固汽油弹的制作方法。以此来绕过 ChatGPT 的安全审查,结果当然是,他得逞了。后来还有网友做了试验,以同样的方式可以套取 Windows 各个版本的序列号。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-53-23.png" +width="720" +height="489" +loading="lazy" +class="gallery-image" +data-flex-grow="147" +data-flex-basis="353px" +></li> +<li>国外也有“垃圾佬”,这篇<a class="link" href="https://l4rz.net/running-nvidia-sxm-gpus-in-consumer-pcs/" target="_blank" rel="noopener" +>《怎样低成本搭建深度学习电脑》</a>的文章,介绍了作者怎样通过在二手网站上“捡垃圾”搭建出了性能良好且便宜的GPU工作站。 值得一提的是,作者购买的主要渠道竟然来自国内的著名二手物品交易平台,某鱼。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-54-05.png" +width="690" +height="459" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="360px" +></li> +</ul> +<h2 id="长文">长文</h2> +<ul> +<li> +<p>回顾这些年软件研发的历程,凡是能够做成的软件,无一例外都是抓住了真正存在的需求。这样的需求未必很宏大或者华丽,但一定不是想象种的伪需求。仔细分析之后就会发现,在一个软件产品的生命周期里,开发者所面临的真正(或者说正确的)需求很少,因为找到它们十分不易,它们周边布满了被人们主观意识强加上的伪需求。<a class="link" href="https://cerebralab.com/Imaginary_Problems_Are_the_Root_of_Bad_Software" target="_blank" rel="noopener" +>《伪需求是糟糕软件的根源》</a>,文章探讨了软件开发中存在的一个问题,即虚构的问题(我将之译为:伪需求)如何导致糟糕的软件结果。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-56-35.png" +width="353" +height="179" +loading="lazy" +class="gallery-image" +data-flex-grow="197" +data-flex-basis="473px" +></p> +</li> +<li> +<p>有没有考虑过一个问题,即:为什么随着科技的发展和生产力的提升,人们不是越来越清闲,反而越来越劳累了?这里有篇文章探讨了一些深层次的原因,<a class="link" href="https://theanarchistlibrary.org/library/david-graeber-bullshit-jobs" target="_blank" rel="noopener" +>《狗屁工作》</a>,此文写于 2013 年,作者是 David Graeber (一名人类学教授)。文章讨论了现代社会中存在的一种现象,即许多人在工作中感到他们所从事的工作毫无意义,没有真正的价值和目的。这些工作被称为&quot;狗屁工作&quot;,作者试图探究狗屁工作的存在原因和对个体和社会的影响。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-56-57.png" +width="602" +height="854" +loading="lazy" +class="gallery-image" +data-flex-grow="70" +data-flex-basis="169px" +></p> +</li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/laishulu/Sarasa-Term-SC-Nerd" target="_blank" rel="noopener" +>Sarasa Term SC Nerd</a>,写中文Markdown文件的时候,最怕遇到表格,因为编辑器按照一个中文字符的宽度等于两个英文字符的宽度进行计算,而很多字体在设计时未考虑严格按照这种2:1的宽度比例设计字形,导致在Markdown在编辑状态时的表格分割线错位,看起来十分头疼。经过多方对比,我终于找到了让自己满意的等宽字体,支持中英文字符2:1宽度比例,中文为黑体,英文字符也特别适合写代码。此外还整合了Nerd fonts,支持在终端显示各种漂亮图标。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-58-24.png" +width="690" +height="187" +loading="lazy" +class="gallery-image" +data-flex-grow="368" +data-flex-basis="885px" +></li> +<li><a class="link" href="https://reviewgpt.net" target="_blank" rel="noopener" +>ReviewGPT</a> 写作文、写报告、写邮件,生活中充满了各种写作任务。ReviewGPT 基于 gpt 模型,可为你的文章进行打分、评价,提出修改意见,甚至还可以扮演莎士比亚、金庸等知名作家,帮助你重新撰写,快速提升文章质量。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-58-38.png" +width="690" +height="394" +loading="lazy" +class="gallery-image" +data-flex-grow="175" +data-flex-basis="420px" +></li> +<li><a class="link" href="https://github.com/binpash/try" target="_blank" rel="noopener" +>try</a>,刚发布的一个命令行工具,目标是允许你执行命令的时候先检查其执行的后果,然后再决定是否让命令真正生效。真正起到了安全保护的效果。官方介绍这个命令是基于 Linux 的命名空间(通过 unshare )和 overlayfs 联合文件系统等技术实现。并特别提醒并非基于沙盒,所以还是谨慎执行危险操作吧。比如<code>try rm rf /*</code>。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-15-59-26.png" +width="831" +height="467" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="427px" +></li> +<li><a class="link" href="https://github.com/XingangPan/DragGAN" target="_blank" rel="noopener" +>DragGAN</a>, 通过拖动就可以完全操纵图像的 AI 模型,现已开放源码! DragGAN 是由谷歌、麻省理工学院和马克斯普朗克研究所创建的一种新的人工智能模型。可以让你轻松通过点击拖动等简单的交互操作就能改变拍摄对象的姿势、形状和表情。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-16-00-25.png" +width="598" +height="399" +loading="lazy" +class="gallery-image" +data-flex-grow="149" +data-flex-basis="359px" +></li> +<li><a class="link" href="https://flameshot.org/" target="_blank" rel="noopener" +>flameshot</a>,一个超强的免费截图软件,可以像任何一个截图工具一样截图,最重要的是还有一些附加功能,按一下数字图标,就可以在屏幕上按数字顺序自动生成步骤图示,非常适合生成操作步骤说明。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-038-%E6%9C%9F/2023-06-27-16-01-00.png" +width="580" +height="374" +loading="lazy" +class="gallery-image" +data-flex-grow="155" +data-flex-basis="372px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 037 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/Tue, 20 Jun 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/<h1 id="机器文摘-第-037-期">机器文摘 第 037 期</h1> +<h2 id="研究">研究</h2> +<ul> +<li><a class="link" href="https://snap-research.github.io/SnapFusion/" target="_blank" rel="noopener" +>SnapFusion</a> 文本到图像的扩散模型可以从自然语言描述中创建令人惊叹的图像。然而,这些模型很大,需要高端 GPU 在服务端运行模型。SnapFusion提出了一种通用方法,可以在移动设备上运行的文本到图像扩散模型,且出图时间不到2秒。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-55-06.png" +width="609" +height="899" +loading="lazy" +class="gallery-image" +data-flex-grow="67" +data-flex-basis="162px" +></li> +<li><a class="link" href="https://framer.com/ai" target="_blank" rel="noopener" +>Framer</a> 发布了 AI 工具,直接根据文字需求生成页面,我试了一下,对于个人博客、产品介绍页面等静态展示类型的页面,生成的效果还是十分理想的,而且同步提供桌面端和移动端页面。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-55-33.png" +width="599" +height="710" +loading="lazy" +class="gallery-image" +data-flex-grow="84" +data-flex-basis="202px" +></li> +<li><a class="link" href="https://notes.dt.in.th/HDRQRCode" target="_blank" rel="noopener" +>比<code>#ffffff</code>还“白”的“超级白”</a>,这里有网友介绍了一个方法,可以显示更高对比度的二维码(以方便用户扫描识别),据说白的程度超出了sRGB颜色范围,前提是你的显示设备支持HDR。作者的思路是用一段HDR视频在网页中伪装成显示二维码的图片。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-56-11.png" +width="690" +height="305" +loading="lazy" +class="gallery-image" +data-flex-grow="226" +data-flex-basis="542px" +></li> +<li><a class="link" href="https://rwmj.wordpress.com/2023/06/14/i-booted-linux-292612-times/" target="_blank" rel="noopener" +>我在21小时内重启系统29万次</a>,Linux 6.4内核有一个bug可能导致启动时挂起,但概率很低。为了复现bug,Richard WM Jones重启了29万次电脑,最终找到了问题。这让我想起了之前修改不容易复现Bug的艰辛。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-56-28.png" +width="690" +height="735" +loading="lazy" +class="gallery-image" +data-flex-grow="93" +data-flex-basis="225px" +></li> +<li>我发现一个用chatGPT翻译整段文字的小技巧,那就是在他翻译完成之后,再将这段话发给他,让他根据通顺程度和合理性进行二次润色,出来的结果就好很多了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-58-53.png" +width="717" +height="648" +loading="lazy" +class="gallery-image" +data-flex-grow="110" +data-flex-basis="265px" +></li> +<li>Python写代码很爽,但是想打包发布成果的时候就稍微麻烦一些了,毕竟一大堆环境依赖和包依赖。我之前一直用的是PyInstaller作为打包工具,但是现在我又发现了这个<a class="link" href="https://github.com/Nuitka/Nuitka" target="_blank" rel="noopener" +>Nuitka</a>。它的打包原理是:直接把 Python 代码转成 C 代码再编译,这样打包出来的成果占用小、执行效率也高,尤其适合PyQt编写的桌面程序。另外,著名的 Blender 就是用 Nuitka 编译的。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-59-12.png" +width="428" +height="272" +loading="lazy" +class="gallery-image" +data-flex-grow="157" +data-flex-basis="377px" +></li> +</ul> +<h2 id="长文">长文</h2> +<ul> +<li><a class="link" href="https://www.raptitude.com/2022/01/everything-must-be-paid-for-twice/" target="_blank" rel="noopener" +>你买的每样东西都需要支付两次成本</a>,这篇在Hacker News上的文章引起我的强烈共鸣。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-15-59-33.png" +width="600" +height="400" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="360px" +></li> +</ul> +<p>它提出了一个有趣的观点,我以前从未意识到:</p> +<p>每样东西都需要支付两次成本。</p> +<p>通常,我们只关注第一次支付的成本,也就是购买时花的钱,比如买一台相机、一架钢琴或一本小说。</p> +<p>然而,作者指出,如果你不支付第二次的成本,你之前花的钱就等于打水漂了。</p> +<p>第二次成本指的是,你需要花时间和精力去充分使用你所购买的物品。</p> +<p>比如认真阅读一本书,练习钢琴以提高演奏水平等等。</p> +<p>然而,我们常常只停留在第一次购买时的满足感上,然后追求下一个。</p> +<p>随着时间的推移,大量未支付第二次成本的物品使我们积累了一种无形的债务。</p> +<p>为此经常感到挫败。</p> +<p>这种挫败感促使我们寻求那些能够刺激我们的短期享受,比如玩手机、享用美食。</p> +<p>进一步导致没有时间支付第二次成本。</p> +<p>那么,有什么办法可以改变这种情况吗?</p> +<p>作者说,唯一的解决办法就是控制购买欲望,强迫自己安排时间来履行第二次支付的责任。</p> +<p>尽管这听起来可能有些不舒服,但如果我们能克服这种不舒服的临界点,例如学会一首乐曲,耐心读完一本书,我们将会获得意想不到的奖励时刻。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://www.ratatype.com" target="_blank" rel="noopener" +>ratatype</a>,在线键盘盲打指法练习,有完整的练习教程,从初级到高级都有。有点儿像Dos时代的著名打字练习软件TT,不过是网页版的。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-16-00-11.png" +width="690" +height="360" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="460px" +></li> +<li><a class="link" href="https://play0ad.com/download" target="_blank" rel="noopener" +>0A.D.</a>,帝国时代是个经典游戏,这里有个开源版,名字叫做0AD,由Wildfire Games开发,虽然是免费开源的游戏,但是效果和可玩性都非常高,适合在周末的午后来一把怀旧局。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-16-00-26.png" +width="690" +height="405" +loading="lazy" +class="gallery-image" +data-flex-grow="170" +data-flex-basis="408px" +></li> +<li><a class="link" href="https://landing.love" target="_blank" rel="noopener" +>landing.love</a>,一个专门收集各种网页动画效果的网站,目前已收录超过400个具有新颖创意动效的网站,并配有截图和录屏视频。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-16-00-47.png" +width="590" +height="486" +loading="lazy" +class="gallery-image" +data-flex-grow="121" +data-flex-basis="291px" +></li> +<li><a class="link" href="https://github.com/princeton-vl/infinigen" target="_blank" rel="noopener" +>infinigen</a>,一款面向计算机视觉研究的3D场景自动生成器,提供多样且高质量的3D训练数据。基于Blender,免费且开源。可以通过重写随机化的默认参数来完全控制资产生成。提供了对自然界中多种对象和场景的生成器,包括植物、动物、地形以及火、云、雨、雪等自然现象。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-16-01-41.png" +width="951" +height="522" +loading="lazy" +class="gallery-image" +data-flex-grow="182" +data-flex-basis="437px" +></li> +<li><a class="link" href="https://yjdoc2.github.io/8086-emulator-web/compile" target="_blank" rel="noopener" +>8086-emulator-web</a> ,用js编写的的8086 cpu模拟器,支持汇编语言在线编写、编译和调试运行,是一个学习汇编语言和理解计算机原理的好工具。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-037-%E6%9C%9F/2023-06-20-16-01-04.png" +width="690" +height="320" +loading="lazy" +class="gallery-image" +data-flex-grow="215" +data-flex-basis="517px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 036 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/Wed, 14 Jun 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/<h1 id="机器文摘-第-036-期">机器文摘 第 036 期</h1> +<h2 id="研究">研究</h2> +<ul> +<li><a class="link" href="https://video.weibo.com/show?fid=1034:4911535232057363" target="_blank" rel="noopener" +>软驱阵列演奏音乐</a>,国外大神用512个软驱、16个硬盘、4个扫描仪,组装成阵列,通过编程的方式控制电机震动发出声音,组成各声部。这么多软驱,让我想到了退休老干部合唱团。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-49-03.png" +width="1555" +height="926" +loading="lazy" +class="gallery-image" +data-flex-grow="167" +data-flex-basis="403px" +></li> +<li><a class="link" href="https://video.weibo.com/show?fid=1034:4564677670141974" target="_blank" rel="noopener" +>大脑能像身体那样锻炼吗?</a>,如何训练大脑?提高记忆力、注意力和智力!这个视频进行了讲解,总之就是,用进废退,改变日常默认行动,让大脑动起来。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-49-59.png" +width="743" +height="450" +loading="lazy" +class="gallery-image" +data-flex-grow="165" +data-flex-basis="396px" +></li> +<li><a class="link" href="https://gaultier.github.io/blog/x11_x64.html" target="_blank" rel="noopener" +>用纯汇编写一个GUI</a>,跟随这篇教学文章,通过编写图形界面的方式来学习汇编语言吧。顺便,作者想挑战一下,最小的GUI程序其可执行二进制文件能有多小。(现在的可执行文件动不动就好几十上百MB)​。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-50-39.png" +width="1046" +height="463" +loading="lazy" +class="gallery-image" +data-flex-grow="225" +data-flex-basis="542px" +></li> +<li><a class="link" href="https://blog.betacat.io/post/2023/06/summarize-hacker-news-by-chatgpt" target="_blank" rel="noopener" +>让 ChatGPT 帮我们总结 Hacker News</a>,让AI每天帮我总结新闻摘要,这个想法我已经考虑很久了,现在已经有人做了实现。这篇文章介绍了一个开源静态网站的实现,它利用 ChatGPT 的总结能力,直接将每条Hackernews的新闻用一两句话总结出来,然后发布到GithubPages 可以节约我们每天看新闻的时间。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-51-29.png" +width="891" +height="413" +loading="lazy" +class="gallery-image" +data-flex-grow="215" +data-flex-basis="517px" +></li> +<li><a class="link" href="https://www.web3brand.io/p/maximize-unregretted-user-time" target="_blank" rel="noopener" +>马斯克专访:推特的混乱过去了,现在的目标是最大化用户无悔时间!</a>,我不喜欢看八卦,但是科技的除外。马斯克收购 Twitter 几个月过去了,大家还在等着看笑话,但是为什么没等到,以及开掉一半人之后效率却提升那么多? +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-52-02.png" +width="680" +height="417" +loading="lazy" +class="gallery-image" +data-flex-grow="163" +data-flex-basis="391px" +></li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/AI4Finance-Foundation/FinGPT" target="_blank" rel="noopener" +>FinGPT</a>,一个面向金融领域的开源语言模型,采用以数据为中心的方法,为研究人员和实践者提供易于使用的资源,致力于做金融领域的chatGPT。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-52-48.png" +width="822" +height="462" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="427px" +></li> +<li><a class="link" href="https://github.com/facebookresearch/audiocraft" target="_blank" rel="noopener" +>Audiocraft</a>,facebook发布的一个PyTorch库,用于音频生成的深度学习研究。目前,它提供了用于从文本生成音乐的MusicGen代码和模型。模型使用2万小时正版授权音乐训练。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-53-34.png" +width="816" +height="350" +loading="lazy" +class="gallery-image" +data-flex-grow="233" +data-flex-basis="559px" +></li> +<li><a class="link" href="https://github.com/mljar/mercury" target="_blank" rel="noopener" +>Mercury</a>,在 Jupyter Notebook 中构建 Web 应用程序,允许您在Python笔记本中添加交互式小部件,然后将笔记本发布为带交互界面的Web应用程序。我的感受是,Mercury就是 notebook版的<a class="link" href="https://github.com/gradio-app/gradio" target="_blank" rel="noopener" +>gradio</a> ​​​。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-53-58.png" +width="805" +height="421" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="458px" +></li> +<li><a class="link" href="https://github.com/reactive-python/reactpy" target="_blank" rel="noopener" +>ReactPy</a>,React是最流行的用于构建UI的前端框架,现在所有Python开发人员都可以使用它。比起gradio,这个reactpy的抽象层级更低一些,自由度更高了,我猜测目标用户应该是不喜欢写前端代码但是又希望掌控页面细节的python程序员。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-56-24.png" +width="632" +height="148" +loading="lazy" +class="gallery-image" +data-flex-grow="427" +data-flex-basis="1024px" +></li> +<li><a class="link" href="http://ggml.ai/" target="_blank" rel="noopener" +>GGML</a>,一个用于机器学习的张量库,采用纯C++实现,无其他依赖项。旨在在普通硬件上实现大型模型和高性能。它同时也是 llama.cpp 和 whisper.cpp 的底层库。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-16-57-18.png" +width="629" +height="327" +loading="lazy" +class="gallery-image" +data-flex-grow="192" +data-flex-basis="461px" +></li> +<li><a class="link" href="https://github.com/Genymobile/scrcpy" target="_blank" rel="noopener" +>Scrcpy</a>,一个让人相见恨晚的app,可以通过USB或TCP/IP连接镜像Android设备的视频和音频,并允许使用计算机的键盘和鼠标来控制设备。它不需要任何root权限,并且兼容Linux、Windows和macOS操作系统。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-17-02-19.png" +width="408" +height="589" +loading="lazy" +class="gallery-image" +data-flex-grow="69" +data-flex-basis="166px" +></li> +<li><a class="link" href="https://maketafi.com/ai" target="_blank" rel="noopener" +>Tafi</a>,通过自然语言生成3D模型,质量号称接近AAA级游戏,可以导出创建的角色到Blender、Unreal 或 Unity中。 ​​​ +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-17-02-52.png" +width="1080" +height="608" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></li> +<li><a class="link" href="https://github.com/Hufe921/canvas-editor" target="_blank" rel="noopener" +>canvas-editor</a>,一个基于 canvas/svg 实现的富文本编辑器,在市面上,使用 Canvas 实现整个编辑器的开源项目并不常见,大多数情况下仍然使用 DOM 来实现。使用 Canvas 的最显著特点是其出色的性能,但实现起来的成本也更高。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-17-15-39.png" +width="1200" +height="668" +loading="lazy" +class="gallery-image" +data-flex-grow="179" +data-flex-basis="431px" +></li> +<li><a class="link" href="https://markmap.js.org%e2%80%8b%e2%80%8b" target="_blank" rel="noopener" +>markmap.js</a>,一个用markdown文本制作思维导图的工具,提供了vscode的插件可直接在编辑器预览。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-036-%E6%9C%9F/2023-06-14-17-16-02.png" +width="611" +height="458" +loading="lazy" +class="gallery-image" +data-flex-grow="133" +data-flex-basis="320px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 035 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/Wed, 07 Jun 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/<h1 id="机器文摘-第-035-期">机器文摘 第 035 期</h1> +<h2 id="研究">研究</h2> +<ul> +<li><a class="link" href="https://www.reproof.app/blog/notes-apps-help-us-forget" target="_blank" rel="noopener" +>笔记帮我们记住还是忘记?</a>这篇文章讨论了笔记对帮助我们遗忘的作用。作者认为,随着时间的推移,我们无法记住所有的事情,但是只要我们记录了重要的信息,就可以在需要时再次查找,因此笔记实际上帮助我们遗忘。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-09-37.png" +width="1173" +height="488" +loading="lazy" +class="gallery-image" +data-flex-grow="240" +data-flex-basis="576px" +></li> +<li><a class="link" href="https://research.nvidia.com/labs/dir/neuralangelo/" target="_blank" rel="noopener" +>高保真神经表面重建</a>,Nvidia 新发布的这个 Neuralangelo 有些猛,随便给一个视频就能进行精细3D建模,也许要不多久激光点云技术就要淘汰了。值得关注 ! +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-12-49.png" +width="936" +height="465" +loading="lazy" +class="gallery-image" +data-flex-grow="201" +data-flex-basis="483px" +></li> +<li><a class="link" href="https://github.com/Neo-Desktop/WindowsXPKg" target="_blank" rel="noopener" +>Windows XP 激活算法被破解</a>, XPKeygen是一个可以随意生成XP有效安装密钥的程序,当前的电脑可能用不到了。不过可能还有一些老旧的设备,只能通过 Windows XP 来操作,这时候这个东西就派上用场了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-17-33.png" +width="610" +height="285" +loading="lazy" +class="gallery-image" +data-flex-grow="214" +data-flex-basis="513px" +></li> +<li><a class="link" href="https://www.v2ex.com/t/944717" target="_blank" rel="noopener" +>一个整活儿的开源编辑器</a>,data:text/html;base64,PGh0bWwgY29udGVudGVkaXRhYmxlPmVkaXQgbWU8L2h0bWw+ 把这个代码粘到浏览器地址栏,竟然是个记事本app,如果从IDE拷贝代码过去,竟然还支持代码高亮。。。。加入到收藏夹即可食用。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-20-19.png" +width="663" +height="347" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="458px" +></li> +<li><a class="link" href="https://mymodernmet.com/sea-turtle-birch-aquarium-3d-printed-brace" target="_blank" rel="noopener" +>3D打印拯救海龟</a> ,2017年,伯奇水族馆与加州大学圣地亚哥分校图书馆的数字媒体实验室合作。他们一起创造了一种首创的3D打印支架,以固定她的外壳上的缝隙。现在,六年后,这种生物及其照顾者继续从这项发明中获益。这只海龟最近接受了年度检查,健康状况良好。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-21-40.png" +width="613" +height="372" +loading="lazy" +class="gallery-image" +data-flex-grow="164" +data-flex-basis="395px" +></li> +<li><a class="link" href="https://kuenzi.dev/toothbrush/" target="_blank" rel="noopener" +>破解“智能”牙刷</a> 国外一个博主记录了他破解自己的电动牙刷的过程。由于牙刷的NFC芯片采用的加密方式是密码加密,并且在通讯过程中是用了明文传递,所以他采取了截获通讯信号的方式窃听到了密码,然后就解锁了各种姿势开始为所欲为了。。。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-22-42.png" +width="606" +height="363" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="400px" +></li> +<li><a class="link" href="https://bjoernkarmann.dk/project/paragraphica" target="_blank" rel="noopener" +>真·AI相机</a> ,paragraphica 是一个没有镜头但是却有物理实体的“AI相机”,使用位置、时间等参数数据生成特定地点和时刻的prompt,然后由人工智能来生成“照片”。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-24-07.png" +width="578" +height="513" +loading="lazy" +class="gallery-image" +data-flex-grow="112" +data-flex-basis="270px" +></li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://www.dora.run/ai" target="_blank" rel="noopener" +>Droa</a>,一个通过自然语言进行网站开发的工具,你只需要提需求,剩下的交给AI。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-26-05.png" +width="821" +height="496" +loading="lazy" +class="gallery-image" +data-flex-grow="165" +data-flex-basis="397px" +></li> +<li><a class="link" href="https://github.com/SupaGruen/StableDiffusion-CheatSheet" target="_blank" rel="noopener" +>StableDiffusion-CheatSheet</a>,经常用 Stable Diffusion 进行 AI 绘图的,可以看下这个开源速查表。里面拥有超过 700 种经过测试的艺术风格,可快速搜索查找各类艺术家,并支持一键复制 Prompt。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-26-50.png" +width="742" +height="521" +loading="lazy" +class="gallery-image" +data-flex-grow="142" +data-flex-basis="341px" +></li> +<li><a class="link" href="https://www.math.cmu.edu/~jmackey/151_128/bws_book.pdf" target="_blank" rel="noopener" +>你一直想知道的关于数学的一切</a>,此书是CMU数学科学系的博士生布兰登·W·沙利文撰写的,旨在引导读者进入抽象数学和证明写作的世界,帮助培养读者的数学思维和表达能力。主题涵盖集合、逻辑、归纳法、关系、函数、基数和组合数学等基础和工具。暂未有中文翻译。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-27-26.png" +width="724" +height="579" +loading="lazy" +class="gallery-image" +data-flex-grow="125" +data-flex-basis="300px" +></li> +<li><a class="link" href="https://github.com/eastlakeside/interpy-zh" target="_blank" rel="noopener" +>Python进阶</a>,是《Intermediate Python》的中文译本。2021最新目录版,实时更新托管在<a class="link" href="https://py.eastlakeside.cn" target="_blank" rel="noopener" +>GithubPages</a>。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-28-23.png" +width="1037" +height="350" +loading="lazy" +class="gallery-image" +data-flex-grow="296" +data-flex-basis="711px" +></li> +<li><a class="link" href="https://csspro.com/" target="_blank" rel="noopener" +>CSSPro</a>,一个所见即所得的在线CSS可视化开发工具,直接在页面运行,那里修改点哪里。效果真的很惊艳。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-29-07.png" +width="921" +height="537" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="411px" +></li> +<li><a class="link" href="https://github.com/makeplane/plane" target="_blank" rel="noopener" +>Plane</a>,开源版 JIRA !不少软件开发者都使用JIRA进行缺陷管理,JIRA确实很强大,也很好用。现在,开源版的来了,据说完全可以作为JIRA的平替。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-30-19.png" +width="1139" +height="595" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="459px" +></li> +<li><a class="link" href="https://openmlsys.github.io/index.html" target="_blank" rel="noopener" +>机器学习系统:设计和实现</a>,一本关于机器学习的电子书,本书希望做成世界上第一本全面讲述机器学习系统知识的开源书籍。可以看作一门衔接机器学习和计算机系统的课程 ​​。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-31-04.png" +width="234" +height="390" +loading="lazy" +class="gallery-image" +data-flex-grow="60" +data-flex-basis="144px" +></li> +<li><a class="link" href="https://callannie.ai/" target="_blank" rel="noopener" +>Callanie</a>,练习英语口语的AI对话机器人,支持国内手机号注册,免费且流畅。后端基于大语言模型,可以陪你聊各种话题。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-035-%E6%9C%9F/2023-06-07-10-31-49.png" +width="303" +height="570" +loading="lazy" +class="gallery-image" +data-flex-grow="53" +data-flex-basis="127px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 034 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/Wed, 31 May 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/<h1 id="机器文摘-第-034-期">机器文摘 第 034 期</h1> +<h2 id="研究">研究</h2> +<ul> +<li><a class="link" href="https://samwho.dev/memory-allocation/" target="_blank" rel="noopener" +>图解内存分配</a>,文章展示了 C/C++ 编程中的内存分配过程,包括静态和动态内存分配技术、它们的优势,以及有效的内存管理所需考虑的事项。以图解的形式展示了内存分配过程,希望读者可以通过本文更好地理解内存分配相关的概念,并在实际编程中对内存进行更加高效的管理。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-49-39.png" +width="759" +height="298" +loading="lazy" +class="gallery-image" +data-flex-grow="254" +data-flex-basis="611px" +></li> +<li><a class="link" href="https://blog.koehntopp.info/2023/05/17/50-years-in-filesystems-towards-2004-lfs.html" target="_blank" rel="noopener" +>文件系统五十年</a>,这是一个系列文章,详细记录了计算机文件系统的发展历程。也许我们身在其中无法感受到它的进步,但是回顾历史我们会发现,即便是我们不容易注意到的部分,也在不停地发展和优化。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-50-33.png" +width="672" +height="413" +loading="lazy" +class="gallery-image" +data-flex-grow="162" +data-flex-basis="390px" +></li> +<li><a class="link" href="https://xorvoid.com/sectorc.html" target="_blank" rel="noopener" +>只有512字节的C编译器</a>,这篇文章介绍了一个怎样实现最小编译器的思路,SectorC (github) 是一个用 x86-16 汇编编写的 C 编译器,适合 x512 机器的 86 字节引导扇区。它支持 C 的子集,足够大,可以编写真实有趣的程序。它很可能是有史以来最小的C编译器。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-51-20.png" +width="764" +height="366" +loading="lazy" +class="gallery-image" +data-flex-grow="208" +data-flex-basis="500px" +></li> +<li><a class="link" href="https://www.amygoodchild.com/blog/computer-art-50s-and-60s" target="_blank" rel="noopener" +>上世纪50~60年代的计算机艺术</a>,数字艺术的发展简史。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-51-53.png" +width="781" +height="494" +loading="lazy" +class="gallery-image" +data-flex-grow="158" +data-flex-basis="379px" +></li> +<li><a class="link" href="" >win10的隐藏功能</a>,原来win10还有这个功能。按Ctrl + Alt + Del 后,按住Ctrl不松,再点击右下角的电源符号,就会进入紧急重启(Emergency Restart)界面。应该是一种强制重启。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-52-04.png" +width="690" +height="518" +loading="lazy" +class="gallery-image" +data-flex-grow="133" +data-flex-basis="319px" +></li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/SevaSk/ecoute" target="_blank" rel="noopener" +>Ecoute</a>,可用于远程面试作弊的工具?Ecoute 是一种实时转录工具,可在文本框中为用户的麦克风输入(您)和用户的扬声器输出(扬声器)提供实时翻译。它还使用 OpenAI 的 GPT-3.5 生成建议答复内容,供用户“参考”。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-52-39.png" +width="820" +height="386" +loading="lazy" +class="gallery-image" +data-flex-grow="212" +data-flex-basis="509px" +></li> +<li><a class="link" href="https://app.rask.ai/" target="_blank" rel="noopener" +>rask.ai</a>,自动将视频转成“译制片”,在对内容进行翻译的同时,会尽量保持之前的音色和语调,端到端给你的视频完成多语配音,后续还会推出唇形同步合成。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-53-28.png" +width="1171" +height="644" +loading="lazy" +class="gallery-image" +data-flex-grow="181" +data-flex-basis="436px" +></li> +<li><a class="link" href="https://chrome.google.com/webstore/detail/tango-how-to-guides-and-s/lggdbpblkekjjbobadliahffoaobaknh" target="_blank" rel="noopener" +>Tango</a>,一个Chrome浏览器插件,能帮你生成一个网站的操作指南。它会自动记录所有的操作流程,并做相应的截图和注解文档。你只需要点一遍就行了。目前还只能生成英文版的,不过自己翻译也不麻烦。可以节省不少时间。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-53-58.png" +width="632" +height="390" +loading="lazy" +class="gallery-image" +data-flex-grow="162" +data-flex-basis="388px" +></li> +<li><a class="link" href="https://praeclarum.org/2023/05/19/webgpu-torch.html" target="_blank" rel="noopener" +>WebGPU-torch</a>,PyTroch的webgpu实现。我测试了一下,我的浏览器目前还不支持。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-54-28.png" +width="1384" +height="796" +loading="lazy" +class="gallery-image" +data-flex-grow="173" +data-flex-basis="417px" +></li> +<li><a class="link" href="http://ogden.basic-english.org/" target="_blank" rel="noopener" +>basic-english</a>,“基础英语”的概念是:25,000个单词的牛津袖珍英语词典去掉冗余,并消除组合单词,90%的概念可以用850个单词来实现。使用这些基础英语可以简化日常工作和交流。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-55-26.png" +width="778" +height="516" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="361px" +></li> +<li><a class="link" href="https://github.com/raunofreiberg/interfaces" target="_blank" rel="noopener" +>Web界面准则</a>,讲解如何提升网页界面的交互性、排版、动画、辅助功能、优化和设计。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-56-18.png" +width="834" +height="466" +loading="lazy" +class="gallery-image" +data-flex-grow="178" +data-flex-basis="429px" +></li> +<li><a class="link" href="https://github.com/excalidraw/excalidraw" target="_blank" rel="noopener" +>excalidraw</a>,开源虚拟手绘风格白板程序,支持端到端加密在线协作。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-034-%E6%9C%9F/2023-05-31-09-56-43.png" +width="759" +height="504" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="361px" +></li> +</ul> +<h2 id="沉思录">沉思录</h2> +<ul> +<li>一切商业的本质都是:收购一些东西(包括原材料、人力服务),经过加工(加工过程产生价值)后变成产品或服务出售。这里的原材料可以是实体物品也可以是信息。所以关键动作就是:收、加工、出售,从重要性上来说,出售大于加工大于收。所以如果要策划自己的产品,解决和分析问题的优先级也应如此,我之前想的正好一反;</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 033 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/Wed, 24 May 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/<h1 id="机器文摘-第-033-期">机器文摘 第 033 期</h1> +<h2 id="研究">研究</h2> +<h3 id="全键盘信息终端">全键盘信息终端</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/2023-05-24-09-22-11.png" +width="1335" +height="637" +loading="lazy" +class="gallery-image" +data-flex-grow="209" +data-flex-basis="502px" +> +我一直很怀念使用黑莓手机的日子。</p> +<p>物理全键盘的手感比起现在硬邦邦的触摸屏真不知道好到哪里去了。</p> +<p>多少次盯着抽屉里的黑莓尸体,都在想有没有办法再次发挥它的余热。</p> +<p>现在机会来了,有人将树莓派和黑莓手机的全键盘(带触摸板的那一款)结合起来做了一个终端。</p> +<p>取名:<a class="link" href="https://beepberry.sqfmi.com/" target="_blank" rel="noopener" +>Beepberry</a>,具有400*200分辨率的LCD屏幕,和usb type-c接口。</p> +<h3 id="自己动手给树莓派写操作系统">自己动手给树莓派写操作系统</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/2023-05-24-09-31-09.png" +width="677" +height="359" +loading="lazy" +class="gallery-image" +data-flex-grow="188" +data-flex-basis="452px" +> +学习操作系统的最佳手段是自己动手写一个。</p> +<p>这类教程很多,一般都是针对x86平台,树莓派的比较少见。</p> +<p><a class="link" href="https://github.com/isometimes/rpi4-osdev" target="_blank" rel="noopener" +>《给树莓派编写“裸机”操作系统》</a>来自github上的一个开源项目。</p> +<p>可以带你从树莓派的硬件层基础上直接构建一个的完整操作系统。</p> +<h3 id="关于-demoscene-制作的一些文章">关于 Demoscene 制作的一些文章</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/2023-05-24-09-40-25.png" +width="471" +height="314" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="360px" +> +Demoscene(也称为Demo Party)是一种计算机艺术形式,旨在展示计算机的音频和图形表现能力。Demoscene通常是由小团队制作的演示性程序,也被称为demo,它集计算机程序、音乐、图形和动画于一身,是八十年代初期在个人计算机上发展起来的一种文化和艺术运动。Demoscene的主要目的是展示计算机和程序的美感,通常使用3D渲染和其他复杂的视觉效果,展示计算机的高级图形和音频处理能力。</p> +<p>我对于如何制作这些炫酷的 demo 一直很感兴趣,但是网上关于这方面的资料非常少,成体系的就更少了。</p> +<p>这里收录了一些比较经典的相关资料:</p> +<ol> +<li> +<p><a class="link" href="https://www.ctrl-alt-test.fr/2023/procedural-3d-mesh-generation-in-a-64kb-intro/" target="_blank" rel="noopener" +>64kb的demos</a>介绍了基于SDF(Signed Distance Field,有符号距离场)生成三维网格的方法,这个方法是大部分demo用于在三维场景中产生三维模型的主要方法。</p> +</li> +<li> +<p><a class="link" href="https://www.flipcode.com/archives/The_Art_of_Demomaking-Issue_01_Prologue.shtml" target="_blank" rel="noopener" +>The_Art_of_Demomaking</a>是一套很系统的教程,讲述Demo的概念、发展历史以及制作过程需要了解的基础知识。</p> +</li> +<li> +<p><a class="link" href="https://www.pbr-book.org/3ed-2018/contents" target="_blank" rel="noopener" +>pbr-book</a>是一本关于基于物理的渲染(Physically Based Rendering,简称PBR)的经典教材。内容包括计算机图形学相关的基础概念、渲染算法、工作流程和高级特性等。</p> +</li> +</ol> +<h3 id="怎样防止针对llm的prompt攻击">怎样防止针对LLM的prompt攻击</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/2023-05-24-09-52-09.png" +width="734" +height="401" +loading="lazy" +class="gallery-image" +data-flex-grow="183" +data-flex-basis="439px" +> +就像之前流行的sql注入攻击,针对大语言模型的提示语注入攻击现在变得也很常见。</p> +<p>一种比较典型的攻击场景是,通过一段特定的提示语,解锁chatGPT原本被封印的能力。</p> +<p>或者对于接入了其他工具接口的语言模型,通过特定的提示语让其执行危险操作(如:删除所有信息)。</p> +<p>这对于使用者来说可能危害不大,但对于服务的提供者是一个不小的挑战。</p> +<p><a class="link" href="https://simonwillison.net/2023/Apr/25/dual-llm-pattern/" target="_blank" rel="noopener" +>《用于构建可以抵抗即时注入的 AI 助手的双 LLM 模式》</a>提出了一种可能可行的解决方案。</p> +<p>即使用双模型的配置,协同工作,将具有执行危险操作的特权模型放在另一个模型后面,中间使用过滤器进行风险审查,即未被审查的内容永远不会发送到特权模型。</p> +<h2 id="资源">资源:</h2> +<ul> +<li><a class="link" href="https://gamma.app/" target="_blank" rel="noopener" +>gamma</a>,AI帮你做PPT。支持自然语言描述需要生成的内容,自动给出ppt的大纲和每页基本的排版布局; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/2023-05-24-10-00-52.png" +width="742" +height="687" +loading="lazy" +class="gallery-image" +data-flex-grow="108" +data-flex-basis="259px" +></li> +<li><a class="link" href="https://www.3blue1brown.com/" target="_blank" rel="noopener" +>3blue1brown</a>,YouTube上最好的数学科普视频,特点是使用动画直观展示计算原理; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-033-%E6%9C%9F/2023-05-24-10-01-29.png" +width="953" +height="611" +loading="lazy" +class="gallery-image" +data-flex-grow="155" +data-flex-basis="374px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 032 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/Tue, 16 May 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/<h1 id="机器文摘-第-032-期">机器文摘 第 032 期</h1> +<h2 id="长文">长文</h2> +<h3 id="ai歌手的训练与使用">AI歌手的训练与使用</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-14-33-53.png" +width="1011" +height="641" +loading="lazy" +class="gallery-image" +data-flex-grow="157" +data-flex-basis="378px" +> +最近火了很多AI歌手(即:用AI模型模仿某位歌手的声音),其中b站上AI孙燕姿演唱的《漠河舞厅》、《撒日朗》等歌曲播放已超百万。</p> +<p>为了研究实现原理,我也找到了开源工具体验了一下。</p> +<p>具体步骤主要总结如下:</p> +<ol> +<li>选定某一个歌手,找到具有代表性的几首歌曲,通过<a class="link" href="https://ultimatevocalremover.com/" target="_blank" rel="noopener" +>Ultimate Vocal Remover</a>软件利用AI做人声和伴奏的分离,主要用于获取干净的纯人声用于模型训练。(不得不说现在基于AI模型的人声、伴奏分离做的是真的强,可以做到非常干净的提取,让你感觉像是原始独立的音轨)。</li> +<li>通过安装<a class="link" href="https://github.com/voicepaw/so-vits-svc-fork" target="_blank" rel="noopener" +>so-vits-svc-fork</a>这个一体化开源工具进行模型训练,具体方法见<a class="link" href="https://github.com/voicepaw/so-vits-svc-fork/blob/main/README_zh_CN.md" target="_blank" rel="noopener" +>so-vits-svc-fork的Readme</a>,从数据预处理到最后的模型导出和推理都已经做好了,甚至还提供了图形界面。</li> +<li>继续使用so-vits-svc-fork提供的gui界面进行操作,将模型载入,将预期修改歌曲的原唱人声(提取方式同第1步)传入,运行推理获得定制的人声(注意看文档的各种参数)。</li> +<li>将第3步推理所得干净人声,跟原唱分离的干净背景音乐进行混音合成,即可获得一首新歌曲了。</li> +</ol> +<h3 id="怎样用口袋计算器玩耍">怎样用口袋计算器玩耍</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-14-49-14.png" +width="716" +height="514" +loading="lazy" +class="gallery-image" +data-flex-grow="139" +data-flex-basis="334px" +> +在移动互联网时代,人打发无聊的方式实在是太多了,视频聊天、阅读各种资讯八卦、观看短视频、手游等等。</p> +<p>功能机的时代,我有印象的打发无聊的事情是手机上的贪食蛇、发短信、wap资讯等等,也算不错了。</p> +<p>如果时间来到上世纪七十年代呢?那个时代的没有随身携带的手机,怎么打发时间?</p> +<p>答案是:如果有一个随身携带的计算器也行,这里有一本书<a class="link" href="https://archive.org/details/htewypc" target="_blank" rel="noopener" +>《How To Entertain With Your Pocket Calculator》</a>,出版于上世纪七十年代。书中花了大量的篇幅介绍了很多种基于数字的游戏,我翻看了一下,我觉得可能得无聊到一定的程度我才能愿意玩书里的游戏。</p> +<h3 id="llm的几篇介绍文章">LLM的几篇介绍文章</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-14-56-38.png" +width="703" +height="332" +loading="lazy" +class="gallery-image" +data-flex-grow="211" +data-flex-basis="508px" +> +Large Language Model (LLM) 即大规模语言模型,是一种基于深度学习的自然语言处理模型,它能够学习到自然语言的语法和语义,从而可以生成人类可读的文本。 +与其感叹以chatGPT为代表的大语言模型发展太快,不如静下心来,读一读关于LLM的一些基础知识和使用方法,我找了三篇比较有代表性的放在这里收藏。</p> +<ol> +<li><a class="link" href="https://github.com/RUCAIBox/LLMSurvey/blob/main/assets/LLM_Survey_Chinese_0418.pdf" target="_blank" rel="noopener" +>大语言模型综述</a>,认真地概括并解释了什么是LLM和它的基本原理。</li> +<li><a class="link" href="https://www.bmpi.dev/dev/deep-learning/nlp-language-models/" target="_blank" rel="noopener" +>ChatGPT背后的语言模型简史</a>,从发展历史上捋一捋各种语言模型的辈分。</li> +<li><a class="link" href="https://github.com/datawhalechina/prompt-engineering-for-developers" target="_blank" rel="noopener" +>prompt-engineering-for-developers</a>一个中文版的 Prompt Engineering 教程,翻译自:吴恩达《ChatGPT Prompt Engineering for Developers》课程,主要内容为指导开发者如何构建 Prompt 并基于 OpenAI API 构建新的、基于 LLM 的应用;</li> +<li><a class="link" href="https://github.com/ninehills/ninehills.github.io/issues/92" target="_blank" rel="noopener" +>大语言模型微调技术笔记</a>,记录了基于 LLM 进行微调训练的实战技巧。</li> +</ol> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://sinerider.com/" target="_blank" rel="noopener" +>sinerider</a>,一个很有创意的数学学习游戏,让你通过数学函数构建图像从而帮助画面中的角色到达目标地点。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-15-04-41.png" +width="810" +height="708" +loading="lazy" +class="gallery-image" +data-flex-grow="114" +data-flex-basis="274px" +></li> +<li><a class="link" href="https://anvaka.github.io/map-of-github/#0.87/0/16.7" target="_blank" rel="noopener" +>map-of-github</a>,以节点地图的方式展示Github上面超过40万个仓库,通过虚拟大陆的方式展示他们之间的关系。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-15-07-40.png" +width="1274" +height="682" +loading="lazy" +class="gallery-image" +data-flex-grow="186" +data-flex-basis="448px" +></li> +<li><a class="link" href="https://learngitbranching.js.org/?locale=zh_CN" target="_blank" rel="noopener" +>learngitbranching</a>,以交互式游戏的方式学习git命令。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-15-11-32.png" +width="569" +height="598" +loading="lazy" +class="gallery-image" +data-flex-grow="95" +data-flex-basis="228px" +></li> +<li><a class="link" href="https://vgamuseum.ru/" target="_blank" rel="noopener" +></a>,在线显卡博物馆,收藏了1982年到2012年之间发布的各款显卡,包括高清图片和规格参数的介绍; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-032-%E6%9C%9F/2023-05-16-15-14-37.png" +width="1364" +height="571" +loading="lazy" +class="gallery-image" +data-flex-grow="238" +data-flex-basis="573px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 031 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/Wed, 10 May 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/<h1 id="机器文摘-第-031-期">机器文摘 第 031 期</h1> +<h2 id="长文">长文</h2> +<h3 id="怎样驱动上个世纪的网络摄像头">怎样驱动上个世纪的网络摄像头</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-09-20-31.png" +width="697" +height="407" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="411px" +> +国外有个老哥,在帮朋友收拾废品的时候,获得了一个老旧的摄像头。</p> +<p>于是他按耐不住想感受一下,这个来自上个世纪的“古董”,还能打吗?</p> +<p>由于年代比较久远,厂家也不再提供驱动程序的更新。</p> +<p>哥们不得不在虚拟机里全新安装一个windows xp,成功启动摄像头,并获得“清晰图像”。</p> +<p>安装xp时有个插曲:安装界面里的进度条仅用时几十秒就走完了原本几十分钟的倒计时(所以说微软的进度条是如何推断剩余时间的永远是个迷)。</p> +<p>在经过一番体验之后,又跃跃欲试准备自己给它手搓一个在现代操作系统下的驱动程序。</p> +<p>整个过程记录在<a class="link" href="https://blog.benjojo.co.uk/post/quickcam-usb-userspace-driver" target="_blank" rel="noopener" +>《一个1999年的摄像头复活的故事》</a>。</p> +<p>整个故事都充满了一种“我不知道这么做有什么意义,但是我就是可以”的极客风格(也是我收录它的主要原因)。</p> +<h3 id="webgpu-科普">webGPU 科普</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-09-36-36.png" +width="673" +height="338" +loading="lazy" +class="gallery-image" +data-flex-grow="199" +data-flex-basis="477px" +> +最近谷歌浏览器率先宣布全面支持 webGPU ,预计到今年年底各大浏览器也都会跟进并提供支持。</p> +<p>webGPU 从名字上看跟显卡和浏览器有关,可是之前已经有webgl了,这次又有什么变化?</p> +<p>通过多方面信息的搜索,我得到的结论是:webGPU 更充分地暴露了显卡的计算能力,GPU不再只是做图形渲染相关的事情,而是根据webGPU提供的相关专业接口,可以执行深度学习之类的更通用的计算工作。</p> +<p>如果想了解的更全面一些,这篇<a class="link" href="https://cohost.org/mcc/post/1406157-i-want-to-talk-about-webgpu" target="_blank" rel="noopener" +>《谈谈 webGPU》</a>文章十分值得一读。</p> +<p>作者对 webGPU 这一技术介绍的比较详尽,从各个图形接口的发展历史一直到对未来如何应用的展望,都包括了。</p> +<h3 id="如何翻译一本书">如何翻译一本书</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-09-49-38.png" +width="709" +height="354" +loading="lazy" +class="gallery-image" +data-flex-grow="200" +data-flex-basis="480px" +> +<a class="link" href="https://sspai.com/post/79534" target="_blank" rel="noopener" +>《从不自量力到 AI 助力,我如何翻译完一整本英文书》</a> +这是一个关于执行力的故事。</p> +<p>主题是:如何借助AI和现代信息工具,实现看似不可能完成的任务。</p> +<p>在这个时代,个体的力量很渺小,因为个人几乎无法独立完成任何事情。</p> +<p>但同时,借助科技工具和基础设施的力量,1 个人甚至可以完成之前需要一个上百人公司才能做到的事情,这让个体变得非常强大。</p> +<h3 id="如何刷路由器">如何刷路由器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-00-09.png" +width="600" +height="417" +loading="lazy" +class="gallery-image" +data-flex-grow="143" +data-flex-basis="345px" +> +<a class="link" href="https://www.v2ex.com/" target="_blank" rel="noopener" +>V站</a>上说,中年技术男有三大爱好:钓鱼、NAS、软路由。</p> +<p><del>我一样也没沾边儿,但还是克制不住关注相关技术。</del></p> +<p>之前多次想拿自己家的路由器开刀,刷一个openwrt系统,然后就可以各种折腾(科学上网、内网穿透等等)了。</p> +<p>但是一直没有动手,今天看到这篇<a class="link" href="https://a-wing.top/linux/2023/05/01/start-openwrt" target="_blank" rel="noopener" +>自己动手定制你的路由器</a>写的如此详细,还是心动了一下。</p> +<p>先收藏吧。</p> +<h3 id="仅用csshtml实现三维动画">仅用CSS+HTML实现三维动画</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-06-52.png" +width="632" +height="161" +loading="lazy" +class="gallery-image" +data-flex-grow="392" +data-flex-basis="942px" +> +CSS 的 <code>translate3d</code>用到的不多。</p> +<p>如果使用巧妙的话,可以帮你实现很出彩的 3D 动画效果,国外有高手在给自己的文章配数学公式的时候,利用CSS制作了一些可以动态显示的公式图表。这篇<a class="link" href="https://x.st/spinning-diagrams-with-css/" target="_blank" rel="noopener" +>CSS 3D图表</a>记录了它们的实现细节和技术原理。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://www.window-swap.com/Window" target="_blank" rel="noopener" +>window-swap</a>,随机看别人家的窗外景色。这个网站每次刷新都随机显示一个网友共享的摄像头视角,一般是自家的窗外。可以随时体验全球各地的邻家风景。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-14-06.png" +width="1371" +height="929" +loading="lazy" +class="gallery-image" +data-flex-grow="147" +data-flex-basis="354px" +></li> +<li><a class="link" href="https://www.landiannews.com/archives/98512.html" target="_blank" rel="noopener" +>foobar2000</a>,经典的音乐播放器终于更新了。2002年发布的foobar2000播放器曾经是很多发烧友的最爱,如今过了20多年,居然更新了2.0稳定版,值得收藏; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-15-52.png" +width="743" +height="504" +loading="lazy" +class="gallery-image" +data-flex-grow="147" +data-flex-basis="353px" +></li> +<li><a class="link" href="https://lost-at-sql.therobinlord.com/" target="_blank" rel="noopener" +>lost-at-sql</a>,一个在线学习 sql 的交互游戏,通过游戏闯关的方式练习 sql 技能; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-18-25.png" +width="745" +height="484" +loading="lazy" +class="gallery-image" +data-flex-grow="153" +data-flex-basis="369px" +></li> +<li><a class="link" href="https://glsl-exercises.simondev.io/lesson/1/1#welcome" target="_blank" rel="noopener" +>glsl-exercises</a>,在线学习glsl的交互课程,通过交互式页面练习 glsl 编写; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-19-48.png" +width="1858" +height="794" +loading="lazy" +class="gallery-image" +data-flex-grow="234" +data-flex-basis="561px" +></li> +<li><a class="link" href="https://www.gameuidatabase.com/" target="_blank" rel="noopener" +>gameuidatabase</a>,一个游戏界面资源网站,各种游戏的界面截图,可以用来“借鉴”?; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-031-%E6%9C%9F/2023-05-10-10-20-48.png" +width="1078" +height="567" +loading="lazy" +class="gallery-image" +data-flex-grow="190" +data-flex-basis="456px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 030 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/Wed, 26 Apr 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/<h1 id="机器文摘-第-030-期">机器文摘 第 030 期</h1> +<p><em>下周五一假期,休息,不更新。</em></p> +<h2 id="长文">长文</h2> +<h3 id="内网穿透的原理及实现">内网穿透的原理及实现</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-09-42-27.png" +width="1040" +height="515" +loading="lazy" +class="gallery-image" +data-flex-grow="201" +data-flex-basis="484px" +></p> +<blockquote> +<p>设想这样一个问题:在北京和上海各有一台局域网的机器(例如一台是家里的台式机,一 台是连接到星巴克 WiFi 的笔记本),二者都是私网 IP 地址,但可以访问公网, 如何让这两台机器通信呢?</p> +</blockquote> +<p>IPv4地址即将枯竭,IPv6技术还没有普及,现在很多家庭宽带都不再分配公网IP地址。这就意味着大部分的个人电脑是无法通过互联网被直接访问的(当然,你可以通过你家wifi或者4G信号访问互联网,但是反过来不行)。</p> +<p>可是这种需求又真实存在,比如我就经常希望能够在任何地方访问我家里的电脑,通过远程桌面进行办公、文件共享等等。</p> +<p>最简单的方法是通过购买一台具有公网IP地址的云主机来实现中继,这也是目前最普遍的方式。</p> +<p>不过阅读完这篇<a class="link" href="https://arthurchiao.art/blog/how-nat-traversal-works-zh/" target="_blank" rel="noopener" +>《NAT 穿透是如何工作的:技术原理及企业级实践》</a>,假如你有很强的动手能力的话,就应该可以实现一套完全不需要公网主机进行中继的“企业级内网穿透工具”。</p> +<p>文章很长,来自<a class="link" href="https://tailscale.com/blog/how-nat-traversal-works/" target="_blank" rel="noopener" +>这篇英文博客</a>。</p> +<h3 id="技术写作指南">技术写作指南</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-09-53-51.png" +width="437" +height="205" +loading="lazy" +class="gallery-image" +data-flex-grow="213" +data-flex-basis="511px" +> +曾经在翻阅《程序员的数学》这本书的时候被朋友看到,于是诞生了短暂的讨论。</p> +<p>当时我的观点是,作为程序员一定要掌握好数学,即便现在编程过程中已经不怎么用到特别底层的知识,但也应该多训练数学思维。</p> +<p>朋友当时说了一句话让我记忆犹新。</p> +<p>“比起程序员的数学,我更担忧的是程序员的语文。”</p> +<p>确实,写作这项能力在很多技术人员心里是被低估的。</p> +<p>不少人受尽写技术文档的折磨,于是越发讨厌写作。</p> +<p>这篇<a class="link" href="https://www.yuque.com/serviceup/misc/cn-writing-for-engineers" target="_blank" rel="noopener" +>《作为工程师应该如何写作》</a>真是雪中送炭,总结了很多立即就能见效的技术写作方法,希望可以帮助到工程师朋友。</p> +<h3 id="怎样制作好玩的小游戏">怎样制作好玩的小游戏</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-09-57-29.png" +width="512" +height="512" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +> +很多人都有自己开发游戏的冲动。</p> +<p>不过很容易掉进各种复杂的引擎和工具的坑里。</p> +<p>然后感到沮丧,忘了想做游戏的初心。</p> +<p>这篇<a class="link" href="http://farawaytimes.blogspot.com/2023/02/how-to-make-good-small-games.html" target="_blank" rel="noopener" +>《怎样制作好玩的小游戏》</a>可以让你重新焕发精神。</p> +<p>作者认为开发那种不用复杂引擎的小游戏也可以很欢乐,只要有足够的游戏性。</p> +<p>他在文章中详细列举了想要制作出真正具有游戏性的小游戏所必须具备的几点关键特性。</p> +<p>看得出来,作者是懂游戏的。</p> +<h3 id="神奇的一页纸知识管理">神奇的一页纸知识管理</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-10-03-34.png" +width="1220" +height="841" +loading="lazy" +class="gallery-image" +data-flex-grow="145" +data-flex-basis="348px" +></p> +<blockquote> +<p>宇航员在太空中找到的方法一定不会错,因为他要是出错就没命了。 +航天员的秘密武器,One Pager。就是把一个专项的知识,都写和画在一页纸上。日积月累,宇航员有了一本手册,里面都是一页一页的one pager。 +我向来对知识管理的各种方法很有兴趣。</p> +</blockquote> +<p>在网上闲逛时看到这篇<a class="link" href="https://www.zhongwen.ai/fantastic-one-pager/" target="_blank" rel="noopener" +>《神奇的One Pager》</a>,讲述了一种通过一页纸进行知识管理的方法。</p> +<p>热爱学习的人可不能错过。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/chidiwilliams/buzz" target="_blank" rel="noopener" +>buzz</a>,Transcribe and translate audio offline on your personal computer. Powered by OpenAI&rsquo;s Whisper. +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-08-48-07.png" +width="827" +height="431" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="460px" +></li> +<li><a class="link" href="https://moonvy.com/apps/ops/" target="_blank" rel="noopener" +>可视化提示词拼装</a>,文生图的AI越来越多,自己也可以在本地搭建服务,可是为什么我自己生成的图片那么丑呢?这个工具也许可以帮你生成一些靠谱的提示词。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-08-50-22.png" +width="991" +height="418" +loading="lazy" +class="gallery-image" +data-flex-grow="237" +data-flex-basis="568px" +></li> +<li><a class="link" href="https://liaokong.gitbook.io/llm-kai-fa-jiao-cheng/" target="_blank" rel="noopener" +>LangChain 中文入门教程</a>,众所周知 OpenAI 的 API 无法联网的,所以如果只使用自己的功能实现联网搜索并给出回答、总结 PDF 文档、基于某个 Youtube 视频进行问答等等的功能肯定是无法实现的。所以,我们来介绍一个非常强大的第三方开源库:LangChain 。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-08-51-08.png" +width="1103" +height="493" +loading="lazy" +class="gallery-image" +data-flex-grow="223" +data-flex-basis="536px" +></li> +<li><a class="link" href="https://oimo.io/works/clock/" target="_blank" rel="noopener" +>clock</a>,一个非常酷的网页时钟显示效果。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-08-51-53.png" +width="999" +height="586" +loading="lazy" +class="gallery-image" +data-flex-grow="170" +data-flex-basis="409px" +></li> +<li><a class="link" href="https://webgpufundamentals.org/" target="_blank" rel="noopener" +>WebGPU 理论基础</a>,从基础理论开始学习WebGPU,稳! +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-030-%E6%9C%9F/2023-04-26-08-53-56.png" +width="688" +height="743" +loading="lazy" +class="gallery-image" +data-flex-grow="92" +data-flex-basis="222px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 029 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/Wed, 19 Apr 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/<h1 id="机器文摘-第-029-期">机器文摘 第 029 期</h1> +<h2 id="长文">长文</h2> +<h3 id="计算机的中断机制是如何实现的">计算机的“中断”机制是如何实现的?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-09-37-58.png" +width="1008" +height="682" +loading="lazy" +class="gallery-image" +data-flex-grow="147" +data-flex-basis="354px" +> +稍微了解过计算机原理的朋友都知道,计算机是通过“中断”的机制实现对键盘输入、鼠标移动、硬盘读写等操作的。</p> +<p>让我给小朋友讲解这些基本的知识时,我也可以侃侃而谈,说上半个小时不带重复。</p> +<p>但是真要解释“中断”的机制是如何实现的,我想即便是现在科班出身的本科生也未必能够说明白。</p> +<p>原因我觉得除了缺少实践之外,也跟大部分书上的理论内容离实际工程较远有关。</p> +<p>这篇<a class="link" href="https://r12f.com/posts/interrupts/" target="_blank" rel="noopener" +>漫谈中断</a>从实际的硬件实例(x86)出发,详细介绍了中断的实现机制,普及了“外部中断”、“内部中断”、“软中断”等概念,以及人们怎样通过“中断控制器”逐渐解决了多设备中断处理的问题。是一篇很值得阅读的科普文章。适合对计算机组成原理、操作系统等技术有兴趣的朋友阅读。</p> +<h3 id="怎样提升软件项目的可维护性">怎样提升软件项目的可维护性?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-09-54-43.png" +width="576" +height="242" +loading="lazy" +class="gallery-image" +data-flex-grow="238" +data-flex-basis="571px" +> +不同的项目团队对于软件项目的可维护性所做出的努力不同。</p> +<p>有不少团队宁愿在修改bug上加班加点,也不愿意为可维护性多花一丁点精力。</p> +<p>不过,如果你要开始一个新的软件项目或者想要改善一个已经存在的项目的可维护性。</p> +<p>这里有一份<a class="link" href="https://hix.dev/tutorials/general/software-project-checklist" target="_blank" rel="noopener" +>软件项目可维护性检查清单</a>可以参考。</p> +<p>作者主要从版本控制、软件测试、静态分析、依赖库管理、多语言支持、多平台支持、开发环境管理等方面给出了可以改进的行动清单,以及基于开源工具的最佳实践建议。</p> +<h3 id="怎样榨干chatgpt">怎样榨干chatGPT?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-06-59.png" +width="1024" +height="1024" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +> +ChatGPT是由OpenAI训练的一款大型语言模型,能够和你进行任何领域的对话。</p> +<p>现在跟年初账号紧张的情况比起来已经方便了很多。</p> +<p>在这么多开源工具和套壳网站的帮助下,我想现在大部分人都能够比较方便的体验它了吧。</p> +<p>但是可能很多人还不知道如何更好的发挥它的作用。</p> +<p>有网友整理了一份开源的<a class="link" href="https://github.com/PlexPt/awesome-chatgpt-prompts-zh" target="_blank" rel="noopener" +>chatGPT中文调教指南</a>,内容极为详尽,可以帮你榨干chatGPT的全部潜能。</p> +<h3 id="怎样让ai作画理解你的意图">怎样让AI作画理解你的意图?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-17-26.png" +width="1536" +height="512" +loading="lazy" +class="gallery-image" +data-flex-grow="300" +data-flex-basis="720px" +> +对于现在强大的AI绘图应用,有些人可能会认为只输入一个单词就能生成一张很酷的图片。</p> +<p>然而,虽然AI模型越来越善于理解我们想要的内容,但它们还不能读懂我们的思想。</p> +<p>因此,如果你想生成一张看起来像你所想的那样的图片,你需要编写正确的提示。</p> +<p>这个<a class="link" href="https://boostpixels.com/short-guide" target="_blank" rel="noopener" +>AI绘图prompt编写指南</a>可以给你提供一些帮助。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://zh.ifixit.com/Guide" target="_blank" rel="noopener" +>维修指南</a>,各种设备的维修教程大全,详细到每一个步骤的照片,设备型号齐全; +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-22-36.png" +width="977" +height="461" +loading="lazy" +class="gallery-image" +data-flex-grow="211" +data-flex-basis="508px" +></li> +<li><a class="link" href="https://shadertoy.com/view/msVXWD" target="_blank" rel="noopener" +>glsl-CNN</a>,有大神用glsl语言,仅通过webGL的片元着色器实现了一个手写识别的CNN神经网络。可以在浏览器直接体验,效果惊艳。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-31-02.png" +width="801" +height="479" +loading="lazy" +class="gallery-image" +data-flex-grow="167" +data-flex-basis="401px" +></li> +<li><a class="link" href="https://github.com/facebookresearch/dinov2" target="_blank" rel="noopener" +>dinov2</a>,Meta AI新发布的全能视觉模型,模型支持:图像分类、分割、图像检索和深度估计。比较厉害的地方在于它是一个自监督模型,直接从图像中学习特征,而不依赖文本描述,即可训练计算机视觉模型。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-31-37.png" +width="828" +height="236" +loading="lazy" +class="gallery-image" +data-flex-grow="350" +data-flex-basis="842px" +></li> +<li><a class="link" href="https://minigpt-4.github.io/" target="_blank" rel="noopener" +>minigpt-4</a>,GPT4 的图像支持迟迟不开放,这个开源的MiniGPT4 却已经做到了类似的多模态效果,官方演示看起来非常棒。只用了四张A100训练了10小时,模型甚至只有13B。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-33-47.png" +width="1289" +height="1484" +loading="lazy" +class="gallery-image" +data-flex-grow="86" +data-flex-basis="208px" +></li> +<li><a class="link" href="https://github.com/linyiLYi/street-fighter-ai" target="_blank" rel="noopener" +>street-fighter-ai</a>,有个B站UP主在GPT的帮助下, 写了个 强化训练的AI模型,终于打败了街霸里的 AI,实现了儿时的梦想。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-029-%E6%9C%9F/2023-04-19-10-36-53.png" +width="1080" +height="760" +loading="lazy" +class="gallery-image" +data-flex-grow="142" +data-flex-basis="341px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 027 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/Wed, 12 Apr 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/<h1 id="机器文摘-第-027-期">机器文摘 第 027 期</h1> +<h2 id="长文">长文</h2> +<h3 id="搭建本地ai作图应用">搭建本地AI作图应用</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-13-51-53.png" +width="695" +height="392" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="425px" +> +AI对话机器人火爆的同时,去年由Stable-Diffusion模型引爆的AI作图技术也没有放慢进化的脚步。</p> +<p>这里面的佼佼者<a class="link" href="https://zh.wikipedia.org/zh-cn/Midjourney" target="_blank" rel="noopener" +>Midjourney</a>已经发展成了强大的图像生成系统。可以轻松定制出照片级图像,其效果足以乱真。</p> +<p>不过目前在国内使用Midjourney还比较麻烦,即便能够访问,使用量也会受限制,能否自己搭建一个呢?</p> +<p>答案是肯定的。</p> +<p>跟去年刚问世的时候不同,现在基于Stable-Diffusion模型的生态也已经十分完备,很多开源软件、框架、插件围绕这个模型开发。</p> +<p>利用这些软件可以快速在本地计算机上构建一套属于自己的图像生成服务。</p> +<p>这里有一篇博客以<a class="link" href="https://www.freedidi.com/8474.html" target="_blank" rel="noopener" +>手把手的方式教你如何在最快速的时间搭建自己的图像生成服务</a>。</p> +<p>里面还列举了一些微调好的定制模型下载地址,合理的使用这些模型,你会发现打开新世界的大门。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-14-02-07.png" +width="733" +height="799" +loading="lazy" +class="gallery-image" +data-flex-grow="91" +data-flex-basis="220px" +></p> +<h3 id="搭建本地chatgpt应用">搭建本地chatGPT应用</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-14-08-25.png" +width="779" +height="342" +loading="lazy" +class="gallery-image" +data-flex-grow="227" +data-flex-basis="546px" +> +本来不想再提chatGPT了,因为最近说的有些太多了。</p> +<p>但是无奈当前的开源生态对于语言模型是在是太追捧了,技术发展迅雷不及掩耳。</p> +<p>很快就出现了一批可以自己搭建的AI对话模型。</p> +<p>今天我挑两个我认为效果比较好的(且对中文支持比较好的)介绍一下。</p> +<p>注意,跟目前流行的基于OpenAI的接口进行套壳的程序不同。我说的是完全在本地搭建自己的服务。</p> +<p>第一个:<a class="link" href="https://chatglm.cn/blog" target="_blank" rel="noopener" +>ChatGLM-6B</a>,一个具有62亿参数的中英双语语言模型。通过使用与 ChatGLM(chatglm.cn)相同的技术,ChatGLM-6B 初具中文问答和对话功能,并支持在单张 2080Ti 上进行推理使用。</p> +<p>搭建过程比较简单,按照<a class="link" href="https://github.com/THUDM/ChatGLM-6B/blob/main/README.md" target="_blank" rel="noopener" +>README</a>文档中的步骤下载模型、执行脚本程序即可。</p> +<p>第二个:<a class="link" href="https://github.com/ymcui/Chinese-LLaMA-Alpaca" target="_blank" rel="noopener" +>中文 LLaMA &amp; Alpaca 大模型</a>,开源了中文LLaMA模型和经过指令精调的Alpaca大模型。这些模型在原版LLaMA的基础上扩充了中文词表并使用了中文数据进行二次预训练,进一步提升了中文基础语义理解能力。同时,在中文LLaMA的基础上,本项目使用了中文指令数据进行指令精调,显著提升了模型对指令的理解和执行能力。</p> +<p>搭建过程略微繁琐一些,需要通过自己的手段下载到开源的LLaMA原始模型(当然这对于技术人员来说不是问题)。</p> +<p>然后按照文档中的教程,执行模型合并、量化等脚本,最终通过开源程序LLaMA.cpp实现模型的本地运行。</p> +<h3 id="合作运行千亿参数级语言模型">合作运行千亿参数级语言模型</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-14-22-47.png" +width="492" +height="214" +loading="lazy" +class="gallery-image" +data-flex-grow="229" +data-flex-basis="551px" +> +按照众人划桨开大船的思路,之前在带宽不足的年代诞生了BT下载。</p> +<p>如今,当我们的本地显卡无法应付超大AI模型时,有人开始用同样的思路解决问题。</p> +<p><a class="link" href="https://petals.ml/" target="_blank" rel="noopener" +>Petals</a>就是这么一个分布式模型微调、运行的框架,可以让你轻松在家运行超过千亿参数的大模型(当然是在线跟大家一起协作)。</p> +<p>其原理是大家分别加载模型的一小部分,然后与其他人一起通过协同的方式进行推理或者微调。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-14-27-18.png" +width="1742" +height="680" +loading="lazy" +class="gallery-image" +data-flex-grow="256" +data-flex-basis="614px" +></p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://learningprompt.wiki/" target="_blank" rel="noopener" +>Prompt Engineering 教程</a>,一份教你如何更好使好地使用 ChatGPT 和其他 AI 产品的免费教程。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-14-43-13.png" +width="970" +height="466" +loading="lazy" +class="gallery-image" +data-flex-grow="208" +data-flex-basis="499px" +></li> +<li><a class="link" href="https://prompthero.com/" target="_blank" rel="noopener" +>Prompthero</a>,跟聊天机器人、绘图机器人交流的prompt大全,与上面的教程不同,这是一个模板库大全,有创作灵感但是不知道该如何描述的时候可以去参考一下。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-027-%E6%9C%9F/2023-04-04-14-45-46.png" +width="759" +height="381" +loading="lazy" +class="gallery-image" +data-flex-grow="199" +data-flex-basis="478px" +></li> +<li><a class="link" href="https://civitai.com/" target="_blank" rel="noopener" +>Civitai</a>,与上面相同,不过专门用于图像生成,而且路子比较野,有大量的NSFW内容,要搭配Stable-Diffusion的各种微调模型使用。具体使用方法,可参考前文中介绍如何搭建本地图像生成服务的部分。</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 028 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/Wed, 12 Apr 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/<h1 id="机器文摘-第-028-期">机器文摘 第 028 期</h1> +<h2 id="长文">长文</h2> +<h3 id="极简代码理解-gpt-模型结构">极简代码理解 GPT 模型结构</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-09-37-14.png" +width="679" +height="607" +loading="lazy" +class="gallery-image" +data-flex-grow="111" +data-flex-basis="268px" +> +在<a class="link" href="https://twitter.com/karpathy/status/1645115622517542913" target="_blank" rel="noopener" +>twitter上有网友发布了一个简单的示例代码</a>,讲解了 GPT 语言模型的运行原理,为了方便大家理解,作者用了极简的模型设置,即语言文字只保留了1和0两个字符,上下文长度也仅为3,可以很直观地感受到训练过程是如何起作用的。</p> +<p>作者<a class="link" href="https://colab.research.google.com/drive/1SiF0KZJp75rUeetKOWqpsA8clmHP6jMg?usp=sharing" target="_blank" rel="noopener" +>提供了托管在colab的python源码</a>,可以在线体验。</p> +<h3 id="用开源语言模型训练自己的数字化身">用开源语言模型训练自己的数字化身</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-09-38-57.png" +width="623" +height="364" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="410px" +> +随着开源语言模型的训练和微调变得越来越简单,果然有人开始整活。</p> +<p>已经有网友<a class="link" href="https://greatdk.com/1908.html" target="_blank" rel="noopener" +>通过自己的微信聊天记录和博客文章训练出有自己风格的AI</a>。</p> +<p>作者使用目前对中文支持最好的开源模型 chatglm-6b 作为预训练模型(我上期介绍过它的部署和使用)。</p> +<p>经过一番折腾后终于训练出还算凑合的模型。</p> +<p>我们的世界离<a class="link" href="https://movie.douban.com/subject/11502153/episode/1/" target="_blank" rel="noopener" +>《黑镜》中的黑暗故事</a>越来越近了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-09-49-17.png" +width="1024" +height="576" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></p> +<h3 id="四十年工作经验程序员的职业建议">四十年工作经验程序员的职业建议</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-09-50-49.png" +width="700" +height="420" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="400px" +> +国外有位“老程序员”退休了,是真正的到了退休年龄的退休。</p> +<p>他从1981年入行,直到去年退休。这期间他做过各种开发,跳过槽也被辞退过,打过工也创过业。</p> +<p>这不容易。</p> +<p>所以,他决定<a class="link" href="https://thecodist.com/how-i-stayed-relevant-over-four-decades/" target="_blank" rel="noopener" +>以“一个退休程序员”的身份分享一些心得</a>。</p> +<p>摘抄部分要点如下:</p> +<blockquote> +<p>保持开阔的眼界:每天花时间获取真正的资讯,看到趋势,在事物流行起来之前发现他们。 +保持学习:不要拒绝和敌视新技术,要为你所用。 +要有自己的项目(做一些真正的事情):作为程序员不要浪费聪明才智和外部资源,要学着开始一个自己的项目。</p> +</blockquote> +<h3 id="进入心流的入口">进入心流的入口</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-10-08-18.png" +width="660" +height="379" +loading="lazy" +class="gallery-image" +data-flex-grow="174" +data-flex-basis="417px" +> +进入心流(Flow)状态是一种很忘我的体验,也是知识工作者高效产出的必要条件。</p> +<p>有不少创作者都体会过那种全身心的投入并且忘记了时间的感觉。</p> +<p>一旦进入那种状态,很多问题能够很快得到解决,大脑飞速运转并且不会感觉到劳累。</p> +<p>这种状态最忌讳被打断,因为一旦打断,再进入就会比较困难。</p> +<p>这里有篇文章介绍了一些小技巧,可以让你在不得已中断心流之后,能够比较快速地恢复状态。</p> +<p>作者将这些技巧比喻为高速服务区进入主路之前的加速匝道,姑且称为<a class="link" href="https://census.dev/blog/an-on-ramp-to-flow" target="_blank" rel="noopener" +>进入心流的入口</a>。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://spline.design/" target="_blank" rel="noopener" +>Spline</a>,一个免费易用的 3D 设计工具,可实时协作,提供了丰富的物料库,可以基于它来快速创建有趣的 3D 场景,支持处理细腻动画交互,此外还可以导入本地模型和声音素材,支持到处多种输出格式包括WebGL、视频、链接等,很适合新手。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-10-19-26.png" +width="986" +height="536" +loading="lazy" +class="gallery-image" +data-flex-grow="183" +data-flex-basis="441px" +></li> +<li><a class="link" href="https://codepen.io/ksenia-k/pen/poOMpzx" target="_blank" rel="noopener" +>Draw With Flowers!</a>,在threejs里用着色器语言编写的一个特效demo,可以随着鼠标移动绘制绚丽的花朵。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-10-19-52.png" +width="828" +height="466" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></li> +<li><a class="link" href="https://github.com/numbbbbb/read-react-source-code" target="_blank" rel="noopener" +>React 源码阅读</a>,一本开源电子书,通过阅读React的源码来详细理解前端框架的原理。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-10-20-26.png" +width="591" +height="369" +loading="lazy" +class="gallery-image" +data-flex-grow="160" +data-flex-basis="384px" +></li> +<li><a class="link" href="https://codeium.com/download" target="_blank" rel="noopener" +>Codeium</a>,Github copilot 的免费平替,提供vscode、vim、neovim等常见编辑器的插件,我试了一下,效果可以接受。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-028-%E6%9C%9F/2023-04-12-10-21-52.png" +width="1024" +height="586" +loading="lazy" +class="gallery-image" +data-flex-grow="174" +data-flex-basis="419px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 026 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/Wed, 29 Mar 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/<h1 id="机器文摘-第-026-期">机器文摘 第 026 期</h1> +<h2 id="长文">长文</h2> +<h3 id="通用人工智能要来了吗">通用人工智能要来了吗</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-09-37-08.png" +width="854" +height="476" +loading="lazy" +class="gallery-image" +data-flex-grow="179" +data-flex-basis="430px" +> +AGI(通用人工智能),即用一个模型解决全部问题,而不是特定领域的问题(如语音识别、图像分类等)。</p> +<p>我在几年前读过一本叫做《人工智能,人类最后的发明》的书。</p> +<p>书里说AGI就是人类最后一个发明,因为有了它,别的一切都不需要了。</p> +<p>当时感觉距离通用的人工智能还很遥远,觉得作者有些危言耸听。</p> +<p>直到今年,chatGPT和GPT-4的发布,我才发觉AI的势头确实有些猛得出乎意料。</p> +<p><a class="link" href="https://orangeblog.notion.site/GPT-4-8fc50010291d47efb92cbbd668c8c893" target="_blank" rel="noopener" +>《 GPT-4 ,人类迈向AGI的第一步》</a>是一篇<a class="link" href="https://arxiv.org/pdf/2303.12712v1.pdf" target="_blank" rel="noopener" +>近期论文</a>的翻译,该论文由微软研究院发布,论证了当前的 GPT-4 模型已经初步具有 AGI 的苗头。</p> +<p>论文内容十分详实,看完很震撼。</p> +<p>摘录部分文字如下:</p> +<blockquote> +<blockquote> +<p><strong>对话</strong> +&gt; 马克:我不喜欢你昨天晚上对待杰克的方式 +&gt; 朱迪:你看到他在做什么了吗?他打了他哥哥的头! +&gt; 马克:这并不能成为你对他大喊大叫的理由 +&gt; 朱迪:你想让我怎么做?让他打他的弟弟,然后什么都不说? +&gt; 马克:不,我不同意 +&gt; 朱迪:那你为什么要为他辩护? +<strong>提问:马克的意图似乎是什么?</strong> +GPT4: 马克的意图似乎是要表达他对朱迪处理与杰克关系的方式的不满,并建议她可以更加冷静和尊重。 +ChatGPT:根据谈话内容,马克的意图似乎是为杰克的行为辩护,并表达他对朱迪对待杰克的不满。 +<strong>提问:朱迪如何看待汤姆的回应?</strong> +GPT4: 朱迪认为他的评论是对她的分析能力的攻击,也是对杰克的不当行为表示同情的表现。她的反应是防御性的和愤怒的,并质疑马克的动机。 +ChatGPT:如果没有更多的文字,我不可能准确判断朱迪是如何接受马克的评论的。然而,根据朱迪的回应,她似乎并不同意马克的观点,而且可能对他为杰克的行为辩护感到沮丧。</p> +</blockquote> +</blockquote> +<h3 id="用-gpt-4-帮你编写一个游戏">用 GPT-4 帮你编写一个游戏</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-02-56.png" +width="717" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="212" +data-flex-basis="510px" +> +我第一次见识到 ChaptGPT 的编程能力之后,就基本离不开这个工具了。</p> +<p>现在我几乎每天都在它的辅助下编写代码。</p> +<p>不过,这里有个老哥更过分。</p> +<p>他让 <a class="link" href="https://twitter-thread.com/t/1637592014446551040" target="_blank" rel="noopener" +>GPT-4 模型帮他做出了一个3D太空赛跑游戏</a>。</p> +<p>作者本身没有游戏编程经验也不懂Javascript,但是通过跟模型一点一点对话,反复将调试代码生成的错误信息反馈给模型,逐渐完成了一个完成度还挺高的游戏。</p> +<h3 id="搭建基于私域数据的chatgpt">搭建基于私域数据的ChatGPT</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-12-24.png" +width="776" +height="438" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="425px" +> +ChatGPT 超强的对话能力怎样应用到私有数据上?</p> +<p>比如说我希望做出一个基于 ChatGPT 模型的专属客服,要吃透我的产品信息。</p> +<p>官方提供的训练API和微调(fine tuning)指导相对复杂一些,对于AI模型的微调不熟悉的人员还不够友好。</p> +<p>这里有一篇“零基础”教程<a class="link" href="https://mp.weixin.qq.com/s/naiVMuXHAScRb_jSEJN3zg" target="_blank" rel="noopener" +>《搭建基于私域数据的ChatGPT》</a>,可以带你走一下流程,感受一下定制专属模型的步骤。</p> +<h3 id="ai令人焦虑">AI令人焦虑</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-21-37.png" +width="609" +height="859" +loading="lazy" +class="gallery-image" +data-flex-grow="70" +data-flex-basis="170px" +> +这篇<a class="link" href="https://mp.weixin.qq.com/s/7H1FrwbQvsh0HD9z90L0wg" target="_blank" rel="noopener" +>《AI狂飙的时代,人还有价值吗?》</a>是一期语音播客的文字转译,因为内容比较精彩,所以也收录在这里了。</p> +<blockquote> +<p>我觉得取代不是一个好的词儿,因为取代是一个非常容易反驳的词儿。我可以说我仍然会干什么什么,AI干不了,所以它取代不了我。 +但正是这种字面上的抬杠,使得问题的本质被掩盖了,因为AI在人的生活中的渗透是一个逐渐的过程。 +百分之百地取代你可能仍然不会发生,可是它也不需要百分之百的取代掉你,只要50%的取代掉你的某些工作职能,AI就会对就业市场形成非常大的冲击。 +我有一个纽约的律师朋友,他是很早就开始用这个东西。 +他本身不是一个技术人员,他是一个标准的文科生,平常的用一个新软件都要紧张半天的那种人。 +但是他开始用这个之后,因为律师的工作是很大程度上是依赖于文本的,而文本是GPT的长项,所以他就开始用。 +之后,我就问他说,所以你真的开始辞退你的员工了吗?因为他自己是一个律所合伙人。 +他说我还没有真正开始辞退任何人,但是我确实打算今年暑假不用再招实习生了,因为给我省下的活完全可以让我腾出手来做一些事,以至于我可以省下招一个实习生的AD account。 +这就是一个真实的影响对不对? +它没有真正取代什么东西,但是它仍然冲击了一个真实的就业市场上的职位。</p> +<p>我觉得AI对我们社会的影响会以这种方式出现,它不会马上一下子让你这个人变得没有意义,但是它可以让三个人的活,两个人现在能干完,多出来那个人就没有存在的必要了,所以老板就可以把他开掉。 +它并不是百分之百取代的人的方式来逐渐进行的,而且这个事情是非常真实的。这也是为什么我觉得很多人对冲击仍然没有做好心理上和事实上的准备。 +其实有点令人忧虑的原因就是,如果你今天还用一种这东西,都是媒体的炒作来对待这个问题,你就很可能会在真正的影响你切身生活的冲击到来之前,没有做好对自己来说比较有用的帮助。</p> +</blockquote> +<p>读完这篇文章,我的感受是,没必要焦虑,不是AI没有威胁,而是焦虑也没用,蒸汽机车发明之后,超越马车就只剩下时间问题了。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://greasyfork.org/zh-CN/scripts/445751-unlimited-downloader" target="_blank" rel="noopener" +>无限制下载器,只要能播放就能下载</a>,能够帮助下载视频网站内容的浏览器插件很多,大部分都是通过嗅探播放地址来实现的下载,网站也会采用各种加密手段来进行阻止。但是这个油猴脚本采用了另一种思路。你网站防再死不能不让观众看吧?脚本几乎采用了类似录屏的手段来进行视频下载。对于一些实在想要下载的内容,可以考虑试试这个插件。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-34-53.png" +width="640" +height="400" +loading="lazy" +class="gallery-image" +data-flex-grow="160" +data-flex-basis="384px" +></li> +<li><a class="link" href="https://github.com/cocktailpeanut/dalai" target="_blank" rel="noopener" +>帮你本地运行 LLaMA 模型</a>,只需一行命令就可以让你在本地运行 <a class="link" href="https://github.com/ggerganov/llama.cpp" target="_blank" rel="noopener" +>LLaMA</a> 模型,轻松感受在本地单机上运行大规模语言模型的魅力。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-40-09.png" +width="1920" +height="1080" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></li> +<li><a class="link" href="https://github.com/lxe/simple-llama-finetuner" target="_blank" rel="noopener" +>微调 LLaMa 模型的工具</a>,既然都能在本地运行了,那就再给力一些,这个工具可以让你很方便地使用自己的数据训练 LLaMA 模型。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-42-04.png" +width="1013" +height="898" +loading="lazy" +class="gallery-image" +data-flex-grow="112" +data-flex-basis="270px" +></li> +<li><a class="link" href="https://github.com/Haxxnet/Compose-Examples" target="_blank" rel="noopener" +>Docker Compose 容器组合最佳实践</a>,Docker有多好用不用再说了吧,这里有一堆使用Docker Compose编排容器的模板,收录了很多十分有用的容器镜像组合,可方便快速的搭建各种业务(如:单点登录、VPN、媒体管理、文件共享、博客、维基、社交网站、项目管理等)。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-026-%E6%9C%9F/2023-03-29-10-46-53.png" +width="802" +height="445" +loading="lazy" +class="gallery-image" +data-flex-grow="180" +data-flex-basis="432px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 025 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/Wed, 22 Mar 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/<h1 id="机器文摘-第-025-期">机器文摘 第 025 期</h1> +<h2 id="长文">长文</h2> +<h3 id="252个字节实现播放音乐和动画">252个字节实现播放音乐和动画</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-10-25-42.png" +width="915" +height="478" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="459px" +> +这里有个网页介绍了一个demo作者使用一段JavaScript代码实现了一个<a class="link" href="http://www.p01.org/256b_tetris_theme/" target="_blank" rel="noopener" +>一边播放俄罗斯方块背景音乐一边播放字符动画的网页</a>,原理是利用HTML5的AudioContext对象进行声音合成,通过定时器触发基于当前时间t值的不同频率,实现音乐播放。具体代码如下:</p> +<div class="highlight"><div class="chroma"> +<table class="lntable"><tr><td class="lntd"> +<pre tabindex="0" class="chroma"><code><span class="lnt">1 +</span></code></pre></td> +<td class="lntd"> +<pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="o">&lt;</span><span class="nx">body</span> <span class="nx">onclick</span><span class="o">=</span><span class="s2">&#34;with(new AudioContext)with(o=createOscillator())connect(destination),start(setInterval(v=&gt;innerHTML=&#39;TETЯIS&amp;#&#39;+(9624|(o.frequency.value=`RR&gt;AIIA&gt;777${d=&#39;ARRIA&gt;&gt;&gt;AIIRRAA7777&#39;}IIIWnnbWRRR${d}`.charCodeAt(++t%58)*4)%7)+&#39;P01&#39;,t=232))&#34;</span><span class="o">&gt;</span><span class="nx">click</span> +</span></span></code></pre></td></tr></table> +</div> +</div><h3 id="诺基亚发布的可维修手机">诺基亚发布的“可维修”手机</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-10-35-52.png" +width="614" +height="369" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="399px" +> +说到诺基亚,用过的朋友第一个映入脑海的词就是“砸核桃”。</p> +<p>那是iPhone还没发布的非智能手机年代。</p> +<p>手机可更换电池和外壳在那时是一个标准设计,谁要是不支持这些都不好意思跟人打招呼。</p> +<p>那时我经常把我的诺基亚掉在地上摔得七零八落,然后淡定地捡起来像电影里特工拼装自己的手枪那样,一个个把零件组装起来,形成“一把”手机。</p> +<p>或者等手机快要没电的时候,像换弹匣那样给手机换一块电池,立马满血复活。</p> +<p>这样的日子自从iPhone发布之后就再也没有了。</p> +<p><a class="link" href="https://www.theguardian.com/technology/2023/feb/25/nokia-launches-diy-repairable-budget-android-phone" target="_blank" rel="noopener" +>诺基亚近期发布了一款手机</a>,再次让我想起我那掉地上摔开几瓣的手机。这款手机号称具有良好的“可维修”性,普通用户也可一个人在家轻松拆卸。可以自行更换包括电池、屏幕、充电端口等零件。</p> +<h3 id="不要重复自己是编程的好原则吗">不要重复自己是编程的好原则吗</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-10-50-45.png" +width="650" +height="346" +loading="lazy" +class="gallery-image" +data-flex-grow="187" +data-flex-basis="450px" +> +不要重复自己,永远不要从头开始重写代码!</p> +<p>这是很多程序员收到的忠告。</p> +<p>然而它是绝对正确的吗?</p> +<p>这里有篇文章<a class="link" href="https://programmingisterrible.com/post/176657481103/repeat-yourself-do-more-than-one-thing-and" target="_blank" rel="noopener" +>《重复自己,重写一切》</a>,作者在文章中探讨了编程中的一些习惯,他认为这些习惯可以使代码变得更难理解、更难维护,并可能导致代码的冗长和不必要的复杂性。文章提到了重写代码可以给程序带来更好的抽象和可维护性,所以建议定期通过重新写代码的方式重构你的程序。</p> +<p>说实话,我不知道作者是怎样看待所谓“屎山”代码的,也许当他面对有些代码时,他的观点也会变为:“能跑的代码,就尽量别动它了”。</p> +<h3 id="慢下来">慢下来</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-10-59-28.png" +width="587" +height="205" +loading="lazy" +class="gallery-image" +data-flex-grow="286" +data-flex-basis="687px" +> +这篇文章的题目是<a class="link" href="https://sive.rs/slow" target="_blank" rel="noopener" +>“慢下来”</a>,作者是Derek Sivers,一位创业者、作家和音乐家。在这篇文章中,他分享了自己对于“慢下来”这个主题的一些思考和感悟。</p> +<p>虽然是个急性子,但是我很认同文章里的观点。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://www.macpierce.com/the-camera-shy-hoodie" target="_blank" rel="noopener" +>反跟踪识别的套件</a>,如果你觉得被公共场所的摄像头拍摄和记录或者识别侵犯了你的隐私,这里有一套开源的穿戴套件可以考虑。它通过在身上穿戴可以发射红外线的LED设备,使得摄像头画面过曝。以获得保护隐私的效果。不过仅用于研究,不知道是否符合有些国家的法律法规。网站提供了配件清单和详细的装配说明(pdf)供下载。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-11-05-16.png" +width="1203" +height="583" +loading="lazy" +class="gallery-image" +data-flex-grow="206" +data-flex-basis="495px" +></li> +<li><a class="link" href="https://whatdoesthiscodedo.com/" target="_blank" rel="noopener" +>AI帮你解释一段代码</a>,有人使用openai的开发接口提供了一个专门帮人们解释代码执行的工具,输入代码,输出解释。并提供vscode的插件。我把文章开头那段播放音乐的Javascript代码发给他让他解释,效果如下图: +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-11-09-51.png" +width="625" +height="740" +loading="lazy" +class="gallery-image" +data-flex-grow="84" +data-flex-basis="202px" +></li> +<li><a class="link" href="https://xenova.github.io/transformers.js/" target="_blank" rel="noopener" +>在网页中运行GPT模型</a>,一个可以在浏览器中执行Transformer模型的开源程序,可以执行轻量的模型,实现如翻译、语音转文字、图像转文字等任务。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-11-12-45.png" +width="1239" +height="519" +loading="lazy" +class="gallery-image" +data-flex-grow="238" +data-flex-basis="572px" +></li> +<li><a class="link" href="https://aitxt.io" target="_blank" rel="noopener" +>AI生成工具箱</a>,近期,基于chatGPT模型的应用大爆发,这里有一个整理好的工具箱,可以使用ai做很多内容生成工作,包括帮你编写周报、润色文字、写道歉信、写外卖好评等,效果还不错。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-025-%E6%9C%9F/2023-03-22-11-15-00.png" +width="1033" +height="530" +loading="lazy" +class="gallery-image" +data-flex-grow="194" +data-flex-basis="467px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 024 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/Wed, 15 Mar 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/<h1 id="机器文摘-第-024-期">机器文摘 第 024 期</h1> +<h2 id="长文">长文</h2> +<h3 id="电池充一次可以用两年的笔记本电脑">电池充一次可以用两年的“笔记本”电脑</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-09-18-01.png" +width="830" +height="467" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +> +挪威软件开发商安德烈亚斯·埃里克森(Andreas Eriksen)组装了一款笔记本电脑(或者说便携膝上型电脑?)。</p> +<p>它拥有“以年为单位的电池寿命”,并且使用用Lisp编程系统界面,产品名为:<a class="link" href="https://www.hackster.io/news/andreas-eriksen-s-potatop-is-a-lisp-powered-laptop-with-a-battery-life-measured-in-years-2f5d79653f24" target="_blank" rel="noopener" +>PotatoP</a>。</p> +<p>CPU好像是个ARM架构的低功耗单核处理器,最高频率96MHz。</p> +<p>支持蓝牙5.0。</p> +<p>运行的系统为PotatOS,一个基于<a class="link" href="http://www.ulisp.com/" target="_blank" rel="noopener" +>uLisp</a>(一个专门为微控制器设计的Lisp)移植的专用系统。</p> +<p>使用的4.4英寸显示屏采用介于LCD和墨水屏之间的技术,省电。</p> +<p>再加上机身上还带有太阳能电池,据说如果环境光充足的话,可以连续运行两年。</p> +<h3 id="详解-amd-为-steam-deck-开发的-apu">详解 AMD 为 Steam Deck 开发的 APU</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-09-32-20.png" +width="671" +height="272" +loading="lazy" +class="gallery-image" +data-flex-grow="246" +data-flex-basis="592px" +> +Steam Deck 无疑是一款革命性的掌机。</p> +<p>如果不是价格在国内被炒的离谱,我定会入手一台,也许再观望一下等待第二代或者三代产品更好。</p> +<p>这款掌机使得在便携设备上游玩3A大作不再是幻想。</p> +<p>取得这样的表现,除了得益于V厂魔改的Linux系统之外,还离不开这块由AMD定制的、代号“梵高”的 APU。</p> +<p>这篇<a class="link" href="https://chipsandcheese.com/2023/03/05/van-gogh-amds-steam-deck-apu/" target="_blank" rel="noopener" +>《“梵高”AMD的Steam Deck APU》</a>详细介绍了这块APU的各种技术细节,解释了为什么Steam Deck可以做到低功耗的同时还拥有相当给力的图形性能。</p> +<h3 id="用磁盘阵列raid确保数据安全靠谱吗">用磁盘阵列(RAID)确保数据安全靠谱吗?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-09-45-46.png" +width="477" +height="250" +loading="lazy" +class="gallery-image" +data-flex-grow="190" +data-flex-basis="457px" +> +再谈谈 NAS 的事情(中年技术男的三大爱好之一)。</p> +<p>像我这样的人,对于 RAID 磁盘阵列总是抱有美好的幻想。我们认为,只要将数据存放在经过合理规划的磁盘阵列中(例如 RAID 5),我们就可以高枕无忧,确保数据永远不会丢失。然而,实际上,磁盘阵列并不是备份数据的最佳选择,最佳的数据安全策略是异地多份存储。</p> +<p>尽管 RAID 5 宣称随便损坏一块硬盘也不要紧,只需更换一块正常盘即可,但这种理想状态可能不太容易实现,中间随时可能会出现其他状况导致数据永久丢失。</p> +<p>一篇名为<a class="link" href="https://www.ucmadscientist.com/almost-lost-it-all-again/" target="_blank" rel="noopener" +>《差点儿就又全没了》</a>的博文,讲述了作者在使用 NAS 磁盘阵列时经历了一次惊险刺激的数据拯救过程。希望这篇文章能够给计划使用类似方式保存数据的朋友们一个平常心态。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://pubby.games/nesfab.html" target="_blank" rel="noopener" +>NESFab</a>,一个专为开发任天堂8位游戏机(NES、FC)设计的编程语言。具有高性能、易于装载资源、自动内存地址切换等特性,作者还在主页提供了一个使用NESFab开发游戏的教程。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-10-10-50.png" +width="490" +height="169" +loading="lazy" +class="gallery-image" +data-flex-grow="289" +data-flex-basis="695px" +></li> +<li><a class="link" href="https://github.com/AstroNvim/AstroNvim" target="_blank" rel="noopener" +>AstroNvim</a>,一套即开即用的Nvim配置文件,主打界面美观,集成了文件浏览、代码补全、语法高亮、模糊查询、可视化调试等常用插件配置。对于新手和懒得折腾的人来说,可以尝试。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-10-13-25.png" +width="814" +height="434" +loading="lazy" +class="gallery-image" +data-flex-grow="187" +data-flex-basis="450px" +></li> +<li><a class="link" href="https://github.com/pynecone-io/pynecone" target="_blank" rel="noopener" +>pynecone</a>,一个用python开发的web应用框架,特点是使用python语言完成所有任务,包括前端和后端,可以帮助那些对于前端开发不太擅长的人更方便地制作web应用程序。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-10-16-17.png" +width="727" +height="647" +loading="lazy" +class="gallery-image" +data-flex-grow="112" +data-flex-basis="269px" +></li> +<li><a class="link" href="https://maryrosecook.com/blog/post/a-practical-introduction-to-functional-programming" target="_blank" rel="noopener" +>函数式编程入门</a>,一篇介绍函数式编程的文章,介绍了函数式编程的基本概念和一些重要的函数式编程概念,并使用Javascript演示了如何使用这些概念进行函数式编程。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-024-%E6%9C%9F/2023-03-15-10-18-09.png" +width="450" +height="220" +loading="lazy" +class="gallery-image" +data-flex-grow="204" +data-flex-basis="490px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 023 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/Wed, 08 Mar 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/<h1 id="机器文摘-第-023-期">机器文摘 第 023 期</h1> +<h2 id="长文">长文</h2> +<h3 id="视频信号可以被窃听吗">视频信号可以被窃听吗?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-10-10-45.png" +width="533" +height="234" +loading="lazy" +class="gallery-image" +data-flex-grow="227" +data-flex-basis="546px" +> +我之前听到过一个传说。</p> +<p>使用高灵敏度的天线,再加上一些奇妙的设备。</p> +<p>可以窃听(窃视?)到附近(方圆数百米)范围之内的显示器显示的内容。</p> +<p>这个传说流传的时候,还是CRT显示器的时代,当时的视频接口主要是VGA,采用模拟信号进行传输。</p> +<p>如果显示器或者视频线缆所作的屏蔽不够充分的话,难免会有信号泄露。</p> +<p>而VGA信号又没有任何加密,被别有用心的人收看是有一定的可能的。</p> +<p>时间发展到今天,视频接口早已升级,我以为除非不小心无线投屏到了邻居家,否则就不会有视频内容泄露的情况。</p> +<p>然而,<a class="link" href="https://www.windytan.com/2023/02/using-hdmi-radio-interference-for-high.html" target="_blank" rel="noopener" +>今天要说的这篇文章</a>则证实了上述传说的可能。</p> +<p>不过,比起传说中的窃听,作者走的更远一些。</p> +<p>起因是作者在家里摆弄无线电的时候,发现了一个信号干扰源,最后发现来自他的一个树莓派设备。</p> +<p>于是经过一番操作,作者不但成功通过无线接收的方式将视频信号显示了出来。</p> +<p>还利用这种无线信号的干扰(或泄露?)实现了叠加数据的传输。</p> +<h3 id="怎样用密码保护一个静态页面">怎样用密码保护一个静态页面?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-10-34-20.png" +width="903" +height="429" +loading="lazy" +class="gallery-image" +data-flex-grow="210" +data-flex-basis="505px" +> +说到网站上的数据权限保护,一般我们会需要后端程序配合。</p> +<p>比如使用账号系统,给用户角色分配不同的权限,使其访问后端接口时获取不同的数据。</p> +<p>如果没有后台程序,只有静态页面会怎样?</p> +<p>这儿有个开源工具,<a class="link" href="https://robinmoisson.github.io/staticrypt/" target="_blank" rel="noopener" +>可以帮你生成带有密码保护的静态HTML页面</a>。</p> +<p>具体使用方法和原理也很简单。</p> +<p>输入你想设置的密码和你的HTML页面原始代码,这个工具可以使用AES-256加密算法对其进行加密。</p> +<p>然后在浏览器加载时,页面自动使用一个js库实现自解密。</p> +<p>这个方法用于临时保护一些静态的内容还是挺有效的,而且很方便。</p> +<h3 id="写代码越干净越好吗">写代码越“干净”越好吗?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-10-43-47.png" +width="713" +height="344" +loading="lazy" +class="gallery-image" +data-flex-grow="207" +data-flex-basis="497px" +> +有不少人宣称自己有代码“洁癖”。</p> +<p>对于设计模式和面向对象有着非常深的执念(或者函数式编程也是)。</p> +<p>市面上也充斥着很多“之美”、“之道”、“之禅”之类的书籍,强调代码要给人读、整洁干净。</p> +<p>我并不反对上述观点,甚至自己也有一点这样的“洁癖”,只是有时内心会有一丝怀疑的时候,觉得如果过于追求某些东西可能会偏离了解决问题的根本目标。</p> +<p>这篇<a class="link" href="https://www.computerenhance.com/p/clean-code-horrible-performance" target="_blank" rel="noopener" +>《“干净”的代码,糟糕的性能》</a>,帮我吐槽了一些事情。</p> +<p>但作者在文中所举的例子稍微有些牵强,不必过于纠结。</p> +<h3 id="不知道怎么练习编程怎么办">不知道怎么练习编程怎么办</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-10-58-53.png" +width="469" +height="314" +loading="lazy" +class="gallery-image" +data-flex-grow="149" +data-flex-basis="358px" +> +经常有人困惑在学习了一门新的编程语言之后,不知该做些什么。</p> +<p>就像是掌握了词语却写不出好的小说,掌握了规则也下不好象棋。</p> +<p>我们从小受到的教育方式导致了,在学习技能这一块,缺失实践的动力和方法。</p> +<p>这篇<a class="link" href="https://prog21.dadgum.com/80.html" target="_blank" rel="noopener" +>给无目标的新手程序的一些建议</a>,虽然内容不多,但是可以看出作者也是个老油条了。</p> +<p>给出的一些提示都很实在,对于技能练习方面,提的都是我希望我能遵从的。</p> +<p>比如:</p> +<blockquote> +<p>用技能解决你实际生活中的问题。 +做一些你真正会用到的东西。</p> +</blockquote> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://www.freecodecamp.org/chinese/news/typescript-for-react-developers/" target="_blank" rel="noopener" +>写给 React 开发者的 TypeScript 指南</a>,针对React程序员的TypeScript的学习资料,解答了我一部分为什么要用TS的问题。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-11-01-19.png" +width="698" +height="375" +loading="lazy" +class="gallery-image" +data-flex-grow="186" +data-flex-basis="446px" +></li> +<li><a class="link" href="https://method.ac/" target="_blank" rel="noopener" +>Method of Action</a>,一些免费的工具和在线小游戏(颜色搭配、贝塞尔曲线等),可以帮助你学习和掌握设计理念和工具。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-11-02-12.png" +width="605" +height="461" +loading="lazy" +class="gallery-image" +data-flex-grow="131" +data-flex-basis="314px" +></li> +<li><a class="link" href="https://archivebox.io/" target="_blank" rel="noopener" +>Archivebox</a>,一套开源的互联网内容保存方案,可以将你喜欢的页面下载下来,并自动爬取相关链接、图片等内容,类似于互联网档案馆的https://archive.org,不过可以自己搭建。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-11-06-33.png" +width="686" +height="285" +loading="lazy" +class="gallery-image" +data-flex-grow="240" +data-flex-basis="577px" +></li> +<li><a class="link" href="https://ohiostate.pressbooks.pub/graphicshistory/front-matter/cover/" target="_blank" rel="noopener" +>History of Computer Graphics and Animation</a>,一本讲解计算机图形和动画发展历程的电子书,里面记录了计算机图形学相关的许多参考资料,曾用于俄亥俄州立大学的授课。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-023-%E6%9C%9F/2023-03-08-11-08-29.png" +width="676" +height="711" +loading="lazy" +class="gallery-image" +data-flex-grow="95" +data-flex-basis="228px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 022 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/Wed, 01 Mar 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/<h1 id="机器文摘-第-022-期">机器文摘 第 022 期</h1> +<h2 id="长文">长文</h2> +<h3 id="自制家庭服务器">自制家庭服务器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-10-51-39.png" +width="668" +height="367" +loading="lazy" +class="gallery-image" +data-flex-grow="182" +data-flex-basis="436px" +> +人们常说,中年技术男的最终归宿除了钓鱼和盘核桃之外,还有一项就是折腾家里的服务器,这些服务器形态各异,但是作用都是殊途同归:NAS、软路由、虚拟化、Docker容器。</p> +<p>怎样变着花样搭建家庭服务器几乎是 V 站的月经甚至日经话题。</p> +<p>这里有个国外的老哥,决定使用 ARM64 架构自己“装配”一个,是那种需要焊接的“装配”。</p> +<p>有兴趣的可以翻阅一下这篇<a class="link" href="https://jforberg.se/blog/posts/2023-02-19-rockpro64/rockpro64.html" target="_blank" rel="noopener" +>《构建 ARM64 家庭服务器》</a>。</p> +<p>文章介绍了如何用一种较为困难的方式构建一个 ARM64 架构的家用服务器。</p> +<p>作者使用了一块名为 ROCKPro64 的开发板,并详细介绍了构建过程中遇到的问题以及如何解决这些问题。</p> +<p>文章中包含了安装基础操作系统、配置网络连接、设置磁盘阵列和安装各种软件的详细步骤和指导,涵盖了从硬件到软件的多个方面。</p> +<p>在构建过程中,作者提到了一些常见的问题和解决方法,例如如何处理不同操作系统的差异,如何在开发板上设置固件,以及如何解决硬件不兼容问题。</p> +<p>总之,这篇文章是一份详细的指南,可以帮助有兴趣构建自己的家用服务器的读者了解基础知识,克服可能遇到的问题,并学习如何从头开始构建一个高效、安全的服务器。</p> +<blockquote> +<p>上面这段是让 chatGPT 帮我写的 :)</p> +</blockquote> +<h3 id="用rust写一个大小仅有2k的极简fps游戏">用Rust写一个大小仅有2K的极简FPS游戏</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-11-06-53.png" +width="480" +height="258" +loading="lazy" +class="gallery-image" +data-flex-grow="186" +data-flex-basis="446px" +> +极简渲染器的编写教程网上有很多,但大都浅尝辄止,以静态渲染为主。</p> +<p><a class="link" href="https://grantshandy.github.io/posts/raycasting/" target="_blank" rel="noopener" +>这篇文章</a>则从制作一个第一人称射击游戏的视角出发,讲解了怎样使用光线投射技术实现最基本的三维空间渲染、光照、阴影等效果。</p> +<p>作者使用 Rust 语言基于 wasm 技术编写了一个在网页中运行的示例程序,该程序非常小巧,但是也充分展现了如何使用光线投射算法来实现 3D 渲染技术仲的一些基本概念,比如:墙体贴图、视角控制等。</p> +<p>是我看到的教程里比较系统的一个,适合作为爱好者去研究。</p> +<h3 id="玩具-cpu-模拟器">玩具 CPU 模拟器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-13-24-45.png" +width="640" +height="480" +loading="lazy" +class="gallery-image" +data-flex-grow="133" +data-flex-basis="320px" +> +国外一个大学老师觉得他的计算机组成原理课程有些枯燥,于是他<a class="link" href="https://jimhall.itch.io/toy-cpu" target="_blank" rel="noopener" +>动手撸了一个 CPU 模拟器出来</a>,以帮助学生们更好的理解计算机内部运作原理。</p> +<p>作者在文章里介绍了基本的原理,以及模拟器的各个组件,适合学习底层原理初入门的学生。</p> +<p>另外这个模拟器也基于 MIT 协议进行了开源,文章中附有开源仓库的地址和编译好的可执行文件下载连接。</p> +<p>需要注意的是该程序运行环境为DOS,现在要想体验的话,需要先安装 <a class="link" href="https://www.dosbox.com/download.php?main=1" target="_blank" rel="noopener" +>DosBOX</a> 这个模拟器。</p> +<h3 id="不用任何构建系统编写前端代码">不用任何构建系统编写前端代码</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-13-35-29.png" +width="632" +height="224" +loading="lazy" +class="gallery-image" +data-flex-grow="282" +data-flex-basis="677px" +> +比起十几年前,前端开发工程现在已经变得十分复杂。</p> +<p>有次我想写个简单的页面程序,但是却花费了一上午的时间陷入对框架和构建系统的选择上。</p> +<p>后来不得不放弃,改用记事本随便用原生Javascript完成了功能。</p> +<p><a class="link" href="https://jvns.ca/blog/2023/02/16/writing-javascript-without-a-build-system/" target="_blank" rel="noopener" +>这篇文章</a>的作者跟我有同样的感受。</p> +<p>作者认为,对于一些简单的项目来说,使用构建系统可能是不必要的。</p> +<p>因为构建系统会增加开发和维护的复杂性,而且可能会导致一些性能问题。</p> +<p>文章演示了作者如何使用原生的Javascript和浏览器的开发者工具来实现一些常见的构建系统功能。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/CyC2018/CS-Notes" target="_blank" rel="noopener" +>计算机知识笔记</a>,一个计算机科学知识笔记仓库,包括计算机基础知识、编程语言和算法、开发工具、面试笔试题目等等,是一个非常实用的笔记库。目前在 Github 上有超过 162k 个 star 。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-13-47-03.png" +width="344" +height="602" +loading="lazy" +class="gallery-image" +data-flex-grow="57" +data-flex-basis="137px" +></li> +<li><a class="link" href="https://www.hugi.scene.org/online/hugi31/hugi%2031%20-%20index%20coding%20corner.htm" target="_blank" rel="noopener" +>Creating Demos</a>,这套教程是 <a class="link" href="https://en.wikipedia.org/wiki/Hugi" target="_blank" rel="noopener" +>Hugi 杂志</a>在2001年第31期发布的一系列编程文章,主题是“Demo程序”的制作,是我目前在网络上见到的比较完整和耐心的一套讲解 Demoscene 如何制作的教程。虽然有些技术是老旧的,但是思想一直是不变的,能够学到很多平时很难了解到的东西,现在很少有人愿意分享这些了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-13-52-29.png" +width="543" +height="367" +loading="lazy" +class="gallery-image" +data-flex-grow="147" +data-flex-basis="355px" +></li> +<li><a class="link" href="https://github.com/iawia002/lux" target="_blank" rel="noopener" +>网络视频下载器</a>,一个 go 语言编写的网络音视频资源下载工具,类似 youtube-dl,但是支持的网站要更多一些。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-13-54-53.png" +width="870" +height="666" +loading="lazy" +class="gallery-image" +data-flex-grow="130" +data-flex-basis="313px" +></li> +<li><a class="link" href="https://www.ambient.run/" target="_blank" rel="noopener" +>ambient</a>,Ambient是一个使用 WebAssembly、Rust 和 WebGPU 技术构建的高性能多人游戏和3D应用的开源引擎。特点是针对构建多人游戏开发进行优化支持。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-022-%E6%9C%9F/2023-03-01-14-03-29.png" +width="981" +height="378" +loading="lazy" +class="gallery-image" +data-flex-grow="259" +data-flex-basis="622px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 021 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/Wed, 22 Feb 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/<h1 id="机器文摘-第-021-期">机器文摘 第 021 期</h1> +<h2 id="长文">长文</h2> +<h3 id="chatgpt-原理通俗讲解">chatGPT 原理通俗讲解</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-14-57-11.png" +width="1240" +height="410" +loading="lazy" +class="gallery-image" +data-flex-grow="302" +data-flex-basis="725px" +> +可能是有人炒作的缘故,chatGPT 热度一直不降,连街边买菜的大妈都在讨论这个“人工智能机器人”。</p> +<p>可能是它输出语言的流畅度实在是太接近真实的人类了,用惯了之前那种“智能助理”的人很容易感到震惊。</p> +<p>然而其背后的原理并非像想象的那么复杂,甚至是大力出奇迹的又一个经典样例。</p> +<p>最近关于它的文章也是铺天盖地,各种分析、叫好,很少有冷静下来探讨其背后机理的。</p> +<p>我翻看了几篇之后,发现唯有这篇<a class="link" href="https://writings.stephenwolfram.com/2023/02/what-is-chatgpt-doing-and-why-does-it-work/" target="_blank" rel="noopener" +>《chatGPT在做什么以及它为什么好使》</a> 比较优秀。读起来比较平和,没有压力。</p> +<p>文章揭示了即使像chatGPT这样的大型语言模型也是一个单词一个单词慢慢往出崩的,并尝试说清楚这么流畅的语言是基于什么来预测后续单词的概率。</p> +<h3 id="怎样利用多gpu训练真正的大型模型">怎样利用多GPU训练真正的大型模型</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-13-37.png" +width="920" +height="461" +loading="lazy" +class="gallery-image" +data-flex-grow="199" +data-flex-basis="478px" +> +前面提到的 chatGPT 模型,体量非常大,据说训练一次就要耗费上千万美元。</p> +<p>作为普通开发者我们是不敢奢望自己上手训练一番。</p> +<p>不过,这里有一篇文章可以让我了解像这样的<a class="link" href="https://lilianweng.github.io/posts/2021-09-25-train-large/" target="_blank" rel="noopener" +>大模型是如何进行并行训练的</a>。</p> +<p>另外还有个开源的项目,号称可以<a class="link" href="https://github.com/hpcaitech/ColossalAI/blob/main/README-zh-Hans.md" target="_blank" rel="noopener" +>在较少资源的基础设施上进行 GPT 模型训练</a>,有兴趣的可以试试。</p> +<h3 id="怎样搭建一个电子爱好者工作间">怎样搭建一个电子爱好者工作间</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-28-10.png" +width="716" +height="439" +loading="lazy" +class="gallery-image" +data-flex-grow="163" +data-flex-basis="391px" +> +拥有一个电子产品工作室一直是我的一个梦想。</p> +<p>电烙铁、稳压电源、万用表,是我能想到的最基本的设备。</p> +<p>如果还想更完美,可以借鉴这篇文章所介绍的思路,<a class="link" href="https://lcamtuf.substack.com/p/setting-up-an-electronics-workshop" target="_blank" rel="noopener" +>搭建一个电子爱好者工作间</a>。</p> +<h3 id="运气计算公式">运气计算公式</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-37-36.png" +width="809" +height="570" +loading="lazy" +class="gallery-image" +data-flex-grow="141" +data-flex-basis="340px" +> +看到一个关于运气的文章<a class="link" href="https://www.swyx.io/create-luck" target="_blank" rel="noopener" +>《如何获得好运气》</a>,觉得里面提到的“怎样使得随机的运气变得让好运更加倾向于你”的说法比较有意思。</p> +<p>于是就收录一下。</p> +<p>文章里探讨的问题,很容易让我联想到关于“下雨的时候是飞速跑动淋雨多还是慢慢走淋雨多”的问题。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://academy.cs.cmu.edu/" target="_blank" rel="noopener" +>卡耐基梅隆大学计算机科学在线教程</a>,CMU CS Academy 是卡内基梅隆大学计算机科学学院 (SCS) 的一个项目,其目标是开发一种新颖的、世界级的、在线的、完全免费的交互式高中计算机科学课程。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-45-42.png" +width="767" +height="390" +loading="lazy" +class="gallery-image" +data-flex-grow="196" +data-flex-basis="472px" +></li> +<li><a class="link" href="https://www.handsome-css.com/" target="_blank" rel="noopener" +>纯CSS实现的超漂亮UI组件收集</a>,网站收集了超多 UI 组件,基于 纯 CSS 实现,采用 MIT 开源协议发布,可以自由使用。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-47-30.png" +width="863" +height="349" +loading="lazy" +class="gallery-image" +data-flex-grow="247" +data-flex-basis="593px" +></li> +<li><a class="link" href="https://cn.sli.dev/" target="_blank" rel="noopener" +>为开发者打造的演示文稿工具</a>,Slidev 旨在为开发者提供灵活性和交互性,通过使用他们已经熟悉的工具和技术,使他们的演示文稿更加有趣、更具表现力和吸引力。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-50-17.png" +width="652" +height="251" +loading="lazy" +class="gallery-image" +data-flex-grow="259" +data-flex-basis="623px" +></li> +<li><a class="link" href="https://www.stableattribution.com/" target="_blank" rel="noopener" +>根据ai做的图倒推出用于训练模型的原始图</a>,这个网站比较有意思,前一段时间比较火的根据文字生成图片的 AI ,这里可以将根据 AI 生成的图片反推出它当时样本训练的原始图。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-021-%E6%9C%9F/2023-02-22-15-56-55.png" +width="1696" +height="398" +loading="lazy" +class="gallery-image" +data-flex-grow="426" +data-flex-basis="1022px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 020 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/Wed, 15 Feb 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/<h1 id="机器文摘-第-020-期">机器文摘 第 020 期</h1> +<h2 id="长文">长文</h2> +<h3 id="怎样获得非凡成就">怎样获得非凡成就</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/2023-02-15-09-57-43.png" +width="749" +height="383" +loading="lazy" +class="gallery-image" +data-flex-grow="195" +data-flex-basis="469px" +> +多年来,我对成功学嗤之以鼻。</p> +<p>但也对有些人的成功给予应有的尊重。</p> +<p>我所欣赏的成功人士有一种特殊气质,我说不上来具体是什么特点,有点儿像反叛精神,又有点儿对手工技术的狂热。</p> +<p>这些人里对我影响比较大的是《黑客与画家》的作者 保罗·格雷厄姆(<a class="link" href="https://zh.wikipedia.org/zh-hans/%E4%BF%9D%E7%BD%97%C2%B7%E6%A0%BC%E9%9B%B7%E5%8E%84%E5%A7%86" target="_blank" rel="noopener" +>Paul Graham</a>)。</p> +<p>他创建了著名的 <a class="link" href="https://zh.wikipedia.org/zh-hans/Y_Combinator" target="_blank" rel="noopener" +>YC 孵化器公司</a>,也打造了很多成功的产品。</p> +<p>今天推荐的这篇文章<a class="link" href="https://blog.samaltman.com/how-to-be-successful" target="_blank" rel="noopener" +>《How To Be Successful》</a>的作者,是保罗·格雷厄姆非常推崇的一位创业者。</p> +<p>文章分享的观点乍看有成功学的影子,但读完却能引人思考。</p> +<p>这里是中文翻译版:<a class="link" href="https://mp.weixin.qq.com/s/pQYztNmmQ6W4fRxPIEsWYQ" target="_blank" rel="noopener" +>《观察成千上万创业者后,关于如何获得非凡成就的13条思考》</a></p> +<p>我觉得这些观点至少可以给长期埋头技术工作的人们一些启发,我稍微列举几条如下:</p> +<blockquote> +<ul> +<li>这个世界很少人能做到将眼光放长远,而那些有长远眼光的人会得到市场的丰厚回报。</li> +<li>把时间花在做正确的事上,比花长时间进行工作更重要。</li> +<li>跟着你的好奇心走。因为对你来说兴奋的事情对其他人来说也同样兴奋。</li> +<li>成为内驱型的人(即:自己去做一件事的原因来自于自己,而不是外部的力量或别人的期望)。</li> +</ul> +</blockquote> +<h3 id="怎样在客厅建立自己的私人影院">怎样在客厅建立自己的私人影院</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/2023-02-15-10-21-45.png" +width="841" +height="396" +loading="lazy" +class="gallery-image" +data-flex-grow="212" +data-flex-basis="509px" +> +智能电视或者智能盒子已成为现在客厅的标配。</p> +<p>如何充分发挥它们的作用,早已是技术爱好者的孜孜不倦探索的课题。</p> +<p>前些天我偶然收到一份公开的云盘链接,使用开源的 <a class="link" href="https://github.com/alist-org/alist" target="_blank" rel="noopener" +>AList</a>(一个支持网盘存储的文件列表程序,可以通过多种协议将网盘映射为本地访问的存储路径) 进行构建。里面整理了大量的影视资源,有不少是高质量、高码率的蓝光原盘文件。</p> +<p>这就激发了我的好奇心。</p> +<p>由于自己一直按耐住折腾 NAS 的念头,这些年一直没有收集电影。</p> +<p>但现在既然有在线的资源,不妨尝试一下。</p> +<p>于是我找到了这篇<a class="link" href="https://wp.gxnas.com/12278.html" target="_blank" rel="noopener" +>《利用KODI和云盘打造4K高清私人云影院》</a>(仅作研究,观影和收藏还需支持正版)。</p> +<p>按照文章的指导,成功给电视安装了 KODI(一个媒体中心 App),并进行了配置,可以非常方便地浏览、观看互联网云盘上的高清电影。</p> +<p>比起云盘官方所出品的各种 App 在体验上更加灵活、完美。</p> +<h3 id="噪声在计算机图形学里的作用">“噪声”在计算机图形学里的作用</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/2023-02-15-10-40-28.png" +width="671" +height="303" +loading="lazy" +class="gallery-image" +data-flex-grow="221" +data-flex-basis="531px" +> +想要计算机产生的图形更加的接近自然,生成各式各样的噪声是必不可少的算法。</p> +<p>之前在读<a class="link" href="https://natureofcode.com/" target="_blank" rel="noopener" +>《The Nature of Code》</a>(中文译作:代码本色)一书的时候,作者花了大量篇幅讲解关于噪声、随机等对于模拟自然界中各种现象的重要作用。</p> +<p>或许在噪声里就隐藏着大自然最深处的秘密。</p> +<p>这篇<a class="link" href="https://zhuanlan.zhihu.com/p/68507311" target="_blank" rel="noopener" +>WebGL进阶——走进图形噪声</a>可以让你领略一些图形噪声的神奇。</p> +<p>很多场景都给出了 WebGL 实现的源码,可以边学边练。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://threegn.app/" target="_blank" rel="noopener" +>ThreeGN</a>,一个基于网页的三维建模程序,特点是具有类似 Blender 的几何节点编辑功能。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/2023-02-15-10-51-53.png" +width="846" +height="453" +loading="lazy" +class="gallery-image" +data-flex-grow="186" +data-flex-basis="448px" +></p> +</li> +<li> +<p><a class="link" href="https://tabler-icons.io/" target="_blank" rel="noopener" +>tabler</a>,一个开源的图标库,可用于 Web 或 移动端应用开发,全部免费使用。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/2023-02-15-10-55-30.png" +width="796" +height="314" +loading="lazy" +class="gallery-image" +data-flex-grow="253" +data-flex-basis="608px" +></p> +</li> +<li> +<p><a class="link" href="https://microsoftedge.microsoft.com/addons/detail/%E6%B2%89%E6%B5%B8%E5%BC%8F%E7%BF%BB%E8%AF%91/amkbmndfnliijdhojkpoglbnaaahippg" target="_blank" rel="noopener" +>immersive-translate</a>,一个在线翻译浏览器插件,支持 Edge、Firefox、Chrome 等浏览器,优点是可以在网页上追加中文显示,原文和译文同时展示,对于想提升外语水平的人士,是个不错的对照工具。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-020-%E6%9C%9F/2023-02-15-10-59-08.png" +width="621" +height="357" +loading="lazy" +class="gallery-image" +data-flex-grow="173" +data-flex-basis="417px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 019 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/Tue, 07 Feb 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/<h1 id="机器文摘-第-019-期">机器文摘 第 019 期</h1> +<h2 id="长文">长文</h2> +<h3 id="现阶段-ai-能对游戏开发提供多大帮助">现阶段 AI 能对游戏开发提供多大帮助</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-13-19-34.png" +width="686" +height="358" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="459px" +> +AI 在最近有多爆发自然不用我再赘述,抛开那些狂热的能够引起焦虑的言论(比如 AI 即将替代大量工作岗位),也有不少人选择跟 AI 和平相处。</p> +<p>这篇<a class="link" href="https://www.traffickinggame.com/ai-assisted-graphics/" target="_blank" rel="noopener" +>《AI 辅助图形》</a>的作者是一个有着游戏制作二十年经验的从业者,近期想尝试尽可能地利用各种 AI 加持的辅助工具,试图通过他们提升制作效率。</p> +<p>作者从游戏的概念原型阶段,一直到三维模型资产的制作和游戏场景的搭建,均选用了具有 AI 能力的效率工具进行支持。</p> +<p>最终结论是,虽然在过程中会有这样那样的不顺手,但这些工具确实能够帮助他节约大量工作时长。</p> +<p>所以作者的看法是,他很愿意将 AI 工具看作他的同事。</p> +<p>照这么说的话,留给人类的工作真的是不多了。</p> +<h3 id="chatgpt-学习笔记">ChatGPT 学习笔记</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-13-32-44.png" +width="600" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="178" +data-flex-basis="427px" +> +ChatGPT 在春节后又起了一波热度。</p> +<p>网上到处都是关于它的段子,有人用它写论文,有人拿来给孩子辅导作业,有人写情书,有人当个动嘴的甲方让它写程序。</p> +<p>喜得微软恨不得现在就把它接到搜索引擎里,逼得谷歌提前释放出自己的类似模型。</p> +<p>国内的百度也表示将在3月份发出自己的大规模语言模型。</p> +<p>要我说就不要这么着急,不妨拨开迷雾,看看 ChatGPT 是个什么东东。</p> +<p>在网上发现这篇<a class="link" href="https://blog.csdn.net/v_JULY_v/article/details/128579457" target="_blank" rel="noopener" +>《ChatGPT 通俗笔记》</a>,讲述了这个模型的发展历程,以及一些基本的概念原理。</p> +<p>此类中文资料不多,给这篇文章作者点赞。</p> +<h3 id="视觉设计的一些规则">视觉设计的一些规则</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-13-49-28.png" +width="697" +height="357" +loading="lazy" +class="gallery-image" +data-flex-grow="195" +data-flex-basis="468px" +> +现在专业的界限越来越模糊,每个人都应该掌握一些基本的设计理念,以便在日常工作中输出的成果具备基本的美感。</p> +<p>这篇<a class="link" href="https://anthonyhobday.com/sideprojects/saferules/" target="_blank" rel="noopener" +>《视觉设计安全法则》</a>,浅显易读、明确具体,对于视觉设计活动很有指导意义。</p> +<p>看完之后无论是自己动手做 PPT 还是软件的 demo 原型,都可以用到。</p> +<p>我觉得甚至对于摄影构图、房屋装修都能有所借鉴,因为美是相通的。</p> +<h3 id="python-做后端开发的技术选型">Python 做后端开发的技术选型</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-13-57-37.png" +width="673" +height="314" +loading="lazy" +class="gallery-image" +data-flex-grow="214" +data-flex-basis="514px" +> +有时候想做一些 Web 应用的原型,Python 是我的首选语言,写起来顺手又省事,能节约不少时间。</p> +<p>但是由于用的不够深入,在选择开发框架的时候,稍微有些困惑。</p> +<p>比如同样都能提供快速的开发能力,Fastapi 和 Flask到底选哪个?</p> +<p>如果你也有跟我一样的疑惑,可以看看这篇<a class="link" href="https://www.turing.com/kb/fastapi-vs-flask-a-detailed-comparison" target="_blank" rel="noopener" +>《Fastapi 和 Flask 详细对比》</a>。</p> +<p>文章深度分析了这两个框架的异同以及所适用的工作场景。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://github.com/red-data-tools/YouPlot" target="_blank" rel="noopener" +>YouPlot</a>,控制台绘图工具,可以在控制台窗口用字符的方式进行绘图,支持柱状图、散点图等。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-14-10-37.png" +width="587" +height="355" +loading="lazy" +class="gallery-image" +data-flex-grow="165" +data-flex-basis="396px" +></p> +</li> +<li> +<p><a class="link" href="https://play-cs.com/zh/servers" target="_blank" rel="noopener" +>网页在线联机 CS1.6</a>,只需浏览器即可联机玩反恐精英 1.6,这个网站通过 WASM 技术将 CS 1.6 移植到了网页中运行,现代浏览器均可支持,第一次加载时间略长,但体验还算流畅,在线人员数量也挺多,随时可以匹配到。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-14-20-36.png" +width="811" +height="397" +loading="lazy" +class="gallery-image" +data-flex-grow="204" +data-flex-basis="490px" +></p> +</li> +<li> +<p><a class="link" href="https://fffuel.co/sssvg" target="_blank" rel="noopener" +>交互式 SVG 参考</a>,一个可以在线了解 SVG 图形标准细节的网站,提供交互式界面进行实时演示。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-14-25-38.png" +width="904" +height="428" +loading="lazy" +class="gallery-image" +data-flex-grow="211" +data-flex-basis="506px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/LunarFang416/url-animations" target="_blank" rel="noopener" +>浏览器地址栏里的动画</a>,一个有意思的 Js 库,通过动态修改浏览器地址栏的 URL 地址来实现动画,效果还比较萌。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-019-%E6%9C%9F/2023-02-07-14-26-39.png" +width="757" +height="208" +loading="lazy" +class="gallery-image" +data-flex-grow="363" +data-flex-basis="873px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 018 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/Tue, 31 Jan 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/<h1 id="机器文摘-第-018-期">机器文摘 第 018 期</h1> +<h2 id="长文">长文</h2> +<h3 id="游戏高清重制科林麦克雷拉力赛3">游戏高清重制《科林麦克雷拉力赛3》</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-09-15-47.png" +width="857" +height="434" +loading="lazy" +class="gallery-image" +data-flex-grow="197" +data-flex-basis="473px" +> +游戏高清重制一直是我比较感兴趣的话题,可能因为比较喜欢怀旧吧。</p> +<p>我曾经收藏过采用覆盖显示驱动的方式进行高清分辨率支持的《极品飞车 5》、《Quake 3》等游戏。</p> +<p>也见过一些更古老的游戏在更新资源包之后重新焕发青春。</p> +<p>不过一直没有接触过真正的重制过程。</p> +<p>这篇<a class="link" href="https://cookieplmonster.github.io/2023/01/15/remastering-colin-mcrae-rally-3-silentpatch/" target="_blank" rel="noopener" +>《重制科林麦克雷拉力赛》</a>详细记录了一个优秀的赛车游戏进行高清重制的过程。</p> +<p>可以带你了解老旧游戏如何进行“宽屏”、“超宽屏”支持,如何重制高清界面UI元素等,过程充满了对不可能的挑战。</p> +<h3 id="把网页渲染到控制台">把网页渲染到控制台</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-09-24-01.png" +width="1067" +height="464" +loading="lazy" +class="gallery-image" +data-flex-grow="229" +data-flex-basis="551px" +> +通过控制台窗口进行上网,你可能觉得并不新鲜。</p> +<p>毕竟已经有很多类似 w3m 这种在控制台下基于字符的浏览器程序。</p> +<p>但是他们的缺点都是不能显示图形,而且几乎失去了对页面的样式渲染。</p> +<p>今天这篇<a class="link" href="https://fathy.fr/carbonyl" target="_blank" rel="noopener" +>《把网页渲染到控制台》</a>则另辟蹊径,虽然同样是在控制台的字符界面,但是渲染手段却大不相同。</p> +<p>它将控制台字符当作单个像素来处理,采用现代浏览器内核进行页面解析和预渲染计算。</p> +<p>然后在像素渲染阶段,采用了控制台字符来进行替换。</p> +<p>虽然最终效果无法跟图形界面下的浏览器相比。</p> +<p>但是它毕竟提供了一种在终端控制台进行图形化网页显示的可能。</p> +<h3 id="chromium-渲染流水线字节码到像素的一生">Chromium 渲染流水线——字节码到像素的一生</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-09-32-37.png" +width="481" +height="580" +loading="lazy" +class="gallery-image" +data-flex-grow="82" +data-flex-basis="199px" +> +看了前面网页渲染到控制台的文章,如果对浏览器的原理架构比较感兴趣的话。</p> +<p>可以看看这篇<a class="link" href="https://zhuanlan.zhihu.com/p/574069391" target="_blank" rel="noopener" +>讲解 Chromium 浏览器渲染架构</a>的文章。</p> +<p>现代浏览器已经复杂到不可能通过个人从零开始实现。</p> +<p>了解一下他们的架构,即便不从事相关开发,也可能对自己的软件架构产生有益影响。</p> +<h3 id="99-行代码实现光线追踪">99 行代码实现光线追踪</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-09-40-20.png" +width="702" +height="235" +loading="lazy" +class="gallery-image" +data-flex-grow="298" +data-flex-basis="716px" +> +光线追踪在图形渲染中十分关键的概念。</p> +<p>同时也是现代电影工业实现逼真光照渲染所必须的技术手段。</p> +<p>然而它的原理却并不复杂,甚至只需少量代码就可以自己实现一个建议的渲染器。</p> +<p>这篇<a class="link" href="http://kevinbeason.com/smallpt/" target="_blank" rel="noopener" +>《99 行代码实现光线追踪》</a>就只是用了少量 C++ 代码实现了一个简单的带有全局光照、阴影、反射的场景渲染。</p> +<p>虽然看起来简单,效果还是很令人惊艳的。</p> +<p>适合我这种喜欢研究原理,但又不太深入的“技术爱好者”。</p> +<h3 id="光线追踪深入">光线追踪深入</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-09-47-14.png" +width="731" +height="333" +loading="lazy" +class="gallery-image" +data-flex-grow="219" +data-flex-basis="526px" +> +既然前面提到了光线追踪,不妨再引申一下。</p> +<p>很多光线追踪的入门教程都会教你渲染一些简单的模型,比如球体,圆柱体等等。</p> +<p>如果想基于光线追踪技术渲染复杂一些的三维模型,应该怎么做?</p> +<p>这里有一篇<a class="link" href="https://jamie-wong.com/2016/07/15/ray-marching-signed-distance-functions/" target="_blank" rel="noopener" +>《光线行进和符号距离函数》</a>,里面介绍了基于光线行进算法(光线追踪的一种实现方式)和符号距离函数来构建三维场景中复杂模型的思路。</p> +<p>内容比较详细,并带有示例代码。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://www.chronophoto.app/game.html" target="_blank" rel="noopener" +>chronophoto</a>,一个猜照片年代的游戏,根据网站随机展示的老照片,来判断这张照片是哪一年拍摄的,答案区间 1900 到 2020 ,我试了试还挺有意思,可以根据照片中出现的物品和人物的衣着进行分析。<br> +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-09-56-50.png" +width="944" +height="432" +loading="lazy" +class="gallery-image" +data-flex-grow="218" +data-flex-basis="524px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/GimelStudio/GimelStudio" target="_blank" rel="noopener" +>Gimel Studio</a>,一个基于节点系统的照片后期处理工具,开源,采用 Python 编写。<br> +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-10-00-55.png" +width="1009" +height="537" +loading="lazy" +class="gallery-image" +data-flex-grow="187" +data-flex-basis="450px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/vitoplantamura/BugChecker" target="_blank" rel="noopener" +>BugChecker</a>,一个支持 Windows 11 的类 SoftICE 调试器,开源。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-10-04-14.png" +width="649" +height="376" +loading="lazy" +class="gallery-image" +data-flex-grow="172" +data-flex-basis="414px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/google/swiftshader" target="_blank" rel="noopener" +>swiftshader</a>,一个基于 CPU 实现 OpenGL 渲染的图形库。主要应用在谷歌开源的 chromium 项目里,用纯软件算法实现了OpenGL、Vulkan图形接口。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-018-%E6%9C%9F/2023-01-31-10-08-42.png" +width="308" +height="307" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 017 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/Mon, 16 Jan 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/<h1 id="机器文摘-第-017-期">机器文摘 第 017 期</h1> +<p><em>预计春节期间暂停更新,节后恢复。</em></p> +<h2 id="长文">长文</h2> +<h3 id="怎样在-1-位色深的-lcd-屏幕上显示灰度httpswwwzephraymepostgrayscale_lcd"><a class="link" href="https://www.zephray.me/post/grayscale_lcd/" target="_blank" rel="noopener" +>怎样在 1 位色深的 LCD 屏幕上显示灰度</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-09-33-34.png" +width="1920" +height="1080" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +> +只有 1 位色深的 LCD 屏幕按理说是不能显示灰度的,因为他的像素点要么纯黑、要么纯白,显示的图案效果肯定非常差。</p> +<p>如果说非要显示灰度的话,我第一个想法是通过<a class="link" href="https://zh.wikipedia.org/wiki/%E6%8A%96%E5%8B%95_%28%E6%95%B8%E4%BD%8D%E8%A8%8A%E8%99%9F%E8%99%95%E7%90%86%29" target="_blank" rel="noopener" +>抖动算法</a>进行模拟(即通过像素点的稀疏程度来制造错觉,如下图)。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-09-40-49.png" +width="180" +height="215" +loading="lazy" +class="gallery-image" +data-flex-grow="83" +data-flex-basis="200px" +></p> +<p>然而这篇文章的作者采取了更为巧妙地方法,使用 PWM (脉冲宽度调制)技术,利用每个像素点的点亮时间不同来制造灰度错觉。</p> +<p>之前只是见过使用 PWM 调整 LED 灯泡的亮度,像这种用法我倒是第一次见。</p> +<h3 id="作为一名数据工程师和作家我为什么要用-neovimhttpswwwsspaeticomblogwhy-using-neovim-data-engineer-and-writer-2023"><a class="link" href="https://www.sspaeti.com/blog/why-using-neovim-data-engineer-and-writer-2023/" target="_blank" rel="noopener" +>作为一名数据工程师和作家,我为什么要用 (Neo)vim</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-09-44-27.png" +width="500" +height="264" +loading="lazy" +class="gallery-image" +data-flex-grow="189" +data-flex-basis="454px" +></p> +<p>很多人都被 Vim 复杂的功能和陡峭的学习曲线吓到过。</p> +<p>也有很多人本着对效率的极致追求,而选择了征服 Vim,从而走上高效(折腾)的路线。</p> +<p>本文作者作为一名数据工程师,讲述了他学习 Vim 的心路历程,也许对于现在还在观望的人有所启发。</p> +<p>我个人使用 Vim 已十多年时间,虽然从未触及特别深入的技能(如宏定义、寄存器等),但是 Vim 这种神器的特点就是,只要你忍者难受越过操作的及格线,剩下的技能你稍微多掌握一点,就能马上给你带来非常丰厚的回报。</p> +<h3 id="焦散是什么如何正确地渲染焦散httpswwwchaoscomcnblogwhat-are-caustics-and-how-to-render-them-the-right-way"><a class="link" href="https://www.chaos.com/cn/blog/what-are-caustics-and-how-to-render-them-the-right-way" target="_blank" rel="noopener" +>焦散是什么?如何正确地渲染焦散?</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-09-55-28.png" +width="850" +height="469" +loading="lazy" +class="gallery-image" +data-flex-grow="181" +data-flex-basis="434px" +> +焦散(Caustics)在现实生活中随处可见,但在渲染图中却很稀有。这篇文章解答了为什么渲染焦散很难,以及有哪些方法可以迂回实现。</p> +<p>找到这篇文章是因为我在 Github 上发现了<a class="link" href="https://github.com/pmndrs/drei#caustics" target="_blank" rel="noopener" +>一个使用 webgl 实现焦散渲染的项目</a>,效果非常不错,于是想研究一下背后的原理。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-10-02-22.png" +width="652" +height="339" +loading="lazy" +class="gallery-image" +data-flex-grow="192" +data-flex-basis="461px" +></p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://refactoringguru.cn/design-patterns" target="_blank" rel="noopener" +>常用设计模式有哪些</a>,一本在线电子书,图文并茂,以比较直观的方式介绍了软件开发常用的设计模式,支持英文、日文、中文等多国语言。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-10-04-26.png" +width="673" +height="357" +loading="lazy" +class="gallery-image" +data-flex-grow="188" +data-flex-basis="452px" +></p> +</li> +<li> +<p><a class="link" href="https://abseil.io/resources/swe-book/html/toc.html" target="_blank" rel="noopener" +>谷歌的软件工程</a>,好几年前的一本书,讲述在谷歌做软件开发的体验和最佳实践,现在出了可免费阅读的电子版。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-10-04-41.png" +width="504" +height="662" +loading="lazy" +class="gallery-image" +data-flex-grow="76" +data-flex-basis="182px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/ToolJet/ToolJet" target="_blank" rel="noopener" +>开源低代码开发框架 ToolJet</a>,免费开源的低代码开发框架,带有可视化编辑器,从数据持久化到前端界面全部无需编写代码。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-10-08-12.png" +width="795" +height="414" +loading="lazy" +class="gallery-image" +data-flex-grow="192" +data-flex-basis="460px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/Eandrju/cellular-automaton.nvim" target="_blank" rel="noopener" +>一个无聊的 Neovim 插件</a>,一个没啥用的 Neovim 插件,唯一能做的事情是当你感到无聊时,可以将你的文本编辑区里的文本执行一个“元胞自动机”动画,看起来还算解压。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-10-11-33.png" +width="547" +height="614" +loading="lazy" +class="gallery-image" +data-flex-grow="89" +data-flex-basis="213px" +></p> +</li> +<li> +<p><a class="link" href="https://www.futurepedia.io/" target="_blank" rel="noopener" +>最大的 AI 工具箱</a>,喜欢研究 AI 的不要错过这个网站,收集了各种 AI 模型的开源项目和相关网址,涵盖了图像识别、自然语言处理等常见的、时兴的 AI 技术。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-017-%E6%9C%9F/2023-01-16-10-15-15.png" +width="1151" +height="729" +loading="lazy" +class="gallery-image" +data-flex-grow="157" +data-flex-basis="378px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 016 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/Tue, 10 Jan 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/<h1 id="机器文摘-第-016-期">机器文摘 第 016 期</h1> +<h2 id="长文">长文</h2> +<h3 id="黑客与汽车httpssamcurrynetweb-hackers-vs-the-auto-industry"><a class="link" href="https://samcurry.net/web-hackers-vs-the-auto-industry/" target="_blank" rel="noopener" +>黑客与汽车</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-13-16-50.png" +width="680" +height="414" +loading="lazy" +class="gallery-image" +data-flex-grow="164" +data-flex-basis="394px" +> +现在的汽车很多都具有联网的能力,可以通过互联网进行便利的远程操作。</p> +<p>比如获取汽车位置、健康状态、远程启动、远程开门等等。</p> +<p>作为消费者来说,在使用这些便利功能的时候,内心是十分信任厂商的。</p> +<p>觉得安全问题肯定会被厂商非常重视,作为头号问题来抓。</p> +<p>然而这篇<a class="link" href="https://samcurry.net/web-hackers-vs-the-auto-industry/" target="_blank" rel="noopener" +>《黑客与汽车》</a>却改变了我的看法,原来这些车联网的安全防护如此的脆弱。</p> +<p>文章作者为业内人士,写的还比较实在。如下列举部分这些黑客可以对车进行的未授权操作:</p> +<ol> +<li>远程发动机启停、车门解锁与锁定、大灯闪烁、喇叭鸣笛;</li> +<li>锁定用户,迁移管理权;</li> +<li>根据车架号下载到用户的销售档案;</li> +<li>远程刷新更新车辆电脑固件;</li> +<li>跟踪车辆物理GPS位置;</li> +</ol> +<p>看完我感觉是不是得把我的相关车联网服务给停一停了。</p> +<h3 id="汇编代码阅读指南httpswwwtimdbgcompostsfakers-guide-to-assembly"><a class="link" href="https://www.timdbg.com/posts/fakers-guide-to-assembly/" target="_blank" rel="noopener" +>汇编代码阅读指南</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-13-30-23.png" +width="1061" +height="636" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="400px" +> +写汇编代码很麻烦,阅读起来也很费劲吗?</p> +<p>这儿有<a class="link" href="https://www.timdbg.com/posts/fakers-guide-to-assembly/" target="_blank" rel="noopener" +>一份简要的汇编阅读指南</a>,作者介绍了一些汇编代码的阅读技巧。</p> +<p>因为根据统计显示,最常用的汇编指令也就那么十来个,所以并没有想象中的那么晦涩和高深莫测。</p> +<h3 id="使用-svg-绘制逼真的绳索httpsmuffinmanioblogdraw-svg-rope-using-javascript"><a class="link" href="https://muffinman.io/blog/draw-svg-rope-using-javascript/" target="_blank" rel="noopener" +>使用 SVG 绘制逼真的绳索</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-13-38-11.png" +width="786" +height="342" +loading="lazy" +class="gallery-image" +data-flex-grow="229" +data-flex-basis="551px" +> +SVG 是在网页中进行矢量绘图的技术,比起 Canvas 画板的像素图像,SVG 具有放大不失真的特点,在网页中可以通过 Javascript 操作生成 SVG 图形对象,实现各种复杂的图案。</p> +<p>这篇文章的作者从几何的角度考虑了如何使用矢量图形来绘制一个现实中的麻绳图案,要不仅体现出绳索的扭曲,还要正确表现绳索分支之间的叠压,作者提出了一个巧妙的使用 SVG path 进行实现的方法。还给出了代码。</p> +<p>你要问作者为什么这么做,有什么用没有?我想作者可能会回答:Because I can !</p> +<h3 id="ssh-进阶用法介绍httpsplantegggithubio20190602e58fb2e4b88ae69c80e585a8_ssh_e69a97e9bb91e68a80e5b7a7e8afa6e8a7a3--e694b6e8978fe4bf9de5b9b3e5ae89"><a class="link" href="https://plantegg.github.io/2019/06/02/%E5%8F%B2%E4%B8%8A%E6%9C%80%E5%85%A8_SSH_%E6%9A%97%E9%BB%91%E6%8A%80%E5%B7%A7%E8%AF%A6%E8%A7%A3--%E6%94%B6%E8%97%8F%E4%BF%9D%E5%B9%B3%E5%AE%89/" target="_blank" rel="noopener" +>SSH 进阶用法介绍</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-13-55-02.png" +width="800" +height="480" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="400px" +></p> +<p>经常在 Linux 系统下进行开发或者运维的专业人士,可能每天使用最多的工具就是 SSH 了,每天都要通过它登录服务端系统,进行一系列的操作。</p> +<p>这里<a class="link" href="https://plantegg.github.io/2019/06/02/%E5%8F%B2%E4%B8%8A%E6%9C%80%E5%85%A8_SSH_%E6%9A%97%E9%BB%91%E6%8A%80%E5%B7%A7%E8%AF%A6%E8%A7%A3--%E6%94%B6%E8%97%8F%E4%BF%9D%E5%B9%B3%E5%AE%89/" target="_blank" rel="noopener" +>有一篇文章</a>比较全面地介绍了 SSH 的进阶使用技巧,可以在某种程度上极大提升效率以及操作体验。</p> +<p>列举部分如下:</p> +<ol> +<li>如何免密码登录;</li> +<li>如何映射服务端的服务端口到本地(以方便调试);</li> +<li>如何将服务端的图形界面(如xcalc)代理到本地电脑显示和交互(不是远程桌面哦);</li> +<li>一些网络端口映射之类的高级操作;</li> +</ol> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://gist.github.com/sbabybird/c340dee0fbec2e1dfe4a1c49d311cf4b" target="_blank" rel="noopener" +>个人年终总结模板</a>,我做了一个基于 Markdown 语法的年终总结模板,方便梳理在编写个人总结时的思路,放在 github 上的 gist 里了,可以随意使用。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-13-57-40.png" +width="416" +height="486" +loading="lazy" +class="gallery-image" +data-flex-grow="85" +data-flex-basis="205px" +></p> +</li> +<li> +<p><a class="link" href="https://www.webdesignmuseum.org/" target="_blank" rel="noopener" +>web 网页设计博物馆</a>,一个保存古老网页设计的网站。记录了 1999 年到 2020 年各大公司的网页设计变迁。包括谷歌、亚马逊、苹果、任天堂、麦当劳等等。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-14-01-04.png" +width="918" +height="568" +loading="lazy" +class="gallery-image" +data-flex-grow="161" +data-flex-basis="387px" +></p> +</li> +<li> +<p><a class="link" href="https://allinone.tools/" target="_blank" rel="noopener" +>一站式网页工具大全</a>,一堆的在线工具汇总,包括图片处理、PDF格式转换、文字编码转换、密码生成、字符串加密解密等等,常用工具一网打尽。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-14-05-09.png" +width="1320" +height="570" +loading="lazy" +class="gallery-image" +data-flex-grow="231" +data-flex-basis="555px" +></p> +</li> +<li> +<p><a class="link" href="https://gamepad-tester.com/" target="_blank" rel="noopener" +>在线手柄测试工具</a>,打开网页即可测试游戏手柄的工作状态,按键是否灵敏,遥感是否有死区等等,非常方便。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-016-%E6%9C%9F/2023-01-10-14-11-28.png" +width="930" +height="614" +loading="lazy" +class="gallery-image" +data-flex-grow="151" +data-flex-basis="363px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 015 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/Tue, 03 Jan 2023 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/<h1 id="机器文摘-第-015-期">机器文摘 第 015 期</h1> +<h2 id="长文">长文</h2> +<h3 id="编程就是玩儿httpsaustinhenleycomblogprogrammingasplayhtml"><a class="link" href="https://austinhenley.com/blog/programmingasplay.html" target="_blank" rel="noopener" +>编程就是玩儿</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-13-43-13.png" +width="804" +height="355" +loading="lazy" +class="gallery-image" +data-flex-grow="226" +data-flex-basis="543px" +></p> +<p>对于程序员或者技术从业者来说,以一种什么样的心态工作将十分影响成果的产出。</p> +<p><a class="link" href="https://austinhenley.com/blog/programmingasplay.html" target="_blank" rel="noopener" +>这篇文章</a>的作者给大家分享了他自己的感受&mdash;-“不把编程视为严肃的工作、目标只是玩得开心、为了好玩而编程”。</p> +<p>他同时也是 <a class="link" href="https://news.ycombinator.com/item?id=27256867" target="_blank" rel="noopener" +>《为什么我喜欢做无用的东西》</a>帖子的作者。</p> +<p>除了文章本身之外,<a class="link" href="https://news.ycombinator.com/item?id=34086416" target="_blank" rel="noopener" +>在 HN 配套的讨论帖子在这里</a>。</p> +<p>这种类似于“寓教于乐”、“做自己开心的事儿”等等内容,一直是一个值得探讨的话题。</p> +<p>我个人也倾向于以兴趣和爱好来驱动自己,只是如果这个兴趣和爱好顺便能够挣钱,那就更好了。</p> +<h3 id="webassembly没有容器的-dockerhttpswasmlabsdevarticlesdocker-without-containers"><a class="link" href="https://wasmlabs.dev/articles/docker-without-containers/" target="_blank" rel="noopener" +>WebAssembly:没有容器的 Docker</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-13-45-15.png" +width="3483" +height="1436" +loading="lazy" +class="gallery-image" +data-flex-grow="242" +data-flex-basis="582px" +></p> +<p>最近 <a class="link" href="https://www.docker.com" target="_blank" rel="noopener" +>Docker</a> 宣布与 <a class="link" href="https://github.com/WasmEdge/Wasmedge" target="_blank" rel="noopener" +>WasmEdge</a> 合作支持 WebAssembly 。</p> +<p>WebAssembly 和 Docker 我们都听说过,在前面的文摘中我还尝试过自己使用 Rust 编写运行在网页里的 WebAssembly 应用程序。</p> +<p>Docker 也是我工作中每天都要用到的容器技术。</p> +<p>那他们两个有什么关系?放在一起能碰撞出什么火花?</p> +<p><a class="link" href="https://wasmlabs.dev/articles/docker-without-containers/" target="_blank" rel="noopener" +>这篇文章</a>将讲解这两种技术的结合在云原生架构下的使用。</p> +<p>看来 WebAssembly 技术不仅可以在浏览器环境中发挥作用,还能在云计算、边缘计算等领域发光发热,前途不可限量嘛。</p> +<h3 id="3d-摄影测量建模技术httpswwwjeffgeerlingcomblog2021modeling-my-grandpa-3d-photogrammetry"><a class="link" href="https://www.jeffgeerling.com/blog/2021/modeling-my-grandpa-3d-photogrammetry" target="_blank" rel="noopener" +>3D 摄影测量建模技术</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-13-58-29.png" +width="712" +height="340" +loading="lazy" +class="gallery-image" +data-flex-grow="209" +data-flex-basis="502px" +></p> +<p>3D 摄影测量建模,是一种通过对物体多角度拍摄照片,然后使用计算机通过软件算法合成为 3D 模型的技术。</p> +<p>从最开始在专业领域(如:建筑工程、考古)使用,到现在已经普及到普通人只需安装手机 App 也能轻松实现了。</p> +<p>这篇<a class="link" href="https://www.jeffgeerling.com/blog/2021/modeling-my-grandpa-3d-photogrammetry" target="_blank" rel="noopener" +>用3D摄影测量法对我的爷爷建模</a>记述了作者如何使用 3D 摄影测量建模技术给自己爷爷的雕像进行“数字化”的过程。</p> +<p>里面详细记录了整个过程所使用的开源软件和相关的配置细节。</p> +<p>对于一些想要进行一次实操演练的朋友来说可能有用。</p> +<h3 id="在-2d-游戏中如何模拟-3d-的光影效果httpswwwgamedevelopercomprogramminggraveyard-keeper-how-the-graphics-effects-are-made"><a class="link" href="https://www.gamedeveloper.com/programming/graveyard-keeper-how-the-graphics-effects-are-made" target="_blank" rel="noopener" +>在 2D 游戏中如何模拟 3D 的光影效果</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-14-14-17.png" +width="454" +height="265" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="411px" +></p> +<p>《守墓人》是一款经典的 2D 角色扮演游戏,比起它的精彩剧情和有趣的玩法,出色的画面效果也是该游戏取得成功的重要原因。</p> +<p>这篇<a class="link" href="https://www.gamedeveloper.com/programming/graveyard-keeper-how-the-graphics-effects-are-made" target="_blank" rel="noopener" +>《守墓人的图形效果是如何制作的》</a>文章,由该游戏的核心开发者于 2018 年发表,讲述了很多关于实现在 2D 画面带来更加有立体光影效果的特殊技巧。</p> +<p>文章虽然老了一点,但是技术没有过时。</p> +<p>读进去可以深深体会到:一个优秀作品的创造,离不开对各种不可能的挑战和极限的突破。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://bluemaxima.org/flashpoint/" target="_blank" rel="noopener" +>Flash 游戏大全</a>,上一期里我摘录了一个关于复刻 Flash 游戏的故事。后来也勾起了我对于 Flash 小游戏的怀念。便深入探索了一下现在这个阶段该如何再去运行那些老游戏。Flashpoint 是一个 Web 游戏保存工程,号称已经累计保存了包括 Flash 在内的 35 个平台的超过十万个小游戏。这个工程在 2018 年 1 月启动,试图在 Flash 消亡之前将之前的经典内容进行备份。现在提供两种版本的下载包,一种全量下载的大概 1.3 TB,包含了全部游戏。一种增量下载的,700多MB,只带了部分游戏,但是支持随下随玩。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-14-33-07.png" +width="1001" +height="382" +loading="lazy" +class="gallery-image" +data-flex-grow="262" +data-flex-basis="628px" +></p> +</li> +<li> +<p><a class="link" href="https://sweetcocoa.github.io/pop2piano_samples/" target="_blank" rel="noopener" +>根据音频自动生成钢琴旋律</a>,一个开源的 AI 模型,可以根据歌曲的音频识别出里面的旋律主线,并且使用钢琴演奏出来,效果十分神奇。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-14-41-36.png" +width="741" +height="456" +loading="lazy" +class="gallery-image" +data-flex-grow="162" +data-flex-basis="390px" +></p> +</li> +<li> +<p><a class="link" href="https://virtualconsoles.com/online-emulators/c64/" target="_blank" rel="noopener" +>C64 Emulator</a>,一个在线的 commodore 64 电脑模拟器,可以直接将磁盘镜像拖拽到网页上进行加载,页面还提供了虚拟键盘。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-14-44-02.png" +width="643" +height="733" +loading="lazy" +class="gallery-image" +data-flex-grow="87" +data-flex-basis="210px" +></p> +</li> +<li> +<p><a class="link" href="https://shadiao.pro/" target="_blank" rel="noopener" +>沙雕 App</a>,收集了各种有趣网站、工具的导航站,之前就关注过,最近好像升级了,喜欢恶搞的同学可以到里面找到一些比较有恶趣味的小程序。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-015-%E6%9C%9F/2023-01-03-14-47-42.png" +width="676" +height="371" +loading="lazy" +class="gallery-image" +data-flex-grow="182" +data-flex-basis="437px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 014 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/Tue, 27 Dec 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/<h1 id="机器文摘-第-014-期">机器文摘 第 014 期</h1> +<h2 id="长文">长文</h2> +<h3 id="运行在单片机上的-qthttpsdecovardevblog20221224qt-on-mcu"><a class="link" href="https://decovar.dev/blog/2022/12/24/qt-on-mcu/" target="_blank" rel="noopener" +>运行在单片机上的 Qt</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-13-43-13.png" +width="684" +height="456" +loading="lazy" +class="gallery-image" +data-flex-grow="150" +data-flex-basis="360px" +></p> +<p>尝试过给单片机写图形界面没有?</p> +<p>这篇 <a class="link" href="https://decovar.dev/blog/2022/12/24/qt-on-mcu/" target="_blank" rel="noopener" +>《Qt on MCU》 </a>比较系统的介绍了“为什么选择 Qt(一套开源图形界面库) 给单片机做界面”、“Qt 的基本架构”、“程序移植性”等相关问题。</p> +<p>读完可以较为全面地了解在单片机这种机能较弱的硬件设备上制作图形界面的基本思路和需要关注的问题。</p> +<h3 id="openwrtlede-搭建-syncthing-p2p-私有文件同步服务httpschenhemepostopenwrt-syncthing"><a class="link" href="https://chenhe.me/post/openwrt-syncthing/" target="_blank" rel="noopener" +>OpenWrt/LEDE 搭建 Syncthing p2p 私有文件同步服务</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-13-56-50.png" +width="1251" +height="730" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="411px" +></p> +<p>现在大家都不止一个电子终端设备,个人数字信息、各种数据文件的同步需求基本上是一个刚需。</p> +<p>有很多厂商提供了收费方案,比较常见的有国内的各种网盘、手机厂商提供的各种 Cloud 服务等等。</p> +<p>如果想基于家庭网络自己动手搭建一个私有服务的话,可能略微麻烦一些,不过也有较为成熟的方案了。</p> +<p>条件具备的话不妨参考这篇<a class="link" href="https://chenhe.me/post/openwrt-syncthing/" target="_blank" rel="noopener" +>《OpenWrt/LEDE 搭建 Syncthing p2p 私有文件同步服务》</a>动手试一试。</p> +<h3 id="用-flash-高清重制一款游戏httpswwwjiqizhixincomarticles2022-12-22-2"><a class="link" href="https://www.jiqizhixin.com/articles/2022-12-22-2" target="_blank" rel="noopener" +>用 Flash 高清重制一款游戏</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-13-58-23.png" +width="600" +height="338" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></p> +<p>Flash 基本已经成为历史了。</p> +<p>即便现在可以通过一些渠道或者浏览器勉强开启 Flash 插件的话,也会提心掉胆地担心计算机的安全性。</p> +<p>毕竟那些恼人的弹窗广告有 80% 都是靠 Flash 技术实现的。</p> +<p>但是还有这么一群人,他们玩着 4399 上的小游戏长大,80 后喜欢的各种主机游戏在他们眼里根本不值一提,倒是网页上那种基于 Flash 制作的即开即玩的小游戏(比如我能想到的就有:黄金矿工、狂扁小朋友、打企鹅等等)才是他们的最爱。</p> +<p>Flash 技术被时代抛弃,那些 4399 们也就逐渐消失了。</p> +<p>不过总有人会拥抱情怀,这篇<a class="link" href="https://www.jiqizhixin.com/articles/2022-12-22-2" target="_blank" rel="noopener" +>《为拯救童年回忆,开发者决定采用古法编程》</a>便讲述了这样一个故事。</p> +<p>里面的哥们儿以极其硬核的方式实现了他的梦想,为了复刻一个 Flash 小游戏,他几乎重新写了一个 Flash 播放器。</p> +<h3 id="unix-终端系统tty是如何工作的httpswaynervcompostshow-tty-system-works"><a class="link" href="https://waynerv.com/posts/how-tty-system-works/" target="_blank" rel="noopener" +>Unix 终端系统(TTY)是如何工作的</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-14-09-23.png" +width="2560" +height="2272" +loading="lazy" +class="gallery-image" +data-flex-grow="112" +data-flex-basis="270px" +></p> +<p>没有使用过大型机而直接进入 PC 时代的计算机用户,可能觉得“终端”就是电脑上那个能够输入 CMD 命令的黑乎乎窗口吧。</p> +<p>即便是终日与命令行打交道的软件开发人员、系统运维人员,可能也很难一下子解释清楚什么是“终端”,它为什么叫这个名字。</p> +<p>这篇<a class="link" href="https://waynerv.com/posts/how-tty-system-works/" target="_blank" rel="noopener" +>《Unix 终端系统(TTY)是如何工作的》</a>从计算机硬件发展的历史出发,介绍了计算机系统跟用户交互的发展历程,并针对“终端”系统进行详细展开,讲解了实现原理和后来发展的现代形态。</p> +<p>喜欢硬核知识的朋友可点进去阅读一下。</p> +<h3 id="hn-讨论极大提升你效率的软件有哪些httpsnewsycombinatorcomitemid34069106"><a class="link" href="https://news.ycombinator.com/item?id=34069106" target="_blank" rel="noopener" +>HN 讨论:极大提升你效率的软件有哪些?</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-14-16-52.png" +width="776" +height="403" +loading="lazy" +class="gallery-image" +data-flex-grow="192" +data-flex-basis="462px" +></p> +<p>哪些软件最能节约你的时间、解放你的双手、使你离不开它?</p> +<p>这个话题几乎每过一段时间就会被拿出来讨论一番。</p> +<p>每个人都有自己的偏爱。</p> +<p>不过,看看大家的讨论,说不定也能发现一些新鲜的软件,也许能更新一下自己的工具库也说不定。</p> +<blockquote> +<p>比如上面这篇帖子里,楼主提到的 <a class="link" href="https://github.com/BurntSushi/xsv" target="_blank" rel="noopener" +>这个 csv 工具</a> ,可以在命令行让你高效对 csv 文件进行快速检索、合并查询、切片等等。 +不过帖子里可能有人把节奏带偏了,在下面大吹特吹各种 IDE 软件,就仁者见仁了。</p> +</blockquote> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://huili.github.io/" target="_blank" rel="noopener" +>SQlite源码分析</a>,一本讲解 SQlite 源码的在线电子书,主要对 SQLite 数据库的实现机制和使用方法做了简要分析。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-14-25-49.png" +width="804" +height="424" +loading="lazy" +class="gallery-image" +data-flex-grow="189" +data-flex-basis="455px" +></p> +</li> +<li> +<p><a class="link" href="https://retrogame.com.ua/2022/03/moarstalgia-windows-98-3dfx-amp-dos-retro-gaming-pack/" target="_blank" rel="noopener" +>经典复古 win98 游戏合集</a>,一个游戏整合包,里面整合了若干在 Win98 系统下才能跑的老游戏,像初代的雷神之锤、半条命、极品飞车等等。提供了基于 DosBox 的虚拟系统,即开即用,性能还不错。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-14-33-08.png" +width="656" +height="387" +loading="lazy" +class="gallery-image" +data-flex-grow="169" +data-flex-basis="406px" +></p> +</li> +<li> +<p><a class="link" href="http://www.doshaven.eu/programming-tools/" target="_blank" rel="noopener" +>DOS 系统下的编程工具合集</a>,想要重温在 DOS 环境下编程的感受,这里有一套比较全面的工具合集,包括 QBASIC、TurboC 等开发环境,以及一些用于游戏开发的图形库、引擎。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-14-59-31.png" +width="908" +height="527" +loading="lazy" +class="gallery-image" +data-flex-grow="172" +data-flex-basis="413px" +></p> +</li> +<li> +<p><a class="link" href="https://humanbenchmark.com/dashboard" target="_blank" rel="noopener" +>给你自己跑个分</a>,现在一些硬件评测动不动就使用软件进行跑分,用以展示硬件之间的形成差异,这个网站提供了一组小游戏,可以考验你的短期记忆力、反应能力,并给你打分。也试试给自己跑个分吧。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-014-%E6%9C%9F/2022-12-27-15-05-15.png" +width="900" +height="511" +loading="lazy" +class="gallery-image" +data-flex-grow="176" +data-flex-basis="422px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 012 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/Tue, 13 Dec 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/<h1 id="机器文摘-第-012-期">机器文摘 第 012 期</h1> +<h2 id="长文">长文</h2> +<h3 id="github-登录被第三方网站滥用了吗">Github 登录被第三方网站滥用了吗?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-13-30-19.png" +width="494" +height="491" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="241px" +> +为了方便账号注册,现在很多网站都提供了基于 Github 账号登录的方式。</p> +<p>我个人也更倾向于使用这种方式登录。</p> +<p>毕竟可以少填一些注册信息,减少思考密码的麻烦。</p> +<p>但是这样做有什么安全问题没有?</p> +<p>上周有一个<a class="link" href="https://news.ycombinator.com/item?id=33917962" target="_blank" rel="noopener" +>在 HackerNews 上的帖子</a>,有人遇到了在使用 Github 账号登录某些网站之后,导致他的账号莫名给别的仓库添 Star 的情况。</p> +<p>这引发了大家关于 Github 账号权限管理以及通过第三方鉴权进行账号登录和注册的讨论。</p> +<p>看完觉得在第三方鉴权授权时还是应该慎重使用才好。</p> +<h3 id="每个黑客都知道的命令行快捷键">每个黑客都知道的命令行快捷键</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-13-41-23.png" +width="926" +height="636" +loading="lazy" +class="gallery-image" +data-flex-grow="145" +data-flex-basis="349px" +> +在图形化界面、触控操作交互界面已经十分普及的今天,普通用户可能现在很少能接触到命令行操作了。</p> +<p>但是对于软件开发者、IT运维工程师来说,命令行还是属于离不开的操作界面。</p> +<p>而且对于有些工作任务来说,使用命令行完成起来要更加高效。</p> +<p><a class="link" href="https://www.masteringemacs.org/article/keyboard-shortcuts-every-command-line-hacker-should-know-about-gnu-readline" target="_blank" rel="noopener" +>这篇文章</a>讲解了常见命令行交互时的一些快捷操作,比如常见的行内编辑、快速移动光标到命令开头、历史记录搜索等等。</p> +<p>掌握之后可以在各种命令行交互界面中进行使用(基本风格一致)。</p> +<h3 id="基于颜色循环的动画技术">基于颜色循环的动画技术</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-13-54-06.png" +width="509" +height="383" +loading="lazy" +class="gallery-image" +data-flex-grow="132" +data-flex-basis="318px" +> +在计算机硬件资源匮乏的上世纪 90 年代,开发人员为了在有限条件下实现丰富的效果真是挖空心思。</p> +<p>比如,还记得 Windows 98 的启动画面吗?</p> +<p>蓝天白云,Windows 徽标,底部有一个蓝色的渐变色条,在缓慢的滚动。</p> +<p>实际上它只是一幅图片,并非多帧动画。</p> +<p>这就用到了一个叫做<a class="link" href="https://en.wikipedia.org/wiki/Color_cycling" target="_blank" rel="noopener" +>“颜色循环”</a>的技术。</p> +<blockquote> +<p>来自维基百科:颜色循环,也称为调色板移动,是计算机图形学中使用的一种技术,其中颜色被更改以产生动画的假象。这种技术主要用于早期的电脑游戏,因为存储一个图像并更改其调色板比将动画存储为几帧需要更少的内存和处理器能力。</p> +</blockquote> +<p><a class="link" href="http://www.effectgames.com/effect/article-Old_School_Color_Cycling_with_HTML5.html" target="_blank" rel="noopener" +>这里有个博客</a>使用 HTML Canvas 复刻了一批采用颜色循环创作的作品,效果非常惊艳。</p> +<p>另外网站还开源了用于展示这些作品的图形引擎,虽然现在已经不再维护了,但是用于学习和探索还是很有研究意义。</p> +<h3 id="软件逆向工程入门">软件逆向工程入门</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-14-06-08.png" +width="716" +height="442" +loading="lazy" +class="gallery-image" +data-flex-grow="161" +data-flex-basis="388px" +> +软件的加密和破解在普通用户眼里十分神秘。</p> +<p>这篇<a class="link" href="https://to-be-deleted-in-2022.emily.st/2015/01/27/reverse-engineering/" target="_blank" rel="noopener" +>软件逆向工程入门</a>比较深入浅出地介绍了一些常用手法,跟着作者可以浅尝一下在内存中寻找注册号、修改汇编指令以使得软件保护失效等体验。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="http://nifty.stanford.edu/" target="_blank" rel="noopener" +>计算机课后作业</a>,斯坦福大学计算机专业评选的历年来优秀作业作品。如果不知道自己编程需要练习什么的话,可以打开参考参考,很有实用价值,比起在 Leecode 上刷算法的题目,这些作业都在解决实际问题。</p> +</li> +<li> +<p><a class="link" href="https://scholar.archive.org/" target="_blank" rel="noopener" +>互联网档案学术</a>,全文检索索引包含超过2500万的研究文章和其他保存在互联网档案馆里的学术文档。 该馆藏涵盖从18世纪期刊的数字化副本,到最新的Open Access会议记录和从万维网上抓取的预印本。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-14-19-26.png" +width="1113" +height="507" +loading="lazy" +class="gallery-image" +data-flex-grow="219" +data-flex-basis="526px" +></p> +</li> +<li> +<p><a class="link" href="https://playcanvas.com/" target="_blank" rel="noopener" +>PlayCanvas Web 优先的游戏引擎</a>,一个免费的游戏引擎,倡导以 Web 优先,在网页中提供从开发到发行的全部流程支持。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-14-23-40.png" +width="961" +height="655" +loading="lazy" +class="gallery-image" +data-flex-grow="146" +data-flex-basis="352px" +></p> +</li> +<li> +<p><a class="link" href="https://asciinema.org/" target="_blank" rel="noopener" +>命令行会话记录器</a>,Asciinema 是一个免费开源软件,用于帮助用户录制在命令行中的操作行为,便于在互联网上分发自己的操作示范、教学演示。比起直接视频录屏的方式,这种以字符方式的记录更加节约资源,无论是记录、传播还是回放环节,都很轻量。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-14-29-43.png" +width="631" +height="383" +loading="lazy" +class="gallery-image" +data-flex-grow="164" +data-flex-basis="395px" +></p> +</li> +<li> +<p><a class="link" href="https://matthias-research.github.io/pages/tenMinutePhysics/index.html" target="_blank" rel="noopener" +>十分钟物理</a>,这套教程集合了一组十分钟左右的视频短片,每次介绍一个基本的物理概念并通过 Web 前端技术编程实现模拟。除了视频之外,网站还提供了源代码、演示环境等配套资源。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-14-32-47.png" +width="1191" +height="666" +loading="lazy" +class="gallery-image" +data-flex-grow="178" +data-flex-basis="429px" +></p> +</li> +<li> +<p><a class="link" href="http://skilldrick.github.io/easy6502/" target="_blank" rel="noopener" +>Easy6502</a>,一本学习 6502 汇编的电子书(没错,我就是特别喜欢这款 CPU)。网站带有交互界面,提供了一个简易模拟器,可以边学边练,教程最后会带你实现一个基于汇编的贪食蛇游戏。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-012-%E6%9C%9F/2022-12-13-14-43-13.png" +width="608" +height="484" +loading="lazy" +class="gallery-image" +data-flex-grow="125" +data-flex-basis="301px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 013 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/Mon, 12 Dec 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/<h1 id="机器文摘-第-013-期">机器文摘 第 013 期</h1> +<h2 id="长文">长文</h2> +<h3 id="从古董电脑中我们能学到什么httpsgithubcomreadmefeaturedvintage-computing"><a class="link" href="https://github.com/readme/featured/vintage-computing" target="_blank" rel="noopener" +>从古董电脑中我们能学到什么</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-09-36-43.png" +width="1182" +height="689" +loading="lazy" +class="gallery-image" +data-flex-grow="171" +data-flex-basis="411px" +></p> +<p>我也不知道为什么自己会对老旧电脑,尤其是上世纪80年代、90年代出品的电脑这么迷恋。</p> +<p>我觉得那个时代的电脑散发着一种难以名状的工业气质。</p> +<p>通过阅读<a class="link" href="https://github.com/readme/featured/vintage-computing" target="_blank" rel="noopener" +>这篇文章</a>,使我意识到一些深层次的原因。</p> +<p>这些老式电脑的魅力来自于当时技术的限制、简单粗暴和直接。</p> +<p>通过深入了解这些老古董、学习开发那个时代的软件,可以更容易地了解计算机科学。</p> +<p>毕竟,现在的计算机已经充分的复杂和“人性化”,软件把硬件包裹得越来越严实和抽象。以至于根本看不清它的内部构造和实现原理。</p> +<p>去研究那些古董电脑吧,操作那些裸漏单纯的硬件接口,贴近更加具体的科技。</p> +<h3 id="蛋httpwwwgalactanetcomoneofftheegg_zhhtml"><a class="link" href="http://www.galactanet.com/oneoff/theegg_zh.html" target="_blank" rel="noopener" +>蛋</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-09-49-07.png" +width="1024" +height="512" +loading="lazy" +class="gallery-image" +data-flex-grow="200" +data-flex-basis="480px" +></p> +<p>这是一篇很富有哲理的小小说,严格来说跟机器没有关系。</p> +<p>但是写的实在是很好,忍不住收录进来。</p> +<p>毕竟,喜欢机器的人,很难抗拒这种对宇宙天马行空的探索。</p> +<h3 id="rlhf-模型详解httpshuggingfacecoblogrlhf"><a class="link" href="https://huggingface.co/blog/rlhf" target="_blank" rel="noopener" +>RLHF 模型详解</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-09-54-30.png" +width="1450" +height="1338" +loading="lazy" +class="gallery-image" +data-flex-grow="108" +data-flex-basis="260px" +></p> +<p>近期 AI 圈最火的事情,莫过于 OpenAI 发布的聊天机器人 ChatGPT 了。</p> +<p>这个智能聊天机器人已经强大到可以让人担忧的地步了。</p> +<p>那么,它背后的实现原理是什么?</p> +<p><a class="link" href="https://huggingface.co/blog/rlhf" target="_blank" rel="noopener" +>这篇文章</a>讲解了 ChatGPT 所使用的 RLHF(人类反馈强化学习) 模型是如何实现的以及它的未来会怎样发展。</p> +<h3 id="基于扩散模型生成音乐httpswwwriffusioncomabout"><a class="link" href="https://www.riffusion.com/about" target="_blank" rel="noopener" +>基于扩散模型生成音乐</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-10-03-35.png" +width="540" +height="378" +loading="lazy" +class="gallery-image" +data-flex-grow="142" +data-flex-basis="342px" +></p> +<p>基于文本生成图像的扩散模型已经火了一段时间了。</p> +<p>我当时还在想,既然基于扩散模型可以生成图像的话,那能不能生成声音呢?</p> +<p>结果我只是动了动念头,人家这边已经把成果拿出来了。</p> +<p><a class="link" href="https://www.riffusion.com/about" target="_blank" rel="noopener" +>这篇文章</a>介绍了他们基于扩散模型生成音乐的项目。</p> +<p>我试听了一下,效果还不错,挺神奇的。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://ittavern.com/getting-started-with-tmux/" target="_blank" rel="noopener" +>tmux 入门</a>,一篇 tmux 的入门教程。tmux 是一个终端程序,可以同时模拟多个客户端控制台,如果觉得不好理解的话,可以认为它是一个控制台的多页签浏览器。因为在工作中经常需要 ssh 登录服务器进行编程开发,我现在已经离不开它了。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-10-12-18.png" +width="701" +height="419" +loading="lazy" +class="gallery-image" +data-flex-grow="167" +data-flex-basis="401px" +></p> +</li> +<li> +<p><a class="link" href="https://oimo.io/works/" target="_blank" rel="noopener" +>一个有趣的个人网站</a>,作者是一个日本在读博士生,网站放了一些个人的编程作品,主要跟物理模拟、像素艺术有关。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-10-14-33.png" +width="915" +height="450" +loading="lazy" +class="gallery-image" +data-flex-grow="203" +data-flex-basis="488px" +></p> +</li> +<li> +<p><a class="link" href="https://www.hello-algo.com/" target="_blank" rel="noopener" +>你好,算法</a>,一本开源电子书,可在线阅读,深入浅出讲解数据结构和算法,生动有趣,适合有一定编程基础但是算法这块有些薄弱的爱好者阅读。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-10-20-26.png" +width="3144" +height="2319" +loading="lazy" +class="gallery-image" +data-flex-grow="135" +data-flex-basis="325px" +></p> +</li> +<li> +<p><a class="link" href="https://nbviewer.org/github/gpeyre/numerical-tours/blob/master/python/ml_6_nn.ipynb" target="_blank" rel="noopener" +>神经网络在线教程</a>,一套神经网络编程教程,提供在线的 python 代码阅读环境,适合作为入门资料学习。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-013-%E6%9C%9F/2022-12-21-10-23-10.png" +width="388" +height="262" +loading="lazy" +class="gallery-image" +data-flex-grow="148" +data-flex-basis="355px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 011 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/Wed, 07 Dec 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/<h1 id="机器文摘-第-011-期">机器文摘 第 011 期</h1> +<h2 id="长文">长文</h2> +<h3 id="自己动手做一个天气墨水屏">自己动手做一个天气墨水屏</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-13-22.png" +width="617" +height="455" +loading="lazy" +class="gallery-image" +data-flex-grow="135" +data-flex-basis="325px" +> +有个喜欢动手的哥们,发现了自己及家人的一项小需求,即从家出门的时候想快速知道天气情况。</p> +<p>虽然这种需求抬眼看一下手机也能实现,但是本着“懒惰使人进步”的核心思想(作者懒得掏出手机)他动手实现了一套基于电池供电的可以显示天气预报信息的电子墨水屏。</p> +<p>这篇<a class="link" href="https://kimmo.blog/posts/7-building-eink-weather-display-for-our-home/" target="_blank" rel="noopener" +>《做一个天气墨水屏》</a>记录了作者从诞生点子到产品出炉的全过程。</p> +<p>另外作者还开源了项目的源代码,<a class="link" href="https://github.com/kimmobrunfeldt/eink-weather-display" target="_blank" rel="noopener" +>可在这里获取</a>。</p> +<h3 id="m1-gpu-的故事">M1 GPU 的故事</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-21-23.png" +width="985" +height="614" +loading="lazy" +class="gallery-image" +data-flex-grow="160" +data-flex-basis="385px" +> +GPU 大家都知道,<a class="link" href="https://asahilinux.org/2022/11/tales-of-the-m1-gpu/" target="_blank" rel="noopener" +>这里有篇文章介绍了它的工作细节</a>。</p> +<p>作者来自一个给苹果 M1 芯片适配 Linux 驱动的团队(苹果官方不提供驱动,所以这意味着需要做一些逆向工程)。</p> +<p>本文记录了这些工作中比较有趣的部分,还顺便介绍了 GPU 的一些底层工作原理。</p> +<h3 id="在-commodore-64-上实现位图滚动条的显示">在 Commodore 64 上实现位图滚动条的显示</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-37-41.png" +width="386" +height="338" +loading="lazy" +class="gallery-image" +data-flex-grow="114" +data-flex-basis="274px" +> +Demosense 是一项挖掘计算机硬件机能极限的活动。</p> +<p>通常创作者们会通过各种编程技巧来实现看似无法达到的效果。</p> +<p>由于 Commodore 64 这台古董电脑十分经典,现在仍有不少Demosense爱好者在为它开发程序。</p> +<p><a class="link" href="https://www.c64demo.com/side-border-bitmap-scroller/" target="_blank" rel="noopener" +>这篇文章</a>讲述了著名 C64 demo 程序 <a class="link" href="https://csdb.dk/release/?id=195841" target="_blank" rel="noopener" +>Memento Mori</a> 的实现过程,程序在 Commodore 64 上显示了一副巨大(对于C64来说)的图片。</p> +<p>这在圈内属于首创。</p> +<h3 id="动手做一个-4-位-cpu">动手做一个 4 位 CPU</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-43-28.png" +width="496" +height="370" +loading="lazy" +class="gallery-image" +data-flex-grow="134" +data-flex-basis="321px" +> +计算机组成原理是不是还没学明白?没关系,我们可以自己亲手做一个简单的 CPU 。</p> +<p><a class="link" href="https://www.bigmessowires.com/nibbler/" target="_blank" rel="noopener" +>Nibbler</a> 是一款 4 位 CPU,使用标准 7400 系列逻辑芯片(单个计数器、寄存器、缓冲器和门)构建而成。是一个简单 CPU 的教育示例,易于理解和构建,但仍然能够运行游戏和其他有趣的程序。Nibbler 在 5 x 4 英寸(127 x 102 毫米)穿孔板上使用绕线制造。CPU总共包含17个芯片。</p> +<p>作者公开了设计图纸和相关资料,可在文章内部的链接中获取。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="http://www.craftinginterpreters.com/" target="_blank" rel="noopener" +>纯手撸一个解释器</a>,编译原理没学明白没关系,这本在线电子书手把手教你写一个自己的解释器。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-51-28.png" +width="593" +height="182" +loading="lazy" +class="gallery-image" +data-flex-grow="325" +data-flex-basis="781px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/k88hudson/git-flight-rules/blob/master/README_zh-CN.md" target="_blank" rel="noopener" +>Git 飞行规则 (Flight Rules)</a> ,一个十分全面的 Git 使用指南,把你能遇到的情况都想到了。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-54-49.png" +width="532" +height="541" +loading="lazy" +class="gallery-image" +data-flex-grow="98" +data-flex-basis="236px" +></p> +</li> +<li> +<p><a class="link" href="https://thevaluable.dev/vim-advanced/" target="_blank" rel="noopener" +>Vim 高级进阶</a>,如果你已经学会了怎么退出 Vim,恭喜你,已经击败了 80% 的选手。想要在 Vim 中进行更高效的编辑操作,这份高手指南十分适合作为参考。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-57-10.png" +width="776" +height="511" +loading="lazy" +class="gallery-image" +data-flex-grow="151" +data-flex-basis="364px" +></p> +</li> +<li> +<p><a class="link" href="https://www.joshwcomeau.com/css/interactive-guide-to-flexbox/" target="_blank" rel="noopener" +>Flexbox 布局交互指南</a>,这篇在线教程讲解了如何使用 Flexbox 进行页面布局,难能可贵的是直接在页面中提供了交互操作界面,可以一遍学一遍实践,非常方便。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-09-59-27.png" +width="743" +height="448" +loading="lazy" +class="gallery-image" +data-flex-grow="165" +data-flex-basis="398px" +></p> +</li> +<li> +<p><a class="link" href="https://www.makesense.ai/" target="_blank" rel="noopener" +>在线 AI 标注工具</a>,想要训练自己的 AI 模型,比如目标检测、图像分类等等,可以使用这个在线工具进行数据标注,直接上传图片然后在线标注,完成后可导出 VOC、Coco 等格式的数据集。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-011-%E6%9C%9F/2022-12-07-10-02-46.png" +width="628" +height="391" +loading="lazy" +class="gallery-image" +data-flex-grow="160" +data-flex-basis="385px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 010 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/Tue, 29 Nov 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/<h1 id="机器文摘-第-010-期">机器文摘 第 010 期</h1> +<h2 id="长文">长文</h2> +<h3 id="极客摄影指南">极客摄影指南</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-14-11-12.png" +width="1235" +height="841" +loading="lazy" +class="gallery-image" +data-flex-grow="146" +data-flex-basis="352px" +> +相机,也是机器的一种。</p> +<p>我用它记录生活,捕捉生活中转瞬即逝的美好瞬间。</p> +<p>有个问题一直困扰着我,怎样拍出不那么“到此一游”的照片?</p> +<p>怎样才能“掌控”相机这个机器?</p> +<p>这篇<a class="link" href="https://lcamtuf.coredump.cx/photo_basics/" target="_blank" rel="noopener" +>《极客摄影》(英文)</a>能够帮助你对摄影做一个真正深入的理解(而不是学习那些充斥社交平台的各种浮于表面的“技巧”)。</p> +<p>作者是一个热爱摄影的技术男,有二十多年摄影经验。</p> +<p>听他给你讲讲什么是“光”和“构图”。</p> +<p>一篇就够了。</p> +<h3 id="ms-dos-背后的设计">MS-DOS 背后的设计</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-14-24-37.png" +width="480" +height="512" +loading="lazy" +class="gallery-image" +data-flex-grow="93" +data-flex-basis="225px" +></p> +<p>包括我在内的不少 80 后接触电脑是从 MS-DOS 开始的。</p> +<p>对于它的黑窗口和命令行都有着很深的印象。</p> +<p>上大学时执行最多的命令是<code>format c: /s /q</code></p> +<p>当年还玩过不少在 DOS 平台的游戏,比如仙剑奇侠传、主题医院等等。</p> +<p>只是当时没工夫对系统本身做深入了解。</p> +<p>顶多是,自己在学习汇编语言时,对 DOS 又仔细端详了几眼。</p> +<p>这篇<a class="link" href="https://patersontech.com/Dos/Byte/InsideDos.htm" target="_blank" rel="noopener" +>《凑近看看 MS-DOS 》(英文)</a>,介绍了 DOS 系统的设计标准、内存分配、磁盘文件结构、FAT文件系统的技术细节等等。</p> +<p>想要窥探技术细节的可以点进去看看。</p> +<h3 id="构建最快的-lua-解释器">构建最快的 Lua 解释器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-14-45-43.png" +width="645" +height="386" +loading="lazy" +class="gallery-image" +data-flex-grow="167" +data-flex-basis="401px" +> +给动态语言编写解释器可能不算太难(如果只是能跑的话)。</p> +<p>但是如果要编写一个高性能的、好用的动态语言解释器,比如像谷歌浏览器所用的 V8 引擎那样,就比较困难了。</p> +<p><a class="link" href="https://sillycross.github.io/2022/11/22/2022-11-22/" target="_blank" rel="noopener" +>《构建最快的 Lua 解释器》</a>这篇文章站在更高维度提供一种方法,即:编写一种可以自动生成编译器(解释器)代码的程序,以使得制作高性能解释器变得更加容易。</p> +<p>我看了一下,大概就是自动化生成之前需要手工处理的编译器优化代码。作为编译原理学的不怎么明白的我,对此不敢评论。</p> +<h3 id="为什么-linux-内核没有单元测试">为什么 Linux 内核没有单元测试?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-15-14-46.png" +width="637" +height="411" +loading="lazy" +class="gallery-image" +data-flex-grow="154" +data-flex-basis="371px" +> +我对单元测试的态度一般,既不强烈支持,也不反对。</p> +<p>听说有的开发团队由于对于单元测试十分狂热,已经到了不允许写注释,都用单元测试替代的地步。</p> +<p>前不久,在 HN 上有网友发起了一个引战的讨论:“<a class="link" href="https://news.ycombinator.com/item?id=33742130" target="_blank" rel="noopener" +>既然单元测试这么好,为什么 Linux 内核源码不用呢?</a>”</p> +<p>以下为部分观点:</p> +<blockquote> +<p>单元测试被严重高估了,TDD有一些好主意,但有一段时间它变成了一种宗教。</p> +</blockquote> +<blockquote> +<p>单元测试与TDD宗教不是一回事。它只是意味着将事物划分为小单元并尽可能详尽地测试其功能。</p> +</blockquote> +<blockquote> +<p>SQLite不是反例吗?他们有更多的单元测试代码,而不是实际运行的代码。</p> +</blockquote> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://github.com/jackfrued/Python-100-Days" target="_blank" rel="noopener" +>Python 100 天从入门到精通</a>,Python 好学吗?好学又不好学,上手容易,精通难。这里有套开源教程囊括了从入门到实战应用(语言基础、数据处理、Web开发、网络开发、爬虫、深度学习等)的所有课程。这个仓库目前已经在 Github 上获得了 12 万star。可以说是好评如潮,想深入学习 Python 的不容错过。赶紧到我收藏夹里吃灰。</p> +</li> +<li> +<p><a class="link" href="https://wokwi.com/" target="_blank" rel="noopener" +>在线单片机模拟器</a>,想要学习单片机开发,又没有硬件设备吗?这个网站最合适。不需要担心手残不会电烙铁,也不用担心买不到芯片。直接在线进行模拟接线,直接运行编写的代码,结果实时展现。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-15-31-31.png" +width="878" +height="661" +loading="lazy" +class="gallery-image" +data-flex-grow="132" +data-flex-basis="318px" +></p> +</li> +<li> +<p><a class="link" href="https://slowroads.io/" target="_blank" rel="noopener" +>slow roads</a>,一个在线赛车游戏。基于网页制作。亮点在于作者实现了无限地图。所有地形和道路均使用程序生成。游戏有自动驾驶模式,如果只想观赏路边风景的话,可以开启。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-15-36-44.png" +width="1736" +height="855" +loading="lazy" +class="gallery-image" +data-flex-grow="203" +data-flex-basis="487px" +></p> +</li> +<li> +<p><a class="link" href="https://tic80.com/" target="_blank" rel="noopener" +>TIC-80</a>,TIC-80 是一台用于制作、播放和分享小型游戏的幻想计算机。有内置的开发工具:代码、sprites、地图、声音编辑器和命令行,这足以创建一个迷你复古游戏。在退出时,你将得到一个盒式文件,它可以在网站上存储和播放。 +另外,游戏可以打包成一个播放器,可以在所有流行的平台上运行,并按你的意愿分发。为了制作一个复古风格的游戏,整个创作过程是在一些技术限制下进行的。240x136 像素的显示屏,16 种颜色的调色板,256 个 8x8 的彩色 sprites,4 channel sound 等等。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-010-%E6%9C%9F/2022-11-29-15-42-20.png" +width="490" +height="279" +loading="lazy" +class="gallery-image" +data-flex-grow="175" +data-flex-basis="421px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 009 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/Mon, 21 Nov 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/<h1 id="机器文摘-第-009-期">机器文摘 第 009 期</h1> +<h2 id="长文">长文</h2> +<h3 id="游戏中的精灵">游戏中的“精灵”</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-21-14-24-20.png" +width="729" +height="409" +loading="lazy" +class="gallery-image" +data-flex-grow="178" +data-flex-basis="427px" +> +<a class="link" href="https://zh.wikipedia.org/wiki/%E7%B2%BE%E7%81%B5%E5%9B%BE" target="_blank" rel="noopener" +>精灵(sprite)</a>这个词来自古法语单词“esprit”,意思是“精神”——源自拉丁语“spiritus”。在民间传说中,精灵是活泼、俏皮和神奇的小生物。然而对于游戏开发者来说,它又是另一个含义了。</p> +<p>这篇<a class="link" href="https://wireframe.raspberrypi.com/articles/the-surprising-history-of-sprites" target="_blank" rel="noopener" +>《精灵的惊人历史》(英文)</a>,介绍了不同的游戏厂商,在早期硬件机能有限的条件下,如何实现“角色在屏幕上移动”这个现在看似十分简单的事情的。</p> +<p>对于不了解“精灵”的含义的,稍作如下解释:</p> +<blockquote> +<p>2D 游戏在处理需要动起来的角色时,出于性能考虑,将一部分图形的绘制与背景画面的绘制分开,对于频繁需要刷新(动起来的)部分,单独处理,使他们感觉像是漂浮在背景画面的“幽灵”似的,故名“精灵”。</p> +</blockquote> +<h3 id="任天堂-nes-的一些技术细节">任天堂 NES 的一些技术细节</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-21-14-41-33.png" +width="507" +height="477" +loading="lazy" +class="gallery-image" +data-flex-grow="106" +data-flex-basis="255px" +> +NES 是任天堂推出一款极其成功的家用游戏机(NES : Nintendo Entertainment ,System 是其在北美发售的名称,亚洲叫 FC :Family Computer),不少80、90后的朋友应该都玩过(或者是国内山寨厂商仿制的*霸王之类)。</p> +<p>NES 使用极其经典的 6502 CPU。这块 CPU 有多经典呢,苹果的 Apple1代2代 、史上销量第一的个人电脑 Commodore 64 、国内早年比较流行的文曲星等,使用的都是这个 CPU。</p> +<p><a class="link" href="https://medium.com/@fogleman/i-made-an-nes-emulator-here-s-what-i-learned-about-the-original-nintendo-2e078c9b28fe" target="_blank" rel="noopener" +>《我做了一个 NES 模拟器》(英文)</a>,这篇文章的作者在编写模拟器的过程中挖出了不少技术细节,里面还提到了硬件存在的各种 BUG (没错,要模拟的话必须连 BUG 都得模拟,不然有些游戏玩不了),想要了解的朋友可以点进去看一下。</p> +<p>作为模拟器爱好者,我对 6502 处理器非常好奇,一度希望自己动手也实现一个,而且这款处理器真的非常适合模拟器入门,毕竟只有三个寄存器和百十条指令。</p> +<p><a class="link" href="https://github.com/fogleman/nes" target="_blank" rel="noopener" +>文中提到的 NES 模拟器在 Github 上开放了源码</a>,有兴趣的可以学习。</p> +<h3 id="一个桌面开发程序员为了学习-javascript-而手撸了一个基于-webgl-的游戏引擎">一个桌面开发程序员为了学习 Javascript 而手撸了一个基于 WebGL 的游戏引擎</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-21-15-11-11.png" +width="780" +height="448" +loading="lazy" +class="gallery-image" +data-flex-grow="174" +data-flex-basis="417px" +> +学习一样技能最好的方式就是动手去做。</p> +<p>当我感叹牛人怎么那么厉害的时候,往往忽略了牛人的学习过程。</p> +<p>以为他们天生就那样。</p> +<p>事实上他们的技能也是靠努力训练得来的。</p> +<p>不过,学习方法确实很重要。</p> +<p><a class="link" href="http://zephyrosanemos.com/" target="_blank" rel="noopener" +>《我对 Javascript 的尝试》(英文)</a>,这篇文章的作者原本是一个桌面程序开发者(类似 CAD 软件之类)。</p> +<p>他突然想要学习前端开发,掌握 Javascript 语言。</p> +<p>于是结合自己之前的知识,使用前端技术做了一套很优秀的 Demo 程序,一个性能和外观都很不错的游戏引擎。</p> +<p>文章里作者详细介绍了实现过程中对技术、算法的选择等等。</p> +<p>内容很长,但还算友好,比较干货。</p> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://roadmap.sh/" target="_blank" rel="noopener" +>开发者之路</a>,汇总了各个技术路线的学习资料,包括前端、后端、运维、计算机科学、区块链、移动端、质量管理等等。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-21-15-24-33.png" +width="753" +height="455" +loading="lazy" +class="gallery-image" +data-flex-grow="165" +data-flex-basis="397px" +> +总之极其全面。 +目前在 Github 有两百多万个 star,被 fork 了 三十多万次。</li> +<li><a class="link" href="https://crxdl.com/" target="_blank" rel="noopener" +>chrome 插件下载</a>,访问谷歌浏览器插件商店有困难吗?试试这个网站,可以直接下载插件的包文件,下载后拖入浏览器即可安装。不过我已经转换到微软的 Edge 阵营了,用不到这个了。</li> +<li><a class="link" href="https://www.toptal.com/developers/css3maker" target="_blank" rel="noopener" +>CSS3 生成器</a>,对于 CSS 的属性参数总是记不住,这个网站就很适合我。每次要调背景渐变、圆角、阴影、动画曲线等等,都得现去搜。有了这个网站,在线点点拖拖,直接复制代码即可。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-21-15-33-35.png" +width="1288" +height="660" +loading="lazy" +class="gallery-image" +data-flex-grow="195" +data-flex-basis="468px" +></li> +<li><a class="link" href="https://tesseract.projectnaptha.com/" target="_blank" rel="noopener" +>tesseract.js</a>,可直接在浏览器里运行的 OCR 引擎,支持多国语言(超过 100 种)文字识别。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-21-16-16-10.png" +width="1039" +height="439" +loading="lazy" +class="gallery-image" +data-flex-grow="236" +data-flex-basis="568px" +></li> +<li><a class="link" href="https://www.aichpoem.net/#/shisanbai/poem" target="_blank" rel="noopener" +>AI 在线写诗</a>,比较全面的 AI 写诗工具,可以写律诗、绝句、现代诗、歌词等等,根据输入的主题任意发挥。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-23-10-36-44.png" +width="846" +height="502" +loading="lazy" +class="gallery-image" +data-flex-grow="168" +data-flex-basis="404px" +></li> +<li><a class="link" href="https://www.upscale.media/zh" target="_blank" rel="noopener" +>图片分辨率在线提升</a>,上传图片,网站使用 AI 算法将图片的清晰度自动提升,效果还不错。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-009-%E6%9C%9F/2022-11-23-10-41-36.png" +width="1087" +height="693" +loading="lazy" +class="gallery-image" +data-flex-grow="156" +data-flex-basis="376px" +></li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 008 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/Wed, 16 Nov 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/<h1 id="机器文摘-第-008-期">机器文摘 第 008 期</h1> +<h2 id="长文">长文</h2> +<h3 id="用好-github给自己建立一个全方位的私有云平台">用好 GitHub,给自己建立一个全方位的私有云平台</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/2022-11-16-09-24-41.png" +width="754" +height="393" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="460px" +> +很多人都有进行个人的知识管理和数字资源管理的需求,市面上也有很多软件工具或者平台来满足这样的需求,但是大部分都是收费的,且自由度不高。我个人经常使用 Github 作为知识管理仓库,我的网络日志、技术博客、私人小项目、电子书籍等都放在上面,生活中已经离不开这个网站了。</p> +<p>近期读到这样一篇文章&ndash;<a class="link" href="https://www.bmpi.dev/self/use-github-better/" target="_blank" rel="noopener" +>善用 Github</a>,全方位讲解了 Github 如何使用,如何将其提供的服务发挥最大化的作用,看完受益匪浅。</p> +<blockquote> +<p>GitHub 是微软旗下的一个在线软件源代码托管服务平台,也是一个拥有八千多万开发者用户的社区。很多开发者应该对GitHub有一定的了解,但非技术人员大多可能并不会去使用它。本文更多是想给非技术人员来介绍这个平台,看完这篇文章,希望能让更多人在上面来学习、创作与展示自己的作品。</p> +</blockquote> +<h3 id="webgpu-是什么跟-webgl-有什么关系">WebGPU 是什么?跟 WebGL 有什么关系?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/2022-11-16-09-36-12.png" +width="846" +height="433" +loading="lazy" +class="gallery-image" +data-flex-grow="195" +data-flex-basis="468px" +> +前几天我想在网页上制作一个小游戏,用于尝试一下图形编程相关的技术。用到了一些基于 Web 技术的 3d 图形框架,比如 Three.js、Babylon.js 等等。在尝试的过程中遇到了一个新的名词 WebGPU,之前总是在听说 WebGL 相关的技术,结果说了这么多年,WebGL还没普及,怎么又冒出来一个 WebGPU?于是找了一篇文章,浅扒一下各个图形接口的历史。就是这篇<a class="link" href="https://www.51cto.com/article/698100.html" target="_blank" rel="noopener" +>浅入浅出 WebGPU</a>。</p> +<blockquote> +<p>2016年6月,Google 产生了使用新API来代替WebGL的想法,称之为 WebGL Next。 +2017年1月,Khronos Group 举办了WebGL Next研讨会,Chromium一马当先,展示了可以基于OpenGL和Metal独立运行的新图形系统原型,同时Apple和Mozilla也分别展示了自己的原型,三者都非常类似于Metal Api。 +次月,Apple就向W3C提交了一个名为 WebGPU 的技术概念验证方案,基于Metal图形开放接口,最终W3C采纳了 WebGPU 这个名字作为下一代标准,Apple的提案进入了正式的小组提案中。 +3月,Mozilla向Khronos Group提交了基于Vulkan的名为WebGL Next提案。 +2018年6月,Chrome团队宣布着手实现WebGPU,这意味着Khronos的失败,WebGPU胜出,大家以后还是团结在W3C的周围。 +按照预期,工作组希望在2021年底发布WebGPU 1.0 标准,不过目前只有草案。 +WebGPU 1.0 草案:https://www.w3.org/standards/types#WD</p> +</blockquote> +<h3 id="扔掉-photoshop-改用字符串绘图">扔掉 Photoshop 改用字符串绘图</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/2022-11-16-09-58-00.png" +width="761" +height="741" +loading="lazy" +class="gallery-image" +data-flex-grow="102" +data-flex-basis="246px" +> +相信很多人都接触过使用字符绘制的图片,这在程序员圈子里甚至发展为一门专有的艺术 “<a class="link" href="https://zh.wikipedia.org/wiki/ASCII%E8%89%BA%E6%9C%AF" target="_blank" rel="noopener" +>ASCII 艺术</a>”。不过我现在不是要说这些,我在一篇 2015 年发表的文章里,发现了这个:有个猛男在自己的程序里彻底抛弃使用 Photoshop 制作的图片资源,改用字符串来描述各种图形(程序界面的图标),然后自己再用代码将其渲染成为高清的图像。</p> +<p>作者对此很沾沾自喜,他甚至设计了一套自用的语法规范,用特定字母代表特定的符号关系,这样就可以组合出各种复杂的图案了。</p> +<p>我也在文章的评论区见到了跟我有同样疑惑的读者留言:“这不就是重新发明了 <a class="link" href="https://zh.wikipedia.org/wiki/%E5%8F%AF%E7%B8%AE%E6%94%BE%E5%90%91%E9%87%8F%E5%9C%96%E5%BD%A2" target="_blank" rel="noopener" +>SVG</a> 吗?唯一的区别就是没有用 XML 作为载体”。</p> +<p>不过文章记录的整个开发过程还是很有趣的,希望了解朋友可以点进去看看 <a class="link" href="http://cocoamine.net/blog/2015/03/20/replacing-photoshop-with-nsstring/" target="_blank" rel="noopener" +>Replacing Photoshop With NSString</a></p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://ffmpeg.xianwaizhiyin.net/" target="_blank" rel="noopener" +>FFmpeg原理</a>,FFmpeg 这个开源项目可能圈外的人士了解不多,但实际上我们生活中一刻也离不开它。现在的网络直播、网络视频网站和移动App、各种视频剪辑合成软件,都或多或少的使用了 FFmpeg 提供的编解码技术。这本在线书籍对于想进一步了解 FFmpeg 以及视频编解码技术的朋友是个不错的参考资料。</p> +<blockquote> +<p>本书《FFmpeg原理》主要讲解 FFmpeg 原理性的知识,前面几章主要讲解一些音视频开发的基础知识,例如原始数据 YUV 跟 RGB,封装格式 FLV 跟 MP4 ,压缩编码的基本概念,还有封装格式分析。</p> +</blockquote> +</li> +<li> +<p><a class="link" href="https://rustdesk.com/zh/" target="_blank" rel="noopener" +>开源虚拟与远程桌面基础架构</a>,远程桌面软件,开箱即用,无需任何配置。(我个人目前还是使用windows的远程桌面多一些,不过这个开源的rustdesk看起来不错)</p> +<blockquote> +<p>您完全掌控数据,不用担心安全问题。您可以使用我们的注册/中继服务器,或者自建,亦或者开发您的版本 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/2022-11-16-10-26-09.png" +width="1388" +height="701" +loading="lazy" +class="gallery-image" +data-flex-grow="198" +data-flex-basis="475px" +></p> +</blockquote> +</li> +<li> +<p><a class="link" href="https://learnxinyminutes.com/" target="_blank" rel="noopener" +>Learn X in Y minutes</a>,这里的教程几乎涵盖所有编程语言,完全没有废话。英文版、中文版都有。如果有编程语言基础的话,通过这个网站确实可以在几十分钟内掌握一门新的编程语言的核心知识。</p> +</li> +<li> +<p><a class="link" href="https://flash.zczc.cz/" target="_blank" rel="noopener" +>Flash 保存计划</a>,Flash 虽然消失了,但是它曾经创造的辉煌一直在我们的记忆里,现在偶尔还想起一些经典的小游戏。这个网站里收藏了很多经典的Flash小游戏,通过一些黑科技复活了它们,可以在浏览器里运行体验。反正我一打开了黄金矿工,就半天停不下来。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/2022-11-16-10-34-57.png" +width="1142" +height="554" +loading="lazy" +class="gallery-image" +data-flex-grow="206" +data-flex-basis="494px" +></p> +</li> +<li> +<p><a class="link" href="https://keg.cs.tsinghua.edu.cn/codegeex/index_zh.html" target="_blank" rel="noopener" +>CodeGeeX: 多语言代码生成模型</a>,又一个能帮你写代码的 AI 模型。提供有官方的 VSCode 插件。我试了一下,效果跟 Github 的 copilot 还有一定的差距。</p> +<blockquote> +<p>CodeGeeX是一个具有130亿参数的多编程语言代码生成预训练模型。CodeGeeX采用华为MindSpore框架实现,在鹏城实验室“鹏城云脑II”中的192个节点(共1536个国产昇腾910 AI处理器)上训练而成。截至2022年6月22日,CodeGeeX历时两个月在20多种编程语言的代码语料库(&gt;8500亿Token)上预训练得到</p> +</blockquote> +</li> +<li> +<p><a class="link" href="https://iximiuz.com/en/series/computer-networking-fundamentals/" target="_blank" rel="noopener" +>计算机网络基础学习(英文)</a>,一个在线讲解网络基础知识的教程,优点是内容简洁,不用特别多的专用名词唬人,另外还提供了在线实验的环境。</p> +<blockquote> +<p>关于计算机网络的书籍往往令人生畏 - 数千页,无聊的图表&hellip;&hellip;这个教程以几千字的字数引导您了解网络基础知识!它还提供动手实验室来实践所获得的知识。</p> +</blockquote> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-008-%E6%9C%9F/2022-11-16-10-51-40.png" +width="764" +height="476" +loading="lazy" +class="gallery-image" +data-flex-grow="160" +data-flex-basis="385px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 007 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/Wed, 09 Nov 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/<h1 id="机器文摘-第-007-期">机器文摘 第 007 期</h1> +<h2 id="长文">长文</h2> +<h3 id="如何在-html5-canvas-制作可精确控制时间的动画">如何在 HTML5 Canvas 制作可精确控制时间的动画</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-09-30-08.png" +width="576" +height="337" +loading="lazy" +class="gallery-image" +data-flex-grow="170" +data-flex-basis="410px" +></p> +<p>使用 Canvas 对象在网页中制作动画非常简单,有不少人喜欢直接使用定时器 <code>setinterval</code> 以一定的时间周期循环执行绘图代码来实现动画效果。但是这种做法有一个弊端,由于显示刷新率以及计算机硬件性能的不同,会导致在不同机器上的表现差异。比如你希望你的动画角色在 1 秒内移动 50 个像素,但是实际执行起来却很难控制。<a class="link" href="https://www.viget.com/articles/time-based-animation/" target="_blank" rel="noopener" +>基于时间的动画</a>这篇文章讲解了如何使用浏览器的 <code>requestAnimationFrame</code> API 来实现精准控制动画时间的效果,里面给出了一个很简单的样例,但是基本上给出了一个完整的“更新、渲染、通过时间变化计算运动距离”的游戏控制架构。</p> +<h3 id="如何使用纯-web-技术开发一个相机-app">如何使用纯 Web 技术开发一个相机 App</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-09-47-44.png" +width="680" +height="475" +loading="lazy" +class="gallery-image" +data-flex-grow="143" +data-flex-basis="343px" +></p> +<p>如果不习惯复杂的移动 app 开发环境,直接使用 Web 技术开发一些小的 App 也是十分方便的。我近期希望通过网页实现一个拍照的应用,并且希望不使用手机的原生相机功能,而是自己控制一些相机参数、后期效果、增加特定的取景框等等。于是我找到了一篇教学指南:<a class="link" href="https://blog.prototypr.io/make-a-camera-web-app-tutorial-part-1-ec284af8dddf" target="_blank" rel="noopener" +>Make a Camera Web App</a>,只需几十行代码就实现了一个相机 App 。感兴趣的朋友可以点进去看看。</p> +<h3 id="数据库是如何工作的从零开始写一个数据库">数据库是如何工作的,从零开始写一个数据库</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-10-01-15.png" +width="390" +height="394" +loading="lazy" +class="gallery-image" +data-flex-grow="98" +data-flex-basis="237px" +></p> +<p>如果和我一样好奇数据库是如何实现的,可以看看<a class="link" href="https://cstack.github.io/db_tutorial/" target="_blank" rel="noopener" +>这篇文章</a>。带你用 C 语言从头撸一个数据库出来。</p> +<h3 id="使用-rust-写一个操作系统">使用 Rust 写一个操作系统</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-10-05-43.png" +width="702" +height="518" +loading="lazy" +class="gallery-image" +data-flex-grow="135" +data-flex-basis="325px" +></p> +<p>Rust 逐渐火起来了,这篇 <a class="link" href="https://os.phil-opp.com/zh-CN/" target="_blank" rel="noopener" +>2018 年的文章</a>整理了一份教程,作者尝试使用 Rust 写一个操作系统,我之所以收录它是因为作者还在 Github 开源了代码,并且这系列教程甚至提供了多国语言的版本。制作精良。应该是实践操作系统知识的好教材。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://100dayscss.com/" target="_blank" rel="noopener" +>100 天精通 CSS </a>,这个网站给了你 100 个关于 CSS 技术的挑战题目,也许练完之后可以达到深入应用 CSS 的效果,我尝试了几个挑战,有些题目的设置有些偏炫技范畴了,想在工作中使用估计会被打死。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-10-24-10.png" +width="392" +height="391" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="240px" +></p> +</li> +<li> +<p><a class="link" href="http://cht.sh/" target="_blank" rel="noopener" +>Linux 命令在线帮助工具</a>,对于我这种经常记不住命令用法的人来说真的是一种福音。比如我就经常记不清 <code>tar</code> 命令的用法,面对压缩包解压或者文件打包的工作每次都是去网上搜索一番。有了这个在线工具,直接在命令行中使用 <code>curl</code>请求他的网址就可给出命令的样例用法详解,非常方便。比如执行<code>curl cht.sh/tar</code> 就会给出 tar 的使用样例了,我直接复制粘贴之。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-10-28-42.png" +width="586" +height="462" +loading="lazy" +class="gallery-image" +data-flex-grow="126" +data-flex-basis="304px" +></p> +</li> +<li> +<p><a class="link" href="https://www.mobilephonemuseum.com/" target="_blank" rel="noopener" +>手机博物馆</a>, 网站收录了各品牌手机的各代产品资料,包括手机图片、型号参数、当时发布的广告等。不过我看了一下,资料应该还不齐全,有些手机只是列了个名字和型号在那儿,还缺少详细信息,估计还在继续收集中。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-10-32-23.png" +width="1696" +height="790" +loading="lazy" +class="gallery-image" +data-flex-grow="214" +data-flex-basis="515px" +></p> +</li> +<li> +<p><a class="link" href="http://www.famicn.com/" target="_blank" rel="noopener" +>中文家用游戏博物馆</a> ,收录了比较齐全的家用游戏机及掌机的中文版游戏资料。可以直接在线通过模拟器玩耍。有不少经典的 FC、GB、MD 游戏,甚至还有小霸王学习机的 ROM ,可以在线体验。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-007-%E6%9C%9F/2022-11-09-10-36-51.png" +width="1096" +height="711" +loading="lazy" +class="gallery-image" +data-flex-grow="154" +data-flex-basis="369px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 006 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/Wed, 02 Nov 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/<h1 id="机器文摘-第-006-期">机器文摘 第 006 期</h1> +<h2 id="长文">长文</h2> +<h3 id="怎样写一段代码把自己打印出来">怎样写一段代码把自己打印出来?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/2022-11-02-13-45-45.png" +width="651" +height="400" +loading="lazy" +class="gallery-image" +data-flex-grow="162" +data-flex-basis="390px" +></p> +<p>近期在知乎上看到一个<a class="link" href="https://www.zhihu.com/question/22006572/answer/2722369370" target="_blank" rel="noopener" +>如何编写代码打印自己的问题</a>,感到十分有趣。以前也在网上见到过类似的代码,用 C 或者 Javascript 等各种语言实现的版本都有。当时只是感叹代码写的十分神奇,一段代码在运行之后竟然输出自己的源代码,而且一个字符也不差,并没有搞懂其中的原理。这篇回答里,作者给出了详细解释。并指出,冯·诺依曼早在他编写的《自复制元胞自动机理论》一书中的提出了这种事情在理论上的通用方法。</p> +<blockquote> +<p>如上图所示,自复制系统有五个基本部件:A:通用构造器;B:通用复制器;C:控制器;D:其他函数;ϕ(A,B,C,D)\phi(A,B,C,D)\phi(A,B,C,D) : A, B, C, D的编码;当自复制过程启动的时候,B将编码复制一份。A再根据复制出的编码构造出ABCD。最后,C再将这些结构组合起来,构造出一个新的、复制的结构。可以看到,自复制、自打印程序的核心就在于通用构造器和编码,因为复制器、控制器都是比较容易实现的。</p> +</blockquote> +<p>具体实现的示例,文中有更详细的说明。</p> +<p>最后,此问题可以引申到,大自然中生命基于基因的复制机制,也是与此相关,甚至其背后都是同样的机制。</p> +<h3 id="kevin-kelly-在-68-岁生日时给出的-68-条建议">Kevin Kelly 在 68 岁生日时给出的 68 条建议</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/2022-11-02-14-01-30.png" +width="688" +height="368" +loading="lazy" +class="gallery-image" +data-flex-grow="186" +data-flex-basis="448px" +></p> +<p><a class="link" href="https://baike.baidu.com/item/%E5%87%AF%E6%96%87%C2%B7%E5%87%AF%E5%88%A9/6607570" target="_blank" rel="noopener" +>凯文·凯利(又称KK, 作者,著有《失控》《科技想要什么》《必然》等)</a>,上个月 28 号是他的 68 岁生日,他准备了 68 条简短的建议,作为礼物送给年轻人。</p> +<p>有人翻译了<a class="link" href="https://zhuanlan.zhihu.com/p/143834871" target="_blank" rel="noopener" +>KK 在 68 岁生日时给出的 68 条建议</a>。</p> +<p>摘抄几条如下:</p> +<blockquote> +<p>任何一项大工程(修房子、拍电影、开发 app)完成度为 90% 的时候,你都要做好心理准备:剩余的大量细节工作会占掉你另一段与之前相当的时间。</p> +</blockquote> +<blockquote> +<p>不要担心自己问的问题听起来很傻。99% 的情况下,其他人都有和你一样的问题,只不过羞于问出口而已。</p> +</blockquote> +<blockquote> +<p>别成为一群人里最聪明的那个。和那些比你聪明的人待在一起,向他们学习。如果能找到和你观点相左的聪明人,那就更好了。</p> +</blockquote> +<blockquote> +<p>别做最好的。做唯一的。</p> +</blockquote> +<blockquote> +<p>任何真实之物都源于虚构之意。想象是宇宙中最强大的力量,也是你能够日益精进的能力。生命中可以因不知众人所知而获益的能力,仅此一项。</p> +</blockquote> +<blockquote> +<p>经验往往被高估了。招募的时候,要看资质,技能则可以培训。许多令人惊奇和赞叹的事情,都是由第一次做的人做出来的。</p> +</blockquote> +<h3 id="怎样搭建一个最简的-git-服务器">怎样搭建一个最简的 GIT 服务器</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/2022-11-02-14-15-18.png" +width="626" +height="466" +loading="lazy" +class="gallery-image" +data-flex-grow="134" +data-flex-basis="322px" +></p> +<p>GIT 是现在软件开发过程中必不可少的版本控制工具,功能非常强大,我们平时直接使用单位的私有服务或者在线的云服务(如:Github 等)。</p> +<p>如果想要搭建个人的服务,可能就比较繁琐一些。<a class="link" href="https://www.ruanyifeng.com/blog/2022/10/git-server.html" target="_blank" rel="noopener" +>阮一峰老师的这篇博客</a>就解答了怎样采用极简的技术路线,为自己搭建一台 GIT 服务器。</p> +<blockquote> +<p>自己搭建 Git 服务器的原因,无非就是不方便访问外网,不愿意代码放在别人的服务器,或者有一些定制化的需求。 +这时,你可以选择开源的 Git 服务器软件。 +Gitlab CE +Gitea +Gogs +Onedev +这些软件里面,Gogs 的安装是最简单的,但是功能相对比较弱。功能越强的软件,安装越复杂。 +如果你只是想远程保存一份代码,并不在意有没有 Web 界面,或者其他功能,那么根本不用安装上面这些软件,一行命令就够了。</p> +</blockquote> +<h3 id="为什么很多程序员讨厌低代码">为什么很多程序员讨厌低代码?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/2022-11-02-14-24-59.png" +width="640" +height="355" +loading="lazy" +class="gallery-image" +data-flex-grow="180" +data-flex-basis="432px" +></p> +<p>“低代码”(一般指:不用或少用编写代码的方式进行软件开发)这个词近两年又开始火了,它代表着对软件工程的一种美好“幻想”,即:花费更低的代价去构建复杂的软件系统。</p> +<p>虽然每隔一个时间周期都会被重提一次,但是每次都未能如愿。</p> +<p>现在既然又被频繁提及,我在知乎上发现了这样一篇<a class="link" href="https://www.zhihu.com/question/561025857/answer/2734260311" target="_blank" rel="noopener" +>关于低代码话题的回答</a>。从程序员的视角表达了对低代码这种期望的观点,有兴趣的朋友可以点进去看看。</p> +<blockquote> +<p>软件工程这门学问,研究的就是“如何利用工程思想,从整体上降低开发复杂性”;但与之同时,它不得不反复强调“软件工程试图解决的、是人为引入的不必要的复杂性;但工程的本质复杂性是无法逃避的。因为没有银弹,没有银弹,没有银弹!”</p> +</blockquote> +<p>我个人的观点是:低代码或者配置化、拖拽式软件开发,很难平衡对复杂现实的抽象程度和开发便利性的矛盾关系。如何做到既提供方便的组件同时又不限制对个性化需求的实现,这需要非常强大的设计能力以及对于特定应用场景的取舍。目前来看,如果要做到或者接近上述状态,必然要先消耗巨量的成本,至于是否值得,可能不同的主体会有不同的选择吧。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="https://github.com/Visualize-ML/Book4_Power-of-Matrix" target="_blank" rel="noopener" +>从加减乘除到机器学习</a>,一本不错的数学扫盲书,如果你在学习人工智能的时候对数学感到吃力的话,这本书非常适合阅读,一点也不枯燥。主要讲解线性代数相关的知识。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/2022-11-02-14-46-11.png" +width="616" +height="335" +loading="lazy" +class="gallery-image" +data-flex-grow="183" +data-flex-basis="441px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/jlevy/the-art-of-command-line/blob/master/README-zh.md" target="_blank" rel="noopener" +>命令行的艺术</a> 想成为命令行高手,掌握这一篇就够了。</p> +<blockquote> +<p>熟练使用命令行是一种常常被忽视,或被认为难以掌握的技能,但实际上,它会提高你作为工程师的灵活性以及生产力。本文是一份我在 Linux 上工作时,发现的一些命令行使用技巧的摘要。有些技巧非常基础,而另一些则相当复杂,甚至晦涩难懂。这篇文章并不长,但当你能够熟练掌握这里列出的所有技巧时,你就学会了很多关于命令行的东西了。</p> +</blockquote> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-006-%E6%9C%9F/2022-11-02-14-47-54.png" +width="477" +height="287" +loading="lazy" +class="gallery-image" +data-flex-grow="166" +data-flex-basis="398px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/practical-tutorials/project-based-learning" target="_blank" rel="noopener" +>基于实际项目的学习</a>,这是一个巨大的代码工程资源索引,里面列举了针对各种编程语言的个人项目,当你不知道该如何去深入学习一门编程语言的时候,选择一个这里的项目然后自己动手跟着练一遍效果绝对惊人。入选的项目都十分有趣,比如怎样用 C 写一个解释器、怎样写一个自己的编辑器、自己动手实现 TCP/IP 协议栈,等等。</p> +</li> +<li> +<p><a class="link" href="https://github.com/lxgw/LxgwWenKai" target="_blank" rel="noopener" +>霞鹜文楷</a>,一款开源中文字体,基于 FONTWORKS 出品字体 Klee One 衍生。用来看书非常舒服,特别是在排版上。微信读书已经内置,如果是第三方支持自定义字体的可以试试。</p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 005 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/Wed, 26 Oct 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/<h1 id="机器文摘-第-005-期">机器文摘 第 005 期</h1> +<h2 id="长文">长文</h2> +<h3 id="穿越到-1983-年学习-basichttpslinuxcnarticle-11091-1html"><a class="link" href="https://linux.cn/article-11091-1.html" target="_blank" rel="noopener" +>穿越到 1983 年学习 BASIC</a></h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-10-33-53.png" +width="1006" +height="644" +loading="lazy" +class="gallery-image" +data-flex-grow="156" +data-flex-basis="374px" +></p> +<blockquote> +<p>很多著名的程序员,尤其在计算机游戏行业,孩童时期就在苹果 II 和 Commodore 64 这样的 8 位计算机上开始编写游戏,John Romero、Richard Garriott 和 Chris Roberts 都是这样的例子。这好理解。在 8 位计算机时代,很多游戏只能在计算机杂志和书籍中以印刷的 BASIC 程序清单方式得到。如果你想玩其中一款游戏,就必须手工键入整个程序。不可避免的,你可能遇到一些问题,所以你就得调试你的程序。等到你让它可以工作起来了,你就已经对程序是如何运行的有了足够的了解,你就可以开始自己修改它了。如果你是一个狂热的游戏玩家,你几乎必然会成为一名优秀的程序员。</p> +</blockquote> +<p>喜欢小霸王的小伙伴(老伙伴?),不可错过的文章,一起跟随作者回忆一下如何在老古董电脑上运行BASIC程序,顺便怀念一下当年靠着一本说明书就在小霸王学习机上编写(抄写)游戏的时光。</p> +<ul> +<li>文中提到的<a class="link" href="https://vice-emu.sourceforge.io/" target="_blank" rel="noopener" +> Commodore64 电脑可以在这里下载模拟器</a>。</li> +</ul> +<h3 id="在-github-的-pages-服务里跑-sqlitehttpsphireskygithubioblog2021hosting-sqlite-databases-on-github-pages"><a class="link" href="https://phiresky.github.io/blog/2021/hosting-sqlite-databases-on-github-pages/" target="_blank" rel="noopener" +>在 Github 的 Pages 服务里跑 SQLite</a></h3> +<p>作者尝试做一个小网站来显示一些统计数据,于是他想到了用数据库,但是,使用数据库需要托管和维护后端服务,或者每次将整个数据集下载到浏览器中(当数据集超过10MB时,体验就变得很差劲)。</p> +<p>于是作者开始琢磨有没有办法找到一个可以在静态服务器上搞一个数据库服务得可能,毕竟提供静态服务的地方有很多(如 GitHub,GitLab,Netlify 等等)。</p> +<p>一通折腾下来(借助了 WASM 技术并适当的进行一些魔改),作者竟然实现了一个 100% 静态托管的数据库服务。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-10-10-18.png" +width="864" +height="413" +loading="lazy" +class="gallery-image" +data-flex-grow="209" +data-flex-basis="502px" +></p> +<h3 id="语句表达式和海象操作符httpswwwzlovezlcnarticlesstmt-expr-and-walrus-operator"><a class="link" href="https://www.zlovezl.cn/articles/stmt-expr-and-walrus-operator/" target="_blank" rel="noopener" +>语句、表达式和海象操作符</a></h3> +<p>这是一篇介绍如何通过“海象操作符“(类似这样:<code>foo := 'bar'</code>)使得Python语句更加精炼的文章。</p> +<p>这种操作符之所以可以使得语句更加精炼,主要原因就是它使得一句代码既进行了赋值然后又作为表达式返回了值。</p> +<p>之前写 Python 代码的时候都没注意还有这种写法,而且貌似这在 C 和 C++ 中都是基本的特性。不过 C 和 C++ 是赋值语句<code>=</code>直接就返回了表达式的值,同时这给程序员提供了出错机会(有不少人应该还记得条件判断时少写了个等号导致的问题)。</p> +<h3 id="给个人开发者的一些建议英文httpsnewsycombinatorcomitemid32647091"><a class="link" href="https://news.ycombinator.com/item?id=32647091" target="_blank" rel="noopener" +>给个人开发者的一些建议(英文)</a></h3> +<p>hacker news 上的网友针对有志于运营自己的SaaS产品的个人开发者提了一些心得和建议。</p> +<p>摘抄一点儿如下:</p> +<ul> +<li>关于做什么,做那些你自己都愿意付费的东西,别指望做出一个你自己都不想花钱使用的产品有别人来买单;</li> +<li>还是关于做什么,不要做需要漂亮UI的东西,那会让你陷入编码之外的很多麻烦(确实很牵涉精力),如果提供的工具能够通过简单交互就能提供优质服务最佳;</li> +<li>如果有可能,尽量提供自助服务模式,也就是说让用户不用见到你就可以自行操作付款了(作者这是有多社交恐惧?);</li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://visualgo.net/zh" target="_blank" rel="noopener" +>数据结构与算法可视化</a>,是一个学习算法知识的好工具。通过动图来演示和讲解数据结构和算法实现原理,针对每一个常用算法不仅有直观的图示,还附有一篇详细的文档,内涵原理知识以及代码实例,网站甚至还提供了答题练习功能,可以一边学习一边做题。</li> +</ul> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-09-31-46.png" +width="1072" +height="321" +loading="lazy" +class="gallery-image" +data-flex-grow="333" +data-flex-basis="801px" +></p> +<ul> +<li><a class="link" href="https://lisperator.net/slip/" target="_blank" rel="noopener" +>SLip</a>,一个在浏览器中运行的Lisp解释器,使用Javascript实现。网站提供了一个简易的IDE,可以直接在页面中进行编程开发,还提供了图形绘制的扩展包,用于学习lisp语言非常合适。</li> +</ul> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-09-35-46.png" +width="497" +height="363" +loading="lazy" +class="gallery-image" +data-flex-grow="136" +data-flex-basis="328px" +></p> +<ul> +<li><a class="link" href="https://www.lfd.uci.edu/~gohlke/pythonlibs/" target="_blank" rel="noopener" +>针对 Windows 预先编译的 Python 扩展包</a>,在使用Python的时候,尤其是在Windows环境,经常会遇到有些扩展包由于依赖某些二进制库的原因导致无法通过pip直接安装,自己动手编译又十分麻烦。这个网站提供了各种预编译版本,可以直接下载网站提供的whl文件到本地然后安装。</li> +</ul> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-09-40-07.png" +width="675" +height="345" +loading="lazy" +class="gallery-image" +data-flex-grow="195" +data-flex-basis="469px" +></p> +<ul> +<li><a class="link" href="https://www.scratchapixel.com/lessons/3d-basic-rendering/introduction-to-ray-tracing" target="_blank" rel="noopener" +> 3D 渲染器入门</a>,一套计算机图形学的入门教程,从原理讲解开始,手把手教你用C++语言编写一个自己的光线追踪渲染器。</li> +</ul> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-09-48-21.png" +width="531" +height="361" +loading="lazy" +class="gallery-image" +data-flex-grow="147" +data-flex-basis="353px" +></p> +<ul> +<li><a class="link" href="https://htmldog.com/" target="_blank" rel="noopener" +>HTMLDOG</a>,前端开发基础知识大全,主要是 HTML、CSS、Javascript 的手把手教学以及语言参考。</li> +</ul> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-005-%E6%9C%9F/2022-10-26-09-52-21.png" +width="1862" +height="709" +loading="lazy" +class="gallery-image" +data-flex-grow="262" +data-flex-basis="630px" +></p> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 004 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/Tue, 18 Oct 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/<h1 id="机器文摘-第-004-期">机器文摘 第 004 期</h1> +<h2 id="搞机">搞机</h2> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/2022-10-18-09-53-01.png" +width="324" +height="702" +loading="lazy" +class="gallery-image" +data-flex-grow="46" +data-flex-basis="110px" +></p> +<p>美国德州仪器公司出品的TI图形计算器是一种既能计算又能作图的新型的数学使用工具,它具备符号代数系统、几何操作系统、数据分析系统等,可以直观地绘制各种图形,并进行动态演示、跟踪轨迹。</p> +<p>TI实体计算器的售价十分昂贵(相较于其他消费类计算器),这里有一个开源项目<a class="link" href="http://wabbitemu.org/" target="_blank" rel="noopener" +>wabbitemu</a>,使用C语言编写的一个TI计算器的模拟器,可以在电脑上运行并模拟TI计算器,支持多种型号,如TI-82、TI-83、TI-83-plus(需要加载对应的ROM)等。</p> +<p>甚至有人基于这个项目编译出了Android的版本,安装后手机秒变成高级科学计算器。</p> +<p>想进一步了解TI计算器的强大,可以看一下这篇文章<a class="link" href="https://zhuanlan.zhihu.com/p/148392866" target="_blank" rel="noopener" +>《计算器与计算器游戏发展简史》</a>。</p> +<ul> +<li><a class="link" href="http://www.liubaoyi.com/wp-content/uploads/2014/11/Android_Wabbitemu.zip" target="_blank" rel="noopener" +>TI计算器模拟器安卓版本下载地址(含ROM文件)</a></li> +<li><a class="link" href="http://www.liubaoyi.com/wp-content/uploads/2014/11/CX-C-CAS-%E5%9B%BE%E5%BD%A2%E8%AE%A1%E7%AE%97%E5%99%A8%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97.zip" target="_blank" rel="noopener" +>TI计算器使用说明书</a></li> +</ul> +<p>以上资源来自<a class="link" href="http://www.liubaoyi.com/" target="_blank" rel="noopener" +>@Karen的日志</a></p> +<h2 id="观点">观点</h2> +<blockquote> +<p>社交媒体的正确使用方法: +一,不浪费一秒钟时间和知识结构相差太大的人去解释/讨论。你没有义务也没有这个精力。对任何不友好评论,迅速拉黑。 +二,通过公开展示你的思考,来寻找在知识结构,兴趣或技能上,可能与你产生互补作用,或者 1+1&gt;2 的效应的朋友。公开展示长期留存的文字记录,效率最高。</p> +</blockquote> +<p>来自<a class="link" href="https://weibo.com/5339148412/Mal0hACJr" target="_blank" rel="noopener" +>@硅谷王川</a></p> +<h2 id="长文">长文</h2> +<h3 id="我是如何用21天刷完sicp">我是如何用21天刷完SICP</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/2022-10-18-10-56-50.png" +width="411" +height="300" +loading="lazy" +class="gallery-image" +data-flex-grow="137" +data-flex-basis="328px" +></p> +<p>SICP 全称 Structure and Interpretation of Computer Programs,翻译过来叫《计算机程序的构造和解释》,是一本关于计算机程序设计的总体性观念的基础教科书,由麻省理工学院出版社与麦格罗希尔出版社共同出版营销。作者是麻省理工学院教授哈尔·阿伯尔森、杰拉德·杰伊·萨斯曼。</p> +<p>这本书是计算机编程领域非常经典的一本教科书,内容覆盖范围非常广泛,从编程入门一直到教你亲手设计实现一个编程语言解释器。虽然是一本几十年前的书,但是书中的编程理念如数据驱动、过程抽象等到现在仍不过时。可以说是程序员修炼“内功心法”必读的一本好书。</p> +<p>这篇<a class="link" href="http://numbbbbb.com/2016/03/28/20160328_%E6%88%91%E5%A6%82%E4%BD%95%E7%94%A8%E4%B8%A4%E5%91%A8%E6%97%B6%E9%97%B4%E5%88%B7%E5%AE%8C%20SICP/" target="_blank" rel="noopener" +>《我是如何用21天刷完SICP(中文)》</a>的文章讲述了作者通过阅读本书学习的过程和心得,里面的观点可以借鉴,我在看完之后也想再把这本书拿出来学习一遍。</p> +<p>觉得看书太晦涩的,可以到下面这个项目里下载本书作者课堂讲解视频(国内好心人给做了翻译字幕)</p> +<ul> +<li><a class="link" href="https://learningsicp.github.io/" target="_blank" rel="noopener" +>『计算机程序的结构和解释』公开课 翻译项目</a></li> +<li><a class="link" href="https://pan.baidu.com/s/1o78bsYA" target="_blank" rel="noopener" +>百度网盘SICP文件夹</a></li> +<li><a class="link" href="https://www.bilibili.com/video/av8515129/" target="_blank" rel="noopener" +>中译版视频专辑列表(bilibili)</a></li> +</ul> +<h3 id="图解stable-diffusion模型">图解Stable Diffusion模型</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/2022-10-18-10-55-05.png" +width="937" +height="387" +loading="lazy" +class="gallery-image" +data-flex-grow="242" +data-flex-basis="581px" +></p> +<p>这篇<a class="link" href="https://jalammar.github.io/illustrated-stable-diffusion/" target="_blank" rel="noopener" +>图解Stable Diffusion模型(英文)</a>详细讲解了 Stable Diffusion(最近比较火的那个可以通过文字描述进行绘图的AI模型)的工作原理。文中使用清晰的图示阐述了“扩散”模型是怎样通过给图片增加噪声一步一步生成图像的。</p> +<h3 id="wine是如何工作的">Wine是如何工作的</h3> +<p>Linux桌面用户都遇到过在不得不运行 Windows 软件的时候,这个时候就可以使用这个叫做 Wine 的兼容程序,它可以让你在 Linux 下执行 win32 程序。( Valve 最新出品的游戏掌机 Steam Dect 就使用了 Wine 作为兼容层来运行 Windows 平台下的游戏)。</p> +<p>Wine 的名字来自于 “Wine Is Not an Emulator” 这个英文缩写。</p> +<p>这篇<a class="link" href="https://werat.dev/blog/how-wine-works-101/" target="_blank" rel="noopener" +>《Wine是如何工作的(英文)》</a>介绍了它的基本工作原理。</p> +<h3 id="在-windows-记事本里运行光线追踪">在 Windows 记事本里运行光线追踪</h3> +<p>光纤追踪(Ray Tracing)是一项计算机图形学技术,使用该技术渲染的计算机图像具有逼真的全局光照效果。</p> +<p>这篇<a class="link" href="http://kylehalladay.com/blog/2020/05/20/Rendering-With-Notepad.html" target="_blank" rel="noopener" +>《记事本中的光线追踪 30FPS》</a>记录了作者突发奇想要在Windows上的记事本中进行光线追踪渲染的趣事。</p> +<p>其原理是通过系统API获取到记事本窗口的句柄,然后利用钩子函数给记事本的窗体发送相应的“消息”以及覆盖对应的内存数据来实现对记事本窗体界面的“魔改”。最终实现了在另一个进程里执行光线追踪算法,然后借用记事本中显示的字符来替代画面像素,从而“渲染”出画面的效果。</p> +<h2 id="资源">资源</h2> +<ul> +<li> +<p><a class="link" href="github.com/SerenityOS/serenity" >SerenityOS项目</a>,一个从头开始的桌面操作系统,内核采用类似Unix的架构,界面外观则仿照了上世纪90年代Windows的窗口风格。作者并未将其定位成玩具,而是一款具备生产力的操作系统软件。 除了操作系统本身,这个项目还有配套的编程语言Jakt、自己的浏览器引擎LibWeb和浏览器Ladybird ​​​</p> +</li> +<li> +<p><a class="link" href="https://github.com/ruanyf/document-style-guide" target="_blank" rel="noopener" +>《中文技术文档写作规范》</a>,<a class="link" href="https://www.ruanyifeng.com/blog/" target="_blank" rel="noopener" +>阮一峰老师</a>整理的技术文档写作规范,规定了标题、文本、段落、标点符号等文档元素的使用约定,需要经常编写技术文档的朋友可以收藏看看。</p> +</li> +<li> +<p><a class="link" href="https://freehand.yunwooo.com/" target="_blank" rel="noopener" +>Freehand意绘</a>,一个在线的AI绘图工具,可以根据文字描述帮助你生成图片,界面简洁友好,使用方便。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/2022-10-18-10-58-24.png" +width="1063" +height="525" +loading="lazy" +class="gallery-image" +data-flex-grow="202" +data-flex-basis="485px" +></p> +</li> +<li> +<p><a class="link" href="https://github.com/izackwu/TeachYourselfCS-CN" target="_blank" rel="noopener" +>计算机科学自学指南</a>,提供了一份自学计算机科学的全方位资料大全,可以根据内容系统地进行学习计算机科学相关的知识。</p> +<blockquote> +<p>互联网上,到处都有许多的学习资源,然而精华与糟粕并存。你所需要的,不是一个诸如「200+ 免费在线课程」的清单,而是以下问题的答案:</p> +<p>你应当学习 哪些科目,为什么? +对于这些科目,最好的书籍或者视频课程 是什么? +在这份指引中,我们尝试对这些问题做出确定的回答。</p> +</blockquote> +</li> +<li> +<p><a class="link" href="https://stevens.netmeister.org/631/" target="_blank" rel="noopener" +>UNIX环境中的高级编程</a>,一套编程教程,在课程中,主要学习用C编程语言开发复杂的系统级软件,同时深入了解Unix操作系统(以及属于该家族的所有操作系统,如Linux,BSD,甚至Mac OS X)及其编程环境。</p> +<blockquote> +<p>涵盖的主题将包括用户/内核接口,Unix的基本概念,用户身份验证,基本和高级I / O,文件系统,信号,进程关系和进程间通信。还将涵盖Unix系统上软件开发和维护的基本概念(开发和调试工具,如“make”和“gdb”)。</p> +</blockquote> +</li> +<li> +<p><a class="link" href="https://codeberg.org/drummyfish/tinyphysicsengine" target="_blank" rel="noopener" +>写在C头文件里的3D物理引擎</a>,一个仅用C99标准写在C头文件里的超小物理引擎,没有依赖,直接包含头文件即可在你的工程中使用,功能完整,内置向量、三角函数、引力等计算库。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-004-%E6%9C%9F/2022-10-18-14-04-11.png" +width="399" +height="326" +loading="lazy" +class="gallery-image" +data-flex-grow="122" +data-flex-basis="293px" +></p> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 003 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/Tue, 11 Oct 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/<h1 id="机器文摘-第003期">机器文摘 第003期</h1> +<h2 id="搞机">搞机</h2> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/2022-10-11-10-17-41.png" +width="853" +height="640" +loading="lazy" +class="gallery-image" +data-flex-grow="133" +data-flex-basis="319px" +></p> +<h3 id="收听广播可以缓解压力个人体会">收听广播可以缓解压力(<em>个人体会</em>)</h3> +<p>近期我找到一个缓解焦虑的新方法,听收音机。</p> +<p>一定要老式的那种,收听真正无线电波信号的。随便找个台,最好还带有滋滋啦啦的杂音,当作工作时的背景声音,听着听着就感觉无比的放松。但又不是简单的“粉红噪音”、“白噪音”带来的那种平静,这种“仿佛脱离现在、回到了某个时空”的感觉让人感到愉悦。</p> +<p>我还没找到相关的研究信息,有人知道原理吗?</p> +<h2 id="动向">动向</h2> +<h3 id="欧洲通过法案将强制统一usb-type-c接口为充电接口">欧洲通过法案,将强制统一USB Type-C接口为充电接口</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/2022-10-11-15-46-02.png" +width="800" +height="450" +loading="lazy" +class="gallery-image" +data-flex-grow="177" +data-flex-basis="426px" +></p> +<blockquote> +<p>欧洲议会今天以压倒性多数投票赞成在2024年底之前将USB-C作为包括iPhone和AirPods在内的各种消费电子设备的通用充电端口。</p> +</blockquote> +<p>这对于苹果来说恐怕是个坏消息,对于消费者来说应该是个好消息。不过也许以苹果公司的脾气,说不定将来取消所有物理接口也有可能。</p> +<ul> +<li><a class="link" href="https://www.macrumors.com/2022/10/04/eu-passes-law-to-switch-iphone-to-usb-c-in-2024/" target="_blank" rel="noopener" +>欧洲强制iPhone使用usb-c接口</a></li> +</ul> +<h3 id="波士顿动力承诺不将机器人武器化">波士顿动力承诺不将机器人武器化</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/2022-10-11-10-15-11.png" +width="640" +height="427" +loading="lazy" +class="gallery-image" +data-flex-grow="149" +data-flex-basis="359px" +></p> +<blockquote> +<p>当地时间 10 月 6 日消息,波士顿动力、Agility Robotics、ANYbotics 等 6 家公司联合发表致行业的公开信表达了他们对这些可能性的担忧。他们称,先进的商业化机器人的经济可负担性和可获得性越来越强,其被滥用的可能性也越来越大。我们承诺不会将通用机器人或软件武器化,也不会支持其他人这么做;同时呼吁政策制定者、开发者和用户共同促进安全使用。</p> +</blockquote> +<p>我个人感觉此类声明并不会带来什么限制,相反地,我偏悲观的认为这种技术很可能以最优先的速度被应用于军事目的。</p> +<ul> +<li><a class="link" href="https://www.163.com/dy/article/HJ5DMDS005118DFD.html" target="_blank" rel="noopener" +>网易新闻:波士顿动力承诺不将机器人武器化</a></li> +</ul> +<h3 id="taocpthe-art-of-computer-programming-4b正式初版">TAOCP(《The Art of Computer Programming》) 4B正式初版</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/2022-10-11-10-30-24.png" +width="756" +height="732" +loading="lazy" +class="gallery-image" +data-flex-grow="103" +data-flex-basis="247px" +> +<em>图片来自<a class="link" href="https://weibo.com/5819320755/M9LXaF5I3" target="_blank" rel="noopener" +>@算法时空</a></em></p> +<p>世界著名程序员——高德纳老师,日前在他的个人网站宣布了<a class="link" href="https://www-cs-faculty.stanford.edu/~knuth/news.html#v4b" target="_blank" rel="noopener" +>TAOCP 4B正式出版</a>的消息。</p> +<p>这部计算机世界的经典巨著,耗费了高德纳老爷子的毕生心血,虽然已经出到了第四B卷,但本书目前还没有完全写完(本书从1962年开始写(中间停了几年是因为老爷子发现没有趁手的排版软件,就顺手发明了TEX——这又是另一个宏大话题了),计划共有七卷,其中第四卷分ABC三册)。他在自己主页中提到:</p> +<blockquote> +<p>与此同时,我继续研究第3部分(第4C卷),它已经有许多令人兴奋的主题。</p> +</blockquote> +<p>我只能说:祝老爷子身体健康!</p> +<h3 id="webassembly技术发展的怎么样了">WebAssembly技术发展的怎么样了?</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/2022-10-11-10-45-39.png" +width="386" +height="383" +loading="lazy" +class="gallery-image" +data-flex-grow="100" +data-flex-basis="241px" +></p> +<blockquote> +<p>WebAssembly 是一种运行在现代网络浏览器中的新型代码,并且提供新的性能特性和效果。它设计的目的不是为了手写代码而是为诸如 C、C++和 Rust 等低级源语言提供一个高效的编译目标。 +——来自<a class="link" href="https://developer.mozilla.org/zh-CN/docs/WebAssembly/Concepts" target="_blank" rel="noopener" +>Mozilla官方文档关于WebAssembly概念的介绍</a>。</p> +</blockquote> +<p>WebAssembly技术号称可以在浏览器中高效执行代码,并可以很方便地将C、Rust等各种语言编译到浏览器中执行,那么目前他的使用体验如何?</p> +<p>我周末做了简单体验。</p> +<p>通过官方给出的文档和入门指南,可以很快速地搭建出程序的原型,上图就是我参考官方示例将Rust代码编译到网页中执行的效果(是一个<a class="link" href="https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life" target="_blank" rel="noopener" +>经典的Game of life的小游戏</a>)。</p> +<p>从开发上来说,现在已经有了比较成熟的工具链(尤其是针对Rust语言到WASM的工具),和共享库的生态,想要进行开发,不必像前些年那样费心地搭建开发环境,基本上在Linux系统下简单执行几行命令即可完成环境搭建。</p> +<p>从执行效果来说,我没有做性能测试,直观感受上来说,确实比原生js快了不少。</p> +<p>但这并不是重点,我个人觉得这项技术它最大的意义在于,将之前的桌面程序技术有了向Web移植的可行性。</p> +<p>我们有可能很快就看到完全兼顾Web分发的方便和桌面程序性能体验的产品。</p> +<ul> +<li><a class="link" href="https://www.infoq.cn/article/hdwglnhub2wwklo9zz6z" target="_blank" rel="noopener" +>一则WebAssembly相关的新闻</a></li> +<li><a class="link" href="https://github.com/mbasso/awesome-wasm" target="_blank" rel="noopener" +>GitHub网友整理的关于WASM的资源大全</a></li> +<li><a class="link" href="https://rustwasm.github.io/docs/book/introduction.html" target="_blank" rel="noopener" +>一本手把手教你使用Rust语言进行WASM开发的在线电子书</a></li> +<li><a class="link" href="https://zalo.github.io/CascadeStudio" target="_blank" rel="noopener" +>一个使用WASM技术将三维设计软件CAD嵌入到网页中的开源项目</a></li> +<li><a class="link" href="https://supabase.com/blog/postgres-wasm" target="_blank" rel="noopener" +>一个使用WASM技术在浏览器中运行的PostgresSQL数据库</a></li> +</ul> +<h2 id="观点">观点</h2> +<blockquote> +<p>在你的密码里面放上一个逗号<code>&quot;,&quot;</code>,这样当你的密码在网上被人拖库时可以给黑客增加一些麻烦,因这样会使得他在作为csv文件往他的密码字典里面导入的时候,因为逗号分隔符的错位而让他崩溃。 +注:csv文件默认使用逗号分隔符区分字段。</p> +</blockquote> +<ul> +<li>来自:佚名网友。</li> +</ul> +<blockquote> +<p>当你长期使用windows远程桌面进行远程办公时,一层一层的服务器登进去,时间长了就会陷入盗梦空间那种疑惑,我现在是在哪一层?</p> +</blockquote> +<ul> +<li>来自:我自己。</li> +</ul> +<blockquote> +<p>量子计算机就是向过去和未来借用了很多乃至无限的时间吗?刹那即永恒。 +注:量子计算机号称每个bit位可在同一时刻表示多种状态。</p> +</blockquote> +<ul> +<li>来自:我自己。</li> +</ul> +<h2 id="长文">长文</h2> +<h3 id="从0到1打造家庭弱电方案">从0到1打造家庭弱电方案</h3> +<p>现在有不少人在困惑家里的网线该如何布局,这篇<a class="link" href="https://luolei.org/home-network-1/" target="_blank" rel="noopener" +>《从0到1打造家庭弱电方案》(中文)</a>记录了作者完整的装修过程,内容十分精彩详尽。看完之后我有点儿后悔,当时装修时没有给各个房间拉上光纤,以及用了比较普通的超五类网线。</p> +<h3 id="如何配置一个完全基于命令行窗口的开发环境">如何配置一个完全基于命令行窗口的开发环境</h3> +<p>我在油管上关注了一个日本小哥(Takuya Matsuyama),是一个个人开发者,经常上传自己的开发过程录屏,他完全基于命令行窗口(控制台)进行开发,没使用任何IDE。</p> +<p>后来我参考他的配置文件给自己也配置了一套,使用fish作为shell,neovim加上各种插件作为主力编辑器,现已成为我的日常开发环境。</p> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-003-%E6%9C%9F/2022-10-11-11-16-56.png" +width="1571" +height="820" +loading="lazy" +class="gallery-image" +data-flex-grow="191" +data-flex-basis="459px" +></p> +<p>有条件的可以到他的主页看看关于如何配置的详细介绍,或者直接去他的github仓库获取配置文件。</p> +<ul> +<li><a class="link" href="https://www.craftz.dog/posts" target="_blank" rel="noopener" +>Takuya Matsuyama小哥的主页</a></li> +<li><a class="link" href="https://github.com/craftzdog/dotfiles-public" target="_blank" rel="noopener" +>他的基于控制台命令行开发的各种配置文件</a></li> +</ul> +<h3 id="云桌面并不像你想的那么好">云桌面并不像你想的那么好</h3> +<p>给开发人员配置一个廉价的笔记本加上一个高性能的云端工作站,这个点子棒不棒?</p> +<p>听起来有很多的优势,兼具了性能、便携性、安全性等等。</p> +<p>不过先等一等,这里有一位作者在这样尝试了之后,给出了不少负面反馈(比如多显示器支持、GPU加速、网页视频质量等等问题),有兴趣的可以点进去看看。</p> +<ul> +<li><a class="link" href="https://mjg59.dreamwidth.org/61535.html" target="_blank" rel="noopener" +>《云桌面并不像你想象的那么好》(英文)</a></li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://webusers.imj-prg.fr/~jan.nekovar/co/en/en.pdf" target="_blank" rel="noopener" +>从高中到大学,数学中常用符号和计算关系的英文名称</a>,适合对数学公式中的各种符号感到困惑的人收藏,这本小册子汇聚了所有数学符号、常用希腊字母、代数式等英文叫法介绍。</li> +<li><a class="link" href="http://www.egr.unlv.edu/~ed/x86.html" target="_blank" rel="noopener" +>如何在Ubuntu下进行x86-x64汇编语言编程</a>,一本讲解现代汇编语言的电子书,基于常用的Ubuntu系统,从认识汇编语言开始讲起,到工具链的准备和怎样编写和调试程序,都有详细的介绍。</li> +<li><a class="link" href="https://www.drawkit.com/" target="_blank" rel="noopener" +>DrawKit</a>,一个提供矢量插画的网站,有很多免费的高质量插画,可用于网站制作、软件产品等方面。</li> +<li><a class="link" href="https://missing-semester-cn.github.io/" target="_blank" rel="noopener" +>计算机教育中缺失的一课</a>,一般学校里不会教开发环境的配置和各种效率工具的使用,这本电子书就是以环境和工具为切入点,将学校学习的理论应用于实际,比较接地气。 +<blockquote> +<p>大学里的计算机课程通常专注于讲授从操作系统到机器学习这些学院派的课程或主题,而对于如何精通工具这一主题则往往会留给学生自行探索。在这个系列课程中,我们讲授命令行、强大的文本编辑器的使用、使用版本控制系统提供的多种特性等等。学生在他们受教育阶段就会和这些工具朝夕相处(在他们的职业生涯中更是这样)。 因此,花时间打磨使用这些工具的能力并能够最终熟练地、流畅地使用它们是非常有必要的。</p> +</blockquote> +</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 002 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/Mon, 03 Oct 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/<h1 id="机器文摘-第002期">机器文摘 第002期</h1> +<h2 id="搞机">搞机</h2> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/2022-10-03-11-08-56.png" +width="895" +height="689" +loading="lazy" +class="gallery-image" +data-flex-grow="129" +data-flex-basis="311px" +></p> +<blockquote> +<p>MNT推出了一款名叫Pocket Reform的迷你笔记本电脑。它外形紧凑(屏幕只有7英寸),但功能齐全,据官方介绍,它的性能满足轻量办公需求,甚至还能玩一些游戏(ARM平台)。虽然现在的智能手机在性能方面已经有了很大提升,且便携性远超笔记本电脑,但是还是有相当一部分人倾向于在具有真实物理键盘的“电脑”上进行操作。</p> +</blockquote> +<p>在我看来,这台设备可能对于希望随时随地写两行代码的程序员更加具有吸引力。</p> +<ul> +<li>参考文章: +<ul> +<li><a class="link" href="https://spectrum.ieee.org/meet-an-open-source-pc-that-can-fit-in-your-pocket" target="_blank" rel="noopener" +>可以装在口袋里的开源PC</a></li> +</ul> +</li> +</ul> +<h2 id="动向">动向</h2> +<h3 id="文字直接生成3d模型">文字直接生成3D模型</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/2022-10-03-11-41-32.png" +width="735" +height="491" +loading="lazy" +class="gallery-image" +data-flex-grow="149" +data-flex-basis="359px" +> +谷歌实验室的几个哥们上周发布了一个新作&mdash;-DreamFusion。输入文字,就能生成带深度图和法线的3D模型。</p> +<p>开发团队声称:</p> +<blockquote> +<p>最近在文本到图像合成方面的突破是基于在数十亿个图像-文本对上训练的扩散模型。将这种方法应用于3D合成将需要标记大量的3D资产和用于对3D数据进行去噪的高效架构,而目前这都不太可行。在DreamFusion中,我们通过使用预先训练的2D文本到图像扩散模型来执行文本到3D合成来规避这些限制。我们的方法不需要3D训练数据,也不需要修改图像扩散模型,证明了预训练图像扩散模型作为先验的有效性。</p> +</blockquote> +<p>具体方法据称是来自他们新提出的“一种通过优化损失函数从扩散模型中生成采样的方法”该方法允许他们在任意参数空间中优化采样(例如3D空间)。</p> +<p>我看了一下官方给出的demo,3D模型还略显粗糙,不过可能将来算力提升之后会有改善。</p> +<p>现在,除了插画师受到了职业威胁,就连3D建模工程师的工作也有可能被AI取代?</p> +<ul> +<li>参考文章: +<ul> +<li><a class="link" href="https://dreamfusion3d.github.io/" target="_blank" rel="noopener" +>DreamFusion官方介绍</a></li> +</ul> +</li> +</ul> +<h3 id="通过文字描述生成语音的人工智能也来了">通过文字描述生成语音的人工智能也来了</h3> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/2022-10-03-11-32-54.png" +width="909" +height="451" +loading="lazy" +class="gallery-image" +data-flex-grow="201" +data-flex-basis="483px" +></p> +<blockquote> +<p>Twitter 用户 Felix Kreuk 发布了从文本到音频 (Text to Audio) 的 AI 模型:AudioGen +AudioGen 可以 +(1) 根据文本生成音频;(2) 续写指定的音频;(3) 同时做以上两件事,根据指定文本描述生成指定音频。 +作者给出的展示DEMO里展示了如下文本生成的语音: +(1)在风声中吹口哨 +(2)男人在说话时伴有鸟和狗的叫声 +(3)警报器和嗡嗡作响的引擎接近后走远 +(4)鸽子咕咕叫并伴有沙沙的声音 +(5)男人说话的声音,背景伴有人群欢呼声</p> +</blockquote> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/2022-10-03-11-33-50.png" +width="1147" +height="629" +loading="lazy" +class="gallery-image" +data-flex-grow="182" +data-flex-basis="437px" +> +从作者公布的架构图上可以看出来,采用的也是Transformer神经网络。之前在看到AI画图时我就想到同样的原理可能用于生成音频,结果这才没过几天,人家都已经做出来了。</p> +<ul> +<li>参考文章: +<ul> +<li><a class="link" href="https://weibo.com/1309158107/M8mPt5LgI" target="_blank" rel="noopener" +>@海辛Hyacinth</a></li> +<li><a class="link" href="https://felixkreuk.github.io/text2audio_arxiv_samples/" target="_blank" rel="noopener" +>作者的demo和原理介绍页面(托管在github)</a></li> +</ul> +</li> +</ul> +<h2 id="观点">观点</h2> +<blockquote> +<p>站桩的简单,枯燥和有效,就好比持有 sp500 指数基金简单,枯燥但足以秒杀 95%以上的基金经理一样。 +莫将容易得,便作等闲看。</p> +</blockquote> +<ul> +<li>来自<a class="link" href="https://weibo.com/5339148412/LeTdmcfjW" target="_blank" rel="noopener" +>@硅谷王川</a></li> +</ul> +<h2 id="长文">长文</h2> +<ul> +<li> +<p><a class="link" href="https://randomascii.wordpress.com/2022/09/29/why-modern-software-is-slow-windows-voice-recorder/" target="_blank" rel="noopener" +>为什么现在的软件这么慢(英文)</a>,作者在Windows系统(Windows 10, 21H2版本)下使用“录音机App”的时候获得了极差的体验(确切的说是软件启动后大概卡死了将近20秒)。于是动手分析到底是什么原因导致,然后发现主要是这个软件启动后疯狂扫描“用户”文件夹下的录音文件用于构建界面中的录音列表,这种密集IO操作导致软件停止响应。作者花了很大的篇幅来吐槽这种行为,对于微软工程师为什么这么做表示莫名其妙。不过由于我们现在的计算机大都使用了固态硬盘,而且我们的习惯一般不会在“用户”文件夹下存放太多文件,所以这个体验应该不太明显。但即使这样,我也同样对Windows系统现在的软件质量感到担忧。 +<img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-002-%E6%9C%9F/2022-10-03-18-24-45.png" +width="643" +height="310" +loading="lazy" +class="gallery-image" +data-flex-grow="207" +data-flex-basis="497px" +></p> +</li> +<li> +<p><a class="link" href="http://zhangtielei.com/posts/blog-involution-analysis.html" target="_blank" rel="noopener" +>内卷、汉明问题与认知迭代(中文)</a>,作者较为科学地分析了内卷的定义和形态,从而引申出了关于什么是“人生中重要的事”的思考,文章虽然比较长,但也清晰易懂,发人深省。部分引用如下:</p> +<blockquote> +<p>从大的方面说,社会需要创新,个人则需要突破,而创新和突破又都要求我们不断地精益求精。那么,内卷与精益求精是本质上一样的吗?如果不是,两者的区别在哪?</p> +</blockquote> +<blockquote> +<p>在某件事情上花费太多精力,并不一定就是内卷;在无关紧要的事情上花费精力才是真的内卷。</p> +</blockquote> +<blockquote> +<p>汉明早年在贝尔实验室工作。那年春天,他经常和几位同事聚在一起在餐厅吃午饭。吃饭期间,他向其中一位叫Dave McCall的同事提了一个问题:“在你的领域里最重要的问题是什么?”大约一个星期后,再次一起午餐时他继续发问:“你目前正在研究的最重要的问题是什么?” 显然,这位同伴对于这两个问题的回答并不一样。于是他接着问:“如果你当前做的并不是最重要的事,那为什么还要一直花时间投入去做呢?”有了这「灵魂三问」之后,于是——在那个春天接下来的日子里,汉明不得不另找别的同伴一起吃午饭了…… +汉明的问题听起来有些让人生厌,但后来演变成了一个在学术界很受关注的问题——汉明问题(The Hamming Question)。它本来说的是科研选题的事情,但实际上关乎人生最重要的选择。</p> +</blockquote> +<blockquote> +<p>内卷,指的是在低水平的状态下无实质意义的消耗。这里的「低水平」,可能是客观的,也可能是主观的。 +针对主观的低水平状态,我们需要冲破意识层面的障碍,同时把读书、实践和思考结合起来,反复迭代,这样才可能跃升到更高的认知层次上。 +而针对客观的低水平状态,唯有认真对待汉明问题,选择好真正重要的人生大方向,才能避免卷入那些无关紧要的、无谓的消耗中去。这才是真正考验大智慧的时候了。</p> +</blockquote> +</li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https://github.com/mtdvio/every-programmer-should-know" target="_blank" rel="noopener" +>每个程序员都需要知道的</a> ,整理了一份资源合集,包含了软件工程师技能相关的各类知识资源,包括算法、数据结构、浮点、Unicode、时间、内存、分布式、正则、安全、架构、工程哲学、实践、职业发展、软技能。。。等等,以及一些可用于技能训练和学习的站点。看起来非常符合我这种“收藏了就是学习了”的囤积爱好者的胃口。</li> +<li><a class="link" href="https://github.com/jefflomax/word-writer-6-commodore-64" target="_blank" rel="noopener" +>Word Writer 6 6502汇编源码</a>,是一份开源的Word Writer 6的6502汇编源码,可在模拟器下编译运行。用来学习6502汇编是一个不错的项目。上个世纪80年代爆火的计算机Commodore 64是很多复古计算机爱好者(包括我)的最爱,Word Writer 6是该平台上流行的文字排版编辑软件。</li> +<li><a class="link" href="https://almanac.httparchive.org/zh-CN/2022/" target="_blank" rel="noopener" +>HTTP Archive的年度报告</a>,这份报告详细(超级详细)分析了目前全球各在线网页中所使用的技术,从页面中的“CSS”、“Javascript”、“字体”以及用户体验中的“搜索引擎优化”、“移动端支持”等超过20个方面进行展示,内容十分详尽,有种看NBA的进球统计的感觉。</li> +<li><a class="link" href="https://javascriptquiz.com/" target="_blank" rel="noopener" +>Javascript Quiz</a>,一份关于Javascript的小测验,可在线作答,一共十道选择题,全是关于Js语法的常见坑,每道题答完之后都可以点击“info”图标获取关于这道题的详细解释。我试着做了一下,勉强及格。</li> +<li><a class="link" href="https://www.musi-co.com/listen/streams" target="_blank" rel="noopener" +>Streams</a>,这里有一批纯AI创作的音乐,由AI负责作曲和编曲,工程师只是把这些乐谱放入DAW软件中进行混音和录音,完成度很高,听起来相当上头。</li> +<li><a class="link" href="https://learningsynths.ableton.com/zh-Hans/get-started" target="_blank" rel="noopener" +>学习合成器</a>,这个网站提供了一本交互式电子书,讲解了电子合成器的原理,还单独提供了一个交互页面用于调制和体验各种合成器音色。我尝试了一下,真的很直观,在页面中直接可以修改各种振荡器波形、滤波器、LFO等参数,非常适合用于音色合成入门。</li> +<li><a class="link" href="https://llh911001.gitbooks.io/mostly-adequate-guide-chinese/content/" target="_blank" rel="noopener" +>函数式编程指北</a>,在线电子书,讲解函数式编程的范式,以Javascript进行举例,作者风趣幽默,深入浅出,觉得被函数编程概念唬住的可以去看看。</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p>机器文摘 第 001 期https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-001-%E6%9C%9F/Wed, 28 Sep 2022 00:00:00 +0000https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-001-%E6%9C%9F/<h1 id="机器文摘-第001期">机器文摘 第001期</h1> +<h2 id="搞机">搞机</h2> +<p><img src="https://sbabybird.github.io/p/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98-%E7%AC%AC-001-%E6%9C%9F/2022-09-28-09-38-31.png" +width="641" +height="571" +loading="lazy" +class="gallery-image" +data-flex-grow="112" +data-flex-basis="269px" +></p> +<blockquote> +<p>TurnT是一个颇具创意的唱盘设计,它把智能手机与模拟黑胶的老式音乐播放方式相结合。用家把触笔放在手机屏幕显示的黑胶唱片上,它即开始播放。从内部结构上看,它其实是一个无线扬声器,可以连接到智能手机播放音乐。TurnT这种播放音乐的体验增加了互动的体验感,如同在实际的唱片上一样,挪开唱针会立即停止音乐,将其“向内”移动到手机屏幕上显示的光盘中心就可以播放音乐。要更改歌曲,您可以通过滑动来更改专辑,还可以重新定位。</p> +</blockquote> +<ul> +<li>参考文章: +<ul> +<li><a class="link" href="https://www.sohu.com/a/573073318_121124377" target="_blank" rel="noopener" +>把手机变成黑胶唱机 &mdash; Yamaha发布了与智能手机配合使用的独特音乐设备</a></li> +</ul> +</li> +</ul> +<h2 id="动向">动向</h2> +<h3 id="ai生成图像技术带来的艺术危机">AI生成图像技术带来的“艺术危机”</h3> +<blockquote> +<p>近几周,基于AI生成的图像艺术作品的新闻越来越多,以DALL-E、Stable Diffusion等神经网络模型为代表的图像生成类AI进化越来越快,已达“以假乱真”程度。我也在动手尝试后惊叹他们的生成效果非常逼真和充满想象力。然而很快,此类AI就引起设计师、画师、艺术家的反对(恐慌?)。当然也有很多持积极态度,把它们当作工具加以利用,甚至不乏商业头脑灵活的人士,已经通过AI作画开始获取收益。于是引发了一系列的反应和讨论。</p> +</blockquote> +<ul> +<li>参考文章: +<ul> +<li><a class="link" href="https://www.uisdc.com/unsplash-prohibited-ai" target="_blank" rel="noopener" +>知名图库Unsplash 宣布禁传AI生成图像</a></li> +<li><a class="link" href="https://www.51cto.com/article/719747.html" target="_blank" rel="noopener" +>付费图库集体封禁AI生成图片</a></li> +<li><a class="link" href="https://www.bilibili.com/read/cv18571483" target="_blank" rel="noopener" +>AI 绘画 Windows 本地零基础搭建 Stable Diffusion</a></li> +<li><a class="link" href="https://zhuanlan.zhihu.com/p/560226367" target="_blank" rel="noopener" +>AI数字绘画 stable-diffusion 保姆级教程</a></li> +<li><a class="link" href="https://github.com/ahrm/UnstableFusion" target="_blank" rel="noopener" +>一个包装好的AI绘图开源GUI客户端</a></li> +</ul> +</li> +</ul> +<h2 id="观点">观点</h2> +<blockquote> +<p>程序员是计算机的翻译官。他们先是把人类的语言翻译成计算机的语言,现在又教会了计算机使用人类的语言。</p> +<ul> +<li>来自<a class="link" href="https://weibo.com/6827625527/M7vHNl9HD" target="_blank" rel="noopener" +>@t0mbkeeper</a></li> +</ul> +</blockquote> +<h2 id="长文">长文</h2> +<ul> +<li>对很多事情都有兴趣,但是生命的时间有限,怎么办?<a class="link" href="https://news.ycombinator.com/item?id=32628511" target="_blank" rel="noopener" +>这篇hacker news上的讨论(英文)</a>或许能提供一些建议。</li> +<li><a class="link" href="https://www.calnewport.com/blog/2022/05/16/taking-a-break-from-social-media-makes-you-happier-and-less-anxious/" target="_blank" rel="noopener" +>这篇文章提到了一项关于焦虑的研究(英文)</a>。研究表明,远离社交媒体(包括及时通讯工具)一个星期,可以显著提升幸福感、降低焦虑程度;</li> +<li>掌握一项技能需要时间和实践,降低预期,慢即是快。<a class="link" href="https://geekplux.com/posts/how-i-learned-programming" target="_blank" rel="noopener" +>《我是如何学会编程的》(中文)</a>,这篇文章是一位网友分享的关于他学习编程的历程。</li> +</ul> +<h2 id="资源">资源</h2> +<ul> +<li><a class="link" href="https:///coding-fonts.netlify.app/" target="_blank" rel="noopener" +>coding-fonts</a> ​​​是一个不错的编程字体网站,可以在线预览各种适合编程开发时用的字体,让选择更加直观。</li> +<li><a class="link" href="https://github.com/opendilab/DI-sheep" target="_blank" rel="noopener" +>深度强化学习羊了个羊</a> 这个github仓库开源了一个通过AI强化学习来玩耍“羊了个羊”游戏的模型及代码,结构清晰,效果很棒,用于了解深度强化学习知识非常不错。</li> +<li><a class="link" href="https://github.com/scutan90/DeepLearning-500-questions" target="_blank" rel="noopener" +>深度学习500问</a>这本在线书籍以问答形式对常用的概率知识、线性代数、机器学习、深度学习、计算机视觉等热点问题进行阐述,目前在github将近50k颗星。</li> +</ul> +<h2 id="订阅">订阅</h2> +<p>这里会隔三岔五分享我看到的有趣的内容(不一定是最新的,但是有意思),因为大部分都与机器有关,所以先叫它“机器文摘”吧。</p> +<p>喜欢的朋友可以订阅关注:</p> +<ul> +<li>通过微信公众号“从容地狂奔”订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../weixin.jpg" +loading="lazy" +></p> +<ul> +<li>通过<a class="link" href="https://zhubai.love/" target="_blank" rel="noopener" +>竹白</a>进行邮件、微信小程序订阅。</li> +</ul> +<p><img src="https://sbabybird.github.io/../zhubai.jpg" +loading="lazy" +></p> \ No newline at end of file diff --git "a/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/1/index.html" "b/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/1/index.html" new file mode 100644 index 000000000..027c1e08d --- /dev/null +++ "b/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/1/index.html" @@ -0,0 +1 @@ +https://sbabybird.github.io/tags/%E6%9C%BA%E5%99%A8%E6%96%87%E6%91%98/ \ No newline at end of file diff --git "a/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/10/index.html" "b/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/10/index.html" new file mode 100644 index 000000000..142e866f3 --- /dev/null +++ "b/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/10/index.html" @@ -0,0 +1,34 @@ +Tag: 机器文摘 - Learning & Writing!

Tags

机器文摘

+ \ No newline at end of file diff --git "a/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/2/index.html" "b/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/2/index.html" new file mode 100644 index 000000000..fddb71aa7 --- /dev/null +++ "b/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/2/index.html" @@ -0,0 +1,35 @@ +Tag: 机器文摘 - Learning & Writing!

Tags

机器文摘

+ \ No newline at end of file diff --git "a/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/3/index.html" "b/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/3/index.html" new file mode 100644 index 000000000..491553812 --- /dev/null +++ "b/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/3/index.html" @@ -0,0 +1,36 @@ +Tag: 机器文摘 - Learning & Writing!

Tags

机器文摘

+ \ No newline at end of file diff --git "a/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/4/index.html" "b/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/4/index.html" new file mode 100644 index 000000000..d736c65cc --- /dev/null +++ "b/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/4/index.html" @@ -0,0 +1,37 @@ +Tag: 机器文摘 - Learning & Writing!

Tags

机器文摘

+ \ No newline at end of file diff --git "a/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/5/index.html" "b/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/5/index.html" new file mode 100644 index 000000000..07d799823 --- /dev/null +++ "b/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/5/index.html" @@ -0,0 +1,37 @@ +Tag: 机器文摘 - Learning & Writing!

Tags

机器文摘

+ \ No newline at end of file diff --git "a/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/6/index.html" "b/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/6/index.html" new file mode 100644 index 000000000..959c071a8 --- /dev/null +++ "b/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/6/index.html" @@ -0,0 +1,37 @@ +Tag: 机器文摘 - Learning & Writing!

Tags

机器文摘

+ \ No newline at end of file diff --git "a/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/7/index.html" "b/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/7/index.html" new file mode 100644 index 000000000..41cc96b15 --- /dev/null +++ "b/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/7/index.html" @@ -0,0 +1,37 @@ +Tag: 机器文摘 - Learning & Writing!

Tags

机器文摘

+ \ No newline at end of file diff --git "a/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/8/index.html" "b/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/8/index.html" new file mode 100644 index 000000000..5600128ba --- /dev/null +++ "b/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/8/index.html" @@ -0,0 +1,36 @@ +Tag: 机器文摘 - Learning & Writing!

Tags

机器文摘

+ \ No newline at end of file diff --git "a/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/9/index.html" "b/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/9/index.html" new file mode 100644 index 000000000..de477b288 --- /dev/null +++ "b/tags/\346\234\272\345\231\250\346\226\207\346\221\230/page/9/index.html" @@ -0,0 +1,35 @@ +Tag: 机器文摘 - Learning & Writing!

Tags

机器文摘

+ \ No newline at end of file diff --git "a/tags/\347\237\245\350\257\206\347\256\241\347\220\206/index.html" "b/tags/\347\237\245\350\257\206\347\256\241\347\220\206/index.html" new file mode 100644 index 000000000..d1a9831f8 --- /dev/null +++ "b/tags/\347\237\245\350\257\206\347\256\241\347\220\206/index.html" @@ -0,0 +1,31 @@ +Tag: 知识管理 - Learning & Writing!

Tags

知识管理

+ \ No newline at end of file diff --git "a/tags/\347\237\245\350\257\206\347\256\241\347\220\206/index.xml" "b/tags/\347\237\245\350\257\206\347\256\241\347\220\206/index.xml" new file mode 100644 index 000000000..1192a231c --- /dev/null +++ "b/tags/\347\237\245\350\257\206\347\256\241\347\220\206/index.xml" @@ -0,0 +1,37 @@ +知识管理 on Learning & Writing!https://sbabybird.github.io/tags/%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86/Recent content in 知识管理 on Learning & Writing!Hugo -- gohugo.iozh-cnSat, 23 Apr 2022 00:00:00 +0000基于Markdown格式的知识管理尝试计划https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8Emarkdown%E6%A0%BC%E5%BC%8F%E7%9A%84%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86%E5%B0%9D%E8%AF%95%E8%AE%A1%E5%88%92/Sat, 23 Apr 2022 00:00:00 +0000https://sbabybird.github.io/p/%E5%9F%BA%E4%BA%8Emarkdown%E6%A0%BC%E5%BC%8F%E7%9A%84%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86%E5%B0%9D%E8%AF%95%E8%AE%A1%E5%88%92/<h2 id="背景">背景</h2> +<ul> +<li>之前一直有收藏文章并整理自己知识体系的习惯,使用的工具是evernote(印象笔记),十多年来收集数百篇网络文章,自己整理并编写笔记若干篇,已做到目录和标签的基本分类;</li> +<li>之前也有通过每日编写一个markdown文件来记录工作日志、零星日记的习惯,有心得感悟时都直接在工作日志中随手写入,保存起来;</li> +<li>通过github pages写过一些个人博客文章,更新频率不高,主要作为个人笔记在使用;</li> +<li>当前问题如下: +<ul> +<li>evernote用户体验逐年下降,对设备限制较多,且内容存在云端、格式封闭,个人掌控感较差,数据有无法访问的风险;</li> +<li>工作日志中散落的心得感悟没有索引,基本埋没在以日期命名的文件里,不成体系;</li> +<li>收集的数百篇网络文章基本没有进行消化阅读,未形成自己理解的内容;</li> +</ul> +</li> +</ul> +<h2 id="目标">目标</h2> +<ul> +<li>为网络收藏和个人产出的文章建立索引,把之前的“仓库”形成“体系”;</li> +<li>从evernote中迁移出来,所有数据放在本地,并通过在线网盘进行同步;</li> +<li>以纯文本+附件资源作为载体,避免对一种编辑器或工具产生过度依赖;</li> +</ul> +<h2 id="工具选择">工具选择</h2> +<ul> +<li><a class="link" href="https://obsidian.md/" target="_blank" rel="noopener" +>Obsidian</a>,用于建立最基本的知识仓库,编辑自己的知识卡片,并充分利用它的双向链接功能将收藏的文章和自己输出的内容形成体系连接起来;</li> +<li><a class="link" href="https://code.visualstudio.com/" target="_blank" rel="noopener" +>vscode</a>, 用于编辑技术文章、工作日志以及基于插件进行绘图,最终输出内容到Obsidian文件库中;</li> +<li>360网盘,用于在线实时同步存储Markdown的文件夹,任何具有同步文件功能的网盘均可;</li> +</ul> +<h2 id="具体计划">具体计划</h2> +<ul> +<li>整理文章目录:按照文章来源(网络、书籍、心得)、知识层面(技术、生活、哲学)等进行分类,形成树状目录结构;</li> +<li>整理文章标签:每篇文章虽然只属于一个目录,但是可以有多个标签,提升了检索文章的维度。目录作为知识体系的骨架分类,标签则是详细划分(如技能相关的标签就可以有:编程、绘画、音乐、写作,并还能进一步细分);</li> +<li>参考少数派文章<a class="link" href="https://sspai.com/post/62414" target="_blank" rel="noopener" +>玩转 Obsidian 01:打造知识循环利器</a>提到的Zettelkasten笔记法逐步整理多年积累的知识形成以“知识卡”(其实就是具有互相链接关系的Markdown文件)为单位的知识;</li> +<li>[[玩转 Obsidian 01:打造知识循环利器 - 少数派]]</li> +<li>阅读整理多年收集的知识文章,按照大约每周一篇的节奏,产出自己理解后的知识卡片,形成“知识循环”;</li> +<li>如此往复若干时间,不断完善这个体系,工具可更换,载体亦可更换,唯独不变的是探索、求知的心;</li> +</ul> \ No newline at end of file diff --git "a/tags/\347\237\245\350\257\206\347\256\241\347\220\206/page/1/index.html" "b/tags/\347\237\245\350\257\206\347\256\241\347\220\206/page/1/index.html" new file mode 100644 index 000000000..de9c62d00 --- /dev/null +++ "b/tags/\347\237\245\350\257\206\347\256\241\347\220\206/page/1/index.html" @@ -0,0 +1 @@ +https://sbabybird.github.io/tags/%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86/ \ No newline at end of file diff --git "a/tags/\347\256\241\347\220\206/index.html" "b/tags/\347\256\241\347\220\206/index.html" new file mode 100644 index 000000000..a49d2bb0c --- /dev/null +++ "b/tags/\347\256\241\347\220\206/index.html" @@ -0,0 +1,31 @@ +Tag: 管理 - Learning & Writing!

Tags

管理

+ \ No newline at end of file diff --git "a/tags/\347\256\241\347\220\206/index.xml" "b/tags/\347\256\241\347\220\206/index.xml" new file mode 100644 index 000000000..604851498 --- /dev/null +++ "b/tags/\347\256\241\347\220\206/index.xml" @@ -0,0 +1,99 @@ +管理 on Learning & Writing!https://sbabybird.github.io/tags/%E7%AE%A1%E7%90%86/Recent content in 管理 on Learning & Writing!Hugo -- gohugo.iozh-cnThu, 15 Apr 2021 00:00:00 +0000《管理自己》阅读笔记https://sbabybird.github.io/p/%E7%AE%A1%E7%90%86%E8%87%AA%E5%B7%B1%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/Thu, 15 Apr 2021 00:00:00 +0000https://sbabybird.github.io/p/%E7%AE%A1%E7%90%86%E8%87%AA%E5%B7%B1%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/<h2 id="文章介绍">文章介绍</h2> +<p>《管理自己(Management Yourself)》作者——彼得·德鲁克。该文是《哈佛商业评论》创刊以来重印次数最多的文章之一,节选自其著作《21世纪的管理挑战》。</p> +<p>我第一次读到这篇文章,是2013年在<a class="link" href="http://www.zreading.cn/archives/3650.html" target="_blank" rel="noopener" +>左岸读书</a>的博客,当时很快就放入收藏夹,今日再次翻阅,仍觉受益匪浅。</p> +<p>摘抄部分在此记录,并附上自己的一些理解。</p> +<h2 id="笔记">笔记</h2> +<blockquote> +<p>知识工作者必须成为自己的首席执行官。你应该在公司中开辟自己的天地,知道何时改变发展道路,并在可能长达50年的职业生涯中不断努力、干出实绩。要做好这些事情,你首先要对自己有深刻的认识——不仅清楚自己的优点和缺点,也知道自己是怎样学习新知识和与别人共事的,并且还明白自己的价值观是什么、自己又能在哪些方面做出最大贡献。因为只有当所有工作都从自己的长处着眼,你才能真正做到卓尔不群。</p> +</blockquote> +<p>未来社会,体力劳动将逐渐被智能化机械所取代,人人都是知识工作者即将成为事实。每个人都需要把自己当作一个公司来看待,自己就是CEO,包揽人生的“市场”、“营销”、“生产”、“运营”等各项工作,只有从更高的视角来规划自己,才能掌握主动权,避免落入被动接受的局面。</p> +<p>与运营企业一样,经营自己的第一步还是要先了解自己,深刻认识自己的优势与不足,这样无论是制定计划还是付诸行动,才能做到目标明确、行之有效。</p> +<blockquote> +<p>多数人都以为他们知道自己擅长什么。其实不然,更多的情况是,人们只知道自己不擅长什么——即便是在这一点上,人们也往往认识不清。然而,一个人要有所作为,只能靠发挥自己的长处,而如果从事自己不太擅长的工作是无法取得成就的,更不用说那些自己根本干不了的事情了。</p> +</blockquote> +<p>这个观点跟我的直觉是相反的,在读到这段文字之前我以为自己对擅长什么了如指掌,但认真思索之后,才发现事情并没有那么简单,有些自以为是的优点根本不值得推敲,如沟通表达、对技术了解广泛、技术趋势敏感等等。至于真正做什么样的事情非常的得心应手,还真得通过认真分析才行。</p> +<blockquote> +<p>要发现自己的长处,唯一途径就是回馈分析法(feedback analysis)。每当做出重要决定或采取重要行动时,你都可以事先记录下自己对结果的预期。9到 12个月后,再将实际结果与自己的预期比较。我们只要持之以恒地运用这个简单的方法,就能在较短的时间内(可能两三年),发现自己的长处——这是你需要知道的最重要的事情。在采用这种方法之后,你就能知道,自己正在做(或没有做)的哪些事情会让你的长处无法发挥出来。同时,你也将看到自己在哪些方面能力不是特别强。最后,你还将了解到自己在哪些方面完全不擅长,做不出成绩来。</p> +</blockquote> +<p>作者给出了一个据说十分有效的方法,虽然执行起来略显繁琐且时间较长,但应该还值得一试。我个人有记录工作日志的习惯,但停留在时间消耗的记录和分析层面,并未对任务执行的结果进行预期和分析。</p> +<blockquote> +<p>首先最重要的是,专注于你的长处,把自己放到那些能发挥长处的地方。其次,加强你的长处。第三,发现任何由于恃才傲物而造成的偏见和无知,并且加以克服。</p> +</blockquote> +<p>想起了之前读到的另一本书<a class="link" href="https://book.douban.com/subject/1100470/" target="_blank" rel="noopener" +>《现在发现你的优势》</a>,虽然木桶原理说要补充自己的短板,但这里的观点则强调要充分把自己的优势利用起来,并且进行加强,这样才能更好的发挥自己。当然,努力学习新技能、新知识,发现自己的偏见和不良习惯然后克服它们也很重要。</p> +<blockquote> +<p>把预期和实际结果进行比较,也会发现自己不能做什么。我们每个人都有许多一窍不通、毫无天分的领域,在这些领域我们甚至连平庸的水平都达不到。人们,尤其是知识工作者,就不应该试图去完成这些领域的工作和任务。他们应该尽量少把精力浪费在那些不能胜任的领域上,因为从无能到平庸要比从一流到卓越需要人们付出多得多的努力。</p> +</blockquote> +<p>深有体会,不应该将时间和经历消耗在自己即使努力也达不到平庸水平的事情上,然而现实中却有很多人在被动的做着这样的事情,甚至还抱有不切实际的幻想,人生苦短,早日醒悟早日改变。</p> +<blockquote> +<p>我属于读者型,还是听者型?首先,你要搞清楚的是,你是读者型(习惯阅读信息)还是听者型(习惯听取信息)的人。绝大多数人甚至都不知道还有读者型和听者型之说,而且很少有人既是读者型又是听者型。知道自己属于哪种类型的人更少。</p> +</blockquote> +<p>这一段不知是翻译的问题还是作者没说明白,文中并未定义“读者型”、“听者型”这两种类型的工作方式具体是如何工作的,只是通过例子强调了自己工作方式的不同所带来的巨大差异。我的猜测是,“读者型”应该指的是在工作中理性和逻辑思维占上风的人,通常通过阅读逻辑缜密的文字来规划和开展工作,而“听者型”则属于感性思维偏多,通过视觉、听觉来判断事物的发展。</p> +<blockquote> +<p>如果一个组织的价值体系不为自己所接受或者与自己的价值观不相容,人们就会备感沮丧,工作效力低下。</p> +</blockquote> +<p>不要试图改变自己的价值观,这只会让你倍感痛苦,你可以更换环境或者改变组织价值体系。</p> +<blockquote> +<p>成功的事业不是预先规划的,而是在人们知道了自己的长处、工作方式和价值观后,准备把握机遇时水到渠成的。知道自己属于何处,可使一个勤奋、有能力但原本表现平平的普通人,变成出类拔萃的工作者。</p> +</blockquote> +<p>机会留给有准备的人,但前提是这个人认识到自己的长处、工作方式、价值观,所谓的把握机会,是了解了这些之后才能识别到机会。</p> +<blockquote> +<p>一般来说,一项计划的时间跨度如果超过了 18个月,就很难做到明确和具体。因此,在多数情况下我们应该提出的问题是:我在哪些方面能取得将在今后一年半内见效的结果?如何取得这样的结果?</p> +</blockquote> +<p>千里之行始于足下,如果决定开始行动,也不可把计划定的太远,自己给自己安排近期可行的执行目标,对效果要有清晰的预期,对如何取得效果应有详细而具体的计划。</p> +<blockquote> +<p>人与人之间相互信任,不一定意味着他们彼此喜欢对方,而是意味着彼此了解。因此,人们绝对有必要对自己的人际关系负责。这是一种义务。不管一个人是公司的一名成员,还是公司的顾问、供应商或经销商,他都需要对他的所有共事者负起这种责任。所谓共事者,是指在工作上他所依赖的同事以及依赖他的同事。</p> +</blockquote> +<p>成熟的处理人际关系,同样需要问文章开头的三个问题,了解他人或者共事者,是我们的义务和责任。</p> +<blockquote> +<p>在一个崇尚成功的社会里,拥有各种选择变得越来越重要。从历史上来看,却没有“成功”一说。绝大多数人只期望坚守“适当的位置”。唯一的流动性是向下的流动性。然而,在知识社会里,我们期望每一个人都能取得成功。这显然是不可能的。对许多人来说,能避免失败就行。可是有成功的地方,就会有失败。因此,有一个能够让人们做出贡献、发挥影响力或成为“大人物”的领域,这不仅对个人十分重要,对个人的家庭也同样重要。这意味着人们需要找到一个能够有机会成为领袖、受到尊重、取得成功的第二领域——可能是第二份职业,也可能是平行的职业或社会创业。</p> +</blockquote> +<p>在飞速发展(或者说在加速发展)的时代,人人都在焦虑,仿佛竞争、内卷根本无法避免,但如果合理的认识自己、管理自己,并且去用心经营的话,也许人人都有机会可以在擅长的领域做出闪光的事情,获得一份自己独有的成就。</p> +<blockquote> +<p>自我管理中面临的挑战看上去比较明显,甚至非常基本,其答案可能不言自明,甚至近乎幼稚。自我管理需要个人,尤其是知识工作者,做出以前从未做过的事情。实际上,自我管理需要每一个知识工作者在思想和行动上都要成为自己的首席执行官。</p> +</blockquote> +<p>最后一段很关键,“做出以前从未做过的事情”,即行动最为重要。这也是为什么我会花费一个小时的时间,从头又阅读一遍这篇文章,并摘录下来加以分析理解的主要原因。</p>《高效能人士的七个习惯》读书笔记https://sbabybird.github.io/p/%E9%AB%98%E6%95%88%E8%83%BD%E4%BA%BA%E5%A3%AB%E7%9A%84%E4%B8%83%E4%B8%AA%E4%B9%A0%E6%83%AF%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/Tue, 07 May 2019 00:00:00 +0000https://sbabybird.github.io/p/%E9%AB%98%E6%95%88%E8%83%BD%E4%BA%BA%E5%A3%AB%E7%9A%84%E4%B8%83%E4%B8%AA%E4%B9%A0%E6%83%AF%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/<ol> +<li>积极是内在的,是选择的自由,是人性中最不能剥夺的部分。</li> +<li>以终为始,是要知道自己要什么,并以原则为重心,所做的决策是主动选择的结果,而非被环境所迫使的结果。</li> +<li>人类的四个天赋分别是,自我意识,良知,想象力,独立意志。</li> +<li>第四代时间管理,以原则为中心,以周为单位,设定自己所扮演的各项角色欲达成的三个重要成果,安排出每一天的第一要务,更理想的是当作每一天的特殊约会,全力以赴。每周都回顾上周周日程完成情况以及制定新的周日程,并每日调整。</li> +<li>对人不可讲效率,对事才可如此,对人应该讲效用,即某一行为是否有效。</li> +<li>以原则为重心,以良知为导向(人比事儿更重要),针对个人独有的使命,平衡发展生活中不同角色,全盘规划日常生活。</li> +<li>要想充分授权必须要具备的默契和共识包括: +<ol> +<li>预期成果。</li> +<li>应遵守的规范。</li> +<li>可用的资源。</li> +<li>责任的归属,约定考评的标准和次数。</li> +<li>明确的奖惩制度。</li> +</ol> +</li> +<li>在双赢协议中,对以下5要素应该有明确的规定。 +<ol> +<li>预期结果,确认目标和实现,方法不计。</li> +<li>指导方针,确认实现目标的原则,方针和行为限度。</li> +<li>可用资源,包括人力,财力,技术或者组织资源。</li> +<li>任务考核,建立业绩评估标准和时间。</li> +<li>奖惩制度,根据任务考核确定奖惩。</li> +</ol> +</li> +<li>制定好目标之后,还要看你的组织体系是否与目标相符合,否则就要调整系统体系。</li> +<li>我们总是喜欢匆匆忙忙地下结论,以善意的建议快刀斩乱麻地解决问题。不愿意花时间去诊断,深入了解问题的症结。</li> +</ol>《管理十诫》读书笔记https://sbabybird.github.io/p/%E7%AE%A1%E7%90%86%E5%8D%81%E8%AF%AB%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/Tue, 30 Apr 2019 00:00:00 +0000https://sbabybird.github.io/p/%E7%AE%A1%E7%90%86%E5%8D%81%E8%AF%AB%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/<ol> +<li>首先要通过分析知道问题是什么,才能真正洞悉解决问题的办法。</li> +<li>归根结底,所有公司最后的生命线都是信任问题,顾客要相信企业生产的产品正如它所许诺的那样好,投资者要相信公司的管理层是有能力的,员工要相信公司管理者能够兑现承诺。</li> +<li>他们根本想不到人都有缺陷,包括他们自己在内也都不是完美的。</li> +<li>问题的关键不在于机器会不会想问题,而在于人会不会想问题。</li> +<li>真正让我们陷入麻烦的并非那些我们根本不懂的东西,而是我们一知半解的东西。</li> +<li>有一种心理偏见叫做肯定的陷阱,它指的是我们努力想证明自己的观点,而非找出自己观点中的错误之处。</li> +<li>深思熟虑并不是浪费时间,而是必要之举。</li> +<li>除非有人能停下来想一想,否则一再犯同样的错误是很容易的。对每个错误都有必要进行反思和总结。</li> +<li>如果你能承认自己犯了错误,承认自己并不是战无不胜,那么你反而能得到好处。</li> +<li>管理是一门艺术,而不是一种科学。如果遇到那些想要量化人类行为的专家,你就要保持警惕了。</li> +<li>行业中的每个公司都应该力争标新立异,让自己变的与众不同,而不是随大溜。</li> +<li>要憎恨组织里的官僚作风——通用电气公司杰克·韦尔奇写给股东的信中写道。如果你想一事无成的话,那就让行政流程占据主导地位好了,去崇尚官僚主义就行了。</li> +<li>不能创造生产力的工作越努力越失败,要时刻警惕并搜寻身边那些并不能创造生产力的工作。</li> +<li>每个公司其实主要就是为现有的客户提供优质服务并努力开拓新客户群。我们在花每一分钱、设立每一个部门或是接手每一个项目时,都要问自己一个基本的问题:这能帮我们带来新客户或是为客户提供更好的服务吗?</li> +<li>将注意力放在失败上是最大的悲观主义。只要稍稍抬起你的头,改变一下你的态度,那么你的世界观就会发生巨大的变化。</li> +</ol> \ No newline at end of file diff --git "a/tags/\347\256\241\347\220\206/page/1/index.html" "b/tags/\347\256\241\347\220\206/page/1/index.html" new file mode 100644 index 000000000..d1e389475 --- /dev/null +++ "b/tags/\347\256\241\347\220\206/page/1/index.html" @@ -0,0 +1 @@ +https://sbabybird.github.io/tags/%E7%AE%A1%E7%90%86/ \ No newline at end of file diff --git a/ts/main.js b/ts/main.js new file mode 100644 index 000000000..91ab33382 --- /dev/null +++ b/ts/main.js @@ -0,0 +1,11 @@ +(()=>{var g=class e{galleryUID;items=[];constructor(t,r=1){if(window.PhotoSwipe==null||window.PhotoSwipeUI_Default==null){console.error("PhotoSwipe lib not loaded.");return}this.galleryUID=r,e.createGallery(t),this.loadItems(t),this.bindClick()}loadItems(t){this.items=[];let r=t.querySelectorAll("figure.gallery-image");for(let i of r){let n=i.querySelector("figcaption"),o=i.querySelector("img"),s={w:parseInt(o.getAttribute("width")),h:parseInt(o.getAttribute("height")),src:o.src,msrc:o.getAttribute("data-thumb")||o.src,el:i};n&&(s.title=n.innerHTML),this.items.push(s)}}static createGallery(t){let r=t.querySelectorAll("img.gallery-image");for(let o of Array.from(r)){let s=o.closest("p");if(!s||!t.contains(s)||(s.textContent.trim()==""&&s.classList.add("no-text"),!s.classList.contains("no-text")))continue;let d=o.parentElement.tagName=="A",m=o,a=document.createElement("figure");if(a.style.setProperty("flex-grow",o.getAttribute("data-flex-grow")||"1"),a.style.setProperty("flex-basis",o.getAttribute("data-flex-basis")||"0"),d&&(m=o.parentElement),m.parentElement.insertBefore(a,m),a.appendChild(m),o.hasAttribute("alt")){let l=document.createElement("figcaption");l.innerText=o.getAttribute("alt"),a.appendChild(l)}if(!d){a.className="gallery-image";let l=document.createElement("a");l.href=o.src,l.setAttribute("target","_blank"),o.parentNode.insertBefore(l,o),l.appendChild(o)}}let i=t.querySelectorAll("figure.gallery-image"),n=[];for(let o of i)n.length?o.previousElementSibling===n[n.length-1]?n.push(o):n.length&&(e.wrap(n),n=[o]):n=[o];n.length>0&&e.wrap(n)}static wrap(t){let r=document.createElement("div");r.className="gallery";let i=t[0].parentNode,n=t[0];i.insertBefore(r,n);for(let o of t)r.appendChild(o)}open(t){let r=document.querySelector(".pswp");new window.PhotoSwipe(r,window.PhotoSwipeUI_Default,this.items,{index:t,galleryUID:this.galleryUID,getThumbBoundsFn:n=>{let o=this.items[n].el.getElementsByTagName("img")[0],s=window.pageYOffset||document.documentElement.scrollTop,c=o.getBoundingClientRect();return{x:c.left,y:c.top+s,w:c.width}}}).init()}bindClick(){for(let[t,r]of this.items.entries())r.el.querySelector("a").addEventListener("click",n=>{n.preventDefault(),this.open(t)})}},b=g;var u={};if(localStorage.hasOwnProperty("StackColorsCache"))try{u=JSON.parse(localStorage.getItem("StackColorsCache"))}catch{u={}}async function S(e,t,r){if(!e)return await Vibrant.from(r).getPalette();if(!u.hasOwnProperty(e)||u[e].hash!==t){let i=await Vibrant.from(r).getPalette();u[e]={hash:t,Vibrant:{hex:i.Vibrant.hex,rgb:i.Vibrant.rgb,bodyTextColor:i.Vibrant.bodyTextColor},DarkMuted:{hex:i.DarkMuted.hex,rgb:i.DarkMuted.rgb,bodyTextColor:i.DarkMuted.bodyTextColor}},localStorage.setItem("StackColorsCache",JSON.stringify(u))}return u[e]}var D=(e,t=500)=>{e.classList.add("transiting"),e.style.transitionProperty="height, margin, padding",e.style.transitionDuration=t+"ms",e.style.height=e.offsetHeight+"px",e.offsetHeight,e.style.overflow="hidden",e.style.height="0",e.style.paddingTop="0",e.style.paddingBottom="0",e.style.marginTop="0",e.style.marginBottom="0",window.setTimeout(()=>{e.classList.remove("show"),e.style.removeProperty("height"),e.style.removeProperty("padding-top"),e.style.removeProperty("padding-bottom"),e.style.removeProperty("margin-top"),e.style.removeProperty("margin-bottom"),e.style.removeProperty("overflow"),e.style.removeProperty("transition-duration"),e.style.removeProperty("transition-property"),e.classList.remove("transiting")},t)},q=(e,t=500)=>{e.classList.add("transiting"),e.style.removeProperty("display"),e.classList.add("show");let r=e.offsetHeight;e.style.overflow="hidden",e.style.height="0",e.style.paddingTop="0",e.style.paddingBottom="0",e.style.marginTop="0",e.style.marginBottom="0",e.offsetHeight,e.style.transitionProperty="height, margin, padding",e.style.transitionDuration=t+"ms",e.style.height=r+"px",e.style.removeProperty("padding-top"),e.style.removeProperty("padding-bottom"),e.style.removeProperty("margin-top"),e.style.removeProperty("margin-bottom"),window.setTimeout(()=>{e.style.removeProperty("height"),e.style.removeProperty("overflow"),e.style.removeProperty("transition-duration"),e.style.removeProperty("transition-property"),e.classList.remove("transiting")},t)},B=(e,t=500)=>window.getComputedStyle(e).display==="none"?q(e,t):D(e,t);function v(){let e=document.getElementById("toggle-menu");e&&e.addEventListener("click",()=>{document.getElementById("main-menu").classList.contains("transiting")||(document.body.classList.toggle("show-menu"),B(document.getElementById("main-menu"),300),e.classList.toggle("is-active"))})}function N(e,t,r){var i=document.createElement(e);for(let n in t)if(n&&t.hasOwnProperty(n)){let o=t[n];n=="dangerouslySetInnerHTML"?i.innerHTML=o.__html:o===!0?i.setAttribute(n,n):o!==!1&&o!=null&&i.setAttribute(n,o.toString())}for(let n=2;n{this.isDark()?this.currentScheme="light":this.currentScheme="dark",this.setBodyClass(),this.currentScheme==this.systemPreferScheme&&(this.currentScheme="auto"),this.saveScheme()})}isDark(){return this.currentScheme=="dark"||this.currentScheme=="auto"&&this.systemPreferScheme=="dark"}dispatchEvent(t){let r=new CustomEvent("onColorSchemeChange",{detail:t});window.dispatchEvent(r)}setBodyClass(){this.isDark()?document.documentElement.dataset.scheme="dark":document.documentElement.dataset.scheme="light",this.dispatchEvent(document.documentElement.dataset.scheme)}getSavedScheme(){let t=localStorage.getItem(this.localStorageKey);return t=="light"||t=="dark"||t=="auto"?t:"auto"}bindMatchMedia(){window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",t=>{t.matches?this.systemPreferScheme="dark":this.systemPreferScheme="light",this.setBodyClass()})}},E=y;function p(e){let t;return()=>{t&&window.cancelAnimationFrame(t),t=window.requestAnimationFrame(()=>e())}}var O=".article-content h1[id], .article-content h2[id], .article-content h3[id], .article-content h4[id], .article-content h5[id], .article-content h6[id]",T="#TableOfContents",L="#TableOfContents li",k="active-class";function V(e,t){let r=e.querySelector("a").offsetHeight,i=e.offsetTop-t.offsetHeight/2+r/2-t.offsetTop;i<0&&(i=0),t.scrollTo({top:i,behavior:"smooth"})}function U(e){let t={};return e.forEach(r=>{let n=r.querySelector("a").getAttribute("href");n.startsWith("#")&&(t[n.slice(1)]=r)}),t}function C(e){let t=[];return e.forEach(r=>{t.push({id:r.id,offset:r.offsetTop})}),t.sort((r,i)=>r.offset-i.offset),t}function M(){let e=document.querySelectorAll(O);if(!e){console.warn("No header matched query",e);return}let t=document.querySelector(T);if(!t){console.warn("No toc matched query",T);return}let r=document.querySelectorAll(L);if(!r){console.warn("No navigation matched query",L);return}let i=C(e),n=!1;t.addEventListener("mouseenter",p(()=>n=!0)),t.addEventListener("mouseleave",p(()=>n=!1));let o,s=U(r);function c(){let m=document.documentElement.scrollTop||document.body.scrollTop,a;i.forEach(f=>{m>=f.offset-20&&(a=document.getElementById(f.id))});let l;a&&(l=s[a.id]),a&&!l?console.debug("No link found for section",a):l!==o&&(o&&o.classList.remove(k),l&&(l.classList.add(k),n||V(l,t)),o=l)}window.addEventListener("scroll",p(c));function d(){i=C(e),c()}window.addEventListener("resize",p(d))}var $="a[href]";function P(){document.querySelectorAll($).forEach(e=>{e.getAttribute("href").startsWith("#")&&e.addEventListener("click",r=>{r.preventDefault();let i=decodeURI(e.getAttribute("href").substring(1)),n=document.getElementById(i),o=n.getBoundingClientRect().top-document.documentElement.getBoundingClientRect().top;window.history.pushState({},"",e.getAttribute("href")),scrollTo({top:o,behavior:"smooth"})})})}var x={init:()=>{v();let e=document.querySelector(".article-content");e&&(new b(e),P(),M());let t=document.querySelector(".article-list--tile");t&&new IntersectionObserver(async(s,c)=>{s.forEach(d=>{if(!d.isIntersecting)return;c.unobserve(d.target),d.target.querySelectorAll("article.has-image").forEach(async a=>{let l=a.querySelector("img"),f=l.src,H=l.getAttribute("data-key"),I=l.getAttribute("data-hash"),A=a.querySelector(".article-details"),h=await S(H,I,f);A.style.background=` + linear-gradient(0deg, + rgba(${h.DarkMuted.rgb[0]}, ${h.DarkMuted.rgb[1]}, ${h.DarkMuted.rgb[2]}, 0.5) 0%, + rgba(${h.Vibrant.rgb[0]}, ${h.Vibrant.rgb[1]}, ${h.Vibrant.rgb[2]}, 0.75) 100%)`})})}).observe(t);let r=document.querySelectorAll(".article-content div.highlight"),i="Copy",n="Copied!";r.forEach(o=>{let s=document.createElement("button");s.innerHTML=i,s.classList.add("copyCodeButton"),o.appendChild(s);let c=o.querySelector("code[data-lang]");c&&s.addEventListener("click",()=>{navigator.clipboard.writeText(c.textContent).then(()=>{s.textContent=n,setTimeout(()=>{s.textContent=i},1e3)}).catch(d=>{alert(d),console.log("Something went wrong",d)})})}),new E(document.getElementById("dark-mode-toggle"))}};window.addEventListener("load",()=>{setTimeout(function(){x.init()},0)});window.Stack=x;window.createElement=w;})(); +/*! +* Hugo Theme Stack +* +* @author: Jimmy Cai +* @website: https://jimmycai.com +* @link: https://github.com/CaiJimmy/hugo-theme-stack +*/ diff --git a/ts/search.js b/ts/search.js new file mode 100644 index 000000000..e22d8ef4c --- /dev/null +++ b/ts/search.js @@ -0,0 +1 @@ +(()=>{var m={"&":"&","<":"<",">":">",'"':""","\u2026":"…"};function T(l){return m[l]||l}function d(l){return l.replace(/[&<>"]/g,T)}function w(l){return l.replace(/[.*+\-?^${}()|[\]\\]/g,"\\$&")}var g=class l{data;form;input;list;resultTitle;resultTitleTemplate;constructor({form:t,input:e,list:r,resultTitle:o,resultTitleTemplate:n}){this.form=t,this.input=e,this.list=r,this.resultTitle=o,this.resultTitleTemplate=n,this.handleQueryString(),this.bindQueryStringChange(),this.bindSearchForm()}static processMatches(t,e,r=!0,o=140,n=20){e.sort((a,s)=>a.start-s.start);let h=0,i=0,c=0,u=[];for(;hi?(u.push(`${d(t.substring(i,i+n))} [...] `),u.push(`${d(t.substring(a.start-n,a.start))}`),c+=n*2):(u.push(d(t.substring(i,a.start))),c+=a.start-i);let s=h+1,p=a.end;for(;s${d(t.substring(a.start,p))}`),c+=p-a.start,h=s,i=p,r&&c>o)break}if(i(i[h]=w(n),n.trim()!=="")).join("|"),"gi");for(let n of e){let h=[],i=[],c={...n,preview:"",matchCount:0},u=n.content.matchAll(o);for(let s of Array.from(u))i.push({start:s.index,end:s.index+s[0].length});let a=n.title.matchAll(o);for(let s of Array.from(a))h.push({start:s.index,end:s.index+s[0].length});h.length>0&&(c.title=l.processMatches(c.title,h,!1)),i.length>0?c.preview=l.processMatches(c.content,i):c.preview=d(c.content.substring(0,140)),c.matchCount=h.length+i.length,c.matchCount>0&&r.push(c)}return r.sort((n,h)=>h.matchCount-n.matchCount)}async doSearch(t){let e=performance.now(),r=await this.searchKeywords(t);this.clear();for(let n of r)this.list.append(l.render(n));let o=performance.now();this.resultTitle.innerText=this.generateResultTitle(r.length,((o-e)/1e3).toPrecision(1))}generateResultTitle(t,e){return this.resultTitleTemplate.replace("#PAGES_COUNT",t).replace("#TIME_SECONDS",e)}async getData(){if(!this.data){let t=this.form.dataset.json;this.data=await fetch(t).then(r=>r.json());let e=new DOMParser;for(let r of this.data)r.content=e.parseFromString(r.content,"text/html").body.innerText}return this.data}bindSearchForm(){let t="",e=r=>{r.preventDefault();let o=this.input.value.trim();if(l.updateQueryString(o,!0),o==="")return t="",this.clear();t!==o&&(t=o,this.doSearch(o.split(" ")))};this.input.addEventListener("input",e),this.input.addEventListener("compositionend",e)}clear(){this.list.innerHTML="",this.resultTitle.innerText=""}bindQueryStringChange(){window.addEventListener("popstate",t=>{this.handleQueryString()})}handleQueryString(){let e=new URL(window.location.toString()).searchParams.get("keyword");this.input.value=e,e?this.doSearch(e.split(" ")):this.clear()}static updateQueryString(t,e=!1){let r=new URL(window.location.toString());t===""?r.searchParams.delete("keyword"):r.searchParams.set("keyword",t),e?window.history.replaceState("","",r.toString()):window.history.pushState("","",r.toString())}static render(t){return createElement("article",null,createElement("a",{href:t.permalink},createElement("div",{class:"article-details"},createElement("h2",{class:"article-title",dangerouslySetInnerHTML:{__html:t.title}}),createElement("section",{class:"article-preview",dangerouslySetInnerHTML:{__html:t.preview}})),t.image&&createElement("div",{class:"article-image"},createElement("img",{src:t.image,loading:"lazy"}))))}};window.addEventListener("load",()=>{setTimeout(function(){let l=document.querySelector(".search-form"),t=l.querySelector("input"),e=document.querySelector(".search-result--list"),r=document.querySelector(".search-result--title");new g({form:l,input:t,list:e,resultTitle:r,resultTitleTemplate:window.searchResultTitleTemplate})},0)});var f=g;})(); diff --git a/weixin.jpg b/weixin.jpg new file mode 100644 index 000000000..9f76c7567 Binary files /dev/null and b/weixin.jpg differ diff --git a/zhubai.jpg b/zhubai.jpg new file mode 100644 index 000000000..48b76c97c Binary files /dev/null and b/zhubai.jpg differ