jvisualvm, JVM 监控分析工具(VisualVM)

jvisualvm, JVM 监控分析工具(VisualVM) Visual GC GC time Time taken to perform garbage collection Compile time Time spent in just-in-time (JIT) compilation if visualvm can not find java start visualvm with -jdkhome visualvm.exe -jdkhome D:\java\jdk7 插件安装目录 C:\Users\user0\AppData\Roaming\VisualVM\8u131 在Java多线程程序运行时,多数情况下我们不知道到底发生了什么,只有出了错误的日志的时候,我们才知道原来代码中有死锁。撇开代码检查工具,我们先讨论一下利用VisualVM监控,分析我们的多线程的运行情况。 (注: 实践本文内容的JDK的版本需要1.6.07以上) 什么是VisualVM VisualVM是JDK的一个集成的分析工具,自从JDK 6 Update 7以后已经作为Sun的JDK的一部分。 VisualVM可以做的: 监控应用程序的性能和内存占用情况、监控应用程序的线程、进行线程转储(Thread Dump)或堆转储(Heap Dump)、跟踪内存泄漏、监控垃圾回收器、执行内存和CPU分析,保存快照以便脱机分析应用程序;同时它还支持在MBeans上进行浏览和操作。尽管 VisualVM自身要在JDK6以上的运行,但是JDK1.4以上版本的程序它都能被它监控。 在JDK1.6.07以上的版本中: 到$JAVA_HOME/bin,点击jvisualvm.exe图标就可以启动VisualVM;当然也可以点击这里获取官方的最新版本,支持: 英文,中文,日文。 VisualVM功能集成较多,我们这里只讨论它对象线程的监控分析。 VisualVM监控线程 当我们运行VisualVM的时候,可以在应用程序》本地中看到VisualVM和eclipse的运行程序,然后我们启动eclipse中的一个 线程: com.longtask.thread.TestVisualVm,可以看到在菜单中多了一个该线程的显示。点击右边的 线程 菜单,可以看到线程运行的跟踪情况。 点击 thread dump,可以生成该线程的运行情况的tdump文件,通过thread dump提供的相关信息,我们可以看到线程在什么地方被阻塞了以及线程的其他状态。 把日志另存为文件,到Thread Dump Analyzer的主页点击图标下载TDA,然后用TDA打开刚才VisualVM保存的 thread dump文件,查看相关的分析结果。 远程监控 我们也可以用VisualVM来监控远程java线程的运行情况。 ...

2015-11-04 · 1 min · 208 words · -

pacstrap,command not found

‘pacstrap,command not found’ http://archlinuxarm.org/forum/viewtopic.php?f=60&t=8529 pacman -S pkgfile pkgfile --update pkgfile pacstrap pacman -S extra/arch-install-scripts command-not-found.com 提供 command not found 的搜索 command-not-found.com

2015-11-01 · 1 min · 21 words · -

linux 文本 统计

linux 文本, 字符 统计 # 统计一个目录下所有 .md 文件的字符数 find content/post -name '*.md' -exec wc -w '{}' \; > /tmp/foo.txt awk '{sum+=$1} END {print sum}' /tmp/foo.txt # 另外一种统计, 数字好像不太对, 有时间再研究一下. ls -lR content/post |grep '\.md'|wc -w 用 grep -c 来统计匹配的行数 grep -c 的作用类似grep | wc -l,不同的是,如果是查找多个文件,grep -c会统计每个文件匹配的行数,每行一个文件的列出来,而 wc -l 则列出总的统计数字。 另外grep -c 要比 grep | wc -l快一点。 grep -c night restart.07014 返回2 没有 返回0 http://blog.csdn.net/xuejiayue1105/article/details/1483940

2015-10-28 · 1 min · 64 words · -

java.lang.OutOfMemoryError,unable to create new native thread

