Linux第20節 --- inode和文件系統

一、沒有被打開的文件

如果一個文件沒有被打開,那么該文件存儲在哪里?

該文件是存儲在磁盤當中的!

文件 = 文件內容 + 文件屬性!

  • 文件的內容是按照數據塊存儲的;
  • 文件的屬性其實就是inode(是一個128字節的數據塊,包含該文件的所有屬性);
  • Linux的文件在磁盤中存儲,是將文件的內容和屬性分開存儲的!!!

磁盤的特性:

  • 磁頭是一面一個;
  • 磁頭和盤面不接觸(挨得非常近);
  • 磁盤一般處于無塵環境;(灰塵對磁盤的影響很大!)
  • 數據是在盤面中存儲的;
  • 磁盤是永久性存儲介質(無電沒影響);

如上圖所示:綠色的是磁道,紅色的是扇區;

磁盤中,一圈同心圓被稱為磁道,磁道會被且為一小段一小段的區域,這一小段區域被稱為扇區!磁盤會被分為無數個扇區;

磁盤被訪問的最基本單元是扇區;一個扇區大小通常是512字節,甚至有4KB;

我們可以把磁盤看作是無數個扇區構成的存儲介質;

要把數據存儲到磁盤,第一個要解決的問題就是定位一個扇區!

因此,首先我們要先定位到哪個面,即定位用哪個磁頭?

接下來我們要確定訪問哪個磁道?然后再定位訪問哪一個扇區?

同一磁道,從上面往下看就是柱面的概念!

磁頭是同時移動的!

假如說當前三面磁盤六個磁頭,磁頭要移動的時候六個磁頭同時動!

磁頭的左右擺動實際上是定位磁道和柱面的過程!(確定當前半徑即磁道大小!)

當磁頭不動,光盤動的時候,該過程被稱為定位扇區!

對磁盤來說:

  • 運動越少,效率越高;
  • 運動越多,效率越低;

對于磁盤尋址,有三個關鍵的參數:Cylinder(柱面),Header(磁頭),Sector(磁道)三個參數;

根據這三個參數確定的扇區地址被稱為CHS尋址法則;

如果當前我們有三個磁盤,一共六面;

我們將其延展開,邏輯上可以看作是線性的!

其中,每一面又包括許多磁道!每一個磁道又包括多個扇形;

那么最終我們可以得到以扇區為基本單位的數組:(任何一個扇區都有對應的下標)

但是磁盤確認只根據CHS,因此此時我們需要找到對應的CHS和我們抽象化的數組之間的關系!

假設當前磁盤一個盤面有2w個扇區,每個扇區有50個磁道,而每個磁道有400個扇區!

當前有一個扇區標號為28888;那么此時我們根據對應的邏輯運算可以反推得到該扇區位于哪個磁面,哪個磁道和扇區!

LBA地址即為我們抽象的邏輯地址!

回歸到磁盤的硬件?

不僅CPU有寄存器,其他外設(磁盤)也有寄存器!

磁盤當中有三個寄存器:

  • 控制寄存器;
  • 數據寄存器;
  • 狀態寄存器;

如果操作系統想要訪問磁盤,此時需要告訴控制寄存器當前是讀取還是寫入?即控制寄存器控制IO方向(r/w),然后讀取/寫入的數據位于數據寄存器當中,接下來再獲取LBA的地址即可進行讀取或寫入,最后返回操作后的結果;

文件系統

假設當前我們有800G的磁盤空間,分區的過程實際上就是定義一個結構體,該結構體包含了抽象數組中我們使用的起始地址和最終地址!

此時我們只需要把這分割好的200G管理好,那么按照相同的策略即可管理好總的800G的磁盤!

我們先看Data block:

Data blocks可以有很多塊(block),每個block的大小可以是1024,2048,4096個字節,這三種選項;Data blocks是用于存放文件內容的;(此時凡是我們通過fopen,fread,fwrite訪問磁盤,那么訪問的基本單元都是上面三種我們設置的1,2,4KB大小(文件塊大小)!一般而言,每個塊只有自己對應的數據!)

inode table:存放的有單個文件的所有屬性,一般的大小是128字節!一般而言,一個文件有一個inode!在inode里面有唯一的編號!且該文件內容有多少個塊(block)這一信息也在inode!

inode可能大致如下結構所示:

inode不包含文件的名稱!每個文件用唯一編號確認!

