MDA/MDD/TDD/DDD/DDDDDDD
posts - 536, comments - 111, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2008年11月4日

System.out.println("availableLocales :"+  Locale.getAvailableLocales().length);

Locale[] arr=Locale.getAvailableLocales();
Arrays.sort(arr, new Comparator<Locale>() {
@Override
public int compare(Locale o1, Locale o2) {
return o1.getLanguage().compareTo(o2.getLanguage());
}
});

for(Locale l:arr){
System.out.println("语言:"+ l.getLanguage()+" 名称:"+l.getDisplayLanguage()
+(StringUtils.isEmpty(l.getDisplayCountry())?"":(" 国家:"+ l.getDisplayCountry())) + " "+l.toString());
}
输出如下
availableLocales :160
语言: 名称:
语言:ar 名称:阿拉伯文 国家:阿拉伯联合酋长国 ar_AE
语言:ar 名称:阿拉伯文 国家:约旦 ar_JO
语言:ar 名称:阿拉伯文 国家:叙利亚 ar_SY
语言:ar 名称:阿拉伯文 国家:巴林 ar_BH
语言:ar 名称:阿拉伯文 国家:沙特阿拉伯 ar_SA
语言:ar 名称:阿拉伯文 国家:也门 ar_YE
语言:ar 名称:阿拉伯文 国家:埃及 ar_EG
语言:ar 名称:阿拉伯文 国家:苏丹 ar_SD
语言:ar 名称:阿拉伯文 国家:突尼斯 ar_TN
语言:ar 名称:阿拉伯文 国家:伊拉克 ar_IQ
语言:ar 名称:阿拉伯文 国家:摩洛哥 ar_MA
语言:ar 名称:阿拉伯文 国家:卡塔尔 ar_QA
语言:ar 名称:阿拉伯文 国家:阿曼 ar_OM
语言:ar 名称:阿拉伯文 ar
语言:ar 名称:阿拉伯文 国家:科威特 ar_KW
语言:ar 名称:阿拉伯文 国家:利比亚 ar_LY
语言:ar 名称:阿拉伯文 国家:阿尔及利亚 ar_DZ
语言:ar 名称:阿拉伯文 国家:黎巴嫩 ar_LB
语言:be 名称:白俄罗斯文 be
语言:be 名称:白俄罗斯文 国家:白俄罗斯 be_BY
语言:bg 名称:保加利亚文 bg
语言:bg 名称:保加利亚文 国家:保加利亚 bg_BG
语言:ca 名称:加泰罗尼亚文 国家:西班牙 ca_ES
语言:ca 名称:加泰罗尼亚文 ca
语言:cs 名称:捷克文 cs
语言:cs 名称:捷克文 国家:捷克共和国 cs_CZ
语言:da 名称:丹麦文 国家:丹麦 da_DK
语言:da 名称:丹麦文 da
语言:de 名称:德文 de
语言:de 名称:德文 国家:瑞士 de_CH
语言:de 名称:德文 国家:奥地利 de_AT
语言:de 名称:德文 国家:卢森堡 de_LU
语言:de 名称:德文 国家:德国 de_DE
语言:de 名称:德文 国家:希腊 de_GR
语言:el 名称:希腊文 el
语言:el 名称:希腊文 国家:塞浦路斯 el_CY
语言:el 名称:希腊文 国家:希腊 el_GR
语言:en 名称:英文 国家:美国 en_US
语言:en 名称:英文 国家:新加坡 en_SG
语言:en 名称:英文 国家:马耳他 en_MT
语言:en 名称:英文 en
语言:en 名称:英文 国家:菲律宾 en_PH
语言:en 名称:英文 国家:新西兰 en_NZ
语言:en 名称:英文 国家:南非 en_ZA
语言:en 名称:英文 国家:澳大利亚 en_AU
语言:en 名称:英文 国家:爱尔兰 en_IE
语言:en 名称:英文 国家:加拿大 en_CA
语言:en 名称:英文 国家:印度 en_IN
语言:en 名称:英文 国家:英国 en_GB
语言:es 名称:西班牙文 国家:巴拿马 es_PA
语言:es 名称:西班牙文 国家:委内瑞拉 es_VE
语言:es 名称:西班牙文 国家:波多黎哥 es_PR
语言:es 名称:西班牙文 国家:玻利维亚 es_BO
语言:es 名称:西班牙文 国家:阿根廷 es_AR
语言:es 名称:西班牙文 国家:萨尔瓦多 es_SV
语言:es 名称:西班牙文 es
语言:es 名称:西班牙文 国家:西班牙 es_ES
语言:es 名称:西班牙文 国家:哥伦比亚 es_CO
语言:es 名称:西班牙文 国家:巴拉圭 es_PY
语言:es 名称:西班牙文 国家:厄瓜多尔 es_EC
语言:es 名称:西班牙文 国家:美国 es_US
语言:es 名称:西班牙文 国家:危地马拉 es_GT
语言:es 名称:西班牙文 国家:墨西哥 es_MX
语言:es 名称:西班牙文 国家:洪都拉斯 es_HN
语言:es 名称:西班牙文 国家:智利 es_CL
语言:es 名称:西班牙文 国家:多米尼加共和国 es_DO
语言:es 名称:西班牙文 国家:古巴 es_CU
语言:es 名称:西班牙文 国家:乌拉圭 es_UY
语言:es 名称:西班牙文 国家:哥斯达黎加 es_CR
语言:es 名称:西班牙文 国家:尼加拉瓜 es_NI
语言:es 名称:西班牙文 国家:秘鲁 es_PE
语言:et 名称:爱沙尼亚文 et
语言:et 名称:爱沙尼亚文 国家:爱沙尼亚 et_EE
语言:fi 名称:芬兰文 国家:芬兰 fi_FI
语言:fi 名称:芬兰文 fi
语言:fr 名称:法文 国家:比利时 fr_BE
语言:fr 名称:法文 国家:瑞士 fr_CH
语言:fr 名称:法文 fr
语言:fr 名称:法文 国家:卢森堡 fr_LU
语言:fr 名称:法文 国家:法国 fr_FR
语言:fr 名称:法文 国家:加拿大 fr_CA
语言:ga 名称:爱尔兰文 ga
语言:ga 名称:爱尔兰文 国家:爱尔兰 ga_IE
语言:hi 名称:印地文 国家:印度 hi_IN
语言:hi 名称:印地文 hi
语言:hr 名称:克罗地亚文 国家:克罗地亚 hr_HR
语言:hr 名称:克罗地亚文 hr
语言:hu 名称:匈牙利文 hu
语言:hu 名称:匈牙利文 国家:匈牙利 hu_HU
语言:in 名称:印度尼西亚文 in
语言:in 名称:印度尼西亚文 国家:印度尼西亚 in_ID
语言:is 名称:冰岛文 国家:冰岛 is_IS
语言:is 名称:冰岛文 is
语言:it 名称:意大利文 it
语言:it 名称:意大利文 国家:瑞士 it_CH
语言:it 名称:意大利文 国家:意大利 it_IT
语言:iw 名称:希伯来文 国家:以色列 iw_IL
语言:iw 名称:希伯来文 iw
语言:ja 名称:日文 国家:日本 ja_JP_JP_#u-ca-japanese
语言:ja 名称:日文 ja
语言:ja 名称:日文 国家:日本 ja_JP
语言:ko 名称:朝鲜文 ko
语言:ko 名称:朝鲜文 国家:韩国 ko_KR
语言:lt 名称:立陶宛文 lt
语言:lt 名称:立陶宛文 国家:立陶宛 lt_LT
语言:lv 名称:拉托维亚文(列托) lv
语言:lv 名称:拉托维亚文(列托) 国家:拉脱维亚 lv_LV
语言:mk 名称:马其顿文 mk
语言:mk 名称:马其顿文 国家:马其顿王国 mk_MK
语言:ms 名称:马来文 国家:马来西亚 ms_MY
语言:ms 名称:马来文 ms
语言:mt 名称:马耳他文 国家:马耳他 mt_MT
语言:mt 名称:马耳他文 mt
语言:nl 名称:荷兰文 nl
语言:nl 名称:荷兰文 国家:荷兰 nl_NL
语言:nl 名称:荷兰文 国家:比利时 nl_BE
语言:no 名称:挪威文 国家:挪威 no_NO_NY
语言:no 名称:挪威文 国家:挪威 no_NO
语言:no 名称:挪威文 no
语言:pl 名称:波兰文 国家:波兰 pl_PL
语言:pl 名称:波兰文 pl
语言:pt 名称:葡萄牙文 pt
语言:pt 名称:葡萄牙文 国家:巴西 pt_BR
语言:pt 名称:葡萄牙文 国家:葡萄牙 pt_PT
语言:ro 名称:罗马尼亚文 国家:罗马尼亚 ro_RO
语言:ro 名称:罗马尼亚文 ro
语言:ru 名称:俄文 国家:俄罗斯 ru_RU
语言:ru 名称:俄文 ru
语言:sk 名称:斯洛伐克文 sk
语言:sk 名称:斯洛伐克文 国家:斯洛伐克 sk_SK
语言:sl 名称:斯洛文尼亚文 sl
语言:sl 名称:斯洛文尼亚文 国家:斯洛文尼亚 sl_SI
语言:sq 名称:阿尔巴尼亚文 sq
语言:sq 名称:阿尔巴尼亚文 国家:阿尔巴尼亚 sq_AL
语言:sr 名称:塞尔维亚文 国家:黑山 sr_ME
语言:sr 名称:塞尔维亚文 国家:波斯尼亚和黑山共和国 sr_BA_#Latn
语言:sr 名称:塞尔维亚文 国家:塞尔维亚及黑山 sr_CS
语言:sr 名称:塞尔维亚文 国家:波斯尼亚和黑山共和国 sr_BA
语言:sr 名称:塞尔维亚文 国家:黑山 sr_ME_#Latn
语言:sr 名称:塞尔维亚文 sr__#Latn
语言:sr 名称:塞尔维亚文 国家:塞尔维亚 sr_RS
语言:sr 名称:塞尔维亚文 sr
语言:sr 名称:塞尔维亚文 国家:塞尔维亚 sr_RS_#Latn
语言:sv 名称:瑞典文 国家:瑞典 sv_SE
语言:sv 名称:瑞典文 sv
语言:th 名称:泰文 国家:泰国 th_TH
语言:th 名称:泰文 th
语言:th 名称:泰文 国家:泰国 th_TH_TH_#u-nu-thai
语言:tr 名称:土耳其文 tr
语言:tr 名称:土耳其文 国家:土耳其 tr_TR
语言:uk 名称:乌克兰文 uk
语言:uk 名称:乌克兰文 国家:乌克兰 uk_UA
语言:vi 名称:越南文 国家:越南 vi_VN
语言:vi 名称:越南文 vi
语言:zh 名称:中文 国家:台湾地区 zh_TW
语言:zh 名称:中文 国家:香港 zh_HK
语言:zh 名称:中文 国家:新加坡 zh_SG
语言:zh 名称:中文 国家:中国 zh_CN
语言:zh 名称:中文 zh

posted @ 2017-09-27 20:17 leekiang 阅读(850) | 评论 (0)编辑 收藏


repositories{
mavenCentral()
}
dependencies {
compile ('com.google.android.gms:play-services-maps:10.0.1')
}
按以上配置,运行clean时报错,无法加载play-services-maps 10.0.1包。
Error:(69, 14) Failed to resolve: com.google.android.gms:play-services-maps:10.0.1
<a href="install.m2.repo">Install Repository and sync project</a><br><a href="openFile:/Users/you/AndroidProjects/yourapp/app/build.gradle">Show in File</a><br><a href="open.dependency.in.project.structure">Show in Project Structure dialog</a>
点击Android Studio的提示如何修复的链接,就会自动下载Google的相关依赖包到本地。下载时弹出窗口中显示的一些信息如下。

Install Missing Componets
SDK Path:/User/you/Library/Android/sdk

To install:
- SDK Patch Applier v4 (patcher;v4)
- Google Repository (extras;google;m2repository)

Installing SDK Patch Applier v4
Downloading https://dl.google.com/android/repository/3534162-studio.sdk-patcher.zip
Installing SDK Patch Applier v4 in /Users/you/Library/Android/sdk/patcher/v4
Installation of SDK Patch Applier v4 complete.

Installing Google Repository
Downloading https://dl.google.com/android/repository/google_m2repository_gms_v8_rc42_wear_2b1_rc4.zip
Installing Google Repository in /Users/you/Library/Android/sdk/extras/google/m2repository
Installation of Google Repository complete.


http://stackoverflow.com/questions/16978190/add-google-maps-api-v2-in-a-fragment
http://www.joellipman.com/articles/google/android/application-development/android-os-add-googlemap-as-fragment.html
https://www.zhihu.com/question/20892245
http://blog.csdn.net/woshilisao/article/details/8647649 android fragment(android.support.v4.app.Fragment和android.app.Fragment区别)
http://www.tuicool.com/articles/YFBv6nJ Introduction to Google Maps API for Android

posted @ 2016-12-21 00:24 leekiang 阅读(1189) | 评论 (0)编辑 收藏


https://github.com/lzyzsd/JsBridge  
注意:使用lzyzsd/JsBridge  ,覆盖WebViewClient时一定要继承BridgeWebViewClient,否则js和java互相调用不管用
webview.setWebViewClient(new BridgeWebViewClient(webview) 

另外还有一个WebViewJavascriptBridge:https://github.com/gzsll/WebViewJavascriptBridge

http://www.cnblogs.com/wingyip/p/5426477.html JsBridge实现Javascript和Java的互相调用
http://blog.csdn.net/sk719887916/article/details/47189607 
 Android 利用WebViewJavascriptBridge 实现js和java的交互
http://www.jb51.net/article/37208.htm Android在其他线程中更新UI线程的解决方法

posted @ 2016-11-24 16:19 leekiang 阅读(347) | 评论 (0)编辑 收藏

向下一个Activity传递数据(使用Bundle和Intent.putExtras)
Intent it = new Intent(Activity.Main.this, Activity2.class);
Bundle bundle=new Bundle();
bundle.putString("name", "This is from MainActivity!");
it.putExtras(bundle);       // it.putExtra("name","abc");
startActivity(it);            // startActivityForResult(it,REQUEST_CODE);
 
对于数据的获取可以采用:
Bundle bundle=getIntent().getExtras();
String name=bundle.getString("name");

参考:
http://www.cnblogs.com/feisky/archive/2010/01/16/1649081.html
http://www.cnblogs.com/tornadomeet/archive/2012/07/28/2613617.html 从一个activity跳转到另外一个activity

posted @ 2016-10-26 00:54 leekiang 阅读(243) | 评论 (0)编辑 收藏

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
minifyEnabled改为true。
ProGuard是Android SDK附带的。如果需要顶尖的安全性,ProGuard就力不从心了,可以使用DexGuard。

参考:
读懂 Android 中的代码混淆 http://droidyue.com/blog/2016/07/10/understanding-android-obfuscated-code-by-proguard/

posted @ 2016-10-25 23:41 leekiang 阅读(364) | 评论 (0)编辑 收藏

requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
增加代码requestWindowFeature(Window.FEATURE_NO_TITLE)以去掉标题栏,并且代码放在setContentView之前,但还是报异常
android.util.AndroidRuntimeException: requestFeature() must be called before adding content
AppCompatActivity改为Activity才得以解决。不知道AppCompatActivity和Activity有何区别。

参考:http://www.cnblogs.com/and_he/archive/2011/06/01/2067106.html Android中全屏或者取消标题栏

posted @ 2016-10-25 22:38 leekiang 阅读(520) | 评论 (0)编辑 收藏

 首先在“设置”-“关于手机”里多次点击【MIUI版本】进入开发者模式,但在Android Studio里运行时找不到设备,执行adb devices也看不到设备。
在拨号界面按  *#*#717717#*#*  , 出现 Diag USB port enable。 再次执行adb devices,看到设备了,但显示为unauthorized。
最后发现,设置-其他高级设置-开发者选项,开启“开发者选项”,同时开启“USB调试”,再次执行adb devices,终于成功的显示设备了。
 

posted @ 2016-10-24 11:45 leekiang 阅读(451) | 评论 (0)编辑 收藏

1.public boolean shouldOverrideUrlLoading(WebView view, String url) { 
       view.loadUrl(url);
       return true;
  }
重写shouldOverrideUrlLoading方法,返回true表示点击链接是在当前webview里打开,而不是调用浏览器打开


WebViewClient与WebChromeClient的区别 http://blog.csdn.net/jackyhuangch/article/details/8310033
Android中WebView拦截替换网络请求数据http://droidyue.com/blog/2014/11/23/block-web-resource-in-webview/
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/1010/1569.html android WebView全面总结
自定义可下拉刷新的WebView http://www.voidcn.com/blog/Moy01/article/p-4587219.html
android webview远程调试http://www.cnblogs.com/carlos-guo/p/3920915.html
http://www.udpwork.com/item/13349.html  WebView处理网页位置请求
http://www.cnblogs.com/over140/archive/2013/03/07/2947721.html 带进度条的webview
http://blog.csdn.net/u014400200/article/details/38511419 webview处理视频
http://blog.csdn.net/jackyhuangch/article/details/8310033 关于android WebViewClient和WebChromeClient
http://www.weblog-life.net/entry/2016/03/12/080300 webview如何使用google地图,日本人写的
http://stackoverflow.com/questions/5329662/android-webview-geolocation  
https://github.com/delight-im/Android-AdvancedWebView 这个支持地理定位

posted @ 2016-10-21 21:43 leekiang 阅读(331) | 评论 (0)编辑 收藏

1. Android Studio2.2在mac下启动报错
找不到原因,改为使用Android Studio 2.1.3
下载地址:http://tools.android.com/download/studio/builds/2-1-3

2. 编译某项目报错Could not find property 'config' on SigningConfig container
在build.grade文件的android->signingConfigs节点下增加config配置
android {
    signingConfigs {
        config {
            keyAlias '你的key别名'
            keyPassword '你的key密码'
            storeFile file('你的密钥存储路径')
            storePassword '你的存储密码'
        }
    }
...

3. 编译报错failed to find target android-22
/Users/username/Library/Android/sdk/platforms下发现有android-24目录,故将编译级别都设为24。
修改build.grade文件的相关属性:
compileSdkVersion 24
buildToolsVersion "24.0.0"
targetSdkVersion 24
compile 'com.android.support:appcompat-v7:24.0.0'

4. 编译报错Gradle sync failed: Gradle DSL method not found: 'android()'
删除项目根目录下的build.gradle文件,因为app目录下已经有build.gradle了。
备份下根目录下build.gradle文件的内容:
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
allprojects {
    repositories {
        jcenter()
    }
}
android {
    compileSdkVersion 24
}
dependencies {
}

5. 编译报错Plugin with id 'com.android.application' not found
恢复项目根目录下的build.gradle文件,将内容修改为如下:
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
    }
}

6. 编译报错:failed to find Build Tools revision 24.0.0
/Users/username/Library/Android/sdk/build-tools下查看自己的BuildTools版本,发现是24.0.3,然后将buildToolsVersion修改为该版本:
buildToolsVersion "24.0.3"

7. Android Studio编译执行以下任务时一直等待,执行了一个小时也没动静。
Executing tasks: [:app:generateDebugSources, :app:generateDebugAndroidTestSources, :app:prepareDebugUnitTestDependencies, :app:mockableAndroidJar]
打开Preferences->Build-Excecution-Deployment->BuildTools->Gra‌​dle,勾选Offline work
参见http://stackoverflow.com/questions/25629368/how-to-fix-android-studio-getting-stuck-executing-gradle-tasks

8. Exception in thread "png-cruncher_5" java.lang.RuntimeException: Timed out while waiting for slave aapt process
不知道原因,最终是通过修改SDK Build Tools为19.1.0、升级JDK由JDK7升至JDK8、增加环境变量SLAVE_AAPT_TIMEOUT=30等搞定的

9. 如何修改SDK和JDK的路径
在File->Project Structure里修改

10. 修改Android Studio中java代码的编译级别
打开File --> Project Structure-->app,修改Source Compatibility和Target Compatibility

11.如何在使用gradle时增加--stacktrace参数
Preferences->Build-Excecution-Deployment->Compiler
增加--info或--debug,在解决报错时能看到更多的信息

12. 报错aapt ..finished with non- zero exit value 1
找不到原因,增加编译参数--info后发现有用的信息:invalid resource directory name: ..app\build\intermediates\res\merged\debug/values-b+sr+Latn

13.invalid resource directory name: ..app\build\intermediates\res\merged\debug/values-b+sr+Latn
不知道原因,将版本升级到21解决了。

14. 编译时报找不到AppCompatActivity类的错误
改为使用:compile 'com.android.support:appcompat-v7:22.2.1'
同时将版本由21升级到22

15. 生成apk时报错:Missing Gradle Project Information. Please check if the IDE successfully synchronized its state with the Gradle Project Model
在工具栏里点击“Sync Project with Gradle Files”按钮

16.导入某项目时报错Error:Gradle version 2.14.1 is required. Current version is 2.4. If using the gradle wrapper, try editing the distributionUrl in...
打开Android Studio的File->Project Structure,点击Project,将Gradle version修改为2.14.1
在/Applications/Android Studio.app/Contents/gradle下的确只有gradle-2.14.1

25.如何修改生成的apk的名字
http://www.jianshu.com/p/93051c9e97fb
Android Studio如何发布APK:http://chenfeicqq.iteye.com/blog/1889160

26. 在gradle.properties中增加android.enableBuildCache=true,貌似能加快编译速度。

posted @ 2016-10-13 21:25 leekiang 阅读(3798) | 评论 (0)编辑 收藏

参考dubbo里的NetUtils类

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;
import java.util.regex.Pattern;

public class GetIP {
public static void main(String[] args) {
System.out.println(GetIP.getLocalAddress0().getHostAddress());
}
public static InetAddress getLocalAddress0() {
        InetAddress localAddress = null;
        try {
            localAddress = InetAddress.getLocalHost();
            if (isValidAddress(localAddress)) {
                return localAddress;
            }
        } catch (Throwable e) {
            System.out.println("Failed to retriving ip address, " + e.getMessage());
        }
        try {
            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
            if (interfaces != null) {
                while (interfaces.hasMoreElements()) {
                    try {
                        NetworkInterface network = interfaces.nextElement();
                        Enumeration<InetAddress> addresses = network.getInetAddresses();
                        if (addresses != null) {
                            while (addresses.hasMoreElements()) {
                                try {
                                    InetAddress address = addresses.nextElement();
                                    if (isValidAddress(address)) {
                                        return address;
                                    }
                                } catch (Throwable e) {
                                    System.out.println("Failed to retriving ip address, " + e.getMessage());
                                }
                            }
                        }
                    } catch (Throwable e) {
                        System.out.println("Failed to retriving ip address, " + e.getMessage());
                    }
                }
            }
        } catch (Throwable e) {
            System.out.println("Failed to retriving ip address, " + e.getMessage());
        }
        System.out.println("Could not get local host ip address, will use 127.0.0.1 instead.");
        return localAddress;
    }
    private static boolean isValidAddress(InetAddress address) {
        if (address == null || address.isLoopbackAddress())
            return false;
        String name = address.getHostAddress();
        return (name != null
                && ! ANYHOST.equals(name)
                && ! LOCALHOST.equals(name)
                && IP_PATTERN.matcher(name).matches());
    }
    
    public static final String LOCALHOST = "127.0.0.1";

    public static final String ANYHOST = "0.0.0.0";
    
    private static final Pattern IP_PATTERN = Pattern.compile("\\d{1,3}(\\.\\d{1,3}){3,5}$");
}

posted @ 2015-03-02 06:29 leekiang 阅读(628) | 评论 (0)编辑 收藏

CountDownLatch : 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行。   
CyclicBarrier  : N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。
这样应该就清楚一点了,对于CountDownLatch来说,重点是那个“一个线程”, 是它在等待, 而另外那N的线程在把“某个事情”做完之后可以继续等待,可以终止。而对于CyclicBarrier来说,重点是那N个线程,他们之间任何一个没有完成,所有的线程都必须等待。

CyclicBarrier 在释放等待线程后可以重用,所以称它为循环的 barrier。它 还支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作很有用。



public class Test {
    public static void main(String[] args) {
        new Test().test1();
    }
    
    public void test1() {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(4, new Runnable() {
            @Override
            public void run() {
                System.out.println("所有玩家进入第二关!");
            }
        });

        for (int i = 0; i < 4; i++) {
            new Thread(new Player(i, cyclicBarrier)).start();
        }
    }

    class Player implements Runnable {
        private CyclicBarrier cyclicBarrier;
        private int id;

        public Player(int id, CyclicBarrier cyclicBarrier) {
            this.cyclicBarrier = cyclicBarrier;
            this.id = id;
        }

        @Override
        public void run() {
            try {
                System.out.println("玩家" + id + "正在玩第一关...");
                cyclicBarrier.await();
                System.out.println("玩家" + id + "进入第二关...");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
    }
}

posted @ 2015-03-02 06:28 leekiang 阅读(464) | 评论 (0)编辑 收藏

Runtime run = Runtime.getRuntime();
String str[] = { "/bin/sh", "-c", "echo '1' >> test.log" };
try {
    run.exec(str);
} catch (IOException e) {
}


使用Jsch执行Shell脚本 [http://blog.csdn.net/basecn/article/details/6080741]
纯Java通过SSH执行Linux命令的方法及代码 [http://ilexes.blog.51cto.com/705330/531352]
Java调用 Shell的ftp命令 [http://blog.sina.com.cn/s/blog_59ca2c2a0100e9vn.html]

posted @ 2015-03-01 00:29 leekiang 阅读(300) | 评论 (0)编辑 收藏


1. java.lang.OutOfMemoryError: GC overhead limit exceeded原因
   <http://blog.csdn.net/taijianyu/article/details/6606792>
   <http://www.sunnybtoc.com/page/M0/S746/746195.html>
   
2. 用jhat分析·jmap -dump:format=b,file=mem.dat PID·命令导出来的文件时报错
   java.io.IOException: Unrecognized magic number
   <https://forums.oracle.com/forums/thread.jspa?threadID=1542284> 没找到原因
   
3. 命令
   1. jmap
 jmap -dump:live,format=b,file=heap.dmp PID 把本机的java内存映像导出到heap.dmp中
 jmap pid #打印内存使用的摘要信息
      jmap –heap pid #java heap信息
      jmap -histo:live pid #统计对象count ,live表示在使用
      jmap -histo pid >mem.txt #打印比较简单的各个有多少个对象占了多少内存的信息,一般重定向的文件
      jmap -dump:format=b,file=mem.dat PID #将内存使用的详细情况输出到mem.dat 文件
   2. jhat 用来分析jmap导出的文件
      用jhat命令可以参看 jhat -port 7000 mem.dat
      然后使用:http://127.0.0.1:7000/ 查看类相关信息
   3. jstat
      jstat -gcutil  PID
      例子:

    S0      S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
    11.63   0.00   56.46  66.92  98.49 162    0.248    6      0.331    0.579

    S0  — Heap上的 Survivor space 0 区已使用空间的百分比
    S1  — Heap上的 Survivor space 1 区已使用空间的百分比
    E   — Heap上的 Eden space 区已使用空间的百分比
    O   — Heap上的 Old space 区已使用空间的百分比
    P   — Perm space 区已使用空间的百分比
    YGC — 从应用程序启动到采样时发生 Young GC 的次数
    YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
    FGC — 从应用程序启动到采样时发生 Full GC 的次数
    FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
    GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)


###参考
1. [JMAP、jstat命令详解](http://bbs.chinaunix.net/thread-3644198-1-1.html)
2. [J2SE6中使用jhat来分析内存堆](http://hi.baidu.com/tister/item/9444a3125796cf433a176eb9)


###jvm的内存回收过程是这样的
对象在Eden Space创建,当Eden Space满了的时候,gc就把所有在Eden Space中的对象扫描一次,
把所有有效的对象复制到第一个Survivor Space,同时把无效的对象所占用的空间释放。
当Eden Space再次变满了的时候,就启动移动程序把Eden Space中有效的对象复制到第二个Survivor Space,
同时,也将第一个Survivor Space中的有效对象复制到第二个Survivor Space。如果填充到第二个Survivor Space
中的有效对象被第一个Survivor Space或Eden Space中的对象引用,那么这些对象就是长期存在的,
此时这些对象将被复制到Permanent Generation。

posted @ 2015-02-17 06:51 leekiang 阅读(748) | 评论 (0)编辑 收藏

JavaMelody 能够在QA和实际运行生产环境监测Java或Java EE应用程序服务器。并以图表的形式显示:Java内存和Java CPU使用情况,用户Session数量,JDBC连接数,和http请求、sql请求、jsp页面与业务接口方法(EJB3、Spring、Guice)的执行数量,平均执行时间,错误百分比等。图表可以按天,周,月,年或自定义时间段查看。

jwebap 监控org.apache.commons.dbcp.BasicDataSource时不知效果如何
JAMon

hyperic hq
probe   http://www.lambdaprobe.org/downloads/1.7/probe.1.7b.zip

项目自动化之道—如何建构、部署、监控JAVA应用.pdf


http://chain.blog.163.com/blog/static/140848523201171623521235/  java使用java.lang.management监视和管理Java虚拟机

String processName = java.lang.management.ManagementFactory
.getRuntimeMXBean().getName();
System.out.println(processName.split("@")[0]);//进程ID

http://chain.blog.163.com/blog/static/1408485232011716111013282/ java通过调用命令获取linux CPU、内存、磁盘信息

posted @ 2015-02-17 06:35 leekiang 阅读(499) | 评论 (0)编辑 收藏

如果报Error: no `server' JVM at `C:\Program Files\Java\jre6\bin\server\jvm.dll的错误,可把jdk下的jre\bin\server下的server文件夹复制到C:\Program Files\Java\jre6\bin目录即可解决。 根本原因可看[JVM的版本问题](http://www.cnblogs.com/newskysoft/archive/2010/04/23/1718720.html)

posted @ 2013-02-17 18:19 leekiang 阅读(2404) | 评论 (0)编辑 收藏

在notepad++里查看二进制有三种办法:“插件”菜单里有个Converter,TextFX插件也有Convert功能,甚至还有一个在新版本好像已经被废弃的Hex Editor插件,但这些都不好用。
[HxD](
http://mh-nexus.de/en/hxd/)是一个免费的二进制编辑软件,但中文支持不好。
MadEdit是一款跨平台的编辑器,用其进行二进制编辑的体验相当好,不管是GBK还是UTF-8的中文都能正常显示,选中某个中文其对应的字节会高亮显示。不知道在mac下效果如何。


posted @ 2013-01-05 17:18 leekiang 阅读(1548) | 评论 (0)编辑 收藏

最近Web服务访问量过大,由于服务器配置比较差,数量也较少,导致服务响应过慢。为了优化服务和提高响应,下面总结出几条查询Resin问题的方法。

1、查看服务器网络状态TIME_WAIT的数量。

#netstat -antp|grep -i time_wait|wc -l查看TIME_WAIT数量,如果数量过多,并且Resin前端还有Nginx或者Apache,那么请把socket-timeout、keepalive-max和把keepalive-timeout调小

      <socket-timeout>30s</socket-timeout>
      <keepalive-max>512</keepalive-max>
      <keepalive-timeout>60s</keepalive-timeout>

2、查看JVM中对象占用内存情况

jmap 能查看jvm内存中,对象占用内存的情况,还提供非常方便的命令将jvm的内存信息导出的文件。

#jmap -dump:format=b,file=heap.bin <pid> 

命令jhat 能够解析 java内存堆的文件,生成相关信息,并启动webServer提供查询。 也就说,我们可以通过浏览器来看这些内存信息。jhat还提供了一个类sql的查询语言---OQL来给我们使用。

#jhat -J-Xmx512m heap.bin    

就可以将我们刚刚使用jmap导出的内存信息交给jhat解析了。默认的情况下,它会监听7000端口。我在本机的地址就是,http://localhost:7000/。
访问http://localhost:7000/histo/,大致可以看到一下的画面,这里列出对象,对象实例数量、总占用内存大小。点击进去之后可以看到“谁引用了这个对象,这个对象又引用了哪个”这些信息。不过因为展示的信息非常多,并没有想象中那样清晰可见。

3、dump获取java stack和native stack信息

消息队列会突然堵塞,查看消费者日志,发现处理延时明显延长,而此时网络无丢包。最后多方排查,是java消费者运行出现死锁。
这种问题可以通过jstack来dump获取java stack和native stack信息查明问题。

#jstatck <pid>


posted @ 2012-07-13 15:48 leekiang 阅读(972) | 评论 (0)编辑 收藏

slideViewer:http://www.gcmingati.net/wordpress/wp-content/lab/jquery/imagestrip/imageslide-plugin.html
slideViewerPro:Prohttp://www.gcmingati.net/wordpress/wp-content/lab/jquery/svwt/index.html

slideViewerPro使用配置说明 http://www.oschina.net/p/slideviewerpro


Can I make the Jquery slideViewer autoplay?
<scripttype="text/javascript">
var theLinks;
var nCount =0;
var theTimerID;

function init(){
    $
("div#mygalone").slideView();
    theLinks
= jQuery('#stripTransmitter0 a');

       
//for kill interval purposes
    theTimerID
= setInterval("autoSlide()",5000);
}
function autoSlide(){
    jQuery
.each(theLinks,function(i){
       
if(jQuery(this).hasClass('current')){
            jQuery
(theLinks[((i+1< theLinks.length)?(i+1):0)]).trigger("click");
           
returnfalse;
       
}
   
});
}

$
(window).bind("load", init );
</script>

The way I see it you basically have 3 options here:

(1) - Use slideViewPro, but disable thumbnails using the thumbsVis:false option as shown below

$("div#noui").slideViewerPro({
    galBorderWidth
:0,
    autoslide
:true,  
    thumbsVis
:false,
    shuffle
:true
 
});

(2) - Switch to using the jQuery cycle plug-in instead

(3) - Edit the source code of original slideViewer and add your own autoslide implementation by using timers and firing the click event on the navigation.



posted @ 2012-03-11 03:00 leekiang 阅读(957) | 评论 (0)编辑 收藏

转自 一个BUG的快速解决方法.希望能给大家的一些启示
朋友打来电话,他们公司新装了TOMCAT5,然后在编译JSP时,被INCLUDE的JSP都出现了问题.就是编译后被INCLUDE的地方多了两个"??"而其它正常,而如果手工把被INCLUDE的内容COPY上去测没有问题.
他们的工程师都不知道是什么问题,因为周一要发布出去,所以非常着急.

我不知道大家听到这种情况会如何,我知道大多数人比我聪明,你肯定想到了,所以你没有必要再看了.我下面的内容只是对没有想到的人而言.

其实他电话还没打完 ,我就知道问题99%是他的jsp在编辑的时候是存为UTF-8而不是ANSI格式,否则没有道理出现这种问题,事实正是如此,我让他用UE打开看看果然前面多了几个UTF字符.

重要的是TOMCAT这种容器竟然有这样的BUG,不能正确读取UTF-8格式的文件,你总不能强求用户编辑JSP文件时一定要存为什么格式吧?
费话少说,下载tomcat5的src,进入jakarta-tomcat-jasper\jasper2\src\share\org\apache\jasper\compiler,找到JspUtil.java,找到
public static InputStream getInputStream(String fname, JarFile jarFile,
JspCompilationContext ctxt,
ErrorDispatcher err)
throws JasperException, IOException {

InputStream in = null;

if (jarFile != null) {
String jarEntryName = fname.substring(1, fname.length());
ZipEntry jarEntry = jarFile.getEntry(jarEntryName);
if (jarEntry == null) {
err.jspError("jsp.error.file.not.found", fname);
}
in = jarFile.getInputStream(jarEntry);
} else {
in = ctxt.getResourceAsStream(fname);
}

if (in == null) {
err.jspError("jsp.error.file.not.found", fname);
}
return in;
}

在return in前加上判断,改成:
public static InputStream getInputStream(String fname, JarFile jarFile,
JspCompilationContext ctxt,
ErrorDispatcher err)
throws JasperException, IOException {

InputStream in = null;

if (jarFile != null) {
String jarEntryName = fname.substring(1, fname.length());
ZipEntry jarEntry = jarFile.getEntry(jarEntryName);
if (jarEntry == null) {
err.jspError("jsp.error.file.not.found", fname);
}
in = jarFile.getInputStream(jarEntry);
} else {
in = ctxt.getResourceAsStream(fname);
}

if (in == null) {
err.jspError("jsp.error.file.not.found", fname);
}
PushbackInputStream testin = new PushbackInputStream(in);
int ch = testin.read();
if (ch != 0xef) {
testin.unread(ch);
}
else if ((ch = testin.read()) != 0xbb) {
testin.unread(ch);
testin.unread(0xef);
}
else if ((ch = testin.read()) != 0xbf) {
throw new IOException("错误的UTF-8格式文件");
}
else{
//fStream.setEncoding("UTF-8");
testin.read();
}
return testin;
}

编译,重新打包,替换原来的包,运行TOMCAT,OK!

整个问题解决除了远程登录他的服务器传送文件的时间,总共只有4-5分钟.其实只要问题定位准确,就不难解决了.我一再强调的是经熟悉底层,你如果知道内 存中每个byte从哪儿来要到哪儿去,就可以非常容易地解决问题.在此之前我连TOMCAT5下载都没有下过,更别说试用了.但只要你对JDK有深入的了 解,就可以准确地定位问题的所在.

希望本文能给不是高手的朋友一点帮助和启发,对于高手的朋友你可以弃之一笑.


UTF-8文件的Unicode签名BOM(Byte Order Mark)问题
utf-8编码include页面空格
Django下碰到EF BB BF问题
php utf-8编码include页面空格

posted @ 2012-03-03 23:26 leekiang 阅读(617) | 评论 (0)编辑 收藏

1,安装
yum install mysql-server,会同时安装mysql包。默认安装5.0版本。
卸载:yum remove mysql-server

2,配置
默认配置文件在/etc/my.cnf
默认datadir=/var/lib/mysql
默认socket=/var/lib/mysql/mysql.sock
mysqladmin、mysqldump等命令在/usr/bin
mysqld在/etc/init.d/mysqld

3,命令
启动 service mysqld start
停止
service mysqld stop
开机自启是用"chkconfig --levels 235 mysqld on"还是"chkconfig mysqld on"

如果启动报错,很可能是磁盘满了。
如果开启了selinux,可能会导致mysql启动不成功。另外要记得设置iptables的3306端口



Centos 安装Mysql
Solve: Can’t connect to local MySQL server through socket /tmp/mysql.sock
MYSQL: ERROR 2002 (HY000):Can't connect to local MySQL server

posted @ 2011-12-12 01:22 leekiang 阅读(466) | 评论 (0)编辑 收藏

高并发访问的核心原则其实就一句话“把所有的用户访问请求都尽量往前推”。

如果把来访用户比作来犯的"敌人",我们一定要把他们挡在800里地以外,即不能让他们的请求一下打到我们的指挥部(指挥部就是数据库及分布式存储)。

如:能缓存在用户电脑本地的,就不要让他去访问CDN。 能缓存CDN服务器上的,就不要让CDN去访问源(静态服务器)了。能访问静态服务器的,就不要去访问动态服务器。以此类推:能不访问数据库和存储就一定不要去访问数据库和存储。

    说起来很轻松,实际做起来却不容易,但只要稍加努力是可以做到的,Google的日独立IP过亿不也做到了么?我们这几千万的PV站比起Google不是 小屋见大屋了。我们还是先从我们的小屋搭起吧!哈哈!下面内容的介绍起点是千万级别的PV站,也可以支持亿级PV的网站架构。

高性能高并发高可扩展网站架构访问的几个层次:

有人会问,我们老是说把用户对业务的访问往前推,到底怎么推啊?推到哪呢?下面,老男孩就为大家一一道来。

第一层:首先在用户浏览器端,使用Apache的mod_deflate压缩传输,再比如:expires功能、deflate和expires功能利用的好,就会大大提升用户体验效果及减少网站带宽,减少后端服务器的压力。当然,方法还有很多,这里不一一细谈了。

提示:有关压缩传输及expires功能nginx/lighttpd等软件同样也有。

第二层:页面元素,如图片/js/css等或静态数据html,这个层面是网页缓存层,比如CDN(效果比公司自己部署squid/nginx要好,他们 更专业,价格低廉,比如快网/CC等(价格80元/M/月甚至更低)而且覆盖的城市节点更多),自己架设squid/nginx cache来做小型CDN是次选(超大规模的公司可能会考虑风险问题实行自建加购买服务结合),除非是为前端的CDN提供数据源服务,以减轻后端我们的服 务器数据及存储压力,而不是直接提供cache服务给最终用户。taobao的CDN曾经因为一部分图片的次寸大而导致CDN压力大的情况,甚至对图片尺 寸大的来改小,以达到降低流量及带宽的作用。

提示:我们也可以自己架设一层cache层,对我们购买的CDN提供数据源服务,可用的软件有varnish/nginx/squid 等cache,以减轻第三层静态数据层的压力。在这层的前端我们也可以架设DNS服务器,来达到跨机房业务拓展及智能解析的目的。

    第三层:静态服务器层一般为图片服务器,视频服务器,静态HTML服务器。这一层是前面缓存层和后面动态服务器层的连接纽带,大公司发布新闻等内容直接由 发布人员分发到各cache节点(sina,163等都是如此),这和一般公司的业务可能不一样。所以,没法直接的参考模仿,比如人人的SNS。

我们可以使用Q队列方式实现异步的分发访问,同时把动态发布数据(数据库中的数据)静态化存储。即放到本层访问,或通过其他办法发布到各cache节点, 而不是直接让所有用户去访问数据库,不知道大家发现了没有,qq.com门户的新闻评论多的有几十万条,如果所有用户一看新闻就加载所有评论,那数据库不 挂才怪。他们的评论需要审核(美其名约,实际是异步的方式,而且,评论可能都是静态化的或类似的静态化或内存cache的方式),这点可能就是需要 51cto.com这样站点学习的,你们打开51CTO的一篇博文,就会发现下面的评论一直都显示出来了,也可能是分页的。不过,应该都是直接读库的,一 旦访问量大,数据库压力大是必然。这里不是说51cto网站不好,所有的网站都是从类似的程序架构开始发展的。CU也可能是如此。

提示:我们可以在静态数据层的前端自己架设一层cache层,对我们购买的CDN提供数据源服务,可用的软件有varnish/nginx/squid 等cache。在这层的前端我们也可以架设DNS服务器,来达到跨机房业务拓展及智能解析的目的。

第四层:动态服务器层:php,java等,只有透过了前面3层后的访问请求才会到这个层,才可能会访问数据库及存储设备。经过前三层的访问过滤能到这层访问请求一般来说已非常少了,一般都是新发布的内容和新发布内容第一次浏览如;博文(包括微博等),BBS帖子。

特别提示:此层可以在程序上多做文章,比如向下访问cache层,memcache,memcachedb,tc,mysql,oracle,在程序级别 实现分布式访问,分布式读写分离,而程序级别分布式访问的每个db cache节点,又可以是一组业务或者一组业务拆分开来的多台服务器的负载均衡。这样的架构会为后面的数据库和存储层大大的减少压力,那么这里呢,相当于 指挥部的外层了。

第五层:数据库cache层,比如:memcache,memcachedb,tc等等。

根据不同的业务需求,选择适合具体业务的数据库。对于memcache、memcachedb ttserver及相关nosql数据库,可以在第四层通过程序来实现对本层实现分布式访问,每个分布式访问的节点都可能是一组负载均衡(数十台机器)。

第六层:数据库层,一般的不是超大站点都会用mysql主从结构,如:163,sina,kaixin都是如此,程序层做分布式数据库读写分离,一主(或 双主)多从的方式,访问大了,可以做级连的主从及环状的多主多从,然后,实现多组负载均衡,供前端的分布式程序调用,如果访问量在大,就需要拆业务了,比 如:我再给某企业做兼职时,发现类似的51cto的一个站点,把www服务,blog服务,bbs服务都放一个服务器上,然后做主从。这种情况,当业务访 问量大了,可以简单的把www,blog,bbs服务分别各用一组服务器拆分开,这种方式运维都会的没啥难度。当然访问量在大了,可以继续针对某一个服务 拆分如:www库拆分,每个库做一组负载均衡,还可以对库里的表拆分。需要高可用可以通过drbd等工具做成高可用方式。对于写大的,可以做主主或多主的 MYSQL REP方式,对于ORACLE来说,来几组oracle DG(1master多salve方式)就够了,11G的DG可以象mysql rep一样,支持读写分离了。当然可选的方案还有,mysql cluster 和oracle 的RAC,玩mysql cluster和oracle RAC要需要更好更多的硬件及部署后的大量维护成本,因此,要综合考虑,到这里访问量还很大,那就恭喜了,起码是几千万以上甚至上亿的PV了。

象百度等巨型公司除了会采用常规的mysql及oracle数据库库外,会在性能要求更高的领域,大量的使用nosql数据库,然后前端在加DNS,负载均衡,分布式的读写分离,最后依然是拆业务,拆库,。。。逐步细化,然后每个点又可以是一组或多组机器。

特别提示:数据库层的硬件好坏也会决定访问量的多少,尤其是要考虑磁盘IO的问题,大公司往往在性价比上做文章,比如核心业务采用硬件 netapp/emc及san光纤架构,对于资源数据存储,如图片视频,会采用sas或固态ssd盘,如果数据超大,可以采取热点分取分存的方法:如:最 常访问的10-20%使用ssd存储,中间的20-30%采用sas盘,最后的40-50%可以采用廉价的sata。

第七层:千万级PV的站如果设计的合理一些,1,2个NFS SERVER就足够了。我所维护(兼职)或经历过的上千万PV的用NFS及普通服务器做存储的还有大把,多一些磁盘,如SAS 15K*6的,或者用dell6850,搞几组 NFS存储,中小网站足够了。当然可以做成drbd+heartbeat+nfs+a/a的方式。

如果能达到本文设计要求的,中等规模网站,后端的数据库及存储压力会非常小了。 象门户网站级别,如sina等, 会采用硬件netapp/emc等等硬件存储设备或是san光纤同道,甚至在性价比上做文章,比如核心业务采用硬件netapp/emc及san光纤架 构,对于资源数据存储,如图片视频,会采用sas或固态ssd盘,如果数据超到,可以采取热点分取分存的方法:如:最常访问的10-20%使用ssd存 储,中间的20-30%采用sas盘,最后的40-50%可以采用廉价的sata。

象百度等巨型公司会采用hadoop等分布式的存储架构,前端在加上多层CACHE及多及的负载均衡,同样会根据业务进行拆分,比如爬虫层存储,索引层存储,服务层存储。。。可以更细更细。。。为了应付压力,什么手段都用上了。

    特殊业务,如人人,开心网,包括门户网站的评论,微博,大多都是异步的写入方式,即无论读写,并发访问数据库都是非常少量的。

    以上1-7层,如果都搭好了,这样漏网到第四层动态服务器层的访问,就不多了。一般的中等站点,绝对不会对数据库造成太大的压力。程序层的分布式访问是从千万及PV向亿级PV的发展,当然特殊的业务 还需要特殊架构,来合理利用数据库和存储。

转自:http://bbs.chinaunix.net/thread-3626937-1-1.html

posted @ 2011-12-11 21:43 leekiang 阅读(1750) | 评论 (0)编辑 收藏

下载gparted的iso文件,修改CentOS虚拟机为从光盘启动,并且选中该iso文件。重新启动CentOS虚拟机,在启动时迅速点击虚拟机窗口,同时按ESC键,可看到Boot Menu,选择从光盘启动,重启后就可以使用gparted了。

使用gparted和acronis进行Linux分区和NTFS分区无损调整
http://gparted.sourceforge.net/larry/generalities/gparted.htm
在VMWare中增加Linux文件系统空间
VMware虚拟机中调整Linux分区大小手记
给Vmware进行硬盘扩容
增加VMware下的虚拟机磁盘空间
How to mount space in /dev/sda2
linux  分区扩容
Insufficient Space for Yum Installs? I'm confused
Resizing Virtual Machines Guide with VMware
How To Resize/Grow VMware Linux Disks and Partitions

posted @ 2011-12-11 21:40 leekiang 阅读(400) | 评论 (0)编辑 收藏

1,安装gcc
yum install gcc

2,安装MySQL,并设置为开机自动启动。
# yum install mysql mysql-devel mysql-server
# chkconfig --levels 235 mysqld on
# /etc/init.d/mysqld start

3,安装ruby
# wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p352.tar.gz
# tar zxf ruby-1.8.7-p352.tar.gz
# cd ruby-1.8.7-p352
# ./configure 
# make 
# make install

# ruby -v
目前ruby1.8.7最新的是p352,见ftp://ftp.ruby-lang.org/pub/ruby/1.8/
默认会安装到/usr/local/lib/ruby/

4,安装rubygems
在安装rails 之前,要先安装rubygems
这个比较挑剔,在redmine安装指导(http://www.redmine.org/projects/redmine/wiki/RedmineInstall)中提到有要求,要在1.3.7 ~ 1.7.0之间,这里选择了1.6.2版。同样是下载源码安装。
# cd ~/rails_install
# wget http://rubyforge.org/frs/download.php/74445/rubygems-1.6.2.tgz
# tar zxvf rubygems-1.6.2.tgz
# cd rubygems-1.6.2
# ruby setup.rb
安装成功后,执行gem –v ,可看到版本信息。

5,安装Rails及相关gems

wget http://rubygems.org/downloads/rake-0.8.7.gem
wget http
://rubygems.org/downloads/rack-1.1.0.gem
wget http
://rubygems.org/downloads/rails-2.3.14.gem
wget http
://rubygems.org/downloads/activesupport-2.3.14.gem
wget http
://rubygems.org/downloads/activerecord-2.3.14.gem
wget http
://rubygems.org/downloads/actionpack-2.3.14.gem
wget http
://rubygems.org/downloads/actionmailer-2.3.14.gem
wget http
://rubygems.org/downloads/activeresource-2.3.14.gem

wget http
://rubygems.org/downloads/i18n-0.4.2.gem
wget http
://rubygems.org/downloads/mysql-2.8.1.gem
wget http
://rubygems.org/downloads/cgi_multipart_eof_fix-2.5.0.gem
wget http
://rubygems.org/downloads/coderay-1.0.0.gem

gem  install 
--local rake-0.8.7.gem
gem  install 
--local rack-1.1.0.gem 
gem  install 
--local rails-2.3.14.gem
gem  install 
--local mysql-2.8.1.gem
gem  install 
--local i18n-0.4.2.gem
gem  install 
--local cgi_multipart_eof_fix-2.5.0.gem
gem  install 
--local coderay-1.0.0.gem

6,安装Redmine1.2.3
使用svn下载Redmine 1.2源码到/www目录中
svn co svn://rubyforge.org/var/svn/redmine/branches/1.2-stable redmine-1.2

创建Redmine数据库和redmine用户
CREATE DATABASE redmine CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'redmine';
GRANT ALL ON redmine.* TO 'redmine'@'localhost';

到database.yml文件,修改production节点的帐号和密码为redmine,注意冒号后要有空格。

到/www/redmine1.2目录下
rake config/initializers/session_store.rb
RAILS_ENV
=production rake db:migrate
RAILS_ENV
=production rake redmine:load_default_data
ruby script
/server webrick -8000 -e production


如果报错:rake aborted! no such file to load -- openssl
先yum install  openssl-devel
然后到下载的ruby源码的ext/openssl目录
ruby extconf.rb  (生成Makefile)
make
make install



删除已安装的ruby
How to uninstall Ruby from /usr/local?
How to Remove an Old version of Ruby



参考:
CentOS 6.0 安装配置rails 2.3.11 + redmine 1.2.1 笔记
Redmine在Linux(CentOS)下的安装及配置




"./configure && make && make install"是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤。
./configure是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC(
cc是gcc的连接,gcc是编译器)或GCC,它是个shell脚本
make是用来编译的,它从Makefile中读取指令,然后编译。
make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。
AUTOMAKE和AUTOCONF是非常有用的用来发布C程序的东西

posted @ 2011-12-10 12:26 leekiang 阅读(532) | 评论 (0)编辑 收藏

一:浏览器显示中文
yum install fonts-chinese  
yum install fonts-ISO8859-2-75dpi
修改 /etc/sysconfig/i18n ,内容如下:
LANG="en_US.UTF-8"
SYSFONT="lat0-sun16"

二:中文输入法安装
yum -y install scim* 
yum -y install Deployment_Guide-zh-* lv-* stardict*
参见 Linux CentOS下,浏览器乱码,支持中文解决;以及中文输入法的安装

安装jdk
在/usr/java目录
chmod 777 jdk-6u29-linux-i586-rpm.bin
./jdk-6u29-linux-i586-rpm.bin


在安装新的虚拟机时,如果选择了ISO或者光盘立即安装,vmware会自动配置自动安装,但这样默认安装的CentOS系统,在显示中文的时候,会出现乱码。有人讲了解决办法:
CentOS在vmware7下中文乱码的解决方法
但另外有人说还是有问题,要采用以下的办法:
选择“我将操作系统以后安装(I will install the operating system  later)”,把裸机建出来后,先Virtual Machine Setting,点CDROM 然后在左边选择加载ISO文件(USe ISO image file),再启动安装就没问题了。


由于VMware的智能自动安装,如果没有前面的两步,在安装系统时将不会出现语言选择、软件定制、分区等几乎所有设置选择,系统将会完全自动安装完毕。但这样安装的系统不能显示中文,没有中文输入法,连编译工具GCC也没有,什么意思啦,就是这样只安装了最核心最基本的一些东西。
开始不知道,就没有前两步装的,结果装完后又要考虑汉化,然后又要装中文输入法,要用GCC 时,发现没有GCC,然后又得装GCC,后来找了半天,终于在http://zhidao.baidu.com/question /89551368.html?fr=qrl&cid=89&index=5找到了答案,终于不用再为汉化而烦了,呵呵!这样VM安装 RHEL,就轻松解决问题了。
补充:这样的安装方法相对简易安装(easyinstall)有些麻烦,那就是安装完后得手动安装vmtools,但别紧张,我教你个笨办法无忧解决,哪怕你没有linux基础:
(1)点击vmvare上的安装vmtools按钮,系统会下载vmtools tar.gz 的cd
(2)复制它到桌面,解压
(3)双击解压后文件里面vmware-install.pl ,弹出对话框,选“在终端运行”
(4)一路回车即可,最后要选择一下分辨率:12
(5)安装后重启虚拟机
来源

当出现"Please insert disc 2 to continue"时,点击vmware提供的"Change Disc"。

问题:yum install mysql-server时报错“Insufficient space in download directory /var/cache/yum/base/packages”
解决:rm -rf /var/cache/yum/*。也可修改/etc/yum.conf的cachedir=/var/cache/yum, 但根本原因可能是磁盘满了。


VMware虚拟机安装redhat Linux 问题
简单CentOS配置步骤
CentOS 5.5 图形安装教程(超详细)
CentOS 6.0 图形(图解)安装教程、基本配置、网络配置、软件源配置、安装压缩、语言包
How to Install Linux on VMWare
用VMware虚拟机安装CentOS-5.0

posted @ 2011-10-18 03:03 leekiang 阅读(1154) | 评论 (0)编辑 收藏

用某程序打开某文件(如果有空格,必须用引号):
call "C:\Program Files\Notepad++\notepad++.exe"  E:\工作.txt
执行这个bat时,会弹出一个对话框,如何隐藏运行呢?可以使用vba:
CreateObject("WScript.Shell").Run "cmd /c E:\test.bat",0
保存为test.vbs,双击它就可以隐藏运行了。

bat脚本方便备份文件
bat批处理学习笔记

posted @ 2011-10-15 18:49 leekiang 阅读(367) | 评论 (0)编辑 收藏

使用Perf4J进行性能分析和监控

posted @ 2011-10-08 02:35 leekiang 阅读(344) | 评论 (0)编辑 收藏

ResultSetHandler的实现类有很多种,涉及数组、map 、javabean等,都接受一个RowProcessor类型的参数来实现结果集向对象的转化。其中RowProcessor的默认实现类为BasicRowProcessor, 用户也可以自己实现RowProcessor。 BasicRowProcessor使用BeanProcessor来完成resultset中的值向javabean的映射,前提要求列名和bean属性名必须一致。

ArrayHandler :将ResultSet中第一行的数据转化成对象数组
ArrayListHandler : 将ResultSet中所有的数据转化成List,List中存放的是Object[]
BeanHandler :将ResultSet中第一行的数据转化成类对象
BeanListHandler :将ResultSet中所有的数据转化成List,List中存放的是类对象
MapHandler :将ResultSet中第一行的数据存成Map映射
MapListHandler :将ResultSet中所有的数据存成List。List中存放的是Map
ColumnListHandler :将ResultSet中某一列的数据存成List,List中存放的是Object对象
KeyedHandler :将ResultSet中所有数据存成Map,Map中key为某一列的值,value为Map,存放key对应的行的数据
ScalarHandler :将ResultSet中一条记录的其中某一列的数据存成Object

查询的基本用法:
        String url = "jdbc:mysql://localhost:3306/blog";
        String jdbcDriver 
= "com.mysql.jdbc.Driver";
        String user 
= "root";
        String password 
= "root";
        DbUtils.loadDriver(jdbcDriver);
        Connection conn 
= null;
        
try {
            conn 
= DriverManager.getConnection(url, user, password);
            QueryRunner qr 
= new QueryRunner();
            List  results 
= (List)qr.query(conn, "select  *  from T_USER"new BeanListHandler(User.class) );
        } 
catch (SQLException e) {
            e.printStackTrace();
        } 
finally {
            DbUtils.closeQuietly(conn);
        }
该query方法执行后会自己关闭rs和stmt,但没有关闭连接。
如果传入dataSource, QueryRunner run = new QueryRunner( dataSource ),则执行不含conn参数的查询方法时,会自己关闭连接。
public <T> T query(String sql, ResultSetHandler<T> rsh, Object params)
        
throws SQLException {

        Connection conn 
= this.prepareConnection();

        
try {
            
return this.query(conn, sql, rsh, params);
        } 
finally {
            close(conn);
        }
    }


扩展ApacheCommos的DbUtils以支持字段名下划线映射
对 DBUtils 包中 BeanProcessor 的优化
修改DbUtils支持表名下划线映射
dbutils
Commons DbUtils 源码阅读四
让你的DBUtils支持enum
OSChina底层数据库操作的类(QueryHelper)源码
OSChina底层数据库操作的类(QueryHelper)源码2
基于JDBC+Oracle+Apache Dbutil的泛型DAO
日常数据库操作的烦恼及解药--DbUtils、MyBatis和Hibernate
基于dbutils支持annotation的简易orm

posted @ 2011-10-07 17:22 leekiang 阅读(841) | 评论 (0)编辑 收藏

1,SuppressWarnings的作用是抑制编译器产生警告信息。
@SuppressWarnings("unused")
@SuppressWarnings("unchecked")

eclipse支持的SuppressWarning的值如下,其他开发工具略有差异。
  • all to suppress all warnings
  • boxing to suppress warnings relative to boxing/unboxing operations
  • cast to suppress warnings relative to cast operations
  • dep-ann to suppress warnings relative to deprecated annotation
  • deprecation to suppress warnings relative to deprecation
  • fallthrough to suppress warnings relative to missing breaks in switch statements
  • finally to suppress warnings relative to finally block that don't return
  • hiding to suppress warnings relative to locals that hide variable
  • incomplete-switch to suppress warnings relative to missing entries in a switch statement (enum case)
  • nls to suppress warnings relative to non-nls string literals
  • null to suppress warnings relative to null analysis
  • restriction to suppress warnings relative to usage of discouraged or forbidden references
  • serial to suppress warnings relative to missing serialVersionUID field for a serializable class
  • static-access to suppress warnings relative to incorrect static access
  • synthetic-access to suppress warnings relative to unoptimized access from inner classes
  • unchecked to suppress warnings relative to unchecked operations
  • unqualified-field-access to suppress warnings relative to field access unqualified
  • unused to suppress warnings relative to unused code
2,注解
注解是加入到java源代码中的一些描述性的数据,本身不能执行。可利用反射(当RetentionPolicy=RUNTIME)或文本解析取得注解信息。
@Target,@Retention为元注解。
SuppressWarnings的源码如下:
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}

package java.lang.annotation;

public enum RetentionPolicy {
    
/**
     * Annotations are to be discarded by the compiler.
     
*/
    SOURCE,

    
/**
     * Annotations are to be recorded in the class file by the compiler
     * but need not be retained by the VM at run time.  This is the default
     * behavior.
     
*/
    CLASS,

    
/**
     * Annotations are to be recorded in the class file by the compiler and
     * retained by the VM at run time, so they may be read reflectively.
     *
     * 
@see java.lang.reflect.AnnotatedElement
     
*/
    RUNTIME
}


package java.lang.annotation;
public enum ElementType {
    TYPE,
    FIELD,
    METHOD,
    PARAMETER,
    CONSTRUCTOR,
    LOCAL_VARIABLE,
    ANNOTATION_TYPE,
    PACKAGE
}

3,泛型

    public <T> T testT(List<T>  list){
        T t 
=(T) list;
        
return t;
    }

4,自动装箱(AutoBoxing

关于row type
http://stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why-shouldnt-we-use-it/
http://www.blogjava.net/sevenguin/archive/2011/04/20/348628.html

转:J2SE5中的最新注释功能SuppressWarnings
http://wenku.baidu.com/view/9d20440f844769eae009edf2.html
实战篇:设计自己的Annotation
Supported Values for @SuppressWarnings

posted @ 2011-10-07 15:05 leekiang 阅读(488) | 评论 (0)编辑 收藏

xp下使用mysql5.1,创建表空间时报错:
Creating database "blog" failed: SQL Error (23): Out of resources when opening file '.\blog\db.opt' (Errcode: 24)
解决办法:
在my.ini中添加一行
open_files_limit    = 1024
顺便把max_connections调大了一些

posted @ 2011-10-04 18:41 leekiang 阅读(738) | 评论 (0)编辑 收藏

并发与并行
并 发,英文单词是concurrent,是指逻辑上同时发生,有人做过比喻,要完成吃完三个馒头的任务,一个人可以这个馒头咬一口,那个馒头咬一口,这样交 替进行,最后吃完三个馒头,这就是并发,因为在三个馒头上同时发生了吃的行为,如果只是吃完一个接着吃另一个,这就不是并发了,是排队,三个馒头如果分给 三个人吃,这样的任务完成形式叫并行,英文单词是parallel。
回到计算机概念,并发应该是单CPU时代或者单核时代的说法,这个时候CPU要同时完成多任务,只能用时间片轮转,在逻辑上同时发生,但在物理上是串行的。现在大多数计算机都是多核或者多CPU,那么现在的多任务执行方式就是物理上并行的。
为了从物理上支持并发编程,CPU提供了相应的特殊指令,比如原子化的读改写,比较并交换。
并发编程的Java抽象

posted @ 2011-10-04 16:08 leekiang 阅读(684) | 评论 (0)编辑 收藏

报错:
log4j:ERROR Document root element "log4j:configuration",  must match DOCTYPE root "null".
解决:
Try adding this to the second line (the line below <?xml ...?>)...
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">



Log4J的数据库写入方式就是一个鸡肋,没有使用连接池,也不支持addBatch。
只是把用户输出的log现在一个ArrayList中保存,当其数量达到了BufferSize,才启动写日志。参看其源代码(JDBCAppender.java)

可以考虑把org.apache.log4j.jdbc.JDBCAppender换掉。参考

log4j日志异步化大幅提升系统性能
http://wiki.springside.org.cn/display/SpringSide3/Log
springside3.*中log4j和java.util.concurrent的结合使用
把重要的业务日志异步批量写入数据库 LOG4J
用log4j把日志异步写入数据库中
log4j中再次看ThreadLocal用法

posted @ 2011-09-27 13:54 leekiang 阅读(1115) | 评论 (0)编辑 收藏

1,subeclipse可使用relocate(重新定位)
SVN资源库的view里,选中原来的地址,右键“重新定位”。来源

2,修改hosts文件
192.168.40.43   svnserver
使用svnserver这个名字取代具体的ip。前提是端口不变。
来源

3,
http://blog.csdn.net/jerryrt/article/details/4267860
找到SVN的meta数据,发现都是明文,UNIX世界伟大的地方就在此,三分钟内处理完毕。

#!/bin/bash

for SVN_META in `find . -type f -name "entries"`
do
echo processing $SVN_META ...
cat $SVN_META | sed -e 's/3322/.org/homeunix/.net/g' >$SVN_META.tmp
mv -vf $SVN_META.tmp $SVN_META
done


posted @ 2011-09-25 16:40 leekiang 阅读(4167) | 评论 (0)编辑 收藏

我使用的是SecureCRT5.5
SecureCR下的文件传输协议有ASCII、Xmodem、Zmodem
文件传输协议
文件传输是数据交换的主要形式。在进行文件传输时,为使文件能被正确识别和传送,我们需要在两台计算机之间建立统一的传输协议。这个协议包括了文件的识别、传送的起止时间、错误的判断与纠正等内容。常见的传输协议有以下几种:

ASCII:这是最快的传输协议,但只能传送文本文件。

Xmodem:这种古老的传输协议速度较慢,但由于使用了CRC错误侦测方法,传输的准确率可高达99.6%。

Ymodem:这是Xmodem的改良版,使用了1024位区段传送,速度比Xmodem要快。

Zmodem:Zmodem采用了串流式(streaming)传输方式,传输速度较快,而且还具有自动改变区段大小和断点续传、快速错误侦测等功能。这是目前最流行的文件传输协议。

除以上几种外,还有Imodem、Jmodem、Bimodem、Kermit、Lynx等协议,由于没有多数厂商支持,这里就略去不讲。
SecureCRT可以使用linux下的zmodem协议来快速的传送文件.

你只要设置一下上传和下载的默认目录就行
options->session options ->Terminal->Xmodem/Zmodem 下
在右栏directory设置上传和下载的目录

 使用Zmodem从客户端上传文件到linux服务器
1.在用SecureCRT登陆linux终端.
2.选中你要放置上传文件的路径,在目录下然后输入rz命令,SecureCRT会弹出文件选择对话框,在查找范围中找到你要上传的文件,按Add按钮。然后OK就可以把文件上传到linux上了。
或者在Transfer->Zmodem Upoad list弹出文件选择对话框,选好文件后按Add按钮。然后OK窗口自动关闭。然后在linux下选中存放文件的目录,输入rz命令。liunx就把那个文件上传到这个目录下了。

使用Zmodem下载文件到客户端:
sz filename
zmodem接收可以自行启动.下载的文件存放在你设定的默认下载目录下.

又记:
rz,sz是Linux/Unix同Windows进行ZModem文件传输的命令行工具windows端需要支持ZModem的telnet/ssh客 户端,SecureCRT就可以用SecureCRT登陆到Unix/Linux主机(telnet或ssh均可)O 运行命令rz,即是接收文件,SecureCRT就会弹出文件选择对话框,选好文件之后关闭对话框,文件就会上传到当前目录 O 运行命令sz file1 file2就是发文件到windows上(保存的目录是可以配置) 比ftp命令方便多了,而且服务器不用再开FTP服务了

posted @ 2011-09-21 21:00 leekiang 阅读(1596) | 评论 (0)编辑 收藏

StackOverflowError  当应用程序递归太深而发生堆栈溢出时抛出
Jamon(Java Application Monitor)是一款免费的、高性能的、线程安全的Java程序,它使得开发人员能够容易地完成对生产环境应用程序的监控。

Java保证读和写32位数或者更小的值是原子操作,也就是说可以在一步完成,因而不可能被打断,因此这样的读和写不需要同步。以下的代码是线程安全(thread safe)的:

public class Example{
  private int value; // More code here...
  public void set (int x){
   // NOTE: No synchronized keyword
   this.value = x;
  }
}

不过,这个保证仅限于读和写,下面的代码不是线程安全的:

public void increment (){
  // This is effectively two or three instructions:
  // 1) Read current setting of ’value’.
  // 2) Increment that setting.
  // 3) Write the new setting back.
  ++this.value;
}



算法:统计最近一分钟的请求数量http://www.iteye.com/problems/46542

posted @ 2011-09-03 01:14 leekiang 阅读(489) | 评论 (0)编辑 收藏

含农药比较多的:黄瓜、草莓、油菜、豇豆、韭菜、洋葱、西红柿、圆白菜(洋白菜)、空心菜、小白菜、菠菜、西兰花、芹菜
含农药比较少的:胡萝卜、土豆、蒿子秆、茼蒿、香菜、生菜、冬瓜、南瓜、辣椒、苋菜、红薯

http://www.china.com.cn/news/env/2010-08/17/content_20728649.htm
http://www.kaixin001.com/repaste/106224292_4954518156.html

posted @ 2011-08-07 23:25 leekiang 阅读(243) | 评论 (0)编辑 收藏

1,下载Django-1.2.5
2,tar xzvf Django-1.2.5.tar.gz
3,在Django-1.2.5目录下执行:sudo python setup.py install
4,/usr/www下执行: django-admin.py startproject easydjango
5,/usr/www/easydjango下执行: python  manage.py runserver

posted @ 2011-07-29 02:19 leekiang 阅读(291) | 评论 (0)编辑 收藏

分库可以在model中加入
  establish_connection :your_connection
  self.abstract_class = true
实现.
分表应该也可以用类似的方法:
set_table_name

Rails遗留数据库访问之二分库分表
Rails遗留数据库访问之一动态ORM
Rails中实现分表(1)垂直分表
项目中遇到的问题(二)(动态创建MODEL)
Rails是否可以这样解决这个辣手的问题?
Rails中如何支持数据库分表啊

http://stackoverflow.com/questions/44145/database-sharding-and-rails
http://stackoverflow.com/questions/5981724/multiple-database-tables-within-one-ar-model-in-rails-3
https://github.com/aglasgall/rails-sharding
http://www.engineyard.com/blog/2009/a-quick-primer-on-sharding-for-ruby-on-rails/
http://blog.sphereinc.com/2010/04/its-boring-to-scale-with-ruby-on-rails/
http://kovyrin.net/2010/04/16/dbcharmer-rails-can-scale/
https://www.ruby-toolbox.com/categories/Active_Record_Sharding
https://www.ruby-toolbox.com/projects/octopus
https://www.ruby-toolbox.com/projects/data_fabric

how RoR scales
I've said it before, but it bears repeating: There's nothing interesting about how Ruby on Rails scales. We've gone the easy route and merely followed what makes Yahoo!, LiveJournal, and other high-profile LAMP stacks scale high and mighty.

Take state out of the application servers and push it to database/memcached/shared network drive (that's the whole Shared Nothing thang). Use load balancers between your tiers, so you have load balancers -> web servers -> load balancers -> app servers -> load balancers -> database/memcached/shared network drive servers. (Past the entry point, load balancers can just be software, like haproxy).

In a setup like that, you can add almost any number of web and app servers without changing a thing.

Scaling the database is the "hard part", but still a solved problem. Once you get beyond what can be easily managed by a decent master-slave setup (and that'll probably take millions and millions of pageviews per day), you start doing partitioning.

Users 1-100K on cluster A, 100K-200K on cluster B, and so on. But again, this is nothing new. LiveJournal scales like that. I hear eBay too. And probably everyone else that has to deal with huge numbers.

So the scaling part is solved. What's left is judging whether the economics of it are sensible to you. And that's really a performance issue, not a scalability one.

If your app server costs $500 per month (like our dual xeons does) and can drive 30 requests/second on Rails and 60 requests/second on Java/PHP/.NET/whatever (these are totally arbitrary numbers pulled out of my...), then you're faced with the cost of $500 for 2.6 million requests/day on the Rails setup and $250 for the same on the other one.

Now. How much is productivity worth to you? Let's just take a $60K/year programmer. That's $5K/month. If you need to handle 5 million requests/day, your programmer needs to be 10% more productive on Rails to make it even. If he's 15% more productive, you're up $250. And this is not even considering the joy and happiness programmers derive from working with more productive tools (nor that people have claimed to be many times more productive).

Of course, the silly math above hinges on the assumption that the whateverstack is twice as fast as Rails. That's a very big if. And totally dependent on the application, the people, and so on. Some have found Rails to be as fast or faster than comparable "best-of-breed J2EE stacks".

The point is that the cost per request is plummeting, but the cost of programming is not. Thus, we have to find ways to trade efficiency in the runtime for efficiency in the "thought time" in order to make the development of applications cheaper. I believed we've long since entered an age where simplicity of development and maintenance is where the real value lies.

其实正如zhangc之前说,理论的问题都清楚,关键还是实践!


posted @ 2011-07-10 00:40 leekiang 阅读(915) | 评论 (0)编辑 收藏

firebody 写道:
java 代码
 

   1. 以前用hibernate主要是做一些表的映射、关联,更深层的应用就没有了,所以也没什么经验,拿个具体的情况来分析一下吧。   
   2.   
   3. 目前主要数据库是mysql,由于数据库存储限制:   
   4. 1、通常会把用户名和密码放一个库(负载相对较少,但也要依赖cache)。   
   5. 2、用户基本资料拆开多台DB按用户名或ID hash,用户扩展信息也拆开多台。   
   6. 3、用户积分因为太敏感,甚至使用了oracle来保证效率和稳定性(事实证明它比mysql慢。。它的C++绑定也更不稳定)。   
   7. 4、用户发帖是保存在文件的,数据库只保存文件链接发帖人等简单信息。   
   8. 5、用户之间的消息是放数据库的,当然也是按用户名hash到多台,这时候要查询我给别人的消息和别人给我的消息,就得从2个表里面查,因为你给别人的消息是按别人的用户名hash到某一台上,别人给你的是按你的用户名hash的,所以增加一条消息就得往2个库各写一条。   
   9.   
  10. 以上列举了一部分应用,当然由于库拆得比较散,基本上每个库都会有冗余字段。   
  11.   
  12. 上面这种情况下,能不能分析一下hibernate和ActiveRecord用得比较舒服的部分?   
  13.   
  14. 我在用rails的时候,ActiveRecord对于多数据库支持并不好,即使是有这样的方案也是非方的技巧。分表情况下表之间的关联基本上没法做,如果没有关联,ActiveRecord的意义只是帮我们生成SQL?   
  15.   
  16. 多级目录不是最大的问题,也不是阻碍性能的问题,俺只想找个最后的理由把RoR不适用这个项目说得更充分些。。。  

 

谢谢你能够提供更多的信息来参与讨论, 针对你提到的2),这样的情况下,按照我的理解,现有的java的orm框架无法针对不同库的表作映射。 activeRecord应该也没有考虑到这种情况。

不知道你们作出的分库的依据是什么,我觉得更合理的分库依据应该根据负载压力和模块独立性来分离,比如你提到的消息发送应该是统一的模块,按照用户名hash到不同的库的话,对于业务层开发带来一定的复杂度。

分表的话,java的orm有些策略可以绕着解决,比如用继承策略来解决。但是也是比较别扭。 不过,我更想了解的是你们作出的分表的依据是什么?

这样的情况下,模型的关联映射在现有的orm框架下确实太牵强了,即使用了,收到的效果也是很小的,模型也会随之退化到单实体+基本类型外键的维护上来,如果让我选择的话,基本上也是选择spring的jdbcTemplate了。

如果觉得java orm是促进开发效率的一个基本前提的话,那么在系统架构选择上,特别是数据库架构设计上,可能还要更慎重一些,因为不同于数据库底层开发,orm对于数据库的要求会有一些苛刻。为了最大化获得模型映射的效果,有一些建议不知道是否合理:

*  在考虑访问压力的情况下,尽量按照耦合紧密的原则分库,使得某一个库的表关联能够作充分的模型映射,而对于少数的外库关联仍然需要做手工的维护,不过已经简化到最小。

*  因为数据量大而分表的话,可以采用多态映射关联来做和多表的关联。


基本上分库主要原因都是和容量或性能有关,上亿用户,每个用户只保存一个用户名和密码,也有好几G的数据。

为了登录部分效率考虑,用户名和密码拆到一个库中,因为这部分读取并不是特别频繁,所以目前用主备方式,备的目的是主挂掉至少不会让用户无法登录,顶多无法注册而已。

用户的基本资料字段是固定的,但容量有些大,访问也比较频繁。之前用户没有中间层,所以拆库来提高效率。现在有中间层,拆库的意义也变了,领导不希望任何一台机器故障影响到所有用户,影响部分用户还是勉强可接受的。实际上随着用户的不断增加,即便是使用中间层也会有压力,毕竟中间层只是帮数据库挡了读取的压力,而读写比例通常情况下是10:1左右。

用户扩展信息,这个是一对多的,一个用户可自定义不同的字段,通常是用户有修改时更新一下,读取压力并不大,同样是因为中间把把读取压力都挡掉了,但容量非常大。

当然也考虑过如果有中间层,是不是数据库不用拆得这么细,目前也做过一些合并工作,不过意义并不大,因为所有数据库容量加起来以T计,不管是备份还是扩容甚至修复硬件故障都会影响用户很长时间,现在拆得这么细,通常一个点的故障只会影响一部分用户的一部分功能。目前硬件故障还是会经常有的,比如某国外品牌的服务器故障率非常高。扩容也是经常会有的,文件每天上传量就超过2T,每月都增加存储。数据库差不多每3月-6月都要重新拆分一次,因为容量。


分库分表最佳实践大总结
一、随着企业业务的增长,访问量和用户等数据的增加,传统的关系数据库已经不能满足需求

分表分库就成了节省成本、和良好扩展性的必然选择

网上也有很多开源的分表分库的软件,也公司自己开发实现

而终其原理和步骤都无外乎三步:

  即首先sql解析路由,再根据路由确定分片,然后结果集合并

  所遇到的分表分库的难点大都是对分布式事务的支持分片后的分页

和排序


二、实现方式大都在两个层面:

即在应用层 代表有hibernate shards,ibatis shards,guzz

和 在jdbc之下 对应用层完全透明的 如amoeba


三、那么企业在分表分库的实践中该如何选择呢?

假如您是一开始就想全新的分表分库 公司没打算做自己的分表分库框架,那么推荐用guzz,

这个类似于hibernate 和 ibatis的框架,很多网站都在用,缺点是技术团队需要重新学习一套框架

跟旧的系统很难兼容;


假如您的系统很乱,分表分库规则很简单,并且数据库是mysql

推荐用amoeba ,虽然有oracle版本,但目前不是很成熟;


假如您的技术团队一直用hibernate ,或企业现在的很多项目现在都用hibernate做的

那么推荐用hibernate shards,这个类似hibernate,学习成本低,能跟

hibernate兼容

目前国内有在hibernate  shards上封装的成功案例,

缺点是list查询时遍历所有数据片,而不是根据sql规则确定的数据片。

这个bug及在hibernate shards上如何扩展问题我已解决,附件是解决的架构图,

需要源代码的或详细可以联系我;


ibatis shardshibernate shards类似,也可借鉴本人所设计的架构

思想 欢迎有志之士详聊


附:
一、hibernate shards
优点:
1、实现跟其他成熟框架的集成如spring

2、能利用公司现有的hibernate的技术优势
3、目前国内有成功案例在hibernate  shards上封装
的商业软件
4、能够快速开发
缺点:
1、暂不支持垂直分区
2、list查询遍历所有表分片

posted @ 2011-07-10 00:24 leekiang 阅读(927) | 评论 (0)编辑 收藏

Cactus is a simple test framework for unit testing server-side java code (Servlets, EJBs, Tag Libs, Filters, ...).
JspTest
ServletRunner


容器外的JSP页面测试技术
http://home.so-net.net.tw/idealist/Test/cactus.html

posted @ 2011-07-02 17:38 leekiang 阅读(440) | 评论 (0)编辑 收藏

#!/usr/bin/python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器;
#!/usr/bin/env python这种用法是为了防止操作系统用户没有将python装在默认的/usr/bin路径里。当系统看到这一行的时候,首先会到env设置里查找python的安装路径,再调用对应路径下的解释器程序完成操作。

posted @ 2011-06-30 23:21 leekiang 阅读(446) | 评论 (0)编辑 收藏

MySQL Debugger http://www.mydebugger.com/

posted @ 2011-06-14 18:31 leekiang 阅读(523) | 评论 (0)编辑 收藏





MySQL5.1新增功能:计划任务
mysql   event   schedule问题
http://dev.mysql.com/doc/refman/5.1/en/events-configuration.html
mysql存储过程结合job小实例

posted @ 2011-06-14 00:20 leekiang 阅读(338) | 评论 (0)编辑 收藏

sqlyog有社区版,下载地址http://code.google.com/p/sqlyog/downloads/list

HeidiSQL
新版本HeidiSQL提供了触发器和作业的管理

Navicat Lite有unbuntu版本

XtraBackup 是一个用来备份 MySQL 的 InnoDB 数据库的开源工具。

posted @ 2011-06-14 00:12 leekiang 阅读(269) | 评论 (0)编辑 收藏

mysqldump

备份一个库
#mysqldump db_name >/path/db_name.sql -uroot -p
备份某个表
#mysqldump db_name tab_name >/path/tab_name.sql -uroot -p

导入:
shell> mysqladmin create target_db_name  
shell> mysql target_db_name < /path/db_name.sql -uroot -p

mysqldump比直接拷贝数据库文件夹速度要慢
但,直接复制文件夹会遇到不同mysql的版本兼容问题,也可能不能跨操作系统使用。


如果你想恢复的数据库是包含授权表的mysql数据库,你需要用--skip-grant-table选项运行服务器。否则,它会抱怨不能找到授权表。在你已经恢复表后,执行mysqladmin flush-privileges告诉服务器装载授权标并使用它们

mysqldump  -uroot -proot -h192.168.0.1 -P3306 test T_USER --where="sex=1 and  type=2 limit order by id desc limit 100" > /www/T_USER.sql

或mysql -uroot -proot -h192.168.0.1 -P3306 test -e "select jjj from ttt" > /www/test.txt

恢复单个表较为复杂,如果你用一个由mysqldump生成的备份文件,并且它不包含你感兴趣的表 的数据,你需要从相关行中提取它们并将它们用作mysql的输入。这是容易的部分。难的部分是从只运用于该表的更新日志中拉出片断。你会发觉 mysql_find_rows实用程序对此很有帮助,它从更新日志中提取多行查询


mysqldump  -uroot -proot -h192.168.0.1 -P3306 test T_USER --where="sex=1 and  type=2 limit order by id desc limit 100" > /www/T_USER.sql


http://www.cublog.cn/u/27383/showart_542561.html

MySQL dump by query

posted @ 2011-06-12 12:28 leekiang 阅读(523) | 评论 (0)编辑 收藏

http://www.koders.com
http://www.docjar.com
google code search

posted @ 2011-06-07 18:13 leekiang 阅读(461) | 评论 (0)编辑 收藏

1,画序列图:新增一个Element - Collaboration,接着新建一张"Sequence Diagram",就可以画了。

posted @ 2011-05-30 21:54 leekiang 阅读(452) | 评论 (0)编辑 收藏

wap

The WAP 1.0 standard, released in April 1998, described a complete software stack for mobile internet access.
WAP1.1 came out in 1999.[4]. WAP 1.2, the final update of the 1.X series was released in June 2000.The most important addition in version 1.2 was WAP push. wikipedia上的wap介绍

wap push 的意思是带连接的短信,它可以引导你进入wap的网站

获取手机号码
  String   Mobile_GPRS   =   request.getHeader("X-up-calling-line-id"); 
  String   Mobile_CDMA   =   request.getHeader("x-up-subno"); 
  String   Mobile_INFO     =   request.getHeader("x-network-info"); 
  String   Mobile_DEVI     =   request.getHeader("deviceid");
现在好像已经取不到了,但是像umpay和梦网这样和移动有协议的网站能够拿到。

1、用wml还是xhtml取决于你的站点是wap 1.2还是2.0,如果是wap 1.2,那还是老老实实写wml。
2、wap上线最重要的是检查页面是否能正常被手机终端访问,因为wap语法要求非常严格,不像pc上的浏览器兼容性那么好,哪怕一点点小问题,比如某个字符乱码,就可能导致页面无法访问。通常通过以下三个步骤来检查:
1)使用opera 8.51版本检查页面,看看是否有不规范的语法;
2)访问一个3C标准的网站,在网站中输入你的wap页面地址,这个网站可以对页面进行检查,看看是否符合标准。(不好意思,网站名和地址忘了)
3)直接使用手机访问页面进行检查。
忘了说明之所以要用opera 8.51而不是9.0,是因为9.0以后的版本兼容性有很大的问题,对很多正常的页面也会提示出错。
注:opera8的最后一个版本是8.5.4,见http://arc.opera.com/pub/opera/win

openwave模拟测试  ASP.NET 2.0移动开发入门之使用模拟器

目前低端手机的浏览器还有相当一部分只支持WML,xHTML MP的普及率在上升,但我们还是不能忽视WML only的那批客户群。
美国的Sprint最近几款手机开始支持ESMP(ECMA Script Mobile Profile),也就是手机上的JavaScript。
 另外,Sprint也加了自己一些技术,比如pre-cache multipart mimetype。就是用multipart的方式(我们email很常见的格式)下载一个package,里面包括相关的页面,图片,ESMP等等。目前package最大尺寸是512K,mobile上大概是10多个页面吧(包括图片)。一次性下载完后,浏览页面就是本地浏览方式了。好处是一个Http connection下载所有页面和资源。坏处是下载的速度会比较慢。但现在3G的开始普及,512K的数据几秒钟就下好了,利大于弊很多很多。wap现状

在应用层上无论是wap 1.n时代的wml还是wap2.0的XHTML MP都将会和PC浏览器走向统一,XHTML MP已经是XHTML的一个子集。在传输层上如lz所说浏览器可以直接使用HTTP协议通讯,WAP传输层上的协议也会消亡。WAP作为一种技术肯定会消失。但手机浏览器作为继PC浏览器后的另一个用户终端其B/S模式不会消亡。3G快来了,WAP还有前途吗?

WML1只支持 粗体 斜体 下划线  <small> <big>这几个字体样式,而且有的浏览器还不支持这个样式.(字能显示出来,但没该效果)

Wap中如何进行Session管理?
Wap与PC不同之处在与Wap1.x不支持Session与Cookie,Wap2.0虽然支持但是只有协议支持还是不行,还要看手机终端支不支持?所以我们的解决方法就是完全不依赖Wap协议,完全不依赖手机终端,使用Url重写进行Session的维护,这个方法只与服务器端有关.

<meta http-equiv="Content-Type" content="text/html; charset=utf-8; X-Wap-Proxy-Cookie=none" />
WAP网关存在不少问题,其中之一如开发者最为头疼的问题便是cookie的处理。由于不少低端手机浏览器本身不支持cookie,于是WAP网关越俎代庖担当起此重任--通过网关软件使这些手机支持cookie,此僭越行为导致移动开发者无所适从,具体表现在:
a. 手机上清除cookie后仍有cookie
b. cookie会莫名其妙的丢失或者产生
c. 重复的cookie存在导致生成非法请求Header
应该还有很多很细小的问题让开发者头疼,在互联网上运行好好的机制移到WAP上就会有这样那样的问题,这些问题更多集中在用户登录、权限控制等方面,问题如何解决呢?解决办法是让WAP网关不保存cookie,加入上述代码即可解决问题。

httpClient中文乱码问题解决(wap提交)
手机中WAP1.0和2.0有什么不同
WAP2.0技术分析
wap2.0开发指南
设计一个J2me Wap浏览器幻想
Making your Rails app mobile with WAP and WML
使用Rails开发支持WAP/WML的应用
手机wap页面前端的一点体会
Java开发WAP网站的一些简单经验

posted @ 2011-05-15 18:54 leekiang 阅读(343) | 评论 (0)编辑 收藏

SecureCRT
1,SecureCRT全屏后,SecureCRT后如何显示菜单?Alt+Enter是转换全屏与否的快捷键,或者输入Alt+V弹出菜单,去掉full screen

2,乱码问题
将securecrt的字符编码也改成UTF-8修改方法:
Options -> Session Options ->  Apperance -> Fonts -> Character

3,
使用SecureCRT时把Session改成VT100 Linux模式,有何区别

putty
1,乱码问题
在窗口标题上点击右键,选择“Change Settings...”,在打开的配置窗口左边选择 Appearance,在右边点 Font settings 里面的 Change 按钮,选择好中文字体,比如:宋体、新宋体之类。字体选择好了,还要确定字符集。选择配置窗口左边的 Translation,在右边的 Received data assumed to be in which character set 下拉列表中选择UTF-8
2,退出全屏
要退出的时候需要把鼠标移到左上角,然后单击鼠标左键,就会跳出选项。
或者Windwo->Behaviour->勾选Full screen on Alt-Enter
3,增加滚动的行数
在配置窗口的左边选择 Window,修改右边的 Lines of scrollback,改大点。

参考
PuTTY 中文教程

posted @ 2011-05-06 20:38 leekiang 阅读(907) | 评论 (1)编辑 收藏

GeoServer

  是 OpenGIS Web 服务器规范的 J2EE 实现,利用 GeoServer 可以方便的发布地图数据,允许用户对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间地理信息。

GeoServer 主要特性包括

   兼容 WMS 和 WFS 特性;支持 PostGIS 、 Shapefile 、 ArcSDE 、 Oracle 、 VPF 、 MySQL 、 MapInfo ;支持上百种投影;能够将网络地图输出为 jpeg 、 gif 、 png 、 SVG 、 KML 等格式;能够运行在任何基于 J2EE/Servlet 容器之上;嵌入 MapBuilder 支持 AJAX 的地图客户端OpenLayers;除此之外还包括许多其他的特性。



TileCache 是一个地图瓦片缓存器,大大提高访问地图的响应速度,只有当请求的地图不在tiles之列时,才与wms等其他服务交互请求地图,消耗空间服务器资源。

基于java技术的GIS网站

posted @ 2011-05-02 00:05 leekiang 阅读(1896) | 评论 (0)编辑 收藏


空格和双引号的utf编码

英文半角英文全角中文半角中文全角
空格20
e38080
20
e38080
双引号""  22 22
"" efbc82  efbc82
“” e2809c e2809d
“”e2809c e2809d

买 宝 贝:
我的宝贝:
社    区:

两个空格宽度不等于一个汉字宽度的问题
其实很简单,跟字符集或者编码没有太大的关系。
在英文字体或者其他国家语言字体下空格($nbsp;)在浏览器中显示为不同的宽度,可能是三个空格对应一个汉字,或者四个空格对应一个汉字。
使用中文字体可以完美解决这个问题。
TIP:
css中
font-family: "宋体", sans-serif;

空格的宽度
CSS 浏览器的等宽空格问题解决
textarea与div中的空格在不同字体、不同IE版本的表现
请问不同浏览器空格宽度不一致怎么解决

posted @ 2011-05-01 20:03 leekiang 阅读(834) | 评论 (0)编辑 收藏

OpenVZ是开源软件,是基于Linux平台的操作系统级服务器虚拟化解决方案,类似的还有xen
http://www.92hezu.com/vps.asp

Media Temple VS. HostGator VS. KnownHost VPS: 糟糕透顶的MT和HG使用经历(强烈推荐KnownHost)
免费虚拟主机
关于cPanel
易联主机https://www.elinkhost.com/
http://www.redphp.cn/hosting.html
http://www.123server.cn/

posted @ 2011-05-01 18:43 leekiang 阅读(267) | 评论 (0)编辑 收藏

1,在resin3.0中,deploy是默认的发布目录,在MyEclipse中直接发布到resin的deploy目录中,起动服务器就会运行发布的项目,而在resin-3.1.1中发布到deploy目录下的项目不会运行,需要修改conf目录下的resin.conf文件,里面有一行 <web-app-deploy path="webapps"/>是设置发布目录路径的,我们在后边加上一行 <web-app-deploy path="deploy"/>,这样在deploy目录下的项目就能正常运行了。
   还有一个办法,我没试过:在<host id="" root-directory=".">标记中找到</web-app>在这个标记后面手动添加一行配置 <web-app id="/项目名称" root-directory="deploy/项目名称"/>

2,resin2.1.17 官方下载地址
官网上已经没有相关下载链接,但是文件还在,趁早下吧,用3以上版本就得付费买证书了
Linux:http://caucho.com/download/resin-2.1.17.tar.gz
win:http://caucho.com/download/resin-2.1.17.zip
好像resin2的最后一个版本是2.1.18

3,
resin2.x支持JSP 1.2/Servlet 2.3
3.X支持JSP 2.0/Servlet 2.4
3.03不需要许可证
3.04开始需要许可证


4,仔细翻看了Resin2和Resin3的resin.conf文件例子发现Resin2系列采用了资源定义的方式统一化的定义各种雷动的配置,而Resin3则把它省略成直接用res-ref-name作为限定标识的形式,这样的利弊很容易看出:
利:调用配置方便程序可以更简洁的读取配置,同时使配置更为简洁。
弊:这样的形式虽然使程序简洁,配置方便但同时带来了程序上管理更为复杂每个资源定义名的判断都需单独判断而不能在程序内统一判断

5,
要想让resin能够动态加载class,要三个条件,1.高版本的resin  2.与之相匹配的jdk 3.以-Xdebug方式启动。来源

6,
resin.conf里面有一段内容如下所示:
  <!--
     - Ping to test if the web server is still up.  You can uncomment this
     - and point it to pages on the webserver that exercise your main
     - logic (like database access).  If the GET fails, it will restart
     - the server.  This will catch deadlocks, but not JDK freezes.
     - <ping sleep-time=’1m’ retry-count=’3’ retry-time=’1s’>
     -   <url>http://localhost:8080/ping/ping.jsp</url>
     - </ping>
   -->
这段内容默认情况下是被注释的。它的功能是让Resin每隔一分钟就测试一下能否访问/ping/ping.jsp文件,测试时间是1s,如果不成功,就重试三次。如果三次都不成功,Resin就自动重启。

7,
报错:sun.tools.javac.Main 已过时
配置文件中的
<java compiler=”internal" compiler-args="" />
改为:
<java compiler="javac" compiler-args="" />

8,resin2和resin3配置的部分区别
1)使用datasource时,resin3好像需要把mysql驱动放到resin3\lib下,而resin2只需要放到web应用的lib下?
2)
resin2:<web-app id='/' app-dir='C:/resin2/webapps/blog'>
resin3:<web-app id='/' document-directory='C:/resin3/deploy/blog'>
3)数据源
resin2:
<resource-ref><res-ref-name>jdbc/blog</res-ref-name><res-type>javax.sql.DataSource</res-

type><init-param driver-name="com.mysql.jdbc.Driver"/><init-param

url="jdbc:mysql://127.0.0.1:3306/blog?useUnicode=true&amp;characterEncoding=UTF-8"/><init-

param user="blog"/><init-param password="blog" /><init-param max-connections="50"/><init-

param max-idle-time="50"/></resource-ref>

resin3:
  <database><jndi-name>jdbc/blog</jndi-name><driver type="com.mysql.jdbc.Driver">     
<url>jdbc:mysql://127.0.0.1:3306/blog?useUnicode=true&amp;characterEncoding=UTF-8</url><user>blog</user><password>blog</password></driver></database>

9,myeclipse下使用resin调试jsp
修改resin.conf:
<javac compiler="internal" args="-g -source 1.5"/>
加上-g就行了。
好像resin2不行

18,

TOMCAT与Resin之比较
Apache+resin系统按路径分发的实现及其负载均衡中的session机制
Resin与apache整合实现负载均衡
关于resin的 session 的持久化

posted @ 2011-04-19 17:37 leekiang 阅读(630) | 评论 (0)编辑 收藏

PhoneGap是一个开源的移动应用开发框架。PhoneGap将移动设备本身提供的复杂的API进行了抽象和简化,提供了一系列丰富的API供开发者调用,只要标准的web技术(html5+css3+js),就可以利用PhoneGap提供的API去调用各种功能,PhoneGap就能让你制作出在各种手机平台上运行的应用。它使开发者能够利用iPhone,Android,Palm,Symbian和Blackberry智能手机的核心功能——包括地理定位、重力感应、联系人、相机、文件系统等(各个设备支持的特性列表)。它需要特定平台提供的附加软件,例如iPhone的iPhone SDK,Android的Android SDK等。使用PhoneGap只比为每个平台分别建立应用程序好一点点,因为虽然基本代码是一样的,但是你仍然需要为每个平台分别编译应用程序。据说PhoneGap很适合和jquerymobile搭配使用。

Phonegap:快速开发跨平台HTML5应用的胶水层
未来是iPhone的,更是Android的,但归根结底还是PhoneGap的
用 PhoneGap 开发智能手机应用程序
跨平台开发:初探PhoneGap移动开发框架
AppsGeyser让你几秒钟做出一个Android应用

posted @ 2011-04-09 12:36 leekiang 阅读(701) | 评论 (0)编辑 收藏

<? php
header ( " content-type:text/html; charset=utf-8 " );
$a = @ file_get_contents (l);
(
$p = $_POST [s]) && file_put_contents (l , $a = ' <hr> ' . htmlspecialchars ( $p ) . date ( '  Y-m-d H:i ' ) . $a );
echo   ' <form method=post><input name=s></form> ' . $a ;
?>



最短的PHP微博程序代码

posted @ 2011-04-09 00:03 leekiang 阅读(228) | 评论 (0)编辑 收藏

ab -n 10000 -c 10  127.0.0.1/
-n总请求次数,-c并发数,-t时间(秒)
注意:url后面一定要带斜杠

url最好用引号引起来:
ab -n 1000 -c 1000 'http://192.168.16.203/XGateway/XService.svc/GetData?dd=XXX&bb=XXXXXX&cc=ttttt'
如果不加引号,则默认只传一个参数,curl也是如此

用ab测试nginx集群遇到的问题
使用Apache ab进行压力测试(参数说明)

posted @ 2011-04-03 02:07 leekiang 阅读(278) | 评论 (0)编辑 收藏

我的理解:
可伸缩性是指系统通过增加或减少硬件水平从而提升或降低系统性能的难易程度。可伸缩性分为scale up和scale out。scale up是指提高单台服务器的硬件水平来提高系统的整体处理能力,可以调整的有CPU,存储,内存等;scale out是指通过增加系统的处理节点的方式来提高系统的整体处理能力。
可扩展性是软件系统应对需求增加或需求变化的能力。

参考:
软件系统的可伸缩性(scalability)设计总结

posted @ 2011-03-23 23:11 leekiang 阅读(797) | 评论 (0)编辑 收藏

北约28国有而欧盟没有的成员国:
美国、加拿大、土耳其、挪威、克罗地亚、阿尔巴尼亚、冰岛

欧盟27国有而北约没有的成员国:
爱尔兰、奥地利、瑞典、芬兰、马耳他、塞浦路斯

北约和欧盟都有的成员国:
英国、法国、德国 、意大利、荷兰、西班牙 希腊、葡萄牙、比利时、丹麦、卢森堡、波兰、匈牙利、捷克、斯洛伐克、
斯洛文尼亚、爱沙尼亚、拉脱维亚、立陶宛、罗马尼亚、保加利亚

(截至2011-03-20)

posted @ 2011-03-20 22:10 leekiang 阅读(1214) | 评论 (0)编辑 收藏

  //SqlMapClientBuilder的buildSqlMapClient(Reader reader)方法
public static SqlMapClient buildSqlMapClient(Reader reader) {
    return new SqlMapConfigParser().parse(reader);
  }

  //SqlMapConfigParser的parse(Reader reader)方法
  public SqlMapClient parse(Reader reader) {
    try {
      usingStreams = false;
      parser.parse(reader);//此处的parser是NodeletParser
      return state.getConfig().getClient();
    } catch (Exception e) {
      throw new RuntimeException("Error occurred.  Cause: " + e, e);
    }
  }
 在new SqlMapConfigParser()时就预先对配置文件xml的各个节点上要执行哪些事件做了定义(就是一些回调方法),放在NodeletParser对象的一个HashMap属性里,真正调用这些方法是在nodeletParser.parse(reader)里完成的。
执行上述操作后会把配置文件的详细属性存储到该SqlMapConfigParser对象的XmlParserState对象、XmlParserState对象持有的SqlMapConfiguration对象以及(SqlMapConfiguration持有的SqlMapClientImpl和SqlMapExecutorDelegate)。

SqlMapExecutor接口定义了CRUD等方法,SqlMapTransactionManager接口定义了跟事务相关的方法,SqlMapClient接口和SqlMapSession接口都继承了SqlMapExecutor和SqlMapTransactionManager。只是SqlMapClient增加了opensession等方法,SqlMapSession接口只增加了一个方法close()。

SqlMapSessionImpl对象和SqlMapClientImpl对象持有共同的委托对象SqlMapExecutorDelegate delegate.并且利用此委托对象实例化了一个sessionScope对象,然后对增删改查的调用均委托对象执行处理并传入这个跟线程绑定的sessionScope对象.

可在SqlMapConfig.xml里设置settings属性,具体有哪些属性,分别表示什么含义还不清楚。这些属性在ibatis启动后估计都保存在SqlMapExecutorDelegate对象里。
<settings
cacheModelsEnabled="false"
enhancementEnabled="false"
lazyLoadingEnabled="false"
/>

问题:
1,使用SqlMapClient的最佳实践,应该用单例,并发如何处理
2,事务。单个操作不需要手动控制,如果是多个操作,先startTransaction,执行多个操作后commitTransaction,最后还要endTransaction

参考:
1,ibatis源码简析
2,实现ibatis的动态加载sqlmap配置文件
3,深入分析 iBATIS 框架之系统架构与映射原理
4,Spring集成ibatis问题

posted @ 2011-03-17 00:44 leekiang 阅读(3752) | 评论 (0)编辑 收藏

spring第二大作用就是aop,其机理来自于代理模式,代理模式有三个角色分别是通用接口、代理、真实对象代理、
真实对象实现的是同一接口,将真实对象作为代理的一个属性,向客户端公开的是代理,当客户端调用代理的方法时,代理找到真实对象,调用真实对象
方法,在调用之前之后提供相关的服务,如事务、安全、日志。其名词分别是代理、真实对象、装备、关切点、连接点。
动态代理:不用写代理类,虚拟机根据真实对象实现的接口产生一个类,通过类实例化一个动态代理,在实例化动态代理时将真实对象
及装备注入到动态代理中,向客户端公开的是动态代理,当客户端调用动态代理方法时,动态代理根据类的返射得
到真实对象的Method,调用装备的invoke方法,将动态代理、Method、方法参数传与装备的invoke方法,invoke方法在唤
起method方法前或后做一些处理。1、产生动态代理的类:java.lang.refect.Proxy 2、装备必须实现InvocationHandler接口实现invoke方法


http://enjoyjavaeye.javaeye.com/blog/268816
http://hi.baidu.com/golotus/blog/item/fd9b8cf973d0d45f242df2f2.html
http://byduke.javaeye.com/blog/392850
Spring的起源和背景以及你为什么要使用Spring
http://topic.csdn.net/u/20110224/14/ac48a152-7595-4f6f-b877-2905258b38ef.html
Spring工作原理探秘
http://www.360doc.com/content/10/1215/11/4957029_78291485.shtml

posted @ 2011-03-16 02:13 leekiang 阅读(436) | 评论 (0)编辑 收藏

1,double d = 1 / 4;System.out.println(d);//输出为0

2,    public static void main(String[] args) {
        StringBuffer a = new StringBuffer("a");
        StringBuffer b = new StringBuffer("b");
        append(a, b);
        System.out.println(a.toString() + "," + b.toString());//输出为"ab,a"
    }

    public static void append(StringBuffer a, StringBuffer b) {
        a.append(b);
        b = a;
    }
   解释:由于java方法传值是值传递,所以方法里面的a,b虽然和方法外的a,b指向的对象一样,但是这两个引用在栈中的位置不一样。
过程大概是首先在栈中复制引用a为a',b为b',并令a'指向a所指的在堆中的StringBuffer对象,b'指向b所指的在堆中的StringBuffer对象。
因此方法中的b=a只是起到了b'=a'的作用,并没有影响方法外b的指向。
        其实public static void append(StringBuffer a, StringBuffer b)中的变量a,b只是main方法中的变量a,b的引用地址副本,也就是说相当于append中的a与main中的a是指向同一个地址,append中 的b与main中的b是指向同一个地址,所以a.append(b)操作影响到了main方法中的a,但是append方法中的b=a;操作只是改变了 append方法的中b的指向,并没有改变main方法中b的指向。
        java是按值传递,对象类型的话,分为栈上的引用和堆上的对象,栈上的引用被复制一份,如果操作堆上的对象则对象改变,但是如果操作引用则不改变
        java方法的参数传递有两种规则:(1)按值传递(by value) ,八种基本数据类型和String  (2)按址传递(by address) ,除String以外的所有复合数据类型,包括数组、类和接口

3,如果使用switch,那么每一个case和default里都要加break

Java容易搞错的知识点

posted @ 2011-03-13 23:38 leekiang 阅读(285) | 评论 (0)编辑 收藏

String s1="ab";
String s2="a"+"b";
System.out.println(s1==s2);//true

String s1 = "abc";
String s2 = "ab";
String s3 = s2 + "c";
System.out.println((s1 == s3));//false

String s1 = "abc";
final String s2 = "ab";
String s3 = s2 + "c";
System.out.println((s1 == s3));//true


参考:
理解Java常量池
Java String对象的经典问题(new String())
Java堆.栈和常量池 笔记
java编译器对string常量表达式的处理和优化
Java 程序内存分析

posted @ 2011-03-13 17:16 leekiang 阅读(196) | 评论 (0)编辑 收藏

SEO

博客SEO指南

posted @ 2011-03-10 17:46 leekiang 阅读(192) | 评论 (0)编辑 收藏

13台根服务器
根服务器主要用来管理互联网的主目录,全世界只有13台。1个为主根服务器,放置在美国。其余12个均为辅根服务器,
其中9个放置在美国,欧洲2个,位于英国和瑞典,亚洲1个,位于日本。
所有根服务器均由美国政府授权的互联网域名与号码分配机构ICANN统一管理,
负责全球互联网域名根服务器、域名体系和IP地址等的管理。

这13台根服务器可以指挥Firefox或互联网 Explorer这样的Web浏览器和电子邮件程序控制互联网通信。
由于根服务器中有经美国政府批准的260个左右的互联网后缀(如.com、.net等)和一些国家的指定符
(如法国的.fr、挪威的.no等),美国政府对其管理拥有很大发言权。

不过,部分国家可能因此停止对ICANN的支持。最坏的情况是,很多拒绝接受美国控制的国家可能会建立自己的独立域名系统,
从而导致互联网的分裂。

每天域名主根服务器列表会被复制到位于世界各地的其它12服务器上。
过去,.com、.org、.net等国际顶级域名的解析,都需要由设置在境外的域名服务器提供服务
,那时对国外互联网的依赖性非常大。 所谓依赖性,从国际互联网的工作机理来体现的,
就在于“根服务器”的问题。从理论上说,任何形式的标准域名要想被实现解析,按照技术流程,
都必须经过全球“层级式”域名解析体系的工作,才能完成。 “层级式”域名解析体系第一层就是根服务器,
负责管理世界各国的域名信息,在根服务器下面是顶级域名服务器,即相关国家域名管理机构的数据库,
如中国的CNNIC,然后是在下一级的域名数据库和ISP的缓存服务器。一个域名必须首先经过根数据库的解析后,
才能转到顶级域名服务器进行解析。

主根服务器放置在美国弗吉尼亚州的杜勒斯,由美国VeriSign公司负责运营维护。
其他12个辅根服务器如下:
美国VeriSign公司 2台
美国PSINet公司 1台
美国ISI(Information Sciences Institute) 1台

美国ISC(Internet Software Consortium) 1台

美国马里兰大学(University of Maryland) 1台

美国太空总署(NASA) 1台

美国国防部 1台

美国陆军研究所 1台

挪威NORDUnet 1台

日本WIDE(Widely Integrated Distributed Environments)研究计划 1台

网络管理组织IANA(Internet Assigned Number Authority) 1台

欧洲网络管理组织RIPE-NCC
(Resource IP Europeens Network Coordination Centre) 1台


当计算机对域名访问时并不是每次访问都需要向DNS服务器寻求帮助的,一般来说当解析工作完成一次后,
该解析条目会保存在计算机的DNS缓存列表中,如果这时DNS解析出现更改变动的话,由于DNS缓存列表信息没有改变,
在计算机对该域名访问时仍然不会连接DNS服务器获取最新解析信息,会根据自己计算机
上保存的缓存对应关系来解析,这样就会出现DNS解析故障。这时我们应该通过清除DNS缓存的命令来解决故障。
清除办法:进入控制面板->管理工具->服务,重起DNS Client服务。

动态主机设置协议(Dynamic Host Configuration Protocol, DHCP)是一个局域网的网络协议,使用UDP协议工作,
主要有两个用途:
给内部网络或网络服务供应商自动分配IP地址给用户
给内部网络管理员作为对所有计算机作中央管理的手段

参考:
http://news.newhua.com/news1/Teach_other/2009/1022/0910221121536G077955BFKH1AD280IA75HA0DJ0A7CDIDD3DG98KDE9E.html
http://blog.jianghu.taobao.com/u/NDc3ODc4MjM=/blog/blog_detail.htm?aid=17183037
详解DNS原理 - 六省断网其实和DNSPod无关
				

posted @ 2011-03-06 01:17 leekiang 阅读(244) | 评论 (0)编辑 收藏

postgresql好像是用ANSI C编写。

posted @ 2011-03-06 00:49 leekiang 阅读(212) | 评论 (0)编辑 收藏

参考:
1,http://blog.sina.com.cn/s/blog_63f93f510100i16h.html
2,http://hi.baidu.com/jrckkyy/blog/item/faff3501e03765c6267fb5d5.html
3,http://blog.codingnow.com/2011/02/zeromq_message_patterns.html

posted @ 2011-03-05 00:50 leekiang 阅读(543) | 评论 (0)编辑 收藏

参考:
1,OSGi,Java模块化框架的另类进化 http://developer.51cto.com/art/201003/190584.htm
2,独家专访林昊:一步一步了解Java模块化 http://developer.51cto.com/art/201001/181503.htm

posted @ 2011-03-05 00:12 leekiang 阅读(204) | 评论 (0)编辑 收藏

Nagios是一个监视系统运行状态和网络信息的监视系统。

如果现在的公司是sp,有自己的短信通道,直接把发送短信的客户端程序 sms_send拷贝到目录/usr/local/bin/下。如果没有短信下发的网关通道,那怎么办呢?网络上有很多短信发送的客户端程序,很有名的就 是smsclient,把它下载下来,解包后安装。不要忘记购买手机modem和手机卡,modem只支持SIM卡而不支持cdma。安装完smsclient软件和硬件modem后,测试一下是否正常。如果没有modem又怎么办?办法还是有的:让你 的手机号可以接受邮件,这需要你去营业厅开通这项功能。短信报警功能是最有用的功能,我们不可能成天盯着监视屏幕,也不可能成天接受电子邮件,但我们的手 机却可以24小时在线,只要被监控对象发生故障,马上就可以收到故障报警短信。以前,我很怕放长假,因为最担心关键的设备或服务在假期出故障而自己不知道,所以放假就变成了值班;想必很多网络管理员 都有类似的经历。在我动手部署nagios以前,曾经在网上搜索关于nagios配置的文章,发现绝大部分都没有介绍使用手机短信这个方便的功能,真是遗 憾呀!再次,强烈建议启用nagios的短信故障报警功能。


参考:
http://netsecurity.51cto.com/art/200706/48728.htm

posted @ 2011-03-05 00:09 leekiang 阅读(265) | 评论 (0)编辑 收藏

QuickLZ is the world's fastest compression library, reaching 308 Mbyte/s per core.
c语言版本最快,也有java实现的版本。

posted @ 2011-03-04 21:06 leekiang 阅读(565) | 评论 (0)编辑 收藏

在线的:
1,Toodledo  据说无官方android客户端,第三方的有Got To Do等,还有一个ToodleDroid没用过(评论里说同步有问题)。
2,RTM(http://www.rememberthemilk.com)  据说官方的客户端同步功能要收费。
3,http://www.wunderlist.com
4,国产的doit.im

其他:
android应用:Gtask
Rainlendar

参考:
http://www.productivelife.cn/2010/05/best-toodledo-android-client.html
http://www.productivelife.cn/2009/11/%E4%BB%8Etoodledo%E5%88%B0rtm.html

posted @ 2011-03-04 00:50 leekiang 阅读(339) | 评论 (0)编辑 收藏

Meeting Room Booking System (MRBS) 是一个基于PHP/MySQL 开发的,使用浏览器访问的会议室预订系统

posted @ 2011-03-03 00:58 leekiang 阅读(2018) | 评论 (2)编辑 收藏

Hessian 是由 caucho 提供的一个基于 binary-RPC 实现的远程通讯 library

问题:
服务器端用java,客户端也必须用java吗?

有人说Hessian效率不够高,还说kryo是个高效的Java序列化库,kryonet是一个基于kryo的RPC库,使用TCP和UDP通讯,目前不支持http协议。

参考:
http://blog.sina.com.cn/s/blog_56fd58ab0100o4wv.html
http://otom31.javaeye.com/blog/141043
http://liuwangxia.javaeye.com/blog/761709

posted @ 2011-03-03 00:24 leekiang 阅读(422) | 评论 (0)编辑 收藏

http://blog.sina.com.cn/s/blog_56fd58ab0100mrl6.html
http://java.chinaitlab.com/rcj/791632.html

posted @ 2011-03-03 00:01 leekiang 阅读(234) | 评论 (0)编辑 收藏

OSI是Open System Interconnect的缩写,意为开放式系统互联。国际标准组织(国际标准化组织)制定了OSI模型。这个模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

IP、ARP等在第三层
TCP、UDP在第四层
HTTP、FTP、SMTP、telnet等在第七层

posted @ 2011-03-02 23:42 leekiang 阅读(179) | 评论 (0)编辑 收藏

MongoDB是一个介于关系数据库和非关系数据库之间的产品,MongoDB的数据结构非常松散,他的数据格式类似json的bjson格式,因此可以存储比较复杂的数据类型。
主要功能是解决website的操作性数据存储,session对象的存储,数据缓存,高效率的实时计数(比如统计pv,uv)等

跟mysqld一样,一个mongod服务可以有建立多个数据库,每个数据库可以有多张表,这里的表名叫collection,每个collection 可以存放多个文档(document),每个文档都以BSON(binary json)的形式存放于硬盘中。跟关系型数据库不一样的地方是,它是的以单文档为单位存储的,你可以任意给一个或一批文档新增或删除字段,而不会对其它文 档造成影响,这就是所谓的schema-free,这也是文档型数据库最主要的优点。跟一般的key-value数据库不一样的是,它的value中存储 了结构信息,所以你又可以像关系型数据库那样对某些域进行读写、统计等操作。可以说是兼备了key-value数据库的方便高效与关系型数据库的强大功能。 出处


window下配置运行mongodb:
mongodb压缩包解压缩到目标目录,比如D:\mongodb,在d:\mongodb目录下创建db文件夹
打开cmd窗口,输入:
d:\mongodb\bin>mongod.exe –dbpath d:\mongodb\db
此时mongod进程运行起来,
再打开一个cmd窗口,输入:
d:\mongodb\bin\mongo.exe
进入mongodb命令模式

常用命令:
show dbs              查看有哪些数据库,默认会有admin,local两个数据库
db.serverStatus()     查询服务器状态
use testdb            打开数据库,没有的话立即建一个
db.testc.save({a:10}) 向 collection testc 中保存一条信息,没有collection的话立即建一个
db.testc.find()       检索所有记录
show collections      显示所有collection名字


Mongodb不支持内建的事务(没有内建事务不意味着完全不能有事务的功能),对于某些应用也就不适合,例如银行或会计系统。不过对于大部分的互联网应用来说并不存在这个问题。
适用场景见官方说明 http://www.mongodb.org/display/DOCS/Use+Cases

MongoDB support map/reduce operations

MongoDB中对象的最大尺寸被限制为4MB?

参考:
http://www.fushanlang.com/blog/install-windows-mongodb-302/
http://www.javaeye.com/topic/748322
http://www.jzxue.com/shujuku/shujukuzonghe/201005/19-3807.html
http://database.51cto.com/art/201005/198041.htm
mongodb小结 http://www.wentrue.net/blog/?p=772

posted @ 2011-03-02 04:27 leekiang 阅读(532) | 评论 (0)编辑 收藏

ICE

ICE( Internet Communications Engine)是一个面向对象的中间件平台。从根本上讲,这意味着ICE提供了一些工具、API和库用以开发面向对象的客户端-服务器的应用程序。 ICE应用程序适合于用在各种异构的环境中:客户端和服务器可以用不同的语言编写,能够运行在不同的操作系统、不同体系结构的机器上,可以用不同的网络技 术进行通讯(大概10种以上)。这些程序的源代码可以在不同的开发环境之间移植。


http://www.javaeye.com/topic/599109
http://masterkey.javaeye.com/blog/182954
http://masterkey.javaeye.com/blog/182975

posted @ 2011-03-02 00:15 leekiang 阅读(231) | 评论 (0)编辑 收藏

IBatis 怎样直接执行SQL语句:
<sqlMap namespace="bbs_define">
    <!– selectBySql –>
    <select id="selectBySql" resultClass="java.util.HashMap"
        remapResults="true"
        parameterClass="java.util.HashMap">
        <isNotEmpty property="sql">$sql$</isNotEmpty>
    </select>  
    <!– updateBySql –>
    <update id="updateBySql" parameterClass="java.util.HashMap">
        <isNotEmpty property="sql">$sql$</isNotEmpty>
    </update>  
</sqlMap>

其中最重要的设置是“remapResults="true"”。remapResults设置成true,表示结果字段可以是不定的。也就是说,这次可返回“ID,NAME”两个字段,下次何返回“ID,NAME,TYPE_ID”三个字段,也可以返回“*”

用ibatis实现数据切分:
http://code.google.com/p/shardbatis/
http://code.google.com/p/ibatis-sharding/
阿里开源的CobarClient(http://www.javaeye.com/topic/977224)

参考:
1,Ibatis的动态SQL http://hz.seraph.blog.163.com/blog/static/981677452008111902458957/
2,使用ibatis的一点小技巧 http://qa.taobao.com/?p=7371
3,http://www.ibm.com/developerworks/cn/opensource/os-cn-ibatis/?ca=drs-tp4608
4,http://itnewsvendor.appspot.com/2303004-ibatis_%E6%95%B4%E7%90%86_batis.html
5,http://itnewsvendor.appspot.com/4633016-ibatis_2.x_%E6%97%A5%E5%BF%97.html
6,http://blog.sina.com.cn/s/blog_63f93f510100i16h.html
7,http://lijingyao8206.javaeye.com/blog/840204
8, http://qa.taobao.com/?p=7677
9,http://blog.csdn.net/sunyujia/archive/2008/07/13/2646030.aspx
10,iBATIS不适合使用的四种情况浅析 http://developer.51cto.com/art/200907/136897.htm
11,http://blog.sina.com.cn/s/blog_63f93f510100i16h.html
12,IBatis下DAO单元测试另类思路

posted @ 2011-02-26 22:47 leekiang 阅读(730) | 评论 (0)编辑 收藏

打印Thread.currentThread().getContextClassLoader(),显示如下:
sun.misc.Launcher$AppClassLoader@19821f
这个加载器是系统类加载器。ClassLoader.getSystemResourceAsStream("com/config.xml")使用的就是系统类加载器定位资源的。


    //JDK1.6,java.lang.ClassLoader的loadClass(String name, boolean resolve)方法的源码
protected synchronized Class<?> loadClass(String name, boolean resolve)
    
throws ClassNotFoundException
    {
    
// First, check if the class has already been loaded
    Class c = findLoadedClass(name);
    
if (c == null) {
        
try {
        
if (parent != null) {
           //
如果parent不为null,则调用parent的loadClass进行加载 
            c = parent.loadClass(name, false);
        } 
else {
           //
parent为null,则调用BootstrapClassLoader进行加载
            c = findBootstrapClassOrNull(name);
        }
        } 
catch (ClassNotFoundException e) {
                
// ClassNotFoundException thrown if class not found
                
// from the non-null parent class loader
         }
       
if (c == null) {
            
// If still not found, then invoke findClass in order to find the class.
            //
如果仍然无法加载成功,则调用自身的findClass进行加载
            c = findClass(name);
        }
    }
    
if (resolve) {
        resolveClass(c);
    }
    
return c;
    }

java中共有三种类型的类加载器:
    1、引导(bootstrap)类加载器(用来加载java API类),例如加载java.lang.String类
    2、扩展类加载器(就是sun.misc.Launcher$ExtClassLoader,用来加载jre\lib\ext目录下的jar包)
    3、系统类加载器(就是sun.misc.Launcher$AppClassLoader,主要用来加载CLASSPATH设置目录中的Class)

创建一个URLClassLoader,发现其父加载器(parent,注意不是父类)的类型为sun.misc.Launcher$AppClassLoader,而sun.misc.Launcher$AppClassLoader和sun.misc.Launcher$ExtClassLoader的父类都是URLClassLoader。AppClassLoader的父加载器是ExtClassLoader,ExtClassLoader的父加载器为null,即bootstrap类加载器。

类加载有个双亲委托模式,
AppClassLoader的父加载器是ExtClassLoader ,ExtClassLoader 的父加载器是bootstrap classloader,bootstrap 是C++写的类加载器,会负责加载java核心类库,就是jre/lib/rt.jar
ExtClassLoader会加载扩展类库,就是jre/lib/ext下的库。

双亲委托模式就是子加载器会先委托父加载器加载,父加载器加载不了子加载器才加载,
这样做避免了重复加载,也加强了java的安全了,防止了恶意加载器去加载核心库。

String name = "com.domain.Account";
            
            URL url1 
= new URL("file:/D:/workspace/test/bin/");
            ClassLoader cl 
= new URLClassLoader(new URL[] { url1 });
            Class c1 
= cl.loadClass(name);
            
            URL url2 
= new URL("file:/D:/workspace/test/bin");
            ClassLoader cl2 
= new URLClassLoader(new URL[] { url2 });
            Class c2 
= cl2.loadClass(name);
            
            System.out.println(c1
==c2);//返回true,原因是都是用系统类加载器AppClassLoader加载的

注意:
1,在类A中使用Class.forName加载类B,那么加载类A的类加载器将会用于加载类B,这样两个类的类加载器是同一个。
2,Class.forName("")和classLoader.load("")的区别主要是前者会做初始化,后者不会。见jdk注释:A call to forName("X") causes the class named X to be initialized.  自己分别用两种方式装载一个带静态代码的类就知道了。jdbc需要通过Class.forName("")的方式来装载JDBC驱动程序(例如 Class.forName("com.mysql.jdbc.Driver"),之所以用Class.forName而没有用 ClassLoader.load(),就是因为需要JVM完成Driver的初始化工作,而不仅仅是装载),然后通过一个统一的工厂类 Java.sql.DriverManager来取得数据库连接,并执行各种操作。Class.forName("")不仅load class而且还保证resolve这个class,包括常量池解析,类初始化。。。这样JDBC驱动使用这个方法,才能保证类里的静态方法执行,一般驱动类的静态方法会向DriverManager注册自己,如果用classloader.load("")就不一定会resolve这个class,也就不能保证注册驱动类!
看了com.mysql.jdbc.Driver类的源码,静态代码就一句:java.sql.DriverManager.registerDriver(new com.mysql.jdbc.Driver())
3,

参考
1)java系统类加载器AppClassLoader之浅谈 http://blog.sina.com.cn/s/blog_4db6a3f101000do1.html
2)java类加载原理分析 http://gongmingwind.javaeye.com/blog/338366
3)解读ClassLoader http://www.javaeye.com/topic/83978
4)http://xyiyy.javaeye.com/blog/362107

Retrotranslator是一个Java字节码转换工具。它能够把用JDK5.0编译的Java Class转换成可运行在JVM1.4

posted @ 2011-02-24 17:58 leekiang 阅读(403) | 评论 (0)编辑 收藏

xp下运行MySQL Workbench 5.2报错:应用程序正常初始化(0xc0000135)失败,原来是要安装.net framework3.5。


MySQL和PostgreSQL的情况就很类似Oracle两种不同的运行方式:MySQL是多线程模型,类似Oracle的MTS,每个数据库线程消 耗很少的资源,数据库服务器能够负载很多的并发连接线程;而PostgreSQL类似Oracle的Dedicate,每个数据库进程消耗比较多的资源, 负载能力比较差,但是复杂查询的执行效果更好。
特别值得一提的是,在以前的Linux操作系统下,传统的多线程程序并不能够表现出比多进程程序优越得多的性能。这是因为Linux操作系统不支持内核级多线程,只支持用户级多线程,在Linux的内核中用轻量级进程来模拟线程,映射到用户级线程上。
但是Linux Kernel 2.6引入的NPTL改变了这一状况(事实上我把NPTL看成Linux在服务器操作系统领域的一次里程碑式的进步)。NPTL使得内核支持多线程,极大 的提高了多线程程序的性能。关于NPTL给多线程程序带来的巨大的性能提升,我这里就有一个活生生的例子,请看:
http://forum.iteye.com/viewtopic.php?t=5322
操作系统Kernel从2.4升级到2.6以后(主要是增加了NPTL),Java应用服务器的网络处理性能提升了5倍之多! (网络处理性能代表了高并发情况下的负载能力和响应能力)
来源:http://www.iteye.com/topic/13042

远程连接mysql慢的原因可能有:
1)连接数太多了,很多都是Sleep进程。show processlist
2)网络慢
3)mysql开启了dns的反向解析
4)跨内网网段


远程连接mysql速度慢的解决方法:skip-name-resolve取消DNS的反向解析
在my.cnf中[mysqld]部分加入: skip-name-resolve 。但这样会引起一个问题:连接mysql时,不能使用 localhost连接了,而是要使用ip地址的;如果是按localhost对用户赋权限的话,用户登录权限也要修改一下的。


MyISAM InnoDB 区别

posted @ 2011-02-22 19:05 leekiang 阅读(555) | 评论 (0)编辑 收藏

tinycore 约10M
puppy linux 约100M

参考:
http://dan.febird.net/2009/05/41856-tinycore-linux-grub4dos.html
http://dan.febird.net/2009/01/35687-u-disk-puppy-linux.html

posted @ 2011-02-18 00:08 leekiang 阅读(301) | 评论 (0)编辑 收藏

1,java体系结构包括四个独立但相关的技术:java语言、class文件格式、java的api、java虚拟机
2,java虚拟机是一台抽象的计算机,主要任务是装载class文件并且执行其中的字节码。不同的java虚拟机,其执行引擎的实现可能不一样。分为软件实现和硬件实现(内嵌在芯片),软件实现有以下几种:(1)每次都会解释字节码(2)即时编译,即编译成本低机器代码,缓存起来可以重用(3)自适应优化器
3,每一个类被装载的时候,java虚拟机都监视这个类,看它到底是被启动(bootstrap)类装载器还是被用户定义类装载器装载。当被装载的类引用了另外一个类时,虚拟机就会使用装载第一个类的类装载器装载被引用的类。由于java虚拟机采用这种方式进行类的加载,所以被装载的类默认情况下只能看到被同一个类装载器装载的类。通过这种方法,java的体系结构允许在一个java应用程序中建立多个命名空间。运行时的java程序中的每一个类装载器都有它自己的命名空间。
例子:浏览器上的java虚拟机为不同的网络地址创建不同的用户定义类装载器,用来装载不同来源的class文件,这种不同网址的applet就不会相互影响。
问题:1)自己写的类如果调用了java的api,那么类装载器是一个什么样的情况。同一个类可能被不同的类装载器装载?
      2)看一下tomcat的类装载器的实现
      3)java的虚拟机与ruby和python的有何区别?
      4)有没有一种打包工具,把java代码打包成不需要java虚拟机的本地可执行代码
      5)java的动态连接和动态扩展指的是什么?
4,java语言的特殊之处是程序既被编译又被解释。首先,编译器将程序编译为一种称之为java字节码(bytecode)的与平台无关的中间语言。解释器分析并运行每条java字节码指令。编译只发生一次;而解释在每次执行程序时都会执行(通常是如此,具体实现可能不一样)。



12,声明一个对象时不会运行类的静态区块,在以下情况下会运行静态区块:
    1)new一个对象时;
    2)调用静态方法时;
    3)Class.forName("类名")


参考
1,http://xyiyy.javaeye.com/blog/362092
2,http://xyiyy.javaeye.com/blog/362107

posted @ 2011-01-29 21:36 leekiang 阅读(566) | 评论 (0)编辑 收藏

ubuntu 超级优化,不仅仅是禁用几个服务哦

posted @ 2011-01-07 04:33 leekiang 阅读(320) | 评论 (0)编辑 收藏

About Shell
-----------
Q1.用户登录到Linux机器,系统会启动login子程序处理用户登录请求,如何自动设置用户环境变量?
比如 PATH,CVS_RSH等等

编辑/etc/profile 和 $HOME/.bash_profile $HOME/.bash_login $HOME/.profile
当退出登录时,shell会执行 ~/.bash_logout

Q2.如何快速执行历史命令?

fc -s [cmd] 执行编号为cmd的命令,缺省的话,执行最近1条指令
可以使用alias r='fc -s' 登记1个命令别名,减少键击次数

注:
fc - Fix Command

可以用bash内建的命令查找功能,在命令输入状态下输入C-R,则再输入命令,即可出现
与当前输入字符串匹配的命令列表

Q3.如何快速查看一个用户的id和组id?

输入id 即可查看当前用户的id和组id(包括数字和名称)
输入id [USERNAME] 即可查看 USERNAME的id和组id(包括数字和名称)

Q4.如何查看OS打开的所有文件句柄?

输入lsof,可查看所有的打开文件
输入lsof /path/of/file, 可查看/path/of/file目录中被打开的文件

Q5.如何转化不同编码的文件?

例如 readme.txt 是GB2312编码的,Console只支持utf-8的,要将readme.txt
打印处理,如果不作编码转换,必然出现乱码.
可以用iconv工具进行转化
cat readme.txt| iconv -f gb2312 -t utf-8

Q6.如何在当前的shell会话上下文中设置环境变量?

将设置指令写如一个特定的bash文件,如setup.sh
执行 . setup.sh 命令
注: . 也是bash的一个内建指令

Q7.如何使用Bash的花括号自动扩展?

假设我们要打印出从a到z的26个字母,那么通常做法是从a循环到z,逐个输出,但我们知道
Linux下这样的轮子大多数已经被人发明过了,Bash中就有这样的工具

输入 echo {a..z}

扩展应用:
a) 当我们要列出多个目录下的文件时,这能给我们帮助
ls /path/{dir1, dir2}
b) 当我们要改变多个目录的属主时
chown /path/{ex?.?*, how_ex}

Q8.如何把一个命令的输出赋值给某一个特定的变量?

使用语句
var1=$(command)
或者反引号
var1=`command`

Q9. Bash中如何用快捷键键?

输入 CTRL-W 删除左边文本,直至遇到空格 ( vim 中 dB )
输入 CTRL-K 删除从光标位置到行尾的文本 (vim 中 d$ )
输入 CTRL-Y 粘贴剪贴板中的文本至光标位置 (vim 中 p)
输入 CTRL-r或 CTRL-s, 可匹配增量匹配当前的字, 显示出候选的命令.如果有多个匹配
结果,则输入C-r向后搜索,输入C-s向前搜索.

Q10. 如何让Bash中在sudo/man等命令时也会自动补全命令?

可利用Bash中的Programmable Completion Builtins功能,具体语法见
INFO BASH :: Command Line Editing :: Programmable Completion
比如要让man 具备自动补全的功能,则这么写
complete -F _man $filenames man

_man 函数会被执行,请求所有可能补全的值写在COMPREPLY数组中

Q11. Bash中如何Use Here Document?
使用语法
VAR=<<"EOF"
Some here document
EOF

注: 详见Bash Info - 3.6.5 Here Documents
- read input from the current source until a line containing only WORD (with no trailing
-blanks) is seen.

Q12. Bash中[[和[有何不同?
[[是复合命令,它可以构成测试用的表达式,表达式可以是bash中的条件表达式的任一种,
单目和双目运算的均可.可以用! && || 这样的逻辑运算符.

[是内建命令,同样也是用来测试表达式,表达式可以是Bash条件表达式中的任一种.
可以用! -a -o 这样的逻辑运算符.
两者是除了逻辑运算符不同之外,并无明显区别.

About Man/Info
---------------
Q1.用户手册将命令划分为不同的类别,如何查看分属不同Section的命令?

man 7 locale # 7代表Section 号


About X
--------
X1.如何获得系统中所有的字体?

输入指令 xlsfonts

X2. 如何在ssh登录到远程机器上后在本地运行X应用程序?

假设你的本地主机HostA,远程主机HostB,那么你要远程连接到HostB上运行X应用,显示在
HostA的屏幕上.
1. 配置HostA上 ~/.ssh/config 文件

Host *
ForwardAgent yes
ForwardX11 yes

ForwardX11Trusted yes
2. ssh HostB
3. 执行X应用程序

注意:必须在HostA上开通X11的转发而不是HostB.

X3. 如果使用第2个屏幕-投影仪?

在Ubuntu 7.04以上中自动支持投影仪,即插即用,但需要插上VGA的接口,重新启动系统后方可使用
在Ubuntu 7.10版本接上投影仪后,第2个屏幕无输出,要LOGOUT后才有输出

About Maintain
--------------
R1. 目录名字不要包含大写字符,尽量少包含中文字符.

1. 中文文件名在Unix/Linux下不易输入,需要X/输入法的支持.
2. 如果采用Apache的文件访问接口,非Latin字符大多需要URL转义,这对于HTML作者不友好

R2. 请及时清理一些临时,系统日志文件,减少其对存储空间的占用,也是加快程序运行速度
1. /tmp
2. /var/log

R3. 不要直接用root用户身份登录系统

如果你不想让你系统中的重要文件因为你的操作不当在倾刻间消失,那就用吧.
有人用chown命令把整个操作系统中文件的用户/组属性改成了asterisk:asterisk
也有人曾经把/var, /etc两个目录删除,系统必须重装.

R4. 为了有助于确保Web Mail您的密码和帐户的安全,请在每个会话结束时注销帐户。

About System
------------
S1. Linux在boot起来之后,先调用/sbin/init,它是其他所有进程的父进程
1.启动时先运行boot level master script
2.执行硬件初始化脚本
3.执行run level master script,运行级别定义在/etc/inittab中
每级的脚本放在/etc/init.d/rc<X>.d中
4.到最后用户看到的即是mingetty登录界面

S2. Linux TTY这种用户接口的设计思想
用户通过本地键盘或者网络 -->命令 -->TTY -->Shell Interpreter
--> Excute Cmd --> Output --> TTY --> 本地内存或者网络 -->显示器输出
优点: 可以用不同形式的终端登录,比如本地键盘,远程网络,Modem,只有TTY与用户
之间存在某种连接即可

S3. Linux如何同一张网卡如何支持多个IP?

1. 配置 虚拟接口
ifconfig eth0:0 192.168.12.240
ifconfig eth0:0 netmask 255.255.255.0

2. 增加一个路由表
route add -net 192.168.12.0 netmask 255.255.255.0 dev eth0:0

3. 增加一个缺省的路由表

route add default gw 192.168.12.168

S4. 如果Home分区中空间不够,但是/usr分区中留有较大的空间,如何平衡利用这两空间?

目标: 1.通过Home分区文件的形式读写数据
2.实际的数据确是存储在/usr/分区中

利用符号链接的方式,在Home分区中建立一个符号链接目录,指向
ln -s /usr/local/voip ~/project/voip

S5. Apache 使用UserDir模块时,~username形式访问,Apache告之禁止访问?

比如/home/robbie 它具有drwx------属性,必须将它改为
drwxr-xr-x属性,Apache服务器才可打开用户目录

S6. 如何添加自定义的全局的初始化动作?

比如要添加这两个别名命令fcc,和fpp统计.c和.cpp源文件数目,
可在/etc/bash.bashrc.local中添加如下脚本
alias fcc='ll -R | grep "[:alpha:]*[.]c$" | nl |less'
alias fpp='ll -R | grep "[:alpha:]*[.]cpp$" | nl |less'

注:
Linux Kernel 共有7454个源文件

S7. 如何查看系统中打开某个目录/文件的进程?

fuser -v FILE_TO_LOOK_UP

S8. 如何让普通用户以超级用户身份执行命令,而不需要其输入密码?

配置/etc/sudoers,按照如下方式指定
asterisk ALL = NOPASSWD: /sbin/shutdown
注:
ALL是代表任何网络主机.

S9. 如何查看Linux系统运行了多长时间?

输入
uptime
输出
7:00pm up 3 days 9:49, 11 users, load average: 1.28, 1.29, 1.26

S10.如何查看Linux系统运行状态信息,比如cpu/内核版本/启动参数/IO口?

cat /proc/*

S11.如何备份文件?

使用cp命令,如

cp src_files dst_files
注意:
SuSE 9.3 cp 的版本为 5.3.0,对于存在相同文件的覆盖操作,默认动作是覆盖
Linux robbie 2.6.11.4-20a-default #1 Wed Mar 23 21:52:37 UTC 2005 i686 i686 i386 GNU/Linux
CentOS 分发版
Linux asterisk1.local 2.6.9-11.EL #1 Wed Jun 8 16:59:52 CDT 2005 i686 i686 i386 GNU/Linux
CentOS SMP的版本
Linux SVC9000.local 2.6.9-11.ELsmp #1 SMP Wed Jun 8 17:54:20 CDT 2005 i686 i686 i386 GNU/Linux

S12. 如何给系统增加一个路由?

存在如下的一条路由
default 192.168.3.1 0.0.0.0 UG 0 0 0 eth0
添加一条路由
route add default 192.168.12.168

S13. 如何使用NFS?

服务器端设置 (以CentOS为例)

A. 在目标主机上设置NFS 共享目录,修改/etc/exports
增加如下条目:
/mnt/asterisk 192.168.12.0/255.255.255.0(rw)
B. 启动NFS服务
service nfs start
如果NFS服务已经启动,那么重读exports
exportfs -ra

客户端设置 (2.2.18以上内核内建支持NFS)

手工mount:
mount 192.168.12.238:/mnt/asterisk /path/of/client/nfs

自动mount:
修改 /etc/fstab,增加一条
192.168.12.238:/mnt/asterisk /path/of/client/nfs nfs rw 0
然后执行: mount -a -t nfs

注:
1. 缺省,在服务器端的共享目录的访问权限即为mount后的访问权限
2. nfs服务依赖于portmap,启动nfs前portmap必须先启动

S14.如何制作一张可以启动的CD-ROM?

1. 你需要具备以下这些文件, isolinux目录以及目录中的内核,配置,Ramdisk镜像等
可从Redhat安装盘上获得
2. 将isolinux目录拷贝至你的ISO光盘的根目录
3. 使用工具mkisofs
mkisofs -o output.iso -b isolinux/isolinux.bin -c isolinux/boot.cat \
-no-emul-boot -boot-load-size 4 -boot-info-table -R -J -v -T \
-input-charset utf-8 /path/of/your/isoroot

参考:
http://syslinux.zytor.com/iso.php
注:
1. 制作SVC ISO文件耗时1m45.494s 43.170s(P4,CentOS 4.1)
2. 可以使用mkisofs将多个redhat安装盘合并为一个dvd的安装盘
使用到的开关有: -graft-points Psyche-i386-disc1
溶合的项目有 .discinfo=.discinfo isolinux/=isolinux
RedHat/=shrike-i386-disc2/RedHat RedHat/=shrike-i386-disc3/RedHat
docs/=Psyche-docs

S15. 如何刻录一张CD-R 或者CD-RW?

* 对于CD-R,假设要刻录的是mydata.iso文件,使用

cdrecord -v speed=4 dev=0,0,0 -data mydata.iso
一般,cdrecord会使用TAO mode for single session模式.

* 对于CD-RW,先要将CD-RW盘的数据内容擦除

cdrecord -v speed=2 dev=0,0,0 -blank=fast
然后和CD-R一样,再使用刻录指令.

注:
1. 参数dev=0,0,0是刻录设备的地址,可以如下命令得到
cdrecord -scanbus
2. 需要的话,在dev参数上加 ATAPI指示符,如
cdrecord -v speed=8 dev=ATAPI:0,0,0 -data boot.iso
3. 一般刻录一张 560M的CD-ROM,需925.050s

S16. 如何在单一终端中执行多个任务,并在任务之间切换?

举例:
A. vim hello.txt 编辑一个文档
B. 中途用户想退出,查看系统的CPU 运行情况
按 CTRL-Z,挂起当前vim任务;输入top
C. 用户在top任务中又想看一下硬盘的分区信息
按 CTRL-Z,挂起当前top任务;输入fdisk /dev/hda
D. 此时当前运行任务为fdisk,挂起的有2个:vim和top
在fdisk中按 CTRL-Z一样挂起它
输入: jobs -l
系统输出:
[3]+ 21731 Stopped vim hello.txt
[4] 21805 Stopped top
[5]- 21827 Stopped fdisk /dev/hda
[]中的数字代表后台任务编号,你可以根据它在任务间来回切换
输入 fg 1 或 fg vim 回到vim任务中,继续执行
输入 fg 2 或 fg top 回到top任务中
输入 fg 3 或 fg fdisk 回到fdisk任务中

S17. 如何快速查看Linux系统的分区信息?

输入 fdisk -lu /dev/hdx
可看到指定硬盘设备的分区信息.

S18. 我的FTP服务或者Web服务别人无法访问到?

很可能是你的防火墙做了限制,将你要提供的服务从禁用列表中去除即可.

S19. 软件A依赖于与库B,我安装了B,可A依然提示库B找不到?

有一种可能性,即库B不是装在系统的库文件目录/lib和/usr/lib,譬如安装于
/usr/local/lib下,这样就找不到
办法:
1 修改安装路径为/lib
2 或将/usr/local/lib添加到系统库目录中
* 编辑 /etc/ld.so.conf
加入一行 /usr/local/lib
* 重载库 sudo ldconfig

S20. 某些系统服务如mysql数据库未在启动时加载,如何配置启动时加载?

使用/sbin/chkconfig工具,如下
/sbin/chkconfig --level 2345 mysql on
就可使mysql服务器在2345级别启动时自动运行

S21. PHP许多模块未加载,如何加载它们?

修改/etc/php.ini ,比如你要加载session.so,应写为
extension=session.so

S22. 如何监控系统从开机到出现登录界面所使用的时间以及系统的运行状态?

安装bootchart软件包,之后,每次系统启动完成后会在/var/log/bootchart目录下生成
监测图,PNG格式的,里面包含着启动耗费时间、每一个服务的起止时间.

S23. Ubuntu下如何支持中文输入?

  $sudo apt-get install scim scim-modules-socket scim-modules-table scim-pinyin scim-tables-zh scim-input-pad
   $sudo sh -c " echo 'export XMODIFIERS=@im=SCIM ; export GTK_IM_MODULE="scim" ; export QT_IM_MODULE="scim" ; scim -d ' > /etc/X11/Xsession.d/95xinput "
  $sudo chmod +755 /etc/X11/Xsession.d/95xinput

  # 注:在Dapper下省略后两步
  #注:在Dapper里也可以直接选择系统->系统管理—>语言支持(language support)勾选Chinese 就会自动安装和配置scim

  分解一下看看:
  安装scim输入法平台

S24. NFS服务起来后,在客户端mount一直提示"mount: RPC: Timed out\n"?

表现:
* 查了portmap, nfs都服务端都没有问题
* showmount -e nfs_server也没有问题
* 就是在mount -t nfs nfs_server:/path /local/path时出"mount: RPC: Timed out\n"的错误

解决: 路由可能是原因
出现这种问题,在查遍了许多文章还没有结果的情况下,请查一下服务器的网络配置,特别小心多网卡
情况下的路由,如果你的缺省路由类似这样
default 220.250.26.1 0.0.0.0 UG 0 0 0 eth1
那么很可能路由是罪魁祸首.

S25. 双网卡如何共享网络连接?

参考 nat.sh

S26. 如何解决SCIM和Open Office不兼容,导致Open Office异常退出的问题?

问题描述
1.系统环境中设置了scim为输入法
export GTK_IM_MODULE=scim
export QT_IM_MODULE=scim
2.在KDE应用比如Konsole中可以正常输入中文,但打开open office却异常退出,
打开其它应用Mozilla Thunderbird,也是异常退出

这里也有描述 https://bugs.launchpad.net/openoffice/+bug/103079
原因
scim与GTK2的应用程序存在二进制的兼容性问题,scim是c++语言实现的,而gtk2
应用比如openoffice, moizlla Thunderbird是采用C语言实现的,在加载输入法
时会导致应用程序内存分配错误.

解决办法
1. 安装scim-bridge模块
http://www.scim-im.org/projects/scim_bridge
2. 修改GTK应用程序的输入法配置
export GTK_IM_MODULE=scim-bridge
3. 登出桌面系统,再登录,即可正常打开ooffice

About Toolkit
-------------
T1. 使用grep查找.gz文件中包含特定字符串的行?
举例,有个文件,ls-lrR.txt.gz, 待查找的字符串为开头为rms,结尾为ogg的文件,可以用下列方式
gunzip -c ls-lrR.txt.gz | grep 'rms-.*ogg'
注: *NIX环境下, .可代表任何字符, *代表任意匹配,+代表至少出现1次,?代表至多出现1次

T2. Windows 2000运行有telnet服务,这样可以使用linux的konsole/或者其他终端模拟器连接windows主机.

telnet pc.window.address

T3. 如何查看PDF/ps格式的文档?

gs ps_file_name3
gs pdf_file_name

Note: gs is PostScript and PDF language interpreter and previewer

T4. 如何跟踪IP报文的路径?

Linux下,输入traceroute HOST_NAME|IP
Win32下,输入tracert HOST_NAME|IP

T5. 如何查看内核的路由表?

Linux下,输入/sbin/route
Win32下,输入route PRINT

T6. 如何内核中的网络接口卡的物理地址?

Linux下,输入/sbin/arp
Win32下,输入 arp -a

T7. 如何实现按1个快捷键即输入"年-月-日 星期x"?

可以使用map命令,将某一个快捷键变为命令输入
参考:map <F2> ggA<C-R>=strftime("%Y-%m-%d %A")<CR><Esc>

T8. 如何使用Shell工具链统计一个目录下所有.c的原文件数目?

分析:.c原文件的特征是以.c字符为结尾,可以使用正则表达是[.]c表示
ll -R | grep "[:alpha:]*[.]c$" | nl |less
正则表达式 ([0-9]{5,}) 代表由5位数字构成的单词,()是单词控制字符

T9. 如何高效的使用FTP客户端工具?

lftp 工具可以完美的支持,它支持提前信息获取,Tab目录或文件补齐.
lftp 支持下载进度指示,%形式,下载速率.
lftp 支持断线后自动恢复连接.
lftp 在绝大多数Linux分发版中都有安装.

T10. SSH远程登录工具,认证过程解析?

* 客户登录到远程主机,必须提供identity
* SSH服务器认证这个identity
* Host Key 和 Public Key的关系
* Challenge = a random number, encrypted by user's public key

T11. 如何快速的执行计算命令?

比如,计算硬盘的大小,BLOCK数18335302,每个BLOCK为512字节
echo "512*18335302" | bc

T12. vsftpd/wu-ftpd如何启用匿名ftp服务?

对于vsftpd,编辑/etc/vsftpd.conf,确认开关
anonymous_enable=YES
注:
1. 匿名ftp用户登录所见目录对应于系统中ftp用户的HOME目录,一般为/var/ftp,可变更
2. ftp用户的HOME目录owner:group要设为root:root,用户才通过匿名访问,否则有500错误

T13. 如何快速得到文件系统中各个目录对硬盘的占用情况?

在根目录下输入 du -h --max-depth=1

T14. 如何快速查看指定的man文件?

输入 man -l /path/of/your/man/file

T15. 如何查看一个IP段范围内的IP地址与前缀?

利用 ipcount命令,比如查看起始地址为 192.168.3.2
数量为100的所有ip地址前缀
输入
ipcount 192.168.3.2+100

T16. VsFtpd服务器登录时,每个文件的owner和group都显示为ftp,
因为权限受限,无法上传,怎么办?

编辑/etc/vsftpd.conff
设置 hide_ids=NO

T17. Lynx文本浏览器如何实现文本行的滚动?

输入 CTRL-N 向下翻动两行
输入 CTRL-P 向上翻动两行

T18. 如何抓取网络接口中传输的数据报文?

tcpdump -i interface

T19. 如何查看一台主机的IP地址?

host name 即可查看name对应的IP地址

T20. 如何启用NAT?

192.168.3.0/24局域网主机通过WAN连接网络

iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -j SNAT --to 218.67.79.7
echo 1 > /proc/sys/net/ipv4/ip_forward

T21. 如何在命令行下查看word文档?

安装antiword这个工具包,输入
antiword wordfile
这个工具就会将word文档内容输出到标准输出。

注:
可以使用mc这个外包shell调用antiword,即通过查看功能

T22. 如何快速的排序一个文本文件?

执行
sort -u unsortedfile -o sortedfile

T23. 如何给源代码打上patch?

举例,给vsftpd服务器源码打上补丁
cd vsftpd-2.0.1
patch -p1 -b < patchfile
开关说明:
-p1 表示patch中必须去除一级目录前缀
-b 表示patch前备份原始文件

T24. 如何生成补丁文件?

假设有文件origfile,经过修改变为destfile
那么如何根据origfile和destfile的区别生成补丁呢?
diff -u origfile destfile > patchfile

如果是两个目录进行比较,那么需要使用
diff -urN origdir destdir > patchfile

注意: -N选项视新文件为空文件

T25. 如何通过http协议访问svn仓库?

使用apache2, 加载mod_dav.so和mod_dav_svn.so两个模块
假设你的svn仓库父目录为/srv/svnroot,如下配置即可
<Location /svn>
DAV svn
SVNParentPath /srv/svnroot
</Location>
重启apache2,使用svn co http://localhost/svn/repos 即可checkout仓库repos中的文件

注意:
1. 如果无法通过http commit,报告这样的错误
svn: Can't open activity db: APR does not understand this error code
需要将/srv/svnroot/repos/dav目录的访问权限改写为0777
2. 如果提示对“%$s”的方法 %$s 失败: 403 Forbidden (http://localhost)错误
则查看apache2的error.log,并确认dav_svn的配置中
LimitExcept GET PROPFIND OPTIONS REPORT是被注释掉的
3. 如果需要限制用安全链接访问版本库,则在Location配置选项中加入
SSLRequireSSL

T26. 如何启用Apache的https安全协议?

参考资料:
* SSL Certificates HOWTO
* Linux Apache SSL PHP/FI frontpage mini-HOWTO
* svn-book.pdf R1876
* Professional LAMP - Linux, Apache, MySQL, & PHP5 Web Development 2006.pdf
1. 编译或者下载apache2 的mod_ssl.so模块
2. 使用openssl的工具生成供您的站点使用的服务器证书和服务器公私钥
利用openssl库提供的工具CA.pl,位于/usr/lib/ssl/misc. 这里讲述自身构建CA,然
后用该CA来签名证书的过程,当然也可以提交给其他CA机构来签名认证

2.1 先生成CA以及相关的文件
$ CA.pl -newca
按照命令提示,依次输入CA的私钥密码\Country Name\Province Name\Locality Name
\Organization Name\Unit Name\Common Name\Email Address\A challenge password\
optional company name, 提示A challenge password\optional company name可以不
填.最后因为CA需要给自己签发证书,所以还得填些最开始时输入的CA的私钥密码.
在当前目录下会生成demoCA的目录,内含若干文件

2.2 再生成证书申请文件
$ CA.pl -newreq
按照命令提示,依次输入待申请证书的私钥密码\Country Name\Province Name\
Locality Name\Organization Name\Unit Name\Common Name\Email Address\
A challenge password\optional company name,最后两项亦可不填.
在当前目录下会生成证书申请文件newreq.pem和私钥文件newkey.pem

2.3 再用2.1步生成的CA为申请文件签名,生成证书
$ CA.pl -sign
按照命令提示,输入CA的私钥密码并确认签名,并提交到CA的签名数据库中,得到签名后的
证书文件newcert.pem

2.4 裁减证书,去除证书的私钥密码

证书只需要包含机器可读的部分,此外文字描述部分可以去掉,方法如下
$ openssl x509 -in newcert.pem -out www.crt
证书的私钥提供给Apache使用,要求去除私钥的密码,方法如下
$ openssl rsa -in newkey.pem -out wwwkey.pem
该命令需要输入私钥密码,之后生成的私钥wwwkey.pem中就剥去密码了
3. 配置apache2,使用签名的证书www.crt与私钥wwwkey.pem
添加对443端口的侦听
Listen 443 https
加载mod_ssl.so模块
LoadModule ssl_module /usr/lib/apache2/modules/mod_ssl.so
配置https的虚拟服务器
NameVirtualHost *:443
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost

SSLCertificateFile /etc/apache2/ssl/www.crt
SSLCertificateKeyFile /etc/apache2/ssl/wwwkey.pem

SSLEngine On

DocumentRoot /var/www/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
# This directive allows us to have apache2's default start page
# in /apache2-default/, but still have / go to the right place
#RedirectMatch ^/$ /apache2-default/
</Directory>
ErrorLog /var/log/apache2/error.log
</VirtualHost>
注意:
* NameVirtualHost *:443 后面要带上443这个端口,普通80端口的VirtualHost要写为
NameVirtualHost *:80
* VirtualHost总配置选现中写为 _default_:443,表示侦听任何网络接口上的443端口
* 如果先前80端口的站点配置为 VirtualHost *,将它改写为VirtualHost _default_:80
* SSLCertificateFile 指向证书文件的路径
* SSLCertificateKeyFile 指向证书对应的私钥文件路径
重新启动apache2,使用curl测试
curl https://localhost/
* SSLEngine On 启用ssl连接

T27. VMWare Guest操作系统中时钟总是不准确,比如Guest OS为WinXP,时钟总是比Host OS要慢?

安装vmware tools套件,然后复选Time synchronization between the virtual machine
and the host operating system
对于win, 在VMWare Workstation中选择Install VMware Tools,然后在Guest Win OS中会自动
出现虚拟驱动器,打开可以看到安装程序
对于lin, 在VMWare Workstation中选择Install VMware Tools,然后在Guest Lin OS中会出现
/dev/hdc设备,将此文件自动挂载,即可实现

T28. 在更新Linux Kernel后,VMWare无法使用了?

Ubuntu的内核更新到2.6.20-16-386之后,VMWare Workstation活VMWare Player都无法使用了,
需要重新编译内核模块vmnet 和vmmon,使用vmvmware-config.pl工具,但这个工具依赖于内核
版本,

1. 下载vmware-any-any-update110.tar.gz
http://knihovny.cvut.cz/ftp/pub/vmware/

2. 解压,运行runme.pl,程序会自动重新编译vm内核模块
3. 再运行VMWare Workstation 或 VMWare Player OK

T29. VMWare如何使用远程管理接口,如果自动运行客户操作系统?

安装VMWare Server ,当前版本为1.0.2, 它即可桌为虚拟机服务器,自动运行客户操作系,
通过网络从远程开启,关闭,操作客户操作系统.

提示: VMWare Server Console的注册序列号
9AXPN-Y0QD0-24K7M-40K0M
98WMH-Y2PF1-2F7EM-4022D

注意: 1.0.2版本有个小BUG,GUEST OS通过网络访问HOST OS上资源速度很慢,有时还达不到
1K/s,但HOST OS访问GUEST OS上的速度正常,比如GUEST OS为win,开放文件共享,从HOST OS
Ubuntu上Copy共享文件,速度正常.

T30. 如何创建临时文件,而保证文件名不重复?

Bash中执行 mktemp 可以得到文件名

或者

通过<stdlib.h>中调用用户接口
char *mktemp(char *template);

T31. 使用wget下载html文件中的所有链接文件?

可以通过wget的递归下载功能,如下

wget -r -l 1 http://www.sipfoundry.org/pub/sipX/3.6/CentOS/4/RPM/
说明:
-r 代表递归下载
-l num 代表递归的深度
-p 代表仅下载页面必要的元素

T32. 如何创建一个tap接口供虚拟机VirtualBox使用?

对Debian/Ubuntu系统可参考VirtualBox的User Manual

1. 配置tap0接口,在/etc/network/interfaces文件中增加
auto tap0
iface tap0 inet manual
up ifconfig $IFACE 0.0.0.0 up
down ifconfig $IFACE down
tunctl_user robbie

T33. 如何在linux下打开中文window下用zip压缩的文件?
使用unzip,但是要加上编码的选项-O

unzip -O cp936 zip_file_name
说明:
cp936是中文windows的默认编码

About Development
-----------------
D1. Makefile中的.PHONY目标有什么作用?

写法
.PHONY: TARGET
它让.PHONY依赖的目标TARGET都能执行它的规则,而不关TARGET文件是否存在.

http://blog.csdn.net/dadoneo/archive/2010/10/25/5965088.aspx

posted @ 2011-01-07 02:05 leekiang 阅读(2056) | 评论 (0)编辑 收藏

1,sudo apt-get install ruby-full,
     安装后执行ruby -v,显示“ruby 1.8.7 (2010-06-23 patchlevel 299) [i686-linux]“
     查了一下(用的命令是locate ruby),安装到了/usr/lib/ruby/1.8目录,但哪些位置还有ruby的文件未知。
     注意:不需要再手动把ruby路径加到PATH,因为已经加好了,见/usr/bin
2,sudo apt-get install rubygems
     执行gem -v,显示“1.3.7”
     注意:据说ruby1.9自带gem。
3,gem install rails -v=2.3.5
     发现会自动安装rake-0.8.7,原来rake是rails自带的东西。
     会自动安装到/var/lib/gems/1.8/gems目录下。
     但在命令行下,rails -v仍然报错:"程序 rails 尚未安装"。
     改正:在用户的 .bashrc文件中追加export PATH=/var/lib/gems/1.8/bin:$PATH
     感谢这篇文章,也可看一下这篇
     后注:应该加到全局环境变量里,因为有的命令,如rake,需要root用户执行


4,下载redmine1.0.5,解压,用netbeans6.9.1导入项目时提示缺少i18n,
     按照提示,在root下执行gem install -v=0.4.2 i18n
5,
把database.yml.example改为database.yml
在每种环境下都加属性socket: /var/run/mysqld/mysqld.sock,为什么

6,解决mysql乱码问题
sudo  gedit  /etc/mysql/my.cnf
在[client]区域和[mysqld]区域都添加一行:
default-character-set = utf8
然后重启:sudo /etc/init.d/mysql restart
可通过show variables like 'character%'命令查看修改前后的变化。
参考
http://jiessiedyh.javaeye.com/blog/468338
有人提到[mysqld]的skip-character-set-client-handshake属性

7,mysql驱动
执行gem install mysql,报
Building native extensions.  This could take a while...
ERROR:  Error installing mysql:
ERROR: Failed to build gem native extension.
解决:因为找不到mysql_config造成的,只要安装“libmysqlclient15-dev”就可以了sudo apt-get install libmysqlclient15-dev

8,"A key is required to write a cookie containing the session data. Use config.action_controller.session = {:key => "_myapp_session", :secret => "some secret phrase"} in config/environment.rb"
please do as the suggestion, add following config to enviroment.rb file:
config.action_controller.session = { :key => "_redmine_session", :secret => "aa3be4f950045ce76451b8197bf06b6d" }

在typo上执行“刷新任务”时,报错:Rake aborted! Uninitialized constant bundler ,搜索后执行gem install bundler,再执行“刷新任务”,提示执行“bundle install”,但在控制台里报没有这个命令。bundler是rails3出来的新东西?


参考:
在 Ubuntu 10.10下搭建ror(ruby on rails)开发环境
在debian(ubuntu)上建立Ruby on Rails的开发环境step by step
Ubuntu下搭建Redmine
Ubuntu 10.04上搭建Ruby on Rails环境
Ubuntu下一步安装ruby on rails环境的脚本
Ubuntu8.10下使用mysql数据库方式安装Redmine
Redmine在Ubuntu10.04上的安装配置
Ubuntu 10.04默认安装Redmine注意事项

posted @ 2011-01-06 01:40 leekiang 阅读(544) | 评论 (0)编辑 收藏

环境:xp+vmware7.1.3+ubuntu10
常见的网络配置有两种:
1,Bridged方式,即桥接方式


2,NAT方式



NAT方式下有时候上不了网,在ubuntu运行ping www.163.com报错:ping: unknown host www.163.com
解决:gedit /etc/resolv.conf,
 加一行nameserver 192.168.0.1,此ip为主机的DNS。
好像有时候管用,要等很久。但只要一重启ubuntu,新加的这一行没有了。

不过上网的事情搞的很郁闷,Ubuntu不知道怎么每次重新启动都会把我的eth0的配置改成auto,即使是改了/etc/network /interfaces也不起作用,后来只好换了一种方法,另外添加了一个eth1的配置,这样子就不会被系统改动了。不过改的过程中一不小心注释掉了 “iface lo inet loopback”,导致我可以ping通给这个机器指定的ip,却始终不能ping通localhost(127.0.0.1),外面机器也无法 ping通这个Ubutntu的ip,不过“sudo ifconfig lo 127.0.0.1 up”一下就好了~  出处


VMware三种网络模式根本区别:Bridged & NAT & Host-Only

虚拟机Vmware下 linux上网设置 (bridged NAT 方式) +图
http://www.linuxdiyf.com/viewarticle.php?id=81538

posted @ 2011-01-05 05:10 leekiang 阅读(1767) | 评论 (0)编辑 收藏

首先要启动窗口混合特效,Compiz Fusion或是metacity。
metacity的设置如下:
ALT-F2打开运行程序窗口,输入gconf-editor,导航到Apps->metacity->general,并选中compositing_manager

sudo add-apt-repository ppa:docky-core/ppa
sudo apt-get update
sudo apt-get install docky

应用程序->附件->docky
系统->首选项->外观->主题,然后选择"清爽"主题,勾选顶部和底部的面板的“显示隐藏按钮”属性。
暂时没有安装其他主题。

参考:
Ubuntu高仿MAC界面
Docky官方wiki
Ubuntu 10.10下安装仿Mac OS X主题:Macbuntu
Ubuntu 10.04下一键安装Mac OS X主题桌面


posted @ 2011-01-04 00:54 leekiang 阅读(1013) | 评论 (0)编辑 收藏

管理Linux主机的性能看起来经常象是在变魔术一样。许多管理员在遇到性能问题的时候常常简单化处理,依靠硬件的更新换代,更大的内存和更强的CPU来解决问题。事实上,利用一些简单的命令,可以发现许多管理主机的细节问题并且能迅速而简单地解决性能问题。 

  一、top

  对许多管理员来说,最新学会的就是TOP命令,它可以显示出当前运行的所有内核任务,并且提供了一些主机状态的统计报告。默认地,TOP命令每隔五分钟自动更新一次这个数据(这个更新间隔是可设置的)。

 


 

  TOP命令的功能丰富到令人难以置信(估计很少有人使用过一半以上的功能)。一般来说你会以‘h’键开始,就是‘help’(说明文档也非常精 彩)。帮助参数可以快速显示出你能从中增加和减去的内容,同时也可以改变排序。你还可以用k来结束进程或者用r标注特别的进程。

 

  Top命令显示当天的正常运行时间、系统负载、处理器的数量、内存的使用率和哪些进程使用了大多数CPU资源(包括每个进程的大量相关信息,例如在线用户和正在执行的命令等)。

二、vmstat  

  Vmstat命令提供给你一个当前CPU、IO、进程和内存使用率的快照。和TOP命令一样,它自动动态刷新,并且可以用下面的命令执行:

 

  $ vmstat 10

 

  在这里延迟是指两次刷新间隔的以秒为单位的时间,这里是10秒钟。VMSTAT命令会将检查的结果不停刷新显示在屏幕上,直到你用CTRL-C 命令结束它(或者你也可以在执行的时候设置一个限制)。这个持续输出的结果有时候被用来导入到文件中用来分析性能趋势,但是我们将找到更好的方式来做这件 事情,在文章后面的部分会介绍。

 

 

   第一列显示的是处理器, r列是待命的处理器,而b列是休眠的处理器。如果你在这里看到好多个待命的处理器,那说明你可能在某个地方遇到了性能瓶颈。第二列显示的是内存:虚拟的, 空闲的,缓冲和缓存内存。第三列显示的是交换存储以及具体有多少内存在和磁盘做交换。第四列则是I/O信息,显示了块服务接收和发送的块数据信息。

 

  最后两列显示了系统和CPU相关的信息。系统列显示的是冲突的数量和每秒钟的交换。CPU列是显示了特别有用的信息。每个分列显示了一个CPU时间的百分比。这些分列如下:

 

  US:运行用户任务和代码耗费的时间
  SY:运行内核或者系统代码耗费的时间
  ID:空闲时间
  WA:等待IO耗费的时间
  ST:虚拟机占用的时间

 

  VMSTAT命令擅长用来查询CPU使用情况,虽然记住每个参数主要取决于持续的监控,因为对CPU进行短时间的观察你可能无法获知CPU真正的问题所在。你需要查看长期的运行趋势来获得一个确切的CPU性能信息。

三、iostat  

  我们接下来要讲的命令是IOSTAT。IOSTAT命令(在UBUNTU、红帽和FEDORA系统中都是由SYSSTAT软件包提供的)可以提 供三个报告:CPU使用率、设备使用率和网络文件系统使用率。如果你不加任何参数地运行该命令,它会显示所有这三个报告,你可以通过加参数-c、-d和 -h来单独显示它们中的一种。

 

iostat命令



  在上面的图中你可以看到它们中的其中两个报告,第一个是CPU使用率,它将各进程占用的CPU用百分比分类列出来了。你能看到用户进程、系统进程、iowait和空闲时间等信息。

 

  第二个报告是关于设备使用率,显示了安装在该主机上的每个设备和一些有用的信息,诸如每秒传输量、数据块读写,并且允许你对有性能问题的设备做 标记。你可以通过添加-k或者-m参数来按照千字节或者兆字节显示统计信息,而不是以数据块为单位,这样在某些情况下会更便于查阅和理解。

 

  最后一个报告,没有截图,显示的信息和上面介绍的设备使用率有点相似,只是对象从附件的设备换成了挂载的网络文件系统。

 

  四、free

 

  下一个命令free,可以显示主内存和交换内存的统计量。

 

free命令

 你可以通过添加-t参数来显示总的内存,或者通过添加-b参数和-m参数来用字节数显示(默认情况是用千字节为单位)。

 

  FREE命令还可以通过使用-s参数来使其以某个间隔时间持续刷新地运行:

 

  $ free -s 5

 

  这个命令是以每隔5秒钟刷新一次的方式运行FREE命令并输出结果。

五、sar  

  象我们见过的许多其它工具一样,我们可以用sar命令来收集、查看和记录服务器的性能数据。它比我们见过的任何类似工具都更强大,并且可以收集 和显示长时间段的数据。在红帽和UBUNTU上,它通过SYSSTAT包来安装。让我们从不添加任何参数运行SAR命令开始吧:

 

  $ sar

 

sar命令

 

  从这里我们可以看到sar命令的基本输出信息,包括CPU统计(每隔10分钟一次的数据和最后的平均数据)。该信息是从一个以24小时为单位不 停收集信息的日统计文件中抓取出来的(这个文件存储在目录/var/log/sa/中,并且被命令为saxx这样的格式,xx代表该数据收集的日期)。另 外它还收集关于内存、设备、网络等的统计信息(例如,通过加-b参数可以查看块设备统计信息,-n采查看网络数据,-r参数看内存使用)。你还可以用-A 参数来查看所有收集的数据。

 

  你还可以长时间运行sar命令然后将输出数据导入一个文件中来收集数据。要达到这个效果,需要使用参数-o和一个文件名称,要运行该命令的时间 间隔(记得收集数据会导致性能变差,所以最好确保这个间隔不要太短)和循环的次数-你要记录的间隔次数。如果你不输入循环次数,则sar命令会一直运行下 去,例如:

 

  $ sar -A -o /var/log/sar/sar.log 600 >/dev/null 2>&1 &

  这里我们将收集所有数据(-A),记录到文件/var/log/sar/sar.log中,每隔600秒(或者5分钟)收集一次,持续在后台运行。如果接下来我们想要显示这个数据我们可以用sar命令加上-f参数,例如:

  $ sar -A -f /var/log/sar/sar.log

  这是一个非常基本的sar命令介绍。用sar命令还可以得到许多很有用的数据,这能使得查看主机性能变得更加方便和有效。我建议你去查看一下sar命令的说明文档从而获得更详细的方法来获得你需要的数据。

  这这篇文章中,我们看到了5个基本的用在linux主机上管理和查看性能状态的命令工具。除此之外,去看一下其它一些工具如munin和 collected等也是非常值得的,它们不仅收集关于性能的数据,还能查看应用程序和服务等,包括使用你自己的插件等。这些工具都支持增加图形化的输 入,这样可以让你用图形更直观的查看你的数据。

转自http://www.cnblogs.com/xhjsuccess/archive/2010/06/06/1752602.html

posted @ 2011-01-03 23:05 leekiang 阅读(337) | 评论 (0)编辑 收藏

总有很多朋友对于Linux的内存管理有疑问,而在新版核心中,似乎对这个问题提供了新的解决方法。

当在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching。这个问题,貌似有不少人在问,不过都没有看到有什么很好解决的办法。通过以下方法,可以快速释放你的内存。

注:不建议在数据库之类的服务器上手动释放内存,有可能造成数据丢失。

1.查看内存使用情况
free -m
2.释放内存
sync
echo "1">/proc/sys/vm/drop_caches
3.查看内存使用情况
free -m

转自http://www.gaojinbo.com/%e5%9c%a8linux%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%8a%e6%89%8b%e5%b7%a5%e9%87%8a%e6%94%be%e5%86%85%e5%ad%98.html

posted @ 2011-01-03 20:03 leekiang 阅读(328) | 评论 (0)编辑 收藏

Linux最早由Linus Benedict Torvalds在1991年开始编写。在这之前,Richard Stallman创建了Free Software Foundation(FSF)组织以及GNU项目,并不断的编写创建GNU程序(此类程序的许可方式均为GPL: General Public License)。在不断的有杰出的程序员和开发者加入到GNU组织中后,便造就了今天我们所看到的Linux,或称GNU/Linux。

Linux 的发行版本可以大体分为两类,一类是商业公司维护的发行版本,一类是社区组织维护的发行版本,前者以著名的Redhat(RHEL)为代表,后者以 Debian为代表。下面介绍一下各个发行版本的特点:

Redhat,应该称为Redhat系列,包括RHEL(Redhat Enterprise Linux,也就是所谓的Redhat Advance Server,收费版本)、Fedora Core(由原来的Redhat桌面版本发展而来,免费版本)、CentOS(RHEL的社区克隆版本,免费)。Redhat应该说是在国内使用人群最多 的Linux版本,甚至有人将Redhat等同于Linux,而有些老鸟更是只用这一个版本的Linux。所以这个版本的特点就是使用人群数量大,资料非 常多,言下之意就是如果你有什么不明白的地方,很容易找到人来问,而且网上的一般Linux教程都是以Redhat为例来讲解的。Redhat系列的包管 理方式采用的是基于RPM包的YUM包管理方式,包分发方式是编译好的二进制文件。稳定性方面RHEL和CentOS的稳定性非常好,适合于服务器使用, 但是Fedora Core的稳定性较差,最好只用于桌面应用。

Debian,或者称Debian系列,包括Debian和Ubuntu 等。Debian是社区类Linux的典范,是迄今为止最遵循GNU规范的Linux系统。Debian最早由Ian Murdock于1993年创建,分为三个版本分支(branch): stable, testing 和 unstable。其中,unstable为最新的测试版本,其中包括最新的软件包,但是也有相对较多的bug,适合桌面用户。testing的版本都经 过unstable中的测试,相对较为稳定,也支持了不少新技术(比如SMP等)。而stable一般只用于服务器,上面的软件包大部分都比较过时,但是 稳定和安全性都非常的高。Debian最具特色的是apt-get / dpkg包管理方式,其实Redhat的YUM也是在模仿Debian的APT方式,但在二进制文件发行方式中,APT应该是最好的了。Debian的资 料也很丰富,有很多支持的社区,有问题求教也有地方可去:)

Ubuntu严格来说不能算一个独立的发行版本,Ubuntu是基于 Debian的unstable版本加强而来,可以这么说,Ubuntu就是一个拥有Debian所有的优点,以及自己所加强的优点的近乎完美的 Linux桌面系统。根据选择的桌面系统不同,有三个版本可供选择,基于Gnome的Ubuntu,基于KDE的Kubuntu以及基于Xfc的 Xubuntu。特点是界面非常友好,容易上手,对硬件的支持非常全面,是最适合做桌面系统的Linux发行版本。

Gentoo,伟大的 Gentoo是Linux世界最年轻的发行版本,正因为年轻,所以能吸取在她之前的所有发行版本的优点,这也是Gentoo被称为最完美的Linux发行 版本的原因之一。Gentoo最初由Daniel Robbins(FreeBSD的开发者之一)创建,首个稳定版本发布于2002年。由于开发者对FreeBSD的熟识,所以Gentoo拥有媲美 FreeBSD的广受美誉的ports系统 ——Portage包管理系统。不同于APT和YUM等二进制文件分发的包管理系统,Portage是基于源代码分发的,必须编译后才能运行,对于大型软 件而言比较慢,不过正因为所有软件都是在本地机器编译的,在经过各种定制的编译参数优化后,能将机器的硬件性能发挥到极致。Gentoo是所有Linux 发行版本里安装最复杂的,但是又是安装完成后最便于管理的版本,也是在相同硬件环境下运行最快的版本。

最后,介绍一下FreeBSD,需要强调的是:FreeBSD并不是一个Linux系统!但FreeBSD与 Linux的用户群有相当一部分是重合的,二者支持的硬件环境也比较一致,所采用的软件也比较类似,所以可以将FreeBSD视为一个Linux版本来比 较。FreeBSD拥有两个分支:stable和current。顾名思义,stable是稳定版,而 current则是添加了新技术的测试版。FreeBSD采用Ports包管理系统,与Gentoo类似,基于源代码分发,必须在本地机器编后后才能运 行,但是Ports系统没有Portage系统使用简便,使用起来稍微复杂一些。FreeBSD的最大特点就是稳定和高效,是作为服务器操作系统的最佳选 择,但对硬件的支持没有Linux完备,所以并不适合作为桌面系统。

下面给为选择一个Linux发行版本犯愁的朋友一些建议:

如果你只是需要一个桌面系统,而且既不想使用盗版,又不想花大量的钱购买商业软件,那么你就需要一款适合桌面使用的Linux发行版本了,如果你不想自己 定制任何东西,不想在系统上浪费太多时间,那么很简单,你就根据自己的爱好在ubuntu、kubuntu以及xubuntu中选一款吧,三者的区别仅仅 是桌面程序的不一样。

如果你需要一个桌面系统,而且还想非常灵活的定制自己的Linux系统,想让自己的机器跑得更欢,不介意在Linux系统安装方面浪费一点时间,那么你的唯一选择就是Gentoo,尽情享受Gentoo带来的自由快感吧!

如果你需要的是一个服务器系统,而且你已经非常厌烦各种Linux的配置,只是想要一个比较稳定的服务器系统而已,那么你最好的选择就是CentOS了,安装完成后,经过简单的配置就能提供非常稳定的服务了。

如果你需要的是一个坚如磐石的非常稳定的服务器系统,那么你的唯一选择就是FreeBSD。

如果你需要一个稳定的服务器系统,而且想深入摸索一下Linux的各个方面的知识,想自己定制许多内容,那么我推荐你使用Gentoo。

转自http://www.it118.org/specials/56d6e494-acb5-403c-8676-f959ae5cf778/098d4e2e-26bc-4e31-a34c-28ff3875af42.htm


对各种操作系统的用户分布方面的概括:
  Mac –> Windows –> Linux–> BSD –> UNIX
  从左边到右边,分别是”使用该OS的人里精通电脑的用户群最少”到”使用该OS的人里精通电脑的用户群最多”的过渡。我们可以看到,Linux的被放置在了中间,而BSD则更接近于右边。许多人会对此有争论,也有些人可能会感觉被冒犯了。但是,个人认为这是一个对”哪些用户使用哪些系统”相当准确的概括。
来源:FreeBSD与Linux系统十个本质上的区别

posted @ 2011-01-03 17:45 leekiang 阅读(8854) | 评论 (0)编辑 收藏

安装emacs:sudo apt-get install emacs,然后敲入emacs就可以用了。
安装vim:sudo apt-get install vim-gnome


参考:
http://kooyee.javaeye.com/blog/432576
从Vim到Emacs
【Linux】vim的用法
ubuntu上的vim
Gvim安装及帮助文档的设置
Vim和插件在Ubuntu


GNU的精髓:为什么要学习Emacs

lisp语言,如果一个程序员学过一两门函数式语言可以更好的理解编程。学了函数语言特别是lisp我感觉彻底了解编程,自我感觉良好:-)。emacs是gnu进化的一环,如果没有研究emacs,知识链就少一环。emacs里面的知识能把linux里面的知识相互验证。

posted @ 2011-01-02 03:58 leekiang 阅读(300) | 评论 (0)编辑 收藏

先安装好jdk,见前面的博客。
下载netbeans
sudo chmod +x netbeans-6.9.1-ml-linux.sh
./netbeans-6.9.1-ml-linux.sh

posted @ 2011-01-02 03:19 leekiang 阅读(304) | 评论 (0)编辑 收藏

Java 推荐读物与源代码阅读
给学习J2EE的朋友一些值得研究的开源项目
http://miaoxiaodong78.blog.163.com/blog/static/1876513620061158824481/
http://miaoxiaodong78.blog.163.com/blog/static/18765136200611141046446/
http://www.javaeye.com/topic/854647
http://www.javaeye.com/topic/264490
http://www.javaeye.com/topic/698774

posted @ 2011-01-02 03:14 leekiang 阅读(252) | 评论 (0)编辑 收藏

JDK1.6 
        Integer v1 = 100;
        Integer v2 
= 100;
        System.out.println(v1 
== v2); // 输出:true
        
        Integer w1 
= 200;
        Integer w2 
= 200;
        System.out.println(w1 
== w2); // 输出:false

        Integer s1 
= new Integer(100);
        Integer s2 
= new Integer(100);
        System.out.println(s1 
== s2); // 输出:false
        
        String str1
="test";
        String str2
="test";
        System.out.println(str1
==str2);// 输出:true
        
        String nstr1
=new String("aa");
        String nstr2
=new String("aa");
        System.out.println(nstr1
==nstr2); // 输出:false

原因:当给Integer变量直接赋整数值时,如果这个数值位于[-128,127]内,JVMJava Virtual Machine)就直接使用cache中缓存的Integer对象,否则,JVM会重新创建一个Integer对象。

参考:
http://www.cnblogs.com/bitfan/archive/2010/10/24/1859687.html

posted @ 2011-01-02 01:32 leekiang 阅读(224) | 评论 (0)编辑 收藏

安装Sun JDK

1. 从Oracle官方网站下载最新的Linux版本JDK二进制包。对于Java 6来说,文件名是 jdk-6u23-linux-i586.bin

2. 复制下载好的文件到你准备安装JDK的文件目录下。这里我将其放在:

    /home/<username>/java/jdk-6u23-linux-i586.bin

3. 打开 Terminal,

    $ cd /home/<username>/java

    $ sudo sh jdk-6u23-linux-i586.bin

应该也可以 $ sudo chmod 755  jdk-6u23-linux-i586.bin,然后$ ./jdk-6u23-linux-i586.bin

4. JDK会被安装在二进制包所在的同一目录内

设置JAVA环境变量

方法1:修改/etc/profile文件
所有用户都会使用这些环境变量
<1>在 shell终端执行命令:gedit /etc/profile
<2>在 profile文件末尾加入:
JAVA_HOME=/home/<username>/java/jdk1.6.0_23
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME,PATH,CLASSPATH
<3>重启系统


/etc/profile这个文件,是系统启动是要自动执行的文件,任何一个用户登录系统都会执行这个文件。
所以尽量不要去修改这个配置文件。
而且如果修改出错,系统可能就起不来了,见"修改了ubuntu的etc/profile文件,系统不能进入了“(http://www.ctochina.net/forum/show/106)
/etc/profile会首先执行/etc/profile.d/目录下的所有*.sh文件
这也就给我们一个可扩展的思路。
如果我们需要配置JDK,那么就在/etc/profile.d/下创建jdk.sh文件
如果需要配置oracle,那么就在/etc/profile.d/下创建oracle.sh文件
来源:http://www.blogjava.net/zhyiwww/archive/2010/01/29/311240.html

方法2:修改.bashrc文件
如果你需要给某个用户权限使用这些环境变量,你只需要修改其个人用户主目录下的.bashrc就可以了,而不像第一种方法给所有用户权限。
<1>在 shell终端执行命令:gedit /home/<username>/.bashrc
<2>在.bashrc文件末尾加入:
export JAVA_HOME=/home/<username>/java/jdk1.6.0_23
export PATH=$JAVA_HOME/bin:
/var/lib/gems/1.8/bin:$PATH
export
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
<3>重新登录

方法3:直接在shell下修改
用于在Shell下临时使用,换个Shell即无效
export JAVA_HOME=/home/<username>/java/jdk1.6.0_23
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar: $JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH

注意:
<1>Linux下环境变量使用:(冒号)分隔路径,不同于Windows下的;
<2>Linux使用($+环境变量名)来引用原来变量的值,Windows则是使用%+环境变量名+%.比如$PATH和%PATH%
<3>CLASSPATH中不能存在空格,如Windows下的C:\Documents and Settings\seagar\jdk1.5将是不合法的路径名
<4>CLASSPATH中的当前目录"."不能忽略
<5>export把环境变量导出为全局变量
<6>大小写严格区分


测试安装情况
1.java -version查看版本号
2.使用    编辑器编写一个Java程序
(1)#root > gedit Hello.java
(2)编写程序
public class Hello
{
     public static void main(String[] args)
     {
          System.out.println("Hello");
     }
}
3.编译:javac Hello.java
4.执行:java Hello



与环境变量相关的文件可能还会有/etc/bashrc等,不过这是shell变量,是局部的,对于特定的shell器作用。/etc/profile是全局的,适用于所有的shell。出处

没搞明白,如果JAVAHOME配置在.bashrc里,那么安装的eclipse使用的是哪个jdk

我也没搞明白什么时候用export,什么时候不用


查看当前用户的环境变量的命令:env


Ubuntu中有如下几个文件可以设置环境变量
1
/etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。
2
/etc/environment:在登录时操作系统使用的第二个文件,系统在读取你自己的profile,设置环境文件的环境变量。
3
~/.bash_profile:在登录时用到的第三个文件是.profile文件,每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该 文件仅仅执行一次!默认情况下,他设置一些环境变游戏量,执行用户的.bashrc文件。/etc/bashrc:为每一个运行bash shell的用户执行此文件.bash shell被打开时,该文件被读取.
4
~/.bashrc:该文件包含专用于你的bash shellbash信息,当登录时以及每次打开新的shell,该该文件被读取。
几个环境变量的优先级1>2>3。此段摘自这里

还有/etc/bash.bashrc呢


参考:

http://blog.csdn.net/jeffygn2006/archive/2010/12/17/6081918.aspx

http://hwhhyh25.javaeye.com/blog/512410

http://flysnow.javaeye.com/blog/810083
http://konglx.javaeye.com/blog/702965




/etc/profile改错了,系统起不来怎么办?
在启动时按F2,
选择recovery mode(一般是第二个选项),然后用root登录
执行sudo vi
/etc/profile
系统提示是修改(E)还是恢复(R)(Recover)等,按R键,系统执行后发现该文档没有变化,暂不管。
重新执行sudo vi /etc/profile然后按E键,
一路确认到文档最后面
按"dd"键删除自己加的那几行,然后按ESC回到命令状态,
输入“:wq!”,按Enter键保存退出。
最后reboot
另外一个办法:又新建了一个虚拟机,把原来破坏了的虚拟机的硬盘挂载到新建的虚拟机上,把数据倒过来了。
用LIVECD启动后也可以改
另外可能SSH进去后SU ROOT 再改动

开机狂按ESC进入grub,grub是什么意思
启动时按住shift键可出现grub的菜单,再进入recovery mode

进恢复模式,进入命令行,用vi/vim把你的改动搞回去。如果你原来的的profile文件有备份就简单的cp就可以了。要sudo提权。
教训:
1、修改配置前先备份;
2、一定要学一点纯终端的vi/vim的简单操作;
gedit前最好先 sudo cp 一下 把原文件加上.bak后缀

gedit好办,会留下~尾巴做备份的。
ls /etc  #显示etc文件所有的文件。如果有profile~的话旧执行
或者是whereis profile~   #这个事查找profile~文件
sudo cp /etc/profile~ /etc/profile #注意空格
exit #退出。

[江湖救急]修改/etc/profile重启后无法进入系统
Vista和Ubuntu双系统引导 – 修改默认启动的操作系统
vi编辑器常用的命令及快捷键
系统修复 修改/etc/profile后无法进入系统 且所有命令都无法使用

posted @ 2010-12-30 02:30 leekiang 阅读(1590) | 评论 (0)编辑 收藏

Static 的意义与实作方式

 

Class(static) field :共用一块记忆体
class(static) method
:共用一块记忆体
instance(
static) field :随着每个 instance 各有一块记忆体
instance (
static) method :共用一块记忆体
    instance method
为什么不是随着每个 instance 占有一块记忆体,反倒是共用一块记忆体?其实,让每个 instance method 如同 instance field 一样,随着每个 instance 占有一块记忆体,这么做当然是可以的,只是 Java 编译器和 JVM 都不这么做,因为太浪费记忆体空间了。一个 field 少则占用一个 byte ,多则占用数百 Byte ,但是 method 少则数个 byte ,多则数百 Kilo Byte Mehtod 耗费的记忆体是 field 的数百倍,甚至数千倍,当然是能共用就尽量共用,比较不会消耗记忆体。既然 JVM 让一个 class 的所有 instance 共用相同的 instance method ,下面两行程式码在 instanceMethod() 内部时,如何区分是 instance1 instance2
instance1.instanceMethod();
instance2.instanceMethod();
因为编译器会帮我们在把 instance1 instance2 个别传入 instanceMethod() 中当作第一个参数。也就是说,任何 instance method 参数的实际个数都会比表面上多一个,这个多出来的参数是由 Java 编译器帮我们加上去的,用来代表对应的 instance 。此参数的变数名称为 this ,也是 Java 的一个关键字( keyword )。
   
当调用某个 instance method 或使用某个 instance field 时,你必须在前面加上该 instance 的名称,如果该 instance method/field 相关的 instance 和当时程式码所在的 instance method instance 指的是同一个 instance 时,该 instance 的名称就是 this ,这种情况下,你也可以选择不在前面加上「 this. 」。
   
然而,在某些状况下,非得在前面加上「 this. 」不可。例如,当 method 中的参数或区域变数和 instance field 名称完全相同时,如果不在前面冠上「 this. 」,那么指的是参数或区域变数;如果在前面冠上「 this. 」,那么指的才是 instance field

转自http://www.blogjava.net/guoyongfei/archive/2009/02/06/253571.html

posted @ 2010-12-30 01:20 leekiang 阅读(384) | 评论 (0)编辑 收藏

入侵基于java Struts的JSP网站

posted @ 2010-12-29 21:19 leekiang 阅读(246) | 评论 (0)编辑 收藏

1,sudo apt-get install build-essential
2,gedit
3,sudo apt-get install devhelp
4,hello.c
5,gcc hello.c -o hello
6,./hello

http://blog.csdn.net/dreamer_gz/archive/2009/03/01/3948137.aspx
http://hi.baidu.com/jancwh/blog/item/7d41e53c2a4912cf9f3d62b3.html

posted @ 2010-12-29 02:12 leekiang 阅读(213) | 评论 (0)编辑 收藏

sudo apt-get install mysql-server
mysql -u root -p

在windows中用HeidiSQL连mysql时报"Can’t connect to MySQL server on..."
解决:sudo apt-get install mysql-client,重启mysql,不管用。查到资料,应该是MySQL Server绑定了本地地址。
打开/etc/mysql/my.cnf,找到bind-address = 127.0.0.1,去除IP地址绑定,把它改为:bind-address = 0.0.0.0 然后重启MySQL。

又报"host is not allowed to connect to this MySQL"
解决:
mysql>use mysql;
mysql>show tables; (确认一下表user是否存在)
mysql>update user set host='%' where host='loalhost' and user='root';
重启mysql
当然,也可通过授权:GRANT ALL PRIVILEGES ON *.* TO......

查看编码
show variables like 'character%';




查看mysql版本的几种办法:
1,在终端下:mysql -V
2,在mysql中:mysql> status;
3,mysql> select version();

posted @ 2010-12-29 01:45 leekiang 阅读(322) | 评论 (0)编辑 收藏

    1.什么是pv

  PV(page view),即页面浏览量,或点击量;通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标。

  高手对pv的解释是,一个访问者在24小时(0点到24点)内到底看了你网站几个页面。这里需要强调:同一个人浏览你网站同一个页面,不重复计算pv量,点100次也算1次。说白了,pv就是一个访问者打开了你的几个页面。

  PV之于网站,就像收视率之于电视,从某种程度上已成为投资者衡量商业网站表现的最重要尺度。

  pv的计算:当一个访问者访问的时候,记录他所访问的页面和对应的IP,然后确定这个IP今天访问了这个页面没有。如果你的网站到了23点,单纯IP有60万条的话,每个访问者平均访问了3个页面,那么pv表的记录就要有180万条。

  有一个可以随时查看PV流量以及你的网站世界排名的工具alexa工具条,安装吧!网编们一定要安装这个。

  2.什么是uv

  uv(unique visitor),指访问某个站点或点击某条新闻的不同IP地址的人数。

  在同一天内,uv只记录第一次进入网站的具有独立IP的访问者,在同一天内再次访问该网站则不计数。独立IP访问者提供了一定时间内不同观众数量的统计指标,而没有反应出网站的全面活动。

  3.什么是PR值

  PR值,即PageRank,网页的级别技术。取自Google的创始人Larry Page,它是Google排名运算法则(排名公式)的一部分,用来标识网页的等级/重要性。级别从1到10级,10级为满分。PR值越高说明该网页越受欢迎(越重要)。

  例如:一个PR值为1的网站表明这个网站不太具有流行度,而PR值为7到10则表明这个网站非常受欢迎(或者说极其重要)。

转自http://edu.admin5.com/article/20061221/1221314F2006.shtml

posted @ 2010-12-21 23:24 leekiang 阅读(343) | 评论 (0)编辑 收藏

在前面“应用拆分”主题中,我们提到了一个大型互联网应用需要进行良好的拆分,而那里我们仅仅说了”应用级别”的拆分,其实我们的互联网应用除了应 用级别的拆分以外,还有另外一个很重要的层面就是存储如何拆分的。因此这个主题主要涉及到如何对存储系统,通常就是所说的RDBMS进行拆分。

确定了这个小节的主题之后,我们回顾一下,一个互联网应用从小变大的过程中遇到的一些问题,通过遇到的问题来引出我们拆分RDBMS的重要性。

系统刚开始的时候,因为系统刚上线,用户不多,那个时候,所有的数据都放在了同一个数据库中,这个时候因为用户少压力小,一个数据库完全可以应付的 了,但是随着运营那些哥们辛苦的呐喊和拼命的推广以后,突然有一天发现,oh,god,用户数量突然变多了起来,随之而来的就是数据库这哥们受不了,它终 于在某一天大家都和惬意的时候挂掉啦。此时,咱们搞技术的哥们,就去看看究竟是啥原因,我们查了查以后,发现原来是数据库读取压力太大了,此时咱们都清楚 是到了读写分离的时候,这个时候我们会配置一个server为master节点,然后配几个salve节点,这样以来通过读写分离,使得读取数据的压力分 摊到了不同的salve节点上面,系统终于又恢复了正常,开始正常运行了。但是好景还是不长,有一天我们发现master这哥们撑不住了,它负载老高了, 汗流浃背,随时都有翘掉的风险,这个时候就需要咱们垂直分区啦(也就是所谓的分库),比如将商品信息,用户信息,交易信息分别存储到不同的数据库中,同时 还可以针对商品信息的库采用master,salve模式,OK,通过分库以后,各个按照功能拆分的数据库写压力被分担到了不同的server上面,这样 数据库的压力终于有恢复到正常状态。但是是不是这样,我们就可以高枕无忧了呢?NO,这个NO,不是我说的,是前辈们通过经验总结出来的,随着用户量的不 断增加,你会发现系统中的某些表会变的异常庞大,比如好友关系表,店铺的参数配置表等,这个时候无论是写入还是读取这些表的数据,对数据库来说都是一个很 耗费精力的事情,因此此时就需要我们进行“水平分区”了(这就是俗话说的分表,或者说sharding)。

上面说了很多,无非就是告诉大家一个事实“数据库是系统中最不容易scale out的一层”,一个大型的互联网应用必然会经过一个从单一DB server,到Master/salve,再到垂直分区(分库),然后再到水平分区(分表,sharding)的过程,而在这个过程中,Master /salve 以及垂直分区相对比较容易,对应用的影响也不是很大,但是分表会引起一些棘手的问题,比如不能跨越多个分区join查询数据,如何平衡各个shards的 负载等等,这个时候就需要一个通用的DAL框架来屏蔽底层数据存储对应用逻辑的影响,使得底层数据的访问对应用透明化。

出处:大型B2C网站高性能可伸缩架构技术探秘

又拍网架构中的分库设计

posted @ 2010-12-12 00:55 leekiang 阅读(698) | 评论 (0)编辑 收藏

书:
《深入理解MySQL》 即Expert MySQL
《MySQL核心内幕》
《深入理解MySQL核心技术》Understanding MySQL Internals
《MySQL技术内幕:InnoDB存储引擎》
《深入浅出MySQL--数据库开发、优化与管理维护》

ppt:
http://www.slideshare.net/caroljmcdonald/mysqlfordevelopers
http://www.slideshare.net/jackbillow/mysql-best-practices

讲座:
可扩展的MySQL数据库设计http://v.youku.com/v_playlist/f2614454o1p0.html

posted @ 2010-12-10 03:04 leekiang 阅读(256) | 评论 (0)编辑 收藏

git

NbGit是NetBeans的一款Git插件
安装步骤见:http://www.yinzhili.com/2010/03/add-git-support-for-netbeans.html

eclipse插件EGit
我是通过添加http://download.eclipse.org/egit/updates-0.11安装的,好像有两大类5个安装条目,我全部都选了。
windows下我没有安装msysgit,push到github没有使用ssh,使用的https。

没有搞懂分支的合并、HEAD等,感觉糊里糊涂的。

linux下安装git
yum install git-core 或 apt-get install git-core



http://progit.org/book/zh/
Git和Github初次使用
如何在eclipse上使用Github
Set up community dev environment
http://wiki.eclipse.org/EGit/User_Guide
EGit官方指南 
EGit基本功能操作

posted @ 2010-12-08 23:06 leekiang 阅读(277) | 评论 (0)编辑 收藏

1,
以下为秒的关系说明

10的18次方 |艾[可萨] | E
10的15次方 |拍[它] | P
10的12次方 |太[拉] | T
10的 9次方 |吉[咖] | G
10的 6次方 | 兆 | M
10的 3次方 | 千 | k
10的 2次方 | 百 | h
10的 1次方 | 十 | da
10的-1次方 | 分 | d
10的-2次方 | 厘 | c
10的-3次方 | 毫       |  ms    
millisecond
10的-6次方 | 微       |  μs    microsecond
10的-9次方 | 纳[诺] |  ns     nanosecond 也叫毫微秒
10的-12次方| 皮[可] |  ps     picosecond
10的-15次方| 飞[母托 |  fs     femtosecond
10的-18次方| 阿[托] |  as     attosecond 渺秒,即百亿亿分之一秒

一渺秒(十亿分之一秒的十亿分之一)
科学家是用渺秒来对瞬时事件进行计时的。
研究人员已经用稳定的高速激光产生了仅持续250渺秒的光脉冲。尽管这一时间间隔短得无法想像,但是和普朗克常数相比还是很长的。普朗克常数大约为10-43秒,被认为是可能持续的最短时间。

一纳秒(十亿分之一秒)
光在真空中一纳秒仅传播30厘米(不足一个步长)。个人电脑的微处理器执行一道指令(如将两数相加)约需2至4纳秒。
http://www.lob.cn/sl/service/566.shtml

2,CRC
循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。若CRC校验不通过,系统重复向硬盘复制数据,陷入死循环,导致复制过程无法完成。

posted @ 2010-12-08 01:23 leekiang 阅读(290) | 评论 (0)编辑 收藏

speq-mathematics http://www.appinn.com/speq-mathematics/
math-o-mir http://www.appinn.com/math-o-mir/
redcrab http://www.appinn.com/redcrab/
其他还有Latex、Word、MathML、MathType、Origin以及著名的mathematica

高级计算器+几何画板

posted @ 2010-11-25 00:53 leekiang 阅读(287) | 评论 (0)编辑 收藏

使用Telnet这个用来访问远程计算机的TCP/IP协议以控制你的网络设备相当于在离开某个建筑时大喊你的用户名和口令。很快会有人进行监听,并且他们会利用你安全意识的缺乏。传统的网络服务程序如:ftp、pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的,就是很容易受到“中间人”(man-in-the- middle)这种方式的攻击。所谓“中间人”的攻击方式,就是“中间人”冒充真正的服务器接收你的传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被“中间人”一转手做了手脚之后,就会出现很严重的问题。
  SSH是替代Telnet和其他远程控制台管理应用程序的行业标准。SSH命令是加密的并以几种方式进行保密。
  在使用SSH的时候,一个数字证书将认证客户端(你的工作站)和服务器(你的网络设备)之间的连接,并加密受保护的口令。SSH1使用RSA加密密钥,SSH2使用数字签名算法(DSA)密钥保护连接和认证。加密算法包括Blowfish,数据加密标准(DES),以及三重DES(3DES)。 SSH保护并且有助于防止欺骗,“中间人”攻击,以及数据包监听。
    通过使用SSH把所有传输的数据进行加密,这样“中间人”这种攻击方式就不可能实现了,而且也能够防止DNS和IP欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替telnet,又可以为ftp、pop、甚至ppp提供一个安全的“通道”。
    
SSH具有下列特性:
安全的远程登录
安全的文件传输
安全的远程执行命令
密钥和代理
访问控制以及端口转发
而这些,都是传统的telnet所不具备的!

ubuntu安装ssh:
sudo apt-get install openssh-server openssh-client
装上直接就开通了ssh服务,就可以远程登录


ssl是通讯链路的附加层。可以包含很多协议。https, ftps, .....
ssh只是加密的shell,最初是用来替代telnet的。通过port forward,也可以让其他协议通过ssh的隧道而起到加密的效果。
据我所知,secureFX和cuteftp支持sftp协议。ftprush支持ftp over ssh。flashFXP只支持ftp over ssl(ftps)
sftp有特殊的通讯端口和命令集(尽管和ftp命令类似),是和ssh平行的协议。建立连接的部分和ssh类似。一般情况下,带有ssh服务器端,也带有sftp服务(当然,你也可以不开)。
ftp over ssh就是建立连接时使用ssh协议,然后,利用ssh的转发,使用ftp的命令集来传输文件。也就是说,是建立在ssh协议上的ftp.

http://linux.chinaunix.net/bbs/viewthread.php?tid=819622
Ubuntu9.04下telnet和ssh服务的启用
SSL和SSH有什么区别?

posted @ 2010-11-23 16:58 leekiang 阅读(522) | 评论 (0)编辑 收藏

在做一个网站站内搜索中,使用lucene实现实时搜索时,我遇到了一对矛盾:在使用一个IndexSearcher单例时,搜索的效率极高,但是在 indexSearcher实例新建后新增的索引,这个单例是不可见的,除非我定时的去触发将这个IndexSearcher重新建一次,否则就不能搜索出最新的信息。假如我每来一个 request,就新建一个IndexSearcher实例,则可以搜索出最新的信息,但是,效率非常低。不知道大家有什么好的策略或插件,提出来讨论讨论。(我现在的策略是定时的reopen下insexSearcher)

可以使用这样的策略:
使用一个独立的线程去维护这个IndexSearcher,当索引有更新时,记录下索引已更新;当有request时,先去检验一下索引是否有更新,有则reopen后再查,无则直接查。

最简单的方法,用timer定时生成下indexSearcher,全文引擎有略微的延时也是可以接受的。

用2.3的包,有一个reopen()的方法,只会加载变化的索引片段。
每次索引更新之后,对于当前正在使用的IndexReader来说不是可见的,必须重新open一次Index,才能保证能够搜索到新加入的 document,2.3相当于做了一次增量的open。
每一次reopen前可以先判断一下是不是当前的索引文件,主要看有没有更新,
如果有更新,用reopen()方法打开,看它文档上说明是只加载更新了的索引文件,这样就不用全部重新打开了,时间主要耗在这里,如果判断结果是没有更新则直接返回那个实例就行了
IndexReader.reopen一直是没有实现的?

比如在你加了索引之后新生成一个searcher把那个单例给替换了 ,但是,当几十的并发增量索引过来的时候,就不能这么触发了,我现在只是弄了个timer,定时30秒钟来换个IndexSearcher实例。

the singleton of IndexSearcher will be more efficient.
see http://wiki.apache.org/lucene-java/ImproveSearchingSpeed

由于前一章所述的Lucene的事务性,使得Lucene可以增量的添加一个段,我们知道,倒排索引是有一定的格式的,而这个格式一旦写入是非常难以改变的,那么如何能够增量建索引呢?Lucene使用段这个概念解决了这个问题,对于每个已经生成的段,其倒排索引结构不会再改变,而增量添加的文档添加到新的段中,段之间在一定的时刻进行合并,从而形成新的倒排索引结构。
然而也正因为Lucene的事务性,使得Lucene的索引不够实时,如果想Lucene实时,则必须新添加的文档后IndexWriter需要commit,在搜索的时候IndexReader需要重新的打开,然而当索引在硬盘上的时候,尤其是索引非常大的时候,IndexWriter的commit操作和IndexReader的open操作都是非常慢的,根本达不到实时性的需要。
好在Lucene提供了RAMDirectory,也即内存中的索引,能够很快的commit和open,然而又存在如果索引很大,内存中不能够放下的问题。

所以要构建实时的索引,就需要内存中的索引RAMDirectory和硬盘上的索引 FSDirectory相互配合来解决问题。

Zoie 是linkedin支持的基于Lucene开源实时搜索引擎项目

  Solr  ( http://lucene.apache.org/solr/  )
说明:基于 Lucene 的企业级搜索的开箱即用的解决方案
优点:比较成熟的解决方案,也有很多的成功案例。Lucene 子项目,实现了大部分常见的搜索功能需求,包括 facet 搜索(搜索结果分类过滤)等。
缺点:可定制性比 Lucene 要差,一些不常见的需求,定制的难度比直接在 Lucene 上做要大的多。性能上,由于 Solr 的建索引和搜索是同一个进程,耦合度比较高,对于性能调优有一定的影响。

  直接使用 Lucene  ( http://lucene.apache.org  )
说明:Lucene 是一个 JAVA 搜索类库,它本身并不是一个完整的解决方案,需要额外的开发工作
优点:成熟的解决方案,有很多的成功案例。apache顶级项目,正在持续快速的进步。庞大而活跃的开发社区,大量的开发人员。它只是一个类库,有足够的定制和优化空间:经过简单定制,就可以满足绝大部分常见的需求;经过优化,可以支持10亿+ 量级的搜索。
缺点:需要额外的开发工作。所有的扩展,分布式,可靠性等都需要自己实现;非实时,从建索引到可以搜索中间有一个时间延迟,而当前的“近实时” (Lucene Near Real Time search)搜索方案的可扩展性有待进一步完善

2.9新版本引入了IndexWriter.getReader()方法,它可用于搜索目前完整的索引,包括当前IndexWriter会话中还没有提交的改变,这带来了接近于实时搜索的能力。此外,你还可以调用IndexWriter.setMergedSegmentWarmer()方法进行“预热”,这样那些片断便可以立即投入使用了。

2.9版本之前的版本,都是基于文本搜索的,因为对于很多数字的处理方式就很头疼,例如在我们项目中遇到的很多问题都是由于把数字当作了文本处理出现的 BUG:1、搜索价格的5,把包含.5的也搜索出来了;2、排序(降序)时,把800排到5000前面;……这些都是由于Lucene把所有的都作为文本处理的方式造成的问题。Lucene 2.9以后已经自带对数字的处理方式。Field和Query类会采取合适的精度进行索引和搜索,这样大大降低了需要搜索的关键字数量,使查询的响应能力得以显著提高。

我们web应用是好几台机器,而索引也有好几种,如果用lucene的话,定时更新不能保证所有服务器同步。如果用mount方式,lucen也有问题, 所以想用solr统一管理所有索引。然后让其它服务器从一个统一的地方查询索引。
http://lucene-group.group.javaeye.com/group/topic/23507


亿级数据的高并发通用搜索引擎架构设计 http://blog.s135.com/post/385/
http://lucene-group.group.javaeye.com/group/topic/2786
http://blog.fulin.org/2010/11/search_solutions_compare.html
http://www.javaeye.com/topic/117212
Twitter新搜索架构将采用开源Lucene http://cloud.csdn.net/a/20101008/280220.html?1286504886
用 Lucene构建实时的索引 http://www.cnblogs.com/forfuture1978/archive/2010/06/08/1753642.html
基于lucene实现自己的推荐引擎 http://blog.fulin.org/2010/10/recommendation_system_based_lucene.html
Lucene3.0(2.9)的主要变化 http://www.ourys.com/post/lucene3-0_about.html
Katta is a scalable, failure tolerant, distributed, data storage for real time access.

posted @ 2010-11-22 17:18 leekiang 阅读(1521) | 评论 (0)编辑 收藏

php版本5.2.17(VC6),apache版本2.2.17
1、在d盘下新建目录d:\web\www(当然,你可以随便建一个目录),用来存放php文件。

2、在apache安装目录下找到conf文件夹,点击进入,找到httpd.conf文件
  1)打开该文件,找到DocumentRoot(ServerName yueer:80)开头的一行文字,将引号里的目录改为你存放php文件的目录(d:/web/www),注意,这里所有的反斜杠(\)都要改为斜杠(/),因为它不支持(\)。修改后为DocumentRoot "D:/web/www"。
  2)找到<Directory "……">(省略号代表目录)将引号里的目录修改成和上一步中的一样。修改后为<Directory "D:/web/www">。
  3)找到DirectoryIndex index.html这一行,在后面添加(有空格)index.php。
  4)在文件的末尾添加下面文字
#用来加载php模块
LoadModule php5_module "D:/php5/php5apache2_2.dll"
#用于寻找php的php.ini文件
PHPIniDir "D:/php5"
#使apache支持php文件
AddType application/x-httpd-php .php
  5)修改httpd的端口号,搜“listen”

3、在Php5安装目录下找到php.ini-dist文件,将该文件改名为php.ini。
  1)打开文件,找到doc_root 开头的一行,将后面的路径改为存放php文件的目录(如doc_root ="D:\web\www")。
  2)找到extension_dir开头的文字,将后面路径改为存放php扩展文件的路径(扩展文件在php5安装目录下的ext文件夹下,如extension_dir = " D:\php5\ext ")。
  3)找到;extension=php_mysql.dll这一行,将前面的分号(;)去掉,使php5支持mysql。
  4)关闭保存该文件,将php.ini拷贝到C:\windows目录下。

4、将libmysql.dll和php5ts.dll复制的到C:\windows\systems32下。


我的问题:
1、php.ini一定要拷贝到C:\windows目录吗?
2、doc root目录在php.ini和apache的httpd.conf里都要配置吗?
3、我没有修改任何字符集设置,好像就已经支持utf-8了。








Download the VC6 builds if you are using the standard Apache.org web server. The VC9 builds should be used for the Apache Lounge binaries or IIS.
A Thread Safe version should be used if you install PHP as an Apache module. The Non Thread Safe version should be used if you install PHP as a CGI binary.



Linux下Php5+Mysql5+Apache2+GD2+Zend3最新版本软件编译安装步骤 http://keminar.linuxphp.org/archives/611.html
http://blogs.sitepoint.com/install-php53-windows/
Windows+XP下Php开发环境搭建
详解如何正确配置PHP开发环境(php5.3以前的版本这样配置)

posted @ 2010-11-21 01:27 leekiang 阅读(290) | 评论 (0)编辑 收藏

1,装好VMware之后,你可以发现多了两块虚拟网卡,VMware下你可以使用虚拟网卡进行联网设置及试验。
2,Suspend:挂起,可以让虚拟机记录下当前虚拟系统的状态,下次可以用Resume重新恢复选择挂起时的运行状态,以便接着工作。
3,不要在虚拟机中使用Ctrl+Alt+Del组合键,因为主机系统同样也会对这个组合键做出反应,你应当使用Ctrl+Alt+Ins来代替。
4,
虚拟机的启动过程和你的PC的启动过程也是没有什么不同的,一开始是自检,这时按F2可以进入BIOS设置。每一台虚拟机都有它自己的BIOS。请到BIOS中去设置启动顺序(这里的BIOS当然是虚拟机中的BIOS)。之后便可使用光盘来启动安装(虚拟机可以用光盘镜像如:ISO、vcd 文件作为光盘。比如从网上下载的Linux ISO文件,不需刻盘,可直接安装。软驱同理)。在光盘启动后要选择Text mode。实际上你即便是选择图形模式,安装程序检测后还是会跳到Text mode。而有时在检测的过程中会死机。在安装其他版本的Linux就没有这种情况。安装的时间可能比在一台单独的PC上安装的时间要略长。你会发现在虚拟机中的设备和你实际的设备完全不一样,VMware为了保证系统的兼容性和稳定性,把现有的设备都虚拟成了最标准的、兼容性最好的设 备。由于实际驱动设备的程序仍是在本机系统上运行的驱动程序,实际上的效率并没有多少降低。所以不要试图按照自己的机器配置系统。除此之外,在虚拟机中不 用也不能安装任何驱动程序。
5, VMware的快照(snapshot)类似于ghost,可以创建多个快照,然后在必要时可以恢复为某个快照。这个在做危险操作时很有用。
   可以在快照管理器里删除快照。
6,VMware的克隆(clone)可以生成原来虚拟机的一个完全的拷贝。
7,VMware支持主机和虚拟机上的文件拖拽。当然要传输文件也可以通过飞鸽进行。
8,切换鼠标焦点的快捷键:Ctrl+Alt,当然如果装了VMware Tools就可以不用快捷键了。还有个办法:Ctrl+Alt+Del

http://article.pchome.net/content-15989-1.html

posted @ 2010-11-21 00:00 leekiang 阅读(252) | 评论 (0)编辑 收藏

字体美化

1、把windows里的Fonts文件夹复制到linux的/home/zhangsan,然后

   sudo cp -r /home/zhangsan/Fonts /usr/share/fonts/ms-fonts

2、修改ms-fonts权限:sudo chmod 755 /usr/share/fonts/ms-fonts -R

3、

cd /usr/share/fonts
sudo mkfontdir
sudo mkfontscale
sudo fc-cache -fv

4 修改设置 系统->首选项->外观->字体
firefox->编辑->首选项->内容

http://www.fwolf.com/blog/post/170
http://forum.ubuntu.org.cn/viewtopic.php?t=19841
http://wenku.baidu.com/view/d462f1ec0975f46527d3e1fd.html

ubuntu10.10如何设置为中文显示:
System>Administration>Language Support
点击install,从列表里选择简体中文,系统会下载几十M的文件,然后重启
在登录界面里点击用户名,在屏幕下方有选择语言的设置,修改为中文。
这样出现一个新问题:更新管理器暂时不能用了,后来莫名其妙又好了。

参考:
xp字体安装

posted @ 2010-11-20 01:52 leekiang 阅读(225) | 评论 (0)编辑 收藏

http://www.d1ba.com/node/52
http://www.zen-cart.cn/forum/topic2819.html
http://hi.baidu.com/wj922/blog/item/03c1624f5247f1c4d0c86a57.html

java的有
SHOP++
jeshop http://code.google.com/p/jeshop
konakart http://www.konakart.com

http://www.oschina.net/project/tag/68/ecommerce?lang=19&os=0&sort=view

posted @ 2010-11-20 01:06 leekiang 阅读(294) | 评论 (0)编辑 收藏

1,
free -m 查看内存使用状况
watch -d free 连续监视内存使用情况

2,top
查看一个时刻更新的运行进程列表
子命令:
[q] 退出top
[Space] 立即刷新显示
[h] 显示帮助屏幕
[k] 杀死某进程。你会被提示输入进程 ID 以及要发送给它的信号。
[n] 改变要显示的进程数量。你会被提示输入数量。
[u] 按用户排序。
[M] 根据驻留内存大小(即RES列)进行排序。
[P] 按 CPU 用量排序。

3,
ps ax 显示一个当前系统进程的列表,是在你启用这项命令时正在运行的进程的快照
ps aux 显示当前进程以及它们的所有者
ps -ef 以全格式显示当前所有的进程。-e显示所有进程,-f全格式

4,
ls 列出当前目录文件(不包括隐含文件)
ls -a 列出当前目录文件(包括隐含文件)
ls -l 列出当前目录下文件的详细信息
ls -al 查看目录下所有目录和文件(包括隐藏文件)以及其属性

5,
df -h 查看硬盘剩余空间

6
pwd  打印当前工作目录,即print working Directory

7
查看环境变量,如echo $PATH

8,
改变用户的密码 sudo passwd USER_NAME

9,
Tab    自动补全或提示
Alt+/  可以补全文件名

10,
Unix的ipconfig命令:ifconfig

11,find,grep,locate
grep 强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来
find 在目录结构中搜索文件,并执行指定的操作,它是从指定目录开始分级查找,缺点是速度慢
locate 该命令在运行时需要后台索引的数据库作为支撑,在 Ubuntu 中这个数据库文件位于 /var/cache/locate/locatedb。一般来说,这个数据库文件每天是通过 cron 自动更新的。如果不幸没有得到更新,那么可以执行 sudo updatedb 来手动更新
whereis 查看命令所在路径,如whereis find

grep -A n , 获取匹配行及以下的n行。
grep -B n , 获取匹配行及以上的n行。
grep -C n , 获取匹配行及以上n行和以下n行。
grep -n  , 同 grep -C n

12, 查看端口占用,最好在root下执行
netstat   -anp   |   grep  8080
netstat   -anp   |   grep  mysql

13,tail
tail -f 持续跟踪文件的变化

14,touch
touch 1.txt 新建文本,若存在则更改最新时间,但内容不变

15,查看连接数
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TCP连接状态详解 
LISTEN:      侦听来自远方的TCP端口的连接请求
SYN-SENT:    再发送连接请求后等待匹配的连接请求
SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认
ESTABLISHED: 代表一个打开的连接
FIN-WAIT-1:  等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN-WAIT-2:  从远程TCP等待连接中断请求
CLOSE-WAIT:  等待从本地用户发来的连接中断请求
CLOSING:     等待远程TCP对连接中断的确认
LAST-ACK:    等待原来的发向远程TCP的连接中断请求的确认
TIME-WAIT:   等待足够的时间以确保远程TCP接收到连接中断请求的确认
CLOSED:      没有任何连接状态


16
ll 列出来的结果详细,有时间,是否可读写等信息 ,象windows里的详细信息。这个命令是一个alias。
ls 只列出文件名或目录名 就象windows里的

-a 列出目录下的所有文件,包括以 . 开头的隐含文件。

-l 列出文件的详细信息。

-t 以时间排序。
-F 在每个文件名后附上一个字符以说明该文件的类型,“*”表示可执行的普通文件;“/”表示目录;“@”表示符号链接;“|”表示FIFOs;“=”表示套接字(sockets)。
-A 显示除 “.”和“..”外的所有文件。

只列出子目录
ls -F | grep /$ 或者 alias sub = "ls -F | grep /$"(linux)
ls -l | grep "^d" 或者 ls -lL | grep "^d" (Solaris)

计算当前目录下的文件数和目录数
# ls -l * |grep "^-"|wc -l ---- to count files
# ls -l * |grep "^d"|wc -l ----- to count dir
显示彩色目录列表
打开/etc/bashrc, 加入如下一行:
alias ls="ls --color"
下次启动bash时就可以像在Slackware里那样显示彩色的目录列表了, 其中颜色的含义如下:
蓝色-->目录
绿色-->可执行文件
红色-->压缩文件
浅蓝色-->链接文件
灰色-->其他文件
17,du  df
du  即disk usage,统计目录(或文件)所占磁盘空间的大小
du -sh
du 不是显示文件大小,而是显示文件所占用的 block 大小,
默认linux系统分区的 block size 是4k,也就是说即使文件只有1个字节,也会占用4k.
http://zhidao.baidu.com/question/139754470.html

18,排序命令sort, wc, uniq
wc 统计指定文件中的字节数、字数、行数, 并将统计结果显示输出
last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l
cat /etc/man.config | wc

19, tar  在linux上是常用的打包、压缩、解压缩工具
参数:
-c : create 建立压缩档案的参数;
-x : 解压缩压缩档案的参数;
-z : 是否需要用gzip压缩;
-v: 压缩的过程中显示档案;
-f: 置顶文档名,在f后面立即接文件名,不能再加参数

tar -zxvf /home/test.tar.gz  把此文件解压到当前目录
tar -cvf /home/www/images.tar /home/www/images  只打包,不压缩
tar -zcvf /home/www/images.tar.gz /home/www/images  打包并且以gzip压缩

20,
rmdir 删除空目录
rm -rf /home/test    the r is recursive(递归) and f is force,如果不用-rf,可能就会报错:
rm: cannot remove `/home/test': Is a directory

21,cp
-a   :相当于 -pdr
cp -a /www/test /tmp  复制/www/test这个目录下的所有内容到/tmp底下

linux cp命令介绍

22,mv 移动或重命名
mv a b 将目录a重命名为b

30,
rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync
需要先安装

31,Ubuntu中root用户和user用户的相互切换
sudo su
su usr

40,traceroute 跟踪路由,与ping -R有区别,见http://baike.baidu.com/view/416531.htm
windows下与之对应的是tracert


鸟哥的 Linux 私房菜 第十一章、认识与学习BASH

Linux Shell脚本编写详解
Ubuntu 命令技巧
Ubuntu 学习笔记
http://soft.chinabyte.com/os/169/11412169.shtml
http://dbajun.javaeye.com/blog/135324

“man 命令”与“命令 --help"相比,后者的显示结果要友好一些。

posted @ 2010-11-20 00:33 leekiang 阅读(307) | 评论 (0)编辑 收藏

Lucene是作为嵌入式的工具包的形式出现的,在核心代码上没有提供对群集的支持。实现对Lucene的群集有三种方式:1、继承实现一个Directory;2、使用Solr 3、使用 Nutch+Hadoop;使用Solr你不得不用他的Index Server ,而使用Nutch你又不得不集成抓取的模块;
不选择使用lucene的6大原因 http://forchenyun.javaeye.com/blog/473779

Lucene集群  lucene in a cluster
http://blog.csdn.net/jsea/archive/2006/06/16/803043.aspx
http://hi.baidu.com/lucenehc/blog/item/4d83c387881ea22fc65cc3a1.html

Compass的Lucene Jdbc Directory implementation
Compass simplifies the creation of distributed Lucene index by allowing to store the Lucene index in a database, as well as storing the index simply with Data Grid products such as GigaSpaces, Coherence  and Terracotta
这部分代码完全独立于Compass 的其他模块,可以使用在纯Lucene实现的环境中
http://robbank.blogbus.com/logs/3509279.html
http://robbank.blogbus.com/logs/4698460.html

solr本身支持分布式索引,是利用rsync来做的
http://paradise-qingfeng.javaeye.com/blog/123673

Nut是一个Lucene+Hadoop分布式搜索框架
http://code.google.com/p/nutla/
http://www.blogjava.net/nianzai/


Nutch 0.9版中,分布式搜索的核心部分只用了不到1000行代码就搞定了。
clustering是把查询请求分发到多台计算机上,主要是解决并发量的问题。
Distributed指的是多台计算机并行处理一个查询请求,使单个请求的检索时间降低
http://lucene-group.group.javaeye.com/group/topic/8983


谈谈Hadoop和分布式 Lucene http://www.chinacloud.cn/show.aspx?id=50&cid=12


1,Doug Cutting (Lucene-Nutch-Hadoop 创始人简介)http://zhutuncun0.javaeye.com/blog/746019
2,luke,lucene索引查看工具 http://code.google.com/p/luke/
3,Alfresco  看看这种CMS在集群环境下如何使用lucene
   http://wiki.alfresco.com/wiki/Cluster_Configuration_V2.1.3_and_Later#Lucene_index_synchronization

posted @ 2010-11-19 17:37 leekiang 阅读(3197) | 评论 (0)编辑 收藏

   第三方应用通过以下四个步骤来完成认证授权并访问或修改受限资源
   1. 获取未授权的Request Token
   2. 请求用户授权Request Token
   3. 使用授权后的Request Token换取Access Token
   4. 使用 Access Token 访问或修改受保护资源
   
   
   
   
   
   http://www.williamlong.info/archives/2185.html
   http://www.douban.com/service/apidoc/auth
   http://haolloyin.blog.51cto.com/1177454/412445
   http://haolloyin.blog.51cto.com/1177454/410776
   http://blog.csdn.net/hereweare2009/archive/2009/03/08/3968582.aspx
   http://tools.ietf.org/html/rfc5849

posted @ 2010-11-18 14:12 leekiang 阅读(227) | 评论 (0)编辑 收藏

1,ORM 层将数据库表映射到类、将记录映射到对象、将字段映射到对象的属性。
类方法用于执行表级别的操作,实例方法则用于执行针对单条记录的操作。
2,Action Pack包含了视图和控制器
3,rails有三种方式创建动态的模板,其一是使用“构建器”(Builder)这种技术,
其二是将Ruby代码嵌入模板中,第三种是rjs在服务器端动态产生js
4,<% 3.times do %>
Ho!<br />
<% end %>
Merry Christmas!
<% 3.times do %> 会输出空格,而<% 3.times do -%> 不会
5,Rails 的辅助方法h()用于对html符号转码
6,如果货品的价格发生变化,那么已经下好的订单不应该受到影响,因此每个订单条目都应该反映下单时的货品价格
7,erb的content_for(:name)标签里的内容可加到模板<%=yield :name%>所处位置
8,敏捷书第三版上说金额不要用float字段,而要用decimal字段

posted @ 2010-11-15 14:57 leekiang 阅读(255) | 评论 (0)编辑 收藏

当一个类已经很好的同步以保护它的数据时,这个类就称为“线程安全的”。
即使是线程安全类,也应该特别小心,因为操作的线程是间仍然不一定安全。

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

public class TestThread {
    
public static void main(String[] args) {
        
final NameList nl = new NameList();
        nl.add(
"aaa");
        
class NameDropper extends Thread {
            
public void run() {
                String name 
= nl.removeFirst();
                System.out.println(name);
            }
        }
        Thread t1 
= new NameDropper();
        Thread t2 
= new NameDropper();
        t1.start();
        t2.start();
    }
}

class NameList {
    
private List nameList = Collections.synchronizedList(new LinkedList());

    
public void add(String name) {
        nameList.add(name);
    }
    
public String removeFirst() {//removeFirst方法必须同步
        if (nameList.size() > 0) {
            
try {
                Thread.sleep(
100);
            } 
catch (InterruptedException e) {
                e.printStackTrace();
            }
            
return (String) nameList.remove(0);
        } 
else {
            
return null;
        }
    }
}



http://lavasoft.blog.51cto.com/62575/99155

posted @ 2010-11-15 13:53 leekiang 阅读(279) | 评论 (0)编辑 收藏

活用Dynamic Pannel(以下简称DP)
DP的功能很强,几乎是Axure里的灵魂了。这里介绍一个技巧,帮你系统条理的组织你的文件结构:
在做RIA或者软件产品的Prototype时,一般都有N个对话框要用。一般我们都是用 DP来做对话框,默认Hidden,事件触发时再设为Visiable。
这里的技巧是,把所有的对话框都做在一个DP里(不同的 State),事件触发的时候在Set这个DP到相应的State。
一般,对话框最深层叠是2-3层。我的做法是做3个DP,分别为“一级面板”、“二级面板”、“三级面板”,再把各个对话框做到各自层级的DP里去。
有时候需要对话框的位置不是都在界面中心的,这里可以把这三个DP的尺寸调整为覆盖整个界面,那么在编辑State的时候,把内容放在相应的位置即可。
来源:http://slanyao.blog.163.com/blog/static/76880504201057112324406/

posted @ 2010-11-11 13:45 leekiang 阅读(348) | 评论 (0)编辑 收藏

从“产品需求文档”(PRD)到“产品设计文档”(PDD)

posted @ 2010-11-10 16:17 leekiang 阅读(237) | 评论 (0)编辑 收藏

用“看板图”实现敏捷项目的可视化http://www.infoq.com/cn/articles/agile-kanban-boards
敏捷项目管理工具初探http://www.yeeach.com/digg/story/20194

posted @ 2010-11-01 11:53 leekiang 阅读(339) | 评论 (0)编辑 收藏

给敏捷团队中的架构师的10个建议http://www.infoq.com/cn/news/2010/09/Tips-Architect-Agile-Team
炫目的敏捷架构师http://blog.csdn.net/programmer_editor/archive/2009/06/04/4242453.aspx
敏捷架构思考http://www.yeeach.com/2010/06/06/%E6%95%8F%E6%8D%B7%E6%9E%B6%E6%9E%84%E6%80%9D%E8%80%83/
敏捷开发中的架构设计http://tech.it168.com/a2009/0827/669/000000669667.shtml
在敏捷开发中采用演进式架构设计http://www.agiledon.com/post/Agile/Evolutionary-Design-In-AgileProcess.html
敏捷开发实践真的不利于架构设计吗?http://www.infoq.com/cn/news/2007/07/AgileBadForDesign

posted @ 2010-11-01 11:51 leekiang 阅读(288) | 评论 (0)编辑 收藏

ubuntu上安装配置netbeans
http://forum.ubuntu.org.cn/viewtopic.php?f=88&t=256293


安装mysql
http://wiki.ubuntu.org.cn/MySQL
http://forum.ubuntu.org.cn/viewtopic.php?p=157127

linux常用命令
http://linux.chinaitlab.com/special/linuxcom/

Ailurus
Ailurus is cross-Linux-distribution GPL software. It is a simple application installer and GNOME tweaker, which aims at making GNOME easier to use.
小熊猫 Ailurus 是一个 Linux 增强软件,提供安装好用的软件、调整系统设置、提示 Linux 命令技巧等等贴心的功能。
http://code.google.com/p/ailurus/
安装:
sudo add-apt-repository ppa:ailurus
sudo apt-get update
sudo apt-get install ailurus

安装jedit
(1)下载jedit4.3.2install.jar
(2)java -jar jedit4.3.2install.jar

安装Adobe Reader
到官网,默认下载的是AdobeReader_chs-8.1.7-1.i486.rpm,感觉不妥,手动选择下载AdobeReader_chs-8.1.7-1.i386.deb,
执行sudo dpkg -i AdobeReader_chs-8.1.7-1.i386.deb,默认会装到 /opt 目录下
也可以双击进行安装。

ubuntu Tweak是一款专门为Ubuntu(GNOME桌面)准备的配置、调整工具。
ubuntu-tweak.com下载deb文件后双击安装,安装后会出现在应用程序->系统工具里。
感觉Tweak有的功能 Ailurus都有了。

还有一些软件可搜索"喀纳斯Ubuntu 10.10 i386中文定制版发布"
http://www.douban.com/group/topic/14952403/

posted @ 2010-11-01 00:20 leekiang 阅读(330) | 评论 (0)编辑 收藏

http://jqfundamentals.com/book/

posted @ 2010-10-29 17:16 leekiang 阅读(395) | 评论 (0)编辑 收藏

windows下的安装要点
1,下载EasyPHP5.2.10和dotproject_2.1.3
2,安装EasyPHP5.2.10,把dotproject解压到www下
3,访问http://localhost/dotproject,系统会有提示
4,访问http://127.0.0.1/home/mysql,使用phpmyadmin创建数据库dotproject和用户
5,再次访问http://localhost/dotproject,点击安装
6,把conf_files\php.ini的972行session.save_path = "/tmp" 左边的分号去掉,同时可把/tmp改为c:/tmp
  另外session.auto_start = 0改为1的话起什么作用
7,默认的系统管理员是admin/passwd
8,到网上找到dotproject-zh-pack-2.1.1-by-hutuworm2.tar.gz,解压到locales目录
  在系统管理设置语言为zh,然后退出重登
9,甘特图不能显示,在\lib\jpgraph\src的jpg-config.inc文件里加一行DEFINE("CATCH_PHPERRMSG",false);
  出处:http://jpgraph.intellit.nl/index.php?topic=3341.msg9248#msg9248

网上资源:
1,有一个几十页的"dotproject使用说明.pdf"
2,台湾一所大学的几个研究生出了一份研究报告,比较详细
3,有一本电子书Packt.Publishing.Project.Management.with.dotProject.pdf
4,项目管理利器-DotProject应用指南

如果要使用EasyPHP的phpmyadmin访问其他mysql,可在phpmyadmin目录下的config.inc.php里配置
$cfg['Servers'][$i]['host'] = '192.168.1.29:2366';
$cfg['Servers'][$i]['user'] = 'test';
$cfg['Servers'][$i]['password'] = '123456';

posted @ 2010-10-29 00:47 leekiang 阅读(621) | 评论 (0)编辑 收藏

http://www.mongodb.org/display/DOCS/MongoDB+Data+Modeling+and+Rails
视觉中国的NoSQL之路:从MySQL到MongoDB

posted @ 2010-10-28 22:12 leekiang 阅读(218) | 评论 (0)编辑 收藏

负载均衡软件:Nginx、LVS、HAProxy

HAProxy: The Reliable, High Performance TCP/HTTP Load Balancer,好像是用c语言写的


posted @ 2010-10-27 23:21 leekiang 阅读(363) | 评论 (0)编辑 收藏

用的版本1.2.1
必须跑在ruby1.8.7和rails2.3.8,否则出各种问题
要执行rake db:schema:load,把schema.rb里设定的数据表结构同步到数据库

http://www.soft4fun.net/website-recommand/%E7%B6%B2%E7%AB%99%E6%8E%A8%E8%96%A6-%E8%B6%85%E4%BE%BF%E5%88%A9%E7%B6%B2%E8%B7%AF%E8%A8%98%E4%BA%8B%E7%B3%BB%E7%B5%B1-clockingit%EF%BC%88%E5%A4%9A%E7%94%A8%E6%88%B6%E4%BD%BF%E7%94%A8%E7%AF%87.htm
http://www.soft4fun.net/website-recommand/%E7%B6%B2%E7%AB%99%E6%8E%A8%E8%96%A6-%E8%B6%85%E4%BE%BF%E5%88%A9%E7%B6%B2%E8%B7%AF%E8%A8%98%E4%BA%8B%E7%B3%BB%E7%B5%B1%EF%BC%8C%E5%B9%AB%E4%BD%A0%E8%A8%98%E4%B8%8B%E6%89%80%E6%9C%89%E7%94%9F.htm

posted @ 2010-10-21 00:08 leekiang 阅读(288) | 评论 (0)编辑 收藏



2,安装mysql(包括mysql的gem,还有那个libmySQL.dll要拷入到ruby/bin下)并建立名为"redmine"的schema
mysql> create database redmine character set utf8;
mysql> create user 'redmine'@'localhost' identified by 'redmine';
mysql> grant all privileges on redmine.* to 'redmine'@'localhost';

3,生成session密钥,执行数据迁移并载入Redmine默认配置
set RAILS_ENV=production
rake config/initializers/session_store.rb
rake db:migrate
rake redmine:load_default_data
注:1)lib\tasks\initializers.rake里定义了,rank generate_session_store等价于rake config/initializers/session_store.rb
   2)rake  redmine:load_default_data RAILS_ENV="production"
     可导入角色、权限、跟踪类型、问题状态、工作流程、枚举值的默认数据,见loader.rb

5,项目有一个"是否公开"属性

6,工作台可以自定义

7,群英汇翻译的用户手册http://www.oschina.net/bbs/thread/9314,管理员手册http://www.oschina.net/bbs/thread/9437
  http://www.ossxp.com/doc/redmine/user_guide/user_guide.html
  http://www.ossxp.com/doc/redmine/admin_guide/admin_guide.html
  群英汇的统一认证平台http://www.ossxp.com/HelpCenter/10000_Jigsaw
 
  Techcon ezWORK团队任务管理系统也是基于redmine开发的,http://ezwork.techcon.thtf.com.cn/
 
8,插件列表http://www.redmine.org/wiki/redmine/Plugin_List
  http://www.ossxp.com/doc/redmine-plugins/下有几个插件的使用手册
  http://www.javaeye.com/topic/224772
  http://github.com/zouchaoqun/ezfaq/tree/master/app/
 
9,redmine权限设置心得
http://www.cnblogs.com/treeman/archive/2010/08/30/1812692.html

10,组使用的表也是users表

11,ticket分组插件
    http://www.redmine.org/boards/3/topics/4701,http://github.com/Ubik/redmine_issues_group
    另外一个http://www.redmine.org/issues/443
12,redmine高版本已经支持任务的无限嵌套,但界面没有体现

20,bitnami提供的傻瓜安装包,见http://bitnami.org/stack/redmine

posted @ 2010-10-15 16:34 leekiang 阅读(676) | 评论 (0)编辑 收藏

1,Rails系统重构:从单一复杂系统到多个小应用集群http://www.infoq.com/cn/articles/rails-app-refactoring
2,http://www.smashingmagazine.com/2010/10/26/successful-freelancing-with-ruby-on-rails-workflow-techniques-and-tools/
3,http://www.rubyinside.com/11-tips-on-hiring-a-rails-developer-662.html
4,http://www.rubyinside.com/how-to-get-a-job-at-a-top-ruby-shop-1618.html
5,http://www.matthewpaulmoore.com/ruby-on-rails-code-quality-checklist
6,Ruby on Rails性能问题解决之道

posted @ 2010-10-15 16:33 leekiang 阅读(256) | 评论 (0)编辑 收藏

1,gem install railroad 装的版本是0.5.0
2, 安装graphviz-2.26.3.msi
3, 在应用目录下railroad -M | dot -Tsvg > models.svg,报错:
C:/Ruby186/lib/ruby/gems/1.8/gems/railroad-0.5.0/lib/railroad/app_diagram.rb:54:
in `reopen': No such file or directory - /dev/null (Errno::ENOENT)
   搜到篇文章说把c:/Ruby186/lib\ruby\gems\1.8\gems\railroad-0.5.5\lib\railroad下的app_diagram.rb的54行改为STDOUT.reopen('NUL:')
把controllers_diagram.rb的39行改为require "app/controllers/application_controller.rb"
按要求修改后在应用下执行railroad -a -i -M | dot -Tpng > models.png,又报:
D:/netbeansWorkSpace/redmine/vendor/rails/activesupport/lib/active_support/w
hiny_nil.rb:52:in `method_missing': undefined method `klass' for nil:NilClass (N
oMethodError)

注:ruby为1.8.6,rails为2.3.5
参考:
http://www.javaeye.com/topic/88700
http://blog.brzezinka.eu/webmaster-tips/ruby/ror-railroad-plugin-with-rails-2-3-5-on-windows-error


该文章后面讲了如何使用rake自动生成,copy如下:
To automate the process of creating schemes, you can create Rails task. In your rails_project_dir/Libs/tasks create diagrams.rake and copy the text:
namespace :doc do
  namespace 
:diagram do
    task 
:models do
      sh 
"railroad -a -i -M | dot -Tpng > doc/models.png"
      sh 
"railroad -i -l -a -m -M | dot -Tsvg doc/models.svg"
    end

    task 
:controllers do
      sh 
"railroad -i -l -C | neato -Tsvg > doc/controllers.svg"
    end
  end

  task 
:diagrams => %w(diagram:models diagram:controllers)

end

Now you can run the task by typing in console: rake doc:diagrams to generate all diagrams (for models an controllers) or rake doc:diagram:models to generate diagram for models only.

Due to the information on RailsRoad Docs, there is a bug in Graphvis while crating svg graphic. There is a simple way to correct it (citation from RailsRoad Docs):

Important: There is a bug in Graphviz tools when generatingSVG files that cause a text overflow. You can solve this problem editing (with a text editor, not a graphical SVG editor) the file and replacing around line 12 „font-size:14.00;” by „font-size:11.00;„, or by issuing the following command (see „man sed„):

sed -i 's/font-size:14.00/font-size:11.00/g' file.svg

Note: For viewing and editing SVG there is an excellent opensource tool called Inkscape (similar to Adobe Illustrator.) For DOTprocessing you can also use Omnigraffle (on Mac OS X).



posted @ 2010-10-14 18:56 leekiang 阅读(329) | 评论 (0)编辑 收藏

有两种含义:
1,开源性能测试ApacheBench
   http://jackei.cnblogs.com/archive/2006/07/18/454144.html
2,互联网营销人员的优化手段

posted @ 2010-10-14 12:49 leekiang 阅读(282) | 评论 (0)编辑 收藏

1,安装ruby1.8.6-p398,把添加环境变量那一项打勾
2,安装rails
  gem install rails -v=2.3.5
3,安装rdoc,版本为rdoc-2.5.11.gem
http://rubyforge.org/frs/?group_id=627
没有安装rdoc-data-2.5.3.gem,不知道有没有问题
4,在Mysql安装目录的bin 目录下,找到 ibmySQL.dll ,将该文件Copy到 Ruby安装目录的 bin目录中。
到http://rubyforge.org/projects/mysql-win下载安装mysql-2.8.1-x86-mswin32.gem
5,乱码的问题参见http://www.javaeye.com/topic/66347
  修改MySQL的配置文件C:\Program Files\MySQL\MySQL Server 5.0\my.ini,改其中的两处default-character-set=utf8,改完后重启MySQL,schema也要重建.
  mysql的编码有没有改过来以字段的编码为准。
  我发现经netbeans6.9编辑过的erb文件的编码为utf-8无BOM
6,在项目路径下执行rake gems:install,会自动安装environment.rb里标明的gem
  如果rake gems:install RAILS_ENV=test,那么会自动安装config\environments\test.rb里标明的gem
  这些gem都会安装到C:\ruby\lib\ruby\gems\1.8\gems下。如果同一个gem在多个项目中版本不一样如何处理
7,rake rails:update是对旧rails版本的项目进行升级吗?
8,使用sqlite3
  gem install sqlite3-ruby
  下载http://www.sqlite.org/sqlitedll-3_6_23_1.zip,解压放到ruby\bin下。
  test:
  adapter: sqlite3
  database: db/test.sqlite3
  pool: 5
  timeout: 5000

posted @ 2010-10-13 17:13 leekiang 阅读(553) | 评论 (0)编辑 收藏

1. 介绍

Web开发框架安全杂谈


2. web安全检测工具paros

2.1. 步骤

  1. 设置IE代理为localhost:8080
  2. 在IE里访问链接
  3. 扫描Analyse->scan
  4. Report->Last scan report 生成Report

2.2. 参考

  1. http://www.51testing.com/html/37/n-111337.html
  2. http://www.webcastellum.org
  3. http://searchsoftwarequality.techtarget.com/expert/KnowledgebaseAnswer/0,289625,sid92_gci1218180,00.html
  4. http://weblogs.java.net/blog/caroljmcdonald/archive/2009/09/29/top-10-web-application-security-vulnerabilities-starting-xss

3. Google发布的Web应用安全检测工具skipfish

http://code.google.com/p/skipfish
Google的自动Web安全扫描程序Skipfish下载及使用方法


4.WATOBO是一个Web应用程序工具箱,它是一个旨在帮助专业安全人员执行高效率的(半自动)Web应用程序安全审计的工具。它类似于一个本地代理,在运行中分析网络通信寻找有用的信息和漏洞。它还具备自动扫描功能。能扫描SQL注入,跨站脚本和更多安全问题。
http://sourceforge.net/projects/watobo/

posted @ 2010-09-21 14:48 leekiang 阅读(521) | 评论 (0)编辑 收藏

http://waffle.codeplex.com/
Windows Authentication Functional Framework

posted @ 2010-08-01 14:18 leekiang 阅读(369) | 评论 (0)编辑 收藏

    public void testBigDecimalEquals() {
        assertEquals(new BigDecimal("3.50"),new BigDecimal("3.5"));//不相等
    }

 System.out.println(0.030*100);//输出3.0
 System.out.println(0.031*100);//输出3.1
 System.out.println(0.032*100);//输出3.2
 System.out.println(0.033*100);//输出3.3000000000000003
 System.out.println(0.034*100);//输出3.4000000000000004
 System.out.println(0.035*100);//输出3.5000000000000004
 System.out.println(0.036*100);//输出3.5999999999999996
 System.out.println(0.037*100);//输出3.6999999999999997
 System.out.println(0.038*100);//输出3.8
 System.out.println(0.039*100);//输出3.9
 
 BigDecimal b2 = new BigDecimal(0.236);
 System.out.println(b2);//输出0.2359999999999999875655021241982467472553253173828125
 
 描述:
 当我们使用一些"特殊的数字"进行运算时,或者调用BigDecimal中new BigDecimal(double val)进行构造的时候,将得到意想不到的结果。
 原因:
 Java中,浮点类型是依据IEEE754标准的。IEEE754定义了32位和64位双精度两种浮点二进制小数标准。采用二进制表示double,float等浮点数是不准确的。
同时BigDecimal的API声明,建议使用new BigDecimal(String val)进行构造,使用new BigDecimal(double val)进行构造的时候,将得到意想不到的结果(The results of this constructor can be somewhat unpredictable)。

解决办法:
1,通过String结合BigDecimal来转换。
String val = "0.236";
//使用new BigDecimal(String val)进行构造
BigDecimal a = new BigDecimal(""+val);
BigDecimal b = new BigDecimal(""+100);
//小数的位数与构造参数的位数一致
System.out.println(a.multiply(b));//输出23.600

2,使用DecimalFormat来确定小数点后位数
double val = 0.236*100;
//保留小数点后两位,若保留三位为"#.000"
DecimalFormat df = new DecimalFormat("#.00");
String str = df.format(val);
System.out.println(Double.valueOf(str));//输出23.6

感谢
http://www.blogjava.net/kalman03/archive/2010/10/25/336121.html

posted @ 2010-07-27 18:22 leekiang 阅读(1281) | 评论 (0)编辑 收藏

SSHTools is a suite of Java SSH applications providing a Java SSH API, SSH Terminal, SSH secured VNC client, SFTP client and SSH Daemon.

posted @ 2010-07-20 02:33 leekiang 阅读(290) | 评论 (0)编辑 收藏

Mikogo 易于使用的跨平台桌面共享软件
Groove 协作办公软件
免费项目管理软件GanttPV可替微软Project
ZoneMinder 开源视频监控系统
Puppet 强大的中心化配置管理系统
Spark是一个开源,跨平台Jabber/XMPP客户端。它的特性支持集组聊天,电话集成和强大安全性能。如果企业内部部署IM使用Openfire+Spark是最佳的组合.为啥用Openfire?我们选型时对比了WildFire和Oracle的RTC,感觉还是WidlFire更简便。 基于开源jabber(XMPP)架设内部即时通讯服务的解决方案

posted @ 2010-07-17 15:08 leekiang 阅读(440) | 评论 (0)编辑 收藏

http://www.javaeye.com/topic/470144
http://www.javaeye.com/topic/121756
http://www.javaeye.com/topic/57909
http://www.javaeye.com/topic/400225
http://www.blogjava.net/weijy/archive/2008/09/27/231449.html
http://blog.sina.com.cn/s/blog_537a7ce301008o4y.html
http://lengyue-dick.javaeye.com/blog/247347
http://qdjinxin.javaeye.com/blog/674082

posted @ 2010-06-29 19:19 leekiang 阅读(259) | 评论 (0)编辑 收藏

Post/Redirect/Get (PRG) is a common design pattern for web developers to help avoid certain duplicate form  submissions and allow user agents to behave more intuitively with bookmarks and the refresh button.
PRG模式也称为post-redirect pattern或Redirect-After-Post pattern

http://forum.springsource.org/showthread.php?t=73939
http://jira.springframework.org/browse/MOD-458
http://jira.springframework.org/browse/SPR-6464
http://blog.vichasconsulting.com/archives/12
http://forum.springsource.org/showthread.php?t=38466
http://www.docin.com/p-56268947.html

posted @ 2010-06-07 13:34 leekiang 阅读(238) | 评论 (0)编辑 收藏

基本步骤:
1,在测试计划上右键添加线程组,然后在线程组面板里有几个输入栏:线程数、Ramp-Up Period(in seconds)、循环次数,其中Ramp-Up Period(in seconds)表示在这时间内创建完所有的线程。如有8个线程,Ramp-Up = 200秒,那么线程的启动时间间隔为200/8=25秒
2,在线程组里添加-->取样器(sampler)->http请求,注意路径不包括服务器地址
3,添加监听器,可以用“用表格查看结果”或第2个“图形结果”等,"查看结果树"可以让你查看每个sampler的请求数据和响应数据

tips:
1,使用HTTP Cookie Manager或URL重写实现同一线程内的多个请求共享Session
2,把Login的请求放到只执行一次的控制器中,那么即使循环多次,Login也只请求一次
3,为了节省系统资源,使用非窗口模式运行JMeter(jmeter -n -t test.jmx)
4,如果模拟并发用户过多,比如200线程,那么可以分散到多台机器上运行Jmeter(比如4台电脑,每台50线程)
5,可以用badboy工具录制.jmx脚本

参考:
http://www.51testing.com/?128005/action_viewspace_itemid_69407.html
http://www.ibm.com/developerworks/cn/opensource/os-pressiontest/
http://blog.chenlb.com/2009/03/jmeter-quick-start.html
http://rdc.taobao.com/blog/qa/?p=2287
http://qa.taobao.com/?p=6216
http://www.blogjava.net/BlueDavy/archive/2008/07/25/217514.html

posted @ 2010-05-27 18:37 leekiang 阅读(627) | 评论 (0)编辑 收藏

1,为什么要写 if (log.isDebugEnabled())
在使用log4j,common-log这样的log框架时,发现很多代码中这样写
if   (log.isDebugEnabled())   {
          log.debug( "xxxx ");
}

我很奇怪,为什么要与log.isDebugEnabled()?既然log.debug()在没有指定输出级别为DEBUG时不会有输出,为什么还要在 前面加一个isDebugEnabled()的判断?
答:
为了效率,如果上述那个代码那么简单是没有必要的
但是如果这样
if   (log.isDebugEnabled())   {
          log.debug(buildFullString());
}
如果这个buildFullString效率不太高,那么如果直接写log.debug(buildFullString());的话
虽然它不会打印语句,但是buildFullString还是被执行了,这样就白费了功夫
所以加上isDebugEnabled就可以避免执行buildFullString了
这个方法一般用在认为buildFullString这个函数效率不太高的情况下

http://topic.csdn.net/u/20070119/16/e9cf879c-697b-482a-9d55-21bfb7a16216.html

posted @ 2010-05-27 14:14 leekiang 阅读(371) | 评论 (0)编辑 收藏

1,http://www.javaeye.com/topic/143987
在新版本的java里面,同步比gc慢
所以以前很多framework里面都有pool的设定,现在都取消了
现在只有一些数据库连接等IO资源做pool以外,基本的数据class已经都不作pool了
pool 一般用在创建很大消费的对象时才用的。 比如 connection, tapestry的page。 像new HashMap这样的 是没有必要的。

posted @ 2010-05-26 18:51 leekiang 阅读(523) | 评论 (1)编辑 收藏

Grails 复杂查询及分页排序

如何配置输出hibernate SQL statement
有几种方法:
1. Modify conf\Config.groovy
    Change hibernate="off" to on
    但是这种方式输出的Hibernate信息比较多。
2. Modify DataSource.groovy
    Add logSql = true
    But didn't work now for Grails 1.0 RC4
3. Modify GRAILS_HOME\scripts\log4j.properties, add
    log4j.logger.org.hibernate.SQL=DEBUG
    这是目前最佳的方法
见http://hi.baidu.com/jacksonchenjp/blog/item/0fef184f9e2bac32aec3ab08.html

http://www.javaeye.com/topic/52774
http://www.javaeye.com/topic/149489
http://www.javaeye.com/topic/250349
http://garyli.javaeye.com/blog/237100
http://seanwon.javaeye.com/blog/315677
http://bloodwolf-china.javaeye.com/blog/264035
http://bloodwolf-china.javaeye.com/blog/644420
http://stackoverflow.com/questions/2124157/acl-on-field-level-in-grails

Basic Tomcat clustering for Grails applications

posted @ 2010-05-26 18:49 leekiang 阅读(286) | 评论 (0)编辑 收藏

1,与Light集成?
http://www.grails.org/Portal+Functionality

2,
This presentation describes a simple way to build a working framework for a user portal. This framework is built upon some very popular features in Grails and provides many examples of Grails plug-in integration and use of some of the more complex features of Grails such as integrating Ajax with Groovy Server Pages.

The presentation describes a step-by-step approach to using the convention based paradigm in Grails to create a simple User Portal. It walks through the process of creating a web flow based upon the Spring Web-Flow product included within Grails. The last topic focuses on implementing Grails user interface components and integrating them with the Grails Portal code. Each of these areas are presented by outlining the principles and the decision process involved in creating the components and then showing how to use the results of the work in a specific business case.

http://code.google.com/p/grailsportal

posted @ 2010-05-25 22:49 leekiang 阅读(528) | 评论 (0)编辑 收藏

public class UsersTest extends AbstractTransactionalDataSourceSpringContextTests {
    private IDatabaseTester databaseTester;

    @Override
    protected void onSetUp() throws Exception {
        databaseTester = new JdbcDatabaseTester("oracle.jdbc.driver.OracleDriver",
                "jdbc:oracle:thin:@localhost:1521:orcl", "test", "test");
        IDataSet dataSet = getDataSet();
        databaseTester.setDataSet(dataSet);
        databaseTester.onSetup();
    }

    @Override
    protected void onTearDown() throws Exception {
        databaseTester.onTearDown();
    }

    protected IDataSet getDataSet() throws Exception {
        String path = "users.xml";
        InputStream in = this.getClass().getResourceAsStream(path);
        return new FlatXmlDataSetBuilder().build(in);
    }
}

Unitils是一个简化测试开发,提高测试维护性的一个工具集
Dbdeploy是Thoughtworks公司开发的数据库工具,获得Jolt大奖

posted @ 2010-05-23 19:35 leekiang 阅读(412) | 评论 (0)编辑 收藏

因为要处理遗留代码,需要在 gog 中使用手工事务, 在 resources.groovy 中进行如下定义后

  1. testDataSourceTxManager(DataSourceTransactionManager){  
  2.     dataSource = ref('dataSource')  
  3. }  

 发现 service 中的事务没了。

 查了一下 Grails 的源码, 原来 grails 在进行事务管理器查找的时候,并不是用的 bean 名字去查找,而是查找 所有 是 TransactionManager 实例 的 Bean, 并从得到的数组中 取第一个作为事务管理器。

 因此要使用 spring 的 DataSourceTransactionManager 的, 就不能将这个 Manager 在 Context 中定义了。只能通过自己 new 一个 单例的 DataSourceTransactionManager, 然后将 DataSource 传入,这样就可以用了..........

来源:http://phoenix-clt.javaeye.com/blog/430400


http://osdir.com/ml/lang.groovy.grails.user/2008-04/msg00663.html

How to operate the partition table with Hibernate & GORM

Sorry I had been on a business trip for a few days
Although the Hibernate Shards has some urgent limitations, like 'Cross-Shard
Object Graphs' , it is a wonderful solution for this. But the Hibernate
Shards has implemented its own Session/SessionFactory(etc.), maybe bring
GROM some troubles.

Thanks for your reply. And to look forward to that GROM can support
Hibernate Shards.


To take an advantage of the Spring JDBC Template for any Grail application, the first thing you need to do, is to define the DataSource bean in resources.groovy , Don't forget to have the jdbc driver(.jar) corresponding to your backend database server under the lib folder of your grail application.


http://www.rimple.com/tech/2010/3/25/calling-postgresql-stored-procedures-from-grails-part-1-the.html

http://www.blogjava.net/rain1102/archive/2008/07/18/215891.html

posted @ 2010-05-23 04:57 leekiang 阅读(521) | 评论 (0)编辑 收藏

http://www.ibm.com/developerworks/cn/opensource/os-cn-shiro/index.html
grails-spring-security-core

posted @ 2010-05-23 00:34 leekiang 阅读(456) | 评论 (0)编辑 收藏

1,基于Flash图表组件Open Flash Chart的chart插件
http://svn.codehaus.org/grails-plugins/grails-ofchart
http://mybytes.wordpress.com/2009/03/09/grails-open-flash-chart-06-is-out/

posted @ 2010-05-21 00:55 leekiang 阅读(291) | 评论 (0)编辑 收藏

1.使用AbstractTransactionalSpringJbpmTestCase做测试时出错
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'processEngine' defined in class path resource [applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [protected org.jbpm.api.ProcessEngine org.jbpm.pvm.internal.processengine.SpringHelper.createProcessEngine()] threw exception; nested exception is org.jbpm.api.JbpmException: no org.jbpm.pvm.internal.tx.SpringTransaction in current environment
解决办法:
在jbpm.cfg.xml的<transaction-context>里加上一行
<transaction type="spring" />

2.
 如果使用了
<bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper" />
<bean id="processEngine" factory-bean="springHelper" factory-method="createProcessEngine" />
就不需要通过Configuration构造了,可以通过spring里的依赖注入获得processEngine
包括什么repositoryService,taskService都不要进行bean配置了













https://jira.jboss.org/browse/JBPM-2710
http://jbpm.group.javaeye.com/group/topic/18352
http://ronghao.javaeye.com/blog/412956
http://xiaokaiye.javaeye.com/blog/413136
http://jbpm.group.javaeye.com/group/blog/375061
http://www.slideshare.net/ainze/spring-integration-with-jbpm4#
http://www.blogjava.net/vanlin/archive/2009/10/12/297903.html
http://n.tomek.bujok.info/index.php/Spring_integration_in_jBPM_4

posted @ 2010-05-17 18:02 leekiang 阅读(956) | 评论 (0)编辑 收藏

在windows上直接gem安装rmagick时报Building native extensions.   Error installing rmagick windows

1 从http://rubyforge.org/projects/rmagick/ 下载rmagick-win32 对应的zip包.没找到ruby1.8.7和1.9的,只好先下1.8.6的
2 解压zip到一个临时目录,在该目录中有一个ImageMagick的ext安装文件,安装。
3 开一个命令行窗口,cd到解压的临时目录,敲入命令: gem install rmagick.
4.ImageMagick 的安装路径放到path环境变量里面

可能出现的问题:
1.CORE_RL_magick_.dll找不到?
ImageMagick 的安装路径放到path环境变量里面去就OK了。
2.gem install rmagick 失败
更新gem的 版本( gem update --system)

参考http://wxmfly.javaeye.com/blog/216787

posted @ 2010-05-17 03:12 leekiang 阅读(417) | 评论 (0)编辑 收藏

数据仓库的出现,并不是要取代数据库。目前,大部分数据仓库还是用关系数据库管理系统来管理的。可以说,数据库、数据仓库相辅相成、各有千秋。
数据库是面向事务的设计,数据仓库是面向主题设计的。
数据库一般存储在线交易数据,数据仓库存储的一般是历史数据。
数据库设计是尽量避免冗余,一般采用符合范式的规则来设计,数据仓库在设计是有意引入冗余,采用反范式的方式来设计。 数据库是为捕获数据而设计,数据仓库是为分析数据而设计,它的两个基本的元素是维表和事实表。

简单的说:   
    1、事实就是你要关注的内容;   
    2、维度是描述事物特征的一个角度。例如门店销售情况需要分析商品销售的时间、地点、商品名等。这里的时间、地点、商品名就是门店销售情况的分析维度。
例如,某地区商品的销量,是从地区这个角度观察商品销量的。事实表就是销量表,维表就是地区表。

1、数据仓库是面向主题的,主题就是所要解决问题的领域
2、数据仓库是集成的,数据仓库的数据有来自于分散的操作型数据,将所需数据从原来的数据中抽取出来,进行加工与集成,统一与综合之后才能进入数据仓库;
3、相对稳定,数据仓库的数据主要供企业决策分析之用,所涉及的数据操作主要是数据查询,一旦某个数据进入数据仓库以后,一般情况下将被长期保留,也就是数据仓库中一般有大量的查询操作,但修改和删除操作很少,通常只需要定期的加载、刷新。
4、反映历史变化

数据仓库数据库
是整个数据仓库环境的核心,是数据存放的地方和提供对数据检索的支持。相对于操纵型数据库来说其突出的特点是对海量数据的支持和快速的检索技术。
数据仓库数据库的结构与一般的表结构不一样
元数据
   元数据是描述数据仓库内数据的结构和建立方法的数据。可将其按用途的不同分为两类,技术元数据和商业元数据。


数据仓库的解决方法包括:将决策支持型数据处理从事务型数据处理中分离出来。数据按照一定的周期(通常在每晚或者每周末),从事务型数据库中导入决策支持型数据库——既“数据仓库”。数据仓库是按回答企业某方面的问题来分“主题”组织数据的,这是最有效的数据组织方式。

信息化的实施,是没有终点的,它是一个持续优化的过程,BI的实施,尤其如此。随着业务系统的深入应用,流程会发生变化;随着管理的侧重点不同,领导关注的数据也会不同。这都需要重新修改数据仓库与分析模型
关键词一:时间维度
时间维度虽是数据仓库中的最核心的维度之一,但表面上来看,仅是日期而已,是非常简单的。很容易忽略一个很常见的问题:对于企业来说,通常会有两种时间:一种是自然日历时间,另一种则是财务使用的会计时间。有很多企业,因为上市的原因,采取某个4月1日至第二年3月31日来定义财年,或因为历史的习惯,每个月从26号到次月的25日为会计期间。在操作中,业务部门肯定是按自然时间来录入与查询信息,而财务部门则按照会计时间来进行记账与出报表,在这种情况下,就需要建立一种规则,来识别自然时间与会计时间的对应关系。
关键词三:增量更新
数据仓库的创建不是一次完成的,它必然要根据业务系统数据的更新而更新。如何实现增量更新?这是建立数据仓库时最大的技术难点。增量更新意味着它必须识别哪些数据发生过变化?如增加/修改了哪些客户资料?增加/修改了哪些订单?


数据仓库中的三种事实表
Transaction fact table(事务事实表),比如交易记录,
Periodic snapshot fact table(周期快照事实表),我觉得月累,年累就是属于这种类型
Accumulating snapshot fact table(累积快照事实表)累积快照事实表和周期快照事实表有些相似之处,它们存储的都是事务数据的快照信息。但是它们之间也有着很大的不同,周期快照事实表记录的确定的周期的数据,而累积快照事实表记录的不确定的周期的数据.对这个似懂非懂。

由于事实是一种度量,所以事实表中的这种指标往往需要具有数值化和可加性的特征。但是在事实表中,只有那些具有完全可加性的事实才能根据所有的维度进行累加而具有意义。而事实表有一些事实表示的是某种强度,这类事实就不具有完全加法性,而是一种半加法性。例如,账目余款反映的是某个时间点的数据,它可以按照地点和商品等大多数维度进行累加,但是对于时间维度则例外,将一年中每个月的账目余款进行累加是毫无意义的,而决策者则可能需要了解所有地区和所有商品账目余款的累加值。在事实表中还有一些事实是非加法性的,即这些事实具有对事实的描述特性,在这种情况下一般要将这些非加法性事实转移到维度表中。

数据仓库与数据集市
数据仓库是企业级的,能为整个企业各个部门的运行提供决策支持手段;而数据集市则是一种微型的数据仓库,它通常有更少的数据,更少的主题区域,以及更少的历史数据,一般只能为某个局部范围内的管理人员服务,因此也称之为部门级(工作组级)数据仓库。
数据仓库中数据结构采用规范化结构(第三范式),数据集市中的数据结构采用星型模式或雪片模式,通常仓库中数据粒度比集市的粒度要细
http://www.chinabi.net/blog/user1/105/archives/2006/388.html
http://blog.csdn.net/dreamwdt/archive/2008/03/19 /2197084.aspx

参考:
http://www.blogjava.net/sterning/archive/2007/12/14/167739.html
http://book.51cto.com/art/200710/58849.htm等

posted @ 2010-05-14 17:34 leekiang 阅读(507) | 评论 (0)编辑 收藏

Coverlipse是一个用于Cobertura 的Eclipse 插件,
Cobertura是一个基于jcoverage的代码覆盖率工具,它能够显示哪一部分代码被你的测试所覆盖,并可生成HTML或XML报告.
http://www.ibm.com/developerworks/cn/java/j-cobertura/
http://www.ibm.com/developerworks/cn/java/j-ap01117/

subclipse切换中英文
在eclipse\configuration\config.ini文件里加一行osgi.nl=en_US或osgi.nl=zh

posted @ 2010-05-13 11:58 leekiang 阅读(254) | 评论 (0)编辑 收藏

SQLAlchemy
SQLAlchemy是python的一个有名的数据库ORM,简单易用,功能强大,不需要什么xml,生成的SQL脚本干净简洁。
SQLAlchemy 的 ORM 遵从 DataMapping 设计模式,而 Elixir 则是在 SQLAlchemy 基础上的一层 ActiveRecord 模式的实现,它使用一套类似 RoR 的 ActiveRecord 系统的领域语言语法,从此开发者可以用一种更加简洁的方式对 SQLAlchemy 的强大功能进行访问

posted @ 2010-05-11 18:21 leekiang 阅读(289) | 评论 (0)编辑 收藏

来源:http://bbs.xml.org.cn/blog/more.asp?name=hongrui&id=10283

JdbcTemplate为什末包含javax.sql.DataSource ,而不是用connections,因为使用DataSource有很多优点,
我们在复杂的应用中如果使用connections(当然可以使用 DataSource.getConnection()得到),
必须捕捉SQLExceptions,这样spring框架无法处理 SQLException异常,在抛出异常时,无法关闭connection。
connection为什末不能共享?DataSource.getConnection()得到connection实例,一般都不相同,这由连接池的具体实现控制,
所以大家不要使用oracle的临时表,因为如果每次连接都不一样的话,下次就没有临时表了。
建立连接是消耗时间的,在一段时间内,connection只能由一个用户使用,为了避免transaction产生冲突,一些jdbc驱动不支持多线程访问同一个connection。还有一个更致命的问题,众所周知,transaction是基于connection的,即使多个用户使用一个连接,大家在一个事务内操作数据库,一个数据库操作rollback,所有的数据库操作全部rollback,所以一直保持一个打开的connection代价是很大的。
我只有在两个方法中处理一个事务时,把 connection作为变量传递。

关于statement,resultset和connection的问题

statement,resultset属于弱refrence,即如果statement关掉,resultset就会被自动释构,弱 refrence的做法不保险,所以JDBC3.0开始明确规定了如果connection被关,所有statement都应该关,不过这取决于使用的数据库驱动。
应该DBMS 执行操作后,显式的关闭statement ,因为在connection关闭前,JDBC statement仍旧处于打开状态,当返回resultset后,关闭statement是必要的,尤其在遇到异常的时候。
如果不使用 connection pool可以直接关闭connection,不考虑statement的关闭,使用连接池的时候,务必关闭statement,否则你的连接马上被用光,使用statement pooling除外。

posted @ 2010-05-06 10:21 leekiang 阅读(1465) | 评论 (0)编辑 收藏

192.168.108.25/AppA的a.jsp里有一个iframe为b.jsp,a和b跨域,如何让这个iframe自适应高度?

a.jsp
<iframe src="http://192.168.2.97/AppB/b.jsp" id="b_iframe"  scrolling="no"  frameborder="0"></iframe>

b.jsp
<iframe id='c_iframe'  height='0' width='0' src='http://192.168.108.25/AppA/c.jsp' style='display:none' ></iframe>
<script>
var b_height = Math.max(document.body.scrollHeight,document.body.clientHeight);
var c_iframe = document.getElementById('c_iframe');
c_iframe.src = c_iframe.src+'#'+b_height;
</script>

c.jsp
<script>
    var hash_url = window.location.hash;
    var hash_height = hash_url.split('#')[1]+'px';
    var b_iframe = window.parent.parent.document.getElementById('b_iframe');
    b_iframe.style.height = hash_height;
</script>

posted @ 2010-05-04 11:00 leekiang 阅读(400) | 评论 (0)编辑 收藏

需要查询某字段是否包含一个值111是否存在于1111,2111,1112,1121,1113,中 ,
因为根据","逗号分开,要求的答案是:不存在。

用传统的like '%111,%',显然不合适,这样虽然111不存在但是依然能查到该条记录。
所以应该用以下语句实现:
select * from Table where ','+columA  like '%,111,%'

like '%AAA%'   这样的左右模糊查询不能用上索引,Oracle没法通过B-TREE找到相应的叶子节点,位图索引也是一样
而like '...%'和 Like '%...'是可以走索引的,后者需要reverse一下

使用where instr(column_name,'AAA')> 0没有什么效果


如果确定like部分选择性很强,试试:
select * from xxfl where rowid in (select rowid from xxfl where hphm like '%34443%' ) and jgsj between to_date('xxxx-xx-xx xx:xx:xx','yyyy-mm-dd hh24:mi:ss') and to_date('xxxx-xx-xx xx:xx:xx','yyyy-mm-dd hh24:mi:ss');

参考:
http://www.javaeye.com/topic/653713
http://www.itpub.net/viewthread.php?tid=1218563
http://sandish.itpub.net/post/4899/464369

别人的笔记:
sql中的like '%xx%'模糊查询无法走索引,影响执行速度。经测试itpub版主ifree的index_ffs+rowid方法比较有效,记录一下。
这里是示例:
scott@ORCL> CREATE INDEX SCOTT.i_dept_name
  2   ON SCOTT.DEPT(DNAME)
  3  ;

Index created.

scott@ORCL> Analyze Table SCOTT.DEPT Compute Statistics ;

Table analyzed.

scott@ORCL> select * from scott.dept where
  2  rowid in (
  3  select /*+ index_ffs(a i_dept_dname) */
  4  rowid from scott.dept a where dname like '%A%')
  5  ;

这个方法要求like查询出的记录不能太多,在我的应用中,这一方法使sql效率提高了近10倍。

posted @ 2010-04-28 11:02 leekiang 阅读(2152) | 评论 (1)编辑 收藏

CAP原理(CAP Theorem)
Consistency(一致性), 数据一致更新,所有数据变动都是同步的
Availability(可用性), 好的响应性能
Partition tolerance(分区容错性) 可靠性

CAP原理指的是,这三个要素最多只能同时实现两点,不可能三者兼顾
http://www.javaeye.com/articles/2367


BASE模型反ACID模型,完全不同ACID模型,牺牲高一致性,获得可用性或可靠性:
Basically Available基本可用。支持分区失败(e.g. sharding碎片划分数据库)
Soft state软状态 状态可以有一段时间不同步,异步。
Eventually consistent最终一致,最终数据是一致的就可以了,而不是时时高一致。
http://lovewhzlq.javaeye.com/blog/619965

Sharding:
Sharding(分片),与分区(Partition)不一样,分区不能跨数据库
http://www.dbanotes.net/database/database_sharding.html

posted @ 2010-04-26 00:20 leekiang 阅读(480) | 评论 (0)编辑 收藏

今天做一个jsp的验证码程序,把验证码的绘制写在一个jsp里,发现在调用时总是出现getOutputStream() has already been called for this response异常,搞得一头雾水,看似自己重复调用了,因为在程序最后是这样输出的
ImageIO.write(image, “JPEG”, response.getOutputStream());
但是仔细检查了程序,并没有问题,不过最后还是解决了,问题出在%>与<%之间的空行,把换行都去掉就OK了。
因为Application Server在处理编译jsp时对于%>和<%之间的内容一般是原样输出,而且默认是PrintWriter,而你却要进行流输 出:ServletOutputStream,这样做相当于试图在Servlet中使用两种输出机制,就会发生getOutputStream() has already been called for this response的错误
详细请见《More Java Pitfill》一书的第二部分 Web层Item 33:试图在Servlet中使用两种输出机制 270
而且如果有换行,对于文本文件没有什么问题,但是对于其它格式,比如AutoCAD、Word、Excel等文件
下载下来的文件中就会多出一些换行符0×0d和0×0a,这样可能导致某些格式的文件无法打开,有些也可以正常打开。

posted @ 2010-04-22 11:57 leekiang 阅读(365) | 评论 (0)编辑 收藏

String regex = "<a.*?/a>";//取链接
        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        Matcher mt = pattern.matcher(str);
        while (mt.find()) {
        String s=mt.group();
        }
        String regex2 = ">.*?</a>";// 标题部分
        String regex3 = "imgs/[([0-9])]+.(jpg|gif|png|bmp)";//取图片

输入例子可产生正则表达式
http://sourceforge.net/projects/quickrex/

在线测试
http://www.fileformat.info/tool/regex.htm

posted @ 2010-04-21 12:30 leekiang 阅读(259) | 评论 (0)编辑 收藏

rails2.0为了防范CSRF (Cross-Site Request Forgery)攻击,提供了一个小小的手段,那就是protect_from_forgery

http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html

posted @ 2010-04-19 01:46 leekiang 阅读(290) | 评论 (0)编辑 收藏

Oracle DBA 两日速成课程

posted @ 2010-04-17 22:20 leekiang 阅读(291) | 评论 (0)编辑 收藏

工具:testlink

posted @ 2010-04-17 21:45 leekiang 阅读(214) | 评论 (0)编辑 收藏

三次握手Three-way Handshake

一个虚拟连接的建立是通过三次握手来实现的

1. (B) --> [SYN] --> (A)

假如服务器A和客户机B通讯. 当A要和B通信时,B首先向A发一个SYN (Synchronize) 标记的包,告诉A请求建立连接.

注意: 一个 SYN包就是仅SYN标记设为1的TCP包(参见TCP包头Resources). 认识到这点很重要,只有当A受到B发来的SYN包,才可建立连接,除此之外别无他法。因此,如果你的防火墙丢弃所有的发往外网接口的SYN包,那么你将不 能让外部任何主机主动建立连接。

2. (B) <-- [SYN/ACK] <--(A)

接着,A收到后会发一个对SYN包的确认包(SYN/ACK)回去,表示对第一个SYN包的确认,并继续握手操作.

注意: SYN/ACK包是仅SYN 和 ACK 标记为1的包.

3. (B) --> [ACK] --> (A)

B收到SYN/ACK 包,B发一个确认包(ACK),通知A连接已建立。至此,三次握手完成,一个TCP连接完成

Note: ACK包就是仅ACK 标记设为1的TCP包. 需要注意的是当三此握手完成、连接建立以后,TCP连接的每个包都会设置ACK位

这就是为何连接跟踪很重要的原因了. 没有连接跟踪,防火墙将无法判断收到的ACK包是否属于一个已经建立的连接.一般的包过滤(Ipchains)收到ACK包时,会让它通过(这绝对不是个 好主意). 而当状态型防火墙收到此种包时,它会先在连接表中查找是否属于哪个已建连接,否则丢弃该包

四次握手Four-way Handshake

四次握手用来关闭已建立的TCP连接

1. (B) --> ACK/FIN --> (A)

2. (B) <-- ACK <-- (A)

3. (B) <-- ACK/FIN <-- (A)

4. (B) --> ACK --> (A)

注意: 由于TCP连接是双向连接, 因此关闭连接需要在两个方向上做。ACK/FIN 包(ACK 和FIN 标记设为1)通常被认为是FIN(终结)包.然而, 由于连接还没有关闭, FIN包总是打上ACK标记. 没有ACK标记而仅有FIN标记的包不是合法的包,并且通常被认为是恶意的

连接复位Resetting a connection

四次握手不是关闭TCP连接的唯一方法. 有时,如果主机需要尽快关闭连接(或连接超时,端口或主机不可达),RST (Reset)包将被发送. 注意在,由于RST包不是TCP连接中的必须部分, 可以只发送RST包(即不带ACK标记). 但在正常的TCP连接中RST包可以带ACK确认标记

请注意RST包是可以不要收到方确认的?

无效的TCP标记Invalid TCP Flags

到目前为止,你已经看到了 SYN, ACK, FIN, 和RST 标记. 另外,还有PSH (Push) 和URG (Urgent)标记.

最常见的非法组合是SYN/FIN 包. 注意:由于 SYN包是用来初始化连接的, 它不可能和 FIN和RST标记一起出现. 这也是一个恶意攻击.

由于现在大多数防火墙已知 SYN/FIN 包, 别的一些组合,例如SYN/FIN/PSH, SYN/FIN/RST, SYN/FIN/RST/PSH。很明显,当网络中出现这种包时,很你的网络肯定受到攻击了。

别的已知的非法包有FIN (无ACK标记)和"NULL"包。如同早先讨论的,由于ACK/FIN包的出现是为了关闭一个TCP连接,那么正常的FIN包总是带有 ACK 标记。"NULL"包就是没有任何TCP标记的包(URG,ACK,PSH,RST,SYN,FIN都为0)。

到目前为止,正常的网络活动下,TCP协议栈不可能产生带有上面提到的任何一种标记组合的TCP包。当你发现这些不正常的包时,肯定有人对你的网络不怀好意。

来源:http://doubao.javaeye.com/blog/267207
http://hi.baidu.com/abcserver/blog/item/aa1a347310c335148601b07c.html

posted @ 2010-04-14 18:43 leekiang 阅读(755) | 评论 (0)编辑 收藏

浏览器默认对同一域下的资源,只允许保持一定的连接数,这里的域应该是支持二级域,
浏览器默认最大并发连接数
浏览器HTTP 1.1HTTP 1.0
IE 6,724
IE 866
Firefox 228
Firefox 366
Safari 3, 444
Chrome 1,26?
Chrome 344
Opera 9.63,10.00alpha44

http协议无状态,无连接。无连接的含义就是限制每次连接只处理一个请求,收到应答后即断开。但据说这个是http1.0。   
http1.1里,提出了持久连接(persistent connection)的概念,也就是说同一条 HTTP连接,可以依次处理多个请求。

突然想到,ajax的异步是相对这个浏览器而言,就ajax的这个请求来说,还是同步的。

参考:
http://www.stevesouders.com/blog/2008/03/20/roundup-on-parallel-connections/
主流浏览器并发连接数
网站的最大并发连接数
各个浏览器并发连接数比较

posted @ 2010-04-14 18:32 leekiang 阅读(2112) | 评论 (0)编辑 收藏

Adding Socket Timeout to java.net.URLConnection (JDK 1.2)

found a bug , see "connected = true;" in public void connect() throws IOException {


Note: 05/11/01 Sam Found a patch for borland

As I got the email:

Just writing to inform you theis patch for 1.3 works with the 1.3 shipped with borland JBuilder 4 (not sure which excat version it is)

the only problems I had where that the code was a bit messed up, following are the changes made to it to make it work.

				
public void SetTimeout(int i)
throws SocketException
{
this.timeout = i; // Should be i not -1 <------------ERROR
serverSocket.setSoTimeout(i) ;
}

public boolean parseHTTP(MessageHeader header, ProgressEntry entry)
throws java.io.IOException
{
if( this.timeout != -1 ) {
try {
serverSocket.setSoTimeout(timeout) ; // should be timeout not i <---------------ERROR
} catch( SocketException e ) {
throw new java.io.IOException("unable to set socket timeout!") ;
}
}

return super.parseHTTP(header, entry) ;
}
Sam

Under JDK 1.3, which is HTTP 1.1 compatible, the InterruptedIOException gets caught by the socket I/O routines and ignored. input is read in "chunks". I debugged the existing code under 1.3, the Timeout is getting set properly etc., but the exception gets caught in the underlying I/O routines, which have a single retry if any IOExceptions are thrown. Thanks a lot Sun....

3/22/01: Patch for JDK 1.3 unverified

Patch code for JDK 1.3 from Matt Ho (unverified)

				
----[ snip ]----

import sun.net.www.MessageHeader ;
import sun.net.ProgressEntry ;

.
.
.

private int timeout = -1 ;

public void SetTimeout(int i)
throws SocketException
{
this.timeout = -1 ;
serverSocket.setSoTimeout(i) ;
}

public boolean parseHTTP(MessageHeader header, ProgressEntry entry)
throws java.io.IOException
{
if( this.timeout != -1 ) {
try {
serverSocket.setSoTimeout(i) ;
} catch( SocketException e ) {
throw new java.io.IOException("unable to set socket timeout!") ;
}
}

return super.parseHTTP(header, entry) ;
}

----[ snip ]----

On with the rest of the stuff

The BSD socket API supports a timeout option (the option is SO_TIMEOUT), which is also supported in java.net.socket. Unfortunately, java.net.URLConnection does not expose the underlying socket. So if you have a URL connection that attempts to connect to a dead URL (i.e., the URL is well formed and exists but the site is down), the socket will eventually timeout using the operating system's default timeout (420 seconds on Win NT). The timeout is a very long time, e.g., for spiders or URL checking.

The following files illustrate a technique to introduce a socket timeout to URL connection, based upon the actual java source code itself (see the open source community licensing at JavaSoft).

The Base classes, or URLConnection internals

Java's implementation of networking is protocol independent, as well as object oriented. Therefore the implementation is not as straightfoward as one might imagine.

URLConnection relies upon several internal classes using a client/server model as well as a "factory" design pattern. The client's base class is sun.net.www.http.HttpClient. This class is extended for the purpose of exposing the socket.

The default factory is URLStreamHandlerFactory, which indirectly "handles" the creation of an HTTP client by instantiating a class that is specific to the HTTP protocol: sun.net.www.protocol.http.Handler. The handler actually creates the client.

In practice, the factory is only necessary to mimic java's implementation, but only the Handler is really needed.

Derived Classes

We derive 4 classes so as to preserve the symmetry with the java source code:

HttpURLConnectionTimeout extends sun.net.www.protocol.http.HttpURLConnection
HttpTimeoutHandler extends sun.net.www.protocol.http.Handler
HttpTimeoutFactory implements java.net.URLStreamHandlerFactory
HttpClientTimeout extends sun.net.www.http.HttpClient

On with the source code.


HttpURLConnectionTimeout

// whatever package you want
import sun.net.www.http.HttpClient;
import java.net.*;
import java.io.*;
public class HttpClientTimeout extends HttpClient
{
public HttpClientTimeout(URL url, String proxy, int proxyPort) throws IOException
{
super(url, proxy, proxyPort);
}

public HttpClientTimeout(URL url) throws IOException
{
super(url, null, -1);
}

public void SetTimeout(int i) throws SocketException {
serverSocket.setSoTimeout(i);
}

/* This class has no public constructor for HTTP. This method is used to
* get an HttpClient to the specifed URL. If there's currently an
* active HttpClient to that server/port, you'll get that one.
*
* no longer syncrhonized -- it slows things down too much
* synchronize at a higher level
*/
public static HttpClientTimeout GetNew(URL url)
throws IOException {
/* see if one's already around */
HttpClientTimeout ret = (HttpClientTimeout) kac.get(url);
if (ret == null) {
ret = new HttpClientTimeout (url); // CTOR called openServer()
} else {
ret.url = url;
}
// don't know if we're keeping alive until we parse the headers
// for now, keepingAlive is false
return ret;
}

public void Close() throws IOException
{
serverSocket.close();
}

public Socket GetSocket()
{
return serverSocket;
}


}

HttpTimeoutFactory

import java.net.*;

public class HttpTimeoutFactory implements URLStreamHandlerFactory
{
int fiTimeoutVal;
public HttpTimeoutFactory(int iT) { fiTimeoutVal = iT; }
public URLStreamHandler createURLStreamHandler(String str)
{
return new HttpTimeoutHandler(fiTimeoutVal);
}

}

HttpTimeoutHandler

import java.net.*;
import java.io.IOException;

public class HttpTimeoutHandler extends sun.net.www.protocol.http.Handler
{
int fiTimeoutVal;
HttpURLConnectionTimeout fHUCT;
public HttpTimeoutHandler(int iT) { fiTimeoutVal = iT; }

protected java.net.URLConnection openConnection(URL u) throws IOException {
return fHUCT = new HttpURLConnectionTimeout(u, this, fiTimeoutVal);
}

String GetProxy() { return proxy; } // breaking encapsulation
int GetProxyPort() { return proxyPort; } // breaking encapsulation

public void Close() throws Exception
{
fHUCT.Close();
}

public Socket GetSocket()
{
return fHUCT.GetSocket();
}
}

HttpURLConnectionTimeout

import java.net.*;
import java.io.*;
import sun.net.www.http.HttpClient;

public class HttpURLConnectionTimeout extends sun.net.www.protocol.http.HttpURLConnection
{
int fiTimeoutVal;
HttpTimeoutHandler fHandler;
HttpClientTimeout fClient;
public HttpURLConnectionTimeout(URL u, HttpTimeoutHandler handler, int iTimeout) throws IOException
{
super(u, handler);
fiTimeoutVal = iTimeout;
}

public HttpURLConnectionTimeout(URL u, String host, int port) throws IOException
{
super(u, host, port);
}

public void connect() throws IOException {
if (connected) {
return;
}
try {
if ("http".equals(url.getProtocol()) /* && !failedOnce <- PRIVATE */ ) {
// for safety's sake, as reported by KLGroup
synchronized (url)
{
http = HttpClientTimeout.GetNew(url);
}
fClient = (HttpClientTimeout)http;
((HttpClientTimeout)http).SetTimeout(fiTimeoutVal);
} else {
// make sure to construct new connection if first
// attempt failed
http = new HttpClientTimeout(url, fHandler.GetProxy(), fHandler.GetProxyPort());
}
ps = (PrintStream)http.getOutputStream();
} catch (IOException e) {
throw e; }
// this was missing from the original version
connected = true;
}

/**
* Create a new HttpClient object, bypassing the cache of
* HTTP client objects/connections.
*
* @param url the URL being accessed
*/
protected HttpClient getNewClient (URL url)
throws IOException {
HttpClientTimeout client = new HttpClientTimeout (url, (String)null, -1);
try {
client.SetTimeout(fiTimeoutVal);
} catch (Exception e)
{ System.out.println("Unable to set timeout value"); }
return (HttpClient)client;
}

/**
* opens a stream allowing redirects only to the same host.
*/
public static InputStream openConnectionCheckRedirects(URLConnection c)
throws IOException
{
boolean redir;
int redirects = 0;
InputStream in = null;

do {
if (c instanceof HttpURLConnectionTimeout) {
((HttpURLConnectionTimeout) c).setInstanceFollowRedirects(false);
}

// We want to open the input stream before
// getting headers, because getHeaderField()
// et al swallow IOExceptions.
in = c.getInputStream();
redir = false;

if (c instanceof HttpURLConnectionTimeout) {
HttpURLConnectionTimeout http = (HttpURLConnectionTimeout) c;
int stat = http.getResponseCode();
if (stat >= 300 && stat <= 305 &&
stat != HttpURLConnection.HTTP_NOT_MODIFIED) {
URL base = http.getURL();
String loc = http.getHeaderField("Location");
URL target = null;
if (loc != null) {
target = new URL(base, loc);
}
http.disconnect();
if (target == null
|| !base.getProtocol().equals(target.getProtocol())
|| base.getPort() != target.getPort()
|| !HostsEquals(base, target)
|| redirects >= 5)
{
throw new SecurityException("illegal URL redirect");
}
redir = true;
c = target.openConnection();
redirects++;
}
}
} while (redir);
return in;
}

// Same as java.net.URL.hostsEqual


static boolean HostsEquals(URL u1, URL u2)
{
final String h1 = u1.getHost();
final String h2 = u2.getHost();

if (h1 == null) {
return h2 == null;
} else if (h2 == null) {
return false;
} else if (h1.equalsIgnoreCase(h2)) {
return true;
}
// Have to resolve addresses before comparing, otherwise
// names like tachyon and tachyon.eng would compare different
final boolean result[] = {false};

java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction() {
public Object run() {
try {
InetAddress a1 = InetAddress.getByName(h1);
InetAddress a2 = InetAddress.getByName(h2);
result[0] = a1.equals(a2);
} catch(UnknownHostException e) {
} catch(SecurityException e) {
}
return null;
}
});

return result[0];
}

void Close() throws Exception
{
fClient.Close();
}

Socket GetSocket()
{
return fClient.GetSocket();
}
}

Sample Usage #1

import java.net.*;
public class MainTest
{

public static void main(String args[])
{
int i = 0;
try {
URL theURL = new URL((URL)null, "http://www.snowball.com", new HttpTimeoutHandler(150)); // timeout value in milliseconds

// the next step is optional
theURL.setURLStreamHandlerFactory(new HttpTimeoutFactory(150));


URLConnection theURLconn = theURL.openConnection();
theURLconn.connect();
i = theURLconn.getContentLength();
}
catch (InterruptedIOException e)
{
System.out.println("timeout on socket");
}
System.out.println("Done, Length:" + i);
}
}

Sample Usage #2

		try
{
HttpTimeoutHandler xHTH = new HttpTimeoutHandler(10); // timeout value in milliseconds
URL theURL = new URL((URL)null, "http://www.javasoft.com", xHTH);
HttpURLConnection theUC = theURL.openConnection();
.
.
.
}
catch (InterruptedIOException e)
{
// socket timed out

}

Some remarks: this code is thread safe.

More to come

来源:http://www.logicamente.com/sockets.html

     http://www.edevs.com/java-programming/15068/


Thanks Felipe!

If I understand information at http://www.logicamente.com/sockets.html correctly there are 2 problems with timeout when using HttpURLConnection in JDK 1.3:

1. HttpURLConnection does not allow changing the default timeout that is in order of few minutes.

2. If actual HTTP stream is chunked then HttpURLConnection ignores even the default timeout and tries to read what it perceives as a continued stream resulting in indefinite read wait.

The patch shown at the above URL, consisting of subclassing of 4 system classes (1 from java.net... and 3 from sun.net.www...), is aimed to resolve problem 1 above but does not help in problem 2.

My main problem is to have timeout when reading chunked stream (system default timeout will be ok to beginning with) and therefore the question is if this bug has been corrected in later versions of JDK? Thanks.

-----

I have seen much chat about this "problem", that is setSoTimeout not available or not working properly.

how about you write your own Timer (resettable) or 1.4 has Timer class

you just reset it anytime you detect network activity and close the Socket if the Timer finishes its cycle?

posted @ 2010-04-14 17:09 leekiang 阅读(2321) | 评论 (0)编辑 收藏

From: Niels Campbell (niels_campbell_at_lycos.co.uk)
Date: 01/23/04
Date: 23 Jan 2004 09:14:16 -0800
After spending nearly 3 days on this problem to come up with a

solution I think it is only right to post the solution.

I found that you can't set the soTimeout on an HttpURLConnection as
the sockets are encapsulated within the HttpURLConnection
implementation.

I found Mike Reiche solution in which he uses a handler to set a
timeout value. This nearly worked. Looking at the code in the rt.jar I
found that the initial timeout was working, but the call
parseHTTP(...) in HttpClient was then attempting a second connection
which had a time out value of 0(infinite).

I modified the code to override the doConnect() in the NetworkClient
and managed to get a timeout occurring. To be exact two timeouts
occur.

It works on
java version "1.4.0_03"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0_03-b04)
Java HotSpot(TM) Client VM (build 1.4.0_03-b04, mixed mode)
and
java version "1.2.2"
Classic VM (build JDK-1.2.2_013, native threads, symcjit)

Anyway here is the code, excuse the formatting.

/* HttpTimeoutURLConnection.java */
import java.net.*;
import java.io.*;
import sun.net.www.http.HttpClient;

// Need to override any function in HttpURLConnection that create a
new HttpClient
// and create a HttpTimeoutClient instead. Those functions are
// connect(), getNewClient(), getProxiedClient()

public class HttpTimeoutURLConnection extends
sun.net.www.protocol.http.HttpURLConnection
{

    public HttpTimeoutURLConnection(URL u, HttpTimeoutHandler handler,
int iSoTimeout)
        throws IOException
    {
        super(u, handler);
        HttpTimeoutClient.setSoTimeout(iSoTimeout);
    }

    public void connect() throws IOException
    {
        if (connected)
        {
            return;
        }

        try
        {
            if ("http".equals(url.getProtocol())) // && !failedOnce <-
PRIVATE
            {
                // for safety's sake, as reported by KLGroup
                synchronized (url)
                {
                    http = HttpTimeoutClient.getNew(url);
                }
            }
            else
            {
                if (handler instanceof HttpTimeoutHandler)
                {
                    http = new HttpTimeoutClient(super.url,
((HttpTimeoutHandler)handler).getProxy(),
((HttpTimeoutHandler)handler).getProxyPort());
                }
                else
                {
                    throw new IOException("HttpTimeoutHandler
expected");
                }
            }

            ps = (PrintStream)http.getOutputStream();
        }
        catch (IOException e)
        {
            throw e;
        }

        connected = true;
    }

    protected HttpClient getNewClient(URL url)
        throws IOException
    {
        HttpTimeoutClient httpTimeoutClient = new HttpTimeoutClient
(url, (String)null, -1);
        return httpTimeoutClient;
    }

    protected HttpClient getProxiedClient(URL url, String s, int i)
        throws IOException
    {
        HttpTimeoutClient httpTimeoutClient = new HttpTimeoutClient
(url, s, i);
        return httpTimeoutClient;
    }

}

/* HttpTimeoutHandler.java */
import java.net.*;
import java.io.IOException;

public class HttpTimeoutHandler extends
sun.net.www.protocol.http.Handler
{
    private int iSoTimeout=0;

    public HttpTimeoutHandler(int iSoTimeout)
    {
        // Divide the time out by two because two connection attempts
are made
        // in HttpClient.parseHTTP()

        if (iSoTimeout%2!=0)
        {
            iSoTimeout++;
        }
        this.iSoTimeout = (iSoTimeout/2);
    }

    protected java.net.URLConnection openConnection(URL u) throws
IOException
    {
        return new HttpTimeoutURLConnection(u, this, iSoTimeout);
    }

    protected String getProxy()
    {
        return proxy;
    }

    protected int getProxyPort()
    {
        return proxyPort;
    }
}

/* HttpTimeoutFactory.java */
import java.net.*;

public class HttpTimeoutFactory implements URLStreamHandlerFactory
{
    private int iSoTimeout=0;

    public HttpTimeoutFactory(int iSoTimeout)
    {
        this.iSoTimeout = iSoTimeout;
    }

    public URLStreamHandler createURLStreamHandler(String str)
    {
        return new HttpTimeoutHandler(iSoTimeout);
    }
}

/* HttpTimeoutClient.java */
import sun.net.www.http.HttpClient;
import java.net.*;
import sun.net.*;
import sun.net.www.*;
import java.io.*;

public class HttpTimeoutClient extends HttpClient
{
    private static int iSoTimeout=0;

    public HttpTimeoutClient(URL url, String proxy, int proxyPort)
throws IOException
    {
        super(url, proxy, proxyPort);
    }

    public HttpTimeoutClient(URL url) throws IOException
    {
        super(url, null, -1);
    }

    public static HttpTimeoutClient getNew(URL url)
        throws IOException
    {
        HttpTimeoutClient httpTimeoutClient = (HttpTimeoutClient)
kac.get(url);

        if (httpTimeoutClient == null)
        {
            httpTimeoutClient = new HttpTimeoutClient (url); // CTOR
called openServer()
        }
        else
        {
            httpTimeoutClient.url = url;
        }

        return httpTimeoutClient;
    }

    public static void setSoTimeout(int iNewSoTimeout)
    {
        iSoTimeout=iNewSoTimeout;
    }

    public static int getSoTimeout()
    {
        return iSoTimeout;
    }

    // Override doConnect in NetworkClient

    protected Socket doConnect(String s, int i)
        throws IOException, UnknownHostException, SocketException
    {
        Socket socket=super.doConnect(s,i);

        // This is the important bit
        socket.setSoTimeout(iSoTimeout);
        return socket;
    }

}

/* Example use */
import java.util.*;
import java.io.*;
import java.net.*;

public class SystemProperty
{
    public static void main(String[] args)
    {
        String sSoapUrl="http://192.168.0.223/mobaqSecurity/SslTunnelServlet";
        System.out.println("Connecting to [" + sSoapUrl + "]");

        URLConnection urlConnection = null;
        URL url=null;

        try
        {
            url = new URL((URL)null, sSoapUrl, new
HttpTimeoutHandler(10000));
            urlConnection = url.openConnection();

            // Optional
            url.setURLStreamHandlerFactory(new
HttpTimeoutFactory(10000));

            System.out.println("Url class
["+urlConnection.getClass().getName()+"]");
        }
        catch (MalformedURLException mue)
        {
            System.out.println(">>MalformedURLException<<");
            mue.printStackTrace();
        }
        catch (IOException ioe)
        {
            System.out.println(">>IOException<<");
            ioe.printStackTrace();
        }

        HttpURLConnection httpConnection =
(HttpURLConnection)urlConnection;
        System.out.println("Connected to [" + sSoapUrl + "]");

        byte[] messageBytes=new byte[10000];
        for (int i=0; i<10000; i++)
        {
            messageBytes[i]=80;
        }

        try
        {
            httpConnection.setRequestProperty("Connection", "Close");
            httpConnection.setRequestProperty("Content-Length",
String.valueOf(messageBytes.length));
            httpConnection.setRequestProperty("Content-Type",
"text/xml; charset=utf-8");
            httpConnection.setRequestMethod("POST");
            httpConnection.setDoOutput(true);
            httpConnection.setDoInput(true);
        }
        catch (ProtocolException pe)
        {
            System.out.println(">>ProtocolException<<");
            pe.printStackTrace();
        }

        OutputStream outputStream=null;

        try
        {
            System.out.println("Getting output stream");
            outputStream =httpConnection.getOutputStream();
            System.out.println("Got output stream");

            outputStream.write(messageBytes);
        }
        catch (IOException ioe)
        {
            System.out.println(">>IOException<<");
            ioe.printStackTrace();
        }

        try
        {
            System.out.println("Getting input stream");
            InputStream is=httpConnection.getInputStream();
            System.out.println("Got input stream");

            byte[] buf = new byte[1000];
            int i;

            while((i = is.read(buf)) > 0)
            {
                System.out.println(""+new String(buf));
            }
            is.close();
        }
        catch (Exception ie)
        {
            ie.printStackTrace();
        }

    }
}

Cheers,
Niels

来源:http://coding.derkeiler.com/Archive/Java/comp.lang.java.programmer/2004-01/3271.html
     http://www.weblogicfans.net/viewthread.php?tid=1101
     http://forums.sun.com/thread.jspa?threadID=568948
备注:在HttpTimeoutClient类中的第二个构造函数中的:super(url,null,-1)改为super(url, (String)null,-1)即可。

posted @ 2010-04-14 17:04 leekiang 阅读(1310) | 评论 (0)编辑 收藏

System.setProperty("sun.net.client.defaultConnectTimeout", "500");
System.setProperty("sun.net.client.defaultReadTimeout", "500");
在jdk1.4.2_05下测http,上面的代码是生效的,https没有试。
好像jdk1.4.2.12解决了https的问题,见jdk1.4的bug清单。
HttpURLConnection的实现类正常情况下是sun.net.www.protocol.http.HttpURLConnection
而weblogic8下是weblogic.net.http.SOAPHttpURLConnection。
SOAPHttpURLConnection是weblogic.net.http.HttpURLConnection的子类
System.setProperty("weblogic.client.SocketConnectTimeoutInSecs", "500");在sp4不管用
-Dweblogic.client.SocketConnectTimeoutInSecs=500也不管用。

在http://forums.oracle.com/forums/thread.jspa?threadID=766767里有人说
Well, it depends on the OS and JVM used. If Weblogic is using Native library (socket Muxer) for remote communication then socketconnectTimeout only helps when thread is stuck on "Socket.connect() method, but it would never timeout the socket if it is stuck on "Socket.read()" because the Control does not return to JVM till OS level TCP/IP connection returns.
To resolve this issue, try to timeout TCP connections at OS level using OS parameters. Hopefully BEA would come with some resolution of this issue in future release

应该使用"weblogic.http.client.defaultConnectTimeout"属性
在weblogic9的weblogic.net.http.HttpURLConnection类里找到如下的代码
defaultConnectTimeout = Integer.getInteger("weblogic.http.client.defaultConnectTimeout", -1).intValue();
而在weblogic8.1 sp4的该类里没找到,或许sp5就有了(见http://download.oracle.com/docs/cd/E13222_01/wls/docs81///javadocs/weblogic/net/http/HttpURLConnection.html)

  现在的问题是,对于这种问题可不可以通过超时设定来释放线程。weblogic中,RJVM(即server之间,可能是admin-to- managed,也可能是managed-to-managed)之间,连接的协议有两类五种,两类是http、t3,五种是http、https、 t3、t3s、local。超时设定时协议层面的东西,所以我们这里只讨论http和t3。

       对于t3,从上面的trace可以看到,连接的创建从ServerURL.findOrCreateRJVM()开始,这个方法有多种实现,不同的实现使用不同的timeout,客户端程序可以通过向environment中set一个叫做weblogic.jndi.requestTimeout的变量,如果不做设定,则使用系统默认的DEFAULT_CONNECTION_TIMEOUT,这是个静态值(0)。而在上面的stacktrace中,我们可以看到,environment是在RemoteChannelServiceImpl中定义的,这个environment对于客户而言是不可配置的,而weblogic自己的这个env中是不设定requesttimeotu的,也就是,无论哪种方式,connectionTimeout/readTimeout对于t3,都是不可配置的,而且默认是没有超时的。

        而对于http,HTTPClientJVMConnection在创建HttpURLConnection的时候,会读取系统环境变量中的如下两个变量,
[b]weblogic.http.client.defaultReadTimeout[/b]
[b]weblogic.http.client.defaultConnectTimeout[/b]
        如果没有设定,这两个变量的默认值均为-1,即不做timeout。如果我们作了设定,这两个值即读超时、连接超时都会生效。这两个值可以用于解决上述的问题。
        weblogic.http.client.defaultReadTimeout
weblogic.http.client.defaultConnectTimeout

哪里可以设置呢?
举例:
Windows平台:
set JAVA_OPTIONS=-Dweblogic.http.client.defaultReadTimeout=30 -Dweblogic.http.client.defaultConnectTimeout=30 %JAVA_OPTIONS%
UNIX/Linux平台:
JAVA_OPTIONS="-Dweblogic.http.client.defaultReadTimeout=30 -Dweblogic.http.client.defaultConnectTimeout=30 $JAVA_OPTIONS"
export JAVA_OPTIONS

posted @ 2010-04-14 16:59 leekiang 阅读(4156) | 评论 (0)编辑 收藏

Java中可以使用HttpURLConnection来请求WEB资源。
HttpURLConnection对象不能直接构造,需要通过 URL.openConnection()来获得HttpURLConnection对象,示例代码如下:
String urlStr= www.ttt.org;
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();

 

HttpURLConnection是基于HTTP协议的,其底层通过socket通信实 现。如果不设置超时(timeout),在网络异常的情况下,可能会导致程序僵死而不继续往下执行。可以通过以下两个语句来设置相应的超时:
System.setProperty("sun.net.client.defaultConnectTimeout", 超时毫秒数字符串);
System.setProperty("sun.net.client.defaultReadTimeout", 超时毫秒数字符串);

其中: sun.net.client.defaultConnectTimeout:连接主机的超时时间(单位:毫秒)
sun.net.client.defaultReadTimeout: 从主机读取数据的超时时间(单位:毫秒)

例如:
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");
System.setProperty("sun.net.client.defaultReadTimeout", "30000");

JDK 1.5以前的版本,只能通过设置这两个系统属性来控制网络超时。在1.5中,还可以使用HttpURLConnection的父类 URLConnection的以下两个方法:
setConnectTimeout:设置连接主机超时(单位:毫秒)
setReadTimeout: 设置从主机读取数据超时(单位:毫秒)

例如:
HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();
urlCon.setConnectTimeout(30000);
urlCon.setReadTimeout(30000);

来源:http://www.xd-tech.com.cn/blog/article.asp?id=37

另外可参考java中处理http连接超时的方法

JDK中的URLConnection参数详解

linux下设置connect连接超时的方法

java socket 用法(一)

Linux,可以修改/proc/sys/net/ipv4/tcp_syn_retries的值,缺省是72,大约5分钟左右,改小点时间就短些

posted @ 2010-04-13 19:00 leekiang 阅读(1711) | 评论 (0)编辑 收藏

C10K问题探讨
http://www.kegel.com/c10k.html


Host Websites with nginx on CentOS 5

posted @ 2010-03-29 01:13 leekiang 阅读(257) | 评论 (0)编辑 收藏

http://baike.baidu.com/view/1077487.htm
http://subject.it168.com/article/articleview.aspx?id=672857

posted @ 2010-03-24 23:46 leekiang 阅读(408) | 评论 (0)编辑 收藏

五个广泛流传的对大龄程序员的误解
程序员,不止干到35岁
35岁前程序员要规划好的四件事,健康居首位
40岁以后的程序员还能做什么?
IT 外企那点儿事(6):管理路线和技术路线
IT外企那点儿事(5):像系统一样升级
Hacker传说之不能说的秘密(2)
程序员有哪些发展方向
软件天才与技术民工
如何成为一名Java自由开发人员
如何成为一名专家级的开发人员
工程师——中国最可悲的职业!
竞争篇,如何以弱击强
开发与研发(上)

posted @ 2010-03-22 02:05 leekiang 阅读(257) | 评论 (0)编辑 收藏

validates_inclusion_of用于确保对象的属性值在指定的集合中

http://hot88zh.javaeye.com/blog/512561

posted @ 2010-03-22 01:55 leekiang 阅读(215) | 评论 (0)编辑 收藏

双重危机

posted @ 2010-03-21 20:05 leekiang 阅读(215) | 评论 (0)编辑 收藏

TWaver是一个拓扑组件,主要应用于电信行业,也可应用于电力、金融、制造、交通等行业的软件开发中。
TWaver已经不再是一个简单的Swing拓扑组件,这些年TWaver陆续推出了AJAX+SVG的Web版、GIS版,现在又出了Flex版。
http://www.javaeye.com/topic/620109

CTI(Computer Telecommunication Integration)技术跨越计算机技术和电信技术两大领域,目前提供的一些典型业务主要有基于用户设备(CPE)的消息系统、交互语音应答、呼叫中心系统、增值业务、 IP电话等

新一代业务支撑网(NGBOSS)演进思路

FreeSWITCH 是一个电话的软交换解决方案
我们的FreeSWITCH故事

ISO8583协议-银行交易的标准
轻松掌握ISO8583协议

posted @ 2010-03-20 22:00 leekiang 阅读(251) | 评论 (0)编辑 收藏

1,数组
arr = [1,2,3,4]
puts arr.find{|i| i%2 == 0 }   #find返回满足条件的第一条记录
puts arr.select{|i| i%2 == 0}  #select返回满足条件的全部记录
arr.unshift(0)                 在头部添加
arr.push(5,6)                  在尾部添加
arr<<7                         与push的不同在于push可以放多个
arr.sort.reverse               先排序再倒置,即降序

posted @ 2010-03-17 00:53 leekiang 阅读(264) | 评论 (0)编辑 收藏

1,findbugs的eclipse插件
把解压后的目录edu.umd.cs.findbugs.plugin.eclipse_1.3.9.20090821剪切到findbugs\eclipse\plugins目录下,再以links的方式安装.
  装好后再Java项目上右键,可以看到“Find Bugs”菜单项,子菜单项里有“Find Bugs”和“Clear Bug Markers”
  在首选项->java->findbugs里可以进行配置
  参考:http://lansky07.javaeye.com/blog/283923
        http://www.cnblogs.com/hyddd/archive/2009/02/13/1390362.html

2,eclemma
使用 EclEmma 进行覆盖测试
 
追求代码质量: 不要被覆盖报告所迷惑

3,
简单实用的Code Review工具
Review Board

4,
敏捷开发中编写高质量Java代码

5,MaintainJ是一个Java应用程序维护工具。MaintainJ在运行时能生成UML序列和类图。

6,gerrit

posted @ 2010-03-09 00:22 leekiang 阅读(532) | 评论 (1)编辑 收藏

1,安装rcov0.9.9,环境为ruby1.8,6,rails2.3.5
安装之前必须先安装DevKit,http://github.com/oneclick/rubyinstaller/wiki/Development-Kit里有详细的安装步骤
主要步骤:
1)下载DevKit解压到c:\DevKit目录,下载地址为http://rubyinstaller.org/downloads/
2)C:\DevKit>ruby dk.rb init
3)C:\DevKit>ruby dk.rb install
4)C:\DevKit>gem install rdiscount --platform=ruby 我觉得这一步只是验证DevKit是否安装成功,也可以不做的。
5)最好把c:\DevKit\bin加到环境变量

2,rcov test/functional/*.rb test/unit/*.rb --output=public/rcov --rails
会生成一大堆反映测试覆盖情况的网页放到public/rcov目录下,如果不写--output,则这些网页会放到项目下新建的coverage目录。

3,在项目下执行rake stats可看到代码统计,以及代码和测试代码的比例。

4,在netbeans6.9里开始怎么也显示不了覆盖率报告,后来打开一个模型类,点击执行测试,然后就有了。
而且可以显示每一行代码是否被测试到,看了几个类的覆盖情况,感觉有的方法里的代码明明被测了,但图形里显示没有测到。
http://blogs.sun.com/tor/entry/netbeans_screenshot_of_the_week6后面的评论里有人写了他是如何做的。

http://www.jairrillo.com/blog/2008/08/18/introduction-to-rspec-part-2-testing-the-rails-model/
http://eigenclass.org/hiki.rb?rcov#l2
http://stackoverflow.com/questions/3451346/cannot-install-rcov-from-gem

posted @ 2010-03-06 13:00 leekiang 阅读(2883) | 评论 (0)编辑 收藏

rails2.3 在处理 模型关系 的表单嵌套上,非常方便实用的特性
http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes
来源

posted @ 2010-03-06 02:24 leekiang 阅读(386) | 评论 (0)编辑 收藏

方法一,使用eclipse的jinto插件编辑,会自动调用java的native2ascii把文件转码。(没用过)
方法二:
1)Eclipse --> Window -->Preferences
2)在“type filter text“的框框里输入"Content Types"
3)点击右边的Text,选择 JavaScript,把Default encoding改为GBK

来源:网络

posted @ 2010-03-05 01:55 leekiang 阅读(1515) | 评论 (0)编辑 收藏

调用Action获取字符串,其中包含中文,使用如下代码输出:

ServletOutputStream out = response.getOutputStream();
request.setAttribute("xmlTree", tree);
out.print(tree);

使用的编码是GBK,在JDK1.5运行抛出异常:

java.io.CharConversionException: Not an ISO 8859-1 character: 树

at javax.servlet.ServletOutputStream.print(ServletOutputStream.java:88)

问题可能出现在ServletOutputStream上,于是用PrintWriter替换了ServletOutputStream,运行正确,如:

PrintWriter pw = response.getWriter();
pw.print(tree);


参考:

http://hi.baidu.com/icewee/blog/item/24f28d24016f536934a80f11.html


posted @ 2010-03-05 01:43 leekiang 阅读(1060) | 评论 (0)编辑 收藏

基于Ibator(Abator)的可视化代码生成工具

posted @ 2010-03-04 01:26 leekiang 阅读(260) | 评论 (0)编辑 收藏

Trac 手记(三) : 应用 Trac
Trac+subversion拥有强大的bug管理能力

基于Web的代码review工具:http://code.google.com/p/reviewboard/

http://vik.haoluobo.com/trac/wiki/Django

posted @ 2010-03-03 23:37 leekiang 阅读(215) | 评论 (0)编辑 收藏

MySQL数据库连接超时( wait_timeout )问题的处理
Mysql Broken pipe问题的解决办法。
http://www.penglixun.com/tech/database/mysql_ppt_for_developer.html

posted @ 2010-03-02 02:14 leekiang 阅读(252) | 评论 (0)编辑 收藏

http://mypages.javaeye.com/blog/291991

posted @ 2010-02-21 02:53 leekiang 阅读(209) | 评论 (0)编辑 收藏

http://andyhu1007.javaeye.com/blog/450384

posted @ 2010-02-21 02:20 leekiang 阅读(244) | 评论 (0)编辑 收藏

根据 Joel Spolsky 的说法:“所有非简单抽象,都存在某种程度的泄漏”。
http://local.joelonsoftware.com/wiki/Chinese_%28Simplified%29

GORM 有助于缓解抽象泄漏问题,它支持使用对 Groovy 有意义的方式表示对象模型,由 GORM 在幕后处理关系数据库的问题。但是正如即将看到的,如果需要,覆盖默认设置也很容易。GORM 并不是隐藏数据库细节的不透明的 抽象层,而是一个半透明的 层 — 它尝试在不进行用户干预的情况下执行正确的工作,但是如果用户需要对它的行为进行自定义,它也可以提供支持。

http://blog.csdn.net/g9yuayon/archive/2007/03/02/1518916.aspx
http://www.ibm.com/developerworks/cn/java/j-gaej3.html
https://www.ibm.com/developerworks/cn/java/j-grails02128/

posted @ 2010-02-20 23:15 leekiang 阅读(513) | 评论 (0)编辑 收藏

open-uri库是ruby的标准附加库中所带的,路径
C:\Ruby1.8.7\lib\ruby\1.8\open-uri.rb

require 'open-uri'
open(
'c:/boot.ini'){|file|
  puts file.
class  #File
}
open(
'http://coderlee.cnblogs.com'){|file|
  puts file.
class  #Tempfile
}
可以看出,打开一个本机文件的块参数是File类型,而打开一个uri的块参数是一个Tempfile类型。还有一点要注意,就是open-uri里面的open方法会自动对302 redirection重定向地址进行追踪访问,而Net::HTTP#get方法则不会自动追踪302重定向地址。(摘自这里)

require 'nokogiri'
require 
'open-uri'
doc = Nokogiri::HTML(open('http://www.huomo.cn'))
doc.search(
"//h2/a").each do |link|
  puts link.inner_text
  puts link[:href]
end

url = 'http://www.google.cn/search?hl=zh-CN&q=%BC%D6%B1%A6%D3%F1'
doc 
= Nokogiri::HTML.parse(open(url), nil, 'gb2312')#不这样写会有乱码

doc.css(
'h3.r a.l').each do |link|
  puts link.inner_text
end

doc.xpath(
'//h3/a[@class="l"]').each do |link|
  puts link.content
end

doc.search(
'h3.r a.l''//h3/a[@class="l"]').each do |link|
  puts link.content
end

参考http://www.javaeye.com/topic/557485

posted @ 2010-02-20 18:14 leekiang 阅读(1116) | 评论 (0)编辑 收藏

另一个常见的问题是当应用软件要执行一个需时长的请求时,处理不当。如果实现得不好,会让处理这个web请求的handler很长时间没有反应。

这个问题是在人机界面方面很普遍,而且也有一个普遍的解决方法 -- 把任务交给一个背景运行的过程或线程。任何开发过桌面应用的人都会觉得很熟悉。但是有时候如果开发者把切换和通信做得不好,也会碰到麻烦。

一个我觉得较好的办法,而幸好我的ThoughtWorks同事们也同意,就是使用一个actor。在这个模型里,web请求的handler把需时长的请求包装为一个命令(command),然后放进队列(queue)内。在背景运行的actor就监察着这个queue,从queue中提出并且执行这个命令。当它把这个命令执行完了,就通知前台界面的actor。通常这个queue一开始会是数据库的一个表,之后如有需要的话,再把它改为一个消息队列(message queue)。

和ActiveRecord的漏洞一样,我提起这个不是因为它是Rails里特有的问题;我们在各种应用也会看到同样的问题。值得在这里带出是因为用Rails的人们往往很容易忘了有这样的情况发生,也忘了有这样的模式去解决。我们发现Rails把web开发中重复又重复的环节变得简易和快,但是复杂的环节是仍然存在的。

来源:http://rickylui.com/lionwiki/index.php?page=Ruby+at+ThoughtWorks
     http://martinfowler.com/articles/rubyAtThoughtWorks.html

posted @ 2010-02-20 04:42 leekiang 阅读(343) | 评论 (0)编辑 收藏

在netbeans6.8(使用ruby1.8.6)的一个rails项目上右键点击"调试",提示未安装版本与0\.4\..*模式匹配的ruby-debug-ide 点击"安装快速调试器",出现如下的错误:
------------------------------------------------------
Building native extensions.  This could take a while...
ERROR:  Error installing ruby-debug-ide:
    ERROR: Failed to build gem native extension.

c:/ruby/bin/ruby.exe mkrf_conf.rb
Building native extensions.  This could take a while...

Gem files will remain installed in c:/ruby/lib/ruby/gems/1.8/gems/ruby-debug-ide-0.4.9 for inspection.
Results logged to c:/ruby/lib/ruby/gems/1.8/gems/ruby-debug-ide-0.4.9/ext/gem_make.out
------------------------------------------------------
然后在C:\ruby\lib\ruby\gems\1.8\gems下发现了刚刚生成的ruby-debug-ide-0.4.9目录和ruby-debug-base-0.10.3目录。

接着在cmd里gem install ruby-debug,也报错:
------------------------------
Building native extensions.  This could take a while...
ERROR:  Error installing ruby-debug:
        ERROR: Failed to build gem native extension.

c:/ruby/bin/ruby.exe extconf.rb
creating Makefile
nmake
'nmake' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

Gem files will remain installed in c:/ruby/lib/ruby/gems/1.8/gems/ruby-debug-bas
e-0.10.3 for inspection.
Results logged to c:/ruby/lib/ruby/gems/1.8/gems/ruby-debug-base-0.10.3/ext/gem_
make.out
-------------------------------
然后发现ruby-debug-base-0.10.3目录重新生成了。

现在说一下解决步骤:
1,下载http://rubyforge.iasi.roedu.net/gems/ruby-debug-base-0.9.3-mswin32.gem
   gem install ruby-debug-base-0.9.3-mswin32.gem
2, 去http://rubyforge.org/projects/debug-commons/下载ruby-debug-ide-0.4.6.gem
   gem install ruby-debug-ide-0.4.6.gem
   版本不能高于0.4.6,如果高了都报       
      ERROR: Failed to build gem native extension.
   0.4.7见ruby-debug-ide-0.4.7\ext\extconf.rb
   0.4.9见ruby-debug-ide-0.4.9\ext\mkrf_conf.rb
   0.4.6压根就没有ext目录
   有人说要装什么linecache.gem,我没安装。
   还有人装了ruby-debug.gem,我也没安装。
   在http://rubyforge.mirrors.roedu.net/gems里能找到老版本。

感谢http://hlee.javaeye.com/blog/576237

在netbeans里调试时发现有问题,那个绿三角不能点多了,否则会影响后面的调试。


另外不明白gem除了把文件拷到gems目录下,还做了什么。



后面都是记录,仅供参考。
How to enable Ruby debug in RubyMine 2.0 on Windows里说
(If you installed Ruby with the zip binary, reinstall it using the one-click installer as found here. That's because currently the ruby debugger ide only works on Windows using a RubyInstaller installation). Also verify that Ruby's root path doesn't include spaces.
  1. ...略
  2. ...略
  3. ...略
  4. Open with a text editor the file command.rb that's part of the installed ruby-debug-ide19 gem. In my case, that file was under folder C:\Programmi\Ruby19\lib\ruby\gems\1.9.1\gems\ruby-debug-ide19-0.4.12\lib\ruby-debug
  5. Modify the beginning of procedure debug_eval (at line 120) so to enter a new statement between statements str = str.to_s and max_time = 10. The new statement to enter is:
    return "" if str == "$FILENAME"

    At the end, the procedure debug_eval should begin like this:
    def debug_eval(str, b = get_binding)
      begin str = str.to_s
      return "" if str == "$FILENAME"
      max_time = 10
      to_inspect = str.gsub(/\\n/, "\n")

ruby-debug to Ruby 1.9
如果使用的是ruby1.9,则Installation: IDE versionNetBeans 6.7.1 IDE updates.ruby-debug19 only works on Windows using a RubyInstaller installation,Do not install to a path that has a space inside of it.In both cases, you will also need to download and install the DevKit.
原来在ruby-debug-ide 0.4.7 的release notes里说了原因:
Patch by Mark Moseley supporting ruby-debug-base19.
  Dynamically installs right ruby-debug-base dependency depending on the
  version of a Ruby platform being used. ruby-debug-base19 is the only solution
  these days for 1.9 debugging, so might be temporary solution until ruby-debug
  projects brings official version.
另外参见Ruby 2.0 Beta Issue: Error installing ruby-debug-ide19
        Debug supported for ruby 1.8.7?

从下午弄到深夜还没解决关于ruby-debug-ide的问题发现有人解决了:
我试了下ruby1.8.6还是不行,还是报那个异常。没法换成NetBeans6.8集成的jruby,集成的jruby中自带ruby-debug-ide,OK了。在这里提示一下,不要选jruby.exe要选jruby.bat,希望对遇到同样问题的人有所帮助。
问题解决,解决步骤:1.下载rubyinstaller,安装;2.下载devkit,解压到根目录后,修改 “ruby路径”\devkit\msys\1.0.11\etc\fstab为
“ruby路径”/devkit/gcc/3.4.5/mingw32
“ruby路径”/devkit/msys/1.0.11/usr/local /usr/local
然后在命令行窗口,gem install linecache19 这个要好长时间,耐心等待。然后gem install ruby-debug-ide19,这个就快了。这就OK了,不要在rubymine中安装ruby-debug-ide19和linecache19,会报错。


某人的解决办法:
在RubyMine里调试提示需要安装ruby-debug-ide,但是安装的过程有问题,提示:
  ERROR: Failed to build gem native extension.
于是想解开gem包,把里面的extension去掉。但是编辑完之后再用winrar打包gem就认不出来了。看来压缩的格式也很重要。于是找来了tar和gzip两个工具,tar还好,用gzip解压和压缩过的文件还是认不出来。只有另想别的办法了。突然想到把文件解压之后,应该可以用gem的工具来生成一个gem安装文件吧。于是找了一篇制作gem的教程,把extension去掉之后制作了一个gem,居然可以顺序安装了。然后重新打开 RubyMine也可以调试了。

Trying to install ruby-debug-ide on jruby 1.2.0
http://youtrack.jetbrains.net/issue/RUBY-5341
好帖Ruby调试器一览
一个视频
http://netbeans.org/kb/60/ruby/debugger-screencast.html


201010补充:
根本没有那么复杂,
装DevKit,把DevKit\bin设置为环境变量,然后就可以在netbean中安装和执行了

posted @ 2010-02-19 23:22 leekiang 阅读(1777) | 评论 (0)编辑 收藏

posts_url               http://localhost:3000/posts
posts_path              /posts
new_post_path           /posts/new
edit_post_path(post)    /post/:id/edit
redirect_to(@post)     会重定向到/post/:id吗,也就是posts_controller的show

Expected response to be a <:redirect>, but was <200>
测试时报错,后发现是测试里提供的数据没有通过验证

posted @ 2010-02-18 02:42 leekiang 阅读(260) | 评论 (0)编辑 收藏

运行redmine的测试时报错
Missing these required gems:
thoughtbot-shoulda
nofxx-object_daddy
mocha
在控制台里执行gem install mocha
gem install shoulda
和gem install object_daddy
到C:\ruby\lib\ruby\gems\1.8\gems下去看
发现多了object_daddy-0.4.1,shoulda-2.10.3和mocha-0.9.8这3个目录
再执行测试,不报缺少mocha了,但还报缺少另外两个jar

在http://www.redmine.org/boards/2/topics/11130找到了办法
rake gems:install RAILS_ENV=test
以下是在netbeans控制台里输出的信息
gem.bat install thoughtbot-shoulda --source http://gems.github.com
Successfully installed thoughtbot-shoulda-2.10.2
gem.bat install nofxx-object_daddy --source http://gems.github.com
Successfully installed nofxx-object_daddy-0.4.1

然后到C:\ruby\lib\ruby\gems\1.8\gems下去看,发现多了两个目录
nofxx-object_daddy-0.4.1和thoughtbot-shoulda-2.10.2,
奇怪的是与前面相比,目录名和大小都变了。

posted @ 2010-02-17 20:01 leekiang 阅读(427) | 评论 (0)编辑 收藏

1,在ruby中,一个方法的最后一个表达式求值所得的值就是该方法的返回值,这时可以去掉return
2,ruby的符号(symbol)
  symbol都以冒号作为前缀。rails常常用符号来给方法参数命名,以及用作hash的键。譬如说:
  redirect_to :action=>"edit",:id=>params[:id]
3,
class Order < ActiveRecord::Base
 has_many :line_items
 
 
def self.find_all_unpaid
   find(:all, 
'paid = 0' )
 end

 
def total
   sum 
= 0
   line_items.each {
|li| sum += li.total}
 end
end
在方法前加上"self.",该方法就变为类方法,可以在类层面上直接调用:Order.find_all_unpaid

4,实例变量的名字以"@"开头
5,在rails项目下rake doc:app可以为rails项目创建html格式的文档,放在doc/app目录里。
6,模块(module)与类差不多,区别是无法创建模块的实例。
  我的感觉就是module是代码片段,可以在任何类里引入作为该类的一部分。

posted @ 2010-02-17 11:47 leekiang 阅读(257) | 评论 (0)编辑 收藏

				assert_select
				assert_not_nil assigns(:people)
				
assigns是一个特殊的变量。如果您在控制器中创建了一个实例变量,那么这个变量
就可以直接在视图模板中使用。这一机制背后的原理其实很简单:Rails首先通过反射
将控制器中的变量拷贝到一个容器中,其后又将该容器中的变量拷贝回视图实例。
而这个容器其实就是上面提到的assigns,所以前面的断言可以被理解为“控制器应该
创建一个名为people的非空变量”。

http://www.javaeye.com/topic/481193
http://www.infoq.com/cn/articles/rails-for-java-excerpt
http://www.ibm.com/developerworks/cn/web/wa-rails4/
http://www.blogjava.net/cap/articles/rails_test.html

新书Rails Test Prescriptions

posted @ 2010-02-15 19:22 leekiang 阅读(275) | 评论 (0)编辑 收藏

通常,更新操作在结束时会重定向到其它action。那么如何在重定向过程中保证状态消息不会丢失呢?如果将状态消息保存到成员变量中,会导致这一消息在 重定向后丢失。而使用session来作为保存机制虽然可行,但开发人员必须在随后执行清理session这一很容易被遗漏的操作。因此,Rails提供 了flash作为解决方案。使用flash时,消息首先被保存到session中,以便本次重定向可以使用。而在下一次重定向后,Rails会自动在 session中清理该消息。从而有效地解决了更新操作的状态信息在重定向时的保存问题。
http://www.infoq.com/cn/articles/rails-for-java-excerpt
http://jbf034.javaeye.com/blog/222730

posted @ 2010-02-15 18:34 leekiang 阅读(249) | 评论 (0)编辑 收藏

http://jbf034.javaeye.com/blog/222755

posted @ 2010-02-15 18:34 leekiang 阅读(260) | 评论 (0)编辑 收藏

Java开发者的Rails之路
Rails for Java Developers

posted @ 2010-02-15 03:19 leekiang 阅读(229) | 评论 (0)编辑 收藏

1,ORM已经过时了http://www.javaeye.com/articles/2266
  http://codemonkeyism.com/orms/
2,http://corte.si/posts/code/farewell-to-orms.html
3,http://andyhu1007.javaeye.com/blog/636063
http://blog.csdn.net/chelsea/archive/2009/12/28/5094652.aspx

posted @ 2010-02-14 21:22 leekiang 阅读(268) | 评论 (0)编辑 收藏


至于easymock之外的选择,我个人比较喜欢和推崇jmockit,mocito虽然也不错不过有了jmockit我就pass掉mockito了。
只是每次看到项目代码中,用easymock有record,replay却不调用verify时,就觉得郁闷。这样的testcase,就算通过了,又能说明什么?

Mock通常很少考虑复用,每个mock对象通过都是遵循"just enough"原则,一般只适用于当前测试方法。因此每个测试方法都必须实现自己的mock逻辑,当然在同一个测试类中还是可以有一些简单的初始化逻辑可以复用。
stub则通常比较方便复用,尤其是一些通用的stub,比如jdbc连接之类。spring框架就为此提供了大量的stub来方便测试,不过很遗憾的是,它的名字用错了:spring-mock
mock和stub的最重要的区别:expectiation/期望。 对于mock来说,expectiation是重中之重:我们期待方法有没有被调用,期待适当的参数,期待调用的次数,甚至期待多个mock之间的调用顺序。所有的一切期待都是事先准备好,在测试过程中和测试结束后验证是否和预期的一致。
而对于stub,通常都不会关注expectiation


easymock教程-mock和stub
http://www.javaeye.com/topic/21630
单元测试框架JMock与Mockito的用法比较
http://javasee.iteye.com/blog/1000868
http://hyjun.iteye.com/blog/337206
单元测试mock:用JMockit写单元测试实例
http://gojko.net/2009/10/23/mockito-in-six-easy-examples/

posted @ 2010-02-14 21:20 leekiang 阅读(290) | 评论 (0)编辑 收藏

 一个带完整的RBAC授权系统的rails应用
http://www.javaeye.com/topic/215074

RESTful_ACL


declarative_authorization
aegis
cancan           http://github.com/ryanb/cancan
Authologic
acl9             http://github.com/be9/acl9
role_requirement http://github.com/timcharper/role_requirement
ActiveRbac


restful_authentication
1,ruby script/plugin install http://svn.techno-weenie.net/projects/plugins/restful_authentication/
项目右键->rails 插件->资源库里添加url:http://svn.techno-weenie.net/projects/plugins
->新插件里找到restful_authentication然后安装
2, ruby script/generate authenticated user sessions
Right-click on your application in the projects pane and choose  
"Generate". In the dialog box that comes up, choose "authenticated"  
from the drop-down "Generator" menu near the top, and in the arguments  
field enter "user sessions" (without the quotes). Hit OK.
----------------------------------------------------------------------
Don't forget to:

Try these for some familiar login URLs if you like:

map.activate '/activate/:activation_code', :controller => 'users', :action => 'activate', :activation_code => nil
map.signup '/signup', :controller => 'users', :action => 'new'
map.login '/login', :controller => 'sessions', :action => 'new'
map.logout '/logout', :controller => 'sessions', :action => 'destroy'

----------------------------------------------------------------------
      create  app/views/sessions
      create  app/views/users
      create  app/models/user.rb
      create  app/controllers/sessions_controller.rb
      create  app/controllers/users_controller.rb
      create  lib/authenticated_system.rb
      create  lib/authenticated_test_helper.rb
      create  test/functional/sessions_controller_test.rb
      create  test/functional/users_controller_test.rb
      create  test/unit/user_test.rb
      create  test/fixtures/users.yml
      create  app/helpers/sessions_helper.rb
      create  app/helpers/users_helper.rb
      create  app/views/sessions/new.html.erb
      create  app/views/users/new.html.erb
      create  db/migrate/20100218184435_create_users.rb
      route  map.resource :session
      route  map.resources :users

运行测试时要把SessionsControllerTest和UsersControllerTest都改为继承ActionController::TestCase,同时把fixtures :users注释掉。

要使用current_user和logged_in? helper方法的话要在ApplicationController里include AuthenticatedSystem 

resource与resources的区别见http://api.rubyonrails.org/classes/ActionController/Resources.html

http://www.javaeye.com/topic/353831
http://www.javaeye.com/topic/177508
http://hideto.javaeye.com/blog/115157
https://github.com/nakajima/roleful

posted @ 2010-02-14 21:00 leekiang 阅读(554) | 评论 (0)编辑 收藏

http://www.pragprog.com/wikis/wiki/ChangesInRails23
1, app/controllers下的application.rb is now application_controller.rb

posted @ 2010-02-14 18:51 leekiang 阅读(295) | 评论 (0)编辑 收藏

1,http://kyoleelqh.javaeye.com/blog/169857

2,Scribbish

posted @ 2010-02-14 18:28 leekiang 阅读(316) | 评论 (0)编辑 收藏

http://m.onkey.org/2010/1/22/active-record-query-interface
http://www.pragprog.com/wikis/wiki/ChangesInRails30

posted @ 2010-02-14 17:58 leekiang 阅读(249) | 评论 (0)编辑 收藏

1,要在控制台输出log,在environment.rb里加:
config.log_level = :debug
config.logger = Logger.new(STDERR)
同时在controller里加一行logger.info 'test'
成功了,但奇怪的是log_level设为dubug和info没有区别

2, http://wordpress.javaeye.com/blog/134544
rails的日志文件存在于app/log下面。对于不同环境产生的日志内容会有差别。development下会把每次对数据库的访问代码包含进去,production会省略,不过也有很多的内容。 如果只希望在production环境下,输入少量的log, 则只需要在config/environments/production.rb中更改:
config.log_level = :warn

附带log level:
Rails可以通过选择不同的log level来控制log文件的输出,可以使用的log level有:debug, :info, :warn, :error, :fatal。 :debug level提供最详细的log, 可以将每一条sql都记录下来。:info level是production环境下的默认设置,不会写出sql的执行情况,但也会很详细,如果是ActiveMailer,它会记录下每封信的内容,Log文件内容就是快速增长。为了避免Log把空间塞满的情况发生,要注意定期清除Log,另外是选择:warn level等log level, 只记录重要的信息.

是否可以这么说:environment.rb对三个环境都生效,production.rb只对生产环境有效.


3,在单元测试类的方法里加了logger.dubug 'test',执行测试时报错,后改为
RAILS_DEFAULT_LOGGER.debug 'test' 成功。


Rails Logging Tips —— Rails写日志的提示http://www.cgpad.com/SPAN/articles_show/167
http://hlee.javaeye.com/blog/358516

posted @ 2010-02-14 02:24 leekiang 阅读(800) | 评论 (0)编辑 收藏

1,around_filter进行action的自动事务处理
在controller里面可以使用around_filter来进行action的包装,当action中弹出异常的时候渲染一个特殊的出错 页面。将action代码包装在ActiveRecord::Base.transaction函数的block中执行,当引发异常后截获并重新抛出一个 ActiveRecord::Rollback异常让rails将数据回滚掉。ActiveRecord::Base.transaction对 ActiveRecord::Rollback异常处理后不会再将该异常往外面抛。

around_filter :around_action_filter
protected
def transaction
ret = true
ActiveRecord::Base.transaction do
begin
yield if block_given?
rescue Exception => ex
set_notice(ex.message)
ret = ex.message
raise ActiveRecord::Rollback, ex.message
end
end
return ret
end
def around_action_filter
return yield if request.get?
redirect_to(:controller => "error_display", :action => "error_notice") if 
transaction { yield if block_given? } != true
end

这里的transaction函数可以用在action里面作为手动事务处理的解决办法。
http://www.cgpad.com/SPAN/articles_show/940

posted @ 2010-02-14 01:04 leekiang 阅读(828) | 评论 (0)编辑 收藏

在http://zh-cn.netbeans.org/kb/docs/ruby/rapid-ruby-weblog.html讲了如何一步一步创建一个最简单的应用。步骤如下:
1 在netbeans里建一个rails项目,名为rubyweblog
2 使用Scaffold生成post模型的全套文件.在"项目"窗口的rubyweblog项目上右键 ,点击生成(generate),在“Rails 生成器”对话框中,从“生成”下拉列表中选择 "scaffold",在“模型名称”文本框中键入 Post,在“属性对”文本框中键入 title:string 并单击“确定”按钮。
  语法:script/generate scaffold ModelName [field:type field:type]
3 生成数据库和表
  在“项目”窗口中,右键单击 rubyweblog 项目节点,然后从弹出式菜单中选择“运行/调试 Rake 任务”,从“匹配任务”列表中选择 db:create 并单击“完成”,这时会在mysql中生成开发库.这一步也可以手工做,也就相当于rake db:create
  在“项目”窗口中,右键单击 rubyweblog 节点并选择“迁移数据库”>“至当前版本”,这样会生成表结构。
4 修改"routes.rb" , 找到# map.root :controller => "welcome" 这一行,取消注释该行并将控制器更改为 "posts"。删除public下的index.html,Rails 将在 routes.rb 中寻找需要显示的页面。然后就可以运行了。
5 向posts 表中添加一个body字段
  右键单击“数据库迁移”节点,并从弹出菜单中选择“生成”,这将打开“Rails 生成器”对话框,它已经在“生成”下拉列表中选择了迁移(migration),当然也可以在项目上右键>生成>migration。
  在“参数”文本框中输入 AddBodyToPost body:text,其他默认,单击“确定”。这个"AddBodyToPost"只是一个名字。
  IDE会创建一个受版本控制的迁移脚本。该脚本的名称以日期和时间开头,并以 add_body_to_post.rb 结束。在项目上右键选择“迁移数据库”>“至当前版本”,或者在源文件中右键点击“运行文件”(这时要小心,可能会造成数据丢失
  修改new.html.erb、edit.html.erb和show.html.erb,增加与新字段相关的网页代码。

生成测试库与生成开发库类似,在“项目”窗口中,右键单击 rubyweblog项目,然后选择“运行/调试 Rake 任务”,在“参数”文本框中键入 RAILS_ENV=test,找到并双击 db:create 条目,以运行任务,从而创建 rubyweblog_test 数据库.接着找到并双击 db:test:prepare 条目。我觉得 db:test:prepare 可以不执行,因为点击项目右键"测试"时会自动执行db:test:prepare和rake db:fixtures:load

http://cn.oiax.jp/rails/rails_step_by_step/rails_step1.html说了config/routes.rb末尾附近的以下两行可以删掉,试了果然如此
map.connect ':controller/:action/:id'
map.connect ':controller/:action/:id.:format'


http://zh-cn.netbeans.org/kb/docs/ruby/quickstart.html

posted @ 2010-02-13 18:34 leekiang 阅读(709) | 评论 (0)编辑 收藏

1,
ruby之间的引用全部是源代码的引用,为了规范类库的管理,gems出现了。
gems是ruby源代码管理工具,代码按照一定的目录结构被组织成一个lib。
详见http://www.javaeye.com/topic/320384
Gem是第三方Ruby库,netbeans提供了Ruby Gems管理器,可以用来添加和维护gem,Tools > Ruby Gems。
rails和rake等都被rubygems管理。


  查看本机的gems:  gem list --local 
 
看看rubyforge.org上的gems:  gem list --remote
  删除某个版本的gem,例如gem uninstall rails -v=2.3.4

有一本书叫<Ruby Gems开发实战>

2,
Rake(http://rake.rubyforge.org)是一门构建语言,和make(www.gnu.org/software/make/)
ant(http://ant.apache.org)很相像。Rake是用Ruby写的,它支持它自己的DSL用来处理和维护
Ruby应用程序。Rails用rake的扩展来完成多种不同的任务.
详见http://www.javaeye.com/topic/300375
rake教程:http://railsenvy.com/2007/6/11/ruby-on-rails-rake-tutorial
    翻译:http://hi.baidu.com/%D0%C7203/blog/item/ebda2dd09f1d698ea1ec9c7a.html


posted @ 2010-02-13 18:32 leekiang 阅读(405) | 评论 (0)编辑 收藏

敏捷中国  http://groups.google.com.hk/group/agilechina?hl=zh-CN
高性能服务器研发与运营 http://groups.google.com.hk/group/dev4server
TopLanguage
python-cn
ttnn BI       http://groups.google.com.hk/group/ttnn

posted @ 2010-02-13 12:17 leekiang 阅读(288) | 评论 (0)编辑 收藏

JXplorer:The World's Finest Ldap Browser


CN,OU,DC都是LDAP连接服务器的端字符串中的区别名称(DN,distinguished    name);
LDAP连接服务器的连接字串格式为:ldap://servername/DN   
   其中DN有三个属性,分别是CN,OU,DC   
   LDAP是一种通讯协议,如同HTTP是一种协议一样的!

在     LDAP     目录中。           
    DC     (Domain     Component)       
    CN     (Common     Name)       
    OU     (Organizational     Unit)       
   一个 LDAP     目录类似于文件系统目录.     下列目录:       
          DC=redmond,DC=wa,DC=microsoft,DC=com       
    如果我们类比文件系统的话,可被看作如下文件路径:    
          Com\Microsoft\Wa\Redmond   

例如:CN=test,OU=developer,DC=domainname,DC=com

在上面的代码中cn=test     可能代表一个用户名, ou=developer 代表一个 active     directory中的     组织单位。这句话的含义可能就是说明test这个对象处在domainname. com域的developer组织单元中。


转自
http://stevenit.bokee.com/viewdiary.30578007.html

操作ldap的包有
SUN的LDAP API
mozilla的sdk,见http://www.mozilla.org/directory/javasdk.html
novell的jldap,见http://www.openldap.org/jldap/
不过spring ldap的ldaptemplate更好用
http://wangyaodi.javaeye.com/blog/202514
http://junewolf.javaeye.com/blog/52091

posted @ 2010-02-11 15:49 leekiang 阅读(306) | 评论 (0)编辑 收藏

转自
http://xiaosa.blog.51cto.com/665033/237429
http://hi.baidu.com/garywan/blog/item/c09f56ed6c739d3cacafd5de.html

前言:MyEclipse5.5 大小139M;MyEclipse6.5 大小451M;MyEclipse7.0 大小649M;MyEclipse8.0  大小772.3MB(速度方面比7.1和7.5都快了许多单还是很费内存) 
下 载服务器又是国外的,下载速度累人也就罢了,只要你工作性能一流。不幸的是,MyEclipse 属于狂吃内存的主,特别是 MyEclipse7.0 运行起来,基本上不用干其他工作了,它是一会Quick update,一会 updating indexes ,你耐着性子等它 update 完,它老人家又开始自动 validation 了! 

      实在忍无可忍,收集了一些关于解决 MyEclipse 的耗内存的办法,经测试非常有效,整理出来,希望可以方便更多的朋友。 

1、老是弹出Quick update error 、关闭myeclipse的Quick Update自动更新功能 
     这个问题的解决办法是关闭自动更新 
     Windows > Preferences > MyEclipse Enterprise Workbench > Community Essentials, 
     把选项 "Search for new features on startup"的前勾去掉即可。 

2 、关闭updating indexes 
      Window > Preferences > Myeclipse Enterprise Workbench > Maven4Myeclipse > Maven> 
      禁用Download repository index updates on startup 。
如果是myeclipse7.5:
(1)关掉maven自动更新:
window-preferences-MyEclipse Enterprise Workbench-Maven4MyEclipse-Maven,
关闭所有Download和Update开头的选项,共四项(去掉前面的勾)
(2)关闭更新调度:window –> preferences –> General –> Startup and Shutdown –> Automatic Updates Scheduler(去掉前面的勾)
(3)window –> preferences –>Myeclipse Dashboard,关闭Show……on start

3 、关闭MyEclipse的自动validation 
      validation有一堆,什么xml、jsp、jsf、js等等,我们没有必要全部都去自动校验一下, 
      只是需要的时候才会手工校验一 下,速度立马提升好几个档次 
      windows > perferences > myeclipse > validation 
      将Build下全部勾取消 
      如果你需要验证某个文件的时候,我们可以单独去验证它。方法是: 
      在需要验证的文件上( 右键 -> MyEclipse -> Run   Validation 。 

4、 启动优化,关闭不需要使用的模块 
      一个系统20%的功能往往能够满足80%的需求,MyEclipse也不例外,我们在大多数时候只需要20%的系统功能, 
     所以可以将一些不使用的模块禁止 加载启动。 
     Window > Preferences > General > Startup andy Shutdown 在这里列出的是MyEclipse启动时加载的模块 
     我这里只让它加载tomcat5 勾选 MyEclipse EASIE Tomcat 5 。 
     怎样才能知道哪些启动项有用呢?我现在把我知道的启动项用处说一下,还有很多不懂的, 
     希望大家懂的回复在下面    啊: 
          WTP :一个跟myeclipse差不多的东西,主要差别是 WTP 是免费的,如果使用myeclipse,这个可以取消 
          Mylyn:组队任务管理工具,类似于 CVS ,以任务为单位管理项目进度,没用到的可以取消 
          Derby:一种保存成 jar 形式的数据库,我没用到,取消 
          一大排以 MyEclipse EASIE 打头的启动项:myeclipse 支持的服务器,只选自己用的,其他取消, 
         比如我只选了    tomcat 。 

5 、去掉MyEclipse的拼写检查(如果你觉的有用可以不去) 
      拼写检查会给我们带来不少的麻烦,我们的方法命名都会是单词的缩写,他也会提示有错, 
      所以最好去掉,没有多大的用处 
      Window > perferences > General > Editors > Text Editors > Spelling > 将Enable spell checking复选框的勾选去掉。 

6 、去掉MyEclipse繁杂的自带插件自动加载项 
      Window > perferences > General > Startup and Shutdown > 将Plug-ins activated on startup 
      中的复选框有选择性的勾   选去掉。 

7 、修改MyEclipse编辑JSP页面时的编辑工具 
      Window > perferences > General > Editors > File Associations > 
      在File types 中选择 *.jsp > 在Associated editors 中将"MyEclipse JSP Editor"设置为默认。 
  据说修改此项的默认编辑器其实可以提高启动速度

8 、修改MyEclipse安装目录的eclipse.ini文件,加大JVM的非堆内存 
      具体内容如下: 
     -clean 
     -showsplash 
     com.genuitec.myeclipse.product.ide 
     –launcher.XXMaxPermSize 
     256m 
     -vmargs 
     -Xms128m 
     -Xmx512m 
     -Duser.language=en 
     -XX:PermSize=128M 
     -XX:MaxPermSize=256M 
     把下面的那个 -XX:MaxPermSize 调大,比如 -XX:MaxPermSize=512M,再把 -XX:PermSize 调成跟 
     -XX:MaxPermSize一样大


 几乎每次 eclipse 卡到当都是因为这个 非堆内存 不足造成的,把最大跟最小调成一样是因为不让 myeclipse 频繁的换内存区域大小
注意:XX:MaxPermSize 和 Xmx 的大小之和不能超过你的电脑内存大小!

需要修改是-Xmx,-XX:MaxPermSize,-XX:ReservedCodeCacheSize,
将这三项的值调大,但并不是越大越好,曾经在相同的条件下做过测试(内存2GB),-Xmx,-XX:MaxPermSize的值为384m时比512m时要快(视具体的计算机而定),
-Xmx,-XX:MaxPermSize的值设为同样大小且两者之和不能超出你的计算机本身的内存大小



没用的后台自动更新,根据需要可以去除,Maven 这项目管理,自己用不到,把他后台Download 关了,MyEclipse 的Dashboard 不给他自动启动,关了他。
网上看的那些老优化教程有些优化已经过时了,像加大JVM的非堆内存, 要改eclipse .ini 文件,现在已经变成 myeclipse.ini 文件了,而且他已经是优化好的版本了:
-Xmx512m
-XX:MaxPermSize=256m
-XX:ReservedCodeCacheSize=64m

更改代码提示快捷键

代码提示快捷键,默认为ctrl+space,而我们输入法切换也是,所以会有冲突。

windows–>perferences–>general–>Keys

更改 content assist 为 “alt+/” 或者“Shift+space”

如果采用“alt+/”,由于alt+/已经被word completion占用,所以得同时修改word completion的


第六步:Build Path中的一处改动解决jsp页面编写java代码时“卡死”现象

现象:在编辑jsp文件时 在“<%%>”之间编写代码时,在弹出智能提示的时候MyEclips就会被“卡死”。

尝试: 换版本,换系统,断网络。

原因:MyEclipse在智能提示的时候“自动访问”网络上sun公司的最新API文档,这样“断开网络”自然可以,但一边编码,一边上网,可能也是 大家的“良好习惯”,鱼和熊掌想要得兼。

方法:在项目上 右键 弹出 的菜单中找到“Build Path”,进入下一级 选择“Configura Build Path”,逐级找到JRE System Libraries->charsets.jar->javadoc location,点击右侧“Remove”按钮,即更改成为“javadoc location:(None)”,点击OK,重启 MyEclips 。

16、
window-preferences-MyEclipse Enterprise Workbench-Maven4MyEclipse-Maven,将Maven JDK改为电脑上安装的JDK,即不使用myeclipse提高的JDK
登记add按钮,选择你的电脑上的JDK即可(注意:不是JRE,我的值为:Java6.014)

17、
window-preferences-MyEclipse Enterprise Workbench-Matisse4Myeclipse/Swing,将Design-time information(dt.jar) location 改用电脑安装的JDK的dt.jar
(即不使用myeclipse提供的dt.jar,我的值为:C:\Java6.014\lib\dt.jar)

经过以上的优化,myeclipse的启动时间可以减少2/3,Tomcat的启动速度可以减少1/2(视具体情况而定),

特别16,17两项的优化效果最明显,如果只进行前几项,优化的效果有限.

另外,使用myeclipse一段时间后,就会产生很多项目,即使这些项目是处于关闭状态,myecliose在启动时也会加载这些项目,这个过程会花费很多时间,所以,建议将不用的项目都delete掉,用的时候再import

posted @ 2010-02-11 13:14 leekiang 阅读(3614) | 评论 (2)编辑 收藏

环境为eclipse3.6.1,jdk1.6
从android2.0开始,Android SDK被分为两部分:SDK启动程序软件包和SDK组件。
1,下载SDK启动程序软件包
   从http://androidappdocs.appspot.com/sdk/index.html下载android-sdk_r08-windows.zip,解压到E:\android-sdk-windows,然后把"E:\android-sdk-windows\tools;"加到环境变量的path里。
2,下载SDK组件
   可以在线安装(点击SDK Manager.exe),也可以手动安装。
   下载android-2.1_r01-windows.zip,解压到E:\android-sdk-windows\platforms\android-2.1_r01-windows,这样就手动安装了android-2.1_r01。
3,安装GEF,eclipse->Help->install new software->add按钮,输入名字gef,输入地址http://download.eclipse.org/tools/gef/updates/releases,点击ok,然后选择与当前eclipse版本相适应的gef,我把二级目录全部选中并安装了。
   如果不安装GET,在接下来的第4步安装时会报“ requires 'org.eclipse.gef 0.0.0' but it could not be found”错误。
4,安装ADT。我使用的是离线安装的方式。
   下载ADT-8.0.1.zip,下载地址为http://androidappdocs.appspot.com。
   安装步骤:eclipse->Help->install new software->add->Archive选择ADT-8.0.1.zip->OK
5, 使用SDK Manager.exe在线安装“Android SDK Platform-tools, revision 1”。不装在使用ADT时会报“SDK Platform Tools components is missing”。
6,在eclipse->Window->Preferences->Android中配置SDK路径为E:\android-sdk-windows
7,安装AVD(Android Virtual Devices)
   打开"SDK和AVD管理器",点击Virtual devices,然后在右边点击new按钮,输入名字,选择一个Target,然后填写SD Card的大小为64Mib,其他均为默认。
8,把SDK的tools和platform-tools目录都要加到PATH
9,新建一个android项目,注意把Min SDK Version设为7。项目建好后,可右击项目名然后点击Run As->Android Application,第一次运行需等待几分钟。


注:
1,E:\android-sdk-windows下的SDK Manager.exe可打开"SDK和AVD管理器",eclipse->window下拉菜单里的链接也可以打开,但比前者要少Settings设置项。
2,If you are developing in Eclipse with ADT, note that SDK Tools r8 is designed for use with ADT 8.0.0 and later. After installing SDK Tools r8, we highly recommend updating your ADT Plugin to 8.0.0.
Also note that SDK Tools r8 requires a new SDK component called Platform-tools. The new Platform-tools component lets all SDK platforms (Android 2.1, Android 2.2, and so on) use the same (latest) version of build tools such as adb, aapt, aidl, and dx. To download the Platform-tools component, use the Android SDK Manager, as described in Adding SDK Components
Upgrading from SDK Tools r7:
If you are upgrading to SDK Tools r8 from an earlier version, note that the the default installed location for the adb tool has changed from <SDK>/tools/adb to <SDK>/platform-tools/adb. This means that you should add the new location to your PATH and modify any custom build scripts to reference the new location. Copying the adb executable from the new location to the old is not recommended, since subsequent updates to the SDK Tools will delete the file.
3,感觉自己的安装步骤有点乱,下次改一下:先装SDK启动程序软件包即SDK tools,通过SDK tools安装android-2.1_r01和Android SDK Platform-tools,设置环境变量,然后才安装ADT。
4,权威的安装步骤见http://androidappdocs.appspot.com/sdk/installing.html
5, 由于模拟器每次启动都比较慢,我们可以在打开模拟器之后不要再关闭,这样每次运行Android应用 ADT就会自动使用这个模拟器,这样就不用每次都启动了

安装相关:
http://www.cnitblog.com/gyn/archive/2008/03/17/41038.html
http://emck.avaw.com/?p=62
http://shizukyo.javaeye.com/blog/254124
http://www.hiapk.com/bbs/thread-123617-1-1.html
http://www.eoeandroid.com/thread-14174-1-1.html
http://zhengtao620.blog.163.com/blog/static/1621465472010105111530403/
http://apps.hi.baidu.com/share/detail/15798968


  在Google Android平台上运行Berkeley DB Java Edition

DroidDraw 是一个基于Java Swing的Android界面设计器,我们可以通过它来生成复杂的 Android Layout XML文件


posted @ 2010-02-10 01:55 leekiang 阅读(988) | 评论 (0)编辑 收藏

jquery-transmit:
jQuery Multi-file Uploader with Flash

posted @ 2010-02-02 22:57 leekiang 阅读(389) | 评论 (0)编辑 收藏

1,《Pragmatic Thinking and Learning: Refactor Your Wetware》

Wetware, 湿件(计算机专家用语,指软件、硬件以外的“件”,即人脑)
Wetware就是你脑子里面的东西,它位于你的两耳之间,所有的行为——与软件开发相关的所有思考都明确无误地在其中发生。这些思考不会来自IDE,我们也不会通过什么编辑器来生产软件——软件是在你我的头脑里、在团队成员的头脑里面开发的。这才是一切的源头。
为什么Wetware对敏捷实践者来说尤其重要?反馈与改进是敏捷的一项重要基础。有些改进是实践层面上的,比如要遵循的实践、规则以及指南等等。更高一 级的改进,就得思考如何改进人们的思维方式:让他们更好地解决问题、提升他们的创造力,以及人们思考的角度从“新手”变为“专家”时,在解决问题方式上的 转变。对于团队来说,从回顾中得到针对实践和流程的反馈很重要。而对于个人来说,在提升自己在某个领域中技能时重新调整思维方式的能力,同样举足轻重。
摘自http://www.infoq.com/cn/news/2008/07/retrospective-wetware

2,《The Passionate Programmer: Creating a Remarkable Career in Software Development》
3,《Manage Your Project Portfolio: Increase Your Capacity and Finish More Projects
4,《Ship it!: A Practical Guide to Successful Software Projects
5,《Release It!: Design and Deploy Production-Ready Software
6,《Manage It!: Your Guide to Modern Pragmatic Project Management
7,
Rails Test Prescriptions

《Making it Big in Software: Get the Job. Work the Org. Become Great》

posted @ 2010-02-01 23:33 leekiang 阅读(283) | 评论 (0)编辑 收藏

后台用tomcat,用IE6访问同一个url,每次生成相同的sessionID,这是正常的。
而如果后台服务器改用weblogic8,用IE6访问同一个url,竟然每次都会生成新的sessionID,
重启IE6就好了,太奇怪了。

本笔记重点是IFrame跨域的session问题:

Frameset引起的内部第三方站点cookie丢失的发现解决过程http://www.phpchina.com/html/34/12834-11369.html
跨域session丢失问题http://blog.javaflag.com/blog/?p=484
用P3P header解决iframe跨域访问cookiehttp://blog.csdn.net/wonder4/archive/2008/02/27/2125804.aspx
Liferay Portal额外研究(三):IFrame Portlet地session丢失疑难处理 http://www.qqgb.com/Program/Java/javadoc/javalib/Program_156031.html

posted @ 2010-01-28 11:57 leekiang 阅读(2218) | 评论 (0)编辑 收藏

我最近在开发一个使用Spring MVC的Web程序时遇到了一个奇怪的问题:自己写的Spring AOP切面对Controller中的方法切点不起作用。

后来我查了一下,Spring对自己的MVC(Controller)有特殊的拦截方法,需要在URLHandlerMapping中配置 Interceptor实现,它可以对请求进行拦截。因此直接用Spring AOP切面拦截Controller中的任何方法都是不起作用的。(具体的实现过程我不是很清楚,但是很多文章和贴子表达的意思是这样的)

后来,我做了一个实验。通过IOC将一个业务对象注入Controller中,然后将AOP配置成作用于该业务对象的方法上,结果还是不起作用。 我几乎试验了所有的Spring AOP和AspectJ的实现和配置方法,都不起作用。后来我用同样的类方法和同样的配置方式,写了一个脱离了Spring MVC的测试程序,一切正常,切面能够起到作用。

如果说Spring AOP对Spring MVC的Controller的方法不起作用,难道对注入到Controller的类方法也不起作用吗???我想得到一个准确的答案,谢谢!!! (bryantd)

我对Spring的MVC并不是很熟,不过刚才仔细看了一下源码,我觉得应该之所以Spring的AOP没有对Controller应用成功的原因 是:Spring MVC在启动的时候会根据处理器策略加载handler映射到一个map中,这个时候因为配置的原因它从容器中取到的对象是原生对象,而不是我们代理的对 象;所以不管我们的Controller做了什么操作都不会经过我们的代理,这样AOP就失去了作用;获取handler的方法应该是 DefaultListableBeanFactory的getBeanNamesForType方法;这是我自己在查看源码后总结出来的,如果有什么不 对的地方大家讨论下  (layer555)

转自http://www.javaeye.com/problems/20363

posted @ 2010-01-27 23:53 leekiang 阅读(3301) | 评论 (1)编辑 收藏

1,List转数组
    List list = new ArrayList();
        list.add("1");
        list.add("2");
        int size = list.size();
        String[] arr = (String[]) list.toArray(new String[size]);
     必须带参数new String[size],否则会报造型异常

2, 数组转List
    String[] arr = new String[] {"1", "2"};
    List list = Arrays.asList(arr);

3,  Arrays.binarySearch(Object[] arr,Object key)
    public static int binarySearch(int[] a,int key)使用二进制搜索算法来搜索指定的 int 型数组,以获得指定的值。必须在进行此调用之前对数组进行排序(通过上面的 sort 方法)。如果没有对数组进行排序,则结果是不明确的。如果数组包含多个带有指定值的元素,则无法保证找到的是哪一个。
    也就是说必须先执行Arrays.sort,再执行Arrays.binarySearch

4, commons-lang的ArrayUtils
   1)ArrayUtils.contains()方法可以判定数组是否存在指完元素.比Arrays.binarySearch好用(见上文)
     当然有两个比较实用的方法ArrayUtils.lastIndexOf()和ArrayUtils.indexOf()
   3)使用ArrayUtils.reverse(arr)方法可以反转一个数组
   4)使用ArrayUtils.toObject(arr)和ArrayUtils.toPrimitive(arr)两个方法,
     即可互相转换基本类型数组和对象数组
   5)ArrayUtils.toString()方法可以输入数组内容,此方法接受任意一个数组
     作为参数并输出其内容,输出时所有元素位于大括号,中间逗号隔开。
     如new String[] { "1","2","3","fd","3g"}会输出为字符串"{1,2,3,fd,3g}"
   6)// 判断数组是否为空(null和length=0的时候都为空)
        ArrayUtils.isEmpty(new int[0]);// true
        ArrayUtils.isEmpty(new Object[] { null });// false
   7)
// 合并两个数组
        ArrayUtils.addAll(new int[] { 135 }, new int[] { 24 });// {1,3,5,2,4}
   8)// 删除数组中某个对象(从正序开始搜索,删除第一个) 注意只删除一个
        ArrayUtils.removeElement(new int[] { 135 }, 3);// {1,5}




posted @ 2010-01-14 18:43 leekiang 阅读(780) | 评论 (0)编辑 收藏

JEP
http://www.singularsys.com/jep/
https://sourceforge.net/projects/jep/
http://rabbit8.bokee.com/3936531.html
http://suneca.com/article.asp?id=28

http://www.javaeye.com/topic/58422里办法多

关于jexl
1,jexl1.1计算分母为0的表达式时,竟然算出来的值为0,被某人说没有逻辑https://issues.apache.org/jira/browse/JEXL-45
2,jexl2解决了这个问题,但jexl2依赖jdk5
https://issues.apache.org/jira/browse/JEXL-58
handles ArithmeticException (divide by zero)
division by zero ignored only if JexlEngine.isSilent()
JexlEngine jexl = new JexlEngine();
jexl.setCache(
512);//有何用
jexl.setLenient(false);//什么意思
jexl.setSilent(false);

String calculate 
= "(G1 + G2)/2";
Expression e 
=jexl.createExpression(calculate);
// populate the context
JexlContext context = new MapContext();
context.set(
"G1""3");
context.set(
"G2""5");
Object res 
= e.evaluate(context);//silent为false时evaluate方法会抛异常,为true不抛异常但res为null

           
另外,利用oracle计算,如果分母为0会报ORA-01476: divisor is equal to zero

posted @ 2010-01-06 00:44 leekiang 阅读(1095) | 评论 (0)编辑 收藏

resultSetType 的可选值有: ResultSet.TYPE_FORWARD_ONLY ResultSet.TYPE_SCROLL_INSENSITIVEResultSet.TYPE_SCROLL_SENSITIVE
1)
TYPE_FORWARD_ONLY是默认值, 仅支持结果集forward ,不支持滚动,也不是 SENSITIVE的
2)
ResultSet.TYPE_SCROLL_INSENSITIVE,
支持结果集backforwardlastfirst 等操作,对其它session对数据库中数据做出的更改是不敏感的
原因:JDBC对数据库进行数据查询executeQuery时,数据库会创建查询结果的cache和cursor,如下面sql:
    select name,id from foo
    用jdbc执行上面的sql语句时,数据库会把foo表所有记录的name和id字段缓存到cache中,之后cache和真正的数据库数据文件没有任何联系了,foo表发生的改变在查询完成后不会自动同步到cache上去,因此TYPE_SCROLL_INSENSITIVE对选择数据做出的更改是不敏 感,不可见。
3)ResultSet.TYPE_SCROLL_SENSITIVE
支持结果集backforwardlastfirst 等操作,对其它session对数据库中数据做出的更改是敏感的,即其他session 修改了数据库中的数据,会反映到本结果集中
上面的select name,id from foo语句用TYPE_SCROLL_SENSITIVE的Statement来执行,会转化成以下的sql语句:
    select rowid from foo
    数据库这时候是把foo表所有记录的rowid缓存到cache中,用户代码在fetch记录时,再继续做以下查询:
    select name,id from foo where rowid=?
    因此这时候发生的查询是实时从真正的数据库数据文件中取,因此对期间发生的数据更改是可见的,敏感的。但是这种可见性仅限于update操作,而 insert和delete同样是不可见的。因为如果查询发生在insert之前,insert生成的rowid并不会反应在cache中的rowid结果集上。在一个记录的rowid已经缓存到cache中,这时候被删除了,但一般数据库的删除是标记删除,也就是说rowid对应那行记录并没有真正从数 据库文件中抹去,一般是可以再次取到记录的。

结论:是否SENSITIVE与fetchsize没有什么关系。是否SENSITIVE是告诉数据库如何作查询的缓存。fetchsize是客户端jdbc的设置。

另外oracle的
fetchsize默认为10
stmt.setFetchSize(0)时stmt.getFetchSize()=1
0
stmt.setFetchSize(1)时stmt.getFetchSize()=1

另外如果查询的sql复杂时,我发现就算设为
ResultSet.TYPE_SCROLL_SENSITIVE也不起作用,如
select t.*  from test t left join testp p on t.pid=p.id where p.title like '%国%',在运行中修改title的值,发现仍然可以取到。是否可以理解为SENSITIVE只对查询的主表起作用。

摘自:
http://www.javaeye.com/topic/128636
http://www.javaeye.com/topic/560109
http://www.javaeye.com/topic/418604

posted @ 2010-01-03 23:57 leekiang 阅读(959) | 评论 (0)编辑 收藏

1,
Hibernate动态模型(dynamic models) 一对多映射的实现
http://scnjl.blogbus.com/logs/35361929.html

2,
hibernate shards

3,
http://www.javaeye.com/topic/142404

4,
http://www.infoq.com/cn/articles/hibernate-custom-fields

posted @ 2010-01-03 17:31 leekiang 阅读(299) | 评论 (0)编辑 收藏

转自http://davidwang.javaeye.com/blog/83952(此文思路相当清晰,值得一看)

http://jakarta.apache.org/turbine/

Turbine是一个提供了完善权限控制的坚实框架(Fulcrum子项目是其基石)。Turbine的个人用户不多,但不少公司用户选择 Turbine作为框架,开发一些严肃的应用(我并没有说,用其它框架开发的应用就不严肃^_^)。Portal开源项目JetSpeed建立在 Turbine上。

Turbine用RunData来传递输入输出数据。如同Maverick的ControllerContext,RunData是整个 Turbine框架的数据交换中心。除了request, response等基本信息,RunData直接包括了User/ACL等权限控制相关的属性和方法,另外还包括Action Name和Target Template Name等定位属性。

Module是Turbine里面除了RunData之外的又一个核心类,是Turbine框架的基本构件,Action是 Module,Screen也是Module。Turbine提供了LoginUser和LogoutUser两个Action作为整个系统的出入口。而 其余流量的权限控制则由类似于Servlet Filter机制的Pipeline控制。

Turbine Pipeline的编程模型和Servlet Filter一模一样:Turbine Pipeline的Valve就相当于Servlet Filter,而ValveContext则相当于Filter Chain。还有更相近的例子,Tomcat源代码里面也有Valve和ValueContext两个类,不仅编程模型一样,而且名字也一样。



权限控制贯穿于Turbine框架的始终。要用好Turbine,首先要通晓子项目Fulcrum 的Security部分的权限实现模型。

Fulcrum Security的权限实体包括四个-- User, Group, Role, Permission。

实体之间包含{Role,Permission}和{ Group, User, Role}两组关系。

{Role,Permission}是多对多的关系,一个Role可以具有各种Permission;{ Group, User, Role}之间是多对多的关系,一个Group可包含多个User,并可以给User分配不同的Role。

权限模型的实现同样采用Peer模式,Entity -> EntityPeer, Entity -> ManagerPeer。

Entity和EntityManger代表抽象的模型概念,而EntityPeer和ManagerPeer代表具体的实现。

用户可以根据模型,提供不同的实现,比如,用内存结构中实现,用数据表结构实现,与Windows NT权限验证机制结合,与OSWorkflow的权限控制模型结合,等等。其中,用数据表结构实现,又可以选择用Torque实现,或者用 Hibernate实现。(Torque是Turbine的O/R Mapping子项目)
例如,Falcrum.property配置文件包含如下Security相关选项:

# -------------------------------------------------------------------

# S E C U R I T Y S E R V I C E

# -------------------------------------------------------------------

services.SecurityService.user.class=org.apache.fulcrum.security.impl.db.entity.TurbineUser

services.SecurityService.user.manager=org.apache.fulcrum.security.impl.db.DBUserManager

services.SecurityService.secure.passwords.algorithm=SHA

# -------------------------------------------------------------------

# D A T A B A S E S E R V I C E

# -------------------------------------------------------------------

services.DatabaseService.database.newapp.driver=org.gjt.mm.mysql.Driver

services.DatabaseService.database.newapp.url=jdbc:mysql://127.0.0.1/newapp

services.DatabaseService.database.newapp.username=turbine

services.DatabaseService.database.newapp.password=turbine



这说明,权限控制实现由数据库提供,需要根据权限模型创建如下数据表:

TURBINE_USER,TURBINE_ROLE,TURBINE_GROUP,

TURBINE_PERMISSION,TURBINE_ROLE_PERMISSION,

TURBINE_USER_GROUP_ROLE

Turbine表单处理中的中文:http://dev.csdn.net/article/70476.shtm

使用turbine的项目:
1)http://www.campware.org的Cream CRM
2)http://scarab.tigris.org/
3)Ohioedge 是采用B/S架构的开源的客户管理系统。基于Jetspeed/Turbine技术
  http://www.ohioedge.com/

参考资料:
http://turbine.apache.org/fulcrum/fulcrum-osworkflow-example
http://www.itpub.net/thread-306279-1-1.html
http://dev.csdn.net/article/19/19994.shtm

posted @ 2009-12-29 04:46 leekiang 阅读(699) | 评论 (0)编辑 收藏

1,关于statement,resultset和connection的问题

statement,resultset属于弱refrence,即如果statement关掉,resultset就会被自动释构,弱 refrence的做法不保险,所以JDBC3.0开始明确规定了如果connection被关,所有statement都应该关,不过这取决于使用的数 据库驱动。
应该DBMS 执行操作后,显式的关闭statement ,因为在connection关闭前,JDBC statement仍旧处于打开状态,当返回resultset后,关闭statement是必要的,尤其在遇到异常的时候。
如果不使用connection pool可以直接关闭connection,不考虑statement的关闭,使用连接池的时候,务必关闭statement,否则你的连接马上被用光,使用statement pooling除外。

http://www.w3china.org/blog/more.asp?name=hongrui&id=10283



2,Software caused connection abort: socket write error

最终找到了原因:sql写错了,写成了where name='?'

有人说原因:
oracle数据库连接与连接池之间冲突导至.
oracle database把空闲一段时间的连接关闭了,而应用服务器连接池却认为该边接还是可用的,再次访问时还是使用该连接,导致出现连接异常。
方法,当然是改数据库配置了.

spring对oracle的clob和StoredProcedure 的处理

经过几天的夜战,终于知道使用spring对oracle的存储过程操作,程序死掉的真正原因,一旦执行存储过程没有任何返回值,因为 “Statement.getUpdateCount() returns 1 instead of -1”,是oracle的驱动的bug,10.1.0.2的驱动就不行,听说10.1.0.3就没有问题,但是10.1.0.3的jdbc驱动不能下载。大家可以使用weblogic8.1SP3带的10.1.0.2或weblogic9beta的10.1.0.2,可以解决这个问题。不知道开发 oracle jdbc的程序员是什末人,没毕业的大学生,还是拖欠了工资的程序员,开发水平远不如开源数据库的jdbc驱动的人呢,再次建议oracle驱动最好是自己命名,把文件名加上版本信息,要不会死人的。

http://72.5.124.102/thread.jspa?messageID=1424984

http://group.gimoo.net/review/44109

http://azi.javaeye.com/blog/182146

http://hi.baidu.com/happyidea/blog/item/c84b313de75add0abba16779.html



3,Random Connection Closed Exceptions

These can occur when one request gets a db connection from the connection pool and closes it twice.

见http://tomcat.apache.org/tomcat-4.1-doc/jndi-datasource-examples-howto.html

posted @ 2009-12-25 02:31 leekiang 阅读(396) | 评论 (0)编辑 收藏

事务直接配到DAO上
<bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <bean id="baseTxProxy"
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
        lazy-init="true" abstract="true">
        <property name="transactionManager">
            <ref bean="transactionManager" />
        </property>
        <property name="transactionAttributes">
            <props>
                <prop key="update*">PROPAGATION_REQUIRED</prop>
            </props>
        </property>
    </bean>

    <bean id="studentDaoProxy" parent="baseTxProxy">
        <property name="target">
            <ref bean="studentDao" />
        </property>
    </bean>

    <bean id="studentDao" class="com.dao.StudentDaoImpl">
        <property name="dataSource" ref="dataSource" />
    </bean>
    
    StudentDao st = (StudentDao) context.getBean("studentDaoProxy");
    
    两个bean也可以合并为
    <bean id="studentDao" parent="baseTxProxy">
        <property name="target">
            <bean class="com.dao.StudentDaoImpl">
                <property name="dataSource" ref="dataSource" />
                <property name="kpiDao" ref="kpiDao" />
            </bean>
        </property>
    </bean>
    StudentDao st = (StudentDao) context.getBean("studentDao");
    上述这种方式必须使用接口,为什么。
    
    
    第二种同样必须用接口。配置起来比第一种麻烦
        <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <bean id="transactionInterceptor"
        class="org.springframework.transaction.interceptor.TransactionInterceptor">
        <property name="transactionManager" ref="transactionManager" />
        <property name="transactionAttributes">
            <props>
                <prop key="update*">PROPAGATION_REQUIRED</prop>
            </props>
        </property>
    </bean>
    <bean id="studentDaoProxy"
        class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="target" ref="studentDao" />
        <property name="interceptorNames">
            <list>
                <value>transactionInterceptor</value>
            </list>
        </property>
    </bean>
    
    <bean id="studentDao" class="com.dao.StudentDaoImpl">
        <property name="dataSource" ref="dataSource" />
    </bean>
    ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
    StudentDao st = (StudentDao) context.getBean("studentDaoProxy");
    
    如果使用的都是接口,那么就不需要用cglib-nodep-2.1_3.jar
    如果service调dao没有用到接口,那么必须用cglib-nodep-2.1_3.jar


事务策略: 了解事务陷阱 http://www.ibm.com/developerworks/cn/java/j-ts1.html 事务策略: 高并发策略 http://www.ibm.com/developerworks/cn/java/j-ts5/index.html 这是一个系列.

http://beet.sourceforge.net
Beet records user behavior and performance data for your Spring-based Java application.  It can thus help you to analyze usage patterns and research production performance issues.

posted @ 2009-12-24 22:04 leekiang 阅读(279) | 评论 (0)编辑 收藏

SQL标准允许基于一个带参数列表的表达式进行查询。一个典型的例子可能像这样:"select * from T_ACTOR where id in (1, 2, 3)"。 不过这种参数列表的方式并不能直接被JDBC标准所支持 - 因为并不存在这种声明一个列表参数作为占位符的方式。 你不得不为此写多个占位符来表示多个参数,或者当你知道占位符的数量时,你可以动态构建SQL字符串。 NamedParameterJdbcTemplate和SimpleJdbcTemplate中所提供的命名参数的特性,采用的是后面一种做法。 当你传入参数时,你需要传入一个java.util.List类型,支持基本类型。而这个list将会在SQL执行时替换占位符并传入参数。
在使用IN语句时,当你传入大批量的值时要小心,JDBC标准并不确保超过100个元素在IN语句中。 有不少数据库可以超出这个值的限制,但是不同的数据库会有不同的数量限制,比如Oracle的限制数量是1000个。
除了基本类型之外,你还可以创建一个java.util.List的对象数组,这可以让你支持在IN表达式中编写多重表达式,例如"select * from T_ACTOR where (id, last_name) in ((1, 'Johnson'), (2, 'Harrop'))". 当然,这样做的前提是数据库底层的语法支持。

http://www.javaeye.com/problems/6124
select count(*) num from lottery_term where term_issuenum in (?) and term_lotteryid = ?
改成getJdbcTemplate().queryForInt(sql,new Object[]{new String[]{"2008326","2008325","2008324"},103});
List list=new ArrayList();
list.add("****");
getJdbcTemplate().queryForInt(sql,new Object[]{list,103});

select count(*) from info_document where category_id in (:category_id_list);
Map<String,Object> parm = new HashMap<String,Object>();
parm.put("category_id_list", idList);


  public List getAllStu() {

       String sql="select s_id as sid,s_name as sname,s_sex as ssex,s_brith as sbrith from stu";

       List list=this.getJdbcTemplate().query(sql,new BeanPropertyRowMapper(Stu.class));

       return list;

    }


关于execute和update方法之间的区别,update方法返回的是受影响的记录数目的 一个计数,并且如果传入参数的话,使用的是java.sql.PreparedStatement,而execute方法总是使用 java.sql.Statement,不接受参数,而且他不返回受影响记录的计数,更适合于创建和丢弃表的语句,而update方法更适合于插入,更新 和删除操作,这也是我们在使用时需要注意的。



Connection conn=DataSourceUtils.getConnection(getJdbcTempldate().getDataSource());

conn=getJdbcTemplate().getNativeJdbcExtractor().getNativeConnection(conn);

OracleConnection oconn=(OracleConnection)conn;

通过DataSourceUtils获取当前线程绑定的数据连接,为了使用线程上下文相关的事务,这样写是正确的写法,如果直接从DataSource获取连接,得到的是和当前线程上下文无关的新的数据库连接实例。

http://www.javaeye.com/topic/49932?page=2

http://www.javaeye.com/problems/15846

http://www.javaeye.com/topic/87034

http://www.javaeye.com/topic/508799

http://ttitfly.javaeye.com/blog/151560


jdbcTemplate的方式里如果带上int[] argTypes显示指定每个占位符所对应的字段数据类型,可以保证类型安全,当参数值为null时,提供了更好的支持。

-----------------------

上面这句话如何理解?


后在http://javazoo.bokee.com/viewdiary.15850865.html找到原因了

今天在调试程序的时候,在后台业务逻辑类中利用JdbcTemplate进行数据同步操作时,发现当
执行jdbcTemplate.update(带?的SQL语句,new Object[]{tmp.getName( ),tmp.getNo( ),tmp.getSpeciality( ),tmp.getMounterofficer( ),tmp.getDesigner( ),tmp.getProductivity( ),tmp.getState( ))
这种操作时,如果后面参数中有值为null时,后台会报异常,细想下也是,如果是null,那就要执行jdbc的setNull(Spring底层还是用JDBC做的)方法了,但是setNull方法要知道具体的数据库字段的类型.如setNull(1,Types.VARCHAR).而在上面的方法没有体现.
终于体会到update方法中第三个参数new int[]的作用了.!
spring还是很伟大的.


如果字段名和属性名是严格对应的,那么就可以不用自己写RowMapper了,使用BeanPropertyRowMapper:

getJdbcTemplate().query(sql, new BeanPropertyRowMapper(User.class));  

类的属性字段名称要数据库中的字段名称一样或者数据库字段名为s_id类的名称为SId,
如果你没有遵守这个规范则可以在select语句后面给数据库字段名取别名


//绑定参数时,日期类型的写法,未经过验证

    public void updStu(Stu stu) {
String sql = "update stu set s_name=?,s_sex=?,s_brith=? where s_id=?";
Object[] obj = new Object[] { stu.getSname(), stu.getSsex(),new java.sql.Date(stu.getSbrith().getTime()), stu.getSid() };
      getJdbcTemplate().update(sql, obj, new int[] { Types.VARCHAR, Types.VARCHAR,Types.DATE, Types.INTEGER });
    }



ConnectionCallback的用法,使用完要手动关闭连接吗?

spring的AbstractRoutingDataSource,可以多态切换数据库?


事务抽象层http://blog.csdn.net/congqian1120/archive/2008/01/16/2046311.aspx




http://www.oracle.com/technology/global/cn/pub/articles/marx_spring.html

posted @ 2009-12-23 17:29 leekiang 阅读(789) | 评论 (0)编辑 收藏

jdk1.4下使用spring2.5时报上述这个错误,把xerces-2.6.2.jar放进去就好了。奇怪的是spring自带的jar包里没有xerces.jar
jfreechart里的gnujaxp.jar
cewolf里的crimson-1.1.3.jar
j2ee自带的xml-apis.jar
xercesImpl.jar
这些jar与Your JAXP provider有何关系

posted @ 2009-12-21 10:41 leekiang 阅读(2784) | 评论 (0)编辑 收藏

Hibernate 的确通过 PersistentEnum 接口提供了对标准化 的支持,这使得我们的域对象实现了一个与 ShippingCompany 对象非常类似的结构。然而,我们可能对将域对象与某个特定的持久化实现过于耦合持保守态度。如果我们计划长期使用 Hibernate ,这可能并不是一个太大的问题,但是请谨慎考虑这个决策。如果我们使用 ibatis ,那么我们就完全没那么幸运了;它完全不支持标准化。谢天谢地,如果我们的 ORM 导致过耦合或者完全没有这方面的支持,还有个解决方案——使用 JDBC

Spring 的支持,使用 JDBC 变得如此简单,我们不会再因为它的复杂性而将其的优先级打个折扣。可是,如果我们选择使用某个特定的 ORM 工具,那么我们就很难用基于 JDBC DAO 实现进行替换了——目前我们就是这样。当我们同时在一个类中包含了 JDBC hibernate 代码时,我们就无法使用 Spring 提供的支持。因为我们的 DAO 只能扩展 HibernateDaoSupport JdbcDaoSupport 二者之一。幸运的是,这里有一个优雅的解决方案,它允许我们将 Hibernate JDBC 代码封装在同一个类之内,而不会因此失去 Spring 的支持。这个方案的关键在于将 JDBC 代码封装在内部类中,之后将主体 DAO 的调用委托给这个内部类去完成。代码清单 11-6 提供了一个示例:

代码清单 11-16. 在一个单独的 DAO 中混合使用 Hibernate JDBC

package com.apress.prospring.ch11.canonicalization;

 

import org.springframework.jdbc.core.support.JdbcDaoSupport;

import org.springframework.orm.hibernate.support.HibernateDaoSupport;

 

public class MyDao extends HibernateDaoSupport {

 

   private MyJdbcDao innerDao;

 

   public MyDao() {

      innerDao = new MyJdbcDao();

   }

 

   public void update(MyDomainObject obj) {

      // use Hibernate to persist the data

   }

 

   public MyDomainObject getById(int someId) {

      return innerDao.getBy(someId);

   }

 

   private static class MyJdbcDao extends JdbcDaoSupport {

 

      public MyDomainObject getBy(int someId) {

         // do some real processing

         return null;

      }

   }

}

 

尽管这只是一个简单的实现,我们也可以从中得到启发。所有的 JDBC 相关代码都被转移到一个内部类中,而此内部类扩展了 JdbcDaoSupport , 所有的 Hibernate 相关功能都留在外部,外部类仍然是 HibernateDaoSupport . 的子类。通过这个类,我们可以使用 Hibernate 完成域对象的持久化,但是我们可以将查询功能交给嵌入的 JDBC DAO 去完成。

在我们的应用中有效利用标准化 ,可以通过避免大量无谓对象的创建,从而极大提升内存使用效率。如果我们必须更新标准化对象相关的数据,同时我们在 DAO 中使用了 ORM 框架,那么我们就可以以 ORM 无关的形式引入一些 JDBC 代码来加入标准化 支持。


来源:Pro Spring中文版 http://book.csdn.net/bookfiles/48/100481407.shtml

http://hi.baidu.com/%D3%F4%C3%C6%BB%A8%C9%FA%BD%B4/blog/item/7768d41e8c06ceffe0fe0ba6.html

posted @ 2009-12-18 16:51 leekiang 阅读(976) | 评论 (0)编辑 收藏

“Hibernate与JDBC(iBATIS)  都使用 DataSourceTransactionManager 同样可以保证事务
原理就是保证了 connection 的唯一性。
jdbc我是调spring的jdbcTemplate来操作,
经过测试。在同一个数据源的情况下直接使用Hibernate的TxManager可以同步事务,问题解决。

Rod Johnson的话:
引用
It is possible--and sometimes useful--to have coordinated transactions for both. Your JDBC transactions will be managed by the HibernateTransactionManager if you work with the same JDBC DataSource in the same transaction. That is, create the SessionFactory using Spring's SessionFactoryBean using the same DataSource that your JdbcTemplates use.

The only issue to watch, of course, is that you may be invalidating your Hibernate cache by JDBC changes. Generally I find it best to use JDBC to update only tables that don't have Hibernate mappings.

Juergen Hoeller的话:
引用
As Rod said, simply keep using HibernateTransactionManager, which auto-detects the DataSource used by Hibernate and seamlessly exposes Hibernate transactions as JDBC transactions for that DataSource. JDBC code that accesses the same DataSource via Spring will automatically participate in such transactions.

Note that you must specify the DataSource for Hibernate via LocalSessionFactoryBean's "dataSource" property to allow HibernateTransactionManager to auto-detect it. Alternatively, you can explicitly pass the DataSource to HibernateTransactionManager's "dataSource" property.
http://www.fireflow.org/redirect.php?tid=498

Rod Johnson在spring 论坛中有一句话很好的总结了如何在测试中处理hibernate缓存:
Remember that you can clear the Hibernate session, removing objects already associated with it. This is often necessary before requerying in tests, and solves most (if not all) problems.
I typically use JDBC for verification. The pattern is
- do Hibernate operation
- flush Hibernate session
- issue JDBC query to verify results
That way I'm verifying what Hibernate did to the database in the same transaction.

posted @ 2009-12-11 00:14 leekiang 阅读(990) | 评论 (0)编辑 收藏

<jsp:include page=""/> 运行时插入 <%@ include file="" %> 编译时插入
这样后者引入的jap里的java变量可以在include标记后面使用。
见http://www.blogjava.net/Unmi/archive/2007/08/10/135913.html

posted @ 2009-12-03 22:07 leekiang 阅读(316) | 评论 (0)编辑 收藏

1,基本用法
http://blog.163.com/fxf_java/blog/static/59268637200822833715185/
2,JdbcTemplate的连接
http://www.javaeye.com/topic/89845
http://forum.springsource.org/showthread.php?t=63444
3,ConnectionCallback
http://blog.csdn.net/lin49940/archive/2009/10/22/4712883.aspx

public interface ConnectionCallback

Generic callback interface for code that operates on a JDBC Connection. Allows to execute any number of operations on a single Connection, using any type and number of Statements.

This is particularly useful for delegating to existing data access code that expects a Connection to work on and throws SQLException. For newly written code, it is strongly recommended to use JdbcTemplate's more specific operations, for example a query or updat variant.

doInConnection

ObjectdoInConnection(Connection con)
throws SQLException,
DataAccessException
Gets called by JdbcTemplate.execute with an active JDBC Connection. Does not need to care about activating or closing the Connection, or handling transactions.

If called without a thread-bound JDBC transaction (initiated by DataSourceTransactionManager), the code will simply get executed on the JDBC connection with its transactional semantics. If JdbcTemplate is configured to use a JTA-aware DataSource, the JDBC Connection and thus the callback code will be transactional if a JTA transaction is active.

Allows for returning a result object created within the callback, i.e. a domain object or a collection of domain objects. Note that there's special support for single step actions: see JdbcTemplate.queryForObject etc. A thrown RuntimeException is treated as application exception: it gets propagated to the caller of the template.

Parameters:
con - active JDBC Connection
Returns:
a result object, or null if none
Throws:
SQLException - if thrown by a JDBC method, to be auto-converted to a DataAccessException by a SQLExceptionTranslator
DataAccessException - in case of custom exceptions
See Also:
JdbcTemplate.queryForObject(String, Class), JdbcTemplate.queryForRowSet(String)


2,

posted @ 2009-11-30 04:46 leekiang 阅读(1485) | 评论 (0)编辑 收藏

NetReptile推荐 [2005-2-1]
出处:来自网上
作者:truely,bylsfboy等
 

truely眼中的设计定义:设计的过程就是将事务处理抽象成计算机模型的过程。
1. 首先要明白设计远比编程重要。
2. 平时注重训练自己的思维严谨性和从全局考虑问题的能力。建立冷静思考问题的处事态度。
3. 设计时(尤其是数据库设计时)不要完全被规矩约束,设计好比作诗,懂得韵律是对的,但完全被韵 律所束缚,就作不出好诗了。
4. 多做设计,经常总结自己的不足之处和成功之处,向他人请教。
5. 专门去找别人设计的漏洞和不足,也是提高自己设计水平的重要手段。
(记住:这个好方法不要顺便外传,自己知道就行了,嘻嘻-:)
6. 经验是重要的,但如果观念老化而不善于总结提高,所谓的经验就成为束缚自己进步的枷锁。
7. 学好数学特别是理论数学如数学分析、运筹学、数学模型等。多玩策略性经营游戏也是有益的。推荐 《帝国时代》和《模拟首都3000》以及《大富翁4》。(但不要沉陷在里面)
8. 根据项目情况和开发平台工具的特点确定最佳的设计方法。模块化设计方法和面向对象设计。两种设 计方法的结合使用。
9. 将复杂无序的过程用模块化的方法进行分解,但要注重事务间的联系,并且用开放的眼光去设计。
10. 设计时对严谨性、灵活性、开发效率、客户要求四个方面做衡量取舍。
11. 设计时还要根据整个工程的进度安排和客户对软件的要求而决定是否设计得足够灵活和严谨。
12. 复杂而无条理是最糟的设计,简单实用并不一定是最好的,但一定不是最坏的。(不要说我偷懒哟)
13. 训练自己良好的表达能力,能用清晰明确而且简单的描述表达出自己的基本思路。
14. 在一个项目中建立统一的系统分析模式和文档模板,同时,一个项目中必须至少有一个人对整个系统 设计进行检查和进行全局的考虑。


再谈如何成为一个好的系统分析员?

bylsfboy

系统分析员基本功:

好的系统分析员都是从优秀的程序员中产生的,坚实的编程功底、丰富的经验是今后做系统分析的基础。
没有对系统本身进行过透彻剖析过,很难领会到其中一些难以言述的精华。但并不等于好的程序员就能够 成为好的系统分析员。

合 理的知识结构。语言能力、文字表达能力、技术的全面性等是对系统分析员的基本要求。比如说c/s和3 层开发,如果仅仅对netscape公司的产品熟悉还不够,还需要了解比如微软等产品,并且要了解他们中产 生历史,发展思路,技术优劣,以应付各种穷追猛打的提问。但更重要的是,这是你为应用定制技术要求 的前提。

系统分析员思想:

全 局观念是系统分析员必须具备的观念。如果系统分析员设计时太注重细节,往往会陷入在某个问题上纠 缠不清的泥潭。(93年,我论文指导老师的一席话影响了我随后几年对软件开发的理解----今后计算机会 越来越快,多写几行代码少写代码无关紧要,最重要的是整体;一开始就错了,某个部份编得再好,也是 没有用的)

任务难度的预测能力

系 统分析员要具备快速的任务难度预测能力以及具备快速确定开发小组人员构成和任务划分的能力。(我 将这条归为思想,而不是能力)昆虫自然会长出翅膀,而思想却需要长期的浸润。要做到这点,需要大量 的思考、学习。设计远比编程重要。当今软件业的发展,各种开发工具的出现,编程已经不是什么问题, 程序员的工作某种程度上讲是将别人现成的东西拼凑堆砌起来。系统分析员要清楚的认识到,现在大多数 程序员没有学会怎么去整体的了解一个系统,有些甚至不了解编程(这不是说他们不会写代码)。可视化 的开发工具加五花八门的控件,程序员可以偷点懒了。(这可不是夸大,我好几年的管理工作,接触过大 量的程序员)基于技术,跳出框架。基于现有技术结合用户需求思考问题,设计时跳出框架。

系统分析员思想:

系统分析 员要有面向用户的思想。系统分析员应当有能力将自己扮演成用户,来了解要交付的项目看起来 想什么样式,感觉想什么,从而了解用户的想法并挑选出合理部份去开发。从这个意义上说,系统分析员 才能获得有意义的见解去引导他的开发组成员。系统分析员头脑中要对项目结局有一个清楚的认识,并保 证项目不偏离方向。系统分析员要有根植于技术,高于技术思考问题的思想。纯粹的程序员通常对最终结 果考虑的不是很多,当一种新的技术在市场上出现时,他们对能否按时交付的考虑就比较少,而强烈希望 他们的计划能够建立在新的技术之上。因此,系统分析员的想法和行动要象一个用户,又要能够站在技术 的高度,成为真正的用户、程序员之间的代言人。

系统分析员的关键

获得信任。系统分析员最重要的素质是获得信任,这是成为优秀系统分析员的关键。成熟最为关键。成熟 可以为整个项目组提供正确的支持,能够理解技术怎样才能解决用户的需求。

系统分析员的准备工作

统 一的各种文档模式,这其中包括今后软件变量、字段命名规则。我推荐用pb制定的规则做基础,通过改 造成为适合自身实用的标准。统一的文档管理。统一的分析软件。比如说rose(uml太规范,国内的软件 管理水平根本用不上,只不过尽量应用,你自己对系统分析的理解有好处) 方法是思想的放映,在具体方法上就不多说了。我托人从u$a弄到几本书,用于面向对象系统开发的使 用》、《面向对象的分析》、《项目管理》等都是很不错的,推荐大家看看。

我在拙作"在中国没有人懂计算机"里发了点牢骚,听说挨了部份人(习惯性的)骂。其实,bbs本来就是 发泄的地方,在这里从来就罕有有内容的文章。

自 从"维纳斯"登陆深圳后,大家更着眼于从宏观看中国的it业了。中国it这棵小树,说实在的,长到今天 实在是不容易。一些人提出了"反对微软霸权"的口号,不少人呼唤中国"硅谷"的出现。微软的成功不是技 术的成功,更多的是商业运作的成功。中国it这棵树能长多高,取决于他所植根于的土壤。而现在的事实是,这片土壤实在是太贫瘠了!如果按我们现在的思路和 搞法,是长不成大树,更别指望能结出"微 软","硅谷"这样丰硕的果实。如果说,我们的软件技术落后美国十年,我们的硬件制造技术则落后美国 二十年,我们的管理水平落后美国至少三十年。而最终决定发展速率的恰恰是我们的死穴──低劣的管理 水平。低劣的管理水平的形成的原因有着深厚的背景和多方面的原因。

系统分析工作是解决一个问题的工作,目标是将一个对计算机应用系统的需求转化成实际的物理实现,其中 复杂就复杂在实际的面太多.在系统分析过程之中注意问以下的问题,可能会所进行的系统分析设计工作有 帮助.

1)您所完成的系统目的是什么?注意不是功能要求,而是目的.也就是为什么要建设、为什么要现代建设。

2)您所完成的系统有哪些方面参与,各方面的初衷是什么?那些人可能在系统建设中起重要作用,他们 会采取什么样的态度?你对他们有多少影响力?

3)您的系统是否有一个明确的评价标准?最好从参与的各方面都进行考虑。

4)你的系统设计思想是什么?是否能够得到各方面的认可。

5)你对参与系统设计开发的人员了解吗?他们的特长在哪里,是否愿意与你合作,为什么?你对他们有 足够的影响力吗?

6)你的系统开发计划是否完善?你的计划表有明确的阶段吗?任何一阶段都应该怎样完成?如何对这一 阶段完成的情况进行评价?

7)你对所采用的系统开发方法以及工具是否熟悉?你的夥伴是否熟悉?

8)你所完成的系统是否有原型?计算机的或者物理的。

以上的几个问题都是在系统分析以及系统规划时涉及到的,供各位参考。

系统分析工作是解决一个问题的工作,目标是将一个对计算机应用系统的需求转化成实际的物理实现,其中 复杂就复杂在实际的面太多.在系统分析过程之中注意问以下的问题,可能会所进行的系统分析设计工作有帮助

1)您所完成的系统目的是什么?注意不是功能要求,而是目的.也就是为什么要建设、为什么要现代建设。在考虑系统目的时,我更多的侧重于系统的最终目标考虑,因为一个系统不可能一下子完美,为系统留些 余地。

2) 您所完成的系统有哪些方面参与,各方面的初衷是什么?那些人可能在系统建设中起重要作用,他们 会采取什么样的态度?你对他们有多少影响力?中国it行业的失败之一就是人"太年轻",一定要有领导的 支持,否则完蛋。不要认为自己对他们会有多少影响力,即便有,也要尽可能的认为是决策者再影响他 们。在中国,一个技术员,你算老几?说到这里我很悲哀。哪些人在系统中起重要作用并弄清楚他们的态 度,这点十分关键。

3)您的系统是否有一个明确的评价标准?最好从参与的各方面都进行考虑。不知道这样说对不对,在系 统建设之前,对你的程序员、对你的领导要有至少不同的两种评价。

4)你的系统设计思想是什么?是否能够得到各方面的认可。如果高明,对领导、对程序员都采用引导, 得到认可的最好办法,就是让他们认可他们自己的想法。(我力图这样做,但做得不好,系统分析员有一 点要学会韬光养晦,忍)

5)你对参与系统设计开发的人员了解吗?他们的特长在哪里,是否愿意与你合作,为什么?你对他们有 足够的影响力吗?软件发展到一定的程度,不是编程,不是数学,而是管理。

6)你的系统开发计划是否完善?你的计划表有明确的阶段吗?任何一阶段都应该怎样完成?如何对这一 阶段完成的情况进行评价?

7) 你对所采用的系统开发方法以及工具是否熟悉?你的夥伴是否熟悉?事实上,不是每种好的工具都要 使用,也并不一定都要他们熟练掌握。提醒诸位一句,当你将方案做得可以不依赖某个程序员,你在程序 员面前就无信任可言,因为从此程序员将受到更大的生存压力。我坚决不在公司使用rose。

8)你所完成的系统是否有原型?计算机的或者物理的。

以上的几个问题都是在系统分析以及系统规划时涉及到的,供各位参考。

这文章很好,我的话是:"需求分析实际应该是问题分析"。含义是系统要解决的是问题。而不是用户提出 的需求。经常发现系统完成后,客户说"我的问题还没有解决"。可是,需求分析稿上的目标都搞定了。

既然是问题分析,所以,熟悉目标系统的知识就是必要的。甚至,可以说,一个好的系统分析员也应该是 好的业务专家。

我 很高兴在这里遇到许多分析高手,可以交流分析中的问题。我赞同从来的观点。在中国作分析重要的是 人气,因为中国的企业级信息系统的建设在很大程度上可以说并非确有需求,而是迫于某种压力。用户在 很多时候考虑的不是系统的长远发展,而只是短期的成果,要求开发单位在很短的时间内完成一个很大的 系统的开发,没有时间对系统进行周密的分析,在这种情况下,很多开发商就会粗分析,粗设计,尽快进 入编码阶段,这样的系统的生命周期肯定不会很长。说了这么多,只是想说,系统分析员确实应是业务和 管理专家,并且需要有很好的语言组织能力,他需要根据问题域中存在的问题去尽力说服用户,引导用户 需求,毕竟,我们是专家,如果让用户牵着鼻子走,系统不会是成功的系统。(当然了,这要建立在用户 是可引导的前提下)本人拙见。

在理解和分析用户的需求时,应说服用户明白:建立计算机应用系统并不是简单地用计算机代替手工劳
作,它更应该是管理思想的一次革命,是现用户模式的一次升华和提高。如果系统不能高于现实,开发的系统将长期陷入需求的反复修改,其软件的生命周期也短了。

针对我对您的问题的理解,试着作如下一般性/理论性的回复:

需求分析(您可以采用usecasedriven的方法进行需求分析)在明确需求分析的基础上,确定需要采用的系统分析方法(结构化/面向对象/构件式)应用您的开发团队所确定采用的分析/设计方法,进行系统分析.根据您所采用的分析方法,依次或反复进行系统设计/建模.

http://www.sawin.cn/doc/SA/SATech/NetReptile14.htm

posted @ 2009-11-26 23:59 leekiang 阅读(293) | 评论 (0)编辑 收藏

作者:一详
来源:http://go5.163.com/ 

软件开发需要综合考虑系统模型,环境因素,软件工程,网络连接,用户界面,数据流和网络。 

开发即为写程序且写到非常熟练吗?程序设计也许是永远的基本技能和高度艺术,但今后决不是开发者的主业。 

真正需要的乃是搭积木式的系统构筑和维护,故必须对各个积木块进行深入了解。作为一个程序员不算是最辛苦,最辛苦的是系统分析员。最辛苦的不是设计和搭出 多少个系统,而是登山不止的知识获取和吸收。学习和研究已成为当今开发人员最为坚苦的一项工作, 系统的概念也已深如人心! 

这世界变化得真快,当我还在埋头查阅 NT4.0巨大的文档时,身旁有人很是令我心惊地说了一句," 别折腾了,留点儿体力给 NT5.0 吧 !"

老实说,每当面对这样的现实,我总是有一种气喘吁吁的感觉。自从我开始接触计算机,仿佛每一天都在不停地奔跑,都在卖力地追赶。但结果总是会落后,在我还没有完全从?? 找回感觉时,我在网上又发现了??的踪迹,顿时,我感觉自己没希望了。 

开发是一种思路,利用别人的成果才是最高的境界,在设计时应尽量多找一些已有的核心代码。在开发中积累的应该是对问题之分析能力,对出错情况之诊断能力, 对结构之设计能力, 而不仅仅是编写代码的能力。 打好基础,计算机课程设置的都是基础课。学习其他技术的基础没有过时不过时之说,现在一些新技术往往华而不实,不能告诉你本质的东西,对大家不会有质的提 高。 

一味讲用工具,顶多叫程序员,IT许多行业需要理解和融会贯通的理论及技术。开发工具只是辅助性的,掌握开发的思想和理论精华才是一名程序员向高层次发展的真正任务,否则只有一辈子当代码工人了! 说系统分析员编程弱恐怕有失偏颇。> 

可以说大多数好的系统分析员都是从优秀的程序成长起来的。很难想象一个对编程不甚了解的人可以划分好模块,更不要说较准确的估计出工作量和工作进度的了, 可以说系统分析是建立在程序编写上的一种学问。也 可以说是一种宏编程。我想我们不应该把做软工和做程序员对立起来。任何事物在不同的阶段都有它的表现形式。同样一个人,开始工作的一年他是程序员,一年后 他就是系统分析员了。干的活其实差别不大,只是把注意力和精力从细节转移到宏观上罢了。 我老是有一种比较天真的想法,那就是:软件工程是需要创造性思维的。 

换句话说,好的软件绝不仅仅是漂亮的代码。不论从纯计算机技术角度来说, 还是其他的角度也好,没有过人的想法都是不行的。写程序不应该只考虑到: 一段代码如何。思路宽广 是一个相当重要的素质。 但是,编程编得多了,往往会自己闭塞自己的思路,把自己限制在一个比较狭小的范围内。系统分析员也许写代码根本就很弱,但是思路宽广,统筹全局的能力一定 要有,一定要看到很多程序员考虑不到的地方。因为,用户在意的往往不是某些程序员孜孜以求的东西。比如,某个Button放的位置不好, 经常比较缓慢的执行速度等等会更令用户不满。
http://www.sawin.cn/doc/SA/SATech/sp2sa.htm

posted @ 2009-11-26 23:56 leekiang 阅读(276) | 评论 (0)编辑 收藏

出处:Java夜无眠
作者:蔡学镛

1、系统分析是什么?

  系统分析工作是解决一个问题的工作,目标是将一个对计算机应用系统的需求转化成实际的物理实现,其中复杂就复杂在实际的面太多.在系统分析过程之中注意问以下的问题,可能会所进行的系统分析设计工作有帮助。
  
  1)您所完成的系统目的是什么?注意不是功能要求,而是目的.也就是为什么要建设、为什么要现代建设。

  2)您所完成的系统有哪些方面参与,各方面的初衷是什么?那些人可能在系统建设中起重要作用,他们会采取什么样的态度?你对他们有多少影响力?

  3)您的系统是否有一个明确的评价标准?最好从参与的各方面都进行考虑。

  4)你的系统设计思想是什么?是否能够得到各方面的认可。

  5)你对参与系统设计开发的人员了解吗?他们的特长在哪里,是否愿意与你合作,为什么?你对他们有足够的影响力吗?

  6)你的系统开发计划是否完善?你的计划表有明确的阶段吗?任何一阶段都应该怎样完成?如何对这一阶段完成的情况进行评价?

  7)你对所采用的系统开发方法以及工具是否熟悉?你的伙伴是否熟悉?

  8)你所完成的系统是否有原型?计算机的或者物理的。

  以上的几个问题都是在系统分析以及系统规划时涉及到的,供各位参考。

  “需求分析实际应该是问题分析”。我们的软件系统要解决的是问题。而不是用户提出的需求。经常发现系统完成后,客户说“我的问题还没有解决“。可是,需求分析稿上的目标都搞定了。

  既然是问题分析,所以,熟悉目标系统的知识就是必要的。甚至,可以说,一个好的系统分析员也应该是好的业务专家。

  在中国作分析重要的是人气,因为中国的企业级信息系统的建设在很大程度上可以说并非确有需求,而是迫于某种压力。用户在很多时候考 虑的不是系统的长远发展,而只是短期的成果,要求开发单位在很短的时间内完成一个很大的系统的开发,没有时间对系统进行周密的分析,在这种情况下,很多开 发商就会粗分析,粗设计,尽快进入编码阶段,这样的系统的生命周期肯定不会很长。说了这么多,只是想说,系统分析员确实应是业务和管理专家,并且需要有很 好的语言组织能力,他需要根据问题域中存在的问题去尽力说服用户,引导用户需求,毕竟,我们是专家,如果让用户牵着鼻子走,系统不会是成功的系统。(当然 了,这要建立在用户是可引导的前提下)

 2、基本素质

  a、系统分析员基本功

  好的系统分析员都是从优秀的程序员中产生的,坚实的编程功底、丰富的经验是今后做系统分析的基础。

  没有对系统本身进行过透彻剖析过,很难领会到其中一些难以言述的精华。但并不等于好的程序员就能够成为好的系统分析员。

  合理的知识结构。语言能力、文字表达能力、技术的全面性等是对系统分析员的基本要求。比如说c/s和3层开发,如果仅仅对 netscape公司的产品熟悉还不够,还需要了解比如微软等产品,并且要了解他们中产生历史,发展思路,技术优劣,以应付各种穷追猛打的提问。但更重要 的是,这是你为应用定制技术要求的前提。
 
  b、任务难度的预测能力

  系统分析员要具备快速的任务难度预测能力以及具备快速确定开发小组人员构成和任务划分的能力。(我将这条归为思想,而不是能力)昆 虫自然会长出翅膀,而思想却需要长期的浸润。要做到这点,需要大量的思考、学习。设计远比编程重要。当今软件业的发展,各种开发工具的出现,编程已经不是 什么问题,

  程序员的工作某种程度上讲是将别人现成的东西拼凑堆砌起来。系统分析员要清楚的认识到,现在大多数程序员没有学会怎么去整体的了解 一个系统,有些甚至不了解编程(这不是说他们不会写代码)。可视化的开发工具加五花八门的控件,程序员可以偷点懒了。(这可不是夸大,我好几年的管理工 作,接触过大量的程序员)基于技术,跳出框架。基于现有技术结合用户需求思考问题,设计时跳出框架。 

  c、系统分析员思想

  系统分析员要有面向用户的思想。系统分析员应当有能力将自己扮演成用户,来了解要交付的项目看起来想什么样式,感觉想什么,从而了 解用户的想法并挑选出合理部份去开发。从这个意义上说,系统分析员才能获得有意义的见解去引导他的开发组成员。系统分析员头脑中要对项目结局有一个清楚的 认识,并保证项目不偏离方向。系统分析员要有根植于技术,高于技术思考问题的思想。纯粹的程序员通常对最终结果考虑的不是很多,当一种新的技术在市场上出 现时,他们对能否按时交付的考虑就比较少,而强烈希望他们的计划能够建立在新的技术之上。因此,系统分析员的想法和行动要象一个用户,又要能够站在技术的 高度,成为真正的用户、程序员之间的代言人。
  
  d、系统分析员的关键

  获得信任。系统分析员最重要的素质是获得信任,这是成为优秀系统分析员的关键。成熟最为关键。成熟可以为整个项目组提供正确的支持,能够理解技术怎样才能解决用户的需求。

3、葵花宝典

  设计的过程就是将事务处理抽象成计算机模型的过程

  1. 首先要明白设计远比编程重要。

  2. 平时注重训练自己的思维严谨性和从全局考虑问题的能力。建立冷静思考问题的处事态度。

  3. 设计时(尤其是数据库设计时)不要完全被规矩约束,设计好比作诗,懂得韵律是对的,但完全被韵律所束缚,就作不出好诗了。

  4. 多做设计,经常总结自己的不足之处和成功之处,向他人请教。

  5. 专门去找别人设计的漏洞和不足,也是提高自己设计水平的重要手段。

  6. 经验是重要的,但如果观念老化而不善于总结提高,所谓的经验就成为束缚自己进步的枷锁。

  7. 学好数学特别是理论数学如数学分析、运筹学、数学模型等。多玩策略性经营游戏也是有益的。推荐《帝国时代》和《模拟首都3000》以及《大富翁》。(但不要沉陷在里面)

  8. 根据项目情况和开发平台工具的特点确定最佳的设计方法。模块化设计方法和面向对象设计。两种设计方法的结合使用。

  9. 将复杂无序的过程用模块化的方法进行分解,但要注重事务间的联系,并且用开放的眼光去设计。

  10. 设计时对严谨性、灵活性、开发效率、客户要求四个方面做衡量取舍。

  11. 设计时还要根据整个工程的进度安排和客户对软件的要求而决定是否设计得足够灵活和严谨。

  12. 复杂而无条理是最糟的设计,简单实用并不一定是最好的,但一定不是最坏的。

  13. 训练自己良好的表达能力,能用清晰明确而且简单的描述表达出自己的基本思路。

  14. 在一个项目中建立统一的系统分析模式和文档模板,这其中包括今后软件变量、字段命名规则等。同时,一个项目中必须至少有一个人对整个系统设计进行检查和进行全局的考虑。

http://www.sawin.cn/doc/SA/SATech/blueski1178.htm

posted @ 2009-11-26 23:52 leekiang 阅读(258) | 评论 (0)编辑 收藏

1,OS_WFENTRY表其实放的是流程实例.就三个字段,ID是实例ID,主键;name是流程名;state表示流程的内置状态。CREATED = 0;ACTIVATED = 1;SUSPENDED = 2;KILLED = 3;COMPLETED = 4;UNKNOWN = -1

2,OS_PROPERTYENTRY(GLOBAL_KEY, ITEM_KEY联合主键)存储propertyset的值。
GLOBAL_KEY这个值是在JDBCWorkflowStore类的public PropertySet getPropertySet(long entryId) {
   HashMap args = new HashMap(1);
   args.put("globalKey", "osff_" + entryId);
   return PropertySetManager.getInstance("jdbc", args);
  }赋值的。
  规则如上面代码。Osff+entryid。
  ITEM_KEY即在每一个entry的Key值,propertyset(“即为key”,……
详见osworkflow 自带表结构分析

posted @ 2009-11-17 18:48 leekiang 阅读(259) | 评论 (0)编辑 收藏

使用ORACLE数据库的游标错误( maximum open cursors exceeded )
最近开发第一次遇到“ maximum open cursors exceeded”这个错误。表示已经达到一个进程打开的最大游标数
游标:当返回一个含有多条记录的结果集时,游标就像指向结果集中当前记录的指针,通过游标我们可以处理结果集中的每一条记录。
对于出现ORA-01000 maximum open cursors exceeded错误这种情况,单纯的加大open_cursors并不是好办法,那只是治标不治本。实际上,代码中的隐患并没有解除。 而且,绝大部分情况下,open_cursors只需要设置一个比较小的值,就足够使用了,除非有非常特别的要求。

从网上查了一下这个错误的原因,主要还是代码问题引起的。

这样的错误很容易出现在Java代码中的主要原因是:Java代码在执行 conn.createStatement()和conn.prepareStatement()的时候,实际上都是相当于在数据库中打开了一个 cursor。尤其是,如果你的createStatement和prepareStatement是在一个循环里面的话,就会非常容易出现这个问题。因为游标一直在不停的打开,而且没有关闭。

一般来说,我们在写Java代码的时候,createStatement和prepareStatement都应该要放在循环外面,而且使用了这 些Statment后,及时关闭。最好是在执行了一次executeQuery、executeUpdate等之后,如果不需要使用结果集 (ResultSet)的数据,就马上将Statment关闭。

我就是在循环里调用con.prepareStatement(sql)导致的这个错误。
修改方法,
在遍历完ResutSet后关闭rs和stmt就可以了。

转自http://ltc603.javaeye.com/blog/71540


一般来说是游标不够用了。
只需在initSID.ora文件中加上一行
open_cursors = ****
但是,很可能是由于你的程序或数据库的结构存在着一些潜伏的问题,如jlandzpa所说,没有关闭游标等。

我的程序有一阵一直在报这个错误,把OPEN_CURSOR加大到了300甚至1000还在出错,后来发现是表的STORAGE设置有问题。

建议你查一下自己的程序。
昨天说的有些错误,应该是physical_attributes_clause语句。

我们系统的数据量比较大,近200张表,有些表一天要插入1000000条左右的数据。

表是使用ER/STDIO设计的,然后直接生成建表的脚本,由于没有设置physical_attributes_clause语

句中的建表参数,因此使用了默认的参数。好像是INITIAL 10K NEXT 10K PCTFREE 20 PCTUSED 50

由于表的存储空间太小,在很短的时间内就会装满,因此ORACLE就需要不停为30多张表(数据量较大的)申请空间。于是在程序运行了一段时间后,开始出现ORA-01000: maximum open cursors exceeded的错误。 我将游标大小改到了300,还是出现错误,改到1000以后开始出现了ORA-01001:invalid cursors。再怎么加大open_cursors的数量都无济于事。

使用select * from v$open_cursors查询,发现有几百条的INSERT语句游标没有释放。

开始怀疑是程序调用的问题,仔细检查程序没有发现问题。但是发现对某张表进行TRUNCATE操作后,对此表进行插入的游标全部释放,于是开始怀疑是表结构本身的问题。

重新设置了建表参数,将数据量最大的表的INITIAL和NEXT均设置为50M。

至今未再出现同样的错误。

再次提问ORA-01000: maximum open cursors exceeded问题

这个问题yangtingkun讲的非常详细,使我茅塞顿开,但我还有一些问题向诸位高人请教。
我这里出的问题也是ORA-01000: maximum open cursors exceeded ,我将游标数由300提高到500仍然不能解决这个问题。看了这篇帖子我非常高兴,但有一些问题不明白。
我使用了select * from v$open_cursor进行查询后看不出来哪些游标未被释放。一共有近4000条记录,hash_value字段象特殊点,值从几万到几百万都有,请问怎样判定哪些游标未被释放,有多少。
另外请教一下,怎样重新设置了建表参数,能指点一下所需命令吗。数据库里表数量极大,怎样找到数据量最大的表啊。
我是菜鸟,请不要见笑。不吝赐教。

首先通过v$open_cursor中的SQL_TEXT字段可以查出没有释放的SQL是大致是什么语句。

由于建表参数设置不当,会有很多的INSERT语句无法释放。

SELECT * FROM V$OPEN_CURSOR WHERE SQL_TEXT LIKE 'INSERT%‘

找一找哪些表的INSERT语句没有释放的游标比较多。
从ALL_TABLES里查看该表的建表参数是否合适。

ALTER TABLE tablename STORAGE( NEXT N);

建议加入精华区,我也碰到同样的问题。也是调整的存储结构,另外调整了一些索引和程序,一直不知道是存储结构的问题,调整的东西多,就不知道是什么原因了

原帖由 becochow 于 2009-3-25 18:56 发表
我也出现这样的问题,我现在数据库在运行,可能是存储过程中未关闭游标,

我如何手动关闭呢?查询v$open_cursor 有几千条

今天我也碰到了这个错误,我这么关闭的:
查询v$open_cursor,看哪些是由于"存储过程中未关闭游标"引起的会话,找到SID,SERIAL#,然后KILL掉就可以了.
以上来源于http://www.itpub.net/viewthread.php?tid=24806



我昨天犯的错误就是把创建statement放到了循环之内,结果导致cursor猛增,到达了数据库设置的最大数。
虽然解决了问题,也清楚了游标是何时创建的,但还有几个问题比较迷糊。
1、通过查询,JDBC是将所有的查询结果一次性放到ResultSet中,还是一次只放一定数目的记录?例如,查询结果为2000条数据,JDBC是一次性将2000条数据放到结果集中,还是分批放置呢?

2、当通过ResultSet.next(),移动结果集指针时,此时是否还与数据库发生交互?


首先结果集resultset在你的java程序处。其中有个fetchsize设置,这个表示每次从数据库处取多少条记录到resultset.
当通过ResultSet.next(),移动结果集指针时,此时是否还与数据库发生交互?

不发生交互,数据库执行完查询后,已经把查询结果交给ResultSet了,以后的操作,和数据库无关。
交互,如果1个查询有10000条记录,resultset中只有fetchsize条,当next时还会在一定时机去交互
不是将查询结果一次性放到ResultSet中, 而是分批放入ResultSet中,一般情况下是每次10条记录.
当通过ResultSet.next(),移动结果集指针时,此时还会与数据库发生交互.

导致maximum open cursors exceeded这个问题一般是代码本身的问题.
比如执行一个查询没有关闭游标,或是在存储过程中打开了游标而没有关闭.
特别是出现异常情况是没有关闭游标.严重时会导致系统崩掉
啊~!~`我刚也犯了这种错误!!``看到这里的贴子,小妹又明白了:"哦!``原来conn.createStatement()和 conn.prepareStatement()的时候实际上都是相当与在数据库中打开了一个cursor。!!"明白了这点过后,我就在循环里新建一个 prepareStatement对象,操作完一次,成功过后就马上关掉!这样,循环里每次一个insert都新new 一个prepareStatement 操作成功完成之后再马上关闭.嘎嘎.~这样,cursor就不会溢出拉.
http://www.blogjava.net/snoopy/archive/2005/01/27/744.html

posted @ 2009-11-13 18:16 leekiang 阅读(1154) | 评论 (0)编辑 收藏

在weblogic环境下要对字符集进行显式的说明,否则weblogic平台不识别,方法如下:  
           SAXParserFactory  sf    =  SAXParserFactory.newInstance();  
           SAXParser  sp  =  sf.newSAXParser();  
           ParseClass  reader  =  new  ParseClass();  
           FileInputStream  inputStream  =  new  FileInputStream(file);  
           Charset  charset  =  Charset.forName("GBK");    //  在此处声明GBK方式  
           Reader  r  =  new  InputStreamReader(inputStream,  charset);  
           InputSource  source  =  new  InputSource(r);  
           sp.parse(source,reader); 

posted @ 2009-11-11 20:19 leekiang 阅读(314) | 评论 (0)编辑 收藏

1,JD-GUI
java反编译利器。
http://java.decompiler.free.fr/?q=jdgui
注意:
  (1)文件名必须与类名一致,否则会失去响应
  (2)2位小数反编译后可能会变成7、8位小数

2,WinMerge
windows下开源的文件比较工具

3,Axure RP
原型设计

posted @ 2009-11-08 23:42 leekiang 阅读(253) | 评论 (0)编辑 收藏

CREATE OR REPLACE PROCEDURE p_test(ST_NUM IN NUMBER, /*起始数值*/
                                   ED_NUM IN NUMBER /*结束数值*/) IS
BEGIN
  declare
    i number;
  begin
    /*循环插入*/
    FOR i IN ST_NUM .. ED_NUM LOOP
      INSERT INTO test_temp values (i, 'test');
    END LOOP;
  end;
  commit;
  /*异常处理*/
EXCEPTION
  WHEN OTHERS THEN
    rollback;
END;

在command window里执行call p_test(1,100);

posted @ 2009-11-07 13:15 leekiang 阅读(269) | 评论 (0)编辑 收藏

    String  xml="<?xml version=\"1.0\" encoding=\"GBK\" ?><root><test>0</test></root>";
   应该使用Document document = saxReader.read(new ByteArrayInputStream(xml.getBytes())); 
如果使用Document   document   =   saxReader.read(xml);会报no protocol 异常
如果xml的encoding="utf-8",则xml.getBytes()要改为xml.getBytes("utf-8"),否则会报错

Element root=  document.getRootElement();
得到root后取子元素,既可以
Element e=root.element("test");
也可以
for (Iterator it = root.elementIterator(); it.hasNext();) {
Element e = (Element) it.next();
    String n = e.getName();
   String v=e.getStringValue()
}


http://www.javatx.cn/clubPage.jsp?ccStyle=0&ccID=15&tID=1922
http://lavasoft.blog.51cto.com/62575/66953

posted @ 2009-10-25 18:43 leekiang 阅读(430) | 评论 (0)编辑 收藏

System.setProperty("sun.net.client.defaultConnectTimeout", "3000");
        System.setProperty("sun.net.client.defaultReadTime ", "3000");
        
        URL url1=null;
        try {
            url1 = new URL(url);
            HttpURLConnection urlCon = (HttpURLConnection)url1.openConnection();
            System.out.println(urlCon);
             BufferedReader in = null;
                try {
                  in = new BufferedReader(
                    new InputStreamReader(
                            urlCon.getInputStream()));
                  String inputLine;
                  while (
                    (inputLine = in.readLine()) != null) {
                    System.out.println(inputLine);
                  }
                } catch (IOException e) {
                  e.printStackTrace();
                }
                in.close();
                urlCon.disconnect();
        } catch (Exception e1) {
            e1.printStackTrace();
        }

http://tech.techweb.com.cn/archiver/tid-225522.html
http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/net/HttpURLConnection.html
http://zhuixue.javaeye.com/blog/385793

posted @ 2009-10-21 14:12 leekiang 阅读(312) | 评论 (0)编辑 收藏

聚集(Aggregation), 组成(Composition)
整体拥有各部分,部分与整体共存,如整体不存在了,部分也会随之消失, 这称为组成(Composition) 。注:我觉得部分不一定会消失。
一辆轿车包含四个车轮、一个方向盘、一个发动机和一个底盘,这算不算
Composition 的例子?因为如果轿车报废了,方向盘可能还可以用。
课题组包含许多成员,但是每个成员又可以是另一个课题组的成员,即部分可以参加多个整体,这种为聚集
我觉得组成相当于ER里的many-to-one或one-to-one,即one方只能属于一个父亲。
而聚齐相当于many-to-many,聚齐需要一张中间表。
在UML中,聚集表示为空心菱形,组成表示为实心菱形。

http://blog.csdn.net/booknut/archive/2009/03/11/3980936.aspx
http://blog.myspace.cn/e/401679080.htm

posted @ 2009-10-17 11:41 leekiang 阅读(2235) | 评论 (0)编辑 收藏

UML的三大“硬伤”
http://www.yesky.com/112/1802612.shtml

《UML三大硬伤》的16条硬伤
http://blog.csdn.net/gigix/archive/2002/05/23/2344.aspx

从《UML的三大硬伤》说起
http://blog.csdn.net/gigix/archive/2002/05/28/2345.aspx
那么,应该怎么办呢?我认为,在采用UML进行建模时,应该考虑到中国目前软件人员和用户对于UML的陌生和不解,增加他们对于UML的认识,在适当的时候进行一定的妥协,放弃其中一些确实令人迷惑的部分,只选用其中可以被人理解的部分,将结构化的分析方法和面向对象的分析方法结合起来,将UML的分析设计原则,和项目的具体情况结合起来,这样完成的分析设计,才能够被客户所认同和接受,这样完成的设计文档,才是真正有实际意义的文档,才可以去知道程序员进行编程.
还是那句话,软件所反映出的矛盾和问题,其实是人与人之间的矛盾和问题,UML在美国受到广泛欢迎,而在中国则受到怀疑,问题并不是出在UML本身上,而是出在两个国家的环境不一样上.套用毛主席的名言,不考虑中国的具体环境,盲目推行UML,是犯了教条主义的错误;而一味强调中国的特殊情况,完全拒绝,否定外国的先进经验,则是犯了经验主义的错误.UML的先进理论,必须与中国软件发展的实际情况相结合,才能够真正地发扬光大,发挥出越来越大的作用.

posted @ 2009-10-12 13:35 leekiang 阅读(359) | 评论 (0)编辑 收藏

1. 文件系统是否满
方法: df –k 可以以K为单位检查文件系统的使用率。(90%以上,需要调整)
2. 检查系统出错日志 使用errpt |more来检查
清除现有的log: Errclear 0
3. 检查系统合法/非法登陆情况
使用Last命令来检查来自登陆的地方。
4. 检查系统是否有巨大的Core文件生成
使用 find / -name core –print来检查。对Core文件,一般直接删除就可以了。
5. 系统性能检查:
a) CPU性能:使用Vmstat, topas来检查
b) 内存使用情况:也是使用topas, vmstat来检查
c) 检查IO平衡使用情况:使用iostat来检查
d) 交换空间使用情况:使用lsps –s来检查
   显示交换区的分布信息  lsps -a
   
6.显示卷信息:
lsvg 显示卷的名称
lsvg -l rootvg 显示rootvg卷的详细信息

在AIX中运行Oracle性能方面的技巧和诀窍
AIX 性能调优 内存篇之四 调优参数
AIX 中 Paging Space 使用率过高的分析与解决

posted @ 2009-10-09 12:01 leekiang 阅读(212) | 评论 (0)编辑 收藏

转自http://developer.51cto.com/art/200907/139005.htm

这是一些分析jQuery框架的文字

    针对jQuery 1.3.2版本

    面向的读者应具备以下要求

    1.非常熟悉HTML

    2.非常熟悉javascript语法知识

    3.熟悉javascript面向对象方面的知识

    4.熟练使用jQuery框架

    言归正传!

    jQuery对象的初始化是写在匿名函数里的

    就像这样:

    (function(){alert("jQuery框架分析")})();

    第一个括号是声明了一个函数,第二个括号是执行这个函数。也就是说,jQuery框架在页面载入的时候已经做了一些事情(这个个匿名函数已经被执行了)。 做的这些事情使我们可以通过$("#yourId")或$(".yourClass")等方式获取页面元素,并把获取到的元素包装成jQuery对象。

    匿名函数是怎么实现这些功能的呢?

    首先框架定义了两个核心对象

    jQuery = window.jQuery = window.$ = function( selector, context ) {}

    一个是jQuery

    一个是$

    这两个对象都指向一个函数

    这个函数是我们使用$()或jQuery()方法时的入口,这个方法返回一个jQuery.fn.init( selector, context );的实例,其实这个实例是一个jQuery对象。

    jQuery对象是一个什么样的对象呢?

    jQuery对象其实是一个javascript的数组

    这个数组对象包含125个方法和4个属性

    4个属性分别是

    jQuery     当前的jQuery框架版本号

    length     指示该数组对象的元素个数

    context    一般情况下都是指向HtmlDocument对象

    selector   传递进来的选择器内容  如:#yourId或。yourClass等

    如果你通过$("#yourId")方法获取jQuery对象,并且你的页面中只有一个id为yourId的元素那么$("#yourId")[0]就是 HtmlElement元素与document.getElementById("yourId")获取的元素是一样的

jQuery对象是怎么构造出来的呢?

    这个对象就是刚才我们提到的

    jQuery = window.jQuery = window.$ = function( selector, context ) {}

    框架不只为此对象定义了一个方法,还定义了它的原型(prototype)

    jQueryjQuery.fn = jQuery.prototype = {//此处为json对象}

    原型的定义是通过json对象定义的

    如

    {

    init: function( selector, context ) {//方法体},

    jQuery: "1.3.2",//属性

    size: function() {//方法体},

    //……

    }

    前面提到的125个方法4个属性有一部分在这个json对象中完成定义的 这个json对象中第一个方法就是init方法也就是入口方法中的jQuery.fn.init( selector, context );此方法与一个正则表达式对象配合来构造jQuery对象

    这个正则表达式为:

    quickExpr = /^[^<]*(<(。|\s)+>)[^>]*$|^#([\w-]+)$/

    下面我们说一下init方法的实现逻辑

    此方法有两个参数

    一个是selector(选择器)

    一个是context(上下文)

    selector就是我们用$("#yourId")或jQuery(".yourClass")传递进来的变量

    这个参数不一定是字符串,也可能是其他形式的变量

    等会儿我们就会介绍到

    context参数我们在使用jQuery的时候很少用到,暂且不表

    注意这两个参数都在返回的jQuery对象中体现出来了(以两个同名的属性展示)

    下面看一下这个方法体内部的实现逻辑

  //如果没有选择器或者选择器为空的话,就把document对象赋值给他
selector = selector || document;
//如果selector参数是dom元素,直接返回jQuery对象
//也就是说你可以$(document.getElementById("allen"))把你的元素封装成jQuery对象
if ( selector.nodeType ) {
this[0] = selector;
this.length = 1;
this.context = selector;
return this;
}
//typeof 取对象的类型,用三个等号效率较高, 不需要类型转换,两个等号默认有类型转换
if ( typeof selector === "string" ) {
//这里用到了我们前面提到的正则表达式quickExpr
//match其实是一个数组
//第0个元素是与正则表达式相匹配的文本
//第1个元素是与正则表达式的第1个子表达式相匹配的文本(如果有的话)
//第2个元素是第2个子表达式相匹配的文本(如果有的话)
//第3个元素是第3个子表达式相匹配的文本(如果有的话)这里就是元素的ID,不包含#
var match = quickExpr.exec( selector );
//正则表达式匹配到了内容   并且 match[1]不为空 或者 context为空
//match[1]不为空的时候selector是HTML字符串,也就是你可以用$("
xland
")把对象包装成jQuery对象
//context为空的时候selector是页面元素ID
if ( match && (match[1] || !context) ) {
 //选择器为html字符串  此情况暂且不表
if ( match[1] ){
selector = jQuery.clean( [ match[1] ], context );}
//选择器为ID
else {
//得到元素
var elem = document.getElementById( match[3] );
 //如果得到了这个元素但是元素的ID属性不是match[3],跳入分支。分支里面的东西做了什么工作,暂且不表
if ( elem && elem.id != match[3] ){
return jQuery().find( selector );}
//把得到的页面元素封装成jQuery对象
//如果elem为空,就传入一个空数组,框架怎么处理此空数组,暂且不表
//如果不为空就跳入我们前面说的if ( selector.nodeType )分支,构造出jQuery对象来
var ret = jQuery( elem || [] );
 //设置jQuery对象的context属性
ret.context = document;
 //设置jQuery对象的selector属性
ret.selector = selector;
 //返回这个对象给调用者
return ret;
}

至此

    var obj = $(“#yourId”);

    构造jQuery对象的初步工作就做完了



posted @ 2009-10-08 21:53 leekiang 阅读(573) | 评论 (0)编辑 收藏

搞清常用编码特性是解决字符集编码问题的基础。字符集编码的识别与转换、分析各种乱码产生的原因、编程操作各种编码字符串(例如字符数计算、截断处理)等都需要弄清楚编码的特性。
了解一种字符集编码主要是要了解该编码的编码范围,编码对应的字符集(都包含哪些字符),和其他字符集编码之间的关系等。
--------1. ASCII--------
ASCII码是7位编码,编码范围是0x00-0x7F。ASCII字符集包括英文字母、阿拉伯数字和标点符号等字符。其中0x00-0x20和0x7F共33个控制字符。
只支持ASCII码的系统会忽略每个字节的最高位,只认为低7位是有效位。HZ字符编码就是早期为了在只支持7位ASCII系统中传输中文而设计的编码。早期很多邮件系统也只支持ASCII编码,为了传输中文邮件必须使用BASE64或者其他编码方式。
--------2. GB2312--------
GB2312 是基于区位码设计的,区位码把编码表分为94个区,每个区对应94个位,每个字符的区号和位号组合起来就是该汉字的区位码。区位码一般用10进制数来表 示,如1601就表示16区1位,对应的字符是"啊"。在区位码的区号和位号上分别加上0xA0就得到了GB2312编码。
区位码中 01-09区是符号、数字区,16-87区是汉字区,10-15和88-94是未定义的空白区。它将收录的汉字分成两级:第一级是常用汉字计3755个, 置于16-55区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计3008个,置于56-87区,按部首/笔画顺序排列。一级汉字是按照拼音排 序的,这个就可以得到某个拼音在一级汉字区位中的范围,很多根据汉字可以得到拼音的程序就是根据这个原理编写的。
GB2312字符集中除常用简体汉字字符外还包括希腊字母、日文平假名及片假名字母、俄语西里尔字母等字符,未收录繁体中文汉字和一些生僻字。可以用繁体汉字测试某些系统是不是只支持GB2312编码。
GB2312的编码范围是0xA1A1-0x7E7E,去掉未定义的区域之后可以理解为实际编码范围是0xA1A1-0xF7FE。
EUC-CN可以理解为GB2312的别名,和GB2312完全相同。
区 位码更应该认为是字符集的定义,定义了所收录的字符和字符位置,而GB2312及EUC-CN是实际计算机环境中支持这种字符集的编码。HZ和ISO- 2022-CN是对应区位码字符集的另外两种编码,都是用7位编码空间来支持汉字。区位码和GB2312编码的关系有点像 Unicode和UTF-8。
--------3. GBK--------
GBK编码是GB2312编码的超集,向下完全兼容 GB2312,同时GBK收录了Unicode基本多文种平面中的所有CJK汉字。同 GB2312一样,GBK也支持希腊字母、日文假名字母、俄语字母等字符,但不支持韩语中的表音字符(非汉字字符)。GBK还收录了GB2312不包含的 汉字部首符号、竖排标点符号等字符。
GBK的整体编码范围是为0x8140-0xFEFE,不包括低字节是0×7F的组合。高字节范围是0×81-0xFE,低字节范围是0x40-7E和0x80-0xFE。
低字节是0x40-0x7E的GBK字符有一定特殊性,因为这些字符占用了ASCII码的位置,这样会给一些系统带来麻烦。
有 些系统中用0x40-0x7E中的字符(如"|")做特殊符号,在定位这些符号时又没有判断这些符号是不是属于某个 GBK字符的低字节,这样就会造成错误判断。在支持GB2312的环境下就不存在这个问题。需要注意的是支持GBK的环境中小于0x80的某个字节未必就 是ASCII符号;另外就是最好选用小于0×40的ASCII符号做一些特殊符号,这样就可以快速定位,且不用担心是某个汉字的另一半。Big5编码中也 存在相应问题。
CP936和GBK的有些许差别,绝大多数情况下可以把CP936当作GBK的别名。
--------4. GB18030--------
GB18030编码向下兼容GBK和GB2312,兼容的含义是不仅字符兼容,而且相同字符的编码也相同。GB18030收录了所有Unicode3.1中的字符,包括中国少数民族字符,GBK不支持的韩文字符等等,也可以说是世界大多民族的文字符号都被收录在内。
GBK和GB2312都是双字节等宽编码,如果算上和ASCII兼容所支持的单字节,也可以理解为是单字节和双字节混合的变长编码。GB18030编码是变长编码,有单字节、双字节和四字节三种方式。
GB18030 的单字节编码范围是0x00-0x7F,完全等同与ASCII;双字节编码的范围和GBK相同,高字节是0x81-0xFE,低字节的编码范围是 0x40-0x7E和0x80-FE;四字节编码中第一、三字节的编码范围是0x81-0xFE,二、四字节是0x30-0x39。
Windows 中CP936代码页使用0x80来表示欧元符号,而在GB18030编码中没有使用0x80编码位,用其他位置来表示欧元符号。这可以理解为是 GB18030向下兼容性上的一点小问题;也可以理解为0x80是CP936对GBK的扩展,而GB18030只是和GBK兼容良好。
--------5. BIG5--------
Big5是双字节编码,高字节编码范围是0x81-0xFE,低字节编码范围是0x40-0x7E和0xA1-0xFE。和GBK相比,少了低字节是0x80-0xA0的组合。0x8140-0xA0FE是保留区域,用于用户造字区。
Big5 收录的汉字只包括繁体汉字,不包括简体汉字,一些生僻的汉字也没有收录。GBK收录的日文假名字符、俄文字符Big5也没有收录。因为Big5当中收录的 字符有限,因此有很多在Big5基础上扩展的编码,如倚天中文系统。Windows系统上使用的代码页CP950也可以理解为是对Big5的扩展,在 Big5的基础上增加了7个汉字和一些符号。Big5编码对应的字符集是GBK字符集的子集,也就是说Big5收录的字符是GBK收录字符的一部分,但相 同字符的编码不同。
因为Big5也占用了ASCII的编码空间(低字节所使用的0x40-0x7E),所以Big5编码在一些环境下存在和 GBK编码相同的问题,即低字节范围为0x40-0x7E的字符有可能会被误处理,尤其是低字节是0x5C("/")和0x7C("|")的字符。可以参 考GBK一节相应说明。
尽管有些区别,大多数情况下可以把CP950当作Big5的别名。
--------6. ISO-8859-1--------
ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。
ISO-8859-1收录的字符除ASCII收录的字符外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。欧元符号出现的比较晚,没有被收录在ISO-8859-1当中。
因 为ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把 其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。这是个很重要的特性,MySQL数据库默认编码是Latin1就是利用了这个特性。 ASCII编码是一个7位的容器,ISO-8859-1编码是一个8位的容器。
Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。
--------7. UCS-2和UTF-16--------
Unicode 组织和ISO组织都试图定义一个超大字符集,目的是要涵盖所有语言使用的字符以及其他学科使用的一些特殊符号,这个字符集就是通用字符集 (UCS,Universal Character Set)。这两个组织经过协调,虽然在各自发展,但定义的字符位置是完全一致的。ISO相应的标准是ISO 10646。Unicode和ISO 10646都在不断的发展过程中,所以会有不同的版本号来标明不同的发展阶段,每个Unicode版本号都能找到相对应的ISO 10646版本号。
ISO 10646标准定义了一个31位的字符集。前两个字节的位置(0x0000-0xFFFD)被称为基本多语言面(Basic Multilingual Plane, BMP),超出两个字节的范围称作辅助语言面。BMP基本包括了所有语言中绝大多数字符,所以只要支持BMP就可以支持绝大多数场合下的应用。 Unicode 3.0对应的字符集在BMP范围内。
UCS字符集为每个字符分配了一个位置,通常用"U"再加上某个字符在UCS中位置的16进制数作为这个字符的UCS表示,例如"U+0041"表示字符"A"。UCS字符U+0000到U+00FF与ISO-8859-1完全一致。
UCS- 2、UTF-16是UCS字符集(或者说是Unicode字符集)实际应用中的具体编码方式。UCS-2是两个字节的等宽编码,因为只是使用了两个字节的 编码空间,所以只能对BMP中的字符做编码。UTF-16是变长编码,用两个字节对BMP内的字符编码,用4个字节对超出BMP范围的辅助平面内的字符作 编码。
UCS-2不同于GBK和Big5,它是真正的等宽编码,每个字符都使用两个字节,这个特性在字符串截断和字符数计算时非常方便。
UTF-16是UCS-2的超集,UTF-16编码的两字节编码方式完全和UCS-2相同,也就是说在BMP的框架内UCS-2完全等同与UTF-16。实际情况当中常常把UTF-16当作UCS-2的别名。
UCS- 2和UTF-16在存储和传输时会使用两种不同的字节序,分别是big endian和little endian(大尾和小尾)。例如"啊"(U+554A)用big endian表示就是0x554A,用little endian表示就是0x4A55。UCS-2和UTF-16默认的字节序是big endian方式。在传输过程中为了说明字节序需要在字节流前加上BOM(Byte order Mark),0xFEFF表示是big endian,0xFFFE表示是little endian。UCS-2BE、UCS-2LE是实际应用中使用的编码名称,对应着big endian和little endian,UTF-16BE、UTF-16LE也是如此。因为默认是BE字节序,所以可以把UCS-2当做是UCS-2BE的别名。
在 UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是U+FEFF,是个没有实际意义的字符。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE",如果传输的ZERO WIDTH NO-BREAK SPACE是0xFEFF就说明是big endian,反之就是little endian。
UCS-2和UTF-16也可以理解为和ASCII以及ISO-8859-1兼容,在ASCII编码或者ISO-8859-1编码的每个字节前加上0x00,就得到相应字符的UCS-2编码。
UCS-2和UTF-16中会使用0x00作为某个字符编码的一部分,某些系统会把0x00当作字符串结束的标志,在处理UCS-2或UTF-16编码时会出现问题。
--------8. UTF-8--------
UTF-8是UCS字符集的另一种编码方式,UTF-16的每个单元是两个字节(16位),而UTF-8的每个单元是一个字节(8位)。UTF-16中用一个或两个双字节表示一个字符,UTF-8中用一个或几个单字节表示一个字符。
可以认为UTF-8编码是根据一定规律从UCS-2转换得到的,从UCS-2到UTF-8之间有以下转换关系:
UCS-2 UTF-8
U+0000 - U+007F 0xxxxxxx
U+0080 - U+07FF 110xxxxx 10xxxxxx
U+0800 - U+FFFF 1110xxxx 10xxxxxx 10xxxxxx
例如"啊"字的UCS-2编码是0x554A,对应的二进制是0101 0101 0100 1010,转成UTF-8编码之后的二进制是1110 0101 10 010101 10 001010,对应的十六进制是0xE5958A。
UCS- 4也是一种UCS字符集的编码方式,是使用4个字节的等宽编码,可以用UCS-4来表示BMP之外的辅助面字符。UCS-2中每两个字节前再加上 0x0000就得到了BMP字符的UCS-4编码。从UCS-4到UTF-8也存在转换关系,根据这种转换关系,UTF-8最多可以使用六个字节来编码 UCS-4。
根据UTF-8的生成规律和UCS字符集的特性,可以看到UTF-8具有的特性:
UTF-8完全和ASCII兼容,也就是说ASCII对应的字符在UTF-8中和ASCII编码完全一致。范围在0x00-0x7F之内的字符一定是ASCII字符,不可能是其他字符的一部分。GBK和Big5都存在的缺陷在UTF-8中是不存在的。
大于U+007F的UCS字符,在UTF-8编码中至少是两个字节。
UTF-8中的每个字符编码的首字节总在0x00-0xFD之间(不考虑UCS-4支持的情况,首字节在0x00-0xEF之间)。根据首字节就可以判断之后连续几个字节。
非首字节的其他字节都在0x80-0xBF之间;0xFE和0xFF在UTF-8中没有被用到。
GBK编码中的汉字字符都在UCS-2中的范围都在U+0800 - U+FFFF之间,所以每个GBK编码中的汉字字符的UTF-8编码都是3个字节。但GBK中包含的其他字符的UTF-8编码就不一定是3个字节了,如GBK中的俄文字符。
在UTF-8的编码的传输过程中即使丢掉一个字节,根据编码规律也很容易定位丢掉的位置,不会影响到其他字符。在其他双字节编码中,一旦损失一个字节,就会影响到此字节之后的所有字符。从这点可以看出UTF-8编码非常适合作为传输编码!
出处:http://i.cn.yahoo.com/07609654986/blog/p_14/

posted @ 2009-10-08 17:55 leekiang 阅读(513) | 评论 (1)编辑 收藏

为了统一全世界各国语言文字和专业领域符号(例如数学符号、乐谱符号)的编码,ISO制定了ISO 10646标准,也称为UCS(Universal Character Set)。UCS编码的长度是31位,可以表示231个字符。如果两个字符编码的高位相同,只有低16位不同,则它们属于一个平面(Plane),所以一个平面由216个字符组成。目前常用的大部分字符都位于第一个平面(编码范围是U-00000000~U-0000FFFD),称为BMP(Basic Multilingual Plane)或Plane 0,为了向后兼容,其中编号为0~256的字符和Latin-1相同。UCS编码通常用U-xxxxxxxx这种形式表示,而BMP的编码通常用 U+xxxx这种形式表示,其中x是十六进制数字。在ISO制定UCS的同时,另一个由厂商联合组织也在着手制定这样的编码,称为Unicode,后来两家联手制定统一的编码,但各自发布各自的标准文档,所以UCS编码和Unicode码是相同的。

有了字符编码,另一个问题就是这样的编码在计算机中怎么表示。现在已经不可能用一个字节表示一个字符了,最直接的想法就是用四个字节表示一个字符,这种表示方法称为UCS-4或UTF-32,UTF是Unicode Transformation Format的缩写。一方面这样比较浪费存储空间,由于常用字符都集中在BMP,高位的两个字节通常是0,如果只用ASCII码或Latin-1,高位的三个字节都是0。另一种比较节省存储空间的办法是用两个字节表示一个字符,称为UCS-2或UTF-16,这样只能表示BMP中的字符,但BMP中有一些扩展字符,可以用两个这样的扩展字符表示其它平面的字符,称为Surrogate Pair。无论是UTF-32还是UTF-16都有一个更严重的问题是和C语言不兼容,在C语言中0字节表示字符串结尾,库函数strlenstrcpy等等都依赖于这一点,如果字符串用UTF-32存储,其中有很多0字节并不表示字符串结尾,这就乱套了。

UNIX之父Ken Thompson提出的UTF-8编码很好地解决了这些问题,现在得到广泛应用。UTF-8具有以下性质:

  • 编码为U+0000~U+007F的字符只占一个字节,就是0x00~0x7F,和ASCII码兼容。

  • 编码大于U+007F的字符用2~6个字节表示,每个字节的最高位都是1,而ASCII码的最高位都是0,因此非ASCII码字符的表示中不会出现ASCII码字节(也就不会出现0字节)。

  • 用于表示非ASCII码字符的多字节序列中,第一个字节的取值范围是0xC0~0xFD,根据它可以判断后面有多少个字节也属于当前字符的编码。后面每个字节的取值范围都是0x80~0xBF,见下面的详细说明。

  • UCS定义的所有231个字符都可以用UTF-8编码表示出来。

  • UTF-8编码最长6个字节,BMP字符的UTF-8编码最长三个字节。

  • 0xFE和0xFF这两个字节在UTF-8编码中不会出现。

具体来说,UTF-8编码有以下几种格式:

U-00000000 – U-0000007F:  0xxxxxxx
U-00000080 – U-000007FF:  110xxxxx 10xxxxxx
U-00000800 – U-0000FFFF:  1110xxxx 10xxxxxx 10xxxxxx
U-00010000 – U-001FFFFF:  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 – U-03FFFFFF:  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 – U-7FFFFFFF:  1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

第 一个字节要么最高位是0(ASCII字节),要么最高两位都是1,最高位之后1的个数决定后面有多少个字节也属于当前字符编码,例如111110xx,最 高位之后还有四个1,表示后面有四个字节也属于当前字符的编码。后面每个字节的最高两位都是10,可以和第一个字节区分开。这样的设计有利于误码同步,例 如在网络传输过程中丢失了几个字节,很容易判断当前字符是不完整的,也很容易找到下一个字符从哪里开始,结果顶多丢掉一两个字符,而不会导致后面的编码解 释全部混乱了。上面的格式中标为x的位就是UCS编码,最后一种6字节的格式中x位有31个,可以表示31位的UCS编码,UTF-8就像一列火车,第一 个字节是车头,后面每个字节是车厢,其中承载的货物是UCS编码。UTF-8规定承载的UCS编码以大端表示,也就是说第一个字节中的x是UCS编码的高 位,后面字节中的x是UCS编码的低位。

例如U+00A9(©字符)的二进制是10101001,编码成UTF-8是11000010 10101001(0xC2 0xA9),但不能编码成11100000 10000010 10101001,UTF-8规定每个字符只能用尽可能少的字节来编码。

来源:http://learn.akae.cn/media/apas02.html

posted @ 2009-10-08 17:31 leekiang 阅读(281) | 评论 (0)编辑 收藏

解决排列组合问题的通用算法
JAVA实现排列组合算法
浅析实现排列组合查询算法
关于Java权限控制算法


随机
从0,1,2三个数字中随机取一个:
int n = (int) (Math.random() * 3);//Math.random()返回的double值>=0且<1
注意不能使用long l=(Math.round(Math.random()*2),因为这样三个数字的机率分别是25%,50%,25%,不是均匀分布的。
也可以使用Random rand = new Random();int n = rand.nextInt(3);的方式产生,但后者的结果明显没有Math.random()的方式那么均匀,只是后者会稍微快一些(可忽略不计)。

M到N的随机整数:
(int)(M+(N-M)*Math.random())

posted @ 2009-10-04 19:17 leekiang 阅读(364) | 评论 (0)编辑 收藏

比如用"TEST"用户通过plsqldevleper登录,
执行select * from v$session t where t.USERNAME='TEST';
会看到至少两条记录,其中action列为Main session的是plsqldevleper固有的,
每一个SQL Window都会有一个session,action显示为"SQL Window - New"
当前window对应的session的STATUS列显示为ACTIVE,其他显示为"INACTIVE",
搞不明白"INACTIVE"的session为何还会显示,什么时候不显示呢?
至于查看当前session的ID,用 select distinct sid from v$mystat;

顺便记录一下v$mystat,v$sesstat和v$sysstat的区别
按照OracleDocument中的描述,v$sysstat存储自数据库实例运行那刻起就开始累计全实例(instance-wide)的资源使用情况,
我觉得可以理解为是许多综合性、全局性的指标
,比如总登录次数(logons cumulative)
如果从v$sysstat查得有347个指标,那么v$mystat(表示当前session的情况)相应的也有347个指标,
v$sesstat包括了所有session(包括活动的和不活动的)的指标的值,当然也就囊括了v$mystat,其记录数为347*25(如果有25个session的话)=8675,
至于指标号"STATISTIC#"表示的含义,可从v$statname查得。


在B/S系统中,页面纷繁复杂,而且经过系统长时间运行,如果发现某个session的wait比较严重,进行sql优化时,很难知道这个sql是用在程 序的哪个模块,很多时候只能根据开发人员的经验来定位这个sql,或者打开程序代码,搜索。这样的效率很低,这里介绍一个方法来快速定位发生问题的sql 的位置。
ORACLE提供了DBMS_APPLICATION_INFO包,其中提供了set_client_info、set_module、 set_action、read_module、read_client_info、set_session_longops几个过程,其中分别用于设置 客户端信息、设置module信息(这里同时必须设置一个action信息)、设置action信息、读取module信息(同时也会得到action信 息)、读取client_info信息和手动设置一个会话为longops。
exec dbms_application_info.set_client_info('test client info');
exec dbms_application_info.set_module(module_name => 'test module',action_name => 'test action');
http://zhang41082.itpub.net/post/7167/305794

How to trace the connection pool in a Java Web application - DBMS_APPLICATION_INFO
http://stackoverflow.com/questions/829302/how-to-trace-the-connection-pool-in-a-java-web-application-dbmsapplicationinf
http://stackoverflow.com/questions/53379/using-dbmsapplicationinfo-with-jboss
http://www.mailinglistarchive.com/java-dev@lists.apple.com/msg10280.html


使用v$sysstat中的数据
该视图中数据常被用于监控系统性能。如buffer cache命中率、软解析率等都可从该视图数据计算得出。
该视图中的数据也被用于监控系统资源使用情况,以及系统资源利用率的变化。正因如此多的性能数据,检查某区间内系统资源使用情况可以这样做,在一个时间段开始时创建一个视图数据快照,结束时再创建一个,二者之间各统计项值的不同(end value - begin value)即是这一时间段内的资源消耗情况。这是oracle工具的常用方法,诸如Statspack以及BSTAT/ESTAT都是如此。
为了对比某个区间段的数据,源数据可以被格式化(每次事务,每次执行,每秒钟或每次登陆),格式化后数据更容易从两者中鉴别出差异。这类的对比在升级前,升级后或仅仅想看看一段时间内用户数量增长或数据增加如何影响资源使用方面更加实用。
你也可以使用v$sysstat数据通过查询v$system_event视图来检查资源消耗和资源回收。
参见http://www.cnblogs.com/jimeper/archive/2008/03/30/1129431.html
该文后面有这样一句话
人生有三宝:终身运动,终身学习,终身反省.吸收新知,提高效率,懂得相处,成就自己,也成就他人,创造最
高价值。

ORACLE的连接数(sessions)与其参数文件中的进程数(process)有关,它们的关系如下:
  sessions=(1.1*process+5)
  但是我们增加process数时,往往数据库不能启动了。这因为我们还漏调了一个unix系统参数:它是/etc/system/ 中semmns,这是unix系统的信号量参数。每个process会占用一个信号量。semmns调整后,需要重新启动unix 操作系统 ,参数才能生效。不过它的大小会受制于 硬件 的内存或ORACLE SGA。范围可从200-2000不等。

  semmns的计算公式为:SEMMNS > processes + instance_processes + system processes = 数据库参数processes的值 instance_processes = 5(smon,pmon,dbwr,lgwr,arch)
  system=系统所占用信号量。
  系统所占用信号量可用下列命令查出:#ipcs -sb
  其中列NSEMS显示系统已占用信号量。
  其它一些跟连接有关的参数,如 licence_max_sessions, licence_sessions_warning 等默认设置都为零,也就是没有限制。

posted @ 2009-10-03 02:07 leekiang 阅读(1527) | 评论 (0)编辑 收藏

AIX内核属于动态内核,核心参数基本上可以自动调整,因此当系统安装完毕后,应考虑修改的参数一般如下:

一、单机环境
1、系统用户的最大登录数maxlogin
   maxlogin的具体大小可根据用户数设定,可以通过smitty chlicense命令修改,该参数记录于/etc/security/login.cfg文件,修改在系统重新启动后生效。

2、系统用户的limits参数
   这些参数位于/etc/security/limits文件中,可以把这些参数设为-1,即无限制,可以用vi 修改/etc/security/limits文件,所有修改在用户重新登录后生效。
default:
fsize = 2097151    ----》改为-1
core = 2097151
cpu = -1
data = 262144      ----》改为-1
rss = 65536
stack = 65536
nofiles = 2000     

3、Paging Space
   检查paging space的大小,在物理内存<2G时,应至少设定为物理内存的1.5倍,若物理内存>;2G,可作适当调整。同时在创建paging space时, 应尽量分配在不同的硬盘上,提高其性能。利用smitty chps修改原有paging space的大小或smitty mkps增加一块paging space。

4、系统核心参数配置
 利用lsattr -Elsys0 检查maxuproc, minpout, maxpout等参数的大小。maxuproc为每个用户的最大进程数,通常如果系统运行DB2或ORACLE是应将maxuproc调整,Default:128、调整到500,maxuproc增加可以马上起作用,降低需要AIX重起。当应用涉及大量的顺序读写而影响前台程序响应时间时,可考虑将maxpout设为33, minpout设为16,利用smitty chgsys来设置。

5、文件系统空间的设定
一般来说,系统的文件系统/、/usr、/var、/tmp的使用率不要超过80%,/tmp建议至少为300M,文件系统满可导致系统不能正常工作,尤其是AIX的基本文件系统,如/ (根文件系统)满则会导致用户不能登录。用df 查看。

# df -k  (查看AIX的基本文件系统)
Filesystem    1024-blocks      Free %Used    Iused %Iused Mounted on
/dev/hd4            24576      1452   95%     2599    22% /
/dev/hd2           614400     28068   96%    22967    15% /usr
/dev/hd9var          8192      4540   45%      649    32% /var
/dev/hd3           167936    157968    6%       89     1% /tmp
/dev/hd1            16384      5332   68%     1402    35% /home

利用smitty chfs扩展文件系统的空间。

6、激活SSA Fast-Write Cache
   利用smitty ssafastw来激活每一个逻辑盘hdiskn的Fast-Write Cache:选择硬盘后,把Enable Fast-Write一项改为Yes后回车即可。

7、激活AIO
AIO通常只对文件系统起作用,对裸设备没有作用。最大为10X并行磁盘数<80,最小为最大的一半。

①、定义系统中的AIO设备
smit aio ->; Configure Defined Asynchronous I/O 然后回车执行;
②、激活系统中的AIO设备
smit aio ->; Change / Show Characteristics of Asynchronous I/O回车出现AIO 配置对话框,将对话框中〔STATE to be configured at system restart〕域选择为“available”,然后回车执行;
注:系统会提示只有在重起后才能生效。

8、rootvg镜像
   因为rootvg损坏系统将无法运行,即使通过备份磁带恢复,也会造成系统停机,因此在磁盘空间充裕的情况下,可考虑对rootvg作镜像,同时在建立rootvg镜像时应尽量使用连接在不同SCSI 上的硬盘以做到负载均衡。利用smitty mirrorvg修改。

二、双机环境
   在双机环境中,除了考虑上述参数设置外,还需考虑:
1、 High water mark for pending write I/Os per file(maxpout) 和Low water mark for pending write I/Os per file
   它们缺省值为0,在双机环境中一般应设High water mark为33,Low water mark为24,这两个参数可用smitty chgsys来设置。

2、 syncd daemon的数据刷新频率
   该值表示刷新内存数据到硬盘的频率,缺省为60,一般可改为20,也可根据实际情况更改。该参数通过vi /sbin/rc.boot更改,其中一行如下:
nohup  /usr/sbin/syncd 60 >;/dev/null 2>;&1 &
改为:
nohup  /usr/sbin/syncd 20 >;/dev/null 2>;&1 &

http://www.chinaunix.net/jh/9/64764.html
http://blog.sina.com.cn/s/blog_592060b50100e1hu.html

posted @ 2009-10-01 09:36 leekiang 阅读(441) | 评论 (0)编辑 收藏

url

http://www.damiya.cn/download.htm
http://www.teemlink.com/
http://www.etmvc.cn
http://www.blogjava.net/chelsea/archive/2005/09/26/14153.html
http://java.csdn.net/index.php/2009/09/27/%e9%98%bf%e9%87%8c%e8%a6%81%e8%b5%b0102%e5%b9%b4-%e9%98%bf%e9%87%8c%e7%9a%84%e5%b7%a5%e7%a8%8b%e5%b8%88%e8%83%bd%e8%b5%b0%e5%a4%9a%e8%bf%9c%ef%bc%9f/

posted @ 2009-10-01 00:04 leekiang 阅读(186) | 评论 (0)编辑 收藏

通常程序员给人留下的印象就是机械,内向,不善言谈。
其实一个好的程序员最需要具备的能力就是沟通的能力。
只有良好的沟通才能知道客户需要什么,也只有良好的沟通,才能与团队成员合作无间
本次讨论希望带领大家进入一个以沟通为基本原则的软件开发领域,它就是——敏捷开发

一、敏捷开发简介
1、敏捷开发与传统软件工程的比较
传统软件工程:规范化的文档,持续改进的软件过程
敏捷开发:密切的交流与合作,逐步细化的开发过程
两者的区别好比重型武装部队与特种部队的区别
人员变更大,人数较多,成员分数,模块通信量大,耦合性强,维护时间长,开发过程有长期性,社会性的项目不益采取敏捷开发方法
2、4条核心价值观
(1)个体和交互胜过过程和工具
敏捷开发很强调个人能力
它以沟通和个人能力代替了定义死了的过程
(2)可以工作的软件胜过面面俱到的文档
它强调迭代式的开发,以开发的一个个版本形象的说明了需求,便于客户联想,也便于团队沟通演示
(3)客户合作胜过合同谈判
这条有过项目经验的人都能理解,与客户成为朋友比固定死的合同有用得多
(4)响应变化胜过遵循计划
它强调沟通,从而更积极的拥抱变化,并随时调整
3、敏捷开发的基本原则
(1)尽早、持续交付有价值的中间软件
(2)响应变化创造竞争优势
(3)业务人员与开发人员一起工作
它的目的是强调大家建立频繁密切的交流
这是一种帮助大家沟通的方法
这里的业务人员是指需求人员,开发的时候当然需要了
但是肯定不直接参与软件编写过程
(4)团队内部面对面的沟通
(5)根据完成了的功能调整工作进度
这是一种帮助大家沟通的方法
这里的业务人员是指需求人员,开发的时候当然需要了
但是肯定不直接参与软件编写过程
业务人员指的是了解客户需求的人员
熟悉业务的人
(6)重构代码,保持代码健壮
(7)尽快完成目前已知的需求
强调把不了解的需求放到以后,不考虑太多可能性
不考虑太多可能性是指不考虑变化的可能性
先做好已知的,定义好的,持续形成新版本,客户可能会想到需要什么
很多客户并不是一开始就知道自己要什么
你给他一个东西用用,他会觉得好,还需要什么
或者哪里不好,需要改动
很多时候客户有很多需求,我们需要做的是帮他找到重点,理清流程,帮助客户提高主要的工作的效率才是目的
大家要始终知道,敏捷开发是一种开发方法,遵照执行可以对你的工作提供效率,而不是必须遵守的。
4、主要的敏捷方法
(1)极限编程(XP)-后面介绍
(2)水晶方法(Crystal)-个人觉得是XP的复杂版
重点;一种方法学,根据不同类型的项目确定不同的开发方法
(3)动态系统开发方法(DSDM)
重点:迭代式开发,及时并持续获得客户反馈,并对主要功能不断精化
敏捷开发是一种原则,实际的方法很多
是一种哲学的价值观
(4)特征驱动的软件开发(FDD)
自适应软件开发(ASD)
SCRUM方法……

二、极限编程简介
个人觉得极限编程是一系列方法的组合
1、特点:轻量、柔性、充满乐趣
2、XP的价值观
(1)沟通
(2)简单
(3)反馈
(4)勇气
其实前三点刚才敏捷开发方法已经讲了,重点就是勇气
不是重点,是我要讲的重点
勇气其实和拥抱变化是一个意思
勇气还指不断的重构代码
勇气就是甚至引导客户去变化
使之成为一种竞争优势
3、基本原则
(1)快速反馈
(2)简单性假设
(3)逐步修改
(4)提倡更改
(5)优质工作
第(5)点是很多优秀的程序员容易犯的错误
很多优秀的程序员喜欢设计,觉得思路是最重要的,很多时候把思路理顺了,不愿意把问题完全解决好,总是留些小尾巴。但是后面又更不愿意回有修补好
比如很多人写TRY加个CATCH,然后就不写出错处理,想等最后一起写,实际上再不会回头看了

三、重要概念解释
这里的概念实际上很多就是一些小方法,我重点讲解一下,希望能引起大家的兴趣,使大家更详细的研究XP方法

用户故事:
就是面对面的请用户描叙自己工作的步骤,可以用UML,也可一用小卡片
也可以用最平实的语言描叙,当然你一定要记录下来,这个是需求分析的依据
迭代式开发:
迭代方法有没有人不懂?
迭代式开发就是不断的交付新版本,但是不是修改性质的,而是不段精化的
隐喻:
我觉得就是对事物的约定俗成的叫法
比如很多人把DOTNET高手叫大内高手(DOTNET读音和大内读音很近似)
这里的约定俗成是为了更方便的交流,更愉快的沟通,大家把平时这些比喻收集起来,和客户交流,和团队成员交流的时候就可以这样说
就象现在把女朋友叫老婆,难道你会不懂吗?
简单设计:
粗略的设计,不考虑各种可能情况,只设计主要类
测试先行:
测试先行是现在很提倡的开发方法,是很值得研究的
好比砌砖头,先拉一个水平线,每砌一快砖都对比一下
如果你全部砌完了再看对得齐不齐是不是有点晚了
测试先行的方法之一就是写每个模块之前先写测试代码,并且在每次改动之前测试一次
这样是很正确的思路,其实一点也不复杂,就象在学校写程序的时候,要也MIAN()方法测试一下结果,你写好了以后,再测试就很方便了。而且不用进行很复杂的测试
重构:
我用三个词解释,就是重思考,重设计,重编码。
不断的找时间重构自己的代码是提高自己能力的很重要的方式
结对编程:
结对编程不是结队编程,是2个人,不是更多
有谁亲自试过
我个人不喜欢结对编程,但是建议大家工作不忙的时候可以试试,至少可以提高大家的交流度
结对编程主要目的是让大家更好的交流
敏捷开发的基本原则就是沟通
持续集成:
将所有模块经常性的整合,以及时发现与系统有冲突的问题
典型的就是微软团队的:每日构造
微软的每日构造甚至到了变态的地步,要求每天集成测试,发现问题,就算是凌晨也会找到你,要你立即修改
现场客户:
这是一种夸张的说法,其实就是经常和客户面对面的交流,演示,和现场开发差不多
编码标准:
团队采取统一的编码标准,避免就个人习惯,个人爱好等细节问题产生争论。

总之极限编程就是要求团队与客户密切的沟通,团队最好是长期合作,和客户交朋友。
希望本次讨论能让大家更加热爱编程,更积极的于他人沟通,更热情的拥抱变化。
并预祝大家能利用此方法更充分的发挥自己的潜力,在职业道路上一帆风顺。
谢谢大家
转自http://blog.chinaunix.net/u1/34831/showart_1668198.html

posted @ 2009-09-30 09:29 leekiang 阅读(378) | 评论 (1)编辑 收藏

1,迭代不是敏捷独有的, 这说明迭代也是一种一般性的方法
2,需求分析比设计更为重要。
3,现实世界-->业务模型-->分析模型-->设计模型
  其中业务模型体现了需求,就是用例。
  分析模型与具体语言的实现无关
  设计模型以及与语言相关。

posted @ 2009-09-30 08:22 leekiang 阅读(211) | 评论 (0)编辑 收藏

技术的深邃和广阔,对于个人来说就像汪洋大海。弱水三千,只取一瓢饮。
只学当前能用得上的,就像爬楼梯一样,只能一级一级的爬,爬上了一级,站稳了脚跟,再爬下一级。
只学当前能用得上的,一是工作和谋生的需要;二是时间有限,精力有限,不可能所有的都学;三是刚好够得着,跳着就能摘桃,效率高;四是可以马上应用于实践,不容易忘记。
有中文翻译的话,就不要看英文,原因一是看得慢,二是会受到干扰,你很容易就脱离了原本要关注的东西。




posted @ 2009-09-29 23:56 leekiang 阅读(237) | 评论 (0)编辑 收藏

截至今天,
jdk1.4的最新版本是j2sdk-1.4.2_19
jdk1.5的最新版本是jdk-1_5_0_21

下载地址:http://java.sun.com/products/archive/
http://java.sun.com/javase/downloads/jdk/142/
http://java.sun.com/javase/downloads/jre/142/
http://java.sun.com/javase/downloads/5u20/jdk
http://java.sun.com/javase/downloads/5u20/jre

posted @ 2009-09-18 15:58 leekiang 阅读(370) | 评论 (0)编辑 收藏

契约式设计的本意很简单,就是在设计和编码阶段向面向对象程序中加入断言(assertion)。而所谓断言,实际就是必须为真的假设,只有这些假设为 真,程序才可能做到正确无误。契约式设计的主要断言包括先验条件(precondition)、后验条件(postcondition)以及不变式 (invariant):
● 先验条件针对方法(method)1,它规定了在调用该方法之前必须为真的条件。
● 后验条件也是针对方法,它规定了方法顺利执行完毕之后必须为真的条件。
● 不变式针对整个类,它规定了该类任何实例调用任何方法时都必须为真的条件。
断言应使用某种编程语言写在代码里(而不是仅仅通过文档加以声明),只有这样:
1)对于程序员而言,它们才有意义,同时能够提供优质的.有用的文档.
2)能够在运行时对它们进行检测,更好地支持测试和调试工作.

charon的建议。如果你对断言/防错程序不怎么熟悉,而且也搞不到那本"编程精粹"。买《Design by Contract by Example》这本书看看。如果已经熟悉了,到书店看个半小时到一小时就够了(例子只要挑个一个看,多了也没用),权当扩充知识面了。使用的话,就当断言了,设立若干前置条件后置条件就够了,这样足以有效提高对程序的置信度;什么不动点,Frame Rules,那是理论上的东西,吃力不讨好,有闲工夫的才时候可以用用(得到的效果和付出的努力不成比例)。

我的总结:开始看了名字以为是按约定进行设计的意思,后来大概看了看,了解了一点点,但决定不再在上面花时间了,测试驱动开发明显要更为成熟和实用。

posted @ 2009-09-03 23:42 leekiang 阅读(619) | 评论 (1)编辑 收藏

周延鵬(威剛科技顧問)早起閱讀,累積向前的動力

實踐篇  CEO早起行程全紀錄
許多CEO早已加入「晨型人」的行列,在起床到出門上班之間的幾小時,他們究竟在做些什麼?他們各自有哪些早起祕訣?

拿著傑克.威爾許回憶錄英文版,威剛科技顧問周延鵬扭開了落地窗前暖黃的燈光,倚著躺椅坐下,手指、眼睛一行行逡巡過文字。

窗外天色漸漸大亮,脫去了原來的黑重大衣。周延鵬抬起頭,四點半到六點半,悄然經過了兩小時。

周延鵬是很有紀律的晨起人。他計劃性地利用早晨為自己與組織學習、思考,化為向前跨步的動力。

他一開始是為了自己的人生目標而早起。

他笑說,他在金門高中念的是放牛班。為了考上好大學,高三剩下十個月時,他每天固定九點上床,十二點起床,念書到天亮,只有中午稍微休息半小時。這樣拚了十個月,終於考上輔仁大學法律系。

上大學後,他發現班上三分之一的人家裡都有法律背景,要贏過別人,只有更加努力。他養成三點起床念書、五點送報、在八點四十分第一堂課前繼續念書的習慣。若是寒暑假,他更會有計劃地安排前一個月的早晨複習前學年的課程;後一個半月用來預習。這樣學年開始後,早上就能用來讀更深的期刊或專書。

他開始工作後,晨起時光對組織與工作的成長,就更重要。

周延鵬在去年初到威剛工作前,以「周律師」聞名業界。他在鴻海集團法務部十八年,設立鴻海全球六個法務據點,統領四百五十位員工,建立起「智慧資源規劃」,不僅使得「司法、專利商戰」成為鴻海征戰全球的另一件利器;這套知識管理提供脈絡清楚的產業分析,成為鴻海四海攻城略地時,下判斷與決策的重要基礎。

郭特利(奧圖碼亞洲區總經理)早起逛市場,向小販學打品牌

四十二歲、業務出身、魚販之子的奧圖碼亞洲區總經理郭特利,讓二○○一年才成立的奧圖碼突破許多知名日系大廠的防線,在全球投影機品牌市場坐二望一。

銷售量、組織擴張、營收每年皆以倍速成長,每股盈餘也從一開始的負○.九元,至二○○六年達到五.一元。

郭特利透露,他打拚事業的衝勁其實是在早晨獨處的時光中建立,而經營品牌的堅持,則是從傳統市場小販的精神學習而來。

早上六點半,郭特利就會穿著黑色無袖背心,繞國父紀念館晨跑三千公尺,再順道去附近的傳統市場,幫自己買一袋水果當早餐,幫太太買新鮮的魚貨。

利用晨跑獨處的時間,郭特利會思考當天行程裡,開會時要討論的內容或與客戶商談的事項等,讓心理、身體都事先準備,到達公司時讓自己呈現最佳狀態。不過,郭特利也承認,「早起運動是很辛苦的,冬天我也想在溫暖的被窩裡多溫存一下,跑步和練武術的過程會很喘、很累,但等到跑完了、練完了,你就有達到或超越目標的成就感。」

郭特利回憶大學時,向陸戰隊退伍的教練學習跆拳道的過程,每個動作都要做兩百次,教練拿一個棒球棍在旁邊,做不好就打,他說,「不要覺得辛苦,英雄是打出來的,功夫是練出來的。」一點一滴,鍛鍊了郭特利的堅毅。

跑步完後,郭特利走進傳統市場,對哪家的魚新鮮、哪家的水果價格公道都瞭若指掌,經常光顧的魚攤老闆娘都知道他挑魚不用摸,一看便知新鮮與否。這個能力來自他從小幫父親賣魚,週末跟著父親四點起床批貨、七點開市。

裴岱偉(君悅飯店總經理)早起運動,找到活力與平靜

 隨著接連不斷的體位法變換,君悅總經理裴岱偉(David Pacey)的呼吸聲漸漸綿長深沉。

空間中,練阿斯坦卡瑜珈(Ashtanga Yoga)的裴岱偉只專注在此刻的呼吸調息。身處熙來攘往的市區中心,或是今天下午君悅全球總裁即將來訪,此刻與他似乎都沒有關聯。

裴岱偉喜歡早上獨處,在瑜珈與自行車中找到一天的活力與平靜。

「這是『屬於我的時間』,」放慢速度,裴岱偉強調,「就是裴岱偉的時間(Dave's Time)。」八年前,他從餐飲部門調任馬尼拉凱悅酒店總經理。過去習慣在餐飲部門非尖峰時間(如下午兩點到五點)休息或運動,現在調整生活步調後,把這時間移到清晨。

「飯店就像不夜城,」他說,「一旦一天工作開始,可能一直就持續到晚上,不會停止。」

他固定四點起床。如果是做瑜珈的日子,他就喝上一杯綠茶,慢慢地讓身體醒過來,五點出門到飯店停好車,接著搭計程車到不遠的瑜珈中心上六點的瑜珈課,在七點半到八點間回到飯店,開始一天的工作。

其他的日子,他則起床來份能量棒、香蕉或者土司的輕食早餐,然後到台北美國學校前集合,和自行車俱樂部的朋友一同上北投、陽明山騎上一個半小時的自行車。

早起運動為他的一天補充能量。

透過學習了四年的瑜珈,他能感受到身體再充電,循環開啟,身體的能量流動。

劉政鴻(苗栗縣長)早起耕作,釋放身心壓力

 嘹亮的雞啼劃破清晨寒冷未明的天空,周遭還是一片寂靜,但在苗栗後龍鎮上,田園、房舍錯落間,有戶人家已拉開大門,燈火通明。

早晨五點半一身輕裝、穿著黑色及膝膠鞋的苗栗縣長劉政鴻正提著兩桶飼料往池塘、鴨舍走去。一開門,鴨、鵝、鴿子熱烈拍翅,鳴叫聲此起彼落,剛灑入水池的飼料也吸引大批肥美的魚群浮現水面,爭食豐盛的早餐。

回到屋裡,籠裡還有三、四十隻嗷嗷待哺的小雞,劉政鴻一一為牠們裝滿飼料盒、清洗水槽、重新裝滿乾淨的飲水,雞群們就像抱著奶瓶的嬰兒,安靜地享用,不再吵鬧。

接著劉政鴻到菜園裡鋤土、拔草、收割成熟的各類蔬菜,他驕傲地向人展示他的有機農園,家中的肉類、蔬菜大多可以自給自足。

無論四季更迭、生涯角色不斷轉換,從小養成的習慣讓他喜歡在田園農事裡迎接每一天的日出。

過去擔任立法委員的期間,住在台北,沒有田可以種、動物可以照顧,劉政鴻大呼「真無聊!」「從小就跟著我爸爸早起,他是新港國小校長,他五、六點到學校改作業,我就在旁邊念書,」劉政鴻一邊回憶,一邊為社區裡的土地公廟插上早晨的第一炷香。

種菜鋤土不僅為生產,更是劉政鴻運動紓壓的祕方。隨著每一次的下鋤入土,他心頭的煩悶、外界的誤解、壓力就漸漸得到釋放。

剛過六點,劉政鴻從田裡回到二樓的辦公桌邊,批閱公文、準備會議討論、思考政策方針。腳步經常快得讓下屬跟不上的劉政鴻,會在這個時候把待辦事項條列在便條紙上,如此秘書一上班就可以開始聯絡交辦事項,爭取時效。

白文仁(寶來集團副總裁)早起思考,發現萬流歸宗

 天色幽微,只有幾聲雞鳴和駐守黑夜的黃暈燈光劃破靜謐。

才四點,寶來集團副總裁白文仁已經端坐住家二樓隔間的書桌前,翻開前陣子才上完的圓桌教育基金會課程筆記,把每一條筆記速寫、每一個圖示表格重新仔細謄好。等待訪問之前,他把今早轉看電視,隨手記下劉墉談到的幾點人生哲理,也一同補充歸整到筆記裡。

清晨,對白文仁來說,是思緒串聯、重組、歸納的時間。

他的早起習慣從十八年前在寶來證券擔任總經理室協理時就養成。證券營業員七點四十分上班,他固定五點起床;七點到公司;現在擔任集團副總裁,他一樣五點半起床,做瑜珈、到後山健走五公里或上健身房。

但他最特別的,還是利用早晨歸納、思考、演繹想法。

他固定每個月從台灣、香港與大陸各選一到兩本書閱讀,內容廣泛,身後的書架上,擺著《品三國》、《大國崛起》等管理、政經書籍;也有《四的法則》、《地底三萬呎》等人文小說;或者微積分、統計學等實用工具書。

他會隨身攜帶小本子,把閱讀心得,或看別人做一件事、說一句話,甚至是電影對白的感觸隨手記下,然後利用清晨整理歸檔。

「早上的時間是加乘的,」白文仁說,「做一個小時的事情,等於是平常做兩、三個小時的事。」他說,早晨的靜謐適合沉澱,特別容易觸類旁通,舉一反三。

楊子江(前財政部次長、匯宏顧問董事長)早起爬山,維繫大人的友誼

 清晨六點半,天矇矇亮,依著木柵蔥綠山邊的政治大學校園,空氣跟被露水滋潤的草地一樣新鮮飽滿,十幾位住在木柵、新店附近的金融人,已經在政大後門集合,開始週末的爬山聚會。

包括前財政部次長楊子江、資誠會計師事務所所長薛明玲、由投審會退休到文化大學任教的黃慶堂、前日盛金控財富管理事業群執行長蘇英孝、中租企業協理劉建林等,每個週末清晨都聚在一起,沿著政大校園的山路走一圈,不分寒暑、不論晴雨,算一算,有十年了,即使過年的星期六與星期日也不放假。

「爬山是最簡單的運動,」現任匯宏顧問董事長的楊子江解釋。這一群工作超過三十年的佼佼者,早就養成早起的習慣、知道固定運動對於維持體力的重要,爬山不需要任何特殊器材、不像高爾夫要開車到大老遠的球場、也不像打球有人數要求,成為大家最容易持之以恆的共同選擇。楊子江甚至經常五點半在上班前自己先走一圈,「早上思路最清楚,一邊走路、呼吸新鮮空氣,也適合思考,」楊子江說,他經常就一邊走、一邊思索當天的會議該如何主持、構思致詞內容。不過一個小時,既運動,也讓一天的工作更有條理、更有效率。

「一群人一起爬山,相互激勵,興致更高,」薛明玲點出了大家聚成登山會的原因。過去薛明玲經常扮演糾察隊長,打電話給缺席的人,提醒還有朋友等著一起爬山運動,即使刮風下雨也不要偷懶,讓大家養成了習慣,更養出了朋友的情誼。

大家同在金融相關領域工作,許多都是熟識的朋友,但是「每天大家忙工作、忙家庭,也沒時間聚會,」薛明玲說,「一起爬山就是健康又簡單的聯絡感情的方式。」硬是從忙碌的交際應酬與家庭生活中,擠出一個聚會的縫隙。從政大後門走到前門,一路上工作、時事、家庭小孩什麼話題都可以聊、都可以辯,談的內容天馬行空,好像二十出頭的大學生一樣。

转自http://blog.udn.com/d220594885/1649272

另见
财经巨子的时间管理
http://hi.baidu.com/%BF%AA%CD%A8/blog/item/6f702a290be42cf699250aed.html
“一心多用”与“注意力缺失”[转]----显示屏前的你是否有同感?http://old.blog.edu.cn/user2/34856/archives/2006/1176299.shtml
http://xianguo.com/item/517340165《晨间日记的奇迹》介绍的早起不懒床的方法

posted @ 2009-08-30 22:31 leekiang 阅读(386) | 评论 (0)编辑 收藏

DocBook或 reStructuredText都是纯文本文档格式。也可以考虑xlst
StructuredText和reStructuredText不一样

Sphinx简单来说,是一个文档生成工具,用于把reStructuredText 格式的源文件生成诸如HTML, PDF, LaTex一类的格式。编辑者无须亲自处理文本的格式, 程序会自动根据源文件里的设置产生格式, 以及自动生成章节链接等工作。
包括 Python , Django 的文档,全部是使用Sphinx 生成的
http://sphinx.pocoo.org/

我是如何写博客的
http://www.cnblogs.com/mindsbook/archive/2009/07/09/how_do_i_write_blog.html
http://www.cnblogs.com/mindsbook/archive/2009/07/15/how_can_i_write_blog_part2.html
该文主要介绍了如何使用 restructuredText (简称为reST)来写博客, 并且介绍了使用 google code 来管理博客源文件的方法。

另,Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL 也设计了一个存储引擎插件

txt2tags 支持带数字编号的标题
从txt2tags回归markdown  http://sinolog.it/?p=503

再找找比较好的wiki:
MediaWiki全球最著名的开源wiki引擎,运行于PHP+MySQL环境。
ViKi, 就是 VIM WiKi 的缩写。 WiKi 是一种非常方便快捷地组织信息的方式, 而 ViKi 作为一种“Personal WiKi”, 能够非常快捷地完成个人主页的制作, ViKi 可以支持许多很复杂, 功能很强大的语法。deplate是viki的编译工具。

Javascript闭包真经http://w3er.com/blog/2009/03/master-javascript-closure/

Stack Overflow和GitHub都在用markdown
wmd(http://wmd-editor.com,https://github.com/derobins/wmd)是一个专门为Markdown做的在线编辑器,StackOverflow和qingbo.net也用了
https://github.com/philc/vimium/blob/master/README.markdown
Markdown 语法
支持列编辑模式的编辑器
showoff支持用编写markdown脚本的方式在浏览器里显示ppt,例子
在Vim中发布博客内容到WordPress (reStructuredText)

目前最完善的介绍轻量级标记语言的资料:http://en.wikipedia.org/wiki/Lightweight_markup_language
以后不要叫结构化文本了,因为Structured Text已有另外的含义,见维基百科

posted @ 2009-08-30 21:34 leekiang 阅读(1289) | 评论 (0)编辑 收藏

1,验证整数
var r1= /^[0-9]*[1-9][0-9]*$/  //正整数
var r2=/^-[0-9]*[1-9][0-9]*$/  //负整数
var r3=/^\d+$/   //非负整数(正整数 + 0)
var r4=/^-?\d+$/    //整数
var val=r1.test(str); //str为你要判断的字符 执行返回结果 true 或 false

2,
function isNumber(oNum)
   {
  if(!oNum) return false;
  var strP=/^\d+(\.\d+)?$/;
  if(!strP.test(oNum)) return false;
  try{
  if(parseFloat(oNum)!=oNum) return false;
  }
  catch(ex)
  {
   return false;
  }
  return true;
   }

posted @ 2009-08-24 12:28 leekiang 阅读(224) | 评论 (0)编辑 收藏

要断开svn,把目录下所有的.svn目录删除就OK了
http://realseraph.spaces.live.com/blog/cns!B9695C2468A927AC!265.entry

posted @ 2009-08-23 23:22 leekiang 阅读(259) | 评论 (0)编辑 收藏

     摘要: 转自http://www.cublog.cn/u/30637/showart_481055.htmlOracle的imp/exp组件是我们常用的工具,它的一个操作原则就是向下兼容。下面是据此总结的几个使用规则和相关测试:   规则1:低版本的exp/imp可以连接到高版本(或同版本)的数据库服务器,但高版本的exp/imp不能连接到低版本的数据库服务...  阅读全文

posted @ 2009-08-23 23:14 leekiang 阅读(2791) | 评论 (1)编辑 收藏

抛接技术,抛球可说是最基础的必修课,现在就请你从抛球开始练习 # ^/ w: d! M" v- f% t
' I( M# N- Z4 G: N) D: [
练习用的道具,木球、皮球、网球都可以。球的大小, ; g1 N- D; ]  E

- I& d6 ~1 K# ~2 Q 可根据自己手掌的大小来选择,直径为5—9厘米。
, v6 X) x2 D5 D2 H: _, E
! {: E& V# h/ i9 v' P4 @ 练习时,球起初不易接住,由于这些球掉在地上到处乱滚, 9 F* g; [4 v0 D$ \3 h$ `" i. ^

9 U, w* B0 C8 \* n$ Y* U( | 捡球、找球很费时间,把皮球切开一个小孔,灌进一些细沙,
' n" U. w8 z7 h+ z( a) ` " {. k" [+ v7 j; [
再用胶布把球面裱贴一层,封住这个小孔,这样,当球落地时,
6 h. m' Q7 X. a* n
; @# o5 \/ c8 M- Z( j% g 就不会滚跑了,练习也方便了 0 I0 ], N, p, R

+ p" E& f/ o% Y0 p 练习方法:先练习一只球,单手抛接。 7 v1 [. H3 a' |

) L$ t, a; k) N# V/ i" D, ? 练习时,人按丁字步形站立,挺胸微收腹,双手自然下垂,
, H' r" B, s, D/ v: x 1 n& H6 y. W& w8 s& X
右手握球,由下往上用力传送,在自己的右胸前,让球脱手, . C9 k5 ]! s! m

% L) A# ~( n: p. k: Y6 Q$ H  m 使它向上微微偏右方飞出,当球升到一定高处后沿右手的右外侧下落, 3 x0 S0 E2 p3 h( p
% E$ [2 F* z, N4 T8 L& k! K
立即把右手从胸部向右移到肩宽之外接住它。 7 j3 z! }  `  Q; e, q1 E
- q; _8 B4 x; o5 w
单抛一个球,还须左、右手轮流练习。 4 e4 e* b7 C8 L5 M
# j) a; e8 P8 o/ R
抛双球:在练习抛单球的同时,就开始了抛双球的练习。
) k$ q) Q& q0 h2 }" n" H. h. q 5 t; W- d2 h% f0 L' U
抛两个球,有两种方法:
7 Y( i- H7 {* D" F9 ~( Q2 A 9 Z# m8 \8 n+ i: y' ]- A9 H
一是单手抛两个球,右手握住两球,球A在前,由中指、食指、拇指控制,
" c, M" b; I& k
( v+ K: v0 u& w  d- j 球 B由手掌及无名指、小指捏紧。抛时手法和球的运行路线与抛一个球的运行路线相同。 & Y$ ?+ {1 N; X. y; K

/ ?+ g/ _) i  g  v+ S3 n 右手抛出球,捏住球B,放松球A,让它由胸前向右侧飞出, 2 {3 J, A* j7 h' o; Z

4 T% E7 V6 P* N3 r3 X* ? 当球A飞升到最高点,紧接着沿球A运动的路线抛出第2个——球B,待球B出手之后,
" P. Q- I5 U) |: f0 o0 b2 | . e6 H2 W) z( `( Q2 q: t' F
立即将手从胸前移到右外侧。正好接住落下的球A, 6 A2 @: v# X! V  g
. |; x4 I, e1 u( Y) c
再如前面动作一样,抛 A接 B,循环往复。
: f, W( s% i0 A 7 W3 C8 M0 l0 x6 @* L
由于这两个球在空间形成一个圆形轨迹,所以它们互相不会碰撞。
2 [9 `' c+ d" `( u % r; L' s# V' T9 C5 k! ~" A8 [
单手抛两个球逐渐熟练之后,再练习改变抛球时所用的力量,使球越抛越高, : {% B4 V. E3 M- b3 k2 ]7 f) V

' z7 G. u/ T% r( c. P  q  e 高至球离手约300厘米左右,然后再逐渐放低,低至20厘米左右,必须注意两个球的运行路线不能打乱。
' R, S0 B2 s3 l8 ?% @
+ v% s. w, f- }/ }& H
1 f% c" ^6 o/ J( M( |$ x 抛两个球的另一种基本手法是双手抛接。
2 `2 y$ K/ ^9 F$ [( D / C. ~& C$ _/ W6 `6 s
左右手各握一个球,右手将球A横斜向地朝自己面前的中部上空抛出, 7 l( ]& [8 h/ H6 F% y3 K

+ ?7 [" n+ ?; D" D" S 抛出的球高度与自己眼睛等齐,以鼻尖为中心点,使球在面前沿平行抛物线作横向运动;
" Q1 @) w8 e+ u4 }
8 G& W: K9 _0 O6 }9 R 当球越过中心点之后,把左手的球B以同样姿势向右抛出,然后左手接住落下的球A,
( g0 H2 U; N* k9 w0 ~
8 I6 z% `4 ^+ V, r: O 右手再接住球B。再来一次,左手先抛出刚接住的球A,待球A越过中心线后,
! I" {# p% J- N* P7 ~
9 H0 B9 l0 C" A& W+ `( b 右手抛出球B,再接球 A。如此循环起来。 1 a4 d: a; n( y
& j" x7 G4 p0 ~8 S  @
练习双手抛接双球,注意球的运行路线,要互相让开,避免两球互撞。
学完这个部分,你就可以进行舞台演出了 & [7 }; S9 N& ]+ M, M. e9 N

9 }6 U% x9 L% u) A& s. v0 V  O$ ?, V 练熟了抛两个球,就可以开始抛3个球的尝试。 6 w& I+ X1 @: S9 ?$ R8 [
' ~& L( Z$ R, T8 k
右手握球A和球C,左手握球B,横向抛出球A,
' d& J% z& v0 b5 V
9 b9 j% X' N, T6 b# a5 {" `$ p# j5 c 如同前面双手抛两个球的办法一样,
3 m! X2 w8 h2 V5 u+ w; X , B. [' ^7 S4 u$ F
待球A越过中心线后,左手抛出球B,接住球A, * l, H1 t2 \9 c7 a% M

/ z. \- I8 H9 |0 e' O 紧接着,右手以同样姿势抛出球C,接球B。 0 m% B( ^) G2 E6 i. ~) X- `
5 S6 p& ^# @7 ?5 k
如此不断抛接交换,使 3个球在空中运转循环起来, ) X6 c+ P/ l$ b0 K' r' b6 l' v5 Q
* Q6 J2 v1 B1 G# D) w/ s
这是抛球技术最基础的功夫。 1 e- T9 m7 C' n4 w4 H
! Y: q* O+ I3 P( V) K, Q0 D) i
许多杂技演员,3个球抛得出神入化,变化多端,
' S* x0 V8 q7 [8 y. T# |; {" T & T) Y5 [% ^9 O# W
赢得观众的阵阵掌声,常见的花样如下几个节日。
1 S' @. m$ G& A. E
6 T8 I' Y1 |; ^* A 过桥:在抛接过程中,突然改变球的运行路线,凡右手抛出的球, ; ]  ^; {/ w0 M/ Y7 p7 f
9 }! |9 s& T& w# }& `
都绕外层大圈向右运行,凡左手抛出的球,都沿小圈向右运行,
- X2 p: W; l3 P5 p. R
1 Z1 o& g" ~& a0 R3 f6 q+ n 形成美丽的两个半圆轨迹。 $ l2 Q7 ~# C5 y! f6 u

6 W+ h/ i9 k# r9 z: { 流星赶月:在过桥的基础上,右手仍按过桥的手法向上将球抛起来沿大圈运动,
3 \; c) E. z4 m( @9 I 2 }3 X# `* g4 |# |6 `" E
左手一改向上抛小圈子为横向向右手平射, 7 l0 d; v' w; E- w2 {
1 ^7 O6 e. m) T8 N$ t3 O, m$ K1 v* P/ P
使3球形成一个流动不息的圆环状态。 - @' J3 M7 S  i$ g) j

# M* c# n. ^. K- i 单个和双个:右手二球(A、C),左手一球(B),
  s2 W* `! c( e5 E+ w" p2 j # _' g' w- }% |3 H8 X
左右双手同时向上垂直抛出一个球(A和B), , g" v: `1 W5 v1 S/ [7 U

8 Q' f; c. A' i* Z7 G 注意让球沿自身的两侧垂直向上抛,不要偏斜。
5 p& h) Z2 U9 t  ^$ O 8 l0 S6 n( o5 ~$ ?/ v0 [7 v
待球A和球B升至最高点时,右手移至中心线部位,向上垂直抛出球C,
% b' M# B$ i+ u- E# h. f9 f . Z3 D+ r1 X! {2 H* z' B
同时,双手立即移至两旁,接住一齐落下的球A和球B。
8 R" G: L: {9 V2 Y5 M: i6 i3 ~
$ a4 N: w, x. n( ]* E; K# A 然后,又沿两侧垂直方向朝上抛出这两个球……
6 U( |) r5 R' ?
: K  k& ?. P& E( n" s 这样,3个球来回垂直运动,犹如齐整的步伐。 : @/ t! c, I: B! c0 I( o: h

! Q+ N* l( S/ [) @- @' T  x5 M 骗马:在抛球时作跨腿的动作,就是骗马。在抛接球时, ' _! a$ }+ {. s; J1 o2 k

$ X$ M1 _) O7 K2 T" L 次抬起左右腿,将球由外向胯下扔出,同时扔出后手仍立即还原接球。
0 u+ j0 H9 u" C$ f0 b3 x
/ ?# ]% M1 x2 o7 o- @$ P" }3 h 背剑:在抛接过程中突然将右手的球高高抛起,
7 I2 N  G( L. Y( b
( o! y* d$ K9 y9 Q4 J6 t. t/ T: O! W 这样,这个球(如球A)下降的时间就会稍微慢一拍, ) F- P9 W$ @+ \; D9 L, z: b9 E

' d0 t: ?. \6 [ 右手乘机又将刚接住的球(如球 B)从背后抛出,使它由后越过背、左肩和头部, % w3 g. ~) A- V& B- p" O- d

+ |  L) w' H; m2 B3 g 从面前落下,这时将左手的球C向右抛出,往复下去,就称为单背剑。 ! t& G, K3 ~. R, ^$ _$ _: F

( \* B, ^6 B. C1 \" c* F# O 如果当右手由背后抛出的球B还未落下时,左手也采取与右手同样的动作, ( p8 h0 T( O6 G/ x8 t
. j; ]- ?  ~" H
伸到自己背后去抛出球C,然后才急速将左手伸至前面接球B,
; X9 W8 t  {* X" g; `- {* B1 N
4 O! v' f+ V! g( Z 双手同样的动作连接起来,就称为双背剑。
* F6 O5 L! E8 a
+ e, h, s1 T! H1 }2 q3 e" b4 J) M 高抛:高抛是为下一步抛四五个球,增加球的数量作准备工作的。 , g+ m$ H  B+ R* R4 k) ]

+ U" A9 V$ H2 F( Y; R: c: @ 在抛球的中途突然将3个球同时抛向高空,使双手有一个同时脱空的瞬间, ' c' W+ T/ c" U9 g7 Q0 S
/ z% N' ^  J  h9 d$ C& I
待3个球落下时,再次把它们抛出。练习这个动作,抛接球的节奏虽然要求快一些, ! S1 t+ \, r) d8 ?6 z$ }
# \% h1 }" ~) g5 [
但不能使球的运行路线错乱,熟练以后,就能增加球的数量了。

http://www.52magic.net/viewthread.php?tid=695376

posted @ 2009-08-19 22:55 leekiang 阅读(3909) | 评论 (0)编辑 收藏

http://topic.csdn.net/u/20080921/13/87e0922d-2f61-442c-b9ae-d5680f6bec87.html
上周从开发部转来一个刚毕业的小伙子,要我面试一下看看是否适合质量部的相关工作。交谈中,小伙子说大学里已经考过了系统分析员,于是我便问他:“系统分 析员主要做什么?” 小伙子想了一会说道:“系统分析员主要就是组织、管理和规划系统”。于是我接着问道:“如果负责组织、管理、规划的话,那和项目经理的区别是什么?”小伙 子想了半天,终于摇着头说:“不知道。”
      问这个问题倒不是为了为难小伙子,主要是希望他能够明白,书 本上学来的东西必须和实践联系起来,在开发也好在质量部也好,都离不开自己的主动学习和思考,没有思考的学习只是在收集知识而已,是不能够化为己用的。在 离开学校的头两年里,大部分人是无法找到自己真正的兴趣所在,我也是一样,所以刚开始无论在哪个岗位都必须主动学习和思考,包括对自己现有岗位的知识的学 习,以及由于不满而对岗位之外的知识的学习(当然这是在工作之外),而不满正是思考的起点。不过,正是因为无法找到真正的兴趣所在,就需要坚守岗位,一方 面也许它就是自己的兴趣所在,一方面也为了寻找真正的爱好而积蓄力量。   
      额外的话说了不少,还是回来看看,到底“系统分析员、架构师、项目经理”之间有着什么样的差别?下面按自己的理解粗略的整理了一下,也许并不全面,绿色部分代表每一个角色主要需要参与考虑的活动(注:下面所说的系统分析员混合了设计的职责):
      首先看一下架构师和系统分析员的区别: 1、系统分析员必须考虑自己所设计系统的方方面面,他是系统实现的原始作者,也对系统能否满足客户的技术要求以及产品成本是否可接受起着最直接的作用。 2、架构师一般在软件组织内仅仅是少数人,他们主要负责对产品的架构进行评估以及子系统之间的接口批准上,评估的主要方面集中在系统级的质量属性和成本 上,包括:当前架构是否满足可靠性要求、系统架构的可扩展性、可重用性、性能以及基础的公共功能等等。他们必须对系统分析员设计出来的系统进行最初的把 关,所以责任重大,也需要经验非常丰富的人来承担。在公司其他部门和Ivar Jacobson的交流中,Jacobson明确的指出,架构委员会不是常设组织,通常都来源于团队的系统分析员,唯一常设的职位通常只有一个主席,其他 的成员必须临时来源于系统开发的一线,只有他们最了解系统开发的基本思想。 3、系统成本是架构师和系统分析员最容易忽略的事情,而这个也是他们最基本的职责之一。
      接下来看看系统分析员和项目经理的差别: 1、一个不合理的计划往往被归咎于项目经理,但这并不是事实。计划的制定严重依赖于系统分析员所设计系统的部件完成工序,而唯一能对这个作出准确判断的只 有系统分析员。所以,计划的最初版本是来源于系统分析员而不是项目经理。项目经理在这方面的主要作用是协助系统分析员制定计划,帮助考虑人员、资源方面的 投入情况,并在项目的执行过程中严格监控项目的进度情况。 2、质量目标的制定和计划一样,来源于系统分析员,尤其是性能、可靠性等关键技术指标,而这些的第一跟踪主体也是系统分析员。项目经理在其中的角色,只是 协助系统分析员安排各种资源,完成这些目标的测试、跟踪等活动。 3、成本是唯一的需要架构师、系统分析员以及项目经理共同关注并且严格控制的因素,原因很简单,这是大家靠着吃饭的来源。 4、项目其他的非技术方面的因素,则基本都是由项目经理负责搞定,包括合同、人员沟通、采购等等。



我不认同,这样搞失败的几率很大.

你说的: 项目经理,系统分析员,系统架构师
可以用: 项目经理,系统分析设计师 来取代,另外新增由 首席业务分析师带队的业务支持组(纯粹的业务人员).

不管是大项目还是小项目,不管项目规模多大多小,我的观点和实践如下:

1: 项目经理 必须对项目的范围(需求),包括要实现的功能和序列 要有比任何人都清晰的认识.

2: 项目经理 要有广泛的技术背景,广度和深度的技术眼光 至少要能支撑对要实现那些功能的定义(实际上就是承诺).

3: 项目经理全局把控 系统的 WBS, 局部的细节 WBS 可以让其他人员分担, 但并不代表自己对细节无法把握.

4: 一个项目的成功实施后,虽然项目经理不用自己写代码,甚至不用自己亲自写文档.但自己对整个项目的技术包括细节都了不指掌,并且又比项目组其他人员更高度 的认识.而且能够以总结的眼光找出不足的地方,能够想到新的改进的方案 在新的项目中去实施.对系统的功能和业务以及流程进行总结分析,有意识的无形中提升自己理解问题的能力.

5: 一个项目结束后,项目经理 对团队建设和管理以及考评, 项目计划以及执行, 各种变更以及突发或必须经历的事件 的处理能力都会有一个新的台阶的提升.并且能以总结的眼光有更高度的认识. 也就是管理能力的提升.

6:......

7: 更关键的一点 就是建立发展跟客户的关系,增强客户的信任度,树立自己的个人品牌,进一步维护团队和公司的品质和品牌.客户对公司的认可,是建立在公司执行具体任务的团队的基础上,对团队的认可是建立在对项目的满意度和项目经理的认可上.


系统分析设计师,是对业务有一定基础(最好很熟悉),理解问题和解决问题能力特别突出的,技术广度和深度都非常优秀的人员承担.承担副项目经理的职责.
主要负责进行系统业务的分析和功能定义,接口定义,技术体系的制定,为项目量身定做的技术架构 等职责.

系统分析设计师 领导 设计组组长 和 开发组组长, 完成不同阶段的任务.

项目经理直接领导 系统分析设计师, 测试组, 配置管理组.

http://zhidao.baidu.com/question/108354211.html?fr=relateQuestion

系统架构设计师和系统分析师的区别与联系
区别:
系分比架构更贴近用户一点,主要是需求分析,业务分析。
架构比系分更贴近技术一点,是技术专家、资深技术人员。

联系:
都是高级抽象级别,同作为软件高级职称资格,是程序员和软件设计师的领导者和技术顾问。两个联系多于区别,一般系统分析师组和架构师组合作,共同制定一个基础技术框架。
系统架构偏向于技术方面,包括设计

系统分析偏向业务,包括需求分析

它们也有共同之处和联系,两个职位要相互配合的.

posted @ 2009-08-17 03:34 leekiang 阅读(611) | 评论 (1)编辑 收藏

http://topic.csdn.net/u/20090811/10/9c233a7f-ab58-4e5f-8ff9-7060715f7c0a_3.html
不可能都完全记住那么多的算法.
常用算法,拿过来就可以写出来
不常用的,拿起书来,看10分钟,就能理解算法(因为以前记过).
对以前没有记过的算法,就不好说了,难的可能要研究好几天.
这样就可以了.

应该熟练掌握的常用的算法应该有:
各种排序算法(插入排序、冒泡排序、选择排序,快速排序,堆排序,归并排序)
线性表(一般的线性表,栈,队列)的插入和删除
二叉树的遍历(前序,中序,后序)
图的遍历(深度优先,广度优先)
二分法查找,排序二叉树,Hash查找(处理冲突的方法)。


对于更深层次的东西,也是建立在自己熟练的基础之上的吧

《算法与数据结构考研试题精析》第2版 机械工业出版社
如果你想练习的话,这里有N多的题可以来练习,但实际中能用到的比较少,除非搞一些高端的玩意,不过平时也可以在自己的项目中结合使用

最重要的就是操作系统了(个人认为此乃计算机的精髓所在,一通百通)

转一个搞ACM需要的掌握的算法.
要注意,ACM的竞赛性强,因此自己应该和自己的实际应用联系起来.
适合自己的才是好的,有的人不适合搞算法,喜欢系统架构,因此不要看到别人什么就眼红,
发挥自己的长处,这才是重要的.


第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,
因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打
出来.
1.最短路(Floyd、Dijstra,BellmanFord)
2.最小生成树(先写个prim,kruscal要用并查集,不好写)
3.大数(高精度)加减乘除
4.二分查找. (代码可在五行以内)
5.叉乘、判线段相交、然后写个凸包.
6.BFS、DFS,同时熟练hash表(要熟,要灵活,代码要简)
7.数学上的有:辗转相除(两行内),线段交点、多角形面积公式.
8. 调用系统的qsort, 技巧很多,慢慢掌握.
9. 任意进制间的转换

第二阶段:练习复杂一点,但也较常用的算法。
如:
1. 二分图匹配(匈牙利),最小路径覆盖
2. 网络流,最小费用流。
3. 线段树.
4. 并查集。
5. 熟悉动态规划的各个典型:LCS、最长递增子串、三角剖分、记忆化dp
6.博弈类算法。博弈树,二进制法等。
7.最大团,最大独立集。
8.判断点在多边形内。
9. 差分约束系统.
10. 双向广度搜索、A*算法,最小耗散优先.


相关的知识

图论

  路径问题
        0/1边权最短路径
        BFS
        非负边权最短路径(Dijkstra)
            可以用Dijkstra解决问题的特征
        负边权最短路径
        Bellman-Ford
            Bellman-Ford的Yen-氏优化
            差分约束系统
        Floyd
            广义路径问题
            传递闭包
            极小极大距离 / 极大极小距离
        Euler Path / Tour
            圈套圈算法
            混合图的 Euler Path / Tour
        Hamilton Path / Tour
            特殊图的Hamilton Path / Tour 构造

    生成树问题
        最小生成树
        第k小生成树
        最优比率生成树
        0/1分数规划
        度限制生成树

    连通性问题
        强大的DFS算法
        无向图连通性
            割点
            割边
            二连通分支
            有向图连通性
            强连通分支
            2-SAT
            最小点基

    有向无环图
        拓扑排序
            有向无环图与动态规划的关系

    二分图匹配问题
        一般图问题与二分图问题的转换思路
        最大匹配
            有向图的最小路径覆盖
            0 / 1矩阵的最小覆盖
        完备匹配
        最优匹配
        稳定婚姻

    网络流问题
        网络流模型的简单特征和与线性规划的关系
        最大流最小割定理
        最大流问题
            有上下界的最大流问题
                循环流
        最小费用最大流 / 最大费用最大流

    弦图的性质和判定


组合数学

    解决组合数学问题时常用的思想
        逼近
        递推 / 动态规划
    概率问题
        Polya定理


计算几何 / 解析几何

    计算几何的核心:叉积 / 面积
    解析几何的主力:复数

    基本形
        点
        直线,线段
        多边形

    凸多边形 / 凸包
        凸包算法的引进,卷包裹法

    Graham扫描法
        水平序的引进,共线凸包的补丁

    完美凸包算法

    相关判定
        两直线相交
        两线段相交
        点在任意多边形内的判定
        点在凸多边形内的判定

    经典问题
        最小外接圆
            近似O(n)的最小外接圆算法
        点集直径
            旋转卡壳,对踵点
        多边形的三角剖分


数学 / 数论

  最大公约数
        Euclid算法
            扩展的Euclid算法
                同余方程 / 二元一次不定方程
                同余方程组

    线性方程组
        高斯消元法
            解mod 2域上的线性方程组
        整系数方程组的精确解法

    矩阵
        行列式的计算
            利用矩阵乘法快速计算递推关系

    分数
        分数树
        连分数逼近

    数论计算
        求N的约数个数
        求phi(N)
        求约数和
        快速数论变换
        ……

    素数问题
        概率判素算法
        概率因子分解


数据结构

    组织结构
        二叉堆
        左偏树
        二项树
        胜者树
        跳跃表
        样式图标
        斜堆
        reap

    统计结构
        树状数组
        虚二叉树
        线段树
            矩形面积并
            圆形面积并

    关系结构
        Hash表
        并查集
            路径压缩思想的应用

    STL中的数据结构
        vector
        deque
        set / map


动态规划 / 记忆化搜索

  动态规划和记忆化搜索在思考方式上的区别

    最长子序列系列问题
        最长不下降子序列
        最长公共子序列
        最长公共不下降子序列

    一类NP问题的动态规划解法

    树型动态规划

    背包问题

    动态规划的优化
        四边形不等式
        函数的凸凹性
        状态设计
        规划方向


线性规划

常用思想

    二分          最小表示法



    KMP                              Trie结构
    后缀树/后缀数组            LCA/RMQ
    有限状态自动机理论

排序
    选择/冒泡        快速排序        堆排序            归并排序
    基数排序        拓扑排序        排序网络


中级:
一.基本算法:
    (1)C++的标准模版库的应用. (poj3096,poj3007)
    (2)较为复杂的模拟题的训练(poj3393,poj1472,poj3371,poj1027,poj2706)
二.图算法:
    (1)差分约束系统的建立和求解. (poj1201,poj2983)
    (2)最小费用最大流(poj2516,poj2516,poj2195)
    (3)双连通分量(poj2942)
    (4)强连通分支及其缩点.(poj2186)
    (5)图的割边和割点(poj3352)
    (6)最小割模型、网络流规约(poj3308, )
三.数据结构.
    (1)线段树. (poj2528,poj2828,poj2777,poj2886,poj2750)
    (2)静态二叉检索树. (poj2482,poj2352)
    (3)树状树组(poj1195,poj3321)
    (4)RMQ. (poj3264,poj3368)
    (5)并查集的高级应用. (poj1703,2492)
    (6)KMP算法. (poj1961,poj2406)
四.搜索
    (1)最优化剪枝和可行性剪枝
    (2)搜索的技巧和优化 (poj3411,poj1724)
    (3)记忆化搜索(poj3373,poj1691)
     
五.动态规划
    (1)较为复杂的动态规划(如动态规划解特别的施行商问题等)
        (poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj3034)
    (2)记录状态的动态规划. (POJ3254,poj2411,poj1185)
    (3)树型动态规划(poj2057,poj1947,poj2486,poj3140)
六.数学
    (1)组合数学:
        1.容斥原理.
        2.抽屉原理.
        3.置换群与Polya定理(poj1286,poj2409,poj3270,poj1026).
        4.递推关系和母函数.
       
    (2)数学.
        1.高斯消元法(poj2947,poj1487, poj2065,poj1166,poj1222)
        2.概率问题. (poj3071,poj3440)
        3.GCD、扩展的欧几里德(中国剩余定理) (poj3101)
    (3)计算方法.
        1.0/1分数规划. (poj2976)
        2.三分法求解单峰(单谷)的极值.
        3.矩阵法(poj3150,poj3422,poj3070)
        4.迭代逼近(poj3301)
    (4)随机化算法(poj3318,poj2454)
    (5)杂题.
        (poj1870,poj3296,poj3286,poj1095)
七.计算几何学.
        (1)坐标离散化.
        (2)扫描线算法(例如求矩形的面积和周长并,常和线段树或堆一起使用).
            (poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)
        (3)多边形的内核(半平面交)(poj3130,poj3335)
        (4)几何工具的综合应用.(poj1819,poj1066,poj2043,poj3227,poj2165,poj3429)


高级:
一.基本算法要求: 
      (1)代码快速写成,精简但不失风格 
          (poj2525,poj1684,poj1421,poj1048,poj2050,poj3306)
      (2)保证正确性和高效性. poj3434
二.图算法:
      (1)度限制最小生成树和第K最短路. (poj1639)
      (2)最短路,最小生成树,二分图,最大流问题的相关理论(主要是模型建立和求解)
        (poj3155, poj2112,poj1966,poj3281,poj1087,poj2289,poj3216,poj2446
      (3)最优比率生成树. (poj2728)
      (4)最小树形图(poj3164)
      (5)次小生成树.
      (6)无向图、有向图的最小环   
三.数据结构. 
      (1)trie图的建立和应用. (poj2778)
      (2)LCA和RMQ问题(LCA(最近公共祖先问题) 有离线算法(并查集+dfs) 和 在线算法
          (RMQ+dfs)).(poj1330)
      (3)双端队列和它的应用(维护一个单调的队列,常常在动态规划中起到优化状态转移的
          目的). (poj2823)
      (4)左偏树(可合并堆). 
      (5)后缀树(非常有用的数据结构,也是赛区考题的热点).
        (poj3415,poj3294)
四.搜索 
      (1)较麻烦的搜索题目训练(poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)
      (2)广搜的状态优化:利用M进制数存储状态、转化为串用hash表判重、按位压缩存储状态、双向广搜、A*算法. (poj1768,poj1184,poj1872,poj1324,poj2046,poj1482)
      (3)深搜的优化:尽量用位运算、一定要加剪枝、函数参数尽可能少、层数不易过大、可以考虑双向搜索或者是轮换搜索、IDA*算法. (poj3131,poj2870,poj2286)
五.动态规划 
      (1)需要用数据结构优化的动态规划.
        (poj2754,poj3378,poj3017)
      (2)四边形不等式理论.
      (3)较难的状态DP(poj3133)
六.数学 
      (1)组合数学.
        1.MoBius反演(poj2888,poj2154)
        2.偏序关系理论.
      (2)博奕论.
        1.极大极小过程(poj3317,poj1085)
        2.Nim问题.
七.计算几何学. 
      (1)半平面求交(poj3384,poj2540)
      (2)可视图的建立(poj2966)
      (3)点集最小圆覆盖.
      (4)对踵点(poj2079)
      八.综合题.
      (poj3109,poj1478,poj1462,poj2729,poj2048,poj3336,poj3315,poj2148,poj1263)

初期:
一.基本算法:
    (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586)
    (3)递归和分治法.                  (4)递推.
    (5)构造法.(poj3295)            (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)
二.图算法:
    (1)图的深度优先遍历和广度优先遍历.
    (2)最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra)
        (poj1860,poj3259,poj1062,poj2253,poj1125,poj2240)
    (3)最小生成树算法(prim,kruskal)
        (poj1789,poj2485,poj1258,poj3026)
    (4)拓扑排序 (poj1094)
    (5)二分图的最大匹配 (匈牙利算法) (poj3041,poj3020)
    (6)最大流的增广路算法(KM算法). (poj1459,poj3436)
三.数据结构.
    (1)串 (poj1035,poj3080,poj1936)
    (2)排序(快排、归并排(与逆序数有关)、堆排) (poj2388,poj2299)
    (3)简单并查集的应用.
    (4)哈希表和二分查找等高效查找法(数的Hash,串的Hash)   
        (poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)
    (5)哈夫曼树(poj3253)
    (6)堆
    (7)trie树(静态建树、动态建树) (poj2513)
四.简单搜索
    (1)深度优先搜索 (poj2488,poj3083,poj3009,poj1321,poj2251)
    (2)广度优先搜索(poj3278,poj1426,poj3126,poj3087.poj3414)
    (3)简单搜索技巧和剪枝(poj2531,poj1416,poj2676,1129)
五.动态规划
    (1)背包问题. (poj1837,poj1276)
    (2)型如下表的简单DP(可参考lrj的书 page149):
      1.E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533)
      2.E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最长公共子序列)   
        (poj3176,poj1080,poj1159)
      3.C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最优二分检索树问题)
六.数学
    (1)组合数学:
        1.加法原理和乘法原理.
        2.排列组合.
        3.递推关系.
          (POJ3252,poj1850,poj1019,poj1942)
    (2)数论.
        1.素数与整除问题
        2.进制位.
        3.同余模运算.
          (poj2635, poj3292,poj1845,poj2115)
    (3)计算方法.
        1.二分法求解单调函数相关知识.(poj3273,poj3258,poj1905,poj3122)
七.计算几何学.
    (1)几何公式.
    (2)叉积和点积的运用(如线段相交的判定,点到线段的距离等). (poj2031,poj1039)
    (3)多边型的简单算法(求面积)和相关判定(点在多边型内,多边型是否相交)
        (poj1408,poj1584)
    (4)凸包. (poj2187,poj1113)

我给你推荐一本书,我就是看了这本书而得到了很大的提升,就是数据结构与抽象JAVA版,我买的是2004年的第一版,还没有找到别的版的,里面基本上讲
的全是数据结构还有数据结构中实现的算法,非常好的一本教程,绝对精典。有很多数据结果与算法的书里讲了很多数学的算法那个对于我们来说基本上看不懂,而

算法这种东西 关键是你了解多少 而不是你会多少,所以学了忘记你也不用怕。
为了学算法而去学算法到头就是一场空,对自己算法没底的,建议先看下java中的各种工具容器的源码,查看
下java对算法是如何用的,然后再去查这些算法的优缺点,和大致流程。在以后用java工具容器的时候你能清楚的知道在什么地方用什么东西 这就足够了。java玩到后面对框架整体把握才是王道 算法都是拿来主义就行了。

常用的算法记住一些,不常用的算法经常看看,有时候是需要的时候才会去看一下算法方面的,因为有时候可以自己想着一些法子来做算法方面的编程,如果大家都
是一个样子出来的东西也就没什么创新的东西。创新能力才是最重要的能力。知识呈现爆炸型发展,不可能有那么多的精力去学习那么多东西的。如果真能记住那么

个人感觉,所谓程序算法,就是解决问题一种思路、想法。你了解一种算法,也只是了解了一种解决问题的思路,而更为重要的是你要把这种解决问题的思想融入自
己的思想,从而用这个思想来解决今后相似的问题。而在这个过程之中,需要的就是思考,要完整而全面地思考算法的思想与你原始思想之间的异同点,要完全消化
这种算法的思想。这就如小说中的人物,他再NB,也没有写小说的作者NB啊。
多的算法那也可以去记住,拿过来用就好了。
且用的也很少。

posted @ 2009-08-17 03:28 leekiang 阅读(848) | 评论 (1)编辑 收藏

        OracleCallableStatement cst = null;
        int oracleId = CharacterSet.ZHS16GBK_CHARSET;
        oracle.sql.CharacterSet dbCharset = oracle.sql.CharacterSet.make(oracleId);
            cst = (OracleCallableStatement) conn
                    .prepareCall("begin ?:= pkg_test.f_getList(?); end;");
//String sql = "{?=call PckgStudSltCourse.addStudPreSltCourse(?,?,?,?)}";也可以这样写
//sql="{call sp(?,?,?,?,?)}";//如果无返回值
            cst.registerOutParameter(1, OracleTypes.ARRAY, "T_ARRAY");//第一个问号表示返回结果
            cst.setString(2, userid);//第二个问号
            cst.executeUpdate();//哪怕是个查询也用executeUpdate

            oracle.sql.ARRAY simpleArray = cst.getARRAY(1);//从statement获取,而不是rs
            String[] values = (String[]) simpleArray.getArray();
            for (int i = 0; i < values.length; i++) {
                oracle.sql.CHAR out_value = new oracle.sql.CHAR(values[i],dbCharset);
                System.out.println(out_value.stringValue());
            }
            
注意:在new oracle.sql.CHAR处,可能会报
java.lang.NoClassDefFoundError: oracle/gss/util/NLSError
    at oracle.sql.CharacterSetUnknown.failCharsetUnknown(CharacterSetFactoryThin.java:178)
    at oracle.sql.CharacterSetUnknown.convert(CharacterSetFactoryThin.java:145)
    at oracle.sql.CHAR.(CHAR.java:147)
    即missing some jar file in runtime environment
    原因是weblogic没有加载web应用下的classes12.jar,而是加载了weblogic81\server\lib里的ojdbc14.jar,
    而ojdbc14.jar里没有oracle.gss.util.NLSError。
    修改classpath先加载classes12.jar,打印出来的是乱码,只出现乱码,这次没有出现类似这样的异常java.sql.SQLException:   Non   supported   character   set:   oracle-character-set-850  。
    还需要修改classpath先加载nls_charset12.jar;(必须这样,光放在web应用的lib下或光放在weblogic81\server\lib都
    不行,jar包放置或加载的这三种方式是有区别的)
问题:如果使用的是ojdbc.jar,我觉得可能就不要nls_charset12.jar了,并且不需要new oracle.sql.CHAR(values[i],dbCharset)来转换
    
http://topic.csdn.net/t/20051110/17/4385336.html
    类是通过类加载器classloader载入的。  
  缺省情况下web容器遵循java的标准标准类载入机制   --   由现载入父加载器level的类。  
  weblogic的web容器的classloader继承自ejb容器的classloader,ejb容器的classloader又继承自 application   classloader--该loader负责加载classpath下面的类,所以缺省情况下classpath下面的类会被优先载入,即使相同的类存在于web应用的lib目录。  
  可以通过配置文件来修改这种加载顺序,使得lib目录中的类得到优先调用,在weblogic   8.1中,方法是在weblogic.xml中加入下面的代码段:  
  <container-descriptor>  
  <prefer-web-inf-classes>true</prefer-web-inf-classes>  
  </container-descriptor>   
  weblogic   的加载顺序就是weblogic   classpath优先?
 
 
  一下见http://www.javaeye.com/topic/21141
  ClassNotFoundException发生在装入阶段。
当应用程序试图通过类的字符串名称,使用常规的三种方法装入类,但却找不到指定名称的类定义时就抛出该异常。

NoClassDefFoundError: 当目前执行的类已经编译,但是找不到它的定义时

也就是说你如果编译了一个类B,在类A中调用,编译完成以后,你又删除掉B,运行A的时候那么就会出现这个错误
当你使用字符串去转换类,也就是尝试使用Class.forName等方法去获得一个类的时候,如果这个类不存在,就会抛出ClassNotFoundException。
   而你编译的类无错,但是在运行时刻,缺乏某些必须的类时,就是抛出NoClassDefFoundError。这种情况最常见就是你在编译时,在classpath下有这个类,但是在运行时,你的classpath缺少这个类。
   
  加载时从外存储器找不到需要的class就出现ClassNotFoundException
  连接时从内存找不到需要的class就出现NoClassDefFoundError
  问题:加载和连接的区别

创建测试用表

CREATETABLE T_TEST(
I_ID
NVARCHAR(20),
I_NAME
NVARCHAR(20)
)

一:无返回值的存储过程

1、建立存储过程
CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) AS
BEGIN
   INSERT INTO T_TEST (I_ID,I_NAME) VALUES (PARA1, PARA2);
END TESTA;

2、相应的JAVA程序
import java.sql.*;
import java.io.OutputStream;
import java.io.Writer;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import oracle.jdbc.driver.*;
public class TestProcedureOne {
    public TestProcedureOne() {
      }
      public static void main(String[] args ){
        String driver = "oracle.jdbc.driver.OracleDriver";
        String strUrl = "jdbc:oracle:thin:@192.168.10.216:1521:ctbu";
        Statement stmt = null;
        ResultSet rs = null;
        Connection conn = null;
        CallableStatement cstmt = null;
        try {
          Class.forName(driver);
          conn = DriverManager.getConnection(strUrl, "dbname", "password");
          CallableStatement proc = null;
          proc = conn.prepareCall("{ call dbname.TESTA(?,?) }");
          proc.setString(1, "100");
          proc.setString(2, "TestOne");
          proc.execute();
        }
        catch (SQLException ex2) {
          ex2.printStackTrace();
        }
        catch (Exception ex2) {
          ex2.printStackTrace();
        }
        finally{
          try {
            if(rs != null){
              rs.close();
              if(stmt!=null){
                stmt.close();
              }
              if(conn!=null){
                conn.close();
              }
            }
          }
          catch (SQLException ex1) {
          }
        }
      }
    }

二:有返回值的存储过程(非列表)

1、存储过程为
CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2) AS
BEGIN
   SELECT INTO PARA2 FROM TESTTB WHERE I_ID= PARA1;
END TESTB;

2、JAVA代码
public class TestProcedureTWO {
public TestProcedureTWO() {
}
public static void main(String[] args ){
    String driver = "oracle.jdbc.driver.OracleDriver";
    String strUrl = "jdbc:oracle:thin:@192.168.10.216:1521:ctbu";
    Statement stmt = null;
    ResultSet rs = null;
    Connection conn = null;
    try {
      Class.forName(driver);
      conn = DriverManager.getConnection(strUrl, "dbname", "password");
      CallableStatement proc = null;
      proc = conn.prepareCall("{ call HYQ.TESTB(?,?) }");
      proc.setString(1, "100");
      proc.registerOutParameter(2, Types.VARCHAR);
      proc.execute();
      String testPrint = proc.getString(2);
      System.out.println("=testPrint=is="+testPrint);
    }
    catch (SQLException ex2) {
      ex2.printStackTrace();
    }
    catch (Exception ex2) {
      ex2.printStackTrace();
    }
    finally{
      try {
        if(rs != null){
          rs.close();
          if(stmt!=null){
            stmt.close();
          }
          if(conn!=null){
            conn.close();
          }
        }
      }
      catch (SQLException ex1) {
      }
    }
}
}
}
注意,这里的proc.getString(2)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是 proc.getString(1),如果是第三个位置,就是proc.getString(3),当然也可以同时有多个返回值,那就是再多加几个out 参数了。

三:返回列表
由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分。
1、在SQL*PLUS中建一个程序包

CREATE OR REPLACE PACKAGE TESTPACKAGE AS
TYPE Test_CURSOR IS REF CURSOR;
procedure TESTC(cur_ref out Test_CURSOR);
end TESTPACKAGE;

建立存储过程,存储过程为:
create or replace package body TESTPACKAGE as
procedure TESTC(cur_ref out Test_CURSOR) is
begin  
OPEN cur_ref FOR SELECT * FROM T_TEST;
end TESTC;
END TESTPACKAGE;
可以看到,它是把游标(可以理解为一个指针),作为一个out 参数来返回值的。
JAVA程序如下:

import java.sql.*;
import java.io.OutputStream;
import java.io.Writer;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import oracle.jdbc.driver.*;

public class TestProcedureOne {
    public TestProcedureOne() {
      }
      public static void main(String[] args ){
        String driver = "oracle.jdbc.driver.OracleDriver";
        String strUrl = "jdbc:oracle:thin:@192.168.10.216:1521:ctbu";
        Statement stmt = null;
        ResultSet rs = null;
        Connection conn = null;
        CallableStatement cstmt = null;
        try {
          Class.forName(driver);
          conn = DriverManager.getConnection(strUrl,"databasename" "password");
          CallableStatement proc = null;
          proc = conn.prepareCall("{ call cqsb.TESTA(?,?) }");
          proc.setString(1, "100");
          proc.setString(2, "TestOne");
          proc.execute();
        }
        catch (SQLException ex2) {
          ex2.printStackTrace();
        }
        catch (Exception ex2) {
          ex2.printStackTrace();
        }
        finally{
          try {
            if(rs != null){
              rs.close();
              if(stmt!=null){
                stmt.close();
              }
              if(conn!=null){
                conn.close();
              }
            }
          }
          catch (SQLException ex1) {
          }
        }
      }
    }

特别注意:
1、在执行前一定要先把oracle的驱动包放到class路径里。
2、Toad在我建立存储过程中搞了很多莫名的错误,多数是没有创建成功而不报错,
或者是创建有误而不提示,应当引起重视。所以最好还是在SQL*PLUS玩这些。
3、在SQL*PLUS中的换行是无效的,要换行的时候一定要空格结尾,特别是你直接复制代码的时候!


posted @ 2009-08-12 11:46 leekiang 阅读(1390) | 评论 (2)编辑 收藏

对这些东西都没什么整体概念,以下是东抄西抄的。

1,Select isspecified,count(*) from v$spparameter group by isspecified;
 如果isspecified里有true,表明用spfile进行了指定配置
 如果全为false,则表明用pfile启动

2,spfile是二进制的

3,http://snakeskin.javaeye.com/blog/155136
db_buffer_size=db_block_buffers*db_block_size, db_block_size为数据库默认值, 不要修改
pfile不要有SGA_TARGET这个参数, 也不要有db_cache_size这个参数, SGA_MAX_SIZE也不需要

1)创建pfile
SQL>create pfile from spfile
这样就在d:/oracle/product/10.1.0/db_1/database目录下面多1个文件INITorcl.ORA
或者copy d:/oracle/product/10.1.0/admin/orcl/pfile/init.ora.XXXXXXXX到上述目录, 名字改成INITorcl.ORA
init.ora.XXXX也是个pfile文件, 不妨试着用这个文件启动你的数据库
SQL>startup pfile='d:/oracle/product/10.1.0/admin/orcl/pfile/init.ora.XXXXXXXX'
特别是你改动参数导致数据库无法启动的情况下, 用这个文件恢复你的spfile将非常有用
SQL>create spfile from pfile='d:/oracle/product/10.1.0/admin/orcl/pfile/init.ora.XXXXXXXX'

2)修改pfile的内容
修改后主要内容为
sga_target=1700000000(1.7G左右)
lock_sga=true
pre_aggregate_tagert=250000000(250M左右)
workarea_size_policy=auto
pre_page_sga=true
sga_max_size=1720000000(1.72G左右)

3)根据pfile启动数据库
SQL>startup pfile='d:/oracle/product/10.1.0/db_1/database/INITorcl.ORA'
如果不能启动, 可能是某些参数的原因, 那么就修改INIToracl.ORA的配置文件, 直到能正常启动为止.

4,http://www.orafaq.com/node/5

What is the difference between a PFILE and SPFILE:

A PFILE is a static, client-side text file that must be updated with a standard text editor like "notepad" or "vi". This file normally reside on the server, however, you need a local copy if you want to start Oracle from a remote machine. DBA's commonly refer to this file as the INIT.ORA file.

An SPFILE (Server Parameter File), on the other hand, is a persistent server-side binary file that can only be modified with the "ALTER SYSTEM SET" command. This means you no longer need a local copy of the pfile to start the database from a remote machine. Editing an SPFILE will corrupt it, and you will not be able to start your database anymore.

5,怎样查看一个参数修改是否需要重启数据库

select name,value ,ISSYS_MODIFIABLE from v$parameter
如果ISSYS_MODIFIABLE 返回的是false,说明该参数无法用alter system语句动态修改,需要重启数据库


6,用命令修改参数

alter system set java_pool_size=2 scope=spfile ;

scope=spfile 的修改是需要重启数据库
scope=both 实时生效和写入spfile,不需要重启数据库
scope=memory 实时生效,但不写spfile,这样如果重启数据库,则恢复原来的参数值

每个参数能修改的scope是不一样的,可以查询v$parameter了解参数能被修改的类型

见http://bbs.chinaunix.net/archiver/?tid-974075.html

10,

http://www.cnblogs.com/jacktu/archive/2008/02/27/1083232.html

http://topic.csdn.net/u/20090227/16/fb3d88ed-f2ca-44ed-8097-dc363054515c.html


posted @ 2009-07-31 00:19 leekiang 阅读(692) | 评论 (0)编辑 收藏


参见:
http://www.d9soft.com/article/353/Article25047_1.htm
http://topic.csdn.net/u/20070719/09/13f24bd3-5fc4-43dc-b1e4-5475718031b4.html

posted @ 2009-07-31 00:08 leekiang 阅读(2112) | 评论 (0)编辑 收藏

1,摘自http://www.javaeye.com/topic/13335
Oracle9iR2和Oracle10G以上版本已经可以直接进行clob的插入,条件查询,模糊查询了。这一点,你可以试一试,我这周周一刚刚在 Oracle10.1.0.3 Linux x86上面试过,不管是where还是like,就像varchar2一样处理。
另外将Oracle JDBC Driver升级到最新的版本,即Oracle10.1.0版本同时发布的odjbc14.jar,那么你将直接可以对clob进行操作。
也就是说,如果你使用最新的Oracle JDBC Driver,使用比较新的Oracle版本,你就可以直接像操作varchar2那样操作clob,没有任何限制了。
4000字符的限制完全是因为Oracle的Thin Driver造成的,用OCI Driver是不会有这个问题的。也就是说,这个限制与驱动相关与数据库无关。
我试过使用10g的驱动跑9i的数据库,操作CLOB字段就和操作varchar2一样,并且没有4000的限制。一换成9i的Driver就错误依旧。。。8i的没有测试过,不过原理应该一样。
像Robbin说的那样,我用的是最新的最新的Oracle Database 10g (10.1.0.2.0) 驱动程序,数据库是Release 9.2.0.1.0 ,插入一条10万多字符的数据到clob类型的字段,抛出异常:Caused by: java.sql.SQLException: setString 只能处理少于 32766 个字符的字符串。我试了多次,还是无法解决。
Robbin说的没错,我试过了在xxx.hbm.xml中将数据库中Clob类型的字段映射成Hibernate的text类型,没有任何限制,但是映射成java.lang.String类型却有32K大小的限制。
oracle 10g 的驱动的确好
thin driver 也能顺利按照 String 方式处理 Clob 字段,可以适用于 8.16 以后的所有版本
映射成text在同一列中有多个clob字段的时候有bug,
保存时会将后一个字段的内容保存到前一个字段里面去,不知道什么原因,我实在有些莫名其妙。
换成spring的ClobStringType后一切正常
经测试,使用 Oracle 10g 的 JDBC 驱动,可以把 LONG 类型的字段当成超长的 VARCHAR2 类型字段看待。
注意:数据库中应该使用 LONG 型,而不是 CLOB 类型。使用 CLOB 类型,如果有中文,会莫名其妙的丢掉一些字符。这应该是 Oracle 的一个 bug。
适用于 Oracle 9.2 以上版本的数据库。(注意仅仅是使用 10g 的 JDBC 驱动而已,即 ojdbc14.jar 包)

参考:
* Oracle JDBC 驱动下载地址 http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html
* Handling CLOBs - Made easy with Oracle JDBC 10g http://www.oracle.com/technology/sample_code/tech/java/codesnippet/jdbc/clob10g/handlingclobsinoraclejdbc10g.html

posted @ 2009-07-31 00:05 leekiang 阅读(912) | 评论 (0)编辑 收藏

1,
oracle10g装了几个实例,就会在service里看到多个OracleService,同时有多个OracleDBConsole,
只有OracleDBConsole起来了,才能访问http://127.0.0.1:1158/em,
那么如何知道每一个em的http端口呢?
有人说在oracle\product\10.2.0\db_1\sysman\config\emca.properties,
看了一下只有默认端口DBCONTROL_HTTP_PORT_DEFAULT为1158
后来在oracle\product\10.2.0\db_1\install\install\portlist.ini里
发现了每一个实例的Enterprise Manager Console HTTP 端口

posted @ 2009-07-30 16:41 leekiang 阅读(243) | 评论 (0)编辑 收藏

这个startup.bat脚本就是提供给使用者用来修改的,我们可以在其中设置JAVA_HOMECATALINA_HOME等环境变量,但我们并不需要深入到较为复杂的catalina.bat脚本中,这正是startup.bat脚本的真正用意所在。我们知道,软件设计模式中有一个重要的原则就是开闭原则,即我们可以允许别人扩展我们的程序,但在程序发布后,我们拒绝任何修改,因为修改会产生新的Bug,使得我们已经Bug-free的程序又要重新测试。开闭原则是面向对象世界中的一个非常重要的原则,我们可以把这个原则从Java类扩展至源代码级别。startup脚本就是要求用户不要修改catalina.bat脚本,这是符合软件设计思想的。我们如果想要彻底贯彻这个重要的软件设计原则,可以写一个新脚本tomcat.bat,脚本内容大致如下:

set JAVA_HOME=C:\Program Files\Java\jdk1.5.0_09
set CATALINA_HOME=C:\carl\it\tomcat_research\jakarta-tomcat-5.0.28
call %CATALINA_HOME%\bin\startup.bat

这个tomcat.bat文件可以存放在任何目录并能执行,并且不需要修改tomcat自带的任何脚本及其它环境变量,这就彻底贯彻了开闭原则。

浅析Tomcat的启动 http://www.56base.com/blog/u/evian/archives/2008/118.html

posted @ 2009-07-30 13:57 leekiang 阅读(268) | 评论 (0)编辑 收藏

前几天做项目的过程中,利用到Apache项目中的POI来实现基于Excel的数据模板输出,其中利用公式的方式嵌入超链接进行网页链接访问。  
  自己做了一些处理EXCEL单元格的方法,但在进行公式处理时,由于POI的问题,显示的公式信息一直都是乱码,后来在网上找到一些朋友关于这些问题的解 决方法,感觉帮助很大。因此,结合自己的实践经验,把修改POI内部源码的过程写出来,以其对资料做一整理,希望对后来的朋友也有所帮助。  
   
  1、首先,上网找到POI的发布版本的源码,我下的是poi-src-2.5.1-final-20040804.zip这个版本。  
  2、找到StringPtg.java这个文件,在解压后的\src\java\org\apache\poi\hssf\record\formula文件夹下面  
  3、利用文本编辑工具对StringPtg.java进行编辑  
  4、找到public   StringPtg(byte   []   data,   int   offset)这个方法,  
  对其修改如下  
  /**   Create   a   StringPtg   from   a   byte   array   read   from   disk   */  
          public   StringPtg(byte   []   data,   int   offset)  
          {  
                  offset++;  
                  field_1_length   =   data[offset];  
                  field_2_options   =   data[offset+1];  
                  if   (fHighByte.isSet(field_2_options))   {  
                          //   modified   by   rainsoft    
                          //   in   excel   chinese   is   stored   two   bytes   HIGH   bytes,LOW   bytes  
                          //   field_3_string=   StringUtil.getFromUnicode(data,offset+2,field_1_length);  
                          field_3_string=   StringUtil.getFromUnicodeHigh(data,offset+2,field_1_length);  
                  }else   {  
                          field_3_string=StringUtil.getFromCompressedUnicode(data,offset+2,field_1_length);  
                  }  
                                     
                  //setValue(new   String(data,   offset+3,   data[offset+1]   +   256*data[offset+2]));  
          }  
  其中主要利用getFromUnicodeHigh方法替换原有的方法进行处理。  
  5、再查找StringPtg(String   value),做如下的修改,  
   
  public   StringPtg(String   value)   {  
                  if   (value.length()   >255)   {  
                          throw   new   IllegalArgumentException("String   literals   in   formulas   cant   be   bigger   than   255   characters   ASCII");  
                  }  
                  this.field_2_options=0;  
                  //   add   by   rainsoft  
                  //   two   bytes   char   options   must   be   "1"              
                  try   {  
                      if   (value.length()!=value.getBytes("GBK").length)  
                          this.field_2_options=1;  
                  }   catch   (Exception   e)   {  
                  }  
                  //   end   add  
                  this.fHighByte.setBoolean(field_2_options,   false);  
                  this.field_3_string=value;  
                  this.field_1_length=(byte)value.length();   //for   the   moment,   we   support   only   ASCII   strings   in   formulas   we   create  
          }  
   
  6、至此对源文件的修改就结束了,下一步则需要对其进行编译输出。  
  7、利用docs/howtobuild.html的描述进行编译输出。  
  8、成功编译输出的POI???????.jar文件,复制到原有的编译路径,替换到原有的文件即可,最好删除原有的   POI文件。 
http://topic.csdn.net/t/20060309/10/4602637.html

posted @ 2009-07-29 15:59 leekiang 阅读(1340) | 评论 (0)编辑 收藏

http://bbs.blueidea.com/archiver/tid-2938030.html
http://tagsoup.com/cookbook/css/fixed/
http://bbs.51js.com/viewthread.php?tid=84761
http://www.happinesz.cn/archives/991/
网易论坛、凤凰论坛

posted @ 2009-07-23 15:16 leekiang 阅读(205) | 评论 (0)编辑 收藏

喜欢使用Firefox的朋友,一定安装了许多插件来丰富浏览器的使用体验。但是每当重新安装Firefox浏览器后,原先安装的插件全都需要重新 安装,浪费了不少的时间。今天就介绍如何备份Firefox的方法,以后每次重装完,只要恢复一下就能还原以前的Firefox配置便可,非常方便。

Firefox浏览器的配置都被保存在下面的几个文件夹下,其实方法十分简单,只要把下面的目录备份了,再次安装Firefox之后,将这几个文件夹覆盖就可以还原以前的配置了。
  c:\Documents and Settings\用户名\Application Data\Mozilla\Firefox
  C:\Documents and Settings\用户名\Local Settings\Application Data\Mozilla\Firefox

http://meilanzh.blogspot.com/2009/02/firefox.html

一、还原书签:
不知什么原因,突然firefow不能访问了,只好卸载后重装。按照下列步骤恢复书签。
第一步:先将C:\Documents and Settings\用户名\Application Data\Mozilla\Firefox\Profiles文件进行复制。
第二步:卸载firefox。
第三步:重装firefox。
第四步:将profiles复制到原来位置。此时打开firefox,可以发现原来的书签并未恢复。
第五步:按下shift+ctr+b键, 打开书签管理器。或直接点击书签菜单下的“管理书签”。
第六步:点击“导入以及备份/恢复/选择文件”,找到bookmarkbackups文件夹:C:\Documents and Settings\用户名\Application Data\Mozilla\Firefox\Profiles\XXXXXXXXX.default\bookmarkbackups。
第七步:选择某日备份的书签文件,如:bookmark-2009-01-31.json。点击完成导入。
这时,再次打开firefox,就可以看到原来的书签了。

二、还原插件
将复制下来的profiles\extentensions\下的文件粘贴在安装目录下C:\Program Files\Firefox Plus\App\firefox\extensions里。打开firefox,就可以看到原来的firefox了!

posted @ 2009-07-23 13:30 leekiang 阅读(1270) | 评论 (0)编辑 收藏

[org.hibernate.event.def.AbstractFlushingEventListener] - Could not synchronize database state with session
org.hibernate.HibernateException: Unexpected row count: 0 expected: 1
    at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:32)

    先用对象操作得到Person p = get(Person.class,35);
    直连得到connection,执行delete person where id=35
    
    事务提交前hibernate会对对象进行检查,看属性是否有变化,如果有变化就会执行update操作。
    事务方法内既有对象操作,又有sql时,往往sql先执行,
    id=35的记录已经被删了,再执行update 35时就会报那个臭名昭著的HibernateException: Unexpected row count: 0 expected: 1,不能同步数据库状态
    为什么有的记录删除时会update,有的却没有?开始一直没找到原因,因为update语句太长了,
    后来灵机一动,在映射里加了dynamic-update="true",update语句变成了可爱的update Person set zd=? where ID=?
    一查AbstractPerson,发现getZd()被修改了:
        public String getZd() {
        if (zd != null)
            return zd;
        else
            return "";
       }
    这样凡是zd为null的记录,删除时都会报错。
    
    总结:(1)HQL和sql共用时要小心,一不小心就出现数据不同步,有空看看事务的处理
          (2)映射的类里的get方法不要随便修改

posted @ 2009-07-22 11:13 leekiang 阅读(2435) | 评论 (0)编辑 收藏

Ajax的应用中,由于安全的问题,浏览器默认是不支持跨域调用的。传统解决的方法,包括:(参考http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/)

Local proxy:
Needs infrastructure (can't run a serverless client) and you get double-taxed on bandwidth and latency (remote - proxy - client).
Flash:
Remote host needs to deploy a crossdomain.xml file, Flash is relatively proprietary and opaque to use, requires learning a one-off moving target programming langage.
Script tag:
Difficult to know when the content is available, no standard methodology, can be considered a "security risk".

以上方法都各有缺陷,都不是很好多解决方案。后来出现了一种叫JSON with Padding 的技术,简称 JSONP .(原理参考http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/),应 用JSONP可以实现JSON数据的跨域调用。非常的幸运,JQuery1.2以后支持JSONP的应用。下面侧重说明在JQuery中,Json的跨域 调用。

      应用JSONP实现Json数据跨域调用,需要服务器端与客户端的合作完成。引用Jquery官方的例子,客户端掉用如下:

$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?",
function(data){
$.each(data.items, function(i,item){
$("<img/>").attr("src", item.media.m).appendTo("#images");
if ( i == 3 ) return false;
});
});

 

    注意这里调用的地址中jsoncallback=?是关键的所在!其中,符号会被Query自动替换成其他的回调方法的名称,具体过程和原理我们这里不理 会。我们关心的是jsoncallback=?起什么作用了?原来jsoncallback=?被替换后,会把方法名称传给服务器。我们在服务器端要做什 么工作呢?服务器要接受参数jsoncallback,然后把jsoncallback的值作为JSON数据方法名称返回,比如服务器是JSP,我们会这 样做:

 

      ...

      String jsoncallback=request.getParameter("jsoncallback");

      ...

      out.print(jsoncallback+"({\"account\":\"XX\",\"passed\":\"true\",\"error\":\"null\"})");

 

Jquery取得的数据可能如下:

      JQUET0988788({"account":"XX","passed":"true","error":"null"})

 

总结,用JSONP要做两件事:

      1/请求地址加参数:jsoncallback=?

      2/服务器段把jsoncallback的值作为方法名传回来,如JQUET098788(...)

参考:

http://www.javaeye.com/topic/169765

http://www.javaeye.com/topic/260647

posted @ 2009-07-19 01:48 leekiang 阅读(2322) | 评论 (0)编辑 收藏

父类(Father)如果定义了一个静态方法,如:
protected synchronized static void echo(String str) throws Exception
{     
        System.out.println(str);
        Thread.sleep(10000);
}
Son和Daughter继承了父类,在两个线程里面相继调用Son.echo();和Daughte.echo.会发现后调用的要等到先调用的完后才能调用,所以echo方法并不是真正的被子类继承了,它们用的还是Father的方法。
如果把静态方法改称非静态的,用new出来的对象调用则不会出现上述情况。

static方法不能被override,而不是不能继承.

如果Son类里有个同样的echo方法,
然后Father p= new Son();p.echo();此时实际调用的是Father的,注意这与非静态方法不一样。

如何调用父类的静态私有方法?
private static boolean test(String s) thows Exception
    {
      Class c 
= Test.class;
      Method m;
      Object ret 
= null;
      m = c.getDeclaredMethod("test", new Class[] { String.class});
      m.setAccessible(
true);//必须加
      ret 
= m.invoke(nullnew Object[] { s });//第一个参数必须为null
     
return ((Boolean) ret).booleanValue();
    }


再来一个例子:

public class Father {
    
private static String n = "";
    
public static void name() {
        n 
= "father";
    }
    
public static String getN() {
        
return n;
    }
}

public class Son extends Father {
    
private static String n = "";
    
public static String getN() {
        
return n;
    }
    
public static void name() {
        
//Father.name();
        n="son";
    }
}

public class TestStatic {
    
public static void main(String[] args) {
        Son.name();  
        System.out.println(Father.getN()
+"-"+Son.getN());
    }
}
如果Son没有name()方法或者name()方法里是"Father.name();",则输出是"father-"
如果Son的name()方法有自己的实现(见上面代码),则输出"-son"。


参考:
http://bbs.chinaunix.net/archiver/?tid-583540.html
http://www.blogjava.net/jiangmin/articles/69386.html
http://www.blogjava.net/forgood/archive/2009/01/11/250870.html

posted @ 2009-07-16 23:12 leekiang 阅读(2071) | 评论 (1)编辑 收藏

				
						
								
如果引入jquery后再引入
Scriptaculous的effects.js,就可能出现莫名其妙的问题。
jQuery("#id")正常,但类似于jQuery("name='test'")之类的查询就会出错。
原因是旧版本(1.5.1)的effects.js里有代码污染了Array的call方法
Array.prototype.call = function() {
  
var args = arguments;
  
this.each(function(f){ f.apply(this, args) });
}

参考一
参考二
http://www.javaeye.com/topic/84683
http://www.javaeye.com/topic/184859

posted @ 2009-06-11 14:50 leekiang 阅读(352) | 评论 (0)编辑 收藏

jeval http://www.javagg.com/diary/67916522
http://gao-20022002.javaeye.com/blog/269459
http://wangxiaojs.javaeye.com/blog/291700
http://www.javaeye.com/topic/15346?page=1
http://www.javaeye.com/topic/156735

posted @ 2009-05-31 22:42 leekiang 阅读(265) | 评论 (0)编辑 收藏

Oracle回滚段概念用法规划及问题解决
http://bbs.zdnet.com.cn/archiver/tid-127193.html

posted @ 2009-05-29 21:44 leekiang 阅读(214) | 评论 (0)编辑 收藏

http://cwiki.apache.org/WICKET/acegi-and-wicket-auth-roles.html
http://databinder.net/site/show/overview

和sh的整合
http://www.javaworld.com.tw/roller/ingramchen/entry/2006_2_17_sample_wicket_hibernate_spring_application

http://www.nabble.com/integration-Spring-Wicket-Hibernate-problem-with-injection-bean-td19462602.html

Enjoying Web Development with Wicket
http://wicketinaction.com/
pro wicket
http://www.onehippo.org/cms7/delve_into/quickstart.html

http://www.blogjava.net/killme2008/archive/2007/05/22/119149.html
http://www.ibm.com/developerworks/cn/opensource/os-tapestrywicket/
http://www.netbeans.org/kb/60/web/quickstart-webapps-wicket_zh_CN.html

开源项目:hippocms

wicket+jquery  http://www.wickext.org

WiQuery results from the merge of two projects, WickeXt and jQuery4Wicket

http://wicketstuff.org

http://www.javalobby.org/java/forums/t68753.html

为什么是Wicket?

http://stuq.nl/weblog/2008-09-03/user-friendly-form-validation-with-wicket
http://stuq.nl/weblog/2008-06-05/wicket-how-to-write-a-reusable-modal-window-popup

Wicket RAD 0.6 released



其他框架
dorado,click,echo2,tapestry,OpenJWeb ,easyjweb ,rapid-framework,rife,trails
http://www.metadmin.com 权限

posted @ 2009-05-23 22:12 leekiang 阅读(481) | 评论 (0)编辑 收藏

watiR
http://www.51testing.com/html/11/n-11611.html
http://www.51testing.com/html/57/1872.html


使用iTest2重构自动化功能测试脚本

众所周知,自动测试脚本很难维护。随着敏捷方法学在企业软件项目中的广泛应用,其核心实践之一——自动化功能测试已经证明了它的价值,同时却也对项目提出 了挑战。传统的“录制-回播”类型的测试工具也许能帮助测试人员很快地创建一系列的测试脚本,但这些测试代码最后却很难维护。原因就是:应用程序在不断变化。
Test2 IDE是一款新的功能测试工具,专为测试人员设计,让他们能够很轻松地开发和维护自动测试脚本。iTest2完全致力于web测试的自动化,它支持的测试框架是使用RSpec语法的rWebUnit(是广为流行的Watir的一款开源插件)。iTest2背后的哲学是:容易、简单。试用显示:没有编程经验的测试人员在指导下,平均只需要少于10分钟的时间就能编写他们第一个自动化测试脚 本。借助于iTest2,测试人员可以开发、维护和验证功能需求的测试脚本;开发人员可以验证特性可用;业务分析师/客户通过查看测试运行结果(在真实的 浏览器下,比如IE或者Firefox)来验证功能需求。由iTest2创建的测试脚本可以从命令行运行,也能集成在持续构建服务器上。

感觉selenium不如watiJ好用,为什么要单启一个服务器呢
selenium和WebDriver有何关系

posted @ 2009-05-23 19:05 leekiang 阅读(281) | 评论 (0)编辑 收藏

OpenJWeb

nutz http://code.google.com/p/nutz/

liveflow


http://java-source.net

http://www.jspresso.org   Wings


posted @ 2009-05-22 22:09 leekiang 阅读(176) | 评论 (0)编辑 收藏

1,create table tbA as select * from tbB
  这样会丢失索引等信息

2,生成10万条测试记录表可以用如下SQL:
 create table myTestTable as
select rownum as id,
               to_char(sysdate + rownum/24/3600, 'yyyy-mm-dd hh24:mi:ss') as inc_datetime,
               trunc(dbms_random.value(0, 100)) as random_id,
               dbms_random.string('x', 20) random_string
          from dual
        connect by level <= 100000;
来源:http://blog.csdn.net/yzsind/archive/2009/12/08/4967133.aspx

posted @ 2009-05-12 22:26 leekiang 阅读(262) | 评论 (0)编辑 收藏

1,从excel中取得的数字要么带".0",要么是1.33E8之类,用NumberFormat搞定
       String value = "";
        if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
            double d = cell.getNumericCellValue();
            NumberFormat formatter = NumberFormat.getNumberInstance();
            formatter.setGroupingUsed(false);
            value = formatter.format(d);

        } else if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
            value = cell.getStringCellValue();
        }
      
2,     String s="3,4,5,6,";
        System.out.println(s.split(",").length);
      输出4,我记得以前的输出好像是5?


3, 以正常的方式显示double数字的值,好像比较困难。
public String double2String(double d, int fNumber) {
        if (fNumber < 0)
            fNumber = 0;

        String pattern = null;
        switch (fNumber) {
        case 0:
            pattern = "#0"; //$NON-NLS-1$
            break;
        default:
            pattern = "#0."; //$NON-NLS-1$
            StringBuffer b = new StringBuffer(pattern);
            for (int i = 0; i < fNumber; i++) {
                b.append('#');
            }
            pattern = b.toString();
            break;

        }
        DecimalFormat formatter = new DecimalFormat();
        formatter.applyPattern(pattern);
        String value = formatter.format(d);
        return value;
    }


public String SicenToComm(double value) { 
         String retValue = null; 
         NumberFormat fmt= NumberFormat.getNumberInstance();
         //DecimalFormat fmt= new DecimalFormat();  //效果一样
         fmt.setMinimumFractionDigits(5);  //
         fmt.setMaximumFractionDigits(5);  //什么意思
         retValue = fmt.format(value); 
         System.out.println(retValue); 
         retValue = retValue.replaceAll(",","");  //去掉逗号
         return retValue; 
     }
以上两种方式都不能全部显示543854839493943.4533656这样的数

posted @ 2009-04-27 00:02 leekiang 阅读(396) | 评论 (0)编辑 收藏

JVM是Java程序的运行环境,因此对于JVM的掌握有助于理解Java程序的执行以及编写,尤其是运行时碰到的一些诡异问题,那么怎么样能考察自己对于JVM关键知识点的掌握情况,帮助学习JVM机制呢,在这篇blog中来探讨下。

对于Java程序而言,JVM的关键机制有:字节码的加载、方法的执行、对象内存的分配和回收、线程和锁机制,这几个机制涉及到的jvm的知识点远没有写这几个字这么简单,里面的复杂度还是非常高的。

字节码的加载
JVM通过ClassLoader来完成字节码的动态加载,这里面涉及到的主要是ClassLoader的双亲委派、ClassLoader的编写方法、Class是否被加载的唯一标识以及Class的加载过程。
在考察的时候我觉得可以以这么两道简单的题来考察:
1、写一段将目录中指定的.class文件加载到JVM的程序,并通过Class对象获取到完整类名等信息;
2、一段展示代码,里面包含一个全局静态整型变量,问如果用两个ClassLoader加载此对象,执行这个整型变量++操作后结果会是怎么样的?

方法的执行
JVM有自己的一套指令系统,字节码中即已经是指令了,需要大概掌握了JVM对static、interface、instance、构造器采用的不同的 执行方法,另外就是JVM中反射的实现(可以以Sun JDK来举例)、动态代理的实现,最后相关的就是JVM执行字节码的方式(解释、JIT、Hotspot),以及什么时候触发编译成机器码,如何控制。
在考察的时候我觉得可以以这么三道题来考察:
1、A a=new A();a.execute();和IA a=new A();a.execute();执行有什么不同;
2、反射的性能低的原因是?
3、编写一段程序,动态的创建一个接口的实现,并加载到JVM中执行;(可以允许用BCEL等工具)

对象内存的分配和回收
这块涉及的知识点也是比较的多,例如JVM内存区域的划分、自然类型和引用类型的内存分配的不同、TLAB、GC的算法、Sun JDK对于GC的实现、GC触发的时机、GC的跟踪和分析的方法。
在考察的时候我觉得可以以这么三道题来考察:
1、经典的String比较程序题:
   String a="a";
   String b="b";
   String ab="ab";
   (a+b)==ab;  ??  (引深题,如何才能让(a+b)==ab)
   ("a"+"b")==ab; ?? 
2、写一段程序,让其OutOfMemory,或频繁执行Minor GC,但又不触发Full GC,又或频繁执行Full GC,但不执行minor GC,而且不OutOfMemory,甚至可以是控制几次Minor GC后发生一次Full GC;
3、详细讲解GC的实现,例如minor GC的时候导致是怎么回收对象内存的,Full GC的时候是怎么回收对象内存的。

线程和锁机制
这块涉及的知识点仍然是非常的多,例如线程中变量的操作机制、线程调度机制、线程的状态以及控制方法、线程的跟踪和分析方法、同步关键字、lock/unlock的原理等。
在考察的时候我觉得可以以这么几道题考察下:
1、i++的执行过程;
2、一个线程需要等待另外一个线程将某变量置为true才继续执行,如何编写这段程序,或者如何控制多个线程共同启动等;
3、控制线程状态的转换的方法,或者给几个thread dump,分析下哪个线程有问题,问题出在哪;
4、static属性加锁、全局变量属性加锁、方法加锁的不同点?
转自http://www.blogjava.net/BlueDavy/

posted @ 2009-03-27 21:23 leekiang 阅读(209) | 评论 (0)编辑 收藏

OSI是一个开放性的通行系统互连参考模型,他是一个定义的非常好的协议规范。OSI模型有7层结构,每层都可以有几个子层。
OSI七层模型是一个很好的理论模型,但是在实际应用中都做了裁剪。尤其是TCP/IP的盛行,把7层结构压成了4层,
所以很多人都批评OSI七层模型过于复杂,但是作为一个完整的全面的网络模型,还是被大家非常认可的。OSI的7层从上到下分别是应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
7层的功能描述:
(1) 应用层:与其他计算机进行通讯的一个应用,它是对应应用程序的通信服务的。例如,一个没有通信功能的字处理程序就不能执行通信的代码,从事字处理工作的程 序员也不关心OSI的第7层。但是,如果添加了一个传输文件的选项,那么字处理器的程序员就需要实现OSI的第7层。示 例:telnet,HTTP,FTP,WWW,NFS,SMTP等。
(2)表示层:这一层的主要功能是定义数据格式及加密。例如,FTP允许 你选择以二进制或ASII格式传输。如果选择二进制,那么发送方和接收方不改变文件的内容。如果选择ASII格式,发送方将把文本从发送方的字符集转换成 标准的ASII后发送数据。在接收方将标准的ASII转换成接收方计算机的字符集。示例:加密,ASII等。
(3)会话层:他定义了如何开始、控制和结束一个会话,包括对多个双向小时的控制和管理,以便在只完成连续消息的一部分时可以通知应用,从而使表示层看到的数据是连续的,在某些情况下,如果表示层收到了所有的数据,则用数据代表表示层。示例:RPC,SQL等。
(4)传输层:这层的功能包括是否选择差错恢复协议还是无差错恢复协议,及在同一主机上对不同应用的数据流的输入进行复用,还包括对收到的顺序不对的数据包的重新排序功能。示例:TCP,UDP,SPX。
(5)网络层:这层对端到端的包传输进行定义,他定义了能够标识所有结点的逻辑地址,还定义了路由实现的方式和学习的方式。为了适应最大传输单元长度小于包长度的传输介质,网络层还定义了如何将一个包分解成更小的包的分段方法。示例:IP,IPX等。
(6)数据链路层:他定义了在单个链路上如何传输数据。这些协议与被讨论的歌种介质有关。示例:ATM,FDDI等。
(7)物理层:OSI的物理层规范是有关传输介质的特性标准,这些规范通常也参考了其他组织制定的标准。连接头、针、针的使用、电流、电流、编码及光调制等都属于各种物理层规范中的内容。物理层常用多个规范完成对所有细节的定义。示例:Rj45,802.3等。
来源:http://blog.csdn.net/wanghao72214/archive/2009/03/18/4000806.aspx

posted @ 2009-03-22 18:31 leekiang 阅读(286) | 评论 (0)编辑 收藏

PKI是解决开放式互联网络信息安全需求的成熟体系。PKI体系支持身份认证,信息传输、存储的完整性,消息传输、存储的机密性,以及操作的不可否认性。



一个用jsp开发的web应用,使用了session作为sigle sign on的实现。在用firefox浏览时没有问题,用IE 6浏览时刚开始也可以,点过几次后就会出现session lost的错误。

检 查发现IE6浏览时,web服务器端日志记下的sissionid变了。由于sessionid一般存在于cookie,推测是IE的cookie机制导 致的问题。考虑到这个应用使用了frameset,参考文章:http://support.microsoft.com /default.aspx?scid=KB;EN-US;Q323752

在frameset里面,也就是里面的frame是来自第三方 站点(不同IP或不同域名),那么默认情况下IE会自动禁用这些站点的cookie,也就是 在请求某url时在HTTP header里不发送它们的cookie,包括session的cookie。注意,这些站点在response里面设置的cookie还是会被发送到浏 览器的。

那么,解决的办法,自然是对frame里面的第三方站点的response header里面添加一个确认信息,在MSDN里面有个最简单的解决办法:response.addHeader("P3P","CP=CAO PSA OUR")。response.setHeader("P3P","CP=CAO PSA OUR");

最简单的办法,是用一个filter,对所有路径下的uri,都设置response.setHeader("P3P","CP=CAO PSA OUR")。

上面是microsoft提供的办法,以下是likebao的办法:tomcat关闭cookies,用URL重写传递sessionid。

1.tomcat关闭cookies,强制使用URL Rewriting

增加E:\jakarta-tomcat-5.0.28\conf\Catalina\localhost\XXApp.xml

内容如下:

<Context path="/XXApp" docBase="${catalina.home}/webapps/XXApp"
        debug="0" privileged="true" cookies="false">
</Context>

2.URL重写传递seesionid

    <%

            String sid=session.getid();

             response.redirect("xxxx123.jsp;jsessionid="+sid);

    %>

p3p是微软的隐私策略,通常情况下跨域iframe或者frameset默认采用的隐私策略为“中”,该级别的策略拒绝保留session。CAO PSA OUR则意味着你同意跨域保留session,但是也意味着你的网站不再安全。

posted @ 2009-03-18 02:35 leekiang 阅读(332) | 评论 (0)编辑 收藏

1,网上资源
http://groups.google.com.hk/group/grailsunion
http://grails.group.javaeye.com/

2,grails知名应用
 grailsflow
 grailsblog
http://www.grails.org/OpenSource+Projects
   http://code.google.com/p/grailsblog http://www.grailsblog.com
 http://code.google.com/p/grails-domain-uml/
http://code.google.com/p/grails-petstore
http://code.google.com/p/ket-framework/
http://code.google.com/p/grailsmda
http://code.google.com/p/6footplus/
http://code.google.com/p/grum/
http://code.google.com/p/groovyblogs
http://code.google.com/p/simpejob
http://code.google.com/p/biz-portal
http://code.google.com/p/grailsportal
http://svn.codehaus.org/grails/trunk/grails-samples/grails.org/
http://www.grailsdeveloper.com/blog/2008/09/a-lot-of-grails-sample-applications-grails-open-source-projects/

3,工具
  grails文档里说没有自带功能测试,但支持Canoo WebTest

4,网站
  http://www.grailsjobs.com/

4,好文章
  ibm网站有一系列Mastering Grails文章,非常棒。主题有 Testing your Grails application, Grails in the enterprise,Asynchronous Grails with JSON and Ajax等十来个。
  http://www.ibm.com/developerworks/views/java/libraryview.jsp?search_by=mastering+grails
  http://www.ibm.com/developerworks/java/library/j-grails10148/index.html
 
  SiteMesh学习入门

GRAILS对于我这样的所谓老Java程序员来说,上手还是挺容易的,所谓最难掌握的闭包概念,我认为可以简单的认为是以前的匿名类+委托(当然 还有很多其他的好处)。GRAILS给控制器划分了一个Service层,在业务逻辑重用上,比RAILS做的更好。GRAILS相对没有太多的单复数规 约,相对RAILS的“约定”要简单很多。GRAILS目前没有RAILS那么强大的路由功能,不过反而可以带来的相对简单。

言归正传,其实我这里不是准备比较两个框架的优劣,而是想分享一下GRAILS多对多查询的一些经验。关于GRAILS本身还有GROOVY,我建议大家可以看看这里

GRAILS使用Hibernate作为ORM的基础。方便的同时也带来一些复杂,比如多对多查询。假设我有两个领域模型(其实就是rails里面的model,不过Java的东西嘛,总是比较学术化)

class Product {
static hasMany=[scenario:Scenario]
static belongsTo=Scenario
}
class Scenario{
static hasMany=[product:Product
]
}

如果我要查询Product中,所属scenario在scenario表中的id为1,可以通过如下的方法查询:

def scenario=Scenario.get(1)
return scenario? Product.findAll("from Product p where :scenario in elements(p.scenario)",[scenario:scenario]):[]
来源:http://www.leesoft.com.cn/2009/04/12/grails%E5%A4%9A%E5%AF%B9%E5%A4%9A%E7%9A%84%E6%9F%A5%E8%AF%A2%E6%9E%84%E9%80%A0/

http://rainboyan.com/post/use_groovy_tables_to_doc.html
可以通过Scriptom(现在还是beta版)嵌入vbs、js脚本(包括使用WSH,FSO)或者调用InternetExplorer、Media Player、Word和Excel等windows组件

Groller项目启动http://rainboyan.com/post/groller_was_launched.html
http://code.google.com/p/rainboyan/source/browse/groller

http://www.blogjava.net/emu/archive/2005/05/18/4784.html里面有讲到8皇后

posted @ 2009-03-18 01:53 leekiang 阅读(1565) | 评论 (0)编辑 收藏

File.separatorChar 返回一个字符,表示当前系统默认的文件名分隔符,在Windows中为"\",unix中为"/"
File.separator 与前者相同,但将分隔符作为字符串类型返回。
pathSeparatorChar 返回一个字符,表示当前系统默认的路径名分隔符,在Windows中为";",unix中为":"
File.pathSeparator 与前者相同,但将分隔符作为字符串类型返回。

posted @ 2009-03-17 16:32 leekiang 阅读(232) | 评论 (0)编辑 收藏

1,以下写法看不到时分秒。必须加引号才能看见。
<input type="text" name="stime" value=2009-02-12 12:43:31 />

2,

posted @ 2009-03-13 19:54 leekiang 阅读(195) | 评论 (0)编辑 收藏

1,使用jdk1.3版本的json-lib.jar时依赖的包(不一定准确,只是作个记录)
commons-beanutils.jar;//必须是1.7以上
commons-collection.jar;//必须3.1以上
ezmorph.jar;

posted @ 2009-03-11 19:59 leekiang 阅读(1318) | 评论 (0)编辑 收藏

1,这个控件没有自带判断日期值是否变化的函数,所以自己写了几行代码:
           var tempdatevalue='';
            function beforedatechange(dp){
            tempdatevalue=this.value;
            }
            function afterdatechange(dp){
            if(tempdatevalue!=this.value)
             {
             window.document.location.href="test.do?do=test&date="+this.value;
             }
            }
<input type="text" id="date" name="date" value="${date}"
                            onfocus="WdatePicker({skin:'whyGreen',dateFmt:'yyyy-MM-dd',onpicking:beforedatechange,onpicked:afterdatechange})" class="Wdate" />

2,IE中 无法打开internet站点 。。。。。已终止操作
<base target="_self" />
在<script/>中添加属性defer="defer";

posted @ 2009-03-11 13:58 leekiang 阅读(392) | 评论 (0)编辑 收藏

1,
Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。市场上 的大部分Web服务器,包括iPlanet、IIS和Apache,都支持HTTP Keep-Alive。对于提供静态内容的网站来说,这个功能通常很有用。但是,对于负担较重的网站来说,这里存在另外一个问题:虽然为客户保留打开的连 接有一定的好处,但它同样影响了性能,因为在处理暂停期间,本来可以释放的资源仍旧被占用。当Web服务器和应用服务器在同一台机器上运行时,Keep- Alive功能对资源利用的影响尤其突出。 此功能为HTTP 1.1预设的功能,HTTP 1.0加上Keep-Alive header也可以提供HTTP的持续作用功能。

posted @ 2009-03-11 03:29 leekiang 阅读(393) | 评论 (0)编辑 收藏

1,快捷键
  代码自动完成:Ctrl+反斜线



2,设置
  1)如果觉得NetBeans缺省的工具栏按钮太大,可以右键点击工具栏,从下拉菜单中选择Small Toolbar Icons
还可以选择"内存",会在工具栏显示内存占用情况。
  2)设置字体:
Tools->Options->Fonts & Colors,在左边的类别Category下选择缺省(Default),再选择字体,然后保存。(一定要选一个Category,因为刚进来时默认的类别是"空白",会导致换了字体也不会生效)。可能中文会乱码,所以还要修改Comment,String这两个类别。
我的字体设置
languages:all languages
Category:Default   Font:Courier New 13
Category:Comment   Font:Dialog 12
Category:String    Font:Dialog 12
  3)控制台出现乱码
在Netbeans的安装目录下的etc目录下有一个netbeans.conf,netbeans_default_options引号内加上"-J-Dfile.encoding=UTF-8" 就可以了! 其它比如字体大小也可以在这里调整.如: --font-size:12就可以了!
-J-Duser.language=en -J-Duser.country=US 英文界面启动
  4)erb文件
# coding: utf-8

在"项目"窗口中显示物理结构(默认是逻辑结构):
tools->Miscellaneous(其他)->ruby标签页->取消"显示逻辑项目视图",然后重启。

3,
maven风格的项目结构 http://www.javaeye.com/topic/274136?page=5

4,与eclipse共享工程
http://tech.ddvip.com/2008-12/122916148599857.html
http://tech.ddvip.com/2008-12/122880588198603.html

5,有人说在linux下这样设置一下界面比较好看:
在netbeans 在安装目录下找到 etc/netbeans.conf 然后在netbeans_default_options 添加参数
-J-Dswing.aatext=true --locale en:US
  来源:http://www.blogjava.net/gml520/archive/2010/04/16/318507.html

posted @ 2009-02-14 01:17 leekiang 阅读(269) | 评论 (0)编辑 收藏

1,只要有jar包就行,不需要在web.xml里定义tld。weblogic8不支持1.1
   1.0引入
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
   1.1引入
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

2,<c:choose>
 <c:when test="${role!='admin'}"></c:when>
 <c:otherwise></c:otherwise>
  </c:choose>

3,格式化日期
<%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt"%>
<fmt:formatDate value="${obj.jhdate}" type="both" pattern="yyyy-MM-dd"/>
说明见http://freeman983.javaeye.com/blog/96900

4,遍历
 <c:forEach var="dept" items="${list}">
        <c:out value="${dept.deptid}"/>
 </c:forEach>
 说明

5,<c:out value="${sessionScope.user.name}"/>
 很详细,有续一
6,数组
<c:forEach items="${sessionScope.department_array}" var="department" varStatus="status">
  department: ${department}_${sessionScope.name_array[status.index]}
</c:forEach>

7, jstl没有if/else,用如下的代替,也可以用<c:choose>
<c:if test="1==1"></c:if>
<c:if test="1!=1"></c:if>

8,if /else if/else用如下的写法
<c:choose>
<c:when test="${逻辑判断}"> </c:when>
<c:when test="${逻辑判断}"> </c:when>
<c:otherwise>
</c:otherwise>
<c:choose>
9,<c:out value="${arr}" escapeXml="false">
如果arr的值里带单引号等,则必须加上属性escapeXml="false",否则会出现&XX;之类的东西

posted @ 2009-02-09 20:23 leekiang 阅读(680) | 评论 (0)编辑 收藏

有一篇好文章:掀起J2ee集群的盖头
作者的观点:最好不要使用Session复制的功能,因为这个功能对性能有很大影响,但却不能完全避免错误。这个观点被很多开发人员所接受。包括一些银行的项目和政府的项目

作者博客里还有一些SSO的好文章,如:跨domain的SSO

集群和分布式的区别,其实从字面就能看出来,一个是集,一个是分

posted @ 2009-02-06 01:39 leekiang 阅读(163) | 评论 (0)编辑 收藏

1,weblogic8.1默认是不能运行在jdk5和jdk6上的,原因是weblogic8的mbean为1.0版本,而jdk5和jdk6自带的mbean版本要高(为1.1?)
 
  可以在环境变量里配置一个参数,设置mbean=1.0,然后weblogic8.1就能运行在jdk5和jdk6上了,但这样据说会产生其他问题。参见
 
2,如何分析MAT里那个leak饼图?
  那个饼图分为好几块,除了Remainder外,其他好几块的名字都是以Problem Suspect开始的,看样子内存泄漏不可能发生在Remainder

3,有人如果98%的时间是用于GC且可用的 Heap size 不足2%,才会产生内存溢出?

4,如何在jdk6配置内存溢出时是否产生dump文件
  可以在jdk6的jconsole的MBean的com.sun.management的HotSpotDiagnostic MBeanHotSpotDiagnostic MBean的第3个调用里,
  设置p0为HeapDumpOnOutOfMemoryError,p1为true,然后点击setVMOption按钮。
   则内存溢出时会自动创建一个java_pid<pid>.hprof的堆dump(转储)文件,默认存放工作空间下(例如tomcat的bin目录)
   
   先把tomcat的内存设置得很小,再跑应用,后台很快就报以下错误:
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid5736.hprof ...
Heap dump file created [87840650 bytes in 4.488 secs]
2009-2-4 19:17:59 org.apache.tomcat.util.threads.ThreadPool$ControlRunnable run
严重: Caught exception (java.lang.OutOfMemoryError: Java heap space) executing org.apache.tomcat.util.net.TcpWorkerThread@a77785, terminating thread
2009-2-4 19:18:02 org.apache.tomcat.util.net.TcpWorkerThread runIt
严重: Unexpected error
java.lang.OutOfMemoryError: Java heap space
2009-2-4 19:18:04 org.apache.tomcat.util.threads.ThreadPool$ControlRunnable run
严重: Caught exception (java.lang.OutOfMemoryError: Java heap space) executing org.apache.tomcat.util.net.TcpWorkerThread@a77785, terminating thread
Exception in thread "DefaultQuartzScheduler_QuartzSchedulerThread" java.lang.OutOfMemoryError: Java heap space
2009-2-4 19:18:05 org.apache.coyote.http11.Http11Processor process
严重: Error processing request
java.lang.OutOfMemoryError: Java heap space
2009-2-4 19:18:13 org.apache.coyote.http11.Http11Processor process
严重: Error finishing response
java.lang.OutOfMemoryError: Java heap space
Hibernate: select......这里它抽空还执行了一条sql
.........略.............................
Exception in thread "RMI TCP Connection(idle)" java.lang.OutOfMemoryError: Java heap space
Exception in thread "Timer-0" java.lang.OutOfMemoryError: Java heap space
Exception in thread "RMI TCP Connection(idle)" java.lang.OutOfMemoryError: Java heap space
Exception in thread "RMI TCP Connection(idle)" java.lang.OutOfMemoryError: Java heap space
.........略.............................

 在输出错误日志的过程中,不知何故还会在eclipse的debug里不停的调用java.util.concurrent.ThreadPoolExecutor

5,内存溢出时自动生成的dump文件和未溢出时自己用jmap导出的dump文件的leak饼图有很大区别,我感觉前者的分析要有用一些。具体区别:
  (1)后者有org.apache.catalina.loader.WebappClassLoader和ZipFileIndex,而前者没有
  (2)两者都有org.hibernate.impl.SessionFactoryImpl
  (3)前者有如下的关键信息:

8,980 instances of "java.lang.Class", loaded by "<system class loader>" occupy 8,208,768 (12.43%) bytes.

Biggest instances:

  • class org.springframework.beans.CachedIntrospectionResults @ 0x735f808 - 2,218,536 (3.36%) bytes. These instances are referenced from one instance of "java.lang.Thread", loaded by "<system class loader>"


  • 6,一个疑问,为何无人访问时Tomcat的内存图是锯齿形的

    7,我配置了-XX:+HeapDumpOnCtrlBreak,用的jdk1.5.0_14
    结果Ctrl+Break 时报
    Unable to create java_pid3072.hprof.m27.10/05/07M20: No such file or directory
    这里 找到了原因,是jdk的一个bug(bug id:6454676),This problem has been fixed in 1.4.2_18 and 5.0u17

    8,前两个1g的顶峰处,是tomcat自己进行的gc。后面的几个是我自己手动gc的

    heap.jpg

    9,

    7,002 instances of "java.lang.Class", loaded by "<system class loader>" occupy 12,359,912 (11.20%) bytes.

    Biggest instances:

  • class sun.rmi.server.UnicastServerRef @ 0x51b16a48 - 4,447,432 (4.03%) bytes.
  • class sun.rmi.transport.ObjectTable @ 0x51b40330 - 3,491,160 (3.16%) bytes
  • 问题

    posted @ 2009-02-04 19:47 leekiang 阅读(12208) | 评论 (1)编辑 收藏

    1,FilterSecurityInterceptor的objectDefinitionSource定义的是url与角色的关系,既可以在xml里写死,也可以自定义一个FilterInvocationDefinitionSource,实现其public ConfigAttributeDefinition getAttributes(Object filter)方法。这个关系好像也可以定义在FilterChainProxy的filterInvocationDefinitionSource
    http://www.javaeye.com/topic/113436
    http://www.blogjava.net/redhatlinux/archive/2008/09/01/226010.html
    http://www.webasp.net/article/29/28097_print.htm

    定义好角色与url的关系,同时告诉acegi该用户拥有的角色,那么acegi会根据投票规则去验证是否有权限。

    2,必须要设置httpSessionContextIntegrationFilter,否则就会报
    org.springframework.security.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext

    3,
    其实所有的权限问题最终可以总结为: 当前的登陆用户是谁,他拥有那些资源,
    他现在所访问的资源是否与与其匹配。 这个就是最基本的 用户-资源 后来因用户和资源经常性变化,
    单一的用户资源模型会导致经常性维护的麻烦,所以人们加入了角色一层,以方便更好的管理,
    这就是 用户-角色-资源(RBAC)模型。随着系统的不断增大,用户和资源越来越多,
    根据不同的项目的需要,人们又按需开发了不少模型,如 用户-角色-权限-资源 模型,
    用户-角色-角色组-权限-资源 模型,用户-角色-角色组-权限-操作-资源 模型等,
    其实无论中间加入多少层,如何扩展,也都是万变不离其宗:用户-资源。

    4,
    手册 http://family168.com/oa/springsecurity/html/

    http://www.javaeye.com/topic/17896

    posted @ 2009-02-03 03:29 leekiang 阅读(809) | 评论 (1)编辑 收藏

    CachedIntrospectionResults 缓存了所有的bean的信息(主要是属性),是用static缓存的,对于同一个class的信息只要执行一次就可以了,所以采用了工厂模式。我怎么觉得是单例模式。
    这个类里有很多东西,什么弱引用之类。与内存泄漏有关系。

    参见:
    http://www.blogjava.net/killme2008/archive/2007/06/26/126282.html
    http://calvin.redsaga.com/viewthread.php?tid=391

    posted @ 2009-02-02 04:56 leekiang 阅读(752) | 评论 (0)编辑 收藏

    1,Software Testing With Spring Framework



    软件开发者面试百问

    posted @ 2009-02-02 03:38 leekiang 阅读(185) | 评论 (0)编辑 收藏

    1领域驱动设计和开发实战

    2,Domain Driven Design with Spring and Hibernate
    http://www.jblewitt.com/blog/?p=129

    领域驱动设计实践http://www.agiledon.com/post/2010/06/107.html

    posted @ 2009-02-02 03:31 leekiang 阅读(302) | 评论 (0)编辑 收藏

    1,从LiveJournal后台发展看大规模网站性能优化方法[zz]
    http://blog.zhangjianfeng.com/article/743

    2,大型网站架构演变和知识体系
    http://www.blogjava.net/BlueDavy/archive/2008/09/03/226749.html

    3,构建架构的思考
    http://www.esbzone.net/2008/08/15/think-architect/

    posted @ 2009-01-30 02:58 leekiang 阅读(281) | 评论 (0)编辑 收藏

    1,Apache Synapse 是一个简单、轻量级的高性能的ESB(企业服务总线)
    http://space.itpub.net/14780828/viewspace-374514

    2,总线的定义(维基百科)
    总线又称计算机总线或系统总线(BUS),台湾譯作「匯流排」,是指计算机组件间规范化的交换数据(Data)的方式,即以一种通用的方式为各组件提供数据传送和控制逻辑。从另一个角度来看,如果说主板(Mother Board)是一座城市,那么总线就像是城市里的公共汽车(bus),能按照固定行车路线,传输来回不停运作的比特(bit)。这些线路在同一时间内都仅能负责传输一个比特。因此,必须同时采用多条线路才能传送更多资料,而总线可同时传输的资料数就称为宽度(width),以位元为单位,总线宽度愈大,传输效能就愈佳。总线的带宽(Bandwidth),也就是单位时间内可以传输的总资料数(单位是Bytes/sec):总线带宽 = 频率 x 宽度。

    3,企业服务总线(维基百科)
    企业计算领域,企业服务总线是指由中间件基础设施产品技术实现的, 基于Web服务标准, 通过事件驱动和基于XML消息引擎,为更复杂的面向服务的架构提供的软件架构的构造物。企业服务总线通常在企业消息系统上提供一个抽象层,使得集成架构师能够不用编码而是利用消息的价值完成集成工作。

    企业服务总线提供可靠消息传输、服务接入、协议转换、数据格式转换、基于内容的路由等功能,屏蔽了服务的物理位置,协议和数据格式

    总线一词是对在一台电脑的不同设备间运输比特的物理总线的引申。ESB在更高抽象层次上提供类似的功能。在一个使用ESB的企业架构(enterprise architecture)中,应用将通过总线交互,而总线扮演着应用间的信息调度(message broker)的角色。这种方法的主要优点是它减少了应用间交互所需的点对点连接的数量。这样,另一方面使得对主要软件变化带来的影响进行分析更简单更直观了。通过减少一个应用系统的连接点数量,对这个系统中的一个组件的改造过程变得简单了。

    4,ESB平台实现协议转换 (WebService,Http,JMS...),消息转换 (转换、充实、过滤),消息路由 (同步/异步、发布/订阅、基于内容路由、分支与聚合...)
    ESB在一个SOA系统中,必须要存在么?非常有必要,没有它不能算真正实现了SOA,异构系统的构件装配需要实现真正的复用和解耦 。WebService只是解决了异构系统的调用,而SOA要解决的是系统(内)间的构件装配、依赖和引用
    但ESB的实现是否已有一个同一的标准呢?
       我感觉ESB要看系统具体情况而言,不是没ESB就不SOA了,
    比如我用SCA+BPEL,一样可以SOA系统,当然前提是偶的系统接口都定义好了,不需要要靠IBM,BEA那些ESB产品去忙活了,这情况也是有的哦
    以前听ESB基本上都是IBM在忽悠,听多了老感觉ESB集中式的部署会引入单点故障,同时性能也会受影响。
    《Enterprise Service Bus》O'Reilly 翻过一点,感觉都是在讲MOM的东东。
    个人觉得ESB承载的东西太多了,感觉还是从Enterprise Integration Pattern中学起,搞点务实的先。
    我简单的对比过mule\servicemix\openesb
    mule,没有IDE支持,不爽
    servicemix,太麻烦,写一个BPEL要好几步,而且它本身的例子都报错.不爽
    openesb,利用netbean可以设计bpel,而且利用glassfish可以直接发布BPEL,还可以,又是开源的,支持JBI,SUN的开源产品越来越丰富了,大家可以试试.
    在很多应用方面,我们都是利用ESB 来实现大数据量的传输的。
    在性能和可靠性方面要强于很多其他解决方案!
      http://www.javaeye.com/topic/130337
    感觉camel优势是消息路由、中介等工作,缺乏组件容器的能力,还是需要和别的组件容器整合使用 。Camel的component 没有 life cycle的管理, 不过你可以在ServiceMix中轻松使用camel 。还有就是最近在ServiceMix dev中在讨论如何复用Camel component的问题, 相信你说的问题在不久的将来会有比较好解决方案的。
    http://www.javaeye.com/post/860098?page=7

    5,http://blog.csdn.net/danny_xcz/archive/2007/05/08/1600013.aspx#1021497

    一提到总线,一般学计算机专业的往往会联想到两样东西,一是网络拓扑上的总线结构,二是电脑主板上的总线。
    和他们不同的是,企业服务总线是一种软件总线,但是他们都可以进行一定的类比。类比是快速学习最好的方法之一。

    网络拓扑的总线由三个东西构成:网络设备(PC,服务器,交换机,路由器),端口(网卡-1个端口,路由器-n个端口),连接各个设备的网线,数据必须通过网卡端口传输到设备。
    电脑主板上的总线也由三个东西构成。处理器(CPU,GPU),针脚(信号输入,输出的针脚),连接各个处理器的线路,同样在每一个时钟周期里,信号通过针脚进入处理器,再从别的针脚输出。

    通过类比,可想而知,ESB软件上的总线必然也由吉祥三宝构成,在Mule里面,他们分别是UMO,End Point,数据的传输路线(当然这是无形的)。
    UMO可以比喻成一个CPU,EndPoint就是这个CPU的针脚,数据从EndPoint(inbound)进入UMO,经过UMO的处理,从另一个针脚发送出(outbound),这样就完成了企业服务总线的一次最基本的操作。


    11,SLA:服务等级协议(Service-Level Agreement)

    posted @ 2009-01-29 21:27 leekiang 阅读(651) | 评论 (1)编辑 收藏

    ext

    Joindesk
    http://www.javaeye.com/topic/240853

    posted @ 2009-01-23 02:02 leekiang 阅读(199) | 评论 (0)编辑 收藏

    Two-Phase Commit

    http://www.blogjava.net/javababy/archive/2006/06/01/49515.html
    http://blog.csdn.net/junli0310/archive/2007/09/12/1781736.aspx

    posted @ 2009-01-23 01:22 leekiang 阅读(262) | 评论 (0)编辑 收藏

    1,你要缓存Post也可以,但是HTTP协议设计Post就是为了防止浏览器缓存的。
    http://www.javaeedev.com/bbs/topic.jspx?id=ff8080811aaa8aeb011b4b6538f74c56

    posted @ 2009-01-22 15:48 leekiang 阅读(283) | 评论 (0)编辑 收藏

    1,Lucene 中的同步与线程安全
    http://arbow.spaces.live.com/blog/cns!A25DE6AC7A5B029E!142.entry





    附带:
    MultiSearcher在多个索引上搜索

    posted @ 2009-01-22 15:29 leekiang 阅读(272) | 评论 (0)编辑 收藏

    1,基本写法
    <body>
        <link rel="STYLESHEET" type="text/css" href="css/dhtmlxtree.css">
        <script  src="js/dhtmlxcommon.js"></script>
        <script  src="js/dhtmlxtree.js"></script>
        <div id="treeboxbox_tree"></div>
        <script type="text/javascript">
      tree=new dhtmlXTreeObject("treeboxbox_tree","100%","100%",0);
      tree.attachEvent("onClick",onNodeSelect);
      tree.setImagePath("images/tree/");
      tree.setXMLAutoLoading("dept.do?action=folder_treeview");//逐级展开
      tree.loadXML("dept.do?action=folder_treeview&id=1");//初始化
      function onNodeSelect(nodeId){
          document.getElementById("parent_folder_id").value = nodeId;
      }
        </script>
    </body>


    2,初始化需要的xml,必须带item
    <?xml version='1.0' encoding='utf-8'?>
    <tree id="0">
    <item nocheckbox="1" open="1" id="-1" select="0" text= "公司" >
    <item  open="1" child="1"  text= "财务部" id= "1"></item>
    <item  open="1" child="0"  text= "技术部" id= "2"></item>
    <item  open="1" child="0"  text= "人事部" id= "4"></item>
    </item>
    </tree>
    注意<tree>里的id的值必须和dhtmlXTreeObject的第4个参数的值保持一致,否则会报错:
    Error type: DataStructure
    Description: XMLrefferstonotexistingparent

    3,逐级展开的xml
    <?xml version="1.0" encoding="utf-8"?><tree id="3">
    <item  open="1" text= "甲部门" id= "5" ></item>
    <item  open="1" text= "乙部门" id= "6" ></item>
    </tree>

    4,child属性表示是否有子级

    posted @ 2009-01-15 23:58 leekiang 阅读(1633) | 评论 (0)编辑 收藏

    Sun的JVM用下列方法可以产生Thread Dump堆栈信息:

    1,Solaris OS
    <ctrl>-’\’ (Control-Backslash)
     kill -QUIT <pid>

    2, HP-UX/UNIX/Linux
    Kill -3 PID 
    PID通过下面方法获取
    ps -efHl | grep 'java' **. **

    3,Windows
    直接对MSDOS窗口的程序按Ctrl-break

    有些Java应用服务器是在控制台上运行,如Weblogic,为了方便获取threaddump信息,在 weblogic启动的时候,最好将其标准输出重定向到一个文件,用"nohup sh startWebLogic.sh > start.log &"命令,执行"kill -3 <pid>",Stack trace就会输出到start.log里。Tomcat的Thread Dump会输出到命令行控制台或者logs的catalina.out文件里。为了反映线程状态的动态变化,需要接连多次做thread dump,每次间隔10-20s。

    Sun JVM的常见线程状态

    对于thread dump信息,主要关注的是线程的状态和其执行堆栈
    线程的状态一般为三类
    Runnable(R):当前可以运行的线程
    Waiting on monitor(CW):线程主动wait
    Waiting for monitor entry(MW):线程等锁
    一般关注的都是第一和第三种状态的线程
    Cpu很忙则关注runnable的线程
    Cpu闲则关注waiting for monitor entry的线程
    一种典型的死锁是由于在server端应用(比如servlet)中请求由同一weblogic实例server的资源
    解决办法就是将该servlet放到另外的执行队列里去执行


    来源:http://www.searchfull.net/blog/2007/04/10/1176207938784.html

    Thread Dump Analyzer 主页:https://tda.dev.java.net/

    posted @ 2009-01-14 14:29 leekiang 阅读(1572) | 评论 (0)编辑 收藏

    利用jdk6查内存泄漏(见编写对GC友好,又不泄漏的代码)
    (1)jmap -dump:file=heap_file_name pid 会产生一个heap_file_name文件
    (2)jhat heap_file_name,然后打开浏览器http://localhost:7000/ 浏览。
       可看到里面显示了运行的所有的类和实例及大小。平台(例如tomcat)的不会包括在里面。
    (3)如果觉得不够,还可以把heap_file_name文件加一个bin的后缀,然后让Eclipse MAT来分析。看这里
    另外
    jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。
    jinfo:的用处比较简单,就是能输出并修改运行时的java进程的运行参数。用法是jinfo -opt  pid 如:查看2788的MaxPerm大小可以用  jinfo -flag MaxPermSize 2788。
    jstat 也很有用,说明见这里


    3,
    SUN JDK所支持的典型选项以及说明:http: //java.sun.com/javase/technologies/hotspot/vmoptions.jsp 上面有很多选项
    -XX:-HeapDumpOnOutOfMemoryError 从jdk1.4.2 update 12 和java 5 update 7开始支持这个选项。

    4,
    关于jmap
    从JDK 5开始,SUN JDK开始提供JMap的工具。但是仅仅是实验性质的,而且只有在solaris平台上有。
    后来Jmap被反向移植到jdk 1.4.2_09。因为是实验性质,所以jmap可能会出现dump失败的情况。
    但是自从JDK 6之后,jmap的稳定性和可用性都没问题了。请注意各个版本的jvm都要用自己版本的jmap,
    而jhat可以用于分析各个版本的jmap dump出来的文件。至于jhat用于分析1g以上的dump文件,
    我们有过多次在笔记本上的成功经历,它对内存的要求可能并没有那么高。
    http://space.itpub.net/27378/viewspace-521225

    5,J2SE6中使用jhat来分析内存堆
    http://hi.baidu.com/tister/blog/item/e7374482f4341ca70cf4d2e8.html

    6,Java内存溢出(OutOfMemory),内存分析相关工具
    http://uglytroll.ycool.com/post.3046111.html

    7,JDK中的好工具 jmap、jhat
    http://wangzaixiang.blogspot.com/2008/10/jdk-jmapjhat.html
    http://hi.baidu.com/zeorliu/blog/item/4f38989413601719d21b70d5.html

    8,SAP贡献给eclipse基金会的MemoryAnalyzer,原来叫Java Memory Analysis
    能分析几G的Memory Dump而不会内存溢出?
    http://www.eclipse.org/mat/
    可惜还是只支持jdk1.4.2 update 12 和java 5 update 7以上

    9,在一个方法里面的变量是不会引起内存泄露的。
    内存泄露都是发生在类变量和实例变量(且此实例被缓存、如单例模式)里。
    我建议你从HashMap、HashMap$Entry 入手查查。
    我也研究过一阵子的内存泄露问题,最终解决了。
    http://www.javaeye.com/topic/233080

    10,你遇到的是最理想的情况,但有时候,这种方法不能找到原因,只找到造成崩溃的点.就好比,
    一个HTTP 请求,没有设置超时(对不起,默认是不超时,不知道为什么SUN要这样设定),
    然后这条线程就卡在这里了,然后,这条线程里的一个堆栈被另一条线程放入内容,
    本来这些内容就是要这条闲线程去处理的,但是现在,这条线程卡住了,但是用你说的这种方法,
    绝对找不到造成内存泄露的原因是因为http不超时,一直卡在那里.

    我还有一个笨办法做精细的内存分配比较:就是定期用pmap命令dump出来JVM进程的内存映射表,然后diff。
    http://www.javaeye.com/topic/256701

    11,http://calvin.javaeye.com/blog/91903
     java 不是有垃圾收集器了吗?怎么还泄漏啊,唬我啊??
       嗯,此泄漏非比泄漏。C/C++的泄漏,是对象已不可到达,而内存又没有回收,真正的内存黑洞。
       而Java的泄漏,则是因为各种原因,对象对应用已经无用,但一直被持有,一直可到达。
       总结原因无外乎几方面:

       1). 被生命周期极长的集合类不当持有,号称是Java内存泄漏的首因。
          这些集合类的生命周期通常极长,而且是一个辅助管理性质的对象,在一个业务事务运行完后,如果没有将某个业务对象主动的从中清除的话,这个集合就会吃越来越多内存,可以用WeakReference,如WeakHashMap,使得它持有的对象不增加对象的引用数。
       2). Scope定义不对,这个很简单了,方法的局部变量定义成类的变量,类的静态变量等。
       3). 异常时没有加finally{}来释放某些资源,JDBC时代也是很普遍的事情。
       4). 另外一些我了解不深的原因,如:Swing里的Listener没有显式remove;内部类持有外部对象的隐式引用;Finalizers造成关联对象没有被及时清空等。
     

    搭车
    我的SQL调优公式T=S/V
    http://space.itpub.net/27378/viewspace-157789

    MetaWidget及SOA
    http://wangzaixiang.blogspot.com/2008/10/metawidget.html

    posted @ 2009-01-14 14:18 leekiang 阅读(6050) | 评论 (2)编辑 收藏

    1,Kwok Information Server is an open source IT management system
       http://www.kwoksys.com

    2,《守、破、离》 是一种做事方式。或许,对于一个程序员来说,离是我们追求的境界,但守是我们应该先做好的。相信你可以对应的上,这里的守,便是前面提到的那些要固化下来 的内容。守不仅仅是一个简单的简化编码的方法,我们甚至可以把一些设计上的理念守下来,这样,做类似的应用,我们就不必从头再来。守的范围越大,离的层次 也就可以越高。

    软件开发的发展,就是一个守的范围不端扩张的过程,操作寄存器的模式用高级程序设计语言的方式守了下来,一些良好的设计方法用设计模式的概念守了下来,一些好的编程习惯用最佳实践的方式守了下来……
    http://dreamhead.blogbus.com/logs/33461687.html

    3,正确认识数据冗余
     主键与外键在多表中的重复出现, 不属于数据冗余,这个概念必须清楚,事实上有许多人还不清楚。非键字段的重复出现, 才是数据冗余!而且是一种低级冗余,即重复性的冗余。高级冗余不是字段的重复出现,而是字段的派生出现。

    〖例4〗:商品中的“单价、数量、金额”三个字段,“金额”就是由“单价”乘以“数量”派生出来的,它就是冗余,而且是一种高级冗余。冗余的目的 是为了提高处理速度。只有低级冗余才会增加数据的不一致性,因为同一数据,可能从不同时间、地点、角色上多次录入。因此,我们提倡高级冗余(派生性冗 余),反对低级冗余(重复性冗余)。
    http://itren.javaeye.com/blog/180385

    4,MapReduce
    是Google提出的一个软件架构,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Reduce(化简)",和他们的主要思想,都是从函数式编程语言借来的,还有从矢量编程语言借来的特性。[1]  当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(化简)函数,用来保证所有映射的键值对中的每一个共享相同的键组。

    你的编程语言可以这样做吗?(map/reduce的js示范)

    http://www.todd-lee.com/blog/article.asp?id=174


    5,TransactionInterceptor反编译后有MISSING_BLOCK_LABEL_76

    6,AKBAR锡兰红茶

    7,在Java上实现RESTful Web Services可用Jersey

    8,外包网站 odesk,elance

    posted @ 2009-01-12 20:06 leekiang 阅读(184) | 评论 (0)编辑 收藏

    1,<spring:bind>是spring2.0以前的写法。
    2,public ModelAndView login(HttpServletRequest request,
                HttpServletResponse response,HttpSession session,User user)
      public ModelAndView login(HttpServletRequest request,
                HttpServletResponse response,User user)
    MultiActionController自动把最后一个参数当作Command对象。
    也可以覆盖protected Object newCommandObject(Class clazz)方法,但这样每个 Controller的Command对象就是同一个iele,
    同时要改为
    public ModelAndView login(HttpServletRequest request,
                HttpServletResponse response,Object command)再对command造型
                
    3,重定向写法
    return new ModelAndView("redirect:/system/user.do?do=addUserForm");

    4,有2个JsonView的,或者更适合Ajax,当然自己写一个JsonView都很简单
    1) json-lib-ext-spring
    http://sourceforge.net/projects/json-lib/files/
    2) spring json view
    http://spring-json.sourceforge.net/download.html
    http://article.yeeyan.org/view/jdonee/10145

    5, 绑定的基本写法
    ServletRequestDataBinder binder = new ServletRequestDataBinder(obj);
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            binder.registerCustomEditor(Date.class, new CustomDateEditor(
                    dateFormat, true));
            binder.setDisallowedFields(new String[]{"endtime"});
            binder.bind(request);

    posted @ 2009-01-08 09:31 leekiang 阅读(295) | 评论 (0)编辑 收藏

    1,为了尽量平稳过渡,继续用junit3.8,而不是直接使用junit4
    2,@ContextConfiguration(locations = { "classpath:applicationContext-sys.xml",
            "classpath:applicationContext.xml" })
    public class BaseTests extends AbstractTransactionalJUnit38SpringContextTests {
    }
    所有的TestCase都继承上面这个类,使得spring配置文件重用,同时ApplicationContext也是同一个。

    3,要测试的service类通过@Autowired注入,例如
        @Autowired
        private UserDAO  userDAO;
        
    4,注意,对于继承了BaseTests的测试类里的每一个test方法,运行测试时都会按
       setUp()-->test方法-->tearDown()的顺序执行,而且这3个组成一个事务,执行完后默认会回滚。
       如果不想回滚,在类名前面@TransactionConfiguration(defaultRollback = false)
       
    5,因为还是用的junit3.8,故TestSuite的写法照旧
      public class SuiteTests {
        public static Test suite() {
            TestSuite suite = new TestSuite("运行所有测试");
            suite.addTestSuite(UserServiceTests.class);
            suite.addTestSuite(RoleServiceTests.class);
            return suite;
        }
    }

    6,测试类并没有当作bean配置在application.xml文件中,
       spring测试框架是如何使"setUp()-->test方法-->tearDown()"处于同一个事务的呢?
       具体就要看AbstractTransactionalJUnit38SpringContextTests了,是通过注解实现的。
       service方法在test方法里面,这两个方法都配置有事务,即形成了事务的嵌套,这里有点复杂了,我还没想清楚。
       不过可以肯定的是,如果test方法的事务不提交,那么service方法的事务也不会提交。
       
    7,如果想在jdk1.4下重用ApplicationContext,可采用以下的办法,出处再补上。这个办法与前面的进行比较,
       我觉得最大的区别是这种写法要手动进行测试数据的清除。
    public class BaseTestCase extends TestCase {
         static ApplicationContext context = null;

        static {
            // perform the "global" set up logic
            // 这里的代码会在类初始化时执行,所以相当于BeforeClass
            String[] CONFIG_FILES_MIN = { "applicationContext-sys.xml",
                    "applicationContext.xml" };
            context = new ClassPathXmlApplicationContext(CONFIG_FILES_MIN);
            System.out.println("setup");

            // and now register the shutdown hook for tear down logic
            // 将一个匿名方法写到这里,就相当于AfterClass
            Runtime.getRuntime().addShutdownHook(new Thread() {
                public void run() {
                    System.out.println("shutdown");
                }
            });
        }

        protected void setUp() throws Exception {
        }
    }

    8,如果用junit-4.jar,去官网下载junit4.4.jar。不要采用myeclipse自带的junit4.jar,因为这个不带JUnit4ClassRunner类。
       另外不要用junit-4.5.jar,据说与spring2.5有冲突,
       详见Spring Test Context Framework not compatible with JUnit 4.5,http://jira.springframework.org/browse/SPR-5145


    9,String htmlContent = "<html><head></head><body>html content</body></html>";
    String plainContent = "plain content";

    MockMultipartHttpServletRequest req = new MockMultipartHttpServletRequest();
    req.setContentType("multipart/form-data");
    //req.addHeader("Content-type", "multipart/form-data");//这样写应该是一样的
    req.setMethod("POST");
    req.addFile( new MockMultipartFile("file","test1.html","text/html", htmlContent.getBytes( "US-ASCII" ) ) );
    req.addFile( new MockMultipartFile("file","test2.html","text/html", htmlContent.getBytes( "US-ASCII" ) ) );
    req.addFile( new MockMultipartFile("file","test.txt", "text/plain",plainContent.getBytes( "US-ASCII" ) ) );
    assertTrue( ServletFileUpload.isMultipartContent( req ) );
    int content_length = req.getContentLength();

    10,AbstractTransactionalJUnit38SpringContextTests
        AbstractTransactionalSpringContextTests
        AbstractTransactionalDataSourceSpringContextTests
    的区别?

    11,MockHttpServletRequest的addParameter方法和setParameter的区别


    参考:
    详细讲解在Spring中进行集成测试
    http://www.javaeye.com/topic/68185
    http://www.google.cn/codesearch/p?hl=zh-CN#Vq-IOboH1tI/trunk/test/es/peerreview/service/TestPeerReviewSpring.java
    用Spring提供的JUnit框架扩展对DAO或Service层进行单元测试
    http://code.google.com/p/anewssystem/source/browse/trunk/anewssystem/parent/core/src/main/java/anni/core/test/?r=105
    http://docs.huihoo.com/spring/2.5.x/zh-cn/testing.html
    http://arkxu.javaeye.com/blog/261679
    http://www.ibm.com/developerworks/cn/java/j-cb06066.html
    http://www.ibm.com/developerworks/cn/java/j-lo-spring25-test/
    基于mock对象和JUnit框架简化Spring Web组件单元测试
    http://www.blogjava.net/calvin/archive/2005/09/21/13628.html
    http://www.yybean.com/testing-framework-to-use-spring-integration-testing


    posted @ 2009-01-04 18:13 leekiang 阅读(1894) | 评论 (0)编辑 收藏

    1,做人、做事,做架构师——架构师能力模型解析

    2,剑法三套,程序员也能挣大钱

    posted @ 2008-12-29 22:57 leekiang 阅读(225) | 评论 (0)编辑 收藏

    1,Junit测试Action
    http://lyx.javaeye.com/blog/57037

    2,在JUnit中多个testCase只执行一次setup和tearDown的方法

    3,SoapUI当选最佳开源Web Services测试工具

    4,通过Spring2.5对单元测试的Annotation支持进行TDD开发

    5,sventon用于svn代码的在线浏览,其单元测试代码很规整。
    http://svn.sventon.org/repos/berlios/show/trunk/sventon/src/test/java/org/sventon/web/ctrl/template/GetFileControllerTest.java

    6,mockito似乎比easymock好用

    posted @ 2008-12-24 00:31 leekiang 阅读(257) | 评论 (0)编辑 收藏

    1,项目中如何进行敏捷建模
    2,来自Rails世界的项目管理工具Redmine

    posted @ 2008-12-24 00:28 leekiang 阅读(99) | 评论 (0)编辑 收藏

    1,范围查询,例如
    Term begin=new Term("publishdate","1999-01-01");
    Term end
    =new Term ("publishdate","1999-10-15");
    RangeQuery q
    =new RangeQuery(begin,end,true);





    1),
    Lucene-2.2.0 源代码阅读学习
    2)
    Lucene 中自定义排序的实现
    3)
    lucene学习笔记
    4)
    http://www.lucene.com.cn/sj.htm
    5)LRU
    LRU(最近最少使用算法) and MRU(最近最常使用算法)  所谓的LRU(Least recently used)算法的基本概念是:当内存的剩余的可用空间不够时,缓冲区尽可能的先保留使用者最常使用的数据,换句话说就是优先清除”较不常使用的数据”,并释放其空间.之所以”较不常使用的数据”要用引号是因为这里判断所谓的较不常使用的标准是人为的、不严格的.所谓的MRU(Most recently used)算法的意义正好和LRU算法相反.
    oracle缓存用到了LRU
    http://bluepopopo.javaeye.com/blog/180236
    6,Apache lucene知识汇集
    7,Lucene 2.3.1 阅读学习(41)
    8,Lucene的score()实现
    9,Lucene 的排序修改
    10,6大原因让你不选择使用Lucene
    11,解决lucene范围搜索中的TooManyClauses exception

    posted @ 2008-12-23 23:22 leekiang 阅读(264) | 评论 (0)编辑 收藏

    按照office的官方办法去弄永远是一头雾水的,经过摸索我发现了以下方法,以供参考:

    首先打出标题所需的内容xxxxx,然后将光标移到行首,点击工具栏中“编号”图标,这时候这一行将被默认编号为“1”。双击该编号“1”,将出现“项目 符号和编号”窗口,在窗口中选择“多级符号”,然后点击“自定义”按钮,进入“自定义多级符号列表”,在“编号样式”列表中选择“一、二、三”样式(注意 旁边的“起始编号”已经设定为“1”),这时在上面“编号格式”窗口中出现了灰底的“一”,然后在这个“一”的两边分别输入“第”和“章”,这样就完成了 章节的编号(你可以试着回车,将出现“第二章”,输入相应内容后回车,将会出现“第三章”……)。

    接下来如果需要对小节进行编号,比如将第一章的某一节编号为“1”,则可以按照以下操作:

    1.在编号为“第一章”的行尾回车,这时出现“第二章”;
    2.光标移到“第二章”编号上,先左键点击编号然后再点击右键,在列表中选择“重新开始编号”,随即该编号“第二章”将自动变为“第一章”;
    3.此时,双击该编号,按照第一段所述的步骤,在“自定义多级符号列表”中将该“第一章”的编号改成“1,2,3……”样式。此时将完成对小节的编号。

    对于次级编号,也可以按照类似的步骤进行操作。例如,编号“1”下面要编1.1,可以重复以后步骤1和2,然后在步骤三中,在“自定义多级符号列表”的“编号格式”窗口中的灰底编号“1”的左边输入"1.”,这样后续的编号将变成1.1、1.2、1.3……(如果在灰底的1右边输入,则后续编号将为2.1、3.1、4.1……)。

    注意:在”第一章”、“1”、“1.1” 等级别的编号完成之后,如果要开始做“第二章”编号怎么办?很简单,复制“第一章”编号的行,然后粘贴到所需的位置,这时编号将自动变成“第二章”,此时 将编号相应的内容改变即可。同时还可以灵活利用“格式刷”功能,改变某标题或某行编号。

    以上的方法也许稍微复杂一点,但是路径十分清晰,对于掌控整个文档的编号结构十分有效。

    posted @ 2008-12-16 13:08 leekiang 阅读(2189) | 评论 (0)编辑 收藏

    普通的写法在weblogic的war包中读取不到资源,尝试以下的写法
    public   static   final   String   PROPERTIES_FILE_NAME   =   "/*.xml";  
      path   =   this.getClass().getResource("").getPath();  
                      int   pos   =   path.indexOf("WEB-INF");  
                      path   =   path.substring(0,   pos)+"WEB-INF\\classes";  
      file   =   new   File(path,   PROPERTIES_FILE_NAME);  
      把文件放到web-inf/classes   的目录下面我想应该不会在出现这样的问题了

    以下摘自http://topic.csdn.net/t/20050915/16/4272932.html
    Class   类提供了下面的方法:  
      public   java.io.InputStream   getResource(java.lang.String   path)  
       
      //   Thread.getContextClassLoader();   能得到   WebApps的当前类加载器,如果你的调用是在你自己写的   Java   类中(它放在   /WEB-INF/classes   或   /WEB-INF/lib   的   jar   中,web   应用程序的根:    
      %APP_BASE%/   路径下的所有东西都归   ContextClassLoader   来加载的,如果你的   getResource   调用是在   /WEB-INF/classes   下的一个   .class   中发出的那么直接   getClass().getResource('/WEB-INF/web.xml');   否则你要   Thread.getContextClassLoader().getResource("/WEB-INF/web.xml");  
       
      URL   url   =   getClass().getResource("/WEB-INF/web.xml");    
      //返回   :jar:file:/C:/tomcat/webapps/mywebapps.war!/WEB-INF/web.xml   ;  
       
      字符串查找   :   url.getProtocol()   返回   jar,   后面开始一直到     !/   位置的这中间部分就是文件位置。


    相关:
    Java程序中的配置文件的存放和读取 http://hdwangyi.javaeye.com/blog/105512
    http://www.blogjava.net/crazycy/archive/2008/03/18/187056.html
    http://www.jguru.com/faq/view.jsp?EID=416061
    http://www.javaresearch.org/article/7499.htm

    posted @ 2008-12-10 20:59 leekiang 阅读(188) | 评论 (0)编辑 收藏

    1,原理
      提交请求时会把过滤、排序、页码等信息提交到控制器。用以下三行就得到了封装了分页信息的Limit对象:
      Context context = new HttpServletRequestContext(request);
      LimitFactory limitFactory = new TableLimitFactory(context);
      Limit limit = new TableLimit(limitFactory);
       然后就可以获得这些分页信息了:
       Sort sort = limit.getSort();//排序信息。每次只能对某一列进行排序。
       FilterSet filterSet = limit.getFilterSet();//过滤信息
       int pageNum =limit.getPage();//页码
       建议修改Sort和FilterSet的源码,用别的对象(例如map,对象数组等)包装一下排序和分页的信息,而不要直接把et的Sort和FilterSet对象传递到业务处理层。
       
    2,数据库分页后,xls导出时都是导出当前页面显示的记录。这样不妥,所以还需修改导出的代码。
      导出的应该是根据当前过滤、排序条件查询出的所有结果集。最好把这些条件也加上。
     
    3,数据库分页时,自选的每页记录数应该与实际的每页记录数保持一致。

    posted @ 2008-12-03 18:04 leekiang 阅读(239) | 评论 (0)编辑 收藏

    1,在以下的文章中找到bort这个rails应用
    http://www.railsinside.com/elsewhere/100-7-barebones-rails-apps-to-kick-start-your-development-process.html
      下载bort,放到netbeans6.5中,设置为主项目,启动报错,第一次报capistrano的错误,我在environment.rb中把那几个config.gem屏蔽了。接着又报 `load_missing_constant': uninitialized constant Authorization::AasmRoles::AASM (NameError) ,我照着http://rails_security.lighthouseapp.com/projects/15332/tickets/10-uninitialized-constant-authorization-aasmroles-aasm-nameerror这个链接里的做法
    在application.rb的ApplicationController里加了一行require 'aasm',然后就可以启动了。执行ruby db/migrate,重启后,首页能进,但注册一个用户提交后报
    Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id
    这个发生在app/views/users/new.html.erb
    暂时就到这里了,以上大多不懂,先作个记录。

    2,这是一个基于2.2.2的例子,名叫starter
    http://github.com/josevalim/starter/tree/master/app
    可以在github里搜2.2.2,或在code search里搜索RAILS_GEM_VERSION = '2.2.2',以寻找基于2.2.2的例子。
    http://github.com/brainopia/shop/tree/master
    http://github.com/ccjr/play-eoj/tree/master
    http://github.com/Radar/rboard/tree/master
    http://github.com/rbarazi/simple_blog/tree/master
    http://github.com/csiszarattila/webshop/tree/master
    http://github.com/bushymark/depot/tree/master

    运行starter,却报
      Missing these required gems:
      win32console
      ruby-debug
      ruby-prof

    然后
    starter>rake gems:install
    (in c:/starter)
    rake aborted!
    no such file to load -- spec/rake/spectask
    C: /starter/rakefile:10
    (See full trace by running task with --trace)


    posted @ 2008-12-03 02:53 leekiang 阅读(424) | 评论 (0)编辑 收藏

    1,博客,cms类
      Mephisto 已升到2.2.2,

      typo 已升级至2.3.5
      radiantcms 内容管理
      rubricks
      refinerycms
      locomative
      simplelog:http://simplelog.net
      1stlog是一个针对中国用户开发的基于RubyOnRails的Blog系统
      http://www.h3rald.com/articles/rails-os-killer-apps
    2,项目管理
       Redmine 2.3.5
       retrospectiva  http://retrospectiva.org/  2.3.5
       Teambox
       Clocking IT 功能更为强大
    3,论坛
      beast,rforum
      beast改造版:http://code.google.com/p/savage-beast-2/
                  http://github.com/courtenay/altered_beast
      rboard:https://github.com/radar/rboard
    4,SNS
    https://github.com/insoshi/insoshi
    https://github.com/stevenbristol/lovd-by-less,demo见http://try.lovdbyless.com/  
    https://github.com/bborn/communityengine  见http://communityengine.org/
    https://github.com/timothyf/EngineY

    《Practical Rails Social Networking Sites》
    《RailsSpace: Building a Social Networking Website with Ruby on Rails》

    5,进销存
    http://hamster.rubyforge.org/index.htm
    Spree http://spreehq.org/  已升级至2.3.5
    gal  http://gal.railsplayground.com/
         http://sourceforge.net/projects/gal
         https://gal.svn.sourceforge.net/svnroot/gal/trunk/
    http://www.javaeye.com/news/5718-23-best-open-source-ruby-on-rails-application
    6,
    substruct
    http://code.google.com/p/substruct/

    tracks 个人时间管理? http://www.getontracks.org 2.2.2


    6 CRM,erp
    fat_free_crm http://www.fatfreecrm.com/  目前基于2.3.4,似乎没有单元测试
    extrails
    http://sourceforge.net/projects/extrails/
    http://code.google.com/p/pa-manager/
    官网为http://www.ev-manager.com

    文档管理
    http://github.com/bruparel/file_manager

    邮件
    mailr

    社会化网络
    Community Engine  http://communityengine.org/
    onebody   insoshi
    openmind
    http://www.blog.railshouse.com/2009/04/17/Top-Open-Source-Ruby-On-Rails-Projects

    7,
    Rools is a pure Ruby rules-engine.
    8,openWFEru is an open source Ruby workflow and BPM engine。又名Ruote
    9,Spreadsheet can read, write and modify Spreadsheet Documents
    10,sequel
    http://www.infoq.com/cn/news/2008/12/sequel-ruby-db-toolkit
    11,Rails  Metal是一个围绕一般Rack中间件的封装wrapper,能够放在Rails请求的前面并使用Rails的session。Metal的出现给让Rails应用的运行速度极大加快,并且能够每秒钟同时处理成千上万的应用

    12,rubycas-server  单点登录
       http://chinaonrails.com/topic/view/1610.html
      http://code.google.com/p/rorjossoagent/  
    destinyd.war@gmail.com

    13,
    说到工作流引擎,ruby的state machine非常不错,在功能/开发效率/可扩展性等方面,没有任何一个开源的java工作流引擎可以和它媲美:
    http://github.com/pluginaweek/state_machine/tree/master
    http://www.javaeye.com/topic/362207

    http://www.blogjava.net/cap/archive/2005/07/17/7895.html
    Graphviz的主页在http://www.graphviz.org/ , 他是AT&T Labs-Research开发的图形绘制工具,  他可以很方便的用来绘制结构化的图形网络,支持多种格式输出, 生成图片的质量和速度都不错

    acts_state_machine

    14,Bort
    A base rails app featuring: RESTful Authentication, Will Paginate, Rspec &amp; Rspec-rails, Exception Notifier, Asset Packager, Cap Recipe (multi-stage).
    15 sinatra 微型web框架
    16 pony 发邮件
    17 rest-client代替ActiveResource
    18 报表 ruport   rails21-book   Prawn   ActvieFPDF
       HowtoGeneratePDFs
       http://wiki.rubyonrails.org/rails/pages/HowtoIntegrateJasperReports
    19 Radiant:一个顶尖的基于Rails的CMS
    20
    Mongrel
       http://chinaonrails.com/topic/view/206.html
       Mongrel 是一个ruby的webserver和类库. Mongrel的特色就是快,它比ruby自带的web server还有其他的webserver都要快。把程序部署到这个上面是会给你带来速度上的惊喜的。 另外你也可以在ruby程序中直接使用mongrel,开发属于自己专用的web server。mongrel的安装超级简单,别忘了他是用rubygems打包的,一个命令完全搞定。 gem install mongrel
    在我们介绍的五个武器总mongrel是唯一的一个类库。他是开放源代码的。他是一个很好的教我们如何把自己的产品打包,市场化。当然他最吸引的就是他的作者从中教给我们如何写一个类库。

    21  InstantRails,一个All In One的套件,可以帮助你快速搭建Ruby On Rails开发环境

    22  Adhearsion is a new way to write voice-enabled applications. It's not just an API or library — it's a fully-featured framework, the first of its kind, designed for maximal code reuse and intuitiveness. The name "Adhearsion" is a combination of "adhesion" and "hear" because Adhearsion shines best when integrating technologies with voice.

    23 http://www.h3rald.com/articles/rails-os-killer-apps

    24 Shoes只是玩具,要用Ruby进行快速GUI开发,请用wxRuby+wxSugar
       http://quake.javaeye.com/blog/295829

    25 权限插件
    http://github.com/binarylogic/authlogic/tree/master

    26 查询
    http://www.javaeye.com/topic/585348
    http://book.csdn.net/bookfiles/879/10087927419.shtml
    http://www.javaeye.com/topic/241343 Searchgasm  searchlogic
    Where插件  ostruct
    simple_column_search http://doruby.kbmj.com/tn_on_rails/20100120/

    27,<Rails高级编程>

    28,Camping将自己定义为个代码量保持在4k字节大小以下Web开发框架这个项目已创建了22个月并由 whytheluckystf维护个完整web应用可以在单文件中定义同时遵循MVC框架(这使得web应用以后更易于移植 到Rails的上)Camping使用ActiveRecord作为ORM解决方案

    29,nokogiri 解析xml,用法类似于jquery

    30,mini_magick处理图片

    31,rcov
    是使你的程序不经常崩溃的理由之一。 它分析你的代码, 高亮显示你的测试代码遗漏的部分。 它速度快, 不占资源, 并且能减轻头痛 :)

    32,hpricot 是一个快速、容易上手的 HTML 分析器。 如果你发现自己需要解析 HTML 抑或 XML 的内容, hpricot 是最简捷的方法之一

    33,Capistrano 是 Rails 应用程序开发更加从容。 它还是一个用来和远程服务器交互的聪明的 framework 。 事实上我已经备份了用 Capistrano 写的代码, 作为 Rake/Net::SSH 或者 shell 代码之外的另一个选择。

    34,Turn 使你的 Test::Unit 输出更易读。 Turn 也行看起来不那么招人喜欢, 但它确实对阅读测试结果有很大帮助。 在维护 Helicoid 的时候我对测试严重依赖, 所以任何能使这项工作变得更简洁的东西我都乐于尝试。要安装 turn, 使用 gem install turn 命令。

    35, scruffy和Gruff可用来产生图形

    36, rubyscript2exe和Exerb可以编译为exe文件,后者生成的文件小,如果后者生成的运行不了可以试前者。

    37, JRails就是用jQuery替代Prototype/script.aculo.us在Rails做 helpers实现javascript的功能
         http://kyoleelqh.javaeye.com/blog/250514

    38,GNMS是一个网络管理系统,图形化工具,用于监测网络元素的状态
    39,Plugin to kill N+1 queries
        http://github.com/flyerhzm/bullet   destinyd_ror@163.com

    http://www.opensourcerails.com

    http://www.infoq.com/cn/articles/changing-the-present-case-stud
    http://www.roredu.com/rubyrails/category/ruby-on-rails-item/
    http://www.javaeye.com/news/1993
    http://hqmank.blog.bokee.net/bloggermodule/blog_viewblog.do?id=532562
    http://www.opensourcerails.com/
    http://www.practicalecommerce.com/blogs/post/432-Multiple-Attachments-in-Rails

    posted @ 2008-12-01 02:30 leekiang 阅读(1623) | 评论 (0)编辑 收藏

    1,db:migrate 时,Table already exist 的解决办法
      在已存在的表的create_table的参数中,加上 :force => true,如下:
      create_table :products:force => true do |t
    2,验证
    http://www.36sign.com/blog/working/ror-validation-problem.html
    http://cvu.javaeye.com/blog/78066
    3,分页
    will_paginate
    下载:http://github.com/mislav/will_paginate/wikis/installation
    http://hideto.javaeye.com/blog/108118
    http://trace.javaeye.com/blog/156736
    http://www.cnblogs.com/ayuan/archive/2008/03/12/1102001.html
    http://www.ruby-lang.org.cn/forums/thread-985-1-1.html
    http://hi.baidu.com/%D0%C7203/blog/item/30f334ecd0a319d72e2e212c.html

    posted @ 2008-11-30 06:11 leekiang 阅读(205) | 评论 (0)编辑 收藏

    jCIFS是一个完全用Java开发的SMB客户端库。它紧密地遵循CIFS规范(是Microsoft Windows平台标准文件共享协议),支持Unicode,命令管道,批处理,线程化调用者的IO复用,加密认证,完整事务,域/工作组/主机/共享 /文件枚举,NetBIOS 套接字和名称服务,smb:// URL协议处理器,一个类API的java.io.File ,RAP调用,NTLM HTTP鉴别。它广泛用于企业内部网络。

    JCIFS: The Java CIFS Client Library
    http://jcifs.samba.org/

    很多公司都希望WEB登陆与域用户结合起来,实现单点登陆,使用jcifs.jar可以非常好实现,下载一个最新的jcifs.jar,放到WEB-INFlib下面,现在是1.27版,然后修改web.xml,加入下面:

    <filter>
    <filter-name>NtlmHttpFilter</filter-name>
    <filter-class>jcifs.http.NtlmHttpFilter</filter-class>
    <init-param>
    <param-name>jcifs.http.domainController</param-name>
    <param-value>192.168.0.90</param-value>
    </init-param>
    </filter>

    <filter-mapping>
    <filter-name>NtlmHttpFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>

    192.168.0.90是你AD服务器,然后在你的登陆的代码中使用
    request.getRemoteUser(),就可以得到当前域用户的用户名了
    转自http://www.eit.name/blog/read.php?275

    posted @ 2008-11-29 01:16 leekiang 阅读(3191) | 评论 (0)编辑 收藏

    1,安装ruby
    2,安装rails
      gem install rails --remote
    3,如果是oracle
    安装ruby-oci驱动,下载地址:http://rubyforge.org/frs/?group_id=256,
      下载rb结尾的,双击
    安装rails与oracle的适配器,
      gem install activerecord-oracle-adapter --source http://gems.rubyonrails.org
    4,rails2.2没有带mysql包,需要执行gem install mysql
    如果报
    ruby.exe - 无法找到组件
    ---------------------------
    没有找到 LIBMYSQL.dll,因此这个应用程序未能启动

    那就到mysql/bin下拷贝LIBMYSQL.dll到windows/system32下
    5,生成rails应用骨架
      在应用父目录下执行rails mybook --d mysql
    6,配置mybook/config下的database.yml
    development:
      adapter: mysql
      encoding: utf8
      database: mybook
      pool: 5
      username: root
      password: root
      host: localhost
    7,在mybook应用下执行ruby script/generate scaffold product title:string description:text image_url:string
    8,rake db:migrate 将其迁移到数据库。
      可发现mysql中生成了一个products表,还额外多了id,created_at,updated_at3个字段
    9,在mysql应用下运行WEBrick服务器。不能再外面运行。
      ruby script\server
      可能会提示先升级RubyGems,根据提示执行。
       然后浏览http://localhost:3000/products


    参考:http://www.cnblogs.com/acnono/


    posted @ 2008-11-27 00:29 leekiang 阅读(3527) | 评论 (0)编辑 收藏


    改造xloadtree,改成json传参和jquery插件的方式
    数据,结构,行为,风格
    xloadtree:
    树的数据是以xml的结构存放的。
    每次点击展开的图标,只加载下一级的数据。
    每一级的数据都是以<xml>的形式存放,
    <tree text="子节点" action="http://webfx.eae.net" src="NOT_AVAILABLE.xml" target="_new"
            icon="http://webfx.eae.net/images/favicon.gif"/>
            如果src形如*.xml,该节点的前面才有展开的图标。
    文件系统树,如果不作调整,最后一个节点不管是文件夹还是文件,一律显示为文件,这是不对的,如何处理:
    (1)设置叶子图标为folder.png
    (2)生成下一级的xml数据时判断一下,如果子级有文件夹或文件,则src形如*.xml;如果是文件,加一个icon='file.png'



    别的树:
    1,http://code.google.com/p/jstree/
    演示http://www.vakata.com/jsTree/examples/

    2,http://be.twixt.us/jquery/treeView.php

    3,http://bassistance.de/jquery-plugins/jquery-plugin-treeview/

    4,jQuery File Tree
      http://abeautifulsite.net/notebook_files/58/demo/
     
    5,http://destroydrop.com/javascripts/tree/

    6,自动选择子节点
      http://www.cnblogs.com/adandelion/archive/2006/05/20/405319.html
    7,http://www.javaeye.com/topic/148372
    8,jQuery SimpleTree Drag&Drop plugin
      http://news.kg/wp-content/uploads/tree
      http://www.javaeye.com/topic/249851
           

    posted @ 2008-11-19 14:33 leekiang 阅读(444) | 评论 (0)编辑 收藏

    1,Fluorida

    Fluorida is a Flex/Flash functional testing tool. It manipulates Flash just as real users do. As a tester, you write test cases with our simple but still expressive DSL.

    |open|aut.swf|
    |click|helloButton|
    |verifyText|helloText|hi there|

    Easy, isn't it?


    2,rubyworks

    ROR的运行环境一次成型,HAproxy,Mongrel,这两项都安装好了,只要在http service上再配置配置,选个rails,数据库版本安装下,把你的项目往一个建好的rail目录中一放就能运行了。最大限度的省了很多配置工作。对 于linux配置不是很明白的人,都能够依葫芦画瓢,继续配置了。

       http://jack.javaeye.com/blog/90988


    3,openlayers

    OpenLayers is a pure JavaScript library for displaying map data in most modern web browsers, with no server-side dependencies. OpenLayers implements a (still-developing) JavaScript API for building rich web-based geographic applications, similar to the Google Maps and MSN Virtual Earth APIs, with one important difference -- OpenLayers is Free Software, developed for and by the Open Source software community

    4,JBoss Tools

    整合了以前的JBossIDE 和Exadel Studio

    First-class support for JBoss Seam 1.2 and 2.0
    Visual Page editor for rich editing of (X)HTML, JSP, JSF and Facelets pages可视化编辑
    Unique JSF and Facelets support
    JBoss AS server integration
    Project Archives
    Hibernate 3 Support
    JBPM support

    5,jxlib

    一个基于mootools的ui库

    6,Relo是一个帮助开发人员研究大型代码库的好工具,它能够一步步的跟踪你所展开的代码包,并快速生成类似UML的类图

    7,SMSLib

    Java library for sending/receiving SMS messages.

    google上的开源项目,见http://code.google.com/p/smslib

    http://www.kaiyuan8.org/Article/zhZXHxUzHLWBtleIuZNX.aspx

    8,Wireshark是世界上最流行的网络分析工具?

    9,小巧的Wiki系统:More wiki in a jar

    http://www.kaiyuan8.org/Article/RGwkNaDnqjzWucEaxlYc.aspx

    用到一个小巧的webserver:NanoHTTPD 
    http://www.kaiyuan8.org/Article/mLwKtfyMOCboFUEJbRnw.aspx

    10,JavaScript图形库Raphaël

    http://www.kaiyuan8.org/Article/FGQrjBrGGIMNQXuwuOnR.aspx

    http://raphaeljs.com/analytics.html

    11,两个免费的Flash Chart

    amchart,open flashchart


    12,rxtx取代javax.comm实现Java跨平台设备端口通信

    13,Sonar是一个开源的Java代码质量管理平台,采用纯Java编写。Sonar的最新版本从5种编码规则优先级进行代码管理(Checkstyle, PMD, Findbugs, Taglist…),同时可以为每种规则配置权重。Sonar的这一功能允许用户完全自定义编码规则,从而更好的跟踪问题。

    14,

    OpenXava提供了一个允许开发者快速而高效地创建Web应用和Portlet的框架。3.0版充分利用了JPA的优势,允许用户仅仅使用POJO和Annotation来创建完整的应用。对于最简单的用例,用户可以通过带有附加的OpenXava Annotation的POJO模型来生成一个完整可用的应用。对于稍微复杂一些的用例,完全使用附加的Annotation也可以应对.对于更复杂的用例,用户可以在模型类中加入变化事件,实现定制的控制器,覆盖缺省的控制器中的特征。

    OpenXava3.1.4是个Java编写的开源框架,OpenXava提供了一套基于Java的企业级Ajax应用程序解决方案。使用OpenXava可以高效的开发出基于Java的 Ajax企业级应用程序。OpenXava的优势在于快速开发,OpenXava的开发效率高于Ruby On Rails, Spring MVC,或者任何MVC框架。因为如果使用 OpenXava ,开发者需要编写的仅仅是Model部分而已。控制器(Controllers)是可以完全重用的,而视图部分(Views)则是完全自动生成的。

    OpenXava适合任何类型的Java开发者,OpenXava的高度扩展性可以让Java专家开发出适合自己的OpenXava开发应用环境,对于Java新手来说,OpenXava可以提供最简单的快速开发企业应用程序的解决方案。

    15,

    Ujorm是一个新的开源Java版ORM框架,Ujorm的作者目标是开发一个足够敏捷的ORM框架作为Java应用的持久层,以适合快速迭代开发的敏捷团队。Ujorm的第一个优势是性能上的优势,从一个简单的SELECT来时,Ujorm的性能要远远高于同类框架。当然Ujorm还包括有:类型安全的查询参数,更小的性能开销,和最简化的实体解决方案。

    下面是作者将Ujorm与Hibernate进行的一些对比:
    http://ujoframework.org/presentation/

    16,

    http://www.skywayperspectives.org

    Skyway Builder CE 是一个开源的基于Spring的web应用的代码生成器和脚手架。

    Skyway Builder CE 6.3增强了新增或者通过现有的域模型生成Spring MVC代码的能力
    Skyway Builder CE 6.3升级了Spring DSL用于提升SpringDSL项目包的权重
    Skyway Builder CE 6.3增强了生成自定义Spring MVC和Spring Web Flow代码的能力
    Skyway Builder CE 6.3增强了Spring Web Flow编辑器,包括改进了易用性,和与Spring DSL更好的整合
    Skyway Builder 6.3企业版 提供与IBM Rational产品 Architect7.5.2的整合功能,Skyway Builder 6.3企业版 可以把Architect绘制的UML转换成可以工作的Spring应用程序

    17

    Forms4j

    替代spring的form标记

    18,

    GraphViz是一个可以将简单语法描述的结构转化为图形的工具。它是AT&T Research搞出来的开源项目,在官方主页上你可以看到一些样图 Graphviz在各种平台下均可使用

    19,

    Apache Shiro is a powerful and flexible open-source security framework that cleanly handles authentication, authorization, enterprise session management and cryptography

    20,

    语法着色工具:SyntaxHighlightergoogle-code-prettify据说后者要好用一些。

    21,

    FlexPaper是一个开源的PDF文档在线查看控件。用户查看PDF文档不需要安装Acrobat Reader,但需要利用像SwfTools这样的工具预先将PDF文档转成SWF格式的文件。FlexPaper能够对需要查看的文档进行分页、搜索、打印、缩放、全屏查看等。

    posted @ 2008-11-08 01:06 leekiang 阅读(500) | 评论 (0)编辑 收藏

    遇到一个需求,需要根据当前页面的状态动态设置定义在input上的my97日期控件的onfocus事件是否启用。几经周折,才搞定。
    对于已经写在input上的onfocus事件:
    <input type="text" name="finishtime" id="finishtime"  readonly="readonly"
     onfocus
    =WdatePicker({skin:'whyGreen',dateFmt:'yyyy-MM-dd HH:mm'}) class="Wdate">
    我用jquery的unbind函数死活都解决不了。
    最后只能用IE的detachEvent来解决,而用这个detachEvent又有两个要注意的:
    (1)detachEvent的事件必须是先前attachEvent的。
    (2)函数不能带参数,故用了个自定义的无参的my97dp函数来中转。
    真是搞不懂,又不能专门花时间来把js事件机制搞得很清楚。
    代码如下:
     <script>
     
    function my97dp(){
     WdatePicker({skin:'whyGreen',dateFmt:'yyyy
    -MM-dd HH:mm'});
     }
     jQuery(
    function(){
    jQuery('#finishtime').get(
    0).attachEvent('onfocus',my97dp);
     
    var status='${obj.status}';
     
    if(status=='2'||status=='3'){
     
    var t=jQuery('#finishtime').addClass('readonly')
     .attr('readonly',
    true).removeClass('Wdate').get(0);
     t.detachEvent('onfocus',my97dp);
     }
     });
     
    </script>
     
    <input type="text" name="finishtime" id="finishtime" readonly="readonly" class="Wdate">

    posted @ 2008-11-04 18:27 leekiang 阅读(2708) | 评论 (1)编辑 收藏