分類
發燒車訊

Honda與微軟技術合作,推出AI電動車

日本汽車大廠本田(Honda)近日宣布,即將在下個月美國消費性電子展(CES 2017)中展出的最新電動概念車「NeuV」,將搭載軟銀(SoftBank)旗下雲端AI 技術研發公司cocoro SB 株式會社所打造的「情感引擎」,可望改變人與車之間冰冷的相處形態,增添更多情感交流與互動。

對汽車產業發展來說,人工智慧(AI)、機器人科技與大數據分析等,已逐漸成為改善行動體驗所不可或缺的重要技術。本田在今年7 月宣布,其子公司本田技術研究所(Honda R&D Co., Ltd.)將與軟銀合作,針對cocoro SB 所研發的情感引擎(emotion engine)共同研究有關應用。本田也在同年9 月於東京赤坂設置本田創新研究室「Honda R&D Innovation Lab Tokyo」,進一步研發AI 技術並強化其開放式創新發展。

提到cocoro SB 就不得不提人形機器人Pepper,因為Pepper 的情感引擎正是採用cocoro SB 的AI 雲端運算技術,在搭配攝影設備及多種感測器之下,能夠感知人類情緒與外在環境,從而建立自我情感並做出反應。

本田NeuV 概念車也採類似概念,透過系統收集而來的訊息判斷駕駛人的情緒,並學習做出適當反應加以交流對話,目標成為駕駛人的行動好夥伴,改變原本人與機器間的關係,同時也將為人們生活創造全新價值。至於NeuV 設計概念與技術細節,預計在下個月的CES 展中會有進一步說明。

(本文由《》授權提供。照片來源:Honda)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

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

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

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

※教你寫出一流的銷售文案?

※超省錢租車方案

聚甘新

分類
發燒車訊

第七屆中國國際新能源汽車論壇2017之驅動創新

每當提起新能源汽車核心零部件,我們首先想到的是電池,而對電機電控等方面的探討和認知卻很少,究其原因,電控電機這兩大核心零部件在平日裡少有熱點和創新,尤其是在電控領域,國內供應商還處於一個相對初級的階段,所研發的產品還無法達到國際領先水準,因此極大的限制了廣大消費者們對電機電控技術的關心。然而,未來的5年時間內電機電控將會進入發展最關鍵的時期,並且熱度持續飆升。相關機構資料統計,預計到2020年,驅動電控及電機的累積市場規模將達到1600億元。

現階段,電控電機的產業已經形成了多重勢力競相爭奪的局面,除了國內本土的電控電機供應商外,整車廠、國內外汽車零部件供應商及外資新能源汽車生產商都相繼加入戰局。同時,隨著市場的熱度提升,電控電機技術領域也面臨著更大的挑戰。為了縮小國內外電控電機的技術差距,國內企業也在除了沿用傳統的製造工藝同時,在技術及工藝上也在進行不斷地研發及創新。

新能源汽車對於電控電機的品質要求相比于傳統汽車要更高,並且總體而言,電控電機產品的可靠性,一體化與新能源汽車的使用要求還存在一定差距,中國國際新能源汽車論壇—致力於打造全球規模最大,最國際化的新能源汽車論壇,第七屆大會攜手上海市嘉定區人民政府將會專門設立電控電機板塊,進行一天8小時的技術探討及分享,屆時國內外知名的整車商,電控電機供應商及零部件企業高層領導等將前來分享各自對於目前電控電機市場的發展前景看法及介紹最前沿的技術,同時,也會側重于目前應用最普遍的永磁電機從磁性材料和技術方面進行更深層次的交流。

本屆大會將於2017年5月17-19日在上海舉辦,大會涉及共七個論壇,頒獎典禮,研討會及晚宴。屆時將會有全球範圍內的整車製造商、電網電力公司、電池廠商、零部件供應商、核心技術提供商和政府官員600多位行業人士一起,對新能源汽車產業面臨的挑戰,機遇與對策各方面進行為期三天更深層次並具有建設和戰略性的探討,期待您的參與。

若您對峰會有更多要求,請撥打021-6045 1760與我們聯繫,謝謝理解和支持!
我們期待與貴單位一起出席於5月17-19日在上海舉辦的第七屆中國國際新能源汽車論壇2017,以利決策!
想瞭解詳細內容,請登陸官方網站:
連絡人:Hill Zeng(曾先生)
電話:+86-21-6045 1760
傳真:+86-21-6047 5887
郵箱:

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

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

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

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

※教你寫出一流的銷售文案?

※超省錢租車方案

聚甘新

分類
發燒車訊

法國罕見地震規模5.4 近16年來最強

摘錄自2019年11月11日中央社報導

法國東南部11日近午時分發生一起芮氏規模5.4的地震,這個地區罕有超過規模5的地震,當地民眾感受特別深刻,已知有4人受傷,其中一人重傷。

法新社報導,巴黎地球物理研究所(IPGP)史特拉斯堡辦公室的學者梅格哈威(Mustapha Meghraoui)表示,這一地區的地震規模極少超過5,可以說這起地震很罕見。

震央鄰近克魯亞斯(Cruas)核電站及特里卡斯坦(Tricastin)核電站,法國電力集團(EDF)晚間決定暫停克魯亞斯核電站的反應爐,以便進行預防性檢測;法國核能安全署(ASN)表示,地震並未在相關設施造成顯著損壞,但仍將檢視反應爐重啟的條件。

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

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

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

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

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

※教你寫出一流的銷售文案?

※超省錢租車方案

分類
發燒車訊

【K8S】Service服務詳解,看這一篇就夠了!!

