從生可可豆到巧克力——精製巧克力製程與實作 part1

Standard

I. 前言:何謂精製巧克力
精製巧克力的製程基本有點像是現在的精製咖啡產業
豆子的產地是哪?深中淺焙豆?研磨的粗細?日曬豆水洗豆?等等
透過各個製成環節的差異做出不同風味的巧克力
只是目前精製巧克力產業還沒像咖啡被發展得如此完備
一般人取得可可生豆也沒辦法像咖啡豆一樣容易,大部分被掌控在巧克力大廠手上
但相信再過幾年巧克力也會走向和咖啡相同的路。

ROC曲線, AUC, CI, Recall, F1評分, Accuracy, Precision, Sensitivity, Specificity, FP, FN —— 機器學習 與 電腦視覺 常見性能指標 整理

Standard
I. 前言
如果看機器學習或電腦視覺相關的研究,一定對
True Positive(TP), False Positive(FP), True Negative(TN), False Negative(FN)不陌生,
也一定很常看到
ROC curve, AUC, CI, Recall, F1 score, Sensitivity, Specificity, Accuracy等等。
而今天這篇文章就要來嘗試理解這一切。舉個例子來說,
https://ai.googleblog.com/2016/11/deep-learning-for-detection-of-diabetic.html
這是一篇google research的文章,透過Deep Learning與電腦視覺來辨識眼睛,
檢查是否有糖尿病引起的眼睛疾病,
文中他們將結果以以下的方式表示:
 
如果完全能看懂,那麼你已經充分理解這個部分了,可以上一頁
如果沒有,讓我們看下去吧

TCP: connection-oriented transmission 三種溝通方式

Standard
TCP is connection-oriented. A connection-oriented transport protocol establishes a connection between the source and destination. All of the segments belonging to a message are then sent over this virtual path. A connection-oriented transmission requires three phases: connection establishment, data transfer, and connection termination.

A is client, B is server.

1.Connection Establishment( a.k.a. three-way handshake)


2.Data Transfer (using telnet demo)


3-1.Connection Termination (FIN)


3-2.Connection Termination (RST)


iptables : Linux firewall usage note 指令整理 用法

Standard


Firewall 中譯是防火牆,他本身並不能用來防止你的電腦中毒,他只能制定一些rule,來規定哪些封包可以傳到你的電腦,但適當的運用防火牆擋掉不好的ip與關閉不常用到的port口,確實可以降低你電腦中毒的機率。

Example of usage:
iptables --help
iptables -L -n --line-numbers                      #List all rules
iptables -L INPUT -n --line-numbers           #List INPUT rules
iptables -F                                              #Delete all rules
iptables -D INPUT 1                                #Delete rule No.1
iptables -P INPUT ACCEPT                     #INPUT policy is set to ACCEPT
iptables -I INPUT -s 192.168.0.157 -p tcp —-deport 23 -j REJECT     #Insert rule with port
iptables -D INPUT -s 192.168.0.157 -p tcp —-deport 23 -j REJECT    #Delete rule
iptables -I INPUT -s 192.168.0.157 -p tcp -j REJECT                                   #Insert rule without port
iptables -I OUTPUT -p tcp -m multipart —-sport 80,443 -j REJECT    #Insert rule with multiple port

Commands:
Either long or short options are allowed.
  --append  -A chain                                 Append to chain
  --delete  -D chain                                   Delete matching rule from chain
  --delete  -D chain rulenum                       Delete rule rulenum (1 = first) from chain
  --insert  -I chain [rulenum]                       Insert in chain as rulenum (default 1=first)
  --flush   -F [chain]                                 Delete all rules in  chain or all chains
  --list    -L [chain [rulenum]]         List the rules in a chain or all chains
  --policy  -P chain target              Change policy on chain to target

Options:
[!] --proto           -p proto                         protocol: by number or name, eg. `tcp'
[!] --source          -s address[/mask][...]        source specification
[!] --destination -d address[/mask][...]          destination specification
[!] --in-interface -i input name[+]                network interface name ([+] for wildcard)
[!] --out-interface -o output name[+] network interface name ([+] for wildcard)
    --jump           -j target                          target for rule (may load target extension)
    --match          -m match                       extended match (may load extension), ex: multiport
    --numeric       -n                                 numeric output of addresses and ports
    --table            -t table                           table to manipulate (default: `filter')
    --line-numbers                                     print line numbers when listing
[!] --version        -V                                 print package version.
    --sport           --source-port                   aim to source port
    --dport           --destination-port             aim to destination port

「精緻鋼彈食玩!啪萬」FW SD GUNDAM NEO series 01 鋼彈食玩 01號~06號 開箱

