Salesforce LWC學習(十八) datatable展示 image

本篇參看:

https://developer.salesforce.com/docs/component-library/bundle/lightning-datatable/documentation

https://www.lightningdesignsystem.com/components/data-tables/

我們在salesforce中,經常會使用 listview,標準的 lightning listview會有排序,filter展示chart等等標準功能。當然,某些情況標準搞定不了情況下,我們便需要使用自定義的開發。自定義開發我們就可以使用 lightning-datatable組件。一個 lightning-datatable組件用來展示表格數據,它可以根據數據類型展示每一列。比如一個 email類型的字段會展示一個點開以後是一個 mail:to的超鏈接。默認展示的類型是text類型。那 lightning-datatable有哪些特性呢?

  • 展示和格式化焗油適當類型的列
  • 具有無限滾動行功能
  • 指定的數據類型允許 inline編輯
  • 可以定義header的action
  • 可以定義行級別的action
  • 重置每一列展示的大小
  • 選擇行操作
  • 指定的列通過升序或者降序排列
  • 文字換行和剪切
  • 對行進行編號
  • 設置單元格對齊方式

lightning-datatable有很多屬性,其他的請自行查看文檔,這裏只例舉幾個核心屬性或者方法。比較核心的如下:

  • columns:一組列的object用來定義數據類型,這個object有很多的屬性,其中有幾個必填的配置: label & fieldName & type。分別對應着字段的展示名稱,字段的API name以及字段的類型,不同的字段類型將會自動的轉換成不同的展示形式,默認是text。其他的屬性我們後期會有簡單介紹。
  • data:一組數據用來展示,通常 comulns設置表單的頭以及每個單元列的類型,data設置內容;
  • hide-checkbox-column:標籤用來設定是否展示左側的checkbox,值為true/false,true即隱藏checkbox;
  • selected-rows:用來初始化時展示哪些行是被選中的;
  • key-field:用來指定每行的unique id;
  • getSelectedRows:這個是lightning-datatable提供的方法,用來獲取哪些行用戶選中的。

簡單介紹完畢,下面通過幾點來慢慢帶入datatable的功能。

一. 基礎 Datatable展示數據

demo中展示,我們來看官方提供的一個demo。

dataTableExample1.html:用來展示一個 datatable,我們看到屬性中的data / columns / key-field都是上面描述過的, onrowselection方法為當有行選擇的時候的調用

<template>
    <lightning-datatable
            data={data}
            columns={columns}
            key-field="id"
            onrowselection={getSelectedName}>
    </lightning-datatable>
</template>

 dataTableExample1.js:有兩種方式可以獲取選擇的行信息,demo中有兩個。datatable有一個標準事件rowselection,調用以後可以通過event.detail.

selectedRows獲取選中的行的信息,另外一種就是找到datatable然後調用其getSelectedRows方法。

除此之外,我們看到columns的設置方式,除了 label / fieldName / type這三個基礎信息以外,還可以看到有 typeAttributes 以及 cellAttributes兩種設置。

  • typeAttributes:用於對指定的列的類型格式化dataCell,不同的type可能擁有不同的設置。salesforce針對不同的type可以設置不同的 typeAttributes,這裏不再詳細展開,具體查看文檔;
  • cellAttributes:typeAttributes用於設置針對 type的格式化,cellAttributes通常用於列中附加圖標信息,設置圖標位置等信息。
import { LightningElement } from 'lwc';

const columns = [
     {label: 'Opportunity name', fieldName: 'opportunityName', type: 'text'},
     {label: 'Confidence', fieldName: 'confidence', type: 'percent', cellAttributes:{ iconName: { fieldName: 'trendIcon' }, iconPosition: 'right' }},
     {label: 'Amount', fieldName: 'amount', type: 'currency', typeAttributes: { currencyCode: 'EUR'}},
     {label: 'Contact Email', fieldName: 'contact', type: 'email'},
     {label: 'Contact Phone', fieldName: 'phone', type: 'phone'},
];

const data = [{
                    id: 'a',
                    opportunityName: 'Cloudhub',
                    confidence: 0.2,
                    amount: 25000,
                    contact: 'jrogers@cloudhub.com',
                    phone: '2352235235',
                    trendIcon: 'utility:down'
                },
                {
                    id: 'b',
                    opportunityName: 'Quip',
                    confidence: 0.78,
                    amount: 740000,
                    contact: 'quipy@quip.com',
                    phone: '2352235235',
                    trendIcon: 'utility:up'
                }];

export default class DatatableExample1 extends LightningElement {
    data = data;
    columns = columns;

    getSelectedName(event) {
        //兩種方式獲取選中的行,第一種是使用 event.detail.selectedRows,另外一種是使用querySelector找到 lightning-datatable,然後使用datatable封裝的方法
        //const selectedRows = event.detail.selectedRows;
        const dataTable = this.template.querySelector('lightning-datatable');
        const selectedRows = dataTable.getSelectedRows();
        // Display that fieldName of the selected rows
        for (let i = 0; i < selectedRows.length; i++){
            console.log("You selected: " + selectedRows[i].opportunityName);
        }
    }
}

 簡單展示效果如下:

 二. datatable中展示父表中的字段值

上個demo中簡單介紹了datatable的使用,數據全是寫死的demo,接下來通過一個包含後台的邏輯進行datatable展示數據。

DataTableExampleController:用於獲取 Case表中的相關字段以及其父表的字段

public with sharing class DataTableExampleController {
    @AuraEnabled(cacheable=true)
    public static List<Case> getCaseList(){
        List<Case> caseList = [SELECT Id,CaseNumber,Account.Name,
                                    Priority,Status
                                FROM Case
                                LIMIT 100];
        return caseList;
    }
}

datatableExample2.js:用於展示相關的字段,通過wire adapter獲取後台數據放在data中

