沒穿方服

索引

顯示╱隱藏內文
Chrome, telnet 網址也有圖示。

網站加入書籤會有 favicon,不過 bookmarklet(網址為 javascript: 開頭)或本地端檔案(網址為 file: 開頭)沒那好處,只能顯示預設的圖了。

修改辦法是靠 userChrome.css,搜尋發現相關的碼隨 Firefox 版本偶有變動,以下為 Fx 3.5.3 適用規則:

.bookmark-item[scheme="javascript"] {list-style-image:url("http://userscripts.org/images/script_icon.png") !important;}
.bookmark-item[scheme="file"] {list-style-image:url("http://127.0.0.1/favicon_green.ico") !important;}
.bookmark-item[scheme="chrome"] {list-style-image:url("http://www.spreadfirefox.com/sites/all/themes/sfxBB/img/favicon.png") !important;}
.bookmark-item[scheme="telnet"] {list-style-image:url("http://pcman.openfoundry.org/favicon.ico") !important;}

其中圖示是按 scheme 分辨,例如第四行會對應 telnet://ptt.cc 而跑出 PCMan 的圖(直連人家網站,僅為示範用啊)。

原版如前文,縮小的感覺真好,如今再改得稍微親切一點: 1)不在 chrome url 的話會提示, 2)顯示 sqlite 檔案前後大小。

若不在 chrome url 內,會提示你問題。 指定次數。 現在會算出檔案大小了。 動手前,還是要問一下。 縮減比率,看了開心。

將 bookmarklet 加入書籤 → Places Cleaner


原始碼拆開如下:

// 原創想法&程式碼來自 Irvin Chen 的 PlacesCleaner 收藏庫清潔工
// https://addons.mozilla.org/firefox/addon/13860/  (以 MPL 1.1 釋出)
// http://irvin.sto.tw/2009/08/firefox-3.html
// 請於 chrome url (例: chrome://browser/content/places/places.xul ) 中執行
var PlacesCleaner = {

clean: function(){

  // 測試是否有 XPConnect 權限
  if( ! netscape.security.PrivilegeManager.isPrivilegeEnabled('UniversalXPConnect') ) {
    alert('操作失敗:\n請於 chrome url 中執行這支 bookmarklet。\n例: chrome://browser/content/places/places.xul');
    return;
  }

  var PIPlacesDatabase = Components.classes["@mozilla.org/browser/nav-history-service;1"].getService(Components.interfaces.nsPIPlacesDatabase).DBConnection;
  var ProfD = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile);
  var sqliteFile = ProfD.clone();
      sqliteFile.append("places.sqlite");
  var originalSize = sqliteFile.fileSize;

  var intViewTime = parseInt(prompt('清除瀏覽次數不超過「幾次」的歷史紀錄?'),10);
  if(intViewTime+''=='NaN') { alert('輸入值非數字,已停止操作。'); return; }

  if(confirm('目前 places.sqlite 檔案大小為 ' + Math.round(originalSize/10.24)/100 + ' KB。\n若要備份,請選擇儲存檔案的位置:')) {
    var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker);
    fp.init(window, null, fp.modeSave);
    fp.defaultString='places';
    fp.defaultExtension='sqlite';
    fp.appendFilter(".sqlite","*.sqlite");
    if (fp.show() != fp.returnCancel) {
      if (fp.file.exists()) fp.file.remove(true);

      try {
        sqliteFile.copyTo( fp.file.parent, fp.file.leafName );
      }
      catch(e) {
        alert('操作失敗:無法儲存備份檔案。');
        return;
      }
    }
  }

  if(!confirm('確定要開始清除了嗎?\n也許會花上一點時間……')) return;
  try {
    // 取自 https://addons.mozilla.org/firefox/addon/13860/  原始碼授權條款: MPL 1.1
    PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_historyvisits WHERE place_id IN (SELECT id FROM moz_places WHERE visit_count <=" + intViewTime + ");");
    PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_places WHERE (visit_count <=" + intViewTime + " AND hidden <> 1 AND id NOT IN (SELECT place_id FROM moz_annos UNION SELECT fk FROM moz_bookmarks));");
    PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_inputhistory WHERE place_id NOT IN (SELECT id FROM moz_places);");
    PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_favicons WHERE id NOT IN (SELECT favicon_id FROM moz_places);");
    PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_annos WHERE anno_attribute_id IN (SELECT id FROM moz_anno_attributes WHERE name = 'google-toolbar/thumbnail-score' OR name = 'google-toolbar/thumbnail');");
    PIPlacesDatabase.executeSimpleSQL("VACUUM");
  }
  catch(e) {
    alert('操作失敗:清除中出了狀況……');
    alert('Places Cleaner bookmarklet 錯誤訊息:\n '+e);
    return;
  }

  // 重新取得 fileSize
  sqliteFile = ProfD.clone();
  sqliteFile.append("places.sqlite");

  var ratio = Math.round( (originalSize-sqliteFile.fileSize)*10000/originalSize )/100;
  alert('清除完畢。\n\n檔案大小:' + Math.round(originalSize/10.24)/100 + ' KB → ' + Math.round(sqliteFile.fileSize/10.24)/100 + ' KB(已縮減 ' + ratio  + ' %)');

}

};