k8s用命名空間namespace把資源進行隔離,默認情況下,相同的命名空間里的服務可以相互通訊,反之進行隔離。

1.1 Service

Kubernetes中一個應用服務會有一個或多個實例(Pod,Pod可以通過rs進行多複本的建立),每個實例(Pod)的IP地址由網絡插件動態隨機分配(Pod重啟后IP地址會改變)。為屏蔽這些後端實例的動態變化和對多實例的負載均衡,引入了Service這個資源對象,如下所示:

apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  labels:
    app: nginx
spec:
  type: ClusterIP
  ports:
    - port: 80
       targetPort: 80
  selector:  #service通過selector和pod建立關聯
    app: nginx

根據創建Service的type類型不同,可分成4種模式:

  • ClusterIP: 默認方式。根據是否生成ClusterIP又可分為普通Service和Headless Service兩類:
    • 普通Service:通過為Kubernetes的Service分配一個集群內部可訪問的固定虛擬IP(Cluster IP),實現集群內的訪問。為最常見的方式。
    • Headless Service:該服務不會分配Cluster IP,也不通過kube-proxy做反向代理和負載均衡。而是通過DNS提供穩定的絡ID來訪問,DNS會將headless service的後端直接解析為podIP列表。主要供StatefulSet使用。
  • NodePort:除了使用Cluster IP之外,還通過將service的port映射到集群內每個節點的相同一個端口,實現通過nodeIP:nodePort從集群外訪問服務。
  • LoadBalancer:和nodePort類似,不過除了使用一個Cluster IP和nodePort之外,還會向所使用的公有雲申請一個負載均衡器(負載均衡器後端映射到各節點的nodePort),實現從集群外通過LB訪問服務。
  • ExternalName:是 Service 的特例。此模式主要面向運行在集群外部的服務,通過它可以將外部服務映射進k8s集群,且具備k8s內服務的一些特徵(如具備namespace等屬性),來為集群內部提供服務。此模式要求kube-dns的版本為1.7或以上。這種模式和前三種模式(除headless service)最大的不同是重定向依賴的是dns層次,而不是通過kube-proxy。
    比如,在service定義中指定externalName的值”my.database.example.com”:

此時k8s集群內的DNS服務會給集群內的服務名 ..svc.cluster.local 創建一個CNAME記錄,其值為指定的”my.database.example.com”。
當查詢k8s集群內的服務my-service.prod.svc.cluster.local時,集群的 DNS 服務將返回映射的CNAME記錄”foo.bar.example.com”。

備註: 前3種模式,定義服務的時候通過selector指定服務對應的pods,根據pods的地址創建出endpoints作為服務後端;Endpoints Controller會watch Service以及pod的變化,維護對應的Endpoint信息。kube-proxy根據Service和Endpoint來維護本地的路由規則。當Endpoint發生變化,即Service以及關聯的pod發生變化,kube-proxy都會在每個節點上更新iptables,實現一層負載均衡。 而ExternalName模式則不指定selector,相應的也就沒有port和endpoints。 ExternalName和ClusterIP中的Headles Service同屬於Headless Service的兩種情況。Headless Service主要是指不分配Service IP,且不通過kube-proxy做反向代理和負載均衡的服務。

1.2 Port

Service中主要涉及三種Port: * port 這裏的port表示service暴露在clusterIP上的端口,clusterIP:Port 是提供給集群內部訪問kubernetes服務的入口。

  • targetPort

containerPort,targetPort是pod上的端口,從port和nodePort上到來的數據最終經過kube-proxy流入到後端pod的targetPort上進入容器。

  • nodePort

nodeIP:nodePort 是提供給從集群外部訪問kubernetes服務的入口。

總的來說,port和nodePort都是service的端口,前者暴露給從集群內訪問服務,後者暴露給從集群外訪問服務。從這兩個端口到來的數據都需要經過反向代理kube-proxy流入後端具體pod的targetPort,從而進入到pod上的容器內。

1.3 IP

使用Service服務還會涉及到幾種IP:

  • ClusterIP

Pod IP 地址是實際存在於某個網卡(可以是虛擬設備)上的,但clusterIP就不一樣了,沒有網絡設備承載這個地址。它是一個虛擬地址,由kube-proxy使用iptables規則重新定向到其本地端口,再均衡到後端Pod。當kube-proxy發現一個新的service后,它會在本地節點打開一個任意端口,創建相應的iptables規則,重定向服務的clusterIP和port到這個新建的端口,開始接受到達這個服務的連接。

  • Pod IP

Pod的IP,每個Pod啟動時,會自動創建一個鏡像為gcr.io/google_containers/pause的容器,Pod內部其他容器的網絡模式使用container模式,並指定為pause容器的ID,即:network_mode: “container:pause容器ID”,使得Pod內所有容器共享pause容器的網絡,與外部的通信經由此容器代理,pause容器的IP也可以稱為Pod IP。

  • 節點IP

Node-IP,service對象在Cluster IP range池中分配到的IP只能在內部訪問,如果服務作為一個應用程序內部的層次,還是很合適的。如果這個service作為前端服務,準備為集群外的客戶提供業務,我們就需要給這個服務提供公共IP了。指定service的spec.type=NodePort,這個類型的service,系統會給它在集群的各個代理節點上分配一個節點級別的端口,能訪問到代理節點的客戶端都能訪問這個端口,從而訪問到服務。

 

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

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

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

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

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

※教你寫出一流的銷售文案?

※超省錢租車方案

分類
發燒車訊

C#中的閉包和意想不到的坑

