2010年12月16日星期四

使用正则表达式查找源码包中包含中文字符的文件, grep perl regex sources chinese characters

列出所有包含中文的行(含文件名):
grep --color=auto -Pr '[^\x00-\x7f]+' src/

只列出文件名,去除重复项:
grep --color=auto -Pr '[^\x00-\x7f]+' src/ | awk -F: '{print $1}' | sort | uniq | sort

事实上,正则表达式(Perl) [^\x00-\x7f]+ 可以匹配任何非 ASCII 字符,不止中文字符,日文,韩文等非 ASCII 字符一样可以匹配。
--
yaoms

2010年11月8日星期一

xsel + libnotify-bin + google translate 自定义一个桌面取词翻译小工具

应用平台: linux X11 gnome
依赖的软件: xsel, libnotify-bin, python(simplejson,urllib,urllib2)

两个脚本:

~/bin/translate.py

#!/usr/bin/env python
from urllib2 import urlopen
from urllib import urlencode
import simplejson
import sys

# The google translate API can be found here:
# http://code.google.com/apis/ajaxlanguage/documentation/#Examples

target=sys.argv[1]

text=' '.join(sys.argv[2:])

base_url='https://www.googleapis.com/language/translate/v2?'

params=urlencode( (('key',    'AIzaSyCTMQYOQUQdWSAJ478lI-peSVelazL_iCQ'),
       ('target', target),
       ('q',      text), ) )

url=base_url+params

response=urlopen(url)

jsonObject = simplejson.load(response)

print "from:%s; %s" % (jsonObject['data']['translations'][0]['detectedSourceLanguage'],jsonObject['data']['translations'][0]['translatedText'].encode('utf-8'))


~/bin/trans-xsel

#!/bin/bash

# depend on xsel, libnotify-bin, translate.py
WORD=`/usr/bin/xsel -o`
TEXT=`translate.py zh """$WORD"""`
DISPLAY=:0.0 notify-send -i /usr/share/pixmaps/gdict.xpm -u normal -t 8000  来自谷歌翻译: """$TEXT"""

给这两个脚本添加执行权限,并把 ~/bin 加入 PATH 变量。

使用 gconf-editor 命令,启动 gnome 配置工具。

在 /apps/metacity/keybinding_commands/ 中 设置一个空闲的 command 键的值为  trans-xsel
在 /apps/metacity/global_keybindings/run_command_1 中设置 自己的快捷键: 例如 <Control><Alt>z

设置完成之后关闭配置工具。

使用方法:

在桌面上的任意窗口中(比如浏览器)选中要翻译的文本,按快捷键 Ctrl+Alt+z 系统提示框将会弹出提示框显示翻译结果。

--
yaoms

2010年11月4日星期四

如何使用 ssh 链接 虚拟机中的系统 Howto Access via ssh a Virtualbox Guest machine.

网上可以搜到的大部分文章都是说执行这三条命令:(首先关闭虚拟机)

$ VBoxManage setextradata <guestname> "VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/HostPort" 2222
$ VBoxManage setextradata <guestname> "VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/GuestPort" 22
$ VBoxManage setextradata <guestname> "VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/Protocol" TCP
以上三条命令中的 <guestname> 是要链接的虚拟系统的名字。

可是在实际使用中,有可能遇到如下错误而不能启动:

Configutarion error: Failed to get "MAC" value
(VERR_CFGM_VALUE_NOT_FOUND)

Unknown error creating VM (VERR_CFGM_VALUE_NOT_FOUND)
Result code: E_FAIL (0×80004005)
Component: Console
Interface: IConsole ("Some HEX code")


这个时候可以尝试使用 e1000 代替上面三条命令中的 pcnet,重新配置虚拟机的端口映射。使用如下命令

VBoxManage setextradata <guestname> "VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/HostPort"
VBoxManage setextradata <guestname> "VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/GuestPort"
VBoxManage setextradata <guestname> "VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/Protocol"

VBoxManage setextradata <guestname> "VBoxInternal/Devices/e1000/0/LUN#0/Config/ssh/HostPort" 2222
VBoxManage setextradata <guestname> "VBoxInternal/Devices/e1000/0/LUN#0/Config/ssh/GuestPort" 22
VBoxManage setextradata <guestname> "VBoxInternal/Devices/e1000/0/LUN#0/Config/ssh/Protocol" TCP

前面三句是取消刚刚进行的错误的设置;
后面三条是对 e1000设备进行端口映射。


--
yaoms

2010年10月30日星期六

Android 全屏窗口 - fullscreen

 1 import android.app.Activity;
 2 import android.os.Bundle;
 3 import android.view.Window;
 4 import android.view.WindowManager;
 5
 6 public class KKAdActivity extends Activity {
 7         /** Called when the activity is first created. */
 8         @Override
 9         public void onCreate(Bundle savedInstanceState) {
10                 super.onCreate(savedInstanceState);
11
12                 /* set the window on FULLSCREEN mode */
13                 getWindow().setFlags(
14                         WindowManager.LayoutParams.FLAG_FULLSCREEN,
15                         WindowManager.LayoutParams.FLAG_FULLSCREEN
16                 );
17                 /* hide the title bar */
18                 requestWindowFeature(Window.FEATURE_NO_TITLE);
19              
20                 setContentView(R.layout.main);
21
22         }
23 }

2010年10月13日星期三

TextView属性详解

这些属性的中文解释,留在这里方便查阅。
 
android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接。可选值(none/web /email/phone/map/all)
android:autoText如果设置,将自动执行输入值的拼写纠正。此处无效果,在显示输入法并输入的时候起作用。
android:bufferType指定getText()方式取得的文本类别。选项editable 类似于StringBuilder可追加字符,也就是说getText后可调用append方法设置文本内容。spannable 则可在给定的字符区域使用样式,参见这里1、这里2。
android:capitalize设置英文字母大写类型。此处无效果,需要弹出输入法才能看得到,参见EditView此属性说明。
android:cursorVisible设定光标为显示/隐藏,默认显示。
android:digits设置允许输入哪些字符。如“1234567890.+-*/% ()”
android:drawableBottom在text的下方输出一个drawable,如图片。如果指定一个颜色的话会把text的背景设为该颜色,并且同时和background使用时覆盖后者。
android:drawableLeft在text的左边输出一个drawable,如图片。
android:drawablePadding设置text与drawable(图片)的间隔,与drawableLeft、 drawableRight、drawableTop、drawableBottom一起使用,可设置为负数,单独使用没有效果。
android:drawableRight在text的右边输出一个drawable。
android:drawableTop在text的正上方输出一个drawable。
android:editable设置是否可编辑。
android:editorExtras设置文本的额外的输入数据。
android:ellipsize设置当文字过长时,该控件该如何显示。有如下值设置:”start”—?省略号显示在开头;”end” ——省略号显示在结尾;”middle”—-省略号显示在中间;”marquee” ——以跑马灯的方式显示(动画横向移动)
android:freezesText设置保存文本的内容以及光标的位置。
android:gravity设置文本位置,如设置成“center”,文本将居中显示。
android:hintText为空时显示的文字提示信息,可通过textColorHint设置提示信息的颜色。此属性在 EditView中使用,但是这里也可以用。
android:imeOptions附加功能,设置右下角IME动作与编辑框相关的动作,如actionDone右下角将显示一个“完成”,而不设置默认是一个回车符号。这个在EditView中再详细说明,此处无用。
android:imeActionId设置IME动作ID。
android:imeActionLabel设置IME动作标签。
android:includeFontPadding设置文本是否包含顶部和底部额外空白,默认为true。
android:inputMethod为文本指定输入法,需要完全限定名(完整的包名)。例如:com.google.android.inputmethod.pinyin,但是这里报错找不到。
android:inputType设置文本的类型,用于帮助输入法显示合适的键盘类型。在EditView中再详细说明,这里无效果。
android:linksClickable设置链接是否点击连接,即使设置了autoLink。
android:marqueeRepeatLimit在ellipsize指定marquee的情况下,设置重复滚动的次数,当设置为 marquee_forever时表示无限次。
android:ems设置TextView的宽度为N个字符的宽度。这里测试为一个汉字字符宽度
android:maxEms设置TextView的宽度为最长为N个字符的宽度。与ems同时使用时覆盖ems选项。
android:minEms设置TextView的宽度为最短为N个字符的宽度。与ems同时使用时覆盖ems选项。
android:maxLength限制显示的文本长度,超出部分不显示。
android:lines设置文本的行数,设置两行就显示两行,即使第二行没有数据。
android:maxLines设置文本的最大显示行数,与width或者layout_width结合使用,超出部分自动换行,超出行数将不显示。
android:minLines设置文本的最小行数,与lines类似。
android:lineSpacingExtra设置行间距。
android:lineSpacingMultiplier设置行间距的倍数。如”1.2”
android:numeric如果被设置,该TextView有一个数字输入法。此处无用,设置后唯一效果是TextView有点击效果,此属性在EdtiView将详细说明。
android:password以小点”.”显示文本
android:phoneNumber设置为电话号码的输入方式。
android:privateImeOptions设置输入法选项,此处无用,在EditText将进一步讨论。
android:scrollHorizontally设置文本超出TextView的宽度的情况下,是否出现横拉条。
android:selectAllOnFocus如果文本是可选择的,让他获取焦点而不是将光标移动为文本的开始位置或者末尾位置。 TextView中设置后无效果。
android:shadowColor指定文本阴影的颜色,需要与shadowRadius一起使用。
android:shadowDx设置阴影横向坐标开始位置。
android:shadowDy设置阴影纵向坐标开始位置。
android:shadowRadius设置阴影的半径。设置为0.1就变成字体的颜色了,一般设置为3.0的效果比较好。
android:singleLine设置单行显示。如果和layout_width一起使用,当文本不能全部显示时,后面用“…”来表示。如android:text="test_ singleLine "
android:singleLine="true" android:layout_width="20dp"将只显示“t…”。如果不设置singleLine或者设置为false,文本将自动换行
android:text设置显示文本.
android:textAppearance设置文字外观。如 “?android:attr/textAppearanceLargeInverse”这里引用的是系统自带的一个外观,?表示系统是否有这种外观,否则使用默认的外观。可设置的值如下:textAppearanceButton/textAppearanceInverse/textAppearanceLarge/textAppearanceLargeInverse/textAppearanceMedium/textAppearanceMediumInverse/textAppearanceSmall/textAppearanceSmallInverse
android:textColor设置文本颜色
android:textColorHighlight被选中文字的底色,默认为蓝色
android:textColorHint设置提示信息文字的颜色,默认为灰色。与hint一起使用。
android:textColorLink文字链接的颜色.
android:textScaleX设置文字之间间隔,默认为1.0f。
android:textSize设置文字大小,推荐度量单位”sp”,如”15sp”
android:textStyle设置字形[bold(粗体) 0, italic(斜体) 1, bolditalic(又粗又斜) 2] 可以设置一个或多个,用“|”隔开
android:typeface设置文本字体,必须是以下常量值之一:normal 0, sans 1, serif 2, monospace(等宽字体) 3]
android:height设置文本区域的高度,支持度量单位:px(像素)/dp/sp/in/mm(毫米)
android:maxHeight设置文本区域的最大高度
android:minHeight设置文本区域的最小高度
android:width设置文本区域的宽度,支持度量单位:px(像素)/dp/sp/in/mm(毫米),与layout_width 的区别看这里。
android:maxWidth设置文本区域的最大宽度
android:minWidth设置文本区域的最小宽度

