分類
發燒車訊

Ansibile之playbook初識

  一、playbook簡介

  ansiblie的任務配置文件被稱為playbook,俗稱“劇本”,每一個劇本(playbook)中都包含了一系列的任務,這每個任務在ansible中又被稱為“戲劇”(play),一個劇本中包含多齣戲劇。。

  前文我們了解了ansible有兩種執行方式ad-hoc和ansible-playbook,ad-hoc主要用於臨時命令的執行,而playbook我們可以理解為ad-hoc的集合,有點類似shell腳本,ad-hoc就相當於shell腳本里的某條任務語句,playbook就相當於整個shell腳本。playbook是由一個或多個“play”組成的列表,play的主要功能在於將預定義的一組主機,裝扮成事先通過ansible中的task定義好的角色。task實際是調用ansible的一個模塊,將多個play組織在一個playbook中,即可以讓他們聯合起來,按事先編排的機制執行預定義的動作。

 如以上圖示,用戶可以把多條任務(ad-hoc任務)寫到playbook中,用戶用ansible-playbook命令調用執行編排好的playbook,ansible會讀取playbook中的每一條play和task,並按照playbook中的順序從上至下依次執行,ansible會調用每個task中定義的模塊去依次執行相應的任務,並按照playbook中指定的主機去主機清單里匹配對應的主機,然後通過ssh認證,把編譯好的相應的任務文件發送到對應的主機或網絡設備上執行,最後返回執行的狀態。

  二、YAML簡介

  playbook採用yaml語言編寫,yaml是一個可讀性高的用來表達資料序列格式的語言,它參考了其他很多種語言,包括:XML、C語言、python、perl以及电子郵箱格式RFC2822等。Clark Evans在2001年首次發表了這種語言,另外Ingy döt Net與Oren Ben-Kiki也是這語言的共同設計者。YAML( YAML Ain’t Markup Language),即yaml不是標記語言。不過在開發這種語言時,yaml的意思其實是:”Yet Another Markup Language”(仍是一種標記語言)

  ymal特性

  1)YAML的可讀性好

  2)YAML和腳本語言的交互性好

  3)YAML使用實現語言的數據類型

  4)YAML有一個一致的信息模板

  5)YAML易於實現,可以基於流程處理,表達能力強,擴展性好

更多的內容及規範請參考官方文檔

  三、playbook語法簡介

  1)需要以“—”(3個減號)開始,且需頂行首寫。另外還有選擇性的連續三個點號(…)用來表示文件的結尾。

  2)次行開始正常寫playbook的內容,建議次行寫該playbook的功能,當然不寫也是可以的。

  3)使用“#”號註釋代碼。

  4)縮進必須統一,不能空格tab混用。

  5)縮進的級別必須是一致的,同樣的縮進代表同樣級別,程序判別配置的級別是通過縮進結合換行來實現的。

  6)YAML文件內容和Linux系統大小寫判斷方式一直,區分大小寫(大小寫敏感),k/v的值均大小寫敏感。

  7)k/v的值可同行寫也可換行寫。同行使用“:”分隔,換行寫需要以“-”分隔。

  8)v可以是字符串,也可以另外一個列表,當然也可以是字典。

  9)一個完整的代碼塊功能最少需要有name:xxx(對任務的描述)。

  10)一個name只能包括一個task

  11)yaml文件擴展名通常為yml或yaml

list:列表,其所有元素均使用“-”開頭

示例:

---
# A list of tasty fruits

- apple
- orange
- strawberry
- mango
~           

dictionary:字典,通常由多個key與value構成

示例:

---
#An employee record
name: example developer
job: developer
skill: elite  

當然也可以將key:value放置於{}中進行表示,用“,”分隔多個key:value

示例:

---
#An employee record
{name: example developer,job: developer, skill: elite}
~                                                         

  YAML的語法和其他高階語言類似,並且可以簡單表達清單、散列表、標量等數據結構。其結構(Structure)通過空格來展示,序列(Sequence)里的項用”-“來代表,Map里的鍵值對用”:”分隔。

示例:

---
name: John Smith
age: 41
gender: Male
spouse:
  name: Jane Smith
  age: 37
  gender: Female
children:
  - name: Jimmy Smith
    age: 17
    gender: Male
  - name: Jenny Smith
    age: 13
    gender: Female
~                    

  四、playbook核心元素

  1)hosts  :指定執行任務的遠程主機列表(主機清單定義的主機組或單個主機,支持前面的說的主機模式匹配)

  2)tasks  :任務集

  3)varniables  :內置變量或自定義變量在playbook中調用

  4)templates  :模板,可替換模板文件中的變量並實現一些簡單邏輯的文件

  5)handlers  和  notity結合使用,由特定條件出發的操作,滿足條件方才執行,否則不執行

  6)tags標籤  :給指定的任務貼上標籤,我們在執行playbook的時候可以根據標籤選擇性的挑選部分代碼執行,如 ansible-playbook -t tagsname useradd.yml  ,這條命令的意思就是在useradd.yml中挑選標籤名為tagsname的任務執行

   五、playbook基礎組件

  1)hosts:

    playbook中的每一個play的目的都是為了讓特定主機以某個指定的用戶身份執行任務。hosts用於指定要執行任務的主機,須事先定義在主機清單中。hosts指定主機的形式同樣支持像主機清單中定義的那樣,支持通配,支持主機模式匹配與或非,支持IP地址,當然也支持混合匹配與或非。

示例:在websers組,但不再dbsers組,可以這樣定義hosts

---
- hosts: websers:!dbsers

  2)remote_user:可用於host和task中,也可以通過指定其通過sudo的方式在遠程執行任務,其可用於play全局或某個任務;此外,甚至可以在sudo時使用用sudo_user指定sudo時切換的用戶,如下所示