雖然閉包主要是函數式編程的玩意兒,而C#的最主要特徵是面向對象,但是利用委託或lambda表達式,C#也可以寫出具有函數式編程風味的代碼。同樣的,使用委託或者lambda表達式,也可以在C#中使用閉包。

根據WIKI的定義,閉包又稱語法閉包或函數閉包,是在函數式編程語言中實現語法綁定的一種技術。閉包在實現上是一個結構體,它存儲了一個函數(通常是其入口地址)和一個關聯的環境(相當於一個符號查找表)。閉包也可以延遲變量的生存周期。

嗯。。看定義好像有點迷糊,讓我們看看下面的例子吧

    class Program
    {
        static Action CreateGreeting(string message)
        {
            return () => { Console.WriteLine("Hello " + message); };
        }

        static void Main()
        {
            Action action = CreateGreeting("DeathArthas");
            action();
        }
    }

這個例子非常簡單,用lambda表達式創建一個Action對象,之後再調用這個Action對象。
但是仔細觀察會發現,當Action對象被調用的時候,CreateGreeting方法已經返回了,作為它的實參的message應該已經被銷毀了,那麼為什麼我們在調用Action對象的時候,還是能夠得到正確的結果呢?
 
原來奧秘就在於,這裏形成了閉包。雖然CreateGreeting已經返回了,但是它的局部變量被返回的lambda表達式所捕獲,延遲了其生命周期。怎麼樣,這樣再回頭看閉包定義,是不是更清楚了一些?
 
閉包就是這麼簡單,其實我們經常都在使用,只是有時候我們都不自知而已。比如大家肯定都寫過類似下面的代碼。

void AddControlClickLogger(Control control, string message)
{
	control.Click += delegate
	{
		Console.WriteLine("Control clicked: {0}", message);
	}
}

這裏的代碼其實就用了閉包,因為我們可以肯定,在control被點擊的時候,這個message早就超過了它的聲明周期。合理使用閉包,可以確保我們寫出在空間和時間上面解耦的委託。
 
不過在使用閉包的時候,要注意一個陷阱。因為閉包會延遲局部變量的生命周期,在某些情況下程序產生的結果會和預想的不一樣。讓我們看看下面的例子。

    class Program
    {
	static List<Action> CreateActions()
        {
            var result = new List<Action>();
            for(int i = 0; i < 5; i++)
            {
                result.Add(() => Console.WriteLine(i));
            }
            return result;
        }

        static void Main()
        {
            var actions = CreateActions();
            for(int i = 0;i<actions.Count;i++)
            {
                actions[i]();
            }
        }
    }

這個例子也非常簡單,創建一個Action鏈表並依次執行它們。看看結果

相信很多人看到這個結果的表情是這樣的!!難道不應該是0,1,2,3,4嗎?出了什麼問題?

刨根問底,這兒的問題還是出現在閉包的本質上面,作為“閉包延遲了變量的生命周期”這個硬幣的另外一面,是一個變量可能在不經意間被多個閉包所引用。

在這個例子裏面,局部變量i同時被5個閉包引用,這5個閉包共享i,所以最後他們打印出來的值是一樣的,都是i最後退出循環時候的值5。

要想解決這個問題也很簡單,多聲明一個局部變量,讓各個閉包引用自己的局部變量就可以了。

	//其他都保持與之前一致
        static List<Action> CreateActions()
        {
            var result = new List<Action>();
            for (int i = 0; i < 5; i++)
            {
                int temp = i; //添加局部變量
                result.Add(() => Console.WriteLine(temp));
            }
            return result;
        }

這樣各個閉包引用不同的局部變量,剛剛的問題就解決了。

除此之外,還有一個修復的方法,在創建閉包的時候,使用foreach而不是for。至少在C# 7.0 的版本上面,這個問題已經被注意到了,使用foreach的時候編譯器會自動生成代碼繞過這個閉包陷阱。

	//這樣fix也是可以的
        static List<Action> CreateActions()
        {
            var result = new List<Action>();
            foreach (var i in Enumerable.Range(0,5))
            {
                result.Add(() => Console.WriteLine(i));
            }
            return result;
        }

這就是在閉包在C#中的使用和其使用中的一個小陷阱,希望大家能通過老胡的文章了解到這個知識點並且在開發中少走彎路!

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

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

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

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

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

※教你寫出一流的銷售文案?

※超省錢租車方案

分類
發燒車訊

區塊鏈系列教程之:比特幣的錢包與交易

目錄

  • 簡介
  • 比特幣密碼學的基礎
    • 單向散列函數(hash算法)
    • 非對稱加密算法
    • 擴展閱讀:同態加密
  • 密鑰,地址和錢包
  • 比特幣中的交易
  • 擴展閱讀:圖靈非完備性
  • 總結

簡介

錢包在比特幣中是做什麼的呢?比特幣的交易又有什麼特點呢?怎麼才能偽造比特幣的交易呢?今天和大家一起學習一下比特幣中的錢包和交易。

比特幣密碼學的基礎

之前我們提到過比特幣使用的並不是什麼新技術,只是對於老的技術比如:P2P網絡,分佈式系統,密碼學,共識算法的重新而又巧妙的應用。

在錢包和交易生成驗證的過程中,都需要使用到密碼學的計算。這裏我們先介紹一下比特幣中會使用到的幾種密碼學技術。

更多精彩內容且看:

  • 區塊鏈從入門到放棄系列教程-涵蓋密碼學,超級賬本,以太坊,Libra,比特幣等持續更新
  • Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續更新
  • Spring 5.X系列教程:滿足你對Spring5的一切想象-持續更新
  • java程序員從小工到專家成神之路(2020版)-持續更新中,附詳細文章教程

