VS2019打包WPF安裝程序最新教程

VS2019打包WPF安裝程序最新教程,使用Visual Studio 2019開發的WPF程序如果想要打包為安裝程序,除了在VS2019找到WPF項目類庫直接右鍵發布之外,更常用的還是將其打包為exe或者msi的安裝程序;打包成安裝程序的話,客戶得到安裝程序直接安裝即可使用,即使在離線環境情況下,安裝好就可以使用了。

一些傳統行業發布程序時,比較常用這種方法,如醫療,教育等。

演示程序打包一覽

在本教程中,我完整的打包了一個簡單的WPF程序,最終安裝好了以後,在桌面有一個我的程序的快捷方式圖標,點擊這個圖標即可打開應用程序。

WPF安裝程序桌面圖標  

程序運行后的效果如下所示:

VS2019打包WPF安裝程序運行效果 

VS2019打包WPF安裝程序步驟

使用VS2019打包WPF安裝程序有很多種方法,本篇教程基於VS擴展插件Microsoft Visual Studio Installer Projects工具來打包,實際上此工具,在VS2010時自帶有,只是後面版本的Visual Studio取消了此插件,現在需要單獨安裝。

安裝打包Installer插件

安裝Microsoft Visual Studio Installer Projects插件有兩種方式。一是下載插件單獨安裝,二是在VS裏面在線安裝。

Microsoft Visual Studio Installer Projects下載地址:

官方下載地址:

 

下載下來后,你會在你的保存目錄看到此文件的圖標是這樣的,直接雙擊安裝就可以了,如果打開了Visual Studio,先將VS關閉后再安裝即可。

安裝插件

如果你不能從官網下載到,可以從本站直接下載即可。離線下載安裝的方式適用於斷網環境開發。

VS在線安裝Microsoft Visual Studio Installer Projects

Microsoft Visual Studio Installer Projects插件也可以在線直接安裝,步驟為:點擊菜單欄【擴展(X)】,然後在彈出來的一個窗體裏面,在右側搜索框裏面搜索“Microsoft Visual Studio Installer Projects”,一般第1個就是它了,然後點擊Download(下載),然後安裝就可以了。

VS在線安裝Microsoft Visual Studio Installer Projects

點擊Download后如下:

下載插件

下載完畢后,你需要把VS關閉掉,它會自動的安裝。

自動安裝插件

安裝好了后,啟動VS即可。

創建安裝項目

重新打開Visual Studio,打開一個你現有的包含WPF項目的解決方案即可,然後創建安裝項目。在解決方案上右鍵 –> 【新建項目】–> 【Setup Project】,添加Setup Project項目時,VS2019可以搜索項目模板,如下圖所示。

創建安裝項目

創建好了后,主界面變成如下圖所示:

安裝項目主界面

左邊窗口三個文件夾圖片說明如下:

Application Folder:應用程序包含的文件設置,指最終在客戶電腦上的安裝根目錄。如下圖所示:

應用程序目錄子目錄

User’s Desktop:用戶桌面快捷方式設置,用戶桌面,一般放個快捷圖標。

User’s Programs Menu:用戶啟動菜單的快捷方式設置,一般也是放快捷圖標。

Application Folder是安裝程序的根目錄,你編寫的程序生成的dll,安裝后就存放在這個目錄。

添加項目輸出

安裝項目建好了后,需要要往裡面添加項目輸出,操作方式為:右鍵Application Folder —>Add—>項目輸出。

該操作也可以直接在安裝程序項目類庫上面通過右鍵操作來添加項目輸出,如下圖所示:

右鍵設置屬性

設置項目屬性

項目屬性的設置,是用於最終一個生成安裝程序的描述信息,這個描述信息,這個描述信息主要內容有程序的作者,標題,公司信息,技術支持等等。最直觀的方式可以通過2種方式查看。

第一種查看方式:安裝前將鼠標放到安裝程序文件上,會有提示信息,如下圖所示:

屬性提示

第二種查看方式:安裝后在控制面板處,找到安裝程序,即可查看,如下圖所示:

控制面板看到的安裝后程序描述  

項目屬性的設置方式為:(1)左鍵選中項目,(2)點擊解決方案欄屬性,注意,不是右鍵選擇屬性,而是如下圖一樣選擇屬性。

設置安裝程序屬性

當你點了屬性后,會出現如下的窗口。

設置屬性主窗口

在當前的演示程序中,我是按照上圖做的設置,設置都很簡單,不需要做額外的解釋,如果有不明白的,可以加群與我聯繫。

添加快捷方式圖標

程序安裝好,我們當然希望用戶能夠快速的打開我們的應用程序,你就需要為你的安裝程序製作快捷方式,方法很簡單。

方法:(1)中間窗口右鍵,創建新的快捷方式

創建新的快捷方式

(2)彈窗裏面選擇Application Folder,雙擊進入另外一個界面

創建新的快捷方式第2步

雙擊后,進入下圖這個界面,選擇主輸出即可。

創建新的快捷方式第3步

完了後點擊OK按鈕,就進入下圖這個界面。然後將快捷方式名稱改為你應用程序的名稱。

改快捷方式圖標名稱

改名后的效果:

改名后的效果

最後一步,也是最重要一步,在上圖中選中改名后的圖標,將其拖到左側窗口User’s Desktop目錄即可。

拖動快捷方式圖標到對應位置

開始菜單圖標(User’s Programs Menu)設置方式同上面的步驟是一樣的,這裏就不再重複了。

依賴文件

打包正式項目的時候,界面程序可能依賴於很多其它類庫,或者第3方的dll文件,我們需要把它們一起打包,並且這些第3方程序或者dll需要同主程序在同一個安裝路徑下,那麼在打包時,也就需要額外的把這些文件也打包進來。

所有的操作都可以在中間窗口通過右鍵添加文件,程序集來實現,如下圖所示

添加依賴文件

添加註冊表項目

製作的安裝包如果要添加註冊表項目,可以通過選中安裝程序項目,然後右鍵,在彈出的菜單裏面找到【View】,即可以添加註冊表項目,按照提示一步一步操作即可。

另外有些打包的程序,需要在安裝前或者安裝后做一些額外的操作,都可以通過自定義操作來實現,如主程序安裝好了以後,還得安裝一個windows服務程序,再安裝另外一個自動升級程序,都可以通過這裏來實現。

添加註冊表項目

以上的基本操作熟悉后,相信對於簡單的桌面程序打包應該沒有什麼問題了。

另外需要注意的是,對外打包,需要更改為Release模式

打包依賴框架

最後再說一下關於 .net 環境的問題,如果你需要在打包時,將相應版本的.Net Framework一起打包到安裝程序裏面也是可以的,只是要注意,有可能你的打包機器上並沒有安裝相應的.net framework文件,則需要到官方或者網上下載對應版本的文件,例如這個演示程序,我設定的依賴框架是 4.5.2版本的,那麼需要將NDP452-KB2901907-x86-x64-AllOS-CHS.exe(.net framework 4.5.2安裝文件)放到指定目錄才能正常的生成打包文件。

需要將.net 的離線安裝文件放到以下目錄,其它版本則注意下路徑即可,一般C:\Program Files (x86)\Microsoft SDKs\ClickOnce Bootstrapper\Packages

目錄下面有不同版本的以DotNetFX開頭的目錄,如下圖所示:

依賴框架保存目錄 依賴框架保存目錄

將相應的版本的.net framework框架文件放到對應的目錄即可,我這個演示程序是放到下面這個目錄的。

C:\Program Files (x86)\Microsoft SDKs\ClickOnce Bootstrapper\Packages\DotNetFX452\zh-Hans

