星期日, 11月 09, 2014

C pointer to function 函式指標 學習心得



這是函式指標學習心得的第一篇,在這一篇中你會學習到:

1. 函式在記憶體中的情況
2. 如何宣告一個函式指標
3. 函式的宣告
4. 使用 typedef 來定義一個函式指標的類型

本篇著重在介紹函式指標,實際應用方面會在下一篇介紹

------------------------ 1. 
函式在記憶體中的情況 ------------------------

在真正的開始學習函式指標 ( pointer to function ) 之前,我們要先弄懂到底什麼是函式以及函式在記憶體分布的情形。

當一個程式碼檔案 ( .c , .cpp ...) 被執行的時候,會產生出一個程序 ( process ),此時才會開始佔用記憶體及進行各種運算。先前我們定義的指標都是針對一個資料型態,如:int * 這是一個指向 int 資料類型的指標。然而,C為什麼沒有為 function 也定義出一個資料型別?因為不同的 function 依照建立的方式不同而有不同的 type ,所以沒辦法替每一種 function 都定義出一個通用的型別。

實際上,function 和一般的資料儲存的狀況不太一樣,他儲存的是一堆的指令。
我們可以參考下面的圖片: 
圖片來源:http://ccckmit.wikidot.com/cp%3Aenvironment


當一個 process 產生的時候,會有一塊自己可以使用的記憶體,並且這個記憶體分成許多不同的區塊,儲存不同的東西。一般來說,我們使用的區域變數是儲存在 stack 區段。程式碼則是儲存在 .text 區。因此,雖然和一般的資料型式不同,但是程式碼也是會佔用記憶體的!理所當然,他也會有自己的位址。

我們可以利用反組譯的方式來查看:

編譯方式:gcc -g -o test test.c

在這裡我使用 gdb 來輔助 
第 1 行 顯示 function name 的位址,接著我們到第15行可以發現,function 第 1 行指令的位址和function name的位址是一樣的,所以我們可以得知:其實function name的位址就是function第一行指令的位址。接著,在第 8 行中,我們可以看到main呼叫函式也是利用函式第 1 行指令的位址。

由此可知,其實在function在記憶體中也是有特定儲存的位址。
如果我們在linux的環境中使用 objdump 這個指令可以看得更清楚,他會指名在.text區
Disassembly of section .text:
        .....
        .....
000000000040052d <say_hello>:


------------------------ 2. 如何宣告一個函式指標 ------------------------

宣告方式: return_type (*func_pointer)( parameter list );
例如: 

第8行宣告一個指標名為 fptr ,指向 int (int, int)
換句話說,fptr的type : int (*)(int, int)

我們可以用以下兩種方式將已知的function, assign 給 function pointer:

1. fptr = &func_name;
2. fptr = func_name;

使用的時候也有兩種方法可以使用:

1. (*fptr)(num1, num2);
2. fptr(num1, num2);

每次讀到這一段的時候,總是有個疑惑:為什麼兩種方法都可以?
甚至,你編譯下面這一段 code 也可以執行:

Why? 

要確保初值化(initialization)或是assignment的正確性,取決於 1.數值 2.型別 
舉例來說:
int func(int, int);
int (*fptr)(int, int);

type of fptr is : int (*)(int, int);
type of func is : int (int, int);
type if &func is : int (*)(int , int);

所以 fptr = &func 很合理,型別正確並且數值也正確(&func數值和func一樣)
可是 fptr = func 型別不一樣。 所以在這裡其實做了implicit conversion 
將function name ( i.e. function designator )轉成函式指標使用

至於,使用的方式有兩種一種用deference(i.e use * operator),一種不用
我曾經在一本書上看到這樣的解釋:

在使用function的時候,fun(),其中()稱作 function-call operator
function-call operator 只允許 pointer to function使用。

所以一般我們在使用func_name(); 其實會做implicit conversion將func_name轉型
所以我們這樣寫其實也可以執行(&func_name)();

以上就是 function pointer 的基本操作。

