<dfn id="hx5t3"><strike id="hx5t3"><em id="hx5t3"></em></strike></dfn>

    <thead id="hx5t3"></thead><nobr id="hx5t3"><font id="hx5t3"><rp id="hx5t3"></rp></font></nobr>

    <listing id="hx5t3"></listing>

    <var id="hx5t3"></var>
    <big id="hx5t3"></big>

      
      

      <output id="hx5t3"><ruby id="hx5t3"></ruby></output>
      <menuitem id="hx5t3"><dfn id="hx5t3"></dfn></menuitem>

      <big id="hx5t3"></big>

        阿遂_Asui

        阿遂_Asui 查看完整檔案

        北京編輯北京工業大學  |  計算機科學與技術 編輯SegmentFault  |  技術編輯 編輯 github.com/Sapesn 編輯
        編輯

        SegmentFault 思否社區老編輯

        飲水機の守護神,艾澤拉斯的勇士,朝陽區埃米納姆,我爸我媽的兒子,深夜撰稿者,統領一貓一狗的國王,Glory to the Sin'dorei!

        個人動態

        阿遂_Asui 贊了文章 · 3月1日

        火山引擎智能容器云 veCompass v3.0 重磅發布!

        火山引擎智能容器云 veCompass v3.0

        在剛剛過去的一年,云原生技術在全球范圍內取得了長足進展。正如 Gartner 研究副總裁 Sid Nag 所言:疫情印證了云的價值,這種按需使用、彈性可擴展的技術模型可以為企業實現成本效益和業務連續性,也是企業推動業務數字化轉型的重要動力。

        從 2010 年 Paul Fremantle 在博客中首次提出 Cloud Native(云原生)到現在,云原生已經不再局限于容器編排、容器管理等基礎架構層面的功能,而是被成功應用到企業核心業務中,成為業務創新和業務增長的重要推動力。

        在日前結束的 2021 年春節聯歡晚會上,抖音順利支撐起了高達 703 億的紅包互動總數和累計 12.21 億的春晚直播間觀看人次,這背后有火山引擎提供的云原生技術能力支持。其彈性容器底座設計和敏捷開發流程設計,保障了研發團隊在短短 27 天內迅速完成春晚活動應用的開發、迭代和上線,并利用資源智能調度系統、自動擴縮容設計、自定義監控穩定應對流量洪峰。

        作為火山引擎在云原生領域的重量級產品,智能容器云 veCompass 是一種全鏈條、全自動的云端服務,覆蓋企業 IT 開發、測試、部署、生產、智能監控、運維全流程。它深度整合 Kubernetes,可為企業級客戶提供以多集群、多租戶為核心的高效虛擬化與彈性資源管理能力,以應用商店、可視化編排為核心的應用部署能力。

        從實現商業化至今,veCompass 已經對外發布了數個大版本:

        • 2015 年 11 月,v1.0 發布,聚焦權限管理、應用編排、灰度部署、日志、監控等特性,旨在幫助企業在云服務上建立自己的業務應用和處理自己的業務開發流程,從而令開發者向云端開發模式轉變;
        • 2017 年 5 月,v2.0 發布,根據客戶業務場景需求,圍繞應用編排、微服務、多集群管理、用戶權限等功能進行了優化,并設計了多種負載均衡服務、多種存儲后端、多種網絡方案,增強了平臺的適用性。

        經過金融、制造、零售、文旅、教育等行業大量 500 強企業的復雜真實業務考驗,時隔四年,火山引擎智能容器云 veCompass v3.0 正式發布。新版本全面吸收字節跳動基礎架構最佳實踐經驗,進一步融合了云原生技術能力,在基礎架構層面鞏固了容器集群管理、容器編排等能力,在云原生應用層面實現了微服務架構支持、服務治理能力的全面升級,可幫助企業一站式實現敏捷的交付與迭代,打造以應用為中心的云時代基礎設施。

        亮點一:云原生核心組件全面升級

        長期以來,veCompass 的重要定位之一是基于云原生開源生態打造企業級容器平臺,因此它與時俱進引入了大量云原生核心組件。隨著開源社區迅速發展,這些組件也不斷推陳出新,釋放了眾多新特性。在 3.0 版本中,為了方便用戶更便捷地把這些特性引入生產環境,veCompass 做了以下升級:

        • 核心組件升級:Kubernetes 版本升級到 v1.19,Harbor 版本升級到 v2.1,Calico 版本升級到 v3.17.0;
        • Runtime 升級:支持 containerd,兼容 CRI;
        • 治理能力升級:服務網格支持跨集群的服務發現和路由、SpringCloud 應用無侵入接入、不間斷升級網格。

        同時,為了更好地支持用戶構建自己的微服務體系架構,veCompass 將原有微服務模塊抽離形成獨立產品,通過服務網格技術為用戶提供了更全面的微服務治理能力;服務網格服務同樣基于開源 Istio 方案,確保兼容擴展的同時,也提供了跨集群路由、無侵入接入、不間斷升級等增強特性。

        亮點二:云原生平臺分層重構

        在產品交付過程中,除了提供 veCompass 的私有化部署和定制化二開,火山引擎也提供從容器云咨詢、設計到實施的專業容器技術服務,幫助企業輕松突破云原生應用構建、交付和運行的限制和瓶頸,因此 veCompass 的用戶大多對云原生技術已經有深入了解,也熟悉云原生組件的概念和所提供的能力。

        考慮到云原生理念日益深入人心,云原生技術的使用人群逐年擴大,為了貼合用戶的使用習慣,充分釋放原生組件能力,veCompass v3.0 在產品設計中對云原生組件和業務平臺進行了分層重構,并提供了更多原生接口和工具:

        • 分層設計:底層基于開源打造 ContainerOS,持續提升穩定性和可擴展性;上層業務平臺敏捷迭代,更快滿足用戶個性化需求;
        • 原生接口和工具:新版本向用戶開放 Kubernetes API,支持通過 kubectl 直接訪問 Kubernetes 集群和基于 Helm 的應用發布管理。

        亮點三:融合字節跳動最佳實踐

        從 2015 年起,字節跳動內部就已經開始采用 Kubernetes 和容器作為在線服務運行環境的統一標準,發展至今,這套云原生基礎底座支撐著包括今日頭條、抖音、西瓜視頻等產品線。

        目前 veCompass 已接入字節跳動技術體系,完全融入火山引擎產品生態,成為具備企業級 Kubernetes 服務、多云多活全局調度能力的新一代云原生架構基礎。在服務客戶的過程中,veCompass v3.0 可以為用戶提供更豐富的解決方案,支撐更多元的使用場景:

        • 全新界面:引入全新火山引擎界面風格和頁面設計,為客戶提供更便捷的操作體驗和一致產品使用體驗;
        • 統一的賬號和權限體系:新版本支持客戶用統一賬號登錄訪問,方便技術人員無縫訪問多種火山引擎產品,提升效率;
        • 基礎設施資源深度融合:新版本完成了與火山引擎基礎設施的技術整合,幫助企業一站式構建完整云原生產品閉環。

        其他重要更新

        除了以上亮點,veCompass v3.0 還增加了許多新特性,重點包括:

        • 多版本 Kubernetes 支持:支持靈活選擇和部署多版本(v1.17 和 v1.19)的 Kubernetes 集群;
        • 資源彈性擴縮容:基于多年生產環境大流量場景應對實踐,集群的節點組資源現可根據業務負載動態更精細地擴縮容;
        • 自定義部署方案:客戶可根據業務情況和實際需求自定義按需進行部署配置,包括集群配置、節點配置、組件配置等;
        • 多類型負載均衡:支持創建公網/內網類型的負載均衡實例;
        • 更靈活的容器部署方案:支持原生 YAML 與 Web 界面配置的相互轉換;
        • 更強大健康的監控系統:內置報警,覆蓋平臺和 K8s 關鍵組件;
        • 細顆粒度的指標查詢:可以執行無限數量的高基數查詢,按照任何維度對任何指標進行切片和分塊;
        • 更便捷實用的 DevOps:提供跨平臺鏡像倉庫同步,并支持流水線環境變量設置。

        小結

        云原生技術及產品,可以幫助企業級客戶從原有傳統 IT 架構向現代應用架構演進。從 v1.0 到 v3.0,火山引擎智能容器云 veCompass 的主要功能在不同行業的各類企業中經過不斷打磨,已趨于穩定。

        在服務客戶的過程中,火山引擎也根據客戶不斷提出新業務需求,不斷開拓云原生技術在企業 IT 環境中應用的巨大發展空間。隨著 veCompass 日漸成熟,未來,火山引擎將持續發力容器服務、鏡像倉庫等面向應用的 aPaaS 智能彈性底座能力的深度優化,并不斷提升微服務、服務治理、CI/CD、DevOps 等能力,幫助企業打造面向開發者的端到端敏捷開發解決方案,快速構建現代化應用架構。

        業務咨詢請撥打客服熱線:400-850-0030

        segmentfault 思否

        查看原文

        贊 1 收藏 0 評論 1

        阿遂_Asui 贊了文章 · 3月1日

        編碼技術新突破:字節跳動 AVG 讓視頻縮小 13%

        字節跳動的海外技術團隊在全球視頻編碼領域實現最新突破。

        據聯合視頻專家組 JVET 官網顯示,字節跳動 AVG(先進視頻團隊)今年 2 月發起一項視頻壓縮的技術提案,該提案能夠在優化壓縮質量的同時,節約至少 13% 的存儲和帶寬。例如,一段 180 分鐘 H.266/VVC 標準的高清視頻(1080P 分辨率),大約需要 3GB 的數據體積,應用新技術后只需要 2.6GB。這是業界公開的單個智能編碼工具的最佳性能增益。

        字節跳動 AVG 在美國加州建立研發團隊,成員有來自高通、微軟、英特爾等巨頭的資深研究員,也有出身海內外頂級院校的新生代。在此前 JVET 制定新一代國際視頻編解碼標準 H.266/VVC 的過程中,字節跳動 AVG 累計提交 260+ 項技術提案,其中 130+ 項被采納,被采納提案數和采納率均排在世界前列,是 H.266/VVC 核心算法的主要貢獻者之一。

        視頻是由一張張圖片連接起來的動態圖像序列,視頻編解碼則是視頻應用的底層核心技術,作用是對圖像進行壓縮和數字編碼,以盡可能小的帶寬傳送高質量的視頻數據。H.266/VVC 能夠在不影響畫質的情況下,把視頻碼率降低到前一代標準 H.265/HEVC 的一半。本來只夠放標清視頻的網速,也能流暢播放高清視頻。

        此次字節跳動 AVG 提出的新算法,旨在通過深度學習技術構建減少視頻壓縮失真的濾波器(DAM),主干是基于殘差單元堆疊的深度卷積網絡,輔以自適應模型選擇以最大程度適應特性復雜的自然視頻。所謂殘差單元是指通過引入跳層連接,允許網絡把注意力放在變化的殘差上,這與視頻圖像幀之間的殘差有異曲同工之妙,比如武林高手決斗,“劍光一閃”,每一幀圖像絕大部分內容是相同的,閃動的劍光形成殘差,這也是視頻編碼壓縮的重點關注對象。

        實驗結果顯示,相比 H.266/VVC 最新標準,字節跳動的 DAM 解決方案能夠為視頻編碼性能帶來顯著提升,亮度信號 Y 可實現 10.28% 的性能增益,兩個色度信號 U 和 V,性能增益也分別達到 28.22% 和 27.97%,在視頻質量有所優化的同時,至少還可縮小 13% 的數據體積。

        測試用例來自國際標準組織的測試視頻
        圖:測試用例來自國際標準組織的測試視頻

        據悉,字節跳動 AVG 已自主研發了 BVC2.0 編碼器,首次參加國際權威的 MSU 2020 視頻編碼器大賽,就在四項評價指標上包攬第一。AVG 的各項研究成果,也將通過 BVC 編碼器的升級換代投入應用,包括抖音、西瓜視頻、今日頭條等 App 的視頻類內容處理,以及云計算、云游戲等基礎架構領域,從而為用戶帶來更高清畫質、更流暢播放的視頻體驗。

        AVG 除了深度參與國際視頻標準制定外,也為國產新一代視頻壓縮標準 AVS3 做出重要貢獻,包括塊劃分、運動矢量編碼及預測、色-亮度幀內預測等多項原創性技術被 AVS3 視頻標準所采納。字節跳動因此獲得 2019 年度 AVS 產業技術創新之提案獎,是迄今唯一獲獎的互聯網企業。

        字節跳動 AVG 的張莉博士介紹說,視頻壓縮標準作為服務商必須遵循的規范,不僅蘊含著難以估量的商業價值,也會為用戶帶來實實在在的便利。通過標準制定與產品研發,字節跳動會持續創新并輸出技術能力,與行業一起為用戶提供更優質的視頻服務。

        segmentfault 思否

        查看原文

        贊 1 收藏 0 評論 0

        阿遂_Asui 發布了文章 · 2月25日

        萬物互聯的背后,有一座“數據圍城”

        物聯網之父 Kevin Ashton 在近期的一次訪談中表示:“物聯網的真正意義,不在于收集存儲數據。更多場景下,在于正確高效地利用數據?!?/p>

        之所以提出這個觀點,是因為現階段的物聯網也被稱作數據“泛在聚合”意義上的物聯網。萬物互聯的時代造就了龐大的數據海洋,Kevin 認為應該通過對其中每個數據進行屬性的精確標識,全面實現數據的資源化。

        如果不能合理、合規、合情的利用這些數據,我們將會進入一座物聯網時代的“數據圍城”。

        一、物聯網時代的“數據圍城”

        未來學家托夫勒認為,改變世界的有四種力量:暴力、知識、金錢,以及大數據。

        戰爭改變人類社會的走向,知識影響社會的發展軌跡,金錢操縱著世界發展的命脈。而大數據之所以能位列其中,是因為“大數據”就代表著社會的形態,如何定義和理解大數據,就是如何定義和理解這個社會。

        物聯網作為一種建立在互聯網上的泛在網絡,讓互聯網時代的大數據從量變發展到了質變 —— 數據既包含數據本身,也包含了物聯網中的萬物以及物的狀態,物與物、物與人之間的交互。

        “像是一座被圍困的城堡,城外的人想沖進去,城里的人想逃出來?!边@是錢鐘書先生書中所描述的圍城,而物聯網時代的“數據圍城”,是指數據雖然可以為我們認知社會、推進社會發展提供源源不斷的動力,但卻因為我們的不“善假于物”,被不合理的分析和解讀。

        二、為何要打破這座“數據圍城”?

        打破這座“數據圍城”,既是互聯網深入發展的必然要求,也是物聯網的使命所在。

        而想要打破這座“數據圍城”,就需要在物聯網所造就的數據海洋中,構建一種“泛在的聚合”關系,使人們不再受系統環境、外部設備和數據終端的限制,便可對各類數據執行方便的檢索、計算和分析,并結合已有的數學分析模型,挖掘這些數據所代表的事務之間普遍存在的復雜聯系,從而實現人類對周邊世界認知能力的革命性飛躍。

        打破“數據圍城”的前提,是要洞悉物聯網時代的數據特點,這其中包括了數據采集、數據處理、數據共享和數據的有效性甄別四個方面,只有在特定場景中進行特定的處理,數據才能轉化成我們所需要的信息。

        以數據采集為例,作為物聯網的第一道關隘,若想打破“數據圍城”,切入點必須從傳感器入手。傳感器是物聯網感知層的數據接口,主要負責感知外界信息、響應上層指令,并配合各類終端設備完成數據的統一標準化接入。然而,不同類別的傳感器所捕獲的信息內容和信息格式均不相同,需要按一定的頻率,周期性地采集環境信息并實時更新。隨著現代物聯網的發展,傳感器本身也需要具備智能化處理的能力,即能夠對物體實施智能控制。

        因此,從傳感器入手,需要思考的是如何重新定義“傳感器”和“數據”間的關系。如果能將傳感器和智能處理相結合,從海量信息中提取、分析、加工和處理數據,輔助業務決策,適應用戶的多種需求,便能拓展出全新的應用領域和應用模式。

        牽一發而動全身,僅僅從數據采集這一層切入,便要考慮如此多的因素。因此,若想真正打破物聯網時代的“數據圍城”,將會涉及物聯網產業中的多個角色,但只要圍繞著前文提到的數據特點進行突破,一定可以達到事半功倍的效果。

        三、如何利用物聯網時代的數據特點打破“數據圍城”

        物聯網的本質是由眾多生態、系統通過特定的規律整合而成,無論生態多么龐大、系統多么復雜,其都可以細分為一個個組件和功能模塊,洞悉了這些組件和模塊的數據特點,便可以推導出與之關聯的物聯網的“破城口”。

        以現代企業智慧辦公為例,來看一下在該場景如何利用各個組件和功能模塊的數據特點打破這座“數據圍城”。通過前文的分析,已知該場景的數據特點包含三個層面:數據共享、場景化(數據處理)和效率(數據的有效性甄別)。(詳情請閱覽:《縱觀 Excel 演化史,開發者如何通過“表格技術”提升企業生產力》

        其中的數據共享,既是該場景的特點,也是物聯網時代數據的重要特征。進入物聯網時代后,辦公軟件的使用場景從 PC 和桌面端,擴展到了移動設備、智能手機、PAD 等更多的移動端,企業所面臨的智慧辦公最大的難點也已經從單純的一臺操作設備,升級成跨設備以及多人之間的協作協同,越來越多的數據需要被采集、分享和運用。

        在操作系統層面, HarmonyOS 借助了自身分布式軟總線、分布式數據管理和分布式安全三大核心能力有效解決了跨設備的協同問題。但對于具體數據信息的采集、處理、共享和多人協作編輯,仍需要各類在線文檔軟件的支持。

        在線文檔類軟件的出現,為企業辦公提供了全新的工作模式,通過將辦公數據從本地遷移到云端,打破了時間和空間的限制,用“更高的效率和更低的成本”實現了在線實時存儲和多人協作,這一點也與物聯網未來的發展不謀而合。

        可見,對于在線文檔類軟件來說,只要能貼合物聯網時代的數據特點,便可以協助打破這座“數據圍城”。而無論是數據的采集、計算分析和多人協同交互等都離不開表格控件所提供的底層支持。葡萄城,作為物聯網數據類應用落地“協作者”的代表之一,提供的正是這樣的能力。(詳情請閱覽:打破技術壁壘, 用SpreadJS 搶占“表格文檔協同編輯系統”的入市先機

        作為全球領先的軟件開發技術提供商,葡萄城以“ 賦能開發者”為使命,致力于通過各類軟件開發工具和服務,創新開發模式,提升開發效率,服務企業數智化轉型。

        葡萄城研發的純前端表格控件 SpreadJS ,提供了表格文檔協同編輯、 數據填報和類Excel報表設計的功能支持,可幫助軟件廠商和系統集成商有效應對數據處理、數據共享和數據有效性甄別等業務需要。

        純前端表格控件 SpreadJS

        借助 SpreadJS“高性能、跨平臺、與 Excel 高度兼容”的產品特性,可以讓數據處理不再受硬件、操作系統與使用環境的限制,從而實現高效的在線填報、模板設計以及多人協同,構建出更為便捷、易用、安全的分布式數據管理架構。(了解詳情:SpreadJS 純前端表格控件

        結語:物聯網時代,重新審視人與世界間的關系

        互聯網時代讓我們重塑了人與人之間的關系。而物聯網時代則將這層關系網放大,需要讓我們重新審視物與物、人與物之間的關系,這也是之所以需要打破這一座“數據圍城”的意義所在。

        了解物聯網行業的朋友都知道,物聯網產業鏈中包含八大環節:芯片提供商、傳感器供應商、無線模組(含天線)廠商、網絡運營商(含 SIM 卡商) 、平臺服務商、系統及軟件開發商、智能硬件廠商和技術服務提供商。

        其中網絡運營商負責的是物聯網的底層通道,也是目前物聯網產業鏈中最成熟的環節;芯片、傳感器等硬件廠商則是物聯網的大腦和四肢,低功耗、高可靠性的半導體芯片是物聯網幾乎所有環節都必不可少的關鍵部件之一;專供物聯網的操作系統雖然仍處于起步階段,但目前入局的都是 IT 行業的巨頭,如谷歌、微軟、蘋果、華為、阿里等。

        縱觀整個環節中,目前最容易被忽視、最需要與物聯網相結合的恰恰是物聯網應用落地真正的“協作者” —— 技術服務提供商。他們才是萬物互聯時代鏈接人與物、人與物聯網之間最直接的一根紐帶。

        打破萬物互聯時代的數據圍城,既需要迎合時代大的技術背景,也需要聚焦到每個人的需求當中。我們需要華為、阿里、谷歌這類技術先鋒為人類擴展技術的無限可能,也需要像 SpreadJS 這樣的垂直細分產品,以人為中心,在技術大潮中服務用戶的本質需求。

        segmnetfault 思否

        查看原文

        贊 26 收藏 2 評論 1

        阿遂_Asui 贊了文章 · 2月25日

        遙感資源大放送(下)| 11 個經典遙感數據集

        內容提要:利用遙感影像進行土地類別分型,最常用的方法是語義分割。本文繼上期土地分類模型訓練教程之后,又整理了幾大主流公開遙感數據集。

        原創:HyperAI超神經

        關鍵詞:遙感數據集? ?語義分割? ?機器視覺


        在上一期遙感資源大放送(上):用開源代碼,訓練土地分類模型 中,我們詳細介紹了遙感影像進行土地分類的常用方法,以及具體如何使用利 deeplab-v3+?用于土地 7 分類的具體訓練過程及代碼。

        教程地址:

        https://openbayes.com/console...

        遙感圖像原圖(上)與 7 分類圖(下)示例

        除了分類與識別問題之外,遙感影像的常用場景還包括:

        • 超分辨率重建問題
        • 多源遙感影像快速處理問題
        • 遙感影像的分布式存儲問題

        本期中,我們整理了 11 個遙感數據集資源,其檢測目標分類少則 2 種,多則可達 45 類,能夠為大家的模型訓練提供更加充足的「彈藥」,請按需取用。

        Part 1:用于 2-5 分類問題

        UCAS-AOD 遙感影像數據集

        UCAS AOD 遙感影像數據集,用于飛機和車輛檢測。

        具體來說,飛機數據集包括 600 張圖像和 3210 架飛機,而車輛數據集包括 310 張圖像和 2819 輛車輛。所有的圖像都經過精心挑選,使數據集中的物體方向分布均勻。

        車輛(a)與飛機(b)目標檢測示例

        該數據集由中國科學院大學(國科大)于 2014 年首次發布,并于 2015 年補充,相關論文有《Orientation Robust Object Detection in Aerial Images Using Deep Convolutional Neural Network》。

        以下是該數據集的詳細信息:

        UCAS-AOD 遙感影像數據集

        發布機構:中國科學院大學

        更新時間:2014 年發布,2015 年補充

        包含數量:600 張飛機 & 310 張車輛圖像

        圖像來源:谷歌地球衛星圖像

        數據格式:.png

        圖片尺寸:1280*659

        數據大?。?/strong>3.48GB

        類別數量: 2 類

        下載地址:_https://hyper.ai/datasets/5419_

        Inria Aerial Image Labeling Dataset

        Inria Aerial Image Labeling Dataset 是一個用于城市建筑物檢測的遙感圖像數據集,其標記被分為建筑(building)和非建筑(not building)兩種,主要用于語義分割。

        以下是該數據集的詳細信息:

        Inria Aerial Image Labeling 數據集

        發布機構:INRIA(法國國家信息與自動化研究所)

        發布時間:2017 年

        包含數量:360 張圖像

        數據格式:GeoTiff

        圖像尺寸:5000*5000

        數據大?。?/strong>69GB

        類別數量:2?類

        發布時間:2017?年

        下載地址:_https://hyper.ai/datasets/5428_

        RSOD-Dataset 物體檢測數據集

        RSOD Dataset 是用于遙感圖像中物體檢測的數據集,其包含飛機、操場、立交橋和油桶四類目標,數量分別為:

        • 飛機:446 張圖,包含 4993 架飛機;
        • 操場:189 張圖,包含 191 個操場;
        • 立交橋:176 張圖,包含 180 座立交橋;
        • 油桶:165 張圖,包含 1586 個油桶。

        以下是該數據集的詳細信息:

        RSOD Dataset

        發布機構:武漢大學

        發布時間:2015 年

        包含數量:976?張圖像

        數據格式:.jpg

        數據大?。?/strong>324.96MB

        類別數量:4?類

        下載地址:_https://hyper.ai/datasets/5425_

        Part 2:用于 5-10?分類問題

        RSSCN7 DataSet 遙感圖像數據集

        RSSCN7 Dataset 包含 2800 幅遙感圖像,這些圖像來自于 7 個典型的場景類別 ——?草地、森林、農田、停車場、住宅區、工業區和河湖,其中每個類別包含 400 張圖像,分別基于 4 個不同的尺度進行采樣。

        該數據集中每張圖像的像素大小為 400*400,場景圖像的多樣性導致其具有較大的挑戰性,這些圖像來源于不同季節和天氣變化,并以不同的比例進行采樣。

        以下是該數據集的詳細信息:

        RSSCN7?Dataset

        發布機構:武漢大學

        發布時間:2015 年

        包含數量:2800?張圖像

        數據格式:.jpg

        圖像尺寸:400*400

        數據大?。?/strong>348.02MB

        類別數量:7?類

        下載地址:_https://hyper.ai/datasets/5440_

        NWPU VHR-10 地理空間物體檢測遙感數據集

        NWPU VHR-10 Dataset 是一個用于空間物體檢測的 10 級地理遙感數據集,其擁有 650 張包含目標的圖像和 150 張背景圖像,共計 800 張,是從Google Earth和Vaihingen數據集裁剪而來的,然后由專家手動注釋。

        其目標種類包括飛機、艦船、油罐、棒球場、網球場、籃球場、田徑場、港口、橋梁和汽車共計 10 個類別。

        以下是該數據集的詳細信息:

        NWPU VHR-10 數據集

        發布機構:西北工業大學

        發布時間:2014 年

        包含數量:800 張圖像

        數據格式:.jpg

        數據大?。?/strong>73MB

        類別數量:10?類

        下載地址:_https://hyper.ai/datasets/5422_

        Part 3:用于 11-20?分類問題

        RSC11 DataSet 遙感影像數據集

        RSC11 Dataset 是一個遙感影像數據集,來源于 Google Earth 的高分辨率遙感影像,合計包含 11 類場景圖像,包括密林、疏林、草原、港口、高層建筑、低層建筑、立交橋、鐵路、居民區、道路、儲罐。其中每類有約 100 張,共計 1232 張,空間分辨率為 0.2 米。

        該數據集由中科院于 2015 年發布,主要發布人為趙立軍。

        以下是該數據集的詳細信息:

        RSC11? 數據集

        發布機構:中科院

        發布時間:2015?年

        包含數量:1232 張圖像

        數據格式:.tif

        圖片尺寸:512*512

        數據大?。?/strong>20.12MB

        類別數量:11 類

        下載地址:_https://hyper.ai/datasets/5443_

        SIRI-WHU 遙感影像數據集

        SIRI-WHU Dataset 包含了 12 個類別的場景,圖像共計 2400 張,其中每個類別有 200 張,每張圖像的像素尺寸為 200*200,空間分辨率為 2 米。

        該數據集資源來自 Google Earth,主要涵蓋中國城市地區,其中場景圖像數據集由武漢大學 RS-IDEA 集團設計。

        以下是該數據集的詳細信息:

        SIRI-WHU? 遙感影像數據集

        發布機構:武漢大學

        發布時間:2016?年

        包含數量:2400?張圖像

        數據格式:.tif

        圖片尺寸:200*200

        數據大?。?/strong>162.08MB

        類別數量:12 類

        下載地址:_https://hyper.ai/datasets/5437_

        WHU-RS19 DataSet 遙感影像數據集

        WHU-RS19 Dataset 是一個遙感影像數據集,其包含 19 個類別的場景影像共計 1005 張,其中每個類別有 50 張??捎糜趫鼍胺诸惡蜋z索。

        該數據集由武漢大學于 2011 年發布,相關論文有《Satellite Image Classification via Two-layer Sparse Coding with Biased Image Representation》。

        以下是該數據集的詳細信息:

        WHU-RS19 數據集

        發布機構:武漢大學

        發布時間:2011 年

        包含數量:1005 張圖像

        數據格式:.tif

        圖片尺寸:600*600

        數據大?。?/strong>99.54MB

        類別數量:19?類

        下載地址:_https://hyper.ai/datasets/5434_

        Part 4:用于 20+?分類問題

        UC Merced Land-Use DataSet

        UC Merced Land-Use Dataset 是一個用于研究的 21 級土地利用圖像遙感數據集,均提取自 USGS National Map Urban Area Imagery(美國地質調查局國家地圖城市地區圖像) 系列,其被用于全國各地的城市地區。

        此數據集公共領域圖像的像素分辨率為 1 英尺(0.3 米),圖像像素大小為 256*256,包含 21 個類別的場景圖像共計 2100 張,其中每個類別有 100 張。

        這 21 個類別分別是:農業、飛機、棒球場、海灘、建筑物、樹叢、密集住宅、森林、高速公路、高爾夫球場、港口、路口、中型住宅、移動家庭公園、立交橋、停車場、河、跑道、稀疏住宅、儲油罐。

        以下是該數據集的詳細信息:

        UC Merced Land-Use?數據集

        發布機構:UC Merced Vision&Learning Lab

        包含數量:2100 張

        數據格式:.png

        圖片尺寸:256*256

        數據大?。?/strong>317.07MB

        類別數量:21?類

        發布時間:2010 年

        下載地址:_https://hyper.ai/datasets/5431_

        AID DataSet 遙感影像數據集

        AID Dataset 是一個遙感影像數據集,其包含 30 個類別的場景圖像,其中每個類別有約 220–420 張,整體共計 10000 張,其中每張像素大小約為 600*600。

        該數據集由華中科技大學和武漢大學于 2016 年發布,相關論文:《AID: A Benchmark Dataset for Performance Evaluation of Aerial?Scene Classification》。

        以下是該數據集的詳細信息:

        AID 遙感影像數據集

        發布機構:華中科技大學和武漢大學

        包含數量:10000 張

        數據格式:.jpg

        圖片尺寸:600*600

        數據大小: 2.47GB

        類別數量:30?類

        發布時間:2016?年

        下載地址:_https://hyper.ai/datasets/5446_

        NWPU DataSet 遙感影像數據集

        NWPU Dataset 遙感影像數據集,包含像素大小為 256*256 共計 31500 張圖像,涵蓋 45 個場景類別,其中每個類別有 700 張圖像。

        這 45 個場景類別包括飛機、機場、棒球場、籃球場、海灘、橋梁、叢林、教堂、圓形農田、云、商業區、密集住宅、沙漠、森林、高速公路、高爾夫球場、地面田徑、港口、工業地區、交叉口、島、湖、草地、中型住宅、移動房屋公園、山、立交橋、宮、停車場、鐵路、火車站、矩形農田、河、環形交通樞紐、跑道、海、船舶、雪山、稀疏住宅、體育場、儲水箱、網球場、露臺、火力發電站和濕地。

        該數據集由西北工業大學發布,相關論文有《Remote Sensing Image Scene Classification: Benchmark and State of the Art》。

        以下是該數據集的詳細信息:

        NWPU Dataset?遙感影像數據集

        發布機構:西北工業大學

        包含數量:31500?張

        數據格式:.jpg

        圖片尺寸:256*256

        數據大小: 403.71MB

        類別數量:45?類

        發布時間:2017?年

        下載地址:_https://hyper.ai/datasets/5449_

        以上就是本期資源包的全部內容,你也可以訪問以下鏈接:https://hyper.ai/搜索「遙感數據集」,就可直達全部資源。

        查看原文

        贊 1 收藏 0 評論 0

        阿遂_Asui 發布了文章 · 2月24日

        Python 緊急修復漏洞,攻擊者此前可遠程代碼執行漏洞

        Python-漏洞

        近日,Python 軟件基金會 (PSF) 緊急推出 Python 3.9.2 和 3.8.8 穩定版,解決了兩個嚴重的安全缺陷,其中一個從理論上攻擊者可遠程代碼執行漏洞。

        PSF 在最新的聲明中表示:“自從發布 3.9.2 和 3.8.8 的候選版本以來,由于安全方面的原因,我們收到了大量終端用戶的查詢督促,要求我們加快最終穩定版本的發布速度?!?/p>


        PSF 在聲明中指出,發布候選版本中包含兩個安全修復方案:CVE-2021-3177 和 CVE-2021-23336。

        修復的漏洞具體的原因在于,Python 3.x 到 3.9.1 的 ctypes/callproc.c 中 PyCArg_repr 有緩沖溢出,這可能導致遠程代碼執行。它會影響“接受浮點數作為不受信任的輸入的 Python 應用程序,如 c_double.from_param 的 1e300 參數所示”。

        發生該錯誤是原因,是因為不安全地使用了“sprintf”。影響之所以廣泛,是因為 Python 已將其預先安裝到了多個 Linux 發行版和 Windows 10 當中。

        但 PSF 也指出,雖然 CVE-2021-3177 被列為“遠程代碼執行”漏洞,但這類漏洞遭利用的可能性非常小,因為要實現成功的 RCE,必須滿足如下條件:

        • 遠程一方將不受信任的浮點數傳遞給 ctypes.c_double.from_param(注:Python 浮點數不受影響)
        • 將該對象傳遞給repr() (例如通過 logging)
        • 使該浮點數成為有效的機器代碼
        • 使該緩沖區溢出漏洞在執行代碼的地方覆寫棧。

        而 Red Hat 在評估該漏洞后,表示“最大的威脅是系統可用性”。

        “可以肯定的是,通過惡意輸入造成拒絕服務也是一個嚴重的問題?!背鲇谶@一原因。PSF 決定停止位漏洞修復版本提供發布候選版本。同時也為那些認為發布候選版本不夠的社區成員發布了最終的 3.9.2 和 3.8.8 穩定版本。

        部分參考資料來源:

        segmentfault 思否

        查看原文

        贊 0 收藏 0 評論 0

        阿遂_Asui 贊了文章 · 2月20日

        火星無人機全部代碼公開!毅力號帶著手機芯片和 Linux 系統上太空

        毅力號登陸火星,帶著手機芯片和 Linux 系統上太空了!

        歷經 203 天,穿越了 4.72 億公里之后,美國“毅力號”火星車終于在美東時間下午 3:55 成功登陸火星。

        結束近 7 個月的旅程后,“毅力號”傳回了通過避險攝像機拍攝的第一張火星表面景象。這次,“毅力號”的主要任務是——尋找古代生命的跡象,并收集火星巖石和土壤樣本帶回地球研究。

        值得一提的是,配合“毅力號”完成探測任務的“機智號”無人機搭載的是驍龍 801 處理器。沒錯,就是那個用在手機上的驍龍 801。當年,小米 4 用的就是這款芯片。

        此外,這也是人類第一次在火星上運行 Linux 系統?!耙懔μ枴鄙系臒o人機“機智號”實際上是通過 Linux 操作系統控制的。不止如此,NASA 還把這個專門為火星無人機開發的 Linux 飛行控制系統開源了!

        這就是毅力號在火星表面拍攝的第一張圖像:

        image.png

        “恐怖 7 分鐘”艱難著陸

        2020 年 7 月 30 日,耗資 24 億美元的毅力號從美國佛羅里達州的卡納維拉爾角太空部隊站發射升空,帶著收集火星樣本的任務邁出了火星探索的第一步。

        美國宇航局科學副主任托馬斯說,“毅力號是從火星帶回巖石的第一步,我們不知道這些來自火星的原始樣本會告訴我們什么,但無疑是非常重要的,甚至可能包括曾經存在于地球之外的生命?!?/p>

        image.png

        毅力號進入下降階段時,以大約 20000 km/h 的速度飛行,盡管火星的氣氛很稀薄,但它仍將給毅力號帶來極大的阻力。進入火星大氣層大約 80 秒鐘之內,航空器外殼外部的溫度將達到 1300 攝氏度。

        約四分鐘后,毅力號的“降落傘”展開,保護性航空器外殼脫落。當毅力號下降到火星表面上方約 4 公里時,它將激活其地形導航系統。

        410 秒后(將近 7 分鐘),毅力號終于在火星成功著陸。與 2018 年 8 月的“好奇號”火星車非常相似,它也在著陸時經歷了類似的“恐怖 7 分鐘”。

        image.png

        火星表面首次有直升機起飛

        毅力號首次將直升機帶上了火星,機智號火星無人機將在火星表面飛起幾英尺的高度,并在毅力號火星車的周圍盤旋,收集圖像信息。這將是直升機在火星極薄的大氣層中首次實現動力飛行。

        image.png

        機智號無人機僅重 1.8 公斤,通過頂部安裝的 4 個碳纖維螺旋槳提供動力,每分鐘轉速為 2400 轉,功率為 350 瓦。為了配合毅力號的探測任務,它要面對許多挑戰。

        要知道,實現直升機在火星上飛行是有很大難度的。一方面火星的稀薄大氣使得難以獲得足夠的升力。另一方面由于火星大氣層的密度比地球密度低 99%,直升機的旋轉葉片也要做的更大,并且轉速要非??觳拍芷痫w。

        image.png

        機智號采用驍龍 801 處理器,帶著 Linux 系統上火星

        由于太空探索對硬件設備的穩定性要求極高,很多設備都采用了已經在地面運行了多年的處理器,機智號也是如此。但值得注意的是,機智號這次沒有采用商業級別的處理器,而是用于手機的民用處理器。這是因為,機智號被 NASA 視為一項“技術演示”,因此愿意接受更多風險,于是采用了民用的驍龍 801 處理器。

        image.png

        此外,由于毅力號的任務對信息的收集和處理要求極高,需要捕捉圖像、分析特征,并以 30 赫茲的頻率從一幀到另一幀跟蹤它們。以往已經使用多年的商業級處理器已無法達到標準。而驍龍 801 的本質是一款手機處理器,而且它的主板非常小。它的功能遠比其他火星車上的處理器多得多,擁有更強大的計算力。

        除了手機處理器,機智號還帶來了一個驚喜,將 Linux 帶上了火星。

        這是人類第一次在火星上使用 Linux 飛行控制系統,據 NASA 介紹,機智號使用的軟件框架是JPL 為立方體衛星和儀器開發的,并在幾年前就開源了。也就是說,任何人都能使用這個在火星直升機上的軟件框架,并將它用在你自己的項目上。

        將開源進行到底,火星無人機代碼已全部公開

        F Prime 是火星無人機“機智號”的飛行軟件框架,目前已在 GitHub 上全部公開!

        F Prime 是為機智號量身定制的一個組件驅動的框架,可以快速開發和部署太空飛行及其他嵌入式軟件應用程序。

        那么,有了這些公開的代碼,我們是不是也能下載機智號同款代碼搞個火星無人機出來了呢?

        image.png

        NASA 開源的 F Prime 提供了一個完整的開發生態系統,包括建模工具、測試工具和地面數據系統。開發人員使用建模工具編寫高級規范,自動使用 C ++ 生成實現,并使用特定領域的代碼填充實現??蚣芎痛a生成器提供 F Prime 部署所需的所有樣板代碼,包括用于線程管理的代碼,用于組件之間通信的代碼以及用于處理命令,遙測和參數的代碼。測試工具和地面數據系統簡化了在工作站和實驗室中的飛行硬件上的軟件測試。

        此外,F Prime 還實現了以下幾個關鍵功能:

        1.可重用性:基于組件的體系結構可實現高度的模塊化和軟件重用。

        2.可移植性:F Prime 在從微控制器到多核計算機的多種處理器以及多種操作系統上運行,將其移植到新的操作系統非常簡單。

        3.高性能:采用點對點架構,最大程度地減少了計算資源的使用,非常適合較小的處理器。

        4.量身定制,可滿足小型任務所需的復雜程度,不僅易于使用,還能同時仍支持多種任務。

        5.可分析性:類型化的端口連接為編譯時的正確性提供了有力的保證。

        快速安裝指南

        前提條件:

        • cmake
        • git
        • Python 3.5+ with pip

        安裝這些實用程序后,即可安裝 F Prime Python 依賴項。在 Python 虛擬環境中安裝依賴項可以防止系統級問題,但是不需要在虛擬環境中進行安裝。

        要快速安裝 F Prime,請輸入:

        image.png

        太空冒險邁上新臺階,“移民火星”不是夢

        毅力號將在火星完成一系列高度復雜的任務,為人類探索古代生物信息和火星土壤研究提供有力支持。隨著毅力號一起登陸火星的機智號也為人類的太空事業邁上了一個更高的臺階。

        與此同時,中國的“天問一號”火星車也即將今年 5 月登陸火星。人類的太空冒險仍在繼續,也許“移民火星”在未來的某一天真的將不止是夢想,而真正照進現實。

        參考鏈接:https://spectrum.ieee.org/aut...
        https://www.futurezone.de/sci...
        GitHub 地址:https://github.com/nasa/fprime

        segmentfault 公眾號

        查看原文

        贊 8 收藏 1 評論 1

        阿遂_Asui 贊了文章 · 2月19日

        如何提高代碼的可讀性 學習筆記

        本文整理自 taowen 師傅在滴滴內部的分享。

        1.Why

        對一線開發人員來說,每天工作內容大多是在已有項目的基礎上繼續堆代碼。當項目實在堆不動時就需要尋找收益來重構代碼。既然我們的大多數時間都花在坐在顯示器前讀寫代碼這件事上,那可讀性不好的代碼都是在謀殺自己or同事的生命,所以不如一開始就提煉技巧,努力寫好代碼; )

        2.How

        為提高代碼可讀性,先來分析代碼實際運行環境。代碼實際運行于兩個地方:cpu人腦。對于cpu,代碼優化需理解其工作機制,寫代碼時為針對cpu特性進行優化;對于人腦,我們在讀代碼時,它像解釋器一樣,一行一行運行代碼,從這個角度來說,要提高代碼的可讀性首先需要知道大腦的運行機制。

        image.png

        下面來看一下人腦適合做的事情和不適合做的事情:

        大腦擅長做的事情

        名稱圖片說明
        對象識別image.png不同于機器學習看無數張貓片之后可能還是不能準確識別貓這個對象,人腦在看過幾只貓之后就可以很好的識別。
        空間分解image.png人腦不需要標注,可以直觀感受到空間中的不同物體。
        時序預測image.png你的第一感覺是不是這個哥們要被車撞了?
        時序記憶image.png作為人類生存本能之一,我們多次走過某個地方時,人腦會對這個地方形成記憶。
        類比推測image.png人腦還有類比功能,比如說這道題大多數人會選擇C吧。

        大腦不擅長做的事情

        名稱圖片例子
        無法映射到現實生活經驗的抽象概念image.png人腦看到左圖時,會比較輕松想到通關方式,但是如果換成右圖這種抽象的概念,里面的對象換成了嘿嘿的像素,我們就不知道這是什么鬼了。比如說代碼里如果充斥著Z,X,C,V 這樣的變量名,你可能就看懵了。
        冗長的偵探推理image.png這種需要遞歸(or循環)去檢查所有可能性最后找到解法的場景,人腦同樣不擅長。
        跟蹤多個同時變化的過程image.png大腦是個單線程的CPU,不擅長左手畫圓,右手畫圈。

        代碼優化理論

        了解人腦的優缺點后,寫代碼時就可以根據人腦的特點對應改善代碼的可讀性了。這里提取出三種理論:

        1. Align Models ,匹配模型:代碼中的數據和算法模型 應和人腦中的 心智模型對應
        2. Shorten Process , 簡短處理:寫代碼時應 縮短 “福爾摩斯探案集” 的流程長度,即不要寫大段代碼
        3. Isolate Process,隔離處理:寫代碼一個流程一個流程來處理,不要同時描述多個流程的演進過程

        下面通過例子詳細解釋這三種模型:

        Align Models

        在代碼中,模型無外乎就是數據結構算法,而在人腦中,對應的是心智模型,所謂心智模型就是人腦對于一個物體 or 一件事情的想法,我們平時說話就是心智模型的外在表現。寫代碼時應把代碼中的名詞與現實名詞對應起來,減少人腦從需求文檔到代碼的映射成本。比如對于“銀行賬戶”這個名詞,很多變量名都可以體現這個詞,比如:bankAccount、bank_account、account、BankAccount、BA、bank_acc、item、row、record、model,編碼中應統一使用和現實對象能鏈接上的變量名。

        代碼命名技巧

        起變量名時候取其實際含義,沒必要隨便寫個變量名然后在注釋里面偷偷用功。

        // bad
        var d int // elapsed time in days
        
        // good
        var elapsedTimeInDays int // 全局使用

        起函數名 動詞+名詞結合,還要注意標識出你的自定義變量類型:

        // bad
        func getThem(theList [][]int) [][]int {
            var list1 [][]int // list1是啥,不知道
            for _, x := range theList {
                if x[0] == 4 { // 4是啥,不知道
                    list1 = append(list1, x)
                }
            }
            return list1
        }
        
        // good
        type Cell []int // 標識[]int作用
        
        func (cell Cell) isFlagged() bool { // 說明4的作用
            return cell[0] == 4
        }
        
        func getFlaggedCells(gameBoard []Cell) []Cell { // 起有意義的變量名
            var flaggedCells []Cell
            for _, cell := range gameBoard {
                if cell.isFlagged() {
                    flaggedCells = append(flaggedCells, cell)
                }
            }
            return flaggedCells
        }
        代碼分解技巧

        按照空間分解(Spatial Decomposition):下面這塊代碼都是與Page相關的邏輯,仔細觀察可以根據page的空間分解代碼:

        // bad
        // …then…and then … and then ... // 平鋪直敘描述整個過程
        func RenderPage(request *http.Request) map[string]interface{} {
            page := map[string]interface{}{}
            name := request.Form.Get("name")
            page["name"] = name
            urlPathName := strings.ToLower(name)
            urlPathName = regexp.MustCompile(`['.]`).ReplaceAllString(
                urlPathName, "")
            urlPathName = regexp.MustCompile(`[^a-z0-9]+`).ReplaceAllString(
                urlPathName, "-")
            urlPathName = strings.Trim(urlPathName, "-")
            page["url"] = "/biz/" + urlPathName
            page["date_created"] = time.Now().In(time.UTC)
            return page
        }
        // good
        // 按空間分解,這樣的好處是可以集中精力到關注的功能上
        var page = map[string]pageItem{
            "name":         pageName,
            "url":          pageUrl,
            "date_created": pageDateCreated,
        }
        
        type pageItem func(*http.Request) interface{}
        
        func pageName(request *http.Request) interface{} { // name 相關過程
            return request.Form.Get("name")
        }
        
        func pageUrl(request *http.Request) interface{} { // URL 相關過程
            name := request.Form.Get("name")
            urlPathName := strings.ToLower(name)
            urlPathName = regexp.MustCompile(`['.]`).ReplaceAllString(
                urlPathName, "")
            urlPathName = regexp.MustCompile(`[^a-z0-9]+`).ReplaceAllString(
                urlPathName, "-")
            urlPathName = strings.Trim(urlPathName, "-")
            return "/biz/" + urlPathName
        }
        
        func pageDateCreated(request *http.Request) interface{} { // Date 相關過程
            return time.Now().In(time.UTC)
        }

        按照時間分解(Temporal Decomposition):下面這塊代碼把整個流程的算賬和打印賬單混寫在一起,可以按照時間順序對齊進行分解:

        // bad 
        func (customer *Customer) statement() string {
            totalAmount := float64(0)
            frequentRenterPoints := 0
            result := "Rental Record for " + customer.Name + "\n"
        
            for _, rental := range customer.rentals {
                thisAmount := float64(0)
                switch rental.PriceCode {
                case REGULAR:
                    thisAmount += 2
                case New_RELEASE:
                    thisAmount += rental.rent * 2
                case CHILDREN:
                    thisAmount += 1.5
                }
                frequentRenterPoints += 1
                totalAmount += thisAmount
            }
            result += strconv.FormatFloat(totalAmount,'g',10,64) + "\n"
            result += strconv.Itoa(frequentRenterPoints)
        
            return result
        }
        // good 邏輯分解后的代碼
        func statement(custom *Customer) string {
            bill := calcBill(custom)
        
            statement := bill.print()
        
            return statement
        }
        
        type RentalBill struct {
            rental Rental
            amount float64
        }
        
        type Bill struct {
            customer             *Customer
            rentals              []RentalBill
            totalAmount          float64
            frequentRenterPoints int
        }
        
        func calcBill(customer *Customer) Bill {
        
            bill := Bill{}
            for _, rental := range customer.rentals {
                rentalBill := RentalBill{
                    rental: rental,
                    amount: calcAmount(rental),
                }
                bill.frequentRenterPoints += calcFrequentRenterPoints(rental)
                bill.totalAmount += rentalBill.amount
                bill.rentals = append(bill.rentals, rentalBill)
            }
            return bill
        }
        
        func (bill Bill) print() string {
        
            result := "Rental Record for " + bill.customer.name + "(n"
        
            for _, rental := range bill.rentals{
                result += "\t" + rental.movie.title + "\t" +
                    strconv.FormatFloat(rental.amount, 'g', 10, 64) + "\n"
            }
            
        
            result += "Amount owed is " +
                strconv.FormatFloat(bill.totalAmount, 'g', 10, 64) + "\n"
        
            result += "You earned + " +
                strconv.Itoa(bill.frequentRenterPoints) + "frequent renter points"
        
            return result
        }
        
        func calcAmount(rental Rental) float64 {
            thisAmount := float64(0)
            switch rental.movie.priceCode {
            case REGULAR:
                thisAmount += 2
                if rental.daysRented > 2 {
                    thisAmount += (float64(rental.daysRented) - 2) * 1.5
                }
            case NEW_RELEASE:
                thisAmount += float64(rental.daysRented) * 3
            case CHILDRENS:
                thisAmount += 1.5
                if rental.daysRented > 3 {
                    thisAmount += (float64(rental.daysRented) - 3) * 1.5
                }
            }
            return thisAmount
        }
        
        func calcFrequentRenterPoints(rental Rental) int {
            frequentRenterPoints := 1
            switch rental.movie.priceCode {
            case NEW_RELEASE:
                if rental.daysRented > 1 {
                    frequentRenterPointst++
                }
            }
            return frequentRenterPoints
        }

        按層分解(Layer Decomposition):

        // bad
        func findSphericalClosest(lat float64, lng float64, locations []Location) *Location {
            var closest *Location
          closestDistance := math.MaxFloat64
          for _, location := range locations {
            latRad := radians(lat)
            lngRad := radians(lng)
            lng2Rad := radians(location.Lat)
            lng2Rad := radians(location.Lng)
            var dist = math.Acos(math.Sin(latRad) * math.Sin(lat2Rad) +  
                                 math.Cos(latRad) * math.Cos(lat2Rad) *
                                 math.Cos(lng2Rad - lngRad) 
                                )
            if dist < closestDistance {
                    closest = &location
              closestDistance = dist
            }
          }
            return closet
        }
        // good
        type Location struct {
        }
        
        type compare func(left Location, right Location) int
        
        func min(objects []Location, compare compare) *Location {
            var min *Location
            for _, object := range objects {
                if min == nil {
                    min = &object
                    continue
                }
                if compare(object, *min) < 0 {
                    min = &object
                }
            }
            return min
        }
        
        func findSphericalClosest(lat float64, lng float64, locations []Location) *Location {
            isCloser := func(left Location, right Location) int {
                leftDistance := rand.Int()
                rightDistance := rand.Int()
                if leftDistance < rightDistance {
                    return -1
                } else {
                    return 0
                }
            }
            closet := min(locations, isCloser)
            return closet
        }
        注釋

        注釋不應重復代碼的工作。應該去解釋代碼的模型和心智模型的映射關系,應說明為什么要使用這個代碼模型,下面的例子就是反面教材:

        // bad
        /** the name. */
        var name string
        /** the version. */
        var Version string
        /** the info. */
        var info string
        
        // Find the Node in the given subtree, with the given name, using the given depth.
        func FindNodeInSubtree(subTree *Node, name string, depth *int) *Node {
        }

        下面的例子是正面教材:

        // Impose a reasonable limit - no human can read that much anyway
        const MAX_RSS_SUBSCRIPTIONS = 1000
        
        // Runtime is O(number_tags * average_tag_depth), 
        // so watch out for badly nested inputs.
        func FixBrokenHTML(HTML string) string {
            // ...
        }

        Shorten Process

        Shorten Process的意思是要縮短人腦“編譯代碼”的流程。應該避免寫出像小白鼠走迷路一樣又長又繞的代碼。所謂又長又繞的代碼表現在,跨表達式跟蹤、跨多行函數跟蹤、跨多個成員函數跟蹤、跨多個文件跟蹤、跨多個編譯單元跟蹤,甚至是跨多個代碼倉庫跟蹤。

        對應的手段可以有:引入變量、拆分函數、提早返回、縮小變量作用域,這些方法最終想達到的目的都是讓大腦喘口氣,不要一口氣跟蹤太久。同樣來看一些具體的例子:

        例子

        下面的代碼,多種復合條件組合在一起,你看了半天繞暈了可能也沒看出到底什么情況下為true,什么情況為false。

        // bad
        func (rng *Range) overlapsWith(other *Range) bool {
            return (rng.begin >= other.begin && rng.begin < other.end) ||
                (rng.end > other.begin && rng.end <= other.end) ||
                (rng.begin <= other.begin && rng.end >= other.end)
        }

        但是把情況進行拆解,每種條件進行單獨處理。這樣邏輯就很清晰了。

        // good
        func (rng *Range) overlapsWith(other *Range) bool {
            if other.end < rng.begin {
                return false // they end before we begin 
            }    
            if other.begin >= rng.end {
                return false // they begin after we end 
            }
          return true // Only possibility left: they overlap
        }

        再來看一個例子,一開始你寫代碼的時候,可能只有一個if ... else...,后來PM讓加一下權限控制,于是你可以開心的在if里繼續套一層if,補丁打完,開心收工,于是代碼看起來像這樣:

        // bad 多層縮進的問題
        func handleResult(reply *Reply, userResult int, permissionResult int) {
          if userResult == SUCCESS {
            if permissionResult != SUCCESS {
              reply.WriteErrors("error reading permissions")
                reply.Done()
                return
            }
            reply.WriteErrors("")
          } else {
            reply.WriteErrors("User Result")
          }
          reply.Done()
        }

        這種代碼也比較好改,一般反向寫if條件返回判否邏輯即可:

        // good
        func handleResult(reply *Reply, userResult int, permissionResult int) {
          defer reply.Done()
          if userResult != SUCCESS {
            reply.WriteErrors("User Result")
            return 
          }
          if permissionResult != SUCCESS {
            reply.WriteErrors("error reading permissions")
            return
          }
          reply.WriteErrors("")
        }

        這個例子的代碼問題比較隱晦,它的問題是所有內容都放在了MooDriver這個對象中。

        // bad
        type MooDriver struct {
            gradient Gradient
          splines []Spline
        }
        func (driver *MooDriver) drive(reason string) {
          driver.saturateGradient()
          driver.reticulateSplines()
          driver.diveForMoog(reason)
        }

        比較好的方法是盡可能減少全局scope,而是使用上下文變量進行傳遞。

        // good 
        type ExplicitDriver struct {
          
        }
        
        // 使用上下文傳遞
        func (driver *MooDriver) drive(reason string) {
          gradient := driver.saturateGradient()
          splines := driver.reticulateSplines(gradient)
          driver.diveForMoog(splines, reason)
        }

        Isolate Process

        人腦缺陷是不擅長同時跟蹤多件事情,如果”同時跟蹤“事物的多個變化過程,這不符合人腦的構造;但是如果把邏輯放在很多地方,這對大腦也不友好,因為大腦需要”東拼西湊“才能把一塊邏輯看全。所以就有了一句很經典的廢話,每個學計算機的大學生都聽過。你的代碼要做到高內聚,低耦合,這樣就牛逼了!-_-|||,但是你要問說這話的人什么叫高內聚,低耦合呢,他可能就得琢磨琢磨了,下面來通過一些例子來琢磨一下。

        首先先來玄學部分,如果你的代碼寫成下面這樣,可讀性就不會很高。

        image.png

        一般情況下,我們可以根據業務場景努力把代碼修改成這樣:

        image.png

        舉幾個例子,下面這段代碼非常常見,里面version的含義是用戶端上不同的版本需要做不同的邏輯處理。

        func (query *Query) doQuery() {
          if query.sdQuery != nil {
            query.sdQuery.clearResultSet()
          }
          // version 5.2 control
          if query.sd52 {
            query.sdQuery = sdLoginSession.createQuery(SDQuery.OPEN_FOR_QUERY)
          } else {
            query.sdQuery = sdSession.createQuery(SDQuery.OPEN_FOR_QUERY)
          }
          query.executeQuery()
        }

        這段代碼的問題是由于版本差異多塊代碼流程邏輯Merge在了一起,造成邏輯中間有分叉現象。處理起來也很簡單,封裝一個adapter,把版本邏輯抽出一個interface,然后根據版本實現具體的邏輯。

        再來看個例子,下面代碼中根據expiry和maturity這樣的產品邏輯不同 也會造成分叉現象,所以你的代碼會寫成這樣:

        // bad
        type Loan struct {
            start    time.Time
            expiry   *time.Time
            maturity *time.Time
            rating   int
        }
        
        func (loan *Loan) duration() float64 {
            if loan.expiry == nil {
                return float64(loan.maturity.Unix()-loan.start.Unix()) / 365 * 24 * float64(time.Hour)
            } else if loan.maturity == nil {
                return float64(loan.expiry.Unix()-loan.start.Unix()) / 365 * 24 * float64(time.Hour)
            }
            toExpiry := float64(loan.expiry.Unix() - loan.start.Unix())
            fromExpiryToMaturity := float64(loan.maturity.Unix() - loan.expiry.Unix())
            revolverDuration := toExpiry / 365 * 24 * float64(time.Hour)
            termDuration := fromExpiryToMaturity / 365 * 24 * float64(time.Hour)
            return revolverDuration + termDuration
        }
        
        func (loan *Loan) unusedPercentage() float64 {
            if loan.expiry != nil && loan.maturity != nil {
                if loan.rating > 4 {
                    return 0.95
                } else {
                    return 0.50
                }
            } else if loan.maturity != nil {
                return 1
            } else if loan.expiry != nil {
                if loan.rating > 4 {
                    return 0.75
                } else {
                    return 0.25
                }
            }
            panic("invalid loan")
        }

        解決多種產品邏輯的最佳實踐是Strategy pattern,代碼入下圖,根據產品類型創建出不同的策略接口,然后分別實現duration和unusedPercentage這兩個方法即可。

        // good
        type LoanApplication struct {
            expiry   *time.Time
            maturity *time.Time
        }
        
        type CapitalStrategy interface {
            duration() float64
            unusedPercentage() float64
        }
        
        func createLoanStrategy(loanApplication LoanApplication) CapitalStrategy {
            if loanApplication.expiry != nil && loanApplication.maturity != nil {
                return createRCTL(loanApplication)
            }
            if loanApplication.expiry != nil {
                return createRevolver(loanApplication)
            }
            if loanApplication.maturity != nil {
                return createTermLoan
            }
            panic("invalid loan application")
        }

        但是現實情況沒有這么簡單,因為不同事物在你眼中就是多進程多線程運行的,比如上面產品邏輯的例子,雖然通過一些設計模式把執行的邏輯隔離到了不同地方,但是代碼中只要含有多種產品,代碼在執行時還是會有一個產品選擇的過程。邏輯發生在同一時間、同一空間,所以“自然而然”就需要寫在了一起:

        • 功能展示時,由于需要展示多種信息,會造成 concurrent process
        • 寫代碼時,業務包括功能性和非功能性需求,也包括正常邏輯和異常邏輯處理
        • 考慮運行效率時,為提高效率我們會考慮異步I/O、多線程/協程
        • 考慮流程復用時,由于版本差異和產品策略也會造成merged concurrent process

        對于多種功能雜糅在一起,比如上面的RenderPage函數,對應解法為不要把所有事情合在一起搞,把單塊功能內聚,整體再耦合成為一個單元。

        對于多個同步進行的I/O操作,可以通過協程把揉在一起的過程分開來:

        // bad 兩個I/O寫到一起了
        func sendToPlatforms() {
            httpSend("bloomberg", func(err error) {
                if err == nil {
                    increaseCounter("bloomberg_sent", func(err error) {
                        if err != nil {
                            log("failed to record counter", err)
                        }
                    })
                } else {
                    log("failed to send to bloom berg", err)
                }
            })
            ftpSend("reuters", func(err error) {
                if err == DIRECTORY_NOT_FOUND {
                    httpSend("reuterHelp", err)
                }
            })
        }

        對于這種并發的I/O場景,最佳解法就是給每個功能各自寫一個計算函數,代碼真正運行的時候是”同時“在運行,但是代碼中是分開的。

        //good 協程寫法
        func sendToPlatforms() {
            go sendToBloomberg()
            go sendToReuters()
        }
        
        func sendToBloomberg() {
            err := httpSend("bloomberg")
            if err != nil {
                log("failed to send to bloom berg", err)
                return
            }
            err := increaseCounter("bloomberg_sent")
            if err != nil {
                log("failed to record counter", err)
            }
        }
        
        func sendToReuters() {
            err := ftpSend("reuters")
            if err == nil {
                httpSend("reutersHelp", err)
            }
        }

        有時,邏輯必須要合并到一個Process里面,比如在買賣商品時必須要對參數做邏輯檢查:

        // bad
        func buyProduct(req *http.Request) error {
            err := checkAuth(req)
            if err != nil {
                return err
            }
            // ...
        }
        
        func sellProduct(req *http.Request) error {
            err := checkAuth(req)
            if err != nil {
                return err
            }
            // ...
        }

        這種頭部有公共邏輯經典解法是寫個Decorator單獨處理權限校驗邏輯,然后wrapper一下正式邏輯即可:

        // good 裝飾器寫法
        func init() {
            buyProduct = checkAuthDecorator(buyProduct)
            sellProduct = checkAuthDecorator(sellProduct)
        }
        
        func checkAuthDecorator(f func(req *http.Request) error) func(req *http.Request) error {
            return func(req *http.Request) error {
                err := checkAuth(req)
                if err != nil {
                    return err
                }
                return f(req)
            }
        }
        
        var buyProduct = func(req *http.Request) error {
            // ...
        }
        
        var sellProduct = func(req *http.Request) error {
            // ...
        }

        此時你的代碼會想這樣:

        image.png

        當然公共邏輯不僅僅存在于頭部,仔細思考一下所謂的strategy、Template pattern,他們是在邏輯的其他地方去做這樣的邏輯處理。

        image.png

        這塊有一個新的概念叫:信噪比。信噪比是一個相對概念,信息,對有用的;噪音,對沒用的。代碼應把什么邏輯寫在一起,不僅取決于讀者是誰,還取決于這個讀者當時希望完成什么目標。

        比如下面這段C++和Python代碼:

        void sendMessage(const Message &msg) const {...}
        ![image.png](/img/bVcOMhy)
        
        def sendMessage(msg):

        如果你現在要做業務開發,你可能會覺得Python代碼讀起來很簡潔;但是如果你現在要做一些性能優化的工作,C++代碼顯然能給你帶來更多信息。

        再比如下面這段代碼,從業務邏輯上講,這段開發看起來非常清晰,就是去遍歷書本獲取Publisher。

        for _, book := range books {
          book.getPublisher()
        }

        但是如果你看了線上打了如下的SQL日志,你懵逼了,心想這個OOM真**,真就是一行一行執行SQL,這行代碼可能會引起DB報警,讓你的DBA同事半夜起來修DB。

        SELECT * FROM Pubisher WHERE PublisherId = book.publisher_id
        SELECT * FROM Pubisher WHERE PublisherId = book.publisher_id
        SELECT * FROM Pubisher WHERE PublisherId = book.publisher_id
        SELECT * FROM Pubisher WHERE PublisherId = book.publisher_id
        SELECT * FROM Pubisher WHERE PublisherId = book.publisher_id

        所以如果代碼改成這樣,你可能就會更加明白這塊代碼其實是在循環調用實體。

        for _, book := range books {
          loadEntity("publisher", book.publisher_id)
        }

        總結一下:

        • 優先嘗試給每 個Process一個自己的函數,不要合并到一起來算

          • 嘗試界面拆成組件
          • 嘗試把訂單拆成多個單據,獨立跟蹤多個流程
          • 嘗試用協程而不是回調來表達concurrent i/o
        • 如果不得不在一個Process中處理多個相對獨立的事情

          • 嘗試復制一份代碼,而不是復用同一個Process
          • 嘗試顯式插入: state/ adapter/ strategy/template/ visitor/ observer
          • 嘗試隱式插入: decorator/aop
          • 提高信噪比是相對于具體目標的,提高了一個目標的信噪比,就降低了另外一個目標的信噪比

        3.總結

        當我們吐槽這塊代碼可讀性太差時,不要把可讀性差的原因簡單歸結為注釋不夠 或者不OO,而是可以從人腦特性出發,根據下面的圖片去找到代碼問題,然后試著改進它(跑了幾年的老代碼還是算了,別改一行線上全炸了: )

        image.png

        查看原文

        贊 22 收藏 5 評論 0

        阿遂_Asui 贊了文章 · 2月8日

        從推薦算法到前端開發,字節跳動技術 Leader 們都在學什么?

        本文為授權轉載內容。內容來源:字節跳動技術范兒

        “春季招聘和金三銀四要開始了,我想提升技術,更上一層樓,除了投簡歷刷題,還有什么可以努力的方向???”

        如果你是技術領域的新人,或者已經畢業多年、正在考慮轉向新的技術方向,上面這個問題可能正在困擾著你。

        為了回答這個問題,技術范兒找到了多媒體、推薦算法、計算機視覺、強化學習、機器翻譯、知識圖譜、安卓、iOS、前端等幾個方向的 Leader,推薦了各個技術方向的自學資源。

        其中,有不少業界知名的書籍、全球 CS 名校的公開課程,可以系統性地幫你了解一個領域的全貌。

        還有不少應用技術和開源項目,工業界的常備工具都列齊了。

        另外,也有一些是 Leader 們推薦團隊內部同學學習的資料,如果你理解掌握得足夠好,說不定可以在面試官心目中留下不錯的印象。

        如果你是正在準備春招的在校生,或者已經畢業并希望在金三銀四獲得更好的平臺,不妨收藏起來,慢慢學習。

        image.png

        多媒體

        多媒體團隊 Leader Jessica 推薦了三類內容:

        第一類是圖像、視頻處理的基礎理論書籍;

        第二類是視頻編碼標準方面的書籍;

        第三類是業內常用的開源項目。

        《數字圖像處理》

        作者:Rafael C. Gonzalez 等

        image.png

        數字圖像處理領域的經典教材,也普遍作為學習圖像處理、計算機視覺的入門必備書籍,經久不衰。

        《視頻處理與通信》

        作者:王瑤 等

        image.png

        系統性介紹視頻處理關鍵技術的一本經典教材,從視頻基礎理論到視頻編碼、視頻通信等。適合有一點信號系統或者圖像處理理論基礎的同學進一步學習使用。

        《新一代視頻壓縮編碼標準--H.264/AVC》

        作者:畢厚杰、王健

        image.png

        一本能讓讀者很好地了解主流視頻編碼技術的參考書。

        《Audio Signal Processing and Coding》

        作者:Andreas Spanias, Ted Painter, Venkatraman Atti

        image.png

        音頻的書相比視頻而言少很多,但這本算是音頻信號處理與編碼領域較為經典的了,可以作為音頻處理學習相關的參考書。

        相關開源工程

        FFmpeg:https://github.com/FFmpeg/FFmpeg

        迄今為止最流行的開源多媒體框架之一,非常強大,基本算是互聯網視頻技術相關的必修開源工程了。

        vlc:https://github.com/videolan/vlc

        Ijkplayer:https://github.com/bilibili/i...

        exoplayer:https://github.com/google/Exo...

        播放器相關三大經典開源工程,了解主流視頻解碼、播放技術必選。

        Jessica說,上述這些開源工程基本上是各個方向上不同時期最top的了,業內從業者對它們都非常熟悉。

        image.png

        推薦算法

        抖音推薦團隊Leader William同學推薦了5本書,基本都是深度學習、機器學習方面非常經典的書。

        《Deep Learning深度學習》

        作者:Ian Goodfellow、Yoshua Bengio、Aaron Courville

        image.png

        這本書就是業內知名的「花書」,是深度學習領域奠基性的經典教材。

        《動手學深度學習》

        作者:李沐 等

        image.png

        William說,這是他見過最好的機器學習、深度學習教材,理論與實踐結合,并且中英雙語都有,而且還是免費開源的資源。

        資源鏈接

        電子版:https://zh.d2l.ai/index.html

        GitHub:https://github.com/d2l-ai/d2l-zh

        《百面機器學習》

        作者:諸葛越

        image.png

        William說,這本書的作者是Hulu中國負責人,書里知識點很多,也有不少工業界的觀點,相關知識點最好都弄清楚,對從事算法工作會有比較大的幫助。

        《深度學習推薦系統》

        作者:王喆

        image.png

        William認為,這本書可以幫助讀者了解業界推薦系統的基礎知識體系,梳理推薦算法的發展脈絡。

        《推薦系統實踐》

        作者:項亮

        image.png

        推薦系統入門必備,非常適合初學者。

        image.png

        計算機視覺

        圖像算法方向的Leader吳辛隆說,團隊同學主要靠學習CV論文來提升自己的技術能力。除了歷年頂會的論文之外,他也推薦了業界最常用的PyTorch和TensorFlow兩大框架,以及影響力最大的幾位專家的書籍課程。

        吳恩達深度學習工程師全套課程

        主講:吳恩達

        桃李滿天下的吳恩達老師的課程,深度學習方向的同學應該都聽說過。

        鏈接:https://mooc.study.163.com/sm...

        斯坦福 CS231n:用于視覺識別的卷積神經網絡

        主講:李飛飛

        斯坦福一大知名課程,主講人是推動了CV行業飛速發展的ImageNet發起人李飛飛。

        鏈接:http://cs231n.stanford.edu/

        《機器學習》

        作者:周志華

        image.png

        這本書也是業界知名的教材,它從“如何挑西瓜”這個例子開頭,又被稱作「西瓜書」,來自南京大學周志華教授。

        PyTorch教程-Yunjey Choi

        image.png

        PyTorch作為備受歡迎的深度學習兩大框架之一,對于計算機視覺等方向的研究者來說是必備技能。如果你已經看過了PyTorch官方教程,來自韓國NAVER AI Lab研究員Yunjey Choi的開源PyTorch教程是不錯的補充,在GitHub上有將近20000顆星,教程中的大多數模型是由不到30行代碼實現的。

        鏈接:https://github.com/yunjey/pyt...

        TensorFlow中文官方文檔

        image.png

        深度學習另一大框架TensorFlow官方教程的中文版,由極客學院Wiki翻譯。

        鏈接:https://github.com/jikexueyua...

        CVF頂會論文庫

        image.png

        計算機視覺基金會(CVF)贊助了包括CVPR、ICCV等在內業界主流的幾大計算機視覺頂會,他們的論文庫也結構性地整理了這些頂會歷年的所有論文,可以方便同學們系統性的查找計算機視覺相關各方面的論文。

        鏈接:https://openaccess.thecvf.com...

        image.png

        強化學習

        強化學習研究員Flood Sung和ChnX兩位的推薦名單里除了一本名為《強化學習》的經典書目之外,還有斯坦福和UC伯克利的開源教學內容。

        《Reinforcement Learning: An Introduction》

        作者:Richard S. Sutton and Andrew G. Barto

        image.png

        這本書是強化學習最全面、最基礎的教材,兩位研究員強烈建議每一位同學通讀一至兩遍英文原版。

        前面抖音推薦團隊Leader William也非常推薦這本書,這本強化學習綜述書, 可以幫助初學者建立相關知識體系。

        英文原版:http://incompleteideas.net/bo...

        相關課程:https://www.davidsilver.uk/te...

        UC伯克利CS285:Deep Reinforcement Learning

        主講:Sergey Levine

        這套課程包含23節課程和5個課后作業,適合對強化學習、機器學習有一定了解的人。

        鏈接:http://rail.eecs.berkeley.edu...

        斯坦福CS 330:Deep Multi-Task and Meta Learning

        主講:Chelsea Finn

        CS 330整體課程比較長,大約需要3個月的學習時間,不過兩位研究員更推薦課程中Meta-RL的部分,壓力會小一點。

        鏈接:https://cs330.stanford.edu/

        image.png

        機器翻譯

        機器翻譯團隊Leader王萱選擇了經典的書目和課程。

        《統計學習方法》

        作者:李航

        image.png

        王萱認為,這本書由淺入深,涉及的知識面非常廣,算法包括NB、LR、SVM、CART、GBDT、感知機、最大熵、EM、HMM、CRF等,書中例子、推導、算法介紹相對比較詳細,適合花比較完整的時間,細細賞讀。

        另外,這本書還有一個優勢是網上的解析、課程甚至所有算法的GitHub開源都非常完整,碰到難懂的問題,都可以很快找到答案。

        前面抖音推薦團隊Leader William同學也認為,這本書每個模型講的很透徹,對提升機器學習背后的數學能力有幫助。

        斯坦福CS 224N:Natural Language Processing with Deep Learning

        主講:Christopher Manning, John Hewitt

        王萱說,斯坦福的自然語言處理課程非常棒,主要介紹深度學習相關知識,從 word2vec 開始,到機器翻譯、Transformer、BERT 都有詳細的介紹。所有的課程設置也非常合理,包括練習、代碼、slides、相關文獻官方都做了非常好的整理。

        鏈接:http://web.stanford.edu/class...

        image.png

        知識圖譜

        字節跳動知識圖譜算法工程師David推薦了兩本知識圖譜相關的中文書籍和一本英文書,斯坦福CS 520也是業界備受推崇的課程。

        《知識圖譜:概念與技術》

        作者:肖仰華

        image.png

        這本書系統地介紹知識圖譜概念、技術與實踐,可以幫助讀者建立知識圖譜學科體系,貼近工業界的情況。

        《知識圖譜》

        作者:趙軍

        image.png

        知識圖譜方面全面綜述性的書籍,方方面面都有講到,是不錯的入門書。

        《Linguistic Categorization》

        作者:John R. Taylor

        image.png

        牛津語言學教科書,涵蓋了1987年以來認知語言學的重大發展,也是相對基礎的一本書。

        斯坦福CS 520:Knowledge Graphs

        主講:Vinay K. Chaudhri, Naren Chittar, Michael Genesereth等

        飽受好評的斯坦福CS系列,授課人是30余位來自學術界和工業界的專家,在國內也有相當多的簇擁。

        鏈接:https://web.stanford.edu/clas...

        image.png

        安卓

        在安卓開發Leader JackLin看來,安卓開發者官方網站是最適合初學者的地方,問答社區Stack Overflow中的安卓板塊也是一個寶藏平臺。

        安卓開發者官方網站

        image.png

        JackLin說,谷歌的安卓官方網站是最為嚴謹的學習資料,適合絕大多數安卓開發學習者,可以解決安卓初學者的絕大多數問題。

        鏈接:https://developer.android.com/

        Stack Overflow 社區

        image.png

        Stack Overflow是程序員們基本都知道的社區,有很多高質量的問答和資料,社區很活躍,信息全面,也可以看到業界對前沿技術的討論。

        鏈接:https://stackoverflow.com/que...

        image.png

        iOS

        iOS開發Leader趙子真同樣推薦了業內知名的三大技術博客/社區。

        技術博客NSHipster

        image.png

        NSHipster是iOS大神發起的技術博客,涵蓋了OC、Swift、Cocoa那些被忽略的特性。

        鏈接:https://nshipster.com/

        技術社區raywenderlich

        趙子真稱raywenderlich為「iOS界的百科全書」,它適合初學者,各種tutorial非常淺顯易懂。

        網站:https://www.raywenderlich.com...

        視頻:https://www.youtube.com/user/...

        iOS社區objc.io

        image.png

        這個社區的內容高質量、深入深入再深入,對國內很多iOS社區影響深遠。

        鏈接:https://www.objc.io/

        image.png

        前端

        前端Leader月影推薦了不少在線課程。

        HTML: The Living Standard

        image.png

        月影說,這份資料有助于大家理解HTML標準和語義化,打好前端基礎。

        鏈接:https://html.spec.whatwg.org/...

        MDN Web文檔

        這份文檔比較全面的介紹最新的 HTML/CSS/JavaScript 標準和特性,非常好的參考資料。

        鏈接:https://developer.mozilla.org...

        JavaScript高級程序設計(第4版)

        作者:Matt Frisbie

        image.png

        幾代前端人的JavaScript“紅寶書”,李松峰老師翻譯。

        image.png


        最后,在你擅長的領域,還有什么你覺得非常好的學習資源?歡迎在評論區留言,寫下讓你收獲豐富的書籍/論文/開源項目/公開課或任何形式的資料。

        查看原文

        贊 15 收藏 8 評論 0

        阿遂_Asui 贊了文章 · 2月6日

        我是如何在 72 小時內復刻 ClubHouse 的

        大家好,我是白宦成(@bestony),前幾天在 B 站直播寫 ClubHouse 復刻版的開發者。當然,除了這個身份,在真實生活中,我還是 Linux 中國開源社區的技術負責人,負責開發我們自己的自用工具和平臺。

        作為一個 indiehacker(自詡的),我想和大家一起來復盤一下,這一次的直播活動和意料之外的爆火。

        為什么要做 NESHouse

        我其實想到復刻 ClubHouse 的時間是非常早的,我是在 2 月 1 日拿到了 ClubHouse 的邀請碼,在試玩了一段時間以后,就覺得這個軟件還不錯,理念很有意思,但并沒有太在意,放在了一邊??傻搅送砩?,因為知道 Elon Musk 要來做分享,作為一個比較欣賞他的人,我自然不能錯過,但遺憾的是,當我打開 ClubHouse 的時候,已經有太多的人涌入這個 App,幾乎無法使用,總是不停的卡頓。

        這時讓我產生了懷疑:這個東西到底有多少的工作量?為什么這么容易性能卡頓?

        結合實際的使用發現,有些時候,我可以正常聊天,但是卻會報錯,可以發現問題不在語音服務,而是在 ClubHouse 自身的業務能力不足以支撐超過預期的訪問量。

        我上一份工作是在一家云計算企業工作,所以相對來說,對云計算產品有一定的了解。在我看來,這樣的一個產品的增量,很難把現有的云計算產品的服務容量打穿,你能想象 ClubHouse 把 AWS、GCP、Azure 等云服務廠商打穿么?

        我覺得,要么是開發者的大規模服務的架構經驗不足,雖然用了云,但是沒設計好,無法充分適應彈性;要么是開發者沒有對超過預判的訪問量做的預案不足。

        這就讓我思考,我能否復刻一個 ClubHouse?用一些更加具有彈性的服務?給大家打個樣? 云計算是好,但用起來也要姿勢對,才能不出問題。

        72 小時復刻一個 ClubHouse,是一個什么概念?

        既然要復刻項目,自然要做的不能和碰瓷的一樣(這里鄙視幾家碰瓷的 App,拿很久之前寫的具備了語音聊天的 App,來碰瓷 ClubHouse)。

        但我又不希望在這個事情上花費太多的事情,我還有很多更重要的事情要做,所以我選擇了 72 小時。48 小時或 24 小時是一般的 Hackthon 的時間長度,但我確實又不熟悉這個項目,所以用 72 小時比較穩妥。

        于是便立了一個 Flag ,說我要在 72 小時內,復刻一個 ClubHouse。立了個 Flag,說干就干。關于這 72 小時,我希望可以強調兩點,也希望這兩點能夠幫助到你。

        1. 明確自己要做的和不要做的

        我的時間和精力以及資源都有限,所以并不是什么東西我都能要的。比如在做復刻的時候,考慮到我如果開發原生的 App 或者小程序,就需要提交審核。那我就不能選擇做 App,不然 72 小時到了,審核還沒過,就食言了。也是出于審核的考慮,我最終選擇了使用 Web 的方式來開發 NESHouse。

        而到了具體的功能特性層面,受限于 Web 和 App 的機制不同,我很難要求用戶必須做什么樣的操作,也很難確保 App 響應什么樣的功能,因此,我對于 ClubHouse 的功能進行了一些刪減,邀請上臺之類的功能,我就選擇性的先不做,將重點放在更加重要的功能中。

        在開發黑客松項目的時候,一定要先想清楚自己要什么,不要什么,這樣才能確保自己在給定的時間內完成自己的工作。不然大概率會發現時間馬上要截止,但核心功能還沒有研發完成。

        2. 選擇一些新的、以后可能會用到的技術

        在這次項目開發的時候,我選擇的前端技術棧并非我過去慣用的 React、Vue ,而是一個相對小眾 JS 框架的 Alpine.js。

        選擇 Alpine.js 的原因很簡單,我后續需要在其它的項目上使用這個框架,但我此刻確實也不熟悉。如果我在這 72 小時里把這個工具用了一遍,如果評估覺得不錯,我就可以在后續的項目中使用,如果這次我用的不太好,那我損失的也只有 72 小時,比在正式項目中使用的損失成本要低很多。

        而在另外的兩個服務,選擇起來就簡單多了:

        • LeanCloud 的云服務我使用了很多年,使用體驗也很不錯,而且他們這種 Serverless 云服務,可以讓我在開發 NESHouse 的時候,免于去寫很重的部署和基礎邏輯,更加專注在業務邏輯上。
        • 音頻服務我則選擇了國內用戶比較多,開發起來也比較方面的聲網,聲網的 API 比較簡單, NESHouse 中的聲網音頻接入只用 4 行代碼就實現了。

        除此之外,便是使用了 NES.css 這樣的 CSS 框架,來讓這個項目更加的有趣,更加的 Funny。

        對于開發黑客松項目的時候,可以想想自己能否接受這一次的失敗,如果可以接受自己的失敗,不妨將這次黑客松看做是一次玩的機會,玩一玩新的技術,就算失敗了,也不過是損失給定的時間。但如果你在工作項目中出現了問題,損失可就大了。

        總結

        72 個小時的復刻對于我來說不算難,實際上我也只花了 55 個小時就復刻成功了。但更難的,是如何讓一個開源項目持續的成長下去,持續的獲得用戶、獲得關注。

        最后,在思否發文章,給自己的項目求個 Star 不過分吧(

        項目求 Star:https://github.com/bestony/ne...

        查看原文

        贊 14 收藏 0 評論 2

        阿遂_Asui 贊了文章 · 2月6日

        重磅發布丨2021年OpenAtom XuperChain 開源技術路徑

        image.png

        本文為授權轉載內容。以下文章來源于 XuperChain 開源社區 ,作者:XuperChain

        2020 年,國家發改委公布了加強新型基礎設施建設發展的頂層設計,區塊鏈作為新技術基礎設施首次被寫入新基建發展規劃之中。同時,美國將區塊鏈技術列入國家安全技術清單,未來將對區塊鏈核心技術形成卡脖子問題。

        一方面,從數字貨幣單一場景到賦能產業,在多行業、多業務場景落地,對區塊鏈網絡建設底層技術提出了新的挑戰;另一方面,我們需要加強自主創新,明確主攻方向,攻克關鍵核心技術,讓國產區塊鏈技術走在世界前列。

        我們認為,2021 的區塊鏈技術要實現“兩個升級”。

        1. 符合中國國情、核心技術持續突破,更加「自主可控」。
        2. 源于產業、服務于產業、深入產業發展,更適合「產業區塊鏈發展」。

        當然,我們也面臨以下挑戰:

        1. 不同的落地場景對底層技術的需求是差異化、多樣化的,需要可靈活擴展訂制,多場景適用的區塊鏈網絡建設底層技術。如何做到廣域場景適用,滿足不同場景的個性化需求?
        2. 區塊鏈系統復雜度高、網絡建設維護成本高、業務集成難度高,區塊鏈技術全面賦能產業,就需要打通這最后一公里。如何降低區塊鏈技術落地應用門檻?
        3. 區塊鏈技術支撐大規模應用,對系統擴展能力、性能提出了更高的需求。如何進一步突破區塊鏈性能和擴展能力瓶頸?

        針對這些挑戰,開放原子可信賬本工作組 XuperChain 項目,將從架構、易用性、性能提升、開源社區管理四個方面做全面升級,落地新一代自主創新核心技術,更好的支撐區塊鏈技術全面賦能產業,推進數字經濟建設。

        01 更靈活擴展、更廣域適用的架構

        • 可靈活擴展的動態架構

        在 2021 年,XuperChain 內核技術 XuperCore 將獨立發展,落地由多引擎架構和區塊鏈內核組件編程規范兩大核心設計構成的新一代動態內核技術。通過多引擎架構,讓內核具備可多緯度、輕量級、無代碼侵入訂制擴展核心處理流程和做不同內核組件技術選型的能力;通過區塊鏈內核組件編程規范,讓內核各核心組件可以無代碼侵入自由替換擴展,同時讓引擎訂制變得非常輕量級。首創實現區塊鏈內核核心流程和內核核心組件皆可無代碼侵入擴展訂制,使內核具備極好的可擴展性,滿足不同落地場景對于底鏈技術的個性化訴求。

        • 廣域場景適用的底鏈技術

        現有主流的區塊鏈框架基本都有明確的適用場景定位,面向不同應用場景的鏈實現差異是比較大的,一套實現很難適用各種場景。在 2021 年我們將基于新一代的動態內核技術,輕量級定制切合場景的區塊鏈發行版,從而做到廣域創建適用,更好的賦能產業,推進區塊鏈在各行各業落地。

        02 更好的易用性,多緯度降低落地應用成本

        • 更豐富的生態工具,全面提升易用性

        在生態工具方面,2021 年我們將持續補齊生態工具,全面提升 XuperChain 易用性。我們將在 H1 發布全新設計的開源文檔,引入 EVM 虛擬機,支持以太坊生態工具鏈兼容,并發布 XuperChain 智能合約 IDE 和多語言 SDK 標準實現;在 H2 發布區塊鏈瀏覽器,XuperChain 可視化工具和支持 Python 開發智能合約。從生態兼容、多語言支持、周邊工具建設、文檔優化多個方面,全面提升易用性。

        • 探索構建云原生鏈,打通落地應用屏障

        全面賦能產業,必須要解決區塊鏈系統復雜度高、網絡建設維護成本高、業務集成難度高的難題。在 2021 年我們將結合云原生理念,探索設計云原生鏈,結合云原生工具和瀏覽器 admin,對用戶屏蔽區塊鏈系統自身的復雜性,做到全自助云上構建和管理區塊鏈網絡。

        03 持續優化性能,進一步突破性能上限

        實際業務落地中,存在數據規模大、性能要求高、業務形態復雜的問題,對數據規模、系統性能、組網形態有著更高的要求,但目前區塊鏈在性能和數據規模上還存在瓶頸,難以橫向擴展。在 2021 年我們將探索設計雙層網絡架構,支持在特定超高性能要求的場景下采用分布式子網來替代單機節點,來進一步突破 XuperChain 性能上限。

        04 更溫暖、開放的社區,與開發者共同發展、成長

        今年已經有 100 多位開發者在社區積極交流、提問,在 github 參與代碼、文檔等貢獻,大力推動了 XuperChain 開源社區發展。即使在疫情下,社區依然高頻舉辦 20 多次線上活動,觀看人數超過 10 萬,生產 100 多篇開發者文檔內容,包括技術開發、應用實踐等。

        2021 年,我們會繼續保持高頻的技術沙龍活動,從實踐實操、項目案例的角度,持續分享開發經驗,更好地幫助開發者項目落地。我們也將推出一系列激勵扶持與共同發展計劃,例如針對企業的商機共享、品牌傳播、官方技術方案指導等;針對個人開發者的培訓認證、技術社區榮譽、獎品獎金等,來更好推動社區發展。

        同時,我們會建設更完備的社區管理機制,為開源社區推薦貢獻方向、迭代流程等,幫助開發者更好的參與社區貢獻,讓更多優秀的項目回流到開源社區。

        立足當下、布局未來。未來,XuperChain 也將不斷鉆研創新,攻克區塊鏈核心技術方向;不斷加大開源力度,讓區塊鏈開發者、企業零成本使用更高性能、更易用的區塊鏈技術;不斷加大開源社區建設,構建更溫暖、更開放的社區,與廣大開發者共建區塊鏈開源生態。

        segmentfault 思否

        查看原文

        贊 10 收藏 0 評論 0

        認證與成就

        • 認證信息 SegmentFault 編輯
        • 獲得 2638 次點贊
        • 獲得 23 枚徽章 獲得 0 枚金徽章, 獲得 2 枚銀徽章, 獲得 21 枚銅徽章

        擅長技能
        編輯

        開源項目 & 著作
        編輯

        • 「SFIDSP - 思否獨立開發者支持計劃」

          為助力獨立開發者營造更好的行業環境, SegmentFault 思否社區作為服務于開發者的技術社區,正式推出「思否獨立開發者支持計劃」,我們希望借助社區的資源為獨立開發者提供相應的個人品牌、獨立項目的曝光推介。

        • 「SFOSSP - 思否開源項目支持計劃」

          為助力優質開源項目成長, SegmentFault 思否社區作為服務于開發者的技術社區,正式推出「SFOSSP - 思否開源項目支持計劃」,我們希望借助社區的資源對開源項目進行相關的宣傳推廣,并作為一個長期項目助力開源事業的發展,與廣大開發者共建開源新生態。

        • 「SFKP ? 計算機百科」

          《SFKP ? 計算機百科》是 SegmentFault 思否編輯部策劃的專題內容,面向在 21 世紀沖浪的每一位網友,進行計算機相關知識點的科普與開放討論。

        注冊于 2019-07-21
        個人主頁被 162.4k 人瀏覽

        一本到在线是免费观看_亚洲2020天天堂在线观看_国产欧美亚洲精品第一页_最好看的2018中文字幕