sqlite 数据类型

sqlite 数据类型 一般数据采用的固定的静态数据类型,而 SQLite 采用的是动态数据类型,会根据存入值自动判断。SQLite 具有以下五种数据类型: NULL: 空值。 INTEGER: 带符号的整型,具体取决有存入数字的范围大小 REAL: 浮点数字,存储为8-byte IEEE浮点数 TEXT: 字符串文本 BLOB: 二进制对象 但实际上,sqlite3 也接受如下的数据类型: smallint 16 位元的整数 interger 32 位元的整数 decimal(p,s) p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数点後有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。 float 32位元的实数。 double 64位元的实数。 char(n) n 长度的字串,n不能超过 254。 varchar(n) 长度不固定且其最大长度为 n 的字串,n 不能超过 4000。 graphic(n) 和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。这个形态是为了支援两个字元长度的字体,例如中文字。 vargraphic(n) 可变长度且其最大长度为 n 的双字元字串,n不能超过 2000 date 包含了 年份、月份、日期。 time 包含了 小时、分钟、秒 timestamp 包含了 年、月、日、时、分、秒、千分之一秒 datetime DATETIME 类型用于存储日期和时间信息。它的格式通常是 “YYYY-MM-DD HH:MM:SS” ...

2012-07-08 · 1 min · 134 words · -

adb shell sqlite DB

adb shell sqlite DB 在Android应用程序开发中,我们有时可能会用到系统中自带内嵌的数据库sqlite3,例如我们在某个应用程序中创建了数据库,如何查看该数据库或者如何查看该数据库中包含有哪些表或数据。下面是我在应用程序中创建了一个数据库以及表,如何采用命令行的方式去查看该数据库和表 cd /data/data/com.wiloon.android.rsslab/databases sqlite3 RssLab .tables select * from tag; com.wiloon.android.rsslab 是包名. RssLab 是数据库名. tag: 表名 .exit 退出. 查看字段名 .header on 查看sqlite3表结构的命令 在android下通过adb shell命令可以进入sqlite3的命令行client,见: 在android命令行下使用sqlite3。 如果想列出该数据库中的所有表,可: .table 如果想查看这些表的结构: select * from sqlite_master where type=“table”; 可以看到类似: 默认情况下,不会出现红框中的表头,需要之前设置,命令为: .header on 如果只想查看具体一张表的表结构,比如查看emperors表,命令为: select * from sqlite_master where type=“table” and name=“emperors”; 另外,也可以这样: sqlite> .schema emperors CREATE TABLE emperors( id integer primary key autoincrement, name text,dynasty text,start_year text); http://marshal.easymorse.com/index.html%3Fp=2981.html

2012-07-08 · 1 min · 68 words · -

java, break/continue

java, break/continue 使用break 退出循环 可以使用break 语句直接强行退出循环,忽略循环体中任何其他语句和循环条件测试。在循环中遇到break语句时,循环被终止,程序控制在循环后面语句重新开始。例如 如果for 循环被设计为从 0执行到99,然后输出0到99这些数字,但是当i等于10时,break语句终止程序。所以程序只会输出0到10。 在一系列嵌套循环中使用break 语句时,它将仅仅终止最里面循环。 而continue则停止执行当前的反复,然后退回循环起始和,开始新的反复。continue 用于跳过循环体中的一部分语句,也就是不执行这部分语句 return语句用来明确地从一个方法返回。也就是,return 语句使程序控制返回到调用它方法。因此,将它分类为跳转语句。尽管对return 语句详细讨论在第 7 章开始,这里对其作简要地介绍。在一个方法任何时间,return 语句可被用来使正在执行分支程序返回到调用它方法。下面例子说明这一点。下例中,由于是Java 运行系统调用main() ,因此,return语句使程序执行返回到Java 运行系统。 http://java.chinaitlab.com/base/799194.html

2012-07-08 · 1 min · 23 words · -

ReentrantLock,互斥锁,重入锁

