導航:首頁 > 操作系統 > androidzeromq

androidzeromq

發布時間:2022-06-06 10:14:06

A. GitHub上面有哪些經典的java框架源碼

B. 如何從C++代碼直接訪問android framework層的WifiService / 藍訊

在我的整個職業生涯里我都在使用C++,而且現在C++依然是我做大多數項目時的首選編程語言。自然的,當我從2007年開始做ZeroMQ(ZeroMQ項目主頁)時,我選擇用C++來實現。主要的原因有以下幾點:1.包含數據結構和演算法的庫(STL)已經成為這個語言的一部分了。如果用C,我將要麼依賴第三方庫要麼不得不自己手動寫一些自1970年來就早已存在的基礎演算法。2.C++語言本身在編碼風格的一致性上起到了一些強製作用。比如,有了隱式的this指針參數,這就不允許通過各種不同的方式將指向對象的指針做轉換,而那種做法在C項目中常常見到(通過各種類型轉換)。同樣的還有可以顯式的將成員變數定義為私有的,以及許多其他的語言特性。3.這個觀點基本上是前一個的子集,但值得我在這里顯式的指出:用C語言實現虛函數機制比較復雜,而且對於每個類來說會有些許的不同,這使得對代碼的理解和維護都會成為痛苦之源。4.最後一點是:人人都喜歡析構函數,它能在變數離開其作用域時自動得到調用。如今,5年過去了,我想公開承認:用C++作為ZeroMQ的開發語言是一個糟糕的選擇,後面我將一一解釋為什麼我會這么認為。首先,很重要的一點是ZeroMQ是需要長期連續不停運行的一個網路庫。它應該永遠不會出錯,而且永遠不能出現未定義的行為。因此,錯誤處理對於ZeroMQ來說至關重要,錯誤處理必須是非常明確的而且對錯誤應該是零容忍的。C++的異常處理機制卻無法滿足這個要求。C++的異常機制對於確保程序不會失敗是非常有效的——只要將主函數包裝在try/catch塊中,然後你就可以在一個單獨的位置處理所有的錯誤。然而,當你的目標是確保沒有未定義行為發生時,噩夢就產生了。C++中引發異常和處理異常是松耦合的,這使得在C++中避免錯誤是十分容易的,但卻使得保證程序永遠不會出現未定義行為變得基本不可能。在C語言中,引發錯誤和處理錯誤的部分是緊耦合的,它們在源代碼中處於同一個位置。這使得我們在錯誤發生時能很容易理解到底發生了什麼:intrc=fx();if(rc!=0)handle_error();在C++中,你只是拋出一個異常,到底發生了什麼並不能馬上得知。intrc=fx();if(rc!=0)throwstd::exception();這里的問題就在於你對於誰處理這個異常,以及在哪裡處理這個異常是不得而知的。如果你把異常處理代碼也放在同一個函數中,這么做或多或少還有些明智,盡管這么做會犧牲一點可讀性。try{…intrc=fx();if(rc!=0)throwstd::exception(「Error!」);…catch(std::exception&e){handle_exception();}但是,考慮一下,如果同一個函數中拋出了兩個異常時會發生什麼?classexception1{};classexception2{};try{…if(condition1)throwmy_exception1();…if(condition2)throwmy_exception2();…}catch(my_exception1&e){handle_exception1();}catch(my_exception2&e){handle_exception2();}對比一下相同的C代碼:…if(condition1)handle_exception1();…if(condition2)handle_exception2();…C代碼的可讀性明顯高的多,而且還有一個附加的優勢——編譯器會為此產生更高效的代碼。這還沒完呢。再考慮一下這種情況:異常並不是由所拋出異常的函數來處理。在這種情況下,異常處理可能發生在任何地方,這取決於這個函數是在哪調用的。雖然乍一看我們可以在不同的上下文中處理不同的異常,這似乎很有用,但很快就會變成一場噩夢。當你在解決bug的時候,你會發現幾乎同樣的錯誤處理代碼在許多地方都出現過。在代碼中增加一個新的函數調用可能會引入新的麻煩,不同類型的異常都會涌到調用函數這里,而調用函數本身並沒有適當進行的處理,這意味著什麼?新的bug。如果你依然堅持要杜絕「未定義的行為」,你不得不引入新的異常類型來區分不同的錯誤模式。然而,增加一個新的異常類型意味著它會涌現在各個不同的地方,那麼就需要在所有這些地方都增加一些處理代碼,否則你又會出現「未定義的行為」。到這里你可能會尖叫:這特么算什麼異常規范哪!好吧,問題就在於異常規范只是以一種更加系統化的方式,以按照指數規模增長的異常處理代碼來處理問題的工具,它並沒有解決問題本身。甚至可以說現在情況更加糟糕了,因為你不得不去寫新的異常類型,新的異常處理代碼,以及新的異常規范。通過上面我描述的問題,我決定使用去掉異常處理機制的C++。這正是ZeroMQ以及CrossroadsI/O今天的樣子。但是,很不幸,問題到這並沒有結束…考慮一下當一個對象初始化失敗的情況。構造函數沒有返回值,因此出錯時只能通過拋出異常來通知出現了錯誤。可是我已經決定不使用異常了,那麼我不得不這樣做:classfoo{public:foo();intinit();…};當你創建這個類的實例時,構造函數被調用(不允許失敗),然後你顯式的去調用init來初始化(init可能會失敗)對象。相比於C語言中的做法,這就顯得過於復雜了。structfoo{…};intfoo_init(structfoo*self);但是以上的例子中,C++版本真正邪惡的地方在於:如果有程序員往構造函數中加入了一些真正的代碼,而不是將構造函數留空時會發生什麼?如果有人真的這么做了,那麼就會出現一個新的特殊的對象狀態——「半初始化狀態」。這種狀態是指對象已經完成了構造(構造函數調用完成,且沒有失敗),但init函數還沒有被調用。我們的對象需要修改(特別是析構函數),這里應該以一種方式妥善的處理這種新的狀態,這就意味著又要為每一個方法增加新的條件。看到這里你可能會說:這就是你人為的限制使用異常處理所帶來的後果啊!如果在構造函數中拋出異常,C++運行時庫會負責清理適當的對象,那這里根本就沒有什麼「半初始化狀態」了!很好,你說的很對,但這根本無關緊要。如果你使用異常,你就不得不處理所有那些與異常相關的復雜情況(我前面已經描述過了)。而這對於一個面對錯誤時需要非常健壯的基礎組件來說並不是一個合理的選擇。此外,就算初始化不是問題,那析構的時候絕對會有問題。

C. 程序員怎麼去提升自己能力

二:信息採集器和筆記本

首先你要給自己設定一個目標,就如同一個公司會設定它的Vision。

目標要夠大,這樣你才能看到更多的風景。

目標應該設定在解決哪一類問題,而不是精通哪一類技術。技術只是手段,不是目的。

例如,「我要成為iOS developer中的達人」這個目標,就遠不如「我要成為前端應用開發的專家」來得有意義。前者學到深處你可能會去鑽研iOS framework里各種奇技淫巧,而後者你會開始關注視覺與交互設計,研究各平台間的差異與共同趨勢。顯然,後者更有助於你的個人發展。

不過即便有了明確的目標,選擇哪一類技術學習,如何學習,在信息過載的今天依然是一個難題。常有的觀點是應該學習最新的技術,因為老的已經過時,而反對的觀點則是新技術還不成熟。我個人的觀點是,當初入一個領域時,選擇主流技術框架;當你有一定經驗後,選擇技術時更應該關注背後的推動者,我相信優秀的人和團隊總能打造優秀的產品,無論是商業公司還是開源社區。不必太在意技術的新舊,因為可能很快都會成為過去時。你真正要學習的是技術背後的思想。有不少語言與開源項目會寫它的Coding philosophy,這是很有意思的,你可以從它們的源代碼中去驗證這些編程理念。以python為例,如果你執行import this就會看到它的理念,再如Python中一個著名的開源庫Celery,在它的文檔有專門一節講述它的編程理念。它們對你的影響會比這些技術本身來得更深遠,這是我給初學者們的一個忠告。

同理,我非常推薦讀一些優秀開源庫或是語言的源代碼,例如Python的標准庫絕大部分都是用Python實現的,而且可讀性非常好。如果學習一門技術僅僅停留在用的層面上,你就還沒有完全吸取其中的精華,而且學習的收益會隨著技術的過時而消失。

我的另一個學習原則是,在選擇學習一門新技術時,最大化它與你現有知識庫的差異性。讀起來可能有拗口,例如你會Django,接下去你應該去學習Ruby on Rails還是NodeJS?依據這個原則,你應該學NodeJS,因為它的非同步IO模型在理念上與Django的同步模型差異很大,而RoR則與Django更多相似之處。但更好的選擇是不要去學另一個Web framework,去學習ZeroMQ或是Redis,這兩者對於Web development也非常有幫助,這樣就做到了最大化差異。從構建一個程序員的技術理念角度,我會推薦每一個程序至少去了解Lisp或是一門Functional programming language,不管你是否會在可見的未來用到,它們能讓你從一個不同的角度看待編程。

最後我建議每個程序員都應該經營一款自己的產品,它可以是一款app,一個網站或是一個開源軟體。除非你是一個創業公司的早期員工,不然你可能沒有機會將所有學到的技術或是理念都付之實踐,有很多人想成為全棧工程師,最快的捷徑就是打造一款自己的產品。任何一個設計師都會精心打造自己的Portfolio,但大部分程序員卻不會。當評估一個程序員的Coding能力時,我會去看他的Github上是否有出彩的項目,可惜國內絕大部分程序員的Github空空如也,或者只有一些非常簡單的程序。我建議大家好好經營自己Github上項目,這不但可以提高你的聲譽,對你將來的求職也非常有幫助。當你報怨求職面試時又被問到各種無厘頭的程序題時,有沒有想過面試官也很無奈,因為他沒有任何其他方法得知你的Coding能力究竟如何。如果每一個程序員都有自己的作品,我想程序員的面試會簡單許多。

重視溝通能力的培養

當被問到「你覺得Junior Developer和Senior Developer最大的差別是什麼」時,我最自然的反應是溝通與文檔。溝通包括程序員團隊內部的溝通,與其他團隊的溝通,與Manager的溝通等等。我不認為自己有能力把這些問題非常概括地說清楚,不過我可以給一條建議,那就是先學會和你的Manager溝通,讓他來教你其餘的部分。許多公司都會設置Manager與組員的1:1,一個有效率的1:1應該大部分時間有組員來主導。這需要你在1:1之前花足夠多的時間來考慮要問的問題,並且最好提前1天發給Manager,讓他有機會思考答案。許多人對此不太重視,或者只問非常具體的問題而不是一些開放性問題,這樣你很難在你的Manager身上學到東西。如果你漸漸懂得如何利用1:1的時間,它很會成為你在工作中單位時間投資回報率最高的活動。

累積你的人脈

每個人都明白人脈的重要性,但實際做起來卻不容易。參加一些線下的會議或是活動,可能是最直接的擴展人脈的方式之一。可惜大部分人似乎只是去聽了一場技術講座就回家了。當然,這和不少活動的時間安排也有關系,講座時間排得太滿,茶歇時間短,加上有時嘉賓遲到或是沒控制好時間,乾脆就把茶歇取消了。而實際上,結識一兩個同道中人遠比聽技術講座有價值。下次去參加這類會議,不妨給你自己設個目標,比如至少加兩個同行的微信。之後維系你的人脈可能需要花更多的時間,下了班或是周末找你的朋友們喝個咖啡吧?

另外我覺得每個人都需要一個職場導師,他可以是你第一份工作的導師或是Manager,也可以是你認識的其他前輩。你們需要維系一個非常長期的關系,不止於一家公司,最好貫穿你的整個職業生涯。每當你遇到疑惑時,都可以詢求他的建議,我覺得這將是你最寶貴的一筆人脈財富。

尋找發揮你才華的平台

最後也是最重要的一步,找到適合你的公司。做為求職者評估一家公司可以看三個方面:

公司的發展前景(大公司的話,看所在部門的發展前景)

你將要加入的團隊

薪資福利

所以在面試一家公司的時候,你要意識到面試是雙向的,公司在面試你的同時,你也在面試這家公司。面試前你應該對這家公司做足功課,准備好一些有質量的問題,比如指出產品中的問題,詢問開發流程或是如何做績效評估。到時你也可以檢驗一下你的面試官是否合格。

每次選擇公司對以上三個方面都應兼顧,但在職業生涯的不同階段,側重點不同。比如,在剛剛工作時,加入一個優秀的團隊最為重要,他們可以教會你很多東西,提升你的能力。工作5年之後,你需要一個平台施展你的才華,體現個人價值,公司發展前景的重要性迅速提升。當你做出一番成績,證明了自己的價值之後,逐漸進入收獲期,就有了與公司要價的資格。另一方面,團隊實力對公司的前景也有很大的影響。

對一個剛畢業,初入職場的同學,一個近幾年被問了無數次的問題「我的第一份工作是去創業公司還是大公司?」我的回答仍舊是「加入一個優秀的團隊最為重要」。一些知名的大公司,團隊的素質是有一定保證,但創業公司則不然,團隊素質參差不齊,所以如我前面所說你需要面試這個團隊,做出自己的判斷。不過除了團隊因素之外,我想提一下畢業生去創業公司的幾個好處。

首先,在剛畢業的一段時間內,經濟壓力小,是最自由最能承受風險的時期,而這段時間往往不長,所以應把握好這個去創業公司的黃金時段。其次,所有的學生進入大公司後,都會擔任初級職位,某種程度上來講是學校學習的延續,規范有條理,但缺乏獨立性和創新性,而這正是中國大部分學生所欠缺的。這方面的能力在一家創業公司可以得到快速鍛煉,而在大公司可能要等升到中級職位後才有這方面的機會。個人觀點,僅供參考。

小結

我覺得步入職場的前3年對今後的發展尤其重要,希望此文能對年輕的程序員們有所幫助。歡迎評論?

如果想私信我的朋友可以加群,大家一起學習,一起學術分享,資料共享

D. plc讀取bms數據

新的PLC大都開始支持乙太網(以前的串口局限性太大了),有的甚至在CPU上直接設置乙太網介面,編程,數據傳輸,都可以通過這個埠來搞定,不再需要增加一個乙太網介面卡。
下面是我整理的採集PLC數據的25種姿勢:PLC->組態軟體->OPC客戶端/Modbus客戶端2.PLC直連PLC協議轉換器3.Kepware加嵌入式工控機,上面跑iot平台的agent。4.MatlabOPC工具箱5.LabviewOPC6.Pyopc加paho加mqttbroker7.PostgresqlSPI通過plc協議讀PLC串口,將採集到的數據直接往資料庫表裡寫8.Nodejs串口plc協議解析加mqtt9.awssitewiseopcua10.PLC自帶Modbus協議支持,pymodbus加paho。11.最省硬體成本和流量的方案:WiFi晶元里跑協議解析和數據發送雲平台。12.串口plc串口轉乙太網,tcp透傳到公網伺服器,ie瀏覽器里嵌入socket控制項,用iisasp頁面發送數據給伺服器,然後返回。13.dtu透傳串口或網口到公網伺服器,公網伺服器跑plc採集數據程序。14.PLC協議轉換軟體運行在嵌入式linux上,如kuraboschiot15.單片機,上面放兩塊晶元,一塊通過網口或串口採集plc數據,一塊主控。16.stm32單片機上跑micropython,用串口自己實現plc協議解析。17.安卓手機接usb轉串口線,接plc,再把數據通過awsIoTandroidsdk發到雲端http介面。介面收到後用微信python庫發送數據到微信群里。18.給某水果公司代工的工廠,用macmini當工控機,用objective-c寫plc數據採集驅動採集數據,通過vpn發送到蘋果公司總部。讓蘋果公司總部實時掌握每天產量質量。19.pyopc或pyserial採集數據,然後用zeromq或amqp協議發送到雲端。20.nodejs模塊,然後用JS通過MQTToverwebsocket來發送數據到雲端。前端界面開發人員分分鍾變身物聯網全棧開發人員。21.不寫代碼,用node-red拖。類似的是litmus。22.給工控人員用要簡單易用,用c#開發agent,內置vbscript或lua腳本,提供幾個函數,串口打開關閉,mqtt連接發布訂閱。當然也可以java加jython。23.要是連懶得拖node-red,外包給thingworx或ignition的二次開發商。跟工廠用metasys二次開發商監控一回事。24.有錢像高鐵或公安網建專網,或者像水果公司建vpn,plc就變成區域網設備,又安全又方便。沒錢,就透傳或中繼。25.Wolfram的OPCClassic這是個Modelica庫,可以讓模擬模型通過OPC標准連接到OPC伺服器,從而連到PLC設備。
在工業的信息化、智能化,甚至工業4.0的大潮中,很多高級演算法都是由上位機、雲來實現,那麼PLC數據採集是最基本的前提條件之一。

閱讀全文

與androidzeromq相關的資料

熱點內容
python正則表達式貪婪模式 瀏覽:646
愛國精神指的是什麼app 瀏覽:408
壽司解壓系列全集視頻 瀏覽:913
物體三維重建演算法 瀏覽:984
fuli直播app哪個好 瀏覽:918
租辦公室用什麼app 瀏覽:106
醫師定期考核刷題app哪個好 瀏覽:338
導出dmp文件命令 瀏覽:288
手機百度網盤怎麼解壓密碼文件 瀏覽:585
索引重新編譯 瀏覽:606
命令與征服4免cd補丁完美版 瀏覽:428
kotlin編譯為native 瀏覽:142
家用編譯機 瀏覽:550
電子加密貨幣最新政策 瀏覽:382
androidcanvas撤銷 瀏覽:272
安卓手機怎麼把圖標全部下移 瀏覽:187
飢荒被伺服器踢出怎麼進 瀏覽:173
c編譯器哪款好 瀏覽:732
快手寶哥發明什麼app 瀏覽:823
張艷玲編譯 瀏覽:68