---
- hosts: websers:!dbsers
  remote_user: root

  tasks:
    - name: test connection
      ping:
      remote_user: qiuhom
      sudo: yes
      sudo_user: qiuping

  說明:默認sudo 為root,上例指定了sudo_user 為qiuping,上述任務同sudo -u qiuping ping xxxx(代表某主機)命令一樣的意思,當然在使用sudo 時 我們還需要在目標主機上對qiuhom授權,要讓qiuhom這個用戶具有代表qiuping的權限去執行ping命令。

  3)task列表和action:play的主體部分是task list,task list 中的各任務按次序逐個在hosts中指定的所有主機上執行,即在所有主機上完成第一個任務后,再開始第二個任務;task的目的是使用指定的參數執行模塊,而在模塊參數中可以使用變量,模塊執行時是冪等的,這意味着多次執行時是安全的,其結果均一致;每個task都應該有其name,用於playbook的執行結果輸出,建議其內容能清晰地描述任務步驟,如未提供name,則action的結果將用於輸出。

  tasks:任務列表,它有兩種格式如下

    (1)action: module arguments

    (2)module: arguments        ##建議使用

   注意:shell模塊和command模塊後面跟的是命令,而非key=value

如果某項任務的狀態在運行後為changed時,可通過“notify”通知給相應的handlers;當然任務可以通過“tags”打標籤,可以在ansible-playbook命令上使用-t指定進行指定其標籤名調用。

示例:

[qiuhom@test ~]$cat test.yml 
---
- hosts: websers:!dbsers
  remote_user: root

  tasks:
    - name: test connection
      ping:
      remote_user: qiuhom
      sudo: yes
      sudo_user: qiuping 
      tags: test
    - name: test command
      shell: /bin/ls /home/qiuhom/
[qiuhom@test ~]$ansible-playbook -t test test.yml 

  說明:用-t 指定標籤名,表示只運行所指定標籤所在的任務,當然同名的標籤可以在多條任務中,一個任務也可以有多個標籤。

如果命令或腳本的退出碼不為零,可用使用如下方式忽略或跳過繼續執行以下代碼

---
- hosts: websers:!dbsers
  remote_user: root

  tasks:
    - name: run this command and ignore the result
      shell: /usr/sbin/ip addr show eth0 || /bin/true
    - name: run this command and ignore the result
      shell: /usr/sbin/ip addr show eth0
      ignore_errors: True

  說明:兩種方式都可以跳過出錯的命令而不打斷playbook,繼續執行以下的代碼,前者使用的短路或的特性,後者使用ignore_errors參數來控制

  六、playbook運行的方式

ansible-playbook <filename.yml> ... [options]

常用選項:

  -C , –check  : 只檢查可能會發生的改變,但不真正執行操作,相當於空跑一遍playbook,測試下是否和自己預想的結果一樣,但它不會真正的去遠端主機上執行。常用於測試寫的playbook語法是否有誤。

  –list-hosts  :列出playbook指定運行任務所匹配的主機

  –list-tags    :列出playbook中所有標籤名稱列表

  –list-tasks  :列出playbook中所有任務名稱及標籤名稱

  –limit 主機列表   :只針對指定主機列表中的主機執行當前playbook(指定主機列表必須是在playbook里定義的主機列表範圍內)

  -v,-vv,-vvv       :  显示執行playbook的過程,-v,显示較簡單,-vv显示較詳細,-vvv显示整個過程(非常詳細)

[root@test ~]#cat test.yml 
---
- hosts: websers
  remote_user: root

  tasks:
    - name: run this command 
      shell: hostname
      tags: hostname
      ignore_errors: True
    - name: show ip addr
      shell: /sbin/ip addr show
      tags: showip
[root@test ~]#ansible-playbook test.yml --list-hosts

playbook: test.yml

  play #1 (websers): websers    TAGS: []
    pattern: [u'websers']
    hosts (2):
      192.168.0.128
      192.168.0.218
[root@test ~]#ansible-playbook test.yml --list-tags

playbook: test.yml

  play #1 (websers): websers    TAGS: []
      TASK TAGS: [hostname, showip]
[root@test ~]#ansible-playbook test.yml --list-tasks

playbook: test.yml

  play #1 (websers): websers    TAGS: []
    tasks:
      run this command  TAGS: [hostname]
      show ip addr      TAGS: [showip]
[root@test ~]#ansible-playbook test.yml --limit 192.168.0.218

PLAY [websers] ********************************************************************************************************

TASK [Gathering Facts] ************************************************************************************************
ok: [192.168.0.218]

TASK [run this command] ***********************************************************************************************
changed: [192.168.0.218]

TASK [show ip addr] ***************************************************************************************************
changed: [192.168.0.218]

PLAY RECAP ************************************************************************************************************
192.168.0.218              : ok=3    changed=2    unreachable=0    failed=0   

[root@test ~]#ansible-playbook test.yml --limit 192.168.0.218 -v
Using /etc/ansible/ansible.cfg as config file

PLAY [websers] ********************************************************************************************************

TASK [Gathering Facts] ************************************************************************************************
ok: [192.168.0.218]

TASK [run this command] ***********************************************************************************************
changed: [192.168.0.218] => {"changed": true, "cmd": "hostname", "delta": "0:00:00.002139", "end": "2019-11-16 23:11:02.996962", "rc": 0, "start": "2019-11-16 23:11:02.994823", "stderr": "", "stderr_lines": [], "stdout": "localhost.localdomain", "stdout_lines": ["localhost.localdomain"]}