具體打包步驟為:右鍵安裝項目,選擇屬性,彈出窗口點擊Prerequisites…按鈕。再在彈出的窗口選擇你應用程序需要的框架版本即可。可以選擇多個。

Prerequisites

選擇需要打包的框架版本即可。

框架版本

待安裝程序打包成功后,即可在生成目錄看到該框架的安裝包,如下圖所示:

生成目錄框架文件

好了,以上就是使用VS2019打包WPF安裝程序的完整步驟。

演示程序可以點擊這裏下載。

打包后安裝一覽

成生打包文件成功后,就可以雙擊msi或者exe文件進行安裝了,安裝效果圖如下:

安裝打包程序

選擇安裝目錄

安裝打包程序

在演示的這個打包程序裏面,比較簡單,實際上你可以添加用戶協議文件,輸入用戶信息后才能安裝,這些都可以在打包時設置。

演示程序源碼可以在原文鏈接處下載

本文首發於:

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

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

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

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

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

每天3分鐘操作系統修鍊秘籍(17):進程間通信(3):套接字

套接字

套接字(Socket)用於協調不同計算機上的進程間通信,也就是基於網絡的通信。當然,也可以在本機上使用套接字進行進程間的通信。

套接字通信的方式非常多,有Unix域套接字、TCP套接字、UDP套接字、鏈路層套接字等等。但最常用的肯定是TCP套接字。所以,這裏介紹下TCP Socket通信方式,稍後再單獨介紹Unix域套接字。

TCP Socket用於客戶端、服務端的基於TCP協議的通信,所以在客戶端和服務端均需要創建一個套接字。創建TCP套接字時會返回這個套接字的文件描述符,可通過這個文件描述符對套接字進行讀和寫操作。

對比一下,當一個程序需要對一個磁盤文件同時進行讀寫操作(在命令行下似乎沒有找到這種命令,但通過編程方式是很容易實現的)時,由於只通過單個文件描述符同時負責讀和寫,很可能需要通過不斷移動文件指針的方式來改變讀寫的位置,否則數據很容易錯亂。

而TCP套接字也是通過單個文件描述符進行讀寫套接字的,為了保證讀和寫的位置不錯亂,操作系統在內核空間為每個TCP套接字維護了兩個buffer空間,一個buffer用於寫、一個buffer用於讀。提供讀的buffer空間稱為recv buffer,提供寫的buffer空間稱為send buffer,它們統稱為socket buffer

所以,服務端和客戶端通過兩個套接字通信就簡單了,一端向send buffer寫數據,該buffer的數據會通過已經建立好的TCP連接發送到另一端的recv buffer,於是另一端只需從recv buffer中讀數據即可實現不同計算機上的進程間通信。過程如圖。

Unix域套接字

Unix域套接字是套接字的一種,用於本機進程間通信,一般用來實現雙向通信的管道。Unix域套接字是比網絡套接字輕量級且高效的多,因為它不涉及網絡通信,不需要監聽連接,不需要綁定地址,不需要關心協議類型,等等。

創建Unix域套接字后返回兩個文件描述符,這兩個文件描述符均對套接字可讀、可寫,從而實現全雙工的雙向通信。

同樣的,為了避免使用單個文件描述符同時讀、寫造成的數據錯亂,Unix域套接字也有兩個buffer空間。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

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

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務

程序員修神之路–有狀態的服務其實可以做更多的事情

菜菜哥,你換形象啦?


這麼巧,你也換啦!聽說是不會畫畫的菜嫂經過九牛二虎之力的功勞哦!鼓掌……


前幾天我出去面試了,面試官問我微服務的知識,我回答的可好了


看來微服務你真的下功夫研究了呀


是呀是呀,但是碰到一個問題,有狀態的服務是什麼意思呢?


看來你又掛在這個問題上了,且聽這次分解


簡介

對於初學者,心裏對“有狀態服務”的理解可能比較模糊,但是從面向對象編程思想的角度去理解也許會明朗很多。面向對象編程思想提倡的是用編程語言去描述世間萬物,所以面向對象編程的語言都會提供描述對象的容器以及對象行為的表達方式。舉一個很簡單的栗子,在c#或者java中,表達對象的容器就是class,對象的行為通過一系列的接口或者函數來表達。更進一步,對象抽象出來之後,大多數對象都有自己的內部狀態,體現到代碼上也就是常見的類的屬性。

面向對象編程的基本思想本質上是對現實世界的一種抽象,萬物皆可抽象。

根據業務把對象抽象出來之後,每一個實例化的對象其實都可以有自己的狀態,比如:在最常見的遊戲場景中,每一個玩家都是“玩家”這類對象的一個實例,每一個玩家都有自己的名字,性別,等級,HP等屬性,這些屬性本質上就是玩家的狀態,隨着時間的推移,每個玩家的HP,等級等屬性會隨之變化,這些變化其實就是這個玩家狀態的變化。對應到有狀態的服務也是如此,之所以稱之為有狀態,是因為服務內部的對象狀態會隨着業務有着對應的變動,而這些變動只發生在這個服務內部,在外界看來,這個服務好像是有狀態的。

有狀態的服務本質上是一些有狀態對象的集合,這些對象狀態的變化只發生在當前服務進程中

優勢和劣勢

有狀態服務之所以被稱為有狀態,一個很大的原因是它可以追溯狀態的變化過程,也就是說一個有狀態的服務保存着狀態變化的記錄,並可以根據這些歷史記錄恢復到指定的狀態,這在很多場景下非常有用。舉一個很簡單的栗子:我們平時玩的斗地主遊戲,三個玩家,當有一個玩家因為網絡原因掉線,經過一段時間,這個玩家又重新上線,需要根據某些記錄來恢復玩家掉線期間系統自動出牌的記錄,這些出牌記錄在這個業務中其實就是這個玩家的狀態變化記錄。在有狀態的服務中,很容易做到這一點。

其實實際開發中很多場景不需要記錄每個狀態的變化,只保留最新狀態即可,不單單是因為保存每個狀態的變化需要大量的存儲和架構設計,更因為是很多業務根本不需要這些狀態變化記錄,業務需要的只是最新的狀態,所以大部分有狀態的服務只保存着最新的狀態。

有狀態的服務在設計難度上比無狀態的服務要大很多,不僅僅是因為開發設計人員需要更好的抽象能力,更多的是一致性的設計問題。現代的分佈式系統,都是由多個服務器組成一個集群來對外提供服務,當一個對象在服務器A產生之後,如果請求被分配到了服務器B上,這種情況下有狀態的服務毫無意義,為什麼呢?當一個相同的業務對象存在於不同的服務器上的時候,本質上就違背了現實世界的規則,你能說一個人,即出生在中國,又出生在美國嗎? 所以有狀態的服務對於一致性問題有着天然的要求,這種思想和微服務設計理想不謀而合,舉個栗子:一個用戶信息的服務,對外提供查詢修改能力,凡是用戶信息的業務必須通過這個服務來實現。同理,一個對象狀態的查詢修改以及這個對象的行為,必須由這個對象的服務來完成。

有狀態的服務要求相同業務對象的請求必須被路由到同一個服務進程。

因此,有狀態的服務對於同一個對象的橫向擴容是做不到的,就算是做的到,多個相同對象之間的狀態同步工作也必然會花費更多的資源。在很多場景下,有狀態的服務要注意熱點問題,例如最常見的秒殺,這裏並非是說有狀態服務不適合大併發的場景,反而在高併發的場景下,有狀態的服務往往表現的比無狀態服務更加出色。

Actor模型

