丹麥環保人士抗議 迫日產5500桶石油平台暫停生產

摘錄自2020年8月18日自由時報報導

丹麥北海海域今(18)日有四名綠色和平組織(Greenpeace)抗議人士占據法國公司道達爾(Total)的無人石油開採平台,對石油開採業者與政府進行抗議,要求停止在北海開採石油,此次抗議活動使得此平台暫時停止了一天高達5500桶石油的生產。

丹麥首都哥本哈根期望於2025年成為世界上第一個碳平衡城市。但是丹麥北海的石油生產計劃將會持續到2050年,雖然屆時北歐國家皆希望達到碳平衡,但若探勘行為獲得許可,可能還是會在2050年後持續生產石油。

道達爾從2018年開始,已在丹麥北海購買了15座油田,丹麥政府正在就是否要進行油田招標政策重新權衡。

氣候變遷
能源轉型
國際新聞
丹麥
石油開採
北海
天然氣
碳平衡

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

【其他文章推薦】

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

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

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

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

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

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

格陵蘭融冰量破紀錄 海平面加速上升拉警報

摘錄自2020年8月23日中央社報導

根據最新研究,格陵蘭冰蓋去年淨減少5320億公噸的冰,打破歷來最高紀錄,相當於全球海洋每天注入額外300萬噸水。

今天(23日)發表在「地球與環境通訊」(Communications Earth & Environment)期刊的研究指出,從格陵蘭(Greenland)崩離的冰層和融冰洪流,是造成去年全球海平面上升的單一最大來源,占所有增加水量的40%。格陵蘭去年流失的冰量,比2012年創造的最高紀錄至少多了15%。

研究的第一作者冰河學家薩斯根(Ingo Sasgen)告訴法新社:「史上格陵蘭冰蓋全年減少規模創新高的五次,全都發生在過去十年內。」

若格陵蘭冰蓋全部融化,全球海平面將升高達7公尺。就算海平面上升幅度沒這麼高,也會重劃全球海岸線,讓數億人現居的土地不再宜居。

海洋
氣候變遷
國際新聞
格陵蘭
海平面上升
融冰
冰蓋

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

【其他文章推薦】

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

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

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

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

※回頭車貨運收費標準

月銷量近萬 既漂亮又有實力的自主SUV車主怎麼說

車主:請叫我大屌哥購買車型:2017款 1。5T 手動凱旋版裸車價格:10。60萬車主點評:外觀帥氣顏值高,比較喜歡的是它的操控,即使是在市區開手動擋也不累,超車、變道都很輕鬆,前後獨立懸挂調校舒適為主,對細碎震動化解很出色,給人很厚實的感覺,動力起步確實有點肉,但渦輪介入后還是挺強勁的,畢竟車重擺在那裡。

前言

比較關心自主品牌SUV車型的朋友,或許對東南旗下的首款SUV就比較熟悉了,自上市以來就收穫了不少好評,豐富的配置和舒適的駕乘感受看得出來,它是廠家很有誠意的一款作品,除此之外賓尼法利納公司設計的高顏值外觀,也是它的殺手鐧,一起來看一下車主們都怎麼說的。

東南汽車-東南DX7

指導價:9.69-13.99萬

車主:啦啦德瑪西亞

購買車型:2017款 1.5T 自動豪華版

裸車價格:12.30萬

車主點評:首先是外觀的原創度非常高,外國團隊設計的就是不一樣,比較洋氣,看着很時尚,其次是內飾的用料是很出色的,10多萬的車能有20多萬的質感,配置上也足夠豐富;空間前後排都很寬敞,後備箱可以完全放平,拉點較長的東西很方便,動力的話只要捨得給油推背感還是有的。

我是9月份提的車,目前行駛里程2500公里,市區油耗11L,高速油耗9L左右,希望過了磨合期後有所下降。

車主:請叫我大屌哥

購買車型:2017款 1.5T 手動凱旋版

裸車價格:10.60萬

車主點評:外觀帥氣顏值高,比較喜歡的是它的操控,即使是在市區開手動擋也不累,超車、變道都很輕鬆,前後獨立懸挂調校舒適為主,對細碎震動化解很出色,給人很厚實的感覺,動力起步確實有點肉,但渦輪介入后還是挺強勁的,畢竟車重擺在那裡。

10月份提的車,現在4000公里,一般市區開,油耗8L左右,手動擋的油耗就完全取決於你怎麼開了,暴力還是溫柔差距都比較大。

車主:依然飯特稀

購買車型:2016款 1.5T 自動尊貴型

裸車價格:14萬

車主點評:最滿意的就是外觀和空間了,開回村裡面大夥都問這麼好看的車得20萬吧,滿足了小小的虛榮心,空間上非常寬敞,一家五口出去玩帶上行李都非常方便,後排放平后能拉比較大件的東西,轉向精準,操控很輕鬆,日常代步使用是很滿意了。

