终于用上了unladen-swallow

Tags: Python

Shell:~ >: python
Python 2.6.1 (r261:900M, Nov 18 2009, 17:55:22)
[GCC 4.3.2] on linux2
[Unladen Swallow 2009Q4]
Type "help", "copyright", "credits" or "license" for more information.
>>>

 

由于OpenSolaris太慢了,换成Debian,终于可以用unladen-swallow.

No Comments 2009-11-19 09:18:59 by No.0023

bpython Screenshots

Tags: Python

No Comments 2009-11-11 22:34:04 by No.0023

Monaco ttf is cool

Tags: OpenBSD, others

Monaco ttf from apple.com

Mocaco tff

2 Comments 2009-10-30 17:47:14 by No.0023

iRedAdmin-0.1.1 (开源版)新版本发布

Tags: iRedAdmin

iRedAdmin-0.1.1 管理后台(开源版)发布了。下载地址:http://code.google.com/p/iredmail/downloads/list

iRedAdmin 是为 iRedMail 开源邮件方案开发的基于 web 的管理后台,大家可以在这里访问 demo: http://demo.iredmail.org/
我们也提供了全功能版的管理后台,将在 iRedMail 项目2周年生日的 2009-11-01 发布,只需要 99$ 即可。您可以从 demo 体验后再决定是否购买。demo 地址: http://demo.iredmail.org (选择 Full-featured edition)。

以下是 0.1.1 版本从 0.1 版本发布以来的更新记录:


  • 支持实时的语言切换,支持多国语言。
  • 新建用户时默认允许使用 POP3S, IMAPS,以及通过 TLS/SSL 使用 managesieve 协议修改自己的邮件过滤规则。
  • 增加了 Vi_VN (Vietnamese),fr_FR(法语),zh_CN(简体中文)翻译。
  • 修正:将 SQL 模板中的语法由 'TYPE=' 改为 'ENINGE='。感谢论坛的 @peterpp 网友。
  • 在编辑帐号时显示帐号的当前状态(启用、禁用)。
  • 新建邮件域是默认添加 ou=Externals。
  • 修正:正确显示 404 错误页面。
  • 修正:将新建帐号的邮件地址都转换成小写。
  • 修正:修正新建帐号时错误的 maildir 路径(域名和用户名之间少了一个 '/')。
  • 修正:允许显示多个电话号码。
  • 列出用户时显示用户的 ID(员工ID,可用于存储类似工号之类的信息)。
  • 允许修改员工 ID。
  • 修正:编辑帐号时允许保存空的显示名称(cn)。

No Comments 2009-10-30 11:07:55 by No.0023

python exec

Tags: Python

In Python 2, exec is actually implemented as a special language statement,
whereas Python 3 implements it as a standard library function.

在python2是语句,在python3已经是标准的库函数了。

1 Comment 2009-10-27 15:59:53 by No.0023

中文 Scala 用户组

Tags: Scala

https://groups.google.com/group/scala-cn

No Comments 2009-09-16 22:02:05 by No.0023

sbaz is cool

Tags: scala

Shell:~ >: sbaz installed
base/1.9
sbaz/1.25tmp
sbaz-setup/1.0
scala/2.7.5.final
scala-devel/2.7.5.final
scala-documentation/2.7.5.final
scala-library/2.7.5.final
scala-tool-support/2.7.5.final
8 packages installed
Shell:~ >: sbaz upgrade 
Refreshing list of available packages...
Planning to install scala/2.7.6.final...
Planning to install scala-devel/2.7.6.final...
Planning to install scala-documentation/2.7.6.final...
Planning to install scala-library/2.7.6.final...
Planning to install scala-tool-support/2.7.6.final...
Installing...
sbaz upgrade  3.76s user 0.97s system 3% cpu 2:31.58 total
Shell:~ >: scalac -version
Scala compiler version 2.7.6.final -- Copyright 2002-2009, LAMP/EPFL

No Comments 2009-09-11 15:16:03 by No.0023

doubanclaim482ec6c552a48d84

Tags: others

douban

No Comments 2009-09-08 21:24:58 by No.0023

Google accounts on Twitter

Tags: Google

twitter.com/Google - our central account
twitter.com/Blogger - for Blogger fans
twitter.com/GoogleCalendar - user tips & updates
twitter.com/GoogleImages - news, tips, tricks on our visual image search
twitter.com/GoogleNews - latest headlines via Google News
twitter.com/GoogleReader - from our feed reader team
twitter.com/iGoogle - news & notes from Google's personalized homepage
twitter.com/GoogleStudents - news of interest to students using Google
twitter.com/YouTube - for YouTube fans
twitter.com/YouTubeES - en Espanol
twitter.com/GoogleAtWork - solutions for IT and workplace productivity

Geo-related
twitter.com/SketchUp - Google SketchUp news
twitter.com/3DWH - SketchUp's 3D Warehouse
twitter.com/Modelyourtown - 3D modeling to build your favorite places
twitter.com/EarthOutreach - Earth & Maps tools for nonprofits & orgs
twitter.com/GoogleMaps - uses, tips, mashups
twitter.com/GoogleSkyMap -Android app for the night sky

Ads-related
twitter.com/AdSense - for online publishers
twitter.com/AdWordsHelper - looking out for AdWords questions and tech issues
twitter.com/AdWordsProSarah - Google Guide for AdWords Help Forum
twitter.com/GoogleAnalytics - insights for website effectiveness
twitter.com/GoogleAdBuilder - re building display ads
twitter.com/GoogleRetail - for retail advertisers
twitter.com/TechnologyUK - for U.K. tech advertisers
twitter.com/InsideAdWordsDE - for German AdWords customers
twitter.com/GoogleAgencyDE - for German ad agencies
twitter.com/AdSensePT - info for Portuguese-language publishers
twitter.com/AdWordsRussia - AdWords news & tips in Russian
twitter.com/DentroDeAdWords - Spanish updates from the Inside AdWords blog
twitter.com/AdWordsAPI - AdWords API tips

Developer & technical
twitter.com/GoogleResearch - from our research scientists
twitter.com/GoogleWMC - Google Webmaster Central
twitter.com/GoogleCode - latest updates for Google developer products
twitter.com/GoogleData - Data APIs provide a standard protocol for reading and writing web data
twitter.com/app_engine - web apps run on Google infrastructure
twitter.com/DataLiberation - our initiative for complete import/export of all data
twitter.com/GoogleMapsAPI - about using Google Maps embedded in websites
twitter.com/GoogleIO - Google's largest annual developer event

Culture, People
twitter.com/googletalks - notes from our @Google speaker series
twitter.com/googlejobs - the voice of Google recruiters

Country or Region
twitter.com/googlearabia - news from the Google Arabia Blog*

twitter.com/googledownunder - Google activities in Australia & New Zealand
twitter.com/GoogleDE - Google in Germany
twitter.com/GoogleKorea - News & notes in Korean* twitter.com/GoogleLatAm - Latin America (en Espanol)
twitter.com/GooglePolicyIt - Notes on Google policy issues in Italy

1 Comment 2009-07-13 08:59:49 by No.0023

my gpg key

Tags: gpg

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.9 (OpenBSD)

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
=MLiY
-----END PGP PUBLIC KEY BLOCK-----

No Comments 2009-07-11 08:59:16 by No.0023

Python sendmail

Tags: Python

http://code.google.com/p/mylibs/source/browse/lib/Python/MyPyLib/smtp_client.py :

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

# Copyright 2009 N23 <No.0023@gmail.com>
# All rights reserved.

# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

__all__ = ['get_smtp_client', 'sendmail']

import os, sys
from ConfigParser import ConfigParser
from ConfigParser import NoOptionError

