写放大 Write Amplification

写放大 Write Amplification “写放大”(Write Amplification)在存储系统中是很常见的。但是,即使都是在存储系统中,“写放大”也有很多种,各种的写放大原理并不是很一样。下边根据自己的理解,进行了下总结,如有问题,恳请指正。 读写单元较大导致的写放大 在文件系统中,读写单元固定,比如都是4K,这样,如果write函数写的数据小于4K,则要先把整块读入,再修改,再把新的4K整体写入 (O_DIRECT情况除外)。这个过程可以称为 RMW (Read-Modify-Write),这就是File System的写放大问题。[1][2][5] (注意:Read-Modify-Write被更广泛地用在原子指令[3]和RAID[4]中。) 再如,在DBMS等应用层存储系统中,同样存在自己管理的读写单元,如MySQL的默认读写单元称为页,默认是16KB,所以一次读写只能以页的单位进行,这时,小于页的数据读写同样会带来整页的读写,进而造成了“写放大”,道理和文件系统是一样的。 RAID中的Read-Modify-Write造成的写放大 如前段所述,RAID中更新一个块,需要额外读原始块、校验块,额外写校验块,所以多了两个读,一个写,也称为Read-Modify-Write[4]。 这是由于校验块必须更新,且根据异或运算的可逆性,新校验块=新数据块^旧校验块^旧数据块。 SSD中闪存特性造成的写放大 在SSD中,一个block可以分为多个page,在读的时候,可以以page为单位,但是写的时候,只能以block为单位。因此写的单元比较大。在上层 (比如文件系统)读写单元相同的情况下,同样是读写1个page的大小,读的话直接读就行,写的话却需要先把与要写page同一个block的数据全复制一遍,加上修改的page后,再一起写入block。写入的数据量远比实际的大,这就是SSD的写放大问题。 现在 SSD 逐渐成为主流存储,compaction 带来的写放大问题显得越来越严重: SSD 顺序读写性能比随机读写性能好一些,但是差距并没有 HDD 那么大。所以,顺序写相比随机写带来的好处,能不能抵消写放大带来的开销,这是个问题。 SSD 的使用寿命和其写入量有关,写放大太严重会大大缩短 SSD 的使用寿命。因为 SSD 不支持覆盖写,必须先擦除 (erase)再写入。而每个 SSD block (block 是 SSD 擦除操作的基本单位) 的平均擦除次数是有限的。 存储系统一致性机制造成的同步写放大 在存储系统的很多层次中,都有保证系统crash consistency (一致性)的设计。因此,不管是应用层的存储系统 (如DBMS、KV-store)、虚拟化层中的镜像管理、系统层的文件系统,甚至是硬件层的SSD FTL[7],都要通过强制同步各种元数据的写入顺序,或者利用redo log的思想,用journaling、log-structured或copy-on-write等策略保证元数据写入目的位置生效前先完整地生成日志,来保证系统崩溃或断电时,元数据之间是一致。但是,如果多层存储系统重叠,由于一致性机制导致同步次数增加就会层层放大。 比如,运行在x86虚拟机中的levelDB,其一次更新操作就会 (1)最终导致levelDB写log文件和写数据两次同步写,这两次写就又会 (2)导致2次的Guest文件系统log写和2次Guest文件系统数据写,一共4次同步写,这4次写又会导致 (3)虚拟化镜像管理层的4 x N次写 (N取决于镜像为保证元数据crash consistency的同步次数,若是qcow2格式,N可能有5次之多[6]),最后导致 (4)Host文件系统的4 x N x 2 = 8 x N次同步写。当然这是一种比较极端的情况,但实际应用中也应该存在。 基于LSM树的KV系统的Merge操作造成的写放大 levelDB等KV存储广泛采用了LSM树等结构进行存储组织,其特点就是靠上的level的数据会最终被merge sort到下层,由于多数level在磁盘文件中,这也就导致了同一KV数据的总写放大,放大的倍数就是大约是level的数目。和前边4中写放大不同的是,这种写放大并非写操作时马上就会发生写放大,而是写操作发生时会潜在的导致“未来会发生”写放大,所以这种写放大只会导致整体写代价提升,不会影响实时的延迟性能,只可能会影响磁盘带宽或者在SSD做存储设备时影响闪存耐久。FAST 16上有篇论文也专门分析了这种写放大。[8] http://blog.jcix.top/2018-06-05/write_amplification/ ...