import { LightningElement, track, wire } from 'lwc';
import getCaseList from '@salesforce/apex/DataTableExampleController.getCaseList';
const COLUMNS = [
    {label: 'Case Number', fieldName: 'CaseNumber', type: 'text'},
    {label: 'Account Name', fieldName: 'Account.Name', type: 'text'},
    {label: 'Priority', fieldName: 'Priority', type: 'text'},
    {label: 'Status', fieldName: 'Status', type: 'text'}
];
export default class DataTableExample2 extends LightningElement {
    columns = COLUMNS;
    @track datas;

    @wire(getCaseList)
    wiredCaseList({ error, data }) {
        if(data) {
            this.datas = data;
        } else if(error) {
            //TODO
            console.log(JSON.stringify(error));
        }
    }
}

dataTableExample.html:展示datatable

<template>
    <lightning-datatable
            data={datas}
            columns={columns}
            key-field="id"
            >
    </lightning-datatable>
</template>

結果展示:通過下圖我們可以看到,其他的字段可以正常展示,但是父表的數據獲取確實失敗的。

 來剖析一下原因,datatable針對columns的fieldName只支持一級結構的獲取,針對獲取父的方式沒法通過 各種點的方式獲取到,那麼如何獲取呢,查看下面的方式,我們對js的代碼進行一下改動。按照下面的步驟兩步走的修改。

 結果展示:我們可以看到 Account Name列的值也順利的展示出來了,按照這種操作做一個拓展,其實我們也可以去做一些字段間的邏輯操作拼出一個符合我們邏輯的列,不僅僅局限於獲取父的對象值這種簡單操作。

 三. 實現datatable展示 formula類型是圖片的功能

自己看文檔的小夥伴可能發現datatable的columns的type沒有類似 image類型,但是在object field創建時我們很容易創建一些IMAGE的字段,那樣的話使用標準的datatable便無法展示,那要如何操作呢?還好lwc提供了一個自定義類型的操作。首先我們在Case表裡面新增一個formula 字段,展示圖片。

 接下來一步接着一步搞定。

dataTableWithImage.js:這裏需要繼承 LightningDatatable,並且引入 imageRow.html,其用於做template

import LightningDatatable from 'lightning/datatable';
import imageRow from './imageRow.html';
export default class DataTableWithImage extends LightningDatatable {
    static customTypes = {
        image: {
            template: imageRow
        }
    };
}

imageRow.html:默認要求 imageRow需要和 dataTableWithImage在同一個目錄下,如果不在一個目錄,需要改上面的文件目錄信息。

<template>
    <c-data-table-image-template
        url={value}
        >
    </c-data-table-image-template>
</template>

dataTableImageTemplate.html:用來通過 img標籤展示圖片

<template>
    <img src={url} class="image"/>
</template>

dataTableImageTemplate.css:用來設置圖片大小的初始值,這種是一種偷懶的方式,正常應該通過 attribute注入進來指定大小的寬和高。

.image {
  height: 30px;
  width: 30px;
}

dataTableImageTemplate.js

import { LightningElement,api } from 'lwc';

export default class DataTableImageTemplate extends LightningElement {
    @api url;
}

OK,通過上面的這些步驟我們實現和繼承了自定義的datatable組件。接下來是調用操作。我們在class裏面搜索一下Priority_Image__c這個字段,apexClass這裏不再寫。

dataTableExample3.js:這裡有幾個關鍵點。

  • 設置 type為 image類型,image類型是我們上文自定義創建的
  • 對 formula類型進行解析,找到他的src部分。比如針對<img src=”/resource/priority/priority/medium.png” alt=”Priority Flag” border=”0″/>這個字符串,我們需要的是/resource/priority/priority/medium.png這個字符串
import { LightningElement, track, wire } from 'lwc';
import getCaseList from '@salesforce/apex/DataTableExampleController.getCaseList';

const COLUMNS = [
    {label: 'Case Number', fieldName: 'CaseNumber', type: 'text'},
    {label: 'Account Name', fieldName: 'AccountName', type: 'text'},
    {label: 'Priority', fieldName: 'Priority', type: 'text'},
    { label: 'Priority Image',fieldName:'Priority_Image__c',type: 'image' },
    {label: 'Status', fieldName: 'Status', type: 'text'}
];
export default class DataTableExample3 extends LightningElement {
    columns = COLUMNS;
    @track datas;

    @wire(getCaseList)
    wiredCaseList({ error, data }) {
        if(data) {
            //this.datas = data;
            let resultList = [];
            let objectTemp;
            data.forEach(item => {
                objectTemp = Object.assign({},item);
                if(item.Account) {
                    objectTemp.AccountName = item.Account.Name;
                }

                const srcIndex = objectTemp.Priority_Image__c.indexOf('src=');
                if(srcIndex !== -1) {
                    const imgSrcSubstring = objectTemp.Priority_Image__c.substring(srcIndex + 5);
                    objectTemp.Priority_Image__c = imgSrcSubstring.substring(0,imgSrcSubstring.indexOf('"'))
                }
                console.log(JSON.stringify(objectTemp));
                resultList.push(objectTemp);
            });
            this.datas = resultList;
        } else if(error) {
            //TODO
            console.log(JSON.stringify(error));
        }
    }
}

dataTableExample3.html

<template>
    <c-data-table-with-image
                    key-field="id"
                    data={datas}
                    columns={columns}
                    >
                </c-data-table-with-image>
</template>

結果展示:針對不同的Priority展示其對應的formula的圖片。

總結:篇中講了datatable的簡單的應用以及相應的擴展,datatable很強悍,這裏不逐點講述,感興趣的可以自行查看 inline edit,action等操作。篇中有錯誤地方歡迎指出,有不懂的歡迎留言。

後記:工作原因這篇博客準備了好久才成型,不知不覺學了半年的lwc的開發,也整理總結了一些博客供自己和他人學習。前半年的主旋律大部分時間都在學習lwc,後半年的時間大部分會放在考證和學習其他技術,不出意外應該是今年的最後一篇lwc的博文。有其他lwc的問題歡迎留言探討,希望各位salesforce開發者可以養成獨立思考的能力,先思考,在查,最後再問。加油!

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

【其他文章推薦】

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

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

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

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

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

Spring Cloud Alibaba系列(五)sentinel實現服務限流降級

