influxdb lsm tsm

influxdb lsm tsm 底层采用自研的TSM存储引擎,TSM也是基于LSM的思想,提供极强的写能力以及高压缩率。 数据库 数据库的本质上是完成四件事情, 插入数据, 删除数据, 修改数据, 查询数据。 也就是我们常说的CRUD。 市面上现在流行的数据库大致有两类, 1. 基于日志结构的储存引擎。大部分的 Nosql 数据库都是此类, 面向页的存储引擎: Mysql 极简key-value型数据库 第一版需要实现的功能: 1. 插入数据 2. 查询数据 #!/bin/hash db_set() { echo "$1,$2" >> database } db_get() { grep "^$1, "database | sed -e "s/^$1,//" | tail -n 1 } 上面我们用两个Bash 函数实现了一个Key-value型数据库,用文件读写的方式将数据记录到磁盘上。 每行是用逗号分割的key,value 形式。 (这种存储方式也叫CSV文件格式) db_set() : 追加到文件尾 db_get() : 遍历所有匹配key 的行, 用sed 命令把key, 替换成空字符串, 并输出最后一行。 至于删除, 我们可以再写入一条数据, 在key,value 后面追加一个墓碑标记。 查询的时候,如果最新的一条数据有墓碑标记, 则代表该数据已被删除。 考虑下这个数据库的性能: 空间上: 当我们修改key 对应的值, 是采用追加写入文件的方式, 会造成存在很多重复的键, 过于占用磁盘空间, 当使用一段时间,磁盘空间可能就会被耗尽。 时间上: 读数据需要整体遍历一遍文件, 当我们数据量非常大的时候查询速度将会变得非常慢。 对于一个数据库, 我们认为查询数据的时候O(logn) 或者O(1)的时间复杂度是可接受的。 ...

2012-01-13 · 2 min · 282 words · -

html tag

html tag [code lang=html] HTML 标签 以下代码标记了一个段落: This is some text in a very short paragraph inpiut type: button checkbox file hidden image password radio reset submit text 规定 input 元素的类型。 value: 定义input 元素的值。 textarea: 定义多行的文本输入控件

2012-01-08 · 1 min · 36 words · -

golang log

golang log seelog https://github.com/cihub/seelog log, glog, logrus https://sites.google.com/site/kjellhedstrom2/g2log-efficient-background-io-processign-with-c11/g2log-vs-google-s-glog-performance-comparison https://logmatic.io/blog/our-guide-to-a-golang-logs-world/ https://www.goinggo.net/2013/11/using-log-package-in-go.html http://legendtkl.com/2016/03/11/go-log/ log 首先是golang自带的package log。使用godoc查看,godoc -http=:8001,然后就可以在localhost:8001/pkg/log就可以查看了。 最重要的是SetOutput这个函数,原型是func SetOutput(w io.Writer),决定了log应该输出到什么地方,默认是标准输出。下面是把log输出到文件的一个简单代码示例。 package main import ( “log” “os” ) func main() { f, err := os.OpenFile(“logfile.log”, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { log.Fatalf(“file open error : %v”, err) } defer f.Close() log.SetOutput(f) log.Println(“This is a test log entry”) } 我们此时打开文件logfile.log,会看到文件内容如下。 2016/03/11 17:54:10 This is a test log entry 有时候我们并不需要前面的日期以及时间信息,比如做自动化测试的时候比对log肯定不希望有时间信息。那应该怎么办呢?这时候就该SetFlags()出场了。 package main import ( “log” “os” ) func main() { f, err := os.OpenFile(“logfile.log”, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) ...

2012-01-08 · 2 min · 278 words · -

Dsniff

