使用usb转TTL(PL2303模块) 串口连接树莓派3B

使用 usb 转 TTL(PL2303 模块) 串口连接树莓派 3B By default, on Raspberry Pis equipped with the wireless/Bluetooth module (Raspberry Pi 3 and Raspberry Pi Zero W), the PL011 UART is connected to the BT module, while the mini UART is used for Linux console output. On all other models the PL011 is used for the Linux console output. 在树莓派 3 以前,官方是将“硬件串口”分配给 GPIO 中的 UART(GPIO14&GPIO15),因此可以独立调整串口的速率和模式,直接连接就可以。而在 3 以后的树莓派中因为新增了蓝牙使用掉了 UART。这样默认就不开启了,以下是手动开启的方法。 使用 HDMI 启动树莓派编辑/boot/config.txt在后面新增以下两行 # 激活串口输出 enable_uart=1 # 禁用蓝牙 dtoverlay=pi3-disable-bt 运行sudo systemctl disable hciuart禁用蓝牙服务,然后重启...

April 2, 2018 · 1 min · 120 words · Fython

collections模块中的namedtuple和defaultdict

collections模块中的namedtuple和defaultdict collections模块是Python中对内置类型(dict, list, tuple)的拓展。就是说它们本身具有普通内置类型的所有特性,并添加了新的功能。 namedtuple() namedtuple(typename, field_names)是tuple的子类,定义的元组可以通过属性访问,也易于理解,self-document。field_names可以是列表或者是通过空格或者逗号分隔的字符串。 >>> from collections import namedtuple >>> Point = namedtuple('point', 'x, y') >>> p = Point(3, y=4) >>> p point(x=3, y=4) >>> p[0] 3 >>> p.x 3 >>> x, y = p >>> print(x, y) 3 4 namedtuple有几个比较有用的方法和属性 SomeNamedTuple._make(iterable)类方法,从可迭代对象中取值,长度必须和传入的field_names一致,返回一个新的对象 somenamedtuple._asdict()方法返回一个有序字典(OrderedDict) somenamedtuple._replace(**kwargs)方法替换值,返回一个新的对象,原来的不变 somenamedtuple._fields属性返回键名(field name),可用于创建新的named tuple 再来看两个官方文档上的例子读取csv文件或者从sqlite读取 EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade') import csv for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))): print(emp.name, emp.title) import sqlite3 conn = sqlite3....

February 9, 2018 · 2 min · 244 words · Fython

Python中的特殊方法

Python 中的特殊方法 python 在定义 class 时有很多特殊方法可以定义,它们一般都是以双下划线开头和结尾如__init__、__call__、__lt__、__iter__、__setattr__、__setitem__等,下面将对这些常用方法作一些总结。 class 基本方法 __new__(cls[, ...]) 我们都知道__init__会在类初始化的时候被调用其实它不是第一个被调用的,第一个是__new__会在对象创建的时候被调用,这时还没有实例化所以它的第一个参数是cls。 __init__(self[, ...]) 最常用的类方法不用过多介绍,对象初始化时自动调用,也就是在__new__之后才会调用。第一个参数是self实例本身。有一点要注意的是它不能返回(return)值,不然会报TypeError记住它是用来初始化对象的。 class A: def __new__(cls): print('__new__ called') return super(A, cls).__new__(cls) def __init__(self): print('__init__ called') a = A() 返回如下,注意这是 Python3 的写法默认A继承自object,如果使用 Python2 的需要指定A继承自object基类,使用新类。不然__new__是不会被调用的。 __new__ called __init__ called 需要注意的是上面我们定义了__new__接收类对象(cls),必须返回return super(A, cls).__new__(cls)这个类实例也就是下面方法的self,因为__new__会被首先调用返回实例对象以供下面的方法如__init__这些使用。如果去掉这一句其他方法会返回None。默认未定义__new__方法时,默认返回父类实例super().__new__(cls, *args, **kwargs) __str__(self) 调用print(obj)或str(obj)时返回的字符串是对人类友好的(human readable string)。 __repr__(self) 调用repr(obj)或obj返回的字符串,比较偏向机器。 __format__(self, format_spec) 调用f string或format时调用,format(value, format_spec)相当于value.__format__(format_spec) class Animal: def __init__(self, name): self.name = name def __format__(self, format_spec): if format_spec == 'view': return f"this is {self....

January 28, 2018 · 3 min · 588 words · Fython

配置SSH agent 和 SSH agent forwarding转发

