沐鳴註冊網站_使用原生js實現選項卡功能實例教程

選項卡是前端常見的基本功能,它是用多個標籤頁來區分不同內容,通過選擇標籤快速切換內容。學習本教程之前,讀者需要具備html和css技能,同時需要有簡單的JavaScript基礎。

先來完成html部分。首先,需要一個元素把整個選項卡包含在內。新建一個div元素,它的id命名為tabBox,如下所示:

<div id="tabBox"></div>

在tabBox元素裏面,再把選項卡分為標籤和內容兩個部分,分別命名class為label_box和content_box,如下所示:

<div id="tabBox" class="tab_box">
  <ul class="label_box"></ul><!--標籤部分-->
  <div class="content_box"></div><!--內容部分-->
</div>

一般情況下,標籤元素和內容元素的數量要保持一致,在本實例中把標籤和內容都設為三個。 分別在label_box和content_box元素中添加標籤和內容,如下所示:

<div id="tabBox" class="tab_box">
  <ul class="label_box"><!--標籤部分-->
    <li>選項一</li>
    <li>選項二</li>
    <li>選項三</li>
  </ul>
  <div class="content_box"><!--內容部分-->
    <div class="content">內容一</div>
    <div class="content">內容二</div>
    <div class="content">內容三</div>
  </div>
</div>

為了讓選項卡好看一點,讀者可以根據自己喜好加上一些樣式,也可以直接複製以下樣式代碼使用:

.tab_box{
  width:600px;
  margin:30px auto;
}
.label_box{
  padding-left:30px;
  font-size:0;
}
.label_box li{
  display:inline-block;
  line-height:30px;
  height:30px;
  padding:0 10px;
  margin:0 5px;
  font-size:14px;
  border:1px solid #2d9aff;
  border-bottom:none;
  border-top-left-radius:4px;
  border-top-right-radius:4px;
  cursor:pointer;
}
.label_box li.active{
  background:#2d9aff;
  color:#fff;
}
.content_box{
  padding:20px;
  border:1px solid #2d9aff;
  border-radius:4px;
  box-shadow:0px 0px 6px #aaa;
}
.content_box .content{
  display:none;
  height:300px;
}

完成html和css部分之後,再來使用js實現標籤切換的功能。本實例把選項卡功能封裝到函數中,所以先創建一個primaryTab函數,在primaryTab中再來編寫具體代碼。

筆者建議在完成某一個前端功能時,應先分析功能的具體操作。再根據具體操作把實現功能的方法分成多個步驟,接下來一個步驟一個步驟去完成它。

選項卡的操作非常簡單,就是選擇標籤(可以是點擊,也可以是鼠標滑過,本實例使用點擊事件)時,快速切換內容且修改當前激活標籤樣式。默認情況下第一個標籤元素為當前激活狀態,第一個內容元素需要显示。把這樣一個操作,在實現功能上來可分成三個步驟:

1 獲取標籤元素和內容元素
2 給第一個標籤元素添加active樣式修改為激活狀態;把第一個內容元素通過樣式display:bolock來显示。
3 在標籤上添加事件,實現切換內容
  3.1 遍歷標籤,給每一個標籤添加事件
  3.2 在事件函數中遍歷標籤,把每一個標籤的className改為空字符串,用於刪除激活標籤樣式。
  3.3 在事件函數中遍歷內容元素,把每一個內容元素通過樣式設置為隱藏。
  3.4 在事件函數中通過this找到當前標籤元素,設置className,修改當前標籤元素樣式為激活狀態。
  3.5 在事件函數中通過變量找到對應的內容元素,並通過樣式設置為显示。
具體代碼如下:

function primaryTab(){
  //1.獲取選項卡外包元素
  var eTab = document.getElementById('tabBox'); 
  //1.獲取標籤外包元素
  var eLabel = eTab.getElementsByClassName('label_box')[0];
  //1.獲取所有標籤元素的集合  
  var aLabels = eLabel.getElementsByTagName('li');
  //1.獲取內容外包元素
  var eContent = eTab.getElementsByClassName('content_box')[0];
  //1.獲取所有內容元素的集合
  var aContents = eContent.getElementsByClassName('content');
  //2.給第一個標籤元素添加active樣式修改為激活狀態 
  aLabels[0].className = 'active';
  //2.把第一個內容元素通過樣式display:bolock來显示
  aContents[0].style.display = 'block';
  //3.1 遍歷標籤,注意:本實例這裏聲明變量i只能用let,如果用var會出錯
  for(let i=0;i<aLabels.length;i++){
    //3.1 給每一個標籤添加點擊事件
    aLabels[i].onclick = function(){
      //3.2 遍歷標籤 
      for(let n=0;n<aLabels.length;n++){
        //3.2 把每一個標籤的className改為空字符串,用於刪除激活標籤樣式。
        aLabels[n].className = '';
        //3.3 因為標籤元素和內容元素數量相同,所以可通過變量n把每一個內容元素通過樣式設置為隱藏
        aContents[n].style.display = 'none'; 
      }
      // 3.4 通過this找到當前標籤元素,修改當前標籤元素為激活狀態。
      this.className = 'active';  
      //3.5 通過變量i找到對應的內容元素,並通過樣式設置為显示。
      aContents[i].style.display = 'block'; 
    }
  }
}
//調用選項卡函數
primaryTab();

好了,就是這麼簡單,相信通過本教程的學習,你一定很輕鬆可以掌握js選項卡功能。

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/8663

沐鳴登錄網站_JSON Web 令牌(JWT)是如何保護 API 的?

你可以已經聽說過 jsON Web Token (JWT) 是目前用於保護 API 的最新技術。

與大多數安全主題一樣,如果你打算使用它,那很有必要去了解它的工作原理(一定程度上)。問題在於,對 JWT 的大多數解釋都是技術性的,這一點讓人很頭疼。

讓我們看下,我能否解釋清楚 JWT 是如何在不引起你的注意下保護您的 API !

API 驗證

某些 API 資源需要限制訪問 。例如,我們不希望一個用戶能夠更改另一個用戶的密碼。

這就是為什麼我們保護某些資源,使用戶在允許訪問之前提供他的 ID 和密碼——換句話說,我們對它們進行身份驗證。

保護HTTP API的困難在於請求是 無狀態的 —— API 無法知道是否有兩個請求來自同一用戶。

那麼,為什麼不要求用戶在每次調用 API 時提供其 ID 和密碼呢?僅因為那將是可怕的用戶體驗。

jsON Web Token

我們需要的是一種允許用戶僅提供一次其憑證,隨後在後續請求中由服務器以另一種方式標識的方式。

為此設計了幾種系統,當前的最新標準是 JSON Web Token。

這是一篇 關於該主題的精彩文章 ,它很好地比喻了 JSON Web Token 的工作方式:

想象一下你要入住酒店,而不是一個 API 。「Token」是塑料酒店安全卡,可用於進入你的房間和使用酒店設施,但不能進入任何其他人的房間。

當你退房的時候,你交回卡片。這類似於註銷。

Token 的結構

通常, JSON Web Token 是通過 HTTP 請求頭髮送的。類似如下:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U

實際上, Token 部分是「Authorization: Bearer」之後的部分,僅是 HTTP 頭信息。

在你斷定這是難以理解的胡言亂語前,有幾件事你很容易注意到。

首先,Token是由三個不同的字符串組成,以句點分隔。這三個部分是 Base64 編碼 后的內容,並且分別對應 Header , Payload 以及 Signature

// Header eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

// Payload eyJzdWIiOiIxMjM0NTY3ODkwIn0

// Signature dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U

注意: Base64 是一種轉換字符串的方法,以確保在跨網絡傳輸期間不會被弄亂。這不是一種加密方式,任何人都可以 
輕鬆解碼
 以查看原始數據

我們可以對這些字符串進行解碼,以更好地了解JWT的結構。

Header

以下是 Token 中的已解碼 Header 部分。Header 是 Token 的元信息。它並沒有告訴我們很多幫助你建立基本理解的知識,因此我們不會對此進行任何詳細介紹。

{ 
  "alg": "HS256",  
  "typ": "JWT" 
}

Payload

Payload 能引起更多的關注。如果你想, Payload 可以包含任何數據,但是如果 Token 的目的是 API 訪問身份驗證,則可以僅包含用戶 ID 。

{ 
  "userId": "1234567890" 
}

請注意, Payload 不安全 。 任何人都可以解碼 Token ,並確切了解 Payload 中的內容。因此,我們通常會包含一個 ID ,而不是諸如用戶电子郵件之類的敏感識別信息。

即使 Payload 是在 API 上識別用戶所需要的全部,它也不能提供身份驗證的方法。如果其中包含所有內容,則有人可以輕鬆找到你的用戶 ID 並偽造 Token 。

因此,這使我們進入了 Signature 部分,這是認證 Token 的關鍵部分。

哈希算法

在解釋簽名如何工作之前,我們需要定義什麼是哈希算法。

首先,它是一個將字符串轉換為稱為 Hash 的新字符串的函數。例如,假設我們要對字符串「Hello, world」進行哈希處理。這是我們使用 SHA256 哈希算法得到的輸出:

4ae7c3b6ac0beff671efa8cf57386151c06e58ca53a78d83f36107316cec125f

哈希的最重要屬性是 你無法通過哈希算法來查看 Hash 的原始文本 。

有許多不同類型的哈希算法,但 SHA256 通常與 JWT 一起使用。

換句話說,我們不能根據上面的散列值算出原始字符串是 Hello,world。哈希非常複雜,以至於無法猜測原始字符串。

JWT 簽名

回到 JWT 結構,來看一下令牌的第三部分,簽名。實際上需要計算:

HMACSHA256( 
  base64UrlEncode(header) + "." + base64UrlEncode(payload), 
  "secret string"
);

下面是對這裏發生的情況做解釋:

首先, HMACSHA256 是哈希函數的名稱, 並帶有兩個參數:要散列的字符串,以及「secret」。

其次,我們哈希的字符串是 base 64 的編碼報頭,加上 base 64 的編碼有效載荷。

第三, secret 是任意一段字符串,只有服務器知道。

問. 為什麼在簽名散列中包含標頭和有效負載?

這確保了簽名對於此特定令牌是唯一的。*

問. secret 是什麼?

為了回答這個問題,讓我們考慮一下如何偽造令牌。

我們之前說過,您無法通過查看輸出來確定哈希的輸入。但是,由於我們知道簽名包括標頭和有效負載,因為它們是公共信息,所以如果您知道哈希算法(提示:通常在標頭中指定),則可以生成相同的哈希。

但是只有服務器知道的秘密 不是 公共信息。將其包含在哈希中可防止某人生成自己的哈希來偽造令牌。而且由於散列會掩蓋用於創建散列的信息,因此任何人都無法從散列中找出秘密。

將私有數據添加到哈希中的過程稱為 salting 
,幾乎不可能破解令牌。

認證過程

因此,現在您對令牌的創建方式有了一個很好的了解。您如何使用它來驗證您的API?

登錄

用戶登錄時會生成令牌,令牌會與用戶模型一起存儲在數據庫中。

  • loginController.js *
if (passwordCorrect) { 
  user.token = generateToken(user.id); 
  user.save(); 
}

然後令牌作為authorization頭附加到登錄請求的響應中。

loginController.js

if (passwordCorrect) { 
  user.token = generateToken(user.id); 
  user.save(); 
  res.headers("authorization", `Bearer ${token}`).send(); 
}

驗證請求

現在,客戶端有了令牌,他們可以將其附加到任何將來的請求以身份驗證用戶。

當服務器收到帶有授權令牌的請求時,將發生以下情況:

1.它解碼令牌並從有效載荷中提取ID。

2.它使用此ID在數據庫中查找用戶。

3.它將請求令牌與用戶模型中存儲的令牌進行比較。如果它們匹配,則對用戶進行身份驗證。

authMiddleware.js

const token = req.header.token; 
const payload = decodeToken(token); 
const user = User.findById(payload.id); 
if (user.token = token) { 
  // 通過身份認證
} else {
 // 未通過身份認證
}

退出登錄

如果用戶註銷,只需刪除附加到用戶模型的令牌,現在令牌將不再起作用。用戶將需要再次登錄以生成新令牌。

logoutController.js

user.token = null; 
user.save();

總結

因此,這是關於如何使用 JSON Web 令牌保護 API 的最基本的說明。希望你不會很頭疼。

不過,相關的話題還有很多,所以這裡有一些額外的讀物:

  • JWT.io
  • 什麼是 JSON Web 令牌?
  • 了解如何使用 JSON Web 令牌 ( JWT ) 進行身份驗證

原文鏈接:https://learnku.com/laravel/t…

討論請前往專業的 Laravel 開發者論壇:https://learnku.com/Laravel  

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/7498

沐鳴總代理_CSS過渡屬性transition與display衝突問題

衝突:

當改變元素display屬性時,過渡屬性transition失效。

原因:

display:none的時候,頁面文檔流中將不會存在該元素。transition無法對一個從有到無的元素產生過渡效果。

解決方法:

        1.改變元素的寬/高為0px,達到隱藏的目的。

        2.使用visibility替代display。


站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/7313

沐鳴平台_js實現返回上一頁(頁面刷新與不刷新)

返回上一頁不刷新:

a標籤

<a href="JavaScript :;" onclick="JavaScript:history.back(-1)">返回上一頁</a>