6月份提的車,跑了8000公里了,平均油耗9L,還是可以接受的,對於1.5噸車重的車子來說已經非常不錯了。

總結:東南DX7的長*寬*高為4530*1900*1700mm,軸距達到了2700mm,空間上的表現是非常優秀的,后多連桿的獨立懸挂整體調校很舒適,行駛質感好,加上外觀上的設計和豐富的配置,性價比還是相當高的。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

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

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

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

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

想開豪車又有新選擇?金杯蒂阿茲正式上市

整體外觀大氣,但原創度不高。前臉盾型進氣格柵造型醒目,日行燈帶及柳恭弘=叶 恭弘型大燈讓車頭造型頗具張力。車身側麵線條較為簡單,幸好鯊魚鰭天線、行李架及后擾流板挽回了不少視線。至於車尾,除了保險杠的造型以外,其餘原創度不高。

2017年1月7日,華晨華瑞以“天生大智 親民豪車”為主題,在成都東郊記憶演藝中心,舉行了金杯蒂阿茲的全球上市發布會。作為華晨華瑞的首款SUV車型,蒂阿茲搭載1.5T+6MT的動力組合,長寬高分別為4745/1856/1710mm,軸距為2725mm,將成為自主SUV車型的又一員猛將。

此次蒂阿茲上市,帶來了4款1.5T車型,價格區間為7.98~9.88萬元:

1.5T 6MT潮流版,售價為7.98萬;

1.5T 6MT時尚版,售價為8.88萬;

1.5T 6MT卓越版,售價為9.38萬;

1.5T 6MT領航版,售價為9.88萬。

外觀大氣 原創度不高

蒂阿茲的外觀設計,借鑒了不少謳歌MDX的設計元素。整體外觀大氣,但原創度不高。前臉盾型進氣格柵造型醒目,日行燈帶及柳恭弘=叶 恭弘型大燈讓車頭造型頗具張力。

車身側麵線條較為簡單,幸好鯊魚鰭天線、行李架及后擾流板挽回了不少視線;至於車尾,除了保險杠的造型以外,其餘原創度不高。

空間寬闊 暫無提供7座版本

蒂阿茲車身尺寸為4745mm/1856mm/1710mm,軸距達2725mm,使得面對一系列自主緊湊型SUV競爭對手時不落下風。後備箱容積達1002L,放倒第二排座椅后,後備箱空間最高達到1845L。

黑棕雙色內飾,為平淡的內飾增添了一絲豪華感;此外,蒂阿茲配備0.92㎡的超大天窗,為車內採光提供不少幫助。

1.5T+6MT 配合四輪獨立懸挂

蒂阿茲搭載4A15TS發動機,可輸出113Kw/220Nm峰值功率與扭矩,搭配6擋手動變速箱。暫無提供自動變速箱車型,對市場佔有率有一定影響。

蒂阿茲的亮點之一,配備四輪獨立懸架,並採用了一部分鋁合金輕質材料,配合18寸輪圈,對視覺及操控有一定幫助。

搭載carlife系統 安全配置充足

為滿足80/90後主流消費群體的需求,蒂阿茲配備Carlife系統及9英寸觸控屏,並對NVH作出針對性的研發。

此外GpS導航、360°全景環視,自動感應大燈,感應雨刮,自動泊車輔助等豪華配置外,還增配了ABS+EBD+BA剎車輔助,胎壓監測、等安全配置都能在蒂阿茲上找到,重視安全值得肯定。

親民豪車 符合市場需求

伴隨SUV銷量持續井噴,開發迎合消費者需求的親民豪車無可厚非。華晨華瑞乘用車公司副總經理魏東表示:蒂阿茲作為華晨華瑞品牌力提升的旗艦車型,有望躋身自主品牌SUV主流陣營。在競爭激烈的中國自主品牌汽車市場,蒂阿茲將以“親民豪車”的姿態,樹立行業新標杆。

總結:蒂阿茲為關注SUV的購車者帶來全新選擇。安全配置豐富、空間超越同級,擁有着親民豪車的本領,可惜外觀原創度不高是一大弊端。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

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

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

※回頭車貨運收費標準

[Computer Vision]Harris角點檢測的詳細推導

Harris角點檢測

思想

為什麼要檢測角點呢?因為角點的特徵比較明顯。進行角點檢測的樸素思想是利用圖像梯度,也就是根據圖像強度的變化來尋找角點。如圖所示

這裏舉了個例子,給定一個小的區域(Patch),當這個小區域在不同位置滑動的時候,所呈現出來的一些特性是不同的,根據圖示,有三個方面。

  • Flat,平的地方,在任何方向,梯度都沒什麼變化。
  • Edge,邊的地方,當沿着邊方向的時候,梯度沒什麼變化。
  • Corner,角的地方,沿着任何方向,梯度都有變化。