ReentrantLock,互斥锁,重入锁 在并发编程中,多线程同时并发访问的资源叫做临界资源,当多个线程同时访问对象并要求操作相同资源时,分割了原子操作就有可能出现数据的不一致或数据不完整的情况,为避免这种情况的发生,我们会采取同步机制,以确保在某一时刻,方法内只允许有一个线程。 synchronized 采用 synchronized 修饰符实现的同步机制叫做互斥锁机制,它所获得的锁叫做互斥锁。每个对象都有一个 monitor (锁标记),当线程拥有这个锁标记时才能访问这个资源,没有锁标记便进入锁池。任何一个对象系统都会为其创建一个互斥锁,这个锁是为了分配给线程的,防止打断原子操作。每个对象的锁只能分配给一个线程,因此叫做互斥锁。 这里就使用同步机制获取互斥锁的情况,进行几点说明: 如果同一个方法内同时有两个或更多线程,则每个线程有自己的局部变量拷贝。 类的每个实例都有自己的对象级别锁。当一个线程访问实例对象中的 synchronized 同步代码块或同步方法时,该线程便获取了该实例的对象级别锁,其他线程这时如果要访问 synchronized 同步代码块或同步方法,便需要阻塞等待,直到前面的线程从同步代码块或方法中退出,释放掉了该对象级别锁。 访问同一个类的不同实例对象中的同步代码块,不存在阻塞等待获取对象锁的问题,因为它们获取的是各自实例的对象级别锁,相互之间没有影响。 持有一个对象级别锁不会阻止该线程被交换出来,也不会阻塞其他线程访问同一示例对象中的非synchronized代码。当一个线程A持有一个对象级别锁 (即进入了 synchronized 修饰的代码块或方法中) 时,线程也有可能被交换出去,此时线程B有可能获取执行该对象中代码的时间,但它只能执行非同步代码 (没有用synchronized修饰) ,当执行到同步代码时,便会被阻塞,此时可能线程规划器又让A线程运行,A线程继续持有对象级别锁,当A线程退出同步代码时 (即释放了对象级别锁) ,如果B线程此时再运行,便会获得该对象级别锁,从而执行synchronized中的代码。 持有对象级别锁的线程会让其他线程阻塞在所有的 synchronized 代码外。例如,在一个类中有三个synchronized方法 a,b,c,当线程A正在执行一个实例对象M中的方法 a 时,它便获得了该对象级别锁,那么其他的线程在执行同一实例对象 (即对象M) 中的代码时,便会在所有的 synchronized 方法处阻塞,即在方法 a,b,c处都要被阻塞,等线程A释放掉对象级别锁时,其他的线程才可以去执行方法a,b或者c中的代码,从而获得该对象级别锁。 使用 synchronized (obj) 同步语句块,可以获取指定对象上的对象级别锁。obj为对象的引用,如果获取了obj对象上的对象级别锁,在并发访问obj对象时时,便会在其synchronized代码处阻塞等待,直到获取到该obj对象的对象级别锁。当obj为 this 时,便是获取当前对象的对象级别锁。 类级别锁被特定类的所有示例共享,它用于控制对static成员变量以及static方法的并发访问。具体用法与对象级别锁相似。 互斥是实现同步的一种手段,临界区、互斥量和信号量都是主要的互斥实现方式. synchronized 关键字经过编译后,会在同步块的前后分别形成 monitorenter 和 monitorexit 这两个字节码指令。根据虚拟机规范的要求,在执行 monitorenter 指令时,首先要尝试获取对象的锁,如果获得了锁,把锁的计数器加1,相应地,在执行 monitorexit 指令时会将锁计数器减1,当计数器为0时,锁便被释放了。由于synchronized 同步块对同一个线程是可重入的,因此一个线程可以多次获得同一个对象的互斥锁,同样,要释放相应次数的该互斥锁,才能最终释放掉该锁。 synchronized 是非公平锁 (TODO: 需要测试,没重现成功…) https://blog.csdn.net/FU250/article/details/106640613 ReentrantLock ReentrantLock 是一个可重入的互斥锁,又被称为"独占锁"。ReentrantLock 的实现不仅可以替代隐式的 synchronized 关键字,而且能够提供超过关键字本身的多种功能。 而锁的名字也是说明了这个锁具备了重复进入的可能,也就是说能够让当前线程多次的进行对锁的获取操作,这样的最大次数限制是 Integer.MAX_VALUE,约 21 亿次左右。 ...

2012-07-08 · 5 min · 940 words · -

CopyOnWriteArrayList

CopyOnWriteArrayList http://www.cnblogs.com/sunwei2012/archive/2010/10/08/1845656.html 除了加锁外,还有一种方式可以防止并发修改异常,就是读写分离技术 (不是数据库上的) 。 先回顾一下一个常识: JAVA中"=“操作只是将引用和某个对象关联,假如同时有一个线程将引用指向另外一个对象,一个线程获取这个引用指向的对象,那么他们之间不会发生ConcurrentModificationException,他们是在虚拟机层面阻塞的,而且速度非常快,几乎不需要CPU时间。 JAVA中两个不同的引用指向同一个对象,当第一个引用指向另外一个对象时,第二个引用还将保持原来的对象。 基于上面这个常识,我们再来探讨下面这个问题: 在CopyOnWriteArrayList里处理写操作 (包括add、remove、set等) 是先将原始的数据通过JDK1.6的Arrays.copyof()来生成一份新的数组 然后在新的数据对象上进行写,写完后再将原来的引用指向到当前这个数据对象 (这里应用了常识1) ,这样保证了每次写都是在新的对象上 (因为要保证写的一致性,这里要对各种写操作要加一把锁,JDK1.6在这里用了重入锁) , 然后读的时候就是在引用的当前对象上进行读 (包括get,iterator等) ,不存在加锁和阻塞,针对iterator使用了一个叫COWIterator的阉割版迭代器,因为不支持写操作,当获取CopyOnWriteArrayList的迭代器时,是将迭代器里的数据引用指向当前引用指向的数据对象,无论未来发生什么写操作,都不会再更改迭代器里的数据对象引用,所以迭代器也很安全 (这里应用了常识2) 。 CopyOnWriteArrayList中写操作需要大面积复制数组,所以性能肯定很差,但是读操作因为操作的对象和写操作不是同一个对象,读之间也不需要加锁,读和写之间的同步处理只是在写完后通过一个简单的”=“将引用指向新的数组对象上来,这个几乎不需要时间,这样读操作就很快很安全,适合在多线程里使用,绝对不会发生ConcurrentModificationException,所以最后得出结论: CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里,比如缓存。

2012-07-08 · 1 min · 24 words · -

ConcurrentHashMap/CopyOnWriteArrayList