在眾多的併發模型中,最適合有狀態服務設計的莫過於Actor模型了,如果你對actor模型還不熟悉,可以擼一遍菜菜之前的文章:https://mp.weixin.qq.com/s/eEiypRysw5jsC7iYUp_yAg  actor模型天生就具備了一致性這種特點,讓我們在對業務進行抽象的時候,不必考慮一致性的問題,而且每一個請求都是異步模式,在對象內部修改對象的狀態不必加鎖,這在傳統的架構中是做不到的。

基於actor模型,系統設計的難點在於抽象業務模型,一旦業務模型穩定,我們完全可以用內存方式來保存對象狀態(也可以定時去持久化),內存方式比用其他網絡存儲(例如redis)要快上幾個量級,菜菜也有一篇文章大家可以去擼一下:https://mp.weixin.qq.com/s/6YL3SnSriKEnpCyB5qkk0g  ,既滿足了一致性,又可以利用進程內對象狀態來應對高併發業務場景,何樂而不為呢?

有不少同學問過我,actor模型要避免出現熱點問題,就算有內存狀態為其加速,那併發數還是超過actor的處理能力怎麼辦呢? 其實和傳統做法類似,所有的高併發系統設計無非就是“分”一個字,無論是簡單的負載均衡,還是複雜的分庫分表策略,都是分治的一種體現。一台服務器不夠,我就上十台,百台…..

所有的高併發系統設計都是基於分治思想,把每一台服務器的能力發揮到極致,難度最大的還是其中的調度算法。

用actor模型來應對高併發,我們可以採用讀寫分離的思想,主actor負責寫請求,並利用某種通信機制把狀態的變化通知到多個從actor,從actor負責對外的讀請求,這個DB的讀寫分離思想一致,其中最難的當屬actor的狀態同步問題了,解決問題的方式千百種,總有一種適合你,歡迎你留言寫下你認為最好的解決方案。

案例(玩家信息服務)

由於菜菜是c#出身,對c#的Actor服務框架Orleans比較熟悉,這裏就以Orleans為例,其他語言的coder不要見怪,Orleans是一個非常優秀的Actor模型框架,而且支持最新的netcore 3.0版本,地址為:https://github.com/dotnet/orleans  有興趣的同學可以去看一下,而且分佈式事物已經出正式版,非常給力。其他語言的也非常出色java:https://github.com/akka/akka

golang:

1. 首先我們定義玩家的狀態信息

//玩家的信息,其實也就是玩家的狀態信息
    public class Player {
        /// <summary>
        /// 玩家id,同時也是玩家這個服務的主鍵
        /// </summary>
        public long Id { getset; }
        /// <summary>
        /// 玩家姓名
        /// </summary>
        public string Name { getset; }
        /// <summary>
        /// 玩家等級
        /// </summary>
        public int Level { getset; }
    }

2. 接下來定義玩家的服務接口

 /// <summary>
    /// 玩家的服務接口
    /// </summary>
    interface IPlayerService: Orleans.IGrainWithIntegerKey
    {
        //獲取玩家名稱
        Task<string> GetName();
        //獲取玩家等級
        Task<int> GetLevel();
        //設置玩家等級,這個操作會改變玩家的狀態
        Task<int> SetLevel(int newLevel);
    }

3. 接下來實現玩家服務的接口

public class PlayerService : GrainIPlayerService
    {
        //這裏可以用玩家的信息來代表玩家的狀態信息,而且這個狀態信息又充當了進程內緩存的作用
        Player playerInfo;
        public async Task<intGetLevel()
        
{
            return (await LoadPlayer()).Level;
        }

        public async Task<stringGetName()
        
{
            return (await LoadPlayer()).Name;
        }

        public async Task<intSetLevel(int newLevel)
        
{
            var playerInfo =await LoadPlayer();
            if (playerInfo != null)
            {
                //先進行數據庫的更新,然後在更新緩存的狀態, 進程內緩存更新失敗的幾率幾乎為0
                playerInfo.Level = newLevel;                
            }
            return 1;
        }

        private async Task< Player> LoadPlayer()
        {
            if (playerInfo == null)
            {
                var id = this.GetPrimaryKeyLong();
                //這裏模擬的信息,真實環境完全可以從持久化設備進行讀取
                playerInfo= new Player() { Id = id, Name = "玩家姓名", Level = 1 };
            }
            return playerInfo;
        }
    }

以上只是一個簡單案例,有狀態的服務還有更多的設計方案,以上只供參考

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包”嚨底家”

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

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

小三通海運與一般國際貿易有何不同?

小三通快遞通關作業有哪些?

Asciinema:你的所有操作都將被錄製

如何實現類似於Jumpserver koko一樣的終端錄製回放功能呢?本文介紹一個神器

asciinema 是一款開源免費的終端錄製工具,它可以將命令行輸入輸出的任何內容加上時間保存在文件中,同時還提供方法在終端或者web瀏覽器中進行回放

asciinema的錄製和播放都是基於文本的,相比傳統的video有很多好處,例如錄製文件體積小,在播放的過程中可以暫停複製其中的文本內容等等

同時asciinema還提供了一個網站,你如果願意還可以將錄製的內容上傳至進行展示,也可以在這裏找到很多有趣的終端錄像

asciinema由以下三個子項目構成:

  1. asciinema:基於命令行的終端會話記錄器
  2. asciinema.org:提供API供上傳錄像和展示的網站
  3. javascript player:用於在web上播放錄像的js播放器

asciinema的安裝和使用都非常簡單,一起來看看吧

安裝

asciinema為python開發,可以直接通過apt-getyum或者pip進行安裝

# apt-get install asciinema

安裝完成后查看版本

# asciinema --version
asciinema 2.0.2

asciinema有v1和v2兩個版本,差異較大,咖啡君使用了v2,以下所有內容也基於v2演示

asciinema有5個參數,分別為錄製:rec,播放:play,以文件形式查看錄製內容:cat,上傳文件到asciinema.org網站:upload、asciinema.org賬號認證:auth,本文主要說明recplay的使用

錄製

# asciinema rec ops-coffee.cast

有幾個參數可以使用:

--stdin 表示啟用標準輸入錄製,意思是通常情況下linux輸入密碼類的信息都不會显示,如果開啟了這個選項,可以記錄鍵盤輸出的密碼,但這個功能官方似乎還沒有支持,加了后看不到效果

--append 添加錄製到已存在的文件中

--raw 保存原始STDOUT輸出,無需定時信息等

--overwrite 如果文件已存在,則覆蓋

-c 要記錄的命令,默認為$SHELL

-e 要捕獲的環境變量列表,默認為SHELL,TERM

-t 後跟数字,指定錄像的title

-i 後跟数字,設置錄製時記錄的最大空閑時間

-y 所有提示都輸入yes

-q 靜默模式,加了此參數在進入錄製或者退出錄製時都沒有提示

輸入exit或按ctrl+D組合鍵退出錄製

播放

# asciinema play ops-coffee.cast 

有兩個參數可以使用:

-s 後邊跟数字,表示用幾倍的速度來播放錄像

-i 後邊跟数字,表示在播放錄像時空閑時間的最大秒數

在播放的過程中你可以通過空格來控制暫停或播放,也可以通過ctrl+c組合鍵來退出播放,當你按空格鍵暫停時,可以通過.號來逐幀显示接下來要播放的內容

文件

asciinema推薦的文件後綴是.cast,當然linux是不關心文件後綴的,你用什麼都可以,推薦按規範使用.cast,文件內容大概如下

# cat ops-coffee.cast
{"version": 2, "width": 237, "height": 55, "timestamp": 1572646909, "env": {"SHELL": "/bin/bash", "TERM": "linux"}, "title": "ops-coffee"}
[0.010014, "o", "root@onlinegame:~# "]
[1.296458, "o", "exit"]
[1.976439, "o", "\r\n"]
[1.976532, "o", "exit\r\n"]