from smtplib import SMTP
from smtplib import SMTPAuthenticationError
from email import Encoders
from email.base64MIME import encode as encode_base64
from email.MIMEBase import MIMEBase
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText

def get_smtp_client(stor):
    host = stor['host']
    port = stor['port']
    user = stor['user']
    passwd = stor['pass']
    debuglevel = stor['debuglevel']
    login = stor['login']
    starttls = stor['starttls']

    s = SMTP(host, port)
    if debuglevel:
        s.set_debuglevel(True)

    if starttls and login:
        s.ehlo()
        s.starttls()
        s.ehlo()
        s.login(user, passwd)
    elif login:
        try:
            s.login(user, passwd)
        except SMTPAuthenticationError:
            sys.stdout.write('\n------- try Auth Login again ------\n')
            s = SMTP(host, port)
            if debuglevel:
                s.set_debuglevel(True)

            s.ehlo()
            (code, resp) = s.docmd('AUTH LOGIN')
            if code != 334:
                raise SMTPAuthenticationError(code, resp)
            (code, resp) = s.docmd(encode_base64(user, eol=""))
            if code != 334:
                raise SMTPAuthenticationError(code, resp)
            (code, resp) = s.docmd(encode_base64(passwd, eol=""))
            if code != 235:
                raise SMTPAuthenticationError(code, resp)

    return s   

def sendmail(server, msg):
    address = [i for f in ('To', 'Cc', 'Bcc') if msg[f] for i in msg[f].split(',')]
    server.sendmail(msg['From'], address, msg.as_string())

def fn(options, args):
    cfg = ConfigParser()
    cfg.read(os.path.join(os.getenv('HOME'), '.LoginAccount.txt'))

    flag = 'mailClient'
    keys = ('host', 'port', 'user', 'pass', 'fr', 'to', 'debuglevel', 'login', 'starttls')
    stor = {}
    for k in keys: stor.setdefault(k, '')

    try:
        stor['host'] = cfg.get(flag, 'host')
        stor['port'] = cfg.getint(flag, 'port')
        stor['user'] = cfg.get(flag, 'user')
        stor['pass'] = cfg.get(flag, 'pass')
        stor['fr'] = cfg.get(flag, 'fr')
        stor['to'] = cfg.get(flag, 'to')
        stor['debuglevel'] = cfg.getboolean(flag, 'debuglevel')
        stor['login'] = cfg.getboolean(flag, 'login')
        stor['starttls'] = cfg.getboolean(flag, 'starttls')
    except NoOptionError: pass

    if options.addr:
        stor['to'] = options.addr
   
    s = get_smtp_client(stor)
    for arg in args:
        sys.stdout.write('sending... ' + arg)
        msg = MIMEMultipart()
        msg['From'] = stor['fr']
        msg['Subject'] = arg
        msg['To'] = stor['to']
        msg.set_boundary('===== Baby, I love you. no.0023@gmail.com =====')

        if options.atta:
            data = MIMEBase('application', 'octet-stream')
            data.set_payload(open(arg, 'rb').read())
            Encoders.encode_base64(data)
            data.add_header('Content-Disposition', 'attachment', filename = arg)
            msg.attach(data)
        else:
            b = '''<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head><body><pre>'''
            b += open(arg, 'rb').read()
            b += '''</pre></body></html>'''

            body = MIMEText(b, _subtype = 'html', _charset = 'utf-8')
            msg.attach(body)
        sendmail(s, msg)
        sys.stdout.write(' done.\n')
    s.close()

if __name__ == '__main__':

    from optparse import OptionParser
    usage = '%prog [-e addr] [-a] args...'
    parser = OptionParser(usage=usage)
    parser.add_option('-e', '--addr', dest='addr',
                      help='receive email address', metavar='ADDR')
    parser.add_option('-a', '--atta', dest='atta',
                      action='store_true', default=False,
                      help='attachment flag', metavar='atta')
    (options, args) = parser.parse_args()
    if not args:
        parser.print_usage()
        sys.exit(1)

    fn(options, args)

 

http://code.google.com/p/mylibs/source/browse/lib/Python/MyPyLib/LoginAccount.txt :

[mailClient]
host = smtp.qq.com
port = 25
user = *** # change to your login id
pass = *** # change to your login password
fr = no.0023@qq.com
to = no.0023@gmail.com
debuglevel = True
login = True
starttls = False

#[mailClient]
#host = smtp.gmail.com
#port = 587
#user = ***@gmail.com
#pass = ***
#fr = no.0023@gmail.com
#to = no.0023@qq.com
#debuglevel = True
#login = True
#starttls = True

No Comments 2009-07-10 10:31:15 by No.0023

Heads up! OpenBSD turns 4.6-current

Tags: OpenBSD

David Gwynne (dlg@) has tagged 4.6-current. That means that we are one step closer to the upcoming release. Keep an eye out for pre-orders!

From: David Gwynne 
To: source-changes@cvs.openbsd.org
Subject: CVS: cvs.openbsd.org: src
Date: Sun, 5 Jul 2009 17:42:51 -0600 (MDT)
Sender: owner-source-changes@openbsd.org

CVSROOT: /cvs
Module name: src
Changes by: dlg@cvs.openbsd.org 2009/07/05 17:42:51

Modified files:
sys/conf : newvers.sh

Log message:
take us to 4.6-current

No Comments 2009-07-07 21:03:10 by No.0023

7月编程语言排行榜:Java,正在老去的王者

Tags: Java

【51CTO独家特稿】Tiobe近日发布了最新一期的编程语言排行榜,在前十名的榜单中,除C#上升一位与上期排名第六的Python交换位置外,其他排名无明显变化。本期榜单,我们关注Java的持续下滑。


编程语言排行榜前20名榜单

王者之路
1990年代,随着计算机硬件技术的发展和成本的下降,电脑开始在企业中迅速普及,每个公司都开始自己的信息化之路以节约成本提升效率;随后,个人电脑开 始在家庭用户群体得到普及。“第三次浪潮”的预言波澜壮阔的展开并迅速蔓延;互联网的发展将这次信息化革命推向高潮。1995年,市场占有率高达 95%Netspace浏览器开始使用一种JavaApplet技术为人们提供炫目而安全的使用体验(当时发布的版本叫HotJava浏览 器,Netspace与Sun联合推出)。这吸引了大批编写CGI程序的开发者关注;渐渐的,Java的各种优点被人们挖掘,字节码、垃圾回收、更强的面 向对象,这种基于虚拟机的语言开始在程序员中迅速传播并被实践到各种类型的项目中。
经过几年的演化和改进,到2000年,Java已经成功超越当时的主流语言C和C++;2002年,Java一跃成为采用率最高的编程语言。“一次编写到 处运行”的口号使更多企业级项目的程序员得到解脱,庞大复杂的项目需求开始告别混乱的结构和错误的指针,就像80年代C++的出现一样,Java使程序员 的生产力又一次得到了大幅提升。
一般地,我们可以从开发工具的丰富和厂商的支持来评判一门语言是否流行。Java的开发工具形成了激烈的市场竞争,Borland推出了 JBuilder,微软匆忙启动了Visual J++,IBM开始投资Visual Age for Java(Eclipse前身),Sun则推出了自己的NetBeans IDE。
这时,Java无疑成为了编程语言的王者,他以自己干净的语法和强大的功能统治着企业级项目的开发;Sun公司开始被程序员以一家软件厂商看待并崇拜。
在变化中老去
没有“银弹”,没有哪种语言可以完美适应日新月异的IT界,至少Java的进化的速度在最近几年已经远远无法追赶日趋复杂项目需求和苛刻的交付日期。人们 开始尝试各种开源项目以缓解Java在某些方面的不足,以Hibernate和Spring为代表的框架快速发展和普及;另一方面,Sun和JCP的各种 标准不断遭到人们的质疑,JSF和JPA等官方框架被大多数开发者抛在一边。而这背后,是Sun和JCP对新需求的麻木和对社区的漠视,这直接导致 Java的更新落后于变化,Java正在新变化新需求中变得缓慢和老态。


