第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
2.9 繪制陰影

使用 shadow 系列函數(shù)可以繪制陰影,shadowBlur 表示陰影效果如何延伸 double 值。瀏覽器在陰影運用高斯模糊時,將會用到該值,它與像素無關,只會被用到高斯模糊方程之中,其默認值為 0。shadowColor 定義顏色值,默認值是 rgba(0,0,0,0)。shadowOffsetX 定義陰影在 X 軸方向的偏移量,以像素為單位,默認值為 0,shadowOffsetY 定義陰影在 Y 軸方向的偏移量,以像素為單位,默認值是 0。1248

4.2 定義方法

下面定義一下路由里面指向的 getStudent() 方法,方法如下: // 獲取單個學生信息 public function getStudent() { $student_id = (int)$this->request->param('student_id'); if (!$student_id) { return json('參數(shù)不合法', 404); } //查詢單條數(shù)據(jù) $student = StudentModel::where('id', $student_id)->where('status', 1)->find(); if (empty($student)) { return json('學生信息不存在', 404); } //把時間戳轉化為可讀的日期格式 $student->created_at = date("Y-m-d H:i", $student->created_at); return json($student); }Tips: 其中 where('id',$student_id) 表示使用 id=$student_id 查詢,find() 方法表示查詢單條。

3.3 map 函數(shù)

使用 Python 內(nèi)置的 map 函數(shù)時,通常會用到 lambda 表達式。map 函數(shù)的原型如下:map(function, list)map 函數(shù)接收兩個參數(shù) function 和 list,function 是一個函數(shù),list 是一個可以被遍歷的序列,map 將傳入的函數(shù)依次作用到序列的每個元素,并把結果作為新的序列返回。map 函數(shù)的工作原理圖如下:map 函數(shù)原理圖 圖的左邊是一個序列 list,包含 3 個元素 1、2、3 調(diào)用函數(shù) map 時,需要提供一個函數(shù) y = f (x),函數(shù) f 將輸入 x 映射為輸出 y 將函數(shù) f 對圖的左邊的序列中的每個元素依次作用,得到圖的右邊的序列圖的右邊是一個序列 list,包含 3 個元素 f (1)、f (2)、f (3)list = [1, 2, 3]list2 = map(lambda x: x * 2, list)for item in list2: print(item)list10 = map(lambda x: x + 10, list)for item in list10: print(item)在第 1 行,定義原始序列 list 在第 3 行,定義 lambda 函數(shù),作用于 list 中的每個元素,將每個元素乘以 2,生成一個新序列 list2 在第 4 行,打印輸出新序列 list2 在第 7 行,定義 lambda 函數(shù),作用于 list 中的每個元素,將每個元素加上 10,生成一個新序列 list10 在第 8 行,打印輸出新序列 list10程序輸出結果如下:246111213

4. date

在我們編寫 Shell 的時候經(jīng)常遇到需要記錄日志的情況,在記錄日志的時候需要打上時間戳,以便后期查看那個時間節(jié)點運行執(zhí)行的操作,此時就需要用到 date 命令簡介:date 可以用來顯示或設定系統(tǒng)的日期與時間。選項:-d<字符串>:顯示字符串所指的日期與時間。字符串前后必須加上雙引號; -s<字符串>:根據(jù)字符串來設置日期與時間。字符串前后必須加上雙引號; -u:顯示GMT; 時間格式:%Y -- 年份%m -- 月份%d -- 當月第幾天%t -- Tab 跳格%H -- 小時,24 小時格式 (0~23)%I -- 小時,12 小時格式 (0~12)%M -- 分鐘 (00~59)%S -- 秒 (00~59)%j -- 今年中的第幾天%Z -- 以字符串形式輸出當前時區(qū)%z -- 以數(shù)字形式輸出當前時區(qū)%F -- 文件時間格式 same as % Y-% m-% d%T -- 24 小時制時間表示 (hh:mm:ss)實例計算一個命令執(zhí)行所需要的耗時#!/bin/bash start=$(date +%s) echo "$(date +%F" "%T) 開始執(zhí)行命令"sleep 5echo "$(date +%F" "%T) 執(zhí)行命令完成"end=$(date +%s) difference=$(( end - start )) echo "執(zhí)行命令總耗時:$difference seconds."[root@master ~]# bash time.sh 2020-04-19 10:19:58 開始執(zhí)行命令2020-04-19 10:20:03 執(zhí)行命令完成執(zhí)行命令總耗時:5 seconds.

5.2 安裝Docker 與 K8s

使用 ssh 命令登錄 master-1 虛擬機終端。ssh root@192.168.1.12 輸入密碼后登錄:接下來我們來安裝 Docker 、Kubernetes 運行環(huán)境。Tips:可以將這些命令保存到install.sh中,然后執(zhí)行 sh ./install.sh安裝。操作步驟如下# 將CentOS8 的軟件源更換成國內(nèi)的阿里源rm -fr /etc/yum.repos.d/*dnf config-manager --add-repo https://mirrors.aliyun.com/repo/Centos-8.repo# 添加 docker軟件源dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 添加 Kubernetes 軟件源cat <<EOF > /etc/yum.repos.d/Kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/enabled=1gpgcheck=0repo_gpgcheck=0gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF# 更新軟件dnf update# 安裝Docker相關依賴dnf install -y https://download.docker.com/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.13-3.2.el7.x86_64.rpm# 獲取阿里云k8s鏡像源對應的版本 version=`curl -s https://github.com/AliyunContainerService/k8s-for-docker-desktop/blob/master/images.properties|grep kube-apiserver:v|awk -F kube-apiserver:v '{print $2}'|awk -F '<' '{print $1}'`echo $version > .k8s.version# 安裝 Docker 和 k8s 工具dnf install -y docker-ce kubeadm-$version kubectl-$version kubelet-$version tc# 關閉 Selinuxsetenforce 0sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config# 關閉并禁用firewalldsystemctl stop firewalldsystemctl disable firewalld# 設定iptables規(guī)則iptables -P INPUT ACCEPTiptables -F# 設定允許ipv4路由轉發(fā)echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.confsysctl -p# 設定 Docker cgroup 驅(qū)動模式為 systemdmkdir /etc/dockercat <<EOF > /etc/docker/daemon.json{ "exec-opts": ["native.cgroupdriver=systemd"]}EOF# 設定docker kubelet開機自啟systemctl enable dockersystemctl enable kubelet執(zhí)行docker --version與kubeadm version確認安裝完成。