TASK [show ip addr] ***************************************************************************************************
changed: [192.168.0.218] => {"changed": true, "cmd": "/sbin/ip addr show", "delta": "0:00:00.002604", "end": "2019-11-16 23:11:03.733004", "rc": 0, "start": "2019-11-16 23:11:03.730400", "stderr": "", "stderr_lines": [], "stdout": "1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN \n    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00\n    inet 127.0.0.1/8 scope host lo\n    inet6 ::1/128 scope host \n       valid_lft forever preferred_lft forever\n2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000\n    link/ether 00:0c:29:e8:f6:7b brd ff:ff:ff:ff:ff:ff\n    inet 192.168.0.218/24 brd 192.168.0.255 scope global eth0\n    inet6 fe80::20c:29ff:fee8:f67b/64 scope link \n       valid_lft forever preferred_lft forever\n3: pan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN \n    link/ether d2:7a:38:cf:27:60 brd ff:ff:ff:ff:ff:ff", "stdout_lines": ["1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN ", "    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00", "    inet 127.0.0.1/8 scope host lo", "    inet6 ::1/128 scope host ", "       valid_lft forever preferred_lft forever", "2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000", "    link/ether 00:0c:29:e8:f6:7b brd ff:ff:ff:ff:ff:ff", "    inet 192.168.0.218/24 brd 192.168.0.255 scope global eth0", "    inet6 fe80::20c:29ff:fee8:f67b/64 scope link ", "       valid_lft forever preferred_lft forever", "3: pan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN ", "    link/ether d2:7a:38:cf:27:60 brd ff:ff:ff:ff:ff:ff"]}

PLAY RECAP ************************************************************************************************************
192.168.0.218              : ok=3    changed=2    unreachable=0    failed=0   

[root@test ~]#

  說明:–limit 所指定的主機必須是在playbook中所指定的主機範圍內。

   七、playbook vs shell scripts

  1)shell腳本如下:

#!/bin/bash
# 安裝Apache
yum install --quiet -y httpd
# 複製配置文件
cp /tmp/httpd.conf /etc/httpd/conf/httpd.conf
cp/tmp/vhosts.conf /etc/httpd/conf.d/
# 啟動Apache,並設置開機啟動
service httpd start
chkconfig httpd on

  2)playbook

---
- hosts: websers
  remote_user: root

  tasks:
    - name: create apache group
      group: name=apache gid=80 system=yes
    - name: create apache user
      user: name=apache uid=80 group=apache system=yes shell=/sbin/nologin home=/var/www/html 
    - name: install httpd
      yum: name=httpd
    - name: copy config file
      copy: src=/tmp/httpd.conf dest=/etc/httpd/conf/
    - name: copy config 2 file
      copy: src=/tmp/vhosts.conf dest=/etc/httpd/conf.d/
    - name: start httpd service
      service: name=httpd state=started enabled=yes     

  說明:兩者都是實現同樣的目的,很明顯playbook的優勢要比腳本的優勢多,playbook 可以針對很多台主機進行任務執行,而腳本只可以在某一台主機上執行;腳本重複執行沒有冪等性,很有可能帶來很多錯誤,而playbook卻不會有這樣的苦惱。

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

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

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

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

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

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

分類
發燒車訊

前端Leader你應該知道的NPM包管理機制

npm install 命令

首先總結下npm 安裝一個模塊包的常用命令。

/* 模塊依賴會寫入 dependencies 節點 */

npm install moduleName

npm install -save moduleName

npm install -S moduleName 

/* 模塊依賴會寫入 devDependencies 節點 */

npm install -save-dev moduleName

npm install -D moduleName

/* 全局安裝模塊包 */

npm install -g moduleName

/* 安裝特定版本的包 */

npm install 包名@版本號

/* 通過地址安裝git倉庫 */

npm install git+https://github.com/itwmike/axios.git

npm install git+ssh://git@github.com:itwmike/axios.git
 
/* 安裝特定分支或Tag的git倉庫 */

npm install git+https://github.com/itwmike/axios.git#tag

/* 通過用戶名安裝git倉庫 */ 

npm install github:帳號/倉庫名 # npm install github:itwmike/axios

npm install github:帳號/倉庫名

  

npm 依賴包版本號

npm 所有node包都使用語義化版本號,規則要求如下:  

  • 每個版本號都形如1.2.3,由三個部分組成,依次叫做“主版本號(major)”、“次版本號(minor)”和“修訂號(patch)” 。

  • 當新版本無法兼容基於前一版本的代碼時,則提高主版本號 。

  • 當新版本新增了功能與特性,但仍兼容前一版本的代碼時,則提高次版本號 。

  • 當新版本僅僅修正漏洞或者增強效率,仍然兼容前一版本代碼,則提高修訂號。

默認使用 npm install -save 下載的都是最新版本,同時會在package.json 文件中登記一個最優版本號,如下形式:

"dependencies": {
  "axios": "^0.19.0"
},

  

最優版本號前面會多出一個“標記”,這個標記有啥意義?它的寫法又有哪些?

 

npm install 都做了哪些事?

拿到一個node項目時首要做法是運行 npm install 命令,這個命令將 package.json 文件中的依賴包自動解析並安裝,這也是項目能夠本地運行的前置條件。那如此簡單的一條命令,npm 背後又做了哪些不為人知的事呢?

Number One

自 npm 5.0后,項目中如果沒有 package-lock.json 文件的時候,npm 會自動幫我們生成。該文件的主要作用是記錄依賴包之間的具體版本號,對包版本有一個鎖定的意義,項目開發中應該將此文件上傳到git等版本控制工具(博主為此經歷了血淋淋的慘痛教育)。

Number Two

檢測本地包是否已經下載。如果本地 node_modules 下已經存在和 package-lock.json 中版本一致的包,則不會重新下載。

Number Three

下載依賴節點中對應的模板包。下載規則是:如果 package-lock.json 文件存在,則按照該文件中記錄的版本號下載對應的模塊包;如果文件不存在或文件中沒有該包的記錄,此時會按照版本號的標記(上面已講)規範下載並同時更新到 package-lock.json。