一、sentinel是什麼

sentinel的官方名稱叫分佈式系統的流量防衛兵。Sentinel 以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。在Spring Cloud項目中最開始我們使用的是Hystrix,目前已停止更新了。現在Spring Cloud官方推薦的是rensilience4j。當然還有我們今天學習的sentinel。

Sentinel 具有以下特徵:

  • 豐富的應用場景:Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺(即突發流量控制在系統容量可以承受的範圍)、消息削峰填谷、集群流量控制、實時熔斷下游不可用應用等。
  • 完備的實時監控:Sentinel 同時提供實時的監控功能。您可以在控制台中看到接入應用的單台機器秒級數據,甚至 500 台以下規模的集群的匯總運 行情況。
  • 廣泛的開源生態:Sentinel 提供開箱即用的與其它開源框架/庫的整合模塊,例如與 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相應的依賴並進行簡單的配置即可快速地接入 Sentinel。
  • 完善的 SPI 擴展點:Sentinel 提供簡單易用、完善的 SPI 擴展接口。您可以通過實現擴展接口來快速地定製邏輯。例如定製規則管理、適配動態數據源等。

二、sentinel實現限流

2.1 安裝sentinel控制台

  • 下載地址:https://github.com/alibaba/Sentinel/releases

這裏我們直接下載jar包即可,下載后通過命令行啟動:

java -jar sentinel-dashboard-1.7.2.jar
  • 默認端口:8080
  • 默認用戶名:sentinel
  • 默認密碼:sentinel

啟動成功后,我們瀏覽器訪問http://localhost:8080,出現如下界面。

2.2 微服務繼承sentinel

  • 引入sentinel依賴
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
  • 添加sentinel的相關配置
server:
  port: 7003
spring:
  application:
    name: sentinel-provider
  cloud:
	nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080
  • 提供個接口用來測試限流
@SpringBootApplication
public class SentinelApplication {

    public static void main(String[] args) {
        SpringApplication.run(SentinelApplication.class, args);
    }
}

@RestController
class TestController{
    @GetMapping("/test")
    public String test(){
        return "hello! sentinel!";
    }
}

我們請求幾次這個接口后,打開sentinel控制台,就可以實時監控到這個sentinel-provider服務接口調用情況了。

2.3 配置限流規則

我們這裏做一個簡單的規則配置:

  • 閥值類型:QPS

  • 單機閥值:2

意思就是:該接口每秒最多允許進入兩個請求。

點擊新增后,在流控規則里發現了一條規則:

現在,我們繼續請求3次這個接口。第三次響應的內容如下:

Blocked by Sentinel (flow limiting)

我們打開控制台發現拒絕了一條請求。

三、Sentinel規則介紹

不管是限流還是降級,它都是按照某種規則進行的,下面具體介紹一下sentinel支持的幾種規則。

3.1 流控規則

流量控制,其原理是監控應用流量的QPS(每秒查詢率) 或併發線程數等指標,當達到指定的閾值時

對流量進行控制,以避免被瞬時的流量高峰衝垮,從而保障應用的高可用性。

資源名:唯一名稱,默認是請求路徑,可自定義

針對來源:指定對哪個微服務進行限流,默認指default,意思是不區分來源,全部限制

閾值類型/單機閾值

  • QPS(每秒請求數量): 當調用該接口的QPS達到閾值的時候,進行限流

  • 線程數:當調用該接口的線程數達到閾值的時候,進行限流

3.2 降級規則

降級規則就是當滿足什麼條件時,對服務降級——即將請求轉發到另外接口上,這個接口與業務無關,只是為了保證系統的完整性。

  • RT(平均響應時間) :當資源的平均響應時間超過閾值(以 ms 為單位)之後,資源進入准降級狀態。如果接下來 1s 內持續進入 5 個請求,它們的 RT都持續超過這個閾值,那麼在接下的時間窗口(以 s 為單位)之內,就會對這個方法進行服務降級。

    注意 Sentinel 默認統計的 RT 上限是 4900 ms,超出此閾值的都會算作 4900 ms,若需要變更此上限可以通過啟動配置項 -Dcsp.sentinel.statistic.max.rt=xxx 來配置。

  • 異常比例:當資源的每秒異常總數占通過量的比值超過閾值之後,資源進入降級狀態,即在接下的時間窗口(以 s 為單位)之內,對這個方法的調用都會自動地返回。異常比率的閾值範圍是 [0.0,1.0]。

  • 異常數 :當資源近 1 分鐘的異常數目超過閾值之後會進行服務降級。注意由於統計時間窗口是分鐘級別的,若時間窗口小於 60s,則結束熔斷狀態后仍可能再進入熔斷狀態。

3.3 熱點規則

熱點規則允許將規則具體到參數上。

我們用個例子來看看效果。

  • 編寫接口
@GetMapping("/myTest")
@SentinelResource("test3")
public String test123(String name,String age){
    return  name + "----"+ age;
}
  • 添加規則
  • 運行效果

結果显示,第一個參數被限流了,而第二個參數正常。

3.4 系統規則

系統保護規則是從應用級別的入口流量進行控制,從單台機器的總體 Load、RT、入口 QPS 、CPU使用率和線程數五個維度監控應用數據,讓系統盡可能跑在最大吞吐量的同時保證系統整體的穩定性。

系統保護規則是應用整體維度的,而不是資源維度的,並且僅對入口流量 (進入應用的流量) 生效。

  • Load(僅對 Linux/Unix-like 機器生效):當系統 load1 超過閾值,且系統當前的併發線程數超過系統容量時才會觸發系統保護。系統容量由系統的 maxQps * minRt 計算得出。設定參考值一般是 CPU cores * 2.5。

  • RT:當單台機器上所有入口流量的平均 RT 達到閾值即觸發系統保護,單位是毫秒。

  • 線程數:當單台機器上所有入口流量的併發線程數達到閾值即觸發系統保護。

  • 入口 QPS:當單台機器上所有入口流量的 QPS 達到閾值即觸發系統保護。

  • CPU使用率:當單台機器上所有入口流量的 CPU使用率達到閾值即觸發系統保護。

