普通视图

发现新文章,点击刷新页面。
昨天以前Inevitable

Yoichi:怀石料理

作者 琉璃
2021年6月25日 00:00

不愧是镇上最好吃的日料店,也是镇上最贵的日料店。

怀石料理讲究使用当季美食,尽可能多的利用食材以及味道的平衡。Yoichi 的怀石料理在酱料上非常传统,主要使用清酒,味淋,酱油和昆布柴鱼高汤。香料的运用并不多。Yoichi 在辅料的选择上会考虑当地特产,例如 Sundried Tomato。令我感到奇怪的是整道套餐吃下来并没有遇到常见的白萝卜丝或是萝卜泥配料。

Yoichi 的店铺很小,方方正正的大堂里摆着卡座和简单的座位。抬头可以看到三角的屋顶上挂着一台空调。座位间距不大,加上整个空间一览无余让用餐私密感较少。

一共有七道菜,整体上菜速度较快。我恶意地揣测是不是因为上菜速度较慢的话,就吃不到八分饱了。烤盘我们选的是帝王蟹,蒸菜选的是鳗鱼。

前菜

我们这次地前菜和官网上地菜单有些不同。右上角地是腌渍日本山菜。绿色地吃上去比较像很嫩的芹菜。山菜用柴鱼片高汤腌渍(Bonito Broth)。整体口感为咸,鲜。

左上角的是慢煮的鲍鱼和章鱼搭配高汤冻和新鲜豆瓣。章鱼火候把握的很好。鲍鱼入口有干香菇类似的香味。豆瓣则一反常态,没有任何腌渍的味道,非常的清爽。

下面是用米酒和味淋腌渍的和牛。与其他两个冷菜不同,这道菜是温的。这道菜味道和口感都类似香肠,甜甜的,一口咬下去温热的脂肪流了出来。搭配的蔬菜是小白菜芯,清爽的口感很好的平衡了和牛的甜和油。

忘记拍照了,找了个类似的图。

吃完了味道重的前菜,怀石料理会使用汤来清新味蕾。我们的汤有鱼,香菇,蛋皮和 Sundried Tomato,汤底是昆布柴鱼高汤(Dashi)。鱼很嫩,鱼味较重。与碗里那些调味过的菜相比,汤异常的清爽。喝完整整一碗也不会感到咸。

Sundried Tomato 感觉是整道菜最有亮点的地方。Sundried Tomato 属于加州特产,强烈的番茄香味和酸味与其他菜和清淡的汤形成了强烈的对比。我个人大部分时候都是在披萨上吃到 Sundried Tomato,所以吃这口的时候披萨快餐店浮现在我眼前。

刺身

最上面的是两种海胆,具有完全不同的口感。下面的更加软糯,一碰就碎,口感清甜。上面的更加解释,更咸,能体现大海的味道。

右下角是烟熏马鲛鱼,口感 Q 弹,是我最喜欢的刺身。

左下角是日本鲭鱼。相比海胆的入口即化,马鲛鱼的 Q 弹,金枪鱼更加的有嚼劲。一丝丝的纤维,需要顾客反复咀嚼。金枪鱼搭配的包菜和左上角的酸酸的柚子酱油。

烤盘

这绝对是吃起来最花时间的菜。蟹肉黏在蟹壳上,需要顾客满满分离。下面是柚子醋。我个人更加喜欢不沾醋吃,更能够品尝到蟹肉的甜味,和碳烤的香味。越吃越觉得蟹肉很像鸡胸肉,看起来也是跟鸡胸肉一样丝丝分明。

蒸菜

蒸菜是淡水鳗鱼,安康鱼肝,黄瓜丝垫底,黄瓜花和清酒浸泡的杨梅,酱汁是恰到好处的照烧酱。

第一口吃安康鱼肝觉得鱼味很重,吃了几口味道更重的鳗鱼后,再吃安康鱼肝就感受不到那么重的鱼味了。吃到最后安康鱼肝吃上去跟鸡蛋豆腐类似。

这道菜丝毫感觉不出是蒸出来的,总让我觉得而是烤鳗鱼。

被清酒浸泡过的杨梅,有了酒香味,但是没有酒精味。与家乡的杨梅不同,这粒杨梅汁水没有那么饱满,没有那么酸甜,味道更加的清淡,最大化的体现了清酒的香味。

寿司

寿司分别是甜虾,山药鹌鹑蛋和扇贝。

山药鹌鹑蛋寿司没有吃熟鹌鹑蛋的那股味道,反而一场清淡爽口。滑溜溜的山药和鹌鹑蛋,搭配黏黏的米饭,口感奇特。

扇贝是我最喜欢的。奇特的口感给我留下深刻的印象。扇贝绝大部分地方都是软软嫩嫩的,根部却有着截然不同的口感。扇贝根部一咬下去救碎成一丝丝的。

甜品

三角形的大幅和圆形的大福非常配这个正方向和圆形镶嵌的盘子。三角形大福嫩,圆形大福口感略硬。

整顿饭吃完,体验上不会像吃法餐之类的充斥着惊喜。怀石料理给我一种朴素的感觉。虽然每道菜都不外乎酱油,味淋,清酒,昆布柴鱼高汤,但每道菜都可以感受到他们的用心。几乎所有的生食材都预处理过,或是腌渍,或是烟熏。另一个感受就是平衡。味觉和形状上的平衡体现在每一道菜里。

RAI

作者 琉璃
2021年4月17日 00:00

以太坊创始人看好的 RAI 到底独特在哪?RAI 为何能成为加密货币世界的美元?

❓ 什么是 RAI

RAI 不像 USDT,DAI 之类的传统稳定币,RAI 标榜自己为稳定资产,不是稳定币。虽然大家的名字中都有稳定二字,但是大家的设计理念完全不同。传统稳定币最重要的是和美元锚定,绝对稳定的价格。RAI 称他们为 Pegged Coin。相比和美元锚定,RAI 并不直接和什么资产挂钩。RAI 的稳定指的是减少抵押资产的波动性。RAI 的稳定由 RAI 的市场价格靠近动态调整的赎回价格所保证。

RAI 在官网把自己比作稳定的资产,就跟美元在传统金融的地位一样。从前美元和黄金挂钩,现在美元不和任何东西挂钩,但它依然是为稳定资产。

⚙️ RAI的货币机制

RAI 在某些地方和 DAI 很像,官方也声明他们参考了 DAI 的设计。如果对稳定币不熟悉的可以看这篇介绍。铸造 RAI 需要抵押 ETH。RAI 通过这样几个手段影响 RAI 的价格

  • 赎回价格(Redemption Price)可以理解为 RAI 的目标价格
  • 赎回率(Redemption rate):激励或阻止用户销毁 RAI。赎回率控制着赎回价格 1 s 内的变化
  • 铸造价格(Borrowing Power):1 ETH 可以铸造多少 RAI
  • RAI 业界首创的使用 PID 来控制赎回率来缩小赎回价格和市场价格差距。PID 是一种易于实现的算法,使用过去和预测未来的信息来减少现在的值和目标值之间误差。PID 控制器的简介可以看 MATLAB 的视频

PID 的引入也减少了社区治理的需求。RAI 完全可以独立的运行。

⚠️ 当然 PID 也不是万能的,在以下情况会需要管理员的介入:

  • 缺少流动性
  • 市场操纵
  • DAO 推广过度的激励措施
  • 单边市场行情

RAI 背后的团队来自 BlockScience。从他们官网的介绍可以感觉到他们的独特之处。他们创新性的将系统工程,运筹学应用在了区块链金融产品。除 RAI 之外,他们还开发了 cadCAD 用于模拟和验证复杂系统的运行。

💬 感想:

看下来感觉 RAI 受到 V 神的推崇不是没有原因的。RAI 在机制上并没有太多的创新之处。它并不像 2020 年底出现的 Basis,DSD 创新的使用了双币或者三币机制。RAI 的创新在于 PID 算法的使用以及它的理念,想要做 DEFI 世界的美金。习惯了稳定币的老玩家或许很难理解这样一个”不稳定“的稳定资产。