Java近年走势

Java最近一次让你兴奋的功能 更新是什么?是1.4到Java5.0的版本更新还是新加入的泛型语法?这些都是5年前的事了。面对社区中的众多需求,JCP早已无法及时考量和应 对,Java的脚步在日趋蹒跚;更多的开发者在考虑项目是否应该使用Java或者其他什么语言,总之,要他们解决的问题Java解决起来很麻烦;不满的情 绪开始在社区中蔓延。
DSL和敏捷
远在日本的松本行弘就是这其实之一,寻找适合自己的编程语言的梦想促使他开发了Ruby,一种比Perl更强大,比Python更面向对象的语言;这时, 关于程序开发效率的讨论从各个软件公司的项目小组蔓延到社区,以TomDeMacro为首的一群人人开始倡导敏捷开发以提高效率;作为对敏捷宣言的实 践,DSL(特定领域语言)开始被人们重拾并重视起来。基于灵活的语法,Ruby无疑成为DSL和敏捷的不二选择。
不久,DHH(DAVID HEINEMEIERHANSSON)推出了基于Ruby编写框架。随着Web2.0引领的又一次互联网高潮,基于Ruby onRails的敏捷项目一个又一个的迅速建立并投入使用,人们惊奇的发现通过简单的DSL改造,Ruby几乎可以适应任何Web项目。这时,Java阵 营也开始躁动不安,Sun甚至雇佣了两名JRuby团队的核心成员开发自己的Ruby解释器以期拥有Ruby的动态和敏捷。JRuby是一个纯Java实 现的Ruby解释器。通过JRuby,你可以在JVM上直接运行Ruby程序,调用Java的API。
源于Java,超越Java
类似JRuby这种基于JVM的语言还有很多,比如Scala。Java泛型的创造者MartinOdersky对为Java创造泛型时遇到的约束性记忆 犹新,创建一个超越Java的新语言的念头由此产生,并最终促成了Scala编程语言。Scala是一种针对JVM将函数和面向对象技术组合在一起的编程 语言,高度的可伸缩性和对JavaAPI的无缝兼容使Scala成为Java程序员解决某些问题的另一种选择。
同样基于JVM的语言还有Groovy、Jython等,他们虽然拥有不同的名字,不同的语法和特性,但相同的一点时他们都是基于JVM的语言,并对 JavaAPI非常友好。在日趋老态臃肿的Java之外,他们,为解决不同的问题域和应用场景而生;在Java社区的庞大背影下,这些基于JVM的语言为 需求而生,为问题而生,敏捷且充满活力。

其他编程语言
以下是排名21到50的编程语言列表,请注意排名32位的Scala和排名47位的Groovy。
[tr]PositionProgramming LanguageRatings[/tr]

21 Objective-C 0.509%
22 ActionScript 0.425%
23 Fortran 0.400%
24 COBOL 0.399%
25 Logo 0.394%
26 Ada 0.394%
27 FoxPro/xBase 0.338%
28 PowerShell 0.327%
29 Scratch 0.274%
30 Transact-SQL 0.271%
31 Prolog 0.243%
32 Scala 0.228%
33 Erlang 0.203%
34 Haskell 0.198%
35 ML 0.196%
36 LabVIEW 0.191%
37 Focus 0.155%
38 Awk 0.153%
39 Smalltalk 0.150%
40 Forth 0.145%
41 Alice 0.142%
42 J 0.133%
43 Tcl/Tk 0.129%
44 JavaFX Script 0.129%
45 Caml/F# 0.118%
46 NXT-G 0.118%
47 Groovy 0.114%
48 APL 0.111%
49 Bourne shell 0.109%
50 CL (OS/400) 0.107%

下面是排名51-100的语言:
ABC, AD, Algol, Alpha, Applescript, Beta, Boo, C shell, cg, Clean,Cobra, cT, Curl, Dylan, Eiffel, Euphoria, Factor, Fan, Icon, IDL,Inform, Io, Lingo, MAD, Magic, Maple, Mathematica, MAX/MSP, MOO, MUMPS,Natural, Oberon, Occam, Oz, PL/I, Postscript, PowerBuilder, Progress,Q, R, Revolution, REXX, S-lang, SIGNAL, SPSS, SuperCollider, VBScript,Verilog, VHDL, XSLT
编程语言类别走势
[tr]CategoryRatings July 2009Delta July 2008[/tr]

Object-Oriented Languages 54.2% -1.7%
Procedural Languages 41.8% +0.7%
Functional Languages 2.8% +0.7%
Logical Languages 1.1% +0.2%


[tr]CategoryRatings July 2009Delta July 2008[/tr]

Statically Typed Languages 60.2% +1.8%
Dynamically Typed Languages 39.8% -1.8%


静态类型和动态类型的语言走势

 

来源:51CTO

No Comments 2009-07-07 21:01:12 by No.0023

sudo -s

Tags: OpenBSD

Shell:~ >: id
uid=1000(Py3k) gid=0(wheel) groups=0(wheel),  5(operator), 20(staff),  597(_kqemu)
Shell:~ >: sudo -s
obsd# id
uid=0(root) gid=0(wheel) groups=0(wheel), 2(kmem), 3(sys), 4(tty), 5(operator), 20(staff), 31(guest), 597(_kqemu)
obsd#

No Comments 2009-06-04 22:29:27 by No.0023

BSD Release: Jibbed 5.0

Tags: NetBSD

NetBSD developer Zafer Aydogan has announced the release of Jibbed 5.0, a live CD based on NetBSD 5.0. An announcement went out a few days ago, but now it has been updated to include information about new features: "Here we go again the with a new version of the NetBSD live CD. This time it's version 5.0, built from the finest NetBSD-5 sources. As usual, the live CD contains the latest packages from pkgsrc and three new packages: AbiWord and two fantastic games - Wormux and Crack Attack!. As always it contains X.Org from base and the Xfce window manager. Jibbed is a bootable live CD based on the NetBSD operating system that works directly from a CD without touching a hard drive. It provides automatic hardware detection and supports many graphics cards, sound cards and USB devices. It also features features a rescue environment for NetBSD." Visit the project's home page to read the brief release announcement. Download (MD5): jibbed-5.0-i386-LiveCD.iso (489MB), jibbed-5.0-amd64-LiveCD.iso (530MB).

 

Jibbed是非安装型的自启动运行光盘,它基于NetBSD。它创建自HEAD分支最新的NetBSD源码,光盘上提供的第三方软件都是最新版本,这包括来自wip-pkgsrc的测试软件包。

No Comments 2009-05-14 11:04:03 by No.0023

BSD Release: BSDanywhere 4.5

Tags: OpenBSD

Stephan Rickauer has announced the release of BSDanywhere 4.5, a live CD consisting of a base OpenBSD system plus a graphical desktop (Enlightenment 17): "We are pleased to announce the immediate availability of BSDanywhere 4.5 - Enlightenment at your fingertips. Here's a quick summary of the changes since 4.4: Upgrade base system to OpenBSD 4.5 and packages accordingly, please see the OpenBSD site for a list of changes since 4.4; contains official, standard, unmodified OpenBSD kernel - previously, we had to ship a slightly modified version of the OpenBSD kernel to make the boot off CD media less cumbersome, but thanks to OpenBSD developer Kenneth Westerback, this has been improved in OpenBSD 4.5; last but not least, we have great new artwork, provided graciously by Tim Saueressig." Here is the complete release announcement. Download (SHA256): bsdanywhere45-i386.iso (628MB), bsdanywhere45-amd64.iso (699MB).

 

