Accelerate Framework in Swift

介紹:

      最近看到這篇文章有對Accelerate框架有一個介紹,自己也按照作者給的思路整理了一遍,也算是對這一框架的一個重新的回顧和學習,在以前研究AR先關只是的時候有接觸到這個框架,贊具體裏面的東西沒有好好的實踐一下,文章中有一些關於向量和矩陣運算的實際的Swift例子。可以簡單的看一下。

     Introduction to the Accelerate Framework in Swift

     關於這個框架和文章其實在前面介紹iOS框架系列文章的時候有提過(第一篇),對這個框架有不清楚是做什麼的可以翻翻我以前總結的文章。 

     由於下面的運算都是些向量和矩陣的運算,要是不清楚他們的概念和運算規則的可以看下面,先了解清楚再往下看,這些具體的內容在項目當中其實還是會用到的,比如說視頻編碼處理、AR等等。

     向量

     矩陣

 

Accelerate

 

      使用之前請先導入這兩個框架:

      NOTE: 下面所有的例子全都是在 Playground 運行驗證

import UIKit
import Accelerate
import simd

      1、cblas_saxpy  

      函數cblas_saxpy(_:_:_:_:_:_:)是一個計算常數乘以一個向量加上一個向量的函數,具體的使用看下面的例子:

var x:[Float] = [1,2,3]
var y:[Float] = [4,5,6]

cblas_saxpy(3, 10, &x, 2, &y, 2)

      具體的驗證結果和詳細的函數參數說明我們會在下面展示,大家可以先看上面給出的函數的說明推導一下結果:

      2、cblas_sdot 這個函數能幫助我們計算出兩個向量的數量積:  ∑ a[i] * b[i] 

y = [4,5,6]
/// x*y = (1*4)+(2*5)+(3*6) = 32
/// 這個函數的具體的參數可以參考上面
cblas_sdot(3, &x, 1, &y, 1)

      3、sgesv_ 這個函數可以幫我們解方程,比如下面的三元三次方程,具體的驗證你可以自己嘗試一下,了解一下函數的參數的意義,我們已經驗證過就不再重複結果。

/// 下面我們解一個三元方程
/// 7x+5y-3z = 16
/// 3x-5y+2z = -8
/// 5x+3y-7z = 0
typealias LAInt = __CLPK_integer

var A:[Float] = [

    7, 3, 5,   /// x
    5, -5,3,   /// y
    -3,2,-7    /// z
]

var b:[Float] = [16,-8,0]

/// 定義要解的是一個幾元方程
let equations = 3
/// 方程的個數
var numberOfEquations:LAInt = 3
var columnsIntA:LAInt = 3
var elementsIntB:LAInt = 3
/// 解的個數
var bSolutionCount:LAInt = 1
/// 驗證是否計算有問題
var outputOk:LAInt = 0
/// [0,0,0]
var pivot = [LAInt](repeating: 0, count: equations)

/// 參數定義(按順序):求解的線性方程個數、解的個數、係數矩陣A、
/// 矩陣A的列數、排列矩陣、係數向量B、向量B的列數、輸出值。
sgesv_(&numberOfEquations, &bSolutionCount, &A, &columnsIntA, &pivot, &b, &elementsIntB, &outputOk)

/// outputOk == 0 說明一切計算正確
outputOk

/// 這個結果就是我們想要的答案 [1, 3, 2]
b

 

simd + vecLib + vDSP

       

      具體的這三個框架的內容文章中有介紹過,我們這裏主要的還是驗證和實踐一下裏面的例子,看下面的代碼。

      1、矩陣的加法運算,看下面的例子,注意下面的不是向量的加法,留意區別不要混淆,代碼簡單我直接截圖順便看驗證結果:

       2、vvfabsf 求絕對值的運算,代碼如下:

/// fabs 求絕對值
func floats(_ n:Int32) -> [Float]{
    return [Float] (repeating: 0, count: Int(n))
}

var count:Int32 = 4
var aAbsoAbsolute = floats(count)

var c:[Float] = [-1,-2,-3,-4]
vvfabsf(&aAbsoAbsolute, &c, &count)