Dsniff Dsniff 是一个著名的网络嗅探工具包。其开发者Dug Song早在1999年12月,以密歇根大学CITI研究室 (Center for Information Technology Integration) 的研究成果为基础,开发了这个后来具有很大影响力的网络安全工具包。Dug Song开发Dsniff的本意是揭示网络通信的不安全性,借助这个工具包,网络管理员可以对自己的网络进行审计,也包括渗透测试。但万事总有其两面 性,Dsniff所带来的负面作用也是"巨大"的,首先它是可以自由获取的,任何拥有这个工具包的人都可能做"非正当"的事,其次,Dsniff里面的某 些工具,充分揭示了一些安全协议的"不安全性",例如针对SSH1和SSL的MITM (Man-In-The-Middle) 攻击工具—SSHmitm和 Webmitm。SSH1和SSL都是建立网络通信加密通道的机制,向来被认为是很安全的,但人们在具体使用时,往往因为方便性上的考虑而忽视了某些环 节,造成实事上的不安全。所以说,最大的不安全性,往往并不在于对安全的一无所知,而在于过于相信自己的安全。 Dub Song在2000年12月发布了Dsniff的v2.3版本,该版本支持OpenBSD、Linux、Solaris系统平台。目前,最新版本是 2001年3月发布的v2.4b1的Beta版 除了针对Unix系统的版本,从网上也可以得到Windows平台上运行的Dsniff早期版 作为一个工具集,dsniff包括的工具分为四类: 纯粹被动地进行网络活动监视的工具,包括: dsniff、filesnarf、mailsnarf 、msgsnarf、urlsnarf、webspy 针对SSH和SSL的MITM (Man-In-The-Middle) “攻击"工具,包括sshmitm和webmitm 发起主动欺骗的工具,包括: arpspoof、dnsspoof、macof 其它工具,包括tcpkill、tcpnice dsniff的安装 sudo pacman -S dsniff 安装完成后,默认 dsniff 的安装目录是 /usr/local/sbin,在这里可以看到 dsniff 所有的工具 dsniff工具介绍 纯粹被动地进行网络活动监视的工具,包括: dsniff、filesnarf、mailsnarf 、msgsnarf、urlsnarf、webspy 针对SSH和SSL的MITM (Man-In-The-Middle) “攻击"工具,包括sshmitm和webmitm 发起主动欺骗的工具,包括: arpspoof、dnsspoof、macof 其它工具,包括tcpkill、tcpnice dsniff dsniff 是一个密码侦测工具,他能够自动分析端口上收到的某些协议的数据包,并获取相应的密码。 dnisff 支持的协议有 FTP, Telnet, SMTP, HTTP, POP, poppass, NNTP, IMAP, SNMP, LDAP, Rlogin, RIP, OSPF, PPTP MS-CHAP, NFS, VRRP, YP/NIS, SOCKS, X11, CVS, IRC, AIM, ICQ, Napster, PostgreSQL, Meeting Maker, Citrix ICA, Symantec pcAnywhere, NAI Sniffer, Microsoft SMB, Oracle SQL*Net, Sybase and Microsoft SQL。 ...

2012-01-08 · 2 min · 344 words · -

Session

