Telegraf和Grafana監控多平台上的SQL Server_如何寫文案

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

問題

SQL Server在很多企業中部署在多個平台上(Windows,Linux和Container),需要一種能支持多平台的解決方案用於收集和展示相關的監控指標。

我選擇企業中比較流行的監控展示工具Grafana和監控指標收集工具Telegraf進行實現。這也是為了方便與企業中已經在存在監控平台進行整合和對接。

如上圖所示,Telegraf部署在SQL所在host,收集數據發送給時序數據庫Influxdb存儲,然後Grafana用於展示數據。

解決方案

  • 安裝和配置InfluxDB

我將InfluxDB和Grafana安裝在同一台CentOS主機上,生產環境中最好是分開。

# 下載1.8的stable version後進行安裝
wget https://dl.influxdata.com/influxdb/releases/influxdb-1.8.0.x86_64.rpm
chmod 755 influxdb-1.8.0.x86_64.rpm
yum localinstall influxdb-1.8.0.x86_64.rpm

# 啟動並設置自啟動
systemctl start influxdb
systemctl enable influxdb

# 8086用於客戶端的HTTP連接,8088用於CLI調用RPC進行備份和還原操作
firewall-cmd --zone=public --add-port=8086/tcp --permanent
firewall-cmd --zone=public --add-port=8088/tcp --permanent
firewall-cmd --reload

# 連接到influxdb並創建用戶
fluxdb
> CREATE USER admin WITH PASSWORD '<password>' WITH ALL PRIVILEGES

# 啟用http用戶驗證,修改influxdb.conf中http section中auth-enabled = true
vim /etc/influxdb/influxdb.conf
systemctl restart influxdb

# 創建用於存儲監控數據的數據庫,保存6個月的數據
influx -username 'admin' -password '<password>'
> CREATE DATABASE telegraf
> CREATE RETENTION POLICY telegraf_6m ON telegraf DURATION 180d REPLICATION 1 DEFAULT
> SHOW DATABASES
  • 安裝和配置Grafana

# 下載並安裝Grafana
wget https://dl.grafana.com/oss/release/grafana-7.0.1-1.x86_64.rpm
chmod 775 grafana-7.0.1-1.x86_64.rpm
yum localinstall grafana-7.0.1-1.x86_64.rpm

# 設置自啟動
systemctl start grafana-server.service
systemctl enable grafana-server.service

# 允許Grafana默認的端口3000
firewall-cmd --zone=public --add-port=3000/tcp --permanent
firewall-cmd --reload

然後在Browser中訪問http:// :3000,第一次訪問時默登錄認賬號和密碼都為admin,登錄後會提示修改密碼。

  • 在客戶端主機安裝和配置Telegraf

所謂客戶端,就是SQL所在主機

Telegraf連接到SQL,需要一個login,具有 VIEW SERVER STATE and VIEW ANY DEFINITION的權限,所以在每個被監控的實例上都需要創建之。

USE master;
GO
CREATE LOGIN [telegraf] WITH PASSWORD = N'1qaz@WSX';
GO
GRANT VIEW SERVER STATE TO [telegraf];
GO
GRANT VIEW ANY DEFINITION TO [telegraf];
GO
  • Telegraf on Linux
wget https://dl.influxdata.com/telegraf/releases/telegraf-1.14.3-1.x86_64.rpm
sudo yum localinstall telegraf-1.14.3-1.x86_64.rpm 

安裝完成后,先要修改Telegraf的配置文件,再啟動。在配置文件中主要配置兩個部分:inputs和outputs。 inputs表示監控數據從哪裡來,outputs表示監控要發送到哪裡去。

打開/etc/telegraf/telegraf.conf,找到[[outputs.influxdb]]部分,所有配置項默認都被註釋了。我們需要刪除註釋並配置一些項。主要是Influxdb的地址,用戶名、密碼和數據庫名等。

[[outputs.influxdb]]
  ## The full HTTP or UDP URL for your InfluxDB instance.
  ##
  ## Multiple URLs can be specified for a single cluster, only ONE of the
  ## urls will be written to each interval.
  # urls = ["unix:///var/run/influxdb.sock"]
  # urls = ["udp://127.0.0.1:8089"]
  urls = ["http://172.17.2.4:8086"]

  ## The target database for metrics; will be created as needed.
  ## For UDP url endpoint database needs to be configured on server side.
  database = "telegraf"

  ## The value of this tag will be used to determine the database.  If this
  ## tag is not set the 'database' option is used as the default.
  # database_tag = ""

  ## If true, the 'database_tag' will not be included in the written metric.
  # exclude_database_tag = false

  ## If true, no CREATE DATABASE queries will be sent.  Set to true when using
  ## Telegraf with a user without permissions to create databases or when the
  ## database already exists.
  skip_database_creation = true

  ## Name of existing retention policy to write to.  Empty string writes to
  ## the default retention policy.  Only takes effect when using HTTP.
  retention_policy = ""

  ## The value of this tag will be used to determine the retention policy.  If this
  ## tag is not set the 'retention_policy' option is used as the default.
  # retention_policy_tag = ""

  ## If true, the 'retention_policy_tag' will not be included in the written metric.
  # exclude_retention_policy_tag = false

  ## Write consistency (clusters only), can be: "any", "one", "quorum", "all".
  ## Only takes effect when using HTTP.
  write_consistency = "any"

  ## Timeout for HTTP messages.
  timeout = "5s"

  ## HTTP Basic Auth
  username = "admin"
  password = "<password>"
  • 找到[[inputs.sqlserver]]部分,取消相關配置項的註釋,servers部分連接到本地實例。

Telegraf默認的Plugin中包括了對SQL Server的實現, 這個Plugin還包括了對Azure SQL PaaS的實現

# # Read metrics from Microsoft SQL Server
 [[inputs.sqlserver]]
#   ## Specify instances to monitor with a list of connection strings.
#   ## All connection parameters are optional.
#   ## By default, the host is localhost, listening on default port, TCP 1433.
#   ##   for Windows, the user is the currently running AD user (SSO).
#   ##   See https://github.com/denisenkom/go-mssqldb for detailed connection
#   ##   parameters, in particular, tls connections can be created like so:
#   ##   "encrypt=true;certificate=<cert>;hostNameInCertificate=<SqlServer host fqdn>"
        servers = [
                        "Server=localhost;Port=1433;User Id=telegraf;Password=<yourPassword>;app name=telegraf;log=1;"
                ]
#
#   ## Optional parameter, setting this to 2 will use a new version
#   ## of the collection queries that break compatibility with the original
#   ## dashboards.
        query_version = 2
#
#   ## If you are using AzureDB, setting this to true will gather resource utilization metrics
#   # azuredb = false
#
#   ## Possible queries:
#   ## - PerformanceCounters
#   ## - WaitStatsCategorized
#   ## - DatabaseIO
#   ## - DatabaseProperties
#   ## - CPUHistory
#   ## - DatabaseSize
#   ## - DatabaseStats
#   ## - MemoryClerk
#   ## - VolumeSpace
#   ## - PerformanceMetrics
#   ## - Schedulers
#   ## - AzureDBResourceStats
#   ## - AzureDBResourceGovernance
#   ## - SqlRequests
#   ## - ServerProperties
#   ## A list of queries to include. If not specified, all the above listed queries are used.
#   # include_query = []
#
#   ## A list of queries to explicitly ignore.
#   exclude_query = [ 'Schedulers' , 'SqlRequests']

啟動Telegraf之後,可以看到時已經加載的inputs和收集間隔

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

銷售文案是什麼?A文案是廣告用的文字。舉凡任何宣傳、行銷、販賣商品時所用到的文字都是文案。在網路時代,文案成為行銷中最重要的宣傳方式,好的文案可節省大量宣傳資源,達成行銷目的。