通過ls -li可以查看文件對應的編號:

在Linux系統里面標識一個文件使用的是inode編號!

?

假如說當前NUM = 15,那么是不是說該文件最大為4*15 = 60KB呢?

答案:不是!可以通過二級索引以上來進行擴容!

例如當前我們0~12為直接索引,直接指向文件內容;12,13,14可是是二級索引,引用的塊用于存放新的數據塊的指針!4KB = 4*1024;每個二級索引最大為4MB!?

1. 直接索引(Direct Index)

  • 定義:?inode中的block[0]block[11](不同文件系統數量可能不同)是直接索引項,每個項直接指向一個數據塊(Data Block)。例如,若直接索引項有12個,每個數據塊大小為4KB,則直接索引可存儲最大?12 × 4KB = 48KB?的文件。
  • 作用:?直接處理小文件,無需額外索引塊,訪問速度快。
  • 示例:?若文件僅占用直接索引塊,系統直接通過block[i]找到對應數據塊。

2. 二級索引(一級間接索引,Indirect Index)

  • 定義:?inode中某個索引項(如block[12])指向一個一級間接索引塊,該索引塊本身存儲多個數據塊指針。假設每個指針占用4字節,一個4KB的索引塊可存儲?4096B / 4B = 1024個指針。此時,二級索引可支持?1024 × 4KB = 4MB?的數據。
  • 作用:?擴展中等大小文件的存儲能力,避免直接索引項不足。
  • 流程
    1. inode的block[12]指向一個索引塊。
    2. 索引塊中的每個指針指向實際數據塊。
    3. 系統通過兩次磁盤訪問(索引塊 + 數據塊)獲取數據 。
      ?

3. 三級索引(二級間接索引,Double Indirect Index)

  • 定義:?inode中某個索引項(如block[13])指向一個二級間接索引塊,該索引塊再指向多個一級間接索引塊,每個一級索引塊再指向數據塊。此時,三級索引可支持?1024 × 1024 × 4KB = 4GB?的數據。
  • 作用:?支持大文件,通過多層間接索引擴展存儲容量。
  • 流程
    1. inode的block[13]指向二級間接索引塊。
    2. 二級索引塊中的指針指向多個一級間接索引塊。
    3. 每個一級索引塊再指向數據塊。
    4. 系統需三次磁盤訪問(二級索引塊 + 一級索引塊 + 數據塊) 。
      ?

我們如何知道哪個存放文件的數據塊被使用了,哪個沒有被使用?

Block Bitmap:?Block Bitmap里面存放了記錄Data Block中的哪個數據塊被占用了,哪個數據塊沒被占用!(1個比特位表示1個塊! --- 置為1表示該塊被使用!)

4KB = 4096個字節 = 4096*4個比特位!

問題:刪一個文件的時候,用不用把塊(文件內容)清空呢?

不用!只需要將對應的位圖清空!全設置為0即可!

inode位圖(inode Bitmap): 每個bit表示一個inode是否空閑可用!(當一個文件有inode table的時候,可能會有多個inode!)
inode Bitmap 的比特位的位置與inode是否有效使用連接起來!
因此,當前如果我們要進行文件的刪除,我們需要做以下的操作:
  • 獲取當前文件的inode編號(在inode table里面)
  • 然后再inode bitmap查看該inode是否是有效的!
  • 如果有效,在通過inode table讀取屬性,獲得inode編號與其內容的映射關系,將讀取到的塊號在block bitmap里面置為0!
  • 再在inode bitmap將對應的編號設置為0!

刪文件對內容沒有關系!

每一個文件的分組都有如上的結構;

在Linux中,inode編號是以分區為單位統一分配的(不能跨分區)!?

在一塊分區內,inode的編號是確定的!(一般是預先設置好的!)
塊必須大于等于扇區!
因為扇區是我們定義的磁盤訪問的最小單位!
當我們對io進行讀取的時候,一次奪取多個塊,實際上是對數據的預加載機制!
可能我們只需要128KB,但是我們加載了512KB,多余的就可以被稱為預加載的數據!
一般而言,inode的編號都是連續的!
有沒有可能inode被用完了,但是數據塊還存在?
有!因為inode的分配是固定的!

磁盤訪問中是以塊大小為基本單位的!扇區是最小單位!(例如8個扇區的大小即為1個塊!)

