Thinking in XiaoQiang
世人皆有悲哀,只有你不明白
posts - 56,comments - 150,trackbacks - 0
android SDK中提供了TabHost使用起来很方便, 但是当tab比较多的时候,就会挤在一起,而不能横向的滚动比较麻烦.

      于是我尝试的制作了一个简单的使用Gallery来代替TabHost的例子, 确实够简单的,自娱自乐.....仅供参考

 

     

 

      使用BroadcastReceiver来切换不同的Tab

 

    public class ChangeTabBroadcastReceiver extends BroadcastReceiver {
        @Override
        
public void onReceive(Context context, Intent intent) {
            
int index = intent.getExtras().getInt(CURRENT_TAB_INDEX);
            Log.i(TAG, 
"onReceive index = " + index);
            
// setCurrentTab(index);
            topBar.setSelection(index);
            startGroupActivity(titleList.get(index).toString(),
                    (Intent) intentList.get(index));
        }
    }

 

     没有详细研究SDK中的TabHost实现机制, 使用起来还是有些不方便的地方


public class GalleryTabActivityDemo extends GalleryTabactivity {
    @Override
    
public void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        setDelegate(
new SliderBarActivityDelegateImpl());
        
for (int i = 0; i < 14; i++) {
            Intent intent;
            
if (i % 2 == 0)
                intent 
= new Intent(this, DemoActivity1.class);
            
else
                intent 
= new Intent(this, DemoActivity2.class);

            
this.addTab("title" + i, android.R.drawable.star_on, intent);

        }
//必须在addTab后调用commit, 有点麻烦, 将来会找更好的办法
        super.setup();
    }

//可自定义切换tab时触发的操作
    private class SliderBarActivityDelegateImpl extends
            SliderBarActivityDelegate {
        
protected void onTabChanged(int tabIndex) {
            Log.d(
"onTabChanged""" + tabIndex);
        }
    }
}

最近工作比较忙,没太多时间学习android,将来会慢慢改善, 先凑合用, 抛块砖先, 各位有玉的使劲砸, 金条也行

 下载

posted @ 2010-05-13 15:46 小强 阅读(2096) | 评论 (0)编辑 收藏
学习android的练习小软件.

 

    制作文件管理器的初衷是发现G1上并没有随系统附带文件浏览软件, 考虑到电子书,媒体播放器或其它一些软件会使用到文件浏览,选择文件或文件夹, 所以先做了这个文件管理工具并封装一些参数供第三方程序调用

    应用很简单, 只是把手机和SD卡中的文件列出来, 支持图片和mp3的简单预览. 未来会有更多的功能扩充进来. 欢迎大家试用并提出意见.

--------------------------------------------------------4月更新0.3版 --------------------------------------------------------------------

自从上次更新后工作太忙,半年没玩儿ANDROID了, 最近刚刚闲下来, 继续完善文件管理器

顺便封装了一些其它的widget, 整理后再发上来

 

看着网上铺天盖地的各种android应用, 再看看我这个小破软件, 实在有点拿不出手, 但既然做了就得不断完善下去

目标是做一个封装widget的集合, 方便开发者使用

 

1, 使用线程和handler message机制读取文件列表, 提升软件性能

2, 解决文件列表多次滚动后速度下降的问题

3, 打开文件使用手机关联的应用

4, 增加文件缩略图显示

--------------------------------------------------------10月27日更新0.2版 --------------------------------------------------------------------

1.  0.2版主要增加了一些使用者的功能, 增加了收藏夹功能, 方便用户快速的浏览到经常访问的文件或文件夹

2.  修改了一些for developer的bug

 

 

--------------------------------------------------------  0.1版 --------------------------------------------------------------------

 

   

 

 

 

 

-------------------------------------------------------------------- for developer --------------------------------------------------------------------

G1上并没有随系统附带文件浏览软件, 考虑到电子书,媒体播放器或其它一些软件会使用到文件浏览,选择文件或文件夹, 所以先做了这个文件管理工具并封装一些参数供第三方程序调用,可以做为插件形式使用
把文件管理器封装起来并使用intent机制设置浏览参数和调用
目前暂不支持多文件选择, 将在下一版中发布
调用程序示例

1           Button button2  =  (Button) findViewById(R.id.but2);
2           button2.setOnClickListener(testFileManager);

 

 1  private  OnClickListener testFileManager  =   new  OnClickListener() {
 2           public   void  onClick(View v) {
 3              Intent intent  =   new  Intent( " net.uiiang.android.alkaid.FILEMANAGER " );
 4              
 5               // 参数root_directory, 设置浏览的根目录, 例如设置 /sdcard则只允许程序浏览sd卡中的内容, 当程序回退上层文件夹到/sdcard后不再向上回退
 6               // 参数类型为字符串, 默认为"/"(根目录)
 7              intent.putExtra( " root_directory " " / " );
 8              
 9               // 参数exclude_directory, 设置不显示的目录, 例如设 置"/data", "/dev", 则"/data", "/dev"这两个目录不会显示给用户
10               // 参数类型为字符串数组, 默认不排除任何文件夹
11              intent.putExtra( " exclude_directory " ,
12                       new  String[] {  " /data " " /dev "  });
13  
14               // 参数thrid_party_call, 当第三方程序调用时, 必须设置 此参数为true, 否则下面几个参数不起作用
15               // 参数类型为boolean, 默认为false, 会显示以下参数可设置的 所有菜单(除 选择菜单)
16              intent.putExtra( " thrid_party_call " true
);
17              
18               //  参数directory_show_type, 目录浏览方式
19               //  参数类型为 int, 默认为0
20               //  0 : 显示文件和文件夹(默认)
21               //  1 : 只显示文件
22               //  3 : 只显示文件夹 
23              intent.putExtra( " directory_show_type " 0 );
24              
25               // 参数use_menu_items, 设置显示的预置菜单
26               // 参数类型为:int数组
27               // 菜单列表:
28               //  1 : 上下文菜单-打开  (文件夹)
29               //  2 : 上下文菜单-删除
30               //  3 : 上下文菜单-详细信息
31               //  4 : 上下文菜单-复制
32               //  5 : option菜单-粘贴
33               //  6 : option菜单-新建文件夹
34               //  99: 上下文菜单-选择 , 若需要文件管理器返回一个选中的文件路 径, 则必须设置此菜单
35               //  当用户点击此菜单后, 文件管理器退出并返回给调用程序一个字符串数 组, 数组中包含文件路径信息
36              intent.putExtra( " use_menu_items " new   int [] {  99  });
37              
38               //  参数show_info_in_list, 是否在浏览文件中显示简单的 信息, 如文件夹中包含多少子文件夹和文件
39               //  默认为true
40              intent.putExtra( " show_info_in_list " false );
41              
42               //  参数show_file_extension, 是否显示文件后缀名
43               //  默认为 true
44              intent.putExtra( " show_file_extension " false );
45              
46               //  参数use_simple_view, 是否使用简单文件预览
47               //  用户单击文件后可以简单的预览文件内容, 目前支持图片和音乐文件
48               //  默认为 true
49              intent.putExtra( " use_simple_view " false );
50              
51               //  参数animation_show_list, 是否使用动态效果显示文 件列表, 目前只支持向下卷帘式的效果
52               //  默认为true
53              intent.putExtra( " animation_show_list " true );
54              
55               // 参数mutiple_select, 是否支持多选, 为true可以一次 性选择多个文件或目录
56               // 默认为false
57              intent.putExtra( " mutiple_select " , false );
58  
59              startActivityForResult(intent, SELECT_FILE);
60          }
61      };



通过startActivityForResult调用文件管理器, 并使用上下文菜单选择文件或文件夹

 

 

点击"选择"后, 返回到调用程序

 1      @Override
 2       protected   void  onActivityResult( int  requestCode,  int  resultCode, Intent data) {
 3           super .onActivityResult(requestCode, resultCode, data);
 4           if  (requestCode  ==  SELECT_FILE) {
 5               if  (resultCode  ==  RESULT_OK) {
 6                   //  参数名为selected_uri, 得到字符串数组中包含文件路径
 7                  String[] selectArr  =  data.getExtras().getStringArray(
 8                           " selected_uri " );
 9                   if  (selectArr  !=   null ) {
10                      String selectFile  =   "" ;
11                       for  (String string : selectArr) {
12                          System.out.println( " you select  =  "
13                                   +  data.getExtras().getStringArray(
14                                           " selected_uri " ));
15                      }
16                  }
17  
18              }
19          }
20      }

 

posted @ 2010-05-05 17:10 小强 阅读(268) | 评论 (0)编辑 收藏
     摘要: 1. 0.2版主要增加了一些使用者的功能, 增加了收藏夹功能, 方便用户快速的浏览到经常访问的文件或文件夹

2. 修改了一些for developer的bug  阅读全文
posted @ 2009-10-27 16:05 小强 阅读(1574) | 评论 (2)编辑 收藏
     摘要: 为文件将来做电子书或媒体播放器等程序时浏览文件
把文件管理器封装起来并使用intent机制设置浏览参数和调用  阅读全文
posted @ 2009-10-17 20:21 小强 阅读(2600) | 评论 (2)编辑 收藏
     摘要: 练习作品 一个简单的 android 文件管理器, 支持第三方程序调用  阅读全文
