2011年6月23日

拯救不读SD卡的G1手机之无卡拍照


我的手机自从不读SD卡以后,手机的相机、播放器功能都变成了摆设。前段时间卡片相机丢失以后,痛感手机无法拍照的不便。
于是GOOGLE了一番,折腾了个APP,让拍照以后将照片直接保存到APP的私有目录而不是SD卡。
APK很小,只有15K,下载地址:http://app.smallsmartsolution.com/ttdc.apk
说明几点:
1、由于是调用系统API拍照的,分辨率是最大值。
2、设置成横屏预览模式。
3、文件保存的路径是/data/data/com.smallsmartsolution.ttdc/,文件名是生成日期时间+.jpg。
4、拍照完成以后系统自动进入照片查看模式,但只查看SD卡的内容,所以象我的情况,其实是没有显示任何内容,需要按返回键退出。这可能是系统API的设定。
5、文件的下载需要利用ADB工具进行,用ECLIPSE的DDMS可以批量下载,没有别的办法。

2011年6月18日

DestAlarm – an Android APP

DestAlarm is a useful tool for your travel, it will alarm you up ahead of your destination.
The handset GPS will update every 30 seconds or 200 meters, and check current location with your destination, as soon as the distance is less than your set, then it will alarm you by notification and ringtone.
So keep your travel cool with this personal assitance.
Developed by tallrain, any feedback pls contact: tallrain@gamil.com, or RT me @tallrain.:)

https://market.android.com/details?id=com.smallsmartsolution.destalarm
image.png

2011年6月16日

Xbox/Kinect Tips


1、左手挥向左下角退出KINECT游戏。
2、在XBOX操作面板中,右手扇形挥手可启动KINECT识别。
3、HDMI线的质量会影响视频传播,我之前碰到过电视偶尔黑屏的情况,换线就好了。
4、通过无线路由,XBOX可以和家里的PC组成家庭网(PC采用WIN7操作系统),可以播放家庭网的视频、音频、照片。但是视频只支持WMV/AVI/MPG,音频只支持WMA。
5、在PC上安装TVersity软件和K-lite codec pack,可以直接在XBOX上播放PC上的RMVB/KMV等视频。

2011年6月9日

Use Excel to Read XML

Sub Button1_Click()

' clear data
J = Worksheets("Sheet1").UsedRange.Rows.Count + 1
Worksheets("Sheet1").Range(Cells(1, 1), Cells(J, 3)).Clear
 
' to create data
    Dim objDOM As Object
    Dim targetNode As Object
    Dim Clone As Object
    Dim Node As Object
    Dim ChartUnit As Object
    Dim targetNode2 As Object
    Dim Clone2 As Object
    Dim Node2 As Object
    Dim ChartUnit2 As Object
    Set objDOM = CreateObject("MSXML2.DOMDocument") 'UTF8
    'Set objDOM = CreateObject("MSXML.DOMDocument") 'Normal
    objDOM.async = False
    
    facility = "CFSW"
    fname = CStr(Worksheets("Sheet1").Cells(1, 6).Value)
    ret = objDOM.Load(fname)
    Dim objPageHeader As Object

    I = 1
    If ret Then
       Set targetNode = objDOM.DocumentElement.SelectSingleNode("//UserConfig/Facilities/Facility/Connectors").ChildNodes
       For Each Clone In targetNode
            Set ChartUnit = Clone.CloneNode(True)
            Set Node = ChartUnit.FirstChild
            If ChartUnit.HasChildNodes Then
                Connector = Node.Text
                Set targetNode2 = ChartUnit.ChildNodes.Item(11).ChildNodes.Item(0).ChildNodes.Item(10).ChildNodes
                For Each Clone2 In targetNode2
                  Set ChartUnit2 = Clone2.CloneNode(True)
                  Set Node2 = ChartUnit2.FirstChild
                  If ChartUnit2.HasChildNodes Then
                     Device = Node2.Text
                     Worksheets("Sheet1").Cells(I, 1).Value = facility
                     Worksheets("Sheet1").Cells(I, 2).Value = Connector
                     Worksheets("Sheet1").Cells(I, 3).Value = Device
                     I = I + 1
                  End If
                Next Clone2
            End If
       Next Clone
    End If
    
    J = Worksheets("Sheet1").UsedRange.Rows.Count + 1
    
    Columns("A:C").Select
    Range("C1").Activate
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range(Cells(1, 2), Cells(J, 2)) _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range(Cells(1, 3), Cells(J, 3)) _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet1").Sort
        .SetRange Range(Cells(1, 1), Cells(J, 3))
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Rows("1:1").Select
    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    Range("A1").Select
    ActiveCell.FormulaR1C1 = "Facility"
    Range("B1").Select
    ActiveCell.FormulaR1C1 = "Connector"
    Range("C1").Select
    ActiveCell.FormulaR1C1 = "Device"
    Range("A1:C1").Select
    Selection.Font.Bold = True
    Range("E2:F2").Select
    Selection.Cut
    Range("E1").Select
    ActiveSheet.Paste
    Range("E4").Select
    

