Home 程式開發

程式開發

Swift – PropertyWrapper

一、知識點 Property Wrapper,即屬性包裝器,其作用是將屬性的 定義代碼 與屬性的存儲方式代碼 進行分離,抽取的管理的存儲代碼只需要編寫一次,即可將功能應用於其它屬性上。 1、基礎用法 功能需求:確保值始終小於或等於12 這里我們直接使用 property wrapper 進行封裝演示 @propertyWrapper struct TwelveOrLess { private var number: Int // wrappedValue變量的名字是固定的 var wrappedValue: Int { get { return number } set { number =...

「圖解」ARP協議(一)

一、ARP概述 如果要在TCP/IP協議棧中選擇一個"最不安全的協議",那麼我會毫不猶豫把票投給ARP協議。我們經常聽到的這些術語,包括"網絡掃描"、"內網滲透"、"中間人攔截"、"區域網流控"、"流量欺騙",基本都跟ARP脫不了干係。大量的安全工具,例如大名鼎鼎的Cain、功能完備的Ettercap、操作傻瓜式的P2P終結者,底層都要基於ARP實現。 聽上去這麼"逆天"的協議,其實技術原理又簡單的難以置信,例如ARP整個完整交互過程僅需要兩個包,一問一答即可搞定!但是ARP協議也有它令初學者迷惑的地方,例如由它本身延伸出來的"代理ARP"、"免費ARP"、"翻轉ARP"、"逆向ARP",而這些不同種類的ARP,又應用於不同的場景。好吧,在深入到技術原理之前,作為初學者,我們先記住下面三句話: ①ARP(Address Resolution Protocol)即地址解析協議, 用於實現從 IP 地址到 MAC 地址的映射,即詢問目標IP對應的MAC地址。 ②在網絡通信中,主機和主機通信的數據包需要依據OSI模型從上到下進行數據封裝,當數據封裝完整後,再向外發出。所以在區域網的通信中,不僅需要源目IP位址的封裝,也需要源目MAC的封裝。 ③一般情況下,上層應用程式更多關心IP位址而不關心MAC地址,所以需要通過ARP協議來獲知目的主機的MAC地址,完成數據封裝。 接下來,我們通過圖解的方式來深入了解ARP協議是如何工作的。 二、ARP原理之請求應答 同一個區域網里面,當PC1需要跟PC2進行通信時,此時PC1是如何處理的? 根據OSI數據封裝順序,發送方會自頂向下(從應用層到物理層)封裝數據,然後發送出去,這里以PC1 ping PC2的過程舉例==> PC1封裝數據並且對外發送數據時,上圖中出現了"failed",即數據封裝失敗了,為什麼? 我們給PC1指令-"ping ip2",這就告知了目的IP,此時PC1便有了通信需要的源目IP位址,但是PC1仍然沒有通信需要的目的MAC地址。這就好比我們要寄一個快遞,如果在快遞單上僅僅寫了收件人的姓名(IP),卻沒有寫收件人的地址(MAC),那麼這個快遞就沒法寄出,因為信息不完整。 那麼,現在PC1已經有了PC2的IP位址信息,如何獲取到PC2的MAC地址呢?此時,ARP協議就派上用場了。我們接著上面這張圖,繼續==> 通過第三和第四步驟,我們看到PC1和PC2進行了一次ARP請求和回復過程,通過這個交互工程,PC1便具備了PC2的MAC地址信息。 接下來PC1會怎麼做呢?在真正進行通信之前,PC1還會將PC2的MAC信息放入本地的【ARP緩存表】,表里面放置了IP和MAC地址的映射信息,例如 IP2<->MAC2。接下來,PC1再次進行數據封裝,正式進入PING通信,如下==> 小結:經過上面6個步驟的處理,PC1終於把數據包發送出去了,之後便可以進行正常的通信了。看到了吧,ARP的功能和實現過程是如此的簡單:它在發送方需要目標MAC地址的時及時出手,通過"一問一答"的方式獲取到特定IP對應的MAC地址,然後存儲到本地【ARP緩存表】,後續需要的話,就到這里查找。 既然是"緩存"表,意味著它有時效性,並且如果電腦或者通信設備重啟的話,這張表就會清空;也就是說,如果下次需要通信,又需要進行ARP請求。在我們的windows/macos系統下,可以通過命令行"arp -a"查看具體信息=> 三、ARP原理之廣播請求單播回應 上面的圖解過程看上去簡單又純粹,好像我們就已經把這個協議的精髓全部get到,但其實,我們只是剛揭開了它的面紗,接下來我們才真正進入正題。例如,上面的圖解過程中,整個區域網(LAN)只有PC1和PC2兩個主機,所以這個一問一答過程非常的順暢。 而實際網絡中,這個LAN可能有幾十上百的主機,那麼請問,PC1如何將這個【ARP請求包】順利的交給PC2,而PC2又如何順利的把【ARP回應包】返回給PC1? 我們看下面的圖: 為了營造出"幾十上百"的效果,這里多添加了2個主機進來 ( ω ),並且增加了有線和無線的環境。那麼,在多主機環境下,PC1現在發出的ARP請求包,怎麼交到PC2手里? 這時,ARP協議就需要採用乙太網的"廣播"功能:將請求包以廣播的形式發送,交換機或WiFi設備(無線路由器)收到廣播包時,會將此數據發給同一區域網的其他所有主機。 那麼,什麼是廣播?對於初學者而言,我們只需要知道,大部分的廣播包,它們有一個共同特徵:二層封裝時目的MAC是全f(ffff.ffff.ffff)或三層封裝時目的IP是全1(255.255.255.255)。可以這樣更方便的記住:目的地址最大的,就是廣播。 註明:廣播根據所在層次可分為二層廣播和三層廣播,根據發生範圍可分為本地廣播和定向廣播,大家們有興趣可以自己再去拓展下。 接下來我們來看下這個ARP廣播請求包接下來是如何工作的? 根據上圖我們看到,PC1發送的請求廣播包同時被其他主機收到,然後PC3和PC4收到之後(發現不是問自己)則丟棄。而PC2收到之後,根據請求包里面的信息(有自己的IP位址),判斷是給自己的,所以不會做丟棄動作,而是返回ARP回應包。 ARP請求是通過廣播方式來實現的,那麼,PC2返回ARP回應包,是否也需要通過廣播來實現呢?答案是否定的。大部分網絡協議在設計的時候,都需要保持極度克制,不需要的交互就砍掉,能合併的信息就合併,能不用廣播就用單播,以此讓帶寬變得更多讓網絡變得更快。 那麼,ARP回應包是如何處理的?這里需要特別關注ARP請求包的內容,在上面的圖解里面,ARP請求包的完整信息是:我的IP位址是IP1,MAC地址是MAC1,請問誰是PC2,你的IP2對應的MAC地址是多少? 簡單來說,ARP請求首先有"自我介紹",然後才是詢問。這樣的話,PC2在收到請求之後,就可以將PC1的IP和MAC映射信息存儲在本地的【ARP緩存表】,既然知道PC1在哪里,就可以返回ARP單播回應包。 這張圖我們需要得到兩個信息:①被詢問者PC2先生成了ARP映射信息,然後才是詢問者PC1;②PC3和PC4等其他主機,無法收到這個ARP回應包,因為是單播形式。 小結:ARP協議通過"一問一答"實現交互,但是"問"和"答"都有講究,"問"是通過廣播形式實現,"答"是通過單播形式。 四、ARP數據包解讀 為了讓大家更好的理解ARP協議以及廣播和單播的概念,我們來看一下用Wireshark抓取到的真實網絡中的ARP過程,通過數據包的方式來呈現,地址信息如下,部分MAC信息隱去。(建議初學者用GNS3配合Wireshark來抓取協議包進行分析,相比真實網絡更加乾淨,方便分析) 主機1 <---> 主機2 主機1: IP1 10.1.20.64 MAC1:00:08:ca:xx:xx:xx 主機2: IP2 10.1.20.109 MAC2:44:6d:57:xx:xx:xx 【ARP請求包】 【ARP回應包】 【ARP協議欄位解讀】 Hardware...

HTTP 協議的前世今生

你知道當我們在網頁瀏覽器的地址欄中輸入 URL 時,Web 頁面是如何呈現的嗎? 0. 前言 你知道當我們在網頁瀏覽器的地址欄中輸入 URL 時,Web 頁面是如何呈現的嗎? Web 介面當然不會憑空出來,根據 Web 瀏覽器地址欄中指定的 URL,Web 使用一種名為 HTTP 的協議作為規範,完成從客戶端到服務端的一些流程。可以說,Web 是建立在 HTTP 協議上進行通信的。 1. HTTP 的誕生 其實,在 1983 年 3 月之前,網際網路還只屬於少數人,全世界的網民之間的信息是無法共享的。在這一網際網路的黎明時期,HTTP...

滲透神器:burpsuit教程 (漢化+Repeater)

前言:釋疑解惑 《BP使用教程一》發布後,後台收到了許多大家的私信問BP是怎麼漢化的,在這里統一為大家解答一下。 BP的漢化依賴於漢化jar包,在啟動時引入漢化包即可,廢話不多說,直接上命令: java -Dfile.encoding=utf-8 -javaagent:BurpSuiteChs.jar -noverify -javaagent:BurpSuiteLoader.jar -jar burpsuite_pro_v2020.12.1.jar 效果如下: 使用這種方法每次啟動的時候都需要額外開啟一個DOS窗口,萬一不小心關了直接GG,特別是當多個類似應用同時開啟時,黑框框簡直要命,鑒於此為大家提供一種方案可以隱藏DOS窗口 上述啟動BP命令可以替代為: set ws=createobject("wscript.shell") ws.run("cmd /c java -Dfile.encoding=utf-8 -javaagent:BurpSuiteChs.jar -noverify -javaagent:BurpSuiteLoader.jar -jar burpsuite_pro_v2020.12.1.jar"),vbhide 將內容保存為xxx.vbs雙擊就可以了,但是要注意路徑不能有空格否則會報錯 注意:先正常安裝後再用腳本一鍵啟動 完整的BP12.1版本已為各位備好 連結:https://pan.baidu.com/s/1LPbDDPrOi9GbpEU0MQDbbQ 提取碼:9cro 解壓密碼從下圖尋找 0x00 正文 上回為大家演示了了BP的proxy模塊,並將Proxy的截斷功能類比為數據來源器。數據有了之後就是對其進行操作了,本節繼續演示BP的Repeater模塊 0x01 簡介 Repeater(中繼器)模塊支持手動修改數據包並重新發送 HTTP 請求,同時還提供了歷史記錄方便分析數據包。可以通過手動調整HTTP請求來測試目標系統。 0x02 使用演示 啟動BP並切換至Repeater 頁面比較簡潔明了,接下來打開個測試站點演示一下。 本次測試目標: 10.1.1.15:7001 ,打開瀏覽器訪問一下 開啟截斷模式,輸入一組帳號點擊登錄 此時BP成功攔截到了登錄的HTTP數據包,將數據包發送到Repeater 回到Repeater查看 點擊發送即可發送HTTP數據包 在請求和響應欄中有幾個選項,分別是 Pretty:格式化後的數據包 原始:原始的HTTP數據包 Render:將HTTP響應渲染成頁面 Action:對數據包進行操作 n:是否顯示換行符 修改數據包中的j_password參數為任意值重新發送 當發送了N次後突然想看之前的數據的話,可以通過數據包歷史尋找 在Repeater的Action中有幾項特有功能,接下來逐個進行演示,請大家注意分清是請求包還是響應包 複製數據包網址,省去了自行拼接URL的痛苦 在瀏覽器中顯示:將響應包發送至瀏覽器渲染頁面 注意:此處為了演示效果保留了原始的BP URL 0x03 END 本節對BP的Repeater模塊進行了簡單的描述,看完後記得多加練習! 另外需要這款工具的朋友請關注+轉發 私信【學習】二字獲取 來源:kknews滲透神器:burpsuit教程...

基於JESD204B的1 GS/s、16-bit數據採集系統研究

隨著微電子技術、半導體製造工藝的飛速發展,越來越多的數據採集系統基於「ADC+FPGA」的架構,實現定製化的性能參數。一般情況下,模擬信號輸入ADC進行模擬數字轉換,ADC輸出採樣數據至FPGA;當ADC輸出的採樣數據率高於FPGA內部邏輯資源的處理速率時,FPGA不能直接接收數據進入其內部邏輯資源,需要對輸入數據進行接收轉換、延時調整和降速處理等操作之後,才能進入FPGA內部處理;再通過外部總線協議讀取FPGA內部的緩存數據,做在線數據分析或離線數據分析。 國內對數據採集系統的研究正在蓬勃開展,取得了很大的進步和成果:2012年,中國科學技術大學唐紹春基於時間交替並行採樣技術研製了10 GS/s、8-bit的數據採集系統;2013年,中國科學院高能物理研究所鄒劍雄研製了4 GS/s、12-bit數據採集系統;2019年,中國科學技術大學梁昊研製雙通道5 GS/s、10-bit數據採集系統;2019年,成都電子科技大學周楠研製了5 GS/s、12-bit數據採集系統;2019年,成都電子科技大學蔣俊、楊擴軍基於時間交替並行採樣技術研製了20 GS/s、8-bit數據採集系統;2019年,中國工程物理研究院二所吳軍研製了6.4 GS/s、12-bit前置數據採集系統,應用於脈衝輻射場診斷。 國內外公司也推出很多的示波器產品等,包括中國的公司如普源精電科技(RIGOL)基於自研的鳳凰座(Phoenix)示波器ASIC晶片組,研製的DS8000示波器性能達到10 GS/s、8-bit。美國Tektronix公司研製的高解析度示波器如MSO58LP,性能達到3.125 GS/s、12-bit;美國Teledyne公司研製的高解析度示波器如HDO8108A,性能達到2.5 GS/s、12-bit,還有一款數據採集卡A勇者鬥惡龍7,性能達到10 GS/s、14-bit;美國Gage公司的Razormax數據採集卡對應指標為1 GS/s、16-bit,TB3-EON數據採集卡指標為6 GS/s、12-bit;美國Spectrum公司的M4x.2234-x4數據採集卡指標為5 GS/s、8-bit;美國Pico Technology公司的PicoScope6407數據採集卡性能為5 GS/s、8-bit;瑞士PSI研發的SIS3305數據採集卡性能為5 GS/s、10-bit等。 可以看到,對數據採集系統的性能參數更多關注在採樣率上,以提高數據採集系統的時間測量精度為目的,針對超快前沿的信號波形,用高採樣率獲取足夠精細的時間信息。本文主要研究了高解析度的數據採集系統,針對超大動態範圍的信號波形,用高解析度獲取足夠精細的幅度信息。總體來說,前述的數據採集系統的垂直解析度多為8-bit、12-bit,對應的動態範圍有限,約100倍、700倍,有效位低於10-bit,在幅度歸一化的情況下,最低可分辨1/700的滿量程電壓幅值。有些探測器輸出信號的動態範圍大於1 000倍,為了既獲取整體波形,又獲取波形細節,12-bit的解析度就不能滿足要求。這種情況下,一般通過信號分路、信道量程搭接等操作,實現對信號的精細測量;為保證信號測量的精度,相鄰測量信道量程必須有較大的重疊部分,這會降低信道有限的動態範圍;此外,各信道的幅值誤差不同、時間誤差不同,量程搭接時會導致測量精度降低。本文研製了一款採樣率為1 GS/s、解析度為16-bit的數據採集系統,採用一個信道對應一個探測器,既消除了分路、量程搭接引入的誤差影響,又節約了測量信道,實現了對大動態範圍信號的高精度測量。 作者信息: 李海濤1,2,李斌康1,2,田 耕1,2,阮林波1,2,張雁霞1,2 (1.西北核技術研究所,陝西 西安710024;2.強脈衝輻射環境模擬與效應國家重點實驗室,陝西 西安710024) 來源:kknews基於JESD204B的1 GS/s、16-bit數據採集系統研究

運用這100個python練習題,讓你的就業offer又快又多,轉發收藏

很多大家在學習python的時候,有時候會迷茫,不知道怎麼可以檢測出自己的水平是否很高,這次給大家帶了這100道python練習題幫助大家更好的掌握學習python! Python新手在謀求一份Python編程工作前,必須熟知Python的基礎知識。編程網站DataFlair的技術團隊分享了一份2021年最常見Python練習題合集,既有基本的Python面試題,也有高階版試題來指導你準備面試,試題均附有答案。面試題內容包括編碼、數據結構、腳本撰寫等話題。 1:Python有哪些特點和優點? 答:作為一門編程入門語言,Python主要有以下特點和優點: 可解釋 具有動態特性 面向對象 簡明簡單 開源 具有強大的社區支持 2:深拷貝和淺拷貝之間的區別是什麼? 答:深拷貝就是將一個對象拷貝到另一個對象中,這意味著如果你對一個對象的拷貝做出改變時,不會影響原對象。在Python中,我們使用函數deepcopy()執行深拷貝,導入模塊copy,如下所示: >>> import copy >>> b=copy.deepcopy(a) 而淺拷貝則是將一個對象的引用拷貝到另一個對象上,所以如果我們在拷貝中改動,會影響到原對象。我們使用函數function()執行淺拷貝,使用如下所示: >>> b=copy.copy(a) 3. 列表和元組之間的區別是? 答:二者的主要區別是列表是可變的,而元組是不可變的。舉個例子,如下所示: >>> mylist= >>> mylist=2 >>> mytuple=(1,3,3) >>> mytuple=2 Traceback (most recent call last): File "<pyshell#97>", line 1, in <module> mytuple=2 會出現以下報錯: 關於列表和元組的更多內容,可以查看這里: 從Q4到Q20都是針對新手的Python面試基礎試題,不過有經驗的人也可以看看這些問題,複習一下基礎概念。 4. 解釋一下Python中的三元運算子 不像C++,我們在Python中沒有?:,但我們有這個: if else 如果表達式為True,就執行中的語句。否則,就執行中的語句。 下面是使用它的方法: >>>...

明尼蘇達大學研究人員為什麼被踢出 Linux 內核貢獻者?

正如我們昨天報導的,明尼蘇達大學的研究人員被踢出了 Linux 貢獻群體,Linux 內核社區撤銷了之前他們提交的所有 Linux 內核代碼,並且,以後默認拒絕所有來自該大學的內核貢獻! 發生了什麼?是什麼讓 Linux 內核社區勃然大怒? 這一切始於 2021 年 4 月 6 日對 Linux 內核的一個看似無辜的修正檔。明尼蘇達大學的一名博士生(Aditya Pakki)提交了一個一共只修改/增加了兩行的小修正檔: Signed-off-by: Aditya Pakki 由於這個修正檔很簡單,而且似乎改善了代碼的質量,它最初得到了一些成員的支持,但後來在 4 月 9 日受到了 Eric...

大數據開發的MapReduce的編程怎麼弄?5步解決

很多人都是「一看就會,一做就廢」眼睛:我會了,我們開始吧!手:你會了我還沒會呢!在之前的hadoop是什麼中已經說過MapReduce採用了分而治之的思想,MapReduce主要分為兩部分,一部分是Map——分,一部分是Reduce——合,那麼MapReduce的編程該怎麼弄呢?下面5個步驟告訴你! 一、概念複習! (1)客戶端(Client):編寫mapreduce程序,配置作業,提交作業,這就是程式設計師完成的工作 (2)JobTracker:JobTracker是一個後台服務進程,啟動之後,會一直監聽並接收來自各個TaskTracker發送的心跳信息,包括資源使用情況和任務運行情況等信息。 1.作業控制:在hadoop中每個應用程式被表示成一個作業,每個作業又被分成多個任務,2.JobTracker的作業控制模塊則負責作業的分解和狀態監控。 狀態監控:主要包括TaskTracker狀態監控、作業狀態監控和任務狀態監控。主要作用:容錯和為任務調度提供決策依據。 3.JobTracker只有一個,他負責了任務的信息採集整理,你就把它當做包工頭把,這個和採用Master/Slave結構中的Master保持一致 4.JobTracker 對應於 NameNode 5.一般情況應該把JobTracker部署在單獨的機器上 (3)TaskTracker:TaskTracker是JobTracker和Task之間的橋樑。TaskTracker與JobTracker和Task之間採用了RPC協議進行通信。 1.從JobTracker接收並執行各種命令:運行任務、提交任務、殺死任務等 2.將本地節點上各個任務的狀態通過心跳周期性匯報給JobTracker,節點健康情況、資源使用情況,任務執行進度、任務運行狀態等,比如說map task我做完啦,你什麼時候讓reduce task過來拉數據啊 3.TaskTracker是運行在多個節點上的slaver服務。TaskTracker主動與JobTracker通信,接收作業,並負責直接執行每一個任務。 4.TaskTracker都需要運行在hdfs的DataNode上 (4)HDFS:保存作業的數據、配置信息等等,最後的結果也是保存在hdfs上面 1.NameNode: 管理文件目錄結構,接受用戶的操作請求,管理數據節點(DataNode) 2.DataNode:是HDFS中真正存儲數據的 3.Block:是hdfs讀寫數據的基本單位,默認64MB大小,就是說如果你有130MB數據,那就要分成三個block,兩個存放64MB,最後一個存放2MB數據,雖然最後一個block塊是64MB,但實際上占用空間為2MB 4.Sencondary NameNode:它的目的是幫助 NameNode 合併編輯日誌,減少 NameNode 啟動時間,在文件系統中設置一個檢查點來幫助NameNode更好的工作。它不是要取代掉NameNode也不是NameNode的備份。 認真複習了嗎?複習好了嗎?接下來就開始動手操作吧! 二、五步走! 整個MapReduce程序,所有數據以(key,value)形式流動 第一步:input 正常情況下不需要寫代碼 僅僅在MapReduce程序運行的時候指定一個路徑即可 第二步:map(核心) map(key,value,output,context) key:每行數據的偏移量——基本沒用 value:每行數據的內容——真正需要處理的內容 第三步:shuffle 不需要寫代碼 第四步:reduce(核心) reduce(key,value,output,context) key:業務需求中的key value:要聚合的值 第五步:output 正常情況下不需要寫代碼 僅僅在MapReduce程序運行的時候指定一個路徑即可 比想像的要簡單許多吧,只要多動手練習一下,這些都不難,如果一次沒成功,那就再練習一次。 本期的內容就是這些了,要多加練習,一遍一遍的敲代碼,然後運行。光靠眼睛會了還不行,手也得會!大數據開發之路,期待你的成長! 希望大家點個關注,及時收取最新文章推送,想了解更多敬請諮詢加米穀大數據。 有問題的歡迎在評論區留言,如有侵權請告知。 來源:kknews大數據開發的MapReduce的編程怎麼弄?5步解決

乾貨分享:Kafka 源碼閱讀筆記

作者:guolonglin,騰訊 IEG 後台開發工程師 一、Kafka 總覽 1)kafka 集群是由 broker 組成,每個 borker 擁有一個 controller,基於 zookeeper 做集群 controller leader 選舉,以及存儲集群核心元數據,leader controller 負責管理整個集群; 2)以 Topic->partition-> replication 來存儲生產者數據,每個 partition 為一個 Log,log 分段存儲於文件中; 3)kafka 集群管理消費者信息和消費者消費記錄,這些信息也以內部...

