外媒公布最佳 5 大分類 CPU 處理器推薦名單(全能、遊戲、生產力等)_包裝設計

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

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

升級 CPU 處理器時,雖然價格越貴效能絕對是越好,但並不是每個人都預算無上限,而且需求也不一樣,有些人主要是為了玩遊戲、也有些人生產力居多,甚至是想要找各方面表現都不錯的處理器。為此,近日知名硬體外媒就公布目前最佳 CPU 處理器名單,從全能、遊戲、頂級、到生產力都有,應該可以提供你不錯參考。

最佳 5 大分類 CPU 處理器推薦名單

下方是外媒 TECHSPOT 公布的前 5 名最佳 CPU 處理器名單,另外他們也提醒,對於不急的人來說,其實可以先等等,因為三月 Intel 很可能會推出第 11 代 Rocket Lake 處理器,到時排名有可能會變動。

最佳全能 CPU 處理器

  • 獲選的是「Ryzen 5 3600 或 Core i5-10400F」

TECHSPOT 表示,Ryzen 5 3600 會是最佳選擇,但如果你不喜歡 AMD CPU,則可以考慮 i5-10400F,這兩顆的品質與價格都非常不錯,因此可以大幅降低組裝成本。除此之外,幾個月前 Ryzen 5 3600  還是 Amazon 銷售排名第一,至今仍然相當暢銷。

最佳遊戲 CPU 處理器

  • 獲選的是「i9-10900K、10700K 或 Ryzen 9 5900X」

對於追求最佳遊戲效能 CPU 的人,則可以把範圍縮小到 Ryzen 7 5800X、Ryzen 9 5900X 與 5950X,或Core i7-10700K 與 Core i9-10900K,這幾顆的遊戲效能都差不多,不過多數遊戲都不需要超過 8 核心,因此最有價值的選擇會是 Ryzen 7 5800X 或 i7-10700K。

另外有些人可能會想說,Ryzen 7 5800X 並沒有獲選,為什麼他們推薦?這是因為 Ryzen 9 5900X 就技術來說更有價值,但如果只是為了玩遊戲,選 5900X 似乎有點浪費錢。

最佳頂級桌上型 CPU 處理器

  • 獲選的是「AMD Ryzen Threadripper 3990X」

這不讓人意外,TECHSPOT 稱 AMD Ryzen Threadripper 3990X 是一個野獸,高達 64 核心、128 執行緒的規格,效能不容懷疑,但價格當然也非常不便宜。

如果你覺得這顆太貴,Threadripper 3970X 或 3960X 也是不錯,近一年的時間他們都用 3960X 處理器當作主要遊戲、影片編輯的處理器,體驗一直都很棒。

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

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

最佳生產力 CPU 處理器

  • 獲選的是「AMD Ryzen 9 5900X 或 5950X」

想要有最佳生產力的用戶,Ryzen 9 5900X 或 5950X 絕對是最佳選擇,價格分別為 550 美元與 800 美元,不過長期都處於缺貨狀態,因此無法等待的人,替代方案可改上一代的 3900X / 3950X 或 i9-10900K。

最佳預算內 CPU 處理器

  • 獲選的是「Intel i3-10100」

過去 TECHSPOT  都推薦 Ryzen 3 3300X,但自從 2020 年中之後就買不到,都沒補貨,因此才改推 Intel 這顆 i3-10100,遊戲效能跟比較貴的 Ryzen 5 1600 AF 相當,而且長期都能買到,這點比 AMD 出色。

另外有多一點預算,想要有效能不差內顯的處理器,Ryzen 5 3400G 仍然是最佳選擇。

結論

從以上名單可以明顯看出,就生產力來說,TECHSPOT 大多都推薦 AMD 處理器,畢竟核心與執行緒數量較多,但遊戲部分就 Intel 稍微強一點。所有推薦處理器 TECHSPOT 都有進行實測報告,有興趣閱讀的人,可以點我至 TECHSPOT 網站查看。

資料來源:TECHSPOT

國外零售商洩漏 Intel 第 11 代 Rocket Lake-S 處理器的售價,i9-11900K 價格比上一代便宜一些

您也許會喜歡:

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

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

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

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

Asp.net MVC Razor視圖模版動態渲染PDF,Razor模版生成靜態Html_包裝設計

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

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

1.前言

 

    上一篇文章我開源了輪子,Asp.net Core 3.1 Razor視圖模版動態渲染PDF,然後,很多小夥伴有很多私信找我了。那麼我下面就簡單的給大家說一下,關於小夥伴問的這些問題。

  • 我項目的电子簽章部分代碼可否開源?

  答:我項目电子簽章也是使用第三方的电子簽章,电子簽章並不是自己實現的,項目裏面的电子簽章代碼無非也是對接第三方的接口。這部分代碼開源出去也沒有什麼意義。我們是使用数字廣東的方案,如果您也是使用該数字簽章,可以私下溝通我看看能不能幫助您。

  • 电子簽章實現難不難,怎麼實現自己的电子簽章?

  答:电子簽章要實現,估計不是太難,按照我的理解,當然我沒有具體深入研究(如果這裏我有妄自菲薄的意思,請諒解,畢竟我能力有限,只是按照我的理解來分析),我個人覺得电子簽章應該就是利用数字證書給PDF簽名,然後加密保護文檔,然後校驗文檔的真偽,就要考慮怎麼驗證這個文檔沒有被刪改,是當初我們簽章的這個文檔,而且這個簽名不能被偽造。個人覺得不是很複雜,但是,电子簽章的法律有效性卻不是這麼簡單的。按照國家法律規定,利用的簽名平台應該有資質的,國家認可的第三方簽章平台,也就是說,私人自己製作的簽章,打起官司來,很難得到法律支持。

  • 項目為什麼CSS樣式不起效?

  答:你是否使用了外鏈的CSS樣式,因為渲染Razor視圖是在後台渲染,無法找到外鏈的文件路徑,就使用不了外鏈的CSS樣式,內嵌和內聯CSS樣式都沒啥問題的。

  • 用word或者excel模版他不香嗎?為什麼要搞個這個東西?

  答:無非是多一個方案,具體你使用什麼完全是你自己說了算,你覺得其他方案好就用,你覺得本方案能幫助你就用,不好就不用,我又不收你半毛線,還是想說的是,你其他的方案,能有用CSS那麼容易做出來漂亮的表單效果嗎?

  • 圖片支持嗎?

  答:圖片要轉Base64編碼,不支持外連接圖片。

  • 前端預覽PDF用什麼插件?

  答:我目前不用插件,新一代瀏覽器都支持PDF直接預覽,直接就能渲染成PDF呈現,當然你也可以自己集成PDF.JS.我大概看了下,集成也很方便。我之所以不集成,是考慮到我的項目有可能使用IE低版本的情況,PDF.JS可能不支持。所以乾脆直接把PDF流推送給瀏覽器,瀏覽器要是能預覽,就直接呈現,不能預覽就下載。

  • 項目支持net Framework嗎?為啥報錯?

  答:這個問題問的有點多,所以本文後續就以這個再說一下本輪子在net45下的使用。還是那句話,有不對的,歡迎您指正,覺得對你有用的就用,無用的就直接忽視,我又不收你半毛線。

  • 可以用本項目生成靜態Html嗎?容易被搜索引擎抓取。

  答:可以,後面演示

 

  2.依賴項目

  <PackageReference Include=”TuesPechkin” Version=”2.1.1″ />
  <PackageReference Include=”TuesPechkin.Wkhtmltox.Win32″ Version=”0.12.2.1″ />
  <PackageReference Include=”RazorEngine” Version=”3.9.3″ />
  <PackageReference Include=”System.ComponentModel.Annotations” Version=”4.5.0″ />
  <PackageReference Include=”Microsoft.AspNet.Mvc” Version=”5.2.3″ />
  <PackageReference Include=”Nito.AsyncEx” Version=”4.0.1″ />
  <PackageReference Include=”Newtonsoft.Json” Version=”12.0.3″ />
  <Reference Include=”Nito.AsyncEx.Concurrent” Version=”4.0.1″ />
  <Reference Include=”Nito.AsyncEx.Enlightenment” Version=”4.0.1″ />

 

     3.核心代碼

    TuesPechkin插件,首先說一下這個TuesPechkin插件,他其實是利用TuesPechkin.Wkhtmltox進程來轉換的。這個插件使用還是要小心的,使用不當可能有線程安全問題,會使得當前工作進程掛起。在IIS下面使用也要注意使用32位的插件。具體使用請看作者的說明:https://github.com/tuespetre/TuesPechkin/blob/develop/README.md

 

 

 

 插件初始化代碼:

 

  private static readonly IConverter PdfConverter = new ThreadSafeConverter(new RemotingToolset<PdfToolset>(
            new Win32EmbeddedDeployment(
                new TempFolderDeployment())));

  

 切記IIS和多線程一定要靜態單例。使用

 Win32EmbeddedDeployment

