第 1 份工作,我只幹了 2 周就被辭退了 | 十年系列

1.寫在前面

我將用系列文章,回顧十年程序生涯,一方面是對職場生涯的階段性總結,另一方面希望這些經歷,對讀者往後職場生涯有所啟發。

一隻站在樹上的鳥兒,從來不會害怕樹枝斷裂,因為它相信的不是樹枝,而是它自己的翅膀。

十年系列文章:

2.我的第一份工作

畢業后很多年,我都不好意思和別人提起這件事,第一份工作只上了 2 周班就被辭退了!這是我第一次被人主動辭退,當然也是我職場上的最後一次。

今天回想起來,如果當初沒有被這家公司辭退,我還能成為今天的我嗎?

人生有時候就是這麼神奇。

到底是怎麼回事,我給大家詳細講講。

上篇文章
中講到,從培訓機構培訓完后我找到了一份滿意的工作,也是我從校園出來的第一份工作,我們一個培訓班進了5個人,所以大家租房上班都在一起,每天高高興興的上班下班,我對工作也充滿了信心和期待。

這個香港來的電信公司還不錯,五險一金和其它福利在西安同等公司裏面算好的,最最重要的是這家公司還會給每個入職的同事做一個月的免費培訓,主要的培訓內容就是 Oracle 和 Linux 相關知識。

3.入職培訓

我們那一期總共有18個人入職一起培訓,培訓的地點就在西安軟件園的地下一層,每次早上都是老師先在前面給大家培訓 Sql 的使用,然後再給大家出幾道練習題實踐。

那個時候剛從學校的氛圍裏面出來,完全不知道職場是怎麼回事。我旁邊坐的小夥伴也是和我一樣從培訓班出來的,他就非常的聰明,每次實踐自己做出來之後,就會主動的喊老師過來看一下他的運行結果。

反觀我這邊,有些簡單的或者複雜的實踐題,有的我做出來了有的沒有做出來,做出來之後也不好意思找老師去看,就默默的坐在工位上,整個人感覺都是木木的,缺乏表現。

前排經常有一些同事,只是解出了其中的一些步驟,都會主動的喊老師過來檢查,這樣在老師的幫助下也很快的完成了,多次交流和老師也熟悉了一點。

我自己有時候搞不定,請求隔壁小夥伴的時候,他很聰明直接把電腦屏幕轉個90度,讓老師看到,感覺我就像是抄他的一樣,其實也確實是抄。

而有時候我解出來程序,他沒有做出來的時候,就參考我的內容完成,然後再举手讓老師看他解決了出來,我坐在裏面也沒有給老師反饋,老師可能也覺得我沒有做出來,就這樣過去了。

4.被辭退

兩個星期之後,老師宣布要從18個人裏面淘汰掉 2 個同事,其中就有我。

現在回想起來如果我是那位培訓的老師,我可能也會選擇淘汰掉當時的我,入職之後完全沒有轉變過來學生的身份,仍然像上大學一樣,坐在最後一排默默的干自己的事情。

現在反思當時的自己,應該有以下幾個問題:

  • ① 不积極不主動,這不是學校,這是人家給你錢上班,需要給公司解決問題的。

  • ② 缺乏即時反饋,當你的工作做完之後就應該需要讓你的領導知道。

  • ③ 工作狀態不對,沒有盡全力去學習工作,試用期正是考驗員工的時候呀。

  • ④ 技術能力不行,剛從培訓班出來技術很菜,自己卻不知道。

  • ⑤ 心態轉變太差,還是學生時代的心態,沒有融入到職場。

  • ⑥ 精神面貌不對,在職場不說穿得多好多正式,至少要精神一點,自己當時穿衣確實不像上班的。

基於以上各種我認為的原因,我被開除了!

那次培訓18個人,2個人被辭退,當我把這個信息告訴我姐的時候,我姐說關鍵人家就只淘汰了2個人,其中就有你,我無言以對。

5.又開始重新找工作

從培訓班畢業後身上就沒有多少錢了,入職第一家公司的時候,培訓班的幾個同學都說第一筆工資怎麼怎麼花,有的說要請一家人吃飯,有的說要給女朋友送個禮物,有的說要犒勞一下自己。

我當時什麼話也沒說,因為我的錢誰也給不了,我要留着吃飯交房租。

被辭退後,我就開始一個人在網上瘋狂的投起簡歷來,當時對 IT 行業理解也不深,並不知道什麼是互聯網公司,什麼是傳統軟件公司,什麼是外包公司,但凡只要招聘 Java 工程師的我都投遞了簡歷。

就這樣陸陸續續的收到了幾家公司的面試邀請,我這裏印象比較深刻的有三家公司,因為就這三家公司給了我 Offer。

第一家公司是個小老闆,給 2000 的工資但不給交社保,公司一共也就十幾個人,其中只有5、6個程序員,老闆本身也是程序員出身,主要業務是給別的公司做項目。

第二家公司是深圳易思博,當時華為、中興紛紛在西安創建了研發基地,國內比較著名的外包公司也都紛紛跟了過來,易思博也是當時的外包公司之一。

當時大部分外包都是人力外包,就是別的公司招聘你,你直接去甲方公司上班,但是是乙方公司給你發工資的,當時去華為做人力外包也是需要華為的人來面試的。

第三家公司是一家電信公司,具體是負責中國電信旗下的一個項目,面試官年紀比較大當時和我聊得很不錯,現在還記得他當時主要問我關於 IO 的幾個問題,有些沒有回答好,在他的提示下也都給出了答案。

在這家公司面試的時候非常舒服,就像和一位老大哥在探討技術一樣,就算回答不出來的問題,他也會幫忙給與解釋,讓我學習到了很多。

6.新的選擇

用了差不多兩周的時間,我又重新收穫了 3 份 Offer,其實畢業以來我的面試通過率一般都挺高的,我都覺得自己挺擅長面試的,工資從 1800-2100 差別不是很大。

當時給我姐打了很多電話,讓她幫忙給我參考,但她其實也不太懂這個行業,只是說應該大公司的更保險一點吧。

最終我糾結了3天,選擇了其中一家工資最高的公司,沒想到這又跳入了另外一個坑裡面。具體是掉進什麼樣的坑裡面,下篇再和大家細聊。

7.畢業生如何選擇 Offer