posted @ 2009-10-17 19:50 小强 阅读(1864) | 评论 (1)编辑 收藏
     摘要: 为了体现出android强大的网络功能 写了一个小爬虫程序, 通过网络直接从网站上下载电子书  阅读全文
posted @ 2008-06-30 12:00 小强 阅读(1320) | 评论 (0)编辑 收藏
     摘要: 晚上等着看欧洲杯,闲来无赖接着研究android , 更新了一下uReader  阅读全文
posted @ 2008-06-18 12:46 小强 阅读(1440) | 评论 (4)编辑 收藏
     摘要: 闲来无事, 研究了一下android. 做一个小应用练手.
  阅读全文
posted @ 2008-06-17 17:31 小强 阅读(1834) | 评论 (4)编辑 收藏
     摘要:   阅读全文
posted @ 2008-06-10 17:34 小强 阅读(375) | 评论 (0)编辑 收藏
     摘要: 删除ANDROID数据库  阅读全文
posted @ 2008-06-10 17:30 小强 阅读(1814) | 评论 (0)编辑 收藏
     摘要: android 技巧一, 快速显示修改结果  阅读全文
posted @ 2008-06-03 17:44 小强 阅读(324) | 评论 (0)编辑 收藏
     摘要: device commands:
adb update DATAOPTS - Flash the specified update file.
If file is not passed, update.zip is used.
adb push - copy file/dir to device
adb pull - copy file/dir from device
adb sync [ ] - copy host->device only if changed
(see 'adb help all')
adb shell - run remote shell interactively
  阅读全文
posted @ 2008-06-03 17:36 小强 阅读(1017) | 评论 (0)编辑 收藏
     摘要: adb(Android Debug Bridge)是Android提供的一个通用的调试工具,借助这个工具,我们可以管理设备或手机模拟器的状态。还可以进行以下的操作:

1、快速更新设备或手机模拟器中的代码,如应用或Android系统升级;

2、在设备上运行shell命令;

3、管理设备或手机模拟器上的预定端口;

4、在设备或手机模拟器上复制或粘贴文件;

  阅读全文
posted @ 2008-06-03 17:35 小强 阅读(1479) | 评论 (0)编辑 收藏
     摘要: Android是基于Linux内核的,对于喜欢研究底层的朋友来说,自然不会放过搞明白Linux层面上一些东西的机会。当然,最终目的还是要搞清楚Linux是如何和上层lib以及虚拟机结合的,但是这得等Google完全开源Android之后了。很多关于Linux运行的细节,都可以通过adb的shell来看到。  阅读全文
posted @ 2008-06-03 17:30 小强 阅读(3541) | 评论 (1)编辑 收藏

大学 (一) http://www.blogjava.net/uiiang/archive/2007/05/27/120342.html

    康诰曰:“克明德。”大甲曰:“顾諟天之明命。”帝典曰:“克明峻德。”皆自明也。

    汤之盘铭曰:“苟日新,日日新,又日新。”康诰曰:“作新民。”诗曰:“周虽旧邦,其命惟新。”是故君子无所不用其极。

    康诰说:“能够弘扬光明的品德。”太甲说:“念念不忘这上天赋予的光明禀性。”尧典说:“能够弘扬崇高的品德。”这些都是说要自己弘扬光明正大的品德。

    商汤王刻在浴盆上的箴言说:“如果能够有一天自新,就应保持天天自新,永远不断自新。”康诰中说:“鼓励人们弃旧图新。”诗经中说:“周朝虽然是古老的国家,但却禀受了天命,自我更新。”所以,品德高尚的人无处不追求完善。

    软件开发乃至IT行业的更新速度极快,今天出个JAVA,明天出个.net,后天又来个什么ruby。所以咱们要不断的学习,不断的进步才能跟上技术的更新速度,才能不被淘汰。

    但什么叫自新,这个自新不是说今天出了JAVA,呼啦呼啦的就全买thinking in java去了,明天出了.net又呼啦呼听的全安.net 2005去了。自新是一个发掘和汲取的过程。别一天到晚的看不起struts嫌他麻烦,瞧不上hibernate嫌他浪费性能。人家的技术能在全世界流行,必然有过人之处。想想他为什么能在全世界流行,他体现的是哪种设计思想。多学学人家的优点,想办法把这些优点用在自己的代码上。

    诗云:“邦畿千里,惟民所止。”诗云:“缗蛮黄鸟,止于丘隅。”子曰:“于止,知其所止,可以人而不如鸟乎!”

    诗云:“穆穆文王,于缉熙敬止!”为人君,止于仁;为人臣,止于敬;为人子,止于孝;为人父,止于慈;与国人交,止于信。

    诗经说:“京城及其周围,都是老百姓向往的地方。”诗经又说:“‘缗蛮’叫着的黄鸟,栖息在山丘的角落上。”孔子说:“连黄鸟都知道它该栖息在什么地方,难道人还能不如一只鸟儿吗?”

    诗经说:“品德高尚的文王啊,为人光明磊落,做事始终庄重谨慎。”做国君的,要做到仁义;做臣子的,要做到恭敬;做子女的,要做到孝顺;做父亲的,要做到慈爱;与他人交往,要做到讲信用。

    经常看到论坛上有人抱怨,自己的工作单调只不过是复制粘贴别人的代码。可你有没有想过为什么去复制粘贴,是因为他的代码写得太好了,放到哪里都能用?还是架构设计得不合理,需要重构。如果是好,他好在哪里,他为什么这么写。如果不好,又不好在哪里,应该怎么改,如果是你来设计,你又会怎么做来避免犯这样的错误。

    很多人抱怨自己在一个小公司不得志,可有没有想过为什么在这种小公司。你有没有给IBM,google这样的公司投过简历,投了简历有没有面试,面试了这些大公司为什么不要你,而是录用了别人。要摆正心态,找到自己的位置。你可以觉得不得志,但要有真才实学。庞统那么大的才,到了刘备手下不还是先被发配去当县令。是金子终要发光的,后来刘备不也终于认识到庞统的才能并委以重任吗。可如果你啥都不会,看这个看不起,瞧那个瞧不上。一天到晚就知道上网聊天打游戏泡MM。就算到了曹营也就当个蒋干,成事不足败事有余。要本着谦虚学习的态度来对待工作对待周围的人,要学会从别人身上发现优点。

    诗云:“瞻彼淇澳,菉竹猗猗。有斐君子,如切如磋,如琢如磨。瑟兮僩兮,赫兮喧兮。有斐君子,终不可諠兮!”如切如磋者,道学也;如琢如磨者,自修也;瑟兮僩兮者,恂栗也;赫兮喧兮者,威仪也;有斐君子,终不可諠兮者,道盛德至善,民之不能忘也。

    诗经说:“看那淇水弯弯的岸边,嫩绿的竹子郁郁葱葱。有一位文质彬彬的君子,研究学问像加工骨器一样,不断切磋;修炼自己像打磨美玉,反复琢磨。他庄重而开朗,仪表堂堂。这样的一个文质彬彬的君子,真是令人难忘啊!”

    这里所说的“加工骨器,反复琢磨”,是指做学问的态度;“像打磨美玉,反复琢磨”,是指自我修炼的精神;说他“庄重而开朗”,是指他内心谨慎而有所戒惧;说他“仪表堂堂”,是指他非常庄重;说“这样一个文质彬彬的君子,真是令人难忘啊!”是指由于他品德非常高尚,达到了最完善的境界,所以使人难以忘怀。

    不要为了工作而工作,为了写代码而写代码。既然干了这行了就要干好,即使不求名扬天下,至少要也对得起自己这么多年的努力吧。我带过几个手下,我每次安排任务后都会说:认真干活,只要干完活,你去打CS我都不管。我说这话的目的是不想给大家太多压力,大家都挺辛苦都不容易。只要干完活,该聊天该上网随便你。可如果真正会学习的人,就应该明白,自己干的那些活,永远是别人安排的。要想多学东西,还得根据自己的特点和能力补充知识。自己写的代码是不是已经无懈可击了,有什么地方值得优化,实现方法是不是可以用更优雅的方式。

     总之,心中要想着不断进步,要么不做,做了就要做到更好。