GDT,Group Descriptor Table:塊組描述符,描述塊組屬性信息,描述的是整個分組的基本使用情況!
Super Block:包含了文件系統的基本信息,其中包括當前文件系統分組的基本情況!(整個分區!)
  • 一共有多少個組;
  • 每個組的大小
  • 每個組的inode的大小;
  • 每個組的block的數量;
  • 每個組的其實inode;
  • 文件系統的類型和名稱等!

super block不會在每一個組中都有!有的組可能沒有,有的組可能有多份!

如果當前super block這個模塊的內容掛掉了!那么當前根據組進行的分區等什么都做不了,因此整個分區都掛掉了!

所以一般會在Block group 0 ~ n中零零散散有多個Super block!

結論:每一個分區在被使用前,都需要提前將部分文件系統的屬性信息提前設置進對應的分區當中!方便我們后續使用這個分區或者分組,這一過程叫做格式化!(具體點還會將Block Bitmap 和 inode Bitmap進行清空!再將對應的文件信息寫入進去)

藍色部分是為了管理后面紅色部分的屬性信息!

在Linux中,可以通過stat指令查看文件的詳細信息(比ls更詳細)

問題:

  1. 新建一個文件,系統要做什么?
  2. 刪除一個文件,系統要做什么?
  3. 查找一個文件,系統要做什么?
  4. 修改一個文件,系統要做什么?

回答上面這些問題之前,我們可以先總結下我們得到的結論:

  • Linux中,一個文件只有一個對應的inode,每一個inode都有自己對應的inode編號!(inode的設置只在對應的分區有效,例如我們舉例的200G)
  • inode表示文件的所有屬性,文件名并不屬于文件屬性!

當我們在一個路徑下創建文件,有了路徑我們可以確定要創建到對應的那個分區!

系統會對當前的文件分配對應的inode編號(分配inode編號的過程,根據路徑我們已經認定是在哪個區了,然后查詢對應的GDT,可以發現對應的inode的使用率很低,然后再查詢inode bitmap,查詢到最近的沒有被使用的inode編號,然后分配)

刪除 = 允許被覆蓋!

cat test.txt

在操作系統的層面上看:實際上是cat根據test.txt的inode找到對應的磁盤分區和分組,然后在inode BitMap確定該文件對應的inode是0還是1,如果是1,再到inode Table查詢對應的存儲空間(blocks),然后讀取對應的數據塊的內容;

stat test.txt

在操作系統的層面上看:實際上是stat也是根據文件的inode找到對應的inode table,再將里面的重要的屬性提取出來!

問題:我們如何知道一個文件的inode編號?

用戶從來沒有關心過inode,用的是文件名!

解答:這是因為目錄也是文件!也有自己對應的inode編號;

我們知道,文件 = 內容 + 屬性,那么目錄的內容是什么?即目錄需不需要對應的數據塊?

答案是需要的!在目錄的數據塊里面,存放了文件的文件名和對應的inode的映射關系!

問題:當我們執行ls /ll 的時候,對于磁盤文件操作系統應該是如何實現的?

找到當前目錄文件的inode,然后根據inode再對應的inode table找到對應的數據塊,此時可以找到文件名和對應文件的映射關系!此時可以找到目錄里面文件的inode,從而對接到上面新建文件等四個過程!

因此接下來我們可以回答之前的四個問題:

  • 為什么同一個目錄不能用同名文件?

文件名作為key值要找到對應的inode編號,即value!

  • 為什么目錄下,沒有w我們不能創建文件?

即使能將文件創建出來,但是這個文件的文件名和inode的映射關系無法寫入到數據塊中!

  • 為什么目錄下,沒有r我們不能查看文件?

查看文件之前,我們需要獲取文件的inode,但是當前目錄我們無法讀取數據塊中的內容!因此無法查看文件!

  • 為什么目錄下,沒有x我們不能進入目錄?

進入一個目錄需要cd,cd的本質實際上就是找到目錄的inode,然后把當前系統的環境變量進行更新!但是當前我們無法獲取inode!

  • 路徑解析的必要條件:?當用戶嘗試進入目錄(如執行cd dir)或訪問目錄內的文件(如cat dir/file),系統需要遍歷目錄的目錄項以找到目標文件的inode號。這一過程需要訪問目錄的數據塊,而訪問數據塊的前提是目錄具備x權限?。
  • x權限與inode的關系:?目錄的x權限控制了對目錄數據塊的搜索能力。即使有讀權限(r),也只能列出文件名(通過ls),但無法通過inode號訪問具體文件,因為系統無法定位到目錄數據塊的物理位置 。

