Thursday, May 6, 2021

V2EX - 技术

V2EX - 技术

V2EX - 技术


发现 redis 被入侵了

Posted: 06 May 2021 04:22 AM PDT

今天突然系统不能用了,内网环境,redis 没有设置密码。

查看 redis 日志:READONLY You can't write against a read only 。

奇怪的是只是跑了一个 redis 用来做缓存,并没有设置集群,进入 redis-cli 中发现,多了一个 key=backdoor,基本确认被入侵了。

https://i.imgur.com/VoR3GOq.png

还好影响不大,加了个密码重启了,分享一下。

请教各位: 苹果 testflight 审核被拒: 不能从对象存储 CDN 得到数据来加载页面.

Posted: 06 May 2021 04:17 AM PDT

请教各位帅锅: 我的苹果 testflight 审核被拒,违反"Guideline 2.1 - Performance - App Completeness"条款:

出错: 不能从对象存储 CDN 得到数据来加载页面.
现象: 打开 APP 登录成功后显示空白页面.

APP 数据来源:
1. 数据是存在猫云的对象存储上的, 外面套了个 CDN: 通过 http 网址(没有开 https)直接下载文件(URLSession.shared.downloadTask)
2. APP 服务器也没有开启 ipv6

我的问题:
1. APP 在苹果审核时既然可以登录, 说明访问 APP 服务器是正常的, 那么为什么就不能从对象存储的 CDN 中获取数据?
2. 不能从存储的 CDN 中获取数据是因为对象存储对应的网址没有开启 https 呢, 还是 app 服务器没开启 ipv6 问题?
3. 有没有其他原因导致苹果审核时不能从国内的 CDN/对象存储中获取数据?
4. 有没有方法能解决上述问题?


小妹第一次提交审核, 很多都不懂, 请各位指教,谢谢.

求助各位大神,有没有类似的工具

Posted: 06 May 2021 04:14 AM PDT

事情是这样的,每次运营人员都要问我要数据,这些数据都是一些报表一样的东西,其实 SQL 都写好了,但是这些数据他们每周,每月可能都要拉一下。每次帮他们查就很烦!特别是在 coding 的时候!所以想要一个工具,能够让我把 sql 配置进去,里面参数可以让运营在页面上通过输入框或者选择框自己填,然后展示这些数据。

需求如下 1.能把 SQL 配置进去,然后展示出来表格,里面有部分参数可以自己定义。比如 select * from tb_test where name like XXX and birthday between YYY AND ZZZ ,其中 XYZ 要能自己定义的那种。 2.能支持导出 EXCEL 3.免费安全

说白了就是一个强化版,友好版的 NAVICAT 。但是给运营 SQL 他们会砍死我啊,需要这样的工具来包装一下就好。

谢谢各位大佬了。

两个字符串比较的问题 Python

Posted: 06 May 2021 04:13 AM PDT

xdm,遇到一个问题。

背景:

需要比较两个字符串是否相等, 无视中英文标点符号

问题:

通过replace等格式转换之后, 比较两个字符串

d = "进
出口中心" s = "进出口中心"  print(d == s)  

但是两个看起来一样的字符串不相等, 第一个中间出现了特殊字符

如何把这种特殊符号处理掉,然后按相同去判断?

git,如何操作,使得 push 给远程的为魔改后的代码

Posted: 06 May 2021 04:08 AM PDT

比方说,一个项目 ~/my-project ,有三个代码库:

  • 本地仓库 ~/my-project/.git

  • 个人 GIT 服务器 git remote add my-server ssh://user@my-server:/home/my-project

  • 公司 /甲方 服务器 git remote add company-server ssh://user@company-server:/home/my-project

要保持本地仓库与个人 GIT 服务器上的代码一致,但提交给与公司 /甲方服务器上的代码为魔改后的代码

目前是,本地代码 push 到公司服务器之前,运行一个脚本,对代码进行一些魔改(比如替换某些变量名),同样的,从公司服务器 poll/fetch 下来代码后,再运行另一个脚本进行反向操作,去掉代码的魔改(把变量名恢复),然后本地编写代码,下次再 push 时,再次魔改,周而复始。

然而如此操作的话,会有诸多不便,比方说,当 git diff 比较本地代码与公司服务器远程代码时,比较的是未魔改的代码与魔改后的代码,会提示大量无用信息。

有无方便的操作方式?

C/C++ 构建系统,我用 xmake

Posted: 06 May 2021 04:05 AM PDT

XMake 是什么

XMake 是一个基于 Lua 的 现代化 C/C++ 构建系统。

它的语法简洁易上手,对新手友好,即使完全不会 lua 也能够快速入门,并且完全无任何依赖,轻量,跨平台。

同时,它也是一个自满足的构建系统,拥有强大的包管理系统,快速的构建引擎。

相比 Ninja/Scons/Make 作为 Build backend,CMake/Meson 作为 Project Generator,那么 XMake 就是这两者外加一个包管理。

xmake = Build backend + Project Generator + Package Manager 

因此,只需要安装一个不到 3M 的 XMake 安装包,你就可以不用再安装其他各种工具,甚至连 make 都不需要安装,也不需要安装 Python 、Java 等重量级的运行时环境,就可以开始您的 C/C++ 开发之旅。

也许,有人会说,编译器总需要安装的吧。这也不是必须的,因为 XMake 的包管理也支持自动远程拉取需要的各种编译工具链,比如:llvm, Mingw, Android NDK 或者交叉编译工具链。

为什么要做 XMake

每当在 Reddit 社区跟别人讨论起 XMake,大家总是会拿下面这张图来吐槽。

尽管有些无奈,也被吐槽的有些麻木了,不过我还是想说明下,做 XMake 的初衷,并不是为了分裂 C/C++ 生态,相反,XMake 尽可能地复用了现有生态。

同时也让用户在开发 C/C++ 项目的时候,拥有与其他语言一样的良好体验,比如:Rust/Cargo,Nodejs/Npm, Dlang/Dub,不再为到处找第三包,研究如何移植编译而折腾。

