特斯拉概念產業:AI無人駕駛車、電動車用電池組

美國創業家Elon Musk對於新科技產業的想法與策略向來是全球關注的焦點。在成功推出電動車品牌特斯拉(Tesla)後,已帶動電動車用電池產業興起;他又在於杜拜舉辦之世界政府峰會(World Government Summit)上提到,未來可將人工智慧(AI)整合入汽車產業,推動無人駕駛功能。

Model 3試產,貿聯-KY獲利創新高

近期消息指出,Tesla平價電動車Model 3將於三月試產,下半年量產。電池模組線束之主要台系供應商貿聯-KY因而受惠,法人預期其股價大漲,營收兩位數成長。

Tesla成立之初,即配合貿聯-KY電池模組配線出貨。法人分析,身為唯一的供應商,貿聯-KY在生產成本、供貨穩定度和合作信賴度下,處於供應鏈之地位難被取代,也成為特斯拉概念股的一大受益者。

AI自駕車,以及人類與機械結合

2016年2月,谷歌(Google)母公司Alphabet Inc.旗下之波士頓動力(Boston Dynamics)發表第二代人形機器人Atlas,Musk事後提及AI發展的危險性,人類恐成為AI的居家寵物。由於在未來機器人可以完全取代人力,可預見未來將會有大量人口失業。對於AI導入目前技術,Musk認為目前首要議題是無人駕駛,AI或許能在自動駕駛方面提供幫助。

對於人類與AI共存的問題,Musk表示,由於電腦可以在每秒之間傳輸一兆位元的數據,而人類僅可以在行動裝置上每秒傳達10位元之資訊, AI大量繁衍是可以想見的趨勢。若人類想與AI共生,在腦中裝入寬頻介面成為賽博格(Cyborg)或許會有所幫助。

(圖片來源:Heisenberg Media via Flickr CC2.0)

 

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

【其他文章推薦】

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

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

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

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

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

前景看好,持股投資人:特斯拉將市值將達 1 兆

近日特斯拉股票上揚,許多業界人士覺得股價被吹太高。不過手中有股票的投資者可不這麼認為,而是相當樂觀。投資特斯拉的億萬富翁 Ron Baron 日前斷言,在這 10 年或是下個 10 年時,特斯拉將成為 1 兆市值的公司,超越傳統的汽車廠如日產。

Baron 語出驚人,談到 10 年後電動車廠特斯拉市值達 1 兆,而且超越傳統車廠。過去 3 年半 Baron 的投資機構陸陸續續累積 160 萬股的特斯拉股票,而每股 208 美元。Baron 表示,特斯拉股價上升,他表示只是開始。

目前特斯拉的市值是 451 億美元,Baron 在接受 CNBC 專訪時表示,2020 年時會翻 4 倍,2025 年時會再翻3 倍,而2030 年時則是再翻3 倍。意味著 2020 年這個十年,特斯拉從現在 451 億美元翻4 倍,也就是1.8 兆美元。

Baron 也對 SolarCity 和特斯拉的合作深具信心,去年曾發表讚揚的言論,因為他相當相信 Elon Musk 的遠景,相信他對電力租用服務。

不過 Baron 去年曾說十年之後特斯拉市值將達 7,000 億,這次增加預測幅度,將達到1 兆美元的規模。Baron 以長期持有特斯拉股票而出名,為了手上特斯拉的股票,把電動車的特斯拉公司說得很好,也有利於自己持有的股票,說不定那天價格好才好出手賣出。

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

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

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

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

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

※回頭車貨運收費標準

從疫情中的體溫測量到分塊思想的運用

Once upon a time,COVID-19席捲全球,Chinese Government要求學校複課時必須測量學生體溫
YC中學有幾萬名同學,要找到發燒的同學進行隔離 如果要讓一位老師完成所有測溫任務,那這將是一個大工程,效率會很低(左圖)
所以將學校所有同學分成班級進行,然後匯總,效率會更高(右圖)

剛剛中我們說的:

將學校所有同學分成班級進行,然後匯總

這就是一種分塊
那問題來了,什麼是分塊呢?
其實通過剛剛的情景,你已經領悟到了分塊的本質:

將一個整體劃分為若干個小塊,進行處理

算法中,與之對應的就是:

整體 小塊
學校 班級
數組 若干元素

那麼,分塊到底是怎麼一種思想呢?
整塊維護,殘塊查找

還是以測量體溫舉例:

現在YC中學要查找體溫在36℃~37.5℃區間內的同學
怎麼做呢?
不可能又去挨個同學去統計、去數吧
那就做一張大表吧,在之前測溫的時候就把34 ~ 35℃、35 ~36℃、36 ~ 37℃、37 ~ 38℃、38 ~ 39℃……的同學分別列出來,數量分別加出來
然後36 ~ 37℃可以就直接在表裡查出人數
那37 ~ 37.5℃怎麼辦呢?
表內並沒有37 ~ 37.5℃的這樣0.5大小的區間啊
那就在37 ~ 38℃這個區間去找唄
方法可以直接暴力遍歷,也可以二分查找等等

剛剛解決的問題就是一個典型的分塊
像34 ~ 35℃、35 ~36℃、36 ~ 37℃、37 ~ 38℃、38 ~ 39℃這種列在表上給出的就是整塊
37 ~ 37.5℃這種表上沒有,包含在一個其他整塊中的但又不足一個整塊的就叫做殘塊

不難發現,其實分塊這個思想是一種暴力,一種優化的暴力,但往往也很有效
Such as 線段樹過於臃腫,代碼冗長,大材小用;而直接暴力就會TLE,不能滿足數據大小
這就很適合分塊了
那麼我們具體怎麼做呢?

我們先要求得應該分為多少個區塊嘛,然後求得每個區塊應該包含多少個元素
然後在輸入時分塊
要使情況最優,那麼區塊既不能太少也不能太多
太少,整塊的數量會太少,花費大量的時間處理殘塊
太多,區塊的長度會太短,失去整體處理區塊的意義
所以,我們取塊數為根號n
而開平方開不盡的n,我們通常在最後接一個不足整塊元素的假整塊(可以看做整塊)
這樣在最壞情況下
我們要處理接近根號n整塊,還要對長度為 2倍根號n 的殘塊最後單獨處理

	cin>>n;
	blo=sqrt(n);//sqrt()開平方函數
	for(int i=1;i<=n;i++){
		cin>>a[i];//儲存元素a[i]
		pos[i]=(i-1)/blo+1;//pos[i]為記錄元素a[i]屬於第幾個整塊
		m[pos[i]]=max(a[i],m[pos[i]]);//尋找第pos[i]個整塊的最大值存入m[pos[i]]
	}

