nginx模块

nginx模块 http://wiki.jikexueyuan.com/project/nginx/model-architecture.html event module: 搭建了独立于操作系统的事件处理机制的框架,及提供了各具体事件的处理。包括 ngx_events_module, ngx_event_core_module和ngx_epoll_module 等。Nginx 具体使用何种事件处理模块,这依赖于具体的操作系统和编译选项。 phase handler: 此类型的模块也被直接称为 handler 模块。主要负责处理客户端请求并产生待响应内容,比如 ngx_http_static_module 模块,负责客户端的静态页面请求处理并将对应的磁盘文件准备为响应内容输出。 output filter: 也称为 filter 模块,主要是负责对输出的内容进行处理,可以对输出进行修改。例如,可以实现对输出的所有 html 页面增加预定义的 footbar 一类的工作,或者对输出的图片的 URL 进行替换之类的工作。 upstream: upstream 模块实现反向代理的功能,将真正的请求转发到后端服务器上,并从后端服务器上读取响应,发回客户端。upstream 模块是一种特殊的 handler,只不过响应内容不是真正由自己产生的,而是从后端服务器上读取的。 load-balancer: 负载均衡模块,实现特定的算法,在众多的后端服务器中,选择一个服务器出来作为某个请求的转发服务器。

2017-11-08 · 1 min · 34 words · -

事件驱动服务器, event-driven server

事件驱动服务器, event-driven server https://gist.github.com/jcouyang/9914091 OPPC模型瓶颈 传统服务器模型如Apache为每一个请求生成一个子进程。当用户连接到服务器的一个子进程就产生,并处理连接。每个连接获得一个单独的线程和子进程。当用户请求数据返回时,子进程开始等待数据库操作返回。如果此时另一个用户也请求返回数据,这时就产生了阻塞。 这种模式在非常小的工作负荷是表现良好,当请求的数量变得太大是服务器会压力过于巨大。 当Apache达到进程的最大数量,所有进程都变得缓慢。每个请求都有自己的线程,如果服务代码使用PHP编写时,每个进程所需要的内存量是相当大的[1]。 fork()操作延时 事实上,基于OPPC的网络并不如想象中的高效。首先新建进程的性能很大程度上依赖于操作系统对fork()的实现,然而不同操作系统的处理并非都理想。 操作系统fork操作只是简单的拷贝分页映射。动态链接为共享库和全局偏移表中的ELF (Executable and Linking Format) 部分创建太多的分页映射。虽然静态的链接fork会是的性能大幅度提升,但是延时依然不乐观。 进程调度 Linux每10毫秒 (Alpha是1毫秒,该值为已编译常量) 中断一次在运行态的进程,查看是否要切换别的进程执行。进程调度的任务就是决定下一个应该执行的进程,而其难度就在于如何公平的分配CPU资源。一个好的调度算法应该给每一个进程都分享公平的CPU资源,而且不应该出现饥饿进程。 Unix系统采用多级反馈队列调度算法。使用多个不同优先级的就绪队列,使用Heap保持队列按优先级顺序排序。Linux 2.6版本提供了一个复杂度O(1)的调度算法,将进程调度延时降至最小。但是进程调度的频率是100Hz,意味着10毫秒会中止一个进程而判断是否需要切换到另一个进程。如果切换过多,会让CPU忙于切换,导致降低吞吐量。 内存占用与线程 创建多进程会带来另外一个问题: 内存消耗。 每一个创建的进程都会占用内存,在 Linux 2.6 中的测试结果, 400个左右的连接后 fork() 的性能要超过 pthread_create() 的性能。 IBM 对 Linux 做过优化后, 一个进程可以处理 10 万个连接。 fork () 在每一个连接时都 fork() 一次成本太高,多线程在于需要考虑线程安全(thread-safe)与死锁(deadlock),以及内存泄露问题这些问题。 可靠性 该模型具有可靠性问题。一个配置不当的服务器,很容易遭受拒绝服务攻击 (DoS) 。当大量并发请求的服务器资源时,负载均衡配置不当时服务器会很快耗尽源而奔溃。 同步阻塞 I/O 在这个模型中,应用程序执行一个系统调用,这会导致应用程序阻塞。这意味着应用程序会一直阻塞,直到系统调用完成为止 (数据传输完成或发生错误) 。调用应用程序处于一种不再占用CPU,而只是简单等待响应的状态,但是该进程依然占用着资源。当大量并发I/O请求到达时,则会产生I/O阻塞,造成服务器瓶颈。 事件驱动模型服务器 通过上诉分析与实验说明,事实上,操作系统并不是设计来处理服务器工作负载。传统的线程模型是基于运行应用程序是的一些密集型操作的需要。 操作系统的设计是让用户执行的多线程程序,使后台文件写入和UI操作同时进行,而并不是设计于处理大量并发请求连接。 Fork和多线程是相当费资源的操作,创建线程需要分配一个全新的内存堆栈。此外,上下文切换也是一项开销的,CPU调度模型是并不太适合一个传统的Web服务器。 因此,OPPC模型面临着多进程多线程的延迟已经内存消耗的问题。要用OPPC模型解决C10K问题显得十分复杂。 为解决C10K问题,一些新的服务器呈现出来。下列是解决C10K问题的Web服务器: nginx: 一个基于事件驱动的处理请求架构反向代理服务器。 Cherokee: Twitter使用的开源Web服务器。 [Tornado][13]: 一个Python语言实现的非阻塞式Web服务器框架。Facebook的FriendFeed模块使用此框架完成。 Node.js: 异步非阻塞Web服务器,运行于Google V8 JavaScript引擎。 ...