BSDanywhere是基于OpenBSD的自启动运行光盘镜像。它包含了整个OpenBSD基础系统(不含编译器),并带有一份图形桌面、一套非典型 的软件收藏、自动硬件检测,以及对很多显示卡、声卡、SCSI、USB设备及其他外设的支持。BSDanywhere可以作为一份教学UNIX系统,一套 修复环境,或者是硬件测试平台来使用。

No Comments 2009-05-06 22:35:39 by No.0023

My DAL Util CLass

Tags: Java

import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.RowSet;
import javax.sql.rowset.CachedRowSet;

import com.sun.rowset.CachedRowSetImpl;

public class DALUtils {
    /*
     * Data Access Layer Util Class.
     */
    public static RowSet query(Connection conn, String sql) {       
        try {
            ResultSet rset = null;
            Statement stmt = conn.createStatement();
            rset = stmt.executeQuery(sql);
            CachedRowSet crs = new CachedRowSetImpl();
            crs.populate(rset);
            stmt.close();
            return crs;
        } catch (SQLException ex) {ex.printStackTrace();}
        return null;
    }
   
    public static int exec(Connection conn, String sql) {       
        try {
            int rt = 0;
            Statement stmt = conn.createStatement();
            rt = stmt.executeUpdate(sql);
            stmt.close();
            return rt;
        } catch (SQLException ex) {ex.printStackTrace();}
        return 0;
    }

    public static List<Object> resultSetToList(ResultSet rs, String className) {
        List<Object> list = new ArrayList<Object>();
        try {
            ResultSetMetaData meta = rs.getMetaData(); 
            Object obj = null; 
            while (rs.next()) { 
                obj = Class.forName(className).newInstance(); 
                for(int i = 1; i <= meta.getColumnCount(); i++)  { 
                    String colName = meta.getColumnName(i);
                    String methodName = "set" + new String(colName.charAt(0)+"").toUpperCase() + colName.substring(1);
                    Object value = rs.getObject(i); 
                    Method method = obj.getClass().getMethod(methodName, value.getClass()); 
                    method.invoke(obj, value); 
                } 
                list.add(obj); 
            } 
        } catch(Exception ex) {ex.printStackTrace();}
        return list;
    }
   
    public static List<Map<String, Object>> resultSetToList(ResultSet rset) {
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
       
        try {
            ResultSetMetaData meta = rset.getMetaData(); 
            while (rset.next()) { 
                Map<String, Object> m = new HashMap<String, Object>(); 
                for(int i = 1; i <= meta.getColumnCount(); i++)                   
                    m.put(meta.getColumnName(i), rset.getObject(i));
                list.add(m); 
            } 
        } catch(SQLException ex) {ex.printStackTrace();}
        return list;
    }
   
    public static List<String> getColumnLabelList(ResultSet rset) {
        List<String> list = new ArrayList<String>();
        try {
            ResultSetMetaData meta = rset.getMetaData(); 
            for (int i = 1; i <= meta.getColumnCount(); i++)
                list.add(meta.getColumnLabel(i));
        } catch(SQLException ex) {ex.printStackTrace();}
        return list;
    }
   
    public static int getTableMaxCount(Connection conn, String tableName) {
       
        int cnt = 0;
        String sql = "select count(*) from " + tableName;
        try {
            Statement stmt = null;
            stmt = conn.createStatement();
            ResultSet rset = stmt.executeQuery(sql);
            while(rset.next()) {
                cnt = rset.getInt(1);
            }
            stmt.close();
        } catch (SQLException ex) {ex.printStackTrace(); }
        return cnt;
    }
   
    public static Map<String, Integer> getPagerData(Connection conn, String tableName, int pageSize, int pageCnt) {
        int maxCnt = getTableMaxCount(conn, tableName);
        int totalPageCnt = (maxCnt + pageSize -1) / pageSize;
//        int pageCnt = 1;
//        if (page != null && page.length() > 0) pageCnt = Integer.valueOf(page);
        if (pageCnt > totalPageCnt) pageCnt = totalPageCnt;
        if (pageCnt <= 0) pageCnt = 1;
        int offset = (pageCnt -1) * pageSize;
       
        Map<String, Integer> m = new HashMap<String, Integer>();
        m.put("maxCnt", maxCnt);
        m.put("pageCnt", pageCnt);
        m.put("totalPageCnt", totalPageCnt);
        m.put("offset", offset);
        m.put("pageSize", pageSize);
        return m;
    }
   
    public static String getTableData(Connection conn, String sql) {
        /*
         *  return table head and body
         */
        StringBuffer sb = new StringBuffer();
        if (sql.toUpperCase().contains("SELECT"))
            sql = "select * from (" + sql + ") a limit 0, 1000";
       
        RowSet rs = query(conn, sql);
        sb.append("<thead>");
        sb.append("<tr>");
        List<String> LabelList = getColumnLabelList(rs);
        for (String s: LabelList) {
            sb.append("<th>");
            sb.append(s);
            sb.append("</th>");
        }
        sb.append("</tr>");
        sb.append("</thead>");
       
        List<Map<String, Object>> dataList = resultSetToList(rs);
        sb.append("<tbody>");       
        for(Map<String, Object> m: dataList) {
            sb.append("<tr>");
            for (String s: LabelList) {
                sb.append("<td>");
                sb.append(m.get(s).toString());
                sb.append("&nbsp;</td>");
            }
            sb.append("</tr>");
        }
        sb.append("<tbody>");
       
        return sb.toString();
    }
   
    public static String getTableData(Connection conn, String tableName, Map<String, Integer> pagerData) {
        int offset = pagerData.get("offset");
        int pageSize = pagerData.get("pageSize");   
        String sql = "select * from " + tableName + " limit " + offset + ", " + pageSize;
       
        return getTableData(conn, sql);
    }
   
    public static void main(String args[]) {
        Connection conn = null;
        RowSet rs = query(conn, "select * from plantMapping");
        resultSetToList(rs, "");
    }
   
}

No Comments 2009-03-20 22:45:01 by No.0023

必备的 Java 参考资源列表

Tags: Java

from http://www.ibm.com/developerworks/cn/java/j-javaresources.html?S_TACT=105AGX52&S_CMP=NL&ca=dnl-cn-03052009&open&cm_mmc=4962-_-n-_-vrm_newsletter-_-10104_107179&cmibm_em=dm:0:14308375

自 Java 平台从 1995 年作为一个整体引入编程社区开始,它的发展已经远远超出了早期 Java 专家和推介者所设想的“applet 无处不在”这一远景。相反,Java 世界出现了 Swing、与 servlet 结合,从而发展为 J2EE、出现了 EJB、超越了 Spring 和 Hibernate、添加了泛型,变得越来越具有动态性,然后实现了函数化,在我撰写本文时,Java 继续朝着各种有趣的方向发展。

这使得没有一直跟随学习这门语言的 Java 程序员感到有点吃力。

作为一名演讲人、博客作者、顾问和导师,经常有一些初、中级 Java 程序员向我询问相关参考资源,以便帮助他们掌握这个广泛的、复杂的、看似永无止境的语言。几年前,我发表了一个 推荐读物列表 专门解答这个问题,但最近,developerWorks 的 Java 编辑让我整理一份更完整的参考资源列表,而不仅仅包括书籍 &mdash; 考虑到资源列表现在已经增长到了预期消费者即使花费十年的时间阅读也仍然不得要领的地步,这是一个很好的提议。

