selenium自動化操作

在前面爬蟲的相關介紹中,我們介紹了如何抓取靜態頁面信息。但是,在實際的網頁瀏覽過程中,我們可能會經常碰到各種需要進行交互的操作,典型的如輸入信息、點擊按鈕之類。

對於這種場景,之前的靜態頁面操作方式已經不能滿足需求,這時我們需要藉助新的工具,比如selenium或者PhantomJS。由於後者已經停止維護,推薦使用前者。

1.selenium是什麼

如果大家有做過web的自動化測試,相信對於selenium一定不陌生,測試人員經常使用它來進行自動化測試。

selenium最初是一個自動化web測試工具,通過代碼模擬人使用瀏覽器自動訪問目標站點並操作,比如跳轉、輸入、點擊、下拉等。

由於開發者的不斷完善,目前的功能越來越強大,基本支持各種交互操作。同時,不止支持有界瀏覽,還支持無界瀏覽。

2.selenium有什麼用

正如我們前面講過的,爬蟲的本質過程就是模擬人對瀏覽器的操作過程。在爬蟲中使用,selenium主要是為了解決requests無法執行javaScript代碼的問題。

本質上是通過驅動瀏覽器,完全模擬瀏覽的操作,比如跳轉、輸入、點擊、下拉等…進而進行跳轉。

當然,它也有壞處,主要的壞處就是它的速度比較慢。原因是selenium在操作時,需要等瀏覽器對頁面的元素渲染好之後才能操作。而我們知道,由於頁面渲染過程需要加載各種資源,響應速度與網絡帶寬要求非常高。通常情況,它比靜態頁面的響應至少慢一個數量級。

3.如何使用selenium

在知道selenium是什麼以及有什麼用之後,我們來具體學習如何操作這個工具。

由於selenium本質是模擬人對瀏覽器進行輸入、選擇、點擊等操作,因此對於目標標籤的定位非常重要。

在前面的章節,我們對於如何定位目標標籤有過詳細的介紹,這裏就不再贅述。selenium對於目標標籤定位的方式本質與靜態的頁面一樣,只不過因為使用的包不同,因此在beautifulSoup中使用的是find和findAll,而在selenium中使用的接口有所變化。

下圖中已對各種定位方式進行了歸納總結:

在找到目標標籤之後,最重要的是對這些標籤進行模擬操作。Selenium庫下webdriver模塊常用方法主要分類兩類:一類是模擬瀏覽器、鍵盤操作,另一類是模擬鼠標操作。

3.1模擬瀏覽器、鍵盤操作

模擬瀏覽器、鍵盤操作的方法歸納如下:

3.2 模擬鼠標操作

模擬鼠標操作的方法歸納如下:

4.示例演示

在介紹了selenium相關的使用方法之後,我們來進行操作。這裏介紹兩個例子:第一個例子是模擬百度搜索,第二個例子是模擬自動登錄網易163郵箱發送郵件。

在開始示例之前我們需要安裝selinum插件包,同時還需要下載webdriver。在我們的示例中,需要是使用chrome瀏覽器進行操作,需要使用瀏覽器的驅動webdriver。

關於下載什麼版本的webdriver,可以在瀏覽器的屬性中查看,並在http://npm.taobao.org/mirrors/chromedriver/下載對應的版本就好,如果是其他的瀏覽器,則需要下載對應的瀏覽器驅動程序,這種不再做進一步介紹。

4.1模擬百度搜索

第一步還是需要打開目標的地址“w w w.baidu.com”,分析目標網頁中目標元素的特點,如下圖所示:

通過分析,我們很容易就找到搜索框的id為kw,點擊按鈕的id為su,餘下的就是使用方法進行模擬。

實現的代碼如下所示:

from selenium import webdriver

#get 方法 打開指定網址
driver=webdriver.Chrome()
driver.get('http://www.baidu.com')

#選擇網頁元素
element_keyword = driver.find_element_by_id('kw')

#輸入字符
element_keyword.send_keys('python 爬蟲')

#找到搜索按鈕
element_search_button = driver.find_element_by_id('su')
element_search_button.click()

driver.close()

4.2模擬自動登錄網易163郵箱發送郵件

操作過程跟上面相似,第一步也是分析目標網頁http://mail.163.com。

如下圖所示:

找到了目標標籤然後就是模擬登錄。

實現代碼如下:

# coding:UTF-8
import time
from selenium.webdriver.common.keys import Keys
from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(5)  
driver.get('http://mail.163.com/')
driver.switch_to_frame(driver.find_element_by_tag_name('iframe'))
# driver.switch_to_frame('x-URS-iframe')  
driver.find_element_by_name('email').clear()
driver.find_element_by_name('email').send_keys('郵箱地址')
driver.find_element_by_name('password').send_keys('郵箱密碼', Keys.ENTER)
# 跳轉頁面時,強制等待6s
time.sleep(6)   
# 點擊寫信按鈕
driver.find_element_by_xpath("//div[@id='dvNavTop']/ul/li[2]/span[2]").click()   
time.sleep(2)
# 收件人
driver.find_element_by_class_name('nui-editableAddr-ipt').send_keys('目標的郵箱')  
driver.find_element_by_xpath("//input[@class='nui-ipt-input' and @type='text' and @maxlength='256']").send_keys(
    u'測試')   # 主題
xpath = driver.find_element_by_xpath("//div[@class='APP-editor-edtr']/iframe")
# 文本內容在iframe中
driver.switch_to_frame(xpath)   
driver.find_element_by_xpath("//body[@class='nui-scroll' and @contenteditable='true']").send_keys(u'這是一個自動化測試郵件')
# 發送按鈕在iframe外,所以需要跳出
driver.switch_to_default_content()
# 發送
driver.find_element_by_xpath("//div[@class='nui-toolbar-item']/div/span[2]").click()  
driver.close()

當然,在實際過程中,可能往往還有驗證碼的驗證。因為現在的驗證碼難度越來越大,形式也多種多樣,使用常規的方法很難解決,必須藉助機器學習或者第三方接口進行實現,將在後續單獨列一個章節進行介紹如何破解驗證碼。
​

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

【其他文章推薦】

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

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

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

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

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

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

11.DRF-權限

Django rest framework源碼分析(2)—-權限

添加權限

(1)API/utils文件夾下新建premission.py文件,代碼如下:

  • message是當沒有權限時,提示的信息
# utils/permission.py

class SVIPPremission(object):
    message = "必須是SVIP才能訪問"
    def has_permission(self,request,view):
        if request.user.user_type != 3:
            return False
        return True


class MyPremission(object):
    def has_permission(self,request,view):
        if request.user.user_type == 3:
            return False
        return True

(2)settings.py全局配置權限

#全局
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES":['API.utils.auth.Authentication',],
    "DEFAULT_PERMISSION_CLASSES":['API.utils.permission.SVIPPremission'],
}

(3)views.py添加權限

  • 默認所有的業務都需要SVIP權限才能訪問
  • OrderView類裏面沒寫表示使用全局配置的SVIPPremission
  • UserInfoView類,因為是普通用戶和VIP用戶可以訪問,不使用全局的,要想局部使用的話,裏面就寫上自己的權限類
  • permission_classes = [MyPremission,] #局部使用權限方法
from django.shortcuts import render,HttpResponse
from django.http import JsonResponse
from rest_framework.views import APIView
from API import models
from rest_framework.request import Request
from rest_framework import exceptions
from rest_framework.authentication import BaseAuthentication
from API.utils.permission import SVIPPremission,MyPremission

ORDER_DICT = {
    1:{
        'name':'apple',
        'price':15
    },
    2:{
        'name':'dog',
        'price':100
    }
}

def md5(user):
    import hashlib
    import time
    #當前時間,相當於生成一個隨機的字符串
    ctime = str(time.time())
    m = hashlib.md5(bytes(user,encoding='utf-8'))
    m.update(bytes(ctime,encoding='utf-8'))
    return m.hexdigest()

class AuthView(APIView):
    '''用於用戶登錄驗證'''

    authentication_classes = []      #裏面為空,代表不需要認證
    permission_classes = []          #不裏面為空,代表不需要權限
    def post(self,request,*args,**kwargs):
        ret = {'code':1000,'msg':None}
        try:
            user = request._request.POST.get('username')
            pwd = request._request.POST.get('password')
            obj = models.UserInfo.objects.filter(username=user,password=pwd).first()
            if not obj:
                ret['code'] = 1001
                ret['msg'] = '用戶名或密碼錯誤'
            #為用戶創建token
            token = md5(user)
            #存在就更新,不存在就創建
            models.UserToken.objects.update_or_create(user=obj,defaults={'token':token})
            ret['token'] = token
        except Exception as e:
            ret['code'] = 1002
            ret['msg'] = '請求異常'
        return JsonResponse(ret)


class OrderView(APIView):
    '''
    訂單相關業務(只有SVIP用戶才能看)
    '''

    def get(self,request,*args,**kwargs):
        self.dispatch
        #request.user
        #request.auth
        ret = {'code':1000,'msg':None,'data':None}
        try:
            ret['data'] = ORDER_DICT
        except Exception as e:
            pass
        return JsonResponse(ret)


class UserInfoView(APIView):
    '''
       訂單相關業務(普通用戶和VIP用戶可以看)
       '''
    permission_classes = [MyPremission,]    #不用全局的權限配置的話,這裏就要寫自己的局部權限
    def get(self,request,*args,**kwargs):

        print(request.user)
        return HttpResponse('用戶信息')