關鍵問題:怎么獲取目錄的inode編號?

我們需要從當前目錄進行遞歸向上尋找,直到找到根目錄,根目錄里面存放的有目錄的inode信息!訪問任何的文件,我們都需要路徑來進行訪問!

二、軟硬鏈接

軟鏈接是一個獨立的文件!因為具有獨立的inode!

建立硬鏈接的指令:

ln 原文件 硬鏈接名字
# 例如:ln cat.jpg my_pet.jpg

?建立軟鏈接的指令:

ln -s 原文件 軟鏈接名字
# 例如:ln -s cat.jpg shortcut_to_cat.jpg
  • ln是建立鏈接的指令!
  • -s表示建立軟鏈接;
  • ln什么都不帶表示表示硬鏈接!

針對硬鏈接:?

對于硬鏈接,我們發現文件和硬鏈接共用一個inode!

硬鏈接不是獨立的文件,因為沒有獨立的inode!

硬鏈接形成的inode一樣,所以對應的文件的特性是一樣的!

結論:所謂的建立硬鏈接,本質其實就是在特定目錄的數據塊中新增文件名和指向的文件的inode的映射關系!

  • 硬鏈接的本質實際上就是取別名!
  • 任意的一個文件,無論是目錄還是普通文件,都有inode編號!
  • 在每一個inode編號的內部,都有一個引用計數的計數器!(計數器的作用是表明當前有多少個文件指向這個inode)

可以存在多個文件名映射同一個inode!

引用計數為0的時候,該文件才會被徹底刪除!

針對軟鏈接:?

如何理解軟連接?

軟連接是一個獨立的文件,有獨立的inode編號,也有獨立的數據塊,它的數據塊里面存放的是指向原文件的路徑

因此,當我們進入如下操作的時候:

我們往源文件中寫入數據,軟鏈接的文件也能直接訪問到(因為寫入的是地址)!?

因此,如果將軟鏈接刪除,對源文件無影響;

但是如果將源文件進行刪除,軟鏈接就找不到了!

軟連接類似于Windows中的快捷方式!

除了通過rm進行刪除,我們還可以進行unlink進行刪除!(軟硬鏈接都可以!)

unlink 軟/硬鏈接文件名

軟鏈接的應用:

當我們需要執行的程序位于路徑深處,但是此時我們想要在當前目錄下運行,此時我們可以跟其進行軟連接,而不用到路徑深處來執行!

例如下面的例子:

硬鏈接的應用:

當前目錄下我們有一個file文件,其硬鏈接數為1很好理解;

但是如果我們創建一個空目錄,那么當前的硬鏈接數為2!

這是因為當我們進入到這個目錄的時候,我們還有對應的一個點也就是當前目錄!?

一個點是對應的文件夾的硬鏈接,所以它們的inode值是一樣的!?

問題:為什么對應的..的硬鏈接數是3呢?

這是因為..(上級目錄)是一個對應的硬鏈接,然后上一級目錄是lesson22,這個目錄還存在本身和當前目錄.? !!!

如果我們子啊對應的dir目錄下再創建一個子目錄,這時候dir對應的硬鏈接會變為3!

這是因為創建的子目錄里面包含了對應的..上級目錄,這算一個硬鏈接!

規律:已知當前目錄的硬鏈接數,那么這個目錄下有多少個子目錄呢?(硬鏈接數 -2)

應用:通常用于路徑定位,采用硬鏈接可以進行路徑間的切換!

問題:Linux內部不允許對目錄進行硬鏈接,為什么?

如果我們要在根目錄下根據文件名查找一個文件且此時與根目錄實現硬鏈接:

此時我們需要讀取路徑上inode和其對應的屬性,但是當我們找到硬鏈接的時候,此時又重新返回到根目錄,造成死循環!

問題:目錄內部有 ./..不是硬鏈接嗎?

這是操作系統自己編碼時實現的,操作系統可以,但是用戶不可以,哪怕是root!

系統在搜索路徑的時候,不會對.和..這兩個硬鏈接的路徑做搜索!所以不會出現死循環!

