分類
發燒車訊

電動車商機大,Panasonic再收購Ficosa

 

Panasonic 21日發布新聞稿宣布,將追加收購西班牙汽車零件大廠Ficosa International SA 20%股權,目標在今年4月把持股提高至69%、將Ficosa收編為旗下子公司行列,以期望藉由加深與Ficosa的合作,強化車用電子鏡、先進駕駛輔助系統(ADAS)等車用事業。Panasonic於2015年6月取得Ficosa 49%股權。

Ficosa為全球第3大車用門鏡商,2015年營收為11億歐元,並計畫於2017年開賣與Panasonic攜手研發的新型車鏡。

車用相關事業被Panasonic視為成長領域事業,Panasonic計畫在2018年度將車用相關事業營收提高至2兆日圓、將較2015年度的1.3兆日圓大增5成。

路透社報導,Panasonic社長津賀一宏1月接受專訪時表示,「2兆日圓不是一個頂點,應該將目光瞄準在之後的2.5兆日圓或更高的目標上」。

根據嘉實XQ全球贏家系統報價,截至台北時間22日13點18分為止,Panasonic大跌2.85%至1,209.5日圓,創約1個月來(2月10日以來)新低水準。

日經新聞於去年12月5日報導,IT、電機大廠為了搶食自動駕駛、電動車(EV)普及所將引發的商機,正積極進行併購,其中日本Panasonic將收購歐洲車燈大廠ZKW、進軍車燈市場。據悉,Panasonic、ZKW已就收購進入最終協商階段,預估收購額最高將達1,000億日圓的規模。

(本文內容由授權使用。圖片出處:Ficosa)

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

【其他文章推薦】

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

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

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

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

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

分類
發燒車訊

大摩:特斯拉Model 3自駕系統車禍降低90%

電動車大廠特斯拉(Tesla Inc.)要價35,000美元的平價車種「Model 3」預計2017年稍晚就能開賣,摩根士丹利(通稱大摩)認為,這款電動車的安全度會是一般車輛的10倍之多,發生死亡車禍的機率有望比其他車種低90%。

根據網友最近在YouTube貼出影片,自駕系統「Autopilot」能提前好幾步預測到車禍。()

MarketWatch、Business Insider等外電報導,大摩分析師Adam Jonas 23日發表研究報告指出,特斯拉為每台車安裝超級電腦後,車子安全性提升至其他車輛兩倍已經不夠看,他相信Model 3的安全度會是其他車輛的十倍之多,這會讓死亡車禍的發生機會降低90%。

Jonas認為,缺少特斯拉駕車輔助科技的二手車價值將因而猛掉,未來甚至會被禁止上路。特斯拉蒐集資料的能力超群,還能將先進的安全輔助技術應用到電動車,還未推出類似科技的傳統車廠,競爭力堪虞。

假如Model 3大獲成功、數百萬輛擁有自駕功能的車輛上路,那麼對行車安全的統計資料應有影響,這會凸顯其科技的優異程度,並迫使主管機關下令要求所有車輛都必須配備類似的系統。

特斯拉23日終場下跌0.09%、收254.78美元;年初迄今已大漲19.23%。

不過,最近有人仔細挖掘特斯拉向美國證管會(SEC)呈交的最新10-K報告,發現該公司已在內文悄悄坦承,Model 3 Beta版的原型車,至今尚無蹤影。

美國權威汽車雜誌《Car and Driver》記者Anton Wahlman 3月2日報導(),特斯拉在3月1日發布的10-K報告中表示,已在測試Model 3的設計和製程時開發出多種版本,可作為Model 3 Beta版原型車的候選選項;在董事會選定要用哪一款作為Beta版的原型車之後,特斯拉下一階段的工作里程碑就能順利達陣。

