實現websocket 主動消息推送,用laravel+Swoole

近來有個需求:想實現一個可以主動觸發消息推送的功能,這個可以實現向模板消息那個,給予所有成員發送自定義消息,而不需要通過客戶端發送消息,服務端上message中監聽傳送的消息進行做相對於的業務邏輯。

主動消息推送實現
平常我們採用 swoole 來寫 WebSocket 服務可能最多的用到的是open,message,close這三個監聽狀態,但是萬萬沒有看下下面的onRequest回調的使用,沒錯,解決這次主動消息推送的就是需要用onRequest回調。
官方文檔:正因為swoole_websocket_server繼承自swoole_http_server,所以在 websocket 中有onRequest回調。

詳細實現:

 1 # 這裡是一個laravel中Commands
 2 # 運行php artisan swoole start 即可運行
 3 <?php
 4 
 5 namespace App\Console\Commands;
 6 
 7 use Illuminate\Console\Command;
 8 use swoole_websocket_server;
 9 
10 class Swoole extends Command
11 {
12     public $ws;
13     /**
14      * The name and signature of the console command.
15      *
16      * @var string
17      */
18     protected $signature = 'swoole {action}';
19 
20     /**
21      * The console command description.
22      *
23      * @var string
24      */
25     protected $description = 'Active Push Message';
26 
27     /**
28      * Create a new command instance.
29      *
30      * @return void
31      */
32     public function __construct()
33     {
34         parent::__construct();
35     }
36 
37     /**
38      * Execute the console command.
39      *
40      * @return mixed
41      */
42     public function handle()
43     {
44         $arg = $this->argument('action');
45         switch ($arg) {
46             case 'start':
47                 $this->info('swoole server started');
48                 $this->start();
49                 break;
50             case 'stop':
51                 $this->info('swoole server stoped');
52                 break;
53             case 'restart':
54                 $this->info('swoole server restarted');
55                 break;
56         }
57     }
58 
59     /**
60      * 啟動Swoole
61      */
62     private function start()
63     {
64         $this->ws = new swoole_websocket_server("0.0.0.0", 9502);
65         //監聽WebSocket連接打開事件
66         $this->ws->on('open', function ($ws, $request) {
67         });
68         //監聽WebSocket消息事件
69         $this->ws->on('message', function ($ws, $frame) {
70             $this->info("client is SendMessage\n");
71         });
72         //監聽WebSocket主動推送消息事件
73         $this->ws->on('request', function ($request, $response) {
74             $scene = $request->post['scene'];       // 獲取值
75             $this->info("client is PushMessage\n".$scene);
76         });
77         //監聽WebSocket連接關閉事件
78         $this->ws->on('close', function ($ws, $fd) {
79             $this->info("client is close\n");
80         });
81         $this->ws->start();
82     }
83 }

 

