2017-08-30

BigObject Python Demo of RabbitMQ Topics Pub/Sub mode

BigObject Python Demo of RabbitMQ Topics Pub/Sub mode



RabbitMQ Topics mode:


Publishers can publish messages with different topics to MQ. A subscriber can subscribe multiple topics of messages from MQ.

The bo_emit_stooq.py program sends all instruments from BigObject, and the bo_receive_stooq.py program only receives messages with 'ibm.us' topic.


Environment
Python

Install and configure components

  1. Install the package:
  2. # apt-get install rabbitmq-server
  1. Add the remoteguest user:
  2. # sudo rabbitmqctl add_user remoteguest remoteguest

  1. Permit configuration, write, and read access for the remoteguest user:
  2. # sudo rabbitmqctl set_permissions remoteguest ".*" ".*" ".*"

# local connection can use the user guest/guest
# but a remote connection needs to add a new user remoteguest/remoteguest

#**************************
# bo_receive_stooq.py
#**************************
#!/usr/bin/env python
import pika
import sys

#localhost
#connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))#localhost

#remote server
parameters = pika.URLParameters("amqp://remoteguest:remoteguest@192.168.1.163/%2f")
connection = pika.BlockingConnection(parameters)
channel = connection.channel()

channel.exchange_declare(exchange='topic_logs',
type='topic')

result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue

channel.queue_bind(exchange='topic_logs',
queue=queue_name,
routing_key='ibm.us')

print(' [*] Waiting for logs. To exit press CTRL+C')

def callback(ch, method, properties, body):
print(" [x] %r:%r" % (method.routing_key, body))

channel.basic_consume(callback,
queue=queue_name,
no_ack=True)

channel.start_consuming()




#***********************
# bo_emit_stooq.py
#***********************

#!/usr/bin/env python
import datetime
import time
import mysql.connector
import random
import pickle
import os
from time import sleep

import pika
import sys

#localhost
#connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))#localhost

#remote server
parameters = pika.URLParameters("amqp://remoteguest:remoteguest@192.168.1.163/%2f")
connection = pika.BlockingConnection(parameters)
channel = connection.channel()

channel.exchange_declare(exchange='topic_logs',
type='topic')

cnx = mysql.connector.connect(user='scott', password='tiger',host='192.168.1.163')
cursor = cnx.cursor()

sql="select rowid() as rowid,Date,Inst,Open,High,Low,Close from stooqseq"
cursor.execute(sql)
# Fetch a single row using fetchone() method.
#data = cursor.fetchone()
cnt=0
for (rowid,Date,Inst,Open,High,Low,Close) in cursor:
if cnt%10==0:
print rowid,Date,Inst,Open,High,Low,Close
routing_key = Inst.encode('ascii')
message = str(rowid)+','+ Date+','+Inst+','+str(Open)+','+str(High)+','+str(Low)+','+str(Close)
message=message.encode('ascii')
channel.basic_publish(exchange='topic_logs',
routing_key=routing_key,
body=message)
#print(" [x] Sent %r:%r" % (routing_key, message))
cnt=cnt+1
#sleep(0.1)

# Make sure data is committed to the database
cnx.commit()

cursor.close()
cnx.close()




connection.close()

2017-08-29

BigObject Python Demo of RabbitMQ RPC client-server mode



BigObject-Performance with 100x Speedup


RabbitMQ rpc mode:

Use the RabbitMQ between client AP and BigObject

BOrpc_client -->Request--> rpc_queue-->BOrpc_server-->odbc-->BO
BOrpc_client <--Response<-- callback queue<-- BOrpc_server<--odbc<--BO


Users can write a python program to send SQL commands to our BigObject thru a RabbitMQ and get a response back. The BOrpc_client.py demo program sends a “select top 10 * from t1” request to the rpc_queue first and then sends “fetchall” and “fetchone” requests to read the result rows back.

The BOrpc_server.py program receives a request from the rpc_queue and then sends it to BO. It also processes the “fetchall” and “fetchone” requests from rpc_queue to send back the BO query rows to the callback queue.


Environment
Python

Install and configure components

  1. Install the package:
  2. # apt-get install rabbitmq-server
  1. Add the remoteguest user:
  2. # sudo rabbitmqctl add_user remoteguest remoteguest

  1. Permit configuration, write, and read access for the remoteguest user:
  2. # sudo rabbitmqctl set_permissions remoteguest ".*" ".*" ".*"

# local connection can use guest/guest
# but a remote connection needs to add a new user remoteguest/remoteguest

#*********************
#borpc_server.py
#*********************

import datetime
import time
import mysql.connector
import random

import pika

cnx = mysql.connector.connect(user='scott', password='tiger',host='192.168.1.163')
cursor = cnx.cursor(buffered=True)

#localhost
#connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))#localhost

#remote server
parameters = pika.URLParameters("amqp://remoteguest:remoteguest@192.168.1.163/%2f")
connection = pika.BlockingConnection(parameters)
channel = connection.channel()

#parameters = pika.URLParameters("amqp://remoteguest:remoteguest@192.168.1.163/%2f")
#connection = pika.BlockingConnection(parameters)
#channel = connection.channel()

channel.queue_declare(queue='rpc_queue')



