ruby的一些软件

July 24th, 2010

1. http://github.com/mxcl/homebrew homebrew

http://mxcl.github.com/homebrew/

有空之际给大家说明下一些使用方法
2.http://distfiles.macports.org/MacPorts/ MacPorts

按照好后,如果有:
sh: port: command not found
这种情况:
请:
add the following to ~/.bash_history
or
add the following to ~/.profile

export PATH=$PATH:/opt/local/bin
export MANPATH=$MANPATH:/opt/local/share/man
export INFOPATH=$INFOPATH:/opt/local/share/info

macports(darwinports)是mac操作系统上的一个非常不错的包管理器,可以很方便的编译安装软件,在安装一个软件的时候会将这个软件所依赖的软件环境一起搭建好,这样可以很方便的安装和升级所需要的软件。就像gem一样的方便。

http://www.macports.org/install.php

这是macports的安装说明

http://guide.macports.org/

这是macprots的完整的说明书

以后用: sudo port selfupdate 进行更新

port install 查看用port安装过的软件包。

3.http://help.github.com/mac-key-setup/
git ssh for mac 的用法

http://code.google.com/p/git-osx-installer/

具体参考步骤:

http://help.github.com/mac-git-installation/

章浩涵 1个月内的照片

July 16th, 2010

章浩涵

JDK自带工具命令使用 jps,jstat jmap jconsole

June 29th, 2010

jps
  
与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显 示他们的进程号。基本上只用这些功能,其他请看:

http://java.sun.com/javase/6/docs/technotes/tools/share/jps.html

jstat

显示加载class的数量,及所占空间等信息
jstat -class 21806
Loaded Bytes Unloaded Bytes Time
10749 12432.3 95 82.9 4.41

需要特别注意的是:Time: Time spent performing class load and unload operations.
具体含义请看:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstat.html

显示VM实时编译的数量等信息。
jstat -compiler 21806
Compiled Failed Invalid Time FailedType FailedMethod
1455 0 0 27.50 0

stat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
jstat -gc 21806
S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
32768.0 32768.0 0.0 861.3 262144.0 213535.8 720896.0 74031.5 98304.0 55388.5 15 1.524 3 1.086 2.610

具体查看:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstat.html

本人关心:
YGC, Number of young generation GC Events.
YGCT, Young generation garbage collection time.
FGC, Number of full GC events.
FGCT Full garbage collection time.
GCT Total garbage collection time.
gc 最基本的概念就是回收垃圾。
jdk默认的gc有两种,young gc 和full gc.
经验:gc一天最好不要超过48次,ull GC频率 平均大约半小时1次。
具体:young gc 的帮助:http://java.sun.com/docs/hotspot/gc1.4.2/faq.html

jstat -gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。

jstat -gcnew pid:new对象的信息。
jstat -gcnewcapacity pid:new对象的信息及其占用量。
jstat -gcold pid:old对象的信息。
jstat -gcoldcapacity pid:old对象的信息及其占用量。
jstat -gcpermcapacity pid: perm对象的信息及其占用量。
jstat -util pid:统计gc信息统计。
jstat -printcompilation pid:当前VM执行的信息。

除了以上一个参数外,还可以同时加上 两个数字,如:jstat -printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次,还可以加上-h3每三行显示一下标题。

jmap是一个可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。使用方法 jmap -histo pid。如果连用SHELL jmap -histo pid>a.log可以将其保存到文本中去,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。jmap -dump:format=b,file=String 3024可以将3024进程的内存heap输出出来到String文件里。

jinfo:的用处比较简单,就是能输出并修改运行时的java进程的运行参数。用法是jinfo -opt pid 如:查看2788的MaxPerm大小可以用 jinfo -flag MaxPermSize 2788。

jconsole是一个用java写的GUI程序,用来监控VM,并可监控远程的VM,非常易用,而且功能非常强。由于是GUI程序,这里就不详细介绍了,不会的地方可以参考SUN的官方文档。
使用方法:命令行里打 jconsole,选则进程就可以了。

以下是这些工具的SUN官方说明:
jps:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jps.html
jstat:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstat.html
jmap:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jmap.html
jconsole:http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html

ruby日记

June 27th, 2010

今天重先安装了系统,发现ruby已经被苹果自带了!
ruby --version
ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0]