Session session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction与session在某些语境下的含义是相同的。 session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个 session。 有时候我们可以看到这样的话"在一个浏览器会话期间,…",这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭这个期间 ①。 最混乱的是"用户 (客户端) 在一次会话期间"这样一句话,它可能指用户的一系列动作 (一般情况下是同某个具体目的相关的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的过程,有时候也被称为一个transaction) ,然而有时候也可能仅仅是指一次连接,也有可能是指含义①,其中的差别只能靠上下文来推断②。 然而当session一词与网络协议相关联时,它又往往隐含了"面向连接"和/或"保持状态"这样两个含义, “面向连接"指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到对方接了电话通信才能开始,与此相对的是写信,在你把信发出去的时候你并不能确认对方的地址是否正确,通信渠道不一定能建立,但对发信人来说,通信已经开始了。“保持状态"则是指通信的一方能够把一系列的消息关联起来,使得消息之间可以互相依赖,比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有"一个TCP session"或者 “一个POP3 session"③。 而到了web服务器蓬勃发展的时代,session在web开发语境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器之间保持状态的解决方案④。 有时候session也用来指这种解决方案的存储结构,如"把xxx保存在session 里"⑤。 由于各种用于web开发的语言在一定程度上都提供了对这种解决方案的支持,所以在某种特定语言的语境下,session也被用来指代该语言的解决方案,比如经常把Java里提供的javax.servlet.http.HttpSession简称为session⑥。 鉴于这种混乱已不可改变,本文中session一词的运用也会根据上下文有不同的含义,请大家注意分辨。 在本文中,使用中文"浏览器会话期间"来表达含义①, 使用"session机制"来表达含义④, 使用"session"表达含义⑤, 使用具体的"HttpSession"来表达含义⑥ HTTP协议与状态保持 HTTP 协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的,好比一个顾客和一个自动售货机或者一个普通的 (非会员制) 大卖场之间的关系一样。 然而聪明 (或者贪心?) 的人们很快发现如果能够提供一些按需生成的动态信息会使web变得更加有用,就像给有线电视加上点播功能一样。这种需求一方面迫使HTML逐步添加了表单、脚本、DOM等客户端行为,另一方面在服务器端则出现了CGI规范以响应客户端的动态请求,作为传输载体的HTTP协议也添加了文件上载、 cookie这些特性。其中cookie的作用就是为了解决HTTP协议无状态的缺陷所作出的努力。至于后来出现的session机制则是又一种在客户端与服务器之间保持状态的解决方案。 让我们用几个例子来描述一下cookie和session机制之间的区别与联系。笔者曾经常去的一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微乎其微,这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案: 该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。 发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。 发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。 由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,因此,后面两种方案就成为现实的选择。具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。 理解cookie机制 cookie机制的基本原理就如上面的例子一样简单,但是还有几个问题需要解决: “会员卡"如何分发;“会员卡"的内容;以及客户如何使用"会员卡”。 正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。 而cookie 的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。意思是麦当劳的会员卡只能在麦当劳的店里出示,如果某家分店还发行了自己的会员卡,那么进这家店的时候除了要出示麦当劳的会员卡,还要出示这家店的会员卡。 cookie的内容主要包括: 名字,值,过期时间,路径和域。 其中域可以指定某一个域比如 .google.com,相当于总店招牌,比如宝洁公司,也可以指定一个域下的具体某台机器比如 www.google.com 或者 froogle.google.com,可以用飘柔来做比。 路径就是跟在域名后面的URL路径,比如/或者/foo等等,可以用某飘柔专柜做比。 路径与域合在一起就构成了cookie的作用范围。 如果不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的 cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。 存储在硬盘上的cookie 可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。对于IE,在一个打开的窗口上按 Ctrl-N (或者从文件菜单) 打开的窗口可以与原窗口共享,而使用其他方式新开的IE进程则不能共享已经打开的窗口的内存cookie;对于 Mozilla Firefox0.8,所有的进程和标签页都可以共享同样的cookie。一般来说是用javascript的window.open打开的窗口会与原窗口共享内存cookie。浏览器对于会话cookie的这种只认cookie不认人的处理方式经常给采用session机制的web应用程序开发者造成很大的困扰。 下面就是一个goolge设置cookie的响应头的例子 HTTP/1.1 302 FoundLocation: http://www.google.com/intl/zh-CN/Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.comContent-Type: text/html 这是使用HTTPLook这个HTTP Sniffer软件来俘获的HTTP通讯纪录的一部分 ...

2012-01-08 · 1 min · 166 words · -

deb