美金作为稳定资产,稳定在于它的购买力,而不是货币之间的汇率。然而今天的 DEFI 只有币币交易即汇率,购买力还很模糊。我更喜欢将目前的 RAI 定义为波动较少的ETH。对货币和经济有独特的见解的读者欢迎留言讨论。

Basis 和 DSD 的机制在半年内被市场发现了漏洞,当币价低于锚定价格时,债券(Bond)并不能有效的提升币价。让我们看看半年后,市场将会怎么评价RAI。

📔 相关阅读:


❤ 如果你喜欢这篇文章,不妨订阅 un.block

ForceDAO

作者 琉璃
2021年4月10日 00:00

来看看一行价值 38 万美元的代码

Force DAO 是最近的 DEFI 明星项目,但它一上线就发生了严重的安全事故。目前 FORCE DAO 空投已经暂停。本期本周热点将会为你介绍区块链安全,以及回顾 FORCE DAO 的安全漏洞。

🔓 安全

安全是个有人在意,有人不在意的问题。随着互联网的兴盛,各种数据泄露,黑客攻击也层出不穷。相比过去的小打小闹,现在的黑客行动有着更加明确的目标,强大的破坏力。在区块链中,安全是重中之重。因为区块链与钱的连接更加紧密,黑客们更有攻击的动力。一个严重的安全问题可能导致一个区块链项目的失败。有关区块链给安全带来的独特挑战,我们有机会再介绍。

⚔️ 攻击分析

项目方的披露中我们可以了解攻击的流程。受到攻击的是 xFORCE Vault。这个合约负责 xFROCE 代币的生成和销毁。正常的逻辑是用户抵押 FORCE 代币,收到 xFORCE 代币。漏洞是没有校验 FORCE 代币的转账结果。这导致攻击者可以让 FORCE 代币转账失败,但仍旧收到 xFORCE 代币。

没有校验函数返回值是智能合约中很常见的问题。在此次事件中,攻击者就是利用了合约并没有处理 FORCE 代币 transferFrom 的返回值,凭空铸造了很多 xFORCE。然后将 xFORCE 销毁,换回 FORCE。合约认为 transferFrom 必定成功,即使用户并没有真的把 FORCE 转给智能合约。漏洞在ForceProfitSharing.sol L43

🔧 漏洞修补

在开发过程中我们可以添加代码来处理 transferFrom 的返回值。我们也可以使用 SafeERC20 的 ·

safeTransferFrom。使用 safeTransferFrom 时,如果转账失败整个交易会进行回滚。

📢 感想

我个人觉得这是一个十分容易发现的漏洞。不需要人工审计,静态分析器也能发现这个问题。很有可能项目方没有进行正规的代码审计。

在报告中他们提到 xFORCE vault 代码来自 xSUSHI,FORCE 来自 Aragon Minime。xSUSHI 代码假设转账操作失败会回滚,然而 FORCE 并没有实现转账失败回滚的功能(缝合失败)。我们可以理解为项目方借用了其他项目的代码,但并没有弄清楚这些代码运行的前提。

DEFI 开发越来越复杂,开发者们会去复用其他项目的一些代码。然而这些项目代码在编写之初并没有考虑到被他人使用,因此文档不够完善。这种稀里糊涂使用别人的代码的行为在未来或许会导致更多的问题。

因此,作为一个智能合约开发者,只掌握开发技术是不够的,我们还需要了解基本的安全漏洞。如果注意这几点,一个智能合约应该可以规避绝大部分漏洞:

  1. 使用静态工具进行分析,例如 Slither。理解,评估静态工具生成的漏洞报告,这需要开发者熟悉常见的漏洞及其危害。
  2. 再三检查合约代码中跟钱有关的的逻辑。比如转账的数量,转账的前置条件等。

❤ 如果你喜欢这篇文章,不妨订阅 un.block

IBC

作者 琉璃
2021年4月3日 00:00

跨链是今年的热门话题

❓ 为什么需要 IBC ( Inter-Blockchain Communication )

每个区块链都是一个独立,自治的系统。它们不依赖外部信息,独立地生产区块,验证区块。起初开发者们都在以太坊上用智能合约创造自己的 DApp。这些 DApp 可以互相调用。随着需求的扩展,以太坊逐渐不能满足这些复杂的需求。常见的问题有性能瓶颈, EVM 无法满足需求,无法完全自治。因此开发者开始尝试为自己的 DApp 定制一条区块链。当这些 DApp 都建立在各自定制化的链上时,互相交流便困难了起来。区块链自治的特性成了最大的绊脚石。如何安全有效区去中心化的让消息跨链传输困扰了开发者很久。

👀 IBC 是什么

IBC(inter-blockchain communication protocol)Cosmos 推出的通用跨链信息传输协议。在保证各个链自治,处理交易速度的同时,IBC 让信息和资产跨链更加的去中心化,安全和便捷。200+ 的服务和应用,超过 800 亿美金的资产采用了 IBC。IBC 就像区块链世界的 TCP/IP 协议,让区块链网络变得可能。

在 IBC 的帮助下,采用不同共识机制,网络的区块链得以互相交流,只要他们的共识机制满足 Fast Finality,即所有交易都会被快速打包,并且无法撤销,更改。

比特币和以太坊并不满足 Fast Finality,因此 Cosmos 为他们定制化了跨链方案:两条支持 Fast Finality 的定制区块链和 IBC。这两条定制链分别跟踪比特币和以太坊的状态。由于这两条定制链兼容 IBC,并且拥有比特币,以太坊的最新状态,跨链问题就此解决。

🌰 IBC:举个栗子

接下来我们用一个例子来解释一下 IBC 是如何运行的。假设我们有两个使用 IBC 的区块链,地球和 火星。我们希望从地球向火星发送一条 ”Hello World“。我们首先需要运行一个 Relayer 来进行消息的传递。Relayer 会持续检查链的状态,并在另一条链上创建包含对应消息的交易。在使用 IBC 的情况下,地球上会跑一个火星的轻量化客户端,这样地球就可以验证火星的状态,确保 Relayer 传递的信息是具有有效性和准确性。同样,火星也会跑一个地球的客户端。

与 TCP/IP 相同,两条链会先进行握手来进行身份认证,为安全的传输消息做准备。接下来我们只要在地球创建对应的 “Hello World” 消息,Relayer 会将其传输到火星上。IBC 确保数据传输的安全性。接下来便是 onAck,onTimedout 等事件的触发。

需要注意的是 IBC 只负责数据安全的传输。对于数据的序列化则需要建立在区块链上的应用进行处理。

🌌 Cosmos IBC

IBC 是一种协议,目前 IBC 已经在 Cosmos SDK 中实现,未来将支持 Kepler,Substrate,Tendermint,Codechain。

Cosmos 通过 IBC 进一步壮大了 Cosmos SDK 的影响力。跨链,定制区块链开发的玩家可不止 Cosmos 一家,Polkadot 也有着自己的解决方案。有机会的话我们会向你们介绍 Polkadot 的奇妙之处。

❤ 如果你喜欢这篇文章,不妨订阅 un.block

快速搭建主网分叉链(fork mainnet)

作者 琉璃
2021年3月6日 00:00

区块链开发的体验还是有点差。

随着 Defi 的发展,智能合约开始相互调用。这给开发和测试带来了一定的难度。我们可以在本地搭建测试链,然后部署需要调用的外部合约。也可以直接使用测试网络,调用部署上面的外部合约。这两种方法都很麻烦。对于第一种方法,如果需要重置环境,那么我们每次都要重新部署外部合约。对于第二种方法,不是所有的合约都部署到了测试网络,而且有些测试网络上的合约和主网会有所区别。

最简单的方法就是我们从主网分叉一条链进行本地开发和维护。需要重置时,就重新进行分叉。这样测试环境基本和主网就是一摸一样了。