因此,如果您还不了解 XMake,请不要过早下定论,可以先尝试使用下,或者花点时间看完下文的详细介绍。

XMake 的特性和优势

经常有人问我 XMake 有什么特别之处,相比现有 CMake 、Meson 此类构建工具有什么优势,我为什么要使用 XMake 而不是 CMake ?

先说特点和优势,XMake 有以下几点:

  • 简洁易学的配置语法,非 DSL
  • 强大的包管理,支持语义版本,工具链管理
  • 足够轻量,无依赖
  • 极速编译,构建速度和 Ninja 一样快
  • 简单方便的多平台、工具链切换
  • 完善的插件系统
  • 灵活的构建规则

至于 CMake,毕竟已成事实上的标准,生态完善,功能强大。

我从没想过让 XMake 去替代它,也替代不了,完全不是一个量级的,但是 CMake 也有许多为人所诟病的短板,比如:语法复杂难懂,包管理支持不完善等等。

因此使用 XMake 可以作为一种补充,对于那些想要简单快速入门 C/C++ 开发的新手,或者想要更加方便易用的包管理,或者想临时快速写一些短小的测试项目。

XMake 都可以帮他们提升开发效率,让其更加关注 C/C++ 项目本身,而不是花更多的时间在构建工具和开发环境上。

下面,我来具体介绍 XMake 的这些主要特性。

语法简洁易上手

CMake 自己设计一门 DSL 语言用来做项目配置,这对用户来讲提高了学习成本,而且它的语法可读性不是很直观,很容易写出过于复杂的配置脚本,也提高了维护成本。

而 XMake 复用现有知名的 Lua 语言作为基础,并且其上提供了更加简单直接的配置语法。

Lua 本身就是一门简单轻量的胶水语言,关键字和内置类型就那么几种,看个一篇文章,就能基本入门了,并且相比 DSL,能够从网上更方便的获取到大量相关资料和教程。

基础语法

不过,还是有人会吐槽:那不是还得学习 Lua 么?

其实也不用,XMake 采用了 描述域脚本域 分离的方式,使得初学者用户在 80% 的情况下,只需要在描述域以更简单直接的方式来配置,完全可以不把它当成 Lua 脚本,例如:

target("test")     set_kind("binary")     add_files("src/*.c")     add_files("test/*.c", "example/**.cpp") 

如果因为,看着有括号,还是像脚本语言的函数调用,那我们也可以这么写(是否带括号看个人喜好,不过我个人还是建议使用上面的方式)

target "test"     set_kind "binary"     add_files "src/*.c"     add_files "test/*.c"     add_files "example/**.cpp" 

我们只需要知道常用配置接口,即使不完全不会 Lua 也能快速配置了。

我们可以对比下 CMake 的配置:

add_executable(test "") file(GLOB SRC_FILES "src/*.c") file(GLOB TEST_FILES "test/*.c") file(GLOB_RECURSE EXAMPLE_FILES "example/*.cpp") target_sources(test PRIVATE     ${SRC_FILES}     ${TEST_FILES}     ${EXAMPLE_FILES} ) 

哪个更直观可读,一目了然。

条件配置

如果,你已经初步了解了一些 Lua 等基础知识,比如 if then 等条件判断,那么可以进一步做一些条件配置。

target("test")     set_kind("binary")     add_files("src/main.c")     if is_plat("macosx", "linux") then         add_defines("TEST1", "TEST2")     end     if is_plat("windows") and is_mode("release") then         add_cxflags("-Ox", "-fp:fast")     end 

继续对比下 CMake 版本配置:

add_executable(test "") if (APPLE OR LINUX)     target_compile_definitions(test PRIVATE TEST1 TEST2) endif() if (WIN32)     target_compile_options(test PRIVATE $<$<CONFIG:Release>:-Ox -fp:fast>) endif() target_sources(test PRIVATE     src/main.c ) 

复杂脚本

如果你已经晋升为 XMake 的高端玩家,Lua 语法了然于胸,想要更加灵活的定制化配置需要,并且描述域的几行简单配置已经满足不了你的需求。

那么 XMake 也提供了更加完整的 Lua 脚本定制化能力,你可以写任何复杂的脚本。

比如在构建之前,对所有源文件进行一些预处理,在构建之后,执行外部 gradle 命令进行后期打包,甚至我们还可以重写内部链接规则,实现深度定制编译,我们可以通过import 接口,导入内置的 linker 扩展模块,实现复杂灵活的链接过程。

