03.【Linux系統編程】基礎開發工具1(yum軟件安裝、vim編輯器、編輯器gcc/g++)

目錄

1. 軟件包管理器

1.1 什么是軟件包

1.2?Linux軟件生態

1.3 yum具體操作

1.3.1 查看軟件包

1.3.2 安裝軟件

1.3.3 卸載軟件

1.3.4 注意事項(測試網絡)

1.3.5 yum指令集總結

1.4?yum源目錄、安裝源

2. Vim編輯器的使用

2.1 Linux編輯器-vim使用

2.2 vim的基本概念

2.3 vim基本操作

2.3.1?模式切換

2.3.2?正常模式命令集

2.3.3 末行模式命令集

2.3.4 其他模式命令集(批量添加/刪除)

2.3.5 補充命令

3. 編譯器gcc/g++

3.1 gcc編譯

3.1.1?預處理(進行宏替換)

3.1.2?編譯(生成匯編)

3.1.3?匯編(生成機器可識別代碼)

3.1.4 鏈接(生成可執行文件或庫文件)

3.2 動態鏈接和靜態鏈接

3.3?靜態庫和動態庫

3.4 條件編譯用途,為什么C/C++編譯時要轉匯編

3.5?gcc其他常用選項(了解)


1. 軟件包管理器

1.1 什么是軟件包

? ? ? ? Linux安裝軟件的三種方式:

????????1. 下載到程序的源代碼, 并進行編譯, 得到可執行程序.

? ? ? ? 2. ".rpm"文件,一種軟件包格式,這種格式的文件擴展名通常是 .rpm。它包含了編譯好的軟件二進制文件、配置文件、文檔以及安裝/卸載腳本。(不包含軟件依賴)

? ? ? ?3. 包管理器(推薦),會分析軟件依賴關系,并自動從軟件倉庫下載并安裝所有必需的依賴包。

?????????Centos:?yum(Yellow dog Updater, Modified)是Linux下非常常用的一種包管理器. 主要應用在Fedora,RedHat, Centos等發行版上.

????????? Ubuntu:主要使用apt(Advanced Package Tool)作為其包管理器。apt同樣提供了自動解決依賴關系、下載和安裝軟件包的功能。

????????注意:安裝軟件需要root權限。

1.2?Linux軟件生態

1. Linux下載軟件的過程(Ubuntu、Centos、other)

2. 操作系統的好壞評估--- 生態問題

3.?為什么會有人免費特定社區提供軟件,還發布?還提供云服務器讓你下載?

驅動方主要動機獲得回報
個人開發者

理想主義、解決自身需求、獲得聲譽

名譽、技術提升、更好的就業機會
開源社區協作精神、互利共贏更好的軟件、強大的生態
商業公司構建生態、降低行業成本、制定標準銷售增值服務、支持服務、托管服務
云服務商吸引用戶使用其高利潤的云平臺豐厚的云服務收入(遠超帶寬成本)

????????所以,這并非純粹的利他主義。這是一個精心設計的、多方共贏的生態系統:個人獲得名譽,企業獲得人才和創新,公司獲得利潤,社會獲得技術進步。 免費提供軟件和下載,只是這個龐大生態系統得以運轉的“入門成本”和“流量入口”。

4. 軟件包依賴的問題

5. 國內鏡像源

1.3 yum具體操作

1.3.1 查看軟件包

????????通過 yum list 命令可以羅列出當前一共有哪些軟件包. 由于包的數目可能非常之多, 這里我們需要使用grep 命令只篩選出我們關注的包. 例如:

# Centos,yum list加grep尋找lrzsz
yum list | grep lrzsz
# lrzsz.x86_64 0.12.20-36.el7 @base# 注意事項:
# 軟件包名稱: 主版本號.次版本號.源程序發行號-軟件包的發行號.主機平臺.cpu架構.
# "x86_64" 后綴表示64位系統的安裝包, "i686" 后綴表示32位系統安裝包. 選擇包時要和系統匹配.
# "el7" 表示操作系統發行版的版本. "el7" 表示的是 centos7/redhat7. "el6" 表示 centos6/redhat6.
# 最后一列, base 表示的是 "軟件源" 的名稱, 類似于 "小米應用商店", "華為應用商店" 這樣的概念.