Error Function

\[E(u,v)=\sum_{x,y}{w(x,y)[I(x+u,y+v)-I(x,y)]^2} \]

  • \(x,y\)是相對於一個小patch來說的,例如一個5*5的區域
  • \((u,v)\)是一個很小的移動量
  • \(w(x,y)\)是windows function,也就是對於每個點的權重,例如想讓中心的點權重高,可以用高斯核,一般就是全1或者高斯。
  • \(I(x,y)\)就代表圖像在\((x,y)\)的強度值。
  • 後面做差其實就是類似求梯度一樣

根據之前的討論,在一個patch里,如果有角點的存在,各個方向的梯度值都很大,於是乎,我們的目標是讓\(E(u,v)\)盡可能的大。
因為\((u,v)\)的值很小,所以我們可以利用二元函數的泰勒展開,來近似計算。
二元函數的泰勒展開,當然扔掉了一些項。

\[f(x+u,y+v) \approx f(x,y)+uf_x(x,y)+vf_y(x,y) \]

那麼我們對Error function中的關鍵部分進行展開

\[\begin{aligned} [I(x+u,y+v)-I(x,y)]^2 &\approx [I(x,y)+uI_x+vI_y-I(x,y)]\\ &=(uI_x+vI_y)^2\\ &=[u,v] \begin{bmatrix} I_x^2 &I_xI_y\\ I_xI_y&I_y^2 \end{bmatrix} \begin{bmatrix} u\\v \end{bmatrix} \end{aligned} \]

所以Error Function可以近似為

\[E(u,v)\approx [u,v]M\begin{bmatrix} u\\v \end{bmatrix} \]

\[M= \sum_{x,y}{w(x,y) \begin{bmatrix} I_x^2 &I_xI_y\\ I_xI_y&I_y^2 \end{bmatrix} } \]

這就涉及到線性代數里的二次型問題了。

簡單的二次型

例如 \(f(x,y) = x^2+y^2\)的可以寫作矩陣的形式

\[[x,y]\begin{bmatrix} 1 & 0\\ 0 & 1 \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix} \]

由中間這個矩陣來決定這個二次型的形狀,因為我們研究的二次型只有兩個變量,所以可以可視化來理解如下圖所示。對形狀矩陣可以進行特徵分解,分為中間的對角陣(對角線都是特徵值)兩邊是特徵向量。特徵向量代表了橢圓切片的長短軸的方向,而特徵值平方根的倒數代表了軸的長短。至於為什麼分解完會和橢圓對應,線性代數書上會有。

這樣就把Error Function給可視化了,有了幾何含義,更加直觀了。

  • Flat的時候,\((u,v)\)往哪個方向變化都不大,反應在幾何上,應該是一個較為平坦的面
  • Edge的時候,\((u,v)\)往某個方向變化大,反應在幾何上,應該是某個方向翹起。
  • Corner的時候,\((u,v)\)往大部分方向變化都大,反應在幾何上,應該是大部分方向都翹起。

如圖所示

我們可以通過兩個特徵值之間的大小關係,以及他們自身的關係來作為評估的依據。

當兩個特徵值都很大,且差不多時,意味着角點。

角點響應的度量

以上分析了,要兩個特徵值都很大,且同時大,那怎麼來度量?於是乎在最原始的論文里,這樣定義了響應函數,並且對不同的\(\lambda\)有以下的響應圖

\[R = det(M)-k(trace(M))^2\\ det(M) = \lambda_1\lambda_2\\ trace(M) = \lambda_1+\lambda_2 \]

\(k\)一般在是0.04-0.06

如圖所示,黃色的線是等值線,代表\(R\)的值都相同,左上角是\((0,0)\)點,往右下角去\(R\)的值越大,代表角點的響應越高,圖中畫了個綠線,右側的R值基本可以判斷為是角點了。另外還有一些別的響應函數,基本大同小異吧。

算法

所以現在經過以上的分析,總結一下角點檢測的算法步驟。

  1. 計算整個圖像的梯度值\(I_x,I_y\)
  2. 對於每個像素的\(I_{x^2}=I_xI_x,I_{y^2}=I_yI_y,I_{xy}=I_xI_y\)
  3. 計算每一個像素窗口的和,意思就是對於一個像素,定義一個領域例如5*5,就和之前提及的那樣,然後計算這個鄰域裏面所有第二步計算出來的值的和。\(S_{x^2}=G_{\sigma}*I_{x^2},S_{y^2}=G_{\sigma}*I_{y^2},S_{xy}=G_{\sigma}*I_{xy}\)
  4. 對於每個點\((x,y)\),定義矩陣\(\begin{bmatrix}S_{x^2}&S_{xy}\\S_{xy}&S_{y^2}\end{bmatrix}\)
  5. 對於每個點,計算響應值\(R=Det(H)-k(Trace(H))^2\)
  6. \(R\)設定閾值,並且計算非極大值抑制(nonmax suppression, NMS),這個的意思應該就是比如5*5的鄰域內有好幾個點通過了閾值的篩選,那麼選擇最大的那個,抑制其他的點。

