安裝 Apache

book book

安裝 PHP

book book book book

檢查 PHP 版本

book

啟動 Apache 網站服務

book book

建立 PHP Info Page

book

phpinfo();

book


book

進入 EC2 中控室

開啟帳號後,就可以開始架設自己的第一個EC2主機了,首先登入帳號後,點選EC2服務,就可以來到 EC2 中控室了。 book

修改機房位置

在 EC2 中控室中,首先修改我們的機房位置到最近的日本東京。 book

開始啟動第一台雲端主機

首先點選 Launch book

選擇作業系統,發現 AWS 內建的 Linux image 就很好用了,包含了基本工具與PHP等package. book

選擇免費但是資源較少的方案,先做為學習主機。 book

配置主機

建立一台主機後,AWS會要求你進行基本配置,首先 security group 我先選擇 default 之後再來修改內容。 book

增加一個名稱的tag方便日後主機很多時能夠管理。 book

公開鑰與私有鑰

AWS 會提供一組 public key 與 private key,AWS 會保留 public key 在主機中,當我們透過 SSH 連線時,必須要提供相對應的 private key,這機制提供主機對於遠端連線時多一層安全保障。 book

確認主機狀態

建立好主機後,可以在 EC2 中控室 看到你所有的主機與主機狀態。 book

book

book

私有鑰轉換

由 Windows 系統連上 EC2 時,AWS 推薦使用 Putty,但是 Putty 無法直接使用 AWS 所以提供的私鑰檔案格式(.pem),所以需要使用 PuttyGen 工具,將 .pem 檔案轉換成 Putty 所使用的 .ppk 格式。

book

book

登入主機

使用 Putty 登入主機前,先需要進行下面設定。 首先,將剛剛轉換好的 .ppk 檔案,設定到 Putty 中。

book

在 雲端主機的 security group 中,確認我們有將主機的 SSH 與 HTTP 連接(Port) 打開。

book

在 Putty 的 host 欄位中輸入 ec2-user @ [主機 public DNS]

book

登入成功

book


book

AWS 簡介

AWS (Amazon Web Services) 是 Amazon 提供的雲端運算服務,透過雲端運算服務,我們提供給客戶的網路服務增強了 可靠性 與 延展性,同時也大大 降低網路服務維護與管理成本。 AWS 對於新創公司或是新團隊是一大福音,小團隊在市場與營收還沒穩固前,可以先透過AWS優先提供Solution給客戶,等到客戶成長後,AWS也可以輕易地擴充機器滿足不同時期的需求。

AWS 免費方案

目前 AWS 有提供註冊後的第一年免費方案,對於目前工作上,要對一些服務的學習與測試有很大的幫助。 book

AWS EC2 服務

AWS 提供的雲端運算服務琳瑯滿目,目前希望能先在AWS架設一個簡單網站,所以先選擇 EC2(Elastic ComputeCloud,彈性雲端運算) 做為優先學習的項目。 同時在 EC2 上,AWS也提供許多軟體與工具,讓我們可以輕易的安裝,例如 PHP, Apache, WordPress, Magento … 等,超級方便。 book

AWS 註冊流程

了解收費規則後,馬上來註冊一個免費帳號,首先建立一個新用戶的帳號。

book

book

同時要輸入帳單的英文地址與信用卡卡號。

book

再來是比較特別的身分驗證,首先 AWS 會撥打電話到你註冊的電話號碼,然後要你利用按鍵輸入網頁要你輸入的 PIN 碼

book

驗證成功後,選擇客戶服務的方式,目前學習階段,先選擇免費的方案嚕!

book

完成

帳號建立完成,接下來就可以開一台主機試看看了。


book

基本說明

當定義了許多函式之後,我們會開始想讓它們被重複利用,並且能夠集中起來方便管理, 因此Python提供了模組(Modules)機制,方便我們將函式集中管理。

首先建立一個 fib.py 的檔案如下:

def fib(n):  
    a, b = 0, 1
    while b < n:
        print(b, end=' ')
        a, b = b, a+b
    print()

def fib2(n): 
    result = []
    a, b = 0, 1
    while b < n:
        result.append(b)
        a, b = b, a+b
    return result

然後再主程式中使用下面 namespace 方式宣告模組並使用

import fibo
fibo.fib(1000)
fibo.fib2(100)

模組進階

模組有兩個主要特色:

初始化一次

Python 的模組在 import 時只會被載入一次,之後再使用import則不會有任何作用,但是也可以使用 imp.reload 的方式,重新載入。

import imp
imp.reload(modulename)

命名空間 (Namespace)

Python為模組提供命名空間的機制,讓函式名稱不會產生衝突,下面有寫法,習慣上比較推薦第一種,因為第一種除了保證不會與其他名稱衝突外,也可以讓程式讀起來更容易理解,使用的函式是出自哪一個模組中。

#寫法1  (推薦)
import fibo
fibo.fib(1000)
fibo.fib2(100)
#寫法2
from fibo import fib, fib2
fib(500)
#寫法3  (最不建議)
from fibo import *
fib(500)

模組的收尋路徑

Python尋找某一模組 xxx.py 時,會依照 sys.path 所定義的路徑,依序搜尋 sys.path 定義的目錄列表如下:

  1. 當前目錄下尋找 xxx.py
  2. 由環境變數 PYTHONPATH 指定的目錄下尋找
  3. 由Python的安裝路徑

套件

當模組又成長出很多 .py 檔案,變成一個專案時,這時就需要使用套件 (package),將這些模組組織起來。 建立套件的方式,就是建立一個目錄,並且在目錄中放一個 init.py 檔案,此時Python就會自動將這個目錄視為套件。而目錄名稱就是套件名稱。