還是想和剛畢業的朋友聊兩句,第一份工作對我們的選擇來講很重要,很有可能決定了你未來職場的發展方向,所以職場選擇的時候我給大家提供幾個建議:

  • 第一:優先選擇大的互聯網公司,也就是我們所說的大廠,大廠有比較完整的培訓體系和成長環境,可以學到中國甚至世界級的系統設計;另外工作兩三年後有大廠經歷,再次出來面試會有加分。

  • 第二:選有潛力的獨角獸公司,比如當初的頭條或者美團都是非常好的選擇,這類公司的發展非常迅速,個人可以跟隨着公司的快速發展一起成長,早期還可以拿到比較多的期權,有可能選擇好一家公司就可以實現財富自由。

  • 第三:選擇傳統軟件公司,比如:神州數碼、中興、華為、用友軟件等公司,傳統軟件公司的技術棧往往相對保守,這是公司的產品性質決定,同時發展速度有限,這些年有些傳統軟件公司也迭代很快,這裏只說大部分傳統軟件公司。華為在這些傳統軟件公司中比較特殊一點,我有幾個朋友也在華為呆了很多年,華為確實給的錢很多,同時工作壓力也非常大,所以需要個人來結合自己情況來選擇。

  • 第四:謹慎選擇小的創業公司,創業公司的死亡率非常高,很多公司到後面都出現了拖欠工資等現象,公司情況完全依賴於老闆的情懷。

最後希望大家避免我的經歷,积極、認真、主動的對待人生第一份工作,迎接好走向社會的第一步,希望讀者們都能找到自己的理想生活。

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

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

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務

找尋霧霾源頭 南韓衛星「千里眼2B」成功進入預定軌道

摘錄自2020年3月8日自由時報報導

南韓政府今日(8日)表示,自製環境衛星「千里眼2B」(GEO-KOMPSAT-2B)於2月發射升空後,於本月6日成功進入預定的地球靜止軌道。

千里眼2B主要功用是在觀測東亞地區霧霾、赤潮等環境及海洋數據。2011年起由南韓航空宇宙研究院、南韓海洋科學技術院、南韓航太產業、BAE Systems、空中巴士等參與研發。

報導指出,千里眼2B將在4月起調整各項系統,如果順利,預計將在今年10月開始執行收集海洋資訊的任務,並於2021年起執行監測大氣環境的任務。千里眼2B可覆蓋從日本到印尼北部及蒙古南部的廣大地區,有望為東北亞空污源頭研究提供證據。

空氣污染
公害污染
國際新聞
南韓
霧霾
人造衛星

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

【其他文章推薦】

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

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務

北汽比亞迪東風將應用樂視車聯網系統ecolink

昨(16)日,樂視車聯與北汽新能源、比亞迪及東風風神三家車企簽訂了合作協定,三家車企都將在部分車型上配備樂視車聯網系統ecolink。

ecolink是樂視研發的車聯網系統,包括儀錶盤、汽車中控面板、後排娛樂系統等手機車機互聯設備,以及樂視提供的線上應用商店。

樂視車聯首席技術官饒宏表示,樂視的車聯網系統以乙太網為主要介面,同時支援iOS和android雙平臺的智慧手機接入。同時,該系統將使用語音辨識的方式進行操作,避免開車時操作手機帶來風險。

此次簽訂合作協定的三家車企中,北汽是最早開始與樂視合作的。2015年3月,北汽與樂視控股在香港正式簽訂戰略合作協定,2015年上海車展上 ,北汽展示了配備樂視車聯網系統的概念車。

比亞迪與樂視車聯同時簽訂的還有ecolink的合作落地協議,樂視車連戰略合作總監李聰表示,具體的合作內容將在4月份的北京車展有所展示。

當日與樂視簽訂合作協定的還有三家車載設備廠商,分別是航盛電子、華陽電子,以及德賽西威。

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

【其他文章推薦】

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

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務

019.Kubernetes二進制部署插件dashboard

一 修改配置文件

1.1 下載解壓

  1 [root@k8smaster01 ~]# cd /opt/k8s/work/kubernetes/
  2 [root@k8smaster01 kubernetes]# tar -xzvf kubernetes-src.tar.gz



提示:k8smaster01節點已解壓完畢,可直接修改配置。

1.2 修改配置

  1 [root@k8smaster01 ~]# cd /opt/k8s/work/kubernetes/cluster/addons/dashboard
  2 [root@k8smaster01 dashboard]# vi dashboard-service.yaml
  3 ……
  4   type: NodePort			#增加此行,使用node形式訪問
  5 ……
  6 #使用node方式訪問dashboard

1.3 修改為國內源


  1 [root@k8smaster01 dashboard]# vi dashboard-controller.yaml
  2 ……
  3         image: mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.1
  4 ……



提示:將yaml文件中的image字段修改為mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.1。

二 創建 dashboard

2.1 創建dashboard並檢查

  1 [root@k8smaster01 ~]# cd /opt/k8s/work/kubernetes/cluster/addons/dashboard
  2 [root@k8smaster01 dashboard]# kubectl apply -f .


2.2 查看分配的NodePort

  1 [root@k8smaster01 ~]# kubectl get deployment kubernetes-dashboard -n kube-system
  2 NAME                  READY    UP-TO-DATE    AVAILABLE    AGE
  3 kubernetes-dashboard  1/1      1             1            84s
  4 [root@k8smaster01 ~]# kubectl --namespace kube-system get pods -o wide
  5 [root@k8smaster01 ~]# kubectl get services kubernetes-dashboard -n kube-system





提示:k8smaster02 NodePort 31181 映射到 dashboard pod 443 端口。

2.3 查看dashboard參數

  1 [root@k8smaster01 ~]# kubectl exec --namespace kube-system -it kubernetes-dashboard-7848d45466-bgz94  -- /dashboard --help


提示:dashboard 的 –authentication-mode 支持 token、basic,默認為 token。如果使用 basic,則 kube-apiserver 必須配置 –authorization-mode=ABAC 和 –basic-auth-file 參數。

三 dashboard驗證方式


由於Kubernetes默認證書可能過期導致無法訪問dashboard,本實驗在已成功部署Kubernetes後手動重新創建證書。