Truffle Team

这是 Truffle Teams。他们支持 Sandbox 功能。用户可以一键搭建一条从主网分叉的链。这条链运行在云端,我们只需要通过 RPC 进行调用即可。免费用户至多拥有一个沙盒。

Sandbox 的好处在于即开即用,链运行在云端,适合团队协作。坏处在于没有日志,无法追踪新产生的交易。如果忘记了新部署的合约地址,那么就得重新部署一遍。

Ganache

Ganache-cli 也支持从主网进行分叉。可能这就是 Truffle Team 用的产品吧。使用之前我们需要有一个 Provider。可以是 Infura,也可以用不需要注册的 cloudflare-eth。运行起来也很方便,而且支持了更多的自定义选项。ganache-cli --fork https://mainnet.infura.io/v3/{infura_project_id}@{block_number}ganache-cli -f https://cloudflare-eth.com/ -m "clutch captain shoe salt awake harvest setup primary inmate ugly among become" -i 999 -u 0x9759A6Ac90977b93B58547b4A71c78317f391A28

  • f provider。
  • m 助记词。前十个地址有 100ETH。
  • i 网络 ID。
  • u 地址拥有写入权限,不需要知道私钥。

启动了测试链之后,我们可以在终端看到最新的交易信息等。此测试链可以用于 Remix,Truffle,Hardhat。 由于我们用 Ganache-cli 启动测试链,我们没法使用 Ganache GUI。

Hardhat

这个跟 Ganache-cli 差不多。相关源代码

原理

不用担心分叉主网作为测试链会占很多内存。这些方法都不会将主网信息全部下载到本地,最多进行缓存,加快处理速度。所有关于主网的信息,我们都会通过 Provider 进行查询,只有新的区块会保存在本地。

参考

Testing on Mainnet with Jest, Ganache, and Uniswap

Testing your smart contract with existing protocols: Ganache fork - EthereumDev

Ethereum development environment for professionals by Nomic Labs

2020 这一年

作者 琉璃
2021年1月1日 00:00

我们走,2021。

课程

今年一共上了 16 节课。

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/df079def-4f11-4e19-92fc-458451e08c69/download_(1).png

Side project

今年一共做了 13 个,大概是一个月一个。这其中有些 Project 计划是一起用的。比如 Gallery 和 Daily Picture 。Daily Picture 负责抓取图片,Gallery 负责前端显示,Image Excerpt 负责为十几张图片生成一个统一的颜色预览图。

👛 FRIEND :这是我目前正在进行的项目。我希望可以探索一下代币化个人价值和社交价值。目前的想法是可以将个人代币的价值与你朋友的代币进行锚定。个人可以更改这个锚定价格。毕竟人都在进步,如果你进步的比你朋友快,你就应该提高代币的锚定价格。

那这些个人代币可以怎么使用,又有什么价值呢?目前我想到的是这些代币可以用于赞助,VIP,付费阅读,付费提问,自定义化的付费服务,等等。代币可以分发给那些支持者,比如在社交媒体上给你点赞,转发你的推文等等。

这是我第一次尝试智能合约开发。踏过了 Solidity,各种开发框架,本地环境搭建,Debug,Test 等等的坑。智能合约开发和 Debug 都比 Web 开发或者 Python 之类的难度高。由于智能合约更新的困难,我也写了很多 Test。Test 代码大概在合约代码的两倍左右。

具体的一些坑可以看我的 Twitter。关于智能合约开发的推荐流程如果大家感兴趣的化可以考虑以后整理一下。

🎰 Variational Inference Solver for CP Decomposition :这个是我第一次使用 Pytorch,第一次尝试机器学习。感觉倒是不错。Pytorch 非常的简单易用,至少写网络结构的时候是这样的。比较麻烦的是训练,测试和调参的代码。这些代码的行数是网络结构的 4 倍。

这个项目是张量计算的期末项目。虽说是张量积算课,这个项目更需要的是机器学习的技巧。在众多的 Variational Inference Solver 中,我们最后选择了 Variational AutoEncoder 去实现 CP Decompostion 的重建。

这个项目主要的困难之一是对问题的定义。这个题目是教授直接扔给我们的。看到题目的那一瞬间就是迷茫,根本不知道题目里的这些术语是什么意思。在未知的领域逐渐摸索,找到思路。这可能是对大多数人来说最害怕的部分。因为在探索的过程中不知道自己的思路是否正确,离终点到底还有多远。随着截止日期的临近,这种压力会越来越大。

接下来的困难就是技术实现上的难题了。之前提到过我以前从来没有用过机器学习,幸亏 Pytorch 上手容易,我并没有在网络结构上吃太多的亏。主要的问题还是调参。应该用多大的网络,训练数据要多大,batch,learning rate 又分别是多少。我最后采用了 Ray 来进行自动调参。自动调参的想法很简单,就是尝试不同的超参数组合。但自动调参的代码写起来还挺多的,上百行的样子。最后的效果其实也差不多,没有想象中翻天覆地的变化。

💰 Ethereum wallet analysis :这是在 DEFI 火热的时候写的。用于分析某个钱包地址 DEFI 投资的表现。如果这个钱包表现好的话,我可以选择跟单,也去赚一点钱。

这个项目的主要难点之一是数据清洗。我从 Zerio.io 上获取钱包的交易数据,用 Pandas 进行清洗。第一次使用 Pandas 清洗数据遇到不少难点。比如怎么处理日期,怎么对行和列进行操作等等的基础问题。

后续的分析也遇到不少问题。分析的思路很简单,首先把交易根据交易对进行分类,然后分析每个交易对的盈利情况。进一步分析就把交易对的交易记录详细分成单子。去寻找开仓和平仓的时候,然后分析这一个仓位的盈利情况。但在实际操作中会遇到各种各样的问题。比如用户不平仓,用户的交易对比较复杂,把不同的代币进行呼唤。又比如用户从其他钱包里收到了钱,然后进行交易。这些情况都使分析更加困难。或许用 Time Weighted Rate Of Return 或者 Dollar Weighted Rate Of Return 会更好。

即使找到了好的钱包,真正跟单的时候也很困难。由于 Defi 的高波动率,即使是 1,2 分钟的数据延迟都会对收益造成巨大影响。

关于区块链的新技术,新思想如果大家感兴趣的化可以考虑以后整理一下。

🖼️ Daily picture :这个项目可以把你在 Pixiv 和 Twitter 上点赞的插画给下载下来。我的出发点是希望把我喜欢的插画下载到本地,方便随时欣赏。毕竟一张图片包含着那么多的信息,绝对不是在手机上一眼扫过去 3 秒内能够欣赏完的(上完艺术史的课才意识到一张画应该如何去体会)。因此我采用了增量更新的方式。如果你是第一次运行脚本,它会下载你最近喜欢的 50 张图片。当你下次运行脚本时,它只会下载你最新喜欢的所有图片。

这个项目的难点只是挑选合适的库。好用的 Pixiv 库还真的不多,大部分都有点缺胳膊少腿的感觉。

✉️ Webpush notification :这是我今年的第一个项目。它可以帮助基于 Hexo 的博客给读者通过浏览器推送通知。如果你希望你的读者能够第一时间知道你的更新,这个插件非常的实用。

在实际开发的过程中,遇到最大的问题就是 Hexo 文档。Hexo 的文档挺简陋的,关于插件开发在网上也没有太多的资料,大部分时候都得自己动动脑子。 而且制作插件也没有什么配套的开发或者 Debug 工具,得自己用最原始的方式慢慢来。

🚗 Ansible playbook for common VPS setup:在之前折腾新的 VPS 的时候,我采用了 Ansible 来做自动化部署。Ansible 我在以前介绍过,可以很方便的进行自动化运维,强大的 Devop 工具。这个仓库包含了我自己常用的 Ansible 脚本。

