Tesla Model 3 與 Model Y 雙版本價位探新低,但又無預警砍了最便宜的版本…

最近 Tesla 的一波價格操作,應該搞得不少汽車品牌心中七上八下。首先,他們宣布現階段相對入門的車款 Model 3 與 Model Y 的 SR+ 後驅低階版的售價,變成最便宜僅需約新台幣 103 萬即可入手。然而當不少人可能還在猶豫要不要入手的次週,這些車款竟隨著 LR 也降價 1,000 美元的消息,一刀就被 Tesla 給砍了。還對下訂 SR+ 版本的消費者發出訊息,表示會將庫存僅會提供給已經結清的車主… 繼續閱讀 Tesla Model 3 與 Model Y 雙版本價位探新低,但又無預警砍了最便宜的版本… 報導內文。

Tesla Model 3 與 Model Y 雙版本價位探新低,但又無預警砍了最便宜的版本…

其實像是這樣看得到買不到的狀況,在 Tesla 已經不是第一次見到了 — Model 3 的 3.5 萬美元 SR 就是門市限定且無預警被砍。現在,Tesla 這樣曇花一現提供牌價最低近 3.7 萬美元的 Model 3 SR+ / Model Y SR+ 版,更是只賣了一週的時間就被消失。

雖然 Tesla 並沒有解釋為何整個品牌現階段最低價的轎車與休旅車款為何「又」被砍。但有人認為,這應該是因為 Elon Musk 先前提到,認為電動車續航應該至少要有 400 公里 / 250 英里的發言有關。而對應這樣的車款精簡策略,Tesla 則是選擇將 Model 3 與 Model Y 的 Long Range 長續航版本降價 1,000 美元,最低,約 130 萬台幣即可入手全輪驅動的 Model 3 LR。

不過儘管這續航可能達不到要求,但對於消費者而言能有更低價入手電動車的選擇,實在是不太能理解有哪裡不好的。也許就當成這是 Tesla 對於低價車款的出清,再來看看調整為僅剩 LR 與性能版的 Model 3 / Model Y 是否會再蹦出什麼有趣(最好是很便宜)的級距囉 — 還是,這是為說好的 70 萬台幣超入門車款鋪路?

是說,台灣這邊的 Model 3 SR+ 倒是完全沒動靜啊…

本篇不是特斯拉廣編,只是因為阿達沒有終身超充,如果您使用阿達的連結 (推薦碼:koc59401)訂車的話,你可以得到1500公里免費超充,我也可以得到1500公里超充(直接網路訂就什麼都沒有)。如果您已經訂車還沒領車的話,還是可以請業務補登記獲得1500公里超充,別讓自己的權力睡著了,等你交車之後也可以用自己的連結或推薦碼找親友購車,如果覺得本篇資訊有幫到你的話,就賞臉一下吧。

TESLA Model 3 訂車連結(請點我)
TESLA 車主討論社團(請點我)

延伸閱讀:

酷寒導致大停電,德州一家四口靠 Tesla 電動車取暖撐過夜晚

AirPods 3 新洩漏照流出,可選配耳塞加強「主動式降噪」體驗?

您也許會喜歡:

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

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

【其他文章推薦】

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

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

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

※回頭車貨運收費標準

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

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

Intel 11 代中階入門版 i5-11400 跑分現身,跟上一代比單核效能狂增 30%

一般來說入門級處理器的效能每更新一代,其提升幅度都不會像高階這麼多,特別是單核心,不過這次第 11 代可不一樣,最近 i5-11400 的分數搶先現身國外跑分網站 ,跟上一代相比,單核心提升幅度高達 30%,看起來真是有夠香。

Intel 11 代中階入門版 i5-11400 跑分現身

稍早國外一位 Benchleaks 用戶,在 Twitter 上分享他發現到 i5-11400 的分數,而且不只一筆,共有兩筆,分數都差不多:

[GB5 CPU] Unknown CPU
CPU: Intel Core i5-11400 (6C 12T)
Min/Max/Avg: 4262/4381/4371 MHz
Codename: Rocket Lake
Scores, vs AMD 5800X
Single: 1490, -10.8%
Multi: 6576, -37.0%https://t.co/JrtMKbaOxP

— Benchleaks (@BenchLeaks) February 22, 2021

這兩筆都是在同一個平台測試,使用 ASRock Z590M Pro 4 主機板,內建 16GB RAM。從規格表可以看到,i5-11400 是一顆 6 核心 12 執行緒的配置,基礎時脈為 2.59GHz,超頻後可達 4.39GHz。單核心獲得 1490 分,多核心則是 6576 分:

第二筆分數也差不多,單核心 1500 分,多核心 6664 分:

而跟上一代 Intel Core i5-10400 相比,i5-10400 單核心分數大約落在 1150 上下,意味著效能提升了約 30%,非常有感。至於多核心方面,分數就差不多,都是 6000 分左右。i5-10400 也是 6 核心 12 執行緒配置,基礎時脈 2.90GHz,超頻時脈 4.30GHz:

所以說,最近有打算組一台入門或文書、上網用的一般電腦,建議可以先等等,Intel 第 11 代預計在 3 月中就會推出,到時就能買到更強悍中階入門處理器。

除了 i5-11400,幾天前還有另一顆 i5-11600K 跑分也現身,同樣單核心效能有感提升,這顆也可以參考:

不過話說回來,畢竟是跑分搶先洩漏,因此實際效能還是以推出後為主。

資料來源:notebookcheck

Intel 文件透露 i9-10900KS 特別版處理器即將問世,沒意外應該也是限量

您也許會喜歡:

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

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

【其他文章推薦】

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

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

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

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

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

※回頭車貨運收費標準

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

國外多位用戶反應 M1 Mac 的 SSD 損耗太嚴重,擔心影響使用壽命