querycount=0
def fetchone(linedata):
r=''
if linedata is not None:
for field in linedata:
r=r+field+'\t'
return r

def fetchall(data):
r=''
if data is not None:
for row in data:
r=r+fetchone(row)+'\n'
return r
def on_request(ch, method, props, body):
global cursor,querycount,cnx

print(" [cmd] %s" % body)

try:
if body=='fetchone':
data=cursor.fetchone()
response=fetchone(data)
elif body=='fetchall':
data=cursor.fetchall()
response=fetchall(data)
else:
cursor.execute(body)
response="OK"
except mysql.connector.Error as err:
response="Error: %s" % err

querycount=querycount+1

ch.basic_publish(exchange='',
routing_key=props.reply_to,
properties=pika.BasicProperties(correlation_id = props.correlation_id),
body=response)
ch.basic_ack(delivery_tag = method.delivery_tag)

channel.basic_qos(prefetch_count=1)
channel.basic_consume(on_request, queue='rpc_queue')

print(" [x] Awaiting RPC requests")
channel.start_consuming()


#*********************
#borpc_client.py
#*********************

import datetime
import time
import mysql.connector
import random

import pika
import uuid

class BORpcClient(object):
def __init__(self):
#localhost
#self.connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))#localhost
#remote server
parameters = pika.URLParameters("amqp://remoteguest:remoteguest@192.168.1.163/%2f")
self.connection = pika.BlockingConnection(parameters)
self.channel = self.connection.channel()


result = self.channel.queue_declare(exclusive=True)
self.callback_queue = result.method.queue

self.channel.basic_consume(self.on_response, no_ack=True,
queue=self.callback_queue)

def on_response(self, ch, method, props, body):
if self.corr_id == props.correlation_id:
self.response = body

def call(self, cmd):
self.response = None
self.corr_id = str(uuid.uuid4())
self.channel.basic_publish(exchange='',
routing_key='rpc_queue',
properties=pika.BasicProperties(
reply_to = self.callback_queue,
correlation_id = self.corr_id,
),
body=cmd)
while self.response is None:
self.connection.process_data_events()
return self.response

BO_rpc = BORpcClient()
cmd="select top 10 * from t1"

print(" [x] Requesting BO: %s" % cmd)
response = BO_rpc.call(cmd)
print(" [.] Response: %s" % response)
response = BO_rpc.call('fetchall')
print(" [.] Response: %s" % response)

for i in range(1):
response = BO_rpc.call('fetchone')
#response = BO_rpc.call(cmd)
print(" [.] Response: %s" % response)



2017-08-28

VWAP calculation with a BigObject Sliding Window

VWAP calculation with a BigObject Sliding Window


"BigObject-Performance with 100x Speedup"
VWAP(Volume Weighted Average Price) is a common function in real-time trading processing. It calculates the
∑(price x volume ) / ∑volume
values of all stocks’ price and volume data from streaming input. In our BigObject system, we can insert these data into a sliding table and then compute all VWAP values periodically as a value-added data source.
BigObject SQL commands:
CREATE SLIDING TABLE st1 ('stockcode' STRING(16), 'price' float, 'volume' float, TIMEBOUND(3) )
Select top 5 stockcode,pv,v,pv/v as vwap From (select stockcode,sum(price*volume) as pv,sum(volume) as v from st1 group by stockcode) Order by stockcode
Output of the sample program:
1001.TW 1.0 1.0 1.0
1002.TW 4.0 2.0 2.0
1003.TW 9.0 3.0 3.0
1004.TW 16.0 4.0 4.0
1005.TW 25.0 5.0 5.0
1
1001.TW 1035.0 23.0 45.0
1002.TW 1108.0 25.0 44.32
1003.TW 1185.0 27.0 43.888889
1004.TW 1266.0 29.0 43.655172
1005.TW 1351.0 31.0 43.580645
2
1001.TW 2755.0 66.0 41.742424
1002.TW 2912.0 69.0 42.202899
1003.TW 3075.0 72.0 42.708333
1004.TW 3244.0 75.0 43.253333
1005.TW 3419.0 78.0 43.833333
....
Source Code:
# vwap.py
#***********
import datetime
import time
import mysql.connector
import random
cnx = mysql.connector.connect(user='scott', password='tiger',host='https://www.linkedin.com/redir/invalid-link-page?url=192%2e168%2e1%2e163')
cursor = cnx.cursor()
try:
   cursor.execute("Drop TABLE st1")
except:
   pass
cursor.execute( "CREATE SLIDING TABLE st1 ('stockcode' STRING(16), 'price' float, 'volume' float, TIMEBOUND(3) )" )
#cursor.execute( "CREATE TABLE t3 ('t1.id' STRING(32),'t2.acc' STRING(32),'amt' double )" )
#starttime=datetime.now()
#starttime=datetime.now()
starttime=time.time()
cnt=0
jmax=10
imax=1000
ids=[]
add_sql=''
print 'st1:'
for j in range(jmax):
   add_sql = "INSERT INTO st1 (stockcode, price, volume) VALUES "
   for i in range(imax):
      #cnt= random.uniform(1, 100000000)
      cnt=cnt+1
      add_sql += "('"+str(1001+i%1000)+".TW',"+str(cnt%53)+","+str(cnt%89)+"),"
      ids.append(cnt)
      #print 'sql:',add_sql
   # Insert new data_product
   cursor.execute(add_sql)
   print j
   time.sleep(1)
   sql = "select top 5 stockcode,pv,v,pv/v as vwap from (select stockcode,sum(price*volume) as pv,sum(volume) as v from st1 group by stockcode) order by stockcode"
   cursor.execute(sql)
   # Fetch a single row using fetchone() method.
   #data = cursor.fetchone()
   for (stockcode,pv,v,vwap) in cursor:
    print stockcode,pv,v,vwap