End Sub




2011年5月23日

Android + Google Maps开发笔记(二):在ANDROID中使用GOOGLE MAPS自定义图层



一、创建图标:
1、创建图标marker.png文件,放在res/drawable目录下。

二、创建图层数据:
1、构造一个Overlay类,继承自ItemizedOverlay。
class MyLocations extends ItemizedOverlay
2、构造一个方法,用于实现加载定位图标。
public MyLocations(Drawable marker)
3、将各经纬度坐标作为GeoPoint合成OverlayItem,输入ItemizedOverlay。
items.add(new OverlayItem(GeoPoint, title, snippet));
4、将Overlay图层标记出来
populate();

三、绘制自定义图层:
1、获取标记图片: marker.png
Drawable marker = getResources().getDrawable(R.drawable.marker);
调用图片的函数必须public,否则不能使用getResources()方法。
2、设置图片的绘制区域大小
marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker.getIntrinsicHeight());
3、设置缩放控制、显示模式等参数。
4、创建自定义Overlay层
MyLocations MyPlaces = new MyLocations(marker);
5、将创建的Overlay层添加到MapView中
mapview.getOverlays().add(MyPlaces);
6、绘图,将地图中心移到第1个标记点
mapview.getController().setCenter(MyPlaces.getCenter()); 
mapview.getController().animateTo(MyPlaces.getCenter());    

2011年5月21日

Android + Google Maps开发笔记(一)

关于ANDROID调试:
1. 普通APP需在项目文件中包含Android API,包含GOOGLE MAPS的APP需包含GOOGLE API。
2. 创建虚拟机的时候,也要选择对应的API。
3. 创建虚拟机的时候,需要增加GPS支持、键盘支持等参数,以方便调试。
4. 如果遇到API报错,在Manifest里Uses Sdk,定义Mini SDK Version与项目包含的API版本一致。
5. Debug Configuration > Launch Action > Launch Default Activity,这样在DEBUG的时候会自动加载APP。
6. 如果INSTALL APP失败,尝试关闭虚拟机,重新开始。

关于GOOGLE MAPS API:
1. 找到Android debug keystore文件,Eclipse > WIndow > Preferences > Android > Build > Default debug keystore。
2. 在JAVA的BIN目录下运行:
C:\Program Files\Java\jre6\bin>keytool -list -alias androiddebugkey -keystore "keystore文件路径" -storepass android -keypass android
产生MD5指纹。
3. 在http://code.google.com/android/maps-api-signup.html输入MD5 fingerprint,产生专属的GOOGLE MAPS API KEY。
4. 在main.xml中增加参数android:apiKey。

00.jpg

2011年5月12日

从ANDROID看智能终端的未来

这次GOOGLE I/O推出的Android@Home非常有意思。我在去年写过一篇文章《android和twitter将改变世界》,预言过ANDROID将引领终端智能化的浪潮,没想到GOOGLE的步子这么快。
本文则试图从智能终端与云的关系这个角度,进一步论述智能终端的发展趋势。
我们知道ANDROID为网络而生,通过TCP/IP网络,一头连着终端设备,一头连着云。终端主要是进行数据的输入和输出,而逻辑处理则主要由云来完成。如果说云是大脑的话,那么终端就是神经元。
我们从民用、公共、工业这三个领域各举一个例子,来说明智能终端的特点。