了解了 package-lock.json 的作用后,筆者有個疑問:手動修改 package.json 中的包版本號后運行 npm install 命令會下載新包么?

帶着這個疑問,筆者做了實驗,得出如下結論:

  • 如果新舊版本號差距較大,比如從 ^2.5.2 變為 2.6.0 ,那麼會下載最新包並且更新 package-lock.json 。

  • 如果新舊版本號差距較小,比如從 ^2.5.2 變為 2.5.4,那麼不會更新。

總之是否更新要看特定情況,取決於 package.json中版本號的標記和 package-lock.json 是否一致。

cnpm install 探索

cnpm 是淘寶 npm 鏡像,在國內很受歡迎,雖然筆者並不喜歡使用。那 cnpm 和 npm 對包的管理是否一樣呢?

  • cnpm install 並不會生成 package-lock.json

  • cnpm install 並不受 package-lock.json 的約束,它會按照版本號標記規則下載依賴包

 

由此可見,我們在項目中使用 cnpm 的時候一定要慎重,因為很可能團隊成員每個人使用的依賴包版本都不相同,造成打包后的結果也不同。

如果團隊要使用 cnpm,請使用固定版本號的方式安裝依賴包如:cnpm install -E moduleName

 

本文轉載自:

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

【其他文章推薦】

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

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

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

南投搬家前需注意的眉眉角角,別等搬了再說!

分類
發燒車訊

盤點2016年起實施的新能源汽車新政策

電動汽車充電介面及通信協定5項新國標  

第一版電動汽車充電介面等4項國家標準曾在2011年發佈,並於2012年3月1日起實施,包括《電動汽車傳導充電用連接裝置第1部分:通用要求》、《電動汽車傳導充電用連接裝置第2部分:交流充電介面》、《電動汽車傳導充電用連接裝置第3部分:直流充電介面》《電動汽車非車載傳導式充電機與電池管理系統之間的通信協定》等。此次發佈的5項國家標準在4項標準的修訂基礎上新增《電動汽車傳導充電系統 第1部分:一般要求》,於2016年1月1日起正式實施。

標準內容:新修訂的5項國家標準主要在提高電動汽車充電設施安全性及相容性方面做出更進一步的要求。

交流充電部分,更新禁止採用存在安全隱患的直通電纜加普通家用插頭的連接方式,大於16安培的充電方式要求在車輛插座和供電插座安裝電子鎖和溫度感測器等規範。

 

直流充電部分,更新在直流充電槍內要求安裝電子鎖,同時預留車輛插座加裝電子鎖的機械結構,要求車輛和設施必須具備檢測和告警功能等規範。

 

新能源車補貼政策  

2015年4月29日,新一輪新能源汽車補貼政策正式出臺,其中指出在2016-2020年,對消費者購買的進入國家新能源車目錄的純電動汽車、插電式混合動力汽車和燃料電池汽車繼續給予購車補貼。新標準規定新能源車的補貼將分階段退坡,到2020年補貼標準將在2016年基礎上下降40%。

政策內容:新的補貼標準將依據節能減排效果,並綜合考慮生產成本、規模效應、技術進步等因素逐步下調。具體下調辦法是,2017-2018年補貼標準將在2016年基礎上下降20%,2019-2020年補貼標準在2016年基礎上下降40%。而燃料電池汽車的補貼將從2015年的18萬元/輛提升至20萬元/輛。

 對比2013—2015年新能源車補貼標準,2016年起執行的新補貼標準針對續駛里程大於等於80km小於150km的純電動車和增程式在內的插電式混合動力乘用車的補貼金額分別降低了6500元和1500元,而續駛里程大於等於250km的電動車和燃料電池乘用車補貼金額分別提高了1000元和2萬元,因而您在購買新能源車的時候,續駛里程將是非常關鍵的價格影響因素。

新補貼標準對補助範圍內的新能源汽車產品技術的要求也有所提高,其中純電動乘用車的最低續駛里程由大於等於80km提升至100km,同時在行駛速度方面,純電動乘用車30分鐘最高車速應不低於100km/h。

車船稅管理新規  

規程內容:規程中指出,已經繳納車船稅的車船,因品質原因,車船被退回生產企業或者經銷商的,納稅人可以向納稅所在地的主管稅務機關申請退還自退貨月份起至該納稅年度終了期間的稅款,退貨月份以退貨發票所載日期的當月為准。

此外,已完稅車輛被盜搶、報廢、滅失而申請車船稅退稅的,由納稅人納稅所在地的主管稅務機關按照有關規定辦理。

而對不屬於車船稅徵稅範圍的純電動乘用車和燃料電池乘用車,應當積極獲取車輛的相關資訊予以判斷,對其徵收了車船稅的應當及時予以退稅。

第四階段乘用車燃料消耗量限值  

政策內容:2012年6月28日,國務院發佈《節能與新能源汽車產業發展規劃(2012-2020年)》,明確了我國汽車節能標準的整體目標,要求2020年當年乘用車新車平均燃料消耗量達到5.0 L/100km。目前,第四階段的GB 19578-2014《乘用車燃料消耗量限值》和GB 27999-2014《乘用車燃料消耗量評價方法及指標》已於2014年12月22日正式發佈,於2016年1月1日起實施,要求汽車生產企業2016年平均燃料消耗標準需滿足6.7L/100km。

除了以上提到的自2016年1月1日起實施的政策外,還有一些和我們密切相關的政策和措施已在2015年的最後一天終止或完成,讓我們也來關注一下。

節能惠民補貼政策到期取消