2012-02-19 · 1 min · 78 words · -

Monospace fonts

Monospace fonts http://www.lowing.org/fonts/ Monospace fonts (Such as Courier or LetterGothic), or “fixed pitch” fonts, contain characters that all have the same character width, producing text that can be used to create forms, tabular material or documents that require exact text line lengths. An example of a fixed pitch font is Courier 12 pitch, which is a 10 point font that will print at exactly 12 characters per inch. <th colspan="2" align="left" bgcolor="silver"> Good Programming Font Criteria </th> Crisp clear characters. Extended characterset. Good use of whitespace. 'l', '1' and 'i' are easily distinguished '0', 'o' and 'O' are easily distinguished forward quotes from back quotes are easily distinguished -prefer mirrored appearance Clear punctuation characters, especially braces, parenthesis and brackets

2012-02-18 · 1 min · 119 words · -

emacs org mode

emacs org mode Emacs 22 以后的版本已经集成了 org-mode,打开 .org 扩展的文件会自动进入 org 模式。 增减一个TODO项目的优先级 S-Up/Down move subtree/list item up/down M-S-UP/DOWN promote/demote heading M-LEFT/RIGHT insert new TODO entry/checkbox item M-S-RET insert TODO entry/ckbx after subtree C-S-RET C-RET加入新的同级标识 M-left将当前项提升一级 M-right将当前项降低一级 M-S-left将当前分支提升一级 M-S-right将当前分支降低一级 M-S-up将当前分支向上移动 M-S-down将当前分支向下移动 C-c C-x C-k删除当前分支 C-c C-x M-w复制当前分支 C-c C-x C-y粘贴分支 C-c C-w移动当前分支 C-c *为当前分支加入内容 3.1 关于TODO ITEM的基本知识和操作 设置TODO项目所有标题只要以TODO开头,就会变成TODO 项目。例如: *** TODO 付手机费 *** TODO 开会 更改TODO项目的状态 C-c C-t Rotate the TODO state of the current item among ...

2012-02-17 · 1 min · 133 words · -

go math, 数学计算

go math, 数学计算 除法 package main import "fmt" func main() { fmt.Println(1/2) fmt.Println(2/2) fmt.Println(3/2) fmt.Println(4/2) } 求余, 取模 package main import "fmt" func main() { fmt.Println(1%2) fmt.Println(2%2) fmt.Println(3%2) fmt.Println(4%2) }

2012-02-16 · 1 min · 30 words · -

词法定界

词法定界 词法定界 (lexical scoping,有时候叫静态域) 是许多编程语言约定使用的,变量只能在这套范围 (按功能排列) 内被一些已经定义了的代码段中调用 (引用) 。当被编译之后,这些范围将确定下来。变量定义用这种格式的有时候叫做私有变量。 相反的,还有动态域 (dynamic scoping) 。动态域产生可以在定义变量的代码段外调用的变量。这样定义的变量也叫公共变量。

2012-02-15 · 1 min · 13 words · -

CDN 加速