ThreadSafeConverter
這兩個類。其他的可能讓你進程掛起的成為可能。
還要用到遠程工具集的PDF工具集。


Razor 轉Html代碼,主要有兩種方式:


第一種使用RazorEngine來轉換:這個主要是傳遞Razor模版進去,轉換。

   protected string RunCompileRazorTemplate(object model,string razorTemplateStr)
        {
            if(string.IsNullOrWhiteSpace(razorTemplateStr)) throw new ArgumentException("Razor模版不能為空"); var htmlString= Engine.Razor.RunCompile(razorTemplateStr, razorTemplateStr.GetHashCode().ToString(), null, model); return htmlString; }

 

第二種使用ViewEngine。這個主要是自動查找Asp.net MVC裏面的View下面的Razor,目前我們項目就是使用這個。

 

var viewName = context.RouteData.Values["action"].ToString();
            var result = ViewEngines.Engines.FindView(context, viewName, null); IExportPdfByHtmlTemplate exportPdfByHtmlTemplate = new PdfByHtmlTemplateExporter (); #endif if (result.View == null) throw new ArgumentException($"名稱為:{viewName}的視圖不存在,請檢查!"); context.HttpContext.Response.ContentType = "application/pdf"; //context.HttpContext.Response.Headers.Add("Content-Disposition", "attachment; filename=test.pdf"); var html = ""; using (var stringWriter = new StringWriter()) { #if !NET45 var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary()) { Model = Value }; var viewContext = new ViewContext(context, result.View, viewDictionary, new TempDataDictionary(context.HttpContext, tempDataProvider), stringWriter, new HtmlHelperOptions()); await result.View.RenderAsync(viewContext); #else var viewDictionary = new ViewDataDictionary(new ModelStateDictionary()) { Model = Value }; var viewContext = new ViewContext(context, result.View, viewDictionary, context.Controller.TempData, stringWriter); result.View.Render(viewContext, stringWriter); result.ViewEngine.ReleaseView(context, result.View); #endif html = stringWriter.ToString(); }

 

推送PDF流給客戶端,預覽PDF主要代碼

 

          context.HttpContext.Response.ContentType = "application/pdf";
    context.HttpContext.Response.AddHeader("Content-Length", buff.Length.ToString());
            context.HttpContext.Response.AddHeader("Content-Disposition", "filename=电子簽章PDF-"+DateTime.Now.ToString()+".pdf");
            context.HttpContext.Response.BinaryWrite(buff);
            context.HttpContext.Response.Flush();
            context.HttpContext.Response.Close();
            context.HttpContext.Response.End();

  

 這裏要注意三個地方,不然一定會踩坑。

Content-Length要設置,不然谷歌瀏覽器可能無法下載預覽的PDF。
Content-Disposition不能要attachment,否則可能直接下載不是預覽。
ContentType 要設置"application/pdf"


Razor轉靜態Html

還有一部分人問我怎麼利用本插件Razor模版動態生成靜態Html,這樣容易被百度爬蟲錄取。
其實這部分核心代碼就是幾句代碼,非常簡單。本項目直接用下面接口即可生成html字符轉,自行保存就可以了。

 public interface IHtmlByRazorTemplateExporter
    {
        Task<string> ExportHtmlByRazorTemplateAsync<T>(T data, string htmlTemplate) where T : class;
        string ExportHtmlByRazorTemplate<T>(T data, string htmlTemplate) where T : class;
    }

  

核心:

 

   protected string RunCompileRazorTemplate(object model,string razorTemplateStr)
        {
            if(string.IsNullOrWhiteSpace(razorTemplateStr)) throw new ArgumentException("Razor模版不能為空"); var htmlString= Engine.Razor.RunCompile(razorTemplateStr, razorTemplateStr.GetHashCode().ToString(), null, model); return htmlString; }

 

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

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

  4.使用方式

  •  目前本項目已經打包成nuget,並上傳,使用可以直接項目右鍵->管理NuGet程序包,查找,然後下載安裝。

 

  •  也可以使用命令安裝。install-package JESAI.HtmlTemplate.Pdf.net45

 

  • 或者直接fork本倉庫自己打包,並根據自己情況修改使用。

 

自定打包可以修改項目目標框架。項目右鍵->屬性->應用程序,目標框架,修改

 

 

 

如發現不能修改,可以,項目->右鍵->編輯項目文件

 

 

 

然後編譯,就可以使用了。

 

具體使用

方式一:

 

 

 方式二:

 

 

 

 

Razor視圖模版代碼:

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">

<head>
    <meta charset="utf-8" />
    <title></title>
</head>

<body>
    <table border="1" style="width:800px;height:500px;">
        <tr>
            <td>姓名</td>
            <td>@Model.Name</td>
            <td>性別</td>
            <td>@Model.Sex</td>
        </tr>
        <tr>
            <td>年齡</td>
            <td>@Model.Age</td>
            <td>班級</td>
            <td>@Model.Class</td>
        </tr>
        <tr>
            <td>住址</td>
            <td>@Model.Address</td>
            <td>電話</td>
            <td>@Model.Tel</td>
        </tr>
        <tr>
            <td clospan="2">住址</td>
            <td>@Model.Des</td>
        </tr>
    </table>
</body>
</html>

 

 

 

  5.運行效果

 

 

 

  6.項目代碼

 代碼託管:https://gitee.com/Jesai/JESAI.HtmlTemplate.Pdf

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

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

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

猛虎咬死三人 印度放棄野放_包裝設計

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

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

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

印度一隻咬死三個人的老虎,餘生都將被關起來,當局今(7日)表示,讓這隻老虎四處漫遊「實在太危險」。

馬德雅省首席野生動物管理員曼達爾(S.K. Mandal)告訴法新社:「我們給了牠幾次機會,希望能野放牠,但牠總是闖入人類居住地。」

過去10年,人口13億的印度一再看到人類與動物間發生致命衝突。根據政府統計,2014年到2019年間有近225人遭老虎攻擊喪命。同時有數據顯示,2012年到2018年間,有超過200隻老虎因人類盜獵或架設電網而喪命。

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

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