M1 Mac 自從推出以來就好評不斷,特別是在效能部分,不過隨著時間拉長,最近也陸續傳出一些問題,繼先前的粉紅小方塊、導致 iPhone 與 iPad Apps 閃退狀況,近日又有一個新問題出現,而且似乎是所有 Mac 都受影響。國外用戶反應,M1 Mac 的 SSD 耗損有點嚴重,健康度令人擔憂。

國外多位用戶反應 M1 Mac 的 SSD 損耗太嚴重

根據外媒 Macworld 報導,最近多位用戶陸續在 Twitter 上分享擔心 M1 Mac SSD 耗損速度的貼文,首先是 Longhorn,他提到他的 M1 Mac 只使用約 2 個月左右,SSD 卻已經損耗 1%,而且這塊 SSD 是焊死的不能更換,讓人覺得非常不 OK:

M1 Mac SSD update…

Apple, this is NOT okay. Especially as the internal SSD isn’t replaceable. The machine is just a bit over 2 months old. pic.twitter.com/xqlSMjxwTa

— Longhorn (@never_released) February 13, 2021

Macworld 編輯 Dan Moren 還跟他的舊 Mac 比較。左側為他舊的 2017 iMac,右側則是去年秋天買的 M1 Air,才三個多月過去,M1 Air 讀寫數據量已經是 3.5 年 iMac 的 15~20%:

This story about M1 Macs with excessive SSD read/write data does seem to be true. On the left, my 2017 iMac; on the right, my M1 Air from last fall. Somehow, in 3 months, it’s registered about 15-20% of what my iMac has in 3.5 years? Not sure what the implications are, but weird. pic.twitter.com/qNrnkzo62z

— Dan Moren (@dmoren) February 23, 2021

這位 David 的 M1 Macbook Pro 配備 2TB SSD 超大容量,才經過 2 個月,SSD 就已經損耗 3%。有人甚至推測,如果他的 M1 MBP 是 256GB 版本,現在搞不好 SSD 已經損耗 30%,並且在兩年後達到最高的 TBW 限制:

16GB M1 MBP, 2TB SSD, 2 months in. pic.twitter.com/SaSmieaT1s

— David (@david_rysk) February 15, 2021

即便 TBW 達標,SSD 依舊還是可以繼續使用,只是不確定可以維持多長時間。

目前還不確定是什麼導致這原因,但應該不是 M1 晶片,畢竟是檢測報告,實際是不是真的這樣,也只能等有人達到 TPW 限制才能得知,另外也可能是測試工具有問題。

無論如何,以 Apple 這麼大間且知名的公司來說,開發時應該有考量到這部分,M1 Mac 用戶也不用太過於擔心。

資料來源:Macworld

國外 YouTuber 實測 M1 MacBook Air 貼上導熱矽膠片後,效能有感提升(更接近 MacBook Pro)

您也許會喜歡:

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

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

【其他文章推薦】

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

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

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

※回頭車貨運收費標準

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

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

小米10T Lite 將於 2/26 在台發表:搭載 Snapdragon 750G 5G 處理器、120Hz 更新率螢幕、64MP 四鏡頭主相機

除了本週的 2021 小米元宵節活動有同步開賣 Redmi 9T 入門手機,今(24)日稍早小米台灣也正式宣佈即將在 26 日 12:30 正式在台推出「小米10T Lite」中階新機。小米10T Lite 搭載 120Hz 更新率變速螢幕、高通 Snapdragon 750G 5G 處理器、 6400 萬像素四鏡頭主相機、4820mAh大電池和 33W 快速充電,也將對於重視 CP 值的消費者再添一款平價 5G 可選擇!

▲圖片來源:小米香港官網

小米10T Lite 將於 2/26 在台發表:搭載 Snapdragon 750G 5G 處理器、120Hz 更新率螢幕、64MP 四鏡頭主相機

去年原本小米都未在台灣推出手機,不過在去年底至今短短兩個個月陸續推出包括小米10 Lite 、小米10T、小米10T Pro、Redmi 9T、Redmi Note 9T 等新機,今(24)日稍早也宣佈將於 26 日直播活動在台推出「小米10T Lite」5G 中階新機。由於小米10T Lite 其實已經率先在香港推出,在台灣正式發表前也先帶各位「預習」一下小米10T Lite 的規格重點。

▲圖片來源:小米台灣 Xiaomi Taiwan (Facebook)

螢幕方面,小米10T Lite 搭載 6.67 吋 20:9 顯示比例、 FHD+ 解析度的居中挖孔全螢幕,機身前後採用康寧第五代大猩猩玻璃保護:

▲圖片來源:小米香港官網

顯示方面,小米10T Lite 除了支持 1500:1 對比度、 NTSC 84% 色域、 120Hz 螢幕更新率、 240Hz 觸控採樣率,螢幕也通過德國萊茵低藍光認證。另外,小米10T Lite 前後也配備智慧環境光感應器,能提供最舒適的視覺體驗。螢幕採用陽光螢幕 3.0 ,在陽光直射下自動增強對比度以確保畫面清晰可見:

▲圖片來源:小米香港官網

小米10T Lite 搭載 6400 萬像素四鏡頭主相機,採用 6400 萬像素 F/1.89 光圈主鏡頭(SONY IMX682 感光元件)、800 萬像素 120° 超廣角鏡頭、200 萬像素 4cm 微距鏡頭以及 200 萬像素景深鏡頭的搭配。

▲圖片來源:小米香港官網

前相機則配備 1600 萬像素前置自拍鏡頭:

▲圖片來源:小米香港官網

小米10T Lite 相機應用功能也相當豐富,像是也支持前後鏡頭同時錄影:

▲圖片來源:小米香港官網

硬體規格方面,小米10T Lite 搭載 Qualcomm Snapdragon 750G 5G 處理器,香港版本推出 6GB RAM 和 128GB ROM 單一規格,台灣版本確切規格則得等待小米台灣官方正式發佈為準。

▲圖片來源:小米香港官網

小米10T Lite 內建 4820mAh 大電量電池,支持 33W 快速充電能在 59 分鐘充電至 100% :
▲圖片來源:小米香港官網

