Note for “The Python Tutorial” §5

https://docs.python.org/3/tutorial/index.html 摘抄 + 翻译 §5 主要涉及数据结构。 5. Data Structures 这一节回顾一些学过的,同时补充一点新知识。 5.1. More on Lists List 数据类型还有更多方法。 list.append(x) 在末尾添加一个元素,相当于a[len(a):]=[x] 注意这里写成a[len(a)]=[x]或a[len(a):]=x都是不对的,小心。 list.extend(iterable) 使用可迭代对象中的所有元素来扩展列表,相当于a[len(a):] = iterable list.insert(i, x) 在给定的位置插入一个元素。第一个参数是要插入的元素的索引,所以a.insert(0, x)插入列表头部,a.insert(len(a), x)等同于a.append(x)。 list.remove(x) 移除列表中第一个值为 x 的元素。如果没有这样的元素,则抛出 (raise) ValueError 异常。 list.pop([i]) 删除列表中给定位置的元素并返回它。如果没有给定位置参数,pop()将会删除并返回列表中的最后一个元素。 (方法签名中i两边的方括号表示这个参数是可选的,而不是要你输入方括号。在 Python 参考库中会经常看到这种表示方法)。 list.clear() 删除列表中所有的元素,相当于del a[:]。 list.index(x[, start[, end]]) 返回列表中第一个值为 x 的元素的从零开始的索引,如果找不到将会抛出 ValueError 异常。 可选参数 start 和 end 用于将搜索限制为列表的特定子序列。返回的索引是相对于整个序列的开始计算的,而不是 start 参数。 list.count(x) 返回元素 x 在列表中出现的次数。 list.sort(*, key=None, reverse=False) 对列表中的元素进行排序。 两个可选参数(只能是关键字参数,这里用*表示这一规定,可以参考 ## 4.7.3):key 指定一个带有一个参数的函数,用于从 iterable 中的每个元素中提取比较键(例如,key=str....

December 25, 2020

可能是最好的 Git 分支管理教程

通俗易懂的可视化 Git 分支管理教程——Learn Git Branching. 特点:将知识点设计成关卡,每一步操作都有可视化效果展示,附带一个完全自由的沙盒调试玩耍。 具体操作就不谈了,非常容易上手,下文仅给自己做些笔记。 欢迎光临 主要 1.1 Git Commit Git 仓库中的提交记录保存的是你的目录下所有文件的快照。Git 希望提交记录尽可能地轻量,因此在你每次进行提交时,它并不会盲目地复制整个目录。条件允许的情况下,它会将当前版本与仓库中的上一个版本进行对比,并把所有的差异打包到一起作为一个提交记录。 Git 还保存了提交的历史记录,父节点是当前提交中变更的基础。对于项目组的成员来说,维护提交历史对大家都有好处。 git commit创建一个新的提交记录。 1.2 Git Branch Git 的分支也非常轻量。它们只是简单地指向某个提交纪录 —— 仅此而已。所以许多 Git 爱好者传颂:早建分支!多用分支!这是因为即使创建再多的分支也不会造成储存或内存上的开销,并且按逻辑分解工作到不同的分支要比维护那些特别臃肿的分支简单多了。 在将分支和提交记录结合起来后,我们会看到两者如何协作。现在只要记住使用分支其实就相当于在说:“我想基于这个提交以及它所有的父提交进行新的工作。” git branch newImage创建一个名为 newImage 的分支。 分支名后带一个*表示当前分支,commit 的时候会基于当前分支提交。 git checkout <name>切换到新的分支上。 git checkout -b <name>创建一个新的分支同时切换到新创建的分支。 1.3 Git Merge 接下来咱们看看如何将两个分支合并到一起,就是说我们新建一个分支,在其上开发某个新功能,开发完成后再合并回主线。 第一种方法 —— git merge。在 Git 中合并两个分支时会产生一个特殊的提交记录,它有两个父节点。翻译成自然语言相当于:“我要把这两个父节点本身及它们所有的祖先都包含进来。” 假设当前分支为master(C3),使用git merge bugFix将bugFix合并到master里。 merge 方法 为了帮助学习理解,我引入了颜色搭配。每个分支都有不同的颜色,而每个节点(提交记录)的颜色是所有包含该节点的分支颜色的混合。 所以,C3、C4 是master分支的颜色,其他的节点则是master和bugFix分支颜色的混合。 git checkout bugFix; git merge master,再把master分支合并到bugFix。 因为master继承自bugFix,Git 什么都不用做,只是简单地把bugFix移动到master所指向的那个提交记录。 现在所有提交记录的颜色都一样了,这表明每一个分支都包含了代码库的所有修改!...