2017-11-08 · 2 min · 277 words · -

TPS、QPS、RPS

TPS、QPS、RPS PPS PPS (Packet Per Second) PCT (percentile) PCT99: 99%的响应时间 “90th pct/95th pct/99th pct”分别表示测试实例按响应时间从小到大排序后,第90/95/99个测试实例的响应时间。 95%percentile : 统计学术语,如果将一组数据从小到大排序,并计算相应的累计百分位,则某一百分位所对应数据的值就称为这一百分位的百分位数。可表示为: 一组 n 个观测值按数值大小排列。如,处于 p% 位置的值称第 p 百分位数。 QPS Queries Per Second,每秒查询数。每秒能够响应的查询次数。 QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。每秒的响应请求数,也即是最大吞吐能力。 TPS Transactions Per Second 的缩写,每秒处理的事务数目。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数,最终利用这些信息作出的评估分。 TPS 的过程包括: 客户端请求服务端、服务端内部处理、服务端返回客户端。 例如,访问一个 Index 页面会请求服务器 3 次,包括一次 html,一次 css,一次 js,那么访问这一个页面就会产生一个“T”,产生三个“Q”。 PV (page view) 即页面浏览量,通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标。 PV 即 page view,页面浏览量。用户每一次对网站中的每个页面访问均被记录 1 次。用户对同一页面的多次刷新,访问量累计。 根据这个特性,刷网站的 PV 就很好刷了。 与 PV 相关的还有 RV,即重复访问者数量 (repeat visitors) 。 UV 访问数 (Unique Visitor) 指独立访客访问数,统计1天内访问某站点的用户数(以 cookie 为依据),一台电脑终端为一个访客。 ...

2017-11-08 · 1 min · 183 words · -

java spi, ServiceLoader