先看民用(ANDROID@HOME)的例子:电视。
电视经历了这些阶段:无线电视、有线电视、数字电视,对应的云分别是公共云、私有云、TCP/IP云,无线和有线的区别是云的传输通道不一样,模拟和数字的区别是云的传输格式不一样,并且从单向传输变成双向传输。
在数字电视中,机顶盒是一个非常关键的因素,它起着这两个重要的作用:解析数字信号、连接TCP/IP云。现在我们看到已经出现了不少采用ANDROID操作系统的机顶盒。
未来电视的趋势当然是智能化。GOOGLE通过内置CHROME的GOOGLE TV进行布局,而CHROME就起着机顶盒的作用,但是它用GOOGLE帐号取代了智能卡,将用户从运营商私人云中转移到GOOGLE云中。
CHROME和ANDROID的角色非常类似,个人的理解是ANDROID适合采集数据,CHROME适合展现数据。
通过CHROME,用户对电视节目的管理就可以在INTERNET上进行,除了通过PC订阅外,还可以通过PC将节目推送到电视上。
另一个智能化的重点是遥控器,类似KINECT的体验将是遥控器未来的方向。
设想一下以下场景:你从GOOGLE网上商场订购了一台ANDROID遥控器。你把它靠近GOOGLE TV,遥控器自动下载这款电视的触摸屏主题。这样你把它切换到电视模式将可以用来遥控这台电视机。你还可以坐在沙发上用声音遥控,当你发出遥控语音后,遥控器先后做了这些事:
1. 录制控制语音。
2. 将语音信号发送到GOOGLE的云。
3. 等待GOOGLE云的处理。
4. 接收GOOGLE编译过的的遥控指令。
5. 将遥控指令发送给电视机(通过WIFI/RFID/NFC)。
从这里我们可以看出,遥控器作为智能终端,并非终端本身的强大,而是它所连接的云的强大。

再看公共领域(ANDROID@PUBLIC)的例子:汽车导航。
GOOGLE在汽车领域有很大的雄心,其无人驾驶汽车项目据说是布林非常关心的。
导航仪也是一个非常好的智能终端的例子,导航仪这个市场出现没多长,就面临了智能化的压力。
智能导航仪的特点有:
1. 实时更新的地图。
2. 通过云的计算来设计行驶路线。
3. 支持语音指令。
4. 实时接收路况信息。
5. 云会建议你更改行驶路线。
6. 广播政府部门的通告。
7. 通过社交网络与好友互动。
概括一下,导航仪作为智能终端,将云的强大计算能力延伸过来,将INTERNET的社交能力包含进来。

最后看工业领域(ANDROID@INDUSTRY)的例子:工业控制。
当前工业控制广泛采用的技术是基于PLC/OPC的控制,其传输也是基于TCP/IP的,但是它受到很大的限制:
1、PLC所传递的控制信号是电路级的,不能被执行层识别。OPC起的作用仅仅是翻译。
2、OPC作为桥梁,它的信号通道采用的是古老的DCOM技术,而不是企业云。DCOM固有的缺陷造成开发和运营中的大量问题。
我相信GOOGLE在无人驾驶汽车项目上积累的经验,一定可以发挥到工业领域。因为从传感器收集信息,和将指令发送给各驾驶系统,这些都 需要实现工业级的控制。
这方面我了解到的信息不多,但在这里不妨大胆预言一下:
1. 需要进行数据处理的控制器件采用ANDROID之类的智能操作系统。
2. 控制器自身的功能模块,将通过安装驱动的方式被操作系统识别。
3. 控制器与外部系统通过企业云进行调度。
4. 控制指令被企业云翻译为WEB服务。

再补充一点个人想象,未来的智能终端传输指令的方式,很可能就是扩展的微博:不仅仅是文字,还可能是语音或动作、视频信号。
一条微博就是智能地球某个神经节点的信号,ANDROID就象《黑客帝国》中的电子章鱼。
而未来的某一天,当天网苏醒的时候,它发现自己不是诞生在美国国防部的机房,它一直睡在GOOGLE的云里。