我們先統計左右殘塊,然後再統計整塊

	cin>>q;
	int l,r;
	while(q--){
		cin>>l>>r;
		l++;
		r++;
		int ans=0;
		for(int i=l;i<=min(r, pos[l]*blo);i++){//統計左殘缺塊 
			ans=max(ans,a[i]);
		} 
		if(pos[l]!=pos[r]){//存在右殘缺塊 
			for(int i=(pos[r]-1)*blo+1;i<=r;i++){//統計右殘缺塊 
				ans=max(ans,a[i]);
			}
		} 
		for( int i=pos[l]+1;i<=pos[r]-1;i++){//統計中間整塊 
			ans=max(ans,m[i]);
		}	
		cout<<ans<<endl;
	}

分塊入門之求最大值

先看一個例題

分塊入門之求最大值
Input
第一行給出一個数字N,接下來N+1行,每行給出一個数字Ai,(1<=i<=N<=1E5)
接來給出一個数字Q(Q<=7000),代表有Q個詢問
每組詢問格式為a,b即詢問從輸入的第a個數到第b個數,其中的最大值是多少
Output
如題所述
Sample Input
10 0 1 2 3 2 3 4 3 2 1 0 5 0 10 2 4 3 7 7 9 8 8
Sample Output
4 3 4 3 2

模板題,然後剛剛已經講過了這個代碼
唯一的坑就在於接下來N+1行都是数字Ai
也就是有n+1数字Ai
也就是n需要n++

#include <bits/stdc++.h>
using namespace std;
int n;
int a[101000];
int q;
int blo;
int pos[101000];
int m[101000];
//blo為區間大小,pos[i]表示a[i]元素位於第pos[i]塊,m[i]表示區塊最大值
int main(){
	cin>>n;
	n++;
	blo=sqrt(n);
	for(int i=1;i<=n;i++){
		cin>>a[i];
		pos[i]=(i-1)/blo+1;
		m[pos[i]]=max(a[i],m[pos[i]]);
	}
	cin>>q;
	int l,r;
	while(q--){
		cin>>l>>r;
		l++;
		r++;
		int ans=0;
		for(int i=l;i<=min(r, pos[l]*blo);i++){//統計左殘缺塊 
			ans=max(ans,a[i]);
		} 
		if(pos[l]!=pos[r]){//存在右殘缺塊 
			for(int i=(pos[r]-1)*blo+1;i<=r;i++){//統計右殘缺塊 
				ans=max(ans,a[i]);
			}
		} 
		for( int i=pos[l]+1;i<=pos[r]-1;i++){//統計中間整塊 
			ans=max(ans,m[i]);
		}	
		cout<<ans<<endl;
	}
	return 0;
}

教主的魔法

[Noip模擬題]教主的魔法
Description
教主最近學會了一種神奇的魔法,能夠使人長高
於是他準備演示給XMYZ信息組每個英雄看
於是N個英雄們又一次聚集在了一起
這次他們排成了一列,被編號為1、2、……、N
每個人的身高一開始都是不超過1000的正整數
教主的魔法每次可以把閉區間[L, R](1≤L≤R≤N)內的英雄的身高全部加上一個整數W
(雖然L=R時並不符合區間的書寫規範,但我們可以認為是單獨增加第L(R)個英雄的身高)
CYZ、光哥和ZJQ等人不信教主的邪
於是他們有時候會問WD閉區間 [L,R] 內有多少英雄身高大於等於C
以驗證教主的魔法是否真的有效
WD巨懶,於是他 把這個回答的任務交給了你
Input
第1行為兩個整數N、Q。Q為問題數與教主的施法數總和
第2行有N個正整數,第i個數代表第i個英雄的身高
第3到第Q+2行每行有一個操作:
(1)若第一個字母為”M”,則緊接着有三個数字L、R、W
表示對閉區間 [L, R]內所有英雄的身高加上W
(2)若第一個字母為”A”,則緊接着有三個数字L、R、C
詢問閉區間 [L, R] 內有多少英雄的身高大於等於C
N≤1000000,Q≤3000,1≤W≤1000,1≤C≤1,000,000,000
Output
對每個”A”詢問輸出一行,僅含一個整數,表示閉區間 [L, R] 內身高大於等於C的英雄數。Sample Input
5 3 1 2 3 4 5 A 1 5 4 M 3 5 1 A 1 5 4
Sample Output
2 3
【輸入輸出樣例說明】
原先5個英雄身高為1、2、3、4、5,此時[1, 5]間有2個英雄的身高大於等於4
教主施法后變為1、2、4、5、6,此時[1, 5]間有3個英雄的身高大於等於4

很多元素,進行增加、查找最大值操作

多了一個修改操作,不是很難
同理像查找這樣整塊維護,殘塊增加
我們就再增加一個數組,統一記錄每個整塊變化量是多少
記錄每個整塊的變化量,然後最後找最值的時候,單個整塊的最值加上或者減去變化量比較就可以了
殘塊的單個元素直接加上或者減去變化量,找最值

void update(int x,int y,int v){
    if(pos[x]==pos[y]){
        for(int i=x;i<=y;i++)a[i]=a[i]+v;
    }
    else{
        for(int i=x;i<=pos[x]*block;i++)a[i]=a[i]+v;
        for(int i=(pos[y]-1)*block+1;i<=y;i++)a[i]=a[i]+v;
    }
    reset(pos[x]);reset(pos[y]);
    for(int i=pos[x]+1;i<pos[y];i++)
       add[i]+=v;
}