target("test")     set_kind("binary")     add_files("src/*.c")     before_build_file(function (target, sourcefile)         io.replace(sourcefile, "#define HAVE_XXX 1", "#define HAVE_XXX 0")     end)     on_link(function (target)         import("core.tool.linker")         linker.link("binary", "cc", target:objectfiles(), target:targetfile(), {target = target})     end)     after_build(function (target)         if is_plat("android" then             os.cd("android/app")             os.exec("./gradlew app:assembleDebug")         end     end) 

如果换成 CMake,也可以 add_custom_command 里面实现,不过里面似乎只能简单的执行一些批处理命令,没法做各种复杂的逻辑判断,模块加载,自定义配置脚本等等。

当然,使用 cmake 肯定也能实现上面描述的功能,但绝对不会那么简单。

如果有熟悉 cmake 的人,也可以尝试帮忙完成下面的配置:

add_executable(test "") file(GLOB SRC_FILES "src/*.c") add_custom_command(TARGET test PRE_BUILD     -- TODO     COMMAND echo hello ) add_custom_command(TARGET test POST_BUILD     COMMAND cd android/app     COMMAND ./gradlew app:assembleDebug ) -- How can we override link stage? target_sources(test PRIVATE     ${SRC_FILES} ) 

强大的包管理

众所周知,做 C/C++ 相关项目开发,最头大的就是各种依赖包的集成,由于没有像 Rust/Cargo 那样完善的包管理系统。

因此,我们每次想使用一个第三方库,都需要各种找,研究各种平台的移植编译,还经常遇到各种编译问题,极大耽误了开发者时间,无法集中精力去投入到实际的项目开发中去。

好不容易当前平台搞定了,换到其他平台,有需要重新折腾一遍依赖包,为了解决这个问题,出现了一些第三方的包管理器,比如 vcpkg/conan/conda 等等,但有些不支持语义版本,有些支持的平台有限,但不管怎样,总算是为解决 C/C++ 库的依赖管理迈进了很大一步。

但是,光有包管理器,C/C++ 项目中使用它们还是比较麻烦,因为还需要对应构建工具能够很好的对其进行集成支持才行。

CMake 和 Vcpkg

我们先来看下 CMake 和 Vcpkg 的集成支持:

cmake_minimum_required(VERSION 3.0) project(test) find_package(unofficial-sqlite3 CONFIG REQUIRED) add_executable(main main.cpp) target_link_libraries(main PRIVATE unofficial::sqlite3::sqlite3) 

缺点:

  • 还需要额外配置 -DCMAKE_TOOLCHAIN_FILE=<vcpkg_dir>/scripts/buildsystems/vcpkg.cmake"
  • 不支持自动安装依赖包,还需要用户手动执行 vcpkg install xxx 命令安装
  • vcpkg 的语义版本选择不支持 (据说新版本开始支持了)

CMake 和 Conan

```cmake cmake_minimum_required(VERSION 2.8.12) project(Hello)  add_definitions("-std=c++11")  include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) conan_basic_setup()  add_executable(hello hello.cpp) target_link_libraries(hello gtest) 

conanfile.txt

[requires] gtest/1.10.0  [generators] cmake 

缺点:

  • 同样,还是需要额外调用 conan install .. 来安装包
  • 还需要额外配置一个 conanfile.txt 文件去描述包依赖规则

Meson 和 Vcpkg

我没找到如何在 Meson 中去使用 vcpkg 包,仅仅找到一篇相关的 Issue #3500 讨论。

Meson 和 Conan

Meson 似乎还没有对 Conan 进行支持,但是 Conan 官方文档上有解决方案,对齐进行支持,但是很复杂,我是没看会,大家可以自行研究:https://docs.conan.io/en/latest/reference/build_helpers/meson.html

XMake 和 Vcpkg

前面讲了这么多,其他构建工具和包管理的集成,个人感觉用起来很麻烦,而且不同的包管理器,集成方式差别很大,用户想要快速从 Vcpkg 切换到 Conan 包,改动量非常大。

接下来,我们来看看 XMake 中集成使用 Vcpkg 提供的包:

add_requires("vcpkg::zlib", {alias = "zlib"}) target("test")     set_kind("binary")     add_files("src/*.c")     add_packages("zlib") 

我们只需要通过 add_requires 配置上对应的包名,以及 vcpkg:: 包命名空间,就能直接集成使用 vcpkg 提供的 zlib 包。

然后,我们只需要执行 xmake 命令,既可完成整个编译过程,包括 zlib 包的自动安装,无需额外手动执行 vcpkg install zlib

$ xmake note: try installing these packages (pass -y to skip confirm)? -> vcpkg::zlib please input: y (y/n)  => install vcpkg::zlib .. ok [ 25%]: compiling.release src\main.cpp [ 50%]: linking.release test [100%]: build ok! 

XMake 和 Conan

接下来是集成 Conan 的包,完全一样的方式,仅仅执行换个包管理器名字。

add_requires("conan::zlib", {alias = "zlib"}) target("test")     set_kind("binary")     add_files("src/*.c")     add_packages("zlib") 

XMake 同样会自动安装 conan 中的 zlib 包,然后自动集成编译。

XMake 自建包管理

XMake 跟 CMake 还有其他构建系统,最大的不同点,也就是最大的优势之一,就是它有完全自建的包管理系统,我们完全可以不依赖 vcpkg/conan,也可以快速集成依赖包,比如:

add_requires("zlib 1.2.x", "tbox >= 1.6.0") target("test")     set_kind("binary")     add_files("src/*.c")     add_packages("zlib", "tbox") 

而且,它还支持完整的语义版本选择,多平台的包集成,交叉编译工具链的包集成,甚至编译工具链包的自动拉取使用。

不仅如此,我们开可以对定制化配置对自建包的依赖,例如:

使用调式版本依赖包

我们可以使用 debug 版本库,实现对依赖库的断点调试。

add_requires("zlib", {debug = true}) 
设置 msvc 运行时库
add_requires("zlib", {configs = {vs_runtime = "MD"}}) 
使用动态库

默认集成的是静态库,我们也可以切换到动态库。

add_requires("zlib", {configs = {shared = true}}) 
语义版本支持

XMake 的自建包集成支持完整的版本语义规范。

add_requires("zlib 1.2.x") add_requires("zlib >=1.2.10") add_requires("zlib ~1.2.0") 
禁止使用系统库

默认情况下,如果版本匹配,XMake 会优先查找使用系统上用户已经安装的库,当然我们也可以强制禁止查找使用系统库,仅仅从自建包仓库中下载安装包。

add_requires("zlib", {system = true}) 
可选依赖包

如果依赖包集成失败,XMake 会自动报错,中断编译,提示用户:zlib not found,但是我们也可以设置为可选包集成,这样的话,即使库最终没安装成功,也不影响项目的编译,仅仅只是跳过这个依赖。

add_requires("zlib", {optional = true}) 
包的定制化配置

比如,集成使用开启了 context/coroutine 模块配置的 boost 库。

add_requires("boost", {configs = {context = true, coroutine = true}}) 

支持的包管理仓库

XMake 除了支持 vcpkg/conan 还有自建仓库的包集成支持,还支持其他的包管理仓库,例如:Conda/Homebrew/Apt/Pacman/Clib/Dub 等等,而且集成方式完全一致。

用户可与快速切换使用其他的仓库包,而不需要花太多时间去研究如何集成它们。

因此,XMake 并没有破坏 C/C++ 生态,而是极大的复用现有 C/C++ 生态的基础上,努力改进用户对 C/C++ 依赖包的使用体验,提高开发效率,让用户能够拥有更多的时间去关注项目本身。

  • 官方自建仓库 xmake-repo (tbox >1.6.1)
  • 官方包管理器 Xrepo
  • 用户自建仓库
  • Conan (conan::openssl/1.1.1g)
  • Conda (conda::libpng 1.3.67)
  • Vcpkg (vcpkg:ffmpeg)
  • Homebrew/Linuxbrew (brew::pcre2/libpcre2-8)
  • Pacman on archlinux/msys2 (pacman::libcurl)
  • Apt on ubuntu/debian (apt::zlib1g-dev)
  • Clib (clib::clibs/bytes@0.0.4)
  • Dub (dub::log 0.4.3)

独立的包管理命令( Xrepo )

为了方便 XMake 的自建仓库中的包管理,以及第三方包的管理使用,我们也提供了独立的 Xrepo cli 命令工具,来方便的管理我们的依赖包

我们可以使用这个工具,快速方便的完成下面的管理操作:

  • 安装包:xrepo install zlib
  • 卸载包:xrepo remove zlib
  • 获取包信息:xrepo info zlib
  • 获取包编译链接 flags:xrepo fetch zlib
  • 加载包虚拟 Shell 环境:xrepo env shell (这是一个很强大的特性)

我们可以到 Xrepo 项目主页 查看更多的介绍和使用方式。

轻量无依赖

使用 Meson/Scons 需要先安装 python/pip,使用 Bazel 需要先安装 java 等运行时环境,而 XMake 不需要额外安装任何依赖库和环境,自身安装包仅仅 2-3M,非常的轻量。

尽管 XMake 是基于 lua,但是借助于 lua 胶水语言的轻量级特性,xmake 已将其完全内置,因此安装完 XMake 等同于拥有了一个完整的 lua vm 。

有人会说,编译工具链总还是需要的吧,也不完全是,Windows 上,我们提供了预编译安装包,可以直接下载安装编译,地址见:Releases

另外,XMake 还支持远程拉取编译工具链,因此即使你的系统环境,还没有安装任何编译器,也没关系,用户完全不用考虑如何折腾编译环境,只需要在 xmake.lua 里面配置上需要的工具链即可。

比如,我们在 Windows 上使用 mingw-w64 工具链来编译 C/C++ 工程,只需要做如下配置即可。

add_requires("mingw-w64") target("test")     set_kind("binary")     add_files("src/*.c")     set_toolchains("mingw@mingw-w64") 

通过 set_toolchains 配置绑定 mingw-w64 工具链包后,XMake 就会自动检测当前系统是否存在 mingw-64,如果还没安装,它会自动下载安装,然后完成项目编译,整个过程,用户仅仅只需要执行 xmake 这个命令就能完成。

$ xmake note: try installing these packages (pass -y to skip confirm)? in xmake-repo: -> mingw-w64 8.1.0 [vs_runtime:MT] please input: y (y/n)  => download https://jaist.dl.sourceforge.net/project/mingw-w64/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/8.1.0/threads-posix/seh/x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z .. ok checking for mingw directory ... C:\Users\ruki\AppData\Local\.xmake\packages\m\mingw-w64\8.1.0\aad6257977e0449595004d7441358fc5 [ 25%]: compiling.release src\main.cpp [ 50%]: linking.release test.exe [100%]: build ok! 

除了 mingw-w64,我们还可以配置远程拉取使用其他的工具链,甚至交叉编译工具链,例如:llvm-mingw, llvm, tinycc, muslcc, gnu-rm, zig 等等。

如果大家还想进一步了解远程工具链的拉取集成,可以看下文档:自动拉取远程工具链

极速并行编译

大家都知道 Ninja 构建非常快,因此很多人都喜欢用 CMake/Meson 生成 build.ninja 后,使用 Ninja 来满足极速构建的需求。

尽管 Ninja 很快,但是我们还是需要先通过 meson.build 和 CMakelist.txt 文件生成 build.ninja 才行,这个生成过程也会占用几秒甚至十几秒的时间。

而 XMake 不仅仅拥有和 Ninja 近乎相同的构建速度,而且不需要额外再生成其他构建文件,直接内置构建系统,任何情况下,只需要一个 xmake 命令就可以实现极速编译。

我们也做过一些对比测试数据,供大家参考:

多任务并行编译测试

构建系统 Termux (8core/-j12) 构建系统 MacOS (8core/-j12)
xmake 24.890s xmake 12.264s
ninja 25.682s ninja 11.327s
cmake(gen+make) 5.416s+28.473s cmake(gen+make) 1.203s+14.030s
cmake(gen+ninja) 4.458s+24.842s cmake(gen+ninja) 0.988s+11.644s

单任务编译测试

构建系统 Termux (-j1) 构建系统 MacOS (-j1)
xmake 1m57.707s xmake 39.937s
ninja 1m52.845s ninja 38.995s
cmake(gen+make) 5.416s+2m10.539s cmake(gen+make) 1.203s+41.737s
cmake(gen+ninja) 4.458s+1m54.868s cmake(gen+ninja) 0.988s+38.022s

傻瓜式多平台编译

XMake 的另外一个特点,就是高效简单的多平台编译,不管你是编译 windows/linux/macOS 下的程序,还是编译 iphoneos/android 又或者是交叉编译。

编译的配置方式大同小异,不必让用户去这折腾研究各个平台下如何去编译。

编译本机 Windows/Linux/MacOS 程序

当前本机程序编译,我们仅仅只需要执行:

$ xmake 

对比 CMake

$ mkdir build $ cd build $ cmake --build .. 

编译 Android 程序

$ xmake f -p android --ndk=~/android-ndk-r21e $ xmake 

对比 CMake

$ mkdir build $ cd build $ cmake -DCMAKE_TOOLCHAIN_FILE=~/android-ndk-r21e/build/cmake/android.toolchain.cmake .. $ make 

编译 iOS 程序

$ xmake f -p iphoneos $ xmake 

对比 CMake

$ mkdir build $ cd build $ wget https://raw.githubusercontent.com/leetal/ios-cmake/master/ios.toolchain.cmake $ cmake -DCMAKE_TOOLCHAIN_FILE=`pwd`/ios.toolchain.cmake .. $ make 

我没有找到很方便的方式去配置编译 ios 程序,仅仅只能从其他地方找到一个第三方的 ios 工具链去配置编译。

交叉编译

我们通常只需要设置交叉编译工具链根目录,XMake 会自动检测工具链结构,提取里面的编译器参与编译,不需要额外配置什么。

$ xmake f -p cross --sdk=~/aarch64-linux-musl-cross $ xmake 

对比 CMake

我们需要先额外写一个 cross-toolchain.cmake 的交叉工具链配置文件。

set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR aarch64)  set(TOOL_CHAIN_DIR ~/aarch64-linux-musl) set(TOOL_CHAIN_INCLUDE ${TOOL_CHAIN_DIR}/aarch64-linux-musl/include) set(TOOL_CHAIN_LIB ${TOOL_CHAIN_DIR}/aarch64-linux-musl/lib)  set(CMAKE_C_COMPILER "aarch64-linux-gcc") set(CMAKE_CXX_COMPILER "aarch64-linux-g++")  set(CMAKE_FIND_ROOT_PATH ${TOOL_CHAIN_DIR}/aarch64-linux-musl)  set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)  include_directories(${TOOL_CHAIN_DIR}/aarch64-linux-musl/include) set(CMAKE_INCLUDE_PATH ${TOOL_CHAIN_INCLUDE}) set(CMAKE_LIBRARY_PATH ${TOOL_CHAIN_LIB}) 
$ mkdir build $ cd build $ cmake -DCMAKE_TOOLCHAIN_FILE=../cross-toolchain.cmake .. $ make 

结语

如果你是 C/C++ 开发的新手,可以通过 XMake 快速上手入门 C/C++ 编译构建。

如果你想开发维护跨平台 C/C++ 项目,也可以考虑使用 XMake 来维护构建,提高开发效率,让你更加专注于项目本身,不再为折腾移植依赖库而烦恼。

欢迎关注 XMake 项目:

为什么你们要选择 TypeScript?

Posted: 06 May 2021 04:02 AM PDT

我只是不明白为啥这么多人会选择 ts ?理由是啥啊? ts 出来的那年我就关注了,但所有的理由在我看来都是莫名其妙的观点,但这些年怎么还用的人越来越多了?
咱就说脑回路很神奇的把本身弱类型为优势的 JavaScript,套了一层强类型的壳的这步操作我就看不懂了,这是图啥呢?这样代码写着不难受么?那你直接用 Java 写然后编译成 JavaScript 不好么?
网上有很多人说,用 ts 可以减少因类型导致的错误。大哥,你是个程序员,你连自己写的代码是怎么跑的都不知道的话,转行好吗?我十一年的程序员了,js 写了 11 年,js 的其他高级语言我也都研究过,包括 ts,但现在只用 es6 和 coffee2,我怎么就一次都没碰到过我连变量背后的值类型导致的 bug 呢?

求一个平台能对软件开发项目进行时间和进度的把控

Posted: 06 May 2021 03:58 AM PDT

我们公司主要以业务为主,把软件开发全部外包给别的公司做。 前期公司全是搞业务的,技术这块完全不懂,我才进公司没多久,懂一些技术,但不是很懂软件开发。 现在发现有个很大的问题,他们做事没一点规范。 在收集需求分析的时候也就是安排两个人过来了解下情况,然后就回去搞原型设计了。 都不提供规划文档的,没有思维导图,服务器建设方案,也没有给出具体的时间点。 做出来的东西我们觉得不好,要他们改,他们还得给我们再算工时!

一个挺简单的东西,从 1.0 搞到现在 2.6 了,还是感觉特别粗糙,包括 UI 部分还有逻辑这块都很水。

目前我在网上找了一些资料,定了一个开发流程出来: 1,新建一个项目(这个项目是做什么的,简单的流程,大概的完工时间,预算) 2,筛选一家合适的开发公司来进行软件的开发 3,稍微详细的需求整理,输出文档( web 平台,微信公众号,小程序,数据库,前端,后端,短信推送,电话呼叫,服务器建议方案,分布式部署方案等) 4,签定合同,开始设计,制作原型,UI 我们审核 5,正式开发,部署 demo,测试,修复 BUG 6,商用

想找一个平台对够在时间和进度上对开发的项目做一个把控。 还在纠结是用 seatable 还有是简道云,也请各位推荐下合适的平台,谢谢。

从运维的角度看,一个可靠的如微信的 API 的基础架构应该怎么部署?

Posted: 06 May 2021 03:53 AM PDT

就是类似于 https://api.weixin.qq.com/xxx,

目前我们这边仅用了 nginx,upstream 做负载均衡这样...调用量大了还是有些瓶颈。

有什么可以优化或改造的地方吗?

各位买 nas 一般用来干嘛?

Posted: 06 May 2021 03:48 AM PDT

看 V 站挺多人提到 nas,很好奇一般买来干嘛。

还有一般在什么网站买?

各位开发还在本机搭环境还是用 docker?

Posted: 06 May 2021 03:18 AM PDT

原来搞 python 、java 、ruby 的时候,都在本机搭开发环境,后来有了 docker,直接把开发环境建到 docker 中,然后把源码映射到容器中去,这样各个开发环境都是隔离的,而且也提高了部署效率。

jdk 版本兼容性问题

Posted: 06 May 2021 03:03 AM PDT

请问大伙,jdk 向下兼容吗?

目前需求为需要使用 15,但老项目都是 8,有没有可能导致老项目无法运行?

MacOS 是否有其他的更好的解决方案?

有现成的批量管理 Linux 设备的方案么?

Posted: 06 May 2021 02:57 AM PDT

0 、我希望最好给每个设备都安装一个 agent,agent 里配置好去连接服务器端的 ip

1 、可以在浏览器中打开服务器端的 ip,监控这些设备的 cpu 、内存、宽带等等指标(类似 netdata )

2 、可以在浏览器中发送 shell 命令到某个设备(类似堡垒机)

3 、最好基于 C/C++之类的,因为可能移植到 qnx 之类的平台上面

求推荐 license 管理工具

Posted: 06 May 2021 02:49 AM PDT

最近公司开发的软件需要上 license 管理工具,各位有什么推荐的吗,稳定的商用工具优先,优秀的开源工具也可以

DAO 层和 ORM,能区分,但又不完全能区分,我裂开了

Posted: 06 May 2021 02:48 AM PDT

desc:是这样的,小弟从 php 转到 go 一个月时间不够,项目的目录结构需要自己搭建。于是就找网上的项目组织目录参考,发现有一部分目录结构里有 dao 层的分层概念。这个在 java 里面比较常见,在 php 中用得比较多的是 orm,不知道 go 中是不是也适合这样搞。

于是引起了我一顿梳理 dao 和 orm 之间的关系。但仍有如下疑问:

  1. 究竟项目使用了 orm 之后,还需不需要再分一层 DAO 层出来?如果要分,此时的 DAO 层里面写的是什么逻辑?求 demo 举例
  2. ORM 不是正好替代了 DAO 的角色吗?还是说 DAO 可以通过 ORM 来实现?此时 DAO 层的实现是怎么样的?在 ORM 外面包一层,意义在哪里?
  3. 在项目代码分层上(语言无关),DAO 和 ORM 分别是什么层面上的东西?

真的纠结了三四天了,每天看完都有不同的结论,求大佬们指点一下你们在项目中是怎么划分的~

如何在不知道编码规则的前提下,根据 input 和 output 的样本找出编码所用的规则?

Posted: 06 May 2021 02:46 AM PDT

原本的转换工具没有说到具体的编码格式,而且是在线的工具,所以使用很麻烦

我的想法是找到 decode 的规则,写个小程序的工具,不知道这样是否可行?

这是一个样本
194670883002 A20ZWPWV6YPW4X

打款延迟,需要提供护照?

Posted: 06 May 2021 02:43 AM PDT



还要提供护照,是诈骗吗,不过确实是苹果邮箱发过来的

自然语言处理问题 W2V

Posted: 06 May 2021 02:42 AM PDT

我看好像所有语料都是连在一起的 那么第一句的末尾词和第二句开头词也是有关系的 按道理来说不应该是有关系的,想问下有什么定论吗?

oschina 发生了什么,动弹板块怎么没了?

Posted: 06 May 2021 02:39 AM PDT

有一段时间没逛 oschina 了,今天发现动弹板块没了,发生了什么

微软 EDGE 浏览器同步问题

Posted: 06 May 2021 02:29 AM PDT

本人坐标广州电信。同步域名:edge.activity.windows.com
经测试,国内 dns ( bat,114 )解析该域名是到 20.184.57.167
用微软 dns4.2.2.1 解析到 51.105.218.222
用 1.0.0.1 解析到 52.232.226.150
20 开头的 ip 导致 edge 浏览器不能同步。

[招聘]湖南长沙新环境招人啦

Posted: 06 May 2021 02:28 AM PDT

湖南长沙新环境招人啦

1 丶 WEB 前端( vue 方向) 任职要求:统招本科学历,计算机软件专业,熟练掌握 vue,3 年左右工作经验。 薪资待遇:面议

2 丶 Java 开发 任职要求:统招本科学历,计算机软件专业,熟练掌握 spring 全家桶,3 年左右工作经验。 薪资待遇:面议

3 丶 Python 爬虫 任职要求:统招本科学历,计算机软件专业,熟练掌握 Scrapy 丶 PySpider 丶 Crawley 等爬虫框架,3 年左右工作经验。 薪资待遇:面议

还有更多职位等你来聊:高级 UI,图像算法工程师,人工智能算法工程师,大数据开发,产品经理

工作地点:长沙世茂金融中心 联系微信&电话:13170310583

如何恢复在进程一直占用某个文件的时被删除的文件,并保持正常写入?

Posted: 06 May 2021 02:12 AM PDT

场景假设:
进程 pid:1000
文件路径:/foo/bar.txt
被 1000 进程占用的文件描述符:6

当 1000 进程还占用着 /foo/bar.txt 的时候,执行 rm /foo/bar.txt -f,文件被"假删除了"(其实还在写数据),通过 losf |grep deleted|grep 1000|grep "/foo/bar.txt"可以看到被删除的文件(显示 deleted ),这时可以通过找到该进程的文件描述符文件夹里写入的文件名找到描述符,比如定位到了是 6 号文件描述符是被删除的文件的文件描述符,然后可以通过这条命令看到其实进程还在向该文件写数据:tail -F /proc/1000/fd/6 。

然后看了一些教程,直接把 fd 拷贝回被删除的文件,cp /proc/1000/fd/6 /foo/bar.txt ,但是这样的话被删除文件在被创建那一刻后就不再新写入数据了,换句话说复原的文件的数据只保留了我执行 cp /proc/1000/fd/6 /foo/bar.txt 那一刻前的 /proc/1000/fd/6 的数据,而不会写入新数据,但是查看 fd 写入情况 tail -F /proc/1000/fd/6 是正常有新数据写入的。

我的问题就是怎么能在恢复被删除的文件的同时保证新数据正常写入?也就操作后不丢数据。

关于容器中代码 debug 方案

Posted: 06 May 2021 02:09 AM PDT

目前弄了一个,我 php+swoole 的话用的 vscode 做 debug 远程,然后用 frp 映射到外网,然后容器中的 php 使用 yasd 远程链接 frp 外网地址,通过 vscode 调试,主要还是因为 k8s 有自己的内网。

不知道各位大佬有没有其他好用的方案

在一个请求执行过程中,多次调用同一个接口,大家都是怎么处理的?

Posted: 06 May 2021 02:00 AM PDT

比如 A 调 B 调 C 调 D,每次调用只传递 orderId,然后 BCD 内部需要根据 orderId 获取其他信息,这会导致多次重复调用。
(之所以只传 orderId 是为了保持接口的简洁和通用)
大家都是怎么处理这种情况的?

有没有人用 trust wallet ?

Posted: 06 May 2021 01:23 AM PDT

最近搞了几个 dogecoin,然后追求时髦下载了一个 trust wallet,发现这玩意不是很好用啊,想转进去几个 dogecoin 发现有三个 dogecoin bep2,dogecoin bep20, dogecoin, 懵逼中,据说三个都是真狗。而且转出的网络交易费还必须得是 BNB,有点懵圈。 有玩过得大佬吗?想转进去一点 btc,发现自己手里得那点 btc 还不够手续费。bnb 和 smart chain 的 bnb 是一个玩意儿吗? 这俩等价吗? 大胆的假设一下,如果 bnb 的发行商跑了,是不是 all is zero

如何让输入法的这俩图标一直有或者一直没有,经常收到微信消息,指向微信图标时候因为这来图标的闪现导致左侧图标来回跳动,没法准确双击到微信或者去他工具

Posted: 06 May 2021 12:53 AM PDT

求解, python3,当数据大的时候,怎么列出全部排序可能?

Posted: 06 May 2021 12:43 AM PDT

有 999 个数,[000,001,002,...,999]
每 2 个组合成一对,

('000', '001')
('000', '002')
('000', '003')
('001', '002')
('001', '003')
('002', '003')
.............
当 2 个一组时,有 498501 种组合,显示打印出来耗费:3.6621711 秒
当 3 个一组时,有 165668499 种组合,显示打印出来耗费:20.6741886 秒
.............

请问当 400 个一组时,有多少种组合?怎么在 10 秒完成?

我需要对每组数据进行统计编号,

1:('000', '001')
2:('000', '002')
3:('000', '003')
这岂不是非常占用内存空间?有什么更快速,更优雅的写法吗

import itertools import time   z=[] for i in range(0,999):     if i<10:         i = '00'+str(i)     elif 10<=i and i<100:         i ='0'+str(i)     else:         i=str(i)     z.append(str(i)) # 计时开始 start = time.perf_counter()   # 排序全部组合 z2 =(itertools.combinations((z), 3)) end = time.perf_counter() print('排序组合耗费:',end-start)  c=0 for i in z2:     c+=1 print('组合数:',c)  # 计时结束 end = time.perf_counter() print('一共耗费:',end-start) 

为何 Python3 要搞一个不可变对象的概念?

Posted: 06 May 2021 12:42 AM PDT

首先,python 在函数传递参数时,都是传递引用(因为无论传入整数 int 还是列表 list,本质都是类对象)。

那么 int 作为不可变对象我还可以理解,比如下面的行为很正常:

b1 = 3
print(id(b1)) #4321884528
b1 += 4
print(id(b1)) #4321884656,id 变了,正常。
b1 = b1 + 4
print(id(b1)) #4321884784,id 变了,也正常。

但是,换成可变对象 list,就有点诡异了:

a1 = [1, 2, 3]
print(id(a1)) #4358212608
a1 += ['aa', 'bb']
print(id(a1)) #4358212608,id 没变,正常
a1 = a1 + ['aa', 'bb']
print(id(a1)) #4357527936,id 怎么就变了呢,这有点变得莫名其妙了?

按正常理解,x += y,应该等同于 x = x + y,这么一搞,这个特性就有点匪夷所思了。

阿里云, HK 节点轻量应用服务器这是上新了,不知线路如何?

Posted: 06 May 2021 12:24 AM PDT

旧版 1c1g ssd 25g

新版 2c1g essd 40g

极空间这款 nas 怎么样

Posted: 06 May 2021 12:24 AM PDT

迫于 oculus quest2 存储空间不够,想组个 nas,之前没用过 nas,但是威联通和群晖的界面感觉有点不美观,看司波图的视频了解到极空间感觉还不错,有没有入手过的朋友说说使用体验

istio 流量未按照 virtualservice 策略转发,部分服务通过 PassthroughCluster 转发到 endpoint 的第一个 ip 上

Posted: 06 May 2021 12:10 AM PDT

https://github.com/istio/istio/issues/32451 部分服务的 yaml 信息

2K 茶水费,有意私聊 Q MTM5MTcxMDY3Mg==

各位吴彦祖,请问 debian 安装的时候必须设置一个普通用户么?

Posted: 06 May 2021 12:01 AM PDT

RT,尝试迁移一些 k8s 节点到 debian 上,在装操作系统的时候发现必须设置一个普通用户,有没有办法跳过去呀

iOS 上有什么类似 JobScheduler / WorkManager 的 API 吗,还是只能用 APNS 静默推送做个 workaround

Posted: 05 May 2021 11:40 PM PDT

React Native 写了个可以理解为定时爬虫的 App,获取到新数据时会向用户发送一个 Local Notification.
目前在 Android 上用 JobScheduler/AlarmManager 定时执行任务
因为可能有 iOS 的需求(我的主力机也是 iPhone ),考虑 build 一个 iOS 版本时发现 Background Task / Background Processing 相关的 API 并不能保证执行间隔

主要需求如下

  • 执行间隔不需精确,类似 JobScheduler 一类实际 interval 为 1 ~ 2 倍是可以接受的
  • 需要确保即使用户不打开 App,每天也至少执行 2 次左右

而查阅的各种文档和 stackoverflow 等均表示 Background App Refresh 不能保证执行间隔,如果用户不常打开 App,甚至可能一天里都不会执行

这是否意味着要保证相对精度,只能起一个服务器定时给用户发静默推送拉起 App 才行了?


EDIT:

  • 爬虫逻辑不能放到服务器端执行,因为包含用户登录第三方网站的 cookie,可能有安全风险
  • 大部分用户可能一天下来并不会有几次数据更新,但需要爬取的数据只会在源地址保留最新 20 次,等用户想起来打开 App 手动获取会有遗漏风险

Win7 彻底卸载 office 365

Posted: 05 May 2021 11:11 PM PDT

各位大神,请问一下啊,怎么在 win7 上彻底卸载 office365,谢谢!

MIUI 12 适配深色模式问题

Posted: 05 May 2021 08:34 PM PDT

MIUI 12 的深色模式中有个应用列表,可以在全局深色模式开启的情况下,允许某些应用不使用深色模式。

但某些应用在取消勾选的情况下,依然跟随深色模式。比如:钉钉

试验了一下,用 Android Studio 新建项目,选择任意模板,直接构建并在小米 8 MIUI 12 上运行,就会出现上述问题。

默认继承的主题是 Theme.MaterialComponents.DayNight.DarkActionBar

请问一下这方面应用如何适配?

很多流行应用都没有这个问题,如京东,支付宝等,所以一定有办法。

哪些异常是可以不用 log stack trace 的?

Posted: 05 May 2021 08:29 PM PDT

我有一个全局异常处理器,每当出现 RuntimeException 时,就会 log stack trace 。但是类似参数校验之类的异常,需要 log 吗?还是直接返回 HTTP response 就可以了?

android studio 4.2 纯 Java module 一直报红 但是能正常运行

Posted: 05 May 2021 08:24 PM PDT

今天升级 Android studio 4.2 之后 项目里面有 2 个 module 是 java-library 的 一直报错

感觉是 jdk 找不到了 改成 android-library 才好

什么情况?以后 Android Studio 不支持写纯 java 项目了??

环境:Android Studio4.2

gradle:4.2.0

异常配置

plugins { id 'java-library' }  dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) }  sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 

修复后配置

plugins { id 'com.android.library' }  dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) }  sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 

求问这这种编码可能是怎么编的?

Posted: 05 May 2021 03:37 PM PDT

在网易云的音乐链接里看到这个:

https://y.music.163.com/m/song?id=86503&uct=ePxtz8P1HI0y8jf+kKWumw%3D%3D&app_version=8.2.0 

,这个uct参数能推测出来怎么编码加密的吗?有咩有是常规的加密方式?

ePxtz8P1HI0y8jf+kKWumw%3D%3D

[求助] 关于油猴脚本加载的问题!

Posted: 05 May 2021 10:16 AM PDT

加了 window.load 网页的子页面就卡住不继续加载了
不加 window.load 脚本就无法生效。(我猜测是子页面还没加载出来,脚本已经执行完了)

有啥子办法吗?

那种单页面的直接 window.onload=function(){}就可以。。 这种异步页面的应该怎么搞? #挠头

json.loads 不能把某文本的 str 转换字典类型,复制该 str 到 py 文件内即可转换字典类型,什么原因?

Posted: 05 May 2021 10:03 AM PDT

很奇怪的问题,stream_header.txt 文本如下

{"appId":"amp-ios-10000","accessToken":"xxxxxxxxxxxxxxx","User-Agent":"Mozilla/5.0","Content-Type":"application/json;charset=UTF-8","Host":"messageapi.campusphere.net","Accept-Encoding":"gzip"}

我通过 with 函数读取文本,转成字典类型的值赋予某变量
with open("stream_header.txt","r")as header_:
header=json.loads(dumps(header_.read()))
print(type(header))
# 读取上一个时间戳
with open("old_identity_information.txt", "r")as old:
date =json.loads(dumps(old.read()))

模拟发送数据包的时候,弹出 AttributeError: 'str' object has no attribute 'items'错误,提示 str 无法通过字典方式提取某 key 值
经过检查是 json.loads 的问题,加了 print(type(header)),编辑器提示<class 'str'>,另一个 date 也提示是 str 类型。。

str 复制到 py,写成这样:

d='{"appId":"amp-ios-10000","accessToken":"xxxxxxxxxxxxxxx","User-Agent":"Mozilla/5.0","Content-Type":"application/json;charset=UTF-8","Host":"messageapi.campusphere.net","Accept-Encoding":"gzip"}'
d=loads(d)
print(type(d))

编辑器提示 d 是字典类型。。。很奇怪。。。这是什么问题?

工作比较-回老家还是继续沪漂,怎么选择?

Posted: 05 May 2021 09:38 AM PDT

基础

A 公司是上家公司,B 公司是目前在职公司。

A 公司在某沿海二线城市(新一线)传统行业。做公司内部系统,工作时间 966 。

B 公司在魔都,做一些城市运营的项目。弹性工作,双休,无考勤,不打卡。

待遇 税前

A 公司 25W/年,月薪 1.5W 年底 7W 。

B 公司 1.9W/月,14 薪起(年终奖元旦前发放)。

其他

离职原因 想来大城市学习下,因为传统行业技术栈比较老,比较喜欢追求技术。上家公司领导对我很好,离职后基本隔两个月就打电话让回去,有一次来魔都了。

工作环境A 公司 IT 有 15 人左右,回去基本算个小领导,不过业务复杂,另外有一定程度的官僚思想,就是可能会心累。B 公司 IT5 个人,就是干活,团队很小,工作轻松,不存在晋升,但是事少。

问题

补充赶在 A 公司城市的限购,买了套房。年龄到了,不买去其他城市又要工作一年加期房等不起。 不是必须要回 A 公司城市,目前心里没有什么确切的答案,不过每次都是拒绝了前领导。原因是想在魔都多学习下。 现在只是单纯比较上述两个,存在跳槽继续沪漂的可能。

如果是你,你会怎么选择?

谢谢!

opera 现在是国产浏览器了吗?

Posted: 05 May 2021 09:30 AM PDT

想在手机上单独装一个浏览器,隔离不想被别人看到了的内容。下了 uc 之后发现开屏默认推荐的最常访问是京东,默认搜索是百度。可能是 uc 直接把国内版本翻译了一下就上 google play 了吧。然后我卸载了 uc,下了 opera,结果居然还是一样。

No comments:

Post a Comment