政策內容:2013年,國家財政部、發展改革委、工業和資訊化部發佈《關於開展1.6升及以下節能環保汽車推廣工作的通知》,決定從2013年10月1日起至2015年12月31日,繼續實施1.6升及以下節能環保汽車(乘用車)推廣政策,對購買符合條件節能汽車的消費者給予3000元補貼。截止2015年末,國家共實施了3個階段的汽車節能補貼,從每一輪政策的推出可以發現,國家對享受節能補貼的車型要求在逐年提高,推廣車輛要達到產品綜合燃料消耗量標準也由2011年的6.9L調整到2013年的5.9L,且需符合“國V”排放標準。

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

【其他文章推薦】

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

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

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

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

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

分類
發燒車訊

Faraday Future概念車 賭城CES首度亮相

以「挑戰特斯拉」為目標的美國電動車新公司Faraday Future正式於1月4日在美國賭城CES(消費性電子展)展會上展出首款概念車──「FFZERO1」。同時,Faraday Future預計在兩年內將開始量產。

「FFZERO1」以蝙蝠俠的蝙蝠車為設計概念,黑色外型十分具有未來感。跑車級的性能擁有超過1000馬力的功率、電池容量將近100kWh,續航里程最遠483領,最高行駛時速達200英里(約為時速320公里),且從時速0加速到100公里僅需3秒鐘。Faraday Future指名的頭號對手特斯拉旗下最高階的Tesla Model S,最高時速約為155英里(時速249公里)。

總部設於美國加州的Faraday Future執行團隊仍是謎團,只知中國網路電視巨擘樂視(LeTV)創辦人賈躍亭也是投資者之一。去年12月,Faraday Future宣布將在拉斯維加斯斥資10億美元設立占地面積約27.9萬平方公尺的工廠。這座工廠預計將提供4,500個工作機會(目前已有750名員工),且會得到內華達州州政府高達3億3,500萬美金的補助。

在今年的CES上,Faraday Future的研發團隊也首度曝光,當中包括多名來自BMW、Tesla、Audi、Google、NASA、Apple的技術人才。曾在Tesla擔任首席設計師的Nick Sampson擔任研究與工程學部門資深副總裁與產品研發總監。Sampson指出,Faraday Future是科技公司而非傳統車商,車子也將搭配手機App來進行車身設定與狀態監控,還可學習車主的使用偏好,可說是一輛智慧型的電動車。

雖然FFZERO1造型酷炫,但並不會是實際量產的車款。FFZERO1只有單座、採模組化電池,滑板底盤(skateboard chasis)的設計讓Faraday Future未來能根據需求來更換不同車款的電池與馬達裝置,提供更多尺寸、樣式以及性能的多樣化產品。Faraday Future計畫2017年正式開始量產、2020年發售,但Sampson也坦承,車用電池的供應商目前仍未確定。

(照片來源:Faraday Future)

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

【其他文章推薦】

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

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

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

南投搬家前需注意的眉眉角角,別等搬了再說!

分類
發燒車訊

Deepin 下 使用 Rider 開發 .NET Core

目錄

Deepin 下 使用 Rider 開發 .NET Core

國產的 Deepin 不錯,安利一下。

Deepin 用了也有一兩年,也只是玩玩,沒用在開發上面。後來 Win10 不太清真了,就想着能不能到 Deepin下擼碼。要搞開發,首先少不了 IDE,VS2019 用不來,Vs Code 太複雜、麻煩,後來發現了 Rider 這個神器,可是 Rider 是英文界面,筆者的英文是渣渣的。結果在 Windows 下 使用 Rider 開發一段時間后, 已經熟悉了 Rider ,於是計劃後面遷移到 Deepin 下開發 .NET Core 。筆者裝了雙系統 Windows10 + Deepin 15。

安裝 Rider

Rider 的Linux 下載地址

下載壓縮包后,將壓縮包解壓,打開 bin 目錄,在目錄下打開終端,運行

sh rider.sh

或者直接點擊 rider.sh 文件,選擇執行即可。

之後會彈出安裝界面。

根據提示一步步安裝。

最後會要求輸入賬號密碼或者激活碼激活 Rider 。

我這個是高材生的福利~你們沒有的話就用 Github 開源項目免費申請使用,或者其他手段激活。

安裝完畢后,點擊 New Solution ,發現只能創建 .NET Frameork 的項目(Mono)。

先關閉 Rider ,接下來安裝 .NET Core

安裝 .NET Core SDK

有兩種安裝方法

  1. 自己下載二進制的 安裝包

  2. 使用軟件包形式安裝

    無論哪種方法,如果不把 SDK/Runtime 放到 /usr/share/dotnet 下,Rider 是無法識別的(默認路徑,可以進入Rider修改設置),下面兩種方法都是在 Linux 簡單二進制安裝 .NET Core SDK的方法。

sudo ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet -f
export DOTNET_ROOT=/usr/share/dotnet export 
PATH=$PATH:/usr/share/dotnet

推薦第一種方法,第二種方法的或,可以按照微軟的文檔自己試試。。。

安裝完畢后就是這個樣子。

如果要通過軟件包形式安裝,參考一下這裏 

體驗開發

想不到在 Deepin 下,Rider 竟然支持 Desktop Application(WPF)。

不過這不是重點,我又不會 WPF,先試一下 ASP.NET Core ,晚一點再看看 WPF。

運行的時候,報這個錯,是 Https 證書的問題,只需要任意位置打開終端,輸入下面的命令即可。

dotnet dev-certs https

不知道為什麼,瀏覽器打開 Blazor 應用一片空白。。。

換成 MVC 試試。

不知道為什麼 Blazor 打開會空白。不管了,試試 Desktop Application。

創建 Wpf 項目后,提示要安裝插件,然後退出重新打開。

不過最後重新打開項目還是報錯