/// [1,2,3,4] 
aAbsoAbsolute

      3、vvintf 小數取整求絕對值

c = [9.987,6.576,-3.345,-4.9]
var bAbsoAbsolute = floats(count)
vvintf(&bAbsoAbsolute, &c, &count)

/// [9, 6, -3, -4]
bAbsoAbsolute

      4、sqrtf 開平方根

/// sqrt 開平方根  sqrtf()
c = [25,16,9,4]
var cAbsoAbsolute = floats(count)
vvsqrtf(&cAbsoAbsolute, &c, &count)

/// [5, 4, 3, 2]
cAbsoAbsolute

      5、分數取逆 這時候是分母和分子互換位置在做計算得來的

/// 分數取逆 這時候是分母和分子互換位置在做計算得來的
var d:[Float] = [1/3,1/5,3/9,4/2]
var dAbsoAbsolute = floats(count)
vvrecf(&dAbsoAbsolute, &d, &count)

/// [3, 5, 3, 0.5]
dAbsoAbsolute

      6、vDSP_vdist 這個例子其實也很有趣的,具體的例子說明可以參考最上面文章的最後一個例子,我們直接看代碼和驗證的結果,代碼裏面有比較詳細的說明,還是值得一看的,能幫助我們回憶鞏固一些知識點:

var points:[CGPoint] = [
    
    CGPoint(x: 0, y: 0),
    CGPoint(x: 0, y: 10),
    CGPoint(x: 0, y: 20),
    CGPoint(x: 0, y: 30),
    CGPoint(x: 0, y: 40),
    CGPoint(x: 0, y: 50),
    CGPoint(x: 0, y: 60),
    CGPoint(x: 0, y: 70),
    CGPoint(x: 0, y: 80)
]
 
let path = UIBezierPath()
path.move(to: points[0])
 
// IMP: Remove the space between the < and points
for i in 1 ..< points.count {
    path.addLine(to: points[i])
}

var xs = points.compactMap { (point) -> Float? in
    return Float(point.x)
}

var ys = points.compactMap { (point) -> Float? in
    return Float(point.y)
}

var distance:[Float] = [Float](repeating: 0, count: points.count)

vDSP_vdist(&xs, 1, &ys, 1, &distance,1,vDSP_Length(points.count))

/// 遍歷
distance.map {$0}

/// 順便幫忙在加深一下對 reduce 函數的理解
/// 給一個初始值 然後對集合的每一個元素進行操作
distance.reduce(0, +)

let initialResult:Float = 0
var reduceResult =  distance.reduce(initialResult) { (tempResult,element) -> Float in
    return tempResult + element
}

reduceResult

     下面是上面例子的結果驗證: 

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

【其他文章推薦】

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

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

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

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

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

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

中國四部委再次要求 破除新能源車地方保護

中國財政部等四部委近日聯合公布了第二批新能源汽車推廣應用城市名單,公告再次明確提出了破除新能源汽車地方保護的要求。業內人士表示,京滬兩大新能源汽車推廣主力城市需要拿出姿態,以警示後續的地方保護行為。

去(2013)年9月17日,財政部曾在公布的新一輪新能源汽車補貼政策中明確指出,示范城市或區域推廣應用的車輛中外地品牌數量不得低於30%,且不得設置或變相設置障礙限制採購外地品牌車輛。

隨著國家扶持新能源汽車相關政策不斷出台,北京、上海、天津等地紛紛打造當地新能源汽車產業,考慮到利於當地企業的發展,在引入外非本地企業的新能源汽車品牌時,會制定一些差異化條款,比如優先購買本地新能源汽車等。

因此在國家推薦的節能與新能源汽車產品目錄之下,地方政府還設定了一個地方性的產品目錄。其中,北京與上海市場針對外地新能源汽車品牌皆有相應的條件要求。

重慶、呼和浩特等地也紛紛提出,採購和補貼的對象是符合當地政府認定的新能源汽車。天津、河南等地在節能與新能源汽車採購對象上也明確規定,在技術、服務等指標滿足採購需要的前提下,優先採購納入政府採購范圍的電動汽車。

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

【其他文章推薦】

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

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

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

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

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

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