ConcurrentHashMap/CopyOnWriteArrayList ConcurrentHashMap, CopyOnWriteArrayList 并发集合类 ConcurrentHashMap 和 CopyOnWriteArrayList(转) 在Java类库中出现的第一个关联的集合类是 Hashtable ,它是JDK 1.0的一部分。 Hashtable 提供了一种易于使用的、线程安全的、关联的map功能,这当然也是方便的。然而,线程安全性是凭代价换来的―― Hashtable 的所有方法都是同步的。此时,无竞争的同步会导致可观的性能代价。 Hashtable 的后继者 HashMap 是作为JDK1.2中的集合框架的一部分出现的,它通过提供一个不同步的基类和一个同步的包装器 Collections.synchronizedMap ,解决了线程安全性问题。通过将基本的功能从线程安全性中分离开来, Collections.synchronizedMap 允许需要同步的用户可以拥有同步,而不需要同步的用户则不必为同步付出代价。 Hashtable 和 synchronizedMap 所采取的获得同步的简单方法 (同步 Hashtable 中或者同步的 Map 包装器对象中的每个方法) 有两个主要的不足。首先,这种方法对于可伸缩性是一种障碍,因为一次只能有一个线程可以访问hash表。同时,这样仍不足以提供真正的线程安全性,许多公用的混合操作仍然需要额外的同步。虽然诸如 get() 和 put() 之类的简单操作可以在不需要额外同步的情况下安全地完成,但还是有一些公用的操作序列,例如迭代或者put-if-absent (空则放入) ,需要外部的同步,以避免数据争用。 有条件的线程安全性 同步的集合包装器 synchronizedMap 和 synchronizedList ,有时也被称作 有条件地线程安全――所有单个的操作都是线程安全的,但是多个操作组成的操作序列却可能导致数据争用,因为在操作序列中控制流取决于前面操作的结果。 清单1中第一片段展示了公用的put-if-absent语句块――如果一个条目不在 Map 中,那么添加这个条目。不幸的是,在 containsKey() 方法返回到 put() 方法被调用这段时间内,可能会有另一个线程也插入一个带有相同键的值。如果您想确保只有一次插入,您需要用一个对 Map m 进行同步的同步块将这一对语句包装起来。 http://www-128.ibm.com/developerworks/cn/java/j-jtp07233/index.html#listing1 中其他的例子与迭代有关。在第一个例子中, List.size() 的结果在循环的执行期间可能会变得无效,因为另一个线程可以从这个列表中删除条目。如果时机不得当,在刚好进入循环的最后一次迭代之后有一个条目被另一个线程删除了,则 List.get() 将返回 null ,而 doSomething() 则很可能会抛出一个 NullPointerException 异常。那么,采取什么措施才能避免这种情况呢?如果当您正在迭代一个 List 时另一个线程也可能正在访问这个 List ,那么在进行迭代时您必须使用一个 synchronized 块将这个 List 包装起来,在 List 1 上同步,从而锁住整个 List 。这样做虽然解决了数据争用问题,但是在并发性方面付出了更多的代价,因为在迭代期间锁住整个 List 会阻塞其他线程,使它们在很长一段时间内不能访问这个列表。 ...

2012-07-08 · 2 min · 419 words · -

分布式消息队列