單向散列函數(hash算法)

在介紹單向散列函數之前,我們先了解一下什麼情況下需要使用到單向散列函數。

如果你需要從國外的網站上下載一個軟件,但是因為種種原因,國外的網絡太慢了,下載幾個G的數據幾乎是不可能的。剛好國內有鏡像網站,可以從國內下載數據。但是如何保證國內的鏡像不是被篡改過後的呢?這個時候就需要單向散列函數了。一般來說網站會提供MD5或者SHA的值作為驗證值。

單向散列函數有一個輸入和輸出。輸入稱為消息,輸出稱為散列值。

散列值的長度跟消息的長度無關,不論多少大小的長度的消息,都會計算出固定長度的散列值。

hash算法有下面幾個特點:

  1. 能夠根據任意長度的消息計算出固定長度的散列值。

  2. 計算速度要快。

  3. 消息不同,散列值也不同。

    這就意味着,如果僅僅是一點點的變動都會引起整個散列值的巨大變化。

    因為散列值的大小是固定的,所以有可能會出現不同的消息產生相同散列值的情況。這種情況叫做碰撞。

    難以發現碰撞的性質被稱為抗碰撞性。當給定某條消息的散列值時,必須保證很難找到和該消息具有相同散列值的另一條消息。

  4. 單向散列函數必須具有單向性。所謂單向性是指無法通過散列值來反推出消息的性質。

比特幣使用的散列算法是SHA256,他是安全散列算法SHA(Secure Hash Algorithm)系列算法的一種(另外還有SHA-1、SHA-224、SHA-384 和 SHA-512 等變體),SHA是美國國家安全局 (NSA) 設計,美國國家標準與技術研究院(NIST) 發布的,主要適用於数字簽名標準(DigitalSignature Standard DSS)裏面定義的数字簽名算法(Digital Signature Algorithm DSA)。

RIPEMD(RACE Integrity Primitives Evaluation Message Digest,RACE原始完整性校驗消息摘要),是Hans Dobbertin等3人在md4,md5的基礎上,於1996年提出來的。

非對稱加密算法

非對稱加密算法也叫公鑰密碼算法,通過生成的公私鑰來對明文密文進行加密解密。

非對稱加密算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對,如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;如果用私有密鑰對數據進行加密,那麼只有用對應的公開密鑰才能解密。因為加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱加密算法。

擴展閱讀:同態加密

同態加密是一種加密形式,它允許人們對密文進行特定的代數運算得到仍然是加密的結果,將其解密所得到的結果與對明文進行同樣的運算結果一樣。換言之,這項技術令人們可以在加密的數據中進行諸如檢索、比較等操作,得出正確的結果,而在整個處理過程中無需對數據進行解密。其意義在於,真正從根本上解決將數據及其操作委託給第三方時的保密問題,例如對於各種雲計算的應用。

密鑰,地址和錢包

比特幣的所有權是通過数字密鑰、比特幣地址和数字簽名來確立的。数字密鑰實際上並不是存儲在網絡中,而是由用戶生成並存儲在一個文件或簡單的數據庫 中,稱為錢包。存儲在用戶錢包中的数字密鑰完全獨立於比特幣協議,可由用戶的錢包軟件生成並管理,而無需區塊鏈或網絡連接。密鑰實現了比特幣的許多有趣特性,包括去中心化信任和控制、所有權認證和基於密碼學證明的安全模型。

比特幣錢包只包含私鑰而不是比特幣。每一個用戶有一個包含多個私鑰的錢包。錢包中包含成對的私鑰和公鑰。用戶用這些私鑰來簽名交易,從而證明它們擁有交易的輸出(也就是其中的比特幣)。比特幣是以交易輸出的形式來儲存在區塊鏈中(通常記為vout或txout)。

如果錢包只包含私鑰,那麼錢包地址是什麼呢?錢包地址是從公鑰的hash值的出來的,如下圖所示:

  1. 首先使用隨機數發生器生成一個『私鑰』。一般來說這是一個256bits的數,擁有了這串数字就可以對相應『錢包地址』中的比特幣進行操作,所以必須被安全地保存起來。

  2. 『私鑰』經過SECP256K1算法處理生成了『公鑰』。SECP256K1是一種橢圓曲線算法,通過一個已知『私鑰』時可以算得『公鑰』,而『公鑰』已知時卻無法反向計算出『私鑰』。這是保障比特幣安全的算法基礎。

  3. 同SHA256一樣,RIPEMD160也是一種Hash算法,由『公鑰』可以計算得到『公鑰哈希』,而反過來是行不通的。

  4. 將一個字節的地址版本號連接到『公鑰哈希』頭部(對於比特幣網絡的pubkey地址,這一字節為“0”),然後對其進行兩次SHA256運算,將結果的前4字節作為『公鑰哈希』的校驗值,連接在其尾部。

  5. 將上一步結果使用BASE58進行編碼(比特幣定製版本),就得到了『錢包地址』。 比如,1A1zP1eP5QGefi2DMPTfTL5TTmv7DivfNa。

所以私鑰,公鑰和錢包地址的關係如下圖所示:

大家看到錢包地址1A1zP1eP5QGefi2DMPTfTL5TTmv7DivfNa有什麼想法呢?

肯定有人在想,這麼一大長串字母和数字實在是太不好記憶了。能不能生產一個比較好記的錢包地址呢? 比如MyNameIsHanMeiMei….這樣開頭的地址呢?

當然可以,這叫做靚號地址,只不過需要大量的算力才行。