[root@SQL19N1 log]# systemctl status telegraf      
● telegraf.service - The plugin-driven server agent for reporting metrics into InfluxDB
   Loaded: loaded (/usr/lib/systemd/system/telegraf.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2020-05-26 14:19:07 UTC; 19min ago
     Docs: https://github.com/influxdata/telegraf
 Main PID: 12359 (telegraf)
   CGroup: /system.slice/telegraf.service
           └─12359 /usr/bin/telegraf -config /etc/telegraf/telegraf.conf -config-directory /etc/telegraf/telegraf.d

May 26 14:19:07 SQL19N1 systemd[1]: Started The plugin-driven server agent for reporting metrics into InfluxDB.
May 26 14:19:07 SQL19N1 telegraf[12359]: 2020-05-26T14:19:07Z I! Starting Telegraf 1.14.3
May 26 14:19:07 SQL19N1 telegraf[12359]: 2020-05-26T14:19:07Z I! Loaded inputs: system cpu disk diskio kernel mem processes swap sqlserver
May 26 14:19:07 SQL19N1 telegraf[12359]: 2020-05-26T14:19:07Z I! Loaded aggregators:
May 26 14:19:07 SQL19N1 telegraf[12359]: 2020-05-26T14:19:07Z I! Loaded processors:
May 26 14:19:07 SQL19N1 telegraf[12359]: 2020-05-26T14:19:07Z I! Loaded outputs: influxdb
May 26 14:19:07 SQL19N1 telegraf[12359]: 2020-05-26T14:19:07Z I! Tags enabled: host=SQL19N1
May 26 14:19:07 SQL19N1 telegraf[12359]: 2020-05-26T14:19:07Z I! [agent] Config: Interval:20s, Quiet:false, Hostname:"SQL19N1", Flush Interval:10s
  • Telegraf on Windows

以管理員身份執行如下PowerShell命令

# 下載軟件
wget https://dl.influxdata.com/telegraf/releases/telegraf-1.14.3_windows_amd64.zip ·
    -OutFile "c:\temp\telegraf-1.14.3_windows_amd64.zip"

# 解壓縮到C:\Program Files\Telegraf
Expand-Archive "c:\temp\telegraf-1.14.3_windows_amd64.zip", "C:\Program Files"

# 將telegraf安裝為windows服務
C:\"Program Files"\Telegraf\telegraf.exe --service install

修改telegraf.conf中outputs.influxdb和添加inputs.sqlserver部分,這些內容和在Linux上的配置一樣,就不贅述了。

conf修改完成后,可以先測試一下telegraf是否能正常啟動,沒問題的話就啟動telegraf服務。

# 測試
C:\"Program Files"\Telegraf\telegraf.exe --config C:\"Program Files"\Telegraf\telegraf.conf --test

# 啟動服務
C:\"Program Files"\Telegraf\telegraf.exe --service start
  • 配置Grafana的數據源和Dashboard

登錄Grafana后,在左側的Configuration->Data Source中配置InfluxDB數據源,填寫地址、賬號、密碼並設置為默認數據源,如下圖

Dashboard,可以自己創建,也可以在採用公開社區的(感謝熱心無私的大佬們)。這裏,我採用SQL Servers by Jonathan Rioux。這個Dashboard中使用的Piechart不是Grafana預置的,所以還需要安裝:

# Grafana所在Host安裝,重啟服務生效
grafana-cli plugins install grafana-piechart-panel
systemctl restart grafana-server.service

然後在Grafana界面,選擇左側的Dashboard->Import->填入Dashboard ID->Import,如下圖:

配置完成后的,可以看這個Dashboard提供的信息還比較豐富的,您也可以根據自己的需要修改和添加相關內容.

總結

  • 實際情況中,自帶的數據收集和報表不能完全滿足業務需求,自定義的數據收集和自定義的Dashboard,也是非常容易實現的,下次再寫

  • 如果已經在使用Zabbix了,Grafana可以直接對接到Zabbix的數據輸出。

  • Telegraf能非常好的支持Cloud環境,下次說說對Azure SQL PaaS的監控

  • 本文內容僅代表個人觀點,與任何公司和組織無關

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

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

什麼是銷售文案服務?A就是幫你撰寫適合的廣告文案。當您需要販售商品、宣傳活動、建立個人品牌,撰寫廣告文案都是必須的工作。

15萬塊買哪些硬派SUV真的能帶你盡情越野?_如何寫文案

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

19萬陸風X8其實是小編非常喜愛的一款車型,它和哈弗H5一樣,同樣具有四驅系統,具有后差速鎖以及低速四驅。使用2。0T加手動擋的變速箱在越野的過程中也是比較可靠,而它的2。0T發動機比哈弗H5的要更加的兇猛,動力更加強勁。

對硬派越野車和城市SUV這兩個概念可能大家並不是那麼的熟悉。也有許多的城市SUV車型那宣稱自己越能有多麼的強。那麼其實在小編看來城市SUV的越野能力始終就是有限的。如果你想購買一台越野車真的能夠帶你跋山涉水千里探險。那麼一定要選擇一台真正的硬派越野車才行。

這台越野車必須有非承載式車身,有着結實的車身懸挂也有着不錯的四驅系統,最好帶有差速鎖。離地間隙接近角和離去角也都要足夠大。最好帶有低速四驅模式。

哈弗H5

指導價:9.48-16.38萬

在哈弗H6誕生之前,哈弗H5是長城SUV的主力車型。這款有大梁有四驅有后差速鎖和分動箱,離地間隙也足夠的高,並且它的保有量十分大,月銷量到現在來看也還是比較的不錯。車內空間也能夠滿足旅遊的需求,買這個車型最大的好處就在於去到未知的地方走未知的路時會十分的有底氣,遇到泥濘坑窪碎石路等也都毫不畏懼,面對陡坡也能夠從容地爬上去,因此如果選擇這台車去越野或者旅遊的話,真的會讓人放心很多。

不過話又說回來,

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

銷售文案是什麼?A文案是廣告用的文字。舉凡任何宣傳、行銷、販賣商品時所用到的文字都是文案。在網路時代,文案成為行銷中最重要的宣傳方式,好的文案可節省大量宣傳資源,達成行銷目的。

因為是一款硬派越野車,所以它在車內噪音、乘坐的舒適性以及駕駛的操控性方面都比較的差,所以如果真的打算購買這類車型需要提前感受這個車的特點才行。

陸風X8

指導價:11.38-15.19萬

陸風X8其實是小編非常喜愛的一款車型,它和哈弗H5一樣,同樣具有四驅系統,具有后差速鎖以及低速四驅。使用2.0T加手動擋的變速箱在越野的過程中也是比較可靠,而它的2.0T發動機比哈弗H5的要更加的兇猛,動力更加強勁。

相比較哈弗來說它的銷量可就要慘淡多了。不過在不少真正需要這台車的地方還是能夠看到一些的。陸風作為國內老牌越野車的生產廠家他的越野功底也確實是不錯。如果小編要選擇一台越野車去旅遊的話,陸風X8一定是我的首選。

江鈴馭勝S350

指導價:12.28-15.98萬

江鈴馭勝S350實際上在越野的硬件指標上並不如上面兩個車,但是它在越野和公路的均衡性,以及在外觀上都要比上面兩個車要更加的,好。他使用了一套適時四驅系統。但是這套四驅系統的表現非常的聰明,以及強大的2.4T柴油發動機提供的扭矩。雖然沒有低速四驅模式,但是在爬坡的時候同樣不虛,而他最大的優勢就在於它有自動擋車型。

但是自動擋車型的價位比較高,也是一個值得關注的問題,再加一點錢就能夠買到帕傑羅勁暢這類的合資品牌的硬派SUV了。因此它的性價比也是我比較擔心的。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

什麼是銷售文案服務?A就是幫你撰寫適合的廣告文案。當您需要販售商品、宣傳活動、建立個人品牌,撰寫廣告文案都是必須的工作。

生態環境部環評司有關負責人就《關於進一步加強產業園區規劃環境影響評價工作的意見》有關問題答記者問_如何寫文案

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

什麼是銷售文案服務?A就是幫你撰寫適合的廣告文案。當您需要販售商品、宣傳活動、建立個人品牌,撰寫廣告文案都是必須的工作。

2020-11-24 來源:生態環境部

2020-11-24
來源:生態環境部 分享到:
[打印]
字號:[大] [中] [小]   近日,生態環境部印發《 關於進一步加強產業園區規劃環境影響評價工作的意見》(以下簡稱《意見》)。針對《意見》出台的背景、突出特點等問題,生態環境部環評司有關負責人回答了記者的提問。
  問:《意見》出台的背景是什麼?   
答:為適應新形勢、新要求,推進規劃環評與生態環境分區管控體系銜接、指導入園建設項目環評改革,解決目前部分產業園區管理機構主體責任不落實、規劃環評質量參差不齊等問題,進一步加強規劃環評監管,切實提升產業園區規劃環評效力,我部對《關於加強產業園區規劃環境影響評價有關工作的通知》(環發〔2011〕14號)(以下簡稱《通知》)進行修訂,形成《關於進一步加強產業園區規劃環境影響評價工作的意見》。
  問:與2011年《通知》相比,《意見》有哪些突出特點?   
答:《意見》包含六部分內容,共二十一條,與《通知》相比突出體現三個特點。一是堅持“簡”的原則,全面落實“放管服”要求。簡化了開展規劃環評的產業園區類型,探索提出了規劃環評審查與生態環境分區管控銜接的途徑,明確了入園建設項目簡化條件、簡化原則、內容和改革試點要求。二是把握“聯”的思路,統籌“三線一單”、規劃環評、項目環評和排污許可工作。把規劃環評銜接落實區域生態環境分區管控成果作為重點,保障區域“三線一單”成果落地;把規劃環評結論及審查意見採納落實作為入園建設項目環評簡化和審批的重要依據;依託產業園區規劃環評工作,強化落實排污許可證全覆蓋總體部署,優化園區內共用污染治理措施等的管理方式。三是突出“實”的效果,夯實責任、強化監管,保障規劃環評效力發揮。以改善環境質量為核心,突出規劃環評工作重點,進一步明確產業園區管理機構,規劃環評技術機構的責任。提出加強後續管理、監管和指導的具體措施,有力保障規劃環評見實效。
  問:哪些產業園區需開展規劃環評工作?   
答:《意見》提出,國務院及其有關部門、省級人民政府批准設立的經濟技術開發區、高新技術產業開發區、旅遊度假區等產業園區以及設區的市級人民政府批准設立的各類產業園區,在編製開發建設有關規劃時,應依法開展規劃環評工作,編製環境影響報告書。相比2011年《通知》,

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

銷售文案是什麼?A文案是廣告用的文字。舉凡任何宣傳、行銷、販賣商品時所用到的文字都是文案。在網路時代,文案成為行銷中最重要的宣傳方式,好的文案可節省大量宣傳資源,達成行銷目的。

沒有單獨對保稅區、保稅港區、綜合保稅區、出口加工區等海關特殊監管區等類型的園區提出開展規劃環評的要求,主要考慮這類園區功能較單一、面積較小,環境影響也相對較小,經常不單獨開展規劃,因此,鼓勵其依託所在區域其他類型的產業園區統一開展環境影響評價。
  問:《意見》中產業園區規劃環評如何與“三線一單”生態環境分區管控體系銜接?   
答:從長江經濟帶11省市及青海省“三線一單”成果看,產業園區總體上都划入了重點管控單元,相應管控要求比較明確。還有一些省份對省級及以上園區編製了生態環境准入清單,對產業園區提出了有針對性的環境准入和管控要求。規劃環評主要聚焦在對規劃產業定位、布局、規模的優化,及避免和減緩規劃環境影響的對策建議等方面。兩者在內容和評價方法上均有一定程度的重合。《意見》已明確將銜接落實區域生態環境分區管控成果作為規劃環評的審查重點。因此,為避免工作重複,更好適應“放管服”要求,對已經發布“三線一單”生態環境分區管控方案並組織實施的省份,《意見》提出,其轄區內國家級產業園區規劃環境影響報告書可由我部委託其所在省級生態環境主管部門召集審查,審查意見抄報生態環境部。具體委託工作由各省(區、市)結合實際需求制定具體方案向我部提出申請。方案應在管理制度和技術保障等方面明確規劃環評如何銜接落實區域生態環境分區管控成果,確保區域生態環境質量改善。
  問:《意見》如何指導項目環評與規劃環評聯動?   
答:一是明確產業園區規劃環評是入園建設項目的重要依據,入園建設項目環評在規劃環評高質量完成的前提下部分內容可適當簡化。二是鼓勵地方在滿足如下條件下開展國家級和省級產業園區入園建設項目環評試點改革工作:產業園區已依法完成規劃環評工作,且採納落實了規劃環評結論及審查意見;省級人民政府已經制定發布或授權制定區域環評審批負面清單、嚴格環評管理重點行業名錄等,對入園項目污染和環境風險能有效防控;產業園區環境質量穩定達標且持續改善;產業園區環境基礎設施完善、運行穩定,環境管理和風險防控體系健全且近5年內未發生重大環境事件。
  問:生態環境部將採取哪些措施保障《意見》的順利實施?   
答:為保障《意見》順利實施,我們將重點開展以下工作。一是加強宣貫和培訓,組織對地方生態環境主管部門、規劃環評編製機構、規劃編製機關、相關專家等的培訓工作。二是開展產業園區規劃環評工作的跟蹤監督工作,我部將建立健全規劃環評質量監管長效機制,定期調度產業園區規劃環評及跟蹤評價開展、落實情況;三是各級生態環境主管部門發現規劃環評編製質量問題的,可依法依規對產業園區管理機構及其委託的規劃環評技術機構予以處理。四是各級生態環境主管部門依法對已發生重大不良影響的規劃及時組織核查。五是地方各級生態環境主管部門要加強對產業園區環境質量變化情況及污染物排放情況的監管,尤其是對重污染或涉有毒有害污染物排放園區,依法開展執法監測,落實監管責任。六是進一步加強產業園區規劃環評工作技術支撐,加快推動《規劃環境影響評價技術導則 產業園區》的制定和發布,更好的規範和指導產業園區規劃環評工作。   

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

iPhone 13 最新傳聞:機身可能更厚,但瀏海會變窄一些_如何寫文案

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

銷售文案是什麼?A文案是廣告用的文字。舉凡任何宣傳、行銷、販賣商品時所用到的文字都是文案。在網路時代,文案成為行銷中最重要的宣傳方式,好的文案可節省大量宣傳資源,達成行銷目的。

離今年新 iPhone 可能發表的時間雖然還有九個月左右,但每到新的一年開始,一定會出現一些傳聞,而今年第一個 iPhone 13 傳聞稍早就正式現身,一間長期都還蠻準確的日本媒體 Mac Otakara 爆料,iPhone 13 的機身可能會變厚,不過大家最在意的瀏海,有機會再度變窄。

iPhone 13 最新傳聞

稍早日本媒體 Mac Otakara 透露從中國供應鏈獲得的最新消息,基本上 iPhone 13 的外觀與 iPhone 12 不會有太大差異,而且目前現行的四款都會有下一代,代表說雖然傳出賣不好的 iPhone 12 mini,今年還是有機會看到 iPhone 13 mini 亮相。

不過機身厚度預計會增加 0.26 mm,原因就沒有特別說明,不過個人猜測可能跟電池有關,畢竟 iPhone 12 的續航力有點不太行,特別是玩 3D 遊戲,iPhone 13 有可能會加大電池容量來改善這問題。

另外,主相機部分會跟 iPad Pro 2021 一樣,尺寸預計增加 0.9mm,Apple 預計用藍寶石玻璃包覆整個相機模組,不像 iPhone 12 鏡頭都是獨立。更值得一提的是,iPhone 13 Pro 與 iPhone 13 Pro Max 相機模組尺寸相同,意味著這兩台的相機規格有可能一樣,不像 iPhone 12 Pro 與 iPhone 12 Pro Max 有一些差異:

螢幕方面,Mac Otakara 就沒有提到大家最關心的是否有螢幕下指紋辨識,不過 TrueDepth 相機將會變得更薄,代表說 iPhone 13 的瀏海有機會變得更窄:

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

先前知名分析師郭明錤透露,今年 iPhone 13 的相機硬體不會有太大提升,但並不代表拍照能力不會有改善,畢竟還是可以透過軟體調整加強,Google 的 Pixel 系列就是很好例子。

無論如何,畢竟 2021 年才剛開始,iPhone 13 沒意外應該還沒完全定案,後面也是有可能再改變。

資料來源:Mac Otakara

販售僅兩週! 蘋果iPhone 12成為全球5G手機銷量冠軍

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

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

什麼是銷售文案服務?A就是幫你撰寫適合的廣告文案。當您需要販售商品、宣傳活動、建立個人品牌,撰寫廣告文案都是必須的工作。

萬字總結之設計模式七大原則_如何寫文案

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

什麼是銷售文案服務?A就是幫你撰寫適合的廣告文案。當您需要販售商品、宣傳活動、建立個人品牌,撰寫廣告文案都是必須的工作。

前言

上篇說了反射,將其作為框架的基礎知識。還沒看過的移至傳送門,萬字總結之反射(框架之魂)。今天我們來看設計模式。話不多說,let’s go。

什麼是設計模式?

設計模式是對軟件設計普遍存在的問題,所提出的解決方案。

與項目本身沒有關係,不管是電商,ERP,OA 等,都可以利用設計模式來解決相關問題。

當然如果這個軟件就只有一小部分人用,並且功能非常簡單,在未來可預期的時間內,不會做任何大的修改和添加,即可以不使用設計模式。但是這種的太少了,所以設計模式還是非常重要的。

為什麼要使用設計模式?

使用設計模式的最終目的是“高內聚低耦合”。

  • 代碼重用性:相同功能的代碼,不需要多次編寫
  • 代碼可讀性:編程規範性,便於其他程序員閱讀
  • 代碼可擴展性:當增加新的功能后,對原來的功能沒有影響

設計模式的七大原則

設計模式有7大原則,具體如下,即這些不僅是設計模式的依據,也是我們平常編程中應該遵守的原則。

1.單一職責原則

見名知義,我們設計的類盡量負責一項功能,如A類只負責功能A,B類只負責功能B,不要讓A類既負責功能A,又負責功能B,這樣會導致代碼混亂,容易產生bug。

未使用單一職責原則

Single類:

public class single {
    public static void main(String[] args) {
        Vehicle vehicle = new Vehicle();
        vehicle.run("汽車");
        vehicle.run("輪船");
        vehicle.run("飛機");
    }
}

 

Vehicle類:

public class Vehicle {
    void run(String type){
        System.out.println(type+"在公路上開");
    }
}

 

運行結果:

我們看下運行結果,汽車是在公路上開,但是輪船和飛機並不是在公路上。因為Vehicle類負責了不止一個功能,所以該設計是有問題的。

已使用單一職責原則

對於上面的例子,我們採用單一職責原則重寫一下,將Vehicle類拆分成三個類,分別是Car,Ship,Plane,讓他們各自負責陸地上,水上,空中的交通工具,使其互不影響。

如果我們需要對水上交通做“風級大於8級,禁止出海”的限制,就只需要對Ship類進行修改。

具體代碼如下:

single類:

public class single {
    public static void main(String[] args) {
        Car car = new Car();
        car.run("汽車");

        Ship ship=new Ship();
        ship.run("輪船");

        Plane plane=new Plane();
        plane.run("飛機");
    }
}

 

Car類:

public class Car {
    void run(String type){
        System.out.println(type+"在公路上開");
    }
}

 

Ship類:

public class Ship {
    void run(String type){
        System.out.println(type+"在水裡開");
    }
} 

 

Plane類:

public class Plane {
    void run(String type){
        System.out.println(type+"在天空開");
    }
}

 

運行結果:

優化

我們可以發現單一職責原則有點代碼太多了,顯得冗餘。畢竟我們程序員是能少寫就少寫,決不能多寫代碼。那我們對其優化下,上面每個類只有一個方法,我們可以合併為一個類,其中有三個方法,每個方法對應着在公路上,在水上,在天空中的交通工具,將單一職責原則落在方法層面,而不再是類層面,代碼如下:

single類:

public class single {
    public static void main(String[] args) {
        Vehicle vehicle = new Vehicle();
        vehicle.runOnRoad("汽車");

        vehicle.runOnWater("輪船");

        vehicle.runOnAir("飛機");
    }
}

 

Vehicle類:

 

public class Vehicle {
    void runOnRoad(String type){
        System.out.println(type+"在公路上開");
    }
    void runOnWater(String type){
        System.out.println(type+"在水裡開");
    }
    void runOnAir(String type){
        System.out.println(type+"在天空開");
    }
} 

 

運行結果:

優缺點總結

優點:

  • 降低類的複雜性,一個類只負責一個職責。
  • 提高代碼的可讀性,邏輯清楚明了。
  • 降低風險,只修改一個類,並不影響其他類的功能。

缺點:代碼量增多。(可將單一職責原則落在方法層面進行優化)

2.接口隔離原則

類不應該依賴他不需要的接口,接口盡量小顆粒劃分。

未使用接口隔離原則

People類:

public interface People {
    void exam();
    void teach();
}

 

Student類:

public class Student implements People {
    @Override
    public void exam() {
        System.out.println("學生考試");
    }

    @Override
    public void teach() {

    }
}

 

Teacher類:

public class Teacher  implements People{
    @Override
    public void exam() {

    }

    @Override
    public void teach() {
        System.out.println("教師教書");
    }
}

 

test類:

public class test {
    public static void main(String[] args){
        People student=new Student();
        student.exam();

        People teacher=new Teacher();
        teacher.teach();
    }
} 

 

運行結果:

注:此處代碼並沒有報錯,正常運行的,但是看得代碼冗餘且奇怪。Student只需要實現People的exam方法,而Teacher只需要實現People的teach方法,但是現在Student實現了People接口,就必須重寫exam和teach方法,Teacher也是如此。

已使用接口隔離原則

我們將People接口的兩個方法拆分開,分為兩個接口People1和People2,並且讓Sudent實現People1接口,Teacher實現People2接口,使其互不干擾,具體代碼如下:

People1類:

public interface People1 {
    void exam();
}

 

People2類:

public interface People2 {
    void teach();
}

 

Student類:

public class Student implements People1 {
    @Override
    public void exam() {
        System.out.println("學生考試");
    }
}

 

Teacher類:

public class Teacher  implements People2 {
    @Override
    public void teach() {
        System.out.println("教師教書");
    }
} 

 

test類:

public class test {
    public static void main(String[] args){
        People1 student=new Student();
        student.exam();

        People2 teacher=new Teacher();
        teacher.teach();
    }
}

 

運行結果:

總結

言歸正傳,如果將多個方法合併為一個接口,再提供給其他系統使用的時候,就必須實現該接口的所有方法,那有些方法是根本不需要的,造成使用者的混淆。

3.依賴倒轉原則

高層模塊不應該依賴底層模塊,二者都應該依賴接口或抽象類。

其核心就是面向接口編程。

依賴倒轉原則主要基於如下的設計理念:相對於細節的多變性,抽象的東西要穩定的多,以抽象為基礎搭建的架構比以細節為基礎的架構要穩定的多。

抽象指接口或抽象類,細節指具體的實現類。

這樣講太乾澀,照搬宣科,沒有靈魂,說了等於沒說。接下來我們用例子來說明。

未使用依賴倒轉原則

由於現在是特殊時期,我們先來一個買菜的例子。如下是傻白甜的例子,未使用到依賴倒轉原則。

Qingcai類:

public class Qingcai {
    public void run(){
        System.out.println("買到了青菜");
    }
} 

 

People類:

public class People {
    public void bug(Qingcai qingcai){
        qingcai.run();
    }
}

 

test類:

public class test {
    public static  void main(String[] args){
        People people=new People();
        people.bug(new Qingcai());
    }
}

  

運行結果:

提出問題,思路轉變(重點)

上述看着沒啥問題,但是如果他不想買青菜,想買蘿蔔怎麼辦?我們當然可以新建一個蘿蔔類,再給他弄一個run方法,但是問題是People並沒有操作蘿蔔類的方法,我們還需要在People添加對蘿蔔類的依賴。這樣代碼要修改的代碼量太多了,模塊與模塊之間的耦合性太高,只要需要稍微有點變化,就要大面積重構,所以該設計不合理,我們看下其類圖,如下:

這種設計是一般設計的思考方式,而依賴倒轉原則中的倒轉是指和平常的思考方式完全相反,先從底部開始,即先從Qingcai和Luobo開始,然後想是否能抽象出什麼。很明顯,他們都是蔬菜,然後我們再回頭重新思考如何來設計,新的設計圖如下:

(請原諒我手殘黨,畫圖都畫不好。。。)

我們可以看到將低層的類抽象出一個接口Shucai,其直接和高層進行交互,而低層的一些類則不參与,這樣能降低代碼的耦合性,提高穩定性。

已使用依賴倒轉原則

思路有了,那就來代碼耍耍把。

Shucai類:

public interface Shucai {
    public void run();
}

 

Qingcai類:

public class Qingcai implements Shucai{
    public void run(){
        System.out.println("買到了青菜");
    }
}

 

Luobo類:

public class Luobo implements Shucai {
    @Override
    public void run() {
        System.out.println("買到了蘿蔔");
    }
}

 

People類:

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

public class People {
    public void bug(Shucai shucai){
        shucai.run();
    }
}

 

test類:

public class test {
    public static  void main(String[] args){
        People people=new People();
        people.bug(new Qingcai());
        people.bug(new Luobo());
    }
}

運行結果:

總結

該原則重點在“倒轉”,要從低層往上思考,盡量抽象抽象類和接口。此例子很好的解釋了“上層模塊不應該依賴低層模塊,他們都應該依賴於抽象”。在最開始的設計中,上層模塊依賴了低層模塊,調整后,上層模塊和低層模塊都依賴於接口Shucai,依賴關係從圖中可以看出來了“倒轉”。

4.里氏替換原則

繼承的優缺點

里氏替換原則是1988年麻省理工姓李的女士提出,它是闡述了對繼承extends的一些看法。

繼承的優點:

  1. 提高代碼的重用性,子類也有父類的屬性和方法。
  2. 提高代碼的可擴展性,子類有自己特有的方法。

繼承的缺點:

當父類發生改變的時候,要考慮子類的修改。

里氏替換原則是繼承的基礎,只有當子類替換父類時,軟件功能仍然不受到影響,才說明父類真正被複用啦。

使用里氏替換原則1

子類必須實現父類的抽象方法,但不得重寫(覆蓋)父類的非抽象(已實現)方法。

反例

父類A:

public class A {
    public void run(){
        System.out.println("父類執行");
    }
} 

 

子類B:

public class B extends A{
    public void run(){
        System.out.println("子類執行");
    }
} 

 

測試類test:

public class test {
    public static void main(String[] args) {
        A a = new A();
        a.run();
        System.out.println("將子類替換成父類:");
        B b = new B();
        b.run();
    }
}

 

運行結果:

注:我每次使用子類替換父類的時候,還要擔心這個子類有沒有可能導致問題。此處子類不能直接替換成父類,故沒有遵循里氏替換原則。

使用里氏替換原則2

子類中可以增加自己特有的方法

父類A:

public class A {
    public void run(){
        System.out.println("父類執行");
    }
}

 

子類B:

public class B extends A{
    public void runOwn(){
        System.out.println("子類執行");
    }
}

測試類test:

public class test {
    public static void main(String[] args) {
        A a = new A();
        a.run();

        System.out.println("將子類替換成父類:");
        B b = new B();
        b.run();

        b.runOwn();
    }
}

 

運行結果:

注:父類A 有run方法,繼承父類A的子類B有runOwn方法,測試類test先是調用A類的run方法,接着用B類替換A類,發現還是執行的是父類A的run方法,最後再調用子類B特有的方法runOwn方法。如上,說明該段代碼已使用了里氏替換原則。

使用里氏替換原則3

當子類覆蓋或實現父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入參數更寬鬆。

父類A:

public class  A {
    public void run(HashMap hashMap){
        System.out.println("父類執行");
    }
}

 

子類B :

public class B extends A{
    public void run(Map map){
        System.out.println("子類執行");
    }
}

 

測試類test:

public class test {
    public static void main(String[] args) {
        A a = new A();
        a.run(new HashMap());

        System.out.println("將子類替換成父類:");
        B b = new B();
        b.run(new HashMap());

    }
}

 

運行結果:

我們可以看到在測試類test中,將父類A替換成子類B的時候,還是显示的執行結果“父類執行”,我們可以發現他並不是重寫,而是方法重載,因為參數不一樣,所以他其實是對繼承的規範化,為了更好的使用繼承。關於是否為方法重載或重寫,我們從下圖看:

如果是重寫,在上圖標紅的位置會出現箭頭,我們可以看出是實際為重載。

那如果沒有使用這個規則,會是什麼樣?看下面的代碼:

父類A:

public class  A {
    public void run(Map map){
        System.out.println("父類執行");
    }
}

 

子類B:

public class B extends A{
    public void run(HashMap hashMap){
        System.out.println("子類執行");
    }
}

 

測試test:

public class test {
    public static void main(String[] args) {
        A a = new A();
        a.run(new HashMap());

        System.out.println("將子類替換成父類:");
        B b = new B();
        b.run(new HashMap());

    }
}

 

運行結果:

我們可以看到將子類的範圍比父類大的時候,替換的子類還是執行自己的子類方法。此不符合里氏替換原則。

總結

我們平常好像也沒有遵循這些里氏替換原則,程序還是正常跑。其實如果不遵循里氏替換原則,你寫的代碼出問題的幾率會大大增加。

5.開閉原則(重點)

基本介紹

前面四個原則,單一職責原則,接口屏蔽原則,依賴倒轉原則,里氏替換原則可以說都是為了開閉原則做鋪墊,其是編程匯總最基礎,最重要的設計原則,核心為對擴展開發,對修改關閉,簡單來說,通過擴展軟件的行為來實現變化,而不是通過修改來實現,盡量不修改代碼,而是擴展代碼。

未使用開閉原則

接口transport:

public interface transport {
    public void run();
}

 

Bus:

public class Bus implements transport {
    @Override
    public void run() {
        System.out.println("大巴在公路上跑");
    }
}

 

當我們修改需求,讓大巴也能有在水裡開的屬性,我們可以對Bus類添加一個方法即可。但是這個已經違背了開閉原則,如果業務複雜,這樣子的修改很容易出問題的。

已使用開閉原則

我們可以新增一個類,實現transport接口,並繼承Bus類,寫自己的需求即可。

public class universalBus extends Bus implements transport {
    @Override
    public void run() {
        System.out.println("大巴既然在公路上開,又能在水裡開");
    }
}

 

6.迪米特原則

介紹

  1. 一個對象應該對其他對象保持最少的了解。
  2. 類與類關係越密切,耦合度越大
  3. 一個類對自己依賴的類知道的越少越好。也就是說,對於被依賴的類不管多麼複雜,都盡量將邏輯封裝在類的內部。對外除了提供的public 方法,不對外泄露任何信息
  4. 迪米特法則還有個更簡單的定義:只與直接(熟悉)的朋友通信
  5. 直接(熟悉)的朋友:每個對象都會與其他對象有耦合關係,只要兩個對象之間有耦合關係, 我們就說這兩個對象之間是朋友關係。耦合的方式很多,依賴,關聯,組合,聚合等。
    其中,我們稱出現成員變量,方法參數,方法返回值中的類為直接的朋友,而出現在局部變量中的類不是直接的朋友。也就是說,陌生的類最好不要以局部變量 的形式出現在類的內部。

 

把上面的概念一一翻譯成人話就是:

  1. 我們這個類姑娘啊,因為太矜持了不善於社交,所以對其他類夥伴們不怎麼熟悉。
  2. 類姑娘實在是太害羞了,一旦與別人多說幾句話就會緊張的不知所措,頻頻犯錯。
  3. 矜持的類姑娘儘管心思很活躍,愛多想。但是給別人的感覺都是純潔的像一張白紙。
  4. 因為類姑娘太過於矜持,害怕陌生人,認為陌生人都是壞人,所以只與自己熟悉的朋友交流。
  5. 類姑娘熟悉的朋友有:成員變量,方法參數,方法返回值的對象。而出現在其他地方的類都是陌生人,壞人!本姑娘拒絕與你交流!!!

哈哈,這樣應該大家都能理解了。總而言之就一句話:一個類應該盡量不要知道其他類太多的東西,不要和陌生的類有太多接觸

未使用迪米特原則

總公司員工Employee類:

public class Employee {
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

 

分公司員工SubEmployee類:

public class SubEmployee {
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

 

總公司員工管理EmployeeManager類:

public class EmployeeManager {
    public List<Employee> setValue(){
        List<Employee> employees=new ArrayList<Employee>();
        for(int i=0;i<10;i++){
            Employee employee=new Employee();
            employee.setId("總公司"+i);
            employees.add(employee);
        }
        return  employees;
    }

    public void printAllEmployee(SubEmployeeManager sub){
        List<SubEmployee> list1 = sub.setValue();
        for(SubEmployee e:list1){
            System.out.println(e.getId());
        }

        List<Employee> list2 = this.setValue();
        for(Employee e:list2){
            System.out.println(e.getId());
        }
    }

}

 

分公司員工管理SubEmployeeManager類:

public class SubEmployeeManager {
    public List<SubEmployee> setValue(){
        List<SubEmployee> subEmployees=new ArrayList<SubEmployee>();
        for(int i=0;i<10;i++){
            SubEmployee subEmployee=new SubEmployee();
            subEmployee.setId("分公司"+i);
            subEmployees.add(subEmployee);
        }
        return subEmployees;
    }
}

 

測試類:

public class test {
    public static  void main(String[] args){
        EmployeeManager employeeManager=new EmployeeManager();
        SubEmployeeManager subEmployeeManager=new SubEmployeeManager();
        employeeManager.printAllEmployee(subEmployeeManager);
    }
} 

 

運行結果:

上面的代碼是正常運行的,但是可以看到一個問題,EmployeeManager類的printAllEmployee方法中使用的局部變量SubEmployee是不符合迪米特法則的,其是陌生朋友,應該拒絕溝通。

已使用迪米特原則

EmployeeManager類:

public class EmployeeManager {
    public List<Employee> setValue() {
        List<Employee> employees = new ArrayList<Employee>();
        for (int i = 0; i < 10; i++) {
            Employee employee = new Employee();
            employee.setId("總公司" + i);
            employees.add(employee);
        }
        return employees;
    }

    public void printAllEmployee(SubEmployeeManager sub) {
        sub.printAllSubEmployee();

        List<Employee> list2 = this.setValue();
        for (Employee e : list2) {
            System.out.println(e.getId());
        }
    }

}

 

SubEmployeeManager類:

public class SubEmployeeManager {
    public List<SubEmployee> setValue(){
        List<SubEmployee> subEmployees=new ArrayList<SubEmployee>();
        for(int i=0;i<10;i++){
            SubEmployee subEmployee=new SubEmployee();
            subEmployee.setId("分公司"+i);
            subEmployees.add(subEmployee);
        }
        return subEmployees;
    }

    public void printAllSubEmployee(){
        List<SubEmployee> list1 = setValue();
        for(SubEmployee e:list1){
            System.out.println(e.getId());
        }
    }
}

 

我們將EmployeeManager類printAllEmployee方法中的打印分公司的代碼移到了分公司的管理類SubEmployeeManager類中,再在方法中显示的調用SubEmployeeManager類的方法,這符合迪米特法則的。

7.合成復用原則

盡量使用合成/集合,不要用繼承。

如果使用繼承,會使得耦合性加強,盡量作為方法的輸入參數或類的成員變量,這樣可以避免耦合。

結語

所有的原則只是規範,為了代碼更加優雅,為了讓人一目瞭然。如果一定不遵循原則,那代碼還是可以跑的,只是日後出bug的可能性提高。

以上,簡單來說,主要包括兩點:

1.找出應用中需要變化的獨立出來,不要和固定的混合在一起。

2.面向接口編程,而不是面向實現編程。

參考資料

設計模式六大原則(一):單一職責原則

設計模式的七大原則(1) –單一職責原則

六大設計原則之依賴倒置原則(DIP) 

設計模式之里氏替換原則

 

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

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

銷售文案是什麼?A文案是廣告用的文字。舉凡任何宣傳、行銷、販賣商品時所用到的文字都是文案。在網路時代,文案成為行銷中最重要的宣傳方式,好的文案可節省大量宣傳資源,達成行銷目的。

10萬內SUV陣營再添一名猛將!這款全新打造的SUV有多強?_如何寫文案

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

4T(最大功率140馬力)渦輪增壓發動機或者1。6L自然吸氣發動機,與之匹配的是5擋手動或6擋雙離合變速器,1。4T發動機參數上已經超越速騰的1。4T發動機,而實際表現如何,我們拭目以待,懸挂方面採用了與AX3結構相同的前麥弗遜后扭力梁式非獨立懸挂。

要說當今汽車市場什麼車最受歡迎,毫無疑問那當然是SUV車型了,那SUV車型中又數緊湊型SUV競爭最為激烈,其銷量也是SUV車型中最好的,東風風神AX5將於11月上市,定位在AX3和AX7之間,動感時尚的外觀很吸引人眼球,一起來看一下新車點評吧!

外觀:很像跨界旅行車

外觀方面,風神AX5採用“流·動”的設計理念,LED前大燈與上鍍鉻進氣格柵融為一體化的設計整體感非常強,而下格柵則採用蜂窩狀的網格設計,相互搭配,使整個前臉很動感時尚,而豐富流暢的車身線條讓車子尾部簡約而不失優雅,新車三圍為4501/1806/1666mm,軸距為2630mm。

內飾:家族式風格設計

內飾造型設計布局等方面還是不錯的,

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

銷售文案是什麼?A文案是廣告用的文字。舉凡任何宣傳、行銷、販賣商品時所用到的文字都是文案。在網路時代,文案成為行銷中最重要的宣傳方式,好的文案可節省大量宣傳資源,達成行銷目的。

但沒有太多的驚喜感,軟性材質覆蓋的中控台用料很厚道,環抱式的座艙設計、中央配有8英寸懸浮式液晶屏,支持手機互聯和定位服務等功能,配置方面將搭配自動空調、一鍵啟動、ESp、定速巡航等常見配置。

空間:滿足一般家庭所需

座椅的軟硬度比較合適,但包裹性不是太好,空間方面,175cm的體驗者前後排頭部空間均有一圈距離,後排腿部空間還有兩拳距離,但後排中間位置沒有頭枕,考慮不是很周全,而儲物格的數量和深度也是令人滿意的,後排座椅放倒后非常平整,擴展容積可達970升。

動力系統:渦輪增壓加持

動力方面,新車將搭載自主研發的1.4T(最大功率140馬力)渦輪增壓發動機或者1.6L自然吸氣發動機,與之匹配的是5擋手動或6擋雙離合變速器,1.4T發動機參數上已經超越速騰的1.4T發動機,而實際表現如何,我們拭目以待,懸挂方面採用了與AX3結構相同的前麥弗遜后扭力梁式非獨立懸挂。

總結:東風風神AX5的靜態表現能夠達到我們的預期,其推出也能進一步完善了東風風神旗下產品線布局,能給廣大消費者更多的購車選擇,期待上市后能有不錯的市場表現。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

什麼是銷售文案服務?A就是幫你撰寫適合的廣告文案。當您需要販售商品、宣傳活動、建立個人品牌,撰寫廣告文案都是必須的工作。

美西北部轉溼涼有助打火 南加州強風致野火燎原_如何寫文案

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

什麼是銷售文案服務?A就是幫你撰寫適合的廣告文案。當您需要販售商品、宣傳活動、建立個人品牌,撰寫廣告文案都是必須的工作。

摘錄自2020年9月20日中央社報導

美國太平洋西北地區今天(20日)天氣偏溼涼,有助消防人員對抗一系列致命野火。南加州地區則因風勢不配合,導致另一場燎原野火向外擴散。

美國林務署(U.S. Forestry Service)表示,繼昨天降下間歇性大雨後,今天的天氣變化,有助超過9000名消防人員對抗華盛頓州和俄勒岡州各地共29場野火,包括波特蘭(Portland)東南方的「河濱野火」(Riverside Fire)。河濱野火已燒毀近5萬5847公頃的土地,目前僅11%獲得控制。這波異常兇猛的野火至少已釀成俄勒岡州8死、華盛頓州1死,且自9月初勞動節(Labor Day)以來已燒毀兩州共170萬英畝的土地,焚毀數座小鎮。

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

至於南方的加州,加州森林防火廳(Department of Forestry and Fire Protection)表示,自8月中以來,大火也已燒毀350萬英畝的土地,造成26死、超過5800棟建物被毀。加州森林防火廳指出,由於氣溫稍降,逾1萬9000名消防員開始成功遏制8月以來持續對抗的27場大火;但位於洛杉磯東北方聖蓋博山(San Gabriel Mountains)的山貓野火(Bobcat Fire)在強風助長下迅速擴散,導致超過9萬1000英畝被毀。目前還在調查山貓野火的起因。

氣候變遷
國際新聞
美國
加州
野火

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

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

銷售文案是什麼?A文案是廣告用的文字。舉凡任何宣傳、行銷、販賣商品時所用到的文字都是文案。在網路時代,文案成為行銷中最重要的宣傳方式,好的文案可節省大量宣傳資源,達成行銷目的。

HTC Desire 21 pro 5G 正式推出!Desire 系列首款 5G 手機,搭載 6.7 吋 90Hz 螢幕與 5000mAh 大電池,早鳥限時優惠 11,990 元_如何寫文案

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

上週國外才有傳聞 HTC 即將推出新機,想不到 HTC 也相當迅速在今(13)日稍早正式發表 Deire 系列的首款 5G 手機「HTC Desire 21 pro 5G」,除了擁有完整的 5G 頻段覆蓋、搭載 6.7 吋 90Hz 更新率大螢幕、 4800 萬像素 AI 主相機和 5000mAh 大電量電池,滿足入門 5G 手機用戶對於螢幕體驗、生活拍攝記錄、長續航的使用需求。

HTC Desire 21 pro 5G 正式推出!Desire 系列首款 5G 手機,搭載 6.7 吋 90Hz 螢幕與 5000mAh 大電池,早鳥限時優惠 11,990 元

作為 HTC 在 2021 年推出的首款 5G 新機, HTC Desire 21 pro 5G 不僅提供完整的 5G 頻段(n1, n3, n5, n7, n28, n41, n78)、支援 5G+4G 雙卡雙待,更進一步優化 EN-DC 組合,使得 EN-DC 組合增加 30% 覆蓋面積更廣,同時支援 SA&NSA 雙模組網,讓用戶隨時隨地享受穩定的 5G 飆網速度。

HTC Desire 21 pro 5G 配備 6.7 吋 FHD+ 解析度的挖孔全螢幕,螢幕配備 90Hz 螢幕更新率和 120Hz 觸控採樣率,並支援 HDR10 影片播放,提供用戶流暢的使用體驗。另外,硬體規格則搭載高通 Snapdragon 690 5G 行動平台、配備 8GB RAM 和 128GB ROM ,內建 5000mAh 大電池和 QC 4.0+ 快速充電,能滿足全天候的長續航需求。

相機部份, HTC Desire 21 pro 5G 配備 4800 萬像素四鏡頭主相機(4800 萬像素主鏡頭+800 萬像素廣角 HDR 鏡頭、200 萬像素微距鏡頭以及 200 萬像素景深鏡頭)和 1600 萬像素前置自拍相機,前鏡頭及主鏡頭皆搭配最新的 AI 場景辨識功能。

銷售資訊

HTC Desire 21 pro 5G 推出 8GB RAM+128GB ROM 單一版本,並提供「星辰藍」與「幻境紫」兩種配色選擇,建議售價為新台幣 12,990 元。
銷售通路方面,即日起陸續於 HTC專賣店、HTC專櫃門市、HTC網路商店及全台經銷通路門市,以及PCHOME購物、MOMO購物、YAHOO購物商城、神腦線上、蝦皮購物、東森購物上市開賣。

更多關於 HTC Desire 21 pro 5G 產品與活動資訊:點我前往 HTC 官網

限時早鳥優惠 學生再享 10% 折扣

為歡慶 HTC Desire 21 pro 5G 上市,即日起至 2 月 28 日期間凡前往 HTC專賣店、HTC專櫃門市及HTC網路商店購買 HTC Desire 21 pro 5G ,除享上市早鳥優惠價新台幣 11,990 元,上網登錄更加贈「HTC馬卡龍真無線藍牙耳機-櫻花粉」(市價新台幣 999 元)。學生專有福利再加碼,HTC網路商店另提供校園專案,購買 HTC Desire 21 pro 5G 特享校園專案 10% 折扣優惠。

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

銷售文案是什麼?A文案是廣告用的文字。舉凡任何宣傳、行銷、販賣商品時所用到的文字都是文案。在網路時代,文案成為行銷中最重要的宣傳方式,好的文案可節省大量宣傳資源,達成行銷目的。

更多關於 HTC Desire 21 pro 5G 產品與活動資訊:點我前往 HTC 官網

圖片/消息來源:HTC

延伸閱讀:
爆料大神釋出 OPPO Find X3 Pro 首批高清晰官方渲染圖

OPPO Reno5 、Reno5 Pro 正式在台發表:全新升級 AI 錄影、獨家 Reno Glow 2.0 星鑽工藝打造精緻外觀

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

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

什麼是銷售文案服務?A就是幫你撰寫適合的廣告文案。當您需要販售商品、宣傳活動、建立個人品牌,撰寫廣告文案都是必須的工作。

3. OpenCV-Python——圖像梯度算法、邊緣檢測、圖像金字塔與輪廓檢測與傅里恭弘=叶 恭弘變換_如何寫文案

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

什麼是銷售文案服務?A就是幫你撰寫適合的廣告文案。當您需要販售商品、宣傳活動、建立個人品牌,撰寫廣告文案都是必須的工作。

一、圖像梯度算法

1、圖像梯度-Sobel算子

 

 dst = cv2.Sobel(src, ddepth, dx, dy, ksize)

  • ddepth:圖像的深度
  • dx和dy分別表示水平和豎直方向
  • ksize是Sobel算子的大小
 1 # *******************圖像梯度算法**********************開始
 2 import cv2
 3 # import numpy as np
 4 
 5 img = cv2.imread('pie.png',cv2.IMREAD_GRAYSCALE)
 6 cv2.imshow("img",img)
 7 cv2.waitKey()
 8 cv2.destroyAllWindows()
 9 
10 # 显示圖像函數
11 def cv_show(img,name):
12     cv2.imshow(name,img)
13     cv2.waitKey()
14     cv2.destroyAllWindows()
15 
16 # Sobel算子——x軸
17 sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)   # 計算水平的
18 cv_show(sobelx,'sobelx')
19 
20 # 白到黑是正數,黑到白就是負數了,所有的負數會被截斷成0,所以要取絕對值
21 sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
22 sobelx = cv2.convertScaleAbs(sobelx)             # 取絕對值
23 cv_show(sobelx,'sobelx')
24 
25 # Sobel算子——y軸
26 sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
27 sobely = cv2.convertScaleAbs(sobely)             # 取絕對值
28 cv_show(sobely,'sobely')
29 
30 # 求和
31 sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)  # 按權重計算
32 cv_show(sobelxy,'sobelxy')
33 
34 # 也有直接計算xy軸的————不推薦使用
35 # sobelxy=cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)
36 # sobelxy = cv2.convertScaleAbs(sobelxy)
37 # cv_show(sobelxy,'sobelxy')
38 # *******************圖像梯度算法**********************結束

用lena圖像來實際操作一下:

 1 # *******************圖像梯度算法-實際操作**********************開始
 2 import cv2
 3 
 4 # 显示圖像函數
 5 def cv_show(img,name):
 6     cv2.imshow(name,img)
 7     cv2.waitKey()
 8     cv2.destroyAllWindows()
 9 
10 img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
11 cv_show(img,'img')
12 
13 # 分別計算x和y
14 img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
15 sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
16 sobelx = cv2.convertScaleAbs(sobelx)
17 sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
18 sobely = cv2.convertScaleAbs(sobely)
19 sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
20 cv_show(sobelxy,'sobelxy')
21 # *******************圖像梯度算法-實際操作**********************結束

      

2、圖像梯度-Scharr和Laplacian算子

(1)Scharr算子

(2)Laplacian算子

(3)不同算子之間的差距

 1 # *******************圖像梯度算子-Scharr+laplacian**********************開始
 2 import cv2
 3 import numpy as np
 4 
 5 #不同算子的差異
 6 img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
 7 sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
 8 sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
 9 sobelx = cv2.convertScaleAbs(sobelx)
10 sobely = cv2.convertScaleAbs(sobely)
11 sobelxy =  cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
12 
13 scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)
14 scharry = cv2.Scharr(img,cv2.CV_64F,0,1)
15 scharrx = cv2.convertScaleAbs(scharrx)
16 scharry = cv2.convertScaleAbs(scharry)
17 scharrxy =  cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
18 
19 laplacian = cv2.Laplacian(img,cv2.CV_64F)
20 laplacian = cv2.convertScaleAbs(laplacian)
21 
22 res = np.hstack((sobelxy,scharrxy,laplacian))
23 
24 # 显示圖像函數
25 def cv_show(img,name):
26     cv2.imshow(name,img)
27     cv2.waitKey()
28     cv2.destroyAllWindows()
29 cv_show(res,'res')
30 # *******************圖像梯度算子-Scharr+laplacian**********************結束