3.1 創建證書

  1 [root@k8smaster01 ~]# cd /opt/k8s/work/
  2 [root@k8smaster01 work]# openssl genrsa -out dashboard.key 2048
  3 [root@k8smaster01 work]# openssl rsa -passin pass:x -in dashboard.key -out dashboard.key
  4 [root@k8smaster01 work]# openssl req -new -key dashboard.key -out dashboard.csr
  5 -----
  6 Country Name (2 letter code) [XX]:CN
  7 State or Province Name (full name) []:Shanghai
  8 Locality Name (eg, city) [Default City]:Shanghai
  9 Organization Name (eg, company) [Default Company Ltd]:k8s
 10 Organizational Unit Name (eg, section) []:System
 11 [root@k8smaster01 work]# openssl x509 -req -sha256 -days 365 -in dashboard.csr -signkey dashboard.key -out dashboard.crt
 12 [root@k8smaster01 work]# openssl x509  -noout -text -in ./dashboard.crt		#查看證書


3.2 分發證書

  1 [root@k8smaster01 ~]# cd /opt/k8s/work
  2 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
  3 [root@k8smaster01 work]# for all_ip in ${ALL_IPS[@]}
  4   do
  5     echo ">>> ${all_ip}"
  6     scp dashboard.* root@${all_ip}:/etc/kubernetes/cert
  7   done


3.3 修改默認證書配置

  1 [root@k8smaster01 work]# cd /opt/k8s/work/kubernetes/cluster/addons/dashboard
  2 [root@k8smaster01 dashboard]# kubectl delete -f .		#刪除使用默認證書所創建的dashboard
  3 [root@k8smaster01 dashboard]# ll /etc/kubernetes/cert/dashboard.*
  4 -rw-r--r-- 1 root root 1.2K Jun 28 18:06 /etc/kubernetes/cert/dashboard.crt
  5 -rw-r--r-- 1 root root  976 Jun 28 18:06 /etc/kubernetes/cert/dashboard.csr
  6 -rw-r--r-- 1 root root 1.7K Jun 28 18:06 /etc/kubernetes/cert/dashboard.key
  7 
  8 [root@master dashboard]# kubectl create secret generic kubernetes-dashboard-certs --from-file="/etc/kubernetes/cert/dashboard.crt,/etc/kubernetes/cert/dashboard.key" -n kube-system	#掛載新證書到dashboard
  9 [root@master dashboard]# kubectl get secret kubernetes-dashboard-certs -n kube-system -o yaml	#查看新證書


3.4 重新部署dashboard

  1 [root@k8smaster01 work]# cd /opt/k8s/work/kubernetes/cluster/addons/dashboard
  2 [root@master dashboard]# kubectl apply -f .
  3 [root@master dashboard]# kubectl get pods --namespace=kube-system | grep dashboard		#確認驗證


3.5 確認驗證

  1 [root@k8smaster01 ~]# kubectl get deployment kubernetes-dashboard -n kube-system
  2 [root@k8smaster01 ~]# kubectl --namespace kube-system get pods -o wide
  3 [root@k8smaster01 ~]# kubectl get services kubernetes-dashboard -n kube-system





提示:k8smaster03 NodePort 30938 映射到 dashboard pod 443 端口。

四 訪問dashboard

3.1 導入證書


將dashboard.crt導入IE瀏覽器,並設置為信任,導入操作略。

3.2 訪問方式


本實驗採用nodeip:nodepord方式訪問。

瀏覽器訪問:https://172.24.8.73:30938



提示:

更多dashboard訪問方式及認證可參考《附004.Kubernetes Dashboard簡介及使用》。

dashboard登錄整個流程可參考:https://www.cnadn.net/post/2613.htm

apiserver方式見3.4,Kubeconfig驗證方式見《附006.Kubernetes身份認證》中的3.5。

五 驗證方式

5.1 創建token

  1 [root@k8smaster01 ~]# kubectl create sa dashboard-admin -n kube-system
  2 [root@k8smaster01 ~]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
  3 [root@k8smaster01 ~]# ADMIN_SECRET=$(kubectl get secrets -n kube-system | grep dashboard-admin | awk '{print $1}')
  4 [root@k8smaster01 ~]# DASHBOARD_LOGIN_TOKEN=$(kubectl describe secret -n kube-system ${ADMIN_SECRET} | grep -E '^token' | awk '{print $2}')
  5 [root@k8smaster01 ~]# echo ${DASHBOARD_LOGIN_TOKEN}	#輸入登錄的token
  6 eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tdmc5bWgiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZTlkNGRjNGUtOTk3OC0xMWU5LTkzNTItMDAwYzI5ZmE3YTc5Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.X1NJsPNaAgV2TzJo0NlqOWFofDYOsSdkeiYHFGQFk5nNy0nbbnfnnoH0yumj_Ld0nGPakIjEpsUq9dqgCazeCpgk5EsygD6UlSg5sYA2sTLswbDoZdS3QzrOjY5MXWD3VDc_OQofD94MZqHMMw7IABVlfVsZ0vMEvHe-Qtyt6EQlFlHq5QjwDX8dCQDKRbwuiCr-Iy_dCWHHIhaT25BREf2viei8sZ497D8h4TXgO_u2CGf3qXRGNXj26VSdD8bT-BFGiDdyuXPbDHPU5LalvxF4WThChRfjO4zHLI2fOXq8BBF6DjbjhtG4X8fLuvJaxF4YWAmVS_78eJHhA3nvRg


3.4 創建kubeconfig文件


使用token相對複雜,可將token添加至kubeconfig文件中,使用KubeConfig 文件訪問dashboard。

  1 [root@k8smaster01 ~]# cd /opt/k8s/work/
  2 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
  3 [root@k8smaster01 work]# kubectl config set-cluster kubernetes \
  4   --certificate-authority=/etc/kubernetes/cert/ca.pem \
  5   --embed-certs=true \
  6   --server=${KUBE_APISERVER} \
  7   --kubeconfig=dashboard.kubeconfig		# 設置集群參數
  8 [root@k8smaster01 work]# kubectl config set-credentials dashboard_user \
  9   --token=${DASHBOARD_LOGIN_TOKEN} \
 10   --kubeconfig=dashboard.kubeconfig		# 設置客戶端認證參數,使用上面創建的 Token
 11 [root@k8smaster01 work]# kubectl config set-context default \
 12   --cluster=kubernetes \
 13   --user=dashboard_user \
 14   --kubeconfig=dashboard.kubeconfig		# 設置上下文參數
 15 [root@k8smaster01 work]# kubectl config use-context default --kubeconfig=dashboard.kubeconfig			# 設置默認上下文,將dashboard.kubeconfig文件導入,以便於瀏覽器使用該文件登錄。