cast文件主要有兩部分組成,位於第一行的一個字典,這裏叫header

{
    "version": 2,
    "width": 237,
    "height": 55,
    "timestamp": 1572646909,
    "env": {
        "SHELL": "/bin/bash",
        "TERM": "linux"
    },
    "title": "ops-coffee"
}

header很簡單,字段的意思分別為:version版本,width和height分別表示錄製窗口的寬高,timestamp錄製開始的時間戳,env錄製時指定的-e參數設置,title錄製時指定的-t參數設置

接下來的都是固定格式的內容,實際上就是IO流信息

[0.010014, "o", "root@onlinegame:~# "]

每一行都是由三部分組成的一個列表

第一部分為一個浮點數,表示輸入輸出這一行內容所花的時間

第二部分似乎是一個固定的字符串,沒有找到說明做什麼用的

第三部分就是具體的輸入輸出的內容

這個文件格式設計還是非常優雅的,開頭header聲明,後邊具體內容,如果中途因為任何意外導致錄像終止,也不會丟失整個錄像,而且還可以append增加錄像,這在需要長時間暫停錄製時非常有用,更重要的是可以流式讀取,幾乎很少佔用內存,不需要把整個錄像文件都放在內存中,對長時間的錄製播放更友好

自動錄製審計日誌

如果你有經歷過嚴格的IT審計,或者有用到堡壘機,就會知道操作過程是需要記錄並加入審計的,如果你有因為不知道是誰操作了什麼導致了數據被刪而背鍋的經歷,就會知道對操作過程的記錄有多麼的重要,接下來以一個簡單的案例來介紹asciinema有什麼樣的實用價值

如果希望能夠將linux服務器上devuser的所有操作過程都記錄下來,以備後續審計使用,該如何實現呢?

非常簡單,只需要在devuser用戶的家目錄下添加.bash_profile文件即可,內容如下:

$ cat ~/.bash_profile 
export LC_ALL=en_US.UTF-8
/usr/local/bin/asciinema rec /tmp/$USER-$(date +%Y%m%d%H%M%S).log -q

添加export LC_ALL=en_US.UTF-8的原因是有可能系統會報錯asciinema needs a UTF-8 native locale to run. Check the output of locale command.

rec命令進行錄製時添加了-q參數,這樣在進入或者退出時都不會有任何關於asciinema的提示,使用簡單方便

這樣devuser用戶每次登陸就會自動開啟一個錄像,如果需要審計或檢查操作,只需要回放錄像就可以了

你可能會說history命令一樣可以記錄用戶操作,asciinema有什麼優勢呢?asciinema不僅可以記錄用戶的輸入,還可以記錄系統的輸出,也就是說history只能記錄執行的命令,而asciinema還可以記錄執行的結果,怎麼樣,是不是很方便,趕緊試試吧

相關文章推薦閱讀:

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

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

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

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

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

小三通物流營運型態?

※快速運回,大陸空運推薦?

數據中台的“自動化數據治理”時代已來

 

中台,我理解是能力的下沉,數據處理能力下沉為加工平台,數據處理結果下沉為數據資產。那麼數據治理能否下沉?可以下沉出什麼東西?

——宜信數據中台負責人 盧山巍

本文來源:宜信數據中台負責人盧山巍在億歐產業互聯網頻道“数字中台創新”沙龍的分享實錄

原文首發:億歐

億歐產業互聯網頻道10月24日在上海InnoSpace落地“数字中台創新”沙龍,活動匯聚了良品鋪子電商技術中心總監羅軼群、愛馳汽車科技信息總監杭瑜峰、宜信數據中台負責人盧山巍、ThoughtWorks首席諮詢師及極客時間《說透中台》專欄作者王健、億歐華東負責人繆國成、億歐產業互聯網頻道副主編黃志磊、億歐產業互聯網頻道作者龔晨霞參与分享,就数字中台話題展開深度討論。

宜信是一家成立於2006年從事普惠金融和財富管理業務的金融科技企業,2018年基於四大開源平台和中間件等技術,開始研發數據中台,並在宜信內部推廣使用。目前,宜信的中台部門一共分為兩大板塊:數據中台和AI中台。 

以下是盧山巍演講觀點梳理:

1、宜信數據中台指導思維:統一建設、敏捷開發

2、從開源到中台,關鍵詞是自助化

3、數據治理,更依賴人治還是自治? 

以下是演講速記實錄,經億歐產業互聯網頻道整理,供行業人士參考。

大家下午好,我叫盧山巍,來自宜信。剛才聽羅總高屋建瓴地介紹了中台的概念和應用,受益匪淺。我的分享會不太一樣:第一,我有一個限定詞是“數據”。羅總的分享對業務中台、組織中台、技術中台都有探討,而我本身是做數據的,所以我只介紹數據中台。第二,我個人是從純粹技術路線走上來的,分享的內容會比較具體而微 。

我今天分享的話題是《宜信數據中台建設三部曲》,內容將按照時間發展故事線來展開。分別是:「敏捷使者」— ABD時代(2015年-2018年) ;「自助奇兵」— ADX時代(2018年-2019年); 「自治歸來」— ADG時代(2019年-)。

2015年加入宜信之前,我在上海張江的eBay研發中心工作,當時的主要方向是大數據架構和研發,在付費廣告組做大數據相關的事情。由於我個人的關注點比較下沉,對平台技術更感興趣,因此總想在技術領域中做出一些框架和平台類的東西。 

1、宜信數據中台指導思維:統一建設、敏捷開發

2015年宜信找到我,說公司內部沒有數據平台,希望我能夠去帶領建設數據平台,於是我加入了宜信。

其實說“公司沒有數據平台”是不準確的,更準確地說應該是“公司沒有統一的數據平台”,因為公司很多業務線都有自己所謂的數據平台,有的做得好一點,有的是純粹的定製化,談不上平台化,因為公司規模很大,很多是自下而上地建設,不像銀行是自上而下去推動做這個事情。當時也沒有數據中台這個概念,只是說要做一個好的數據平台,感覺有點無從下手,很有挑戰,因此着手做了很多公司內部的調研和訪談,用幾張圖來展現當時的現狀。

左上角的圖表達的是業務的豎井,從前台到業務開發端,到數據端,甚至有的數據庫都沒打通。通常好的數據中台,要有好的業務中台配合,在業務豎井嚴重的現狀下,想在數據層融合打通是挺難的事。

左下角表達的是在2015年的時候,很多企業都面臨的兩個慢的問題,即:時效慢、實施慢。

一方面,那時比較主流的還是T+1批處理,很多企業沒有完善的流式處理平台,不像現在有很多成熟的選擇。一般來講都是只能滿足T+1時效的數據需求。

另一方面,因為沒有很好的自助平台給大家使用,就變成了需求提給特定的BI團隊,BI團隊接了這個需求,需求多了忙不過來,就開始排期,可能要1-2個月甚至以上的時間才能響應和處理這個需求。

有的業務部門比較有實力,擁有不少大數據工程師,使用了很多技術選型,比如MongoDB、ES、HBase、Cassandra、Phoenix、Presto、Spark、Hive、Impala等等各種技術選型都有,沒有統一的技術選型標準。而公司需求又是多樣化的,像上圖右邊的自助查詢、360全景分析、實時處理、多維分析、數據湖等等,使得大數據架構變得越來越複雜和臃腫,越來越難以建設和維護,再加上圖下方的數據治理、數據質量、數據安全等切面課題,當時面臨的就是這樣一個比較複雜的現狀。

