Monday, May 17, 2021

V2EX - 技术

V2EX - 技术

V2EX - 技术


写了个 JSON 格式化的工具,欢迎来试用一下��

Posted: 17 May 2021 05:03 AM PDT

🔗 json.pink

预览: 预览图

理解不了动态规划会对后端程序员职业发展有哪些影响?

Posted: 17 May 2021 04:52 AM PDT

普通后端程序员,非算法岗

为何 Joplin 的作者们都这么固执

Posted: 17 May 2021 04:51 AM PDT

最近为知会员提示即将到期,基于为知对 markdown 编辑器的落后以及使用一年中遇到不少问题(有反馈),想换个笔记。留意到了 joplin 感觉很不错,特别是多端使用,有本地化端到端加密功能,编辑器初步使用起来也没发现什么 bug 。可是它没有对笔记加锁的功能。

插个题外话,这个加锁功能,在现有的知名云笔记中其实也很少见,唯一见到有的是有道和为知,有道的实现方式是请求服务器密码校验,为知应该是通过证书密码校验并定期更新和同步证书,这两种实现方式各有利弊,且两款笔记的其他基础功能在深入使用后发觉也不尽人意,印象是全锁,这种与"单个笔记加锁"完全是两个需求场景。

抱着希望的心情想向 joplin 提交一下这个建议,毕竟好歹也是个开源项目。然后发现,这个需求在 2 年前就已经被提出! https://github.com/laurent22/joplin/issues/289 现在对新功能的建议提交都转到这个地方讨论了 https://discourse.joplinapp.org/t/is-it-possible-to-password-lock-the-application-upon-opening/122/13

看完后我哭笑不得,貌似作者们一直不愿意添加这个功能,他认为:

  • 这种加锁,并没有加密作用,已经有端对端加密了,现有的方式才是更加可靠的加密;
  • 如果不想别人看到你的笔记,就请锁好自己电脑,或者用一些第三方软件锁定软件或 APP

我感觉作者们对这个需求一直理解错误,或者不愿意去理解。对单个笔记加锁,是不少特殊使用场景都需要用到的功能,而且不少用户都说明了这样的场景,但他们就是不干,有点类似程序员有时候无脑反驳产品经理的需求那样。

win10 的 UWP 应用可以下载历史版本吗

Posted: 17 May 2021 04:44 AM PDT

更新了某个 UWP 应用后,发现还是旧的好用,有途径可以下载吗

如何关闭 windows 飞书消息默认会把全屏应用弹出最小化?

Posted: 17 May 2021 04:38 AM PDT

用过这么多聊天 im

没见过这样的

弹丢我 4w 魂

[skynet 源码阅读系列] 02_skynet_start

Posted: 17 May 2021 04:38 AM PDT

上一节总结了 main 函数里的代码都做了些啥事。

  • skynet 启动需要指定一个配置文件,main 中会把配置文件里的 $var 替换成系统的环境变量,并且会把配置文件内的键值对设置到 skynet_env E E->L 的 lua 虚拟机的全局环境中。
  • 创建了一个全局节点 skynet_node G_NODE, 并把当前工作线程的状态由 THREAD_MAIN 改为 THREAD_WORKER
  • 设置当前进程忽略 SIGPIPE 信号。
  • 初始化 codecache CC
  • 初始化 skynet_config config 配置信息,传到 skynet_start(&config) 内。

这一节继续,skynet_start, 完整的函数先贴出来。

void  skynet_start(struct skynet_config * config) {     // register SIGHUP for log file reopen     struct sigaction sa;     sa.sa_handler = &handle_hup;     sa.sa_flags = SA_RESTART;     sigfillset(&sa.sa_mask);     sigaction(SIGHUP, &sa, NULL);      if (config->daemon) {         if (daemon_init(config->daemon)) {             exit(1);         }     }     skynet_harbor_init(config->harbor);     skynet_handle_init(config->harbor);     skynet_mq_init();     skynet_module_init(config->module_path);     skynet_timer_init();     skynet_socket_init();     skynet_profile_enable(config->profile);      struct skynet_context *ctx = skynet_context_new(config->logservice, config->logger);     if (ctx == NULL) {         fprintf(stderr, "Can't launch %s service\n", config->logservice);         exit(1);     }      skynet_handle_namehandle(skynet_context_handle(ctx), "logger");      bootstrap(ctx, config->bootstrap);      start(config->thread);      // harbor_exit may call socket send, so it should exit before socket_free     skynet_harbor_exit();     skynet_socket_free();     if (config->daemon) {         daemon_exit(config->daemon);     } } 

struct sigaction sa; sa.sa_handler = &handle_hup; sa.sa_flags = SA_RESTART; sigfillset(&sa.sa_mask); sigaction(SIGHUP, &sa, NULL); 

SIGHUP 信号重新注册了一个 handle, 如果收到 SIGHUP 信号,将调用 handle_hup 函数,将把 SIG 置为 1,SIG 定义为 static volatile int SIG = 0;


if (config->daemon) {     if (daemon_init(config->daemon)) {         exit(1);     } } 

如果函数 daemon_init 返回值判断为 true,则退出当前进程。

我们看看 daemon_init 里做了些什么事。

// skynet-src/skynet-deamon.c int daemon_init(const char *pidfile) {     int pid = check_pid(pidfile);      if (pid) {         fprintf(stderr, "Skynet is already running, pid = %d.\n", pid);         return 1;     }  #ifdef __APPLE__     fprintf(stderr, "'daemon' is deprecated: first deprecated in OS X 10.5 , use launchd instead.\n"); #else     if (daemon(1,1)) {         fprintf(stderr, "Can't daemonize.\n");         return 1;     } 

No comments:

Post a Comment