一些特性

  • Harris角點響應具有旋轉不變性,因為旋轉不會改變特徵值的大小。
  • Harris角點響應對強度變化具有一定的不變性,縮放或者平移。因為經過縮放或者平移,最大值還是最大值,但是閾值可能要改改。
  • Harris角點響應不對尺度有不變性,改變尺度可能會改變檢測的結果。可能在某一尺度下檢測出為角點,而另一尺度檢測出為邊緣。

參考

  • [1]CSE486 PSU http://www.cse.psu.edu/~rtc12/CSE486/
  • [2]16-385 CMU 5http://www.cs.cmu.edu/~16385/

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

【其他文章推薦】

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

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

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

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

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

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

線程池運用不當的一次線上事故

在高併發、異步化等場景,線程池的運用可以說無處不在。線程池從本質上來講,即通過空間換取時間,因為線程的創建和銷毀都是要消耗資源和時間的,對於大量使用線程的場景,使用池化管理可以延遲線程的銷毀,大大提高單個線程的復用能力,進一步提升整體性能。

今天遇到了一個比較典型的線上問題,剛好和線程池有關,另外涉及到死鎖、jstack命令的使用、JDK不同線程池的適合場景等知識點,同時整個調查思路可以借鑒,特此記錄和分享一下。

01 業務背景描述

該線上問題發生在廣告系統的核心扣費服務,首先簡單交代下大致的業務流程,方便理解問題。

綠框部分即扣費服務在廣告召回扣費流程中所處的位置,簡單理解:當用戶點擊一個廣告后,會從C端發起一次實時扣費請求(CPC,按點擊扣費模式),扣費服務則承接了該動作的核心業務邏輯:包括執行反作弊策略、創建扣費記錄、click日誌埋點等。

02 問題現象和業務影響

12月2號晚上11點左右,我們收到了一個線上告警通知:扣費服務的線程池任務隊列大小遠遠超出了設定閾值,而且隊列大小隨着時間推移還在持續變大。詳細告警內容如下:

相應的,我們的廣告指標:點擊數、收入等也出現了非常明顯的下滑,幾乎同時發出了業務告警通知。其中,點擊數指標對應的曲線表現如下:

該線上故障發生在流量高峰期,持續了將近30分鐘后才恢復正常。

03 問題調查和事故解決過程

下面詳細說下整個事故的調查和分析過程。

第1步:收到線程池任務隊列的告警后,我們第一時間查看了扣費服務各個維度的實時數據:包括服務調用量、超時量、錯誤日誌、JVM監控,均未發現異常。

第2步:然後進一步排查了扣費服務依賴的存儲資源(mysql、redis、mq),外部服務,發現了事故期間存在大量的數據庫慢查詢。

上述慢查詢來自於事故期間一個剛上線的大數據抽取任務,從扣費服務的mysql數據庫中大批量併發抽取數據到hive表。因為扣費流程也涉及到寫mysql,猜測這個時候mysql的所有讀寫性能都受到了影響,果然進一步發現insert操作的耗時也遠遠大於正常時期。

第3步:我們猜測數據庫慢查詢影響了扣費流程的性能,從而造成了任務隊列的積壓,所以決定立馬暫定大數據抽取任務。但是很奇怪:停止抽取任務后,數據庫的insert性能恢復到正常水平了,但是阻塞隊列大小仍然還在持續增大,告警並未消失。

第4步:考慮廣告收入還在持續大幅度下跌,進一步分析代碼需要比較長的時間,所以決定立即重啟服務看看有沒有效果。為了保留事故現場,我們保留了一台服務器未做重啟,只是把這台機器從服務管理平台摘掉了,這樣它不會接收到新的扣費請求。

果然重啟服務的殺手鐧很管用,各項業務指標都恢復正常了,告警也沒有再出現。至此,整個線上故障得到解決,持續了大概30分鐘。

04 問題根本原因的分析過程

下面再詳細說下事故根本原因的分析過程。

第1步:第二天上班后,我們猜測那台保留了事故現場的服務器,隊列中積壓的任務應該都被線程池處理掉了,所以嘗試把這台服務器再次掛載上去驗證下我們的猜測,結果和預期完全相反,積壓的任務仍然都在,而且隨着新請求進來,系統告警立刻再次出現了,所以又馬上把這台服務器摘了下來。

第2步:線程池積壓的幾千個任務,經過1個晚上都沒被線程池處理掉,我們猜測應該存在死鎖情況。所以打算通過jstack命令dump線程快照做下詳細分析。

#找到扣費服務的進程號
$ ps aux|grep "adclick"