六 正式登錄

6.1 kubeconfig訪問


瀏覽器訪問:https://172.24.8.73:30938








提示:由於缺少 Heapster 插件,當前 dashboard 不能展示 Pod、Nodes 的 CPU、內存等統計數據和圖表。本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

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

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務

蝗蟲大軍席捲而來!肯亞出動「超級電腦」滅蟲成效佳

摘錄自2020年3月11日民視報導

從年初以來,東非蝗蟲災害時不時就登上國際新聞版面,其中肯亞的蝗害程度更是70年來首見。肯亞科學家正與時間賽跑,利用超級電腦精確分析多種氣候因素,預測出10天後蝗蟲的動向。目前肯亞的蝗蟲數量明顯減少,不過新孵化的蝗蟲大軍又從索馬利亞前來,仍不能掉以輕心。

肯亞氣候科學家巴畢克提到,「近來我們開始用超級電腦預測,以追蹤沙漠蝗蟲的動態,沙漠蝗蟲是依氣候狀況移動的,所以我們以風速、風向、溫渡,土壤和大氣濕度等指標預測。」科學家將這一大串相關指標數據搭配衛星提供的資訊,例如植被覆蓋等,預測出10天後蝗蟲往哪兒飛。如此一來,可以早一步準備好對付蝗蟲。

巴畢克指出,「這項預測很有幫助,讓我們能把力氣集中在未來10天內最容易受蟲害影響的區域,如此一來能更有效率的分配資源、分配資金對抗沙漠蝗蟲,這是非常創新且新穎的方式,把科技用來解決像沙漠蝗蟲這類很現實的生活問題。」

受到氣候變遷的影響,東非雨季變長,而且極端氣候型頻繁出現,導致許久未見的蝗害捲土重來。不過超級電腦也有極限,科學家無法掌握10天後蝗蟲的動向,未來將設法加強電腦模型和解析度,做出更久的預測。

災害
土地水文
國際新聞
肯亞
蝗蟲災害
超級電腦

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

【其他文章推薦】

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

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務

Tesla Model 3 正式發表!售價3.5萬美元

幾年以來始終傳言不斷的特斯拉(Tesla)「親民平價」車款Tesla Model 3 終於正式發表了!作為特斯拉打進大眾市場的的第一部親民電動車款,Model 3 售價訂為3.5 萬美元(約新台幣114 萬元),預計在2017 年底前出貨。據特斯拉執行長馬斯克(Elon Musk)透露,Model 3 在發表前夕開放預購的24 小時內,就接到11.5 萬筆訂單,表現超乎預期。

在Model 3 的發表會上,馬斯克表示,Model 3 單次充電至少能跑215 英里(約346 公里),且6 秒內可加速至60 英里(約100 公里),就如同馬斯克所言,「我們不出產慢車」。與Model S 相同,Model 3 提供後輪驅動與四輪傳動兩種版本車型,而自動駕駛功能與自動開啟安全模式一樣是標準配備。

強調舒適性的Model 3,車內可容納5 個成人,其中最特別的是,Model 3 從擋風玻璃到接近車尾的後車廂區塊,全是由一大片玻璃覆蓋而成,只要一抬頭就能將天空景色盡收眼底。

此外,Model 3 與Model S 相同,既然不需要內部引擎驅動,自然空出了「前車廂」,同樣配備前、後車廂儲存空間,與一般汽油車外觀看似相同,但卻多了更多容納物品的空間,「甚至連一塊7 英呎(2.1 公尺)長的衝浪板都能放得下」。

特斯拉創立之初,便對外承諾要打造一台平價電動車款,而馬斯克更曾信誓旦旦的表示,要將電動車推向主流大眾市場,而在Model 3 之前,特斯拉的2 種車款Model S 與Model X 都價格不菲,要讓電動車更為普及,勢必得推出平易近人的車款才行。也因此,這次主打「親民平價」的Model 3,定價僅為3.5 萬美元,較7 萬美元起跳的Model S 及8 萬美元起跳的Model X 便宜許多。

Model 3 將在2017 年底前出貨,在發表會前夕就已開放預購,首批買主可享有預付1,000 美元的訂車優惠。馬斯克表示,發表會前夕已接到11.5 萬Model 3 的預購訂單。

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

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

【其他文章推薦】

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

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務

Algorithm: GCD、EXGCD、Inverse Element

數論基礎

數論是純數學的一個研究分支,主要研究整數的性質。初等數論包括整除理論、同余理論、連分數理論。這一篇主要記錄的是同余相關的基礎知識。

取模

取模是一種運算,本質就是帶余除法,運算結果就是餘數。取模運算結果的符號由被模數(被除數)決定。
\[ 7\%4=3;\space7\%(-4)=3;\\ (-7)\%4=-3;\space(-7)\%(-4)=-3 \]

取模運算的性質

\[ 設a>b>0,有:\\ (a+b)\%c=(a\%c+b\%c)\%c\\ (a-b)\%c=(a\%c-b\%c+c)\%c \\ (a\times b)\%c=(a\%c\times b\%c)\%c \]

例題1

\[ 給定兩個非負整數a,b和正整數n,計算f(a^b)\%n。\\ 其中,f(0)=f(1)=1,且對於\forall i>0,f(i+2)=f(i+1)+f(i)\\ (0\le a,b\le 2^{64},1\le n\le 1000) \]

找規律,對於mod n來說,最多n²項就會出現重複,找出重複項即可得到循環周期,然後找對應的項即可。

例題2:hdu 1212

題意是給一個位數不超過1,000的正整數A和一個大小不超過100,000的正整數B,求A%B。

這裏只需要用到上面的兩條性質,把A截斷,從高到低模擬做除法即可。

#include <iostream>
string s; int mod, ans;
int main() {
    while(std::cin >> str >> mod) {
        ans = 0;
        for(int i = 0; s[i]; i++) ans = (ans * 10 + (s[i] - '0')) % mod;
        std::cout << ans << std::endl;
    }
    return 0;
}

