2009年12月11日 星期五

COCOMO II Model Overview

COCOMO II Model:
1.Source Lines of Code(SLOC)
a.SLOC 是logical line ( If-else-endif) 視為一個 SLOC
b.Comment 不計算在SLOC
c.宣告算在SLOC

2.Cost Drivers:
a.
Effort = 2.94 * EAF * (KSLOC)E
Where EAF=
Effort Adjustment Factor derived from the Cost Drivers
E=
an exponent derived from the five Scale Drivers
例如,EAF=1.00, E= 1.0997,8,000 source lines of code

Effort = 2.94 * (1.0) * (8)1.0997 = 28.9 Person-Months


3.Effor Adjustment Factor:
a.
Complexity (effort multiplier of 1.34)

b.
Language & Tools Experience (effort multiplier of 1.09)
c.the others normal ,set 1.00
Effort Adjustment Factor = EAF = 1.34 * 1.09 = 1.46

Effort = 2.94 * (1.46) * (8)1.0997 = 42.3 Person-Months


4.Schedule Equation:
a.
Duration = 3.67 * (Effort)SE
Where

Effort Is the effort from the COCOMO II effort equation

SE Is the schedule equation exponent derived from the five Scale Drivers


b.
0.3179 that is calculated from the scale drivers:



Duration = 3.67 * (42.3)0.3179 = 12.1 months

Average staffing = (42.3 Person-Months) / (12.1 Months) = 3.5 people



5.SCED Cost Drivers:


a.Required Development Schedule
(SCED)
b.代表若要加速工作進度,在樂觀的條件下,需要多少人力
c.
SCED rating of Very Low corresponds to an Effort Multiplier of 1.43 (in the COCOMO II.2000 model)

d.means that you intend to finish your project in 75% of the optimum schedule .



Duration = 75% * 12.1 Months = 9.1 Months
Effort Adjustment Factor = EAF = 1.34 * 1.09 * 1.43 = 2.09

Effort = 2.94 * (2.09) * (8)
1.0997 = 60.4 Person-Months


Average staffing = (60.4 Person-Months) / (9.1 Months) = 6.7 people



Remember: SCED cost driver means "accelerated from the nominal schedule".

2009年12月8日 星期二

MS SQL Role and User security

SQL server 兩種登入方式(二選一) :
1. Window 網域帳號登入,歸Window 作業系統
2. SQL server 帳號登入,SQL server 管理(Server roles are usually reserved for database and server administrators.)
3. Windows Authentication is the recommended security model when using SQL Server.

安全分等:
  • Login security—Connecting to the server (登入 Server)
  • Database security—Getting access to the database (存取DB)
  • Database objects—Getting access to individual database objects and data(存取DB的某一個object/data)

Role types:
1.Server Role -DBA 維護,管理整台server
2.Database Role - 管理單一的database
3.public role 只要一加入 SQL server,都有public role

Database Role(Predefine):
  • db_owner: Members have full access.
  • db_accessadmin: Members can manage Windows groups and SQL Server logins.
  • db_datareader: Members can read all data.
  • db_datawriter: Members can add, delete, or modify data in the tables.
  • db_ddladmin: Members can run dynamic-link library (DLL) statements.
  • db_securityadmin: Members can modify role membership and manage permissions.
  • db_bckupoperator: Members can back up the database.
  • db_denydatareader: Members can’t view data within the database.
  • db_denydatawriter: Members can’t change or delete data in tables or views.

Server Role(Predefine ):
  • SysAdmin: Any member can perform any action on the server.
  • ServerAdmin: Any member can set configuration options on the server.
  • SetupAdmin: Any member can manage linked servers and SQL Server startup options and tasks.
  • Security Admin: Any member can manage server security.
  • ProcessAdmin: Any member can kill processes running on SQL Server.
  • DbCreator: Any member can create, alter, drop, and restore databases.
  • DiskAdmin: Any member can manage SQL Server disk files.
  • BulkAdmin: Any member can run the bulk insert command.





2009年11月18日 星期三

TCP Windows Size 解答

說明TCP Windows Size 的用途與注意事項
1.TCP Windows Size 目的是 Sender 與 Receiver 最好能把Data 一次處理完,
以避免因為網路設備彼此速度不同,而造成Data Lost 的問題。

2. TCP Windows Size 要多大呢?
window size = bandwidth * delay
假設網路是 100 Mbits/s, round trip time (RTT)是 5 ms,所以 Windows Size 應為
( 100 * 10^6) *( 5 * 10^-3) = 500 * 10^3 bits (65 kilobytes)

3.最後 Client 與 Server 的buffer 要設一樣:
/* An example of client code that sets the TCP window size */

int window_size = 128 * 1024; /* 128 kilobytes */

sock = socket(AF_INET, SOCK_STREAM, 0);

/* These setsockopt()s must happen before the connect() */
setsockopt(sock, SOL_SOCKET, SO_SNDBUF,
(char *) &window_size, sizeof(window_size));
setsockopt(sock, SOL_SOCKET, SO_RCVBUF,
(char *) &window_size, sizeof(window_size));
connect(sock, (struct sockaddr *) &address, sizeof(address));


/* An example of server code that sets the TCP window size */
int window_size = 128 * 1024; /* 128 kilobytes */
sock = socket(AF_INET, SOCK_STREAM, 0);