比特幣中的交易

簡單來說,交易就是告知全網:比特幣的持有者已授權把比特幣轉帳給其他人。而新持有者能夠再次授權,轉移給該比特幣所有權鏈中的其他人。

注意, 在比特幣的世界里既沒有賬戶,也沒有餘額,只有分散到區塊鏈里的UTXO(Unspent Transaction Outputs)。

怎麼理解這個UTXO呢?沒有賬戶也沒有餘額,那麼錢包裏面的金額是怎麼計算出來的呢?

別急,讓我們一一道來。

話說,在比特幣中,比特幣錢包間的轉賬是通過交易(Transaction)實現的。

我們看一個標準的交易流程。

那麼問題來了,世界上第一個比特幣是哪裡來的呢?

答,是挖礦來的。好了,我們的001交易表示的就是一個挖礦的過程,在這個交易中,輸入就是挖礦,輸出編號1,BTC數目是50,目的地址是A,表示這50個BTC給A了。

接下來,A想發25個BTC給B,怎麼構造這個交易呢?

同樣的,我們需要一個輸入,這個輸入就是001交易的1號輸出,我們用001.1來表示。輸出分為兩個,第一個輸出編號1,表示要付25個BTC給B。第二個輸出編號2,表示剩下的BTC要還給A。

大家可能會問了,輸入是50BTC,兩個輸出加起來才45個BTC,好像還少了5個BTC?沒錯,這個5個BTC就是給礦工的挖礦所得。

接下來,A又繼續轉賬給C,同樣的道理,把一個一個的交易連接起來。

從上面的例子我們可以看到,實際上錢是存在一個一個的交易記錄裏面的,那些未被花費的輸出,就叫做UTXO(Unspent Transaction Outputs)。

那麼怎麼保證轉賬給B的錢,不會被其他的人消費呢?這就涉及到交易的加密過程了。

我們以單個輸入和輸出為例來詳細了解一下交易的構成:

上圖中,交易的輸入就是txid,也就是之前生成的還有未花費暑輸出的交易ID。output index就是交易的輸出id。

一個非常重要的ScriptSig是輸入交易的驗證,表明這個用戶擁有這個賬戶的轉賬權限。

輸出是一個腳本,只有滿足腳本運行條件的人才能花費這個output。這也就是ScriptSig需要驗證的腳本。

我們看下腳本是怎麼做認證的吧。

比特幣的標準輸出形式有兩種。Pay To Public Key Hash (P2PKH) 和 Pay To Script Hash (P2SH)。兩者的區別在於,一個是輸出到public key的hash,一個是輸出到任意的一個腳本輸出hash。

為了保證輸出只能由特定的人來花費,一般的情況下是直接輸出到對方的public key hash。由於只有對方擁有的私鑰能夠生成這個public key hash,也就是說只有對方才能夠對這個輸出進行驗證。

但每次都需要知道對方的public key hash還是比較麻煩的,更簡單的做法就是,發送者直接輸出到一個特定的hash值就行了,只要對方能夠生成這個hash就可以。

下面的例子是一個P2PKH的腳本形式。

P2PKH的輸出是一個腳本,裏面一個重要的值就是PK hash。

怎麼驗證呢?

驗證方提供兩個值,一個是sig,一個是PubKey。因為比特幣的虛擬機是棧結構的,我們先把這兩個值入棧。

然後調用OP_DUP對最上層的PubKey進行拷貝,然後調用OP_HASH160算法來計算Pk Hash,然後將發送方保存的Pk Hash入棧。接下來調用OP_EQUALVERIFY對兩個PK Hash進行對比。

如果對比成功,最後一步就是驗證Sig和PubKey是否匹配。

如果都成功,說明接收方的確是這個PK Hash的擁有者。那麼對方就可以盡情使用了。

擴展閱讀:圖靈非完備性

和馮·諾伊曼同為現代計算機奠基人的阿蘭·圖靈(AlanTurin)在1950年提出了判定計算機能否像人那般實際“思考”的標準,也就是著名的“圖靈檢驗”。

他設想一台超級計算機和一個人躲藏在幕後回答提問者的問題,而提問者則試圖分辨哪個是人哪個是計算機。

圖靈爭辯說,假如計算機偽裝得如此巧妙,以致沒有人可以在實際上把它和一個真人分辨開來的話,那麼我們就可以聲稱,這台計算機和人一樣具備了思考能力,或者說,意識(他的原詞是“智慧”)。

在可計算性理論里,如果一系列操作數據的規則(如指令集、編程語言、細胞自動機)按照一定的順序可以計算出結果,被稱為圖靈完備(turing complete)。

比特幣腳本語言不是圖靈完備的,具有一定的局限性,它沒有循環語句和複雜的條件控制語句。

總結

本文介紹了比特幣的錢包和交易的概念,希望大家能夠喜歡。

本文作者:flydean程序那些事

本文鏈接:http://www.flydean.com/bitcoin-transactions/

本文來源:flydean的博客

歡迎關注我的公眾號:程序那些事,更多精彩等着您!

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

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

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

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

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

※教你寫出一流的銷售文案?

※超省錢租車方案

分類
發燒車訊

樂視傳財務危機,將以2.6億美元賣矽谷土地

中國樂視控股(LeEco Holdings)原本野心勃勃,要成為下一個中國版的特斯拉(Tesla Inc.),但最近卻陷入資金短缺困境,剛剛外媒傳出,樂視打算拋售不到一年前從雅虎(Yahoo Inc.)手中購入的矽谷土地,以解燃眉之急。