# urls.py
from django.contrib import admin
from django.urls import path
from API.views import AuthView,OrderView,UserInfoView

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/v1/auth/',AuthView.as_view()),
    path('api/v1/order/',OrderView.as_view()),
    path('api/v1/info/',UserInfoView.as_view()),
]
# API/utils/auth/py
# auth.py

from rest_framework import exceptions
from API import models
from rest_framework.authentication import BaseAuthentication


class Authentication(BaseAuthentication):
    '''用於用戶登錄驗證'''
    def authenticate(self,request):
        token = request._request.GET.get('token')
        token_obj = models.UserToken.objects.filter(token=token).first()
        if not token_obj:
            raise exceptions.AuthenticationFailed('用戶認證失敗')
        #在rest framework內部會將這兩個字段賦值給request,以供後續操作使用
        return (token_obj.user,token_obj)

    def authenticate_header(self, request):
        pass

(4)測試

普通用戶訪問OrderView,提示沒有權限

普通用戶訪問UserInfoView,可以返回信息

權限源碼流程

(1)dispatch

def dispatch(self, request, *args, **kwargs):
    """
    `.dispatch()` is pretty much the same as Django's regular dispatch,
    but with extra hooks for startup, finalize, and exception handling.
    """
    self.args = args
    self.kwargs = kwargs
    #對原始request進行加工,豐富了一些功能
    #Request(
    #     request,
    #     parsers=self.get_parsers(),
    #     authenticators=self.get_authenticators(),
    #     negotiator=self.get_content_negotiator(),
    #     parser_context=parser_context
    # )
    #request(原始request,[BasicAuthentications對象,])
    #獲取原生request,request._request
    #獲取認證類的對象,request.authticators
    #1.封裝request
    request = self.initialize_request(request, *args, **kwargs)
    self.request = request
    self.headers = self.default_response_headers  # deprecate?

    try:
        #2.認證
        self.initial(request, *args, **kwargs)

        # Get the appropriate handler method
        if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(),
                                  self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed

        response = handler(request, *args, **kwargs)

    except Exception as exc:
        response = self.handle_exception(exc)

    self.response = self.finalize_response(request, response, *args, **kwargs)
    return self.response

(2)initial

def initial(self, request, *args, **kwargs):
    """
    Runs anything that needs to occur prior to calling the method handler.
    """
    self.format_kwarg = self.get_format_suffix(**kwargs)

    # Perform content negotiation and store the accepted info on the request
    neg = self.perform_content_negotiation(request)
    request.accepted_renderer, request.accepted_media_type = neg

    # Determine the API version, if versioning is in use.
    version, scheme = self.determine_version(request, *args, **kwargs)
    request.version, request.versioning_scheme = version, scheme

    # Ensure that the incoming request is permitted
    #4.實現認證
    self.perform_authentication(request)
    #5.權限判斷
    self.check_permissions(request)
    self.check_throttles(request)

(3)check_permissions

裏面有個has_permission這個就是我們自己寫的權限判斷

def check_permissions(self, request):
    """
    Check if the request should be permitted.
    Raises an appropriate exception if the request is not permitted.
    """
    #[權限類的對象列表]
    for permission in self.get_permissions():
        if not permission.has_permission(request, self):
            self.permission_denied(
                request, message=getattr(permission, 'message', None)
            )

(4)get_permissions

def get_permissions(self):
    """
    Instantiates and returns the list of permissions that this view requires.
    """
    return [permission() for permission in self.permission_classes]

(5)permission_classes

所以settings全局配置就如下

#全局
REST_FRAMEWORK = {
   "DEFAULT_PERMISSION_CLASSES":['API.utils.permission.SVIPPremission'],
}

內置權限

django-rest-framework內置權限BasePermission

默認是沒有限制權限

class BasePermission(object):
    """
    A base class from which all permission classes should inherit.
    """

    def has_permission(self, request, view):
        """
        Return `True` if permission is granted, `False` otherwise.
        """
        return True

    def has_object_permission(self, request, view, obj):
        """
        Return `True` if permission is granted, `False` otherwise.
        """
        return True

我們自己寫的權限類,應該去繼承BasePermission,修改之前寫的permission.py文件

# utils/permission.py

from rest_framework.permissions import BasePermission

class SVIPPremission(BasePermission):
    message = "必須是SVIP才能訪問"
    def has_permission(self,request,view):
        if request.user.user_type != 3:
            return False
        return True


class MyPremission(BasePermission):
    def has_permission(self,request,view):
        if request.user.user_type == 3:
            return False
        return True

總結:

(1)使用

  • 自己寫的權限類:1.必須繼承BasePermission類; 2.必須實現:has_permission方法

(2)返回值

  • True 有權訪問
  • False 無權訪問

(3)局部

  • permission_classes = [MyPremission,]

(4)全局