--
yaoms

2010年9月30日星期四

Arduino Bots and Gadgets

于 10-9-30 通过 Android-er 作者:Android Er


Make: Arduino Bots And Gadgets
Want to build your own robots, turn your ideas into prototypes, control devices with a computer, or make your own cell phone applications? It's a snap with this book and the Arduino single-board microcontroller. Embedded systems are everywhere -- inside washing machines, cars, vacuum cleaners, and air conditioners. With Arduino, building your own embedded gadgets is easy, even for beginners.
This book gets you started with six fun projects: a stalker guard, robot insect, interactive painting, wireless smart home controller, boxing timer, and a cell phone controlled soccer robot. You'll get impressive results quickly and gain the know-how and experience you need to invent your own gadgets.
  • Discover Arduino, the popular electronic prototyping platform
  • Get a great introduction to robots and electronic projects
  • Learn how to turn ideas into working physical prototypes
  • Use Android phones as key components in your projects
  • Get everyone involved with projects that even beginners can build
Arduino is an open-source electronics prototyping platform based on flexible, easy-to-use hardware and software. It's intended for artists, designers, hobbyists, and anyone interested in creating interactive objects or environments.

APK的安装/卸载

于 09-5-19 通过 廉颇虽老,还是能饭 作者:iame

制作好apk后(必须签名),通过adb install xx.apk后,
1)apk文件放在了/data/app/目录下
2)/data/system/packages.xml中增加了条记录
3)如果使用到了数据库,首次运行后/data/data下增加了个apk使用到的数据目录


卸载方式有如下几种:
1)优雅式:通过界面 settings-->applications-->manage applications-->找到应用-->application Info-->uninstall 就可以正常卸载应用了。
2)粗暴式 直接到/data/app目录下删除apk
adb shell
cd /data/app
rm xxx.apk

不推荐这种方式,只删除了apk,如果应用还有其他的目录,如数据库目录/data/data/xxx/databases/并没有清理干净,留有隐患。
3)隐藏式:
adb uninstall package-name (这个在adb的帮助文档中没有说明,但可以用)
什么,不知道package-name?看看你的AndroidManifest.xml中有个必须的属性就是package,它所指定的就是package-name。

PS. android中package和application不是一个东西,但也没有看到清楚的解释。能否这样理解:
package是物理概念,application是运行期的逻辑概念?

OpenOffice.org 社区宣布建立 Document Foundation

这个要支持

 
 

yaoms 通过 Google 阅读器发送给您的内容:

 
 

于 10-9-28 通过 LinuxTOY 作者:liangsuilong

今天突然从遥远的国度传来震撼性消息,OpenOffice.org 社区的一群开发者宣布建立 Document Foundation (文档基金会?)组织,并且宣布建立一个新的 OpenOffice.org 分支——LibreOffice。建立新品牌的目的是为了避免以后和原来的 OpenOffice.org 之间可能存在的商标纠纷。新的基金会欢迎任何组织和个人参与推广 LibreOffice,他们特别欢迎 OpenOffice.org 的开发者参与,共同创造一个世界领先的开源办公软件。

说起来真是突然,不过这个新项目得到了众多重量级的组织支持,比如 FSF、Google、Red Hat、Novell、Canonical、GNOME 基金会。支持者列表:http://www.documentfoundation.org/supporters/

至于 Oracle 自家的 OpenOffice.org,那它自己看着办吧。Document Foundation 已经邀请 Oracle 参与新基金会,现在等待 Oracle 的回复。

LibreOffice 已经提供下载了,有 Windows、Linux 32-bit、Linux 64-bit 和 Mac 版本的下载,并且提供了源代码下载。当前版本是 3.3.0 Beta。下载地址:http://www.documentfoundation.org/download/

Document Foundation 的官方公告:http://www.documentfoundation.org/contact/tdf_release.html

分类: Apps, Office Suite | 永久链接 | 收藏到 del.icio.us | Email 给好友 | 28 评论 | 捐助本站


 
 

可从此处完成的操作:

 
 

2010年9月29日星期三

判断Android使用的联网网络

不错的代码片段。收藏备用。

判断手机的联网类型:

01.public static void checkNetworkType(Context ctx) {
02.    ConnectivityManager connectivity =
03.    (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
04.    if (connectivity == null) {
05.        Log.e(Constants.TAG, "获取网络类型失败");
06.        return;
07.    } else {
08.        NetworkInfo info = connectivity.getActiveNetworkInfo();
09.        if(info == null) {
10.            Log.e(Constants.TAG, "获取网络类型失败");
11.            return;
12.        }
13.        if (info.getType() == ConnectivityManager.TYPE_MOBILE) {
14.            TelephonyManager tm = (TelephonyManager)
15.            ctx.getSystemService(Context.TELEPHONY_SERVICE);
16.            int type = tm.getNetworkType();
17.            switch (type) {
18.            case TelephonyManager.NETWORK_TYPE_EDGE:
19.                Log.d(Constants.TAG, "网络类型为EDGE");
20.                break;
21.            case TelephonyManager.NETWORK_TYPE_GPRS:
22.                Log.d(Constants.TAG, "网络类型为GPRS");
23.                break;
24.            case TelephonyManager.NETWORK_TYPE_UMTS:
25.                Log.d(Constants.TAG, "网络类型为UMTS");
26.                break;
27.            case TelephonyManager.NETWORK_TYPE_UNKNOWN:
28.                Log.d(Constants.TAG, "网络类型未知");
29.                break;
30.            }
31.        } else if (info.getType() == ConnectivityManager.TYPE_WIFI){
32.            Log.d(Constants.TAG, "网络类型为WIFI");
33.        }
34.    }
35.}

[谷嘀下载器] 面向开发者的Android下载工具

有用的工具,也想要一个类似浏览器下载的提示,正苦于不知道怎么实现呢。

 
 

yaoms 通过 Google 阅读器发送给您的内容:

 
 

于 10-9-16 通过 云在千峰 作者:rain.hust

谷嘀下载器是一款面向开发者的下载工具,如果您的程序需要下载功能,则可以使用谷嘀下载器来轻松下载.

在Android 系统内部有个下载管理器,例如 内置的浏览器下载文件就是通过内置的下载管理器下载的. 在下载的过程中有Notification提示
下载完也有提示. 如果我们想在自己的程序中也是用这样的下载功能,可惜google并没有开放使用接口. 虽然通过其他方式也可以使用
但是使用起来总是不那么方便,并且将来Android系统升级也有可能修改这些非公开API的实现方式. 谷嘀下载器就是根据这种情况开发的.

 

在Android原有代码基础上做了简单修改. 如果您的程序需要下载功能.现在使用谷嘀下载器简单帮你搞定.

使用文档 请参考: http://code.google.com/p/goodev/wiki/GDM

截图


 


 
 

可从此处完成的操作:

 
 

妙喻设计模式

经典的设计模式被比喻成这样,太强大了,希望对大家有用!

1、 FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务 员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory   工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请 求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。
2、 BUILDER—MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都 有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这就是我的“我爱 你 ”builder。(这一定比美军在伊拉克用的翻译机好卖)   建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有 不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过 程。   
3、 FACTORY METHOD—请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method 模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。   工厂方法模式:核心工厂类不再负责所有产品的 创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。    
4、 PROTOTYPE—跟MM用QQ聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要copy出来放到QQ里面就行了,这就是我的情话 prototype了。(100块钱一份,你要不要)   原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方 法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺 点是每一个类都必须配备一个克隆方法。   
5、 SINGLETON—俺有6个漂亮的老婆,她们的老公都是我,我就是我们家里的老公Sigleton,她们只要说道“老公”,都是指的同一个人,那就是我 (刚才做了个梦啦,哪有这么好的事)   单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应 在有真正的“单一实例”的需求时才可使用。   
6、 ADAPTER—在朋友聚会上碰到了一个美女Sarah,从香港来的,可我不会说粤语,她不会说普通话,只好求助于我的朋友kent了,他作为我和 Sarah之间的Adapter,让我和Sarah可以相互交谈了(也不知道他会不会耍我)   适配器(变压器)模式:把一个类的接口变换成客户端所期 待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。
7、 BRIDGE—早上碰到MM,要说早上好,晚上碰到MM,要说晚上好;碰到MM穿了件新衣服,要说你的衣服好漂亮哦,碰到MM新做的发型,要说你的头发好 漂亮哦。不要问我“早上碰到MM新做了个发型怎么说”这种问题,自己用BRIDGE组合一下不就行了   桥梁模式:将抽象化与实现化脱耦,使得二者可以 独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。
8、 COMPOSITE—Mary今天过生日。“我过生日,你要送我一件礼物。”“嗯,好吧,去商店,你自己挑。”“这件T恤挺漂亮,买,这条裙子好看,买, 这个包也不错,买。”“喂,买了三件了呀,我只答应送一件礼物的哦。”“什么呀,T恤加裙子加包包,正好配成一套呀,小姐,麻烦你包起 来。 ”“……”,MM都会用Composite模式了,你会了没有?   合成模式:合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合 成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成 对象同等看待。   
9、 DECORATOR—Mary过完轮到Sarly过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩完,拿出我去年在华山顶上照的照片,在背面写上 “最好的的礼物,就是爱你的Fita”,再到街上礼品店买了个像框(卖礼品的MM也很漂亮哦),再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起 来……,我们都是Decorator,最终都在修饰我这个人呀,怎么样,看懂了吗?   装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承 关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功 能。   
10、 FACADE—我有一个专业的Nikon相机,我就喜欢自己手动调光圈、快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会。幸好相机有 Facade设计模式,把相机调整到自动档,只要对准目标按快门就行了,一切由相机自动调整,这样MM也可以用这个相机给我拍张照片了。   门面模式: 外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面 类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。
11、 FLYWEIGHT—每天跟MM发短信,手指都累死了,最近买了个新手机,可以把一些常用的句子存在手机里,要用的时候,直接拿出来,在前面加上MM的名 字就可以发送了,再不用一个字一个字敲了。共享的句子就是Flyweight,MM的名字就是提取出来的外部特征,根据上下文情况使用。   享元模 式:FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。 内蕴状态存储在享元内部,不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,它们是相互独立的。将可以共享的状态 和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的 对象。享元模式大幅度的降低内存中对象的数量。
12、 PROXY—跟MM在网上聊天,一开头总是“hi,你好”,“你从哪儿来呀?”“你多大了?”“身高多少呀?”这些话,真烦人,写个程序做为我的 Proxy吧,凡是接收到这些话都设置好了自动的回答,接收到其他的话时再通知我回答,怎么样,酷吧。   代理模式:代理模式给某一个对象提供一个代理 对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象, 代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被 代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。
13、 CHAIN OF RESPONSIBLEITY—晚上去上英语课,为了好开溜坐到了最后一排,哇,前面坐了好几个漂亮的MM哎,找张纸条,写上“Hi, 可以做我的女朋友吗?如果不愿意请向前传”,纸条就一个接一个的传上去了,糟糕,传到第一排的MM把纸条传给老师了,听说是个老处女呀,快跑!    责任链模式:在责任链模式中,很多对象由每一个对象对其下家的引用而接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。客 户并不知道链上的哪一个对象最终处理这个请求,系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择:承担责任或者把责任推给下 家。一个请求可以最终不被任何接收端对象所接受。
14、 COMMAND—俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,她对我有什么指示,就写一张纸条让她弟弟带给我。这不, 她弟弟又传送过来一个COMMAND,为了感谢他,我请他吃了碗杂酱面,哪知道他说:“我同时给我姐姐三个男朋友送COMMAND,就数你最小气,才请我 吃面。”   命令模式:命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。命令模式允 许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么 被执行的。系统支持命令的撤消。
15、 INTERPRETER—俺有一个《泡MM真经》,上面有各种泡MM的攻略,比如说去吃西餐的步骤、去看电影的方法等等,跟MM约会时,只要做一个 Interpreter,照着上面的脚本执行就可以了。   解释器模式:给定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释 器。客户端可以使用这个解释器来解释这个语言中的句子。解释器模式将描述怎样在有了一个简单的文法后,使用模式设计解释这些语句。在解释器模式里面提到的 语言是指任何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表文法的命令类的等级结构,也就是一系列的组合规则。每一个命令对象都有一个解 释方法,代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。   
16、 ITERATOR—我爱上了Mary,不顾一切的向她求婚。   Mary:“想要我跟你结婚,得答应我的条件”   我:“什么条件我都答应,你说 吧”   Mary:“我看上了那个一克拉的钻石”   我:“我买,我买,还有吗?”   Mary:“我看上了湖边的那栋别墅”   我:“我买,我 买,还有吗?”   Mary:“我看上那辆法拉利跑车”   我脑袋嗡的一声,坐在椅子上,一咬牙:“我买,我买,还有吗?”   迭代子模式:迭代子 模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集,聚集对象是能够包容一组对象的容器对象。迭代子模式 将迭代逻辑封装到一个独立的子对象中,从而与聚集本身隔开。迭代子模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭代子对象,每一个迭代 子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。   
17、 MEDIATOR—四个MM打麻将,相互之间谁应该给谁多少钱算不清楚了,幸亏当时我在旁边,按照各自的筹码数算钱,赚了钱的从我这里拿,赔了钱的也付给 我,一切就OK啦,俺得到了四个MM的电话。   调停者模式:调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可 以松散偶合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用转 化为一对多的相互作用。调停者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。   
18、 MEMENTO—同时跟几个MM聊天时,一定要记清楚刚才跟MM说了些什么话,不然MM发现了会不高兴的哦,幸亏我有个备忘录,刚才与哪个MM说了什么话 我都拷贝一份放到备忘录里面保存,这样可以随时察看以前的记录啦。   备忘录模式:备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录 模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。   
19、 OBSERVER—想知道咱们公司最新MM情报吗?加入公司的MM情报邮件组就行了,tom负责搜集情报,他发现的新情报不用一个一个通知我们,直接发布 给邮件组,我们作为订阅者(观察者)就可以及时收到情报啦   观察者模式:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题 对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。   
20、 STATE—跟MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,比如你约她今天晚上去看电影,对你没兴趣的MM就会说 “有事情 啦”,对你不讨厌但还没喜欢上的MM就会说“好啊,不过可以带上我同事么?”,已经喜欢上你的MM就会说“几点钟?看完电影再去泡吧怎么样?”,当然你看 电影过程中表现良好的话,也可以把MM的状态从不讨厌不喜欢变成喜欢哦。   状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象 看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让 一个对象在其内部状态改变的时候,其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选 的子类。   
21、 STRATEGY—跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,单目的都是为了得到MM的 芳心,我的追MM锦囊中有好多Strategy哦。   策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可 以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中 提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。   
22、 TEMPLATE METHOD——看过《如何说服女生上床》这部经典文章吗?女生从认识到上床的不变的步骤分为巧遇、打破僵局、展开追求、接吻、前戏、 动手、爱抚、进去八大步骤(Template method),但每个步骤针对不同的情况,都有不一样的做法,这就要看你随机应变啦(具体实现);    模板方法模式:模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类 可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。   
23、 VISITOR—情人节到了,要给每个MM送一束鲜花和一张卡片,可是每个MM送的花都要针对她个人的特点,每张卡片也要根据个人的特点来挑,我一个人哪 搞得清楚,还是找花店老板和礼品店老板做一下Visitor,让花店老板根据MM的特点选一束花,让礼品店老板也根据每个人特点选一张卡,这样就轻松多 了;   访问者模式:访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。 访问者模式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。访问者模式使得增加新的 操作变的很容易,就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中。当使用访问者模式时,要将尽 可能多的对象浏览逻辑放在访问者类中,而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。

--
yaoms

国际空间站仍在用386处理器

我觉得这更像他们为自己在辩解,为什么只有那个时候的技术才是可靠地?今年没有一个可以用于严酷自然条件的科技产品出现吗?我不信。

 
 

yaoms 通过 Google 阅读器发送给您的内容:

 
 

于 10-9-28 通过 Solidot 作者:blackhat

也许并不令人惊讶:太空探索所采用的IT技术远远落在今日消费电子产品所采用技术的后头。 时至今日,NASA仍在使用1960年代和1970年代助其登月的技术,国际空间站仍在使用1980年代386处理器。 欧洲航天局太空控制中心先进概念和技术办公室主任Alessandro Donati表示,太空中不可能依靠地面上的最先进商用技术飞行。宇宙飞行器设计时突出的是可靠性,而不是先进性。上面搭载的芯片都要经过最严格和最广泛的测试,以证明它们的耐用性和与机载软件的兼容性。每一块电脑芯片都必须被强化以避开外太空无处不在的高能辐射。

 
 

可从此处完成的操作:

 
 

RT EPFL用满天飞舞的无人载具,协助灾区架设临时通讯网路

From: Engadget Simplified Chinese
URL: http://cn.engadget.com/2010/09/28/epfl-develops-linux-based-swarming-micro-air-vehicles/
Comments: 非常有趣的应用,比较科幻。

EPFL用满天飞舞的无人载具,协助灾区架设临时通讯网路

09-28-2010

不得不承认这项来自瑞士联邦理工大学(EPFL)的SMAVENT(Swarming Micro Air Vehicle Network)计划目标相当远大,上图看起来虽然像是一堆无人飞行载具彼此用激光互相攻击、最前面这只的屁股还被三道激光打中,不过这其实是一套针对灾区临时网络架设的计划,而这些线条,其实指的是这些无人载具以及地面设备彼此通讯的网络结构。

这套系统的用途在改变现今在救援环境下,临时通讯系统建设不易,且因为仰赖激光或是微波通讯技术成本高昂的问题,这套系统利用轻型载具可长时间浮空的特性,结合低成本的线有无线网络架构,像是Wi-Fi以及ZigBee,降低灾区通讯系统的成本。

这套蜂巢状通讯结构的主角,是由10只采用Linux系统的无人载具扛下重担,每一只载具具备简单的动力单位,靠着大型的翅膀作为浮空,上面搭载包括空速管(Pitot Tube),整合自动导航的Linux嵌入式系统,供自动导航修正路线的陀螺仪与压力传感器,并且通过GPS、Wi-Fi、ZigBee等网络方式进行轨迹纪录与通讯,这一套载具系统会在飞行范围内建构出通讯网路供救灾使用。

跳转后有这套系统的概念解说影片。

Android - ADW 桌面源码

源码在 github:

http://github.com/AnderWeb

作者 AnderWeb
产品:ADW.Launcher, ADW.Theme

ADW.Launcher 开源Android桌面程序,是Android默认HOME 程序的替代品。
--
yaoms

Android - 例子:3个 Activity 之间的数据传输

本实例演示 activity 之间的互相调用和数据传输。

data transmission between Activities.

IntentTestActivity --> SecondActivity --> ThirdActivity --> SecondActivity --> IntentTestActivity 输出结果

main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
 <TextView
  android:id="@+id/textView"
     android:layout_width="fill_parent"
     android:layout_height="70px"/>
</LinearLayout>


package com.dearpeople.android.test.intent;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
public class IntentTestActivity extends Activity {
   
 TextView textView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textView = (TextView)this.findViewById(R.id.textView);
       
        Intent intent = new Intent(this, SecondActivity.class);
        intent.putExtra("sampleData", "This is Sample Data");
        startActivityForResult(intent, 1);
    }
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if(resultCode==RESULT_OK && requestCode==1){
   String msg = data.getStringExtra("returnedData");
   textView.setText(msg);
  }
 }
}