曠世提出類別正則化的域自適應目標檢測模型,緩解場景多樣的痛點 | CVPR 2020

論文基於DA Faster R-CNN系列提出類別正則化框架,充分利用多標籤分類的弱定位能力以及圖片級預測和實例級預測的類一致性,從實驗結果來看,類該方法能夠很好地提升DA Faster R-CNN系列的性能

來源:曉飛的算法工程筆記 公眾號

論文: Exploring Categorical Regularization for Domain Adaptive Object Detection

  • 論文地址:https://arxiv.org/pdf/2003.09152.pdf
  • 論文代碼:https://github.com/Megvii-Nanjing/CR-DA-DET

Introduction

  由於標註成本大,在訓練好檢測算法后,面對差異較大的新場景(類別不變),若想獲取大量的帶標註圖片進行再訓練是很不方便的。對於這種情況,無監督的域自適應方法能夠靈活地自適應新場景,從包含豐富標註信息的源域轉移到無標註的目標域。其中,域自適應方法中比較有代表性的是Donamin Adaptive(DA) Faster R-CNN系列,利用對抗訓練來對齊圖片和實例的分佈,使得模型能夠做到域不變性,具體可以看上一篇介紹。
  但是這些方法大都把無法轉化的背景內容也進行了對齊,而且在實例對齊時,沒有從包含較多低質量的proposal集合中識別出難樣本。為了解決上面的問題,論文提出類別正則化框架,幫助DA Faster R-CNN專註於對齊跨域中的關鍵區域和重要目標。
  論文的主要貢獻如下:

  • 提出新的類別正則化框架,作為域自適應目標檢測算法的插件,不需要額外的標註和超參數。
  • 設計了兩個正則化模塊,分別用於榨取卷積分類器的弱定位能力以及圖像級別預測和實例級別預測間的類別一致性,能夠幫助分類器專註於對齊目標相關區域以及難對齊實例。
  • 對多種域轉移場景進行實驗,驗證論文提出的方法的有效性。從實驗結果來看,類別正則化框架能夠提出DA Faster R-CNN系列方法的性能,並在基礎數據集上達到SOTA。

Approach

Framework Overview

  論文方法的整體架構如圖2,在DA Faster R-CNN基礎上添加了ICR(image-level categorical regularization)和CCR(categorical consistency regularization),能夠更好地對齊域間的關鍵區域和重要實例。

Image-Level Categorical Regularization

  ICR的主要目的是提高主幹網絡的目標特徵提取能力,同時降低背景的激活。結構如圖2b所示,ICR使用源域數據進行有監督訓練,對主幹網絡的特徵輸出進行全局池化,再使用多標籤分類器($1\times 1$卷積)進行分類,損失函數使用標準交叉熵多標籤損失:

  $C$為類別總數,$yc$為GT標籤,$\hat{y}c$為預測標籤,$y^c=1$表示圖片至少包含一個類別$c$物體。

 ICR模塊利用多標籤分類器的弱定位能力,能夠有監督地引導主幹網絡只激活類相關特徵。如圖3所示,類相關的特徵會有較高的激活值。在圖像級對齊時,能夠對齊域間關鍵區域,同時,由於背景沒有參与到圖像級多標籤分類器中,能夠有效減少擬合不可對齊的源背景的可能性。

Categorical Consistency Regularization

  CCR負責發現難對齊實例,調整實例級對齊損失的權重,基於兩點考慮:

  • 由於不能區分前景和後景,實例對齊模塊可能被低質量背景proposal佔據。
  • 添加的圖像級分類器和實例檢測head是互補的,前者負責獲取所有圖像級上下文信息,後者使用精確的RoI特徵,當兩者預測不一致時,該實例就是難樣本。

  基於以上考慮,論文採用圖像級預測和實例級預測的類別一致性作為目標分類難易程度的判斷,並在目標域中使用該一致性作為正則因子,調節難對齊樣本在實例對齊中的權重。假定$\hat{p}{c}_j$為預測第$j$個實例為類別$c$的概率,$\hat{y}c$為實例預測包含類別$c$的概率,類別一致性的計算為

  使用公式5來加權實例級對抗損失

  需要注意,僅對目標域的檢測head預測為前景的實例使用公式5加權,源域的所有實例和目標域的背景實例均使用$d_j=1$,前者因為是有監督的,而後者則是因為不重要。

