顯示具有 部落格 標籤的文章。 顯示所有文章
顯示具有 部落格 標籤的文章。 顯示所有文章

2010/03/20

技術通告,有用我寫的外掛程式,請修改一下網址


其實去年 Google 就已經宣布 GooglePages 的服務要關閉,用 GoogleSites 來取代,Google 大神也很好心的把原來放在 GooglePages 的所有檔案無痛的搬到 GoogleSites。可是 GoogleSites 並不支援 Javascript 的檔案類型的存放。

我想是我自己偷懶吧!人家免費提供網路空間,公告了很久說要關閉,今天終於輪到我,把我的 GooglePages 服務給關了。在軟體公司上班的我知道寫只要是在外面有在跑的系統的最高原則,就是要能相容,客戶在不知不覺中甚麼都不用改就能夠升級,最差的狀況就是至少還能運作。於是,我努力的把所有 Google 大神目前的服務都看了一遍,看看有甚麼方法可以讓大家不用改,就可以繼續用我寫的外掛小程式。

我試用了 GoogleCode 的 Project 代管服務,但是他目前並沒有提供自訂網域的服務(搞不好明天就開放?),若是要改網址,我有一堆文章內的語法通通要改。後來用了 Google AppEngine,他有提供自訂網域的方法,可是呢!要寫一堆程式來運作,功能很強大,可是我只是要放幾個小小的 Javascript 小程式,要設定一大堆,他甚至提供了資料庫與檔案存取的方式,看來這個等我有空在來研究了,搞不好可以自己作些簡單的應用。

總而言之,我還是很懶。以上叭啦叭啦說了一堆,若是看不懂沒有關係,我其實是要告訴大家,或是有用過我寫的外掛程式的人,請看到下面這個網域的

http://js.writers.idv.tw

請改成

http://jswriters.googlecode.com/files

這樣就可以運作了。

以下我再說明一下我有開放的外掛小程式的外掛語法,歡迎大家拿去用。

1. 推薦活動

<script src=http://jswriters.googlecode.com/files/ok.js></script>
2. 城市精選
<script src=http://jswriters.googlecode.com/files/a.js></script>
3. 最新迴響(只支援 blogger.com),紅字部分請自行體會修改
<script>var g_szBlogDomain='xxxxx.blogspot.com'; var g_szHead='《最新迴響》'; </script><script src=http://jswriters.googlecode.com/files/rc.js></script>
4. 列出部落格某個label所有的文章標題(只支援 blogger.com),紅字部分請自行體會修改
<script>
a_szBlogName='部落格名稱'; a_szDivName='20070723'; a_szLabel1='label'; a_szRSS1Domain='xxxx.blogspot.com';</script><script src=http://jswriters.googlecode.com/files/rss1.js></script>

2007/06/19

部落格的分類


這篇是我自己對於部落格的分類,有遺漏的請大家指教

1. 個人部落格:

只是單純的自己紀錄自己的日記,或許只給少數親友知道網址,或者只給親密的人知道,甚至是自己不希望為人知的另一面。

2. 專業個人部落格:

有加裝廣告系統,已經不是單純爲了寫日記或是心得的分享。而且有時會為了熱門的關鍵字而寫文章,或是推薦某些產品而專門撰文。

3. 組織團體部落格:

非營利組織或是農民團體,爲了與參與者溝通所建立的部落格

4. 企業部落格:

營利企業組織為了商業運作,與客戶溝通等用途

5. 廣告部落格:

爲了某些商品而建立的部落格,如歌手、沐浴乳、美容用品等。

6. 其他:

還有哪些呢?收集特定資料......

2007/04/11

My Maps@Google Maps




本來都是自己用 Google Map API 再配合某一個地圖部落格來標示我自己寫文章的景點,然後在用 IFRAME 包在旅行部落格內,以下是舊的範本範例:

http://next.writers.idv.tw/2006/06/google-map-api-v20.html

一直想自己做出 Google Maps 的方式,但是總是沒時間,現在 Google 推出了 My Maps 的服務,我想我也不用做了,就用他的服務就好,只是我想用 IFRAME 包進來到一篇部落格的內文,可能有點醜,上面還有 Search 的輸入選單,不知道如何拿掉?這個等過陣子再來研究了。

My Maps 還有支援 Google Earth KML 檔案,真是非常方便,不過不知道是不是 Google Earth 還沒有支援線段的景點標示,還是有什麼不相容,未來再看看了。

以下是我自己點上了幾個景點加上照片,慢慢地應該會越來越多,要如何把以前標示好景點文章連結搬過來,可真是傷腦筋了。

http://maps.google.com/maps/ms?ie=UTF8&hl=en&z=15&t=h&om=1&msid=102225836468903487186.00000111cefc79f6128b1&msa=0

2007/02/15

推薦阿土伯的網站


真是 blogger.com 的福音,直得學習

http://racklin.blogspot.com/2007/02/bloggerext2js-061.html

我也應該多學學他用 googlecode 這個網站的服務

2007/01/05

JSON 應用(2):最新迴響的標題