deb 安装deb文件 dpkg -i filename.deb deb卸载 打开新立得软件包管理器 sudo synaptic 在左侧的选择框中选择Installed(local or obsolete, 再在右侧的选择框中查找需要卸载的deb包, 如果知道deb包名,直接点击 [搜索]输入包名 选择要删的包,右击,选择[标记以便删除] The difference between “Mark for Removal” and “Mark for Complete Removal” in Synaptic Package Manager: Mark for removal removes the package, but not the configuration files associated with the package. It is equivalent to apt-get remove package_name Mark for Complete Removal purges the package, i.e. removes both the package files and its configuration. It is equivalent to ...

2012-01-08 · 1 min · 84 words · -

linux ftp

linux ftp 安装: apt-get install vsftpd 默认设置: 家目录/srv/ftp ……在/etc/password 中可以查到. 允许匿名访问. /etc/ftpusers 记录着不允许访问FTP服务器的用户名单.默认排除了root 启动服务 /etc/init.d/./vsftpd start 重启服务 /etc/init.d/./vsftpd restart 停止服务 /etc/init.d/./vsftpd stop 修改/etc/vsftpd.conf listen=yes (独立的VSFTPD服务器) anonymous_enable=yes (允许匿名登陆) local_enable=NO (禁止本地系统用户) write_enable=NO (不开放本地用户写权限) anon_upload_enable=NO (匿名用户上传权限) anon_mkdir_write_enable=NO (关闭可上传目录并关闭在此目录上传权限) anon_other_write_enable=NO (关闭匿名帐户的删除权限) anon_world_readable_only=YES (禁止匿名拥护下载具有全局读取权限的文件) hide_ids=YES (目录中用户和组信息列取都显示为ftp) ls_recurse_enable=NO (禁止ls -R 递归查询) dirmessage_enable=yes (切换目录时,显示目录下.message的内容) local_umask=022 (FTP上本地的文件权限,默认是077) connect_form_port_20=yes (启用FTP数据端口的数据连接) * xferlog_enable=yes (激活上传和下传的日志) xferlog_std_format=yes (使用标准的日志格式) ftpd_banner=XXXXX (欢迎信息) pam_service_name=vsftpd (验证方式)

2012-01-07 · 1 min · 60 words · -

AOP

AOP(Aspect-Oriented Programming,面向切面编程)是对 OOP 的补充,用于将横切关注点(cross-cutting concerns)从业务逻辑中分离出来,集中管理。典型横切关注点包括:日志记录、事务管理、权限校验、性能监控、缓存、同步等——这些逻辑如果分散在每个方法里,既冗余又难以维护。 AOP 实际是 GoF 设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP 可以说也是这种目标的一种实现。 AOP 解决了什么问题 在没有 AOP 的情况下,每个业务方法都要亲自处理横切逻辑: // 没有 AOP:每个方法都要重复写日志、事务、权限检查 public User findById(Long id) { log.info("开始查询 user={}", id); // 日志 checkPermission("user:read"); // 权限 Transaction tx = db.beginTransaction(); // 事务 try { User user = db.query(id); // 真正的业务逻辑 tx.commit(); return user; } catch (Exception e) { tx.rollback(); throw e; } finally { log.info("查询结束"); // 日志 } } 这带来三个问题: ...

2012-01-07 · 4 min · 775 words · -

hexdump command

hexdump command, 以 16 进制查看文件, 以十六进制查看文件 hexdump -e '16/1 "%02X " "\n"' hexdump -C foo.bin # 大文件可以和 less 配合使用 hexdump -C foo.bin | less echo /etc/passwd | hexdump echo /etc/passwd | xxd echo /etc/passwd | hexdump -C hexdump 命令一般用来查看"二进制"文件的十六进制编码,但实际上它的用途不止如此, 手册页上的说法是"ascii, decimal, hexadecimal, octal dump", 这也就是本文标题为什么要将"十六"给引起来的原因,而且它能查看任何文件,而不只限于二进制文件了。 另外还有xxd和od也可以做类似的事情,但是我从未用过。在程序输出二进制格式的文件时,常用hexdump来检查输出是否正确。 当然也可以使用Windows上的UltraEdit32之类的工具查看文件的十六进制编码,但Linux上有现成的工具,何不拿来用呢。 参数 -C,显示结果分为三列 (文件偏移量、字节的十六进制、ASCII字符) 。 od echo /etc/passwd | od -x 0000000 652f 6374 702f 7361 7773 0a64 0000014 # 规范的十六进制和ASCII码显示 (Canonical hex+ASCII display ) echo /etc/passwd | hexdump -C 00000000 2f 65 74 63 2f 70 61 73 73 77 64 0a |/etc/passwd.| ...

2012-01-02 · 2 min · 325 words · -

dd command

dd command 创建指定大小的文件, 生成文件 文件内容为全 0 (因从/dev/zero中读取,/dev/zero为0源) 。但是这样为实际写入硬盘,文件产生速度取决于硬盘读写速度,如果想要产生超大文件,速度很慢。 # 生成一个大小为 5G 的文件 dd if=/dev/zero of=foo.bin bs=1G count=5 # 100M 的文件 dd if=/dev/zero of=foo.bin bs=1M count=100 # 100KB dd if=/dev/zero of=foo.bin bs=1K count=100 # 6个字节的 dd if=/dev/zero of=./foo.bin bs=6 count=1 创建稀疏文件 在某种场景下,我们只想让文件系统认为存在一个超大文件在此,但是并不实际写入硬盘。则可以使用 seek dd of=foo.bin bs=1k seek=5120 count=0 参数 if=FILE : 指定输入文件,若不指定则从标注输入读取。这里指定为 /dev/zero 是Linux的一个伪文件,它可以产生连续不断的 null 流 (二进制的0) of=FILE : 指定输出文件,若不指定则输出到标准输出 bs=BYTES : 每次读写的字节数,可以使用单位 K、M、G 等等。另外输入输出可以分别用 ibs、obs 指定,若使用 bs,则表示是 ibs 和 obs 都是用该参数 count=BLOCKS : 读取的 block 数,block 的大小由 ibs 指定 (只针对输入参数) dd 的主要选项: 指定数字的地方若以下列字符结尾乘以相应的数字: b=512, c=1, k=1024, w=2, xm=number m if=file 输入文件名,缺省为标准输入。 ...

2012-01-02 · 3 min · 439 words · -

java中Class.getResource用法

java中Class.getResource用法 用JAVA获取文件,听似简单,但对于很多像我这样的新人来说,还是掌握颇浅,用起来感觉颇深,大常最经常用的,就是用JAVA的File类,如要取得c:/test.txt文件,就会这样用File file = new File(“c:/test.txt”);这样用有什么问题,相信大家都知道,就是路径硬编码,对于JAVA精神来说,应用应该一次成型,到处可用,并且从现实应用来讲,最终生成的应用也会部署到Windows外的操作系统中,对于linux来说,在应用中用了c:/这样的字样,就是失败,所以,我们应该尽量避免使用硬编码,即直接使用绝对路径。 在Servlet应用中,有一个getRealPath(String str)的方法,这个方法尽管也可以动态地获得文件的路径,不秘直接手写绝对路径,但这也是一个不被建议使用的方法,那么,我们有什么方法可以更好地获得文件呢? 那就是Class.getResource()与Class.getResourceAsStream()方法,但很多人还是不太懂它的用法,因为很多人 (比如不久前的我) 都不知道应该传怎么样的参数给它,当然,有些人己经用得如火纯青,这些人是不需要照顾的,在此仅给不会或者还不是很熟的人解释一点点。 比如我们有以下目录 |-project |-src |-javaapplication |-Test.java |-file1.txt |-file2.txt |-build |-javaapplication |-Test.class |-file3.txt |-file4.txt 在上面的目录中,有一个src目录,这是JAVA源文件的目录,有一个build目录,这是JAVA编译后文件(.class文件等) 的存放目录 那么,我们在Test类中应该如何分别获得 file1.txt file2.txt file3.txt file4.txt这四个文件呢? 首先讲file3.txt与file4.txt file3.txt: 方法一: File file3 = new File(Test.class.getResource(“file3.txt”).getFile()); 方法二: File file3 = new File(Test.class.getResource("/javaapplication/file3.txt").getFile()); 方法三: File file3 = new File(Test.class.getClassLoader().getResource(“javaapplication/file3.txt”).getFile()); file4.txt: 方法一: File file4 = new File(Test.class.getResource("/file4.txt").getFile()); 方法二: File file4 = new File(Test.class.getClassLoader().getResource(“file4.txt”).getFile()); 很好,我们可以有多种方法选择,但是file1与file2文件呢?如何获得? 答案是,你只能写上它们的绝对路径,不能像file3与file4一样用class.getResource()这种方法获得,它们的获取方法如下 假如整个project目录放在c:/下,那么file1与file2的获取方法分别为 file1.txt 方法一: File file1 = new File(“c:/project/src/javaapplication/file1.txt”); ...

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

Java反射机制

Java反射机制 通过反射取对象的属性值 import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; public class ReflectTest { public static void main(String[] args) { Foo foo = new Foo(); foo.setBar("xxx"); Map map = new HashMap(); map.put("foo", "bar"); foo.setTags(map); Class fooClass = foo.getClass(); System.out.println("name:" + fooClass.getName()); try { Field[] fields = fooClass.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); System.out.println("field: " + field.getName()); Object obj = field.get(foo); System.out.println(obj); } Field field0 = fooClass.getDeclaredField("bar"); System.out.println(field0); } catch (Exception e) { e.printStackTrace(); } } } class Foo { private String bar; private Map<String, String> tags; public void setBar(String bar) { this.bar = bar; } public void setTags(Map tags) { this.tags = tags; } } Reflection 是Java被视为动态 (或准动态) 语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers (诸如public, static 等等) 、superclass (例如Object) 、实现之interfaces (例如Cloneable) ,也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。本文借由实例,大面积示范Reflection APIs。 ...

