Python Anaconda + VS Code 多环境配置

最近开始折腾 py,记录下 Anaconda + VS Code 的开发环境配置。用 Anaconda 主要因为虚拟环境管理,可以方便地切换多个环境与 py 版本。安装 Anaconda 后会推荐安装 VSC,这样应该是会自动配置的。不过我已经提前装了,只好手动来了。

由于法律问题,清华与中科大均关闭了 Cond[……]

>> 接着看呗

创业一年后的我

不知道从什么时候,大学生创业渐渐从褒义词变成了中性词,并逐步变为贬义词。「创业」似乎成为了 幼稚、冲动、逃避 的代名词,更是被人当做 大学生思维 的典型代表。所以我不太喜欢把自己称为创业者,我既没有那个能力与人脉创立一个公司,也没有放弃学业一股脑钻进去,相比之下,我更喜欢使用「尝试」「锻炼」之类的词汇。但这是否就代表玩玩而已,不需要负很大责任?其实恰恰相反。

今天看了韩寒的《飞驰人生》,不自觉的[……]

>> 接着看呗

舔狗,一无所有

最近不知道怎么的,舔狗这个词突然火了起来。

形容在感情生活中明知道对方不喜欢自己或无感 ,还一再无底线地讨好对方。

这是百科中的释义,简洁明了,令人心碎。从一开始的爱情中,发展到了友情甚至上司关系中。不禁再次想起曾经的往事,详见:「在哪一刻你觉得你和朋友再也做不成朋友了?」

感动自己无异于掩耳盗铃

这是很多舔狗最常见的错误。我们捂着耳朵听不见铃铛便以为别人也听不见;我们不断感动着自[……]

>> 接着看呗

上拉下拉电阻是何物

最近学校做硬件课程设计,又把之前玩玩的 Arduino 搬出来了。有一个一直没搞清楚的问题,为什么按钮通常需要接一个上拉或者下来电阻,否则很容易「失控」。这次认真研究了一下总算搞明白了。

什么是下拉电阻

如图,我们想实现一个很简单的功能,即通过判断1号口的电压来判断按钮(开关)是否接通。当接通时电压为 5v,否则电压为 0v。但是我们在接入到1号口的一段接了一个电阻并接地,这个电阻就叫下拉电阻

下拉电阻的作用是:在确保断路电压为0的情况下避免短路。

如果不接地

看起来也许并没有什么问题。但前提是你认为暴露在空气中电压为0,然而事实不是这样的。如图,开关断开的情况下1号口相当于直接暴露在空中,叫做浮空状态。浮空状态的要尽量避免的,因为它的电压不是0而是未知。由于
空中有错综复杂的电磁波,以及其他各种各样的原因,1号口会收到一串噪声信号,电压像波浪一样持续变化。这样我们就很难准确判断开关的按下。

[……]

>> 接着看呗

NAT 科普与类型提升

起因是朋友买了一个迅雷玩客云,但是提示 NAT 类型有问题,导致诸多功能不好用。折腾一番后也进一步搜索了相关资料,深入了解一下。本文旨在用最通俗的语言解释清楚相关问题,在专业性方面可能有缺失。

使用 PS3/Xbox 朋友遇到无法联机或 NAT 类型显示为严格也是类似原因。

什么是 NAT

首先我们得先理解 NAT 的概念。它全称是 Network Address Translation 即网络地址转换。使用 NAT 的原因很多,主要是 IPv4 地址资源枯竭,以及为了网络安全(也便于监管)。我们知道每一个能够上网的设备必然有一个 IP 地址,但是并不是所有设备都拥有「公网IP」。而 NAT 就是把内网 IP 映射成公网 IP,从而使设备可以访问互联网。

这里说 公网IP 并不规范。现在很多运营商已经不分配公网 IP 了。

听起来很高端的技术其实就在我们身边。一般常规的家庭网络拓扑是这样的:

入户光纤 → 猫 → 路由器 → 终端设备

运营商只给我们分配了一个 IP 地址,这个 IP 理所应当被路由器占用着。而我们许多终端设备拿到的是路由器分配的内网地址,一般类似 192.168.x.x。显然这个内网地址是无法和互联网通讯的。因此我们需要 NAT 来建立内网 IP 与 公网 IP 的映射,这样当终端设备访问互联网,将数据交给路由器,然后路由器转交给服务器;服务器返回的数据交给路由器,路由器再根据映射传给终端就OK了。这个过程是 NAT。

什么是 UPnP

UPnP 是通用即插即用协议,英文 Universal Plug and Play。在这里,其目的是更加方便地穿透 NAT。可以理解为有了 UPnP 软件可以根据需求让路由器进行动态地进行端口映射。而不是你去路由器后台一个个手动设置。