posted @ 2007-05-29 13:05 小强 阅读(1071) | 评论 (1)编辑 收藏
        这两三年来,生活一直被工作占据着,习惯了用工作来充实的生活,闲下来却非常无聊。即使不加班的时候,回到家里也不知道干点什么好,于是下意识的又开始写代码,学新技术。这样的生活单调乏味,人也变得无趣起来。于是决定,从今天起在家休息的时间,不再写代码。重新找回以前的兴趣,丰富业余生活。想起以前上学时住校,闲得没事做就到图书馆借书,反正呆着也是呆着,那会儿什么书都看,从古今中外概不排斥。可惜工作后再没这闲心了。

        今天休息,在家翻了翻书柜,读一读大学。蓝色字是原文,红色的字是我的一些理解,如果有错的地方,还望大家指正,谢谢。

        大学之道,在明明德,在亲民,在止于至善。知止而后有定,定而后能静,静而后能安,安而后能虑,虑而后能得。物有本末,事有终始,知所先后,则近道矣。

        大学的宗旨在于弘扬光明正大的品德,在于使人弃旧图新,在于使人达到最完善的境界。知道应达到的境界才能志向坚定;志向坚定才能够镇静而不骄躁;镇静而不骄躁才能够心安理得;心安理得才能够思虑周详;思虑周详才能够有所收获。每样东西都有根本和枝末,每件事都有开始和终结(还记得黑客帝国3里,先知说的那句话吗?Everything that has a beginning has an end。大概先知也读过大学)。明白了这本末始终的道理,就接近事物发展的规律了。

        在软件开发过程中,我们经常会遇到很多问题。其实每一个客户需求都是一个大问题,是一堆问题的总合。这就需要我们在编程之前,明白自己要做什么(知止而后有定),要认真的分析我们的需求和目标。这样才能不被一堆稀奇古怪的问题吓倒,能够让我们从容的面对这些工作(定而后能静)。初学者经常犯一个错误,就是不分析问题。调试出错代码的时候,经常是一遍一遍的运行错误的代码,然后看着报错信息发呆。而不知道如何分析错误所在,也不知道在哪里打印几行标志来找出出错的代码的位置。于是越看越乱,越乱越心慌。这时候就需要先静下心来不要被一个报错信息吓到(静而后能安)。只有静下心来,才能想到其实任何报错信息,都是有根有据的,只要根据提示信息中给出的线索,或者在代码中打印几条标志信息,或者根据你输入的信息运行的类或方法去推理,就能够找到出错的地方(安而后能虑)。当你做到这一步,你就找到问题的所在了,经验值又增加了(虑而后能得)。

        就像刚才所说,任何代码任何错误,都是有根有据不会凭空出现。我们软件开发人员的工作,就是解决一个一个的问题。只要能把这些问题分析得当,条理清晰的列出来,就离成功不远了。

        很多初学编程或刚刚工作的人都会报怨,看不懂代码,不知道业务逻辑所以没法工作。其实做事的时候,不要一上来就想一次解决问题,要循序渐进,你连代码出错出在哪里都不知道,怎么去修改错误。要先找到出错的代码是哪个文件,是从哪里进入的,又经过哪些方法的调用,要明白这些代码的业务逻辑。如果不明白就先注释起来。初学的时候要学会分析问题的方法,找到问题的关键点,每行代码其实都是在调动数据,但有些调动是对当前业务没有影响的这些可以先排除掉,那些会对后面的业务逻辑产生影响的,都是问题的关键点。初学者不要嫌麻烦,遇到这些关键点一定要注释。就算不明白整个的业务逻辑,单独一行代码的意思总该明白吧,无非就是添删查改和方法调用嘛。当你把这些代码通读一遍并都注释后,就可以把这些注释当成读小说一样读下来,再复杂的业务逻辑也应该能读明白了。

 

        古之欲明明德于天下者,先治其国;欲治其国者,先齐其家;欲齐其家者,先修其身;欲修其身者,先正其心;欲正其心者,先诚其意;欲诚其意者,先致其知;致知在格物。
        物格而后知至,知至而后意诚,意诚而后心正,心正而后身修,身修而后家齐,家齐而后国治,国治而后天下平。
   

        古代那些想在天下弘扬光明正大品德的人,先要治理好自己的国家;要想治理好自己的国家,先要管理好自己的家庭和家族;要想管理好自己的家庭,先要修养自身的品性;要想修养自身的品性,先要端正自己的心思;要想端正自己的心思,先要使自己的意念真诚;要想使自己的意念真诚,先要使自己获得知识;获得知识的途径在于认识和研究万事万物。通过对万事万物的认识,研究后才能获得知识;获得知识后意念才能真诚;意念真诚后心思才能端正;心思端正后才能修养品性;品性修养后才能管理好家庭和家族;管理好家庭后才能治理好国家;治理好国家后天下才能太平。

  咱们先不说什么治国之论,单就软件开发这个行业来讲。很多人都在抱怨公司小挣钱少管理混乱感觉屈才之类的。可你真的有这么大才吗,那些刚刚毕业的学生,在学校里玩儿了四年。到公司时什么都不会白纸一张,就像我以前发过的一个文章里说的。都不用说敬业精神,当你连最起码的认真工作都做不到时,还有什么资格说公司给你的工资太少,对不起你的工作量。

  要么别做这份工作,别接受这个任务,既然做了就要做好。不要把工资少当成不认真工作的借口。你再不认真工作,该被剥削的地方谁也跑不了,老板还是要赚他的钱。但工作经验是自己的呀!!! 软件开发这个工作需要不断学习不断的进步才能保持自己的位置。而软件开发正是需要认真工作,才能体会出其中的奥妙,体会其中的精华所在。要想让自己将来有好的发展,就要先做到自律,休息的时候当然要玩儿,但上班的时候就要以工作为重。要想自律就要提高自身修养,提高自己对工作重要性的认识。要想提高自身修养,就要端正自己的心态,上班的时候不要总去想什么窗外的高楼街上的美女。要想端正心态,就要让自己的意念真诚,要真心的认真负责的对待自己的工作,对待自己手中写出的每一行代码。这时就需要先获得知识,要学会这些技术,不然什么都不懂的人只能复制粘贴别人的代码,却不知道这些代码在干什么,往往复制错了自己却混然不知。

  自天子以至于庶人,壹是皆以修身为本。其本乱而末治者否矣,其所厚者薄,而其所薄者厚,未之有也!

  上自国家君王,下至平民百姓,人人都要以修养品性为根本。若这个根本被扰乱了,是不可能治理好家庭甚至国家天下的。不分轻重缓急,本末倒置却想做好事情,这也同样是不可能的。

  就像刚才说的,刚工作的人工资少工作累这是事实情况,大家都是从这一步走过来的。只有经历过这一步,才能明白认真工作和提高工作效率的重要性。要想提高工作效率,就要提高自身能力,就要积累工作经验。可工作经验这东西并不是说来就来的,需要自己刻苦努力才能得来。并不是说明天把你送到IBM或者什么大公司,给你好多好多钱,给你换了一个超美的工作环境。你就突然什么都会了什么都懂了。当你什么都不会还净犯错的时候,真的到了这种环境中,周围都是高手,你还好意思和别人打招呼吗?

posted @ 2007-05-27 20:27 小强 阅读(1376) | 评论 (4)编辑 收藏
  很久没有上blogjava了, 自从离职后, 从过春节到现在, 家里发生了很多事, 搞得我晕头转向. 一直没有去找工作. 最近终于稳定下来. 
  休息这段时间, 为了保持自己的工作状态, 并且希望将这几年工作中学习到的技术, 做一个总结, 便产生了开发自己的网站想法.

  www.songguo.net

  从功能上讲, 以译客为主. 由网友发布文章, 其它网友来对文章进行翻译. 可以翻译整篇文章, 也可以只翻译其中一个片段.
  网友还可以对别人的翻译进行投票, 当有人点击一个片段时, 翻译的结果也会根据其它网友的投票结果排序显示出来.

  另一个小功能是股票管理. 现在只实现了很小一部分功能. 主要想法是最近股市火热, 我也不幸上了贼船, 可是在公司上班时, 明目张胆的打开股票软件未免有点太嚣张了. 而且现在的股票软件太显眼, 老远一看就知道是什么. 
  于是受google的简约主义影响, 做了这个尽可能简化功能和界面的小功能. 界面上的各个面板都可以通过点击标题栏关闭, K线图也可以直接点击关闭. 这样可以很快的隐藏自己, 嘿嘿~~

  技术上讲的话, 网站使用了大量的开源技术, 基本的struts, spring hibernate就不说了, 火爆的AJAX也根据性能和需求的考虑也用到了. AJAX方面主要使用了DWR框架.  其它的技术像url重写之类的也是能用就用.
  
  过去几年一直是在做企业应用的开发, 这是我第一次做通用型的网站, 实在没什么经验.  而且完全是一个人做, 没什么借鉴, 只能分析一下别人的网站来模仿.   在很多功能的实现上也经常找不到最好的解决方案, 很想知道那些成熟的网站中, 是如何设计的. 现在只能一边摸索一边做了

  由于时间仓促, 很多想法还没有实现, 也有不少BUG, 衷心希望大家能给我多提意见. 谢谢
 
