主頁 >  其他 > 2020年 我要這樣寫代碼

2020年 我要這樣寫代碼

2020-09-21 10:58:39 其他

在 9102 年年初,一位室友問我一個問題,如何才能夠提升寫代碼的能力?

可惜的是: 當時僅僅回復了一些自己的想法,如多看開源代碼,多讀書,多學習,多關注業界的動向與實踐,同時也列了一些原則,但是這些并沒有所總結,又或者說沒有例子的語言始終是空泛的,所以在今年年底之際,對應著今年中遇到的形形色色的代碼問題來一一講解一下,

好代碼的用處

實際上本書建立在一個相當不可靠的前提之上:好的代碼是有意義的,我見過太多丑陋的代碼給他們的主人賺著大把鈔票,所以在我看來,軟體要取得商業成功或者廣泛使用,“好的代碼質量”既不必要也不充分,即使如此,我仍然相信,盡管代碼質量不能保證美好的未來,他仍然有其意義:有了質量良好的代碼以后,業務需求能夠被充滿信心的開發和交付,軟體用戶能夠及時調整方向以便應對機遇和競爭,開發團隊能夠再挑戰和挫折面前保持高昂的斗志,總而言之,比起質量低劣,錯誤重重的代碼,好的代碼更有可能幫助用戶取得業務上的成功,

以上文字摘抄于《實作模式》的前言,距離本書翻譯已經時隔 10 年了,但是這本書仍舊有著很大的價值,同時對于上述言論,我并不持否認意見,但是我認為,壞代碼比好代碼更加的費財(嗯,沒打錯,我確定),對于相同的業務需求,壞代碼需要投入的精力,時間更多,產出反而會更少,同時根據破窗理論( 此理論認為環境中的不良現象如果被放任存在,會誘使人們仿效,甚至變本加厲 ),壞代碼會產生更壞的代碼,這是一個惡性回圈,如果不加以控制,完成需求的時間會慢慢失去控制,需要完成需求的人也會失落離開,

也就是說,好代碼可以實作多贏,能夠讓用戶爽,能夠讓老板爽,能夠讓開發者爽,總之,大家爽才是真的爽,

怎么寫出好代碼

少即使多

利用開源出來的設計與代碼來減輕來自于業務線的時間壓力,

The best way to write secure and reliable applications. Write nothing; deploy nowhere.

以上取自 github  上最火的專案之一 nocode,懶惰是程式員的美德之一,所以學習業務,理解業務,拒絕不必要的需求也是一個程式員的必修功課,詳情可以參考如何杜絕一句話需求? 這一篇 blog,當然,在大部分場景下,我們是不具備對需求說不的能力與權力的,但是無論如何,深度的理解業務,對客戶有同理心是對程式員的更高要求,解決問題才是一個程式員需要做的事情,能夠理解好題意才能解決問題,

對于軟體開發而言,時間一定是最寶貴,最有價值的資源,相應的,盡量把時間耗費在解決新的問題,而不是對已經存在確切解決方案的問題老調重彈,所以,盡量不要自己寫代碼,而是借用別人的設計與實作,而在事實上,你也很難在極短的時間壓力下設計并完成比開源更加合適的代碼,

當然,開源作者一定是想讓他的產品有更多的受眾,所以從設計上而言,會采用較為通用的設計,如果你的需求較為特殊并且你覺得不能說服作者幫你“免費打工”(或者作者拒絕了),那么你也只需要在特定之處進行包裝與改寫,但是要比完全重寫要簡單太多了,

當然,調研新的技術方案并且使用到專案中是一種能力,但是千萬不要因為一個小功能添加一個非常大的專案,

筆者在之前就遇到過其他小伙伴因為無法使用數字四舍五入,說 fixed 方法有問題而使用 math.js  的小伙伴,

(11.545).toFixed(2)
// "11.54"

如果想要了解 fixed 方法為何有問題的,可以參考 為什么(2.55).toFixed(1)等于2.5? 作者以 v8  原始碼來解釋為何會有這樣的問題,以及提供了部分修正 fixed 的方案,

事實上如果沒有很大的精度需求,前端完完全全利用一個函式便可以解決的問題,完全不需要復雜的math 這種高精度庫,

function round(number, precision) {
    return Math.round(+number + 'e' + precision) / Math.pow(10, precision);
}