December 10, 2020

两个函数的地址怎么完全一样——关于函数调用栈

在测试 Python 变量引用顺序的时候,修修改改,写出了下面这样的测试代码: def plus(a, b): return 10 def test1(): def plus(a, b): return 20 return plus def test2(): def plus(a, b): return 30 return plus if __name__ == '__main__': demo1 = test1() demo2 = test2() print(plus) print(demo1) print(demo2) print(test1()) print(test2()) 对应输出结果: <function plus at 0x000002063B18B798> <function testa.<locals>.plus at 0x000002063B18B678> <function testb.<locals>.plus at 0x000002063B18B948> <function testa.<locals>.plus at 0x000002063B18B9D8> <function testb.<locals>.plus at 0x000002063B18B9D8> 可以发现,前面几句都很正常:“变量引用的时候先在本地符号表中查找,然后是闭包函数的符号表,接着是全局符号表,最后是内置符号表。”但最后两行,不同函数的内存地址竟然一样。 请教了一下专业人士,原来和函数栈结构有关。 参考 C 语言函数调用栈(一) clover_toeic,先复习一下函数调用时的具体步骤: 主调函数将被调函数所要求的参数,根据相应的函数调用约定,保存在运行时栈中。该操作会改变程序的栈指针。 注:x86 平台将参数压入调用栈中。而 x86_64 平台具有 16 个通用 64 位寄存器,故调用函数时前 6 个参数通常由寄存器传递,其余参数才通过栈传递。...

December 1, 2020

Textnow 收不到验证码?记得开启代理的 UDP 转发

之前为了注册美区 Apple ID,用 Textnow 开了一个虚拟号码,主要参考教程:2020最新注册美区 Apple ID 教程 | 无需Visa或MasterCard 支付方式,填报的身份是用网络生成的,来自 美国身份证生成。 但是虚拟号码呢,不交钱的话需要保持活跃度防止被销号。查到过一个基于 IFTTT 的定期收发短信方案,但是需要一个 SMS 模块(which 已经过期了)。所以只能卑微地手动收发短信来保持活跃度。 问题出现了,前几周切换账号的时候发现虚拟号码总是收不到 Apple 的验证码,短信或者语音形式都不行,一开始怀疑是不是被销号了,但手动发送短信还是可以成功的。 就这样疑惑了很久,今天上网冲浪的时候突然看到,语音电话这类流量可能是 UDP。 Q: 为什么玩游戏要开启 UDP UDP 是什么呀? A: 我们平时看视频看网页都是走的 TCP 流量,而一些游戏则需要使用 UDP 流量,所以需要 UDP 转发(SSR 服务端默认开启,SSR PC 客户端默认开启,安卓客户端需要手动选择开启)。至于 UDP 是什么,你可能去百度谷歌更好。 来自 https://doubibackup.com/6r9z6_wi-2.html 有一部分代理软件是不支持 UDP 的,我在 iPhone 端使用的代理软件是 Potatso,检查了一下,真的没找到 UDP 转发的开关,破案了。所以用 之前的办法,局域网下请 PC 端的 Shadowsocks 帮忙代理,顺利解决。

November 19, 2020

从 WordPress 到 Hexo——博客搬家记录