Wahlman認為,這意味著特斯拉在該份公告涵蓋的期間內(截至2016年12月31日為止),仍舊還未完成Model 3 Beta版的原型車。不過,這份文件是在2017年3月1日發布,這或許也代表至3月初為止,董事會還未對要用哪款原型車拍板定案。

  (本文內容由授權使用。圖片出處:Public Domain)

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

【其他文章推薦】

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

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

※想知道最厲害的網頁設計公司"嚨底家"!

※別再煩惱如何寫文案,掌握八大原則!

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

分類
發燒車訊

博弈論——兩人取子遊戲與威佐夫博弈,隱藏在背後的黃金分割

本文始發於個人公眾號:TechFlow,原創不易,求個關注

今天是算法和數據結構專題第25篇文章,我們繼續博弈論專題。

在上一篇文章當中我們了解了最簡單的巴什博奕,今天我們來看看另一個經典的博弈模型——威佐夫博弈。博弈論和機器學習有些類似,數學家們針對場景進行建模,設計出了幾個經典模型。然後我們在面臨具體問題的時候,對問題進行深入分析,尋找最合適的模型應用來解決它。

石子問題

我們來看一道經典的例題,有兩堆石子,有兩個絕頂聰明的人在玩一個遊戲。每次每個人可以從其中一堆石子當中取走任意數量的石子,或者是從兩堆當中同時取走相同數量的石子。無法取石子的人落敗,請問,在告知兩堆石子數量的情況下,這兩個人當中哪一方會獲勝?

我們簡單分析一下,會發現一些局面是先手必敗的。比如說(0, 0),再比如(1, 2)。我們簡單分析一下(1, 2),先手有4種策略,首先他可以取走第一堆,那麼後手可以取完第二堆,顯然後手獲勝。他也可以在第二堆當中取1個,這時剩下(1, 1),後手會同時取完,同樣是後手獲勝。第三種是他取走第二堆,後手可以取完第一堆,後手獲勝。第四種是他在第一堆和第二堆當中同時取走一個,這時第二堆剩下一個,後手勝。

那麼,這些必敗的狀態之間有什麼規律呢?我們怎麼找到這個規律,並且找到解呢?

分析

我們可以枚舉幾個必敗的狀態:(0, 0), (1, 2), (3, 5), (4, 7)…

我們觀察一下這些狀態,可以找到兩條規律。我們假設從小到大排的第k個必敗狀態是(x, y),並且x < y。我們可以發現y = x + k。也就是說必敗狀態兩個數的差值是遞增的,這也說明了每一個必敗狀態的差值都各不相同。

其實這是很容易證明的,我們用反證法,假設(a, a+k), (b, b+k)都是必敗狀態,並且a < b。那麼先手在面臨(b, b+k)的時候,只需要在兩堆當中同時取走b-a個石子,那麼給後手的局面就是(a, a+k)。對於後手來說,這是一個必敗的局面,這就和(b, b+k)先手必敗矛盾,所以不存在兩個必敗局面的差值相等

我們也可以作圖分析,我們把兩堆石子的數量看成是坐標軸上的一個點。所以遊戲就變成了:棋盤上有一個點,每次每個人可以將它向下、向左或者向左下移動若干個格子,不能移動的人輸。終止節點顯然是原點,一步就能移動到原點的點顯然是必勝點,假設我們給這些所有必勝點都染色的話,剩下的的沒當中橫縱坐標和最小的點就是下一個必敗點。因為它不論如何移動,都會給對手留下一個必勝點。

我們根據上面的邏輯把必敗點都染色,可以得到下面這張圖:

從這張圖可以看出,必敗點之間不能通過一次移動得到,換句話說可以一次移動到必敗點的點都是必勝點,從圖上可以看出,除了必敗點的之外的點都是必勝點,並且每一個自然數都必然只會被包含在一個必敗狀態當中。

到這裏,我們距離解法已經很接近了,現在剩下的問題是,我們如何根據x和y的取值快速判斷它們是否構成一個必敗局面呢?也就是說我們能不能找出一個通項公式,對於第k個必敗局面,它的坐標是(\(x_k, y_k\))呢?

