0%

I prefer a layout like

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
workspace
- project-A
- dal
- some tables
- model
- thin data types
- utils
- important-feature-3
- model
- types
- functions
- project-B
- project-B-1
- project-B-2
...

Basically, A project is like a tree. The first few nodes are repos, packages, then comes with features. The leaf nodes can be "layers".

Thin types and functions should belong to a layer

Think types and logic should belong to a feature, unless the project itself is already a dedicated feature.

Why you need f64

There are some "good" arguments everywhere suggesting you to choose Decimal instead of f64

Decimal are good for internal controlled finincial systems, like a retail management system, exchange, etc.

But for trading systems, it's not always the case

Performance

Decimal cost 10x time on every operation

1
2
3
git clone https://github.com/paupino/rust-decimal/
cd rust-decimal
cargo criterion
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
addition/f64 (diff)/100                         time: [548.87 ps 565.59 ps 583.58 ps]     
addition/f64 (equal)/100 time: [537.25 ps 548.20 ps 559.82 ps]
addition/rust-decimal (diff)/100 time: [5.5445 ns 5.5545 ns 5.5650 ns]
addition/rust-decimal (equal)/100 time: [5.2867 ns 5.3015 ns 5.3162 ns]
division/f64 (diff)/100 time: [557.15 ps 578.31 ps 600.74 ps]
division/f64 (equal)/100 time: [542.87 ps 560.00 ps 579.80 ps]
division/rust-decimal (diff)/100 time: [18.646 ns 18.695 ns 18.752 ns]
division/rust-decimal (equal)/100 time: [6.5995 ns 6.6125 ns 6.6274 ns]
multiplication/f64 (diff)/100 time: [520.95 ps 533.24 ps 547.83 ps]
multiplication/f64 (equal)/100 time: [543.01 ps 561.07 ps 582.32 ps]
multiplication/rust-decimal (diff)/100 time: [5.3946 ns 5.4098 ns 5.4246 ns]
multiplication/rust-decimal (equal)/100 time: [5.3463 ns 5.3709 ns 5.4015 ns]
subtraction/f64 (diff)/100 time: [534.58 ps 546.43 ps 559.12 ps]
subtraction/f64 (equal)/100 time: [578.52 ps 598.97 ps 620.89 ps]
subtraction/rust-decimal (diff)/100 time: [5.5233 ns 5.5345 ns 5.5480 ns]
subtraction/rust-decimal (equal)/100 time: [5.3138 ns 5.3290 ns 5.3444 ns]

Rounding and truncation error

f64 has rounding and truncation errors, Decimal can specify the decimal point it rounds

Note: f64 has 15 decimal points that it can precisely represent

Say price of 0.1 doesn't have an exact form in binary format, but when displaying and generating network requests, actual rounding according to the exchange's requirement will be applied here so it become exact "0.1".

In a trading system, as price is always change, a small rounding doesn't matter.

It makes really little difference to calculate

Note: the example is based on f32 for brevity

1
2
3
"3.14" * "0.1" = 0.314
3.14 * 0.1 = 3.1400001049041748046875 * 0.100000001490116119384765625 = 0.31400002
%error = %0.000006

Special handling is needed in orderbook though, as sometimes we need to use f64 as the key

However, as soon as the same constant str -> f64 conversion algorithm is used for the same market,

3.14 is always 3.1400001049041748046875 and be fit into the same slot in a map

We don't do operations like "what is the size of price 3.14 in orderbook look like"

Cryptocurrencies

First claim, it's good enough for most common cryptocurrencies, BTC, ETH, SOL etc

Prices are from 0.0001 to 100000.00. It falls nicely into f64's precision.

Let's take some extreme examples.

Currency price of SHIB is 0.00002647, and one need to buy at least 1 SHIB on BinanceSpot, it's within the precision

If one buys (1Billion-1)=99999999 SHIB, it's $26470 USD, decimal points are 4 + 9 = 13, still a breeze to handle it with f64

PEOPLE/BTC price=0.00000041, we assume size is still 99999999999, it's 40999.99999959 BTC ! it's 2+11=13 decimal points

Some other exchanges may enforce a restriction on the step size, say 1000SHIB, and it will be easier to handle too

