把 Caps Lock 變成智慧的 Control 以及 Escape :
- 單獨輕按一下就是 Escape 。
- 若按下時同時按著其他鍵,就會是 Control 。
這應該是 Vim 和 Emacs 的最佳解了!(Emacs? Bash 的快捷鍵就是 Emacs 系列的)
- Send Escape if you tap Caps Lock alone.
| # ref: https://play.golang.org/p/OeEmT_CXyO | |
| package main | |
| import ( | |
| "fmt" | |
| "runtime" | |
| "strconv" | |
| "strings" | |
| "sync" | |
| ) |
| #!/usr/bin/env python | |
| import sys | |
| import shutil | |
| from typing import Optional, List, Tuple, Dict | |
| import typer | |
| from rich import print | |
| from rich.columns import Columns | |
| from rich.console import Console | |
| from rich.traceback import install |
| #!/usr/bin/env python | |
| import itertools | |
| import math | |
| import signal | |
| import subprocess | |
| import tempfile | |
| import shutil | |
| import time | |
| import os |
libuv 和 libev ,两个名字相当相近的 I/O Library,最近有幸用两个 Library 都写了一些东西,下面就来说一说我本人对两者共同与不同点的主观表述。
高性能网络编程这个话题已经被讨论烂了。异步,异步,还是异步。不管是 epoll 也好,kqueue 也罢,总是免不了异步这个话题。
libuv是异步的,libev是同步的多路IO复用。
libev 是系统I/O复用的简单封装,基本上来说,它解决了 epoll ,kqueuq 与 select 之间 API 不同的问题。保证使用 livev 的 API 编写出的程序可以在大多数 *nix 平台上运行。但是 libev 的缺点也是显而易见,由于基本只是封装了 Event Library,用起来有诸多不便。比如 accept(3) 连接以后需要手动 setnonblocking。从 socket 读写时需要检测 EAGAIN 、EWOULDBLOCK 和 EINTER 。这也是大多数人认为异步程序难写的根本原因。
libuv 则显得更为高层。libuv 是 joyent 给 Node 做的一套 I/O Library 。而这也导致了 libuv 最大的特点就是处处回调。基本上只要有可能阻塞的地方,libuv 都使用回调处理。这样做实际上大大减轻了程序员的工作量。因为当回调被 call 的时候,libuv 保证你有事可做,这样 EAGAIN 和 EWOULDBLOCK 之类的 handle 就不是程序员的工作了,libuv 会默默的帮你搞定。
| // This function is called when the websocket connection is established | |
| void MediaManagerInterface::OnConnected() | |
| { | |
| // _signaling is the object of sending signaling through websocket | |
| _signaling->AsyncRequest("getRouterRtpCapabilities", nlohmann::json(), [this](nlohmann::json jMsg) { | |
| createFactory(); // Create webrtc threads, etc. | |
| mediasoupclient::PeerConnection::Options op; | |
| op.factory = _peerConnectionFactory; | |
| if(!_device->IsLoaded()) { | |
| _device->Load(jMsg["data"], &op); |
| v=0 | |
| o=- 7423721318464670085 4 IN IP4 127.0.0.1 | |
| s=- | |
| t=0 0 | |
| a=group:BUNDLE 0 1 2 | |
| a=msid-semantic: WMS 0 | |
| m=audio 49796 UDP/TLS/RTP/SAVPF 111 103 104 9 102 0 8 106 105 13 110 112 113 126 | |
| c=IN IP4 192.168.1.194 | |
| a=rtcp:9 IN IP4 0.0.0.0 | |
| a=candidate:836222334 1 udp 2122260223 192.168.1.194 49796 typ host generation 0 network-id 1 network-cost 10 |
| string longestPalindrome(string s) { | |
| int n = s.size(), jT = 0, kT = 0, maxL = 0; | |
| for (int i = 0; i < n; ++i) { | |
| int j = i, k = i; | |
| while (j >= 0 && k < n) { | |
| if (s[j] == s[k]) { | |
| j--; | |
| k++; | |
| } | |
| else { |