GCD

GCD即Greatest Common Divisor,最大公約數。最大公約數即能同時整除給定兩個整數的最大正整數。特殊地:gcd(a,0)=a。求解最大公約數通常使用輾轉相除法。下面是輾轉相除法的代碼實現:

typedef long long LL;
LL gcd(LL a, LL b) {
    return b ? gcd(b, a % b) : a;
}

輾轉相除法得到的餘數序列增長速度比斐波那契數列更快,已知斐波那契的增長是指數級別,則輾轉相除法的複雜度是對數級別。

輾轉相除法的證明:

1.設兩個數a、b(a>b),他們的最大公約數為gcd(a,b),r = a % b,k = (a – a % b)/ b,那麼證明輾轉相除法,即是要證明:gcd(a,b)=gcd(b,r)。首先我們令c = gcd(a,b),那麼肯定存在互質的整數m,n,使得a = mc,b = nc。那麼有r = a – kb = mc – knc = (m – kn)c,根據這條式子,c也是r的因數。回過頭看,如果能證明m-kn和n互質,那麼就可以說明c=gcd((m-kn)c,nc)=gcd(b,r),所以把問題再次轉化為:求證m-kn和n互質。

2.反證法證明m-kn和n互質:假設m-kn和n不互質,用數學語言描述為:假設存在整數x,y,d,其中d>1,使得m-kn=xd,n=yd。那麼有m=kn+xd=kyd+xd=(ky+x)d,從而a=mc=(ky+x)cd,b=nc=ycd,則gcd(a,b)=cd≠c,與前設矛盾。故m-kn和n互質得證,也就證明了gcd(a,b)=gcd(b,r)。

唯一分解定理

對於任意大於2的正整數X,它總能寫成如下形式:
\[ X=p_1^{a_1}\times p_2^{a_2} \times ……\times p_k^{a_k},其中p是各不相同的質數 \]
即質因數分解。且這個分解唯一。

LCM

LCM即Least Common Multiple,最小公倍數。

\[ \begin{align} &根據唯一分解定理,對於給定的a,b:\\ &a=p_1^{a_1}\times p_2^{a_2} \times……\times p_k^{a_k}\\ &b=p_1^{b_1}\times p_2^{b_2} \times……\times p_k^{b_k}\\ &那麼:\\ &gcd(a,b)=p_1^{min(a_1,b_1)}\times p_2^{min(a_2,b_2)}\times ……p_1^{min(a_k,b_k)}\\ &lcm(a,b)=p_1^{max(a_1,b_1)}\times p_2^{max(a_2,b_2)}\times ……p_1^{max(a_k,b_k)}\\ &因此,gcd(a,b)\times lcm(a,b)=a\times b \end{align} \]

LL lcm(LL a, LL b) {
    return a / gcd(a, b) * b;
}

例題:hdu1788

題意是求最小的正整數N,滿足除以每一個給定的數Mi,其結果均為Mi-a。作如下轉化:
\[ N\%M_i\equiv(M_i-a)\%M_i\Rightarrow (N+a)\%M_i=0(a<M_i<100) \]
即N是Mi的倍數,那麼題意也就是求所有M的最小公倍數,注意数字範圍即可。

同余

對於兩個不同的數a,b,如果有a % p = b % p(p>1),那我們就稱a和b模p同余,記作:
\[ a\equiv b(mod\space p) \]

同余的性質

\[ \begin{aligned} &1.自反性:a\equiv a(mod\space m)\\ &2.對稱性:a\equiv b(mod\space m),則b\equiv a(mod\space m)\\ &3.傳遞性:若a\equiv b(mod\space m),b\equiv c(mod\space m),則a\equiv c(mod\space m)\\ &4.線性運算:若a\equiv b(mod\space m),c\equiv d(mod\space m)\\ &\space\space\space則:a\pm c\equiv b\pm d(mod\space m);\space a\times c\equiv b\times d(mod\space m)\\ &5.冪運算:若a\equiv b(mod\space m),那麼a^n\equiv b^n(mod\space m)\\ &6.若ac\equiv bc(mod\space m),且c≠0,那麼a\equiv b(mod\space {m\over gcd(c,m)})\\ &\space\space\space特殊地,若gcd(c,m)=1,則a\equiv b(mod\space m) \end{aligned} \]

EXGCD

貝祖定理(Bezouts Identity):若設a,b是不全為0的整數,則存在整數x,y,使得ax+by=gcd(a,b),(a,b)代表最大公因數,則設a,b是不全為零的整數,則肯定存在整數x,y,使得ax+by=(a,b)。這個式子稱為貝祖等式。

EXtend GCD 即擴展歐幾里得算法,它可以用於解關於x,y的貝祖等式。

EXGCD的可行性

當a=0時,ax+by=gcd(a,b)=gcd(0,b)=b,這時可以解出y=1而x為任意。同理可得b=0時,解得x=1而y為任意。當a,b都不為0時:
\[ \begin{aligned} &設存在一組解為x_1,y_1,即ax_1+by_1=gcd(a,b)\\ &由歐幾里得定理:gcd(a,b)=gcd(b,a\%b)得:\\ &ax_1+by_1=gcd(a,b)=gcd(b,a\%b)\\ &那麼,bx_2+(a\%b)y_2=gcd(b,a\%b)=ax_1+by_1\\ &又a\%b=a-a/b\times b\\ &\begin {align} 那麼,&ax_1+by_1\\ =&bx_2+(a-a/b\times b)y_2\\ =&bx_2+ay_2-a/b*b*y_2\\ =&ay_2+b(x_2-a/b*y_2) \end{align}\\ &故可以得到:x_1=y_2,\space y_1=x_2-a/b*y_2 \end{aligned} \]
a或b為0即迭代求解的出口,迭代過程用代碼錶示如下:

typedef long long LL;
// ver 1
// 返回值為gcd(a,b),x和y即求出的特解
LL exgcd(LL a, LL b, LL &x, LL &y) {
    if (b == 0) {
        x = 1; y = 0;
        return a;
    }
    LL ans = exgcd(b, a % b, x, y);
    //這裏通過迭代求出了一組解x,y,這組解對應上面推導過程中的x2和y2。
    LL temp = x;
    x = y;
    y = temp - a / b * y;
    return ans;
}