0x01. ssh-agent转发 经常使用SSH而且私钥设置了passphrase的同学会遇到一个问题,就是每次登录主机都要输入一遍passphrase会很麻烦,这时ssh-agent命令就有用了。 ssh-agent是OpenSSH默认自带的并且在后台一直运行的daemon。假设已经通过ssh-keygen生成了自己的私钥,可以在GitHub上传公钥后使用ssh -T git@github.com命令测试通过。 $ ssh-agent SSH_AUTH_SOCK=/var/folders/k6/k5s6nj_j2k70jzp7plv120y40000gn/T//ssh-fcn9OCl9La13/agent.2462; export SSH_AUTH_SOCK; SSH_AGENT_PID=2463; export SSH_AGENT_PID; echo Agent pid 2463; 但上面的命令没用,我们需要eval命令导入环境变量 $ eval $(ssh-agent) Agent pid 2533 $ echo $SSH_AGENT_PID 2553 $ echo $SSH_AUTH_SOCK /var/folders/k6/k5s6nj_j2k70jzp7plv120y40000gn/T//ssh-6bHKwvKJ6AO1/agent.2532 ssh-agent已经运行了,最后需要把私钥加入cache。 $ ssh-add ~/.ssh/id_rsa Enter passphrase for /Users/fython/.ssh/id_rsa: Identity added: /Users/fython/.ssh/id_rsa (/Users/fython/.ssh/id_rsa) 可以使用ssh-add -l查看缓存的私钥。现在再登录使用公钥认证的主机不需要输入passphrase了。 这个每次开机都要运行一遍上面的命令好像有点麻烦,值得高兴的是大多数的linux发行版都在登录图形界面时都会启动一个ssh-agent进程,你不需要任何操作,可以使用ps -ef | grep ssh-agent查看。如果你的系统没有这个功能,请在~/.xsession文件中加入: ssh-agent gnome-session Note:请使用你自己的窗口管理器取代gnome-session。 本人使用Arch,i3桌面环境的时候需要在~/.profile中加入才能启用 export $(gnome-keyring-daemon --start --components=secrets,ssh) 0x02. 使用SSH agent forwarding多机器转发 设想一下当你有两台server如A和B,你都可以ssh上去但你已经登入了上了A想从A上面ssh到B又不想将私钥上传到A该怎么办,一个很好的办法是开启ForwardAgent yes。 修改全局配置/etc/ssh/ssh_config或修改个人~/.ssh/config配置推荐第二种,没有就新建文件,然后加入 Host * ForwardAgent yes 最后去A和B服务器上~/....

December 27, 2017 · 1 min · 93 words · Fython

Git工作流

Git是当今最流行的开源版本控制系统,使用git的每个团队应该也有固定的工作流。今天就介绍一个现有普遍使用的工作流git-flow。 分支(branch) 如上图一般分支有*master、develop、feature/xxx、release/xxx、hotfixes*,下面一一介绍。 长期分支 长期分支是跟着产品长期存在的不会删除。 *master*只能用来包括产品代码,不要在这上面做任何的改动。 *develop开发主分支,所有新功能的分支从这里checkout,所以这是开发的基础分支。该分支也是汇集所有开发新功能后最后merge到master*的分支。 临时分支 临时分支只用来开发新功能、修复bug和发布产品用最后删除。 *feature/xxx开发新功能的分支从develop分支checkout每个功能创建一个分支是一个良好的习惯。开发测试完后merge到develop*分支进行更全面的测试。 *release/xxx产品预发布分支,一般以版本号为分支名,需要合并到master*分支发布。 *hotfixes紧急修复bug的分支基于master分支,修复完后一定要合并到master分支和develop*分支。 Git-flow工作流程 基本步骤 开发人员首先从*develop*分支checkout -b feature/xxx一个待开发的分支,开发和测试。 当开发和测试都完成后将*feature/xxx合并到develop并删除清理。当然其中有新功能时可以再新建一个feature*分支并最后合并到开发分支。 终于等到release了,现在开发分支汇集了所有新开发的功能并无重大bug,我们从*develop分支checkout一个release/v1.0.0的分支进行更加全面的测试准备发布,有bug就在release分支修复,正式发布就是把这个release分支合并到master分支打上tag。当然不要忘记将发布分支合并到develop分支以保持和master*代码同步一致。 可能发布后有紧急的bug需要修复那就从*master分支checkout一个hotfixes/missing-link分支修复bug并合并到master和develop*最后删除。 总结一下 以上就是Git-flow方案的所有流程,优点是分支清晰各干各的看名字就知道,最后只留下*master和develop*分枝。缺点当然是步骤比较繁琐咯,开发要新建很多分支然后切换和删除。我们可以还有很多方案选择GitHub flow、GitLab flow等,或者理解熟练了之后自创一套也是可以的。 GitHub协同工作 身为一个开发者一定想为开源项目贡献自己的代码,下面是基本步骤可做参考。也可以作为团队协作的基本流程。 Fork到自己帐号下并Clone到本地 git remote add upstream https://github.com/... 添加上游项目地址(源项目地址)以便更新到最新的代码,添加完可用git remote -v查看除了origin应该还有upstream远程地址 git pull upstream master从刚才添加的upstream拉取最新代码 git checkout -b feature/some-feature 新建一个你要添加新功能的分支,开发就在这上面进行 git add . && git commit -m 'some feature add'测试通过后提交代码 git checkout master && git pull upstream master这主要是从源仓库拉取最新代码,在你开发期间,如果源项目有改动提交pull就能拉取下来 git checkout feature/some-feature && git rebase master 然后执行一次变基更新代码 git push origin feature/some-feature推送你开发完并更新到最新的分支到GitHub 去自己GitHub帐号下 pull request等review合并 一具话就是先在本地新建一个分支开发最后提交这个分支发PR,需要注意的是提交到远程的时候记得先pull更新代码然后rebase使分支清晰可读。...

November 21, 2017 · 1 min · 82 words · Fython