/* These setsockopt()s must happen before the accept() */
setsockopt(sock, SOL_SOCKET, SO_SNDBUF,
(char *) &window_size, sizeof(window_size));
setsockopt(sock, SOL_SOCKET, SO_RCVBUF,
(char *) &window_size, sizeof(window_size));

listen(sock, 5);
accept(sock, NULL, NULL);
4.備註:
a.Nonstop 系統
TCP programming :setsockopt 參數(SO_SNDBUF/SO_RCVBUF)
Default 8192 bytes

5.參考:
a.A User's Guide to TCP Windows
b.Enabling High Performance Data Transfers
c.Windows 2000 TCP Performance Tuning Tips

6.
a.Max Transmission Unit (MTU) - TCP header(20 byte)- IP header (20 bytes) =Max Segment Size(MSS)
b.

2009年11月12日 星期四

Python ctypes 使用方法(2)

介紹一些使用方法:
define C library 的 header 檔
from ctypes import *

WS_MAX_USER_LEN=10
WS_MAX_PIN_LEN =4
WS_MAX_LMK_ID =1
WS_MAX_IP_ADDR_LEN =10
WS_MAX_LABEL=5
WS_MAX_DESC=10
WS_MAX_LOG_ENTRY_LEN=100
WS_MAX_ZMK_KEY_ID_LEN=10

WS_VOID=c_void_p
WS_BYTE=c_ubyte
WS_CHAR=WS_BYTE
WS_BOOL=WS_BYTE
WS_USHORT=c_ushort
WS_ULONG=c_ulong
WS_LONG=c_long

WS_RV=WS_ULONG
WS_UNIT_ID=WS_ULONG
WS_DEVICE_ID=WS_ULONG
WS_CLUSTER_ID=WS_ULONG
WS_FLAGS=WS_ULONG
WS_UNIT_TYPE=WS_ULONG
# WebSentry  Specific Return Codes #
WSR_OK= 0x00000000
WSR_CANCEL = 0x00000001
WSR_HOST_MEMORY= 0x00000002
WSR_UNIT_ID_INVALID =0x00000003
WSR_GENERAL_ERROR=0x00000005

class WS_ITEM(Structure):
_fields_=[('pData',POINTER(WS_BYTE)),('len', WS_ULONG)]

class WS_VERSION(Structure):
_fields_=[('major', WS_BYTE), ('minor', WS_BYTE)]

from wapich  import *   #import python wrap data
from ctypes import *

libc=cdll.LoadLibrary('wapicd.dll')
WS_Initialize=libc.WS_Initialize  #define  function
WS_Initialize.restype=WS_RV    # set return type  = WS_RV, if none, always return int

rv=WSR_OK
rv=WS_Initialize()

if rv != WSR_OK:
print rv
else:
print 'WS_Initialize is Ok'

WS_GetInfo=libc.WS_GetInfo
WS_GetInfo.restype=WS_RV

myInfo=WS_INFO()
myInfo_p=pointer(myInfo)
myInfo_p.contents=myInfo   # assign  myInfo_ptr pointer to myInfo

rv=WSR_OK
rv=WS_GetInfo(myInfo_p)
if rv !=WSR_OK:
print rv

print myInfo.manufacturerID[:]
print myInfo.description[:]
print myInfo.version.major
print myInfo.version.minor

2009年11月6日 星期五

Python ctypes 使用方法(1)

因為要使用C libray ,所以要使用ctypes 去 wrap C function
from ctypes import *
from ctypes.util import find_library

print '---Begin Show----'

print find_library('c')
print windll.kernel32
print cdll.msvcrt
print find_library('wapicd')
libc=cdll.LoadLibrary("msvcr90.dll")

print "---------- char --------"
x=c_char_p("Hello World")
print x
print x.value
print sizeof(x)

print '---------- int ----------'
i=c_int(42)
print i
print i.value

p = create_string_buffer("Hello", 10)
print sizeof(p), repr(p.raw)

print "---------- Bo class---------------"
class Bo(object):
def __init__(self, number):
self._as_parameter_=number

bo=Bo(33)
printf = libc.printf
printf("%d bottles of beer \n", bo)

strchr=libc.strchr
print strchr('abcdef', ord('c'))
strchr.restype=c_char_p # set retyrn type is char_pointer
print strchr('abcdef', ord('d'))


print '----Passing by reference---------'
i=c_int()
f=c_float()
s=create_string_buffer('\000'*32)
print i.value, f.value, repr(s.value)

libc.sscanf("1 3.14 hello", "%d %f %s", byref(i), byref(f), s) #Passing by ref
print i.value, f.value, repr(s.value)

print '---- Pointer ---------'
ptr_i=pointer(i)
ptr_f=pointer(f)
ptr_s=pointer(s)
libc.sscanf("1 3.14 hello", "%d %f %s", ptr_i,ptr_f,ptr_s)
print i.value, f.value, repr(s.value)
print 'point of i:', ptr_i.contents
print 'point of f:', ptr_f.contents
print 'point of s:', ptr_s.contents

print '------------ Test Structure ---------'
class POINT(Structure):
_fields_=[('x', c_int), ('y', c_int)]

p=POINT(10, 20)
print p.x, p.y

def testptr(a):
b=POINT()
b=a
b.x=a.x+100
b.y=a.y+100
return b