分布式消息队列 分布式消息队列是是大型分布式系统不可缺少的中间件,主要解决应用耦合、异步消息、流量削锋等问题。实现高性能、高可用、可伸缩和最终一致性架构。 对于一个架构师来说,在大型系统设计中,会经常需要面对同步和异步等架构问题,搞明白这些问题,能更好地实现程序并行执行,减少等待或无效操作,以及充分利用计算机的性能! 本文将详细讲解: 1.同步架构和异步架构的区别 2.异步架构的主要组成部分: 消息生产者、消息消费者、分布式消息队列 3.异步架构的两种主要模型: 点对点模型和发布订阅模型。 4.消息队列的好处 5.消息队列相关产品 建议用10min通读,搞懂分布式消息队列的核心内容。 一、同步架构和异步架构的区别 1.同步调用 是指从请求的发起一直到最终的处理完成期间,请求的调用方一直在同步阻塞等待调用的处理完成。 图片描述 如图,在这个例子中客户端代码ClientCode,需要执行发送邮件sendEmail这样一个操作,它会调用EmailService进行发送,而EmailService会调用SmtpEmailAdapter这样一个类来进行处理,而这个类会调用远程的一个服务,通过SMTP和TCP协议把请求发送给它。 而远程服务器收到消息以后会对消息进行一系列的操作,然后将邮件发送出去,再进行返回。Adapter收到返回后,再返回给EmailService,EmailService收到返回后再把返回结果返回给Clientcode。 图片描述 ClientCode在sendEmail发出请求后,就一直都阻塞在这里,等待最终调用结果的返回,是成功还是失败。因为这个过程是阻塞等待的,所以这个过程也就是同步调用。 2.异步调用 是指在请求发起的处理过程中,客户端的代码已经返回了,它可以继续进行自己的后续操作,而不需要等待调用处理完成,这就叫做异步调用。 图片描述 异步调用过程,同样看刚刚发送邮件的例子,用户Clientcode调用EmailService以后,EmailService会把这个调用请求发送给消息队列,然后就立即返回了。Clientcode收到返回以后继续向下处理,不会继续阻塞等待。实际上消息发送到Queue后,还没有被处理,我们看到后面的消息消费,其实要比EmailService返回可能还要晚一点,EmailService返回以后消息才会被消费处理。 有一个QueueConsumer消息队列的消费者,从消息队列中取出这个消息,再把这个消息发送给SmtpAdapter,也就是调用SmtpAdapter,处理逻辑跟同步调用一样,SmtpAdapter通过SMTP的通讯协议,把消息发送给远程的一个服务器,进行邮件发送,通过RemoteServer进行处理,处理完了收到返回,再把返回结果通知消息队列Queue。 在这个过程中,客户端的调用,也就是应用程序的调用,和业务逻辑真正发送邮件的操作是不同步的。 二、异步架构的主要组成部分 使用异步调用架构的主要手段,就是通过消息队列构建 消息的生产者将消息发送到消息队列以后,由消息的消费者从消息队列中获取消息,然后进行业务逻辑的处理,消息的生产者和消费者是异步处理的,彼此不会等待阻塞,所以叫做异步架构。 使用消息队列构建一个异步调用架构,你需要了解如下3种角色。 1.消息的生产者 是客户端应用程序代码的一部分,用来初始化异步调用处理流程。在基于消息队列的处理中,生产者的职责非常少,它要做的就是创建一个合法的消息,并把这个消息发送到消息队列中,由应用开发者决定生产者的代码在哪里执行,什么时候发送消息。 2.消息队列 消息队列是消息发送的目的地和发给消费者的一个缓冲。消息队列实现的方法有好多种,可以用共享文件夹,也可以用关系数据库或者NoSQL系统,当然最主要的还是使用专门的分布式消息队列服务器来实现。 3.消息的消费者 消息的消费者从消息队列中接受并处理消息,消息的消费者也是由应用开发者实现的,但是它是一个异步处理的组件。消息的消费者不需要知道生产者存在,它只依赖消息队列中的消息。消息的消费者通常部署在独立的服务器上,和消息的生产者完全隔离,并且可以通过添加硬件的方式进行伸缩。 三、异步架构的两种主要模型 使用消息队列构建异步的调用架构,你还需要知道两种模型: 点对点模型和发布订阅模型。 1.点对点模型 消费者和生产者只需要知道消息队列的名字,生产者发送消息到消息队列中,而消息队列的另一端是多个消费者竞争消费消息,每个到达消息队列的消息只会被路由到一个消费者中去,所以消费者看到的是全部消息的一个子集。我们看这张图,消息的生产者有多个,消息的消费者也有多个,多个生产者将消息发送到消息队列中,而有多个消费者去消息队列中对消息进行竞争性的消费。每个消息只会被一个消费者消费,每个消费者只会消费消息队列中的一部分消息。 2.发布订阅模型 在发布订阅模型中,消息可能被发送到不止一个消费者,生产者发送消息到一个主题,而不是队列中。消息被发布到主题后,就会被克隆给每一个订阅它的消费者,每个消费者接收一份消息复制到自己的私有队列。消费者可以独立于其他消费者使用自己订阅的消息,消费者之间不会竞争消息。常用的分布式消息队列都支持发布订阅模型,也就是说消息的发布订阅模型是分布式消息队列的一个功能特性。 3.两个模型的应用 点对点模型: 主要用于一些耗时较长的、逻辑相对独立的业务。 比如说我前面的讲到的发送邮件这样一个操作。因为发送邮件比较耗时,而且应用程序其实也并不太关心邮件发送是否成功,发送邮件的逻辑也相对比较独立,所以它只需要把邮件消息丢到消息队列中就可以返回了,而消费者也不需要关心是哪个生产者去发送的邮件,它只需要把邮件消息内容取出来以后进行消费,通过远程服务器将邮件发送出去就可以了。而且每个邮件只需要被发送一次。所以消息只被一个消费者消费就可以了。 发布订阅模型: 如新用户注册这样一个消息,需要使用按主题发布的方式。 比如新用户注册,一个新用户注册成功以后,需要给用户发送一封激活邮件,发送一条欢迎短信,还需要将用户注册数据写入数据库,甚至需要将新用户信息发送给关联企业的系统,比如淘宝新用户信息发送给支付宝,这样允许用户可以一次注册就能登录使用多个关联产品。一个新用户注册,会把注册消息发送给一个主题,多种消费者可以订阅这个主题。比如发送邮件的消费者、发送短信的消费者、将注册信息写入数据库的消费者,跨系统同步消息的消费者等。 四、消息队列的好处 1.实现异步处理,提升处理性能 对一些比较耗时的操作,可以把处理过程通过消息队列进行异步处理。这样做可以推迟耗时操作的处理,使耗时操作异步化,而不必阻塞客户端的程序,客户端的程序在得到处理结果之前就可以继续执行,从而提高客户端程序的处理性能。 2.可以让系统获得更好的伸缩性 耗时的任务可以通过分布式消息队列,向多台消费者服务器并行发送消息,然后在很多台消费者服务器上并行处理消息,也就是说可以在多台物理服务器上运行消费者。那么当负载上升的时候,可以很容易地添加更多的机器成为消费者。 图片描述 如图中的例子,用户上传文件后,通过发布消息的方式,通知后端的消费者获取数据、读取文件,进行异步的文件处理操作。那么当前端发布更多文件的时候,或者处理逻辑比较复杂的时候,就可以通过添加后端的消费者服务器,提供更强大的处理能力。 3.可以平衡流量峰值,削峰填谷 使用消息队列,即便是访问流量持续的增长,系统依然可以持续地接收请求。这种情况下,虽然生产者发布消息的速度比消费者消费消息的速度快,但是可以持续的将消息纳入到消息队列中,用消息队列作为消息的缓冲,因此短时间内,发布者不会受到消费处理能力的影响。 从这张图可以看到,因为消息的生产者是直接面向用户请求的,而用户的请求访问压力是不均衡的。如淘宝每天的访问高峰是在上午10点左右,而新浪微博则可能在某个明星半夜发一条微博后突然出现访问高峰。 在访问高峰,用户的并发访问数可能超过了系统的处理能力,所以在高峰期就可能会导致系统负载过大,响应速度变慢,更严重的可能会导致系统崩溃。这种情况下,通过消息队列将用户请求的消息纳入到消息队列中,通过消息队列缓冲消费者处理消息的速度。 如图中所示,消息的生产者它有高峰有低谷,但是到了消费者这里,只会按照自己的最佳处理能力去消费消息。高峰期它会把消息缓冲在消息队列中,而在低谷期它也还是使用自己最大的处理能力去获取消息,将前面缓冲起来、来不及及时处理的消息处理掉。那么,通过这种手段可以实现系统负载消峰填谷,也就是说将访问的高峰消掉,而将访问的低谷填平,使系统处在一个最佳的处理状态之下,不会对系统的负载产生太大的冲击。 4.失败隔离和自我修复 因为发布者不直接依赖消费者,所以分布式消息队列可以将消费者系统产生的错误异常与生产者系统隔离开来,生产者不受消费者失败的影响。 当在消息消费过程中出现处理逻辑失败的时候,这个错误只会影响到消费者自身,而不会传递给消息的生产者,也就是应用程序可以按照原来的处理逻辑继续执行。 所以,这也就意味着在任何时候都可以对后端的服务器执行维护和发布操作。可以重启、添加或删除服务器,而不影响生产者的可用性,这样简化了部署和服务器管理的难度。 5.可以使生产者和消费者的代码实现解耦合 也就是说可以多个生产者发布消息,多个消费者处理消息,共同完成完整的业务处理逻辑,但是它们的不需要直接的交互调用,没有代码的依赖耦合。在传统的同步调用中,调用者代码必须要依赖被调用者的代码,也就是生产者代码必须要依赖消费者的处理逻辑代码,代码需要直接的耦合,而使用消息队列,这两部分的代码不需要进行任何的耦合。 耦合程度越低的代码越容易维护,也越容易进行扩展。 比如新用户注册,如果用传统同步调用的方式,那么发邮件、发短信、写数据库、通知关联系统这些代码会和用户注册代码直接耦合起来,整个代码看起来就是完成用户注册逻辑后,后面必然跟着发邮件、发短信这些代码。如果要新增一个功能,比如将监控用户注册情况,将注册信息发送到业务监控系统,就必须要修改前面的代码,至少增加一行代码,发送注册信息到监控系统,我们知道,任何代码的修改都可能会引起bug。 ...