Integration with DA Faster R-CNN Series

  將論文提出的方法加入到DA Faster R-CNN中,ICR為直接加入,CCR為對原損失的修改,最終的損失函數為

  論文也對比了另外一種主流的DA -Faster改進SW-Faster,該方法使用弱全局對齊模型來提升DA-Faster的強圖像對齊模塊,直接加入ICR和CCR,最終的損失函數為

Experiments

Comparison Results

  Faster R-CNN(Source)僅使用源域訓練,Faster R-CNN(Oracle)僅使用目標域訓練。

  • Weather Adaptation

  這裏對比模型對天氣的自適應性。

  • Scene Adaptation

  這裏對比模型對不同城市的場景的自適應性。

  • Dissimilar Domain Adaptation

  這裏對比模型對真實圖片和卡通圖片的自適應性。

Visualization and Analyses

  對前面對比實驗的目標域測試圖片進行了可視化。

  將特徵降維並可視化,藍點為源域樣本,紅點為目標域樣本,可以看到論文的方法能夠讓域間的同分類實例距離更近。
  論文也計算了域間距離,使用Earth Movers Distance (EMD) 測量,SW-Faster, SW-Faster-ICR and SW-FasterICR-CCR的結果分別是8.84、8.59和8.15。

CONCLUSION

  論文基於DA Faster R-CNN系列提出類別正則化框架,充分利用多標籤分類的弱定位能力以及圖片級預測和實例級預測的類一致性,從實驗結果來看,類該方法能夠很好地提升DA Faster R-CNN系列的性能。



如果本文對你有幫助,麻煩點個贊或在看唄~
更多內容請關注 微信公眾號【曉飛的算法工程筆記】

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

【其他文章推薦】

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

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

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

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

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

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

特斯拉今年或沿京滬高速布局充電設施

據阿思達克財經報導,特斯拉產品專家表示,特斯拉預計第二或者第三季度在上海開店,同時,特斯拉在中國的充電設施首先會沿著京滬高速布局,只是具體布局時間暫不確定。

上述人士表示,特斯拉(Tesla)中國客戶現在訂車,將於今年年底拿到車。上海客戶屆時則可以直接在上海提車,不需要自己出錢把車從北京提到上海。另外,特斯拉客戶可以用自己的燃油車車牌置換,或者參與上海市拍牌。

據介紹,特斯拉在中國大陸目前有6輛,北京店有3輛上牌車,還有3輛試駕車。

針對客戶關心的充電問題,該產品專家表示,客戶購買特斯拉的車價裡面已經包含了充電樁費用,消費者不會再另外花錢購買充電樁,隻需要再支付從物業拉電到車位的材料、人工等費用。

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

【其他文章推薦】

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

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

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

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

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

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

未來3到4年 Tesla規劃在中國生產電動汽車

特斯拉(Tesla)執行長 Elon Musk 昨(21) 日在華盛頓 Geekpark 大會上表示,公司正準備交付首批S型號的電動車給中國的客戶。Tesla 也正在中國佈建“龐大”的充電站網路,包括在北京及上海的超級充電站。Musk預期,未來 3 ~4 年內,Tesla 公司將開始在中國生產電動汽車。

在中國本土生產可避免繳付中國25%的入口關稅,因此可讓公司降低電動車售價。Tesla 公司預測,最快在明年,其在中國市場的銷售量將追平在美國的銷量。

配備85千瓦時電池的S型號電動車,在中國的售價為73.4萬元人民幣(約11.8萬美元),遠高於在美國未計聯邦稅務寬減前的售價約為7.1萬美元,因為加入了運費、增值稅及入口稅。

該公司自去年8月開始接受中國客戶的訂購,並在去年底於北京一個商場開設了一個800平方米的銷售點,展示其電動車。

中國商務部:今年是電動汽車消費元年

