沒穿方服

索引

顯示╱隱藏內文

MooTools 備有不少 plugin 在所謂 MooTools More,官網亦提供 More Builder 方便自訂下載。

不過若要下載 1)整套 More 所有元件,或 2)最新開發版本 有沒有簡單辦法呢?

寫這篇時才發現,原來 download 頁就有「Edge Build」可以抓最新 core build ,把網址 core 換成 more 應該就是最新的 More 了(其實也不確定,沒看到說明)

似乎已解決,只好把本文放分隔線後面……


另一個作法是到 More 的 GitHub Repository 把檔案複製下來,裡面就有 build.rb,會把各元件的原始碼合併起成一份 .js(預設包含 Core + More),附帶好處是要包哪些東西可以寫設定檔存起來。

記具體過程:

  1. cd some_directory
  2. git clone git://github.com/mootools/mootools-more.git
    cd mootools-more
  3. 這裡 Core 是以 submodule 方式管理,也要更新一下:
    git submodule init
    git submodule update
  4. 有興趣的話,看看 build.yml 的設定:
    • dependency_paths - 用來尋找相依檔案的路徑,預設為 Core 和 More 的 Source 目錄
    • build_path - 最後輸出的檔名
    • dependency_file -(原檔案中沒有這個項目)預設是 scripts.json,即每個 dependency_paths 下的 scripts.json 檔;內容描述具體會用到的檔案,以及各檔案的相依性
  5. 若想定義要排除哪些檔案,可以把每個 scripts.json 複製一份,改成自己的設定。
    當然 build.yml 裡的 dependency_file 也要跟著改名。
  6. 不確定是我的問題還是怎樣,開動前要修改一下 build.rb:
    1. def build
        @string ||= full_build
        @string.sub!('%build%', build_number)
        @string  # 加入這行才會傳回 @string,否則會輸出空檔案
      end
    2. builder = MooTools::Build.new({
        :dependency_paths => conf[:dependency_paths],
        :build_path => conf[:build_path],
        :dependency_file => conf[:dependency_file]   # 原本沒吃到這個設定
      })
  7. ruby build.rb

註:寫這文章的時候 Source/Native/URI.js 檔案編碼有問題,若輸出檔案不是 utf-8,可以檢查這個檔案。

也不必再打主控密碼了(輸入過的話)

這是 Firefox chrome url 用的 bookmarklet。

我註冊都沒在記密碼的。自動登入失靈的時候,只好打開 Firefox 的「已存密碼」然後找個地方(例如搜尋列)把密碼抄一遍,再複製、貼上表單登入。

要是哪天我被盜帳號,原因就是螢幕擷圖給別人,恰好密碼就在搜尋列吧。為甚麼這麼麻煩,都是「已存密碼」不能右鍵複製的緣故啊。

  1. 於是,把這支 bookmarklet 加入書籤 → 複製已存密碼(右鍵選單)
  2. 打開「已存密碼」(chrome://passwordmgr/content/passwordManager.xul)
  3. 點剛剛加入的書籤。
  4. 就可以開右鍵選單,複製或顯示密碼了。多選也有效。

原始碼拆開如下:

// 應於 chrome://passwordmgr/content/passwordManager.xul 執行
if( ! netscape.security.PrivilegeManager.isPrivilegeEnabled('UniversalXPConnect') || ! document.getElementById('signonsTree') ) {
 alert('操作失敗:\n\n請於下述 URL 執行這支 bookmarklet:\nchrome://passwordmgr/content/passwordManager.xul\n\n');
 return;
}

window.leqPasswordPicker = {

 clipboardHelper: Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper),

 init: function(){

   if( ! document.getElementById("leqPasswordPicker_menupopup") ) {

     var popupset = document.createElement("popupset");

       var menupopup = document.createElement("menupopup");
       menupopup.setAttribute('id', 'leqPasswordPicker_menupopup');

         var menuitem = document.createElement("menuitem");
         menuitem.setAttribute('oncommand', 'leqPasswordPicker.show();');
         menuitem.setAttribute('label', '顯示密碼');

         var menuitem2 = document.createElement("menuitem");
         menuitem2.setAttribute('oncommand', 'leqPasswordPicker.copy();');
         menuitem2.setAttribute('label', '複製密碼');

     menupopup.appendChild(menuitem);
     menupopup.appendChild(menuitem2);
     popupset.appendChild(menupopup);

     document.getElementById('signonsTree').getElementsByTagName('treechildren')[0].setAttribute('context', 'leqPasswordPicker_menupopup');
     document.getElementById('SignonViewerDialog').appendChild(popupset);
   }

 },

 show: function(){
   var selections = GetTreeSelections(signonsTree);
   if (selections.length > 0) {
     var txt = [];
     for (var s = 0 ; s < selections.length ; s++) {
       var i = selections[s];
       txt.push(
           '網 站:' + signonsTreeView.getCellText(i,signonsTree.columns[0])
         + '\n使用者:' + signonsTreeView.getCellText(i,signonsTree.columns[1])
         + '\n密 碼:\n\t' + signonsTreeView.getCellText(i,signonsTree.columns[2]) + '\n'
       );
     }
     alert( txt.join('\n') );
   }
 },

 copy: function(){
   var selections = GetTreeSelections(signonsTree);

   if (selections.length > 0) {
     var txt = [];
     for (var s = 0 ; s < selections.length ; s++) {
       var i = selections[s];
       txt.push( signonsTreeView.getCellText(i,signonsTree.columns[2]) );
     }
     this.clipboardHelper.copyString( txt.join('\n') );

     // 送一個 copy 事件,這段可以不用
     var evt = document.createEvent("HTMLEvents");
     evt.initEvent('copy', true, true);
     document.getElementById('signonsTree').getElementsByTagName('treechildren')[0].dispatchEvent(evt);
   }
 }

};