1. CentOS 安裝 Docker

Tips:CentOS8 的推薦的新包管理工具是 dnf,所以我們使用 dnf 來安裝 Docker。 CentOS7 的版本只需要將 dnf 替換成 yum 即可。1. 添加軟件源:dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo2.執(zhí)行下面這條命令更新軟件包索引:dnf update3. 安裝需要的依賴:目前 Centos8 軟件源中的 containerd.io 版本偏低,我們需要手動安裝一個新版本,這樣才能順利安裝 docker-ce 19.03,否則只能安裝老版本的 docker-ce。Centos7 用戶可以跳過此步。dnf install -y https://download.docker.com/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.13-3.2.el7.x86_64.rpm4. 安裝 Docker-ce:dnf install -y docker-ce5.配置網(wǎng)絡與防火墻systemctl stop firewalldiptables -P INPUT ACCEPTiptables -Fecho "net.ipv4.ip_forward = 1" | tee -a /etc/sysctl.confsysctl -psystemctl start firewalldfirewall-cmd --add-masquerade --permanentfirewall-cmd --reload6. 將 Docker 設定為開機啟用:systemctl enable docker7. 啟動 Docker 服務:systemctl start docker8. 使用 查看 docker 版本:Tips:如果使用的是非root用戶,需要先將當前用戶加入到Docker用戶組并重啟Docker服務sudo usermod -aG docker `whoami`newgrp dockersystemctl restart docker執(zhí)行docker version查看安裝版本信息Client: Docker Engine - Community Version: 19.03.12 API version: 1.40 Go version: go1.13.10 Git commit: 48a66213fe Built: Mon Jun 22 15:46:54 2020 OS/Arch: linux/amd64 Experimental: falseServer: Docker Engine - Community Engine: Version: 19.03.12 API version: 1.40 (minimum version 1.12) Go version: go1.13.10 Git commit: 48a66213fe Built: Mon Jun 22 15:45:28 2020 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.2.13 GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429 runc: Version: 1.0.0-rc10 GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd docker-init: Version: 0.18.0 GitCommit: fec3683如果可以成功輸出上面的版本號,說明我們的 Docker 已經(jīng)安裝成功了!

2. 依賴庫提前安裝

Nginx 是完全使用 C 語言開發(fā)的,所以必須要有 C 編譯環(huán)境,往往 CentOS 7.6 的環(huán)境會預裝 gcc 編譯器,所以不用額外安裝,如果沒有使用 yum 直接安裝即可。另外,我們使用 Nginx 的壓縮功能、正則表達式功能等,需要安裝一些額外的依賴庫,這是必須要做的,不然在編譯階段就會報錯。如下 3 個是比較 Nginx 中比較常用模塊所依賴的庫,請在執(zhí)行 Nginx 源碼編譯時提前安裝好。$ 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 軟件中心,點擊一鍵安裝那樣,直接使用默認的配置(通常會將相關文件安裝到 C 盤目錄)。但是這樣往往不是我們需要的。特別是在 Nginx 中,可以指定安裝某些或者不安裝某些模塊,默認安裝的模塊只適合簡單的場景,往往在稍微復雜的情況下,就需要額外添加其他模塊,或者第三方以及自定義的模塊。這高可擴展性正是 Nginx 的一大亮點。想要查看 configure 的可選參數(shù),使用 --help 選項即可:$ ./configure --help在所有可選參數(shù)中,最常用的有兩個:–prefix=PATH:配置 Nginx 安裝部署的根目錄。類似于在 Windows 下安裝軟件,我們指定安裝目錄;–with-xxx_module:–without-xxx_module 其中 xxx 表示 Nginx 一個模塊的名稱,例如:with-http_ssl_module -> 支持 SSL/TLS, 即 HTTPSwith-http_v2_module -> 支持 HTTP/2without-http_fastcgi_module -> 不使用 fastcgi為了后續(xù)測試功能完善,這里我們編譯時候,盡可能多的引入一些模塊:$ ./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 的編譯是比較順利的,偶爾報錯是大部分因為需要增加的模塊依賴的一些庫沒有事先安裝好。對此,我們可以根據(jù)報錯信息進行修正問題,保證編譯順利進行。在上一步驟成功后,可以看到 Nginx 我們生成的 Nginx 編譯后的根目錄了。簡單說明根目錄下的內(nèi)容:

4. 另一個分而治之的應用介紹