分布式系統核心:面向服務的分布式架構,基於Web服務的SOA

基於Web服務的SOA Web服務是SOA架構系統的一個實例,在SOA架構實現中的應用非常廣泛。 由於網際網路的興起,Web瀏覽器成為占主導地位的、用於訪問信息的模型。現在的應用設計的首要任務大多數是讓用戶通過瀏覽器來訪問,而不是通過編程訪問或操作數據。 網頁設計關注的是內容,解析實現方面往往是繁瑣的。傳統RPC解決方案可以工作在網際網路上,但問題是,它們通常嚴重依賴於動態埠分配,往往要進行額外的防火牆配置。 Web服務成為一組協議,允許服務被發布、發現,並用於技術無關的形式,即服務不應該依賴於客戶的程式語言、作業系統或機器架構。 Web服務的實現一般是使用Web伺服器作為服務請求的管道。客戶端訪問該服務,首先通過一個HTTP發送請求到伺服器上的Web伺服器。 Web伺服器配置識別URL的一部分路徑名或文件名後綴,並將請求傳遞給特定的瀏覽器插件模塊。這個模塊可以除去請求頭來解析數據(如果需要),並根據需要調用其他方法或模塊。對於這個實現流,一個常見的例子是瀏覽器對Java Servlet的支持。HTTP請求會被轉發到JVM運行的伺服器代碼來執行處理。 XML-RPC XML-RPC是在1998年作為一個RPC消息傳遞協議,將請求和響應封裝解析為人類可讀的XML格式。XML格式基於HTTP,緩解了傳統企業的防火牆需要為RPC伺服器應用程式打開額外的埠的問題。 下面是一個XML-RPC消息的例子。<methodCall> <methodName> sample.sumAndDifference </methodName> <params> <param><value><int> 5 </int></value></param> <param><value><int> 3 </int></value></param> </params> </methodCall> 這個例子中,方法sumAndDifference有兩個整數參數5和3。 XML-RPC支持的基本數據類型是int、string、boolean、double和dateTime.iso8601。此外還有base64類型,用於編碼任意二進位數據。 array和struct允許定義數組和結構。 XML-RPC不限制任何特定的語言,也不是一套完整用於處理遠程過程調用的軟體,諸如存根生成、對象管理和服務查找都不在其協議內。現在有很多庫可以用於不同的語言,比如Apache XML-RPC可以用於Java、Python和Perl。 XML-RPC是一個簡單的規範(約7頁內容),沒有「雄心勃勃」的目標——它只關注消息,並不處理諸如垃圾收集、遠程對象、遠程過程的名稱服務和其他方面的問題。然而,即使沒有廣泛的產業支持,簡單的協議卻廣泛被業界採用。 SOAP 簡單對象訪問協議(Simple Object Access Protocol,SOAP)以XML-RPC規範作為創建SOAP的依據,創建於1998年,獲得了微軟和IBM的大力支持。該協議在創建初期只作為一種對象訪問協議,但由於SOAP的發展,其協議已經不單只是用於簡單的訪問對象,所以這種SOAP縮寫已經在標準的1.2版後被廢止了。1.2版在2003年6月24日成為W3C的推薦版本。SOAP指定XML作為無狀態的消息交換格式,包括了RPC式的過程調用。SOAP只是一種消息格式,並未定義垃圾回收、對象引用、存根生成和傳輸協議。 下面是一個簡單的例子。 <?xml version='1.0' ?> <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> <env:Header> <m:reservation xmlns:m="http://travelcompany.example.org/reservation" env:role="http://www.w3.org/2003/05/soap-envelope/role/next" env:mustUnderstand="true"> <m:reference>uuid:093a2da1-q345-739r-ba5d-pqff98fe8j7d</m:reference> <m:dateAndTime>2001-11-29T13:20:00.000-05:00</m:dateAndTime> </m:reservation> <n:passenger xmlns:n="http://mycompany.example.com/employees" env:role="http://www.w3.org/2003/05/soap-envelope/role/next" env:mustUnderstand="true"> <n:name>Åke Jógvan Øyvind</n:name> </n:passenger> </env:Header> <env:Body> <p:itinerary xmlns:p="http://travelcompany.example.org/reservation/travel"> <p:departure> <p:departing>New York</p:departing> <p:arriving>Los Angeles</p:arriving> <p:departureDate>2001-12-14</p:departureDate> <p:departureTime>late afternoon</p:departureTime> <p:seatPreference>aisle</p:seatPreference> </p:departure> <p:return> <p:departing>Los Angeles</p:departing> <p:arriving>New York</p:arriving> <p:departureDate>2001-12-20</p:departureDate> <p:departureTime>mid-morning</p:departureTime> <p:seatPreference/> </p:return> </p:itinerary> <q:lodging xmlns:q="http://travelcompany.example.org/reservation/hotels"> <q:preference>none</q:preference> </q:lodging> </env:Body> </env:Envelope> 其中<soap:Envelope>是SOAP消息中的根節點,是SOAP消息中必需的部分。<soap:Header>是SOAP消息中可選部分,指消息頭。 <soap:Body>是SOAP消息中必需的部分,指消息體。 上面例子中的SOAP消息結構如圖6-3所示。 SOAP只是提供了一個標準化的消息結構,為了實現它,往往需要用WSDL來描述Web服務的方法。WSDL是基於XML的一種用於描述Web服務以及如何訪問Web服務的語言。WSDL文檔包括以下7個部分。 ·類型(Types):定義了Web服務使用的數據類型。 ·消息(n/a):描述使用消息的數據元素或參數。 ·接口(Interface):描述服務提供的操作,包括操作以及每個操作所使用的輸入和輸出消息。 ·綁定(Binding):為每個埠定義消息格式和協議細節。例如,它可以定義RPC式的消息。 ·服務(Service):系統功能相關的集合,包括其關聯的接口、操作、消息等。 ·終點(Endpoint):定義地址或者Web服務的連接點。 ·操作(Operation):定義SOAP的動作,以及消息編碼的方式。 下面是一個WSDL 2.0的例子。 <?xml version="1.0" encoding="UTF-8"?> <description xmlns="http://www.w3.org/ns/wsdl" xmlns:tns="http://www.tmsws.com/wsdl20sample" xmlns:whttp="http://schemas.xmlsoap.org/wsdl/http/" xmlns:wsoap="http://schemas.xmlsoap.org/wsdl/soap/" targetNamespace="http://www.tmsws.com/wsdl20sample"> <documentation> This...

