Requiring Native Modules in the Renderer Process to be NAPI or Context Aware
当前在 electron 中加载 native 模块有些困难。比如编译 native 模块时,需要确保 NODE_MODULE_VERSION 版本正确。在同一个进程中加载多个 native 模块实例等问题。
之前官方团队实现了对 chromium 打 patch 的方案,却碰到了很多 tricky 的问题。现在随着 Node 12 Worker Threads 的发布,就可以轻松实现这个功能了。
其实 Node 团队在实现 Worker Thread 时也遇到了在多个 worker 线程中无法加载 native 模块的问题。他们的解决方案是提供了 Context Aware 的 native 模块方案。也就是 native 模块会告诉 Node, 他们可以被安全加载进多个 v8::Context 中,NAN 有个方便的宏 NAN_MODULE_WORKER_ENABLED 可以实现。
所以,Context Aware 模块和 ...
Exploring Strings in Rust
计算机如何存储解析字符序列的
计算机按字节(8位)顺序存储
字节可以代表任意对象。只不过我们可以把某些字节转化为人可理解的对象。这也就是 ASCII / Unicode 码表的功能.
字符串就是一系列可以通过码表进行解析的字节序列. 在 rust 中我们常用 String,str,&str,&String,Box<str>,Box<&str> 等实现。
C 语言中是这样处理字符串的.
123char string[] = "banana"; // c 在末尾添加 `\0`char long_mostly_empty_string[42] = "banana"; // c 在末尾添加 `\0`char just_a_different_initialization[] = {'b', 'a', 'n', 'a', 'n' ...
在 mac 平台使用 podman 代替 docker 的过程中遇到了容器挂载文件的问题,这里将实践过程总结一下.
先说下,为什么替换 docker. docker-desktop 其实还是很好用的,只不过在使用中会发现以下几个问题 1、启动慢 2、总是更新失败。而且根据网上消息早期 docker-desktop 内部使用的是 virtualbox 技术,所以就选择了 podman 替换。
使用中 podman 和 docker 没什么多的使用差别,除了多了 podman machine 的操作,这是因为 podman 使用了 quemu 加载 fedora 作为容器的虚拟物理机使用。所以此处会出现挂载的问题也就是因为 quemu 没有先挂载本地文件,那么自然容器也就无法访问并挂载了,这个问题据说在 podman 4.0 中将得到解决,我们拭目以待。
回到正题,看看如何为 podman 挂载上本地文件。
首先当然可以通过 scp 将文件拷贝到虚拟机中。但实际中很浪费空间。
接下来就是如何将 macOS 文件系统挂载上去。此处则需要使用 sshfs 通过 ssh 反向代理登录进虚拟机 ...
当前 native 项目大多是 cmake 或 autotool 配置编译,以下就分别以 libgit2 和 openssl 来说明如何进行 NDK 交叉编译
opensslopenssl 使用 autotool 配置,如 NOTES-ANDROID.md 所述先进行环境配置
1、.zshrc
因为 NDK 从 r20 后不再携带 gcc,所以需要使用 clang 编译
1234export ANDROID_NDK_HOME=/Users/shuttle/Library/Android/sdk/ndkexport ANDROID_NDK_ROOT=$ANDROID_NDK_HOME/24.0.7956693export PATH=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/darwin-x86_64/bin:$PATHexport CC=x86_64-linux-android32-clang
2、执行 Configure
1./Configure android-x86_64 -D__ANDROID_API__=32
3、编译
mak ...
记录下使用 rust 绑定 libgit2 动态库进行 安卓交叉编译时的过程。
为 libgit2 生成 rust binding如前所述,我们生成好了 libgit2 的安卓动态库,如果需要 rust 调用安卓动态库的话,不但手写很麻烦,还需要用到 unsafe, 可能会出现各种问题。所以我们采用官方提供的 bindgen 来为我们自动生成 binding.
1、新建 cargo 项目,并将 libgit2 头文件复制进去
123456- deps - libgit2 - include- src build.rs Cargo.toml
2、添加 bindgen 依赖, 同时启用 build.rs
123456[package]...build="build.rs[build-dependencies]bindgen = "0.59.2
3、编辑 build.rs
12345678910111213141516171819202122use bindgen;use std::env;use std::path::PathBuf;fn main( ...
What every JavaScript developer should know about Unicode
原文dmitripavlutin.com/what-every-javascript-developer-should-know-about-unicode
本文起源于一个忏悔:我对 Unicode 已经恐惧很久了。当实际工作中需要 Unicode 知识时,我一般仅针对问题搜索答案,而不会对其原理进行深入探究。
我一直在回避这件事,直到我遇到了一个需要深入理解 Unicode 原理的问题。此刻没有现成的解决方案可用了。
在付出大量努力(阅读一大堆文章)后,我才发现,其实 Unicode 也没那么难懂。好吧。。。有些文章确实需要至少3遍之后才能理解。
如果你在理解 Unicode 方面也有同样的困惑,那么此刻正是时候!真的不难!首先准备好可口的🍵或者咖啡。接下来,就一起进入抽象、字符、astrals和代理的世界吧。
本文将阐述 Unicode 的基本原理及其创建的必要性。然后介绍 JavaScript 如何使用 Unicode, 以及开发中可能遇到的问题。同时也会学习 ...
Easy Coroutines in Android: viewModelScope
原文medium.com/androiddevelopers/easy-coroutines-in-android-viewmodelscope-25bffb605471
取消一个已经不再使用的协程,通常需要写一堆繁琐的代码。而 viewModelScope 通过为 ViewModel 类添加扩展属性来实现结构化并发,从而在 ViewModel 被销毁时,自动取消它内部的子协程.
libgit2 最近升级到了 v1.3,然后自己也想利用这个库在安卓上开发个小工具,所以需要 NDK 交叉编译一下。
1、代码
首先下载 libgit2 源码,然后切换到 git checkout v1.3.0(这里的目的是锁住代码版本,否则在 master 分支,每次重新编译的代码可能会有所差异)
2、准备 ndk 工具链
打开 AndroidStudio 下载 NDK. 这里使用的版本是最新的 24.0.7956693
3、依赖库准备
libgit2 有几个依赖库,在 deps 目录下。实际中 libgit2 有使用到 openssl 库,因为是交叉编译,所以也需要我们自己用 ndk 编译 openssl, 而不是直接使用本机上的 openssl
下载 openssl 源码到 deps 目录下
根据 openssl 目录下的 NOTES-ANDROID.md 提示编译即可
4、cmake android cross-compile 准备
在 libgit2 项目根目录下新建 CMakeLists.android.txt 文件.
123456789101112131415161 ...
libgit2 是一个跨平台、可在自己应用中链接的 git 实现库.
libgit2是一个便携、纯C实现 git 核心功能的依赖库.当前已经实现了多种语言绑定,如 Rugged(Ruby)、LibGit2Sharp(.NET)、pygit2(Python)、NodeGit(Node)等.
git GUI 客户端如 GitKraken 和 gmaster,git 托管平台如 GitHub,GitLab和Azure DevOps都是基于此实现的.每一次merge pull request 都是通过 libgit2 来实现的.
最近 libgit2 刚刚放出 1.0 版本,那么先来个 android 交叉编译吧.
环境macos
NDKr21
步骤1、下载源码
`git clone git@github.com:libgit2/libgit2.git`
2、配置 openSSL(可跳过)
因为 libgit2 支持 openSSL,所以先编译 openSSL.
下载源码,configure/make 即可
3、配置工具链
在 NDKr21 中,已经将各个架构、各个API的工具预编 ...
详细介绍请移步: 官网,中文镜像,清华源
源码探究12345678static int create_subprocess(JNIEnv* env, char const* cmd, char const* cwd, char* const argv[], char** envp, int* pProcessId, jint rows, jint columns)
此方法即为 termux 的核心,通过该方法将用户输入的命令和当前工作的文件夹传入打开的终端去执行.
1、打开伪终端
12345int ptm = open("/dev/ptmx", O_RDWR | O_CLOEXEC);if (ptm < 0) return throw_runtime_exception(env, "Cannot open /dev/ptmx");// UNIX98 的伪终端模式.// pts(pseudo-terminal slave)/ptmx(pseud ...