endtime=time.time()
diff=endtime-starttime
#print ("bigobject %d x %d inserts: %s seconds, rate=%f/s" % (jmax,imax,diff,jmax*imax/diff))
# Make sure data is committed to the database
cnx.commit()
cursor.close()
cnx.close()

2017-08-25

夏肇毅觀點:國機國造,延續數十年持續努力的成果


 
中科院日前首度展示自行研發的空用主動電子掃描陣列雷達,AESA(Active Electronically Scanned Array),未來將應用在國機國造新一代戰機中。雷達是二次大戰前發明的古老科技,電影中常見一個圓形螢幕中,有一條線在那裡轉呀轉的。然後一些亮點突然出現,之後警報大作,就知道敵機來襲。雷達運用發出無線電脈波,然後靠偵測反射回波的時間,來判斷是否有東西在前方多遠的距離。再加上持續旋轉的機構,讓銀幕與天線同步旋轉,就可以做360度的掃描。之後再運用都卜勒效應原理,可由反射波的頻率改變,得知目標的速度。70多年後,同樣原理依然運行,只是系統變得更小更進步。

後來科學家慢慢發現,將數個天線裝在特定位置,再改變各天線電波的相位,因相互干涉的關係,使得天線的效益會向某一方向集中,讓偵測角度變小,方位解析度因而增加。如果再用電子信號來控制各個天線信號的相位,那麼就可以隨意快速地改變天線發收方向,這就是電子掃描陣列雷達ESA(Electronically Scanned Array)。相位陣列天線的技術原來是天文學家所開發,利用大量天線來增強增益,後來也為電子掃描陣列雷達所用。到現在的常見的神盾級戰艦,最明顯的特徵就是使用平面式的3D相位陣列雷達。

(相位陣列天線 圖片來源: wiki-Phased array)

中科院設計與製造雷達系統已有超過50年的經歷史,從傳統的旋轉式平面搜索雷達到固定式全相列雷達都有。在2015年巴黎航空展中,中科院也展出過旋轉式三維相列雷達系統、主動相列雷達收發模組、可擴充式數位波束合成器等各種相列雷達系統與模組。隨著科技日新月異,微波不再是軍用的專利,從日常用品微波爐、手機、WiFi到處都是。電腦越來越快,信號處理也走向數位化,各種商用品也都能高速執行數位信號處理DSP(Digital Signal Processing)運算,甚至是用FPGA來自行設計IC來用。因為這個趨勢,中科院在產品簡介中揭示民國95年起也開始研發數位波束合成器,採用Xilinx FPGA晶片,並於民國100年裝配於相關雷達上。

雷達是軍事系統中不可或缺的元件,所以也隨著自各式製飛彈系統的投資,雷達系統也一併持續發展。這個今年最新展示的AESA空用主動電子掃描陣列雷達成果,未來將裝在國造的新一代戰機中。

早期軍方設有「航空工業發展中心」,民國72年,空軍航空工業發展中心改隸國防部中山科學研究院,更名為「中山科學研究院航空工業發展中心」,航空研究院改組為第五研究所。民國85年,航空工業發展中心轉型為「漢翔航空工業股份有限公司」。

相對於雷達系統的持續開花結果,國機國造在IDF之後就中斷許久。民國70年開始高性能戰鬥機原型研發,民國77年第一架IDF原型機出廠。在民國81年服役之後,就一直沒有再看到有新一代戰機的全新研發投資案進行。

IDF Pre-production.jpg
(先導生產型單座經國號戰機 圖片來源: wiki F-CK-1經國號戰鬥機)

如今在國機國造政策下,空軍於民國106年1月1日正式編成「空軍航空科技研究發展中心」,航發中心再次復活,以引導我國航太科技研究及武器系統自製的需求方向,督導國機國造及研發設計下一代戰機。國防部公佈之「國機國造之機會與挑戰」報告中也提到「我國在20年內無法獲得先進戰機,必須在IDF研發能量流失前儘速啟動高教機研製,以凝聚下一代戰機研發能量。IDF時期之研發工程師現多已逾50歲,面臨人才流失風險」。

民國106年2月7日,空軍與中科院共同簽署委製協議書暨合作備忘錄,國機國造正式啟動。由中科院擔任國造高教機計畫的承包商,將與漢翔航空工業合作,預計生產六十六架。國防部並已決定,將採用漢翔航空工業公司XT-5藍鵲高教機設計。