Most crypto types are 128-256 and sometimes 512 bit sizes

  1. Listed coins are don't need the high bits. \(\log2(10^{15})=49.82892142\) I haven't seen a listed coin that it needs to operates on 50 bits, not even SHIB and PEOPLE in exchanges. Even if there are something to trade, it makes no real differences to trade 1000000000000000 vs 1000000000000314. it's less than a penny's difference not to mention USDT/USDC has only 6 decimal points. A list of stable coins
  2. It only makes tiny sense is that you want to transfer or withdraw exactly 1000000000000314.15926535 coins, but again, why bother with it

Pains with Decimal

One pain point with decimal is that you need to take Decimal into consideration designing an algorithm.

But the decimal rules are different from each symbol and each exchange.

e.g. hyperliquid requires 5 significant digits on prices, and there has to be a tool to enforce it in the end

But even if you enforce 5 significant, you have to do it in the end, when sending orders, not in the middle

  1. you lose precisions if you do arithmetics on prices with original decimal points
  2. Decimal doesn't support significant digits, only fixed decimal points
  3. many operations may change Decimal's decimal, and you have to set decimal points again in the end
  4. even if you have set decimal points, if it's wrong, the whole order will be rejected or the exchange impl have to check again

Another point is with middle price of orderbook. Usually for bid=100 ask=101 you have numbers like 100.5, and with Decimal(decimal point 0), you can't represent it.

Alternatives

We can add additonal fields instead. if an symbol requires really high precision, it can refer to price_hp if it's set explicitly

1
2
3
4
5
6
struct Order {
price: f64,
price_hp: Option<Decimal>,
size: f64,
size_hp: Option<Decimal>
}

本以为自己打过NOIP,基础算法还不错,却因为长时间没有做题而手生。加上面试时的氛围和奥赛的氛围不一样,还是有必要刷一遍LeetCode,顺便熟悉一下Java的语法。

给自己定下的目标: 每天刷题1小时左右,兼顾效率和速度,争取在9月开学前刷完一遍 每天在这里总结刷过的题目,将不熟练的题目特别标注

2. Add Two Numbers

https://leetcode.com/problems/add-two-numbers 将两个链表表示的长整型求和 这是一道简单题,但我犯了几个错误 1. 读错题目,链表已经是反转过的,即低位在前 2. 处理复杂逻辑(l1 != null and l2 != null)尽量在同一个循环内完成,而不是拆开来做 3. 处理末尾的0,可以特殊判断,也可以从返回第二个节点开始的链表

自从服务器前端无法访问,后台无法登录,我已经准备好了服务器的全部备份,打算从xrea迁移到AWS。

选用的操作系统是RHEL 8, LEMP架构。(注明:RHEL在AWS上收费极高,比服务器本身费用高很多,慎重。现已经换到了Ubuntu)

在此记录一下迁移中遇到的困难和解决方法。

设置数据库

需要提前分配好用户和数据库

GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'localhost';或者 GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'%';

导出数据库用 mysqldump 然后用命令完成恢复

mysql -u username -p < backup.sql

设置 nginx和php

需要注意设置合适的用户,php插件需要用dnf install php-*这样的命令安装,但无须修改配置文件

其他

记得修改防火墙firewalld规则,和关闭selinux

关于Ubuntu

Ubuntu作为个人服务器体验非常好,而且没有额外的费用,程序较新 在后续迁移到Ubuntu的过程中,我主要参考了https://www.journaldev.com/25670/install-wordpress-nginx-ubuntu 和 https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-20-04, 针对配置文件,我尽量不做改动,很快就迁移成功

曾经觉自己功力深厚,遂无所事事。近期发现编程博大精深,广阔无涯,但缺少引路人。不知全貌,全凭自己摸索,效率低下。

资料推荐

  • 知乎上的引路贴 适合想要精研一个方向的人入门使用
  • YouTube上的系列教学视频 适合快速入门一个方向
  • GitHub上的引路库 适合从入门到精研
  • 大学课程 适合学院派入门
  • 机构里的课程 适合从入门到“精通”,实战派,如果有钱,选择一门合适的课程也不错
  • 开源项目 适合进一步学习

信息不对称可以收费,易于消化的资料也可以收费。资料有很多,但是从哪里找、找什么、如何取舍是问题。找到资料后怎么学也是一个问题。

长时间以来对于左右不分,经过几次学习有了一定的了解,但还是经常遗忘和混淆,在此总结一下个人对政治语境中的“左”和“右”的理解。这篇文章将会介绍左派右派、左翼右翼、左倾右倾、极左极右、偏左偏右,以及它们通常对应的含义。

