2017/7/19

chatbot 會以什麼姿態取代 web?

在 chatbot (以下簡稱 bot ) 上,我們沒有足夠大的空間去顯示一整個網頁的資訊,所以我們一次只會顯示網頁的一小部份,就跟做 app 時一樣,但空間更小。而當 web 上的每一個元件都有 bot 的替代方案時,則表示 bot 將可以完全取代 web。

以 line bot 為例:

路由

web:網址解析
bot:語意分析

使用者輸入的每一句話都是一個 request,在此階段是做 route 的工作,這也是語意分析的主要工作。

主選單

web:nav
bot:template buttons 或 imagemap

由於bot無法一次顯示整個網頁的資訊,所以會先從 nav 開始。可以使用多個 template buttons 做出巢狀選單,也可以利用 imagemap 做出比較漂亮的版面。

列表

web:list
bot:text 或 template carousel

有圖或超連結的情況下會使用 template carousel

表單

web:form
bot:conversational form

透過問答的方式填表

總結

像這樣一個個找到 web 元件在 bot 上的實作方案,最終就能取代 web。

大量使用超連結的作法可以迴避掉語意分析,因為除了表單之外不需要打字,進入難度將大大降低,使用者體驗也會比較好。我相信大多數的bot應該都會採用這種較低成本、符合成本效益的做法。

不過,與其說 bot 可以取代 web,不如說開發者將從同時開發 web、app 變成同時開發 web、app、bot,所以將來很可能會有能同時發布到 web、app、bot 上的開發框架。

rails db migrate 寫錯時如何重跑 migrate

markdown 1. 先把開發db跟測試db還原到上一步驟 ``` rails db:rollback rails db:rollback RAILS_ENV=test ``` 2. 修改 migration 檔案 3. 再重新執行 migrate (他會把開發db跟測試db都更新) ``` rails db:migrate ``` 如果一開始忘記跑測試db的 rollback 也沒關係,執行下面的指令就好 ``` rails db:rollback RAILS_ENV=test rails db:migrate RAILS_ENV=test ```

2017/7/17

軟體發展未來趨勢

讓程式以資料的形式存在,就是增加程式彈性最好的方法。

從硬體到軟體

對硬體來說,裡面搭載的軟體是一種資料。早期很多工具是寫死的,甚至於沒有儲存資料的能力。比方算盤,或是特殊型態的計算機。直到現在有很多東西都是把軟體換掉就能得到效能提升的。

從程式到資料

從 web1.0 到 web2.0 可以看出來,最好的例子是BLOG,這是程式到資料的第一步,因為只要做一個BLOG平台網站,資料替換一下,就等於做了N個BLOG。就像我做一隻BOT,如果把很多東西都寫死,結果就只能做出一隻BOT。如果要一次做出N個BOT,那就必須要把寫死的部分都抽出來資料化,讓程式只有一份,只要新增資料,就能夠產生一隻新的BOT,那就是BOT平台。

從BOT到BOT平台,這就是資料化的一個案例。蓋一個購物網站跟蓋一個電商平台的差別也是。大原則其實就是把重複的部分抽出來,把不重複的部分儲存成資料。你當然還可以再抽一層,做個電商平台平台,讓你一次蓋出N個電商平台。(只是沒人要用)

從資料到AI

所以說,已知程式資料化是大趨勢的情況下,資料科學就是必修。需求會是資料的生成過程自動化,應該是由AI來做。所以類神經網路就是AI中最有彈性的一種AI,同時他也是需要最多資料的AI,因為他把邏輯全都資料化了。

如果類神經網路的網路結構最佳化可以由內部自己決定的話,那麼他會需要更多的資料,而且更加強大。

#賺大錢的原則就是去除重複

2017/7/4

FB粉絲團自動邀請按讚程式

有一天,我的好友八里人問我:「幫你卡米狗的貼文按讚的人你都有邀請他嗎?」

經過八里人一番解釋後,發現是FB粉絲團小編可以邀請有按貼文讚,但是沒按粉絲團讚的人去按粉絲團讚,而這個過程是需要粉絲團小編一個個的去點邀請。

操作過程是從這裡點進去按讚清單



然後你會看到某個粉絲是「已說讚」,或者是「邀請」。

當我故意按了取消粉絲團讚之後,就會變成邀請

點擊邀請後對方會收到一則通知。


點擊通知後會看見一個邀請按讚的置頂訊息