Spring Security框架中踢人下線技術探索

1.背景 在某次項目的開發中,使用到了Spring Security權限框架進行後端權限開發的權限校驗,底層集成Spring Session組件,非常方便的集成redis進行分布式Session的會話集群部署。系統正式上線後,各個部署節點能夠非常方便的進行集群部署,用戶的Session會話信息全部保存在Redis中間件庫中,開發者不用關心具體的實現,Spring Session組件已經全部集成好了。 但是在系統的用戶管理模塊中,提供了對系統用戶帳號的刪除功能以及禁用功能,針對這兩個功能,需求方給出的具體要求是: 刪除:當管理員刪除當前用戶帳號時,如果當前帳號已經登錄系統,則需要剔除下線,並且不可登錄 禁用:當管理員對當前帳號禁用操作時,如果當前帳號已經登錄系統,則需要剔除下線,並且登錄時,提示當前帳號已禁用 2.需求分析 從上面的需求來看,不管是刪除還是禁用功能,都需要實現,如果當前帳號已經登錄系統,則需要剔除下線,而禁用操作只需要再登錄時給出提示信息即可,這個在業務登錄方法中就可以實現,不必從底層框架進行考慮。 因此,從底層技術測進行考慮時,我們需要探索如何在Spring Security權限框架中實現踢人下線的功能。 既然需求已經明確,從功能的實現可能性方面入手,我們則需要從幾個方面進行考慮: 1)、在Spring Security框架中,用戶登錄的Session會話信息存儲在哪里? 2)、在Spring Security框架中,Session會話如何存儲,主要存儲哪些信息? 3)、如何根據帳號收集當前該帳號登錄的所有Session會話信息? 4)、如何在服務端主動銷毀Session對象? 1)、在Spring Security框架中,用戶登錄的Session會話信息存儲在哪里? 如果我們不考慮分布式Session會話的情況,單體Spring Boot項目中,服務端Session會話肯定存儲在記憶體中,這樣的弊端是如果當前應用需要做負載均衡進行部署時,用戶請求服務端接口時,會存在Session會話丟失的情況,因為用戶登錄的會話信息都存在JVM記憶體中,沒有進程之間的共享互通。 為了解決分布式應用Session會話不丟失的問題,Spring Session組件發布了,該組件提供了基於JDBCRedis等中間件的方式,將用戶端的Session會話存儲在中間件中,這樣分布式應用獲取用戶會話時,都會從中間件去獲取會話Session,這樣也保證了服務可以做負載部署以保證Session會話不丟失。本文主要討論的也是這種情況,集成Redis中間件用來保存用戶會話信息。 2)、在Spring Security框架中,Session會話如何存儲,主要存儲哪些信息? 由於我們使用了Redis中間件,所以,在Spring Security權限框架中產生的Session會話信息,肯定存儲與Redis中,這點毫無疑問,那麼存儲了哪些信息呢?我會在接下來的源碼分析中進行介紹 3)、如何根據帳號收集當前該帳號登錄的所有Session會話信息? 我們從上面的需求分析中已經得知Session會話已經存儲在Redis中,那麼我們是否可以做這樣的假設,我們只需要根據Spring Security中在Redis中存儲的鍵值,找到和登錄用戶名相關的Redis緩存數據,就可以通過調用Security封裝的方法進行獲取,得到當前登錄帳號的會話信息呢?這個我們需要在源碼中去找到答案 4)、如何在服務端主動銷毀Session對象? 如果是單體的Spring Boot應用,Session信息肯定存儲在JVM的記憶體中,服務端要主動銷毀Session對象只需要找到Security權限框架如何存儲的就可以進行刪除。 在分布式的Spring Boot應用中,我們從上面已經得知Session會話信息以及存儲在Redis中間件中,那麼我們只需要得到當前登錄的Session在Redis中的鍵值,就可以調用方法進行刪除操作,從而主動在服務端銷毀Session會話 3.源碼分析 在上面的需求分析中,我們已經提出了假設,並且根據假設,做出來技術性的判斷,接下來我們需要從Spring Security以及Spring Session組件的源碼中,去尋找我們需要的答案。 首先,我們在源碼分析前,我們需要找到入口,也就是我們在使用Spring Security框架,並且使用Spring Session組件時,我們如何使用的。 在pom.xml文件中引入組件的依賴是必不可少的,如下: <!--Spring Security組件--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <!--Spring針對Redis操作組件--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!--Spring Session集成Redis分布式Session會話--> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> 接下來,我們在Spring Boot項目中,需要添加@EnableRedisHttpSession註解,以開啟Redis組件對Session會話的支持,該註解我們需要制定Spring Session在Redis中存儲的Redis命名空間,已經Session會話的時效性,示例代碼如下: @SpringBootApplication @EnableRedisHttpSession(redisNamespace = "fish-admin:session",maxInactiveIntervalInSeconds = 7200) public class FishAdminApplication { static Logger logger=...

你好,Spring security

Spring Boot 似乎是使用 Spring Framework 開發應用程式的進化階段。 Spring Boot 不需要預先編寫所有配置,而是提供了一些預配置的功能,因此您只能覆蓋與您的實現不匹配的配置。 我們也稱這種方法為配置約定。 在以這種方式開發應用程式之前,開發人員一次又一次地為必須創建的所有應用程式編寫了數十行代碼。 在過去,當我們單體開發大多數體系結構時,這種情況就不那麼明顯了。 使用單體式架構,您只需要在開始時編寫一次這些配置,並且以後很少需要接觸它們。 隨著面向服務的軟體體系結構的發展,我們開始感受到為配置每個服務而需要編寫的模板代碼的痛苦。 由於這個原因,隨著最近應用程式的發展,尤其是針對微服務的應用程式,Spring Boot 變得越來越流行。Spring Boot 為項目提供了自動配置,並縮短了安裝所需的時間。我想說的是,它具有適合當今軟體開發的哲學。 我們將從使用 Spring Security 的第一個應用程式開始。 對於使用Spring Framework開發的應用程式,Spring Security 是實現應用程式級安全性的絕佳選擇。...

什麼是SEO站內點擊,它有利於SEO排名嗎?

這幾年來看,我們非常明確的一件事情就是:當你在操作SEO的時候,目標站點是否能夠在搜索結果中得到有效可持續的點擊,往往成為一個網站是否增加信任度的一個重要考核指標。 這也就催生大量用戶開始採用一些不同的策略快速提升網站排名,但我們經常會看到這類網站出現暴漲與暴跌的情況。 我認為一是採用的策略,涉嫌違反搜尋引擎排名的基本規則,另外一個就是可能並沒有真正理解:點擊真正的價值代表什麼。 這其中特別是忽略了網站內部的點擊量。 那麼,什麼是站內點擊,快速排名首頁點擊,一定是王道嗎? 根據以往SEO實戰的經驗,蝙蝠俠IT,將通過如下內容闡述: 什麼是站內點擊? 簡單理解:所謂的站內點擊,主要是指當用戶通過搜索結果訪問到目標頁面之後,而基於這個目標頁面,在網站中有意圖的進行相關性或者其他頁面的點擊訪問。 站內點擊對SEO有影響嗎? 通常來講,我們認為站內點擊對於SEO還是有一定影響的,理由如下: ① 它代表用戶行為的訪問。 ② 它可以促使用戶在站內更長時間的停留。 如果你的站內點擊頻次相對比較高,而使得目標搜索需求長周期的停留在站內點擊,而沒有短期的快速跳出,我們認為這可能是一種滿足搜索需求的特徵。 理論上,這種長時間停留的搜索點擊,對於提升網站綜合質量,我們認為還是有一定幫助的。 但這並不代表,我們可以惡意地利用這個策略,對於搜尋引擎而言,我認為這種站內點擊的頻次,應該會針對不同行業有一個明顯的頻次範圍。(理論上) 如何提高站內點擊頻次? ① 清晰簡潔的網站導航,側欄導航! ② 合理地使用頁面內容中的內鏈進行推薦,如果有必要的話,我們認為可以嘗試進行明顯的標註。 ③ 豐富完善的主題內容,關聯性比較高,儘量打造主題內容。 這里有一個題外話,就是我們在使用內鏈策略的時候,我們理論上是採用目標關鍵詞的錨文本連結為妙,但實際上如果你的網站熱度比較高,經常被大量採集的情況下。 在使用內鏈策略的時候,我們建議採用非目標關鍵詞的策略,這樣頁面被大量採集,就不會新增一些低質量的外鏈錨文本,而導致關鍵詞排名不穩定。 總結:當我們嘗試吸引用戶點擊的時候,往往更多地在關注搜索結果中的點擊,而實際忽略網站內部點擊的時間周期,上述內容,僅供參考,歡迎大家討論!(備註:高頻次的站內點擊,並不僅僅代表站內頁面停留時間的權益。) 來源:kknews什麼是SEO站內點擊,它有利於SEO排名嗎?

盤點:2021 年薪酬最高的程式語言!有你正在學習的嗎?

要在軟體開發領域有所發展,你需要用最新的編程技能武裝自己。這就需要你對程式語言的流行度、實用性以及最受歡迎的程式語言有充分的了解。本文將介紹 2021 年最受歡迎的程式語言。 本文最初發布於 invozone Blog網誌,經原作者授權由 InfoQ 中文站翻譯並分享。 我怎麼知道自己應該學習哪一門程式語言? 不知道從哪里開始?不用擔心,我們已經調查過了,所以你就不用再調查了。今天,我們來看看 2021 年最受歡迎的程式語言。我們將根據以下因素對這些語言進行排名。 學習這門語言需要的時間 對於初學者,甚至是有經驗的開發人員來說,掌握它需要多少時間? 就業市場 2021 年的市場需求是什麼?就一門特定的程式語言來說,你能賺多少錢? 生產力 對於個人發展而言,這一點很重要。你需要知道用它創建應用的速度有多快。當與中小企業或初創企業合作時,他們會要求開發人員在更短的時間內更快地創建 Web 和移動應用程式。 好了,讓我們進入今天最主要的內容。 2021 年薪酬最高的 5 種程式語言 Java 你可能會問,「 Java 過時了嗎? 」不,它沒有。 為什麼 Java 仍然流行?它是最古老、最健壯的程式語言之一,目前仍然是許多開發人員的最愛。同時,它也是一種面向對象的語言,主要用於 Android 應用程式開發。這是它至今仍在使用的一個主要原因。 目前許多大公司仍然在使用它,大量的交易應用程式正在用它構建。但由於出現了像 Kotlin 這樣的程式語言(也適用於 Android 開發),Java...

mysql 執行計劃

在企業的應用場景中,為了知道優化SQL語句的執行,需要查看SQL語句的具體執行過程,以加快SQL語句的執行效率。 可以使用explain+SQL語句來模擬優化器執行SQL查詢語句,從而知道mysql是如何處理sql語句的。 官網地址: https://dev.mysql.com/doc/refman/5.5/en/explain-output.html 1、執行計劃中包含的信息 Column Meaning id The SELECT identifier select_type The SELECT type table The table for the output row partitions The matching partitions type The join type possible_keys The possible indexes to choose key The index actually chosen key_len The length of...

groff 程式設計師的 5 個標誌

學習一款老派的文本處理軟體 groff,就像是學習騎自行車。 我第一次發現 Unix 系統是在 20 世紀 90 年代早期,當時我還在大學讀本科。我太喜歡這個系統了,所以我將家里電腦上的 MS-DOS 也換成了 Linux 系統。 在 90 年代早期至中期,Linux 所缺失的一個東西是字處理軟體word processor。作為其他桌面作業系統的標準辦公程序,字處理軟體能讓你輕鬆地編輯文本。我經常在 DOS 上使用字處理軟體來撰寫課程論文。直到 90 年代末,我都沒能找到一款 Linux 原生的字處理軟體。直到那時,文字處理是我在第一台電腦上保留雙啟動的少有的原因之一,那樣我可以偶爾切換到 DOS 系統寫論文。 後來,我發現 Linux...

常見的21種數據挖掘工具

【51CTO.com快譯】數據挖掘(Data mining)是通過智能的方法,從數據中提取實用信息,對數據予以解釋,發現數據的模式與關係,以及預測趨勢和行為的過程。該過程往往會涉及到諸如:數據清理、機器學習、人工智慧、數據分析、資料庫系統、以及回歸、聚類等信息統計技術。顯然,數據集越大、越複雜,我們就能夠越輕鬆地通過自動化分析工具,越快地找到越相關的意義。而通過識別和理解有意義的數據,用戶企業也就可以做出各種明智的決策,並實現其目標。 數據挖掘的基本步驟 我們可以將數據挖掘運用到諸如:市場細分、趨勢分析、欺詐檢測、資料庫營銷、信用風險管理、教育、以及財務分析等多種場景中。雖然各個組織使用的方法可能有所不同,但是總的說來,數據挖掘過程通常包括以下五個步驟: 根據既定的目標,確定業務需求。 識別數據源,以確定需要分析哪些數據點。 選擇並應用建模技術。 評估模型,以確保其符合既定的目標。 報告數據挖掘的結果,或繼續執行可重複的數據挖掘過程。 數據挖掘與數據倉庫之間的區別 數據倉庫是收集和管理數據的過程。它將各種不同來源的數據存儲到一個存儲庫中,以供運營業務系統(如CRM系統)使用。該過程通常發生在數據挖掘之前,其優勢包括:改進源系統中的數據質量,保護數據免受源系統更新的影響,具備集成多個數據源和數據優化的能力。 數據挖掘工具 如前所述,數據挖掘的過程會涉及到各種技術,其中包括流行的:回歸分析(預測性)、關聯規則發現(描述性)、聚類(描述性)和分類(預測性)。目前,隨著市場的成熟、軟體的升級、以及技術的疊代,我們可以選用帶有不同算法的工具,來進行數據分析與挖掘。下面,我將和您從如下7個分類,綜合介紹與比較21種常見的工具。 用於統計分析的集成類數據挖掘工具 開源的數據挖掘方案 大數據類數據挖掘工具 小型數據挖掘方案 用於雲端數據挖掘的方案 使用神經網絡的數據挖掘工具 用於數據可視化的數據挖掘工具 當然,其中的一些工具可能會橫跨多個類別。例如,儘管Amazon EMR屬於雲端解決方案,但它同時也是處理大數據的絕佳工具。因此,我們儘量根據每種工具的最突出特性,進行分類。 在實際介紹各類工具之前,我們首先來簡要了解兩種最流行的數據科學程式語言:R和Python之間的區別。 R與Python 從源頭上說,R是在考慮統計分析的前提下開發的;而Python則提供了一種更為通用的數據科學方法。從使用目的來看,R更專注於數據分析,並提供可靈活地使用的代碼庫。相反,Python的主要目標是部署到生產環境,它允許用戶從頭開始創建模型。就具體使用方法而言,R通常被集成到本地運行,而Python則能夠與應用程式相集成。因此,儘管它們之間存在著差異,但是兩種語言都可以處理大量的數據,並提供大量的代碼庫。 用於統計分析的集成類數據挖掘工具 1. IBM SPSS SPSS(Statistical Package for the Social Sciences)是目前最流行的統計軟體平台之一。自2015年開始提供統計產品和服務方案以來,該軟體的各種高級功被廣泛地運用於學習算法、統計分析(包括描述性回歸、聚類等)、文本分析、以及與大數據集成等場景中。同時,SPPS允許用戶通過各種專業性的擴展,運用Python和R來改進其SPSS語法。 IBM的SPSS 2. R 如前所述,R是一種程式語言,可用於統計計算與圖形環境。它能夠與UNIX、FreeBSD、Linux、macOS和Windows作業系統相兼容。R可以被運用在諸如:時間序列分析、聚類、以及線性與非線性建模等各種統計分析場景中。同時,作為一種免費的統計計算環境,它還能夠提供連貫的系統,各種出色的數據挖掘包,可用於數據分析的圖形化工具,以及大量的中間件工具。此外,它也是SAS和IBM SPSS等統計軟體的開源解決方案。 3. SAS SAS(Statistical Analysis System)是數據與文本挖掘(tex mining)及優化的合適選擇。它能夠根據組織的需求和目標,提供了多種分析技術和方法功能。目前,它能夠提供描述性建模(有助於對客戶進行分類和描述)、預測性建模(便於預測未知結果)和解析性建模(用於解析,過濾和轉換諸如電子郵件、注釋欄位、書籍等非結構化數據)。此外,其分布式記憶體處理架構,還具有高度的可擴展性。 4. Oracle Data Mining Oracle Data Mining(ODB)是Oracle Advanced Analytics的一部分。該數據挖掘工具提供了出色的數據預測算法,可用於分類、回歸、聚類、關聯、屬性重要性判斷、以及其他專業分析。此外,ODB也可以使用SQL、PL/SQL、R和Java等接口,來檢索有價值的數據見解,並予以準確的預測。 開源的數據挖掘工具 5.KNIME 於2006年首發的開源軟體KNIME(Konstanz Information Miner),如今已被廣泛地應用在銀行、生命科學、出版和諮詢等行業的數據科學和機器學習領域。同時,它提供本地和雲端連接器,以實現不同環境之間數據的遷移。雖然它是用Java實現的,但是KNIME提供了各種節點,以方便用戶在Ruby、Python和R中運行它。 KNIME 6. RapidMiner 作為一種開源的數據挖掘工具,RapidMiner可與R和Python無縫地集成。它通過提供豐富的產品,來創建新的數據挖掘過程,並提供各種高級分析。同時,RapidMiner是由Java編寫,可以與WEKA和R-tool相集成,是目前好用的預測分析系統之一。它能夠提供諸如:遠程分析處理,創建和驗證預測模型,多種數據管理方法,內置模板,可重複的工作流程,數據過濾,以及合併與聯接等多項實用功能。 7.Orange Orange是基於Python的開源式數據挖掘軟體。當然,除了提供基本的數據挖掘功能,Orange也支持可用於數據建模、回歸、聚類、預處理等領域的機器學習算法。同時,Orange還提供了可視化的編程環境,以及方便用戶拖放組件與連結的能力。 大數據類數據挖掘工具 從概念上說,大數據既可以是結構化的,也可以是非結構化、或半結構化的。它通常涵蓋了五個V的特性,即:體量(volume,可能達到TB或PB級)、多樣性(variety)、速度(velocity)、準確性(veracity)和價值(value)。鑒於其複雜性,我們對於海量數據的存儲,模式的發現,以及趨勢的預測等,都很難在一台計算機上處​理與實現,因此需要用到分布式的數據挖掘工具。 8. Apache Spark Apache Spark憑藉著其處理大數據的易用性與高性能,而倍受歡迎。它具有針對Java、Python(PySpark)、R(SparkR)、SQL、Scala等多種接口,能夠提供80多個高級運算符,以方便用戶更快地編寫出代碼。另外,Apache Spark也提供了針對SQL...

Linus Torvalds:Linux Kernel 5.14有望整合Rust語言代碼

Google的 Android 團隊希望通過 Rust 語言重新編寫 Android 系統,而該團隊同時也在幫助評估使用 Rust 來重新編寫 Linux Kernel。通過 Rust 程式語言,Android 團隊希望新代碼能夠在總體上減少記憶體安全錯誤、數據競賽和邏輯錯誤。而且由於採用現代化程式語言,更多人會參與到內核的開發中來。 在接受 IT Wire 採訪的時候,Linus Torvalds 表示:「在 Linux 內核中支持 Rust 的首個修正檔已經發布。負責內核開發的人表示這個舉動的意義比Google關於 Rust 的長文更重要」。 在回答...

別不信,100行代碼,帶你玩轉OpenCV-Python基礎API

做計算機視覺無論如何都繞不開的一個框架就是OpenCV,可以毫不誇張的說,github上每個開源的視覺項目的安裝列表中都有OpenCV框架。很多人第一次接觸OpenCV都是從OpenCV-Python版本SDK開始的,本文就以最新版本的OpenCV4.1.0為例,通過代碼帶領大家簡單粗暴的入門OpenCV-Python編程實踐。 安裝OpenCV-Python 只需要執行如下一條命令行即可 pip install opencv-python 如果想連擴展模塊一起安裝,執行如下命令行 pip install opencv-contrib-python 更多請參考這里 https://pypi.org/project/opencv-python/ 代碼演示部分 涵蓋OpenCV圖像處理最高頻次使用API與常見各種使用技巧。 導入CV模塊 import cv2 as cv import numpy as np 解釋:這個是因為OpenCV在python語言中的所有圖像數據都是以numpy的數組形式組織存儲。所以必須安裝numpy依賴支持,導入以備後用。 加載與現實圖像 src = cv.imread("D:/images/lena.jpg") cv.namedWindow("input", cv.WINDOW_AUTOSIZE) cv.imshow("input", src) 解釋:千萬別給中文路徑,不支持的,默認加載圖像彩色,通道順序BGR。 轉換為灰度 gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY) cv.imshow("gray", gray) print(src.shape) print(gray.shape) 解釋:支持各種色彩空間轉換,可以轉換到灰度,HSV、YCrCb、LAB等常見色彩空間,圖像的寬、高、通道數,可以通過src.shape得到。 創建空白圖像 black = np.zeros_like(src) cv.imshow("black", black) 解釋:創建一張與src大小與數據類型一致的圖像,但是像素值全部為0,黑色背景圖像。 調節亮度 black = 50 lighter...

深入 AQS 源碼,搞懂核心思想

原文出自:公眾號 郭兒的跋涉 原文連結:https://mp.weixin.qq.com/s/2Ltx9LAbIcWvwk_jvmSRcA 本文重點 前情提要 之前文章中寫到了 JDK 中 synchronized 關鍵字可以實現同步鎖,並且詳細分析了底層的實現原理。 Synchronized 原理及鎖升級分析 雖然 synchronized 在性能上不再被人詬病,但是在實際使用中仍然缺乏一定的靈活性。 比如在一些場景中需要去嘗試獲取鎖,如果失敗則不再進行等待,又或者設置一定的等待時間,超時後就放棄等待。 正文開始,Reentrantlock 介紹 java.util.concurrent.locks 包提供了多種鎖機制的實現,本文暫且以 ReentrantLock為例,探究 Java 是如何實現同步鎖的。 ReentrantLock,先看名字,reentrant——可重入的,表示持鎖線程可以多次加鎖。 使用案例如下: ReentrantLock lock = new ReentrantLock(true); lock.lock(); try { //do something } finally { lock.unlock(); } AQS ReentrantLock 底層是由 AQS 框架實現的,並且...

Linux入門指南-搭建JAVAEE開發環境

搭建JAVAEE開發環境 視頻觀看效果更佳~~~戳 Linux入門到實戰 https://www.ixigua.com/6903450179647734284 安裝JDK 第一步:先將軟體通過xftp5 上傳到/opt 下 第二步:解壓縮到/opt目錄下 第三步:配置環境變量的配置文件vim /etc/profile JAVA_HOME=/opt/jdk1.7.0_79 PATH=$JAVA_HOME/bin:$PATH CLASSPATH=$JAVA_HOME/lib:. export JAVA_HOME PATH CLASSPATH 第四步:使配置文件生效 第五步:測試安裝成功 第六步:在目錄/home/zhangsan下編寫HelloWorld.java編譯並運行 安裝tomcat 第一步:先將軟體通過xftp5 上傳到/opt 下 第二步:解壓到/opt 第三步:啟動tomcat 第四步:Linux上訪問tomcat 第五步:windows上訪問tomcat 注意:從其它機器上訪問需要關閉linux的防火牆。 安裝mysql 第一步:查看是否已經安裝了mariadb 檢查linux是否安裝了mariadb資料庫,mariadb資料庫是mysql的分支。是免費開源的。mariadb和msyql會有衝突。首先要檢查安裝了mariadb, 卸載掉。 檢查命令:yum list installed | grep mariadb 卸載命令:yum –y remove xxxx *如果卸載不成功,需要去掉參數-y,手動確認卸載。 第二步:上傳mysql安裝包到/opt下 第三步:解壓mysql安裝包到目錄/opt 第四步:修改解壓後的根目錄名 第五步:創建數據文件夾data data文件夾是mysql用來存放資料庫文件的,資料庫的表數據都放在data目錄。 默認沒有data目錄,可以手工創建data目錄,在mysql-5.7.18文件夾目錄下創建一個data文件夾。 第六步:創建用來執行mysqld命令的Linux用戶 創建mysql用戶,用來執行MySQL的命令mysqld ,此命令用來初始化msyql基礎信息。可以使用其他用戶,例如叫做 mydb.等,但不推薦。 第七步:初始化mysql 使用mysql的 mysqld 命令初始化資料庫的基本信息。切換到mysql-5.7.18/bin目錄下執行。 命令:./mysqld --initialize --user=mysql...

花了整整一個月的時間整理Python全系列資料,全是乾貨建議收藏

首先恭喜看到本文的你,以下的資料全部可以免費領取。 這些資料共100G+,包含:python基礎入門學習、Python爬蟲入門到進階視頻教程、Python數據分析教程、Python數據可視化化教程、Python大廠面試資料、Python學習知識圖譜、Python電子書資料 全部是精心整理,是一整套python學習教程,循序漸進,讓你學習Python不再苦惱。 對於小白來說入門往往比較難,自學的話,沒有一份好的學習資料,好的領路人的話,會走很多彎路。於是我整理了一份從安裝環境到基礎知識的講解視頻(保證滿滿乾貨)以下是部分截圖: 掌握了一定python基礎後,想學習爬蟲的大家不知道該如何下手,網上的教程各式各樣,參差不齊,為了能夠讓想學習python爬蟲的大家能夠快速入門。於是乎我收集整理了70G+Python爬蟲視頻教程,從基礎到進階一應俱全(含課件和源碼) 以下為部分資料截圖: 爬取了數據之後,為了讓數據的價值體現出來,這時候需要用到數據分析的知識。 於是乎我收集整理了一套數據分析學習資料,從數據分析流程,如何進行數據分析,到最後進行數據報告撰寫等,一整套教程 以下為部分資料截圖: 對於學有所成大家來說,往往會面臨找工作面試的時候,於是乎我收集整理了各大廠的面試資料以下為部分資料截圖 此外我還整理與python、計算機相關的電子書,也一併提供給大家 以下為部分資料截圖: 獲取資料方法如下: 1.點讚+評論 2.私信「資料」免費獲取 來源:kknews花了整整一個月的時間整理Python全系列資料,全是乾貨建議收藏

SEO競爭對手分析,值得關注的5個數據指標

在SEO你問我答群里,總是有人會討論: ① 頁面不收錄,沒有排名。 ② 關鍵詞排名大幅度的波動,網站長期沒權重。 ③ 有排名而沒有任何的轉化。 這已經成為SEO行業老生常談的話題,有的時候,我們更多在闡述現狀的時候,多半是基於自己個體運營的數據分析,而往往從宏觀的角度去衡量一個搜索現狀。 那麼,SEO排名實戰,你應該監控的5個數據維度有哪些? 根據以往SEO數據監控的經驗,蝙蝠俠IT,將通過如下內容闡述: 1、行業網站趨勢 通常來講,當我短期操作一個特定行業網站排名的時候,我偶爾第一件事情,可能就是去找搜索結果中排名TOP50的行業高度垂直的網站去監控數據指標。 在這個過程中,你可能會發現諸多的細節,比如: ① 每個網站整體數據增量曲線都相對平穩,而某個時間節點,突然某一個網站的曲線開始大幅度的波動,這個時候,就值得我們關注,他到底是採取什麼策略,導致增長或者下降。 ② 在長周期中,審查每個網站行業相關關鍵詞的平均排名,看看自己是否超越這個平均線,如果沒有還需要從哪里改進。 ③ 整個行業,是否集體出行跳水的情況,大量關鍵詞排名跌落與丟失,如下圖: 我們就需要審查,針對特定行業,是否出現特徵性調整,比如:頁面結構,頁面內容,頁面輸出頻率等等,亦或是政策性調整。 2、關鍵詞搜索量 你是否經常聽到這樣一句話為什麼我的關鍵詞排名已經很高了,但就是沒有任何轉化,當我們排除著陸頁配置等相關問題,其中一個最為重要的事情就是關鍵詞搜索量本身的變化。 如下圖: 你可能需要定期監控你的核心關鍵詞搜索量的變化趨勢,如果整體核心詞的搜索量開始下降,那麼,導致轉化低,也不無可能。 3、頁面真實收錄 這是一個非常有意思的話題,也是我們近期經常討論的事情,網站不收錄,已經是讓SEO從業者非常苦惱的一件事情,但根據近期針對百度收錄數據的一些監控,我們也會發現一些小問題,比如:頁面已經收錄,而實際查詢的時候,你卻沒檢索到。 其中主要的原因是:其中有些頁面收錄的時候,可能時間因子出現問題,比如:2021年4月19號新發內容,可能百度快照中的時間,容易記錄成2020年的某個數據日期。 而你在利用一些SEO工具查詢的時候,經常使用當下時間,或者近一周時間的查詢,往往並不能真實查詢到你的URL是否真正收錄。 這里如果數據量不多的話,建議大家選擇利用SEO工具,針對網址進行批量逐一免費查詢。(不清楚怎麼查詢,可以聯繫站長。) 4、品牌詞影響力 對於品牌詞搜索量波動的監控,我們認為應該從兩個方面去審查,一方面是自身品牌詞,另一方面是競爭對手品牌詞。 任何一方的數據異常波動,都是值得我們關注。當然,這個地方我們不光需要監控百度指數,同時,我們還應該關註: ① 搜索結果中的影響力。 ② 新媒體的影響力。 ③ 問答平台與新聞源媒體中的口碑情況。 這樣我們才能更好地了解自己的競爭對手。 5、頁面排名波動 在短期運營的過程中,我們經常會看到一些網站權重暴漲,讓人好生羨慕,而從一個長周期的數據監控來看,很多網站可能都是曇花一現。 但在實際運營的過程中,總是會有一些網站長期穩定在搜索結果的前列,無論對方採用什麼策略獲取排名,這就需要我們分析,為什麼會產生這個情況。 根據長期針對SEO與網站建設行業的數據監控,我們發現持續的搜索點擊與高質量外鏈的支撐,仍然是關鍵詞排名穩定與提升的重要指標。 總結:在SEO排名的過程中,我們有必要進行關鍵詞排名的監控。 來源:kknewsSEO競爭對手分析,值得關注的5個數據指標

編寫 if 時不帶 else,你的代碼會更好

★★★建議星標我們★★★ Java進階架構師★「星標」!這樣才不會錯過每日進階架構文章呀。 2020年Java原創面試題庫連載中 【000期】Java最全面試題庫思維導圖 【020期】JavaSE系列面試題匯總(共18篇) 【028期】JavaWeb系列面試題匯總(共10篇) 【042期】JavaEE系列面試題匯總(共13篇) 【049期】資料庫系列面試題匯總(共6篇) 【053期】中間件系列面試題匯總(共3篇) 【065期】數據結構與算法面試題匯總(共11篇) 【076期】分布式面試題匯總(共10篇) 【100期】綜合面試題系列匯總(共23篇) 【151期】100-150期匯總(共50篇) 【152期】如何應對高並發流量? 【153期】StringBuilder線程安全嗎?為什麼? 【154期】Redis的過期鍵刪除策略有哪些? 【155期】Spring-Retry重試實現原理是什麼? 【156期】資料庫分庫分表之後,如何解決事務問題? 【157期】為什麼 SQL 語句不要過多的 join? 【158期】說說註冊中心 zookeeper 和 eureka 中的CP和 AP 【159期】Java中的finally一定會被執行嗎? 更多內容,點擊上方名片查看 導讀: 當else多了之後,看起來代碼就開始複雜了,那麼如何來完成同樣的邏輯呢?看看這篇文章,也許你就會有所領悟! 來源:翻譯自: Nicklas Millard 的文章《Better Software Without If-Else》 註:本文並不肯定或者否定哪一種寫法,僅僅為大家提供一些其他的編碼思路或者一些值得借鑑的點子,希望大家能在公眾號的每一篇文章中都能有所收穫,同時歡迎探討! 設計更好的軟體,替換 If-Else 的 5 種方法。入門到高級示例 讓我直接說這句話:If-Else 通常是一個糟糕的選擇。 它導致設計複雜,代碼可讀性差,並且可能導致重構困難。 但是,If-Else 已成為事實上的代碼分支解決方案,這確實是有道理的。這是向所有有抱負的開發人員講授的第一件事。不幸的是,許多開發人員從來沒有前進到更合適的分支策略。 有些人的口頭禪是:If-Else 是一把錘子,一切都是釘子。 無法區分何時使用更合適的方法是區分大三學生和大三學生的原因之一。 我將向您展示一些技巧和模式,這些技巧和模式將終結這種可怕的做法。 每個示例的難度都會增加。 搜索公縱號:MarkerHub,關注回復獲取前後端入門教程! 1 完全不必要的 Else...

「Python數據分析系列」7.假設與統計推斷

數據與智能 本公眾號關注大數據與人工智慧技術。由一批具備多年實戰經驗的技術極客參與運營管理,持續輸出大數據、數據分析、推薦系統、機器學習、人工智慧等方向的原創文章,每周至少輸出7篇精品原創。同時,我們會關注和分享大數據與人工智慧行業動態。歡迎關注。 來源 | Data Science from Scratch, Second Edition 作者 | Joel Grus 譯者 | cloverErna 校對 | gongyouliu 編輯 | auroral-L 全文共4998字,預計閱讀時間30分鐘。 第七章 假設與統計判斷 7.1 統計假設檢驗 7.2 案例:擲硬幣 7.3 置信區間 7.4 P-hacking 7.5 案例:運行A/B測試 7.6 貝葉斯推斷 7.7 延伸學習 深諳統計之道,方為人中之龍。 ——蕭伯納 具備以上統計學和機率理論知識以後,我們接著該做什麼呢?數據科學的科學部分,乃是不斷針對我們的數據和生成數據的機制建立假設和檢驗假設。 7.1 統計假設檢驗 通常,作為數據科學家,我們常常需要檢驗某個假設是否成立。有時,假設是諸如「這枚硬幣是均勻的」「數據科學家喜歡 Python 勝過 R」或「如果人們點開某個突然彈出的小廣告,廣告的關閉按鈕又小又難找,那麼大家更傾向於離開這個頁面,壓根不會閱讀」等可以被翻譯成統計數據的斷言。在各種各樣的假設之下,這些統計數據可以理解為從某種已知分布中抽取的隨機變量觀測值,這可以讓我們對這些假設是否成立做出論斷。 典型的步驟是這樣的,首先我們有一個零假設 H0,它代表一個默認的立場,而替代假設H1代表我們希望與零假設對比的立場。我們通過統計來決定我們是否可以拒絕 H0,即判斷它是否錯誤。通過舉例能更直觀地說明這個過程。 7.2 案例:擲硬幣 假設有一枚硬幣,我們試圖判斷它是否均勻,即任何一面朝上的可能性是否相等。首先,假設硬幣落地後正面朝上的機率為...

Java最簡單最全入門到入土——開發環境

Java開發環境的搭建 Java環境 下載JDK(Java Developer Kits) 「工欲善其事,必先利其器」,要搭建起Java應用程式的開發平台首先要下載安裝Java開發工具包。 JDK與JRE的功能 JDK是提供給Java開發人員使用的,其中包含了Java的開發工具,也包括了JRE。 JDK中包括Java虛擬機(Java Virtual Machine)和Java程序的核心類庫等,如果想要運行一個開發好的Java程序,計算機中只需要安裝JRE。 環境變量 首先,你應該已經安裝了 Java 的 JDK 了 在電腦桌面 右鍵點擊 「此電腦」的「屬性」選項 選擇「高級系統設置」選項 選擇環境變量 創建JAVA_HOME和CLASSPATH環境變量 在系統環境變量中新建「JAVA_HOME」,值為JDK的安裝路徑,例如:C:Program FilesJavajdk1.7.0_45。 在系統環境變量中新建「CLASSPATH」,值為「.;%JAVA_HOME%libtools.jar;」,指示系統Java標準類庫所在。(5.0版之後可不用設置CLASSPATH,但向下兼容需要)。 修改Path環境變量 在環境變量中找到Path並修改,在變量值的最前端添加:「.;%JAVA_HOME%bin;」,用於指示Java指令的位置。 Java環境的調試和驗證 驗證Java環境是否搭建成功可以在系統命令行窗口中輸入「java -version」。 使用javac和java命令編譯和執行 新建一個MyTest.java源文件,通過javac.exe指令進行編譯生成.class字節碼文件,再通過java.exe執行並查看輸出結果。 集成開發工具的下載和使用 目前Java語言的集成開發環境(開發工具),主要使用的是Eclipse,Eclipse 是一個開放原始碼的、基於Java的可擴展開發平台。就其本身而言,它只是一個框架和一組服務,用於通過插件組件構建開發環境。幸運的是,eclipse 附帶了一個標準的插件集,包括Java開發工具(Java Development Kit,JDK)。 Eclipse的下載可訪問其官方網站www.eclipse.org,在Eclipse IED頻道找到「Eclipse IDE for Java Developers」板塊,下載最新版本的Eclipse並安裝。 也可以選擇一種歷史版本下載安裝。 安裝完成後,使用Eclipse新建一個Java Project(Java 工程),編寫代碼後運行,查看運行結果。 我們不光有Eclipse,同樣還有IntelliJ IDEA 也是同樣熱門的一款集成開發工具,是在業界公認的最好用的開發工具 IntelliJ IDEA將原始碼編入索引後,它會通過在各種情況下提供相關建議來提供無與倫比的快速,智能的體驗:即時,聰明的代碼完成,即時代碼分析以及可靠的重構工具。 好了,本文到此結束。如果對編程、計算機、程式設計師方面感興趣的話,歡迎私信聯繫我,隨時交流!點個關注,是對我莫大的鼓勵! 來源:kknewsJava最簡單最全入門到入土——開發環境

性能優化|JVM記憶體分配機制

JVM整體結構 對 線程共享的區域,也是垃圾回收器要收集的區域,這地方主要保存用戶創建的對象。例如 new User(),這個對象是保存在堆上面的。 棧 棧上面用來保存方法運行產生的局部變量、方法返回值和動態連結。 本對方法棧 是用來保存本地方法(native)執行的棧結構 方法區 在jdk1.8中已經更名為元空間了,這里面主要保存如下內容:類型信息類型的全限定名超類的全限定名直接超接口的全限定名類型標誌(該類是類類型還是接口類型)類的訪問描述符(public、private、default、abstract、final、static)類型的常量池欄位信息欄位修飾符(public、protect、private、default)欄位的類型欄位名稱方法信息類變量各種引用類實例的引用加載器的引用方法表 方法表是以非抽象類為緯度創建的數組,數組里面的元素是類中每個方法的直接引用,提升訪問效率。 程序計數器 程序計數器是用來保存所在線程在切換前執行指令所在的行號,這個主要是解決多線程情況下,進行線程切換帶來的問題,如果只有單線程,其實是不需要程序計數器的。 堆區域是如何進行劃分的? 了接jvm的同學應該都知道,堆其實是分為新老年代的,這主要是為了進行垃圾回收而設計的一種結構 新老年代相關jvm參數 -XX:NewRatio 設置新老年代比例,如-XX:NewRatio=5 代表 新老年代比例為1:5,新生代占用堆記憶體的1/6,老年代占用5/6;jvm默認新老年代為1:2;需要注意的是如果程序啟動指定了-XX:MaxNewSize值,那麼設置比例的參數就會失效,老年代的值則為堆記憶體大小減去MaxNewSize; -XX:SurvivorRatio 設置新生代中eden和兩個2個Survivo區域大小的比例,如-XX:SurvivorRatio=8,則eden:s1:s2=8:1:1,默認比例就是為8:1:1. young GC發生在新生代中,FUll GC 發生在整個堆空間中,一般是老年代空間不夠用就會觸發FULL GC 逃逸分析 逃逸分析 主要用來分析方法內部的哪些對象是可以在在棧里面分配的,因為一般對象都是在堆中分配的,在堆中分配的對象,需要等待垃圾回收器進行回收,在回收之前會一直占用堆空間的,但是如果在一個方法內部,一個對象如果滿足以下條件,是可以在棧中進行分配的: 是局部變量 沒有將賦值給成員變量 沒有被當作返回值跳出去 在jdk1.7之前需要使用-XX:+DoEscapeAnalysis參數進行開啟,jdk1.7默認開啟逃逸分析,如果需要關閉也是使用-XX:+DoEscapeAnalysis 參數進行關閉 什麼是即時編譯技術 我們寫說下JVM的運行模式有哪幾種? 解釋模式 執行一行字節碼就編譯成一行機器碼執行特點:使用解釋模式,JVM啟動速度快,但是執行執行命令慢,需要一行一行進行編譯 編譯模式 先將所有字節碼全部編譯為機器碼,然後一次性加載所有機器碼執行特點:使用編譯模式,JVM啟動速度會稍微慢點,因為需要進行編譯,但是執行的時候幾乎不需要有任何消耗 混合模式 使用解釋模式執行代碼,但是如果碰到一些熱點或共用的代碼片段,會採用編譯模式執行,並且會將編譯的內容緩存起來,減少重複編譯,從而提高代碼執行效率,這個也是JVM默認採用的編譯模式,這個就是JIT(即時編譯技術) 來源:kknews性能優化|JVM記憶體分配機制

69頁企業級shell腳本編程指南,超詳細實戰講解,快拿走

shell是一種基本功,是每個程式設計師都需要掌握的。Shell腳本是幫助程式設計師和系統管理員完成費時費力的枯燥工作的利器,是與計算機交互並管理文件和系統操作的有效方式。區區幾行代碼,就可以讓計算機接近按照你的意圖行事。 今天給大家分享一份由【Linux段子手王老師】整理的《企業級Shell腳本編程實戰指南》,全文共9章69頁,對shell腳本編程基礎、基本結構、bash的配置文件、流程控制、函數、工具、數組、字符串處理、高級變量等內容做了詳細的講解。 這份文檔內容全面豐富,圖文結合,易於理解。從入門到實戰,手把手教你快速上手工作中最常用的shell腳本編程,新手小白也能看懂。 【領取方式見文末!!】 【領取方式見文末!!】 目錄 編程基礎 shell腳本語言的基本結構 bash的配置文件 流程控制 函數介紹 其他腳本相關工具 數組 字符串處理 高級變量 編程基礎 程式語言:人與計算機之間交互的語言。分為兩種:低級語言和高級語言 shell腳本語言的基本結構 靜態和動態語言 靜態編譯語言:使用變量前,先聲明變量類型,之後類型不能改變,在編譯時檢查,如:java,c 動態編譯語言:不用事先聲明,可隨時改變類型,如:bash,Python bash的配置文件 非交互式登錄 (1)su UserName (2)圖形介面下打開的終端 (3)執行腳本 (4)任何其它的bash實例 流程控制 for循環 for 變量名 in 列表;do 循環體 done 函數介紹 函數的執行結果返回值: 使用echo等命令進行輸出 函數體中調用命令的輸出結果 其他腳本相關工具 expect 是由Don Libes基於Tcl( Tool Command Language )語言開發的,主要應用於自動化交互式操作的場景,藉助 expect 處理交互的命令,可以將交互過程如:ssh登錄,ftp登錄等寫在一個腳本上,使之自動化完成。尤其適用於需要對多台伺服器執行相同操作的環境中,可以大大提高系統管理人員的工作效率 數組 變量:存儲單個元素的記憶體空間 數組:存儲多個元素的連續的記憶體空間,相當於多個變量的集合 字符串處理 字符串切片 查找替換 查找並刪除 字符大小寫轉換 高級變量 eval命令將會首先掃描命令行進行所有的置換,然後再執行該命令。該命令適用於那些一次掃描無法實現其功能的變量,該命令對變量進行兩次掃描 【領取方式見下圖!!】 點擊下方了解更多即可試讀《企業級Shell腳本編程實戰手冊》第二章節內容~ 來源:kknews69頁企業級shell腳本編程指南,超詳細實戰講解,快拿走

Python Launcher 是什麼鬼東西?網友直呼

你可能在他處見到過這鬼東西,when you install or uninstall python, and so on。那麼你肯定與我一樣對這個鬼東西起了一絲興趣趣! 1. 問題所在 由於Python2.x版本的腳本和Python3.x版本的腳本在語法上會有不兼容的情況。那麼,必須使用不同的策略來允許【py】腳本使用基於腳本指定的Python解釋器版本來選擇合適的Python解釋器!這句話相當的拗口!說人話,就是我有個test腳本需要Python2.x版本的解釋器來執行。 python test.py 你如何確保執行該腳本的解釋器版本就是我需要的解釋器!也就是,如何確定你就是我需要的那個姑娘!上面的「python」命令,是系統在PATH中找到的。而PATH中Python變量,有可能被我們手動修改,拋開這個不談,一般的,『python』命令是調用Python3.x版本的解釋器。但這不完全可靠,因為當系統在PATH中找『python』命令時,如果Python2.x版本的在Python3.x的前面,那麼, Python的默認解釋器將變為2.x版本,因為系統找到一個就返回了(系統在Python2.x的安裝目錄中找到了python.exe)。想想你的Python解釋器的安裝目錄內。不管是哪個版本都有這些: 針對這個弊端,又有了另一個約定: •python2將引用Python 2.x的某些版本•python3將引用Python 3.x的某些版本 要了解更多的關於Python在『python』命令方面的其他的約定,請參考PEP 394 在 Linux 中 在Linux中(基於Unix的系統中),通過軟連接的方式來綁定指定的Python解釋器。比如: 這些軟連將不同的python命令指向一個實際位置的Python解釋器的啟動目錄。而這些在哪用到呢,被【Shebang】用到了,也就是俗稱的文件頭(這里只聊shebang關於Python文件頭的部分)。通過文件頭系統就去軟連中找到對應的那個『python』命令,而該命令有綁定到一個具體的Python解釋器。 #!/usr/bin/python2 在 Windows 中 上述問題也存在與Windows系統中,那麼我們也希望在Windows中和Unix中同樣運行【Shebang】的能力,並且——沒有什麼是又好使又不需要發明新的語法或者約定來描述更讓人愉快的事情了!經過後來的完善,在PEP 397中正式出現並伴隨Python3.3版本發布。它叫【Python Launcher】 2. 解決問題 Python launcher是用於Windows中的一個實用程序,可幫助我們定位和執行不同版本的Python解釋器。它允許腳本或者命令行指示特定的Python版本的首選項,並將定位並執行該版本。mmp,還是這麼拗口!說人話就是它很智能的區分開是你想要手動指定解釋版本執行py腳本,還是想使用腳本文件指定的解釋器。你手動的選擇Python解釋器,這是調用了你在【PATH】中的Python變量。舉個例子。你在Windows下的cmd中,使用Python3.7版本的解釋器,執行一個文件: $ python3.7 test.py 這麼執行發生了什麼?Windows會在PATH中尋找python3.7這個解釋器。找到並執行test.py文件。而這個test.py(你從未打開過該文件)文件呢,其實它需要python2.7版本的解釋器來執行。這樣是不是就有問題了。我們用Python launcher來解決這個問題,這玩意兒它會正確的選擇最合適的Python版本。 如何安裝 Python launcher 一般的,從3.3版本開始,Python launcher會伴隨解釋器的安裝而可選安裝,在安裝步驟的可選項中可勾選。如本Blog網誌的第一個圖所示。它會被放在系統的PATH中(Python3.6版本開始是這樣的,之前版本稍有變動,參見Python3.3版本新功能),如果你不手動添加的話。 另一種方式是單獨安裝。如本Blog網誌的第一個圖所示,你可以單獨勾選該項使之單獨安裝。在多個版本Python中,Python launcher只需安裝一次,並且兼容所有的Python版本。所以,如果在安裝3.6版本時,選擇Python launcher選項,那麼如果你在安裝3.7版本,該項則就無法選中,因為已經安裝了。 Python launcher有兩個版本,一個是控制台程序,另一個是『windows』(即GUI)程序。這兩個程序對應我們Python安裝目錄中的『python.exe』和『pythonw.exe』這兩個可執行文件。 控制台程序被命名為『py.exe』,而windows程序則命名為『pyw.exe』,並且pyw.exe將定位並執行pythonw.exe。 M:>where...

為什麼 Java 後端開發沒有大規模採用 Kotlin?

在使用了 Java 15 年後,我寫了第一行 Kotlin 代碼,到現在已經差不多 5 年了。我們的團隊用Utterlyidle替代 Spring,用Totallylazy進行函數式編程。我們是 IntelliJ 的忠實粉絲,並試著充分利用它提供的 Java 工具。 那個時候,我們不只使用 Java。有一些團隊對 Scala 感興趣,並用它開發了一些服務。但是,因為 Scala 與 Java 代碼庫協作的複雜性以及緩慢的構建時間,對於我們大多數人來說,它並沒有太大吸引力。 2017 年,Google宣布 Kotlin 成為 Android 的官方開發語言,另一個與我們關係密切的團隊開始評估是否可以在他們的伺服器端開發中使用它。最後,我們大多數人都去嘗試了一下。 我被 Kotlin 給代碼庫帶來的影響震撼到了。它給人的感覺是更高效、更安全,雖然開發工具沒有...

使用多線程編程來實現並發時,需要考慮並發所帶來的哪些風險呢?

並發與並行 分布式系統的一個重要特徵就是計算能力是可以並發或者並行的。 在分布式系統中,往往會將一個大任務進行分解,而後下發給不同的節點去計算,從而節省整個任務的計算時間。 並發與並行的區別 計算機用戶很容易認為他們的系統在一段時間內可以做多件事。比如,用戶一邊用瀏覽器下載視頻文件,一邊可以繼續在瀏覽器上瀏覽網頁。可以做這樣的事情的軟體被稱為並發軟體(ConcurrentSoftware)。 計算機能實現多個程序的同時執行,主要基於以下因素。 ·資源利用率。某些情況下,程序必須等待其他外部的某個操作完成,才能往下繼續執行,而在等待的過程中,該程序無法執行其他任何工作。因此,如果在等待的同時可以運行另外一個程序,無疑將提高資源的利用率。 ·公平性。不同的用戶和程序對於計算機上的資源有著同等的使用權。一種高效的運行方式是粗粒度的時間分片(Time Slicing)使這些用戶和程序能共享計算機資源,而不是一個程序從頭運行到尾,然後再啟動下一個程序。 ·便利性。通常來說,在計算多個任務時,應該編寫多個程序,每個程序執行一個任務並在必要時相互通信,這比只編寫一個程序來計算所有任務更加容易實現。 那麼並發與並行到底是如何區別的呢? The Practice of Programming一書的作者Rob Pike對並發與並行做了如下描述。 並發是同一時間應對(Dealing With)多件事情的能力;並行是同一時間動手做(Doing)多件事情的能力。並發(Concurrency)屬於問題域(Problem Domain),並行(Parallelism)屬於解決域(SolutionDomain)。並行和並發的區別在於有無狀態,並行計算適合無狀態應用,而並發解決的是有狀態的高性能;有狀態要著力解決並發計算,無狀態要著力並行計算,雲計算要能做到這兩種計算自動伸縮擴展。 上述的描述貌似有點抽象。舉一個生活中的例子,某些人工作很忙,那麼會請鐘點工來打掃衛生。一個鐘點工在一小時可以幫你掃地、擦桌子、洗菜、做飯。客戶並不關心哪件活兒先干哪件活兒後做,客戶所關心的是,付費的這一小時,需要看到所有活兒都完成。在客戶看來,這一小時內,所有的活兒都是一個鐘點工乾的,這就是並發。 再舉一例子,客戶的親戚要來看望客戶,還有不到一小時親戚就要登門了。那麼平時要花一小時才能做完的家務,如何才能提前做完呢? 答案是加人。多請幾個鐘點工來一起做事,比如某個鐘點工專門掃地,某人專門抹桌子,某人專門負責洗菜、做飯。這樣3人同時開工,就能縮短整體的時間,這就是並行。 從計算機的角度來說,單個CPU是需要被某個任務獨占的,就如同鐘點工,在掃地的同時不能做擦桌子的動作。如果她想去擦桌子,就需要將手頭的掃地任務先停下來。當然,由於多個任務是不斷切換的,因此,在外界看來,就有了「同時」執行多個任務的錯覺。 現代的計算機大多是多核的,因此,多個CPU同時執行任務,就實現了任務的並行。 線程與並發 早期的分時系統中,每個進程以串行方式執行指令,並通過一組I/O指令來與外部設備通信。每條被執行的指令都有相應的「下一條指令」,程序中的控制流就是按照指令集的規則來確定的。 串行編程模型的優勢是直觀性和簡單性,因為它模仿了人類的工作方式:每次只做一件事,做完再做其他事情。例如,早上起床,先穿衣,然後下樓,吃早飯。在程式語言中,這些現實世界的動作可以進一步被抽象為一組粒度更細的動作。例如,喝茶的動作可以被細化為:打開櫥櫃,挑選茶葉,將茶葉倒入杯中,查看茶壺的水是否夠,不夠要加水,將茶壺放在火爐上,點燃火爐,然後等水煮沸,等等。在等水煮沸這個過程中包含了一定程序的異步性。例如,在燒水過程中,你可以一直等,也可以做其他事情,比如開始烤麵包,或者看報紙(這就是另一個異步任務),同時留意水是否煮沸了。但凡做事高效的人,總能在串行性和異步性之間找到合理的平衡,程序也是如此。 線程允許在同一個進程中同時存在多個線程控制流。線程會共享進程範圍內的資源,例如記憶體句柄和文件句柄,但每個線程都有各自的程序計數器、棧以及局部變量。線程還提供了一種直觀的分解模式來充分利用作業系統中的硬體並行性,而在同一個程序中的多個線程也可以被同時調度到多個CPU上運行。 毫無疑問,多線程編程使得程序任務並發成為可能。而並發控制主要是為了解決多個線程之間資源爭奪等問題。並發一般發生在數據聚合的地方,只要有聚合,就有爭奪發生,傳統解決爭奪的方式是採取線程鎖機制,這是強行對CPU管理線程進行人為干預,線程喚醒成本高,新的無鎖並發策略來源於異步編程、非阻塞I/O等編程模型。 並髮帶來的風險 多線程並發會帶來以下問題。 ·安全性問題。在沒有充足同步的情況下,多個線程中的操作執行順序是不可預測的,甚至會產生奇怪的結果。線程間的通信主要是通過共享訪問欄位及其欄位所引用的對象來實現的。這種形式的通信是非常有效的,但可能導致兩種錯誤:線程干擾(Thread Interference)和記憶體一致性錯誤(Memory Consistency Errors)。 ·活躍度問題。一個並行應用程式的及時執行能力被稱為它的活躍度(Liveness)。安全性的含義是「永遠不發生糟糕的事情」,而活躍度則關注另外一個目標,即「某件正確的事情最終會發生」。當某個操作無法繼續執行下去,就會發生活躍度問題。在串行程序中,活躍度問題形式之一就是無意中造成的無限循環(死循環)。而在多線程程序中,常見的活躍度問題主要有死鎖、飢餓以及活鎖。 ·性能問題。在設計良好的並發應用程式中,線程能提升程序的性能,但無論如何,線程總是帶來某種程度的運行時開銷。而這種開銷主要是在線程調度器臨時關閉活躍線程並轉而運行另外一個線程的上下文切換操作(Context Switch)上,因為執行上下文切換,需要保存和恢復執行上下文,丟失局部性,並且CPU時間將更多地花在線程調度而不是在線程運行上。當線程共享數據時,必須使用同步機制,而這些機制往往會抑制某些編譯器優化,使記憶體緩存區中的數據無效,以及增加貢獻記憶體總線的同步流量。所以這些因素都會帶來額外的性能開銷。 死鎖 死鎖(Deadlock)是指兩個或兩個以上的線程永遠被阻塞,一直等待對方的資源。下面是一個用Java編寫的死鎖的例子。 Alphonse和Gaston是朋友,都很有禮貌。禮貌的一個嚴格的規則是,當你給一個朋友鞠躬時,你必須保持鞠躬,直到你的朋友回給你鞠躬。不幸的是,這條規則有個缺陷,那就是如果兩個朋友同一時間向對方鞠躬,那就永遠不會完了。這個示例應用程式中,死鎖模型如下。 package com.waylau.java.demo.concurrency; public class Deadlock { public static void main(String args) { final Friend alphonse = new Friend("Alphonse"); final Friend gaston...

看完這篇,你就知道Nginx能幹什麼了

作者:失戀的薔薇 原文:https://www.cnblogs.com/wcwnina/p/8728391.html Nginx的產生 <p沒有聽過Nginx?那麼一定聽過它的"同行"Apache吧!Nginx同Apache一樣都是一種WEB伺服器,基於REST架構風格,以統一資源描述符(Uniform Resources Identifier)URI或者統一資源定位符(Uniform Resources Locator)URL作為溝通依據,通過HTTP協議提供各種網絡服務。 <p然而,這些伺服器在設計之初受到當時環境的局限,例如當時的用戶規模,網絡帶寬,產品特點等局限並且各自的定位和發展都不盡相同。這也使得各個WEB伺服器有著各自鮮明的特點。 <pApache的發展時期很長,而且是毫無爭議的世界第一大伺服器。它有著很多優點:穩定、開源、跨平台等等。它出現的時間太長了,它興起的年代,網際網路產業遠遠比不上現在。所以它被設計為一個重量級的。它是不支持高並發的伺服器。在Apache上運行數以萬計的並發訪問,會導致伺服器消耗大量記憶體。作業系統對其進行進程或線程間的切換也消耗了大量的CPU資源,導致HTTP請求的平均響應速度降低。 <p這些都決定了Apache不可能成為高性能WEB伺服器,輕量級高並發伺服器Nginx就應運而生了。 <p俄羅斯的工程師Igor Sysoev,他在為Rambler Media工作期間,使用C語言開發了Nginx。Nginx作為WEB伺服器一直為Rambler Media提供出色而又穩定的服務。 然後呢,Igor Sysoev將Nginx代碼開源,並且賦予自由軟體許可證。 <p由於: Nginx使用基於事件驅動架構,使得其可以支持數以百萬級別的TCP連接 高度的模塊化和自由軟體許可證使得第三方模塊層出不窮(這是個開源的時代啊~) Nginx是一個跨平台伺服器,可以運行在Linux,Windows,FreeBSD,Solaris,AIX,Mac OS等作業系統上 這些優秀的設計帶來的是極大的穩定性 <p所以,Nginx火了! Nginx的用武之地 <pNginx是一款自由的、開源的、高性能的HTTP伺服器和反向代理伺服器;同時也是一個IMAP、POP3、SMTP代理伺服器;Nginx可以作為一個HTTP伺服器進行網站的發布處理,另外Nginx可以作為反向代理進行負載均衡的實現。 關於代理 <p說到代理,首先我們要明確一個概念,所謂代理就是一個代表、一個渠道; <p此時就涉及到兩個角色,一個是被代理角色,一個是目標角色,被代理角色通過這個代理訪問目標角色完成一些任務的過程稱為代理操作過程;如同生活中的專賣店~客人到adidas專賣店買了一雙鞋,這個專賣店就是代理,被代理角色就是adidas廠家,目標角色就是用戶。 正向代理 <p說反向代理之前,我們先看看正向代理,正向代理也是大家最常接觸的到的代理模式,我們會從兩個方面來說關於正向代理的處理模式,分別從軟體方面和生活方面來解釋一下什麼叫正向代理。 <p在如今的網絡環境下,我們如果由於技術需要要去訪問國外的某些網站,此時你會發現位於國外的某網站我們通過瀏覽器是沒有辦法訪問的,此時大家可能都會用一個操作FQ進行訪問,FQ的方式主要是找到一個可以訪問國外網站的代理伺服器,我們將請求發送給代理伺服器,代理伺服器去訪問國外的網站,然後將訪問到的數據傳遞給我們! <p上述這樣的代理模式稱為正向代理,正向代理最大的特點是客戶端非常明確要訪問的伺服器地址;伺服器只清楚請求來自哪個代理伺服器,而不清楚來自哪個具體的客戶端;正向代理模式屏蔽或者隱藏了真實客戶端信息。來看個示意圖(我把客戶端和正向代理框在一塊,同屬於一個環境,後面我有介紹): <p客戶端必須設置正向代理伺服器,當然前提是要知道正向代理伺服器的IP位址,還有代理程序的埠。如圖。 <p總結來說:正向代理,"它代理的是客戶端,代客戶端發出請求",是一個位於客戶端和原始伺服器(origin Server)之間的伺服器,為了從原始伺服器取得內容,客戶端向代理髮送一個請求並指定目標(原始伺服器),然後代理向原始伺服器轉交請求並將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設置才能使用正向代理。 <p正向代理的用途: (1)訪問原來無法訪問的資源,如Google (2)可以做緩存,加速訪問資源 (3)對客戶端訪問授權,上網進行認證 (4)代理可以記錄用戶訪問記錄(上網行為管理),對外隱藏用戶信息 反向代理 <p明白了什麼是正向代理,我們繼續看關於反向代理的處理方式,舉例如我大天朝的某寶網站,每天同時連接到網站的訪問人數已經爆表,單個伺服器遠遠不能滿足人民日益增長的購買慾望了,此時就出現了一個大家耳熟能詳的名詞:分布式部署;也就是通過部署多台伺服器來解決訪問人數限制的問題;某寶網站中大部分功能也是直接使用Nginx進行反向代理實現的,並且通過封裝Nginx和其他的組件之後起了個高大上的名字:Tengine,有興趣的童鞋可以訪問Tengine的官網查看具體的信息:http://tengine.taobao.org/。那麼反向代理具體是通過什麼樣的方式實現的分布式的集群操作呢,我們先看一個示意圖(我把伺服器和反向代理框在一塊,同屬於一個環境,後面我有介紹): <p通過上述的圖解大家就可以看清楚了,多個客戶端給伺服器發送的請求,Nginx伺服器接收到之後,按照一定的規則分發給了後端的業務處理伺服器進行處理了。此時~請求的來源也就是客戶端是明確的,但是請求具體由哪台伺服器處理的並不明確了,Nginx扮演的就是一個反向代理角色。 <p客戶端是無感知代理的存在的,反向代理對外都是透明的,訪問者並不知道自己訪問的是一個代理。因為客戶端不需要任何配置就可以訪問。 <p反向代理,"它代理的是服務端,代服務端接收請求",主要用於伺服器集群分布式部署的情況下,反向代理隱藏了伺服器的信息。 <p反向代理的作用: (1)保證內網的安全,通常將反向代理作為公網訪問地址,Web伺服器是內網 (2)負載均衡,通過反向代理伺服器來優化網站的負載 項目場景 <p通常情況下,我們在實際項目操作時,正向代理和反向代理很有可能會存在在一個應用場景中,正向代理代理客戶端的請求去訪問目標伺服器,目標伺服器是一個反向單利伺服器,反向代理了多台真實的業務處理伺服器。具體的拓撲圖如下: 二者區別 <p截了一張圖來說明正向代理和反向代理二者之間的區別,如圖。 <p圖解: 在正向代理中,Proxy和Client同屬於一個LAN(圖中方框內),隱藏了客戶端信息; 在反向代理中,Proxy和Server同屬於一個LAN(圖中方框內),隱藏了服務端信息; 實際上,Proxy在兩種代理中做的事情都是替伺服器代為收發請求和響應,不過從結構上看正好左右互換了一下,所以把後出現的那種代理方式稱為反向代理了。 負載均衡 <p我們已經明確了所謂代理伺服器的概念,那麼接下來,Nginx扮演了反向代理伺服器的角色,它是以依據什麼樣的規則進行請求分發的呢?不用的項目應用場景,分發的規則是否可以控制呢? <p這里提到的客戶端發送的、Nginx反向代理伺服器接收到的請求數量,就是我們說的負載量。 <p請求數量按照一定的規則進行分發到不同的伺服器處理的規則,就是一種均衡規則。 <p所以,將伺服器接收到的請求按照規則分發的過程,稱為負載均衡。 <p負載均衡在實際項目操作過程中,有硬體負載均衡和軟體負載均衡兩種,硬體負載均衡也稱為硬負載,如F5負載均衡,相對造價昂貴成本較高,但是數據的穩定性安全性等等有非常好的保障,如中國移動中國聯通這樣的公司才會選擇硬負載進行操作;更多的公司考慮到成本原因,會選擇使用軟體負載均衡,軟體負載均衡是利用現有的技術結合主機硬體實現的一種消息隊列分發機制。 <pNginx支持的負載均衡調度算法方式如下: weight輪詢(默認,常用,具有HA功效!):接收到的請求按照權重分配到不同的後端伺服器,即使在使用過程中,某一台後端伺服器宕機,Nginx會自動將該伺服器剔除出隊列,請求受理情況不會受到任何影響。 這種方式下,可以給不同的後端伺服器設置一個權重值(weight),用於調整不同的伺服器上請求的分配率;權重數據越大,被分配到請求的幾率越大;該權重值,主要是針對實際工作環境中不同的後端伺服器硬體配置進行調整的。 ip_hash(常用):每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,這也在一定程度上解決了集群部署環境下session共享的問題。 fair:智能調整調度算法,動態的根據後端伺服器的請求處理到響應的時間進行均衡分配,響應時間短處理效率高的伺服器分配到請求的機率高,響應時間長處理效率低的伺服器分配到的請求少;結合了前兩者的優點的一種調度算法。但是需要注意的是Nginx默認不支持fair算法,如果要使用這種調度算法,請安裝upstream_fair模塊。 url_hash:按照訪問的url的hash結果分配請求,每個請求的url會指向後端固定的某個伺服器,可以在Nginx作為靜態伺服器的情況下提高緩存效率。同樣要注意Nginx默認不支持這種調度算法,要使用的話需要安裝Nginx的hash軟體包。 Web 伺服器對比 幾種常用 Web 伺服器對比如下圖: 來源:kknews看完這篇,你就知道Nginx能幹什麼了

js深入淺出3種回調函數用法

嗨嘍,各位大家們,你們好呀~ 又來到了源碼時代知識大講堂,本期的內容可是乾貨滿滿。趕快跟著源妹兒一起探索探索。 本文主要講解js中重點3種回調函數的使用方法,深入淺出地詮釋了回調函數的作用,有一定經驗的大家都知道,如果能把回調函數合理使用起來的話,可以大大減少代碼的冗餘度,增強代碼的可讀性,同時也方便了後期的維護,讓你有更多的時間去處理那些當務之急. 其實回調函數大體上可以分為以下三類用法: 1. 直接回調 2. call回調 3. apply回調 有些大家又會問道:你說這麼好用的回調函數,我怎麼使用呢?它的運用場景又是什麼呢? 其實使用回調主要還是解決,當很多地方都需要調用同一個函數,並且這個函數根據不同的需求,作不同的事件處理時,此時使用回調函數就非常適應了. 那接下來,讓我們看一看具體的實例,讓大家對回調函數有更深入的理解應用場景 方式一: 直接使用回調函數 function boy() { alert('我是小明,晚上有空'); } function girl() { alert('哈哈'); } //公共函數 function father(callback) { callback(); callback.call(); } father(boy); //轉boy,回調boy函數 father(girl); //傳girl函數,回調girl函數 注意:此時如果不傳參數,callback()和callback.call()功能一樣哦 方式二: 使用call和apply回調 在使用之前,讓我們先來看一下call和apply之間的區別吧!幫助大家更容易理解 call(this,參數1,參數2,參數3,) apply(this,) 其實從上面的使用方法來看,call和apply都差不多,只不過是語法有所不同,參數部分,一個是直接寫參數,一個是數組列表.其中兩個方法都可以改變this的指向為目標對象,具體細節,我們使用示例來演示. 示例一: 方法類中的回調 function son(name) { this.sonName = name; this.showSonName = function () { alert(this.sonName); //彈出...

牛逼!自己手寫一個熱加載

熱加載:在不停止程序運行的情況下,對類(對象)的動態替換 Java ClassLoader 簡述 Java中的類從被加載到記憶體中到卸載出記憶體為止,一共經歷了七個階段:加載、驗證、準備、解析、初始化、使用、卸載。 接下來我們重點講解加載和初始化這兩步 加載 在加載的階段,虛擬機需要完成以下三件事: 通過一個類的全限定名來獲取定義此類的二進位字節流 將這個字節流所代表的的靜態存儲結構轉化為方法區的運行時數據結構 在記憶體中生成一個代表這個類的java.lang.Class對象,作為方法區這個類的各種數據的訪問入口。 這三步都是通過類加載器來實現的。而官方定義的Java類加載器有BootstrapClassLoader、ExtClassLoader、AppClassLoader。這三個類加載器分別負責加載不同路徑的類的加載。並形成一個父子結構。 類加載器名稱負責加載目錄BootstrapClassLoader處於類加載器層次結構的最高層,負責 sun.boot.class.path 路徑下類的加載,默認為 jre/lib 目錄下的核心 API 或 -Xbootclasspath 選項指定的 jar 包ExtClassLoader加載路徑為 java.ext.dirs,默認為 jre/lib/ext 目錄或者 -Djava.ext.dirs 指定目錄下的 jar 包加載AppClassLoader加載路徑為 java.class.path,默認為環境變量 CLASSPATH 中設定的值。也可以通過 -classpath 選型進行指定 默認情況下,例如我們使用關鍵字new或者Class.forName都是通過AppClassLoader類加載器來加載的 正因為是此父子結構,所以默認情況下如果要加載一個類,會優先將此類交給其父類進行加載(直到頂層的BootstrapClassLoader也沒有),如果父類都沒有,那麼才會將此類交給子類加載。 這就是類加載器的雙親委派規則。另外,關注公眾號Java技術棧,回覆:JVM46,可以獲取一份 46...

Vue進階(么叄陸):el-steps實現頁面內導航

在前端開發過程中,當頁面內容分為若干欄目後,通過增加導航欄位定位至相應欄目不失為一種良好的用戶體驗。 可通過el-steps實現頁面內欄目跳轉。el-steps基本用法如下: <el-steps :active="active" finish-status="success"> <el-step title="步驟 1"></el-step> <el-step title="步驟 2"></el-step> <el-step title="步驟 3"></el-step> </el-steps> <el-button @click="next">下一步</el-button> data:{ active:0 }, methods:{ next(){ if(this.active++ >2){ this.active = 0 } } } 重點介紹el-steps的direction、space、active、process-status、align-center屬性,截圖如下: 通過查看Element手冊,需要定寬的步驟條時,設置space屬性即可,單位為px,如果不設置為自適應(若不確定步驟條中每一步驟中內容高度或寬度,可設置為自適應;為使介面美觀,可修改el-step屬性 .el-step__main { width: 100%!important; padding-left: 3%!important; margin-bottom: 3%!important; } el-step屬性如下圖所示: 這里重點介紹下如何應用el-steps動態展示所需信息。demo如下: <div> <el-steps direction="vertical" :align-center="true" :active="arr.length" finish-status="success"> <el-step :title="item.title" :description="item.description" v-for="(item,...

在無線通信的背景下評估對抗逃逸攻擊

引用 FlowersB,BuehrerRM,HeadleyWC.EvaluatingAdversarialEvasionAttacksintheContextofWirelessCommunications.IEEEtransactionsoninformationforensicsandsecurity,2020,15:1102-1113. 摘要 射頻機器學習(RFML)的最新進展表明,原始同相和正交(IQ)樣本可用於多個頻譜感知任務。然而,在其他應用中,深度學習技術已被證明容易受到對抗性機器學習(ML)技術的攻擊,後者試圖製造小擾動並添加到輸入中,從而導致錯誤分類。當前的工作根據攻擊的執行位置區分了對抗 ML 對 RFML 系統構成的威脅:直接訪問分類器輸入、通過空中同步傳輸(OTA)或從單獨的設備異步傳輸。此外,目前一種評估無線通信環境下對抗成功的方法被開發了出來,其中主要的衡量標準是誤碼率,而不是像圖像識別那樣的人類感知。其使用快速梯度符號方法來評估基於原始 IQ 的自動調製分類的脆弱性。然而,在 OTA 攻擊中可能遇到的 RFML 域特定接收器效應會對對抗逃逸攻擊造成嚴重損害。 1. 介紹 近年來,深度學習的出現改變了許多研究領域的面貌,包括無線通信領域。特別是由美國國防部高級研究計畫局(DARPA)倡導的一項研究重點 RFML,旨在開發從原始數據代替手工設計的特徵中學習的射頻系統。RFML 的一個子集處理利用原始 IQ 樣本進行頻譜感知,其可用於 DSA 系統中,以確定主用戶和次用戶的存在,從而使傳輸參數適應環境,在信號智能方面有明顯的應用。而當下頻譜感知方法是利用 DNN 直接對原始 IQ 樣本進行操作。在 RFML 領域中,對抗機器學習可用於通過偽裝成主要用戶中斷 DSA 系統,避免移動發射機跟蹤,或通過混淆...

17-跟我一起學.NetCore之路由的最佳實現

前言 路由,這詞絕對不陌生,不管在前端還是後端都經常提到,而這節不說其他,就聊.NetCore的路由;在之前的http://Asp.Net MVC 中,路由算是面試時必問的考點,可見其重要性,它的主要作用是映射URL,而不需要關注伺服器的物理文件結構,提高安全性,同時規範了URL請求,有利於搜尋引擎優化;所以在Asp.NetCore中當然也不能缺少,以下說說其應用。 正文 在Asp.NetCore中,註冊路由方式有兩種: 模板路由註冊:適合應用於MVC頁面項目,相對於來說,使用模板的形式更加方便,約定大於配置,統一URL; 特性路由註冊(RouteAttribute):適合應用於API項目,針對於不同業務路由會進行定製,特性標註顯得更加便捷; 少說話,多擼碼,這里就創建一個WebAPI項目來進行演示: 默認情況下,創建的WebAPI項目是推薦使用特性路由方式進行註冊(MVC默認是使用路由模板方式),當然也可以在Api項目中進行使用模板路由方式註冊,如下: 當註釋掉特性路由,在註冊終結點時增加路由模板,最終運行時會出現異常,因為用ApiController標識的Controller必須是特性路由,那把ApiController特性也註釋掉,結果就正常運行了,如下: 這里其實有一個重要的知識點:路由匹配規則,考慮到大家們之前使用http://Asp.Net MVC時就用到,先默認大家們瞭解這塊知識(抽時間單獨整理一篇出來);以下內容著重說說特性路由應用和路由約束這塊,因為有關注到接觸的項目中不管是之前的http://Asp.Net, 還是現在的Asp.NetCore項目,幾乎沒有看到路由約束的應用,而在很多場景,路由約束很有必要,用於消除路由的歧義。 特性路由應用 直接在Action上加Route 特性,如下: 運行結果如下: 通常為了避免在每個Action中的重複的指定路徑前綴,可以將公共部分提取到Controller類上進行Route標識,如下: 統一前綴之後,運行結果: 以上的方式都是將路徑寫成固定的字符串,有時候會要求像模板路由中那樣動態替換指定標記(,, ),通常項目中會如下使用: 以上只是簡單說說特性路由的用法,大家們可以根據實際情況進行標註,當然如果有特殊需求,也可以進行自定義路由特性,只要繼承IRouteTemplateProvider接口即可,上面標註的Route和HttpGet特性也是繼承於這個接口,把RouteAtrribute的原始碼扒出來參考參考: namespace Microsoft.AspNetCore.Mvc { // 標識此特性只能在類和方法上使用 public class RouteAttribute : Attribute, IRouteTemplateProvider { private int? _order; // 構造函數,傳入一個Url模板參數 public RouteAttribute(string template) { Template = template ?? throw new ArgumentNullException(nameof(template)); } public string...

10種程式語言實現Y組合子 函數式編程的理論基礎

10種程式語言實現Y組合子 原創 技師 阿里技術 一 Y-Combinator Y組合子是Lambda演算的一部分,也是函數式編程的理論基礎。它是一種方法/技巧,在沒有賦值語句的前提下定義遞歸的匿名函數。即僅僅通過Lambda表達式這個最基本的「原子」實現循環/疊代,頗有道生一、一生二、二生三、三生萬物的感覺。 1 從遞歸的階乘函數開始 先不考慮效率等其他因素,寫一個最簡單的遞歸階乘函數。此處採用Scheme,你可以選擇自己熟悉的程式語言跟著我一步一步實現Y-Combinator版的階乘函數。 (define (factorial n) (if (zero? n) 1 (* n (factorial (- n 1))))) Scheme中 (define (fn-name)) 是 (define fn-name (lambda)) 的簡寫,就像JS中,function foo() {} 等價於 var...

Laravel源碼解析—服務容器

服務容器 1.什麼是IoC IOC 模式,不是一種技術,而是一種設計思想。在應用程式開發中,IoC 意味著將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制,也是一種面向接口編程的思想。 當我們以面向接口編程的時候,程序中實例之間的耦合將上升到接口層次,而不是代碼實現層次,使用配置文件來實現類的耦合。 容器的作用很簡單,將在代碼中使用像(new object)這樣語法進行耦合的方式,改為配置文件來管理耦合,通過這種改變,從而保證系統重構或者業務邏輯改變時,不會發生「牽一髮而動全身」的效果,從而有更好的可擴展性、可維護性。 總結:藉助於「第三方」實現具有依賴關係的對象之間的解耦。 舉個栗子 在日常開發應用中,我們要實現一個功能,在用戶處理模塊中調用獲取用戶信息Model,通常是使用像(new object)這樣的語法,在用戶處理模塊中將對象創造出來,這時代碼依賴耦合就出現了,在獲取用戶信息 Model時則需要修改用戶處理模塊里的代碼。 而調用 IoC 容器則將依賴耦合上升到接口層次,只需要修改容器註冊時所綁定的服務即可。 其中涉及到 依賴注入、控制反轉、反射 的思想 2.控制反轉 控制反轉是將組件間的依賴關係從程序內部提到外部容器來管理,那麼就會出現,誰控制誰?反轉是什麼?有正轉嗎? 上述流程圖中 應用程式自身調用用戶處理模塊 創建了 獲取用戶信息Model ,那麼 用戶處理模塊 控制了 獲取用戶信息Model ,這種創建過程稱為 正轉 IoC 模式調用創建權 交給了 IoC容器,由 Ioc 容器去創建 獲取用戶信息Model ,那麼...

硬核觀察 | C# 還有什麼是可以開源的?

C# 還有什麼是可以開源的? 微軟正在將 C# 語言的標準化工作轉移到 .NET 基金會的公共資源庫中,為正在進行的標準工作提供一個公共空間。C# 6 及以後版本的 ECMA標準的工作將在 GitHub 上的公共工作空間中進行。從語言創新和功能設計到實現和標準化,一切都將在「開放」中進行,對話也將公開。微軟表示,這將使標準化工作更加容易。 這是繼 2014 年開源 C# 編譯器、將 C# 語言設計放到 GitHub 上之後的開放 C# 的又一舉措。 我覺得現在微軟對開源、開放的追求已經到了不開放不舒服的階段。即便是這種「真愛」背後有著完整的商業邏輯和訴求,也很難想像這樣的一個軟體巨頭能改變的如此徹底。dotnet 也許改名做 dotopen 更合適了。 CPU 算法訓練深度神經網絡可比...