好久沒寫新文章了,感覺跟之前的文有超大斷層...?
Wikiwand是個美化維基百科頁面的附加元件,安裝以後,瀏覽維基百科的條目就會被重新導向到重新排版過的頁面,更方便的目錄導覽、圖片以全版顯示等等,可以自訂字體、字型大小、頁寬、顏色(亮/暗)等等,甚是方便。
但是慣用繁體中文的使用者可能會對一點十分困擾,就是頁面預設往往不是繁體中文。對於這個問題有人已經回報過,但是這問題遲遲未被修正。因此我用GreaseMonkey(在Chrome上為TemperMonkey)寫了一小段JS code,可以有效率的自動將中文頁面自動重新導向成「繁體中文」,程式碼如下:
觀察維基百科的網址內部導向、再被Wikiwand導向的過程,依序是:
http://zh.wikipedia.org/zh-tw/玻璃
http://zh.wikipedia.org/wiki/玻璃
http://www.wikiwand.com/zh/玻璃
維基百科會用Cookies來記錄你使用的是「哪一種中文」,但Wikiwand不能存取這個資訊,只能單純從網址轉換,繁體中文資訊就這麼消失了。
幸好,Wikiwand的網址對應的維基百科網址似乎是類似的,因此只要補回語言資訊,便能正確存取繁體中文頁面。當然,"zh-tw"也可以視需要修改。
Andy's Blog~*
Flash CS3, Visual Basic 6/2010, Flex 3, 綜合 開發 玩樂 筆記
WELCOME
Move your mouse onto the image to see the bravo CSS3 Transition!
2015年4月7日 星期二
2014年10月7日 星期二
在JavaScript函數中屏蔽外部變數
眾所周知,JavaScript的閉包(Closure)之所以強大,在於它可以捕捉當下執行環境的變數到閉包裡面來用。這給予了整個程式語言靈活的特性(不過從Schema學來的)。不過,若是要深入解釋閉包,可能要花非常多的精力與時間(參看:http://stackoverflow.com/a/111111/2281355),因此這裡省略。
讓我們把重點放在閉包的應用上,考慮以下例子:
全域變數有個特性:隨處都可以存取。這是個很方便的特性,不過在某些情況下卻會造成問題。例如我們有時候要直接執行使用者或其他網站提供的JavaScript,卻要防範跨網站指令碼(cross-site script,XSS),或只是單純想要一個「乾淨的空間」(沙盒),那要怎麼做呢?顯然,如果我們拿的到最上層的變數,我們只需要在scope最前面,用其鍵值(key)覆蓋掉全域變數的參考,然後再將最上層變數的參考也一起蓋掉即可。下面是我想到的做法,假設我們是在瀏覽器的環境下運行下列的程式碼,而最上層變數通常為window。
將每一行指令都用try ... catch包起來,是因為鍵值允許任意字串,但是宣告不行,所以要避免用特殊符號宣告變數造成錯誤。然而,若覆蓋掉最上層的物件,理論上我們也無法直接利用鍵值取得其屬性,因此宣告失敗了也沒關係。
如此一來,在isolate函數內部就完全取不到任何關於最上層物件的參考了!然而,這卻未消去JavaScript的其他功能,比如基本類型、陣列、物件、函式等等,只不過,如果函數本身沒有洩漏任何內容的話,他們在內部的運作不會影響到外面,如被隔離了一樣。不過,依然要注意效能問題,由於是呼叫eval函式,在同一個地方大量宣告變數,這個動作是非常慢的(一次大約幾個毫秒,視全域變數有多少而定)。一個解決的辦法是把產生出的程式碼快取起來,但是這樣依然很慢,因此只有隔離帶來的效益足夠大,才推薦使用這個方法。
讓我們把重點放在閉包的應用上,考慮以下例子:
(function(){可以看到,當在bar裡面找不到foo的定義時,就往上一層找到foo="world"。假如還是找不到,就繼續往上找,直到真的找不到的時候,拋出Error。這是因為JavaScript在執行每個函式的時候,會先從執行到的地方建立一個scope chain,由裡到外把變數參考丟進去,這也是為什麼盡可能不要宣告全域變數,因為它們永遠在scope chain最外面,存取它們會比較慢。
var foo="world";
var bar=function(){
return "Hello, "+foo;
}
return bar();
})() //Hello, world
全域變數有個特性:隨處都可以存取。這是個很方便的特性,不過在某些情況下卻會造成問題。例如我們有時候要直接執行使用者或其他網站提供的JavaScript,卻要防範跨網站指令碼(cross-site script,XSS),或只是單純想要一個「乾淨的空間」(沙盒),那要怎麼做呢?顯然,如果我們拿的到最上層的變數,我們只需要在scope最前面,用其鍵值(key)覆蓋掉全域變數的參考,然後再將最上層變數的參考也一起蓋掉即可。下面是我想到的做法,假設我們是在瀏覽器的環境下運行下列的程式碼,而最上層變數通常為window。
將每一行指令都用try ... catch包起來,是因為鍵值允許任意字串,但是宣告不行,所以要避免用特殊符號宣告變數造成錯誤。然而,若覆蓋掉最上層的物件,理論上我們也無法直接利用鍵值取得其屬性,因此宣告失敗了也沒關係。
如此一來,在isolate函數內部就完全取不到任何關於最上層物件的參考了!然而,這卻未消去JavaScript的其他功能,比如基本類型、陣列、物件、函式等等,只不過,如果函數本身沒有洩漏任何內容的話,他們在內部的運作不會影響到外面,如被隔離了一樣。不過,依然要注意效能問題,由於是呼叫eval函式,在同一個地方大量宣告變數,這個動作是非常慢的(一次大約幾個毫秒,視全域變數有多少而定)。一個解決的辦法是把產生出的程式碼快取起來,但是這樣依然很慢,因此只有隔離帶來的效益足夠大,才推薦使用這個方法。
2013年12月15日 星期日
2013年11月3日 星期日
延遲自動調整大小的SWF(與throttle)
常常在製作一個Flex專案的時候,我們不希望自己已經排好的版面因為使用者任意拖曳視窗邊框或螢幕大小不同而走樣,所以會用強制指定像素的方式來讓物件排好。Flash沒有這些問題,可以透過scaleMode來調整,然而,Flex因為內容的大小已經寫死,如果視窗比內容大,周圍會有白框不好看;如果視窗比內容小,則會出現捲軸(如果有的話。如果沒有就...),參考範例如下。
也許這時候需要改用百分比(%)來指定版面樣式,可是一般需要比較多時間設計,字型當然也要配合版面調整,甚是麻煩。因此我一直在想,有沒有一個一勞永逸的辦法?
Google之後,查到頗簡單的做法是在Application加入
可以做出想要的效果,很顯然有個可以改進之處:「如果我希望在改變大小完成的時候才完成縮放,要怎麼做?」
這需要一點技巧,關鍵在於「完成」這個動作是不會引發任何事件的!那我們難道要持續追蹤這個事件才能知道什麼時候才可以開始調整嗎?當然不用。網路上有高手已經把這個方法包裝成一個名叫throttle(後來改名為debounce)的函數,參見:
http://remysharp.com/2010/07/21/throttling-function-calls/。
範例程式碼如下,必須用Flash Builder 4編譯。
範例就省略了。不過Flash似乎只支援整數大小的字型,所以縮放之後會有點卡卡的。如果有更好的做法之後會再補上。
也許這時候需要改用百分比(%)來指定版面樣式,可是一般需要比較多時間設計,字型當然也要配合版面調整,甚是麻煩。因此我一直在想,有沒有一個一勞永逸的辦法?
Google之後,查到頗簡單的做法是在Application加入
preinitialize="systemManager.stage.scaleMode = 'showAll'; systemManager.stage.align='';"即可。這樣會造成什麼結果呢?
可以做出想要的效果,很顯然有個可以改進之處:「如果我希望在改變大小完成的時候才完成縮放,要怎麼做?」
這需要一點技巧,關鍵在於「完成」這個動作是不會引發任何事件的!那我們難道要持續追蹤這個事件才能知道什麼時候才可以開始調整嗎?當然不用。網路上有高手已經把這個方法包裝成一個名叫throttle(後來改名為debounce)的函數,參見:
http://remysharp.com/2010/07/21/throttling-function-calls/。
範例程式碼如下,必須用Flash Builder 4編譯。
範例就省略了。不過Flash似乎只支援整數大小的字型,所以縮放之後會有點卡卡的。如果有更好的做法之後會再補上。
2013年9月29日 星期日
Flash Player與VB6共同開發的框架
這應該是個很古老的話題,但是VB6的支援性很好,從Win98一直到Win8,因此相較於.Net我還是一直偏好著VB6。不過,有人會說,VB6的應用程式介面已經老掉牙了,就連視覺化樣式的用途都非常侷限,因此可以借用Flash的特長來製作介面,需要用到的功能再跟VB要就好。兩者之間的溝通不算容易,但需要雙向傳輸的情形很少,可以滿足一般小程式的需求。下面是筆者自行製作的按鈕列小程式,用Flash Builder開發,好處是需要修改、調整按鈕大小的時候只需重新生成swf文件即可,不須將整個程式重新compile。
建議在輸出前加入就好。
除了要將swf嵌入需在設計階段製作以外,其他都可以透過執行階段設定完成,因此可以採用預設的名稱ShockwaveFlash1,並在Form_Load中加入如下:
為了將程式碼寫得更易懂,上面程式碼用到下面兩個輔助函數:
如此一來就可以正常於VB中使用Flash了。
加入Flash Player
在VB表單上放入Flash Player的方法非常簡單,如同一般控制項的設定方式。唯獨要注意的是,存檔時表單上不可以殘存任何Flash控制項,否則會引發下圖的錯誤。建議在輸出前加入就好。
除了要將swf嵌入需在設計階段製作以外,其他都可以透過執行階段設定完成,因此可以採用預設的名稱ShockwaveFlash1,並在Form_Load中加入如下:
為了將程式碼寫得更易懂,上面程式碼用到下面兩個輔助函數:
如此一來就可以正常於VB中使用Flash了。
swf嵌入的方法
SWF中有個EmbedMovie屬性,可以於設計階段將影片放入執行檔。先在Movie中填入swf的路徑,待表單顯示影片完成後,將這個屬性設為true,播放測試swf是否正確播放,再型輸出。如此一來就不需要於執行時指定movie,也不再需要外部的檔案就可以正常執行。傳訊-FSCommand
再來是傳訊的部分,Flash可以直接發命令給外部容器(FSCommand),而VB端則會引發FSCommand事件,兩個引數分別填入,可以用switch case來區分。Private Sub ShockwaveFlash1_FSCommand(ByVal command As String, ByVal args As String)至於VB和Flash互傳有點複雜,主要是透過XML傳遞,VB可以用字串的方式製造出來餵給Flash,有興趣的讀者不妨自行嘗試。
Select Case command
Case "aaa"
MsgBox "aaa triggered."
Case Else
MsgBox "收到意外的FSCommand指令:" + vbCrLf + command + "," + args + vbCrLf + "如果此問題持續發生,請詢問程式製作者。", , "資訊"
End Select
End Sub
標籤:
Flash,
Visual Basic 6
2013年7月14日 星期日
2013年7月13日 星期六
[JS]師大附中簡易成績查詢系統
這是一個暑假內做好的小網頁,主要是為了解決學校封鎖成績查詢系統的困擾。剛上高一就有點(夢)想做一個手機版的查詢系統,擱著一段時間主要是不知如何下手,這次不經意的弄好了。
請進:
http://andy0130tw.droppages.com/score
使用Firefox或Chrome以獲得最佳瀏覽效果。
注意網址不要在後面加"/",否則CSS會無法運作(還是你想看簡樸版的也可以)
標籤:
研究,
JavaScript,
jQuery
2013年3月5日 星期二
[VB]ConnectifyAgent - 脫離當當的Connectify介面吧!
歐,好久沒po一些什麼上來了,再不寫點程式貼上來,部落格就要這樣荒廢掉了!
Connectify是一個可讓Windows 7筆電開啟無線AP(Access point)的軟體。
自從在班上用以分享學校網路給班上同學使用,發現免費版已經很夠用,又加上先前的活動,可以學生的Email免費獲得1年序號,從此迷上這個軟體了!(注:這個活動已經結束了QAQ)分享網路、開區網、互傳檔案都很方便。
於是我想到:何不寫一個程式控制網路的開關呢?可是介面是圖形化的,無法用命令列操作,因此必須要找一個能溝通的介面才行。
Connectify是一個可讓Windows 7筆電開啟無線AP(Access point)的軟體。
自從在班上用以分享學校網路給班上同學使用,發現免費版已經很夠用,又加上先前的活動,可以學生的Email免費獲得1年序號,從此迷上這個軟體了!(注:這個活動已經結束了QAQ)分享網路、開區網、互傳檔案都很方便。
Connectify Hotspot 官方網站:http://www.connectify.me/hotspot/進入正題。把Connectify安裝好以後你會漸漸發現管理網路有一點麻煩,因為程式的主畫面跑得實在有點慢。啟動慢、點開鈍鈍的,連開關都有點遲緩,尤其是裝在Tablet PC上觸控非常難用。
於是我想到:何不寫一個程式控制網路的開關呢?可是介面是圖形化的,無法用命令列操作,因此必須要找一個能溝通的介面才行。
標籤:
工具,
網路,
Visual Basic 6
2012年8月23日 星期四
2012年8月4日 星期六
訂閱:
文章 (Atom)