testptr.restype=POINT()
g=testptr(p)
print g.x, g.y



測試結果:

---Begin Show----
msvcr90.dll


C:\WINDOWS\system32\wapicd.dll
---------- char --------
c_char_p('Hello World')
Hello World
4
---------- int ----------
c_long(42)
42
10 'Hello\x00\x00\x00\x00\x00'
---------- Bo class---------------
12838358
def
----Passing by reference byref()---------
0 0.0 ''
1 3.1400001049 'hello'
---- Pointer pointer()---------
1 3.1400001049 'hello'
point of i: c_long(1)
point of f: c_float(3.1400001049041748)
point of s:
------------ Test Structure ---------
10 20
110 120




2009年10月29日 星期四

Python in Plurk

因為看到Plurk 是可以用網路程式去發送訊息的,所以想說用Python 試試看,說明方法如下:
1.Install SimpleJSON
Ans: easy_install simplejson ,它會自動Download 到你的Python 目錄去

2.Download plurkapi ,Copy plurkapi.py 到 D:\Python26\Lib (這是我的python 目錄)
plurkapi download location


3.因為無法發中文,看來應該是沒宣告Coding ,所以在 plurkapi.py 加入
# *- coding: UTF-8 -*-

4.Sample Code 做法:
# *- coding: UTF-8 -*-
import plurkapi
import sys

# Create an API object.
# Pass in your own username and password to the "login" method.
#

plurk_api = plurkapi.PlurkAPI()

if plurk_api.login('nickname', 'password') == False:
print "Login failed!"
sys.exit(1)

plurk_api.addPlurk(lang='tr_ch',qualifier='says',content='中文化Say Hello 222222!!!')

2009年5月27日 星期三

NonStop Server 試用Python

目標:使用python 開發Client/Server Thread program
測試結果:Nonstop server 不支援 Thread,只能使用 fork 。
Client 程式:
#######################################################
## Demo:Opening a Client-Side Socket for Sending Data
#######################################################
print '#'*60
print '# Demo:Opening a Client-Side Socket for Sending Data'
print '#'*60

import thread
import sys,time,os
from socket import *

def client(id):
serverHost = '192.168.110.93'
serverPort = 12343

def now():
return time.ctime(time.time( ))

message = 'I am ID: %s' %id + '- Time: %s' %(now())

if len(sys.argv) > 1:
serverHost = sys.argv[1]

#Create a socket
sSock = socket(AF_INET, SOCK_STREAM)

try :
#Connect to server
sSock.connect((serverHost, serverPort))
except Exception, e:
sSock.close()
os._exit(0)

#Send messages
sSock.send(message)
data = sSock.recv(1024)
print 'Client received: ', data
sSock.close()
os._exit(0)

def main():
i=0
while True:
newpid = os.fork()
if newpid == 0:client(i)
i=i+1
if i > 10 :break


if __name__ =='__main__':
main()



Server 程式:

import SocketServer,time
myHost=''
myPort=12343

class MyClientHandler(SocketServer.BaseRequestHandler):
def handle(self):
print 'Welcome Clinet:',self.client_address
while True:
data=self.request.recv(1024)
time.sleep(1)
if not data:break
print 'Send Back:',data
self.request.send(data)
self.request.close()


myaddr=(myHost,myPort)
server=SocketServer.ThreadingTCPServer(myaddr,MyClientHandler)
server.serve_forever()

2009年5月20日 星期三

Python 複利計算

都是同事問我複利計算,微積分早就還給老師了,不知公式如何,只好自個想啦!
Amt-定期定額
Rate-利率
Y1=Amt*(1+Rate)
Y2=(Y1+Amt)*(1+Rate)
Yn=(Yn-1+Amt)*(1+Rate)

Python sample 程式如下:
# Directory 解法
f={}
base=100
rate =0.05
f[1]=base*(1+rate)
i=1
for i in range(2,5):
f[i]=(f[i-1]+base)*(1+rate)

for key in f:
print key,f[key]

#Generator 解法
def f(first,n):
while True:
result= (first+100)*(1.05)
first=result
n=n+1
print n,first
yield first

base=100
rate =0.05
i=1
gh=f(0,0)
for i in range(1,5):
gh.next()


-------------------------------------------------

2009年5月6日 星期三

Python Network Programming

1.Basic Socket Usage
Python is using only two communication domains: UNIX(AF_UNIX) and Internet domains(AF_INET)

2.1Create Socket
socket(family, type [, proto ])
family =AF_INET,AF_UNIX
type=SOCK_STREAM, SOCK_DGRAM, SOCK_RAW, SOCK_SEQPACKET,SOCK_RDM
TCP 連接語法:sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) UDP 連接語法:sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

2.2Connecting a socket and data transfer
Internet domain: sock.connect(('localhost', 8000))
UNIX domain:sock.connect('/tmp/sock')

2.3 Binding a name to socket
Internet domain:sock.bind(('localhost', 8000))
UNIX domain:sock.bind('/tmp/sock')

2.4 Listening and accepting connections
sock.listen(5)
clisock, address = sock.accept()
TCP servers 固定流程:bind-listen-accept
TCP socket is connection-oriented; when a client wants to speak to a particular server it must
connect itself, wait until the server accepts the connection, exchange data then close.

2.5 UDP sockets(保留待釐清)
Data packets are send and received with the sendto(data, address ) and recvfrom(buffer[, flags ]) methods