▲圖片來源:小米香港官網

其他方面,小米10T Lite 支援雙頻 GPS、多功能 NFC、1216 線性揚聲器,生物辨識則採用結合電源鍵的側面指紋解鎖方案。

▲圖片來源:小米香港官網

小米10T Lite 也將於 2 月 26 日 12:30 的「小米5G手機超值選」直播正式登場,當日觀看直播還有機會抽小米手機(點我前往):

▲圖片來源:小米台灣官網

消息來源:小米台灣 Xiaomi Taiwan (Facebook)|小米台灣官網

延伸閱讀:
小米推出 33W GaN 氮化鎵充電器:超小體積、 iPhone 也能快速充電,售價僅約 340 元

小米米家筋膜槍眾籌推出:強勁動力有效放鬆筋膜,眾籌價約 1,942 元

您也許會喜歡:

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

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

【其他文章推薦】

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

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

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

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

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

※回頭車貨運收費標準

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

循序漸進VUE+Element 前端應用開發(8)— 樹列表組件的使用,循序漸進VUE+Element 前端應用開發(5)— 表格列表頁面的查詢,列表展示和字段轉義處理,

在我前面隨筆《循序漸進VUE+Element 前端應用開發(6)— 常規Element 界面組件的使用》裏面曾經介紹過一些常規的界面組件的處理,主要介紹到單文本輸入框、多文本框、下拉列表,以及按鈕、圖片展示、彈出對話框、表單處理,本篇隨筆補充這一個主題,介紹樹列表組件和下拉列表樹組件在項目中的使用,以及一個SplitPanel的組件。

1、常規樹列表控件的使用

眾所周知,一般界面很多情況涉及到樹列表的處理,如類型展示,如果是一層的,可以用下拉列表代替,如果是多個層級的,採用樹控件展示會更加直觀。

在Element裏面也有一個el-tree的控件,如下所示,這裏主要對它的各種屬性和方法進行介紹。

 簡單的代碼如下所示

<el-tree :data="data"  @node-click="handleNodeClick"></el-tree>

主要在script部分裏面指定它的data數據,以及單擊節點的事件處理,結合卡片控件的展示,我們可以把樹放在其中進行展示

 界面代碼如下所示,通過 default-expand-all 可以設置全部展開,icon-class 指定節點圖標(也可以默認不指定)

        <el-card class="box-card">
          <div slot="header" class="clearfix">
            <span>樹列表</span>
            <el-button style="float: right; padding: 3px 0" type="text">操作按鈕</el-button>
          </div>
          <div>
            <el-tree
              style="padding-top:10px"
              :data="treedata"
              node-key="id"
              default-expand-all
              icon-class="el-icon-price-tag"
              highlight-current
              @node-click="handleNodeClick"
            >
              <span slot-scope="{ node, data }" class="custom-tree-node">
                <span>
                  <i :class="node.icon ? node.icon : 'el-icon-price-tag'" />
                  {{ node.label }}
               &nbsp;&nbsp;
                </span>
              </span>
            </el-tree>
          </div>
        </el-card>

其中界面裏面,我們通過 class=”custom-tree-node”,來指定樹列表的展現內容,可以加入圖標等信息

而在script裏面,定義了一個treedata的屬性

      // 初始化樹列表
      treedata: [
        {
          label: '一級 1',
          id: '1',
          children: [{
            id: '1-1',
            label: '二級 1-1',
            children: [{
              label: '三級 1-1-1',
              id: '1-1-1'
            }, {
              label: '三級 1-1-2',
              id: '1-1-2'
            }, {
              label: '三級 1-1-3',
              id: '1-1-3'
            }]
          }]
        }
      ]

如果設置有選擇框,得到界面如下所示。

 主要設置  show-checkbox 和 @check-change=”handleCheckChange” 即可。

界面代碼如下所示

<el-tree
  style="padding-top:10px"
  :data="treedata"
  node-key="id"
  default-expand-all
  highlight-current
  show-checkbox
  :default-checked-keys="['1-1-1']"
  @node-click="handleNodeClick" @check-change="handleCheckChange"
>
  <span slot-scope="{ node, data }" class="custom-tree-node">
    <span>
      <i :class="node.icon ? node.icon : 'el-icon-price-tag'" />
      {{ node.label }}
   &nbsp;&nbsp;
    </span>
  </span>
</el-tree>

而對於樹列表,可以進行一個過濾處理操作,如下界面所示。

 在內容區增加一個input的文本框進行過濾處理,並綁定對應的屬性變量

<el-input
  v-model="filterText"
  placeholder="輸入關鍵字進行過濾"
  clearable
  prefix-icon="el-icon-search"
/>

樹列表控件需要增加過濾函數綁定 :filter-node-method=”filterNode”,如下代碼所示。

<el-tree
  ref="tree"
  class="filter-tree"
  style="padding-top:10px"
  :data="treedata"
  node-key="id"
  default-expand-all
  highlight-current
  show-checkbox
  :filter-node-method="filterNode"
  @check-change="handleCheckChange"
  @node-click="handleNodeClick"
>
  <span slot-scope="{ node, data }" class="custom-tree-node">
    <span>
      <i :class="node.icon ? node.icon : 'el-icon-price-tag'" />
      {{ node.label }}
   &nbsp;&nbsp;
    </span>
  </span>
</el-tree>

script的處理代碼如下所示,需要watch過濾的綁定值,變化就進行過濾處理。

 為了在列表結合中進行快速的過濾,我們可以在上次介紹的列表界面裏面增加一個樹列表的快速查詢處理。如下界面所示。

 這裏列表裡面增加了一個第三方組件 splitpanes,用來劃分區塊展示,而且可以拖動,非常不錯,地址是:https://github.com/antoniandre/splitpanes

這個組件的Demo展示地址如下所示:https://antoniandre.github.io/splitpanes

效果大概如下所示

  npm 安裝如下所示

npm i --S splitpanes

