使用cloudflare tunnel打洞,随时随地访问内网服务
由于我家的网络只有ipv6,没有公网ipv4,导致两个问题: ipv4网络下,无法访问家里的服务。 常用端口(80,443)被屏蔽了,要访问的话,必须带上端口号,例如:example.com:9527 cloudflare tunnel很好地解决了这两个问题,有了它我们甚至不需要公网ipv4或ipv6,可以把它理解为免费的打洞工具frp。唯一的缺点是速度可能不够理想,我家里的网络,单连接只有几百k/s,多连接可以跑满上行带宽2M/s,公司的网络单连接也能跑满上行带宽。可以把cloudflare作为备用,在无法使用ipv6的情况下,也至少能低速访问自己的服务。 安装 前置条件 一台已连接互联网的linux服务器(不需要公网ip) cloudflare账户,虽然cloudflare tunnel套餐是免..
更多i.MXRT1xxx系列启动分析
Foreword 与ST对比,i.MXRT1xxx系列的启动方式和流程都有很大不同,对比ST来说有一部分可以说相当麻烦。 Armv7-M Address Map 一般来说 0x00000000-0x1FFFFFFF的范围程序ROM的地址,SRAM都是从0x20000000-0x3FFFFFFF开始的,一般这个空间上的RAM都是片内的RAM,之后紧接着的就是片上外设的地址。0x60000000-0x7FFFFFFF一般IMXRT系列用的外部RAM都分配在这个区域 对于ST来说官方提供了BootROM,也就是常用的ISP下载,提供了BootMode,可以选择是从官方Boot启动还是自定义启动,到了F7H7的时候,直接给了用户自定义启动地址。一般来说可以从内部Flash或者官方ROM启动,视为一级启..
更多会员卡作为留存手段
小区附近开了一家糕点店,开业首日搞活动路过,就买了些甜甜圈、蛋挞之类的投喂娃。接下来莫名其妙就在他们家连续买了好几周各式糕点,老妈和老婆还专门去开了会员充了值。本来没觉得有啥,但是今天突然读到个东西来自 《销售与市场》杂志上另一个母婴用品店的案例突然觉得收到启发,觉得这玩意不简单。 首先个人家里长辈是比较反对这件事的,觉得外边的食品「不卫生」,老婆也反对「甜食」,所以去光顾糕点店本来就是个罕见行为,更是低频行为。是什么因素导致这个变化呢?就是开业首日结账的时候,店员非常推荐我们钱办会员。比如当时我们在店里消费16元,如果充64元,那么今天这16元就当场免单。而且会员卡以后可以参加8.8折活动。 当时因为孩子也想吃,所以这个16元肯定是要花了。心里一想这64元也就4倍,来消费4次就花光了,这店肯定不会在这之..
更多Juniper RE防护-过滤SSH&Telnet登录
简介1、本教程仅适用于Juniper MX系列和QFX系列设备。(验证过)2、提交配置时候,建议使用可自动回退的提交,防止无法远程管理。3、本教程主要用于Juniper设备的登录防护,限制IP登录SSH或Telnet等远程控制协议。PS:设备如果有公网IP,几乎无时不刻都有扫描和登录攻击。而且Juniper某些版本有Bug可能因此重启。配置命令编写过滤规则1234567891011121314set firewall family inet filter RE-Protect term management_permit from source-address 192.168.2.0/24set firewall family inet filter RE-Protect term management_..
更多记录收藏的一些网站、资源等
网站 工具类网站 https://editor.method.ac/制作svgcaniuse查询浏览器对Web标准的支持性typora markdown编辑器,可以复制html转成markdownUnsplash 通过api获取随机图片Weekly Visitor Report 获取访问您网站的公司的每周报告responsively 更快的进行响应式Web开发figma Web端的UI设计工具。httpbin 一个简单的 HTTP 请求和响应服务pixabay 令人惊叹的免费图片和免版税库存jsbench JS性能优化https://esm.sh/ 用于ES-Module格式NPM包的快速、全球内容交付网络。技术网站 百度技术团队1百度技术团队2美团技术团队文档网站 tc39:javascript规范ja..
更多order_by的语法
order by用于对表进行排序。 详情参见 https://www.postgresql.org/docs/current/queries-order.htmlSELECT select_list FROM table_expression ORDER BY sort_expression1 [ASC | DESC] [NULLS { FIRST | LAST }] [, sort_expression2 [ASC | DESC] [NULLS { FIRST | LAST }] ...] 当指定了多个表达式时,后面的值用于根据前面的值对相等的行进行排序。每个表达式后面都可以跟一个可选的ASC或DESC关键字,以将排序方向设置为升序或降序。可选参数NULLS F..
更多长见识,让大家看看什么是垃圾代码
在以前的文章中,在微信群中,我多次强调,写函数的时候,不要把所有参数放到一个大字典里面作为参数到处传,否则时间久了以后,根本不知道字典里面有哪些数据:1234def parse(data): name = data['name'] age = data['age'] xxx = data['xx']上面这样写,对原作者来说确实简单,但是如果代码还有别人来维护,他就根本不知道这个字典里面有哪些数据。必须要一层一层查找调用链,费时费力。但我是真的万万没想到,还有比上面这种写法更傻X的代码。真的可以称得上是垃圾中的垃圾。我们来看看下面这段代码。现在有一个类A,里面有两千多行代码。还有一个类B,里面有三千多行代码。这两个类里面有一些实例方法,有700多行代码。这些我都忍了。更要命的是,初始化类B..
更多一日一技:用一个奇技淫巧把字符串转成特定类型
我们有时候可能会需要把一个字符串转换成对应的类型。例如,把'123'转换为int类型的123;或者把'3.14'转成浮点数3.14。前提条件是不能使用eval或者exec。这是一个非常简单的功能,常规做法直接使用if判断就可以了:123456def convert(data, target_type): if target_type == 'int': return int(data) elif target_type == 'float': return float(data) ...有些同学觉得写if判断麻烦,也可能会用字典来处理:1234567def convert(data, target_type): type_map = { '..
更多一日一技:如何正确为历史遗留代码补充单元测试?
我们知道,在软件工程中,单元测试是保证软件质量的重要手段之一。一个优秀的代码,单元测试的代码量,经常会超过被测试的代码本身。一个理想化的开发团队,可能有三分之二的时间是在写测试,剩下的三分之一时间才是写业务代码。如果你的项目是从一开始就写单元测试,那么你写起来应该轻松又愉快,因为单元测试会促使你的代码自身变成可测试的代码。但如果你接手了一个大项目,里面已经有几十万行代码了,那么给这些代码补单元测试会让你知道什么叫做痛不欲生。你会发现有一些函数,它让你不知道怎么写测试代码。我们来看一个例子:我想测试的是business_code里面,check_data_dup分别返回True或者False的时候,下面代码的逻辑。也就是说,我只关心第18-27行的逻辑。这个时候不关心MySQL和Redis。但是每次测试都要..
更多一日一技:Python如何动态替换对象的方法?
今天有同学在公众号粉丝群问了这样一个问题:他的问题,简单来说,就是想动态替换一个对象的实例方法,简化代码如下:123456789101112class Test: def __init__(self, name): self.name = name def work(self, job): print(f'{self.name}正在{job}')def work(self, job1, job2): print(f'{self.name}正在同时做两个工作,分别是{job1}和{job2}')t = Test('kingname')t.work = work当我们在替换之前,直接运行t.work('job'),效果如下:这个同学期望在替换以后,运行t.work..
更多