Project 'WpfApp1' load finished with warnings
            The imported project "/usr/share/dotnet/sdk/3.0.100/Sdks/Microsoft.NET.Sdk.WindowsDesktop/targets/Microsoft.WinFX.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.  /usr/share/dotnet/sdk/3.0.100/Sdks/Microsoft.NET.Sdk.WindowsDesktop/targets/Microsoft.NET.Sdk.WindowsDesktop.targets at (26:3)
            Windows is required to build Windows desktop applications. at (59:5)

算了~就這樣好了,反正我又不會 WPF ~

本文是使用 Typora 寫的,很清真。

好好學習唄~

最後錄了個視頻玩,不知道說啥,看看內容界面就好~

打不開的話,請點擊 

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

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

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

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

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

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

分類
發燒車訊

從沒聽說過的併發的名詞-管程

在接觸併發之前,我只聽說過進程、線程,管程這個詞倒是頭回聽說,抱着認真好學的態度,去找了找關於 管程 的資料,不學不知道,原來併發里的兩大難題–互斥和同步都可以用管程來解決,可以說,管程是一把解決併發的萬能鑰匙。

 

那什麼是管程呢?原來管程並不像進程、線程這樣來形容一個特指東西的名詞,管程是指管理共享變量以及讀共享變量的操作過程,讓他們支持併發。Java 中的 Monitor,我們經常將它翻譯成 “監視器”,其實它還有個更學術的名字就是管程。

 

管程有三種模型,其中廣泛應用的是 MESA 模型,Java 管程實現參考的也是 MESA 模型,所以我就着重學習這個模型。前面提到了管程可以解決併發領域互斥和同步的兩大核心問題,下面我們先看看管程是如何解決互斥問題的。

 

  • 互斥問題的解決

 

互斥指的同一時刻只允許有一個線程訪問共享資源,管程解決互斥問題的思路很簡單,就是將共享變量及對共享變量的操作統一都封裝起來,如圖:

 

 

線程 A 和線程 B 如果想訪問共享變量 queue,只能通過管程提供的入隊和出隊操作,入隊和出隊操作保證互斥性,只允許一個線程進入,而對外暴露的就只有管程,看上去有點面向對象封裝的意思。

 

  • 同步問題的解決

 

在管程解決互斥問題的解決方案中,我們看到了其實共享變量和對共享變量的操作都是被封裝起來的,要想訪問共享變量就要訪問管程,所以同步的解決辦法就是在管程的入口添加一個等待隊列,當多線程想同時進入管程內部時,只允許一個線程進入,其他線程在等待隊列中等待。

 

進入到管程內部,有可能執行修改共享變量的方法還有條件,比如要執行入隊操作,必須保證隊列不滿;要執行出隊操作,必須保證隊列不空,管程對每個條件的變量還對應有一個等待隊列,如圖:

 

 

這裏的入口等待隊列與條件等待隊列是完全不同的兩個隊列,當進入管程內部的線程因執行方法的條件不滿足會進入條件等待隊列,等待被其他線程喚醒,喚醒後會重新進入入口的等待隊列,競爭資源。

 

Java 內置的管程

 

Java 內置管程與 MESA 模型類似,在 MESA 模型中,條件變量可以有多個, Java 語言內置的管程里只有一個條件變量。

 

 

Java 內置的管程方案就是 syncronized ,使用 syncronized 修飾的代碼塊,在編譯器會自動生成相關加鎖和解鎖代碼,但是只會支持一個條件變量。

 

 

總結一下 :

 

 

 

以上是管程的相關介紹,後續我們會進入 Java JUC 工具包的學習,看看除了 syncronized 其他強大的併發編程類都有哪些獨特的用處。

 

 這裡有一篇 

 

感興趣的同學可以瀏覽一下哦~

    

 

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

【其他文章推薦】

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

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

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

南投搬家前需注意的眉眉角角,別等搬了再說!

分類
發燒車訊

【自然語言處理】利用LDA對希拉里郵件進行主題分析

首先是讀取數據集,並將csv中ExtractedBodyText為空的給去除掉

import pandas as pd
import re
import os

dir_path=os.path.dirname(os.path.abspath(__file__))
data_path=dir_path+"/Database/HillaryEmails.csv"
df=pd.read_csv(data_path)
df=df[['Id','ExtractedBodyText']].dropna()

對於這些郵件信息,並不是所有的詞都是有意義的,也就是先要去除掉一些噪聲數據:

def clean_email_text(text):
    text = text.replace('\n'," ") #新行,我們是不需要的
    text = re.sub(r"-", " ", text) #把 "-" 的兩個單詞,分開。(比如:july-edu ==> july edu)
    text = re.sub(r"\d+/\d+/\d+", "", text) #日期,對主體模型沒什麼意義
    text = re.sub(r"[0-2]?[0-9]:[0-6][0-9]", "", text) #時間,沒意義
    text = re.sub(r"[\w]+@[\.\w]+", "", text) #郵件地址,沒意義
    text = re.sub(r"/[a-zA-Z]*[:\//\]*[A-Za-z0-9\-_]+\.+[A-Za-z0-9\.\/%&=\?\-_]+/i", "", text) #網址,沒意義
    pure_text = ''
    # 以防還有其他特殊字符(数字)等等,我們直接把他們loop一遍,過濾掉
    for letter in text:
        # 只留下字母和空格
        if letter.isalpha() or letter==' ':
            pure_text += letter
    # 再把那些去除特殊字符后落單的單詞,直接排除。
    # 我們就只剩下有意義的單詞了。
    text = ' '.join(word for word in pure_text.split() if len(word)>1)
    return text

然後取出ExtractedBodyText的那一列,對每一行email進行噪聲過濾,並返回一個對象:

docs = df['ExtractedBodyText']
docs = docs.apply(lambda s: clean_email_text(s))  

然後我們呢把裏面的email提取出來:

doclist=docs.values

