陸公布能源車免稅名單 排除特斯拉

為求綠色環保,首批大陸免徵購置稅的新能源汽車名單 29 日公布,大陸知名汽車廠比亞迪、奇瑞等 20 多家入選,將大幅降低購車成本;美國電動汽車廠商特斯拉,被排除在門檻之外。   證券時報援引宏源證券汽車行業分析師指出,目前新能源車輛購置稅率約為 8.5 %,存在銷售價格過高等因素,若免徵購置稅,有效降低購車成本,有助新能源車推廣加速。鳳凰財經報導,「免徵車輛購置稅的新能源汽車車型目錄」自 9 月 1 日起免徵稅。此次公布名單,包括純電動汽車及插電式混合動力汽車。   大陸政府目標至 2015 年新能源汽車達 50 萬輛,到 2020 年 500 萬輛。汽車產業研究公司 Automotive Foresight 統計,今年上半年,大陸新能源轎車銷量為 1.64 萬輛,去年同期僅有 7,322 輛,而去年大陸轎車總體銷量超過 1,800 萬輛。

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

【其他文章推薦】

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

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

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

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

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

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

世界最稀有!罕見「草莓豹」現身

摘錄自2019年10月13日三立新聞網南非報導

日前,南非一處野生動物保護區内,出現一具懷孕長頸鹿的屍體,由於沒有人目擊長頸鹿是被哪種動物殺死,一名對野生動物深感興趣的男子,在長頸鹿屍體附近架設攝影機,想獲得蛛絲馬跡,沒想到,竟拍到超稀有的「草莓豹」身影,讓他又驚又喜!

根據外媒報導,南非薩巴梭羅(Thaba Tholo)野生動物保留區,發現稀有「草莓豹」(Strawberry Leopard)正在撕咬死亡長頸鹿,45歲的亞倫(Alan Watson)和太太琳賽(Lynsey)曾看過這隻毛皮呈粉色的豹在保護區裡晃盪,但一直没機會用相機捕捉牠的英姿,因為牠們偽裝功夫非常好,也很難捉摸。直到今年7月下旬,亞倫發現一只死亡的長頸鹿,他把相機固定在一旁樹上,一個月後才取回相機,想知道到底都拍到了哪些東西,没想到卻驚奇發現,在這些影像裡竟出現一隻「草莓豹」的身影,畫面中的草莓豹正大口撕咬長頸鹿,期間還因發現有攝影機在拍攝,轉頭狠狠瞪了一眼。

據了解,草莓豹又稱「黃金豹」(Golden Leopard),因橘粉色的皮毛而得名,牠們特殊的毛色是基因突變引起,會導致生物體內產生過多的紅色素,而黑色素分泌不足,草莓豹一直到2012年才在南非與波札那(Botswana)邊境的麥迪奎禁獵保留區(Madikwe Game Reserve)被正式發現,是世界上最罕見的豹。

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

【其他文章推薦】

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

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

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

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

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

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

東風日產首款純電動車上市 預4年售5萬輛!

東風日産9月10日開始發售中國專用品牌「啟辰」的首款純電動車「e30(晨風)」,售價為26.78萬元人民幣(約合新臺幣131.2萬元)起。東風日産總經理越晉表示,爭取2018年銷售5萬輛,在中國的EV市場上獲得20%的市佔率。   晨風是一款以日産的純電動車「LEAF」為原型的中國專用車,將在東風日産的主力工廠廣州花都工廠進行生産。東風日産希望在純電動車有望普及的中國,通過儘早啟動當地語系化生産以在環保車市場上佔據先發優勢。

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

【其他文章推薦】

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

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

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

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

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

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

颱風釀河川潰堤 日專家籲打破堤防神話首重離災

摘錄自2019年10月14日中央社報導

日本經濟新聞報導,哈吉貝颱風帶來破紀錄雨量,造成全日本總計超過140條河川氾濫,多處河川潰堤或氾濫,其中一條是位於長野市的千曲川,堤防大約有長達70公尺潰決,讓大水淹進民宅及北陸新幹線機廠,損失慘重。

