電動車充電更簡單!特斯拉推出家庭充電安裝服務

為了讓電動車更容易被大眾接受,除了持續普及相關基礎充電設施,特斯拉(Tesla)近日又宣布為用戶推出「家庭充電安裝」服務,來簡化購買電動車後的相關周邊配套問題。

過去特斯拉的用戶總得為車輛在家中的充電問題所困擾,一些用戶甚至在訂購的車款未送達之前,就會先向當地的電工交涉,詢問充電設備的報價、安裝時間,並確定設備符合購買的車型規格。

如今隨著特斯拉推出這項服務,用戶將可在訂購新車的過程中,就協助解決家庭充電設施的安裝問題。儘管目前服務只有先對部分市場開放,但這個家庭充電安裝計畫的出現,無疑是讓即時充電的便利度再次往上提升。

一些潛在買家向科技網站Electrek 透露了訂購時看到的選項內容:基本安裝費用為1,000 美元,特斯拉會協助在停車位附近安裝一個240 伏特的插座,用戶能使用特斯拉的行動轉接器充電,或用戶也可以選擇安裝充電樁設施,但這需要額外收費。

特斯拉向Electrek 證實,目前充電設施只有對北美部分「關鍵」市場提供,也因此不是所有用戶都能在官網看到這個選項,但希望透過家庭充電安裝服務,協助用戶簡化採購流程。

去年收購SolarCity 之後,馬斯克(Elon Musk)曾表示,希望創造一站式服務,讓太陽能系統、Powerwall、電動車和家用充電器都可在同個地方購買,並且由了解一切的團隊安裝。

雖然看來還有很長一段距離要走,但特斯拉似乎正朝著目標一步一步邁進。

(合作媒體:。圖片出處:Tesla)

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

【其他文章推薦】

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

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

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

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

電動車需求日盛!鋰礦產出難估、未來有短缺之虞?

採用鋰電池的電動車需求日增、電池榮景全無降溫跡象,隨著鋰礦供給愈來愈難尋、未來恐有短缺之虞。

OilPrice.com 報導,特斯拉(Tesla)內華達州的Gigafactory超級電池廠,估計一年要生產50萬顆車用電池,另外還有諸多車用鋰電池廠也在加緊趕工,顯示未來鋰礦的需求將只增不減,且大部分將來自中國。全球如今有51%的鋰電池是在中國生產,僅10%產自美國。據統計,大陸業者規劃中的車用電池廠,產能預料會在2021年底前達到120億瓦小時(GWh),是特斯拉內華達州電池廠的三倍之多。

澳洲採礦業者開始日夜趕工,挖掘鋰礦供應所需。澳洲採礦商Argosy Minerals已在2017年8月跟中國電池製造商敲定長期供應協議,其他澳洲業者也都在洽談類似合約。即使智利、阿根廷握有全球67%的鋰礦脈,但澳洲礦商努力挖掘,仍有望使澳洲成為全球重要的鋰礦產國。目前澳洲的鋰礦產能有14,300公噸,全世界產出有36,000公噸,而智利、阿根廷的產出則分別為12,000公噸、5,700公噸。

然而,採集鋰礦在技術上其實有相當難度,成本不但高昂,且由於採礦過程牽涉到蒸餾法,產出也頗難預估。Orocobre Ltd.在阿根廷本北部設立的新礦場,鋰礦產出就比預期少逾20%。

假如鋰礦產能無法順利擴充、或是新開礦場產出不如預期,那麼電動車的榮景可能因而受阻。Electrek,福斯汽車(Volkswagen)研發部主管Ulrich Eichhorn 6月底就曾預估,業界需要多達40座規模跟特斯拉Gigafactory類似的超大電池廠,才能滿足電動車需求,假如新建礦場、工廠無法如期上線,那麼市場恐陷入短缺。

根據Eichhorn的估計,到了2025年,光是福斯集團就需要用到200 GWh的車用電池,至於其他汽車製造商,屆時也會有25%的產能屬於電動車。他是以Gigafactory的年產能可達35 GWh進行推估。

(本文內容由授權使用)

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

【其他文章推薦】

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

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

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

第二屆上海-斯圖加特汽車及動力技術國際研討會2017

第二屆上海斯圖加特汽車及動力技術國際研討會2017

2017年10月26日-27日/ 中國·上海

 

在上海市及政府斯圖加特市政府的指導下,利用同濟大學和斯圖加特大學各自的學科優勢和研發成果,“2017上海-斯圖加特汽車及動力技術國際研討會”將於2017年10月26日-27日在上海召開。

 