安裝成功后,然後在vue文件的script部分裏面引入即可

import { Splitpanes, Pane } from 'splitpanes'
import 'splitpanes/dist/splitpanes.css'

它的使用代碼也很簡單

<splitpanes style="height: 400px">
  <pane min-size="20">1</pane>
  <pane>
    <splitpanes horizontal>
      <pane>2</pane>
      <pane>3</pane>
      <pane>4<pane>
    </splitpanes>
  </pane>
  <pane>5</pane>
</splitpanes>

我的列表界面使用了兩個Panel即可實現左側樹的展示,和右側常規列表查詢的處理。

  

2、下拉框樹列表的處理

除了常規的樹列表展示內容外,我們也需要一個在下拉列表中展示樹內容的界面組件。

這裏又得引入一個第三方的界面組件,因此Element的Select組件不支持樹列表。

GitHub地址:https://github.com/riophae/vue-treeselect

官網地址:https://vue-treeselect.js.org/

NPM安裝:

npm install --save @riophae/vue-treeselect

界面代碼如下所示。

<template>
  <div id="app">
    <treeselect v-model="value" :multiple="true" :options="options" />
  </div>
</template>

這裏的value就是選中的集合,options則是樹列表的節點數據。

<script>
  // import the component
  import Treeselect from '@riophae/vue-treeselect'
  // import the styles
  import '@riophae/vue-treeselect/dist/vue-treeselect.css'

  export default {
    // register the component
    components: { Treeselect },
    data() {
      return {
        // define the default value
        value: null,
        // define options
        options: [ {
          id: 'a',
          label: 'a',
          children: [ {
            id: 'aa',
            label: 'aa',
          }, {
            id: 'ab',
            label: 'ab',
          } ],
        }, {
          id: 'b',
          label: 'b',
        }, {
          id: 'c',
          label: 'c',
        } ],
      }
    },
  }
</script>

我的測試界面代碼如下所示

          <div style="height:180px">
            <!--
                v-model 綁定選中的集合
                options 樹節點數據
                 defaultExpandLevel 展開層次,Infinity為所有
                 flat 為子節點不影響父節點,不關聯
             -->
            <treeselect
              v-model="value"
              :options="treedata"
              :multiple="true"
              :flat="true"
              :default-expand-level="Infinity"
              :open-on-click="true"
              :open-on-focus="true"
              clearable
              :max-height="200"
            />
          </div>
<script>
// import vue-treeselect component
import Treeselect from '@riophae/vue-treeselect'
// import the styles
import '@riophae/vue-treeselect/dist/vue-treeselect.css'

export default {
  name: 'Tree',
  components: { Treeselect },
  data() {
    return {
      // 過濾條件
      filterText: '',
      // 初始化樹列表
      treedata: [
        {
          label: '一級 1',
          id: '1',
          children: [{
            id: '1-1',
            label: '二級 1-1',
            children: [{
              label: '三級 1-1-1',
              id: '1-1-1'
            }, {
              label: '三級 1-1-2',
              id: '1-1-2'
            }, {
              label: '三級 1-1-3',
              id: '1-1-3'
            }]
          }]
        }
      ],
      value: ['1-1-2']
    }
  },
................
}
</script>

來一張幾個樹列表一起的對比展示界面。

 以上就是普通樹列表和下拉列表樹展示的界面效果,往往我們一些特殊的界面處理,就需要多利用一些封裝良好的第三方界面組件實現,可以豐富我們的界面展示效果。

 

列出以下前面幾篇隨筆的連接,供參考:

循序漸進VUE+Element 前端應用開發(1)— 開發環境的準備工作

循序漸進VUE+Element 前端應用開發(2)— Vuex中的API、Store和View的使用

循序漸進VUE+Element 前端應用開發(3)— 動態菜單和路由的關聯處理

循序漸進VUE+Element 前端應用開發(4)— 獲取後端數據及產品信息頁面的處理

循序漸進VUE+Element 前端應用開發(5)— 表格列表頁面的查詢,列表展示和字段轉義處理

循序漸進VUE+Element 前端應用開發(6)— 常規Element 界面組件的使用

循序漸進VUE+Element 前端應用開發(7)— 介紹一些常規的JS處理函數

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

【其他文章推薦】

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

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

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

※回頭車貨運收費標準

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

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

Java併發編程實戰總結 (一)

前提

首先該場景是一個酒店開房的業務。為了朋友們閱讀簡單,我把業務都簡化了。
業務:開房後會添加一條賬單,添加一條房間排期記錄,房間排期主要是為了房間使用的時間不衝突。如:賬單A,使用房間1,使用時間段為2020-06-01 12:00 – 2020-06-02 12:00 ,那麼還需要使用房間1開房的時間段則不能與賬單A的時間段衝突。

業務類

為了簡單起見,我把幾個實體類都簡化了。

賬單類

public class Bill {
    // 賬單號
    private String serial;

    // 房間排期id
    private Integer room_schedule_id;
    // ...get set
}

房間類

// 房間類
public class Room {
    private Integer id;

    // 房間名
    private String name;
    // get set...
}

房間排期類

import java.sql.Timestamp;

public class RoomSchedule {
    private Integer id;
    
    // 房間id
    private Integer roomId;

    // 開始時間
    private Timestamp startTime;

    // 結束時間
    private Timestamp endTime;
    // ...get set
}

實戰

併發實戰當然少不了Jmeter壓測工具,傳送門: https://jmeter.apache.org/download_jmeter.cgi
為了避免有些小夥伴訪問不到官網,我上傳到了百度雲:鏈接:https://pan.baidu.com/s/1c9l3Ri0KzkdIkef8qtKZeA
提取碼:kjh6

初次實戰(sychronized)

第一次進行併發實戰,我是首先想到sychronized關鍵字的。沒辦法,基礎差。代碼如下:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;

import java.sql.Timestamp;

/**
 * 開房業務類
 */