如何提高SQL 查询技能

June 24th, 2010

记录详细的需求文档
在写SQL之前必须弄清楚需求, 具体要取什么数据, 有些什么具体的约束条件, 在数据仓库环境中还可以考虑补上这个需求具体对应哪些报表, 对应的基础表如何. 到开发环境的话, 可以考虑加上这条SQL服务于哪些业务(页面),调用频率如何.

不要重新制造轮子
对于一些已经比较成熟的解决方案,有比较现成的例子的SQL,要善于利用已有SQL,已有模板.

降低语句的复杂度
有些同学可能比较喜欢使用比较炫的技术,比较炫的SQL来解决问题. 但是要切记一点, 使用过于复杂过于新的技术, 如果不能在性能(以及其他方面)带来好处的话, 只会使得这条SQL难于维护, 使得其他相关人员难于理解.

小心处理NULL
NULL在Oracle数据库中是一个非常特别的值, 它不等于任何值, 所以如果你的SQL返回的值数量偏少,或者根本不对很可能就是使用NULL出现了问题..
常见的情况是:
1. 查询的时候直接使用条件 colx = xxx,而这个colx里面是有NULL值的, 这种情况下查询的返回结果是不会包含NULL值对应的记录的, 如果要查询出NULL对应的记录, 需要使用 colx is null (is not null).
2. var 为null的时候, 在plsql中给var赋值, var := var + xxx;这种情况下var的值会一直是null的, 这一点需要特别注意, 我自己也犯过好几次这个错误.

自己核对数据类型
在where条件里面要仔细地核对数据类型, 由于隐形转换的问题, 在数据类型错误的时候, Oracle无法正确使用索引, 可能会导致SQL运行非常慢.

小心处理重复数据
在需求明确的情况下, 如果你不在乎是否出现重复记录, 或者明确知道不会出现重复数据的情况下, 尽量使用Union All而不是Union进行查询, Union会涉及到昂贵的排序操作.

除此之外,还可以考虑,维护一些基本的sql语法和性能比较的知识库。让知识积累起来

避免不必要的优化操作
SQL的性能调优可能非常有趣非常带劲, 但是很多时候调优可能意义不大, 比如对于只会使用一次的查询, 你可能很少在乎是1秒钟结束还是2秒钟结束..

不过一些基本的优化规则还是要用的:
只查询你需要的字段, 而不要所有的查询都是用select *来进行.
在通过索引来查询更合适的时候, 尽量在查询条件中指定有索引的字段来查询. (在返回的记录条数很少的时候, 使用索引一般都能更加快速的得到查询结果.
不要可以避免使用表连接. 关系数据库就是为了表连接而设计的.

尽可能使用绑定变量
在开发环境使用的SQL语句尽量使用绑定变量, 这样可以大大缓解Oracle数据库解析SQL的消耗, 也可以大大提高数据库的可扩展性.

使用源码控制工具
最好使用CVS/SVN一类的源码控制工具来管理你的SQL/PLSQL代码, 这对于后期的维护有非常大的帮助, 也有助于其他人更好的理解你最初写这条SQL的意图.

测试,测试,测试.
在SQL写好之后, 要深入的进行测试, 以确保其正常运行.

半夜的奋斗

April 23rd, 2010

公司规定:周四晚上前,完成自己的kpi. 等我上床休息的时候才发现还没完成,时间已经,11:40。任务就是任务,必须要完成的。
所以我想想了过去,简单总结了下过去。 哎 我要完成*******
项目质量,个人成长,线上bug数量,团队贡献。 加油吧,淘宝是我梦想的舞台!!

JAVA NIO中文版本 Chapter 3. Channels

April 11th, 2010

Channels是java.nio的第二次创新。(buffer 是第一次) 它不是一个扩展或

者增强,是一个新的,第一级Java的I/O模式,提供直接连接至I / O服务。channels主要在字节缓存器和实体通道直接建立高效的链接。可以用file或者socke进行传递。通过 channels 缓冲区内发送和

接收数据 可以让本机的I/O服务以最低的开销访问操作系统。

从这个图上可以看出,channel比buffer要复杂多了。同时他们之间的关系也非常复杂。他们之间的关系主要在 java.nio.channels.spi 这个包中建立。



JAVA NIO中文版本 Chapter 2. Buffers

April 11th, 2010

Chapter 2. Buffers

Buffer

概念

一种特定类型的原始数据容器的接口。

缓冲区是线性的,对一个特定的原始类型元素的有限序列。除了它的内容,缓冲区的基本特性是它的能力,限制和位置:
缓冲区的容量是它包含的元素数。一个缓冲区的容量没有消极和永远不变的。
缓冲区的限制是第一个元素不应该读取或写入索引。缓冲区的限制是消极的,是永远不会比它的容量更大。
缓冲区的立场是下一个元素的索引读取或写入。缓冲区的立场是消极的,是永远不会比它更大的限制

子类是:ByteBufferCharBufferShortBufferIntBufferLongBufferFloatBufferDoubleBuffer

char 2 bytes,int 4 bytes,double 8 bytes

DataInputStream的区别DataInputStream,DataOutputStream,不同的是一个提供的是基于流的操作,具有单向,不可逆性)

