2014年3月30日 星期日

[ MPI 常見問題 ] MPI multiple dynamic array passing in C

來源自 這裡 
Question: 
I'm trying to ISend() two arrays: arr1,arr2 and an integer n which is the size of arr1,arr2. I understood from this post that sending a struct that contains all three is not an option since n is only known at run time. Obviously, I need n to be received first since otherwise the receiving process wouldn't know how many elements to receive. What's the most efficient way to achieve this without using the blokcing Send() ? 

Answer: 
Sending the size of the array is redundant (and inefficientas MPI provides a way to probe for incoming messages without receiving them, which provides just enough information in order to properly allocate memory. Probing is performed with MPI_PROBE, which looks a lot like MPI_RECV, except that it takes no buffer related arguments. The probe operation returns a status (MPI_Status) object which can then be queried for the number of elements of a given MPI datatype that can be extracted from the content of the message with MPI_GET_COUNT, therefore explicitly sending the number of elements becomes redundant. 

Here is a simple example with two ranks: 
  1. if (rank == 0)  
  2. {  
  3.     MPI_Request req;  
  4.   
  5.     // Send a message to rank 1  
  6.     MPI_Isend(arr1, n, MPI_DOUBLE, 10, MPI_COMM_WORLD, &req);  
  7.     // Do not forget to complete the request!  
  8.     MPI_Wait(&req, MPI_STATUS_IGNORE);  
  9. }  
  10. else if (rank == 1)  
  11. {  
  12.     MPI_Status status;  
  13.   
  14.     // Wait for a message from rank 0 with tag 0  
  15.     MPI_Probe(00, MPI_COMM_WORLD, &status);  
  16.     // Find out the number of elements in the message -> size goes to "n"  
  17.     MPI_Get_count(&status, MPI_DOUBLE, &n);  
  18.     // Allocate memory  
  19.     arr1 = malloc(n*sizeof(double));  
  20.     // Receive the message. ignore the status  
  21.     MPI_Recv(arr1, n, MPI_DOUBLE, 00, MPI_COMM_WORLD, MPI_STATUS_IGNORE);  
  22. }  
MPI_PROBE also accepts the wildcard rank MPI_ANY_SOURCE and the wildcard tag MPI_ANY_TAG. One can then consult the corresponding entry in the status structure in order to find out the actual sender rank and the actual message tag. 

Probing for the message size works as every message carries a header, called envelope. The envelope consists of the sender's rank, the receiver's rank, the message tag and the communicator. It also carries information about the total message size. Envelopes are sent as part of the initial handshake between the two communicating processes.

2014年3月27日 星期四

[Google Map APIv3] 入門教學(二):在 Map 上加入標記

來源自 這裡 
Preface: 
要在 Google Map 上加入標記,需要利用的是 google.maps.Marker 這個物件. 延續 Google Map API 入門教學(一)的例子,可以將 JavaScript 加上以下的語法: 
  1. google.maps.event.addListener(currentMap, "click", function(event) {  
  2.   // Setting of marker  
  3.   var optionOfMarker = {  
  4.     position: event.latLng,  
  5.     map: currentMap,  
  6.     title: event.latLng.toString()  
  7.   };  
  8.   
  9.   // Show marker in the place of mouse clicks  
  10.   mapMarker = new google.maps.Marker(optionOfMarker);  
  11. });  
一開始先在 currentMap 這個 Map 物件上綁上 click 事件, 然後設定標記的相關屬性之後,產生該標記就可以讓標記在地圖上出現了. 屬性說明如下: 
* position:標記要放的位置,必須是一個 google.maps.LatLng 的物件。這裡因為要在使用者點擊的位置放標記,所以要讀取 click 事件傳進來的 event 物件中帶的 LatLng 位置。
* map:標記所屬的 Google Map 物件。
* title:滑鼠停留在標記上時要出現的泡泡內容。這裡是直接顯示使用者點擊的位置的座標

以上的程式碼加進去以後就可以讓使用者在地圖上一直點,標記就會一直出現。如果只讓標記出現一個的話,可以在 click 事件觸發時先檢查標記的變數是否存在,如果存在的話就把標記從地圖上移除: 
  1. // Clear marker if it already exists  
  2. if (mapMarker) mapMarker.setMap(null);  
至於為什麼移除標記要用 setMap(null) 呢?原因可以直接參照 Google Map API 文件 [1] 的說明: 
如要從地圖上移除疊加層,請呼叫疊加層的 setMap() 方法傳送 null。請注意,呼叫此方法不會刪除疊加層;只是從地圖上移除此疊加層。如果您希望刪除疊加層,應該從地圖上將其移除,然後將疊加層本身設定為 null。

如果您希望管理一組疊加層,應該建立陣列來存放疊加層。使用此陣列時,如果需要移除疊加層,您就可以在陣列的各個疊加層上呼叫 setMap()。(請注意,第 3 版與第 2 版不同,不提供 clearOverlays() 方法;您需自行負責追蹤疊加層並在不需要時從地圖上移除)。從地圖上移除疊加層並將陣列的 length 設為 0 即可刪除疊加層,這樣做會移除疊加層的所有參照...

如果需要刪除地圖註冊的事件時,可以使用 clearListeners 函式去移除事件: 
  1. google.maps.event.clearListeners(currentMap, "click");  
另外 Google Map API 原生支援了兩種標記的動畫: 
* BOUNCE:標記會在地圖的指定座標處不斷跳動。
* DROP:產生標記時,標記會從地圖上方掉下來。
使用方法如下: 
  1. mapMarker.setAnimation(google.maps.Animation.BOUNCE);  
Sample Code: 
把上面提到的全部加上去做成完整的 JavaScript 的話,可以寫成下面的範例: 
  1. var currentMap;  
  2. var mapMarker;  
  3.   
  4. $(function(){  
  5.   initialize();  
  6. });  
  7.   
  8. function initialize() {  
  9.   var latlng = new google.maps.LatLng(-34.397150.644);  
  10.   var myOptions = {  
  11.     zoom: 11,  
  12.     center: latlng,  
  13.     mapTypeId: google.maps.MapTypeId.HYBRID  
  14.   };  
  15.   currentMap = new google.maps.Map(document.getElementById("map_canvas"), myOptions);  
  16.   
  17.   // Clear all the click event of the map  
  18.   google.maps.event.clearListeners(currentMap, "click");  
  19.   // Register a click event to the map  
  20.   google.maps.event.addListener(currentMap, "click", function(event) {  
  21.     // Clear marker if it already exists  
  22.     if (mapMarker) mapMarker.setMap(null);  
  23.   
  24.     // Setting of marker  
  25.     var optionOfMarker = {  
  26.       position: event.latLng,  
  27.       map: currentMap,  
  28.       title: event.latLng.toString()  
  29.     };  
  30.   
  31.     // Show marker in the place of mouse clicks  
  32.     mapMarker = new google.maps.Marker(optionOfMarker);  
  33.     mapMarker.setAnimation(google.maps.Animation.DROP);  
  34.   });  
  35. }  
HTML 的部份則請直接參閱 Google Map API 入門教學(一)中的 index.html 的範例. 一個使用的範例可以參考 這裡 (選取學校, 並顯示 Google Map 上的位置). 

Supplement: 
Google Maps Javascript API V3 Reference 
Google Map API Tutorial - Simple markers 
Google Marker Icon List 
Google Map API Tutorial - Geocoding service 
Tool - 查詢地點的經緯度

2014年3月24日 星期一

[文章收集] 免洗信箱、一次性拋棄式email整理

來源自 這裡 
Preface: 
現今很多線上服務都需要使用 email 註冊,不管是論壇、抽獎、填問卷、軟體下載等,為了要認證你的身份,避免被用程式洗帳號灌水,最簡單的方法就是把認證信寄到你的 email 信箱,然後不管是透過註冊碼或註冊連結,總之就是需要信箱裡認證信件的某些資訊來通過註冊. 

這種方式其實對服務提供者是很正常的想法,然而有了使用者的 email ,很多服務接著會寄送很多使用者不想看到的訊息,比較不負責的還沒有取消這些訊息的方法。更慘的是有些業者藉著作問卷、抽獎等方式得到大家的 email 資料,接著就順手把這些 email 拿去賣錢了,於是使用者開始收到許多廣告信、色情垃圾信等

免洗email: 
因為這樣,漸漸地大家也越來越保護自己的 email 信箱,有的人可能會專門去申請一個免費帳號專門用在不重要的註冊、抽獎等,但現在有個更好的解決方法!那就是完全不用註冊,免洗且用過即丟的拋棄式email! 免洗email的服務眾多,這邊列出幾個比較常見且好用的: 
1. http://10minutemail.com/
2. http://mailnesia.com/
3. http://www.fakeinbox.com/
4. http://tempemail.gentleprojects.com/
5. https://www.guerrillamail.com/zh-hant/
6. http://www.jetable.org/zh/index

首先第一個 http://10minutemail.com/ 算是免洗信箱中名聲最大的,也因為他大家平常也會把免洗信箱稱作「10分鐘信箱」,一連到這個網頁他就會自動幫你產生一個免洗信箱,只要複製 email 位址就可以直接拿去註冊了,此時要記得 browser 不要關,因為收信也是在同一頁面。另外如果覺得10分鐘太短也可以一直按延長時間. 

相較於 10minutemail 這個網站,接下來兩個免洗信箱功能就更實用一點,因為 10minutemail 是每次進入網站就隨機產生一個新的信箱,無法指定信箱名稱,無法在過期前換一個,也無法在過期後重新回到先前的信箱。 

第二個 http://mailnesia.com/ 一樣在進入網站後就隨機產生一個信箱,期間可以不斷按隨機產生名字來切換到新的信箱,也可以在輸入欄位填入自己想要的開頭,並按下右方的綠色箭號建立新的信箱。如果要回到先前的信箱也只要記住開頭,輸入後按綠色箭號就可以看到信了。這個信箱的好處是可以用先前的帳號,但壞處是每個人都可以進到相同的帳號去看裡面有哪些信件
 


再來的 http://www.fakeinbox.com/ 、 http://tempemail.gentleprojects.com/ ,功能也都和 http://mailnesia.com/ 都差不多,大家可以再自行試用看看。guerrillamail 本身就有多個域名的信箱可選,也可以自訂帳號,還不錯用

前幾個都是簡單的拋棄式信箱,過了時效後信件和信箱都會自動刪除,但如果我們想要將信件留存下來呢?這時候 http://www.jetable.org/zh/index 就是最好的選擇了!http://www.jetable.org/zh/index 一樣會產生一個免洗信箱,特別之處是他在時效內是將免洗信箱的信件轉寄到我們的真正信箱,不過時效過後接下來進來的的信件就不會轉過來囉。 

除了上述的免洗信箱外,透過 Gmail 分身術加上過濾器也可以達到類似的效果,詳情請見:Gmail 無限分身術:產生無限 email 帳號

2014年3月21日 星期五

[ Java 文章收集 ] How to Match IPv4 Addresses with Regular Expressions

來源自 這裡 
Preface: 
If you want to check whether a certain string represents a valid IPv4 address, try one of these examples from Regular Expressions Cookbook
(底下範例代碼使用 Groovy 語言

Simple regex to check for an IP address: 
A version 4 IP address is usually written in the form 255.255.255.255, where each of the four numbers must be between 0 and 255. Matching such IP addresses with a regular expression is very straightforward. The simple regexes use [0-9]{1,3} to match each of the four blocks of digits in the IP address. These actually allow numbers from 0 to 999 rather than 0 to 255. The simple regexes are more efficient when you already know your input will contain only valid IP addresses, and you only need to separate the IP addresses from the other stuff
  1. def hosts = ["140.112.31.68""999.999.999.999""abc.com.tw"]  
  2.   
  3. hosts.each{ host->  
  4.     if (host =~ /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/)  
  5.     {  
  6.         printf "'%s' matches IPv4 format!\n", host  
  7.     }  
  8.     else  
  9.     {  
  10.         printf "'%s' does't match IPv4 format!\n", host  
  11.     }  
  12. }  
輸出結果: 
'140.112.31.68' matches IPv4 format!
'999.999.999.999' matches IPv4 format!
 // False Positive!
'abc.com.tw' does't match IPv4 format!

Accurate regex to check for an IP address: 
The accurate regexes use 25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]? to match each of the four numbers in the IP address. This regex accurately matches a number in the range 0 to 255, with one optional leading zero for numbers between 10 and 99, and two optional leading zeros for numbers between 0 and 9. 25[0-5] matches 250 through 255, 2[0-4][0-9] matches 200 to 249, and [01]?[0-9][0-9]? takes care of 0 to 199, including the optional leading zeros. 
  1. def hosts = ["140.112.31.68""999.999.999.999""abc.com.tw"]  
  2.   
  3. def IPv4Ptn = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/  
  4. hosts.each{ host->  
  5.     if (host =~ IPv4Ptn)  
  6.     {  
  7.         printf "'%s' matches IPv4 format!\n", host  
  8.     }  
  9.     else  
  10.     {  
  11.         printf "'%s' does't match IPv4 format!\n", host  
  12.     }  
  13. }  
執行結果: 
'140.112.31.68' matches IPv4 format!
'999.999.999.999' does't match IPv4 format!
 // 可以偵測出來
'abc.com.tw' does't match IPv4 format!

Regex to extract IP addresses from longer text: 
If you want to check whether a string is a valid IP address in its entirety, use one of the regexes that begin with a caret and end with a dollar. These are the start-of-string and end-of-string anchors. If you want to find IP addresses within longer text, use one of the regexes that begin and end with the word boundaries \b
  1. def IPv4Ptn = /\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/  
如果是 Accurate 版本: 
  1. def IPv4Ptn = /\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/  

Regex that captures the four parts of the IP address: 
In order to capture the four numbers separately, instead of using the trick of repeating a group three times, they have four capturing groups, one for each number. Spelling things out this way is the only way we can separately capture all four numbers in the IP address. 
  1. def hosts = ["140.112.31.68""999.999.999.999""abc.com.tw""IPv4 123.24.122.89"]  
  2.   
  3. def IPv4Ptn = /\b([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\b/  
  4. hosts.each{ host->  
  5.     match = host =~ IPv4Ptn  
  6.     if (match.find())  
  7.     {  
  8.         printf "'%s' matches IPv4 format!\n", match[0][0]  
  9.         printf "\tPart1=%s\n", match[0][1]  
  10.         printf "\tPart2=%s\n", match[0][2]  
  11.         printf "\tPart3=%s\n", match[0][3]  
  12.         printf "\tPart4=%s\n", match[0][4]  
  13.         println ""  
  14.     }  
  15.     else  
  16.     {  
  17.         printf "'%s' does't match IPv4 format!\n", host  
  18.     }  
  19. }  
如果是 Accurate 版本: 
  1. def IPv4Ptn = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/  
執行結果: 

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...