[新聞與心得]微軟開源winobjc

本日最紅的github (不到24h 超過2000+ star),莫過於微軟的winobjc,玩了一天分析一下:

###先講結論:

####想使用的話.. 還不用急著用.. 除非你想幫微軟土炮iOS 所有foundation XDDD

  1. 首先這是一個把你的iOS App ObjectC的code 透過vsimporter轉出一個 VS solution.然後透過VS2015 的clang compiler 編譯成 Windows Universal App (or Windows Phone App)
  2. 你能想到的 UIKit AVFoundation 都是土法透過DX11自幹出每一個功能(reverse engineering)… 所以要開源請大家一起幫忙土炮 3.除了github 上面提到的一狗票還沒成功之外,其實就算是UIKit 也有很多基本的class功能也都沒有土炮出來.. 更複雜的BLE 跟Map當然也都還沒有 (等你幫忙XD,有人說.. 路還很遠)
  3. License 採取MIT不過不少人看到裡面的程式碼都是copy & paste 很多其他的人的心血 BigZaphod/Chameleonmono/CocosSharp .. 應該有更多….
  4. 根據微軟說的.. 這部分的核心 clang compiler 不會 open source XDDDD

參考資料

[Golang]透過brew來做Golang的版本切換

前言:

本來想在Mac OSX上面使用gvm來管理Golang 的版本切換,主要是因為想切到 Go 1.5 beta來玩玩新東西.

不過昨天去GTG聚會之後,學到brew switch之後,覺得整個很威啊… 這裏把幾個筆記記錄一下:

###指令集:

使用brew安裝Golang

    //把brew的fomulae更新到最新版本
    sudo brew update

    //使用brew安裝Go
    brew install go

更新版本

    //拿目前最新版本 Go 1.5 beta3 舉例
    brew upgrade go -v=1.5beta3 --devel
    
    //注意.. 就的版本 Go 1.4.2  不會從你的brew位置移除
    //可以查詢
    brew info go:
    
    
    //目前系統有安裝兩個版本.... 使用的是1.4.2
    go: stable 1.4.2 (bottled), devel 1.5beta3, HEAD
    Go programming environment
    https://golang.org
    /usr/local/Cellar/go/1.4.2 (4584 files, 276M) *
        Poured from bottle
    /usr/local/Cellar/go/1.5beta3 (5357 files, 277M)
        Built from source
    From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/go.rb

切換版本

    //使用brew switch來切換        
    brew switch go 1.5beta3
    
    //螢幕顯示
    Cleaning /usr/local/Cellar/go/1.2.1
    Cleaning /usr/local/Cellar/go/1.4.2
    Cleaning /usr/local/Cellar/go/1.5beta3
    3 links created for /usr/local/Cellar/go/1.5beta3
    
    
    //如此就可以切換.... 不過檔案不會移除

反安裝版本

    //使用brew uninstall
    brew uninstall go
    
    //只會移除目前使用的版本... 不過由於原本目錄沒有指向新的,所以功能都無法使用
    //將目前使用的版本切換到 1.4.2
    brew switch go 1.4.2 

可能會發生的錯誤

切換Go版本,然後跑go build可能會發生以下的錯誤:

    package .
    	imports runtime: C source files not allowed when not using cgo or SWIG: atomic_amd64x.c defs.c float.c heapdump.c lfstack.c malloc.c mcache.c mcentral.c mem_darwin.c mfixalloc.c mgc0.c mheap.c msize.c os_darwin.c panic.c parfor.c proc.c runtime.c signal.c signal_amd64x.c signal_unix.c stack.c string.c sys_x86.c

解決方式(solution for “C source files not allowed when not using cgo or SWIG”):

這裏提供我的解決方式:

  1. 刪除 %GOPATH%下的pkg資料夾
  2. 重新開啟 console 或是確認 go env有讀到正確 go 1.5的設定.

##心得

gvm主要是給Ubuntu(linux-like)來管理Golang版本套件的.既然是Mac OSX就要用最好使用的homebrew