package com.dearpeople.android.test.intent;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
public class SecondActivity extends Activity {
 Intent intent;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  intent= getIntent();
  String msg = intent.getStringExtra("sampleData");
  msg += ", Added at Second";
 
  Intent intent2 = new Intent(this, ThirdActivity.class);
  intent2 .putExtra("sampleData", msg);
  startActivityForResult(intent2, 10);
 }
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if(resultCode==RESULT_OK && requestCode==10){
   String msg = data.getStringExtra("returnedData");
   intent.putExtra("returnedData", msg);
   setResult(RESULT_OK, intent);
   finish();
  }
 }
}



package com.dearpeople.android.test.intent;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
public class ThirdActivity extends Activity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  Intent intent= getIntent();
  String msg = intent.getStringExtra("sampleData");
  msg += ", Added at Third";
  intent.putExtra("returnedData", msg);
  setResult(RESULT_OK, intent);
  finish();
 }
}


--
yaoms

刷机后 G3 不能被 adb 识别,连不上电脑的问题

需要安装 HTC 提供的 Hero 驱动。

下载链接:

HTC Hero Drivers : Free Download

http://handheld.softpedia.com/progDownload/HTC-Hero-Drivers-Download-81097.html



HTC Hero, G3, adb, USB, failure, drivers Android
--
yaoms

Android - 调动系统包管理器安装 SD 卡上的 apk 包

其实很简单:

File apkFile = new File("/sdcard/download/myapp.apk");
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(apkFile),
             "application/vnd.android.package-archive");
context.startActivity(intent);
 
--
yaoms

Android - 让 Service 随系统的启动自动启动

在 Android系统中如果需要一个服务自动随系统的启动而启动,实现的思路是:

  1. 在Android 启动完成时会自动发出一个广播: android.intent.action.BOOT_COMPLETED。
  2. 我们要做的是顶一个广播接收器 BroadcastReceiver ,在其 intent-filter 段中定义 一条 BOOT_COMPLETED的action。
  3. 在这个Receiver 的 onReceive方法中启动指定的服务。

相关代码片段:
Receiver:


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class ServiceLoader extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent serviceIntent = new Intent();
        serviceIntent.setAction("my.package.LCService");
        context.startService(serviceIntent);
    }
}

AndroidManifest.xml:

...
        <receiver android:name="ServiceLoader">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"></action>
                <category android:name="android.intent.category.HOME"></category>
            </intent-filter>
        </receiver>
...

在要启动的 Service 的 intent-filter段中需要定义 my.package.LCService 的action。

--
yaoms

简单记录一下我的刷机经历

G2:

  1. 关机后,按 开关机键+Home(小房子键),启动到 Recovery 模式,查看其版本,如果看到感叹号图标,表示Recovery 版本较低,不能刷机,刷机之前需要先刷 Recovery。如果看到了 1.5.2或者 1.6.2 的字样,证明你的 Recovery版本满足刷机要求。请直接转到第8步。
  2. 现在开始刷新Recovery。关机后,按 开关机键+返回键(带箭头的),启动到 HBoot 模式,记下这个屏幕显示的信息。然后在网上搜索对应的 1.5.2以上的 Recovery 的 img 。下载回来后记得验证一下 其MD5值,确保下载到的是完整的 img。(我曾经下载了一个错误的img,大小只有51k,看都没看刷进去,差点变砖头。结果后来才发现那个文件的内容其实是 html 的代码。)
  3. 下载后,将其拷贝到 SD 的根目录下,最好改一个简短的文件名,例如 rec.img。然后将SD卡插入手机,正拆机后,连接USB线,进入调试模式。(前提是已经安装好 Android SDK 和 USB驱动等)。
  4. 在命令行终端中,输入: adb shell ,看能不能得到一个 # 提示符。
  5. 在 # 提示符下输入以下命令刷新 Recovery : flash_image recovery /sdcard/rec.img,并回车。
  6. 如果一切正常的话,不会有任何输出的退出,返回到 # 提示符。现在 Ctrl+D回车退出 adb shell 模式。
  7. 将手机和USB线断开,按照步骤1的方式再看看现在 Recovery 的版本。如果看到了新的界面,并看到1.5.2的版本号,证明Recovery刷成功了。
  8.  将下载到的合适的ROM文件包(标准zip包)复制到 SD卡的跟目录。最好将文件名改为 update.zip。
  9. 按照第一步的方式进入Recovery模式,先备份以下现在的系统,备份子文件会自动建立在SD的 nandroid文件夹中。
  10. 然后选择清除数据: wipe data.
  11. 最后选择 flash update.zip 或者 flash any zip 之类的菜单开始刷机。这个过程比较长,可以起来转转,喝喝水。
  12. 等刷新完成之后。选择重启系统。
  13. 刷机之后的第一次启动,需要花费很长的时间,要耐心等待。
  14. 大约5分钟之后,进入新系统,设置时间市区Google账号等。享受新系统吧。
G3刷机大体相似。只是需要的软件包要对应,注意核对软件包提供者给出的各类版本信息和自己手机的HBoot里面的信息。

--
yaoms

Android - 发送文本短信: SmsManager

从Android中发送文本短信很简单,只需要以下代码片段:

SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage("10086", null, "你好,10086", null, null);

2010年5月31日星期一

GAE的第三方上传工具SDUpload 的ERROR sdappcfg.pyo:1334 An unexpected error occurred 问题

在使用 SDUpload 上传的时候会产生如下的错误:


2009-08-04 13:51:13,026 ERROR sdappcfg.pyo:1334 An unexpected error occurred. Ab
orting.
Traceback (most recent call last):
  File "SDUpload.py", line 30, in <module>
  File "sdappcfg.pyo", line 1936, in main
  File "sdappcfg.pyo", line 1521, in Run
  File "sdappcfg.pyo", line 1733, in Update
  File "sdappcfg.pyo", line 1313, in DoUpload
  File "sdappcfg.pyo", line 1174, in Begin
  File "sdappcfg.pyo", line 281, in Send
  File "sdappcfg.pyo", line 320, in _Authenticate
  File "sdappcfg.pyo", line 229, in _Authenticate
  File "sdappcfg.pyo", line 174, in _GetAuthToken
  File "urllib2.pyo", line 381, in open
  File "urllib2.pyo", line 399, in _open
  File "urllib2.pyo", line 360, in _call_chain
  File "urllib2.pyo", line 1115, in https_open
  File "urllib2.pyo", line 1082, in do_open
urllib2.URLError: <urlopen error (10060, 'Operation timed out')>

其实这是因为网络不通(有防火墙阻拦)的原因。需要使用代理,或者找一台能直接连上 gae 服务器的机器来上传。(gae服务器还没有被墙,不过有些地方的企业防火墙[使用白名单的策略的]会阻拦。)

--
yaoms

2010年5月26日星期三

康达尔养鸡场和富士康

很多年以前,参观过康达尔养鸡场。从此以后,再也不敢吃冰鲜鸡了。 

那是一座现代化养鸡场。卫生条件堪比医院。工作人员衣着干净的白大褂。整座工厂里没有一丝异味。设施的先进程度就如同实验室。当然,有关领导对此倍感骄傲。 

问题是,在这里,鸡们太惨了。 

鸡们,每只有一个小格子。格子极小,刚好容身,动弹不得。鸡们,抬头是送水的胶皮管,低头是流动的饲料槽。它们唯一的活动就是抬头饮水和低头吃饲料。它们就这样憋屈着,拼命吃喝。若干天后,三斤饲料,变成一斤肉。他们的命运也就结束了。 

鸡是没有鸡权的。它们没有被视为生命。它们不被尊重。在一些人眼里,它们仅仅是一堆肉;又或许,它们仅仅是一堆钞票。 

鸡们,没有说话的权力,没有散步的权力,没有恋爱的权力。没有任何权利。 

我不知道鸡们的感受。但是,厂长是知道的。他说,这样的鸡肉是不好吃的。 

现代化,也就是工业化,也就是机械化,也就是标准化,也就是工具化。生命的意义被化掉了。 

是的,富士康不是血汗工厂,它的条件是一流的,待遇也是不错的。就这一点而言,它与康达尔几乎是一样的。然而,这有意义吗? 

康达尔里面是鸡;富士康里面是人! 

生命的意义不仅仅是活着。 

人的生命的意义更加不仅仅是活着。 

我可以确定,如果康达尔养鸡场允许鸡们作出选择的话,它们一刻也不会犹豫,它们统统会跳楼的! 

不要去批评可怜的打工者了。谁不珍惜生命!有的时候,活着太憋屈了,死亡倒是一种解脱。 

郭先生是有责任的。当你风流倜傥的时候,可有想过打工者们,他们也需要有颜色的生活。 

当然,主要的责任还是在政府。当你们尊享人口红利的时候,那些个人口们难道不需要一点红利吗? 

我很反感上海世博会的主题词。城市使生活更美好?真没学问!难道没有读过悲惨世界吗! 

就是这种唯物质主义的极端发展,制造了打工者们的悲剧。 

没有理想、没有情感、没有时间与空间,城市就是一堆冰冷的砖头。富士康的工人们,就象康达尔的鸡一样在“生活”。 

