跳到主要內容

發表文章

目前顯示的是 9月, 2019的文章

機器學習實記(一)簡介機器學習

一.寫在前面    本系列中的內容來自對李宏毅老師的機器學習教程的理解和一些個人理解的筆記,主要用於之後方便查看複習。李宏毅老師的機器學習教程地址:https://www.bilibili.com/video/av35932863?from=search&seid=3902369523652897681。 二.機器學習概念 2.1人工智能、機器學習、深度學習這幾個概念的關係    要想理解清楚機器學習的基本概念,首先要明白機器學習在人工智能領域中所處的位置,再簡單明了些首先要明白人工智能、機器學習、深度學習這幾個概念的關係。三者關係如下圖2-1                        圖2-1 人工智能、機器學習、深度學習三者關係 從圖可以直觀的看出,人工智能的範圍>機器學習的範圍>深度學習的範圍,而平時常說的神經網絡的這些有關概念則是屬於深度學習下的分支。再具體而言這三者的關係,其實人工智能是作為我們最終所要達到的目標,所謂的人工智能概念我覺的用之前某科學家提過的一種說法簡單理解一下就行,即當用一塊黑幕將計算機遮蓋起來,黑幕外的人無法區分所交互的對象是人還是計算機就算是達到了人工智能標準,再簡單點說就是使計算機做到過去只有人才能做到的事,其他更為深入的解釋歡迎查看百度詞條https://baike.baidu.com/item/人工智能/9180?fr=aladdin。而機器學習則是實現人工智能這一目標的手段,這說明還有其他手段有興趣的同學可以自行去了解一下,不過個人認為其餘的手段不是現在的主流研究方向吧。而深度學習則是作為機器學習下的一個重要分支。 2.2 理解機器學習    所謂機器學習概念,簡單的理解就是教會計算機學習,舉個具體的例子,當你給它看完貓的某一張圖片后,你告訴機器這是貓,當你給它看完一張狗的圖片后,你告訴它這是狗,不斷重複這一過程讓機器學習大量不同的貓狗照片,學習結束后給予機器一張全新的貓或狗的照片,機器能夠成功的識別出貓和狗。再進一步抽象的理解,我們可以發現這一過程十分類似於數學上求解函數表達式,即這個過程其實是在尋找一個函數f,當輸入某張貓的照片函數f的輸出為貓,當輸入某張狗的照片函數f的輸出為狗。再進一步具體而言整個機器學習框架可以理解為如圖2-2   ...

【工具篇】在.Net中實現HTML生成圖片或PDF的幾種方式

前段時間由於項目上的需求,要在.Net平台下實現把HTML內容生成圖片或PDF文件的功能,特意在網上研究了幾種方案,這裏記錄一下以備日後再次使用。當時想着找一種開發部署都比較清爽並且運行穩定的方案,但實際上兩者同時滿足基本不可能,只能做一個自己覺得合適的取捨,下面從兩個維度(清爽指數和功能指數)逐一對比。 1.     WebBrowser 這種方案在開發時不依賴任務外部程序集和nuget包,部署時也不需要安裝額外的工具和服務,可以說是非常清爽了。它藉助了WinForm下的WebBrowser控件實現HTML內容渲染,並把渲染結果繪製在Bitmap中,進而保存成圖片或PDF文件。這種方案簡單粗暴,是C#中最基礎的實現方式,也是網上搜索結果最多的一種,下面看它的核心代碼(從網上拼湊得來): 1 class WebBrowserPage2Image 2 { 3 Bitmap m_Bitmap; 4 5 string m_Url; 6 7 public void Convert( string pageUrl, string fileName) 8 { 9 m_Url = pageUrl; 10 Thread m_thread = new Thread( new ThreadStart(HtmlDrawToBitmap)); 11 m_thread.SetApartmentState(ApartmentState.STA); 12 m_thread.IsBackground = true ; 13 m_thread.Start(); 14 m_thread.Join(); 15 MemoryStream stream = new MemoryStream(); 16 m_Bitmap.Save(stream, Sys...

docker (2)---存儲、網絡(利用docker容器上線靜態網站)