当我们创建完毕一个Buffer以后,我们应该养成这样的习惯:

1)放数据前,clear下,确保position0开始写;(2)取数据前,flip下,确保我们只取有效数据【一般(limit,capacity]间的数据全部是0】。

3)如果我们要改变流操作的特性,需要对同一份数据进行多次读取的话,那么如果【全部复读】,则直接rewind下;如果【部分复读】则使用mark and reset

定义了一个可以线性存放primitive type数据的容器接口。Buffer主要包含了与类型(byte, char…)无关的功能。值得注意的是Buffer及其子类都不是线程安全的。

每个Buffer都有以下的属性:

capacity

这个Buffer最多能放多少数据。capacity一般在buffer被创建的时候指定。

limit

Buffer上进行的读写操作都不能越过这个下标。当写数据到buffer中时,limit一般和capacity相等,当读数据时,limit代表buffer中有效数据的长度。

position

/写操作的当前下标。当使用buffer的相对位置进行读/写操作时,读/写会从这个下标进行,并在操作完成后,buffer会更新下标的值。

mark

一个临时存放的位置下标。调用mark()会将mark设为当前的position的值,以后调用reset()会将position属性设置为mark的值。mark的值总是小于等于position的值,如果将position的值设的比mark小,当前的mark值会被抛弃掉。

这些属性总是满足以下条件:

0 <= mark <= position <= limit <= capacity
limitposition的值除了通过limit()position()函数来设置,也可以通过下面这些函数来改变:

Buffer clear()

position设为0,把limit设为capacity,一般在把数据写入Buffer前调用。

Buffer flip()

limit设为当前position,把position设为0,一般在从Buffer读出数据前调用。

Buffer rewind()

position设为0limit不变,一般在把数据重写入Buffer前调用。

Buffer对象有可能是只读的,这时,任何对该对象的写操作都会触发一个ReadOnlyBufferExceptionisReadOnly()方法可以用来判断一个Buffer是否只读。

2.1.7 Compacting 压缩,释放出有效空间,可以继续放入数据

压缩之后

buffer.compact()

Figure 2-7. Buffer after compaction

Comparing

buffer相当的条件

1.这两个对象是同一类型。缓冲器含有不同的数据类型永远不会相当,没有任何缓冲会等于一个非缓冲对象

2.•两个缓冲区有剩余的同样数目的元素。缓冲区的总数不一定是相同的,并在缓冲区剩余数据索引不必是相同的。

但是,余下的(从position limit)在每个缓冲区的元素数量必须相同。

在剩余的数据元素,这将是自获得(),必须是相同的,在每个缓冲区返回的序列

Bulk Moves 批量移动

java.nio.ByteBuffer

This class defines six categories of operations upon byte buffers:

这个类定义了6种操作时字节缓冲区

1.绝对和相对getput方法进行读取和写入单个字节操作。

2.相对批量get方法转移到这个缓冲区的字节数组连续序列;

3.相对批量put方法,转移到一个字节数组或到此缓冲区其他一些字节缓冲区的字节连续序列;

4.绝对和相对getput方法读取和写入的其他原始类型的值,翻译在特定的字节顺序和它们的字节序列;

6.鉴于建立缓冲区,允许一个字节缓冲区被作为包含其他一些原始类型的值缓冲效果的方法;