自從 blogger.com 的新版發佈以來,最另人詬病的就是若是有加入一個新網頁元素(Page Elements),選擇資訊提供(Feed)的時候,加入是最新迴響的 Feed(http://xxxxx.blogspot.com/feeds/comments/summary) 更新的速度很慢,甚至要到幾個小時之譜,這對來部落格留言的人不是很能接受的。

因為 blogger.com 之前的舊版是利用轉成靜態網頁的方式,但新版就不是這樣的模式,增加了很大的彈性,但是這對於資料的同步與 Cache 是很大的考驗,所以其實也不能責怪他們。

若改成用 Javascript 的模式去抓 JSON 格式的 Feed 來顯示,可以解決上述的問題,因為資料是在客戶端電腦去抓取 Feed 回來顯示。可是問題又來了,這個 Feed 的格式居然沒有原文章的標題,這個對寫很多文章的人來說是個很大的困擾,往往要點入後才知道這些人是在哪篇文章留言的!所以,我想了幾個辦法如下:

  1. 先抓取 comments 的 feed,內有標題的網址,然後利用搜尋的方法去 blogsearch.google.com 取回標題
  2. 先抓取 comments 的 feed,內有標題的網址,然後再抓取 posts 的 feed 兩個去比對
  3. 先抓取 comments 的 feed,內有標題的網址,再抓取藉由 comments 發佈到 gmail 信箱然後轉發到另一個部落格的 posts feed 去比對網址,取回標題。


分析以上作法的風險,我決定採用最麻煩的第三種作法。

  1. blogsearch 的效能不可預知,新文章可能搜尋不到,舊文章可能搜不到,或者標題更改也不一定會更新。
  2. 看起來是完美的作法,但是萬一有人在很舊很舊的文章留言, posts 的 feed 一次最多只能抓取 99 則,若比對不到的話,可能還要抓第二次第三次,很浪費連線的資訊傳送。
  3. 去比對最新 comments 的 feed 雖然可行,可是中間經過兩個SMTP(gmail)的轉寄,未來格式轉變,或是被誤認為 SPAM 也是很容易出問題。


我很懶的剪圖做說明,就簡單的把第三種方法的設定方式描述如下,有問題的人麻煩在詢問就好。

  1. 在原部落格A的控制主頁(Dashboard) → 設定(Settings) → 意見(Comments) → 意見通知地址 (Comment Notification Address) 打入一個為了最新迴響而開設的gmail 信箱(C@gmail.com)
  2. 開一個新的部落格B,然後在控制主頁(Dashboard) → 設定(Settings) → 電子郵件(Email) → Mail-to-Blogger 地址 Mail-to-Blogger Address 自行設定一組地址(account.D@blogger.com) 然後下方的 發佈(Publish) 要打勾勾
  3. 進入 (C@gmail.com) 的信箱收信匣(Web版) → 設定(Settings) → 轉寄和 POP 轉寄內收郵件的副本至輸入上個步驟的 account.D@blogger.com
  4. 在部落格A隨便留個言,然後打開部落格B看看是否留言有變成一篇新的文章,若有的話再進行下一個步驟。
  5. 在部落格A的控制主頁(Dashboard) → 範本(Template) → 網頁元素(Page Elements) → 新增網頁元素(Add a New Page Elements) → HTML/Javascript 然後把下面的原始碼貼上,就大功告成了,不過寄得把紅字的網址要打對。

<div id="divrc">下載中...</div>
<script>
var g_szAuthorsLink=new Array();
var g_szTitle= new Array();
var g_szOrgLink = new Array();
var g_iIndex=0;
var g_iShowCount=5;

function a_comprc(a,b){
order= Date.parse(a.published.$t.replace(/^(\d{4})-(\d{2})-(\d{2})T([0-9:]*)([.0-9]*)(.)(.*)$/,
'$1/$2/$3 $4 GMT')) - Date.parse(b.published.$t.replace(/^(\d{4})-(\d{2})-(\d{2})T([0-9:]*)([.0-9]*)(.)(.*)$/,
'$1/$2/$3 $4 GMT'));
return 0-order;
}
function a_rc(json)
{
g_entry = json.feed.entry.sort(a_comprc);
}
function a_FindTitle(json,orgLink)
{
var ret= orgLink;
for (var ii=0,rc; rc= json.feed.entry[ii]; ii++)
{
var content=rc.content.$t;
var index=content.indexOf(orgLink);
if (index>0)
{
var iBegin=index+orgLink.length+2;
var content2= content.substring(iBegin,content.length);
var iEnd = content2.indexOf('</a>');
if (iEnd >0)
ret=content2.substring(0,iEnd);
break;
}
}
return ret;
}
function a_FindIndex(json,orgLink)
{
var ij=0;
for (ij=0; ij < g_iIndex; ij++)
{
if (orgLink==g_szOrgLink[ij])
return ij;
}
g_szOrgLink[ij]=orgLink;
g_szTitle[ij]= a_FindTitle(json,orgLink);
g_szAuthorsLink[ij]='◎';
g_iIndex ++;
return ij;
}
function b_rc(json)
{
for (var i=0,post; post = g_entry[i]; i++)
{
var content = post.title.$t;
var link = post.link[0].href;
var iFind = link.indexOf('#');
var orgLink= link;
if (iFind>0)
orgLink = link.substring(0,iFind);
var index = a_FindIndex(json,orgLink);
if (index>= g_iShowCount)
{
g_iIndex--;
break;
}
var auther= post.author[0].name.$t;
var timestamp=post.published.$t.substr(0,10) + ' ' +post.published.$t.substr(11,5);
g_szAuthorsLink[index] += '<a href="' + link + '" title="' + timestamp + ':' + content + '">' + auther + '</a>«';
}
var temp = '<ul id="feedItemListDisplay">';
for (var j=0; j< g_iIndex; j++)
{
temp += '<li><a href="' + g_szOrgLink[j] + '">' + g_szTitle[j] + '</a><br/>' + g_szAuthorsLink[j] + '</li>';
}
temp+="</ul>";
document.getElementById("divrc").innerHTML = temp;
}
</script>
<script src="http://部落格A網址/feeds/comments/summary?alt=json-in-script&callback=a_rc" type="text/javascript"></script>
<script src="http://部落格B網址/feeds/posts/full?alt=json-in-script&callback=b_rc" type="text/javascript"></script>


至於實際的效果,就看左邊的《最新迴響》就是了。

2007.1.11 更新
上面這個方法,email 轉發文章到部落格B 被 blogger.com 擋掉了,他們認為是 spam。所以我改用了方法2. 其實程式碼是差不多,也做成一個元件送給大家使用,使用方法如下:

<script>g_szBlogDomain='xxxxx.blogspot.com'; </script>
<script src="http://js.writers.idv.tw/rc.js"></script>

2008.9.23 更新
今天不知道怎樣,json 輸出的格式改了,我把程式更新在 rc3.js

<script>g_szBlogDomain='xxxxx.blogspot.com'; </script>
<script src="http://js.writers.idv.tw/rc3.js"></script>

2008.9.24 更新
我把原來程式加入 rel 這個值的判斷,所以用原來的 rc.js 也可以了!

2006/12/27

Google Calendar 的 JSON 應用


新版的 blogger.com 有個 HTML/Javascript 的 widget 區塊,可以很自由的放入一些程式碼,目前 google 宣佈全面支援 JSON 的規格,因此不用再利用 XMLRequest 的元件去解惱人的 XML 格式。

目前 blogger.com 的新版範本檢查的很嚴格,很多要寫死的資料並不建議直接放在範本上,利用 HTML/Javascript 這個 widget 也是放置資料的好方法。

JSON 的規格大致上就是利用Javascript src=http://domain.../?param=value 這種模式,用瀏覽器的內建解析HTML語法的同時就把程式碼下載到Client端,然後透過 Callback function 的宣告,只要下載回來就會觸發相關的function,資料利用 Array 的模式直接放在裡面,很簡單的取出資料然後做相關的應用顯示出來即可,要取多少資料,要如何排序,要怎樣顯示?都可以自己決定。

以下就是我利用 Google Calendar 提供的 feed,把最近三筆在日曆上的行程顯示出來,如何判斷最近?就是利用客戶端電腦的日期時間來判斷,然後依照時間排序顯示出這些資訊。程式碼如下:

<h2><a target="_blank" href="http://www.google.com/calendar/embed?src=mpmigkt2int30a57lakat0dn10%40group.calendar.google.com">《活動行程》</a><a target="_blank" href="http://www.google.com/calendar/feeds/mpmigkt2int30a57lakat0dn10%40group.calendar.google.com/public/full"><img border="0" src="http://www.google.com/calendar/images/xml.gif"/></a></h2>
<div id="divcalendar">下載中...</div>
<script>
function cal_Date(a){
var aa=a;
if (aa.length==10)
aa += 'T00:01:00.000+08:00';
return Date.parse(aa.replace(/^(\d{4})-(\d{2})-(\d{2})T([0-9:]*)([.0-9]*)(.)(.*)$/, '$1/$2/$3 $4 GMT'));
}
function cal_comp(a,b){
order= cal_Date(a.gd$when[0].startTime)- cal_Date(b.gd$when[0].startTime);
return order;
}
function cbcalendar(json)
{
var temp = '<ul id="feedItemListDisplay">';
var postshow=3;
var sortentry=json.feed.entry.sort(cal_comp);
var nowDate= new Date();
var j=0;
for (var i=0,post; post = sortentry[i]; i++) {
if(j>=postshow) break;
var title=post.title.$t;
var link=post.gd$where[0].valueString;
var startTime=post.gd$when[0].startTime;
var thisDate = cal_Date(startTime);
if (thisDate >= nowDate)
{
temp += '<li><a target="_blank" href="' + link + '">' + startTime.substring(0,10)+':'+title + '</a><br>' +'</li>';
j ++;
}
}
if (j==0)
temp += "<li>無資料</li>";
temp+="</ul>";
document.getElementById("divcalendar").innerHTML = temp;
}
</script>
<script src="http://www.google.com/calendar/feeds/mpmigkt2int30a57lakat0dn10%40group.calendar.google.com/public/full?alt=json-in-script&callback=cbcalendar" type="text/javascript"></script>

由於 google calendar 並沒有網址URL 的欄位,我是利用地點這個欄位來放網址,上面有行程式碼
var link=post.gd$where[0].valueString;

可以改成
var link=post.link[0].href;

就是 google calendar 那個行程的連結。

相關說明:http://code.google.com/apis/gdata/json.html

2006/12/24

Blog This 的更新


終於把部落格升級到新版,順便更新一下一些網址

BlogThis!

(按右鍵新增到我的最愛就可以使用了)

另外新版的範本已經完全把資料分開,所以有些HTML語法不能使用,例如 a href=... 可能要寫成 a expr:href=...,而且後面要用變數,所以以前習慣把一些連結放在範本的壞習慣可以全部不用了。

我最喜歡 HTML/Javascript 這個 widget,雖然用預設的 Layout 編輯器很死,有些地方不能放資料,但是透過編寫範本的模式倒是可以要把 widget 放哪就放哪,只要符合 XML 以及 blogger 的語法即可。

2006/11/07

有關Web2.0 的 Mash up 方式


看來我很久沒在這裡發文,最近在部落格崁入了一些東西,我就這部份應用的方式範例貼出來。

1. embed 方式的崁入(Google Video)

<embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=-5446541868363512925&hl=en" flashvars=""></embed>



2. iframe 崁入模式(Google Calendar)
<iframe SCROLLING=NO src="http://www.google.com/calendar/embed?src=mpmigkt2int30a57lakat0dn10%40group.calendar.google.com&chrome=NONE&height=210&epr=1&wkst=1&bgcolor=%23EEEEEE" width="260" frameborder="0" height="230"></iframe>



3. iframe 崁入模式(Google Picasaweb 的 slide show)
<iframe src="http://picasaweb.google.com/writers.idv.tw/200602/photo#s4982984271529508882" width=512 height=512 frameborder=0></iframe>



4. iframe 崁入模式(Google Map)
<iframe src="http://tripmap.blogspot.com/?x=12.3313&y=45.4363&z=4&" width=512 height=512 frameborder=0></iframe>



PS. 以上的 2.3.4. 可以做到隨時偵測網頁的大小變化,不會出現 scrollbar 有興趣的可以研究一下原理

5. script 崁入模式(拿 blogger 當成 script 元件來玩)
<script>var r_tag='威尼斯'; var r_num=999;</script><script src="http://tripwriterjs.blogspot.com/"></script>



6. script 崁入模式
<script type="text/javascript" src="http://www.hemidemi.com/digest/group/yuyen/bookmark/recent"></script>



7. img 圖片崁入模式(計數器大部分是用這種模式)
<img src=http://yamstock.megatime.com.tw:8080/asp/mcs/ws.asp?w=700&h=333&fmt=png&rt=on&min=1&mode=detail&id=1000&style=totalmean&dot=2>

2006/09/05

有關 Blogger in Beta


2006/9/28 第一次更新

Blogger in Beta 公佈已經一個月左右,看來 Bug 不少,剛開始對中文的支援也怪怪的。不過,這兩天測試,似乎情況不壞,我有興趣的還是 Template 的編修,這次 google 在語法上做了非常大的改變。

1.
若要看白老鼠的測試過程,可以請大家按下面這個連結,大家應該馬上就發現了,有了分類的功能。
http://swalk.blogspot.com/search/label/白老鼠之歌

2.
若要知道如何加入最新迴響,那就點下去下面這個連結,應該馬上就知道,blogger beta 終於把最新迴響弄成 site feed 的其中一項功能了,不過目前還有些Bug。
http://beta.blogger.com/feeds/9410513/comments/full
也可以用自己的網址
http://swalk.blogspot.com/feeds/comments/full
後面的 full 可以改 summary

3.
另外眼尖的使用者應該可以發現,每篇內文中,已經有 Newer Post 跟 Older Post,就是上一篇和下一篇的連結,這個對我了解一個陌生的部落格有很大的幫助。

4.
有關使用介面,我不打算詳述,請大家自行上去玩玩,應該蠻容易上手的

5.
我自己所需要的一個功能,目前我還找不到解決方法,所以還不打算換版,就是自己定義的某一個Label,來抓取這類文章的 RSS 功能,因為會用自己以前寫的文章連結抓出來整合在一篇新的文章中,若有這個功能,才算是完整的BSP,而這功能在各個BSP也是基本的功能吧!
(2006/9/28更新)
我找到方法了,網址如下:
http://swalk.blogspot.com/feeds/posts/summary/-/Murmur/
也可以找兩個 Labels 的交集:
http://swalk.blogspot.com/feeds/posts/summary/-/Murmur/collaborate/
(2006.12.23 更新)


6.
稍微研究了一下 Template 的寫法,主要可程式化及變數化的項目主要有下列方式
 <b:section></b:section>
 <b:widget></b:widget>
 <b:if cond><b:else/></b:if>
 <b:include></b:include>
 <b:loop></b:loop>
 
 <data:> (表示資料變數)

7.
有關內文太長的時候,通常我們都要在多個"繼續讀完......"的連結,這部分我就牛刀小試一下,貼內文的時候,把不想在首頁出現的內文用 <span class=fullpost></span> 這個語法加入,然後在 template 內找到

<p><data:post.body/></p>

這段程式碼,然後用以下這段程式碼取代就好了
<b:if cond='data:blog.pageType == "item"'>
<style>.fullpost{display:inline;}</style>
<p><data:post.body/></p>
<b:else/>
<style>.fullpost{display:none;}</style>
<p><data:post.body/>
<br></br>
<b:if cond='data:post.url'>
<a expr:href='data:post.url'>More......</a>
<b:else/>
<data:post.title/>
</b:if>
</p>
</b:if>

2006/07/19

要知道最新迴響的一堆方法
分類:部落格


http://blogfresh.blogspot.com/2006/07/sidebar-comments-and-hearsay.html

英文還蠻容易閱讀的。

2006/07/11

AJAX 與 img refer 在分類上的應用
分類:部落格


http://da.vidnicholson.com/2006/07/very-easy-blogger-categories.html

很有趣的應用。

2006/06/08

Google MAP API V2.0 的應用


最近很紅的 WEB 2.0 服務,儘管定義很不明確,我想 Google MAP 的技術應用絕對是符合WEB 2.0 的精神,

因為 API 1.0 升級到 2.0 的程式碼變小了,可是效能卻好像變差了,或者是我的紅色景點變的很多,所以移動地圖效率變差,利用 Timer 來移除不在地圖上的景點來增加效能。

其他的使用說明跟第一版並無差別,所以若要看懂,請看一下第一版的文章(注意不要再用舊版的範本),網址如下:

http://nextservices.blogspot.com/2006/01/bloggervi.html

2.0版本範本下載點:tripmap.txt(按滑鼠右鍵另存目標)

2006/04/30

Blogger分類及最新迴響範本公開(黑底白字版)


由於實在太多人來跟我要範本了,我要 email 給大家很麻煩,之前幫人家套上範本我自己也沒有時間幫大家套,而且套上後也不一定喜歡我的編排方式,所以我把範本連結貼在下方,有興趣的可以自行下載回去研究。

注意範本貼上之後在控制主頁→設定→格式把文章數目調整為999篇文章即可,當然原來的範本請各位一定要備份起來。

之前比較長串的原理說明在以下網址:
http://nextservices.blogspot.com/2005/05/bloggercom.html

2006/6/4 的下載版本:黑底白字版本(按滑鼠右鍵另存目標)

2008/7 更新:這是舊版 blogger.com 的範本,新版已經內建很多功能,不建議大家使用。

2006/01/18

Blogger功能再加強(VI):標示地圖位置的部落格
分類:部落格、網路


Google Maps 的 SDK出來大概快一年了,很想用他們寫好的元件來應用,一直忙碌,最近才把這個應用化作實際的應用。

http://tripmap.blogspot.com
http://tripwriter.blogspot.com/2005/12/blog-post_19.html

可以先點看以上的例子,改變一下瀏覽器的視窗大小,然後壓住滑鼠拖曳地圖,雙擊某個地點會移動到中心點,或是點一下小紅點會出現一個小的提示視窗,中間要克服的小問題還不少,我先表列在下方所需要了解的知識,然後再說明一下會出現的困難,其實,很多事情要做過後才知道困難在哪裡,光用想的也想不周全。

為什麼要做這個,除了"爽"之外,我想應用的範圍可以在旅行、美食、生態保育、交通、公共安全等等,可以用的地方太多了,我就把這個範本分享給大家,若要使用請來此留言一聲,不要應用在非法的地方就好。

必須先了解的技術:

1. HTML/CSS
2. Javascript 以及事件的 callback 方式
3. Blogger.com 的範本運作結構
4. Google Maps 網站的申請 http://www.google.com/apis/maps/signup.html
5. 基本的英文閱讀能力

先把範本貼在這裡,然後我用很簡單的方式說明,如果看不懂的話,請大家留言討論。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<$BlogMetaData$>
<blogger><ItemPage><meta http-equiv="refresh" content="0;URL=<BlogItemURL><$BlogItemURL$></BlogItemURL>"></ItemPage></blogger>
<style type="text/css">
#b-navbar { height:0px; visibility:hidden; display:none}
</style>
<script src="http://maps.google.com/maps?file=api&v=1&key=ABQIAAAAwWJEqqG6jAyc8JO525fkAhRJdXEFphur6YpSasUgXTLfk7-jChQNO-51KIyTPcmUrBAPXsEG_-i9-Q" type="text/javascript"></script>

<title><$BlogPageTitle$></title>
<style type="text/css">
.title
{
width:260px;
font:100%/1.3em "標楷體","Trebuchet MS";
color:#333;
}
.title h6 { display:none; }
.title a { text-decoration:none; color:#222; }
.title a:hover { color:#000; }
.summary
{
color:#343;
width:260px;
font:80%/1.1em "Trebuchet MS",Trebuchet;
}
</style>
</head>
<body onresize="resizeMap()">
<div id="map" style="width: 100%; height:512px"></div>
<script type="text/javascript">
function e(id)
{
return document.getElementById(id);
}
function getWindowHeight()
{
if (window.self && self.innerHeight)
{
return self.innerHeight;
}
if (document.documentElement && document.documentElement.clientHeight)
{
return document.documentElement.clientHeight;
}
return 0;
}
function resizeMap()
{
var offset = 0;
for (var elem = e("map"); elem != null; elem = elem.offsetParent)
{offset += elem.offsetTop;}
var windowHeight = getWindowHeight();
var height = windowHeight - offset;
if (height >= 0)
{
e("map").style.height = height + "px";
map.onResize();
}
}
function a_round(xx)
{
return Math.round(xx*10000)/10000;
}
function a_showPoint(overlay, point)
{
if (point)
{
var center = map.getCenterLatLng();
var zooml= map.getZoomLevel();
var szStr = '中心點:X=' + a_round(center.x) + ',Y=' + a_round(center.y) + ',Z=' + zooml +',滑鼠點:X=' + a_round(point.x) +',Y=' + a_round(point.y);
var szStrXY= '",' + a_round(point.x) + ',' + a_round(point.y);
window.status = szStr;
if (window.clipboardData)
{
window.clipboardData.setData("Text", szStrXY);
}
}
}
function a_getURLtag(szParamName)
{
var szURL = window.location.href.toString();
var iTag = szURL.indexOf(szParamName);
if (-1==iTag)
return '';
var iTag2=szURL.indexOf('&',iTag+2);
if (iTag2 == -1)
return '';
return decodeURI(szURL.substring(iTag+2,iTag2));
}

var icon = new GIcon();
icon.image = "http://labs.google.com/ridefinder/images/mm_20_red.png";
icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
icon.iconSize = new GSize(12, 20);
icon.shadowSize = new GSize(22, 20);
icon.iconAnchor = new GPoint(6, 20);
icon.infoWindowAnchor = new GPoint(5, 1);
var map = new GMap(document.getElementById("map"));
map.addControl(new GLargeMapControl());
map.addControl(new GMapTypeControl());
var X=parseFloat(a_getURLtag('x='));
var Y=parseFloat(a_getURLtag('y='));
var Z=parseInt(a_getURLtag('z='));
if (isNaN(Y)){ X=0; Y=30;}
if (isNaN(Z)) Z=15;
map.centerAndZoom(new GPoint(X,Y), Z);
map.setMapType(G_SATELLITE_TYPE);
GEvent.addListener(map, 'click', a_showPoint);
resizeMap();
function createMarker(szTitle,szLink,x,y,szContent)
{
var marker = new GMarker(new GPoint(x,y), icon);
var szText = '<div class=title><a href=' + szLink + ' target=_blank>' + szTitle + '</a></div><div class=summary>' + szContent + '</div>';
GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(szText);});
map.addOverlay(marker);
}
<Blogger>
<MainPage>createMarker("<$BlogItemTitle$>",<BlogItemURL><$BlogItemURL$></BlogItemURL>,"<$BlogItemBody$>");</MainPage>
</Blogger>
</script>
</body>
</html>


把 xxx.blogspot.com 最上方的 NavBar 拿掉:為什麼要拿掉這個東西呢?因為我的應用是想在原來的部落格採用<IFRAME>的方式含入,有了那個 NavBar 在動態大小的時候會不漂亮,這個的關鍵是 #b-navbar 這個字眼,請大家自行看上方的原始範本即可。

google maps SDK 只能在同一個網站路徑(PATH)下使用,所以想當然爾是利用<MainPage>來做,然後把一個小紅點當成一篇文章來規劃,所以要使用前請先註冊一個部落格的網址,有了網址之後再去 Google Maps 的網站申請一個 Key,注意上方範本紅字的部份,更新那段程式碼即可。

<div> 這個 HTML 語法有支援寬度的 100%,也就是視窗改變大小的時候會隨著改變,但是高度就沒有了支援了,所以利用 onResize 這個事件驅動,改變 div 的高度,但改變高度後注意要再通知 GMap 這個元件,不然雙擊滑鼠的位置時會對不到中間的位置。這樣有什麼好處呢?就是在 IFRAME 含入這個視窗的時候可以動態的指定大小,隨別人高興調整,填滿整個視窗。

若想設定起始的位置,可以用網址傳入,然後程式讀入後直接跳到該位置,關鍵點在 a_getURLtag 這個函式。

新增文章座標點要標示的位置我放在 link 那個欄位,算我偷懶,規格是
  "http://.......",x,y
記得要加半形的雙引號,可以在你要標示的位置點一下滑鼠,應該可以發現瀏覽器的statusbar 會顯示一串數字,這些就是座標,為了方便剪貼,我把點擊的座標會剪貼到剪貼簿裏面。

請要特別注意一點,就是標題、link還有內文,都不要有單引號、雙引號或是逗號這些符號,除了剛剛提的link 的規格外,因為這些都是用 Javascript 來套版形,有了這些符號就會誤判。當然標題依照我自己的慣例還是用<h6></h6>這個把分類標籤夾住,當然目前是沒有作用,等未來要拿來做分類的時候可以再寫程式補強。

而這個部落格的概念比較像網摘,是讓別的網站外掛進來的,並不是真的把文章放在這裡,所以之前 BlogThis! 的功能我還是放在這裡,請把下面這段 javascript程式碼放在我的最愛,或是連結工具列上,看到要標示地圖的網址,就點下 BlogThis!,然後配合顯示地圖的座標把X,Y值填上即可。

javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');d.location.href='http://new.blogger.com/blog_this.pyra?t='+encodeURIComponent(t)+'&u='+escape(d.location.href)+'&n='+encodeURIComponent(d.title);

記得要在這個新的網摘專用部落格做幾個設定

1.設定→基本→顯示您所有 Blog 的 [撰寫] 模式?→否
2.設定→格式→顯示→999篇文章
3.設定→格式→編碼→UTF-8
4.設定→格式→轉換斷行符號→否
5.設定→格式→顯示標題欄位→是
6.設定→格式→顯示連結欄位→是
7.設定→格式→啟用浮動對齊→否


這個範本還可以加強的還很多,例如可以做分類標籤來顯示紅點,標示旅館或是餐廳,或是店家等等。拿座標來計算,把這些紅點依照時間來連出線來,計算密度或是面積,總之,可以想出的東西還不少呢!

2005/12/11

Blogger.com 的範本討論區


若有 Blogger.com 的範本問題,HTML/CSS或者Javascript的相關問題,或者其他部落格問題,都可以在這裡討論。

2005/11/23

Blogger功能再加強(IV):單篇文章內的相關文章連結


這個功能一直想做很久了,文章越寫越多,分類越來越多,如果一篇文章可以找出關聯度最高的相關文章,那該有多好呢?先列出需求表吧!

1. 在單篇文章內列出站內的相關文章,要依照關聯度強弱排序。
2. 在單篇文章利用搜尋引擎的功能,列出站外關聯度最高的文章,不是逆向連結(backlink)。
3. 歷史上的今天,或是歷史上的最近幾天。
4. 在首頁可以做標題檢索或全文檢索。
5. 在首頁可以利用一些條件分類來選出相關文章。

一直沒有時間來完成,要提需求的人也可以在下面留言,先寫高興的。

2005/10/12

blogger.com 的反向連結功能
分類:部落格


這個部落格平台又多了一個功能,就是反向連結(Back Link),本來以為是提供 trackback 的機制,其實不然,只是利用 google 的搜尋功能,把別人有連結到你網頁的網站給搜尋出來。

功能說明:http://help.blogger.com/bin/answer.py?answer=1216

這個範本的語法跟留言回覆的有點像,可是作法不太相同,我有點懷疑成效如何,而且萬一一大堆人加入了這個功能,google 的伺服器是否可以承受的了?

他的作法是利用 javascript 去背後作搜尋,搜尋的語法大抵是用 link:URL單篇文章的網址,然後搜尋出來後利用 DHTML 的方式配合 javascript 程式把結果塞回原來顯示的網頁中。

我已經在另外一個部落格加入這個功能,blogger.com也宣稱需要點時間才會同步這個結果,有興趣的可以點這個網址

http://tripwriter.blogspot.com/2005/10/blog-post_06.html

過去看看結果吧!

目前的測試結果還不錯,google 真的還蠻神的,只要有固定的單篇網址就可以搜尋的到。使用 Big5 的字碼的人可能要說抱歉了,他們的javascript程式沒有寫好,因為含入的 js 程式是 UTF-8 的字碼,如果設定為big5字碼,會有 javascript 的錯誤出現。

2005/08/21

網摘工具比較
分類:部落格、網路


最近因為部落格的熱門發展,連帶著網摘工具也隨之重要起來。網摘就是一種公共的Bookmark,以技術角度來講,只是把URL及標題還有意見(評論?)及部分重要內容記錄起來。

雖然以上這個定義非常的容易了解,但是做起來卻是困難,尤其是要配合瀏覽器要操作容易,又要能跟部落格整合,又要能公開API或是RSS規格等,其實,中間的運作是很複雜的。

我試著只選 http://furl.net 及 http://del.icio.us 這兩個網路服務來做比較,先做個比較表,再詳細列出其中的優劣。

***** furl/delicious
操作親和性    ◎
多標籤設定 ◎  ◎
多標籤搜尋    ◎
全文搜尋  ◎  ◎
評比工具  ◎
RSS輸出 ◎  ◎
RSS輸入 ◎
JS 輸出 ◎  ◎
API介面    ◎
每日自動發行   ◎(只有MT)

上上個月我自己開始做網摘以來,del.icio.us 還沒有開放 javascript 含入部落格的工具,當時只能用 RSS輸出的規格再出然後做出 javascipt放在部落格內顯示給其他網友看,資料轉兩手導致有時因為網路連線斷線的不確定因素,不是太慢顯示,就是資料出不來,而且 del.icio.us 的 RSS 輸出有項目的限制,這樣來做網摘並不合適,不知道什麼時候開始delicious 也有了 javascript 輸出服務,http://del.icio.us/feeds/js 顯然比 furl 有彈性的多。

操作親和性來講,其實第一眼會覺得 furl 比較像是一般標準的視窗程式操作,就是上面有一層一層的功能表,然後選好了功能表,後續就會有相對的 UI 介面來操作或者是設定,但是 delicious 比較不一樣,他完全是使用目錄的概念,所以搜尋的時候只要 URL 打對了,其實相對應的網摘就出現,而列在右邊的 tag 也用 client 端 javascript 的模式來選擇,所以剛上手需要點時間來習慣,但是一上手後的操作非常簡便與快速,要網摘一篇文章或是一個 URL 比 furl 的選擇方式要快速的多。

多標籤設定的這項功能來說,雖然兩項服務都有,可是在操作上以 delicious 比較方便,而 furl 雖然有,可是要按住鍵盤的 Crtl 鍵,然後用滑鼠點選,雖然不容易出錯,可是通常我們設定的 topics 很長,很難找到要點選的項目,雖然可以用建入的方式,不同主題用分號(;)隔開即可,但是還是以 delicious 比較方便。想不透為什麼 furl 不做一個 javascript 的點選模式方便操作呢?

至於多標簽搜尋,delicious 可以用加號(+)的方式把搜尋自設的 tag,但是 furl 就不能了,怎樣玩都只是單一的 topic。其他有關比較表中的一些RSS規格輸出輸入等等,我就不再詳述了。

每日自動發行到部落格這個功能我測試過 blogger.com 的平台是不行的,或許我還沒有看清楚規格的說明, 或者是哪裡沒有設定好!希望知道的人能夠教一下我。聽說 MT 的平台是可以的,可是目前好像還沒有人用這種方式來發行網摘。

其實拿這兩個網路服務來做比較並不是很合適,兩種服務都各有定位,以 delicious 來說,如果要查找大家的 tag 然後來搜尋所要的資料,其實是比較方便快速的,但是如果你有自己的部落格,只是要在自己的部落格來做網摘的話,furl 其實是比較活用的,他的評比工具比較齊全,目前,我就是選擇用 furl。

我們是不是經常會陷入一種迷思,功能越多越好,但是其實並不一定是對的?GMail Talk 出來了,大家也都有一堆希望表列,希望跟 blogger.com 整合之類的,但是我覺得目前 Picasa+Hello+Blogger 的整合不錯,再整合其他的系統服務有多少人會用,值不值得花上系統過大,維護不容易的成本?

另外 furl it 的 no-popup 加到我的最愛的版本中文會變成亂碼的問題,雖然MAX 已經發 mail 去跟 furl 的人講,可是我發現都沒有修改好,所以我就自己改了,若是大家有使用 Furl It Complete No-popup 的版本,可以把下面這段碼複製到我的最愛Bookmark的連結內容即可。

javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');d.location.href='http://www.furl.net/storeIt.jsp?p=1&t='+encodeURIComponent(d.title)+'&u='+escape(d.location.href)+'&r='+escape(d.referrer)+'&c='+encodeURIComponent(t);

要感謝在下面迴響留言的人,這篇文章是大家一起完成的。(完)

2005/07/01

免費協助 Blogger.com 置入版型範本


目前我用 Javascript 製作的版型範本有三套,暫時還沒有力氣弄出比較炫的版本,看起來都是比較簡單素雅的。
1. 白底黑字文字典雅型 http://nextservices.blogspot.com (就是本站)
2. 黑底白字突顯照片型 http://tripwriter.blogspot.com
3. 討論區 http://newsfamily.blogspot.com

如果有網友需要可以直接留下你的 email addr. 在下方迴響,我會把三個版型範本回寄給你,注意的是範本全部貼上之後在控制主頁→設定→格式把文章數目調整為999篇文章即可,當然原來的範本請各位一定要備份起來。

或者,我也可以幫忙協助大家放上去,只要你在控制台主頁→設定→會員邀請我(nextservices@gmail.com)加入你的部落格共筆寫作,並把我升級成Admin,這樣我就可以幫忙改你的範本了,我發誓我不會修改到原來的文章,等修改好之後,我會把我的權限自行剔除,後續的範本維護就自己來完成了。

目前已經有好多網站成功的使用我寫的範本,多了分類標籤及最新迴響的功能,就我知道的我列在下方:


  1. 陳謙天下
  2. 220天的完美旅程
  3. 碧溪筆記
  4. Princess Lea
  5. TRIP WRITER
  6. YIKUANG'S BLOG
  7. 貝氏奢華
  8. Somewhere in Time
  9. 人行道 Side Way
  10. 夏諾瓦的酒館
  11. Flora's Chamber--陳小芙的家
  12. Island Republic
  13. 阿雍的鹿特丹廣播電台
  14. Complicated Lif3
  15. 書本-電影-音樂
  16. 形意论谈
  17. JONAH←這個人改的很有特色
  18. 就祇是日誌


大家趕快搬來這裡吧!真的不錯。

2008.7 更新!!!由於這個範本已經很舊了,目前 blogger.com 也出了新版,範本恐怕不適用,所以暫停幫大家修改與置入範本。

2005/05/28

Blogger功能再加強(III):如果看 blog 像在用檔案總管
分類:網路、部落格




當我看了zeelot 的版型,有點驚訝,是不是被轉址到google 的搜尋頁面,結果原來只是版型的修改, zeelot 跟我講了一個網址,有很多 blogger 的版型。

基本上,現今各大網站的部落格都提供很多以 CSS 為主修改版型的辦法,也有很多人自己修改分享給大家使用,但是,我似乎找不到以修改Javascript程式為主的版型設計網站。

目前,完成了兩個版型範本,一個是《討論區》,另一個是做出《分類標籤》及《最新回覆》的功能,都有實際在運作,這兩天,我又想到了一個應用,比較結合復古設計與實用性的考量,先把概念寫下來,希望我有時間完成。

我的概念是左方用 TreeList 來做分類表,TreeList用分類標籤及時間排列,加上一個 inputbox 讓使用者可以作全文檢索(跟Windows內建的搜尋功能相仿),右方用 ListView 來顯示每篇文章的標題、時間、迴響、最新迴響時間等等,可以按下 ListView 的 Header 來做排序的功能,而右下方的位置就留給顯示HTML內頁來用了。

其實目前網站瀏覽最大的問題是每按一個連結就要到網站去拉一下資料,我上面這個概念大部分的動作不需要到網站去拉資料,而是資料已經拉到 Client 端,只是作好排序及搜尋顯示的工作,當然只有全文檢索這個功能需要去網站下載所有的資料。

昨晚實驗了一下 Javascript 應用 ActiveX 的元件,技術上是可以達成的目標。

1. 部落格的討論區應用:
http://newsfamily.blogspot.com

2. 部落格有分類標籤及最新回覆應用:
http://tripwriter.blogspot.com

3. 部落格就是一個檔案總管:
還在規劃中......