2.6 Closing the Socket
socket.close()
記得:一定要Close a socket 才能再使用它


2.7 Socket Module 常用的function
socket.getfqdn('www.yahoo.com.tw) -return the \Fully Qualied Domain Name"
>>'w2.rd.vip.tw1.yahoo.com'
>>> socket.getfqdn()
'UT09002311.uitctech.com.tw'

gethostbyname(hostname )- Get IP address
>>> socket.gethostbyname('www.yahoo.com.tw')
'119.160.246.23'
>>> socket.gethostbyname_ex('www.yahoo.com.tw')
('tw1-w2.rd.tw.g1.b.yahoo.com', ['www.yahoo.com.tw', 'rc.tpe.yahoo.com', 'tw.rc.yahoo.com', 'w2.rd.tw.g1.b.yahoo.com'], ['119.160.246.23'])


gethostbyaddr(ipaddr )-Get Host name
>>> socket.gethostbyaddr('127.0.0.1')
('localhost', [], ['127.0.0.1'])
>>> socket.gethostbyaddr('119.160.246.23')
('w2.rd.vip.tw1.yahoo.com', [], ['119.160.246.23'])

getservbyname(servname )-轉換 service 變成port
>>> socket.getservbyname('ftp')
21

getprotobyname('ICMP')- 轉換protocol 變成corresponding number
>>> socket.getprotobyname('ICMP')
1



其它:
Function Name Synopsis
htons(sint ) Convert short integer from host to network format
ntohs(sint ) Convert short integer from network to host format
htonl(lint ) Convert long integer from host to network format
ntohl(lint ) Convert long integer from network to host


3.基本網路Flow 設計
TCP Model:(只能處理單一Client)

UDP Model(只能處理單一Client)



Echo server sample code:
import socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('localhost', 8000))
serversocket.listen(1)
clientsocket, clientaddress = serversocket.accept()
print 'Connection from ', clientaddress
while 1:
data = clientsocket.recv(1024)
if not data: break
clientsocket.send(data)
clientsocket.close()

Echo client sample code:
import socket
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect(('localhost', 8000))
while 1:
data = raw_input('>')
clientsocket.send(data)
if not data: break
newdata = clientsocket.recv(1024)
print newdata
clientsocket.close()



UDP Echo server sample code:
# -*- Coding:Utf-8 -*-
# UDP model
from socket import *

ssock=socket(AF_INET,SOCK_DGRAM)
ssock.bind(('localhost',9999))
while 1:
data,addr =ssock.recvfrom(1024)
if not data:break
ssock.sendto(data,addr)
ssock.close()

UDP Echo client sample code:
from socket import *
ssock = socket(AF_INET,SOCK_DGRAM)
while 1:
data = raw_input('>')
ssock.sendto(data, ('localhost', 9999))
if not data: break;
newdata = ssock.recvfrom(1024)
print newdata
ssock.close()



4.處理多個Client 的Server 方式:



Thread-server.py
############################################################################# # Server side: open a socket on a port, listen for a message from a client, # and send an echo reply; echoes lines until eof when client closes socket; # spawns a thread to handle each client connection; threads share global # memory space with main thread; this is more portable than fork: threads # work on standard Windows systems, but process forks do not; ############################################################################# import thread, time from socket import * # get socket constructor and constants myHost = '127.0.0.1' # server machine, '' means local host myPort = 50007 # listen on a non-reserved port number sockobj = socket(AF_INET, SOCK_STREAM) # make a TCP socket object sockobj.bind((myHost, myPort)) # bind it to server port number sockobj.listen(5) # allow up to 5 pending connects def now( ): return time.ctime(time.time( )) # current time on the server def handleClient(connection): # in spawned thread: reply time.sleep(5) # simulate a blocking activity while True: # read, write a client socket data = connection.recv(1024) if not data: break connection.send('Echo=>%s at %s' % (data, now( ))) connection.close( ) def dispatcher( ): # listen until process killed while True: # wait for next connection, connection, address = sockobj.accept( ) # pass to thread for service print 'Server connected by', address, print 'at', now( ) thread.start_new(handleClient, (connection,)) dispatcher( )


Class-socket.py
#############################################################################
# Server side: open a socket on a port, listen for a message from a client,
# and send an echo reply; this version uses the standard library module
# SocketServer to do its work; SocketServer allows us to make a simple
# TCPServer, a ThreadingTCPServer, a ForkingTCPServer, and more, and
# routes each client connect request to a new instance of a passed-in
# request handler object's handle method; SocketServer also supports
# UDP and Unix domain sockets; see the library manual for other usage.
#############################################################################

import SocketServer, time # get socket server, handler objects
myHost = '' # server machine, '' means local host
myPort = 50007 # listen on a non-reserved port number
def now( ):
return time.ctime(time.time( ))

class MyClientHandler(SocketServer.BaseRequestHandler):
def handle(self): # on each client connect
print self.client_address, now( ) # show this client's address
time.sleep(5) # simulate a blocking activity
while True: # self.request is client socket
data = self.request.recv(1024) # read, write a client socket
if not data: break
self.request.send('Echo=>%s at %s' % (data, now( )))
self.request.close( )

# make a threaded server, listen/handle clients forever
myaddr = (myHost, myPort)
server = SocketServer.ThreadingTCPServer(myaddr, MyClientHandler)
server.serve_forever( )