左派右派和左翼右翼

左翼和右翼的概念,最早起源于法国大革命时期保守派(右)和改革派(左)的坐席位置,后来被申引出去。

左派和右派(Left-Right political spectrum)通常被用来对政治立场、意识形态和政党进行分类。左派和右派通常用来表达及代表完全对立的政治及经济和各种社会议题的看法,尽管某个团体或个人可对某些事物采取左派的立场、却对另一些事物采取右派的立场。 ——维基百科

诸如左派右派、左翼右翼的词容易引起误解,比如在上面一段,来自于维基百科“左派和右派”页面,但标题却是“左翼和右翼”。左派右派左翼右翼经常是被互换,但使用时有一定的限定条件。严格说来左翼和右翼是民主政体下的两个派别,是两党制的渊源,是自由主义的两个群体,而专制政体下是不存在这两个派别的,所以左翼和右翼是民主政治的概念,而无产阶级政党内部常有左倾右倾的区分。

左翼和右翼政治观点的区别,表现哲学观、历史观上,也表现在对经济的政策上,表现在变革与保守上。

在西方的语境下,一般而言:

革新为左;保守为右。

公平的结果是左;公平的程序是右。

反对利伯维尔场造成的不均等为左;而接受之则为右。

偏好一个“更大的”政府为左;偏好一个“更小的”政府为右。

平等为左;自由为右。

一个世俗及政教分离的政府为左;一个宗教与政府不完全分离为右。

集体主义为左;个人主义为右。

法律支配文化为左;文化支配法律为右。

支持跨国家团体为左;仅支持独立国家和政府为右。

世界主义和国际主义为左;国家主义和民族主义为右。(这一点在中国几乎是相反的,将在下一段阐述)

认为人性和社会为可变性的为左;认为它们为固定性的为右。

社会主义为左;资本主义为右:这是近代最广为所知的分法,多数媒体中提到左右派时也多半是指此种分法。左右派的社会主义泛指高税收、高福利、高政府干预调控的政治体制,而不一定是共产党主张的无产阶级专政。

中国与西方的左和右

左和右的使用在很大程度上取决于语境,比如在中国和在西方,左派和右派的象征意义几乎是颠倒的。这和中国和西方国家处于政治光谱上的位置有关。这个说法我最早从bilibili的一篇文章中看到,深有感触,然而我没有再次找到那篇文章,只能凭借记忆拼凑出原文思想。

以政府对于社会的干预程度为坐标,划分政治光谱,左边干预程度大,右边干预程度小,显然中国位于左边,西方国家位于右边,于是中国被划分为左(左派,偏左),西方被划分为右(右派,偏右)。

由于中国本身位于左边,某个人的思想偏向于资本主义、自由时,也就是偏右和右派,他本人的政治立场是远远偏离主流价值观的,所以他是激进派。同理,偏左在中国属于保守派。

相反,在欧美,主流思想是右派,右派保守,左派激进。

以上两段的左右是根据政治立场上的原点划分的,激进保守是根据政治立场和社会环境上的距离确定的。左右还是是相对的,偏左和偏右在相应的环境下,指一个人更激进还是更保守。

也要看到,这几个词汇的政治光谱代表的含义也不一样,不能一概而论。下面的“左倾”和“右倾”都是针对中国革命这个特定的历史情境而言的。左倾,全称是“左”倾主义错误,指高于现实的过于乐观的估计,比如中国的大跃进、朝鲜的千里马都是是典型的左倾主义错误,而右倾主义错误指投降主义,比如陈独秀犯了投降的右倾错误。左倾和右倾和西方的左翼右翼在激进和保守上的含义相似。

经历一个月的仓促准备,几天前一人前往香港,参加了万人坑的SAT考试.自我感觉良好,颇有感慨.决定趁记忆新鲜,写成本文,以帮助后来考sat的学弟学妹们.

这篇文章分为两部分,一是sat准备,二是通关以及考试的流程.

SAT备考

在看这部分之前,你应该对sat有一些初步的了解,以及决心报考sat考试.

SAT本质上是一个检验学生英文阅读能力&批判性思维&语法&初中数学&八股文写作的标准化考试,是被美国大学作为录取的一个重要标准的考试.

与托福的关系

考试之前一天晚上认识一个朋友,他托福102,SAT最高分1450.

敲黑板: 托福是给老外准备的语言能力测试,而SAT是给美国本地人准备的,比托福难