中國政府竭盡所能想讓人們購買使用電動汽車,以改善中國的空氣污染問題,而 Musk 相信,Tesla 能幫助中國政府達成這一目標。

中國商務部研究院消費經濟研究部主任趙萍近日在《2014年消費市場發展報告》新聞發布會上表示,今年將是電動汽車消費元年。政策、產品、設施「三位一體」協同推進,意味著今年將迎來中國汽車電子市場的蓬勃發展。

趙萍指出,今年限購或將席捲更多城市,使汽車消費在一二線主要城市遭遇到行政力量預製的「天花板」。由於空氣污染等環境壓力,中國汽車市場的產銷趨勢將存在較大的不確定性,自主品牌也將遭受到更大的挑戰。佔社會消費品零售總額比重高達1/4的汽車消費增速放緩,將會降低總消費增長對汽車的過度依賴。

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

【其他文章推薦】

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

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

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

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

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

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

java併發之volatile關鍵字

Java面試中經常會涉及關於volatile的問題。本文梳理下volatile關鍵知識點。

volatile字意為“易失性”,在Java中用做修飾對象變量。它不是Java特有,在C,C++,C#等編程語言也存在,只是在其它編程語言中使用有所差異,但總體語義一致。比如使用volatile 能阻止編譯器對變量的讀寫優化。簡單說,如果一個變量被修飾為volatile,相當於告訴系統說我容易變化,編譯器你不要隨便優化(重排序,緩存)我。

Happens-before

規範上,Java內存模型遵行happens-before

volatile變量在多線程中,寫線程和讀線程具有happens-before關係。也就是寫值的線程要在讀取線程之前,並且讀線程能完全看見寫線程的相關變量。

happens-before:如果兩個有兩個動作AB,A發生在B之前,那麼A的順序應該在B前面並且A的操作對B完全可見。

happens-before 具有傳遞性,如果A發生在B之前,而B發生在C之前,那麼A發生在C之前。

如何保證可見性

多線程環境下counter變量的更新過程。線程1先從主存拷貝副本到CPU緩存,然後CPU執行counter=7,修改完后寫入CPU緩存,等待時機同步到主存。在線程1同步主存前,線程2讀到counter值依然為0。此時已經發生內存一致性錯誤(對於相同的共享數據,多線程讀到視圖不一致)。因為線程2看不見線程1操作結果,也將這個問題稱為可見性問題

public class SharedObject {
    public int counter = 0;
}

因為多了緩存優化導致,導致可見性問題。所以volatile通過消除緩存(描述可能不太準確)來避免。例如當使用volatile修飾變量后,操作該變量讀寫直接與主存交互,跳過緩存層,保證其它讀線程每次獲取的都是最新值。

    public volatile int counter = 0;

volatile 不單隻消除修飾的變量的緩存。事實上與之相關的變量在讀寫時也會消除緩存,如同使用了volatile一樣。

如下 years,months,days 三個變量中只有days是volatile,但是對years,months讀寫操作也和days時也會跳過緩存,其它線程每次讀到的都是最新值。

public class MyClass {
    private int years;
    private int months
    private volatile int days;
    public int totalDays() {
        int total = this.days;
        total += months * 30;
        total += years * 365;
        return total;
    }
    public void update(int years, int months, int days){
        this.years  = years;
        this.months = months;
        this.days   = days;
    }
}

這是為什麼?我們分析一下。

一個寫線程調用 update,讀線程調用totalDays。單線程中,對於update方法,wa與wb存在happens-before關係, wawb 之前執行並對wb可見。

多線程中rc與wb存在happens-before關係,wbrc之前執行並對rc可見。根據 happens-before傳遞性,wa需要在rc前先執行並對rc可見。

因為wb是volatile變量,所以rc獲取的years,months也是最新值。

我們知道出於性能原因,JVM和CPU會對程序中的指令進行重新排序。如果update方法裏面wawb順序被重排,那它們的happens-before關係將不在成立。

為了避免這個問題,volatile對重排序做了保證 對於發生在volatile變量操作前的其他變量的操作不能重新排序

由此我們得到volatile通過消除緩存防止重排保證線程的可見性。

volatile保證線程安全?