一、 docker底層依賴的核心技術 1 、命名空間 (Namespaces) 2 、控制組 (Control Groups) 3 、聯合文件系統 (Union File System) 4 、 Linux 虛擬網絡支持:本地和容器內創建虛擬接口 (1) 命名空間(Namespaces): 實現了容器間資源的隔離,每個容器擁有自己獨立的命名空間 , 運行其中的應用就像是運行在獨立的操作系統中一樣 , 我們都可以看到文件系統,網卡等資源保證了容器之間互不影響, namesaces 管理進程號 , 每個進程命名空間有一套自己的進程號管理方法 , 進 程命名空間是一個父子關係的結構 , 子空間中的進程對於父空間是可見的。 (2) 控制組 (Control Groups) :   控制組 (Control groups)--CGroups 是 Linux 內核的一個特性 , 主要用來對共享資源進行隔離、限制、審計等 。 cgroups 允許對於進程或進程組公平 ( 不公平 ) 的分配 CPU 時間、內存分配和 I/O 帶寬。 容器通過 cgroups 來得到所能夠管理資源的分配和使用。因此容器所獲得資源僅為所有系統資源的一個部分 1 、資源限制 : 內存子系統為進程組設置內存使用上限,內存達到上限后再申請內存,就會發出 Out of Memory 2 、 優先級 : 通過優先級讓一些組得到更多 CPU 等資源 3 、 資源審計 : 用來統計系統上實際把多少資源用到適合的目的上 , 可以使用 cpuacct 子系統記錄某個進程組使用的 CPU 時間 4 、 隔離 : 為組隔離名字空間 , 這樣一個組不會看到其他組的進程 . 網絡連接和文件系統 5 、 控制 : 掛起 . 恢復和啟動等操作 (3)聯合文件系統 (Union File System) :   docker 中使用 AUFS(another Union File System 或 v2 版本以後的 Advanced multi-layered Unification File System) 控製為每一個成員目錄設定只讀 / 讀寫 / 寫出權限 , 同時 AUFS 有一個類似分層的概念 , 對只讀權限的分支可以邏輯上進行增量的修改 ...

【劍指Offer】調整數組順序使奇數位於偶數前面

