AlexiaChen.github.io icon indicating copy to clipboard operation
AlexiaChen.github.io copied to clipboard

My Blog https://github.com/AlexiaChen/AlexiaChen.github.io/issues

Results 123 AlexiaChen.github.io issues
Sort by recently updated
recently updated
newest added

--- title: 第一次对计算机科学的懵懂 date: 2017-03-23 12:01:23 tags: - 计算机科学 --- ## 我的大学 刚上大学的时候,在大教室上的第一堂课是计算机科学系的系主任给我们上的一堂“思想开导课”。是这么说的,我们专业是计算机里面最古老,历史最久远的一个专业,比之软件工程,网络工程历史久远的多,也是最博大精深的专业,因为它是计算机科学!是一门理论性质比较强的学科。 这由此真正打开了我对计算机世界的憧憬,刚开始我确实不懂什么是计算机科学,以为就是写写代码,懂点数据结构和算法,也不去管什么叫图灵,丘奇的人物。 但是后来,由于工作以后,随着业余研究的深入,我发现我真不懂计算机科学,其实呢,在学校的时候包括现在,大部分同学和教授也对什么是计算机科学也是差不多一窍不通的(因为我的学校真的很次,不是牛校,不会出现什么特别有名的牛人)。 不过,他们懂与不懂也与我无关了。随着后来我逐渐对函数式语言的理解,以及程序语言理论的了解,接触了计算理论的一些皮毛,才慢慢打开了计算机科学的大门。 ## 计算模型与计算能力 因为我以前对C++模板元编程很不熟悉,最近的工作业余喜欢写些有趣的C++模板代码来表达实现我以前的一些思想(算法)。可能遭到了一些不理解实情的人的好奇,他们可能想,玩这样的trick有什么意思吗? 不要注重这些或有或无的东西,工程经验才是王道!语言只是工具!最重要的还是数据结构与算法,还有项目经验。 我当然知道这些人的意思,其实他们的初衷是好的,不希望我沉迷语言的某些技巧不能自拔。 其实呢不是这样的,因为C++的模板元本身就是自成一套体系的,它对比之C++可能说是“另外一门语言”,最重要的是模板这套“符号系统”本身就是[图灵完备的](https://en.wikipedia.org/wiki/Turing_completeness)。也就是说,模板本身的计算能力与Java,Python等图灵完备的语言计算能力等价,它们能做的事情,模板也能做。 所以,当我在用模板解决问题的时候,我所思考的是如何将自身的想法在这套“计算模型”上表现。我是在尝试模板自身的计算能力到底有多强?什么问题模板可以计算?什么问题又不可计算? ``` lisp fix = lambda f.(lambda x...

随笔

最近在做一个金融相关账务的后台业务,主要是监听链上的合约emit出的Event,把Event存储库的表中,golang用的是Gorm来访问MySQL。但是发现用以下Gorm Update一个字段的时候,在及少数情况下,小数点会计算错误, 其中 Gorm的结构对象的两个字段是用decimal.Decimal来存储的金额,当然decimal。Decimal就是可以用来做账的。 ```go // 可用余额 BalanceAvailable decimal.Decimal `gorm:"type:decimal(36,18);not null;default:'0';check:balance_available >= '0'" json:"balance_available"` // 冻结余额 BalanceFrozen decimal.Decimal `gorm:"type:decimal(36,18);not null;default:'0';check:balance_frozen >= '0'" json:"balance_frozen"` ``` 如果是一下更新Balance Available Balance Frozen的金额,在极端情况下会有错误,比如计算`1 - 0.7`的时候,会计算成`0.30000000000000004`,...

软件调试
golang