國防工業研發專案,因為都是要求做現在做不到的事,所以風險甚高,不太能掌握預期的結果。很早以前,聽過一種說法,說美國國防研發專案,如期完成的約三成,如期又質的大概不到一成,更別說超過預算這事了。就像美國的F-35,也是又貴、又延期、問題又一堆。但隨著時間過去,這些都是會解決的。不像生產製造專案大都能夠按部就班的進行,有這些不如人意的事,就是國防研發專案的本質,一切都是靠錢、人、時間堆砌出來的。還常常有人把關鍵元件同時交給兩三組人重複研發,寧可多花錢,就都只是為了要買保險而已。

要有點耐心來持續灌溉,十年是基本單位。一旦中斷,人散了,那也就前功盡棄了。以後再重來,就是要從零開始。所以持續投入資源,延續研發成果,是國防航太工業發展的重要原則。大錢都是花在生產上的。至於要不要買國造品,那就要看做出來的東西有沒有競爭力,還看你有沒其他選擇。但持續花小錢來開發先進原型,甚至是麻雀雖小五臟俱全的縮小版,都是持續練兵的方式。只有持續匯集產、官、學的努力,讓最新的原理研究能開發出新產品來,同時也培養大量對航太科技有熱忱的人才,才能應付未來太空世界科技的挑戰。


作者簡介:夏肇毅,提供雲端教學與理財計算服務之CubicPower.idv.tw創辦人。曾服務於緯創軟體、英商路透社等金融與科技單位從事金融軟體開發專案工作。

夏肇毅觀點:還要小孩背嗎?在了不了解,記與不記間



常看見有人在抱怨學校要小孩背一些無意義的古文,可能是覺得這樣太辛苦了,學習不是了解就好了嗎,幹嘛還要死背呢?開始教改後,就鼓吹不用死背,理解就好,學生要快樂學習。所以算乘法就教你用加的,九乘九就連加九次就好了。這樣不用背九九乘法表,輕不輕鬆?可是,算起來快不快?好累,一點都不快:「沒關係,用計算機算就好」。漸漸地,網路時代來臨:「想做一道菜,什麼都不用知道,上網邊查邊煮就好了」。「要去一個地方,怎麼走?不用煩惱,打開APP報你知」。「英語好難喔!沒關係,我用Google翻譯就好了」。「以後有AI人工智慧機器人,一切問它就行了」。越寶貝你的腦袋,慢慢的它就越來越小。過去用傻瓜像機,廣告裡說它傻瓜,你聰明,其實是矯飾。現在大家都用智慧手機,那就真的變成說它聰明,你傻瓜了。以前大部份的電話都會記在腦袋裏,可是現在連字都快不會寫。難怪有人說,未來AI人工智慧機器人的工廠只會有兩個員工,一個人和一條狗。人負責餵狗,狗負責阻止人碰機器。

(紅樓夢教學演示 圖片來源:夏肇毅動畫台)

為什麼要記

記憶力是思考的基礎,懂了就是通過了腦中規則的驗證。記憶就如同電腦的快取一般,直接取用前人思考的成果,站在巨人的肩膀上,加快速度,不用每次都重新起高樓。如果沒有把原理、方法、規則等記在腦袋裡,那麼是不容易思考的。因為無從在腦中逐一驗證,以尋找最佳解決方案。如果沒把詞彙、例句、範本等記到腦袋裡,那麼在說話、寫信、寫公文時,也將十分困難。因為記得的材料太少,腦中可能只剩日常生活中聽到的話語可用。

但背書學習的過程是痛苦的,背了半天記不住,好不容易記住,過兩天又忘了。這痛苦又不得不做的事,讓人巴不得除之而後快。因此大家都期望有過目不忘的秘方,或是根本就不用背。一般流行的記憶術,大都以連結的方式來取代反覆背誦。有像聯想法、串聯法、位置法、標籤圖形法、線索法、諧音法、歌訣音韻法、歸納法等等各種不同的連結方法。希望讓你先記比較少的內容,之後再藉由連結慢慢地思考以擴展記憶。仿間處處都是幾天學會什麼,或是輕鬆不用背的書。是否好用,我們可以探討一下。

怎樣記才好

根據報導,人類的記憶分為短期記憶(工作記憶)和長期記憶。短期記憶都儲存在大腦海馬迴中,如果在短時間內被重複提及的話,海馬迴就會將它轉存入大腦皮質中,成為長期記憶。海馬迴同時也具備檢索的功能,能快速地將記憶檢索出來。美國德州大學奧斯丁分校學習與記憶中心的普瑞斯頓(Alison Preston)解釋了這個記憶機制:「參與記憶固化過程的細胞與分子變化,通常發生於學習之初的前幾分鐘到幾小時,而且會改變神經元或神經元群的狀態。系統層級的固化作用需將處理個別記憶的腦網絡重組,發生的時程慢得多,需要幾天、甚至幾年」。「海馬需要合成新的RNA與蛋白質,才能穩固這種突觸變化,將突觸傳輸上的暫時變化轉變成構造上的永久改變」。

從心理學方面的研究發現,短期記憶的時間有限,大約在二十秒以內。就像人家說了一個名字或號碼,沒有特別去記它的話,很快就想不起來了。而短期記憶的容量根據哈佛大學心理學專家喬治‧米勒的研究,大約是7±2個區塊。短期記憶通過有規律的讀取就可進入長期記憶,但長期記憶也是很快會被遺忘的。德國心理學家艾賓浩斯研究發現了記憶遺忘曲線(The Ebbinghaus Forgetting Curve),顯示學習20分鐘後,還剩58%被記住。1小時後,只剩44%被記住。1天後,還有26%被記住。1週後,剩23%被記住。1個月後,只有21%被記住。