前面說的是 swoole 中onRequest的實現,下面實現下在控制器中主動觸發onRequest回調。實現方法就是我們熟悉的curl請求。

 1 # 調用activepush方法以後,會在cmd中打印出 
 2 # client is PushMessage 主動推送消息 字眼
 3     /**
 4      * CURL請求
 5      * @param $data
 6      */
 7     public function curl($data)
 8     {
 9         $curl = curl_init();
10         curl_setopt($curl, CURLOPT_URL, "http://127.0.0.1:9502");
11         curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
12         curl_setopt($curl, CURLOPT_HEADER, 1);
13         curl_setopt($curl, CURLOPT_POST, 1);
14         curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
15         curl_exec($curl);
16         curl_close($curl);
17     }
18     
19     /**
20      * 主動觸發
21      */
22     public function activepush()
23     {
24         $param['scene'] = '主動推送消息';
25         $this->curl($param);            // 主動推送消息

 

用途
onRequest 回調特別適用於需要在控制器中調用的推送消息,比如模板消息之類,在控制器中調用。

 

推薦閱讀:

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

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

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

敏捷開發:項目管理的一些思考

誤區

之前我沒有項目經驗,在上一家公司的項目管理上,我只是照葫蘆畫瓢。

  1. 產品發起,整個項目沒有項目經理這一說。或者說有,但卻真的感受不到,一丁點也感受不到。

  2. 產品發起會議,或者開發發起會議。無論誰來發起會議,一般都會針對於某一具體需求或者某一具體實現方式。

  3. 沒有具體的任務規劃,任務拆得不夠細緻。這個和開發自身有關係。當然那時的公司確實沒有一些指導性質的模板和導師。

  4. 任務分得不夠細緻,就會導致工期評估差距比較大。

  5. 各種O們的臨時緊急需求,很多O沒有技術背景和項目管理背景。很多時候提出的需求都是發生在項目開始過程中。

    都是很急的需求,不得不重新估算時間和排期。開發為了避免延期風險,就是讓產品排優先級,然後我們根據優先級估時。

    直到有必要的需求都在這個迭代中計劃上。

  6. 沒人全局把控,產品從產品角度,開發從開發角度,業務從業務角度。始終沒有一個最終的協調人。

    產品在對各種O的對話中,氣場和身份不足,導致需求基本是提出就會安排。即便是請出青島總負責人出面溝通,最終的結果一般就是接受。

  7. 之前我們是青島為開發,北京為產品、UI、前端、測試。異地溝通。電話會議是常有的事情,私下的臨時溝通電話更是家常便飯。

    信息同步、開會、理解程度 都會造成溝通上的成本增加。

  8. 緊急需求上線后,三個月沒人反饋。問了才知道,財務提的需求他們沒用過。

  9. 開會一般都會臨時決定,發起人會準備資料,但是其他人提前看資料準備問題的情況極少。導致會議冗長效率低。

解決

現在來看,無論如何,我們在知道這些問題,但是為什麼不去處理呢?應該還是習慣了,即便是整個項目非常掙扎,依然是按老規矩走。大家都是困在了這個圍牆中。

我現在也有了一年的項目管理經驗,初入門道。只是對自己的過往進行一下分析解決。

以上的誤區和問題,我覺得需要一個有經驗並且有點能力的人來帶領這個項目團隊。

1. 確認項目經理

但是按照我上家公司的情況,一般會立經驗豐富的主管直接管理這個項目。

當時的情況是,項目主管在項目上的精力完全不夠,甚至說項目管理在項目主管心中的優先級比較低。

根本原因,青島作為研發中心,技術基因強大。很多技術管理人員,沒有意識到項目管理的重要性。

組織架構主要是垂直單線架構,技術-主管-經理-總監-CTO。無非是自己下面的人多,按照業務或者大項目分了組而已。

如果讓開發作為項目經理,

首先這個開發是否願意承擔項目經理職責?

是否真的能夠賦給項目經理一些實權?

是否有鼓勵機制,比如晉陞優先或者獎金等?

建議:

加強項目管理意識;

加強項目管理能力;

必要的話可以作為量化指標來看;

加入一些激勵機制;

2. 培養主動性

因為技術基因影響。主管或者經理出於“好心”考慮。

他可能會考慮到,如果把項目管理中的某些事情分配給組員,會不會引起反感?會不會影響在組員中的美好形象?

也算是確實分下來一些,比如項目規劃和估時以及排期。但是我沒經驗的,是不是可以稍微引導一下?

領導總想為老好人,但是這樣自己手頭的任務分不下去。

下面的人也得不到成長。

建議

對組員有一定的規劃和成長要求,而不是放任其隨意生長(有一定風險)

領導應該提高自身的管理能力,管理技巧。而不是憑經驗論。

定時關切Review分下去的任務,從結果或者過程提出建議和優化。

3. 確認好需求邊界

產品經理和負責人,確認好需求邊界。飄忽不定的需求給項目的打擊是很大的。

開發在搖搖墜墜中估時,此時的估時肯定會有大量的冗餘,因為之前需求的變動,上線時間一改再改。

在加上,主管、經理偶爾砍幾刀。所以開發在估工時都會冗餘很多。為了被砍,為了需求不定。

建議:

確認好需求,可將項目周期縮短,小版本迭代。

強化項目上線時間約定,鍥約精神。不僅僅是開發要遵守。其他人員最好也能嚴格遵守。(當初這個做起來真的比較困難)

信心是做出來的,幾次項目的延期和需求的變更會嚴重打擊大家的信心和士氣。所以按時上線很重要。

規劃得有,但是是不是可以考刪掉遠在4個月以後的需求。

4. 緊急需求

比如財務的一些緊急需求,其實確實緊急,但是使用頻率很低。

是不是可以有另一種解決方案?不一定非要按照財務提出的那種設想。

我們達到並滿足了他們的目標,後期再去做頁面更加直觀。

比如要一個訂單查看頁面。那我使用程序定時拉取新訂單推送到企業微信或者釘釘。結果也是非常滿意的。

不一定非要做一個頁面,很多時候做成一個頁面,大家會發揮自己的產品意識,增加一些不必要的按鈕、功能和邏輯。

建議

深入了解需求,而不僅僅是一句話,也不是根據用戶提出的需求來做,用戶到底想要什麼?--他就想要有訂單能及時知道。

緊急需求是否真緊急,也得看使用頻率。使用頻率低,是否有其他方式實現。

能擱置的暫且擱置一下,之前就我一個人開發,很多原本緊急的需求因為開發不夠,擱置了也就擱置了。然後甚至有的都自己消失了。

5. 高效開會

會議開始前,大家幾乎么有預習的習慣,會上很多時候沒有主持人,大家就問題會討論很深,導致時間不可控。

有的會能一個電話解決的就沒必要拉這個拉那個來開會。這種儀式感不重要,開會也不是拉家常。

為了讓領導知道這次會議的重要性,這個項目的重要性。拉着領導一起開:

但是領導的事情多,很多時候在會上他們是一直回複信息,其實當時是比較尷尬的,領導不能專心處理問題。我們看着領導沒用心聽,不了解的同事還以為領導漠不關心呢。

建議:

發起人拉群,提前@人提醒大家關注和看會議內容。

發起人做會議:主題、流程、最終結論

確認會議主持人,隨時控制會議進度。有些細節會後溝通。

領導可以不必參加需求討論會,把會上討論的疑難問題,會後單獨和領導會報,再拉一個小會議電話溝通確認即可。

 重要項目啟動會、項目上線等會議盡量簡短,領導全身心參加。保證大家的鬥志,統一思想達成一致。有些形式必須要有的。

6. 相關方

開發與客戶溝通少,因為兩地溝通,基本是產品作為翻譯官將業務轉成需求轉達給開發。

開發沒有感知用戶的存在。

建議

多聽聽用戶怎麼說。

大家達成一致,每月電話會議或者視頻會議溝通一次。會議可以控制在1小時以內,氛圍可以輕鬆,主要是收集需求以及反饋問題。

如果有多個業務部門都是相關方,那麼主要思想就是設置定期溝通(規律的定期溝通)
    

7. 轉變

優勝劣汰的企業付薪給我們,我們就要服務於這個企業用戶。甚至說服務好用戶。

我們開發也要主動從自身求變。好好說話,真心替我們的用戶思考過問題。

從產品和業務角度認可業務優先級,而不是緊緊盯着開發重構、新技術的應用。

建議

轉變意識:我想為你們服務;

我能力不行,但是我能主動學習項目管理知識和經驗,並在項目中實踐,反思,再實踐。

我要為我開發的產品負責,它的迭代,扔給它的需求,和它相關方,它的應變能力。

主動一點,也許事情看起來並沒有那麼難。

現在的我,我們

新的公司,給了我很多的機會,糾正了我很多認知,我也從實踐中反思了很多,收穫了很多。

公司的組織架構是矩形架構:橫向職能,垂直項目

項目首先會有項目經理,項目經理有一定的項目經理獎金。當然項目經理要履行項目經理的職責。都會有績效。

項目經理,開發,產品,測試,DBA,運維,PMO 這些會組成一個項目組。

整個項目組會在項目經理的引導下,開發項目直到上線。然後迭代下一版本。

現在項目中,有使用瀑布開發,有使用敏捷開發。

我所認知的一點是,各個職能團隊人員雖然屬於職能。但是基本會長期泡在各個項目中。

項目中學習到的東西,在項目中的成長也是很重要的。所以項目經理有一定的敏捷角色中PM的角色:引導大家,賦能給大家。

我們正在嘗試的敏捷(嘗試)

其他團隊物理面板:

我們團隊的面板:非常簡單

項目并行和項目特殊性,我們採用周交付,不確定哪一天交付什麼(特殊需求除外)。

因為項目為運維性質的項目,有開發,緊急需求,客戶答疑問題較多。時間不太可控。

並且大家积極性都很高,沒必要要求必須排滿周開發任務。

自己開發完直接到需求池,領取最優先級的需求,或者幫助其他組員分解開發任務。

業務需求 + 技術需求 雙向需求驅動,佔比5:1。

周最高優先級佔比 1:4

這樣大家不會因為具體時間的衝突導致交付的壓力。周交付的任務為必須交付的最小單元(本周必須交付)。

沒必要的會議去掉,我們基本都坐在一起,不去會議室。工位周邊就可以開會。電腦操作隨時記錄,會後發出來。

周五:計劃會(15:00 ~ 15:30)

10分鐘,材料都是平時積累,會前整理完

地點:工位

目的:回顧上版本迭代精進結果。分析過程問題原因,總結問題。認知好與不足,下版本迭代重點要解決的問題。;討論新需求優先級;達成一致周最小目標。

周五會後 + 周一開會前 

這段時間,是大家緩一緩,總結自己規劃下周的時間。

磨刀不誤砍柴工,想好怎麼做,才能預知困難和風險。

對新需求進行任務拆分,需求理解,任務具體估時。

周一:迭代會(10:00 ~ 10:15)

15~30分鐘,微調任務;統一思想;確認周迭代目標;

地點:工位

周三:如果需要可以開一個簡短溝通會

我們自己維護的計劃和交付,簡單高效。團隊協作,互相可看。

我們的產品是剛畢業的新人,我們互相指導學習。

他最近也在研究用戶故事如何寫好。他打算下周先打印出來,大家看看自己感受一下。

最近我看完了一本敏捷開發相關的書籍,同時推薦給了他。我們想單獨摘出好的或者值得討論的地方,大家圍在一起拿出半小時討論一下也未嘗不可。

還有一本我正在看,可能我實踐經驗不足。總是感覺一般般的感覺。思路不是很清晰。

有讀過的朋友可以發表一下看法。

總結

敏捷我們在路上。不為敏捷而敏捷。

我們互相提高,互相幫助,能力提升,升職加薪。生活質量更好。

大街上敏捷一大堆,根據實際情況摸索敏捷之道。發揮大家的能力,提升大家的能力。為大家帶來點實際的東西。為企業帶來點實際的東西。

項目管理根本目標是把項目管好,項目管好,大家更加自信,互相也都信任。所以項目管好是項目組良性循環的根本。項目經理要多花大力氣去關注,去學習。

謝謝關注公眾號

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

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

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

Gogoro 與小牛歐洲廝殺,搶佔德國灘頭堡

德國因為天氣較冷,摩托車被視為是夏天的玩具,但現在卻成為Gogoro 與中國牛電科技等亞洲電動機車品牌進軍歐洲市場的敲門磚。

現在電動機車可以透過應用程式連結到智慧手機,進行簡易的充電、里程控制以及反偷竊與帳單功能等等。日經新聞報導,Gogoro 去年8 月開始在德國柏林透過電動機車分享計畫Coup 來布局市場,起初提供200 台,近期會再增加800 台,而中國的牛電科技則在全德國、奧利地、比利時與瑞士市場開始銷售,尚未公布銷售數字。

這兩家競爭者都與德國汽車零件供應商Bosch 合作,Coup 是Bosch 的子公司,而牛電科技電動機車則使用Bosch 的引擎。Bosch 也積極與電動車廠合作,作為從內燃機引擎轉向電動車引擎世代的契機,因為電動機車只需要數十個零件,而傳統機車需要上千個零件,德國許多汽車零件供應商都預告裁員。Coup 則是Bosch 成立來形塑城市移動趨勢的前哨戰,以提供用戶服務為核心。

報導指出,Gogoro 的電池充電概念讓Coup 印象深刻。Gogoro 自2015 年以來一直在台灣城市營運自己的電子移動計畫,但客戶必須購買相當於6 萬元新台幣的電動機車,然後在交換站網路交換電池,每月付款新台幣300~900 元。Gogoro 在柏林則提供全天出租20 歐元,或3 歐元30 分鐘,而不需要購買一台電動機車。

Coup 智慧手機應用程式可顯示客戶在哪裡可以找到可用的電動機車、解鎖和鎖定,並進行計費。在使用過程中,應用程式會顯示電動機車的位置,並通知電池狀態和剩餘里程。總距離約95 公里,最高時速45 公里,21 歲以上的人可以使用德國駕駛執照租用。

Gogoro 表示,選擇柏林而不是冬天仍溫暖怡人的羅馬與馬德里,是因為這裡能引領潮流,而且柏林人民擁抱新事物。1980 年柏林以自己的共享資本為傲,引進Airbnb 的前身Mitwohnzentralen,並在2014 年推出一個電動鑽機租借商店。這座城市擁有十幾個汽車共享計畫。分析師認為選擇德國也是利用德國公司高品質的聲譽來進軍其他歐洲市場。

中國牛電科技推出的電動機車售價2,700 歐元,也使用與Coup 類似的應用程式,趁Gogoro 專注布局柏林時快速佔領其他市場。在德國城鎮Fulda,三菱與鈴木汽車的經銷商自3 月來開始銷售小牛電動機車。

Coup 即將進軍巴黎,提供首批600 台Gogoro,讓Gogoro 在歐洲銷售量達到1,600 台,另外在台灣銷售2 萬台。牛電科技預計到2018 年全球賣出15 萬台。截至2016 年9 月,中國已經賣出10 萬台。

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

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

【其他文章推薦】

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

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

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

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

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

荷蘭團隊要打造世界第一台以甲酸為燃料巴士

隨著環保意識提升,再生能源的利用逐漸受到各國重視,荷蘭一群學生就開發出一種儲存能源的方法,不僅簡單製造、可用性高也更持久,他們打算利用這項技術來打造第一台使用甲酸(Formic acid)做為燃料的巴士。  
用甲酸做燃料的巴士   甲酸,又被稱做蟻酸,是螞蟻及蚊蟲在叮咬中傳播的物質,化學式為HCOOH,這種簡單的羧酸已經被使用在紡織和皮革加工作業中,也可以用來做為家畜飼料的防腐劑,或是添加在家用的水垢去除劑。

 

(Source:Flickr/Brian Gratwicke CC BY 2.0)   而由荷蘭恩荷芬理工大學(TU/e)多學科學生團隊組成的新創公司Team FAST  找到了一種方法,讓甲酸能夠有效攜帶氫燃料電池必需的成分,為電動車提供電力。   BBC 報導,Team FAST 計畫打造的巴士主要燃料叫做Hydrozine(並不是聯氨Hydrazine),由99% 的甲酸組成,呈現液體型態,能夠輕易的傳送運輸,因此在車輛上也能夠快速的進行「加油」,就像是目前一般使用的燃料一樣。   但和現今的燃料不同的是,Hydrozine 更環保。   Team FAST 的發言人Lucas van Cappellen 表示,使用這種燃料,車輛排放的尾氣中只會有二氧化碳和水,不會具有其他有害氣體,像是一氧化氮、煤煙或硫氧化物。   為了證明這個概念可行,Team FAST 目前正和VDL 集團合作,打造第一台甲酸燃料巴士,預計2017 下半年間將在荷蘭登場,除了在展覽中亮相以外,巴士也會在一般道路上行駛。   這台巴士將透過VDL 開發的電力系統驅動,並且能夠透過托掛在後方拖車上的甲酸燃料電池系統接收額外的電力。   根據van Cappellen 透露,目前的燃料箱大約是300 公升,因此這台電動巴士的續航力大約是200 公里,但未來要再把燃料箱加大也是非常簡單的。   但為什麼要一開始就從巴士下手,而不是選擇一般車輛呢?   van Cappellen 解釋,因為團隊覺得電動車已經是一個很好的解決方案,如果選擇從一般車輛入手,Hydrozine 將會面對和電動車競爭的問題。   「但相反來看,如果我們能夠建造一台滿足巴士公司需求的巴士,續航力達到400 公里左右,也能夠快速補充燃料,我們就能在還沒有競爭對手的領域中,展現出Hydrozine 的潛力。」  
商業化的可行性   根據Team FAST 官網和van Cappellen 的說明,團隊先是將溶於水的氫氣和二氧化碳運用催化劑合併為甲酸製成Hydrozine,之後再透過催化劑在「reformer」的裝置中分解為氫氣和二氧化碳,將氫氣加到燃料電池中與氧氣反應,產生電力供巴士使用。  

(Source:Team FAST)   Team FAST 目前正在為「reformer」申請專利中,新設計的「reformer」體積只有過去的十分之一,這可能也是Hydrozine 首次能夠被運用在交通運輸上的原因。   負責交通解決方案的VDL ETS 總經理Menno Kleingeld 表示,VDL 一直在尋找新技術,能夠透過簡單方式拓展零排放交通的範圍,「將甲酸分解為氫氣就是一項很有希望的新技術」。   van Cappellen 估計,將一般加油站轉換為Hydrozine 補充站的整體費用大概是3.5 萬歐元(約120 萬元台幣),比起直接架設會便宜許多,而且Hydrozine 比汽油更加便宜,預計未來價格還會持續下降,因此他認為商業化是可行的。   除此之外,Team FAST 認為,雖然這樣的巴士也會排放二氧化碳,但製造Hydrozine 的原料之一就是二氧化碳,是由現有的來源收集而來,因此並沒有額外的碳產生,因此能夠達到環保概念中所謂的「碳循環」效果。   荷蘭一些專家和企業都看好並支持這個計畫,研究的學生也都非常投入在其中,除了15 位全心投入計畫的人員外,其他學生每周也都投入20~25 小時在計畫中研究。   van Cappellen 表示,儘管他們不能從中獲得學分,但能從大學中獲得的實際經驗大概就只有那麼一些,「我們正在建造自己的未來」。   (合作媒體:。首途來源:pixabay;圖片出處:TechNews)  

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

【其他文章推薦】

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

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

Volvo 兩年後只生產電動車,中國政府是幕後推手

  Volvo 宣布要讓內燃機引擎退場,2019 年生產車款全面配備電動引擎,正式從生產傳統汽車轉向電動車,其實Volvo 此舉的最大幕後推手是近年積極發展綠能的中國政府,被中資買下的Volvo 只是配合中國政策布局。   華爾街日報(WSJ)分析指出,中國是全球最大汽車市場,因此中國政策一舉一動對產業變化是牽一髮動全身,隨著中國治理空汙政策逐步兌現,汽車大廠不得不跟著改變策略、加緊跟上,更別說現在Volvo 的老闆是中國吉利汽車。   現在中國每年電動車銷售量可達50 萬台,超過美國與其他已開發國家,中國政府上月更新電動車政策,旨在鼓勵生產更大容量電池的電動車,在此政策下生產高品質電動車的廠商將受惠,但不利於在電動車領域發展較晚的企業。   電動車快速成長打破市場對中國抑制生產的謠言。但是中國政府的確要稍微踩煞車,如同過去避免太陽能面板到風力渦輪機生產過剩的現象。政策調整後,現在生產高品質,電池續航力更久的電動車製造商,若沒有達到綠色汽車產量標準所面臨的罰則較輕,且生產高品質電動車可以在中國新能源汽車積分制度上中賺取積分,在市場上賣給其他負積分的廠商,成為一筆收入來源。   中國政府希望政策調整能夠在淘汰低品質產品同時保持生產力道。德國戴姆勒(Daimler)近日表示,將升級與中國合資企業共同使用的設備,以生產更多電動車。福特也表示將在中國生產電動車,計劃在2025 年前將七成電動車產能移往中國。   福斯(Volkswagen)電動車設計也是以中國市場為核心,目標是在2025 年前每年賣出100 萬台電動車,其中六成銷往中國。日本大廠也不放過,本田(Honda)汽車宣布要在2018 年於中國上市純電動車。   不過新政策對中國最大SUV 製造商長城汽車而言沒有好處,因為SUV 賣得太好,因此長城汽車的燃油消耗仍遠高於政府規定的目標,市場認為長城汽車短期內不會發展電動車,而吉利汽車相較同業可獲得較大利益。   中國十三五計畫明訂發展電動車產業,在政策扶植下已成為正在強勢發展的明星級產業,中國訂下2020 年讓500 萬輛電動車上路的目標。報導認為,中國政策加上全球汽車大廠的配合,將是推動電動車發展的最大幕後黑手。   (合作媒體:。圖片出處:pixabay CC0)  

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

【其他文章推薦】

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

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

圖解Elasticsearch的核心概念

本文講解大綱,分8個核心概念講解說明:

  • NRT
  • Cluster
  • Node
  • Document&Field
  • Index
  • Type
  • Shard
  • Replica

Near Realtime(NRT)近實時

Elasticsearch的核心優勢就是(Near Real Time NRT)近乎實時,我們稱之為近實時。
NRT有兩個意思,下面舉例說明下:

  • 從寫入索引數據到數據可以被搜索到有一個小延遲(大概1秒);

舉個例子:電商平台新上架一個新商品,1秒後用戶就可搜索到這個商品信息,這就是近實時。

  • 基於Elasticsearch執行搜索和分析可以達到秒級查詢

也舉個例子說明,比如我現在想查詢我在淘寶,最近一年都買過幾件商品,總共花了多少錢,最貴的商品多少錢,哪個月買到東西最多,什麼類型的商品買的最多這樣的信息,如果淘寶說,你要等待10分鐘才能出結果,你是不是很崩潰,這個延遲的時間就不是近實時,如果淘寶可以秒級別返回給你,就是近實時了。

下面畫一個圖,解釋下三個基本概念的

Cluster:集群

包含多個節點,每個節點屬於哪個集群是通過一個配置(集群名稱,默認是elasticsearch)來決定的,對於中小型應用來說,剛開始一個集群就一個節點很正常。集群的目的為了提供高可用和海量數據的存儲以及更快的跨節點查詢能力。

Node:節點

集群中的一個節點,節點也有一個名稱(默認是隨機分配的),節點名稱很重要(在執行運維管理操作的時候),默認節點會去加入一個名稱為“elasticsearch”的集群,如果直接啟動一堆節點,那麼它們會自動組成一個elasticsearch集群,當然一個節點也可以組成一個elasticsearch集群

Document&field:文檔和字段

document 是es中的最小數據單元,一個document可以是一條客戶數據,一條商品分類數據,一條訂單數據,通常用JSON數據結構表示,每個index下的type中,都可以去存儲多個document。一個document裏面有多個field,每個field就是一個數據字段。

相當於mysql里的行,可以簡單這麼理解,舉個例子。一個商品的文檔數據一條如下:

product document
{
  "product_id": "1000",
  "product_name": "mac pro 2019 款筆記本",
  "product_desc": "高性能,高分辨率,編程必備神器",
  "category_id": "2",
  "category_name": "电子產品"
}

Index:索引

包含一堆有相似結構的文檔數據,比如可以有一個客戶索引,商品分類索引,訂單索引,索引有一個名稱。
一個index包含很多document,一個index就代表了一類類似的或者相同的document。比如說建立一個product index,商品索引,裏面可能就存放了所有的商品數據,所有的商品document。

Type:類型

每個索引里都可以有一個或多個type,type是index中的一個邏輯數據分類,一個type下的document,都有相同的field,比如博客系統,有一個索引,可以定義用戶數據type,博客數據type,評論數據type。

商品index,裏面存放了所有的商品數據,商品document

但是商品分很多種類,每個種類的document的field可能不太一樣,比如說電器商品,可能還包含一些諸如售後時間範圍這樣的特殊field;生鮮商品,還包含一些諸如生鮮保質期之類的特殊field

type,日化商品type,電器商品type,生鮮商品type

日化商品type:product_id,product_name,product_desc,category_id,category_name
電器商品type:product_id,product_name,product_desc,category_id,category_name,service_period
生鮮商品type:product_id,product_name,product_desc,category_id,category_name,eat_period

每一個type裏面,都會包含一堆document

{
“product_id”: “2”,
“product_name”: “長虹電視機”,
“product_desc”: “4k高清”,
“category_id”: “3”,
“category_name”: “電器”,
“service_period”: “1年”
}

{
“product_id”: “3”,
“product_name”: “基圍蝦”,
“product_desc”: “純天然,冰島產”,
“category_id”: “4”,
“category_name”: “生鮮”,
“eat_period”: “7天”
}

Shard 分片,也稱 Primary Shard

單台機器無法存儲大量數據,es可以將一個索引中的數據切分為多個shard,分佈在多台服務器上存儲。有了shard就可以橫向擴展,存儲更多數據,讓搜索和分析等操作分佈到多台服務器上去執行,提升吞吐量和性能。

每個shard都是一個lucene index。

Replica 副本,也稱 Replica Shard

任何一個服務器隨時可能故障或宕機,此時shard可能就會丟失,因此可以為每個shard創建多個replica副本。replica可以在shard故障時提供備用服務,保證數據不丟失,多個replica還可以提升搜索操作的吞吐量和性能。

primary shard(建立索引時一次設置,不能修改,默認5個),

replica shard(隨時修改數量,默認1個),

默認每個索引10個shard,5個primary shard,5個replica shard,最小的高可用配置,是2台服務器。

相關索引解釋說明:

  • index包含多個shard
  • 每個shard都是一個最小工作單元,承載部分數據,lucene實例,完整的建立索引和處理請求的能力
  • 增減節點時,shard會自動在nodes中負載均衡
  • primary shard和replica shard,每個document肯定只存在於某一個primary shard以及其對應的replica shard中,不可能存在於多個primary shard
  • replica shard是primary shard的副本,負責容錯,以及承擔讀請求負載
  • primary shard的數量在創建索引的時候就固定了,replica shard的數量可以隨時修改
  • primary shard的默認數量是5,replica默認是1,默認有10個shard,5個primary shard,5個replica shard
  • primary shard不能和自己的replica shard放在同一個節點上(否則節點宕機,primary shard和副本都丟失,起不到容錯的作用),但是可以和其他primary shard的replica shard放在同一個節點上

索引在集群中分配圖:

本文由博客一文多發平台 發布!

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

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

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

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

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

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

貪心算法(會場安排問題、區間選點)

學習算法課程之後的第一次記錄,漸漸的,程序設計考慮的因素增多,程序=數據結構+算法,這個等式讓我深有體會。從開始簡單的C++編程,再到選擇合適數據結構,現在需要更進一步,從算法層次上考慮程序執行的效率。我對算法的理解是用更少的開銷獲得更優的執行效果。

分治法、動態規劃在此之前沒有記錄下來,學到貪心算法的時候,覺得需要總結一下學過的東西,也能更好的理解。動態規劃的設計,要滿足最優子結構性質和重疊子問題,採用自底向上的策略,計算出最優值,找到整體最優解。這個過程有時候挺難的,主要在寫出遞歸式,要自底向上填表。貪心策略有點像動態規劃,但在一些方面是不同的,有時候貪心算法的思想更容易想到。它要滿足子問題最優而得到整體最優?兩個條件:最優子結構性質和貪心選擇性質。滿足貪心選擇性質一定滿足最優子結構性質,而滿足最優子結構性質不一定滿足貪心選擇性質,比如背包問題可以用貪心算法解決,而0-1背包問題只能用動態規劃。

典型的貪心問題活動安排,有n個活動,給出開始時間和結束時間,要盡可能安排多的活動(時間互相不衝突)。解決這個問題正確的貪心思想是以每個活動結束時間為比較變量,按結束時間升序排好活動次序,接着就進行比較選擇。而會場安排問題與活動又有些不同之處,下面是我的解題過程。

7-2 會場安排問題 (20 分)

假設要在足夠多的會場里安排一批活動,並希望使用盡可能少的會場。設計一個有效的 貪心算法進行安排。(這個問題實際上是著名的圖着色問題。若將每一個活動作為圖的一個 頂點,不相容活動間用邊相連。使相鄰頂點着有不同顏色的最小着色數,相應於要找的最小 會場數。)

輸入格式:

第一行有 1 個正整數k,表示有 k個待安排的活動。 接下來的 k行中,每行有 2個正整數,分別表示 k個待安排的活動開始時間和結束時間。時間 以 0 點開始的分鐘計。

輸出格式:

輸出最少會場數。

輸入樣例:

5
1 23
12 28
25 35
27 80
36 50 

輸出樣例:

3
#include<iostream>
#include<algorithm>
using namespace std;
struct node {
    int begin;
    int end;
    int flag;//標記該活動是否被安排,0表示未安排,1表示已安排 
}t[10001];
int cmp(const node &a,const node &b)//比較規則:以結束時間升序排列 
{ 
    return a.end<b.end;
 } 
int main()
{
    int i,j,n;
    node temp;
    cin>>n;
    for(i=0;i<n;i++) 
    {
        cin>>t[i].begin>>t[i].end;
        t[i].flag=0;
    }
    sort(t,t+n,cmp);
        
    int sum=0;//總共需要的會場數量 

    for(i=0;i<n;i++)//方法2 
    {
        if(!t[i].flag)//找到未安排的活動,進行場地安排 
        {
            sum++;
            int p=i;
            for(j=p+1;j<n;j++)//當前活動結束時間與下一個活動開始不相交 ,則安排到同一個會場 
            {
                if(t[p].end<=t[j].begin&&!t[j].flag)
                {
                    p=j;t[j].flag=1;
                }
            }
            t[i].flag=1;
        }
    }

    cout<<sum;
    return 0;
}

View Code

貪心策略為:把盡可能多的時間互不衝突的活動安排到一個會場,若活動時間交叉,則在安排到另一個會場。

將所有活動按結束時間升序排列,利用sort函數,自定義cmp方法。循環體中,每次可以找到還沒有安排的活動,並以這個活動搜索能同時容納到一個會場的其他活動(這一步嵌套在內層循環中),經過兩層循環,把所有活動全部安排好,這時也已經計算出需要的會場數量sum。

類似的問題是區間選點

7-10 選點問題 (15 分)  數軸上有n個閉區間[ai, bi]。取盡量少的點,使得每個區間內都至少有一個點(不同區間內含的點可以是同一個)。

輸入格式:

第一行一個数字n,表示有n個閉區間。 下面n行,每行包含2個数字,表示閉區間[ai, bi]

輸出格式:

一個整數,表示至少需要幾個點

輸入樣例:

在這裏給出一組輸入。例如:

3
1 3
2 4
5 6

輸出樣例:

在這裏給出相應的輸出。例如:2

開始想找出幾個區間共同段,並且記錄每個共同段中包含哪些區間,這樣算出最少選點。後來發現覺得這個想法其實可以簡化一下,策略為:以右端為擋板,看看前面是否包含其他區間,如果是,則不記數,反之,說明沒有共同段,需要計數並且移動擋板位置繼續尋找。貪心策略是選擇區間右端點,保證能夠包含更大交叉段,選的點最少。

#include<bits/stdc++.h>
using namespace std;
struct dot{
    int l,r;
    bool v[10001];
}dots[10001];

int cmp(const dot &a,const dot &b)//比較規則,按區間右端點升序排列 
{
    return a.r<b.r;
} 

int main()
{
    int n,i,j,count=1,select;
    cin>>n;
    for(i=0;i<n;i++)
        cin>>dots[i].l>>dots[i].r;
    sort(dots,dots+n,cmp);//預處理,將區間按規則排好序,方便後續比較 
    select=dots[0].r;
    //貪心策略是選擇區間右端點,保證能夠包含更大交叉段,選的點最少 
    for(i=1;i<n;i++)//每次將當前選擇的一個區間的右端點與下一個(或者同一區間,可忽略)左端比較 
    {
        if(dots[i].l>select)//如果沒有交叉,選點+1,並以此區間右端為新一輪比較的點 
        {
            count++;
            select=dots[i].r;
        }
    }
    cout<<count;
    return 0;
}

View Code

學習算法之後,發現解決問題上需要思維上的改變,程序設計之前的算法選擇很重要,還要向大佬們學習,典型算法的學習研究真是博大精深呀!

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

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

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

scrapy介紹及使用

scrapy的流程

 

其流程可以描述如下:

  1. 調度器把requests–>引擎–>下載中間件—>下載器
  2. 下載器發送請求,獲取響應—->下載中間件—->引擎—>爬蟲中間件—>爬蟲
  3. 爬蟲提取url地址,組裝成request對象—->爬蟲中間件—>引擎—>調度器
  4. 爬蟲提取數據—>引擎—>管道
  5. 管道進行數據的處理和保存

注意:

  • 圖中綠色線條的表示數據的傳遞
  • 注意圖中中間件的位置,決定了其作用
  • 注意其中引擎的位置,所有的模塊之前相互獨立,只和引擎進行交互

scrapy中每個模塊的具體作用

 

 

 1.scrapy項目實現流程

  • 創建一個scrapy項目:scrapy startproject 項目名

  • 生成一個爬蟲:scrapy genspider 爬蟲名 允許爬取的範圍

  • 提取數據:完善spider,使用xpath等方法

  • 保存數據:pipeline中保存數據

2. 創建scrapy項目

命令:scrapy startproject +<項目名字>

示例:scrapy startproject myspider

生成的目錄和文件結果如下:

 

 

settings.py中的重點字段和內涵

  • USER_AGENT 設置ua
  • ROBOTSTXT_OBEY 是否遵守robots協議,默認是遵守
  • CONCURRENT_REQUESTS 設置併發請求的數量,默認是16個
  • DOWNLOAD_DELAY 下載延遲,默認無延遲
  • COOKIES_ENABLED 是否開啟cookie,即每次請求帶上前一次的cookie,默認是開啟的
  • DEFAULT_REQUEST_HEADERS 設置默認請求頭
  • SPIDER_MIDDLEWARES 爬蟲中間件,設置過程和管道相同
  • DOWNLOADER_MIDDLEWARES 下載中間件

創建爬蟲

命令:scrapy genspider +<爬蟲名字> + <允許爬取的域名>

生成的目錄和文件結果如下:

完善spider

完善spider即通過方法進行數據的提取等操做:

注意:

  1. response.xpath方法的返回結果是一個類似list的類型,其中包含的是selector對象,操作和列表一樣,但是有一些額外的方法
  2. extract() 返回一個包含有字符串的列表
  3. extract_first() 返回列表中的第一個字符串,列表為空沒有返回None
  4. spider中的parse方法必須有
  5. 需要抓取的url地址必須屬於allowed_domains,但是start_urls中的url地址沒有這個限制
  6. 啟動爬蟲的時候注意啟動的位置,是在項目路徑下啟動

 

數據傳遞到pipeline

為什麼要使用yield?

  • 讓整個函數變成一個生成器,有什麼好處呢?
  • 遍歷這個函數的返回值的時候,挨個把數據讀到內存,不會造成內存的瞬間佔用過高
  • python3中的range和python2中的xrange同理

注意:

  • yield能夠傳遞的對象只能是:BaseItem,Request,dict,None

6. 完善pipeline

 

 

 

 

pipeline在settings中能夠開啟多個,為什麼需要開啟多個?

  • 不同的pipeline可以處理不同爬蟲的數據
  • 不同的pipeline能夠進行不同的數據處理的操作,比如一個進行數據清洗,一個進行數據的保存

pipeline使用注意點

  • 使用之前需要在settings中開啟
  • pipeline在setting中鍵表示位置(即pipeline在項目中的位置可以自定義),值表示距離引擎的遠近,越近數據會越先經過
  • 有多個pipeline的時候,process_item的方法必須return item,否則后一個pipeline取到的數據為None值
  • pipeline中process_item的方法必須有,否則item沒有辦法接受和處理
  • process_item方法接受item和spider,其中spider表示當前傳遞item過來的spider

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

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

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

PL真有意思(二):程序設計語言語法

前言

雖然標題是程序語言的語法,但是講的是對詞法和語法的解析,其實關於這個前面那個寫編譯器系列的描述會更清楚,有關語言語法的部分應該是穿插在整個設計當中的,也看語言設計者的心情了

和英語漢語這些自然語言不一樣,計算機語言必須是精確的,它們的語法和語義都必須保證沒有歧義,這當然也讓語法分析更加簡單

所以對於編譯器一項很重要的任務就是時別程序設計語言的結構規則,要完成這個目標就需要兩個要求:

  • 完成對語法規則的描述
  • 確定給定程序是否按照這些規則構造起來,也就是符合語法規則

第一個要求主要由正則表達式和上下文無關文法來描述完成,而第二個要求就是由編譯器來完成,也就是語法分析了

描述語法:正則表達式和上下文無關語法

對於詞法,都可以用三種規則描述出來:

  1. 拼接
  2. 選擇
  3. Kleene(也就是重複任意多次)

比如一個整數常量就可以是多個数字重複任意多次,也叫做正則語言。如果對於一個字符串,我們再加入遞歸定義即可以描述整個語法,就可以稱作上下文無關語法

單詞正則表達式

對於程序語言,單詞的類型不外乎關鍵字、標識符、符合和各種類型的常量

對於整數常量就可以用這樣的正則表達式來表示

integer -> digit digit* digit -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

上下文無關文法

一般正則表達式只適用於描述單詞,因為正則表達式無法描述嵌套結構,一般正則表達式的實現都是用有限狀態自動機,之前用Python實現了一個簡單的也是這樣,但是對於匹配任意深度的嵌套結構就需要有一個任意大的狀態機,顯然不符合。而定義嵌套結構對於描述語法非常有用,所以就有了上下文無關文法

expr := id | number | - expr | ( expr ) | expr or expr

op := + | - | * | /

對於上下文無關文法,每條規則叫做一個產生式,產生式左部的符合稱為非終結符,而右部則是多個終結符或者非終結符,最後所有規則都會推到至終結符上,而終結符就是正則表達式定義的單詞

推導和語法樹

一個正確的上下文無關文法,就可以指導我們如何生成一個合乎語法的終結符串

最簡單的就是從開始符號開始,用這個產生式的右部取代開始符合,再從得到的串選擇一個非終結符繼續進行推導,直到沒有剩下的非終結符,這個過程就像遞歸構造一個樹的過程

expr := expr op expr
     := expr op id
     := expr + id
     := expr op expr + id
     := expr op id + id
     := expr * id + id
     := id * id + id

但是對於給定的上下文語法有可能會推導出不止一顆語法分析樹,我們就說這個上下文語法是存在歧義性的。所以對於上面的上下文無關語法還有更好的文法

掃描

掃描也就是詞法分析,詞法分析完全可以不需要什麼正則表達式、自動機什麼的,徒手擼出來,現在業界為了更好的生成錯誤信息,應該很多也是手工的詞法分析器

手工的詞法分析器,無非就是一直讀入字符,到能判斷出它的token在送入語法分析器

有限狀態自動機

使用有限狀態機的詞法分析一般都是這樣的幾個步驟

  • 給出詞法的正則表達式

  • 將正則表達式轉換為非確定有限自動機(NFA)

其實對於任意的正則表達式都可以用拼接、選擇和Kleene閉包來表示

而同樣的,有限自動機也可以通過這三種方式來表示,圖就不畫了,這個在之前寫Python正則表達式引擎的文章里都畫過了(溜了

  • 將NFA轉換為確定性有限狀態自動機(DFA)

將NFA轉換到DFA可以採用的是子集構造法,主要思想就是,在讀入給定輸入之後所到達的DFA狀態,表示的是原來NFA讀入同樣輸入之後可能澳大的所有狀態

  • 最小化DFA

對於最小化DFA的主要思想是,我們把DFA所有狀態分為兩個等價類,終止態狀態和非終止狀態。然後我們就反覆搜索等價類X和輸入符合c,使得當給定C作為輸入時,X的狀態能轉換到位於k>1個不同等價類中的狀態。之後我們就把X劃分為k個類,使得類中所有轉檯對於C都會轉移到同一個老類的成員。直到無法再按這種方式找到劃分的類時,我們就完成了

這四個步驟在之前的寫的正則表達式引擎中都完成了,在那三篇文章里會更詳細一點

語法分析

一般語法分析器的輸入是token流,而輸出是一顆語法分析樹。其中分析方法一般可以分為自上而下和自下而上兩類,這些類中最重要的兩個分別稱為LL和LR

LL表示從左向右,最左推導,LR表示從左向右,最右推導。這兩類文法都是從左到右的順序讀取輸入,然後語法分析器試圖找出輸入的推導結果

自上而下的方式

一般自上而下的語法分析器比較符合之前的推導方法,從根節點開始像恭弘=叶 恭弘節點反覆的遞歸推導,直到當前的恭弘=叶 恭弘節點都是終結符

  • 遞歸下降

遞歸下降很符合上面說的從根節點出發進行推導,一般用於一些相對簡單一些的語言

read A
read B
sum := A + B
write sum
write sum / 2

比如對於這個程序的遞歸下降,語法分析器一開始調用program函數,在讀入第一個單詞read后,program將調用stmt_list,再接着調用stmt才真正開始匹配read A。以這種方式繼續下去,語法分析器執行路徑將追溯出語法分析樹的從左向右、自上而下的遍歷

  • 表格驅動的LL自上而下

表格驅動的LL是基於一個語法分析表格和一個棧

分析流程是

  1. 初始化一個棧
  2. 將開始符號壓入棧
  3. 彈出棧頂,然後根據棧頂的符號和當前的輸入符號查表
  4. 如果彈出的是非終結符,將會繼續查表來確定下一個壓入棧中的產生式
  5. 如果是終結符將進行匹配

預測集合

從上面可以看出來最重要的就是那個語法分析表格了,語法分析表格其實就是根據當前輸入字符對下一個產生式的預測,這裏就要用到一個概念:預測集合,也就是First和Follow集合。這個在之前寫編譯器系列講的比較詳細,在這裏就不寫了

當然LL語法也會有很多處理不了的文法,所以也才會有其它的語法分析方法

自下而上的方式

在實踐中,自下而上的語法分析都是表格驅動的,這種分析器在一個棧中保存所有部分完成的子樹的根。當它從掃描器中得到一個新的單詞時,就會將這個單詞移入棧。當它發現位於棧頂的若干符號組成一個右部時,它就會將這些符號歸約到對應的左部。

一個自底向上的語法分析過程對應為一個輸入串構造語法分析書的過程,它從恭弘=叶 恭弘子節點開始,通過shift和reduce操作逐漸向上到達根節點

自底向上的語法分析需要一個堆棧來存放解析的符號,例如對於如下語法:

0.  statement -> expr
1.  expr -> expr + factor
2.           | factor
3.  factor ->  ( expr )
4.           | NUM

來解析1+2

stack input
null 1 + 2
NUM + 2 開始讀入一個字符,並把對應的token放入解析堆棧,稱為shift操作
factor + 2 根據語法推導式,factor -> NUM,將NUM出棧,factor入棧,這個操作稱為reduce
expr + 2 這裏繼續做reduce操作,但是由於語法推導式有兩個產生式,所以需要向前看一個符合才能判斷是進行shift還是reduce,也就是語法解析的LA
expr + 2 shift操作
expr + NUM null shift操作
expr + factor null 根據fator的產生式進行reduce
expr null reduce操作
statement null reduce操作

此時規約到開始符號,並且輸入串也為空,代表語法解析成功

有限狀態自動機的構建

0.  s -> e
1.  e -> e + t
2.  e -> t
3.  t -> t * f
4.  t -> f
5.  f -> ( e )
6.  f -> NUM
  • 對起始推導式做閉包操作

先在起始產生式->右邊加上一個.

s -> .e

對.右邊的符號做閉包操作,也就是說如果 . 右邊的符號是一個非終結符,那麼肯定有某個表達式,->左邊是該非終結符,把這些表達式添加進來

s -> . e
e -> . e + t
e -> . t

對新添加進來的推導式反覆重複這個操作,直到所有推導式->右邊是非終結符的那個所在推導式都引入

  • 對引入的產生式進行分區

把 . 右邊擁有相同非終結符的表達式划入一個分區,比如

e -> t .
t -> t . * f

就作為同一個分區。最後把每個分區中的表達式中的 . 右移動一位,形成新的狀態節點

  • 對所有分區節點構建跳轉關係

根據每個節點 . 左邊的符號來判斷輸入什麼字符來跳入該節點

比如, . 左邊的符號是 t, 所以當狀態機處於狀態0時,輸入時 t 時, 跳轉到狀態1。

  • 對所有新生成的節點重複構建

最後對每個新生成的節點進行重複的構建,直到完成所有所有的狀態節點的構建和跳轉

小結

這一篇主要是提了對詞法和語法的分析過程,因為想要結合語言設計和實踐,更詳細的應該去看前面的寫一個編譯器系列

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

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

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

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

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

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

算法導論

  

一.算法

  非形式地說,算法【algorithm】就是任何定義的計算過程,該過程取某個值或值的集合作為輸入併產生某個值或值的集合作為輸出。這樣算法就是把輸入轉換成輸出的計算步驟的一個序列。

  我們也可以把算法看成是用於求解計算問題的工具。一般來說,問題陳述說明了期望的輸入/輸出關係。算法則描述一個特定的計算過程來實現該輸入/輸出關係。例如,我們可能需要把一個數列進行升序排序。實際上,這個問題經常出現,並且為引入許多標準的設計技術和分析工具提供了足夠的理由。

  輸入:n個數的一個序列(a1,a2,…,an)

  輸出:輸入序列的一個排序(a`1,a`2,…,a`n)

  例如,給定輸入序列(6,3,1,2,8,5),排序算法將返回序列(1,2,3,5,6,8)作為輸出。這樣的輸入序列稱為排序問題的一個實例。一般來說,問題實例由計算該問題解所必需的【滿足問題陳述中的各種約束】輸入組成。

  因為許多程序使用排序作為中間步驟,所以排序是計算機科學中的一個基本操作。因此,已有許多好的排序算法供我們任意使用。對於給定應用,哪個算法最好依賴於一下因素:將要被排序的項數、這些項已被稍微排序的程度、關於項值的可能限制、計算機的體繫結構、以及使用的存儲設備的種類【內存、磁盤或磁帶】。

  若對每個輸入實例算法都以正確的輸出結束,則稱該算法是正確的,並稱正確的算法解決了給定的計算問題。不正確的算法對某些輸入實例可能根本不停止,也可能以不正確的方式結束。與人們期望的相反,不正確的算法只要其錯誤率是可控的,有時還是有用的。例如:在研究大素數算法時,將會是一個具有可控錯誤率的算法。

  算法可以用英文說明,也可以說明成計算機程序,甚至說明成硬件設計。唯一的要求是這個說明必須準確描述所要遵循的計算過程。

二.算法解決那些問題

  排序絕不是已開發算法的唯一計算問題,實際上,算法的實際應用是無處不在的,例如:

  

  1.人類基因工程

    識別人類DNA中所有10萬個基因,確定構成人類DNA的30億個化學基對的序列。

  2.互聯網搜索

    互聯網使得全世界的人都能快速地訪問與檢索大量信息。藉助於一些聰明的算法,互聯網上的網站能夠管理和處理這些海量數據。

  3.电子商務

    电子商務使得貨物能夠以电子方式洽談與交換,並且依賴於信用卡號、密碼和銀行結單這類個人信息的保密性。

  4.製造業、廣告推送等等

  5.A/B兩點的最短路徑

  6.最長公共子序列

  7.工廠流水線設計等等

  雖然這些問題的列表還未窮盡,但是它們卻展示了許多有趣的算法問題所共有的兩個特徵:

    1.存在許多候選解,但絕大多數候選解都沒有解決手頭上的問題。尋找一個真正的解或一個最好的解可能是一個很大的挑戰。

    2.存在實際應用。例如,最短路徑問題就是一個很常見的例子。地圖導航、貨物運輸、網絡路由等等

三.數據結構

  數據結構是一種存儲和組織數據的方式,旨在便於訪問和修改。沒有一種單一的數據結構對所有用途都有效,所有重要的是知道不同數據結構的優點和局限。

四.技術

  

  雖然你可能掌握了很多的算法,但是也許某一天你會遇到這樣一個問題,你一時無法找到一個你所知曉或搜索到的算法來解決它。那麼你需要知道如何自己設計與分析一個算法,並且可以去證明及測試它的效率。

五.并行性

  我們或許可以指望處理器時鐘速度能以某個持續的比率增加多年。然而物理的限制對不斷提高的時鐘速度給出了一個限制:因為功率密度隨着時鐘速度超線性增長,一旦時鐘速度變的足夠快,芯片就有融化的危險。因此,為了每秒執行更多的計算,芯片被設計成包含不止一個核心,不同核心之間可以并行執行。因此,為了算法從多核計算機中獲得最佳性能,設計算法時必須考慮并行性。

六.算法無處不在

  

  我們應該像計算機硬件一樣把算法看成一種技術。整個系統的性能不但依賴於選擇快速的硬件而且還依賴於選擇有效的算法。可能你會想,我只是開發一個簡單的WEB程序,只有html和css,那麼抱歉,其中還是設計了不少算法,其中,圖形界面的渲染依賴了算法,WEB程序依賴互聯網,網絡中的路由高度依賴路由算法。程序需要中有需要編譯的代碼沒?編譯器也廣泛使用算法。因此,算法時當前計算機中使用的大多數計算的核心。

  進一步說,隨着計算機能力的不斷增強,我們使用計算機來解決比之前更大的問題,因此,在面對海量的數據時,算法的優劣就顯得尤為重要。

  是否具有算法知識與技術的堅實基礎是區分真正熟練的程序員與初學者的一個特徵。使用現代計算技術,如果你對算法懂得不多,你也可以完成一些任務,但是,如果有一個好的算法背景,那麼你可以做的事情就會多得多。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

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

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!