2016-08-30

餐廳無人化的第一步

今天去吃迴轉壽司,遠遠看到架上是空的,沒有壽司。還覺得這店家是不是要倒了。

我錯了!壽司軌道跟以前不一樣。改成直送座位。

桌上多了平板,自己操控觸控螢幕點菜。服務鈴跟結帳鈴都有。

然後餐車會從軌道上過來,送到面前。餐車有四個空位,不過這家似乎習慣一次送一盤。

軌道有三層,上方兩層利用餐車。從餐車拿下東西後,餐車會自動倒車回廚房,推測是感應重量。下方則是輸送帶,輸送帶沒有回收餐車的問題,可以省一點時間。每層軌道,左右兩端有紅外線感應器,推測是用來感應餐車位置,以及感應軌道異物。餐車不是用軌道帶動,自己會走,所以裡面有電池/馬達/輪子。

餐具全部放在軌道最上方,連打包紙盒都有,大概是鼓勵顧客自己手動打包。

不過30元的壽司,很多都漲價成40元,而且發覺飯比以前難吃。省掉員工薪水反而漲價,爛透了!
這是餐廳無人化的第一階段,糟糕!又有幾百萬人要失業了。

2016-08-16

台灣教育悲歌,產學專班是到麥當勞上班


到麥當勞上班,贈送你一張大學文憑,保證月薪最低23K,比22K還多,謝主隆恩!台灣有救了!

2016-08-07

C++實作無序容器的方法,且可接受重複的元素

此文翻譯自
http://bannalia.blogspot.tw/2013/10/implementation-of-c-unordered_25.html

上次我們介紹了Hash Table各種流行的方法,現在我們來考慮如果元素有重複,要怎麼辦?
(unordered_multiset  , unordered_multimap)

Hash Table跟重複元素,這是兩個不同玩意,不要混在一起。兩個基本問題要解決。
  • Hash的負載係數(load factor)是[所有元素]除以[所有桶子],但因為重複元素會放在同一個桶子。必須要重新設計負載係數,不然陣列會拼命長大,結果大多數桶子都是空 的。
  • 演算法複雜度跟負載係數無關,而是跟桶子裡面塞了多少東西有關。
補救負載係數(load factor)非常困難,因為規範對於負載係數定得太死。沒有多少空間可以作弊。一個細心的工程師會同時考慮最大桶子塞了多少東西以及平均每個桶子有多少 東西。我的選擇是在節點上動手腳,遍歷桶子的時候,可以快速的跳過重複的地方(規範要求相同的元素必須放在一起)。跟不重複版本比較,我們希望時間效率一 樣好!

  • Dinkumware libc++ , libstdec++ -V3函式庫
對於重複元素,根本沒做任何處理。

  • Boost.Unordered
有做一些設計,請看圖

桶子b2裡面有五個相同的元素。往前指的指標改成指向重複元素最後一個。利用這個反向指標,可以把五個元素視為一個大節點。插入或刪除的時候,先找到第一 個元素,利用反向指標直接跳到第五個元素。省去了掃描的麻煩。
  • Boost.MultiIndex
與之前文章的設計類似,第一個節點要指回桶子,所以是特殊處理。其餘節點如果是一樣的資料,就把反向指標串好。

定一個節點叫做X,下一個節點叫做Xn,前一個節點叫做Xp。
假設有多個元素重複,全部串在一起。
第一個叫做F
第二個叫做S
倒數第二個叫做P
倒數第一個叫做L
  • Sp=L
  • Pn=F
第二個元素,[往前指標]會指向最後節點。
倒數第二個元素,[往後指標]會指向最初節點。

推導一些特性
  • 如果Xpnn == X,那就是桶子第一個節點
  • 如果Xnpn == X,那就是桶子最後節點
  • 如果相同元素>=3,串成一個集團,集團第一個節點條件是Xnp != X && Xnppn == X
  • 如果相同元素>=3,串成一個集團,集團第二個節點條件是Xpn != X && Xppnn == X
  • 如果相同元素>=3,串成一個集團,集團倒數第二個節點條件是Xnp != X && Xnnpp == X
  • 如果相同元素>=3,串成一個集團,集團倒數第一個節點條件是Xpn != X && Xpnnp == X
所有特殊位置節點都可以偵測到。整個雙向鏈結還是可以視為一個環狀。插入刪除節點都可以在O(1)。遇到資料相同的集團,可以直接跳到頭或是跳到尾,大幅 度加速。