# 通過進程號dump線程快照,輸出到文件中
$ jstack pid > /tmp/stack.txth

在jstack的日誌文件中,立馬發現了:用於扣費的業務線程池的所有線程都處於waiting狀態,線程全部卡在了截圖中紅框部分對應的代碼行上,這行代碼調用了countDownLatch的await()方法,即等待計數器變為0后釋放共享鎖。

第3步:找到上述異常后,距離找到根本原因就很接近了,我們回到代碼中繼續調查,首先看了下業務代碼中使用了newFixedThreadPool線程池,核心線程數設置為25。針對newFixedThreadPool,JDK文檔的說明如下:

創建一個可重用固定線程數的線程池,以共享的無界隊列方式來運行這些線程。如果在所有線程處於活躍狀態時提交新任務,則在有可用線程之前,新任務將在隊列中等待。

關於newFixedThreadPool,核心包括兩點:

1、最大線程數 = 核心線程數,當所有核心線程都在處理任務時,新進來的任務會提交到任務隊列中等待;

2、使用了無界隊列:提交給線程池的任務隊列是不限制大小的,如果任務被阻塞或者處理變慢,那麼顯然隊列會越來越大。

所以,進一步結論是:核心線程全部死鎖,新進的任務不對湧入無界隊列,導致任務隊列不斷增加。

第4步:到底是什麼原因導致的死鎖,我們再次回到jstack日誌文件中提示的那行代碼做進一步分析。下面是我簡化過後的示例代碼:

/*** 執行扣費任務 */
public Result<Integer> executeDeduct(ChargeInputDTO chargeInput) {  
    ChargeTask chargeTask = new ChargeTask(chargeInput);  
    bizThreadPool.execute(() -> chargeTaskBll.execute(chargeTask ));  
    return Result.success();
}

/*** 扣費任務的具體業務邏輯 */
public class ChargeTaskBll implements Runnable {  
    public void execute(ChargeTask chargeTask) {     
        // 第一步:參數校驗     
        verifyInputParam(chargeTask);     

        // 第二步:執行反作弊子任務     
        executeUserSpam(SpamHelper.userConfigs);     

        // 第三步:執行扣費     
        handlePay(chargeTask);     

        // 其他步驟:點擊埋點等     ...  
    }
}

/*** 執行反作弊子任務 */
public void executeUserSpam(List<SpamUserConfigDO> configs) {  
    if (CollectionUtils.isEmpty(configs)) {     
        return;  
    }  try {    
        CountDownLatch latch = new CountDownLatch(configs.size());    
        for (SpamUserConfigDO config : configs) {      
           UserSpamTask task = new UserSpamTask(config,latch);      
           bizThreadPool.execute(task);    
        }    
        latch.await();  
    } catch (Exception ex) {    
        logger.error("", ex);  
    }
}

通過上述代碼,大家能否發現死鎖是怎麼發生的呢?根本原因在於:一次扣費行為屬於父任務,同時它又包含了多次子任務:子任務用於并行執行反作弊策略,而父任務和子任務使用的是同一個業務線程池。當線程池中全部都是執行中的父任務時,並且所有父任務都存在子任務未執行完,這樣就會發生死鎖。下面通過1張圖再來直觀地看下死鎖的情況:

假設核心線程數是2,目前正在執行扣費父任務1和2。另外,反作弊子任務1執行完了,反作弊子任務2和4都積壓在任務隊列中等待被調度。因為反作弊子任務2和4沒執行完,所以扣費父任務1和2都不可能執行完成,這樣就發生了死鎖,核心線程永遠不可能釋放,從而造成任務隊列不斷增大,直到程序OOM crash。

死鎖原因清楚后,還有個疑問:上述代碼在線上運行很長時間了,為什麼現在才暴露出問題呢?另外跟數據庫慢查詢到底有沒有直接關聯呢?

暫時我們還沒有復現證實,但是可以推斷出:上述代碼一定存在死鎖的概率,尤其在高併發或者任務處理變慢的情況下,概率會大大增加。數據庫慢查詢應該就是導致此次事故出現的導火索。

05 解決方案

弄清楚根本原因后,最簡單的解決方案就是:增加一個新的業務線程池,用來隔離父子任務,現有的線程池只用來處理扣費任務,新的線程池用來處理反作弊任務。這樣就可以徹底避免死鎖的情況了。

06 問題總結

回顧事故的解決過程以及扣費的技術方案,存在以下幾點待繼續優化:

1、使用固定線程數的線程池存在OOM風險,在阿里巴巴Java開發手冊中也明確指出,而且用的詞是『不允許』使用Executors創建線程池。 而是通過ThreadPoolExecutor去創建,這樣讓寫的同學能更加明確線程池的運行規則和核心參數設置,規避資源耗盡的風險。