Select-server.py
#############################################################################
# Server: handle multiple clients in parallel with select. use the select
# module to manually multiplex among a set of sockets: main sockets which
# accept new client connections, and input sockets connected to accepted
# clients; select can take an optional 4th arg--0 to poll, n.m to wait n.m
# seconds, or ommitted to wait till any socket is ready for processing.
#############################################################################

import sys, time
from select import select
from socket import socket, AF_INET, SOCK_STREAM
def now(): return time.ctime(time.time( ))

myHost = '' # server machine, '' means local host
myPort = 50007 # listen on a non-reserved port number
if len(sys.argv) == 3: # allow host/port as cmdline args too
myHost, myPort = sys.argv[1:]
numPortSocks = 2 # number of ports for client connects

# make main sockets for accepting new client requests
mainsocks, readsocks, writesocks = [], [], []
for i in range(numPortSocks):
portsock = socket(AF_INET, SOCK_STREAM) # make a TCP/IP spocket object
portsock.bind((myHost, myPort)) # bind it to server port number
portsock.listen(5) # listen, allow 5 pending connects
mainsocks.append(portsock) # add to main list to identify
readsocks.append(portsock) # add to select inputs list
myPort += 1 # bind on consecutive ports

# event loop: listen and multiplex until server process killed
print 'select-server loop starting'
while True:
#print readsocks
readables, writeables, exceptions = select(readsocks, writesocks, [])
for sockobj in readables:
if sockobj in mainsocks: # for ready input sockets
# port socket: accept new client
newsock, address = sockobj.accept( ) # accept should not block
print 'Connect:', address, id(newsock) # newsock is a new socket
readsocks.append(newsock) # add to select list, wait
else:
# client socket: read next line
data = sockobj.recv(1024) # recv should not block
print '\tgot:', data, 'on', id(sockobj)
if not data: # if closed by the clients
sockobj.close( ) # close here and remv from
readsocks.remove(sockobj) # del list else reselected
else:
# this may block: should really select for writes too
sockobj.send('Echo=>%s at %s' % (data, now( )))

2009年4月26日 星期日

Google App Engine (1)

for Beginner who using Google App Engine and memo for myself.
Resource :
1.Google App Engine(GAE)
2.Docs

1.Download and install at C:\Google\google_appengine
Two pyhton programs thats your need to know first.
a.dev_appserver.py, the development web server(在自己電腦用的Web server)
b.appcfg.py, for uploading your app to App Engine(Upload 到你的App Host)

2.Create your folder(project) like C:\helloworld

3. Create helloworld.py
print 'Content-Type: text/plain'
print ''
print 'Hello, world! Ray '

4.Create app.yaml
application: yehrayyeh
version: 1
runtime: python
api_version: 1

handlers:
- url: /.*
script: helloworld.py

5.在自己電腦測試
c:\helloworld>dev_appserver.py c:/helloworld
測試 URL http://localhost:8080/

6.放到 GAE 去看看, Google http://appengine.google.com/
方法如下:appcfg.py update c:/helloworld

2009年3月19日 星期四

思考的技術-讀書心得報告

一、書名:思考的技術

二、著著:大前研一

三、出版項:2006年12月18日115版/商周出版:家庭傳媒城邦分公司發行

四、頁數:351

五、內容大綱:

這本書主要是7個章節,及5篇推薦序與最後一部份大前研一的專訪,章節分為

第一章 切換思考的路徑

第二章 邏輯打動人心

第三章 洞悉本質的過程

第四章 非線性思考的建議

第五章 讓構想大量湧現

第六章 解讀五年後的商機

第七章 開拓者的思考

最後一部份是大前研一專訪"懶於求知的人沒有未來"


六、讀後心得:
這本書涵概許多面向,從日本內部經濟、銀行合併案、郵便局民營化,日本的教育方式,談到中國與台灣的關係,未來整個網路生活,無國界的經濟體,作者最主要表達的是"如何思考問題背後的問題",如何訓練自己去培養思考的技術,能夠洞悉問題的本質才有可能開創新的格局,以新的角度創造財富或是解決問題。

作者談到不要把"假設當作結論","現象不等於原因",這一點是培養思考技術重要的破題方法,因為不從這一點切入我們是無法創造與訓練自己的思考邏輯,
談到如何找出問題的本質, 我們可以用"腦力激盪法",(或是作者談到的金字塔構法)及MECE的概念去釐清問題的問題,找出主要的問題本質後可以利用80/20 法則去解決主要問題創造顯見的效益,除此之外,科學的思考必須要有數字作基礎,所以作者當顧問時一定會傾聽現場的聲音而不是只相信公司現成的統計數字(因為雖然有公司的統計數字,可是公司還是發生問題,所以真正的問題躲在背後) ,找到問題的本質外且使用數字當佐證基礎並需要說服高層實行解決方案(有數字基礎才有說服力),重要是要讓公司高層一次只面對一個問題去解決而不是全方面解決(全方面是一個不切實際且是失焦的解決方式),並定期追蹤進度。不過這一點就是需要"執行力"的貫徹,此外在文中提到在職場上要高兩層去看問題,如果讀者可以從平常訓練起,是很好的思考訓練。