討論線程安全,大家都會提及原子性順序性可見性。volatile側重於保證可見性,也就是當寫的線程更新后,讀線程總能獲得最新值。在只有一個線程寫,多個線程讀的場景下,volatile能滿足線程安全。可如果多個線程同時寫入volatile變量時,則需要引入同步語義才能保證線程安全。

模擬10個線程同時寫入volatile變量,一個線程讀counter,執行完后正確結果應該是counter=10。

    public static class WriterTask implements Runnable {
        private final ShareObject share;
        private final CountDownLatch countDownLatch;
        public WriterTask(ShareObject share, CountDownLatch countDownLatch) {
            this.share = share;
            this.countDownLatch = countDownLatch;
        }
        @Override
        public void run() {
            countDownLatch.countDown();
            share.increase();
        }
    }
    
    public class ShareObject {
        private volatile int counter;
        public void increase() {
            this.counter++;
        }
    }

執行結果出現counter=5或6 錯誤結果。

通過 synchronized,Lock或AtomicInteger 原子變量保證了結果的正確。

完整demo https://gist.github.com/onlythinking/ba7ca7aa5faf00a58f4cedae474fa6f6

volatile性能

volatile變量帶來可見性的保證,訪問volatile變量還防止了指令重排序。不過這一切是以犧牲優化(消除緩存,直接操作主存開銷增加)為代價,所以不應該濫用volatile,僅在確實需要增強變量可見性的時候使用。

總結

本文記錄了volatile變量通過消除緩存,防止指令重排序來保證線程可見性,並且在多線程寫入的變量的場景下,不保證線程安全。

歡迎大家留言交流,一起學習分享!!!

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

【其他文章推薦】

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

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

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

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

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

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

緬甸小象成功獲救 凸顯盜獵危機仍在

摘錄自2019年10月2日自由時報報導

據《路透》報導,緬甸Wingabaw大象庇護營上個月在該國西南部森林,拯救了一隻誤入盜獵者陷阱的4個月大幼象,她的左前腿遭陷阱夾傷,父母推測也慘遭盜獵者殺害。

現在這隻被命名為艾雅‧賽恩(Ayeyar Sein),雖然腳上還戴著以竹子和繃帶做成的夾板,但在定期清理傷口之下,賽恩的恢復狀況良好,食慾也逐漸恢復正常。

據專家2018年統計報告指出,目前緬甸僅存1400至2000頭野生象,並有5000頭大象遭囚禁,凸顯出緬甸所面臨的盜獵危機。

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

【其他文章推薦】

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

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

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

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

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

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

航向公海 海洋吸塵器首次成功收集垃圾

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

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

【其他文章推薦】

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

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

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

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

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

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

Jmeter系列(30)- 詳解 JDBC Request

如果你想從頭學習Jmeter,可以看看這個系列的文章哦

https://www.cnblogs.com/poloyy/category/1746599.html

 

前言

  • JDBC Request 主要是向數據庫發送一個 JDBC 請求(sql 語句),並獲取返回的數據集
  • 它需要和數據庫連接池配置(JDBC Connection Configuration)一起使用,可參考此篇博文:https://www.cnblogs.com/poloyy/p/13182706.html

 

JDBC Request

 

JDBC Request 界面介紹

 

字段含義

字段 含義

Variable Name Bound to Pool

數據庫連接池配置的名稱

Query Type

sql 語句的類型

SQL Query

  • sql 語句
  • 語句結尾不需要添加 ; 
  • 變量用 ? 佔位

Parameter values

需要傳遞的變量值,多個變量用 , 分隔

Parameter types

變量類型

Variable Names

  • 保存sql語句返回的數據和返回數據的總行數
  • 用 , 分隔
  • 跳過列用空

Result Variable Name

一個 Object 變量存儲所有返回值

Query timeout(s)

超時時間;默認0,代表無限時間

Limit ResultSet

和 limit 類似作用,限制 sql 語句返回結果集的行數

Handle ResultSet

如何定義 callable statements 返回的結果集;默認是存儲為字符串

後續通過各種栗子來深入理解常用字段的含義

 

舉栗子的前提

需要自己找一個有數據庫的數據來練手哦!這裏拿的表數據如下哈

 

