DIY esp8266 小盒子

前些天看到用esp8266开发的小盒子,按照教程https://www.instructables.com/3D-Printer-Monitor-Wemos-D1-Mini-ESP8266/操作了一下。 3D打印的外壳 作者提供了3D模型 https://www.thingiverse.com/thing:2884823, 我是使用速加网打印的, 质量和价格还不错,大概20元左右不含运费。 可能芯片规格不一样, 如果有打印机的话可以根据芯片尺寸,把盒子厚度加大一些。 相关芯片联接 主要是两个芯片: ESP8266 D1 Mini:这个普通就可以, 10元左右。 0.96 OLED : 这个建议买老款的, 新款的屏幕有些小。10元左右。 芯片链接及焊接: 焊接完成后 这里需要注意的是看好GND和5V接口,8266与OLED对接时线不要接错了, 将5V接到GND上, 烧坏了一块OLED的板子。 焊接:由于是第一次弄,大概来回焊接了3,4次,温度太高容易烧到板子, 太低焊锡又化不了。最好能固定一下, 我是拿透明胶固定了一下。 应用刷新 1 开发环境 使用Arduino IDE,配置附加的电路板的配置链接http://arduino.esp8266.com/stable/package_esp8266com_index.json , 开发版选择“WeMos D1 R2 & mini” 2 相关库选择 WiFiManager Json:arduinojson OLED:esp8266-oled-ssd1306 3 源码应用下载 https://github.com/Qrome/printer-monitor 源码及配置调整地方: Settings.h,注释掉以下几行。 //#include <WiFi.h> //#include <WiFiClient.h> //#include <WiFiServer.h> //#include <WiFiUdp.h> 配置选择了, “WeMos D1 R2 & mini”, 工具菜单中关于flash的选项。选择“Flash Size->3M (1M SPIFFS)”, 如果选择,(NO SPIFFS), 应用无法启动,会提示文件打开失败。 SPIFFS 是一个嵌入式文件系统, 由于应用中会生成配置文件, 保存相关配置信息, 配置文件生成所以该文件系统支持。 ...

2021-02-28 · 1 min · 118 words

LeetCode-Maximum XOR of Two Numbers in an Array