☁️ BlenderCloudRender:用 VPS 或者免费的 Goolge Colab 来渲染自己的 3D 作品。那段时间我特别喜欢做一些 3D 的东西。但是 3D 的东西渲染又很慢。所以动手写了这样一个脚本可以把渲染放在云端。由于专业的渲染服务器太贵,我就选择了把渲染交给便宜的 VPS 或者免费的 Google Colab。

这个项目的难点在于和服务器通信。和服务器搭建了 SSH 连接后怎么跟它进行通信,怎么要求它执行脚本,如何获取脚本执行结果。

➕ ShuttleBus:这个项目是优化班车排班,是我运筹学的扩展。由于全程调用 Google 的 OR 库,其实并没太要求运筹学。

项目的难点在于将问题建模,变成一个个 constraint。然后将这些 constratint 按照文档一个个变成代码。有一些比较偏门的 constraint 我找了很久。另一个难点便是数据。由于要求每段路程的驾车时间,如何获取这些时间。如果我们从导航上获取这些时间,可信度又是多少?我们需要基于统计学给出一些解释。

🕸️ Hexo cheatsheet :这也是今年上半年的一个项目。现在看来这就是个换皮项目。将别人的 cheatsheets 网站样式扒下来放到 Hexo 里去。当初觉得自己需要一个记录 cheatsheet 的网站,但实际做完以后发现不如 Notion 好用。

我的 CSS 一直挺菜的,做这个最挣扎的就是改 CSS 和模板文件。

⚙️ Tool Site:这个网站计划是来展示我的工具的。随着使用的工具越来越多,我觉得有必要记录并且展示这些工具。但最后还是发现不如 Notion 好用。

由于我不擅长写 CSS,我前期使用了可视化的网站开发工具。把样式做好了以后直接导出 React 代码,自己再给它接上数据就行了。实际使用体验还不错,基本避过了我最讨厌的 CSS。缺点之一是导出的 React 代码有点奇怪,用了不少那个开发工具定制化的组件。另一个缺点就是接上数据以后的项目就不能重新倒入了。不太方便迭代。

🖼️ Gallery:这是个半成品,是作为 Daily Picture 的前端。原来的构想是可以有一个网页来欣赏自己喜欢的插画。希望这个网页可以尽可能大的展示插画。但是由于我自己养成不了欣赏以前喜欢的插画的原因,不了了之。

🖼️ ImageExcerpt:Gallery 的配套工具。用于给一个帖子几十张图片生成预览图。思路是我们提取每一张图片的调色盘。接着我们按照图片顺序,将这些调色盘一行行的堆叠起来。这样只看预览图就可以感受到这个帖子里图片的色调和情感。

📔 Hetushu :这是一个很简单的项目。只是把小说从网站上扒下来。

这个项目的难点是后续去除广告。网站的反爬措施之一就是添加了很多广告在正文。网页浏览时看不见,但你把文字扒下来的时候就会发现这些千奇百怪很难用正则匹配去除的广告。

明年

明年也就是 2021 年已经来了。2021 年应该是比较重要的一年,因为大学要毕业了。这一年的决定将会直接影响未来的 2-3 年。到底是走哪个方向呢?数据科学?应用数学?区块链?

明年希望能够拓展一下知识面。多看一点书,多学学其他的东西。就目前来看,希望 2021 年可以看一些诗词有关的书。古人对于字词的精确运用令人叹为观止。作为一个讲白话文的现代人也只有羡慕的份了。举个例子,大家可以感受一下古人的用词。“小山重叠金明灭,鬓云欲度香腮雪”来自温庭筠写的菩萨蛮。如果让我来概括这句词,大概就是大中午的,女孩子还在睡觉。这画面感,韵味差的实在是太远了。原词中对颜色运用强烈的刺激着读者的感官。明年希望以次为契机,能够提升对字词的运用。

生活在一个法治社会,不学习一点法律怎么行。希望明年通过罗翔的视频了解一下中国的法律,也是了解一下专精于法律的人他们是怎么思考的。

不少人对明年的区块链都抱有期待。期待看到 DEFI 催化的一系列变动。我也是挺希望明年能够以开发者去加入这个生态。现在以太坊的手续费实在是太高了,我一再怀疑是不是只能做一些跟钱有关的应用。只有更多的利益能够战胜更高的手续费。今年区块链的热门项目都跟经济学有着很大变化。一个好的激励措施可以让用户真正自发的参与到项目当中去。经济学或许会应用到未来更多的区块链项目中。要不是学校里经济专业的预备课程打分太低,我都想修经济专业了。

另一个比较重要的是对知识和信息的整理。今年磕磕绊绊开始使用 Notion 了。用 Notion 来记录一些比较好用的工具,整理一些笔记和知识。实际需要用到这些笔记的次数也在不断增加。随着记录越来越多的东西,今后可能会更加频繁的回过头来找些什么。整理信息是明年最重要的,我需要一个存储空间更大的脑子。

类似于信息整理,下半年上网课的时候我发现了 Figma 非常适合用来做笔记。它强大的排版功能让我随心所欲的整理知识点。把重要的定义或者公式截图下来根据章节放到不同的 Frame 里。目前最大的问题在于索引。没办法搜索图片中的文字,或者知识点。另一个问题是图片的尺寸大小不一,字或大或小,不太工整。看看明年怎么改进一下,应该不会太难。大不了写两个插件。这种无限大小的画布用来整理知识点真的很赞。

祝各位读者新的一年要快乐,自由,有意义。

从哪儿寻找新的区块链项目?

作者 琉璃
2021年1月1日 00:00

人间一天,币圈一年。这些新项目我们应该去哪里找呢?

Web3 基金会也会定期放出他们资助的项目。 Ethereum 基金会:在它的Blog中可以看到最近受到资助的项目。

风投机构

可以在 Crunchbase 上订阅他们。

Dragonfly Capital 投资了很多区块链项目,团队成员以中国人为主,主管是冯波。在它的投资列表中可以找到很多熟悉的项目。在Dragonfly Capital 的研报中可以看见他们投资的新项目。 https://pic1.zhimg.com/80/v2-a6527926ff86de682628f686bb2d20ec_720w.jpg

#HASHED 是一个来自韩国的风投机构,关注亚洲和美国的区块链项目。他们主要投资区块链平台,金融基础设施和应用。在这可以发现他们的最新动态。

dekrypt capital

Lemniscap他们的 Blog。

FBG Capital

Astronaut Capital

Placeholder

Picolo Research 聚合了各种区块链项目并且提供调研报告。

Cryptofund提供各种加密货币基金。

Dekrypt Capital 专注于投资区块链基础设施

Coinbase 风投

Ideocolab 风投

Blockchain Capital

Pantera Capital

共识实验室提供基金月报。

Create Smart Contract

作者 琉璃
2021年1月1日 00:00

一键搭建初始化以太坊开发环境。

开发经历

这个项目有点类似 create-react-app。目的是帮助开发者快速初始化开发环境。做起来还是挺简单的。就是写一个 Node 脚本。里面包含初始化项目文件夹,安装依赖和替换模板文件。具体项目使用和介绍可以 看 Github 主页

使用指南

首先你得已经全局安装 truffle。这样create-smart-contract myapp,会用 truffle 为你初始化一个项目文件夹。然后为你安装一系列有用的插件和包。最后给你生成一些默认的配置文件。以下是包含的框架,插件,包和配置文件。由于目前 Openzeppelin 不支持 0.8 的 solc,所以我默认使用 0.7 的最新版。

除此之外我还加入了一些有用的 Node 脚本。

  • npm run test: 用来跑测试的。我这采用了 Hardhat。因为它跑 test 的速度快,并且支持在智能合约中使用console.log
  • npm run doc: 根据 doxygen 自动生成文档。
  • npm run coverage: 根据配置文件 .solcover.js 生成测试覆盖率报告。
  • npm run analyze 根据配置文件 slither.config.json 静态分析智能合约。注意:要求已经安装 Slither

自定义