SAT词汇

SAT词汇要求1.2万左右,类似于GRE的词汇.

SAT阅读文章

SAT文章难度和托福类似,主要是因为词汇,略难一些.但要比GRE的句子简单很多. 也可能因为对题材不熟悉,用词古奥,小说和历史类文章难度大一些.

备考方法是大量阅读和刷题

SAT阅读题目

SAT阅读题目比较绕,但不会有歧义.题目也比较多(52题),时间很紧(65分钟)

备考方法是大量阅读和刷题

SAT语法和写作

难度不大,学语法,刷题就可以解决大部分问题.剩下的可能需要语感和熟练度.问题是时间很紧(35分钟,44题)

SAT数学

SAT数学低于中考难度,高于小学难度.广度略低于高考.要求做题的熟练度比较高,时间很紧.

SAT数学分两部分,第一部分需要手算,第二部分可以用计算器,推荐Casio fx-991 CN X中文版,京东146元,不推荐德州仪器,太贵也没必要.计算器主要是四则运算,解二元一次方程组,一元二次方程,线性回归(很多时候是函数关系,手算也可).

普高数学底子好的同学,做两套题就可以了.重点在理解题意.

SAT修辞Essay

我没有足够的时间准备,就没有参加.多数学校对这部分没有要求.

考试流程

我参加的是香港万人坑(亚博展厅)的考试 要提前1个月之前报名,拿着通知邮件的原文和翻译件(谷歌翻译即可)去公安部门办理港澳通行证. 这时可以买机票和订酒店. 如果港澳通行证还没有拿到,可以买国泰港龙的机票,后续找携程客服修改港机票上澳通行证的编号.

推荐住宿在华逸酒店(大概150人民币),到达酒店可以坐机场地铁(现金购买是70港元,据说有八达通卡是30港元)然后出租,去考场时酒店提供车辆(80港元)

香港的吃饭还可以,一般在40港元以上

到达考场,跟着大家走就可以了,8点左右就可以入座了.没有存包的地方,但是可以放在座位下面.入座后要涂答题卡的信息,涂的比较多.

考试中间会有几次休息,每次5分钟左右,不允许吃东西,喝水,交谈.

iPad一直是一个娱乐设备,最近几年硬件的升级,各类生产力app的开发,,Apple Pencil的发行,iPadOS的发布,也让iPad成为了学习和艺术创作的工具.而对于程序员的升级一直没有什么动静.即使有各类ssh,jyupter的移植,也构不成完整的开发生态链.

ish却把这些改变了.

ish可以在网上找到,这里就不说具体的安装方法了.

用ish的优点如下: - 完整的Linux命令行开发工具,包括gcc,python,vim,etc - 可以用外接键盘

这两点加起来,对于轻度需求,已经可以和一个笔记本电脑相媲美了,甚至在续航上胜过笔记本电脑

重点说一下键盘的问题. 如果有无线键盘,无论是普通蓝牙,还是ipad配套的蓝牙键盘,还是蓝牙机械键盘,都可以直接连ipad. 如果没有蓝牙键盘又想用自己的有线机械键盘,推荐用USB有线键盘鼠标蓝牙转换器手机平板安卓同时充电转蓝牙无线键鼠来转成蓝牙的,而不必重新购买昂贵的蓝牙/双模机械键盘.淘宝有售.

设计巧妙的游戏,利用了人性的弱点,容易让人沉浸其中.经常有人说,某些人有网瘾,打起游戏来没完没了,而脱离了现实生活.可是,有没有想过,现实生活也是一种有游戏呢?

这是最大的MMORPG,地球online. 所有人在这里,都是极限模式,换句话说,不能暂停,不能存档,死亡即自动退出游戏,无法再次加入.

地球oline的内容包罗万象,从新手村,到修炼关,到江湖关,移植到鬼门关,而且每个玩家都要去经历一番.

所有玩家都是在新手村出生的,多数玩家都是普通玩家,有着类似的属性,随机分配一个性别和两个监护人,两个监护人的能力和收入都属于一般水平..当然,有的玩家一登录就是高级VIP,要么天赋惊人,要么是高级RMB玩家,要么是游戏高手的亲弟子,甚至是大区工会会长的儿子.极少数人,登录后账号余额是负的,及时他们在此之前并没有做什么,或者某些天赋是0.