Standard

引述:前篇
FW SD GUNDAM NEO 系列是2017年出的鋼彈食玩(真的有糖果
分別在2月、5月、9月各釋出一系列(六款
單一盒的定價為¥370(不太清楚台灣當時的定價
規格大概就如轉蛋裡會轉到的Q版鋼彈公仔,頭、手、身體可分開
特色是細部特別精緻,眼睛等發亮處皆以壓克力取代照光反射會亮,可拆部分更多/細

「精緻鋼彈食玩!啪零」FW SD GUNDAM NEO 全系列 開箱 與 展示架製作

Standard
FW SD GUNDAM NEO 系列是2017年出的鋼彈食玩(真的有糖果
分別在2月、5月、9月各釋出一系列(六款
單一盒的定價為¥370(不太清楚台灣當時的定價
規格大概就如轉蛋裡會轉到的Q版鋼彈公仔,頭、手、身體可分開
特色是細部特別精緻,眼睛等發亮處皆以壓克力取代照光反射會亮,可拆部分更多/細
http://www.bandai.co.jp/candy/gundam/sdneo/

這次買了這個系列的原因就是因為在萬年大樓的櫥窗看到這系列的真的做得很精緻
然後一隻換算成台幣又不貴,於是就趁它還沒變古董前上沒屋頂買了整套(三系列)

「API vs Webhook」比較 介紹 筆記(HTTP RESTful

Standard
HTTP:
https://dotblogs.com.tw/jeffyang/2018/04/21/233001
在HTTP協定中,定義了多種不同的method做為服務的請求方法:
GET:取得(想要的服務)的資料或是狀態。(safe & idempotent)
POST:新增一項資料。
PUT:利用更新的方式於"指定位置"新增一項資料。 (idempotent)
PATCH:在現有的資料欄位中,增加或部分更新一筆新的資料。
DELETE:指定資料刪除。 (idempotent)
* idempotent 是指該操作不管做1遍、2遍或多遍,都會得到同樣的資源狀態結果。
* safe 是指該操作不會改變原本的資源狀態,並且同樣的結果是可以被快取(Cache)的。
* POST/PUT 都可以用來新增
- POST的定義上屬於將原先沒有的資料去做一筆新增的動作,
- PUT在定義上(idempotent)無論做多少次,回傳結果都會一樣。
* PATCH/PUT 都可以用來修改
- PATCH則可以針對已經存在的資料欄位去做部分更新
- PUT就像是把整份改好的表格重新上傳。

當Web service使用Web API進行介面介接時
每一串我們設計的URL,就會是一個專屬的服務『窗口』。
簡單說,不同的Method就是對同一件事情做不同的操作。

如果我們在寫一隻商品的WebAPI,大概會長這樣:
獲得商品資料 GET /getAllItems
獲得商品資料 GET /getItem/11
新增商品資料 POST /createItem
更新商品資料 POST /updateItem/
刪除商品資料 POST /deleteItem/



Restful:
https://dotblogs.com.tw/jeffyang/2018/04/21/233001
REST全名 Resource Representational State Transfer
Resource:資源。
Representational:表現形式,如JSON,XML...
State Transfer:狀態變化。即上述講到的可利用HTTP動詞們來做呼叫。
將原本五個HTTP的操作對應到資料庫基本操作CRUD。
CRUD 為 Create(新增)、Read(讀取)、Update(更新)與Delete(刪除)的縮寫
PUT 則是比較特別一點,其實它並不直接對應CRUD裡面的任何一項。

相對於前者普通的WebAPI,Restful的形式會長這樣
獲取商品資料 /GET /items
獲取商品資料 /GET /items/1
新增商品資料 /POST /items
更新商品資料 /PATCH /items/1
刪除商品資料 /DELETE /items/1

簡單的說,就是一個單從發出的HTTP要求裡面所包含的資訊
就可以直接預期這要求會收到怎樣類型的資料
充分地使用了 HTTP protocol (GET/POST/PUT/DELETE/PATCH),達到:
1.以直觀簡潔的資源 URI
2.並且善用 HTTP Verb
3.達到對資源的操作
4.並使用 Web 所接受的資料類型: JSON, XML, YAML 等
Web API沒有一定要照著上面的定義敘述建立
但如果你符合的話,你可以將它稱作Restful API



API:
通常是client端透過api發送request(GET, POST, PUT, PATCH, DELETE)給server端(有一個url),來要求特定資料,而server端response給clint端,response的內容包含content跟header(status_code= 200)等等,也就是說透過api的話是,client有request server端才有response(request followed by a response),即使client端關心的資料在server上有任何更新,server也不會主動告知,除非client有發request.

以下圖來舉例說明的話:
"data pls?" =
curl -v -X GET -d '{"ID":"1122112", "message":"this is a test."}' -H 'Content-Type:application/json' -H 'Accept:application/json' -H 'Authorization:' https://api.database-server.com/api/data
"nope" =
HTTP/1.1 200 OK
{"ID":"1122112", "gender":"male","change":"nope"}

Webhook:
「Sometimes people call webhooks reverse APIs」但更精準的來說,Webhook比API 省略了一個request的步驟。前面有提到API是「request followed by a response」有問才有答,Webhook則是「it just sends the data when it’s available」「Whenever there’s something new, the webhook will send it to your URL.」主動告知。通常client端需要有一個url提供給server端,server端在有client端關心的訊息發生時,主動透過client端提供的url,發(request)一個POST告知client內容,而client則回傳一個簡單的response ok(status_code= 200)。

以下圖來舉例說明的話:
"data" =
POST -d '{"ID":"1122112", "gender":"female","change":"yes"} -H 'Content-Type:application/json' -H 'Accept:application/json' -H 'Authorization:<token>' https://api.shannon-client.com/receive
"thanks:)" =
HTTP/1.1 200 OK
{"text":"thanks:)"}


https://thenewstack.io/wonderful-world-webhooks/





HTTP response status_code:
https://dotblogs.com.tw/jeffyang/2018/04/21/233001
回應狀態碼是 HTTP 規範的一部分。有相當多的人來處理最常見的情況。本著讓我們的 rest 服務接受 HTTP 規範的精神, 我們的 Web api 應該返回相關的 HTTP 狀態碼。例如, 在成功創建資源 (例如從 POST 請求中) 時, API 應返回 HTTP 狀態碼201。有效的HTTP 狀態碼清單可用此處列出每個的詳細說明。
"前 10" HTTP 回應狀態碼的建議用法如下:
200 OK
常規成功狀態碼。這是最常見的代碼。用來表示成功。
201 CREATED(創建)
成功創建 (通過 POST 或投入)。設置位置標題以包含指向新創建的資源的連結 (開機自檢)。回應正文內容可能存在也可能不存在。
204 NO CONTENT(無內容)
表示成功, 但回應正文中沒有任何東西, 通常用於刪除和放置操作。
400 BAD REQUEST(錯誤請求)
當滿足請求時的常規錯誤將導致無效狀態。域驗證錯誤、缺失資料等是一些例子。
401 UNAUTHORIZED(未經授權)
缺少或不正確身份驗證權杖的錯誤代碼回應。
403 FORBIDDEN(禁止)
當使用者未被授權執行操作或資源因某種原因而無法接通 (例如, 時間限制等) 時的錯誤代碼。
404 NOT FOUND(未找到)
在找不到請求的資源時使用, 無論它是否存在, 或者是否存在401或 403, 出於安全原因, 服務要遮罩。
405 METHOD NOT ALLOWED(方法不允許)
用於指示請求的 URL 存在, 但請求的 HTTP 方法不適用。例如, 發佈users/12345後, API 不支援以這種方式 (提供的 ID) 創建資源。在返回405以指示支援的 HTTP 方法時, 必須設置允許 HTTP 標頭。在前面的情況下, 頁眉看起來像 "允許: 獲取, 放置, 刪除"
409 CONFLICT(衝突)
只要滿足請求, 就會導致資源衝突。重複的條目 (如嘗試創建兩個具有相同資訊的客戶) 不支援串聯刪除時刪除根物件, 這是幾個示例。
500 INTERNAL SERVER ERROR(內部伺服器錯誤)
不要故意把這個還給我。伺服器端引發異常時的常規 catch 錯誤。僅適用于消費者無法從其端位址進行處理的錯誤。

2018 Summer Intern 暑期實習 面試經驗 回憶錄(MTK, TSMC, UmboCV, HP, IBM, Google, Tomofun, Qnap, Ruckus Networks, brocere, 7starlake, 資策會服創所

Standard

我在ptt的原文
https://www.ptt.cc/bbs/Tech_Job/M.1535875419.A.AA9.html

因為今年四下的時候課表的課終於鬆了一點
有比較多的時間可以準備和面試
所以今年就比去年多投了很多家
想說不管大小公司有理我的都去面面看長個經驗
了解不同的職缺與公司

實際投出去的履歷大概有三十幾封到不同的公司
分三波在3~5月的時候
其中8成都是用104投的
然後經過三波折磨的面試與等待
(主要是等待啦,等回信,等約面試,等面試,等結果
就幸運的被錄取,然後不幸地被我忘掉要發
所以這篇就在草稿區躺了好幾個月
直到實習到了第三個月才開始整理之前的筆記
發出這一篇
所以姑且稱這篇為回憶錄

「重灌實驗室"筆電" Ubuntu 14.04 16.04」無法以ubuntu開機 / grub 未顯示 / boot order 更改方法 更改無效 / windows boot manager / thinkpad —— trouble shooting

Standard
其實在筆電上灌ubuntu大致上和在桌電上灌沒什麼差別
可以參考上一篇:
「重灌實驗室電腦 Ubuntu 14.04 16.04」雙系統,分割硬碟,製作開機隨身碟,真的很簡單,小朋友一定很喜歡~
有些人運氣好,甚至可以用一樣的方法一次就成功
但運氣不好的話會怎麼樣都跳不出grub畫面(作業系統選單)如下圖,
取而代之的是直接進入windows系統,或直接進入Ubuntu系統
所以本篇接下來就要就這個問題來探討解法
然後原諒我都用手機拍,因為懶得截圖再傳來傳去


Step 0. 確認環境
首先先介紹一下我的環境
我使用的筆電是
Thinkpad X1 Carbon 4th 灌 windows, ubuntu16.04 雙系統在同一個 256G的硬碟(SSD)
就我在debug時爬過的資料所知這個問題會隨著不同品牌不同型號而有所不同(BIOS不一樣)
所以如果你是一次就成功的也不要笑你朋友一直灌不好很智障
因為等你真的去用他的電腦灌的時候你有可能也灌不好


Step 1. 進BIOS改設定
前置作業,插上Live USB (Ubuntu開機隨身碟),進BIOS,調整設定
進BIOS的方法百百種,每個廠牌的筆電要進去要按的案件都不一樣
Delete, Enter, ESC, F1, F2, F8, F10, F12 ....千奇百怪
但有一個方法最穩那就是先進去windows10
在桌面右鍵 顯示設定
搜尋bios,進入 變更進階啟動選項
點 立即啟動
使用裝置
選擇Setup直接至BIOS選單
或是選擇USB HDD
在這個換面按enter
F1進入BIOS
確定幾個設定是否正確
Security => Secure Boot => Secure Boot [Disabled]
Startup => Boot => Boot Priority Order => 把剛剛插的USB調到第一個
Startup => Boot Order Lock [Disabled]
Startup => UEFI/Legacy Boot [Both]
Startup => UEFI/Legacy Boot -- UEFI/Legacy Boot Priority [UEFI]
最後
Restart => Exit Saving Changes => Yes


Step 2. Install Ubuntu by live USB
在最後修改完BIOS後重開機應該就會進入live USB
接下來就和之前一樣
-> try ubuntu -> gparted切割 -> install ubuntu開始安裝 -> 選擇something else
要注意的是,從這裡開始就和上一篇有些許的不同
要特別注意「 Device for boot loader installation: 」的選擇
如果和我一樣是在同一顆硬碟裡面灌windows和ubuntu,並且選擇以這個硬碟開機的話
這邊務必選擇「/dev/sda? Windows Boot Manager」
然後就照著之前教學的步驟灌完


Step 3. Change boot order
灌好後重啟電腦,想必有超過一半的然還是以windows開機
沒有跳出任何選單可以選擇以ubuntu開機
因此我們要在boot order裡新增ubuntu這個開機選項
做此步驟前務必確認你的電腦的BIOS一定要Disable Boot Order Lock
不然怎麼改,重開機之後都是不會變的!! from之前的慘痛經驗
https://github.com/rhboot/efibootmgr/issues/19
以下介紹三種方法:(新手建議使用法二就好)
https://superuser.com/questions/1247300/how-to-make-uefi-bios-start-grub-not-windows


法一:用ubuntu開機隨身碟的try ubuntu系統改
打開live usb的ubuntu的terminal
sudo efibootmgr
查看你目前的選項代號與開機順序(BootOrder)
複製原本的順序,並做出調整,以下為舉例
sudo efibootmgr -o 001B,0002,0000


法二:用windows軟體easyEFI
上網下載免費的試用版easyEFI,安裝並打開程式
進到Manage EFI Boot Option,選Create a new entry
Type選Linux,Description寫ubuntu,File path照下圖的Browse,
Please select the target partition選windows跟ubuntu共存的那顆應該會有個區間可以點


法三:用windows cmd改
回到windows10,搜尋cmd,右鍵以系統管理員身份執行,打開命令提示字元
bcdedit
設定新的boot loader
bcdedit /set {bootmgr} path \EFI\ubuntu\shimx64.efi

bcdedit /set {bootmgr} path \EFI\ubuntu\grubx64.efi
然後讓選項好看一點
bcdedit /set "{bootmgr}" description "ubuntu"


WHY
1.
可以想像成 boot loader 應該都要放在 type 為 efi 的磁碟分區中
或是說 efi 這個型態的分區就是專門拿來放 boot loader 的
而如果先灌好windows的話就會自動切好這個分區 (約100~200MB)
也就是上圖選單中命名為 Windows Boot Manager 的那個
並且在裡面放入 Windows Boot Manager 這個 boot loader

2.
根據鳥哥
開機的流程由:BIOS-->MBR-->-->boot loader-->核心檔案;
boot loader的功能主要有:提供選單、載入核心、轉交控制權給其他loader
boot loader可以安裝的地點有兩個,分別是 MBR 與 boot sector
如果空有OS沒有 boot loader 是沒辦法開啟該作業系統的
想實驗的朋友可以把 Windows Boot Manager 這個磁碟分區刪掉看看
windows 保證開不起來
實際上 efi 這個磁碟分區裡面的檔案就如easyEFI上面看到的一樣
那些 .efi檔 就是可以開機的關鍵
如果去看 bios 等等的設定,唯有有efi檔的選項選下去才是有辦法開機的

3.
整理一下
所以如果以 windows ubuntu 同一硬碟下的雙系統為例
該硬碟會被切分出四區,如下:name(type)
ubuntuOS(ext4), windowsOS(ntfs), linux-swap(swap), Windows Boot Manager(efi)

4.
但即使你把boot loader放在對的位置了
這時你會發現你的電腦開機之後還是直接出現windows沒有跳出選單
我認為可以看作是 windows boot manager 比較強勢把主控權搶走
實際上來說就是 windows boot manager 的 boot order 比較前面
加上灌好ubuntu後,系統沒有在 efi 分區中 抓到 grub
所以甚至連boot選項都沒出現ubuntu

5.結論
所以我們要做的事就是讓系統找到efi分區中新載的ubuntu的boot loader
這樣boot order裡面就會出現ubuntu這個選項
然後我們再把boot order的順序 ubuntu放在windows boot manager前面就可以了


「ROS烏龜人 #11」透過 turtlebot_gazebo 試著了解 gmapping 、 amcl 、 move_base 筆記

Standard

主站:http://wiki.ros.org/Robots/TurtleBot 
amcl: http://wiki.ros.org/amcl?distro=indigo
move_base: http://wiki.ros.org/move_base?distro=indigo
map_server: http://wiki.ros.org/map_server
tutorial: http://wiki.ros.org/turtlebot_gazebo

Big picture:
gmapping是同時建圖 & 定位機器人,並且可以存圖
amcl是當已經有地圖,定位機器人用,通常用在沒有跑slam時
move_base是當已經有地圖、已經定位,進行導航用,給地圖、機器人位置、目標點


6-0 環境下載(gazebo_turtlebot)
$ sudo apt-get install ros-indigo-turtlebot-gazebo
打開環境gazebo & turtlebot
$ roslaunch turtlebot_gazebo turtlebot_world.launch
//如果不行就重開terminal

6-1 Gazebo Bringup Guide
http://wiki.ros.org/turtlebot_gazebo/Tutorials/indigo/Gazebo%20Bringup%20Guide

6-2 Explore the Gazebo world
http://wiki.ros.org/turtlebot_gazebo/Tutorials/indigo/Explore%20the%20Gazebo%20world
透過鍵盤控制turtlebot在gazebo中的移動
$ roslaunch turtlebot_teleop keyboard_teleop.launch
在rviz中查看turtlebot
$ roslaunch turtlebot_rviz_launchers view_robot.launch

6-3 Make a map and navigate with it
http://wiki.ros.org/turtlebot_gazebo/Tutorials/indigo/Make%20a%20map%20and%20navigate%20with%20it
map building (by gmapping
$ roslaunch turtlebot_gazebo gmapping_demo.launch
在rviz中查看turtlebot的mapping過程
$ roslaunch turtlebot_rviz_launchers view_navigation.launch
save map to disk
$ rosrun map_server map_saver -f <your map name>.yaml
檢視我們存好的的地圖
$ eog <your map name>.pgm

navigate the background (by amcl
$ roslaunch turtlebot_gazebo amcl_demo.launch map_file:=<full path to your map YAML file>


「ROS烏龜人 #08」試著了解 tf 筆記

Standard