大會以“汽車輕量化、智慧網聯、綠色汽車”為主題,將研討汽車整車設計和輕量化、智慧底盤與電驅動、環境感知技術、氫能與燃料電池、車用電源技術等,屆時全球400多位行業專家將集聚一堂,共同探討新能源汽車產業的前沿發展,共同建立聯繫,促進合作!

 

參會者可以以論文投稿的形式參與此次會議,論文審核組委會將負責從所有參會者所投稿件中遴選出品質較高的優秀學術論文,在會議當天進行學術性報告演講,並在同濟大學學報增刊(100%EI期刊檢索)上進行發表。

 

大會亮點:

3大論壇涉及9個主題內容專業豐富的會議

40篇論文,100%EI檢索

45位海內外權威發言嘉賓

400+知名行業人士蒞臨

 

我們期待與貴單位一起出席於2017年10月26日-27日在中國上海舉辦的上海-斯圖加特汽車及動力技術國際研討會,以利決策!

 

更多會議資訊,請登錄會議官方網站:http://www.sssaet.com/index_cn.htm

連絡人:Latika LIU(劉小姐)

電話:021-6093 0815

傳真:021-6047 5887

郵箱:

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

【其他文章推薦】

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

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

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

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

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

第二届中国国际智能网联汽车论坛2017-智能交通与智能汽车的协同发展

造全面感知新

汽车在无人驾驶的安全性超过有人驾驶的安全性之后,智能汽车发展将向智能交通发展。会使整个交通行业建立起全国交通一体化指挥网络,能使整个产业有一个大的发展。智能化交通网络还可以指挥、调度车辆,提高行车效率,减少路口堵车。这一切 都是在你行车之前将自己的行车起点和终点路线输入智能交通网络,车上装有各种高灵敏的传感器和计算机,车与卫星和地面站之间;车与车之间;经过大数据存储和云计算处理,通过数据交换指挥交通。

    在过去十届汽车论坛成功举办的基础上,由上海国际汽车城和希迈商务咨询(上海)有限公司主办,上海国际汽车城开发服务有限公司协办的第二届中国国际智能网联汽车论坛即将于2017年11月16-11月17日在上海隆重举行。本届论坛将会涉及智能交通板块,并从世界发达国家,国内交通部门,整车厂及供应商的不同角度来探讨智能交通与智能汽车的协同发展及其中的关键性技术。

 

    第二届中国国际智能网联汽车论坛将涉及三个论坛及交流晚宴。届时将诚邀全球范围内的整车制造商、零部件供应商、知名网络公司、智能网联核心技术提供商和政府官员近300位行业人士一起,对智能网联汽车发展面临的挑战、机遇与对策各方面进行为期两天更深层次并具有建设和战略性的探讨。

 

 

会议亮点:

Ø  丰富的内容:

3大论坛的深度解析

Ø  参会嘉宾:

300+高度满意的企业决策者,160+业内知名企业,40+国家和地区

Ø  演讲嘉宾:

30+世界新能源汽车行业知名发言嘉宾

Ø  会议形式:

3个论坛,2天会议,1个晚宴

 

会议结构:

我们期待与贵单位一起出席于1116-17日在上海举办的第二届中国国际智能网联汽车论坛2017,以利决策!

 

欲知更多会议详情,请登陆官方网站:,或者联系组委会:

Latika LIU(刘小姐)

电话:021-6093 0815

传真:021-6047 5887

邮箱:

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

【其他文章推薦】

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

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

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

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

中國電動車商機夯!日產攜東風研發低價車款、2019年生產

雷諾與日產聯盟29日發布新聞稿宣布,將和東風汽車集團於中國設立一家新合資公司、攜手研發電動車,期望藉由最大限度活用雷諾、日產以及東風的核心競爭力,滿足中國市場需求。該家合資公司名為「eGT New Energy Automotive Co., Ltd.」,東風、日產、雷諾出資比重分別為50%、25%、25%。

eGT將設於中國湖北省十堰市,所研發的電動車預估將透過同樣位於十堰市的東風汽車的工廠(年產能12萬台)進行生產,開始生產時間預計在2019年。

日經新聞指出,eGT主要將研發需求走揚的低價電動車車款,日產期望藉由加強與東風之間的合作,維持電動車領域的優勢。

據中國汽車工業協會(CAAM)指出,中國已成為全球最大純電動車市場,2016年中國B電動車銷售量暴增121%至25萬6,879台,2017年1到7月期間中國純電動車產量較去年同期大增37.8%至22萬3,000台、銷售量大增33.6%至20萬4,000台。

日產會長Carlos Ghosn在6月27日舉行的股東會上表示,「日產在電動車界居領導位置。日產電動車累計銷售量超過60萬台、為美國特斯拉(Tesla)的2倍」。