求解

為了寫出通項公式,我們需要引入Betty定理

設a和b是兩個正無理數,並且\(\frac{1}{a} + \frac{1}{b} = 1\)

記P={[\(a_n\)], \(n \in N^+\)}, Q={[\(b_n\)], \(n \in N^+\)},則\(P \cap Q = \varnothing\)\(P\cup Q = N^+\)

證明

\(P\cap Q = \varnothing\)

反證,我們假設存在\(k \in P\)並且\(k \in Q\),即存在正整數n, m滿足 k < an, bm < k+1。

也就是:\(\frac{n}{k} > \frac{1}{a} > \frac{n}{k+1}, \frac{m}{k} > \frac{1}{b} > \frac{m}{k+1}\)兩個式子相加可以得到:\(\frac{m+n}{k} > 1 > \frac{m+n}{k}\)

\(k < n+m < k+ 1\),這與n,m,k都是正整數矛盾

\(P \cup Q = N^+\)

反證,假設存在\(k \notin P\)\(k \notin Q\),即存在正整數n,m滿足\(an < k < a(n+1)-1, bm < k < b(m+1)-1\)

即:\(\frac{n}{k} < \frac{1}{a} < \frac{n+1}{k+1}, \frac{m}{k} < \frac{1}{b} < \frac{m+1}{k+1}\)

相加,可以得到:\(\frac{m+n}{k} < 1 < \frac{n+m+2}{k+1}\)

即:n + m < k < n + m + 1,這與n,m,k均為正整數矛盾

我們花了這麼大力氣來證明Betty定理就是為了用的,因為我們發現必敗狀態的通項和Betty定理序列很像。我們不妨假設存在這樣的a, b同時滿足Betty定理與必敗狀態的性質:

\[[an] + n = [bn], \frac{1}{a} + \frac{1}{b} = 1 \]

\[[an] + n = [an + n] = [(a+1)n] = [bn] \]

代入可以得到:

\[\frac{1}{a} + \frac{1}{a+1} = 1 \]

解這個方程,可以得到\(a = \frac{1 + \sqrt{5}}{2}\approx 1.618\),熟悉數學的同學相信一下就看出來了,這個數是黃金分割的比例,這是巧合嗎,還是藏着更深的道理呢?

至少,求出了a之後,我們就可以非常簡單地判斷必敗狀態了:

import math
def lose_or_win(a, b):
    if a > b:
        a, b = b, a
    
    k = b - a
    # 根據差值k求出第k個必敗狀態,判斷是否相等
    return not (int(k * (math.sqrt(5)+1) / 2)) == a

總結

和之前介紹的巴什博奕相比,威佐夫博弈的推導過程要複雜得多,但是雖然推導過程依然複雜,但是仍然擋不住最後實現的代碼非常簡單。

另外,在推導的過程當中,我們用到了Betty定理,這個定理的推導和證明雖然不難,但是如果不是數學專業的同學,可能大概率都沒有接觸過。這其實體現了博弈論本身和數學的關係是非常緊密的。一個看起來非常簡單的問題,引申出了一系列眼花繚亂的推導和證明,怎麼樣,大家看得還過癮嗎?

今天的文章到這裏就結束了,如果喜歡本文,可以的話,請點個關注,給我一點鼓勵,也方便獲取更多文章。

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

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

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

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

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

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

分類
發燒車訊

Task.Result跟 Task.GetAwaiter.GetResult()相同嗎?怎麼選?

前幾天在用線程池執行一些任務時運到一種情形,就是回調方法中使用到了異步方法,但是回調方法貌似不支持async await的寫法。這時候我應該如何處理呢?是使用Task.Result來獲取返回結果,還是使用GetAwaiter.GetResult()呢?本文就來探討下吧。

作者:依樂祝

原文地址:https://www.cnblogs.com/yilezhu/p/13168337.html

這裏先上我這種場景的偽代碼:

ThreadPool.QueueUserWorkItem(ExcuteScanProcess, node);

ExcuteScanProcess這個回調方法中

private void ExcuteScanProcess(object state)
{
    ……其他處理……
    repository.UpdateAsync(node).ConfigureAwait(false).GetAwaiter().GetResult();
    ……其他處理……
}

如上圖所示repository.UpdateAsync(node)屬於一部方法,這時候我想要等待它異步執行完成之後再執行後續的邏輯。這時候我有兩種選擇,是直接

repository.UpdateAsync(node).ConfigureAwait(false).GetAwaiter().GetResult();

好呢,還是

repository.UpdateAsync(node).ConfigureAwait(false).Result;

好呢?

為此我查找了相關的資料,對它倆的區別做一個簡單的總結:

其實這兩個使用方式是差不多的。不過,還是有一點小小的區別的:如果任務失敗,Task.GetAwaiter().GetResult()會直接拋出異常,而Task.Result則會把異常包裝在AggregateException中。從這個角度說Task.GetAwaiter().GetResult()要優於Task.Result。畢竟它少了異常的包裝操作,即直接拋出異常,而不是把異常包裝在AggregateException中。

下面的引言解釋了為什麼Task.Result不僅僅包含Task.GetAwaiter().GetResult()(由於“非常高的兼容性”)的異常傳播行為。

如前所述,我們有一個非常高的兼容性標準,因此我們避免了改動。因此,Task.Wait保留了始終包裝的原始行為。但是,您可能會發現自己處在某些高級情況下,這些情況下您想要的行為類似於所採用的同步阻塞Task.Wait,但是您希望將原始異常展開而不是傳播,而不是將其封裝在AggregateException中。為此,您可以直接定位任務的等待者。當您編寫“ await task;”時,編譯器Task.GetAwaiter()會將其轉換為方法的用法,這將返回具有GetResult()方法的實例。當用於有故障的任務時,GetResult()將傳播原始異常(這是“ await task;” 如何獲得其行為)。因此,您可以使用“task.GetAwaiter().GetResult()如果您想直接調用此傳播邏輯。

https://blogs.msdn.microsoft.com/pfxteam/2011/09/28/task-exception-handling-in-net-4-5/

GetResult”實際上表示“檢查任務是否有錯誤”

通常,我會儘力避免對異步任務進行同步阻塞。但是,在少數情況下,我確實違反了該準則。在那些罕見的情況下,我的首選方法是GetAwaiter().GetResult()因為它保留任務異常,而不是將它們包裝在中AggregateException

總結

通過上述內容的闡述,因此在那些必須對異步任務進行同步阻塞的場景中,我選擇使用GetAwaiter().GetResult()

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

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

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

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

分類
發燒車訊

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進行添加,相當於新建一張添加了字段的新表,再降原表的數據複製到新表中,複製歷史數據期間的數據也會同步至新表,最後刪除原表,將新表重命名為原表表名,實現字段添加

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

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

 

 

 

 

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

【其他文章推薦】

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

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

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

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

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

※超省錢租車方案

分類
發燒車訊

linux環境下搭建Jenkins持續集成(Jenkins+git+shell+maven+tomact)

準備環境

  jenkins.war包 ,jdk1.8  ,tomact , maven,git

1.Jenkins  war包,下載地址https://jenkins.io/zh/download/  ,當然你可以通過wget 下載, 也可以通過xftp遠程傳輸

2. jdk1.8   配置方法步驟詳見 https://www.cnblogs.com/xinhua19/p/12708493.html

3.tomact包   下載地址  https://tomcat.apache.org/download-90.cgi

 

 

 4.git包, 安裝配置方法詳情見 https://www.cnblogs.com/xinhua19/p/12721342.html

5.maven包    https://maven.apache.org/download.cgi

 

 

 

 

 

1,準備環境準備完畢

解壓縮JAVA包,存放在/usr目錄

解壓縮tomact包 ,存入/usr目錄