#include<bits/stdc++.h>
using namespace std;
int n;
int q,m,block;
int a[1010000],b[1010000],pos[1010000],add[1010000];
void reset(int x){
    int l=(x-1)*block+1,r=min(x*block,n);
    for(int i=l;i<=r;i++)
        b[i]=a[i];
    sort(b+l,b+r+1);
}
int find(int x,int v){
    int l=(x-1)*block+1,r=min(x*block,n);
    int last=r;
    while(l<=r){
        int mid=(l+r)>>1;
        if(b[mid]<v)l=mid+1;
        else r=mid-1;
    }
    return last-l+1;
}
void update(int x,int y,int v){
    if(pos[x]==pos[y]){
        for(int i=x;i<=y;i++)a[i]=a[i]+v;
    }
    else{
        for(int i=x;i<=pos[x]*block;i++)a[i]=a[i]+v;
        for(int i=(pos[y]-1)*block+1;i<=y;i++)a[i]=a[i]+v;
    }
    reset(pos[x]);reset(pos[y]);
    for(int i=pos[x]+1;i<pos[y];i++)
       add[i]+=v;
}
int query(int x,int y,int v){
    int sum=0;
    if(pos[x]==pos[y]){
        for(int i=x;i<=y;i++)if(a[i]+add[pos[i]]>=v)sum++;
    }
    else {
        for(int i=x;i<=pos[x]*block;i++)
            if(a[i]+add[pos[i]]>=v)sum++;
        for(int i=(pos[y]-1)*block+1;i<=y;i++)
            if(a[i]+add[pos[i]]>=v)sum++;
    }
    for(int i=pos[x]+1;i<pos[y];i++)
        sum+=find(i,v-add[i]);
    return sum;
}
int main(){
    cin>>n>>q;
    block=int(sqrt(n));
    for(int i=1;i<=n;i++){
        cin>>a[i];
        pos[i]=(i-1)/block+1;
        b[i]=a[i];
    }
    if(n%block)m=n/block+1;
    else m=n/block;
    for(int i=1;i<=m;i++)reset(i);
    for(int i=1;i<=q;i++){
        char ch[5];int x,y,v;
        cin>>ch>>x>>y>>v;
        if(ch[0]=='M'){
        	update(x,y,v);
		}else{
			cout<<query(x,y,v)<<endl;
		}
    }
    return 0;
}

END

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

【其他文章推薦】

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

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

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

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

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

01 . ELK Stack簡介原理及部署應用

簡介

ELK並不是一款軟件,是一整套解決方案,是由ElasticSearch,Logstash和Kibana三個開源工具組成:通常是配合使用,而且先後歸於Elastic.co公司名下,簡稱ELK協議棧.

日誌的收集和處理

在日常運維工作中,對於系統和業務日誌的處理尤為重要。日誌主要包括系統日誌,應用日誌,應用程序日誌和安全日誌。系統運維和開發人員可以通過日誌了解服務器軟硬件信息,檢查配置過程中的錯誤及錯誤發生的原因。經常分析日誌可以了解服務器的負荷,性能安全性,從而及時採取措施糾正錯誤。

通常,日誌被分散的存儲在不同的設備上,如果你管理上百台服務器,你還在使用依次登錄每台機器的傳統方法查閱日誌是很繁瑣且效率低下的。當務之急是使用集中化的日誌管理,例如: 開源的syslog,將所有服務器上的日誌收集匯總。集中化管理日誌后,日誌的統計和檢索又成為一件比較麻煩的事情.

一個完整的集中式日誌系統,是離不開以下幾個主要特點的

# 1. 收集 - 能夠收集多種來源的日誌數據
# 2. 傳輸 - 能夠穩定的把日誌數據傳輸到中央系統
# 3. 存儲 - 如何存儲日誌數據
# 4. 分析 - 可以支持UI分析
# 5. 警告 - 能夠提供錯誤報告
日誌分析工具

1 . grep,awk,wc,rsyslog,syslog-ng: 對於龐大的機器數量,要達到要求更高的查詢,排序和統計等使用這樣的方法難免有點力不從心.

2 . 商業化的splunk: Splunk作為企業級的分佈式機器數據的平台,擁有強大的分佈式配置,包括跨數據中心的集群配置,Splunk提供兩種集群,indexer集群和Search Head集群.具體情況請看Splunk文章.

3 . 開源的:

# 1 FaceBook公司的Scribe
# 2 Apache的Chukwa
# 3 Linkedin的Kafka
# 4 Cloudera的Fluentd
# 5 ELK
Elasticsearch

ElasticSearch是一個基於Lucene的開源分佈式搜索服務器.是一個實時的分佈式搜索和分析引擎,他可以用於全文搜索,結構化搜索以及分析,他是一個建立在全文搜索引擎Apache lucene基礎上的搜索引擎,使用Java語言編寫,並作為Apache許可條款下的開放源碼發布,是第二流行的企業搜索引擎。設計用於雲計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便,在elasticsearch中,所有節點的數據是均等的.

主要特點

# 1 實時分析
# 2 分佈式實時文件存儲,並將每一個字段都編入索引
# 3 文檔導向,所有的對象全部是文檔
# 4 高可用性,易擴展,支持集群(cluster),分片和複製(hards和Replicas
# 5 接口友好,支持JSON

Logstash

logstash是一個具有實時渠道能力的數據收集引擎,使用JRuby語言編寫,其做着是世界著名的運維工程師喬丹西塞,他是一個完全開源工具,可以對你的日誌進行收集,過濾

# 主要特點:
#        1> 幾乎可以訪問任何數據
#        2> 可以和多種外部應用結合
#        3> 支持彈性擴展

# 它主要由三個主要部分組成,見下圖.
#        1> Shipper - 發送日誌數據
#        2> Broker -  收集數據,缺省內置Redis
#        3> Indexer - 數據寫入

Kibana

Kibana是一款基於Apache開源協議,使用JavaScript語言編寫,為Elasticsearch提供分析和可視化的Web平台,他可以在Elasticsearch的索引中查找,交互數據,並生成各種維度的表圖.

Filebeat

ELK協議棧的新成員,一個輕量級開源日誌數據搜集器,基於Logstash-Forwarder源代碼開發,是對他的替代。是需要在採集日誌數據server上安裝filebeat,並指定日誌目錄或日誌文件后,Filebeat就能讀取數據,迅速發送到Logstash進行解析,亦或直接發送到Elasticsearch進行集中式存儲和分析

ELK協議棧體繫結構

最簡單架構

在這種架構中,只有一個Logstash,Elasticsearch和Kibana實例。Logstash通過輸入插件從多種數據源(比如日誌文件,標準輸入Stdin等)獲取數據,再經過過濾插件加工數據,然後經過Elasticsearch輸出插件輸出到Elasticsearch,通過Kibana展示.

Logstash作為日誌收集器

這種架構是對上面架構的擴展,把一個Logstash數據搜集節點擴展到多個,分佈於多台機器,將解析好的數據發送到Elasticsearch server進行存儲,最後在Kibana查閱,生成日誌報表等.

這種結構因為需要在各個服務器上部署Logstash,而它比較消耗CPU和內存資源,所以比較適合資源豐富的服務器,否則容易造成服務器性能下降,甚至可能導致無法正常工作.

Beats作為日誌搜集器

這種架構引入Beats作為日誌搜集器。目前Beats包括四種

