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, 以及开发中可能遇到的问题。同时也会学习 ...
相比较 create-react-app 这么笨重的武器,parcel 是一个开箱即用的开发打包工具,在小项目、简单测试时用起来就非常得心应手了。
依赖12345678910111213"devDependencies": { "@babel/core": "^7.21.0", "@babel/preset-env": "^7.20.2", "@babel/preset-react": "^7.18.6", "@types/react": "^18.0.28", "@types/react-dom": "^18.0.11", "babel-plugin-transform-react-jsx-source": "^6.22.0", "parcel": "^2.8.3&quo ...
当前的个人主页是运行在 docker nginx 上的。为了安全起见,把所有的 http 请求已经转发到了 https, 免费的 SSL 证书过期了,所以使用了 letsencrypt 的免费证书来签名。但是它默认的是 3 个月有效期,所以必须得定期去更新。否则就会导致 nginx 服务不可用了。以下为如何在 docker 上更新 letsencrypt 证书.
部署架构众所周知,docker 的命令配置大都很长,一般是通过shell 脚本或者 docker-compose.yaml 文件来进行管理的。而我采用的就是后者。
如果一台主机上运行了多个 docker 容器,那么这个 docker-compose.yaml 就可能会很大。每次调用 docker-compose up/down 时都会导致所有的容器被销毁重建。所以这里采用了 sidecar 的模式,既可以保证各个容器的配置文件各自保存,又能保证容器之间可以互相访问。
以下以 nginx 和 couchdb 为例.
couchdb/docker-compose.yaml
12345678910111213 ...
关于如何在 macOS Monterey 12 上开启 smdba 文件共享的步骤
1、添加共享用户
打开用户与群组, 点击 + 新建用户, 新账户选择: 仅限共享
2、共享
进入设置 -> 共享, 1、打开文件共享选项 2、添加共享文件夹 3、添加刚才新建的共享用户
接下来点击选项,勾选共享用户,即可通过 smdba 和共享用户访问共享文件夹了.
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( ...
Easy Coroutines in Android: viewModelScope
原文medium.com/androiddevelopers/easy-coroutines-in-android-viewmodelscope-25bffb605471
取消一个已经不再使用的协程,通常需要写一堆繁琐的代码。而 viewModelScope 通过为 ViewModel 类添加扩展属性来实现结构化并发,从而在 ViewModel 被销毁时,自动取消它内部的子协程.