leqPasswordPicker.init();

這篇私人了。

一直願意上班,卻遲遲沒有行動的狀態怎麼改變的。

首先是一個不錯的工作機會(跟著人情一起)到來。
不是強迫、不是急就章的;就是有個職缺不錯,也還適合。

我有貢獻,可以得意地睡不著覺;沒有特別表現、仍受眷顧時,感到幸福,但是緊張。

於是主要契機可說是不好意思拒絕,覺得自己極可能去報到。

這樣近乎跳過了「求職」過程;
雖然能力所及當願做,但如果事情不是自找的,將來承受痛苦的能力恐怕要打折扣。

接著也許是次要動機:要報到的猶豫,比投履歷的猶豫更加猶豫……
一直打算找工作,現在讓我不用找工作,卻還是跟興趣靠不攏——好像說你時間都白費了。
實在不願這麼想,因為我過得還不錯。

再來很抱歉老提崔健,實在是 12/03 才遇上這事,就發現一首之前不曾注意的歌「投機份子」,在習慣多慮,卻必須切換成有機會、趕緊逮著的心態時,聽這歌詞真有無法壓抑的激動。後續也是帶著這份心情去面試,即使不算動機,也是很大的推力。

最後報告求職結果,幸福但緊張地,總算符合小小期望,在 12/25 以前上班了。
街坊聽了大概要搖頭,差點踩到退伍三年滿的達成線。

預設的按鈕外觀

小小東西放上 Google Code 有點抱歉。

試想一個 overflow-x 且高度很大的 box,想水平捲動,捲軸卻在畫面外(下方),怎麼辦?

hScrollBtns 在元素左右加上按鈕,用來操作水平捲動。這方法應該比 自動捲動 或 設法移動捲軸 容易接受。

詳細請至專案首頁 (Google Code) 參考,可支援 ie 6 不過 CSS 要改改。


Demo

$('#hScrollBtnsDemoBox').hScrollBtns({step:4, speed:6, safeHeight:300});

hScrollBtns Demo box:

box height:


醒獅睏寶圖(風獅爺睡覺)

醒獅睏寶圖(風獅爺睡覺)

(小時候畫的圖,放棄所有權利)

類似功能的 plugin,也許這才是你要的: HoverScroll jQuery PluginjQuery Smooth Div Scroll by Thomas Kahn

Legacy DM 一部分

上次崔健來台是 2007 海洋音樂祭,那時我剛迷上老崔,還不熟悉;現在每首深刻了,時間更加飛快。

唱到第二次安可我著實急了、喊啞了,再返場也沒幾首,花房姑娘那吉他就彈了下去…… 演完覺得太短,不夠滿足。


今晚聲音蠻大,配上老崔咬牙切齒的欠揍聲音,哈哈我超愛的。

印象最深的是寬容,聽到嘴角抽動淚汪汪;
還有上次沒演的撒點野假行僧,雖然沒古箏古琴,但比起 DVD 所見,效果讓人驚喜,1800 看這兩首也值得了。


setlist:

  1. 城市船夫 - 這開頭好。上次首曲是『飛了』,沒這首特異,顯得專場比較大膽安排
  2. 紅旗下的蛋
  3. 從頭再來 - 早期的歌有點太歡樂,好像唱遊課會玩的音樂,聽 89 的錄音也感嘆好天真啊
  4. 一無所有
  5. 寬容 - 發出奇怪的聲音,我眼淚都要掉下,跟後面有人偷笑形成對比
  6. 藍色骨頭 - 以下『給你一點顏色』三部曲,看完立刻增加身為一位樂迷的完成度
  7. 紅先生
  8. 迷失的季節
  9. 快讓我在這雪地上撒點兒野 - 我人在第二排,看不到後面是不是玩得比我顛,想在背後寫「撞我」
  10. 飛了 - 聽過 live 版後便一直期待這前奏
  11. 混子 - 海洋的時候我就驕傲地記住這一針見血的歌詞。這次沒介紹牛 B,反正湊合就那意思啦
  12. 假行僧 - 腦中疑似有古箏的聲音,這樣也很好
  13. 一塊紅布 -「因為我最知道你的痛苦」怎麼聽都肅然起敬
  14. 超越那一天 - 上次這首台下有雜音。這回老崔說他們是中國搖滾,我們才是臺灣搖滾,不曉得算溝通麼
  15. 解決(返場)- 這唸得還真是特別不清楚
  16. 新長征路上的搖滾 - 喔呵這回沒有叫大家玩蹲蹲了 ,不然還挺怕的
  17. 盒子(返場) - 造反聽啥都行,革命就聽老崔吧
  18. 花房姑娘

除了像一把刀子常演的沒演外,『時代的晚上』居然沒唱時代的晚上…… 我們應該至少再喊一輪安可才對。