二、邊緣檢測

Canny邊緣檢測

  • 1) 使用高斯濾波器,以平滑圖像,濾除噪聲。

  • 2) 計算圖像中每個像素點的梯度強度和方向。

  • 3) 應用非極大值(Non-Maximum Suppression)抑制,以消除邊緣檢測帶來的雜散響應。

  • 4) 應用雙閾值(Double-Threshold)檢測來確定真實的和潛在的邊緣。

  • 5) 通過抑制孤立的弱邊緣最終完成邊緣檢測。

1、高斯濾波器

2、梯度和方向

3、非極大值抑制

4、雙閾值檢測

 1 # *******************邊緣檢測**********************開始
 2 import cv2
 3 import numpy as np
 4 
 5 img=cv2.imread("lena.jpg",cv2.IMREAD_GRAYSCALE)
 6 
 7 v1=cv2.Canny(img,80,150)  # 設置雙閾值 最小和最大
 8 v2=cv2.Canny(img,50,100)
 9 
10 res = np.hstack((v1,v2))
11 
12 # 显示圖像函數
13 def cv_show(img,name):
14     cv2.imshow(name,img)
15     cv2.waitKey()
16     cv2.destroyAllWindows()
17 cv_show(res,'res')
18 # *******************邊緣檢測**********************結束