7.为压缩方法,复制,和切片一个字节的缓冲区

定义了4种属性

capacity

limit

JAVA NIO中文版本 Chapter 1. Introduction

April 11th, 2010

Java 编程中,直到最近一直使用 的方式完成 I/O。所有 I/O 都被视为单个的字节的移动,通过一个称为 Stream 的对象一次移动一个字节。
NIO 与原来的 I/O 有同样的作用和目的,但是它使用不同的方式,块 I/O

NIO 的创建目的是为了让 Java 程序员可以实现高速 I/O 而无需编写自定义的本机代码。NIO 将最耗时的 I/O 操作(即填充和提取缓冲区)转移回操作系统,

因而可以极大地提高速度。

In the main body of this book, it’s important to understand the following topics:

  • Buffer handling    缓存处理
  • Kernel versus user space  内核与用户空间
  • Virtual memory  虚拟内存
  • Paging
  • File-oriented versus stream I/O  文件与流型的I / O
  • Multiplexed I/O (readiness selection)

Buffer Handling

Virtual Memory two basic categories

1More than one virtual address can refer to the same physical memory location

多个虚拟地址可以指向同一个物理地址

2A virtual memory space can be larger than the actual hardware memory available.

虚拟内存空间可以大于实际的硬件内存

. 介绍NIO
NIO包(java.nio.*)引入了四个关键的抽象数据类型,它们共同解决传统的I/O类中的一些问题。
1 Buffer:它是包含数据且用于读写的线形表结构。其中还提供了一个特殊类用于内存映射文件的I/O操作。
2 Charset:它提供Unicode字符串影射到字节序列以及逆影射的操作。
3 Channels:包含socketfilepipe三种管道,它实际上是双向交流的通道。
4 Selector:它将多元异步I/O操作集中到一个或多个线程中(它可以被看成是Unixselect()函数或Win32WaitForSingleEvent()函数的面向对象版本)。

Java IO主要建立在Stream的概念上,而NIO它是基于块(block)的概念.stream IO移动数据是以一个byte为单位的, NIO则是主要以块的方式处理数据

Modern CPUs contain a subsystem known as the Memory Management Unit (MMU).

现代CPU包含的内存管理单元(MMU)称为一个子系统。

文件系统是一种更高层次的抽象。文件系统是一种安排和解释存储在磁盘上(或其他一些随机访问,面向块设备)特定数据的方法。编写的代码几乎总是交互文件系统,而不是直接的磁盘。这是文件系统,它定义了文件名,路径,文件,文件属性等的抽象

JDK 1.4以前,JavaIO操作集中在java.io这个包中,是基于流的同步(blockingAPI。对于大多数应用来说,这样的API使用很方便,然而,一些对性能要求较高的应用,尤其是服务端应用,往往需要一个更为有效的方式来处理IO。从JDK 1.4起,NIO API作为一个基于缓冲区,并能提供异步(non-blocking)IO操作的API被引入。本文对其进行深入的介绍。

JAVA NIO各个类的理解

NIO API主要集中在java.nio和它的subpackages中:

java

定义了Buffer及其数据类型相关的子类。其中被java.nio.channels中的类用来进行IO操作的ByteBuffer的作用非常重要。

java

定义了一系列处理IOChannel接口以及这些接口在文件系统和网络通讯上的实现。通过Selector这个类,还提供了进行异步IO操作的办法。这个包可以说是NIO API的核心。

java

定义了可用来实现channelselector API的抽象类。

java

定义了处理字符编码和解码的类。

java

定义了可用来实现charset API的抽象类。

java.nio.channels.spijava.nio.charset.spi这两个包主要被用来对现有NIO API进行扩展,在实际的使用中,我们一般只和另外的3个包打交道。下面将对这3个包一一介绍。

Package java.nio

这个包主要定义了Buffer及其子类。Buffer定义了一个线性存放primitive type数据的容器接口。对于除boolean以外的其他primitive type,都有一个相应的Buffer子类,ByteBuffer是其中最重要的一个子类。

关于max osx 下/home权限设置

November 12th, 2009

osx 默认不装载home 目录,所以你无法进行写操作.
所以需要如下修改下:
/etc/auto_master 把/home 去掉或者加##
马上重启.
然后用root账号 chmod 777 home 就可以了