‘java.lang.OutOfMemoryError,unable to create new native thread’ http://www.blogjava.net/ldd600/archive/2009/09/25/296397.html 星期一早上到了公司,据称产品环境抛出了最可爱的异常—OutOfMemory, 它是这样来描述他自己的: java.lang.OutOfMemoryError: unable to create new native thread 而且这位仁兄竟然还堂而皇之地同时出现在了3个application里面,所有应用全部遭殃。 那可爱的OOM是如何产生的呢?直接原因是创建的线程太多了,根本原因是某个地方的内存限制了。 搜罗了一下在网上找到了一个计算公式: (MaxProcessMemory - JVMMemory – ReservedOsMemory) / (ThreadStackSize) = Number of threads MaxProcessMemory: 进程最大的寻址空间,但我想这个值应该也不会超过虚拟内存和物理内存的总和吧。关于不同系统的进程可寻址的最大空间,可参考下面表格: Maximum Address Space Per Process Operating System Maximum Address Space Per Process Redhat Linux 32 bit 2 GB Redhat Linux 64 bit 3 GB Windows 98/2000/NT/Me/XP 2 GB Solaris x86 (32 bit) 4 GB Solaris 32 bit 4 GB ...

2015-10-27 · 2 min · 405 words · -

tcpdump

tcpdump 用简单的话来定义 tcpdump, 就是: dump the traffic on a network, 根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump 可以将网络中传送的数据包的"头"完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供 and、or、not 等逻辑语句来帮助你去掉无用的信息。 tcpdump 工作在数据链路层 install #archlinux pacman -S tcpdump #redhat yum install -y tcpdump commands # tcpdump 默认读取第一个网络接口上所有流过的数据包。 tcpcump 过滤 tcp flag TCP 协议头中flags 域的可用取值: tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-ack, tcp-urg # 只捕获TCP SYN包: tcpdump -i <interface> "tcp[tcpflags] & (tcp-syn) != 0" # 只捕获TCP ACK包: tcpdump -i <interface> "tcp[tcpflags] & (tcp-ack) != 0" # 只捕获TCP FIN包: tcpdump -i <interface> "tcp[tcpflags] & (tcp-fin) != 0" # 之捕获TCP SYN或ACK包: tcpdump -r <interface> "tcp[tcpflags] & (tcp-syn|tcp-ack) != 0" tcpdump -nn -i eth0 dst host 172.16.0.213 and 'tcp[tcpflags] & (tcp-rst) != 0' # 打印 TCP 会话中的的开始和结束数据包, 并且数据包的源或目的不是本地网络上的主机 .(nt: localnet, 实际使用时要真正替换成本地网络的名字)) tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet' https://blog.csdn.net/cbbbc/article/details/48897363 ...

2015-10-26 · 25 min · 5319 words · -

jmeter beanshell 数字转字符串补零

jmeter beanshell 数字转字符串补零 http://localhost:7000/?id=${__counter(FALSE,eIndex)}&p=prefix${__BeanShell(333+${eIndex})}sufix http://localhost:7000/?id=${__BeanShell(String.format("%03d"\,new Object[]{1}))} #逗号用反斜杠转换 #参数传Object数组 https://help.flood.io/docs/how-to-pad-strings-in-jmeter

2015-10-23 · 1 min · 9 words · -

parted command

parted command install parted # archlinux pacman -S parted # ubuntu apt install parted # 查看磁盘信息 lsblk # 查看 /dev/sdd 当前的分区情况 # 只能看分区信息, 想知道硬盘上有没有空闲的没创建分区的空间得自己算, 看 start end 是不是连续来判断. sudo parted /dev/sdd print # list disk and partitions # -l, --list sudo parted -l # -a 分区对齐, 对齐类型 # -a, --align sudo parted -a optimal /dev/sdx # 查看磁盘分区 (parted) p # set disk label, 硬盘没有其它分区的时候, 设置分区表类型 (parted) mklabel gpt # or mklabel msdos # 设置 单位为 s, MiB, GiB, MB,GB unit mib # 查看 parted 命令帮助 help mkpart # mkpart part-type fs-type start end # fs-type 是文件系统类型,支持的类型列表可以通过 help mkpart 查看。 # mkpart 并不会实际创建文件系统, fs-type 参数仅是让 parted 设置一个 1-byte 编码,让启动管理器可以提前知道分区中有什么格式的数据。 # 按比例分区, 可以不设置 unit xxx mkpart 磁盘分区名称 起始磁柱值 截止磁柱值 # fs-type: ext4, fat32 mkpart primary ext4 0% 100% mkpart primary ext4 510G 100% # 指定分区名和起止位置,起点会自动设置成2048s mkpart data 0% 100% # 创建efi分区建议550M, linux的efi分区用 fat32, 系统分区不能用fat,fat 会有各种问题,比如不允许使用冒号作文件名 (parted) mkpart primary fat32 1 551 # 设置 efi 分区标记 (parted) set 1 esp on # 设置常规 bios 引导, esp is an alias for boot on GPT (parted) set 1 boot on # grub引导 (parted) set 1 bios_grub on # 给分区取个名字, msdos disk label do not support partition names. name 1 boot # 创建swap分区 16G+ mkpart primary 551 17536 name 2 swap mkpart primary 17536 -1 name 3 rootfs #检查是否分区对齐 align-check optimal 1 # 退出parted (parted) q # 查看磁盘信息 lsblk # mkswap sudo mkswap /dev/sdx2 swapon /dev/sdx2 # 查看磁盘分区UUID, 没有 root 权限时, blkid 没有输出 ```bash sudo blkid #genfstab -p -U /mnt > /mnt/etc/fstab ...