你可以自定义想要的包。更改index.jsinstallPackages。例如

1
2
3
4
5
6
7
8
9
const installPackages = () => {
return new Promise((resolve) => {
console.log("\nInstalling hardhat\n".cyan);
shell.exec(`npm install --save-dev hardhat`, () => {
console.log("\nFinished installing packages\n".green);
resolve();
});
});
};

模板

你可以自己更改,添加或删除模板。例如你想要添加模板,你需要将模板文件加入 templates/ 然后修改 templates/templates.js。例如

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
let fs = require("fs");
let path = require("path");
const gitIgnore = fs.readFileSync(path.resolve(__dirname, "./gitignore"));
const solcover = fs.readFileSync(path.resolve(__dirname, "./solcover.js"));
const slither = fs.readFileSync(
path.resolve(__dirname, "./slither.config.json")
);
const hardhatConfig = fs.readFileSync(
path.resolve(__dirname, "./hardhat.config.js")
);
const truffleConfig = fs.readFileSync(
path.resolve(__dirname, "./truffle-config.js")
);
const prettier = fs.readFileSync(path.resolve(__dirname, "./.prettierrc"));
const package = fs.readFileSync(path.resolve(__dirname, "package.json"));
const env = fs.readFileSync(path.resolve(__dirname, ".env"));
module.exports = {
".gitignore": gitIgnore,
"solcover.js": solcover,
"slither.config.json": slither,
"truffle-config.js": truffleConfig,
"hardhat.config.js": hardhatConfig,
".prettierrc": prettier,
"package.json": package,
".env": env,
};

祝你开发愉快。

Polkadot:今年最有潜力的公链

作者 琉璃
2020年11月24日 00:00

我最近才知道有Polkadot这么一条公链。它的市值排名第八。我知道的的确有点晚了。它的创始人是以太坊的联合创始人。它有 Web3 基金会的支持。如果说在以太坊上开发的是智能合约,Polkadot 上开发的就是区块链。可以自定义的区块链给了开发者更多的自由,我们可以改变它的 Runtime,改变它的共识算法等等。官方也发行了开发工具 Substrate 帮助开发者快速构建自己想要的区块链。Polkadot 这条公链便是基于 Substrate 框架。在 Polkadot 创始人的一次演讲中,他为了展示 Substrate 的易用性,现场 Coding Demo 特意拿出刚刚从苹果店买的 Macbook Pro。现场开箱并使用 Substrate 开发了一条区块链。

说了这么多开发者关心的问题,Polkadot 到底解决了什么问题呢? 在我看来 Polkadot 解决了并发的问题。因为其独特的 Relay Network, Polkadot 可以并行的处理所有挂在其上面的公链的交易。跨链在 Polkadot 的设计下也变得简单了。数据,资产都可以在不同的链上进行转化。如果用过 Flamingo 等跨链资产工具的人应该知道这些工具有多难用。每次跨链都得调用很多的合约,交不少的手续费。另一个有意思的特性是区块链的升级。这应该算是 Substrate 的特性。由于其将 Runtime 编译成 WASM 放在区块中,区块链的升级不再会导致硬分叉。传统区块链升级需要矿工们升级节点软件版本。如果有些矿工不愿意升级或者忘记升级,这条区块链就会变成两条,也就是硬分叉。

对于挂在 Polkadot 上的链,官方称其为 Parachain。这些 Parachain 既可以是公开的,也可以是私有的。既然 Polkadot 是基于 Substrate 开发的,Parachain 也需要基于 Substrate 开发,那么我们可不可以挂一条 Polkadot 到 Polkadot 上呢?这的确是可行的,我们可以无限套娃。目前官方给出的正在开发的 Parachain 有兼容 EVM 的智能合约区块链,文件存储区块链,身份验证区块链,隐私区块链,金融区块链,IOT 区块链,预言机(Chainlink)等等。这些项目有的看的云里雾里,有的只是把现有的应用拷贝到 Polkadot 上。

2020 年第 41 周

作者 琉璃
2020年10月11日 00:00

确定了这个学期的选课。

这周做了什么

VPS 设置

把 VPS 给设置好了。其中最花时间的是网络的配置,反向代理的配置。这些部分出错了很难找到原因,需要不断的去更改配置找到正确的方法。

我本来以为 VPS 价格翻倍性能也翻倍,其实并不是。$5 的 VPS 是 1G1C。$10 的 VPS 是 2G1C。价格翻倍了,但是 CPU 数量没变。但是从$20 到开始,基本就是价格翻倍,性能翻倍了。

关于具体在 VPS 上安装了那些软件,怎么进行维护可以看 这一篇文章

这周看了什么

  • Array programming with NumPy:这篇文章展示了 Numpy Array Computation 的火爆以及先进。大致感觉就是 Numpy 自己吹自己一波。Numpy 觉得未来的挑战将会是面临更多的用户以及为不同的专业计算平台做适配,比如 FPGA,TPU 等等。
  • Nginx-proxy:方便快捷的为运行在 Docker 中的服务做反向代理。
  • Huginn: 自动化软件,像 IFTTT。
  • 用谁都能看懂的方法解释分布式系统,大概。.:一个听不错的分布式系统专栏。
  • 一个书魔程序员的读书简评:同上。
  • rsms: 一个设计师的个人网站。颜色的运用很棒。
  • 一本书:Designing Data-Intensive Applications, 对应程序员 3 能力中的工具箱深度广度两个概念-1:多范式编程和最小表达力原则 (least expressiveness principle), 对应程序员 3 能力中的程序语言理解深度和表达抽象能力两个概念-2:领域驱动设计 (Domain Driven Design),对应程序员 3 能力中的方法论,编程大道 (programming in the big),和构架能力。

歌曲

Oskar Roman Jezior

Oskar Roman Jezior 是一位德国的钢琴家。他弹奏了很多华语流行歌曲,比如《时间煮雨》,《不为谁而作的歌》,《十年》,《说好不哭》。他的弹奏富有感情,轻重缓急的对比非常明显。

这周评价

除了网格交易,上周要做的都做了。 Designing Data-Intensive Applications 目前进度:1/12

下周做什么

  • 读一章 Designing Data-Intensive Applications
  • 自动抓取 Twitter 上喜爱的图片保存到本地
  • 网格交易

我拿 VPS 来干什么

作者 琉璃
2020年10月11日 00:00

从一开始不知道在 VPS 上跑什么服务,到现在 VPS 上跑满服务。

随着容器技术的成熟,部署软件和维护 VPS 不再像以前那么复杂。以前的软件大多是直接跑在 VPS 上,我们要为其设置反向代理,安装 Nginx。在软件安装的时候也很容易出错。现在很多软件都支持用 Docker 安装。稍微修改一下配置文件,我们就可以一键启动容器了。服务相互之间隔离,管理 Docker 可比之前折腾直接装在本机上的软件方便多了。那么我们具体应该怎么管理 VPS,VPS 上又有什么有用的软件可以安装呢?

VPS 管理

首先介绍几个提升 VPS 使用体验的软件。他们分别是 VSCode,Ansible,Htop,Portainer,Nginx-Proxy,Netdata。

Vscode

自从 VSCode 推出了远程 SSH 功能,在 VPS 编辑文件一下子变得方便了起来。编辑文件的同时还有 Terminal,还有文件树。如果安装了 Docker 插件,我们还可以轻松的管理容器。不过需要注意的是在 1G1C 的 VPS 上可能跑不动 VSCode。

Ansible

我曾在第 35 周提到过 Ansible,一个自动运维工具。我们可以将常用的操作写成 Ansible Playbook 以重复使用。比较好的习惯便是执行一个操作遍将其写成 Ansible Playbook,保证它的可重复性。