搞定 brew switch 切換Go 版本真的是很方便… 不過c-shared MAC也沒有 想玩還是有點麻煩… 還是在Win上面弄docker玩…

[研討會心得][GTG14][Golang]第十四次的Golang Taiwan聚會

前言

小孩出生後難得可以參加研討會GTG#14,主要也是想看看Go 1.5的一些新功能介紹.

第一階段: tka - 用 Golang 幫 Ruby 加速

筆記:

  • buildmode=c-shared:
    • 啟動版本: Golang 1.5 beta2
    • 環境: linux / android (win/mac 不支援)
  • 資料結構不同:
    • GoInt8 -> signed char
    • GoString -> char *p, int length
  • Ruby FFI:
    • ruby package to load dynamic libraries.

呼叫方式:

    require 'ffi'                                                                                                                           
    require 'benchmark'                                                                                                                     
                                                                                                                                            
    module LibGo                                                                                                                            
      extend FFI::Library                                                                                                                   
      ffi_lib './libgo.so'             
      //               (fn) (input) (output)                                                                                                     
      attach_function :fib, [:int], :int             
    end  

效能比較

  • 簡單功能 Ruby > golang 五倍
  • fibinacci Golang > Ruby 二十倍

參數挑選

  • 使用GoString 與 使用C.String
    • 結果:
      • C.String 會比較快
    • 原因:
      • Ruby 轉 Golang string 需要配置兩個參數 (char * 與 length)

Q&A

  • C-Shared GC
    • Not tested yet.
  • C++ binding with Go
    • 速度應該沒差

其他:

有介紹到的golang Language package看起來很好用

第二階段: 用 Go 寫前端, GopherJS 優劣分析

Slide:

Full-stack go with GopherJS from Poga Po

筆記

** Fullstack Go**

  • GopherJS
    • Goroutines works in JS
  • JS s signle-thread
    • GopherJS provide roroutine scheduler.

Examples:

  • DOM
  • Callback

效能:

測試五千個goroutine來選轉圖片是可以接受.

Gocha

  • No dead code elimation
    • Use js not fmt to reduce size.
  • Callback should not block
    • JS is single thread. (main thread)

會後心得:

  • 使用brew 來管理Go版本,好像很酷

參考資料:

[JENKINS]使用Jenkins部署Golang Server

##前言

想要把Server部署(deployment)自動化,於是又把Jenkins拿出來用.

Service Deployment

PHP Service

要部署PHP Service其實很簡單,主要就是把檔案*.php複製到apache目錄底下就好.