2015-10-22 · 3 min · 454 words · -

test

test Downloading: http://repository.springsource.com/maven/bundles/release/org/json/org.ow2.chameleon.commons.json/20090911-0002/org.ow2.chameleo n.commons.json-20090911-0002.jar

2015-10-20 · 1 min · 4 words · -

MySQL btree索引 hash索引

‘MySQL btree索引 hash索引’ MySQL, b tree索引 hash索引, B树 http://www.cnblogs.com/vicenteforever/articles/1789613.html Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。可 能很多人又有疑问了,既然 Hash 索引的效率要比 B-Tree 高很多,为什么大家不都用 Hash 索引而还要使用 B-Tree 索引呢?任何事物都是有两面性的,Hash 索引也一样,虽然 Hash 索引效率高,但是 Hash 索引本身由于其特殊性也带来了很多限制和弊端,主要有以下这些。 (1) Hash 索引仅仅能满足"=",“IN"和”<=>“查询,不能使用范围查询。 由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和Hash运算前完全一样。 (2) Hash 索引无法被用来避免数据的排序操作。 由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值,而且Hash值的大小关系并不一定和 Hash 运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算; (3) Hash 索引不能利用部分索引键查询。 对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。 (4) Hash 索引在任何时候都不能避免表扫描。 ...

2015-10-15 · 1 min · 94 words · -

Asking The Right Questions, 学会提问

Asking The Right Questions, 学会提问 Asking The Right Questions: A Guide to Critical Thinking Author/作者: [美]尼尔·布朗 (Neil Browne),斯图尔特·基利 (Stuart Keel) 译作名: 学会提问 译者: 许蔚翰, 吴礼敬 时间: 2023.12 - 我们最常见的倾向就是只愿听那些价值观和我们相似的人的话, 我们需要下大力气去抵制这种倾向. 我们必须要与这种倾向做斗争. P52/550 主要价值观 自主决断: 仔细听听那些和我们价值观倾向不同的人的话. 好奇心 一旦你发现说理透彻, 认证严密的人, 不论其肤色, 年龄, 财富, 国籍如何, 都要依赖他的观点, 直到更加透彻, 严谨的认证出现为止. 斯蒂芬 科尔伯特 (Stephen Colbert): “我们并不是什么事实的拥趸, 你看, 事实还会发生改变, 可是我的观点从来都不会变, 不论它面对的是什么样的事实.” 任何下决心死抱自己的结论不放手的人, 都有可能找到许多理由来证明自己的观点. 这种认证方式 被称作"操控型认证"(managed reasoning), 意思就是这种认证方式经过事先挑选, 以便得出某个特定的结论. P56/550 描述性论题 规定性论题 薄弱的理由必然导致薄弱的认证. P114/550 理由的提示词 由于, as a result of 研究显示, studies show 因为这个事实, because of the fact that 因为这个原因, for the reason that 由以下材料支撑, is supported by 因为证据显示, because the evidence is 谬误 人身攻击型谬误 ad hominem fallacy, ad hominem, 针对个人进行人身攻击,而不是直接反驳其提供的理由. P247/550 https://book.douban.com/subject/35513147/

2015-10-13 · 1 min · 105 words · -

迭代回顾, Sprint Retrospective

