LOGISIM逻辑模拟器
Overview
这个小玩具是我在南京大学操作系统概述课上面看到的,本身的代码比较底层,可能没有比较坚实代码基础的同学都不大看得懂代码在干什么。这个程序实现了数码管在终端的模拟,每一秒跳一次,使用C语言来模拟数字电路,使用Python来构造模板然后输出到终端上。这个小项目令我感到惊叹的地方是,我们简单地通过终端的shell就让两个程序进行了交互,将C语言每秒运行的输出传递到Python中,然后Python随机给出输出。很多情况下,我们总是想着一个程序或者一个文件完成所有的工作,往往忽略了很多的工作可以通过不同的语言模块化完成,各取所长
数字电路的模拟
数字电路的模拟部分采用了C语言
头文件logisim.h
#include <stdio.h>#include <stdbool.h>#include <unistd.h>//导线typedef bool wire;// Flip-flops触发器typedef struct { bool value; // The current value stored in the flip-flop ...
自动计数脚本
Overview
写文档的时候突然有个想法,如果能用命令行程序统计我写的字数就好,这样看着每天不断增加的字数,坚持用英文写作表达的热情都高了不少,那么就试试吧,花了两个小时写了这样一个小脚本,它会自动检查脚本执行的路径,并且正确统计目录下的markdown文件的总字数,更方便的一点是,由于我的文档是托管在GitHub上的,每次我进行commit操作,这个脚本都会自动执行,然后把统计的字数更新在README.md文档中。这个脚本用到了一些小工具,如正则表达式、复杂命令行、shell进阶知识、GitHub工作流等。代码很不简洁,但是很清晰,主要是对我最近所学的一些训练。以下简单说明功能:
检测路径统计.md字数
更新写入README.md
每次commit自动运行
源码地址:word_count.py
实现原理
函数解析
首先写好基本逻辑
定义check_directory函数方法检查当前目录
如果不是目标目录则自动跳转(跳转使用到了另一个函数方法),这个函数很重要,因为很多操作都要求在当前目录下进行。使用了正则表达式匹配寻找仓库的路径,如果发现当前shell的路径不在仓库中,那么 ...
拉格朗日插值法与中国剩余定理
Overview
我在一年前就感觉到拉格朗日插值法和中国剩余定理有些联系,当时是在顾沛的《数学文化》这本书上看到的,然后又看到了bilibili上乐正垂星佬的视频,感觉这些算术确实是通过线性代数,将函数给联系起来了,线性代数在高视角看问题上用途真是广泛啊
物不知数
今有物不知数,
三三数之剩二,
五五数之剩三,
七七数之剩二,
问物几何?
——《孙子算经》
这不就是带余除法吗,我们现在按条件写下来,设现在要求的数为 现在,我们要考虑将这个方程简化:
每次只考虑一个除式有余数的情况
对于有余数的情况,把余数都简化成最简单的
这样我们就得到三个方程组:
(1)式表示,在5和7的公倍数中找被3除余1的数
(2)式表示,在3和7的公倍数中找被5除余1的数
(3)式表示,在3和5的公倍数中找被7除余1的数
于是对于(1)我们可以得到: 因此我们得到能同时被3,5,7整除 同理计算(2)和(3)式,可以得到: 现在我们有: 我们知道分别被3,5,7除会余1,因此要让一个数被3除余2,我们只需要使用即可,同理,要让一个数被5除余3,只需要使用,要让一个数被7除余2,只需要使用 ...
元编程(Metaprogramming)
这是一个系列课程:
元编程是学校教学几乎不会涉及到的领域之一,但当我们真正开始使用编程工具构建我们自己的项目或加入别人的项目的时候,我们会自发地感受到沟通、知识等层级上的差距,如果你不懂元编程,甚至没有听说过元编程,那么开发过程是痛苦的,你会发现计算机世界的一切知识都那么凌乱,好像没有一点规律,周围的人都会使用各种各样的莫名其妙的工具,而我们打开项目文件,更多地是不认识各种文件,也不知道它们存在的意义,打开它们,更是有一堆意义不明的语法和各式各样的信息…于是我们便不敢轻易修改它们,这种束手束脚的感觉无疑是非常难受的
模拟退火算法
简介
模拟退火算法(Simulated Annealing,
SA)是一个全局最优化的算法。之前我们使用过梯度下降法,我们很清楚梯度下降法的问题所在,它使用了一种贪心的策略,而正是这种贪心,使得算法在遭遇一个区域中的极值时停了下来,很难寻找全局的最优解
而模拟退火算法则是在梯度下降法的基础之上,引入模拟退火的思想,我们通过算法来模拟物理过程,从而来帮助我们寻找全局最优解
这里需要注意,模拟退火算法是依赖于概率收敛到全局最优解的
模拟退火算法可用于精确算法失效的高难度计算优化问题,虽然通常只能获得全局最优的近似,但对很多实际问题已经足够,对于大多数实际的数据图像,它们并没有我们想象中的那么光滑、好看,很多都是非常崎岖、充满锯齿的
算法原理
SA算法依照下面的流程来运行
Rust核心机制(二)
Rust入门(一)Rust核心机制(二)
Understanding Ownership
所有权(Ownership)是Rust最独特的功能,它对语言的其他部分有着非常重大的影响,使Rust在没有垃圾回收机制的情况下保证了内存的安全
What Is Ownership?
fn main() { let s = String::from("Hello"); takes_ownership(s); let x = 5; makes_copy(x);}fn takes_ownership(some_string: String) { println!("{}", some_string);}fn makes_copy(some_integer: i32) { println!("{}", some_integer);}
References and Borrowing
fn main() { let s1 = String::from("hello"); let len = calculate_length(&s1); ...
简单bs4爬虫
代码
怎么都感觉这篇post有点水💦
import requestsfrom bs4 import BeautifulSoupurl = 'https://www.uta-net.com/song/348205/'headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36'}response = requests.get(url, headers=headers)soup = BeautifulSoup(response.text, 'html.parser')kashi_area_div = soup.find('div', id='kashi_area')if kashi_area_div: for br in kashi_area_div.find_all('br'): br.replace_with('\n') pri ...
编辑器改造计划
我们花大量时间学习、写代码,跟我们打交道时间最长的,除了浏览器,恐怕就是代码编辑器了,VSCode确实很好,我也用得很多,但是仍然存在很多它不擅长的地方,比如最常见的就是终端,一般情况下我们执行代码,终端会出现在下方,这在很多时候会导致输出内容不直观,因为那点地方实在太小,如果要拉上来拉下去,用鼠标和触控板就显得有点麻烦
而有的时候,我们只是想从命令行中打开文件执行程序,非要多出一个窗口,还不方便用键盘操作,对于像我这样的懒人,会很大程度上打消行动的积极性,所以,如果能够用键盘操作一步到位,那自然是最好的
于是是时候让今天的主角tmux和vim登场了
tmux cheat sheet
Neovim
在Markdown中插入icons
写在前面
我们在浏览网站的时候,会发现别人写的Markdown文档为什么这么好看,有各种各样的效果和图案,为什么我的就没有?我连字体大小颜色都还没玩明白,别人是怎么在文章里插入这么多图标的?
经过我的一番查资料和思考,我总结了以下两个较为靠谱且满足需求的方法
当然,这里直接在markdown文档里放图片链接不算,因为既没有用到资源库自带的功能,也不如图标显示大小、风格统一和可调用性
这里我使用的是阿里巴巴矢量图形库
速查:
我的图标库
引用方法:
<svg class="icon" ><use xlink:href="#icon-bilibili"></use></svg>
方法1: CSS (不推荐)
使用CSS的方法引用相较来说会方便一点
如上图,我们进入仓库,选择Font class,生成代码后可以发现链接的结尾是.css,这就表明我们生成的链接其实是一个样式表
我们只需要在html标签的<head>标签中引入这个CSS资源
<head><link rel="stylesheet" href=" ...
C语言:更底层
本次记录的是对课程南京大学-计算机系统基础实验课-W2C语言拾遗之机制的学习,个人认为这堂1h40min的课讲了非常多的干货,并且提醒我让我注意到自己以前在学习C/C++时忽略的更底层的知识,当然这也有很大一部分原因是我们学校的计算机教学质量确实不怎么样(笑
如果想要对编程语言有更深的认识,或者未来想在计算机领域有更底层的学习,我认为这堂课,甚至整个系列的课程都有非常大的帮助
Rust入门(一)
Rust入门(一)Rust核心机制(二)
最近听说Rust是一门最近几年非常热门的语言,它结合了大量语言的优点,有媲美C/C++的性能,还更易于管理,安全性和易用性都很强,更是有着语言自身的特性,究竟是怎么回事,还得学习后作出自己的判断
以下的学习过程参照的是Rust的官方教程,粗略一读发现它写的非常详细,很适合新手入门,恨不得把知识塞到你嘴里赶紧用Rust开发程序了
References
https://doc.rust-lang.org/book/
https://rustycab.github.io/LearnRustEasy/
Getting Started
Installation
在Linux/macOS下安装Rust可以说是非常方便了,只需下面一条命令:
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
确保能使用命令rustc,如果提示找不到命令,在~/.zshrc中加入路径
vim ~/.zshrc# 加入环境变量export PATH="$HOME/.cargo/bin:$ ...
傅立叶变换、拉普拉斯变换、卷积
傅立叶变换可谓是梦的开始之处了😀从高数课本上第一次见面的不明觉厉到知识逐渐深入后的渐入佳境,我越发认为傅立叶变换是很多领域中基础中的基础了,也是我理论学习热情的敲门砖
从最简单直接的地方来看卷积:
References
从“卷积”、到“图像卷积操作”、再到“卷积神经网络”,“卷积”意义的3次改变
【工程数学基础】3_变声的基础原理_理解卷积的含义_线性时不变系统的冲激响应与卷积
卷积神经网络的底层是傅里叶变换,傅里叶变换的底层是希尔伯特空间坐标变换
【官方双语】那么……什么是卷积?
【官方双语】卷积的两种可视化|概率论中的X+Y既美妙又复杂
这个算法改变了世界
【人工智能芯片入门】卷积、对偶性、与Winograd算法
欧拉公式
欧拉公式应用:
【工程数学基础】6_SinX=2?
复变函数 欧拉公式
几何意义参考:
【乐正垂星】开!摆!——渐开线,摆线,与弧度方程
欧拉的魔法之剑,从弧度定义到上帝公式
References
Euler’s
formula
自然底数e怎么就“自然”了?
“上帝公式”(欧拉公式)真的神到无法触碰?
巴塞尔问题与解析延拓
巴塞尔问题是一个非常有名的历史问题,引起了很多著名数学家的关注,并且他们也在这个问题上作出了不同方向上的拓展
因此在学习了大量资料后,我发现这个问题并不是简简单单的一个级数求和
巴塞尔问题
【官方双语】巴塞尔问题:著名公式背后的惊人几何学
了解其中傅立叶级数证明