WordPress:所以爱会消失对不对 用 WordPress 写博客已经一年了,从最开始感叹 WordPress 的功能强大到现在抱怨各种小问题,感觉 WordPress 似乎不适合我。正好最近服务器该续费了,就考虑着换个平台。 慢,对服务器要求高 对个人博客来说太重了,难以定制化 插件很多很丰富,另一方面也不可避免存在各种冲突 缺乏版本控制 这次调研了一下 Typecho、Hexo、Hugo、Gatsby 几个平台,最后的选择是 Hexo。 去年搭博客的时候也考虑过 Hexo,当时第一眼觉得 Hexo 过于简陋,而且那时候对 Git 的使用还不熟悉,所以就放弃了。但现在用了 WordPress 之后,觉得 Hexo 可能才是最适合我的。 原生支持 Markdown 静态页面,不需要额外服务器 每个细节可高度定制化 轻,可以享受尽在掌握的感觉 向 WordPress 告别 如果你有一个不错的服务器,或是对 Git 不熟悉、更偏爱成熟的产品,那么 WordPress 还是一个很不错的选择,以下的一点点经验可能对你有用。 使用的主题 Adams 单栏,白底黑字,最简洁 Apex 双栏,顶部有个艺术字体 logo,使用时间最长 GeneratePress 双栏,比较常规 Twenty Fifteen 双栏,来自 WordPress 官方,也很喜欢 使用的插件 Autoptimize 通过优化 CSS、JS、图像、Google 字体等来加速网站,感觉优化效果一般。 BackWPup 可以备份数据库、插件等等,同时自动上传到 Dropbox 网盘上(Dropbox 有 2GB 的免费空间),推荐。虽然 WordPress 的安全性比较高,但网站备份还是很重要的。备份的数据暂时没用上,但看着就很安心。 BCD Upcoming Posts 可以在侧栏添加一个小部件,显示在草稿栏中的文章标题,用来做一个预告。...

November 11, 2020

Note for “The Python Tutorial” §1~§4

https://docs.python.org/3/tutorial/index.html 尝试读读一手资料,下文主要是翻译 + 摘抄——确实学到很多 §1~§4 主要涉及解释器、基本语法、基本数据类型。 Python 很简单,很强大。高级数据结构,高效的面向对象编程,优雅的语法 elegant syntax,动态类型 dynamic typing,解释性本质 interpreted nature。 Python 的解释器 interpreter 和标准库都能以源代码或二进制形式 source or binary form 获取,还有很多第三方库。 Python 的解释器可以使用 C(或者任何 C 调用的语言 other languages callable from C) 编写的函数和数据结构轻松地扩展。 本教程介绍 Python 最引人注目 noteworthy 的特性,展现这种语言的 flavor and style。 1. Whetting Your Appetite https://docs.python.org/3/tutorial/appetite.html 开胃菜 为什么用 Python?想做一些自动化操作,There’s some task you’d like to automate. 一个专业的软件开发流程,write/compile/test/re-compile cycle,可能感到冗长乏味 tedious。 Unix shell script 脚本适合移动文件、操作数据,不适合 GUI 或游戏;C/C++/Java 开发时间长。Python 更好。 Python 比脚本语言提供更多结构,比 C 提供更多错误检查。作为高等级语言,具有高级数据结构,比如灵活的 array 和 dictionary。...

October 22, 2020

关于 MPU6050 的原理、使用笔记

