助美成天然氣出口大國的崔石比克能源 聲請破產保護_租車

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

摘錄自2020年6月29日聯合報報導

紐約時報報導,美國頁岩油業先行者崔石比克能源公司(Chesapeake Energy)周日(28日)聲請破產保護,十年來的低油價使其再也無法承擔堆積如山的債務。

崔石比克在共同創辦人和前任執行長Aubrey McClendon的領導下,讓美國由天然氣進口國轉變為出口大國。但Aubrey McClendon在2013年被迫離職之前過度擴張公司,累積下超過2000萬美元的債務。

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

該公司今年第一季度虧損83億美元,截至3月底止,僅剩8200萬美元現金。去年底的債務總額為95億美元,8月即將有1.92億美元債券到期。崔石比克發表聲明說,該公司已通過循環信貸機制取得了9.25億美元融資,取消約70億美元的債務。另獲得了增資6億美元的承諾。

能源議題
能源轉型
國際新聞
美國
破產
天然氣

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

Razer 展示 Project Hazel 概念,號稱全球最智慧口罩_租車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

今天(1/13) Razer 在官網上發表了一款號稱全球最智慧的口罩「Project Hazel 」,雖然只是概念品,但對於疫情期間又不甘跟別人一樣的人們來說的確具有相當大的吸引力,對筆者這個悶騷個性的人來說更是有種躍躍欲試的感覺,你以為它只是口罩?不,它還會發光跟濾淨空氣呢!

Razer 展示 Project Hazel 概念,號稱全球最智慧口罩

外型上,Project Hazel 效法 N95 口罩,具備光滑、防水、耐磨的再生塑膠透明外殼搭配矽膠護照,與臉部緊密貼合,可重複使用,當你與他人對話時,還能讓對方看到你的嘴型與完整面部表情。在 Project Hazel 上還內建有麥克風與喇叭,可以確保對話時的聲音能夠讓對方清晰聽見;在口罩上還配有光感應器,當處於較暗環境中時,內部的燈光會自動點亮,以便讓別人看見你的臉孔,當然這個色光也能透過 Razer Chroma RGB 軟體來自定顏色。

在口罩外的兩側配置了兩個圓形區塊,它們主要的功能是用來使空氣流通,利用主動式圓形通風裝置,將呼出的二氧化碳排出,並且對吸入的空氣加以過濾,根據 Razer 說法,內部可替換的過濾裝置預計可過濾至少 95% 的微粒,且具備有高度細菌過濾效果,因為具防水性,自然也能防止液體、口水噴濺。在圓形區塊上還配有 RGB 色光,光是這點就足夠讓你與眾不同了。

隨著口罩本體,還附有一個內部配置紫外光燈的充電收納盒,當你將口罩放入其中時,可自動消滅附著在口罩上的細菌與病毒。這款概念產品目前還沒有上市相關資訊,對於必要的送審與核准當然也還沒有進行,但如果順利量產的話,似乎很值得入手啊!

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

數據分析 | 數據可視化圖表,BI工具構建邏輯_潭子電動車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

本文源碼:GitHub·點這裏 || GitEE·點這裏

一、數據可視化

1、基礎概念

數據可視化,是關於數據視覺表現形式的科學技術研究。其中,這種數據的視覺表現形式被定義為,一種以某種概要形式抽取出來的信息,包括相應信息單位的各種屬性和變量。

如果說的實際貼切的話:系統開發中常見的數據報表統計,將數據用圖表或表格的形式呈現出來,幫助運營或者決策人員了解這些數據的規律或者價值,就是簡單的可視化應用。

從開發角度來看,把系統中的核心數據,用一定的手段進行統計,在藉助一些精美的圖表樣式,展示出來,或者把一系列圖表組裝成一個數據大屏,格調十足。

但是從運營人員的角度看,更多的是藉助可視化數據分析業務場景,得到有價值的參考數據,為後續的決策或者開展活動提供指導。所以隨着業務線的不斷髮展,對數據分析的要求越來越高,也就誕生現在比較常見的BI分析工具和BI分析師。

2、數據可視化價值

  • 準確高效直觀的傳遞傳遞數據中的規律和信息;
  • 實時監控系統各項數據指標,實現數據的自解釋;
  • 基於可視化洞察數據規律,指定精準的運營策略;

3、基礎構建原則

簡單的步驟如下:基於業務需求,完成可視化數據處理(收集,規則,定時任務等)。藉助常用的圖表進行組合展示,但是也有一些注意事項如下:

  • 可視化的數據要關聯核心的有業務價值的數據;
  • 圖表的展現注意簡單,明了,圖表的本質就是讓數據更直觀;
  • 不要為了追求系統花哨,可以大批量添加圖表;

二、常用圖表設計

1、常見基礎圖表

柱狀圖

特點:一般展現分組數據,直觀展示各組數據差異,例如常見以每周,每月,或者不同客戶端劃分為軸的數據。

折線圖

特點:重點展現數據的變化趨勢,常見以時間為軸,展示時間下的數據趨勢。

餅狀圖

特點:不注重數據明細,強調數據中各項佔總體的百分比,或者分佈情況,注重模塊模塊之間的對比。

漏斗圖

特點:強調數據之間的轉化關係和遞進規律,經典常見就是用戶瀏覽量,點擊量,到訂單支付數量。

組合圖

特點:多種基礎圖表組合,某些特殊業務數據,需要結合兩種圖或者更多種圖表,強調裝載該業務報表的關鍵組合信息。

2、數據大屏

顧名思義,放在大屏幕的報表,一般有多種豐富的業務數據,自然需要多種報表展現形式,比較有立體感和視覺上的衝擊力。

絮叨一句:數據大屏在更多時候所追求的是讓人印象深刻,這才是最關鍵的,懂的都懂。

三、常用統計方式

1、SQL分析語句