三、圖像金字塔

1、高斯金字塔

(1)高斯金字塔:向下採樣方法(縮小)

(2)高斯金字塔:向上採樣方法(放大)

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

銷售文案是什麼?A文案是廣告用的文字。舉凡任何宣傳、行銷、販賣商品時所用到的文字都是文案。在網路時代,文案成為行銷中最重要的宣傳方式,好的文案可節省大量宣傳資源,達成行銷目的。

  

 1 # *******************圖像金字塔--高斯金字塔**********************開始
 2 import cv2
 3 import numpy as np
 4 
 5 # 显示圖像函數
 6 def cv_show(img,name):
 7     cv2.imshow(name,img)
 8     cv2.waitKey()
 9     cv2.destroyAllWindows()
10 
11 img=cv2.imread("AM.png")
12 # cv_show(img,'img')
13 print (img.shape)
14 
15 # 高斯金字塔-上採樣 (可執行多次)
16 up=cv2.pyrUp(img)
17 # cv_show(up,'up')
18 print (up.shape)
19 
20 # 高斯金字塔-下採樣 (可執行多次)
21 down=cv2.pyrDown(img)
22 # cv_show(down,'down')
23 print (down.shape)
24 
25 # 高斯金字塔-先上採樣再下採樣 (會損失信息-變模糊)
26 up=cv2.pyrUp(img)
27 up_down=cv2.pyrDown(up)
28 # cv_show(up_down,'up_down')
29 cv_show(np.hstack((img,up_down)),'up_down')
30 # *******************圖像金字塔--高斯金字塔**********************結束