REST_FRAMEWORK = {
   #權限
    "DEFAULT_PERMISSION_CLASSES":['API.utils.permission.SVIPPremission'],
}

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

【其他文章推薦】

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

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

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

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

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

※產品缺大量曝光嗎?你需要的是一流包裝設計!

本田將研發新型小型混動車 比同類車省30%燃油

本田汽車公司日前通過官方網站宣佈,將研發新型的小型。

據介紹,新型混合動力汽車主要是在動力系統上加以改進,採用了電動機帶動汽車的電動汽車模式(EV),這將比其它同類汽車再節省燃油30%。本田公司計畫從明年開始對新款“飛度”汽車裝配此種動力模式。在市場上將會與豐田公司的“AKUA”小型混合動力汽車形成競爭。

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

【其他文章推薦】

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

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

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

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

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

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

豐田7款新能源車型亮相廣州車展

近日,將在豐田廣州車展的5.1館的約1500平米的展臺上共展出概念車以及國產、進口車型共計46輛,其中豐田的混合動力車型將成為本次車展上的重點,同台亮相的有12款為混合動力車型(HEV)、外插充電式混合動力車型(PHEV)以及型(EV),與此同時還包括了1款預計2013年進入中國市場的亞洲首發車和中國首發的新款雷克薩斯LS600hL混動加長版車型。

雲動雙擎

●混合動力概念車

“雲動雙擎”概念車作為豐田“雲動計畫”中所包涵的開發國產混合動力總成這一重要內容的國產混合動力的象徵而誕生,量產車將於2015年左右推出。長軸距延展出的流暢曲線,造就了獨具魅力的整體造型,更突顯了高級的質感。搭載豐田最先進,也是世界最高水準的混合動力系統,同時集高水準的行駛性能以及超凡品質於一身,既實現了“環保駕駛”,又打造了無限的駕乘樂趣。

TOYOTA DEAR“親”

●小型概念車

豐田的全新小型概念車—TOYOTA Dear ~親~,讓小型車也能迸發激情。TOYOTA Dear ~親~是為了贏得更多中國用戶而設計研發的小型概念車。這款概念車計畫在2013年投放中國市場,使豐田在中國的全線車型更加充實,“TOYOTA Dear ~親~”也將成為豐田推進全球戰略的核心車型。考究的外形,大膽而又動感的線條,加以寬敞的車內空間,完全打破了對小型車的傳統印象。車內配備的光感測器等先進技術更增添了行車的樂趣,讓人們對豐田的小型車充滿期待。

PRIUS PLUG-IN HYBRID Concept

●外插充電式混合動力概念車

PRIUS PLUG-IN HYBRID Concept是以鋰離子電池作為驅動電池,以第3代PRIUS普銳斯為原型,可使用家用電源進行外部充電的外插充電式混合動力車。

該車可以選擇純電動模式或混合動力模式行駛,能夠更加充分地使用電能而且不受電池剩餘量和充電設施完善情況的限制,通過減少不可再生資源消耗和二氧化碳排放來防止大氣污染。它的目標是每公升汽油可行駛55公里以上*(二氧化碳排放量42g/km以下),並在充滿電的情況下作為純電動車的行駛距離為20km以上。充電時,該車在100V電源下約180分鐘,200V電源下約100分鐘即可充滿。

2012年,豐田與中國汽車技術研究中心共同在天津開展的實證行駛實驗圓滿結束,預計2012年內提前試銷。

NS4

●外插充電式混合動力概念車

豐田最新一代外插充電式混合動力概念車,兼備高燃油經濟性以及澎湃動力,採用先進的安全技術和“人、車與社會緊密相連”技術,全面展示了豐田在安全與新能源領域的技術成果。

前臉設計獨特,展示淩厲中的魅惑風情,低重心造型凸顯感性魅力,達到令人驚豔的設計效果。配備革新性的HMI(Human Machine Interface,人機交互系統及雙顯示幕),實現輕鬆操控。

配備新一代PCS預碰撞安全系統和行人防撞預警系統等先進技術,大幅提高行車安全性;配有3台後攝像頭,確保後方視野開闊,減少視線移動。

FT-EV III

●電動概念車

豐田FT-EV系列的第三代概念車,適於短途行駛的“超小型輕量設計”電動概念車。

電動車將有望替代化石燃料的電能作為動力源,在行駛中不會排出二氧化碳,未來會成為非常重要的環保汽車。動力系統配備鋰電池,預計一次充電可以行駛105公里,非常適合短途行駛。

車身長度雖然只有3.1米,寬也不到1.7米,卻實現了可供4人乘坐的寬敞空間。

RAV4 EV

●電動概念車

1998年,中國國家科學技術部在廣東省汕頭市南澳島實施電動車行駛實驗,豐田為其提供了RAV4 EV作為行駛實驗車,該車搭載的鎳氫電池可實現達200km的續航距離。