@Service
public class OpenRoomService {
    @Autowired
    DataSourceTransactionManager dataSourceTransactionManager;
    @Autowired
    TransactionDefinition transactionDefinition;

    public void openRoom(Integer roomId, Timestamp startTime, Timestamp endTime) {
        // 開啟事務
        TransactionStatus transaction = dataSourceTransactionManager.getTransaction(transactionDefinition);
        try {
            synchronized (RoomSchedule.class) {
                if (isConflict(roomId, startTime, endTime)) {
                    // throw exception
                }
                // 添加房間排期...
                // 添加賬單

                // 提交事務
                dataSourceTransactionManager.commit(transaction);
            }
        } catch (Exception e) {
            // 回滾事務
            dataSourceTransactionManager.rollback(transaction);
            throw e;
        }
    }

    public boolean isConflict(Integer roomId, Timestamp startTime, Timestamp endTime) {
        // 判斷房間排期是否有衝突...
    }
}
  1. sychronized(RoomSchedule.class),相當於的開房業務都是串行的。不管開房間1還是房間2。都需要等待上一個線程執行完開房業務,後續才能執行。這並不好哦。
  2. 事務必須在同步代碼塊sychronized中提交,這是必須的。否則當線程A使用房間1開房,同步代碼塊執行完,事務還未提交,線程B發現房間1的房間排期沒有衝突,那麼此時是有問題的。

錯誤點: 有些朋友可能會想到都是串行執行了,為什麼不把synchronized關鍵字寫到方法上?
首先openRoom方法是非靜態方法,那麼synchronized鎖定的就是this對象。而Spring中的@Service註解類是多例的,所以並不能把synchronized關鍵字添加到方法上。

二次改進(等待-通知機制)

因為上面的例子當中,開房操作都是串行的。而實際情況使用房間1開房和房間2開房應該是可以并行才對。如果我們使用synchronized(Room實例)可以嗎?答案是不行的。
在第三章 解決原子性問題當中,我講到了使用鎖必須是不可變對象,若把可變對象作為鎖,當可變對象被修改時相當於換鎖,這裏的鎖講的就是synchronized鎖定的對象,也就是Room實例。因為Room實例是可變對象(set方法修改實例的屬性值,說明為可變對象),所以不能使用synchronized(Room實例)
在這次改進當中,我使用了第五章 等待-通知機制,我添加了RoomAllocator房間資源分配器,當開房的時候需要在RoomAllocator當中獲取鎖資源,獲取失敗則線程進入wait()等待狀態。當線程釋放鎖資源則notiryAll()喚醒所有等待中的線程。
RoomAllocator房間資源分配器代碼如下:

import java.util.ArrayList;
import java.util.List;

/**
 * 房間資源分配器(單例類)
 */
public class RoomAllocator {
    private final static RoomAllocator instance = new RoomAllocator();

    private final List<Integer> lock = new ArrayList<>();

    private RoomAllocator() {}

    /**
     * 獲取鎖資源
     */
    public synchronized void lock(Integer roomId) throws InterruptedException {
        // 是否有線程已佔用該房間資源
        while (lock.contains(roomId)) {
            // 線程等待
            wait();
        }

        lock.add(roomId);
    }

    /**
     * 釋放鎖資源
     */
    public synchronized void unlock(Integer roomId) {
        lock.remove(roomId);
        // 喚醒所有線程
        notifyAll();
    }

    public static RoomAllocator getInstance() {
        return instance;
    }
}

開房業務只需要修改openRoom的方法,修改如下:

    public void openRoom(Integer roomId, Timestamp startTime, Timestamp endTime) throws InterruptedException {
        RoomAllocator roomAllocator = RoomAllocator.getInstance();
        // 開啟事務
        TransactionStatus transaction = dataSourceTransactionManager.getTransaction(transactionDefinition);
        try {
            roomAllocator.lock(roomId);
            if (isConflict(roomId, startTime, endTime)) {
                // throw exception
            }
            // 添加房間排期...
            // 添加賬單

            // 提交事務
            dataSourceTransactionManager.commit(transaction);
        } catch (Exception e) {
            // 回滾事務
            dataSourceTransactionManager.rollback(transaction);
            throw e;
        } finally {
            roomAllocator.unlock(roomId);
        }
    }

那麼此次修改后,使用房間1開房和房間2開房就可以并行執行了。

總結

上面的例子可能會有其他更好的方法去解決,但是我的實力不允許我這麼做….。這個例子也是我自己在項目中搞事情搞出來的。畢竟沒有實戰經驗,只有理論,不足以學好併發。希望大家也可以在項目中搞事情[壞笑],當然不能瞎搞。
後續如果在其他場景用到了併發,也會繼續寫併發實戰的文章哦~

個人博客網址: https://colablog.cn/

如果我的文章幫助到您,可以關注我的微信公眾號,第一時間分享文章給您

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

【其他文章推薦】

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

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

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

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

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

※回頭車貨運收費標準

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

Python 圖像處理 OpenCV (7):圖像平滑(濾波)處理

前文傳送門:

「Python 圖像處理 OpenCV (1):入門」

「Python 圖像處理 OpenCV (2):像素處理與 Numpy 操作以及 Matplotlib 显示圖像」

「Python 圖像處理 OpenCV (3):圖像屬性、圖像感興趣 ROI 區域及通道處理」

「Python 圖像處理 OpenCV (4):圖像算數運算以及修改顏色空間」

「Python 圖像處理 OpenCV (5):圖像的幾何變換」

「Python 圖像處理 OpenCV (6):圖像的閾值處理」

1. 引言

第一件事情還是先做名詞解釋,圖像平滑到底是個啥?

從字面意思理解貌似圖像平滑好像是在說圖像滑動。

emmmmmmmmmmmmmmm。。。。

其實半毛錢關係也沒有,圖像平滑技術通常也被成為圖像濾波技術(這個名字看到可能大家會有點感覺)。

每一幅圖像都包含某種程度的噪聲,噪聲可以理解為由一種或者多種原因造成的灰度值的隨機變化,如由光子通量的隨機性造成的噪聲等等。