在這樣的現狀之下思考整個問題,找尋解決方案。本身我個人是比較倡導敏捷開發思想的,敏捷開發更多是在業務開發方面的實踐經驗,大數據比較笨重,怎麼才能讓大象奔跑起來?我認為要用敏捷化思想去建設數據平台。經過調研和思考,形成了一系列大數據敏捷思想框架、實踐和方法論,更重要的是我們要落地一些中間件去驅動敏捷化實踐。

接下來我們先後自研了四个中間件平台:DBus、Wormhole、Moonbox、Davinci。既然用了這麼多的技術選型,又很難快速將它們統一到一套技術選型,還要能夠去統一收口管控關鍵節點,最好的辦法就是利用中間件思想去適配已有的選型,然後再去簡化整個架構。

下面這個圖就比較技術視角了,展示了整個數據處理的鏈路,從左到右,分為數據源層、數據集成層、數據總線層、數據處理層、數據存儲層、數據服務層和數據應用層 。其中數據源層,天然有各種各樣的選型,這是業務需要;數據存儲層,出於不同目的有了眾多技術選型,這個也沒法很快統一,而且本身也很難找到一個大數據存儲選型,能夠解決所有的存儲問題和計算問題,所以不得不面對多個存儲和計算的整合問題。

在應用端,需求場景驅動也是很難整合統一的。能夠整合收口的是數據集成層、數據總線層、數據處理層和數據服務層 。整個數據鏈路梳理完之後,是一種“開放+統一”的架構,有些層面是開放包容的,而有些層面是要統一收口管控的。

當然,上圖灰色的切面課題也是應該關注和支持的,因為我們當時的策略是做四个中間件工具DBus、Wormhole、Moonbox、Davinci,因此沒有太關注這些切面課題 。

下面分別介紹這些中間件工具:

  • DBus,能夠實時將數據抽取出來,可以對接多個數據庫和日誌,既可以實時抽取增量數據,也支持抽取全量數據,並與增量數據保持一致性id體系,以支持後續冪等入庫。
  • Wormhole,負責流式作業開發和管理,可以不用編寫代碼,只通過配置和SQL方式即可支持實時同步和流上處理邏輯。這也體現出敏捷性:一是中間件統一了通用技術實現,不用重複開發;二是不斷地降低數據項目實施成本,實施人員盡量關注業務邏輯本身,簡單培訓即可自助完成項目,這些都是敏捷思想的體現。舉個例子,從使用體驗上看,比如增量數據從Oracle實時出來,希望實時寫到MySQL里去,只要簡單配置一下就可以了,如果還需要有一些實時處理邏輯,比如流上增量數據去Lookup外面的Redis,只要寫一個SQL即可 。另外,因為我們做中間件而不重造引擎,所以Wormhole是基於主流流式計算引擎Spark和Flink開發的,用戶可以自行選擇希望的計算引擎。Flink還支持CEP操作,所以Wormhole也支持CEP規則配置。
  • Moonbox,異構系統混算服務,假設數據因為各種原因存放在各個不同的地方,但又希望能夠混算這些數據,你可以當Moonbox是一個“虛擬數據庫”來使用。比如A表在Oracle里,B表在MongoDB里,C表在ES里,一個完整的SQL發給Moonbox,會自動將結果混算出來並返回結果數據;同時,Moonbox還能有效利用各個存儲的計算優勢,將更多算子下推計算,以整體提高運算性能。
  • Davinci,可視化平台,一般可視化平台具備的功能Davinci基本都具備,並且支持豐富的可視化應用和系統整合能力,力圖解決“大數據最後十公里問題”。

這些中間件做出來后帶來了什麼效果?比如某條業務線2-3個數據相關人員,對業務非常了解,但沒有大數據技術開發背景,經過一兩周的培訓,就可以自助地、快速地完成各種實時數倉、實時報表、實時應用的端到端項目。這在以前是不可想象的,以前要做一個實時項目,需要有大數據技術開發背景的團隊來支持,而現在哪怕不是IT背景的人,培訓一下就可以做這個事情了,這就是敏捷中間件工具帶來的效率提升和成本減低。 

接下來更深入地介紹一下Wormhole。

除了上面說到的配置化和SQL化開發流式應用這些好處,從內部技術實現角度來看,很多流式開發要注意的典型問題也都被中間件屏蔽了,這些對用戶來說是透明支持的。 

  • 冪等Sink,流上的增量數據不保證強有序,但是落Sink的時候要做到最終一致性。Wormhole已經內置了這個處理邏輯,用戶只管寫好流上邏輯SQL就可以 。
  • HDFS小文件,做大數據大家都知道這個問題,Wormhole也內置了解決方案。
  • 多Flow支持,這是我們獨創的功能,如果做過Spark開發,會知道寫一個Spark程序,它起來後會一直占固定內存跑一個作業,而我們認為Spark streaming應該是物理資源管道,裏面的流上邏輯應該和物理資源解藕,所以我們設計開發了Flow的概念。Flow的定義就是從哪兒來,到哪兒去,在流上做什麼處理邏輯。解耦帶來的效果是一個Spark streaming物理管道可以跑多個邏輯Flow,比如說公司有1萬張表,需要同步到2萬個目標端,可能在以前開發需要起兩萬個Spark streaming作業,現在只需要起一個Spark streaming作業就可以了,比如設置50G內存,在裏面跑2萬個同步Flow工作,相當於做了邏輯層管道支持,這個還是比較獨創的,目前只有我們在這麼做。
  • 動態指令,這個是和運維相關的,我不希望每次改流式處理邏輯的時候都要去重啟這個流,而是能夠在線更改、實時生效。
  • 業務時間策略,以前Spark streaming是默認基於Process time去做計算的,現在流式引擎很成熟了,引擎內部支持基於Event time計算,但當時Spark streaming還沒有支持,所以這塊我們也做了相應的支持。
  • Flow漂移,這個也是運維相關,比如說,我們起了5個物理的Spark streaming管道,每個裡面跑10個Flow,某天某個業務線增量數據量激增,某個Stream資源不夠用了,Flow漂移能力就可以將這個邏輯Flow漂到其他空閑的Spark streaming物理管道里。這就是在不斷地降低流式處理運維開發的門檻,盡量做到敏捷化,也就是說我可以寫一個自動化小程序,定時檢測哪一個Spark streaming資源不夠,哪一個閑置,然後自動漂一個Flow,這樣可以做到流式處理的自動化運維。這個課題大家也在探索,批量作業相對很好運維,出了問題自動重啟就可以了,但流式處理的話就比較難運維了,包括資源大小、重啟Offset等等,我們在上面都做了很多的工作。所以我們不是簡單地包裝Spark,而是做了很多深入的東西的。

關於開源,我以前就職於eBay,eBay出了幾個Apache頂級開源項目,對我們也是很有影響的,所以我在宜信設計做這四個工具的時候,一開始就是朝着通用化開源工具的方向進行的。不知道在座大家有沒有聽說過這幾個工具,其中Davinci在社區是很火的,很多公司都有在用。

至此,第一階段工作趨於穩定,解決了公司內部很多的問題,開源的幾個工具不光是在公司內部得到很好的應用,在技術社區也賦能了很多其他企業。

第二階段是從去年下半年開始的。2017年我參加了杭州雲棲大會,聽過阿里分享的數據中台,那時“中台”這個詞還沒有流行起來。到了2018年初,我就在思考,認為數據中台是當下公司需要做的東西,於是跟CTO建議,他也很支持我們,之後沒幾個月,數據中台開始流行起來,所以我們也相當於趕上風口了。

2、從開源到中台,關鍵詞是自助化