主要记录一下这两天学到的 IMU 的原理、算法、安装,以及 MPU6050 的 DMP 模式使用。 原理 IMU,Inertial Measurement Unit,全称是惯性导航系统,主要元件有陀螺仪、加速度计和磁力计等。 陀螺仪测量沿 X、Y 和 Z 轴的角位置随时间的变化率,角度需要在此基础上进行积分,主要使用科里奥利效应进行测量;加速度计测量沿 3 个轴的加速度,当 Z 轴向上放置的时候,Z 方向的加速度是+9.8m/s2。 总结来看,常见的力信号转换为电信号的基本方法都是利用电容大小与极板距离的关系,很有意思。 不同传感器有各自的特点,例如陀螺仪有温漂、积分累计误差,加速度计会受震动、物体运动影响,将这些传感器的数据融合,就能得到较为准确的姿态信息。 MPU6050 IMU 在单芯片上集成了一个 3 轴加速度计和一个 3 轴陀螺仪。以及一个可扩展的数字运动处理器 DMP(Digital Motion Processor)。它也被称为六轴运动跟踪设备或 6 DoF 设备,因为它有 6 个输出,即 3 个加速度计输出和 3 个陀螺仪输出。 关于详细原理推荐看 How MEMS Accelerometer Gyroscope Magnetometer Work & Arduino Tutorial,B 站大学也给了翻译版本:MEMS 加速度计陀螺仪磁力仪如何工作+Arduino 教程(中英字幕)[How To Mechatronics];关于性能参数以及 STM32 下的代码(也有 DMP),推荐野火的 第 44 章 MPU6050 传感器—姿态检测。 表达 IMU 获取的是目标物体的姿态,这里就设计到角度的表达方法。 从坐标系开始,这里沿用了一些航空中的定义,但是各种手册、博客、论坛没有统一的标准,大家自己写的时候一定要仔细辨别。...

September 14, 2020

关于 API 的一些基础知识

前两天需要完成一个扫描件转成 Excel 的操作,试了各种 OCR 软件效果都不理想,后来尝试了百度的文字识别 API,5 分钟搞定。看来广告说得对:“学会用 Python,比别人早下班 2 小时。” 🤷‍♂️ 白嫖了好多次百度的 API,但是对各种基础知识都还一知半解,只会对着 Demo 改改。那么现在就从原理出发,花点时间查漏补缺一下吧。 API API(Application Programming Interface,应用程序接口)是一些预先定义的函数,或指软件系统不同组成部分衔接的约定。用来提供应用程序与开发人员基于某软件或硬件得以访问的一组例程,而又无需访问源码,或理解内部工作机制的细节。——百度百科 所以 API 就是指把某些功能封装好,方便其他人调用。而调用的人可以很方便地使用这些功能,并且可以不需要知道这些功能的具体实现过程。 调用 API 流程|CSDN 按照 百度智能云的文档,百度的 API 分为管控型 API(云产品创建、查看、启动停止、扩缩容、释放停止,类似于控制台)和功能型 API(百度语音、人脸识别、文字识别)。 插播一个 SDK 与 API 之间的关系: 你可以把 SDK 想象成一个虚拟的程序包,在这个程序包中有一份做好的软件功能,这份程序包几乎是全封闭的,只有一个小小接口可以联通外界,这个接口就是 API。 比如—— 有一杯密封饮料,它的名字叫做“SDK”。 饮料上插着吸管,吸管的名字叫“API”。 来自:SDK 和 API 的区别? - 简道云的回答 - 知乎 那么说回来,作为用户学习 API 调用的话,其实只需要关注两个部分,即上图中的“请求数据”和“处理并显示”部分,其他内容只管交给开发人员即可。 HTTP 请求 HTTP 的请求与响应,可以称为是 API 请求数据的载体。 按照定义来说,HTTP 就是在网络上传输 HTML 的协议,用于浏览器和服务器的通信。根据 HTTP 标准,HTTP 请求可以使用多种请求方法,其中 GET 和 POST 是最常见的 HTTP 方法。...

July 22, 2020

CS294-112 深度强化学习笔记

Course website: http://rail.eecs.berkeley.edu/deeprlcourse-fa18/ Video link: https://www.youtube.com/playlist?list=PLkFD6_40KJIxJMR-j5A1mkxK26gh_qg37 第一讲 课程简介 材料、助教、先修课程、课程作业(提供 TensorFlow 框架) 什么是强化学习? 为什么要研究它?14'00 更大的问题,怎么建立一个智能机器? 快速响应、复杂规划没问题,但缺少扩展性、适应性。 人类的灵活性和适应能力是对机器来说复杂且多样的挑战。 深度学习 → 非结构化环境18'23 处理输入信息,但没有解决决策问题。 强化学习 → 决策的数学形式 decisions(actions) consequences(observations、rewards) e.g. TD gammon 双陆棋 AlphaGO 游戏 机器人运动技能学习 抓取 **何谓 deep?**用 CV 举例22'30 传统 CV:手动设计的特征,真正的学习只发生在最后一层分类器 deepCV:每一层经过端到端训练,适应性 传统 RL:手动提取特征(困难 受限) deepRL:端到端训练 端到端对做决策有什么用?27'00 感知系统、控制系统,如果分开设计,联合优化,中间很多特征是不关心的。 一个机器人控制的例子29'14 观测 状态估计 建模&预测 规划 低等级控制 控制 中间要考虑很多东西,很多假设,最后的系统就会有很多限制。 举例 decisions 和 consequences31'59 狗狗:actions 肌肉收缩(运动或发出声音);observations 各种感官;rewards 食物 机器人:actions 电机电流;observations 相机图像;rewards 任务成功标准 仓库:actions 买什么;observations 库存水平;rewards 利润...