为了保证客观性和避免不利的影响,我决定给出各种参考资源的博客空间(blogosphere):Web 站点、研讨会、书籍、博客、工具,以及任何 Java 开发人员可能感兴趣或对他们有用的内容,帮助他们从庞大的参考资源中找到自己需要的内容。

这份列表得到了很多人的响应(在此我要感谢所有的回复者)。

在开始之前,需要解释一点:这些参考资源不一定是 Java 世界中最流行、最强大或最有影响的资源 &mdash; 这份 列表可能完全不同(尽管我怀疑其中也会出现很多相同的资源);但每个希望获得成功的 Java 开发人员都应该将这些参考资源保存在浏览器、书架或备忘录中。与任何此类型的列表一样,人们总会争论哪些内容本来应当包含进去但却没有出现在列表中,或本 不该有的内容却出现在列表中。

现在开始正式介绍这些参考资源。

Web 站点和开发人员 Web 门户

网络无疑改变了共享资源和出版的本质(对我也是一样:您正在网络上阅读这篇文章),因此,从每位 Java 开发人员都应该关注的关键 Web 站点和开发人员门户上的关键 Java 参考资源入手似乎比较合理。

在 许多情况下,Web 站点和/或开发人员门户的价值不仅仅在于其中提供的参考资源或文章,还包括围绕该门户或站点的社区。静态 Web 页面和下载文件的时代已经一去不复返了,取而代之的是更“积极” 的论坛、主题文章和交互式讨论,讨论者不仅包括频繁访问该站点并组成社区的开发人员,还包括社区成员和门户所有者。随着技术的发展,开发人员也必须跟上技 术的步伐,同时,门户也要不断发展,以满足社区不断变化的需求;与社区保持开放的关系是实现活跃门户的关键因素。

Web 站点列表(带有 URL):

  • java.sun.com
    这是 JDK 的发源地,通常是 Java 开发人员下载 JDK 和文档副本的首要站点。除此之外,该站点还是查找有关整个 Java 平台的信息的好来源,包括一段非常详细的 JVM 介绍(Hotspot),它极其深入地描述了 JVM 的细节。

  • java.net
    Java.NET 站点汇集了开源项目、文档、博客、wiki、新闻和其他社区资源等各种内容。它是 Java 技术的主要信息来源,不过提供的信息似乎过于繁杂。不过尽管如此,浏览项目列表也会找到一些真正有用的东西,如 FEST-Swing 项目,它旨在创建一个用于构建 Swing 应用程序的“方便接口”,大大简化了单元测试的创建。

  • InfoQ
    由 Floyd Marinescu 创建,他是 The ServerSide 的名誉主编,InfoQ 与这里列出的许多其他参考资源的区别是,它是技术中立的,不仅包括 Java 代码,还包括 .NET 和 Ruby,并提供了大量灵活的方法和见解。尽管 InfoQ 上的评论社区并没有 TheServerSide 上的社区那么庞大和多样化,但是该社区中的讨论通常更加温和,而不会过于激烈。

  • TheServerSide
    通常称为“the Slashdot of Java”,TheServerSide 是第一个公开质询、热烈讨论和积极研究企业 Java 主题的地方。有关轻量级容器(以 Spring 为代表)的一些最初理念就是从这里诞生的,这里产生了许多 Java 社区中的“思想领导者”。尽管最近的激烈争论有时会带有主观色彩,但 TSS 将始终是许多 Java 内容的发源地,这些内容构成了我们现在所拥有的 Java 系统;同样,从 TSS 总是可以了解各种 Java 技术的历史。

  • DZone
    DZone 最初是一个面向 Java 开发人员的资源站点,但最近它扩展到了其他技术领域。包括 .NET 和 Ruby,以及其他几个主题“专区”。这样,不仅 Java 开发人员可以利用它来专门研究 Java 专区,还会有一些跨平台的内容,聪明的开发人员可以充分利用这一点。

  • developerWorks Java 技术专区
    如果您正在阅读本文,那么您已经找到了 dw。为了解释清楚,我必须强调除本文外,我曾在该站点发表过其他一些文章,但我可以诚实地说,dw 是一个有关 Java 编码和 JVM 的文章和资源的优秀来源。特别注意,请务必查看 Java 理论与实践,这是一个由 Brian Goetz 撰写的长期系列,其中包含一个共分三部分的 JVM 垃圾收集器系列文章,它以一种浅显易懂的方式介绍了 GC 的核心概念。

  • IBM alphaWorks
    alphaWorks 是 developerWorks 的姊妹站点,IBM 研究人员和员工在此提供他们认为会确定未来主流的工具和技术。alphaWorks 提供了十二种不同的类别,从而为 Java 开发人员提供了机会来尝试各种非常超前的工具、语言、库和其他项目 &mdash; 它们正处于研究阶段。注意,许多项目是为了证明一个特殊的研究点,然后就会停止,使项目保持在当前的效率状态。警告:有 些项目不是开源的,而有些项目不包含源代码。但相当数量的 alphaWorks 项目最终会成为主流,要么成为受 IBM 支持的产品,要么作为可从一些 IBM 开放源码位置下载的可用工具。无论如何,只要关注 alphaWorks,就可以了解 Java 发展的方向以及方式。

  • OnJava
    OnJava 是一个独立运行的站点,用于跟踪活动、记录会议、提供各种有关企业 Java 的观点。事实上,这里提供的大部分信息也可以在别处找到,不过这一点对于几乎所有开发人员门户(包括上面提到的)都是一样的,想了解 Java 的各种开发的开发人员只需打开该站点上的 文章列表,然后逐一阅读。

  • Artima
    Artima 由 Bill Venners 创建,目前已经发展成一个巨大的汇集了文章、博客和访谈的站点,它不是完全侧重于 Java 开发,并且其中还包括了 Java 著作方面的权威(查看 Bill Joy 自 Java 5 出版后,对 Java 语言复杂性的怀疑,以及他用于证明所担心问题的经典示例 &mdash; Enum<>)。该站点非常值得您访问。

注意,对于上面大部分站点,为充分利用站点/门户,需要进行某种形式的注册。在撰写本文时,所有文章基本上都是免费的,只需要一个用户名/密码登录,以便 它们能惟一识别访问者,还需要提供电子邮件地址,以便定期发送主题新闻资讯或电子邮件(据我所知,所有站点将允许您不提供电子邮箱,但我还未这样做过,因 为我发现新闻咨询会不时告诉我一些有趣的、我还不知道的信息,收件箱中的这些邮件是很有用的)。

博客(Weblog)

Blog 使开发人员可以轻松地表达想法、概念、理念、论点并围绕技术展开思想讨论,并了解特定技术领域中非常有影响力的“思想领袖”。此外,博客可以通过提要阅读 器在本地使用,提要阅读器将文章/条目下载到本地,以便在脱机时也可以使用。事实上,博客已经变得非常普遍,以至于出现了专门的设备(如 Amazon Kindle)来轻松获取开发人员所需要的信息。

关键在于从几百万个博客中找到感兴趣的内容。每位开发人员都有他自己的选择,哪些需要阅读,哪些不需要,但有些博客是最基本的,包括:

注意(大多数)博客内容都属于个人观点;在这里分享的一些观点可能在以后被证明是错误的 &mdash; 永远不要只根据博客条目中的信息来对产品下结论。但如果要使思维过程突破常规,博客将是一种增强技能的强大资源。

包和/或库

跟踪 Java 生态系统中的所有库和包是一项繁杂的工作,并且 Java 开发人员很容易就会忽略这项工作。结果,开发人员常常发现自己正在编写的内容其实已经存在于平台内(只要他们浏览一下就会发现这一点)。