另一方面提到演說或說服的技巧上,要以對方能理解的順序為重點,演說的準備重點就像演奏樂器一樣,要能不看稿子流暢的說出來,提案報告上每一頁有一個結論。而談到優良企業方面有幾個觀點值得參考,一個是"不要讓公司成為同質人的聚會"(如此公司才有不同的聲音與看法出現),
"對事不對人"(公司有包容的氣氛),重要的是能夠"否定自已"(不會固步自封),這一點跟中國智慧的"生於憂患,死於安樂"可說是相互輝印的。

作者強調要利用思考的技術去跳脫以常識為基礎的思考模式,在第四章"非線性思考的建議"提到在"新經濟的世界中(利用網路為基礎的世界),最重要的是不要套用過去的常識,而是觀察現在所發生的各種事情",他提到日本教育填壓式的方法是無法適用在現今以"問題解決"為導向的世界,這一點同時對身為父母是需要思考的,我們應該要如何培養孩童解決問題的方法與思考模式。而作者提到"現在的學校是破壞人腦的兇器",這一點倒是過重,因為有良好的基礎教育才可能有足夠的力量去創造發明新的事物。

之後,作者提到如何讓構想大量湧現的方法中,提到"新構想"不是突發奇想,而是抱著疑問並提出假設與驗證才能產出可行的"新構想",建議大家多接觸不同的事物與結交否定意見的朋友,這樣有助於幫忙產生新構想與我們辨證我們的思考結果。在最後的兩章中,作者提供要如何具備預知性的能力,就是先分解功能再進行思考,針對一件事物分解功能,觀察現實狀況與變化,提出假設與可行方案,才能培養出預知性且可能可以讓自己發展新事業,同時他也提出創意成功模式的四個要素:1.事業領域的定義必須明確 2.分析現狀進而推論未來的方向,針對因果關係來設立簡潔而具論點的假說 3.針對自己應選擇的方向,既使出現幾個可能的選擇,也應該專注其一。(聚焦) 4.不能忘記基本假設,排除掉已發生變化的情形而不偏離原則,最後一章,大前鼓勵讀者朝著新大陸(網路時代)並為自己創造新的商機與機會。

七、評語:
大前研一是位有點臭屁也蠻會在文章中廣告自己著作的作者,不過書中的思考模式與個案討論,確實發人省思,有些個案跟台灣的現狀也有異曲同工的感覺,
我想,解決問題的能力與邏輯思考的模式是現在知識工作者所必備的技能之一,不過除了邏輯能力外,解決問題有時後還需要政治力的運用,這一點讀者還是需要注意的。

八、附註:

2009年3月8日 星期日

淺談外匯存底的意義來援和運用


淺談外匯存底的意義、來源和運用


近幾年來,由於我國的外匯存底快速累積,普遍引起大家的關心和討論;許多人甚至以為:既然我們擁有這麼多錢,又為什麼不能直接用來進行全國性的經建計畫或地方上的基層建設呢?其實原因並不單純。下面我們將就有關外匯存底的一些基本觀念作一個簡單的說明,希望有助於大家的瞭解。


一、什麼是外匯?


外匯就是外國的貨幣(包括現金、存款、支票、本票、匯票等)和可以兌換成貨幣的有價證券(包括公債、國庫券、股票、公司債等)。由於現金不能生息,保管又困難,並且各國政府也不允許現金被大量搬出搬入國境,因此國與國之間,無論是貨品的買賣(也就是所謂的有形貿易)或勞務與技術的提供或接受(也就是所謂的無形貿易),通常都以現金以外的貨幣來支付價款;也因此我們所持有的外匯,除極少部分是現金外,絕大部分都是以現金以外的貨幣或有價證券的方式來保有的。


二、外匯從那裡來?


當我們向國外輸出貨品或提供勞務技術時,外國人所支付的代價就是我們賺到的外匯。相對的,如果我們向國外輸入貨品或接受勞務技術,我們就要支付外匯。因此,我們外匯存底的快速累積,便意味看我們的輸出遠大於輸入。從錢的觀點來說,固然是賺了許多錢;但如果從資源的觀點來看,是把資源大量輸出,用在國內的,便相對減少了。


三、中央銀行的外匯存底又是怎麼來的?


國人對外輸出所賺得的外匯並不能直接在國內使用,因為國內的支付是使用新臺幣的。因此任何個人或團體想把持有的外匯在國內使用,就必須前往政府指定辦理外匯業務的銀行(簡稱指定銀行)把外匯換成新臺幣(俗稱押匯或賣匯)。而指定銀行為了保有足夠的新臺幣資金,又把外匯賣給中央銀行,這就是中央銀行外匯存底的來源。相反的,無論個人或團體,如果需要外匯來輸入貨品或接受勞務技術,也可以在法令許可的範圍內,向指定銀行以新臺幣換取外匯(俗稱結匯或買匯);而指定銀行為了保有足夠的外匯,又向中央銀行買進。如此一來一往,中央銀行的外匯存底便不時在增減變動。


由於以往我國外匯比較缺乏,因此政府規定所有公民營事業、個人和團體所賺到的外匯,最後都必須賣給中央銀行來集中保管、調度、運用。到民國七十六年七月間,政府鑒於央行的外匯存底已經相當豐富,因此便修改了管理外匯條例,取消了所有的外匯都必須賣給中央銀行的規定,准許公民營事業、個人和團體自行持有外匯,自行運用。從此央行外匯存底的累積速度便緩慢下來了。