接下來,我們使用gensim庫來進行LDA模型的構建,gensim可用指令pip install -U gensim安裝。但是,要注意輸入到模型中的數據的格式。例如:[[一條郵件字符串],[另一條郵件字符串], ...]轉換成[[一,條,郵件,在,這裏],[第,二,條,郵件,在,這裏],[今天,天氣,腫么,樣],...]。對於英文的分詞,只需要對空白處分割即可。同時,有些詞語(不同於噪聲)是沒有意義的,我們要過濾掉那些沒有意義的詞語,這裏簡單的寫一個停止詞列表:

stoplist = ['very', 'ourselves', 'am', 'doesn', 'through', 'me', 'against', 'up', 'just', 'her', 'ours',
            'couldn', 'because', 'is', 'isn', 'it', 'only', 'in', 'such', 'too', 'mustn', 'under', 'their',
            'if', 'to', 'my', 'himself', 'after', 'why', 'while', 'can', 'each', 'itself', 'his', 'all', 'once',
            'herself', 'more', 'our', 'they', 'hasn', 'on', 'ma', 'them', 'its', 'where', 'did', 'll', 'you',
            'didn', 'nor', 'as', 'now', 'before', 'those', 'yours', 'from', 'who', 'was', 'm', 'been', 'will',
            'into', 'same', 'how', 'some', 'of', 'out', 'with', 's', 'being', 't', 'mightn', 'she', 'again', 'be',
            'by', 'shan', 'have', 'yourselves', 'needn', 'and', 'are', 'o', 'these', 'further', 'most', 'yourself',
            'having', 'aren', 'here', 'he', 'were', 'but', 'this', 'myself', 'own', 'we', 'so', 'i', 'does', 'both',
            'when', 'between', 'd', 'had', 'the', 'y', 'has', 'down', 'off', 'than', 'haven', 'whom', 'wouldn',
            'should', 've', 'over', 'themselves', 'few', 'then', 'hadn', 'what', 'until', 'won', 'no', 'about',
            'any', 'that', 'for', 'shouldn', 'don', 'do', 'there', 'doing', 'an', 'or', 'ain', 'hers', 'wasn',
            'weren', 'above', 'a', 'at', 'your', 'theirs', 'below', 'other', 'not', 're', 'him', 'during', 'which']

然後我們將輸入轉換成gensim所需的格式,並過濾掉停用詞:

texts = [[word for word in doc.lower().split() if word not in stoplist] for doc in doclist]

再將這所有的單詞放入到一個詞袋中,把每個單詞用一個数字index指代:

from gensim import corpora, models, similarities
import gensim
dictionary = corpora.Dictionary(texts)

再分別統計每一篇email中每個詞語在這個詞袋中出現的次數,並返回一個列表:

corpus = [dictionary.doc2bow(text) for text in texts]

 這個列表告訴我們,第14(從0開始是第一)個郵件中,一共6個有意義的單詞(經過我們的文本預處理,並去除了停止詞后)其中,51號單詞出現1次,505號單詞出現1次,以此類推。。。

最後,就可以開始構建我們的模型了:

lda = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=20)
print(lda.print_topic(10, topn=5))

 可以看到,第11個主題最常用的單詞,接下來,我們看下所有的主題:

for i in lda.print_topics(num_topics=20, num_words=5):
    print(i)

 我們再看下第一篇email屬於哪一個主題:

print(lda.get_document_topics(corpus[0]))

 屬於第四個主題的概率是0.95

相關代碼和數據:鏈接: https://pan.baidu.com/s/1sl1I5IeQFDHjVwf2a0C89g 提取碼: xqqf 

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

【其他文章推薦】

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

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

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

南投搬家前需注意的眉眉角角,別等搬了再說!

分類
發燒車訊

花一天時間試玩vsphere6.7(EXSI)服務器版的vmware

花一天時間試玩vsphere6.7(EXSI)服務器版的vmware

要註冊賬號(2019年11月14註冊):

登陸網址:https://my.vmware.com/cn/group/vmware/home
賬號:haha@grr.la
密碼:0nV+SJ8fZbdE8g==

看了下。不管是標準版,企業版,測試版的6.7下載的軟件包都是同一個,區別應該在於激活密鑰

主要有兩個鏡像:EXXI鏡像,VCenter鏡像

EXSI和VMware有點像,不過可以直接裝在裸機上,Vcenter需要裝在windows server上,管理EXSI平台

鏈接:https://pan.baidu.com/s/1x8K4dnMdhg7uz11Hyi7v2A
提取碼:tqaw

VMware vSphere 6 Enterprise Plus
0A65P-00HD0-3Z5M1-M097M-22P7H

參考文檔:https://pan.baidu.com/s/18Cq9marptM-Rbym9l7RvtQ

這個是新的文檔:https://www.lanzous.com/i7ewj1i

上面如果失效:https://blog.csdn.net/techgroup/article/details/100053477

一、安裝EXSI參考:https://blog.csdn.net/weixin_42758707/article/details/100525596

需要注意的地方:不需要DHCP服務器,路由器分配IP就行,ip最好設置為固定IP,可以開啟ssh

填寫密鑰的地方:

開啟ssh后可以使用ssh登陸

二、創建虛擬機根vmware一樣,要先上傳鏡像再創建,可以創建Linux,MacOS,windows

也可以從ovf導入

三、其他功能

支持虛擬機資源監控,克隆虛擬機,建立快照,導出為模版等功能

支持用VMware連ESXI平台(CTRL+L),連接之後可以創建或刪除虛擬機,還可以對虛擬機開關機

四、VMware vSphere Client6.0(看樣子官方不再長期支持了)

https://yq.aliyun.com/articles/636965

https://wsgzao.github.io/post/vmware-vsphere-client/

五、解決ssh無法密碼登陸的問題(提示密鑰登陸)