啟動tomact成功后,停止tomact          ./catalina.sh run    ./start.sh          sh shutdown.sh

將jenkins.war包存放在tomact下webapps的目錄中 

啟動tomact

 

IP+端口號/Jenkins   訪問jenkins

部署tomact后啟動jenkins  

2.初次啟動時 準備所需插件比較慢 需要等待很久

 

 

 

 

 

 

全部準備完成后

 這一步是Jenkins的漢化

 

 

 

 

 

 

Jenkins搭建成功啦,現在剩下的就是Jenkins的各個配置

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

【其他文章推薦】

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

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

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

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

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化

分類
發燒車訊

三角函數與緩入緩出動畫及C#實現(圖文講解)

日常經常能看到緩入緩出的動畫效果,如:

1,帶緩入緩出效果的滾動條:

2,帶緩入緩出效果的呼吸燈:

像上面這種效果,就是用到了三角函數相關的知識,下面將從頭開始一步步去講解如何實現這種效果。

 

 

一、基礎知識

(一)三角函數

常用的三角函數有正弦函數(sin)、餘弦函數(cos)、正切函數(tan)。在動畫效果中常用的是正弦函數和餘弦函數,由於兩者可以互相轉化,所以本文將以正弦函數來進行講解。

如下圖所示直角三角形ABC:

則:

sin(A)=a/c

即:角A的正弦值=角A的對邊/斜邊

(二)正弦曲線

將三角函數與動畫橋接起來的便是三角函數曲線。

以正弦函數為例,其正弦曲線公式為:y = A*sin(B*x + C) + D

其中y、x分別是縱坐標、橫坐標。

1,在默認狀態時,即:y=sin(x) 時,其曲線如下圖所示:

2,正弦曲線公式中的參數 “A” 控制曲線的振幅,A 值越大,振幅越大,A 值越小,振幅越小。

如:y=2*sin(x),其曲線如下圖所示(藍線為 y=sin(x)):

3,參數 “B” 控控制曲線的周期,B 值越大,那麼周期越短,B 值越小,周期越長。

如:y=sin(2x),其曲線如下圖所示(藍線為 y=sin(x)):

4,參數 “C” 控控制曲線左右移動,C 值為正數,曲線左移,C 值為負數,曲線右移;

如:y=sin(x+1),其曲線如下圖所示(藍線為 y=sin(x)):

5,參數 “D” 控控制曲線上下移動。D 值為正數,曲線上移,D 值為負數,曲線下移;

如:y=sin(x)+1,其曲線如下圖所示(藍線為 y=sin(x)):

(三)角度與弧度

因為在使用代碼去計算正弦值時,其單位一般是弧度,像C#中的”Math.Sin()“函數,而直觀的效果卻是角度,所以需要講解一下角度與弧度。

1,角度

定義:兩條射線從圓心向圓周射出,形成一個夾角和夾角正對的一段弧。當這段弧長正好等於圓周長的360分之中的一個時,兩條射線的夾角的大小為1度。

示意圖如下:

2,弧度

定義:弧度:兩條射線從圓心向圓周射出,形成一個夾角和夾角正對的一段弧。當這段弧長正好等於圓的半徑時,兩條射線的夾角大小為1弧度。

示意圖如下:

其中:AB=OA=r

3,角度與弧度的差別

最基本的差別在於角所對的弧長大小不同。度的是等於圓周長的360分之中的一個,而弧度的是等於半徑。

4,角度與弧度的轉換

因為:弧度角=弧長/半徑

所以:

a,周角(360度)=周長/半徑=2πr/r=2π

b,平角(180度)=π

由b可知:180度=π弧度

所以:

c,1度=π/180 弧度(≈0.017453弧度)
d,1弧度=180/π 度(≈57.3度)

可得轉換公式:

弧度=度*π/180
度=弧度*180/π

 

三、動畫實現

