autojump

autojump https://linux.cn/article-3401-1.html 在命令行中切换目录是最常用的操作,不过很少有比一遍又一遍重复"cd ls cd ls cd ls ……“更令人沮丧的事情了。如果你不是百分百确定你想要进入的下一个目录的名字,那么你不得不使用ls来确认,然后使用cd来进入你想要进的那一个。所幸的是,现在大量的终端和shell语言提供了强大的自动补全功能来处理该问题。但是,你仍然需要一直疯狂地敲击TAB键来干这事。如果你和我一样懒惰,你一定会对autojump感到惊喜。 autojump 是一个命令行工具,它允许你可以直接跳转到你喜爱的目录,而不用管你现在身在何处。 oh-my-zsh 自带的插件_z_,和 autojump 实现的功能是一样的,但是不用额外安装,直接在plugins=()里启用就可以了。

2017-02-22 · 1 min · 15 words · -

spring restful, spring boot, maven,gradle

spring restful, spring boot, maven,gradle spring-boot-starter-parent <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.2</version> </parent> 表示当前pom文件从spring-boot-starter-parent继承下来,在spring-boot-starter-parent中提供了很多默认的配置,这些配置可以大大简化我们的开发。 Parent Poms Features 通过继承spring-boot-starter-parent,默认具备了如下功能: Java版本 (Java8) 源码的文件编码方式 (UTF-8) 依赖管理 打包支持 动态识别资源 识别插件配置 识别不同的配置,如:application-dev.properties 和 application-dev.yml 以上继承来的特性有的并非直接继承自spring-boot-starter-parent,而是继承自spring-boot-starter-parent的父级spring-boot-dependencies 需要特别说明的是,application-dev.properties 和 application-dev.yml支持spring风格的占位符(${…​}),但是Maven项目把对占位符的支持改为(@..@),可以通过设置Maven属性resource.delimiter来重置回去。 继承spring-boot-starter-parent后,大大简化了我们的配置,它提供了丰富的常用的默认的依赖的版本定义,我们就不需要再次指定版本号: <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> 假设我们需要定制自己的版本号,可以通过下面的方式重写: spring-boot-starter-web <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> Spring Web Starter使用Spring MVC,REST和Tomcat作为默认的嵌入式服务器 Spring Boot还支持另外两个嵌入式服务器: Jetty Server Undertow Server gradle bootRun run with env java -jar xxx.jar --spring.profiles.active=prod https://tengj.github.io/2017/02/26/springboot1/ ...

2017-02-22 · 1 min · 179 words · -

idea maven mvn archetype,generate 速度缓慢问题

idea maven mvn archetype,generate 速度缓慢问题 https://my.oschina.net/u/225373/blog/468035 maven生成项目速度慢的令人发指,都在Generating project in Batch mode等待,Idea状态显示栏还在不行runing,并没有卡死。查看debug信息发现,是maven获取archetype-catalog.xml导致。 (用浏览器打开http://repo1.maven.org/maven2/archetype-catalog.xml,需要等待很长时间才能获取到。) 解决方法: 加上-DarchetypeCatalog=internal 运行参数,archetype-catalog.xml本地获取。 对于intellij idea可以再Runner加上参数。 curl http://repo1.maven.org/maven2/archetype-catalog.xml> .m2/archetype-catalog.xml -DarchetypeCatalog=local

2017-02-22 · 1 min · 21 words · -

agile backlog

agile backlog 积压列表的优先级选择必须权衡以下方面: 客户价值 (解决正确的问题) 业务价值 (产生的收益) 技术价值 (可以促进学习,减少风险,有牢靠的解决方案和智能工作流) 质量价值 (缓解风险) http://www.infoq.com/cn/articles/product-owner-raison?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global

2017-02-21 · 1 min · 12 words · -

homelab

homelab 新二级域名 在阿里云控制台添加新域名 等域名生效 drill jenkins.wiloon.com 在 wiloon.com 更新证书加入新域名, ssh aliyun podman stop nginx certbot ssh root@nginx sh /data/cert/cert.sh ssh router vi /etc/hosts /etc/init.d/dnsmasq restart DNS 192.168.50.1 Nginx 192.168.50.130 更新 nginx 在内网有梯子的机器 podman pull nginx:1.27.2 podman save 7f553e8bbc897571642d836b31eaf6ecbe395d7641c2b24291356ed28f3f2bd0>nginx.tar tar zcvf nginx.tar.gz nginx.tar scp nginx.tar.gz aliyun:~