1.3.2 安裝軟件

????????通過 yum, 我們可以通過很簡單的一條命令完成 lrzsz的安裝.

# Centos
# sudo yum install -y [軟件名]
$ sudo yum install -y lrzsz# Ubuntu
$ sudo apt install -y lrzsz# yum/apt 會自動找到都有哪些軟件包需要下載, 這時候敲 "y" 確認安裝.
# 出現 "complete" 字樣或者中間未出現報錯, 說明安裝完成.
# 注意事項:
# 安裝軟件時由于需要向系統目錄中寫入內容, 一般需要 sudo 或者切到 root 賬戶下才能完成.
# yum/apt安裝軟件只能一個裝完了再裝另一個. 正在yum/apt安裝一個軟件的過程中, 如果再嘗試用yum/apt安裝另外一個軟件, yum/apt會報錯.

1.3.3 卸載軟件

# Centos
sudo yum remove [-y] lrzsz# Ubuntu
sudo apt remove [-y] lrzsz

1.3.4 注意事項(測試網絡)

????????關于 yum / apt 的所有操作必須保證主機(虛擬機)網絡暢通!!!

????????可以通過 ping 指令驗證

ping www.baidu.com

1.3.5 yum指令集總結

指令功能
yum install安裝軟件包
yum list列出所有可供安裝的軟件包
yum search搜索包含指定關鍵字的軟件包
yum remove寫在指定的軟件包
yum makecache將軟件包信息緩存到本地
yum search用于在搜索包含有指定關鍵字的軟件包
yum clean all清理老舊的緩存信息
yum update升級所有包同時,也升級軟件和系統內核
yum upgrade只升級所有包,不升級軟件和系統內核,軟件和內核保持原樣

1.4?yum源目錄、安裝源

????????Cetnos 安裝源路徑:

# /etc/yum.repos.d/ 目錄下存放的.reps文件就是是各種應用下載源
$ ll /etc/yum.repos.d/
total 16
-rw-r--r-- 1 root root 676 Oct 8 20:47 CentOS-Base.repo # 標準源
-rw-r--r-- 1 root root 230 Aug 27 10:31 epel.repo # 擴展源# 安裝擴展源,方便課堂演示
# $ sudo yum install -y epel-release

2. Vim編輯器的使用

2.1 Linux編輯器-vim使用

????????vi/vim的區別簡單點來說,它們都是多模式編輯器,不同的是vim是vi的升級版本,它不僅兼容vi的所有指令,而且還有一些新的特性在里面。例如語法加亮,可視化操作不僅可以在終端運行,也可以運行于x window、 mac os、 windows。我們課堂上,統一按照vim來進行講解。

2.2 vim的基本概念

????????vim三種基礎的模式分別是普通模式(Normal mode)插入模式(Insert mode)底行模式(last line mode),各模式的功能區分如下:

????????? 正常/普通/命令模式(Normal mode)

????????控制屏幕光標的移動,字符、字或行的刪除,移動復制某區段及進入Insert mode下,或者到 lastline mode

????????? 插入模式(Insert mode)

????????只有在Insert mode下,才可以做文字輸入,按「ESC」鍵可回到命令行模式。該模式是我們后面用的最頻繁的編輯模式。

????????? 末行/底行模式(last line mode)

????????文件保存或退出,也可以進行文件替換,找字符串,列出行號等操作。

????????在命令模式下,*shift+:* 即可進入該模式。要查看你的所有模式:打開 vim,底行模式直接輸入:help vim-modes(應該一共有12種模式:six BASIC modes和six ADDITIONAL modes.)

2.3 vim基本操作

2.3.1?模式切換

功能指令
進入vim(默認正常模式)vim test.c
正常模式→插入模式a 或 i 或 o
插入模式→正常模式Esc
正常模式→末行模式shift+;
末行模式退出/保存文件指令
保存w
保存并退出wq
不存強制退出q!

2.3.2?正常模式命令集

功能命令具體功能
正常→插入模式i

從光標當前位置開始輸入文件;

a

從目前光標所在位置的下一個位置開始輸入文字;

o

插入新的一行,從行首開始輸入文字。

移動光標h\j\k\l