在深深的默哀之后,要感谢那些已经远去了的打工者们。你们重新唤起了人们思考。虽然,许多人未必会深入的思考。 

也许,郭先生也很无奈。毕竟,他没有能力建立一个温馨的社会。 

那末,这件事情应该由谁来做呢? 

要知道,还有上亿的生命依旧憋屈着。 

城市永远不会使生活更美好! 

制度才会使生活更美好! 

做一点儿有意义的事情吧!


--
yaoms

2010年5月18日星期二

2010年4月7日星期三

一句笑话:你永远不能战胜一个纯SB,因为他会把你的智商拉到跟他个水平,然后用丰富的经验打败你

2010年3月29日星期一

文章链接: http://ping.fm/Wy4TD

你介绍的文章不错,看后感觉很有收益。

至于你说的计算机的事,我不懂,但是凡人在世,谁能无过?取其精华,去其糟粕,其中还是很多可以学习的,孔老夫子说的好啊,三人行必有我师。谢谢,谢谢

关于这篇文章给我带来收获发表的感言

文章链接: http://blog.est.im/archives/1827

你介绍的文章不错,看后感觉很有收益。

至于你说的计算机的事,我不懂,但是凡人在世,谁能无过?取其精华,去其糟粕,其中还是很多可以学习的,孔老夫子说的好啊,三人行必有我师。谢谢,谢谢

--
yaoms

2010年3月27日星期六

开着军舰去打鸟

2010年3月26日星期五

一个IT人来谈中国与印度的软件

作者:guolurenss(天涯)

 

   在国观,看见了不少人对比中国和印度软件贴子,发觉大部分都不是IT人经历的人写的,错误百出。所以来写一篇 一个IT人来谈中国与印度软件, 为什么不说 一个IT人来谈中国与印度软件的差距呢? 这样的说法就是根本性的错误,中国软件和印度软件只有差别,要衡量差距,那是关公战秦琼,无从衡量。

  我本人就是从事IT行业的,从业10年。刚开始做ERP两三年,后来从事个人认为是技术和业务要求都是非常高的行业:

   投资管理与证券交易软件。

   天涯股民多,很多人认为证券交易软件就是通达信、大智慧、核新、同花顺,手机炒股,网上交易,电话交易等等,只能算说对了一半,这些都只能算证券交易的外围,所有这些交易方式都连接到证券公司的交易核心程序,最后申报到交易所,我从事的就是 这核心的开发,会和股民用到的所有系统有接口。

  

   接下来开始谈正文:

   一。首先谈盗版

   虽然个人是从事IT行业的,盗版是IT人员最后成为IT民工的重要原因之一,但个人觉得到目前为止盗版对中国的发展还是利大于弊,

  

   说到软件盗版,中国人都盗版什么呢?

   1。操作系统 windows ,

   2. 办公软件 oa系统 ,office,Notes,图象处理PS

   3. 数据库 主要是中小型的数据库(sql server,免费MySql),但大型的oracle等,都是大企业用的,能用的起当然就不缺钱,别人自然能抓到你在用,能找你收钱。

   4。开发工具 c, delphi, .net ,java 我们这些开发软件的公司基本上都没有怎么花钱买开发工具。

   5。企业级商用中间件 (Weblogic ,websphere,Tuxedo)

   6。其他的通用性应用软件,譬如杀毒,网络安全

   7.个人电脑所使用的软件几乎全是盗版或者免费(免费居多)

   windows,office,影声播放,

   QQ、邮箱、支付宝、淘宝、阿里旺旺、飞信、百度、迅雷、PPSPPliveCNTV360、、翻译软件、通行情软件、

  

   8。中国最大的盗版行业是 游戏,电影

  

   中国的网民从看电影和玩游戏角度来说,是世界上最幸福的,

   我可以肯定的说,中国很多网民看过的美国电影数量都超过不少美国人。。远超其他国家的人

   中国网民庞大,会有一部分人将世界上的优秀的影片引入到到这个体系(世界上最大的局域网)中来

   由于中国的视频共享网站,其供应商都是中国本土的,

   外国只有叫嚷的份,说到处理侵权,实际上能作的事情很少。

  

   不要小看了盗版的作用,它让中国以比较低的成本融入了信息化社会,开阔了视野,这也是为什么中国人对外国人的了解 远胜于外国人对中国人的了解。

  

   二。金山公司不是中国软件业的代表

   大家看清楚了,中国人盗版的行业基本上都是外国的垄断的行业,

   中国人奉行的原则是: 能用假就不用真的,能用盗版的就不用正版的,还有就是没有市场的东西不做, 目前中国人做的软件是什么行业呢,中国人只做不会被轻易盗版的行业。

   国产软件被盗用的主要是在

   通用性应用软件,譬如杀毒,网络安全,媒体播放

   代表作:金山词霸,影音风暴,瑞星,天网之类.

   很多人就把金山公司当作了中国软件业的代表,说中国软件的代表是金山词霸和wps,实际大错特错。

  

   三。中国软件业特点

  

   中国的二三产业规模,产值数倍于印度,同时各行各业的信息化程度远高于印度。 中国的这么多行业,几乎每个行业都有自己的行业软件,这些软件是无法盗版,因为和业务相联系的,脱离了业务,

   换了一个行业,代码就成了一堆垃圾,所以没有人会去盗版,

   1。你每天做工交车,地铁,其收费,控制系统(控制系统里面有部分是外国的程序,是和硬件结合的)

   2。每天买东西,吃饭 收银系统

   3。医院, 医院管理系统

   4,证券交易系统 ,这个不用说了

   5。中国最为发达的制造业,从进货-销售-财务-库存,这个链条,都是中国人开发的软件来管理的

   6。你每天都是在上网,估计没有一个中国网站是外国人来编写程序建立起来的吧,就象天涯。。

   7.还有一块,就是象华为一样,软硬结合,主要是嵌入式开发,

   8。。。

  

   看清楚了吗? 中国人就是做的这些东西,做来是给自己用的,而印度人是做软件来给外国人用的。 还有一点,这些软件盗版有用吗? 比如你盗版了一个证券交易软件,有证券公司敢用的你软件吗? 所有这些软件除了业务上面的关联,还有一个就是后续需求变更,升级服务,不是一锤子买卖。

  

  四。印度软件的特点

   可以和印度软件业相比较的是,中国的低端制造业务,譬如衣服,鞋子,玩具,箱包。 已经做到了高度的市场化,分工合理化,中国形成了领带,纽扣,拉链。。。等各种门类齐全, 零件生产流水线,产量大,生产成本低。

  

   对应到印度软件,就是其流程清晰,管理严格。从需求分析-系统设计-功能设计-开发-测试,环环相扣, 每一个环节的流程监督和质量控制都做到位。

  

   同时印度的软件公司更象软件工厂,几千上万人的软件公司不在少数。一年产值几亿几十亿美圆。

  

   五。形成中国和印度软件特征的原因

  

   中国和印度软件只有差别,没有办法比较差距。

   因为两者是完全不同的模式

   有一句话是很适用的,经济基础决定上层建筑

  

  

   印度软件的项目来源:外包

   特点:需求明确,功能明确,时间进度要求明确。

   客户素质:高,管理规范

  

   中国软件的项目来源:内需,遍地开花。

   客户素质:参差不齐,管理不规范

   特点:需求,功能,时间进度好象都可以随时在变

   在中国,软件公司当然是属于弱势一方,客户就是上帝,有了这样的客户,你还寄希望于软件公司管理能规范吗?

  

   从软件工程的角度来说:

   项目失败的原因多是 1。需求分析不到位,设计偏差

   2。进度控制不力,未按时完成

   3。软件质量不稳定,无法上线等等

  

  

   在中国,一个软件项目失败最多的原因却是

   需求不可控。

   你无法阻止客户不断提需求,变更需求,变更流程。

   在这样的情况下面。如果你能够把这一点控制的稍微好一点,

   项目成功可能性就比较大。

  

   而在中国,怎么达到需求可以控制呢

   1。大软件企业,处于行业垄断

   2。贿赂客户公司领导

   3。行业自身特点形成的需求约束

   4。最后才是和客户沟通。

   一般小软件公司做大项目,基本没有好事,最后的结果多半是自己被客户无限制变更的需求压的喘不过气,最后客户也丧失信心了,项目被终止。

  

   六。中国和印度两种模式的后果

   1。中国人把软件做成了劳动密集型产业,遍地开花,印度人把它做成了技术密集型企业, 在中国,IT行业的人都成了IT民工,尽管印度的人均GDP低于中国,但IT人员的 收入远高于中国。 另外一方面,中国的软件产值早已经超过了印度,在世界上面居于美国,欧盟,日本之后。

  

   2。中国的软件企业成了血汗工厂,为中国各行各业信息化铺路了。

  

   一个最简单的例子,一个几十人的工厂,是不会大型的软件企业为其开发软件的, 这个工厂也买不起这样的软件,而在中国,很多软件企业只有几个人,就会这样的小工厂服务, 他们没有任何规范的软件工程流程,所见即所得,赚到一点算一点。其他任何行业中,只要能 利用到软件,可以提供商机的都有人来涉足。譬如小区监控,家庭智能控制等等。

  

   另一方面大软件公司提供的软件同样非常便宜,因为盗版的缘故,中国人忽略了软件的价值, 导致中国的软件价格普通很低,按照个人的衡量,中国软件公司的开发出来的软件 应该按照美圆来计算,

   在中国,一个大型的软件只值100万元,而在印度,它也至少值100万美圆。。 在外国,一个企业软硬件的投入至少应该是12左右,在中国人们只知道硬件是需要花钱,认为软件是非常容易的开发的,不需要花钱。

  

   3。中国有非常完整的行业软件供应商,并且在各自行业形成了初步垄断 证券,保险,银行,医疗,财务,交通,服装。。。还有很多形形色色的ERP 在这些行业,都有一些出色的软件公司,规模中等,所做的产品符合该行业的业务需求, 在这些行业,竞争力非常强,外国软件基本没有空间。 在这些行业里面,我们几乎不 把微软,IBM当作竞争对手。微软,IBM做的东西一样会被客户换掉。

  

   4.IT人员出路渺茫,最后都被迫转型,IT行业成为了年轻人的行业.很多的IT人员从软件公司 流动了其服务的客户企业中,结果变成了在中国,最资深,最有经验的IT人员基本都在客户公司里面 吃老本过日子。

   当然中国的好的企业大多有自己开发团队,这些东西本身并不计算入中国的软件产值。

  

  七 发展前景

   1。印度软件外包遇到了和中国制造业出口相同的局面,就是外来订单减少,用工成本增加。 印度的IT人员成本是高于中国的,随着IT人员工资的逐步增加,利润减少,出现了发展困境。

   中国还说产业升级,而印度连软件内需都不大,如何升级?

  

  

   2。中国的软件业将高速发展,但IT人需要好自为之。

   前景一片大好,软件应用无孔不入,但IT人的生存环境却不会好转,需要找准自己的方向, 软件企业的血汗工厂特点将会更加明显。 在中国,很多城市都在借鉴印度的外包模式,希望从国际外包市场上面分一杯羹, 我觉得这是方向性的错误,中国学印度模式没有任何优势,只有死路一条。

  

   从事IT的人,要在中国的环境中生存,不要在外包企业中呆的时间过长,那样的话,将无法适应 中国残酷的环境,因为外包企业本身也不是能够提供你一份长久稳定的工作。