3.5 授權規則

很多時候,我們需要根據調用來源來判斷該次請求是否允許放行,這時候可以使用 Sentinel 的來源問控制的功能。來源訪問控制根據資源的請求來源(origin)限制資源是否通過:

  • 若配置白名單,則只有請求來源位於白名單內時才可通過;

  • 若配置黑名單,則請求來源位於黑名單時不通過,其餘的請求通過。

流控應用:sentinel提供了RequestOriginParser來處理接口來源。

我們運行abc來源的請求訪問/test接口。

@Component
class requestOrigin implements RequestOriginParser{

    @Override
    public String parseOrigin(HttpServletRequest httpServletRequest) {
        String server = httpServletRequest.getParameter("server");
        return server;
    }
}

我們請求http://localhost:7003/test?server=abc 和 http://localhost:7003/test?server=ab來分別看看效果。

@SentinelResource的使用

@SentinelResource 用於定義資源,並提供可選的異常處理和 fallback 配置項。

主要參數有以下幾個

屬性 作用
value 資源名稱
entryType entry類型,標記流量的方向,取值IN/OUT,默認是OUT
blockHandler 處理BlockException的函數名稱,函數要求:1. 必須是 public;2.返回類型 參數與原方法一致;3. 默認需和原方法在同一個類中。若希望使用其他類的函數,可配置blockHandlerClass ,並指定blockHandlerClass裏面的方法。
blockHandlerClass 存放blockHandler的類,對應的處理函數必須static修飾。
fallback 1. 返回類型與原方法一致;2. 參數類型需要和原方法相匹配;3. 默認需和原方法在同一個類中。若希望使用其他類的函數,可配置fallbackClass
fallbackClass 存放fallback的類。對應的處理函數必須static修飾。
defaultFallback 若同時配置了 fallback 和 defaultFallback,以fallback為準。
exceptionsToIgnore 指定排除掉哪些異常。排除的異常不會計入異常統計,也不會進入fallback邏輯,而是原樣拋出。
exceptionsToTrace 需要trace的異常

@sentinelResource可結合blockHandler用於限流處理,結合fallback用於降級處理。具體規則可通過sentinel控制台配置,具體我就不演示了,在下一章內容中,我會分別演示限流和降級的應用。

public class MySentinelResource {

    @SentinelResource(value="message",blockHandler="blockHandler",fallback="fallback")
    public String message(String str){
        if(StringUtils.isBlank(str)){
            throw new RuntimeException();
        }
        return str;
    }
    /**
     * 限流處理
     * @param str
     * @param ex
     * @return
     */
    public String blockHandler(String str, BlockedException ex){
        return str + "--"+ ex;
    }
    /**
     * 降級處理
     * @param str
     * @return
     */
    public String fallback(String str){
        return null;
    }
}

代碼示例

gitee:https://gitee.com/zhixie/spring-cloud-alibaba-learning/tree/master/sentinel-server

github:https://github.com/binzh303/spring-cloud-alibaba-learning/tree/master/sentinel-server

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

【其他文章推薦】

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

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

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

※幫你省時又省力,新北清潔一流服務好口碑

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

特斯拉:將調整以符合中國充電標準

美國電動車大廠特斯拉(Tesla)表示,在中國發布全國電動車充電標準後,該公司將修改新生產的車輛,以便用戶可在符合新標準的充電設施,享受充電服務。    特斯拉在中文網站發布公告:「特斯拉將全面支持新國標,修改新生產車輛以符合新國標的規定… 隨著未來幾年中國充電基礎設施的飛速發展,特斯拉用戶將徹底消除對於充電的顧慮。」    特斯拉的充電規格和中國不相容,是消費者不敢購買電動車的一大阻力。不過,中國當局對此尚未提出明確的時間表,電動車充電的新標準何時出爐仍不得而知。

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

【其他文章推薦】

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

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

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

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

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

深圳電動車熱:東部公交今年將投放565輛純電動車

5月13日,深圳市坪山新區召開新區公交業務座談會,東部公交公司計畫在2015年投放565輛純電動車輛,並將於近期採取公開招標的方式選定車輛更新解決方案。   東部公交公司在坪山新區內運營的公交線路有61條,運力1043台。坪山新區的500米公交網站覆蓋率為92%,公交線路基本覆蓋至坪山新區每個社區。   而目前,東部公交公司在坪山新區運營的新能源線路共16條,運力309輛,占東部公交新能源總運力的35%,其中純電動大巴150輛,混合動力大巴159輛。   2014年東部公交公司在坪山新區投放了134輛純電動大巴。根據坪山新區內運營的線路現狀,東部公交將繼續加大在坪山新區投放新能源車輛的力度,計畫2015年內在坪山新區投放70輛新能源車輛。

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

【其他文章推薦】

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

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

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

※幫你省時又省力,新北清潔一流服務好口碑

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

氣候變遷衝擊 2050年前全球經濟損失恐達241兆元

摘錄自2019年11月20日中央通訊社綜合報導

最新分析報告顯示,隨著越來越多的旱澇災情和農作物歉收,危及經濟成長,威脅基礎建設,氣候變遷恐直接造成2050年前全球經濟損失7.9兆美元(約新台幣241兆元)。

英國經濟學人資訊社(EIU)今天(20日)公布氣候變遷韌性指數(Climate Change Resilience Index),發現以當前趨勢來看,氣溫暖化帶來的衝擊在2050年以前,將讓全球經濟成長下滑3%。這項指數用來衡量全球82大經濟體的準備程度。

氣候變遷引發的極端氣候事件頻傳,這項報告評估各國暴露在氣候變遷帶來的損失,結果發現非洲地區風險最高,區域國內生產毛額(GDP)恐因此萎縮4.7%。

世界最大經濟體美國被認為是受到衝擊程度最小的國家之一。但經濟學人資訊社提到,美國總統川普的政策代表在對抗氣候變遷戰爭中「短暫地倒退」。

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

【其他文章推薦】

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

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

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

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

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