------------------------ 3. 函式的宣告 ------------------------

不知道大家有沒有想過一個問題:

我們在宣告變數的時候,都是依循這樣的形式 : type var_name;
為什麼宣告function是 : return_type func_name( parameter list );

其實我們的看法應該是這樣 func_name( parameter list) 這一整個和var_name對照
所以,我們在gdb中檢查 func_name( parameter list) 這整個東西的type會和return type是一樣的。

在gdb中要查看變數的type可以使用:ptype var_name / whatis var_name 

利用先前的例子:         
(gdb) ptype say_hello  
type = void ()         
(gdb) ptype say_hello()
type = void            
(gdb) ptype &say_hello 
type = void (*)()      


------------------- 4. 使用 typedef 來定義一個函式指標的類型 ---------------

每次我們要宣告一個 function pointer 假如都要照之前那樣寫,對大多數人來說其實不太容易看。更甚者,牽扯到一堆轉型的時候更讓人頭暈目眩。

因此我們利用typedef來定義一個function pointer的type

int (*ptr)(int, int);  // declare a pointer to function : ptr
                       // and its type is : int (*)(int, int)

typedef int (*func_t)(int, int);
這個時候,func_t 就是一個 int(*)(int, int)的型別了

這個語法可能讓人感到confuse,因為以前我們定義的方式很單純:
typedef int bool;
在這裡我會這樣看 (*func_t)(int, int)是一個東西,然後藉由
typedef int (*func_t)(int, int);來間接定義func_t

所以,以後我們就可以這樣寫了:

謝謝觀看,如果有寫的不清楚或是有謬誤的地方還請各界先賢不吝賜教
感謝!


reference : 
1. http://www.newty.de/fpt/index.html
2. linux C 一站式編程
3. google 大神








星期六, 11月 01, 2014

C 語言 指標 學習心得



我個人用指標到現在,覺得指標的用處 :
1 . 修改外部變量
2 . 增加傳遞變數的效率實際上是copy位址值給 function

學習指標的時候要注意:
1.我們要更改的變數他的type是什麼? 
2.要更改的變數他的指標的type是什麼?
心中一定要一直反問這兩句話

初學者可以理解成這樣:
*****指標變數的內容是儲存位址******
*****一般變數的內容是儲存值value *****


以下我會使用 scope 的概念來幫助解說

簡單而言,以 C language 為例子,大括號之間就是一個 scope

在括號之內的東西,到最後一個括號,生命週期就結束了

像是你在  while loop 宣告int變數num 

這個 num 出了 } 之後就沒辦法再使用了

所以 function 才會有return value 去取得 function scope 裡面的值

為什麼要用指標才可以在function內改到 caller(call function的地方)變數的值?

我們可以這樣看 :


func 被 call 了時候 其實在 {} 內是這樣做

所以func結束之後n1就不見,無法在取得

所以假如我們不使用指標,而用下列的方法傳遞參數
其實是在func 內實際上先做了這樣的事情 :
可是假如我們改成