迭代回顾, Sprint Retrospective Scrum - Sprint Retrospective 在Scrum中,每个Sprint结束的时候会有两个会议 (Sprint Review/Demo和Sprint Retrospective回顾) 。 这两个会议是对过去的一个Sprint的一个总结,其中Review/Demo是检查过去一个Sprint的产出 (What) ,主要是PO根据先前的计划来检查Team在过去一个Sprint的工作成果,包括一些Demo,以及未完成部分的总结和分析;而Retrospective则是回顾过去一个Sprint整个Team的运作模式,有什么好的和不好的实践,怎样在未来的Sprint做的更好,强调How。 Sprint Retrospective (回顾) Sprint Retrospective会议主要是整个Team讨论过去的一个Sprint的运作,如何改进使Team更良好的运作。讨论的内容可以是任何有关Team建设的问题,包括工作流程、团队实践、团队内部/外部沟通、团队气氛以及相关工具的使用等等。 Scrum并不是一种方法,而是给软件开发流程提供了一种框架,在整个框架下,不同的项目、团队需要根据具体条件,适时调整实践方法。而Retrospective会议正是一个Scrum团队自我调整的机会。 会议的参加者包括整个Scrum团队、Scrum Master和Product Owner。会议由Scrum Master主持,一般以下边两个问题开始: 过去的一个Sprint里,我们有哪些好的方面? 过去一个Sprint存在哪些问题? 整个Team就这两个问题进行公开讨论,方式也可以是多样的。可以大家一起讨论,Scrum Master在讨论过程中将大家的观点记录在白板上;也可以让Team每个成员在便签纸上写下自己的答案,可以要求每个问题至少写三点,然后每个人把自己的答案贴在白板上,并给出相关解释。 讨论完毕后,对讨论结果进行分类。对于好的方便,在下个Sprint继续保持并发扬;对于存在的问题,列出Action Point去解决问题。列出的Action Point也会在下个Sprint的backlog中体现出来,并且是高优先级的项目。 探索者 (E) 代表对这个会议的内容充满期待,很有兴趣听听看看大家都是怎么看待过去这段时间的工作的,想以此来分析我们为什么是这样工作的; 推销者 (S) 是带着想法过来的,他有一个idea想借这个会议推销给大家,比如一个新的工作方式的建议,给团队增加一个流程来改进某一个方面的问题,总之这个人看到了问题,也带来的解决办法; 度假者 (V) 把这个会议当做一个休闲的方式,他们觉得有个机会大家一起聊聊天,胡扯一通挺有意思的,可能比自己工作的时候更让他放松。度假者对会议的内容是没有期待的。 囚犯 (P) 是极不愿意来参加这个会议的,他们要么就是厌恶会议,要么就是忙得没时间参加会议,总之他们是被迫来的,他们期望着会议能马上结束就好,没有心思参与到会议的讨论中来。 http://blog.csdn.net/ljinddlj/article/details/5328404 https://www.jianshu.com/p/95a59fe7844c

2015-10-12 · 1 min · 46 words · -

LVM

LVM commands # lvreduce, 用于减小 LVM 逻辑卷(Logical Volume)的大小 # -r, 同时调整(resize)文件系统的大小(调用 resize2fs xfs_growfs 等) # -L -40G 减小逻辑卷的大小 40GB(注意 - 表示减小) # /dev/ubuntu-vg/root 要调整的逻辑卷路径(通常是根分区) sudo lvreduce -r -L -40G /dev/ubuntu-vg/root LVM 的基本概念 通过 LVM 技术,可以屏蔽掉磁盘分区的底层差异,在逻辑上给文件系统提供了一个卷的概念,然后在这些卷上建立相应的文件系统。下面是 LVM 中主要涉及的一些概念。 PM 物理存储设备 (Physical Media): 指系统的存储设备文件,比如 某一块硬盘, /dev/sda、/dev/sdb 等。 或者 设备映射器(Device Mapper)管理的加密分区. /dev/mapper/nvme0n1p8_crypt PV (物理卷 Physical Volume): PV 可以看做是硬盘上的分区, 指硬盘分区或者从逻辑上看起来和硬盘分区类似的设备 (比如 RAID 设备)。 PE (Physical Extent):PV(物理卷)中可以分配的最小存储单元称为 PE,PE 的大小是可以指定的。 VG (卷组, Volume Group): 卷组: 物理卷的组合. 类似于非 LVM 系统中的物理硬盘,一个 LVM 卷组由一个或者多个 PV(物理卷) 组成。 卷组是 LVM 的中间层,VG 将多个物理卷(Physical Volumes, PV)组合在一起, 以便在其上创建逻辑卷(Logical Volumes, LV)。 ...