按鈕

  <input type="button" name="Submit" οnclick="javascript:history.back(-1);" value="返回上一頁">

圖片

<a href="javascript :;" onclick="javascript:history.back(-1);">
	<img src="圖片路徑" border="0" title="返回上一頁">
</a>

定時

    <script>
        function go()
        {
            window.history.go(-1);
        }
        setTimeout("go()",3000);
    </script>

返回上一頁並刷新

<input type="button" value="返回" οnclick="javascript:window.location.replace(document.referrer);"/>

<a href="javascript:document.parentWindow.location.reload()">返回上一頁面刷新的是自己</a>

<a href="history.html" οnclick="javascript:location.replace(this.href);event.returnValue=false; ">返回上一頁並刷新頁面</a> 

Javascript 返回上一頁:

  • 1. history.go(-1), 返回兩個頁面: history.go(-2);

  • 2. history.back(). 

  • 3. window.history.forward() 返回下一頁

  • 4. window.history.go(返回第幾頁,也可以使用訪問過的URL)  

如果要強行刷新的話就是:window.history.back();

刷新當前頁 window.location.reload();

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/7295

沐鳴總代平台_前端部署和提效:從靜態到node再到負載均衡

前言

相信很多前端同學對 vue 或 react 的開發很熟悉了,也知道如何去打包生成一個生產環境的包,但對於生產環境的部署可能有些同學了解比較少。小公司可能都是後端幫忙部署了,大公司會有專門的運維同學部署,對於生產環境的部署工作有些同學接觸的不多,所以這次來分享和總結下前端項目部署相關的實戰經驗:從靜態站點的部署,到 node 項目的部署,再到負載均衡的部署,順便也會分享一下提高部署效率的腳本和方法。

準備工作

一台或多台服務器或虛擬機。

一份 vue 或 react 項目的打包后的文件。

一份 node 項目的源碼。

靜態站點的部署

靜態站點的部署指的是前端的 html/css/js 資源的部署,如 vue 或 react 打包後生成的 html,css 和 js 文件,我們將這些文件上傳到服務器后,通過 Nginx 將這些資源暴露到公網上。

上傳文件到服務器

就是將文件人工將打包后的文件拷貝到服務器上,這個很簡單,但如果每次都是人工拷貝,部署效率未免會低了一些,所以建議使用一些腳本或工具。在大公司,一般對服務器權限控製得很嚴格,可能需要各種跳板機或動態密碼等,而大公司一般都有專門的運維人員或者 CI/CD 工具。

小公司可能相對自由一些,可以允許個人直接 ssh 連接服務器,此時可以配合使用rsync或scp命令(Linux 或 Mac 系統)來一鍵上傳文件到服務器上,給部署提效。在這裏分享一下以前使用過的部署腳本,在前端項目根目錄新建一個名為deploy.sh的文件:

#!/bin/bash

function deploy() {
  # 測試服務器
  test_host="root@test_server_ip"
  # 生產服務器
  prod_host="root@prod_server_ip"
  project_path="/srv/YourProject"

  if [ "$1" == "prod" ]; then
    target="$prod_host:$project_path"
  else
    target="$test_host:$project_path"
  fi

  rsync -azcuP ./dist/ --exclude node_modules --exclude coverage --exclude .env --exclude .nyc_output --exclude .git "$target"
  echo "deploy to $target"
}

deploy $@

以上腳本的意思是將/dist目錄下的所有文件,上傳到對應服務器的/srv/YourProject目錄下。測試環境的部署是直接在根目錄運行./deploy.sh,該命令會將/dist目錄直接上傳到root@test_server_ip服務器上;

生產環境的部署是在後面加一個參數./deploy.sh prod,這樣可以實現多環境部署。更進一步的做法是將運行腳本的命令直接寫進package.json中,如:

  "scripts": {
    "build": "vue-cli-service build --mode staging",
    "deploy": "npm run build && ./deploy.sh",
    "deploy:prod": "npm run build && ./deploy.sh prod"
  },

這樣,通過npm run deploy命令就可以實現直接打包並部署到測試環境了。如果你的公司目前還在用人工拷貝或 FTP 工具這種低效的部署方式,不妨試一下用上面的腳本來提效哦。

PS:由於 rsync 命令只在 Linux 或 Mac 才有,所以只有開發環境是 Linux 或 Mac 的用戶才可以運行哦,Windows 用戶是沒法跑這個命令的。

編寫網站的 conf

上傳文件到服務器后,就可以着手配置 nginx 了。一般 nginx 的配置都會放在/etc/nginx/conf.d目錄下,我們在該目錄新建一個test.conf作為該項目的配置:

server {
    listen       80;
    server_name your-domain.com; # 域名
    location / {
        root   /srv/YourProject; # 網站源碼根目錄
        index index.html;
    }
    location /api {
        proxy_pass http://localhost:8080; # 反向代理後端接口地址
    }
}

一般來說,靜態站點只需配置以上幾個就可以了,

server_name表示域名,需要先解析到服務器的公網 ip;

root表示服務器中代碼所在的位置,

index指明了默認的處理文件是index.html;

location /api是反向代理後端服務(這裏假設了後端服務部署在本地 8080 端口),即your-domain.com/api的請求都會轉發到http://localhost:8080上,一般用該方法可以完美解決前端跨域的問題。

修改 nginx 的 conf 后需要 reload 一下 nginx 服務:nginx -s reload

測試

如果上一步配置的域名是已經解析到服務器 ip 了的,就可以直接在公網上通過訪問域名來訪問你的站點了。如果不是,可以修改一下本機的 host 文件,使得配置的域名可以在本機訪問;或者通過http://localhost來訪問。

node 項目的部署

node 項目在開發時可以用node app.js這樣的命令來啟動服務,但在服務器上如果使用這個命令,退出服務器后 node 進程就停止了,所以需要藉助可以讓 node 進程 keep alive 的工具。現在一般都是用pm2。

安裝 pm2

npm install -g pm2

pm2 的一些常用命令:

pm2 start app.js              # 啟動app.js應用程序
pm2 start app.js -i 4         # cluster mode 模式啟動4個app.js的應用實例     # 4個應用程序會自動進行負載均衡
pm2 start app.js --name="api" # 啟動應用程序並命名為 "api"
pm2 start app.js --watch      # 當文件變化時自動重啟應用
pm2 start script.sh           # 啟動 bash 腳本
pm2 list                      # 列表 PM2 啟動的所有的應用程序
pm2 monit                     # 显示每個應用程序的CPU和內存佔用情況
pm2 show [app-name]           # 显示應用程序的所有信息
pm2 logs                      # 显示所有應用程序的日誌
pm2 logs [app-name]           # 显示指定應用程序的日誌
pm2 flush
pm2 stop all                  # 停止所有的應用程序
pm2 stop 0                    # 停止 id為 0的指定應用程序
pm2 restart all               # 重啟所有應用
pm2 reload all                # 重啟 cluster mode下的所有應用
pm2 gracefulReload all        # Graceful reload all apps in cluster mode
pm2 delete all                # 關閉並刪除所有應用
pm2 delete 0                  # 刪除指定應用 id 0
pm2 scale api 10              # 把名字叫api的應用擴展到10個實例
pm2 reset [app-name]          # 重置重啟數量
pm2 startup                   # 創建開機自啟動命令
pm2 save                      # 保存當前應用列表
pm2 resurrect                 # 重新加載保存的應用列表
pm2 update                    # Save processes, kill PM2 and restore processes
pm2 generate                  # Generate a sample json configuration file
pm2 deploy app.json prod setup    # Setup "prod" remote server
pm2 deploy app.json prod          # Update "prod" remote server
pm2 deploy app.json prod revert 2 # Revert "prod" remote server by 2
pm2 module:generate [name]    # Generate sample module with name [name]
pm2 install pm2-logrotate     # Install module (here a log rotation system)
pm2 uninstall pm2-logrotate   # Uninstall module
pm2 publish                   # Increment version, git push and npm publish

用 pm2 啟動項目

一般來說,我們可以直接使用pm2 start app.js –name=”my-project”這樣的命令來啟動 node 項目,但是這樣手打的命令會不好管理,所以我們一般會在 node 項目的根目錄下新建一個pm2.json文件來指定 pm2 啟動時的參數,如:

{
  "name": "my-project",
  "script": "./server/index.js",
  "instances": 2,
  "cwd": ".",
  "exec_mode" : "cluster"
}

name 表示 pm2 進程的名稱,script 表示啟動的文件入口,instances 表示啟動的示例數量(一般建議數值不大於服務器處理器的核數),cmd 表示應用程序所在的目錄。

我們在服務器啟動 node 項目時就可以直接pm2 start pm2.json。

nginx 代理綁定域名

node 項目使用 pm2 運行后,只是運行在服務器的某個端口,如http://server_ip:3000,如果該服務需要通過域名直接訪問,則還需要用 nginx 代理到 80 端口。在/etc/nginx/conf.d新建一個my-project.conf(文件命名隨意哈,一般可以用網站域名.conf):

server {
    listen       80;
    server_name  your-domain.com;
    location / {
        proxy_pass http://localhost:3000;
    }
}

這是最簡單的一個配置了,可以根據實際情況加一些參數哈。做完以上的步驟就完成了一個 node 項目的部署啦。

前端負載均衡部署

相信很少同學可以接觸到負載均衡的部署了,當一個項目的訪問量已經大到需要使用負載均衡的時候,一般都會有專門的運維同學去搞了。負載均衡說白了就是將大量的併發請求分擔到多個服務器上。

負載均衡的架構有很多種,項目的架構是一個不斷演進的過程,採用哪種負載均衡的架構需要具體問題具體分析,所以本文不會講什麼時候適合用哪種架構(筆者也不會,笑),接下來將會分享實戰如何用 Nginx 從零搭建一個經典的負載均衡架構案例。


Nginx Server是直接暴露在最前端的機器,當用戶發起請求,首先到達的是Nginx服務器,然後Nginx服務器再將請求通過某種算法分發到各個二級服務器上(圖中的Centos2,Centos3,Centos4),此時Nginx Server充當的就是一個負載均衡的機器(Load Balancer)。

筆者手上沒有這麼多的服務器,為了更完整地演示,所以現在藉助 VirtualBox 建立四個虛擬機來模擬四個服務器(當然條件確實限制時可以用同一個服務器的四個端口來代替)。

筆者新建了四個 Centos8 系統的虛擬機,用以假設 4 台服務器,對外都有獨立 ip(假設分別是 192.168.0.1,2,3,4)。如前面的架構圖所示,Centos1 將會是作為Nginx Server,充當最前端的負載均衡服務器,而其餘的Centos2,Centos3,Centos4作為應用服務器,為用戶提供真正的服務。接下來咱們一步一步去搭建這個系統。

一、應用服務器搭建服務站點

萬丈高樓平地起,咱們首先得先搭建一個能對外的服務,這個服務可以是一個網站也可以是一個接口。為了簡單起見,我們就直接起一個koa的Hello World,同時為了後面驗證負載均衡的效果,每台機器上部署的代碼都稍微改一下文案,如:Hello Centos2,Hello Centos3,Hello Centos4,這樣方便後面驗證用戶的請求是被分發到了哪一台服務器。

koa 的 demo 站點已經為大家準備好了:koa-loadbalance。

我們這裏以Centos2(192.168.0.2)(ip 是虛構的)這台虛擬機為例,將會用pm2部署 koa 站點在該虛擬機上。

通過 scp 或 rsync 命令將源碼上傳到 Centos2 服務器

還記得上面的deploy.sh腳本嗎?如果你添加了腳本在項目中,就可以npm run deploy直接部署到服務器上了。demo 源碼中有這個腳本,大家可以改一下裏面實際的 ip,再執行命令哈。

ssh 進入 Centos2 服務器

ssh root@192.168.0.2

安裝 node 環境

curl -sL https://rpm.nodesource.com/setup_13.x | sudo bash -
sudo yum install nodejs

可以在這裏看當前 node 有哪些版本,選最新的就行,現在是 13。

安裝 pm2

npm i pm2 -g

pm2 啟動站點

在項目根目錄執行:

pm2 start pm2.json

pm2 list檢查一下項目啟動情況 ,同時用curl localhost:3000看返回值:

同理,按上面步驟給Centos3和Centos4服務器都將服務部署起來。(記得改一下index.js中的Hello XXX方便後面驗證)。不出意外的話,我們的網站就分別運行在三台服務器的 3000 端口了:

192.168.0.2:3000 ==> Hello Centos2

192.168.0.3:3000 ==> Hello Centos3

192.168.0.4:3000 ==> Hello Centos4

有同學可能會問,為什麼 Centos2,Centos3,Centos4 不用裝 Nginx 的?在實際操作中,應用服務器其實是不用暴露在公網上的,它們與負載均衡服務器只需通過內網直接連接就可以了,這樣更安全;而我們的站點又是 Node 項目,本身就可以提供 Web 服務,所以不用再裝一個 Nginx 進行代理或轉發了。

二、搭建 Nginx Server

nginx 的安裝方法:Nginx Install。

在Centos1安裝好 nginx 就可以了。

三、實現負載均衡

一開始還沒了解過負載均衡時可能會覺得很難完全不知道是怎麼配的,然後接下來你會發現超級簡單,因為只需要 nginx 一個配置就可以了:upstream。

集群所有節點

我們將上面已經部署好的Centos2,Centos3,Centos4集群起來,nginx 配置類似下面這樣:

upstream APPNAME {
    server host1:port;
    server host2:port;
}

APPNAME可以自定義,一般是項目名。在/etc/nginx/conf.d新建一個upstream.conf:

upstream koa-loadbalance {
    server 192.168.0.2:3000;
    server 192.168.0.3:3000;
    server 192.168.0.4:3000;
}

這樣,我們已經將三台服務器集成為了http://koa-loadbalance的一個集群,下一步會使用它。

配置對外的站點

接下來是配置一個面向用戶的網站了,我們假設網站會使用www.a.com這個域名,在/etc/nginx/conf.d下新建a.com.conf:

server {
    listen 80;
    server_name www.a.com;
    charset utf-8;
    location / {
        proxy_pass http://koa-loadbalance; # 這裡是上面集群的名稱
    }
}

配置結束後記得nginx -s reload重啟一下,這樣就完成負載均衡的配置了。

四、測試

如果你的域名是真實的且已經解析到 nginx 服務器,則此時可以直接通過域名訪問了。由於筆者這裏用的是虛擬機,公網不可訪問,所以這裏配置一下宿主機的 host,使得www.a.com指向centos1服務器,然後在瀏覽器打開www.a.com就可以測試我們的負載均衡網站啦。Mac 系統上是sudo vi /etc/hosts,在最後面添加一行:

# IP是Centos1的ip
192.168.0.1 www.a.com

我們在瀏覽器訪問www.a.com,可以看到隨着不斷刷新,服務器返回了不同的Hello CentosX,說明我們的請求被分發到三台服務器上了,負載均衡的配置生效啦。

五、負載均衡的幾種策略

nginx 的 upstream 可以設置很多種負載均衡的策略,以下介紹幾個常用的策略。

輪詢(默認):每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器 down 掉,能自動剔除。

upstream test {
    server 192.168.0.2:3000;
    server 192.168.0.3:3000;
    server 192.168.0.4:3000;
}

指定權重 weight:指定輪詢幾率,weight 和訪問比率成正比,用於後端服務器性能不均的情況。

upstream test {
    server 192.168.0.2:3000 weight=5;
    server 192.168.0.3:3000 weight=10;
    server 192.168.0.4:3000 weight=20;
}

ip_hash:每個請求按訪問 ip 的 hash 結果分配,這樣每個訪客固定訪問一個後端服務器,可以解決 session 的問題。

upstream test {
    ip_hash;
    server 192.168.0.2:3000;
    server 192.168.0.3:3000;
    server 192.168.0.4:3000;
}

fair(第三方):按後端服務器的響應時間來分配請求,響應時間短的優先分配。

upstream test {
    server 192.168.0.2:3000;
    server 192.168.0.3:3000;
    server 192.168.0.4:3000;
    fair;
}

url_hash(第三方):按訪問 url 的 hash 結果來分配請求,使每個 url 定向到同一個(對應的)後端服務器,後端服務器為緩存時比較有效。

upstream test {
    server 192.168.0.2:3000;
    server 192.168.0.3:3000;
    server 192.168.0.4:3000;
    hash $request_uri;
    hash_method crc32;
}

更多的策略請參考:ngx_http_upstream_module,根據實際情況使用上面的這些策略,沒有特別需求就使用默認的輪詢方式也可以。

最後

從靜態站點到 node 站點,再到負載均衡,相信看完本文大家對整個前端的部署體系都有了一個比較全面的了解。特別是負載均衡,平時接觸得少總覺得特別複雜,其實看完了會覺得很簡單。更高級一些的部署可能會用上 Docker 或 k8s 的集群了,這個就留待後面再說啦。

對於部署方式的提效,本文也分享了一個使用rsync命令的腳步,配合package.json的 script,可以做到一個命令就完成部署的動作。

當然,該做法也還是有很大的優化空間的,真正好用的部署方式應該是持續集成,通過 Jenkins 或其他工具實現自動化部署,代碼 push 上去就自動構建和部署了。如果你的公司還在用最原始的部署方式,不妨加把勁多探索一些這些更爽更溜的操作啦。

原文:https://segmentfault.com/a/1190000021630358

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/7270

沐鳴註冊_那些程序員喜歡經常溜達的網站

github

如果說非要選一個網站來代表程序員的話,github一定是排在第一位的,這裡是開源的世界,這裡是代碼的世界,這裡是一個程序員展現自我的世界。如果你沒有聽過github,我估計你一定不是程序員,或者你就是一個假的的程序員。

cnblogs

這是程序員書寫心得的地方,這是程序員分享經驗的地方,通常人們不會直接訪問這裏,但是當人們在搜索某個問題的時候,總會不經意間路過這裏,而在這裏總能不經意間收穫滿滿。它的自定義主題樣式,讓它的界面清新簡潔,如果你會css,在這裏你可以打造任何你想要的效果。

stackoverflow

內事不明問度娘,外事不明問谷哥,程序不明問棧哥。作為專門程序的問答網站,它的回答幾乎可以解決你90%以上的問題,有人曾說過,過去是面向過程的編程,現在是面向對象的編程,未來就是面向搜索引擎的編程,在大數據的加持下,好多問題你都能在這裏得到解決。

v2ex

這是一個非常另類的網站,從它的名字你就能看出。同時它也是一個讓人又愛又恨的網站,喜歡它的人很喜歡,不喜歡的人也異常討厭它,它有着自己的用戶群體,在這裏你的思想總能獲得解放,你總能不經意間在這裏獲得到巨大提升。

Pinterest

不想當裁縫的廚師不是好司機,不想當設計的產品經理不是好程序員。作為一個程序員,我們也是有追求的,我們也會喜歡美的事物。作為一個免費的高清圖片網站,程序員們有時候也會去上面找幾個圖片作為編輯器的背景圖。

leecode

程序=數據結構+算法,那麼優秀的程序員一定是算法功底深不可測。如何提高自己的算法素養,leecode絕對是你最佳的選擇,如果你有過大廠面試經歷的話,你就會發現,好多面試官問的問題都出自leecode,所以平時多逛逛leecode,對一個程序員的素質提升絕對有幫助。

TED

學無止境,活到老學到老,作為一個程序員,我們不僅僅關注代碼,對世界的方方面面我們都很好奇,我們喜歡去聽別人的演講,在TED你總能不經意間拓寬自己的視野,生活不止眼前的苟且,還有詩和遠方。程序員的世界里也不止代碼,還有文人和科學。

其它

程序員不止一種,有做android的,有做ios的,有寫php的,有寫java的,每個語言都有自己官網,也都有自己的社區,有時候你會發現,正是這些形形色色的網站讓我們每個孤立的個體有了聯繫,如果你有珍藏的好的網站,歡迎你的分享。

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/8709

沐鳴註冊平台官網_讀懂Base64編碼