間隔學習學得慢忘得慢

複習是維持記憶的不二法門。艾賓浩斯也發現了間隔效應(Space Effect)。就是把一定次數的背誦練習,分散間隔進行,這樣會比集中進行的記憶效果好。若再加上學習過程的時間,我們應該就可以得到「集中學習,學得快忘得快。間隔學習,學得慢忘得慢。」的結論。

我們可以把死背對應為集中學習。就像考前臨時報佛腳一般,短時間內不求甚解,一下子把它全背起來。考起試來可能效果不錯,但考完後很快就忘光了,這是學習後沒有持續鞏固記憶的結果。間隔學習,就像上課學習後有持續複習,所以就會發展為長期記憶。學習的時間比較長,可是也能記得久。

接下來就是要想辦法讓新記憶與腦中現有的知識產生連結,像是用原有知識對新加入的記憶賦予意義,或是對它做一些解釋、判斷、驗證等思考理解的動作,這樣也比較容易形成長期記憶。總括來說,提升記憶效果的方法就是理解連結,持續間隔學習,了解之後還要能記住。這是用理解來幫助記憶的方法,但運用在語言,運動等需要速度的工作時,可能就會有麻煩了。

靠思考記憶有其缺陷

學英語時練習用文法造句,就是用理解來學習的實例,結果就是慢跟錯。我們學校裡傳統的英語教材,每一課總會教你文法,考試也愛考文法,所以學生學習英語就會從文法出發。到了真正用上時,腦中就會先把文法規則搬出來想,然後造句。這一套在筆試時有效,因為可以慢慢揣摩。但是到了會話時,就麻煩了。因為一句話有很多部份,要套很多規則,所以很慢,而且會出錯。可能是套錯規則,或者是文法有很多例外。跟外國人對話時,第一是聽的時候要花很多時間來分析文法以了解對方的意思,再來就是回答時要想文法來造句。所以大部份的腦力都花在文法的思考上,而不是花在對話的內容上。我們可以想想看,外國小孩在學講話前有學文法嗎?或者說自己說國語時有想過文法嗎?應該沒有,可是我們的國語也是說得嚇嚇叫。

(英語教學演示  圖片來源:夏肇毅動畫台)

再回想一下,小孩是怎麼學說話的?就是從模仿開始。媽媽說叫媽媽,它就會說媽媽。問她說妹妹漂不漂亮,她就會說漂亮。這個好不好吃?好吃。之後由父母家人的動作中了解指令的意思,然後在腦中建立概念。所以小孩的說話方式會跟週遭的人很類似,因為都是由模仿而來。英語或其他外國語的學習方式也應該如此,整句聽,整句說,讓一句話直接轉成意義,同時帶出該回覆的話來。這就是純記憶式的反射學習法。文法應該只是事後的輔助工具,讓你了解為什麼要這樣說而已。

拆散內容在腦中分別建立獨立索引

同樣的情況也發生在運動上。它需要在很短時間內做出動作,所以幾乎是靠直覺來反應,而不是思考,因為來不及。所以都是要事先想好策略,或是在空檔時思考調整,之後就都只能靠臨場反應。對應到傳統的國術教學,我們就可以了解它的問題出在哪裡。國術為傳統武術,它整個的教法就是把數十個動作串在一起,讓你重複依序練習每一個動作。這樣做的好處就是不會忘記或漏掉,也是記憶術中一種集合成為區塊的手段。所以學生學完後依序表演,虎虎生風,沒有問題。可是到實際應用時就麻煩了,因為還要想,這樣反應一定來不及,因此往往被譏為花拳繡腿。
(國術教學演示 圖片來源:夏肇毅動畫台)

整套順序記憶練習,不容易忘,但也不容易運用。解決的方法,就要從了解大腦運作的原理去想。整串練習,就只有起頭一個索引,各個細部要由起頭依序帶出。如果我們能讓每個細部都建起獨立的索引,那麼就可以隨時快速讀取各個細部。而在腦中建立獨立索引的方法,就是把每個細部單獨抽出,重複練習。讓大腦對它印象深刻,而成為自然反射反應。

古文詩詞學習也雷同。如果是整篇背,不會遺漏,但不容易單句抽離應用。因此需要逐句重複練習 ,把每個句子在腦中都建起索引,才能隨時取用。所以可以說如果背書只是整篇背,那麼真的是無用的死背。只有進一步再深入練習了解每個句子,將它變成獨立索引後,那才真的能在腦中建起有用的智慧。


作者簡介:夏肇毅,提供雲端理財機與教學服務之CubicPower.idv.tw創辦人。曾服務於緯創軟體、英商路透社等金融與科技單位從事金融軟體開發專案工作。









2017-08-23

夏肇毅觀點:人工智慧時代來臨,自我學習拋開傳統找活路




