程式設計週記[2016/03/18]:AlphaGo的勝利代表機器學習對於選擇這件事情已經更加熟練

這是什麼?

程式週記主要內容如下:

Gihub project 介紹:

  • 主要會貼一些github,但是會盡量寫上一些有用的評語(或是我容易想到的關鍵詞)幫助以後查詢

網路文章心得:

  • 會寫些心得,強迫自己閱讀.

“程式週記”並且定期週期性更新.

大部分內容在我的twitter都會有,這邊只是將一些簡單的心得與感想註解一下.

本週摘要

本週依舊圍繞在AlphaGo與機器學習上,不過工作上的長官給了我很好的學習方向. 對於新的事物,我們只要搞懂三件事情(不論你有沒有興趣)

  1. 為何以前做不到? 以前的困難是什麼?
  2. 這一次做到的原因是什麼? 突破點是什麼?
  3. 對於相關技術未來的展望?

這個禮拜花了不少時間先思考該如何寫專案,確定好整個方向與架構後才開始動手.想不到卻相當的迅速.

Go

A very minimal but flexible golang web application framework, providing a robust set of features for building single & multi-page, web applications. http://kataras.github.io/iris/

minimal but flexible golang web application framework for #golang, and the performance benchmark is perfect

Official golang implementation of the Ethereum protocol http://ethereum.github.io/go-ethereum/

類似於blockchain的系統(我不是很確定該用哪種名稱來統稱這種系統).

groupcache is a caching and cache-filling library, intended as a replacement for memcached in many cases.

groupcache is a caching and cache-filling library, intended as a replacement for memcached in many cases.

類似於memcached,可以透過key來cache資料.

Python

Flappy Bird hack using Deep Reinforcement Learning (Deep Q-learning).

用Tensorflow (深度學習) 玩#FalppyBird 聽說可以玩360關

AlphaGo: A replication of DeepMind’s 2016 Nature publication, “Mastering the game of Go with deep neural networks and tree search,” details of which can be found on their website.

使用Python 建立的AlphaGo Deep Learning Engine.

Ruby

jekyll-now: Build a Jekyll blog in minutes, without touching the command line.

jekyll-now provide a easy way to setup your jekyll blog on github-page with nicely theme.

Android/JAVA/NODE.JS

Docker

Why you should (maybe) switch FROM ubuntu to FROM alpine for more secure images

在reddit上面有人建議(?)不要再使用 FROM ubuntu 而改用 FROM alpine .因為有太多的安全威脅… 這張圖可以顯示的很清楚之間差異… 此外: 這個網站可以查看你的docker container有多少安全威脅…

RUNNING A DISTRIBUTED DOCKER SWARM ON AWS

透過docker-compose, docker swarm 來在AWS架設HA RabbitMQ Cluster.

iOS/Swift

網站文章

網站收集

過往記憶

一個專注在Hadoop, Spark Hive的相關程式開發介紹部落格.內容相當清楚而充實.

Udacity: Deep Learning Course build by Google

由Google開啟的課程關於機器學習的部分,裡面會教導如何使用TensorFlow,主要語言是使用Python.

有聲書/影片心得

SEDaily: Cassandra with Tim Berglund

這一篇採訪的Tim Berglund來討論為何Cassandra能夠提供如此高效能的存取效能.也有解釋Cassandra在Big Table上面運作的方式. 由於Cassandra本身是透過Amazon Dynamo與Google BigTable的兩篇論文所產生的技術

這裡有另外一部影片介紹Cassandra

  • Amazon Dynamo: (paper)
    • How to build data store with reliability, alway-on and performant.
  • Google BigTable: (paper)
    • Richer data model
    • 1 key lots of value
    • Fast sequence access

本週專案

這邊會寫一些我的Project 52的成果.

本週專案: https://github.com/kkdai/githubrss

一個產生RSS Feed 的工具,主要是針對 Github 的 starred/follower/following.透過這個把資料產生給 IFTTT做後續使用(via web server)

這次的專案只花了四個番茄(也就是100分鐘的時間)就完成,算是挺有效率的.不過這次思考整個專案該如何做就花了一天.整天在想要如何達成相關的事項,需要使用到哪些工具與技術,該搭配哪些架構.

接下來幾個專案,應該會把可以拿來把我身邊一些繁瑣事情(記錄有趣Github, 網址並且整理成MD)自動化的事情搞定.

[TIL] About Go template usage

起因

想要試著寫RSS render,其實並沒有那麼困難.

步驟

先建立一個 tmpl file (ex: atom.tmpl)