日本市調機構富士經濟(Fuji Keizai)6月22日公布銷售動向報告指出,電動車在2025年以後需求將急速增加,預估2030年時電動車年銷售量將增至407萬台、超越油電混合車(2030年銷售量預估為391萬台),且之後雙方的差距將持續擴大。在中國需求增加加持下,2035年電動車全球銷售量將擴大至630萬台、將達2016年的13.4倍(較2016年增加12.4倍)。

(本文內容由授權使用。圖片出處: CC3.0)

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

【其他文章推薦】

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

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

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

Asp.net Core 系列之–5.認證、授權與自定義權限的實現

ChuanGoing 2019-11-24

  asp.net core系列已經來到了第五篇,通過之前的基礎介紹,我們了解了整個流程,實現,並且簡單的介紹了實現,結合上一篇的和本篇將要介紹的權限,大致的可以形成一個簡單的後端系統架構。當然這些都是零散的一些技術概念的介紹,後面如果有時間的話,我想詳細的介紹下如何利用領域驅動來實現一個實際案例。

話不多講,下面來看下本篇的學習曲線:

1.認識Identityserver4

2.Identityserver4實現認證與授權

3.自定義權限的實現

認識Identityserver4

  關於Identityserver4(ids4)的概念介紹,請查看一文。我這裏要說的是,asp.net core 下的ids4集成了認證與授權兩大功能,使得我們非常方便的實現一個開放的認證與授權平台,比如公司內部多個系統的集成登錄(單點登錄)/第三方系統數據共享/統一的認證中心等。整個業務流程大致為:

1.用戶首先的有用戶中心的賬號信息,因此需要註冊一個賬號

2.用戶訪問某個站點應用,需要去到用戶中心認證

3.認證通過,用戶得到其在用戶中心註冊的相應信息及其權限時限、範圍、大小

4.認證不通過,即非法用戶,提示用戶註冊

5.在第3步的前提下,若用戶訪問到另一個站點(採用同一認證平台),這時用戶可以用之前認證通過後拿到的訪問令牌訪問此站點,若此令牌中包含此站點的相應權限即可之前登錄。

Identityserver4實現認證與授權

首先,新建一個asp.net core web 空項目,並且添加如下IdentityServer4 Nuget包

在ConfigureServices添加如下代碼

註冊IdentityServer中間件,如下5個配置分別表示:

1.AddDeveloperSigningCredential:開發模式下的簽名證書,開發環境啟用即可

2.AddInMemoryApiResources:相關資源配置

public static IEnumerable<ApiResource> GetApiResources()
        {
            return new List<ApiResource>
            {
                new ApiResource("WebApi", "ChuanGoingWebApi"),
                new ApiResource("ProductApi", "ChuanGoingWebProduct")
            };
        }

GetApiResources

這裏配置了兩個Api資源

3.AddInMemoryIdentityResources:OpenID Connect相關認證信息配置

 public static IEnumerable<IdentityResource> GetIdentityResources()
        {
            return new List<IdentityResource>
            {
                new IdentityResources.OpenId(),
                new IdentityResources.Profile()
            };
        }

GetIdentityResources

4.AddInMemoryClients:客戶端信息配置

 public static IEnumerable<Client> GetClients(IConfiguration Configuration)
        {
            var OnlineConfig = Configuration.GetSection("OnlineClient");
            var List = new List<Client>
            {
                new Client()
                {
                    ClientId = "ClientCredentials",
                    AllowedGrantTypes = GrantTypes.ClientCredentials,
                    ClientSecrets = { new Secret("ClientSecret".Sha256()) },
                    AllowedScopes =
                    {
                        IdentityServerConstants.StandardScopes.OpenId,
                        IdentityServerConstants.StandardScopes.Profile,
                        "WebApi",
                        "ProductApi"
                    },
                    AccessTokenLifetime = 10 * 60 * 1
                },

                new Client()
                {
                    ClientId = "ResourceOwnerPassword",
                    AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,
                    ClientSecrets = { new Secret("ClientSecret".Sha256()) },
                    AllowedScopes =
                    {
                        IdentityServerConstants.StandardScopes.OpenId,
                        IdentityServerConstants.StandardScopes.Profile,
                        "WebApi",
                        "ProductApi"
                    },
                    AccessTokenLifetime = 10 * 60 * 1
                },
                  /*
                  隱式模式:https://localhost:6005/connect/authorize?client_id=Implicit&redirect_uri=http://localhost:5000/Home&response_type=token&scope=WebApi
                  */
                new Client()
                {
                    ClientId = "Implicit",
                    ClientName = "ImplicitClient",
                    AllowedGrantTypes = GrantTypes.Implicit,
                    ClientSecrets = { new Secret("ImplicitSecret".Sha256()) },
                    RedirectUris ={OnlineConfig.GetValue<string>("RedirectUris") },
                    PostLogoutRedirectUris = {OnlineConfig.GetValue<string>("LogoutRedirectUris") },
                    AllowedScopes =
                    {
                        IdentityServerConstants.StandardScopes.OpenId,
                        IdentityServerConstants.StandardScopes.Profile,
                        "WebApi",
                        "ProductApi"
                    },
                    AccessTokenLifetime = 10 * 60 * 1,
                    //允許將token通過瀏覽器傳遞
                     AllowAccessTokensViaBrowser=true
                },
                /*
                 * 授權碼模式:https://localhost:6005/connect/authorize?client_id=GrantCode&redirect_uri=http://localhost:5000/Home&response_type=code&scope=WebApi
                 */
                new Client()
                {
                   //客戶端Id
                    ClientId="GrantCode",
                    ClientName="GrantCodeClient",
                    //客戶端密碼
                    ClientSecrets={new Secret("CodeSecret".Sha256()) },
                    //客戶端授權類型,Code:授權碼模式
                    AllowedGrantTypes=GrantTypes.Code,
                    //允許登錄后重定向的地址列表,可以有多個
                     RedirectUris ={OnlineConfig.GetValue<string>("RedirectUris") }, 
                    //允許訪問的資源
                    AllowedScopes={
                        "WebApi",
                        "ProductApi"
                    }
                }
            };
            return List;
        }