當然,也有小伙伴來找我詢問大量資料的表格優化,我第一反應就是 React Infinite 或者 vue-infinite-scroll 此類解決方案,但是對方能夠多提供一些資訊包括背景關系,采用的技術堆疊,當前資料量大小,未來可能需要達到的大小,當前表格是否需要修改等,得到了這些資訊,結合業務來看,相比于增加一個庫,是否如下方式更為便捷與快速,

// 因為 vue 模型的原因,使用 Object.freeze 性能可以有很大增益
this.xxx = Object.freeze(xxx);

隨著堆積業務,代碼的增長,管理復雜度的成本與日俱增,把依賴降低,  利用開源代碼使得任務更容易實作,時間就是成本,關鍵是讓收益可以最大化,

學習更多是為了做的更少,

統一

不同的人由于編碼經驗和編碼偏好不同,專案中同一個功能的實作代碼可能千差萬別,但是如果不加以約束,讓每一個人都按照自己的偏好寫自己的模塊,恐怕就會變成災難,

所以每次在學習一些新技術的時候,我總是想多看看作者的實體代碼,作者是如何理解的,社區又是如何理解的,以求實作起來代碼風格不至于偏離社區太多,這樣的話可以提高溝通與協作的效率,類似于 《阿里巴巴Java開發手冊》 或者  vue 風格指南 這種取自大公司或社區的經驗之談,要多讀幾遍,因為他們所遇到的問題和業務更加復雜,

對于公司內部開發來說,寫一個組件時候,生命周期的代碼放在檔案上面還是放在最下面,如何把代碼的一個功能點集中放置,通用型代碼的修改,代碼行數的限制,能夠列出統一的方案,多利而少害,

化繁為簡(抽象)

抽象是指從具體事物抽出、概括出它們共同的方面、本質屬性與關系等,而將個別的、非本質的方面、屬性與關系舍棄的思維程序,

如果你面對一個較大的系統,你會發現重構并不能解決根本問題,它僅僅只能減少少許的代碼的復雜度以及代碼行數,只有抽象才可以解決實質性問題,

無論是資料庫設計,架構設計,業務設計,代碼設計,但凡設計都離不開抽象,抽象能力強的所面臨的困難會比能力弱的少很多,

或者說抽象能力弱一些的小伙伴遇到一些問題甚至需要重新推翻然后再設計,這個是在時間和業務開發中是不能被接受的,

這里就談談代碼,以下也舉個例子,如 axios 庫中有攔截器與本身業務,在沒有看到原始碼之前,我一直認為他是分 3 階段處理:

  • 請求攔截

  • 業務處理

  • 回應攔截

但如果你去看原始碼,你就會發現其實在作者看來,這 3 個階段其實都是在處理一個 Promise 佇列而已,

// 業務處理
var chain = [dispatchRequest, undefined];
var promise = Promise.resolve(config);

this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
    // 前置請求攔截
    chain.unshift(interceptor.fulfilled, interceptor.rejected);
  });
this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
    // 后置回應攔截
    chain.push(interceptor.fulfilled, interceptor.rejected);
  });

  while (chain.length) {
    promise = promise.then(chain.shift(), chain.shift());
  }

  return promise;

這就是一種代碼抽象能力,讓自己的代碼可以適應更多的場景是程式員需要思考的,代碼不是給機器看的,是給人看的,更高的要求是: 代碼不僅僅是給人看的,更是給人用的,需要考慮到協作的人與事,靈活的配置也是必須要考慮到的,就拿前端的 虛擬 dom 來說,能夠適配更多的平臺,

當然了,抽象能力需要時間,需要經驗,需要學習大量的設計,

注意!:不要過早的抽象業務代碼,甚至不要抽象業務代碼,多寫一點代碼無所謂,千萬別給自己找事做, 在業務上盡量保持簡單和愚蠢,除非你是業務專家,確認當前業務不太會產生變化,

權責對等(拆分與合并)

責任與義務本質上就是對等的,且越對等的就越穩定,這幾年,微服務架構,中臺,微前端理論層出不窮,本質上就是為了權責對等,對于更加基礎的服務,更有產出的業務投入更高的人力與物力以保證更穩定的運行是很正常的一件事,而不是之前的大鍋飯(單體應用),

從代碼上來看,某個模塊是否承擔了它不應該做的事情,或者某個模塊過于簡單,徒增復雜度,