題目描述 輸入一個整數數組,實現一個函數來調整該數組中数字的順序,使得所有的奇數位於數組的前半部分,所有的偶數位於數組的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。 解法1 最直接的思路是再構建一個新數組,先遍歷一遍原數組,把其中的奇數依次添加到新數組中,再遍歷一遍原數組把其中的偶數依次添加到新數組中,時間複雜度為O(2n)。實現代碼如下 實現代碼 public int[] reOrderArray2(int[] array) { int[] arr = new int[array.Length]; int index = 0; for (int i = 0; i < array.Length; i++) { // 奇數 if ((array[i] % 2) != 0) { arr[index] = array[i]; index++; } } for (int i = 0; i < array.Length; i++) { // 偶數 if ((array[i] % 2) == 0) { arr[index] = array[i]; index++; } } return arr; } 解法2 C#的數組是不支持動態添加元素的,我們可以使用泛型List,來實現在指定位置插入元素。基本思路是遍歷原數組,依次將元素插入到List中,如果是偶數元素,默認插入到List的末尾。如果是奇數元素,則插入到所有的偶數元素之前(已插入的所有奇數元素之後),因此需要記錄最後插入的奇數元素的索引。實現代碼如下,算法的時間複雜度是O(n) 實現代碼 public int[] reOrderArray(int[] array) { List<int> list = new List<int>(); // 最後插入奇數元素的索引 int ...

多線程與高併發(一)多線程入門

一、基礎概念 多線程的學習從一些概念開始,進程和線程,併發與并行,同步與異步,高併發。 1.1 進程與線程 幾乎所有的操作系統都支持同時運行期多個任務,所有運行中的任務通常就是一個進程,進程是處於運行過程中的程序,進程是操作系統進行資源分配和調度的一個獨立單位。 進程有三個如下特徵: 獨立性:進程是系統中獨立存在的實體,它可以擁有自己獨立的資源,每一個進程都擁有自己私有的地址空間。在沒有經過進程本身允許的情況下,一個用戶進程不可以直接訪問其他進程的地址空間。 動態性:進程與程序的區別在於,程序只是一個靜態的指令集合,而進程是一個正在系統中活動的指令集合。在進程中加入了時間的概念,進程具有自己的生命周期和各種不同的狀態,這些概念在程序中部是不具備的。 併發性:多個進程可以在單個處理器上併發執行,多個進程之間不會互相影響。 線程是進程的組成部分,一個進程可以擁有多個線程,而線程必須有一個父進程,線程可以有自己的堆棧、自己的程序計數器和自己的局部變量,但不擁有系統資源。比如使用QQ時,我們可以同事傳文件,發送圖片,聊天,這就是多個線程在進行。 線程可以完成一定的任務,線程能夠獨立運行的,它不知道有其他線程的存在,線程的執行是搶佔式的,當前線程隨時可能被掛起。 總之:一個程序運行后至少有一個進程,一個進程里可以有多個線程,但至少要有一個線程。 1.2 併發和并行 併發和并行是比較容易混淆的概念,他們都表示兩個或者多個任務一起執行,但併發側重多個任務交替執行,同一時刻只能有一條指令執行,但多個進程指令被快速輪換執行,使得在宏觀上具有多個進程同時執行的效果。而并行確實真正的同時執行,有多條指令在多個處理器上同時執行,并行的前提條件就是多核CPU。 1.3 同步和異步 同步和異步通常用來形容一次方法調用。同步方法調用一旦開始,調用者必須等到方法調用返回后,才能繼續後續的行為。異步方法調用更像一個消息傳遞,一旦開始,方法調用就會立即返回,調用者可以繼續後續的操作。 1.4 高併發 高併發一般是指在短時間內遇到大量操作請求,非常具有代表性的場景是秒殺活動與搶票,高併發是互聯網分佈式系統架構設計中必須考慮的因素之一,高併發相關常用的一些指標有響應時間(Response Time),吞吐量(Th...

Git的使用 -- 用git玩翻github,結尾有驚喜!有驚喜!有驚喜!林妙妙看了說:牛呲呼啦帶閃電 (三)(超詳解)

簡介       上一篇主要講解的是Git安裝及配置,這一篇就詳細的從無到有的來用Git玩翻github。 一、什麼是Github Github是全球最大的社交編程及代碼託管網站(https://github.com/)。 Github可以託管各種git庫,並提供一個web界面(用戶名.github.io/倉庫名) 二、Github和Git是什麼關係   Git是版本控制軟件 Github是項目代碼託管的平台,藉助git來管理項目代碼 1、 使用Github 目的:藉助github託管項目代碼 2、基本概念 a、倉庫(Repository)  倉庫的意思,即你的項目,你想在 GitHub 上開源一個項目,那就必須要新建一個 Repository ,如果你開源的項目多了,你就擁有了多個 Repositories 。  倉庫用來存放項目代碼,每個項目對應一個倉庫,多個開源項目則有多個倉庫。 b、收藏(Star) 倉庫主頁star按鈕,意思為收藏項目的人數,收藏項目,方便下次查看,在 GitHub 上如果你有一個項目獲得100個star都算很不容易了! 【如何收藏】  操作:打開對應項目主頁,點擊右上角  star 按鈕即可收藏  情景:張三無意訪問到李四的開源項目感覺不錯並進行收藏   【如何查看自己得收藏】   c、複製項目(Fork)派生 這個不好翻譯,如果實在要翻譯我把他翻譯成分叉,什麼意思呢?你開源了一個項目,別人想在你這個項目的基礎上做些改進,然後應用到自己的項目中,這個時候他就可以 Fork 你的項目(打開項目主頁點擊右上角的fork按鈕即可),然後他的 GitHub 主頁上就多了一個項目,只不過這個項目是基於你的項目基礎(本質上是在原有項目的基礎上新建了一個分支),他就可以隨心所欲的去改進,但是絲毫不會影響原有項目的代碼與結構。 注意:該fork的項目時獨立存在的 比如:張三fork了李四的項目,相當於張三複制了李四的項目,所以自己也單獨有了一個一樣名稱的倉庫(注:該倉庫會聲明來自於李四,但是獨立存在) d、發起請求(Pu...

kubeadm1.14.1 安裝Metrics Server

Metrics API 介紹Metrics-Server之前,必須要提一下Metrics API的概念 Metrics API相比於之前的監控採集方式(hepaster)是一種新的思路,官方希望核心指標的監控應該是穩定的,版本可控的,且可以直接被用戶訪問(例如通過使用 kubectl top 命令),或由集群中的控制器使用(如HPA),和其他的Kubernetes APIs一樣。 官方廢棄heapster項目,就是為了將核心資源監控作為一等公民對待,即像pod、service那樣直接通過api-server或者client直接訪問,不再是安裝一個hepater來匯聚且由heapster單獨管理。 假設每個pod和node我們收集10個指標,從k8s的1.6開始,支持5000節點,每個節點30個pod,假設採集粒度為1分鐘一次,則: 10 x 5000 x 30 / 60 = 25000 平均每分鐘2萬多個採集指標 因為k8s的api-server將所有的數據持久化到了etcd中,顯然k8s本身不能處理這種頻率的採集,而且這種監控數據變化快且都是臨時數據,因此需要有一個組件單獨處理他們,k8s版本只存放部分在內存中,於是metric-server的概念誕生了。 其實hepaster已經有暴露了api,但是用戶和Kubernetes的其他組件必須通過master proxy的方式才能訪問到,且heapster的接口不像api-server一樣,有完整的鑒權以及client集成。這個api現在還在alpha階段(18年8月),希望能到GA階段。類api-server風格的寫法: generic apiserver ​ 有了Metrics Server組件,也採集到了該有的數據,也暴露了api,但因為api要統一,如何將請求到api-server的 /apis/metrics 請求轉發給Metrics Server呢,解決方案就是: kube-aggregator ,在k8s的1.7中已經完成,之前Metrics Server一直沒有面世,就是耽誤在了kube-aggregator這一步。 kube-aggregator(聚合api)主要提供: Provide an API for registering API server...

微信小程序入口場景的問題整理與相關解決方案

前言 最近一段時間都在做小程序。 雖然是第二次開發小程序,但是上次做小程序已經是一年前的事了,所以最終還是被坑得死去活來。 這次是從零開始開發一個小程序,其實除了一些莫名其妙的兼容性問題,大多數坑點都是在微信小程序的各個入口場景處。 所以這裏整理一下微信小程序的各個入口場景,以及從這些入口場景進入小程序會面臨的問題以及解決方案。 這裏只列出常用的幾種場景: [簡單場景]啟動小程序並進入 [簡單場景]退出重進(啟動小程序后,退出小程序,再次進入小程序) [簡單場景]退出重進首頁(啟動小程序后,退出小程序,通過掃二維碼再次進入小程序) [複雜場景]啟動並進入指定頁面(從小程序的分享卡片或者微信發送的通知消息進入小程序) [複雜場景]退出重進指定頁面(啟動小程序后,退出小程序,從小程序的分享卡片或者微信發送的通知消息進入小程序) 啟動小程序並進入 微信小程序的入口場景光微信提供的場景值就有幾十種,但是絕大多數都可以劃分為啟動小程序並進入。 這是最常用的一種進入小程序的方式,比如通過搜索進入或者點擊最近使用小程序的方式進入,都算是這種類型。 這一場景下,首先我們需要明白髮生了什麼: 下載小程序 => 啟動小程序 onLaunch事件觸發 => 加載首頁 onLoad事件觸發 => 首頁 onShow事件 然後在這個場景下,需要注意以下幾個問題: 這個場景下一般會涉及到登錄。 所謂登錄,不一定是要在這個階段做,但是登錄信息的判斷這個階段是一定要做的。 通常前端肯定是要將登錄的這些信息存儲在小程序的storage里,然後在onLaunch事件中判斷是否登錄,沒登錄就跳轉到登錄頁面,登錄了就跳轉到首頁。 這裏的登錄判斷一定要放在onLaunch,而不要放在首頁的onLoad裏面,因為小程序啟動一定會進入onLaunch,而不一定會進入首頁的onLoad。 而登錄頁面在設計的時候最好要加上一個url參數,傳入登錄成功后跳轉到的頁面地址,而不是登錄之後始終跳轉到首頁,後面會講為什麼需要這麼做。 onLaunch階段是否有發出請求,並在請求完成後進行了頁面跳轉,或者請求完成設置storage,並在onLoad頁面中使用? 這種情況的出現,會導致在請求時間過長...

在 Ubuntu 開啟 GO 程序編譯之旅

本文將使用 putty 連接到一台阿里雲 Ubuntu 16.04 服務器,在其上安裝 go 語言的編譯環境,旨在呈現從安裝到"你好,世界!"涉及的方方面面,希望完成這個過程無須覓它處。 1. 安裝 方式一使用 apt-get apt-get install golang-go 執行完成之後,會把 golang 安裝在這個位置: /usr/lib/go-1.6/ ,go 命令會在該目錄的 bin 子目錄下,同時,/usr/bin 下會有該命令的文件鏈接。 當然,也許你並不知道到底安裝在哪,可以通過以下命令找找觀察判斷一下。 # 找名字為 go 的文件 find / -name go 執行 /usr/bin/go version ,結果如下,显示的版本號為 go1.6.2,版本比較低。 是不是想卸載?使用以下命令可以完成卸載,跟安裝一一對應。 apt-get --purge remove golang-go 方式二使用 wget 直接下載想要的版本進行安裝,一切皆在掌控之中。通過以下兩條命令,我們把 golang 安裝在 /usr/local/go 下。 # 下載 wget https://storage.googleapis.com/golang/go1.9.1.linux-amd64.tar.gz # 解壓 tar -xzf go1.9.1.linux-amd64.tar.gz -C /usr/local 2. 設置環境變量 這裡會涉及到3個環境變量,分別是 PATH、GOROOT、GOPATH。 PATH ,是為了讓 go 命令隨處可敲。 GOROOT ,代表 golang 的根目錄,在設置PATH時可以用一下,如 export PATH=$GOROOT/bin。 GOPATH ,特別重要,單獨做一節(2.2)來講。 2.1 設置 環境變量可以設置在不同的文件中。 etc/profile : 對所有用戶生效 ~/.profile : 對當前用戶生效 配置在哪都行,能用到即可。在配置文件末尾加上以下文本。 export GOROOT=/usr/local/go export GOPATH=/usr/goprojs export PATH=$GORO...