--
yaoms

2010年3月25日星期四

产品策划经理: 既要想象,又要实干

产品策划经理: 既要想象,又要实干

    产品策划经理既然挂上了经理的头衔,就已经清晰地说明了这个职位的定位和职责范围。经理必须懂得经营和管理,在手机终端这样一个吃“技术饭”的领域,对专业知识的掌握也必不可少,更由于工作重心落在策划上,因此对求职者的产品营销知识和市场敏感度也提出了要求。 

职位描述: 
    1. 协助公司制定市场整体策略、产品战略及运营平台规划,进行无线产品及手机应用类产品及产品包的策划; 
    2. 制定各产品线的市场推广方案,负责公司市场活动策划,监督公司的市场营销效果并制作相应的市场分析简报工作; 
    3. 综合分析用户需求,对受众及客户需求进行深入调研,从用户使用角度出发,构建产品应用场景及产品体验端设计和用户体验优化方案; 
    4. 进行必要的市场调研,了解市场、产业、技术的现状和发展趋势,熟悉竞争对手及合作对象等各方面的状况信息; 
    5. 结合公司目前已有的用户资源和合作资源及内部资源,根据既定的产品策划方案协助研发线进行产品商业化开发; 
    6. 负责公司新产品的创意、策划、改版,完成策划后,配合技术、设计、市场等部门进行相关的开发、运营和推广工作; 
    7. 为客户及潜在客户提供不同阶段的产品推广文档。 

任职要求: 
    1. 电子、计算机、营销策划类大学本科以上学历,曾在手机行业从事产品调研分析、产品策划或其它IT行业同种工作; 
    2. 对市场需求、用户行为特征及产品价值有一定的理解,能够提出适合无线互联网行业特点的产品策划方案; 
    3. 具有较强的项目管理、执行、控制能力,沟通能力强,善于与公司内部各部门和外部合作伙伴交流; 
    4. 熟悉通信、SP、无线互联网行业,熟悉手机产品规范和业务规范,在手机行业有较强的人际关系和开拓能力; 
    5. 具有较强的逻辑思维能力和敏锐的市场触觉,能够发掘用户的直接需求并正确地反馈和体现到产品规划中; 
    6. 具有深厚的文字功底及良好的文字驾驭能力,具备优秀的创意和提案能力; 
    7. 具备积极的学习态度和良好的应变能力,能适应快速发展和变化的工作环境。 

入职门槛: 
    无论是终端产品设计制作人员还是市场营销人员都有可能晋升到这个中层岗位,关键在于复合知识的平衡性,如果只在其中一方面突出,无法证明你能胜任产品策划经理的工作。此外,由于策划方案牵涉甚广,因此沟通能力决定了策划方案的实施进度和完成情况,良好的人脉关系和拓展能力也能帮助产品策划经理的工作顺利进行。市场和客户是产品策划经理需要关注的重点,任何脱离需求的产品制作得再完美也无法成为成功的产品。及时保留产品信息和数据资料也很重要,这决定了策划方案的进化和新产品的开发方向。 

    以往从事产品策划也许只需要关注其中一方面的内容,但成为经理意味着必须对方案信息全盘掌握。产品策划经理不需要亲自去做每一件事情,但应该了解每一件事情,并让它们朝着正确的方向发展。 

职业晋升通道: 

    产品策划——产品策划经理 

快速成长秘籍: 

    洞悉市场的能力:这里的“市场”概念很大,它包括行业和产品的现状及发展趋势,客户需求及竞争对手的情况。占得先机是要靠天马行空的想象力,但更重要的是,要符合市场的需求,不能符合现在的需求,那等你的产品出炉已经太晚了;也不能是十年后的需求,那太飘渺。像下围棋一样,如果你能从现在的局势安排好后三至五步,也许你就可以在市场上领先对手一大步,当然对手也在进步,所有对市场的了解应该是全方面的。 

    数据分析的能力:策划看起来是一份相当有创意的工作,可它必须以牢固的数据信息作为前提。对产品的目前状态、发展情况,特别是收益增量要有充分的了解,这可以帮助你在改进策划方案或者进行新产品策划时有更好的选择。同样,数据报告能作为你提案和年终考评的重要依据,比起口若悬河的描绘来,老板更喜欢一目了然的数字,你做了多少,做好了多少,数字不会说谎。 

    沟通协调的能力:策划方案完成后,你也别想立刻享受一个假期。方案的真正推广会牵涉到很多细节问题,你不得不与市场、渠道、销售、客服等各个部门打交道,把方案的理念传递给他们。良好的部门协作是提高工作效率的最佳途径,但同时也是最难做到的部分。 

    处理突发情况的能力:这种能力建立在丰富的经验基础上,同样对人的应变能力也是一种考验。当发生意外事件时,如果曾经遇到过类似的情况,要能够立即根据先前的流程记录来处理问题,如果是从未遇到的情况,那要能够分清问题的主次,由重到轻将问题妥善解决。这种能力只能依靠积累,而在每一次遇到问题时,除了抱怨,也应该想到这是你积累的一笔财富。 

无忧“薪”经: 

    产品策划经理的薪资根据各个公司对岗位职能的定位不同而存在较大的差别。如果职责范围较为狭窄,只负责产品策划和推广的话,那么年薪大约在6万元左右。如果职位不变,职责范围扩大了,则会相应增加薪资,比如如果产品策划经理同时负责市场合作和客户维护,那么年薪可以达到近10万。大多数公司对这个岗位的职责界定并不清晰,因此在面试时多了解这方面的信息比较重要。 

    此外,如果推广和营销在产品策划经理的职责范围内,那么多数公司会对经理有指标要求,与此而来的则是可观的奖金。当然,肩负在产品策划经理肩膀上的压力将更为沉重。 

业内人士感言: 

    Tim 产品策划经理 从业5年 

    “大公司因为流程规范,所以产品策划经理的职责相对狭窄,有时候产品策划人员和产品策划经理的区别只在title和薪资上。而同样的职位,在小公司里,产品策划经理的工作要复杂得多,不仅要做方案和推广,市场合作、营销活动、运营维护甚至客户服务也会包括在内,如果想真正多学点东西,还是去小公司比较好。”(完)

2010年3月24日星期三

一劳永逸的翻墙方式

本文将提供一种一劳永逸的翻墙方式(ssh -D),实施之后,那道墙――对你来说――将从此透明。

本文面向的用户:使用Windows作为操作系统并且使用Firefox作为常用浏览器。

第一步:免费获取拥有SSH权限的帐号和密码。

默认的免费获取方式:将本文转载到你自己的博客上,将转载后的文章网址发送到f.ckgfw#gmail.com

转载方式:拷贝文章代码至博客后台HTML编辑器中,直接发布即可,文章标题自拟,可在前后文插入自己的评论。

经过人工审核,你将收到一封附有五个拥有SSH权限的帐号和密码的电子邮件,你可以将它们赠与你自己的读者。

更多获取方式将在今后陆续激活,请关注帐号配送中心:https://friendfeed.com/rooms/fuckgfw-for-free

第二步:配置MyEntunnel软件

下载并安装MyEntunnel,该软件全名为My Encrypted Tunnel。

一键下载:https://dl.getdropbox.com/u/398/myentunnel.exe

myentunnel

按照上图将第一步收到的帐号信息填写到相应的地方后,点击save按钮,再点击hide按钮。

第一次连接过程中会出现一个认证对话框,按照提示确认即可。以后的自动连接中将不再出现此认证对话框。

最后点击hide按钮,使对话框隐藏到系统任务栏中。

提示:

为MyEntunnel创建一个快捷方式,将其复制到系统的【启动】(C:Documents and Settings当前用户名(需要修改成你自己的)「开始」菜单程序启动)文件夹中,今后开机便可自动启动软件,并自动连接服务器。

tray

绿色代表连接成功且稳定;黄色代表正在连接或重新连接;红色代表连接失败。

第三步:配置Firefox浏览器

假设你正使用Firefox浏览器阅读本文。

一键安装:https://dl.getdropbox.com/u/398/autoproxy.xpi

xpi

点击立即安装,安装后,重新启动Firefox。然后你会看到如下对话框,选择gfwlist (P.R.China)后,点击确定。

gfwlist

接着你会看到Firefox主界面右上角出现有一个"福"字图案,点击"福"。

fu

点击"代理服务器――编辑代理服务器"。

edit

随即出现如下画面,你会看到如GAppProxy、Tor和Your Freedom这样一系列代理服务器名称。

before

将GAppProxy一栏的参数修改为如下图所示。

after

修改完毕后,点击确定。至此配置已全部就绪。

获取更多帮助,请参与反馈:https://friendfeed.com/rooms/fuckgfw-feedback

第四步:支持fuckGFW

获取详情,请关注捐赠与推广中心:https://friendfeed.com/rooms/fuckgfw-donation-and-marketing

