Thursday, February 17, 2022

V2EX - 技术

V2EX - 技术


鉴于向日葵爆远程执行漏洞

Posted: 17 Feb 2022 12:32 AM PST

请问还有什么好用的远控软件呢? 目前看了下现在还有 rustdesk ,ToDesk 等等软件 大家还有什么好用的吗

妈妈开了实体鲜花店,该怎么做网店?(请大佬们指点)

Posted: 17 Feb 2022 12:32 AM PST

位于三线城市,偶尔碰上疫情封小区,生意不会太好,就琢磨着开网店。

咨询下大佬们,需要刷单还是怎样,有没有套路可以借鉴,成本几何。

目前发现的平台有"美团、饿了么、淘宝、京东",感觉都是需要每单收取 8 ~ 15%。

向日葵远程桌面存在远程代码执行漏洞

Posted: 17 Feb 2022 12:24 AM PST

刚看到的,在用的朋友注意更新下版本吧

https://github.com/TRYblog/sunlogin_rce_

作为程序员的你,喜欢帮同事 review 代码吗

Posted: 17 Feb 2022 12:24 AM PST

我有点讨厌 review 同事代码,想听听大家的想法。

大部分公司的产品经理是不是都是不太聪明的脑子,瞎搞胡搞的德行?

Posted: 17 Feb 2022 12:21 AM PST

起因是,我手上这台 oppo 手机,用了一年多,以前用过魅族,苹果,小米,华为还有三星及"山寨"机等,最好用感觉还是魅族.
这具 OPPO 手机,我输入了指纹识别,人脸识别,当然也有密码,但这个 OPPO 手机每隔 3 天用着用着就提示要输密码登录,很打扰人,指纹和人脸都不行。昨天也是突然提示,我正下意识的按了 2 个数字,突然想起我密码不是 5 位吗(因为我以前在魅族上我只设 5 位),这 OPPO 要我输 6 位,不就不对吗?结果,我一下子搞混了,到目前都没回想起 OPPO 上面的密码,但这个 OPPO 没有密码,就用不了,指纹和人脸都不行!
它这不是傻吗?还不能通过一个高等级的安全项来重置一个低等级的安全项?本来这就是画蛇添足的安全机制!
想起,我以前上班,比 OPPO 大多了,也是产品经理喜欢冲 KPI ,但人家也不会象 OPPO 的产品经理这样的猪脑子啊。
再说一个很小的使用点:魅族手机我设个闹钟,可以每小时响一下,用来提示我用眼休息一下,而这个 OPPO 手机,这样的功能也是没有的,都会心思放在一些七里八里的上面,难怪叫厂妹机,只会搞样子,里面的功能也**的很。(例如它上面一些 404 url 就是故意断你的)。

求 rust 学习交流群

Posted: 17 Feb 2022 12:20 AM PST

救救孩子吧,找不到组织啊,一个人学习太孤独了,想加个一起学习 rust 的群,v2 上学习 rust 的同学貌似也不少呀,你们都在哪交流呢?

能闭着眼睛写程序吗?

Posted: 17 Feb 2022 12:09 AM PST

感觉眼睛很受伤
越来越伤

如果能闭着眼睛写程序就好了……

值得推荐的一个云原生的 cicd go 语言项目

Posted: 17 Feb 2022 12:05 AM PST

atomci