2、拉普拉斯金字塔

 1 # *******************圖像金字塔-拉普拉斯金字塔**********************開始
 2 import cv2
 3 import numpy as np
 4 
 5 # 显示圖像函數
 6 def cv_show(img,name):
 7     cv2.imshow(name,img)
 8     cv2.waitKey()
 9     cv2.destroyAllWindows()
10 
11 img=cv2.imread("AM.png")
12 down=cv2.pyrDown(img)
13 down_up=cv2.pyrUp(down)
14 l_1=img-down_up
15 cv_show(l_1,'l_1')
16 # *******************圖像金字塔-拉普拉斯金字塔**********************結束

四、圖像輪廓

 cv2.findContours(img,mode,method)

  mode:輪廓檢索模式

  • RETR_EXTERNAL :只檢索最外面的輪廓;
  • RETR_LIST:檢索所有的輪廓,並將其保存到一條鏈表當中;
  • RETR_CCOMP:檢索所有的輪廓,並將他們組織為兩層:頂層是各部分的外部邊界,第二層是空洞的邊界;
  • RETR_TREE:檢索所有的輪廓,並重構嵌套輪廓的整個層次;

  method:輪廓逼近方法

  • CHAIN_APPROX_NONE:以Freeman鏈碼的方式輸出輪廓,所有其他方法輸出多邊形(頂點的序列)。
  • CHAIN_APPROX_SIMPLE:壓縮水平的、垂直的和斜的部分,也就是,函數只保留他們的終點部分。