问题: Given an integer array nums, return the maximum result of nums[i] XOR nums[j], where 0 ≤ i ≤ j < n. Follow up: Could you do this in O(n) runtime? Example 1: Input: nums = [3,10,5,25,2,8] Output: 28 Explanation: Constraints: 1 <= nums.length <= 2 * 104 0 <= nums[i] <= 231 - 1 解答: 穷举 将所有情况进行穷举,时间复杂度O(n2) ,不过不符合题目要求 class Solution: def findMaximumXOR(self, nums: List[int]) -> int: maxXor = 0 n = len(nums) for i in range(n): for j in range(i+1, n): maxXor = max(maxXor, nums[i]^nums[j]) return maxXor''' Trie树 时间复杂度O(n), 不过需要提前构建trie树 ...

2021-02-27 · 1 min · 201 words

比特币,区块链与自由软件

这篇文章 Open source money: Bitcoin, blockchain, and free software 是出自opensource.com 作者 Aahit Gaba & Heather Meeker 这篇文章主要介绍了加密货币,分布式账本以及与开源的相关的一些问题, 是在学习整理开源协议的文章的是看到作者的这篇文章。 Bitcoin是开源的吗?这个问题源于对三个概念的困惑: 区块链 加密货币 开源软件 什么是区块链? 区块链是使用的主要技术之一,他是又一个一个区块组成,每一个区块除了本身记录信息外,还记录前一个区块的hash值,使得这些区块按顺序链接在一起。而这个hash值就是每个区块的ID,做为区块的标识。通过ID就可以在网路上找到对应区块。就好像电话号码一样,要通过电话给您打电话,不需要知道您的位置,只需知道您的电话号码即可。 由于区块与前一个区块之间互相依赖关系, 所以区块链内容不容易被破坏,所以它可以用来做,商品,交易等数据的审计。同时区块链具有分布式,健壮性特点。 “分布式”是指区块链跨网络上的多个位置同步,而不是由一个中央机构或位置进行维护和控制。 “健壮性”是指从理论上讲,可以入侵该系统,但需要控制超过50%的网络以验证虚假交易。 可以将其视为Wikipedia:尽管任何人都可以更改链,但是除非大多数用户确信更改是有效的,否则这些更改将不会持续。 什么是Bitcoin? 比特币是一种加密货币,是一种通过软件加密保护的货币。 与主权国家发行和支持的货币(例如美元,英镑或印度卢比)不同,比特币不由任何中央银行发行或管理。 它们只能通过最基本的方式进行管理。 任何一种货币都有价值,仅仅是因为经济学家称之为稀缺性。 对于一种货币,这种稀缺性必须人为施加。 毕竟,如果每个人都可以印钱,钱将很快失去其价值。 实际上,比特币具有稀缺性,因为它有固定的供应量2100万枚,因此在加密货币中并不常见。 创建比特币时,对可能存在的比特币数量设置了任意限制。 随着对比特币需求的增加,价值增加,直到最终其价格开始飙升并变得非常不稳定。 如果我们有用比特币可以放入我们自己的钱包中, 钱包的操作类似电子邮箱, 不过访问钱包是我们需要两个密钥, 公钥私钥,公钥就像我们邮箱ID,而私钥就像我们的邮箱密码, 当你使用私钥登录钱包后,就可以通过分布式网络向任何人转移比特币了。而交易的验证需要矿工进行“挖矿”来进行交易验证和记账。 比特币仅仅是加密货币,区块链上的一个应用。 区块链是开源的吗? “源代码”是指源代码,开放源代码许可模型的事实是,许多软件只能以一种形式(二进制形式)执行,而只能以另一种形式(源代码形式)被创造。 二进制文件不易被人更改,因此访问源代码对于更改软件至关重要。 开源模型旨在确保二进制代码的用户可以访问他们正在使用的二进制代码的源代码,以便他们可以检查,理解,修复和改进该软件。区块链是一种技术,可以使用不同的编程语言来实现, 虽然有实现可能有所不同,但是都具有相同的核心功能。正如区块链和比特币的关系,一般与特殊的关系。区块链软件的三个特征: 加密 分布式是账本 去中心化系统 他们每个组件都可以用软件实现,可以开源也可以转悠,比如以太坊使用的是GNU LGPLv3许可, 比特币核心使用MIT许可证。而Hyperledger Fabric基于Apache2.o许可证。另外私有区块链项目,则由公司开发拥有, 有一些已经申请专利。 所以当然人们说区块链是开源的,一般是说区块链系统使用开源软件实现的。 从更一般意义上将区块链是开放的, 开放的数据内容可以被任何人出于任何目的自由的使用,修改,共享。他更代表的是一种开放的文化。 开放标准可以最好地促进安全性,区块链之所以受欢迎部分原因是其安全性, 正如其源代码中说得“given enough eyeballs, all bugs are shallow.”足够多人关注后,所有Bug都将付出水面。 ...

2021-02-24 · 1 min · 80 words

开源许可证

最近在学习python 使用到在操作package的时候,有一个步骤就是要增加一个“LICENSE”文件。 Copyright (c) 2018 The Python Packaging Authority Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 这里用到是MIT的许可证。 ...

2021-02-21 · 3 min · 508 words

python语言学习

最新学习极客时间物联网课程中,老师使用的语言是python。之前也没有系统学习过,利用假期,跟着两个极客时间专栏学习了一下python 。 使用的MicroPython是精简的、高效的python3的实现, 更加适合嵌入式开发。 python语言是精简,即插即用的语言,有非常丰富的工具包,尤其是在机器学习和数据分析方面。 python开发工具 常用的开发工具 Pycharm Jupyter Visual studio Vim (python-mode) Spyder Atom python语法 接触过c,java, linux shell perl,其实就会发现python和这些语言语法基础上也都大同小异。 下面代码使用的是python3运行 变量 动态类型变量 我理解的动态右值的类型已经是确定的(一个固定的或者的范围内的值), 所以左值仅是他的一个提供被使用的标记。 >>> var1 = 1 >>> type(var1) <class 'int'> >>> var1 = 'hello world' >>> type(var1) <class 'str'> 类型 数字类型支持整数,浮点数, 复数。上面例子可以看到python3 中整数也使用了class int,这样实现使得其在语法上没有最大值限制的,可以支持到非常大的整数。 字符串 支持三种分割符号,最容易想到的就是在字符中可以包含单引号“’”或者双引号“"”, 'hello world' "hello world" '''hello world''' 字符串转义字符和其他语言类似也是用“\” 不能修改字符串某个字符 >>> var1='hello' >>> var1[2]='a' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' object does not support item assignment 需要重新生成一个返回。字符串拼接可以使用“string.join(iterator)” 或者“+=” ...

2021-02-17 · 4 min · 754 words

python 的 __name__

这篇文章The Reason Behind if name == ‘main’ in Python 是出自medium 作者 Jordan Williams __name__ 本文通过两个例子讲解了`if` name `== "`main":,在多文件项目中的作用,主要从两个 current_script.py import other_script print('current_script __name__ is set to {} '.format(__name__)) other_script.py print('other_script __name__ is set to {} '.format(__name__)) 输出: # python3 current_script.py other_script __name__ is set to other_script current_script __name__ is set to __main__ # python3 other_script.py other_script __name__ is set to __main__ name代表当前正在运行的模块/文件名称,直接运行的模块/文件该值为main, 对于导入模块,其值为模块名 java中的main方法 Java中每个类可以main方法如下 public class Application { public static void main(String[] args) { //construct objects here } } main方法是一个静态方法,常用对类进行单元测试。 ...

2021-02-08 · 5 min · 901 words

python将多个excel合并

同一个excel文件,分配到各组填写, 最后统一汇总成一个文档反馈。 环境 windows10 python3.7 + openpyxl 目标 in目录存放各个组填写的文档 out目录存放合并后的结果文件 实现 表格 序号 产品 信息 反馈1 反馈2 01 产品1 X 00000 999999 02 产品2 X 11111 888888 03 产品3 X 22222 777777 代码: from openpyxl import load_workbook from openpyxl import Workbook import os ## 获取所有的文件 def getfilelist(dirname): li = [] for f in os.listdir(dirname): if f.endswith('.xlsx'): li.append(f) return li ## 更新 ## 1. 打开输出文件,处理一个sheet页面, ## 2. 循环获取某一行记录,放入字典结构从所有的输入文件中获取补充记录 ## 3. 如果是单条直接更新, 如果出现重复记录入职(暂不处理) ## 4. 依据以上处理方式,处理完所有sheet页面 INPATH=".\\in\\" OUTPATH=".\\out\\" productlist = ('product1','product2') ## 1. sheetname名称 ## 2. 位置1: 过滤条件 product 所在列位置,判断是否productlist ## 3. 位置2:通过判断第一个需要填写项判断是否填写数据 sheetlist = ( ('sheet1)', 6, 15), ('sheet2', 6, 13), ('sheet3', 5, 12), ('sheet4', 6, 14)) def update(): inlist = getfilelist(".\\in") outlist = getfilelist(".\\out") for li in sheetlist: sheetname = li[0] product = li[1] firstfilled= li[2] d = readdata(inlist, sheetname, product, firstfilled) writedata(outlist, d, sheetname) def readdata(inlist, sheetname, product, firstfilled): d = {} for i in inlist: wb = load_workbook(filename = INPATH+i) ws = wb[sheetname] row = tuple(ws.rows) c = filter(lambda cell: (cell[product].value in productlist) and (cell[firstfilled].value is not None), row) for cell in c: d[cell[0].row] = cell return d def writedata(outlist, d, sheetname): wbout = load_workbook(filename = OUTPATH+outlist[0]) wsout = wbout[sheetname] print(sheetname) #for key in d.keys(): for key in d: for col in range(1, wsout.max_column+1): wsout.cell(row=key, column=col).value = d[key][col-1].value wbout.save(filename = OUTPATH+outlist[0]) update() 代码调整: ...

2021-02-03 · 2 min · 237 words

LeetCode- Add and Search Word - Data structure design Solution

leetcode 211 Trie的添加及搜索 Design a data structure that supports adding new words and finding if a string matches any previously added string. Implement the WordDictionary class: WordDictionary() Initializes the object. void addWord(word) Adds word to the data structure, it can be matched later. bool search(word) Returns true if there is any string in the data structure that matches word or false otherwise. word may contain dots '.' where dots can be matched with any letter. Example: ...

2021-01-27 · 4 min · 790 words

python map & filter & reduce

map, filter, reduce 是函数式编程的函数, 不再需要循环分支使得代码更加简洁。map/reduce 和google的map/reduce功能是类似的, filter有些类似shuffle, 当然shuffle更多的工作是将相同的key放到同一个reduce计算中 map map(function_to_apply, list_of_inputs) 例如: items = [1,2,3,4,5] squared = [] for i in items: squared.append(i**2) print(squared) <=> 等价于 items = [1,2,3,4,5] squared = list(map(lambda x: x**2, items)) print(squared) filter filter(function_to_apply, list_of_inputs) 接着上面的代码继续 less_than_ten=[] for i in squared: if i < 10: less_than_ten.append(i) print(less_than_ten) <=> 等价于 less_than_ten=[] less_than_ten = list(filter(lambda x: x<10, squared)) print(less_than_ten) reduce reduce(function_to_apply, list_of_inputs) 和上面两个函数不同, reduce将进行迭代合并操作 product = 0 for i in less_than_ten: product = product + i print(product) <=> 等价于 from functools import reduce product = 0 product = reduce((lambda x,y:x+y), less_tan_ten) print(product) 参考及引用 https://book.pythontips.com/en/latest/map_filter.html Photo by Andy Vu from Pexels

2021-01-17 · 1 min · 102 words

可逆计算 reversible computing

本周在学习Trie数据结构的时候,看到了他的发明者 Edward Fredkin,他也在研究reversible computing 弗雷德金(Fredkin)对计算,硬件和软件一直很感兴趣。 在1960年代初期,他在BBN编写了第一台PDP-1汇编程序。 他是trie数据结构,Fredkin gate和Billiard-Ball计算机模型的可逆计算的发明者。 他的主要贡献包括他在可逆计算和元胞自动机方面的工作。 他还研究领域还包括计算机视觉,人工智能研究和计算机象棋。 ...

2021-01-17 · 1 min · 70 words