posted @ 2007-03-21 09:53 小强 阅读(1816) | 评论 (22)编辑 收藏
一年又要过去了,人长大了喜欢怀旧, 怀念小时候的伙伴, 小时候的胡同, 小时候的一切.
 
      想想小时候, 天天盼着过年, 能放鞭炮, 有压岁钱, 有好吃的, 可以打雪仗堆雪人, 可以熬夜看电视, 可以和小伙伴吹各种各样的牛, 那时候的生活简单又快乐.
      现在长大了怕过年, 过年意味着又长一岁, 意味着又在这个世界上浪费了一年的时间. 现在过年没气氛, 电视里演着无聊的晚会, 千篇一律的电视剧. 小时候见到长辈嘴甜点儿, 收个五块十块的压岁钱, 乐的屁颠屁颠的. 现在我也变成长辈了, 见到了晚辈一出手就得200, 人家还嫌少呢.
 
      小时候的生活那么单纯, 梦想也是那么单纯而模糊, 和许多小伙伴一样,我曾经梦想过当解放军, 梦想过当科学家,当天文学家.
      人越长大, 梦想变得越现实, 上学时梦想能天天考100分, 梦想周末能去公园. 梦想将来能上个好的大学, 梦想能早点长大不上学.
      现在真的不上学了才发现, 还是学校好啊~~~~ 没有说不清的税交不完的钱. 没有没完没了的加班, 没有没完没了的代码. 没有各种各样的假货, 没有防不胜防的掺毒食品.
 
      现在梦想着能有个不加班的工作, 梦想能下班有时间到后海散步, 梦想周末能和朋友去公园. 梦想着房子降价, 梦想着不在堵车.
 
      想想小时候的梦想, 还是单纯而熟悉, 模糊又清晰. 它是那么的近, 近得好像就在昨天,近得还能听到那时候开心的笑声. 它又那么的远, 仿佛永远不能实现.
      想想现在的梦想, 它不在是五光十色, 充满了苍白和无奈, 它还是那么近, 压得我喘不过气. 它还是那么远........
 
      曾经对21世纪充满无限憧憬的四有新人, 现在却落得为了挣一点点钱, 为了一个房子, 放弃尊严, 放弃自由,放弃梦想.
 
      去年也是在这个时候, 朋友问我是不是怀念过去的生活,那时候很迷茫. 可惜这一年的时间过去了, 面对这个问题我还是那么迷茫. 我只能再把去年的答案搬出来
 
    我喜欢1990年以前的生活,那时候的社会还比较单纯.
    我喜欢1995年以前的生活,那时候周围的人还比较单纯.
    我更喜欢2000年以前的生活,那时候的我还比较单纯.
posted @ 2006-12-22 00:41 小强 阅读(497) | 评论 (6)编辑 收藏
 今天突然发现, 键盘的空格键被磨出了一个坑......
 在02年的时候,刚买电脑不久, 电脑的 ASDW 被磨没了, 那时候成天打游戏, 尤其是FIFA.
 过了一两年, ALT+S被磨的很多, 那时候聊QQ比较多.
 今天发现, 空格被磨出了坑, 看来平时写代码和QQ比较多
 其次被磨的比较多的是 < 键 , 是因为最近HTML比较多. 接下来就是ctrl , 回车, C, V 三个键, 写代码的几个经典按键都有非常明显的磨痕.
 还有左面的shift, ctrl , alt虽然没有严重磨损, 但明显要比右面的功能键干净, 是因为写代码时, 我习惯使用左面的功能键来搭配快捷键的使用.
 
几年来电脑一直陪在我身边,  虽然我不承认自己有所谓的电脑瘾或者网瘾, 但对电脑和网络有很深的依赖是个事实. 工作生活中无处不需要电脑.
从按键的磨损程度上, 可以看出几年来我的兴趣爱好和工作的变化. 再过几年, 又会是哪个键被磨平呢?
但愿N年后再发现有新的磨损组合时, 我依然能像5年前那样开心的坐在电脑前面
posted @ 2006-12-04 22:55 小强 阅读(395) | 评论 (2)编辑 收藏
       刚才看了SeamanWang的文章
http://www.blogjava.net/wanghaikuo/archive/2006/11/09/80054.html


       想想自己的经历...........
       现在一听"能者多劳" 这四个字, 我就烦, 也不知道是哪个SB发明了这个词, 也许这个词并没有错.
       但是用到项目里, 就全变味了, 就这么简简单单的四个字, 就能把人累个半死.
       每次一有任务, 全都堆到我身上.
       经理说你是高手, 这活太急了, 只能交给你. 然后就什么都不管了, 反正每个月的工资数都是定好的, 能怎么使唤就怎么使唤了.
       同事说: 你是高手, 这种活我们干不了, 只能交给你. 然后就在旁边聊天的聊天, 看小说的看小说. 到了下班时间, 大爷似的拍拍屁股就走了, 留下我一个人拼死累活的加班. 

       少给我戴高帽子, 谁也别装傻, 项目组里那么多人, 什么紧急项目非得压在我一个人身上. 
       少给我戴高帽子, 谁也别装傻, 觉得自己不是高手, 就多干点活, 少看小说
       
       一直很奇怪, 每次路过同事电脑前时, 他肯定是在看小说, 聊天, 看网页.  最无聊的时候就是杀毒, 然后两眼呆呆着盯着杀毒软件的进度条..........
      
        去TMD高手, 我不是高手.
posted @ 2006-11-09 13:40 小强 阅读(925) | 评论 (10)编辑 收藏
       看到这么多人点击我的博客, 我很欣慰呀. 
       大家可能有不认识我的,我是京城IT业的一个小字辈, 混到今天确实很不容易. 我是从打字员做起的,打字, 复印传真, 业务咨询...
       刚入行的时候, 先是学了一段VB,后来学过JAVA, 现在正在研究ruby.
       经历过十冬腊月大雪纷飞,也经历过大雨倾盆. 有一年上班天寒地冻大雪铺路,学院路上连条狗都没有. 我在雪地里骑着自行车,吭哧吭哧了一个半小时才到公司. 然后想起来今天是周日不上班.  这么艰苦的日子也有过. 但是我也坚持到了今天.
posted @ 2006-11-08 23:03 小强 阅读(1046) | 评论 (6)编辑 收藏

转自:http://mailboxpublic.googlepages.com/ubuntu%E6%98%AF%E6%80%8E%E6%A0%B7%E7%BB%83%E6%88%90%E7%9A%84

这篇文章在互联网上被广泛转载,但是很多都不完整,误导新手。同时有许多人根本不尊重作者的辛勤劳动,没有给原文署名。因此,我把它放到googlepages来,作为正式的文章。如果有商业用途,请联系本人:yulewang \at gmail \dot com

 [转载请保持原样,请勿擅自修改,以免误导新手]
yulewang 翻译 整理

二十一世纪到了,每个人都强调自己的个性,于是一种叫做DIY的东西悄然兴起。
操作系统作为全人类智慧的结晶,自然DIY起来难度极大,因而DIY出一个操作系统成就感绝对比买宜家的东西的成就感大。
为了不至于从头开始编写一个操作系统,我们当然把采用现成的操作系统作为一个底线。
当然,我们可以通过LFS让我们爽到底,但是,能够做到LFS的人可真的是凤毛麟角。而且更重要的是LFS简直在挑战我的忍耐程度。
我的这篇文章,教大家如何DIY一个自己的ubuntu发行版。在非常节省时间的情况下,达到耍酷的目的。

就好比LFS一样,我们需要一个创作基地。我们首先建立一个变量。建立这个变量的好处很明显,即使你不用~/diy_ubuntu这个目录,一样可以照着这个文章继续做下去。
$ export WORK=~/diy_ubuntu
$ mkdir -p $WORK

然后我们把光盘镜像文件挂到/mnt
$ sudo mount -t iso9660 -o loop dapper-live-i386.iso /mnt
$ cd $WORK

复制文件光盘文件
$ mkdir ubuntu-livecd
$ cp -a /mnt/. ubuntu-livecd
$ chmod -R u+w ubuntu-livecd
$ sudo umount /mnt

由于光盘中包含了很多windows下面的自由软件,我们来把不必要的文件删除。当然你可以保留。
$ rm -rf $WORK/ubuntu-livecd/programs

把光盘中的压缩文件挂起来,这个样子以后你可以在$WORK/old目录中看到一个完整的linux操作系统的目录。
$ mkdir $WORK/old
$ sudo mount -t squashfs -o loop,ro $WORK/ubuntu-livecd/casper/filesystem.squashfs $WORK/old

我们建立一个2GB大小的文件系统,然后把这个文件当作一个设备文件格式化,结果系统给出了一个警告,别理会它,选择是就是。
$ sudo dd if=/dev/zero of=$WORK/ubuntu-fs.ext2 bs=1M count=2147
$ sudo mke2fs $WORK/ubuntu-fs.ext2

然后我们把这个空文件系统挂起来。
$ mkdir $WORK/new
$ sudo mount -o loop $WORK/ubuntu-fs.ext2 $WORK/new

复制linux操作系统的文件.由于我们事先得到的linux是压缩的,所以我们把它解压了。
$ sudo cp -a $WORK/old/. $WORK/new

当然现在$WORK/old就没有用处了。废掉它
$ sudo umount $WORK/old

我们首先进入刚才得到的那个操作系统
$ sudo cp /etc/resolv.conf $WORK/new/etc/
$ sudo mount -t proc -o bind /proc $WORK/new/proc
$ sudo chroot $WORK/new /bin/bash

现在你就进入系统了,高喊linux for human beings,大炼ubuntu,想干什么就干什么。
# vi /etc/apt/sources.list #选择适合你的源
# apt-get update
# apt-get dist-upgrade
# apt-get install 你想装的软件
# apt-get clean
.... #更多的配置
最后离开你的那个操作系统
# exit

$ sudo umount $WORK/new/proc
$ sudo rm $WORK/new/etc/resolv.conf
现在你已经回到了你的初始状态中

把manifest重新整一遍
$ sudo chroot $WORK/new dpkg-query -W --showformat='${Package} ${Version}\n' > $WORK/ubuntu-livecd/casper/filesystem.manifest