CTRL+ALT+F1進入命令行,修改/etc/ssh/sshd_config 重啟services.sh

[root@localhost:~] vi /etc/ssh/sshd_config 
[root@localhost:~] grep PasswordAuth /etc/ssh/sshd_config
PasswordAuthentication yes
[root@localhost:~] services.sh restart

六、安裝vcenter

安裝到windows server2016中,應該還有其他辦法

安裝文檔:https://www.lanzous.com/i7eh24j

安裝很簡單,整個安裝過程比較慢,可能要半個小時甚至更長

牛逼,8G,不搞了

換了個電腦,繼續實驗

七、vcenter管理ESXI

vcenter地址:vcenter.jd.com(172.18.3.252)

exsi1地址:172.18.3.151

exsi2地址:172.18.3.255

步驟:先創建數據中心,然後數據中心中添加主機(exsi節點)

管理參考:https://www.cnblogs.com/djlsunshine/p/11372482.html

新建數據中心:

添加主機(添加exsi節點)

設置是否啟用鎖定模式,如果啟用了鎖定模式,管理員就不能夠使用vSphere客戶端直接登錄到ESXI主機,只能通過vCenter Server對主機進行管理。在這裏不啟用鎖定模式

激活參考:https://www.lanzous.com/i7eikla

激活碼複製粘貼全部導入了。一個機器一個激活碼:https://blog.csdn.net/lizhiyuan_eagle/article/details/79989216

然後就可以看到exsi中的虛擬機:

遇到的小問題,我克隆的第一個exsi變成第二個exsi,被識別數來了,只能再裝一台:

vcenter同樣支持管理虛擬機,連接虛擬機

八、遷移exsi1的虛擬機到exsi2

冷遷移,直接遷

取消掛載cdrom再遷移

熱遷移,要添加虛擬交換機在每個exsi網絡上

主機—配置—虛擬交換機—添加網絡:

exsi2一樣,添加個虛擬交換機,ip不能一樣

然後就可以遷移了

整個遷移過程網絡沒有丟包,ssh也沒有中斷

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

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

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

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

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

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

分類
發燒車訊

特斯拉:兩年後你的車就能「自己」來找你

特斯拉於上週六(9日)發佈了最新車載作業系統Version 7.1,此次升級對自動駕駛儀的多款主要功能進行了升級。最重要的就是「召喚」功能,即在無需司機駕駛的情況下,汽車可以自主進入或退出停車位或車庫。

特斯拉的軟體升級是在2016年CES消費電子展之後進行的,今年展會上自動駕駛汽車和更先進的車載軟體成為汽車製造商中的兩大熱門主題。馬斯克(Elon Musk)認為,從技術上看,自動駕駛汽車將在未來24個月到36個月之間準備就緒。

至於當前的「召喚」功能,其所能執行的任務還相當有限。馬斯克稱當前的反覆運算更像是遙控功能,而非自動駕駛功能。當前的「召喚」功能要求司機與汽車距離不超過10米。在使用這個功能時,司機需要持續監控和維持對汽車的控制。此外,特斯拉要求司機只能在地形平坦的私人停車位使用「召喚」功能。

與此同時,Version 7.1最新升級還可讓特斯拉電動汽車自我泊車,無論是在平行還是垂直位置。特斯拉自動駕駛儀的自動引導功能也增加了更多限制,比如在居民區或沒有中央分隔線的公路上,速度更慢。而在其他公路上,自動引導功能也將車速限制為時速8公里或10公里以內。馬斯克表示,為了保證汽車安全行駛,這些新的限制完全合理。

此外,特斯拉還添加了新的安全功能,比如曲線速度自我調整功能,汽車可以掃描前面公路上的曲線,自動駕駛儀可根據所得資訊自動調整速度。

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

【其他文章推薦】

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

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

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

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

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

分類
發燒車訊

2016中國國際汽車新能源及技術應用展覽會|節能與新能源汽車產業發展規劃成果展覽會

展會時間:2016年10月13-16日

展會地點:北京-國家會議中心

展會定位:
唯一的國家級新能源汽車展覽展示平臺;中國參展企業最多、展覽面積最大、展品最為豐富的節能與新能源汽車展。

展覽規模:30,000平方米(2015年)

觀眾數量:60,000人次(2015年)

展覽週期:每年一屆,2013年首屆

支援單位:中華人民共和國工業和資訊化部

批准單位:中華人民共和國科學技術部、中國國際貿易促進委員會

主辦單位:中國國際貿易促進委員會機械行業分會、中國電工技術學會、汽車知識雜誌社、寰球時代汽車投資管理(北京)有限公司

合作單位:北京盛大超越國際展覽有限公司

展位價格:
室內光地:1280元/平方米
標準展位:11800元/個(3m*3m)

參展範圍:

整車類

純電動車,混合動力車,燃料電池車,輕型電動車,天然氣(液化氣)車,醇類及其他代用燃料車和節能汽車。

零部件類

電池、電機、電控等核心零部件和先進技術應用;先進內燃機、高效變速器、輕量化材料、整車優化設計及混合動力等節能技術產品。

充電設施

充電樁、充電機、配電櫃、充換電池及電池管理系統、停車場充電設施、智慧監控、充電站供電解決方案、充電站-智慧電網解決方案等。

新能源汽車發展成果展示;檢測,維修,監控,實驗,安全防護裝備及媒體等.

連絡人:岳巍 先生  
手機(微信):135 5286 5285
郵箱:sales2@s-expo.com  

附:其他推薦展會

2016上海國際汽車新能源及智慧技術展覽會
上海車展新能源姐妹展
展會日期:2016年6月28日-30日
展會地點:上海新國際博覽中心
詳情請點擊

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

【其他文章推薦】

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

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

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

南投搬家前需注意的眉眉角角,別等搬了再說!