2017-02-20 · 1 min · 45 words · -

ulimit, Linux 下设置最大文件打开数 nofile, nr_open

ulimit, Linux 下设置最大文件打开数 nofile, nr_open ulimit file-max nr_open soft limit hard limit shell 级限制 用户级限制 systemd 的 ulimit 配置 ulimit 是用于获取或者修改 shell 和 shell 创建的进程的 资源限制的一个 linux 内置命令, 是系统调用 setrlimit 的封装. ulimit 控制的是 shell 级的限制 格式 ulimit [-SHabcdefiklmnpqrstuvxPT] [limit] ulimit 参数 -a: 显示当前所有的 limit 信息。 -n: 显示可以打开最大文件描述符的数量。ulimit -n 128: 设置最大可以使用 128 个文件描述符。 -s: 线程栈大小,以 Kbytes 为单位. ulimit – s 512;限制线程栈的大小为 512 Kbytes. 操作系统栈大小 (ulimit -s) : 这个配置只影响进程的初始线程;后续用pthread_create创建的线程都可以指定栈大小。 -H: use the hard resource limit ...

2017-02-20 · 7 min · 1308 words · -

cad 旋转

cad 旋转 旋转命令快捷键: 【RO】 旋转命令使用方法: 可通过输入【RO】回车,也可直接用鼠标点击旋转命令按钮激活旋转命令 选择需要旋转的对象 空格或回车或右击,确定选择对象 确定旋转基点 确定旋转角度 http://www.mfcad.com/cad/874/14136.html

2017-02-18 · 1 min · 11 words · -

archlinux 连接 蓝牙键盘

archlinux 连接 蓝牙键盘 filco 配对 ctrl+alt+fn 忘记已配对设备 connect 长按3秒 #mac of bluetooth keyboard # 00:18:00:3C:A4:C5 bluetoothctl # show help info help # show keyboard info, paired, trusted, connected info 00:18:00:3C:A4:C5 power on devices agent on pair 00:18:00:3C:A4:C5 trust 00:18:00:3C:A4:C5 connect 00:18:00:3C:A4:C5 systemctl start bluetooth https://wiki.archlinux.org/index.php/Bluetooth_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)#.E5.AE.89.E8.A3.85 https://bbs.archlinux.org/viewtopic.php?id=217451

2017-02-17 · 1 min · 46 words · -

MTR/traceroute, 路由跟踪

MTR/traceroute, 路由跟踪 使用 MTR 诊断网络问题 MTR 是一款强大的网络诊断工具, 网络管理员使用 MTR 可以诊断和隔离网络问题,并且为上游 ISP 提供有用的网络状态报告。 MTR 是传统 traceroute 命令的进化版, 并且可以提供强大的数据样本, 因为他集合了 traceroute 和 ping 这两个命令的精华。本文带您深入了解 MTR, 从数据如何生成, 到如果正确理解报告样本并得出相应的结论。 关于网络诊断技术的基本理论请参考 network diagnostics. 如果您怀疑您的 Linux 系统有其他问题,请参考 system diagnostics 。最后,我们假定您已经掌握了 getting started guide (入门指南) 。 网络诊断相关的背景知识 网络诊断工具 例如 ping traceroute mtr 都使用的 “ICMP” 包来测试 Internet 两点之间的网络连接状况。当用户使用 ping 命令 ping 网络上的主机后, ICMP 包将会发送到目的主机,然后在目的主机返回响应。这样,就可以得知本机到目的主机 ICMP 包传输所使用的往返时间。 相对于其他命令仅仅收集传输路径或响应时间,MTR 工具会收集更多的信息,比如 连接状态,连接可用性,以及传输路径中主机的响应性。由于这些额外的信息,我们建议您尽可能完整的展现 Internet 两个主机之间的网络连接信息。接下来我们讲述如何安装 MTR 软件,以及如何看懂这款软件的输出结果。 安装 MTR # debian/ubuntu apt-get update apt-get upgrade apt-get install mtr-tiny # CentOS/Fedora yum update yum install mtr # Arch Linux pacman -Sy pacman -S mtr 使用 mtr 39.156.69.79 mtr -report google.com 如果您的本机使用的 Mac OS X 系统,可以使用 Homebre 或 MacPorts 来安装 MTR。使用 Homebrew 安装 MTR: ...