豐田早在40年前就開始潛心研發能夠普及的新能源技術,混合動力技術是目前全球最成熟最先進的環保技術。2012年1月~10月混合動力車全球累計銷量為102.8萬輛,年度銷量首次突破100萬輛大關,今年在豐田銷售的車輛中,混合動力車已經占到其全球銷量的14%。與此同時,豐田混合動力車自1997年上市以來,實現全球累計銷量達到460.3萬輛。截至2012年10月末,在全球範圍內混合動力車與車輛尺寸、及動力性能相同的汽油車相比,累計節約石油約110億升,同時減少約3000萬噸二氧化碳的排放。

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

【其他文章推薦】

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

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

※台北網頁設計公司全省服務真心推薦

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

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

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

通用計畫到2017年電氣化汽車年產達50萬輛

通用汽車公司日前表示,將大力發展電氣化車輛,計畫到2017年每年產量達到50萬輛。

通用計畫通過各種技術,包括插電式汽車、和混合動力車來實現全球電氣化車輛目標。到2017年,每年在全球範圍內生產500,000輛採用電氣化技術的車輛。該數字將略超過2011年通用全球銷量的5%(2011年通用汽車全球銷量902萬輛)。

通用在過去幾個月中一直在努力完善並確定其先進技術戰略,其中就包括電氣化戰略,插電式技術將在未來發揮更大的作用。通用汽車公司的工程師們正在研發沃藍達和凱迪拉克ELR的下一代動力驅動技術,在不遠的將來,“系統”價值和效率將大幅提高。

預計2012年通用汽車電氣化車輛全球銷量超過50,000輛,涵蓋雪佛蘭沃藍達插電式混合動力車,以及採用eAssist微混動力系統的別克君越)、別克君威和雪佛蘭邁銳寶。帶有eAssist系統的2014款雪佛蘭Impala將在明年上市。

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

【其他文章推薦】

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

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

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

※南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

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

※超省錢租車方案

CIEVE 2013 中國國際新能源汽車產業博覽會

展會名稱:

CIEVE 2013 中國國際新能源汽車產業博覽會

展會日期:

2013年9月5-7日

展會地點:

北京.中國國際展覽中心新館

主辦單位:

商務部中國國際經濟合作學會、全國節能與新能源汽車產業聯盟

承辦單位:

上海勵德展覽展示服務有限公司

展會簡介:

中國已經成為世界第一大汽車生產國和消費國,2011年汽車產銷量超過1800萬輛,預計到2030年中國汽車中乘用車保有量將會達到2.5億輛。然而,隨著節能減排,降低能源依賴逐漸成為國際汽車工業和環保工業的發展趨勢,加之油價不斷上漲給汽車工業帶來的壓力,中國政府近幾年制定了相應的節能與新能源汽車發展戰略。

新能源汽車作為發展可替代能源,建設可持續發展低碳社會的重要一環,越來越受到世界各國的高度重視,我國政府也已正式將新能源汽車列入七大戰略性產業之一。

隨著近日(2012.7.9)國務院正式公佈《節能與新能源汽車產業發展規劃(2012—2020年)》,近年來圍繞新能源汽車的一系列爭議也一錘定音。在技術路線之爭上,新能源汽車規劃敲定以純電動汽車和插電式混合動力汽車作為戰略方向,並兼顧普及混合動力汽車。在產業化目標上,規劃要求“到2015年,純電動汽車和插電式混合動力汽車累計產銷量力爭達到50萬輛;到2020年,純電動汽車和插電式混合動力汽車生產能力達200萬輛、累計產銷量超過500萬輛”。相關行業調研機構對產業規模進行了測算,到2015年新能源汽車產業將孕育千億元的市場,未來10年將是我國電動汽車產業發展的關鍵時期。

展品範圍:

→整車產品:

純電動車:轎車、大巴、公車、各型旅行車、低速微型車、各種純電動特種車(環衛車、電力車、郵政車、小型客貨車、高爾夫車、房車、叉車、搬運車、牽引車、旅遊觀光車、醫療車、警用車、摩托車、三輪車等);混合動力車:轎車、大巴、公車、旅行車等,增程式電動車,插電式混合動力車;其他新能源車:燃料電池車、節能內燃機汽車、氫能車、生物燃料車、太陽能車、天然氣車等各種新能源、清潔燃料及低排放、環保節能型車;

→三大部件:電池、電機、電控,低排放節能型發動機、混合動力發動機及清潔燃料發動機;動力電池,鋰電池、燃料電池、鉛酸蓄電池,電池管理系統BMS,正負極材料,隔膜,電解液,超級電容器;整車匯流排與控制系統;非同步電機、開關磁阻電機和永磁電機(包括無刷直流電機和永磁同步電機),電控系統,動力總成,整車控制系統等;