而圖像平滑技術或者是圖像濾波技術就是用來處理圖像上的噪聲,其中,能夠具備邊緣保持作用的圖像平滑處理,成為了大家關注的重點。

這不廢話,處理個圖片降噪,結果把整個圖像搞的跟玻璃上糊上了一層水霧一樣,這種降噪有啥意義。

本文會介紹 OpenCV 中提供的圖像平滑的 4 個算法:

  • 均值濾波
  • 方框濾波
  • 高斯濾波
  • 中值濾波

下面開始一個一個看吧:)

先給出一個給馬里奧加噪聲的程序,程序來源於楊老師的博客:https://blog.csdn.net/Eastmount/article/details/82216380 ,完整代碼如下:

import cv2 as cv
import numpy as np

# 讀取圖片
img = cv.imread("maliao.jpg", cv.IMREAD_UNCHANGED)
rows, cols, chn = img.shape

# 加噪聲
for i in range(5000):
    x = np.random.randint(0, rows)
    y = np.random.randint(0, cols)
    img[x, y, :] = 255

cv.imshow("noise", img)

# 圖像保存
cv.imwrite("maliao_noise.jpg", img)

# 等待显示
cv.waitKey()
cv.destroyAllWindows()

上面這段程序實際上是在圖片上隨機加了 5000 個白點,這個噪聲真的是夠大的了。

2. 2D 圖像卷積

在介紹濾波之前先簡單介紹下 2D 圖像卷積,圖像卷積其實就是圖像過濾。

圖像過濾的時候可以使用各種低通濾波器( LPF ),高通濾波器( HPF )等對圖像進行過濾。

低通濾波器( LPF )有助於消除噪聲,但是會使圖像模糊。

高通濾波器( HPF )有助於在圖像中找到邊緣。

OpenCV 為我們提供了一個函數 filter2D() 來將內核與圖像進行卷積。

我們嘗試對圖像進行平均濾波, 5 x 5 平均濾波器內核如下:

\[ K = \frac{1}{25} \begin{bmatrix} 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \end{bmatrix} \]

具體操作如下:

我們保持這個內核在一個像素上,將所有低於這個內核的 25 個像素相加,取其平均值,然後用新的平均值替換中心像素。它將對圖像中的所有像素繼續此操作,完整的示例代碼如下:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

# 讀取圖片
img = cv.imread("maliao_noise.jpg", cv.IMREAD_UNCHANGED)
rgb_img = cv.cvtColor(img, cv.COLOR_BGR2RGB)

kernel = np.ones((5,5),np.float32)/25

dst = cv.filter2D(rgb_img, -1, kernel)

titles = ['Source Image', 'filter2D Image']
images = [rgb_img, dst]

for i in range(2):
    plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])

plt.show()

可以看到,噪點確實去除掉了,就是圖片變得模糊起來。

3. 均值濾波

均值濾波是指任意一點的像素值,都是周圍 N * M 個像素值的均值。

其實均值濾波和上面的那個圖像卷積的示例,做了同樣的事情,我只是用 filter2D() 這個方法手動完成了均值濾波,實際上 OpenCV 為我們提供了專門的均值濾波的方法,前面圖像卷積沒有看明白的同學,可以再一遍均值濾波,我盡量把這個事情整的明白的。

還是來畫個圖吧:

中間那個紅色的方框裏面的值,是周圍 25 個格子區域中的像素的和去除以 25 ,這個公式是下面這樣的:

\[ K = \frac{1}{25} \begin{bmatrix} 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \end{bmatrix} \]

我為了偷懶,所有的格子裏面的像素值都寫成 1 ,畢竟 n / n 永遠都等於 1 ,快誇我機智。

上面這個 5 * 5 的矩陣稱為核,針對原始圖像內的像素點,採用核進行處理,得到結果圖像。

這個核我們可以自定義大小,比如 5 * 5 ,3 * 3 , 10 * 10 等等,具體定義多大完全看療效。

OpenCV 為我提供了 blur() 方法用作實現均值濾波,原函數如下:

def blur(src, ksize, dst=None, anchor=None, borderType=None)
  • kSize: 內核參數,其實就是圖片進行卷積的時候相乘的那個矩陣,具體的卷積是如何算的,網上有很多,我這裏就不介紹了,所得到的圖像是模糊的,而且圖像其實是按照原來的比例缺少了(原圖像-內核參數+1)^2 個單元格。
  • anchor: Point 類型,即錨點,有默認值 Point(-1, -1) ,當坐標為負值,就表示取核的中心。
  • borderType: Int 類型,用於推斷圖像外部像素的某種邊界模式,有默認值 BORDER_DEFAULT 。

接下來是均值濾波的示例代碼:

import cv2 as cv
import matplotlib.pyplot as plt

# 讀取圖片
img = cv.imread("maliao_noise.jpg", cv.IMREAD_UNCHANGED)
rgb_img = cv.cvtColor(img, cv.COLOR_BGR2RGB)

# 均值濾波
blur_img = cv.blur(rgb_img, (3, 3))
# blur_img = cv.blur(img, (5, 5))
# blur_img = cv.blur(img, (10, 10))
# blur_img = cv.blur(img, (20, 20))

titles = ['Source Image', 'Blur Image']
images = [rgb_img, blur_img]

for i in range(2):
    plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])

plt.show()

這個降噪的效果好像沒有前面 2D 卷積的那個降噪效果好,但是圖像更為清晰,因為我在這個示例中使用了更小的核 3 * 3 的核,順便我也試了下大核,比如代碼中註釋掉的 10 * 10 的核或者 20 * 20 的核,實時證明,核越大降噪效果越好,但是相反的是圖像會越模糊。

4. 方框濾波

方框濾波和均值濾波核基本一致,其中的區別是需不需要進行歸一化處理。

什麼是歸一化處理等下再說,我們先看方框濾波的原函數:

def boxFilter(src, ddepth, ksize, dst=None, anchor=None, normalize=None, borderType=None)
  • src: 原始圖像。
  • ddepth: Int 類型,目標圖像深度,通常用 -1 表示與原始圖像一致。
  • kSize: 內核參數。
  • dst: 輸出與 src 大小和類型相同的圖像。
  • anchor: Point 類型,即錨點,有默認值 Point(-1, -1) 。
  • normalize: Int 類型,表示是否對目標圖像進行歸一化處理。

當 normalize 為 true 時,需要執行均值化處理。

當 normalize 為 false 時,不進行均值化處理,實際上是求周圍各像素的和,很容易發生溢出,溢出時均為白色,對應像素值為 255 。

完整示例代碼如下:

import cv2 as cv
import matplotlib.pyplot as plt

# 讀取圖片
img = cv.imread('maliao_noise.jpg')
source = cv.cvtColor(img, cv.COLOR_BGR2RGB)

# 方框濾波
result = cv.boxFilter(source, -1, (5, 5), normalize = 1)

# 显示圖形
titles = ['Source Image', 'BoxFilter Image']
images = [source, result]

for i in range(2):
    plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])

plt.show()

當我們把 normalize 的屬性設為 0 時,不進行歸一化處理,結果就變成了下面這個樣子:

5. 高斯濾波

為了克服簡單局部平均法的弊端(圖像模糊),目前已提出許多保持邊緣、細節的局部平滑算法。它們的出發點都集中在如何選擇鄰域的大小、形狀和方向、參數加平均及鄰域各店的權重係數等。

在高斯濾波的方法中,實際上是把卷積核換成了高斯核,那麼什麼是高斯核呢?

簡單來講就是方框還是那個方框,原來每個方框裏面的權是相等的,大家最後取平均,現在變成了高斯分佈的,方框中心的那個權值最大,其餘方框根據距離中心元素的距離遞減,構成一個高斯小山包,這樣取到的值就變成了加權平均。

下圖是所示的是 3 * 3 和 5 * 5 領域的高斯核。

高斯濾波是在 OpenCV 中是由 GaussianBlur() 方法進行實現的,它的原函數如下:

def GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)
  • sigmaX: 表示 X 方向方差。

這裏需要注意的是 ksize 核大小,在高斯核當中,核 (N, N) 必須是奇數, X 方向方差主要控制權重。

完整的示例代碼如下:

import cv2 as cv
import matplotlib.pyplot as plt

# 讀取圖片
img = cv.imread('maliao_noise.jpg')
source = cv.cvtColor(img, cv.COLOR_BGR2RGB)

# 方框濾波
result = cv.GaussianBlur(source, (3, 3), 0)

# 显示圖形
titles = ['Source Image', 'GaussianBlur Image']
images = [source, result]

for i in range(2):
    plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])

plt.show()

6. 中值濾波

在使用鄰域平均法去噪的同時也使得邊界變得模糊。

而中值濾波是非線性的圖像處理方法,在去噪的同時可以兼顧到邊界信息的保留。

中值濾波具體的做法是選一個含有奇數點的窗口 W ,將這個窗口在圖像上掃描,把窗口中所含的像素點按灰度級的升或降序排列,取位於中間的灰度值來代替該點的灰度值。

下圖是一個一維的窗口的濾波過程:

在 OpenCV 中,主要是通過調用 medianBlur() 來實現中值濾波,它的原函數如下:

def medianBlur(src, ksize, dst=None)

中值濾波的核心數和高斯濾波的核心數一樣,必須要是大於 1 的奇數。

示例代碼如下:

import cv2 as cv
import matplotlib.pyplot as plt

# 讀取圖片
img = cv.imread('maliao_noise.jpg')
source = cv.cvtColor(img, cv.COLOR_BGR2RGB)

# 方框濾波
result = cv.medianBlur(source, 3)

# 显示圖形
titles = ['Source Image', 'medianBlur Image']
images = [source, result]

for i in range(2):
    plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])

plt.show()

可以明顯看到,目前中值濾波是對原圖像降噪后還原度最高的,常用的中值濾波的圖形除了可以使用方框,還有十字形、圓形和環形,不同形狀的窗口產生不同的濾波效果。

方形和圓形窗口適合外輪廓線較長的物體圖像,而十字形窗口對有尖頂角狀的圖像效果好。

對於一些細節較多的複雜圖像,可以多次使用不同的中值濾波。

7. 示例代碼

如果有需要獲取源碼的同學可以在公眾號回復「OpenCV」進行獲取。

8. 參考

https://blog.csdn.net/Eastmount/article/details/82216380

http://www.woshicver.com/

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

【其他文章推薦】

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

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

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

※回頭車貨運收費標準

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

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

09_EM算法

  今天是2020年3月5日星期四。預計開學時間不會早於四月初,真是好消息,可以有大把的時間整理知識點(實際上發文章的時間都6月6號了,希望9月份能開學啊,不耽誤找工作~)。每次導師找,整個人會變的特別煩躁,煩躁加不安,其它事情一點都做不下去,焦慮。改小論文這幾天耽誤了一些時間,查了些EM算法的例子,怎樣理解這個算法呢?通過這周的學習,覺得數學公式有點唬人,但卻是理解該算法最好的形式。

  剛開始對這個算法一無所知,通過知乎、CSDN看資料,看白板視頻,看講解例子。越看例子越覺得負擔重,因為要先把例子理解了,再去理解這個知識點。例子不能徹底理解,知識點也走不下去,倒不如一遍一遍的看數學公式。看完了公式,再去看例子,朦朦朧朧的就懂了。之後再去看白板視頻,絕對是不一樣的體驗。

  先看別人的視頻,然後自己去推導公式,你會覺得困難摸不到頭腦;先自己去推導公式,再去看別人視頻,你會覺得心曠神怡一目瞭然。第一種做法,往往看視頻的時候就是懵懵噠,抓不住別人講述的重點;第二種做法,類似於先學會了九陽神功,再去和別人切磋武藝。初心是將《統計學習方法》這本書做詳細的心得筆記,現在有點鬆動,希望能堅持下去。

 GitHub:https://github.com/wangzycloud/statistical-learning-method

 EM算法