為提高準確性,使用二值圖像。

1、輪廓檢測及繪製

 1 # *******************圖像輪廓**********************開始
 2 import cv2
 3 import numpy as np
 4 
 5 # 讀入圖像轉換為二值圖像
 6 img = cv2.imread('contours.png')
 7 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)     # 轉換為灰度圖
 8 ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)  # 轉換成二值圖
 9 
10 # 显示圖像函數
11 def cv_show(img,name):
12     cv2.imshow(name,img)
13     cv2.waitKey()
14     cv2.destroyAllWindows()
15 # cv_show(thresh,'thresh')
16 
17 # 輪廓檢測  第一個就是二值的結果  第二個是一堆輪廓點  第三個是層級
18 binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
19 
20 # 繪製輪廓
21 draw_img = img.copy()  # 注意需要copy,要不原圖會變。。。
22 res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2) # 傳入繪製圖像,輪廓,輪廓索引(-1全部),顏色模式,線條厚度
23 # cv_show(res,'res')
24 
25 draw_img = img.copy()
26 res = cv2.drawContours(draw_img, contours, 2, (0, 0, 255), 2)
27 cv_show(res,'res')
28 # *******************圖像輪廓**********************結束

2、輪廓特徵

 1 import cv2
 2 
 3 # 讀入圖像轉換為二值圖像
 4 img = cv2.imread('contours.png')
 5 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)     # 轉換為灰度圖
 6 ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)  # 轉換成二值圖
 7 
 8 # 輪廓檢測  第一個就是二值的結果  第二個是一堆輪廓點  第三個是層級
 9 binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