→充換電裝置及設施;儲能裝置;能源管理系統;電力電容器、飛輪、逆變器、電熱泵、電動助力轉向、電動空調、功率模組等;相關材料、工藝、技術;相關檢測、監控、試驗、安全防護裝備;維修、製造設備和工具;充電站專案規劃及成果展示;充電站充電機、充電樁、充電連接器、配電設備、變壓器、電纜等相關基礎設施;充換電池及電池管理系統;電能監視系統;供電解決方案等

→相關附件:新能源車的內外裝飾及座椅,輪轂輪胎,儀錶儀盤,車燈,線束,車載電子,新能源汽車的整車及系統控制設計,裝備製造等;

→其他:檢測認證機構,行業協會,產品研發,貿易服務,經銷商,管理培訓及其他相關產品或服務等。

參展費用:

標準展位:9平米/個,(配置包括:9平米場地、展位內地毯、三面展板、一張洽談桌、兩把椅子、兩個射燈、公司楣板、一個220V電源插座)

內資企業:RMB 8800元/個;合資企業:10800元/個;

外資企業:USD 3200元/個

光   地(36平方米起租,無任何配置):

內資企業:RMB 880/平方米;合資企業:1000元/平米;

外資企業:USD 300元/平方米

1、廣告宣傳價格

會刊封面:25000元        會刊封二:15000元  

會刊封底:20000元        會刊封三:10000元         

會刊扉頁:10000元        門票廣告:10000元/5千個

彩頁整版:5000元         參觀證廣告:20000元/5千個

2、展會現場廣告項目及價格(詳情請來電索取)

3、各項展會贊助方案及報價(詳情請來電索取)

聯繫方式:

CIEVE 2013北京新能源汽車產業博覽會組委會

聯繫人:高    晟            手  機:18049755269    

電  話:021-54289707        傳  真:  021-54287017

E-mail:cieve88@163.com    網  站:www.cieve.org   

地  址:上海市徐匯區銀都路298號九潤商務大廈210室(200230)

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

【其他文章推薦】

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

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

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

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

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

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

豐田新一代蓄電池技術能讓電動汽車行駛距離翻番

豐田開發出了新一代蓄電池的基礎技術,利用這種電池可以將的連續行駛距離延長至目前2倍以上。新開發的是作為電池主要部分的電極材料,使用的是海水中含量豐富的鈉,與目前主流的鋰離子電池相比價格更低。豐田為在2020年前後投入實際應用,正加快推進研究。

此次開發的是,利用鈉離子來傳輸電子的“鈉離子電池”的正極材料。這種材料是由多種磷氧化物和鎳等金屬、鈉構成的化合物。

在試製硬幣大小的電池時發現,在室溫狀態下其電壓值比鋰離子電池高3成左右。電壓值是衡量電動汽車連續行駛距離的重要指標。雖然仍需進一步分析,但豐田表示“連續行駛距離將大幅延長,500~1000公里的目標已經進入視野”。

從每次加油和充電的行駛距離來看,混合動力車最大約為1000公里。豐田認為,電動汽車要全面走向普及,行駛距離必須達到500~1000公里,但利用目前的汽車電池僅能達到200公里左右。有分析認為,如果使用鋰離子電池,300公里將是極限。

新一代蓄電池的開發已是當務之急,豐田正在開發“全固體電池”和“空氣電池”等。雖然有分析認為鈉離子電池在理論上難以超越鋰離子電池的性能,但借助此次的成果,鈉離子電池已經成為有力候選對象之一。

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

【其他文章推薦】

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

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

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

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

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

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

三菱計畫在美國市場推出Mirage電動車、新歐藍德

隨著日本鈴木在美國市場漸漸沒落的消息傳開,作為本土的汽車品牌對各自品牌在北美市場的前景不免捏一把汗,針對這一嚴峻形勢,日本三菱先發制人,對外透露了其未來今年的整改計畫的細節內容,三菱計畫在美國市場的銷量提升45%,也就是說銷量目標增加8萬輛,而截至明年三月底其銷量目標定在5.5萬輛。

三菱未來的計畫包括在美國市場推出兩款新車型,全新打造的歐藍德跨界車將在2013年7月上市,而三菱Mirage小車2013年9月美國上市,據相關報導,Mirage小車將可能於2013年年底引入中國。隨後,三菱還將推出歐藍德跨界插電式混動車,其將在2014年一月美國上市,其燃油消耗極低,百公里燃油消耗僅2.0升。對於以上幾款新車的推出是否能提升其在美國市場的銷量暫時還不得而知,但是如果三菱不想步鈴木的後路,那麼推出新車計畫還是有必要的。

2013款三菱Mirage

三菱CEO Osamu Masuko確認了三菱將推出Mirage的計畫,但是這款電動車將不太可能在美國市場銷售,因為三菱i-MiEVs 10月在美國市場的銷量僅469輛,這與之前一年銷量達兩萬輛是無可比擬的。

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