java spi, ServiceLoader ServiceLoader与ClassLoader是Java中2个即相互区别又相互联系的加载器.JVM利用ClassLoader将类载入内存,这是一个类声明周期的第一步 (一个java类的完整的生命周期会经历加载、连接、初始化、使用、和卸载五个阶段,当然也有在加载或者连接之后没有被初始化就直接被使用的情况) 。详情请参阅: 详解Java类的生命周期 那ServiceLoader又是什么呢?ServiceLoader: 一个简单的服务提供者加载设施。服务 是一个熟知的接口和类 (通常为抽象类) 集合。服务提供者 是服务的特定实现。提供者中的类通常实现接口,并子类化在服务本身中定义的子类。服务提供者可以以扩展的形式安装在 Java 平台的实现中,也就是将 jar 文件放入任意常用的扩展目录中。也可通过将提供者加入应用程序类路径,或者通过其他某些特定于平台的方式使其可用。……唯一强制要求的是,提供者类必须具有不带参数的构造方法,以便它们可以在加载中被实例化。 通过在资源目录META-INF/services中放置提供者配置文件 来标识服务提供者。文件名称是服务类型的完全限定二进制名称。该文件包含一个具体提供者类的完全限定二进制名称列表,每行一个。忽略各名称周围的空格、制表符和空行。注释字符为’#’(’\u0023’, NUMBER SIGN);忽略每行第一个注释字符后面的所有字符。文件必须使用 UTF-8 编码。 以延迟方式查找和实例化提供者,也就是说根据需要进行。服务加载器维护到目前为止已经加载的提供者缓存。每次调用 iterator 方法返回一个迭代器,它首先按照实例化顺序生成缓存的所有元素,然后以延迟方式查找和实例化所有剩余的提供者,依次将每个提供者添加到缓存。可以通过 reload 方法清除缓存。 …… 以上来源于Java API里的说明,也许说的很专业,让我们有点晕头转向,我们可以简单的认为: ServiceLoader也像ClassLoader一样,能装载类文件,但是使用时有区别,具体区别如下: (1) ServiceLoader装载的是一系列有某种共同特征的实现类,而ClassLoader是个万能加载器; (2) ServiceLoader装载时需要特殊的配置,使用时也与ClassLoader有所区别; (3) ServiceLoader还实现了Iterator接口。[如有错误或不到的地方敬请指出,互相学习: ) ] SPI 和 ServiceLoader 1 SPI: Service Provider Interface 一个服务(Service)通常指的是已知的接口或者抽象类,服务提供方就是对这个接口或者抽象类的实现,然后按照SPI 标准存放到资源路径META-INF/services目录下,文件的命名为该服务接口的全限定名 许多开发框架都使用了Java的SPI机制,如java.sql.Driver的SPI实现 (MySQL驱动、oracle驱动等) 、common-logging的日志接口实现、dubbo的扩展实现等等。 我们系统里抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块、jdbc模块的方案等。面向的对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。 为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。java spi就是提供这样的一个机制: 为某个接口寻找服务实现的机制。有点类似IOC的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。 java spi的具体约定如下: 当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入 1.例子 第一步: 提供一个接口和它的若干个实现: 有一个接口 package com.xihe.api; public interface XiheInterface { public void sayHi(); ...

2017-11-07 · 1 min · 166 words · -

spring rabbitmq

spring rabbitmq https://spring.io/guides/gs/messaging-rabbitmq/

2017-11-05 · 1 min · 3 words · -

raspberry ntp

raspberry ntp http://raspberrypi.tomasgreno.cz/ntp-client-and-server.html

2017-10-31 · 1 min · 3 words · -

linux enca 编码并转换

linux enca 编码并转换 enca -list languages enca -L zh_CN file 检查文件的编码 enca -L zh_CN -x UTF-8 file 将文件编码转换为"UTF-8″编码 enca -L zh_CN -x UTF-8 < file1 > file2 如果不想覆盖原文件可以这样 enca -L none file.txt http://os.51cto.com/art/201007/214344.htm http://www.shenyanchao.cn/blog/2014/11/13/encode-convert-in-linux/ http://54im.com/tag/enca

2017-10-31 · 1 min · 35 words · -

Mahonia

Mahonia Mahonia—a character-set conversion library for Go Mahonia is a character-set conversion library implemented in Go. All data is compiled into the executable; it doesn’t need any external data files. Mahonia is now deprecated. I recommend using the standard package at golang.org/x/text/encoding, possibly along with golang.org/x/net/charset https://code.google.com/archive/p/mahonia/

2017-10-31 · 1 min · 47 words · -

golang 各种数据类型转换

golang 各种数据类型转换 Conversions are expressions of the form T(x) where T is a type and x is an expression that can be converted to type T. string > duration d, e := time.ParseDuration("-1h") d, e := time.ParseDuration("1000ms") array > slice arr := [3]int{1,2,3} sli := arr[:] hex > int, big.Int // int n, err := strconv.ParseUint(val, 16, 32) // big.Int n := new(big.Int) n, _ = n.SetString(hex[2:], 16) float > int //float64 转成转成int64 var x float64 = 5.7 var y int = int64(x) int(math.Floor(f + 0.5)) base64 > hex p, err := base64.StdEncoding.DecodeString("QVJWSU4=") if err != nil { // handle error } h := hex.EncodeToString(p) fmt.Println(h) // prints 415256494e bytes > hex hex.EncodeToString(foo) string, float s := "3.1415926535" v1, err := strconv.ParseFloat(v, 32) v2, err := strconv.ParseFloat(v, 64) // float64 > string valueStr = strconv.FormatFloat(v, 'f', 3, 64) int > float i:=5 f:=float32(i) bytes > int var ba = []byte{ 56, 66, 73, 77 } var value int32 value |= int32(ba[0]) value |= int32(ba[1]) << 8 value |= int32(ba[2]) << 16 value |= int32(ba[3]) << 24 reverse the indexing order to switch between big and little endian. int8 > byte 因为两者间的类型及取值范围这些都不相同,不能直接进行转换。int8取值范围为: -128~127,如果要转化的话需要使用bytevalue=256+int8value ...