引入

  EM算法應該作為一種通用的求解方法,用於含有隱變量的概率模型參數的極大似然估計。拆開來看,這句話是應用在概率模型上的;用來估計概率模型的參數;類似於極大似然估計;求解的是含有隱變量的概率模型。那麼問題來了,什麼是該有隱變量的概率模型?概率模型是什麼樣子?極大似然估計?該方法是怎麼進行計算的呢?

  通常來講,EM算法是一種迭代算法,每次迭代由兩步組成:E步,求期望;M步:求極大,所以該算法被稱為期望極大算法。說該算法可以作為一種通用的求解方法,原因在於:該算法不是NBM、LR、SVM這類解決相應場景的模型,而是可以用於求解含有隱變量概率模型的參數估計。

  提到模型,腦子里第一印象有判別模型、生成模型。這裏的概率模型自然和判別模型、生成模型不在同一個層次。在我的理解里,概率模型是類似於樸素貝恭弘=叶 恭弘斯算法這種,用概率來表示最後的分類標準;而不是感知機、SVM這種利用確信度來表達分類結果的模型。再考慮一下樸素貝恭弘=叶 恭弘斯算法,特徵向量里的隨機變量X,以及表示類別的隨機變量Y,都是可以被觀測到變量。在所有隨機變量都可以觀測到的情況下,我們可以利用極大似然估計來求解模型的參數。對於含有隱變量的概率模型,要如何求解呢?含有隱變量意味着不能觀測到數據的全部狀況,也就沒有辦法直接利用極大似然估計來求解。

  現在看到的EM算法,就是一種求解含有隱變量的概率模型參數的極大似然估計方法。

EM算法

  書本上三硬幣模型,挺好的~代碼已整理到github中,實際上就是把書本公式用代碼實現出來…難度不大。

   文中提到,該問題沒有解析解,只有通過迭代的方法進行求解。仔細觀察一下公式(9.4),log(x)作用在公式(9.3)上,很明顯log連乘可以變成連加,但連加式子中的每個項仍然是連加式。好像是因為這個原因,就無法得到解析解了。個人對數學不感冒,只能硬性的記住“不容易求解析解”這點,至於原因,實在是搞不懂啊。雖然無法得到解析解,但我們可以通過EM算法求解,大致步驟如下:

   一般的,用Y表示觀測隨機變量的數據,Z表示隱隨機變量的數據,Y和Z連在一起稱為完全數據,觀測數據Y又稱為不完全數據。假設給定觀測數據Y,其概率分佈是P(Y|θ),其中θ是需要估計的模型參數,那麼不完全數據Y的似然函數是P(Y|θ),對數似然函數L(θ)=logP(Y|θ),假設Y和Z的聯合概率分佈是P(Y,Z|θ),那麼完全數據的對數似然函數是logP(Y,Z|θ)。

  EM算法通過迭代求解L(θ)=logP(Y|θ)的極大似然估計,每次迭代由兩個步驟:E步,M步組成。

  文中對Q函數做了具體解釋:

   關於EM算法的幾點說明,應該挺好理解的吧。步驟(1),迭代求解的方式需要一步步接近極值,是在某個解的基礎上,進一步求解。在最開始的時候,初值是任意選擇的,並且正是因為初值任意選擇,容易陷入局部極值,也就是對初值的選擇非常敏感(對比一下梯度下降的過程)。步驟(2),我們要清楚,求解的對象是變元參數θ。步驟(3),極大化的過程,詳見下圖~(θ,L(θ))圖像。步驟(4),迭代停止條件。

  EM算法的導出、收斂性,以及推廣詳見下圖吧~搞了四五天,弄了個流程…

GMM高斯混合模型

   書中公式一大堆,不太友好,手寫代碼的過程,就是把書本公式復現了一遍。難度不大,我認為需要先了解GMM模型是啥,再通過例子,熟悉一下計算過程,就可以掌握了。

  還是從生成數據的角度看,由GMM模型生成一個數據,是要根據一個普通的多項式分佈αk,來選擇第k個高斯分佈,分兩步生成數據。但是,這裏獲得的數據,並不知道來自第幾個αk,這就是隱變量了。

   對於高斯混合模型的參數估計,可以通過EM算法求解。

  1.明確隱變量,寫出完全數據的對數似然函數。

  2.EM算法的E步:確定Q函數。

  3.確定EM算法的M步。

  具體公式(9.26)-公式(9.32)就不一一摘錄了,github已復現。算法描述如下:

  本節整理的內容有些水…

代碼效果

 

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

【其他文章推薦】

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

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

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

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

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

※回頭車貨運收費標準

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

德動物園面臨斷炊 列安樂死名單

摘錄自2020年4月16日醒報報導

自德國於3月15日下達封城令後,遊客銳減,新明斯特動物園財務吃緊,為了解決動物捱餓的問題,園方已列出緊急應變方案,考慮將部分動物安樂死,並宰殺作為其他動物的食物。

柏林動物園協會(VdZ)強調,動物園在休館期間無法大幅削減開支,每日仍須支出一定人力與金錢成本餵食並照顧動物,維持宜居的環境及溫度條件,一旦失去門票收入,便面臨龐大財務壓力。德國政府已推出高達7500億歐元的紓困方案,VdZ也已籲請總理梅克爾撥款1億歐元,作為動物園產業的緊急支應金。

國際新聞
德國
動物園
展示動物
動物福利

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

【其他文章推薦】

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

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

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

※回頭車貨運收費標準

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

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

新發現 澳科學家在2009年南極冰核中發現微塑膠 附近磷蝦恐吃下肚

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

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

【其他文章推薦】

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

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

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

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

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

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

※回頭車貨運收費標準