另一個分治算法的典型應用是大整數(shù)相乘問題。對于兩個以字符串形式表示的長整數(shù),計算其相乘結果。關于分治法比較核心的一個問題就是,找到如何將子問題的解合并成父問題的解。我們簡單描述一下這個基于分治思想的大數(shù)乘法算法,又叫 Karatsuba 算法。假設 x 和 y 是兩個要做乘法的十進制大數(shù),并且位數(shù)分別為 m 和 n。若將 x 和 y 分別均分成兩部分,則 x 和 y 可以表示如下:x=a?10m2+bx = a*10^{\frac{m}{2}} + bx=a?102m?+by=c?10n2+dy = c*10^{\frac{n}{2}} + dy=c?102n?+d此時有:x?y=(a?10m2+b)(c?10n2+d)=ac?10m+n2+bc?10n2+ad?10m2+bdx*y=(a*10^{\frac{m}{2}} + b)(c*10^{\frac{n}{2}} + d)=ac*10^{\frac{m+n}{2}}+bc*10^{\frac{n}{2}}+ad*10^{\frac{m}{2}}+bdx?y=(a?102m?+b)(c?102n?+d)=ac?102m+n?+bc?102n?+ad?102m?+bd這樣大整數(shù)乘法就被分解成 4 個長度減半的整數(shù)的乘法。如此執(zhí)行下去,直到執(zhí)行的乘法的兩數(shù)足夠小時,然后計算反推最終結果。根據(jù)上面的執(zhí)行思路,我們開始一步一步得到大整數(shù)相乘的分治代碼。首先處理初始以及最后分治的終止條件:如果 s1 或者 s2 中有一個為空串,那么相乘結果為 '0‘,注意輸出字符串;此外,分解到最后 s1 和 s2 字符串的長度均為1 時,我們可以直接將兩個字符串強裝成數(shù)字然后進行相乘,最后返回的結果也要再轉成字符串:if not s1 or not s2: # 有一個為空,則結果為0 return '0'elif len(s1) == 1 and len(s2) == 1: # 終止條件 return str(int(s1) * int(s2))接下來開始對字符串 s1 和 s2 進行分治求解:# 其余情況l1 = len(s1) // 2l2 = len(s2) // 2# 將s1分成兩部分a = s1[:l1] b = s1[l1:]# 將s2分成兩部分c = s2[:l2]d = s2[l2:]接下來我們分別得到了4個子串:a、b、c、d。按照前面的公式,我們分別要計算 ac、bc、ad 和 bd 的值。這些值可以使用遞歸方法得到,要注意相乘結果的10次冪需要保留,以便后續(xù)能合成最終問題的解。mi = len(b) # 對于a的10次冪ni = len(d) # 對于c的10次冪# 分別計算ac, ad, bc, bd,分別補上相應的冪次,使用分治計算x1 = bigDataMultiple(a, c) + '0' * (mi + ni)x2 = bigDataMultiple(a, d) + '0' * mix3 = bigDataMultiple(b, c) + '0' * ni x4 = bigDataMultiple(b, d)最后是計算 x1+x2+x3+x4 的值便可得到原大問題的解,由于 x1~x4 均為字符串,我們按照字符串上每位數(shù)字相加來進行。首先需要將所有字符串的長度統(tǒng)一,對于短字符串需要將前面補零:max_len = max(len(x1), len(x2), len(x3), len(x4))x1 = '0' * (max_len - len(x1)) + x1x2 = '0' * (max_len - len(x2)) + x2x3 = '0' * (max_len - len(x3)) + x3x4 = '0' * (max_len - len(x4)) + x4接著從字符串最后一位開始,計算每位上的值,注意進位問題即可:res = ''c = 0for i in range(max_len - 1, -1, -1): s = int(x1[i]) + int(x2[i]) + int(x3[i]) + int(x4[i]) + c res = str(s % 10) + res c = s // 10# 注意,如果循環(huán)完后進位>0,需要補上進位值if c > 0: res = str(c) + res然而,通過提交代碼發(fā)現(xiàn)有時候在合成最終結果時,字符串前面會出現(xiàn) ‘0’。因此下面的代碼就是找到前面非 ‘0’ 開頭字符的位置:# 去掉res最前面的'0'k = 0while res and k < len(res) and res[k] == '0': k += 1最后得到大整數(shù)相乘的最終結果為:res[k:]。綜合前面的分析與討論,得到完成的處理大整數(shù)相乘問題的 Python 實現(xiàn)如下:def bigDataMultiple(s1, s2): """ 計算 s1 * s2,返回大整數(shù)相乘結果 """ if not s1 or not s2: # 有一個為空,則結果為0 return '0' elif len(s1) == 1 and len(s2) == 1: # 終止條件 return str(int(s1) * int(s2)) # 其余情況 l1 = len(s1) // 2 l2 = len(s2) // 2 # 將s1分成兩部分 a = s1[:l1] b = s1[l1:] # 將s2分成兩部分 c = s2[:l2] d = s2[l2:] mi = len(b) # 對于a的10次冪 ni = len(d) # 對于c的10次冪 # 分別計算ac, ad, bc, bd,分別補上相應的冪次,使用分治計算 x1 = bigDataMultiple(a, c) + '0' * (mi + ni) x2 = bigDataMultiple(a, d) + '0' * mi x3 = bigDataMultiple(b, c) + '0' * ni x4 = bigDataMultiple(b, d) # 將計算的結果根據(jù)最長的補零,方便后面直接相加計算 max_len = max(len(x1), len(x2), len(x3), len(x4)) x1 = '0' * (max_len - len(x1)) + x1 x2 = '0' * (max_len - len(x2)) + x2 x3 = '0' * (max_len - len(x3)) + x3 x4 = '0' * (max_len - len(x4)) + x4 # 計算x1+x2+x3+x4的值,也就是原問題的解 res = '' c = 0 for i in range(max_len - 1, -1, -1): s = int(x1[i]) + int(x2[i]) + int(x3[i]) + int(x4[i]) + c res = str(s % 10) + res c = s // 10 # 注意,如果循環(huán)完后進位>0,需要補上進位值 if c > 0: res = str(c) + res # 去掉res最前面的'0' k = 0 while res and k < len(res) and res[k] == '0': k += 1 return res[k:]這道題是牛客網(wǎng)上的原題,我實現(xiàn)的分治算法略微復雜,大家可以參考上面的一些題解,有非常精簡和高效的實現(xiàn)。多參考優(yōu)秀的代碼對我們提升自己編程能力也是有莫大好處的。

2. 利用 arc 方法繪制圓

繪制圓在 canvas 中是常用的方法,在 canvas API 中直接提供了一個封裝好的繪制圓的方法 arc()。 這個方法接收 5 個必填參數(shù)x,y,r,sAngle,eAngle,還有一個 Boolean 類型的可選參數(shù) counterclockwise,用于規(guī)定是從順時針還是逆時針開始繪制路徑。先看整體案例:1429運行結果:我們從案例中可以看到,繪制一個圓形路徑只需要調(diào)用一個函數(shù)即可,arc 方法和我們之前學過的 rect 繪制矩形的方法類似,也是繪制了一個路徑,我們后續(xù)對路徑的描邊或者填充依然是需要調(diào)用 stroke 或者 fill 方法。

5. 實例