然后做一下“磁盘清理”
$ sudo dd if=/dev/zero of=$WORK/new/dummyfile
$ sudo rm $WORK/new/dummyfile

重新压缩系统
$ sudo rm $WORK/ubuntu-livecd/casper/filesystem.squashfs
$ cd $WORK/new
$ sudo mksquashfs . $WORK/ubuntu-livecd/casper/filesystem.squashfs

你的改动都保存了。现在把$WORK/new废掉
$ cd $WORK
$ sudo umount $WORK/new

把文件的md5重新算一下
$ cd $WORK/ubuntu-livecd
$ sudo find . -type f -print0 |xargs -0 md5sum |sudo tee md5sum.txt

建立光盘镜像,命令很长,忍受着点。
$ cd $WORK
$ sudo mkisofs -o ubuntu-new.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -r -V "My Cool Ubuntu Live CD" -cache-inodes -J -l ubuntu-livecd
然后你就可以用iso把光盘烧了

然后你就可以在别人前面耍酷了。最后,王子和公主过着幸福的生活

posted @ 2006-10-31 15:58 小强 阅读(340) | 评论 (0)编辑 收藏
Ubuntu Live CD 个性化定制全程图解

转载,未测试

个性化定制最为明显的好处就在于能够真正适合自己的需要。想要个性化定制 Ubuntu 的 Live CD 吗?想要体验 DIY 的乐趣吗?本文将以图解的方式全程为你提供指导与帮助。

选择工具

“工预善其事,必先利其器”。选择一款合适的定制工具,对于普通用户来说尤其重要。这儿有两种 Ubuntu Live CD 的定制工具:UCK 和 Reconstructor。前者可以增删 Live CD 中的语言包和应用程序,后者能够提供从 GNOME 桌面到应用软件的多方面定制功能。本文选择 Reconstructor 作为 Ubuntu Live CD 的定制工具,读者朋友也可以自行尝试 UCK。

前期准备

在正式定制之前,应该做好这些方面的准备工作:制作或收集需要用到的定制资源,如主题、壁纸、模块等等;Ubuntu Live CD 的原始 ISO 映像(Reconstructor 支持 6.06 及 6.10);从 Reconstructor 官方网站下载定制程序;安装 Reconstructor 的使用依赖,如 squashfs-tools、libbogl-dev、mkisofs 等(详见 readme.txt 文件)。

定制过程

执行程序

tar xvzj reconstructor-2.0.tar.gz
cd reconstructor-2.0/
sudo python reconstructor.py

Reconstructor 在启动时会检查使用依赖,并提示用户安装未完成的依赖。接着会进入欢迎页面。




创建工作目录
Reconstructor 默认会将工作目录创建于 /home/username/reconstructor,另外分别创建 remaster、root、initrd 三个子目录。工作目录仅在首次使用时才有必要创建,如果是再次使用,则无需创建。因为我们是初次使用,所以勾选其中的三个选项。然后,在 Live CD ISO Filename 选择先前下载好的原始 Ubuntu Live CD ISO 映像文件。




定制引导屏幕
引导屏幕这部分可以定制 Live CD Splash 图像、引导选项文字的颜色、以及 Usplash 图像。需要注意是,Splash 图像要求是 pcx 格式,而 Usplash 则是编译好的 so 文件(对于 Ubuntu 6.06,Reconstructor 支持直接生成)。设置后,点击“Apply”按钮以便生效。




GNOME 桌面的定制
GNOME 桌面包括登录屏幕、桌面、主题三部分的定制。其中,在登录屏幕中可以设置 GDM 主题、Splash 屏幕、背景颜色;桌面部分能够定制壁纸和字体;在主题中可以选择 GNOME 桌面所用的主题及图标。对于这些定制,用户既可以选择系统自带的,也可以使用自己的。从 GNOME LOOK 上可以找到这方面的丰富资源。




定制 Apt 源
通过定制 Apt 源,就能够直接在 Live CD 中使用这些扩展的源,以便安装需要的应用程序。在你需要使用的源前打勾选择即可。对于其他的源,可以输入到下面的文本框中。




优化启动及关机过程
在启动部分,可以选择在系统启动时需要运行的守护进程,如 ppp、laptop-mode 等。同时,Reconstructor 也能够对关机过程进行优化。




设置用户及口令
切换到 Live CD 选项页,对在 Live CD 中要用到的用户、口令及主机名进行设置。




定制应用程序
Reconstructor 的模块功能可以让用户按需定制应用程序,如安装程序、删除程序等。普通用户可以使用 Reconstructor 提供的现有模块:包括图像处理软件、生产力软件、多媒体软件、网络软件、服务器软件、及其他软件等。如果现有模块不能满足你的要求,那么可以通过输入安装或删除命令来实现对于软件的定制。




构建选项
注意以上每一个部分的定制都需要点击“Apply”按钮。现在按“Next”进入构建选项页。在此设置 Ubuntu Live CD ISO 文件的保存路径、名称、架构。如果所有的都没有问题,那么继续下一步吧。




定制结束
此时,需耐心等候一阵,直到看到 Finished 页面。




最后测试

在 Ubuntu Live CD 定制结束后,先不要忙着刻盘,在虚拟机中测试一下,如果确认没有问题,那么就烧录并与朋友分享吧
posted @ 2006-10-31 15:48 小强 阅读(962) | 评论 (0)编辑 收藏
转自:http://blog.rubypdf.com/2006/10/20/install-ruby-on-rails-lighttpdsqlite3-and-mongrel-under-ubuntu/

nothing but the script I used:
#install Mysql
apt-get install mysql-server

#install Ruby and relative
apt-get install irb libdbm-ruby1.8 libgdbm-ruby1.8 libmysql-ruby1.8 libmysqlclient14 libopenssl-ruby1.8 libruby1.8-dbg mysql-common ri ri1.8 ruby1.8-dev

#install rubygems
wget http://rubyforge.org/frs/download.php/11289/rubygems-0.9.0.tgz
tar zxfv rubygems-0.9.0.tgz
cd rubygems-0.9.0
ruby setup.rb
gem update –system

#install Rails and dependencies
gem install rails –include-dependencies

#before install Mongrel,
apt-get install install build-essential #we need it to compile mongrel and Sqlite3

#intall Mongrel
gem install mongrel –include-dependencies

#install Sqlite3
apt-get install sqlite3 swig libsqlite3-ruby libsqlite3-dev
gem install sqlite3-ruby #compile this need libsqlite.h

#install Lighttpd
apt-get install lighttpd

some useful link
http://mongrel.rubyforge.org/docs/lighttpd.html
http://fo64.com/articles/2005/10/20/rails-on-breezy
http://scottstuff.net/blog/articles/2006/07/23/typo-installer

posted @ 2006-10-30 17:09 小强 阅读(1023) | 评论 (2)编辑 收藏

转自:http://www.urbanpuddle.com/articles/2006/06/10/install-ruby-rails-on-ubuntu-dapper-drake

This is a small guide I wrote up to installing Ruby on Rails on Dapper Drake. It covers getting lighttpd running to support both rails and php which will be useful to anyone who likes to use phpmyadmin along with ruby on rails. It's similar to the article I wrote earlier for Arch Linux except modified for Ubuntu's Dapper Drake release.

1. Make sure the universe repository in /etc/apt/sources.list is uncommented:
deb http://us.archive.ubuntu.com/ubuntu dapper universe
deb-src http://us.archive.ubuntu.com/ubuntu dapper universe

2. Make sure you are up to date:
sudo apt-get update
sudo apt-get dist-upgrade

3. Install the ruby base packages:
sudo apt-get install ruby ri rdoc mysql-server libmysql-ruby

4. We need to grab the latest ruby gems from rubyforge. You may need to modify this command if a version after 0.90 is available.
sudo wget http://rubyforge.org/frs/download.php/11289/rubygems-0.9.0.tgz
tar -xvzf rubygems-0.9.0.tgz
cd rubygems-0.9.0
sudo ruby setup.rb

5. Now let's install Ruby on Rails!
sudo gem install rails --include-dependencies

6. We have Rails but we still need lighttpd and mysql. I've thrown in PHP too in case you want to manage your database with phpmyadmin like I do. Let's grab all the packages, shall we?
sudo apt-get install lighttpd php5-cgi php4-cgi php5-mysql php5-mysqli php4-mysql libfcgi-dev libfcgi-ruby1.8

7. Modify your /etc/lighttpd/lighttpd.conf file to set up your domains. Be careful because by default Ubuntu maps all the images so that they are taken from /usr/share/images instead of your/rails/root/public/images so if you're wondering why your rails app is working but your images aren't being displayed this is why. You can take out the offending code in your lighttpd.conf or just put your images in /usr/share/images.

8. Time to enable some modules for lighttpd. There are others that you may need but they should be enabled in your lighttpd.conf. Personally, I'm not a fan of enabling modules two different ways but I'm sure this will get cleaned up eventually.
sudo /usr/sbin/lighty-enable-mod fastcgi
sudo /usr/sbin/lighty-enable-mod proxy
sudo /etc/init.d/lighttpd force-reload

9. Let's make sure that there are no errors by stopping lighttpd and then starting it manually:
sudo /etc/init.d/lighttpd stop
sudo lighttpd -f /etc/lighttpd/lighttpd.conf