2017-10-31 · 5 min · 894 words · -

go file

go file if srcFile, err = os.Open(localPath); err != nil { logger.Errorf("failed to read src file: %v", err) return } defer srcFile.Close() fileInfo, err := srcFile.Stat() fileSize := fileInfo.Size() // file size os.PathSeparator file, _ := os.Getwd() log.Println("current path:", file) file, _ = exec.LookPath(os.Args[0]) log.Println("exec path:", file) dir,_ := path.Split(file) log.Println("exec folder relative path:", dir) os.Chdir(dir) wd, _ := os.Getwd() log.Println("exec folder absolute path:", wd) 文件复制进度 https://go.dev/play/p/N6xL8_fnV2

2017-10-31 · 1 min · 67 words · -

openssl basic

openssl basic 查看私钥长度 openssl rsa -in id_rsa.pem -text -noout get cert openssl s_client -connect site.com:636 </dev/null 2>/dev/null | openssl x509 -outform PEM > site.pem import cert into ca certs sudo keytool -importcert -noprompt -alias site-`date "+%Y%m%d%H%M%S"` -file ./site.pem -keystore /usr/java/latest/lib/security/cacerts -storepass changeit 查看证书信息 pem openssl x509 -noout -text -in ca.crt openssl x509 -noout -text -in foo.pem 查看 .der .crt 证书 openssl x509 -inform der -text -noout -in foo.crt pem 格式转 DER 格式 openssl x509 -outform der -in charles.pem -out charles.crt 查看 https 证书 openssl s_client -showcerts -connect www.baidu.com:443 # 证书链是倒序的, 从上面数第一个是叶子节点, 跟浏览器里看到的证书顺序相反. 查看 pem 证书内容 比如证书关联到了哪几个域名, 证书的有效期等. ...

2017-10-30 · 3 min · 458 words · -

emacs elpa

emacs elpa https://elpa.emacs-china.org/index-en.html emacs ~/.emacs (setq package-archives '(("gnu" . "http://elpa.emacs-china.org/gnu/") ("melpa" . "http://elpa.emacs-china.org/melpa/"))) M-x list-packages Type M-x list-packages to open the package list. Press ‘i’ to mark for installation, ‘u’ to unmark, and ‘x’ to perform the installation. Press ‘RET’ to read more about installing and using each package. https://www.emacswiki.org/emacs/InstallingPackages

2017-10-27 · 1 min · 50 words · -

nginx basic, command

nginx basic, command # Do not run, just test the configuration file. sudo nginx -t nginx -s signal # stop — fast shutdown # quit — graceful shutdown # reload — reloading the configuration file # reopen — reopening the log files almalinux install nginx sudo dnf update -y sudo dnf install nginx -y sudo systemctl enable --now nginx # install # nerdctl nerdctl run -d \ --name nginx \ --restart=always \ -p 80:80 \ -p 443:443 \ -v nginx-config:/etc/nginx \ -v nginx-www:/var/www \ -v /etc/letsencrypt:/etc/letsencrypt \ -v /etc/localtime:/etc/localtime:ro \ nginx:1.29.1 # docker docker run -d \ --name nginx \ --restart=always \ -p 80:80 \ -p 443:443 \ -v nginx-config:/etc/nginx \ -v nginx-www:/var/www \ -v /etc/letsencrypt:/etc/letsencrypt \ -v /etc/localtime:/etc/localtime:ro \ nginx:1.27.2 docker run -d \ --name nginx \ --restart=always \ -p 80:80 \ -p 443:443 \ -v nginx-config:/etc/nginx \ -v nginx-www:/var/www \ -v /etc/localtime:/etc/localtime:ro \ nginx:1.27.2 # podman podman run -d \ --name nginx \ -p 80:80 \ -p 443:443 \ -p 1022:1022 \ -v nginx-config:/etc/nginx \ -v nginx-www:/var/www \ -v nginx-cert:/etc/letsencrypt \ -v /etc/localtime:/etc/localtime:ro \ nginx:1.27.2 # nginx config text docker run --name nginx-config-test --rm -t -a stdout -v nginx-conf:/etc/nginx:ro nginx nginx -c /etc/nginx/nginx.conf -t # archlinux, mainline branch: new features, updates, bugfixes sudo pacman -S nginx-mainline # start sudo systemctl enable --now nginx # restart kill -HUP pid #stop kill -s QUIT 1628 文件下载 server { listen 8088; location /download/images { alias /home/net-files/images; # 我在这个路径下放了一张图片: fei_ji.jpg } } 下载 curl "http://my_ip_address:8088/download/images/fei_ji.jpg" > test.jpg ———————————————— 版权声明: 本文为CSDN博主「tomeasure」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接: https://blog.csdn.net/qq_29695701/article/details/86491331