在報表類業務中,經常使用SQL分析語句,常用的幾個方法:

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

  • count:數據求和,求總數,例如多少用戶;
  • sum:求和函數,例如總銷量,總成本等;
  • group-by:分組統計,分組結果就是軸標識;
  • average:平均值計算,例如平均每天銷量;

業務類的報表雖然複雜,但是報表相關的數據接口相對而言簡單,基於一些基礎的統計SQL,生成報表數據。

2、基礎案例

產品和緯度表

CREATE TABLE `vc_product_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
  `product_sort` varchar(20) DEFAULT '' COMMENT '產品分類',
  `product_name` varchar(50) DEFAULT '' COMMENT '產品名稱',
  `inventory` int(11) DEFAULT '0' COMMENT '庫存剩餘',
  `price` decimal(10,2) DEFAULT '0.00' COMMENT '單價',
  `total_sales` int(11) DEFAULT '0' COMMENT '銷售總量',
  `sales_amount` decimal(10,2) DEFAULT '0.00' COMMENT '銷售總額',
  `create_time` datetime DEFAULT NULL COMMENT '創建時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='產品信息表';

CREATE TABLE `vc_product_detail` (
	`id` INT (11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
	`product_id` INT (11) NOT NULL COMMENT '產品ID',
	`place_origin` VARCHAR (50) DEFAULT '' COMMENT '產品產地',
	`weight` DECIMAL (10, 2) DEFAULT '0.00' COMMENT '重量',
	`color` VARCHAR (50) DEFAULT '' COMMENT '顏色',
	`high_praise` INT (11) DEFAULT '0' COMMENT '好評數量',
	`low_praise` INT (11) DEFAULT '0' COMMENT '差評數量',
	`create_time` datetime DEFAULT NULL COMMENT '創建時間',
	PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '產品維度表';

基礎查詢語句

<mapper namespace="com.visual.chart.mapper.ProductInfoMapper">

    <!-- 商品種類 -->
    <select id="countNum" resultType="java.lang.Integer">
        SELECT COUNT(product_name) FROM vc_product_info
    </select>

    <!-- 銷售總額度 -->
    <select id="sumAll" resultType="java.lang.Double">
        SELECT SUM(sales_amount) FROM vc_product_info
    </select>

    <!-- 分組求和 -->
    <select id="groupSum" resultType="java.util.Map">
        SELECT product_sort,SUM(sales_amount) FROM vc_product_info GROUP BY product_sort
    </select>

    <!-- 平均單價 -->
    <select id="average" resultType="java.lang.Double">
        SELECT AVG(price) FROM vc_product_info
    </select>
</mapper>

四、自定義工具

1、數據集

數據集概念

DataSet是一個數據的集合,通常以列表形式出現。每一列代表一個特定變量。每一行都對應於某一成員的數據集的問題。在統計分析的業務中,通常稱為大寬表,方便業務分析。

數據集生成

視圖方式

基於視圖的方式,生成一個單表的數據集,方便簡化操作。該方式不提倡,視圖在大部分公司里是禁止使用的,這裏只是單純演示。

基於上述產品信息表和維度表,通過視圖手段生成數據集,單純為了簡化業務分析的操作難度,因為多表聯合簡化成感覺上的單表。

CREATE OR REPLACE 
VIEW data_set_view AS SELECT
	t1.*, t2.place_origin,
	t2.weight,
	t2.color,
	t2.high_praise,
	t2.low_praise
FROM vc_product_info t1
LEFT JOIN vc_product_detail t2 ON t1.id = t2.product_id

任務方式

通過定時任務,獲取要分析的數據結構,不斷注入到分析表中,這是業務開發中最常見的報表數據集生成方式,有的甚至通過定時任務直接統計出報表需要的數據,不適應於大數據場景。

離線或實時計算

通過大數據分析手段,離線計算或者實時計算,獲取業務報表數據,注入OLAP實時分析計算庫,使用大數據分析場景。

2、定製化BI工具

BI工具可以快速對業務數據進行有效的整合,快速準確的提供報表並提出決策依據,幫助企業做出明智的業務經營決策。商業智能的概念最早在1996年提出。當時將商業智能定義為一類由數據倉庫(或數據集市)、查詢報表、數據分析、數據挖掘、數據備份和恢復等部分組成的、以幫助企業決策為目的技術及其應用。

基本搭建思路:

  • 管理數據源,建立數據表之間關係,維護特定數據集;
  • 創建可拖拉拽的報告面板,用來承載單個圖表組合;
  • 封裝不同的圖表的處理邏輯,規則展示,關聯數據集字段;
  • 封裝圖表樣式,例如大小、顏色、背景、交互等可配置;
  • 圖表關聯分析數據集,報告面板組合多個圖表生成報告;

實際的開發過程是非常複雜的,管理各個業務線的數據源,聯合分析,適配各種圖表規範和樣式,都是一個十分漫長的過程。

3、基礎案例

接口入參

承接上述業務場景,這裏參數都需要動態傳入,例如操作的:數據集、圖表、參數歸屬軸、或者業務產品參數等。

@RestController
public class DefineController {

    @Resource
    private DataSetService dataSetService ;
    /**
     * 自定義可視化報告入參
     */
    @GetMapping("/getDefChart")
    public Map<Integer, List<ChartParam>> getDefChart (){
        List<ChartParam> chartParamList = new ArrayList<>() ;
        chartParamList.add(new ChartParam("X",1,"data_set_view","product_sort")) ;
        chartParamList.add(new ChartParam("X",1,"data_set_view","product_name")) ;
        chartParamList.add(new ChartParam("Y",2,"data_set_view","high_praise")) ;
        chartParamList.add(new ChartParam("Y",2,"data_set_view","low_praise")) ;
        chartParamList.add(new ChartParam("Z",3,"data_set_view","inventory",1)) ;
        chartParamList.add(new ChartParam("Z",3,"data_set_view","total_sales",1)) ;
        return dataSetService.analyData(chartParamList);
    }
}

參數解析

根據各種動態參數,解析查詢條件,獲取查詢結果。

@Service
public class DataSetServiceImpl implements DataSetService {

    @Resource
    private DataSetMapper dataSetMapper ;
    // 分析任務劃分
    @Override
    public Map<Integer, List<ChartParam>> analyData(List<ChartParam> chartParamList) {
        Map<Integer, List<ChartParam>> dataMap = chartParamList.stream()
                                                 .collect(Collectors
                                                 .groupingBy(ChartParam::getDataType));
        for (Integer dataType:dataMap.keySet()){
            switch (dataType){
                case 1: // Count 風格數據
                    taskCount(dataMap.get(dataType));
                    break;
                case 2: // Sum 風格數據
                    taskSum(dataMap.get(dataType));
                    break;
                case 3: // Percent 風格數據
                    taskPercent(dataMap.get(dataType));
                    break;
                default:
                    break;
            }
        }
        return dataMap ;
    }
    // Count 數據執行
    private void taskCount (List<ChartParam> chartParamList){
        for (ChartParam chartParam:chartParamList){
            chartParam.setResultNum(dataSetMapper.taskCount(chartParam.getColumnName(),
                                                            chartParam.getTableName()));
        }
    }
    // Sum 數據執行
    private void taskSum (List<ChartParam> chartParamList){
        for (ChartParam chartParam:chartParamList){
            chartParam.setResultNum(dataSetMapper.taskSum(chartParam.getColumnName(),
                                                          chartParam.getTableName()));
        }
    }
    // Percent 數據執行
    private void taskPercent (List<ChartParam> chartParamList){
        for (ChartParam chartParam:chartParamList){
            chartParam.setResultNum(dataSetMapper.taskPercent(chartParam.getColumnName(),
                                                              chartParam.getTableName(),
                                                              chartParam.getProductId()));
        }
    }
}

總結一句:數據可視化工具建設是個漫長過程,不僅僅可以分析自己公司的業務,也可以作為開放BI工具產生價值。

五、源代碼地址

GitHub·地址
https://github.com/cicadasmile/data-manage-parent
GitEE·地址
https://gitee.com/cicadasmile/data-manage-parent

推薦閱讀:《架構設計系列》,蘿蔔青菜,各有所需

序號 標題
01 架構設計:單服務.集群.分佈式,基本區別和聯繫
02 架構設計:分佈式業務系統中,全局ID生成策略
03 架構設計:分佈式系統調度,Zookeeper集群化管理
04 架構設計:接口冪等性原則,防重複提交Token管理
05 架構設計:緩存管理模式,監控和內存回收策略

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

Python編程思想(3):数字及其相關運算_包裝設計

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

Python 提供了三種數值類型:int(整型),float(浮點型)和complex(複數)。

  • int:通常被稱為整型或者整數,如200、299、10都屬於整型;
  • float:浮點數包含整數和小數部分,如3.1415926,2.71828都屬於浮點數;
  • complex:複數包含實數部分和虛數部分,形如 a+bj,其實部和虛部都是浮點類型;

需要注意的是,Python3 已經廢棄了 Python2 的 Long(長整型),在 Python3 中,int 的大小沒有限制,可以作為 Long 使用。這也是為什麼Python非常適合科學計算的原因,因為Python可以處理無限大的整數。在Python中進行數值運算,並不需要考慮溢出問題,因為Python的數值永遠不會溢出。  
1. 數值類型之間的轉換   Python 的三種數值類型可以進行相互轉換,轉換方式為:数字類型+圓括號,如下實例:

a = 456
b = 2.71828
print("int(b)=",int(b))
print("float(a)=",float(a))
print("complex(a)=",complex(a))
print("complex(a,b)=",complex(a,b))

執行結果如下圖所示:    
2. 常用的數學函數   Python 提供了豐富的數學函數以降低編程實現的難度,本問將介紹一些常用的函數。

import math
#求絕對值:abs(x)
print("abs(-200)=",abs(-200))

#向上取整:ceil(x)
print("ceil(3.1415)=",math.ceil(3.1415))

#向下取整:floor(x)
print("floor(3.678)=",math.floor(3.678))

#四舍五入:round(x)
print("round(3.678)=",round(3.678))

#乘方運算:pow(x,y),x的y次方
print("pow(3,4)=",pow(3,4))

#求平方根:sqrt(x)
print("sqrt(144)=",math.sqrt(144))

執行結果如下圖所示:

 
3. 運算符   計算機的最基本用途之一就是執行數學運算,作為一門計算機編程語言,Python 也提供了一套豐富的運算符來滿足各種運算需求。 Python 運算符主要可以分為6種:算術運算符、比較運算符、賦值運算符、邏輯運算符、位運算符和成員運算符。  
(1)算術運算符 對於算術運算,大家並不陌生,常用的加減乘除就是算術運算。不過,在編程語言里,算術運算符特殊一些,Python 中的算術運算有7種:加(+)、減(-)、乘( * )、除(/)、取模(%)、冪運算( ** )和取整預算(//)。以下通過實例演示算術運算符的用法。

#初始化測試數據
x = 30
y = 24
z = 12
#分別進行7種算術運算
z = x + y
print("x + y =", z)
z = x - y
print("x - y =", z)
z = x * y
print("x * y =", z)
z = x / y
print("x / y =", z)
z = x % y
print("x % y =", z)
z = x ** y
print("x ** y =", z)
z = x // y
print("x // y =", z)

執行結果如下圖所示:

 

  (2)比較運算符

比較無處不在,大於、小於、等於、不等於……和 C/C++、Java 等編程語言一樣,Python 也提供了6種比較運算符:>(大於),<(小於),==(等於),!=(不等於),>=(大於等於),<=(小於等於)。比較運算的結果是一個布爾值,True 或者 False,看下面的案例代碼:

# 初始化變量
x = 12
y = 7
#分別進行6種比較運算
print("x == y:", x == y)
print("x != y:", x != y)
print("x > y:", x > y)
print("x < y:", x < y)
print("x >= y:", x >= y)
print("x <= y:", x <= y)

執行結果如下圖所示:  
(3)賦值運算符 其實在前面的代碼中已經用到賦值運算,如 x = 12,就是一個最簡單的賦值運算,“=”就是最簡單的賦值運算符。將簡單的賦值運算與算術運算結合,Python 形成了更豐富的賦值運算符:+=、-=、=、/=、%=、*=、//=。看下面的案例代碼:

#初始化變量
x = 12
y = 21
#分別進行7種賦值運算
y = x
print("y = x, y =", y)
y += x
print("y += x, y =", y)
y -= x
print("y -= x, y =", y)
y *= x
print("y *= x, y =", y)
y /= x
print("y /= x, y =", y)
y **= x
print("y **= x, y =", y)
y //= x
print("y //= x, y =", y)

執行結果:

 

 

(4)邏輯運算符 所謂邏輯運算,就是:與、或、非。Python 中的3種邏輯運算符分別為:and(與),or(或),not(非),邏輯運算的結果是布爾值:True 或者 False。

  1. A and B:當A和B有一個為False時,結果就為False,只有A和B都為True時,結果才為True;
  2. A or B:只有當A和B都是False時,結果才為False,只要有一個為True,結果就為True;
  3. not A:當 A 為 True 時,返回 False,否則返回 True。

看下面的案例:

#初始化變量
a = 2
b = 3
c = 5
#分別執行3種邏輯運算
print("a>b and a<c :", a>b and a<c)
print("a<b and c :", a<b and c)
print("a>b or c :", a>b or a<c)
print("a<b or c :", a<b or c)
print("a or a<c :", a or a<c)
print("not a :", not a)
print("not a<b :", not a<b)

執行結果如下圖所示:

※產品缺大量曝光嗎?你需要的是一流包裝設計!

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

 
(5)位運算符 程序中的所有數值在計算機內存中都是以二進制的形式儲存的。位運算就是直接對整數在內存中的二進制位進行操作。Python 中有6種位運算符:

  • &:按位與,參与運算的兩個值,如果兩個相應位都為1,則該位的結果為1,否則為0;
  • |:按位或,只要對應的2個二進位有一個為1時,結果位就為1;
  • ^:按位異或,當兩對應的二進位相異時,結果為1;
  • ~:按位取反,對數據的每個二進制位取反,即把1變為0,把0變為1;
  • >>:按位右移,將>>左側的數按位向右移動>>右邊的數指定的位;
  • <<:按位左移,將<<左側的數按位向左移動<<右邊的數指定的位;

看下面的案例代碼:

a = 21
b = 6
print('a & b = ',a & b)
print('a | b = ',a | b)
print('a ^ b = ',a ^ b)
print('~a = ',~a)
print('a << 2 = ',a << 2)
print('a >> 2 = ',a >> 2)

執行結果如下圖所示:

 

 

 這裏講a=21,b=6,轉換為二進制如下:

a = 0001 0101
b = 0000 0110

a&b = 0000 0100
a|b = 0001 0111
a^b = 0001 0011
~a = 1110 1010
a<<2 = 01010100
a>>2 = 0000 0101

(6)成員運算符 除了前面介紹的5種運算符,Python 還支持成員運算符。介紹成員運算符之前,我們需要提前了解一個概念:數據結構,如字符串、列表、元組、字典。在接下來的文章中我們將詳細介紹這些基礎的數據結構。字符串、列表、字典,它們就像一個集合,其中包含若干元素,這些元素就是集合的成員;對於一個給定的元素,它有可能在一個給定的集合中,也可能不在,Python 中採用成員運算符來判斷元素是否屬於成員,成員運算的結果為布爾值,True 或者 False。 看下面的代碼:

#初始化字符串和列表
temp1 = "abcdefg"
temp2 = [4,2,3,5,8,9]
a = "cdf"
b = 5
c = "cde"
print("a in temp1?", a in temp1)
print("b in temp2?", b in temp2)
print("c in temp1?", c in temp1)

  執行結果如下圖所示:    

 

 

 

 

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

支援 M1 Mac 的 Microsoft Edge Beta 預覽版來囉_網頁設計公司

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

換了 Apple M1 Mac 後還暫時找不到可以代替 Chrome 的瀏覽器?還是你還不知道為什麼大家最近都考慮把 Chrome 斷個乾淨(傳送門低家啦)?總而言之,隨著 Google 將對三方 Chromium 瀏覽器祭出的私有 Chrome API 限制政策後,眼看之後比較能接近 Chrome 的瀏覽器就剩下微軟的 Edge 了。但剛買 M1 MacBook Air / M1 MacBook Pro / M1 Mac mini 的你,卻不太想安裝 Canary / Dev 版本的 Edge?現在,更接近正式版的預覽版本也許真的可以成為屬於你的及時雨。繼續閱讀支援 M1 Mac 的 Microsoft Edge Beta 預覽版來囉報導內文。

▲圖片來源:Microsoft

M1 Mac 版 Microsoft Edge Beta 預覽版來囉,不趁 Keystone 換個瀏覽器?

▲圖片來源:Microsoft

眼看 Google 還沒打算將「壞壞」的 Keystone 從 Chrome 中排除,早已經習慣使用以 Chromium 為基礎所打造的瀏覽器的你,更因為剛換到 M1 Mac 而苦尋不找可以長久使用下去的替代瀏覽器(如果不是 Keystone 相信大家也不會想要一直換)。

雖說直接切換到了原本工作專用的 Firefox 的小編自己是用的很開心啦,但顯然許多人應該都把希望放在了先前已經宣佈,將會推出 Apple Silicon 版本 Edge 瀏覽器的微軟身上。

▲圖片來源:Microsoft

現在雖說正式版本還沒推出,但也真的只差一步之遙的 Microsoft Edge Beta 預覽版,倒是已經開放在 Insider 頻道提供下載了(點我前往頁面)。雖然名為 Beta,但它相對每日 / 每週更新的 Canary / Dev 版本,是以 2 個月為更新週期,雖說穩定度仍然有疑慮,但相對來講已經是最接近正式版本的了。

所以如果你已經等不及想跳槽或想試試微軟的 Edge 瀏覽器,在 M1 Mac 上是否有更強悍的表現的話(應該會吧,畢竟少了 Keystone ~ 嗯… 好地獄的梗),那可以考慮安裝 Beta 版本試試囉。

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

本篇圖片 / 引用來源

延伸閱讀:

好用的 Chrome 為何炎上被抵制?神人直指「它壞壞」還做了個懶人包網頁

借鑑食品、飲料等產業 Tesla 電池生產影片大公開,看了覺得莫名療癒…

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

一文帶你了解js數據儲存及深複製(深拷貝)與淺複製(淺拷貝)_租車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

背景

在日常開發中,偶爾會遇到需要複製對象的情況,需要進行對象的複製。

由於現在流行標題黨,所以,一文帶你了解js數據儲存及深複製(深拷貝)與淺複製(淺拷貝)

理解

首先就需要理解 js 中的數據類型了
js 數據類型包含

  1. 基礎類型:StringNumbernullundefinedBoolean以及ES6引入的Symboles10中的BigInt
  2. 引用類型:Object

由於 js 對變量的儲存是棧內存堆內存完成的。

  • 基礎類型將數據保存在棧內存
  • 引用類型將數據保存在堆內存

由於 js 在數據讀取和寫入的時候,對基礎類型是直接讀寫棧內存中的數據,引用類型是將一個內存地址保存在棧內存中,讀寫都是修改棧內存中指向堆內存的地址

以如下代碼為例

let obj = {
  a:1,
  arr:[1,3,5,7,9],
  b:2,
  c:{
    num:100
  }
}
let num = 10

在內存中的表現為

我們聲明個obj1

let obj1 = obj;
console.log(obj1 == obj);//true

因為這個賦值,把內存變成了這樣

然後,內存中只是給js棧內存新增了一個指向堆內存的地址而已,這種就叫做淺複製。因為如圖可以看到,如果我們修改obj.a的話,實際修改的是堆內存0x88888888中的變量a,由於obj1也指向這個地址,所以obj1.a也被修改了

深複製是指,不單單複製引用地址,連堆內存都複製一遍,使objobj1不指向同一個地址。

代碼

分開來看深複製淺複製

淺複製

由上述圖可知,淺複製只是複製了堆內存的引用地址,通常在業務需求中出現的淺複製是指複製引用對象的第一層,也就是,基本類型複製新值,引用類型複製引用地址

淺複製可以使用的方案有循環賦值擴展運算符object.assign(),

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

let obj = {
  a:1,
  arr:[1,3,5,7,9],
  b:2,
  c:{
    num:100
  }
}
function clone1(obj){ // 使用循環賦值
  let b = {};
  for(let key in obj){
    b[key] = obj[key]
  }
  return b
}
function clone2(obj){ // 使用擴展運算符
  let b = {
    ...obj
  };
  return b
}
function clone3(obj){ // 使用object.assign()
  let b = {};
  Object.assign(b,obj)
  return b
}
let obj1 = clone1(obj);
let obj2 = clone2(obj);
let obj3 = clone3(obj);

console.log(obj1 === obj); //false 代表複製成功了
console.log(obj2 === obj); //false 代表複製成功了
console.log(obj3 === obj); //false 代表複製成功了
console.log('obj0.c.num修改前',obj.c.num); //100
console.log('obj1.c.num修改前',obj1.c.num); //100
console.log('obj2.c.num修改前',obj2.c.num); //100
console.log('obj3.c.num修改前',obj3.c.num); //100
obj0.c.num = 555;
console.log('obj0.c.num修改后',obj.c.num); //555
console.log('obj1.c.num修改后',obj1.c.num); //555
console.log('obj2.c.num修改后',obj2.c.num); //555
console.log('obj3.c.num修改后',obj3.c.num); //555

由於是淺複製,所以引用類型只是複製了內存地址,修改其中一個對象的子屬性后,引用這個地址的值都會被修改。

淺克隆圖解如下

深複製

由於淺複製只是複製第一層,為了解決引用類型的複製,需要使用深複製來完成對象的複製,基本類型複製新值,引用類型開闢新的堆內存

深複製可以使用的方案有JSON.parse(JSON.stringify(obj))循環賦值

JSON.parse(JSON.stringify(obj))

let obj = {
  a:1,
  arr:[1,3,5,7,9],
  c:{
    num:100
  },
  fn:function(){
     console.log(1)
  },
  date:new Date(),
  reg:/\.*/g
}
function clone1(obj){ // 使用JSON.parse(JSON.stringify(obj))
  return JSON.parse(JSON.stringify(obj))
}
let obj1 = clone1(obj);
console.log(obj === obj1); //false 代表複製成功了
obj.c.num = 555;

console.log(obj.c.num,obj1.c.num) // 555,100

看起來是複製成功了!!~地址也變了,修改obj,obj1的引用地址不會跟着變化。

但是我們來console一下obj以及obj1

console.log(obj)
console.log(obj1)

似乎發現了離奇的事情,只有obj.a以及obj.c正確的複製了,日期類型方法正則表達式均沒有複製成功,發生了一些奇怪的事情

循環賦值 deepClone

那麼為了解決這種事情,就需要寫一個deepClone方法來完成深複製了,參考了許多開源庫的寫法,將所有的複製項單獨拆出,方便未來對特殊類型進行擴展,也防止不同功能間的變量互相干擾

 //既然是深複製,一定要傳入一個object,再return 一個新的 Object
function deepClone(obj){
    let newObj;
    if(obj instanceof Array){ // 數組的話,要new一個數組
      newObj = []
    }else if(obj instanceof Object){  // 對象的話,要new一個對象
      newObj = {}
    }
    if(obj === null) {
      return cloneNull(obj)
    }
    if(typeof obj=='function'){
        return cloneFunction(obj)
    }
    if(typeof obj!='object') {
        return cloneOther(obj)
    }
    if(obj instanceof RegExp) {
        return cloneRegExp(obj)
    }
    if(obj instanceof Date){
        return cloneDate(obj)
    }
    if(obj instanceof Array){
        for(let index in obj){
            newObj[index] = deepClone(obj[index]); // 對數組子項進行複製
        }
    }
    if(obj instanceof Object){
        for(let key in obj){
            newObj[key] = deepClone(obj[key]); // 對對象子項進行複製
        }
    }
    return newObj;
}
function cloneNull(obj){ // 複製NULL
  return obj
}
function cloneFunction(obj){ // 複製方法,
  // 複製一個新方法,將原方法轉成字符串,並new一個新的function
  return new Function('return '+obj.toString())()
}
function cloneOther(obj){ // 複製非對象的數據
  return obj
}
function cloneRegExp(obj){ // 複製正則對象
  return new RegExp(obj)
}
function cloneDate(obj){ // 複製日期對象
  return new Date(obj)
}

這樣一個基本上滿足功能的深複製就完成了。先測試一下

let obj = {
  a:1,
  arr:[1,3,5,7,9],
  c:{
    num:100
  },
  fn:function(){
     console.log(1)
  },
  date:new Date(),
  reg:/\.*/g
}

let obj1 = deepClone(obj);
console.log(obj.c === obj1.c); // false  代表複製成功
console.log(obj.fn === obj1.fn);// false  代表複製成功 
console.log(obj.date === obj1.date);// false  代表複製成功
console.log(obj.reg === obj1.reg);// false  代表複製成功

console一下

console.log(obj)
console.log(obj1)

這樣,就完成了deepClone深複製方法

經過深複製后,圖解如下

優化 deepClone

上述代碼還有優化空間,參考了lodash庫,在進行 new 對象時,可以使用 constructor構造函數 來進行創建新的實例,這樣

  1. 可以不用判斷遞歸中,是數組還是對象
  2. 如果深複製的某一項是某個原型的實例,深複製完成后,依然是該原型的實例
function deepClone(obj){
    let newObj = new obj.constructor;
    if(obj === null) {
      return cloneNull(obj)
    }
    if(typeof obj=='function'){
        return cloneFunction(obj)
    }
    if(typeof obj!='object') {
        return cloneOther(obj)
    }
    if(obj instanceof RegExp) {
        return cloneRegExp(obj)
    }
    if(obj instanceof Date){
        return cloneDate(obj)
    }
    if(obj instanceof Array){
        for(let index in obj){
            newObj[index] = deepClone(obj[index]); // 對數組子項進行複製
        }
    }
    if(obj instanceof Object){
        for(let key in obj){
            newObj[key] = deepClone(obj[key]); // 對對象子項進行複製
        }
    }
    return newObj;
}
function cloneNull(obj){ // 複製NULL
  return obj
}
function cloneFunction(obj){ // 複製方法,
  // 複製一個新方法,將原方法轉成字符串,並new一個新的function
  return new Function('return '+obj.toString())()
}
function cloneOther(obj){ // 複製非對象的數據
  return obj
}
function cloneRegExp(obj){ // 複製正則對象
  return new RegExp(obj)
}
function cloneDate(obj){ // 複製日期對象
  return new Date(obj)
}

最終版本 deepClone

然後可以有一個合併版本的,比較節省代碼,將下方區分開的複製方法,合併到deepClone中,可以極大地減少代碼體積

function deepClone(obj){ //
    let newObj = new obj.constructor;
    if(obj === null) return obj
    if(typeof obj=='function') return new Function('return '+obj.toString())()
    if(typeof obj!='object') return obj
    if(obj instanceof RegExp) return new RegExp(obj)
    if(obj instanceof Date) return new Date(obj)
    // 運行到這裏,基本上只存在數組和對象兩種類型了
    for(let index in obj){
        newObj[index] = deepClone(obj[index]); // 對子項進行遞歸複製
    }
    return newObj;
}

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

“操控之王”大7座SUV國產後要死磕漢蘭達?_租車

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

5T渦輪增壓發動機,最大馬力253匹、峰值扭矩高達420牛米。傳動系統搭載的是一款六速手自一體變速箱。CX-9是馬自達率先針對北美市場研發的7座SUV車型,所以在北美已經率先上市,據悉售價為31000美金,約合人民幣20萬元左右,隨着全球性的SUV熱潮不斷升溫,作為汽車消費大國的中國,不出意外也會分到一杯羹。

眾所周知馬自達旗下的車型幾乎都以優秀的操控性見長,旗下昂克賽拉、阿特茲兩台轎車在同級橫比當中操控性都是非常出眾的典型,而今年所推出的轎跑型SUV——CX-4更是將SUV的操控性提高了一個層次。而根據有關消息,今年早些時候在北美率先上市的全新一代馬自達7座SUV CX-9,將在明年正式由一汽馬自達進行國產。

馬自達近年來的“魂動”設計理念已經深入人心,無論是昂克賽拉、阿特茲、還是CX-4,在很多人眼裡都是“騷的無與倫比”。

全新一代馬自達CX-9依然延續了“魂動”的設計,從已經曝光的圖片我們可以看到,CX-9的外觀將家族化的靈動感進行了一定程度上的柔化,讓視覺侵略性極強的外觀效果和SUV的威武感融合得比較恰當。

全新CX-9採用了七座的作為布局,軸距達到了2930mm,小編猜測不出意外的話,

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

國產後的馬自達CX-9軸距會將進一步加長,預計屆時國產後的CX-9車內乘坐空間會更加充裕。

值得注意的是,隨着國際大流下的渦輪增壓發動機大肆普及,在豐田、本田這兩個日系品牌紛紛推出渦輪增壓車型,在動力系統方面頗有一套造詣的馬自達也坐不住了。全新馬自達CX-9搭載了一款創馳藍天的2.5T渦輪增壓發動機,最大馬力253匹、峰值扭矩高達420牛米。傳動系統搭載的是一款六速手自一體變速箱。

CX-9是馬自達率先針對北美市場研發的7座SUV車型,所以在北美已經率先上市,據悉售價為31000美金,約合人民幣20萬元左右,隨着全球性的SUV熱潮不斷升溫,作為汽車消費大國的中國,不出意外也會分到一杯羹。

全文總結:根據小編的猜測,作為馬自達旗下定位高端化的SUV車型,進入國產以後售價應該會向現在的漢蘭達和福特銳界看齊,而2.5T的馬自達CX-9將會是以頂配車型進行銷售,較低的配置應該還會搭載現在阿特茲的2.0L自然吸氣發動機,而2.5L的自然吸氣發動機或許將不會在CX-9車型中搭載。

由於目前官方對於CX-9國產的消息透露的不多,具體投產和上市時間暫時不得而知,作為一款較為值得關注的7座SUV車型,我們也會持續對其保持高度關注並進行消息更新。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

YouTube 的 PWA 應用終於在 Windows 與 ChromeOS 上推出了(內含一秒安裝方式)_潭子電動車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

一直以來,Windows 平台上都沒有可以直接安裝到電腦上的 YouTube 應用程式,所以每次當你想要觀賞影片時,都必須先打開瀏覽器,然後再前往 YouTube 網站上,不像在手機上那麼直接點擊就能前往。不過,現在 YouTube 的 PWA 應用終於登陸 Windows 10 與 ChromeOS 上,以後不用那麼麻煩囉!

YouTube 的 PWA 應用終於在 Windows 與 ChromeOS 上推出了

明明 YouTube 在全球擁有那麼多用戶,但卻遲遲沒有在電腦版本上推出像手機那般一點就開的應用程式,大家只能從瀏覽器前往網頁版本,隨著 PWA(漸進式網頁應用程式)的興起,這件小事日前已經迎刃而解。只要你是 Windows 10 或 ChromeOS 作業系統,現在都能安裝 YouTube 的 PWA。

怎麼安裝呢?首先打開你的 Chrome 或 Microsoft Edge 瀏覽器,然後前往 YouTube 網站。接著點選瀏覽器網址列旁邊的「+」號即可進行安裝。由於 Chrome 與 Edge 瀏覽器上會看到的圖示不太一樣,下面筆者將兩者都截圖下來,這樣大家比較好辨認。接著同意安裝後就馬上完成,完全不需等候。

安裝好後,你可以在電腦桌面上看到開啟 YouTube PWA 應用的捷徑,同時在開始功能表中也可以看到 YouTube PWA 的身影,未來想要看 YouTube 影片,你可以直接點擊圖示就能快速喚出。

YouTube PWA 應用的好處是它會變成獨立應用般運作(如下圖),不需要另外開瀏覽器,特別是當你瀏覽器分頁或視窗開了很多的時候,從一大堆網站裡面撈出 YouTube 也並不是那麼容易的事情,非常難找。其他包含功能、介面,其實就與網頁版差不多,沒有什麼需要重新適應的問題。

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

如果某日你想要移除它,就像移除其他 Windows 系統中的應用程式與軟體一樣,從設定功能中去執行就好,不會有一安裝就像被咬住不放的感覺。目前 YouTube PWA 需在網路連線狀態下運作,Google 一直在鼓勵各家 PWA 的開發者於應用中增加更多離線功能,這表示未來我們還可以在 YouTube PWA 中看到一些新的離線驚喜,筆者個人是希望可以有影片下載,這樣就算在網路不方便連接的地方也可以輕鬆看啦!

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

我終於搞清了啥是 HTTPS 了_台中搬家

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

引言

最近上海連續下了一周雨,溫度一夜之間回到解放前,穿夏裝的我被凍得瑟瑟發抖,躲在家裡哪也不想去。

在家百無聊賴的刷着網頁,看到公眾號後台的留言,有同學問我 HTTP 和 HTTPS 有啥區別?

這還用問,當然是 HTTPS 要比 HTTP 更加的安全啊,沒看到後面帶着個 S 呢么,帶着 S 就這麼 NB 。

然後同學的下一個問題把我問懵逼了,為啥帶 S 的更安全呢?能詳細的講講么。

我跟你講嗷,不是我吹,我這麼多年。。。。。。

就沒見過你這麼刨根究底的同學,老問這種我也不是很清楚的問題。

雖然這個問題問的我老臉一紅,但是我有一種不要臉的精神 「我不會,但是我可以學」 。

HTTP

首先先來了解下 HTTP :

HTTP 協議全稱為:Hyper Text Transfer Protocol ,翻譯過來就是超文本傳輸協議,請不要質疑這個翻譯,我專門用百度翻譯翻了一下。

TCP/IP 四層模型應該都知道的,有數據鏈路層,網絡層,傳輸層和應用層:

而 HTTP 協議就是位於 TCP/IP 四層模型的應用層上。

這裏很多人都會混淆 TCP 和 HTTP ,實際上 HTTP 是基於 TCP 連接基礎上的。

簡單的說, TCP 就是單純建立連接,不涉及任何我們需要請求的實際數據,簡單的傳輸。而 HTTP 是用來收發數據,即實際應用上來的。

HTTP 協議通過請求和響應在客戶端和服務端之間收發數據,進行通信:

HTTPS

HTTP 協議看起來好像沒啥問題,唯一的問題就是不夠安全,因為 HTTP 協議的傳輸方式完全是由明文傳輸的,不做任何加密,這就讓一些不懷好意的人有了可乘之機。

這種傳輸方式誘發了一種經典的攻擊方式:中間人攻擊。

對於這種情況,最簡單的我們可以使用加密方案,比如使用 AES 加密,服務端和客戶端先約定一個隨機生成的密鑰 key ,後續的通信中,所有的信息都使用這個密鑰進行 AES 加密:

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

這樣雖然後面的通信過程安全了,但是我們在第一發送 AES 密鑰的時候還是存在被中間人攔截的風險,一旦中間人攔截到我們的密鑰,可用對密鑰進行更換或者直接解密請求內容:

這時我們可以使用不對稱加密,來專門對密鑰的傳輸做一次額外的保護。

不對稱加密會有兩個密鑰,一個是公鑰,一個是私鑰。明文可以使用公鑰加密私鑰解密,也可以使用私鑰加密公鑰解密。

現在比較通用的非對稱加密算法有 RSA 。

看到這裏的同學一定在奇怪,既然都使用了不對稱加密,為啥只對 AES 的密鑰做不對稱加密,好像有多此一舉,完全可以對後續所有的通信信息全都使用不對稱加密。

因為不對稱加密相比較對稱加密性能上存在明顯的劣勢,可能你覺得在一個請求中多消耗幾 ms 或者幾 ns 無所謂,但是請求到達服務端是要進行解密,每個請求都多消耗幾 ms 累計起來還是非常可觀的。

上面這個方案看起來已經很安全了,中間人即使攔截到我們的公鑰,由於不知道我們的私鑰貌似也沒辦法解密。

實際上中間人完全不需要解密我們的信息,他可以生成一對新的公私鑰發送給客戶端進行攻擊,後續客戶端的通信中間人使用自己創造的私鑰進行解密,然後通過服務端生成的公鑰進行加密返回給服務端:

CA 證書

上面的問題我們僅通過客戶端和服務端已經沒辦法了,這時候需要引入新的第三方機構,一個頒發 CA 證書的機構。

常見的第三方 CA 機構有:Symantec(賽門鐵克),Comodo(科莫多),GeoTrust(環度網信),GoDaddy,Thawte,daoRapidSSL 等等。

在中間人攻擊中,我們遇到的問題不是加密算法不夠神奇,不是密鑰方式不夠嚴謹,而是我們沒有辦法向我們的客戶端表明我們給他的公鑰是我們的,是不是很像我沒辦法證明我是我的問題。

所以第三方機構應運而生,第三方機構只做一件事情,將服務端的公鑰刻上了我們的名字(CA 證書),客戶端接收到公鑰之後,只需要來第三方機構這裏查詢,就能知道這個公鑰是不是真的服務器,然後再將自己生成的 AES 密鑰使用 CA 證書中解密得到的公鑰進行加密后發送給服務端。

最後服務端使用私鑰解密得到 AES 密鑰,就可以愉快的和客戶端進行通信了。

最後的最後,CA 機構驗證不是每次都要去 CA 機構查詢。這樣做太傻了而且太耗時,尤其是很多 CA 機構的服務都在海外,這樣一來一去消耗的時間太多了。

CA 機構高明的地方就在於,我們去找它註冊公鑰,它會使用另一個來註冊的公司的私鑰對我們的公鑰加密,得到一個我們的公鑰的指紋(全球唯一),然後將這家公司的公鑰信息(其實也是證書)和我們的公鑰以及我們公鑰的指紋打包成一個證書。

當我們使用 HTTPS 將證書下發給客戶端校驗時,客戶端(比如瀏覽器)從證書中看到了上級證書的信息,恰巧這個證書就在瀏覽器(或者本機)中,已經被驗證過是合法的,瀏覽器只要使用這個證書中的公鑰將我們的公鑰指紋進行解密,然後比對我們的公鑰信息就知道我們也是的合法的。因為假證書中的公鑰簽名不可能被合法的上級證書中公鑰解密 。

這段稍微有點繞,慢慢看多看幾次就理解了。

參考

https://www.jianshu.com/p/691b8ba3a70f

https://blog.csdn.net/u010144805/article/details/80803059

https://blog.csdn.net/caofengtao1314/article/details/87912078

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

游泳池誤倒不明液體冒白煙 19名幼童急送醫_貨運

※智慧手機時代的來臨,RWD網頁設計為架站首選

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

中和景新國小委外由游泳池晚間發生誤混液體,造成多名幼童不適,環保署人員趕抵檢查現地。(吳家詮翻攝)

新北景新國小外包游泳池,晚間發生誤倒入不明液體,早成多名在場幼童身體不適。(圖摘自Google Map)

新北市中和區景新國小旁一處私人游泳池,晚間現場疑似救生員誤將不明液體倒入泳池產生白煙,造成現場場19名小朋友噁心嘔吐,送新北雙和醫院急救。

※評比南投搬家公司費用收費行情懶人包大公開

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

 

消防局初步了解,現場為伊藤萬游泳晚上6時50分至8時為學校的游泳課程,因工作人員誤將強酸(氯)及強鹼(消毒水)加在一起,故產生化學作用冒煙,引起上課學生身體不適,小朋友分屬不同學校參加游泳課程,目前送醫計有18名,有1名為家長自行送往醫院,消防局救護車載運10女8男(18名),均送往雙和醫院。

 

雙和醫院稍晚表示,另有5名泳池的教練也因身體不適,陸續到院檢查治療。

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念