事情的起因是这样的,在某个大佬拉的群里,有一次大佬们的讨论过程是,Ted Yin(HotStuff和Ava BFT共识算法论文原始作者,FB的Libra采用的就是这个HotStuff的变种)说过,并不是每个人都可以build system的,即使Google,微软也一样,群里大家都一致认同。 聊天截图如下: ![0](https://user-images.githubusercontent.com/8574915/72331312-f2b2a180-36f2-11ea-9965-37d8c5eca754.jpg) ![1](https://user-images.githubusercontent.com/8574915/72331314-f34b3800-36f2-11ea-9eed-1eff88b50d15.jpg) ![2](https://user-images.githubusercontent.com/8574915/72331316-f3e3ce80-36f2-11ea-89f7-f56a317cc2ec.jpg) ![3](https://user-images.githubusercontent.com/8574915/72331319-f47c6500-36f2-11ea-9bff-a849793e53a6.jpg) ![4](https://user-images.githubusercontent.com/8574915/72331320-f514fb80-36f2-11ea-935a-24f6ad4f3f9f.jpg) 这点我从事区块链底层开发一年多下来深有感触,能胜任最核心构建的就那么一个人,我们的链是树状可无限分裂的区块链,这条链几乎可以说是从0开始,从想法到实现,而代码实现几乎是一个人经过一年多的时间(夜晚)solo出来的。仅仅只是总体架构跟BTC架构相似,从各种亲身经历的事实总结来看,确实10个人不如1个人。这个老板也对其评价过,1个人顶1个团队,年薪几百万可以拿到的。 无数例子已经证明了: - Jeff Dean写LevelDB,MapReduce,Spanner,BigTable,TensorFlow; - Sanjay写了GFS, MapReduce, Spanner, BigTable - Linus能一周写完Git的原型,并且性能已达到预期。 build system的能力可能一是需要一定天赋,二是也可能看过 ,改过无数开源项目的代码,造过不少轮子。 在这个软件时代,可能还是个人英雄的时代,只是要产品化,必须要有周边的开发人员(打杂的)来包装,打磨,改进,完善产品。我就特别羡慕这种build system的人。 褚霸,霸爷也说过,读懂开源项目代码,会改代码,会写代码是三个渐进式体验,其实说白了就是从看懂到尝试性的改,再到抄袭,模仿和偷师,再在模仿之上有自己的创新。 对了,好奇的同学可以在知乎上搜索Ted Yin写的一篇叫[HotStuff诞生记](https://zhuanlan.zhihu.com/p/72776441)的文章

随笔

说是ShadowSocks过时了,现在都是v2ray(可是我记得北理工出了个专利论文,墙可以检测v2ray了? https://www.zhihu.com/question/347846360 ),所以在搬瓦工上买了台VPS,ubuntu 18.04。 SS只是简单的代理软件,v2ray说是被定位成一个平台,更加强大,也更加复杂,产业链也不成熟(可以由第三方开发代理接入v2ray): - V2Ray 使用了新的自行研发的 VMess 协议,改正了 Shadowsocks 一些已有的缺点,更难被墙检测到(VMess 是一个基于 TCP 的协议,所有数据使用 TCP 传输) - 网络性能更好 -支持各种协议 由于v2ray的官网被墙,所以下面还是摘录一些官网内容吧: ## 安装 ```bash bash

工具

--- title: CMake简明教程 date: 2018-08-12 17:39:00 tags: - C/C++ - CMake --- ## 前言 主要最近的换工作,完全在Linux下开发,虽然以前都接触过CMake,不过体系也是零散的,遂做了一个简短的CMake教程,以供后续快速入门。 另外,好久也没有写文章了,这份工作还是有一定的技术性,之前的那家公司是开发/维护,大部分工作都是维护,没有什么写文章的激情。 所以,今天是硬凑一篇文章。 ## 正文 #### CMake CMake是跨平台的元构建系统,也就是说,它不实际产生构建行为,它只是生成给其他构建系统使用的文件,比如Makefile,MSBuild的solution file。 CMake根据读取名为CMakeLists.txt的文件,然后生成平台特定的构建文件,但是一个很大的问题是,CMake官方提供的教程特别复杂,对于新手的个坑,很难快速入门。 这个教程会通过例子来学习怎么用CMake。以下我们提供几个C++源代码供例子使用: - main.cpp - vector.h -...

c/cpp
工具

--- title: win32 进程崩溃时禁止弹出错误对话框 date: 2018-06-15 18:58:23 tags: - 调试 - Win32 --- 在main函数程序初始化的时候加入以下代码即可: ```cpp SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); _set_abort_behavior(0,_WRITE_ABORT_MSG); ``` 这样程序就悄无声息的崩溃了,不然守护进程都不起作用。如果不这样做,弹出错误对话框程序如果不点击关闭或发送错误报告就僵死在那里了,守护进程一直发现进程没挂,就不重启。 参考: [1] https://stackoverflow.com/questions/9718695/how-can-i-supress-all-error-dialogs-when-a-process-crashes-i-only-want-it-to-cr [2] https://stackoverflow.com/questions/1861506/prevent-modal-dialog-on-win32-process-crash

c/cpp
windows
软件调试

可以解决docker swarm集群下容器的漂移共享不到历史数据问题。(因为区块链的节点容器不是无状态的服务,容器一旦漂移到另外的swarm worker节点上去,以前存在本地LevelDB的历史数据就找不到了,使用上会出问题) 这种解决办法都是需要外挂一个存储。把状态放到一个地方共享,这个地方可以是NFS,也可以是分布式文件系统,也可以是AWS提供的存储服务。我想这点上k8s提供的比较强大,这里不做讨论,我也暂时不会k8s。 没有采用Docker最推荐的方式volume。而是使用了bind。比较笨,主要是使用volume报出了/var/lib/docker/volumes/nfs_volume/的权限问题,时间紧急,一下子没搞明白,就直接用了bind方式。 在特定节点上搭建NFS服务器,其他的swarm集群节点上搭建NFS客户端,然后df -h查看以下是否有 [nfs server ip]:/[nfs server root dir] 20G 19G 1.3G 94% /mnt/[client mount point] 这样的项就表示成功了。 可以先自己写个不停写文件的程序,用Dockerfile打包成镜像,测试下,然后docker run bind到客户端挂载点: ```bash docker run -d --mount type=bind,src=/mnt/[client...

云计算
工具
linux
容器
DevOps

# 前言 这篇也主要是收集一些Google大佬的slide整理,其中第二篇是Jeff Dean的。标题就意味着,这些大概的数值在你构造高性能的系统的时候,应该大致在你头脑中有个概念。 # 正文 ## Google AppEngine number ### 写的代价是很昂贵的 - 数据存储是事务型的:写需要磁盘访问 - 磁盘访问意味着磁盘寻道 - 拇指法则(经验规则):一次磁盘寻道就往往浪费了10 ms(毫秒) - 简单的计算一下: 1s / 10ms = 100 seeks / sec, 也就是1秒磁盘最大寻道次数在100次...

并发与并行编程
计算机网络
计算机体系结构

如果没有经过标题的操作,运行以下命令就可以了: ```bash config --set-default-user [username] ``` 但是,经过导出导入后,默认登陆进去是root用户,我想换回来我自己的用户。发现以上方法不行了。 还好找到了WSL官方的这个[issue](https://github.com/Microsoft/WSL/issues/3974)。 步骤: - 写一个PowerShell函数: ```powershell Function WSL-SetDefaultUser ($distro, $user) { Get-ItemProperty Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\*\ DistributionName | Where-Object -Property DistributionName -eq $distro | Set-ItemProperty -Name DefaultUid...

windows
工具

发现用WSL2内存占用太大,Vmmem进程用久了就占用百分之90+%。最后命令行都打不出来。 解决方案: - 用wsl命令行重启WSL2 distro - 限制内存使用 在`%UserProfile%\.wslconfig`创建一个文件,里面配置上: ```txt [wsl2] memory=10GB swap=0 ``` 配置规范: ```txt [wsl2] kernel= # An absolute Windows path to a custom Linux kernel. memory= # How...

windows
工具