2、廣告的扣費場景是一個異步過程,通過線程池或者MQ來實現異步化處理都是可選的方案。另外,極個別的點擊請求丟失不扣費從業務上是允許的,但是大批量的請求丟棄不處理且沒有補償方案是不允許的。後續採用有界隊列后,拒絕策略可以考慮發送MQ做重試處理。— 結束 —

– End –

作者簡介:程序員,985碩士,前亞馬遜Java工程師,現58轉轉技術總監。持續分享技術和管理方向的文章。如果感興趣,可微信掃描下面的二維碼關注我的公眾號:『IT人的職場進階』

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

【其他文章推薦】

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

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

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

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

※回頭車貨運收費標準

0基礎學算法 第七彈 位運算

  今天要講的內容主要分為兩個大塊,一個呢就是位運算,另一個呢就是關於二進制的原碼反碼補碼,位運算的應用也算是比較多的了,進行位運算有時候可以省略不少事情呢,當然,也不是說不會位運算就會天崩地裂,畢竟事實上,在學位運算之前,我都是用其他方法來強制性模擬位運算(當時我並不知道什麼是位運算)不過多學一些也是好的,省事兒,而且更快

  一,二進制的原碼反碼和補碼

  相信二進制沒有人不熟悉的,逢二進一,一個二進制數由0和1組成,他的最高位就是他的正負符號,0是正數,1是負數,例如10001000,這就是一個負的二進制數,當然最高位是0就是正數

  原碼之所以叫做原碼,必然是因為它就像是萬物之源,補碼、反碼都是在他的基礎上變化的,當最高位是0的時候,也就是正數的時候,原碼==反碼==補碼

  以下關於反碼及補碼的概念是基於最高位是1的情況(負數的情況)

  反碼,顧名思義,是原碼顛倒過來的樣子,除了最高位表示負號的那個“1”不變以外,其他的數位上的數  全部取反,1變0,0變1,假設原碼為1001010100,它的反碼就是1110101011,再假設原碼是0111001,它的反碼就是0111001,是不是有點奇怪,哈,我前面說過了,當原碼是正數的時候,原碼==反碼==補碼

  補碼,在原碼是正數的情況下是等於原碼或者反碼的,但是在負數情況下,他恰好是反碼加1,比如原碼是100000,反碼就是111111,補碼就是1000000

  二,進入正題,位運算

  在系統的講位運算之前,先給大家一張圖表,方便大家查詢

  

   註明:位運算符號在c++中用法同算數運算符

  首先是&

  其實位運算不複雜,理解了就好,比如說&,把他理解成1代表true,2代表false,1&&2,明顯為false(2),2&&2明顯也為false(2),只有1&&1的時候才為true(1);

  但是這是if語句裏面的判斷方法,而‘&’的運算方法是這樣的,比如1010&0011,運算過程如下圖

  過程如右圖

  至於|的話。。。就是上下兩個數只要有一個為1,結果就為1啦,如1100|0011=1111

  ‘~’!也比較好理解,做它的運算的時候,只需要傳一個二進制數,針對每一位進行運算可以從在每一位上如~1001=0110;

  ^,亦或,算起來也比較簡單,只要兩位不相等,結果就為1,舉例,1001^0101=1100

我覺得有圖就不用我多講了吧/狗頭/滑稽

   最後一組”<<“和”>>”這個是左移和右移的操作

  請看

  int類型的二進制是32位的,而long long是64位,左移和右移

  例如,給出一個標準的32的int類型00000000000000000000000000000001,當我們使用左移的時候,整體忘左移,並在後面補零

右移也相似,只不過是低位被擠掉了,高位補0

 

 

  有一道題,可以通過位運算做的很簡便,但如果你不會位運算的話。。。就另當別論了

  如果你不用位運算,你要寫很複雜的代碼,但是用了,你就只要10行代碼,如假包換(雖然我絕對不換)

  題目鏈接→https://www.luogu.com.cn/problem/P1100

   看到題目,很清晰了,首先錄入兩個字符串,然後將它轉成二進制,接着把前16位和后16位的數交換位置,最後結果轉成十進制輸出!好,完美。。。

  停!

 今天利用我們學的位運算壓根不用這麼麻煩!

  直接用上我們的左移”<<“和右移”>>”啊!

  只要左移后16位,右移前16位不就好了?

  廢話不多說,大家請看最短代碼!

#include<bits/stdc++.h>
using namespace std;
unsigned int x;
int main(){
    cin>>x;//錄入x
    cout<<((x<<16)|(x>>16));//將左移16位后的x和右移16位的x用或"|"將他們重新連起來
    return 0;//完美
}

  完美撒花

  如果覺得我講的不錯的,麻煩點個關注,點個贊,以後還會持續更新的

ps:歡迎大家進群 群號:1031457671

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

【其他文章推薦】

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

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

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

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

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

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

Python流程控制語句詳解

1.程序結構