2012-01-02 · 6 min · 1215 words · -

java this super

java this super 在Java中,this通常指当前对象,super则指父类的。当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便 可以利用this来实现这个目的,当然,this的另一个用途是调用当前对象的另一个构造函数,这些马上就要讨论。如果你想引用父类的某种东西,则非 super莫属。由于this与super有如此相似的一些特性和与生俱来的某种关系,所以我们在这一块儿来讨论,希望能帮助你区分和掌握它们两个。 在一般方法中 最普遍的情况就是,在你的方法中的某个形参名与当前对象的某个成员有相同的名字,这时为了不至于混淆,你便需要明确使用this关键字来指明你要使用某 个成员,使用方法是"this.成员名",而不带this的那个便是形参。另外,还可以用"this.方法名"来引用当前对象的某个方法,但这时this 就不是必须的了,你可以直接用方法名来访问那个方法,编译器会知道你要调用的是那一个。下面的代码演示了上面的用法: public class DemoThis{ private String name; private int age; DemoThis(String name,int age){ setName(name); //你可以加上this来调用方法,像这样: this.setName(name);但这并不是必须的 setAge(age); this.print(); } public void setName(String name){ this.name=name;//此处必须指明你要引用成员变量 } public void setAge(int age){ this.age=age; } public void print(){ System.out.println(“Name="+name+” Age="+age);//在此行中并不需要用this,因为没有会导致混淆的东西 } public static void main(String[] args){ DemoThis dt=new DemoThis(“Kevin”,“22”); } } 这段代码很简单,不用解释你也应该能看明白。在构造函数中你看到用this.print(),你完全可以用print()来代替它,两者效果一样。下面我们修改这个程序,来演示super的用法。 class Person{ public int c; private String name; private int age; protected void setName(String name){ this.name=name; } protected void setAge(int age){ ...

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

java.lang.Class类

java.lang.Class类 Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。 Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象。 虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类 (型) 都有一个Class对象。运行程序时,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。 基本的 Java 类型 (boolean、byte、char、short、int、long、float 和 double) 和关键字 void 也都对应一个 Class 对象。 每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。 一般某个类的Class对象被载入内存,它就用来创建这个类的所有对象。 一、如何得到Class的对象呢?有三种方法可以的获取: 调用Object类的getClass()方法来得到Class对象,这也是最常见的产生Class对象的方法。例如: MyObject x; Class c1 = x.getClass(); 使用Class类的中静态forName()方法获得与字符串对应的Class对象。例如: Class c2=Class.forName(“MyObject”),Employee必须是接口或者类的名字。 获取Class类型对象的第三个方法非常简单。如果T是一个Java类型,那么T.class就代表了匹配的类对象。例如 Class cl1 = Manager.class; Class cl2 = int.class; Class cl3 = Double[].class; 注意: Class对象实际上描述的只是类型,而这类型未必是类或者接口。例如上面的int.class是一个Class类型的对象。由于历史原因,数组类型的getName方法会返回奇怪的名字。 二、Class类的常用方法 getName() 一个Class对象描述了一个特定类的属性,Class类中最常用的方法getName以 String 的形式返回此 Class 对象所表示的实体 (类、接口、数组类、基本类型或 void) 名称。 newInstance() Class还有一个有用的方法可以为类创建一个实例,这个方法叫做newInstance()。例如: x.getClass.newInstance(),创建了一个同x一样类型的新实例。newInstance()方法调用默认构造器 (无参数构造器) 初始化新建对象。 ...

2012-01-02 · 2 min · 276 words · -

数组

数组 线性表 (Linear List) 每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表… 数组支持随机访问,根据下标随机访问的时间复杂度为 O(1) 数组简单易用,在实现上使用的是连续的内存空间,可以借助 CPU 的缓存机制,预读数组中的数据,所以访问效率更高。而链表在内存中并不是连续存储,所以对 CPU 缓存不友好,没办法有效预读。 一维数组的声明方式: type var[]; 或type[] var; 声明数组时不能指定其长度 (数组中元素的个数) , Java中使用关键字new创建数组对象,格式为: 数组名 = new 数组元素的类型 [数组元素的个数] 实例: TestNew.java: 程序代码: public class TestNew { public static void main(String args[]) { int[] s ; int i ; s = new int[5] ; for(i = 0 ; i < 5 ; i++) { s[i] = i ; } for(i = 4 ; i >= 0 ; i–) { System.out.println("" + s[i]) ; } } } 初始化: ...

2012-01-02 · 2 min · 256 words · -

Linux存储设备的两种表示方法

Linux存储设备的两种表示方法 作者: 北南南北 LinuxSir.Org 摘要: 硬盘和硬盘分区在Linux都表示为设备,按我们通俗的说法来说,就是怎么来表示或描述硬盘和或硬盘分区,但这种描述应该是科学和具体的;比如IDE硬 盘,在Linux 可以表示为 /dev/hda、/dev/hdb … ;SCSI 接口的硬盘、SATA接口的硬盘表示为/dev/sda、/dev/sdb … … ;而IDE接口的硬盘/dev/hda,也可以表示为hd0 ,而 SCSI 接口的如果是 /dev/sda ,另一种表示方法是sd0; 理解两种表示方法有何用?至少GRUB引导管理器用到这些知识;另外我们mount (挂载)文件系统 (分区) ,也会用到这些知识; 目录索引 一、对于IDE接口的硬盘的两种表示方法;1、IDE接口硬盘,对于整块硬盘的两种表示方法; 2、IDE接口硬盘分区的两种表示方法;1) 硬盘分区的第一种表示方法/dev/hd[a-z]X; 硬盘分区的第二种表示方法(hd[0-n],y);二、关于SATA和SCSI接口的硬盘的两种表示方法; 三、usb及1394接口的存储设备和软驱设备; 四、关于存储设备的不同的表示方法的应用;1、/dev/hd[a-z] 表示方法的应用;1) 用于mount 挂载文件系统 (分区) 之用; 用于GRUB中指定Linux的根分区的位置;2、hd[0-n] 表示方法的应用;五、关于本文; 六、参考文档; 六、相关文档; 一、对于IDE接口的硬盘的两种表示方法; 1、IDE接口硬盘,对于整块硬盘的两种表示方法; IDE接口中的整块硬盘在Linux系统中表示为/dev/hd[a-z],比如/dev/hda,/dev/hdb … … 以此类推,有时/dev/hdc可能表示的是CDROM ,还是以具体的fdisk -l 输出为准吧; 另一种表示方法是hd[0-n] ,其中n是一个正整数,比如hd0,hd1,hd2 … … hdn ; 如果机器中只有一块硬盘,无论我们通过fdisk -l 列出的是/dev/hda 还是/dev/hdb ,都是hd0;如果机器中存在两个或两个以上的硬盘,第一个硬盘/dev/hda 另一种方法表示为hd0,第二个硬盘/dev/hdb,另一种表法是hd1 ; 感觉大家对hd0,hd1这种表示方法并不寞生,现在新的机器,在BIOS 中,在启动盘设置那块,硬盘是有hd0,hd1之类的,这就是硬盘表示方法的一种; 对于/dev/hda 类似的表示方法,也并不寞生吧;我们在Linux通过fdisk -l 就可以查到硬盘是/dev/hda还是/dev/hdb; [root@localhost ~]# fdisk -l Disk /dev/hda: 80.0 GB, 80026361856 bytes ...