CDN 加速 CDN 加速 CDN 的全称是 Content Delivery Network,即内容分发网络。其目的是通过在现有的 Internet 中增加一层新的网络架构,将网站的内容发布到最接近用户的网络"边缘",使用户可以就近取得所需的内容,提高用户访问网站的响应速度。CDN有别于镜像,因为它比镜像更智能,或者可以做这样一个比 喻: CDN=更智能的镜像+缓存+流量导流。因而,CDN可以明显提高Internet网络中信息流动的效率。从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等问题,提高用户访问网站的响应速度。 为更好地理解CDN,让我们看一下CDN的工作流程。当用户访问已经加入CDN服务的网站时,首先通过DNS重定向技术确定最接近用户的最佳CDN节点,同时将用户的请求指向该节点。当用户的请求到达指定节点时,CDN的服务器 (节点上的高速缓存) 负责将用户请求的内容提供给用户。具体流程为: 用户在自己的浏览器中输入要访问的网站的域名,浏览器向本地DNS请求对该域名的解析,本地DNS将请求发到网站的主DNS,主DNS根据一系列的策略确定当时最适当的CDN节点,并将解析的结果 (IP地址) 发给用户,用户向给定的CDN节点请求相——应网站的内容。

2012-02-15 · 1 min · 19 words · -

netlink