# 1> Packetbeat (搜集網絡流量數據)
# 2> Topbeat (搜集系統,進程和文件系統級別的CPU和內存使用情況等數據)
# 3> Filebeat (搜集文件數據)
# 4> Winlogbeat (搜集Windows事件日誌數據)

Beats將搜集到的數據發送到Logstash,經Logstash解析,過濾后,將其發送到Elasticsearch存儲,並由Kibana呈現給用戶.

這種架構解決了Logstash在各服務器節點上佔用系統資源高的問題,相比Logstash,Beats所佔系統的CPU和內存幾乎可以省略不計,另外,Beats和Logstash之間保持SSL/TLS加密傳輸,客戶端和服務器雙向認證,保證了通信安全

因此這種架構適合對數據安全性要求較高,同時各服務器性能比較敏感的場景.

基於Filebeat架構的配置部署詳解

前面提到Filebeat已經完全替代了Logstash-Forwarder 成為新一代的日誌採集器,同時鑒於它輕量、安全等特點,越來越多人開始使用它。這個章節將詳細講解如何部署基於 Filebeat 的 ELK 集中式日誌解決方案,具體架構見下圖.

引入消息隊列機制的架構

Beats 還不支持輸出到消息隊列,所以在消息隊列前後兩端只能是 Logstash 實例。這種架構使用 Logstash 從各個數據源搜集數據,然後經消息隊列輸出插件輸出到消息隊列中。目前 Logstash 支持 Kafka、Redis、RabbitMQ 等常見消息隊列。然後 Logstash 通過消息隊列輸入插件從隊列中獲取數據,分析過濾后經輸出插件發送到 Elasticsearch,最後通過 Kibana 展示。見下圖

這種架構適合於日誌規模比較龐大的情況,但由於Logstash日誌解析節點和Elasticsearch的符合比較重,可將他們配置為集群模式,以分擔負荷,引入消息隊列,均衡了網絡傳輸,從而降低了網絡閉塞,尤其丟失數據的可能性,但依然存在Logstash佔用系統資源過多的問題.

部署

架構圖

999

List
Package:
# elasticsearch-7.2.0-linux-x86_64.tar.gz
# filebeat-7.2.0-x86_64.rpm
# jdk-8u121-linux-x64.rpm
# kibana-7.2.0-linux-x86_64.tar.gz
# logstash-7.2.0.tar.gz
IP hostname 軟件 配置要求 網絡 備註
192.168.144.131 ES/數據存儲 elasticsearch-7.2 內存最低2GB/硬盤40GB Nat,內網
192.168.144.128 Kibana/UI展示 kibana-7.2****logstash-7.2 內存最低2GB/硬盤40GB Nat,內網
192.168.144.135 Filebeat/數據採集 Filebeat-7.2/nginx 內存最低2GB/硬盤40GB Nat,內網
注意事項
# 1.一定要對時,時間校正,不然日誌出不來
# 2.啟動Elasticsearch必須切換成所創建的ELK用戶啟動,不然ES處於安全目的,會啟動報錯.
# 3.日誌從Filebeat到Logstash再到ES檢索到Kibana的讀取速度取決於機器配置
Elasticsearch安裝
# 1.初始化
setenforce 0
sed -i '/^SELINUX=/ s/enforcing/disabled/'  /etc/selinux/config
systemctl stop firewalld
systemctl disable firewalld
sed -i '/^GSSAPIAu/ s/yes/no/' /etc/ssh/sshd_config
sed -i '/^#UseDNS/ {s/^#//;s/yes/no/}' /etc/ssh/sshd_config
curl -o /etc/yum.repos.d/163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo &>/dev/null
curl  -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    yum -y install ntpdate
    ntpdate -b  ntp1.aliyun.com

# 2.設置Hostname解析
hostnamectl set-hostname elk-1
        ## 修改/etc/hosts 增加如下內容
        192.168.144.131     elk-1

# 4.java安裝
# rpm -ivh jdk-8u121-linux-x64.rpm
# 如果使用rpm請到/etc/profile加上
# JAVA_HOME=/usr/java/jdk1.8.0_121
# export PATH=$PATH:$JAVA_HOME/bin
yum -y install java-1.8.0-openjdk.x86_64

# 5.創建用戶和組並準備相關目錄並授權
groupadd  elk
useradd  elk  -g  elk
mkdir  -pv  /data/elk/{data,logs}
chown  -R  elk:elk  /data/elk/

# 6.軟件包解壓、授權
# 上傳軟件包
            通過scp 或者FTP方式上傳到/opt下
# 解壓軟件包到/opt目錄
tar xvf elasticsearch-7.2.0-linux-x86_64.tar.gz -C  /opt/
# 授權
chown  -R  elk:elk  /opt/elasticsearch-7.2.0/  # 軟件包名

# 7.修改elk配置文件
[root@elk-1 ~]# vim /opt/elasticsearch-7.2.0/config/elasticsearch.yml
        # 集群名
        cluster.name:  elk
        # 節點名
        node.name: node-1
        # 存儲數據
        path.data:  /data/elk/data
        # 存放日誌
        path.logs:  /data/elk/logs
        # 鎖內存,盡量不使用交換內存
        bootstrap.memory_lock:  false
        # 網絡地址
        network.host: 0.0.0.0
        http.port: 9200
        # 發現集群hosts
        discovery.seed_hosts: ["elk-1"]
        # 設置集群master節點
        cluster.initial_master_nodes: ["node-1"]

# 8.修改/etc/security/limits.conf
        # *號不是註釋
        * soft nproc 65535
        * hard nproc 65535
        * soft nofile 65535
        * hard nofile 65535

ulimit -n 65535
ulimit -u 20480

# 9.修改/etc/sysctl.conf
        echo "vm.max_map_count=262144" >> /etc/sysctl.conf
        sysctl -p

# 10.啟動ES並檢查集群健康狀態
nohup runuser -l elk -c '/bin/bash /opt/elasticsearch-7.2.0/bin/elasticsearch' &
    # 這裏為了省事直接用的nohup 可以使用supervisord 對進程進行管理
[root@elk-1 ~]# curl -XGET 'elk-1:9200/_cluster/health?pretty'
{
  "cluster_name" : "elk",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 0,
  "active_shards" : 0,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}
Kibana安裝
# 1.解壓Kibana安裝包
tar xvf kibana-7.2.0-linux-x86_64.tar.gz  -C /opt/