世界上70%的老虎在印度棲息。政府去年表示,境內老虎數量從2006年1411隻的史上最低紀錄,增加到2018年2967隻。

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

國際新聞
印度
老虎
人與動物衝突事件簿
處變不驚──與野生動物相遇

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

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

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

C#中的TemplateMethod模式_包裝設計

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

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

一個真實的故事

大學的時候就開過一門課程,講設計模式,可是大學生沒什麼編程實踐經驗,在大學裏面聽設計模式的感覺,就像聽天書。聽着都有道理,可是完全領會不到其中的奧妙,大抵原因就在於沒有走過彎路,沒有吃過設計不當的虧。古人云,“操千曲而後曉聲,觀千劍而後識器”,誠不欺我。
 
博主在之前的某個項目中,設計出了一些工具類,像屬性窗口,錯誤提示窗口,還有一個窗口管理類管理它們,當時我實現工具保存時候的代碼是這樣的:

    class WindowManager
    {
        private List<ITool> _Tools = new List<ITool>();        

        public void AddTool(ITool tool)
        {
            _Tools.Add(tool);
        }

        public void SaveAllTools()
        {
            foreach(var tool in _Tools)
            {
                tool.Save();
            }
        }
    }

    interface ITool
    {
        bool BeforeSave();
        void Save();
        void AfterSave();
    }

    class PropertyWindow : ITool
    {
        public bool BeforeSave()
        {
            //do something specific here
            return true;
        }

        public void Save()
        {
            if (BeforeSave())
            {
                //do save
                AfterSave();
            }
        }

        public void AfterSave()
        {

        }
    }

    class ErrorLis : ITool
    {
        public bool BeforeSave()
        {
            //do something specific here
            return true;
        }

        public void Save()
        {
            if (BeforeSave())
            {
                //do save
                AfterSave();
            }
        }

        public void AfterSave()
        {

        }
    }

當時博主對這段代碼還挺滿意,完全沒有看出這兒有什麼問題,覺得這簡直寫的太OO了,有類,有接口,有針對接口編程,至於新加的工具類,也不會影響原來的代碼,簡直太符合開閉原則了。老鐵,沒毛病!
 
好日子就這麼繼續下去,每當需要新添加一個工具,我就新加一個類,在類裏面實現Save的邏輯,直到有一天,添加了一個ResourceControl

    class ResourceControl : ITool
    {
        public bool BeforeSave()
        {
            //do something specific here
            return true;
        }

        public void Save()
        {
            if (!BeforeSave())
            {
                //do save
                AfterSave();
            }
        }

        public void AfterSave()
        {

        }
    }

 
在它的save裏面,我把if(BeforeSave())寫成了if(!BeforeSave())。。。
於是,我又額外花了一些時間來找到這個問題,修改它並在下次添加新類的時候戰戰兢兢提醒自己不要犯這種低級的錯誤。那麼,我們有沒有好的辦法來解決這個問題呢?

問題分析

其實就算每次添加新類的時候我們都能仔細的小心避免維護相同的邏輯,這段代碼的設計也還是有可以改進的地方,比如,BeforeSave和AfterSave在這裏作為接口ITool的一部分而公開,意味着客戶代碼可以自由的調用BeforeSave和AfterSave,然而這很可能並不是代碼作者的本意,畢竟,不調用Save而單獨調用BeforeSave和AfterSave有什麼意義呢?讓客戶能夠看到更多不必要的方法,增加了客戶錯誤使用接口的可能性,不是么?
 
綜上所述,我們需要解決的問題如下:

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

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

  • 抽象出Save, BeforeSave和AfterSave的邏輯關係,在一個地方固定下來,確保新增加的類所實現的這三個方法,都能自動具有這種邏輯關係。
  • 對客戶代碼隱藏不必要的接口。
     
    這種場景下面,我們需要用到設計模式中的TemplateMethod(模版方法)模式。
     

TemplateMethod模式

在WIKI上面,TemplateMethod模式的定義如下,
In software engineering, the template method pattern is a behavioral design pattern that defines the program skeleton of an algorithm in an operation, deferring some steps to subclasses. It lets one redefine certain steps of an algorithm without changing the algorithm’s structure.

大概意思就是,模版方法模式是一種行為類設計模式,允許軟件在更高的層次定義程序骨架,但是可以在子類推遲實現某些步驟。
 
類圖如下:

這完全符合我們的需求,讓我們試着修改我們的代碼。
 

使用TemplateMethod重新實現的代碼

    class WindowManager
    {
        private List<AbstractTool> _Tools = new List<AbstractTool>();        

        public void AddTool(AbstractTool tool)
        {
            _Tools.Add(tool);
        }

        public void SaveAllTools()
        {
            foreach(var tool in _Tools)
            {
                tool.Save();
            }
        }
    }

    abstract class AbstractTool
    {
        protected abstract bool BeforeSave();
        protected abstract void DoSave();
        protected abstract void AfterSave();
        public void Save()
        {
            if(!BeforeSave())
            {
                DoSave();
                AfterSave();
            }

        }        
    }

    class PropertyWindow : AbstractTool
    {
        protected override bool BeforeSave()
        {
            //do something specific here
            return true;
        }

        protected override void DoSave()
        {
            
        }

        protected override void AfterSave()
        {

        }
    }

    class ErrorLis : AbstractTool
    {
        protected override bool BeforeSave()
        {
            //do something specific here
            return true;
        }

        protected override void DoSave()
        {

        }

        protected override void AfterSave()
        {

        }
    }

從上面我們可以看到,我們用一個抽象類AbstractTool代替之前的ITool接口,抽象類和接口的一個區別就是,抽象類可以在其中嵌入某些邏輯,所以我們在Save這個公共的非虛方法中,完全實現了我們的BeforeSave和AfterSave邏輯,僅僅留下了BeforeSave,AfterSave和DoSave給子類覆蓋。這樣我們得到的好處是:

  • 抽象類只公開了一個Save方法,所以客戶代碼不用擔心會調用其他錯誤的方法。
  • 抽象類完全固定了Save邏輯,先調用BeforeSave檢查,之後執行DoSave進行具體的Save事項,最後進行AfterSave行為。子類只需要重新依據子類的需求覆蓋這三個虛方法即可。新添加的工具類,只要覆蓋這三個虛方法,至於虛方法之間的邏輯,抽象類已經固定,不用擔心。

結論

“紙上得來終覺淺,絕知此事要躬行”,祖宗的話,不會錯的,如果沒有一定的編程實踐和總結,是沒有辦法領悟設計模式的,博主也是通過之前那個例子才領悟到TemplateMethod模式的妙用。希望大家多多編程,早日領悟。

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

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

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

Google 在台灣成立硬體研發基地,規模僅次於美國總部_包裝設計

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

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

Google 今天(1/27)宣布最新辦公室正式啟用,選址於台北遠東通訊園區(TPark)內,並且預計會在 2023 年於園區內再添另一座辦公室。此次 Google 的新辦公室也是除美國總部之外,全球首座且規模最大的硬體研發基地,更會是整合 Google 自家強大 AI、軟硬體技術的全球創新樞紐核心。

Google 在台灣成立硬體研發基地,規模僅次於美國總部

