- 博客(128)
- 资源 (28)
- 收藏
- 关注
原创 Andrej Karpathy 给机器学习初学者的建议
是一段大约5分钟的访谈视频的精选片段。关于对 ml 初学者的建议。给 ml 初学者一点建议?我信仰 10000 小时理论。初学者不必纠结 “做什么”,应当关注 “做了多少”。10000小时是说要刻意努力.对普通人来说, 10000小时后,就会养成习惯,很自然了。对。并且要注意,在应用10000小时理论时候, 要和自己比较, 和别人比较对你只有害处。和你的1年前比较, 我觉得这是唯一有效方法。许多初学者都有选择困难症呢, 比如纠结用哪个 IDE.对,纠结中会选错,后来会发现错误。
2024-02-29 23:30:55 689
原创 cpptrace 库介绍
又或者, 你调用了第三方库(如果 opencv),你现在遇到第三方库里的报错挂掉了(“主动挂掉”), 但你不知道你的代码在哪里挂的, 在使用二分法排查时, 如果你大概确定了是某一个函数 A() 里面调用了 opencv 挂的, 那么从 main() 函数到 A() 函数的调用堆栈, 可以通过调用。函数, 然后在你的代码中,你打算主动挂掉程序的地方, 调用。具体到 c++ 代码的用法, 你需要包含头文件,定义一个。函数打印出来, 也是有一些帮助的。
2024-02-17 01:13:44 530
原创 Imgui(3) | 基于 imgui-SFML 的 mnist 数据集查看器
把mnist数据集保存为多张.png图像、 train-label.txt 后, 编写一个 GUI 程序,查看图像和对应的标签。这是一个简陋的demo,可以扩展它来支持其他数据集的显示。处理 mnist 数据集显示单张图像和label图像文件名列表的显示点选列表item后切换显示的图像和label通过使用 SFML, 加载并显示了了图像(texture->sprite->window)。
2024-02-15 17:47:37 656
原创 自制按键显示的程序
在看一些 up 主讲解 vim/emacs 等软件的界面操作时,使用了显示按键的软件。据说蒋炎炎讲课用的是自己写的,一度以为很神奇。现在我们用 SFML 手搓一个极其简陋的 demo 版本。由于先前几篇的练习, 对 SFML 有了基本的使用经验的情况下, 对于显示按键的实现能够快速上手。主要思考点在于,怎样显示按键内容, 怎样清空内容。通过判断相邻两次按键的时间差,大于1秒就清空, 否则保持原内容。通过使用 switch case 语句,简化了 A-Z 的26个字母的判断。
2024-02-15 00:48:54 440
原创 Imgui(2) | macOS 绘制 CPU 占用率曲线
实现一个 CPU 占用率曲线绘制的程序, 并能通过按钮触发评测代码的运行;跨平台。使用到了 SFML, imgui-SFML, 以及 macOS 平台特有的 API.绘制曲线 - 以正弦函数为例获取和绘制所有 CPU 的占用率增加按钮: 在界面上开启和关闭评测程序提高绘制频率本篇使用 C++ 实现了一个简陋的 CPU 占用率界面程序, 给出了实现的关键部件, 以及一些探索过程。
2024-02-14 15:51:30 1118
原创 Imgui(1) | 基于imgui-SFML改进自由落体小球
Imgui 是一个 GUI 库, 所谓 GUI 库, 一个直观理解是, 看这个库是否提供了 button 这样的 widget, 以及 layout 的设定。图形库: 通常是基于 OpenGL 或 Vulkan 的封装,不需要提供 button 和 layout, 可以认为它们就是对于 texture 进行操控和显示。Qt 比较特殊,既能作为 GUI 库, 又能作为图形库。不过 Qt 的 license 不友好, 不推荐使用。Dear ImGui。
2024-02-14 00:13:59 918
原创 小游戏和GUI编程(7) | SimpleNN 界面源码解析
本篇分析了SimpleNN的 UI 部分, 它是基于 SFML 实现的交互式手写数字识别程序, 提供了鼠标绘制手写数字, 空格键触发输入的处理和显示、 网络的推理和结果显示, 即使不会写代码也能使用它执行手写数字识别。具体的代码分析中, 先从界面布局的划分(paint region, input region, output region) 入手, 然后对 paint, input 两个区域的内容的绘制、 鼠标键盘的交互, 做了比较详细的分析。
2024-02-13 14:34:41 1430
原创 小游戏和GUI编程(6) | 基于 SFML 的井字棋
小游戏和GUI编程(6) | 基于 SFML 的井字棋0. 简介使用 SFML 实现井字棋(tic-tac-toe), 规划如下:了解规则, 使用命令行实现(已经实现了)使用 SFML,提供极简的交互(预计 1 小时)制作 SVG 图像, 美化界面(预计 1 小时)1. 基于命令行的实现实现了两个用户 X 和 O 的交互下棋, 判断了输赢、 平局:有胜负: 每个用户落下棋子后, 检查整个棋盘中的能获胜的 8 个线段上三个点,如果都等于当前落子的值(X或O)那么赢了没胜负: 如果没有判
2024-02-12 15:40:37 1124
原创 小游戏和GUI编程(5) | SVG图像格式简介
svg 格式的详细规范没找到, 乍一看简单的例子, 都是 xml 代码, 比较简单现查现用也来得及。最为非nodejs程序员, 同行用 VSCode 的 svg 扩展, 就可以编写 svg 代码变看效果了。如果希望鼠标点一点,组合各种形状, 首推 inkscape 软件, 其次是一些在线工具如: https://www.jyshare.com/more/svgeditor/
2024-02-10 22:54:44 1122
原创 小游戏和GUI编程(4) | 基于 SFML 的黑客帝国字符雨
使用 SFML 实现黑客帝国字符雨的动态下落效果。本文提供了基于 SFML 的仿黑客帝国的雨滴下落效果的的动态窗口显示, 从最简单的单个字符下落显示, 到最终的多雨滴、随机出现位置、序列长度随机化, 每一步都给出了代码和基本的解释。在简介阶段只做了初步的任务划分, 在每一小节则进一步细化需求, 通过一步或多步实现了效果, 并在必要的时候(单个雨滴到多个雨滴)时, 通过重构代码, 降低了代码调用的复杂度, 从而为多个雨滴的降落效果提供了便利。
2024-02-10 16:14:00 1133
原创 ANSI Escape Sequence 下落的方块
无意中发现 B站有人讲解, 完全基于终端实现俄罗斯方块。基本想法是借助于 ANSI Escape Sequence 实现方方块的绘制、 下落动态效果等。对于只了解 ansi escape sequence 用于 log 的颜色打印的人来说, 这无疑是拓宽了认识。这一篇简单的列一下 ansi escape sequence 中的稀奇古怪的数字的含义, 并最终给出一个绿色方块下落的动态效果和对应的代码。
2024-02-09 21:07:38 842
原创 SFML(1) | 自由落体小球
依赖库是开源的, license 友好跨平台(windows,linux,macos)modern C++, 而不是 C 或 legacy C++主流的 C++ 构建: 基于 CMake, 而不是直接创建 Makefile 或 VS Solution。
2024-02-09 19:20:19 576
原创 如何像工程师一样阅读 - 快速阅读技术书籍的9个技巧
作者给出 9 个 tips 的目的: 让工程师们在保持对于阅读内容高度理解的前提下, 用更短的时间来理解书籍的内容。这样,你就会有一个文本发展方向的框架,而你的阅读将会填补其中的点点滴滴。作者认为, 工程师这个岗位, 日常工作中也要各种阅读: 读书, 案例学习, 读论文, 读手册。之后, 记录一些个人的看法,并在这篇英文文章上作为实验, 记录一下正确的阅读方法。记录你的阅读速度随时间变化的日志是一个很好的激励方式,甚至可以将阅读游戏化.parcel of the job: 工作中必不可少的部分。
2024-02-09 16:16:14 535
原创 gerrit(4) | gerrit 原理、 使用 gerrit 的开源项目
关于 Authoritative Repository 概念的理解: 中央仓库,整个项目的被review过的代码。
2024-02-05 10:09:27 693
原创 gerrit(3) | gerrit code review 产品概况
如果写过糟糕的代码, 然后看了 Clean Code, Code Complete 这样的书, 又根据书上的指南重构了自己的代码,那么对于提到的很多 “目的” 都很清晰。
2024-02-04 19:22:24 719
原创 gerrit(2) | 为什么使用 gerrit
Gerrit 是一个 code review 的系统gerrit 和 git 无缝连接gerrit 在网页上显示提交的代码修改,并且可以在修改的地方添加评论对于多次代码修改, git 本身是支持 git commit --ammend 的, 不过这会导致 SHA-1 的变更gerrit 的解决方案是, 绑定一个 Change-Id 到 commit message, 虽然 SHA-1 变了, 但是 Change-Id 不变, 就能维持。
2024-02-04 19:04:16 810
原创 gerrit(1) | gerrit 简介
之前用过 gitlab CI/CD, github actions, 以及公司的配置管理员配置的 jenkins。github 的 MR, github 的 PR, 虽然在用, 但仅限于参与开源项目或公司内的开源项目, OEM 项目中完全没在用。gerrit 应该是比较强大的 code review 系统, 基于 git 的, 这里简单了解下。
2024-02-04 18:17:42 577
原创 LLM(5) | Encoder 和 Decoder 架构
简而言之,encoder-style 的模型在用于分类任务的嵌入学习中很受欢迎, encoder-decoder-style 的模型被用于输出严重依赖于输入的生成性任务(例如,翻译和摘要),而 decoder-only 模型被用于包括问答在内的其他类型的生成性任务。基本上, endoder- 和 decoder- 风格的架构, 都使用相同的 self-attention 层来编码单词标记 (word tokens). 然而, 主要区别在于 encoder 的设计,是为了学习可以用于各种预测建模任务的嵌入。
2024-02-03 11:53:48 1484
原创 LLM(4) | Attention Is All You Need 论文粗读
以下是翻译, 括号里是个人粗浅想法的记录:mechanism.主流的序列转换模型,是基于复杂的 RNN 或 CNN, 包括一个 encoder 和一个 decoder。性能最佳的模型还通过 注意力机制(attention mechanism) 连接编码器和解码器。(以前的序列转换模型里, 既用 RNN, 也用 CNN, 并且也有人用了注意力机制。encoder 是啥?decoder 又是啥?entirely.
2024-02-03 10:16:23 1053
原创 LLM(3) | 自注意力机制 (self-attention mechanisms)
attention 机制被证明是机器学习领域里一个有价值的新鲜事物, 在多个任务上提升了模型的性能和可解释性。通过理解不同类型的 attention 和它们的优点, 研究人员和参与这门可以继续推进机器学习模型能力的边界。论文 Attention Is All You Need 首次提出了 attension machanisms 注意力机制attention 机制解决了 fixed-length encoding 的限制英文单词 attend 意思是 “关注”, attention 是它的名词形式。
2024-02-02 21:45:04 1560
原创 LLM(2) | 什么是 LLM
大语言模型(LLM, Large Language Model) 是一种人工智能程序, 它能够识别、生成文本, 还可以执行其他任务。LLM是在大数据集上训练的,因此称为“大”(Large)。LLM是建立在机器学习上的, 是一种被称为 transformer 模型的神经网络。简单的说, LLM 是一个计算机程序, 它被喂如了足够多的样本,能够识别、解释人类语言, 或其他复杂类型的数据。许多LLM是从互联网上收集到的数据训练出来的: 这些数据是从几千到几百万GB的文本。
2024-02-02 18:38:50 343
原创 Python进阶(4) | 创建Python库的模板工程 Python-lib-starter
这解决了上面提到的问题,允许你自由地在类型注解中引用尚未定义的类或自身类。这意味着,如果你在类型注解中引用了尚未定义的类或自身类(用于表示类方法的返回值是其实例),就会导致 NameError 或者其他错误。在 Python 3.7 之前,这段代码会引发错误,因为在 add_child 方法的注解中使用了 Node 类型,而在解释这行代码时 Node 类还没有完全定义。总的来说, 这些非关键目录和文件是锦上添花, 关键目录和文件中, 其实有了单元测试, 已经超过60分了, 在项目开发初期足够了。
2024-01-30 11:05:50 1096
原创 Python 进阶(3) | 值得练习的30道Python练手题(附单元测试)
准备了30道值得练习的 Python 题目。在阅读了前面两篇 blog 的基础上, 我们对 VSCode 执行 Python 的单元测试已经有所了解, 这一篇是进一步练习。30道题目都是入门水平, 但是我们套用到单元测试中进行练习。我提供了文件, 你需要的是自行在answer.py文件中,实现每个exN()函数, N 从 1 到 30.
2024-01-30 00:02:50 122
原创 C++模板编程 | `std::enable_if` 和 SFINAE
SFINAESFINAE: Substitudion Failure Is Not An Error 的缩写, 意思是 “替换失败并不是错误”.就是说,匹配重载的函数 / 类时如果没有匹配上,编译器并不会报错,相应的, 这个函数 /或类就不会作为候选。这是一个 C++11 的新特性,也是 enable_if 最核心的原理。SFANAE 是 C++ 语言标准中固有的一部分, 是模板编程中的一个核心特性。SFINAE 不是可以选择开启或关闭的功能, 而是编译器在处理模板时自然遵循的原则。
2024-01-29 11:28:28 1013
原创 hexagon-clang 编译器下的 int 和 int32_t 不同导致的坑
原本在 Linux-x64, Windows, 各种嵌入式 arm linux 平台能编译通过的代码, 在 Hexagon SDK 5.5.0.1 (hexagon-clang 8.7.06) 上出现编译报错:排查发现 hexagon-clang 编译器下,int和int32并不是相同的类型,int和long是相同类型, 并且, 这和常见的 Linux 中是不一样的。
2024-01-29 10:17:17 984
原创 Python进阶(2) | py-sort源码浅析,TDD方式实现排序算法
py-sorting 仓库实现了多种排序算法,每一种排序算法的实现,都是一个单元。bubble_sort_optimised.py : 优化过的冒泡排序bubble_sort.py : 冒泡排序bucket_sort.py : 桶排序cocktail_sort.py : 鸡尾酒排序comb_sort.py : 不知道。counting_sort.py : 计数排序?gnome_sort.py: gnome 排序?heapsort.py :堆排序。
2024-01-28 17:24:15 811
原创 Python进阶(1) | 使用VScode写单元测试
所谓单元,指的是一段特定的要被测试的代码,比如说一个函数、一个类。所谓测试,指的是被测试代码A之外的代码B, 也就是说B这部分代码存在的意义,就是测试A这部分代码。测试代码通常需要包含各种不同的输入,包括边界情况。单元测试仅仅关注输入 和 输出, 不关注代码实现的细节。因此,所谓单元测试,首先需要划分出单元,然后针对每个单元(或者仅对于关注的单元),编写测试代码。对于被测试的代码的每一种输入,你需要定义它的预期结果。
2024-01-28 14:56:37 1104
原创 LLM(1): Exa,基于 LLM 的搜索
这篇简要介绍了 Exa 的使用, 是 LLM 应用到搜索引擎上的案例。Exa 的输入可以是英文, 也可以是中文, 估计内部执行了翻译。Exa 的输出是中文, 需要自行翻译。Exa 相当于是在10个细分领域提升了搜索效率和质量。不过具体的类别应该是 API 内部自行判断的。Exa 最初是需要输入 prompt 形式的查询文本, 现在则是支持任意关键词, 自动补充为 prompt。
2024-01-28 01:24:42 1069
原创 扩展 GDB - 高亮显示反汇编中的 call 语句
在用 GDB 调试 CSAPP bomblab 时,当反汇编代码稍微具备点规模,例如超过10行,直接翻译为C语言的难度就增加了,此时考虑先找到调用的函数,然后再梳理 if/else/for循环 的执行流。函数体内调用了其他函数,也就是找到带有。GDB 支持 Python 扩展, 通过和 ChatGPT 的结对编程, 可以写出函数来实现这一功能:默认仅列出 call 语句,bing保持高亮;的汇编指令,人工找还是有点繁琐了。, 则显示全部的反汇编代码,并且。之外的汇编不要有高亮。
2024-01-22 00:30:20 407
原创 Sublime Text4 crack时替换的汇编指令
替换的神奇数字,含义是怎样的?在x86_64架构的指令集中, CL是一个8位的寄存器,通常用于计数、控制循环和字符串的操作等。其中在字符串操作中, CL 可以用来存储字符串的长度。如果零标志被设置(即上一条比较或算术指令的结果为零),那么 sete 指令会将目标操作数设置为 1,否则设置为 0。或者这样理解:根据ZF标志位的值,设置一个变量的值为1或0. 如果ZF为1,则CL为1,否则CL为0.因此, 破解后的做法, 是保持了 ecx 寄存器为0, 因而 cl 也是0;: 这里是随便写的,不确定。
2024-01-14 17:08:54 411
原创 CSAPP - bomblab 作弊方式2: gdb jump 命令, 以及修改 jne 为 nop 指令
在 gdb 中, 你不必循规蹈矩的从头执行到尾:可以用 jump 命令跳转到希望之星的地方,例如可以用 set 命令修改内存,把即将执行的指令改为想执行的指令, 例如修改 call phase_x 为 nop 指令,也就是把 e8 开头的5个字节,全都改为0x90为了运行修改后的程序可以在 gdb 里修改, 也就是前面提到的做法你也可以在二进制文件中修改, 但这往往还是需要搭配 gdb 反汇编,先获得要修改的指令的地址为了获得需要修改的指令的地址。
2024-01-14 15:02:06 796
原创 CSAPP bomblab 作弊方式通关: gdb set 命令的使用
在调用某个函数的地方,设置断点需要先根据汇编代码,找到 call explode_bomb 汇编指令对应的内存地址,例如地址是 0x400b10, 那么输入来打断点。而如果执行, 则是进入到了 explode_bomb 函数里的第一句,此时已经晚了,不能用 set 修改 call explode_bomb 为 nop 了自动化执行 gdb 命令gdb_script.txt 内容set 命令是改内存, 需要先让程序启动, 最佳方式是先执行 start 命令, 会让程序加载进来,在main入口暂停。
2024-01-14 12:39:14 882
原创 CSAPP - bomblab phase_2 分析
而 “输入的数字是6个,第一个数字是1,并且是公比为2的等比数列”这个答案,是在执行了反编译后,自然而然的答案。在分析 phase_2 的汇编代码时, 发现调用了多次 explode_bomb. 比如准备一个非法的输入: 0 1 2 3 4 5, 在仅仅查看 phase_2 汇编代码情况下,直觉会认为应该输出多次 BOOM!在 x86_64 中,栈底位于高地址,栈顶位于低地址,栈增长意味着栈顶向栈底的相反方向延伸, 也就是说新的栈顶的地址值,是变小了,也就是做减法。很明显, 逐句翻译汇编代码遇到了瓶颈。
2024-01-13 22:37:42 1220
原创 CSAPP - 反编译 initialize_bomb()
保持好奇, 汇编之下, 了无秘密。命令再次被使用,使用了好几次, gdb 命令得到了强化看到往 rsi 寄存器(函数第二个参数)存入莫名奇妙的数字,不要慌,它就是一个函数的地址, 照常去 disas 它,没有难度, sig_handler() 很简单printf 和 __printf_chk, 这里确实是可以忽略和猜测的函数整理好每一个反汇编出来的函数, 然后按自己想法,添加 main 函数去验证, bomb lab 的神秘性一点一点被拨开。
2024-01-13 15:22:28 408
原创 CSAPP - 流程化的人工反编译 string_length, strings_not_equal
先前已经根据汇编代码,手工翻译到了C代码,但是步骤上显得很吃力。汇编代码超过10行时,很容易忘记每个寄存器里的值。虽然可以用注释的方式,把变量和寄存器名字绑定起来,但是每翻译一小段汇编代码后,就需要更新对应的C代码,过于繁琐了。第2步:抄写C代码,并且添加用到的label,这些 label 是 goto 的目的位置。第0步: gdb 加载可执行文件, 使用 disas 命令查看反汇编代码。第1步: 复制汇编代码到文本文件,在汇编代码右侧,逐句写出对应的C代码。第4步: 消除冗余C代码。
2024-01-13 12:31:10 793
原创 CSAPP - 反编译 strings_not_equal
其中 eax 寄存器存放的是,最近一次函数调用(返回值是整数)的结果,也就是 string_length(s2)的结果;: 把寄存器 rbx 里存放的值对应的内存地址处的值, 放到 eax 寄存器里, 并且注意 movzx 和 mov 有区别, movzx 是 move with zero extending 的意思,高位填充0。: 把 rbp 寄存器里的内容放到 rdi 寄存器, 也就是说接下来调用 string_length() 函数时,传入的第一个参数是 rbp 里的内容。rbp 里现在是啥?
2024-01-13 11:03:49 802
原创 CSAPP - 反编译 string_length
虽然先前已经把 phase_1 和 phase_2 做出来了, 但其实是参考了网络上的答案, 仅仅是大概知道了关键汇编代码。因为很多模棱两可的地方是靠猜测的,而猜测是脆弱的。经过上面这段梳理,写出来的C代码很混乱。重新看 phase_1, 第一个门槛是 string_length 函数。尝试逐句翻译回 C 代码。前提条件: 知道 eax 存储返回值, 知道 rdi 存储函数第一个参数。1)返回值类型:看到了对 eax 寄存器的操作。: 这句是 rdi 寄存器里的值表示的内存地址里的值,和0作比较。
2024-01-11 23:00:02 483
仿BeyondCompare的两张图像比较功能,Qt5实现的源码工程
2022-05-01
emacs-27.1-x86_64.zip
2020-10-19
cmake-3.19.0-rc1-win64-x64.zip
2020-10-18
freeglut-3.2.1-vs2017-x64.zip
2020-10-16
cmake-3.18.4-win64-x64.zip
2020-10-13
OneFlow深度学习框架源码
2020-08-17
带Python3和CUDA10支持的Caffe
2020-08-17
cuDNN8-Developer-Guide.pdf
2020-08-16
cmake-3.18.0-win64-x64.zip
2020-08-16
cmake-3.18.0-Darwin-x86_64.tar.gz
2020-08-16
vulkansdk-linux-x86_64-1.1.126.0.tar.gz
2020-08-16
diffutils-3.7.tar.xz
2020-08-16
smartgit-linux-20_1_3.tar.gz
2020-08-16
cmake-3.15.0-Linux-x86_64.tar.gz
2020-08-16
Linux下懒人安装cudnn的脚本,适合任意cudnn版本
2020-08-16
逆透视变换IPM源码
2020-08-16
imageset-viewer.py
2020-08-01
WinCodeHelper.exe
2019-10-08
带cmake支持的protobuf2.6.1源码
2018-11-19
HOG+SVM原版C++代码,略修改,编译成功
2016-07-17
pedestrian_HOG_SVM_Inria_Caltech
2016-02-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人