硬鏈接只是對應的文件名和一對對應的inode映射!不是真正的目錄,依舊屬于當前目錄下的內容,因此rm刪除目錄不需要考慮.和..!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78261.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78261.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78261.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

1.PowerBi保姆級安裝教程

1.進入power bi網站 PowerBi下載鏈接 2.下載power bi軟件 3.雙擊安裝 4.下一步 5.下一步 6.下一步 7.下一步 8.安裝 9.雙擊桌面圖標

Android Studio中OpenCV應用詳解:圖像處理、顏色對比與OCR識別

文章目錄 一、OpenCV在Android中的集成與配置1.1 OpenCV簡介1.2 在Android Studio中集成OpenCV1.2.1 通過Gradle依賴集成1.2.2 通過模塊方式集成1.2.3 初始化OpenCV 1.3 OpenCV基礎類介紹 二、指定區域圖像抓取與對比2.1 圖像抓取基礎2.2 指定區域圖像抓取實現2.2.1 從Bitmap中…

前端面試每日三題 - Day 22

今天我們將深入探討 JavaScript 中的 Set 和 Map 數據結構,了解它們的特性及應用場景。接下來,我們會分析 React 的 Suspense 和 Concurrent Mode 的工作原理,探索它們如何提升應用的性能和用戶體驗。最后,我們將學習如何設計一個…

[Vue]編程式導航

在 Vue 中&#xff0c;編程式導航是通過 JavaScript 代碼&#xff08;而非 <router-link> 標簽&#xff09;動態控制路由跳轉的核心方式。這個方法依賴于 Vue Router 提供的 API&#xff0c;能更靈活地處理復雜場景&#xff08;如異步操作、條件跳轉等&#xff09;。 一、…

鄒曉輝教授十余年前關于圍棋程序與融智學的思考,體現了對復雜系統本質的深刻洞察,其觀點在人工智能發展歷程中具有前瞻性意義。我們可以從以下三個維度進行深入解析:

鄒曉輝教授十余年前關于圍棋程序與融智學的思考&#xff0c;體現了對復雜系統本質的深刻洞察&#xff0c;其觀點在人工智能發展歷程中具有前瞻性意義。我們可以從以下三個維度進行深入解析&#xff1a; 一、圍棋程序的二元解構&#xff1a;數據結構與算法的辯證關系 1.1.形式…

The Traitor King (10 player 25 player)

The Traitor King 十字軍試煉尾王成就。叛變的國王&#xff1a;在30秒內殺死40只蟲群甲蟲。考驗團隊配合的成就。比不朽者&#xff0c;黑曜石31等等強度大&#xff0c;甚至感覺比寶庫地風火難。

數據結構一 單鏈表

1.單鏈表 1.數據結構簡介 程序數據結構算法 數據 數據&#xff08;data&#xff09;是客觀事物的一個符號表示 數據元素&#xff08;data element&#xff09;是數據的基本單位&#xff0c;一 個數據元素可以由若干個數據項&#xff08;data item&#xff09;組成。數據項…

GPU集群監控系統開發實錄:基于Prometheus+Grafana的算力利用率可視化方案

一、科研場景下的GPU監控痛點 在深度學習模型訓練、分子動力學模擬等科研場景中&#xff0c;GPU集群的算力利用率直接影響著科研效率。筆者在參與某高校計算中心的運維工作時&#xff0c;發現以下典型問題&#xff1a; 資源黑洞現象&#xff1a;多課題組共享GPU時出現"搶…

【計算機視覺】三維重建: MVSNet:基于深度學習的多視圖立體視覺重建框架

MVSNet&#xff1a;基于深度學習的多視圖立體視覺重建框架 技術架構與核心算法1. 算法流程2. 關鍵創新 環境配置與實戰指南硬件要求安裝步驟數據準備&#xff08;DTU數據集&#xff09; 實戰流程1. 模型訓練2. 深度圖推斷3. 點云生成 常見問題與解決方案1. CUDA內存不足2. 特征…

智能家居的OneNet云平臺

一、聲明 該項目只需要創建一個產品&#xff0c;然后這個產品里面包含幾個設備&#xff0c;而不是直接創建幾個產品 注意&#xff1a;傳輸數據使用到了不同的power&#xff0c;還有一定要手機先聯網才能使用云平臺 二、OneNet云平臺創建 &#xff08;1&#xff09;Temperatur…

aidermacs開源程序使用 Aider 在 Emacs 中進行 AI 配對編程