人為噪音是全球污染源 研究:軟體動物也受害

摘錄自2019年11月20日中央通訊社報導

一份20日公布的研究報告指出,人為噪音應被視同「全球主要污染源」,參與研究的英國女皇大學(Queen’s University Belfast)科學家刊登在英國皇家學會(Royal Society)生物學通訊(Biology Letters)的文章指出:「我們發現噪音可影響許多種兩棲和節肢動物、鳥類、魚類、哺乳類、軟體動物和爬蟲類。」

這份研究顯示,人為噪音充斥人類生活環境,來源包括都市人口密集區的交通工具和工業設施、飛機和船艇,例如船艇的螺旋槳運轉聲可對鯨類的聲納傳播造成干擾,並因此導致迷失方向的鯨群大規模擱淺。

針對多項個別研究進行整合分析,科學家孔克(Hansjoerg Kunc)和施密特(Rouven Schmidt)得出結論:多數物種對噪音有反應,並非只有少數物種對噪音特別敏感。孔克警告,人為噪音整體而言仍嚴重干擾自然環境。研究人員也提到,人為噪音污染和動物對噪音污染的反應必須放在生態系統的整體脈絡中檢視,尤其是在研議保育措施時。

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

【其他文章推薦】

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

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

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

※幫你省時又省力,新北清潔一流服務好口碑

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

Linux系統如何使用Fuser命令

本文不再更新,可能存在內容過時的情況,實時更新請訪問原地址:Linux系統如何使用Fuser命令;

什麼是Fuser命令?

fuser命令是一個非常聰明的unix實用程序,用於查找正在使用某個文件、目錄或socket的進程。 它還提供有關擁有該進程的用戶和訪問類型的信息。。fuser工具显示了使用指定文件或文件系統的每個進程的進程ID(PID)。

安裝

如果你的精簡版運行fuser提示如下信息:

-bash: fuser: command not found

請執行如下命令安裝:

[winbert@winbert-server ~]$ sudo yum -y install psmisc

如何使用fuser命令?

man命令可用於查看任何命令的幫助手冊,但是學習新知識(尤其是linux命令)的最佳方法是通過閱讀真實的示例,並且不斷地在終端中鍵入命令。 在終端中運行以下命令,以獲取有關fuser實用程序的使用選項的信息。

[winbert@winbert-server ~]$ fuser
No process specification given
Usage: fuser [-fMuvw] [-a|-s] [-4|-6] [-c|-m|-n SPACE] [-k [-i] [-SIGNAL]] NAME...
       fuser -l
       fuser -V
Show which processes use the named files, sockets, or filesystems.

  -a,--all              display unused files too
  -i,--interactive      ask before killing (ignored without -k)
  -k,--kill             kill processes accessing the named file
  -l,--list-signals     list available signal names
  -m,--mount            show all processes using the named filesystems or block device
  -M,--ismountpoint     fulfill request only if NAME is a mount point
  -n,--namespace SPACE  search in this name space (file, udp, or tcp)
  -s,--silent           silent operation
  -SIGNAL               send this signal instead of SIGKILL
  -u,--user             display user IDs
  -v,--verbose          verbose output
  -w,--writeonly        kill only processes with write access
  -V,--version          display version information
  -4,--ipv4             search IPv4 sockets only
  -6,--ipv6             search IPv6 sockets only
  -                     reset options

  udp/tcp names: [local_port][,[rmt_host][,[rmt_port]]]

如何查看使用某個目錄的進程

fuser序可以與-v選項一起使用,該選項以詳細模式運行該工具。 verbose選項用於在計算機屏幕上生成詳細輸出,因此用戶可以實時查看實用程序正在執行的操作。

[winbert@winbert-server ~]$ fuser -v .
                     USER        PID ACCESS COMMAND
/home/winbert:       winbert    1435 ..c.. bash

上面的輸出显示,以詳細模式運行時,fuser會提供有關USERPIDACCESSCOMMAND的信息。 ACCESS下的c字符表示訪問類型,表示“當前目錄”。 訪問類型很多,例如e(正在運行的可執行文件),r(根目錄),f(打開文件。在默認显示模式下省略f),F(用於寫入的打開文件,在默認显示模式下省略F)和 m(mmap文件或共享庫)。

查看使用你tcp或udp套接字的進程?

有時您需要使用TCP和UDP套接字查找進程。 為了查找這些進程,需要使用-n選項。 -n選項用於選擇相應的名稱空間。

[root@huidukongjian-h4 docker]# fuser -v -n tcp 80
                     USER        PID ACCESS COMMAND
80/tcp:              root      27411 F.... docker-proxy

默認情況下,fuser將同時在IPv6和IPv4套接字中查找,但是可以使用-4-6選項更改默認選項。 -4選項代表IPv4-6選項代表IPv6。 請注意,fuser僅將PID輸出到stdout,其他所有內容都發送到stderr。

fuser -v -n tcp 80命令的結果显示,使用docker的進程的進程ID為27411,而用於啟動該進程的命令為docker-proxy。 進程ID(PID)可以以多種方式使用,其中之一是進程終止。 與PID一起使用時,kill命令根據該進程ID終止進程。 fuser還可用於終止訪問特定文件的進程。 在以下命令中,-k選項用於終止正在使用在端口123上運行的tcp偵聽器的進程。為確保用戶不會殺死錯誤的進程,使用-i選項詢問用戶是否 在終止進程之前進行確認。

fuser -k  123/tcp

使用帶有-i選項的fuser -k命令在終止進程之前要求用戶進行確認。 用戶可以用y回答“是”,或者用N回答不殺死進程。

fuser -i -k 123/tcp
123/tcp:             12216
Kill process 12216 ? (y/N)
Use The -6 Option To Look For IPv6 Sockets.

以下命令以詳細模式使用fuser,並嘗試查找在端口123上運行的IPv6套接字。

fuser -v -n tcp -6 123

查找佔用某個文件系統的進程