<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title></title>
    <link></link>
    <atom:link href="" rel="self" type="application/rss+xml" />
    <description></description>
    <pubDate></pubDate>
    <lastBuildDate></lastBuildDate>


      <item>
        <title></title>
        <description></description>
        <pubDate></pubDate>
        <guid></guid>
        <link></link>
      </item>
      

  </channel>
</rss>

然後再Code裡面,去使用html/template

func AtomRender() string {
	var r SomeStuct
	
	//讀入template
	t, err := template.ParseFiles("atom.tmpl")
	if err != nil {
		log.Fatal(err)
	}
	// log.Println("parse template")

	//產生io.writer buffer
	buf := new(bytes.Buffer)
	//讀取資料
	err = t.Execute(buf, r)
	// log.Println("execute it")
	if err != nil {
		log.Fatal(err)
	}
	// log.Println("get rss:", buf.String())
	return buf.String()
}

”+”, “-“ charactor handle

想要在html 裡面parse +或是-,可別直接當成string

//定義成 template.HTML
RssNow   template.HTML
//
t.RssNow = template.HTML(SomeString)

跟RFC822對於W3C Feed Validator的問題

問題:

Hi All, I trying to write a feed render and I found the time.Format(time.RFC822) is not valid by W3C feed validator . Here is the code http://play.golang.org/p/mfzLKsuVOW

Not sure if it is a issue, or I misunderstanding.

得到解答:

  1. try time.RFC1123.seems to be close enough

–> RFC1123 seems much close but w3c feed validator will fail.

  1. RFC822 only specifies 2 digit years, so I think go is doing the correct thing. it would appear the w3c validator is interpreting rfc822 dates according to some other interpretation of RFC822

官方有類似的問題: Golang issue

[TIL] 為何圍棋AlphaGo贏了人類有那麼重要?

前提:

要跟部門大長官開會前,他提到了目前受歡迎的AlphaGo事件.提醒我們對於新聞事件的思考邏輯應該是?

  • 這個新科技是什麼?
  • 為什麼之前做不到? 這次的突破點是什麼?
  • 之後有可能的路是什麼?

這個思考脈絡很能夠引發對於科技更深一步的思考,於是找了一些資料試著把這件事情搞清楚.

裡面有幾個前提是:

幾個可能的Q&A:

為何電腦下圍棋很難?

因為圍棋可能性是19X19格子,共有361個落子點.所以計算出來需要10的121次方.. (遠遠大過古代宇宙原子說 10的75次方)

以西洋棋(比較簡單)來說40個分支,20步就算是1GHz的處理器,也要計算3486528500050735年. 所以就知道電腦要下圍棋在之前是不行的.

為何AlphaGo 這次能贏? 突破點是什麼?

Machine Learning 的突破點

Deep Learning突破點 2006 的是「A fast learning algorithm for deep belief nets」類神經網路的亂數權重不是隨機,而是經過計算.如此一來可以透過計算的權重刪減掉許多的子樹,大幅度地減少類神經網路的尋找解答的範圍.

之前下西洋棋的”深藍”取決法是透過MinMax(也就是透過賽局理論)來選取最好的下法跟Alpha-Beta Pruning 來刪除不必要的搜尋路徑(不會勝利的選擇).

AlphaGo 如何獲勝

而AlphaGo 思考模式.. 兩個類神經網路(人家稱為兩個大腦)(Policy Network, Value Network)

  • Policy Network(策略類神經網路):
    • 猜測對方落子的機率.是一種大量輸入棋譜的監督式學習(透過猜測,並且給予解答認證).
    • 由於透過整體形勢來做預測,亂下是無法打亂電腦的計算.
    • 透過增強策略網路(兩兩對戰,增加預測機率),減少誤判.
  • Value Network (評價網路):
    • 評估目前局勢,找出如何下會取得比較高的勝率.

最後的拼圖,蒙地卡羅搜尋樹:

  • 選取:
    • 隨機挑選一個結果(由於兩個大腦挑選過,可挑選的分支變得可以計算).
  • 展開:
    • 透過剛剛開始的結果,推導接下來棋局.
  • 評估:
    • 計算這次推導結果(樹的搜尋結果)
  • 倒傳導:
    • 挑選最佳結果後,將結果回傳到一開始,然後繼續之後的計算.

AlphaGo贏了.. 接下來代表著什麼?

這部分留著繼續思考….

參考資料:

[TIL]關於BlockChain的學習整理

前提:

主要是在Line上面的討論,有人覺得像是Bitcoin中blockchain把資料全部分散放在各個client裡面是很不好的做法.這樣所有資料都redundancy.

於是再把一些相關spec拿出來看.. 快速整理一下..