PlacesCleaner.clean();

2009-10-14: 稍作修改,新版比較親切好用,請參考 PlacesCleaner bookmarklet (更新)

原創想法&程式碼取自 Irvin Chen 的貢獻,詳見:

這支 bookmarklet 會跑原文所述的幾行 SQL,可指定刪除瀏覽次數(不超過)多少的紀錄,且刪除前可備份 places.sqlite。
※請於 Chrome URL 中執行(例: chrome://browser/content/places/places.xul )否則沒效。

將 bookmarklet 加入書籤 → Places Cleaner


原始碼拆開如下:

// 原創想法&程式碼來自 Irvin Chen 的 PlacesCleaner 收藏庫清潔工
// https://addons.mozilla.org/firefox/addon/13860/  (以 MPL 1.1 釋出)
// http://irvin.sto.tw/2009/08/firefox-3.html
// 請於 chrome url (例: chrome://browser/content/places/places.xul ) 中執行
var PlacesCleaner = {

clean: function(){

  var PIPlacesDatabase = Components.classes["@mozilla.org/browser/nav-history-service;1"].getService(Components.interfaces.nsPIPlacesDatabase).DBConnection;
  var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker);
  
  var intViewTime = parseInt(prompt('清除瀏覽次數不超過「幾次」的歷史紀錄?'),10);
  if(intViewTime+''=='NaN') { alert('輸入值非數字,已停止操作。'); return; }

  if(confirm('若要備份 places.sqlite,請選擇儲存檔案的位置:')) {
    fp.init(window, null, fp.modeSave);
    fp.defaultString='places';
    fp.defaultExtension='sqlite';
    fp.appendFilter(".sqlite","*.sqlite");
    if (fp.show() != fp.returnCancel) {
      if (fp.file.exists()) fp.file.remove(true);
      var oldFile = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile);
      oldFile = oldFile.clone();
      oldFile.append("places.sqlite");
      try {
        oldFile.copyTo( fp.file.parent, fp.file.leafName );
      }
      catch(e) {
        alert('操作失敗:無法儲存備份檔案。');
        return;
      }
    }
  }
  
  if(!confirm('確定要開始清除了嗎?\n也許會花上一點時間……')) return;
  try {
    // 取自 https://addons.mozilla.org/firefox/addon/13860/  原始碼授權條款: MPL 1.1
    PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_historyvisits WHERE place_id IN (SELECT id FROM moz_places WHERE visit_count <=" + intViewTime + ");");
    PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_places WHERE (visit_count <=" + intViewTime + " AND hidden <> 1 AND id NOT IN (SELECT place_id FROM moz_annos UNION SELECT fk FROM moz_bookmarks));");
    PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_inputhistory WHERE place_id NOT IN (SELECT id FROM moz_places);");
    PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_favicons WHERE id NOT IN (SELECT favicon_id FROM moz_places);");
    PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_annos WHERE anno_attribute_id IN (SELECT id FROM moz_anno_attributes WHERE name = 'google-toolbar/thumbnail-score' OR name = 'google-toolbar/thumbnail');");
    PIPlacesDatabase.executeSimpleSQL("VACUUM");
  }
  catch(e) {
    alert('操作失敗:清除中出了狀況……');
    alert('Places Cleaner bookmarklet 錯誤訊息:\n '+e);
    return;
  }
  alert('清除完畢。');

}

};

PlacesCleaner.clean();