當然,我們的新臺幣和其他國家的貨幣,在價值上是有一定的比例的,這就是所謂的「匯率」。以美元來說,假定美金一元相當於新臺幣三十元。依照這個比例,中央銀行每買進一元美金,就要付出三十元的新臺幣;買進一億美金,就等於放出了三十億的新臺幣。以美金來說,中央銀行固然擁有了一億美元的資產:但是就新臺幣來說,中央銀行也同時有了三十億新臺幣的負債。這是特別要向大家強調的一個「資產與負債平衡」的關鍵性觀念。


四、為什麼不能直接把外匯用來進行全國性的經建計畫或地方上的基層建設?


前面已經說過,外匯是我們對外輸出賺來的,雖然大部分的外匯都賣給中央銀行,但外匯存底乃是屬於全體國民所共有,中央銀行不過是替全體國民保管和運用罷了。既然外匯屬於全民所有,因此任何人都可以依規定要求動用外匯。那麼為什麼不能直接把外匯用來進行全國性的經建計畫或支援地方上的基層建設呢,關鍵就在上面提到的「中央銀行的外匯資產與新臺幣負債必須平衡」的觀念和實際操作上。


我們說任何人都可以動用外匯乃是基於一個不可或缺的前提,就是想動用外匯的人必須先準備好等值的新臺幣,然後依照結匯手續來動用;政府機關也不能例外。如果中央銀行直接把外匯送給各級政府(個人或公司行號相同)去用,由於前面已經說過,國內並不以外匯來支付價款,那各級政府不又得把分到的外匯向指定銀行去賣匯,換取新臺幣?從中央銀行立場講,這豈不等於把已經買過一次的外匯,還要再買一次,結果一份外匯變成兩份新臺幣,流通在市面上的新臺幣數量增加一倍,豈不造成可怕的通貨膨脹?


也許有人會說,那就讓各級政府把分到的外匯向國外購買防治公害設備、高科技的新產品、新技術,不也可以嗎,問題是如此一來,中央銀行的外匯資產固然是被消化了,但是中央銀行以前購買外匯所放出去的新臺幣無法回收,同樣會造成通貨膨脹。


因此任何個人或公司行號想動用外匯,就必須先準備好等值的新臺幣資金;政府想動用外匯,就必須編列等值的新臺幣預算,然後依照結匯手續來動用。個人或公司行號如果資金不足,可以向銀行貸款;政府的預算如果不夠,可以發行公債,向民間籌款。這才是動用外匯的正當途徑。


五、中央銀行如何運用外匯?


中央銀行運用外匯的途徑有兩個,一個是供應國內正當的外匯需要,一個是存放國外孳生利息。


在供應國內正當的外匯需要方面,又可以分成兩部分:一部分是國人國探親、觀光、訪問、留學、就職,以及其它各種匯出款,都可以依照有關的規定,以新臺幣向指定銀行申請結匯。另一部分是中央銀行提供全國各公民營企業各種融通和貸款,支援他們進口各種民生物資、機器設備、勞務和技術;一方面穩定物價,一方面協助經濟發展。這也正是中央銀行所負的重大任務。這些融通或貸款在到期之後,連同利息,當然都由承借的公民營企業以新臺幣折還給中央銀行。


目前政府正在推動六年國家經濟建設計畫,凡有需要外匯支應的地方,中央銀行當然會積極配合辦理。至於為了推動經濟和金融的國際化,中央銀行除了支援公民營事業到海外去購併他國的企業,擴張據點外,也提供種籽資金,成立台北外幣拆款市場;並和新加坡、香港等國際性貨幣經紀商連作業,為我國金融國際化奠定良好的基礎。


在存放國外孳生利息方面,也可以分為兩部分,一部分是存在世界著名的大銀行,另一部分則是購買各種有價證券;這也就是前面說過的外匯存底絕大部分是以現金以外的貨幣或有價證券的方式來保有的意思。中央銀行在作這種運用時,主要考慮四個原則:第一個是安全性,就是外匯存底的安全,不能被倒悵;第二個是流動性,因為外匯必須隨時支援國家的需要,所以不能全部作長期而固定的投資;第三個是獲利性,就是在前面兩個原則的考慮下,盡量在利息高的地方去運用;第四個是經濟性,也就是要用在有益於經濟發展的地方去。


經過這樣的運用,央銀行所獲得的利息相當可觀。而由於中央銀行是個銀行,同樣要支付利息;譬如中央銀行為了減少新臺幣的流通數量,以免造成通貨膨脹,一方面發行國庫券、可轉讓定期存單、儲蓄券等,一方面收存了幾千億的郵政存簿儲金和銀行轉存款;由此孳生出來的數目鉅大的利息,便都依賴運用外匯存底所得的利息來支應,從而有助於達成穩定金融的政策目標。

2009年3月3日 星期二

WMI and ADSI tools

今天在清查Window system 電腦的User ID 清單,找煩了,想說有沒有程式可以偷懶,
原來有這麼多玩具呀,一下子就把資料清出來了。

1.WMI-Windows Management Instrumentation
For Windows 所有元件,從硬體到軟體都在範圍內

2.ADSI- AD Service Interface
For AD 專用
如果你要管理Local user and group account請用ADSI