Ansible playbook 某种意义上与docker-compose.yml 有重叠。例如我们在docker-compose.yml中有两个 service,Nginx 和 Portainer。我们既可以在 Ansible playbook 中直接调用这个docker-compose.yml,也可以将 Nginx 和 Portainer 分别写进 Ansible playbook,不再用到 docker-compose.yml。这么做各有利弊,docker-compose.yml更方便进行分享。写进 Ansible playbook 中则更加灵活,方便后续修改和使用。

目前唯一的缺点是 Ansible 不支持 Windows,我们需要在 WSL 或 Docker 中运行 Ansible。

Htop

一个来查看系统资源的 Linux 命令。可以展示 CPU,RAM,进程占用系统资源的信息。它也支持过滤和搜索,可以展示特定的某些进程的系统资源使用。

Portainer

Portainer 是一个容器管理软件。它有一个 WebUI,让我们可以在 Web 界面管理 VPS 上的容器。以前删除一个容器,我们需要先找到容器的 ID,然后停止它,最后删除它。在 Portainer 上我们可以一键移除容器,并且可以方便的删除现有容器不在使用的 Volume。除了管理容器,Portainer 也可以用来部署容器,给容器分组等等。

Nginx-Proxy

为了可以用域名访问到这些在不同端口的服务,我们需要一个反向代理。反向代理会帮助我们将进入的流量转发到对应的服务中去。

Nginx-Proxy 就是这样一个软件可以帮助我们将流量自动转发到运行在 Docker 中的服务去。这算是配置非常简单的网络服务软件。如果需要额外的 SSL,可以使用配套的 docker-letsencrypt-nginx-proxy-companion。照着教程走就可以完美完成设置。需要注意的是如果你用 Cloudflare 做 DNS,记得关闭 Proxy 模式,用 DNS Only 模式。

Netdata

一开始认识到的资源监控软件是 Grafana。Grafana 的灵活度更高但是做不到开箱即用,而且还需要安装额外数据库。因此最后我使用过的是轻巧的 Netdata。Netdata 可以做到开箱即用并且展示了大量的系统资源数据。由于展示的数据过多,会显得有些杂乱。

我在用的软件

TinyTinyRss

大家都在用的 RSS 服务。其缺点还是很明显的,很多 UI 设计比较过时,软件较为臃肿占用较多的资源。

Huginn

Huginn 是一个自动化软件。用起来有点类似 IFTTT。

如果要使用 Huginn 的邮箱服务,我们需要为其 Docker 添加跟 SFTP 有关的环境变量。具体例子 在这

Netease music

UnblockNeteaseMusic 用来在海外解锁灰掉的网易云音乐。

暂时就这些,仔细一整理发现 Devop 的软件比真正干活的软件要多。最后附上我的docker-compose.yml

在 PC 上玩塞尔达传说

作者 琉璃
2020年10月4日 00:00

没有 Switch 也可以玩满分游戏塞尔达:荒野之息

Wiiu 是任天堂的一款掌机平台。大部分登录 Switch 的游戏都会登录 Wiiu。因此想要玩上塞尔达传说,除了用 Switch 模拟器,我们还可以用 Wiiu 模拟器。

Cemu 便是一款较为成熟,使用方便,支持丰富插件的 Wiiu 模拟器。

下载安装 Cemu 后,游戏应该去哪下载?需要注意的是 Wiiu 游戏分美版,欧版和日版。这些版本的语言并不通用。大部分的汉化补丁只能运行在日版游戏之上。

游戏下载

游戏下载可以用 FunKiiU。只要输入需要游戏的 Title 和 Key 即可下载。在 这个网站 上可以查询到游戏的 Title 和 Key。注意!不要漏掉可能存在的补丁和 DLC。如果漏掉了补丁,可能会出现Your must perform a system update to play ***这儿 有解决方法。

除了 Funkiiu 这个工具,我们也可以在 这个网站 进行下载。这个网站上集合了很多 Wiiu 游戏,并且这些游戏都包含汉化补丁。

游戏处理和安装

下载完游戏,我们需要将这些凌乱的文件解密成 Wiiu 模拟器可读的文件。CDecrypt 可以帮助我们进行解密。将title.tiktitle.tmd拖入CDecrybt_v2.0b.exeCDecrybt_v2.0b.exe会将这些文件解密为code/,content/,meta/三个文件夹。具体步骤可以参考 这个视频

导入 DLC 和补丁都是打开 Cemu->文件->Install game title, update or DLC,选中meta/meta.xml即可。

汉化补丁以图像插件的形式工作。我们需要将下载下来的汉化补丁放到Cemu/graphicPacks下,并且自己为其编写一份rules.txt。具体操作见这个视频

游戏优化

在图像插件之中有一些提升画质,粒子效果,阴影的插件,还有锁帧,更改分辨率的插件。这些插件根据个人需要打开。

Cemu 有两套 API 可以使用。在选项->工具->常规设定->图像中可以查看。分别为 OpenGl,Vulkan。Vulkan 可以调用显卡,提供更好的性能。

除了更改 API,我们还可以对 CPU 进行设置。右键点击游戏->Edit game profile, 我们可以根据自己的 CPU 性能调整 CPU ModeMode。 Thread quantum 对性能影响不大。

最提升性能的是替换 Shader 缓存。在这个网站上可以找到几乎所有游戏的 shader 缓存,将下载下来的文件放入cemu/shaderCache/transferable/。这个缓存并没有覆盖所有的资源,即在游戏中我们还会需要加载部分资源。但是相较于不替换,有着巨大的提升。具体步骤 参考视频

就塞尔达荒野之息,还有 个人开发的光追插件,为塞尔达加上了真实的光影。

终于可以玩上塞尔达了。这个模拟器的性能还行,虽然不能让我达到全程 60 帧,加载素材总会有一点卡,但也总算是能在不差的画质下流畅的跑起来。就连 Switch 的陀螺仪也可以通过 PS4 手柄的陀螺仪进行模拟。这篇文章只是概述了整个流程,具体步骤我都尽量附上了视频。最后这个视频 解释了游戏下载,游戏文件处理汉化安装和输入设置。

2020 年第 40 周

作者 琉璃
2020年10月3日 00:00

开学了!

这周做了什么

塞尔达传说

塞尔达传说被奉为开放游戏世界的标杆。作为一个游戏爱好者当然不能错过这款游戏,即使我没有Switch也不行。Cemu给了我在PC上玩塞尔达的机会。它并不是Switch模拟器,而是任天堂的Wiiu模拟器。还有人为其开发了光追插件,塞尔达 RTX ON!具体的安装教程可以参考上一篇文章

图片展示网站

完成了UI设计,采用了深色背景,图片更有辨识度。很多图片网站都采用了一个网页尽量展示多的图片,比如pixiv,dribbble,点击图片可以进行放大。这种方式有利于展示大量图片,但是不利于用户仔细的观察这些图片。因此我尽可能放更大的图片,给予用户有沉浸感,和更多的图片细节。

对于文章,我们一般会在主页提供摘要来帮助用户快速了解文章的主要内容。那怎么给图片提供摘要呢?这个项目给了我启发。我们可以将所有图片按照某种顺序融合成一张题图。只看题图,我们可以对这些图片的色调有大致的了解。

DEFI

最近大火的DEFI我也参与了一脚。DEFI是Decentralized Finance的缩写,意思为去中心化交易所。整个交易所由智能合约构成,运行在区块链上。交易所的流动资金由用户提供,提供流动资金的用户会获得奖励,一般为交易手续费加上代币奖励。不同DEFI项目区别在于他们的做市商算法,即如何撮合用户的交易。基本所有算法做市商都存在无常损失,即你放进去多少钱提供流动性,拿出来的时候钱只会变少,不会变多。

怎么看为这些项目提供流动性几乎是稳赚不赔。为相对稳定的交易对提供流动性可以降低无常损失。剩下的只要选择收益高的项目就行了。往往项目初期的时候收益较高。在初期,参与的人较少,有更多的激励。总之会不会暴富这说不好,但是手续费是真的贵。以太坊一次转账就是10刀。流动性挖矿似乎钱越多越划算。