台灣在 Google 全球佈局的願景中,不管在產品研發、網路基礎建設還是市場營運,一直在其中扮演著重要角色。在過去 5 年以來,Google 在台灣的正職員工人數已成長 10 倍,辦公室據點橫跨 6 個縣市。為了因應成長需求,落實多元包容理念,Google 台灣將在今年擴大人才招募與實習計劃,並推出針對女性、弱勢族群等相關的職涯發展活動,預計將培訓與徵才機會拓展至更多校園和職能領域。

Google 硬體副總裁彭昱鈞表示:「很開心台灣已躍升為 Google 的主要策略據點,許多像是 Pixel 手機、Nest 智慧裝置、Chromebook 筆記型電腦、穿戴式裝置、Chromecast 串流播放器等全球性產品的軟硬體研發,均由 Google 台灣團隊的高度參與、甚至主導進行。我們期待能在台灣持續深耕發展,並且歡迎更多來自本地和海外的人才加入 Google 台灣。 」

Google 今年持續在台灣擴大招募規模。為了吸引各種專業領域與多元背景的人才,Google 將在台灣展開多項行動,與校園與產業人士進行更多交流,提供職涯發展的機會,其中包括:

  • 新增多種實習職缺:
    除原先軟硬體工程、資料中心、銷售業務、行銷等領域的實習計劃,今年將首度新增製造工程、Google Cloud 雲端服務、技術專案管理等實習機會。
  • 推廣多元與包容的工作環境:
    Google 在 2019 年推出了針對弱勢殘障族群的獎助學金 「Google Taiwan Student Associate 專案」,目前已獲良好迴響。今年 Google 將擴大該專案範圍,並提高獎學金申請名額,幫助弱勢學生提升職場技能,累積更多實際工作經驗。此外,Google 也延續過去針對鼓勵女性學習資訊科學、進入科技產業的努力,在今年持續透過相關講座與交流活動推廣倡議。
  • 擴展線上校園徵才:
    Google 預計在 2021 年底前至 50 所台灣大專院校進行線上校園徵才活動,尋找擁有潛力的學生。同時 Google 也將深化與大學教師的連結,進行更多科技創新思維的交流,帶動更多產學雙向刺激。
  • 提供免費線上課程:
    Google 將在台灣提供更多與軟硬體及雲端技術相關的免費線上課程,協助潛在人才獲取實用技能,做好未來投入相關領域工作的準備。

Google 台灣於 2006 年正式成立,今年是 Google 在台灣營運的 15 周年, HTC 手機研發部門正式加入 Google 台灣團隊也已屆滿 3 週年。近年來 Google 台灣已發展為亞洲最大的研發基地之一,因此在人才招募、辦公空間、研發與基礎建設的需求均大幅提升。全新的辦公園區設有各類型的實驗室與測試設施,讓 Google 台灣團隊更有效率地進行各種產品的技術開發與製造流程,此外新辦公室也設置了幫助外部訪客瞭解 Google AI 與軟硬體體驗的產品情境展示區。

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

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

Google 承諾在台灣長期發展,並已為擴大規模做好充足準備。除了確保 Google 在台灣的營運能嘉惠當地用戶和合作夥伴,Google 更將台灣視為技術研發與基礎建設的全球樞紐,以台灣為核心,在此打造出創新、便利、使全球使用者受惠的產品與服務。

您也許會喜歡:

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

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

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

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

面試官:兄弟,說說Java的static關鍵字吧_包裝設計

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

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

讀者乙在上一篇我去系列文章里留言說,“我盲猜下一篇標題是,‘我去,你竟然不知道 static 關鍵字’”。我只能說乙猜對了一半,像我這麼有才華的博主,怎麼可能被讀者猜中了心思呢,必須搞點不一樣的啊,所以本篇文章的標題你看到了。

七年前,我從美女很多的蘇州回到美女也不少的洛陽,抱着一幅“從二線城市退居三線城市”的心態,投了不少簡歷,也“約談”了不少面試官,但僅有兩三個令我感到滿意。其中有一位叫老馬,至今還活在我的微信通訊錄里。他當時扔了一個面試題把我砸懵了:“兄弟,說說 Java 的 static 關鍵字吧。

我那時候二十三歲,正值青春年華,自認為所有的面試題都能對答如流,結果沒想到啊,被“刁難”了——原來洛陽這塊互聯網的荒漠也有技術專家啊。現在回想起來,臉上不自覺地泛起了羞愧的紅暈:主要是自己當時太菜了。

不管怎麼說,經過多年的努力,我現在的技術功底已經非常紮實了,有能力寫篇文章剖析一下 Java 的 static 關鍵字了——只要能給初學者一些參考,我就覺得非常滿足。

先來個提綱挈領(唉呀媽呀,成語區博主上線了)吧:

static 關鍵字可用於變量、方法、代碼塊和內部類,表示某個特定的成員只屬於某個類本身,而不是該類的某個對象。

01、靜態變量

靜態變量也叫類變量,它屬於一個類,而不是這個類的對象。

public class Writer {
    private String name;
    private int age;
    public static int countOfWriters;

    public Writer(String name, int age) {
        this.name = name;
        this.age = age;
        countOfWriters++;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

其中,countOfWriters 被稱為靜態變量,它有別於 name 和 age 這兩個成員變量,因為它前面多了一個修飾符 static

這意味着無論這個類被初始化多少次,靜態變量的值都會在所有類的對象中共享。

Writer w1 = new Writer("沉默王二",18);
Writer w2 = new Writer("沉默王三",16);

System.out.println(Writer.countOfWriters);

按照上面的邏輯,你應該能推理得出,countOfWriters 的值此時應該為 2 而不是 1。從內存的角度來看,靜態變量將會存儲在 Java 虛擬機中一個名叫“Metaspace”(元空間,Java 8 之後)的特定池中。

靜態變量和成員變量有着很大的不同,成員變量的值屬於某個對象,不同的對象之間,值是不共享的;但靜態變量不是的,它可以用來統計對象的數量,因為它是共享的。就像上面例子中的 countOfWriters,創建一個對象的時候,它的值為 1,創建兩個對象的時候,它的值就為 2。

簡單小結一下:

1)由於靜態變量屬於一個類,所以不要通過對象引用來訪問,而應該直接通過類名來訪問;

2)不需要初始化類就可以訪問靜態變量。

public class WriterDemo {
    public static void main(String[] args) {
        System.out.println(Writer.countOfWriters); // 輸出 0
    }
}

02、靜態方法

靜態方法也叫類方法,它和靜態變量類似,屬於一個類,而不是這個類的對象。

public static void setCountOfWriters(int countOfWriters) {
    Writer.countOfWriters = countOfWriters;
}

setCountOfWriters() 就是一個靜態方法,它由 static 關鍵字修飾。

如果你用過 java.lang.Math 類或者 Apache 的一些工具類(比如說 StringUtils)的話,對靜態方法一定不會感動陌生。

Math 類的幾乎所有方法都是靜態的,可以直接通過類名來調用,不需要創建類的對象。

簡單小結一下:

1)Java 中的靜態方法在編譯時解析,因為靜態方法不能被重寫(方法重寫發生在運行時階段,為了多態)。

2)抽象方法不能是靜態的。

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

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

3)靜態方法不能使用 this 和 super 關鍵字。

4)成員方法可以直接訪問其他成員方法和成員變量。

5)成員方法也可以直接方法靜態方法和靜態變量。

6)靜態方法可以訪問所有其他靜態方法和靜態變量。

7)靜態方法無法直接訪問成員方法和成員變量。

03、靜態代碼塊

靜態代碼塊可以用來初始化靜態變量,儘管靜態方法也可以在聲明的時候直接初始化,但有些時候,我們需要多行代碼來完成初始化。