If you have errors there make sure you take a look and try to address them! The output you see will be your best bet in getting help from somebody on one of the forums.

10. Install some basic gems you might need to run your rails app:
sudo gem install actionmailer
sudo gem install activesupport
sudo gem install actionpack
sudo gem install actionwebservice

And now you should have a new, shiny, ready to go Ubuntu Dapper Drake server just waiting for your PHP or Ruby on Rails applications!
posted @ 2006-10-30 17:07 小强 阅读(365) | 评论 (0)编辑 收藏
     摘要: Capistrano: Automating Application Deployment Application deployment is one of those things that becomes more and more complicated as the scale of your application increases. With just a single box...  阅读全文
posted @ 2006-10-30 14:00 小强 阅读(866) | 评论 (0)编辑 收藏
     摘要: A Guide to Testing the Rails Intended Audience This article is for fellow Rubyists looking for more information on test writing and how that fits into Ruby On Rails. If you’re new to test writin...  阅读全文
posted @ 2006-10-30 14:00 小强 阅读(795) | 评论 (0)编辑 收藏

前几天在我的blogjava上和CSDN上发过一个帖子: 说一说编程恶习.
http://community.csdn.net/Expert/topic/5091/5091887.xml
http://www.blogjava.net/uiiang/archive/2006/10/16/75502.html

几天的时间收到了很多网友的回复.
我发这个帖子时, 并不是想讨论技术问题, 也不是为了抱怨, 只是想以另一种方式, 来提醒一下编程的初学者, 和一些所谓"经验丰富"的老程序员. 因为我发现传统的写一篇编程规范的文档, 似乎并不能引起大家足够的重视. 垃圾代码仍然一出再出.

我在帖子中所说的问题, 也并不需要太多的技术经验和深厚的专业知识. 都是一些随手而来的小问题, 解决这些问题的方法只需要工作时认真负责, 多动动脑子就行了.

在帖子的回复中, 有几个回复让我很在意:
==================================================================
钱给的太少,能对付过去就完了
社会上什么行业不是这样,能对付就行了 。

要改变这种情况, 那还要上边有改变的想法,改善一下工作环境,等等。 。

老板们吃的是良心,拉的是思想

我们那么认真干啥
=====================================================================

我对这种说法非常的不赞同, 代码写的再差, 老板还是要赚他的钱, 该被剥削还是跑不了.
可如果把这个当成不认真工作的理由, 那就只能永远自己吃亏了.
如果总是这么不认真工作, 不养成良好的工作习惯, 自已思考的习惯, 那就永远不能进步
只能当一辈子代码民工, 一辈子给这种垃圾老板打工.

要明白一点, 好的编程习惯, 思考能力, 都是在平时工作当中, 一点一滴的积累起来的.
并不是当有人给了你一个好的工作环境后, 想变出来就能立刻变出来的.

老板对不起咱们是另一回事, 但自己是不是能对得起自己, 那就看你自己的想法了

态度决定一切

posted @ 2006-10-30 10:28 小强 阅读(1966) | 评论 (10)编辑 收藏

         最近在做一个汽车销售系统的改善工作, 这个系统已经运行两年了, 两年来, 客户不断的提出新需求, 系统也在不断的改来改去。 这次轮到我来改它了。   想想 N 年前初学编程的时候, 书上, 网上, 杂志上不断的在说, 要养成良好的编程习惯。 然后还给出了 N 长的一大篇文章来介绍一些编程规范。 我这个人是很懒的, 大概的看了一下就过去了。 没有特意的记什么。 好在我这个人也不是特别的懒, 对自己的工作也是很上心。 编程的时候尽可能做到更好。 性能功能能考虑到的都要做到最好。   慢慢的也养成了一些编程的习惯,   时间长了, 下意识的就去遵守一些模式,模范之类的东西了。
        
有了这些习惯, 再看这次修改的系统, 真的是生可忍熟不可忍了。   这次我也不说什么编程规范了, 我就说说这些编程恶习

        
一,   程序没有注释
      
注释 !! 注释 !!! 如果只是打印了一个 HELLO WORLD 您不注释那也就算了, 如果是只有一两百行的小功能类您不注释, 那我也忍了, 可是 3000 多行一个类的业务逻辑代码, 您老人家还不注释 !!!   TM 让我怎么去改代码,   一点业务逻辑的说明都没有, 我改代码的时候,得一边用 DEBUG 调试, 一边替他加注释。 然后才能进行自己的工作。 几千行的一个类,   一行注释都没有, TM 就不觉得颜色单调了点吗 ?

      
二,   不遵守基本的编程约定
      
变量名大小写混乱, 明明是变量, 非要完全大写, 要不就大写开头。 要不就是方法名全是大写, 最牛 B 的一个方法是用中文做方法名, 你丫这时候想起打中文来了, 累不累呀。

       还有人用拼音做变量名方法名,就算您英文不好,稍微查一下金山词霸行不行,现在百度和 GOOGLE 都有翻译功能,稍微查一下英文,也当是学英语了行不行? 您实在太忙的话,不查也就算了,拼音就拼音吧,好赖也算是中国话的。 可是您就别用拼音简写了,英文简写还认不出来呢, 您还用拼音的开头字母当变量名, 那我 TM 上哪儿猜去呀!

 

       三, 不明就里的代码

       系统中经常会出现这样的代码,尤其是在 controller 里居多:

       // some code

       If(flag .equals(“submit”)){

       model.getInfo();

}else{

       model.getInfo();

}

我没写错, if else 调用的方法完全一样,大家也放心,我仔细的看过调用的代码,调用的方法里,也没有根据其它情况来改变他的运行路线。我就不明白为什么要做这个 if 判断了。担心会有什么特殊的业务逻辑, 所以也不赶随便去改他。 猜了半天,感觉最理想的答案是写代码的人,担心以后会有新的逻辑分支, 所以在这里用 if 预留了一个位置, 以后改的时候方便。

数日之后有幸遇见了当初写这代码的老兄,问过之后立刻晕倒,原来是这个代码是参照别的模块的样子写的,别的模块在这里都有 N 个程序分支,通过 if 来判断后决定调用哪个 model 里的方法。但他这个模块很简单,没有什么分支,就是调用那一个方法,但他写代码时,看别人的模块在这里都进行 if 判断了,所以觉得自己也应该判断一下,于是就出现了上面这样的代码。

 

四, 面向过程式的编程方法

遇到过好几次 2000 多行的方法,所有业务逻辑,一气呵成,就用了一个方法搞定。如果是简单的逻辑也就算了, 可是几千行的代码全放在一个方法里,一个类里有无数的重复代码。 这回到好,重构那本书没白看, 现在有了实践的机会了。

难道您自己调试的时候就不觉得麻烦吗? 我在这里不想讨论什么面向过程还是面向对象,也别和我说什么方法多了也不一定就是面向对象的思想。 平时对自己写的代码多上点心, 大家都是在这行干了几年的人了,把代码写的漂亮点有什么不好。

 

五, 代码缩进混乱

我们公司有规定,改代码的时候,不许修改原有代码的格式。 不管他多乱,也不许改。 我不明白这是为什么,也许是检查代码的人,要用文件比较工具吧。

但这下苦坏我了, 代码的格式那叫一个乱。 有顶着行头写的, 有向后空了 N 格的,大概是写代码的人, 为了方便自己找到正在调试的那段代码,所以把代码的缩进变得和其它代码与众不同吧。 那您调试完了到是重新排一下版呀, 这真的不累~~, 现在的 IDE 工具都有自动排版代码的功能, 一个快捷键就搞定了,稍微勤快一点行吗??

BT 的一段代码是缩进居然出了屏幕!!! 你吃饱了撑的呀, 没事缩那么远干吗, 我根据后台输出找了半天也没找到那段代码在哪儿, 原来是因为缩进的太远了,不在屏幕范围之内, 向右拉了半天滚动条才找到。 你丫是不是写着代码睡着了? 脸正好砸在 TAB 键上。

 

六, 多余的后台输出

好几个循环嵌套在一起~~~ 也行, 就算是因为业务逻辑需要,没别的办法也将就了。 好几个循环嵌套在一起查数据库, 咱们最好还是开动一下脑筋, 看看有什么更好的办法。如果还是没别的办法, 那也凑合了。 可这种情况您就别在后台输出 SQL 语句啦, 每次一执行程序,成百上千个 SQL 语句在后台输出, 查数据库才用了一两秒,结果输出这些 SQL 就用了半分钟。 您自己就没觉出程序慢在哪里吗? 您调试程序的时候输出一下也就算了, 提交到正式运行的环境时,就麻烦您,劳您大驾~~ 把那些输出注释掉吧,实在不行留几个重要的输出就行了。 让这种代码影响系统性能~~ 也太冤了吧。

 

七, 打肿脸充胖子

我也不知道这条算不算恶习,也许不算,在有些人眼里还是好事。但也要看具体情况,经常有些人写代码不喜欢用 IDE ,只用 EDITPLUS 这类工具。按常理说,初学者都应该尽量用这些编辑器写代码,对加深学习印象有好处。也有人说高手不屑于用那些 IDE ,我少见多怪, 这种绝顶高手我没见过。