netlink 什么是Netlink通信机制 Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口。 Netlink 是一种特殊的 socket,它是 Linux 所特有的,类似于 BSD 中的AF_ROUTE 但又远比它的功能强大,目前在Linux 内核中 使用netlink 进行应用与内核通信的应用很多; 包括:路由 daemon(NETLINK_ROUTE),用户态 socket 协议(NETLINK_USERSOCK), 防火墙(NETLINK_FIREWALL),netfilter 子系统(NETLINK_NETFILTER),内核事件向用户态通知(NETLINK_KOBJECT_UEVENT), 通用 netlink(NETLINK_GENERIC)等。 Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的 socket API 就可以使用 netlink 提供的强大功能, 内核态需要使用专门的内核 API 来使用 netlink。 Netlink 相对于系统调用,ioctl 以及 /proc文件系统而言具有以下优点: 1,netlink使用简单,只需要在include/linux/netlink.h中增加一个新类型的 netlink 协议定义即可,(如 #define NETLINK_TEST 20 然后,内核和用户态应用就可以立即通过 socket API 使用该 netlink 协议类型进行数据交换); 2. netlink是一种异步通信机制,在内核与用户态应用之间传递的消息保存在socket缓存队列中,发送消息只是把消息保存在接收者的socket的接收队列,而不需要等待接收者收到消息; 3.使用 netlink 的内核部分可以采用模块的方式实现,使用 netlink 的应用部分和内核部分没有编译时依赖; 4.netlink 支持多播,内核模块或应用可以把消息多播给一个netlink组,属于该neilink 组的任何内核模块或应用都能接收到该消息,内核事件向用户态的通知机制就使用了这一特性; 5.内核可以使用 netlink 首先发起会话; https://www.cnblogs.com/wenqiang/p/6306727.html

2012-02-15 · 1 min · 64 words · -

samba

samba # archlinux 安装 samba sudo pacman -S samba # centos install samba sudo yum install samba samba-client #创建共享目录 sudo mkdir /home/user0/share # 创建 samba 用户,使用已有用户的话,可以跳过,pdbedit是samba的用户管理命令 sudo useradd -m -s /bin/bash user0 sudo pdbedit -a user0 # set password for user,设置密码,使用系统现有的用户时,也要设置密码,samba可以跟linux系统共享用户名,但是密码是独立的。 smbpasswd -a user0 # list user sudo pdbedit -L -v sudo systemctl start smb sudo systemctl enable smb sudo systemctl status smb 创建Samba配置文件 vim /etc/samba/smb.conf [global] workgroup = WORKGROUP security = user # share0: the share folder display name [share0] path = /home/user0/share valid users = user0 public = no writable = yes printable = no create mask = 0644 客户端 file share url: \hostname0\share0 ...

2012-02-13 · 1 min · 115 words · -

windows shutdown script

windows shutdown script win10 win10 shutdown script # shutdown.bat shutdown.exe /s /t 3 winXP 在Windows XP中,新增了一条命令行工具"shutdown",其作用是"关闭或重新启动本地或远程计算机"。利用它,我们不但可以注销用户,关闭或重新启动计算机,还可以实现定时关机、远程关机。 该命令的语法格式如下: shutdown [-i |-l|-s |-r |-a] [-f] [-m [\ComputerName]] [-t xx] [-c “message”] [-d[p]:xx:yy] 其中,各参数的含义为: -i 显示图形界面的对话框。 -l 注销当前用户,这是默认设置。 -m ComputerName优先。 -s 关闭计算机。 -r 关闭之后重新启动。 -a 中止关闭。除了-l 和ComputerName 外,系统将忽略其它参数。在超时期间,您只可以使用-a。 -f 强制运行要关闭的应用程序。 -m [\ComputerName] 指定要关闭的计算机。 -t xx 将用于系统关闭的定时器设置为 xx 秒。默认值是20秒。 -c “message” 指定将在"系统关闭"窗口中的"消息"区域显示的消息。最多可以使用127 个字符。引号中必须包含消息。 -d [p]:xx:yy 列出系统关闭的原因代码。 首先,我们来看一下该命令的一些基本用法: 注销当前用户 shutdown - l 该命令只能注销本机用户,对远程计算机不适用。 关闭本地计算机 shutdown - s 重启本地计算机 shutdown - r ...

2012-02-12 · 1 min · 141 words · -

seabios

seabios SeaBIOS is an open source implementation of a 16bit X86 BIOS. SeaBIOS can run in an emulator or it can run natively on X86 hardware with the use of coreboot. SeaBIOS is the default BIOS for qemu and kvm.

2012-02-10 · 1 min · 40 words · -

tap0, ERROR while getting interface flags

’tap0, ERROR while getting interface flags' tap0: ERROR while getting interface flags: No such device install uml-utilities and restart the system sudo apt-get install uml-utilities sudo reboot

2012-02-09 · 1 min · 27 words · -

禁止network manager 开机启动.

禁止network manager 开机启动. 安装sysv-rc-conf sudo apt-get install sysv-rc-conf 运行sysv-rc-conf sudo sysv-rc-conf 把network-m对应的xx都点掉.

2012-02-08 · 1 min · 12 words · -

事务隔离

事务隔离 事务隔离级别 标准ANSI SQL规范中定义了四种隔离级别: 未提交读 (Read Uncommitted) : 最低隔离级别,一个事务能读取到别的事务未提交的更新数据,很不安全,可能出现丢失更新、脏读、不可重复读、幻读; 提交读 (Read Committed) : 一个事务能读取到别的事务提交的更新数据,不能看到未提交的更新数据,不可能可能出现丢失更新、脏读,但可能出现不可重复读、幻读; 可重复读 (Repeatable Read) : 保证同一事务中先后执行的多次查询将返回同一结果,不受其他事务影响,不可能出现丢失更新、脏读、不可重复读,但可能出现幻读; 序列化 (Serializable) : 最高隔离级别,不允许事务并发执行,而必须串行化执行,最安全,不可能出现更新、脏读、不可重复读、幻读。 隔离级别越高,数据库事务并发执行性能越差,能处理的操作越少。因此在实际项目开发中为了考虑并发性能一般使用提交读隔离级别,它能避免丢失更新和脏读,尽管不可重复读和幻读不能避免,但可以在可能出现的场合使用悲观锁或乐观锁来解决这些问题。 按照 SQL:1992 事务隔离级别,InnoDB 默认是可重复读的 (REPEATABLE READ) 。MySQL/InnoDB 提供SQL标准所描述的所有四个事务隔离级别。你可以在命令行用-transaction-isolation选项,或在选项文件里,为所有连接设置默认隔离级别。 例如,你可以在my.inf文件的[MySQLd]节里类似如下设置该选项: transaction-isolation = {READ-UNCOMMITTED | READ-COMMITTED | REPEATABLE-READ | SERIALIZABLE} 用户可以用 SET TRANSACTION 语句改变单个会话或者所有新进连接的隔离级别。它的语法如下: SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE} 注意: 默认的行为 (不带session和global) 是为下一个 (未开始) 事务设置隔离级别。如果你使用GLOBAL关键字,语句在全局对从那点开始创建的所有新连接 (除了不存在的连接) 设置默认事务级别。你需要SUPER权限来做这个。使用SESSION 关键字为将来在当前连接上执行的事务设置默认事务级别。 任何客户端都能自由改变会话隔离级别 (甚至在事务的中间) ,或者为下一个事务设置隔离级别。 ...