2012-01-02 · 4 min · 822 words · -

Grub磁盘分区表示方法

Grub磁盘分区表示方法 Grub指定分区的方法和Linux、Windows等系统不一样,它的主要特点为: Grub在表示方式上并不区分普通的IDE硬盘、当下流行的SATA硬盘和SCSI硬盘等,在Grub中,硬盘会被识别为hd#,#是从0开始的硬盘编号,而软盘被类似地识别为fd#。 Grub的硬盘编号和分区编号都是从0开始的,这一点linux不同。 按照以上两个特点,假设有一块硬盘(hd0),那么(hd0,0) (hd0,1) (hd0,2) (hd0,3)依次表示它的四个主分区,而随后的(hd0,4)...则是逻辑分区。 通常情况下,装有Windows的硬盘中,通常是按照一个主分区(hd0,0),一个扩展分区(hd0,1)该扩展分区下是若干逻辑分区。这样(hd0,0)对应C盘,(hd0,4)对应D盘,依此类推。 如果您还不能确定你需要的那个分区,可以在输入过程中按下Tab键实现命令补全。比如你在输入一条root语句: root (hd0, 此时按下Tab键,grub将列出可用的分区编号和分区类型 (grub还不能识别ntfs分区,显示为不知道类型的分区) 。你可以依照这个提示来完成命令的输入。 如果不能确定ISO文件的位置,可使用find 文件名.iso(find debian-40r2-i386-CD-1.iso)

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