下面是我的 UPnP 列表:

可以看到根据请求,路由器自动地把 WAN 10960 端口映射到了 192.168.50.120:10960 上,其实这个是我们家的摄像头,这样就可以从外面直接看到画面了。

[……]

>> 接着看呗

让你手Q变清爽

我一直使用 QQ Play 版(不是国际版)!就是从 Google Play 下载的 QQ,相比于国内标准版清爽不少同时常用的功能也一应俱全。但是今天 Play 版更新了,应该算是大更新。UI 跟上了国内标准版的节奏,同时又新增了大量的无(la)关(ji)内容,令人作呕。

不过还算腾讯有点底线,大部分东西都提供了关闭选项,只是这些选项分散各处,说白了就是不想让你关。现在整理一下,方便各位关闭。[……]

>> 接着看呗

Galaxy Watch 微信回复(通知栏回复)

先来看看效果图

手表端

手机端

先说说原理吧

警告:要求手机必须是 Android 且大于等于6.0,一些通知栏魔改严重的系统可能无法使用,例如 MIUI、VIVO。无需ROOT。

希望大家好好看看,只有知道了原理才能自行解决一些小错误,更能避免问出一些无脑问题节约大家时间。

首先用到了一个叫 Nevolution 的应用(简称nevo)。

nevo 中文名叫做 女娲石·通知进化,是一个开[……]

>> 接着看呗

用cocos2d-js制作WearOS表盘

这只是一次实验

众所周知,cocos2d 属于游戏引擎,本身就不适合运行在手表,而直接把他当做表盘当然就更不合适了。这里只是一个突发奇想,借助 cocos 强大的渲染与跨平台特性,看看能否做出一款表盘。

要做到这一步需要解决两个问题:

  1. 将 cocos 编译到 Android.
  2. 将容器由 Activity 转到表盘。

倒弄了一天,仅仅是成功运行起来了,还有许许多多的问题需要解决,例如效率问题、内存释放问题等等。

当前环境:

  • Win10
  • Cocos2d-js 3.17
  • Android Studio 3.2
  • Wear OS 2.x

完成本项目需要了解 Android 开发知识,最好还了解 WearOS 表盘开发。

编译到 Android

其实是这一步就足够再写一篇文章了,有许多隐藏的坑,牵扯到 Android NDK, JNI 等许多知识。不过这并不是本文的重点,简单写一下。

为了不影响 Cocos2d 自带的 demo,我们要编译出 .so 库文件,然后新建一个工程引用。

打开 Android Studio,点击 File - Open,选择 cocos 项目根目录下 frameworks/runtime-src/proj.android 即可打开自带的 Android 工程。注意,默认情况下只编译 armeabi-v7a 的库,这个只能用于手机而不能用于模拟器。为了调试方便我们要他把 x86 也给编译了。修改 proj.android/gradle.properties 文件,找到 PROP_APP_ABI 新增一个 x86 格式:

# List of CPU Archtexture to build that application with
# Available architextures (armeabi-v7a | arm64-v8a | x86)
# To build for multiple architexture, use the `:` between them
# Example - PROP_APP_ABI=armeabi-v7a:arm64-v8a:x86
PROP_APP_ABI=armeabi-v7a:x86

点击 Build - Rebuild project 就开始编译啦~ 编译很慢,十几分钟吧。

编译成功后可以在 proj.android/app/build/intermediates/ndkBuild/debug/obj/local 下找到各个平台的 so 文件。与此同时也可以在 intermediates/assets/debug 下找到后边需要的 js 文件。

[……]

>> 接着看呗

三星手表(tizen)运行cocos2d-js

智能手表的沙场

提到智能手表,除去一些轻智能设备,苹果的 Apple Watch,谷歌的 Wear OS,三星的 Tizen 基本上垄断了这个市场。苹果依赖于封闭的体系,手表生态自然无需担心。Wear OS 依赖于 Android,开发一个手表应用也很简单。但是三星就很烦人了。Tizen 对大多数开发者来说很陌生,它基于 Linux 的开源操作系统。虽然早在2012年发布,却每况愈下,目前除了三星手表应该几乎没有 tizen 的设备了。

Tizen 其实很不完善,尤其在手表上。他甚至没有一套自己的 UI 系统,只是使用了一些开源的库。更别提什么 Material Design 这种现代化的东西了。Tizen 使用 c++ 开发,UI 要靠代码写。只是官方的 Demo 就看的云里雾里,更别提写出一套程序了。
[……]

>> 接着看呗