下面列出了“每位 Java 开发人员至少应该知道其存在(最好知道如何使用)的十大 Java 包”:

  • java.lang.reflect
    许多 Java 库和工具都依赖于 Reflection 包,所以了解它成为了一项必要要求(如果在使用时不理解它,会因为安全策略或其他类型的基础设施不匹配问题而导致失败)。与 Reflection 结合使用的还有 Java 5 注释和 java.lang.annotation

  • javax.script
    Java 系统一直在强调动态语言,了解如何从 Java 代码内部使用脚本语言可以使开发人员扩展他们的系统,而不用经历昂贵的编译-链接-运行-测试环节。

  • javax.management java.lang.management
    该管理包也称为 Java 管理扩展(Java Management Extensions,JMX),是一种监视 Java 应用程序运行的强大工具;因此,开发人员应该熟悉和习惯使用 JMX,以便构建实际上可以被系统管理员使用的软件。不要忘记查看随 JDK 一起发布的 jconsole 工具,它演示了一种应用程序健康状况指示板,同时演示了可以构建的内容,它本身就是一个很有用的工具(密切关注构建 jconsole 插件来在 jconsole 内启用脚本支持的脚本 demo,它是任何合格的系统管理员都应该掌握的一个强大工具)。

  • java.util.concurrent.*
    并发性是开发人员在未来十年内将要面临的最大问题,Java 开发人员用来修复并发性 bug 的主要武器就是此包及其子包中的类( .atomic .locks )。学习使用它将与学习编写类一样(甚至更)重要。了解它,使用它,并喜欢上它。

  • java.util
    java.util 中的类同样重要。它们被频繁引用,特别是 Collections 类,所以 java.util.* 应该像 java.lang 那样自动导入。

  • java.beans
    JavaBeans 无疑是整个 Java 生态系统中都要使用的核心元素之一,使用商业含义不是很明显的名称“POJO”(普通的旧 Java 对象)。POJO 仍然基于 JavaBeans 代码、API 和规范,因此花一点时间了解 java.beans 中的类可以帮助编写更好的 POJO。

  • java.util.logging
    诊断和审计日志迅速成为跟踪运行程序执行的强大工具,不管是出于调试目的,还是出于管理和监视目的。我的忠告是:学习使用这个包和其开源的姊妹包 log4j

  • java.security.*
    Java 安全 API、策略机制和权限类是使 Java 环境成为安全计算平台的核心部分,但只有开发人员知道如何利用这个包。避开加密 API &mdash; 在详细了解每个对您有用的选项后再使用它们。它们不难使用,但要获取加密权限(意味着没有大的缺陷)需要花费几年的时间,有大量来自其他加密专家的相关评 论。首先使用其他机制,如 SSL/TLS 和 GuardedObject/SignedObject/SecureObject 类。

  • javax.xml.parsers.* javax.xml.bind javax.xml.transform.*
    XML 逐渐出现在 Java 开发人员的视野中,能够解析(直接解析或通过对象-XML 库)和转换它(使用 XSLT)是开发人员必须拥有的一项重要技能。

  • javax.sound.*
    这不是一项必需的技能,但知道如何偶尔弹出声音效果可以使原本乏味的代码充满生气。此外,在没有直接可用的显示时,还可以用声音来向系统提供信号和反馈。 除此之外,让抛出栈跟踪的机器发出恐怖电影里的尖叫,这样用户可以知道刚刚发生了不好的事情,从而增加了一些刺激的乐趣。

当然,还有许多其他(位于 JDK 内部和外部)的包值得学习,但掌握以上这些就足以使您很好地处理大多数项目,更不用说应付大多数工作面试。

研讨会

研 讨会继续在 Java 开发人员的培训中扮演着主要角色,特别是那些还没有获得足够的认可,尚未成为大型培训公司培训课程的主题。研讨会也是开发人员结识其他具备各种技能和职责 的开发人员的绝好机会,使与会者有机会做一些非常过瘾的(并且是完全必要的)事情:发泄对工作环境的不满。

参加研讨会也会产生一种有用的副作用(如果积极管理,可以为研讨会锦上添花):与会者可以建立开发人员小组。通 过可在世界范围内使用的电子邮件、邮件列表(如 GoogleGroups 或 Yahoo Groups)和许多其他轻量级 groupware 通信工具,了解参加研讨会的人员的信息比以前更加容易。这些通过午餐和晚宴建立起来的友谊可以持续一生,并且随着时间流逝愈加有益,特别是在评估新技术时 更是如此。

让一位有着 30 年经验的与会者、演讲者、组织者(不是我,是我的一位朋友)的话为您提供指引:“技术新手参加研讨会是为了通过期间举办的各种会议获取知识,资深人士参加研讨会是为了宴会和结识朋友。宴会帮助您结识朋友,他们可以帮助您提升自己的职业”。

研讨会包括:

  • No Fluff, Just Stuff
    这是一个我特别热衷的研讨会,不仅仅因为我是那里的定期演讲者,而且还因为十大 JavaOne 2007 演讲者中有 7 个人都是 NoFluffJustStuff(目前的或以前的)演讲者。Java 开发人员不会发现比这里更加关注技术主题的讨论,而且也不会找到比它价格更合理、召开位置更便利的会议:您的家乡(北美大陆每年有 30 多场会议 &mdash; 范围跨越欧洲和亚洲,这样,您便有机会驱车去参加 NFJS 大会,而不用花几千美元飞到一个遥远的城市并且住在旅馆中)。同样,本文中推荐的许多书籍都是由出席 NoFluff 研讨会的专家编写的,这一点也就不足为奇了,而且 NFJS 的组织者们一直在不遗余力地查找有关各种 Java 和 Agile Development 主题的“重要资源”。

  • JavaOne
    这是一个规模宏大且非常客观的会议,并且一直在旧金山(在这个地方举行有利也有弊,具体取决于您公司的出差预算情况)举行,不过世界上还没有哪一个会议能像 JavaOne 这样把这么多关键 Java 推动者聚集到一个地方。

  • JAOO
    为了不冷落我们的欧洲 Java 同胞,每年在丹麦奥尔胡斯举行一次 JAOO 会议,该研讨会已经举办了将近二十年,并且没有任何衰落的迹象。JAOO 不仅吸引了一些顶尖的演讲者和作家,而且作为一个跨技术的研讨会,在技术方面具有很好的包容性,也就是说,与会者早上可以出席 Java 研讨会,午餐时与一些 C++ 开发人员交谈,下午了解 Microsoft 的 &reg; Silverlight 的最新发展成果(或任何别的新事物),晚上则与 Smalltalker 喝喝啤酒。如果您想增长见识,JAOO 或它的姊妹会议 QCon(在 InfoQ 工作人员的协力支持下召开)将是一个不错的起点。对那些居住在“澳大利亚或新西兰” 的 Java 同胞,今年(2008)在布里斯班和悉尼首次召开了 JAOO;所有迹象表明,在未来几年来内,将会在这里再次举行 JAOO。

  • Devoxx
    该研讨会是以前的 JavaPolis,在比利时安特卫普这一飞速发展的城市举行,参加这一研讨会是遇见欧洲同行的绝好途径(而且还可以品尝到上等的比利时啤酒)。演讲者都 是该领域的首席专家,他们将集中讨论一些尖端技术。该研讨会也提供了优秀的平台和许多机会让您与开发人员同行进行交流。

  • Jazoon
    Jazoon 是一个相对较新的研讨会,2007 年在苏黎世(瑞士)召开。因为参与者名单上有 Martin Odersky(Scala 的创建者)、Neal Gafter 和 Simon Phipps(Sun 的首席开放源码执行官)之类的名字,所以 Jazoon 有望吸引大量演讲者。Jazoon 完全侧重于 Java 主题并在欧洲的中心召开,它有望成为欧洲 Java 同胞们的一项重要日程。