June 21, 2020

从 CNN 到 GAN 的初尝试

使用 TensorFlow 在 MNIST 数据集上实现一个生成式对抗网络。 开头先推荐一些教程及资料: 【推荐👍】GAN 入门教程 从 0 开始,手把手教你学会最火的神经网络 https://cloud.tencent.com/developer/article/1078628 【莫烦】生成对抗网络 https://morvanzhou.github.io/tutorials/machine-learning/ML-intro/2-6-GAN/ 【官方】深度卷积生成对抗网络 TensorFlow Core https://www.tensorflow.org/tutorials/generative/dcgan?hl=zh-cn CNN CNN 最早可以追溯到 1968 年 Hubel 和 Wiesel 的论文,这篇论文讲述猫和猴的视觉皮层含有对视野的小区域单独反应的神经元,如果眼睛没有移动,则视觉刺激影响单个神经元的视觉空间区域被称为其感受野(Receptive Field),这为 CNN 的局部感知奠定了一个基础。然后是 1980 年,神经感知机 (neocognitron) 的提出,标志了第一个初始的卷积神经网络的诞生,也是感受野概念在人工神经网络领域的首次应用,神经认知机将一个视觉模式分解成许多子模式(特征),然后进入分层递阶式相连的特征平面进行处理。 CNN 由输入和输出层以及多个隐藏层组成,隐藏层可分为卷积层,池化层、RELU 层和全连接层等。 输入层 CNN 的输入一般是二维向量,可以有第三维高度,例如 RGB 图像有三个通道。 卷积层 卷积层是 CNN 的核心,层的参数由一组可学习的卷积核组成。在前馈期间,每个滤波器对输入进行卷积,计算滤波器和输入之间的点积,并产生该滤波器的二维激活图,提取更高层次的特征。 为了理解卷积,可以联想到在信号与系统中,输入对一个系统的响应是等于输入信号 e(x) 与系统函数 h(x) 进行卷积,h(x) 可以看作一个滤波器,它会对输入信号进行筛选,选择和它类似的信号;类似的,在数字图像处理中,可以使用 sobel 算子提取图像边缘特征,这是因为 sobel 算子与图像边缘的结构相似,所以进行卷积之后就能提取出来。不同的是,CNN 中的卷积核参数未知,即特定模式未知,是需要学习的参数。 值得一提的是,在下文的 GAN 中,还出现一种逆卷积,其输入比输出更小,看起来信息量变多了,实际上信息是从卷积核中来的。举例来说,特征向量描述了一张图中哪里有眼睛,而对应就有一个卷积核告诉网络眼睛怎么画出来。 卷积是特征的提取,反卷积就是特征的恢复,因此也可以理解成一种逆运算。 关于具体的计算方法,可以找一些 Gif 理解一下。 池化层 池化层又称下采样,它的作用是减小数据处理量同时保留有用信息。例如,将图像分割成 2×2 的小块,每块中只保留最大值(有的情况会保留平均值),保持原有的平面结构不变,得到的结果就只有输入的 1/4 大小,这样的做法有点像模糊图像,而之所以保留最大值,是因为我们希望获得的信息是和特定卷积核相似的特征,即能卷积出一个远高于平均值的输入,因此舍弃一些较小值对特征的识别并没有太大影响。...

June 17, 2020