2011年5月10日

Excel as Oracle Report


Sub Click2print()
' to query data and print out
' by Taoyun Zhang
' updated on 2011/05/10

 ' to clear data area
 j = Worksheets("Report").Rows.Count
 Range(Cells(18, 2), Cells(j, 6)).Clear
 
' to get input
  so = Cells(3, 3).Value
  Ln = Cells(4, 3).Value
  ws = Cells(5, 3).Value
  nu = Cells(6, 3).Value
  np = Cells(7, 3).Value
  
  Cells(16, 2).Value = "Distribution Time - " + Format(Now(), "yyyy/mm/dd hh:mm")
  Cells(16, 5).Value = "Number of Unit - " + CStr(nu)

' to match query sql

  sql2 = "SELECT" + Chr(10)
  sql2 = sql2 + "  '" + so + "' Shop_Order," + Chr(10)
  sql2 = sql2 + "  iac.station Work_Station," + Chr(10)
  sql2 = sql2 + "  p.productno Part_Number," + Chr(10)
  sql2 = sql2 + "  tt.extended Part_Description," + Chr(10)
  sql2 = sql2 + "  (iac.qty)*" + CStr(nu) + " Quantity" + Chr(10)
  sql2 = sql2 + "FROM" + Chr(10)
  sql2 = sql2 + "  product p," + Chr(10)
  sql2 = sql2 + "  text_translation tt," + Chr(10)
  sql2 = sql2 + "(" + Chr(10)
  sql2 = sql2 + "SELECT" + Chr(10)
  sql2 = sql2 + "  itemall.station," + Chr(10)
  sql2 = sql2 + "  itemall.productid," + Chr(10)
  sql2 = sql2 + "  SUM(itemall.quantity) qty" + Chr(10)
  sql2 = sql2 + "FROM" + Chr(10)
  sql2 = sql2 + "(" + Chr(10)
  sql2 = sql2 + "(" + Chr(10)
  sql2 = sql2 + "SELECT" + Chr(10)
  sql2 = sql2 + "  i.deviatedpart," + Chr(10)
  sql2 = sql2 + "  i.assmworkstation station," + Chr(10)
  sql2 = sql2 + "  i.productid," + Chr(10)
  sql2 = sql2 + "  i.Quantity" + Chr(10)
  sql2 = sql2 + "FROM" + Chr(10)
  sql2 = sql2 + "  cob_t_item_assembly i" + Chr(10)
  sql2 = sql2 + "WHERE i.Active = 1" + Chr(10)
  sql2 = sql2 + "AND i.deviatedpart = 0" + Chr(10)
  sql2 = sql2 + "AND i.assmproductionlineno = '" + CStr(Ln) + "'" + Chr(10)
  sql2 = sql2 + "AND i.effectivedate <= SYSDATE" + Chr(10)
  sql2 = sql2 + "AND ((i.discontinuedate IS NULL) OR (i.discontinuedate>SYSDATE))" + Chr(10)
  sql2 = sql2 + "AND i.parentproductid IN" + Chr(10)
  sql2 = sql2 + "(" + Chr(10)
  sql2 = sql2 + "SELECT" + Chr(10)
  sql2 = sql2 + "  comp_option.productid optionid" + Chr(10)
  sql2 = sql2 + "FROM" + Chr(10)
  sql2 = sql2 + "  product prod_so," + Chr(10)
  sql2 = sql2 + "  product_component pc_option," + Chr(10)
  sql2 = sql2 + "  component comp_option" + Chr(10)
  sql2 = sql2 + "WHERE prod_so.productno = '" + so + "'" + Chr(10)
  sql2 = sql2 + "AND pc_option.active = 1" + Chr(10)
  sql2 = sql2 + "AND comp_option.active = 1" + Chr(10)
  sql2 = sql2 + "AND pc_option.productid = prod_so.id" + Chr(10)
  sql2 = sql2 + "AND pc_option.componentid = comp_option.id" + Chr(10)
  sql2 = sql2 + "AND comp_option.effectivedate <= SYSDATE" + Chr(10)
  sql2 = sql2 + "AND ((comp_option.discontinuedate IS NULL) or (comp_option.discontinuedate>SYSDATE))" + Chr(10)
  sql2 = sql2 + ")" + Chr(10)
  sql2 = sql2 + ")" + Chr(10)
  sql2 = sql2 + "Union" + Chr(10)
  sql2 = sql2 + "(" + Chr(10)
  sql2 = sql2 + "SELECT" + Chr(10)
  sql2 = sql2 + "  item.deviatedpart," + Chr(10)
  sql2 = sql2 + "  item.station," + Chr(10)
  sql2 = sql2 + "  dev.deviationpartid productid," + Chr(10)
  sql2 = sql2 + "  Item.Quantity" + Chr(10)
  sql2 = sql2 + "FROM" + Chr(10)
  sql2 = sql2 + "  cob_t_bom_deviation_history dev," + Chr(10)
  sql2 = sql2 + "(" + Chr(10)
  sql2 = sql2 + "SELECT" + Chr(10)
  sql2 = sql2 + "  i.deviatedpart," + Chr(10)
  sql2 = sql2 + "  i.assmworkstation station," + Chr(10)
  sql2 = sql2 + "  i.productid," + Chr(10)
  sql2 = sql2 + "  i.Quantity" + Chr(10)
  sql2 = sql2 + "FROM" + Chr(10)
  sql2 = sql2 + "  cob_t_item_assembly i" + Chr(10)
  sql2 = sql2 + "WHERE i.Active = 1" + Chr(10)
  sql2 = sql2 + "AND i.deviatedpart = 1" + Chr(10)
  sql2 = sql2 + "AND i.assmproductionlineno = '" + CStr(Ln) + "'" + Chr(10)
  sql2 = sql2 + "AND i.effectivedate <= SYSDATE" + Chr(10)
  sql2 = sql2 + "AND ((i.discontinuedate IS NULL) OR (i.discontinuedate>SYSDATE))" + Chr(10)
  sql2 = sql2 + "AND i.parentproductid IN" + Chr(10)
  sql2 = sql2 + "(" + Chr(10)
  sql2 = sql2 + "SELECT" + Chr(10)
  sql2 = sql2 + "  comp_option.productid optionid" + Chr(10)
  sql2 = sql2 + "FROM" + Chr(10)
  sql2 = sql2 + "  product prod_so," + Chr(10)
  sql2 = sql2 + "  product_component pc_option," + Chr(10)
  sql2 = sql2 + "  component comp_option" + Chr(10)
  sql2 = sql2 + "WHERE prod_so.productno = '" + so + "'" + Chr(10)
  sql2 = sql2 + "AND pc_option.active = 1" + Chr(10)
  sql2 = sql2 + "AND comp_option.active = 1" + Chr(10)
  sql2 = sql2 + "AND pc_option.productid = prod_so.id" + Chr(10)
  sql2 = sql2 + "AND pc_option.componentid = comp_option.id" + Chr(10)
  sql2 = sql2 + "AND comp_option.effectivedate <= SYSDATE" + Chr(10)
  sql2 = sql2 + "AND ((comp_option.discontinuedate IS NULL) OR  (comp_option.discontinuedate > SYSDATE))" + Chr(10)
  sql2 = sql2 + ")" + Chr(10)
  sql2 = sql2 + ") item" + Chr(10)
  sql2 = sql2 + "WHERE dev.originalpartid = Item.productid" + Chr(10)
  sql2 = sql2 + "AND dev.effectivestartdate <= SYSDATE" + Chr(10)
  sql2 = sql2 + "AND ((dev.effectiveenddate IS NULL) OR (dev.effectiveenddate > SYSDATE ))" + Chr(10)
  sql2 = sql2 + ")" + Chr(10)
  sql2 = sql2 + ") itemall" + Chr(10)
  sql2 = sql2 + "Group BY" + Chr(10)
  sql2 = sql2 + "  itemall.station," + Chr(10)
  sql2 = sql2 + "  itemall.productid" + Chr(10)
  sql2 = sql2 + ") iac" + Chr(10)
  sql2 = sql2 + "WHERE iac.productid = p.ID" + Chr(10)
  sql2 = sql2 + "AND p.textid = tt.textid" + Chr(10)
  sql2 = sql2 + "AND iac.station LIKE  '" + CStr(ws) + "%'" + Chr(10)
  sql2 = sql2 + "Order BY" + Chr(10)
  sql2 = sql2 + " iac.station," + Chr(10)
  sql2 = sql2 + " p.productno "
   
 ' to query data via adodb connection
 Dim cnn As ADODB.Connection
 Dim rst As ADODB.Recordset

 Set cnn = New ADODB.Connection
 Set rst = New ADODB.Recordset

 cnn.Open "fcswmes", "flxuser", "flxuat"
 rst.ActiveConnection = cnn
 rst.CursorLocation = adUseServer

 rst.Source = sql2
 rst.Open
 
 i = 0
 Do While Not rst.EOF
   Cells(18 + i, 2).Value = rst.Fields(0).Value
   Cells(18 + i, 3).Value = rst.Fields(1).Value
   Cells(18 + i, 4).Value = rst.Fields(2).Value
   Cells(18 + i, 5).Value = rst.Fields(3).Value
   Cells(18 + i, 6).Value = rst.Fields(4).Value
   rst.MoveNext
   i = i + 1
 Loop
 