# 2.修改Kibana配置文件
server.port:  5601   # Port
server.host:  0.0.0.0   # 訪問限制
elasticsearch.hosts: ["http://192.168.144.131:9200"]        # ES主機IP:Port

# 3.啟動命令
[root@kibana ~]# nohup /opt/kibana-7.2.0-linux-x86_64/bin/kibana --allow-root &
[1] 14650
    # tailf nohup.out 即可實時查看日誌
Logstash安裝
[root@kibana ~]# rpm -ivh jdk-8u121-linux-x64.rpm
[root@kibana ~]# tar xvf logstash-7.2.0.tar.gz  -C /opt/
[root@kibana opt]# vim /opt/nginx.yml
# Sample Logstash configuration for creating a simple
# # Beats -> Logstash -> Elasticsearch pipeline.
#
input {
    beats {
        port => 5044
        }
}

filter {
    grok {
        match => ["message","%{DATA:log_date} %{WORD:method} %{TIME:log_localtime} %{HOSTNAME:host_name} %{WORD:workd}\[%{WORD:ls}\]\: %{DATA:log_date} %{TIME:log_localtime2} %{WORD:year_tmp}\: %{WORD:name_2}\: %{WORD:request_leixin} %{WORD:request_num}\, %{WORD}\: %{WORD:app_id}\, %{WORD}\: %{IP:ip}\, %{WORD}\: %{INT}\, %{WORD}\: %{USERNAME:device_id}"]
        }
}

output {
    elasticsearch {
       hosts => ["http://192.168.144.131:9200"]
       index => "app_log-%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
     }
}




# 啟動 (如果起不來或者報錯一般都是配置文件語法錯誤之類的)
    /opt/logstash-7.2.0/bin/logstash -f /opt/配置文件名.yml
    ## 後台運行
    nohup  /opt/logstash-7.2.0/bin/logstash -f /opt/配置文件名.yml  &
Filebeat安裝
# 安裝filebeat RPM包
[root@filebeat ~]# rpm -ivh filebeat-7.2.0-x86_64.rpm