2012-02-08 · 6 min · 1242 words · -

PF_RING

PF_RING https://www.jianshu.com/p/6d3f3cdc2411 PF_RING简介 PF_RING是Luca研究出来的基于Linux内核级的高效数据包捕获技术。简单来说PF_RING 是一个高速数据包捕获库,通过它可以实现将通用 PC 计算机变成一个有效且便宜的网络测量工具箱,进行数据包和现网流量的分析和操作。同时支持调用用户级别的API来创建更有效的应用程序。 屏幕快照 2016-12-15 下午5.15.29.png 2、PF_RING的优点 现在我们知道PF_RING是拥有一套完整开发接口的高速数据包捕捉库,与我们熟知的libpcap十分相似,但其性能要优于libpcap。关于libpcap的实现机制可以参考libpcap实现机制及接口函数 问题 在传统数据包捕获的过程中, CPU的多数时间都被用在把网卡接收到的数据包经过内核的数据结构队列发送到用户空间的过程中。也就是说是从网卡–>内核, 再从内核–>用户空间,这两个步骤,花去了大量CPU时间,从而导致没有其他时间用来进行数据包的进一步处理。 在传输过程中 sk_buff 结构的多次拷贝,以及涉及用户空间和内核空间的反复系统调用极大的限制了接收报文的效率,尤其是对小报文的接收影响更为明显。 解决方案 ** PF_RING提出的核心解决方案便是减少报文在传输过程中的拷贝次数**。由下图我们可以直观的看到不同技术下对数据拷贝的优化是不同的。接下来将围绕这张图的实现路径解释PF_RING和PF_RING ZC库的实现机制。 libpcap、PF_RING、PF_RING ZC方案对比 网卡接收报文的前面的流程就是libpcap实现机制及接口函数中讲解的NAPI,主要的不同体现在报文在内核空间与用户空间的传递。 PF_RING noZC 1、PF_RING socket 针对轮询机制的不足,在轮询机制的基础上提出一种新的包捕获套接字模型,基于环形缓冲区的新的套接字 PF_RING 2、每创建一个PF _RING套接字便分配一个环形缓冲区,当这个套接字结束时释放这个缓冲区 3、PF_RING套接字绑定到某一网卡上时,这个网卡在套接字结束之前处于制度状态,当数据包到达网卡时,将其放入到环形缓冲区。如果缓冲区已经满,则将其丢弃。 4、用户空间可以直接访问这个环形缓冲区中的数据 5、当有新的数据包到来的时候,可以直接覆盖掉已经被用户空间读取过的那个数据包的空间 环形缓冲区示意图 PF_RING ZC PF_RING ZC 实现了PF_RING™ DNA(Direct NIC Access 直接网卡访问)技术。是一种映射网卡内存和寄存器到用户态的方法。 因此除了由网卡的网络处理单元完成DMA传输之外,没有任何额外的数据包复制,进一步节省了一次数据拷贝操作 这将性能更好,因为CPU周期的仅用于操作数据包,而不是把数据包从网卡挪走。 其缺点是,只有一个应用可以在某个时间打开DMA ring(请注意,现在的网卡可以具有多个RX / TX队列,从而就可以在每个队列上同时一个应用程序),换而言之,用户态的多个应用需要彼此沟通才能分发数据包。 PE_RING ZC 用户空间创建PF_RING套接字时 fd = socket(PF_RING, SOCK_RAW, htons(ETH_P_ALL)); 和基于PF_PACKET套接字的libpcap不同的是,PF_RING机制更为灵活: 1.PF_RING采用mmap的方式将网络裸数据放在一个用户态可以直接access的地方,而不是通过socket read/write机制的内存拷贝; 2.PF_RING支持下面1到3三种方式将裸数据放到mmap到用户态的环形缓冲区以及4的DNA方式: 1.按照PACKET套接字的方式从netif_receive_skb函数中抓取数据包,这是一种和PACKET套接字兼容的方式,所不同的是数据包不再通过socket IO进入用户态,而是通过mmap;(transparent_mode 0) 2.直接在NAPI层次将数据包置入到所谓的环形缓冲区,同时NAPI Polling到skb对列,对于这两个路径中的第一个而言,这是一种比2.1介绍的方式更加有效的方式,因为减少了数据包在内核路径的处理长度,但是要求网卡支持NAPI以及PF_RING接口(一般而言,NAPI会将数据包Polling到一个skb队列)。(transparent_mode 1) 3.和2相同,只是不再执行NAPI Polling。这就意味着,数据包将不会进入内核,而是直接被mmap到了用户态,这特别适合于用户态的完全处理而不仅仅是网络审计,既然内核不需要处理网络数据了,那么CPU将被节省下来用于用户态的网络处理。这可能会将内核串行的网络处理变为用户态并行的处理。(transparent_mode 2) 4.这是一种更猛的方式,唤作DNA支持的模式,直接绕过内核协议栈的所有路径,也就是说直接在网卡的芯片中将数据包传输到(DMA的方式)所谓环形缓冲区,内核将看不到任何数据包,这种方式和Intel的万兆猛卡结合将是多么令人激动的事啊;(DNA技术) E33B49AA-8CBA-4146-9AB7-A38EB076B11B.png 以上便是我们在文档中见到的transparent_mode。对于transparent_mode为0的情况,内核会通过net_if_recv_skb回调packet_rcv函数实现数据接收,所以当向系统内核插入PF_RING模块时在内核注册了packet_rcv钩子函数,使用通用的网卡驱动便可以实现向PF_RING传递报文。而对于transparent_mode为1和2的模式,则是需要使用PF_RING特殊定制的网卡驱动,并在网卡驱动中直接调用注册的包处理函数,将报文传递给PF_RING。 屏幕快照 2016-12-16 下午4.02.38.png transparent_mode是对skb_ring_handler之前的包处理路径进行优化, quick_mode是对skb_ring_handler之后的包处理过程进行优化 ...