近日雜誌報導「15歲周奕勳用程式語言找回學習的意義:9歲的他開始自學程式語言,就此意外地走出人生的另一條路。」。他2015年兩次到矽谷參訪,現在已經從高中休學,擔任台灣一間APP開發公司的實習前端工程師。前一陣子另一則轟動世界的新聞則是「橫掃人類頂級棋手豪取60勝的Master公布真身:AlphaGo升級版!」。把這兩件事情連在一起,它告訴我們,人類傳統走的路已經漸漸在崩潰,我們必須找出不同的道路來。

Kevin Kelly曾說面對AI人工智慧時代來臨,人類要先擁抱人工智慧,然後再操控人工智慧,就像AlphaGo是人工智慧與人類團隊結合的成果一樣。當人工智慧再加上機械身體後就成為機器人,這時候可能人類就要小心了,有人說它可能在未來幾年間取代40%的人類工作。投資購買機器人的資金流到了生產機器人的公司,減少的人力成本就持續回饋給使用機器人的公司,而剩下的失業人口就變成了政府的負擔。再發展下去也可能就會是好萊塢電影想像內容的實現:機器人終將掌控世界。電影導演往往就是世界未來發展的編劇,因為觀眾看了就像被催眠般地將情節寫進潛意識中,日後自然就會有人將它實現出來。政府智庫與顧問公司可能要未雨綢繆,為此規劃應變方法。

AlphaGo利用機械學習的方法,除了輸入人類的棋譜外,在人類團隊的指導下,它持續自己跟自己練習,下棋的功力因此逐日增加。從這裡可以發現持續進步發展的訣竅:基礎教育、自我學習、實際操作,然後再加上師傅指正,以免誤入歧途。同樣的,每一個人可能也要放棄傳統依賴老師教導的老路,開始自我上網學習科技新知,以跟上人工智慧機器人時代的腳步。

想跟上時代不被取代就要建立自學能力

當前金融科技正紅,數位金融大幅減少了銀行行員的需求,許多分行都被自動櫃員機ATM所取代。其實ATM本就是一種不會動的機器人,無人分行差不多都已經可以滿足一般服務民眾的需求了。不足之處,頂多加個遠距視訊服務就行了。日本保險巨頭Fukoku Mutual Life Insurance就在今年開始引入了IBM日本公司的Watson AI人工智慧系統,用來協助保險理賠工作,並且由此計劃裁減近30%的保險理賠評估部門員工。

看到這些,會不會有些心驚膽顫,擔心自己未來的飯碗不保﹖長遠來看,趨勢可能就是這樣。但是一切改變總是有一個過程,比較少一夜白頭的那種迅速變化。我們真要把握這段轉換時間,把自己口袋裏的求生包裝備更新充實一下,以便應付未來變化後的需求。

學生剛開始大部份都要靠老師教。但科技時代,老師的知識也是屬於需要被汰換的範圍。所以我們要開始練習戒掉對老師的依賴,不再接受二手知識,讓自己從網路直接接收第一手的資訊來學習。在數位金融浪潮中,金融業從業人員有幾個要自我學習的範圍,包括數位金融、科技與英文。要想辦法在最短時間內,自己將這些範圍的技術學起來。

要自學才能跟著自己的程度走

近代科技變化快速,像近幾年電腦科技的流行主題,由雲端運算、大數據、物聯網,變化到現在的金融科技。就如同時裝界一般,每年每季都有新款推出。要跟上時代,就只能靠自己學。現在網路發達,什麼資料都有,又有線上媒體,早將重點內容節錄整理起來刊出介紹。只要我們每天看看,應該就都能跟上潮流。

自學的好處,就是能跟著自己的程度走。因為像數理科目是有連續性的,一旦有一小段不會,後面就完全跟不上,永遠都聽不懂,課上了也是白上。沒有回頭補上失落的那一段,後面再怎麼上也不會。但若是自己看書學習,我們就可以自己控制進度,等把不懂的搞到懂後,再往下學習。不會像上課那樣,要去追那一匹持續在跑的馬,永遠都沒有追上的希望。

前幾年,美國開始推廣人人來學習程式設計,連歐巴馬也在寫。我是有點懷疑這是否有意義,因為這種東西要做到有點功能出來,都是要耗費相當龐大工作量的。你如果不是持續從事這工作,根本沒辦法累積到這麼多知識與產出。只是偶爾摸一下的話,學的東西一下就忘了。就像以前的電腦指令一般,不常用的一兩個禮拜就會忘個精光。但若是要以此為業,則就必須持續學習,溫故知新。

程式設計本身做的人多,變化也快,沒多久就有一新的語言產生。就算語言相同,廠商一兩年也都會推出新的框架。基本上也都是用不同的方法,把同樣的事再做一次罷了。這種東西太多了,也不可能每個都學。何況往往再過不久,這些東西就又被廠商給拋棄,所以都只能看看風向,了解個大概。反正我們每天都會收到很多的產業電子報,有什麼新東西就瀏覽一下。當有一天你發現有什麼東西已經成為潮流,那麼就可以再投入時間把整套東西都學起來。

挑選好教材是自學成功的關鍵