路透社17日引述未具名消息人士報導(見此),樂視為了償還對供應商與商業夥伴欠下的大筆債務,決定以2.6億美元的代價,把矽谷土地賣給沒沒無名的中國地產開發商正中置業集團(Genzon Group),價碼比去(2016)年6月購入時多出1,000萬美元。正中置業則確認,的確在跟樂視洽談購買土地的相關事宜。

消息並透露,樂視在矽谷的辦公室大舉裁員,估計員工數量已經大砍一半以上。

樂視執行長賈躍亭甫於去年11月在一份給員工的信中坦承,公司因為擴張速度過快,不幸陷入資金短缺困境。然而,賈躍亭在寫出這封信函的一個月前,才剛在舊金山宣布要在矽谷打造第一座北美總部;他當時說,北美總部估計會聘用12,000名員工。

賈躍亭曾在1月說,樂視的財務問題,可在3-4個月內解決。在他說完不久,地產商融創中國隨即對樂視投資了22億美元,但投資的對象卻是樂視的娛樂部門,而非燒錢嚴重的汽車製造部門。樂視在美國是與Faraday Future攜手開發豪華電動車,Faraday是賈躍亭出資控股的新創公司。

據Business Insider 1月的採訪發現,Faraday已然在崩解之中,從去年春季後,已有超過半打的資深主管離職,全球執行長更在重要消費電子展(CES)前夕打包走人。

知情人士形容Faraday組織結構、中美兩地的營運一團混亂,但當前最急迫的是現金不夠用。如果CES展後未能引入新資金,Faraday撐不過五月應該就會玩完。Faraday金主樂視對此表示全屬臆測,但拒絕進一步做評論。

(本文內容由授權使用。圖片出處:法拉第未來)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

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

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

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

※教你寫出一流的銷售文案?

※超省錢租車方案

分類
發燒車訊

mysql大表在不停機的情況下增加字段該怎麼處理

MySQL中給一張千萬甚至更大量級的表添加字段一直是比較頭疼的問題,遇到此情況通常該如果處理?本文通過常見的三種場景進行案例說明。

1、 環境準備

數據庫版本: 5.7.25-28(Percona 分支)

服務器配置:  3台centos 7虛擬機,配置均為2CPU  2G內存

數據庫架構: 1主2從的MHA架構(為了方便主從切換場景的演示,如開啟GTID,則兩節點即可),關於MHA搭建可參考此文 MySQL高可用之MHA集群部署

準備測試表:  創建一張2kw記錄的表,快速創建的方法可以參考快速創建連續數

本次對存儲過程稍作修改,多添加幾個字段,存儲過程如下:

DELIMITER $$
CREATE  PROCEDURE `sp_createNum`(cnt INT )
BEGIN
    DECLARE i INT  DEFAULT 1;
    DROP TABLE  if exists  tb_add_columns;
    CREATE TABLE if not exists tb_add_columns(id int primary key,col1 int,col2 varchar(32));
    INSERT INTO tb_add_columns(id,col1,col2) SELECT i  as id ,i%7 as col1,md5(i) as col2;
    
    WHILE i < cnt DO
      BEGIN
        INSERT INTO tb_add_columns(id,col1,col2) SELECT id + i   as id ,( id + i) %7 as col1,md5( id + i) as col2  FROM tb_add_columns WHERE id <=cnt - i ;
        SET i = i*2;
      END;
    END WHILE;
END$$
DELIMITER ;

調用存儲過程,完成測試表及測試數據的創建。

mysql> call sp_createNum(20000000);

 2.  直接添加字段

使用場景: 在系統不繁忙或者該表訪問不多的情況下,如符合ONLINE DDL的情況下,可以直接添加。

模擬場景: 創建一個測試腳本,每10s訪問該表隨機一條記錄,然後給該表添加字段

訪問腳本如下

#!/bin/bash
# gjc

for i in  {1..1000000000}                    # 訪問次數1000000000,按需調整即可
do
    id=$RANDOM                          #生成隨機數    
    mysql -uroot -p'123456' --socket=/data/mysql3306/tmp/mysql.sock  -e "select  a.*,now() from  testdb.tb_add_columns a where id = "$id     # 訪問數據
    sleep 10                            #  暫停10s
done

運行腳本

sh  test.sh

 給表添加字段

mysql> alter table  testdb.tb_add_columns add col3 int;

  此時,訪問正常。

 附ONLINE DDL的場景如下,建議DBA們必須弄清楚