2012-02-02 · 1 min · 97 words · -

spring 事务

spring 事务 @Transactional 使用 @Transactional 的要点有: 在DAO 层使用 JdbcTemplate 实现DB操作, 在 Service 的实现类上加上 @Transactional 注解, 不推荐在 Service 接口上加 @Transactional 注解. 需要进行事务控制的方法, 必须是 public 方法, 同时要打上 @Transactional 注解. 也可以在Class上加上 @Transactional 注解, 这样相当于给每个 public 函数加上了 @Transactional 注解, 当然我们还可以在其中的函数上加该注解, 这时候将以函数上的设置为准. @Transactional 使用陷阱: 只有 public 方法打上 @Transactional 注解, 事务控制才能生效. 注意自调用问题, @Transactional 注解仅在外部类的调用才生效, 原因是使用 Spring AOP 机制造成的. 所以: 主调函数如果是本Service类, 应该也要打上 @Transactional, 否则事务控制被忽略. 缺省的情况下, 只有 RuntimeException 类异常才会触发回滚. 如果在事务中抛出其他异常,并期望回滚事务, 必须设定 rollbackFor 参数. 例子: @Transactional(propagation=Propagation.REQUIRED,rollbackFor= MyException.class) 如果主调函数和多个被调函数都加了 @Transactional 注解, 则整个主调函数将是一个统一的事务控制范围, 甚至它们分属多个Service也能被统一事务控制着 通常我们应该使用 Propagation.REQUIRED, 但需要说明的是, 如果一个非事务方法顺序调用了"两个不同service bean"的事务函数, 它们并不在同一个事务上下文中, 而是分属于不同的事务上下文. https://www.cnblogs.com/harrychinese/p/SpringBoot_jdbc_transaction.html ...