linux iwconfig

linux iwconfig apt-get install wireless-tools iwconfig wlan0 essid your essid iwconfig wlan0 key s:yourpass iwconfig wlan0 mode managed dhclient wlan0 iwconfig 是linux wireless extensions(lwe)的用户层配置工具之一。 lwe是linux下对无线网络配置的工具,包括内核的支持、用户层配置工具和驱动接口的支持三部 分。目前很多无线网卡都支持lwe,而且主流的linux发布版本,比如redhat linux、ubuntu linux都已经带了这个配置工具。 iwconfig 用法: iwconfig interface [essid {nn|on|off}] [nwid {nn|on|off}] [mode {managed|ad-hoc|…} [freq n.nnnn[k|m|g]] [channel n] [ap {n|off|auto}] [sens n] [nick n] [rate {n|auto|fixed}] [rts {n|auto|fixed|off}] [frag {n|auto|fixed|off}] [enc {nnnn-nnnn|off}] [power {period n|timeout n}] [retry {limit n|lifetime n}] [txpower n {mw|dbm}] [commit] 说明: iwconfig是lwe最主要的工具,可以对无线网卡的大部分参数进行配置。 参数: essid: 设置无线网卡的essid(extension service set id)。 ...

2012-01-01 · 1 min · 155 words · -

debian network command

debian network command restart sudo /etc/init.d/networking restart ****#获取地址 sudo dhclient eth0 wlan iwlist wlan0 scan iwconfig wlan0 essid iwconfig wlan0 key open iwconfig

2012-01-01 · 1 min · 23 words · -

Linux系统日志–syslog

Linux系统日志–syslog 我们可以借助syslog函数将消息写入到/var/log/messages文件或其他配置好的文章。syslogd (系统日志守护进程) 会监控程序提交的消息并对其进行处理。klogd (内核日志守护进程) 负责监控内核提交的消息,并将内核消息记录到/var/log/messages。二者协作记录日志消息。每次启动linux时,这两个守护进程都会由/etc/rc.d/init.d中的初始化脚本启动。 #vi /etc/syslog.conf daemon.info /var/log/messages syslog.conf文件中每一行包括以下内容: l 选择器, 用于表明应该记录哪些消息的一组单词。包括设备 (用于指定选择哪种类型程序的代码,即生成该消息的程序类别) 和优先级 (又能够于指定选择记录的消息类型,更确切的说是表明该消息所代表事件的严重程度) 。 l 动作,用于指定sysogd接收到与选择标准相匹配的消息时应该执行的动作,通常可以使消息要写入的文件名,或应该显示该消息的机器的用户名。 设备 设备描述 设备名 来自login等用户身份验证类程序的消息 auth 特殊目的 (私有) 用户身份验证消息 auth-priv 来自cron程序的消息 (用于控制自动化得,调度后的任务) cron 来自未在此处列出的所有标准守护进程或服务器的消息 deamon 内核消息 (由klogd捕捉) kern 打印服务器消息 lpr 邮件服务器消息 (来自mail transfer agent) mail 新闻服务器消息 news 关于系统登录进程本身的消息 syslog 来自终端用户所启动程序的消息 user 来自uucp程序的消息 uucp 八个特定用途的类别信息,linux销售商和编程人员可能需要使用这些消息来定义通常类别信息之外的特定需求 local0到local7 优先级 优先级描述 优先级名 无优先级 none 调试信息 debug 关于程序当前状态的报告消息 info 程序运行中产生了值得注意的事件 notice 程序中存在潜在问题的警告信息 waring 程序存在错误的通告 err 错误消息,可能会导致程序关闭的事件 crit 严重错误消息,会导致程序关闭并可能影响其他程序 alert 发生严重事件,并有导致系统崩溃的潜在危险 emerg 简单动作大概如下: ...

2011-12-30 · 1 min · 102 words · -