當然,事實上有些東西目前是做不到的讓所有人都覺得滿意,增一分則肥,減一分則瘦,剛剛好很難界定,就像 Dan Abramov 說的那樣:

Flux libraries are like glasses: you’ll know when you need them.

只做一件事

Unix 哲學,這個很好理解,就像我今年想做的事情太多,反而什么都沒有做(或者說都做了,但都不好),

代碼上來看,不要因為一點點性能的原因,把幾件事合在一起去做,例如在一次 for 回圈中解決所有問題,或者將所有代碼寫在一個函式中,例如:

created() {
  const {a,b,c,d} = this.data
  // ... 三件事情彼此有互動同時需要 a,b,c,d
  
  // 完成之后的邏輯
}

改造后:

created() {
  const axx = doA()
  doB()
  const cxx =  doC()
  // 完成之后的邏輯
}

// 分離出3個函式
doA() {
   const {a,b,c} = this.data
  // ... 三件事情彼此有互動同時需要 a,b,c,d
  
  // 完成之后的邏輯
}
// 其他代碼

相比于第一個只需要一次取數,一次setData,第二個性能無疑更低,但是可維護性變高了,3 件事情都被拆分出來,后面修改代碼時候,我可以追加一個 doD 而不是再次把第一份代碼中邏輯整理清楚再小心翼翼的修改代碼,

命名與注釋

There are only two hard things in Computer Science: cache invalidation and naming things.

命名與快取失效是兩大難題,今年講了不少快取問題,同時,命名的確是很困難的一件事情,通過一句話來解釋你們在做什么事情,通過一句話來解釋一件事的意圖,

不說在程式世界中,在現實世界中也是如此,例如: 《震驚!xxx居然xxx》等新聞,雖然說看完后都會想要罵一句,但是,正如這樣的名字才能吸引人家點擊進入,讓人情不自禁的被騙一次又一次,所以在專案沒有發布前,要取一個簡單而又好記的名字,

但在程式內部,我們不需要“騙取”人家的點擊量,反而是要務實點,不要欺騙另外的同伴,比如說寫了一個簡單的名字,結果內部卻封裝了很多的業務代碼,同時我認為這也是函式越寫越短的理由,因為大家難以通過命名來解釋那一大坨代碼的意圖,所以,需要撰寫可以自我解釋的代碼,而這種代碼最佳實踐就是好的命名,

對于開源代碼,你往往會發現,這些檔案開頭都會有一系列注釋,這個注釋告訴我們了這個模塊的意圖與目的,讓你無需看代碼就可以進行開發,

對于業務開發而言,僅在你不能通過代碼清晰解釋其含義的地方,才寫注釋,在多個條件下都無法解釋你的代碼,

  • 專案名

  • 模塊名

  • 檔案名(類名)

  • 函式名(方法名)

這并不是讓你不寫注釋,但是我覺得更多的注釋應該放在資料結構而不是代碼邏輯上,聰明的資料結構和笨拙的代碼要比相反的搭配作業的更好,更多的時候,看資料結構我能了解業務是如何運行的,但是僅僅看到代碼并不能實際想象出來,

實際上,隨著時間的推移,代碼做出了許多改動,但注釋并沒有隨之修改,這是一個很大的問題,注釋反而變得更有欺騙性,

這里也提供一篇 export default 有害 的文章,我覺得 export default 匯出一個可以隨意命名的模塊就是一種欺騙性代碼(隨著時間的推移,該模塊的意圖會發生變化),

考慮場景

沒有放眼四海皆準的方案,所以我們必須要考慮到場景的問題,我們總是說可修改性,可讀性是第一位的(往往可讀,可修改的代碼性能都不差),但是如果是急切需求性能的場景下,有些事情是需要再考慮的,

if 是業務處理中最常用的,在每次使用前要考慮以下,哪個更適合作為主體,哪個更適合放在前面進行判斷,如果有兩個維度上的引數,一個是角色,一個是事件,一定是會先判斷角色引數,然后再去判斷事件引數,反之則一定不好,因為前者更符合人的思維模式,在同一維度下,至于哪個放前面,一定是更多被使用的引數放在前面更好,因為更符合機器的執行程序,

就像在 if 中你究竟是使用 else 還是 return,大部分情況下處理業務邏輯互斥使用 else,處理錯誤使用return,因為這樣的代碼最符合人的思維邏輯,

