標籤: 網頁設計公司

  • 福建物價局:電動汽車充電服務費1.2元/度為上限

    據福建省物價局最新批復,電動汽車充電服務費實行政府指導價管理,充電服務費標準(不含電費)上限按1.2元/度收取,下浮不限。   理論上來說,給電動汽車充電採取“充電服務費+電費”的繳費方式。充電電費方面,分兩種情況

    1. 集中接入電網的充電樁,高峰時段0.9139元/度,低谷時段0.3305元/度,其餘時段0.6222元/度。
    2. 分散接入電網的充電樁,居民家庭住宅、居民住宅社區的充電設施收0.533元/度;到黨政機關、企事業單位和社會公共停車場中設置的充電設施用電高峰時段收1.15975元/度,低谷時段收0.41445元/度,其餘時段收0.7871元/度。

    據悉,相比於汽油、天然氣,用電的成本更低。據業內人士統計,在廈門,計程車司機用油每公里成本在0.6元-0.7元,用氣每公里成本約在0.4元,而用電每公里成本在0.3元。目前,廈門新建的充電樁設備只有計程車可充電,未對社會車輛開放。運管處相關人士透露,他們上月報備的充電服務費為0.6元/度。   而對於從事電動汽車充換電設施服務的經營性企業來說,2020年前免收基本電費。

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

    【其他文章推薦】

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

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

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

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

  • 這是下一個 Tesla!新創公司 Faraday 宣布 10 億美元電動車投資計畫

    這是下一個 Tesla!新創公司 Faraday 宣布 10 億美元電動車投資計畫

    近日一家在洛杉磯成立的新創公司 Faraday Future 引發了巨大關注,號稱投資 10 億美元建設電動車製造廠,據該公司官網顯示 4 位副總裁來自 Tesla,團隊規模大約為 400 人,這一投資規模在整個電動車產業來看,都不是一筆小數目。

    Faraday Future 的總部位於洛杉磯南部,相比於一般新創公司而言,Faraday Future 的團隊規模比較大,目前已經擁有了 400 名員工,這家專注於電動車市場的新創公司並沒有在業內引發太多關注。最近華爾街日報報導該公司宣布投資 10 億美元建廠,這一筆投資使得 Faraday 聲名大振。   據該公司的網站資訊顯示,Faraday Future 將以使用者為中心,把一流的技術引入電動車設計、致力於連結使用者的駕駛體驗和生活。4 位副總裁均來自電動車製造商 Tesla,Tesla Model S 製造業務總監 Dag Reckhorn 擔任製造業務副總裁,Tesla 前人力資源總監 Alan Cherry 擔任 Faraday 的人力資源副總裁,Tesla 前採購總監 Tom Wessner 擔任 Faraday 供應鏈管理副總裁。但未公開 CEO 的資訊,據加州政府提供的 Faraday Future 註冊資訊顯示,該公司的 CEO 與中國網路公司樂視有密切關係,出任 CEO 的正是樂視 CEO 的助理,樂視在 2015 年上半年發表了超級汽車計畫。  

      Faraday 研發副總裁、Tesla 前總監 Nick Sampson 表示,市面上的汽車已經不能滿足用戶的需求,Faraday 將提供最智慧化的電動車,幫助用戶與外部世界連接,這位高階主管拒絕公開 Faraday 的投資方。Nick Sampson 於 2012 年 1 月從 Tesla 離職,對於他的離職,Tesla CEO Elon Musk 曾公開表示是他勸 Nick Sampson 離職的,因為 Tesla 沒有適合他的職位。   從團隊構成到產品戰略,這家神秘新創公司直指 Tesla,在公司的名稱上也與 Tesla 有異曲同工之妙,Tesla 的名字來自於交流電發明者 Nikola Tesla,而 Faraday 的名字則是來自電磁感應的發現者 Michael Faraday。

    (本文授權轉載自《》─〈〉)

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

    【其他文章推薦】

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

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

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

  • 利用爬蟲爬取LOL官網上皮膚圖片

    利用爬蟲爬取LOL官網上皮膚圖片

      今天在瀏覽網頁時,看到一篇很有意思的文章,關於網絡爬蟲的。該文章是講述如何利用request爬取英雄聯盟官網皮膚圖片。看過文章后覺得挺有用的,把代碼拿過來運行了一下,果真爬取成功。下面給大家分享一下代碼。

      首先得利用cmd命令指示符安裝requests庫,json,re,time。

      安裝完成后,第一步是獲取英雄ID從而為先面判決URL作準備。

    def getLOLImages():
        header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36'}
        url_js = 'http://lol.qq.com/biz/hero/champion.js'
        #獲取JS源代碼 Str bytes
        res_js = requests.get(url_js).content
        #轉碼 轉成字符串
        html_js = res_js.decode()
        #正則表達式
        req = '"keys":(.*?),"data"'
        list_js = re.findall(req,html_js)
        #轉成dict
        dict_js = json.loads(list_js[0])
        # print(type(dict_js))
        #定義圖片列表
        pic_list = []
        for key in dict_js:
            # print(key)#英雄ID

    第二步就是拼接URL了,通過發現英雄皮膚url的取名方式,我們可以方向最後的数字是不同的。讓后通過此方法來獲取圖片地址。

    for i in range(20):
        number = str(i)
        if len(number) == 1:
            hero_num = "00"+number
        elif len(number) == 2:
            hero_num = "0"+number
        numstr = key+hero_num
        url = "http://ossweb-img.qq.com/images/lol/web201310/skin/big"+numstr+".jpg"
        #http://ossweb-img.qq.com/images/lol/web201310/skin/big81000.jpg
        pic_list.append(url)

    第三步是獲取圖片名稱,path那行是放置圖片的地址,注意結尾的\\不能丟。

    list_filepath = []
        path = "D:\Pycharmdaima\Pachong\LOLTU\\"
    for name in dict_js.values():
        for i in range(20):
            file_path = path+name+str(i)+'.jpg'
            list_filepath.append(file_path)

    第四步就是下載圖片了。

    n = 0
    for picurl in pic_list:
        res = requests.get(picurl)
        n += 1
        #獲取狀態碼
        if res.status_code == 200:
            print("正在下載%s"%list_filepath[n])
            time.sleep(1)
            with open(list_filepath[n],'wb') as f:
                f.write(res.content)

    最後,調用一下getLOLImages()方法

    getLOLImages()

      注意,我第一次用了源碼,後來發現運行太慢,檢查一下源碼后發現代碼末尾調用了一個time.sleep()方法。這樣是為了限制爬取速度,避免速度過快被網站發現而中斷。經過調試,我中途暫停代碼運行,將sleep()方法註釋掉,爬取速度果然加快,而且沒有中斷。

      下面是我的爬取成果:

     

     

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

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

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

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

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

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

  • .NET進階篇06-async異步、thread多線程2

    .NET進階篇06-async異步、thread多線程2

    知識需要不斷積累、總結和沉澱,思考和寫作是成長的催化劑

    內容目錄

    一、線程Thread

    .NET中線程操作封裝為了Thread類,可以讓開發者對線程進行直觀操作。Thread提供了實例方法用於管理線程的生命周期和靜態方法用於控制線程的一些訪問存儲等一些外在的屬性,相當於工作空間環境變量了

    1、生命周期

    線程的生命周期有創建、啟動、可能掛起、等待、恢復、異常、然後結束。用Thread類可以容易控制一個線程的全生命周期

    Thread類的構造函數重載可以接受ThreadStart無參數和ParameterizedThreadStart有參數的委託,然後調用實例的Start()方法啟動線程。Thread的構造函數的帶有參數的委託,參數是一個object類型,因為我們可以傳入任何信息

    Thread t1 = new Thread(() => {
        Console.WriteLine($"新線程  {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
    });
    t1.Start();
    Thread t2 = new Thread((obj) => {
        Console.WriteLine($"新線程  {Thread.CurrentThread.ManagedThreadId.ToString("00")},參數 {obj.ToString()}");
    });
    t2.Start("hello kitty");

    線程啟動后,可以調用線程的Suspend()掛起線程,線程就會處於休眠狀態(不繼續執行線程內代碼),調用Resume()喚醒線程,還有一個不太建議使用的Abort()通過拋出異常的方式來銷毀線程,隨後線程的狀態就會變為AbortRequested

    常用的還有線程的等待,在主線程上啟用工作線程后,有時需要等待工作線程的完成后,主線程才繼續工作。可以調用實例方法Join(),當然我們可以傳入時間參數來表明我主線程最多等你多久

    2、後台線程

    上一章我們知道Thread默認創建的是前台線程,前台線程會阻止系統進程的退出,就是啟動之後一定要完成任務的後台線程會伴隨着進程的退出而退出。通過設置屬性IsBackground=true改為後台線程。另外還可以通過設置Priority指定線程的優先級。但這個並不總會如你所想設置了高優先級就一定最先執行。操作系統會優化調度,這也是線程不太好控制的原因之一

    3、靜態方法

    上面介紹的都是Tread的實例方法,Thread還有一些常用靜態方法。有時線程設置不當,會有些意想不到的的bug

    1.線程本地存儲

    AllocateDataSlot和AllocateNamedDataSlot用於給所有線程分配一個數據槽。像下面例子所示,如果不在子線程中給數據槽中放入數據,是獲取不到其他線程往裡面放的數據。

    var slot= Thread.AllocateNamedDataSlot("testSlot");
    //Thread.FreeNamedDataSlot("testSlot");
    Thread.SetData(slot, "hello kitty");
    Thread t1 = new Thread(() => {
        //Thread.SetData(slot, "hello kitty");
        var obj = Thread.GetData(slot);
        Console.WriteLine($"子線程:{obj}");//obj沒有值
    });
    t1.Start();

    var obj2 = Thread.GetData(slot);
    Console.WriteLine($"主線程:{obj2}");

    在聲明數據槽的時候.NET提醒我們如果要更好的性能,請使用ThreadStaticAttribute標記字段。什麼意思?我們來看下面這個例子

    //
    // 摘要:
    //     在所有線程上分配未命名的數據槽。 為了獲得更好的性能,請改用以 System.ThreadStaticAttribute 特性標記的字段。
    //
    // 返回結果:
    //     所有線程上已分配的命名數據槽。
    public static LocalDataStoreSlot AllocateDataSlot();

    例子中的如果不在靜態字段上標記ThreadStatic輸出結果就會一致。ThreadStatic標記指示各線程的靜態字段值是否唯一

    [ThreadStatic]
    static string name = string.Empty;
    public void Function()
    {
        name = "kitty";
        Thread t1 = new Thread(() => {
            Console.WriteLine($"子線程:{name}");//輸出空
        });
        t1.Start();
        Console.WriteLine($"主線程:{name}");//輸出kitty
    }

    還有一個ThreadLocal提供線程數據的本地存儲,用法和上面一樣,在每個線程中聲明數據僅供自己使用

    ThreadLocal<string> local = new ThreadLocal<string>() { };
    local.Value = "hello kitty";
    Thread t = new Thread(() => {
        Console.WriteLine($"子線程:{local.Value}");
    });
    t.Start();
    Console.WriteLine($"主線程:{local.Value}");

    上面的靜態方法用於線程的本地存儲TLS(Thread Local Storage),Thread.Sleep方法在開發調試時也是經常用的,讓線程掛起指定的時間來模擬耗時操作

    2.內存柵欄

    先說一個常識問題,為什麼我們發布版本時候要用Release發布?Release更小更快,做了很多優化,但優化對我們是透明的(計算機里透明認為是個黑盒子,內部邏輯細節對我們不開放,和生活中透明意味着完全掌握了解不欺瞞剛好相反),一般優化不會影響程序的運行,我們先借用網上的一個例子

    bool isStop = false;
    Thread t = new Thread(() => {
        bool isSuccess = false;
        while (!isStop)
        {
            isSuccess = !isStop;
        }
    });
    t.Start();
    Thread.Sleep(1000);
    isStop = true;
    t.Join();
    Console.WriteLine("主線程執行結束");

    上面例子如果在debug下能正確執行完直到輸出“主程序執行結束”,然而在release下卻一直會等待子線程的完成。這裏子線程中isStop一直為false。首先這是一個由多線程共享變量引起的問題,所以我們建議最好的解決辦法就是盡量不共享變量,其次可以使用Thread.MemoryBarrier和VolatileRead/Write以及其他鎖機制犧牲一點性能來換取數據的安全。(上面例子測試如果在子線程while中進行Console.writeLine操作,奇怪的發現release下也能正常輸出了,猜測應該是進行了內存數據的更新)

    release優化會將t線程中的isStop變量的值加載到CPU Cache中,而主線程修改了isStop值在內存中,所以子線程拿不到更新后的值,造成數據不一致。那麼解決辦法就是取值時從內存中獲取。Thread.MemoryBarrier()就可以讓在此方法之前的內存寫入都及時的從CPU Cache中更新到內存中,在此之後的內存讀取都要從內存中獲取,而不是CPU Cache。在例子中的while內增加Thread.MemoryBarrier()就能避免數據不一致問題。VolatileRead/Write是對MemoryBarrier的分開解釋,從處理器讀取,從處理器寫入。

    4、返回值

    前面聲明線程時,可以傳遞參數,那麼想要有返回值該如何去做呢?Thread並沒有提供返回值的操作,後面.NET給出的對Thead的高級封裝給出了解決方案,直接使用即可。那目前我們使用thread類就要自己實現下帶有返回值的線程操作,都是通過委託實現的,這裏簡單介紹一種,(共享外部變量也是可以,不建議)

    private Func<T> ThreadWithReturn<T>(Func<T> func)
    {
        T t = default(T);
        Thread thread = new Thread(() =>
        {
            t = func.Invoke();
        });
        thread.Start();
        return () =>

        {
            thread.Join();
            return t;
        };
    }
    //調用
    Func<intfunc = this.ThreadWithReturn<int>(() =>
    {
        Thread.Sleep(2000);
        return DateTime.Now.Millisecond;
    });
    int iResult = func.Invoke();

    二、線程池ThreadPool

    .NET起初提供Thread線程類,功能很豐富,API也很多,所以使用起來比較困難,況且線程還不都是很像理想中運行,所以從2.0開始提供了ThreadPool線程池靜態類,全是靜態方法,隱藏了諸多Thread的接口,讓線程使用起來更輕鬆。線程池可用於執行任務、發送工作項、處理異步 I/O、代表其他線程等待以及處理計時器

    1、工作隊列

    常用ThreadPool線程池靜態方法QueueUserWorkItem用於將方法排入線程池隊列中執行,如果線程池中有閑置線程就會執行,QueueUserWorkItem方法的參數可以指定一個回調函數委託並且傳入參數,像下面這樣

    ThreadPool.QueueUserWorkItem((obj) => {
                    Console.WriteLine($"線程池中線程  {Thread.CurrentThread.ManagedThreadId.ToString("00")} ,傳入 {obj.ToString()}");
                },"hello kitty");

    2、工作線程和IO線程

    一般異步任務的執行,不涉及到網絡文件等IO操作的,計算密集型,開發者來調用。而IO線程一般用在文件網絡上,是CLR調用的,開發者無需管。工作線程發起文件訪問調用,由驅動器完成后通知IO線程,IO線程則執行異步任務的回調函數

    獲取和設置最小最大的工作線程和IO線程

    ThreadPool.GetMaxThreads(out int workerThreads, out int completionPortThreads);
    ThreadPool.GetMinThreads(out int workerThreads, out int completionPortThreads);
    ThreadPool.SetMaxThreads(1616);
    ThreadPool.SetMinThreads(88);

    3、和Thread區別

    如果計算機只有8個核,同時可以有8個任務運行。現在我們有10個任務需要運行,用Thread就需要創建10個線程,用ThreadPool可能只需要利用8個線程就行,節約了空間和時間。線程池中的線程默認先啟動最小線程數量的線程,然後根據需要增減數量。線程池使用起來簡單,但也有一些限制,線程池中的線程都是後台線程,不能設置優先級,常用於耗時較短的任務。線程池中線程也可以阻塞等待,利用ManualResetEvent去通知,但一般不會使用。

    4、定時器

    .NET中有很多可以實現定時器的功能,在ThreadPool中,我們可以利用RegisterWaitForSingleObject來註冊一個指定時間的委託等待。像下面這樣,將每隔一秒就輸出消息

    ThreadPool.RegisterWaitForSingleObject(new AutoResetEvent(true), new WaitOrTimerCallback((obj, b) =>
    {
        Console.WriteLine($"obj={obj},tid={Thread.CurrentThread.ManagedThreadId},datetime={DateTime.Now}");
    }),"hello kitty",1000,false);

    我們平常見過比較多的還是timer類,timer類在.net內是好幾個地方都有的,在System.Threading、
    System.Timer、System.Windows.Form、System.Web.UI等裏面都有Timer,後面都是在第一個System.Threading里的Timer擴展

    System.Threading.Timer timer = new System.Threading.Timer((obj) =>
    {
        Console.WriteLine($"obj={obj},tid={Thread.CurrentThread.ManagedThreadId},datetime={DateTime.Now}");
    },"hello kitty",1000,1000);

    timer的底層有一個TimerQueue,利用ThreadPool.UnsafeQueueUserWorkItem來完成定時功能,和上面我們使用的ThreadPool定時器有一點區別

    實際開發中,簡單定時timer就夠用,但一般業務場景比較複雜,需要定製個性化的定時器,比如每月幾號執行,每月第幾個星期幾,幾點執行,工作日執行等。因此我們使用Quarz.NET定時框架,後面框架整合時會用到,用起來也是很簡單的

    先就啰嗦這兩點吧,下一篇應該是Task、Parallel以及Async/Await,然後總結介紹下C#的線程模式、線程同步鎖機制、異常處理,線程取消,線程安全集合和常見的線程問題

    天長水闊,見字如面,隨緣更新,拜了個拜~

    可關注主頁公號獲取更多哈

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

    【其他文章推薦】

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

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

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

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

  • 玩轉VSCode-完整構建VSCode開發調試環境

    玩轉VSCode-完整構建VSCode開發調試環境

    隨着VSCode的不斷完善和強大,是時候將部分開發遷移到VS Code中了。

    目前使用VS2019開發.NET Core應用,一直有一個想法,在VS Code中復刻VS的開發環境,同時遷移到VS Code。

    那麼現在就開始吧。

    首先,安裝最新版的VS Code:,安裝完成后可能會提示升級,升級即可,升級后的版本信息:

    版本: 1.40.1 (system setup)
    提交: 8795a9889db74563ddd43eb0a897a2384129a619
    日期: 2019-11-13T16:49:35.976Z
    Electron: 6.1.2
    Chrome: 76.0.3809.146
    Node.js: 12.4.0
    V8: 7.6.303.31-electron.0
    OS: Windows_NT x64 10.0.16299

    接下來的操作分為幾個步驟:

    1. 安裝各種強大VS Code插件

    2. 創建.NET Core解決方案和工程

    3. 調試運行

    好的,那我們開始吧。

    一、安裝各種強大的VS Code插件

    1. C# extension for Visual Studio Code

    這個插件最重要的功能:

    • Lightweight development tools for .
    • Great C# editing support, including Syntax Highlighting, IntelliSense, Go to Definition, Find All References, etc.
    • Debugging support for .NET Core (CoreCLR). NOTE: Mono debugging is not supported. Desktop CLR debugging has .
    • Support for project.json and csproj projects on Windows, macOS and Linux.

    2. C# Extensions

    這個插件最有用的功能是可以右鍵新建C#類和C#接口,同時支持各種code snippets,例如 ctor 、prop等,具體功能特性,可以查看插件的說明。

     3. Auto-Using for C#

    這個插件自動添加using引用。

    4. vscode-solution-explorer

    這個插件給VS Code增加了解決方案tab, 支持新建解決方案、新建工程、添加引用、Nuget包,這個插件非常有用

    Adds a Solution Explorer panel where you can find a Visual Studio Solution File Explorer.

    • Can load any .sln version

    • Supports csproj, vcxproj, fsproj and vbproj (from vs2017 and before)

    • Supports dotnet core projects

    • You can create, delete, rename or move project folders and files.

    • You can create, delete, rename or move solution, solution folders and projects.

    • You can add or remove packages and references when the project is of kind CPS (dotnet core).

     

    5. Code Runner(韓俊老師出品,必屬精品)

    Run code snippet or code file for multiple languages: C, C++, Java, JavaScript, PHP, Python, Perl, Perl 6, Ruby, Go, Lua, Groovy, PowerShell, BAT/CMD, BASH/SH, F# Script, F# (.NET Core), C# Script, C# (.NET Core), VBScript, TypeScript, CoffeeScript, Scala, Swift, Julia, Crystal, OCaml Script, R, AppleScript, Elixir, Visual Basic .NET, Clojure, Haxe, Objective-C, Rust, Racket, Scheme, AutoHotkey, AutoIt, Kotlin, Dart, Free Pascal, Haskell, Nim, D, Lisp, Kit, and custom command

    即選中一段代碼,直接run

    6. vscode-icons

    通過這個插件,給各個文件和文件夾一個你更熟悉的圖標

    7. Visual Studio IntelliCode

    VS代碼智能提示,根據上下文語境,自動推薦你下一步用到的代碼,後台基於AI的

    8. NuGet Package Manager

    Nuget包管理,快速查詢定位Nuget包,並安裝。不過嘗試了一下午自定義Nuget源,沒搞定,估計是URL不對

    9. Docker

    10. Kubernetes

    其他的還需要配置GitHub、TFS類似的源代碼管理,TFS搞了兩個插件,都不好使,後續搞定后再更新一次。

     

    二、創建.NET Core解決方案和工程

    此時,VS Code的環境基本配置差不多了,接下來有兩種模式,創建解決方案和工程。

    1. 通過vscode-solution-explorer

    解決方案有了,很熟悉的感覺。

    我們可以繼續創建工程:右鍵sln,Add new project:

    此時會彈出工程模板,此時我們選擇ASP.NET Core Web API工程

    選擇C#

    然後繼續輸入工程名稱:例如 TestWebApi

    熟悉的感覺來了。此時就可以開始coding了。

    以上是我們通過vscode-solution-explorer新建解決方案和工程。同時我們可以通過命令行來搞定。

    2. 通過Dotnet CLI命令行

    新建sln:

    dotnet "new" "sln" "-n" "EricTest" "-o" "e:\Work\ServiceDependency"

    新建ASP.NET Core WebAPI工程

    dotnet "new" "webapi" "-lang" "C#" "-n" "TestWebApi" "-o" "TestWebApi"

    將TestWebApi工程添加到解決方案EricTest

    dotnet "sln" "e:\Work\ServiceDependency\EricTest.sln" "add" "e:\Work\ServiceDependency\TestWebApi\TestWebApi.csproj"

    三、調試運行

    在Debug選項卡中新增調試配置,重點設置要調試的program

    保存后,啟動調試:

     

    程序中增加斷點,然後

    輸入URL:https://localhost:5001/WeatherForecast

     既可以調試了。

     

    以上是今天集中配置VS Code開發調試環境的總結,分享給大家。

     

    周國慶

    2019//11/16

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

    【其他文章推薦】

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

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

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

  • Ansibile之playbook初識

    Ansibile之playbook初識

      一、playbook簡介

      ansiblie的任務配置文件被稱為playbook,俗稱“劇本”,每一個劇本(playbook)中都包含了一系列的任務,這每個任務在ansible中又被稱為“戲劇”(play),一個劇本中包含多齣戲劇。。

      前文我們了解了ansible有兩種執行方式ad-hoc和ansible-playbook,ad-hoc主要用於臨時命令的執行,而playbook我們可以理解為ad-hoc的集合,有點類似shell腳本,ad-hoc就相當於shell腳本里的某條任務語句,playbook就相當於整個shell腳本。playbook是由一個或多個“play”組成的列表,play的主要功能在於將預定義的一組主機,裝扮成事先通過ansible中的task定義好的角色。task實際是調用ansible的一個模塊,將多個play組織在一個playbook中,即可以讓他們聯合起來,按事先編排的機制執行預定義的動作。

     如以上圖示,用戶可以把多條任務(ad-hoc任務)寫到playbook中,用戶用ansible-playbook命令調用執行編排好的playbook,ansible會讀取playbook中的每一條play和task,並按照playbook中的順序從上至下依次執行,ansible會調用每個task中定義的模塊去依次執行相應的任務,並按照playbook中指定的主機去主機清單里匹配對應的主機,然後通過ssh認證,把編譯好的相應的任務文件發送到對應的主機或網絡設備上執行,最後返回執行的狀態。

      二、YAML簡介

      playbook採用yaml語言編寫,yaml是一個可讀性高的用來表達資料序列格式的語言,它參考了其他很多種語言,包括:XML、C語言、python、perl以及电子郵箱格式RFC2822等。Clark Evans在2001年首次發表了這種語言,另外Ingy döt Net與Oren Ben-Kiki也是這語言的共同設計者。YAML( YAML Ain’t Markup Language),即yaml不是標記語言。不過在開發這種語言時,yaml的意思其實是:”Yet Another Markup Language”(仍是一種標記語言)

      ymal特性

      1)YAML的可讀性好

      2)YAML和腳本語言的交互性好

      3)YAML使用實現語言的數據類型

      4)YAML有一個一致的信息模板

      5)YAML易於實現,可以基於流程處理,表達能力強,擴展性好

    更多的內容及規範請參考官方文檔

      三、playbook語法簡介

      1)需要以“—”(3個減號)開始,且需頂行首寫。另外還有選擇性的連續三個點號(…)用來表示文件的結尾。

      2)次行開始正常寫playbook的內容,建議次行寫該playbook的功能,當然不寫也是可以的。

      3)使用“#”號註釋代碼。

      4)縮進必須統一,不能空格tab混用。

      5)縮進的級別必須是一致的,同樣的縮進代表同樣級別,程序判別配置的級別是通過縮進結合換行來實現的。

      6)YAML文件內容和Linux系統大小寫判斷方式一直,區分大小寫(大小寫敏感),k/v的值均大小寫敏感。

      7)k/v的值可同行寫也可換行寫。同行使用“:”分隔,換行寫需要以“-”分隔。

      8)v可以是字符串,也可以另外一個列表,當然也可以是字典。

      9)一個完整的代碼塊功能最少需要有name:xxx(對任務的描述)。

      10)一個name只能包括一個task

      11)yaml文件擴展名通常為yml或yaml

    list:列表,其所有元素均使用“-”開頭

    示例:

    ---
    # A list of tasty fruits
    
    - apple
    - orange
    - strawberry
    - mango
    ~           

    dictionary:字典,通常由多個key與value構成

    示例:

    ---
    #An employee record
    name: example developer
    job: developer
    skill: elite  

    當然也可以將key:value放置於{}中進行表示,用“,”分隔多個key:value

    示例:

    ---
    #An employee record
    {name: example developer,job: developer, skill: elite}
    ~                                                         

      YAML的語法和其他高階語言類似,並且可以簡單表達清單、散列表、標量等數據結構。其結構(Structure)通過空格來展示,序列(Sequence)里的項用”-“來代表,Map里的鍵值對用”:”分隔。

    示例:

    ---
    name: John Smith
    age: 41
    gender: Male
    spouse:
      name: Jane Smith
      age: 37
      gender: Female
    children:
      - name: Jimmy Smith
        age: 17
        gender: Male
      - name: Jenny Smith
        age: 13
        gender: Female
    ~                    
    

      四、playbook核心元素

      1)hosts  :指定執行任務的遠程主機列表(主機清單定義的主機組或單個主機,支持前面的說的主機模式匹配)

      2)tasks  :任務集

      3)varniables  :內置變量或自定義變量在playbook中調用

      4)templates  :模板,可替換模板文件中的變量並實現一些簡單邏輯的文件

      5)handlers  和  notity結合使用,由特定條件出發的操作,滿足條件方才執行,否則不執行

      6)tags標籤  :給指定的任務貼上標籤,我們在執行playbook的時候可以根據標籤選擇性的挑選部分代碼執行,如 ansible-playbook -t tagsname useradd.yml  ,這條命令的意思就是在useradd.yml中挑選標籤名為tagsname的任務執行

       五、playbook基礎組件

      1)hosts:

        playbook中的每一個play的目的都是為了讓特定主機以某個指定的用戶身份執行任務。hosts用於指定要執行任務的主機,須事先定義在主機清單中。hosts指定主機的形式同樣支持像主機清單中定義的那樣,支持通配,支持主機模式匹配與或非,支持IP地址,當然也支持混合匹配與或非。

    示例:在websers組,但不再dbsers組,可以這樣定義hosts

    ---
    - hosts: websers:!dbsers
    

      2)remote_user:可用於host和task中,也可以通過指定其通過sudo的方式在遠程執行任務,其可用於play全局或某個任務;此外,甚至可以在sudo時使用用sudo_user指定sudo時切換的用戶,如下所示

    ---
    - hosts: websers:!dbsers
      remote_user: root
    
      tasks:
        - name: test connection
          ping:
          remote_user: qiuhom
          sudo: yes
          sudo_user: qiuping
    

      說明:默認sudo 為root,上例指定了sudo_user 為qiuping,上述任務同sudo -u qiuping ping xxxx(代表某主機)命令一樣的意思,當然在使用sudo 時 我們還需要在目標主機上對qiuhom授權,要讓qiuhom這個用戶具有代表qiuping的權限去執行ping命令。

      3)task列表和action:play的主體部分是task list,task list 中的各任務按次序逐個在hosts中指定的所有主機上執行,即在所有主機上完成第一個任務后,再開始第二個任務;task的目的是使用指定的參數執行模塊,而在模塊參數中可以使用變量,模塊執行時是冪等的,這意味着多次執行時是安全的,其結果均一致;每個task都應該有其name,用於playbook的執行結果輸出,建議其內容能清晰地描述任務步驟,如未提供name,則action的結果將用於輸出。

      tasks:任務列表,它有兩種格式如下

        (1)action: module arguments

        (2)module: arguments        ##建議使用

       注意:shell模塊和command模塊後面跟的是命令,而非key=value

    如果某項任務的狀態在運行後為changed時,可通過“notify”通知給相應的handlers;當然任務可以通過“tags”打標籤,可以在ansible-playbook命令上使用-t指定進行指定其標籤名調用。

    示例:

    [qiuhom@test ~]$cat test.yml 
    ---
    - hosts: websers:!dbsers
      remote_user: root
    
      tasks:
        - name: test connection
          ping:
          remote_user: qiuhom
          sudo: yes
          sudo_user: qiuping 
          tags: test
        - name: test command
          shell: /bin/ls /home/qiuhom/
    [qiuhom@test ~]$ansible-playbook -t test test.yml 
    

      說明:用-t 指定標籤名,表示只運行所指定標籤所在的任務,當然同名的標籤可以在多條任務中,一個任務也可以有多個標籤。

    如果命令或腳本的退出碼不為零,可用使用如下方式忽略或跳過繼續執行以下代碼

    ---
    - hosts: websers:!dbsers
      remote_user: root
    
      tasks:
        - name: run this command and ignore the result
          shell: /usr/sbin/ip addr show eth0 || /bin/true
        - name: run this command and ignore the result
          shell: /usr/sbin/ip addr show eth0
          ignore_errors: True
    

      說明:兩種方式都可以跳過出錯的命令而不打斷playbook,繼續執行以下的代碼,前者使用的短路或的特性,後者使用ignore_errors參數來控制

      六、playbook運行的方式

    ansible-playbook <filename.yml> ... [options]
    

    常用選項:

      -C , –check  : 只檢查可能會發生的改變,但不真正執行操作,相當於空跑一遍playbook,測試下是否和自己預想的結果一樣,但它不會真正的去遠端主機上執行。常用於測試寫的playbook語法是否有誤。

      –list-hosts  :列出playbook指定運行任務所匹配的主機

      –list-tags    :列出playbook中所有標籤名稱列表

      –list-tasks  :列出playbook中所有任務名稱及標籤名稱

      –limit 主機列表   :只針對指定主機列表中的主機執行當前playbook(指定主機列表必須是在playbook里定義的主機列表範圍內)

      -v,-vv,-vvv       :  显示執行playbook的過程,-v,显示較簡單,-vv显示較詳細,-vvv显示整個過程(非常詳細)

    [root@test ~]#cat test.yml 
    ---
    - hosts: websers
      remote_user: root
    
      tasks:
        - name: run this command 
          shell: hostname
          tags: hostname
          ignore_errors: True
        - name: show ip addr
          shell: /sbin/ip addr show
          tags: showip
    [root@test ~]#ansible-playbook test.yml --list-hosts
    
    playbook: test.yml
    
      play #1 (websers): websers    TAGS: []
        pattern: [u'websers']
        hosts (2):
          192.168.0.128
          192.168.0.218
    [root@test ~]#ansible-playbook test.yml --list-tags
    
    playbook: test.yml
    
      play #1 (websers): websers    TAGS: []
          TASK TAGS: [hostname, showip]
    [root@test ~]#ansible-playbook test.yml --list-tasks
    
    playbook: test.yml
    
      play #1 (websers): websers    TAGS: []
        tasks:
          run this command  TAGS: [hostname]
          show ip addr      TAGS: [showip]
    [root@test ~]#ansible-playbook test.yml --limit 192.168.0.218
    
    PLAY [websers] ********************************************************************************************************
    
    TASK [Gathering Facts] ************************************************************************************************
    ok: [192.168.0.218]
    
    TASK [run this command] ***********************************************************************************************
    changed: [192.168.0.218]
    
    TASK [show ip addr] ***************************************************************************************************
    changed: [192.168.0.218]
    
    PLAY RECAP ************************************************************************************************************
    192.168.0.218              : ok=3    changed=2    unreachable=0    failed=0   
    
    [root@test ~]#ansible-playbook test.yml --limit 192.168.0.218 -v
    Using /etc/ansible/ansible.cfg as config file
    
    PLAY [websers] ********************************************************************************************************
    
    TASK [Gathering Facts] ************************************************************************************************
    ok: [192.168.0.218]
    
    TASK [run this command] ***********************************************************************************************
    changed: [192.168.0.218] => {"changed": true, "cmd": "hostname", "delta": "0:00:00.002139", "end": "2019-11-16 23:11:02.996962", "rc": 0, "start": "2019-11-16 23:11:02.994823", "stderr": "", "stderr_lines": [], "stdout": "localhost.localdomain", "stdout_lines": ["localhost.localdomain"]}
    
    TASK [show ip addr] ***************************************************************************************************
    changed: [192.168.0.218] => {"changed": true, "cmd": "/sbin/ip addr show", "delta": "0:00:00.002604", "end": "2019-11-16 23:11:03.733004", "rc": 0, "start": "2019-11-16 23:11:03.730400", "stderr": "", "stderr_lines": [], "stdout": "1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN \n    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00\n    inet 127.0.0.1/8 scope host lo\n    inet6 ::1/128 scope host \n       valid_lft forever preferred_lft forever\n2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000\n    link/ether 00:0c:29:e8:f6:7b brd ff:ff:ff:ff:ff:ff\n    inet 192.168.0.218/24 brd 192.168.0.255 scope global eth0\n    inet6 fe80::20c:29ff:fee8:f67b/64 scope link \n       valid_lft forever preferred_lft forever\n3: pan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN \n    link/ether d2:7a:38:cf:27:60 brd ff:ff:ff:ff:ff:ff", "stdout_lines": ["1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN ", "    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00", "    inet 127.0.0.1/8 scope host lo", "    inet6 ::1/128 scope host ", "       valid_lft forever preferred_lft forever", "2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000", "    link/ether 00:0c:29:e8:f6:7b brd ff:ff:ff:ff:ff:ff", "    inet 192.168.0.218/24 brd 192.168.0.255 scope global eth0", "    inet6 fe80::20c:29ff:fee8:f67b/64 scope link ", "       valid_lft forever preferred_lft forever", "3: pan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN ", "    link/ether d2:7a:38:cf:27:60 brd ff:ff:ff:ff:ff:ff"]}
    
    PLAY RECAP ************************************************************************************************************
    192.168.0.218              : ok=3    changed=2    unreachable=0    failed=0   
    
    [root@test ~]#
    

      說明:–limit 所指定的主機必須是在playbook中所指定的主機範圍內。

       七、playbook vs shell scripts

      1)shell腳本如下:

    #!/bin/bash
    # 安裝Apache
    yum install --quiet -y httpd
    # 複製配置文件
    cp /tmp/httpd.conf /etc/httpd/conf/httpd.conf
    cp/tmp/vhosts.conf /etc/httpd/conf.d/
    # 啟動Apache,並設置開機啟動
    service httpd start
    chkconfig httpd on
    

      2)playbook

    ---
    - hosts: websers
      remote_user: root
    
      tasks:
        - name: create apache group
          group: name=apache gid=80 system=yes
        - name: create apache user
          user: name=apache uid=80 group=apache system=yes shell=/sbin/nologin home=/var/www/html 
        - name: install httpd
          yum: name=httpd
        - name: copy config file
          copy: src=/tmp/httpd.conf dest=/etc/httpd/conf/
        - name: copy config 2 file
          copy: src=/tmp/vhosts.conf dest=/etc/httpd/conf.d/
        - name: start httpd service
          service: name=httpd state=started enabled=yes     
    

      說明:兩者都是實現同樣的目的,很明顯playbook的優勢要比腳本的優勢多,playbook 可以針對很多台主機進行任務執行,而腳本只可以在某一台主機上執行;腳本重複執行沒有冪等性,很有可能帶來很多錯誤,而playbook卻不會有這樣的苦惱。

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

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

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

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

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

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

  • 快速搭建Jenkins集群

    快速搭建Jenkins集群

    關於Jenkins集群

    在Jenkins上同時執行多個任務時,單機性能可能達到瓶頸,使用Jenkins集群可以有效的解決此問題,讓多台機器同時處理這些任務可以將壓力分散,對單機版Jenkins的單點故障的隱患也有分散作用,今天就來實戰快速搭建Jenkins集群,Jenkins版本是2.190.2;

    如何做到快速搭建集群

    通過Docker可以省去大部分準備工作,您只需在Linux電腦上安裝docker,在輔以少量命令和操作即可完成集群搭建;

    環境信息

    本次實戰的環境一共要用三台電腦,它們的設置都是一樣的,如下:

    1. 操作系統:CentOS Linux release 7.6.1810
    2. 防火牆關閉
    3. docker:1.13.1

    三台電腦的信息如下:
    | 主機名 | IP地址 | 作用 |
    |–|–|–|
    | master | 192.168.133.131 | Jenkins集群的master節點,提供web服務 |
    | agent1 | 192.168.133.132 | Jenkins集群的一號工作接節點,標籤是maven |
    | agent2 | 192.168.133.133 | Jenkins集群的二號工作接節點,標籤是gradle |

    建議agent2節點的內存大於4G,因為下一篇的實戰操作會用agent2編譯構建spring-framework,對內存的需求略大;

    準備工作

    1. 後面的所有操作都是root賬號;
    2. 在每台電腦上創建文件夾/usr/local/jenkins

      創建Jenkins的master

    3. 登錄master機器,執行以下命令:
    docker run \
      -u root \
      -idt \
      --name master \
      -p 8080:8080 \
      -p 50000:50000 \
      -v /usr/local/jenkins:/var/jenkins_home \
      -v /var/run/docker.sock:/var/run/docker.sock \
      jenkinsci/blueocean:1.19.0
    1. 執行docker logs master,會在控制台显示jenkins的登錄秘鑰,如下圖紅框所示:
    2. 瀏覽器輸入地址: ,显示Jenkins登錄頁面,如下圖所示,在紅框位置輸入剛才複製的登錄秘鑰即可登錄:
    3. 選擇安裝推薦的插件
    4. 靜候插件在線安裝完成:
    5. 接下來是創建管理員和使用實例url的操作,這裏就不多說了,您按實際情況自行斟酌;

      至此,Jenkins的master已經搭建好,接下來將agent1和agent2作為工作節點加入集群;

      加入agent1

    6. 在Jenkins網頁上新增節點,操作如下圖,先進入節點管理頁面:
    7. 如下圖,新增一個節點,名為agent1
    8. 接下來的節點詳情信息如下圖,注意四個紅框中的內容要和圖中保持一致:
    9. 保存成功後會显示機器列表,如下圖,圖標上的紅叉表示機器不在線(此時agent1還沒有接入),點擊紅框:
    10. 如下圖所示,紅框中的命令就是agent1的啟動命令,執行該命令的機器會以agent1的身份加入集群:
    11. 注意上圖紅框中的agent.jar是個名為agent.jar的文件的下載鏈接,將此文件下載到agent1電腦的/usr/local/jenkins目錄下;
    12. ssh登錄agent1電腦,執行以下命令,即可將agent1加入Jenkins集群:
    docker run \
      -u root \
      -idt \
      --name agent \
      -v /usr/local/jenkins:/usr/local/jenkins \
      bolingcavalry/openjdk-with-sshpass:8u232 \
      java -jar /usr/local/jenkins/agent.jar \
      -jnlpUrl http://192.168.133.131:8080/computer/agent1/slave-agent.jnlp \
      -secret 44c3e8d1531754b8655b53294bbde6dd99b3aaa91a250092d0d3425534ae1058 \
      -workDir "/usr/local/jenkins"

    上述命令中的後半部分,即java -jar ……就是前面圖片紅框中的agent1啟動命令,唯一要改變的是將agent.jar改成絕對路徑/usr/local/jenkins/agent.jar

    1. 上述命令的鏡像是bolingcavalry/openjdk-with-sshpass:8u232,其Dockerfile內容如下,可見非常簡單,就是OpenJDK鏡像裏面安裝了sshpass,這樣的容器可以在執行ssh命令時帶上遠程機器的密碼,而不用等待用戶輸入密碼,這樣便於shell腳本執行ssh命令:
    FROM openjdk:8u232
    
    ARG DEBIAN_FRONTEND=noninteractive
    RUN apt-get update && apt-get install --assume-yes sshpass
    1. 去Jenkins的網頁上查看節點列表,如下圖,可見agent1已經成功加入:

      加入agent2

      agent2加入集群的方式和agent1大部分是一樣的,只有以下兩點要注意:

    2. 在Jenkins頁面上創建節點,名稱是agent2
    3. agent2的標籤是gradle,如下圖紅框所示:
    4. 此時agent2也加入成功:

      至此,Jenkins集群搭建完成,這兩個節點帶有不同的標籤,下一篇文章中,我們在這個集群環境創建pipeline任務,並通過標籤被分配到不同的節點上,實現多節點并行執行;

      歡迎關注公眾號:程序員欣宸

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

    【其他文章推薦】

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

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

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

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

  • 微信作弊,為3款小遊戲引擎開掛增速,將給小遊戲帶來怎樣的利好?

    微信作弊,為3款小遊戲引擎開掛增速,將給小遊戲帶來怎樣的利好?

    11月14日小遊戲開發圈子,有一條重磅新聞:“微信小遊戲聯合遊戲引擎廠商,推出引擎插件功能,可為小遊戲提升0.5~2秒的啟動時間”。

    引擎插件是個什麼東西?

    昨天有不少人在問曉衡:“引擎插件到底是個什麼東西?”、“又要讓我學習新東西嗎?”、“引擎插件是怎麼加速的,不太明白?” …

    曉衡也在第一時間,將文檔通讀了一遍,並用自己的小遊戲工程做了測試,對微信小遊戲引擎插件算是有了一個簡單的認識,看下圖:

    普通模式,每一個使用遊戲引擎開發的小遊戲,都需要下載遊戲引擎代碼模塊。

    引擎插件模式,僅第一個遊戲需要下載引擎代碼,其它使用同類引擎的遊戲,可共享之前 A 遊戲下載過的遊戲引擎代碼,從而加速遊戲的啟動時間。

    從事小遊戲開發和運營的夥伴應該都很了解,H5、小遊戲注重啟動加載速度,它對新用戶的體驗和流失都至關重要。

    啟動概況分析

    估計有人會覺得引擎插件就加快了0.5~2秒有什麼用?眨個眼的時間而已。

    其實對使用 Cocos Creator 開發的休閑類的小遊戲來說,目前的微信小遊戲啟動速度已經很不錯了,首包含引擎的話,iOS 在4 ~ 6秒啟動,Android 大多可以在6~8秒左右打開首屏,並不像微信吹噓的1秒啟動,估計只有 引擎和資源全放子包的遊戲可以做到!

    下面我將自己個人開發的一款微信小遊戲,在微信公測的前後两天做了一個數據統計,想窺視一下啟動性能對留存的影響,下圖是曉衡的遊戲在8月7日 ~ 8月9日時的活躍情況:

    遊戲是在8月7日的晚上10:00點打開的微信公測,微信平台在24小時內持續導入5184的用戶,當天遊戲啟動8121次。不過圖片上的數據比較尷尬,公測一過就沒幾個玩家了,但它不是我們要講的重點,我們是用這個時間節點、用戶數量,來看微信小遊戲的啟動性能表現。

    iOS啟動概況

    Android啟動概況

    從圖中看,8月7日這天 iOS 的總啟動時間比 Android 快 3.88 秒,Android 的用戶流失比 iOS 要多 12.55%,這裏重點也不是說 iOS 和 Android 系統那個好,而是看遊戲的啟動時間對首屏打開留存的影響。

    這是另一個朋友的遊戲《周車勞盾》在9月14日微信公測4800+用戶,遊戲啟動7000+次,下面是它在9月13~9月15日的啟動概況:

    《周車勞盾》的 iOS 首屏打開留存率由於用戶數太少,不太好與 Android 對比,並且朋友說當時遊戲沒有做分包優化。在9月14日公測當天,由於新用戶多,iOS、Android 的啟動速度都不快,在 10 秒左右。從中也可以看出微信小遊戲用戶,以及微信導量用戶,以 Android 屬性為主。

    啟動流失分析

    下圖是曉衡的遊戲在8月8日公測時的 Android 手機用戶流失分佈情況,統計一共有 893 名流失用戶:

    從前面的啟動概況看到,小遊戲啟動進入首屏是在8.38s,我們以9秒為分界線,將上圖分成左右兩部分:

    • 右邊標註綠色線框,是已經進入遊戲后流失的人數,這部分的優化需要美術和策劃同學的幫助。
    • 左邊紅色線框中的用戶,是在遊戲啟動過程中流失掉的共計679人佔76%,而且前4秒流失的最多共543占 60%,如果不計算已經打開首屏的更是高達80%,因此前幾秒它才是我們關心的重點。

    曉衡根據平常使用微信的習慣,模擬分析一下前8秒的用戶是大概會是什麼情況走失的,需要注意的一個前題是,這些用戶都是微信導量進入的,絕大多是手滑不小心點到廣告,並不是目標用戶。

    • 第1秒:1秒流失用戶,手滑的機率最大,似乎經過專業訓練,眼、腦、手的速度都非常的快,遊戲是什麼都沒看清就閃人了;
    • 第2秒:2秒流失用戶,與1秒戶大概差不多,只是動作稍慢而已,此時遊戲圖標已經進入視覺系統,但估計比較模糊,瞬間閃人;
    • 第3秒:3秒流失用戶,不僅遊戲圖標已經從視覺系統進入大腦,遊戲名字估計也是能看清楚,但是沒有任何感覺,同樣是條件反射,快速點擊關閉;
    • 第4秒:4秒流失用戶,已經是把遊戲圖標、名字已經完全進入大腦神經迴路,給他反饋的信號是沒有愛,甚至是反感,迅速閃人了。第4秒很關鍵,因為用戶已經有了思考!
    • 第5~6秒:5~6秒流失用戶,認真看完遊戲圖標、名字,以及加載進度,經過大腦綜合反饋,這個遊戲不值得等待,88了!
    • 第7~8秒:7~8秒流失用戶,估計是盯到了遊戲的加載進度,在100%或某個数字上停止下一瞬間,實在是不耐煩了,什麼個鬼遊戲,半天進不去,走了!

    以上分析是曉衡的個人YY,僅供參考,這裏要說的是前 3 秒流失的用戶大多是條件反射,很難轉化。當用戶將遊戲圖標、遊戲名稱看清了后,大腦產生了思考,再離開的這對我們來說還有機會爭取,讓他們早點看到遊戲首屏,已經花了這5、6秒了,體驗一下再走!

    提升遊戲0.5 ~ 2秒的啟動速度是非常具有價值的,而且小遊戲絕大多數又是 Android 用戶,特別是對需要買量的遊戲來說,時間就是金錢,毫秒必爭。

    引擎插件帶來的好處

    下面我們再來看看,引擎插件具體在那些場景下會帶來比較明顯的性能提供,盡可能充分利用這個機制呢?

    微信公測

    對於個人開發者,使用微信公測功能免費送5000流量,一定要利用好這個機會。將首包資源做到盡量小巧,引擎裁剪、圖片壓縮一定要做足,同時盡量選擇使用量較多的引擎版本號(目前曉衡了解到的,使用較多 Cocos Creator 引擎版本號分佈在:2.0.8 ~ 2.0.10、2.1.3、2.2.0,不過還是要以微信或 Cocos 官方統計為準),這樣容易蹭上已經下載過的遊戲引擎,這對大多數遊戲來說都是適用的。

    中重度遊戲

    中重度遊戲,通常會依賴較多的引擎模塊,比如 RPG 遊戲中的:地圖、角色動畫,會使用TileMap、Spine、DragonBones、Animation 等模塊,還有一些遊戲會使用到物理引擎模塊、碰撞模塊等,完整引擎模塊高達 1.6M。

    隨着微信引擎插件的廣泛普及,以後構建遊戲完全時可以將引擎裁剪到最精簡狀態,大概在550K左右。甚至可以想像到,以後小遊戲平台完全不用上傳引擎代碼,構建時只用配置上使用的什麼引擎,引擎版本號即可。

    中重度遊戲利用引擎插件同樣可以快速進入首屏,首包僅保留炫麗的動效和初始界面,用分治的方式動態下載遊戲當前必要的內容,儘快讓用戶參与到遊戲中去。還有隨着 5G 的到來,中重度遊戲的遊戲資源下載劣勢也會得到改善,對小遊戲更是一件好事。

    遊戲矩陣

    單款小遊戲一般是很難有收益的,甚至是虧本買賣。微信平台,一個小遊戲可以支持10個遊戲的跳轉,目前絕大多數遊戲商廠,都會在小遊戲中集成其它遊戲的入口加大流量,優質的遊戲還會出售遊戲跳轉坑位,有的還價格不菲。個人開發者也意識到了遊戲間跳轉帶來的爆光機會,不少開發者會在微信公眾時,組織邀請好友建立鏈接。

    如果是自家開發的休閑小遊戲,利用引擎插件的啟動增速,再配合上自定義的啟動背景(頭條支持),讓玩家感受不出是在不同遊戲中切換,在矩陣中瞬間穿梭,這也將極大增加遊戲的曝光率,降低流失。

    小結

    劉潤老師說的好:“一切的商業價值,要看是否讓用戶獲益”。

    微信引擎插件不僅讓普通用戶能獲得更好的遊戲體驗,也能讓遊戲開發商能中從獲益。點開即玩的小遊戲,縮短了遊戲產品呈現在用戶手中的時間,極大優化了產品的傳遞價值。

    曉衡是一個搬運工,傳遞有價值的遊戲開發技術,如果覺得本文對你有用,感謝來看個再看或傳遞給朋友。感謝您的閱讀,願我們在前進的道路上“砥礪前行,共同成長!”

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

    【其他文章推薦】

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

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

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

  • 盤點2016年起實施的新能源汽車新政策

    盤點2016年起實施的新能源汽車新政策

    電動汽車充電介面及通信協定5項新國標  

    第一版電動汽車充電介面等4項國家標準曾在2011年發佈,並於2012年3月1日起實施,包括《電動汽車傳導充電用連接裝置第1部分:通用要求》、《電動汽車傳導充電用連接裝置第2部分:交流充電介面》、《電動汽車傳導充電用連接裝置第3部分:直流充電介面》《電動汽車非車載傳導式充電機與電池管理系統之間的通信協定》等。此次發佈的5項國家標準在4項標準的修訂基礎上新增《電動汽車傳導充電系統 第1部分:一般要求》,於2016年1月1日起正式實施。

    標準內容:新修訂的5項國家標準主要在提高電動汽車充電設施安全性及相容性方面做出更進一步的要求。

    交流充電部分,更新禁止採用存在安全隱患的直通電纜加普通家用插頭的連接方式,大於16安培的充電方式要求在車輛插座和供電插座安裝電子鎖和溫度感測器等規範。

     

    直流充電部分,更新在直流充電槍內要求安裝電子鎖,同時預留車輛插座加裝電子鎖的機械結構,要求車輛和設施必須具備檢測和告警功能等規範。

     

    新能源車補貼政策  

    2015年4月29日,新一輪新能源汽車補貼政策正式出臺,其中指出在2016-2020年,對消費者購買的進入國家新能源車目錄的純電動汽車、插電式混合動力汽車和燃料電池汽車繼續給予購車補貼。新標準規定新能源車的補貼將分階段退坡,到2020年補貼標準將在2016年基礎上下降40%。

    政策內容:新的補貼標準將依據節能減排效果,並綜合考慮生產成本、規模效應、技術進步等因素逐步下調。具體下調辦法是,2017-2018年補貼標準將在2016年基礎上下降20%,2019-2020年補貼標準在2016年基礎上下降40%。而燃料電池汽車的補貼將從2015年的18萬元/輛提升至20萬元/輛。

     對比2013—2015年新能源車補貼標準,2016年起執行的新補貼標準針對續駛里程大於等於80km小於150km的純電動車和增程式在內的插電式混合動力乘用車的補貼金額分別降低了6500元和1500元,而續駛里程大於等於250km的電動車和燃料電池乘用車補貼金額分別提高了1000元和2萬元,因而您在購買新能源車的時候,續駛里程將是非常關鍵的價格影響因素。

    新補貼標準對補助範圍內的新能源汽車產品技術的要求也有所提高,其中純電動乘用車的最低續駛里程由大於等於80km提升至100km,同時在行駛速度方面,純電動乘用車30分鐘最高車速應不低於100km/h。

    車船稅管理新規  

    規程內容:規程中指出,已經繳納車船稅的車船,因品質原因,車船被退回生產企業或者經銷商的,納稅人可以向納稅所在地的主管稅務機關申請退還自退貨月份起至該納稅年度終了期間的稅款,退貨月份以退貨發票所載日期的當月為准。

    此外,已完稅車輛被盜搶、報廢、滅失而申請車船稅退稅的,由納稅人納稅所在地的主管稅務機關按照有關規定辦理。

    而對不屬於車船稅徵稅範圍的純電動乘用車和燃料電池乘用車,應當積極獲取車輛的相關資訊予以判斷,對其徵收了車船稅的應當及時予以退稅。

    第四階段乘用車燃料消耗量限值  

    政策內容:2012年6月28日,國務院發佈《節能與新能源汽車產業發展規劃(2012-2020年)》,明確了我國汽車節能標準的整體目標,要求2020年當年乘用車新車平均燃料消耗量達到5.0 L/100km。目前,第四階段的GB 19578-2014《乘用車燃料消耗量限值》和GB 27999-2014《乘用車燃料消耗量評價方法及指標》已於2014年12月22日正式發佈,於2016年1月1日起實施,要求汽車生產企業2016年平均燃料消耗標準需滿足6.7L/100km。

    除了以上提到的自2016年1月1日起實施的政策外,還有一些和我們密切相關的政策和措施已在2015年的最後一天終止或完成,讓我們也來關注一下。

    節能惠民補貼政策到期取消

    政策內容:2013年,國家財政部、發展改革委、工業和資訊化部發佈《關於開展1.6升及以下節能環保汽車推廣工作的通知》,決定從2013年10月1日起至2015年12月31日,繼續實施1.6升及以下節能環保汽車(乘用車)推廣政策,對購買符合條件節能汽車的消費者給予3000元補貼。截止2015年末,國家共實施了3個階段的汽車節能補貼,從每一輪政策的推出可以發現,國家對享受節能補貼的車型要求在逐年提高,推廣車輛要達到產品綜合燃料消耗量標準也由2011年的6.9L調整到2013年的5.9L,且需符合“國V”排放標準。

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

    【其他文章推薦】

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

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

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

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

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

  • 賓士傳將開發四款純電動車

    世界級車商賓士(Mercedes-Benz)被報導正在開發全新的電動車平台,並將以此平台為基礎,推出四款純電動汽車。

    ETToday引述外媒《Car Magazine》的報導,表示賓士正以MRA平台為基礎開發一款名為「EVA」的電動車平台,可供後續開發C-Class到S-Class尺碼的各式車款,最高能搭載400公斤的電池組。而在動力方面,後驅車型可能搭載一具402匹馬力的電動馬達,四驅車行可能還會再加上一具120匹馬力或者201匹馬力的馬達。主動懸載、扭力分配、動能回收等功能也將面面俱到。

    該報導表示,賓士官方並未證實這項消息,但將在2018年推出C-Class與E-Class之間的電動轎車,並以此為基礎再行打造一款休旅車。此後還有S-Class和GLS等級的電動車款會問世。《Car Magazine》表示,賓士目標為每年銷售2萬輛電動車,入門車款售價為7萬英鎊起跳。

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

    【其他文章推薦】

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

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

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

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