會按你貼文讚的人,通常也是高度相關受眾,所以這肯定有搞頭。

可是一個個點耗時又耗力,雖然可以加粉絲數但是太累了。

身為工程師,寫一個自動邀請按讚工具也是很合邏輯的。

於是FB粉絲自動讚就出現了。

https://chrome.google.com/webstore/detail/fb%E7%B2%89%E7%B5%B2%E8%87%AA%E5%8B%95%E8%AE%9A/inmcpfbfiakkmgaahdbjniigaboaopmk

使用方法很簡單,就是點開按讚清單後再去點擴充套件圖示,然後等待完成。



注意:目前只支援繁體中文的FB粉絲團小編使用。

2017/6/6

Regex 正規表示式 比對跟前面出現過的那個值相等的方法

markdown 我想要比對跟前面出現過的那個值相等 ,有可能用正規表示式做嗎? 可以的。 [regex維基百科連結](https://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F) 這在術語上稱為向後參照(back-reference) 我想要找兩個相同字元,但是中間卡一個-號,要怎麼寫呢? ``` (.)-\1 ``` 實際案例:[http://rubular.com/r/upTounDuFk](http://rubular.com/r/upTounDuFk) 我想要找兩個連續的不同字元(第二個字跟第一個字不同)要怎麼寫呢? ``` (.)(?!\1) ``` 實際案例:[http://rubular.com/r/JlJx8n2ZCB](http://rubular.com/r/JlJx8n2ZCB) 我想要找某一個字元的下一次出現點呢? ``` (.)((?:(?!\1).)+)\1 ``` 實際案例:[http://rubular.com/r/6pXhub7mOt](http://rubular.com/r/6pXhub7mOt)

2017/4/5

那個美感

我寫字很慢,從小就不喜歡寫字。因為不喜歡寫字、沒練字,所以字也就醜。 一兩年前看到一本書「禮元錄」提到一句話:「字,是一個人的臉面。」 當時看到這句話,我心裡想的是:「哇!那我不就醜爆了?」那還不練嗎? 剛好那時同事正在推一波鋼筆坑,我想說那就入一下坑吧,希望買了筆之後,會讓自己更有動力寫字。 買了筆之後,只寫了些字,當然還是醜,顯然字醜不醜跟用什麼筆來寫,關係不大。 能寫得一手好字的同事,不管他用什麼筆,都能寫出比我好看的字,而那肯定是花時間練出來的。 結果後來還是沒花時間練,現在字還是一樣醜。 最近我學 illustrator 跟 photoshop 時,發現相同的問題又出現了。 illustrator 跟 photoshop 其實只是另一種的高級「筆」,如果沒有去練那個美感,就算學會 illustrator 跟 photoshop 其實也沒搞頭。 回過頭來說寫字,字好不好看很重要。但比起字體本身的美,文字所表達的內涵又更重要。 其實寫程式也是這樣,排版、開發工具、套件、框架、設計模式很重要,但比起那些,可讀性跟效能又更重要。 仔細想想,絕大多數的東西都只是「筆」,只有少數的、最核心的那個美感,那個表達力才是最需要練、最有價值的東西。

2017/3/25

在 Postgresql 使用 uuid 的方法

markdown (以下指令都是在 postgresql cli 輸入) 想要生成uuid的話,只要呼叫 uuid_generate_v4 就可以生成 ``` select uuid_generate_v4() ``` 正常情況下會看到 ``` uuid_generate_v4 -------------------------------------- 98a4f867-8dcd-4982-aa3a-14e1030bcd88 ``` 如果看到 ``` ERROR: function uuid_generate_v4() does not exist ``` 表示你的postgresql 沒有安裝 uuid-ossp 模組 安裝uuid-ossp模組的指令 ``` CREATE EXTENSION "uuid-ossp"; ``` 移除uuid-ossp模組的指令 ``` DROP EXTENSION "uuid-ossp"; ``` 查看目前安裝過的模組 ``` select * from pg_extension; ``` 查看可安裝的模組 ``` select * from pg_available_extensions; ```

2017/3/23

建立一個line bot的所需知識

markdown 架構 * 程式語言:ruby * web server framework:rails * 資料庫:postgresql * 協定:https post * 資料傳輸格式:json 開發環境 * 硬體:macbook * 軟體 * rvm * rails * bundle/gem * sublime text 發布環境 * 硬體(heroku) * 軟體 * git * heroku cli

2017/3/21

rails db & postgresql cli 使用方法

markdown # postgresql 相關指令 查看有哪些資料庫 ``` \l ``` 連線到資料庫 ``` \c db_name ``` 查看有哪些表格 ``` \dt ``` 查看有哪些欄位 ``` \d+ table_name ``` 查看執行過的資料庫遷移 ``` select * from schema_migrations; ``` # rails db 相關指令 開啟含有 rails 環境的 irb ``` rails console ``` 連線到資料庫 ``` rails dbconsole ``` 建立資料庫,如果資料庫已經存在則不做事 ``` rails db:create ``` 刪除資料庫 ``` rails db:drop ``` 根據 db/schema.rb 檔產生對應的資料表(此動作會將資料庫內的資料清空) ``` rails db:schema:load ``` 根據資料庫狀態更新 db/schema.rb 檔 (但只要叫 db:migrate 就會自動執行這個了) ``` rails db:schema:dump ``` 執行db/seed.rb ``` rails db:seed.rb ``` ##快速功能 ###setup ``` rails db:setup ``` 等於以下指令 ``` rails db:create rails db:schema:load rails db:seed ``` ###reset ``` rails db:reset ``` 等於以下指令 ``` rails db:drop rails db:setup ``` 在這裡要注意的是setup跟reset指令不是重新執行migrate,所以如果你的schema檔是壞的,你下這兩個指令完還是壞的。 如果想要根據migration檔重新建立一個資料庫應該下的指令是 ###migrate:reset ``` rails db:migrate:reset ``` 等於以下指令 ``` rails db:drop rails db:create rails db:migrate ``` 這裡要注意的是, db:migrate:reset 指令並不會執行 db:seed 執行資料庫遷移,會把所有還沒執行過的都執行完,然後自動更新 db/schema.rb 檔 ``` rails db:migrate ``` 查看資料庫遷移結果 ``` rails db:migrate:status ``` 還原上一筆資料庫遷移 ``` rails db:rollback ``` 執行下一筆資料庫遷移 ``` rails db:forward ``` ##參考資料 [RailsGuide Migrations(資料庫遷移)](http://guides.ruby.tw/rails3/migrations.html)

2017/3/20

人生技能配點建議

在玩線上遊戲的時候,職業選擇跟能力發展我們通常都會選擇其中一項特化。比方說玩RO、黑色沙漠,這類型的遊戲都會有配點系統,技能配點和屬性配點是非常重要的,因為點數有限,在配點時不會把點數分配在比較次要或者無關的能力上。 而在實際的生活上,我們把時間看成點數,對某個技能投入時間就像是在點技能。在現實生活中,很少有看到把時間全部投入在同一個技能上的人,而這種人也都強到爆炸。 根據線上遊戲的環境,遊戲平衡的設計不良,就會產生強勢職業跟弱勢職業,可能你玩到一半爬文才發現職業選錯,點數也配錯,選到一個弱勢職業還配點配超爛,完全無法打贏同等級的怪物,此時只能選擇創新角色重練了。 但如果你的人生走在錯誤的道路上,上了錯誤的大學、選錯系、找錯工作,那就不是創新角重練那麼容易。 其實現實世界並不像RO、黑色沙漠,也許現實世界更像FF5、魔力寶貝2。在這些遊戲裏有轉職系統,你一開始是無職業者,你需要做點事情達成轉職條件,甚至有些職業的轉職條件就是數個職業等級到達某個水準。 在李笑來的「七年就是一輩子」書中提到,他認為花2年就可以精熟一個職業,然後花5年利用這個職業去獲利、累積資源,接著就可以轉職學習新的強勢職業。 大多數的人在現實生活中,投在職業技能的時間都是少的,下班之後的時間都拿去點一些奇怪的東西,上班的8小時拿去混水摸魚當個冗員的事情也是常常發生,這樣的人被取代性高也是很合理的。按照李笑來的說法,大多數的人只要用心練個半年一年就可以達到一般水準,兩年就可以精熟。 最近在找工作的時候發現,若想在大公司得到較高的薪水,那麼最好你一輩子只點一個技能,點高點滿。而在小公司,因為資源有限,每個人需要懂的技能是廣的,也許你要身兼數職,所以技能廣度在小公司才有那麼點用處,在大公司則沒有。 很多人沒有考慮過自己的轉職路線。像我,在各種基礎職業轉來轉去,就很少花時間去點高階技能,結果就是得不到好薪水。 這樣算不算浪費技能點呢? Jobs在「史丹佛大學畢業演說」曾提到過,你現在所點的技能,都會被用在未來的某一刻,而那會是現在的你無法想像的。 我覺得不一定是這樣,純粹是看你能不能有效整合、利用手頭上的資源,去打出一個漂亮的combo。 最近在玩遊戲王(Duel links),透過進行遊戲,你可以得到一些寶石,寶石可以拿去抽卡包,決定抽哪些卡包會直接影響你的牌庫強度。 我們可以把寶石看成時間,卡包看成技能,抽卡看成技能配點。這也是款資源分配遊戲。 只要去爬攻略就可以看到很多流派,像是利用卡牌的特性打出漂亮的combo獲勝。或者見招拆招的防禦型獲勝法。你手上的牌庫也許不完整,但你看了別人的combo ,就會知道自己應該要往哪個方向發展,該把石頭拿去抽哪個卡包。 攻略看久之後,也可以根據自己的牌庫,創造出一個最適合自己的流派,打的對面不要不要的。 結論: 需要瞭解世界上的強勢職業有哪些 轉職到另一個基礎職業是容易的 資源整合是困難的 創造出一個新職業去最大化利用目前的技能配點是最佳解

2017/3/16

Swift 使用 dictionary 取代 switch case 的方法

markdown switch 寫法 ``` var a = "a" func funcA(){ print("A") } func funcB(){ print("B") } func funcC(){ print("C") } switch a { case "a": funcA() case "b": funcB() case "C": funcC() default: funcC() } ``` 改為使用 dictionary 的情況 ``` var a = "a" func funcA(){ print("A") } func funcB(){ print("B") } func funcC(){ print("C") } let dic = ["a":funcA,"b":funcB,"c":funcC,] dic[a]?() ``` [關於dictionary 的中括號](https://developer.apple.com/reference/swift/dictionary/1540848-subscript)

2017/3/8

markdown hello world

markdown #hello world ``` var QQ = "QQ"; ``` theme test ``` ```

在 blogger 貼漂亮 code 的方法(使用 markdown 和 prettyprint)

使用套件

markdown
prettyprint

安裝步驟

先到 blogger 版面配置,在最下方找到新增小工具

然後選擇HTML/JavaScript

然後在內容填入以下程式碼
<script src="https://cdnjs.cloudflare.com/ajax/libs/showdown/1.6.4/showdown.min.js"></script>
<script>
var converter = new showdown.Converter();
var posts = document.querySelectorAll(".post-body,.snippet-item");
Array.prototype.forEach.call(posts, function(el, i){
  if(el.innerHTML.indexOf("markdown") <= 1){
    el.innerHTML = converter.makeHtml(el.innerHTML.replace("markdown",""));
  }
});

var pres = document.querySelectorAll("pre");
Array.prototype.forEach.call(pres, function(el, i){
  el.classList.add("prettyprint");
});
</script>
<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?skin=sunburst"></script>


就完工了。

測試

接著發佈一篇使用markdown語法的新文章
文章內容寫入如下圖:

結果看起來會是

補充

使用Tranquil Heart theme 的 code 寫法為:

<script src="https://cdnjs.cloudflare.com/ajax/libs/showdown/1.6.4/showdown.min.js"></script>
<script>
var converter = new showdown.Converter();
var posts = document.querySelectorAll(".post-body");
Array.prototype.forEach.call(posts, function(el, i){
  if(el.innerHTML.indexOf("markdown") <= 1){
    el.innerHTML = converter.makeHtml(el.innerHTML.replace("markdown",""));
  }
});

var pres = document.querySelectorAll("pre");
Array.prototype.forEach.call(pres, function(el, i){
  el.classList.add("prettyprint");
});
</script>
<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script>

<link rel="stylesheet" type="text/css" href="https://jmblog.github.io/color-themes-for-google-code-prettify/themes/tranquil-heart.min.css" />

可以成功,但一行程式碼太長時會破版,應該是這個theme的問題。

2017/3/2

ruby 全形轉半形(含英文數字符號)

markdown 寫法: ``` def to_half(str) full = " !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~" half = " !\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" str.tr(full, half) end ``` 測試: ``` puts to_half("!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~") ```