版权信息:您可以自由复制、传播、演绎本作品且无需署名、无需注明原始出处。


--
yaoms

2010年3月19日星期五

我们有一个女数学教师,四川人,普通话还可以,可就是 “吻”和“问”总是分不清。

有一次她给我们讲完一道题问大家说:“大家听明白了吗?不明白的话可以起来‘吻’我。”同学们一听都惊讶了,都你看看我我看看你的,没一个人起来。她又说:“怎么,不好意思起来‘吻’是不是呀?”同学们一听更是恶然了,有的同学快笑出来了。老师一看还是没人问就说:“都这么大了,还不敢‘吻’呀,好了,不会的等下课后到我办公室,没人的时候‘吻’我。”哈哈!同学们最终还是没忍住笑了出来。
一人坐飞机,向空姐要了瓶矿泉水,怎么等也不来,正在懊恼,听见身后有人喊:“老子要的XO 呢?还他妈不来,找他妈抽呢吧!”心想:谁这么牛*啊?回头一看,原来是只鹦鹉。只见空姐屁颠屁颠地跑来,说:“对不起,马上就来。”果然,马上拿了瓶 XO来,谁知鹦鹉又喊:“去你屏蔽词语,你丫耳背吧,我他妈要的是矿泉水,找死吧你们!”空姐忙说:“对不起,马上给您换。”此人心想:原来她们怕横的啊,于是站起来冲着空姐喊到:“我CAO你屏蔽词语,我他妈要的矿泉水你们 丫什么时候拿来,找我废你们呢吧!***!”空姐说:“请稍等。”一会,空姐带了一个大壮过来,空姐一指,“就是他!”大壮就把这个人扔出了飞机。此人一边下落一边想,我一大老爷们,还没只鹦鹉面子大,越想越搓火,突然看见鹦鹉也被扔了下来,鹦鹉经过他身边时说:“你丫也不会飞,还那么牛B?”

2010年3月18日星期四

有个小男孩,有天放学后,问他的妈妈:“妈妈,我到底是从哪里来的?”
妈妈觉得这个问题不好回答,但应该趁此机会教育小孩,就一本正经地以猫狗为例,支吾地谈及生殖的过程。
儿子听完后,一头雾水地说:“怎么会这样?我的同桌说他是从山西来的!”

2010年3月16日星期二

测试

2010年3月12日星期五

=?GB2312?B?suLK1LeizbzGrKOstNNHMw==?=
=?GB2312?B?suLK1LeizbzGrKOstNNHMw==?=
购入了G3,朋友们推荐几首好歌让我放进去。
http://ping.fm/4JyeZ 近日,全国人大代表、中国移动重庆分公司总经理沈长富提议,为防止学生沉溺网游,影响休息学习,建议网络游戏分时段开放。同时沈长富还建议屏蔽网络不良用语,如“3Q”(ThankYou)、bt(变态),还有“囧”、“槑”等生造字,青少年长期接触这些网络语言,会产生不好影响。此提案一出,议论之声不断。

2010年3月5日星期五

linux 是自由进化的,像是一个生态系统,没有统一标准,只看有没有生命力。

2010年3月2日星期二

Win下显示和隐藏Opera 10.50 的菜单栏的方式: 首选项->快捷键->选中键盘设置(Opera Standard)->点右边的编辑->在搜索框中输入"menu bar" 找到对应显示和隐藏菜单栏的快捷键设置项->将左边的Platform信息去掉(改为 F11 alt)->点确定保存 :D
刚打电话取消了建行信用卡的纸质对账单,启用了电子对账单。

2010年2月28日星期日

[11:21] http://ping.fm/Tsj3E
[11:21] 麦当劳里肯德基券也能“啃得鸡”-麦当劳|肯德基-新闻频道

2010年2月27日星期六

[转载][无线玩家]玩转无线路由之DD-WRT基础扫盲

2009-02-22 00:29
不知道各位读者是否听说过DD-WRT?是否自己亲自将无线路由器刷新成DD-WRT无线设备?相信真正的无线设备爱好者一定对DD-WRT非常熟悉,我们通过给无线路由器刷新DD-WRT驱动程序后就可以让自己的设备发挥更多原先没有的功能。笔者将通过多篇文章为大家呈现DD-WRT相关的内容,希望各位IT168的读者可以从零起步了解DD-WRT的来龙去脉,了解如何刷新DD-WRT驱动,如何实现功能的提升。 
一、什么是DD-WRT: 
首先我们来了解下DD-WRT的基础概念,在介绍他之前先举一个例子进行比较方便我们理解。众所周知我们最常用的操作系统是windows,大家使用windows系统已经习以为常,但是他的全部源代码是没有对外公布的,因此一些编程爱好者就愿意使用开放源代码的linux类操作系统。在linux操作系统上我们可以根据自己的喜好以及实际需要来编写,在实际应用上更加灵活。   反观我们经常使用的无线路由器,实际上每台无线路由器也都有一个操作系统OS,每个厂家的无线路由器操作系统都不相同,而且也没有对外公布代码,这就类似于windows操作系统,虽然我们可以正常使用这些无线设备,但是由于他的OS是不能够自己修改的,所以难免在实际使用上存在这样或那样的不足,可能不适合自己使用。在这种环境下DD-WRT驱动应运而生。 
     DD-WRT是一个“第三方”固件,他广泛的应用于Linksys WRT54G/GS/GL或其他基于Broadcom参考设计的802.11g无线路由器,他的本质是一个linux操作系统。当然网上众多高手在逐步完善和增加DD-WRT的驱动功能,所以现在我们使用的DD-WRT固件驱动实际上已经和起初存在很大的区别了。 
二、给无线路由器刷DD-WRT固件的好处: 
如果说一台无线路由器的操作系统OS相当于他的大脑,那么我们把给这个无线路由器刷新DD-WRT固件就意味着给此设备洗脑。经过洗脑操作后我们的无线设备将发挥更好的作用,所支持的功能更多,运行更加稳定。 
     说白了刷DD-WRT就是将原来设备的OS抛弃,更换一个新的OS,多多少少有点类似于硬件爱好者常用的“超频”操作。 
     一般情况下我们称那些刷新了DD-WRT固件的无线设备为DD-WRT无线路由器,这种无线路由器在以下几个方面存在着很大的优势,功能更多,相比传统无线路由器来说,DD-WRT无线路由器功能更强大,支持的应用更多。 
     (1)支持3322.ORG的DDNS,支持花生壳的DDNS。 
     (2)可以利用QoS、限速、限连接数等设置来优化带宽。 
     (3)支持VPN的PPTP客户端和PPTP服务端设置,可以提供VPN接入。 
     (4)可以轻松实现无线的定时开关。 
     (5)可以通过配置轻松管理各种网络应用,例如彻底封杀BT,电驴,迅雷。 
     (6)支持UPNP和端口映射功能。 
     (7)支持语言种类很多,可以搭配802.1x (EAP(Extensible Authentication Protocol)-局域网上扩展认证协议封装)来增加网络认证应用。 
     (8)IPV6支持,SNMP协议支持,SSH服务支持等。 
三、能够刷新DD-WRT固件的设备型号: 
 

很多读者也许都听说过Linux操作系统,知道它是和Windows抗衡的另一大流派的操作系统。但大家也许不知道,Linux极其灵活,不仅可以运行在大型服务器、台式机之上,也可以运行在各种小型终端设备,这其中就包括无线路由器。DD-WRT其实就是一个供无线路由器使用的嵌入版Linux,它可以在普通的家用无线路由器实现数千元的商用无线路由器功能,不仅如此,对于高手它甚至可以允许自行编译程序,自由扩展无线路由器功能。 
DD-WRT的起源要追溯到2003年,当时Cisco/Linksys发售了WRT54G无线路由器,它支持当时最高54Mbps的连接速度。同年有爱好者发现WRT54G的IOS固件是基于Linux的(IOS就是Cisco对于自己网络设备操作系统的称呼),然而使用Linux作为操作系统的一个基础条件就是必须把原代码公开,这件事传开之后,本来Cisco 拒绝公开源代码,但最后迫于公众压力,2003年三月份,Cisco公开了WRT54G的源代码。这一下可是打开了一个大宝库,众多基于此源代码的第三方固件纷纷出台,其中DD-WRT就是最出彩的一个。 
。 
使用DD-WRT的好处很多,它具有友好的配置界面,支持多语言(包括简体中文),可以让无线路由器支持QoS宽带设置、QoS L7过滤,优化带宽并限制最大上行、下行速度和最大连接数等,并可以封杀或者加速BT、电驴下载。支持多种客户端连接模式,如网桥、中继、客户端等模式。支持数种安全机制,支持客户WPA模式、VLAN、WPA2等安全模式和机制。还支持花生壳的DDNS,方便建立个人网站。它甚至有改造后的直接BT下载功能。这么强大的DD-WRT是完全免费的。 
当然并不是所有的路由器都可以刷新DD-WRT的,毕竟它运行的是Linux系统,需要比较完善的硬件支持,现在可以刷新为DD-WRT的路由器都是基于Broadcom的CPU的系统,并且对内存和存放固件的Flash闪存容量也有一定要求。Flash闪存容量至少4MB,而所有的WRT54GS v4.0版本之前的型号都拥有8MB的Flash闪存容量,而也有部分路由器(包括WRT54G和WRT54GS的v5.0型号)仅有2MB的Flash。需要大家注意的是:DD-WRT的完整版(Standard Vision)和迷你版(Mini vision)的安装都需要4MB的Flash,而2MB Flash容量的路由器只能使用微型版(Micro Vision)。 
在此笔者推荐一些适合刷新DD-WRT的经典无线路由器,它们要么价格便宜,要么性能最强,兼容性也都是最好的。其中包括Buffalo WHR G54s、Buffalo WHR G54s、Asus WL 500G Deluxe以及Motorola WR850G这几个产品,当然也包括WRT54G拥有8MB Flash的产品。 
DD-WRT刷机 
我们首先要到DD-WRT的官方网站http://www.dd-wrt.com/下载固件,现在它共有五个版本,普通用户使用完整版和迷你版即可,它们的最大区别在于完整版支持kaid功能,方便游戏机的无线联网对战。需要注意的是,最好不要追求最新版本,稍老一些的版本反而因为经过了众多用户的除错,会更加稳定。这里推荐v23 sp1及v23 sp2。 
下面以价格较低的Buffalo WHR G54s的产品为例介绍一下如何刷新DD-WRT固件。为保证顺利升级,必须先将路由器恢复到出厂设置,按住路由器的复位按钮并保持至少30秒,拔下路由器电源。然后将计算机的ip地址设置到192.168.11.x的网段内,这也是WHR G54s的默认网段。将计算机与路由器中任意一个LAN口相连,使用交叉网线与直连网线均可。 
接着在Windows XP中通过“开始/运行/cmd”打开命令行窗口,假设固件在c盘根目录下,就先进入c盘根目录,并输入“tftp -i 192.168.11.1 PUT dd-wrt.v23_generic.bin”这里是要利用tftp将固件上传至路由器,此处的192.168.11.1 为WHR G54s 的ip地址,dd-wrt.v23_generic.bin为下载的固件名称。注意,此时先不要按下回车键。 
下面,需要对设备进行操作。给路由器接通电源,此时所有的路由器Led指示灯都会被点亮,约一秒钟以后,此时除了计算机所连路由器端口对应的指示灯之外所有的端口指示灯均会熄灭,我们需要马上按下回车键,进行传输。这里不需要紧张,即使得到一个“Time Occurred”的超时提示也不要紧,重复上面的操作即可。如果我们输入及时,文件开始传输,那么接着WHR G54s的LAN指示灯会经过大约6秒钟的频繁闪动之后,将得到一个类似于:Transfer successful: 3502080 bytes in 5 seconds, 700000 bytes/s的输入成功提示。最后在bridge/diagnostic指示灯熄灭之后路由器将重新启动DD-WRT。此时WHR G54s已经刷新成功,它的地址为192.168.1.1,路由器默认的登陆的用户名为'root',密码为'admin'。