3.WMI 與ADSI 是不相容,所以不要把WMI 的Code 弄到 ADSI 裡面RUN

4.開發讀取 WMI or ADSI 的語言可有VBscript,Python
為了向下相容,我使用 VBscript 去開發

5.開發好的程式如何執行, 可以是
wscript xxx.vbs  -- 會出現window message,還要按Enter 去顯式下一個message
cscript xxx.vbs   -- 不會出現window message.
我習慣的作法  cmd > cscript xxx.vbs  >> xxx.txt ( output to xxx.txt)



Ref:
中文:
http://www.microsoft.com/taiwan/technet/scriptcenter/default.mspx


英文
http://www.microsoft.com/technet/scriptcenter/resources/qanda/default.mspx

2009年2月16日 星期一

金融吃人魔-讀後心得

A demon of our own design :markets,hedge,funds and the perils of financial innovation
author:Richard Bookstaber
個人覺得想看八卦內幕的可以整本看完,應該可以找到金融業的八卦。
不過我是覺的可以從第八章開始閱讀,因為重點從那邊開始。
1.金融危機是因為高複雜性與高緊密連結的系統,並會回饋的系統。
2."常態事故" 是指預想中會發生的意外,是過程結構不可避免的結果。
3.減少複雜度(法令直接限制複雜度) 與在環結中加入Buffer 是避免事故的解決方法。
4.金融危機是因為流動性不足,導致系統Feedback 而產生滾雪球效應。
5.完美市場是不存在的

6.貨幣數量公式:mv=pq,這4個字母分別代表:
M貨幣需求量
V貨幣流通速度
P商品價格 
Q商品量 

7.避險基金是無法可管,說穿了,是一堆商品的組合,只能利用分類法歸類。
a.資產-固定收異/有價證券/貨幣市場
b.方向-對資產管理的態度(買入/賣出/中立/買賣都作)
c.投資類別(相對價值/策略套利)
d.地理區域(開發 /未開發國家)
e.流動性(周轉百分比)

2009年2月9日 星期一

如何把Excel 轉成UTF-8的資料

1.因為要把EXCEL 的資料轉成UTF-8 的格式才能在Sqlite3 使用,故需要轉碼
2.方法如下:
a.開啟EXCEL 檔,另存新檔,變成 CSV 檔案
b.利用notepad 開啟 CSV 檔案 ,並另存成 UTF-8 檔案
c. 接下來就可用Sqlite3 來開啟中文資料了

2009年1月10日 星期六

Regular expression

字元 代表該字元^ 限制字串必須出現於行首
$ 限制字串必須出現於行末
\ 將特殊字元還原成字面意義的字元
^ 某字元以外的任何字元
- 字元集合中可使用 - 來指定字元的區間

+ 其前的字元或字元集合出現一次或一次以上
? 其前的字元或字元集合可出現一次或不出現
* 其前的字元或字元集合可出現任何次數或不出現
(...) 用以括住一群字元,且將之視成一個集合
{n} 重複 n 次
{n,m} 重複 n 到 m 次
{n,} 至少重複 n 次
[] 其中之一字元可出現可不出現,例如 [abc] 表示不論出現 a 或 b 或 c 都算符合
| 代表「或」, 例如 (Sun|Mon|Tue|Wed|Thu|Fri|Sat), (日|一|二|三|四|五|六) 以左右括號括住

. (句點符號) 代表除了換行符號 (\n) 以外的任一字元。如果要包括換行符號,請使用 [\s\S]
\w (\W) 代表任何英文(以外的) 字元
\s (\S) 代表空白 (以外的) 字元
\d (\D) 代表數字 (以外的) 字元
\b (\B) 代表位於文字邊界的 (以外的) 字元。(在英文中)你可以把 \b 視作空白或 TAB 字元, 例如 \bBB 可符合 "ABB CBB" 中的 CBB 但非 ABB, 因為 ABB 位於行首, 不算是文字邊界; 這是容易混淆的地方。
\r 代表換行字元
\n 代表換行字元 (通常和 \r 一同出現, 所以一般以 \r\n 代表換行)
\t 代表 TAB 字元
\( 代表左括號
\) 代表右括號
\X 以十六進位字元碼代表某個字元; 例如 [\x21-\x7E] 可代表所有看得到的字元 ([\x20-\x7E] 則包括空白字元)

2009年1月7日 星期三

如何利用SVN 去自動備份

我在網路上找到的資料,來源
http://gael-varoquaux.info/computers/svnautocommit/index.html

1.準備工作:
a. SVN 軟體,因為要直接用command mode,請到以下 download:
http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91
version :svn-win32-1.5.5.zip

2.下載 svncommit.exe ,找一下可以看到
http://gael-varoquaux.info/computers/svnautocommit/index.html
Usage :svncommit.exe [path] => svncommit.exe c:\python-ray

3.因為它是利用排程去 啟動 svncommit.exe ,所以要先把要backup 的資料放到 svn server,
並且在啟動備份的機器上產生一份workcopy ,例如 c:\python-ray

4.利用控制台中的 -> 排定的工作 去設定

2009年1月4日 星期日

如何Reset Django user 密碼


[Windows Platform] : 
c:\: python manage.py shell

your acccount=admin
password=new_password
from django.contrib.auth.models import User
 
user = User.objects.get(username='admin')
user.set_password('new_password')
user.save()