好的教材很重要,是自學成功的關鍵。挑到好的教材,就像找到好的師父一般,能讓你學到真功夫。但是一般的課本注重概念解說,設想你未來會成為科學家,所以就用啟發式教學,長篇大論的證明給你看,希望你了解原理,然後再會思考。可是到考試時卻只是考你應用,那套原理始終用不上。

所以除了原理之外,最重要的就是方法。要能教你步驟一二三,一步都不能跳。方法與步驟,是連結原理與應用之間不可或缺的元素。要找教你方法的書,講解原理後會教你步驟,然後要有不同的範例,讓你知道在什麼時候該怎麼用。同時也要有可執行的程式、可運作的線路、可組裝的繪圖、可產出的方法等能看到真正實現案例的說明。也就是要找那些按部就班、有層次、有重點摘要、有原理簡單說明、有方法步驟,然後有範例的書當教材,而不是要文章式的長篇論述內容。

千萬不要把以字典式編排的參考手冊當做教材。就算看了厚厚一本各個功能的說明,你還是不會用。要找到真正分程度的教材來讀,一課一課一單元一單元的學習。像我們學做菜一般,就算看完所有材料的來源、營養等詳細介紹說明,還是不會煮菜。我們需要的,是教我們每一道菜做法的食譜。如同國外許多技術書籍往往把書名取為某某CookBook一樣,自學的第一步,就是要找出教導各種學問的食譜。

還有,英語能力也是快速吸收的關鍵。它讓你不用等人翻譯,可以直接找到第一手的資料。但英文能力不是一蹴可及的,要累積單字和短句,慢慢的就會了解某一特定主題的說法,一個個學習。時間久後,就可以慢慢的能和開始和外國人溝通了。

戒掉對老師的依賴

個人覺得真的需要改變靠聽老師上課的習慣。看比說至少快十倍以上,找到好的教材自己看懂,絕對比你聽老師慢慢講解快得多。就算線上課程也一樣,既然都上線了,幹嘛還要盯著銀幕等講者一句句地慢慢說呢﹖找教材,開始看,不懂,就上網查,自己掌握進度,才不會有斷點。要跟上人工智慧時代,還是放棄去上課的想法,戒掉對老師的依賴,從今天就開始練習自學吧。


作者簡介:夏肇毅,提供雲端理財機與教學服務之CubicPower.idv.tw創辦人。曾服務於緯創軟體、英商路透社等金融與科技單位從事金融軟體開發專案工作。




夏肇毅觀點:產學脫節讀了沒用,負債讀大學虧大了





近日報載“史上最慘大專151系所註冊率抱蛋”,“少子化明年大學減招近萬人》封閉的高教環境大學生機渺茫”等消息,高教危機已到眼前,不再只是危言聳聽。也報導”嚴長壽說如今面臨少子化衝擊,私校當年投資泡湯、大學教師當年拚命讀博士,如今面臨失業,結果是「全盤皆輸」,大家都受害。教育部應訂出大學退場機制,或是讓大學改辦學院或專科,專注自己原本擁有的強項、放棄非強項。”。民國105年度指考錄取率97.1%,已是全民大學生的狀態,學校幾乎是有學生來就收,105年度智能障礙就讀大專的人數也達1200人。除了少子化讓大學如今招不到學生外,最大的問題其實是廣設大學讓高職五專技職系統消失,因而造成產學脫節。

產學脫節讀了沒用

曾有一位自動化機械董事長說:”我寧願用50K請高職生。...今天若換成一位沒技術底子的科大生,「給他22K都還嫌多!」因為還得請廠長來教他,額外耗產能,對公司根本負成長。”。這是當前高等教育最大的問題:背了很多學貸,讀完了卻沒用,學不到技術。科大聘了博士用大學教材把學校當大學教,而不像專科聘用有一技之長的技術教師,傳授專業技藝。大學教材是為培養研究人才而設計的,以理論數學描述為主體。它需要天賦很好,數學很強的人來學才有效。而且終極目標是讀完博士學位,這樣才能夠獨立做研究。科大讓學生學這種教材,出社會是完全沒用的,還要從頭訓練個一兩年才有生產力。科大只有重拾專科技能教育的精神,重新聘用技能教師,以動手為主才有可能教出能就業的學生。但有學者教授,一直以大學教育是全人教育而不是職業教育為立論點,反對在大學中提供技職教育。如果堅持這立場而不願調整科大教育內容的話,那麼就只有重新轉回專科一途,這樣就是名正言順的技職教育。如同以前和碩科技董事長童子賢所說:“反對廣設技術學院和科技大學,像台北科大等龍頭學校,應回頭重新設立「五專部」”。職場上需要大量的技術員與工程師,以及小量寫學術論文的研究人員。我們培育人才就應該根據社會的需求來規劃。

大學教育內容不利動手實作

