標籤: 南投搬家公司費用

  • 全長 1,000 公里!澳洲昆士蘭將建可供充電的電動車高速公路

    澳洲昆士蘭 (Queensland) 將在長 1,600 公里的高速公路沿線設置「電動車充電站」,充電時間只需花費 15 至 30 分鐘,預計將成為澳洲第一個運用太陽能提供電動車快速充電站的省。   此項計畫的第一個充電站會座落在湯斯維爾,後續其他地點則將沿著全長 1,600 公里長的布魯斯高速公路(Bruce Highway)興建。昆士蘭政府表示,「此項計畫目標是為了「電動高速公路」(electric super highway)揭開序幕,希望能夠提供來往昆士蘭的用路人快速充電服務。 」 這項計畫雖然將會啟用太陽能為主的快速充電站,但沿線依舊會保有傳統的加油站,傳統汽油汽車的用路權益不會受損,而電動車的車主也無需因為路途遙遠而擔心電力問題。    

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

    【其他文章推薦】

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

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

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

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

    新北清潔公司,居家、辦公、裝潢細清專業服務

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

  • 歐盟計畫出臺統一的電動汽車補貼政策

    目前歐盟國家對的補貼參差不齊,在法國購買電動汽車可獲得最多至7000歐元的補貼,而在德國沒有補貼。為幫助歐洲汽車工業克服時艱,歐盟擬出臺統一的電動汽車補貼政策。

    歐盟工業專員塔賈尼(Antonio Tajani)在其草擬的行動計畫中對這一政策目標作說明時說,歐洲汽車工業迫切需要得到支援,以應對挑戰。歐洲汽車工業間接或直接地創造1200個工作崗位,而部分廠商深陷危機。塔賈尼表示,過去數月是歐洲汽車工業經歷的艱難時刻,一些企業如法國PSA、義大利菲亞特、德國歐寶等遭遇強大的重組壓力,產品滯銷。

    塔賈尼透過行動計畫承諾,將為歐洲汽車工業提供研發資金,並從歐洲社保基金中拿錢培訓員工,幫助其掌握新的技術。塔還想阻止歐洲國家單一購車補貼行為,在全歐範圍內推行統一的購買電動車補貼政策。法國的做法是,對購買法國本土生產的電動車或混合動力汽車予以最多至7000歐元的補貼,以支持本國汽車業發展和維護其競爭力。而在德國,汽車工業協會也曾多次提出要求予以補貼,但遭德政府拒絕。塔將于本週四飛往柏林遊說其擬出臺方案。

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

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

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

    ※智慧手機時代的來臨,RWD網頁設計為架站首選

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

    ※幫你省時又省力,新北清潔一流服務好口碑

    ※回頭車貨運收費標準

  • 日產CEO戈恩否認目前對電動汽車過度投資

    日產汽車CEO卡洛斯·戈恩(Carlos Ghosn)日前表示,受人喜愛,唯一的關注點是電動汽車發展是否會受到能否盈利的拖累,但是從日產的經營發展狀況看,這顯然不是累贅,他否認目前對電動汽車過度投資。

    事實上,今年前10個月,日產在美國的市場份額一直徘徊在7.9%,低於去年同期的8.2%。此外,日產押寶電動汽車的勢頭也顯現出頹勢,截至10月,聆風純電動汽車銷量下滑16%至6791輛,與全年20000輛的銷售目標相距甚遠。戈恩對此表示,若想在美國的市場份額達到10%,需要提高生產能力,他預計到2017年可實現此目標。

    戈恩目前對日產設立的中期目標是:日產在2017年3月31日財年末在美國的市場份額達到10%。一旦達到這一目標,日產將在北美開設新分廠。新工廠的新增生產能力將用來生產英菲尼迪。現在,英菲尼迪汽車除了JX跨界車在田納西州士麥那生產外,其他的都在日本本土生產。

    對於英菲尼迪LE純電動概念車所扮演的角色,戈恩表示,零排放汽車對我來說是即使不賣也要保留的車型。市場上會出現越來越多的零排放汽車,理所當然,英菲尼迪也至少有這樣一款車型。很顯然,它是一款旗艦車型,會開發、量產、上市銷售。

    當被問及是否擔心為在全球推出上萬輛電動汽車而過度投資時,戈恩對此予以否認。他說,“我不這樣認為,因為今天我們的投資規模是年產50萬輛,這與潛在需求是適度匹配的,我們正在密切關注中國市場,同時關注著法國的電動汽車新激勵政策。無論如何,美國未來將不得不接受電動汽車,並且是以可持續的態勢。而日本已經在這樣做了。因此,我不認為我們目前是在過度投資。”

    據悉,到2015年,日產雷諾聯盟的電動汽車目標是達到累計銷售150萬輛。戈恩回應道:“雷諾有4款電動車型,其中最重要的一款Zoe將於2013年初發售,雷諾電動汽車的大規模市場啟動還沒有開始,日產方面,聆風純電動已經走向全球市場,日產雷諾聯盟會為達成目標而變得更有競爭力,但是現在還言之尚早。”

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

    【其他文章推薦】

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

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

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

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

    新北清潔公司,居家、辦公、裝潢細清專業服務

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

  • Kubernetes學習筆記(九):StatefulSet–部署有狀態的多副本應用

    StatefulSet如何提供穩定的網絡標識和狀態

    ReplicaSet中的Pod都是無狀態,可隨意替代的。又因為ReplicaSet中的Pod是根據模板生成的多副本,無法對每個副本都指定單獨的PVC。

    來看一下StatefulSet如何解決的。

    提供穩定的網絡標識

    StatefulSet創建Pod都有一個從零開始的順序索引,這會體現在Pod的名稱和主機名上,同樣也會體現在Pod對應的固定存儲上。所以這些名字是可預先知道的,不同於ReplicaSet的隨機生成名字。

    因為他們的名字都是固定的,而且彼此狀態都不同,通常會操作他們其中的一個。如此情況,一般都會創建一個與之對應的headless Service,通過這個Service,每個Pod將擁有獨立的DNS記錄。

    擴容一個StatefulSet會使用下一個順序索引創建一個新的Pod,縮容會刪除索引值最高的。並且縮容任何時候只會操作一個Pod。

    如何提供穩定的存儲

    StatefulSet可以擁有一個或多個PVC模板,這些PVC會在創建Pod前創建出來,綁定到一個Pod實例上。

    擴容的時候會創建一個Pod以及若干個PVC,刪除的時候只會刪除Pod。StatefulSet縮容時不會刪除PVC,擴容時會重新掛上。

    使用StatefulSet

    定義三個PV

    定義pv-(a|b|c)

    # stateful-pv-list.yaml
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-a
    spec:
      capacity:
        storage: 1Mi
      accessModes:
      - ReadWriteOnce
      persistentVolumeReclaimPolicy: Recycle
      hostPath:
        path: /tmp/pva
    ---
    apiVersion: v1
    kind: PersistentVolume
    # 以下忽略
    

    headless的Service

    # stateful-service-headless.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: rwfile
    spec:
      clusterIP: None
      selector:
        app: rwfile
      ports:
      - port: 80
    

    定義StatefulSet

    先創建兩個Pod副本。使用volumeClaimTemplates定義了PVC模板。

    # stateful.yaml
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: rwfile
    spec:
      replicas: 2
      serviceName: rwfile
      selector:
        matchLabels:
         app: rwfile
      template:
        metadata:
          labels:
            app: rwfile
        spec:
          containers:
          - image: registry.cn-hangzhou.aliyuncs.com/orzi/rwfile
            name: rwfile
            ports:
            - containerPort: 8000
            volumeMounts:
            - name: data
              mountPath: /tmp/data
      volumeClaimTemplates:
      - metadata:
          name: data
        spec:
          resources:
            requests:
              storage: 1Mi
          accessModes:
          - ReadWriteOnce
    

    創建三個PV,一個headless的Service,一個StatefulSet

    -> [root@kube0.vm] [~] k create -f stateful-pv-list.yaml
    persistentvolume/pv-a created
    persistentvolume/pv-b created
    persistentvolume/pv-c created
    
    -> [root@kube0.vm] [~] k create -f stateful-service-headless.yaml
    service/rwfile created
    
    -> [root@kube0.vm] [~] k create -f stateful.yaml
    statefulset.apps/rwfile created
    

    查看

    -> [root@kube0.vm] [~] k get all -o wide
    NAME                    READY   STATUS      RESTARTS   AGE   IP            NODE       NOMINATED NODE   READINESS GATES
    pod/rwfile-0            1/1     Running     0          12s   10.244.1.52   kube1.vm   <none>           <none>
    pod/rwfile-1            1/1     Running     0          8s    10.244.2.56   kube2.vm   <none>           <none>
    
    NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE   SELECTOR
    service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   81s   <none>
    service/rwfile       ClusterIP   None         <none>        80/TCP    23s   app=rwfile
    
    NAME                      READY   AGE   CONTAINERS   IMAGES
    statefulset.apps/rwfile   2/2     12s   rwfile       registry.cn-hangzhou.aliyuncs.com/orzi/rwfile
    

    查看PV和PVC,可以看到已經有兩個PVC綁定了PV

    -> [root@kube0.vm] [~] k get pv,pvc -o wide
    NAME                    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                   STORAGECLASS   REASON   AGE     VOLUMEMODE
    persistentvolume/pv-a   1Mi        RWO            Recycle          Bound       default/data-rwfile-0                           7m20s   Filesystem
    persistentvolume/pv-b   1Mi        RWO            Recycle          Bound       default/data-rwfile-1                           7m20s   Filesystem
    persistentvolume/pv-c   1Mi        RWO            Recycle          Available                                                   7m20s   Filesystem
    
    NAME                                  STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE     VOLUMEMODE
    persistentvolumeclaim/data-rwfile-0   Bound    pv-a     1Mi        RWO                           6m55s   Filesystem
    persistentvolumeclaim/data-rwfile-1   Bound    pv-b     1Mi        RWO                           6m51s   Filesystem
    

    請求Pod

    啟動代理

    -> [root@kube0.vm] [~] k proxy
    Starting to serve on 127.0.0.1:8001
    

    發送請求

    -> [root@kube0.vm] [~] curl http://localhost:8001/api/v1/namespaces/default/pods/rwfile-0/proxy/ -d "a=123"
    data stored in : rwfile-0
    
    -> [root@kube0.vm] [~] curl http://localhost:8001/api/v1/namespaces/default/pods/rwfile-0/proxy/
    a=123
    

    刪除測試

    刪除rwfile-0,然後查看,從時間上看確實是被刪除重建的。

    -> [root@kube0.vm] [~] k delete po rwfile-0
    pod "rwfile-0" deleted
    
    -> [root@kube0.vm] [~] k get po
    NAME                READY   STATUS      RESTARTS   AGE
    rwfile-0            1/1     Running     0          7s
    rwfile-1            1/1     Running     0          19m
    

    看一下之前存儲的數據還在不在

    -> [root@kube0.vm] [~] curl http://localhost:8001/api/v1/namespaces/default/pods/rwfile-0/proxy/
    a=123
    

    還是在的,此次測試實際上也證明了StatefulSet提供了穩定的網絡標識和存儲。

    發現StatefulSet的夥伴節點

    使用DNS解析headless的Service的FQDN。
    例子以後再寫吧。。

    如何處理節點失效

    除非確定節點無法運行或者不會在訪問,否則不要強制刪除有狀態的Pod

    k delete pod rwfile-0 --force --grace-period 0
    

    小結

    • StatefulSet創建Pod都有一個從零開始的順序索引
    • 通常會創建一個與StatefulSet對應的headless Service。
    • 擴容一個StatefulSet會使用下一個順序索引創建一個新的Pod,縮容會刪除索引值最高的。
    • 新建StatefulSet需要指定headless ServiceName和volumeClaimTemplates。
    • 使用DNS發現StatefulSet的夥伴節點
    • 強制刪除:k delete pod rwfile-0 --force --grace-period 0

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

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

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

    ※智慧手機時代的來臨,RWD網頁設計為架站首選

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

    ※幫你省時又省力,新北清潔一流服務好口碑

    ※回頭車貨運收費標準

  • 接口中的默認方法與靜態方法

    在Java8之前的版本中,接口中只能聲明常量和抽象方法,接口的實現類中必須實現接口中所有的抽象方法。而在Java8中,接口中可以聲明默認方法靜態方法。

    接口中的默認方法

    Java 8中允許接口中包含具有具體實現的方法,該方法稱為“默認方法”,默認方法使用“ default ”關鍵字修飾 。

    示例:

    public interface MyInterface {
        default String getMsg(String srcMsg){
            return "======"+srcMsg;
        }
    }

    接口中的默認方法,有一個“類優先”原則:

    若一個接口中定義了一個默認方法,而另外一個父類或接口中又定義了同一個同名的方法時:

    • 選擇父類中的方法。如果一個父類提供了具體的實現,那麼接口中具有相同名稱的參數的默認方法會被忽略。
    • 接口衝突。如果一個父接口提供一個默認方法,而另一個接口中也提供了一個具有相同名稱和參數列表的方法(不管方法是否是默認方法),那麼必須覆蓋該方法來解決衝突。

    示例1:

    public interface MyInterface1 {
        default String getMsg(String srcMsg){
            return "===我是MyInterface1111111==="+srcMsg;
        }
    }
    ///////////////////////////////////////////////////////
    public class MyClass1 {
        public String getMsg(String srcMsg){
            return "===我是MyClass11111==="+srcMsg;
        }
    }
    ///////////////////////////////////////////////////////
    public class MySubClass1 extends MyClass1 implements MyInterface1 {
    }
    
    ///////////////////////////////////////////////////////
    public class InterfaceTest {
    
        public static void main(String[] args) {
            MySubClass1 ms1 = new MySubClass1();
    
            String srcMsg = "Java 牛逼!!";
            //MySubClass1 類繼承了 MyClass1 類,實現了MyInterface1 接口,根據類優先原則,調用同名方法時,會忽略掉接口 MyInterface1 中的默認方法。
            System.out.println(ms1.getMsg(srcMsg));//輸出結果:===我是MyClass11111===Java 牛逼!!
    
        }
    }

    示例2:

    public interface MyInterface2 {
        default String getMsg(String srcMsg){
            return "===我是MyInterface2222222==="+srcMsg;
        }
    }
    ////////////////////////////////////////////////////////////////
    public class MySubClass2 implements MyInterface1,MyInterface2 {
        @Override
        public String getMsg(String srcMsg) {
            //同時實現了 MyInterface1,MyInterface2  接口,根據 類優先 原則,兩個父接口中都提供了相同的方法,那麼子類中就必須重寫這個方法來解決衝突。
            return MyInterface1.super.getMsg(srcMsg);
            //return MyInterface2.super.getMsg(srcMsg);
            //return "------"+srcMsg;
        }
    }
    ////////////////////////////////////////////////////////////////
    public class InterfaceTest {
    
        public static void main(String[] args) {
            MySubClass2 ms2 = new MySubClass2();
    
            //MySubClass2 重新實現了兩個父接口中都存在的相同名稱的方法。
            System.out.println(ms2.getMsg(srcMsg));//輸出結果:===我是MyInterface1111111===Java 牛逼!!
        }
    }

     

    接口中的靜態方法

    在Java8中,接口中允許添加 靜態方法,使用方式:“接口名.方法名”

    示例:

    public interface MyInterface3 {
        static String getMsg(String msg){
            return "我是接口中的靜態方法:"+msg;
        }
    
        static void main(String[] args) {
            System.out.println(MyInterface3.getMsg("Java牛逼!!"));
        }
    }

     

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

    【其他文章推薦】

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

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

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

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

    新北清潔公司,居家、辦公、裝潢細清專業服務

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

  • 番茄感染病毒 法國出現首批確診案例

    摘錄自2020年2月18日中央社報導

    法國農業部今天(18日)表示,法國最西邊菲尼斯泰爾省(Finistere)的番茄植物已遭一種毀滅性病毒污染,這種病毒可能導致全部作物付之一炬。

    法新社報導,法國農業部表示,已隔離一座農場,並將摧毀充滿番茄的多座溫室,目前沒有已知的治療方法。

    這種病毒稱作「番茄褐色皺紋果病毒」(ToBRFV),可造成番茄出現粗糙變色斑塊,以致番茄賣不出去。官員先前警告,這種病毒的散播對農夫將有「重大經濟後果」。

    這種病毒對人類無害。2014年於以色列的溫室中傳出首例,之後傳播至歐洲及美洲。

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

    【其他文章推薦】

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

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

    ※智慧手機時代的來臨,RWD網頁設計為架站首選

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

    ※幫你省時又省力,新北清潔一流服務好口碑

    ※回頭車貨運收費標準

  • Dell 將於 2040 年全面轉用再生能源

    摘錄自2019年11月13日unwire HK報導

    隨著更多的企業響應環保,作為知名的電腦公司 DELL 在近日亦宣佈了新的可持續發展計劃,指公司所有設施的 75% 電力將會使用可再生能源,直至 2040 年時將預計可獲 100% 的電力,並同時在計劃在過程中提高公司在生產及供應鏈上的能源效益,以達致低排放的目標為環保出一分力。

    DELL 在早前宣佈公司將進行「Progress Made Real」的計劃,計劃內容主要包括在消費者購買的每一項設備時會回收同一污染水平的產品,以及在生產電力方面採用可再生能源。DELL 指出到 2030 年時公司一半以上的設備將會由回收材料或可再生物料而生產,在包裝上則會全面使用可重覆利用的物料。

    不過 DELL 就並未透露公司是否會增加旗下所有裝置的使用壽命,但就指出對電子製造商而言,應對氣候變化的最佳方法是避免所有電子產品送往堆填區,而是重覆使用及物盡其用。

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

    【其他文章推薦】

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

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

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

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

    新北清潔公司,居家、辦公、裝潢細清專業服務

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

  • 驗證碼原理及驗證

    驗證碼的原理

    驗證碼的作用:

     驗證碼是是一種區分用戶是計算機還是人的公共全自動程序,可以防止:惡意破解密碼、刷票、論壇灌水、有效防止某個黑客對某一特定註冊用戶,用特定程序暴力破解方式進行不斷的登錄嘗試。實際上驗證碼是現在很多網站通行的方式,我們利用比較簡易的方式實現了這個功能。

    生成驗證碼

    生成驗證碼這個功能已經特別成熟了 在網上可以找到很多資源

    以下是生成驗證碼的相關代碼:

    package com._yhnit.randomcode;
    
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.util.Random;
    
    import javax.imageio.ImageIO;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    /**
     *  生成驗證碼的Servlet
     * @author yhn
     *
     */
    @WebServlet("/createRandomcode")
    public class RandomCodeServlet extends HttpServlet{
    
    	private static final long serialVersionUID = 1L;
    	 public RandomCodeServlet() {
    	        super();
    
    	    }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            doPost(request, response);
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            // 響應頭信息
            response.setHeader("Pragma", "No-Cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expries", 0);
    
            // 隨機數生成類
            Random random = new Random();
    
            // 定義驗證碼的位數
            int size = 5;
    
            // 定義變量保存生成的驗證碼
            String vCode = "";
            char c;
            // 產生驗證碼
            for (int i = 0; i < size; i++) {
                // 產生一個26以內的隨機整數
                int number = random.nextInt(26);
                // 如果生成的是偶數,則隨機生成一個数字
                if (number % 2 == 0) {
                    c = (char) ('0' + (char) ((int) (Math.random() * 10)));
                    // 如果生成的是奇數,則隨機生成一個字母
                } else {
                    c = (char) ((char) ((int) (Math.random() * 26)) + 'A');
                }
                vCode = vCode + c;
            }
    
            // 保存生成的5位驗證碼
            request.getSession().setAttribute("RANDOMCODE_IN_SESSION", vCode);
    
            // 驗證碼圖片的生成
            // 定義圖片的寬度和高度
            int width = (int) Math.ceil(size * 20);
            int height = 30;
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            // 獲取圖片的上下文
            Graphics gr = image.getGraphics();
            // 設定圖片背景顏色
            gr.setColor(Color.WHITE);
            gr.fillRect(0, 0, width, height);
            // 設定圖片邊框
            gr.setColor(Color.GRAY);
            gr.drawRect(0, 0, width - 1, height - 1);
            // 畫十條幹擾線
            for (int i = 0; i < 5; i++) {
                int x1 = random.nextInt(width);
                int y1 = random.nextInt(height);
                int x2 = random.nextInt(width);
                int y2 = random.nextInt(height);
                gr.setColor(randomColor());
                gr.drawLine(x1, y1, x2, y2);
            }
            // 設置字體,畫驗證碼
            gr.setColor(randomColor());
            gr.setFont(randomFont());
            gr.drawString(vCode, 10, 22);
            // 圖像生效
            gr.dispose();
            // 輸出到頁面
            ImageIO.write(image, "JPEG", response.getOutputStream());
    
        }
    
        // 生成隨機的顏色
        private Color randomColor() {
            int red = r.nextInt(150);
            int green = r.nextInt(150);
            int blue = r.nextInt(150);
            return new Color(red, green, blue);
        }
    
        private String[] fontNames = { "宋體", "華文楷體", "黑體", "微軟雅黑", "楷體_GB2312" };
        private Random r = new Random();
    
        // 生成隨機的字體
        private Font randomFont() {
            int index = r.nextInt(fontNames.length);
            String fontName = fontNames[index];// 生成隨機的字體名稱
            int style = r.nextInt(4);
            int size = r.nextInt(3) + 24; // 生成隨機字號, 24 ~ 28
            return new Font(fontName, style, size);
        }
    }
    
    
    
    

    上述代碼中 定義了生成5位数字+字母的驗證碼

    生成的驗證碼 將存放到兩個地方:

    1. Session中
    2. 放到圖片上去

    最重要的是 將驗證碼存入Session,因為後台校驗驗證碼是否正確要依靠這一步

    // 保存生成的5位驗證碼
     request.getSession().setAttribute("RANDOMCODE_IN_SESSION", vCode);
    

    前端頁面實現驗證碼的切換

    在很多應用中 ,我們都會看見驗證碼的切換操作

    比如:點擊圖片切換,或者點擊後面文字(類如 看不清,換一張) 進行切換

    其實 切換很簡單 只是將圖片元素 的src 屬性 變換一下就可以完成

    這裏給驗證碼圖片 和 換一張文字添加點擊事件

    驗證碼:<input type="text" maxlength="5" required="required" name ="randomcode">
    	   <img  src="/createRandomcode" style="cursor: pointer;" onclick="change();"  id="randomcodeImg">
    		<a href="" onclick="change();">換一張</a><br>
    
    

    點擊事件 是一個名字為change函數

    function change(){
    	// 因為有緩存  所以加一個隨機數  表示不同的請求
    	document.getElementById("randomcodeImg").src="/createRandomcode?"+new Date().getTime();	
    	}
    

    注意這裏:src不能也寫 /createRandomcode,因為瀏覽器有緩存 因為之前的src就是它

    所以點擊時不會發生切換,所以我們可以加個隨機數代表每一次都是一個新的請求。

    這樣就可以實現驗證碼的切換了。

    驗證碼的後台驗證

    驗證其實也很簡單,只需要把輸入的和圖片中的驗證碼進行對比即可

    獲取輸入的驗證碼:

    String code = req.getParameter("randomcode");
    

    獲取圖片中的驗證碼:

    (生成的時候 已經存在Session中 這時只需要從Session中取出即可)

    String Imgcode = req.getSession().getAttribute("RANDOMCODE_IN_SESSION").toString();
    

    兩者進行對比驗證:

    if (!code.equalsIgnoreCase(Imgcode)) {
        // 設置一些錯誤提示  提示用戶輸入錯誤 
    	req.getSession().setAttribute("errorMes", "請輸入正確的驗證碼或已經過期");
    	req.getRequestDispatcher("randomcode/RandomCodeLogin.jsp").forward(req, resp);
    	return;
    }
    		
    // 此時驗證碼成功
    System.out.println("驗證碼成功");
    // 避免重複提交  去除Session中這一次驗證碼
    req.getSession().removeAttribute("RANDOMCODE_IN_SESSION");
    
    // 繼續驗證用戶名和密碼  ....
    

    驗證碼驗證成功之後 要銷毀Session中這次的驗證碼(驗證碼一次性使用) 避免重複提交

    // 避免重複提交  去除Session中這一次驗證碼
    req.getSession().removeAttribute("RANDOMCODE_IN_SESSION");
    

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

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

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

    ※智慧手機時代的來臨,RWD網頁設計為架站首選

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

    ※幫你省時又省力,新北清潔一流服務好口碑

    ※回頭車貨運收費標準

  • .NET 5 嘗鮮 – 開源項目TerminalMACS WPF管理端支持.NET 5

    .NET 5 嘗鮮 – 開源項目TerminalMACS WPF管理端支持.NET 5

    .NET 5 嘗鮮 – 開源項目TerminalMACS WPF管理端支持.NET 5

    一個使用 Prism 作為模塊化框架、基於多個開源控件庫作為UI控件選擇、集成開源 UI 界面設計的 .NET 5 WPF 客戶端項目。

    • 項目名稱:TerminalMACS WPF管理端
    • 項目開源地址:
      • Github:https://github.com/dotnet9/TerminalMACS.ManagerForWPF
      • Gitee:https://gitee.com/dotnet9/TerminalMACS.ManagerForWPF
    • 作者:Dotnet9

    1. 特性

    • 使用 .NET 5 開發,體驗最新 .NET 平台(和 .NET Core 3.1 無縫兼容)

    .NET 5 是 .NET Framework 和 .NET Core 的未來,最終將成為一個統一平台,.NET5將包含ASP.NET核心、實體框架核心、WinForms、WPF、Xamarin 和 ML.NET。

    • 基於 Prism 8 搭建模塊化框架,方便程序擴展

    Prism為程序設計提供指導,旨在幫助用戶更加容易的設計和構建豐富、靈活、易於維護WPF桌面應用程序。Prism使用設計模式(如MVVM,複合視圖,事件聚合器),幫助你創建一個松耦合的程序。遵循這些設計模式原則,將目標程序解耦成獨立的模塊。這些類型的應用程序被稱為複合應用程序。

    • 已使用或即將使用到多個開源WPF控件庫

      • MaterialDesignInXamlToolkit
      • HandyControl
      • PanuonUI.Silver
      • AduSkin。

    參考以上多種開源 WPF UI 庫,多個選擇,開發 WPF 項目更方便。

    • ECharts

    界面設計有使用到ECharts,使用WPF WebBrowser控件加載html的方式

    ECharts:pie-doughnut

    • 本地化支持

    • 動態國際化支持

    • 支持主題色動態切換

    2. 支持環境

    • .NET 5.0。

    3. 當前版本

    0.1

    4. 鏈接

    • 官方網站:Dotnet9

    5. 項目界面截圖

    5.1. 關於

    5.2. 首頁模塊

    正在開發中…

    5.3. 服務端模塊

    正在開發中…

    5.4. 客戶端模塊

    正在開發中…

    5.5. 測試案例

    收集全球優秀的開源WPF界面設計,實時收集、實時添加更新,下面是部分實例截圖:

    登錄註冊分類 1

    1. 簡單登錄窗體設計1

    參考視頻:C# WPF Material Design UI: Login Window

    參考源碼:Login2

    1. 簡單登錄窗體設計2

    參考視頻:C# WPF Material Design UI: Login Window

    參考源碼:Login1

    1. 美食應用登錄

    參考視頻:WPF Food App Login UI Material Design [Speed Design]

    菜單類 2

    1. 抽屜式菜單

    參考視頻:C# WPF Material Design UI: Animated Colorful Navigation Drawer

    參考源碼:AnimatedColorfulMenu

    1. 菜單切換用戶控件

    參考視頻:C# WPF Material Design UI: Fast Food Sales

    參考源碼:Pizzaria1

    1. 菜單切換動畫

    參考視頻:C# WPF Material Design UI: Animated Menu

    參考源碼:AnimatedMenu1

    其他界面設計 3

    1. 移動應用儀錶盤

    參考視頻:WPF Dashboard UI – Material Design [Speed Design]

    參考源碼:WPF-Dashboard-UI-Material-Design-Concept

    1. 簡易儀錶盤2

    參考視頻:WPF Dashboard UI – Material Design [Speed Design]

    參考源碼:WPF-Dashboard-UI-Material-Design-Concept

    ECharts:pie-doughnut

    1. Instagram重新設計

    參考視頻:C# WPF Material Design UI: Redesign Instagram

    參考源碼:Instagram

    1. LoLGoal

    參考視頻:dotnet9

    參考源碼:dotnet9

    1. 簡易音樂播放器1

    參考視頻:C# WPF Material Design UI: Dashboard

    參考源碼:Dashboard

    1. 百度地圖

    通過WPF WebBrowser控件加載html5文件的形式加載百度地圖,使用JavaScript與C#互操作實現地圖交互。

    1. 聊天界面設計

    參考視頻:

    • C# WPF Design UI – 1/3 – Contact List
    • C# WPF Design UI – 2/3 – Profile
    • C# WPF Design UI – 3/3 – Chat

    參考源碼:Chat

    1. 計算器

    參考視頻:

    • Calcalator

    關注Dotnet9,分享更多好文
    如果本文對你有用,歡迎轉載,Dotnet9對應原文有markdown格式原文分享下載哦。

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

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

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

    ※智慧手機時代的來臨,RWD網頁設計為架站首選

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

    ※幫你省時又省力,新北清潔一流服務好口碑

    ※回頭車貨運收費標準

  • RabbitMQ入門,我是動了心的

    RabbitMQ入門,我是動了心的

    人一輩子最值得炫耀的不應該是你的財富有多少(雖然這話說得有點違心,呵呵),而是你的學習能力。技術更新迭代的速度非常快,那作為程序員,我們就應該擁有一顆擁抱變化的心,积極地跟進。

    在 RabbitMQ 入門之前,我已經入門了 Redis、Elasticsearch 和 MongoDB,這讓我感覺自己富有極客精神,非常良好。

    小夥伴們在繼續閱讀之前,我必須要聲明一點,我對 RabbitMQ 並沒有進行很深入的研究,僅僅是因為要用,就學一下。但作為一名負責任的技術博主,我是動了心的,這篇入門教程,小夥伴們讀完后絕對會感到滿意,忍不住無情地點贊,以及赤裸裸地轉發。

    當然了,小夥伴們遇到文章中有錯誤的地方,不要手下留情,可以組團過來捶我,但要保證一點,不要打臉,我怕毀容。

    01、RabbitMQ 是什麼

    首先,我知道,Rabbit 是一隻兔子(哎呀媽呀,忍不住秀了一波自己的英語功底),可愛的形象已經躍然於我的腦海中了。那 MQ 又是什麼呢?是 Message Queue 的首字母縮寫,也就是說 RabbitMQ 是一款開源的消息隊列系統。

    RabbitMQ 的主要特點在於健壯性好、易於使用、高性能、高併發、集群易擴展,以及強大的開源社區支持。反正就是很牛逼的樣子。

    九年前我做大宗期貨交易的時候,也需要消息推送,那時候還不知道去找這種現成的中間件,就用自定義的隊列實現,結果搞了不少 bug,有些到現在還沒有解決,真的是不堪回首的往事啊。

    下圖是 RabbitMQ 的消息模型圖(來源於網絡,侵刪),小夥伴們來感受下。

    1)P 是 Producer,代表生產者,也就是消息的發送者,可以將消息發送到 X

    2)X 是 Exchange(為啥不是 E,我也很好奇),代表交換機,可以接受生產者發送的消息,並根據路由將消息發送給指定的隊列

    3)Q 是 Queue,也就是隊列,存放交換機發送來的消息

    4)C 是 Consumer,代表消費者,也就是消息的接受者,從隊列中獲取消息

    聽我這樣一解釋,是不是對 RabbitMQ 的印象就很具象化了?小夥伴們,學起來吧!

    02、安裝 Erlang

    咦,怎麼不是安裝 RabbitMQ 啊?先來看看官方的解釋。

    英文看不太懂,沒關係,我來補充兩人話。RabbitMQ 服務器是用 Erlang 語言編寫的,它的安裝包里並沒有集成 Erlang 的環境,因此需要先安裝 Erlang。小夥伴們不要擔心,Erlang 安裝起來沒有任何難度。

    Erlang 下載地址如下:

    https://erlang.org/download/otp_versions_tree.html

    最新的版本是 23.0.1,我選擇的是 64 位的版本,104M 左右。下載完就可以雙擊運行安裝,傻瓜式的。

    需要注意的是,我安裝的過程中,電腦重啟了一次,好像要安裝一個什麼庫,重啟之前忘記保存圖片了(sorry)。重啟后,重新雙擊運行 otp_win64_23.0.1.exe 文件完成 Erlang 安裝。

    03、安裝 RabbitMQ

    Erlang 安裝成功后,就可以安裝 RabbitMQ 了。下載地址如下所示:

    https://www.rabbitmq.com/install-windows.html

    找到下圖中的位置,選擇紅色框中的文件進行下載。

    安裝包只有 16.5M 大小,還是非常輕量級的。下載完后直接雙擊運行 exe 文件就可以傻瓜式地安裝了。

    安裝成功后,就可以將 RabbitMQ 作為 Windows 服務啟動,可以從“開始”菜單管理 RabbitMQ Windows 服務。

    點擊「RabbitMQ Command Prompt (sbin dir)」,進入命令行,輸入 rabbitmqctl.bat status 可確認 RabbitMQ 的啟動狀態。

    可以看到 RabbitMQ 一些狀態信息:

    • 進程 ID,也就是 PID 為 2816
    • 操作系統為 Windows
    • 當前的版本號為 3.8.4
    • Erlang 的配置信息

    命令行界面看起來不夠優雅,因此我們可以輸入以下命令來啟用客戶端管理 UI 插件:

    rabbitmq-plugins enable rabbitmq_management

    看到以下信息就可以確認插件啟用成功了。

    在瀏覽器地址欄輸入 http://localhost:15672/ 可以進入管理端界面,如下圖所示:

    04、在 Java 中使用 RabbitMQ

    有些小夥伴可能會問,“二哥,我是一名 Java 程序員,我該如何在 Java 中使用 RabbitMQ 呢?”這個問題問得好,這就來,這就來。

    第一步,在項目中添加 RabbitMQ 客戶端依賴:

    <dependency>
        <groupId>com.rabbitmq</groupId>
        <artifactId>amqp-client</artifactId>
        <version>5.9.0</version>
    </dependency>

    第二步,我們來模擬一個最簡單的場景,一個生產者發送消息到隊列中,一個消費者從隊列中讀取消息並打印。

    官方對 RabbitMQ 有一個很好的解釋,我就“拿來主義”的用一下。在我上高中的年代,同學們之間最流行的交流方式不是 QQ、微信,甚至短信這些,而是書信。因為那時候還沒有智能手機,況且上學期間學校也是命令禁用手機的,所以書信是情感表達的最好方式。好懷念啊。

    假如我向女朋友小巷寫了一封情書,內容如下所示:

    致小巷
    你好呀,小巷。
    你走了以後我每天都感到很悶,就像堂吉訶德一樣,每天想念托波索的達辛妮亞。我現在已經養成了一種習慣,就是每兩三天就要找你說幾句不想對別人說的話。
    。。。。。。
    王二,5月20日

    那這封情書要寄給小巷,我就需要跑到郵局,買上郵票,投遞到郵箱當中。女朋友要收到這封情書,就需要郵遞員盡心儘力,不要弄丟了。

    RabbitMQ 就像郵局一樣,只不過處理的不是郵件,而是消息。之前解釋過了,P 就是生產者,C 就是消費者。

    新建生產者類 Wanger :

    public class Wanger {
        private final static String QUEUE_NAME = "love";
        public static void main(String[] args) throws IOException, TimeoutException {
            ConnectionFactory factory = new ConnectionFactory();

            try (Connection connection = factory.newConnection();
                 Channel channel = connection.createChannel()) {
                channel.queueDeclare(QUEUE_NAME, falsefalsefalsenull);
                String message = "小巷,我喜歡你。";
                channel.basicPublish("", QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));
                System.out.println(" [王二] 發送 '" + message + "'");
            }
        }
    }

    1)QUEUE_NAME 為隊列名,也就是說,生產者發送的消息會放到 love 隊列中。

    2)通過以下方式創建服務器連接:

    ConnectionFactory factory = new ConnectionFactory();
    try (Connection connection = factory.newConnection();
                 Channel channel = connection.createChannel()) {

    ConnectionFactory 是一個非常方便的工廠類,可用來創建到 RabbitMQ 的默認連接(主機名為“localhost”)。然後,創建一個通道( Channel)來發送消息。

    Connection 和 Channel 類都實現了 Closeable 接口,所以可以使用 try-with-resource 語句,如果有小夥伴對 try-with-resource 語句不太熟悉,可以查看我之前寫的我去文章。

    3)在發送消息的時候,必須設置隊列名稱,通過 queueDeclare() 方法設置。

    4)basicPublish() 方法用於發布消息:

    • 第一個參數為交換機(exchange),當前場景不需要,因此設置為空字符串;
    • 第二個參數為路由關鍵字(routingKey),暫時使用隊列名填充;
    • 第三個參數為消息的其他參數(BasicProperties),暫時不配置;
    • 第四個參數為消息的主體,這裏為 UTF-8 格式的字節數組,可以有效地杜絕中文亂碼。

    生產者類有了,接下來新建消費者類 XiaoXiang:

    public class XiaoXiang {
        private final static String QUEUE_NAME = "love";
        public static void main(String[] args) throws IOException, TimeoutException {
            ConnectionFactory factory = new ConnectionFactory();
            Connection connection = factory.newConnection();
            Channel channel = connection.createChannel();

            channel.queueDeclare(QUEUE_NAME, falsefalsefalsenull);
            System.out.println("等待接收消息");

            DeliverCallback deliverCallback = (consumerTag, delivery) -> {
                String message = new String(delivery.getBody(), "UTF-8");
                System.out.println(" [小巷] 接收到的消息 '" + message + "'");
            };
            channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
        }
    }

    1)創建通道的代碼和生產者差不多,只不過沒有使用 try-with-resource 語句來自動關閉連接和通道,因為我們希望消費者能夠一直保持連接,直到我們強制關閉它。

    2)在接收消息的時候,必須設置隊列名稱,通過 queueDeclare() 方法設置。

    3)由於 RabbitMQ 將會通過異步的方式向我們推送消息,因此我們需要提供了一個回調,該回調將對消息進行緩衝,直到我們做好準備接收它們為止。

    DeliverCallback deliverCallback = (consumerTag, delivery) -> {
        String message = new String(delivery.getBody(), "UTF-8");
        System.out.println(" [小巷] 接收到的消息 '" + message + "'");
    };

    basicConsume() 方法用於接收消息:

    • 第一個參數為隊列名(queue),和生產者相匹配(love)。

    • 第二個參數為 autoAck,如果為 true 的話,表明服務器要一次性交付消息。怎麼理解這個概念呢?小夥伴們可以在運行消費者類 XiaoXiang 類之前,先多次運行生產者類 Wanger,向隊列中發送多個消息,等到消費者類啟動后,你就會看到多條消息一次性接收到了,就像下面這樣。

    等待接收消息
     [小巷] 接收到的消息 '小巷,我喜歡你。'
     [小巷] 接收到的消息 '小巷,我喜歡你。'
     [小巷] 接收到的消息 '小巷,我喜歡你。'
    • 第三個參數為 DeliverCallback,也就是消息的回調函數。

    • 第四個參數為 CancelCallback,我暫時沒搞清楚是幹嘛的。

    在消息發送的過程中,也可以使用 RabbitMQ 的管理面板查看到消息的走勢圖,如下所示。

    05、鳴謝

    好了,我親愛的小夥伴們,以上就是本文的全部內容了,是不是看完后很想實操一把 RabbitMQ,趕快行動吧!如果你在學習的過程中遇到了問題,歡迎隨時和我交流,雖然我也是個菜鳥,但我有熱情啊。

    另外,如果你想寫入門級別的文章,這篇就是最好的範例。

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

    【其他文章推薦】

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

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

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

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

    新北清潔公司,居家、辦公、裝潢細清專業服務

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