計算機在解決問題時,分別是順序執行所有語句、選擇執行部分語句、循環執行部分語句,分別是:順序結構、選擇結構、循環結構。如下圖:

2.選擇語句

  2.1最簡單的if語句

  Python使用保留字if來組成選擇語句,其格式如下:

if 表達式:
   代碼塊

  表達式可以是一個單純的布爾值或者變量,也可以是比較表達式或者邏輯表達式,如果表達式值為真,則執行“代碼塊”;如果值為假,就跳過“代碼塊”,執行後面語句,如圖

  

   注:1.在Python中,當表達式的值為非零的數或者非空的字符串時,if語句也認為是條件成立(即為真值)。

··     2.使用if語句時,如果只有一條語句,那麼語句塊可以直接寫到冒號“:”的右側。但為了代碼可讀性不建議這麼做。

     3.常見錯誤: 

1.if語句後面未加冒號
number = 3
if number == 3   #後面未加冒號,正確的是結尾處添加英文半角的冒號:if number == 3:
    print(number)
2.使用if語句時,如果在符合條件時,需要執行多個語句,一定要記得按照邏輯順序進行代碼縮進,否則程序的本意會有變化,但程序不會報錯,且bug不容易發現。
代碼1:
number = 3
if number == 3:
  print(number)