插入元素的方法:
  1. 使用Hash先找到桶子。(常數時間)
  2. 檢查桶子裡面的每個元素,遇到集團的時候,只要檢查集團第一個節點即可。(桶子大小線性時間)
  3. 如果元素等於某個集團,把元素加入集團內。如果整個桶子沒有相同元素,直接插入在桶子的頭端。
  4. 調整桶子的指標。
遇到重複元素集團的時候,直接用Xnp就可跳到集團最尾端。若重複元素的集團長度低於3。則加速方法不適用。

刪除元素的方法:
  1. 刪除鏈結裡面的元素,調整前後指標。
  2. 調整桶子的指標。
事實上實作非常複雜,因為在插入刪除的時候,雙向鏈結調整指標,必須要偵測到特殊狀態的指標。但是最後效能提升,遍歷桶子不依賴桶子裡面塞了多少元素,而 是看桶子裡面有多少集團。與不重複版本比較(set/map),可以達到同樣的效能。如果Hash演算法良好,插入就是O(1)。刪除動作不用管考慮 Hash演算法,一定是O(1)。

2016-08-06

GoGoVan機車送貨,商業模式不專業心得!

GoGoVan是一個機車送貨的手機APP,就跟Uber一樣,自己不養車隊,送貨的司機也是普通老百姓。APP只是單純媒合想寄東西的人,與機車司機。

當司機需要自備機車,註冊需用手機傳一些證件照片,很麻煩的是GoGoVan要求司機需跑台北市上課一小時,帳號才正式開通。如果不住台北就很麻煩。上課 結束後,公司會發識別證,送貨均需配戴。圖片是司機手冊及各種貼紙,有四張不同圖案貼紙,可以貼在安全帽/機車上。

稍微研究了一陣子。發覺這是一個資金不足,專業度不足的小公司。跟Uber的財大氣粗完全不能比,沒有想像中美好。

首先收費實在是便宜過頭。5公里以內只收80元,而且公司抽成20%。司機實拿64元。現在最低時薪115元。你可能會覺得5公里15分鐘騎完,好像還不 錯。但實際上寄貨的人不可能剛好在你家隔壁,騎車10分鐘接到貨物是常態。

再來是司機/收貨/送貨三方之間需要溝通,但手機APP沒有設計任何傳訊功能,只能打手機講電話。所以實際上不可能15分鐘賺64元。司機要出油錢,機車維修費,手機電話費,手機上網費。再怎麼算,司機收入連基本時薪都拿不到。當正職不可能。

唯一的功用是,我今天恰巧要出門,打開手機恰巧有一筆單順路,順手賺點小錢。

也因為司機都是兼差,所以寄東西的人,很吃時段跟地點。例如說下午5點,台北市送到新北市,這種單就是瞬間有人接走。如果是反過來新北市送台北市,就完全 沒人接。

還好APP有提供加錢功能,寄貨的人可以手動加錢,一直加到有人接。

事實上這部份可以用電腦「自動漲價」,這點Uber就做到了。Uber在冷門時段叫車會自動加錢。

再來講手機APP設計缺失,寄貨只收現金,不吃信用卡。現在計程車每一家都可以刷卡,手機綁定信用卡這功能居然沒做。

GoGoVan接到單之後,不是通知距離最近的司機,而是通知「全台灣」的司機。實在太爆笑!
人住高雄也可以看到台北的單,假設不小心點到按鈕,不小心接到單,就只能打電話給公司,請公司取消!

它原本有提供代付款服務,例如說司機去先去A地付錢拿貨,然後貨物送到B地,收貨方再付清所有錢。但因為有司機被詐騙過,公司已經講明代付全面停止,但是 手機APP沒有把代付款功能擋掉,變成手機一直跳代付款的單,但是我都不敢接。

再來是網站寫明最低收費80元,但是我在手機上有看到低於80元的單,我也不敢接。不曉得發生什麼事?

且公司沒有對意外狀況做處理,送貨一定會有意外,例如說收貨方人沒出現,司機送貨中途出車禍,顧客貨物包裝本來就很破。收貨方看到包裝不完 整拒收。手機APP沒有提供意外回報方式,只要有意外,就是打電話給公司客服。而且客服沒有24小時待命,只有常日班才有客服。如果假日出事怎麼辦?如果 晚上出事怎麼辦?

公司對司機沒有任何保險,出事自己吞? (備註:Uber也沒有保險,想做Uber的人自己小心!)

GoGoVan不是一個好東西,點子不錯,但是執行面零分!對司機吸引力很低,手機APP軟體寫的太差!