sound/                          Top-level package
      __init__.py               Initialize the sound package
      formats/                  Subpackage for file format conversions
              __init__.py
              wavread.py
              wavwrite.py
              aiffread.py
              aiffwrite.py
              auread.py
              auwrite.py
              ...
      effects/                  Subpackage for sound effects
              __init__.py
              echo.py
              surround.py
              reverse.py
              ...
      filters/                  Subpackage for filters
              __init__.py
              equalizer.py
              vocoder.py
              karaoke.py
              ...

使用方式如下

import sound.effects.echo
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)  #使用完整名稱

from sound.effects import echo
echo.echofilter(input, output, delay=0.7, atten=4)  #減少部分套件名稱

from sound.effects.echo import echofilter
echofilter(input, output, delay=0.7, atten=4)

若在套件中引用子套件的模組時,可以使用相對路徑,例如上述結構中 surround.py 可以使用下面方式

from . import echo
from .. import formats
from ..filters import equalizer

book

List 基礎

Python 的 list 資料結構非常實用,可以支援索引(index)與切片(slice) 在Python中可以使用一行指令就可以完成在c++的sub-string功能, 看到後感覺得學這個語言,可以讓你的人生省一半的時間。哈!

def list():
    squares1 = [1, 4, 9, 16, 25]
    print(squares1[0])  #索引

    print(squares1[-1])  #反向索引

    squares2 = squares1[-3:]  #切片並產生新的串列

    print(squares2)
    squares1 = squares1 + [36, 49, 64, 81, 100]  #串列連接, 串列是可變的

    print(squares1)
    squares1.append(22)  #使用append進行串列連接

    print(squares1)
    squares1[1:3] = [8, 8, 8]  #直接取代串列中某些元素

    print(squares1)
    squares1[1:3] = []  #移除串列中某些元素

    print(squares1)
    print(len(squares1))  #顯示串列長度

if __name__ == '__main__':
    list()

輸出 :

1
25
[9, 16, 25]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 22]
[1, 8, 8, 8, 16, 25, 36, 49, 64, 81, 100, 22]
[1, 8, 16, 25, 36, 49, 64, 81, 100, 22]
10

List 內建函數

List 也提供許多實用的 function , 可以參考下面範例

def list_func():
    squares = [1, 4, 9, 16, 25]
    squares.append(10)
    print(squares)
    squares[len(squares):] = [10]  #結果與上述寫法相同

    print(squares)
    squares.extend([10, 10, 10])
    print(squares)
    squares[len(squares):] = [10, 10, 10]  #結果與上述寫法相同

    print(squares)
    squares.insert(0, 22)  #插入22到第一個元素前

    print(squares)
    squares.remove(10)  #移除第一個找到內容為 10 的元素

    print(squares)
    squares.pop(0)  #移除第一個元素

    print(squares)
    squares.pop()
    print(squares)  #移除最後一個元素

    print(squares.index(10))  #回傳找到第一個內容為 10 的index

    print(squares.count(10))  #回傳 10 在串列中的次數

    squares.sort()  #將串列排序

    print(squares)
    squares.reverse()  #將串列反向排序

    print(squares)
    squares1 = squares.copy()
    print(squares1)
    squares2 = squares[:]  #結果與上述寫法相同

    print(squares2)
    squares1.clear()
    print(squares1)
    del squares2[:]  #結果與上述寫法相同

    print(squares2)


if __name__ == '__main__':
    list_func()

輸出 :

[1, 4, 9, 16, 25, 10]
[1, 4, 9, 16, 25, 10, 10]
[1, 4, 9, 16, 25, 10, 10, 10, 10, 10]
[1, 4, 9, 16, 25, 10, 10, 10, 10, 10, 10, 10, 10]
[22, 1, 4, 9, 16, 25, 10, 10, 10, 10, 10, 10, 10, 10]
[22, 1, 4, 9, 16, 25, 10, 10, 10, 10, 10, 10, 10]
[1, 4, 9, 16, 25, 10, 10, 10, 10, 10, 10, 10]
[1, 4, 9, 16, 25, 10, 10, 10, 10, 10, 10]
5
6
[1, 4, 9, 10, 10, 10, 10, 10, 10, 16, 25]
[25, 16, 10, 10, 10, 10, 10, 10, 9, 4, 1]
[25, 16, 10, 10, 10, 10, 10, 10, 9, 4, 1]
[25, 16, 10, 10, 10, 10, 10, 10, 9, 4, 1]
[]
[]

使用 List 模擬 Stack 資料結構

我們可以使用 List 模擬 Stack 的資料結構

def list_stack():
    stack = [3, 4, 5]
    stack.append(6)
    stack.append(7)
    print(stack)
    print(stack.pop())
    print(stack.pop())
    print(stack.pop())

if __name__ == '__main__':
    list_stack()

輸出 :

[3, 4, 5, 6, 7]
7
6
5

使用 List 模擬 Queue 資料結構

使用 List 並且搭配 collections.deque 模擬 Queue 的資料結構

from collections import deque
def list_deque():
    queue = deque(["Eric", "John", "Michael"])
    queue.append("Terry")
    queue.append("Graham")
    print(queue)
    print(queue.popleft())
    print(queue.popleft())
    print(queue)

if __name__ == '__main__':
    list_deque()

輸出 :

deque(['Eric', 'John', 'Michael', 'Terry', 'Graham'])
Eric
John
deque(['Michael', 'Terry', 'Graham'])

使用 List 推導式