只有 sql 語句的栗子

JDBC Request

沒啥特別的,平時 sql 怎麼寫,這裏就怎麼寫

 

運行結果

 

參數化的栗子

JDBC Request

 

運行結果

 

知識點

  • 有幾個問號,Parameter value、Parameter type 填寫值的數量要保持一致,用,分隔
  • 問號其實是佔位符,如果學過編程的童鞋應該也知道這種寫法,可以避免 SQL 注入的問題
  • sql 中使用佔位符時,Query Type 必須選擇 Prepared Select Statement 或者 Prepared Update Statement 
  • 我們可以用 Jmeter 變量去賦值,看下面栗子

 

參數化+變量的栗子

JDBC Request

 

運行結果

 

知識點

  • 如果在 sql 語句中使用變量,且是字符串類型,需要加上引號(前提是變量值沒有加引號),如 ${name} 
  • 如果在 Parameter values 中使用變量,且是字符串類型,不需要加上引號,只需要在 Parameter types 里寫明為 varchar 即可

 

使用 Variable Names 的栗子

結構樹

 

JDBC Request

添加一個 Debug Sampler 就知道這個字段有什麼作用了

 

JDBC Request 運行結果

 

調試取樣器運行結果

 

知識點

  • mysql:數據庫連接池對象
  • a_#、b_#、c_#、d_#:代錶行數
  • a_1:第 1 行、第 1 列
  • b_2:第 2 行、第 2 列
  • c_3:第 3 行、第 3 列
  • d_3:第 3 行、第 4 列
  • 以此類推….
  • 一般如果 HTTP 請求需要用到 sql 查出來的數據的話,就會用到 Variable names 這個字段

 

使用 Result variable name 的栗子

JDBC Request

 

Debug Sampler  運行結果

 

知識點

該變量是個數組,每一個元素代表一條記錄

 

重點

關於通過 Variable names、Result variable name 獲取到的值如何提取,我們將在下一篇文章中詳細講解

 

使用 Limit ResultSet 的栗子

JDBC Request

 

 

運行結果

 

知識點

  • Limit ResultSet 是對 sql 語句返回的結果集限制行數
  •  limit 10 限制只返回了 10 條數據,然後 Limit ResultSet = 6 限制結果集最終只返回 6 條數據

 

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

【其他文章推薦】

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

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

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

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

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

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

Day10-微信小程序實戰-交友小程序-實現刪除好友信息與子父組件間通信

回顧:上一次已經把消息的布局以及樣式做好了

效果圖:

 

 在removeList.js文件中,messageId就是發起這個消息的用戶了

先查看一下自定義組件的生命周期

https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/lifetimes.html

 lifetimes: {
    attached: function() {
      // 在組件實例進入頁面節點樹時執行
    },
    detached: function() {
      // 在組件實例被從頁面節點樹移除時執行
    },
  }

直接就是在lifttimes裏面進行定義的(直接就是在methods的同級的下面加上即可了)

因為要對用戶的信息進行渲染,就可以看成是一個一個的對象,所以就可以在removeLIst.js中定義一個對象

然後遇到的問題就和之前是一樣的了,就是我們得到的數據太多了,沒必要全部都要,可以選擇性的要,只需要頭像和昵稱

(所以就可以在get前面來一個field)

lifetimes: {
    attached: function () {
      // 一進來就會進行它了
      db.collection('users').doc(this.data.messageId)
      .field({
        userPhoto : true,
        nickName : true
      })
      .get().then((res)=>{
        this.setData({
            userMessage : res.data
        });
      });
    }
  }

這樣的話我們在這個頁面裏面就可以得到用戶的數據了,剩下的就是直接可以在wxml中用了

<!--components/removeList/removeList.wxml-->
<movable-area class="area">
     <movable-view direction="horizontal" class="view">{{ userMessage.nickName }}</movable-view>
     <image src="{{ userMessage.userPhoto }}" />
     <view class="delete">刪除</view>
 </movable-area>

效果圖:

 

 在之後設置刪除功能之前,先設置一下就是只要點擊了消息列表中用戶的頭像之後,就可以跳轉到這個用戶的詳情頁了