2017-02-17 · 8 min · 1659 words · -

golang 类/type

golang 类/type //类定义 type Mutex struct { state int32 sema uint32 } //扩展已定义类型 type Num int32 func (num Num) IsBigger(otherNum Num) bool { return num > otherNum } //类方法 type Once struct { m Mutex done uint32 } func (o *Once) Do(f func()) { if atomic.LoadUint32(&o.done) == 1 { return } // Slow-path. o.m.Lock() defer o.m.Unlock() if o.done == 0 { defer atomic.StoreUint32(&o.done, 1) f() } } 类声明 ...

2017-02-17 · 1 min · 132 words · -

golang 字符串/string

golang 字符串/string 判断字符串开头 import ( "fmt" "strings" ) func main() { myString := "www.topgoer.com" // Option 1: (Recommended) if strings.HasPrefix(myString, "www") { fmt.Println("Hello to you too") } else { fmt.Println("Goodbye") } } go, string, join func main() { // 将字符串数组 拼接成 字符串 // 参数: 要拼接的数组,拼接的内容 str := strings.Join([]string{`你好`, `世界`}, `,`) // 输出拼接好的字符串 println(str) } package main import "strings" func main(){ a := "hahaha" b := "hehehe" c := strings.Join([]string{a,b},",") println(c) 字符串截取 s := "abcdefg" s = string([]byte(s)[:3]) fmt.Println(s) //得到 "abc" s := "abcdefg" s = string([]byte(s)[3:]) fmt.Println(s) //得到 "efg" s := "12121211122" first3 := s[0:3] last3 := s[len(s)-3:] 字符串比较 fmt.Println("go"=="go") fmt.Println("GO"=="go") fmt.Println(strings.Compare("GO","go")) fmt.Println(strings.Compare("go","go")) fmt.Println(strings.EqualFold("GO","go")) Compare函数,区分大小写,比自建方法"==“的速度要快 ...

2017-02-17 · 1 min · 147 words · -

socks5 -> http/https proxy, privoxy/cow

‘socks5 -> http/https proxy, privoxy/cow’ curl -L git.io/cow | bash #edit /home/user0/.cow/rc listen = http://127.0.0.1:7777 proxy = socks5://127.0.0.1:1080 #config http/https proxy export http_proxy=http://127.0.0.1:7777 export https_proxy=http://127.0.0.1:7777 sudo pacman -S privoxy edit /etc/privoxy/config forward-socks5 / 127.0.0.1:1080 . listen-address 127.0.0.1:8118 sudo systemctl start privoxy proxychains ProxyChains是Linux和其他Unix下的代理工具。它可以使任何程序通过代理上网, 允许TCP和DNS通过代理隧道。ProxyChains通过一个用户定义的代理列表强制连接指定的应用程序, 直接断开接收方和发送方的连接。 ProxyChains是一个开源Unix/Linux代理工具,能够强制使任何应用的TCP连接使用SOCKS4,SOCKS或者HTTP(S)代理进行连接。 #Arch Linux sudo pacman -S proxychains-ng #Debian/Ubuntu apt-get install proxychains #Mac OS X brew install proxychains-ng # 用户级配置文件 ~/.proxychains/proxychains.conf # 系统级配置文件 vim /etc/proxychains.conf # content [ProxyList] socks5 192.168.50.205 1080 http 127.0.0.1 4321 proxychains looks for config file in following order: ...

2017-02-15 · 1 min · 190 words · -

linux 字体引擎

’linux 字体引擎' linux下主要使用xtt freetype xfs xft这四种字体引擎,以下是这四种字体引擎的区别, xtt, freetype, xfs, xft等的区别 X Window是所谓client-server结构,这里的server管显示(输出)、键盘和鼠标(输入)部分,而client则是你正在用的程序,比如编辑器。Server收集键盘和鼠标的输入,送到编辑器这一client,编辑器经过处理后,回过来再让server去显示一些字到屏幕上,来回折腾。 怎样显示一个字呢? 一个字实际上就是一个小图,如果小图上的点非黑即白,就称为黑白点阵;如果小图上的点可以有不同的亮度甚至颜色,则称为AA点阵。每个字,也就是每个小图都有固定的编号,编辑器(client)可以只告诉server某个编号,server根据该编号去找出对应的小图,这种方案就是所谓的server side font,如FreeType,X-TrueType等backend就属此类;如果编辑器自己去找小图,干脆把小图送给server去显示,这种方案就是所谓client side font,Xft属这一类。 server side font FreeType backend: 即XF86Config中的freetype模块 X-TrueType backend: 即XF86Config中的xtt模块 client side font Xft: 设置文件是fonts.conf 还有一类,xfs,跟server side font一样,client把字编码传给server,但server并不直接从字库中读出对应该编码的小图,而是把编码再传给另外的所谓font server,由font server去字库找出对应的图,返回给X server去显示,姑且将这种方式称为font server font: font server font xfs: 设置文件是X11/fs/config 不管是哪一类,最终都要去字库文件读出对应编码的小图,至少对TrueType格式的字库文件而言,xtt也好,freetype也好,Xft也好,几乎都用到了FreeType这一字库engine,虽然xtt没人继续改进,还是用FreeType 1,别人都改用FreeType 2了。正因为大家都用FreeType字库engine,使得xtt,freetype,Xft这些名字容易弄混,让人头大。解决的办法很简单:不要再去管什么xtt,不要再去管什么freetype,不要再去管什么xfs:只要弄清Xft就够了。 X字库设置必读: Juliusz Chroboczek的Fonts in XFree86 http://www.xfree86.org/~dawes/4.3.0/fonts.html 理论知识 freetype分两个主要阶段的版本: 1.x和2.x。Freetype 是开源字体渲染引擎,并不只为X设计。它的功能就是读取Truetype字体信息,如大小、分辨率、编码等,然后渲染成所需的位图数据输出。2.x与1.x 相比最大的差别就是加入了抗锯齿功能。 其中freetype和xtt是X的内部模块,都是使用freetype1来渲染字体。 xfs以服务的形式出现,也可以作为X的内部模块,使用freetype2来渲染字体。 xft也属于一个外部服务程序,以动态链接的形式提供,也就是说在需要的时候才被加载,同时也只有xft支持antialias。xft使用FontConfig来自定义和选择字体。 freetype、xtt和xfs可在X下用xlsfonts列出当前可用的X核心字体,xft可用fc-list列举当前可用字体。 这么多引擎到底用哪个好呢?freetype推荐使用2.x版本,所以如果当你使用的程序不支持xft的时候最好使用xfs。而对于中文的支持其实xtt的效果最好,因为对于小字体用函数描述法算出来的中文字体效果不能让人满意,所以很多中文字体公司就在Truetype字体里嵌入了位图字体。这些位图字体需要用特殊的方式读出来,所有的引擎中就只有xtt能做到这一点。但xtt有个问题就是速度太慢,反正我使用debian时使用xtt的时候使用 SimSun字体很慢的,但愿是我的配置有问题吧。当然了,能使用xft的时候一定要使用xft哦,xft显示出来的字体确实很漂亮,尤其是使用 Microsoft的Tahoma字体效果特别明显,你可以用fvwm配置着试一下,使用X核心字体-microsoft-tahoma-medium- r-normal-12-*-*-*-*-*-iso8859-1,然后再使用FontConfig来渲染试下xft:Tahoma:Medium: Size=12:encoding=iso8859-1,看看效果就知道了,gtk2和kde目前都采用xft来显示字体。 配置 freetype 和xtt的配置很简单,只要在/etc/X11/XF86Config-4(XFree86)或/etc/X11/xorg.conf(xorg)文件中加入FontPath 您的字体目录然后加载相应的引擎模块即可,注意的一点是freetype和xtt都是用freetype1来渲染字体不能同时使用的,只能加载其中一个模块。添加新字体时只需要在你新加的字体目录中创建fonts.dir和fonts.scale文件即可,创建方法可使用mkfontdir和 mkfontscale或者ttmkfdir,据说mkfontdir和mkfontscale创建的fonts.dir和fonts.scale有问题,但我使用时好象没遇到过问题,如果不行的话就用ttmkfdir创建fonts.scale然后再复制一个fonts.scale为 fonts.dir,具体操作可以看看man pages,进入你新建的字体目录下执行mkfontdir和mkfontscale或者执行ttmkfdir && cp fonts.scale fonts.dir即可。 (注: 如果你不知道将FontPath和LoadModule加在什么地方的话就别用X了哈) ...

2017-02-15 · 1 min · 122 words · -

FreeType

FreeType FreeType是一个免费且开源的,可移植的字体引擎,有许多程序包括游戏使用它作为字体渲染的库 FreeType is a freely available software library to render fonts.

2017-02-15 · 1 min · 12 words · -

redis sort set, 有序集, zset

redis sort set, 有序集, zset sort set, zset Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管Sorted-Sets中的成员必须是唯一的,但是分数(score)却是可以重复的 在Sorted-Set中添加、删除或更新一个成员都是非常快速的操作,其时间复杂度为集合中成员数量的对数。由于Sorted-Sets中的成员在集合中的位置是有序的,因此,即便是访问位于集合中部的成员也仍然非常高效。事实上,Redis所具有的这一特征在很多其它类型的数据库中是很难实现的,换句话说,在该点上要想达到和Redis同样的高效,在其它数据库中进行建模会非常困难。 相关命令列表 命令原型,时间复杂度,命令描述,返回值 添加, ZADD zADD key score member [score] [member] 将一个或多个member元素及其score值加入到有序集key当中。 O(log(N)), 时间复杂度中的N表示Sorted-Sets中成员的数量。 添加参数中指定的所有成员及其分数到指定key的Sorted-Set中,在该命令中我们可以指定多组score/member作为参数。如果在添加时参数中的某一成员已经存在,该命令将更新此成员的分数为新值,同时再将该成员基于新值重新排序。如果键不存在,该命令将为该键创建一个新的Sorted-Sets Value,并将score/member对插入其中。如果该键已经存在,但是与其关联的Value不是Sorted-Sets类型,相关的错误信息将被返回。 返回值: 本次操作实际插入的成员数量。 分数的范围 Redis的Sorted Set的分数范围从-(2^53)到+(2^53)。或者说是-9007199254740992 到 9007199254740992。更大的整数在内部用指数表示。 删除, ZREM ZREM key member [member …] 移除有序集key中的一个或多个成员,不存在的成员将被忽略。 O(M log(N)) 时间复杂度中N表示Sorted-Set中成员的数量,M则表示被删除的成员数量。该命令将移除参数中指定的成员,其中不存在的成员将被忽略。如果与该Key关联的Value不是Sorted-Set,相应的错误信息将被返回。 返回值: 实际被删除的成员数量。 ZCARD, 计算集合中元素的数量 ZCARD key 返回有序集key的基数。 O(1) 成员数量。获取与该Key相关联的Sorted-Sets中包含的成员数量。 返回值: 返回Sorted-Sets中的成员数量,如果该Key不存在,返回0。 ZCOUNT,score值在min和max之间的成员数量 ZCOUNT key min max 返回有序集key中,score值在min和max之间(默认包括score值等于min或max)的成员。 O(log(N)+M) 时间复杂度中的N表示Sorted-Sets中成员的数量,M则表示min和max之间元素的数量。该命令用于获取分数(score)在min和max之间的成员数量。针对min和max参数需要额外说明的是,-inf和+inf分别表示Sorted-Sets中分数的最高值和最低值。缺省情况下,min和max表示的范围是闭区间范围,即min <= score <= max内的成员将被返回。然而我们可以通过在min和max的前面添加"(“字符来表示开区间,如(min max表示min < score <= max,而(min (max表示min < score < max。 ...

2017-02-13 · 2 min · 308 words · -

设计模式, Design Pattern, Front Controller Pattern

设计模式, Design Pattern, Front Controller Pattern http://www.cnblogs.com/TonyYPZhang/p/5516192.html Front Controller Pattern, 即前端控制器模式,用于集中化用户请求,使得所有请求都经过同一个前端控制器处理,处理内容有身份验证、权限验证、记录和追踪请求等,处理后再交由分发器把请求分发到对于的处理者。 前端控制器模式主要涉及下面三个角色 前端控制器(Front Controller) - 一个处理器用于处理全部的用户请求 分发器(Dispatcher) - 把处理后的请求分发到对于的业务处理程序 视图(View) - 真正处理请求业务程序 下面是前端控制器的一个简单案例。 HomeView, StudentView 分别是具体业务处理程序。Dispatcher 用于把请求分发到对于的 View 中。FrontController 是所有用户请求的入口,进行身份验证、权限验证、记录或追踪请求日志。FrontControllerDemo 演示前端控制器模式。 代码实现 HomeView, StudentView 提供真正的业务处理逻辑 public class HomeView { public void show(){ System.out.println(“show Home view “); } } public class StudentView { public void show(){ System.out.println(“show student view “); } } Dispatcher 分发用户的请求到对应业务处理程序 public class Dispatcher { private StudentView studentView; private HomeView homeView; public Dispatcher(){ homeView = new HomeView(); ...

2017-02-12 · 1 min · 170 words · -

parallel command

parallel command https://gist.github.com/spidersea/8110433 如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等 你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作——一些无法并行的操作。数据专家们,我是在对你们说。你可能有一个4核或更多核的CPU,但我们合适的工具,例如 grep, bzip2, wc, awk, sed等等,都是单线程的,只能使用一个CPU内核。 借用卡通人物Cartman的话,“如何我能使用这些内核”? 要想让Linux命令使用所有的CPU内核,我们需要用到GNU Parallel 命令,它让我们所有的CPU内核在单机内做神奇的map-reduce操作,当然,这还要借助很少用到的–pipes 参数(也叫做–spreadstdin)。这样,你的负载就会平均分配到各CPU上,真的。 BZIP2 bzip2是比gzip更好的压缩工具,但它很慢!别折腾了,我们有办法解决这问题。 以前的做法: cat bigfile.bin | bzip2 –best > compressedfile.bz2 现在这样: cat bigfile.bin | parallel –pipe –recend ’’ -k bzip2 –best > compressedfile.bz2 尤其是针对bzip2,GNU parallel在多核CPU上是超级的快。你一不留神,它就执行完成了。 GREP 如果你有一个非常大的文本文件,以前你可能会这样: grep pattern bigfile.txt 现在你可以这样: cat bigfile.txt | parallel –pipe grep ‘pattern’ 或者这样: cat bigfile.txt | parallel –block 10M –pipe grep ‘pattern’ 这第二种用法使用了 –block 10M参数,这是说每个内核处理1千万行——你可以用这个参数来调整每个CUP内核处理多少行数据。 AWK ...

2017-02-11 · 1 min · 139 words · -

urxvt

urxvt urxvt is a highly customizable terminal emulator. # install sudo pacman -S rxvt-unicode #start rxvt-unicode urxvt # 没有的话就创建这个文件, urxvt 启动的时候自动加载 vim ~/.Xresources ! 起始的行是注释 !!$HOME/.Xresources URxvt.preeditType:Root !!调整此处设置输入法 URxvt.inputMethod:fcitx !!颜色设置 URxvt.depth:32 !!中括号内数表示透明度 URxvt.inheritPixmap:true URxvt.background:#000000 URxvt.foreground:#ffffff URxvt.colorBD:Gray95 URxvt.colorUL:Green URxvt.color1:Red2 URxvt.color4:RoyalBlue URxvt.color5:Magenta2 URxvt.color8:Gray50 URxvt.color10:Green2 URxvt.color12:DodgerBlue URxvt.color14:Cyan2 URxvt.color15:Gray95 !!URL操作 URxvt.urlLauncher:chromium URxvt.matcher.button:1 Urxvt.perl-ext-common:matcher !!滚动条设置 URxvt.scrollBar:False URxvt.scrollBar_floating:False URxvt.scrollstyle:plain !!滚屏设置 URxvt.mouseWheelScrollPage:True URxvt.scrollTtyOutput:False URxvt.scrollWithBuffer:True URxvt.scrollTtyKeypress:True !!光标闪烁 URxvt.cursorBlink:True URxvt.saveLines:3000 !!边框 URxvt.borderLess:False !!字体设置 Xft.dpi:96 URxvt.font:xft:Source Code Pro:antialias=True:pixelsize=18,xft:WenQuanYi Zen Hei:pixelsize=18 ...

2017-02-10 · 1 min · 133 words · -

进程调度

进程调度 Linux 进程调度 操作系统要实现多进程,进程调度必不可少。进程调度是对TASK_RUNNING状态的进程进行调度 (参见《linux进程状态浅析》) 。如果进程不可执行 (正在睡眠或其他) ,那么它跟进程调度没多大关系。 所以,如果你的系统负载非常低,盼星星盼月亮才出现一个可执行状态的进程。那么进程调度也就不会太重要。哪个进程可执行,就让它执行去,没有什么需要多考虑的。 反之,如果系统负载非常高,时时刻刻都有N多个进程处于可执行状态,等待被调度运行。那么进程调度程序为了协调这N个进程的执行,必定得做很多工作。协调得不好,系统的性能就会大打折扣。这个时候,进程调度就是非常重要的。 尽管我们平常接触的很多计算机 (如桌面系统、网络服务器、等) 负载都比较低,但是linux作为一个通用操作系统,不能假设系统负载低,必须为应付高负载下的进程调度做精心的设计。 当然,这些设计对于低负载 (且没有什么实时性要求) 的环境,没多大用。极端情况下,如果CPU的负载始终保持0或1 (永远都只有一个进程或没有进程需要在CPU上运行) ,那么这些设计基本上都是徒劳的。 优先级 现在的操作系统为了协调多个进程的"同时"运行,最基本的手段就是给进程定义优先级。定义了进程的优先级,如果有多个进程同时处于可执行状态,那么谁优先级高谁就去执行,没有什么好纠结的了。 那么,进程的优先级该如何确定呢?有两种方式: 由用户程序指定、由内核的调度程序动态调整。 (下面会说到) linux内核将进程分成两个级别: 普通进程和实时进程。实时进程的优先级都高于普通进程,除此之外,它们的调度策略也有所不同。 实时进程的调度 实时,原本的涵义是"给定的操作一定要在确定的时间内完成"。重点并不在于操作一定要处理得多快,而是时间要可控 (在最坏情况下也不能突破给定的时间) 。 这样的"实时"称为"硬实时",多用于很精密的系统之中 (比如什么火箭、导弹之类的) 。一般来说,硬实时的系统是相对比较专用的。 像linux这样的通用操作系统显然没法满足这样的要求,中断处理、虚拟内存、等机制的存在给处理时间带来了很大的不确定性。硬件的cache、磁盘寻道、总线争用、也会带来不确定性。 比如考虑"i++;“这么一句C代码。绝大多数情况下,它执行得很快。但是极端情况下还是有这样的可能: i的内存空间未分配,CPU触发缺页异常。而linux在缺页异常的处理代码中试图分配内存时,又可能由于系统内存紧缺而分配失败,导致进程进入睡眠; 代码执行过程中硬件产生中断,linux进入中断处理程序而搁置当前进程。而中断处理程序的处理过程中又可能发生新的硬件中断,中断永远嵌套不止……;等等…… 而像linux这样号称实现了"实时"的通用操作系统,其实只是实现了"软实时”,即尽可能地满足进程的实时需求。 如果一个进程有实时需求 (它是一个实时进程) ,则只要它是可执行状态的,内核就一直让它执行,以尽可能地满足它对CPU的需要,直到它完成所需要做的事情,然后睡眠或退出 (变为非可执行状态) 。 而如果有多个实时进程都处于可执行状态,则内核会先满足优先级最高的实时进程对CPU的需要,直到它变为非可执行状态。于是,只要高优先级的实时进程一直处于可执行状态,低优先级的实时进程就一直不能得到CPU;只要一直有实时进程处于可执行状态,普通进程就一直不能得到CPU。 (后来,内核添加了/proc/sys/kernel/sched_rt_runtime_us和/proc/sys/kernel/sched_rt_period_us两个参数,限定了在以sched_rt_period_us为周期的时间内,实时进程最多只能运行sched_rt_runtime_us这么多时间。这样就在一直有实时进程处于可执行状态的情况下,给普通进程留了一点点能够得到执行的机会。参阅《linux组调度浅析》。) 那么,如果多个相同优先级的实时进程都处于可执行状态呢?这时就有两种调度策略可供选择: SCHED_FIFO: 先进先出。直到先被执行的进程变为非可执行状态,后来的进程才被调度执行。在这种策略下,先来的进程可以行sched_yield系统调用,自愿放弃CPU,以让权给后来的进程; SCHED_RR: 轮转调度。内核为实时进程分配时间片,在时间片用完时,让下一个进程使用CPU; 强调一下,这两种调度策略仅仅针对于相同优先级的多个实时进程同时处于可执行状态的情况。 在linux下,用户程序可以通过sched_setscheduler系统调用来设置进程的调度策略以及相关调度参数;sched_setparam系统调用则只用于设置调度参数。这两个系统调用要求用户进程具有设置进程优先级的能力 (CAP_SYS_NICE,一般来说需要root权限) (参阅capability相关的文章) 。 通过将进程的策略设为SCHED_FIFO或SCHED_RR,使得进程变为实时进程。而进程的优先级则是通过以上两个系统调用在设置调度参数时指定的。 对于实时进程,内核不会试图调整其优先级。因为进程实时与否?有多实时?这些问题都是跟用户程序的应用场景相关,只有用户能够回答,内核不能臆断。 综上所述,实时进程的调度是非常简单的。进程的优先级和调度策略都由用户定死了,内核只需要总是选择优先级最高的实时进程来调度执行即可。唯一稍微麻烦一点的只是在选择具有相同优先级的实时进程时,要考虑两种调度策略。 普通进程的调度 实时进程调度的中心思想是,让处于可执行状态的最高优先级的实时进程尽可能地占有CPU,因为它有实时需求;而普通进程则被认为是没有实时需求的进程,于是调度程序力图让各个处于可执行状态的普通进程和平共处地分享CPU,从而让用户觉得这些进程是同时运行的。 与实时进程相比,普通进程的调度要复杂得多。内核需要考虑两件麻烦事: 一、动态调整进程的优先级 按进程的行为特征,可以将进程分为"交互式进程"和"批处理进程": 交互式进程 (如桌面程序、服务器、等) 主要的任务是与外界交互。这样的进程应该具有较高的优先级,它们总是睡眠等待外界的输入。而在输入到来,内核将其唤醒时,它们又应该很快被调度执行,以做出响应。比如一个桌面程序,如果鼠标点击后半秒种还没反应,用户就会感觉系统"卡"了; 批处理进程 (如编译程序) 主要的任务是做持续的运算,因而它们会持续处于可执行状态。这样的进程一般不需要高优先级,比如编译程序多运行了几秒种,用户多半不会太在意; 如果用户能够明确知道进程应该有怎样的优先级,可以通过nice、setpriority (非实时进程优先级的设置) 系统调用来对优先级进行设置。 (如果要提高进程的优先级,要求用户进程具有CAP_SYS_NICE能力。 然而应用程序未必就像桌面程序、编译程序这样典型。程序的行为可能五花八门,可能一会儿像交互式进程,一会儿又像批处理进程。以致于用户难以给它设置一个合适的优先级。再者,即使用户明确知道一个进程是交互式还是批处理,也多半碍于权限或因为偷懒而不去设置进程的优先级。 (你又是否为某个程序设置过优先级呢?) ...

2017-02-10 · 2 min · 385 words · -

maven dependency version range

maven dependency version range http://maven.apache.org/components/enforcer/enforcer-rules/versionRanges.html Version Range Specification The [RequireMavenVersion][1] and [RequireJavaVersion][2] rules use the [standard Maven version range syntax][3]{.externalLink} with one minor change for ease of use (denoted with *): Range Meaning 1.0 x >= 1.0 * The default Maven meaning for 1.0 is everything (,) but with 1.0 recommended. Obviously this doesn't work for enforcing versions here, so it has been redefined as a minimum version. (,1.0] x <= 1.0 (,1.0) x < 1.0 [1.0] x == 1.0 [1.0,) x >= 1.0 (1.0,) x > 1.0 (1.0,2.0) 1.0 < x < 2.0 [1.0,2.0] 1.0 <= x <= 2.0 (,1.0],[1.2,) x <= 1.0 or x >= 1.2. Multiple sets are comma-separated (,1.1),(1.1,) x != 1.1 http://maven.apache.org/components/enforcer/enforcer-rules/requireMavenVersion.html http://maven.apache.org/components/enforcer/enforcer-rules/requireJavaVersion.html http://docs.codehaus.org/display/MAVEN/Dependency+Mediation+and+Conflict+Resolution#DependencyMediationandConflictResolution-DependencyVersionRanges

2017-02-08 · 1 min · 119 words · -