-m選項可與fuser命令一起使用,以查找訪問文件文件系統上文件的進程。 此選項需要文件名作為輸入參數。 -m選項非常有用,尤其是當用於發現正在訪問文件系統的進程並標識要殺死的進程時。

以下命令显示所有訪問“ example.txt”所在的文件系統的進程。 仔細查看-m選項如何與fuser一起使用。

[root@huidukongjian-h4 docker]# fuser -v -m data/v2/config.json 
                     USER        PID ACCESS COMMAND
/root/docker-v2/data/v2/config.json:
                     root     kernel mount /
                     root          1 .rce. systemd
                     root          2 .rc.. kthreadd
                     root          3 .rc.. rcu_gp
                     root          4 .rc.. rcu_par_gp
                     root          6 .rc.. kworker/0:0H-kbl
                     root          8 .rc.. mm_percpu_wq
                     root          9 .rc.. ksoftirqd/0
                     root         10 .rc.. rcu_sched
                     root         11 .rc.. migration/0
                     root         12 .rc.. watchdog/0
                     root         13 .rc.. cpuhp/0
                     root         16 .rc.. netns
                     root         17 .rc.. kauditd
                     root         18 .rc.. khungtaskd
                     root         19 .rc.. oom_reaper
                     root         20 .rc.. writeback
                     root         21 .rc.. kcompactd0
                     root         22 .rc.. ksmd
                     root         23 .rc.. khugepaged
                     root         24 .rc.. crypto
                     root         25 .rc.. kintegrityd
                     root         26 .rc.. kblockd
                     root         27 .rc.. tpm_dev_wq
                     root         28 .rc.. md
                     root         29 .rc.. edac-poller
                     root         30 .rc.. watchdogd
                     root         42 .rc.. kswapd0
                     root         93 .rc.. kthrotld
                     root         94 .rc.. acpi_thermal_pm
                     root         95 .rc.. kmpath_rdacd
                     root         96 .rc.. kaluad
                     root         97 .rc.. ipv6_addrconf
                     root         98 .rc.. kstrp
                     root        326 .rc.. scsi_eh_0
                     root        327 .rc.. scsi_tmf_0
                     root        329 .rc.. kworker/0:1H-kbl
                     root        361 .rc.. ata_sff
                     root        363 .rc.. scsi_eh_1
                     root        365 .rc.. scsi_tmf_1
                     root        366 .rc.. scsi_eh_2
                     root        367 .rc.. scsi_tmf_2
                     root        387 .rc.. xfsalloc
                     root        390 .rc.. xfs_mru_cache
                     root        391 .rc.. xfs-buf/vda1
                     root        394 .rc.. xfs-data/vda1
                     root        395 .rc.. xfs-conv/vda1
                     root        396 .rc.. xfs-cil/vda1
                     root        397 .rc.. xfs-reclaim/vda
                     root        398 .rc.. xfs-log/vda1
                     root        399 .rc.. xfs-eofblocks/v
                     root        400 .rc.. xfsaild/vda1
                     root        486 .rce. systemd-journal
                     rpc         541 .rce. rpcbind
                     root        543 Frce. auditd
                     root        545 .rce. sedispatch
                     root        558 .rc.. rpciod
                     root        559 .rc.. kworker/u3:0
                     root        561 .rc.. xprtiod
                     root        582 Frce. sssd
                     polkitd     585 .rce. polkitd
                     root        589 .rce. rngd
                     dbus        593 frce. dbus-daemon
                     chrony      612 .rce. chronyd
                     root        652 Frce. sssd_be
                     root        668 Frce. sssd_nss
                     root        671 .rc.. ttm_swap
                     root        672 .rc.. nfit
                     root        675 frce. systemd-logind
                     root        683 Frce. gssproxy
                     root        740 frce. NetworkManager
                     root        743 Frce. tuned
                     root        814 frce. systemd-udevd
                     root        889 frce. sshd
                     root        890 Frce. rsyslogd
                     root        895 frce. agetty
                     root        898 frce. crond
                     root        899 frce. agetty
                     root      21821 .rc.. kworker/u2:0-flu
                     root      25475 frce. sshd
                     root      25480 .rce. systemd
                     root      25485 frce. (sd-pam
                     root      25491 frce. sshd
                     root      25492 frce. bash
                     root      25705 Frce. containerd
                     root      25706 Frce. dockerd
                     root      26375 .rc.. kworker/u2:1-eve
                     root      27251 Fr.e. containerd-shim
                     root      27267 F...m v2
                     root      27273 Fr.e. containerd-shim
                     root      27295 ....m sh
                     root      27400 .rce. docker-proxy
                     root      27411 .rce. docker-proxy
                     root      27416 Fr.e. containerd-shim
                     root      27432 ....m sh
                     root      27478 ....m sh
                     root      27479 F...m nginx
                     root      27480 ....m sleep
                     (unknown)  27481 F...m nginx
                     root      27561 ....m sleep
                     root      27705 .rc.. kworker/0:0-xfs-
                     root      27765 .rc.. kworker/0:1-xfs-
                     root      27836 .rc.. kworker/0:2-even
                     root      27860 frce. sshd
                     root      27883 frce. sshd
                     sshd      27884 frce. sshd

fuser還可用於將特定指令發送到某個進程。 當與-k選項一起使用時,fuser命令將KILL指令發送給進程。 有很多指令可以發送給運行中的進程,-l選項有助於查找可以與fuser一起使用的指令列表。

[root@huidukongjian-h4 docker]# fuser -l
HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT
CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL PWR SYS

本文不再更新,可能存在內容過時的情況,實時更新請訪問原地址:Linux系統如何使用Fuser命令;

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

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

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

※帶您來看台北網站建置台北網頁設計,各種案例分享

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

GraphicsLab Project 之 Screen Space Planar Reflection

作者:i_dovelemon

日期:2020-06-23

主題:Screen Space Planar Reflection, Compute Shader

引言

        前段時間,同事發來一篇講述特化版本的 Screen Space Reflection 實現 Planar Reflection 的文章。出於好奇,實驗了下,看看效果如何。如下是目前實現出來的基礎版本的效果:

 原理

        對於上圖來說, Water Plane 表示水面,上半部分為實際場景的山體,下半部分為以水面為鏡像進行反射之後的山體效果。

        對於山體上某一個點(圖中白色點)來說,它對應的鏡像點為黃色點。

        我們可以從 Screen Position 以及 Depth Texture 信息,計算出來白點的世界坐標位置 WorldPosition

        然後可以以 Water Plane 所在的平面對該 WorldPosition 作鏡像操作,得到 ReflectionPosition

        得到 ReflectionPosition 之後,我們就能夠計算出來 ReflectionPostion 所對應的屏幕坐標 Reflection Screen Position

        根據前面的操作,我們就可以知道,此時 Reflection Screen Position 所反射的顏色即為 Screen Positon 所表示的顏色。

        基礎原理十分簡單,但是實際實現的時候,會發現有很多問題。接下里一一講述。

問題

閃爍

        根據上面的原理,可以想到,有多個像素可能會被反射到相同的位置,如下圖所示:

         這樣由於 GPU 執行順序的不確定性,就會導致畫面出現閃爍,如下所示:

        針對這樣的問題,我們實際需要的反射點是最近的反射點。可以考慮使用 HLSL 中提供的 InterlockedMin/InterlockedMax (參考[1],[2]) 之類的指令,在寫入數據時進行大小比較,從而實現保存最近反射點的功能。

        前面的指令雖然能夠實現大小比較,以此進行排序。但是根據前面的描述,我們實際保存的是反射點的顏色。沒有辦法只根據顏色進行排序,所以我們需要保存其他便於排序的信息,這裏選擇使用反射點的 Screen Position。並且按照如下方式進行編碼,從而實現獲取最近反射點的效果:

                        uint2 SrcPosPixel = uint2(DepthPos.x, DepthPos.y);
                        uint2 ReflPosPixel = ReflPosUV * uint2(ReflectWidth, ReflectHeight);

                        int Hash = SrcPosPixel.y << 16 | SrcPosPixel.x;
                        int dotCare = 0;
                        InterlockedMin(HashResult[ReflPosPixel], Hash, dotCare);

Encode and Sort

孔洞

        根據先前算法的描述,我們知道,我們先要根據 Depth 信息和 Screen Position 信息計算出 World Positon,然後鏡像之後,在轉化為新的屏幕坐標。在這一系列操作中,由於數值計算的不精確性,導致有些地方沒有存儲到有效的反射點位置信息,從而導致最終显示時畫面上有孔洞的情況,如下圖所示:

        幸運的是,從結果看這些孔洞並不會聚集在一起,形成大塊的黑塊。對於這種情況,我們只要在生成反射貼圖的時候,檢測到沒有保存有效位置信息時,遍歷下周圍的像素,尋找到一個擁有有效像素的值即可解決這個問題,如下代碼所示:

        uint Hash = HashTexture[id.xy].x;
        if (Hash == 0x0FFFFFFF)
            Hash = HashTexture[uint2(id.x, id.y + 1)].x;
        if (Hash == 0x0FFFFFFF)
            Hash = HashTexture[uint2(id.x, id.y - 1)].x;
        if (Hash == 0x0FFFFFFF)
            Hash = HashTexture[uint2(id.x + 1, id.y)].x;
        if (Hash == 0x0FFFFFFF)
            Hash = HashTexture[uint2(id.x - 1, id.y)].x;

        if (Hash != 0x0FFFFFFF)
        {
            uint x = Hash & 0xFFFF;
            uint y = Hash >> 16;
            ReflectionTexture[id.xy] = ColorTexture[uint2(x, y)];
        }
        else
        {
            ReflectionTexture[id.xy] = float4(0.0f, 0.0f, 0.0f, 0.0f);
        }

Hole

        如下是修正孔洞之後的效果:

實現

        本文的代碼是使用 Unity 實現的,實現起來比較簡單。比較坑的地方在於 Unity 裏面獲取 Projection Matrix 要通過 GL.GetGPUProjectionMatrix (文獻[3]) 轉化一下才能變成傳遞到 GPU 上用於渲染的投影矩陣。如下是功能核心的 Compute Shader 代碼:

// Each #kernel tells which function to compile; you can have many kernels
#pragma enable_d3d11_debug_symbols
#pragma kernel SSPRClear_Main
#pragma kernel SSPRHash_Main
#pragma kernel SSPRResolve_Main

//-----------------------------------------------------------------
float4x4 VPMatrix;
float4x4 InvVPMatrix;
uint Width;
uint Height;
uint ReflectWidth;
uint ReflectHeight;

//--------------------------------------------------------------------
RWTexture2D<int> ClearHashTexture;

[numthreads(8, 8, 1)]
void SSPRClear_Main(uint3 id : SV_DispatchThreadID)
{
    if (id.x < ReflectWidth && id.y < ReflectHeight)
    {
        ClearHashTexture[id.xy] = 0x0FFFFFFF;
    }
}

//---------------------------------------------------------------
Texture2D<float> DepthTex;
RWTexture2D<int> HashResult;

#define DownSampleFactor (1)

float3 Unproject(float3 clip)
{
    float4 clipW = float4(clip, 1.0f);
    clipW = mul(InvVPMatrix, clipW);
    clipW.xyz = clipW.xyz / clipW.w;
    return clipW.xyz;
}

float2 Project(float3 world)
{
    float4 worldW = float4(world, 1.0f);
    worldW = mul(VPMatrix, worldW);
    worldW.xy = worldW.xy / worldW.w;
    worldW.xy = (worldW.xy + float2(1.0f, 1.0f)) / 2.0f;
    return worldW.xy;
}

[numthreads(8, 8, 1)]
void SSPRHash_Main(uint3 id : SV_DispatchThreadID)
{
    for (uint i = 0; i < DownSampleFactor; i++)
    {
        for (uint j = 0; j < DownSampleFactor; j++)
        {
            uint2 DepthPos = uint2(id.x * DownSampleFactor + i, id.y * DownSampleFactor + j);
            if (DepthPos.x < Width && DepthPos.y < Height)
            {
                float depth = DepthTex.Load(int3(DepthPos.x, DepthPos.y, 0)).x;

                if (depth > 0.0f)
                {
                    float2 uv = (DepthPos.xy * 1.0f) / float2(Width, Height);
                    uv = uv * 2.0f - float2(1.0f, 1.0f);
                    uv.y = -uv.y;

                    float3 PosWS = Unproject(float3(uv, depth));

                    if (PosWS.y > 0.0f)
                    {
                        float3 ReflPosWS = float3(PosWS.x, -PosWS.y, PosWS.z);
                        float2 ReflPosUV = Project(ReflPosWS);

                        uint2 SrcPosPixel = uint2(DepthPos.x, DepthPos.y);
                        uint2 ReflPosPixel = ReflPosUV * uint2(ReflectWidth, ReflectHeight);

                        int Hash = SrcPosPixel.y << 16 | SrcPosPixel.x;
                        int dotCare = 0;
                        InterlockedMin(HashResult[ReflPosPixel], Hash, dotCare);
                    }
                }
            }
        }
    }
}

//------------------------------------------------------------------------------
Texture2D<int> HashTexture;
Texture2D<float4> ColorTexture;
RWTexture2D<float4> ReflectionTexture;

[numthreads(8, 8, 1)]
void SSPRResolve_Main(uint3 id : SV_DispatchThreadID)
{
    if (id.x < ReflectWidth && id.y < ReflectHeight)
    {
        uint Hash = HashTexture[id.xy].x;
        if (Hash == 0x0FFFFFFF)
            Hash = HashTexture[uint2(id.x, id.y + 1)].x;
        if (Hash == 0x0FFFFFFF)
            Hash = HashTexture[uint2(id.x, id.y - 1)].x;
        if (Hash == 0x0FFFFFFF)
            Hash = HashTexture[uint2(id.x + 1, id.y)].x;
        if (Hash == 0x0FFFFFFF)
            Hash = HashTexture[uint2(id.x - 1, id.y)].x;

        if (Hash != 0x0FFFFFFF)
        {
            uint x = Hash & 0xFFFF;
            uint y = Hash >> 16;
            ReflectionTexture[id.xy] = ColorTexture[uint2(x, y)];
        }
        else
        {
            ReflectionTexture[id.xy] = float4(0.0f, 0.0f, 0.0f, 0.0f);
        }
    }
}

ScreenSpacePlanarReflection

結論

        本文只是探索這個方法的可能性,更加複雜的實現,更加高效的優化可以參考文獻[4][5],這也是本文主要參考的對象。

        相比於傳統的繪製場景兩邊的方法來說,這個方案的性能更加高效,同時也沒有 SSR 那樣的高需求。在條件滿足的情況下,使用該方案能夠帶來顯著的效果提升,推薦可以嘗試。

        完整代碼在這裏:https://github.com/idovelemon/UnityProj/tree/master/ScreenSpacePlanarReflection

參考文獻

[1] HLSL-InterlockedMax

[2] HLSL-InterlockedMin

[3] GL.GetGPUProjectionMatrix

[4] Screen Space Planar Reflection

[5] Optimized Pixel Projected Reflections for Planar Reflectors

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

【其他文章推薦】

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

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

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

※幫你省時又省力,新北清潔一流服務好口碑

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

歐洲各國豪雨不斷 洪水土石流頻傳

摘錄自2019年11月27日公視報導

美澳野火肆虐,在歐洲則是飽受洪災侵襲,包括義大利、法國和希臘,當地從上個週末以來就豪雨不斷;各地接連發生洪水和土石流災情,至少已經傳出有九人死亡。

有的汽車卡在樹上,有的掉進泥池裡,所有東西都被大水沖得四散各地,連路面也跟著崩塌毀損,每戶民宅裡外都是一片狼藉。這是希臘西部這幾天遭受暴雨襲擊過後的景象,面對天災,居民有苦難言。

當地居民說,「水勢洶洶而來,當我們呼叫人在地下室的孩子時,什麼東西都沒有了,門啊、窗啊,洗衣機都在庭院裡了,你去那邊看看庭院的狀況,原本停了五台車,現在一台也不剩。」類似的豪雨災情,同樣出現在義大利北部,靠近山區的一座高架橋不敵洪水與土石流,應聲斷裂、坍塌,所幸目前沒有發現人員傷亡。

另一個為強降雨所苦的地區是法國南部,其中,瓦爾省境內受到洪患影響最大的幾座城鎮,短短48小時之內就累積了三個月的降雨量。許多地方河川潰堤,導致嚴重淹水,而等到星期一部分地區水位退去之後,有4500個住戶停電。

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

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

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

※帶您來看台北網站建置台北網頁設計,各種案例分享

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

野豬殺人!美德州婦女遭多頭豬隻襲擊慘死

摘錄自2019年11月26日自由時報報導

美國德州錢伯斯郡阿納瓦克(Anahuac)發生罕見的動物襲擊案,幫忙照料一對老夫妻的59歲看護羅林斯(Christine Rollins)於24日上班時間遲遲沒有現身,84歲的屋主等不下去外出查看時,驚見她陳屍在屋外,目前當局認為她遭到多隻野豬攻擊死亡。

據《CNN》報導,錢伯斯郡警長霍桑(Brian Hawthorne)於25日的新聞發布會指出,羅林斯於24日清晨6時至6時30分左右,遭遇不同野豬的襲擊,當時外面天色還很黑。

霍桑指出,這是他從警35年以來所見過最糟糕的事情之一,法醫里弗斯(Selly Rivers)確認現場有多頭豬隻犯案,因為羅林斯身上的咬傷傷口大小不一。

德州公園和野生動物局的資料顯示,成年野豬的體重在100磅至400磅之間(約45.3公斤至181公斤)。霍桑則透露,野豬的確在德州造成問題,但很少出現襲擊人類的案件。

※ 本文與 行政院農業委員會 林務局   合作刊登

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

【其他文章推薦】

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

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

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

※幫你省時又省力,新北清潔一流服務好口碑

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