實現的思路簡單而言便是利用正弦曲線的”y“和”x“值的變化。對於緩入緩出動畫,就是速度的變化。

速度的定義和公式:速度在數值上等於物體運動的位移跟發生這段位移所用的時間的比值。速度的計算公式為v=Δs/Δt

控制速度,無非是”距離“與”時間“這兩個量的變化。

在實現應用中,往往不會同時變化兩個量,而是固定一個量,變化一個量。

在實際程序實現時,一般是固定“時間”,只變化“距離”。此處的”時間“可以理解為”時間間隔“。即在時間間隔不變的情況下,需要考慮每個時間間隔內運行的距離。

那麼在正弦曲線上的體現便是等x間隔下,y的取值。

(一)簡單實現

(1)實現思路:

1,通過y=sin(x)的曲線可知:y值的範圍是(-1~+1)

2,將曲線上移,上移距離為1,即:y=sin(x)+1,此時y值的範圍:(0~2)

3,為使y值範圍變為(0~1),對函數除2,即:y=(sin(x)+1)/2

如圖(藍線為 y=sin(x)):

4,將y值乘以緩入緩出動畫的擺動距離

(2)C#實現:

1,控件布局及屬性

2,核心代碼

 1 void pShowD()
 2 {
 3     //i是度數,不是弧度
 4     int i = 0;
 5     //移動距離要減去滑塊本身的寬度
 6     double dMoveDistance = panel_Board.Width - panel_Slider.Width;
 7     while (true)
 8     {
 9         i++;
10         if (i > 360)
11         {
12             //一個周期是360度
13             i = 0;
14         }
15         //固定時間間隔
16         Thread.Sleep(10);
17         //通過公式:弧度=度*π/180,將度數i轉為Math.Sin()所需要的弧度數
18         double dz = dMoveDistance * (1 + Math.Sin(i * Math.PI / 180)) / 2;
19         pSetLeft(Convert.ToInt32(dz));
20 
21     }
22 }
23 
24 void pSetLeft(int i)
25 {
26     if (panel_Slider.InvokeRequired)
27     {
28         panel_Slider.Invoke(new Action<int>(pSetLeft), new object[] { i });
29     }
30     else
31     {
32         panel_Slider.Left = i;
33     }
34 }

簡單實現

3,運行效果

(二)簡單實現優化

通過觀察上面的實現,可以發現雖然實現了緩入緩出效果,但是其”滑塊“(panel_Slider)的起始位置卻不是最左側,而是從中間開始。

根據上面的公式也可以看出來,當x=0時,y=(sin(x)+1)/2=1/2,即:整個擺動距離的二分之一。

(1)優化思路

為了讓滑塊從最左側開始,則需要將曲線向右移動,移動距離是π/2。

其曲線公式變為:y=(sin(x-π/2)+1)/2

如圖(藍線為 y=sin(x)):

(2)C#實現

1,布局同上。

2,核心代碼

 1 void pShowD2()
 2 {
 3     //i是度數,不是弧度
 4     int i = 0;
 5     //移動距離要減去滑塊本身的寬度
 6     double dMoveDistance = panel_Board.Width - panel_Slider.Width;
 7     while (true)
 8     {
 9         i++;
10         if (i > 360)
11         {
12             //一個周期是360度
13             i = 0;
14         }
15         //固定時間間隔
16         Thread.Sleep(10);
17         //通過公式:弧度=度*π/180,將度數i轉為Math.Sin()所需要的弧度數
18         //因為i是度數,所以是(i-90)
19         double dz = dMoveDistance * (1 + Math.Sin((i-90) * Math.PI / 180)) / 2;
20         pSetLeft(Convert.ToInt32(dz));
21 
22     }
23 }
24 
25 void pSetLeft(int i)
26 {
27     if (panel_Slider.InvokeRequired)
28     {
29         panel_Slider.Invoke(new Action<int>(pSetLeft), new object[] { i });
30     }
31     else
32     {
33         panel_Slider.Left = i;
34     }
35 }