public class StaticBlockDemo {
    public static List<String> writes = new ArrayList<>();

    static {
        writes.add("沉默王二");
        writes.add("沉默王三");
        writes.add("沉默王四");

        System.out.println("第一塊");
    }

    static {
        writes.add("沉默王五");
        writes.add("沉默王六");

        System.out.println("第二塊");
    }
}

writes 是一個靜態的 ArrayList,所以不太可能在聲明的時候完成初始化,因此需要在靜態代碼塊中完成初始化。

簡單小結一下:

1)一個類可以有多個靜態代碼塊。

2)靜態代碼塊的解析和執行順序和它在類中的位置保持一致。為了驗證這個結論,可以在 StaticBlockDemo 類中加入空的 main 方法,執行完的結果如下所示:

第一塊
第二塊

04、靜態內部類

Java 允許我們在一個類中聲明一個內部類,它提供了一種令人信服的方式,允許我們只在一個地方使用一些變量,使代碼更具有條理性和可讀性。

常見的內部類有四種,成員內部類、局部內部類、匿名內部類和靜態內部類,限於篇幅原因,前三種不在我們本次文章的討論範圍,以後有機會再細說。

public class Singleton {
    private Singleton() {}

    private static class SingletonHolder {
        public static final Singleton instance = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }
}

以上這段代碼是不是特別熟悉,對,這就是創建單例的一種方式,第一次加載 Singleton 類時並不會初始化 instance,只有第一次調用 getInstance() 方法時 Java 虛擬機才開始加載 SingletonHolder 並初始化 instance,這樣不僅能確保線程安全也能保證 Singleton 類的唯一性。不過,創建單例更優雅的一種方式是使用枚舉。

簡單小結一下:

1)靜態內部類不能訪問外部類的所有成員變量。

2)靜態內部類可以訪問外部類的所有靜態變量,包括私有靜態變量。

3)外部類不能聲明為 static。

學到了吧?學到就是賺到。

我是沉默王二,一枚有趣的程序員。如果覺得文章對你有點幫助,請微信搜索「 沉默王二 」第一時間閱讀,回復【666】更有我為你精心準備的 500G 高清教學視頻(已分門別類)。

本文 GitHub 已經收錄,有大廠面試完整考點,歡迎 Star。

原創不易,莫要白票,請你為本文點個贊吧,這將是我寫作更多優質文章的最強動力。

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

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

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

新版任天堂Swith命名曝光? 謠傳「Super Switch」搭配4K解析度OLED螢幕_包裝設計

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

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

那些衝著《魔物獵人:崛起》跑去訂購同捆機的獵友們,真的手腳要緩緩。其實近期一直不斷謠傳任天堂為了對抗PS5與Xbox Series X,計畫要推出Switch的高階版本「Switch Pro」。而近日友國外網友爆料,這款「Switch Pro」很有可能會被命名為「Super Switch」,同時搭載4K解析度的OLED螢幕,這名字真的很有任天堂的風格。

↑原本許多玩家都希望,在《魔物獵人:崛起》推出的時候,傳聞中的「Super Switch」也可以登場。

根據外媒報導指出,巴西記者Douglas Máximo過往就多次針對任天堂的事情進行爆料,而且準確度很高,讓不少人都在追蹤他的推特,希望能獲得最新的消息。而近日他在分享《魔物獵人:崛起》同捆機的消息時,表示「這樣看起來,傳聞中的Switch Pro應該不會與MH一起推出吧?」之後他又回應網友表示「基本上,如果未來會推出硬體更加強悍的新機的話,一開始就不會推出與遊戲同捆的主機,必須要等待任天堂的下個財政年度,才會知道他們要如何計劃。」而令人興奮的是,他在這邊留下了一個「Super Switch」的字樣,似乎是在暗示傳聞中的Switch Pro會被命名為「Super Switch」。

 

當然只有名字是不夠的,其實早在6日的時候,就有國外網友在resetera論壇上瘋狂爆料,表示任天堂正在開發提高遊戲解析度的新版Switch主機,這個計畫已經進行了快兩年,根據他的印象這版Switch的解析度會拉高到4K,代號為Aula。而且在新版的Switch主機中,不管是在散熱與電池壽命上,都會有顯著的提升。而螢幕本身是採取OLED螢幕。

 

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

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

而其實早在去年夏天的時候,任天堂的工作人員就曾經對一些遊戲開發者表示,請他們著手準備好4K解析度的遊戲與遊戲開發技術,甚至直接建議將原有的遊戲提供4K解析度版本的DLC方便玩家更新。

 

而由於《魔物獵人》系列一直都是非常需要硬體的怪獸,所以先前曾一度傳聞「Super Switch」會與《魔物獵人:崛起》同步推出,不過看這樣子,應該就只是玩家的希望而已。(玩過《魔物獵人:世界》後,誰受的暸回歸馬賽克獵人啦!)

您也許會喜歡:

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

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

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

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

OAuth2.0系列之基本概念和運作流程(一)_台中搬家

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

@

目錄

  • 一、OAuth2.0是什麼?
    • 1.1 OAuth2.0簡介
    • 1.2 OAuth2.0官方文檔
  • 二、OAuth2.0原理
    • 2.1 OAuth2.0流程圖
  • 三、 OAuth2.0的角色
  • 四、OAuth2.0授權模式
    • 4.1 授權碼模式(authorization code)
    • 4.2 簡化模式(implicit grant type)
    • 4.3 密碼模式(resource owner password credentials)
    • 4.4 客戶端模式(client credentials)
  • 五、優質參考資料

一、OAuth2.0是什麼?

1.1 OAuth2.0簡介

OAuth 2.0是目前最流行的授權機制,用來授權第三方應用

OAuth是一種開放協議, 允許用戶讓第三方應用以安全且標準的方式獲取該用戶在某一網站,移動或者桌面應用上存儲的秘密的資源(如用戶個人信息,照片,視頻,聯繫人列表),而無需將用戶名和密碼提供給第三方應用。

OAuth 1.0協議(RFC5849)作為一個指導性文檔發布,是一個小社區的工作成果。
本標準化規範在OAuth 1.0的部署經驗之上構建,也包括其他使用案例以及從更廣泛的IETF社區收集到的可擴展性需求。

OAuth 2.0協議不向後兼容OAuth 1.0。這兩個版本可以在網絡上共存,實現者可以選擇同時支持他們。

1.2 OAuth2.0官方文檔

官網:https://oauth.net/2/ ,官網只有英文版文檔,您也可以參考翻譯過來的文檔,鏈接:OAuth2 RFC6749中文翻譯

OAuth2.0在安全性方面做了比較大的提高,簡單來說OAuth2.0就是一種授權協議,可以用來授權,隨意點個網站,如圖這種網站,用戶不想註冊,就可以用微信、支付寶登錄,就是場景是很常見的,也是OAuth2.0的應用

二、OAuth2.0原理

OAuth2.0是一種授權機制,正常情況,不使用OAuth2.0等授權機制的系統,客戶端是可以直接訪問資源服務器的資源的,為了用戶安全訪問數據,在訪問中間添加了Access Token機制。客戶端需要攜帶Access Token去訪問受到保護的資源。所以OAuth2.0確保了資源不被惡意客戶端訪問,從而提高了系統的安全性。

2.1 OAuth2.0流程圖