但咱平时工作的时候,要的是效率,您不是那种高手就乖乖的用 IDE 吧。经常见到有些人,为查一个方法的调用,搜来搜去的。真正的高手是工作效率最高的人,不是用最简单工具的人。


//20061019 start
        一些补充: 

有些人提到用EDITPLUS的效率其实也很高, 这点我也承认. 但我想说明一下, 我所见到的用EDITPLUS那个人, 根本没有发挥出editplus应有的效率和功能. 在他的手里editplus只是一个多了颜色区分的记事本. 编译程序还是用javac , 也不会用ANT, 发布程序还是手工拷贝. 号称四年经验的程序员, 刚到公司时用了一天时间重装好电脑后, 写了一个打印hello world的程序测试环境. 结果不写static void main方法, 直接就要用java去运行. 运行不成功还说系统配置有问题, 需要再重装.  每次帮他调试程序, 想查一个方法的调用, 一个文件一个文件的搜, 看得我这个急...........     我的希望是不管用什么工具, 要让这个工具在自己的手里发挥出最大的作用来, 如果用editplus非常纯熟的话, 我也会很佩服那个人的, 而且会虚心的向他学习使用技巧

可他把时间全耽误在这上了, 这样的工作效率, 加班都是活该的
//20061019 end



    今天就写这么多,
大家还遇到过什么样的编程恶习,欢迎补充。

大家不要总是抱怨什么工资太少,工作量太大。工作效率这玩意儿是要经验来做基础,这没错,经验少也没事。咱平时写程序的时候多上点心,多对自己的代码思考一下,多动动脑子。自然就能总结出最好的工作经验了,工作效率自然就提高了。

也别总是说什么 STRUTS 不好, HIBERNATE 太慢,不屑去用它。人家的程序能在全世界流行,自然有他的过人之处。多读读他的代码,学习一下他到底好在哪里,如何才能把这些优点应用到自己的代码上。这才是最重要的。

 也许咱们写不出什么高超的代码技巧,写不出什么华丽的算法,但如果能在一些习惯,细节上做到精益求精,那也对得起自己的代码了。


    写出上面这些代码的人,如果你的工资真的很少,那我只能惋惜的说一句:你的工资是可怜了点,但看您写的这代码,连这点工资都不应该给你!!

posted @ 2006-10-16 23:27 小强 阅读(5510) | 评论 (45)编辑 收藏
Ruby是何方神圣?

Ruby是一种功能强大的面向对象的脚本语言,她可以使您方便快捷地进行面向对象编程.Ruby使文本处理和系统管理变得简单,与Perl非常相似.一句话:简单明了,扩展性强,移植性好.

Ruby的几大亮点:

  • 语法简单
  • 垃圾回收
  • 可移植性
  • 动态载入
  • 完全免费
  • 正则表达式

走向世界的Ruby

松本行弘"Matz"(Matsumoto Yukihiro)是Ruby语言的发明人,他从1993年起便开始着手Ruby的研发工作。他一直想发明一种语言,使你既能进行高效开发又能享受编程的快乐。1993年2月24日Ruby诞生了,1995年12月Matz推出了Ruby的第一个版本Ruby 0.95。不久Ruby便凭借其独特的魅力横扫日本,相信在不久的将来,Ruby将走向世界。

# 下载

如何取得Ruby

  • 您可以从各个镜像站点下载稳定版ruby 1.8.1
  • 您还可以下载下一个稳定版本的预览版ruby 1.8.2 preview1
  • 我们用tar.gz把当前CVS稳定版快照(Fri Jul 30 04:00:51 JST 2004)保存下来。这是在1.8系列稳定版的基础上打了补丁的版本。若您需要比最终版本还要稳定的版本的话,就请下载使用。
  • 每天晚上,我们都会用tar.gz把当时的CVS最新版快照(Fri Jul 30 04:00:25 JST 2004)保存下来。因为保存快照时没有作任何修改,所以可能会有一些问题。请您斟酌使用。
  • 我们使用tar.gz把当前的1.6系列快照(Fri Jul 30 04:01:11 JST 2004)保存下来。该最新版本修正了1.6系列最终版本的所有错误。若您暂时无法升级到1.8系列,却又想修正1.6最终版本的错误时,就请使用该版本。
  • 请参考CVS指南来了解使用匿名CVS获得最新源码的方法。

可下载项目

FTP镜像站点

HTTP镜像站点

Rsync镜像站点

  • rsync://sunsite.dk/ftp/mirrors/ruby/ (丹麦)
  • rsync://rsync.idaemons.org/ftp/mirror/ftp.ruby-lang.org/ruby/ (日本)
  • rsync://gd.tuwien.ac.at/languages/ruby/ (澳大利亚)
  • rsync://mirror.cs.mun.ca/ruby/ (加拿大)

# 下载:文档

Ruby 1.6 参考手册(日语版)
下载发行版
下载最新版
Ruby 1.4 参考手册(英语版)
下载
Ruby 1.4 参考手册(日语版)
下载
Ruby教程(日语版)
下载
Ruby用户指南(日语版)
下载

# Ruby教程

Ruby安装方法分类

大体说来,Ruby的安装方法可分为两类。

第一种方法,自己编译源代码然后开始安装。在UNIX系列OS(Linux、NetBSD、FreeBSD、Solaris、HP-UX以及Windows中的Cygwin等等)平台上采用这种方式安装时,操作方法大同小异且简便快捷。在Windows环境中,编译环境的不同会带来功能上的差异(请参考「不同的Microsoft Windows编译环境所引起的差异」)。

另一种方法就是使用针对不同平台开发的各种便利的安装工具。若您“不想编译”或者想使用软件包来安装Ruby的相关软件的话,我们推荐您使用这种方法。Linux环境下可以使用RPM或deb,若是FreeBSD的话则可以使用ports/packages等。但是,您必须拥有root权限才能使用软件包进行安装。若您想安装到自己的主目录里的话,就必须自己编译源代码。

Windows上的安装方法有点特殊。在cygwin、mswin32或mingw这三种不同的编译环境下,使用的安装方法也不一样。若您并不熟悉UNIX的话,我们建议您使用mingw或mswin32。

此外在您编译源代码时,您可以使用CVS以获得最新版的源代码。

这里我们只介绍了一些典型的安装方法,实际上,Ruby还可以支持很多其他的平台。而且Ruby每天都会得到改进,因此本文件中的某些描述可能已经与实际情况有所不同。若您发现我们的描述有误或与实际情况不符的话,请您指正。同时若您有其他平台上的相关信息的话,也请您补足。如您所见,我们采用的是专人维护制度。当您想帮我们补充资料的时候,请参考「RWiki的RD」。

目录

按平台分类的安装指南

(字母顺序)

  • Alpha Machine
  • Borland C++ (从源代码开始)
  • BTRON .超汉字
  • Cygwin (binary)
  • Cygwin (从源代码开始)
  • Debian GNU/Linux
  • EWS4800
  • FreeBSD
  • HP-UX
  • Kondara MNU/Linux
  • MacOS X
  • mingw32 (binary)
  • mingw32 (从源代码开始)
  • MS-DOS
  • mswin32 (binary)
  • mswin32 (从源代码开始)
  • NetBSD
  • OS/2
  • Vine Linux
  • RPM系列Linux平台
  • UNIX平台
  • 用CVS保持更新

Windows用户提示

开发环境

  • emacs + ruby-mode
  • xyzzy + ruby-mode
  • irb
  • irbsh
  • ReFe
  • Copal
  • RDE
  • RubyWin
posted @ 2006-07-24 17:39 小强 阅读(1108) | 评论 (1)编辑 收藏
Ruby 基础

作者:Ralf Wirdemann, Thomas Baustert
www.b-simple.de
2006.2.14

1.1 在线文档和书籍

    语言资料上,如果要找核心和标准API的文档可以去 www.ruby-lang.org,深步进阶我们推荐下面的书籍:

Dave Thomas: Programming Ruby, Second Edition, Pragmatic Bookshelf, 2005
Ruby书籍中的标准著作,极具推荐价值。
Hal Fulton: The Ruby Way, Sams, 2001
这部书不仅仅有Ruby语言的最新状况,还提供了一百个案例,很有意思。

1.2 引言

    Ruby 是一个纯粹的面向对象的动态型语言。Ruby 程序不是被编译成二进制格式(如Java),而是直接由一个解释器来处理。这门语言在1995年由松本行弘(Matsumoto Yukihiro)发布,除了 Smalltalk、Python 等语言以外,Perl 对它的影响是首当其冲的。
    Ruby 里的一切都是对象,它没有原始类型(如Java)。除了面对对象,Ruby还提供了垃圾回收、异常、正则表达式,为迭代器和方法作参数的“代码块”,运行期的类扩展,线程及更多的东西。Ruby 语言易懂易用,原因在于它简单、语法干净。

1.3 Ruby 程序

    Ruby 程序保存在以 .rb 结尾的文件里。程序内容包含类、模块、或者只是简单的Ruby代码。下面是地球人都知道的 Hello World 程序:

# hello.rb                        
puts "Hello World!"               

    如果这个代码是以 hello.rb 的文件名保存的,那么可以这样调用:

> ruby hello.rb                   
> Hello World!                    

    在Windows下允许您以文件关联的方式在IE中执行;在 Linux/Unix 下您可按照自已的操作系统情况使用 Shebang行:

#!/usr/local/bin/ruby             
puts "Hello World!"               
                                  
#!/usr/bin/env ruby               
puts "Hello World!"               

    随后直接执行这个程序:

> chmod 744 hello.rb              
> ./hello.rb                      

    Ruby 的语句可以以分号结尾,但不是必须。 Ruby 是一个面向行的语言,也就是说,一个语句不需要以分号结尾,解释器能够明白下一行是进一步的语句。下面前几个语句的输出相同,最后一个是错误的:

puts "Hello World!";              

puts "Hello World!"               
puts "Hello " \                   
   "World!";                      
puts "Hello" +                    
   "World!";                      
puts "Hello"   # 语句至此结束     
   + "World!"; # 无法被解释的新语句


    多个语句可以用分号隔开写到一行里面,这不是很地道的写法,因为会影响阅读的流畅。

# 可行,但不漂亮:                
a = 42; b = 15; c = a + b        

#这样比较好:                     
a = 42                           
b = 15                           
c = a + b                        

    Ruby 以两个空格作为缩进的方式(不用Tab键),这是个推荐习惯并且应该尽可能地得到遵循:

# 非常棒的缩进                   
while line = file.readline       
  if !comment_line(line)         
    lines.add(line)              
  end                            
end                              

# oh~,oh~,您这是和外星人学的吧 
while line = file.readline       
    if !comment_line(line)       
        lines.add(line)          
    end                          
end                              

    Ruby 提供了全系列的标准类型,如数字、字符串、正则表达式、数组、哈希(Hash),等等。所有这些元素通过类和模块的方式以备使用,无需在程序(文件)中绑定,它们来自于核心库并在整个程序中自动生效。
    另外一些是以其它类和模块构成系列的标准库方式以备使用的,例如 Date、Logger、Test::Unit 等等。一旦要自行开发就必须在每个程序里通过关键字 require 来明确绑定。于是在 require 后加上或有或无结尾(.rb)的文件名。

require "date"  # date.rb 用到 Date类              
require "my_class" # my_class.rb 用到MyClass类     
require "my_module" # my_module.rb 用到 MyModule模块

    对此处文件名的处理不是按绝对路径,Ruby 会在所有的标准目录下寻找这个文件,它们被包含在全局变量$: 里面,您可以在命令行用 ruby -e "puts $:" 或其它方式得到这些路径。一个装载了类和模块的程序里的所有名字都可以通过全局变量 $" 输出。

1.4 注释

    在 Ruby 中注释行是以#号开始的,注释可出现在句首或句尾。

# 下面这行是被注释掉的           
# a = b - c                      
a = b + c # 注释到行尾           

    一个注释块开始于 =begin 结束于 =end,这几个关键字必须在行首,不能有空格。

=begin                           
  def my_method                  
    ...                          
  end                            
=end                             

1.5 数字

    Ruby支持整数和浮点数。Ruby 里面没有原始类型,都是数字对象。整数从负2的30次幂到正2的30次幂 (在64位机器上从负2的62次幂到正2的62次幂) 被定义成FixNum类型 超出此范围的整数被定义成BigNum类型,类型的划归与转换是自动完成的,一个数字的长度最终由主存来判定。

value = 42 # FixNum                               
big_value = 123456789012345678901234567890 # BigNum

    数字可以用16进制、8进制或者2进制的数字系统来表示:

# 42                             
0x2A                             
0052                             
b101010                          

    有相应的数学运算符以供使用,数字的增减用运算符 += 与 -= 来实现, 出自 C 和 Java 的 ++ 与 -- 在 Ruby 里是没有的。

a = 2                            
b = 3                            
c = a + b    # 5                 
c = a - b    # -1                
c = a / b    # 0                 
c = 2.0 / b  # 0.666666666666667 
c = a * b    # 6                 
c = a**b     # 2*2*2 = 8         
a += 1       # a = 3             
a -= 1       # a = 2             
a++          # Ruby里非法        

    FixNum与BigNum 继承于基类 Integer,以下是可用的函数,是与块(见1.14节)结合的:

1.upto(3) { [i] puts i }    # 1 2 3             
3.downto(3) { [i] puts i }  # 3 2 1             
0.step(10,2) { [i] puts i } # 0 2 4 6 8 10      
3.times { puts *42* }       # 42 42 42          

    浮点数在 Ruby 里是用 Float 类来表示的。像其它语言一样,Ruby 里的浮点也有卷折误差。为了计算精确(如 合值),建议使用 Ruby 标准库里的 BigDecimal 类,相对于 Float,这个类描述了更为丰富的浮点数并且避开了卷折误差。

1.6 字符串
 
    在 Ruby 里,字符串被放置在两个单引号或双引号之间。引号常会出现在另一个引号里面:
 
str = "Hello"          # Hello
str = "Hello 'Thomas'" # Hello 'Thomas'
str = 'Hello'          # Hello
str = 'Hello "Thomas"' # Hello "Thomas"
 
    字符串可以通过 %q 和 %Q 产生,这是为了避免当一个字符串内出现过多的引号或其它符号时会出现这样或那样的错误。%q 产生一个被包含在单引号中的字符串,%Q 产生一个被包含在双引号中的字符串,文本以分隔符为界来限定,分隔符可以是除字母与数字以外的所有符号。

%q{a string}
%q(a string)
%Q$a string$
 
    %Q 可以替换 #{Ausdruck}这样的表达式,而%q不能:
 
表格1.1 字符串中带双引号的逃脱符
\a 响铃
\b 退格
\e 逃脱
\f 换页
\n 换行
\r 回车
\s 空格
\t Tab
\v 垂直表格跳位
\nnn 八进制
\xnn 十六进制 
\cx Control-x
\C-x     Control-x
\M-x     Meta-x
\M-\C-x  Meta-Control-x
\x       x
#{code}  code


puts %q{result: #{42.0/3} EUR}     # result: #{42.0/3} EUR
puts %Q{result: #{42.0/3} EUR}     # result: 14.0 EUR
 
    在花括号、圆括号、角括号的情况下字符串是括号括起来的部分,其它则是到那个符号再次出现为止。字符串也可多行显示,Ruby 在此并不清除起始空格符。
 
s = %Q@ein String über mehrere 
 Zeile mit "" und '' und durch
  einen Klammeraffen begrenzt@
puts s
=>
ein String über mehrere 
 Zeile mit "" und '' und durch
  einen Klammeraffen begrenzt
puts s.inspect
=>
"ein String \374ber mehrere\n Zeile mit \"\" und '' ...
...und durch \n  einen Klammeraffen begrenzt"
 
     一个表达式的结果可以通过#{Ausdruck}插入到一个字符串中,然而这只有在双引号之间有效。
 
"Ergebnis #{42*7/100} %" # Ergebnis       #{2.94} %
"Die Anwort ist: #{answer(x)}"            # Die Anwort ist: 42
 
    如C与Java所惯用的,特殊符号由斜杠逃脱,表1.1列举了所有的特殊符号:
 
"Ein Slash: \\"              # Ein Slash: \
"Er rief: \"Ralf!\""         # Er rief: "Ralf!"
'War\'s okey?'               # War\'s okey?
"Neue\nZeile"                # Neue
                             #Zeile
'Neue\nZeile'                # Neue\nZeile
 
    两个字符串的内容可以用 == 方法来比较,与之相对照的是 equal? ,它用来判断是否是同一个字符串实例(参看1.15.5节):
 
s1 = "Thomas"
s2 = "Thomas"
s3 = "Ralf"
s1 == s2 # => true
s1 == s3 # => false
s1.equal? s1 => true
s1.equal? s2 => false
s1.equal? s3 => false
 
    字符串可以用+和<<这两个方法连接。使用 * 可实现多重累加。
 
"Thomas" + "/Ralf"    # Thomas/Ralf
s = "Thomas" 
s << " und Ralf"      # Thomas und Ralf
"Ralf " * 2           # Ralf Ralf
 
 
    字符串类提供了大量的方法,让你随心所欲,下面是几个例子;
 
s = "Thomas und Ralf"
s[3]                  # 109
s[3].chr              # m
s[7,3]                # und
s[0..6]               # Thomas
 
"Thomas und Ralf".delete("a")         # Thoms und Rlf
"Thomas und Ralf".delete("aou")       # Thms nd Rlf

"Thomas und Ralf".gsub("und", "oder") # Thomas oder Ralf
"Thomas und Ralf".gsub(/[aou]/, "$")  # Th$m$s $nd R$lf
 
"Thomas und Ralf".index('a')          # 4
"Thomas und Ralf".index('a',5)        # 12
 
"Thomas und Ralf".split               # ["Thomas", "und", "Ralf"]
 
    为字符串转换成整数和浮点数提供两种途径,安全一些的是使用核心方法 Integer 和 Float, 它们在出错的时候抛出异常; 另一种是 String 类的方法 to_i 和 to_f,限制较少 。

"42".to_i            # => 42
nil.to_i             # => 0
"42x".to_i           # => 42
Integer("42")        # => 42
Integer(nil)         # => 0
Integer("42x")       # => 参数错误
posted @ 2006-07-24 17:36 小强 阅读(1733) | 评论 (0)编辑 收藏