10 
11 # 繪製輪廓
12 draw_img = img.copy()
13 res = cv2.drawContours(draw_img, contours, 2, (0, 0, 255), 2)
14 
15 # 輪廓特徵
16 cnt = contours[0]               # 獲取輪廓
17 print(cv2.contourArea(cnt))     # 計算面積
18 print(cv2.arcLength(cnt, True)) # 計算周長,True表示閉合的

3、輪廓近似

     

 1 import cv2
 2 
 3 img = cv2.imread('contours2.png')
 4 # 显示圖像函數
 5 def cv_show(img,name):
 6     cv2.imshow(name,img)
 7     cv2.waitKey()
 8     cv2.destroyAllWindows()
 9 
10 # 二值+輪廓檢測
11 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
12 ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
13 binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
14 cnt = contours[0]
15 # 輪廓繪製
16 draw_img = img.copy()
17 res = cv2.drawContours(draw_img, [cnt], -1, (0, 0, 255), 2)
18 # cv_show(res,'res')
19 
20 # 輪廓近似
21 epsilon = 0.05*cv2.arcLength(cnt,True)
22 approx = cv2.approxPolyDP(cnt,epsilon,True)
23 
24 draw_img = img.copy()
25 res = cv2.drawContours(draw_img, [approx], -1, (0, 0, 255), 2)
26 cv_show(res,'res')