2012-02-02 · 1 min · 81 words · -

linux version, Linux 查看版本, 发行版, 内核版本, uname

linux version, Linux 查看版本, 发行版, 内核版本, uname uname -srm # -s kernel name, ubuntu 和 archlinux 都输出的是 Linux, 没见过其它输出 # -r kernel release, 内核版本号 # -m machine hardware name, 硬件架构 x86_64 # 查看内核版本 uname -r # 打印所有信息,包括内核版本和系统名称 uname -a # archlinux, debian, ubuntu cat /etc/issue # RedHat,CentOS cat /etc/redhat-release # debian, ubuntu cat /etc/os-release #查看目录"/proc"下version的信息,也可以得到当前系统的内核版本号及系统名称 cat /proc/version file /bin/ls /proc文件系统,它不是普通的文件系统,而是系统内核的映像,也就是说,该目录中的文件是存放在系统内存之中的,它以文件系统的方式为访问系统内核数据的操作提供接口。而我们使用命令"uname -a"的信息就是从该文件获取的,当然用方法二的命令直接查看它的内容也可以达到同等效果.另外,加上参数"a"是获得详细信息,如果不加参数为查看系统名称。 查看发行版本信息 ubuntu lsb_release -a https://my.oschina.net/vshcxl/blog/698656 ...

2012-02-01 · 1 min · 194 words · -

article, 冠词

article, 冠词 定冠词 “the”。 不定冠词(“a”或“an”)。 “the”是定冠词,用在特指名词或前文已提到的名词之前。定冠词特指的名词说的是特定的事物、人物、地点等。 示例 I met the fireman who saved my dog the other day. “the fireman(消防员)”指的是我之前见过的一个特定的消防员。 “a”和“an”是不定冠词,用在泛指名词前,即用来指示非特指的内容。 示例 Publishing a book is the lifetime goal of my father. https://wordvice.ai/cn/blog/definite-indefinite-articles-a-an-the

2012-02-01 · 1 min · 33 words · -

at a time, at one time

at a time, at one time take time 意为"花费时间", take one’s time 意为"慢慢来,别着急",相当于 “don’t hurry”。 例如: A great talent takes time to mature. 大器晚成。 Take your time, we still have 20 minutes left. 别着急,我们还有20分钟的时间呢。 at a time 意为"每次;一次"。 at one time 意为"同时;曾经一度",常用于过去时。 at the time 意为"在那时;在那段时间"。常用于过去时态。 例如: Take two pills at a time. 一次服两粒。 At one time they were friends, but they are seldom together now. 他们曾经是朋友,但是现在很少在一起了。 He agreed at the time but later changed his mind. 他当时同意了,但后来又改变了主意。

2012-02-01 · 1 min · 78 words · -

IELTS, 雅思

IELTS, 雅思 a, an art. 一个 abandon v. 抛弃,放弃 abandonment n.放弃 accord [ә’kɔ:d] vt.使一致,给予

2012-02-01 · 1 min · 14 words · -

monitor

