SQLServer 優(yōu)點(diǎn):易用性:適合分布式組織的可伸縮性、用于決策支持的數(shù)據(jù)倉庫功能、與許多其他服務(wù)器軟件緊密關(guān)聯(lián)的集成性、良好的性價(jià)比等;數(shù)據(jù)管理與分析帶來了靈活性:允許單位在快速變化的環(huán)境中從容響應(yīng),從而獲得競(jìng)爭(zhēng)優(yōu)勢(shì)。從數(shù)據(jù)管理和分析角度看,將原始數(shù)據(jù)轉(zhuǎn)化為商業(yè)智能和充分利用 Web 帶來的機(jī)會(huì)非常重要;完備的數(shù)據(jù)庫和數(shù)據(jù)分析包:SQLServer 為快速開發(fā)新一代企業(yè)級(jí)商業(yè)應(yīng)用程序、為企業(yè)贏得核心競(jìng)爭(zhēng)優(yōu)勢(shì)打開了勝利之門;基準(zhǔn)測(cè)試可伸縮性和速度獎(jiǎng)的記錄保持者:SQLServer 是一個(gè)具備完全 Web 支持的數(shù)據(jù)庫產(chǎn)品,提供了對(duì)可擴(kuò)展標(biāo)記語言(XML)的核心支持以及在 Internet 上和防火墻外進(jìn)行查詢的能力;SQLServer 缺點(diǎn):伸縮性并行性:SQL server 并行實(shí)施和共存模型并成熟難處理日益增多用戶數(shù)和數(shù)據(jù)卷伸縮性有限。安全性:沒有獲得任何安全證書;性能 :SQL Server 多用戶時(shí)性能佳 ;客戶端支持及應(yīng)用模式: 客戶端支持及應(yīng)用模式。只支持 C/S 模式,SQL Server C/S 結(jié)構(gòu)只支持 Windows 客戶用 ADO、DAO、OLEDB、ODBC連接;使用風(fēng)險(xiǎn):SQL server 完全重寫代碼經(jīng)歷了長(zhǎng)期測(cè)試斷延遲許多功能需要時(shí)間來證明并十分兼容。
自己的項(xiàng)目,其實(shí)不太能在全局污染上踩坑。大部分因?yàn)槿治廴驹斐傻膯栴},都出現(xiàn)在老項(xiàng)目下,這些老項(xiàng)目被太多人維護(hù),同時(shí)又缺少模塊化方案,如果開發(fā)人員的水平和意識(shí)都不是非常高,就會(huì)定義很多全局下的屬性和方法。這時(shí)候如果自己去維護(hù)老項(xiàng)目沒注意,覆蓋了一個(gè)全局項(xiàng)目,就可能出現(xiàn)一個(gè)驚天大 Bug。所以在全局環(huán)境下,非必要情況,不要直接聲明變量和聲明函數(shù),他們會(huì)造成全局污染。避免這個(gè)問題最常用的方法就是把自己的邏輯用一個(gè)函數(shù)包裹:(function() { // 業(yè)務(wù)邏輯 var a = 1; var b = 2; var c = 3; function fn() { console.log(a, b, c); } fn(); // 輸出:1 2 3})();fn(); // 拋出異常:fn is not defined函數(shù)擁有自己的作用域,這樣就避免了全局污染的問題。如果有時(shí)候需要通過全局做跳板,把一些內(nèi)容臨時(shí)的掛載全局下,可以起一些不太容易重名的名字:window.__$some_global_var = 1;通過 _ 和 $ 組合一些前后綴,可以大大降低覆蓋他們或者被覆蓋的可能性。也可以增加一個(gè)命名空間,也就給全局下增加一個(gè)對(duì)象,所有自己要用的或者某個(gè)業(yè)務(wù)相關(guān)的全局?jǐn)?shù)據(jù)放在這個(gè)對(duì)象下:window.__some_logic_need = { __$some_global_var: 1, __$some_global_fn: function() {},};
表示式亦稱表達(dá)式、運(yùn)算式或數(shù)學(xué)表達(dá)式,在數(shù)學(xué)領(lǐng)域中是一些符號(hào)依據(jù)上下文的規(guī)則,有限而定義良好的組合。數(shù)學(xué)符號(hào)可用于標(biāo)定數(shù)字(常量)、變量、操作、函數(shù)、括號(hào)、標(biāo)點(diǎn)符號(hào)和分組,幫助確定操作順序以及有其它考量的邏輯語法?!猈ikipedia表達(dá)式可以簡(jiǎn)單理解成一種式子,如 2 + 3 就是一種表達(dá)式,通常會(huì)叫做算術(shù)表達(dá)式。通常表達(dá)式用來產(chǎn)生值,任何需要用到值的地方都可以放置表達(dá)式。一個(gè)表達(dá)式由操作數(shù)與操作符組成,操作數(shù)可以由變量、常量或者另一個(gè)表達(dá)式表示。如:var a = 1;var b = 2;var c = 3;var res = ((a + b) - (c * sqrt(9)));其中第五行等號(hào)右邊就是一個(gè)算術(shù)表達(dá)式,其由多個(gè)算術(shù)表達(dá)式組成。除了函數(shù)調(diào)用的括號(hào),剩下所有括號(hào)包裹的都是一個(gè)表達(dá)式。(注意:表達(dá)式并不是一定要括號(hào)包括,這里是為了方便劃分)在等號(hào)右側(cè)表達(dá)式計(jì)算完后,得到一個(gè)值,最后會(huì)賦值給變量 res,這就是一個(gè)賦值表達(dá)式??梢砸姷奖磉_(dá)式無處不在。注意:有些文獻(xiàn)中會(huì)把調(diào)用函數(shù)描述為一個(gè)函數(shù)表達(dá)式。但通常在JavaScript中會(huì)把一種創(chuàng)建函數(shù)的方式描述為函數(shù)表達(dá)式,具體可以查閱函數(shù)章節(jié)。
Nginx 是完全使用 C 語言開發(fā)的,所以必須要有 C 編譯環(huán)境,往往 CentOS 7.6 的環(huán)境會(huì)預(yù)裝 gcc 編譯器,所以不用額外安裝,如果沒有使用 yum 直接安裝即可。另外,我們使用 Nginx 的壓縮功能、正則表達(dá)式功能等,需要安裝一些額外的依賴庫,這是必須要做的,不然在編譯階段就會(huì)報(bào)錯(cuò)。如下 3 個(gè)是比較 Nginx 中比較常用模塊所依賴的庫,請(qǐng)?jiān)趫?zhí)行 Nginx 源碼編譯時(shí)提前安裝好。$ sudo yum install -y zlib zlib-devel$ sudo yum install -y pcre pcre-devel$ sudo yum install -y openssl openssl-devel編譯并安裝 $ cd nginx-1.17.6$ ./configure # 編譯,檢查依賴是否正確$ make && sudo make install # 安裝上述編譯和安裝命令就如同在 360 軟件中心,點(diǎn)擊一鍵安裝那樣,直接使用默認(rèn)的配置(通常會(huì)將相關(guān)文件安裝到 C 盤目錄)。但是這樣往往不是我們需要的。特別是在 Nginx 中,可以指定安裝某些或者不安裝某些模塊,默認(rèn)安裝的模塊只適合簡(jiǎn)單的場(chǎng)景,往往在稍微復(fù)雜的情況下,就需要額外添加其他模塊,或者第三方以及自定義的模塊。這高可擴(kuò)展性正是 Nginx 的一大亮點(diǎn)。想要查看 configure 的可選參數(shù),使用 --help 選項(xiàng)即可:$ ./configure --help在所有可選參數(shù)中,最常用的有兩個(gè):–prefix=PATH:配置 Nginx 安裝部署的根目錄。類似于在 Windows 下安裝軟件,我們指定安裝目錄;–with-xxx_module:–without-xxx_module 其中 xxx 表示 Nginx 一個(gè)模塊的名稱,例如:with-http_ssl_module -> 支持 SSL/TLS, 即 HTTPSwith-http_v2_module -> 支持 HTTP/2without-http_fastcgi_module -> 不使用 fastcgi為了后續(xù)測(cè)試功能完善,這里我們編譯時(shí)候,盡可能多的引入一些模塊:$ ./configure --prefix=/root/nginx \--with-http_ssl_module \--with-http_stub_status_module \--with-http_gzip_static_module \--with-stream \--with-http_realip_module \--with-http_flv_module \--with-http_random_index_module \--with-mail \--with-pcre \$ make && sudo make install這里 “\” 在 Linux 系統(tǒng)環(huán)境下表示兩行之間沒有換行,只是為了方便展示命令。一般而言,Nginx 的編譯是比較順利的,偶爾報(bào)錯(cuò)是大部分因?yàn)樾枰黾拥哪K依賴的一些庫沒有事先安裝好。對(duì)此,我們可以根據(jù)報(bào)錯(cuò)信息進(jìn)行修正問題,保證編譯順利進(jìn)行。在上一步驟成功后,可以看到 Nginx 我們生成的 Nginx 編譯后的根目錄了。簡(jiǎn)單說明根目錄下的內(nèi)容:
這里我們有一個(gè)程序需要構(gòu)建,而這個(gè)程序構(gòu)建過程中,會(huì)依賴另外一個(gè)程序。這個(gè)時(shí)候我們就可以方便的通過 make 工具了。文件名:test.c#include <stdio.h>int add(int d, int e);int main(){ int a = 2, b = 3, c; c = add(a, b); printf("a add b = %d\n", c); return 0;}上面是我們的主程序,通過調(diào)用外部的程序 add 來實(shí)現(xiàn)加法運(yùn)算。這里需要注意的是我們?cè)诔绦虻拈_始 int add(int d, int e); 這一行語句是函數(shù)的原型聲明,因?yàn)楹瘮?shù)本身是寫在另外一個(gè)函數(shù)里的。這個(gè)函數(shù)本身是不不知道有這個(gè)函數(shù)存在的。要想使用 add 這個(gè)函數(shù),就要先告知這個(gè) main 函數(shù)。文件名:add.cint add(int x, int y){ return x + y;}上面是我們實(shí)現(xiàn)加法運(yùn)算的子程序。也就是被調(diào)用的那個(gè)程序。存在于另外一個(gè)程序文件中。就是一個(gè)簡(jiǎn)單的求和返回值。我們首先展示,直接使用命令行是應(yīng)該如何編譯這兩個(gè)文件的。gcc test.c add.c -o test這個(gè)看著是不長(zhǎng),但是我遇到過數(shù)十個(gè)依賴庫的情況。你們自己可以自行想象一下24寸顯示器屏幕全屏shell窗口一行寫不完的景象。所以這個(gè)時(shí)候 make 工具就要出場(chǎng)了。先寫一個(gè) makefile 文件,名字就叫 makefile。test: test.c add.c gcc test.c add.c -o test運(yùn)行結(jié)果:utopia@DESKTOP:~$ makegcc test.c add.c -o testutopia@DESKTOP:~$ makemake: 'test' is up to date.連續(xù)執(zhí)行兩次 make 也會(huì)有新的發(fā)現(xiàn),當(dāng)再次執(zhí)行 make 時(shí),make 文件會(huì)檢查原始代碼是不是有新的變化。如果缺失依賴文件會(huì)怎樣?如果是直接執(zhí)行編譯命令會(huì)有如下提示。gcc test.c add.c -o testgcc: error: add.c: No such file or directorymakefile:2: recipe for target 'testbuild' failedmake: *** [testbuild] Error 1而采用 make 文件會(huì)有下面的提示。utopia@DESKTOP:~$ makemake: *** No rule to make target 'add.c', needed by 'test'. Stop.這兩者有最大的區(qū)別就是 make 文件在進(jìn)行大規(guī)模編譯前就會(huì)根據(jù)你所提供的依賴進(jìn)行文件檢車。如果缺少了依賴的文件就會(huì)直接停止下面的編譯,節(jié)省了大量的時(shí)間。不會(huì)出現(xiàn)編譯到一半找不到文件的尷尬。
3.3.1 打印普通字符串[root@master ~]# printf "hello shell"hello shell[root@master ~]# printf "hello shell\n"hello shell如果需要換行,需要手動(dòng)顯式添加 \n。3.3.2 格式字符串在掌握 printf 前需要先了解 format-string,其對(duì)應(yīng)著不同的含義,在此我們介紹最常用的格式字符串。%s字符串格式化,其中 %s 就是引用后面的字符 shell[root@master ~]# printf "hello %s\n" shellhello shell%d十進(jìn)制整數(shù)[root@master ~]# printf "age: %d\n" 20 age: 20左對(duì)齊printf 可以使得左對(duì)齊,例如 %-10s 指一個(gè)寬度為 10 個(gè)字符,左對(duì)齊利用 - 表示,任何字符都會(huì)被顯示在 10 個(gè)字符寬的字符內(nèi),如果不足則自動(dòng)以空格填充,超過也會(huì)將內(nèi)容全部顯示出來。[root@master ~]# printf "hello %-10s%s\n" shell 。 hello shell 。右邊對(duì)齊右對(duì)齊利用 + 表示,%+10.2f 指格式化為小數(shù),其中 10 表示 4 個(gè)字符寬度,.2 指保留 2 位小數(shù)。[root@master ~]# printf "hello %+10s%s\n" shell 。 hello shell。[root@master ~]# printf "hello %+10.2f %s\n" 3.1415 。 hello +3.14 。其他當(dāng)然一些其他格式化字符,在此舉例最常用的,其他的可參考如下:%c ASCII字符.顯示相對(duì)應(yīng)參數(shù)的第一個(gè)字符%d,%i 十進(jìn)制整數(shù)(常用)%e 浮點(diǎn)格式([-d].precisione [+-dd])%E 浮點(diǎn)格式([-d].precisionE [+-dd])%g %e或%f轉(zhuǎn)換,看哪一個(gè)較短,則刪除結(jié)尾的零%G %E或%f轉(zhuǎn)換,看哪一個(gè)較短,則刪除結(jié)尾的零%s 字符串(常用)%u 不帶正負(fù)號(hào)的十進(jìn)制值%x 不帶正負(fù)號(hào)的十六進(jìn)制.使用a至f表示10至15%% 字面意義的%%X 不帶正負(fù)號(hào)的十六進(jìn)制.使用A至F表示10至153.3.3 其他單雙引號(hào)在 printf 中,單雙引號(hào)都一致。[root@master ~]# printf "hello %s\n" shellhello shell[root@master ~]# printf 'hello %s\n' shell hello shell格式只指定了一個(gè)參數(shù),但多出的參數(shù)仍然會(huì)按照該格式輸出,format-string 被重用進(jìn)行多行輸出[root@master ~]# printf 'hello %s\n' shell python gohello shellhello pythonhello go[root@master ~]# printf "%s %s %s %s\n" a b c d e f g h i ja b c de f g hi j 如果沒有 arguments,那么則對(duì)應(yīng)使用默認(rèn)值表示, % s 用 NULL 代替,% d 用 0 代替[root@master ~]# printf "%s default %d \n" default 0 3.3.4 printf 轉(zhuǎn)義printf 的轉(zhuǎn)義與 echo 中的一致,可參考 echo 中的轉(zhuǎn)義。
在之前介紹 map 的小節(jié)中提到過線程不安全的 map 。之所以線程不安全是因?yàn)槠鋬?nèi)部實(shí)現(xiàn)機(jī)制中無法同時(shí)讀寫,若有兩個(gè) goroutine 一個(gè)在讀取 map 中的值,而另一個(gè)在更新 map 中的值,就會(huì)導(dǎo)致程序崩潰。代碼示例:package mainimport ( "fmt" "time")func main() { m := map[string]int{"A": 1, "B": 2, "C": 3, "D": 1, "E": 2, "F": 3} //創(chuàng)建100個(gè)goroutine對(duì)map進(jìn)行讀寫 for i := 0; i < 100; i++ { go func() { for v := range m { m[v] = 100 } }() } time.Sleep(time.Second) fmt.Println(m)}執(zhí)行上述代碼有時(shí)會(huì)輸出正確結(jié)果:但更多的時(shí)候會(huì)輸出讀寫沖突的錯(cuò)誤:這個(gè)就是線程不安全的 map 不建議使用的原因,除了直接使用線程安全的 map 之外,還可以為這些 goruntine 加上鎖,使其無法同時(shí)對(duì) map 進(jìn)行讀寫操作,這樣也可以保障各線程的安全。代碼示例:package mainimport ( "fmt" "sync" "time")func main() { var lock sync.Mutex//定義一個(gè)鎖變量 m := map[string]int{"A": 1, "B": 2, "C": 3, "D": 1, "E": 2, "F": 3} for i := 0; i < 100; i++ { go func() { lock.Lock()//在讀取map前鎖定這個(gè)鎖,使其它線程訪問這個(gè)鎖要阻塞 for v := range m { m[v] = 100 } lock.Unlock()//在讀取map前釋放這個(gè)鎖 }() } time.Sleep(time.Second) fmt.Println(m)}加了鎖之后,你就會(huì)發(fā)現(xiàn)無論執(zhí)行幾次,執(zhí)行結(jié)果都是正確的。
Redis 是一個(gè)使用 ANSI C 編寫的開源、支持網(wǎng)絡(luò)、基于內(nèi)存、可選持久性的鍵值對(duì)存儲(chǔ)數(shù)據(jù)庫。# 使用 Docker 啟動(dòng) redis 服務(wù),端口默認(rèn),使用host網(wǎng)絡(luò)模式保障性能。docker run --restart=always --network host -d -it --name myredis redis將 redis 數(shù)據(jù)保存到宿主機(jī)目錄:mkdir -p ~/docker/redis/data # 新建宿主機(jī)目錄docker run --restart=always --network host -d -it -v ~/docker/redis/data:/data --name myredis redis指定自己的配置文件# 先將配置文件放到 ~/docker/redis/redis.confdocker run --restart=always --network host -d -it -v ~/docker/redis/redis.conf:/usr/local/etc/redis/redis.conf --name myredis redis redis-server /usr/local/etc/redis/redis.conf查看更多
請(qǐng)書寫SQL語句,查詢imooc_user表中每一門課程和該課程下參與的用戶。分析:由題干可知,imooc_class 應(yīng)作為保留表,考慮到使用右連接,因此 imooc_class 是右表;連接條件是外鍵 class_id。語句:整理可得語句如下:SELECT class_name,username FROM imooc_user RIGHT OUTER JOIN imooc_class ON imooc_class.id = imooc_user.class_id;結(jié)果如下:+---------------+----------+| class_name | username |+---------------+----------+| SQL必知必會(huì) | pedro || SQL必知必會(huì) | peter || C語言入門 | faker || JVM花落知多少 | lucy || JAVA高效編程 | <null> |+---------------+----------+提示:SQLite 是不支持右連接的,卻可以通過更換保留表的位置用左連接來模擬右連接。
3.2.1 依賴坐標(biāo)<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version></dependency>3.2.2 編碼實(shí)現(xiàn)public class MyEncoder extends MessageToByteEncoder<BaseBean> { protected void encode( ChannelHandlerContext channelHandlerContext, BaseBean baseBean, ByteBuf byteBuf) throws Exception { //1.把實(shí)體序列化成字節(jié)數(shù)字 byte[] bytes= JSON.toJSONBytes(baseBean); //2.根據(jù)協(xié)議組裝數(shù)據(jù) byteBuf.writeInt(baseBean.getTag());//標(biāo)識(shí)(4個(gè)字節(jié)) byteBuf.writeByte(baseBean.code());//指令(1個(gè)字節(jié)) byteBuf.writeInt(bytes.length);//長(zhǎng)度(4個(gè)字節(jié)) byteBuf.writeBytes(bytes);// }}3.2.3 解碼實(shí)現(xiàn)public class MyDecoder extends ByteToMessageDecoder { protected void decode( ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception { //1.根據(jù)協(xié)議取出數(shù)據(jù) int tag=byteBuf.readInt();//標(biāo)識(shí)符 byte code=byteBuf.readByte();//獲取指令 int len=byteBuf.readInt();//獲取數(shù)據(jù)長(zhǎng)度 byte[] bytes=new byte[len]; byteBuf.readBytes(bytes); //2.根據(jù)code獲取類型 Class<? extends BaseBean> c= MapUtils.getBean(code); //3.反序列化 BaseBean baseBean=JSON.parseObject(bytes,c); list.add(baseBean); }}3.2.4 指令和實(shí)體關(guān)系為什么需要這么一個(gè)工具類呢?指令表示的是業(yè)務(wù)類型,不同的業(yè)務(wù)對(duì)應(yīng)不同的實(shí)體,那么解碼的時(shí)候,怎么知道反序列化成什么樣的實(shí)體呢?思路是獲取到的指令,再根據(jù)指令找到對(duì)應(yīng)的實(shí)體即可。public class MapUtils { //1.自定義指令 private static Byte codeLoginReq=1; private static Byte codeLoginRes=2; private static Byte codeMsgReq=3; private static Byte codeMsgRes=4; private static Byte codeMsgRec=5; //2.自定義一個(gè)Map,專門管理指令和實(shí)體的關(guān)系 private static Map<Byte, Class<? extends BaseBean>> map=new HashMap<Byte,Class<? extends BaseBean>>(); //3.初始化 static { map.put(codeLoginReq, LoginReqBean.class); map.put(codeLoginRes, LoginResBean.class); map.put(codeMsgReq, MsgReqBean.class); map.put(codeMsgRes, MsgResBean.class); map.put(codeMsgRec, MsgRecBean.class); } //4.根據(jù)指令獲取對(duì)應(yīng)的實(shí)體 public static Class<? extends BaseBean> getBean(Byte code){ try{ return map.get(code); }catch (Exception e){ throw new RuntimeException(e.getMessage()); } }}
我們?cè)?D 盤下創(chuàng)建一個(gè) groovy.txt 的文檔,在里面輸入:Gradle 專題之 Groovy 語言。以讀取這個(gè)文件的內(nèi)容為例我們來看下 Groovy 的代碼:class Example { static void main(String[] args) { def filePath = "D:/groovy.txt" def file = new File(filePath) ; file.eachLine { println it } };}----------或是我們也可以像下面這么簡(jiǎn)潔---------class Example { static void main(String[] args) { def filePath = "D:/groovy.txt" def file = new File(filePath) ; println file.text };}通過上面的代碼示例我們可以看到 Groovy 中文件的讀取非常簡(jiǎn)單快捷,比我們?cè)?Java 和 C 語言中方便太多了。只需要文件的路徑地址,通過 new File(filePath) 就可以實(shí)現(xiàn)讀取文件。
collect(Collector c):將流轉(zhuǎn)換為其他形式。接收一個(gè)Collector接口的實(shí)現(xiàn),用于給Stream中元素做匯總的方法。實(shí)例如下:1263運(yùn)行結(jié)果:[1, 20, 8, 9, 10, 12]Collector 接口中的實(shí)現(xiàn)決定了如何對(duì)流執(zhí)行收集的操作(如收集到 List、Set、Map)。java.util.stream.Collectors 類提供了很多靜態(tài)方法,可以方便地創(chuàng)建常用收集器實(shí)例,常用靜態(tài)方法如下:static List<T> toList():把流中元素收集到List;static Set<T> toSet():把流中元素收集到Set;static Collection<T> toCollection():把流中元素收集到創(chuàng)建的集合。
adb shell dumpsys [-t timeout] [--help | -l | --skip services | service [arguments] | -c | -h]要獲取所連接設(shè)備的所有系統(tǒng)服務(wù)的診斷輸出,只需運(yùn)行 adb shell dumpsys。不過,這樣輸出的信息比我們通常想要的信息多得多。要使輸出更加可控,我們可以通過在命令中添加相應(yīng)服務(wù)來指定要檢查的服務(wù)。例如,下面的命令會(huì)提供輸入組件(如觸摸屏或內(nèi)置鍵盤)的系統(tǒng)數(shù)據(jù):adb shell dumpsys input如需查看可與 dumpsys 配合使用的系統(tǒng)服務(wù)的完整列表,請(qǐng)使用以下命令:adb shell dumpsys -l
了解了數(shù)組和對(duì)象的解構(gòu),下面我們看下對(duì)于復(fù)雜數(shù)據(jù)解構(gòu)應(yīng)該如何去解構(gòu)呢?看下面的例子:var data = { a: 1, arr: [ { b: 2, c: 3 } ]}var { a: newA, arr: [ { b: newB } ]} = data;console.log(newA, newB) // 1, 2上面的例子中 data 的數(shù)據(jù)解構(gòu)還算是比較復(fù)雜的,對(duì)于解構(gòu)這種既有對(duì)象又有數(shù)組的數(shù)據(jù)解構(gòu),我們要先聲明一個(gè)和目標(biāo)對(duì)象有著相同的數(shù)據(jù)嵌套,才能去拆解目標(biāo)對(duì)象。這里解構(gòu)的是 data 中的 a 和 b 的值,而且把 a 和 b 重命名為 newA 和 newB。
元組可以作為參數(shù)傳遞給函數(shù),函數(shù)的 Rest 形參可以定義為元組類型:declare function rest(...args: [number, string, boolean]): void等價(jià)于:declare function rest(arg1: number, arg2: string, arg3: boolean): voidTIPS: 在聲明文件(.d.ts)中,關(guān)鍵字 declare 表示聲明作用。聲明文件用于編寫第三方類庫,通過配置 tsconfig.json 文件中的 declaration 為 true,在編譯時(shí)可自行生成。還可以這樣:const list: [number, ...string[]] = [10, 'a', 'b', 'c']const list1: [string, ...number[]] = ['a', 1, 2, 3]代碼解釋: Rest 元素指定了元組類型是無限擴(kuò)展的,可能有零個(gè)或多個(gè)具有數(shù)組元素類型的額外元素。
在 Markdown 文件中,使用 題(可選)") 的形式定義圖片實(shí)例 1:#### 插入一張圖片圖片前的文字。圖片后的文字渲染結(jié)果如下:圖片來源于網(wǎng)絡(luò),版權(quán)歸原作者所有該源碼渲染輸出 html 的內(nèi)容如下:<h4>插入一張圖片</h4><p>圖片前的文字。</p><p><img src="https://c-ssl.duitang.com/uploads/item/201905/03/20190503105835_VfkU3.thumb.1000_0.png" referrerpolicy="no-referrer"></p><p>圖片后的文字。</p>
步驟1:導(dǎo)入 docx 模塊from docx import Document步驟2:創(chuàng)建(讀?。┮粋€(gè)文檔對(duì)象document = Document() # 新建文檔對(duì)象Document("info.docx") #讀取現(xiàn)有的word 建立文檔對(duì)象步驟3:向文檔中寫入內(nèi)容根據(jù) docx 提供的方法,完成 Word文檔所需內(nèi)容的寫入。步驟4:生成 Excel 文件from docx import Documentdocument = Document() # 新建文檔對(duì)象...省略部分代碼document.save('C:/info.docx')# 保存文檔通過 save() 方法進(jìn)行保存,生成 Word 文件,save() 方法可以傳入你想要保存到的文件路徑。到這里就完成了新的 Word 文檔創(chuàng)建和內(nèi)容寫入的操作。
在 Scientific mode 模式,可以將代碼格式化為一組可執(zhí)行代碼片斷,每個(gè)片斷都可以單獨(dú)運(yùn)行。要將代碼拆分為獨(dú)立運(yùn)行的部分,只需在適當(dāng)?shù)奈恢锰砑? #%% 行。在 main.py 中加入以下代碼:主要功能是生成一個(gè)散點(diǎn)圖。import numpy as npN = 50x = np.random.rand(N)y = np.random.rand(N)colors = np.random.rand(N)area = np.pi * (15 * np.random.rand(N))**2 # 0 to 15 point radiiplt.scatter(x, y, s=area, c=colors, alpha=0.5)plt.show()加了上面代碼后,main.py 除了生成上面的折線圖,還會(huì)再生成散點(diǎn)圖。為了使這兩張圖的生成分段執(zhí)行,如下圖所示,加兩行 # %% 行,然后分別點(diǎn)擊邊框中綠色箭頭執(zhí)行不同代碼。
通過前面同類開發(fā)工具的對(duì)比,我們?yōu)槭裁锤平槭褂?Android Studio 呢?因?yàn)樗粌H集成了強(qiáng)大的代碼編輯器、開發(fā)者工具,還提供更多可提高 Android 應(yīng)用開發(fā)效率的功能,例如:基于 Gradle 的靈活編譯系統(tǒng);快速且功能豐富的模擬器;統(tǒng)一的環(huán)境(供你開發(fā)適用于所有 Android 設(shè)備的應(yīng)用);代碼模板和 GitHub 集成,可協(xié)助你打造常見的應(yīng)用功能及導(dǎo)入示例代碼;大量的測(cè)試工具和框架;Lint 工具,能夠找出性能、易用性和版本兼容性等方面的問題;C++ 和 NDK 支持。
#!/bin/bash#mail:xuel@anchnet.com#data:2020/4/10#AutoInstall ELK scripts#Software:elasticsearch-5.4.1/logstash-5.4.1/filebeat-5.4.1/kibana-5.4.1clearecho "##########################################"echo "# Auto Install ELK. ##"echo "# Press Ctrl + C to cancel ##"echo "# Any key to continue ##"echo "##########################################"# 讀入用戶選擇read -p # 定義環(huán)境及目錄變量software_dir="/usr/local/software"elasticsearch_url="https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.4.1.tar.gz"kibana_url="https://artifacts.elastic.co/downloads/kibana/kibana-5.4.1-linux-x86_64.tar.gz"logstash_url="https://artifacts.elastic.co/downloads/logstash/logstash-5.4.1.tar.gz"filebeat_url="https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.4.1-linux-x86_64.tar.gz"sys_version=`cat /etc/redhat-release |awk '{print $4}'|cut -d. -f1`IP=`ip addr|grep "inet "|grep -v 127.0.0.1|awk '{print $2}'|cut -d/ -f1`jvm_conf="/usr/local/elasticsearch/config/jvm.options"sys_mem=`free -m|grep Mem:|awk '{print $2}'|awk '{sum+=$1} END {print sum/1024}'|cut -d. -f1`#下載軟件函數(shù),wget_fun() {if [ ! -d ${software_dir} ];then mkdir -p ${software_dir} && cd ${software_dir}else cd ${software_dir}fifor software in $elasticsearch_url $kibana_url $logstash_url $filebeat_urldo wget -c $softwaredoneclear}# 初始化系統(tǒng),安裝java環(huán)境,設(shè)置主機(jī)名稱,禁用防火墻init_sys() {[ -f /etc/init.d/functions ] && . /etc/init.d/functions[ "${sys_version}" != "7" ] && echo "Error:This Scripts Support Centos7.xx" && exit 1[ $(id -u) != "0" ] && echo "Error: You must be root to run this script" && exit 1sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/configsetenforce 0yum install -y java-1.8.0-openjdk wget net-toolshostnamectl set-hostname elk-server systemctl stop firewalld# 修改文件/進(jìn)程打開數(shù)cat >>/etc/security/limits.conf<<EOF* soft nofile 65536 * hard nofile 65536 * soft nproc 65536 * hard nproc 65536EOF}# 安裝elasticsearchinstall_elasticsearch() {cd $software_dirtar zxf elasticsearch-5.4.1.tar.gzmv elasticsearch-5.4.1 /usr/local/elasticsearchmkdir -p /usr/local/elasticsearch/data /usr/local/elasticsearch/logs# 增加用戶useradd elasticsearchchown -R elasticsearch:elasticsearch /usr/local/elasticsearchecho "vm.max_map_count = 655360" >>/etc/sysctl.conf && sysctl -p# 修改配置文件if [ ${sys_mem} -eq 0 ];then sed -i "s#`grep "^-Xmx" ${jvm_conf}`#"-Xmx512m"#g" ${jvm_conf} sed -i "s#`grep "^-Xms" ${jvm_conf}`#"-Xms512m"#g" ${jvm_conf}else sed -i "s#`grep "^-Xmx" ${jvm_conf}`#"-Xmx${sys_mem}g"#g" ${jvm_conf} sed -i "s#`grep "^-Xms" ${jvm_conf}`#"-Xms${sys_mem}g"#g" ${jvm_conf}ficat >>/usr/local/elasticsearch/config/elasticsearch.yml<<EOFcluster.name: my-applicationnode.name: elk-serverpath.data: /usr/local/elasticsearch/datapath.logs: /usr/local/elasticsearch/logsnetwork.host: 127.0.0.1http.port: 9200discovery.zen.ping.unicast.hosts: ["elk-server"]EOF# 啟動(dòng)es服務(wù)su - elasticsearch -c "nohup /usr/local/elasticsearch/bin/elasticsearch &"}#安裝 logstashinstall_logstash() {cd $software_dirtar -zxf logstash-5.4.1.tar.gzmv logstash-5.4.1 /usr/local/logstash# 增加配置文件cat>/usr/local/logstash/config/01-syslog.conf<<EOFinput { beats { port => "5044" } }output { elasticsearch { hosts => "127.0.0.1:9200" } stdout { codec => rubydebug }}EOFnohup /usr/local/logstash/bin/logstash -f /usr/local/logstash/config/01-syslog.conf & >/dev/null}#安裝 filebeatinstall_filebeat() {cd $software_dirtar -zxf filebeat-5.4.1-linux-x86_64.tar.gzmv filebeat-5.4.1-linux-x86_64 /usr/local/filebeatcat >/usr/local/filebeat/filebeat.yml<<EOFfilebeat.prospectors:- input_type: log paths: - /var/log/*.logoutput.logstash: hosts: ["127.0.0.1:5044"]EOFcd /usr/local/filebeat/nohup /usr/local/filebeat/filebeat & >/dev/null}#安裝 kibanainstall_kibana() {cd $software_dirtar -zxf kibana-5.4.1-linux-x86_64.tar.gzmv kibana-5.4.1-linux-x86_64 /usr/local/kibana# 增加配置文件cat >> /usr/local/kibana/config/kibana.yml <<EOFserver.port: 5601server.host: "0.0.0.0"elasticsearch.url: "http://127.0.0.1:9200"EOFnohup /usr/local/kibana/bin/kibana & >/dev/null}# 檢測(cè)服務(wù)check() {port=$1program=$2check_port=`netstat -lntup|grep ${port}|wc -l`check_program=`ps -ef|grep ${program}|grep -v grep|wc -l`if [ $check_port -gt 0 ] && [ $check_program -gt 0 ];then action "${program} run is ok!" /bin/trueelse action "${program} run is error!" /bin/falsefi}# 主函數(shù)統(tǒng)一調(diào)用main() {init_syswget_funinstall_elasticsearchinstall_filebeatinstall_logstashinstall_kibanaecho -e "\033[32m Checking Elasticsearch...\033[0m"sleep 20check :9200 "elasticsearch"echo -e "\033[32m Checking Logstash...\033[0m"sleep 2check ":9600" "logstash"echo -e "\033[32m Checking Kibana...\033[0m"sleep 2check ":5601" "kibana"action "ELK install is success!" /bin/trueecho "url:http://$IP:5601"}# 執(zhí)行主函數(shù)main
在上一節(jié)中我們?cè)敿?xì)講解了正則表達(dá)式,它就可以用在 grep 命令的 PATTERN 字段中,使得 grep 更加強(qiáng)大,本章節(jié)我們著重來講解 grep 命令的 OPTION。不加參數(shù),匹配 /etc/passwd 文件中的 root 行,例如:[root@master grep]# grep "root" /etc/passwdroot:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologin-A:顯示模式匹配后的幾行查找 /etc/passwd 文件中以 root 開頭的后兩行,例如:[root@master grep]# grep -A2 "^root" /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin-B:顯示模式匹配行的前幾行查找 /etc/passwd 文件中以 bin 開頭的前一行,例如:[root@master grep]# grep -B1 "^bin" /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin-C:顯示模式匹配的前后各幾行查找 /etc/passwd 文件中以 ftp 開頭的前后各 2 行,例如:[root@master grep]# grep -C2 "^ftp" /etc/passwd operator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologinnobody:x:99:99:Nobody:/:/sbin/nologinsystemd-network:x:192:192:systemd Network Management:/:/sbin/nologin-i:忽略大小寫匹配匹配 /etc/passwd 包含 "Nobody" 的行,例如:[root@master grep]# grep -i "Nobody" /etc/passwdnobody:x:99:99:Nobody:/:/sbin/nologinnfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin-o :只顯示匹配到的字符串匹配出 /etc/passwd 文件中字符串長(zhǎng)度最少 10 位的字符 ,例如:[root@master grep]# grep -o "[[:alnum:]]\{10,\}" /etc/passwdManagementKubernetes-n:輸出匹配到的行的行號(hào)匹配出 /etc/passwd 文件中包含 root 的字符串的行,例如:[root@master grep]# grep -n "root" /etc/passwd1:root:x:0:0:root:/root:/bin/bash10:operator:x:11:0:operator:/root:/sbin/nologin-v:反向選擇,即顯示除過 匹配’搜尋字符串’ 內(nèi)容的那一行匹配出 /etc/passwd 中不包含 bash 的行,例如:[root@master grep]# grep -v "nologin" /etc/passwd root:x:0:0:root:/root:/bin/bashsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/halt-c : 計(jì)算找到 ‘搜尋字符串’ 的次數(shù)計(jì)算 /etc/passwd 文件中 root 字符串出現(xiàn)的次數(shù),例如:[root@master grep]# grep -c "root" /etc/passwd2-E: 開啟正則表達(dá)式,相當(dāng)于使用命令 egrep查找 /etc/passwd 文件中包含三位數(shù)字的行,例如:[root@master grep]# grep -E "[[:digit:]]{3}" /etc/passwdgames:x:12:100:games:/usr/games:/sbin/nologinsystemd-network:x:192:192:systemd Network Management:/:/sbin/nologinpolkitd:x:999:997:User for polkitd:/:/sbin/nologinceph:x:167:167:Ceph daemons:/var/lib/ceph:/sbin/nologinkube:x:998:996:Kubernetes user:/home/kube:/sbin/nologinetcd:x:997:993:Etcd user:/var/lib/etcd:/bin/nologingluster:x:996:992:GlusterFS daemons:/run/gluster:/sbin/nologinnfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologinchrony:x:995:991::/var/lib/chrony:/sbin/nologinredis:x:994:990:Redis Database Server:/var/lib/redis:/sbin/nologin
C 語言是強(qiáng)類型語言,也就是說不同類型的數(shù)據(jù)之間是不能進(jìn)行運(yùn)算的。必須保持一致的類型才能進(jìn)行運(yùn)算。也就是說在這個(gè)不同數(shù)據(jù)類型的計(jì)算過程中,C 語言自動(dòng)進(jìn)行了一次類型轉(zhuǎn)換,使得兩個(gè)變量的數(shù)據(jù)類型一致,才能進(jìn)行相關(guān)的計(jì)算。這種自動(dòng)的轉(zhuǎn)換,也稱之為隱式類型轉(zhuǎn)換。從前面提及的例子還可以看出,我們定義的數(shù)據(jù)類型,在不同的類型的數(shù)據(jù)運(yùn)算結(jié)束后,并沒有發(fā)生改變,也就是數(shù)據(jù)類型保持著我們最開始定義時(shí)候的類型。這時(shí)會(huì)發(fā)生丟棄精度的事情,也就是上面例子中小數(shù)點(diǎn)后面的數(shù)值就會(huì)消失。那么這種隱式的轉(zhuǎn)換有什么規(guī)律可循嗎?下面的表格就展示了類型轉(zhuǎn)換的規(guī)律,當(dāng)在計(jì)算過程中,數(shù)值類型不一致的時(shí)候,就會(huì)發(fā)生自動(dòng)的類型轉(zhuǎn)換,轉(zhuǎn)換的類型是將表格中處于下方的較低優(yōu)先級(jí)的數(shù)據(jù)類型,向表格上方的較高優(yōu)先級(jí)的數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換。級(jí)別數(shù)據(jù)類型1long double2double3float4unsigned long long5long long6unsigned long7long8unsigned int9int10char short int根據(jù)這個(gè)表格我們就可以看出之前的轉(zhuǎn)換中,int 與 float 類型進(jìn)行計(jì)算,編譯器會(huì)自動(dòng)將 int 類型轉(zhuǎn)換為 float 類型進(jìn)行計(jì)算。從而使得運(yùn)算在相同的數(shù)據(jù)類型間進(jìn)行。
例如,在 C 語言中,函數(shù) open 用于打開一個(gè)文件,它的聲明如下:int open(char *path, int mode);參數(shù) path 指定要打開的文件;參數(shù) mode 指定打開文件的方式:只讀、讀寫;函數(shù)返回一個(gè)整數(shù),該整數(shù)作為文件的標(biāo)識(shí)符;如果打開文件成功,則返回一個(gè)非負(fù)的整數(shù);如果打開文件失敗,則返回 -1。因此,通過檢查函數(shù) open 的返回值,即可以判斷 open 是否成功,示例如下:int file = open("test.txt", O_RDONLY);if (file < 0) puts("open file failed"); ...在第 1 行,函數(shù) open 打開文件 test.txt在第 2 行,如果函數(shù) open 的返回值小于 0,則表示打開文件失敗
對(duì)于 printf 函數(shù), C 語言中提供了非常多的顯示格式的選項(xiàng),以方便大家用來與用戶進(jìn)行交互使用。這里里面的必選項(xiàng)是說明符,也就是說明你要是顯示的數(shù)據(jù)的類型。而諸如標(biāo)志位,顯示占位符,顯示數(shù)字的精度,數(shù)字的長(zhǎng)度等參數(shù)都是可選參數(shù),根據(jù)你要顯示的需求和顯示的屏幕的情況來自己選擇。還有一點(diǎn)請(qǐng)記住,在使用這個(gè)函數(shù)的時(shí)候,不要忘記引用這個(gè)函數(shù)所在的程序庫,也就是 #include <stdio.h>,要添加在程序的起始位置上。
根據(jù)用戶定義的條件篩選集合中的數(shù)據(jù),并且由此產(chǎn)生一個(gè)新的集合。這個(gè)新的集合是原集合的子集。源碼定義public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> { return filterTo(ArrayList<T>(), predicate)}public inline fun <T, C : MutableCollection<in T>> Iterable<T>.filterTo(destination: C, predicate: (T) -> Boolean): C { for (element in this) if (predicate(element)) destination.add(element) return destination}源碼解析首先,從整體上可以看出 filter 是一個(gè) Iterable<T> 的擴(kuò)展函數(shù)并且是一個(gè)內(nèi)聯(lián)函數(shù),該函數(shù)接收一個(gè)以接收T類型返回一個(gè) Boolean 類型的 lambda 表達(dá)式 predicate 作為參數(shù),所以它還是一個(gè)高階函數(shù),返回一個(gè) List<T> 集合然后,看具體的內(nèi)部實(shí)現(xiàn)是調(diào)用了另一個(gè)函數(shù) filterTo,并傳入新創(chuàng)建的 ArrayList<T>() 可變集合對(duì)象,然后繼續(xù)把 lambda 表達(dá)式作為參數(shù)傳遞到 filterTo 函數(shù)中,在 filterTo 函數(shù)去實(shí)現(xiàn)真正的過濾操作。傳入的 lambda 表達(dá)式 predicate 實(shí)際上就是外部調(diào)用者傳入的過濾條件,可以看到在 filterTo 內(nèi)部是利用一個(gè) for 循環(huán)進(jìn)行篩選判斷符合 lambda 表達(dá)式條件的,就添加到 filter 調(diào)用 filterTo 函數(shù)傳遞的參數(shù) ArrayList<T> 新集合對(duì)象中,最后就是返回這個(gè) ArrayList<T> 新集合對(duì)象。所以 filter 最后篩選出來的還是一個(gè)集合。原理圖解使用場(chǎng)景filter的操作符使用場(chǎng)景:從一個(gè)集合篩選出符合條件的元素,并以一個(gè)新集合返回。fun main(args: Array<String>) { val numberList = listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) val newNumberList = numberList.filter { number -> number % 2 == 0//篩選出偶數(shù) } newNumberList.forEach { print("$it ")}}filterTo 的操作符使用場(chǎng)景: 從多個(gè)集合篩選出符合條件的元素,并最終用一個(gè)集合進(jìn)行收集從每個(gè)集合篩選出的元素。fun main(args: Array<String>) { val numberList1 = listOf(23, 65, 14, 57, 99, 123, 26, 15, 88, 37, 56) val numberList2 = listOf(13, 55, 24, 67, 93, 137, 216, 115, 828, 317, 16) val numberList3 = listOf(20, 45, 19, 7, 9, 3, 26, 5, 38, 75, 46) //需要注意一點(diǎn)的是,我們從源碼看到filterTo第一個(gè)參數(shù)destination是一個(gè)可變集合類型,所以這里使用的mutableListOf初始化 val newNumberList = mutableListOf<Int>().apply { numberList1.filterTo(this) { it % 2 == 0 } numberList2.filterTo(this) { it % 2 == 0 } numberList3.filterTo(this) { it % 2 == 0 } } print("從三個(gè)集合篩選出的偶數(shù)集合: ") newNumberList.forEach { print("$it ") }}
首先我們?cè)?CentOS7.8 的系統(tǒng)上源碼編譯安裝 redis-5.0 的最新版。按照下列步驟進(jìn)行:安裝 gcc 等編譯工具,下載 redis 5 的最新源碼并解壓:[root@server2 shen]# wget http://download.redis.io/releases/redis-5.0.9.tar.gz--2020-06-27 13:10:23-- http://download.redis.io/releases/redis-5.0.9.tar.gzResolving download.redis.io (download.redis.io)... 109.74.203.151Connecting to download.redis.io (download.redis.io)|109.74.203.151|:80... connected.HTTP request sent, awaiting response... 200 OKLength: 1986574 (1.9M) [application/x-gzip]Saving to: ‘redis-5.0.9.tar.gz’100%[=========================================================================================================================================>] 1,986,574 12.9KB/s in 2m 11s 2020-06-27 13:12:35 (14.8 KB/s) - ‘redis-5.0.9.tar.gz’ saved [1986574/1986574][root@server2 shen]# tar xzf redis-5.0.9.tar.gz進(jìn)入 redis 源碼目錄,直接安裝:[root@server2 shen]# cd redis-5.0.9[root@server2 redis-5.0.9]# make MALLOC=libc PREFIX=/usr/local/redis install添加 redis 命令路徑:[root@server2 redis-5.0.9]# cat /etc/profile...# 添加下面兩行內(nèi)容REDIS_HOME=/usr/local/redisexport PATH=$REDIS_HOME/bin:$PATH[root@server2 redis-5.0.9]# source /etc/profile[root@server2 redis-5.0.9]# which redis-cli/usr/local/redis/bin/redis-cli添加并修改 redis.conf 配置文件:[root@server2 redis-5.0.9]# mkdir /etc/redis[root@server2 redis-5.0.9]# cp redis.conf /etc/redis[root@server2 redis-5.0.9]# cat /etc/redis# ...# 修改第一處,改為后臺(tái)守護(hù)進(jìn)程方式啟動(dòng)daemonize yes# ...# 修改端口,比如改為6777port 6777# ...# 需要密碼# requirepass foobaredrequirepass spyinx# ...# 允許通過公網(wǎng)訪問該redis# bind 127.0.0.1bind 0.0.0.0加入 systemd 服務(wù),統(tǒng)一管理:[root@server2 redis-5.0.9]# cat /etc/systemd/system/redis.service[Unit]Description=RedisAfter=network.target [Service]Type=forkingExecStart=/usr/local/redis/bin/redis-server /etc/redis/redis.confExecReload=/bin/kill -s HUP $MAINPIDExecStop=/usr/local/redis/bin/redis-cli -p 6777 shutdownPrivateTmp=true [Install]WantedBy=multi-user.target[root@server2 redis-5.0.9]# systemctl start redis[root@server2 redis-5.0.9]# systemctl status redis● redis.service - Redis Loaded: loaded (/etc/systemd/system/redis.service; disabled; vendor preset: disabled) Active: active (running) since Sat 2020-06-27 14:08:44 CST; 3s ago Process: 7080 ExecStart=/usr/local/redis/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS) Main PID: 7081 (redis-server) CGroup: /system.slice/redis.service └─7081 /usr/local/redis/bin/redis-server 0.0.0.0:6777Jun 27 14:08:44 server2 systemd[1]: Starting Redis...Jun 27 14:08:44 server2 redis-server[7080]: 7080:C 27 Jun 2020 14:08:44.938 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0OoJun 27 14:08:44 server2 redis-server[7080]: 7080:C 27 Jun 2020 14:08:44.938 # Redis version=5.0.9, bits=64, commit=00000000, ...startedJun 27 14:08:44 server2 redis-server[7080]: 7080:C 27 Jun 2020 14:08:44.938 # Configuration loadedJun 27 14:08:44 server2 systemd[1]: Started Redis.Hint: Some lines were ellipsized, use -l to show in full.# 設(shè)置開機(jī)啟動(dòng)[root@server2 redis-5.0.9]# systemctl enable redisCreated symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /etc/systemd/system/redis.service.最后測(cè)試下 redis 服務(wù)是否能正常工作:[root@server2 redis-5.0.9]# redis-cli -p 6777127.0.0.1:6777> auth spyinxOK127.0.0.1:6777> ping "hello, world""hello, world"127.0.0.1:6777> set hello worldOK127.0.0.1:6777> get hello"world"127.0.0.1:6777> 完成 redis 服務(wù)搭建后我們就可以開始 redis 服務(wù)的使用了。
[root@master Shell_args]# cat ping.sh #!/bin/bash# Description: net check scripts# Auth: kaliarch# Email: kaliarch@163.com# function: net check# Date: 2020-03-08 14:00# Version: 1.0# 日志目錄LOG_DIR="/tmp/netlog/"# 如果日志目錄不存在則創(chuàng)建[ ! -d ${LOG_DIR} ] && mkdir -p ${LOG_DIR}# 定義成功與失敗日志文件SUCCESS_LOGFILE="success.log"FAIL_LOGFILE="fail.log"# 網(wǎng)絡(luò)前綴NET_PREFIX=$1# 檢測(cè)包數(shù)量PACKAGE_NUM=$2for num in `seq 1 255`;do # 進(jìn)行ping檢測(cè) echo "check ${NET_PREFIX}${num}..." ping -c ${PACKAGE_NUM} ${NET_PREFIX}${num} &>/dev/null # 如果返回正常則記錄可以ping通的ip到successlog中 [ $? -eq 0 ] && echo ${NET_PREFIX}${num} >> ${LOG_DIR}${SUCCESS_LOGFILE} || echo ${NET_PREFIX}${num} >> ${LOG_DIR}${FAIL_LOGFILE}done# 測(cè)試[root@master Shell_args]# bash ping.sh 172.16.60. 2check 172.16.60.1...check 172.16.60.2...check 172.16.60.3...check 172.16.60.4...check 172.16.60.5...check 172.16.60.6...當(dāng)腳本運(yùn)行完成后,可以在 /tmp/netlog/ 目錄下查看成功與失敗的 IP 信息。
Orace 優(yōu)點(diǎn):開放性:Oracle 能在大部分主流平臺(tái)上運(yùn)行(包括 Windows)完全支持所有工業(yè)標(biāo)準(zhǔn)采用完全開放策略使客戶選擇適合解決方案對(duì)開發(fā)商全力支持;安全性:獲得最高認(rèn)證級(jí)別的 ISO 標(biāo)準(zhǔn)認(rèn)證;Oracle 性能高:保持開放平臺(tái)下 TPC-D 和 TPC-C 世界記錄;客戶端支持及應(yīng)用模式:Oracle 多層次網(wǎng)絡(luò)計(jì)算支持多種工業(yè)標(biāo)準(zhǔn)用 ODBC、JDBC、OCI 等網(wǎng)絡(luò)客戶連接;使用風(fēng)險(xiǎn):Oracle 長(zhǎng)時(shí)間開發(fā)經(jīng)驗(yàn)完全向下兼容得廣泛應(yīng)用地風(fēng)險(xiǎn)低。Oracle 缺點(diǎn):對(duì)硬件的要求很高;價(jià)格比較昂貴;管理維護(hù)麻煩一些;操作比較復(fù)雜,需要技術(shù)含量較高。
列表是一個(gè)有序的序列,列表中所有的元素放在 [] 中間,并用逗號(hào)分開,例如:[1, 2, 3],一個(gè)包含 3 個(gè)整數(shù)的列表[‘a(chǎn)’, ‘b’, ‘c’],一個(gè)包含 3 個(gè)字符串的列表列表中的元素是順序排列的,可以通過索引訪問列表的元素,例如:>>> list = [1, 2, 3]>>> list[0]1>>> list[1]2>>> list[2]3在第 1 行,創(chuàng)建了一個(gè)列表。在第 2 行,通過 list[0],訪問列表的第 0 個(gè)元素,列表的下標(biāo)從 0 開始。在第 4 行,通過 list[1],訪問列表的第 1 個(gè)元素。在第 6 行,通過 list[2],訪問列表的第 2 個(gè)元素。
共享內(nèi)容(Shared Memory)是指兩個(gè)進(jìn)程之間可以讀和寫相同的操作系統(tǒng)內(nèi)存空間,每個(gè)進(jìn)程的操作對(duì)另外的進(jìn)程都是可見的,這種通信方式非常類似線程之間的通信。C 語言實(shí)現(xiàn)的共享內(nèi)存步驟:(1)shmget() :創(chuàng)建一段共享內(nèi)存,或者引用已有的共享內(nèi)存的空間;(2)shmat() :連接已有的共享內(nèi)存的地址;(3)shmctl():建立連接之后,對(duì)共享內(nèi)存進(jìn)行讀寫操作;(4)shmdt():所有操作都執(zhí)行完成之后,斷開連接。共享內(nèi)存的操作模型