2017-10-26 · 2 min · 252 words · -

正向代理, Forward Proxy, 反向代理, reverse proxy

正向代理, Forward Proxy, 反向代理, reverse proxy 正向代理是代理客户端, 为客户端收发请求, 使真实客户端对服务器不可见; 而反向代理是代理服务器端, 为服务器收发请求, 使真实服务器对客户端不可见。 正向代理, Forward Proxy 正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转交并且将获得的内容返回给客户端。正向代理的情况下客户端必须要进行一些特别的设置才能使用。 反向代理, reverse proxy 反向代理正好相反。对于客户端来说,反向代理就好像目标服务器。并且客户端不需要进行任何设置。客户端向反向代理发送请求,接着反向代理判断请求走向何处,并将请求转交给客户端,使得这些内容就好似他自己一样,一次客户端并不会感知到反向代理后面的服务,也因此不需要客户端做任何设置,只需要把反向代理服务器当成真正的服务器就好了。 区别 正向代理需要你主动设置代理服务器ip或者域名进行访问,由设置的服务器ip或者域名去获取访问内容并返回;而反向代理不需要你做任何设置,直接访问服务器真实ip或者域名,但是服务器内部会自动根据访问内容进行跳转及内容返回,你不知道它最终访问的是哪些机器。 作者: Jovi_Mac 链接: http://www.jianshu.com/p/208c02c9dd1d 來源: 简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 https://github.com/moonbingbing/openresty-best-practices/blob/master/ngx/reverse_proxy.md 什么是反向代理 反向代理 (Reverse Proxy) 方式是指用代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。 举个例子,一个用户访问 http://www.example.com/readme,但是 www.example.com 上并不存在 readme 页面,它是偷偷从另外一台服务器上取回来,然后作为自己的内容返回给用户。但是用户并不知情这个过程。对用户来说,就像是直接从 www.example.com 获取 readme 页面一样。这里所提到的 www.example.com 这个域名对应的服务器就设置了反向代理功能。 反向代理服务器,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。 反向代理典型应用场景 反向代理的典型用途是将防火墙后面的服务器提供给 Internet 用户访问,加强安全防护。反向代理还可以为后端的多台服务器提供负载均衡,或为后端较慢的服务器提供 缓冲 服务。另外,反向代理还可以启用高级 URL 策略和管理技术,从而使处于不同 web 服务器系统的 web 页面同时存在于同一个 URL 空间下。 Nginx 的其中一个用途是做 HTTP 反向代理,下面简单介绍 Nginx 作为反向代理服务器的方法。 场景描述: 访问本地服务器上的 README.md 文件 http://localhost/README.md,本地服务器进行反向代理,从 https://github.com/moonbingbing/openresty-best-practices/blob/master/README.md 获取页面内容。 ...

2017-10-26 · 1 min · 83 words · -

linux cut

linux cut cut -d ',' -f 3 # 截取前24个字符 cut -c-24 http://www.cnblogs.com/dong008259/archive/2011/12/09/2282679.html cut是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对"行"来进行分析的,并不是整篇信息分析的。 (1) 其语法格式为: cut [-bn] [file] 或 cut [-c] [file] 或 cut [-df] [file] 使用说明 cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。 如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。 主要参数 -b : 以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。 -c : 以字符为单位进行分割。 -d : 自定义分隔符,默认为制表符。 -f : 与-d一起使用,指定显示哪个区域。 -n : 取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的 范围之内,该字符将被写出;否则,该字符将被排除。 (2) cut一般以什么为依据呢? 也就是说,我怎么告诉cut我想定位到的剪切内容呢? cut命令主要是接受三个定位方法: 第一,字节 (bytes) ,用选项-b 第二,字符 (characters) ,用选项-c ...