还有其他一些研讨会,目标受众也各不相同,但以上列举的研讨会是直接针对 Java 开发人员的。那些希望扩大自己视野的开发人员应该考虑参加“其他” 技术研讨会,如在世界各地举办的各种 Perl、Python、Ruby 甚至 .NET 会议;接受新的观念有时需要研究一组全新的问题。

书籍

对开发人员而言,没有哪一种资源能比价格便宜的传统书籍更容易获取。只需要去当地的书店(如果您住在边远地区,可通过 Web 浏览器查找 Amazon 来购买书籍),就可以找到大量珍贵的技术知识和经验……只要您肯在大量资源中仔细寻找。

这些书籍假设读者已经有了 Java 语言和工具集的应用知识;Java 入门书籍非常普遍,而且大多数讨论的是相同的基本内容。选择书籍需要一定的技巧,要考虑作者的写作风格,有时甚至要考虑随书光盘中是否包含了练习的参考答案(如果包含了练习的话)。

掌握了基本知识后,考虑阅读以下书籍:

  • Effective Java(第 2 版),Joshua Bloch
    每位 Java 开发人员的书架上必备的第一本书,必须定期翻阅、随时查看。

  • Java Concurrency in Practice ,Brian Goetz
    每位 Java 开发人员书架上必备的第二本书,因为每位 Java 人员(不管他们愿意与否)都会操纵多线程环境的内部。

  • Better, Faster, Lighter Java ,Justin Gehtland 和 Bruce Tate
    这一小巧的册子被许多 Java 开发人员当作攻下以 Spring 为首的“轻量级容器” 环境的“利器”,填补了大多数大型 EJB 服务器(如 WebSphere 或其他事务处理中间件)留下的空白。作者还介绍了基于 POJO 的开发周期,指出了该理念的优点和缺点,以及如何采取更轻量级的方法构建企业应用程序,使用了 Spring 和 Hibernate 这类不会降低生成系统的功能和能力的工具。

  • Effective Enterprise Java ,Ted Neward(我)
    提供 75 种方法来确保企业 Java 应用程序(不管它们是用 Spring、EJB、Web 服务,还是其他技术实现)不会出现问题。就像 Effective Java 不是针对初级 Java 程序员一样,Effective Enterprise Java 同样也不是针对刚开始学习“企业 Java” 基础知识的开发人员。

  • Release It! ,Michael Nygard
    任何打算编写针对生产服务器的软件的人都应该阅读本书 &mdash; 它深入探讨了生产环境中可能出现的错误,以及如何处理潜在的故障,要么恢复故障,要么完全避免故障。

  • Inside the Java 2 Virtual Machine ,Bill Venners 或 Component Development for the Java Platform ,Stuart Halloway
    Java 开发人员一旦学习 Java 这门语言后,迟早要了解底层平台 &mdash; Java 虚拟机本身,这意味着垃圾收集以及 Reference 对象、ClassLoader、线程和监视器等主题将成为接下来探讨的重点领域。两本书中的任何一本(或两本)都是非常有用的指南。但是这两本书都有一个 很大的缺陷:它们的出版时间比较早。Inside 是 Java 1.2 期间出版的,此后不久便出版了 Component-Based。幸运的是,大多数 Java 虚拟机自那时起一直没有发生什么变化,所以如果读者遇到除 JDK 1.2 以外的问题时,可以暂时放下本书并继续研究下一主题。

  • Martin Fowler 撰写的 Patterns of Enterprise Application Architecture 、Gregor Hohpe 和 Bobby Woolf 撰写的 Enterprise Integration Patterns
    说到设计方法和理念,这两本书都是典范,同样假定大部分读者都阅读过由 Gamma、Helm、Johnson 和 VlissidesBoth 合著的经典书籍 Design Patterns。模式书籍通常为开发人员提供了一些基本的概念构建块进行调整和组合,从而创建更健壮的设计,这些构建块在单独使用时就不怎么有效。

  • Java Power Tools ,John Smart
    很多人推荐这本书,它详细介绍了 Java 生态系统中各种可用的工具。Smart 还提供了关于本书的培训课程(Java Power Tools Bootcamp),但大多数开发人员获取信息的最简单方式还是通过 dead-tree 版本。

  • The Pragmatic Programmer ,Andy Hunt 和 Dave Thomas
    每个程序员应该人手一册,不管他实际使用的语言或平台是什么。本书适合有经验的读者和从事多年编程工作的程序员。本书可与 Fred Brooks 的经典著作 The Mythical Man-Month 媲美。

  • The Productive Programmer ,Neal Ford
    这本最近出版的书籍与 Pragmatic Programmer 一样经典,它主要讨论各种技巧和技能,程序员可以借助这些技巧和技能提高他们的效率,获得比 IDE 更高的生产力。

  • The Pragmatic Starter Kit
    本套件由 Pragmatic Unit Testing (with JUnit)Pragmatic Project AutomationPragmatic Source Control (with Subversion) 组成。每本书都清晰、针对性地讨论了各个主题的核心内容,它们直接深入主题,没有涉及其他无关内容。例如,Project Automation 是阅读 Ant in Action 的“开胃书”,但同时也讨论了什么是优秀的构建流程以及构建它们的原因。

  • Ant in Action(第 2 版),Erik Hatcher 和 Steve Loughran
    Ant 是面向 Java 平台的优秀构建实用程序(参阅后面的工具内容了解更多详细信息),本书是目前为止介绍强大 Ant 功能的最佳读物。在学习如何使用 Ant 时,Ant in Action 还演示了单元测试、持续集成和生产部署实践,这一切都是从实际 Java 开发人员的日常实践的角度出发的。

工具

正如盖房子不仅仅是“抡起锤子在板上钉钉子” 一样,Java 开发也不仅仅是“掌握 IDE 并开始编写代码”。好的 IDE 当然能为编写 Java 代码出力不少,但其他的工具也可以提供与 IDE 相等的(也许更好的)价值。

排名不分先后……

  • IDE
    当然,工具讨论首先从 IDE 开始。在避开商业限制方面,Eclipse 和 NetBeans 都是开源且免费的,因而提供了吸引人的“第一步”。

  • 单元测试
    掀起单元测试革命的工具是 JUnit,但其他几个工具也得到普及,包括 TestNG,自然还有 JUnitPerf 等等。

  • 持续集成
    持续集成服务器不断检查不受源控制的代码,执行构建,对它运行单元测试,并通常通过电子邮件向开发人员报告所有构建故障。有几个开源版本可用,但有一个已经得到了广泛关注,即 Hudson,它是一个拥有大量插件和具有高可扩展性的持续集成服务器,它源自 CruiseControl ,它正是因为这一点而声名斐赫。

  • 静态分析
    FindBugs 是一个运行 Java 代码的开放源码静态分析工具,执行 n 向深度分析来找出所有可能的代码路径,并基于一组可扩展规则报告找到的各种错误和警告。FindBugs 由 William Pugh 开发(这位 William Pugh 还发现了 Java 内存模型中的 bug),其最值得炫耀的地方是它能够分析 Java 代码来查找并发 bug,每位程序员都会为之欢呼。

  • 网络包跟踪
    WireShark (以前一般称为 Ethereal)使程序员可以查看网络上传播的内容,让他们有机会检查正在网络上传播的内容是否合适,而那些 合适的内容(比如敏感信息和明文密码)没有出现在网路上。

  • 虚拟化
    类似 VMWare、Xen、VirtualBox 或 VirtualPC 之类的虚拟化工具(或者更准确地称之为平台)使程序员能够创建与生产机器将运行的环境相同的环境,而不失去主机 PC 环境的生产力。它还提供了一种便利方法来在本地尝试“处于试验阶段的” 软件,而不必让处于生产状态的机器冒险。如果不是完全的开源项目,大多数虚拟化工具都提供有某种免费选项。