AtomCI 致力于让中小企业快速落地 Kubernetes ,代码均已开源, 您的 star 是我们开源的动力,非常感谢(:

架构图

┌─────────┐ │         │ │  Gitlab ├──────┐      ┌───────────────────────┐    ┌──────────┐   ┌───────────────────────┐ │         │      │      │ AtomCI                │    │          │   │                       │ └─────────┘      │      │                       │    │          │   │  ┌────────────────┐   │                  │      │      Frontend (Vue)   │    │          │   │  │ jnlp-agent pod1│   │                  ├──────►                       ├────►          │   │  └────────────────┘   │ ┌──────────┐     │      │                       │    │          ├───►                       │ │          │     │      │      Backend (Go)     ◄────┤  Jenkins │   │  ┌────────────────┐   │ │ Registry ├─────┤      │                       │    │          │   │  │ jnlp-agent pod2│   │ │          │     │      │                       │    │          │   │  └────────────────┘   │ └──────────┘     │      └──────────┬────────────┘    │          │   │        ....           │                  │                 │                 │          │   │  ┌────────────────┐   │ ┌───────────┐    │      ┌──────────┴────────────┐    ├──────────┤   │  │ jnlp-agent podn│   │ │           │    │      │                       │    │k8s/docker│   │  └────────────────┘   │ │ Kubernetes│    │      │        MySQL          │    │   or     │   │                       │ │           ├────┘      │                       │    │ warfile  │   │ agent on kubernetes   │ └───────────┘           └───────────────────────┘    └──────────┘   └───────────────────────┘ 

视频演示

  1. 概述及如何安装部署 视频链接
  2. 介绍及快速开始 视频链接
  3. 5 分钟全流程体验 视频链接

写在最后

这个项目前端使用 vue ,后端使用 go ( beego ), 如果你最近也在学习 golang 或是想找一个一起成长开源的项目,可以一起加入,期望不要吝啬你的 star,非常感谢~

2.5 年后端 CRUD 靠八股文和刷题能面进大厂吗

Posted: 16 Feb 2022 11:59 PM PST

rt ,非互联网公司内部系统 Java 岗,硕士 2.5 年,工作都是做的内部项目,基本上 crud 没啥技术含量,可以通过背八股文+刷题拿到大厂 offer 吗,坐标杭州

亿级别的频率控制应该怎么设计

Posted: 16 Feb 2022 11:56 PM PST

要起到限流的效果, 一个用户 m 天内超过 n 次触发一个行为就会被阻止, 比方说一亿用户量, 比如 30 天内一个用户最多分享 100 次, 或者 5 天内一个用户最多评论 30 次, 主要要考虑空间占用和性能,有什么好的方案吗。

tomcat 如何禁止下载 jsp 源码

Posted: 16 Feb 2022 11:45 PM PST

tomcat 服务器 webapps 目录下有 xx.jsp 文件 通过访问 http://127.0.0.1:8080/xx.jsp/ (注意最后一个斜杠) 浏览器会弹出下载,保存文件后发现下载回来的是 jsp 源文件,即未编译版本,能看到 java 代码的。

curl 'http://127.0.0.1:8080/xx.jsp/' 情况也一致 排除缓存

尝试过增加 filter 拦截,但是发现这个是 defaultServlet 行为,这属于最外层,代码无法干预

涉及 jsp 页面有点多,全部挪到 web-inf 工作量有点大,现在护网也不能这样操作

目前唯一的思路是加 ng ,在 ng 层面重写 url

不知道大家有没有别的思路

其实源码也没啥敏感信息,但是他扫出来就非要整改

向日葵是否存在安全漏洞,默认创建 sunlogin 管理员用户

Posted: 16 Feb 2022 11:45 PM PST

帮朋友问一个问题。

最近在使用向日葵的时候发现一个问题,想请教一下各位大佬,为什么向日葵会在电脑上默认创建名为 [ sunlogin ] 管理员账号。

运行命令符即可查询到

无法理解为什么要这么做,即便解释密码安全,也不至于在户电脑上创建一个管理员账号。是否相当于在电脑里面开了一道后门,这不完全破坏系统安全了吗?

加上看到大家帖子爆的向日葵远程执行漏洞,我在 CNVD 也看到了相关报道。不知道各位大佬有没有出现过类似情况,毕竟偶尔还是会用到远控,有没有什么解决方法,能踏实点使用

React 有什么比较优雅的跨组件通信方法吗

Posted: 16 Feb 2022 11:43 PM PST

在 A 组件上推送了某个消息,可以让不同级的组件 B 监听,并执行相应的任务。

我首先想到了使用 Context ,保存一个变量,A 改变这个变量,B 使用 useEffect 监听变化。

或者是使用 hox.js

或者是使用 浏览器的 CustomEvent 。

上述感觉都不够优雅

真心求问, Paw 比 Postman 好在哪里?有什么决定性的区别嘛

Posted: 16 Feb 2022 11:19 PM PST

最近在做相关工具的调研

发现 Paw 评价貌似比 Postman 好一点,但初步使用 Paw ,没找到有什么大的区别,想问下

django ORM 没办法指定 Subquery 的字段进行 join 吗?

Posted: 16 Feb 2022 11:19 PM PST

select * from user inner join          (select login_id from account where created_time >='xxx') t1          on t1.login_id = user.id;  
  • 如果能 构造一个 subquery ,然后可以 User.objects.filter(id=Subquery.c.login_id)
  • 现在 django 不支持 subquery.c.field 这种方式。

Python 有什么第三方可以同时按照日期和大小切分日志

Posted: 16 Feb 2022 11:14 PM PST

有个需求就是日志部分能按照日期创建,每天一个日志文件,最多保留 5 天,假设某一天的日志超过设定的大小就切分,比如 test_2022-02-17.log 超过 50M , 则切分成 test_2022-02-17.log.1, test_2022-02-17.log.2 这样,python 自带的 logging 貌似只能按照日期或者大小切分

遇到一个神奇的错误,怀疑可能和编译器或者调试器有关

Posted: 16 Feb 2022 10:59 PM PST

func test() error {
return nil
}

other code....

err := func()
if nil != err {
//log.println(err)
}

函数里面是一致返回的 nil ,神奇的是单步调试的时候 err 的值居然不为 nil ,但是加上打印 err ,err 就变成了 nil 并不会进入 if 逻辑。

纯技术讨论 关于 go.mod 咨询

Posted: 16 Feb 2022 10:52 PM PST

纯技术贴 之前用的是 maven ,一个项目下多个模块每个子模块配备一个 pom.xml 文件 现在 go 我发现一个大项目 common 下多个子目录 例如 redis, sql 子目录 sql 子目录下有 go.mod 文件 redis 子目录下纯代码

大项目 go.mod 里面依赖包含了 redis 目录并且配备了版本号 这种是不是非法行为?

我在另外一个项目里导入大项目 common 被告知 ambiguous import error, 导入了多个 redis 目录

我查了 go graph 发现只有 redis 来自 common

如果只想引入一个项目里的某个目录 是不是需要在每个子目录下写 go.mod 文件?

YubiKey Bio 有假货吗?

Posted: 16 Feb 2022 10:41 PM PST

因为一些原因需要购买 3 个 YubiKey Bio ,淘宝看最低 755 * 3 = 2265 元,群友说他那里 2100 能拿到,走闲鱼交易,请问这东西有假货吗,可以买吗?

中文/英文 国际电话区号数据集合

Posted: 16 Feb 2022 10:41 PM PST

https://github.com/TonnyL/Telecode

[   {     "cn": "中国",     "en": "China",     "dialing_code": "+86",     "code": "CN"   },   {       "cn": "中国香港",       "en": "Hong Kong (SAR)",       "dialing_code": "+852",       "code": "HK"   },   ... ] 

创建了 20 个 Bear 风格的 Typora 主题,欢迎使用

Posted: 16 Feb 2022 10:31 PM PST

一系列 Bear 风格的 typora 主题,共计 20 余款。

开源链接: https://github.com/imageslr/typora-theme-bear

预览: https://imgtu.com/i/H5mFj1

H5mFj1.png

2022 年了,用 m1 开发 Android 还有什么不方便的地方吗?

Posted: 16 Feb 2022 10:28 PM PST

各位好,小弟最近有想换新的 MacBook pro 的冲动,但是不知道目前 m1 对 Android studio 的支持怎么样,都是陪了吗?另外由于是 Android 终端机的开发,还需要用到 Windows 上的一些工具,甚至 adb 都是别的公司定制的版本,这些都可以实现吗?谢谢

分享我的校招求职经验(后端、技术向)

Posted: 16 Feb 2022 10:14 PM PST

k8s 配置文件中的 dsn 是如何解析的?

Posted: 16 Feb 2022 09:57 PM PST

以这个配置文件为例: https://github.com/viuts/kubernetes-redash/blob/master/manifest-all.yaml#L122

redis://redis:6379/0 ,是谁把第二个 redis 替换成正确的地址的?

postgresql://postgres@postgres/postgres ,是谁把第一个 postgres 替换成正确的用户名密码,把第二个 postgres 替换成正确的地址的?

大家实际生产中用到 CRD + Operator 多吗,是为了应对什么场景呢?

Posted: 16 Feb 2022 09:53 PM PST

因为自己工作中很少涉及云原生相关的场景(比较传统),但是对 k8s 定制特性方面比较感兴趣,所以想问问大家在实际生产中都是怎么使用的。可以谈谈你认为 CRD + Operator 的价值所在。

通过 dockfile 来 build 镜像时失败产生的文件怎么查看

Posted: 16 Feb 2022 08:14 PM PST

通过 dockfile 来 build 镜像时失败了,但是过程中生成了一个错误日志在 /tmp 目录下,请问这个日志能查看到吗。 如果能看到的话需要怎么看呢。

Youtube premium 两次退出家庭组就没别的方法再上车了吗?

Posted: 16 Feb 2022 07:51 PM PST

原来在网上上的家庭车,一个月 10 几,两次忘续费被踢,只能等一年再上车吗?(一个月 68 真的贵)
有听说印度区便宜,有没有不转区买印度的
不得不说 Youtube 真的把人拿捏的死死的,这一个广告那一个广告,还都特别的弱智,很快把人逼疯

关于 SSH 跳板机网络流量检测的问题

Posted: 16 Feb 2022 07:34 PM PST

我有两台国外的 VPS 服务器 S1 和 S2 S1 准备当跳板机,请问如果从国内机器 SSH 登陆上 S1 后再从 S1 用 SSH 登陆 S2 后,那么可以追踪到国内机器和 S2 的网络流量吗?

spring 自定义配置文件多环境切换

Posted: 16 Feb 2022 07:20 PM PST

spring 自定义配置文件,使用@PropertySource注解,然后多环境切换,比如redis-dev.properties,redis-test.properties...,使用@Value获取属性,idea 能够很好的支持通过点击@Value里配置的值跳转指定配置文件指定属性上,有什么好的方式吗?

resso,设计一个最简单的 React 状态管理器

Posted: 16 Feb 2022 06:52 PM PST

1. resso ,世界上最简单的状态管理器

resso 是一个全新的 React 状态管理器,它的目的是提供世界上最简单的使用方式。

同时,resso 还实现了按需更新,组件未用到的数据有变化,绝不触发组件更新。

GitHub: https://github.com/nanxiaobei/resso

import resso from 'resso';  const store = resso({ count: 0, text: 'hello' });  function App() {   const { count } = store; // 先解构,再使用   return (     <>       {count}       <button onClick={() => store.count++}>+</button>     </>   ); } 

只有一个 API resso,包裹一下 store 对象就行,再没别的了。

如需更新,对 store 的 key 重新赋值即可。

2. React 状态管理器是如何工作的?

假设有一个 store ,注入到在不同的组件中:

let store = {   count: 0,   text: 'hello', };  // Component A const { count } = store; const [, setA] = useState();  // Component B const { text } = store; const [, setB] = useState();  // Component C const { text } = store; const [, setC] = useState();  // 初始化 const listeners = [setA, setB, setC];  // 更新 store = { ...store, count: 1 }; listeners.forEach((setState) => setState(store)); 

将各个组件的 setState 放到一个数组中,更新 store 时,把 listeners 都调用一遍,这样就可以触发所有组件的更新。

如何监听 store 数据变化呢?可以提供一个公共更新函数(例如 Redux 的 dispatch),若调用即为更新。也可以利用 proxy 的 setter 来监听。

是的,几乎所有的状态管理器都是这么工作的,就是这么简单。比如 Redux 的源码:https://github.com/reduxjs/redux/blob/master/src/createStore.ts#L265-L268

3. 如何优化更新性能?

每次更新 store 都会调用 listeners 中所有的 setState ,这会导致性能问题。

例如更新 count 时,理论上只希望 A 更新,而此时 B 和 C 也跟着更新了,但它们根本没用到 count

如何按需更新呢?可以使用 selector 的方式(例如 Redux 的 useSelector,或者 zustand 的实现):

// Component A const { count } = store; const [, rawSetA] = useState();  const selector = (store) => store.count; const setA = (newStore) => {   if (count !== selector(newStore)) {     rawSetA(newStore);   } }; 

其它组件同理,订阅新的 setAlisteners 中,即可实现组件的 "按需更新"。

以上功能也可以利用 proxy 的 getter 来实现,通过 getter 来知晓组件 "用到" 的数据。

4. resso 内部如何实现的?

上面的实现中,是在每个组件中收集一个 setState 。更新 store 时,通过数据比对,确定是否更新组件。

resso 使用了一种新的思路,其实更符合 Hooks 的元数据理念:

let store = {   count: 0,   text: 'hello', };  // Component A const [count, setACount] = useState(store.count);  // Component B const [text, setBText] = useState(store.text);  // Component C const [text, setCText] = useState(store.text);  // 初始化 const listenerMap = {   count: [setACount],   text: [setBText, setCText], };  // 更新 store = { ...store, count: 1 }; listenerMap.count.forEach((setCount) => setCount(store.count)); 

使用 useState 注入组件中用到的每一个 store 数据,同时维护一个针对 store 中每个 key 的更新列表。

在每个组件中收集的 setState 数量,与用到的 store 数据一一对应。而非只收集一个 setState 用于组件更新。

在更新时,就不需要再做数据比对,因为更新单元是基于 "数据" 级别,而非基于 "组件" 级别。

更新某个数据,就是调用这个数据的更新列表,而非组件的更新列表。将整个 store 元数据化。

5. resso 的 API 是如何设计的?

设计 API 的秘诀是:先把最想要的用法写出来,然后再去想实现方式。这样做出来的东西一定是最符合直觉的。

resso 一开始也想过以下几种 API 设计:

1. 类似 valtio

const store = resso({ count: 0, text: 'hello' });  const snap = useStore(store); const { count, text } = snap; // get store.count++; // set 

这是标准的 Hooks 用法,缺点是得多加一个 API useStore。而且 get 时使用 snap ,set 时使用 store ,让人分裂,这肯定不是 "最简单" 的设计。

2. 类似 valtio/macro

const store = resso({ count: 0, text: 'hello' });  useStore(store); const { count, text } = store; // get store.count++; // set 

这也是可以实现的,而且也是标准的 Hooks 用法。此时统一了 get 和 set 主体,但还是得多加一个 useStore API ,这玩意仅仅是为了调用 Hooks ,如果用户忘了写呢?

而且实践中发现,在每个组件中使用 store ,都得 import 两个东西,store 和 useStore ,这肯定不如只 import 一个 store 简洁,尤其是用到的地方很多时会很麻烦。

3. 为了只 import 一个 store

const store = resso({ count: 0, text: 'hello' });  store.useStore(); const { count, text } = store; // get store.count++; // set 

这是最后一次 "合法" 使用 Hooks 的希望,只 import 一个 store ,但总归还是看起来很怪,无法接受。

如果大家试着去设计这个 API ,会发现若想直接更新 store (需要 import store ),又想通过 Hooks 解构出 store 数据(需要多 import 一个 Hook ,同时 get 和 set 不同源),这个设计不管怎么都会看起来很别扭。

为了终极简洁,为了最简单的使用方式,resso 最终还是踏上了这样的 API 设计:

const store = resso({ count: 0, text: 'hello' });  const { count } = store; // get store.count++; // set 

6. resso 的使用方式

Get store

因为 store 数据是以 useState 注入组件,所以需要先解构(解构即调用 useState),在组件的最顶层解构(即 Hooks 规则,不能写在 if 后),然后再使用,否则将会有 React warning 。

Set store

对 store 的第一层数据赋值,将触发更新,且仅对第一层数据的赋值触发更新。

store.obj = { ...store.obj, num: 10 }; // ✅ 触发更新  store.obj.num = 10; // ❌ 不触发更新(请注意 valtio 支持这种写法) 

resso 未支持 valtio 的写法,主要有以下考虑:

  1. 需深层遍历所有数据进行 proxy ,且更新数据时也需要先 proxy 化,会有一定的性能损耗。( resso 只在初始化时 proxy store 一次。)
  2. 因为所有数据都是 proxy ,在 Chrome console 打印时显示不友好,这是很大的问题。( resso 不会有这个问题,因为只有 store 是 proxy ,而一般是打印 store 内的数据。)
  3. 若解构出子数据,例如 objobj.num = 10 也可以触发更新,会造成数据来源不透明,是否来自 store 、赋值是否触发更新不确定。( resso 更新的主体永远是 store ,来源清晰。)

7. Make simple, not chaos

以上即是 resso 的设计理念,以及 React 状态管理器的一些实现方式。

归根结底,React 状态管理器是工具,React 是工具,JS 是工具,编程是工具,工作本身也是工具。

工具的目的,是为了创造,创造出作用于现实世界的作品,而非工具本身。

所以,为什么不简单一些呢?

jQuery 是为了简化原生 JS 的开发,React 是为了简化 jQuery 的开发,开发是为了简化现实世界的流程,互联网是为了简化人们的沟通路径、工作路径、消费路径,开发的意义是简化,互联网的意义是简化,互联网的价值也在于简化。

所以,为什么不简单一些呢?

Chic. Not geek.

简单即是一切。

try try resso: https://github.com/nanxiaobei/resso

关于 Java 中的 DO、DTO、BO、AO、VO、POJO 有没有人能用一个接口的例子通俗的解释一下?

Posted: 16 Feb 2022 03:43 PM PST

阿里巴巴 JAVA 开发手册是这样定义的:

DO ( Data Object ):与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。
DTO ( Data Transfer Object ):数据传输对象,Service 或 Manager 向外传输的对象。
BO ( Business Object ):业务对象。 由 Service 层输出的封装业务逻辑的对象。
AO ( Application Object ):应用对象。 在 Web 层与 Service 层之间抽象的复用对象模型,极为贴近展示层,复用度不高。
VO ( View Object ):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。
POJO ( Plain Ordinary Java Object ):在本手册中,POJO 专指只有 setter/getter/toString 的简单类,包括 DO/DTO/BO/VO 等。

但我感觉光看定义还是不容易理解,有没有人能用一个接口的来举个例子说一下

现在有哪些支持 webdav 的 Android App?

Posted: 16 Feb 2022 03:23 PM PST

用 cloudreve 搭建了个人网盘,放一些音乐和照片。

iOS 上我用 nPlayer ,可是 Android 手机上没有找到可以通过 webDAV 访问网盘的 app 。

Total Commander 可以通过 webDAV 访问网盘,但播放图片和音乐用的是系统 app ,体验实在很差。

不需要复杂的图片和音乐播放功能,只要能播放就可以了

使用 Linux 的 mv 命令移动文件时的问题

Posted: 16 Feb 2022 01:17 PM PST

我有时候会有这样一种需求,将当前目录下的所有文件及文件夹移动到当前目录下的一个不存在的目录(需要新建),

如下图,在 example 下新建一个名为 newDir 的文件夹,并将a.txt b.txt aDir移动到newDir中,

我使用 mv 命令输入mv * ./newDir, 会提示mv: ./newDir is not a directory

想问下各位,我的这个需求 mv 命令是不是无法做到,有什么命令可以做到这个吗

关于本地人体识别,该如何优化,求大佬提建议

Posted: 16 Feb 2022 12:46 PM PST

家里装了个海康的摄像头,想用于区域人数识别开关灯等操作,我目前的操作流程为

海康设置区域入侵检测,当区域检测事件触发后,开灯 然后每 10 秒一次使用 Python 调用摄像头拍照,然后 OpenCV 进行拍照后的图片裁剪 然后使用 yolo 进行人数统计,当区域人数为 0 后进行关灯操作

流程已经被我调通了,但就是速度实在是有点慢, 事件触发到图片裁剪完成还好,基本也就 1 秒多 使用 yolo 进行图片识别的时候,基本要 10 秒才能有反馈结果 而且进行识别的时候,CPU 基本跑到 7 80 (一台 2014 的 macmini 8+256 )

想请大佬指点一点,有没有什么优化的方案,能提高识别速度

备注:使用过百度的 AI 识别,确实速度能提升到 1-2 秒识别出结果(但毕竟是家里的图片,不想传到网络识别)

目前在考虑是否单独用个机器进行这项人体识别操作(主要 macmini 还挂有其他任务),如果单独用机器跑这个人体识别,应该用什么机器呢(个人对硬件确实小白)

请大佬们指教!

未来的路在哪里?

Posted: 16 Feb 2022 11:58 AM PST

近年来发现在网上都是各种买房难、创业失败、裁员、躺平等等,给人一种活不下去的感觉。

有没有谁是逆操作的?有哪位屌丝大神愿意分享自己的逆袭经验?

希望,是这个世界上最珍贵的东西?会不会只是个幻想?

应该是一个 Android 开发中的新手问题,请教一下

Posted: 16 Feb 2022 11:24 AM PST

前言

在之前的帖子中,我想实现在 PC 端(也就是网页上)控制大疆无人机 https://www.v2ex.com/t/823520

在和大疆的客服沟通后,发现只能通过手机 APP 接遥控器的方式控制无人机

然后在网上找到了一个 NanoHTTPD 的库,心想我只要在网页上实现无人机的起飞降落和获取图传就可以了,那么是不是在 APP 里实现一个小型的 Web Server ,然后发送 Post 请求到手机 APP 是不是就可以了呢?

然后开始自学 Java 和 Android ,买了一台最便宜的大疆无人机 Mini SE

终于参照大疆的 Mobile SDK ,做了一个可以起飞降落和获取图传的 APP 。

心想接下去就是把 NanoHTTPD 库跟 APP 结合就可以了。

难题

public class MainActivity extends AppCompatActivity {      private App myApp;      @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);         Button startButton = (Button) findViewById(R.id.start_httpd);         Button stopButton = (Button) findViewById(R.id.stop_httpd);         Button take_off = (Button) findViewById(R.id.take_off);         Button landing = (Button) findViewById(R.id.landing);          startButton.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View view) {                 try{                     myApp = new App(this);                      Log.e("onClick", "WebServer started");                  }catch (IOException e){                     e.printStackTrace();                     Log.e("onClick", "WebServer start failed" + e.getMessage());                 }             }         });          stopButton.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View view) {                 if(myApp != null)                 {                     myApp.closeAllConnections();                     myApp = null;                     Log.e("onClick", "Web server close");                 }             }         });     } }  class App extends NanoHTTPD{      private String commandName;     private String operator;      public String getCommandName()     {         return commandName;     }      public String getOperator()     {         return operator;     }      public App(View.OnClickListener onClickListener) throws IOException {         super(8080);         start(NanoHTTPD.SOCKET_READ_TIMEOUT,false);     }      public void starting() throws IOException {         new App((View.OnClickListener) this);     }      private void requestBodyProcess(Map<String, String> map,String requestBody)     {         String requestBodyRegex = "\\w+=\\w+&\\w+=\\w+";          boolean isRequestBodyMatch = Pattern.matches(requestBodyRegex, requestBody);         if(isRequestBodyMatch)         {             Pattern command = Pattern.compile("(?<=\\bcommandName=)\\w+");             Matcher command_matcher = command.matcher(requestBody);             if(command_matcher.find())             {                 map.put("commandName", command_matcher.group(0));             }              command = Pattern.compile("(?<=\\boperator=)\\w+");             command_matcher = command.matcher(requestBody);             if(command_matcher.find())             {                 map.put("operator", command_matcher.group(0));             }         }         else         {             map = null;         }     }      @Override     public Response serve(IHTTPSession session) {         Map<String, String> files = new HashMap<String, String>();                 Map<String, String> map = new HashMap<String, String>();         // HTTP GET         if (session.getMethod() == Method.GET) {             String itemIdRequestParameter = session.getParameters().get("itemId").get(0);             return newFixedLengthResponse("Requested itemId = " + itemIdRequestParameter);         }         // HTTP POST         if (session.getMethod() == Method.POST) {             try {                 session.parseBody(files);                 String requestBody = session.getQueryParameterString();                 requestBodyProcess(map,requestBody);                 commandName = map.get("commandName");                 operator = map.get("operator");                 return newFixedLengthResponse("Command Name = " + map.get("commandName") + "\n" + "Operator = "                         + map.get("operator") );              } catch (IOException | ResponseException e) {                 // handle             }         }         return newFixedLengthResponse(Response.Status.NOT_FOUND, MIME_PLAINTEXT,                 "The requested resource does not exist");     } } 

我在 APP 类里实现了获取 Post 发送过来的是起飞还是降落commandName,但是我在MainActivity根本不知道myApp这个对象在哪里了,startButtononClick执行后,myApp被创建了,但是之后去了哪里?我又能在哪里再次操作它呢。。。

我怎么才能在获取到起飞的 Post 请求后,调用起飞按钮呢?

请教一下我应该去补充什么知识呢?感谢了!

excel 公式作为算法程序,可行吗?

Posted: 16 Feb 2022 08:26 AM PST

有这么一个需求: 把一个巨复杂的 excel 里面的公式代码化,这个 excel 有多复杂呢,大概 10 几个 sheet ,每个 sheet 里面都有大量公式计算,一共有 50 多个输入参数,50 多个输出量,中间环节变量超过 1000 个。。。

现在要把这个 excel 代码化,工作量是蛮大的,想到一个办法:

能不能把这个 excel 当做一个计算程序,参数丢给 execl 输入数据的相应位置,立马就能出计算结果,去相应位置获取结果即可,省去了编码。

这个需求 python 或其他语言下 有可以实现的库吗 或者有其他更好的解决方案吗?

上班静不下心来,只想刷 leetcode

Posted: 16 Feb 2022 08:01 AM PST

RT ,坐不住

单体应用改造微服务疑惑求解

Posted: 16 Feb 2022 07:11 AM PST

长期以来公司架构是基于 Spring 的单体应用,经过这么多年的发展,在企业应用开发层面沉淀颇多,对于新需求也能快速响应。但是由于目前公司业务多元化,单体应用的瓶颈就上来了,比如某个业务需要独立迭代,SAAS 改造的提出等,所以计划将单体升级改造为微服务架构。

目前经过调研,整体升级代价不大,因为虽然是单体应用,但是依然使用多模块开发,各应用天然解耦。但是目前遇到几个比较麻烦的问题,看看有做过相同事情的 hxd 有没有解决方案。