像哈吉貝這樣會造成重大災害的巨大颱風,未來可能經常性出現,專精河川工學的岡山大學教授前野詩朗呼籲,要把全日本的堤防整建到完全不會潰堤,從財政面來看不切實際,應修正有堅固的堤防應該就能預防水患這樣的「堤防神話」,最重要的是徹底讓民眾有在豪雨來臨時須及早避難這樣的防災意識。

由於堤防潰決導致水災的情況在日本各地相繼發生,東京都江戶川區約有7成地區是低於滿潮水面的「海拔零公尺地帶」,區公所5月時製作災害預測圖呼籲區民一旦發生水患,必須離家避難,並在哈吉貝襲日時的12日上午馬上發出避難勸告。

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

【其他文章推薦】

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

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

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

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

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

※回頭車貨運收費標準

為吸引蘋果投資電池廠 特斯拉擬秀大眾車款 Model 3

美國豪華電動車製造商特斯拉(Tesla)執行長 Elon Musk 透過 Twitter 暗示要在 10 月 9 日發表與字母「D」有關的神秘商品,究竟會有什麼樣的新品出爐,網路謠言為之沸騰。   Global Equities Research 分析師 Trip Chowdhry 發表研究報告指出,特斯拉可能會在 10 月 9 日發表三件大事,分別是「Model S」電動轎車將增添四輪驅動的新車款、新增半自動自動駕駛甫助系統(semi-autonomous driver-assistance system,簡稱 SADAS),還可能推出大眾車款「Model 3」。   barron`s.com、MarketWatch 3 日報導,Chowdhry 指出,特斯拉超大電池廠「GigaFactory」目前仍有三大潛在投資人──LG Chem、三洋電機(Sanyo)以及蘋果(Apple Inc.),倘若特斯拉能夠秀出需要 GigaFactory 供應電池的 Model 3,那麼這 3 家潛在投資者決定投入的機率也會大為上升。從以上跡象來看,特斯拉很可能會發表 Model 3。   另外,Chowdhry 也預期特斯拉到時候會推出具有四輪驅動系統的新版 Model S,而新增添的半自動自動駕駛甫助系統還將使用以色列自駕車相機防撞感測器開發商 Mobileye N.V. 製作的相機鏡頭。     相關閱讀:

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

【其他文章推薦】

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

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

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

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

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

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

Day10-微信小程序實戰-交友小程序-創建friendList字段實現好友關係(添加好友功能)–內附代碼

回顧:之前我們進行了刪除的功能,以及對message消息的增刪,下面實現添加好友的功能

我們先在數據庫中,在message這個字段的list裏面,添加上測試號的id,就是模擬這個兩個測試號要加我主號的效果“

 

 

 

就可以達到這個效果了

 

下面我們正式開始實現

1、在removeList的wxml的昵稱結構處添加一個點擊事件handleAddFriend

2、在removeList.js中來實現這個點擊事件即可的,並且它也是要提示(讓用戶選擇確認的這種,所以就可以直接copy前面的刪除按鈕的代碼

 直接把hanleDelMessage函數裏面的:

   wx.showModal({
        title: '提示信息',
        content: '刪除消息',
        confirmText: "刪除",
        success: (res) => {
          if (res.confirm) {
            
          } else if (res.cancel) {
            console.log('用戶點擊取消')
          }
        }
      })
    }

也就是只用設計在點擊了確定之後的一些列操作即可了

3、因為要構建好友之間的關係,所以要在user裏面加一個friendlist字段才行了,並且這個字段的數據類型是數組的,因為好友肯定不只是一個

4、在數據庫中給每個人都添加一個friendList字段

 

 但是不要忘記了在原來的程序中 初始化 用戶的時候也要加上讀i這個字段的初始化才行的

打開user.js:

 

5、後面的事情大概的邏輯就是:同意了好友申請的話,這個用戶的id就會出現在這個用戶的friendList數組裡面了

所以就可以回到removeList.js文件中去了

6、通過在開頭的時候 設置 const _ = db.command 就可以讓這個文件有了運算的能力了

handleAddFriend(){
      wx.showModal({
        title: '提示信息',
        content: '申請好友',
        confirmText: "同意",
        success: (res) => {
          if (res.confirm) {
              db.collection('users').doc(app.userInfo._id).update({
                data:{
                    friendList : _.unshift(this.data.messageId)
                }
              }).then((res)=>{});
          } else if (res.cancel) {
            console.log('用戶點擊取消')
          }
        }
      })
    }
  }

 

 

在點擊消息之後,就可以選擇“確定”,點擊了之後,就可以在數據庫上面看到添加的用戶好友了

(以上就是第一步,把要申請的用戶的id給添加過來了)—-但是問題來了,我的主號裏面的friendList裏面有了這個申請人的id,但是這個申請人在我

同意了之後,它的friendList字段裏面也應該有我的主號的id才對的—也就是同時添加他們兩個的好友關係即可

 

 但是能不能通過上面的這種方式,把兩個變量之間的值作為交換就可以的,普通的數據庫裏面是可以這樣的。但是在小程序中式不可以這樣進行操作的

(因為在小程序裏面對數據庫的訪問式有權限的,在客戶端是組偶到這樣的操作

(也就是對其他的賬號進行更新操作的話在客戶端裏面是不允許的—同理也是要在服務端裏面來實現的))

–也就是要用雲函數來實現了

7、如果要像的客戶端中調用unshift一樣的話在服務端裏面進行調用的話,之前也搞過就是用一個模板字符串的寫法 用Esc下面的那個 “類單引號”的符號

來進行包裹就好了

 wx.cloud.callFunction({
            name : 'update',
            data : {
              collection : 'users',
              doc : this.data.messageId,
              data : {
                friendList: ` _.unshift('${app.userInfo._id}')`
              }
            }
          });

 

 出現的錯誤就是,我們把unshift也一起搞過來了,也就是我們傳過去的字符串沒有解析成功

 主要就是下面這裏寫錯了

 data : `{ friendList:  _.unshift('${app.userInfo._id}')}`

是把後面整個的串都用一個`   ….   `來圍住的(也就是後面整個的json對象都直接被這個符號扣住的)

 

修改了之後就成功了

 

8、新建一個removeMessage 函數,可以直接copy上面的handledelMessage方法裏面的:這個函數主要是為了點擊這個消息加好友的時候,可以選擇是

添加它為好友,就是在點擊了添加好友之後,就要把這個消息刪掉了,所以這兩個地方都用到了這個功能的話,就可以把這個功能封裝在removeMesage函數裏面,如何直接用this.removeMessage來調用即可了

效果就是:點擊了添加它為好友之後,這個申請為好友的消息就會被刪掉了

 

 

db.collection('message').where({
            userId : app.userInfo._id
          }).get().then((res)=>{
              // console.log(res);
              let list = res.data[0].list;
            console.log(list);
              list = list.filter((val , i)=>{
                  return val != this.data.messageId
              });
              // console.log(list);
              wx.cloud.callFunction({
                name : 'update',
                data : {
                  collection : 'message',
                  where : {
                    userId : app.userInfo._id
                  },
                  data : {
                    list : list
                  }
                }
              }).then((res)=>{
                this.triggerEvent('myevent',list) 
              });
          });

 

 整體邏輯:

1、在removeList.wxml 中的昵稱中添加一個點擊事件 

<movable-view bindtap="handleAddFriend" direction="horizontal" class="view">{{ userMessage.nickName }}</movable-view>

2、在removeList.js中隊這個點擊事件進行渲染

 handleAddFriend(){
      wx.showModal({
        title: '提示信息',
        content: '申請好友',
        confirmText: "同意",
        success: (res) => {
          if (res.confirm) {
              db.collection('users').doc(app.userInfo._id).update({
                data:{
                    friendList : _.unshift(this.data.messageId)
                }
              }).then((res)=>{});

          //其他用戶和我構成好友的關係,用到客戶端來實現(也就是用雲函數來實現)
          wx.cloud.callFunction({
            name : 'update',
            data : {
              collection : 'users',
              doc : this.data.messageId,
              data : `{ friendList:  _.unshift('${app.userInfo._id}')}`
            }
          }).then((res)=>{});
          this.removeMessage();
          } else if (res.cancel) {
            console.log('用戶點擊取消')

          }
        }
      })
    }

3、點擊了接受邀請之後,把這個申請好友的消息刪除(和之前實現刪除功能一樣,就可以直接把這個功能封裝到removeMessage這個函數裏面

removeMessage(){
      //也就是點擊了確定的話,就不提示這個了,而是刪除信息
      //  目前沒有直接更新的,智能是這個過程就變成了先查詢然後再更新
      db.collection('message').where({
        userId: app.userInfo._id
      }).get().then((res) => {
        // console.log(res);
        let list = res.data[0].list;
        console.log(list);
        list = list.filter((val, i) => {
          return val != this.data.messageId
        });
        // console.log(list);
        wx.cloud.callFunction({
          name: 'update',
          data: {
            collection: 'message',
            where: {
              userId: app.userInfo._id
            },
            data: {
              list: list
            }
          }
        }).then((res) => {
          this.triggerEvent('myevent', list)
        });
      });

注意:因為我們開通了一個friendList 給每一個用戶數據庫字段,所以在user.js初始化用戶數據庫的時候也要加上初始化這個friendList數組才行

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

【其他文章推薦】

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

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

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

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

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

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

首次護照申辦便民一處服務 全國戶政8/12正式開辦

外交部與內政部合作「首次申請護照親辦一處收件全程服務便民措施」,12日正式擴大推展至全國各戶政事務所同步開辦,以「線上傳輸」取代「人力遞送」,秉持單一收件、全程服務,有效降低錯誤率及節省戶所人力負擔,落實數位國家智慧服務理念,同時鼓勵民眾申辦自動通關,體驗更便捷的出國經驗。

桃園市長鄭文燦11日上午9時30分在市府民政局長陳靜航、秘書處長顏子傑、桃園區長陳玉明的陪同中,前往桃園區戶政事務所,出席「首次申請護照親辦一處收件全程服務便民措施」全國開辦活動,內政部政務次長陳宗彥、外交部政務次長曾厚仁、外交部領事事務局長葉非比、立法委員呂玉玲、黃世杰、湯蕙禎、市議員陳美梅、黃家齊也到場參加。

鄭文燦市長指出,台灣有良好的戶政系統、身分識別及資訊化能力,護照申辦亦是基本的為民服務,桃園早於去(108)年2月15日起,即以人力遞送方式,提供代收、代辦、代領「首次申請護照親辦一處收件全程服務便民措施」,執行期間約計有1萬8,437件,成效良好。

今(109)年3月16日起,外交部與內政部擇定桃園各戶政事務所及台中市、雲林縣、嘉義市、屏東縣、澎湖縣等地部分戶政事務所參與試辦,以線上傳輸取代人工遞送,雖受疫情影響送件數較少,但桃園戶政資料庫及勾稽系統運作良好,仍有552件申請案,約為人工試辦階段的三分之一。

鄭文燦也鼓勵國人利用疫情期間,預先申辦好護照,銷售文案同時申請自動通關,不僅可體驗「類出國」樂趣,也盼未來國人往返國外觀光旅遊、就學或進行商貿活網頁設計公司動時,在護照核發、機場通關時都能享有更便捷的服務。

內政部政務次長陳宗彥表示,全台台北網頁設計設有231個戶所,將近5,400位戶所同仁,網頁設計完整的戶政系統及資料庫,可有效協助國人護照申辦作業。自100年起,內政部啟動人別確認系統,為了提升便民申辦服務,包括桃園的各縣市,於去年陸續推動首次申請護照代收、代辦業務,今年3月16日起,外交部與內政部擇定戶所及民政體系服務良好的桃園及其他各縣市戶所參與試辦,獲得不少好評,因此今日擴大至全國開辦,盼國人於疫情期間,先行分散申辦,待疫情緩解、國境解封後,即可體驗出國樂趣。

外交部政務次長曾厚仁表示,台灣晶片護照技術先進且具難以偽造的安全性,在全球深受歡迎,iphone維修國人至約150個國家訪問參觀,可享免簽證及落地簽證等待遇。外交部與內政部合作「首次申請護照親辦一處收件全程服務便民措施」初期設計未臻完台北網頁設計善,逐步調整改善後,打造今日適用全國開辦的2.0版本,一站式服務新北清潔每年約可嘉惠40萬名首次申辦護照的民眾,節省兩地奔波的時間和金錢,盼將服務發揮最大效益,藉此回饋同仁多時的努力和付出。

民政局長陳靜航則表示,「首次申請護如何寫文案照親辦一處收件全程服務」便民措施,針對首次申請護照到戶政事務所辦理人別確認的民眾,進一步提供代送申請、代領護照的「一站式」服務。首次申請護照的民眾,可備妥文件到戶政事務所送件,並可選擇在同一個戶政事務所領取護照,或是自付郵資將護照寄到指定的地址。

戶政事務所將護照申請資料上傳到外交部審核及製發護照,民眾只要持戶政租車事務所開立的繳款證明單到指定的5大超商、郵局或農漁會繳納護照規費(每件須另付手續費15元),在繳費後8個工作天,即可依選擇的領照方式到原送件的戶政事務所領取護照,或是在護照寄達指定地址時自付快遞費用。

陳靜航指出,若首次申請護照又急需使用的民眾,仍可至各戶政事務所辦理人別確認後,再委託親屬、同事或旅行社代為到外交部領事事務局、中部、南部、雲嘉南或東部辦事處送件申請,或親自到上述外交部各申辦地點送件。此外,外交部為鼓勵民眾多加利用「一站式」的申辦流程,凡自即日起至12月11日止,到戶政事務所採用「一站式」申辦護照的申請人,都將自動列入抽獎名單,並於年底舉辦抽獎致贈精美小禮物1份。

「人造葉」設備啟蒙自光合作用 可生產乾淨燃料「合成氣」

摘錄自2019年10月22日科技新報報導

科學家開發出太陽能燃料領域一種新設備,可以利用陽光將水、二氧化碳轉化成用來發電的燃料「合成氣」,因轉化過程有如植物光合作用,而被暱稱為「人造葉」。

合成氣是一種利用氣化技術(gasification technology)將煤炭、石油、生質物等含碳原料轉化成一氧化碳與氫氣、然後混合而成的產物,本身可充當燃料氣體,主要用途為發電,也可用來生產藥品、塑膠、肥料等。

而英國劍橋大學團隊花費多年時間設計出人造葉,包含二種先進的鈣鈦礦光吸收劑和一種由鈷製成的分子催化劑,前者作用類似植物中吸收陽光的分子,鈣鈦礦可提供更高的電壓與電流驅動化學反應;後者則是代替鉑或銀,不僅成本較低,催生一氧化碳的表現也比其他催化劑好。

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

【其他文章推薦】

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

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

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

※超省錢租車方案

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

2020-為什麼換了工作

摘要

經歷了一個特殊的2020上半年,疫情出乎意料的持續了半年之久,還是沒有看到結束的趨勢。雖然外部環境很惡劣,還是做出了個人的重大選擇,換工作。期間糾結了很久,畢竟工作就是生活,換工作就是對未來的期待,對過去的總結,對自己的人生的深度思考。這裏回顧下當時的個人思考,供後續復盤參考。

當前的狀況

2020,本科畢業的第六年,不再像剛畢業那會,覺得換公司是輕而易舉的事,考慮的事情越來越多。
畢業五年開始就越發的焦慮,這是當時的心境
2019年春-當前的困境、
2019秋-走的太久忘記了為什麼出發

總結起來

  1. 在擁抱變化的過程中,沒有匹配上自己的個人目標
  2. 工作多年還依然在糾結擅長和喜歡

老馬說的員工想要離職無非兩個原因

  1. 錢沒給到位
  2. 心委屈了
    分別是物質和精神方面。算是高度概括了。細分起來就是三方面錢、人、事。

錢的計算相對比較複雜了。

  1. 時薪和月薪
    月薪20K 的996,和15K的965相比,時薪還要低不少。但是如何選擇,每個人的情況不一樣,選擇不一樣
  2. 月薪和總包
    互聯網公司的總包除了現金部分還包括股票或者期權。一般分4年歸屬,待滿兩年才能拿到一半。股票的價值不好估算,畢竟二級市場波動很大。對比股票,期權價值就更不好估算了。因為沒上市的公司估值的水分很大,另外不一定能兌現,畢竟上市沒那麼容易。但是機會和風險並存,創業公司會給很多期權來吸引(忽悠)人才加入。你想獲得高額的回報甚至是財務自由,就得冒很大的風險。

所以總收入: 現金 + 風險係數 * 股票/期權價值。 同時考慮你的時間比。

那對於當前的我來說,缺錢,但是不是缺工作跳槽的錢。怎麼說呢,就是生活基本物質得到了保障,但是更高的需求無法滿足,而這些多出來的需求靠換工作是滿足不了。所以錢不是重點考慮的。

互聯網的從業人員的個人素質相對比較高,加上工作專業度比較高,所以都比較簡單,沒那麼多亂七八糟的人情世故需要去處理。所以相處起來還比較愉快。

但是人與人之間是有磁場的,不是每個人都能和你對脾氣、遇到合適的領導,相近的同事也沒那麼容易,另外建立關係也需要時間。這個對於跳槽是減分項。

事包含兩部分,一部分是成就感,一部分個人成長機會。也就是通常說的借人成事、借事修人。

馬斯洛需求理論最高層級就是自我實現。對於互聯網人,每天除了睡覺,70%以上時間都給了工作,那自我實現肯定要在工作中實現。

那對於我個人而已,相對穩定的業務,確定性比較高,沒什麼發展前景的就沒什麼吸引力。希望是有挑戰性的工作,能把事情做成功,並且自己能夠在其中發揮重要的作用。

個人成長其實就是未來。個人成長不是一蹴而就的,短期內不易覺察。但是非常重要,互聯網更新很快,你沒跟上就被淘汰了。對於廣泛流傳的程序員成長路線,3年高工,7年架構,10年外賣。

雖然是調侃,但是也說明了幾點內容

  1. 更新迭代很快的互聯網對大齡人不是很友好,你必須要持續成長。恍惚中我就工作6年,在互聯網行業中都算一個老兵了。
  2. 互聯網人的職業發展與其他行業發展曲線不一樣。一個發展很快,新知識很多的領域,個體是永遠追不上行業的發展水平的。

總結來說,發展是當前跳槽的主要考慮因素。

跳槽的期望

有了換工作的想法,是對現狀的不滿,但是換一個環境並不意味着問題的解決。這也是為什麼很多人經常抱怨公司的不好,但是不挪窩的原因。我們不能寄希望於未知的事情。尤其是從18年底開始互聯網整體再走下坡路,就業環境並不好,加上今年疫情的原因,外部環境更加惡化。

但是大環境不好,不代表個體就不好。不確定性很多不代表沒有確定性的東西。人的一生就是在不斷選擇中度過的,我們必須要了解自己,抓住重點,匹配自己與環境。

那麼我的個人期望是怎麼樣的,新的工作能滿足我的期望嗎?

職業發展

之前迷茫過還要不要做程序員,能不能轉行到產品,諮詢,售前。現在不能說篤定了一直做技術,但是找到了一些發展規律。

  1. 不會再去做偏底層的技術
    以前做過大數據,BI,甚至3年前還拿到過大數據工程師的offer,現在也深入了解了運維、中間件相關的工作內容。徹底打消了偏技術側的技術開發。
  2. 解決問題為驅動
    問題為導向,離業務越近越好。通過技術來驅動業務,非技術手段來解決業務問題。

這個算是近兩年個人的一個不小的突破,排除了哪些事不會去做,哪些事要去嘗試探索。

行業

行業涉及面太廣了,現在toC不好做,巨頭林立把用戶時間都擠佔了。toB 更難了,工具效率型的,國內目前付費意願並不強,能幫助企業帶來收入的才能發展的下去。

個人目前對具體做哪個行業的並沒有那麼執着。更多的期望是能夠以某個點切入到某個行業,然後看到如何通過互聯網技術把問題解決了,形成閉環,把事情做成功了。這種成就感足以讓我興奮。因為這些年,在不同的公司做各種創業項目,都沒有做成功的,都因為各種原因死掉了。正因如此,才知道創業是如何的艱難與不易。

通過自我的剖析和明確當前職業發展目標,在2020年春夏之際,我成功換了工作。

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

【其他文章推薦】

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

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

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

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

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

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

這 10 行比較字符串相等的代碼給我整懵逼了,不信你也來看看|原創版

抱歉用這種標題吸引你點進來了,不過你不妨看完,看看能否讓你有所收穫。​(有收穫,請評論區留個言,沒收穫,下周末我直播吃**,哈哈,這你也信)

補充說明:微信公眾號改版,對各個號主影響還挺大的。目前從後台數據來看,對我影響不大,因為我這反正都是小號,閱讀量本身就少的可憐,真相了,狗頭(剛從交流群學會的表情)。

先直接上代碼:

boolean safeEqual(String a, String b) { if (a.length() != b.length()) { return false; } int equal = 0; for (int i = 0; i < a.length(); i++) { equal |= a.charAt(i) ^ b.charAt(i); } return equal == 0; } 

上面的代碼是我根據原版(Scala)翻譯成 Java的,Scala 版本(最開始吸引程序猿石頭注意力的代碼)如下:

def safeEqual(a: String, b: String) = { if (a.length != b.length) { false } else { var equal = 0 for (i <- Array.range(0, a.length)) { equal |= a(i) ^ b(i) } equal == 0 } } 

剛開始看到這段源碼感覺挺奇怪的,這個函數的功能是比較兩個字符串是否相等,首先“長度不等結果肯定不等,立即返回”這個很好理解。

再看看後面的,稍微動下腦筋,轉彎下也能明白這其中的門道:通過異或操作1^1=0, 1^0=1, 0^0=0,來比較每一位,如果每一位都相等的話,兩個字符串肯定相等,最後存儲累計異或值的變量equal必定為 0,否則為 1。

再細想一下呢?

for (i <- Array.range(0, a.length)) { if (a(i) ^ b(i) != 0) // or a(i) != b[i] return false } 

我們常常講性能優化,從效率角度上講,難道不是應該只要中途發現某一位的結果不同了(即為1)就可以立即返回兩個字符串不相等了嗎?(如上所示)

這其中肯定有……

再再細想一下呢?

結合方法名稱 safeEquals 可能知道些眉目,與安全有關。

本文開篇的代碼來自playframewok 里用來驗證cookie(session)中的數據是否合法(包含簽名的驗證),也是石頭寫這篇文章的由來。

以前知道通過延遲計算等手段來提高效率的手段,但這種已經算出結果卻延遲返回的,還是頭一回!

我們來看看,JDK 中也有類似的方法,如下代碼摘自 java.security.MessageDigest

public static boolean isEqual(byte[] digesta, byte[] digestb) { if (digesta == digestb) return true; if (digesta == null || digestb == null) { return false; } if (digesta.length != digestb.length) { return false; } int result = 0; // time-constant comparison for (int i = 0; i < digesta.length; i++) { result |= digesta[i] ^ digestb[i]; } return result == 0; } 

看註釋知道了,目的是為了用常量時間複雜度進行比較。

但這個計算過程耗費的時間不是常量有啥風險? (腦海里響起了背景音樂:“小朋友,你是否有很多問號?”)

真相大白

再深入探索和了解了一下,原來這麼做是為了防止計時攻擊(Timing Attack)。(也有人翻譯成時序攻擊​)​

計時攻擊(Timing Attack)

計時攻擊是邊信道攻擊(或稱”側信道攻擊”, Side Channel Attack, 簡稱SCA) 的一種,邊信道攻擊是一種針對軟件或硬件設計缺陷,走“歪門邪道”的一種攻擊方式。

這種攻擊方式是通過功耗、時序、電磁泄漏等方式達到破解目的。在很多物理隔絕的環境中,往往也能出奇制勝,這類新型攻擊的有效性遠高於傳統的密碼分析的數學方法(某百科上說的)。

這種手段可以讓調用 safeEquals("abcdefghijklmn", "xbcdefghijklmn") (只有首位不相同)和調用 safeEquals("abcdefghijklmn", "abcdefghijklmn") (兩個完全相同的字符串)的所耗費的時間一樣。防止通過大量的改變輸入並通過統計運行時間來暴力破解出要比較的字符串。

舉個,如果用之前說的“高效”的方式來實現的話。假設某個用戶設置了密碼為 password,通過從a到z(實際範圍可能更廣)不斷枚舉第一位,最終統計發現 p0000000 的運行時間比其他從任意a~z的都長(因為要到第二位才能發現不同,其他非 p 開頭的字符串第一位不同就直接返回了),這樣就能猜測出用戶密碼的第一位很可能是p了,然後再不斷一位一位迭代下去最終破解出用戶的密碼。

當然,以上是從理論角度分析,確實容易理解。但實際上好像通過統計運行時間總感覺不太靠譜,這個運行時間對環境太敏感了,比如網絡,內存,CPU負載等等都會影響。

但安全問題感覺更像是 “寧可信其有,不可信其無”。為了防止(特別是與簽名/密碼驗證等相關的操作)被 timing attack,目前各大語言都提供了相應的安全比較函數。各種軟件系統(例如 OpenSSL)、框架(例如 Play)的實現也都採用了這種方式。

例如 “世界上最好的編程語言”(粉絲較少,評論區應該打不起架來)—— php中的:

// Compares two strings using the same time whether they're equal or not. // This function should be used to mitigate timing attacks; // for instance, when testing crypt() password hashes. bool hash_equals ( string $known_string , string $user_string ) //This function is safe against timing attacks. boolean password_verify ( string $password , string $hash ) 

其實各種語言版本的實現方式都與上面的版本差不多,將兩個字符串每一位取出來異或(^)並用或(|)保存,最後通過判斷結果是否為 0 來確定兩個字符串是否相等。

如果剛開始沒有用 safeEquals 去實現,後續的版本還會通過打補丁的方式去修復這樣的安全隱患。

例如 JDK 1.6.0_17 中的Release Notes[1]中就提到了MessageDigest.isEqual 中的bug的修復,如下圖所示:

MessageDigest timing attack vulnerabilities

大家可以看看這次變更的的詳細信息openjdk中的 bug fix diff[2]為:

MessageDigest.isEqual計時攻擊

Timing Attack 真的可行嗎?

我覺得各大語言的 API 都用這種實現,肯定還是有道理的,理論上應該可以被利用的。 這不,學術界的這篇論文就宣稱用這種計時攻擊的方法破解了 OpenSSL 0.9.7 的RSA加密算法了。關於 RSA 算法的介紹可以看看之前本人寫的這篇文章。

這篇Remote Timing Attacks are Practical[3] 論文中指出(我大致翻譯下摘要,感興趣的同學可以通過文末鏈接去看原文):

計時攻擊往往用於攻擊一些性能較弱的計算設備,例如一些智能卡。我們通過實驗發現,也能用於攻擊普通的軟件系統。本文通過實驗證明,通過這種計時攻擊方式能夠攻破一個基於 OpenSSL 的 web 服務器的私鑰。結果證明計時攻擊用於進行網絡攻擊在實踐中可行的,因此各大安全系統需要抵禦這種風險。

最後,本人畢竟不是專研完全方向,以上描述是基於本人的理解,如果有不對的地方,還請大家留言指出來。感謝。

補充說明2:感謝正在閱讀文章的你,讓我還有動力繼續堅持更新原創。

本人發文不多,但希望寫的文章能達到的目的是:佔用你的閱讀時間,就盡量能夠讓你有所收穫。

如果你覺得我的文章有所幫助,還請你幫忙轉發分享,另外請別忘了點擊公眾號右上角加個星標,好讓你別錯過後續的精彩文章(微信改版了,或許我發的文章都不能推送到你那了)。

​原創真心不易,希望你能幫我個小忙唄,如果本文內容你覺得有所啟發,有所收穫,請幫忙點個“在看”唄,或者轉發分享讓更多的小夥伴看到。 ​ 參考資料:

  • Timing Attacks on RSA: Revealing Your Secrets through the Fourth Dimension
  • Remote Timing Attacks are Practical

參考資料

[1] Release Notes: http://www.oracle.com/technetwork/java/javase/6u17-141447.html

[2] openjdk中的 bug fix diff: http://hg.openjdk.java.net/jdk6/jdk6/jdk/rev/562da0baf70b

[3] Remote Timing Attacks are Practical: http://crypto.stanford.edu/~dabo/papers/ssl-timing.pdf

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

【其他文章推薦】

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

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

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

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

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

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