# 修改配置文件:
Filebeat到Logstash
(vim /etc/filebeat/filebeat.yml) shift + : 輸入set nu 显示行號
24:   enabled:  true                         # 更改為true以啟用輸入配置
28:   - /data/*.log                   # 替換為要抓取的日誌文件路徑,如果抓取nginx日誌,修改為/var/log/nginx/access.log,如果是日誌服務器,在下面再加上多行其他地方的日誌目錄即可
73:  reload.enabled:  true                  # 啟動Filebeat模塊
148: output.elasticsearch:                  # 加上註釋;
150:  hosts: ["localhost:9200"]              # 加上註釋;
158: output.logstash:                       # 去掉註釋;
160: hosts: ["192.168.144.128<logstash>:5044"]       # 去掉註釋,並修改localhost為logstash機器IP及對應端口號;


# 測試配置文件並啟動
filebeat  test  config  -e
systemctl  start filebeat && systemctl  enable filebeat

[root@filebeat ~]# cat /data/nginx.log        # 創建該目錄及文件,加入兩行日誌.
Sep  2 16:00:18 cc-prd-3-tk-13-pcs1 pcs[16118]: Mon Sep  2 16:00:18 2019: PCS: recv request, app_id: app_1w5B6O4R2o1k881k12177, ip: 223.104.145.136, os: 0, device_id: 02c3864050502d43dc514905133bcc9c
Sep  2 16:00:18 cc-prd-3-tk-13-pcs1 pcs[16118]: Mon Sep  2 16:00:18 2019: PCS: recv request, app_id: app_1w5B6O4R2o1k881k12177, ip: 223.104.145.136, os: 0, device_id: 02c3864050502d43dc514905133bcc9c

收集的日誌需要把有用的信息做切割,讓相應字段成為獨立的個一個字段,而不是一整條日誌是一個字段,那樣就沒法做分析,而做數據源切割很重要,否則日誌會過不來,或者日誌做不了分析,統計.

可以把源日誌拿到kibana上的grok上做切割,直到Structured Data能出現你想要的字段就可以放到logstash的配置文件中

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

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

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

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

※回頭車貨運收費標準

C/S C# WPF銳浪報表教程

前言:銳浪報表是一種中國式報表的報表開發工具。博主使用銳浪報表有一段時間了,積累了一些經驗希望能幫助你快速掌握並使用

第一章:集成項目

首先我們先去銳浪報表官網下載並安裝銳浪報表。

創建WPF應用程序。(C/S端使用銳浪報表基本都一樣

 添加銳浪報表的引用,在資源管理器目錄中找到引用並右鍵,點擊添加引用。

 在引用管理器左側目錄中展開COM並找到Grid++Report Engine 6 Type Library,勾選上點擊確定。(這裡有四個銳浪報表的引用,不要加錯了)

 在資源管理器中展開引用找到gregn6Lib

 右鍵gregn6Lib點擊屬性,將獨立設置為True,將嵌入式互操作類型設置為True

在資源管理器中右鍵WPFPrintReportRL項目——添加——新建文件夾,命名為report

 集成銳浪報表的WPF項目環境基本配置差不多了,下面我們打開安裝完畢銳浪報表的編輯器

 在上方導航目錄中找到插入——報表頭,就會生成這個UI編輯面板

如果我們需要打印一些參數,則在左上方的目錄中找到參數集合——新增——參數

 將這個參數命名,我使用的是Name,這個參數的命名就是後面程序需要在在報表中傳遞的參數

 在上方導航欄中找到插入——綜合文本框,將鼠標在UI編輯面板左鍵點擊一下生成綜合文本框,然後我們雙擊綜合文本框編輯內容。

點擊插入域引用類型選擇為參數參數選擇為剛才命名為Name的參數,點擊確定

 做完以上操作后的UI編輯面板,隨後我們另存到使用VS創建的WPFPrintReportRL項目下的report目錄中

切回VS,在資源管理器中上方找到並點擊显示所有文件,然後資源管理起中report文件夾下會显示出你剛保存的報表文件右鍵——包括在項目中

 對報表文件右鍵——屬性,將複製到輸出目錄更改為:如果較新則複製

主窗體的後台代碼,已經加入註釋,各位慢慢品味。

            GridppReport gr = new GridppReport();//報表對象
            //建議不要在報表中存儲連接字符串字符串
            //如果不設置ConnectionString或QuerySQL屬性,則會使用報表內的連接字符串和SQL語句
            gr.ConnectionString = "";//連接字符串
            gr.QuerySQL = "";//SQL語句
            gr.LoadFromFile("report\\案例報表.grf");//本地報表路徑
            gr.ParameterByName("Name").AsString = "古河渚";//主報表傳參
            gr.Print(false);//不預覽打印

接下來我們在資源管理器中右鍵WPFPrintReportRL項目——屬性——生成,將目標平台更改為x86

 隨後我們運行項目,報表如期而至打印了出來。(這裏博主使用的是虛擬打印機,點我下載,將打印機設置里默認打印機設置為 pdfFactory Pro

銳浪報表安裝后目錄中已提供案例與文檔,博主Demo項目已上傳交流群,點擊最上方標題即可交流群學習。

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

【其他文章推薦】

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

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

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

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

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

※超省錢租車方案

EV商機大,旭化成擴增鋰電池材料產能

 

全球知名綜合性化學製造大廠旭化成(Asahi Kasei)30日發布新聞稿宣布,因電動車(EV)、油電混合車(HV)等車用鋰離子電池需求預估將呈現急速增長,故決議擴增鋰離子電池關鍵材料「分隔膜(separator、見附圖)」產能,計畫投下約150億日圓,在守山製造所(滋賀縣守山市)增設年產能約2億平方公尺(m2)的分隔膜產線,並預計於2019年度上半年商轉。

旭化成指出,待上述增產工程完工後,該公司整體分隔膜年產能將從現行的約6.6億m2提高3成至約8.6億m2。

旭化成計畫於2020年結束前整備出年產能達約11億m2的分隔膜生產體制。

日經新聞報導,旭化成為全球分隔膜龍頭廠、全球市佔率達5成,目前於滋賀縣、宮崎縣以及美國和南韓生產分隔膜。

根據日本市調機構富士經濟(Fuji Keizai)預估,2020年全球分隔膜市場規模將增至3,000億日圓、將達2015年的2倍水準,而EV、HV等車用用途是推動分隔膜需求急增的最大功臣,預估2020年車用分隔膜佔整體市場比重將達約45%。

日刊工業新聞報導,為了因應全球各國加強環保規範,汽車業界大力推廣EV。

美國特斯拉(Tesla)計畫於2018年將EV年產量提高至50萬台;豐田汽車(Toyota)計畫於2020年結束前整備出EV量產體制;福斯(VW)計畫於2025年賣出100萬台EV。

富士經濟預估,全球EV市場當前將持續呈現緩和增長,不過預估自2020年左右起,EV需求將呈現急速擴大,預估2035年全球EV市場規模將達567萬台、將較2015年飆增近16倍(成長1,567%)。

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

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

【其他文章推薦】

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

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

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

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

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

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

電動車鋰電池進展緩,新普宣布現金減資4成

新普宣布將現金減資4成、即退還股東每股4元現金,加上董事會決議擬配發現金股息6元,合計配發每股現金10元。新普近幾年來自筆記型電腦的成長趨緩,而電動車所需鋰電池進展緩慢,手機與平板使用單顆電池芯鋰電池模組毛利率相對較低、且有大陸同業與之競爭,外界認為這些是新普會大幅現金減資的主因。同時,新普大股東鴻海集團宣布要投資陸廠中國寧德時代新能源股權1.19%,外界也對新普未來在集團內電動車電池領域的所扮演的角色,先抱持觀察態度。

鴻海在29日公告,旗下子公司富泰華以人民幣逾10億元取得寧德時代新能源科技(CATL)股權約766.65萬股,持股比例約1.19%。外界解讀,鴻海以超過10億人民幣入股大陸動力電池大廠寧德時代,意在布局電動車電池市場。

寧德時代母公司是總部位於香港的鋰電池製造商新能源科技(ATL) ;ATL因原股東想撤資並在2005年被大股東之一的日商TDK全資收購。ATL集團旗下有東莞、東莞白馬、東莞松山湖、北京、青海西寧等不同產品線的生產基地,總部在福建的寧德時代(CATL)在集團內則主攻動力與儲能業務為主。全球動力電池市場中,松下透過特斯拉合作保持第一,比亞迪(BYD)次之,而寧德時代已超越LG化學位居全球第三。

(一)新普Q1財測,每股獲利1.71~1.89元:

新普昨日天舉行法人說明會,2016年合併營收年減9.5%至581.2億元,合併毛利率10%,稅前盈餘年減16.8%至38.96億元;稅後盈餘年減12.7%至28.02億元,EPS為9.09元。主要是大陸鋰電池同業在消費電子市場的競爭。

新普同時也發布2017年第1季財測,第1季合併營收約113~117億元,營業毛利約9.64~9.98億元,營業淨利4.6~4.73億元,稅前盈餘約7.31~8.1億元,稅後盈餘5.27~5.83億元,單季EPS約1.71~1.89元。

新普董事會決議現金減資40%,退還股東每股現金4元,並配發現金股息每股6元,股東參與現金減資及除息,每股可以拿回現金10元。

新普宣布減資40%,減資後現金水位仍達100億元以上;減資將能提升ROE(股東權益報酬率)與每股盈餘水準。法人以減資後流通股份18.5億元計算,預估新普2017年每股盈餘可望上揚至13元以上。

(二)新普Q1毛利率受到台幣升值影響,後續毛利率視電池芯漲價影響:

新普估第1季營收季減30~32%、年減幅度則為12~15%,外界預期應是iPhone等消費電子客戶的鋰電池供應比重將降低。

同時,新台幣第一季升值已接近7%,新普預期第1季毛利率8.3~8.5%,低於外界守穩在10%的原本預期。

至於第2季毛利率走向,因近期電池芯價格上揚,可能會對上半年毛利率有些影響。在營收方面,受惠於新款平板與平板型電腦將上市,新普第2季營收可望較首季營收季增5~10%。

(三)鴻海集團布局動力與儲能電池,新普定位尚待觀察:

鴻海集團已布局中國大陸電動車領域,例如兩年前與和諧汽車及騰訊,簽訂「互聯網+智能電動車」的戰略合作意向書,昨日也宣布透過子公司投資大陸鋰電池廠寧德時代(CATL)的1.19%的股權。

寧德時代在大陸汽車應用領域積極,2016年12月份與東風汽車簽訂戰略合作協定,2017年年初宣布投資3,000萬歐元參股芬蘭維美德汽車、並取得其22%股權,進軍歐洲汽車市場,而今年3月又與國能電動汽車瑞典公司(NEVS)簽署合作意向書,雙方將展開技術交流與研發的深入合作。

鴻海集團的鴻揚創投也是新普的大股東,鴻海集團持股新普股份4.44%。以過去業務與市場情況來看,新普與寧德時代算是競爭同業。

鴻海未來是否會去尋求新普、與新投資的寧德時代雙方合作的機會,還待觀察。

法人認為,新普今年現金減資提高每股獲利水準,下游手機與平板客戶銷售情況,以及電池芯漲價效應對於新普本業營收與毛利率影響較大。而鴻海集團布局大陸鋰電池業者的消息,對新普而言,先以中性看待。

(本文內容由授權使用。圖為電動車電池,圖片出處:Wikipedia)

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

【其他文章推薦】

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

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

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

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

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

豐田將運用AI加速電動車電池研發

豐田旗下人工智慧研發機構TRI 近日宣布,將和一些專注於材料科學的大學及企業攜手合作,在未來數年內投資3,500 萬美元(約10.6 億元台幣),運用AI 來尋找電動車及氫動力汽車的電池材料和催化劑,TRI 相信AI 技術將能夠幫助材料研發加速。

TRI 之所以投入這麼多心力在材料科學並非沒有原因。對於TRI 的許多研究領域來說,包含電動車、機器人、能源使用在內,新材料的應用一直都是技術發展的關鍵,也是要進步必須突破的障礙。

TRI 的研究合作夥伴包括史丹佛大學、麻省理工學院、密西根大學、康乃狄克大學和英國材料科學公司Ilika,除了材料尋找,TRI 也計劃用AI 來提升一些需要大量基礎實驗的工作效率。

TRI 首席科學家Eric Krotkov 指出,豐田希望能在2050 年將全球新車平均二氧化碳排放量減少90%,運用AI 能用來加快新材料的研發速度,為清潔能源的利用打下良好基礎,讓豐田朝向目標更進一步。

儘管對於新夥伴的合作潛力感到興奮,非常渴望能盡快開始工作,Krotkov 也承認,材料的尋找是解決一些根本問題的長期項目,短期內並不會有爆發性的進展,「這大概是TRI 做過最長時間的賭注。」

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

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

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

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

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

※回頭車貨運收費標準

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

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

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

【其他文章推薦】

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

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

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

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

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

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

Quartz.Net系列(七):Trigger之SimpleScheduleBuilder詳解

所有方法圖

 

 SimpleScheduleBuilder方法

RepeatForever:指定觸發器將無限期重複。

WithRepeatCount:指定重複次數

var trigger = TriggerBuilder.Create().WithSimpleSchedule(s=>s.WithIntervalInSeconds(1).RepeatForever()).Build();

 

            var trigger = TriggerBuilder.Create().WithSimpleSchedule(s=>s.WithIntervalInSeconds(1)
                                                                         .WithRepeatCount(10)).Build();

 

注:底層實現是repeatCount+1,也就是總共執行repeatCount+1次

        /// <summary>
        /// Specify a the number of time the trigger will repeat - total number of
        /// firings will be this number + 1.
        /// </summary>
        /// <remarks>
        /// </remarks>
        /// <param name="repeatCount">the number of seconds at which the trigger should repeat.</param>
        /// <returns>the updated SimpleScheduleBuilder</returns>
        /// <seealso cref="ISimpleTrigger.RepeatCount" />
        /// <seealso cref="RepeatForever" />
        public SimpleScheduleBuilder WithRepeatCount(int repeatCount)
        {
            this.repeatCount = repeatCount;
            return this;
        }

 

 

WithInterval:以毫秒為單位指定重複間隔,由於是TimeSpan也可以指定時分秒

WithIntervalInHours:以小時為單位指定重複間隔

WithIntervalInMinutes:以分鐘單位指定重複間隔

WithIntervalInSeconds:以秒為單位指定重複間隔

            var trigger = TriggerBuilder.Create().WithSimpleSchedule(s=>s .WithIntervalInSeconds(1)
                                                                          .WithInterval(TimeSpan.FromDays(1))
                                                                          .WithIntervalInMinutes(1)
                                                                          .WithIntervalInHours(1)
                                                                          .WithRepeatCount(5))
                                                 .Build();

注:底層都是通過WithInterval實現的

        /// <summary>
        /// Specify a repeat interval in milliseconds.
        /// </summary>
        /// <remarks>
        /// </remarks>
        /// <param name="timeSpan">the time span at which the trigger should repeat.</param>
        /// <returns>the updated SimpleScheduleBuilder</returns>
        /// <seealso cref="ISimpleTrigger.RepeatInterval" />
        /// <seealso cref="WithRepeatCount(int)" />
        public SimpleScheduleBuilder WithInterval(TimeSpan timeSpan)
        {
            interval = timeSpan;
            return this;
        }

        /// <summary>
        /// Specify a repeat interval in seconds.
        /// </summary>
        /// <remarks>
        /// </remarks>
        /// <param name="seconds">the time span at which the trigger should repeat.</param>
        /// <returns>the updated SimpleScheduleBuilder</returns>
        /// <seealso cref="ISimpleTrigger.RepeatInterval" />
        /// <seealso cref="WithRepeatCount(int)" />
        public SimpleScheduleBuilder WithIntervalInSeconds(int seconds)
        {
            return WithInterval(TimeSpan.FromSeconds(seconds));
        }

靜態方法:

RepeatMinutelyForever

RepeatMinutelyForTotalCount

RepeatSecondlyForever

RepeatSecondlyForTotalCount

RepeatHourlyForever

RepeatHourlyForTotalCount

var trigger = TriggerBuilder.Create().WithSchedule(SimpleScheduleBuilder.RepeatSecondlyForTotalCount(2)).Build();

 

 /// <summary>
        /// Create a SimpleScheduleBuilder set to repeat forever with a 1 minute interval.
        /// </summary>
        /// <remarks>
        /// </remarks>
        /// <returns>the new SimpleScheduleBuilder</returns>
        public static SimpleScheduleBuilder RepeatMinutelyForever()
        {
            SimpleScheduleBuilder sb = Create()
                .WithInterval(TimeSpan.FromMinutes(1))
                .RepeatForever();

            return sb;
        }

        /// <summary>
        /// Create a SimpleScheduleBuilder set to repeat forever with an interval
        /// of the given number of minutes.
        /// </summary>
        /// <remarks>
        /// </remarks>
        /// <returns>the new SimpleScheduleBuilder</returns>
        public static SimpleScheduleBuilder RepeatMinutelyForever(int minutes)
        {
            SimpleScheduleBuilder sb = Create()
                .WithInterval(TimeSpan.FromMinutes(minutes))
                .RepeatForever();

            return sb;
        }

        /// <summary>
        /// Create a SimpleScheduleBuilder set to repeat forever with a 1 second interval.
        /// </summary>
        /// <remarks>
        /// </remarks>
        /// <returns>the new SimpleScheduleBuilder</returns>
        public static SimpleScheduleBuilder RepeatSecondlyForever()
        {
            SimpleScheduleBuilder sb = Create()
                .WithInterval(TimeSpan.FromSeconds(1))
                .RepeatForever();

            return sb;
        }

        /// <summary>
        /// Create a SimpleScheduleBuilder set to repeat forever with an interval
        /// of the given number of seconds.
        /// </summary>
        /// <remarks>
        /// </remarks>
        /// <returns>the new SimpleScheduleBuilder</returns>
        public static SimpleScheduleBuilder RepeatSecondlyForever(int seconds)
        {
            SimpleScheduleBuilder sb = Create()
                .WithInterval(TimeSpan.FromSeconds(seconds))
                .RepeatForever();

            return sb;
        }

        /// <summary>
        /// Create a SimpleScheduleBuilder set to repeat forever with a 1 hour interval.
        /// </summary>
        /// <remarks>
        /// </remarks>
        /// <returns>the new SimpleScheduleBuilder</returns>
        public static SimpleScheduleBuilder RepeatHourlyForever()
        {
            SimpleScheduleBuilder sb = Create()
                .WithInterval(TimeSpan.FromHours(1))
                .RepeatForever();

            return sb;
        }

        /// <summary>
        /// Create a SimpleScheduleBuilder set to repeat forever with an interval
        /// of the given number of hours.
        /// </summary>
        /// <remarks>
        /// </remarks>
        /// <returns>the new SimpleScheduleBuilder</returns>
        public static SimpleScheduleBuilder RepeatHourlyForever(int hours)
        {
            SimpleScheduleBuilder sb = Create()
                .WithInterval(TimeSpan.FromHours(hours))
                .RepeatForever();

            return sb;
        }

        /// <summary>
        /// Create a SimpleScheduleBuilder set to repeat the given number
        /// of times - 1  with a 1 minute interval.
        /// </summary>
        /// <remarks>
        /// <para>Note: Total count = 1 (at start time) + repeat count</para>
        /// </remarks>
        /// <returns>the new SimpleScheduleBuilder</returns>
        public static SimpleScheduleBuilder RepeatMinutelyForTotalCount(int count)
        {
            if (count < 1)
            {
                throw new ArgumentException("Total count of firings must be at least one! Given count: " + count);
            }

            SimpleScheduleBuilder sb = Create()
                .WithInterval(TimeSpan.FromMinutes(1))
                .WithRepeatCount(count - 1);

            return sb;
        }

        /// <summary>
        /// Create a SimpleScheduleBuilder set to repeat the given number
        /// of times - 1  with an interval of the given number of minutes.
        /// </summary>
        /// <remarks>
        /// <para>Note: Total count = 1 (at start time) + repeat count</para>
        /// </remarks>
        /// <returns>the new SimpleScheduleBuilder</returns>
        public static SimpleScheduleBuilder RepeatMinutelyForTotalCount(int count, int minutes)
        {
            if (count < 1)
            {
                throw new ArgumentException("Total count of firings must be at least one! Given count: " + count);
            }

            SimpleScheduleBuilder sb = Create()
                .WithInterval(TimeSpan.FromMinutes(minutes))
                .WithRepeatCount(count - 1);

            return sb;
        }

        /// <summary>
        /// Create a SimpleScheduleBuilder set to repeat the given number
        /// of times - 1  with a 1 second interval.
        /// </summary>
        /// <remarks>
        /// <para>Note: Total count = 1 (at start time) + repeat count</para>
        /// </remarks>
        /// <returns>the new SimpleScheduleBuilder</returns>
        public static SimpleScheduleBuilder RepeatSecondlyForTotalCount(int count)
        {
            if (count < 1)
            {
                throw new ArgumentException("Total count of firings must be at least one! Given count: " + count);
            }

            SimpleScheduleBuilder sb = Create()
                .WithInterval(TimeSpan.FromSeconds(1))
                .WithRepeatCount(count - 1);

            return sb;
        }

        /// <summary>
        /// Create a SimpleScheduleBuilder set to repeat the given number
        /// of times - 1  with an interval of the given number of seconds.
        /// </summary>
        /// <remarks>
        /// <para>Note: Total count = 1 (at start time) + repeat count</para>
        /// </remarks>
        /// <returns>the new SimpleScheduleBuilder</returns>
        public static SimpleScheduleBuilder RepeatSecondlyForTotalCount(int count, int seconds)
        {
            if (count < 1)
            {
                throw new ArgumentException("Total count of firings must be at least one! Given count: " + count);
            }

            SimpleScheduleBuilder sb = Create()
                .WithInterval(TimeSpan.FromSeconds(seconds))
                .WithRepeatCount(count - 1);

            return sb;
        }

        /// <summary>
        /// Create a SimpleScheduleBuilder set to repeat the given number
        /// of times - 1  with a 1 hour interval.
        /// </summary>
        /// <remarks>
        /// <para>Note: Total count = 1 (at start time) + repeat count</para>
        /// </remarks>
        /// <returns>the new SimpleScheduleBuilder</returns>
        public static SimpleScheduleBuilder RepeatHourlyForTotalCount(int count)
        {
            if (count < 1)
            {
                throw new ArgumentException("Total count of firings must be at least one! Given count: " + count);
            }

            SimpleScheduleBuilder sb = Create()
                .WithInterval(TimeSpan.FromHours(1))
                .WithRepeatCount(count - 1);

            return sb;
        }

        /// <summary>
        /// Create a SimpleScheduleBuilder set to repeat the given number
        /// of times - 1  with an interval of the given number of hours.
        /// </summary>
        /// <remarks>
        /// <para>Note: Total count = 1 (at start time) + repeat count</para>
        /// </remarks>
        /// <returns>the new SimpleScheduleBuilder</returns>
        public static SimpleScheduleBuilder RepeatHourlyForTotalCount(int count, int hours)
        {
            if (count < 1)
            {
                throw new ArgumentException("Total count of firings must be at least one! Given count: " + count);
            }

            SimpleScheduleBuilder sb = Create()
                .WithInterval(TimeSpan.FromHours(hours))
                .WithRepeatCount(count - 1);

            return sb;
        }

 

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

【其他文章推薦】

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

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

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

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

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