個人從小就對動手做著迷,國二暑假就在學校圖書館裡,找到一本電子電路的書來看。看得似懂非懂,卻也拼湊出一些基本概念。那時都是真空管,原理相對簡單,就是電壓的放大,和信號加減乘除就可以了。所以什麼整流器,放大器,AM,FM,好像都能直接從電路上了解一些操作原理。後來不巧找到大學的教課書,天啊都是數學。看到微分符號的di/dt就想把上下的d消掉,幾年後才發現這是笑話。進大學前,我對電子電路是很有興趣的,就是現在所說的創客Maker。看了不少,動手做了不少,像對講機,遙控飛機等,也是中華商場後棟電子零件店的常客,所以滿懷著希望上大學,想像會有更多實做機會。進大學後,才發現都是數學,什麼都要用數學描述,用數學算出確實的數值。不巧我的數學實在不怎麼樣,懶得重複練習及格邊緣而已。每學期大概通常只有第一堂剛開始還聽得懂,之後老師很快導到第3,4,5...式,但我還在想第一式。老師的式子導得行雲流水,我在下面幾乎不知所云。最後,電路和電子就變成我最沒興趣的科目了。不容易學到電子電路的意義,只是不斷的解題,導式子,最後就只有說拜拜了。

(電路模擬:夏肇毅提供)


多動手實做才能累積經驗

做事以後,隔壁小組也是做類比電路的,幾乎沒看他們用過數學。和老外合作時,發現他們剛退休的工程師就是做類比電路的。四十多年經驗,他們做得就是比你好很多。不像我們做數位電路的,不是0就是1,對了就好,沒有更對。而類比電路,靠的就是技術經驗,好,還可以更好。這些是要靠觀念的。大學教育都用數學解釋的教法,只會毀了你對這技術的興趣。把數學塞到學生跟技術之間,讓學生永遠只會考試解題,而幾乎不會設計技術。只好等做事時,一切再從頭教起,之後過了3,5年才開始能做點事。也因此之後我在公司徵程式設計師時,幾乎都是從兩年以上資歷的即戰力開始找起。

國外許多創業名人,從小學就開始自學動手設計程式。到了上大學時,等於已經有七八年的工作經驗,後來乾脆大學也不上了, 直接出來創業。所以我覺得,技術應該就在動手中。講完原理然後直接動手做,這樣訓練出來的人才能立刻上職場。否則花了那麼多錢上大學,等畢業後還不能立刻工作賺錢,可能還要花錢再上個一年半載的職訓班,那樣多划不來啊!


作者簡介:夏肇毅,提供雲端理財機與教學服務之CubicPower.idv.tw創辦人。曾服務於緯創軟體、英商路透社等金融與科技單位從事金融軟體開發專案工作。










夏肇毅觀點:金融界拒絕坐以待斃的利器-金融創新科技




燒了一年多的金融科技熱潮也許將近尾聲鋪天蓋地的金融科技活動好像都停在坐而言的階段而且大都集中在介紹國外現況與批評國內法規這些屬於學官界的討論範圍中對於要實際行動的業界來說能夠放寬法規提供監理沙盒當然是好事但將資源投入這種以五年十年為基本單位的修法活動是否明智可能就要斟酌一下了新創公司資源也許就能燒個兩三年可能等不到法規開放而現有的金融業者一定就是在現行法規內運作不可能將大量人力放在不能營業的範圍內這時在現有規範下進行金融創新就變成另一條出路

(大同大學廖文華教授主持-夏肇毅提供)

大同大學在日前舉辦了”Finnotech金融科技新創與創新論壇”創造了FinnoTech金融+創新+科技這個名詞著眼在探討創新的金融科技上。並由20,30,40各世代的新創團隊與國內知名投信期貨保險高階主管同場較勁各顯神通


(20,30,40各世代新創業者與談-夏肇毅提供)

新創團隊著眼於金融科技範疇,有還在學的創業團隊,也有創業十幾年但第一次踏入電子支付機構行列的。大家在各式支付與證券理財中嘗試將其服務發揚光大,並在本次論壇中分享創業過程的心得與其中經歷過的酸甜苦辣。

(大同大學助理教授翁禮祺主持金融業演講與對談-夏肇毅提供)

而金融業者一方面準備面對未來開放法規後可能的競爭衝擊一方面也在現行規範下極力創新,希望創造更大的服務版圖與營收。像投信業者開發了各式新創ETF把債券變ETF當股票賣把錢也包成ETF賣動動腦筋什麼都可以變ETF。這樣以前只有大戶和機構在玩的商品,等核准後未來散戶也可以買。而期貨業者內部早就備妥高頻交易理財機器人備戰,在模擬交易所中有各式各樣的機器人理財策略任君挑選保險業者以社會服務態度檢討過去理賠不易的缺點,嘗試讓消費者在網上輕鬆購買保險和取得理賠並試圖降低保費與門檻相對於新創業者的單兵突破金融業者有點正規軍大部隊壓境的感覺

(重量級金融業高階主管與談-夏肇毅提供)

看到大家摩拳擦掌的積極準備可以想像未來人工智慧時代將全面啟動。但金融創新一方面要放鬆法規一方面也要防止金融事件的發生:如過去美國的LTCM崩潰香港人稱”I kill you later”的Accumulator事件以及台灣近期的TRF等試想像LTCM有兩位諾貝爾得主參與依據歷史大數據模型由理財機器人操盤都能賠掉數十億美金而搞垮公司相對於未來可能不太容易超越諾貝爾得主的設計者來說真的要好好想想如何防止歷史事件重演了


作者簡介:夏肇毅,提供雲端理財機與教學服務之CubicPower.idv.tw創辦人。曾服務於緯創軟體、英商路透社等金融與科技單位從事金融軟體開發專案工作。