把 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 { |