(圖片轉載於https://blog.csdn.net/finalkof1983/article/details/88355314)

 

 (圖片轉載於https://blog.csdn.net/finalkof1983/article/details/88355314)

3.   使用工具在線添加

雖然Online DDL添加字段時,表依舊可以讀寫,但是生產環境使用場景中對大表操作使用最多的還是使用工具pt-osc或gh-ost添加。

本文主要介紹 pt-osc(pt-online-schema-change) 來添加字段,該命令是Percona Toolkit工具中的使用頻率最高的一種

關於Percona Toolkit的安裝及主要使用可以參考  五分鐘學會Percona Toolkit 安裝及使用

添加字段

root@mha1 ~]# pt-online-schema-change --alter "ADD COLUMN  col4  int" h=localhost,P=3306,p=123456,u=root,D=testdb,t=tb_add_columns,S=/data/mysql3306/tmp/mysql.sock  --charset=utf8mb4 --execute

主要過程如下:

1> Cannot connect to A=utf8mb4,P=3306,S=/data/mysql3306/tmp/mysql.sock,h=192.168.28.132,p=...,u=root
1> Cannot connect to A=utf8mb4,P=3306,S=/data/mysql3306/tmp/mysql.sock,h=192.168.28.131,p=...,u=root
No slaves found.  See --recursion-method if host mha1 has slaves.  #  因為使用的是socket方式連接數據庫 且未配置root遠程連接賬號,所以會有此提示

# A software update is available:
Operation, tries, wait:
  analyze_table, 10, 1                                     
  copy_rows, 10, 0.25                                       
  create_triggers, 10, 1                      
  drop_triggers, 10, 1
  swap_tables, 10, 1
  update_foreign_keys, 10, 1
Altering `testdb`.`tb_add_columns`...
Creating new table...                                     #  創建中間表,表名為"_原表名_new"
Created new table testdb._tb_add_columns_new OK.           
Altering new table...                                     #  修改表,也就是在新表上添加字段,因新表無數據,因此很快加完
Altered `testdb`.`_tb_add_columns_new` OK.                  
2020-06-20T12:23:43 Creating triggers...                  #  創建觸發器,用於在原表拷貝到新表的過程中原表有數據的變動(新增、修改、刪除)時,也會自動同步至新表中
2020-06-20T12:23:43 Created triggers OK.
2020-06-20T12:23:43 Copying approximately 19920500 rows... # 拷貝數據,數據庫量是統計信息里的,不準確
Copying `testdb`.`tb_add_columns`:  11% 03:50 remain       #  分批拷貝數據(根據表的size切分每批拷貝多少數據),拷貝過程中可以用show processlist看到對應的sql
Copying `testdb`.`tb_add_columns`:  22% 03:22 remain
Copying `testdb`.`tb_add_columns`:  32% 03:10 remain
Copying `testdb`.`tb_add_columns`:  42% 02:45 remain
Copying `testdb`.`tb_add_columns`:  51% 02:21 remain
Copying `testdb`.`tb_add_columns`:  62% 01:48 remain
Copying `testdb`.`tb_add_columns`:  72% 01:21 remain
Copying `testdb`.`tb_add_columns`:  81% 00:53 remain
Copying `testdb`.`tb_add_columns`:  91% 00:24 remain
2020-06-20T12:28:40 Copied rows OK.                       # 拷貝數據完成
2020-06-20T12:28:40 Analyzing new table...                # 優化新表
2020-06-20T12:28:40 Swapping tables...                    # 交換表名,將原表改為"_原表名_old",然後把新表表名改為原表名
2020-06-20T12:28:41 Swapped original and new tables OK.    
2020-06-20T12:28:41 Dropping old table...                 #  刪除舊錶(也可以添加參數不刪除舊錶)
2020-06-20T12:28:41 Dropped old table `testdb`.`_tb_add_columns_old` OK.
2020-06-20T12:28:41 Dropping triggers...                  # 刪除觸發器
2020-06-20T12:28:41 Dropped triggers OK.
Successfully altered `testdb`.`tb_add_columns`.            # 完成

修改過程中,讀寫均不受影響,大家可以寫個程序包含讀寫的

注:  無論是直接添加字段還是用pt-osc添加字段,首先都得拿到該表的元數據鎖,然後才能添加(包括pt-osc在創建觸發器和最後交換表名時都涉及),因此,如果一張表是熱表,讀寫特別頻繁或者添加時被其他會話佔用,則無法添加。

例如: 鎖住一條記錄

用pt-osc添加字段,會發現一直卡在創建觸發器那一步

 此時查看對應的SQL正在等待獲取元數據鎖

換成直接添加也一樣,例如

 當達到鎖等待后將會報錯放棄添加字段

mysql> alter table  testdb.tb_add_columns add col5 int;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

對於此情況,需等待系統不繁忙情況下添加,或者使用後續的在從庫創建再進行主從切換

4  先在從庫修改,再進行主從切換

使用場景: 如果遇到上例中一張表數據量大且是熱表(讀寫特別頻繁),則可以考慮先在從庫添加,再進行主從切換,切換后再將其他幾個節點上添加字段。

先在從庫添加(本文在備選節點添加)

mysql> alter table  testdb.tb_add_columns add col5 int;
Query OK, 0 rows affected (1 min 1.91 sec)
Records: 0  Duplicates: 0  Warnings: 0

進行主從切換

使用MHA腳本進行在線切換

masterha_master_switch  --conf=/etc/masterha/app1.conf --master_state=alive  --orig_master_is_new_slave --new_master_host=192.168.28.131  --new_master_port=3306

切換完成后再對其他節點添加字段

/* 原主庫上添加192.168.28.128  */
mysql>  alter table  testdb.tb_add_columns add col5 int;
Query OK, 0 rows affected (1 min 8.36 sec)
Records: 0  Duplicates: 0  Warnings: 0

/* 另一個從庫上添加192.168.28.132  */
mysql>  alter table  testdb.tb_add_columns add col5 int;
Query OK, 0 rows affected (1 min 8.64 sec)
Records: 0  Duplicates: 0  Warnings: 0

這樣就完成了字段添加。

5.  小結

生產環境MySQL添加或修改字段主要通過如下三種方式進行,實際使用中還有很多注意事項,大家要多多總結。

  • 直接添加

如果該表讀寫不頻繁,數據量較小(通常1G以內或百萬以內),直接添加即可(可以了解一下online ddl的知識)

  •  使用pt_osc添加

如果表較大 但是讀寫不是太大,且想盡量不影響原表的讀寫,可以用percona tools進行添加,相當於新建一張添加了字段的新表,再降原表的數據複製到新表中,複製歷史數據期間的數據也會同步至新表,最後刪除原表,將新表重命名為原表表名,實現字段添加

  •  先在從庫添加 再進行主從切換

如果一張表數據量大且是熱表(讀寫特別頻繁),則可以考慮先在從庫添加,再進行主從切換,切換后再將其他幾個節點上添加字段

 

 

 

 

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

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

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

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

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

※教你寫出一流的銷售文案?

※超省錢租車方案

分類
發燒車訊

Gogoro擴點台中南投屏東,全台將有360個換電站

徹底改寫電動機車市場銷售紀錄的新創公司Gogoro,在短短兩年內已突破20,000 輛的銷售數字,並建置了300 多個電池交換站,充分展現了積極搶攻市場版圖的超高效率與決心。Gogoro 13 日宣布,將在4 月底開始投入在台中海線的3 個城鎮以及屏東地區首座換電站的設置;5 月底前則將進入南投。

Gogoro 能源服務副總經理潘璟倫表示,Gogoro 在第一季的布站目標主要著力在高雄及台南地區,共於該區新增了19 個換電站。第二季,則會強化在六都以外的建置計畫,除預計在屏東市、東港、南投市、草屯、員林等地設置首座換電站外,也會在清水,沙鹿,大甲與鹿港4 個城鎮分別設置換電站以串連、打通台中彰化的海線。Gogoro 最南端的換電站,也預期在第二季末於東港設立。這些都是依據大數據分析的結果所進行的計畫,後續,大家也可以很快地可以看到在不同的區域,看到GoStation 電池交換站。

在六都地區,Gogoro 仍以「一公里一座換電站」為能源網路目標,從北台灣一路往南延伸,透過與加油站、捷運站、學校、便利商店、賣場等單位異業結盟,合作布點的方式,積極擴大台灣綠色生活圈。

依照Gogoro 第二季的計畫,6 月底前,全台將會有360 個換電站。這讓Gogoro 更貼近其將在2017 年底完成西岸走廊串連,讓基隆到屏東的西部都會區得以北南縱走,暢騎無阻的承諾。

(合作媒體:。圖片出處:Gogoro)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

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

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

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

※教你寫出一流的銷售文案?

※超省錢租車方案

分類
發燒車訊

圖像處理中的valid卷積與same卷積

valid卷積

在full卷積的卷積過程中,會遇到\(K_{flip}\)靠近I的邊界(K矩陣與I矩陣),就會有部分延申到I之外,這時候忽略邊界,只考慮I完全覆蓋\(K_{flip}\)內的值情況,這個的過程就是valid卷積。一個高為H1,寬為W1的矩陣I與高為H2,寬為W2的矩陣K,在H1大於等於H2,W1大於等於W2的情況下,valid卷積的結果就是一個(H1-H2+1)*(W-W+1)的矩陣\(C_{valid}\)

\[C_{valid}與C_{full}的對應關係為: C_{valid} = C_{full}( Rect (W_{2}-1,H_{2}-1,W_{1}-W_{2}+1,H_{1}-H_{2}+1) ) \]

same卷積

無論是full卷積還是valid卷積都不會得到正好的尺寸,要麼比原尺寸大要麼比原尺寸小,這時就需要same卷積來解決這個問題。若想得到寬和高都正好的矩陣我們首先需要給\(K_{flip}\)一個錨點,將錨點放在(循環)圖像矩陣的(r,c)處,((r,c)在矩陣之內),將對應位置的元素逐個相乘,最終將所有的積進行求和作為輸出圖像矩陣在(r,c)處的輸出值。這個過程稱為same卷積。
OpenCv函數copyMakeBorder的參數表

參數 解釋
src 輸入矩陣
dst 輸出矩陣
top 上側擴充的行數
bottom 下側擴充的行數
left 左側擴充的行數
right 右側擴充的行數
borderType 邊界擴充的類型
value border Type= BORDER_CONSTANT事的常數

其中borderType有多種類型,比如:BORDER_REPLICATE(邊界複製)、BORDER_CONSTANT(常數擴充)、BORDER_REFLECT(反射擴充)等。
在使用Python進行卷積操作時用到包Scipy,其中有關的操作函數為convolve2d(in1,in2,mode=’full’,boundary=’fill’,fillvalue=0)

參數 解釋
in1 輸入數組
in2 輸入數組,代表K(卷積算子)
mode 卷積類型,也就是以上提到的三種類型:full,valid,same
boundary 邊界填充:fill\wrap\symm
fillvalue 當boundary=’fill’時,設置邊界填充的值,默認為0

在這裏需要注意的是當model為same時卷積算子的錨點位置由不同尺寸而不同,假設K(卷積算子)的寬和高分別為W、H。

W和H的值 錨點位置
均為奇數 默認為中心點
H為偶數、W為奇數 (H-1,(W-1)/2)
H為奇數,W為偶數 ((H-1)/2,W-1)
均為偶數 (H-1,W-1)

代碼實現:

import numpy as np
from scipy import signal

if __name__ == "__main__":

    I = np.array([[1,2],[3,4],np.float32])
    #I的高和寬
    H1,W1 = I.shape[:2]
    #卷積算子
    k = np.array([[-1,-2],[2,1],np.float32])
    #K的寬和高
    H2,W2 = k.shape[:2]
    #計算full卷積
    c_full = signal.convolve2d(I,k,mode='full')
    #設定錨點
    r,c = 0,0
    #根據錨點來從full卷積中截取same卷積
    c_same= c_full[H2-r-1:H1-r-1,W2-c-1:W1+W2-c-1]

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

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

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

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

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

※教你寫出一流的銷售文案?

※超省錢租車方案