有时候,不同的大区之间的差距也很大.第一大区是最古老的大区,由于亮度过大,多数玩家被分配到了黑色的皮肤.第一大区的先辈是最早一批的玩家,也随着第二到第七大区的开放,渐渐地进入了这些大区.由于第一大区的地理位置等因素不太好,第一大区的发展非常缓慢,反而受到了后来某些大区的欺负.第二大区的玩家数目最多,而且有几个极具特色的特大公会,而且有两个工会严格限制大喇叭的使用.第三大区比较幸运,而且科技树攀爬得相对较早,玩家的生活状态非常不错.第四大区是很有意思的,来自第三大区的玩家,击杀了大量的第一大区的转区玩家的弟子,还建立了自己的工会,现在反而希望称霸整个服务器.第五大区和第六大区比较低调,只是听闻第五大区的生活和第三大区类似,而第六大区和一大区类似.第八大区由于卡关难度太大,几乎没有人试图长时间在那里玩地球online,但确实有人到达过第八大区的中心.

(待续)

自误购影印书籍于几年前,发奋学习英语.过中考,斩托福.念通读此书,思后可出国.

斗托福三年有余,投数万之资,只因态度不端,方法不适,决心不强,毅力不至而进步缓矣.今端正态度,学习二语习得理论,下定决心,一心一意准备出国,死学半年,终有收获.于2019年寒假,正式决定学托福准备出国;于2019年青年节,考得托福90分(26,21,19,24);后于9月21日,最终不负众望,拿到了106(30,29,21,26)的理想成绩,这是连我都喜出望外的分数.思往事,感悟良多.

窃以为学校教学,效果差矣.词汇背诵数目不至,频率不足,难以形成足够强烈的印象,也难以适应阅读所需之词汇量.阅读限于课文,教辅,试题,以翻译法教之,而不接触互联网上海量优质文章,又无阅读方法及方法论之指导,阅读水平难以提升.听力更甚,极短音频,极少时长,皆无可于托福之讲座比也.口语练习缺失,仅课前课上朗诵,效果至微也,而各下至幼儿园,上至专八(可选),各类考试亦不考矣.至于写作,空论题目,试卷之外无可作也.无英文写作指导,亦无立论驳论之文,著优美流畅,乃至各式风格难矣.由此观之,研习英语当自寻方法,自觅良师,而免于庸师也.

至于英语,初乃语言,后为科目,终为考试也.

即为语言,则学之用之,此乃上策.学而有用,坚持之,以英文习专业科目,或而休闲娱乐,一石二鸟,岂不美哉?若学之不用,或用之不学,无可进尔.

即为科目,当循序渐进,词汇,语法相继辅之,薄弱之处专门练习之,进步大矣,此为中策.基础薄弱,则以词汇攻之.视吾绿宝书破旧不堪,是以翻阅过五矣.吾日进二百词,于词汇书于扇贝单词,坚持久矣.杨鹏之《17天搞定GRE单词》助力也.词汇既通,当连词成句,万不可以翻译法习之.目读之,知其本意,此乃默读之要诀也.近可速读,远可克长难句.长难句, 猛虎也,当以此法破之,见《GRE长难句解析》.阅读境界渐高,如入母语之境,此时做题,直至纯熟,无不破之题也.

听力当谨慎应之.习听力前期,重于听辨音素者鲜矣.当备纸笔,逐句写下所听文章,后红笔正之.一月之后,听辨音素则易之.此时可精听题目,反复至纯熟,或随声而和之,此谓影子跟读法.辅以各类范听材料,得己之听力笔记,听力可进也,做题如有神助.取乎其上,得乎其中;取乎其中,得乎其下;取乎其下,则无所得矣.听极长之讲座,回顾托福听力则笑之,视高考听力则甚哂之.

至于口语写作,非吾所善于之处,不敢加以妄言.

以为考试,着眼于题型,出入于技巧,对症下药,此为下策.当听老师讲解之,通晓题型及要求,此备矣.

最下者,乃学而不思者,其诵记而不反思,做题而不改错,浑浑噩噩,终难成大业.

长期备考,难免意志薄弱,不如即使放松,学于娱乐.刷油管,观美剧,听讲座,看维基,凡能助学者皆可用之,而无患其不为学也.身处考场,当坦然应对,思父母之恩,同伴之情,尽力而答之,无他矣.

谨以此文助他人兼念旧事.

Jack Quinn

于 2019.10.3 午