奧特曼音樂怎麼這麼照顧我們一小撮人,不計血本把灣區鞭金大老 EXODUS 請來臺灣,世界重量的團在 The Wall 小場開唱,為甚麼有這麼好的事?消息一出便立刻懷著感激心情訂票!(可惜主辦還是虧了)

當晚人不多(據說 200↑)本來擔心擠不到前頭,根本多慮了。等暖場團()開唱還能從容走進第二排……之前聽他們 EP 覺得很甜很悅耳(無貶意),這邊就用微笑點頭支持一下。

8 點多終於換 Exodus,調音試了好一陣子,光是隔著布幕噴出樂器聲音聽起來就是啊!這時台下金屬頭就抵不住身體本能開始湧進戰區,幾經等待那討厭的背景音樂終於停下,布幕拉開,體型像地獄卡車手的主唱 Rob Dukes 亮出我們國旗接受歡呼、一開始就指指點點教唆大家衝撞;而樂團靈魂人物、吉他手 Gary Holt 就站在我面前!

寫這文章時已經搜得到影片了,YouTube - Exodus Taipei

接下來兩小時就是甩頭、踏跳、舉手、撞四周的人還有被撞,坑裡都是來路不明的汗水,謝天謝地我的嗅覺好像自動停用,反而把台湾啤酒的味兒(臺上開了幾罐)傳進腦裡狠狠記住。

不知是主辦接待得好,還是北京行程取消的緣故,感覺 Exodus 五位大叔心情挺好。主唱沒忘記呸口水鼻涕的骯髒勾當、錄 DVD,大夥兒起鬨他也背上吉他來段 solo,對了這傢伙甩起頭來還特有喜感;樣子優雅的 bass 手用護腕跟高中小弟換了制服穿,並驕傲展示學號;中途發生的短暫跳電意外,不但沒破壞演出,還拗到 drum solo…… 整場互動可說是有情有義,盡興十足。

而最激烈的部分要從安可算起,開頭就上 Bonded by Blood,眾人趕緊拼了命 MOSH!我也被擠上第一排背後,手都罷不下,不過這位置挺安全的,享受陣陣撲浪,又可專心觀演。

這時 Rob 卯起來要所有人進去 circle pit(一鍋人繞圈圈像漩渦的衝撞)不過外圍可能難加入所以頻頻 NG,音樂暫停再下、再 circle,幾次下來我想再搞我就招架不住了,裡面一團亂誰知多少人,不會真要全場下海吧~ 而且這安可真長,唱 Strike of the Beast 時我已經缺氧想吐,只好躲到右後方喘氣,正茫茫想著撐不到最後時,演唱結束,我也跟著大夥舉起雙手吶喊。總算是見證了 Exodus 痛快現場。

Rob “One?” 再加一首?太幸運了我剛好復活啊!


儘管演出已從 90 分鐘加到 120 分,奧特曼與 Exodus 仍決定不取消簽名會,如此慈善一定要再次強調感謝。總之這晚樂迷實在幸福,看了別人心得,總歸也就一個字,確實啊~強過我寫一堆廢話。

最愛的這張 Tempo of the Damned 唱了好幾條。 粉絲與 Gary 合照,感謝好心學生幫拍。

(電梯向下)動畫版還可以聽到跑步蹦蹦蹦的聲音

晨星出版的艾洛思(ELOISE)中文版 全套 5 冊特價 599,前天訂算我 400 元,不知道怎麼算的。

(內頁一角)

在電視上看到製作細膩大膽(手繪、爵士配樂等全面㊣童叟無欺㊣用心製作)的艾洛思動畫版,以為原著也是精裝繪本,豈不太便宜了?後來才知道是用色很少的那種插畫,有點意外,但也顯得份量豐富。

這套內容應該就是原始版本,而且是 ELOISE 50 週年紀念版 時發行的(艾洛思 1955 年 11 月誕生,中文版則是 2006 的事了),第一冊『我就是愛洛思』特別附錄 ELOISE Scrap Book(艾洛思的剪剪貼貼)收藏艾洛思的真相和八卦——粉絲或我這樣一知半解的人應該相當有興趣。

中文封面。那條橫幅是印刷,不能拆下來

不過多數人其實不曉得艾洛思是誰,書商用的「搗蛋鬼」「古怪少女」感覺也是畫蛇添足偏負面的說法,不如讓她親述「我是艾洛思,今年六歲」才是保證正確,所以我也不必報她資料了,除了一點艾洛思是我新的卡通偶像比較少人知道吧。