rst.Close
Set rst = Nothing
Set cnn = Nothing
 
    ' to define table format
    j = Worksheets("Report").Rows.Count
    Range(Cells(17, 2), Cells(17 + i, 6)).Select
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    
    Columns("C:D").Select
    With Selection
        .HorizontalAlignment = xlLeft
    End With
    
    ' to setup print area
    Worksheets("Report").PageSetup.PrintArea = Range(Cells(10, 2), Cells(17 + i, 6)).Address
    Cells(8, 5).Select

End Sub





2011年5月6日

Android手机GMAIL/电子市场无法访问的解决办法



1、Android手机GMAIL/电子市场无法访问的原因是:android.clients.google.com被GFW封锁了。
2、一些第三方ROM提供了"越狱"功能,原理是通过同步服务器来更新本机的HOSTS文件。
3、在PC上安装ADB和驱动。
4、手动更新HOSTS:
  1) 收集android.clients.google.com/GMAIL等可用的IP。
  2) ADB ROOT。
  3) ADB PULL HOSTS,将HOSTS下载到PC。
  4) 编辑HOSTS。
  5) ADB PUSH HOSTS。
5、重启手机。

2011年3月29日

对次贷金融危机的一些分析



本文试图用一些基本的概念分析次贷引发的金融危机。
首先我确定两个要点。
一是资源守恒定律:即在一定的时间和空间范围内,资源分布的总量是守恒的。此时消耗的多了,则彼时必然消耗得少;此处消耗得多了,则彼处必然消耗得少。
二是有人赢则必有人输,因为资源总量是不定的。
在此基础上,我们来看次贷的基本情况:
1、美国政府为推动繁荣,放开限制,允许国民以非常低的门槛购房。
2、美国人以近乎零首付从银行得到贷款后实现购房,然后用房产的升值部分支付月供。
3、投资银行将次贷与其它金融产品组合在一起,销售给投资者,然后从保险公司购买这部分产品的亏损保险。
4、评级机构与经济学家论证次贷的安全,将一个高风险的金融产品包装成一个低风险高收益的产品。
5、保险公司只关心眼前利益,为次贷金融产品承保。
6、主权基金、养老基金认购次贷金融产品,以获得长期的收益。
次贷的安全性是基本这个基本假设:美国的房产价格会一直稳定上升。
但是根据供需平衡定律,对于需求高的产品,市场的供应量会保持增加,一直达到供应和需求的平衡点,而供需的平衡意味着需求泡沫的破灭。