在Jenkins抓完Git之後,新增一個”執行Shell”

    echo "Deploy server1..."
    mv pserver1/*.php /var/www/html/server1/

Go Service

由於Server上的Golang Service使用screen在背景跑.要部署要分成幾個階段:

  • Build Go execution file
    • 這裏有兩個approach一個是使用Go Plugin for Jenkins,而我是直接使用command line跟系統參數.確認go env可以抓到正確的環境參數:

在Jenkins抓完Git之後,新增一個”執行Shell”

    echo "Building Go SERVER"
    export GOPATH=/YOUR/GOPATH
    cd YOUR_GO_PATH
    rm ORI_GO_EXECUTION_FILE
    go build -v
  • Kill current service and start new service

在Jenkins build好Go之後,新增一個”執行Shell”

    echo "Deploy Server"
    cd /YOUR/PATH
    sudo ./go_server_restart.sh

這裏有shell script 的內容:

    #!/bin/sh
    cd /YOUR/PATH
    COMMAND_GO_SERVER=/YOUR/PATH/go_server
    go_server_pid=`pidof ${COMMAND_GO_SERVER}`
    if [  $go_server_pid ]; then
            date +"%Y/%m/%d %H:%M:%S-Go Server Restart"
            kill -9 $go_server_pid
            sudo screen -d -m ./go_server
            date +"%Y/%m/%d %H:%M:%S-Restart completed"
    else
            sudo screen -d -m ./go_server
            date +"%Y/%m/%d %H:%M:%S-Start completed"
    fi    

關於Jenkins權限

這裏要注意,如果要跑mv 或是kill -9 需要有root的權限,這樣需要把jenkins的權限調高.細節可以參考How to run a script as root in Jenkins?

  • 修改Sudoers
    • sudo visudo
    • 增加jenkins ALL = NOPASSWD: ALL

如果要更改檔案後commit回去 [2015/10/21 update]

如果希望能更改檔案後,自動的push回去的話. 主要要參考這一個stackoverflow

主要的問題是jenkins的每一個action裡面的git 是沒有紀錄的(因為是工作區) 所以解決方式是跑git checkout master.不過這樣一來在那邊的git 的id 會亂掉. 比較建議的做法是另外開一個資料夾,然後把檔案複製過去再去commit

  • jenkins a repo build file
  • copy destination files to b folder (the same a repo)
  • git commit/push in b folder

請注意: 這個做法有相對的安全考量,請自行參照

TODO:

Post commit hook

需要Jenkins在commit submit之後,自動跑task. 可以參考Jenkins CI: How to trigger builds on SVN commit

##參考資料

[Golang]將開發環境從sublime text切換到vim

##前言

image

主要是vim-go版號進步到了1.1,在社群裡面大家一面倒都使用vim來作為Go的開發環境.所以還是來試試看.

##安裝

初始VIM環境

  • 清乾淨環境,避免之前有裝過太多plugin

      rm -Rf ~/.vim
      rm ~/.vimrc
    

安裝vim-pathogen

先要先裝vim-pathogen,這個可以幫助我們接下來要安裝的一些工具.

    mkdir -p ~/.vim/autoload ~/.vim/bundle && \
    curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim

接下來要編輯vim ~/.vimrc:

    execute pathogen#infect()

安裝Vim-Plug

  • 先裝vim-plug,來管理vim的plugin

      curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
          https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim 
    

透過Vim-Plug安裝 Vim-go

  • 記得還得編輯設定檔 vim ~/.vimrc 把以下加上去

      call plug#begin('~/.vim/plugged')
      Plug 'fatih/vim-go'
      call plug#end() 
    
  • 還沒完,還需要啟動pluginstall

      vim
        
      :PluginInstall
    

他會把vim-go裝起來,透過vim 去打開go檔案,就會有基本的syntax highlighter

一些vim-go進階設定

根據vim-go作者建議,你可以把以下部分加上去vim ~/.vimrc

  • 打開各種syntax highlighter

      let g:go_highlight_functions = 1
      let g:go_highlight_methods = 1
      let g:go_highlight_structs = 1
      let g:go_highlight_operators = 1
      let g:go_highlight_build_constraints = 1
    
  • 各種快速鍵,其中 代表的是 '\'

      au FileType go nmap <leader>r <Plug>(go-run)
      au FileType go nmap <leader>b <Plug>(go-build)
      au FileType go nmap <leader>t <Plug>(go-test)
      au FileType go nmap <leader>c <Plug>(go-coverage)
    
  • 把go-fmt 換成 go-import 強烈推薦 :p

      let g:go_fmt_command = "goimports"
    

初始安裝完成

到目前為止,你可能會需要使用的功能如下(都是在vim下面)

    #Save it and check goimport result
    :w

    #Build current project
    :GoBuild 
    
    #Run it
    :GoRun
    
    #Run Go Run directly 
    \r
    
    #Run Go Build directly
    \b
    
    #Go to definition
    g d

monokai 顏色配置

如果你跟我一樣喜歡sublime text的monokai配色,你一定要跟我這樣弄:

  • fatih/molokai下載molokai.vim~/.vim/colors
  • 修改設定,vim ~/.vimrc:

      set t_Co=256
      :colorscheme molokai
    

如果你跟我一樣是Mac OSX的環境,set t_Co=256這個設定是不能減少的.

所以目前畫面會是這樣.

image

資料夾開啟檔案 NERDTreeToggle

想要左半部跟Sublime Text一樣有資料結構可以選擇開啟檔案?就要裝NERDTreeToggle.一樣透過vim-pathogen來加入,透過vim ~/.vimrc

    map <C-n> :NERDTreeToggle<CR>

就可以透過ctrl + N來開啟如下:

image

tagbar: class outline viewer

tagbar是一個功能強大的需要先安裝好ctags,在Mac OSX底下相當的方便

透過brew就可以直接安裝:

    brew install ctags

記得還是得裝gotag

    go get -u github.com/jstemmer/gotags

修改vim ~/.vimrc增加以下設定:

    let g:tagbar_type_go = {  
        \ 'ctagstype' : 'go',
        \ 'kinds'     : [
            \ 'p:package',
            \ 'i:imports:1',
            \ 'c:constants',
            \ 'v:variables',
            \ 't:types',
            \ 'n:interfaces',
            \ 'w:fields',
            \ 'e:embedded',
            \ 'm:methods',
            \ 'r:constructor',
            \ 'f:functions'
        \ ],
        \ 'sro' : '.',
        \ 'kind2scope' : {
            \ 't' : 'ctype',
            \ 'n' : 'ntype'
        \ },
        \ 'scope2kind' : {
            \ 'ctype' : 't',
            \ 'ntype' : 'n'
        \ },
        \ 'ctagsbin'  : 'gotags',
        \ 'ctagsargs' : '-sort -silent'
    \ }        

neocomplete: 即時自動補字

vim需要lua支援,可以查看是否有:

    :echo has("lua")

如果沒有可以更新:

    brew update vim --with-lua

這樣應該都搞定了.

可能會遇到的問題

關於QuickFix

當跑:GoBuild 產生錯誤的時候,會跳出quickfix,這時候可以透過以下的快速鍵使用:

  • 跳到quickfix

      :.cc
    
  • 關閉quickfix

      :.ccl
    

關於autocomplete Preview畫面需要關閉

可以直接打

    :pclose

或是改在 vim ~/.vimrc

    # insert mode
    autocmd CursorMovedI * if pumvisible() == 0|pclose|endif
    autocmd InsertLeave * if pumvisible() == 0|pclose|endif

增加更多的順手設定(更新: 2015/08/20)

這裏記錄一些,我認為很順手的設定.此外,所有的設定檔可以參考我開源出來的設定:https://github.com/kkdai/vimfiles:

主要都是要修改vim ~/.vimrc:

    ""//主要是修改Mac上面Insert Mode: backspace 的行為.不需要再透過"x" 來刪除東西
    set backspace=indent,eol,start
    
    ""//啟動滑鼠功能,你可以用滑鼠做以下事情:
    ""//切換不同的分割畫面,透過滑鼠在NerdTree去展開與打開檔案,甚至是選取文字
    set mouse=a

    “”//啟動系統的剪貼簿,再作選取與複製的時候,不僅僅會複製到vim的記憶體中,更可以在系統剪貼簿使用.
    set clipboard=unnamed

##心得

不要找人家的 .vimrc,一定要親手一步一步地安裝
不要找人家的 .vimrc,一定要親手一步一步地安裝
不要找人家的 .vimrc,一定要親手一步一步地安裝

很重要,講三次的原因是…. 我一開始很興奮地裝了一堆plugin.其實都不會用 orz.最好的方式.. 還是自己一個個安裝.. 也一個個來瞭解怎麼用. 畢竟vim 本來就是學習曲線的進入很難,熟了以後就跟飛的一樣的一個工具.

接下來就要強迫自己儘量不用sublime text而使用vim …. orz

##相關資源:

[Golang]如何處理多國使用者的網頁輸出

image

前言:

這裏整理一下,如何透過Golang來處理多國使用者網頁顯示的問題.

所謂面對多國使用者的時候,主要有一些問題:

  • 如何根據不同國家顯示不同資料
  • 如何根據不同國家顯示正確的時間資料
  • 如何根據不同國家顯示以及儲存正確的字元集

我在這裡只把顯示的部分整理一下….

判斷使用者國家語系方法:

透過使用者設定

這個是最簡單的方式,也就是使用者自己先設定好你所偏好的語言.類似Google一樣,然後所有的語言顯示就會依據你的顯示方式.

但是這個方式可能有以下的問題,某些服務可能不只有在內部使用者使用.有可能會邀請不同的使用者. 這時候要如何顯示正確的語言呢?

接著來看第二個判斷方式…..

瀏覽器回傳數值

每個瀏覽器都會提供Accept-Language這個Header參數可以提供網站來參考.它的細節在此

以下列出我用Golang 抓出的三個我常用的瀏覽器結果,在繁體中文Mac OSX上面.

  1. Chrome: [zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4]
  2. Safari: [zh-tw]
  3. FireFox: [zh-TW,zh;q=0.8,en-US;q=0.5,en;q=0.3]

     // Parse accept-language in header to convert it as: tw, en, jp ...
     func ParseAcceptLang(acceptLang string) string {
     	// 1. Chrome: [zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4]
     	// 2. Safari: [zh-tw]
     	// 3. FF: [zh-TW,zh;q=0.8,en-US;q=0.5,en;q=0.3]
     	//
     	// Ret: zh or en ...
     	tarStrings := strings.Split(acceptLang, ";")
     	if len(strings.Split(tarStrings[0], ",")) > 1 {
     		return strings.Split(tarStrings[0], ",")[1]
     	}
     	return strings.Split(tarStrings[0], "-")[0]
     }
    

以上程式碼可以根據目前的Header的Accept-Language 內容轉換成 tw, en或是jp.

針對不同國家語系,顯示不同內容

使用javascript 顯示網頁部分

透過之前的ParseAcceptLang搭配著http.Request裡面的Header你就可以取出資料並且開始判斷與處理.這裏我使用的是martinimartini-render

    func ShowDifferentResultByLang(r render.Render, res *http.Request) {
    	var acceptLang string
    	for _, v := range res.Header["Accept-Language"] {
    		acceptLang = v
    		break
    	}
    
    	outPutData.Lang := OutPutStruct{}
        //取得瀏覽器Accept-Lang設定
        outPutData.Lang = ParseAcceptLang(acceptLang)
        r.HTML(200, "SOME_TMPL", outPutData)
    }
    
    ....
    
    //Web Template
    <script type="text/javascript">
        var Language = "\{\{ .Lang \}\}";
        DoSomethingWith(Language)
    </script>

這裡面的方法,就是要透過瀏覽器的回傳數值.透過JavaScript 來做相關的處理. 在JS裡面的細節我就不詳談了,這裡有一個詳細方法可以讓大家參考.

顯示不同的圖片

除了在網頁上面透過Java Script來顯示不同的內容之外,其實就算要顯示圖片也是可以透過不同的瀏覽器來給予不同的語言.

方法其實很簡單,就是必須要多開一個接口來幫忙處理圖形的處理部分. 這裏主要會用到的是 http.ResponseWriter的方式.

    func ShowLocaleImageByBrowser(params martini.Params, r render.Render, db *DB_Medium, res http.ResponseWriter, req *http.Request) {
        //取得瀏覽器Accept-Lang設定
    	var acceptLang string
    	for _, v := range res.Header["Accept-Language"] {
    		acceptLang = v
    		break
    	}

        //轉換成可了解文字 en. tw. jp ...
        Lang := ParseAcceptLang(acceptLang)
        
        //根據不同語言讀取不同圖形
        imageAddr := GetImageAddrByLang(Lang)
        
        //直接將圖片寫回http.responseWriter
    	res.Header().Set("Content-Type", "image/jpeg")
    	err := jpeg.Encode(res, GetImage(imageAddr), &jpeg.Options{100})
    	if err != nil {
    		res.WriteHeader(500)
    	} else {
    		res.WriteHeader(200)
    	}
    }

心得:

這一篇把相關的部分做一個簡單的整理,也希望能找到更有效的方式來顯示正確的資訊給使用者.

參考鏈結: