標籤: 銷售文案

  • 手動造輪子——基於.NetCore的RPC框架DotNetCoreRpc

    手動造輪子——基於.NetCore的RPC框架DotNetCoreRpc

    前言

        一直以來對內部服務間使用RPC的方式調用都比較贊同,因為內部間沒有這麼多限制,最簡單明了的方式就是最合適的方式。個人比較喜歡類似Dubbo的那種使用方式,採用和本地方法相同的方式,把接口層獨立出來作為服務契約,為服務端提供服務,客戶端也通過此契約調用服務。.Net平台上類似Dubbo這種相對比較完善的RPC框架還是比較少的,GRPC確實是一款非常優秀的RPC框架,能跨語言調用,但是每次還得編寫proto文件,個人感覺還是比較麻煩的。如今服務拆分,微服務架構比較盛行的潮流下,一個簡單實用的RPC框架確實可以提升很多開發效率。

    簡介

        隨着.Net Core逐漸成熟穩定,為我一直以來想實現的這個目標提供了便利的方式。於是利用閑暇時間本人手寫了一套基於Asp.Net Core的RPC框架,算是實現了一個自己的小目標。大致的實現方式,Server端依賴Asp.Net Core,採用的是中間件的方式攔截處理請求比較方便。Client端可以是任何可承載.Net Core的宿主程序。通信方式是HTTP協議,使用的是HttpClientFactory。至於為什麼使用HttpClientFactory,因為HttpClientFactory可以更輕鬆的實現服務發現,而且可以很好的集成Polly,很方便的實現,超時重試,熔斷降級這些,給開發過程中提供了很多便利。由於本人能力有限,基於這些便利,站在巨人的肩膀上,簡單的實現了一個RPC框架,項目託管在GitHub上https://github.com/softlgl/DotNetCoreRpc有興趣的可以自行查閱。

    開發環境

    • Visual Studio 2019
    • .Net Standard 2.1
    • Asp.Net Core 3.1.x

    使用方式

        打開Visual Studio先新建一個RPC契約接口層,這裏我起的名字叫IRpcService。然後新建一個Client層(可以是任何可承載.Net Core的宿主程序)叫ClientDemo,然後建立一個Server層(必須是Asp.Net Core項目)叫WebDemo,文末附本文Demo連接,建完這些之後項目結構如下:

    Client端配置

    Client端引入DotNetCoreRpc.Client包,並引入自定義的契約接口層

    <PackageReference Include="DotNetCoreRpc.Client" Version="1.0.2" />
    

    然後可以愉快的編碼了,大致編碼如下

    class Program
    {
        static void Main(string[] args)
        {
            IServiceCollection services = new ServiceCollection();
            //*註冊DotNetCoreRpcClient核心服務
            services.AddDotNetCoreRpcClient()
            //*通信是基於HTTP的,內部使用的HttpClientFactory,自行註冊即可
            .AddHttpClient("WebDemo", client => { client.BaseAddress = new Uri("http://localhost:13285/"); });
    
            IServiceProvider serviceProvider = services.BuildServiceProvider();
            //*獲取RpcClient使用這個類創建具體服務代理對象
            RpcClient rpcClient = serviceProvider.GetRequiredService<RpcClient>();
    
            //IPersonService是我引入的服務包interface,需要提供ServiceName,即AddHttpClient的名稱
            IPersonService personService = rpcClient.CreateClient<IPersonService>("WebDemo");
    
            PersonDto personDto = new PersonDto
            {
                Id = 1,
                Name = "yi念之間",
                Address = "中國",
                BirthDay = new DateTime(2000,12,12),
                IsMarried = true,
                Tel = 88888888888
            };
    
            bool addFlag = personService.Add(personDto);
            Console.WriteLine($"添加結果=[{addFlag}]");
    
            var person = personService.Get(personDto.Id);
            Console.WriteLine($"獲取person結果=[{person.ToJson()}]");
    
            var persons = personService.GetAll();
            Console.WriteLine($"獲取persons結果=[{persons.ToList().ToJson()}]");
    
            personService.Delete(person.Id);
            Console.WriteLine($"刪除完成");
    
            Console.ReadLine();
        }
    }
    

    到這裏Client端的代碼就編寫完成了

    Server端配置

    Client端引入DotNetCoreRpc.Client包,並引入自定義的契約接口層

    <PackageReference Include="DotNetCoreRpc.Server" Version="1.0.2" />
    

    然後編寫契約接口實現類,比如我的叫PersonService

    //實現契約接口IPersonService
    public class PersonService:IPersonService
    {
        private readonly ConcurrentDictionary<int, PersonDto> persons = new ConcurrentDictionary<int, PersonDto>();
        public bool Add(PersonDto person)
        {
            return persons.TryAdd(person.Id, person);
        }
    
        public void Delete(int id)
        {
            persons.Remove(id,out PersonDto person);
        }
    
        //自定義Filter
        [CacheFilter(CacheTime = 500)]
        public PersonDto Get(int id)
        {
            return persons.GetValueOrDefault(id);
        }
    
        //自定義Filter
        [CacheFilter(CacheTime = 300)]
        public IEnumerable<PersonDto> GetAll()
        {
            foreach (var item in persons)
            {
                yield return item.Value;
            }
        }
    }
    

    通過上面的代碼可以看出,我自定義了Filter,這裏的Filter並非Asp.Net Core框架定義的Filter,而是DotNetCoreRpc框架定義的Filter,自定義Filter的方式如下

    //*要繼承自抽象類RpcFilterAttribute
    public class CacheFilterAttribute: RpcFilterAttribute
    {
        public int CacheTime { get; set; }
    
        //*支持屬性注入,可以是public或者private
        //*這裏的FromServices並非Asp.Net Core命名空間下的,而是來自DotNetCoreRpc.Core命名空間
        [FromServices]
        private RedisConfigOptions RedisConfig { get; set; }
    
        [FromServices]
        public ILogger<CacheFilterAttribute> Logger { get; set; }
    
        public override async Task InvokeAsync(RpcContext context, RpcRequestDelegate next)
        {
            Logger.LogInformation($"CacheFilterAttribute Begin,CacheTime=[{CacheTime}],Class=[{context.TargetType.FullName}],Method=[{context.Method.Name}],Params=[{JsonConvert.SerializeObject(context.Parameters)}]");
            await next(context);
            Logger.LogInformation($"CacheFilterAttribute End,ReturnValue=[{JsonConvert.SerializeObject(context.ReturnValue)}]");
        }
    }
    

    以上代碼基本上完成了對服務端業務代碼的操作,接下來我們來看如何在Asp.Net Core中配置使用DotNetCoreRpc。打開Startup,配置如下代碼既可

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton<IPersonService, PersonService>()
            .AddSingleton(new RedisConfigOptions { Address = "127.0.0.1:6379", Db = 10 })
            //*註冊DotNetCoreRpcServer
            .AddDotNetCoreRpcServer(options => {
                //*確保添加的契約服務接口事先已經被註冊到DI容器中
    
                //添加契約接口
                //options.AddService<IPersonService>();
    
                //或添加契約接口名稱以xxx為結尾的
                //options.AddService("*Service");
    
                //或添加具體名稱為xxx的契約接口
                //options.AddService("IPersonService");
    
                //或掃描具體命名空間下的契約接口
                options.AddNameSpace("IRpcService");
    
                //可以添加全局過濾器,實現方式和CacheFilterAttribute一致
                options.AddFilter<LoggerFilterAttribute>();
            });
        }
    
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            //這一堆可以不要+1
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
    
            //添加DotNetCoreRpc中間件既可
            app.UseDotNetCoreRpc();
    
            //這一堆可以不要+2
            app.UseRouting();
    
            //這一堆可以不要+3
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Server Start!");
                });
            });
        }
    }
    

    以上就是Server端簡單的使用和配置,是不是感覺非常的Easy。附上可運行的Demo地址,具體編碼可查看Demo.

    總結

        能自己實現一套RPC框架是我近期以來的一個願望,現在可以說實現了。雖然看起來沒這麼高大上,但是整體還是符合RPC的思想。主要還是想自身實地的實踐一下,順便也希望能給大家提供一些簡單的思路。不是說我說得一定是對的,我講得可能很多是不對的,但是我說的東西都是我自身的體驗和思考,也許能給你帶來一秒鐘、半秒鐘的思考,亦或是哪怕你覺得我哪一句話說的有點道理,能引發你內心的感觸,這就是我做這件事的意義。最後,歡迎大家評論區或本項目GitHub下批評指導。

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

    【其他文章推薦】

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

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

    ※超省錢租車方案

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

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

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

  • 沒有國產主機,怎麼開發:交叉編譯和QEMU虛擬機

    沒有國產主機,怎麼開發:交叉編譯和QEMU虛擬機

    1. 背景

    近期國產化的趨勢越來越濃,包括國產操作系統、國產CPU等。時隔十多年,QQ for Linux也更新了。做為軟件開發人員,“有幸”也需要適配國產化。至於國產化的意義等就不在此討論。

    本文提到的國產主機主要是指使用國產CPU和操作系統的計算機,比如:操作系統是銀河麒麟,CPU是飛騰FT2000。如果需要做適配開發,起碼需要一台對應的主機吧。據說在國產化早期,有錢都難買到機器,需要特殊渠道申請購買。不過,現在購買還是比較方便的。

    通過客戶提供的正規正統的廠家詢價,着實嚇一跳,一台居然要一萬多!!而同等性能配置的windows-x86普通台式主機,才兩三千塊左右,相差有點大呀。本着能省就省的原則,上萬能的某寶看能不能淘一個。真得感謝馬爸爸和深圳華強北,5千多塊,突然感覺肉沒那麼痛了。

    其實完全可以理解,國產的批量肯定很小很小,價格必然是高的。對於不專門開發“國產軟件”的公司來說,買一台使用率比較低的機器不太值得。後面將介紹在沒有國產主機情況下,進行軟件開發的兩種替代方法:交叉編譯和QEMU虛擬機。

    2. 銀河麒麟是什麼

    銀河麒麟操作系統有服務器版本和桌面版本,本文使用的是桌面版本。具體細節看官方的介紹即可,就不做搬運工了。官方說的自主研發、安全可控都不是我們所關心的,我們只需要關心它的內核是什麼,會不會如網上所說根本就是個Ubutun,改個皮膚而已?!。

    先用VMware安裝個虛擬機試試吧,網上找了一個只有X86架構的鏡像包Kylin-4.0.2-desktop-sp2_Community-20171127-x86_64.iso,安裝過程略過,使用命令“uname -a”查一下。

    Linux wrgz-Lenovo 4.11.0-14-generic #20~16.04.1kord0k1-Ubuntu SMP Wed Oct 18 00:56:13 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
    

    看到Ubuntu就放心了,就當它是個Ubuntu Linux就行了。

    3. 飛騰FT2000又是什麼

    通俗點講它就是個CPU,再看看飛騰的官網上的描述。FT-2000系列芯片是基於飛騰片上并行系統(PSoC)體繫結構設計的通用微處理器,兼容ARMv8指令集,兼容支持ARM64和ARM32兩種執行模式。哦嚯,划個重點,簡單點看它就是一個ARMv8的64位CPU。

    划個不考試的重點:對於應用軟件開發者,簡單理解為是在ARMv8架構上的Ubuntu Linux上進行開發軟件;對於普通辦公者,則理解為是仿Windows的Linux系統。

    4. 交叉編譯

    本文提到的軟件開發,是使用C/C++開發無界面的應用軟件,實際上開發和測試都有是可以在Ubuntu上進行。但發布軟件則需要真機編譯或者交叉編譯才能運行。

    很幸運,在上飛騰官網時,發現了飛騰FT2000的技術文檔FT-2000+64Sv1.1.pdf,裏面有介紹到交叉編譯環境。

    • 安裝Ubuntu16.04(可安裝在虛擬機上或 X86電腦裸機上)
    • 安裝成功后,虛擬機 apt 源修改 修改/etc/apt/source.list 內容為如下:
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial universe
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates universe
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial multiverse
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates multiverse
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe > multiverse
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security universe
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security multiverse
    
    • 運行 apt-get update,再運行apt-get install gcc-aarch64-linux-gnu安裝
    • 使用命令aarch64-linux-gnu-gcc –v可以看到gcc版本號為gcc version 5.4.0 20160609

    有了交叉編譯器,編譯是很輕鬆的事。經後續測試,交叉編譯出來的程序,可以在國產真機上運行。

    5. QEMU虛擬機是什麼

    我們經常使用的虛擬機軟件是VMware,擺着這麼好的不用,為什麼選擇QEMU呢。這得從他們的區別說起。

    VMware重點於在一個硬件平台下運行多個操作系統,虛擬硬件平台與宿主硬件架構一致,也就是說虛擬機程序中的指令一般就是宿主CPU指令集,可以直接執行,因此一般速度上也就比較快。

    QEMU的特點是可以虛擬不同的硬件平台架構,比如在X86機器上虛擬出ARM架構的機器。許多基於ARM指令集的Android手機模擬器是基於Qemu的,很適合無真機情況下進行Android開發。當然執行ARM指令,需要轉換成X86指令才能在宿主機器上運行,這樣速度一般會慢點。

    由於本文提到的國產主機就是ARM架構的,VMware並不適用,而QEMU則符合要求。還有一個原因是QEMU支持Windows,只需要一個安裝包,安裝過程簡單,太香了。

    6. QEMU安裝銀河麒麟操作系統

    無獨有偶,鯤鵬處理器也是ARMv8指令集,在華為官網看到詳細的安裝過程,安裝細節可參考https://www.huaweicloud.com/kunpeng/software/qemu.html。

    下面只針對一些重點關注點做些說明。

    • 需要下載一個Arm64架構的麒麟桌面操作系統鏡像包,名字類似Kylin-4.0.2-desktop-sp3-xxxxxxx-arm64.iso。之所以重點提這點,是因為這種鏡像包在網上很難找。有想到用Arm64架構的Ubuntu鏡像包代替,才發現原來官方並沒有提供ARM桌面版的鏡像包(有ARM服務器版)。
    • 原來華為提供的安裝參數有些問題,包括網絡、鼠標、鍵盤參數。這些參數配置不對,會直接影響使用。

    QEMU有一個不太人性化的特點,就是沒有提供類似VMware的界面操作,只能通過命令操作,參數還特別多,網上的資料不多,官方文檔都有是英文的。下面給出三個重要的QEMU命令:創建、安裝、啟動。

    創建
    這個步驟就是創建一個預分配一個大文件,做為虛擬機的磁盤,我比較任性地分配了40G。

    c:\qemu\qemu-img.exe create D:\qemu\vm\kylin\hdd01.img 40G
    

    安裝

    c:\qemu\qemu-system-aarch64.exe -m 4096 -cpu cortex-a72 -smp 2,cores=2,threads=1,sockets=1 -M virt -bios D:\qemu\bios\QEMU_EFI.fd -net nic,model=pcnet -device nec-usb-xhci -device usb-kbd -device usb-mouse -device VGA -drive if=none,file=D:\software\kylin\Kylin-4.0.2-desktop-sp3-19122616.Z1-arm64.iso,id=cdrom,media=cdrom -device virtio-scsi-device -device scsi-cd,drive=cdrom -drive if=none,file=D:\qemu\vm\kylin\hdd01.img,id=hd0 -device virtio-blk-device,drive=hd0
    

    啟動

    c:\qemu\qemu-system-aarch64.exe -m 4096 -cpu cortex-a72 -smp 2,cores=2,threads=1,sockets=1 -M virt -bios D:\qemu\bios\QEMU_EFI.fd -net nic -net tap,ifname=tap0 -device nec-usb-xhci -device usb-kbd -device usb-mouse -device VGA -device virtio-scsi-device -drive if=none,file=D:\qemu\vm\kylin\hdd01.img,id=hd0 -device virtio-blk-device,drive=hd0
    

    安裝和啟動的命令參數差不多,統一說明它們的含義:

    參數 說明
    qemu-system-aarch64.exe 二進制文件,提供模擬aarch64架構的虛擬機進程
    -m 2048 分配2048MB內存
    -M virt 模擬成什麼服務器,我們一般選擇virt就可以了,他會自動選擇最高版本的virt
    -cpu cortex-a72 模擬成什麼CPU,其中cortex-a53\a57\a72都是ARMv8指令集的
    -smp 2,cores=2,threads=1,sockets=1 2個vCPU,這2個vCPU由qemu模擬出的一個插槽(socket)中的2個核心,每個核心支持一個超線程構成
    -bios xxx 指定bios bin所在的路徑
    -device xxx 添加一個設備,參數可重複
    -drive 添加一個驅動器,參數可重複
    -net 添加網絡設備

    QEMU虛擬機怎麼連網
    在Windows上使用qemu虛擬機,使虛擬機能連網,配置方法如下:

    • 在Windows主機上安裝TAP網卡驅動:可下載openvpn客戶端軟件,只安裝其中的TAP驅動;在網絡連接中,會看到一個新的虛擬網卡,屬性類似於TAP-Windows Adapter V9,將其名稱修改為tap0
    • 將虛擬網卡和Windows上真實網卡橋接:選中這兩塊網卡,右鍵,橋接。此時,Windows主機將不能連接互聯網,需要在網橋上配置IP地址和域名等信息,才能使Windows主機連接互聯網。
    • QEMU參數配置:在虛擬機啟動命令行添加以下參數–net nic -net tap,ifname=tap0;tap0為的虛擬網卡名。

    7. 總結

    國產操作系統的使用體驗已經好了很多,輕度辦公室還是可行的,但想替換Windows,太難了。
    QEMU可以虛擬不同的硬件平台架構,是個不錯的虛擬機軟件,而且開源,但在使用體驗方面還是差了一些。

    歡迎關注我的公眾號【林哥哥的編程札記】,謝謝!

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

    【其他文章推薦】

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

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

    ※回頭車貨運收費標準

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

    ※超省錢租車方案

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

  • 寫了個全局變量的bug,被同事們打臉!!!

    寫了個全局變量的bug,被同事們打臉!!!

    話說棧長前陣子寫了一個功能,測試 0 bug 就上線了,上線后也運行好好的,好多天都沒有人反饋bug,超爽。。

    不出問題還好,出問題就是大問題。。

    最近有個客戶反饋某些數據混亂問題,看代碼死活看不出什麼問題,很詭異,再仔細看代碼,原來是一個全局變量的問題,導致在併發情況下出現了線程不安全的問題,事後被同事們打臉!!!

    慎用全局變量,我在公司一直在強調,沒想到這麼低級的問題居然發生在自己身上,說起來真的慚愧啊。。

    最開始使用的是 Spring 注入對象的方式:

    @Autowired
    private Object object;
    

    因為 Spring 默認是單例,所以這樣寫是沒有問題的,後來隨着業務的發展,需要多個不同的業務實例,我改成了這種方式:

    @Setter
    private Object object;
    

    這個 @Setter 是 Lombok 的註解,用來生成 setters 方法,現在想起來,真是低級啊,同時操作的情況下,這個對象肯定會出現覆蓋的情況,從而導致上面說的問題。

    寫了一個這麼低級bug,我也不怕不好意思發出來,大家都謹記一下吧。

    另外,我再總結幾個慎用全局變量的場景:

    1、SimpleDateFormat

    SimpleDateFormat 禁止定義成 static 變量或者全局共享變量,因為它是線程不安全的,都被寫進阿里巴巴的《Java開發手冊》里了:

    為什麼說 SimpleDateFormat 不是線程安全的呢?

    來看下它的 format 方法源碼:

    可以看到 calendar 變量居然也是全局變量,多線程情況下就會存在設置臟變量的情況。

    所以,如果要用 SimpleDateFormat,就在每次用的時候都創建一個 SimpleDateFormat 對象,做到線程間隔離。

    2、資源連接

    資源連接包括數據庫連接、FTP連接、Redis連接等,這種也要慎用全局變量,一量使用全局變量,就會遇到以下問題:

    1)關閉連接的時候,就可能把別人正在操作的連接給關了,導致其他線程的業務中斷;

    2)因為是全局變量,創建的時候可能會創建多個實例,在關閉連接的時候,就可能只關閉了一個對象的連接,造成其他連接沒有被關閉,最後導致連接耗光系統不可用;

    3、数字運算

    這也是個很經典的問題了,如果要用多線程對一個数字進行累加等其他運算處理,千萬不要用全局基礎類型的變量,如下所示:

    private long count;
    

    多線程情況下,某個線程獲取到的值可能已經被其他線程修改了,最後得到的值就不準確了。

    當然,上面的示例可以通過加鎖的方式來解決,也可以使用全局的原子類(java.util.concurrent.atomic.Atom*)進行處理,比如:

    private AtomicInteger count = new AtomicInteger();
    

    注意,這種原子類使用全局變量就沒有線程安全的問題,它使用了 CAS 算法保證了數據一致性。

    不過,阿里推薦使用LongAdder,因為性能更好:

    java.util.concurrent.atomic.LongAdder

    4、全局session

    來看下面的例子:

    @Autowired
    protected HttpSession session;
    

    全局注入一個 Session 對象,在 Spring 中,這樣全局注入使用上面是默認沒問題的,包括 request, response 對象,都可以通過全局注入來獲取。

    這樣會存在線程安全性嗎?

    不會!

    使用這種方式,當 Bean 初始化時,Spring 並沒有注入真實對象,而是注入了一個代理對象,真正使用的時候通過該代理對象獲取真正的對象。

    並且,在注入此類對象時,Spring使用了線程局部變量(ThreadLocal),這就保證了 request/response/session 對象的線程安全性了。

    具體就不展開了,詳細的介紹及測試大家可以點擊這個鏈接查看這篇文章。

    既然是線程安全,但也得小心,如果我在方法中主動使 session 對象失效並重建了:

    session.invalidate();
    session = request.getSession();
    

    這樣,session對象就變成了真實對象了,不再是代理對象,就變成了文章最開始的時候我說的那種多線程安全問題了,如果線上出現 session 會話混亂,用戶 A 就可能看到用戶 B 的數據,你想想可不可怕?

    所以,即使可以這樣使用,也得千萬小心謹慎,最好是在方法級別使用這些對象。

    總結

    今天,棧長總結了一下我是怎麼寫出這個全局變量的低級 bug,也總結了下慎用全局變量的 4 種情況,相信大家多多少都遇到過類似的問題,希望能幫助大家少踩坑。

    全局變量雖好,但我們也得謹慎使用啊,一定要考慮是否引起多線程安全問題,不然會引起重大問題。

    你還遇到過哪些全局變量的問題,歡迎留言分享哦!

    推薦去我的博客閱讀更多:

    1.Java JVM、集合、多線程、新特性系列教程

    2.Spring MVC、Spring Boot、Spring Cloud 系列教程

    3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

    4.Java、後端、架構、阿里巴巴等大廠最新面試題

    覺得不錯,別忘了點贊+轉發哦!

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

    【其他文章推薦】

    ※超省錢租車方案

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

    ※回頭車貨運收費標準

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

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

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

  • 剛果法院首例 12年殺害500多頭大象 盜獵者將蹲30年苦牢

    剛果法院首例 12年殺害500多頭大象 盜獵者將蹲30年苦牢

    環境資訊中心外電;姜唯 翻譯;林大利 審校;稿源:ENS

    剛果共和國刑事法院以殺害國家公園巡守員未遂、販賣盜獵來的象牙、持有武器等多項罪名,判處知名盜獵者和象牙走私者吉拉德(Mobanza Mobembo Gérard)30年徒刑,且必須支付3800萬中非法郎(約台幣199萬元)給受傷的巡守員。

    這是剛果共和國的野生動植走私者首次在刑事法院被定罪。

    吉拉德因殺害國家公園巡守員未遂、販賣盜獵來的象牙、持有武器等多項罪名,遭判處30年徒刑。照片來源:WCS
    新聞稿

    吉拉德帶領集團 在國家公園殺死500多頭大象

    根據調查,人稱蓋瓦尼歐(Guyvanho)的吉拉德帶領一個約25人的盜獵集團。自2008年至今,他們在諾娃貝爾多基國家公園(Nouabalé-Ndoki National Park)一帶殺死了500多頭大象。

    該公園成立於1993年,位於剛果北部省份,周圍是非洲森林象和稀有大型猿類的棲地,包括西部低地大猩猩和東部黑猩猩。

    剛果民主共和國籍的蓋瓦尼歐於2008年前後來到剛果共和國北部。2018年初,他和其他幾名集團成員殺死了11頭大象,被諾娃貝爾多基國家公園巡守員逮個正著,雙方發生駁火。起初蓋瓦尼奧趁亂逃脫,但同夥三名成員被捕。他們的供詞成為對蓋瓦尼歐發出逮捕令的根據。

    除了被殺害的大象數量眾多外,這次事件還顯示該犯罪集團以暴力對抗公權力的傾向,而且公園內外四周的大象盜獵集團行徑越來越囂張。

    2018年5月蓋瓦尼歐被捕,被押在歐耶索省城監獄中等待審判。然而,在2018年6月2日,審判開始前12天,蓋瓦尼歐竟然逃獄了。儘管如此,他的審判仍持續進行,並因缺席被判處5年徒刑加500萬中非法郎(約台幣26萬元)的罰款。

    除了被殺害的大象數量眾多外,這次事件還顯示該犯罪集團以暴力對抗公權力的傾向。照片來源:WCS
    臉書

    蓋瓦尼奧於2019年7月20日再度落網

    法院再次發出逮捕令。蓋瓦尼歐仍然是公園野生動物犯罪部門的通緝要犯,所有曾出沒過的地點都受到監視。這段期間,他曾被目擊繼續參加盜獵活動,每次都與國家公園的巡守員發生槍戰。

    2019年5月31日,一名巡守員返回諾娃貝爾多基國家公園總部途中剛好碰上一群剛收工的盜獵者,蓋瓦尼奧赫然在其中。盜獵者對巡守員開槍,導致兩名巡守員受傷,其中一名重傷,幸好被受過急救訓練的同僚救回。

    蓋瓦尼奧這次又逃走了,但似乎向人吹噓事發經過而走漏了風聲,當局因此再次掌握他新的藏身之處。透過監視行動,蓋瓦尼奧終於在2019年7月20日落網。

    蓋瓦尼奧被送回歐耶索省服刑,並再次嘗試越獄,這次沒有成功。很顯然,蓋瓦尼奧在歐耶索省有強大的後援,極有可能再次越獄。國家公園管理部門於2019年8月成功獲得批准,得以將蓋瓦尼奧和三名同夥轉移到布拉柴維爾監獄。

    學者:此次判決是剛果在野生動植物保護上的重要里程碑

    諾娃貝爾多基國家公園由總部位於紐約的野生動物保護協會(Wildlife Conservation Society, WCS)和剛果共和國政府透過諾娃貝爾多基基金會合作管理,已經長達25年。

    WCS中非地區主任斯托克斯(Emma Stokes)博士說,這名盜獵犯能被繩之以法,靠的是諾娃貝爾多基國家公園野生動物犯罪部門和反盜獵部門三年來的努力,以及和森林經濟部、警方和地方檢察官等的多個有關當局合作的成果。

    「此次判決是剛果共和國刑事法庭在野生動植物保護上一個重要的里程碑。以前所有環境犯罪都是在民事法庭審理的,最高刑期僅五年。今日的判決顯示,野生動植物犯罪不會再被容忍,將從重量刑。」斯托克斯說。

    Congo Imprisons Elephant Poacher for 30 Years BRAZZAVILLE, Republic of Congo, August 22, 2020 (ENS)

     A criminal court in the Republic of Congo has sentenced a notorious poacher and ivory trafficker, Mobanza Mobembo Gérard, alias Guyvanho, to 30 years in prison for the attempted murder of park rangers, trafficking of ivory from poached elephants, possession of military weapons, and other charges. He is also required to pay damages of 38 million Central African Francs (US$68,000) to the injured rangers.

    The 30-year sentence marks the first-ever conviction in the criminal courts of a wildlife trafficker in the Republic of Congo.

    Investigations revealed that Guyvanho led a group of approximately 25 poachers who, based on the number of hunts reported, could have killed upwards of 500 elephants in the area of Nouabalé-Ndoki National Park since 2008.

    Established in 1993, in the northern provinces of Congo, the park is inhabited by forest elephants and rare great apes, including western lowland gorillas and the eastern subspecies of chimpanzees.

    In early 2018, Guyvanho – a citizen of the Democratic Republic of Congo who had arrived in the northern Republic of Congo around 2008 – and several other members of his team were caught in an operation led by Nouabalé-Ndoki National Park rangers, after they allegedly killed 11 elephants. A firefight ensued and Guyvanho was initially able to escape, but three members of his team were arrested. Their statements provided sufficient grounds for an arrest warrant to be issued against him.

    In addition to the number of elephants killed, this incident demonstrated the willingness of this group to respond with violence when challenged. This was indicative of a trend of increasing violence of elephant poaching gangs in and around the park.

    In May 2018, Guyvanho was arrested and remanded in prison in the provincial town of Ouesso to await trial. However, on June 2, 2018, 12 days before his trial was to take place, Guyvanho escaped from the Ouesso prison. Still, his trial went ahead, and he was sentenced in absentia to five years in prison with a five million Central African Franc (US$9,000) fine.

    A further arrest warrant was issued. He remained a priority target of the park’s Wildlife Crime Unit – and locations known to be used by Guyvanho were monitored, but no arrest was made.

    During this time, he was cited as a participant in a number of subsequent hunts, each of which featured exchanges of gunfire with park rangers.

    On May 31, 2019, a ranger patrol returning to Nouabalé-Ndoki National Park HQ happened across a group of poachers – including Guyvanho – returning from a hunt. The patrol was fired upon by the poachers, and two patrol members were wounded, one of them seriously. His life was saved by fellow rangers with medical training.

    Guyvanho was again able to escape but was reported to have bragged about the incident. This information was passed to the authorities along with a new location for Guyvanho’s home. A surveillance operation was launched to confirm the information from the Wildlife Crime Unit, and, based on this information, Guyvanho was arrested by the Ouesso Police on July 20, 2019.

    Guyvanho was returned to prison in Ouesso to serve his sentence but following a further escape attempt, this time unsuccessful, it became clear that Guyvanho had a sufficiently strong support network in Ouesso that another escape attempt was highly likely. A transfer to Brazzaville prison was requested by the park authorities and approved, and in August 2019 Guyvanho and three associates were successfully moved.

    All the convicts will be transferred back to Brazzaville this week to serve their sentences.

    The Nouabalé-Ndoki National Park is governed by a 25-year public-private partnership between the New York City-based Wildlife Conservation Society, WCS, and the Government of the Republic of Congo through the Nouabalé-Ndoki Foundation.

    Dr. Emma Stokes, WCS regional director for Central Africa, says many people cooperated to bring this poacher to justice. “The sentencing is the culmination of more than three years of work by the Nouabalé-Ndoki National Park’s Wildlife Crime Unit and Anti-Poaching department. It is also the result of fruitful cooperation with multiple Congolese authorities, including the Ministry of Forest Economy, the Police, and District Prosecutors.

    Dr. Stokes listed some of those supporting WCS involvement in this case. “WCS commends our government partners in the Republic of Congo and thanks our donors for their ongoing support in this case, including The Wildcat Foundation, Save the Elephants’ and Wildlife Conservation Network’s Elephant Crisis Fund, the Sangha Trinational Trust Fund, U.S. State Department’s Bureau for International Narcotics and Law Enforcement Affairs, the European Union, and the United States Agency for International Development’s Central Africa Regional Program for the Environment (USAID-CARPE).”

    “This unprecedented conviction in the criminal court is a major milestone in the protection of wildlife in the Republic of Congo. Previously, all environmental crimes were tried in the civil courts where the maximum penalty under the wildlife law was five years. Today’s sentencing sends an extremely strong message that wildlife crime will not be tolerated and will be prosecuted at the highest levels,” Stokes said.

    “We are confident that today’s sentence will serve as a deterrent to would-be criminals that you will serve hard time if you break our wildlife laws and put park rangers and Congo’s national security in danger,” she said.

    After the sentencing, an official from the Sangha District Court declared, “This verdict confirms the fact that under the pretext of being poaching gangs, it is actually well-organized criminal gangs operating in our forests.”

    ※ 全文及圖片詳見:ENS

    盜獵
    象牙
    大象盜獵
    國際新聞
    剛果
    生物多樣性

    作者

    姜唯

    如果有一件事是重要的,如果能為孩子實現一個願望,那就是人類與大自然和諧共存。

    林大利

    於特有生物研究保育中心服務,小鳥和棲地是主要的研究對象。是龜毛的讀者,認為龜毛是探索世界的美德。

    延伸閱讀

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

    【其他文章推薦】

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

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

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

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

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

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

  • 南非克魯格公園防疫封鎖 動物佔領度假屋

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

    南非為防止武漢肺炎(COVID-19)擴大進行各階段封鎖,知名的克魯格國家公園住宿小屋因長時間無人入住,部分屋舍遭動物佔領與破壞,園方已展開維修,準備重新逐步開放。

    武漢肺炎爆發後,南非自3月26日進入最嚴格的第5級全國封鎖,幾個月來因疫情變化逐漸開放,8月18日起改善第2級,國家公園開放旅遊觀光。

    新聞網站「時報即時消息」(TimesLIVE)今(31日)引述南非國家公園管理處執行長姆克特尼(Fundisile Mketeni)表示,克魯格國家公園(Kruger National Park)準備重新開放面臨許多挑戰,特別是清潔與維修工作。疫情封鎖期間,部分住宿小屋被靈長類動物、松鼠與蝙蝠佔領和破壞。

    姆克特尼指出,已迅速維修,預計9月份會有旅遊高峰。

    國際新聞
    南非
    防疫
    國家公園

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

    【其他文章推薦】

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

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

    ※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

    南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

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

    ※超省錢租車方案

  • 全球最大濕地「內外燃燒」中 潘塔納爾火勢15年來最嚴重

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

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

    【其他文章推薦】

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

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

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

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

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

  • 北極圈驚見50公尺深「天坑」 專家解謎:甲烷噴炸

    北極圈驚見50公尺深「天坑」 專家解謎:甲烷噴炸

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

    綜合外媒報導,俄羅斯北極圈內凍原帶的夏天近年異常炎熱,導致不斷發生大規模爆炸,近日突然發生一起爆炸,導致炸出一個深約50公尺的超級大洞,當地居民議論紛紛。

    俄羅斯石油天然氣研究所(Russian Oil and Gas Research Institute)教授波哥亞夫蘭斯基(Vasily Bogoyavlensky)表示,爆炸可能是永凍土層慢慢融化後,原本冰封在泥土縫隙中的沼氣不斷釋放、噴發而成,其所引起的爆炸的巨大威力將土壤及冰塊拋到數百公尺外。但哥亞夫蘭斯基也補充,鑽探天然氣也有可能會引發爆炸。

    氣候變遷
    國際新聞
    俄羅斯
    永凍土
    凍原
    北極圈
    甲烷

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

    【其他文章推薦】

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

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

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

    ※超省錢租車方案

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

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

  • 全球冰川湖增53% 冰川融化形成湖泊水量增 恐釀洪災

    摘錄自2020年9月1日聯合報報導

    由於氣候暖化導致冰川融化,自1990年起,全球冰川湖的數量已增加53%。影像顯示,冰川湖數量在1990年至2018年間增長53%,使湖泊覆蓋地球的面積擴大約51%。根據調查,有1萬4394個冰湖散布在近9000平方公里的地球表面上。

    科學家分析來自NASA和谷歌地球引擎的衛星影像數據,評估冰川融化後所形成的湖泊如何受到全球暖化和其他過程影響。根據這些數據,研究人員估計,全球冰川湖水量在1990年至2018年間增加48%,目前總計約達156.5立方公里。

    對於世界上許多最貧窮的人來說,冰川湖是重要的淡水資源,尤其是在亞洲山區和南美部分地區。但大量冰融水注入湖中會導致下游地區面臨洪水威脅,能摧毀村莊、沖刷道路、破壞管線和其他基礎設施。

    氣候變遷
    國際新聞
    全球
    冰川融化
    全球暖化
    洪水

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

    【其他文章推薦】

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

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

    ※超省錢租車方案

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

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

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

  • 日貨輪觸礁漏油毀生態 模里西斯擬求償9.9億

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

    日本大型貨輪「若潮號」(WAKASHIO)7月在模里西斯近海觸礁,超過千噸燃油外洩造成當地生態浩劫,模里西斯政府計畫求償13.4億模里西斯盧比(約新台幣9.95億元)。另外,協助清理漏油的拖船昨晚(31日)撞上駁船,造成2死2失蹤。

    綜合外媒報導,日本商船三井集團營運的巴拿馬籍大型散貨輪「若潮號」7月25日觸礁時,載有約3800噸燃油,據悉,有1000多噸燃油外洩海上,被污染的沿海地區已禁止捕魚,模里西斯政府也在8月7日宣布進入環境緊急狀態,擔心瀕物種恐受到影響。

    根據模里西斯政府文件顯示的擬議計畫,當局將向日方求償13.4億模里西斯盧比,這筆錢將用來支持受到漏油影響的當地漁民社區,其中12億盧比用於建造100艘漁船、970萬盧比用於為475名漁民和60名船長提供培訓。

    污染治理
    國際新聞
    模里西斯
    燃油外洩
    漏油事件
    觸礁

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

    【其他文章推薦】

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

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

    ※回頭車貨運收費標準

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

    ※超省錢租車方案

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

  • 深圳強制垃圾分類 罰款最高216萬

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

    鄰近香港的中國大陸深圳市昨(1日)起強制實施垃圾分類,違反的話最高罰款人民幣50萬元(新台幣216萬元)。

    深圳新聞網今(2日)報導,深圳昨天起實施「深圳市生活垃圾分類管理條例」,羅湖區銀龍花園物業負責人收到首張整改通知書,原因是社區沒有設置分類投放點,且大件垃圾未及時清運。

    報導表示,深圳對相關處罰分為個人和單位兩類,其中對運輸類垃圾的收運單位處5萬元以上50萬元以下罰款;個人的生活垃圾處50元罰款,情節嚴重的罰200元。

    2019年起,大陸一些城市開始推動垃圾分類,以改善環境,提升城市生態水平。

    污染治理
    國際新聞
    中國
    垃圾分類

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

    【其他文章推薦】

    ※超省錢租車方案

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

    ※回頭車貨運收費標準

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

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

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