List 提供兩種用方式,可以使用程式產生串列內容,範例如下 :

def list_gen1():
    squares = []
    for x in range(10):
        squares.append(x**2)
    print(squares)
    squares = [x**2 for x in range(10)]
    print(squares)

def list_gen2():
    squares = []
    for x in [1,2,3]:
       for y in [3,1,4]:
           if x != y:
               squares.append((x, y))
    print(squares)
    squares = [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
    print(squares)

if __name__ == '__main__':
    list_gen1()
    list_gen2()

輸出 :

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

使用 del 語句

del 語句可以刪除串列的某一個元素,或是透過切片的方式移除一群元素。

def list_del():
    a = [-1, 1, 66.25, 333, 333, 1234.5]
    del a[0]
    print(a)
    del a[2:4]
    print(a)
    del a[:]
    print(a)
    del a  #若呼叫 print(a) 或是參考 a 會產生錯誤

if __name__ == '__main__':
    list_del()

輸出 :

[1, 66.25, 333, 333, 1234.5]
[1, 66.25, 1234.5]
[]

Set 資料結構

Set (集合) 是一個 無序 並且 無重複元素 的資料結構,並且資源 union, intersection, difference等集合的數學運算。集合使用 { } 來創建

def set_test():
    basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
    print(basket)
    print('orange' in basket)
    print('crabgrass' in basket)
    a = set('abracadabra')
    b = set('alacazam')
    print(a)
    c = a - b  # 在a中在不再b中

    print(c)
    c = a | b  # 在a或b中

    print(c)
    c = a & b  #同時在a與b中

    print(c)
    c = a ^ b  #在a或b中,但是不同時存在a,b中

    print(c)

if __name__ == '__main__':
    set_test()

輸出 :

{'apple', 'orange', 'banana', 'pear'}
True
False
{'b', 'r', 'a', 'd', 'c'}
{'b', 'r', 'd'}
{'z', 'r', 'a', 'l', 'd', 'b', 'c', 'm'}
{'a', 'c'}
{'z', 'l', 'r', 'd', 'b', 'm'}

Dict 資料結構

Python 的 dict 其實就是C++中的 map , 所以一樣 key-value pair

def dict_test():
    tel = {'jack': 4098, 'sape': 4139}
    tel['guido'] = 4127
    print(tel)
    print(tel['jack'])
    del tel['sape']
    tel['irv'] = 4127
    print(tel)
    print(tel.keys())
    tel_sort = sorted(tel.keys())
    print(tel_sort)
    'guido' in tel
    'jack' not in tel

if __name__ == '__main__':
    dict_test()

輸出 :

{'jack': 4098, 'guido': 4127, 'sape': 4139}
4098
{'jack': 4098, 'guido': 4127, 'irv': 4127}
dict_keys(['jack', 'guido', 'irv'])
['guido', 'irv', 'jack']

book

第一部分 不用開口就讓全場驚豔

第一印象往往牢不可破

第一章、你該怎麼笑?

技巧1 : 潮水般的笑容

第二章、用眼睛告訴別人你有多聰明、多有見地

技巧2 : 雙眼黏TT

第三章、怎麼用眼神讓別人愛上你

技巧3 : 樹酯眼

第四章、如何不管到何處,看起來都像個大贏家

技巧4 : 咬緊牙關,撐住。

第五章、如何用赤子之心贏得人心

技巧5 : 嶄露赤子之心,每個人的內心深處都是個孩子,需要被注意,被關心

第六章:如何與人一見如故

技巧6 : 哈嚕老朋友,遇見新面孔,想像也是老朋友

第七章:如何得到別人百分之百的信任

技巧7 : 一動不如一靜,動來動去會讓人覺得你在說謊

第八章:如何看人能料事如神

技巧8 : 交談時一心二用,一方面自我表達,另一方面注意對方對你所說的內容,有甚麼反應。

第九章:你如何確保不錯過任何蛛絲馬跡

技巧9 : 在腦中進行實況模擬

第二部分:哈囉說完了,然後呢?

第十章:如何聊得起來,聊得開心

技巧10 : 開口前先試試水溫,聽聽對方說話的感覺,喘摩一下對方的心

第十一章:如何聽起來個性超級讚(不論你說什麼!)

技巧11 : 平凡的內容中,重點是熱情,不要抱怨,不禮貌,不舒服

第十二章:如何讓人想跟你聊天

技巧12 : 隨身帶著 “那是甚麼阿”

第十三章:如何想認識誰就認識誰

技巧13 : 那是誰阿

第十四章:如何打進小團體

技巧14 : 偷聽

第十五章:怎麼把「你老家在哪兒」變成一個超熱血的問題?

技巧15 : 來自哪裡多說幾句

第十六章:被問到「那你是做哪一行的?」如何完美落地?

技巧16 : 介紹自己不要乾乾地,多說一點,具體一點

第十七章:如何以主人之姿扮演潤滑劑

技巧17 : 介紹別人絕不吝嗇

第十八章:如何讓半腳進棺材的對談起死回生

技巧18 : 學作語言偵探

第十九章:如何用你選擇的話題迷倒眾生:聊對方就對了!

技巧19 : 把光打在對方身上

第二十章:如何不再擔心「我接下來要說什麼?」

技巧20 : 鸚鵡學語

第二十一章:如何讓人聊得欲罷不能(好讓你想走就走!)

技巧21 : 安可! 挑選說過的故事,讓他再說一次

第二十二章:怎麼讓人覺得你很陽光、很正面

技巧22 : 好事多說點,壞事當沒看見

第二十三章:怎麼樣才能永遠不缺有趣的話題

技巧23 : 最新的八卦,出門別忘了它

第三部分:如何說起話來像個VIP

第二十四章:如何不問,也能知道別人的職業

技巧24 : 不要說 “你事做甚麼的” ,要說 “你時間都怎麼安排”

第二十五章:被問到「你是做什麼的?」該如何回應?

技巧25 : 準備口頭簡歷

第二十六章:如何聽起來像個聰明人?

技巧26 : 建立個人字典

第二十七章:如何從容不迫,讓別人發現你跟他們是一夥的

技巧27 : 先讓別人說完,才說我也是

第二十八章:如何用「您先請」去贏得別人的尊敬與好感

技巧28 : 在對話中加入大量的 “你”

第二十九章:如何讓人覺得你不是對誰都笑

技巧29 : 專屬的笑容

第三十章:如何避免「狗嘴裡吐不出象牙」?

技巧30 : 沒事不要桶[爛比喻]這個馬蜂窩

第三十一章:如何師法激勵大師,讓自己講起話來虎虎生風

技巧31 : 常常讀書,讓自己變成時時都能出口成章

第三十二章:如何像大咖一樣談笑風生(有話直說才是強者風範)

技巧32 : 有話直說

第三十三章:如何避免天字第一號的大「突槌」

技巧33 : 沒事不要貧嘴亂逗人

第三十四章:如何當隻討人喜歡的烏鴉

技巧34 : 傳球要看方向,說話要看對象

第三十五章:不想回答,希望對方閉嘴的時候該如何回應

技巧35 : 變成跳針的唱片

第三十六章:遇到名人怎麼應對

技巧36 : 強者不會見人就流口水

第三十七章:怎麼讓人對你心存感激,讓人想要謝你

技巧37 : 一定要說清楚你在謝甚麼

第四部分:如何打進任何團體的核心

你至少要有足夠的知識起頭,專家才有辦法順著你的話講

第三十八章:不分男女,如何當個現代版的達文西(達文西再世)

技巧38 : 散打,每個月安排一件跳tone的事情體驗一下

第三十九章:如何聊起別人的工作或休閒,都完全狀況內,一副很懂的樣子

技巧39 : 學著聊工作,絕對不會錯

第四十章:如何摸清對方底細,把他們搞定(基本醫生對話)

技巧40 : 事先做功課,摸清對方的底細

第四十一章:如何神不知鬼不覺摸清對方背景

技巧41 : 拿專業雜誌進補

第四十二章:到了國外怎麼開口講話

技巧42 : 到別國出差旅行前,先了解當地民俗與禮儀習慣

第四十三章:如何不論買什麼,都能用說的得到好價錢

技巧43 : 口氣大一點,價格低一點

第五部分:怎麼讓人覺得跟你是一個模子出來的

哇,我們好像喔

第四十四章:如何讓人覺得你跟他們是「同梯的」

技巧44 : 有樣學樣,配合對方 [嬌揉造作] 或是 [不拘小節]

第四十五章:怎麼讓人覺得你跟他是一家人?

技巧45 : 回音: 聽對方講話,看對方習慣用語: 名詞,動詞,然後有樣學樣

第四十六章:如何把話真的說清楚

技巧46 : 用比喻帶出畫面,比喻就是要一針見血,要從對方的生活經驗或興趣出發

第四十七章:如何讓人覺得你懂(但不用說出「好、嗯哼、是喔」)

技巧47 : 用 [我懂你的意思,我可以體會,真期待,你這麼做是對的] 來取代哼哈二將

第四十八章:如何讓人覺得你的所見所聞與感受和他們一致

技巧48 : 看對方是視覺型的,就以眼還眼

第四十九章:如何讓人想的是我們,而不是你跟我

親疏遠近 : 第一階段:廢話, 第二階段:實話, 第三階段:我覺得怎樣你覺得怎樣, 第四階段:我們怎樣怎樣 技巧49 : 多用我們,先喊先贏

第五十章:如何用「你知我知」的笑點,讓友誼油然而生

技巧50 : 讓瞬間變永恆,在某個特定時間,與對方共同歡笑,產生共同愉快的記憶

第六部分:如何如智者般善用讚美,避免像蠢人獻媚

如果你的恭維不單純,或技巧太拙劣,對方對你的信任就可能遭受到永久性的損害

第五十一章:如何誇獎對方,但不會被誤會是在拍馬屁

技巧51 : 透過八卦消息,將恭維的話傳遞給當事人

第五十二章:如何當隻稱職的信鴿(喜鵲)

技巧52 : 不要當烏鴉講壞的八卦,要當好的喜鵲把別人的稱讚傳遞出去

第五十三章:怎麼讓你的欽慕之情「自然」流露

技巧53 : 有好話不直說,拐彎抹角

第五十四章:如何學習「便衣」,讚美人於無形之間

技巧54 : 當個讚美人的臥底,把美言透過正常的句子偷渡度到目標對象心理

第五十五章:怎麼一刀斃命,讓被誇獎的人永遠記得你

技巧55 : 一刀斃命: 觀察對方獨特的外貌或內涵,私下講,要有可信度,半年只講一次

第五十六章:如何耍點小手段讓對方笑著輕微暈船

技巧56 : 小小表示: 一些些表示,不錯喔,做得很好,你最棒了

第五十七章:如何掌握正確的讚美時機

技巧57 : 把誇獎人當成反射動作,有做好馬上讚美,有時可以睜眼說瞎話

第五十八章:如何讓別人樂於恭維你

技巧58 : 迴力鏢: 你人真好,謝謝你的關心,謝謝你的肯定

第五十九章:如何讓愛人覺得你可以託付終生

技巧59 : 把對方的肺腑之言(墓誌銘),原文照登

第七部分:如何一通電話,直撥對方心坎裡

第六十章:如何在電話裡展現熱情

技巧60 : 化手勢為文字,想像為廣播主持人,讓對方從語調文字感受到你的熱情

第六十一章:如何遠在天邊,但聽來近在眼前

技巧61 : 多在談話中叫對方的名字

第六十二章:怎麼讓他們覺得打電話給你,值回票價

技巧62 : 先專業的報出自己的姓名,依照打電話的人決定是否展是笑臉

第六十三章:如何面對攔路虎,順利闖關

技巧63 : 過濾電話的藝術

第六十四章:如何在跟大人物講電話的時候,打出漂亮的伸手牌

技巧64 : 把秘書搞定,把夫人搞定

第六十五章:怎麼心想事成,要什麼來什麼──時機的掌控!

技巧65 : 了解對方作息紅綠燈,隨時先問現在是否方便說話

第六十六章:怎麼用語音留言留下漂亮的身影與印象

技巧66 : 讓流言日新又新

第六十七章:怎麼讓人回電給你

技巧67 : 十秒鐘的試鏡

第六十八章:如何讓把關者覺得你跟老闆已經是麻吉了

技巧68 : 隨口說出我是包柏,他在嗎?

第六十九章:如何讓人肯定你的貼心

技巧69 : 聽到背景聲音有變化(電話,小孩哭),就要打住問是否要先去忙

第七十章:電話裡如何聽出話中有話

技巧70 : 電話錄音,原音重現

第八部分:如何縱橫會場,就像政客左右逢源

技巧 : 進入記者模式,問人事時地物? 問為何如何?

第七十一章:如何避免在派對上搞烏龍

技巧71 : 食物與社交不可兼得

第七十二章:怎麼進場進得像在走星光大道

技巧72 : 在門口停一下,看了再上

第七十三章:如何想認識誰,就認識誰

技巧73 : 不要等人來找你,你要主動探索每個臉孔,然後想辦法點燃火花

第七十四章:派對上,如何讓人不知不覺被你吸引過來

技巧74 : 站姿開放,手不抱胸

第七十五章:如何讓人覺得自己像是個電影明星

技巧75 : 為了讓對方有巨星的感覺,強者會把對方提過的事情,記在腦裡,像追星一樣

第七十六章:怎麼用你記得的事情讓對方大吃一驚

技巧76 : 名片櫃,記得對方狀態,說過的話

第七十七章:如何用眼球把東西賣掉

技巧77 : 先知道誰可以做決定,針對他,如果頭上下晃,就省下後話馬上簽約,如果左右搖就不妙了

第九部分:如何打破最難打破的玻璃天花板

第七十八章:如何睜一隻眼,閉一隻眼,讓人感受你的體貼

技巧78 : 你不在意,也不怪他,你只想繼續跟他說話

第七十九章:如何解救對方於語塞之際,贏得對方的心

技巧79 : 我們繼續聽剛剛的故事

第八十章:怎麼讓人知道「這對我有什麼好處?」

技巧80 : 期望得到與付出,一次說清楚

第八十一章:怎麼讓人想要幫你的忙

技巧81 : 給好心人一點空間與時間,讓他能在付出之前,細細品味樂於助人的快樂

第八十二章:如何正確開口,得到你需要的協助

技巧82 : 不要很快的要求對方兌現他欠你人情

第八十三章:怎麼知道派對上什麼話不能說

技巧83 : 派對上可以亂講話,只要別講實話

第八十四章:怎麼知道吃飯時什麼話不能說

技巧84 : 吃飯就是要好好吃飯

第八十五章:怎麼知道巧遇時什麼話不能說

技巧85 : 巧遇就是要隨意,說話不要太刻意,養成替別人創造避風港的習慣

第八十六章:如何讓人準備好聽你說話

技巧86 : 如果你需要問出資訊,記得先讓人把他想說的話都說完,都發洩完情緒才有辦法聽你說話

第八十七章:如何不出三句話,讓憤怒獲得扭轉

技巧87 : 先聽他們說話,與他們在同一陣線

第八十八章:如何讓人即便你搞砸了,還是喜歡你

技巧88 : 隨你拿,一定要讓苦主 “物超所值”

第八十九章:如何困住對方但又不失格調

技巧89 : 留線生機

第九十章:如何面對服務人員能夠予取予求

技巧90 : 跟他的老闆,讚美他

第九十一章:想當領頭羊,不想當跟屁蟲,該怎麼辦

技巧91 : 領頭鼓掌,給台上人鼓勵

第九十二章:如何能怎麼做,怎麼對

技巧92 : 舉頭三尺有記分板,衡量自己與對方的分數各為多少


book

定義函式

在 Python 中可以使用, def 在 function 定義中的第一行,可以針對這個函式進行說明與註解。 稱為 docstring ,日後可以透過工具擷取說明內容,產生API開發手冊,這是很好的方式。 非常適合不喜歡寫文件的工程師,只要改code的同時順便修改一下說明,手冊就會一倂更新。 之前使用C++開發軟體也是常常配合使用 Doxygen function 的輸入參數是使用 call by value 機制,所以 function 內部會將輸入參數 copy 一份。

def fib(n):
    """ 印出 n 個費式數列."""
    a = 0
    b = 1
    while a < n:
        print(a)
        a = b
        b += a

if __name__ == '__main__': 
    f = fib  # 將 fib 函式重新命名為 f

    f(100)
    print(fib(100))

輸出:

0
1
2
4
8
16
32
64
None

另外,function 一定會回傳值,在 function 中沒有 return xxx 時,python 會自動回傳 None 也可以透過 list 回傳一組結果

def fib2(n):
    """ 回傳一組資料,並將結果存在一個 list 資料結構中."""
    result = []
    a = 0
    b = 1
    while a < n:
        result.append(a)
        a = b
        b += a
    return result

if __name__ == '__main__':
    data = fib2(100)
    print(data)

輸出:

[0, 1, 2, 4, 8, 16, 32, 64]

函式進階 — 預設參數

Python 的輸入參數可以有三種形式,分別是

  • 預設參數
  • 關鍵字參數
  • 可變參數列表 第一種形式,可以透過預設參數型式,將參數給與預設值。 ```python def fib3(n = 200): “”” 回傳一組資料,並將結果存在一個 list 資料結構中.””” result = [] a = 0 b = 1 while a < n: result.append(a) a = b b += a return result

if name == ‘main’: data = fib3() print(data)

輸出 :
```python
[0, 1, 2, 4, 8, 16, 32, 64, 128]

重點提示: function 的預設值,只會被設定一次。如下範例:

def fib4(a, L=[]):
    L.append(a)
    return L
if __name__ == '__main__':
    print(fib4(1))
    print(fib4(2))
    print(fib4(3))

輸出 :

[1]
[1, 2]
[1, 2, 3]

函式進階 — 關鍵字參數

function 參數的位置順序若需要不固定,則可以使用 關鍵字參數 型式

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
    print("-- This parrot wouldn't", action, end=' ')
    print("if you put", voltage, "volts through it.")
    print("-- Lovely plumage, the", type)
    print("-- It's", state, "!")

if __name__ == '__main__':
    parrot(1000)                                          # 1 positional argument

        parrot(voltage=1000)                                  # 1 keyword argument

        parrot(voltage=1000000, action='VOOOOOM')             # 2 keyword arguments

        parrot(action='VOOOOOM', voltage=1000000)             # 2 keyword arguments

        parrot('a million', 'bereft of life', 'jump')         # 3 positional arguments

        parrot('a thousand', state='pushing up the daisies')  # 1 positional, 1 keyword

函式進階 — 可變參數列表

function 若需要傳入不固定參數,例如 C 語言中的 printf,則可以使用 可變參數列表 型式

def concat(*args, sep="/"):
    return sep.join(args)

if __name__ == '__main__':
    print(concat("earth", "mars", "venus"))
    print(concat("earth", "mars", "venus", sep="."))

輸出 :

earth/mars/venus
earth.mars.venus

函式進階 — 輸入參數列表或是字典

function 允許輸入一個list,並且透過 * 將輸入參數拆解,例如 parrot(listdata)* 也可以輸入一個dic,並且透過 ** 將輸入參數拆解

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
    print("-- This parrot wouldn't", action, end=' ')
    print("if you put", voltage, "volts through it.")
    print("-- Lovely plumage, the", type)
    print("-- It's", state, "!")

if __name__ == '__main__':
    list_data = ["four million", "bleedin' demised", "VOOM"]
    dic_data = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
    parrot(*list_data)
    parrot(**dic_data)

輸出 :

-- This parrot wouldn't VOOM if you put four million volts through it.

-- Lovely plumage, the Norwegian Blue

-- It's bleedin' demised !

-- This parrot wouldn't VOOM if you put four million volts through it.
-- Lovely plumage, the Norwegian Blue
-- It's bleedin' demised !

book

第一章 學會這些,讓你的好感度立刻提升!

1. 三秒瞬間讀人術

美國隊長型

  • 特質:果決明快、領導型的人,比較英雄主義,很喜歡出鋒頭。
  • 缺點:太重視事而非人。
  • 相處方式:喜歡果決明快的說話方式,比較喜歡談論賺錢的話題,對談盡量簡單果決、切中主題。
  • 地雷引爆點:不能硬來,這類型的人吃軟不吃硬;另外,跟賺錢無關的事情也請少煩他們。美國隊長討厭被人家誤會,也討厭人家在背地裡搞小動作,因為對他們而言,什麼事都能開誠布公的講。

    鋼鐵人型

  • 特質:衝刺瘋狂型的人,喜歡新奇,有些瘋癲,有無限的想像力。
  • 缺點:感覺對了就衝了。
  • 相處方式:因為喜歡讚美、注目或是新奇好玩的事情,可以先觀察他身上的配件讚美,或是找出共同相似的地方拉近距離。
  • 地雷引爆點:鋼鐵人同樣也是吃軟不吃硬,但跟美國隊長不一樣,這裡的「軟」只要表示關心、讚美就行了。

    綠巨人浩克型

  • 特質:溫熱型,不生氣時都是溫和的大好人;生氣的頻率很低,但是一生起氣來,就十分的可怕。
  • 缺點:太重視人而非事情本身。
  • 相處方式:千萬別讓他有壓迫感,盡量放慢說話速度,讓他有安全感。
  • 地雷引爆點:綠巨人浩克軟硬兼吃。硬一點,他們會屈服;軟一點,也會因為對方可憐而屈服,但是千萬不要對他們太兇,因為兇到他們無法接受時,就會物極必反,不過基本上他們大部分時間都會像日本那個苦命的阿信一樣,默默的生活。

    弓箭手鷹眼型

  • 特質:品質保證,連歪個幾公分都要修正;數字邏輯很好,什麼都要斤斤計較;總是想很多,所以可以規避掉風險。
  • 缺點:想太多、沒有行動力,機會常常在害怕中度過。
  • 相處方式:不喜歡被別人觸碰身體,忌阿諛諂媚和誇大的談論,盡量對他實事求是、進退得宜。
  • 地雷引爆點:不吃軟也不吃硬,只吃道理。邏輯要對、數字要清楚,這樣就行了。弓箭手鷹眼認為掌握機會可能也因此掌握到誤會,所以他們會謹慎的希望自己不要踩到任何地雷,但這也表示這類型人的人生很可能不會大富大貴。 每個人都是混合兩種特質!

    2. 認識人了解人你就無所不能

    把優點集合起來,互相做喜歡的事。 放大各自的優點,互補其中。 善用人格特質,每個人都是重要的。 一個團隊最好的人格特質組合: 對外公關: 鋼鐵人 + 綠巨人浩克 幕前工作: 美國隊長 + 鋼鐵人 or 美國隊長 + 弓箭手鷹眼 幕後行政: 綠巨人浩克 + 弓箭手鷹眼 服務窗口: 鋼鐵人 + 綠巨人浩克 or 綠巨人浩克 + 弓箭手鷹眼

    3. 機會是給準備好的人

    切記無知的代價更大。 先做好準備,以應付未來所需。

    4. 禮多人不怪,有禮就有財

    一點禮貌就能為人生贏一半。 不變的禮儀,能加深對方的好印象。 對服務業態度也不能太無理。 苛刻對人,阻礙未來的前途。

    5. 正面陽光的迎接每一天

    謝謝指教,正面過人生。 成為一個正直,又祝福別人的人。 忌妒的惡魔會讓你忘了自己。 不要用自以為的正義去評論事情。

    6. 資訊的落差就是財富的落差

第二章 開始串連,經營人脈就是這麼簡單有趣!

1. 1個人等於1個人脈庫

在活動中尋找想結交的朋友。 玩樂上尋找特質相像的人,事業上尋找互補的人。加 Line, FB 約出來聊天。

2. 新朋友帶來新的際緣

3. 網路上的陌生人是我的貴人

因為關島投資機會認識,就只是想先交朋友。 臉書是你在網路世界的門面。

4. 醫生是很特別的族群

終於得到信任,得到溫馨的回饋。 魚幫水水幫魚,人都是互相的。

5. 1到100人的人脈串連小撇步

串連人脈,建立自己的聲望流。 你要常常讓朋友知道你的專長與特殊能力。 少數人的串連法: 午餐的約會。 跟有附加價值的人交朋友。 50人的串連法: 大家來參加有興趣的講座。 100人的串連法: 舉辦大家最想知道的資訊活動。 經營人脈靠積極與有心。 最簡單的串連法: Line / FB 群組。

第三章 就是要三贏,你好我好大家都好!

1. 為什麼要三贏而不是我一個人贏?

一個人力量有限,每個人專長不同。 只要跟一個認識50個房仲的投資客做朋友,便可以像是親自認識50個房仲。 金錢與時間的報酬都要顧慮到。 凡事都自己來自己賺,划得來嗎? 專業的東西,交給專家做。 借力使力,豐盛的交換是重要的。 利用人脈資源輕鬆來達到三贏。

2. 無中生有,沒資金也能創造三贏

用自己的能力去交換所需。 一份企劃案,換來房屋的頭期款。 有計畫經營人脈,創造多贏。

3. 人脈的正面循環,有錢大家賺

原來有錢人都是這樣賺錢的。 舉手之勞,換來豐盛的投資機會。 讓眾人歡喜的正面循環。 從真誠的小事來讓朋友記得你。

4. 友誼萬歲!出外靠朋友的美國房地產

5. 豐盛的交換,讓大家都美好的過日子

第四章 對人脈串連心動了嗎?看完這一章再開始!

1. 創造在朋友心中的價值

細心觀察所需就是機會。H先生在Line群組知道消息後,搶先預購新書。 豐盛的交換不一定要用金錢。資訊是有價值的。 窩心的小事讓人感受良多。 誠意的對待換來真心的未來。

2. 去哪裡找想認識與值得交往的朋友

扭轉人脈結構,結交比自己更優秀的朋友。 你挑別人,別人也挑你。 誰是你值得交往的? 年齡,職業,應對進退,守時觀念,講話是否正面,有沒有禮貌,互動的誠意。 FB, line,不要抱怨,負面的人。 你是否是人家值得交往的? 守時,禮貌,正面開放的言詞 注意自我介紹。 不要誤踩地雷,輕鬆踏出友誼的第一步。

3. 找個志同道合的富朋友

交一個比自己有錢的朋友。高於你收入2~3倍的朋友。 如何在眾人之中瞧見有錢人: 正面言詞,謙虛,話題與錢有關,賺錢機會,身上配件。 學習有錢人的成功優點: 具行動力,[我預備,我瞄準,我開槍],喜歡挑戰。 有錢人不喜歡這些人: 說人閒話,批評謾罵,負面思考。只懂收穫不懂付出的人。

4. 認識一個對你「有用」的朋友

當你冒險時必須設定一個可接受的範圍。

5. 撥出一筆固定的人脈費用

決定花出去錢,最後回來的方式: 禮物,聚餐費用。撥出薪水的5%。 想擴展新的人脈層面,就去參加課程。

第五章 弄懂這些小問題,經營人脈就能借力使力!

1. 人脈的界線,偽君子和大頭症

期許自己是個謹慎有禮的好人。 學者有肚量去承受指教。 一盆水+墨汁 與 大海+墨汁。

2. 人生中重要卻不緊急的事一定要先處理

退休金,人脈經營。 固定花時間聯繫,會在對方心中創造很大價值。 老年的品質保障,退休養老金必須提前做。

3. 要幫需要幫的人還是值得幫的人

從小小互動看出誰值得幫。 照顧值得幫的人,會加倍奉還。

4. 家人是永遠不變的人脈

5. 幸福就是把握當下的美好


book

接下來介紹 Python 對於程式流程的控制邏輯,基本上與一般 C/Java 語言類似,主要需要注意的是 Python 並沒有左右括號,所以都是用 縮排 (Tab) 來判斷一個語句段落,若縮排沒有一致就會發生錯誤。 自己之前用Notepad++來撰寫Python時常發生縮排的錯誤 (用空格,而不是用Tab產生縮排)。 因此寫Python建議需要搭配IDE,幫忙避免這類的錯誤。

雖然一開始覺得很麻煩,可是看到乾淨整齊的程式,就覺得Python設計者真的很有遠見,透過這個規則,讓所有Python程式都能有一致的撰寫風格,看其他人寫的程式也不會感覺怪怪的。(C++語言光是大括號每個人的風格都不一樣)

if 語句

x = 1
if x < 0:
    x = 0
    print('Negative changed to zero')
elif x == 0:
    print('Zero')
elif x == 1:
    print('Single')
else:
    print('More')

輸出 :

"Single"

for 語句

for語句與C語言的for迴圈不同,C語言的for迴圈可以設定起始值(位置),每次迴圈的間隔值。 但是Python是依照序列的順序逐步執行。比較像 C# 的foreach語句

words = ['cat', 'window', 'defenestrate']
for w in words:
    print(w, len(w))
for i in range(3):
    print(i)

輸出 :

cat 3
window 6
defenestrate 12
0
1
2

break / continue / else 語句

break 與 continue 主要配合 for 與 while 語句 而 else 應用在 for 與 while 迴圈中,代表的意義是若迴圈沒有被中斷,則會執行else的段落

for n in range(2, 10):
    for x in range(2, n):
        if n % x == 0:
            print(n, 'equals', x, '*', n//x)
            break
    else:
        print(n, 'is a prime number')

輸出 :

2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

pass 語句

直接跳過沒有執行任何程式,通常使用在創建一個最小的class,不過目前我還是不太清楚使用時機。 等之後看到不錯的範例程式再補充。

# 持續等待 (Ctrl+C) 按鍵

while True:
    pass

# 創建一個最小的class

class MyEmptyClass:
    pass

book

前言

雖然接觸 Python 也有2年的時間,但是學習都是斷斷續續,目標都是讓專案可以運作,並沒有真正去了解這個語言,所以這個比較主要是紀錄,重新學習 Python 的練習範例心得。

工具

因為目前還是用 Windows 平台,所以找了一個蠻多人推薦的 IDE 工具 PyCharm 直接安裝就可以使用,非常方便。

教科書

由於是重新學習,所以希望能先找一本免費而且經典的讀物,所以選擇了 The Python Tutorial 當作學習的框架。

Python 特色

相較 C/C++ 語言,Python 可以像 Shell Script 容易使用,同時又提供完整的程式結構

  • Python 內建了許多好用的資料結構類型,例如List, Dict 等
  • Python 的模組功能,可以方便組織大型系統,讓它更有結構化與重複利用的能力
  • Python 與 C 語言結合的很棒 ( 這部分在我之前的許多專案,應用的很頻繁,常常是需要Python與C++ DLL做整合 )

Python 簡介

Python 使用 # 當作註解,例如:

# this is the first comment

spam = 1  # and this is the second comment

數字系統中,使用簡單的運算符號,進行計,例如:

2 + 2             # = 4

50 - 5 * 6        # = 20

(50-5*6)/4        # = 5.0

8 / 5             # = 1.6 除法永遠返回 float 型態

7.0 / 2           # = 3.5 integer 與 float 混合計算,會強制轉為 float 型態

17 // 3           # = 5  使用 // 可以返回整數結果,併捨取小數點部分

17 % 3            # = 2  取餘數

5 ** 2            # = 25 等於5^2

2 ** 7            # = 128 等於 2^7

width = 20        # 設值給變數

height            # error 變數都需要預設值

3+5j              # 表示複數

字串系統,Python 提供 [單引號] 或是 [雙引號] 來表示字串,可能寫C++習慣了,我比較喜歡用雙引號的方式,

'spam eggs'
'doesn\'t'              # 使用 \' 代表單引號...

"doesn't"               # 若使用雙引號,則裡面可以直接加上單引號

"\"Yes,\" he said."     # 若使用雙引號,則需使用 \" 代表字串中的雙引號.

print('C:\some\name')   # 在這範例 \n 代表,新一行,所以輸出 C:\some

print(r'C:\some\name')  # 在這範例 \n 代表字元 n ,所以輸出 C:\some\name

print("""\              # 使用 """ 並配合 \ 可以組成多行的字串
Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to
""")
3 * 'un' + 'ium'       # = 'unununium' (3 times 'un', followed by 'ium')
'Py' 'thon'            # 'Python'
word = 'Python'        
word[0]                # = 'p' (character in position 0)
word[-1]               # = 'n' (last character)
word[0:2]              # = 'Py' (characters from position 0 (included) to 2 (excluded))
word[:2]               # = 'Py' (character from the beginning to position 2 (excluded))

值得注意的是,在Python中字串是 [唯獨] 的,所以不能重新給值,比需使用創建的方式

word = 'Python'  
word[0] = 'J'          # TypeError:

'J' + word[1:]         # = 'Jython'

len(word)