我們知道一個字節可表示的範圍是 0 ~ 255(十六進制:0x00 ~ 0xFF), 其中 ASCII 值的範圍為 0 ~ 127(十六進制:0x00 ~ 0x7F);而超過 ASCII 範圍的 128~255(十六進制:0x80 ~ 0xFF)之間的值是不可見字符。

ASCII(American Standard Code for Information Interchange,美國信息交換標準代碼)是基於拉丁字母的一套電腦編碼系統。它主要用於显示現代英語,而其擴展版本延伸美國標準信息交換碼則可以部分支持其他西歐語言,並等同於國際標準 ISO/IEC 646。

在 ASCII 碼中 0 – 31和 127 是控制字符,共 33 個。

其餘 95 個,即 32 – 126 是可打印字符,包括数字、大小寫字母、常用符號等。

當不可見字符在網絡上傳輸時,比如說從 A 計算機傳到 B 計算機,往往要經過多個路由設備,由於不同的設備對字符的處理方式有一些不同,這樣那些不可見字符就有可能被處理錯誤,這是不利於傳輸的。為了解決這個問題,我們可以先對數據進行編碼,比如 base64 編碼,變成可見字符,也就是 ASCII 碼可表示的可見字符,從而確保數據可靠傳輸。Base64 的內容是有 0 ~ 9,a ~ z,A ~ Z,+,/ 組成,正好 64 個字符,這些字符是在 ASCII 可表示的範圍內,屬於 95 個可見字符的一部分。

二、什麼是 base64

Base64是一種基於 64 個可打印字符來表示二進制數據的表示方法。由於 2⁶ = 64 ,所以每 6 個比特為一個單元,對應某個可打印字符。3 個字節有 24 個比特,對應於 4 個 base64 單元,即 3 個字節可由 4 個可打印字符來表示。相應的轉換過程如下圖所示:

Base64 常用於在處理文本數據的場合,表示、傳輸、存儲一些二進制數據,包括 MIME 的电子郵件及 XML 的一些複雜數據。在 MIME 格式的电子郵件中,base64 可以用來將二進制的字節序列數據編碼成 ASCII 字符序列構成的文本。使用時,在傳輸編碼方式中指定 base64。使用的字符包括大小寫拉丁字母各 26 個、数字 10 個、加號 + 和斜杠 /,共 64 個字符,等號 = 用來作為後綴用途。Base64 相應的索引表如下:

了解完上述的知識,我們以編碼 Man 為例,來直觀的感受一下編碼過程。 Man 由 M、a 和 n 3 個字符組成,它們對應的 ASCII 碼為 77、97 和 110。

接着我們以每 6 個比特為一個單元,進行 base64 編碼操作,具體如下圖所示:

由圖可知, Man (3字節)編碼的結果為 TWFu (4字節),很明顯經過 base64 編碼后體積會增加 1/3。 Man 這個字符串的長度剛好是 3,我們可以用 4 個 base64 單元來表示。但如果待編碼的字符串長度不是 3 的整數倍時,應該如何處理呢?

如果要編碼的字節數不能被 3 整除,最後會多出 1 個或 2 個字節,那麼可以使用下面的方法進行處理:先使用 0 字節值在末尾補足,使其能夠被 3 整除,然後再進行 base64 的編碼。

以編碼字符 A 為例,其所佔的字節數為 1,不能被 3 整除,需要補 2 個字節,具體如下圖所示:

由上圖可知,字符 A 經過 base64 編碼后的結果是 QQ== ,該結果後面的兩個 = 代表補足的字節數。而最後個 1 個 base64 字節塊有 4 位是 0 值。

接着我們來看另一個示例,假設需編碼的字符串為 BC ,其所佔字節數為 2,不能被 3 整除,需要補 1 個字節,具體如下圖所示:

由上圖可知,字符串 BC 經過 base64 編碼后的結果是 QkM= ,該結果後面的 1 個 = 代表補足的字節數。而最後個 1 個 base64 字節塊有 2 位是 0 值。

三、base64 編碼的應用

在 html 中嵌入 base64 編碼的圖片

在編寫 html 網頁時,對於一些簡單圖片,通常會選擇將圖片內容直接內嵌在網頁中,從而減少不必要的網絡請求,但是圖片數據是二進制數據,該怎麼嵌入呢?絕大多數現代瀏覽器都支持一種名為 Data URLs 的特性,允許使用 base64 對圖片或其他文件的二進制數據進行編碼,將其作為文本字符串嵌入網頁中。

<img alt="logo" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...">

但需要注意的是:如果圖片較大,圖片的色彩層次比較豐富,則不適合使用這種方式,因為該圖片經過 base64 編碼后的字符串非常大,會明顯增大 HTML 頁面的大小,從而影響加載速度。除此之外,利用 HTML FileReader API,我們也可以方便的實現圖片本地預覽功能,具體代碼如下:

<input type="file" accept="image/*" onchange="loadFile(event)">
<img id="output"/>
<script>
  const loadFile = function(event) {
    const reader = new FileReader();
    reader.onload = function(){
      const output = document.querySelector('output');
      output.src = reader.result;
    };
    reader.readAsDataURL(event.target.files[0]);
  };
</script>

在完成本地圖片預覽之後,可以直接把圖片對應的 Data URLs 數據提交到服務器。針對這種情形,服務端需要做一些相關處理,才能正常保存上傳的圖片,這裏以 Express 為例,具體處理代碼如下:

const app = require('express')();

app.post('/upload', function(req, res){
    let imgData = req.body.imgData; // 獲取POST請求中的base64圖片數據
    let base64Data = imgData.replace(/^data:image\/\w+;base64,/, "");
    let dataBuffer = Buffer.from(base64Data, 'base64');
    fs.writeFile("image.png", dataBuffer, function(err) {
        if(err){
          res.send(err);
        }else{
          res.send("圖片上傳成功!");
        }
    });
});

MIME(多用途互聯網郵件擴展)

在 MIME 協議之前,郵件的編碼曾經有過 UUENCODE 等編碼方式 ,但是由於 MIME 協議算法簡單,並且易於擴展,現在已經成為郵件編碼方式的主流,不僅是用來傳輸 8 位的字符,也可以用來傳送二進制的文件,如郵件附件中的圖像、音頻等信息,而且擴展了很多基於 MIME 的應用。

四、如何進行 base64 編碼和解碼

在 JavaScript 中,有兩個函數被分別用來處理解碼和編碼 base64 字符串:

  • btoa():該函數能夠基於二進制數據 “字符串” 創建一個 base64 編碼的 ASCII 字符串。
  • atob(): 該函數能夠解碼通過 base64 編碼的字符串數據。

btoa 使用示例

const name = 'Semlinker';
const encodedName = btoa(name);
console.log(encodedName); // U2VtbGlua2Vy

atob 使用示例