Blockchain 架構速記:

Bitcoin 最好的 blockchain 1.0 應用

喧賓奪主的應用,大概非Bitcoin莫屬. 沒太多人(一般民眾)注意到blockchain的精髓. 只記得這個應用.. 不過隨著幾個大廠商(ex: IBM) 也在開發自己的blockchain 應用. 這一塊早已在新創產業不是話題了…

bitcoin 被稱為是blockchain 1.0的應用,而現階段在新創產業與一些大公司在推廣的就稱為是blockchain 2.0 (smart contract) .

簡單架構

  • Bitcoin wallet:
    • 一個記錄所有交易紀錄(以下皆成為block)的資料庫(使用Google LevelDB)
    • 每筆交易紀錄(block)平均大小是250bytes,其格式包括了:
      • Block Size:
        • 4 bytes, 來敘述block大小.
      • Block Header:
        • 80 bytes, Block header 包括 version, previous hash, timestamp.. (還有其他的)
      • Transaction Counter:
        • 1~9 bytes (可變) 有多少交易在這個block.
      • Variable:
        • 大小不定, 交易內容..
    • 每筆記錄(block)與前一筆是串接在一起的(ordering),透過Hash value作為唯一的識別(using SHA256).
  • Bitcoin miner: (所謂的挖礦機)
    • 負責尋找最新的block hash value,並且確保該hash value 還沒有被產生過.
    • 產生block會先加在最後,並且獲得一定的bitcoin作為獎勵.由於SHA256有其限制,所以能產生的bitcoin被限制在21000k bitcoin
    • 取得新的Hash後,需要以下的兩者擇一成真,才能獲的bitcoin:
      • 取得大多數的wallet的同意(大於1/2 的 computing power)
      • 連續取得6個新的Hash (表示你的機器速度大於全世界的miner六倍以上)



Bitcoin的特性與展望:

特性:

  • 去中心化
  • 安全(透過其他P2P的審議機制)
  • 所有端點會記錄大部分資料(或全部資料)



未來展望:

除了金流的bitcoin之外,可能有以下的應用:

電子簽約(Smart Contract)

  • 將所有的簽約內容當成錢幣來存放,所有相關人都必須存放所有內容.
  • 存放雙方資料,商品名稱與單位量.

挑戰:

  • 如何計算營收?
  • 如何避免透露過多商業資訊?

證券交割

將股票單位作為blockchain 交易的單位.

遊戲幣

這邊沒有太多特別地方,就是把遊戲中的貨幣改成透過blockchain.可以讓民眾私下交易遊戲幣.

專利與商品證明

bitproof.io 想到透過blockchain來保護智慧財產權.他可以透過檔案(將你的專利或是文章作成檔案後,上傳來取得特定的標記),透過該標記來證明你是第一版的擁有者.

其他:

朋友在討論中談到:

“Blockchain 機制會造成資料的重複嗎?”

經過我尋找,一些資料如下

  1. 每筆交易資料 平均是 250 bytes (包含多筆交易資料) 平均每筆交易資料為 26 bytes (參考bitcoin wiki)
  2. 透過Google LevelDB 大小會被壓縮..
  3. 其實儲存可能不會超過一半以上,因為機制上只要一半以上通過就可以. 不過當網路順暢時還是會儲存全部.

相關鏈結:

[影片心得]Steve Jobs遺失的採訪: 人才與創意管理的內功

Steve Jobs - The Lost Interview from Daniel Wagner on Vimeo.

##前提

最近MOD送我電影199 偶爾看到.. 覺得實在很棒… (雖然是20年前訪問… 而且結果大家都知道(爆雷))

##內容

完美的創意與完美的產品的差異 — 在於大量完美的工藝

“There is just tremendous amount of craftsmanship in between a great idea and a great product.”

“問題在於優秀的創意到產品之間存在著大量完美的工藝”

“And as you evolve the great idea, it changes and grows, it never comes out like it starts.”

實現創意的過程中…當你了解的越多…想法會變化甚至面目全非.

“Because you learn a lot more, you get into th subtleties, you also find the… There’s tremendous trade-off that you have to make.”

你不得一次次權衡利弊..做出讓步與調整.

##相關鏈結

[Docker] 跟朋友的Docker使用的Q&A

起因:

有個朋友看我貼了篇docker swarm的文章,於是跟我討論了一些docker的用法.

覺得整個討論相當有意義,於是徵求同意後把文章記錄一下.


整個討論:

討論應用的情境

朋友: 你也有在玩docker嗎?

: 當然…

朋友: 剛入門一週 在指點一下XD