贪婪是市场的驱动力,下面我们从利益的角度出发分析各方的盘算。
1、政府存在的主要目标是维护统治,而"居者有其屋"就是小布什的竞选口号之一。政府通过让更多的人拥有房产,以达到更大的民众支持率。
2、低收入的美国人本来是很难实现买房的梦想的,而次贷让未来变得触手可及,有谁能抵挡得住这种诱惑呢?另一方面,教育的欠缺让他们很难理解复杂的金融产品所包含的风险,况且政府、专家、机构都一致担保这种方式的安全可靠。
3、投资银行由于它的高门槛、高垄断特性,造成这一行业对客户的不尊重,对于客户代理人来说,佣金是最重要的,客户的损失他根本不关心,何况客户受到损失时他还能从保险公司获利。
4、评级机构与经济学家本来应该是保持中立的,但是为了自身利益,最终选择了与投资银行结盟。
5、保险公司为次贷产品投保,一是看到了眼前的巨大利益,二是对其长期风险缺乏清晰的认识。
6、主权基金、养老基金认购次贷金融产品,其理由是和购买美国国债一样的,都是为了长期的稳定收益。

如果说有人赢有人输,那么我们再看看这场赌局的各方输赢情况。
1、美国政府短期内赢得了选票和支持率,但是长期内损失了其信用,从而造成美元贬值。
2、低收入美国人得到了数年的房屋产权,但是正如穷人得到一折购买奢侈品的机会一样,表面看起来是赚到了,但是一旦失去你拥有的财产时,曾经越是美好,则将来越是痛苦。
3、投资银行与储蓄银行的差别在于,它是根据它的产品交易数额收取佣金的,而不是根据它对客户的服务质量收取佣金的,这必然造成了它对客户利益的不尊重。而投资银行的薪酬文化更进一步造成了银行员工对公司利益的不尊重,因此投资银行助长了诈骗行为的发生。实际情况是:即使客户遭受损失,但是银行赚到了;即使银行倒闭了,但是业务员赚到了。
4、评级机构和经济学家与投资银行形成事实上的利益同盟,这是因为它们的评论尽管看起来是中立的,但是其为自己带来的收益却是不均衡的:由于它们为投资银行说好话能带来更多的收益,因此它们倾向于为银行说好话。
5、如前所说,保险公司赢了一把,输了一身。
6、主权基金、养老基金是冤大头,可以说它们是被美国政府、投资银行、评级机构联合着骗了,但是某种程序上也可以说它们是咎由自取:因为它们投了这么多的钱去买这些产品,却不去仔仔细细地查查这个产品的底细。设想一下,你听说有一家赌场,每个人进去都稳赚不赔。这是你知道的,而你不知道的是:你每赌一把,赌场的服务员都收一次小费;你每输一把,赌场的服务员都从保险公司那里得到一笔赔偿。那么你还会进去玩吗?