您不必感到惊讶,这些工具中的其中一些是商业工具;如果一个工具一个星期平均能帮您节约一个小时的时间,您需要多长时间就可以收回购买该工具的资金呢?如 果管理人员不认同这个观点的话,那么仔细计算使用某一工具节省的时间(假设是开发人员的时间,或者是产品诊断或执行时间)后,管理员终会发现,他们在这些 工具上的吝啬是一件得不偿失的愚蠢事。

向贡献者致谢
感谢所有访问我的博客(blogs.tedneward.com)的读者,他们从百忙中抽出时间来向我推荐应该包含在此列表中的参考资源;他们(当然不是 所有人)包括 Greg Ostrovich、Ryan Slobojan、Hamlet D'Arcy(他认为自己是个外星人,正在为 IT 打工来赚钱修复他的宇宙飞船,从而返回自己的星球)、Pierre Marc-Larocque、Prashant Rane、Marc Stock、Eric Kerwin、Morten Anderson、Alex,以及 Yvonne Miller、Rahul Raj、Brian Sletten 和 Neal Ford。

未来趋势展望

当 然,Java 开发人员花所有时间来学习当前的技术并不是一件好事,学习完后,新的技术又接踵而至,使学过的所有内容一下子都变得过时了。随时关注“未来发展趋势” 同样重要,惟有这样,当公司 CTO 突然在电梯里问您“我最近听到的函数式语言是怎么一回事,我们需要对此进行研究吗?” 时,您才会给出连贯合理的答复。

排名不分先后,一些围绕 Java 平台的“未来趋势” 包括:

  • 动态语言
    Groovy 和 JRuby 之类的语言衍生出了其他一些值得研究的项目,如 Clojure 和 Fan,试验表明,低强度类型的环境能提供更好的生产力和更多的选项。这并非鼓励您放弃 Java 语言,不过,最好的效果总是来自强强联合。

  • 函数式语言
    其兴起源于 Scala,由于函数语言一般支持复合函数并缺少共享状态,因此提供了隐式并发性的优点(尽管有时它的语法很难让人接受)。Jaskell 是一个 Haskell-on-JVM 实现,同样,Clojure 也适合在这里使用,您可以想象生产环境中的软件事务内存是什么样子。

  • Java 中的闭包
    添加闭包支持(也称为 lambda 或匿名方法)将简化部分 Java 编码工作,对是否在 Java 7 发行版中包含此支持进行过热烈的讨论。社区对此问题的讨论深度不一,因此 Java 程序员有必要花点时间研究这个问题,并看看讨论的所有内容。

  • DaVinci 机器
    JVM 的一个新版本对其他语言(比如上面提到的动态语言和函数式语言)更友好,这最终可能会也可能不会使它进入主流 JVM 发行版。随时关注这一点有助于理解在当前 JVM 上运行动态/脚本语言的利弊。

  • 用户界面开发
    在 Flash/Flex、Silverlight 和 JavaFX 的支持下,Web 浏览器得到了显著的(并且几乎是惊人的)改变。这还不考虑 Java 领域中的新服务器端 Web 框架和 Google Web 工具包(Google Web Toolkit,GWT)之类的特例。用户界面一直是、而且以后将继续是一个吸引人的亮点。了解一到两个(更不必说 Swing 或 SWT 之类的“富客户端” 库)库将对构建比 HTML 页面更具交互性的内容大有裨益。

记住,与任何和“未来” 相关的事物一样,现在讨论的内容可能最终证明是错误的方向、昙花一现的事物、对行业的一种影响,也可能是下一个重大事件;保持开放的思维,同时也要保持适当的怀疑。

结束语

请随意补充此列表 &mdash; 最终会得到一份更完善的参考资源列表。因为 Java 世界在不断发展,不断变化和成长,所以列表的内容会随时间而改变。这是一件好事;如果我们必须使用 1995 年时期的 Java 环境,我们早就转向其他技术了。

积极参与到 Java 世界中来:贡献补丁、增强,如果没有合适的贡献,就构建自己的工具。也许您的项目 5 年以内会一直出现在这个列表中。

 

参考资料

 

关于作者

Ted Neward 的照片

Ted Neward 是 ThoughtWorks 的一名顾问,ThoughtWorks 是一家在全球提供咨询服务的公司,他还是 Neward & Associates 的主管,负责有关 Java、.NET 和 XML 服务和其他平台的咨询、指导、培训和推介。他现在居住在华盛顿西雅图附近。

 

1 Comment 2009-03-06 21:05:27 by No.0023

OpenBSD 4.5 Pre-Orders Online

Tags: OpenBSD

OpenBSD 4.5 cover

Pre-orders are now being accepted for OpenBSD 4.5, scheduled for release on May 1st, 2009.

The developers bring us an amazing amount of cool new stuff (Accelerated video drivers, OpenSSH 5.2, LDoms Virtualization, pflow(4) NetFlow export interface, aucat(8) audio server capability and lots more). There are over 5500 ports and packages for easy installation.

Of course, t-shirts and posters are available too. Order your set NOW! (International, Europe)

No Comments 2009-03-06 15:37:22 by No.0023

跟香港政府学做预算

Tags: others


日前,香港政府财政司司长 曾俊华 在立法会宣读了《2009 至 2010 年度政府财政预算案》。虽然这几天香港诸媒体对于该预算案各有褒贬,但是在我们内地民众看来,该预算案的制作技术、展现方式以及所体现的诚意,令人叹为观止。

香港政府财政司为了让公众方便地获取预算案相关信息,颇动了一番脑筋,费了一番折腾。繁、英、简三种文字的网站 http://www.budget.gov.hk/ 专为公布预算而设。该网站中详细罗列了预算案演辞、预算案重点、预算案全文、网上广播、新闻稿、图片集等多种格式的文件,任何人都可以从该网站上自由下载,全方位地了解预算案相关的各项细节。为了让青少年市民充分理解预算案内容,财政司还特意制作了图文并茂的漫画版:
香港政府2009至2010年度财政预算案漫画版



除了表现形式、技术手段之外,政府各部门预算编制之详尽,也是很让人叹服的。以知识产权署预算为 例,其中的《管制人员报告》部分列出了各纲领下 2007 年财政拨款实际使用情况、2008 年预算修订情况,以及 2009 年预算。还在各项纲领预算后面详细交代该纲领各项宗旨,以及各项指标在 2007 年、2008 年的实际发生数字和 2009 年预算数字。各纲领末尾附有“2009 至 2010 年度需要特别留意的事项”,罗列了除上述指标之外与该纲领有关的工作事项。接下来是该署的三年财政拨款与人手编制分析图表。最后是三年财务(含 2009 年预算)账目及按分目列出的开支详情。通过这样一份内容丰富、数据翔实的预算案,民众就可以充分了解所纳税款究竟用在了哪里,为什么要这样用。

无论如何,香港政府在预算编制和公开方面的专业精神令人钦佩,值得学习。

 

from http://feedproxy.google.com/~r/hutuworm/~3/1fL-2gNOBkk/blog-post.html

No Comments 2009-03-05 21:46:10 by No.0023


共有文章169篇 第(1/9)页 首页 上一页 1 2 3 4 5 6 7 8 ... 下一页 末页