const encodedName = 'U2VtbGlua2Vy';
const name = atob(encodedName);
console.log(name); // Semlinker

對於 atob 和 btoa 這兩個方法來說,其中的 a 代表 ASCII,而 b 代表 Blob,即二進制。因此 atob 表示 ASCII 到二進制,對應的是解碼操作。而 btoa 表示二進制到 ASCII,對應的是編碼操作。在了解方法中 a 和 b 分別代表的意義之後,在以後的工作中,我們就不會用錯了。

五、總結

Base64 是一種數據編碼方式,目的是為了保障數據的安全傳輸。但標準的 base64 編碼無需額外的信息,即可以進行解碼,是完全可逆的。因此在涉及傳輸私密數據時,並不能直接使用 base64 編碼,而是要使用專門的對稱或非對稱加密算法。

原文 https://semlinker.com/master-base64/

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/7338

沐鳴首頁_Js常用的算法教程

深度遍歷

拿DOM作為遍歷對象,實現2種遍歷方法案例

/**
原理:節點的子節點先遍歷,再遍歷同級節點
node:一個節點
fn:每個節點需要執行的操作
**/
async deep(node,fn){
  await fn(node);
  if(node.children){
    for(let i=0;i<node.children.length;i++){
      await this.deep(node.children[i],fn);
    }
  }
}

廣度遍歷

/**
原理:節點的同級節點先遍歷,再遍歷子節點
node:一個節點
fn:每個節點需要執行的操作
**/
async wide(node,fn){
  let queue = [];
  queue.push(node);
  while (queue.length != 0) {
    let item = queue.shift();
    await fn(item);
    for (let j = 0; j < item.children.length; j++) {
      queue.push(item.children[j])
    }
  }
}

防抖

  • 原理:函數在調用倒計時n時間內沒有重複調用,則執行函數,不然重新倒計時
  • 應用場景:常用在鼠標滾動等一些超高頻操作下需要執行函數刷新時
function run(fn,ms){
  let tm=null;
  return function(){
    clearTimeout(tm);
    tm=setTimeout(()=>{
      fn.apply(this, arguments);
    },ms)
  }
}

節流

  • 原理:當函數未執行完前重複調用將無效
  • 應用場景:常用在定時刷新
function run(fn,ms){
  let canrun=true;
  return function(){
    if(!canrun)return;
    canrun=false;
    tm=setTimeout(()=>{
      fn.apply(this, arguments);
      canrun=true;
    },ms)
  }
}

優化版冒泡排序

/**
 特點:優化后遍歷次數可以較小,基本滿足前端常見排序要求了
 **/
function bubbleSort(arr) {
  let len = arr.length;
  let k = len - 1;
  let isSwap = false;//是否交換標記
  let pos = 0;//最後一次交換位置
  let temp = null;
  for (let i = 0; i < len; i++) {
    isSwap = false;
    pos = 0;
    for (let j = 0; j < k; j++) {
      if (arr[j] > arr[j + 1]) {
        temp = arr[j + 1];
        arr[j + 1] = arr[j];
        arr[j] = temp;
        pos = j;
        isSwap = true;
      }
    }
    if (!isSwap) { return arr; }
    k = pos;
  }
  return arr;
}

選擇排序

/**
特點:最大數據交換次數是固定的數組長度相等,遍歷次數永遠固定
 **/
function selectionSort(arr) {
  let len = arr.length;
  let minIndex, temp;
  for (let i = 0; i < len - 1; i++) {
    minIndex = i;
    for (let j = i + 1; j < len; j++) {
      if (arr[j] < arr[minIndex]) {   //尋找最小的數
        minIndex = j;         //將最小數的索引保存
      }
    }
    if(i!=minIndex){
      temp = arr[i];
      arr[i] = arr[minIndex];
      arr[minIndex] = temp;
    }
  }
  return arr;
}

快速排序

function quickSort(arr){  
  if (arr.length <= 1) {  
    return arr;  
  }  

  //取出數組中間的一位作為比較對象 如 [5,0,6,3,8] 則取出6,數組變為[5,0,3,8]
  var povitIndex = Math.floor(arr.length/2);  
  var povit = arr.splice(povitIndex, 1)[0];  

  //接下來就是遍歷[5,0,3,8]將比6小的數放入到leftArr,相反放入rightArr
  var leftArr = [], rightArr = [];  
  for (var i = arr.length - 1; i >= 0; i--) {  
    if (arr[i] < povit) {  
        leftArr.push(arr[i]);  
    } else {  
        rightArr.push(arr[i]);  
    }  
  }  
  //遍歷下來後生成了 leftArr[5,0,3],rightArr[8]

  //接下來遞歸調用,繼續將leftArr和rightArr這2個數組重複以上的操作
  //最終將leftArr+povit+rightArr 合併為一個數組即得最終排序后結果
  return quickSort(leftArr).concat([povit], quickSort(rightArr));  
}  


站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/7324

沐鳴登錄網站_Mac上程序員很喜歡用10大開發軟件

走進BAT,你們會發現,他們都喜歡使用Mac,Mac作為一個創作工具,一直深受程序員,教授,高科技行業從業者的喜歡。

Mac及佳的穩定性,也是用戶喜歡的一個主要原因,Mac可以讓你專註於創作,跟iPhone一樣,Mac沒有那麼多流氓軟件和彈窗。提高了我們工作效率。

Mac圍繞着創作的生態,也是Mac讓我撇開Windows沒有絲毫的不適應的關鍵,下面我為大家推薦一下Mac下常用10大軟件。

1.IDEA

作為Java開發者,從elipse,到MyElipse.到今天的IDEA,還是覺得IDEA為我們提供更加簡潔的開發方式。也是全球最受Java開發者歡迎的開發工具。從Maven的管理,到打包,到環境部署。都十分的方便。IDEA,同時也適合做vue,和Node.js的開發。

2.Pycharm

在Python大行其道的今天,Python遍全球,作為程序員,怎麼不會對它保持好奇心呢。pycharm自然是你上手Python最便捷的梯子。在pycharm上你幾乎可以忘掉終端指令,內嵌指令,和虛擬環境配置指令,一鍵生成,跟你構建Java項目一樣一鍵生成。點擊run既可以運行。

3.Navicat Premium

作為一個程序員來說,數據庫對於開發中起了至關重要的作用,一個好的數據庫管理工具。為我們的開發提供方便,Navicat Premium從剛開始全英文,到現在的中文,使用起來也是更加方便,在這個工具上你可以查看數據庫,建表操作,包括數據庫備份和導入一鍵搞定,你可以不用任何指令了。

4.Github Desktop