但是在這里我也要舉出來自《代碼之美》的例子,在第五章中,作者 Elliotte Rusty Harold 設計了一個 xml 驗證器,其中有一段在驗證數字字符:

public static boolean isXMLDigit(char c) {
  if (c >= 0x0030 && c <= 0x0039) return true;
  if (c >= 0x0660 && c <= 0x0669) return true;
  if (c >= 0x06F0 && c <= 0x06F9) return true;
  // ...
  return false
}

這個優化之后如下:

public static boolean isXMLDigit(char c) {
  if (c < 0x0030) return false; if (c <= 0x0039) return true;
  if (c < 0x0660) return false; if (c <= 0x0669) return true;
  if (c < 0x06F0) return false; if (c <= 0x06F0) return true;
  // ...
  return false
}

全域思考,善于交流

軟體開發已經不是一個人打天下的時代了,你要不停的觸達邊界,在前后端分離的時代,前端可以不知道資料庫如何優化,后端也可以不清楚瀏覽器的渲染機制,但是卻不能不明白對方在做什么,否則等于雞同鴨講,也會浪費時間,在開發時候,把一段邏輯放在那一端取決安全的思考以及簡化邏輯,

善于交流是一種能力,在與別人交流時給與足夠的背景關系,讓你的 leader 溝通,讓她知道你的難處,和小伙伴溝通,說服他人按照你的想法推進,同時,善于聆聽才能不斷進步,

演算法

我不是一個演算法達人( leetcode 中等題目都費勁 ),但這個沒什么可說的,你拿你的 O(n**3) 演算法去對戰人家 O(n * logn) 演算法就是費財,所以,知道自己某方面不夠好去努力就行了,

輔助工具

TypeScript

雖然早就接觸和實踐過,但是以往都是 AnyScript,今年也算重度使用了,才體會到該工具的利好,一個好的開發工具并不是讓你少寫那一點點代碼,而是讓你在交付代碼時候能夠更加自信,

TypeScript  最大的好處就是讓你在寫代碼前先思考,先做設計,就像之前說的,聰明的資料結構和笨拙的代碼要比相反的搭配作業的更好,

TypeScript 同時也可以讓大部分運行時錯誤變為編譯時,并且可以減少使用中的防御性編程(信任但是仍要驗證),你不是一個人在寫代碼,協作優先,

在開發中,如果你接觸過復雜性資料結構,并且還要在模塊中不斷進行資料轉化,你就會不斷的遇到:我的資料呢?到底在那一步丟失了?并且即使是代碼對的,你仍舊害怕,仍舊懷疑,我已經過了那個“寫 bug 是因為想的不夠多,不夠徹底”的年齡,

函式式思維

js 是有函式式的血統的,當年一直聽說,函式是一等公民,只是當時完全不能理解,

純函式,資料不可變以及代碼即資料這三點是我認為是函式式思維對代碼能力提升最大的三點,

這個我不想展開去聊,因為我沒有熟練掌握過任何一門純函式式語言,但是我的代碼一定有函式式的影子,并且它的確讓我的代碼更優美,

其他

單元測驗,代碼審查,安全等等都沒有講到,這個我也需要足夠的學習才能有所輸出,不過這里列出一些資料供大家學習與了解:

谷歌代碼審查指南

SaaS型初創企業安全101

有理有據就是好代碼

作業在別人遺留的糟糕代碼上是常有的事情,同時面對開發需求實際表,為了兼容,我們也不得不寫出一些不那么好的代碼,但是面對他人的疑問,我們需要給與別人這樣做的理由,也就是你的每一行代碼寫下去一定有充分的理由和依據,

結語

明顯不等于簡單,上述都是很明顯的事情,但是要做好都需要很長時間的學習與經驗,

所以如何才能寫好代碼呢?那就是多看開源代碼,多讀書,多學習,多關注業界的動向與實踐,不斷學習,不斷進化的代碼才是好代碼,

最近有一些小伙伴(無中生友)問我的名字為什么要叫 jump_jump,我是為了讓自己以及看到我的小伙伴們牢記多鍛煉,閑下來的時候多跳一跳,對身體有好處,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/96484.html

標籤:其他

上一篇:AT指令之 TCP/IP 命令

下一篇:安徽大學831控制工程自動控制原理

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more