引用官方圖片介紹OAuth2.0總體流程:

  • (A)客戶端向從資源所有者請求授權。
  • (B)客戶端收到授權許可,資源所有者給客戶端頒發授權許可(比如授權碼code)
  • (C)客戶端與授權服務器進行身份認證並出示授權許可(比如授權碼code)請求訪問令牌。
  • (D)授權服務器驗證客戶端身份並驗證授權許可,若有效則頒發訪問令牌(accept token)。
  • (E)客戶端從資源服務器請求受保護資源並出示訪問令牌(accept token)進行身份驗證。
  • (F)資源服務器驗證訪問令牌(accept token),若有效則滿足該請求。

三、 OAuth2.0的角色

OAuth2.0定義如下角色:

引用OAuth2 RFC6749中文翻譯:

  • 資源所有者(Resource Owner): 能夠許可受保護資源訪問權限的實體。當資源所有者是個人時,它作為最終用戶被提及。
  • 用戶代理(User Agent): 指的的資源擁有者授權的一些渠道。一般指的是瀏覽器、APP
  • 客戶端(Client) 使用資源所有者的授權代表資源所有者發起對受保護資源的請求的應用程序。術語“客戶端”並非特指任何特定的的實現特點(例如:應用程序是否在服務器、台式機或其他設備上執行)。
  • 授權服務器(Authorization Server): 在成功驗證資源所有者且獲得授權后頒發訪問令牌給客戶端的服務器。
    授權服務器和資源服務器之間的交互超出了本規範的範圍。授權服務器可以和資源服務器是同一台服務器,也可以是分離的個體。一個授權服務器可以頒發被多個資源服務器接受的訪問令牌。
  • 資源服務器(Resource Server): 託管受保護資源的服務器,能夠接收和響應使用訪問令牌對受保護資源的請求。

四、OAuth2.0授權模式

OAuth2.0有4種授權模式:

  • 授權碼模式(authorization code)
  • 簡化模式(implicit)
  • 密碼模式(resource owner password credentials)
  • 客戶端模式(client credentials)

其中最常用的是授權碼模式,4種授權模式的詳細介紹可以參考阮一峰老師的:OAuth 2.0 的四種方式

4.1 授權碼模式(authorization code)

授權碼(authorization code)方式,指的是第三方應用先申請一個授權碼,然後再用該碼獲取令牌。

官網圖片:

從調接口方面,簡單來說:

  • 第一步:獲取code:
    eg:oauthServer+”/oauth/authorize?client_id=”+clientId+”&response_type=code&redirect_uri=”+redirectUrl+”&scope=all”
    如果沒有登錄,則會跳轉到統一身份認證登錄頁面。如果用戶登錄了,調用接口后,會重定向到redirect_uri,授權碼會作為它的參數

  • 第二步:獲取access_token
    eg:oauthServer+”/oauth/token?code=”+code+”&grant_type=authorization_code&client_secret=”+clientSecret+”&redirect_uri=”+redirectUri+”&client_id=”+clientId

    台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

    台中搬家公司推薦超過30年經驗,首選台中大展搬家

{
    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1ODk1MzQ5NzMsInVzZXJfbmFtZSI6Im5pY2t5IiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9hZG1pbiJdLCJqdGkiOiJmMjM0M2Q0NC1hODViLTQyOGYtOWE1ZS1iNTE4NTAwNTM5ODgiLCJjbGllbnRfaWQiOiJvYSIsInNjb3BlIjpbImFsbCJdfQ.LWkN2gC2dBrGTn5uSPzfdW6yRj7jhlX87EE8scY02hI",
    "token_type": "bearer",
    "expires_in": 59,
    "scope": "all",
    "user_name": "nicky",
    "jti": "f2343d44-a85b-428f-9a5e-b51850053988"
}
  • 第三步:訪問系統資源,此時統一認證服務會根據該認證客戶端權限信息判斷,決定是否返回信息。

訪問:http://localhost:8084/api/userinfo?access_token=${accept_token}

4.2 簡化模式(implicit grant type)

簡化模式(implicit grant type)不通過第三方應用程序的服務器,直接在瀏覽器中向認證服務器申請令牌,跳過了”授權碼”這個步驟,因此稱簡化模式

從調接口方面,簡單來說:

  • 第一步:訪問授權,要傳client_id:客戶端id,redirect_uri:重定向uri,response_type為token,scope是授權範圍,state是其它自定義參數

http://localhost:8888/oauth/authorize?client_id=cms&redirect_uri=http://localhost:8084/callback&response_type=token&scope=read&state=123

  • 第二步:授權通過,會重定向到redirect_uri,access_token碼會作為它的參數

http://localhost:8084/callback#access_token=${accept_token}&token_type=bearer&state=123&expires_in=120

  • 第三步:拿到acceptToken之後,就可以直接訪問資源

http://localhost:8084/api/userinfo?access_token=${accept_token}

4.3 密碼模式(resource owner password credentials)

密碼模式中,用戶向客戶端提供自己的用戶名和密碼,這通常用在用戶對客戶端高度信任的情況

從調接口方面,簡單來說:

  • 第一步:直接傳username,password獲取token

http://localhost:8888/oauth/token?client_id=cms&client_secret=secret&username=admin&password=123456&grant_type=password&scope=all

  • 第二步:拿到acceptToken之後,就可以直接訪問資源

http://localhost:8084/api/userinfo?access_token=${accept_token}

4.4 客戶端模式(client credentials)

客戶端模式(client credentials)適用於沒有前端的命令行應用,即在命令行下請求令牌

從調接口方面,簡單來說:

  • 第一步: 獲取token
    http://localhost:8888/oauth/token?client_id=cms&client_secret=123&grant_type=client_credentials&scope=all

  • 第二步:拿到acceptToken之後,就可以直接訪問資源

http://localhost:8084/api/userinfo?access_token=${accept_token}

學習必要的理論知識后,還是實踐一下才能明白整個流程,詳情參考我OAuth2.0系列博客專欄:OAuth2.0系列博客,SpringBoot的參考我系列博客專欄:SpringBoot系列博客

五、優質參考資料

  • OAuth 2.0 的四種方式
  • OAuth2.0系列博客專欄
  • OAuth2.0 JWT 認證授權
  • RFC6749官方參考文檔

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

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

POCO X3 Pro 通過 FCC 認證,近期有望正式亮相_包裝設計

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

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

上個月 POCO 才剛以獨立品牌重返台灣市場推出性價比超高的 POCO M3 ,近期也傳聞 POCO 將再有新機發表。日前有款 POCO 的新機通過 FCC 等多國機構認證通過,而它就是 POCO X 系列中的 POCO X3 Pro ,預期將帶來比起 POCO X3/X3 NFC 更高階的旗艦規格,未來也不排除再正式發表後有機會引進台灣販售。

▲示意圖,圖為 POCO X3 NFC(圖片來源:POCO)

POCO X3 Pro 通過 FCC 認證,近期有望正式亮相

近期有款小米 POCO 品牌的新機陸續通過包括 FCC 、IMDA 、 EEC 以及 TUV 等認證,其型號為 M2102J20SG ,經比對是目前尚未發表的 POCO X3 Pro 。
雖然目前未有關於 POCO X3 Pro 的詳細規格資訊,不過回顧之前海外發表的 POCO X3 標準版的規格, POCO X3 標準版搭載高通 Snapdragon 732G 處理器、8GB RAM、 128GB ROM , POCO X3 配備 6.67 吋 FHD+ 解析度挖孔全螢幕,螢幕支持最高 120Hz 螢幕更新率和 240Hz 觸控採樣率,內建 6000mAh 大容量電池並支持 33W 快速充電,相機則搭載 6400 萬像素四鏡頭主相機,搭配側邊結合電源鍵的指紋辨識鍵,而 POCO X3 Pro 預期將帶來比上述更高一階的規格配置。