通用 html :<div class="common demo">transfrom3d</div><div class="common demo-3d">transfrom3d</div>通用 style :body{ perspective: 500px;}.common{ width:100px; height:100px; text-align: center; line-height: 100px; background:#f2f2f2; border:1px solid #ccc; position: absolute; top: 0; left: 0; }.demo{ z-index: 1; opacity: .5; background: red; }demo-3d 在 z 坐標軸向內(nèi)延伸 100px。.demo-3d{ transform:translate3d(0 ,0 ,-100px);}效果圖demo 在 z 坐標軸向內(nèi)延伸 100px ,效果圖說明: 紅色背景是 demo-3d 原來的位置,我們通過圖片看到它的表現(xiàn)是水平向右移動且縮小了,其實他是進行了 3D 空間的移動。demo-3d 在 z 軸空間上縮放。.demo-3d{ transform:scale3d(1 ,1 ,0);}效果圖demo 在 z 軸空間上縮放效果圖說明: scale3d 這個屬性可以拆成 scaleX() 、scaleY() 、 scaleZ() 。我們發(fā)現(xiàn) scaleZ() 在 3D 空間變化上,它的區(qū)間 0~1 是不起作用的,只有 0 代表縮小到 0(消失), 1 (不變)。demo-3d 在 z 軸上旋轉。.demo-3d{ transform: rotate3d(0,0,1,45deg);}效果圖demo-3d 在 z 軸上旋轉效果圖說明: 不推薦使用 rotate3d() 這個屬性,因為它只能通過 0 或 1 去選擇是否需要旋轉,第 4 個參數(shù)給 1 個旋轉角度,這種方式很不靈活,不過它的特性就是可以同時控制 x,y,z 方向上的旋轉角度。其實我們從 1~3 這 3 個例子中看到只設定了其中一項,接下來我們?nèi)轿坏淖兓?。?x,y,z 上應用 translate3d 和 rotateZ.demo-3d{ transform:translate3d(100px ,100px ,-100px) rotateZ(45deg);}效果圖:在 x,y,z 上應用 translate3d 和 rotateZ 效果圖5.寫一個墻角效果<div class="cude"> <div class="common left">left</div> <div class="common right">right</div> <div class="common bottom">bottom</div></div> .cude { perspective: 1500px; width:200px; height:200px; position: relative; margin: 100px auto; transform-style: preserve-3d; transform: rotateX(-14deg) rotateY(-45deg); } .common { position: absolute; top: 0; left: 0; width: 200px; height: 200px; background:#666; opacity: 0.8; font-size:20px; text-align: center; line-height:200px; font-weight: bold; color:#fff; border:1px solid #fff; } .right { transform: rotateY(180deg) translateZ(101px); background: rosybrown;} .left { transform: rotateY(-90deg) translateZ(101px); background: rosybrown;} .bottom { transform: rotateX(90deg) translateZ(-100px);} 效果圖墻角效果圖說明: 寫這個其實沒有什么技巧,首先設置 transform-style: preserve-3d; 然后在理解每個面相對角度的基礎上去設置 translateZ 和 rotate3d.

3.3 塊級作用域

塊級作用域是 ES6 的概念,它的產(chǎn)生是要有一定的條件的,在大括號({})中,使用 let 或 const 聲明的變量,才會產(chǎn)生塊級作用域。這里需要注意的是,塊級作用域的產(chǎn)生是 let 或 const 帶來的,而不是大括號,大括號的作用是限制 let 或 const 的作用域范圍。當不在大括號中聲明時, let 或 const 的作用域范圍是全局。let name = 10;console.log(window.name) // undefined上面的代碼可以看到,使用 let 方式聲明的變量在 window 下是取不到的。var num = 10;{ var num = 20; console.log(num) // 20}console.log(num) // 20在使用 var 聲明的情況下,可以看出,外層的 num 會被 {} 中的 num 覆蓋,所以沒有塊級作用域的概念,下面看下使用 let 方式聲明:let num = 10;{ console.log(num); // Uncaught ReferenceError: Cannot access 'num' before initialization let num = 20; console.log(num) // 20}console.log(num) // 10這里可以看出 {} 內(nèi)外是互不干涉和影響的,如果在聲明 num 的前面進行打印的話,還會報錯,這個時候,num 處于暫存死區(qū),是不能被使用的,下面我們會具體說明。在低版本瀏覽器中不支持 ES6 語法,通常需要把 ES6 語法轉換成 ES5,使用 babel 把上面的代碼轉換后得到如下結果:var num = 10;{ console.log(_num); // num is not defined var _num = 20; console.log(_num); // 20}console.log(num); // 10從上面的代碼中可以看出,雖然在 ES6 語法使用的是相同的變量名字,但是底層 JS 進行編譯時會認為他們是不同的變量。也就是說即使大括號中聲明的變量和外面的變量是相同的名字,但是在編譯過程它們是沒有關系的。塊級作用域可以任意嵌套,如下實例:{{ let x = 'Hello imooc' { console.log(x); // Hello imooc let y = 'Hello World' } console.log(y); // 引用錯誤 ReferenceError: y is not defined.}};上方代碼每一層都是一個單獨的作用域,內(nèi)層作用域可以讀取外層的變量,所以第一個會打印 Hello imooc, 而外層無法讀取內(nèi)層的變量,所以會報錯。

5. 實例

1.統(tǒng)計/etc/fstab文件中每個單詞出現(xiàn)的次數(shù),并按從大到小排序awk '{for(i=1;i<=NF;i++){words[$i]++}}END{for(key in words)print key,words[key]}' /etc/fstab|sort -k2 -nrawk '{ips[$1]++}END{for(i in ips) print i,ips[i]}' access_nginx.log |column -t|sort -k2 -nr2.統(tǒng)計/etc/fstab每個文件系統(tǒng)類型出現(xiàn)的次數(shù)awk '!/^#/&&!/^$/{dev[$3]++}END{for(i in dev) print i,dev[i]}' /etc/fstab3.ping一個域名,輸出ping此刻的時間ping baidu.com|awk '{print $0" "strftime("%Y-%m-%d %H:%M:%S")}'4.利用netstat監(jiān)控服務是否正常監(jiān)聽netstat -lntup|awk 'NR>2{if($4 ~/.*:22/) print $0"yes";exit 0}'5.統(tǒng)計web服務器日志狀態(tài)碼awk '$9~"[0-9]"{stat[$9]++}END{for(i in stat) print i,stat[i]}' access_log

2. 啟動一個進程

這里以啟動一個 nginx 服務為例,首先使用 yum 命令安裝 nginx 軟件,命令如下:yum -y install nginx執(zhí)行結果如下:如上圖所示,已經(jīng)安裝好了 nginx 之后,可以使用如下命令啟動 nginx 服務:service nginx start執(zhí)行結果如下:啟動 nginx 之后可以使用本機瀏覽器訪問,但在訪問之前需要先將 Linux 防火墻關閉,命令如下:systemctl stop firewalldsystemctl status firewalld執(zhí)行結果如下圖:關閉防火墻之后,就可以通過瀏覽器查看到 nginx 軟件服務展示的內(nèi)容:

2.3 Map 的擴展方法

和 Set 數(shù)據(jù)結構一樣,Map 也提供了三個獲取 Map 對象的鍵值以及鍵值對組合的方法:方法名描述values返回 Map 實例中的值作為一個可以遍歷的對象keys返回 Map 實例中的鍵作為一個可以遍歷的對象entries返回 Map 實例中的鍵值對作為一個可以遍歷的對象keys() 方法是獲取 Map 實例上的鍵,并返回一個可迭代(Iterator)的對象。myMap.keys();var map = new Map();map.set('a', 1);map.set('b', 2);map.set('c', 3);var keys = map.keys()console.log(keys.next().value); // "a"console.log(keys.next().value); // "b"console.log(keys.next().value); // "c"獲取后的 keys 結構可以被迭代器上的 next 函數(shù)獲取到對應值。values() 方法是獲取 Map 實例上元素的值,并返回一個可迭代(Iterator)的對象。myMap.values();實例:var map = new Map();map.set('a', 1);map.set('b', 2);map.set('c', 3);var values = map.values()console.log(values.next().value); // 1console.log(values.next().value); // 2console.log(values.next().value); // 3獲取后的 values 結構可以被迭代器上的 next 函數(shù)獲取到對應值。entries() 方法返回一個包含 [key, value] 的可迭代(Iterator)的對象,返回的迭代器的迭代順序與 Map 實例的插入順序相同。myMap.entries()實例:var map = new Map();map.set('a', 1);map.set('b', 2);map.set('c', 3);var values = map.values()console.log(values.next().value); // 1console.log(values.next().value); // 2console.log(values.next().value); // 3keys()、values()、entries() 都可以被 for...of 循環(huán)。var map = new Map([["x", 1], ["y", 2], ["z", 3]]);for (let value of map.values()) { console.log(value);}// 1// 2// 3for (let [key, value] of map.entries()) { console.log(key + " = " + value);}// x = 1// y = 2// z = 3注意在循環(huán) entries() 結果的時候,因為每一項是包含鍵值的數(shù)組,可以通過 [key, value] 這種數(shù)組結構的方式把鍵值結構出來直接使用。

3. Map

我們都知道 Object 對象的鍵只能是基本類型,大部分情況都是字符串,并且 Object 存儲的數(shù)據(jù)是無序的,不能記住插入的先后順序。ES6 為了彌補 Object 的缺陷,新增了 Map 數(shù)據(jù)結構用于存儲復雜的數(shù)據(jù)類型。Map 保存的是鍵值對,并且能夠記住鍵的插入順序,而且任何值都可以作為 Map 的鍵來使用,包括引用類型。和 Set 一樣,Map 也是一個構造函數(shù),需要通過 new 的方式來創(chuàng)建一個 Map 實例。var map = Map([iterable]);在創(chuàng)建 Map 實例時可以接收一個特定的二維數(shù)組或是一個可遍歷的對象作為參數(shù),這個參數(shù)內(nèi)的每一項是以鍵和值的方式來組合的,如: [key, value] 形式,第一個元素鍵,第二個元素是值。// 創(chuàng)建一個空的 Map 對象var map1 = new Map()map1.set('a', 1);map1.set('b', 2);map1.set('c', 3);console.log(map1) // Map(3) {"a" => 1, "b" => 2, "c" => 3}// map也可以進行鏈式調(diào)用var map2 = new Map()map2.set('a', 1).set('b', 2).set('c', 3)console.log(map2) // Map(3) {"a" => 1, "b" => 2, "c" => 3}// 接收一個二維數(shù)組,二維數(shù)組中包含兩個值,key和valuevar map3 = new Map([["x", 10], ["y", 20], ["z", 30]]);console.log(map3) // Map(3) {"x" => 10, "y" => 20, "z" => 30}console.log(map1.get('a')) // 1console.log(map3.get('z')) // 30上面的代碼展示了 Map 數(shù)據(jù)結構添加和獲取操作,和 Set 一樣,Map 操作數(shù)據(jù)也是通過函數(shù)的方式來實現(xiàn)的。后面的章節(jié)我們會對 Map 做詳細的學習

3.3 label 配置詳解

label 項用于配置折線圖點上的文本標簽,支持顯示點的系列名、數(shù)據(jù)名、數(shù)據(jù)值以及其他自定義信息。與 tooltip 不同,label 顯示的文本信息與折線上的點強相關,通常配置在點的附近顯示,例如:1349示例效果:3.3.1 配置標簽位置可通過如下配置項設定標簽的顯示位置:配置名類型默認值說明positionstring|arraytop標簽位置,支持數(shù)組與字符串類型,默認為 top 即坐標點上方distancenumber5標簽與坐標點的距離,僅當 position 為字符串選項值時有效rotatenumber標簽選擇角度offsetarray[0, 0]標簽距離默認位置的偏移值其中, position 支持數(shù)組如 [10, 30] 用于指定像素位置值,或如 [10%, 20%] 用于指定百分比位置值。此外,還支持如下枚舉值:topleftrightbottominsideinsideLeftinsideRightinsideTopinsideBottominsideTopLeftinsideBottomLeftinsideTopRightinsideBottomRight枚舉值對應位置如圖:position 屬性決定了標簽的大致位置,之后可以通過配置其他位置屬性做出微調(diào),如下示例:1350示例效果:3.3.2 配置標簽內(nèi)容可通過 label.formatter 屬性修改折線圖標簽內(nèi)容,支持模板字符串與回調(diào)函數(shù)兩種形式。模板字符串支持如下變量:{a}:系列名;:數(shù)據(jù)名;{c}:數(shù)據(jù)值。{@xxx}:數(shù)據(jù)中名為’xxx’的維度的值,如{@product}表示名為 ‘product’ 的維度的值;{@[n]}:數(shù)據(jù)中維度 n 的值,如 {@[3]} 表示維度 3 的值,從 0 開始計數(shù)。標簽內(nèi)容默認只展示數(shù)據(jù)值,相當于 {c}。模板字符串方式的配置相對來說更加清晰簡單,例如:1351示例效果:回調(diào)函數(shù)方式支持傳入格式化函數(shù),函數(shù)將收到當前數(shù)據(jù)項的描述對象作為參數(shù),形如:{ componentType: 'series', // 系列類型 seriesType: string, // 系列在傳入的 option.series 中的 index seriesIndex: number, // 系列名稱 seriesName: string, // 數(shù)據(jù)名,類目名 name: string, // 數(shù)據(jù)在傳入的 data 數(shù)組中的 index dataIndex: number, // 傳入的原始數(shù)據(jù)項 data: Object, // 傳入的數(shù)據(jù)值。在多數(shù)系列下它和 data 相同。在一些系列下是 data 中的分量(如 map、radar 中) value: number|Array|Object, // 坐標軸 encode 映射信息, // key 為坐標軸(如 'x' 'y' 'radius' 'angle' 等) // value 必然為數(shù)組,不會為 null/undefied,表示 dimension index 。 // 其內(nèi)容如: // { // x: [2] // dimension index 為 2 的數(shù)據(jù)映射到 x 軸 // y: [0] // dimension index 為 0 的數(shù)據(jù)映射到 y 軸 // } encode: Object, // 維度名列表 dimensionNames: Array<String>, // 數(shù)據(jù)的維度 index,如 0 或 1 或 2 ... // 僅在雷達圖中使用。 dimensionIndex: number, // 數(shù)據(jù)圖形的顏色 color: string,}函數(shù)方式更靈活,適合用于描繪復雜標簽的場景,例如計算系列上每個節(jié)點數(shù)值在整個系列的百分比,示例:1352示例效果:

5. 實例

我們通過簡單編寫一個獲取當前用戶登錄信息的腳本,來展示目前登錄用戶的信息[root@master Shell_var]# cat login_info.sh #!/bin/bash# Description: login info scripts# Auth: kaliarch# Email: kaliarch@163.com# function: show user info# Date: 2020-03-08 13:36# Version: 1.0echo "當前登錄系統(tǒng)用為: ${USER}"echo "當前登錄系統(tǒng)時間: $(date +"%Y-%m-%d %H:%M:%S")"echo "當前登錄系統(tǒng)Shell: ${Shell}"echo "當前用戶家目錄為: ${HOME}"# 運行腳本查看內(nèi)容[root@master Shell_var]# bash login_info.sh 當前登錄系統(tǒng)用為: root當前登錄系統(tǒng)時間: 2020-03-08 12:16:04當前登錄系統(tǒng)Shell: /bin/bash當前用戶家目錄為: /root

1.1 多行注釋

以 /* 注釋內(nèi)容 */ 形式出現(xiàn)的注釋。注釋可以寫在一行,也可以跨越多行。只要在注釋的開始使用 /* 標明,在注釋全部寫完后用 */ 結束就可以了。被這兩組符號包圍的部分就是注釋主體。/* 注釋的示范程序可以跨越多行進行注釋*//**************************************為了強調(diào)可以這樣標注,可以寫很長的注釋體。一般自由軟件會有很長的授權協(xié)議寫在開頭,大家使用別人軟件的時候請仔細閱讀。***************************************/# include <stdio.h>int main(){ /* 聲明變量 */ int x,y,z; return 0; /* 返回值 */}

4. 常用的三角函數(shù)

在 Python 的 math 模塊中包含如下常用的三角函數(shù),在詞條 “Python 中常用的標準庫系列之 math 模塊” 獲取詳細用法。函數(shù)功能描述 acos(x) 返回 x 的反余弦弧度值 asin(x) 返回 x 的反正弦弧度值 atan(x) 返回 x 的反正切弧度值 cos(x) 返回 x 的弧度的余弦值 hypot(x, y) 返回歐幾里德范數(shù) sqrt (xx + yy)sin(x) 返回的 x 弧度的正弦值 tan(x) 返回 x 弧度的正切值 degrees(x) 將弧度轉換為角度 radians(x) 將角度轉換為弧度

2. 利用 rect 方法繪制矩形

繪制矩形在 canvas 中是常用的方法,所以 canvas API 直接提供了一個封裝好的繪制矩形的方法 rect(),這個方法接收4個參數(shù) x,y,width,height。先看整體案例:1417運行結果:我們從案例中可以看到,繪制一個矩形路徑只需要調(diào)用一個函數(shù)即可,和上節(jié)課的繪制案例比較,我們省去了連每一個點的步驟。這里需要注意 rect 方法只是幫我們繪制了路徑,并不會把路徑實際地顯示到畫布上,我們依然需要調(diào)用 stroke 描邊方法才能看到繪制的圖形。

1. 跳躍游戲

這是 leetcode 上算法部分第55題,為中級編程題。題目描述如下:給定一個非負整數(shù)數(shù)組,你最初位于數(shù)組的第一個位置。數(shù)組中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最后一個位置。示例 1:輸入: [2,3,1,1,4]輸出: true解釋: 我們可以先跳 1 步,從位置 0 到達 位置 1, 然后再從位置 1 跳 3 步到達最后一個位置。示例 2:輸入: [3,2,1,0,4]輸出: false解釋: 無論怎樣,你總會到達索引為 3 的位置。但該位置的最大跳躍長度是 0 , 所以你永遠不可能到達最后一個位置。這道題稍微有點復雜,官方給出的解法正是貪心思路:首先思考對于數(shù)組中任意一個位置 y, 如何判斷它是否可達?根據(jù)題目表示,只要存在一個位置 x,它本身可達,且它跳躍的最大長度為 x + nums[x],如果這個值大于等于 y,即 x + nums[x] >= y,即位置 y 也可達。對于每一個可以到達的位置 x,它使得 x+1, x+2, ... , x+nums[x] 這些連續(xù)的位置都可以到達。這樣以來,我們依次遍歷數(shù)組中的每一個位置,并實時維護最遠可以到達的位置。對于當前遍歷到的位置 x, 如果它在最遠可以到達的位置的范圍內(nèi),那么我們就可以從起點通過若干次跳躍到達該位置,因此我們可以用 x + nums[x] 更新最遠可以到達的位置。在遍歷的過程中,如果最遠可以到達的位置大于等于數(shù)組中的最后一個位置,那就說明最后一個位置可達,我們就可以直接返回 True 作為答案。反之,如果在遍歷結束后,最后一個位置仍然不可達,我們就返回 False 作為答案。這便是官方給出的貪心思路,非常清晰明了。最后根據(jù)上述思路我們給出完整的 Python 解答,這個題解來自 leetcode 題解中的一個優(yōu)秀回答,和官方給出的貪心思路一致,都是維護一個從起始點出發(fā)可以達到的最遠坐標。def canJump(nums): # 如果數(shù)組中沒有0,則一定可以到達 if 0 not in nums: return True # 如果只有一個元素,也可以到達 if len(nums) < 2: return True # 維護最長距離 max_distance = 0 for i in range(len(nums) - 1): # i <= max_distance 表明當前位置可以到達 if i <= max_distance: # 更新最大距離 max_distance = max(i + nums[i], max_distance) else: # 如果當前位置無法到達則結束 break # 返回能到達的最大距離是否能到最后一位 return max_distance >= len(nums) - 1 我們來看看官方給出的示例代碼,也比較精簡,思路和原理一樣,只不過代碼寫法不同。原代碼為 java,現(xiàn)轉成 Python,內(nèi)容如下:def canJump(nums): # 維持最大距離 max_distance = 0 for i in range(len(nums)): # 非常重要,該點必須可達 if i <= max_distance: # 該點可達,更新能到的最大距離 max_distance = max(i + nums[i], max_distance) # 如歸最大距離能到最后一個位置,直接返回 True if max_distance >= (len(nums) - 1): return True else: # 如果i位置無法到達,那么可以直接退出循環(huán),返回False break # 無法到達最后,返回False return False

1. 什么是 Bitmap

Bitmap 在 Android 中對應一張圖片文件,它是一個二位系統(tǒng),通過編碼記錄了一張圖片的完整形式。以左上角為原點,向右和向下建立一個(X , Y)坐標系,坐標系中的每一個點都成為一個“像素”。在不同編碼格式的 Bitmap 里一個像素占的 bit 數(shù)有所不同,這些 bit 共同表征了當前像素的色值,可能是8 bit、16 bit 或者 24 bit 等等,最后將這些所有的色值組合起來就成了一張完整的原始圖片。我們在 Android 中繪制的一切圖像都是一個 Bitmap,我們可以創(chuàng)建一個 Bitmap 示例或者使用 Bitamp 工具來修改、優(yōu)化一個圖像資源。

1. 簡介

官方定義:折線圖是用折線將各個數(shù)據(jù)點標志連接起來的圖表,用于展現(xiàn)數(shù)據(jù)的變化趨勢??捎糜谥苯亲鴺讼岛蜆O坐標系上。慕課解釋折線圖是用直線將一系列的數(shù)據(jù)點連接的圖表,可以顯示隨維度 x 變化而變化的 y 數(shù)據(jù),適合用于顯示在相同 x 間隔下,數(shù)據(jù)的變化趨勢。ECharts 的提供的折線圖功能非常完備,可通過配置項的 series 屬性傳入 type = line 的對象完成配置。折線圖配置項繁多,官網(wǎng) 對此已有詳盡介紹,在此不贅述。下面會提供豐富的示例,詳盡介紹折線圖的方方面面。

2.3 TCP 三次握手

面試官提問: TCP 是如何建立連接的?分析下每個步驟傳輸了什么樣的數(shù)據(jù)?題目解析:? (TCP 三次握手過程)首先從行為上分析,TCP 建立連接需要發(fā)送三次報文,也就是 "三次握手" 的過程。我們定義發(fā)送報文的一方是客戶端,接收報文的一方是服務器端。首先服務器端處于監(jiān)聽(LISTEN)的狀態(tài),否則不會收到客戶端發(fā)來的請求。(1)第一次握手:客戶端往服務器端發(fā)送一個請求建立連接報文,報文首部 SYN 標志位 = 1,給定一個初始的 Seq 序號 x。之后客戶端進入 SYN_SEN(同步發(fā)送)狀態(tài);(2)第二次握手:服務器端收到請求報文,如果同意建立連接,則向客戶端發(fā)送確認報文。確認報文中 SYN 標志位 = 1,ACK 標志位 = 1,同時給定一個 Seq 序號 y,Ack 確認號 x+1,之后服務器端進入 SYN_RCVD(同步已發(fā)送)狀態(tài);(3)第三次握手:客戶端收到來自服務器端的確認報文之后,還需要向服務器端發(fā)送確認報文,報文首部 ACK 標志位 = 1,Ack 確認號為 y+1,發(fā)送之后客戶端進入 ESTABLISHED(已建立連接)的狀態(tài)。服務器端收到確認報文后,也會進入 ESTABLISHED 狀態(tài),在此之后,客戶端和服務器端可以開始 TCP 通信了。

1.1 Splash對象屬性

來看默認的 Splash lua 腳本:function main(splash, args) assert(splash:go(args.url)) assert(splash:wait(0.5)) return { html = splash:html(), png = splash:png(), har = splash:har(), }end其中這個 splash 參數(shù)非常重要,從該參數(shù)中我們可以調(diào)用 Splash 對象的一些重要屬性和方法來控制加載的過程。我們來看看 Splash 對象最常用的幾種屬性:args 屬性:如 splash.args.url 是獲取請求渲染的 url;js_enabled 屬性:這個屬性可以用來允許或者禁止執(zhí)行 js 代碼。例如下面的 lua 腳本:function main(splash, args) splash.js_enabled = true assert(splash:go(args.url)) assert(splash:wait(0.5)) local title = splash:evaljs("document.title") return { title=title }end得到的結果為:Splash Response: Objecttitle: "今日頭條"如果我們禁止執(zhí)行 js 代碼,即設置 splash.js_enabled = false,則渲染頁面時會報錯: 禁止js后,執(zhí)行js語句報錯resource_timeout 屬性:該屬性用于設置頁面加載時間,單位為秒。如果設置為0或者 nil (相當于 Python 中的 None),表示不檢測超時;images_enabled 屬性:用于設置是否加載圖片,默認為 true,表示加載頁面圖片,設置為 false 后,表示禁止加載圖片,這有可能會改變頁面的布局,使用時要注意。另外,注意 Splash 使用了緩存,如果頭一次設置 true 并加載頁面,之后再設置為 false 后加載頁面仍然會有圖片顯示,這正是緩存的影響。只需要重啟 splash 服務即可顯示正常;小米網(wǎng)站,禁止加載圖片plugins_enabled 屬性:該屬性用于控制瀏覽器插件是否開啟,默認情況下為 false;scroll_position 屬性:該屬性用于控制頁面上下或者左右滾動。它是一個字典類型,key 為 x 表示頁面水平滾動位置,key 為 y 表示頁面垂直滾動的位置;我們繼續(xù)拿頭條的熱點新聞做實驗。之前默認訪問時的頁面如下:默認訪問頭條熱點新聞從抓取的網(wǎng)頁上看,一共獲取了12篇熱點新聞。接下來我們使用 scroll_position 屬性來將頁面滾動滾動,測試的 lua code 如下:function main(splash, args) assert(splash:go(args.url)) assert(splash:wait(2)) splash.scroll_position = {y=1000} assert(splash:wait(2)) splash.scroll_position = {y=1500} assert(splash:wait(5)) return { png=splash:png(), html=splash:html() }end這里我做了2次頁面滾動,渲染的效果如下: 滾動后的效果可以看到,頁面確實出現(xiàn)了滾動,且我們獲取的新聞數(shù)據(jù)已經(jīng)變多了,從渲染的頁面上看,我們已經(jīng)抓到了36條數(shù)據(jù)。

3. 發(fā)送HTML格式的郵件

如果我們要發(fā)送帶有 CSS 樣式的郵件,那么需要我們在 headers 中加入Content-type: text/html,并更改文件的內(nèi)容:msg = <<MESSAGEFrom: Andrew <#{sender_email}>To: Testuser <#{receiver_email}>Subject: Test MessageDate: #{Time.now.strftime("%a, %d %b %Y %H:%M:%S +0800")}Content-type: text/html Message-Id: <#{rand.to_s[3...8]}.message.@163.com><h1>測試標題</h1><p style="color: red;">測試這段話</p>MESSAGEputs msg# ---- 輸出結果 ---From: Andrew <xxx.com>To: Testuser <xxx.qq.com>Subject: Test MessageDate: Thu, 20 Aug 2020 23:37:43 +0800Content-type: text/htmlMessage-Id: <17402.message.@163.com><h1>測試標題</h1><p style="color: red;">測試這段話</p>接收到郵件后,我們可以看到內(nèi)容中的 CSS 已經(jīng)生效了。

2.1 基礎示例

在 echarts 中,通過傳入 xAxis、yAxis、series 三個關鍵屬性,即可完成一個折線圖的配置,示例:1341示例效果:示例代碼有幾個關鍵點:需要傳入 xAxis 顯式聲明 x 軸狀態(tài),示例中通過 type: category 將該軸配置為類目軸,并通過 data 屬性顯式定義該軸下的類目數(shù)據(jù);需要傳入 yAxis 顯式聲明 y 軸狀態(tài),示例中通過 type: value 將蓋州配置為類目軸;折線圖通過配置項的 series 傳入,且必須聲明 type: line。示例中通過 data 屬性聲明了該圖表的系列數(shù)據(jù)。實際應用中,我們常常會忽略類目軸的 data 配置,而交由 echarts 自行推斷,下例代碼可以實現(xiàn)與上例相同的效果:1342

1. 如何在 TensorBoard 之中生成 Keras 模型結構圖

倘若我們通過 tf.keras API 來自定義了一個網(wǎng)絡模型,那么我們在 TensorBoard 來查看模型圖是非常簡單的一件事情。當我們使用 tf.keras 的模型的 fit() 方法的時候,框架會自動幫我們繪制模型結構圖。如下代碼所示:首先我們定義模型、數(shù)據(jù)與相應的參數(shù)。import tensorflow as tf(x_train, y_train),(x_test, y_test) = tf.keras.datasets.mnist.load_data()x_train, x_test = x_train / 255.0, x_test / 255.0def create_model(): return tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(256, activation='relu'), tf.keras.layers.Dense(10, activation='softmax') ])model = create_model()model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=[])然后我們定義相應的 TensorBoard 日志目錄,同時對模型使用 fit() 進行訓練:tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir='./logs')model.fit(x=x_train, y=y_train, epochs=3, validation_data=(x_test, y_test), callbacks=[tensorboard_callback])最后我們就可以打開 TensorBoard 并在瀏覽器查看:tensorboard --logdir logs我們就可以在瀏覽器的 Graph 標簽頁之中看到模型圖了:

4. nona 編輯器控制命令介紹

命令參數(shù)名稱功能與作用描述Ctrl + C顯示光標在文件中的位置信息Ctrl + G顯示 nano 編輯器的幫助窗口Ctrl + J調(diào)整當前文本段落Ctrl + K剪切文本行,并將其保存在剪切緩沖區(qū)Ctrl + O將當前文本編輯緩沖區(qū)的內(nèi)容寫入文件Ctrl + R將文件讀入當前文本編輯緩沖區(qū)Ctrl + T啟動可用的拼寫檢查器Ctrl + U將剪切緩沖區(qū)中的內(nèi)容放入當前行Ctrl + V翻動到文本編輯緩沖區(qū)中的下一頁內(nèi)容Ctrl + W在文本編輯緩沖區(qū)中搜索單詞或短語Ctrl + X關閉當前文本編輯緩沖區(qū),退出 nano 編輯器Ctrl + Y翻動到文本編輯緩沖區(qū)中的上一頁內(nèi)容Tips:可以在 nano 編輯器界面使用 Ctrl + G 顯示更多的命令。

2.1 編輯類

macOSwindow/linux說明? DCtrl D選擇詞(重復按下時多重選擇相同的詞進行多重編輯)? ? DCtrl ? D復制(多)行? JCtrl J合并(多)行? ? ?Ctrl ? ?在當前行前插入新行? ? /Ctrl ? /塊注釋? YCtrl Y恢復撤銷? ? VCtrl ? V粘貼并自動縮進? ? SCtrl ? S保存所有文件? ]Ctrl ]向右縮進? [Ctrl [向左縮進? ACtrl A全選? LCtrl L選擇行(重復按下將下一行加入選擇)? ? MCtrl ? M選擇括號的內(nèi)容? ?Ctrl ?在當前行后插入新行? ? KCtrl ? K刪除行? K KCtrl K K從光標處刪除至行尾? K ?Ctrl K ?從光標處刪除至行首? K UCtrl K U改為大寫? K LCtrl K L改為小寫? CCtrl C復制? XCtrl X剪切? VCtrl V粘貼? /Ctrl /注釋? ZCtrl Z撤銷

直播
查看課程詳情
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號