2012-07-07 · 1 min · 100 words · -

cxf wsdl2java

cxf wsdl2java wsdl2java -d src -client http://localhost:9000/helloWorld?wsdl 其作用上面的build.xml作用一样。 附加: wsdl2java用法: wsdl2java -p com -d src -all aa.wsdl -p 指定其wsdl的命名空间,也就是要生成代码的包名: -d 指定要产生代码所在目录 -client 生成客户端测试web service的代码 -server 生成服务器启动web service的代码 -impl 生成web service的实现代码 -ant 生成build.xml文件 -all 生成所有开始端点代码: types,service proxy,,service interface, server mainline, client mainline, implementation object, and an Ant build.xml file. 详细用法见: http://cwiki.apache.org/CXF20DOC/wsdl-to-java.html

2012-07-06 · 1 min · 50 words · -

hacker/cracker

hacker/cracker hacker A person who delights in having an intimate understanding of the internal workings of a system, computers and computer networks in particular. The term is often misused in a pejorative context, where “cracker” would be the correct term. See also: cracker. cracker A cracker is an individual who attempts to access computer systems without authorization. These individuals are often malicious, as opposed to hackers, and have many means at their disposal for ...

2012-07-05 · 1 min · 89 words · -

jvm http proxy

jvm http proxy http://i4t.org/2007/05/04/java-http-proxy-settings/ Java HTTP Proxy Settings OVERVIEW For local networks within an organization, access to the public-domain Internet is often via a HTTP Proxy. This article talks about the HTTP proxy settings for the Java environment. I did not find a good document on the Web to describe these settings; Had to discover many of them by trial-and-error. Hence this article. KEYWORDS HTTP Proxy, Java Proxy Settings, Tomcat, Application Server, Servlets, HTTP Proxy Authentication for Java, Java Application Proxy Settings ...

2012-07-05 · 2 min · 363 words · -

linux shell 进程监控

linux shell 进程监控 进程内存占用 top -p <PID> # 查看进程的status文件 cat /proc/2913/status http://www.ibm.com/developerworks/cn/linux/l-cn-shell-monitoring/index.html?ca=drs- function GetPID #User #Name { PsUser=$1 PsName=$2 pid=\`ps -u $PsUser|grep $PsName|grep -v grep|grep -v vi|grep -v dbxn |grep -v tail|grep -v start|grep -v stop |sed -n 1p |awk '{print $1}'\` echo $pid } function killJboss { jbosspid=\`ps -ef | grep -i jboss | grep -v grep |grep -v killJboss.sh | awk '{print $2}'\` if [ "$jbosspid" != "" ]; then echo "Killing Jboss." echo $jbosspid for pid in $jbosspid do kill -9 $pid done fi } function GetCpu { CpuValue=\`ps -p $pid -o pcpu |grep -v CPU | awk '{print $1}' | awk -F. '{print $1}'\` echo $CpuValue } function GetMem { MEMUsage=\`ps -o vsz -p $1|grep -v VSZ\` (( MEMUsage /= 1000)) echo $MEMUsage } 检测进程句柄使用量 ...

2012-07-05 · 2 min · 352 words · -

awk command