▲圖片來源:FCC

參考目前在印度 POCO 的產品線規劃, POCO X 系列定調為旗艦體驗的中高階機型,目前已在海外發表的POXO X3/X3 NFC 搭載高通 Snapdragon 732G 處理器,而近期通過認證的 POCO X3 Pro 預計將搭載旗艦級處理器。
▲圖片來源:POCO

雖然目前未確認 POCO X3 Pro 的詳細規格,不過有消息指出 POCO X3 Pro 其實就是印度市場 POCO F2 的國際版本,不過目前就連同 POCO F2 都尚未正式推出,因此無論是 POCO X3 Pro 或 POCO F2 可能都還得等上一段時間才會有進一步消息。

圖片/消息來源:FCC

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

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

延伸閱讀:
小米11 國際版將於2/8 晚間發表,有望 3 月在台亮相

OPPO Find X3 Pro 實機上手玩照片曝光:火山口設計主相機,並加入顯微鏡拍攝

您也許會喜歡:

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

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

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

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

02 . Tomcat集群會話共享

redis簡介

redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set –有序集合)和hash(哈希類型)。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現master-slave(主從)同步。

Redis詳細請看我專門寫的redis

https://www.cnblogs.com/you-men/tag/Redis/

如何保持session會話

目前,為了使web能適應大規模的訪問,需要實現應用的集群部署。集群最有效的方案就是負載均衡,而實現負載均衡用戶每一個請求都有可能被分配到不固定的服務器上,這樣我們首先要解決session的統一來保證無論用戶的請求被轉發到哪個服務器上都能保證用戶的正常使用,即需要實現session的共享機制。

在集群系統下實現session統一的有如下幾種方案:

1、請求精確定位:sessionsticky,例如基於訪問ip的hash策略,即當前用戶的請求都集中定位到一台服務器中,這樣單台服務器保存了用戶的session登錄信息,如果宕機,則等同於單點部署,會丟失,會話不複製。

2、session複製共享:sessionreplication,如tomcat自帶session共享,主要是指集群環境下,多台應用服務器之間同步session,使session保持一致,對外透明。 如果其中一台服務器發生故障,根據負載均衡的原理,調度器會遍歷尋找可用節點,分發請求,由於session已同步,故能保證用戶的session信息不會丟失,會話複製,。

此方案的不足之處:

必須在同一種中間件之間完成(如:tomcat-tomcat之間).

session複製帶來的性能損失會快速增加.特別是當session中保存了較大的對象,而且對象變化較快時, 性能下降更加顯著,會消耗系統性能。這種特性使得web應用的水平擴展受到了限制。

Session內容通過廣播同步給成員,會造成網絡流量瓶頸,即便是內網瓶頸。在大併發下錶現並不好

3、基於cache DB緩存的session共享

基於memcache/redis緩存的 session 共享

即使用cacheDB存取session信息,應用服務器接受新請求將session信息保存在cache DB中,當應用服務器發生故障時,調度器會遍歷尋找可用節點,分發請求,當應用服務器發現session不在本機內存時,則去cache DB中查找,如果找到則複製到本機,這樣實現session共享和高可用。

nginx+tomcat+redis實現負載均衡、session共享

環境
主機 操作系統 IP地址 硬件/網絡
Nginx CentOS7.3 39.108.140.0 1C2G / 公有雲
Tomcat-1 CentOS7.3 121.36.43.2 1C2G / 公有雲
Tomcat-2 CentOS7.3 49.233.69.195 1C2G / 公有雲
Redis CentOS7.3 116.196.83.113 1C2G / 公有雲
MySQL CentOS7.3 116.196.83.113 1C2G / 公有雲
實驗拓撲

在這個圖中,nginx做為反向代理,實現靜動分離,將客戶動態請求根據權重隨機分配給兩台tomcat服務器,redis做為兩台tomcat的共享session數據服務器,mysql做為兩台tomcat的後端數據庫。

nginx安裝配置

使用Nginx作為Tomcat的負載平衡器,Tomcat的會話Session數據存儲在Redis,能夠實現零宕機的7×24效果。因為將會話存儲在Redis中,因此Nginx就不必配置成stick粘貼某個Tomcat方式,這樣才能真正實現後台多個Tomcat負載平衡。

部署nginx

#!/usr/bin/env bash
# Author: ZhouJian
# Mail: 18621048481@163.com
# Time: 2019-9-3
# Describe: CentOS 7 Install Nginx Source Code Script

version="nginx-1.14.2.tar.gz"
user="nginx"
nginx=${version%.tar*}
path=/usr/local/src/$nginx
echo $path
if ! ping -c2 www.baidu.com &>/dev/null
then
	echo "網絡不通,無法安裝"
	exit
fi

yum install -y gcc gcc-c++ openssl-devel pcre-devel make zlib-devel wget psmisc
if [ ! -e $version ];then
	wget http://nginx.org/download/$version
fi
if ! id $user &>/dev/null
then
	useradd $user -M -s /sbin/nologin
fi

if [ ! -d /var/tmp/nginx ];then
	mkdir -p /var/tmp/nginx/{client,proxy,fastcgi,uwsgi,scgi}
fi
tar xf $version -C /usr/local/src
cd $path
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_gzip_static_module \
--with-http_auth_request_module \
--with-http_random_index_module \
--with-http_realip_module \
--http-client-body-temp-path=/var/tmp/nginx/client \
--http-proxy-temp-path=/var/tmp/nginx/proxy \
--http-fastcgi-temp-path=/var/tmp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
--http-scgi-temp-path=/var/tmp/nginx/scgi \
--with-pcre \
--with-file-aio \
--with-http_secure_link_module && make && make install
if [ $? -ne 0 ];then
	echo "nginx未安裝成功"
	exit
fi

killall nginx
/usr/local/nginx/sbin/nginx
#echo "/usr/local/nginx/sbin/nginx" >> /etc/rc.local
#chmod +x /etc/rc.local
#systemctl start rc-local
#systemctl enable rc-local
ss -antp |grep nginx

配置nginx反向代理:反向代理+負載均衡+健康探測,nginx.conf文件內容:

vim /usr/local/nginx/conf/nginx.conf
worker_processes  4;
events {
        worker_connections  1024;
}
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';

    #blog lb by oldboy at 201303
        upstream backend_tomcat {
        #ip_hash;
        server 192.168.6.241:8080   weight=1 max_fails=2 fail_timeout=10s;
        server 192.168.6.242:8080   weight=1 max_fails=2 fail_timeout=10s;
        #server 192.168.6.243:8080   weight=1 max_fails=2 fail_timeout=10s;
        }

        server {
            listen       80;
            server_name  www.98yz.cn;
            charset utf-8;
            location / {
                root html;
                index  index.jsp index.html index.htm;
                    }
            location ~* \.(jsp|do)$ {
            proxy_pass  http://backend_tomcat;
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
                }
        }

    }
安裝部署tomcat應用程序服務器

在tomcat-1和tomcat-2節點上安裝JDK

在安裝tomcat之前必須先安裝JDK,JDK的全稱是java development kit,是sun公司免費提供的java語言的軟件開發工具包,其中包含java虛擬機(JVM),編寫好的java源程序經過編譯可形成java字節碼,只要安裝了JDK,就可以利用JVM解釋這些字節碼文件,從而保證了java的跨平台性。