「h」「j」「k」「l」,分別控制光標左、下、上、右移一格。(光標移動可以帶數字#[n])

G

移動到文章的最后

$

移動到光標所在行的“行尾”

^

移動到光標所在行的“行首”

w

光標跳到下個單詞的開頭(可帶數字)

e

光標跳到下個單詞的字尾(可帶數字)

b

光標回到上個單詞的開頭(可帶數字)

#l光標移到該行的第#個位置,如:5l,56l
gg

進入到文本開始

shift+g

進入文本末端

Ctrl+b

屏幕往“后”移動一頁

Ctrl+f

屏幕往“前”移動一頁

Ctrl+u屏幕往“后”移動半頁
Ctrl+d

屏幕往“前”移動半頁

刪除/剪切x

每按一次,刪除光標所在位置的一個字符

#x

例如,「6x」表示刪除光標所在位置的“后面(包含自己在內)”6個字符

X

大寫的X,每按一次,刪除光標所在位置的“前面”一個字符

#X例如,「20X」表示刪除光標所在位置的“前面”20個字符
dd刪除光標所在行
#dd

從光標所在行開始刪除#行

復制yw

將光標所在之處到字尾的字符復制到緩沖區中。

#yw復制#個字符到緩沖區
yy復制光標所在行到緩沖區。
#yy例如,「6yy」表示拷貝從光標所在的該行“往下數”6行文字。
p

將緩沖區內的字符貼到光標所在位置。注意:所有與“y”有關的復制命令都必須與“p”配合才能完成復制與粘貼功能。(可帶數字,粘貼n次)

替換模式r

替換光標所在處的字符。

R

替換光標所到之處的字符,直到按下「ESC」鍵為止。

更改

cw

更改光標所在處的字到字尾處

c#w例如,「c3w」表示更改3個字
查找shift+3=#選中單詞
n逆向查找,N正向查找
?跳至指定的行Ctrl+g列出光標所在行的行號。
#G

例如,「15G」,表示移動光標至文章的第15行首。(也可使以小寫模式的shift+g)??

大小寫切換shift+~大小寫切換

撤銷上一次操作

u

如果您誤執行一個命令,可以馬上按下「u」,回到上一個操作。按多次“u”可以執行多次回復。

Ctrl+r

撤銷的恢復

2.3.3 末行模式命令集

功能命令具體功能
正常→末行模式Esc→:先Esc進入正常模式,shift+; 進入末行模式
列出行號set nu

輸入「set nu」后,會在文件中的每一行前面列出行號。

取消行號set nonu取消行號

按行號跳轉

#

「#」號表示一個數字,在冒號后輸入一個數字,再按回車鍵就會跳到該行了,如輸入數字15,再回車,就會跳到文章的第15行。

查找/關鍵字

先按「/」鍵,再輸入您想尋找的字符,如果第一次找的關鍵字不是您想要的,可以一直按「n」會往后尋找到您要的關鍵字為止。

保存文件w

在冒號后輸入字母「w」就可以將文件保存起來

離開vim(在wq、w、q后面跟!可以強制執行。

q

按「q」就是退出,如果無法離開vim,可以在「q」后跟一個「!」強制離開vim。

wq

一般建議離開時,搭配「w」一起使用,這樣在退出的時候還可以保存文件。

命令行模式!在 ! 后面直接輸入命令,可以在vim中執行命令行操作。
批量替換%s/src/dst/g將src字串替換為dst;s是substitute的縮寫;%是指整個文件,不加%默認當前行;/g全局替換(一行內所有匹配項)不加 g 則只換每行的第一個 。
分屏操作vs new_src

分屏給new_src

Ctrl+ww切換分屏(正常模式下執行)

2.3.4 其他模式命令集(批量添加/刪除)

1. 視圖模式(批量添加/刪除)

1. 正常模式→視圖模式Ctrl+v
2. 移動光標,選中區域同正常模式
3.1 批量添加
視圖模式→(特殊)插入模式shift+i=I
在光標所在行添加內容
按下Esc鍵退出,則在光標選中的所有區域添加相同內容
3.2 批量刪除
按d刪除選中區域內容

2. 替換模式

替換模式r

替換光標所在處的字符。

R

替換光標所到之處的字符,直到按下「ESC」鍵為止。(也可用小寫的shift+r)

2.3.5 補充命令

? ? ? ? 1. 打開時指定光標位置

# 打開文件并讓光標跳轉到15行
vim test.c +15

? ? ? ? 2.執行上一次帶#的操作

!v
#執行上一次vim test.c +15的操作,直接打開

3. 編譯器gcc/g++

????????編譯流程的四個步驟:

????????????????1. 預處理(進行宏替換/去注釋/條件編譯/頭文件展開等)

????????????????2. 編譯(生成匯編)

????????????????3. 匯編(生成機器可識別代碼)

????????????????4. 鏈接(生成可執行文件或庫文件)

3.1 gcc編譯

????????gcc編譯格式?

gcc [選項] 要編譯的文件 [選項] [目標文件]

? ? ? ? 單文件編譯

# 兩種格式都可以
gcc code.c -o codegcc -o code code.c

? ? ? ? 多文件編譯

gcc main.c code1.c code2.c -o code
# 將main.c code1.c code2.c編譯生成一個code文件# 兩種寫法都可以
gcc -o code  main.c code1.c code2.c

3.1.1?預處理(進行宏替換)

????????預處理功能主要包括宏定義,文件包含,條件編譯,去注釋等。

????????預處理指令是以#號開頭的代碼行。

#實例:
gcc –E hello.c –o hello.i
# ?選項“-E”,該選項的作用是讓 gcc 在預處理結束后停止編譯過程。
# ?選項“-o”是指目標文件,“.i”文件為已經過預處理的C原始程序。

3.1.2?編譯(生成匯編)

????????? 在這個階段中,gcc 首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤后,gcc 把代碼翻譯成匯編語言。

#實例: 
gcc –S hello.i –o hello.s# 用戶可以使用“-S”選項來進行查看,該選項只進行編譯而不進行匯編,生成匯編代碼。

3.1.3?匯編(生成機器可識別代碼)

????????? 匯編階段是把編譯階段生成的“.s”文件轉成目標文件

# 實例:
gcc –c hello.s –o hello.o
# ?讀者在此可使用選項“-c”就可看到匯編代碼已轉化為“.o”的二進制目標代碼了# 補:不指定目標文件,會生成同名.o文件
gcc -c code.c

3.1.4 鏈接(生成可執行文件或庫文件)

# 實例
gcc hello.o –o hello

3.2 動態鏈接和靜態鏈接

? ? ? ? 簡單來講:靜態鏈接是將庫中實現好的方法拷貝到我們的程序中執行。動態鏈接是找到庫中方法的地址,跳轉到庫中執行方法,之后跳轉回來。靜態鏈接實際是拷貝,動態鏈接實際是尋址。

1. 靜態鏈接

????????實際開發中,程序由多個源文件(.c)組成,它們相互調用,存在依賴關系。每個 .c 文件都會獨立編譯成目標文件(.o),靜態鏈接負責把這些 .o 文件“打包”成一個完整的可執行程序。(注意:1.打包的是編譯好的二進制目標代碼.o文件;2.按需打包,只提取使用了的函數所在的目標文件;3.靜態庫只有在鏈接的時候有用,一旦形成可執行程序,靜態庫可以不再需要)

????????缺點

? ? ? ? ? ? ? ? 1.?浪費空間:如果多個程序都用了同一個函數(如 printf),那么每個程序里都會有一份這個函數的完整代碼副本,導致磁盤和內存中存在多份重復內容。

????????????????2.?更新困難:一旦庫代碼有更新,所有依賴它的程序都必須重新編譯鏈接才能生效。

????????優點

????????????????部署簡單,運行快:因為可執行程序自成一體,無需外部依賴,直接就能運行。

2. 動態鏈接

????????動態鏈接的出現解決了靜態鏈接中提到問題。動態鏈接的基本思想是把程序按照模塊拆分成各個相對獨立部分,在程序運行時才將它們鏈接在一起形成一個完整的程序,而不是像靜態鏈接一樣把所有程序模塊都打包,形成一個單獨的可執行文件。(動態鏈接在編譯階段向對應位置寫入需要執行的方法的地址,運行時根據地址跳轉到動態庫對應位置執行對應的方法)

????????動態鏈接其實遠比靜態鏈接要常用得多。比如我們查看下hello 這個可執行程序依賴的動態庫,會發現它就用到了一個c動態鏈接庫

$ ldd hellolinux-vdso.so.1 => (0x00007fffeb1ab000)libc.so.6 => /lib64/libc.so.6 (0x00007ff776af5000)/lib64/ld-linux-x86-64.so.2 (0x00007ff776ec3000)# ldd 用來查看程序或者庫文件所依賴的共享庫列表。

3. 動靜態鏈接對比:

? ? ? ? 1. 動態庫形成的可執行程序體積一定很小

? ? ? ? 2. 可執行程序對靜態庫的依賴度小,而動態庫不能缺失

? ? ? ? 3. 程序運行,需要加載到內存,靜態鏈接的,會在內存中出現大量的重復代碼

? ? ? ? 4. 動態鏈接,比較節省內存和磁盤資源。

4. 為什么要匯編生成.o文件

? ? ? ? 動靜態庫的本質是打包起來的.o文件。所以在整個編譯過程要進行匯編生成.o文件,然后使我的.o文件和動靜態庫中的.o文件鏈接生成可執行程序。

3.3?靜態庫和動態庫

? ? ? ? 庫是一套方法或者數據集,為我們開發提供最基本的保證(基本接口,功能,加速我們二次開發)

? ? ? ? 動靜態庫的本質是打包起來的.o文件。

????????? 靜態庫是指編譯鏈接時,把庫文件的代碼全部加入到可執行文件中,因此生成的文件比較大,但在運行時也就不再需要庫文件了。靜態庫后綴名一般為“.a”

????????? 動態庫與之相反,在編譯鏈接時并沒有把庫文件的代碼加入到可執行文件中,而是在程序執行時由運行時鏈接文件加載庫,這樣可以節省系統的開銷。動態庫一般后綴名為“.so”,如前面所述的libc.so.6 就是動態庫。gcc 在編譯時默認使用動態庫。完成了鏈接之后,gcc 就可以生成可執行文件,如下所示。gcc hello.o –o hello

????????? gcc默認生成的二進制程序,是動態鏈接的,這點可以通過file 命令驗證。

# file可以查看文件是動態鏈接還是靜態鏈接
$ file code
#code: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=e8625d13488f2780664671d6e3802e4c0e08abe3, not stripped
# dynamically linked (uses shared libs)
# 動態鏈接(使用共享庫)

????????補:一般我們的云服務器,C/C++的靜態庫并沒有安裝,可以采用如下方法安裝

# Centos
# 安裝C靜態庫
sudo yum install glibc-static# 安裝C++靜態庫
sudo yum install libstdc++-static

3.4 條件編譯用途,為什么C/C++編譯時要轉匯編

????????1. 條件編譯的用途

? ? ? ? ????????1. 軟件進行專業度,收費情況進行區分(業務),使用條件編譯,可以進行代碼動態裁剪

? ? ? ????????? 2. 內核源代碼也是采用條件編譯進行代碼裁剪

? ? ? ????????? 3. 開發工具,應用軟件。

? ? ? ? 2. 為什么C/C++編譯,要先變成匯編。

? ? ? ? ? ? ? ? 沒出現C之前:匯編語言 → 二進制

? ? ? ? ? ? ? ? 出現了C之后:C語言 → 匯編語言 → 二進制(復用之前匯編轉二進制,使得C只需要完成C轉匯編,實現更簡單)

3.5?gcc其他常用選項(了解)

選項功能
-E只激活預處理,這個不生成文件,你需要把它重定向到一個輸出文件里面
-S編譯到匯編語言不進行匯編和鏈接
-c編譯到目標代碼
-o文件輸出到 文件
-static此選項對生成的文件采用靜態鏈接
-g生成調試信息。GNU 調試器可利用該信息。
-shared此選項將盡量使用動態庫,所以生成文件比較小,但是需要系統由動態庫.

-O0、-O1、

-O2、-O3

編譯器的優化選項的4個級別,-O0表示沒有優化,-O1為缺省值,-O3優化級別最高
-w不生成任何警告信息。
-Wall生成所有警告信息。

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

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

相關文章

3DMAX自動材質開關插件AutoMaterial安裝和使用方法

3DMAX自動材質開關AutoMaterial,是一個3dMax腳本插件,它根據材質編輯器中當前活動的材質自動將材質應用于3dMax中新創建的對象,也適用于您復制的沒有材質的對象。它作為一個開關,可以綁定到按鈕或菜單來打開和關閉它。該工具的創建…

Linux內核調優實戰指南

內核調優通常通過修改內核運行時參數來實現,這些參數的配置文件是 Linux 系統中核心的性能調整點。 內核調優配置文件名稱 /etc/sysctl.conf: 這是最傳統和主要的內核參數配置文件。系統啟動時或手動執行 sysctl -p 命令時會讀取并應用其中的設置。/etc/sysctl.d/*.…

Java基礎常見知識點

Java 中 和 equals() 的區別詳解_java中與equals的區別及理解-CSDN博客https://blog.csdn.net/m0_64432106/article/details/142026852深入理解Java中方法的參數傳遞機制 - 悟小天 - 博客園https://www.cnblogs.com/sum-41/p/10799555.html浮點型精度是什么意思?為…

OD C卷 -【高效貨運】

文章目錄高效貨運高效貨運 貨車的額定載貨量為wt;貨物A單件重量為wa,單件運費利潤為pa;貨物B單件重量wb,單件運費利潤為pb;每次出車必須包含A、B貨物,且單件貨物都不可分割,總重量達到額定的載貨量wt;每次出車能夠獲取…

手動解壓并讀取geo 文件 series_matrix_table_begin series_matrix_table_end之間的數據

手動解壓并讀取geo 文件 series_matrix_table_begin series_matrix_table_end之間的數據 1. 手動解壓并讀取文件內容 file_path <- “K:/download/geo/raw_data/GEO/GSE32967_series_matrix.txt.gz” 使用latin1編碼讀取文件所有行 con <- gzfile(file_path, “r”) all_…

主板硬件研發基礎--DP/DP++

現在的主板大多數使用的是比DP功能更加強大的DP++。 DisplayPort++(DP++)是 DisplayPort 技術的增強版,旨在提升與多種視頻接口的兼容性和連接性能。以下是關于它的詳細介紹: 功能特性 多協議兼容:DP++ 接口不僅支持 DisplayPort 標準的信號傳輸,還可以通過內部的轉換電…

科技行業新聞發布平臺哪家好?多場景推廣專業方案服務商推薦

面對海量得新聞發布平臺和碎片化的傳播場景&#xff0c;如何精準選擇推廣方案無疑是企業主面臨的一大難題&#xff0c;對于技術迭代迅速的科技行業更是如此。針對復雜的市場環境&#xff0c;一些專業的新聞發布平臺往往能夠針對性地給出營銷方案&#xff0c;并提供一定技術支持…

SystemVerilog 學習之SystemVerilog簡介

SystemVerilog簡介SystemVerilog是一種硬件描述和驗證語言&#xff08;HDVL&#xff09;&#xff0c;由Accellera開發并于2005年成為IEEE標準&#xff08;IEEE 1800&#xff09;。它在傳統Verilog基礎上擴展了高級驗證和設計功能&#xff0c;廣泛應用于數字電路設計、驗證及系統…

JavaWeb--day3--AjaxElement路由打包部署

&#xff08;以下內容全部來自上述課程及課件&#xff09; Ajax &#xff08;此章節純粹演示&#xff0c;因服務器端url鏈接失效&#xff0c;所以無法實戰&#xff09; 1. 同步與異步 同步&#xff1a; 瀏覽器頁面在發送請求給服務器&#xff0c;在服務器處理請求的過程…

IMF GDP的bug

IMF GDP 數據底子是官方數字&#xff0c;基本是沿用官方的&#xff0c;雖然經過修訂或估算&#xff0c;存在4大“bug”&#xff1a;1. 依賴官方上報&#xff0c;真實性不保證2. PPP GDP 虛高&#xff0c;居民實際消費力低很多ppp gdp高&#xff0c;甚至gdp高的地方&#xff0c;…

第2篇:數據持久化實戰

在上一篇中&#xff0c;我們構建了一個基于內存存儲的食譜助手。說實話&#xff0c;內存存儲雖然簡單&#xff0c;但有個致命問題&#xff1a;程序一重啟&#xff0c;數據就全沒了。 所以這篇我們要解決數據持久化的問題&#xff0c;將食譜助手從內存存儲升級到SQLite數據庫。 …

Java推薦系統與機器學習實戰案例

基于Java的推薦系統與機器學習實例 以下是一些基于Java的推薦系統與機器學習實例的參考方向及開源項目,涵蓋協同過濾、矩陣分解、深度學習等常見方法。內容根據實際項目和技術文檔整理,可直接用于學習或開發。 協同過濾實現 用戶-物品評分預測 使用Apache Mahout的基于用戶…

AI生成內容檢測的綜合方法論與技術路徑

一、AI內容檢測技術的分類與原理當前AI內容檢測技術主要分為四大類&#xff0c;每類都有其獨特的原理和應用場景&#xff1a;1. 基于語言特征分析的檢測方法這類方法通過挖掘人類寫作與AI生成文本之間的統計學差異進行判斷&#xff1a;1.1 詞匯使用模式分析AI生成的文本在詞匯選…

可可圖片編輯 HarmonyOS(5)濾鏡效果

可可圖片編輯 HarmonyOS&#xff08;5&#xff09;濾鏡效果 前言 可可圖片編輯也實現了濾鏡效果&#xff0c;主要是利用 Image組件的 colorFilter 屬性實現。濾鏡的關鍵屬性 colorFilter colorFilter 的主要作用是給圖像設置顏色濾鏡效果。 其核心原理是使用一個 4x5 的顏色矩陣…

< JS事件循環系列【二】> 微任務深度解析:從本質到實戰避坑

在上一篇關于 JS 事件循環的文章中&#xff0c;我們提到 “微任務優先級高于宏任務” 這一核心結論&#xff0c;但對于微任務本身的細節并未展開。作為事件循環中 “優先級最高的異步任務”&#xff0c;微任務的執行機制直接影響代碼邏輯的正確性&#xff0c;比如Promise.then的…

STM32 單片機開發 - SPI 總線

一、SPI 總線概念SPI 總線 --- Serial Peripheral Interface&#xff0c;即串行外設接口SPI 是摩托羅拉公司設計的一款 串行、同步、全雙工總線&#xff1b;SPI 總線是三線 / 四線制總線&#xff0c;分別是&#xff1a;SPI_SCK&#xff08;時鐘線&#xff09;、S…

區域醫院云HIS系統源碼,云醫院管理系統源碼,云診所源碼

云HIS源碼&#xff0c;云醫院管理系統源碼&#xff0c;云診所源碼&#xff0c;二級專科醫院云HIS系統源代碼&#xff0c;有演示云HIS&#xff0c;即云醫院管理系統&#xff0c;是一種運用云計算、大數據、物聯網等新興信息技術的醫療信息化解決方案。它重新定義了傳統的醫院信息…

Java基礎 9.11

1.第三代日期類前面兩代日期類的不足分析JDK 1.0中包含了一個java.uti.Date類&#xff0c;但是它的大多數方法已經在JDK1.1引Calendar類之后被棄用了。而Calendar也存在問題是&#xff1a;可變性&#xff1a;像日期和時間這樣的類應該是不可變的偏移性&#xff1a;Date中的年份…

JavaScript 數組過濾方法

在 JavaScript 編程中&#xff0c;數組是最常用的數據結構之一&#xff0c;而數組過濾則是處理數據集合的關鍵操作。filter() 方法提供了一種高效的方式來從數組中篩選出符合特定條件的元素&#xff0c;返回一個新的數組&#xff0c;而不改變原始數組。這種方法在處理對象數組時…

《sklearn機器學習——數據預處理》離散化

sklearn 數據預處理中的離散化&#xff08;Discretization&#xff09; 離散化是將連續型數值特征轉換為離散區間&#xff08;分箱/bins&#xff09;的過程&#xff0c;常用于簡化模型、增強魯棒性、處理非線性關系或滿足某些算法對離散輸入的要求&#xff08;如樸素貝葉斯、決…