awk command [ɔk] 参数 -F fs, --field-separator=fs, # 指定输入文件折分隔符,fs 是一个字符串或者是一个正则表达式 print ‘{pirnt $2}’, print 外层要用单引号, 不能用双引号 $0 代表当前行 内建变量 NF 一条记录的字段的数目 commands #最短行: awk '(NR==1||length(min)>length()){min=$0}END{print min}' data.txt # 最长行: awk '{if (length(max)<length()) max=$0}END{print max}' data.txt # 单独使用 awk, 不需要 cat awk '{print $1}' /tmp/foo.txt cat dep-clean|awk -F '@' '{if(NF>2){print "\"""@"$2"\""":"$3} else {pint $1":"$2}}' cat dep-clean|awk -F '@' '{if(NF<3){print "\""$1"\""":"$2}}' cat dep-clean|awk -F '@' '{if(NF>2){print "\"""@"$2"\""":"$3} else if (NF<3) {print $1":"$2}}' # kill all java process ps -ef |grep java|awk '{print $2}'|xargs -t -n 1 kill -9 # 取本机ip >https://www.cnblogs.com/poloyy/p/12212868.html ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/, "\\1", "g", $2)}' # print column range awk '{for(i=1;i<=NF-1;i++) printf $i" "; print ""}' marks.txt # 统计每一行逗号出现的次数 awk -F "," '{pirnt NF-1}' foo.txt 变量 除了 $ + 数字表示某个字段,awk 还提供其他一些变量。 ...

2012-07-05 · 5 min · 947 words · -

linux shell split string

linux shell split string sentence="This is a sentence." for word in $sentence do echo $word done `` this is a sentence.

2012-07-04 · 1 min · 21 words · -

英语日期

英语日期 英文日期分英式和美式,如下: 8th March,2004 或8 March,2004 (英式) March 8th,2004 或March 8,2004 (美式) 日期写法宜遵从下列规则: 1)年份必须完全写明,不可用"04代替2004; 2)月份必须用英文拼出或采用公认的简写,即 January (Jan.), February (Feb.), March(Mar.), April(Apr.), May(May.), June(June.), July(July.), August(Aug.), September(Sept.), October(Oct.), November(Nov.), December(Dec.); 注意: 正规的英语中六月,七月,九月的缩写是4个字母,其他月份3个字母。挂历上见到的Jun,Jul,Sep是错误的 3)日期可用序数词,如: 1st,2nd,3rd,4th,…;也可用基数词,如: 1,2,3,4,…。但美式大多采用后者; 4)在年份和月日之间必须用逗号隔开; 5)日期不可全部采用如7.12.2003或7/12/2003的阿拉伯数字书写,否则会引起误解。因为英美在这方面的习惯用法不同。按美国人习惯,上述日期为2003年7月12日,而按英国习惯则是2003年12月7日.

2012-07-04 · 1 min · 36 words · -

EFI boot

EFI boot EFI boot 介绍 EFI 的全称是可扩展固件接口 (Extensible Firmware Interface),它是 Intel 公司为全新类型的固件体系结构、接口和服务提出的建议性标准。该标准有两个主要用途: 向操作系统的引导程序和某些在计算机初始化时运行的应用程序提供一套标准的运行环境;为操作系统提供一套与固件通讯的交互协议。 简单说,EFI 是 BIOS 的替代者。它为操作系统和固件提供了更加强大、安全、方便的交互途径。EFI 规范定义的接口,包括数据表包含平台的信息,可在 OS Loader 和 OS 的启动和运行时服务。 EFI 固件提供了几种技术优势: 引导能力支持大容量磁盘 (超过 2 TIB ) 更快的启动 独立 CPU 的体系结构 CPU 的独立的驱动程序 灵活的预操作系统环境,包括网络功能 模块化设计 EFI 启动还需要一个特殊的分区表,该分区表指向一个特殊的文件。通常情况下该文件位于 EFI 路径,EFI 启动涉及到一个写入到 firmware 中的 boot loader, EFI 并不把启动程序放置在 MBR 中,firmware 知道如何读取分区表以及 FAT 的文件格式。EFI 系统分区是用 FAT 格式格式化的特定分区,其中包含 boot loader, 该 boot loader 是 EFI 可执行程序,可被 EFI boot manager 载入和运行。 Boot loader 被设置为一个可以通过固件访问的文件。Boot loader 允许用户选择并加载操作系统。所有的 boot manager 都包含一个 EFI 变量,该变量被用来定义固件配置参数。 ...

2012-07-02 · 1 min · 181 words · -

Database – DDL,DML,DCL,TCL

Database – DDL,DML,DCL,TCL DDL (Data Definition Language) 数据库定义语言statements are used to define the database structure or schema. DDL是SQL语言的四大功能之一。 用于定义数据库的三级结构,包括外模式、概念模式、内模式及其相互之间的映像,定义数据的完整性、安全控制等约束 DDL不需要commit. CREATE ALTER DROP TRUNCATE COMMENT RENAME DML (Data Manipulation Language) 数据操纵语言statements are used for managing data within schema objects. 由DBMS提供,用于让用户或程序员使用,实现对数据库中数据的操作。 DML分成交互型DML和嵌入型DML两类。 依据语言的级别,DML又可分成过程性DML和非过程性DML两种。 需要commit. SELECT INSERT UPDATE DELETE MERGE CALL EXPLAIN PLAN LOCK TABLE 3.DCL (Data Control Language) 数据库控制语言 授权,角色控制等 GRANT 授权 REVOKE 取消授权 4.TCL (Transaction Control Language) 事务控制语言 SAVEPOINT 设置保存点 ...