monitor 分辨率(resolution) 指给定的距离(或面积)内“点”或“像素”的数量。有时被称为“解析度”。可分为显示分辨率、图像分辨率、打印分辨率和扫描分辨率等。分辨率也经常被用来表达一些别的概念,例如谈论显示器分辨率时经常看到“1024×768”这种表示,这个更准确的说应该是屏幕的“像素尺寸”。 作者:Amy 链接:https://www.zhihu.com/question/385596412/answer/1133513546 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 作者:Amy 链接:https://www.zhihu.com/question/385596412/answer/1133513546 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 DPI, dots per inch 常用的描述分辨率的单位有:DPI(点每英寸)和 PPI(像素每英寸)。还有一些其他单位,比如px/cm(像素每厘米, dpcm)、LPI(线每英寸)等,只有LPI是描述光学分辨率的尺度的,感兴趣的自行学习,就不提了。描述分辨率的单位:DPI:dots per inch,表示每英寸(对角线长度)能打印上的墨滴数量。最初应用于打印技术中。打印设备多在 300 至 3600 DPI 之间。PPI:pixels per inch,电子显示设备从打印设备中借鉴了 DPI 的概念,产生了 PPI的概念。即显示器每英寸(对角线长度)上像素点的数量,指像素密度。DPI 和 PPI 经常混用。因为很多行业将“Dot”泛指为所有的图像基本单元。多数情况下,DPI=PPI,后面涉及到视网膜屏幕(retina)时,会提到怎么就不等了。从技术角度说:“像素/pixel” 是数字领域特有,是成像设备(“多值设备”)的最小单元,PPI 只存在于电子显示领域;“点/dot” 是输出设备(“二值设备”)最小成像单元,点非黑即白,DPI 只出现于印刷领域。在实体世界中,屏幕的物理尺寸(physical size)通常用可视画面对角线长度表示,且一般以英寸(inch)为单位,比如 iPad 的大小 10.5"、11"、12.9",都是指的屏幕的对角线长度*。屏幕的大小还可以用物理像素尺寸来表示,如“2224x1668”(iPad Pro 10.5)。指长边上和短边上最多能显示的物理像素点个数。物理像素点是每个设备生产的时候就定好了的,是无法改变的,是设备能控制显示的最小物理单位,和屏幕物理尺寸大小有关。那么勾股定律算出对角线的像素点数,利用公式分辨率=对角线上的像素数/对角线长度,我们就可以计算得到 iPad Pro 10.5 屏幕分辨率(PPI/DPI)为264。 DPI(Dots Per Inch,每英寸点数)是一个量度单位,用于点阵数码影像,指每一英寸长度中,取样、可显示或输出点的数目。此概念主要用于打印输出。 不论是DPI还是PPI,实际都是一种换算的概念,即将图片承载的信息换算为现实中的图片(即人眼能实际看到的图像)。DPI和PPI的区别在于换算的途径不同,DPI面向的是印刷受体,而PPI面向的是显示屏幕。 ubuntu自带的远程桌面是vino-server 1.vino-server vino的好处是你的控制是跟在本地是一样的,你在远程打开的窗口,当你去本地登录时会发现这些窗口都在,如果两台机器离的不远,你甚至可以看见那个桌面上的鼠标跟着你窗口的一起在移动。但缺点就是如果你想远程连上vino,那么你得先在本地登录上账号,换句话说,你远程重启机器后,就没办法在用vino登录上那台机器了。 ubuntu下开启vino的方法倒是很简单: 服务端: 系统->首选项->远程桌面 选上"允许其他人查看您的桌面"“允许其他用户控制您的桌面"愿意的话还有"要求用户输入此密码”,不要选上"请您确认"。 客户端: 直接用ubuntu默认带的"远程桌面查看器"登录就行了。 2.vnc4server vnc4的好处是可以登录多个桌面,彼此不冲突。而且不会象vino一样,必须服务端登录后才能连接。但是vnc的桌面是虚拟的,你在客户端打开的程序,在服务端是看不到的。这样有时也不太方便。 vnc4可以从新立得软件包中安装,顺便在本地把xvncviewer也装了。 安装后设定密码: vncpasswd 启用vnc服务: vncserver 第一次启动后会在用户的主目录下生成.vnc的文件夹,默认的使用的是twm的界面,有点丑,所以打开.vnc下的xstartup把最后一行twm &注释掉。在下面添加一行: gnome-session &。这样就OK了。 ...

2012-01-31 · 1 min · 89 words · -