锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
I’ve been profiling my new K-Means++ implementation for the next LingPipe release on some randomly generated data. It’s basically a stress test for array gets, array sets, and simple multiply-add arithmetic. Many LingPipe modules are like this at run-time: named entity, part-of-speech tagging, language modeling, LM-based classifiers, and much more.
While I was waiting for a run using JDK 1.6 to finish, I installed the following beta release of JDK 7:
> java -version java version "1.7.0-ea" Java(TM) SE Runtime Environment (build 1.7.0-ea-b52) Java HotSpot(TM) 64-Bit Server VM (build 15.0-b03, mixed mode)
You can get it, too:
I believe much of the reason it’s faster is the work of these fellows:
Java’s always suffered relative to C in straight matrix multiplication because Java does range checks on every array access (set or get). With some clever static and run-time analysis, Würthinger et al. are able to eliminate most of the array bounds checks. They show on matrix benchmarks that this one improvement doubles the speed of the LU matrix factorization benchmark in the U.S. National Institute of Standards (NIST) benchmark suite SciMark 2, which like our clustering algorithm, is basically just a stress test for array access and arithmetic.
So far, my tests have only been on a Thinkpad Z61P notebook running Windows Vista (64 bit) with an Intel Core 2 CPU (T2700; 2.0GHz), and 4GB of reasonably zippy memory. I don’t know if the speedups will be as great for other OSes or for 32-bit JDKs.
I’m pretty excited about the new fork-join concurrency, too, as it’s just what we’ll need to parallelize the inner loops without too much work for us or the operating system.
*Update: 2:30 PM, 30 March 2009 JDK 7 is only about 15% faster than Sun’s JDK 6 on my quad Xeons (E5410, 2.33GHz) at work running the same code. I’ll have to check the exact specs on both of my memory buses. The notebook has surprisingly fast memory and the Xeon’s running ECC registered memory that I don’t think is quite as fast.
Update: 11:00 AM, 31 March 2009 Like other matrix algorithms, k-means clustering is extremely front-side-bus sensitive (connection between memory and the CPU), because the bottleneck is often between memory and the CPU’s L2 cache. Memory’s significantly slower than CPU these days.
The Intel dual quad-core Xeon E5410 have 12MB of L2 cache at 2.3GHz, whereas the Thinkpad Z61P has Intel Core 2 Mobile T7200 has only 4MB of L2 cache at 2GHz. The Core 2 has a 667 MHz front-side bus whereas the Xeon reports a 1333 MHz front-side bus (is that just the confusion between spec reporting). I actually don’t know what kind of memory’s in the workstation 鈥?I’ll have to crack it open and look. I’ve got 4GB of RAM in the notebook, but the motherboard can only see 3GB (ithat is, it’s not Windows 鈥?the same thing happened when I installed Ubuntu on the notebook and it’s a known design limitation in many motherboards); I have 16GB of RAM in the workstation and the motherboard can see all of it. But it has two physical chips, each of which share the memory, so the motherboard’s architecture’s very different. There are so many confounding factors that I can’t tease apart what’s speeding up in JDK 7 so much on the notebook.
Anway, go forth and test. If you’re using a machine like my notebook to do number crunching, JDK 7 really is twice as fast as JDK 6 for matrix algorithms.
Groovy灝辨槸java涓栫晫鐨勫姩鎬佽璦
涓錛氬揩閫熷紑濮嬶紙gettingStart錛?/span>
瀹夎JDK鐜
Groovy闇瑕?/span>JDK1.4浠ヤ笂鐗堟湰鐨勬敮鎸併傚洜姝ゅ湪瀹夎groovy鏃墮鍏堣瀹夎JDK銆?/span>
JDK瀹夎姝ラ錛?/span>
• 涓嬭澆鑷繁鍠滄鐨?/span>JDK鐗堟湰銆傦紙涓嬭澆緗戝潃錛?/span>http://java.sun.com錛?/span>
• 涓嬭澆Groovy錛?/span>
Groovy鐨?/span> 涓嬭澆棣栭〉鎴浘
鐐瑰嚮Download
榪涘叆涓嬭澆欏甸潰
Groovy鏈鏂扮増鏈細Groovy 1.6-RC-2
鎴戜笅杞界殑鏄細Download Windows-Installer: Binary Release 瀹夎鐗堟湰
榪愯瀹夎鑰?/span>
璁劇疆JAVA_HOME 鐜鍙橀噺. 鍦?/span>Windows騫沖彴閲岋紝姝ラ濡備笅:
(1)鎵撳紑緋葷粺"鎺у埗闈㈡澘"
鍗曞嚮"楂樼駭"閫夐」鍗?/span>
鍗曞嚮"鐜鍙橀噺" 鎸夐挳
娣誨姞涓涓悕縐頒負"JAVA_HOME" 鐨勬柊鐨勭郴緇熺幆澧冨彉閲忥紝騫朵笖灝嗕綘鐨?/span>Java鐨勫畨瑁呯洰褰曚綔涓哄畠鐨勫?/span> (渚嬪錛屾垜鐨勬槸C:"Program Files"Java"jdk1.6.0錛堢増鏈彿錛?/span>)
浣犱篃鍙互娣誨姞 %JAVA_HOME%"bin鍒頒綘鐨勭郴緇熺殑PATH鍙橀噺涓?/span>
(2)鍙沖嚮鎴戠殑鐢佃剳灞炴?/span>
鐐瑰嚮楂樼駭閫夐」
鐐瑰嚮鐜鍙橀噺
鐐瑰嚮鏂板緩閫夐」錛?/span>
鍏蜂綋璁劇疆
Path錛?/span>
鎴戠敤鐨?/span>Jdk鐗堟湰鏄?/span>Jdk1.6
• 榪愯瀹夎鏂囦歡銆傦紙鏇存敼瀹夎璺緞鍒幫細C:"Program Files"Java"jdk1.6.0錛堢増鏈彿錛夛級
• 璁劇疆JAVA_HOME鐜鍙橀噺錛堝鎴戠殑
• 鍦ㄧ郴緇?/span>path涓鍔狅細%JAVA_HOME%"bin
娉細瀵逛簬1.1-rc-1浠ヤ笂鐗堟湰闇瑕?/span>JDK1.5鐗堟垨鏇撮珮鐨勭増鏈?/span>
鐐瑰嚮鑷繁涓嬭澆鐨?/span>Groovy windows瀹夎鐗堟湰
瀹夎鍙互鏄粯璁ょ殑瀹夎鍏ㄧ偣鍑諱笅涓姝ワ紙next錛夛細
瀹夎灝卞畬鎴愬暒
(Note: as an alternative to setting a system environment variable, you can create yourself a '.bat' or '.cmd' file which sets
the variable. You then need to run that batch file in any console window in which you wish to run Java and double clicking on
.bat' or '.cmd' files containing Java invocation instructions won't work. If you are unsure about what this means, follow
the earlier instructions.)
Note: JDK 1.5 is required for version 1.1-rc-1. In earlier versions of JDK (notably 1.4.2) the compiller throws an exception:
*nested exception is org.codehaus.groovy.runtime.InvokerInvocationException: java.lang.NoSuchMethodError:
java.lang.String.replace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String;
The method "replace" was introduced in JDK 1.5 and is not supportedin earlier versions. This is also a reason why GRails
framework doesn't run on JRE 1.4
(1)濡傛灉浣犳槸瀹夎鐗堟湰Groovy鐜鍙橀噺涓嶉渶瑕佹垜浠緗紝鍦ㄥ畨瑁呯殑鏃跺欏氨鑷姩璁劇疆濂藉暒銆?/span>
(2)濡傛灉涓嶆槸錛岃鑷繁灝濊瘯Groovy璁劇疆濡備笅錛?/span>
璁劇疆浣犵殑Groovy鐜鍙橀噺
浠庝笅杞介〉闈笅杞?/span>Groovy瀹夎鍣ㄦ垨鑰呬簩榪涘埗鍖咃紝騫朵笖璺熺潃浠嬬粛榪涜瀹夎鍗沖彲銆傦紙褰撳墠鏈変竴涓棶棰橈紝灝辨槸鍦?/span>windows涓嬶紝浣犵殑瀹夎璺緞涓嶈兘鍚湁絀烘牸
錛屽嵆錛岃灝嗗叾緙虹渷鐨勫畨瑁呰礬寰?/span>"c:"Program Files"Groovy" 鏀規垚璞?/span>"c:"Groovy"榪欐牱鐨勮礬寰勶級
鎴栬呰繖鏍?/span>
浠庣珯鐐逛笂寰楀埌Groovy鍙戣鐗堢殑copy,騫朵笖copy瀹冨埌浣犵‖鐩樹笂鐨勬煇涓湴鏂廣?/span>
瑙e帇緙╄繖涓?/span>groovy鍖呭埌浣犵‖鐩樼殑鏌愪釜絀洪棿錛屽鎴戠殑鍦?/span> C:"dev"groovy-1.0-jsr-06
璁劇疆GROOVY_HOME鐜鍙橀噺. 鍦?/span>Windows涓嬶紝浣滃涓嬫楠?/span>:
娣諱腑鏂扮殑緋葷粺鐜鍙橀噺GROOVY_HOME 騫朵笖灝嗗艱涓轟綘鐨?/span>groovy瀹夎鐨勮礬寰勶紙 鎴戠殑鏄?/span> C:"dev"groovy-1.0-jsr-06)
鎵撳紑鍛戒護琛岀獥鍙o紝騫朵笖閿叆"set" 鐒跺悗鎵撳洖杞︼紝鏌ョ湅浣犵殑鐜鍙橀噺璁劇疆鏄惁宸茬粡姝g‘銆?/span>
鍙夌殑錛屼綘涔熷彲浠ユ坊鍔?/span> %GROOVY_HOME%"bin 鍒頒綘鐨?/span>PATH鐜鍙橀噺涓?/span>
閫氳繃鍙屽嚮璇曠潃榪愯groovyConsole.bat銆傚鏋滃畠涓嶈兘宸ヤ綔錛屾墦寮涓浜哄懡浠よ紿楀彛錛屽皢鐩綍鏀瑰彉鍒?/span>bin鐩綍錛屽茍涓旇繍琛屽畠鐪嬩粬榪斿洖浠涔堥敊璇俊鎭?/span>
浜岋細榪愯groovy
Groovy瀹夎錛氱洰褰?/span>
鎴戜滑闇瑕佺偣鍑?/span>groovyConsole.bat鏂囦歡錛?/span>
鏂囦歡璇︾粏鍐呭濡備笅錛?/span>
@if "%DEBUG%" == "" @echo off @rem @rem $Revision: 2770 $ $Date: 2005-08-29 12:49:42 +0200 (Mo, 29. Aug 2005) $ @rem @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal :begin @rem Determine what directory it is in. set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=." "%DIRNAME%"startGroovy.bat" "%DIRNAME%" groovy.ui.Console %* @rem End local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" endlocal |
瀹夎瀹屾暣鏃犺鐨勮瘽 榪愯groovyConsole.bat灝變細鍚姩groovyConsole.exe錛屽嚭鏉ヤ竴涓紪杈戞銆?br />
涓婇潰鐨勬槸鏂囨湰杈撳叆妗嗭細鏍規嵁groovy鐨勮娉曡緭鍏ヨ鏄劇ず鐨勫唴瀹癸細
涓嬮潰鐨勬槸鍐呭杈撳嚭妗嗭細鏄劇ず涓婇潰鐨勫唴瀹癸細
寮濮嬭繍琛?/span>groovy錛?br />
Hello, World
鍦?/span> groovyConsole榪愯紿楀彛鐨勯《閮?/span>,閿叆println "Hello, World!"
騫朵笖閿叆 <CTRL-R>.
娉ㄦ剰錛屽湪鎺у埗鍙扮獥鍙d腑錛堝嵆 groovyConsole紿楀彛鍓嶉潰鐨勯粦鑹茬殑閭d釜錛夛紝鏂囦綋寰楀埌鎵撳嵃騫朵笖 groovyConsole鐨勪笅閮ㄦ樉紺?/span> :
groovy> println "Hello, World!"
null
浠?/span>"groovy>"寮澶寸殑琛屾鏄帶鍒跺彴澶勭悊鐨勬枃鏈?/span>. "null" 鏄〃杈懼紡鐨勫?/span>. 鍥犱負琛ㄨ揪寮忔病鏈変換浣曞煎彲浠ユ墦鍗?/span> 錛屾墍浠?/span>groovyConsole鎵撳嵃涓?/span>"null"
鎺ヤ笅鏉ワ紝鍐嶈瘯涓浜涘疄闄呯殑鍊鹼紝鐢ㄤ笅闈㈢殑瀛楃涓叉潵鏇挎崲鎺у埗鍙伴噷鐨勬枃鏈細
123+45*67
鎴栬呬綘鍠滄鐨勪換浣曡〃杈懼紡鐒跺悗鎸?/span><CTRL-R> (I'm going to stop telling you to hit <CTRL-R>, I think you get the idea). 鐜板湪錛?/span> groovyConsole涓嬮潰鎵撳嵃鐨勫兼湁鏇村鐨勫惈涔?/span>.
Variables
You can assign values to variables for later use. Try the following:x = 1
println x
x = new java.util.Date()
println x
x = -3.1499392
println x
x = false
println x
x = "Hi"
println x
Lists and Maps
The Groovy language has built-in support for two important data types, lists and maps (Lists can be operated as arrays in Java language). Lists are used to store ordered collections of data. For example an integer list of your favorite integers might look like this:myList = [1776, -1, 33, 99, 0, 928734928763]
You can access a given item in the list with square bracket notation (indexes start at 0):
println myList[0]
Should result in this output:
1776
You can get the length of the list with the "size" method:
println myList.size()
Should print out:
6
But generally you shouldn't need the length, because unlike Java, the preferred method to loop over all the elements in an list is to use the "each" method, which is described below in the "Code as Data" section.
Another native data structure is called a map. A map is used to store "associative arrays" or "dictionaries". That is unordered collections of heterogeneous, named data. For example, let's say we wanted to store names with IQ scores we might have:
scores = [ "Brett":100, "Pete":"Did not finish", "Andrew":86.87934 ]
Note that each of the values stored in the map is of a different type. Brett's is an integer, Pete's is a string, and Andrew's is a floating point number. We can access the values in a map in two main ways:
println scores["Pete"]
println scores.Pete
Should produce the output:
Did not finish
Did not finish
To add data to a map, the syntax is similar to adding values to an list. For example, if Pete re-took the IQ test and got a 3, we might:
scores["Pete"] = 3
Then later when we get the value back out, it will be 3.
println scores["Pete"]
should print out 3.
Also as an aside, you can create an empty map or an empty list with the following:
emptyMap = [:]
emptyList = []
To make sure the lists are empty, you can run the following lines:
println emptyMap.size()
println emptyList.size()
Should print a size of 0 for the List and the Map.
鏉′歡琛ㄨ揪寮?/span>
One of the most important features of any programming language is the ability to execute different code under different conditions. The simplest way to do this is to use the '''if''' construct. For example:amPM = Calendar.getInstance().get(Calendar.AM_PM)
if (amPM == Calendar.AM)
{
println("Good morning")
} else {
println("Good evening")
}
Don't worry too much about the first line, it's just some code to determine whether it is currently before noon or after. The rest of the code executes as follows: first it evaluates the expression in the parentheses, then depending on whether the result is '''true''' or '''false''' it executes the first or the second code block. See the section below on boolean expressions.
Note that the "else" block is not required, but the "then" block is:
amPM = Calendar.getInstance().get(Calendar.AM_PM)
if (amPM == Calendar.AM)
{
println("Have another cup of coffee.")
}
Boolean琛ㄨ揪寮?/span>
There is a special data type in most programming languages that is used to represent truth values, '''true''' and '''false'''. The simplest boolean expression are simply those words. Boolean values can be stored in variables, just like any other data type:myBooleanVariable = true
A more complex boolean expression uses one of the boolean operators:
==
!=
>
>=
<
<=
Most of those are probably pretty intuitive. The equality operator is '''==''' to distinguish from the assignment operator '''='''. The opposite of equality is the '''!=''' operator, that is "not equal"
So some examples:
titanicBoxOffice = 1234600000
titanicDirector = "James Cameron"
trueLiesBoxOffice = 219000000
trueLiesDirector = "James Cameron"
returnOfTheKingBoxOffice = 752200000
returnOfTheKingDirector = "Peter Jackson"
theTwoTowersBoxOffice = 581200000
theTwoTowersDirector = "PeterJackson"
titanicBoxOffice > returnOfTheKingBoxOffice // evaluates to true
titanicBoxOffice >= returnOfTheKingBoxOffice // evaluates to true
titanicBoxOffice >= titanicBoxOffice // evaulates to true
titanicBoxOffice > titanicBoxOffice // evaulates to false
titanicBoxOffice + trueLiesBoxOffice < returnOfTheKingBoxOffice + theTwoTowersBoxOffice // evaluates to false
titanicDirector > returnOfTheKingDirector // evaluates to false, because "J" is before "P"
titanicDirector < returnOfTheKingDirector // evaluates to true
titanicDirector >= "James Cameron" // evaluates to true
titanicDirector == "James Cameron" // evaluates to true
Boolean expressions are especially useful when used in conjunction with the '''if''' construct. For example:
if (titanicBoxOffice + trueLiesBoxOffice > returnOfTheKingBoxOffice + theTwoTowersBoxOffice)
{
println(titanicDirector + " is a better director than " + returnOfTheKingDirector)
}
An especially useful test is to test whether a variable or expression is null (has no value). For example let's say we want to see whether a given key is in a map:
suvMap = ["Acura MDX":""$36,700", "Ford Explorer":""$26,845"]
if (suvMap["Hummer H3"] != null)
{
println("A Hummer H3 will set you back "+suvMap["Hummer H3"]);
}
Generally null is used to indicate the lack of a value in some location.
Debugging and Troubleshooting Tips
Print out the class of a variable that you're interested in with myVar.getClass(). Then look up the documentation for that class.
If you're having trouble with a complex expression, pare it down to a simpler expression and evaluate that. Then build up to your more complex expression.
Try restarting the groovyConsole (this will clear out all the variables so you can start over.
Look for the topic you're interested in in the Groovy User Guide
If you are a Java developer
you might want to check on the Differences from Java
also there afew a few Things to remember
Labels parameters
JAX 鏄痙鍥藉崄鍒嗛噸瑕佺殑Java鎶鏈細璁紙Java conference錛夛紝姣忎竴騫磋緇勭粐閮戒細鍙紑浼氳璇勯?strong>鏈鍏峰垱鏂扮簿紲炵殑欏圭洰錛岃瘎閫夊鍛樹細浠?a >40涓彁鍚?/a>欏圭洰涓夋嫨鍗佷釜鍊欓夐」鐩?/a>錛岃澶氫紭縐欏圭洰濡侻atisse GUI builder錛圢etBeans鐨勪竴涓彃浠訛紝鐢ㄤ簬鏋勫緩GUI紼嬪簭錛夈丯uxeo錛堜紒涓氱駭鍐呭綆$悊瑙e喅鏂規錛夌瓑閮藉叆鍥村欓夛紝鏈鍚嶨roovy璧㈠緱浜?絳夊錛佽繖鏄竴涓磭楂樼殑鑽h獕錛屾垜浠劅鍒伴潪甯擱珮鍏達紝鐗瑰埆鏄拰璁稿闈炲父浼樼鐨勯」鐩竴璧風珵璧涖傚彟澶栬濂栭」鐨勪笂涓鏈熻儨鍑鴻呮槸Spring framework銆?/p>
榪樻湁錛岀敱Dierk König鍒涗綔鍑虹増鐨勭晠閿涔?-----銆奊roovy in Action銆嬶紝涔熶細浣滀負濂栧搧璧犱簣Groovy紺懼洟錛岄殢鍚嶫AX灝嗗崟鐙緗瓽roovy涓婚鐨勪細璁繘琛岄濂栥?strong>榪欎簺濂栭」璇佹槑騫惰偗瀹氫簡Groovy鐨勫垱鏂頒環鍊鹼紝騫惰鏄嶨roovy鍦↗ava紺懼洟鏈変笉灝忕殑褰卞搷鍔?/strong>銆?
http://groovy.codehaus.org
mxjava
http://www.mxjava.com/blog/
http://www.onjava.com
O'Reilly鐨凧ava緗戠珯. 姣忓懆閮芥湁鏂版枃绔?
http://java.sun.com
瀹樻柟鐨凧ava寮鍙戣呯綉绔?- 姣忓懆閮芥湁鏂版枃绔犲彂琛?
http://www.developer.com/java
鐢盙amelan.com 緇存姢鐨凧ava鎶鏈枃绔犵綉绔?
http://www.java.net
Sun鍏徃緇存姢鐨勪竴涓狫ava紺懼尯緗戠珯
http://www.builder.com
Cnet鐨凚uilder.com緗戠珯 - 鎵鏈夌殑鎶鏈枃绔? 浠ava涓轟富.
http://www.ibm.com/developerworks/java
IBM鐨凞eveloperworks鎶鏈綉绔? 榪欐槸鍏朵腑鐨凧ava鎶鏈富欏?
http://www.javaworld.com
鏈鏃╃殑涓涓狫ava绔欑偣. 姣忓懆鏇存柊Java鎶鏈枃绔?
http://www.devx.com/java
DevX緇存姢鐨勪竴涓狫ava鎶鏈枃绔犵綉绔?
http://www.fawcette.com/javapro
JavaPro鍦ㄧ嚎鏉傚織緗戠珯.
http://www.sys-con.com/java
Java Developers Journal鐨勫湪綰挎潅蹇楃綉绔?
http://www.javadesktop.org
浣嶄簬Java.net鐨勪竴涓狫ava妗岄潰鎶鏈ぞ鍖虹綉绔?
http://www.theserverside.com
榪欐槸涓涓璁烘墍鏈塉ava鏈嶅姟鍣ㄧ鎶鏈殑緗戠珯.
http://www.jars.com
鎻愪緵Java璇勮鏈嶅姟. 鍖呮嫭鍚勭framework鍜屽簲鐢ㄧ▼搴?
http://www.jguru.com
涓涓潪甯告鐨勯噰鐢≦&A褰㈠紡鐨凧ava鎶鏈祫婧愮ぞ鍖?
http://www.javaranch.com
涓涓鍧涳紝寰楀埌Java闂絳旀鐨勫湴鏂癸紝鍒濆鑰呯殑濂藉幓澶勩?
http://www.ibiblio.org/javafaq/javafaq.html
comp.lang.java鐨凢AQ绔欑偣 - 鏀墮泦浜嗘潵鑷猚omp.lang.java鏂伴椈緇勭殑闂鍜岀瓟妗堢殑鍒嗙被鐩綍.
http://java.sun.com/docs/books/tutorial/
鏉ヨ嚜SUN鍏徃鐨勫畼鏂笿ava鎸囧崡 - 瀵逛簬浜嗚В鍑犱箮鎵鏈夌殑java鎶鏈壒鎬ч潪甯告湁甯姪.
http://www.javablogs.com
浜掕仈緗戜笂鏈媧昏穬鐨勪竴涓狫ava Blog緗戠珯.
1.TheServerside.com 銆?/p>
2.InfoQ.com Floyd Marinescu 鍦ㄧ寮 TSS 鍚庡彟璧風倝鐏訛紝2006騫翠腑鏈閲嶈鎺ㄨ崘銆?/p>
瑙嗛噹涓嶅啀灞闄愪簬Java 鑰屾槸鍖呮嫭Java,.Net, Ruby ,SOA, Agile鏂規硶絳夌儹闂ㄨ瘽棰樸?/p>
3.JDJ鐨勭數瀛愭潅蹇?鍦↗DJ棣栭〉鐨勬渶搴曞璁㈤槄錛屾枃绔犺川閲忎笉浣庝簬5-7鐨勪紶緇熶笁寮恒?/p>
4.SWik.net 鏀墮泦浜嗗ぇ閲廜penSource Project鐨勮祫婧愯仛鍚堛傚叾涓Spring錛?/p>
Hibernate鐨勬洿鏂板害闈炲父楂橈紝鍑虹幇浠涔堝拰Spring鏈夊叧鐨刡log,article,project閮戒細
椹笂琚仛鍚堛?/p>
5.IBM DeveloperWorks 浼犵粺銆佺ǔ瀹氱殑Java鏂囩珷鏉ユ簮鍦般?/p>
6.JavaWorld 浼犵粺銆佺ǔ瀹氱殑Java鏂囩珷鏉ユ簮鍦般?/p>
7.OnJava 浼犵粺銆佺ǔ瀹氱殑Java鏂囩珷鏉ユ簮鍦般?/p>
8.Artima.com 綾諱技浜嶵SS鑰岀暐閫婏紝鍏朵腑Spotlight 鏂囩珷鍊煎緱鍏蟲敞錛岃孞ava News鏄?/p>
鑱氬悎浜嗘墍鏈夊叾浠朖ava绔欑偣鐨勫ぇ鑱氬悎銆?/p>
9.JavaLobby 绔欏唴鐨凙nnouncements 鏄ぇ澶у皬灝廕ava Project鐨勫彂甯冨0鏄庡尯錛?/p>
Trips and Tricks 鏈夊緢澶氱殑Tips銆?/p>
10. No Fluff Just Stuff 鐨凚logs 鑱氬悎 涓鐩寸己涓涓墍鏈変紭縐Java Blogger鐨?/p>
rss鎬昏仛鍚堬紝NFJS榪欓噷鍕夊己綆椾竴涓?br />
Ajaxian涓涓帴榪戜簬闂ㄦ埛綾誨瀷鐨凙JAX璧勬簮绔欑偣錛屽寘鎷珹jax紺轟緥鏀墮泦錛屽崥瀹紝璁哄潧鍜屾暀紼嬬瓑絳夈?/p>
8. DHTML Site
9. Solutoire
10. DevSnippets
2008騫村浗澶栨渶浣砏eb璁捐/寮鍙戞妧宸с佽剼鏈強璧勬簮13涓彲鑳戒細璁╀綘璇?#8221;Thank You”鐨勫繀涓嶅彲灝戠殑寮婧愬簲鐢?/a>
14涓厤璐瑰伐鍏瘋浣犱簡瑙d負浠涔堜漢浠細鏀懼純璁塊棶浣犵殑緗戠珯
74涓垜浠彲鑳藉凡緇忓繕璁扮殑閫傚悎緗戦〉璁捐甯堢殑寰堟鐨刉eb搴旂敤
20涓厤璐圭殑SEO緗戠珯鍒嗘瀽宸ュ叿(宸茬炕璇戞垚涓枃)
11涓姛鑳藉己澶х敋鑷沖彲浠ユ浛浠f爣鍑嗗簲鐢ㄧ▼搴忕殑Firefox3鎵╁睍鎻掍歡
10涓綘鑷沖皯搴旇浜嗚В鐨勫厤璐圭収鐗囩鐞嗚蔣浠?/a>
15涓墠绔紑鍙?緗戦〉璁捐甯堝繀澶囩殑Bookmarklet(宸茬炕璇戞垚涓枃)
灝哖SD鏁堟灉鍥捐漿鎹負HTML/CSS鐨?0澶ф暀紼?/a>
30+JavaScript, Ajax & CSS宸ュ叿鎻愮ず鑴氭湰
40+鏈鐑棬鐨剋ordpress縐樿瘈鍜屾妧宸?/a>錛?30+ More
30+璁╀綘澶у紑鐪肩晫鐨刉eb鍓嶇寮鍙戣棰戞暀紼?/a>
19涓狢SS鑿滃崟鏁欑▼鏉ヤ負浣犵殑緗戠珯娣誨姞鏇村瓚e懗
綺鵑?0涓紭縐鐨凜SS鎶鏈拰瀹炰緥(宸茬炕璇戞垚涓枃)
12縐岼avascript瑙e喅甯歌嫻忚鍣ㄥ吋瀹歸棶棰樼殑鏂規硶(宸茬炕璇戞垚涓枃)
15涓湁甯姪鐨勫熀浜庢祻瑙堝櫒鐨刉eb鍓嶇寮鍙戝伐鍏?/a>
75涓?鐪熸鐨?寰堟湁甯姪鐨凧avaScipt鎶鏈?/a>
63涓繀涓嶅彲灝戠殑Wordpress Hack銆佹暀紼嬨佸府鍔╂枃浠跺拰鎵嬪唽
20涓濂囩殑Javascipt鑴氭湰鍘熷瀷銆佸厓绱犮乄idgets銆佺被…
10涓仾鏄庣殑JavaScipt鎶鏈敤鏉ユ彁鍗囦綘鐨刄I鐣岄潰
35涓嬌鐢ㄧ畝渚跨殑Ajax/JavaScipt瀵艱埅瑙e喅鏂規
鏁寸悊鍙婁紭鍖朇SS浠g爜鐨?涓師鍒?/a>(宸茬炕璇戞垚涓枃)
浣跨敤CSS涓哄浘鐗囨坊鍔犳洿澶氳叮鍛崇殑5縐嶆柟娉?/a>(宸茬炕璇戞垚涓枃)
鏉ヨ嚜8涓烘瀬鍏風伒鎰熺殑婕旇鑰呯殑10涓綉緇滃簲鐢ㄦ妧宸?/a>
10涓狢SS綆鍐欐妧宸ц浣犳案榪滃彈鐢?/a>(宸茬炕璇戞垚涓枃)
鎺ㄨ崘20涓叧浜庣綉绔欏彲鐢ㄦу強鐣岄潰璁捐鐨勭綉绔?/a>(宸茬炕璇戞垚涓枃)
綺鵑?1涓綉绔欑晫闈㈣璁″疄璺墊暀紼?/a>(宸茬炕璇戞垚涓枃)
鎴愪負Web璁捐/寮鍙戣嚜鐢辮亴涓氳呮墍瑕侀伒寰簡53涓(60+璧勬簮)
Ajax緗戦〉瓚嬪娍鐮旂┒錛屼粈涔堟槸鏈濂界殑鍏嶈垂Ajax璧勬簮錛?70+鏈浣矨jax璧勬簮)
155涓猈ordpress璧勬簮銆佹暀紼嬨佹彃浠躲佷富棰樸丄jax銆佹挱瀹?#8230;搴炲ぇ鐨刉P鍒楄〃
10涓潪甯告鐨凙jax鍙奐avascript瀹炰緥璧勬簮緗戠珯(宸茬炕璇戞垚涓枃)
綺鵑?008騫存渶浣寵璁$礌鏉愯祫婧?amp;鐏墊劅 (宸茬炕璇戞垚涓枃)
10縐岼avaScript鐗規晥瀹炰緥璁╀綘鐨勭綉绔欐洿鍚稿紩浜?/a>
綺鵑?5涓浗澶朇SS妗嗘灦(宸茬炕璇戞垚涓枃)
鎺ㄨ崘20涓浣犲涔犲茍綺鵑欳SS鐨勭綉绔?/a>(宸茬炕璇戞垚涓枃)
65涓紭縐鐨刯Query璧勬簮(鏁欑▼銆佹墜鍐屻佺數瀛愪功銆乨emo銆佹彃浠?#8230;)
300+Jquery, CSS, MooTools 鍜?JS鐨勫鑸彍鍗曡祫婧?/a>(宸茬炕璇戞垚涓枃)
鎺ㄨ崘12嬈懼彲鐢ㄤ簬鍓嶇寮鍙戠殑鍏嶈垂鏂囨湰緙栬緫鍣?/a>
緗戦〉璁捐蹇呭鐨?0濂楁紓浜浘鏍囬泦(宸茬炕璇戞垚涓枃)
12嬈懼厤璐瑰湪綰垮伐鍏峰府鍔╀綘鍒涘緩鍜屾墭綆′綘鐨勭綉绔?/a>
灝哤ordpress鍙樹負CMS緋葷粺鐨?0澶ф彃浠?/a>
浣犱細鐢ㄥ湪Wordpress涓婚鎴栧崥瀹腑鐨?0嬈炬彃浠?/a>
浣犳棭鏅氫細鐢ㄥ埌鐨?30嬈網ordpress鎻掍歡-絎竴閮ㄥ垎-絎簩閮ㄥ垎
7涓垱寤轟綘鑷繁鐨凜SS鐢誨粖鐨刉ordpress涓婚
1銆?nbsp; Huihoo鍔ㄥ姏鈥斿綋涔嬫棤鎰х殑鑰佸ぇ 浠h〃浜虹墿錛?/strong>榫欒緣(Allen)銆?/span>紼嬪媷(Peter)銆佹潹娉?/span>(Orbat)銆 浠h〃欏圭洰錛?/span>JFox絳?/span> 瀹樻柟緗戠珯錛?/span>http://www.huihoo.org/ |
|
綆璇勶細璇村埌java寮婧愶紝澶у涓嶅彲鑳戒笉鐭ラ亾Huihoo錛?/span>Huihoo鏇劇粡鍒涢犱簡寰堝濂囪抗錛屼笉綆℃槸瀵規槸鍥㈤槦鎴愬憳鐨勬妧鏈按騫寵繕鏄紑婧愮悊蹇點佸紑婧愮粍緇囩殑綆$悊絳夐兘鍙互璇存槸鏈媯掔殑錛?/span>JFox欏圭洰涓鐩村叿鏈夌敓鍛藉姏錛?/span>huihoo榪欎箞澶氬勾浜嗕篃涓鐩村叿鏈夌敓鍛藉姏錛?/span>Allen銆?/span>Peter銆?/span>Orbat絳夊榪欎釜鍥㈤槦榪欎箞澶氬勾鏉ョ殑鍧氭寔鍙婅礎鐚紝瑕侀夊浗鍐呮渶鍊煎緱鎺ㄥ磭鐨勫紑婧愬洟浣擄紝huihoo鎺掑湪絎竴浣嶅彲浠ヨ鏄綋涔嬫棤鎰с傚洜姝わ紝浠栦滑鏄渶鍙埍鐨勪漢銆?br style="font-family: " /> 2銆?/span>Jdon鈥?/span>楂樺涓嶈儨瀵?/span> 浠h〃浜虹墿錛?/span>褰櫒闃?/span>(鏉挎ˉ閲屼漢) 浠h〃欏圭洰錛?/span>jdonframework 瀹樻柟緗戠珯錛?/span>http://www.jdon.com/ 綆璇勶細浣滀負鍥藉唴絎竴涓紑婧愭鏋剁殑鍙戣搗浜猴紝浣滀負鍥藉唴絎竴涓暍浜庝笌鍥藉妗嗘灦鍙澘鐨勬澘妗ラ噷浜猴紝浠栨浘緇忓甫緇欏ぇ瀹跺緢澶氬緢澶氱殑嬈e枩鍙婂洖蹇嗭紝妗ユ妧鏈按騫沖強閫犺榪欓噷灝辨洿涓嶇敤璇翠簡錛屼粬“ 涓涓紑婧愪漢鐨勫鐙憡鐧?#8221;錛屾湁鐐規缽妗戯紝鏈夌偣蹇冨瘨錛?/span>jdon浠婂ぉ鐨勭幇鐘訛紝鏄腑鍥藉寰呮妧鏈漢鎵嶇殑鐪熷疄鍐欑収銆傛棤璁哄浣曪紝閫変腑鍥?/span>Java寮婧愮晫鏈鍙埍鐨勪漢錛屾澘妗ュ綋涔嬫棤鎰с?br style="font-family: " /> 3銆?/span>Apusic OperaMasks鈥?/span>璋佽寮婧愪笉璧氶挶 浠h〃浜虹墿錛?/span>琚佺孩宀椼寮犲媷 浠h〃欏圭洰錛?/span>OperaMasks 瀹樻柟緗戠珯錛?/span>http://www.operamasks.org/ 銆銆綆璇勶細1000涓囦漢姘戝竵鐨勬姇鍏ワ紝涓綃?#8220;鍕囨暍鑰呯殑鏂頒笘鐣?#8221;涔熺畻鏄湪涓浗寮婧愮晫鎺璧蜂簡涓闃墊嘗婢滐紝浜у搧鍙戝竷浼氫笂閭d竴浠戒喚鍚堝悓錛屾洿鏄鍚岃鐨勮佹諱滑鏈夌偣鐪肩孩銆傞櫎鍘誨晢涓氬洜绱犱笉璇達紝榪欎袱澶?/span>Check out浜?/span>OperaMasks鐨勪唬鐮侊紝涔熺湅浜嗙ず渚嬶紝琛ㄧ幇闈炲父涓嶉敊錛屽煎緱娣卞眰嬈$殑java寮鍙戜漢鍛樺涔犮傝佽娣卞帤鐨勬妧鏈姛搴曘佽佸紶鍗栧姏鐨勫叏鍥借礬婕旓紝鍏徃緇忚惀鎴樼暐鐨勬垚鍔燂紝OperaMasks鑳藉惁鍙戝睍鎴愪負涓涓渶鑳介傚悎涓浗鍥芥儏鐨勫紑婧愮粍緇囷紝璁╂垜浠嫮鐩互寰呫?br style="font-family: " /> 銆銆4銆?/span>EasyJF鈥?/span>鍚庣敓鍙晱 銆銆浠h〃浜虹墿錛?/strong>钄′笘鍙?/span>(澶у場)銆佸惔鍢変繆(stef_wu)銆佺▼寮?/span>(澶╀竴) 浠h〃欏圭洰錛?/span>EasyJWeb 瀹樻柟緗戠珯錛?/span>http://www.easyjf.com/ 銆銆綆璇勶細鐪嬩簡澶у場灝忔湅鍙嬬殑涓浜涙枃绔狅紝 鐪嬪埌EasyJF鐜板湪鐨勫彂灞曪紝鐪熺湡瀹炲疄鏈変竴縐嶅悗鐢熷彲鐣忕殑鎰熷徆銆備粬浠湁鑷繁鐨勪笓鑱屽洟闃燂紝鏈夌綉涓嬪姙鍏錛岃繕鏈夌‖浠惰鏂斤紝榪樻嫢鏈変竴緹ゆ湁嬋鎯呫佸ソ瀛︾殑騫磋交灝忎紮瀛愪滑銆傝櫧鐒惰寰楀埌涓浗浜鴻嚜宸辯殑璁ゅ彲鏄緢涓嶅鏄撶殑浜嬫儏錛屼絾鎼滅儲涓涓嬪甫鏄彂鐜板浗鍐呭凡緇忔湁涓嶅皯緗戠珯鍦ㄧ敤EasyJWeb鍋氬紑鍙戙傚洜姝わ紝鏈鍙埍鐨勪漢褰撲粬浠帿灞烇紝琛峰績甯屾湜浠栦滑鑳芥垚鍔熴?br style="font-family: " /> 銆銆5銆?/span>SpringSide鈥?/span>澶╂墠鍥㈤槦 浠h〃浜虹墿錛?/strong>鑲栨ˇ(姹熷崡鐧借。)銆?a style="font-family: " name="cac">闄堜繆(cac)銆佺敯娣?/span>(宸矙) 浠h〃欏圭洰錛?/span>SpringSide 瀹樻柟緗戠珯錛?/span>http://www.springside.org.cn/ 綆璇勶細铏界劧鍙槸绔欏湪鏄ュぉ鐨勫倣杈癸紝浣嗗凡緇忓甫緇欎簡鏁村ぉ蹇欎簬榪介愭柊鎶鏈佹柊娼祦鐨?/span>Java紼嬪簭鍛樹滑寰堝鏋佸叿鍙傝冧環鍊肩殑涓滆タ銆傛睙鍗楃櫧琛e悓瀛﹀彲浠ョ畻鏄竴涓ぉ鎵嶈埇鐨勪漢鐗╋紝鎶鏈殑鏀誨簳銆佹帴鍙楀茍璇戦噴鏂版妧鏈殑閫熷害銆佽兘鍔涘強姘村鉤錛屽彲浠ヨ鏄皯鏁頒腑鐨勫皯鏁般傚洜姝わ紝SpringSide鍙互縐板緱涓婃渶鍏鋒湁鍋跺儚娼滆川鐨勫洟闃燂紝Java寮婧愮晫鏈鍙埍鐨勪漢錛屼粬浠綋涔嬫棤鎰э紝甯屾湜浠栦滑鑳戒粠“鍌嶈竟”璧板埌“涓棿”銆?br style="font-family: " /> 6銆?/span>Buffalo紺懼尯鈥?/span>嫻撶緝鏄簿 浠h〃浜虹墿錛?/strong>闄堥噾媧?/span>(Michael Chen) 浠h〃欏圭洰錛?/span> Buffalo 瀹樻柟緗戠珯錛?/span>http://buffalo.sourceforge.net/ 綆璇勶細浣滀負絎竴涓浗浜哄紑鍙戠殑Ajax妗嗘灦錛屼綔涓轟竴涓兘鎶婁竴鐩村彈java澶ф嬁浠矏瑙?/span>javascript鐜╄漿寰楀浣曠啛鎮夌殑欏圭洰錛屼綔涓轟竴涓兘鍑犲勾鍧氭寔鏇存柊鐨勫紑婧愰」鐩紝Buffalo鏄垚鍔熺殑錛?/span>Michael Chen璁╂垜浠綋浼氬埌鍥藉唴寮婧愯礎鐚呬滑鎵х潃涓庡潥鎸併備粬鏄笉鏄渶鍙埍鐨勪漢錛岃皝鏄紵 7銆佸ぉ涔欑ぞ鍖?/span>鈥斾韓鍙楀紑婧?/span>鍔ㄥ姏 浠h〃浜虹墿錛?/span>laoer 浠h〃欏圭洰錛?/strong>澶╀箼寮婧愮ぞ鍖?/span> 瀹樻柟緗戠珯錛?/span>http://www.laoer.com/ 綆璇勶細鏈夊灝戝紑婧愰」鐩殑浜у搧鍙戝竷鍒?/span>8.0錛屼粠jsp銆?/span>struts1鍒?/span>struts2涓璺蛋鏉ワ紝涓鐩磋兘璺熺潃鏂版妧鏈殑姝ヤ紣錛屼笉鏂敼榪涘強瀹屽杽銆傚洜姝わ紝褰撲箣鏃犳劎java寮婧愮晫鏈鍙埍鐨勪漢銆?br style="font-family: " /> 8銆?/span>CowNew寮婧?/span>鈥?/span>鐪熸湁涓鐐圭墰 浠h〃浜虹墿錛?/strong>鏉ㄤ腑縐?/span> 浠h〃欏圭洰錛?/span>CowNewSQL 瀹樻柟緗戠珯錛?/span>http://www.cownew.com/ 綆璇勶細鐪嬭繃鏉ㄤ腑縐戝悓瀛︾殑涓ょ瘒鏂囩珷錛屾垜瑙夊緱浠栨槸鍙埍鐨勩傚鏁版嵁搴撶炕璇戝紩鎿?/span>CowNewSQL鐨勪環鍊煎皢鍦ㄥ摢閲屼綋鐜幫紵CowNew鑳藉湪浣曟椂緇欐垜浠甫鏉ユ洿澶氬疄鐢ㄧ殑涓滆タ錛屽煎緱澶у鏈熷緟銆傛棤璁哄浣曪紝浠栦滑鐨勮繘姝ユ槸鏈夌洰鍏辯澒銆?br style="font-family: " /> 9銆?/span>CommonTemplate鈥?/span>鍊煎緱鏈熷緟 浠h〃浜虹墿錛?/strong>姊侀(javatar) 浠h〃欏圭洰錛?/span>CommonTemplate 瀹樻柟緗戠珯錛?/span>http://www.commontemplate.org/ 綆璇勶細涔熻寰堝浜轟笉鐭ラ亾榪欎釜欏圭洰錛屼絾浠栫‘瀹炴槸涓涓緢涓嶉敊鐨勬ā鏉垮紩鎿庯紝閲戝瓙鎬繪湁鍙戝厜鐨?/span>鏃跺?/span>銆傚彧瑕佸潥鎸侊紝鐩鎬俊鏈変竴澶╂椋炲悓瀛︿細緇欏ぇ瀹跺甫鏉ユ洿澶氱殑鎯婂枩銆?br style="font-family: " /> 10銆佹仼淇♀斿皬鍏徃涔熻兘寮婧?a href="http://www.tkk7.com/mikezeseler/">mike zeseler 浠h〃浜虹墿錛?/strong>鍒樻湁娑?/span> 浠h〃欏圭洰錛?/strong>鎭╀俊寮婧?/span>ERP 瀹樻柟緗戠珯錛?/span>http://www.nseer.com/ 綆璇勶細鍚繃鍒樻葷殑婕旇錛屼粠“鎹曢奔”鍒?#8220;鎺堜箣浠ユ笖”錛屼粠鍒樻諱竴緋誨垪榪愪綔鎵嬫硶錛屾垜瑙夊緱鎭╀俊鍙互鎴愪負寰堝榪介愬紑婧愪絾鍙堟病鏈変笂鍗冧竾璧勯噾鏉ユ姇鍏ヨ屾誨湪涓烘槸鍚﹀弬鍔犲紑婧愯屽緲寰婄殑鑰佹諱滑鐨勫弬鑰冨涔犵殑妗堜緥銆傝櫧鐒舵病鏈夋妧鏈墰浜哄姞鐩燂紝铏界劧榪樹嬌鐢ㄧ◢涓哄彜鑰佺殑鎶鏈綋緋伙紝浣嗘棦鐒跺紑婧愪簡錛屾昏兘璁╂垜浠鍒板緢澶氫笢瑗褲傚懙鍛碉紝鎵鏈夋渶鍙埍鐨勫紑婧愪漢涓紝鍒樻葷畻鏄畻鏄渶騫撮暱鐨勪簡錛岀浠栦滑寮婧?/span>ERP澶у崠 |