ABD時代已經做得不錯了,為什麼還要再往上做數據中台?除了前面提到的業務線多、技術選型多、需求多等這些大家都知道的問題之外,從數據管理層面來看,如數據治理、數據資產等都還沒有涉及,還有很多切面上的課題也沒有過多考慮。之前因為開源也和一些社區、公司做過線下交流,都表示“你們的開源工具做得很好,但是離我們業務需求想要的中間感覺還差一塊”,其實差的就是一個類似數據中台的東西。

不管數據中台如何定義,企業需要一個能夠更加直接賦能業務的平台,因此我們可以在業務需求和中間件工具之間再提升一個層次,構建一個一體化、標準化、一站式的自助平台。

進入第二個時代,敏捷數據中台ADX。下圖大三角中的藍色三角,數據平台引擎,從技術層面來講,我們首先要基於之前的開源工具建設一個好用的自助平台。但是單單一個好的自助數據平台,不等同於數據中台。參考了很多數據中台文章和定義后,我們總結出數據中台還應該包括其他三塊。 

  • 一塊是數據資產體系,數據資產是好的數據信息的沉澱和復用,數據中台一定要將數據資產建設納入其中,具體方式比如將數據模型方法論固化並下沉系統化,這樣能夠更加規範化、標準化地支持沉澱數據資產。
  • 有了數據資產,有了好的平台,但如果壺很大、口很小,數據價值賦能業務帶寬不足,業務部門可能直觀感受會覺得好像只能看報表,會造成數據賦能能力不夠。所以對接前台業務不光要能提供報表,還需要能夠提供數據產品、數據API、自助分析等,這些都可以更好地賦能業務。
  • 有了這些,數據中台能不能真正運轉起來,還要看公司的流程制度和運營機制。比如我有好的數據資產,卻沒有數據運營機制保障,其他業務團隊也不會敢用,如果要復用的話我要對其負責,這些都是數據運營的考慮範疇。這些方面都做好之後,才有可能把數據中台做好並運作好。

數據中台的價值體現,在上圖右側也有展示,簡單來說就是“更省更快更准”,或者換個說法是“降本增效提質”,這就是數據中台的價值本質。

下面這張圖是ADX上一個大致的使用體驗,在自助化數據中台上,整個數據中台研發團隊就成為在其背後的IT團隊了。用戶不必和我們直接打交道,在平台上可以自助地申請資源、申請庫表,自助開發、自助運維、查看監控 、設置報警、診斷問題、上線下線等,我們只要做好平台設計、研發和運維,這是我們想達到的效果,更加全面徹底的自助化、平民化。

數據中台是基於模塊化思想建設的,拆分為眾多子模塊,之間關係是分層和聯合的。比如統一的數據歸集、數據加工、數據模型、監控預警等,這些和其他公司思路都差不多;右側的數據管理、中台管理,都是在解決切面的課題;上面部分是貼近業務使用的模塊。模塊很多這裏不一一展開介紹。

值得一提的是,主要核心模塊都不是從零開發,而是基於ABD開源工具整合打通構建的,所以ADX不是推翻了以前的ABD,而是基於ABD更加抽象、更模式化、更面向業務去做上層建築。

現在處於ADX時代,下圖就有所變化了。DataHub整合了數據集成和數據總線層,以前DBus只支持流式歸集和分發,而DataHub不管是流式還是批量都可以支持。DataWorks之於Wormhole也是如此,相當於ABD功能的擴展外延。

下層的切面課題,也都有相應的模塊對應解決。所以說ADX更加平台化,不像以前我們做了幾個比較好的開源工具,然後大家自己DIY組合去解決各種場景項目,現在是基於一站式自助平台,用戶可以在其上完成各種各樣的日常數據處理工作。

再提一下DataHub,這個模塊當時做的時候沒覺得怎樣,做出來以後大家都覺得真的很方便,很強大。

下圖從DataHub這個模塊外面站在黑盒的角度去看,可以想要什麼數據就能得到什麼數據:比如我想要某張表的每天T+1快照,它會返給我;我想要這張表的任何一個歷史時刻的精確快照,它也能返給我;我想要這張表的實時流數據,它還能返給我。之所以能做到這點,因為我們把所有表的全量+增量數據都實時落入數據湖,並基於ABD開源工具的整合模式提供各種各樣的所需數據形態,因此從數據層面來看,理論上你想要什麼,DataHub都可以提供。我們也了解了社區一些類似的數據整合方案,大部分都是提供單純工具層面的功能,而沒有內置實時數據湖。DataHub包含了一個數據湖,全公司所有的數據都可以實時地統一地歸集和維護進來,所有的數據使用方,想要什麼就可以返回什麼,這是非常方便和徹底的使用體驗。

第二個時代ADX時代,從開發到上線到現在大規模應用,有一年多的時間,基本能力都已具備。到了第三個時代,我們更關注數據資產能力和數據治理能力建設,沒有數據資產就談不上數據中台,而數據治理是確保數據資產有效沉澱和賦能業務的重要保障。

數據治理這個課題,在數據鏈路每一層都有對應可能存在的問題,這些問題有些可以在系統層面解決,但更多的是依賴於人去治、依賴於組織去治,且依然不容易得到完美的解決。在這個課題上我們也在思考和摸索中,以下僅限於探討。

3、數據治理,更依賴人治還是自治?

下面是我們的一些思考。“自治”包含兩層含義:自動化治理和自助化治理。

中台,我理解是能力的下沉,數據處理能力下沉為加工平台,數據處理結果下沉為數據資產。那麼數據治理能否下沉?可以下沉出什麼東西?

一類是下沉出一些平台工具,比如元數據管理、數據質量管理,這些可以做得很通用化、工具化;一類是下沉出一些方法論的系統化,比如阿里的OneData,是一套內部打磨出來的本地化的方法論,落地為一套系統體系,這套體系和方法論不一定適合於每家公司,但我覺得這個思路每家公司都可以借鑒,打磨適合本企業業務體系的方法論,然後將之系統化,更好地約束和規範化企業內的數據治理管理和數據資產建設。

對於“自動化”數據治理,以上兩類依然不能覆蓋所有問題,比如企業有很多遺留系統、遺留流程,無法在短時間內進行大規模的、統一的改造和遷移,那麼怎樣去管控它、治理它?這依然是一個難題。RPA是一個比較新興的思路,可以很好地處理遺留系統的問題,這一點和數據治理也許可以找到很好的交叉點,比如可以利用流程編排、自動執行的思想,應對一些遺留系統、遺留環境的數據治理問題。

關於“自助化”數據治理,數據治理和數據處理不太一樣,比如流式處理,這是一個業務能夠直觀感受到的剛需,不管什麼業務都會有很強的需求。而數據治理不同,從業務角度來看,數據治理雖然就長期而言可以為整個企業和業務發展帶來堅實的正面影響,但短期內可能會限制業務快速發展的速度,所以業務方可能不會有特別大的動力去主動支持和配合數據治理。

有些企業會自上而下強制推行數據治理的管理和實踐,這是需要管理層有這個意識和決心的。我們公司不太一樣,數據治理需要向業務快速迭代和需求快速變更妥協,無法做到自上而下強推,但又不能不治,因此我們考慮能不能自助化地做數據治理。比如業務線可以建立自己的私有數據資產,如果希望升級成公有數據資產,可以進行申請審核,當然這要可以為業務線帶來好處,要和KPI綁定,這樣一來,數據資產的運營能力可以下放,讓大家主動共同參与到數據治理中來,這種柔性數據治理推廣方式可能會更有效,這也是我們在嘗試的工作。

上圖只是一個粗略的概念架構圖,還不是特別成熟,這也是我們現在在思考的一些思路。如果可以把公司所有的元數據歸集起來,形成一個企業級元數據全景圖譜的話,我們就具備了數據知識;因為我們有Moonbox,我們就具備了各種數據操作能力;基於數據知識能力和數據操作能力,就可以根據數據治理的經驗、規則和現狀的流程梳理,進行數據治理動作的可視化編排,最終形成一個自動化數據治理的體系和框架。

