cat emailHours | \ perl -lane '@a=split "TIME";$h{$a[0]}+=$F[@F-1]; \ END{for(keys %h){print "$h{時間可用性地圖提供了在某個時間和某個地點中最有可能空閑的人員列表。通過本文可以了解如何使用 Google Earth 和通信日誌製圖從而標識符合可用性的時間和地點。 團隊可能包括國內和國外的、靈活的工作時間和每周四天工作制都會改變團隊協作的時間和地點。本文提供了工具和代碼來幫助您找到使用 Google Earth 聯繫跨地理區域的各個團隊成員的最佳時間。通過使用郵件時間跟蹤(電子郵件標題)和具有適當設置的生成 Keyhole 標記語言(Keyhole Markup Language,KML)的程序,本文將演示使用 Google Earth 的 TimeSpan 特性和 “時間滑塊” 實現的有用的可視化技術。 要求 硬體 能夠用 3-D 加速運行 Google Earth 的任何硬體都有足夠的能力處理本文中的代碼。這裡描述的 KML 僅為美國就使用了數以千計的多邊形頂點,因此如果要在全球呈現或超越國家級的精確度,則可能需要速度更快的處理器。 軟體 必須擁有 Google Earth V4 或更高版本才能支持對於實現可視化非常重要的 TimeSpan 功能。構建 KML 以及提取電子郵件標題信息需要使用 Perl。您需要來自 CPAN 的 Mail::IMAPClient 和 IO::Socket::SSL 模塊(請參閱 參考資料)。 注意:本文中提供的代碼是跨平台的,並且應當可以在運行 Google Earth 和 Perl 的任意平台中運行。 構建時間-可用性地圖所採取的一般方法 時間-可用性地圖提供了在特定時間特定地點最有可能取得聯繫的人員的清單。例如,圖 1 和 2 顯示了在特定時窗期間國內各地可能收到郵件的用戶。即時消息日誌、電話使用記錄、組日曆、標記閱讀器(badge-reader)訪問和任意數目的與時間相關的其他數據記錄都可用於創建這些時間-可用性地圖。 本文主要介紹如何提取最常見的可用性數據:電子郵件標題。人們在積極地發送郵件時最有可能聯繫到。系統給每個用戶都設定相應的地理區域,並且基於每個小時的郵件計數用指示器衰減深度創建 KML。使用 Google Earth 的時間滑塊功能(包括動畫和總時窗選擇)將幫助為整個地理區域的用戶可視化得到的可用性地圖。查看圖 1,該圖將演示一天中早些時候的可視化示例。 圖 1. 可視化示例 —— 開始時間
圖 2 顯示了一天中稍晚時候的更寬的時間窗,幫助標識整個美國的可用用戶區域。 圖 2. 可視化示例 —— 隨後的時間
|
提取州概要信息 Google 的許多優秀 KML 文檔頁面之一將使用 KML 列出美國各州的輪廓圖。這些粗略圖大約包含 13,000 個點,為高亮顯示各州提供了不錯的基礎。獲取 Google 美國各州示例文件 並閱讀 extractStates.pl 程序如何分離州信息的詳細信息。 清單 1. extractStates.pl 完整程序 #!/usr/bin/perl -w # extractStates.pl write each state coordinates into a separate file use strict; my $str = ""; # built output string my $fname = ""; # current filename my $cmd = `mkdir states/`; while( my $line = <STDIN> ) { if( $line =~ /<name>/ ) { # extract the state for file name $fname = substr( $line, index($line,"CDATA[")+6 ); $fname = substr( $fname, 0, index($fname," (") ); }elsif( $line =~ /<TimeSpan>/ ) { # change the TimeSpan designator for later processing $line = <STDIN>; # begin tags $line = <STDIN>; # close TimeSpan $line = qq{ <TimeSpan></TimeSpan>\n}; }elsif( $line =~ /<\/Placemark/ ) { # write out the file, reset variables after closing tag open( OUTFILE, "> states/$fname ") or die "Can't write state file"; print OUTFILE $str; print OUTFILE $line; close(OUTFILE); $str = ""; }#if closing tag # add a line if it's at the start or the built string is not blank if( $line =~ /<Placemark/ || $str ne "" ){ $str .= $line } }#line in | 在聲明變數並且創建 states 目錄后,extractStates.pl 程序將從 STDIN 中讀取每一行。us_states.kml 文件包含粗略的州輪廓圖,而 extractStates.pl 程序將把每個幾何圖形寫入各自的文件。特定於 us_states.kml 文件的 TimeSpan 條目將被替換為更容易修改的佔位符,並且每個州的全部信息被寫出到 states 目錄。 把上面的清單 1 中的代碼保存到名為 extractStates.pl 的文件中,並且用 cat us_states.kml | perl extractStates.pl 命令運行該程序。檢查 states 目錄查看文件列表,如下所示: 清單 2. states 目錄列表 ls -la states/* | head -rw-r--r-- 1 nathan nathan 6708 2008-07-08 17:11 states/Alabama -rw-r--r-- 1 nathan nathan 85426 2008-07-08 17:11 states/Alaska ... -rw-r--r-- 1 nathan nathan 15804 2008-07-08 17:11 states/West Virginia -rw-r--r-- 1 nathan nathan 11536 2008-07-08 17:11 states/Wisconsin -rw-r--r-- 1 nathan nathan 3298 2008-07-08 17:11 states/Wyoming |
提取電子郵件時間信息 用來自 CPAN 的 Mail::IMAPClient 和 IO::Socket:SSL 模塊提取電子郵件標題和處理髮送時間相對簡單一些。以下示例將使用 Google Internet Message Access Protocol(IMAP)界面,但是本文中提供的代碼應當可以在任意數目的郵件伺服器上運行。您可能必須消除 SSL 連接,這取決於伺服器設置。 清單 3. extractEmails.pl 模塊,連接設置 #!/usr/bin/perl -w # extractEmails.pl get all e-mails, print listing of from at what hour use strict; use Mail::IMAPClient; use IO::Socket::SSL; my %timeHash = (); # data structure for whom at what time # create a SSL socket to the imap server my $socket = IO::Socket::SSL->new( PeerAddr => 'imap.gmail.com', PeerPort => 993 ) or die "can't create socket"; # create an imap connection through the ssl socket my $imap = Mail::IMAPClient->new( Socket => $socket, User => 'yourEmailID@gmail.com', Password => 'yourPassword' ) or die "can't connect imap"; $imap->select("INBOX"); my @messages = $imap->search('ALL'); | 創建套接字和 IMAP 連接十分簡單。清單 4 將創建和輸出電子郵件和時間數據結構。 清單 4. 提取小時,輸出數據結構 my $msgCount = 0; for my $msg ( @messages ) { my $from = $imap->get_header($msg,"From"); my $date = $imap->get_header($msg,"Date"); # set date to main hour $date = substr($date, index($date,":")-2,2); # increment the hour's count for that id $timeHash{$from}{$date}++; $msgCount++; if( $msgCount % 10 == 0 ){ print STDERR "$msgCount\n" } }#for each message $imap->logout(); # print all of the hour/from combinations for later processing for my $from( keys %timeHash ) { for my $time( keys %{ $timeHash{$from} } ) { print "$from TIME $time $timeHash{$from}{$time}\n"; }#for time }#for id | 注意在本例中,所選時間是發送每封電子郵件的小時數。您會發現為特定的可用性場景選擇小時、分鐘、天數或星期十分有用。用 perl extractEmails.pl > emailHours 命令運行 extractEmails.pl 程序。在將進度指示器(以每 10 個標題為單位)輸出到 STDERR 中后,以上命令將生成 emailHours 文件,如下所示: 清單 5. emailHours 示例文件 Dave <dave@ibmdevworks.com> TIME 11 6 Dave <dave@ibmdevworks.com> TIME 21 8 ... Bob <bob@ibmdevworks.com> TIME 07 6 Bob <bob@ibmdevworks.com> TIME 11 36 | emailHours 文件的格式為名稱(如果可用)、電子郵件地址、TIME 分隔符、小時。
分配電子郵件可以尋找地理位置 emailHours 文件現在包含所有電子郵件地址的列表和在給定小時中發送郵件的次數。您可能需要處理一些特定的聯繫人,或者創建發送電子郵件最多的人的列表。考慮使用下面一行代碼在 emailHours 文件中創建前 50 個電子郵件發送者的列表。 清單 6. 生成前 50 個電子郵件發送者的命令 注意,清單 6 中的 \ 字元僅用於設定格式,而不應當在運行命令時包括。運行以上命令將生成如下所示的列表: 清單 7. top50emails 示例文件 44 Bob <bob@ibmdevworks.com> 38 Dave <dave@ibmdevworks.com> 34 Tom <tom@ibmdevworks.com> 30 Mike <mike@ibmdevworks.com> ... | 通過插入州名,然後在每個文件的開頭位置插入 STATE 分隔符,修改 top50emails 文件。您可以手動執行此操作,也可以將州指示器與 geo-ip 定位程序、員工地址資料庫或其他來源的地理位置數據鏈接起來。將已修改的文件另存為 stateMapping,如下所示: 清單 8. stateMapping 示例文件 New York STATE 44 Bob <bob@ibmdevworks.com> North Carolina STATE 38 Dave <dave@ibmdevworks.com> Virginia STATE 34 Tom <tom@ibmdevworks.com> Georgia STATE 30 Mike <mike@ibmdevworks.com> ... |
用 createKml.pl 生成 KML 標記 提取了州坐標、計算了完整電子郵件標題和時間並且將每個相關電子郵件 ID 與州名關聯在一起之後,可以生成 KML 文件來實現所需的可視化。清單 9 顯示了 createKml.pl 程序的開頭。 清單 9. createKml.pl 程序頭,主循環 #!/usr/bin/perl -w #createKml.pl build google earth kml, fade states based on entries per hour use strict; die "specify state mapping file, maximum, intervals " unless ( @ARGV == 3 ); my( $inFile, $max, $interval ) = @ARGV; my %state = (); loadStateMapping(); kmlHeader(); kmlStyles(); while( my $line = <STDIN> ) { # for bogus entry elimination next unless length( $line) > 20 ; chomp($line); #change person@ibm.com TIME 11 2 into components my( $mail, $time ) = split "TIME ", $line; my( $stHour, $countVal ) = split " ", $time; # continue if a state defined for that mail next unless exists($state{$mail}); open( INFILE,"states/$state{$mail}") or die "no state input file"; while( my $line = <INFILE> ) { if ( $line =~ /<name>/ ){ print "<name><![CDATA[$mail]]></name>\n" } elsif( $line =~ /<TimeSpan>/ ){ getTimes( $stHour ) } elsif( $line =~ /Style_/ ) { getStyle( $countVal ) } else { print $line } }#while line in close(INFILE); }#line in print qq{</Document>\n</kml>\n}; | 在確保正確使用並聲明變數之後,將調用 loadStateMapping 子常式。將讀取為每個電子郵件地址設定的州,並且調用 kmlHeader 和 kmlStyles 子常式來輸出指定閾值與間隔的相應 KML 標記。 進入主循環以讀取 STDIN 中的每一行並提取相關信息。系統將把電子郵件地址指定為位置標記名稱,計算 TimeSpan 開始點和結束點,並且相應的樣式都是基於指定的閾值和間隔編寫的。 清單 10 將顯示這些子常式中的第一個子常式 loadStateMapping 的詳細信息。 清單 10. loadStateMapping kmlHeader 子常式 sub loadStateMapping { # create a hash storing which mail corresponds to which state open( INFILE,"$inFile" ) or die "no in state file"; while( my $line = <INFILE> ) { chomp($line); my( $sname, $mail ) = split "STATE ", $line; # skip the total count $mail = substr($mail, index($mail," ")+1); $state{$mail} = $sname; }#stateMapping lines close(INFILE); }#loadStateMapping sub kmlHeader { print qq{<?xml version="1.0" encoding="UTF-8"?>\n}; print qq{<kml xmlns="http://earth.google.com/kml/2.2">\n}; print qq{<Document>\n}; print qq{ <name><![CDATA[Time Availability]]></name>\n}; print qq{ <open>1</open>\n}; }#kmlHeader | 為了更加快速地處理,loadStateMapping 文件只讀取州分配文件。創建與每個州名的電子郵件地址綁定的散列,將在主程序循環中檢查該散列。如果尚未分配州,這將允許跳過某些條目。kmlHeader 子常式將輸出 KML 文檔的主要頭標記。清單 11 顯示了 getTimes 子常式。 清單 11. getTimes 子常式 sub getTimes { my $endHour = $inHour + 1; if( length($endHour) == 1 ){ $endHour = "0$endHour" } print qq{ <TimeSpan>\n}; print qq{ <begin>2008-07-01T$inHour:00Z</begin>\n}; print qq{ <end>2008-07-01T$endHour:00Z</end>\n}; print qq{ </TimeSpan>\n}; }#getTimes | 上面列出的 getTimes 子常式中的代碼將指定正確的 TimeSpan 標記。下面的清單 12 顯示了更加複雜的 getStyle 子常式。 清單 12. getStyle 子常式 sub getStyle { # find the appropriate style based on the input value my $inputVal = 時間可用性地圖提供了在某個時間和某個地點中最有可能空閑的人員列表。通過本文可以了解如何使用 Google Earth 和通信日誌製圖從而標識符合可用性的時間和地點。 團隊可能包括國內和國外的、靈活的工作時間和每周四天工作制都會改變團隊協作的時間和地點。本文提供了工具和代碼來幫助您找到使用 Google Earth 聯繫跨地理區域的各個團隊成員的最佳時間。通過使用郵件時間跟蹤(電子郵件標題)和具有適當設置的生成 Keyhole 標記語言(Keyhole Markup Language,KML)的程序,本文將演示使用 Google Earth 的 TimeSpan 特性和 “時間滑塊” 實現的有用的可視化技術。 要求 硬體 能夠用 3-D 加速運行 Google Earth 的任何硬體都有足夠的能力處理本文中的代碼。這裡描述的 KML 僅為美國就使用了數以千計的多邊形頂點,因此如果要在全球呈現或超越國家級的精確度,則可能需要速度更快的處理器。 軟體 必須擁有 Google Earth V4 或更高版本才能支持對於實現可視化非常重要的 TimeSpan 功能。構建 KML 以及提取電子郵件標題信息需要使用 Perl。您需要來自 CPAN 的 Mail::IMAPClient 和 IO::Socket::SSL 模塊(請參閱 參考資料)。 注意:本文中提供的代碼是跨平台的,並且應當可以在運行 Google Earth 和 Perl 的任意平台中運行。 構建時間-可用性地圖所採取的一般方法 時間-可用性地圖提供了在特定時間特定地點最有可能取得聯繫的人員的清單。例如,圖 1 和 2 顯示了在特定時窗期間國內各地可能收到郵件的用戶。即時消息日誌、電話使用記錄、組日曆、標記閱讀器(badge-reader)訪問和任意數目的與時間相關的其他數據記錄都可用於創建這些時間-可用性地圖。 本文主要介紹如何提取最常見的可用性數據:電子郵件標題。人們在積極地發送郵件時最有可能聯繫到。系統給每個用戶都設定相應的地理區域,並且基於每個小時的郵件計數用指示器衰減深度創建 KML。使用 Google Earth 的時間滑塊功能(包括動畫和總時窗選擇)將幫助為整個地理區域的用戶可視化得到的可用性地圖。查看圖 1,該圖將演示一天中早些時候的可視化示例。 圖 1. 可視化示例 —— 開始時間
圖 2 顯示了一天中稍晚時候的更寬的時間窗,幫助標識整個美國的可用用戶區域。 圖 2. 可視化示例 —— 隨後的時間
|
提取州概要信息 Google 的許多優秀 KML 文檔頁面之一將使用 KML 列出美國各州的輪廓圖。這些粗略圖大約包含 13,000 個點,為高亮顯示各州提供了不錯的基礎。獲取 Google 美國各州示例文件 並閱讀 extractStates.pl 程序如何分離州信息的詳細信息。 清單 1. extractStates.pl 完整程序 #!/usr/bin/perl -w # extractStates.pl write each state coordinates into a separate file use strict; my $str = ""; # built output string my $fname = ""; # current filename my $cmd = `mkdir states/`; while( my $line = <STDIN> ) { if( $line =~ /<name>/ ) { # extract the state for file name $fname = substr( $line, index($line,"CDATA[")+6 ); $fname = substr( $fname, 0, index($fname," (") ); }elsif( $line =~ /<TimeSpan>/ ) { # change the TimeSpan designator for later processing $line = <STDIN>; # begin tags $line = <STDIN>; # close TimeSpan $line = qq{ <TimeSpan></TimeSpan>\n}; }elsif( $line =~ /<\/Placemark/ ) { # write out the file, reset variables after closing tag open( OUTFILE, "> states/$fname ") or die "Can't write state file"; print OUTFILE $str; print OUTFILE $line; close(OUTFILE); $str = ""; }#if closing tag # add a line if it's at the start or the built string is not blank if( $line =~ /<Placemark/ || $str ne "" ){ $str .= $line } }#line in | 在聲明變數並且創建 states 目錄后,extractStates.pl 程序將從 STDIN 中讀取每一行。us_states.kml 文件包含粗略的州輪廓圖,而 extractStates.pl 程序將把每個幾何圖形寫入各自的文件。特定於 us_states.kml 文件的 TimeSpan 條目將被替換為更容易修改的佔位符,並且每個州的全部信息被寫出到 states 目錄。 把上面的清單 1 中的代碼保存到名為 extractStates.pl 的文件中,並且用 cat us_states.kml | perl extractStates.pl 命令運行該程序。檢查 states 目錄查看文件列表,如下所示: 清單 2. states 目錄列表 ls -la states/* | head -rw-r--r-- 1 nathan nathan 6708 2008-07-08 17:11 states/Alabama -rw-r--r-- 1 nathan nathan 85426 2008-07-08 17:11 states/Alaska ... -rw-r--r-- 1 nathan nathan 15804 2008-07-08 17:11 states/West Virginia -rw-r--r-- 1 nathan nathan 11536 2008-07-08 17:11 states/Wisconsin -rw-r--r-- 1 nathan nathan 3298 2008-07-08 17:11 states/Wyoming |
提取電子郵件時間信息 用來自 CPAN 的 Mail::IMAPClient 和 IO::Socket:SSL 模塊提取電子郵件標題和處理髮送時間相對簡單一些。以下示例將使用 Google Internet Message Access Protocol(IMAP)界面,但是本文中提供的代碼應當可以在任意數目的郵件伺服器上運行。您可能必須消除 SSL 連接,這取決於伺服器設置。 清單 3. extractEmails.pl 模塊,連接設置 #!/usr/bin/perl -w # extractEmails.pl get all e-mails, print listing of from at what hour use strict; use Mail::IMAPClient; use IO::Socket::SSL; my %timeHash = (); # data structure for whom at what time # create a SSL socket to the imap server my $socket = IO::Socket::SSL->new( PeerAddr => 'imap.gmail.com', PeerPort => 993 ) or die "can't create socket"; # create an imap connection through the ssl socket my $imap = Mail::IMAPClient->new( Socket => $socket, User => 'yourEmailID@gmail.com', Password => 'yourPassword' ) or die "can't connect imap"; $imap->select("INBOX"); my @messages = $imap->search('ALL'); | 創建套接字和 IMAP 連接十分簡單。清單 4 將創建和輸出電子郵件和時間數據結構。 清單 4. 提取小時,輸出數據結構 my $msgCount = 0; for my $msg ( @messages ) { my $from = $imap->get_header($msg,"From"); my $date = $imap->get_header($msg,"Date"); # set date to main hour $date = substr($date, index($date,":")-2,2); # increment the hour's count for that id $timeHash{$from}{$date}++; $msgCount++; if( $msgCount % 10 == 0 ){ print STDERR "$msgCount\n" } }#for each message $imap->logout(); # print all of the hour/from combinations for later processing for my $from( keys %timeHash ) { for my $time( keys %{ $timeHash{$from} } ) { print "$from TIME $time $timeHash{$from}{$time}\n"; }#for time }#for id | 注意在本例中,所選時間是發送每封電子郵件的小時數。您會發現為特定的可用性場景選擇小時、分鐘、天數或星期十分有用。用 perl extractEmails.pl > emailHours 命令運行 extractEmails.pl 程序。在將進度指示器(以每 10 個標題為單位)輸出到 STDERR 中后,以上命令將生成 emailHours 文件,如下所示: 清單 5. emailHours 示例文件 Dave <dave@ibmdevworks.com> TIME 11 6 Dave <dave@ibmdevworks.com> TIME 21 8 ... Bob <bob@ibmdevworks.com> TIME 07 6 Bob <bob@ibmdevworks.com> TIME 11 36 | emailHours 文件的格式為名稱(如果可用)、電子郵件地址、TIME 分隔符、小時。
分配電子郵件可以尋找地理位置 emailHours 文件現在包含所有電子郵件地址的列表和在給定小時中發送郵件的次數。您可能需要處理一些特定的聯繫人,或者創建發送電子郵件最多的人的列表。考慮使用下面一行代碼在 emailHours 文件中創建前 50 個電子郵件發送者的列表。 清單 6. 生成前 50 個電子郵件發送者的命令 cat emailHours | \ perl -lane '@a=split "TIME";$h{$a[0]}+=$F[@F-1]; \ END{for(keys %h){print "$h{時間可用性地圖提供了在某個時間和某個地點中最有可能空閑的人員列表。通過本文可以了解如何使用 Google Earth 和通信日誌製圖從而標識符合可用性的時間和地點。 團隊可能包括國內和國外的、靈活的工作時間和每周四天工作制都會改變團隊協作的時間和地點。本文提供了工具和代碼來幫助您找到使用 Google Earth 聯繫跨地理區域的各個團隊成員的最佳時間。通過使用郵件時間跟蹤(電子郵件標題)和具有適當設置的生成 Keyhole 標記語言(Keyhole Markup Language,KML)的程序,本文將演示使用 Google Earth 的 TimeSpan 特性和 “時間滑塊” 實現的有用的可視化技術。 要求 硬體 能夠用 3-D 加速運行 Google Earth 的任何硬體都有足夠的能力處理本文中的代碼。這裡描述的 KML 僅為美國就使用了數以千計的多邊形頂點,因此如果要在全球呈現或超越國家級的精確度,則可能需要速度更快的處理器。 軟體 必須擁有 Google Earth V4 或更高版本才能支持對於實現可視化非常重要的 TimeSpan 功能。構建 KML 以及提取電子郵件標題信息需要使用 Perl。您需要來自 CPAN 的 Mail::IMAPClient 和 IO::Socket::SSL 模塊(請參閱 參考資料)。 注意:本文中提供的代碼是跨平台的,並且應當可以在運行 Google Earth 和 Perl 的任意平台中運行。 構建時間-可用性地圖所採取的一般方法 時間-可用性地圖提供了在特定時間特定地點最有可能取得聯繫的人員的清單。例如,圖 1 和 2 顯示了在特定時窗期間國內各地可能收到郵件的用戶。即時消息日誌、電話使用記錄、組日曆、標記閱讀器(badge-reader)訪問和任意數目的與時間相關的其他數據記錄都可用於創建這些時間-可用性地圖。 本文主要介紹如何提取最常見的可用性數據:電子郵件標題。人們在積極地發送郵件時最有可能聯繫到。系統給每個用戶都設定相應的地理區域,並且基於每個小時的郵件計數用指示器衰減深度創建 KML。使用 Google Earth 的時間滑塊功能(包括動畫和總時窗選擇)將幫助為整個地理區域的用戶可視化得到的可用性地圖。查看圖 1,該圖將演示一天中早些時候的可視化示例。 圖 1. 可視化示例 —— 開始時間
圖 2 顯示了一天中稍晚時候的更寬的時間窗,幫助標識整個美國的可用用戶區域。 圖 2. 可視化示例 —— 隨後的時間
|
提取州概要信息 Google 的許多優秀 KML 文檔頁面之一將使用 KML 列出美國各州的輪廓圖。這些粗略圖大約包含 13,000 個點,為高亮顯示各州提供了不錯的基礎。獲取 Google 美國各州示例文件 並閱讀 extractStates.pl 程序如何分離州信息的詳細信息。 清單 1. extractStates.pl 完整程序 #!/usr/bin/perl -w # extractStates.pl write each state coordinates into a separate file use strict; my $str = ""; # built output string my $fname = ""; # current filename my $cmd = `mkdir states/`; while( my $line = <STDIN> ) { if( $line =~ /<name>/ ) { # extract the state for file name $fname = substr( $line, index($line,"CDATA[")+6 ); $fname = substr( $fname, 0, index($fname," (") ); }elsif( $line =~ /<TimeSpan>/ ) { # change the TimeSpan designator for later processing $line = <STDIN>; # begin tags $line = <STDIN>; # close TimeSpan $line = qq{ <TimeSpan></TimeSpan>\n}; }elsif( $line =~ /<\/Placemark/ ) { # write out the file, reset variables after closing tag open( OUTFILE, "> states/$fname ") or die "Can't write state file"; print OUTFILE $str; print OUTFILE $line; close(OUTFILE); $str = ""; }#if closing tag # add a line if it's at the start or the built string is not blank if( $line =~ /<Placemark/ || $str ne "" ){ $str .= $line } }#line in | 在聲明變數並且創建 states 目錄后,extractStates.pl 程序將從 STDIN 中讀取每一行。us_states.kml 文件包含粗略的州輪廓圖,而 extractStates.pl 程序將把每個幾何圖形寫入各自的文件。特定於 us_states.kml 文件的 TimeSpan 條目將被替換為更容易修改的佔位符,並且每個州的全部信息被寫出到 states 目錄。 把上面的清單 1 中的代碼保存到名為 extractStates.pl 的文件中,並且用 cat us_states.kml | perl extractStates.pl 命令運行該程序。檢查 states 目錄查看文件列表,如下所示: 清單 2. states 目錄列表 ls -la states/* | head -rw-r--r-- 1 nathan nathan 6708 2008-07-08 17:11 states/Alabama -rw-r--r-- 1 nathan nathan 85426 2008-07-08 17:11 states/Alaska ... -rw-r--r-- 1 nathan nathan 15804 2008-07-08 17:11 states/West Virginia -rw-r--r-- 1 nathan nathan 11536 2008-07-08 17:11 states/Wisconsin -rw-r--r-- 1 nathan nathan 3298 2008-07-08 17:11 states/Wyoming |
提取電子郵件時間信息 用來自 CPAN 的 Mail::IMAPClient 和 IO::Socket:SSL 模塊提取電子郵件標題和處理髮送時間相對簡單一些。以下示例將使用 Google Internet Message Access Protocol(IMAP)界面,但是本文中提供的代碼應當可以在任意數目的郵件伺服器上運行。您可能必須消除 SSL 連接,這取決於伺服器設置。 清單 3. extractEmails.pl 模塊,連接設置 #!/usr/bin/perl -w # extractEmails.pl get all e-mails, print listing of from at what hour use strict; use Mail::IMAPClient; use IO::Socket::SSL; my %timeHash = (); # data structure for whom at what time # create a SSL socket to the imap server my $socket = IO::Socket::SSL->new( PeerAddr => 'imap.gmail.com', PeerPort => 993 ) or die "can't create socket"; # create an imap connection through the ssl socket my $imap = Mail::IMAPClient->new( Socket => $socket, User => 'yourEmailID@gmail.com', Password => 'yourPassword' ) or die "can't connect imap"; $imap->select("INBOX"); my @messages = $imap->search('ALL'); | 創建套接字和 IMAP 連接十分簡單。清單 4 將創建和輸出電子郵件和時間數據結構。 清單 4. 提取小時,輸出數據結構 my $msgCount = 0; for my $msg ( @messages ) { my $from = $imap->get_header($msg,"From"); my $date = $imap->get_header($msg,"Date"); # set date to main hour $date = substr($date, index($date,":")-2,2); # increment the hour's count for that id $timeHash{$from}{$date}++; $msgCount++; if( $msgCount % 10 == 0 ){ print STDERR "$msgCount\n" } }#for each message $imap->logout(); # print all of the hour/from combinations for later processing for my $from( keys %timeHash ) { for my $time( keys %{ $timeHash{$from} } ) { print "$from TIME $time $timeHash{$from}{$time}\n"; }#for time }#for id | 注意在本例中,所選時間是發送每封電子郵件的小時數。您會發現為特定的可用性場景選擇小時、分鐘、天數或星期十分有用。用 perl extractEmails.pl > emailHours 命令運行 extractEmails.pl 程序。在將進度指示器(以每 10 個標題為單位)輸出到 STDERR 中后,以上命令將生成 emailHours 文件,如下所示: 清單 5. emailHours 示例文件 Dave <dave@ibmdevworks.com> TIME 11 6 Dave <dave@ibmdevworks.com> TIME 21 8 ... Bob <bob@ibmdevworks.com> TIME 07 6 Bob <bob@ibmdevworks.com> TIME 11 36 | emailHours 文件的格式為名稱(如果可用)、電子郵件地址、TIME 分隔符、小時。
分配電子郵件可以尋找地理位置 emailHours 文件現在包含所有電子郵件地址的列表和在給定小時中發送郵件的次數。您可能需要處理一些特定的聯繫人,或者創建發送電子郵件最多的人的列表。考慮使用下面一行代碼在 emailHours 文件中創建前 50 個電子郵件發送者的列表。 清單 6. 生成前 50 個電子郵件發送者的命令 注意,清單 6 中的 \ 字元僅用於設定格式,而不應當在運行命令時包括。運行以上命令將生成如下所示的列表: 清單 7. top50emails 示例文件 44 Bob <bob@ibmdevworks.com> 38 Dave <dave@ibmdevworks.com> 34 Tom <tom@ibmdevworks.com> 30 Mike <mike@ibmdevworks.com> ... | 通過插入州名,然後在每個文件的開頭位置插入 STATE 分隔符,修改 top50emails 文件。您可以手動執行此操作,也可以將州指示器與 geo-ip 定位程序、員工地址資料庫或其他來源的地理位置數據鏈接起來。將已修改的文件另存為 stateMapping,如下所示: 清單 8. stateMapping 示例文件 New York STATE 44 Bob <bob@ibmdevworks.com> North Carolina STATE 38 Dave <dave@ibmdevworks.com> Virginia STATE 34 Tom <tom@ibmdevworks.com> Georgia STATE 30 Mike <mike@ibmdevworks.com> ... |
用 createKml.pl 生成 KML 標記 提取了州坐標、計算了完整電子郵件標題和時間並且將每個相關電子郵件 ID 與州名關聯在一起之後,可以生成 KML 文件來實現所需的可視化。清單 9 顯示了 createKml.pl 程序的開頭。 清單 9. createKml.pl 程序頭,主循環 #!/usr/bin/perl -w #createKml.pl build google earth kml, fade states based on entries per hour use strict; die "specify state mapping file, maximum, intervals " unless ( @ARGV == 3 ); my( $inFile, $max, $interval ) = @ARGV; my %state = (); loadStateMapping(); kmlHeader(); kmlStyles(); while( my $line = <STDIN> ) { # for bogus entry elimination next unless length( $line) > 20 ; chomp($line); #change person@ibm.com TIME 11 2 into components my( $mail, $time ) = split "TIME ", $line; my( $stHour, $countVal ) = split " ", $time; # continue if a state defined for that mail next unless exists($state{$mail}); open( INFILE,"states/$state{$mail}") or die "no state input file"; while( my $line = <INFILE> ) { if ( $line =~ /<name>/ ){ print "<name><![CDATA[$mail]]></name>\n" } elsif( $line =~ /<TimeSpan>/ ){ getTimes( $stHour ) } elsif( $line =~ /Style_/ ) { getStyle( $countVal ) } else { print $line } }#while line in close(INFILE); }#line in print qq{</Document>\n</kml>\n}; | 在確保正確使用並聲明變數之後,將調用 loadStateMapping 子常式。將讀取為每個電子郵件地址設定的州,並且調用 kmlHeader 和 kmlStyles 子常式來輸出指定閾值與間隔的相應 KML 標記。 進入主循環以讀取 STDIN 中的每一行並提取相關信息。系統將把電子郵件地址指定為位置標記名稱,計算 TimeSpan 開始點和結束點,並且相應的樣式都是基於指定的閾值和間隔編寫的。 清單 10 將顯示這些子常式中的第一個子常式 loadStateMapping 的詳細信息。 清單 10. loadStateMapping kmlHeader 子常式 sub loadStateMapping { # create a hash storing which mail corresponds to which state open( INFILE,"$inFile" ) or die "no in state file"; while( my $line = <INFILE> ) { chomp($line); my( $sname, $mail ) = split "STATE ", $line; # skip the total count $mail = substr($mail, index($mail," ")+1); $state{$mail} = $sname; }#stateMapping lines close(INFILE); }#loadStateMapping sub kmlHeader { print qq{<?xml version="1.0" encoding="UTF-8"?>\n}; print qq{<kml xmlns="http://earth.google.com/kml/2.2">\n}; print qq{<Document>\n}; print qq{ <name><![CDATA[Time Availability]]></name>\n}; print qq{ <open>1</open>\n}; }#kmlHeader | 為了更加快速地處理,loadStateMapping 文件只讀取州分配文件。創建與每個州名的電子郵件地址綁定的散列,將在主程序循環中檢查該散列。如果尚未分配州,這將允許跳過某些條目。kmlHeader 子常式將輸出 KML 文檔的主要頭標記。清單 11 顯示了 getTimes 子常式。 清單 11. getTimes 子常式 sub getTimes { my $endHour = $inHour + 1; if( length($endHour) == 1 ){ $endHour = "0$endHour" } print qq{ <TimeSpan>\n}; print qq{ <begin>2008-07-01T$inHour:00Z</begin>\n}; print qq{ <end>2008-07-01T$endHour:00Z</end>\n}; print qq{ </TimeSpan>\n}; }#getTimes | 上面列出的 getTimes 子常式中的代碼將指定正確的 TimeSpan 標記。下面的清單 12 顯示了更加複雜的 getStyle 子常式。 清單 12. getStyle 子常式 如下面所示的 kmlStyles 子常式,getStyle 子常式將首先創建最大指定值除以間隔得到的增量機(incrementer)。例如,最大值 100 和間隔 5 將生成一系列相差 20 個單元的 “bucket”,每個輸入值都將落入這些 bucket 中的一個。例如,輸入值 40 將對應中低衰減樣式,而大於等於 80 的值將對應最不透明的衰減設置。清單 13 顯示了 kmlStyles 子常式。 清單 13. kmlStyles sub kmlStyles { # create a incremented "fade range" according to the number of intervals my $hexInc = 255/$interval; my $count = $hexInc; my $styleNum = 0; while( $count <= 255 ) { my $fade = sprintf("%X", $count ); print qq{ <Style id="style} . $styleNum . qq{">\n}; print qq{ <IconStyle>\n}; print qq{ <scale>0.4</scale>\n}; print qq{ <Icon>\n}; print qq{ <href>http://maps.google.com/mapfiles/kml/}; print qq{shapes/star.png</href>\n}; print qq{ </Icon>\n}; print qq{ </IconStyle>\n}; print qq{ <LabelStyle>\n}; print qq{ <color>9900ffff</color>\n}; print qq{ <scale>1</scale>\n}; print qq{ </LabelStyle>\n}; print qq{ <LineStyle>\n}; print qq{ <color>99FFFF99</color>\n}; print qq{ <width>2</width>\n}; print qq{ </LineStyle>\n}; print qq{ <PolyStyle>\n}; print qq{ <color>} . $fade . qq{FF9933</color>\n}; print qq{ <fill>1</fill>\n}; print qq{ <outline>1</outline>\n}; print qq{ </PolyStyle>\n}; print qq{ </Style>\n}; $styleNum++; $count += $hexInc; }#while count }#kmlStyles | 不管最大值或指定的間隔數是多少,每個定義的樣式都需要有 00-ff 衰減百分比。在 sprintf 命令中使用 %X 修改符執行十進位間隔與十六進位衰減百分比之間的相應轉換。將以上代碼保存到名為 createKml.pl 的文件中並繼續閱讀用法信息。
用法 如何選擇適當的最大值和間隔變數在很大程度上依賴於具體數據。嘗試比 top50emails 中記錄的最大值小 20% 至 40% 的最大值。選擇間隔實際上是一種權衡:是使用較高的間隔值來呈現大量信息,還是使用較低的間隔值來顯示非常少量的更改。用 cat emailHours | perl createKml.pl stateMapping 20 2 > timeMap.kml 命令嘗試一個簡單示例。 在打開 Google Earth 並載入 timeMap.kml 文件后,在屏幕中心上方查找 “時間滑塊”。通過拖動滑塊按時間瀏覽可視化地圖,或者按下播放按鈕顯示動畫。另請嘗試擴展可視時窗以擴展某些州可見的時間範圍。
結束語 使用令人難以置信的 Google Earth 界面以及上面用於創建 KML 的自定義代碼,您可以為各種應用程序構建您自己的時間-可用性地圖。考慮從即時消息日誌、電話記錄或其他來源中提取登錄時間及活動時間,構建附加數據集及重疊數據集。擴展時窗,或者將更多注意力集中到公司或客戶群中每時每刻傳播的信息。提取 Web 伺服器訪問者信息並構建市政專用的地點標記和指示器集,研究 Web 站點訪問者在何時何地可以看到內容。(責任編輯:A6) } 時間可用性地圖提供了在某個時間和某個地點中最有可能空閑的人員列表。通過本文可以了解如何使用 Google Earth 和通信日誌製圖從而標識符合可用性的時間和地點。 團隊可能包括國內和國外的、靈活的工作時間和每周四天工作制都會改變團隊協作的時間和地點。本文提供了工具和代碼來幫助您找到使用 Google Earth 聯繫跨地理區域的各個團隊成員的最佳時間。通過使用郵件時間跟蹤(電子郵件標題)和具有適當設置的生成 Keyhole 標記語言(Keyhole Markup Language,KML)的程序,本文將演示使用 Google Earth 的 TimeSpan 特性和 “時間滑塊” 實現的有用的可視化技術。 要求 硬體 能夠用 3-D 加速運行 Google Earth 的任何硬體都有足夠的能力處理本文中的代碼。這裡描述的 KML 僅為美國就使用了數以千計的多邊形頂點,因此如果要在全球呈現或超越國家級的精確度,則可能需要速度更快的處理器。 軟體 必須擁有 Google Earth V4 或更高版本才能支持對於實現可視化非常重要的 TimeSpan 功能。構建 KML 以及提取電子郵件標題信息需要使用 Perl。您需要來自 CPAN 的 Mail::IMAPClient 和 IO::Socket::SSL 模塊(請參閱 參考資料)。 注意:本文中提供的代碼是跨平台的,並且應當可以在運行 Google Earth 和 Perl 的任意平台中運行。 構建時間-可用性地圖所採取的一般方法 時間-可用性地圖提供了在特定時間特定地點最有可能取得聯繫的人員的清單。例如,圖 1 和 2 顯示了在特定時窗期間國內各地可能收到郵件的用戶。即時消息日誌、電話使用記錄、組日曆、標記閱讀器(badge-reader)訪問和任意數目的與時間相關的其他數據記錄都可用於創建這些時間-可用性地圖。 本文主要介紹如何提取最常見的可用性數據:電子郵件標題。人們在積極地發送郵件時最有可能聯繫到。系統給每個用戶都設定相應的地理區域,並且基於每個小時的郵件計數用指示器衰減深度創建 KML。使用 Google Earth 的時間滑塊功能(包括動畫和總時窗選擇)將幫助為整個地理區域的用戶可視化得到的可用性地圖。查看圖 1,該圖將演示一天中早些時候的可視化示例。 圖 1. 可視化示例 —— 開始時間
圖 2 顯示了一天中稍晚時候的更寬的時間窗,幫助標識整個美國的可用用戶區域。 圖 2. 可視化示例 —— 隨後的時間
提取州概要信息 Google 的許多優秀 KML 文檔頁面之一將使用 KML 列出美國各州的輪廓圖。這些粗略圖大約包含 13,000 個點,為高亮顯示各州提供了不錯的基礎。獲取 Google 美國各州示例文件 並閱讀 extractStates.pl 程序如何分離州信息的詳細信息。 清單 1. extractStates.pl 完整程序 #!/usr/bin/perl -w # extractStates.pl write each state coordinates into a separate file use strict; my $str = ""; # built output string my $fname = ""; # current filename my $cmd = `mkdir states/`; while( my $line = <STDIN> ) { if( $line =~ /<name>/ ) { # extract the state for file name $fname = substr( $line, index($line,"CDATA[")+6 ); $fname = substr( $fname, 0, index($fname," (") ); }elsif( $line =~ /<TimeSpan>/ ) { # change the TimeSpan designator for later processing $line = <STDIN>; # begin tags $line = <STDIN>; # close TimeSpan $line = qq{ <TimeSpan></TimeSpan>\n}; }elsif( $line =~ /<\/Placemark/ ) { # write out the file, reset variables after closing tag open( OUTFILE, "> states/$fname ") or die "Can't write state file"; print OUTFILE $str; print OUTFILE $line; close(OUTFILE); $str = ""; }#if closing tag # add a line if it's at the start or the built string is not blank if( $line =~ /<Placemark/ || $str ne "" ){ $str .= $line } }#line in | 在聲明變數並且創建 states 目錄后,extractStates.pl 程序將從 STDIN 中讀取每一行。us_states.kml 文件包含粗略的州輪廓圖,而 extractStates.pl 程序將把每個幾何圖形寫入各自的文件。特定於 us_states.kml 文件的 TimeSpan 條目將被替換為更容易修改的佔位符,並且每個州的全部信息被寫出到 states 目錄。 把上面的清單 1 中的代碼保存到名為 extractStates.pl 的文件中,並且用 cat us_states.kml | perl extractStates.pl 命令運行該程序。檢查 states 目錄查看文件列表,如下所示: 清單 2. states 目錄列表 ls -la states/* | head -rw-r--r-- 1 nathan nathan 6708 2008-07-08 17:11 states/Alabama -rw-r--r-- 1 nathan nathan 85426 2008-07-08 17:11 states/Alaska ... -rw-r--r-- 1 nathan nathan 15804 2008-07-08 17:11 states/West Virginia -rw-r--r-- 1 nathan nathan 11536 2008-07-08 17:11 states/Wisconsin -rw-r--r-- 1 nathan nathan 3298 2008-07-08 17:11 states/Wyoming |
提取電子郵件時間信息 用來自 CPAN 的 Mail::IMAPClient 和 IO::Socket:SSL 模塊提取電子郵件標題和處理髮送時間相對簡單一些。以下示例將使用 Google Internet Message Access Protocol(IMAP)界面,但是本文中提供的代碼應當可以在任意數目的郵件伺服器上運行。您可能必須消除 SSL 連接,這取決於伺服器設置。 清單 3. extractEmails.pl 模塊,連接設置 #!/usr/bin/perl -w # extractEmails.pl get all e-mails, print listing of from at what hour use strict; use Mail::IMAPClient; use IO::Socket::SSL; my %timeHash = (); # data structure for whom at what time # create a SSL socket to the imap server my $socket = IO::Socket::SSL->new( PeerAddr => 'imap.gmail.com', PeerPort => 993 ) or die "can't create socket"; # create an imap connection through the ssl socket my $imap = Mail::IMAPClient->new( Socket => $socket, User => 'yourEmailID@gmail.com', Password => 'yourPassword' ) or die "can't connect imap"; $imap->select("INBOX"); my @messages = $imap->search('ALL'); | 創建套接字和 IMAP 連接十分簡單。清單 4 將創建和輸出電子郵件和時間數據結構。 清單 4. 提取小時,輸出數據結構 my $msgCount = 0; for my $msg ( @messages ) { my $from = $imap->get_header($msg,"From"); my $date = $imap->get_header($msg,"Date"); # set date to main hour $date = substr($date, index($date,":")-2,2); # increment the hour's count for that id $timeHash{$from}{$date}++; $msgCount++; if( $msgCount % 10 == 0 ){ print STDERR "$msgCount\n" } }#for each message $imap->logout(); # print all of the hour/from combinations for later processing for my $from( keys %timeHash ) { for my $time( keys %{ $timeHash{$from} } ) { print "$from TIME $time $timeHash{$from}{$time}\n"; }#for time }#for id | 注意在本例中,所選時間是發送每封電子郵件的小時數。您會發現為特定的可用性場景選擇小時、分鐘、天數或星期十分有用。用 perl extractEmails.pl > emailHours 命令運行 extractEmails.pl 程序。在將進度指示器(以每 10 個標題為單位)輸出到 STDERR 中后,以上命令將生成 emailHours 文件,如下所示: 清單 5. emailHours 示例文件 Dave <dave@ibmdevworks.com> TIME 11 6 Dave <dave@ibmdevworks.com> TIME 21 8 ... Bob <bob@ibmdevworks.com> TIME 07 6 Bob <bob@ibmdevworks.com> TIME 11 36 | emailHours 文件的格式為名稱(如果可用)、電子郵件地址、TIME 分隔符、小時。
分配電子郵件可以尋找地理位置 emailHours 文件現在包含所有電子郵件地址的列表和在給定小時中發送郵件的次數。您可能需要處理一些特定的聯繫人,或者創建發送電子郵件最多的人的列表。考慮使用下面一行代碼在 emailHours 文件中創建前 50 個電子郵件發送者的列表。 清單 6. 生成前 50 個電子郵件發送者的命令 注意,清單 6 中的 \ 字元僅用於設定格式,而不應當在運行命令時包括。運行以上命令將生成如下所示的列表: 清單 7. top50emails 示例文件 通過插入州名,然後在每個文件的開頭位置插入 STATE 分隔符,修改 top50emails 文件。您可以手動執行此操作,也可以將州指示器與 geo-ip 定位程序、員工地址資料庫或其他來源的地理位置數據鏈接起來。將已修改的文件另存為 stateMapping,如下所示: 清單 8. stateMapping 示例文件
用 createKml.pl 生成 KML 標記 提取了州坐標、計算了完整電子郵件標題和時間並且將每個相關電子郵件 ID 與州名關聯在一起之後,可以生成 KML 文件來實現所需的可視化。清單 9 顯示了 createKml.pl 程序的開頭。 清單 9. createKml.pl 程序頭,主循環 在確保正確使用並聲明變數之後,將調用 loadStateMapping 子常式。將讀取為每個電子郵件地址設定的州,並且調用 kmlHeader 和 kmlStyles 子常式來輸出指定閾值與間隔的相應 KML 標記。 進入主循環以讀取 STDIN 中的每一行並提取相關信息。系統將把電子郵件地址指定為位置標記名稱,計算 TimeSpan 開始點和結束點,並且相應的樣式都是基於指定的閾值和間隔編寫的。 清單 10 將顯示這些子常式中的第一個子常式 loadStateMapping 的詳細信息。 清單 10. loadStateMapping kmlHeader 子常式 為了更加快速地處理,loadStateMapping 文件只讀取州分配文件。創建與每個州名的電子郵件地址綁定的散列,將在主程序循環中檢查該散列。如果尚未分配州,這將允許跳過某些條目。kmlHeader 子常式將輸出 KML 文檔的主要頭標記。清單 11 顯示了 getTimes 子常式。 清單 11. getTimes 子常式 上面列出的 getTimes 子常式中的代碼將指定正確的 TimeSpan 標記。下面的清單 12 顯示了更加複雜的 getStyle 子常式。 清單 12. getStyle 子常式 如下面所示的 kmlStyles 子常式,getStyle 子常式將首先創建最大指定值除以間隔得到的增量機(incrementer)。例如,最大值 100 和間隔 5 將生成一系列相差 20 個單元的 “bucket”,每個輸入值都將落入這些 bucket 中的一個。例如,輸入值 40 將對應中低衰減樣式,而大於等於 80 的值將對應最不透明的衰減設置。清單 13 顯示了 kmlStyles 子常式。 清單 13. kmlStyles 不管最大值或指定的間隔數是多少,每個定義的樣式都需要有 00-ff 衰減百分比。在 sprintf 命令中使用 %X 修改符執行十進位間隔與十六進位衰減百分比之間的相應轉換。將以上代碼保存到名為 createKml.pl 的文件中並繼續閱讀用法信息。
用法 如何選擇適當的最大值和間隔變數在很大程度上依賴於具體數據。嘗試比 top50emails 中記錄的最大值小 20% 至 40% 的最大值。選擇間隔實際上是一種權衡:是使用較高的間隔值來呈現大量信息,還是使用較低的間隔值來顯示非常少量的更改。用 cat emailHours | perl createKml.pl stateMapping 20 2 > timeMap.kml 命令嘗試一個簡單示例。 在打開 Google Earth 並載入 timeMap.kml 文件后,在屏幕中心上方查找 “時間滑塊”。通過拖動滑塊按時間瀏覽可視化地圖,或者按下播放按鈕顯示動畫。另請嘗試擴展可視時窗以擴展某些州可見的時間範圍。
結束語 使用令人難以置信的 Google Earth 界面以及上面用於創建 KML 的自定義代碼,您可以為各種應用程序構建您自己的時間-可用性地圖。考慮從即時消息日誌、電話記錄或其他來源中提取登錄時間及活動時間,構建附加數據集及重疊數據集。擴展時窗,或者將更多注意力集中到公司或客戶群中每時每刻傳播的信息。提取 Web 伺服器訪問者信息並構建市政專用的地點標記和指示器集,研究 Web 站點訪問者在何時何地可以看到內容。(責任編輯:A6) "}}' | sort -nr | head -n50 > top50emails | 注意,清單 6 中的 \ 字元僅用於設定格式,而不應當在運行命令時包括。運行以上命令將生成如下所示的列表: 清單 7. top50emails 示例文件 通過插入州名,然後在每個文件的開頭位置插入 STATE 分隔符,修改 top50emails 文件。您可以手動執行此操作,也可以將州指示器與 geo-ip 定位程序、員工地址資料庫或其他來源的地理位置數據鏈接起來。將已修改的文件另存為 stateMapping,如下所示: 清單 8. stateMapping 示例文件
用 createKml.pl 生成 KML 標記 提取了州坐標、計算了完整電子郵件標題和時間並且將每個相關電子郵件 ID 與州名關聯在一起之後,可以生成 KML 文件來實現所需的可視化。清單 9 顯示了 createKml.pl 程序的開頭。 清單 9. createKml.pl 程序頭,主循環 在確保正確使用並聲明變數之後,將調用 loadStateMapping 子常式。將讀取為每個電子郵件地址設定的州,並且調用 kmlHeader 和 kmlStyles 子常式來輸出指定閾值與間隔的相應 KML 標記。 進入主循環以讀取 STDIN 中的每一行並提取相關信息。系統將把電子郵件地址指定為位置標記名稱,計算 TimeSpan 開始點和結束點,並且相應的樣式都是基於指定的閾值和間隔編寫的。 清單 10 將顯示這些子常式中的第一個子常式 loadStateMapping 的詳細信息。 清單 10. loadStateMapping kmlHeader 子常式 為了更加快速地處理,loadStateMapping 文件只讀取州分配文件。創建與每個州名的電子郵件地址綁定的散列,將在主程序循環中檢查該散列。如果尚未分配州,這將允許跳過某些條目。kmlHeader 子常式將輸出 KML 文檔的主要頭標記。清單 11 顯示了 getTimes 子常式。 清單 11. getTimes 子常式 上面列出的 getTimes 子常式中的代碼將指定正確的 TimeSpan 標記。下面的清單 12 顯示了更加複雜的 getStyle 子常式。 清單 12. getStyle 子常式 如下面所示的 kmlStyles 子常式,getStyle 子常式將首先創建最大指定值除以間隔得到的增量機(incrementer)。例如,最大值 100 和間隔 5 將生成一系列相差 20 個單元的 “bucket”,每個輸入值都將落入這些 bucket 中的一個。例如,輸入值 40 將對應中低衰減樣式,而大於等於 80 的值將對應最不透明的衰減設置。清單 13 顯示了 kmlStyles 子常式。 清單 13. kmlStyles 不管最大值或指定的間隔數是多少,每個定義的樣式都需要有 00-ff 衰減百分比。在 sprintf 命令中使用 %X 修改符執行十進位間隔與十六進位衰減百分比之間的相應轉換。將以上代碼保存到名為 createKml.pl 的文件中並繼續閱讀用法信息。
用法 如何選擇適當的最大值和間隔變數在很大程度上依賴於具體數據。嘗試比 top50emails 中記錄的最大值小 20% 至 40% 的最大值。選擇間隔實際上是一種權衡:是使用較高的間隔值來呈現大量信息,還是使用較低的間隔值來顯示非常少量的更改。用 cat emailHours | perl createKml.pl stateMapping 20 2 > timeMap.kml 命令嘗試一個簡單示例。 在打開 Google Earth 並載入 timeMap.kml 文件后,在屏幕中心上方查找 “時間滑塊”。通過拖動滑塊按時間瀏覽可視化地圖,或者按下播放按鈕顯示動畫。另請嘗試擴展可視時窗以擴展某些州可見的時間範圍。
結束語 使用令人難以置信的 Google Earth 界面以及上面用於創建 KML 的自定義代碼,您可以為各種應用程序構建您自己的時間-可用性地圖。考慮從即時消息日誌、電話記錄或其他來源中提取登錄時間及活動時間,構建附加數據集及重疊數據集。擴展時窗,或者將更多注意力集中到公司或客戶群中每時每刻傳播的信息。提取 Web 伺服器訪問者信息並構建市政專用的地點標記和指示器集,研究 Web 站點訪問者在何時何地可以看到內容。(責任編輯:A6) [0]; my $decInc = $max / $interval; my $count = $decInc; my $styleCount = 0; # move through each interval, exit when the input value no longer fits while( $count <= $max ) { if( $count > $inputVal ){ last } $styleCount++; $count += $decInc; }#While count less than max # default to the last style if interval is outside the boundary if( $styleCount >= $interval ){ $styleCount-- } print qq{ <styleUrl>#style} . $styleCount . qq{</styleUrl>\n}; }#getStyle | 如下面所示的 kmlStyles 子常式,getStyle 子常式將首先創建最大指定值除以間隔得到的增量機(incrementer)。例如,最大值 100 和間隔 5 將生成一系列相差 20 個單元的 “bucket”,每個輸入值都將落入這些 bucket 中的一個。例如,輸入值 40 將對應中低衰減樣式,而大於等於 80 的值將對應最不透明的衰減設置。清單 13 顯示了 kmlStyles 子常式。 清單 13. kmlStyles 不管最大值或指定的間隔數是多少,每個定義的樣式都需要有 00-ff 衰減百分比。在 sprintf 命令中使用 %X 修改符執行十進位間隔與十六進位衰減百分比之間的相應轉換。將以上代碼保存到名為 createKml.pl 的文件中並繼續閱讀用法信息。
用法 如何選擇適當的最大值和間隔變數在很大程度上依賴於具體數據。嘗試比 top50emails 中記錄的最大值小 20% 至 40% 的最大值。選擇間隔實際上是一種權衡:是使用較高的間隔值來呈現大量信息,還是使用較低的間隔值來顯示非常少量的更改。用 cat emailHours | perl createKml.pl stateMapping 20 2 > timeMap.kml 命令嘗試一個簡單示例。 在打開 Google Earth 並載入 timeMap.kml 文件后,在屏幕中心上方查找 “時間滑塊”。通過拖動滑塊按時間瀏覽可視化地圖,或者按下播放按鈕顯示動畫。另請嘗試擴展可視時窗以擴展某些州可見的時間範圍。
結束語 使用令人難以置信的 Google Earth 界面以及上面用於創建 KML 的自定義代碼,您可以為各種應用程序構建您自己的時間-可用性地圖。考慮從即時消息日誌、電話記錄或其他來源中提取登錄時間及活動時間,構建附加數據集及重疊數據集。擴展時窗,或者將更多注意力集中到公司或客戶群中每時每刻傳播的信息。提取 Web 伺服器訪問者信息並構建市政專用的地點標記和指示器集,研究 Web 站點訪問者在何時何地可以看到內容。(責任編輯:A6) } 時間可用性地圖提供了在某個時間和某個地點中最有可能空閑的人員列表。通過本文可以了解如何使用 Google Earth 和通信日誌製圖從而標識符合可用性的時間和地點。 團隊可能包括國內和國外的、靈活的工作時間和每周四天工作制都會改變團隊協作的時間和地點。本文提供了工具和代碼來幫助您找到使用 Google Earth 聯繫跨地理區域的各個團隊成員的最佳時間。通過使用郵件時間跟蹤(電子郵件標題)和具有適當設置的生成 Keyhole 標記語言(Keyhole Markup Language,KML)的程序,本文將演示使用 Google Earth 的 TimeSpan 特性和 “時間滑塊” 實現的有用的可視化技術。 要求 硬體 能夠用 3-D 加速運行 Google Earth 的任何硬體都有足夠的能力處理本文中的代碼。這裡描述的 KML 僅為美國就使用了數以千計的多邊形頂點,因此如果要在全球呈現或超越國家級的精確度,則可能需要速度更快的處理器。 軟體 必須擁有 Google Earth V4 或更高版本才能支持對於實現可視化非常重要的 TimeSpan 功能。構建 KML 以及提取電子郵件標題信息需要使用 Perl。您需要來自 CPAN 的 Mail::IMAPClient 和 IO::Socket::SSL 模塊(請參閱 參考資料)。 注意:本文中提供的代碼是跨平台的,並且應當可以在運行 Google Earth 和 Perl 的任意平台中運行。 構建時間-可用性地圖所採取的一般方法 時間-可用性地圖提供了在特定時間特定地點最有可能取得聯繫的人員的清單。例如,圖 1 和 2 顯示了在特定時窗期間國內各地可能收到郵件的用戶。即時消息日誌、電話使用記錄、組日曆、標記閱讀器(badge-reader)訪問和任意數目的與時間相關的其他數據記錄都可用於創建這些時間-可用性地圖。 本文主要介紹如何提取最常見的可用性數據:電子郵件標題。人們在積極地發送郵件時最有可能聯繫到。系統給每個用戶都設定相應的地理區域,並且基於每個小時的郵件計數用指示器衰減深度創建 KML。使用 Google Earth 的時間滑塊功能(包括動畫和總時窗選擇)將幫助為整個地理區域的用戶可視化得到的可用性地圖。查看圖 1,該圖將演示一天中早些時候的可視化示例。 圖 1. 可視化示例 —— 開始時間
圖 2 顯示了一天中稍晚時候的更寬的時間窗,幫助標識整個美國的可用用戶區域。 圖 2. 可視化示例 —— 隨後的時間
提取州概要信息 Google 的許多優秀 KML 文檔頁面之一將使用 KML 列出美國各州的輪廓圖。這些粗略圖大約包含 13,000 個點,為高亮顯示各州提供了不錯的基礎。獲取 Google 美國各州示例文件 並閱讀 extractStates.pl 程序如何分離州信息的詳細信息。 清單 1. extractStates.pl 完整程序 #!/usr/bin/perl -w # extractStates.pl write each state coordinates into a separate file use strict; my $str = ""; # built output string my $fname = ""; # current filename my $cmd = `mkdir states/`; while( my $line = <STDIN> ) { if( $line =~ /<name>/ ) { # extract the state for file name $fname = substr( $line, index($line,"CDATA[")+6 ); $fname = substr( $fname, 0, index($fname," (") ); }elsif( $line =~ /<TimeSpan>/ ) { # change the TimeSpan designator for later processing $line = <STDIN>; # begin tags $line = <STDIN>; # close TimeSpan $line = qq{ <TimeSpan></TimeSpan>\n}; }elsif( $line =~ /<\/Placemark/ ) { # write out the file, reset variables after closing tag open( OUTFILE, "> states/$fname ") or die "Can't write state file"; print OUTFILE $str; print OUTFILE $line; close(OUTFILE); $str = ""; }#if closing tag # add a line if it's at the start or the built string is not blank if( $line =~ /<Placemark/ || $str ne "" ){ $str .= $line } }#line in | 在聲明變數並且創建 states 目錄后,extractStates.pl 程序將從 STDIN 中讀取每一行。us_states.kml 文件包含粗略的州輪廓圖,而 extractStates.pl 程序將把每個幾何圖形寫入各自的文件。特定於 us_states.kml 文件的 TimeSpan 條目將被替換為更容易修改的佔位符,並且每個州的全部信息被寫出到 states 目錄。 把上面的清單 1 中的代碼保存到名為 extractStates.pl 的文件中,並且用 cat us_states.kml | perl extractStates.pl 命令運行該程序。檢查 states 目錄查看文件列表,如下所示: 清單 2. states 目錄列表 ls -la states/* | head -rw-r--r-- 1 nathan nathan 6708 2008-07-08 17:11 states/Alabama -rw-r--r-- 1 nathan nathan 85426 2008-07-08 17:11 states/Alaska ... -rw-r--r-- 1 nathan nathan 15804 2008-07-08 17:11 states/West Virginia -rw-r--r-- 1 nathan nathan 11536 2008-07-08 17:11 states/Wisconsin -rw-r--r-- 1 nathan nathan 3298 2008-07-08 17:11 states/Wyoming |
提取電子郵件時間信息 用來自 CPAN 的 Mail::IMAPClient 和 IO::Socket:SSL 模塊提取電子郵件標題和處理髮送時間相對簡單一些。以下示例將使用 Google Internet Message Access Protocol(IMAP)界面,但是本文中提供的代碼應當可以在任意數目的郵件伺服器上運行。您可能必須消除 SSL 連接,這取決於伺服器設置。 清單 3. extractEmails.pl 模塊,連接設置 #!/usr/bin/perl -w # extractEmails.pl get all e-mails, print listing of from at what hour use strict; use Mail::IMAPClient; use IO::Socket::SSL; my %timeHash = (); # data structure for whom at what time # create a SSL socket to the imap server my $socket = IO::Socket::SSL->new( PeerAddr => 'imap.gmail.com', PeerPort => 993 ) or die "can't create socket"; # create an imap connection through the ssl socket my $imap = Mail::IMAPClient->new( Socket => $socket, User => 'yourEmailID@gmail.com', Password => 'yourPassword' ) or die "can't connect imap"; $imap->select("INBOX"); my @messages = $imap->search('ALL'); | 創建套接字和 IMAP 連接十分簡單。清單 4 將創建和輸出電子郵件和時間數據結構。 清單 4. 提取小時,輸出數據結構 my $msgCount = 0; for my $msg ( @messages ) { my $from = $imap->get_header($msg,"From"); my $date = $imap->get_header($msg,"Date"); # set date to main hour $date = substr($date, index($date,":")-2,2); # increment the hour's count for that id $timeHash{$from}{$date}++; $msgCount++; if( $msgCount % 10 == 0 ){ print STDERR "$msgCount\n" } }#for each message $imap->logout(); # print all of the hour/from combinations for later processing for my $from( keys %timeHash ) { for my $time( keys %{ $timeHash{$from} } ) { print "$from TIME $time $timeHash{$from}{$time}\n"; }#for time }#for id | 注意在本例中,所選時間是發送每封電子郵件的小時數。您會發現為特定的可用性場景選擇小時、分鐘、天數或星期十分有用。用 perl extractEmails.pl > emailHours 命令運行 extractEmails.pl 程序。在將進度指示器(以每 10 個標題為單位)輸出到 STDERR 中后,以上命令將生成 emailHours 文件,如下所示: 清單 5. emailHours 示例文件 Dave <dave@ibmdevworks.com> TIME 11 6 Dave <dave@ibmdevworks.com> TIME 21 8 ... Bob <bob@ibmdevworks.com> TIME 07 6 Bob <bob@ibmdevworks.com> TIME 11 36 | emailHours 文件的格式為名稱(如果可用)、電子郵件地址、TIME 分隔符、小時。
分配電子郵件可以尋找地理位置 emailHours 文件現在包含所有電子郵件地址的列表和在給定小時中發送郵件的次數。您可能需要處理一些特定的聯繫人,或者創建發送電子郵件最多的人的列表。考慮使用下面一行代碼在 emailHours 文件中創建前 50 個電子郵件發送者的列表。 清單 6. 生成前 50 個電子郵件發送者的命令 注意,清單 6 中的 \ 字元僅用於設定格式,而不應當在運行命令時包括。運行以上命令將生成如下所示的列表: 清單 7. top50emails 示例文件 通過插入州名,然後在每個文件的開頭位置插入 STATE 分隔符,修改 top50emails 文件。您可以手動執行此操作,也可以將州指示器與 geo-ip 定位程序、員工地址資料庫或其他來源的地理位置數據鏈接起來。將已修改的文件另存為 stateMapping,如下所示: 清單 8. stateMapping 示例文件
用 createKml.pl 生成 KML 標記 提取了州坐標、計算了完整電子郵件標題和時間並且將每個相關電子郵件 ID 與州名關聯在一起之後,可以生成 KML 文件來實現所需的可視化。清單 9 顯示了 createKml.pl 程序的開頭。 清單 9. createKml.pl 程序頭,主循環 在確保正確使用並聲明變數之後,將調用 loadStateMapping 子常式。將讀取為每個電子郵件地址設定的州,並且調用 kmlHeader 和 kmlStyles 子常式來輸出指定閾值與間隔的相應 KML 標記。 進入主循環以讀取 STDIN 中的每一行並提取相關信息。系統將把電子郵件地址指定為位置標記名稱,計算 TimeSpan 開始點和結束點,並且相應的樣式都是基於指定的閾值和間隔編寫的。 清單 10 將顯示這些子常式中的第一個子常式 loadStateMapping 的詳細信息。 清單 10. loadStateMapping kmlHeader 子常式 為了更加快速地處理,loadStateMapping 文件只讀取州分配文件。創建與每個州名的電子郵件地址綁定的散列,將在主程序循環中檢查該散列。如果尚未分配州,這將允許跳過某些條目。kmlHeader 子常式將輸出 KML 文檔的主要頭標記。清單 11 顯示了 getTimes 子常式。 清單 11. getTimes 子常式 上面列出的 getTimes 子常式中的代碼將指定正確的 TimeSpan 標記。下面的清單 12 顯示了更加複雜的 getStyle 子常式。 清單 12. getStyle 子常式 如下面所示的 kmlStyles 子常式,getStyle 子常式將首先創建最大指定值除以間隔得到的增量機(incrementer)。例如,最大值 100 和間隔 5 將生成一系列相差 20 個單元的 “bucket”,每個輸入值都將落入這些 bucket 中的一個。例如,輸入值 40 將對應中低衰減樣式,而大於等於 80 的值將對應最不透明的衰減設置。清單 13 顯示了 kmlStyles 子常式。 清單 13. kmlStyles 不管最大值或指定的間隔數是多少,每個定義的樣式都需要有 00-ff 衰減百分比。在 sprintf 命令中使用 %X 修改符執行十進位間隔與十六進位衰減百分比之間的相應轉換。將以上代碼保存到名為 createKml.pl 的文件中並繼續閱讀用法信息。
用法 如何選擇適當的最大值和間隔變數在很大程度上依賴於具體數據。嘗試比 top50emails 中記錄的最大值小 20% 至 40% 的最大值。選擇間隔實際上是一種權衡:是使用較高的間隔值來呈現大量信息,還是使用較低的間隔值來顯示非常少量的更改。用 cat emailHours | perl createKml.pl stateMapping 20 2 > timeMap.kml 命令嘗試一個簡單示例。 在打開 Google Earth 並載入 timeMap.kml 文件后,在屏幕中心上方查找 “時間滑塊”。通過拖動滑塊按時間瀏覽可視化地圖,或者按下播放按鈕顯示動畫。另請嘗試擴展可視時窗以擴展某些州可見的時間範圍。
結束語 使用令人難以置信的 Google Earth 界面以及上面用於創建 KML 的自定義代碼,您可以為各種應用程序構建您自己的時間-可用性地圖。考慮從即時消息日誌、電話記錄或其他來源中提取登錄時間及活動時間,構建附加數據集及重疊數據集。擴展時窗,或者將更多注意力集中到公司或客戶群中每時每刻傳播的信息。提取 Web 伺服器訪問者信息並構建市政專用的地點標記和指示器集,研究 Web 站點訪問者在何時何地可以看到內容。(責任編輯:A6) "}}' | sort -nr | head -n50 > top50emails |