【其他文章推薦】

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

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

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

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

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

※產品缺大量曝光嗎?你需要的是一流包裝設計!

淺談async/await

小明用async/await寫了幾年的異步方法,但總沒有完全理解裏面的機制,他決定去請教鄰居小花。

小花聽了小明的描述后說:首先你要明白異步的根本是什麼?大白話解釋異步就是:拉一個人(線程)幫着做一些耗時的事(下載、讀寫數據庫等),我先做別的事了(退出線程),等做好了和我說下,我再繼續做後面的事(恢復上下文)。

小花看到小時還沒有明白,就說:我舉個簡單例子幫你理解吧,假如有兩個方法A和B,A調用B方法,B方法是一個異步方法,這時A不等待B執行完,如圖:

現在兩個方法被分隔幾個小塊,await關鍵字其實就用來隔開同步和異步,上面的方法執行流程如下:

A調用B方法后,B方法在未執行到await之前還是同步方法,比如輸出Sub1還是在當前線程中執行,當方法遇到await后,就會把await后的方法放到新的線程中執行,當前線程則退出函數,由於調用的地方並沒有await,則主線程會繼續執行並輸出Part2,然後結束。等新線程中Thread.Sleep(5000)執行完后,會執行到Console.Write(“Sub2”);這一行代碼會回到原來的線程執行,其實遇到await時會捕獲當前線程的執行上下文,然後給到新線程,新線程在執行完耗時操作后,會判斷之前捕獲到的執行上下方是否為null,如果不為null,則會在上下文中恢復並執行後面的方法,其實就是通過Tak的ContineWith方法註冊回調,如圖:

小明好像聽懂了一些說:現在A方法調用DoSomethingAsync()並沒有等待,如果A方法需要這個方法執行完才能繼續執行,是不是要在DoSomethingAsync()前面加上await?小花回答是,並說:方法只要遇到await,就會把後面的方法給新線程執行,然後線程退出去執行別的方法,等新線程執行完后再通知當前線程恢復上下文繼續執行,如圖:

小明又問:你說異步方法執行完后,後面的方法會在原來的線程中恢復並執行,如果我還想在新線程中繼續執行剩下的代碼,要怎麼辦呢?小花說問的好,await調用新線程執行耗時操作時默認會捕獲當前上下文,如果不想捕獲,則可以調用ConfigAwait(false)方法,如圖:

執行流程如下:

小花補充到,上線提到的線程1、線程2、線程3等不一定準確,因為異步的回調是使用線程池中的線程,所以回調有可能還在原來線程中執行,這個主要看操作系統的調度。

小明滿意的點點頭又問:我經常聽同事說用異步方法會死鎖,這又是為什麼呢?小花聽了說,他們肯定是在調用異步方法的時候使用.Result(),如圖:

小花指着圖解釋說:上面的代碼task.Result()會阻塞線程等待task返回結果,DoSomethingAsync方法在執行完Thread.Sleep(5000)后,發現捕獲到的上下文不為空,則會嘗試將Console.Write(“Sub2”)這行代碼交由調用線程去執行,而這時調用線程還在等待,就這樣互相卡着對方,就造成了死鎖,如圖:

小明點了點頭又問:那要怎麼避免呢?小花說出現這種情況也和框架有關,像WinForm為了讓所有UI操作都在主線程中執行,就添加了一個SynchronizationContext類實例用以表示當前上下文,而像控制台等項目這個SynchronizationContext實例默認為null,所以即使使用.Result也不會死鎖。但最好使用異步的時候不要用.Result,可以使用ConfigAwait(false)指明不捕獲上下文,或所有的方法全部異步到底。

 

小明聽完滿意地回到自己的隔間。

 

更多精彩,請關注我的公眾號:

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

【其他文章推薦】

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

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

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

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

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

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

代碼和設計是如何一步步腐化的

經歷了幾個從商業角度來看或成功或失敗的項目,都會發現代碼、設計都會慢慢地、在不經意間腐化。而且有一個項目開始的時候,架構是經過精心設計的,也有較為嚴格的代碼規範,並且通過靜態代碼檢查來盡量保證代碼的質量,連code review都有一個可供參考的checklist。但半年一年之後,還是會發現,很多代碼都已經臃腫走樣,到處都是複製粘貼,動輒好幾千行代碼的模塊,能 work、但不 right的代碼。

getting it work is easy
getting it right is hard

不禁想問問代碼和設計是如何一步步腐化的?

本文地址:https://www.cnblogs.com/xybaby/p/13173047.html

代碼如何開始腐爛

其實大家都聽說過 clean code,但不一定真正意識到其重要性,且知道並不等同於做到,而時間更是一把殺豬刀,讓程序員禿了,讓代碼爛了。