(1)邊界矩形

 1 # *******************圖像輪廓-邊界矩形**********************開始
 2 import cv2
 3 
 4 # 显示圖像函數
 5 def cv_show(img,name):
 6     cv2.imshow(name,img)
 7     cv2.waitKey()
 8     cv2.destroyAllWindows()
 9 
10 img = cv2.imread('contours.png')
11 
12 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
13 ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
14 binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
15 cnt = contours[0]
16 
17 # 邊界矩形
18 x,y,w,h = cv2.boundingRect(cnt)
19 img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
20 cv_show(img,'img')
21 # 輪廓面積與邊界矩形比
22 area = cv2.contourArea(cnt)
23 x, y, w, h = cv2.boundingRect(cnt)
24 rect_area = w * h
25 extent = float(area) / rect_area
26 print ('輪廓面積與邊界矩形比',extent)
27 # *******************圖像輪廓-邊界矩形**********************結束

(2)外接圓

1 # 外接圓
2 (x,y),radius = cv2.minEnclosingCircle(cnt)
3 center = (int(x),int(y))
4 radius = int(radius)
5 img = cv2.circle(img,center,radius,(0,255,0),2)
6 cv_show(img,'img')

 五、傅里恭弘=叶 恭弘變換

  https://zhuanlan.zhihu.com/p/19763358

1、傅里恭弘=叶 恭弘的作用

  • 高頻:變化劇烈的灰度分量,例如邊界

  • 低頻:變化緩慢的灰度分量,例如一片大海

2、濾波

  • 低通濾波器:只保留低頻,會使得圖像模糊

  • 高通濾波器:只保留高頻,會使得圖像細節增強

  opencv中主要就是cv2.dft()和cv2.idft(),輸入圖像需要先轉換成np.float32 格式,得到的結果中頻率為0的部分會在左上角,通常要轉換到中心位置,通過shift變換。

3、傅里恭弘=叶 恭弘變換

 1 # *******************傅里恭弘=叶 恭弘變換**********************開始
 2 import numpy as np
 3 import cv2
 4 from matplotlib import pyplot as plt
 5 
 6 img = cv2.imread('lena.jpg',0)
 7 
 8 img_float32 = np.float32(img)
 9 
10 # 傅里恭弘=叶 恭弘變換
11 dft = cv2.dft(img_float32, flags = cv2.DFT_COMPLEX_OUTPUT)
12 dft_shift = np.fft.fftshift(dft)                            # 低頻值移動到中間
13 
14 # 對兩通道進行轉換——映射公式
15 magnitude_spectrum = 20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))
16 
17 plt.subplot(121),plt.imshow(img, cmap = 'gray')
18 plt.title('Input Image'), plt.xticks([]), plt.yticks([])
19 plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
20 plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
21 plt.show()
22 # *******************傅里恭弘=叶 恭弘變換**********************結束

4、高通、低通濾波器

低通濾波器:

 1 # *******************低通濾波器**********************開始
 2 import numpy as np
 3 import cv2
 4 from matplotlib import pyplot as plt
 5 
 6 img = cv2.imread('lena.jpg',0)
 7 
 8 img_float32 = np.float32(img)
 9 
10 # 傅里恭弘=叶 恭弘變換
11 dft = cv2.dft(img_float32, flags = cv2.DFT_COMPLEX_OUTPUT)
12 dft_shift = np.fft.fftshift(dft)
13 
14 rows, cols = img.shape
15 crow, ccol = int(rows/2) , int(cols/2)     # 中心位置
16 
17 # 低通濾波
18 mask = np.zeros((rows, cols, 2), np.uint8)  # 掩碼
19 mask[crow-30:crow+30, ccol-30:ccol+30] = 1  # 區域
20 
21 # IDFT
22 fshift = dft_shift*mask                     # 掩碼結合
23 f_ishift = np.fft.ifftshift(fshift)         # 位置還原
24 img_back = cv2.idft(f_ishift)               # 傅里恭弘=叶 恭弘逆變換
25 img_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1]) # 圖像轉換
26 
27 plt.subplot(121),plt.imshow(img, cmap = 'gray')
28 plt.title('Input Image'), plt.xticks([]), plt.yticks([])
29 plt.subplot(122),plt.imshow(img_back, cmap = 'gray')
30 plt.title('Result'), plt.xticks([]), plt.yticks([])
31 
32 plt.show()
33 # *******************低通濾波器**********************結束

高通濾波器:

 1 # *******************高通濾波器**********************開始
 2 import numpy as np
 3 import cv2
 4 from matplotlib import pyplot as plt
 5 
 6 img = cv2.imread('lena.jpg',0)
 7 
 8 img_float32 = np.float32(img)
 9 
10 dft = cv2.dft(img_float32, flags = cv2.DFT_COMPLEX_OUTPUT)
11 dft_shift = np.fft.fftshift(dft)
12 
13 rows, cols = img.shape
14 crow, ccol = int(rows/2) , int(cols/2)     # 中心位置
15 
16 # 高通濾波
17 mask = np.ones((rows, cols, 2), np.uint8)  # 掩碼
18 mask[crow-30:crow+30, ccol-30:ccol+30] = 0
19 
20 # IDFT
21 fshift = dft_shift*mask
22 f_ishift = np.fft.ifftshift(fshift)
23 img_back = cv2.idft(f_ishift)
24 img_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1])
25 
26 plt.subplot(121),plt.imshow(img, cmap = 'gray')
27 plt.title('Input Image'), plt.xticks([]), plt.yticks([])
28 plt.subplot(122),plt.imshow(img_back, cmap = 'gray')
29 plt.title('Result'), plt.xticks([]), plt.yticks([])
30 
31 plt.show()
32 # *******************高通濾波器**********************結束

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

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

小米手錶超值版在台推出:1.4吋彩色螢幕、5 ATM防水、9天長續航,售價 1,495 元將於 1/19 10:00 在台開賣_如何寫文案

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

銷售文案是什麼?A文案是廣告用的文字。舉凡任何宣傳、行銷、販賣商品時所用到的文字都是文案。在網路時代,文案成為行銷中最重要的宣傳方式,好的文案可節省大量宣傳資源,達成行銷目的。

在上個月小米手錶超值版(Mi Watch Lite)才在小米全球官網現身,想不到很快就在今(15)日由小米台灣宣布將在 1 月 19 日上午 10 點開賣啦!小米手錶超值版採用 1.4 吋彩色螢幕、支持 5 ATM 防水、內建多款錶手錶錶盤、GPS/GLONASS 定位、心率/睡眠監測以及 9 天的長續航,售價只要新台幣 1,495 元。

小米手錶超值版在台推出:1.4吋彩色螢幕、5ATM防水、9天長續航,售價 1,495 元將於 1/19 10:00 在台開賣

除了輕便、適合運動使用的小米手環系列,今日稍早小米台灣宣布將在 19 日在台灣開賣「小米手錶超值版」這款同樣兼具輕巧特色的智慧穿戴裝置。小米手錶超值版推出米白色、藍色以及黑色三種顏色手錶錶殼、五種錶帶顏色選擇。

另外,小米手錶超值版內建多款主題錶盤和錶盤功能定制,用戶能搭配出自我的獨特風格:

螢幕方面,小米手錶超值版採用 1.4 吋 TFT 20*320 解析度的 LCD 彩色觸控螢幕,支援自動亮度調節功能。

支援 5ATM 防水機能(防水深度可達 50 公尺),運動模式則支援包括戶外跑步、室內跑步、戶外騎行、室內單車,自由活動、健走、越野、登山、泳池游泳、開放水域游泳以及板球共 11 種運動模式選擇。

小米手錶超值版搭載 GPS+GLONASS 定位和多種智慧感應器,讓手錶可精準記錄使用者的行蹤、速度、距離和消耗熱量。同時還能測量心率變化,掌握每次的運動狀態。

小米手錶超值版配備心律感應器,可 24 小時全天候準確測監測心率:

用戶可藉由睡眠監測功能記錄完整的睡眠數據,進而分析睡眠品質、有效保持良好睡眠習慣:

面對日常生活的壓力,小米手錶超值版也內建呼吸訓練功能,可引導使用者進行呼吸練習、減輕壓力:

所有在小米手錶超值版每天的心率、運動和睡眠數據,都能透過專屬 App 快速檢視:

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

小米手錶超值版內建 230mAh 電池,可在 2 小時充滿 100%電量。續航部分,小米手錶 Lite 一般使用情境可支持 9 天的使用續航,在開啟連續 GPS 運動模式則可使用 10 小時。

其他應用功能部分,小米手錶 Lite 除了能顯示來電通知、訊息、以及 App 提醒,也能直接控制手機多媒體播放和音量調整。

面對長時間工作,小米手錶超值版也支持久坐提醒的貼心功能:

價格方面,小米手錶超值版建議手價為新台幣 1,495 元,將於 1 月 19 日上午 10 點起正式開賣。

圖片/消息來源:小米台灣

延伸閱讀:
小米智慧攝影機雲台版2K 在台開賣:升級 2K 高畫質和 F1.4 大光圈,售價 1,095元

小米摺疊螢幕手機工程機曝光!再次於地鐵車廂被捕獲,只是螢幕摺痕有點顯眼

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

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

什麼是銷售文案服務?A就是幫你撰寫適合的廣告文案。當您需要販售商品、宣傳活動、建立個人品牌,撰寫廣告文案都是必須的工作。