可以直接 在編輯個人信息的頁面 editUserInfo.wxml中COPY代碼  

在設置這個跳轉頁面的url的時候,因為同時要給這個url傳遞參數的,所以這個時候就要用大括號括起來了

<!--components/removeList/removeList.wxml-->
<movable-area class="area">
     <movable-view direction="horizontal" class="view">{{ userMessage.nickName }}</movable-view>
     <navigator url="{{'/pages/detail/detail?userId=' + userMessage._id}}" open-type="navigate">
     <image src="{{ userMessage.userPhoto }}" />
     </navigator>
     <view class="delete">刪除</view>
 </movable-area>

即可實現,點擊頭像跳轉到個人的詳情頁面

 

二、下面就是對刪除功能進行設計

一開始的就是,點擊了之後,要給用戶一個提示信息,讓用戶可以選擇是取消還是確定的,這裏用的是一個wx.showModel這樣一個內置的方法

 

所以就要另外的給“點擊了確定”加邏輯了,就要在微信開放文檔裏面細看這個API了

https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.showModal.html

wx.showModal({
  title: '提示',
  content: '這是一個模態彈窗',
  success (res) {
    if (res.confirm) {
      console.log('用戶點擊確定')
    } else if (res.cancel) {
      console.log('用戶點擊取消')
    }
  }
})

把查到的賦值給list,然後在用數組的filter進行刪除即可了

通過fileter過濾之後,就是過濾初和我們不想要的東西,然後把這些東西再次賦值為list,然後我們把前後的list打印出來會發現:

 

 確實是過濾掉了的

 由於如果要刪掉的話,就設計了removeList這個組件和message這各頁面之間的通信了,並且是子組件像父組件,用到事件來做的

https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html

<!-- 當自定義組件觸發“myevent”事件時,調用“onMyEvent”方法 -->
<component-tag-name bindmyevent="onMyEvent" />
<!-- 或者可以寫成 -->
<component-tag-name bind:myevent="onMyEvent" />

所以在message.wxml中隊子組件remove-list設置

<remove-list wx:for="{{ userMessage }}" wx:key="{{index}}" messageId="{{ item }}"
     bindmyevent="onMyEvent"/> 
    

這樣事件監聽就寫好了,但是如何在組件中觸發呢,我們回到removelist.js中

繼續查看山脈的鏈接-微信開發文檔

Component({
  properties: {},
  methods: {
    onTap: function(){
      var myEventDetail = {} // detail對象,提供給事件監聽函數
      var myEventOption = {} // 觸發事件的選項
      this.triggerEvent('myevent', myEventDetail, myEventOption)
    }
  }
})

在removelist.js中通過:

 this.triggerEvent('myevent',list) 

前面參數,要和在 message.wxml設置的 bindmyevent,後面的myevent對應上

第二個參數就是我們 過濾剩下的list

給message傳過去之後

  onMyEvent(ev){
  this.setData({
    userMessage : ev.detail
  });

通過這樣的設置出現了一個bug,就是我們刪除第一條信息的時候,直接把第二條刪掉了,第一條被留下來了

當我們查看數據庫的時候,留下來的就是第二條信息,但是在前端显示的是第一條信息留下,第二條信息沒了

要這樣修改:

onMyEvent(ev){
    this.setData({
      userMessage : []
    },()=>{
        this.setData({
          userMessage : ev.detail
        });
    });
  }
  

先賦值為空,之後再次調用removelist,再把過濾的數組進行賦值  

 

 

 也就是全部清空之後,再重新渲染的

 

 整個邏輯:

1、在數據庫中用戶的頭像和昵稱找到,然後獲取數據

 

2、點擊刪除按鈕的時候,彈出提示框,如果用戶點了缺點刪除的話,之後我們先查詢

 找到之後,把那個消息在message列表中過濾掉

 

 3、然後再重新的更新,之後就觸發子父通信,把更新之後的list傳給

 

4、父組件拿到removelist這組件的信息

 

 拿到就更新我們的列表,這樣的話列表就發送了變化了

 

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

【其他文章推薦】

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

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

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

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

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

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