从资源守恒的角度来看,资源从投资者的将来收益,变成了买房者和投资银行及其利益相关者的当前收益,好比你大老远地为一个穷人买一件奢侈品,还代付了所有交易费用,双方约定此件奢侈品的升值部分收益归你,但是事实证明这件奢侈品还值不了当前市价。

次贷危机的背后有一个隐含的因素:全球资源分布的不均衡。
美国政府在全球化中选择了占领科技和金融的高地,这部分的公司和从业人员得到了比以前多得多的资源,但是这部分人毕竟是少数。而制造业、服务业的大量从业人员的竞争力已经不如新兴经济体,因此他们所能获得的资源是很少的。因此居者有其屋是不切合实际的,增长的数据掩盖了增长不均衡的事实。此其一。
主权基金、养老基金拥有大量的货币,而这些基金的性质决定了它们倾向于投资长期稳定的产品,或者说是热门产品,这些热门产品则进一步吸引更多的钱,从而形成一个正向循环。而钱多的地方容易产生泡沫,钱越多泡沫越大。此其二。

次贷危机的另一个隐含因素:金融信息的不均衡。
投资银行与评级机构结成了利益同盟,而投资者却被蒙蔽了。
投资者要在今后避免类似的损失,一是要向美国政府施加压力,加强对金融机构的监管。二是要成为民间的机构,用巨额奖励吸引金融漏洞猎人,让金融专家为自己服务而不是为金融机构服务,这样就可以尽早发现金融产品的漏洞,然后对金融公司进行惩罚。