朋友: 我目前只會裝跟build自己的image,打算把開發環境跟 production都換成docker.

: dockerize your all service 是個蠻好的課題

朋友: 目前還不是很知道deploy怎麼做比較好,不過我看他還有一堆有的沒的功能 太底層我不太會.

: deploy 就透過docker-compose 一個設定檔 db/web browser/service 都搞定. 至於Docker也不用看的太底層啦,你先搞懂基礎 docker,在看docker-compose 就已經出師了.

朋友: 所以我local 開發環境要deploy正式環境 用compose就可以,dockerfile有些指令我還看不太懂.

: 喔… 你是要deploy dev-> prod

: 沒關係.沒有人記得起來所有docker指令.docker console 大概是我覺得最討厭的指令集了.

朋友: 想要找個比較簡單的做法 : 那你看看我剛剛貼的swarm 朋友: 每次裝aws環境 裝到我快吐了




解釋Docker Compose 跟 Swarm應用差異

朋友: 所以compose是幹嘛的,swarm我看很多人在講分散式系統,我的需求很簡單 就是想要dev -> 多台production.

: 簡單的說

  • docker-compose 可以一次呼叫一群的docker container 並且設定串接在一起.
  • swarm 可以將全世界的container歸類在一起..你在local 就可以操控跨網路的container

朋友: 所以compose必須在同一台主機上

: 對…基本上. 但是docker-compose可以跟swarm混用

朋友: 就是一台很強電腦跑很多台東西 恩,混用我可以理解.那我應該要去看swarm.

: 一個docker-compose 例子.不過,你的方向是swarm.

然後我貼的那篇經驗談 好像就有提到 DEV->PRE PROD->PROD 的控制




拆解Services方法的討論

朋友: 所以你docker-compose在使用上有把 application / db / web server三個都要分三個container喔.自己dev環境也這樣搞嗎? : 能拆成這樣 到時候要換任何一個不用重啟container

朋友: 我是很懶 全部裝一起,production才會拆開.

: 現在不拆之後拆就會出問題…那就失去docker的好處

朋友: 不過local如果分開 production會比較輕鬆一點

: 而且重build 跟跑也快 才能節省時間啊.

朋友: 所以你這樣需要三個image嗎

: 對,就docker microservice 概念 基本上一個service 就應該要是一個image.之後才方便抽換.




關於Mac上使用boot2docker VM可能造成的問題

朋友: 這樣硬碟就爆了XD

: 你們不都是MBPR? 我128G,都沒講話 XD.

朋友: 我現在不知道為啥256g一直滿,打算把整台重灌. 然後全妝成docker,以後要砍環境比較快.

: 我docker都用windows 桌機跑 VM,然後MAC連過去. 你硬碟會爆應該是xcode,可以看看我這篇文章

記得經常去清一下 有是幾十G.

此外,MAC docker 跑VM 就算image 砍掉…空間一樣算喔 所以你又要看另外一個指令 docker-machine 把VM重啟 清理一下

朋友: 有這回事? 重開機會好嗎?

: 不會好 要砍掉VM 就像是VirtualBox 空間只會一直上去啊

朋友:你現在部落格用哪套啊?最近打算重做一個自己網站

:blog 用jekyll 架在github page

朋友:我現在mac上是用boot to docker

:大家都是 所以你空間有可能都是VM吃掉. 這個人repo 把所有都用docker image chrome/sublime/spotify 超屌




關於Virtual Box 砍掉已經用空間的方式

朋友: 要怎麼砍掉vm啊?

: docker-machine rm default 相關的看一下doc

記得砍掉docker-machine,要重啟跟重新設定port docker port 跟socket addr.可以看看這篇

朋友: 所以整個docker都是一個vm

: 對

朋友:砍掉那裡面東西都不見了吧

: 當然

朋友: 那這樣超麻煩勒

: 所以你先透過VBOX 看一下 到底有多少空間被吃掉 因為VM 空間是變大後不會縮回來的 (除非你用vboxresie vbox resize.

朋友:哪個指令看size? docker-machine inspect嗎?

: 是.. 不然virtual box UI也可以看

朋友:virtual box UI 在哪啊 裝好就有嗎

: 當初裝docker 都會裝一套 Virtual Box




討論結束

:這一串Q&A蠻有意義的.. 等等整理一下 變成一篇 blog…. Today I learn (again)

朋友: 你每天都整理一堆啊? 超強

:因為不整理會忘記..老了..整理起來 自己多懂一次.




心得

強者我朋友,不愧是強者.很能透過Q&A的方式來解答自己心中的疑問,也就是如何問對問題.又學了一課…

相關鏈結