2017-10-22 · 2 min · 414 words · -

Guava Multimap

Guava Multimap 在日常的开发工作中,我们有的时候需要构造像Map<K, List>或者Map<K, Set>这样比较复杂的集合类型的数据结构,以便做相应的业务逻辑处理。例如: 复制代码 import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Test; public class MultimapTest { Map<String, List<StudentScore>> StudentScoreMap = new HashMap<String, List<StudentScore>>(); @Test public void testStudentScore(){ for(int i=10;i<20;i++){ StudentScore studentScore=new StudentScore(); studentScore.CourseId=1001+i; studentScore.score=100-i; addStudentScore("peida",studentScore); } System.out.println("StudentScoreMap:"+StudentScoreMap.size()); System.out.println("StudentScoreMap:"+StudentScoreMap.containsKey("peida")); System.out.println("StudentScoreMap:"+StudentScoreMap.containsKey("jerry")); System.out.println("StudentScoreMap:"+StudentScoreMap.size()); System.out.println("StudentScoreMap:"+StudentScoreMap.get("peida").size()); List<StudentScore> StudentScoreList=StudentScoreMap.get("peida"); if(StudentScoreList!=null&&StudentScoreList.size()>0){ for(StudentScore stuScore:StudentScoreList){ System.out.println("stuScore one:"+stuScore.CourseId+" score:"+stuScore.score); } } } public void addStudentScore(final String stuName,final StudentScore studentScore) { List<StudentScore> stuScore = StudentScoreMap.get(stuName); if (stuScore == null) { stuScore = new ArrayList<StudentScore>(); StudentScoreMap.put(stuName, stuScore); } stuScore.add(studentScore); } } ...

2017-10-18 · 2 min · 277 words · -

ConcurrentModificationException

ConcurrentModificationException 对Vector、ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常 http://www.cnblogs.com/dolphin0520/p/3933551.html

2017-10-18 · 1 min · 3 words · -

AUTOCONF, AUTOMAKE, configure, make, make install

AUTOCONF, AUTOMAKE, configure, make, make install http://blog.csdn.net/linzhiji/article/details/6774410 这些都是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤。 ./configure是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC, 并不是需要CC或GCC,它是个shell脚本。 make是用来编译的,它从Makefile中读取指令,然后编译。 make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。 AUTOMAKE和AUTOCONF是非常有用的用来发布C程序的东西。如果你也写程序想使用AUTOMAKE和AUTOCONF,可以参考CNGNU.ORG上的相关文章。 configure ,这一步一般用来生成 Makefile,为下一步的编译做准备,你可以通过在 configure 后加上参数来对安装进行控制,比如 代码: ./configure -prefix=/usr 上面的意思是将该软件安装在 /usr 下面,执行文件就会安装在 /usr/bin (而不是默认的 /usr/local/bin), 资源文件就会安装在 /usr/share (而不是默认的/usr/local/share) 。 同时一些软件的配置文件你可以通过指定 -sys-config= 参数进行设定。 有一些软件还可以加上 -with、-enable、-without、-disable 等等参数对编译加以控制, 你可以通过允许 ./configure -help 察看详细的说明帮助。 2、make ,这一步就是编译,大多数的源代码包都经过这一步进行编译 (当然有些perl或python编写的软件需要调用perl或python来进行编译) 。 如果 在 make 过程中出现 error ,你就要记下错误代码 (注意不仅仅是最后一行) , 然后你可以向开发者提交 bugreport (一般在 INSTALL 里有提交地址) , 或者你的系统少了一些依赖库等,这些需要自己仔细研究错误代码。 make 的作用是开始进行源代码编译,以及一些功能的提供, 这些功能由他的 Makefile 设置文件提供相关的功能,比如 make install 一般表示进行安装, make uninstal 是卸载,不加参数就是默认的进行源代码编译。 make 是 Linux 开发套件里面自动化编译的一个控制程序, ...

2017-10-14 · 1 min · 186 words · -

dnscrypt