2015-10-12 · 3 min · 635 words · -

java中byte数组与int类型的转换 (两种方式)

java中byte数组与int类型的转换 (两种方式) http://blog.csdn.net/zhouyong0/article/details/8078619 java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送、者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形int转换成byte数组,同时如何把一个长度为4的byte数组转换为int类型。下面有两种方式。 public static byte[] int2byte(int res) { byte[] targets = new byte[4]; targets[0] = (byte) (res & 0xff);// 最低位 targets[1] = (byte) ((res » 8) & 0xff);// 次低位 targets[2] = (byte) ((res » 16) & 0xff);// 次高位 targets[3] = (byte) (res »> 24);// 最高位,无符号右移。 return targets; } public static int byte2int(byte[] res) { // 一个byte数据左移24位变成0x??000000,再右移8位变成0x00??0000 int targets = (res[0] & 0xff) | ((res[1] « 8) & 0xff00) // | 表示安位或 ...

2015-10-12 · 1 min · 156 words · -

Gentoo emerge命令

Gentoo emerge命令 Gentoo的包管理工具称为portage。emerge是这个portage的字符界面管理工具,图形界面工具还有portato,porthole,kuroo,himerge等。 ebuild ebuild是Portage包管理程序的根本。它是一个纯文本文件,而每一个ebuild都会对应一个包 (软件包) 。ebuild会告诉 portage要下载的文件、该包可运行的平台、如何编译它、它所依赖的ebuild和一些修补代码的patch。Portage内有一个ebuild大集合,称为Portage tree,是gentoo网站所提供的ebuild。它包含了大部份常用的包,并会不时更新。如果要使用的包不在其内,也可以手动加入。 USE标志 USE标志的设置位于Gentoo系统的/etc/make.conf文档中,作用是使得Emerge在处理依赖关系的时候可以做到不安装不需要的软件包 (例如安装Gnome的用户没有必要因为一个软件包的依赖关系而安装KDE与Qt) ,而安装指定的软件包 (同样以Gnome举例,Gnome的用户基本上都会安装GTK+) ,把系统的设置专注化。 Gentoo的emerge命令参数用法详解 查找名称包含mozilla的包 emerge -s mozilla emerge search mozilla 查找描述包含mozilla emerge -S mozilla emerge -searchdesc mozilla 使用本地编好的包,没有就下源码(尽量避免编译) emerge -k mozilla emerge -usepkg mozilla 只使用本地编好的,否则不安装(绝对不编译,所有依赖的包都有binary才装) emerge -K mozilla emerge -usepkgonly mozilla 卸载 emerge -C mozilla emerge unmerge mozilla 升级portage树 emerge -sync 下载snapshot包来完成sync emerge-webrsync 查看已安装包的changelog emerge -pl mozilla emerge -pretend -changelog mozilla 查看依赖关系(这个包还没装) (–pretend保证这一次操作实际上不做任何事情,可以跟任何options组合) emerge -p mozilla emerge -pretend mozilla ...

2015-10-05 · 1 min · 165 words · -

gentoo emerge install unstable version

gentoo emerge install unstable version 安装特定版本的软件 emerge “=python-3.2” emerge “<python-3.2” You can also manually edit the /etc/portage/package.keywords file to unmask keyword_masked packages Code: echo www-client/seamonkey » /etc/portage/package.keywords If /etc/portage doesn’t exist then create it Code: mkdir /etc/portage

2015-10-01 · 1 min · 37 words · -

DataX