一個新項目開始的時候,大家都是滿懷壯志,期待靈活可復用的架構,期待成功的產品。與此同時,敏捷開發告訴我們不要過度設計,當然,本身也是很難預料到以後需求變化的方向,於是應該等到第一次變化的時候才去考慮如何重構以應對這一類型的變化。但問題很可能就會出現在這裏。

也就是說,也許哪一天,當我們需要加一個新功能的時候,會發現原來的設計和代碼不是很方便增加這個新功能。當然,我們不應該過多苛責之前的設計,因為以前沒有預料到這個新功能,也就沒有在這個地方引入抽象。這個時候有兩種解決辦法:第一種是重構術,就是加功能之前先了解、重構已有的代碼,比如調整一下類的基礎體系、抽象出基類、或者引入一個間接層以隔離變化。另一種則是修補術,在現有的函數中加一個 if-else(或者 switch case)、在現有的類中加幾個特殊字段。這兩種方法都能解決問題,修補術治標,重構術治本,但顯然,治標來得更快,治本對程序員的要求更高。

什麼時候程序員會選擇修補術而不是重構術呢?

也許這個程序員看過 clean code、refactor,精通設計模式和面向對象,也非常希望維護一份漂亮的代碼。但我們知道,重構是需要時間的,而且還可能引入bug。也許重構耗費的時間就超過了用修補術 workaround 的時間,就短期來說,修補術的性價比是更高的。那麼長遠來說呢,也許重構術的性價比更高?可是只顧眼前、及時行樂是人的本能,走捷徑、偷懶是無時不存在的誘惑。當然,也許有追求的程序員會抵制這種誘惑,但是社會心理學告訴我們,在壓力、干擾面前我們很難理智思考,自控力也會失效。時間、進度壓力就是垂懸在程序員頭上的達摩克利斯之劍,這壓力可能讓人失眠、讓人頭禿,寫點垃圾代碼似乎也無可厚非。

況且,重構還可能引入bug,重構的前提是要有完備的測試機制,單元測試、功能測試、集成測試一個都不能少。可是,理想很豐滿,現實很骨感,單元測試覆蓋率往往不足,而且還可能依靠手動回歸測試。把代碼重構好了可能壓根沒人知道,沒人來感謝你、給你點個贊,但萬一重構出了bug呢,大家都會收到事故報告,說不定還會影響KPI?不求有功但求無過,Leader、經理是否認可重構的價值,也很大程度影響組員對於重構的积極性。

當然,增加新功能的也許是一個新手,新手加入團隊后,一般就是從維護某個模塊,實現一些小需求入手。新手有可能水平本身就不行,而且業務邏輯和代碼都是陌生的,如果缺乏完善的文檔以及足夠的掌握,新手是萬萬不敢重構的,修補術是最自然的選擇,複製、粘貼、稍微修改一下、build、run,成功啦!又實現了一個需求!你知道,新人是急於證明自己的,快速的實現一個又一個需求是證明自己的最佳辦法。

你有可能說,新人不是應該有個導師嗎,導師得review新人的代碼啊。首先,導師得懂這一塊業務;其次,導師得願意花時間指導新人。指導新人是否影響導師的KPI呢?帶好了是否有獎,出問題了是否有懲?如果全憑導師自律,這個不確定性就太大了。

上面提到的是新人,其實老手也可能寫出“德不配位”的代碼,比如一個需求,可能涉及到多個模塊,有的模塊是這個老手負責的,有的則不是。理想的情況下,各個模塊提供好接口供老手調用即可,但某個模塊的負責人很忙,沒有時間,這個時候老手就會直接去修改相應模塊。可是,可能由於老手特有的自尊、或者面子,老手往往不願意去請教對應模塊的負責人,而是按照自己的經驗魔改出一段可以工作,但既不優雅、也不高效的代碼。

代碼如何加速腐爛

所以說,由於進度壓力、經驗、態度等各種各樣的原因,代碼中慢慢就會開始出現腐朽的問題。可怕的是,垃圾的代碼給出了錯誤的示範,這種示範對於新手或者對於這個模塊不熟悉的同事來說都很強烈,也使得垃圾的代碼、倍增的維護成本、潛在的bug被到處複製,美其名曰“借鑒”。破窗效應,讓後來人寫出垃圾代碼的時候毫無心理負擔,“以前就是這個樣子的”,以前這裡有個變量叫temp,我只是加了個變量叫temp1;以前這裏就有switch case,我只不過加了一個case;以前的代碼就很難讀懂了,於是我copy的一份實現自己的邏輯。

況且,到項目後期,可能不再那麼掙錢了,可能最初寫代碼、制定規範的人已經不再了,誰還會來關心這代碼質量呢?

悲觀的認為,代碼的腐化是必要,只是時間快慢問題。

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

【其他文章推薦】

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

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

※台北網頁設計公司全省服務真心推薦

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

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

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