dnscrypt Server # https://github.com/Cofyc/dnscrypt-wrapper # https://github.com/jedisct1/libsodium # https://jedisct1.gitbooks.io/libsodium/content/ yum install gcc # Install libsodium wget https://download.libsodium.org/libsodium/releases/libsodium-1.0.16.tar.gz ./configure make && make check sudo make install ln -s /usr/local/lib/libsodium.so.23.1.0 /usr/lib/libsodium.so.23 ldconfig # if you install libsodium from source # install libevent # http://libevent.org/ # https://geeksww.com/tutorials/operating_systems/linux/installation/how_to_install_libevent_on_debianubuntucentos_linux.php wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz tar xzf libevent-2.1.8-stable.tar.gz cd libevent-2.1.8-stable ./configure -prefix=/opt/libevent make make install # install dnscrypt-wrapper git clone git://github.com/cofyc/dnscrypt-wrapper.git cd dnscrypt-wrapper make configure ./configure make install # set ip:port for dnscrypt on archlinux systemctl edit dnscrypt-proxy.socket https://wiki.archlinux.org/index.php/DNSCrypt_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) #start sudo systemctl start dnscrypt-proxy.service #stop sudo systemctl stop dnscrypt-proxy.socket #key, crt expired, recreate key, crt dnscrypt-wrapper -gen-crypt-keypair -crypt-secretkey-file=1.key dnscrypt-wrapper -gen-cert-file -crypt-secretkey-file=1.key -provider-cert-file=1.cert -provider-publickey-file=public.key -provider-secretkey-file=secret.key dnscrypt-wrapper -gen-crypt-keypair -crypt-secretkey-file=1.key -cert-file-expire-days=365 dnscrypt-wrapper -gen-cert-file -crypt-secretkey-file=1.key -provider-cert-file=1.cert -provider-publickey-file=public.key -provider-secretkey-file=secret.key -cert-file-expire-days=365 #restart dnscrypt server #restart dnscrypt client sample config file for client ...

2017-10-14 · 1 min · 156 words · -

go regex, 正则

go regex, 正则 nodes := []string{"foo.bar-000.x", "foo.t0.bar","foo.bar"} reg := regexp.MustCompile(`foo\.(.[^\.]*)\.{0,1}.*`) for _, v := range nodes { result := reg.FindSubmatch([]byte(v)) fmt.Println("output: ", string(result[1])) } [^a-zA-Z ]+, 匹配所有不是小写大写字母和空格的字符 . 匹配任意一个字符, 如果设置 s = true, 则可以匹配换行符 [字符类] 匹配"字符类"中的一个字符,"字符类"见后面的说明 [^字符类] 匹配"字符类"外的一个字符,"字符类"见后面的说明 \小写Perl标记 匹配"Perl类"中的一个字符,"Perl类"见后面的说明 \大写Perl标记 匹配"Perl类"外的一个字符,"Perl类"见后面的说明 [:ASCII类名:] 匹配"ASCII类"中的一个字符,"ASCII类"见后面的说明 [:^ASCII类名:] 匹配"ASCII类"外的一个字符,"ASCII类"见后面的说明 \pUnicode普通类名 匹配"Unicode类"中的一个字符(仅普通类),"Unicode类"见后面的说明 \PUnicode普通类名 匹配"Unicode类"外的一个字符(仅普通类),"Unicode类"见后面的说明 \p{Unicode类名} 匹配"Unicode类"中的一个字符,"Unicode类"见后面的说明 \P{Unicode类名} 匹配"Unicode类"外的一个字符,"Unicode类"见后面的说明 复合: xy 匹配 xy (x 后面跟随 y) x|y 匹配 x 或 y (优先匹配 x) 重复: x* 匹配零个或多个 x,优先匹配更多(贪婪) x+ 匹配一个或多个 x,优先匹配更多(贪婪) x? 匹配零个或一个 x,优先匹配一个(贪婪) x{n,m} 匹配 n 到 m 个 x,优先匹配更多(贪婪) x{n,} 匹配 n 个或多个 x,优先匹配更多(贪婪) x{n} 只匹配 n 个 x x*? 匹配零个或多个 x,优先匹配更少(非贪婪) x+? 匹配一个或多个 x,优先匹配更少(非贪婪) x?? 匹配零个或一个 x,优先匹配零个(非贪婪) x{n,m}? 匹配 n 到 m 个 x,优先匹配更少(非贪婪) x{n,}? 匹配 n 个或多个 x,优先匹配更少(非贪婪) x{n}? 只匹配 n 个 x 分组: ...

2017-10-12 · 6 min · 1122 words · -