除了自己寻找项目,不少传统交易所都推出了流动性挖矿的项目,利率高的惊人。传统交易所整合用户资金,选择合适的项目,进行更高效的流动性挖矿。

从总锁仓价值来看,Defi的快速增长已经过去,目前总锁仓价值在13B左右浮动,已经不在快速增长,甚至出现小幅下滑。

极简欧洲史

这本书用的语言比较随意,读起来也比较轻松。书中从宗教,日耳曼人,罗马这几条线讨论了欧洲中世纪到近代的发展。书中有一些点让我记忆深刻。

中国很早就采用了中央集权,很难理解欧洲到了中世纪还是封建制度。作为国王天天得和自己的强力封臣扯皮,而且国王还打不过这些强力封臣。钱,税收,兵力都得依仗这些封臣。封臣对君主的效忠极大成功依靠契约,而不是利益之类的。随着欧洲各国的摩擦日益加剧,君主们找到了扩充军力的借口。至于这些庞大的军队是为了保家卫国,还是对内打压不听话的封臣就看君主的想法了。在这些扩军的国家中,最神奇的便是英国。英国作为岛国,海军是它与其他国家作战的主力。可是这海军可不能用来打自己的封臣,要打自己的封臣得靠陆军。因此英国的君权仍旧极大的受限于封臣。

统治阶级是如何看待中产阶级呢?统治阶级认为中产阶级的生活依赖于城市,而不是这些统治者。即换了个统治者,中产阶级仍旧那样的活着。 > 这些欧洲君王降伏旧日贵族后,随即成为一个活跃的 新兴阶级一一城市里的中产阶级的支持者。当年这些君主势单力簿,曾经允许各个城镇自治,而随着城市的财富日增,这个让步也变得更加举足轻重。相较于自拥大军、躲在城堡里防御自己的贵族,中产阶级似乎平和得多,不具威胁性。然而,无论贵族多难应付,他们毕竟是社会秩序的一部分,而在这个社会秩序里,国王是天经地义的元首;反观中产阶级,他们的生活方式根本无需国王的存在。长远来看,对于王政的威胁远比贵族更棘手。 # 这周看了什么 * Key Combiner:这个网站可以帮助我们学习和记忆快捷键。网站提供了常用软件的快捷键。 * Coin Gecko:查看和追踪加密货币价格。 * Macro Trends: 提供不同宏观经济指标的走势图。可以查看不同的股票指数,按照行业,市值排序查看股票。 * Zapper.fi:提供钱包的Defi资产分析,提供一键式流动性挖矿。界面美观。 * DeBank:同上,但是提供更多的Defi分析,比如锁仓价值,流动挖矿利率。 * Playwright for Python:微软出品的Python端到端自动化框架,有点像Puppeteer

歌曲

Octopath Traveller OST

《八方旅人》原声带,作者为西木康智。很难想象这么优美有古典风格的曲子是仅仅30岁的西木康智制作的。非常期待他以后的作品。8-bit Music Theory对西木康智在曲子中大量运用转调进行了分析。我乐理差,这个分析也听得一知半解的。

山居秋暝

活泼的嗓音唱出王维的《山居秋暝》。用流行音乐重新诠释古诗给我带来了不同的感觉,不同于中学时代背诵古诗的感觉。这种音律让古诗更加动听,我也更愿意去听。除了这首《山居秋暝》,《杨花落尽子规啼》也是我很喜欢的一首,它并不是那种活泼的感觉。

这周评价

其实这些事情来自最近一个月。自从夏校结束,假期开始我就开始躺,自然也就什么计划,写不出周报。不得不说开学了以后,做事的效率突然飙升。就像电脑从关机状态变成开机运行一样。娱乐的时间减少了倒是真真确确的减少了。我们真的需要那么多娱乐时间吗?假期的时候陪女朋友看了沉默的真相。这属于那种看了开头就知道是什么味道的片子。这部片子的主题是司法公正,官商勾结。这些也算是老生长谈了。这电视剧我不怎么喜欢,总感觉节奏拖沓。有点类似玩手游的感觉。手游厂商跟玩家反着干,给玩家设置诸多限制,不让玩家轻易的拿到他们想要的,比如体力限制,升级需要大量的素材。电视剧为了让观众不那么快的了解到真相,谜底,叙事弯弯绕绕,给线索跟挤牙膏一样。电视剧的叙事手法有点东野圭吾的感觉,寻找案件背后的故事。

下周做什么

  • 读一章Designing Data-Intensive Applications
  • 看Array Programming with Numpy
  • 尝试ActionsFlow
  • 尝试网格交易
  • 使用Trafik
  • 使用Portainer
  • 使用Huginn

2020 年第 33 周

作者 琉璃
2020年8月24日 00:00

八月底了,是时候考 GRE 了。

Weekly Report 2020 年第 32 周 (08-17 到 08-23)

这周做了什么

CG

初步尝试了云渲染。效果还可以,但是并不能加速流体。配置渲染节点可以 看这。本来打算用 Digital Ocean,但是它风控比较严苛,注册新账号有点麻烦。

我想做了一个流体的字体动画。流体在字体中流体,逐渐充满整个字体。也想做一个 物体掉入水中的动画。就目前来看,这个动画渲染就得一两个礼拜,或者花个几十刀,使用渲染农场。

龙族

看完了三本龙族。可以感觉到前两本剧情都比较紧凑,讲的都是和主线有关的故事。到了第三部,整个篇幅长了不少,会有些啰啰嗦嗦的地方。全书中有不少伏笔,但有些伏笔直到故事的结束也没有用上。

第二本中董事会要求主角团寻找失去的资料。事发地点火车南站出现了两个人的身影,一个是猎人唐威,另一个人应该是夏弥。在书中并没有指出这个人是谁,只是像写伏笔一样提了以下,但后续这个伏笔没用上就是。

第三本中有很多很多的登场人物,虽然他们大部分都是打酱油的,对主线并没有什么贡献。看江南的随笔《龙与少年游》时,他说到有些故事的产生是由于灵感。“‘校长其实是个后背满是文身的黑道老混子。’这个概念其实是忽然出现在脑海里的,单纯就是觉得这个概念很棒,于是单独衍生出一条校长个人的日本线索来,在这条线上有上杉越,有犬山贺。” 上杉越,犬山贺有着自己的故事,但是他们的故事和主线关系并不大。江南对于这几个人物的构思并不基于主线故事,而是他觉得这个人很酷,所以他想把他写出来。“‘那美好的仗我已经打完了,应行的路我已经行尽了,当守的道我守住了。从此以后,有公义的冠冕为我留存。’我心中的上杉越因为这句话而成形。”

刚认识路明非的时候,他就是个弱小,懦弱的臭小孩。他一点都不给力,他没有勇气去争取更多的东西,比如诺诺,陈雯雯,社团,在叔叔婶婶家中的地位。但江南说,“路明非真的很棒,对于某些年少而热血的读者、恨其不争的读者,我得说你们再长大一点就会明白,生活不是意淫小说,没有白来的升级机会,而路明非真的很棒,他的勇敢是真勇敢,从骨头里榨出来、从灵魂中淬炼出来的勇敢,我很希望自己能有那样的勇敢。”勇敢和怂本来是对立的,但是在路明非身上共存。路明非想要勇敢,只要付出四分之一的生命。他只有那一份的生命,"路明非是个穷孩子,他很怂他很欠他很不霸气,但他从未吝啬过付出。"

在那个魔幻世界发生的事情或许很难映射到我们的生活中。但这个例子或许能让你们理解一点。你的朋友要离开这座城市了,你可以和他最后在一起吃一顿饭,但是现在疫情肆虐,你的家人们也反对你出门。你愿意去见他吗?

这周评价

  • 提升阅读题目正确率到 80%。
  • 每天半个小时到一个小时的钢琴练习。
  • 学习完至少 3 个画画课程。
  • 画不同角度的几何体。
  • 尝试云渲染动画。