傳入變數的位置 (指標變數的內容是 指到的變數 的位址

fun內:

藉由這個方法

我們才可以真正存取到外面的變數 (因為知道複製外面變數的位址給 num )
ex : 0x12345678 之類

否則只是在自己scope ( 中文叫做作用域 ) 操作

所以才會有指標這種東西。由此可見,指標有一種功能:更改外部變數內容

指標另一個功能是方便傳遞變數

—————————-—————————-—————————- 小結 —————————-—————————-—————————- 


利用 func 更改 main 中 int type 的變數 


//這裡的int *整個是一個 type 代表int指標 指標內容是位址



實際上的動作:

—————————-—————————-指標的第二個用途:傳遞大量數據—————————-—————————-——

當我們定義一個 


我們要把這種struct student( 整個是一個type ) 的變數傳入給function

也是用 “複製“的概念傳入 ( pass by value )

那我們在開始執行function之前 就要整整複製100個元素 這是很沒有效率的行為

所以,我們假如不要這樣做就可以傳入指標

這樣就會傳入 struct student 的第一個位址

在32位元系統中,傳 address 只是複製 4bytes的資料 比之前 100 * 4 bytes 要小
在64位元系統,是複製64位元的資料(一串位址 ex: 0x12345678 87654321) 到function變數中,這個方法就是pass by address


不過其實你會發現到 我在說 pass by address 也用了 “ 複製 ” 這個名詞
所以他其實也是一種pass by value只不過這個value是變數的位置而非變數的數值

因此弄清楚這個觀念之後,其實pass by value , pass by address 其實都只是複製一個 data 到 function裡面只是複製的資訊不同,造成修改的權限不同而已

在電腦實際操作只是 copy value 到 function 裡面

pass by value , pass by address 是人為定義的名詞,但是定義得十分巧妙
文章一開頭曾說過,我們在學習指標的時候要一直反問兩個問題:
1.我們要更改的變數他的type是什麼? 
2.要更改的變數他的指標的type是什麼?

因為我們要用function更改不是在function scope的資料,必須用pass by address的方式傳入變數。也就是我們要將 資料的位址 傳給function,在function中藉由索引到那個位址中存放的內容來間接存取數值,使用的方式就是 *address (dereference)


—————————- 比較 string 傳入和 普通 array 傳入 —————————- 

我們在傳入 char * 的時候,都需要跟 function 說明 array 的大小,

所以實際上傳 array 我們在function的第二個參數要指名大小

但是在傳 C string 時不用,是因為他會去搜尋第一個碰到的 '\0' 做為結尾
因此你在使用 string.h header file 裡面的函數都不用特別指名size大小。

———————————————————————— 結論 —————-—————————-————————


funcition 要改到外部的變數的值則要傳入外部變數的位址
同時,function 接收到的變數,其type要和外部變數的位址相符

ex :

我們要利用function修改一個 type 為 int 的變數:int_num 
要傳入 int_num 的位址給 function :


function  接收變數的 type 要和 接收的資料 互相 match 
所以是這樣宣告的 :


———————————————————————— 問題 ————————————————————————

所以假設今天我們要用function修改一個外面的變數 他的 type  是FILE *

ex:


arg1, type1要怎麼填呢?

arg1 : &f , FILE *是 f 的 type 實際上變數名稱是 f,要讓 function 修改 f 要傳入 f 的位址也就是 &f 

type1 因為接收到 f 的位址 所以type是 FILE* *var_name 分開*是因為:
現在我們告一個指向 FILE * 的指標(*) 
如同指向int 的指標我們宣告為 int *int_pointer;
所以指向FILE *的指標 我們宣告為 FILE * *var_name 只是我們通常會把**寫在一起 : FILE **var_name


如果不幸的我們將function寫成下面的情況會發生什麼事情?

在function內只是先這樣做


———————————————————————— 常見範例 ————————————————————————

剛學指標的時候,老師一定會要我們想怎麼寫一個swap function去交換兩個變數的內容


星期六, 9月 20, 2014

Vim 自動 補完 插件 YouCompleteMe 教學 心得 新手入門 C++ C


在講正題之前,先奉上developer的github :

https://github.com/Valloric/YouCompleteMe

由於自己也是新手,如果內容有什麼不正確的地方請不吝指教 謝謝!



 [ 正題開始 ]

這個暑假嘗試了很多vim的plugin
其中一個覺得還不錯的plugin : YouCompleteMe 
他和以往的complete補完插件不太一樣的是 他不是去讀ctags裡面的資料
而是parse子串的內容 所以即使再打字串和comment也可以進行補完的功能
( 有些要利用 vim 的配置檔案 .vimrc 進一步配置 )

接下來就以ubuntu 14.04進行安裝,這裡介紹的是"簡易安裝模式"
再按裝這個plugin之前 我們需要利用的東西:vim 7.3.584 以上, git, Vundle, cmake, python, Vundle


linux - like 系統 安裝插件的方式是利用 : 
          sudo apt-get install [plugin_name]

[ 安裝 git ]
首先,在我們擁有一台 linux 作業系統的電腦時,一開始是沒有安裝 " git " 
並且在安裝 "Vundle" 之前 要先裝 git 
( 用git裝Vundle , Vundle 是 vim plugin 的託管插件 )



在$後面打上 sudo apt-get install git 就會開始安裝囉~
以$開頭代表終端機指令 ( command line )

[ 安裝 Vundle ]
接下來,我們安裝 Vundle : https://github.com/gmarik/Vundle.vim

$ git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim

然後我們輸入vim .vimrc 進行bundle的基本配置

在Vundle作者的github有.vimrc的基本配置,其中有一些Plugin可以不用使用
隨個人決定 

配置好 .vimrc 後 :wq 

[ 安裝 cmake ]
$ sudo apt-get install build-essential cmake

[ 安裝 python ]
$ sudo apt-get install python-dev

[ 安裝 YouCompleteMe ]
$ vim .vimrc 
在 Vundle 配置的欄位下面 加上:Plugin 'Valloric/YouCompleteMe'


















: wq 
$ vim 
然後在 vim 裡面 :PluginInstall 
裝完之後 訊息顯示之後要編譯 YouCompleteMe

[ 編譯 YouCompleteMe ]

假如需要C family的補全 :
cd ~/.vim/bundle/YouCompleteMe
./install.sh --clang-completer

不需要C family補全:
cd ~/.vim/bundle/YouCompleteMe
./install.sh


[ 配置 ]

$vim .ycm_extra_conf.py 

我個人是使用作者的配置模式 : 
https://github.com/Valloric/ycmd/blob/master/cpp/ycm/.ycm_extra_conf.py

接下來 配置 .vimrc 這樣才能將 .ycm_extra_conf.py 讀入
let g:ycm_global_ycm_extra_conf = '~/the path/to/your/.ycm_extra_conf.py'

例如:假如我在home裡面 $vim .ycm_extra_conf.py 
let g:ycm_global_ycm_extra_conf = '~/.ycm_extra_conf.py'


接著,let g:ycm_confirm_extra_conf = 0 
這樣就不用每一次開啓vim的時候都詢問是否要利用 .ycm_extra_conf.py 

其餘配置可以看作者的github !



[ 假如不想用插件了 ]
只要在 .vimrc 裡面刪除 Plugin 'Valloric/YouCompleteMe' 或是註解掉這一行就可以了,但是這是利用 Vundle 管理  Plugin 的方法,實際上要刪除的話則不是這樣。


--------------------------------------------------------------------

以上是我自己安裝這個 Plugin 的方法,或許不是最佳的方式 
如果有更好的配置 還請大大們分享!
謝謝收看

星期六, 5月 24, 2014

5/24 科技啓蒙


終於來到了這一天!
在小畢學長、float學長、貝斯學姊、震神等學長姐和同學們長久的規劃下
科技啓蒙——對初學者最友善的科技研討會 終於登場!!

我們的活動場地是在成大電機系館的樊城講堂
科技啓蒙因為沒有贊助商的緣故,所以場地設備等等都是由學長姐爭取而來的
因此經費相當有限,能夠借到這樣的場地已經很不容易了,謝謝。

由於我早上有一些事情要處理,所以只能參加下午的議程。
一進去電機系館就可以看到學長姐再幫忙接待,當然就是先進去報到囉!
 確認完名稱之後,我們就可以拿到名牌

 然後⋯⋯據說自己的名牌要自己寫是吧XDDD

接著,就可以走進場地找位子坐下來聆聽演講囉。
另我驚訝的是,這一次的講師年紀都很輕,大部分是大一、大二。
還有高二的學生報名擔任講師,並且講授的主題還是四軸飛行器!!
那位學弟的台風也十分穩健,感覺像是上台經驗豐富的樣子,面對台下朋友的問答也是不急不徐。

在這一次活動中,我聽到最有興趣的主題大概是KK(梁潁睿)講的SDL吧!
因為本身也有製作遊戲的經驗,也很喜歡製作遊戲。所以,對製作遊戲的一些繪圖工具
或是遊戲引擎十分感到興趣。

也因為這個演講,讓我感到很excited !
所以,我評估了一下,就趕緊報名了Lightening Talk
Java game engine libGDX 這是我這一次在Lightening Talk講的主題。
因為是在3點才決定要參加閃電秀的活動,所以在投影片方面製作的十分緊急
而且,本身是mac的初學者,剛開始接觸mac不久,所以在講解的過程中可能有些小插曲
在此,要大大的感謝 小畢學長 幫我解圍。

很高興在這一次的閃電秀可以獲得那麼多的笑聲以及掌聲,這讓我這個第一次在演討會中扮演
講師的新手感到很有成就感!真正的感覺到 
科技啓蒙真的是對初學者最友善的科技研討會

也讓我體會到將東西分享給大家的喜悅。下一次的科技啓蒙,我希望可以幫忙舉辦!!
希望明年這個時候,大家也可以來一起參與這個盛會

星期三, 5月 21, 2014

5/14上課心得


今天的講者是EJ,是成大資訊系畢業的學長。
在這場演講中EJ向我們介紹了Mozilla上面開發APP的新工具 APPmaker!

使用Firefox瀏覽器開啓網頁:https://apps.webmaker.org/
點選打造APP就可以開始設計自己的專屬APP了
接著我們會進入這個畫面,畫面右手邊是APP應用程式的功能,你可以為你的APP打造這些功能。右手邊的自定化是針對每一個功能加以設定。

我現在設定一個計時器利用按鈕去控制
依序拉出button counter metronome
        在這張圖可以看到藍色的線和綠色的線。在Appmaker中,從右手邊出去的線代表的是output的功能(data or 訊號),從左手邊進來的線代表的是input的功能可以接收資料。
        但是一開始的線通常不會幫你設定顏色,而是預設成藍色所以你必須做這樣的動作:


        將你的游標移動到app功能的左邊或是右邊會出現這樣的小圖示,再進一步進行設定才會該變”線“的顏色。










這個Appmaker還有許多功能可以使用像是照相機,圖片閱覽以及放煙火的小程式。
















另外,大家設了這麼多功能之後一定會疑惑,我該怎麼把功能移除??
該不會只能重新整理吧!?

答案當然是否!
移除小功能的方法是這樣的:

首先我們將滑鼠移動到功能方塊中,接著右上角就會有個”十字“的標記。

        接下來只要按著它,往右邊拖曳就會出現一個垃圾桶的符號。把它放到垃圾桶裡面就可以移除小功能了!















雖然,Mozilla的Appmaker 因為有這些小功能,製作APP起來十分方便快速,但是這個Appmaker也不是沒有缺點的!

像是在使用Camera的時候,你會發現:咦!!這個功能怎在右上角怎麼沒有十字的符號?那我們該怎麼移除啊?是的,目前小弟我的確不知道有什麼方法可以移除這個APP功能,只能夠重新整理QQ ,如果有大大知道的話也可以留言給我噢!感謝!

另外,當我想要照相並將照片顯示的時候,我使用image這個功能去接收資料的時候,好像無法將圖片顯示出來。

不知道是不是因為Image Source只能從一個網站接收圖片,而不能直接從相機中接收。假如有朋友可以解決這個問題,也請您分享給我,謝謝!

以上就是我在這一次課程中使用Appmaker的體驗。


        在體驗Appmaker之餘,學長也跟我們說了一些求學的經驗,還有在參加自由社群的時候,建立了一些人脈,讓他在職場上能夠走的比一般人順遂。謝謝學長的分享!所以大家把握機會,一起來參加自由社群吧!



星期日, 5月 18, 2014

5/17-18 Python Conference , PyCon 新手 心得


這是我第一次參加大型的研討會
PyCon舉辦的地點在中研院人文社會科學院
而且以往辦的是PyCon TW而今年和PyCon APAC一起合辦所以講者陣容應該比以往強大許多!!

以下是他們的官網
https://tw.pycon.org/2014apac/zh/

接下來就說說我這一次的經驗吧!

<廢言>

由於星期五晚上7點才下課,明天早上8:30就要報到了
所以匆匆忙忙的拿著行囊搭高鐵回到臺北

<搭乘方式>
在官網 https://tw.pycon.org/2014apac/zh/venue/  有許多搭車方式可以到中研院。
不過我建議大家搭乘捷運板南線到“南港展覽館站” 經由 5 號出口出來 然後走到對面的馬路上
攔一台小黃會比較快。

一開始由於官網上寫可以在捷運南港站直接下車轉搭小黃,於是我就先採取這樣的方式。
後來一出捷運在才發覺 南港站其實很偏僻冷清(比起南港展覽館站)要攔車也很難,在PyCon遇到的朋友也這麼說。

可是在南港展覽館站下車外面就車水馬龍,而且5號出口一上去就是研究路一段,距離中研院比較近。(中研院位於:台北市南港區研究院路 2 段 128 號)

搭乘計程車的費用和官網上,所寫的差不多(80元)並且假如你覺得時間緊急不想要步行
走到人文社科院的話,可以直接請計程車開進中研院裡面,這是可以的!

<check in>
進到人文社科院後就可以上二樓報到拉。不過有點奇怪的是報到分類的方式是以“手機後三碼”作為區分。而不是用序號的方式,所以也不太知道序號是做什麼用的XD

check in的時候,要出示行前信中的QRcode,假如是購買學生票的話記得要帶學生證。

之後,工作人會發了一個PyCon的手提袋給我們裡面有 gitHub貼紙、HDE貼紙、一件衣服(made in Taiwan)還有一些贊助商的廣告紙以及你的個人名牌,PyCon手冊


 




p.s第二天不用check in直接進R0國際會議廳等開場(第一場)就好了

對了!假如你當天沒有吃早餐的話他們是有準備餐盒的噢!


<聽演講>
接著就開始聽演講囉!
這個是會場的配置圖,同一個時段會有三個~四個場地(包含廠商show time等等)進行演講
。所以不需要擔心會有自己沒有興趣的主題。需要擔心得是......為什麼人沒辦法分身!!
不過假如,真的有那種情況發生,或是你聽累了的話也沒關係,你可以在外圍進行休息(可以看場地圖上面有FA,FB,FC,FD,FE等等的字樣表示有桌椅可以休息。當然你也可以進交誼廳!不過通常不會有人就是XD

然後,擔心爆棚的話也沒關係,即使沒有座位大家也是可以站在後面或是兩側來聆聽演講。
以R0為例好了,大卡司通常都是在這個會議廳進行演講,雖然可以容納426(這數字...)人,但時擋不住我們的熱情!所以沒有位子可以坐的朋友會在站在後面進行聆聽,也有人會坐在走道上。(畢竟一場演講30~50分鐘不等站久了腳真的會麻)

另外在第一天16:30進行的閃電秀也令我印象深刻,Lightening Talk限制演講者的時間只有5分鐘,要在這5分鐘內把你的演講內容都清楚表達。超過5分鐘怎麼辦??主持人會把你轟下去喔XDD 其實是因為怕壓縮到下一位的講者時間,所以才不能以勸離。

至於演講的詳細內容也許之後會有slide放上去,這方面我不清楚。
不過有些講者會放在他們的github上面,有興趣的可以去找找看,假如你真的有那股熱忱一定可以找到的。

附上一個Python神人的github : https://github.com/jesstess/

<點心>
其實參加PyCon真的很歡樂 
雖然門票要1290(學生早鳥),不過卻有滿滿收獲,包含點心拉XDDD
4F國際會議廳外面有常駐三種茶可以享用,而且在休息時間(Refreshment)會準備小點心讓我們補充體力。小點心的內容就不贅述了,包你會滿意就是(這樣我好像吃貨)

<BOF>
第一天晚上有BOF的活動。什麼是BOF?我借用一下PyCon官網上的意思:“BoF 為 Birds of a Feather 的縮寫,表面上的意思為「鳥類的羽毛」,後來被引伸為一群有相同興趣的人 ( 鳥兒們 ) 的非正式聚會。此次大會將協助已購票的會眾舉辦自己感興趣的 BoF,又因其帶有自助舉辦的特性,所以大會使用「自助小聚」作為 BoF 的中文翻譯名稱。”

就是可以辦小聚會認識朋友囉


以上就是這次的經驗,謝謝觀看

星期三, 5月 14, 2014

第一堂課心得


這是我第一次接觸自由社群

第一次聽到Gnome和openSUSE
聽MAX和我們分享自由社群的經驗,不像是一般的團體有許多限制
只要你有心想要參加 就可以加入他們,想要離開就離開。這是一種很Free的概念。

而且參加自由社群的好處是可以認識不同年齡層,不同產業界,不同國籍文化的人
可以拓展自己的人脈以及視野,以這一點來說,非常吸引我。而且有很多自由社群是“免費”的。我想這是最吸引人的地方!

在這堂課中MAX提及了一種參加自由社群的方式就是:OpenHatch
我們google一下 OpenHatch就可以看到他的網頁

看他的介紹說 這是一個參加社群的工具(Community tools),接下來我們點進右上角的log in/sign up 看看吧!

可以看到它整合了很多登入的方式 有google Yahoo 等等,非常方便!
在此我以Google的方式登入 接受權限後我們可以看到下面這個畫面
中間那一欄可以輸入使用者名稱
輸入進去後就可以登入拉!
點進去我們的名字 看看有什麼功能
我們可以看看大家放了哪些project在這裏
也可以貢獻自己的project以及將你project的bug放上去和大家分享 可以請大家幫忙

點選最上面的工具列people我們可以搜尋朋友的名字
透過這個功能我們就可以看看OpenHatch上的朋友貢獻了什麼東西

點選最上面的工具列project可以看到這個圖片
分類的方式是以程式語言來分類方便大家搜尋
大家之後可以在玩玩看

-----------------------------------------OpenHatch---------------------介紹至此--------------------------------

接下來是請到G0V社群的成員和我們介紹

我們常常在抱怨社會的制度或是政府令人不滿意,或是手邊用的App有夠難用
但是在抱怨後,沒有辦法能夠”動手“去執行、改善現況。於是,G0V出現了!

這是一個自由社群 主張自己提出project大家參與project來改善這個社會
我們先到g0v網站看看介紹吧

About 可以瀏覽關於g0v的事情
Project可以看看近期有哪些專案被提出或是執行中的專案
Talks 可以看看以前有哪些文章,投影片檔案還有錄影
Actions 是一些和黑客松有關的資訊

按下Join us並選擇成員入口來成為他們的一份子
畫面右手邊可以看到,這裡也有多種的登入方式提供給大家選擇
我以前就有github的帳號於是在此我使用github來登入

登入後填寫資料就好囉!

此外,g0v會特定舉辦活動——黑客松
黑客松不限定任何職業的朋友參加
程式設計師、文字工作者、美工設計師、鄉民等等都可以
只要是希望可以讓這個社會更好的朋友,都歡迎大家一起來參加

然後可以在這個活動上提出專案,接者大家就可以尋找自己有興趣的專案參加
組成一個Team來完成它

這個活動不僅是一個完成專案的好方法,更可以結交朋友,分享彼此的專業。


以上就是我這堂課的心得






[Paper note] Multiagent Bidirectionally-Coordinated Nets for Learning to Play StarCraft Combat Games

Paper:  https://arxiv.org/abs/1703.10069 這篇論文是由 Alibaba & UCL共同發表的,並投稿到 NIPS 2017。他們發表了一個 Multi-agent framework 讓 agents 利用共同的 framew...