DataX http://www.open-open.com/lib/view/open1325771223625.html DataX是什么? DataX是一个在异构的数据库/文件系统之间高速交换数据的工具,实现了在任意的数据处理系统(RDBMS/Hdfs/Local filesystem) 之间的数据交换,由淘宝数据平台部门完成。 DataX用来解决什么? 目前成熟的数据导入导出工具比较多,但是一般都只能用于数据导入或者导出,并且只能支持一个或者几个特定类型的数据库。这样带来的一个问题是,如果我们拥 有很多不同类型的数据库/文件系统(MySQL/Oracle/Rac/Hive/Other…),并且经常需要在它们之间导入导出数据,那么我们可能需 要开发/维护/学习使用一批这样的工具(jdbcdump/dbloader/multithread/getmerge+sqlloader /MySQLdumper…)。而且以后每增加一种库类型,我们需要的工具数目将线性增长。(当我们需要将MySQL的数据导入oracle的时候,有没 有过想从jdbcdump和dbloader上各掰下来一半拼在一起到冲动?) 这些工具有些使用文件中转数据,有些使用管道,不同程度的为数据中转带来额外开销,效率差别很非常大。很多工具也无法满足ETL任务中常见的需求,比如日 期格式转化,特性字符的转化,编码转换。另外,有些时候,我们希望在一个很短的时间窗口内,将一份数据从一个数据库同时导出到多个不同类型的数据库。 DataX正是为了解决这些问题而生。 我们只需要针对新增的数据源开发的一套Reader/Writer插件,即可实现任意数据的互导 DataX特点? 在异构的数据库/文件系统之间高速交换数据 采用Framework + plugin架构构建,Framework处理了缓冲,流控,并发,上下文加载等高速数据交换的大部分技术问题,提供了简单的接口与插件交互,插件仅需实现对数据处理系统的访问 运行模式: stand-alone 数据传输过程在单进程内完成,全内存操作,不读写磁盘,也没有IPC 开放式的框架,开发者可以在极短的时间开发一个新插件以快速支持新的数据库/文件系统。 (具体参见《DataX插件开发指南》) DataX结构模式 (框架+插件) Job: 一道数据同步作业 Splitter: 作业切分模块,将一个大任务与分解成多个可以并发的小任务. Sub-job: 数据同步作业切分后的小任务 Reader(Loader): 数据读入模块,负责运行切分后的小任务,将数据从源头装载入DataX Storage: Reader和Writer通过Storage交换数据 Writer(Dumper): 数据写出模块,负责将数据从DataX导入至目的数据地 DataX框架内部通过双缓冲队列、线程池封装等技术, 集中处理了高速数据交换遇到的问题, 提供简单的接口与插件交互, 插件分为Reader和 Writer 两类, 基于框架提供的插件接口,可以十分便捷的开发出需要的插件。比如想要从oracle导出数据到MySQL,那么需要做的就是开发出 OracleReader和MySQLWriter插件,装配到框架上即可。并且这样的插件一般情况下在其他数据交换场合是可以通用的。更大的惊喜是我们 已经开发了如下插件: Reader插件 hdfsreader : 支持从hdfs文件系统获取数据。 MySQLreader: 支持从MySQL数据库获取数据。 sqlserverreader: 支持从sqlserver数据库获取数据。 oraclereader : 支持从oracle数据库获取数据。 streamreader: 支持从stream流获取数据 (常用于测试) httpreader : 支持从http URL获取数据。 Writer插件 hdfswriter: 支持向hdbf写入数据。 ...

2015-09-25 · 1 min · 91 words · -

正则, 惰性匹配 .*?