一、軟件介紹 文末提供程序和源碼下載 Aidermacs 通過集成 Aider&#xff08;最強大的開源 AI 配對編程工具之一&#xff09;為 Emacs 帶來了 AI 驅動的開發。如果您缺少 Cursor&#xff0c;但更喜歡生活在 Emacs 中&#xff0c;Aidermacs 提供了類似的 AI 功能&#xff0c;同…

加密算法(一)-對稱加密(DES、AES、3DES、Blowfish、Twofish)一篇了解所有主流對稱加密,輕松上手使用。

一、對稱加密算法 對稱加密算法采用相同的密鑰來進行加密和解密操作。其優點是加密和解密速度快&#xff0c;不過密鑰的管理和分發存在一定的安全風險。 1.1、DES(已不推薦使用) 這是早期的對稱加密算法&#xff0c;密鑰長度為 56 位。但由于密鑰長度較短&#xff0c;如今已不…

深度優先VS廣度優先:算法選擇的核心邏輯與實戰指南

摘要 深度優先搜索&#xff08;DFS&#xff09;與廣度優先搜索&#xff08;BFS&#xff09;是圖結構遍歷與路徑分析的基礎算法&#xff0c;也是最常見的搜索框架&#xff0c;在路徑規劃、社交網絡分析、游戲AI等領域均有廣泛應用。本文從算法思想、數據結構選擇、時空復雜度和…

2025深圳杯、東三省數學建模B題數模AI全網專業性第一

為什么選擇使用我的數模AI&#xff1f; 1.輕松輔導學生 2.小白也能翻身碾壓大佬 3.突破知識壁壘&#xff0c;縮短與大佬的差距&#xff0c;打破不公平的教學資源&#xff0c;扭轉差距 4.輔助商業服務&#xff0c;成本低 5.大模型本身有一定隨機性&#xff0c;所以也不用擔心…

使用MGeo模型高精度實現文本中地址識別

一、功能與安裝 1、模型地址 模型是阿里開發的門址高精度識別模型。 https://modelscope.cn/models/iic/mgeo_geographic_elements_tagging_chinese_base/summary 注意&#xff1a;不能自己安裝包&#xff0c;沒法解決依賴問題&#xff0c;直接按照官方要求安裝下面的包&am…

【Vue】Vue與UI框架(Element Plus、Ant Design Vue、Vant)

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;Vue 文章目錄 1. Vue UI 框架概述1.1 主流Vue UI框架簡介1.2 選擇UI框架的考慮因素 2. Element Plus詳解2.1 Element Plus基礎使用2.1.1 安裝與引入2.1.2 基礎組件示例 2.2 Element Plus主題定制2.3 Element Plus的優缺點分析 3…

MLPerf基準測試工具鏈定制開發指南:構建領域特異性評估指標的實踐方法

引言&#xff1a;基準測試的領域適配困局 MLPerf作為機器學習性能評估的"黃金標準"&#xff0c;其通用基準集在實際科研中常面臨?領域適配鴻溝?&#xff1a;醫療影像任務的Dice系數缺失、NLP場景的困惑度指標偏差等問題普遍存在。本文通過逆向工程MLPerf v3.1工具…

好看的個人主頁HTML源碼分享

源碼介紹 好看的個人主頁HTML源碼分享&#xff0c;源碼由HTMLCSSJS組成&#xff0c;記事本打開源碼文件可以進行內容文字之類的修改&#xff0c;雙擊html文件可以本地運行效果 效果預覽 源碼獲取 好看的個人主頁HTML源碼分享

mac word接入deepseek

網上大多使用Windows版word來接入deepseek&#xff0c;vba文件引入mac后&#xff0c;因底層工具不同&#xff0c;難以直接運行&#xff0c;例如CreateObject("MSXML2.XMLHTTP")無法創建&#xff0c;為此寫了一版新的vba&#xff0c;基于mac底層工具來實現。 vba文件點…

React Native 入門 jsx tsx 基礎語法

React Native 入門 jsx 基礎語法 JSX 介紹 JSX (JavaScript XML) 是一種 JavaScript 的語法擴展&#xff0c;允許你在 JavaScript 文件中編寫類似 HTML 的代碼。它是 React 和 React Native 應用程序中用來描述 UI 的主要方式。 JSX 的特點 JSX 看起來像 HTML&#xff0c;但…