安裝JDK,Tomcat 程序

tar xvf jdk-8u151-linux-x64.tar.gz -C /usr/local/
wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.55/bin/apache-tomcat-8.5.55.tar.gz
tar xf apache-tomcat-8.5.55.tar.gz -C /usr/local/
cd /usr/local/
mv apache-tomcat-8.5.55/ tomcat
mv jdk1.8.0_151/ jdk

按照相同方法在tomcat-2也安裝

vim conf/server.xml

// 設置默認虛擬主機,並增加jvmRoute
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat-1">
  
// 修改默認虛擬主機,並將網站文件路徑指向/web/webapp1,在host段增加context段  
<Host name="localhost"  appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="/web/webapp1" path="" reloadable="true"/>
</Host>
  
  
// 增加文檔目錄與測試文件  
mkdir -p /web/webapp1
cd /web/webapp1
cat index.jsp 
<%@page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
    <head>
        <title>tomcat-1</title>
    </head>
    <body>
        <h1><font color="red">Session serviced by tomcat</font></h1>
        <table aligh="center" border="1">
        <tr>
            <td>Session ID</td>
            <td><%=session.getId() %></td>
                <% session.setAttribute("abc","abc");%>
            </tr>
            <tr>
            <td>Created on</td>
            <td><%= session.getCreationTime() %></td>
            </tr>
        </table>
    tomcat-1
    </body>
<html>  
  
  
// 接下來我們將tomcat和nginx都啟動起來,可以發現用戶訪問index.jsp會一會跳轉tomcat1,一會tomcat2,session還不一致  

Tomcat-2節點與tomcat-1節點配置基本類似,只是jvmRoute不同,另外為了區分由哪個節點提供訪問,測試頁標題也不同(生產環境兩個tomcat服務器提供的網頁內容是相同的)。其他的配置都相同。

用瀏覽器訪問nginx主機,驗證負載均衡

驗證健康檢查的方法可以關掉一台tomcat主機,用客戶端瀏覽器測試訪問。

從上面的結果能看出兩次訪問,nginx把訪問請求分別分發給了後端的tomcat-1和tomcat-2,客戶端的訪問請求實現了負載均衡,但sessionid並一樣。所以,到這裏我們準備工作就全部完成了,下面我們來配置tomcat通過redis實現會話保持。

安裝redis
yum -y install gcc
wget http://download.redis.io/releases/redis-4.0.14.tar.gz
tar xvf redis-4.0.14.tar.gz -C /opt/
cd /opt/redis-4.0.14

編譯安裝

# Redis的編譯,只將命令文件編譯,將會在當前目錄生成bin目錄
make && make install  PREFIX=/usr/local/redis
cd ..
mv redis-4.0.14/* /usr/local/redis/

# 創建環境變量
echo 'PATH=$PATH:/usr/local/redis/src/' >> /etc/profile
source /etc/profile

# 此時在任何目錄位置都可以是用redis-server等相關命令
[root@redis1 ~]# redis-
redis-benchmark  redis-check-rdb  redis-sentinel   redis-trib.rb    
redis-check-aof  redis-cli        redis-server 

配置Redis

# 設置後台啟動
# 由於Redis默認是前台啟動,不建議使用.可以修改為後台
daemonize yes


# 禁止protected-mode yes/no(保護模式,是否只允許本地訪問)
protected-mode


# 設置遠程訪問
# Redis默認只允許本機訪問,把bind修改為bind 0.0.0.0 此設置會變成允許所有遠程訪問,如果指定限制訪問,可設置對應IP。
# bind指定是redis所在服務器網卡的IP,不指定本機網卡IP,可能導致你的Redis實例無法啟動
# 如果想限制IP訪問,內網的話通過網絡接口(網卡限定),讓客戶端訪問固定網卡鏈接redis
# 如果是公網,通過iptables指定某個IP允許訪問
bind 0.0.0.0

# 配置Redis日誌記錄
# 找到logfile,默認為logfile "",改為自定義日誌格式
logfile  /var/log/redis_6379.log

# 把requirepass修改為123456,修改之後重啟下服務
requirepass "123456"
# 不重啟Redis設置密碼
# 在配置文件中配置requirepass的密碼(當Redis重啟時密碼依然生效)
127.0.0.1:6379> config set requirepass test123
# 查詢密碼
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) "test123"

# 密碼驗證
127.0.0.1:6379> auth test123
OK
127.0.0.1:6379> set name flying
OK
127.0.0.1:6379> get name
"flying"

# 遠程主機連接
# redis-cli  -h  redis_ip -p redis_port -a password

啟動測試

# 放到後台輸出,redis自帶日誌了,可以輸出到黑洞
nohup redis-server /usr/local/redis/redis.conf &> /usr/local/redis/redis.log &

# 關閉命令
redis-cli -h 127.0.0.1 -p 6379 -a 123456 shutdown
# 注意:不建議使用 kill -9,這種方式不但不會做持久化操作,還會造成緩衝區等資源不能優雅關閉。極端情況下造成 AOF 和 複製丟失數據 的情況。
# shutdown 還有一個參數,代表是否在關閉 redis 前,生成 持久化文件,命令為 redis-cli shutdown nosave|save。


# 設置開機自啟動
echo "redis-server /usr/local/redis.conf" >> /etc/rc.local

配置tomcat session redis同步

通過TomcatClusterRedisSessionManager,這種方式支持redis3.0的集群方式
下載TomcatRedisSessionManager-2.0.zip包,https://github.com/ran-jit/tomcat-cluster-redis-session-manager,放到$TOMCAT_HOMA/lib下,並解壓

cd /usr/local/tomcat/lib/
wget https://github.com/ran-jit/tomcat-cluster-redis-session-manager/releases/download/2.0.4/tomcat-cluster-redis-session-manager.zip
unzip tomcat-cluster-redis-session-manager.zip 
cp tomcat-cluster-redis-session-manager/lib/* ./
cp tomcat-cluster-redis-session-manager/conf/redis-data-cache.properties ../conf/
cat ../conf/redis-data-cache.properties     
#-- Redis data-cache configuration
//遠端redis數據庫的地址和端口
#- redis hosts ex: 127.0.0.1:6379, 127.0.0.2:6379, 127.0.0.2:6380, ....
redis.hosts=192.168.6.244:6379
//遠端redis數據庫的連接密碼
#- redis password (for stand-alone mode)
redis.password=pwd@123
//是否支持集群,默認的是關閉
#- set true to enable redis cluster mode
redis.cluster.enabled=false
//連接redis的那個庫
#- redis database (default 0)
#redis.database=0
//連接超時時間
#- redis connection timeout (default 2000)
#redis.timeout=2000
//在這個<Context>標籤裏面配置

vim ../conf/context.xml
<Valve className="tomcat.request.session.redis.SessionHandlerValve" />
<Manager className="tomcat.request.session.redis.SessionManager" />

配置會話到期時間在../conf/web.xml

<session-config>
<session-timeout>60</session-timeout>
</session-config>

啟動tomcat服務

[root@linux-node2 lib]# ../bin/startup.sh

Tomcat-2節點與tomcat-1節點配置相同

測試,我們每次強刷他的sessionID都是一致的,所以我們認為他的session會話保持已經完成,你們也可以選擇換個客戶端的IP地址來測試

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

【其他文章推薦】

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

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

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

※超省錢租車方案

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

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

※回頭車貨運收費標準