2012-07-01 · 2 min · 400 words · -

SQL99

SQL99 来自ITwiki,开放的信息技术大百科 http://wiki.ccw.com.cn/SQL99 SQL99是数据库的一个ANSI/ISO标准。这个标准的前身是SQL92 ANSI/ISO标准,而SQL92之前还有一个SQL89 ANSI/ISO标准。它定义了一种语言 (SQL) 以及数据库的行为 (事务、隔离级别等) 。你知道许多商业数据库至少在某种程度上是符合SQL99的吗?不过,这对于查询和应用的可移植性没有多大的意义,这一点你也清楚吗? SQL92标准有4个层次: q 入门级 (Entry level) 。这是大多数开发商符合的级别。这一级只是对前一个标准SQL89稍做修改。所有数据库开发商都不会有更高的级别,实际上,美国国家标准和技术协会NIST (National Institute of Standards and Technology,这是一家专门检验SQL合规性的机构) 除了验证入门级外,甚至不做其他的验证。Oracle 7.0于1993年通过了NIST的SQL92入门级合规性验证,那时我也是小组中的一个成员。如果一个数据库符合入门级,它的特性集则是Oracle 7.0的一个功能子集。 q 过渡级。这一级在特性集方面大致介于入门级和中间级之间。 q 中间级。这一级增加了许多特性,包括 (以下所列并不完整) : n 动态SQL n 级联DELETE以保证引用完整性 n DATE和TIME数据类型 n 域 n 变长字符串 n CASE表达式 n 数据类型之间的CAST函数 q 完备级。增加了以下特性 (同样,这个列表也不完整) : n 连接管理 n BIT串数据类型 n 可延迟的完整性约束 n FROM子句中的导出表 n CHECK子句中的子查询 n 临时表 入门级标准不包括诸如外联结 (outer join) 、新的内联结 (inner join) 语法等特性。过渡级则指定了外联结语法和内联结语法。中间级增加了更多的特性,当然,完备级就是SQL92全部。有关SQL92的大多数书都没有区别这些级别,这就会带来混淆。这些书只是说明了一个完整实现SQL92的理论数据库会是什么样子。所以无论你拿起哪一本书,都无法将书中所学直接应用到任何SQL92数据库上。关键是,SQL92最多只达到入门级,如果你使用了中间级或更高级里的特性,就存在无法"移植"应用的风险。 SQL99只定义了两级一致性: 核心 (core) 一致性和增强 (enhanced) 一致性。SQL99力图远远超越传统的"SQL",并引入了一些对象—关系构造 (数组、集合等) 。它包括SQL MM (多媒体,multimedia) 类型、对象—关系类型等。还没有哪个开发商的数据库经认证符合SQL99核心级或增强级,实际上,据我所知,甚至没有哪个开发商声称他们的产品完全达到了某级一致性。 对于不同的数据库来说,SQL语法可能存在差异,实现有所不同,同一个查询在不同数据库中的性能也不一样,不仅如此,还存在并发控制、隔离级别、查询一致性等问题。我们将在第7章详细讨论这些问题,并介绍不同数据库的差异对你会有什么影响。 SQL92/SQL99试图对事务应如何工作以及隔离级别如何实现给出一个明确的定义,但最终,不同的数据库还是有不同的结果。这都是具体实现所致。在一个数据库中,某个应用可能会死锁并完全阻塞。但在另一个数据库中,同样是这个应用,这些问题却有可能不会发生,应用能平稳地运行。在一个数据库中,你可能利用了阻塞 (物理串行化) ,但在另一个数据库上部署时,由于这个数据库不会阻塞,你就会得到错误的答案。要将一个应用部署在另一个数据库上,需要花费大量的精力,付出艰辛的劳动,即使你100%地遵循标准也不例外。 关键是,不要害怕使用开发商特有的特性,毕竟,你为这些特性花了钱。每个数据库都有自己的一套"技巧",在每个数据库中总能找到一种完成操作的好办法。要使用最适合当前数据库的做法,移植到其他数据库时再重新实现。要使用合适的编程技术,从而与这些修改隔离,我把这称为防御式编程 (defensive programming) 。 取自"http://wiki.ccw.com.cn/SQL99"

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

SQL92

SQL92 http://baike.baidu.com/view/1889818.htm SQL92是数据库的一个ANSI/ISO标准 这个标准的前身是SQL92 ANSI/ISO标准,而SQL92之前还有一个SQL89 ANSI/ISO标准。 它定义了一种语言 (SQL) 以及数据库的行为 (事务、隔离级别等) 。你知道许多商业数据库至少在某种程度上是符合SQL92的吗?不过,这对于查询和应用的可移植性没有多大的意义,这一点你也清楚吗? SQL92标准有4个层次 入门级 (Entry level) 。 这是大多数开发商符合的级别。这一级只是对前一个标准SQL89稍做修改。所有数据库开发商都不会有更高的级别,实际上,美国国家标准和技术协会NIST (National Institute of Standards and Technology,这是一家专门检验SQL合规性的机构) 除了验证入门级外,甚至不做其他的验证。Oracle 7.0于1993年通过了NIST的SQL92入门级合规性验证,那时我也是小组中的一个成员。如果一个数据库符合入门级,它的特性集则是Oracle 7.0的一个功能子集。 过渡级 这一级在特性集方面大致介于入门级和中间级之间。 中间级 这一级增加了许多特性,包括 (以下所列并不完整) : 动态SQL 级联DELETE以保证引用完整性 DATE和TIME数据类型 域 变长字符串 CASE表达式 数据类型之间的CAST函数 完备级 增加了以下特性 (同样,这个列表也不完整) : 连接管理 BIT串数据类型 可延迟的完整性约束 FROM子句中的导出表 CHECK子句中的子查询 临时表 入门级标准不包括诸如外联结 (outer join) 、新的内联结 (inner join) 语法等特性。过渡级则指定了外联结语法和内联结语法。中间级增加了更多的特性,当然,完备级就是SQL92全部。有关SQL92的大多数书都没有区别这些级别,这就会带来混淆。这些书只是说明了一个完整实现SQL92的理论数据库会是什么样子。所以无论你拿起哪一本书,都无法将书中所学直接应用到任何SQL92数据库上。关键是,SQL92最多只达到入门级,如果你使用了中间级或更高级里的特性,就存在无法"移植"应用的风险。

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