DD-WRT的特色应用 
首先我们要登录DD-WRT设备,由于它的初始IP一般为192.168.1.1,所以我们要将本机地址设置为同一网段,比如192.168.1.2就可以直接在浏览器中输入http://192.168.1.1进入DD-WRT设备控制界面。默认用户名为root,默认密码是admin,登录完毕后就可以看到DD-WRT无线设备的管理界面了(如图1)。由于功能强大,所以DD-WRT管理界面上的设置很多,从左到右依次为“设置、无线、安全、访问限制、应用程序&游戏、管理、状态”,每个页面又下分多个子项,选项是非常之多。


1.定时开关无线信号 
很多用户都有定时开关无线信号的需要。比如很多家庭用户在晚上休息时并不需要开启无线信号,还可以减少无线信号对人的影响,此外在单位常常需要限制用户在夜晚或者节假日这些非工作时段使用无线网络,这就可以使用DD-WRT的定时开关无线功能,比单独使用它的访问控制要方便安全得多。


首先需要进入“高级无线设置”页面。我们可以看到Radio Time Restrictions的字样,它的初始默认状态是禁用,这里我们将其更改为“启用”。然后会出现24个方块图标分别代表一天的24小时(如图2),其中绿色代表开启无线,红色代表关闭无线,我们就可以自由设定每天的那些时间开启无线,那些时间关闭无线信号。 


3.手动更改无线信号强度 
我们在市面上买到的无线路由器的功率是固定的,个人想去改变它基本是不可能完成的任务。但在实际使用中往往会遇到需要增大无线功率而提高一些传输距离或者穿墙能力的情况,尤其是在就差一堵墙就可以实施成功的时候,信号强度问题的确是能急死人。而DD-WRT设备就拥有调整无线信号发射功率的功能,可以在一定范围内自定义设备的发射功率。


同样是在“高级无线设置”页面,其中有一个Xmit功率选项,它就是调节无线功率的地方(如图3),范围在0~251毫瓦之间,默认是28毫瓦。如果我们觉得自己的无线网络不太稳定,或者就差不远就可以达到自己的理想距离我们可以在这里进行调解,经过试验,这项功能的作用还是很明显的。不过笔者提醒大家不要一味的去增大功率,毕竟高功率设备可能对人体有害。其实我们也可以反其道而行之,对于无线信号十分良好的用户,可以适当降低无线信号的发射功率,以便将它对身体的影响降到最低。 


4.封杀BT,电驴等P2P软件
现在P2P下载软件已经成为事实上的最大下载来源了,但同时它的多并发、大流量的特点也占用了大量带宽资源,使得局域网其它用户网速变慢,严重的甚至造成网络设备死机或使整个网络瘫痪。在Windows系统上封杀P2P下载软件相对复杂,但通过于DD-WRT就可以方便地实现,而且可以直接使用图形界面进行设置。首先需要进入“访问限制”页面(如图4),这里不仅可以封杀P2P等软件还可以按时间、网址、关键字直接控制不允许上网的时间和不允许访问的网站。 



我们需要在这里建立一个访问策略来控制P2P软件,先允许使用策略,然后把策略名字命名为“禁止P2P”,在“编辑PC列表”中可以直接按照PC的MAC地址或者IP或者网段来指定这条策略对那些PC起作用。允许访问互联网的日期和时间大家可以根据自己的情况设置,可以指定每周的那一天可以访问,也同时可以设定每天那个时段才可以访问,相当之强大。
接下来就是最重要的“被封禁的服务”这里了,这里可以指定禁止那些网络服务,可绝对不仅仅是P2P软件,近乎包括当前所有流行的网络应用,甚至包括流行的网络对战游戏,比如《战地》、《魔兽世界》等。在这里我们需要把“捕获所有P2P协议”打钩,在下面的应用程序栏选上“bittorrent”和“edonkey”,甚至对于“讯雷”在列表中都已经存在。如果你要禁止的服务在列表中并没有显示,这时就要使用自定义设置。 
点击“添加编辑服务”,在这里我们可以对自行添加的服务命名、选择协议类型,最后再设定它使用的端口就可以了(如图5)。其实从上面的说明大家可以看出DD-WRT的访问控制可不仅仅是仅仅供我们封杀P2P这么简单,它几乎可以实现对任意主机在任意时间进行任意网络访问的控制。 

5.用命令行限制网络连接数
当然也许有些场合不能公开限制P2P软件的使用,但网络现状又使得限制成为一种必要,这时就可以利用限制连接数来限制P2P软件的使用,来达到即允许你使用,但又实际无法占用大量带宽的目的。此时,我们要在图形界面中使用Linux命令。进入“管理”页面,在其子页面中有一个“诊断”选项。在“诊断”中一个命令外壳,有点类似于Windows中的DOS命令窗口(如图6),在这里可以输入linux命令。如果我们要限制局域网内每个用户的连接数为20,就输入: 

iptables -I FORWARD -p tcp -m connlimit --connlimit-above 20 -j REJECT

如果要限制指定的局域网用户的连接数为20,比如为192.168.0.123,就输入: 

iptables -I FORWARD -p tcp -s 192.168.0.123 -m connlimit --connlimit-above 20 -j REJECT
最后是限制除指定用户以外的IP连接数为20,比如仍为192.168.0.123,则输入: 

iptables -I FORWARD -p tcp -s !192.168.0.123 -m connlimit --connlimit-above 50 -j REJECT

将这些命令填入命令窗口,点运行命令运行即可。
6.QoS分配网络带宽使用优先权,优化特定服务 
这里要先解释一个名词服务质量QoS,它的意思是根据服务的级别来分配网络带宽使用优先权,一般来说QoS服务质量都是在高端路由交换设备才支持的,但我们的DD-WRT也支持哦,很多用户就是冲着QoS来购买DD-WRT设备的。比如我们家中或者小区、单位中有人在下载,有人在游戏,有人在浏览网页,这时就需要用QoS配置服务的优先级,限制或降低不希望运行程序的优先级,这样就可以让这些高占用带宽的程序为带宽敏感的网络游戏让步了。 
QoS位于“应用程序&游戏”页面的QoS子页面下。首先要将QoS设置为允许,然后根据自己的网络情况填写网络参数,包括上行速度和下行速度等,上行速度设置为自己的总上行限制的80%~95%,下行速度设置为自己的总下行限制的80%~100%。要是游戏爱好者的话当然要选中“为游戏优化”(如图7)。 


最后要在“服务优先级”处设置不同网络应用的优先级,比如这里设置为《魔兽世界》的优先级最高,这样网络中其他的用户都要给这个游戏的带宽利用让路。同时和上面一样我们也可以利用“添加编辑服务”按钮来任意添加自己所要使用的服务。
由于篇幅限制,还有动态域名系统、端口绑定提速、开启SNMP协议、DHCP转发功能、动态路由协议、划分VLAN、WDS中继服务等等众多的特色功能没有介绍。但笔者希望抛砖引玉的介绍能够引起大家对DD-WRT无线路由器的兴趣,选择DD-WRT无线路由器没错的。 

附:支持DD-WRT固件的无线路由器 
Allnet:All0277
Askey:RT210W
Asus: 
Asus WL-500G deluxe
Asus WL-500G premium 
Asus WL-300G 
Belkin: 
F5D7130/7330 (2mb flash) 
F5D7230-4 v1000, v1010, v1111 
F5D7230-4 v1444 (2mb flash) 
Buffalo: 
WHR-G54S 
WHR-HP-G54 
WHR-HP-G54S 
WZR-RS-G54 
WBR-G54 
WBR2-G54 
WBR2-G54s 
WLA-G54 
Linksys: 
WRT54G v1.0, v1.1, v2.0, v2.2, v3.0, v3.1, v4.0, v5.0 (2mb flash) 
WRT54GL v1.0, v1.1 
WRT54GS v1.0, v1.1, v2.0, v2.1, v3.0, v4.0, v5.0 (2mb flash) 
WRTSL54GS v1.0 
Motorola : 
WR850G 
Ravo: 
W54-RT
Siemens: 
Gigaset SE505
Gigaset SX550i

--
yaoms