數據治理純靠人的話,不確定性因素太大,相對來說我更相信工具,相信通過不斷的抽象、下沉和驗證,可以找到一套更系統化的流程方式和配套工具去做得更好。

以上就是我們四年來數據中台建設的三個時代走過的歷程,前路依然任重道遠,還需繼續摸索沉澱,希望可以和大家多多交流探討,感謝大家的聆聽!

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

【其他文章推薦】

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

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

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

台灣寄大陸海運貨物規則及重量限制?

大陸寄台灣海運費用試算一覽表

南投搬家前需注意的眉眉角角,別等搬了再說!

關於GDAL讀寫Shp亂碼的問題總結

目錄

1. 正文

最近在使用GDAL讀寫Shp格式中的屬性字段的時候也遇到了中文亂碼的問題,總結下自己遇到的情況。

1.1. shp文件本身的編碼的問題

應該是由於shp格式加入了對寬字符的支持,所以導致有段時間的shp文件和ArcGIS是存在不匹配的問題,所以在網上搜索資源的時候遇到了大量的關於ArcMap显示shp屬性表出現亂碼的問題。現在的shp格式的文件應該已經穩定下來了,新添加了一個.cpg的文件,裏面保存着屬性表的編碼格式:

圖1-1:shp格式的.cpg文件

從ArcGIS10.2開始,只要是屬性表編碼與.cpg文件記錄的編碼方式一致,就不會再有显示亂碼的問題。網上查詢到的修改註冊表的方法,我在ArcGIS10.2中試過,似乎已經不再起效了。

那麼對於沒有.cpg或者的情況,應該可以看屬性表.dbf文件。如果編碼方式正確,這個文件用文本編輯器打開是可以看到正常的中文的:

圖1-2:shp格式的.dbf文件

在正常显示中文情況下,可以查看下文件的編碼方式:

圖1-3:查看編碼方式

當然,如果遇到亂碼,可以嘗試用別的編碼方式打開,這樣你就能知道屬性表具體是什麼編碼了。對於國內的情況來說,只有ANSI編碼和UNICODE編碼兩種:其中簡體中文系統中ANSI編碼就是GB2312編碼;UTF-8是UNICODE編碼的一種具體實現。

1.2. 設置讀取的編碼方式

1.2.1. GDAL設置

可以通過全局設置函數CPLSetConfigOption(),來配置讀取Shp文件的讀取編碼。例如對於簡體中文系統中ANSI編碼,可以設置為GBK:

CPLSetConfigOption("SHAPE_ENCODING","GBK");

上面這種方式是全局設置的,如果想設置單個文件的編碼方式也是可以的。例如,打開一個矢量文件讀取為UTF-8的數據集:

char** ppszOptions = NULL;
ppszOptions = CSLSetNameValue(ppszOptions, "ENCODING", "UTF-8");
GDALDataset *poDS = (GDALDataset*)GDALOpenEx(filePath.c_str(), GDAL_OF_VECTOR, NULL, ppszOptions, NULL);

網上提供的解決方案都是將編碼方式設置為空[1],這種方式應該更具有通用性,起碼我這裏讀取GBK和UTF-8格式的Shp的格式都是可以的:

CPLSetConfigOption("SHAPE_ENCODING","");

1.2.2. 解碼方式

如果讀取出來的字段屬性仍然是亂碼,就應該考慮字符串的解碼問題,就是獲取的字段屬性字符串沒有正確的解碼出來。例如讀取UTF-8的Shp文件的屬性字段:

OGRFeature *poFeature;
while ((poFeature = poLayer->GetNextFeature()) != NULL)
{
    OGRGeometry *pGeo = poFeature->GetGeometryRef();
    OGRwkbGeometryType pGeoType = pGeo->getGeometryType();

    //      
    OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
    int n = poFDefn->GetFieldCount(); //獲得字段的數目,不包括前兩個字段(FID,Shape);
    for (int iField = 0; iField <n; iField++)
    {
        //輸出每個字段的值
        //cout << poFeature->GetFieldAsString(iField) << "    ";
        cout << UTF8_To_string(poFeature->GetFieldAsString(iField)) << "   ";           
    }
    //cout << endl;   

    OGRFeature::DestroyFeature(poFeature);
}

默認情況下,cout是無法正確打印輸出UTF-8字符編碼的,通過UTF8_To_string這個函數,將UTF-8編碼的字符串轉換成本地ANSI編碼,也就是GBK編碼字符串,就可以正確輸出显示了。附帶一下兩者的轉換函數[2]

// UTF8轉std:string
// 轉換過程:先將utf8轉雙字節Unicode編碼,再通過WideCharToMultiByte將寬字符轉換為多字節。
std::string UTF8_To_string(const std::string& str) 
{ 
    int nwLen = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0); 
    wchar_t* pwBuf = new wchar_t[nwLen + 1];    //一定要加1,不然會出現尾巴 
    memset(pwBuf, 0, nwLen * 2 + 2); 
    MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), pwBuf, nwLen); 
    int nLen = WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, NULL, NULL, NULL, NULL); 
    char* pBuf = new char[nLen + 1]; 
    memset(pBuf, 0, nLen + 1); 
    WideCharToMultiByte(CP_ACP, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);

    std::string strRet = pBuf; 

    delete []pBuf; 
    delete []pwBuf; 
    pBuf = NULL; 
    pwBuf = NULL; 

    return strRet; 
} 

// std:string轉UTF8
std::string string_To_UTF8(const std::string& str) 
{ 
    int nwLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0); 
    wchar_t* pwBuf = new wchar_t[nwLen + 1];    //一定要加1,不然會出現尾巴 
    ZeroMemory(pwBuf, nwLen * 2 + 2); 
    ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), pwBuf, nwLen); 
    int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL); 
    char* pBuf = new char[nLen + 1]; 
    ZeroMemory(pBuf, nLen + 1); 
    ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL); 

    std::string strRet(pBuf); 

    delete []pwBuf; 
    delete []pBuf; 
    pwBuf = NULL; 
    pBuf  = NULL; 

    return strRet; 
} 

1.2.3. 其他

還有個值得注意的問題就是Shp格式的屬性字段名稱的長度最大隻能支持10個字符。如果採用UTF-8編碼,可能用不了幾个中文字符就被截斷了,這個時候屬性字段名稱也可能存在亂碼。

2. 參考

[1]
[2]

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

【其他文章推薦】

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

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

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

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?

大型網站的演化之路——讀《大型網站技術架構》

大型網站的演化之路——讀《大型網站技術架構》
____

author:姚毛毛的博客 & 妖生

01 大型網站or軟件有什麼特點?

高併發、大流量,微信都日活10億了
7×24的高可用,俗稱的4個9(99.99%)
海量數據的存儲與管理
全國甚至全球的用戶分佈,複雜網絡
安全環境很差
需求變更頻繁,需要快速迭代

最後,是漸進式的發展。
所有大型網站都是從一個小網站發展起來的。
好的網站與複雜的架構都是演化來的,而不是一開始就設計好的。
當年才出發的時候,誰也想不到微信可以日活十億,最初的時候肯定也沒有成千上萬的服務器集群對不對。

02 最初與第一次的演化之路:應用與數據的分離

我們最初的小型網站是什麼樣的?
從邏輯上看,一個應用服務、一個數據庫;從物理上看,一台服務器就搞定了。
在用戶量增多后,我們開始需要將應用跟數據庫分離。