簡單實現(優化)

3,運行效果

(三)擴展實現

在實際應用中,動畫往往需要在”固定時間“內完成。

以前面實現為例,使滑塊從左端滑到右端的時長固定為1秒。該怎麼實現呢?

 (1)實現思路

整體思路與之前的並沒有什麼大的區別,仍是固定”時間“,變化”距離“。

在前面的”簡單實現(優化)“的基礎上,需要增加下面的一些修改和補充:

1,假設”時間間隔“為:Interval,那麼,在指定的1秒內,共會變化(Step=1/Interval)次。

2,那麼,每次變化時度數的變化便不再是”1“,又一個周期是滑塊一個來回,所以,第次變化的度數便是:Per=2π/2*Step=180/Step。

(2)C#實現

在實現時加入了勻速的對比。

1,布局及屬性

2,核心代碼

 1 void pShowD2()
 2 {
 3     //當前滑塊的位置
 4     double d = 0;
 5     //true/false:向右滑/向左滑
 6     bool bToRight = true;
 7     //時間間隔,單位:ms
 8     int iInterval = 10;
 9     //從左到右所需要的總時間,單位:ms
10     int iAnimateTime = 1000;
11     //移動距離要減去滑塊本身的寬度
12     double dMoveDistance = panel_Board.Width - panel_Slider.Width;
13     //需要變化的次數
14     double dStep = Convert.ToDouble(iAnimateTime) / iInterval;
15     //每次變化所增加的距離
16     double dPerX = dMoveDistance / dStep;
17     while (true)
18     {
19         d = bToRight ? d + dPerX : d - dPerX;
20         if (d > dMoveDistance)
21         {
22             bToRight = false;
23         }
24         if (d < 0)
25         {
26             bToRight = true;
27         }
28 
29         Thread.Sleep(iInterval);
30         int iZ = Convert.ToInt32(d);
31         pSetLeft2(iZ);
32 
33     }
34 }
35 void pSetLeft2(int i)
36 {
37     if (panel_S2.InvokeRequired)
38     {
39         panel_S2.Invoke(new Action<int>(pSetLeft2), new object[] { i });
40     }
41     else
42     {
43         panel_S2.Left = i;
44     }
45 }

1,勻速

 1 void pShowD()
 2 {
 3     //d是度數,不是弧度
 4     double d = 0;
 5     //時間間隔,單位:ms
 6     int iInterval = 10;
 7     //從左到右所需要的總時間,單位:ms
 8     int iAnimateTime = 1000;
 9     //移動距離要減去滑塊本身的寬度
10     double dMoveDistance = panel_Board.Width - panel_Slider.Width;
11     //需要變化的次數
12     double dStep = Convert.ToDouble(iAnimateTime) / iInterval;
13     //每次變化所增加的度數
14     double dPer = 180.0 / dStep;
15     while (true)
16     {
17         d += dPer;
18         if (d > 360)
19         {
20             //一個周期是360度
21             d = 0;
22         }
23         //固定時間間隔
24         Thread.Sleep(iInterval);
25         //通過公式:弧度=度*π/180,將度數i轉為Math.Sin()所需要的弧度數
26         double dz = dMoveDistance * (1 + Math.Sin((d - 90) * Math.PI / 180)) / 2;
27         pSetLeft(Convert.ToInt32(dz));
28 
29     }
30 }
31 
32 void pSetLeft(int i)
33 {
34     if (panel_Slider.InvokeRequired)
35     {
36         panel_Slider.Invoke(new Action<int>(pSetLeft), new object[] { i });
37     }
38     else
39     {
40         panel_Slider.Left = i;
41     }
42 }

2,緩入緩出

3,運行效果

 

 

四、結束語

本篇主要講的是三角函數與緩入緩出動畫,但三角函數在動畫中的作用不僅僅如此,比如直接使用正弦曲線的形狀來繪製波浪效果——在充電、進度條等地方可以使用該效果。