完成度 80%

下周做什么

  • GRE 备考
  • 尝试这个有趣的 剪辑
  • 尝试这个 动画
  • 完成一个画画课程

自建 Blender Render Farm

作者 琉璃
2020年8月24日 00:00

暂时没打算买新显卡,那渲染慢怎么办?云渲染!

为什么要自建云渲染

由于本地算力不够,或者单纯想要加快渲染速度,云渲染都是首选。一般的云渲染是使用现成的渲染农场,但是它价格偏高。如果可以使用多个 VPS 进行渲染,成本会比直接使用渲染农场低很多,除了 VPS 比较便宜,很多 VPS 供应商对新账号都会提供代金券。如果我们使用新账号进行云渲染,成本可以进一步被降低。

配置渲染节点

我们使用 CrowdRender 来管理渲染节点。本地的安装和使用直接看官网教程。我着重解释一下如何配置 VPS 。

首先我们需要安装最新版本的 Blender。

1
2
3
4
5
6
7
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install wget -y
sudo apt-get install python3-pip -y
sudo snap install blender --classic
echo 'export PATH=/snap/bin:$PATH'> ~/.bashrc
source ~/.bashrc
我们需要将 Crowdrender 插件上传到 VPS 上。我们可以使用 Winscp 进行上传。上传 ZIP 文件即可,不需要解压。

假设我们将 Crowdrender 上传到了/root/cr.zip

接下来便是开启插件。

1
2
3
4
5
6
blender -b --python-console

import bpy
bpy.ops.preferences.addon_install(filepath='/root/cr.zip')
bpy.ops.preferences.addon_enable(module='crowdrender')
bpy.ops.wm.save_userpref()
或者将这一块代码放入enableaddon.py,并用 Blender 执行。
1
2
3
4
import bpy
bpy.ops.preferences.addon_install(filepath='/root/cr.zip')
bpy.ops.preferences.addon_enable(module='crowdrender')
bpy.ops.wm.save_userpref()
然后用 blender 执行刚刚创建的脚本。
1
blender -b -P enableaddon.py
接下来便是启动渲染服务。
1
blender -b -P ~/.config/blender/2.83/scripts/addons/crowdrender/src/py_3_7/serv_int_start.py -- -t "server_int_proc"
# 局限 在完成渲染节点的设置后,我们只需要将节点的 IP 地址输入本地的插件中进行连接和同步即可。这个插件的连接是有点慢的。点了铁链图表要过了很久才会弹出选框。

目前已知的局限性为流体的渲染有点困难,除非你将所有的缓存和烘焙数据同步上去。

初入数值分析,如何写好代码

作者 琉璃
2020年8月23日 00:00

写一些关于数学的代码,和开发程序是两种不同的感觉。接下来是一些我个人常用的 Tips。

Sum

求和符号频繁的出现在各种公式里面。比如 Composite Simpson Rule:

\(\int^a_b f(x)dx = \frac{h}{3}(f(a)+f(b)+4\sum^{n/2}_{i=1}f(a+(2i-1)h)+2\sum^{(n-2)/2}_{i=1}f(a+2ih))\)

我之前看到求和符号的第一反应是这儿又得用 for loop 了。例如 \(\sum^{n/2}_{i=1}f(a+(2i-1)h)\) 可能会用以下的代码来计算。

1
2
3
4
sum=0
for i in range(1,n//2+1):
sum = sum+f(a+(2*i-1)*h)
sum

这是一个有点冗长,不清楚的写法。

Map

我们可以用 np.summap 函数来实现。

1
2
import numpy as np
np.sum(np.array(list(map(lambda i:f(a+(2*i-1)*h),np.arange(1,n//2+1)))))

瞬间把之前的几行代码压缩成了一行。这样写的坏处是括号比较多,在没有括号高亮的情况下容易出现漏括号或者多括号的情况。

Vectorize

这个方法全靠 Numpy。

1
2
3
4
5
import numpy as np
i = np.arange(1,n//2+1)
sum1 = lambda i: f(a+(2*i-1)*h)
vfunc = np.vectorize(sum1)
np.sum(vfunc(i))

这个思路感觉和 map 的思路类似,但是优势是创建了一个可以复用的 Vectorize Function,可以接受数组的输入。

Another For Loop

这个其实和 for loop 没什么区别,知识短了一点。

1
2
import numpy as np
np.sum([f(a+(2*i-1)*h) for i in np.arange(1,n//2+1) ])

这个方法会比较灵活。在面对多个参数的时候会比较好用。比如有一个函数 f(a,b,c,d), 只有 c 这个参数需要变化,a,b,d 都是不要变化的。我们可以写这样写:

1
2
import numpy as np
[f(a,b,c,d) for c in np.arange(n)]

矩阵点乘

这里我们用一个简单一点的例子。我们需要计算\(\sum_{i=0}^{n}a_ib_i\)。这个的本质其实是 a 和 b 两个矩阵的点乘。

1
2
3
a=[...]
b=[...]
np.dot(a,b)

快速生成一个矩阵

这个很简单。例如生成一个 5*5 矩阵。

1
2
import numpy as np
np.zeros((5, 5))

Table

Tabulate

1
2
3
4
5
print(tabulate([["Name","Age"],["Alice",24],["Bob",19]],headers="firstrow"))
# Name Age
# ------ -----
# Alice 24
# Bob 19
1
2
3
4
5
6
7
print(tabulate({"Name": ["Alice", "Bob"],
"Age": [24, 19]}, headers="keys"))
# Age Name
# ----- ------
# 24 Alice
# 19 Bob

Plotly

1
2
3
4
5
6
import plotly.graph_objects as go

fig = go.Figure(data=[go.Table(header=dict(values=['A Scores', 'B Scores']),
cells=dict(values=[[100, 90, 80, 90], [95, 85, 75, 95]]))
])
fig.show()

Plot

我每次都记不住怎么画图。

matplotlib

1
2
3
4
5
6
7
8
9
10
11
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(9,6))
ax.loglog(hs,composite_trapezoid_rule_error_func1,'bo-',label='CTR ERROR',lw=2)
ax.loglog(hs,np.power(hs,2),'ro-',label='err(h) = h^2',lw=2)
ax.set_title("Error in CTR approximation",fontsize=22)
ax.legend(fontsize=15)
ax.set_xlabel('h',fontsize=22)
ax.set_ylabel('err(h)',fontsize=22)
ax.xaxis.set_tick_params(labelsize=15)
ax.yaxis.set_tick_params(labelsize=15)

伪代码翻译

数组的索引从 0 开始,但是很多伪代码是从 1 开始。为了方便翻译,我们可以在所有数组的开头插入一个 0,这样数组的有效数据便从索引 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
import numpy as np
def sor(a,b,XO,omega,TOL,N):
n=len(a)
x=np.zeros(n+1)
a = np.insert(a,0,0,axis=1)
a = np.insert(a,0,0,axis=0)
b = np.insert(b,0,0,axis=0)
XO = [0.0]+XO
# step 1
k=1
# step 2
while k<=N:
# step 3
for i in np.arange(1,n+1):
sum1=sum([a[i][j]*x[j] for j in np.arange(1,i)])
sum2=sum([a[i][j]*XO[j] for j in np.arange(i+1,n+1)])
x[i]=(1-omega)*XO[i]+1/a[i][i]*(omega*(np.negative(sum1)-sum2+b[i]))
# step 4
if max(np.abs(b-np.dot(a,x)))<TOL:
print(f'Number of Iterations: {k}')
return x[1:]
# step 5
k = k+1
# step 6
for i in np.arange(1,n+1):
XO[i]=x[i]
print('Maximum number of iterations exceed')
return XO

assert np.allclose(sor([[4,3,0],[3,4,-1],[0,-1,4]],[24,30,-24],[1.0,1.0,1.0],1.25,1e-05,1000),[3,4,-5], rtol=1e-05, atol=1e-08, equal_nan=False)

❌
❌