標籤: USB CONNECTOR

  • 花一天時間試玩vsphere6.7(EXSI)服務器版的vmware

    花一天時間試玩vsphere6.7(EXSI)服務器版的vmware

    花一天時間試玩vsphere6.7(EXSI)服務器版的vmware

    要註冊賬號(2019年11月14註冊):

    登陸網址:https://my.vmware.com/cn/group/vmware/home
    賬號:haha@grr.la
    密碼:0nV+SJ8fZbdE8g==

    看了下。不管是標準版,企業版,測試版的6.7下載的軟件包都是同一個,區別應該在於激活密鑰

    主要有兩個鏡像:EXXI鏡像,VCenter鏡像

    EXSI和VMware有點像,不過可以直接裝在裸機上,Vcenter需要裝在windows server上,管理EXSI平台

    鏈接:https://pan.baidu.com/s/1x8K4dnMdhg7uz11Hyi7v2A
    提取碼:tqaw

    VMware vSphere 6 Enterprise Plus
    0A65P-00HD0-3Z5M1-M097M-22P7H

    參考文檔:https://pan.baidu.com/s/18Cq9marptM-Rbym9l7RvtQ

    這個是新的文檔:https://www.lanzous.com/i7ewj1i

    上面如果失效:https://blog.csdn.net/techgroup/article/details/100053477

    一、安裝EXSI參考:https://blog.csdn.net/weixin_42758707/article/details/100525596

    需要注意的地方:不需要DHCP服務器,路由器分配IP就行,ip最好設置為固定IP,可以開啟ssh

    填寫密鑰的地方:

    開啟ssh后可以使用ssh登陸

    二、創建虛擬機根vmware一樣,要先上傳鏡像再創建,可以創建Linux,MacOS,windows

    也可以從ovf導入

    三、其他功能

    支持虛擬機資源監控,克隆虛擬機,建立快照,導出為模版等功能

    支持用VMware連ESXI平台(CTRL+L),連接之後可以創建或刪除虛擬機,還可以對虛擬機開關機

    四、VMware vSphere Client6.0(看樣子官方不再長期支持了)

    https://yq.aliyun.com/articles/636965

    https://wsgzao.github.io/post/vmware-vsphere-client/

    五、解決ssh無法密碼登陸的問題(提示密鑰登陸)

    CTRL+ALT+F1進入命令行,修改/etc/ssh/sshd_config 重啟services.sh

    [root@localhost:~] vi /etc/ssh/sshd_config 
    [root@localhost:~] grep PasswordAuth /etc/ssh/sshd_config
    PasswordAuthentication yes
    [root@localhost:~] services.sh restart

    六、安裝vcenter

    安裝到windows server2016中,應該還有其他辦法

    安裝文檔:https://www.lanzous.com/i7eh24j

    安裝很簡單,整個安裝過程比較慢,可能要半個小時甚至更長

    牛逼,8G,不搞了

    換了個電腦,繼續實驗

    七、vcenter管理ESXI

    vcenter地址:vcenter.jd.com(172.18.3.252)

    exsi1地址:172.18.3.151

    exsi2地址:172.18.3.255

    步驟:先創建數據中心,然後數據中心中添加主機(exsi節點)

    管理參考:https://www.cnblogs.com/djlsunshine/p/11372482.html

    新建數據中心:

    添加主機(添加exsi節點)

    設置是否啟用鎖定模式,如果啟用了鎖定模式,管理員就不能夠使用vSphere客戶端直接登錄到ESXI主機,只能通過vCenter Server對主機進行管理。在這裏不啟用鎖定模式

    激活參考:https://www.lanzous.com/i7eikla

    激活碼複製粘貼全部導入了。一個機器一個激活碼:https://blog.csdn.net/lizhiyuan_eagle/article/details/79989216

    然後就可以看到exsi中的虛擬機:

    遇到的小問題,我克隆的第一個exsi變成第二個exsi,被識別數來了,只能再裝一台:

    vcenter同樣支持管理虛擬機,連接虛擬機

    八、遷移exsi1的虛擬機到exsi2

    冷遷移,直接遷

    取消掛載cdrom再遷移

    熱遷移,要添加虛擬交換機在每個exsi網絡上

    主機—配置—虛擬交換機—添加網絡:

    exsi2一樣,添加個虛擬交換機,ip不能一樣

    然後就可以遷移了

    整個遷移過程網絡沒有丟包,ssh也沒有中斷

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
    【其他文章推薦】

    ※帶您來了解什麼是 USB CONNECTOR  ?

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

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

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

    ※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

  • spring 是如何注入對象的和bean 創建過程分析

    文章目錄:

    1. 【本文】spring 是如何注入對象的

    首先需要知道一個大致實現

    • 這個注入過程肯定是在 BeanPostProcessor 中實現的

    • spring 是在 beanFactory.getBean 進行 bean 實例化的,即懶加載

    • 根據第二條,也就是說在 getBean 的時候才會去調用所有 BeanPostProcessor

    • 第二篇文章說到,BeanFactory 的 refresh 過程只是註冊 BeanPostProcessor,真正執行在 getBean 方法中

    • MergedBeanDefinitionPostProcessor 也是一種 BeanPostProcessor 它重新弄了個一個生命周期函數,替代了 BeanPostProcessor 默認的生命周期函數,這麼看吧,我貼一小段源碼

      for (BeanPostProcessor bp : getBeanPostProcessors()) {
          if (bp instanceof MergedBeanDefinitionPostProcessor) {
              MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;
              bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);
          }
      }

      它允許你在非 BeanFactoryProcess 中去修改 Bean 定義

    • InstantiationAwareBeanPostProcessor 也是一種 BeanPostProcessor 它也重新定義了一個生命周期函數,它允許把屬性值注入到屬性對象中

    @Autowired 加載定義的過程

    我們先不看 bean 的創建過程,就看 MergedBeanDefinitionPostProcessor 的實現子類,這裏看名字猜測 AutowiredAnnotationBeanPostProcessor 應該就是干這件事的,所以我們接下來可以直接看 AutowiredAnnotationBeanPostProcessor 的 postProcessMergedBeanDefinition 方法的代碼。

    順着方法的調用,可以知道在 buildAutowiringMetadata 是真正查找這些註解的地方,最後 checkConfigMembersMember 註冊進了 bean 定義,具體如何查找的讀者自行查看源碼。

    這裏只是將 Member 註冊進了 bean 定義,真正實例化在填充 Bean 的過程中,下面說到 bean 的創建過程可以知道是何時注入的。

    Bean 的創建過程

    前面說到 spring 是在 getBean 的過程中進行 Bean 創建的,創建 bean 分為幾個步驟

    1. 獲取 bean 定義
    2. new Bean()
    3. 執行生命周期函數 (前)
    4. 創建依賴項
    5. 填充 bean
    6. 執行生命周期函數(后)

    入口為 BeanFactory.getBean ,BeanFactory 的實現類為 DefaultListableBeanFactory 這些你可以在 BeanFactory 的 refresh 過程中找到

    根據源碼,如果 bean 還不存在時,就會執行 bean 的創建流程

    獲取 bean 定義在這段源碼中

    final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);

    緊跟着,根據 Bean 定義搜索其依賴項,並創建 bean ,可以看出是遞歸創建 bean

    String[] dependsOn = mbd.getDependsOn();
    for (String dep : dependsOn) {
        getBean(dep);
    }

    然後就創建 bean 了

    if (mbd.isSingleton()) {
        createBean(beanName, mbd, args);
    }
    
    // 真正的執行在 doCreateBean 過程中
    Object beanInstance = doCreateBean(beanName, mbdToUse, args);

    創建 bean 第一步 new Bean

    if (instanceWrapper == null) {
        instanceWrapper = createBeanInstance(beanName, mbd, args);
    }

    創建 bean 第二步,執行所有的 processor ,包含 MergedBeanDefinitionPostProcessor ,所以在這一步註冊注入選項

    applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);

    創建 bean 第三步,填充 bean ,這裏做的 @Autowired 注入

    populateBean(beanName, mbd, instanceWrapper);

    最終的處理過程在 AutowiredAnnotationBeanPostProcessor 的 postProcessPropertyValues 函數中

    metadata.inject(bean, beanName, pvs);

    因為在前面已經獲取過依賴項,並且把其丟進了容器,所以這裡是直接用反射寫進去就可以了

    創建 bean 第四步,初始化 bean ,這裡有一個方法注入,方法注入原來發生在初始化 bean 過程中,還有就是生命周期函數執行了,包含 BeanPostProcessor 的前置後置生命周期,初始化方法等

    小說明 :AutowiredAnnotationBeanPostProcessor 即是 一個 MergedBeanDefinitionPostProcessor 也是一個 InstantiationAwareBeanPostProcessor

    一點小推廣

    創作不易,希望可以支持下我的開源軟件,及我的小工具,歡迎來 gitee 點星,fork ,提 bug 。

    Excel 通用導入導出,支持 Excel 公式
    博客地址:
    gitee:

    使用模板代碼 ,從數據庫生成代碼 ,及一些項目中經常可以用到的小工具
    博客地址:
    gitee:

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

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • ES6學習筆記01 — 暫時性死區 ( temporal dead zone )

    參考文檔:   

           

           

    注:文中代碼僅作示意,複製運行時需要適當調整

      
    ES6 規定,如果代碼區塊中存在 let  const 命令聲明的變量,這個區塊對這些變量從一開始就形成了封閉作用域,直到聲明語句完成,這些變量才能被訪問(獲取或設置),否則會報錯ReferenceError。這在語法上稱為“暫時性死區”(英temporal dead zone,簡 TDZ),即代碼塊開始到變量聲明語句完成之間的區域。
      通過 var 聲明的變量擁有變量提升、沒有暫時性死區,作用於函數作用域:

      • 當進入變量的作用域(包圍它的函數),立即為它創建(綁定)存儲空間,立即被初始化並被賦值為 undefined   
      • 當執行到變量的聲明語句時,如果變量定義了值則會被賦值
        (function fn() {  //函數作用域開始
            console.log(temp)  //undefined
            //聲明
            var temp 
            console.log(temp)  //undefined
            //賦值
            temp = 123
            console.log(temp)  //123
        })()
        //在函數作用域外訪問
        console.log(temp)  //ReferenceError: temp is not defined

     

      通過 let 聲明的變量沒有變量提升、擁有暫時性死區,作用於塊級作用域:

      • 當進入變量的作用域(包圍它的語法塊),立即為它創建(綁定)存儲空間,不會立即初始化,也不會被賦值
      • 訪問(獲取或設置)該變量會拋出異常 ReferenceError
      • 當執行到變量的聲明語句時,如果變量定義了值則會被賦值,如果變量沒有定義值,則被賦值為undefined
            {  //函數作用域開始,TDZ開始
                console.log(temp)  //ReferenceError: temp is not defined
                //聲明
                let temp  
                console.log(temp)  //ReferenceError: Cannot access 'temp' before initialization
                //賦值
                temp = 345  //TDZ結束
                console.log(temp)  //345
                //塊級作用域結束
            }
            //在塊級作用域外訪問
            console.log(temp)  //ReferenceError: temp is not defined

     

      通過 const 聲明的常量,需要在定義的時候就賦值,並且之後不能改變,暫時性死區與 let 類似。

            {   //作用域開始,TDZ開始
                console.log(temp)  //ReferenceError: temp is not defined
                //聲明並賦值
                const temp = 789  //TDZ結束
                console.log(temp)  //789 
                //給常量賦值
                temp = 987  //TypeError: Assignment to constant variable
                //作用域結束
            }   
            //在作用域外訪問
            console.log(temp)  //ReferenceError: temp is not defined

     

      
    一句話總結:在塊級作用域中, let  const 聲明的變量、常量在聲明語句執行完成之前不能訪問(包括聲明語句本身)
      另外,容易因為 暫時性死區 而出錯的細節代碼在此不展開舉例,參考文檔中有詳情舉例。  
      附:第一次寫學習筆記,寫隨筆花費的時間比學習相關內容的時間還要長,感覺有點本末倒置,不過以後回頭看應該會覺得有所值得吧!  

      

      

     

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

    【其他文章推薦】

    USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

    ※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

    ※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

    ※評比南投搬家公司費用收費行情懶人包大公開

  • 特斯拉:兩年後你的車就能「自己」來找你

    特斯拉於上週六(9日)發佈了最新車載作業系統Version 7.1,此次升級對自動駕駛儀的多款主要功能進行了升級。最重要的就是「召喚」功能,即在無需司機駕駛的情況下,汽車可以自主進入或退出停車位或車庫。

    特斯拉的軟體升級是在2016年CES消費電子展之後進行的,今年展會上自動駕駛汽車和更先進的車載軟體成為汽車製造商中的兩大熱門主題。馬斯克(Elon Musk)認為,從技術上看,自動駕駛汽車將在未來24個月到36個月之間準備就緒。

    至於當前的「召喚」功能,其所能執行的任務還相當有限。馬斯克稱當前的反覆運算更像是遙控功能,而非自動駕駛功能。當前的「召喚」功能要求司機與汽車距離不超過10米。在使用這個功能時,司機需要持續監控和維持對汽車的控制。此外,特斯拉要求司機只能在地形平坦的私人停車位使用「召喚」功能。

    與此同時,Version 7.1最新升級還可讓特斯拉電動汽車自我泊車,無論是在平行還是垂直位置。特斯拉自動駕駛儀的自動引導功能也增加了更多限制,比如在居民區或沒有中央分隔線的公路上,速度更慢。而在其他公路上,自動引導功能也將車速限制為時速8公里或10公里以內。馬斯克表示,為了保證汽車安全行駛,這些新的限制完全合理。

    此外,特斯拉還添加了新的安全功能,比如曲線速度自我調整功能,汽車可以掃描前面公路上的曲線,自動駕駛儀可根據所得資訊自動調整速度。

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※帶您來了解什麼是 USB CONNECTOR  ?

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

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

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

    ※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

  • 《中國電動汽車標準化工作線圖》將於近日發佈

    1月11日,《中國電動汽車標準化工作路線圖》評審會在北京召開。《路線圖》由中國汽車技術研究中心等單位聯合制定,將於近日發佈。

    路線圖的定位

    本版路線圖的起止階段為2015年至2025年,通過對2015年至2025年電動汽車及其相關產業的技術發展、產業化和市場化發展的判斷和預測,制定2015年至2025年中國電動汽車標準化工作的具體目標和工作計畫。在對國內外電動汽車標準和法規進行總結和歸納的基礎上,著重分析和研究中國電動汽車在未來的10年中,電動汽車及其相關產業的技術發展、產業化和市場化發展的標準需求,以此作為中國電動汽車快速健康發展的主要技術支撐。路線圖中標準化工作實施期限分為:緊急(2015年1月至2015年12月)、短期(2016年1月至2017年12月)、中期(2018年1月至2020年12月)和長期(2021年1月至2025年12月)共4個階段。由上述內容構成的本路線圖,將成為指導從2015年至2025年中國電動汽車標準化工作的綱領性檔。

    路線圖的範圍

    a)電動車輛:純電動汽車、混合動力電動汽車(包括插電式和增程式)、燃料電池電動汽車以及電動車輛相關零部件等;

    b)基礎設施:充電樁、充電站、換電站和加氫站等;

    c)相關產業:電動汽車及電池的運輸、回收利用、教育培訓、搶險救援等。

    d) 本路線圖覆蓋基礎設施和相關產業的建設、運營、管理等。

    路線圖的目標

    路線圖的目標是有目的、有計劃、有步驟地建立起聯繫緊密、相互協調、層次分明、構成合理、相互支持、滿足應用需求的整體性、系統性、開放性的電動汽車標準體系,加速制定一系列由標準體系確定的具體標準,從而降低研究、生產、使用、維護及管理的成本和風險,使標準化工作發揮最佳效益,支撐和引導我國電動汽車產業的技術創新和快速發展,即:

    ——提出系統、科學的電動汽車標準體系;

    ——提出未來十年需要制修訂的標準專案;

    ——提出我國電動汽車標準及體系建設的實施步驟;

    ——促進科技創新;

    ——改變能源結構和推動節能減排;

    ——促進電動汽車大規模產業化;

    ——滿足科研、產業化、市場化運行和政府管理的需要;

    ——積極參與國際標準化工作,爭取中國標準走向世界。

    路線圖的實施

    通過對國內外電動汽車標準化工作的現狀的分析,為了滿足電動汽車產業的發展,未來標準的缺項進行了梳理,路線圖將通過表格和圖形的形式,對標準缺項進行系統的整理,按照時間序列來闡述從2015年1月至2025年12月共11年的標準制定計劃,計畫為4個階段(優先順序),分為緊急(2015年1月至2015年12月)、短期(2106年1月至2017年12月、中期(2018年1月至2020年12月)、長期(2021年1月至2025年12月)。

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • 電動摺疊腳踏車、滑板車搶攻最後一哩交通需求

    電動摺疊腳踏車、滑板車搶攻最後一哩交通需求

    傳統交通工具汽機車造成許多空氣污染與碳排放,許多廠商認為解決方案是電動車、電動機車,不過,也有人提出另一個想法,那就是何不更充分利用大眾運輸工具,只要解決捷運站到目的地的「最後一哩」交通需求即可鼓勵許多人不用自己開車、騎機車,而願意搭乘捷運。在 CES 2016 上,許多廠商都推出類似概念的產品。

    Cycle Board 推出「街道衝浪者」(Street Surfer)電動滑板三輪車,這輛滑板車的前端有兩輪,連接把手,負責轉向,較大的雙前輪也提供在人行道等不平坦路面上的穩定性,後端有一個小輪,把手可伸縮配合使用者身高,也可收疊起來方便攜帶,把手上除了剎車等基本控制,還可裝上手機。「街道衝浪者」充電一次可行駛 15 到 20 英里(24.1 到 32.2 公里),最高時速 20 英里(32.2 公里)。

    ▲ Street Surfer(Source:) Urban626 則推出 Urb-e 折疊式電動腳踏車,結構像是一把折疊刀,設計師宣稱可快速折疊,實測大約 1 秒鐘可折疊起來,便於帶電車車廂,或是裝進汽車後車廂,骨架以鋁打造,總重 35 英磅(15.876 公斤),時速最高 24 公里,充電 4 小時充飽後,可以行駛 32 公里。   由 Smart Rhino 推出的 Xcooter 同樣是電動折疊式腳踏車,以 X 形狀骨架收合,充電 3 小時可行駛 28 公里,最高時速 80 公里,重量 18 公斤。這些可折疊的電動腳踏車或許是解決捷運站到目的地交通問題的解決方案,不過售價可不便宜,Urb-e 售價 1,500 美元,將近 5 萬元新台幣,Xcooter 預售價 1,499 美元,而 2016 年 4 月正式上市時售價將為 1,799 美元,將近 6 萬元新台幣。

    (本文授權轉載自《》─〈〉)

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

    ※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

    ※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

    ※評比南投搬家公司費用收費行情懶人包大公開

  • macOS 使用Miniconda配置本地數據運算環境

    macOS 使用Miniconda配置本地數據運算環境

    目前,做數據分析工作,基本人手Numpy,pandas,scikit-learn。而這些計算程序包都是基於python平台的,所以搞數據的都得先裝個python環境。。。(當然,你用R或Julia請忽略本文)

    在macOS上,默認安裝有python 2.7,鑒於python2即將停止更新,如果沒有大量的python2代碼需要維護,就直接安裝python3吧。

    版本選擇

    做數據運算,流行的方式是直接下載Anaconda安裝包,大概500M左右,各種依賴包(綁定了四五百個科學計算程序包),開發工具(jupyter notebook,spyder)一股腦兒都包含了,按照步驟安裝完成,開箱即用,不過裝完後會佔用幾個G的硬盤空間。

    我這邊由於硬盤空間有限,採用Miniconda這個發行版本,最新的基於python3.7版本的不到50M。而Miniconda一樣使用conda作為包管理器,可以輕鬆的安裝自己需要的包,例如Numpy,pandas, matplotlib等等。

    當然,也可以從安裝包或homebrew開始裝,然後再使用pip來安裝相關的程序包。總體上來說,python自身的版本和執行路徑是相當混亂的,可參考下圖。

    安裝步驟

    • 下載
      先從官網下載適合自己操作系統的版本,Miniconda
      支持Windows/Linux/macOS這三種主流操作系統。如果遇到官網下載慢的問題,可以考慮國內的鏡像站點,如。

    下載完成后,可以先核對下hash值,與官網的值(5cf91dde8f6024061c8b9239a1b4c34380238297adbdb9ef2061eb9d1a7f69bc)是否一致保證安裝文件未被篡改。

    $ shasum -a 256 Miniconda3-latest-MacOSX-x86_64.sh 
    5cf91dde8f6024061c8b9239a1b4c34380238297adbdb9ef2061eb9d1a7f69bc  Miniconda3-latest-MacOSX-x86_64.sh
    • 執行安裝
    $ bash ./Miniconda3-latest-MacOSX-x86_64.sh 
    
    Welcome to Miniconda3 4.7.12
    
    In order to continue the installation process, please review the license
    agreement.
    Please, press ENTER to continue
    
    
    Do you accept the license terms? [yes|no]
    [no] >>> yes
    
    Miniconda3 will now be installed into this location:
    /Users/shenfeng/miniconda3
    
      - Press ENTER to confirm the location
      - Press CTRL-C to abort the installation
      - Or specify a different location below
    
    [/Users/shenfeng/miniconda3] >>> 
    
    >>> 

    按照提示,敲擊回車。中間需要同意使用條款,需要輸入yes,按照路徑點回車默認即可。

    Do you wish the installer to initialize Miniconda3
    by running conda init? [yes|no]
    [yes] >>> yes
    
    ==> For changes to take effect, close and re-open your current shell. <==
    
    If you'd prefer that conda's base environment not be activated on startup, 
       set the auto_activate_base parameter to false: 
    
    conda config --set auto_activate_base false
    
    Thank you for installing Miniconda3!

    最後的提示是,可以用conda config --set auto_activate_base false命令取消python3環境在啟動時自行加載。

    • 重新開一個新的終端
      可以發現,python3的env已經生效了。
    (base) my:~ shenfeng$ python
    Python 3.7.4 (default, Aug 13 2019, 15:17:50) 
    [Clang 4.0.1 (tags/RELEASE_401/final)] :: Anaconda, Inc. on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> 
    • 查看env配置
    $ conda env list
    # conda environments:
    #
    base                  *  /Users/shenfeng/miniconda3

    使用conda deactivate可以python3的執行環境,使用conda activate base可以激活默認的python3環境。

    • 添加國內鏡像源
      由於conda的包服務器都在海外,直接連接安裝可能出現連接超時無法完成的時候,所以可以通過修改用戶目錄下的.condarc 文件。
    channels:
      - defaults
    show_channel_urls: true
    default_channels:
      - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
      - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
      - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
    custom_channels:
      conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
      msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
      bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
      menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
      pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
      simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
    • 使用conda安裝相應的程序包
      先使用conda list檢查已經安裝的包,使用conda install需要的程序包
    $ $ conda list numpy
    # packages in environment at /Users/shenfeng/miniconda3:
    #
    # Name                    Version                   Build  Channel
    
    $ conda install numpy
    
    $ conda list numpy
    # packages in environment at /Users/shenfeng/miniconda3:
    #
    # Name                    Version                   Build  Channel
    numpy                     1.17.3           py37h4174a10_0    defaults
    numpy-base                1.17.3           py37h6575580_0    defaults

    相同的方式,我們可以安裝scipy,pandas等包,不再贅述。

    交互式工具安裝

    大家耳熟能詳的交互式工具肯定就是Jupyter notebook,但我在本機同樣由於磁盤空間問題只安裝ipython。實際上,Jupyter是基於ipython notebook的瀏覽器版本。

    • 安裝
    $ conda install ipython
    • 執行ipython交互
    $ ipython
    Python 3.7.4 (default, Aug 13 2019, 15:17:50) 
    Type 'copyright', 'credits' or 'license' for more information
    IPython 7.9.0 -- An enhanced Interactive Python. Type '?' for help.
    
    In [1]: import numpy as np                                               
    In [2]: dataset= [2,6,8,12,18,24,28,32]                                   
    In [3]: sd= np.std(dataset,ddof=1)                                       
    In [4]: print(sd)                                                        
    10.977249200050075

    樣例數據處理

    先從網上下載一個樣例數據,為excel文件,另存為成csv進行處理。

    以下結合上周文章中的,計算這組數據的概括性度量。

    • 讀取數據
    import numpy as np
    from scipy import stats
    
    dataset = np.genfromtxt('/Users/shenfeng/Downloads/test1.csv',delimiter=',', skip_header=1)
    print('Shape of numpy array: ', dataset.shape)
    Shape of numpy array:  (699,)
    

    集中趨勢的度量

    • 眾數
    mode = stats.mode(dataset)                                
    print('該組數據的眾數為: ', mode)         
    該組數據的眾數為:  ModeResult(mode=array([1.]), count=array([145]))
    # 結果說明眾數為1,出現了145次
    • 中位數
    print('該組數據的中位數為: ', np.median(dataset))
    該組數據的中位數為:  4.0
    • 四分位數
    # 不需要提前排序
    print("1/4分位數: ", np.percentile(dataset, 25, interpolation='linear')) 
    1/4分位數:  2.0
    
    print("1/2分位數: ", np.percentile(dataset, 50, interpolation='linear')) 
    1/2分位數:  4.0
    
    print("3/4分位數: ", np.percentile(dataset, 75, interpolation='linear')) 
    3/4分位數:  6.0
    • 平均數
    print('該組數據的平均數為: ', np.mean(dataset))
    該組數據的平均數為:  4.417739628040057

    離散程度的度量

    • 標準差
    print('該組數據的總體標準差為: ', np.std(dataset,ddof=0))
    該組數據的總體標準差為:  2.8137258170785375
    • 標準分數
    # 變量值與其平均數的離差除以標準差后的稱為標準分數(standard score)
    print('該組數據的標準分數為: ', stats.zscore(dataset))
    該組數據的標準分數為:  [ 0.20693572  0.20693572 -0.50386559  0.56233637 -0.14846494  1.27313768
     -1.2146669  -0.85926625 -0.85926625 -0.14846494 -1.2146669  -0.85926625 ...省略 ]
    • 離散係數
    # 離散係數是測度數據離散程度的統計量,主要用於比較不同樣本數據的離散程度。
    print('該組數據的離散係數為: ', stats.variation(dataset))
    該組數據的離散係數為:  0.6369152675317026

    偏態與峰態的度量

    • 數據分布圖
    import matplotlib.pyplot as plt 
    plt.style.use('ggplot') 
    plt.hist(dataset, bins=30) 

    獲得以下分布圖

    • 偏態
    print('該組數據的偏態係數為: ', stats.skew(dataset))
    該組數據的偏態係數為:  0.5915855449527385
    # 偏態係數在0.5~1或-1~-0.5之間,則認為是中等偏態分佈
    • 峰態係數
    print('該組數據的峰態係數為: ', stats.kurtosis(dataset))
    該組數據的峰態係數為:  -0.6278342838815454
    # 當K<0時為扁平分佈,數據的分佈更分散

    總結

    本文使用Miniconda發行版配置本地數據運算環境,並對樣例做數據的概括性度量。

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
    【其他文章推薦】

    ※帶您來了解什麼是 USB CONNECTOR  ?

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

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

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

    ※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

  • js數組方法大全(下)

    js數組方法大全(下)

    # js數組方法大全(下)

    記錄一下整理的js數組方法,免得每次要找方法都找不到。圖片有點多,注意流量,嘻嘻!

    本期分享

    • forEach()
    • map()
    • filer()
    • every()
    • some()
    • reduce()
    • reduceRight()
    • indexOf()
    • lastIndex()

    上期分享

    • join()
    • reverse()
    • sort()
    • concat()
    • slice()
    • splice()
    • push()
    • pop()
    • unshift()
    • shift()
    • toString()
    • toLocaleString()

    forEach() —>遍歷

    • 使用熱度:經常用
    • 是否改變原始數組:否
    • 返回:無
    • 參數:
    參數位置 參數類型 是否必選 說明
    1 function 三個參數分別是:數組元素、元素的索引、數組本身
    • 說明:該方法無法提前終止運行,如果要提前終止運行,只能使用try塊中,然後拋出一個異常。
    • 小技巧:如果數組是個數組對象形式可以直接操作數組元素改變原始數組本身,因為對象是個引用數據類型嘛!
    • 實例如下:
    var log=console.log;
    var data=[1,2,3,4,5];
    var sum =0;
    data.forEach(value=>{
      sum+=value;
    })
    log(sum);
    
    data.forEach((v,i,a)=>{
      a[i]=v+1;
    })
    log(data);
    
    var data_post=[{a:1},{a:2}]
    data_post.forEach(value=>{
      value.a++;
    })
    log(data_post)

    map() —>映射

    • 使用熱度:經常用
    • 是否改變原始數組:否
    • 返回:返回一個新函數
    • 參數:
    參數位置 參數類型 是否必選 說明
    1 function 三個參數分別是:數組元素、元素的索引、數組本身
    • 說明:傳遞給map函數應該有返回值,返回值是新數組的元素。
    • 實例如下:
    var log=console.log;
    var data=[1,2,3,4,5];
    var b= data.map(x=>{
      return x*x;
    })
    log(b)

    filter() —>過濾

    • 使用熱度:常用
    • 是否改變原始數組:否
    • 返回:返回過濾后的數組
    • 參數:
    參數位置 參數類型 是否必選 說明
    1 function 三個參數分別是:數組元素、元素的索引、數組本身
    • 說明:如果返回值是true或者可以轉化為true的值,那麼這個值就是新數組的元素。
    • 實例如下:
    var log=console.log;
    var data=[1,2,3,4,5];
    var b= data.filter(x=>{
      return x<3;
    })
    log(b)

    every() —>檢測

    • 使用熱度:不常用
    • 是否改變原始數組:否
    • 返回:true或者false
    • 參數:
    參數位置 參數類型 是否必選 說明
    1 function 三個參數分別是:數組元素、元素的索引、數組本身
    • 說明:當且僅當針對數組中的所有元素調用綁定函數都返回true時,它才返回true。
    • 注意:一旦every或者some已經確定了改返回什麼值得時候就不會遍曆數組了。根據數學上的慣例,在空數組調用時,every返回true,some返回false。
    • 實例如下:
    var log=console.log;
    var data=[1,2,3,4,5];
    var b= data.every(x=>{
      return x<10;
    })
    log(b)
    
    var c= data.every(x=>{
      return x%2===0;
    })
    log(c)

    some() —>檢測

    • 使用熱度:不常用
    • 是否改變原始數組:否
    • 返回:true或者false
    • 參數:
    參數位置 參數類型 是否必選 說明
    1 function 三個參數分別是:數組元素、元素的索引、數組本身
    • 說明:當數組中至少有一個元素調用綁定函數返回true時,它就返回true。
    • 注意:一旦every或者some已經確定了改返回什麼值得時候就不會遍曆數組了。根據數學上的慣例,在空數組調用時,every返回true,some返回false。
    • 實例如下:
    var log=console.log;
    var data=[1,2,3,4,5];
    var b= data.some(x=>{
      return x>10;
    })
    log(b)
    
    var c= data.some(x=>{
      return x%2===0;
    })
    log(c)

    reduce() —>簡化

    • 使用熱度:不常用
    • 是否改變原始數組:否
    • 返回:返回一個值
    • 參數:
    參數位置 參數類型 是否必選 作用
    1 function 四個參數分別是:初始化值/數組元素、數組元素、元素的索引、數組本身
    2 number 供計算的初始化值
    • 說明:第一個參數是到目前為止的簡化操作累計的結果
    • 注意:如果沒有初始化值,第一次調用函數的第一個參數就是第一個數組元素,第二個參數則是第二個數組元素。如果有初始化值,第一次調用函數的第一個參數就是初始化值,二個參數則是第一個數組元素。
    • 實例如下:
    var log=console.log;
    var data=[1,2,3,4,5];
    var b= data.reduce((x,y)=>{
      return x+y;
    },0)
    log(b)
    
    var c= data.reduce((x,y)=>{
      return x*y;
    },1)
    log(c)
    
    var d= data.reduce((x,y)=>{
      return x>y?x:y;
    },1)
    log(d)

    reduceRight() —>簡化

    • 使用熱度:不常用
    • 是否改變原始數組:否
    • 返回:返回一個值
    • 參數:
    參數位置 參數類型 是否必選 作用
    1 function 四個參數分別是:初始化值/數組元素、數組元素、元素的索引、數組本身
    2 number 供計算的初始化值
    • 說明:第一個參數是到目前為止的簡化操作累計的結果。不同於reduce這個僅僅是從右到左計算。
    • 注意:如果沒有初始化值,第一次調用函數的第一個參數就是第一個數組元素,第二個參數則是第二個數組元素。如果有初始化值,第一次調用函數的第一個參數就是初始化值,二個參數則是第一個數組元素。
    • 實例如下:
    var log=console.log;
    var data=[1,2,3,4,5];
    data.reduceRight((x,y)=>{
      log(y)
      return x+y;
    },0)

    indexOf() —>搜索

    • 使用熱度:經常用
    • 是否改變原始數組:否
    • 返回:返回數組索引或者-1
    • 參數:
    參數位置 參數類型 是否必選 作用
    1 * 要搜索的數組元素
    2 number 從數組哪個索引開始搜索
    • 說明:如果能搜索到結果將返回第一個索引,如果搜索不到就返回-1
    • 注意:如果第二個參數是負數,指的是從數組元素末尾的偏移量位置開始向後搜索,而不是到偏移量位置就截止搜索了,這裡是很容易和splice弄混的。
    • 實例如下:
    var log=console.log;
    var data=[1,2,3,4,5];
    var b=data.indexOf(1,-5);
    log(b);

    lastIndexOf() —>搜索

    • 使用熱度:經常用
    • 是否改變原始數組:否
    • 返回:返回數組索引或者-1
    • 參數:
    參數位置 參數類型 是否必選 作用
    1 * 要搜索的數組元素
    2 number 從數組哪個索引開始搜索
    • 說明:和indexOf不同的是lashIndexOf是反向搜索
    • 注意:因為是反向搜索,當第二個參數是負數的時候,就是指從末尾偏移量的位置向前搜索
    • 實例如下:
    var log=console.log;
    var data=[1,2,3,2,5];
    var b=data.lastIndexOf(2,-3)
    log(b)
    
    var c=data.lastIndexOf(1,-5)
    log(c)

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

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • Ansible之playbook拓展

      一、handlers和notify結合使用觸發條件

      handlers同tasks是屬同級,相當於一個特殊任務列表,這些任務同前文說的tasks里的任務沒有本質的不同,用於當關注的資源發生變化時,才會採取一定的操作。notify此action可用於在每一個play的最後被觸發,這樣可避免多次有改變發生時都執行指定的操作,僅在所有的變化發生完成后一次性地執行指定操作,在notify中列出的操作稱為handler,換句話說當所關注的資源發生變化時notify將調用handlers中定義的操作。其中notify所在任務就是被監控的任務資源變化的任務,notify可以調用多個handlers定義的操作,一個handlers里可以定義很多任務。

    ---
    - hosts: websers
      remote_user: root
    
      tasks:
        - name: create apache group
          group: name=apache gid=80 system=yes
        - name: create apache user
          user: name=apache uid=80 group=apache system=yes shell=/sbin/nologin home=/var/www/html 
        - name: install httpd
          yum: name=httpd
        - name: copy config file
          copy: src=/tmp/httpd.conf dest=/etc/httpd/conf/
          notify: restart httpd service
    
        - name: start httpd service
          service: name=httpd state=started enabled=yes
    
      handlers:
        - name: restart httpd service
          service: name=httpd state=restarted   
    

      說明:notify后指定的名稱必須要和handlers里的任務名稱相同,如不同handlers所定義的任務將不會執行,相當於沒有notify調用handlers里的任務。

      在某些情況下,我們可能同時需要調用多個handlers,或者需要使用handlers其他handlers,ansible可以很簡單的實現這些功能,如下所示

      1)調用多個handlers

    ---
    - hosts: websers
      remote_user: root
    
      tasks:
        - name: create apache group
          group: name=apache gid=80 system=yes
        - name: create apache user
          user: name=apache uid=80 group=apache system=yes shell=/sbin/nologin home=/var/www/html 
        - name: install httpd
          yum: name=httpd
        - name: copy config file
          copy: src=/tmp/httpd.conf dest=/etc/httpd/conf/
          notify: 
            - restart httpd service
            - check httpd process
    
        - name: start httpd service
          service: name=httpd state=started enabled=yes
    
      handlers:
        - name: restart httpd service
          service: name=httpd state=restarted
        - name: check httpd process                                                                                      
          shell: /usr/bin/killall -0 httpd &> /tmp/httpd.log
    

      說明:調用多個handlers我們需要在notify中寫成列表的形式,同樣我們被觸發的任務名稱需要同handlers里的被調用的任務名稱完全相同

      2)handlers調用handlers

    ---
    - hosts: websers
      remote_user: root
    
      tasks:
        - name: create apache group
          group: name=apache gid=80 system=yes
        - name: create apache user
          user: name=apache uid=80 group=apache system=yes shell=/sbin/nologin home=/var/www/html 
        - name: install httpd
          yum: name=httpd
        - name: copy config file
          copy: src=/tmp/httpd.conf dest=/etc/httpd/conf/
          notify: restart httpd service
    
        - name: start httpd service
          service: name=httpd state=started enabled=yes
    
      handlers:
        - name: restart httpd service
          service: name=httpd state=restarted
          notify: check httpd process                                                                                    
        - name: check httpd process
          shell: /usr/bin/killall -0 httpd &> /tmp/httpd.log
    

      說明:handlers調用handlers,則直接在handlers中使用notify選項就可以。

    在使用handlers我們需要注意一下幾點:

      1)handlers只有在其所在任務被執行時才會被運行,handlers定義的任務它不會像task任務那樣,自動會從上至下依次執行,它只會被notify所在的任務發生狀態改變時才會觸發handlers 的任務執行,如果一個任務中定義了notify調用handlers,但由於條件的判斷等原因,該任務尚未執行,那麼notify調用的handlers同樣也不會執行。

      2)handlers只會在play的末尾運行一次;如果想要在一個playbook的中間運行handlers,則需要使用meta模塊來實現,如:-mate: flush_handlers

      二、playbook中變量的使用

    ansible中變量的命名規範同其他語言或系統中變量命名規則非常類似。變量名以英文大小寫字母開頭,中間可以包含下劃線和数字,ansible變量的來源有很多,具體有以下幾點:

      1)ansible setup模塊,這個模塊可以從遠程主機上獲取很多遠程主機的基本信息,它所返回的所有變量都可以直接調用,有關setup說明請參考本人博客

      2)在/etc/ansible/hosts中定義,此文件是ansible執行名時默認加載的主機清單文件,在裏面除了可定義我們要管理的主機外,我們還可以定義針對單個主機定義單獨的變量,我們把針對單獨某一台主機定義的變量叫做普通變量(也可叫做主機變量);還有一種變量它不是針對單獨一個主機,它針對某一個組裡的所有主機,我們把這種變量叫做公共組變量。主機清單中定義的變量優先級是普通變量高於公共變量。

        2.1)主機變量,可以在主機清單中定義主機時為其添加主機變量以便於在playbook中使用,如下所示

    [websers]
    192.168.0.128 http_port=80 maxRequestsPerChild=808
    192.168.0.218 http_port=81 maxRequestsPerChild=909
    

        2.2)主機組變量,組變量是指定賦予給指定組內所有主機上的在playbook中可使用的變量,如下所示

    [websers]
    192.168.0.128 http_port=80 
    192.168.0.218 http_port=81 
    [websers:vars]
    maxRequestsPerChild=909

      3)通過命令行指定變量(-e指定變量賦值,可以說多個但需要用引號引起或者一個變量用一個-e指定賦值),這種在命令行指定的優先級最高。如下所示

    ansible-playbook -e 'package_name1=httpd package_name2=nginx' test_vars.yml

      4)在playbook中定義變量,最常見的定義變量的方法是使用vars代碼塊,如下所示

    ---
    - hosts: websers
      remote_user: root
      vars:
        - abc: xxx 
        - bcd: aaa  
    

      5)在獨立的變量yml文件中定義,在playbook中使用vars_files代碼塊引用其變量文件,如下所示

    [root@test ~]#cat vars.yml 
    ---
    package_name1: vsftpd
    package_name2: nginx
    [root@test ~]#cat test_vars.yml 
    ---
    - hosts: websers
      remote_user: root
      vars_files:
        - vars.yml
      tasks:
        - name: install package1
          yum: name={{ package_name1 }}
        - name: install package2
          yum: name={{ package_name2 }}
    [root@test ~]#

      6)在role中定義,這個後續說到角色在做解釋

      變量的調用方式:第一種在playbook中使用變量需要用“{{}}”將變量括起來,表示括號里的內容是一個變量,有時用“{{  variable_name }}”才生效;第二種是ansible-playbook -e 選項指定其變量,ansible-playbook -e “hosts=www user=xxxx” test.yml

      在主機清單中定義變量的方法雖然簡單直觀,但是當所需要定義的變量有很多時,並且被多台主機使用時,這種方法顯得非常麻煩,事實上ansible的官方手冊中也不建議我們把變量直接定義到hosts文件中;在執行ansible命令時,ansible會默認會從/etc/ansible/host_vars/和/etc/ansible/group_vars/兩個目錄下讀取變量定義文件,如果/etc/ansible/下沒有以上這兩個目錄,我們可以手動創建,並且可以在這兩個目錄下創建與hosts文件中的主機名或主機組同名的文件來定義變量。比如我們要給192.168.0.218 這個主機定義個變量文件,我們可以在/etc/ansible/host_vars/目錄下創建一個192.168.0.218的空白文件,然後在文件中以ymal語法來定義所需變量即可。如下所示

    [root@test ~]#tail -6 /etc/ansible/hosts 
    ## db-[99:101]-node.example.com
    [websers]
    192.168.0.128 
    192.168.0.218 
    [appsers]
    192.168.0.217
    [root@test ~]#cat /etc/ansible/host_vars/192.168.0.218 
    ---
    file1: abc
    file2: bcd
    [root@test ~]#cat test.yml 
    ---
    - hosts: 192.168.0.218
      remote_user: root
      
      tasks:
        - name: touch file1
          file: name={{ file1 }} state=touch
        - name: toch file2
          file: name={{ file2 }} state=touch
    [root@test ~]#ansible-playbook test.yml 
    
    PLAY [192.168.0.218] ************************************************************************************************
    
    TASK [Gathering Facts] **********************************************************************************************
    ok: [192.168.0.218]
    
    TASK [touch file1] **************************************************************************************************
    changed: [192.168.0.218]
    
    TASK [toch file2] ***************************************************************************************************
    changed: [192.168.0.218]
    
    PLAY RECAP **********************************************************************************************************
    192.168.0.218              : ok=3    changed=2    unreachable=0    failed=0   
    
    [root@test ~]#ansible 192.168.0.218 -m shell -a 'ls -l /root'
    192.168.0.218 | SUCCESS | rc=0 >>
    總用量 12
    -rw-r--r--. 1 root   root    0 11月 17 16:49 abc
    -rw-r--r--. 1 root   root    0 11月 17 16:49 bcd
    drwxr-xr-x. 2 qiuhom root 4096 11月 11 19:18 scripts
    drwxr-xr-x. 3 qiuhom root 4096 11月 11 19:28 test
    -rw-r--r--. 1 root   root   57 11月 13 19:15 test_cron_file
    
    [root@test ~]#
    

      說明:可看到我們定義在/etc/ansible/host_vars/下的主機變量文件中的變量生效了。

    同理,我們要想針對某個組的主機定義一些變量,我們只需要在/etc/ansible/group_vars/目錄下創建與主機清單中的主機組同名的文件即可。

      三、使用高階變量

      對於普通變量,例如由ansible命令行設定的,hosts文件中定義的以及playbook中定義的和變量文件中定義的,這些變量都被稱為普通變量或者叫簡單變量,我們可以在playbook中直接用雙大括號加變量名來讀取變量內容;除此以外ansible還有數組變量或者叫做列表變量,如下所示:

    [root@test ~]#cat vars.yml 
    ---
    packages_list:
      - vsftpd
      - nginx
    [root@test ~]#
    

      列表定義完成后我們要使用其中的變量可以列表名加下標的方式去訪問,有點類似shell腳本里的數組的使用,如下所示

    [root@test ~]#cat test.yml 
    ---
    - hosts: 192.168.0.218
      remote_user: root
      
      vars_files:
        - vars.yml
      tasks:
        - name: touch file
          file: name={{ packages_list[0] }} state=touch
        - name: mkdir dir
          file: name={{ packages_list[1] }} state=directory
    [root@test ~]#
    

      說明:我們要使用列表中的第一個元素變量,我們可以寫成vars_list[0],使用第二個變量則下標就是1,依此類推

    [root@test ~]#ansible *218 -m shell -a 'ls -l /root'
    192.168.0.218 | SUCCESS | rc=0 >>
    總用量 12
    -rw-r--r--. 1 root   root    0 11月 17 16:49 abc
    -rw-r--r--. 1 root   root    0 11月 17 16:49 bcd
    drwxr-xr-x. 2 qiuhom root 4096 11月 11 19:18 scripts
    drwxr-xr-x. 3 qiuhom root 4096 11月 11 19:28 test
    -rw-r--r--. 1 root   root   57 11月 13 19:15 test_cron_file
    
    [root@test ~]#ansible-playbook test.yml 
    
    PLAY [192.168.0.218] ************************************************************************************************
    
    TASK [Gathering Facts] **********************************************************************************************
    ok: [192.168.0.218]
    
    TASK [touch file] ***************************************************************************************************
    changed: [192.168.0.218]
    
    TASK [mkdir dir] ****************************************************************************************************
    changed: [192.168.0.218]
    
    PLAY RECAP **********************************************************************************************************
    192.168.0.218              : ok=3    changed=2    unreachable=0    failed=0   
    
    [root@test ~]#ansible *218 -m shell -a 'ls -l /root'
    192.168.0.218 | SUCCESS | rc=0 >>
    總用量 16
    -rw-r--r--. 1 root   root    0 11月 17 16:49 abc
    -rw-r--r--. 1 root   root    0 11月 17 16:49 bcd
    drwxr-xr-x. 2 root   root 4096 11月 17 17:23 nginx
    drwxr-xr-x. 2 qiuhom root 4096 11月 11 19:18 scripts
    drwxr-xr-x. 3 qiuhom root 4096 11月 11 19:28 test
    -rw-r--r--. 1 root   root   57 11月 13 19:15 test_cron_file
    -rw-r--r--. 1 root   root    0 11月 17 17:23 vsftpd
    
    [root@test ~]#
    

      說明:可看到我們創建的文件和目錄在目標主機已經生成

    上面的用法是典型的python列表的用法,在python中讀取列表中的元素就是用下標的表示來讀取相應的元素的值。接下我們將介紹另外一種更為複雜的變量,它類似python中的字典概念,但比字典的維度要高,更像是二維字典。ansible內置變量ansible_eth0就是這樣一種,它用來保存遠端主機上面eth0接口的信息,包括ip地址和子網掩碼等。如下所示

    [root@test ~]#cat test.yml     
    ---
    - hosts: 192.168.0.218
      remote_user: root
      
      tasks:
        - debug: var=ansible_eth0 
    [root@test ~]#ansible-playbook test.yml 
    
    PLAY [192.168.0.218] ************************************************************************************************
    
    TASK [Gathering Facts] **********************************************************************************************
    ok: [192.168.0.218]
    
    TASK [debug] ********************************************************************************************************
    ok: [192.168.0.218] => {
        "ansible_eth0": {
            "active": true, 
            "device": "eth0", 
            "features": {
                "fcoe_mtu": "off [fixed]", 
                "generic_receive_offload": "on", 
                "generic_segmentation_offload": "on", 
                "highdma": "off [fixed]", 
                "large_receive_offload": "off [fixed]", 
                "loopback": "off [fixed]", 
                "netns_local": "off [fixed]", 
                "ntuple_filters": "off [fixed]", 
                "receive_hashing": "off [fixed]", 
                "rx_checksumming": "on", 
                "rx_vlan_filter": "on [fixed]", 
                "rx_vlan_offload": "on [fixed]", 
                "scatter_gather": "on", 
                "tcp_segmentation_offload": "on", 
                "tx_checksum_fcoe_crc": "off [fixed]", 
                "tx_checksum_ip_generic": "on", 
                "tx_checksum_ipv4": "off", 
                "tx_checksum_ipv6": "off", 
                "tx_checksum_sctp": "off [fixed]", 
                "tx_checksum_unneeded": "off", 
                "tx_checksumming": "on", 
                "tx_fcoe_segmentation": "off [fixed]", 
                "tx_gre_segmentation": "off [fixed]", 
                "tx_gso_robust": "off [fixed]", 
                "tx_lockless": "off [fixed]", 
                "tx_scatter_gather": "on", 
                "tx_scatter_gather_fraglist": "off [fixed]", 
                "tx_tcp6_segmentation": "off", 
                "tx_tcp_ecn_segmentation": "off", 
                "tx_tcp_segmentation": "on", 
                "tx_udp_tnl_segmentation": "off [fixed]", 
                "tx_vlan_offload": "on [fixed]", 
                "udp_fragmentation_offload": "off [fixed]", 
                "vlan_challenged": "off [fixed]"
            }, 
            "hw_timestamp_filters": [], 
            "ipv4": {
                "address": "192.168.0.218", 
                "broadcast": "192.168.0.255", 
                "netmask": "255.255.255.0", 
                "network": "192.168.0.0"
            }, 
            "ipv6": [
                {
                    "address": "fe80::20c:29ff:fee8:f67b", 
                    "prefix": "64", 
                    "scope": "link"
                }
            ], 
            "macaddress": "00:0c:29:e8:f6:7b", 
            "module": "e1000", 
            "mtu": 1500, 
            "pciid": "0000:02:01.0", 
            "promisc": false, 
            "speed": 1000, 
            "timestamping": [
                "rx_software", 
                "software"
            ], 
            "type": "ether"
        }
    }
    
    PLAY RECAP **********************************************************************************************************
    192.168.0.218              : ok=2    changed=0    unreachable=0    failed=0   
    
    [root@test ~]#
    

      說明:以上playbook就實現了對ansible_eth0這個變量進行調試並打印,可以看到ansible_eth0是一個相對比較複雜的變量,裡面包含了字典,列表混合一起的一個大字典。

    我們可以看到ansible_eht0裡面包含了很多內容,我們要想讀取其中的IPV4地址,我們可以採用“.”或者下標的方式去訪問,如下所示

    [root@test ~]#cat test.yml 
    ---
    - hosts: 192.168.0.218
      remote_user: root
      
      tasks:
        - name: print ipv4  
          shell: echo {{ ansible_eth0["ipv4"]["address"] }} 
        - name: print mac
          shell: echo  {{ ansible_eth0.macaddress }}
    [root@test ~]#ansible-playbook test.yml -v
    Using /etc/ansible/ansible.cfg as config file
    
    PLAY [192.168.0.218] ************************************************************************************************
    
    TASK [Gathering Facts] **********************************************************************************************
    ok: [192.168.0.218]
    
    TASK [print ipv4] ***************************************************************************************************
    changed: [192.168.0.218] => {"changed": true, "cmd": "echo 192.168.0.218", "delta": "0:00:00.001680", "end": "2019-11-17 18:30:21.926368", "rc": 0, "start": "2019-11-17 18:30:21.924688", "stderr": "", "stderr_lines": [], "stdout": "192.168.0.218", "stdout_lines": ["192.168.0.218"]}
    
    TASK [print mac] ****************************************************************************************************
    changed: [192.168.0.218] => {"changed": true, "cmd": "echo 00:0c:29:e8:f6:7b", "delta": "0:00:00.001746", "end": "2019-11-17 18:30:22.650541", "rc": 0, "start": "2019-11-17 18:30:22.648795", "stderr": "", "stderr_lines": [], "stdout": "00:0c:29:e8:f6:7b", "stdout_lines": ["00:0c:29:e8:f6:7b"]}
    
    PLAY RECAP **********************************************************************************************************
    192.168.0.218              : ok=3    changed=2    unreachable=0    failed=0   
    
    [root@test ~]#

      說明:由此可以看出ansible多級變量的調用,使用中括號和點號都是可以的

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

    【其他文章推薦】

    USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

    ※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

    ※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

    ※評比南投搬家公司費用收費行情懶人包大公開

  • 讀《MySQL必知必會》我學到了什麼?

    讀《MySQL必知必會》我學到了什麼?

    前言

    最近在寫項目的時候發現自己的SQL基本功有些薄弱,遂上知乎查詢MYSQL關鍵字,期望得到某些高贊答案的指點,於是乎發現了

    https://www.zhihu.com/question/34840297/answer/272185020 這位老兄的建議的書單,根據他的建議首先拜讀了《MYSQL必知必會》這本書,整體講的很基礎,頁數也不多一共 253 頁,適合基礎比較薄弱的同學進行食用。然後循序漸進,閱讀更深層次的書籍進行自我提升。這裏記載了自己在閱讀的過程中記錄的一些關鍵內容,分享給大家。書本 PDF 可以在上面的知乎鏈接獲取,或者點擊 http://www.notedeep.com/note/38/page/282 前往老哥的深度筆記進行下載。

    閱讀心得

    SQL語句和大小寫

    SQL語句不區分大小寫,並且在 Windows 環境下,4.1.1版本之後(現在常用的都是 5.6/5.7/8.0+),MYSQL表名,字段名也是不區分大小寫的,因此我們在命名的時候建議使用單個單詞_單個單詞的形式命名,如:mysql_crash_course user_role

    這裏附上阿里代碼規範的一條強制要求:

    【強制】表名、字段名必須使用小寫字母或数字,禁止出現数字開頭,禁止兩個下劃線中間只出現数字。數據庫字段名的修改代價很大,因為無法進行預發布,所以字段名稱需要慎重考慮。
    說明: MySQL 在 Windows 下不區分大小寫,但在 Linux 下默認是區分大小寫。因此,數據庫名、表名、字段名,都不允許出現任何大寫字母,避免節外生枝。

    不能部分使用DISTINCT

    • DISTINCT 關鍵字應用於所有列而不僅是前置它的列。如果給出 SELECT DISTINCT vend_id,prod_price ,除非指定的兩個列都不同,否則所有行都將被檢索出來。
    • DISTINCT 不會返回其後面跟的所有字段都相同的列。即兩行中SELECT查詢的任何一個字段都相同才會被去重。不能通過DISTINCT加括號 () 等方式來對單個字段進行去重。

    比如項目中有這麼一個需求:

    需要分頁查詢綁了某收費標準的房屋,因為是房屋列表查詢,我們默認相同ID的房屋只出現一次,錯誤的SQL如下:

    房屋表

    收費標準表

    SELECT DISTINCT h.id, h.num, s.name 
    FROM house h 
    LEFT JOIN standard s 
    ON h.id = s.room_id 
    WHERE s.name = '物業費' OR s.name = '暖氣費';

    這條語句並不能返回想要的結果,即每套房屋只出現一次,因為不同的收費標準名稱不一樣,DISTINCT 不能對部分查詢條件去重。可以看到房號為1-001的記錄出現了兩次。

    不過其實按照需求的描述我這裏僅查詢房屋的信息,對於查詢結果來說同一條記錄的房屋信息肯定完全相同,因此 DISTINCT 在我的業務中滿足要求。而有其他業務需要此關鍵字的時候,請大家慎重使用,切記不能部分使用該關鍵字

    區分大小寫和排序順序

    在對文本性的數據進行排序時,A與a相同嗎?a位於B之前還是位於Z之後?

    在創建字段時可以指定字符集,一般使用 utf8mb4, 此時可以選擇相應的排序規則。

    1. utf8mb4_general_ci ci即大小寫不敏感,排序時忽略大小寫,A a 視作相同
    2. utf8mb4_bin / 帶 cs 的即大小寫敏感,相應的升序排列的話, A~Z 在前,小a~z在後
      相應的,在設置大小寫敏感后,查詢條件 where cs = ‘a’ 只能查找到表中該字段為小寫 a 的行。而不敏感,即ci時,A,a都可以被查詢出來。

    BETWEEN關鍵字的注意事項

    在區間查詢時,我們最關注的不應該是區間內的能否被匹配到,因為這是肯定的。而區間的邊界能否被匹配才是我們應該注意的知識點,BETWEEN AND 關鍵字匹配區間時,包含左右邊界條件。如下面的 SQL 執行結果如下:

    SELECT prod_name, prod_price 
    FROM products p
    WHERE p.`prod_price` BETWEEN 5.99 AND 10

    NULL 與不匹配

    在通過過濾選擇出不具有特定值的行時,你可能希望返回具有 NULL 值的行。但是,不行。常見的錯誤會發生在is_xxx 字段上,我經常有這個毛病,

    對於 is_delete 字段,我認為為 null 或者 0 都是未刪除的房屋,所以當我使用

    SELECT * FROM house WHERE is_delete = '0';

    查詢未刪除的房屋時,我只能查到 id 為 3 的房屋,這顯然與我的預期是不符的,解決辦法是where後面加 or is_delete is null ,或者給 is_delete 列默認值 0;建議使用後者。

    這裏附上阿里代碼手冊的一條強制項目:

    【強制】表達是與否概念的字段,必須使用 is_xxx 的方式命名,數據類型是 unsigned tinyint(1 表示是,0 表示否)。說明:任何字段如果為非負數,必須是 unsigned 。

    解釋:tinyint 相當於 Java 中的 byte,取值範圍 -128 ~ 127 ,用來表達是否長度已經足夠,也可以用來表示人的年齡。而 unsigned 表示無符號的,對於確定為非負數的字段,使用 unsigned 可以將取值範圍擴大一倍。

    AND 和 OR 的計算次序

    舉個例子:假如需要列出價格為10美元(含)以上且由 1002 或 1003 製造的所有產品。下面的 SELECT 語句使用 AND 和 OR 操作符的組合建立了一個WHERE 子句:

    SELECT *
    FROM products
    WHERE vend_id = 1002 OR vend_id = 1003 AND prod_price >= 10;

    查詢結果如下:

    而被我用紅框標註的行很顯然不是我們需要的行,為什麼會這樣呢?原因在於計算的次序。SQL(像多數語言一樣)在處理 OR 操作符前,優先處理 AND 操作符。當SQL看到上述 WHERE 子句時,它理解為由供應商 1003 製造的任何價格為10美元(含)以上的產品,或者由供應商 1002 製造的任何產品,而不管其價格如何。換句話說,由於 AND 在計算次序中優先級更高,操作符被錯誤地組合了。解決方法就是加 ();正確的 SQL 如下:

    SELECT *
    FROM products
    WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;

    建議在任何時候使用具有 AND 和 OR 操作符的 WHERE 子句,都應該使用圓括號明確地分組操作符。不要過分依賴默認計算次序,即使它確實是你想要的東西也是如此。使用圓括號沒有什麼壞處,它能消除歧義。

    UNION 組合查詢

    • 利用 UNION ,可給出多條SELECT 語句,將它們的結果組合成單個結果集。
    • UNION 中的每個查詢必須包含相同的列、表達式或聚集函數。
    • 在使用UNION 時,重複的行被自動取消。這是 UNION 的默認行為,但是如果需要,可以改變它。事實上,如果想返回所有匹配行,可使用 UNION ALL 而不是 UNION 。
    • 在用 UNION 組合查詢時,只能使用一條 ORDER BY 子句,它必須出現在最後一條 SELECT 語句之後

    INSERT語句總是使用列的列表

    一般不要使用沒有明確給出列的列表的 INSERT 語句。使用列的列表能使SQL代碼繼續發揮作用,即使表結構發生了變化。實際開發中有可能由於業務的需要,對錶結構進行修改,添加/刪除某一列。這時如果代碼中使用的SQL語句是沒有明確列表的插入語句就會報錯。當然一般我們使用逆向工程生成的 insertSelective(POJO) 並不存在這個問題,因為它對應生成的 SQL 會為我們生成列的列表。

    小心使用更新和刪除語句

    MySQL 沒有撤銷按鈕,因此在使用 UPDATE / DELETE 時一定要加上 WHERE 條件,並且在執行更新/刪除操作之前先進行 SELECT 操作,開啟事務。在執行結束后核對影響的行數和 SELECT 查詢出來的行數一致后再 COMMIT;

    另外,使用 ALTER TABLE 要極為小心,應該在進行改動前做一個完整的備份(模式和數據的備份)。數據庫表的更改不能撤銷,如果增加了不需要的列,可能不能刪除它們。類似地,如果刪除了不應該刪除的列,可能會丟失該列中的所有數據。

    視圖的規則和限制

    • 與表一樣,視圖必須唯一命名(不能給視圖取與別的視圖或表相同的名字)。
    • 對於可以創建的視圖數目沒有限制。
    • 為了創建視圖,必須具有足夠的訪問權限。這些限制通常由數據庫管理人員授予。
    • 視圖可以嵌套,即可以利用從其他視圖中檢索數據的查詢來構造一個視圖。
    • ORDER BY 可以用在視圖中,但如果從該視圖檢索數據 SELECT 中也含有 ORDER BY ,那麼該視圖中的 ORDER BY 將被覆蓋。
    • 視圖不能索引,也不能有關聯的觸發器或默認值。
    • 視圖可以和表一起使用。例如,編寫一條聯結表和視圖的 SELECT語句。

    其中視圖不能索引這一點要格外注意,在我開發過程中遇到過這樣一個視圖:使用 UNION 連結了好幾張表進行查詢,對查詢的結果使用 WHERE 條件再過濾,這裏雖然對於被連接的表對於 WHERE 條件后的字段都建立了索引,但是使用 UNION 連結生成視圖的臨時表並不能擁有索引。因此查詢的效率會很慢!所以建議在 UNION 查詢中將 WHERE 條件放在每個 SELECT 語句中。

    改善性能的一些建議

    • 首先,MySQL(與所有DBMS一樣)具有特定的硬件建議。在學習和研究MySQL時,使用任何舊的計算機作為服務器都可以。但
      對用於生產的服務器來說,應該堅持遵循這些硬件建議。

    • 一般來說,關鍵的生產DBMS應該運行在自己的專用服務器上。

    • MySQL是用一系列的默認設置預先配置的,從這些設置開始通常是很好的。但過一段時間后你可能需要調整內存分配、緩衝區大小等。(為查看當前設置,可使用 SHOW VARIABLES; 和 SHOWSTATUS; )

    • MySQL一個多用戶多線程的DBMS,換言之,它經常同時執行多個任務。如果這些任務中的某一個執行緩慢,則所有請求都會執
      行緩慢。如果你遇到顯著的性能不良,可使用 SHOW PROCESSLIST显示所有活動進程(以及它們的線程ID和執行時間)。你還可以用KILL 命令終結某個特定的進程(使用這個命令需要作為管理員登錄)。

    • 總是有不止一種方法編寫同一條 SELECT 語句。應該試驗聯結、並、子查詢等,找出最佳的方法。

    • 使用 EXPLAIN 語句讓MySQL解釋它將如何執行一條 SELECT 語句。

    • 一般來說,存儲過程執行得比一條一條地執行其中的各條MySQL語句快。但存儲過程一般難以調試和擴展,並且沒有移植性,因此阿里代碼規約裏面強制禁止使用存儲過程

    • 應該總是使用正確的數據類型。

    • 決不要檢索比需求還要多的數據。換言之,不要用 SELECT * (除非你真正需要每個列)。

    • 有的操作(包括 INSERT )支持一個可選的 DELAYED 關鍵字,如果使用它,將把控制立即返回給調用程序,並且一旦有可能就實際執行該操作。

      ​ 延遲插入,當插入和查詢併發執行時,插入被放入等待隊列中。直至所有查詢執行完畢后執行插入。並且MYSQL會在收到插入請求后直接返回給客戶端狀態信息,既是INSERT語句還在隊列中

    • 在導入數據時,應該關閉自動提交。你可能還想刪除索引(包括FULLTEXT 索引),然後在導入完成后再重建它們。

    • 必須索引數據庫表以改善數據檢索的性能。確定索引什麼不是一件微不足道的任務,需要分析使用的 SELECT 語句以找出重複的WHERE 和 ORDER BY 子句。如果一個簡單的 WHERE 子句返回結果所花的時間太長,則可以斷定其中使用的列(或幾個列)就是需要索引的對象。

    • 你的 SELECT 語句中有一系列複雜的 OR 條件嗎?通過使用多條SELECT 語句和連接它們的 UNION 語句,你能看到極大的性能改進。

    • 索引改善數據檢索的性能,但損害數據插入、刪除和更新的性能。如果你有一些表,它們收集數據且不經常被搜索,則在有必要之前不要索引它們。(索引可根據需要添加和刪除。)

    • LIKE 很慢。一般來說,最好是使用 FULLTEXT 而不是 LIKE 。但是 MYSQL FULLTEXT 對漢字並不友好,如果需要使用全文索引,建議使用搜索引擎 ES,可以參考我的另一篇博客: https://www.cnblogs.com/keatsCoder/p/11341835.html

    • 數據庫是不斷變化的實體。一組優化良好的表一會兒后可能就面目全非了。由於表的使用和內容的更改,理想的優化和配置也會改變。

    • 最重要的規則就是,每條規則在某些條件下都會被打破。

    實際開發過程中,我們需要根據業務的需要,開啟慢查詢日誌,然後針對慢SQL,不斷地進行 EXPLAIN 與修改SQL和索引,以求達到 ref 級別,至少達到 range 級別。這就需要強大的內功支持而不是每次都通過百度來解決,希望閱讀此篇文章的你和我一起不斷修鍊。加油!

    常用的函數

    文本處理函數

    日期和時間處理函數

    數值處理函數

    聚合函數

    • 雖然 MAX() 一般用來找出最大的數值或日期值,但MySQL允許將它用來返回任意列中的最大值,包括返迴文本列中的最大值。在用於文本數據時,如果數據按相應的列排序,則 MAX() 返回最後一行。MIN() 函數類似
    • MAX() 函數忽略列值為 NULL 的行。MIN() 函數類似,SUM() 也是

    附錄

    由於數中所附的附件內容(建表語句即數據插入語句)需要外網才能訪問,為了方便大家使用。這裏我已經下載下來附在了這篇博客裏面。如果不需要這些語句,可以直接通過網頁右邊的目錄跳躍到下一章進行瀏覽

    建表語句

    ########################################
    # MySQL Crash Course MYSQL必知必會建表語句
    # http://www.forta.com/books/0672327120/
    # 提供者博客園:后青春期的Keats 複製請註明出處
    ########################################
    
    
    ########################
    # Create customers table
    ########################
    CREATE TABLE customers
    (
      cust_id      int       NOT NULL AUTO_INCREMENT,
      cust_name    char(50)  NOT NULL ,
      cust_address char(50)  NULL ,
      cust_city    char(50)  NULL ,
      cust_state   char(5)   NULL ,
      cust_zip     char(10)  NULL ,
      cust_country char(50)  NULL ,
      cust_contact char(50)  NULL ,
      cust_email   char(255) NULL ,
      PRIMARY KEY (cust_id)
    ) ENGINE=InnoDB;
    
    #########################
    # Create orderitems table
    #########################
    CREATE TABLE orderitems
    (
      order_num  int          NOT NULL ,
      order_item int          NOT NULL ,
      prod_id    char(10)     NOT NULL ,
      quantity   int          NOT NULL ,
      item_price decimal(8,2) NOT NULL ,
      PRIMARY KEY (order_num, order_item)
    ) ENGINE=InnoDB;
    
    
    #####################
    # Create orders table
    #####################
    CREATE TABLE orders
    (
      order_num  int      NOT NULL AUTO_INCREMENT,
      order_date datetime NOT NULL ,
      cust_id    int      NOT NULL ,
      PRIMARY KEY (order_num)
    ) ENGINE=InnoDB;
    
    #######################
    # Create products table
    #######################
    CREATE TABLE products
    (
      prod_id    char(10)      NOT NULL,
      vend_id    int           NOT NULL ,
      prod_name  char(255)     NOT NULL ,
      prod_price decimal(8,2)  NOT NULL ,
      prod_desc  text          NULL ,
      PRIMARY KEY(prod_id)
    ) ENGINE=InnoDB;
    
    ######################
    # Create vendors table
    ######################
    CREATE TABLE vendors
    (
      vend_id      int      NOT NULL AUTO_INCREMENT,
      vend_name    char(50) NOT NULL ,
      vend_address char(50) NULL ,
      vend_city    char(50) NULL ,
      vend_state   char(5)  NULL ,
      vend_zip     char(10) NULL ,
      vend_country char(50) NULL ,
      PRIMARY KEY (vend_id)
    ) ENGINE=InnoDB;
    
    ###########################
    # Create productnotes table
    ###########################
    CREATE TABLE productnotes
    (
      note_id    int           NOT NULL AUTO_INCREMENT,
      prod_id    char(10)      NOT NULL,
      note_date datetime       NOT NULL,
      note_text  text          NULL ,
      PRIMARY KEY(note_id),
      FULLTEXT(note_text)
    ) ENGINE=MyISAM;
    
    
    #####################
    # Define foreign keys
    #####################
    ALTER TABLE orderitems ADD CONSTRAINT fk_orderitems_orders FOREIGN KEY (order_num) REFERENCES orders (order_num);
    ALTER TABLE orderitems ADD CONSTRAINT fk_orderitems_products FOREIGN KEY (prod_id) REFERENCES products (prod_id);
    ALTER TABLE orders ADD CONSTRAINT fk_orders_customers FOREIGN KEY (cust_id) REFERENCES customers (cust_id);
    ALTER TABLE products ADD CONSTRAINT fk_products_vendors FOREIGN KEY (vend_id) REFERENCES vendors (vend_id);

    數據語句

    ########################################
    # MySQL Crash Course MYSQL必知必會數據語句
    # http://www.forta.com/books/0672327120/
    # 提供者博客園:后青春期的Keats 複製請註明出處
    ########################################
    
    
    ##########################
    # Populate customers table
    ##########################
    INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
    VALUES(10001, 'Coyote Inc.', '200 Maple Lane', 'Detroit', 'MI', '44444', 'USA', 'Y Lee', 'ylee@coyote.com');
    INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact)
    VALUES(10002, 'Mouse House', '333 Fromage Lane', 'Columbus', 'OH', '43333', 'USA', 'Jerry Mouse');
    INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
    VALUES(10003, 'Wascals', '1 Sunny Place', 'Muncie', 'IN', '42222', 'USA', 'Jim Jones', 'rabbit@wascally.com');
    INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
    VALUES(10004, 'Yosemite Place', '829 Riverside Drive', 'Phoenix', 'AZ', '88888', 'USA', 'Y Sam', 'sam@yosemite.com');
    INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact)
    VALUES(10005, 'E Fudd', '4545 53rd Street', 'Chicago', 'IL', '54545', 'USA', 'E Fudd');
    
    
    ########################
    # Populate vendors table
    ########################
    INSERT INTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
    VALUES(1001,'Anvils R Us','123 Main Street','Southfield','MI','48075', 'USA');
    INSERT INTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
    VALUES(1002,'LT Supplies','500 Park Street','Anytown','OH','44333', 'USA');
    INSERT INTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
    VALUES(1003,'ACME','555 High Street','Los Angeles','CA','90046', 'USA');
    INSERT INTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
    VALUES(1004,'Furball Inc.','1000 5th Avenue','New York','NY','11111', 'USA');
    INSERT INTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
    VALUES(1005,'Jet Set','42 Galaxy Road','London', NULL,'N16 6PS', 'England');
    INSERT INTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
    VALUES(1006,'Jouets Et Ours','1 Rue Amusement','Paris', NULL,'45678', 'France');
    
    
    #########################
    # Populate products table
    #########################
    INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
    VALUES('ANV01', 1001, '.5 ton anvil', 5.99, '.5 ton anvil, black, complete with handy hook');
    INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
    VALUES('ANV02', 1001, '1 ton anvil', 9.99, '1 ton anvil, black, complete with handy hook and carrying case');
    INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
    VALUES('ANV03', 1001, '2 ton anvil', 14.99, '2 ton anvil, black, complete with handy hook and carrying case');
    INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
    VALUES('OL1', 1002, 'Oil can', 8.99, 'Oil can, red');
    INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
    VALUES('FU1', 1002, 'Fuses', 3.42, '1 dozen, extra long');
    INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
    VALUES('SLING', 1003, 'Sling', 4.49, 'Sling, one size fits all');
    INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
    VALUES('TNT1', 1003, 'TNT (1 stick)', 2.50, 'TNT, red, single stick');
    INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
    VALUES('TNT2', 1003, 'TNT (5 sticks)', 10, 'TNT, red, pack of 10 sticks');
    INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
    VALUES('FB', 1003, 'Bird seed', 10, 'Large bag (suitable for road runners)');
    INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
    VALUES('FC', 1003, 'Carrots', 2.50, 'Carrots (rabbit hunting season only)');
    INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
    VALUES('SAFE', 1003, 'Safe', 50, 'Safe with combination lock');
    INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
    VALUES('DTNTR', 1003, 'Detonator', 13, 'Detonator (plunger powered), fuses not included');
    INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
    VALUES('JP1000', 1005, 'JetPack 1000', 35, 'JetPack 1000, intended for single use');
    INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
    VALUES('JP2000', 1005, 'JetPack 2000', 55, 'JetPack 2000, multi-use');
    
    
    
    #######################
    # Populate orders table
    #######################
    INSERT INTO orders(order_num, order_date, cust_id)
    VALUES(20005, '2005-09-01', 10001);
    INSERT INTO orders(order_num, order_date, cust_id)
    VALUES(20006, '2005-09-12', 10003);
    INSERT INTO orders(order_num, order_date, cust_id)
    VALUES(20007, '2005-09-30', 10004);
    INSERT INTO orders(order_num, order_date, cust_id)
    VALUES(20008, '2005-10-03', 10005);
    INSERT INTO orders(order_num, order_date, cust_id)
    VALUES(20009, '2005-10-08', 10001);
    
    
    ###########################
    # Populate orderitems table
    ###########################
    INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20005, 1, 'ANV01', 10, 5.99);
    INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20005, 2, 'ANV02', 3, 9.99);
    INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20005, 3, 'TNT2', 5, 10);
    INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20005, 4, 'FB', 1, 10);
    INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20006, 1, 'JP2000', 1, 55);
    INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20007, 1, 'TNT2', 100, 10);
    INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20008, 1, 'FC', 50, 2.50);
    INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20009, 1, 'FB', 1, 10);
    INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20009, 2, 'OL1', 1, 8.99);
    INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20009, 3, 'SLING', 1, 4.49);
    INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
    VALUES(20009, 4, 'ANV03', 1, 14.99);
    
    #############################
    # Populate productnotes table
    #############################
    INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
    VALUES(101, 'TNT2', '2005-08-17',
    'Customer complaint:
    Sticks not individually wrapped, too easy to mistakenly detonate all at once.
    Recommend individual wrapping.'
    );
    INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
    VALUES(102, 'OL1', '2005-08-18',
    'Can shipped full, refills not available.
    Need to order new can if refill needed.'
    );
    INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
    VALUES(103, 'SAFE', '2005-08-18',
    'Safe is combination locked, combination not provided with safe.
    This is rarely a problem as safes are typically blown up or dropped by customers.'
    );
    INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
    VALUES(104, 'FC', '2005-08-19',
    'Quantity varies, sold by the sack load.
    All guaranteed to be bright and orange, and suitable for use as rabbit bait.'
    );
    INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
    VALUES(105, 'TNT2', '2005-08-20',
    'Included fuses are short and have been known to detonate too quickly for some customers.
    Longer fuses are available (item FU1) and should be recommended.'
    );
    INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
    VALUES(106, 'TNT2', '2005-08-22',
    'Matches not included, recommend purchase of matches or detonator (item DTNTR).'
    );
    INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
    VALUES(107, 'SAFE', '2005-08-23',
    'Please note that no returns will be accepted if safe opened using explosives.'
    );
    INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
    VALUES(108, 'ANV01', '2005-08-25',
    'Multiple customer returns, anvils failing to drop fast enough or falling backwards on purchaser. Recommend that customer considers using heavier anvils.'
    );
    INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
    VALUES(109, 'ANV03', '2005-09-01',
    'Item is extremely heavy. Designed for dropping, not recommended for use with slings, ropes, pulleys, or tightropes.'
    );
    INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
    VALUES(110, 'FC', '2005-09-01',
    'Customer complaint: rabbit has been able to detect trap, food apparently less effective now.'
    );
    INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
    VALUES(111, 'SLING', '2005-09-02',
    'Shipped unassembled, requires common tools (including oversized hammer).'
    );
    INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
    VALUES(112, 'SAFE', '2005-09-02',
    'Customer complaint:
    Circular hole in safe floor can apparently be easily cut with handsaw.'
    );
    INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
    VALUES(113, 'ANV01', '2005-09-05',
    'Customer complaint:
    Not heavy enough to generate flying stars around head of victim. If being purchased for dropping, recommend ANV02 or ANV03 instead.'
    );
    INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
    VALUES(114, 'SAFE', '2005-09-07',
    'Call from individual trapped in safe plummeting to the ground, suggests an escape hatch be added.
    Comment forwarded to vendor.'
    );

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
    【其他文章推薦】

    ※帶您來了解什麼是 USB CONNECTOR  ?

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

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

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

    ※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益