// ver 2
// 在熟悉了推導過程之後,我們可以利用引用的性質得到更為簡潔的ver2寫法
LL exgcd(LL a, LL b, LL &x, LL &y) {
    if (b == 0) {
        x = 1; y = 0;
        return a;
    }
    LL ans = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return ans;
}

EXGCD的應用

求關於x,y的方程ax+by=c的一組解

這裏只需要對貝祖等式稍作變換即可。假設EXGCD求出的方程ax+by=gcd(a,b)的一組解為x1和y1。在方程兩邊同時乘上一個數m,使得c=m*gcd(a,b),這裏也就要求c是gcd(a,b)的倍數,即c%gcd(a,b)=0。這也是方程有解的條件。此時方程為:
\[ \begin{align} &ax_1\times m+by_1\times m=gcd(a,b)\times m=c \end{align} \]
對於ax+by=gcd(a,b),其參數解為:
\[ \begin{align} &x=x_1+{b\over gcd(a,b)}\times t,y=y_1-{a\over gcd(a,b)}\times t,t為參數\\ &這裏選用{b\over gcd(a,b)}和{a\over gcd(a,b)}是為了保證結果均為整數 \end{align} \]
那麼對比方程ax+by=c,可以得到其特解為:
\[ \begin{align} &x_0=x_1\times m=x_1\times {c\over gcd(a,b)}\\ &y_0=y_1\times m=y_1\times {c\over gcd(a,b)} \end{align} \]
那麼其通解為:
\[ \begin{align} &X=x_0+{b\over gcd(a,b)}\times t,Y=y_0-{a\over gcd(a,b)}\times t,t為參數\\ &這裏選用{b\over gcd(a,b)}和{a\over gcd(a,b)}作為係數是為了確保得到均為整數解。 \end{align} \]
對於任意一個確定的t,都有一組確定的解與之對應,只需要根據需要找出對應的解即可。

例如求滿足ax+by=c的X的最小非負整數解,那麼在得到X的通解之後只需調整t,調整過程用偽代碼錶示為:

S = b / gcd(a, b);
X = (x0 % S + S) % S;
// 由於x0可能是負數,故在模之後還要加上S在取一次模。
// 同理可得Y的最小非負整數解
T = a / gcd(a, b);
Y = (y0 % T + T) % T;

完整的exgcd求解方程ax+by=c的X和Y的最小非負整數解得代碼如下:

LL exgcd(LL a, LL b, LL c, LL& x, LL& y) {
    if (b == 0) {
        x = 1; y = 0;
        return a;
    }
    LL ans = exgcd(a, b, c, y, x);
    y -= a / b * x;
    LL S = b / ans, T = a / ans;
    x = (x % S + S) % S;
    y = (y % T + T) % T;
    return ans;
}

求關於x的方程ax≡b(mod m)的最小非負整數解

ax≡b(mod m)即ax%m=b%m,即求ax+my=b%m(取模其實就相當於減去(加上)了若干個模數)。但只有a和m互質時有唯一解,否則無解。轉化為ax+my=b(假設b<m)后,套用exgcd即可。

求a關於模數p的乘法逆元

設x是a關於p的乘法逆元,那麼有ax≡1(mod p),這是第二個應用的特殊情況,顯然也可以通過類似方法求得。

逆元

Inverse Element,逆元,推廣了加法中的加法逆元和乘法中的倒數。直觀地說,它是一個可以取消另一給定元素運算的元素。a關於模p的逆元存在的條件是gcd(a,p)=1。
\[ \begin{align} &在模p意義下,設A的逆元為A^{-1},那麼有A\times A^{-1}\equiv 1(mod\space p) \end{align} \]
為什麼需要逆元呢?
\[ \begin{align} &在模意義下,{A\over B}\%p = {A\%p\over B\%p}\%p並不成立,\\ &那麼設B在模p意義下的逆元表示為B^{-1},根據逆元的定義,有{A\over B}=A\times B^{-1}(mod \space p)。 \end{align} \]
這裏,我們把除法轉化為乘法,就可以運用取模運算的性質:(a * b) % c = (a % c * b % c) % c,優化算法。

逆元的求法

EXGCD求法

給定模數m,求a的逆元相當於求解關於x的方程ax≡1(mod m)。這個方程可以轉化為ax-my=1 。用EXGCD可以求得一組x,y和gcd。檢查gcd是否為1(因為EXGCD是把問題轉化為求解方程ax-my=gcd(a,m),顯然只有gcd(a,m)=1時才能轉化),gcd不為1則說明逆元不存在。在能夠成功求解的情況下,把解調整x到0~m-1的範圍中即可。

費馬小定理

在模p為質數的情況下,有費馬小定理:
\[ a^{p-1}\equiv 1(mod\space p) \]
那麼:
\[ a\times a^{p-2}\equiv 1(mod\space p)\\ 故a的逆元a^{-1}=a^{p-2} \]
然後用快速冪求出逆元即可。

拓展:快速冪

// a是底數,b是指數
LL pow(LL a, LL b, LL mod) {
    LL ans = 1;
    while(b) {
        if(b&1) ans = ans * a % mod;
        b >>= 1, a = a * a % mod;
    }
    return ans;
}

拓展:慢速乘,防止快速冪過程中乘法運算爆long long,只需把快速冪中的乘法替換為mul()即可,一般情況用不上。

// a為因數1,b為因數2
LL mul(LL a, LL b, LL mod) {
    LL ans = 0;
    while(b) {
        if(b&1) ans = (ans + a) % mod;
        b >>= 1, a = (a + a) % mod;
    }
    return ans;
}

歐拉定理

費馬小定理其實是歐拉定理的特殊情況。在模數p不為質數時,有:
\[ a^{\phi(p)}\equiv 1(其中\phi()是歐拉函數) \]
同理可以得到:
\[ a^{-1}\equiv a^{\phi(p)-1} \]

線性逆元表

有時我們需要快速得出1~p-1的所有逆元,這個時候我們需要一種O(n)的方法,這就是線性逆元表。