GetClients

分別對象Auth2.0的四種模式,本篇將用到的是ResourceOwnerPassword模式,其他幾種可在篇尾github鏈接查看源碼的實現

5.AddTestUsers:用戶配置,可結合緩存/持久化

public static List<TestUser> GetUsers()
        {
            return new List<TestUser>
            {
                new TestUser
                {
                    SubjectId = Guid.NewGuid().ToString(),
                    Username = "admin",
                    Password = "123456"

                    //Claims = new List<Claim>
                    //{
                    //    new Claim("name", "admin"),
                    //    new Claim("website", "https://www.cnblogs.com/chuangoing")
                    //}
                },
                new TestUser
                {
                    SubjectId = Guid.NewGuid().ToString(),
                    Username = "chuangoing",
                    Password = "123456"

                    //Claims = new List<Claim>
                    //{
                    //    new Claim("name", "chuangoing"),
                    //    new Claim("website", "https://github.com/chuangoing")
                    //}
                }
            };
        }

GetUsers

 定義兩個測試用戶,注意這裏的SubjectId,用作用戶中心註冊的openid(認證唯一),後面將會用到

然後,Configure中添加app.UseIdentityServer();//啟用ids4

至此,ids4 服務完成

用postman測試下:

 

返回jwt accesstoken:

 

 

將token內容解碼,如下:

 

 可以看到,裡面包含我們配置的ProductApi/WebApi的權限

將token信息加入到http的header中:

 

  注意Bearer後面有個空格,訪問order的獲取訂單信息:

 

 

 自定義權限的實現

  這裏,我們將api中的action分別定義一個權限代碼,用戶擁有了此action訪問權限(擁有此權限代碼)即可訪問,簡單實現如下:

1.定義權限特性標識,api的action指定某個標識

public class PermissionAttribute : Attribute
    {
        /// <summary>
        /// 權限代碼
        /// </summary>
        public string Code { get; }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="code">權限代碼</param>
        public PermissionAttribute(string code)
        {
            Code = code;
        }
    }

PermissionAttribute

 

 此處,get action定義了訪問權限標識為”XYZ”

同樣,我們這裏需要用到一個權限過濾器,利用過濾器的Aop實現權限過濾業務處理:

 public class PermissionFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            var user = context.HttpContext.User;
            if (user.Identity.IsAuthenticated)
            {
                //TODO:用戶自定義權限驗證
                Guid userId = context.HttpContext.GetId();
                bool right;
                #region 自定義權限驗證
                //根據userId判斷用戶內部系統權限信息

                //var userPermissions = repo.GetUserPermissions(userId);
                //var permissions = repo.GetPermissions();
                var metas = context.ActionDescriptor.EndpointMetadata;
                foreach (var meta in metas)
                {
                    if (meta is PermissionAttribute permission)
                    {
                        //if (!permissions.Any(p => permission.Code.Any(c => c == p.Code))
                        //    && !userPermissions.Any(p => permission.Code.Any(c => c == p.Code)))
                        //{
                        //    throw new WebException(HttpStatusCode.Forbidden, MessageCodes.AccessDenied, "你沒有訪問該資源的權限");
                        //}
                        //break;
                    }
                }

                right = false;
                #endregion
                if (!right)
                {
                    context.Result = new ContentResult() { StatusCode = (int)HttpStatusCode.Forbidden, Content = "你沒有訪問該資源的權限" };
                }

            }
        }