正则, 惰性匹配(lazy) .*? http://www.nowamagic.net/librarys/veda/detail/1038 使用场景 有时,我们想用正则匹配以某个子串开头,且以某个子串或字符结尾的子字符串,但是结尾的字串或字符在原字符串中出现了多次,但我们只想匹配从开始处到第一次出现的地方,换句话说,想得到开始和结尾之间内容最少的匹配。 正则的贪婪与非贪婪(惰性) 通常使用如下字符类描述前导字符的重复特征: ?: 告诉引擎匹配前导字符0次或一次。事实上是表示前导字符是可选的。 +: 告诉引擎匹配前导字符1次或多次。 *: 告诉引擎匹配前导字符0次或多次。 {min, max}: 告诉引擎匹配前导字符min次到max次。min和max都是非负整数。如果有逗号而max被省略了,则表示max没有限制;如果逗号和max都被省略了,则表示重复min次。 因此 {0,} 和 * 一样,{1,} 和 + 的作用一样。 贪婪 默认情况下,? + * {min, max}都是贪婪的,也就是说,它会根据前导字符去匹配尽可能多的内容。 非贪婪(惰性) 非贪婪就是匹配尽可能少的内容。 原理浅析 结合实例来分析哈基于正则的引擎对文本的匹配过程。原始字符串:This is a first test,使用正则<.+>来匹配HTML标签,期望第一次匹配得到,第二次匹配得到,实际却是第一次匹配就得到了first。 来看看匹配过程,第一个记号是<,这是一个文本字符,匹配其自身。第二个符号是.,匹配了字符E,然后+一直可以匹配其余的字符,直到一行的结束。然后到了换行符,匹配失败(.不匹配换行符)。于是引擎开始对下一个正则表达式符号进行匹配,即试图匹配>。到目前为止,<.+已经匹配了first test。引擎会试图将>与换行符进行匹配,结果失败了。于是引擎进行回溯。回溯后的匹配状况是 <.+ 匹配 first tes。于是引擎将>与t进行匹配。显然还是会失败。这个过程继续,直到 <.+ 匹配 first</EM,>与>匹配。于是引擎找到了一个匹配first。记住,正则导向的引擎是急切的,所以它会急着报告它找到的第一个匹配。而不是继续回溯,即使可能会有更好的匹配,例如。所以我们可以看到,由于+的贪婪性,使得正则表达式引擎返回了一个最左边的最长的匹配。 ...

2015-09-24 · 1 min · 62 words · -

Redis客户端

Redis客户端 http://ourjs.com/detail/555975b9329934463f00000f Redis是一个超精简的基于内存的键值对数据库 (key-value) ,一般对并发有一定要求的应用都用其储存session,乃至整个数据库。 参见: node.js与redis结合使用。 不过它公自带一个最小化的命令行式的数据库管理工具,有时侯使用起来并不方便。不过Github上面已经有了很多图形化的管理工具,而且都针对REDIS做了一些优化,如自动折叠带schema的key等。 Redis Desktop Manager 一款基于Qt5的跨平台Redis桌面管理软件 支持: Windows 7+, Mac OS X 10.10+, Ubuntu 14+ 特点: C++ 编写,响应迅速,性能好。但不支持数据库备份与恢复。 项目地址: https://github.com/uglide/RedisDesktopManager Redis Client 项目简介: 使用Java编写,功能丰富,缺点是性能稍差,网络不好时,会不时断线。 项目地址: https://github.com/caoxinyu/RedisClient Redis Studio 项目简介: 又一个C++编写的redis管理工具,仅支持windows平台,支持xp操作系统。 项目地址: https://github.com/cinience/RedisStudio ps: 后面两款为国人开发。

2015-09-24 · 1 min · 40 words · -

java.sql.Timestamp cannot be cast to java.sql.Date

java.sql.Timestamp cannot be cast to java.sql.Date java.sql.Timestamp cannot be cast to java.sql.Date date数据库sqlstringjava java.lang.ClassCastException: java.sql.Timestamp cannot be cast to java.sql.Date 我在往数据库插入数据时用的是string型,SQL应该会转换为java.sql.Date型,但是取出值的时候不也应该是java.sql.Date型么? 但是这么会报这样的错误?还有一个问题,用你说的这种方式生成的java.sql.Date好像只有年月日, 我想要取到很详细的当前时间,包括到毫秒级别,这样应该怎样生成呢??? java.sql.Date->java.sql.Timestamp new java.sql.Timestamp(yourDate.getTime()); java.sql.Timestamp->java.sql.Date new java.sql.Date(yourTimestamp.getTime()); 界面要显示毫秒的话,在date传到前面时转化格式即可! Date b_date = new Date();(着这是util类型的)! ps.setDate(new java.sql.Date(b_date.getTime()));(这是插入数据库是的Date)! 其中 (new java.sql.Date(b_date.getTime()));是把java类型的Date转换成sql类型的Date

2015-09-22 · 1 min · 40 words · -

redis data type, 数据类型

redis data type, 数据类型 https://redis.io/topics/data-types https://redis.io/topics/data-types-intro String - 字符串 List - 列表 Set - 无序集合 Hashes - 哈希/散列表 Sorted sets - 有序集合 Stream - 消息队列 Bitmaps, url: redis-bitmap HyperLogLogs Hyperloglog https://segmentfault.com/a/1190000020523110 geospatial https://blog.csdn.net/zhang197093/article/details/72979038

2015-09-22 · 1 min · 33 words · -