首先,1關於任意模p的逆元的逆元都是1。設p = k * i + r(r < i ,1 < i < p),那麼有:
\[ k\times i + r \equiv0(mod\space p) \]
利用逆元性質,兩邊同時乘上i的逆元以及r的逆元,得到:
\[ k\times r^{-1}+i^{-1}\equiv 0(mod\space p) \]
移項得:
\[ i^{-1}\equiv-k \times r^{-1}\equiv -⌊{p\over i}⌋\times (p\%i)^{-1}(mod\space p) \]
顯然p%i是小於i的,那麼我們就可以利用之前的結果在O(1)時間算出單獨的逆元。

用代碼錶示即:

// inv[i]對應i的逆元
LL inv[maxn];
void CalInv() {
    // 0沒有逆元,故不初始化
    inv[1] = 1;
    for (int i = 2; i < maxn; i++)
        inv[i] = (mod - mod / i) * inv[mod % i] % mod;
}

利用
\[ (a\times c)\% mod = (a\%mod\times c\%mod)\%mod;\\ 由a\times a^{-1}\equiv1(mod \space p)得,\\ inv_{fac(i)}\equiv inv_{fac(i)}\times (i+1)^{-1}\times (i+1)\equiv inv_{fac(i+1)}\times (i+1)(mod\space p) \]
我們還可以在線性時間求出1~min(n,p)的階乘的逆元,代碼如下:

LL fac[maxn], inv[maxn];
void CalFacInv() {
    // 0的階乘是1
    fac[0] = fac[1] = 1;
    for (int i = 2; i < maxn; i++)
        fac[i] = fac[i - 1] * i % mod;
    inv[maxn - 1] = QPow(fac[maxn - 1], mod - 2);
    // 注意邊界是≥
    for (int i = maxn - 2; i >= 0; i--)
        inv[i] = inv[i + 1] * (i + 1) % mod;
}

例題:hdu1576

題意即把除法轉化為逆元乘法。3種方法的代碼:

#include<iostream>
#include<algorithm>
using namespace std;

typedef long long LL;
LL n, B;
const LL mod = 9973;

LL exgcd(LL a, LL b, LL &x, LL &y) {
    if (b == 0) {
        x = 1, y = 0;
        return a;
    }
    LL ans = exgcd(b, a % b, y, x);
    y -= a/b*x;
    return ans;
}

LL QPow(LL x, LL n)
{
    LL res = 1;
    while(n)
    {
        if(n & 1) res = res * x % mod;
        x = x * x % mod;
        n >>= 1;
    }
    return res;
}

LL inv[10000];
void CalInv() {
    inv[1] = 1;
    for (LL i = 2; i < 10000; i++) {
        inv[i] = (mod * mod - mod / i * inv[mod % i]) % mod;
    }
}


int main() {
    CalInv();
    int t;
    cin >> t;
    while (t--) {
        cin >> n >> B;
        // exgcd
        // LL x, y;
        // exgcd(B, mod, x, y);
        // cout << (x + mod) * n % mod << endl;
        
        // QPow
        // cout << QPow(B, mod - 2) * n % mod << endl;
        
        // 逆元打表
        cout << inv[B % mod] * n % mod << endl;
    }
    return 0;
}

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

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

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務

科學家警告 武漢肺炎只是開端 更多新興傳染病將因環境破壞而起

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

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

【其他文章推薦】

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

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務

大眾汽車尾氣門賠償方案出爐

據外媒報導,大眾汽車集團將準備至少100億美元,應對“尾氣門”醜聞導致的賠償。按照美國聯邦法官設定的最後期限,大眾日前簽訂框架協定,將回購50多萬輛作弊柴油車,並將向車主支付賠償金。

大眾這次將賠上百億美元

據知情人士披露,大眾汽車集團此次還同意安排至少100億美元預算,用於支付美國政府的美國民事訴訟罰款和美國車主的索賠。

此外,大眾回購的車輛將包括自2009年起售的捷達轎車、高爾夫緊湊車及奧迪A3,這些車輛均搭載2.0升EA189柴油發動機。不過,包括奧迪和保時捷SUV在內的另外8萬輛搭載3.0升柴油發動機的車輛則不在回購範圍之內,這些車輛同樣採用了作弊軟體,使得測試結果好於實際情況。

關於本次大眾如何賠償,來自路透社的消息稱,目前在個人賠償方面,大眾還未做出任何決定。而德國《世界報》(Die Welt)4月20日則報導稱,大眾“尾氣門”解決方案中將包括支付相關車主每人5,000美元,涉及58萬輛車,但不包括升級軟體的費用。

損失總金額到底是多少?

大眾汽車將總共為尾氣門醜聞蒙受多少經濟損失?迄今尚無準確說法。起初在去年9月尾氣門曝光甫始,大眾被指將被美國當局罰款180多億美元,創汽車行業最大罰單。

之後大眾宣佈,在2015年第三季度安排67億歐元(約合76億美元)用於修復相關車輛和賠償。不過由於在全球範圍內涉及超過1,100萬輛車,之後又多次曝光更多車輛涉及排放測試舞弊,業界對大眾經濟損失總額的估計值也隨之膨脹。部分機構甚至認為大眾可能最終損失900億美元之巨。

不過實際情況可能沒有極端說法那樣令人震驚。從理論上說,大眾蒙受的民事賠償可能超過420億美元,但現實中卻並未達到該數字。彭博社分析師Brandon Barnes估算,大眾回購在美國所有舞弊車輛將耗費94億美元。

Evercore ISI機構最新估算數字顯示,大眾可能最終為尾氣門埋單大約300億歐元。

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

【其他文章推薦】

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

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務

Appium+python自動化(四十一)-Appium自動化測試框架綜合實踐 – 即將落下帷幕(超詳解)

1.簡介

  今天我們緊接着上一篇繼續分享Appium自動化測試框架綜合實踐 – 代碼實現。到今天為止,大功即將告成;框架所需要的代碼實現都基本完成。

2.data數據封裝

2.1使用背景

在實際項目過程中,我們的數據可能是存儲在一個數據文件中,如txt,excel、csv文件類型。我們可以封裝一些方法來讀取文件中的數據來實現數據驅動。

2.2案例

將測試賬號存儲在account.csv文件,內容如下:

account.csv

hg2018

hg2018

hg2019

zxw2019

666

222

參考代碼

2.3enumerate()簡介

enumerate()是python的內置函數

  • enumerate在字典上是枚舉、列舉的意思
  • 對於一個可迭代的(iterable)/可遍歷的對象(如列表、字符串),enumerate將其組成一個索引序列,利用它可以同時獲得索引和值
  • enumerate多用於在for循環中得到計數。