那應用跟數據庫所需要的服務器配置是一樣的嗎?
當然是NO。
應用需要處理更多的業務邏輯,所以需要好一點多一點的CPU。
數據庫則要快速檢索磁盤跟放置數據緩存,因此需要快一點的磁盤和大一點的內存。

當然,所有演進的目的都是想更高、更快、更強。只是有時候沒法做到面面俱到,需要取捨。

03 第二次演進:緩存優化

恭喜你,網站優化了一次,體驗變好了,用戶也開始增多了,可是煩惱的又來了。
用戶的增多,帶來的數據庫壓力也大了,怎麼辦?

在IT行業甚至所有現實模型中都存在一個顛撲不破的真理,即二八原則。
在網站訪問上也是如此,80%的業務訪問總是集中在20%的數據上。
淘寶買東西就翻前面那麼一點,淘寶已經為我們找好了信用好、成交量高的賣家;百度一下也就是翻前面那兩三頁,甚至一頁里的前幾條(如果沒有廣告的話);微博熱搜吃瓜也就看前十吧,後面的你會一個個點過去嗎?

那麼,把這20%的數據緩存起來,是不是就可以減少數據庫的訪問壓力,提高網站訪問性能了?
YES。

那麼,怎麼緩存呢?
我們通常使用的緩存方案有兩種,即應用服務器上的本地緩存,和獨立的分佈式緩存。

有什麼優缺點?
本地緩存速度快些,但是受限於應用服務器的內存,且會導致與應用爭用的情況。
獨立的分佈式緩存可以使用集群,速度稍慢,但也很快,基本只有網絡IO的消耗;但是缺點就一個字:貴。因為需要購買獨立的緩存服務器。
所以在現實中,有時候,我們有時並不會購買獨立的緩存服務器,而是放在大內存的應用或數據庫服務器上,設置好閾值,共用內存。

04 第三次演進:應用集群與數據庫的集群和讀寫分離

哇,用了緩存后,訪問數據好快啊。
可是用戶又增多了,應用支撐不過來了怎麼辦?真是幸福的煩惱啊。
單台數據庫是不是有宕機的危險啊?

唉,集群唄。花錢就完事了。

應用集群、數據庫集群。

這也是我們當今的軟件架構中最常用的部署方案。

通過負責均衡調度器(nginx、F5等),可以將用戶請求通過輪詢或者IP指定的方式,分發到應用服務器集群中的任意一台服務器上,緩解應用壓力。
而數據庫以Oracle為例,則是可以在生產服務器上安裝RAC版本,而應用可以通過訪問數據庫的VIP(Virtual IP),或者JDBC集群訪問的方式訪問數據庫。
但是在網站的應用開發中,則一般選擇mysql的較多。雖然淘寶早期也是使用了Oracle,但是後期也轉mysql了。
至於為什麼?
呵呵,一個字,貴。兩個字,很貴。三個字,太貴了。

集群的好處有兩個:1、緩解服務壓力;2、高可用,其中一台壞了,另一台還可以繼續使用,給你恢復服務的機會。

一般軟件演化到這裏就完事了。

但是網站有個不一樣的地方,很多時候,都是讀多寫少。
點贊的、吃瓜的比上場評論的少很多對吧?

而讀多的情況雖然通過緩存配置消化了一部分,但還是有一部分讀操作(緩存未命中、緩存過期)和全部的寫操作會訪問數據庫。
所以在你的用戶量又迅猛增加到一定規模時,又是數據庫成為了我們的瓶頸。

目前大部分數據庫都是支持主從熱備功能的,主數據庫通過主從複製機制將數據更新同步到從數據庫。
此時我們的應用就可以建設專門的讀、寫數據庫的訪問模塊,使數據庫讀寫分離對應用透明。

有時我們甚至會將專門的查詢模塊剝離出來,成為另一個子系統。

05 不算演進的第四次演進:CDN與反向代理

為什麼要做CDN?
移動、電信、聯通……,華東、華南、西南、西北……,網絡環境複雜,每個地區訪問網站的速度都不太一樣。
CDN跟反向代理是加速訪問的一種手段,它們的基本原理都是緩存。
區別是CDN部署在網絡廠商的機房,反向代理是部署在網站機房。
CDN跟反向的目的都是儘早返回數據給用戶。

06 三國演義式的第五次演進:分佈式演進、業務的拆分與合併

分佈式數據庫是一種最後手段,只有在單表數據非常龐大的時候才使用。
很多網站和軟件根本用不到這一步,分佈式數據庫會帶來更麻煩的複雜性。
網站更常用的手段是拆分業務,拆分不同的業務應用,拆分不同的業務庫,部署在不同的物理服務器上。

這一招,在圍棋上,叫分治。在三國里,叫合久必分。

以商城網站為例,可以將首頁、店鋪、訂單、賣家、買家拆分不同的產品線,這其中不同的產品線又可以拆分多個應用,分歸不同的業務團隊管理。

應用之間可以通過首頁超鏈接建立關係,也可以通過消息隊列進行數據分發,當然,最多的還是訪問同一個數據存儲系統,來構成一個完整的系統。

這叫微服務。

隨着業務拆分越來越小,應用越來越複雜,其中又出現了一些可以共用的服務。如用戶管理、商品管理,那麼就可以將這些共用的業務提取出來,獨立部署。
用現在流行的話來說,叫業務中台。

在技術上,大家又造了各種各樣的輪子,解決的問題其實有很多共性。例如文件、圖片的處理、數據的存儲與搜索系統。
技術中台也有了。

在數據上,大家的系統因為拆分的愈來愈零碎,存儲到了不同的數據庫中,又形成了一個個數據孤島。把這些打通,做成數據倉庫,分析用戶畫像豈不美哉?優惠券推送、大數據殺熟了解一下。
而在技術上,隨着數據越來越多,數據存儲和檢索的技術需求也越來越高。所以我們又會引用一些非關係型的技術如NoSQL、搜索引擎等等。
最後,數據中台也有了。

所謂分久必合,新三國成型了。

歡迎關注我的公眾號:姚毛毛的博客

這裡有我的編程生涯感悟與總結,有Java、Linux、Oracle、mysql的相關技術,有工作中進行的架構設計實踐和讀書理論,有JVM、Linux、數據庫的性能調優,有……

有技術,有情懷,有溫度

歡迎關注我:姚毛毛& 妖生

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

【其他文章推薦】

※專營大陸空運台灣貨物推薦

台灣空運大陸一條龍服務

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

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

甲烷排放嚴重低估 研究:石油天然氣危害氣候 比預期還糟

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

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

【其他文章推薦】

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

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

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

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

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

※試算大陸海運運費!

西伯利亞發現仍遠古死鳥 估計有4.6萬年歷史

摘錄自2020年2月23日星島日報報導

科學家正研究一隻在俄羅斯西伯利亞冰天地雪地中發現、估計由對上一次冰河時期保留到現在的雀鳥屍體,推算牠已有4.6萬年歷史。   

科學家認出那是一隻角百靈,在西伯利亞東北部偏遠的貝拉亞戈拉村內被發現,由於長期被埋及冰封,至今仍然保存良好,沒有腐化。瑞典自然歷史博物館的專家參與研究和化驗,並利用放射性碳技術推算牠已有4.6萬年歷史。   

其中一位專家達倫對記者說,研究顯示,這隻遠古雀鳥是目前常見的兩種百靈鳥的祖先。科學家相信,對上一次冰河時期接近尾聲時,地球的氣候出現變化,令新物種出現。

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

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

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

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

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

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

日本密室會議干預審查 火山灰影響核電廠 安全堪虞

文:宋瑞文(媽媽監督核電廠聯盟特約撰述)

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

【其他文章推薦】

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

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務