T-SQL

T-SQL SQL 程式设计语言的增强版,它是用来让应用程式与 SQL Server 沟通的主要语言。T-SQL 提供标准 SQL的DDL 和 DML 功能,加上延伸的函数、系统预存程序以及程式设计结构(例如 IF 和 WHILE)让程式设计更有弹性。 Transact Structured Query Language 它是ANSI和ISO SQL 标准的Microsoft SQL Server方言或扩展,中文理解为: SQL SERVER专用标准结构化查询语言增强版。在 Microsoft SQL Server 7.0 中 T-SQL 有着为数不少的新增功能,包括新的预存程序、系统资料表、函数、资料型别、陈述式以及现存陈述式中的选项。这些都被保留在 SQL Server 2000 中,因此我们在这里要先回顾 (特别是在您还不很熟悉 SQL Server 7.0 中 T-SQL 的功能,这个温习就很重要了)。因为有太多的新功能需要讨论,在此我们仅为每个类别举少数例子来加以介绍。

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

XML & JSON

‘XML & JSON’ 目前,在web开发领域,主要的数据交换格式有XML和JSON,对于XML相信每一个web developer都不会感到陌生;相比之下,JSON可能对于一些新步入开发领域的新手会感到有些陌生,也可能你之前已经听说过,但对于XML和 JSON的不同之处可能会不怎么了解。对于在 Ajax开发中,是选择XML还是JSON,一直存在着争议,个人还是比较倾向于JSON的,虽然JSON才处于起步阶段,但我相信JSON最终会取代XML成为Ajax的首选,到时Ajax可能要更名为Ajaj(Asynchronous JavaScript and JSON)了; 1.数据交换格式比较之关于XML和JSON: XML: extensible markup language,一种类似于HTML的语言,他没有预先定义的标签,使用DTD(document type definition)文档类型定义来组织数据;格式统一,跨平台和语言,早已成为业界公认的标准。具体的可以问Google或百度。相比之JSON这种轻量级的数据交换格式,XML可以称为重量级的了。 JSON : JavaScript Object Notation 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language , Standard ECMA-262 3rd Edition - December 1999 的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯 (包括C, C++, C#, Java, JavaScript, Perl, Python等) 。这些特性使JSON成为理想的数据交换语言。 2.数据交换格式比较之关于轻量级和重量级: 轻量级和重量级是相对来说的,那么XML相对于JSON的重量级体现在哪呢?我想应该体现在解析上,XML目前设计了两种解析方式: DOM和SAX; DOM是把一个数据交换格式XML看成一个DOM对象,需要把XML文件整个读入内存,这一点上JSON和XML的原理是一样的,但是XML要考虑父节点和子节点,这一点上JSON的解析难度要小很多,因为JSON构建于两种结构: key/value,键值对的集合;值的有序集合,可理解为数组; SAX不需要整个读入文档就可以对解析出的内容进行处理,是一种逐步解析的方法。程序也可以随时终止解析。这样,一个大的文档就可以逐步的、一点一点的展现出来,所以SAX适合于大规模的解析。这一点,JSON目前是做不到得。 所以,JSON和XML的轻/重量级的区别在于: JSON只提供整体解析方案,而这种方法只在解析较少的数据时才能起到良好的效果;而XML提供了对大规模数据的逐步解析方案,这种方案很适合于对大量数据的处理。 3.数据交换格式比较之关于数据格式编码及解析的难度: 在编码上,虽然XML和JSON都有各自的编码工具,但是JSON的编码要比XML简单,即使不借助工具,也可以写出JSON代码,但要写出好的XML代码就有点困难;与XML一样,JSON也是基于文本的,且它们都使用Unicode编码,且其与数据交换格式XML一样具有可读性。 主观上来看,JSON更为清晰且冗余更少些。JSON网站提供了对JSON语法的严格描述,只是描述较简短。从总体来看,XML比较适合于标记文档,而JSON却更适于进行数据交换处理。 在解析上,在普通的web应用领域,开发者经常为XML的解析伤脑筋,无论是服务器端生成或处理XML,还是客户端用 JavaScript 解析XML,都常常导致复杂的代码,极低的开发效率。 实际上,对于大多数web应用来说,他们根本不需要复杂的XML来传输数据,XML宣称的扩展性在此就很少具有优势;许多Ajax应用甚至直接返回HTML片段来构建动态web页面。和返回XML并解析它相比,返回HTML片段大大降低了系统的复杂性,但同时缺少了一定的灵活性。同XML或HTML片段相比,数据交换格式JSON 提供了更好的简单性和灵活性。在web serivice应用中,至少就目前来说XML仍有不可动摇的地位

2012-06-28 · 1 min · 60 words · -