2.4enumerate()使用

如果對一個列表,既要遍歷索引又要遍曆元素時,首先可以這樣寫:

參考代碼
list = ["", "", "一個", "測試","數據"]

for i in range(len(list)):

    print(i,list[i])

上述方法有些累贅,利用enumerate()會更加直接和優美:

參考代碼
list1 = ["", "", "一個", "測試","數據"]

for index, item in enumerate(list1):

        print(index,item)

3.數據讀取方法封裝

  數據讀取方法也屬於公共方法,這裏我們首先實現一下,然後將其封裝到裡邊即可。

3.1數據讀取方法實現的參考代碼

import csv


     def get_csv_data(csv_file,line):

        with open(csv_file, 'r', encoding='utf-8-sig') as file:

            reader=csv.reader(file)

            for index, row in enumerate(reader,1):

                if index == line:

                    return row

 

    csv_file='../data/account.csv'

    data=get_csv_data(csv_file,3)

    print(data)

3.2封裝

將其封裝在公共方法中,在其他地方用到的時候,直接導入調用即可。

4.utf-8與utf-8-sig兩種編碼格式的區別

UTF-8以字節為編碼單元,它的字節順序在所有系統中都是一樣的,沒有字節序的問題,也因此它實際上並不需要BOM(“ByteOrder Mark”)。但是UTF-8 with BOM即utf-8-sig需要提供BOM。

5.config文件配置

各種配置文件都放在這個目錄下。

5.1日誌文件配置 

主要是一些日誌信息的配置。

log.config

 參考代碼
[loggers]
keys=root,infoLogger

[logger_root]
level=DEBUG
handlers=consoleHandler,fileHandler

[logger_infoLogger]
handlers=consoleHandler,fileHandler
qualname=infoLogger
propagate=0

[handlers]
keys=consoleHandler,fileHandler

[handler_consoleHandler]
class=StreamHandler
level=INFO
formatter=form02
args=(sys.stdout,)

[handler_fileHandler]
class=FileHandler
level=INFO
formatter=form01
args=('../logs/runlog.log', 'a')

[formatters]
keys=form01,form02

[formatter_form01]
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s

[formatter_form02]
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s

6.測試用例封裝

這裏宏哥舉例給小夥伴們演示:封裝註冊和登錄兩個測試用例。

6.1測試用例執行開始結束操作封裝

測試用例執行開始和結束的封裝,其他模塊用到直接導入,調用即可。

myunit.py

參考代碼
# coding=utf-8
# 1.先設置編碼,utf-8可支持中英文,如上,一般放在第一行

# 2.註釋:包括記錄創建時間,創建人,項目名稱。
'''
Created on 2019-11-20
@author: 北京-宏哥   QQ交流群:707699217
Project:Appium自動化測試框架綜合實踐 - 代碼實現
'''
# 3.導入模塊
import unittest
from kyb_testProject.common.desired_caps import appium_desired
import logging
from time import sleep

class StartEnd(unittest.TestCase):
    def setUp(self):
        logging.info('=====setUp====')
        self.driver=appium_desired()

    def tearDown(self):
        logging.info('====tearDown====')
        sleep(5)
        self.driver.close_app()

6.2註冊用例

開始註冊用例代碼邏輯的實現。

test_register.py

參考代碼
# coding=utf-8
# 1.先設置編碼,utf-8可支持中英文,如上,一般放在第一行

# 2.註釋:包括記錄創建時間,創建人,項目名稱。
'''
Created on 2019-11-20
@author: 北京-宏哥   QQ交流群:707699217
Project:Appium自動化測試框架綜合實踐 - 代碼實現
'''
# 3.導入模塊
from kyb_testProject.common.myunit import StartEnd
from kyb_testProject.businessView.registerView import RegisterView
import logging,random,unittest

class RegisterTest(StartEnd):
    def test_user_register(self):
        logging.info('======test_user_register======')
        r=RegisterView(self.driver)

        username = 'bjhg2019' + 'fly' + str(random.randint(1000, 9000))
        password = 'bjhg2020' + str(random.randint(1000, 9000))
        email = 'bjhg' + str(random.randint(1000, 9000)) + '@163.com'

        self.assertTrue(r.register_action(username,password,email))

if __name__ == '__main__':
    unittest.main()

6.3登錄用例

開始登錄用例代碼邏輯的實現。

test_login.py

參考代碼
# coding=utf-8
# 1.先設置編碼,utf-8可支持中英文,如上,一般放在第一行

# 2.註釋:包括記錄創建時間,創建人,項目名稱。
'''
Created on 2019-11-13
@author: 北京-宏哥   QQ交流群:707699217
Project:Appium自動化測試框架綜合實踐 - 代碼實現
'''
# 3.導入模塊
from kyb_testProject.common.myunit import StartEnd
from kyb_testProject.businessView.loginView import LoginView
import unittest
import logging

class TestLogin(StartEnd):
    csv_file='../data/account.csv'

    @unittest.skip('test_login_zxw2018')
    def test_login_zxw2018(self):
        logging.info('======test_login_zxw2018=====')
        l=LoginView(self.driver)
        data=l.get_csv_data(self.csv_file,2)

        l.login_action(data[0],data[1])
        self.assertTrue(l.check_loginStatus())

    # @unittest.skip('skip test_login_zxw2017')
    def test_login_zxw2017(self):
        logging.info('======test_login_zxw2017=====')
        l=LoginView(self.driver)
        data = l.get_csv_data(self.csv_file, 1)

        l.login_action(data[0], data[1])
        self.assertTrue(l.check_loginStatus())

    @unittest.skip('test_login_error')
    def test_login_error(self):
        logging.info('======test_login_error=====')
        l = LoginView(self.driver)
        data = l.get_csv_data(self.csv_file, 3)

        l.login_action(data[0], data[1])
        self.assertTrue(l.check_loginStatus(),msg='login fail!')

if __name__ == '__main__':
    unittest.main()

7.小結

到此,Appium自動化測試框架就差下一篇就全部完成了,聰明的你都懂了嗎???嘿嘿!慢慢地來吧。

下節預告

下一篇,講解執行測試用例,生成測試報告,以及自動化平台,請關注宏哥,敬請期待!!!

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

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

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務