版本管理SVN,以及老去,Git已經成為版本管理主流了。如果到了今天還有程序員對於Git還一無所知的話。那就真的out啦。git確實有很多複雜的指令。確實我也是經常用到的時候去百度,上手Git版本的控制其實沒有那麼難,Github Desktop就為我們解決這個問題,你不用任何指令,在只需要在網頁創建好分支,選擇要給文件夾,點擊commit就可以push到遠程git服務器。跟很多人一樣,我當時用這款軟件知道,這個是幫我傳代碼到GitHub上,其實這款軟件支持所有私有的Git服務器,比如說碼雲和碼市。等等。全自動操作。

5.終端

終端,對於很多實用Mac的用戶,估計都沒有打開過,會不會使用終端,也是一個電腦專業級使用者和入門的使用者分水嶺了。終端對於Mac也是至關重要的。

1.終端是用戶和操作系統,進行專業級交互窗口。比如一些權限的控制,我們都可以通過終端來完成。

一些軟件啟動,尤其一些沒有用戶界面的軟件的啟動,比如說數據庫,Tomcat,Nginx,等等。

2.終端可以讓你我們去安裝各種軟件,軟件的操作和配置。終端簡單來說,就可以讓我們的Mac變身一台服務器,用好終端,可以說,你基本上不需要跑虛擬機。指令同根同源,嫣然就是一個Linux服務器跑在你的後台,數據庫軟件,Tomcat,Nginx,tornado,包括docker,都可以在終端完成。終端可以讓你Mac變身成為一個開發服務器來使用,並且性能可靠穩定。比所謂虛擬機的性能不知道要高多少。

3.終端同時也是你可以炫技的舞台,不用鼠標,查看各種文件。配置各種文件。終端簡直太好用了。

6.VMware Fusion

Vmware是最經典的虛擬機軟件。Mac開通虛擬機還是比較爽的。性能還是比較高的,尤其現在的Macbook pro都可以支持8核心,32G內存,虛擬機可以說可以大展拳腳的。想體驗原生的linux虛擬機,是一個不錯的選擇。Vm現在已經戴爾公司收購。經濟實力允許還是建議使用正版的。

7.Typora

作為程序員,還是需要經常的沖一下電,經常會看一下Markdown文檔,Typora應該很好的Markdown文檔閱讀器了。

8.Visual Studio for Mac

微軟這幾年一直在推動跨平台開發,Visual Studio除了支持了Java,python,C#等開發語言。還支持ios和安卓,當然對於他的了解確實並不是很深。對於微軟的生態這一塊,確實了解的不太深入。簡單的使用一下,感覺他支持同時支持安卓和ios,感覺還是很強大,一直聽程序員說Visual Studio是比較強大的IDE,有時間還是多了解一下。

9.xcode.

Xcode是蘋果公司的推出適應於ios平台和Mac上很強大的開發工具,他伴隨Mac和ios系統每一次更新和升級,Xcode提供了強大的模擬器。性能極佳。希望xcode能夠開發直接運行iPa的模擬器了。這樣可以讓Mac是娛樂性更好一些了。當然Xcdoe同時支持C,C++這也是一個學習C++,一個非常好用的IDE了。Xcode在安裝一些指令和編譯器上也起到很重要的作用。你在Xcode上可以開發iPhone,Apple Watch,Mac,iPad各種軟件,甚至遊戲的封包也可能會遇到他。

10.谷歌瀏覽器

谷歌瀏覽器已經成為全球份額很高的瀏覽器,一直深受前端開發者喜歡,調試前端的利器。最為一個程序員,還是需要一些前端 相關的知識。谷歌瀏覽器還是必備的軟件了。

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/7332

沐鳴平台_程序員可以為錢工作,但別為錢賣命

我知道有很多人進互聯網行業或者是成為程序員,都是為了心中的一廂熱情,或者是為了行業的高薪資,高福利等等。

但是實話說,從事程序員這一行業的大部分人,都是衝著錢來的,其中當然也有熱愛,但是恰飯顯然是更重要的,人為財死,鳥為食亡,這無可厚非。

大家也知道,程序員這一行吃的是青春飯,賺錢不易,高工資通常是要通過高強度的加班去換取的,很多程序員不得不過着前半生拿命換錢,後半生拿錢換命的生活。實際上,大多數人在後半生想拿錢換命的時候,會發現錢也不夠用了,那前面的努力豈不就功虧一簣了。

所以,互聯網行業里的工作壓力還是比較大的,上班幹活,下班睡覺,然後接着上班,這樣的工作生活循環,似乎是一個望不到邊際的無底洞。

要知道,大部分人在互聯網行業里的工作時間都超過了八小時,正常來說,按照人的人體機能,來看這麼長時間的高強度工作是不利於人體健康的,這還不算上加班熬夜的情況。

咱雖然是拿命在拚命賺錢,其實大家心裏也不希望真的拿命去換錢。出來混,遲早都要還的。

如何改變現狀,我覺得有幾點大家可以參考一下。

保持身體健康。都說健康是人這輩子所有財富的第一位數,保護好自己的健康才是你需要了解的第一要義,如果健康都保不住,那麼你賺了那麼多錢,又有什麼用呢,現在你所努力的職場,你離開之後仍然可以非常正常地運轉,並不會因為少了你大家就會心神不寧,或者是無法繼續運作。大家在入門門]學習前端的過程當中有遇見任何關於學習,行業方面的問題,都可以申請加入我的前端學習扣扣裙。缺乏相關的基礎教程也可以直接來找我要,我這裏整理了-套最新的前端基礎教程,學習前端的這個過程當中我也收集了很多前端學習手冊,面試題,開發工具,PDF文檔書籍教程,可以直接分享給你們。282549184

特別是在大公司,這樣的情況尤其普遍,要麼為什麼說大公司里的程序員都是螺絲釘。

公司多你一個不多,少你一個不少。而對你自己來說,只有當你有了健康,你才有奮鬥的意義,或者說是奮鬥的基礎,不管你在哪家公司,自己的健康一定是第一位的。

對於程序員來說,一定要把時間用在刀刃上,加班一定要做實事。工作上,多學習,多努力,讓自己變得更加強大,不用依附於某個公司或者是團體,以後才有機會獲得更遠的發展,你也不能僅僅滿足於當下的現狀,你應該多去開拓自己的渠道,發展自己的技能。

只有磨練多年後,你才能夠給自己的職業生涯交出一份滿意的答卷。你可能不一定要升職加薪,但你一定要學有所成,你可以把之前積累的能力用到下一家公司,或者是自己的事業上,學習永遠不晚,努力永遠不會欺騙你。

我相信一切都是會變好的。有時候,如果你能在職場上,或者行業上積累足夠的經驗和能力,那麼你的辛苦也不會白費。馬雲說過,一般員工離開一家公司就那麼幾個原因,要麼就因為錢沒給到位,要麼就是心裏委屈,確實是句大實話。

作者:web小猿

鏈接:https://www.jianshu.com/p/abd3a349640a


站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/7323