  • 基于 Spring 容器的扩展机制

为了降低模块之间的耦合度,系统中大量利用了 Spring 的一些特性,比如 getBeansOfType(),这种模式下,只需要在 A 模块定义好接口,在 B 和 C 模块定义好实现,即可在不同的业务场景下调用不同的实现。这种方式在同一个 Spring 上下中可以轻易获取实现类,但是微服务后就是多个上下文环境,就无法获取到这些实现类了。 伪代码如下:

模块 A:

 public interface MessageSender {     /**      * 发送者唯一标识      */     String key();     /**      * 发送消息      */     void send(List<Message> messages); 	 }  @Controller public class MessageController {      private ApplicationContext ac;      public void sendMessage(String key){         List<MessageSender> messageSenders = ac.getBeansOfType(MessageSender.class);         for(MessageSender sender: messageSenders){             // 获取对应的实例             if(Objects.equals(sender.getKey(), key)){             	// 推送消息                 sender.send(...);                 break;              }         }     }  }  

模块 B

@Component public class EmailMessageSender implements MessageSender {     /**      * 发送者唯一标识      */     String key(){     	return "email":     }     /**      * 发送消息      */     void send(List<Message> messages){        // 发送邮件     } 	 }  

模块 C

@Component public class SMSMessageSender implements MessageSender {     /**      * 发送者唯一标识      */     String key(){     	return "sms":     }     /**      * 发送消息      */     void send(List<Message> messages){        // 发送短信     } 	 }  
  • 事件机制

利用 Spring 的ApplicationEventPublisher实现事件推送,目前了解到可以通过对接Spring Cloud Bus实现跨服务事件推送。现在在我们应用中有同步事件和异步事件,异步事件使用@Async实现,目前没有了解到Spring Cloud Bus是否支持同步事件?

模块 A

public class MessageService{        ApplicationEventPublisher publisher;      public void sendMessage(){         publisher.publishEvent(event);     } } 

模块 B

// 模块 B 监听程序 public class EventListener{      @EventListener     public void onEvent(){     	// 同步监听     }          @Async     @EventListener     public void onEvent(){     	// 异步监听     } }   

Pyqt5 M1 python3.9 安装问题

Posted: 16 Feb 2022 05:59 AM PST

请教一下诸位大佬,mac m1 上 pip 安装 pyqt5 装不了吗

天敌——产品

Posted: 16 Feb 2022 05:18 AM PST

1.大伙觉得怎么样子的产品经理是优秀的
2.该怎么去变成一个优秀的产品经理

PHP 大神? GO 大神?

Posted: 16 Feb 2022 04:38 AM PST

以为是什么高大上的理由转 go ,点开一看就是什么大厂秘籍啥的。恶心心 HWIorQ.png

关于 Nginx 处理请求方法的猜想

Posted: 16 Feb 2022 04:30 AM PST

Nginx 处理 http 请求时,rewrite 模块可以获取到客户端请求方法,照官方文档,if 模块可以在 server 指令块或者 location 指令块中。

猜想:比如为某个只有 GET 方法的后端接口配置一个 if 模块过滤时,非 GET 方法,直接 return 状态码加报错信息,和不过滤,直接放这个请求到具体的 location 块,让后端去处理。前面这个会不会性能更好点,请大佬不吝赐教。。。

  if ($request_method = GET){     return 203 "method:$request_method 方法不合规\n";     break;   }  

mysql 批量更新有哪些常用的?

Posted: 16 Feb 2022 03:43 AM PST

update table set status = case `id` when 1 then 0 when 2 then 0 when 3 then 0 when 4 then 0 when 5 then 0 end where id in ('1','2','3','4','5'); 

除了这样的批量更新语句还有什么高效的批量更新方式?

ES 暴露公网如何保证安全

Posted: 16 Feb 2022 03:41 AM PST

RT 。

有一个场景,需要将 ES 集群暴露公网。
例如部署于杭州的阿里云 Java 服务,访问部署于上海的腾讯云机器的 ES 集群。
第一层是常用的用户名+密码。
第二层感觉可以设置定向白名单。

有没有相关经验的小伙伴,是否有更好的方法或者目前的解法有无问题。


Thanks.

No comments:

Post a Comment