print('這個是5')
代碼2:
number = 3
if number == 3:
  print(number)
  print('這個是5'

  2.2.if  …… else 語句

  Python中提供 if …else 語句來解決兩個選擇問題,其格式如下:

if 表達式:
    語句塊1
else:
    語句塊2

  使用 if …else 語句時,表達式可以是一個單純的布爾值或者變量,也可以是比較表達式或者邏輯表達式,如果表達式值為真,則執行“代碼塊”;如果值為假,執行else後面的代碼塊。如圖所示:

  

  技巧:

if…else額語句可以使用條件表達式進行簡化,如下:
a = 5
if a > 0:
    b = a
else:
    b = -a
print(b)

簡化:
a = 5
b = a if a > 0 else -a
print(b)

  注:1. 在使用else 語句時,else一定不可以單獨使用,它必須和保留字if一起搭配使用。

    2.程序中使用if…else 語句時,如果出現多個if 語句多餘else語句的情況,那麼該else語句將會根據確定該else 語句屬於哪個if語句。

  2.3.if…elif…else語句

  在開發程序時遇到多選一的情況,則可以使用if …elif…else語句,具體情況如下:

if 表達式1:
    語句塊1
elif 表達式2:
    語句塊2
elif 表達式3:
    語句塊3
…
else:
    語句塊n

  使用 if …elif…else 語句時,表達式可以是一個單純的布爾值或者變量,也可以是比較表達式或者邏輯表達式,如果表達式值為真,則執行語句;如果值為假,則跳過該執行語句,進行下一個elif判斷,只有表達式全部為假的情況下,執行else後面的代碼塊。如圖所示:

   注:1. if 和 elif 都需要判斷表達式的真假,而 else 則不需要判斷;另外 elif 和 elif 都需要跟 if 一起使用,不能單獨使用。

     2. 使用if語句時盡量避免遵循以下原則:

(1).當使用布爾類型的變量作為判斷條件時,假設布爾類型變量為flag,較為規範格式;
if flag:   #表示為真
if not flag #表示為假
不符合規範格式:
if flag == True:
if flag == False:
(2).使用 " if 1 == a: " 這樣的書寫格式可以防止錯寫成 " if  a = 1: "這種形式,從而避免出錯 

  2.4 if 語句的嵌套

  前面已經介紹了3種形式的 if 語句,這三種都可以進行相互嵌套:

  (1) . 在最簡單的if語句中嵌套 if……else語句,形式如下:

if 表達式1: if 表達式2: 語句塊1 else: 語句塊2

  (2). 在if……else中嵌套if……else語句,形式如下:

if 表達式1:
    if 表達式2:
        語句塊1
    else:
        語句塊2
else:
    if 表達式3:
        語句塊3
    else:
        語句塊4

  注:if 選擇語句可以有多種嵌套方式,開發時可以可以根據自身的需要進行選擇合適的嵌套方式,但一定要嚴格控制好不同級別代碼的縮進量。

3.條件表達式

  在程序開發過程中,經常會根據表達式的結果,有條件的進行賦值,例如返回最大值:

a = 6
b = 3
if a > b:
    c = a
else:
    c = b

  針對以上代碼,使用條件表達式進行簡化,如下:

a = 6
b = 3
c = a if a > b else b

4.循環語句

  4.1 while 循環

  while循環是通過一個條件來控制是否要繼續反覆執行循環體(循環體是指一組被重複執行的語句)中的語句。

while 條件表達式:
    循環體

  當條件表達式的返回值為真時,則執行循環體中的語句,執行完畢后,重新判斷條件表達式的返回值,直到表達式返回的結果為假是退出循環體。

  

   注:在使用while循環語句時,一定不要忘記添加將循環條件改變為Flase的代碼,否則,將產生死循環。但開發中也離不開死循環,可根據情況進行編寫。

   4.2. for循環

  for 循環是一個依次重複執行的循環,通常適用於枚舉、遍歷序列和對象中的元素。語法如下:

for 迭代變量 in 可迭代對象:
    循環體

  迭代變量用於保存讀除的值,對象為遍歷或迭代的對象,該對象可以是任何有序的序列對象,如字符串,列表,元組等,循環體為一組被重複執行的語句。

  

  for循環語句可以最基本的應用就是進行數值循環和遍歷字符串。還可以進行遍歷列表、元組、集合和字典。

  4.3. 循環嵌套

  在Python中,是允許在一個循環體中嵌套另一個循環。

  (1). 在while循環中嵌套while循環

while 條件表達式1:
    while 條件表達式2:
        循環體2
    循環體1

  (2). 在for 循環中嵌套 for 循環

for 迭代變量1 in 對象1:
    for 迭代變量2 in 對象2:
        循環體2
    循環體1

  (3). 在while 循環中嵌套 for 循環

while 條件表達式:
    for 迭代變量 in 對象:
        循環體2
    循環體1

  (4). 在 for 循環中嵌套 while 循環

for 迭代變量 in 對象:
    while 條件表達式:
        循環體2
    循環體1

  特殊案例:九九乘法表

for i in range(0,10):
    for j in range(1,i+1):
        print(str(j) + "*"  + str(i) + "=" + str(i * j) +"\t" ,end = " "
    print("")

5.跳轉語句

  當循環滿足一定條件時,程序會一直執行下去,如果需要在中間離開循環,也就是for循環結束重複之前,或者while循環找到結束條件之前,即break語句和continue語句。

  5.1 break語句

  break可以終止當前循環,包括for循環和while循環在內的所有控制語句。

  在while中使用break語句:

 

while 條件表達式1:
    執行語句
    if 條件表達式2:
        break

  在for 中使用break語句

for 迭代變量 in 對象:
    if 條件表達式:
        break

  

           while語句使用break                                                             for語句中使用break

  5.2.continue語句

  continue語句的作用沒有break語句強大,他只能終止本次循環而提前進入下次循環中。

  在while中使用continue語句

while 條件表達式1:
    執行代碼
    if 條件表達式2:
        continue

  在for 中使用continue語句

for 迭代變量 in 對象:
    if 條件表達式:
        continue

         

            while語句使用continue                                                     for語句中使用continue

  注:break與continue的區別

    break語句一般會結合if 語句進行搭配使用,表示在某種條件下,跳出循環。如果使用嵌套循環,break語句將跳出最內層循環。

    continue語句一般也會結合if語句進行搭配使用,表示在某種條件下,跳出當前循環的剩下語句,繼續進行下一輪循環,如果使用嵌套循環,continue語句將只跳過最內層循環中剩餘語句。

6.pass語句

  在Python中pass語句表示空語句,它不做任何事情,一般起到站位作用,常用在代碼調試等。

#例:
for i in range(1,10):    #輸出1~10的數不包含10
    if i % 2 == 0:         #判斷是否是偶數   
        print(i,end="")     #在同一行打印偶數 
    else:                      #不是偶數
        pass                    #佔位符,不做任何事情,直接跳過

#輸出結果為:
2 4 6 8

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

【其他文章推薦】

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

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

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

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

※回頭車貨運收費標準

這不是紀念品!法遊客欲帶走1.8公斤沙子 挨罰逾3萬

摘錄自2020年9月8日自由時報報導

法國1名遊客日前疑將4磅重(約1.8公斤)的當地海灘沙子裝在行李中的瓶子,試圖帶離薩丁尼亞島,被查獲後於卡利亞里埃爾馬斯機場被捕,據稱被罰1000歐元(約新台幣3萬4558元)。

《CNN》報導,薩丁尼亞島2017年起規定,從島上取沙屬非法行為,若帶走恐面臨罰款甚至入獄。當地森林保護員發言人表示,該遊客裝紗的瓶子已沒收,並指祭出罰則是因類似情形層出不窮,尤其是針對粉紅、白色等顏色特殊的沙子。據稱,有網站將島上沙子作為紀念品出售。

報導指出,該發言人提及,罰金落在500至3000歐元(約新台幣1萬7275至10萬3649元)區間,視取走來源與數量決定,過去3年,管制、裁罰變得更加嚴格。除了會與警方合作,也接受民眾檢舉。

海洋
環境新聞
國際新聞
法國
海灘
保護海洋

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

【其他文章推薦】

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

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

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

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

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

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

餐桌上的減碳計畫:智庫研究改善糧食系統 可實現2050年減碳目標20%

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

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

【其他文章推薦】

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

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

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

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

※回頭車貨運收費標準