而且即然知道在曲線在動畫中的作用,那麼便可以通過不同的函數曲線實現不同的動畫效果,比如另一個非常好用的”貝塞爾曲線“,可以實現更複雜、更優雅的動畫效果。

 

如有錯誤和不足之處歡迎大家批評指正。

 

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

【其他文章推薦】

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

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

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

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

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

分類
發燒車訊

流產、死胎層出不窮 南蘇丹隱匿石油業環境報告 犧牲者至今未受保障

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

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

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

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

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

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

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

分類
發燒車訊

2017中國國際新能源汽車產業博覽會

展會城市:
深圳、上海
展會開始日期:
深圳:2017/6/16
上海:2017/8/23
展會結束日期:
深圳:2017/6/18
上海:2017/8/25

2017新能源汽車產業博覽會將於2017年6月16-18日,8月23-25日分別在深圳會展中心及上海新國際博覽中心舉行,本屆展會預計累計展示面積達7萬平米,展商超過800家,專業觀眾超過6萬人次,全產業鏈展示實現無縫對接。

展會以展覽展示及技術交流為主題,組委會將重點邀請新能源汽車生產企業及核心三電(電池、電機、電控)企業參與。新能源汽車領域包括:比亞迪、北汽、上汽、宇通、金龍、青年客車、福田、中通、東風、力帆等;電池領域包括:國軒、寧德時代、力神、沃特瑪、邁科等;電機電控領域包括:寶馬、中國南車、大洋電機、中科三環、上海大郡、上海電驅動、浙江尤奈特、深圳大地和、大連機電、東風機電、南洋機電、精進電動等。

振威展覽【股票代碼:834316】是中國規模最大的民營展覽公司,深耕行業20年,于北京、天津、廣州、西安、成都、新疆分別設有全資子公司。每年承接20多個大型政府展會,累積了豐富的政府資源和關係網絡。為打通新能源汽車產業各大環節的壁壘,振威展覽聯合中國土木工程學會城市公共交通學會、廣東省充電設施協會、充電設施線上網,共同打造中國新能源汽車產業第一展。

主辦方積累了豐富的資源,本屆展會得到了上海市經信委、江蘇省經信委、浙江省經信委、武漢市經信委、廣州市經信委等政府部門的高度關注與大力支持。此外,展會還將重點邀請各地公交集團、旅遊公司、計程車運營公司、汽車租賃企業、大型物流公司、市政環衛公司等組團參觀交流,迅速實現供需對接。

兩地展會同期均舉辦2017振威新能源汽車產業峰會,峰會圍繞當前最熱門話題展開討論。如何更好的實現市場驅動,如何提高整個產業的核心競爭力,都是需要我們共同思考的問題。為此,組委會將邀請來自新能源汽車產業各個領域的知名專家學者、領軍企業高層與政府代表、協會代表,共同探討新形勢下如何更好的提升市場化水準,如何提升企業核心競爭力、深化全產業鏈的交流與合作,實現共贏的局面。

參展範圍

新能源汽車

純電動車:純電動客車、純電動城市物流車、純電動乘用車、純電動環衛車等;
混合動力車:混合動力轎車、插電混合動力大巴等;
其他:氫燃料電池汽車、增程式電動車等;

新能源汽車核心零部件及配套

動力集成:電動機、整車控制器、功率轉換器、傳動裝置、電池組、BMS、啟停電源、移動車載充電器、充電樁等;
解決方案:整車設計、輕量化底盤、變速動力系統、直驅動力系統等;
配套產品:磁性材料、連接器、飛輪、超級電容、相關新材料、相關檢測設備等。

聯繫方式:
廣州振威國際展覽有限公司
電話:+86 20 8395 3286
手機(微信):+86 135 3358 3989
聯絡人:黃俊鵬
E-mail:Johnny@zhenweiexpo.com

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

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

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

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

分類
發燒車訊

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/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

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

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

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

※超省錢租車方案