PermissionFilter

同時,啟用權限過濾器配置

 

 

部分代碼略過,詳細的請查看篇尾的源碼鏈接

利用第二節的認證授權得到的token,我們用postman測試下:

 

過濾器切面成功工作

 

 

 還記得第一節說的SubjectId么?這裏利用這個openid,去內部系統去匹配相關用戶信息,相關業務就不深入了,有興趣的朋友可以下載示例完善下

 

 至此,整個權限認證、授權、自定義權限介紹完。

WebApi詳細代碼在Github的 的Domain分支可以找到,AuthServer詳細代碼在中。

 

 

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

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

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

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

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

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

three.js使用卷積法實現物體描邊效果

法線延展法

網上使用法線延展法實現物體描邊效果的文章比較多,這裏不再描述。

但是這種方法有個缺點:當兩個面的法線夾角差別較大時,兩個面的描邊無法完美連接。如下圖所示:

 

 

 卷積法

這裏使用另一種方法卷積法實現物體描邊效果,一般機器學習使用該方法比較多。先看效果圖:

    

 

 

使用three.js具體的實現方法如下:

  1. 創建着色器材質,隱藏不需要描邊的物體進行渲染,將需要描邊的位置渲染成白色,其他位置渲染成黑色。
  2. 利用片源着色器計算卷積,白色是物體內部,黑色是物體外部,灰色是邊框。
  3. 設置材質透明、不融合,將邊框疊加到原圖上,可以使用FXAA抗鋸齒。

這三步就可以實現了,很簡單吧。下面我們將詳細介紹實現方法,不想看的可以直接去看完整實現代碼:

完整代碼: 

詳細的實現過程:

1. 使用three.js正常繪製場景,得到下圖,這裏不介紹了。

 

 

2. 創建着色器材質,隱藏所有不需要描邊的物體。將需要描邊的物體繪製成白色,其他地方繪製成黑色。

隱藏不需要描邊的物體后,將整個場景材質替換。

renderScene.overrideMaterial = this.maskMaterial;

着色器材質:

const maskMaterial = new THREE.ShaderMaterial({
    vertexShader: MaskVertex,
    fragmentShader: MaskFragment,
    depthTest: false
});

MaskVertex:

void main() {
    gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}

MaskFragment:

void main() {
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}

效果圖:

 

 

 

3. 創建着色器材質進行卷積計算,每四個像素顏色求平均值得到一個像素。描邊物體內部是白色,外部是黑色,物體邊緣處會得到灰色。灰色就是我們所需的邊框。

const edgeMaterial = new THREE.ShaderMaterial({
    vertexShader: EdgeVertex,
    fragmentShader: EdgeFragment,
    uniforms: {
        maskTexture: {
            value: this.maskBuffer.texture
        },
        texSize: {
            value: new THREE.Vector2(width, height)
        },
        color: {
            value: selectedColor
        },
        thickness: {
            type: 'f',
            value: 4
        },
        transparent: true
    },
    depthTest: false
});

其中texSize是計算卷積的canvas寬度和高度,為了讓邊框更平滑,可以設置為原來canvas的兩倍。color是邊框顏色,thickness是邊框粗細。 注意,要將材質transparent設置為true。 EdgeVertex:

varying vec2 vUv;

void main() {
    vUv = uv;
    gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}

EdgeFragment:

uniform sampler2D maskTexture;
uniform vec2 texSize;
uniform vec3 color;
uniform float thickness;

varying vec2 vUv;

void main() {
    vec2 invSize = thickness / texSize;
    vec4 uvOffset = vec4(1.0, 0.0, 0.0, 1.0) * vec4(invSize, invSize);

    vec4 c1 = texture2D( maskTexture, vUv + uvOffset.xy);
    vec4 c2 = texture2D( maskTexture, vUv - uvOffset.xy);
    vec4 c3 = texture2D( maskTexture, vUv + uvOffset.yw);
    vec4 c4 = texture2D( maskTexture, vUv - uvOffset.yw);
    
    float diff1 = (c1.r - c2.r)*0.5;
    float diff2 = (c3.r - c4.r)*0.5;
    
    float d = length(vec2(diff1, diff2));
    gl_FragColor = d > 0.0 ? vec4(color, 1.0) : vec4(0.0, 0.0, 0.0, 0.0);
}

效果圖:

4. 創建着色器材質,將邊框疊加到原來的圖片上。由於FXAA比較複雜,這裏使用簡單的疊加方法。

着色器材質:

const copyMaterial = new THREE.ShaderMaterial({
    vertexShader: CopyVertexShader,
    fragmentShader: CopyFragmentShader,
    uniforms: {
        tDiffuse: {
            value: edgeBuffer.texture
        },
        resolution: {
            value: new THREE.Vector2(1 / width, 1 / height)
        }
    },
    transparent: true,
    depthTest: false
});

注意,transparent要設置為true,否則會把原來的圖片覆蓋掉。

CopyVertexShader:

varying vec2 vUv;

void main() {
    vUv = uv;
    gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}

CopyFragmentShader:

uniform float opacity;

uniform sampler2D tDiffuse;

varying vec2 vUv;

void main() {
    vec4 texel = texture2D( tDiffuse, vUv );
    gl_FragColor = opacity * texel;
}

得到最終效果圖:

 

參考資料:

1. 描邊實現完整代碼:

2. 基於three.js的開源三維場景編輯器:

3. three.js後期處理描邊:

4. 卷積工作原理:

5. 法線延展法實現物體描邊:

 

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

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

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

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

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

F#周報2019年第47期

新聞

視頻及幻燈片

博客

F# vNext

  • F#語言建議:

GitHub項目

最新的發布

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

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

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

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

Tensorflow基礎

說明:本文實例使用Python版本為3.5.6,Tensorflow版本為2.0

介紹

Tensorflow是Google推出的機器學習開源神器,對Python有着良好的語言支持,支持CPU,GPU和Google TPU等硬件,並且已經擁有了各種各樣的模型和算法。目前,Tensorflow已被廣泛應用於文本處理,語音識別和圖像識別等多項機器學習和深度學習領域。

基礎框架

分為三層:應用層、接口層和核心層

應用層

提供了機器學習相關的訓練庫、預測庫和針對Python、C++和Java等變成語言的編程環境,類似於web系統的前端,主要實現了對計算圖的構造。

接口層

對Tensorflow功能模塊的封裝,便於其它語言平台的調用。

核心層

最重要的部分,包括設備層、網絡層、數據操作層和圖計算層,執行應用層的計算。

1.設備層

包括Tensorflow在不同硬件設備上的實現,主要支持CPU、GPU和Mobile等設備,在不同硬件設備上實現計算命令的轉換,給上層提供統一的接口,實現程序的跨平台功能。

2.網絡層

網絡層主要包括RPC和RDMA通信協議,實現不同設備之間的數據傳輸和更新,這些協議都會在分佈式計算中用到。

3.數據操作層

以tensor為處理對象,實現tensor的各種操作和計算。

4.圖計算層

包括分佈式計算圖和本地計算圖的實現,實現圖的創建、編譯、優化和執行等。

設計理念

可以將Tensorflow理解為一張計算圖中“張量的流動”,其中,Tensor(張量)代表了計算圖中的邊,Flow(流動)代表了計算圖中節點所做的操作而形成的數據流動。

其設計理念是以數據流為核心,當構建相應的機器學習模型后,使用訓練數據在模型中進行數據流動,同時將結果以反向傳播的方式反饋給模型中的參數,以進行調參,使用調整后的參數對訓練數據再次進行迭代計算。

編程特點

有兩個編程特點:

  1. 圖的定義和圖的運行完全分開

在tensorflow中,需要預先定義各種變量,建立相關的數據流圖,在數據流圖中創建各種變量之間的計算關係,完成圖的定義,需要把運算的輸入數據放進去后,才會形成輸出值。

  1. 圖的計算在會話中執行

tensorflow的相關計算在圖中進行定義,而圖的具體運行壞境在會話(session)中,開啟會話后,才能開始計算,關閉會話就不能再進行計算了。

舉個例子:

import tensorflow as tf
tf.compat.v1.disable_eager_execution()


a = 3
b = 4
c = 5
y = tf.add(a*b, c)
print(y)

a = tf.constant(3, tf.int32)
b = tf.constant(4, tf.int32)
c = tf.constant(5, tf.int32)
y = tf.add(a*b, c)
print(y)
session = tf.compat.v1.Session()
print(session.run(y))
session.close()

可以看出,在圖創建后,並在會話中執行數據計算,最終輸出結果。

設計的好處就是:學習的過程中,消耗最多的是對數據的訓練,這樣設計的話,當進行計算時,圖已經確定,計算就只剩下一個不斷迭代的過程。

基本概念

Tensor

張量,是tensorflow中最主要的數據結構,張量用於在計算圖中進行數據傳遞,創建了張量后,需要將其賦值給一個變量或佔位符,之後才會將該張量添加到計算圖中。

session

會話,是Tensorflow中計算圖的具體執行者,與圖進行實際的交互。一個會話中可以有多個圖,會話的主要目的是將訓練數據添加到圖中進行計算,也可以修改圖的結構。

調用模式推薦使用with語句:

with session:
    session.run()

Variable

變量,表示圖中的各個計算參數,通過調整這些變量的狀態來優化機器學習算法。創建變量應使用tf.Variable(),通過輸入一個張量,返回一個變量,變量聲明后需進行初始化才能使用。

舉例說明:

import tensorflow as tf
tf.compat.v1.disable_eager_execution()

tensor = tf.ones([1, 3])
test_var = tf.Variable(tensor)
# 初始化變量
init_op = tf.compat.v1.global_variables_initializer()
session = tf.compat.v1.Session()
with session:
    print("tensor is ", session.run(tensor))
    # print("test_var is ", session.run(test_var))
    session.run(init_op)
    print("after init, test_var is", session.run(test_var))

Placeholder

佔位符,用於表示輸入輸出數據的格式,聲明了數據位置,允許傳入指定類型和形狀的數據,通過會話中的feed_dict參數獲取數據,在計算圖運行時使用獲取的數據進行計算,計算完畢后獲取的數據就會消失。

舉例說明:

x = tf.compat.v1.placeholder(tf.int32)
y = tf.compat.v1.placeholder(tf.int32)
z = tf.add(x, y)
session = tf.compat.v1.Session()
with session:
    print(session.run([z], feed_dict={x: [1, 2], y: [2, 3]}))

Operation

操作,是圖中的節點,輸入輸出都是Tensor,作用是完成各種操作,包括:

  1. 數學運算:add, sub, mul, div, exp …
  2. 數組運算:concat, slice, split, rank …
  3. 矩陣運算:matmul, matrixinverse …
  4. 神經網絡構建:softmax, sigmoid, relu …
  5. 檢查點:save, restore …
  6. 隊列和同步:enqueue, dequeue, mutexacquire, mutexrelease …
  7. 張量控制:merge, switch, enter, leave …

Queue

隊列,圖中有狀態的節點。包含入列(endqueue)和出列(dequeue)兩個操作,入列返回計算圖中的一個操作節點,出列返回一個tensor值。

其中,隊列有兩種:

1. FIFOQueue

按入列順序出列的隊列,在需要讀入的訓練樣本有序時使用。舉個例子:

fifo_queue = tf.compat.v1.FIFOQueue(10, 'int32')
init = fifo_queue.enqueue_many(([1, 2, 3, 4, 5, 6], ))
with tf.compat.v1.Session() as session:
    session.run(init)
    queue_size = session.run(fifo_queue.size())
    for item in range(queue_size):
        print('fifo_queue', session.run(fifo_queue.dequeue()))

2. RandomShuffleQueue

以隨機順序出列的隊列,讀入的訓練樣本無序時使用。舉個例子:

rs_queue = tf.compat.v1.RandomShuffleQueue(capacity=5, min_after_dequeue=0, dtypes='int32')
init = rs_queue.enqueue_many(([1, 2, 3, 4, 5], ))
with tf.compat.v1.Session() as session:
    session.run(init)
    queue_size = session.run(rs_queue.size())
    for i in range(queue_size):
        print('rs_queue', session.run(rs_queue.dequeue()))

代碼參考:

以上。

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

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

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

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

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

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

drf序列化組件之視圖家族

一、視圖家族的分類

1.導入分類
from rest_framewok import views, generics, mixins, viewsets

views:視圖類

​ 兩大視圖類:APIView、GenericAPIView

from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView

mixins:視圖工具類

​ 六大視圖工具類: RetrieveModelMixin, ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin

from rest_framework.mixins import RetrieveModelMixin, ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin

generics:工具視圖類

​ 九大工具視圖類:…

from rest_framework import generics

viewsets:視圖集

​ 兩大視圖集基類:ViewSet、GenericViewSet

from rest_framework import viewsets

2.APIVIiew的特性

它繼承了Django的View

​ 1)View:將請求方式與視圖類的同名方法建立映射,完成請求響應

​ 2)APIView:

​ 繼承了View所有的功能;

​ 重寫as_view禁用csrf認證;

​ 重寫dispatch:請求、響應、渲染、異常、解析、三大認證

​ 多了一堆類屬性,可以完成視圖類的局部配置

二、views視圖類的兩大視圖類的用法與區別

APIView:

from rest_framework.views import APIView
from rest_framework.response import Response
from . import models,serializers

# APIView:
class StudentAPIView(APIView):
    def get(self, request, *args, **kwargs):
        # 群查
        stu_query = models.Sudent.objects.all()
        stu_ser = serializers.StudentModelSerializer(stu_query,many=True)
        print(stu_ser)
        return Response(stu_ser.data)

GenericAPIView:

# GenericAPIView:
from rest_framework.generics import GenericAPIView

class StudentGenericAPIView(GenericAPIView):
    queryset = models.Sudent.objects.all()
    serializer_class = serializers.StudentModelSerializer
    def get(self, request, *args, **kwargs):
        # 群查
        # stu_query = models.Sudent.objects.all()
        stu_query = self.get_queryset()
        # stu_ser = serializers.StudentModelSerializer(stu_query,many=True)
        stu_ser = self.get_serializer(stu_query, many=True)

        return Response(stu_ser.data)

區別:

1.GenericAPIView繼承了APIView,所以它可以用APIView所有的功能
2.GenericAPIView內部提供了三個常用方法:
get_object(): 拿到單個準備序列化的對象,用於單查
get_queryset(): 拿到含有多條數據的Queryset對象,用於群查
get_serializer(): 拿到經過序列化的的serializer對象
3.三個常用屬性:
queryset
serializer_class
lookup_url_kwarg

三、視圖工具類Mixin的用法與介紹

以單增和群查為例:

from rest_framework import mixins
class StudentMixinGenericAPIView(mixins.ListModelMixin, mixins.CreateModelMixin, GenericAPIView):
    queryset = models.Sudent.objects.all()
    serializer_class = serializers.StudentModelSerializer
    # 群查
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    # 單增
    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

特點:
1.提供了五大工具類及其六大工具方法:
CreateModelMixin: create() 實現單增
ListModelMixin: list() 實現群查
RetrieveModelMixin:retrieve() 實現單查
UpdateModelMixin: update() 實現單改 和 perform_update() 實現局部改
DestroyModelMixin : destroy() 實現單刪

​ 2.只要調用工具類的方法,就可實現該方法的功能,內部的實現原理據說是將我們之前寫的代碼進行了一層封裝,所以我們直接調用即可

​ 3. 由於mixins里的五大工具類沒有繼承任何視圖類views,在配置url的時候沒有as_view()方法,也就是不能進行任何的增刪改查,所以寫視圖類時繼承GenericAPIView類

四、工具視圖類Mixin的用法與介紹

# 工具視圖類
from rest_framework.generics import CreateAPIView, RetrieveAPIView, ListAPIView,UpdateAPIView,DestroyAPIView
class StudentMixinAPIView(CreateAPIView,ListAPIView,RetrieveAPIView,UpdateAPIView,DestroyAPIView):
    queryset = models.Sudent.objects.all()
    serializer_class = serializers.StudentModelSerializer
    # url中單查,不一定必須提供主鍵,提供一切唯一鍵的字段名均可
    lookup_url_kwarg = 'id'

    # 有刪除需求的接口繼承DestroyAPIView,重寫destroy完成字段刪除
    def destroy(self, request, *args, **kwargs):
        pass
 

分析:

​ lookup_url_kwarg: url中單查,不一定必須提供主鍵,提供一切唯一鍵的字段名均可,url配置中也要將pk改為id

​ 優點:

​ CreateAPIView,ListAPIView,RetrieveAPIView,UpdateAPIView,DestroyAPIView這五個工具類集成了mixins與GenericAPIView裏面的類。將它們再進行一次封裝,將get,post…等方法封裝起來,我們直接繼承有該方法的類即可。
​ 缺點:

​ 單查與群查不能共存,按照繼承順序決定單查還是群查,下面介紹的視圖集就能完成共存。

五、視圖集的用法與介紹

# 視圖集
from rest_framework.viewsets import ModelViewSet
class StudentModelViewSet(ModelViewSet):
    queryset = models.Sudent.objects.all()
    serializer_class = serializers.StudentModelSerializer

    def mypost(self, request, *args, **kwargs):
        return Response('my post ok')

分析:

​ 通過使用視圖集可以實現單查與群查共存,原因從查看源代碼得知:

ModelViewSet繼承五大工具類之外還繼承了GenericViewSet

GenericViewSet繼承了ViewSet再繼承了ViewSetMixin

而在ViewSetMixin類裏面,它重寫了as_view()方法,根據繼承關係,如果路由匹配上了,先走ViewSetMixin的as_view()方法。在它的as_view()方法裏面,它通過給給as_view()方法傳參數的方式,對應的工具方法:

它的原理就是通過給傳字典,通過字典裏面的數據進行反射,得到請求想要執行的方法。

在url路由中配置,這樣我們就可以區別單查與群查了:

我們還可以自己重寫請求要執行的對應方法。來實現特殊的需求。

注:由上面的代碼可以知道:除了繼承APIView的視圖類外,其他視圖類都要在該類下設置兩個屬性:

queryset = models.Student.objects.all()  # 代表跟哪張表建立關係
serializer_class = serializers.StudentModelSerializer  # 指明用的是哪個序列化器

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

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

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

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

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