ITHOME 必看!IT好書101

http://www.ithome.com.tw/itadm/article.php?c=63952&s=1
1.The Mythical Man-Month(人月神話:軟體專案管理之道)
王建興 ★★★★★︰軟體工程領域的經典書籍,書中所談及的許多軟體專案問題,至今仍然困擾著軟體開發團隊,但其實大師早在書中便已指出方向。
>>點我看圖

2.Advanced Programming in the UNIX Environment(Advanced Programming in the Unix Environment國際中文版)
陳昇瑋 ★★★★★︰Unix programming 的經典書
>>點我看圖

3.The Art of Computer Programming系列
上官林傑 ★★★★★︰經由大師的指點,深入瞭解什麼是programming。
>>點我看圖

4.Mastering Regular Expressions
王森 ★★★★★︰不管在系統管理,或是軟體開發上,Regular Expression可以完成的事情超乎許多人的想像,尤其幾乎每種語言都內建支援的函式庫,更讓這個歷史悠久的技能,持續默默地支援IT從業人員。>>點我看圖

5.Effective UI
王森 ★★★★★︰自從iPhone受歡迎以來,使用經驗(User eXperience)受到許多人的重視,本書從比較不技術的層面引導讀者甚麼叫做User eXperience,讓大家可以更容易拋開技術導向的思維,真正從用戶的立場來思考軟體設計。
>>點我看圖

6.Introduction to Algorithms
王建興 ★★★★︰演算法是程式設計的根本基礎,本書對於演算法的基本觀念,以及常見、常用的演算法都有十分完整的介紹。
上官林傑 ★★★★★︰鍛練深厚的演算法基礎,幾乎是全世界學習演算法的資訊人都不會錯過的一本書,而且國內大專院校的資訊系幾乎都以本書作為演算法課程的教科書。它不僅是說明各種問題的演算法,更會介紹如何分析演算法複雜度,以及演算法設計策略。
>>點我看圖

7.Computer Algorithms
陳昇瑋 ★★★★★︰演算法自學經典書
>>點我看圖

8.Fundamentals of Data Structures in C
陳昇瑋 ★★★★★︰資料結構自學經典書
上官林傑 ★★★★★︰資料結構的基礎,資料結構對於程式寫作是很重要的工具,它不僅能夠讓讀者瞭解如何有效地擺放記憶體中的資料之外,也可以瞭解到它如何輔助實現各種演算法的設計。
>>點我看圖

程式設計-軟體開發流程

9.Design Patterns: (物件導向設計模式)
王建興 ★★★★★︰設計模式已經成了當今程式設計者不可或缺的觀念和工具。本書可謂設計模式書籍中最為經典的一本,任何有興趣於設計模式的程式設計者都不應該錯過。
陳宏一 ★★★★︰就物件導向設計而言,本書已經屬於聖經級的水平,內容需要細細品味,時而溫故而有知新之感觸。
>>點我看圖

10.Code Complete(軟體建構之道)
陳昇瑋 ★★★★★︰本書教你如何嚴謹地寫程式,以及如何善用偵錯工具來避免及找出錯誤。
王森 ★★★★★︰集結了微軟在軟體開發上的實務經驗,這本書也出現在許多大公司RD部門的書架上。
>>點我看圖

11.Refactoring(重構:改善既有程式的設計)
王建興 ★★★★★︰重構技巧在敏捷的軟體開發方法中扮演著十分關鍵的角色,能協助程式設計者修正隨時間過去而日漸敗壞的程式碼架構。而本書正是公認介紹重構技巧最為經典的一本書。
>>點我看圖

12.Code Craft(編程創藝:編寫出卓越的程式碼)
王建興 ★★★★★︰大多數身為一名程式設計者在工作中會涉及到的議題,小到變數如何命名、大到團隊如何協同合作,本書都提供了全盤的介紹及論點。對程式設計者而言,是本值得推薦的好書。
>>點我看圖

13.Applying UML and Patterns(UML 與樣式徹底研究)
陳宏一 ★★★★★︰談論UML主題的書不下百種,筆者還是覺得本書有一站購足的體驗!無論是流程及工具均交代得十分清楚,配合實例說明,讓你對UML方法論印象更為深刻。
>>點我看圖

14.Continuous Integration- Improving Software Quality and Reducing Risk
陳宏一 ★★★★★︰軟體工程生產自動化在這本書有完整介紹,並提供了不少業界已經被採用的Open Source工具,將理論應驗於實際工作上。
>>點我看圖

15.How We Test Software at Microsoft(軟體測試之道-微軟測試團隊的成功經驗、方法與技術)
王森 ★★★★︰微軟累計超過25年以上的軟體測試經驗,全部都在這本書上一次攤開,除了可以更了解軟體測試的重要性,也能夠讓讀者對軟體品質有更深入的認識。
>>點我看圖

程式設計-Web

16.Head First HTML with CSS & XHTML(深入淺出HTML、CSS與XHTML)
林信良 ★★★★︰在高互動性網頁風行的這個世代,Web程式開發前端不斷有各種精妙技術出現,然而基於網頁的本質是不變的,若你不了解 HTML 版本遷移所帶來的意義,不了解 HTML 4 標準的主要目的是什麼,不了解何謂結構與樣式分離,這本書是個有趣且條理分明的開始。
>>點我看圖

17.Designing Web Interfaces
上官林傑 ★★★★︰從案例及 patterns 中學習 Web 介面的設計及思考。本書採全彩印刷,從許多知名的網站中挑出設計優良的部份做介紹,並且將許多網頁操作動線歸納成一個個 patterns,提供讀者在設計網頁時的參考。
>>點我看圖

18. JavaScript:The Good Parts(JavaScript優良部份)
陳宏一 ★★★★★︰JavaScript已經是現今Web技術不容忽視的一環,本書教你如何撰寫良好的JavaScript程式,以對照方式說明,方便讀者了解其中奧妙,才能趨吉避凶。
上官林傑 ★★★★★︰重新認識 JavaScript 這個程式語言。JavaScript 在現代網頁開發佔有一個十分重要的地位,然而過去的開發者不見得徹底地瞭解JavaScript 的設計,本書除了介紹 JavaScript 好的設計之外,還有更多與其它語言的不同之處,試圖讓讀者更瞭解這個語言以寫出好的 JavaScript 程式。
>>點我看圖

19.jQuery in Action(jQuery 實戰手冊)
陳宏一 ★★★★︰此書以導引式寫法,完整介紹jQuery常用及進階的實務作法,以情境輔佐實例程式碼說明,便於初學者閱讀。
>>點我看圖

20.jQuery Cookbook
陳宏一 ★★★★★︰本書內容為問題導向陳述架構,針對各個主題引領讀者進入jQuery的世界,內容提供明確的jQuery功能說明及解法,讓讀者再不快速上手也難!
>>點我看圖

21. Learning Python 4th Editon(Python 學習手冊)
林信良 ★★★★︰Python 3 是個重要的版本,它幾乎重構了Python 這門語言,它的許多特性回饋至 Python 2.x,藉由 Learning Python 4e一書,你可以同時了解 Python 3 與 Python 2.6 的不同,同時也思考,為何 Python 3 會納入那些新特性,從而了解作為一門解決問題的語言,該有的要素為何,作為一個 Python 新手,也可以藉由本書,了解到 Python 中一些有趣的特性,像是 Function、Decorator、Descriptor、Meta programming 等。
>>點我看圖

22.Complete Web Monitoring
陳宏一 ★★★★︰本書提供全方位的角度,從使用體驗面、系統效能面、數據分系析面,各個擊破,提醒在網站營運時需留意的重點,制訂KPI管控,進而改善網站整體運作。
>>點我看圖

23. High Performance Web Sites
上官林傑 ★★★★★︰學習如何調整 web 前端效能。是Steve Souders在 Yahoo! 工作時寫的書,其實High Performance Web Sites和Even Faster Web Sites這兩本書,我覺得根本就是上、下或者說是I、II,寫作的精神跟概念也幾乎是一模一樣(而且還是同一個作者)。
>>點我看圖

24.Even Faster Web Sites
陳宏一 ★★★★★︰Web網站效能直接影響到一個網站的成敗,本書收集了來自知名網站的專家經驗,提供可量化之實用工具及測量方法,讓你有效改善自家網站的效能。
上官林傑 ★★★★★︰Steve Souders 在 Yahoo!任職期間主導了知名網頁效能調校工具--Y!Slow專案的開發,後來轉職到 Google 任職時則推出了 PageSpeed 這套工具。這本是他在 Google 工作時寫的。除此之外,他還在 Stanford 大學開設網頁效能的相關課程,這本書會介紹不同瀏覽器的特性,以及他們實作標準的特色,讓讀者從各種經驗中學習如何提升網頁前端的效能。
>>點我看圖

25.Web Operations: Keeping the Data On Time
陳宏一 ★★★★︰就談論Web網站系統營運的課題,本書算是第一本,要確保一個網站系統能營運順暢無誤,許多執行上的細節必須憑靠多個單位的協力合作,這裡提供了Google、Yahoo、Microsoft等大型網站專案的經驗分享,值得一讀。
>>點我看圖

26.Web Analytics 2.0
陳宏一 ★★★★★︰分析訪客對於網站的行為,有助於更了解你的客戶,掌握他們真正的需求,提供適時適性的產品及服務內容。
>>點我看圖

27.Website Optimization: Speed, Search Engine & Conversion Rate Secrets
陳宏一 ★★★★★:經營網站,SEO已經是不容忽視的必要課題,本書從網站資訊架構,到網頁面細節定義,提供不少價值性的建議做法,為提供SEO工作者的最佳參考書籍。
>>點我看圖

28.The Art of Community: Building the New Age of Participation
陳宏一 ★★★★︰從Facebook的崛起,社群經營已可視為企業活動,從社群建立,如何讓身為社群自成一烏托邦,達成完美生態平衡,本書有著相當精闢的論述,為少見社群管理之專書。
>>點我看圖

29.Building Web Reputation Systems
陳宏一 ★★★★★︰簡單按一個「讚」,就能表示你對事物的看法,使用者點評網站提供足夠客觀的使用者經驗資訊,解決使用者在生活上的大小事,而此類型的網站應如何設計運作?本書有完整的解答!
>>點我看圖

程式設計-C

30.The C Programming Language(C 語言程式設計)
王建興 ★★★★★︰本書無疑是 C 程式語言的聖經。除了介紹 C 語言的特色,本書中所有的程式範例也足夠經典,示範了 C 語言的真正精神所在。
陳昇瑋 ★★★★★︰C 程式語言經典書。
>>點我看圖

31.C名題精選百則-使用C語言-技巧篇
陳昇瑋 ★★★★★︰居家的演算法實作練習。
>>點我看圖

32.C++ Primer Plus(C++ Primer Plus 5/e中文豪華版)
陳宏一 ★★★★︰書中除了介紹強調了與C程式語言不同的物件導向觀念,從最基礎的觀念建立起,是一本適合初學者的自學手冊。
>>點我看圖

33.Effective C++(Effective C++國際中文版:改善程式技術與設計思維的50個有效作法)
陳宏一 ★★★★︰此書作者將所學經驗歸納出五十多項黃金實務法則,讓C++程式撰寫的同好們在設計思維上能更上一層樓,絕對是一本不可多得的好書。
>>點我看圖

34.Thinking in C++(Thinking in C++ Second Edition 中文版)
陳宏一 ★★★★★︰就C++程式設計領域而言,可視其為架上必備之工具書,內容涵蓋完整,且針對每個章節都有相當深入的研究,由下到上的敘寫方式,協助讀者建立正確紮實的程式觀念。
>>點我看圖

35.Programming — Principles and Practice Using C++
上官林傑 ★★★★★︰大師教你怎麼把 C++寫好。本書的作者正是發明C++語言的人,至今仍然主導 C++的規格發展。由設計者將C++的使用方式,以及各種特色整理成冊,讓讀者瞭解怎麼使用這個語言來寫作程式。>>點我看圖

程式設計-Mobile

36.Programming the Mobile Web
陳宏一 ★★★★★︰智慧型手機的普及使得行動上網已經是時勢所趨,而本書介紹各式平臺及開發方式,對於初嘗手機開發的同好們,可以更快速上手。
>>點我看圖

37.Tapworthy – Designing Great iPhone Apps
王森 ★★★★★︰從本書中可以一次吸收iPhone眾多優秀Mobile Apps的設計,而這些優秀設計不只可以應用在iPhone上,一樣可以應用在Symbian、Android與Windows Phone 7。
>>點我看圖

38.Building iPhone Apps with HTML, CSS, and JavaScript: Making App Store Apps Without Objective-C or Cocoa
陳宏一 ★★★★︰對於已熟悉網頁技術,又想嘗試玩玩iPhone應用程式開發的人,這本書讓你可以循序漸進地體會開發iPhone應用程式的樂趣.。>>點我看圖

程式設計-.NET

39.WPF 4 Unleashed
王森 ★★★★★︰WPF是微軟未來10年的重要技術,從Surface的開發,到Silverlight及Windows Phone 7,全部都是以WPF為基礎。本書由WPF開發團隊的工程師親自執筆,全彩印刷,更能在閱讀時充分了解XAML的精髓。
>>點我看圖

40.C# 4.0 in a Nutshell
王森 ★★★★★︰目前可見學習C#最完整的一本書,針對給初學者設計,尤其在講解LINQ的時候,作者還自製了經典的LINQPad做為教學用,讓讀者可以更容易理解LINQ的運作機制,實屬少見對技術深具熱情的作者。
>>點我看圖

41.C# in Depth(精通C#)
王森 ★★★★★︰雖然作者寫完第一版之後,就去Google當工程師了,但是依然繼續寫第二版,這種熱情誰能有呢 🙂
>>點我看圖

42.CLR via C#, 3rd Edition
王森 ★★★★★︰大師著作,從裡到外完整剖析Common Language Runtime的運作方式,並解釋了許多在.NET上看起來簡單可以做到的事情,究竟經過了多麼巧妙的包裝,讓人大呼過癮。
>>點我看圖

43.Head First C#(深入淺出 C#)
陳宏一 ★★★★︰秉持Head First系列輕鬆詼諧的風格,在談論C#的眾多書海中,此書應屬值得參考的入門書之一。
>>點我看圖

44.ASP.NET MVC 2 開發實戰
陳宏一 ★★★★︰提供ASP.NET初體驗的網站開發人員不錯的學習手冊,作者深入淺出,從基本觀念帶到技術,最後談實務面的運用,也一併提到MVC的設計觀念,讓讀者在程式撰寫同時,也能兼顧良好的設計架構。
>>點我看圖

45.ASP.NET 3.5 最佳實務講座 Using Visual C#
陳宏一 ★★★★︰以初學者的角度從程式語言的概念開始,探討網站應用程式最常使用的Web Form與ADO.NET資料庫相關技術,以及將頁面華麗化的Ajax開發方式,足以讓有心想使用ASP.NET技術開發網站的同好們快速上手,作者在微軟技術領域已有多年實務經驗,閱讀本書必然在應用上有所助益。
>>點我看圖

程式設計-Java

46.Thinking in Java(Thinking in Java 4/e中文版)
王建興 ★★★★︰從物件導向的觀念到 Java 程式語言的特色,以及 Java 程式庫的應用,本書都做了最全面也足夠深入的介紹及探討。
陳宏一 ★★★★︰Java至今已推出第四版,無庸置辯地仍然處於Java界的聖經不敗地位,閱讀本書不僅是會用Java來寫程式,而是不斷去探討所用的細節,細細體會個中奧妙,較適合已經有經驗的Java開發人員。
上官林傑 ★★★★★︰這本書讓 Java 開發者瞭解到 Java 語言的設計思維,然後再以此思維出發來撰寫 Java 程式碼。讓你巧妙地運用 Java 語法以及它的套件,寫出好的 Java 程式。
>>點我看圖

47.Effective Java Programming Language Guide
陳宏一 ★★★★︰Java本書提醒了你在撰寫Java程式時,所應避免的壞習慣,這點很重要,很多日後的系統問題,都是這些點滴積累而造成。
上官林傑 ★★★★︰本書針對各種使用Java函式庫時要注意的效能部份作介紹,並且提供更有效率的寫法,當你已經會寫 Java 程式之後,這本書將會讓你寫出更有效率的程式碼。
>>點我看圖

48.Java Puzzlers(Java Puzzler中文版-陷阱、錯誤與死角)
陳宏一 ★★★★︰魔鬼都在細節裡,Java程式要怎麼寫,才不會造成日後的遺憾,本書內容會讓你在閱讀的過程中驚喜連連。
>>點我看圖

49.Head First Java, Second Edition(深入淺出 Java 程式設計)
陳宏一 ★★★★★︰以活潑的方式介紹Java程式設計,深入淺出帶你進入Java的世界,適合初次接觸Java的新手。
>>點我看圖

50.Core J2EE Patterns: Best Practices and Design Strategies
陳宏一 ★★★★︰提供多層式設計架構的範本,搭配範例程式,讓你更能領會這些設計精神,如何透過程式碼來達成最佳實踐。
>>點我看圖

51.Programming in Scala
林信良 ★★★★★︰姑且不論Java創始者James Gosling 與 Groovy 創始者 James Strachan對Scala這門語言的推崇,透過這本書所獲得的,並不僅是習得 Scala 這門語言,也學習到許多解決問題的方式,像是Closure、Immutable object、Functional programming等,如果你是個 Java programmer,更可以從這本書中,反過來了解Java許多優良與不優良的部份,或了解更多 Java 中特性的設計要點,像是 Generics 等。
>>點我看圖

系統管理

52.Hyper-V 虛擬化技術101問
threesecond ★★★★★(2010)︰這本書也是我相當推薦的實戰書,坊間介紹 Hyper-V 入門的書已經很多了,但障礙排除的書卻極少,新手入門時遇到問題就無解了,這本書列出101個安裝Hyper-V經常遇到的問題,建議先實作過幾次Hyper-V以後再來讀本書,比較容易體會。
>>點我看圖

53.深入Windows 核心- Windows Internals – 第五版
threesecond ★★★★★︰這本是Microsoft官方支援的教材,中文版堂堂邁入第五版,內容推進到Windows Vista 與Windows Server 2008,詳解作業系統底層的架構與各項技術,和市面上的入門書完全不同,這本書相當的扎實硬派,是有心精通 Windows 作業系統的人必讀的好書。
>>點我看圖

54.Windows XP Embedded 系統應用手冊
threesecond ★★★︰這是中文書裡唯一的一本 Windows XP Embedded 專書,如果要靠自學來入門的話,這本是必備的,事實上 Windows XP Embedded 入門門檻極低,難在後續的元件選擇,如果有一本好用的入門書,很快就能踏入 Embedded 的領域,這本可推薦。
>>點我看圖

網路管理

55.資料通訊與佈線設計
threesecond ★★★★★︰結構化佈線必讀的硬底子好書,也是台灣機房規劃權威ZMAN推薦必讀的書。可參考http://phorum.study-area.org/index.php/topic,41038.html。這本的原作是The Complete Guide to Network Wiring,中文版為第3版,雖然翻譯書讀起來比較吃力,但肯定是提升功力最快的方法。
>>點我看圖

56.網管員必讀-網路故障排除手冊
threesecond ★★★★︰這本書完全在講各種意外狀況的排除,市面上的書多半著重理論或基本操作步驟,很少有講實戰運用的,讀這本之前當然必須先具備各方面基礎網管知識,若已經在網路管理上有障礙排除經驗的話,讀這本書會比較有體會,不然只是鴨子聽雷而已。
>>點我看圖

57.CACTI監控系統實戰白皮書
PowerOp ★★★★★︰自由軟體網管系統,我主要是玩OpenNMS ,而 CACTI因為有了 cactiEZ 這個把 CentOS + CACTI一次裝好的懶人包,吸引了不少使用者,這本中文書作者在證券公司資訊部門任職,將數年實戰經驗跟大家分享,不可錯過!
>>點我看圖

58.Wireshark網路協定分析與管理
threesecond ★★★★︰Wireshark是每個學習TCP/IP與封包分析者都必用的軟體,但以前市面上沒有一本書專講Wireshark,使用者只能辛苦的讀英文手冊,或者找論壇上零散不齊全的教學,現在有這本書了,對學習者有非常大的幫助。內容也相當扎實,值得推薦。
PowerOp ★★★★★︰如果要做網管,網路封包的工具多少要懂一點。此書小問題不少,但日文原著的目標明確(向初學者介紹這個強大的工具),加上又是第一本中文書,整個看下來,對於應用的場合,以及使用時可以有哪些變化,還是能有一個基本的了解。
>>點我看圖

59.Routing TCP/IP, Volume 1 & 2
陳廣融︰經典、classical bible。
>>點我看圖

60.Network Mergers and Migrations: Junos Design and Implementation
陳廣融︰一本奇書,如果要執行大型網路的整合,可以參考。
>>點我看圖

資訊安全

61.Microsoft, Unix及Oracle主機與網路安全
threesecond ★★★★★︰這本書除了介紹各種平臺系統的漏洞與風險以外,還以大篇幅詳細介紹漏洞偵測的方法、風險評估、安全策略、人為因素控管等多個層面,不僅僅是局限於軟體層面而已,也是市面上少見的實戰經驗分析的書籍。
>>點我看圖

62.The Tao of Network Security Monitoring
陳彥銘 ★★★★︰網路安全監測是屬於知易行難的一部分。光是佈置 IDS/IPS 不夠用,還需要完整的監控才行。
>>點我看圖

63.No Tech Hacking
楊伯瀚 ★★★★︰與一般課程所強調的郵件詐欺與網站釣魚不同,作者將本身所受過的忍者訓練應用在實務上,以非常實際的案例探討各種社交工程攻擊技術。從最根本的人因危險概念開始,到針對生活環境上的惡意利用,包含尾隨、偷窺、翻找垃圾和各種實體安全上的漏洞。書中實例十分生動且讓人印象深刻,即使是非資安從業人員也能輕鬆從中了解生活中受到攻擊的危險,對個資外洩管道會有進一步體會。
>>點我看圖

64.Incident Response and Computer Forensics, Second Edition
陳彥銘 ★★★︰關於事件應變與電腦鑑識的書,觀念跟流程還沒過時,但是裡面提供的技術資訊,可能不見得符合今日所需。
>>點我看圖

65.Security Engineering
陳彥銘 ★★★★★︰關於資安工程的全面參考書。第二版比第一版多了將近一倍。作者是全球知名的資安專家,內容有條理,絕對是必備的參考書。
>>點我看圖

66.Computer-Related Risks
陳彥銘 ★★★★︰作者根據 ACM International Risks Forum 裡面的案例編輯成書,描寫因為電腦發生錯誤而導致的風險,值得一看,增廣見聞。
>>點我看圖

67.Security Data Visualization: Graphical Techniques for Network Analysis
陳彥銘 ★★★︰關於資訊安全資料視覺化的應用書本之一。內容可參考,但是離許多商業產品還有一段距離。
>>點我看圖

68.Applied Security Visualization
陳彥銘 ★★★★︰同樣關於資安視覺化的應用書本,與前書相當,作者還製作了 DAVIX工具DVD。
>>點我看圖

69.Security in Computing, 4th Edition
陳彥銘 ★★★︰本書第二版助我通過CISSP考試 (2001),之後也陸續推薦此書給需要考試的同事。
>>點我看圖

70.Security Metrics: Replacing Fear, Uncertainty, and Doubt
陳彥銘 ★★★︰關於如何衡量資訊安全的書籍。書本將觀念簡易帶出,對於實作或是案例著墨不深,但可參考作者多年的經驗與觀察。
>>點我看圖

71.The Art of War for Security Managers
陳彥銘 ★★★︰以孫子兵法為名針對安全管理者所寫的書。但是離孫子兵法的地位還差很遠。僅供參考。
>>點我看圖

72.加密與解密(第三版) 
threesecond ★★★★★︰加密與解密第三次改版了,從第一版起我每一本都有買,內容從各種軟體保護、加殼脫殼、看門狗程式等,到跟蹤/反跟蹤技術都有,相當硬底子的好書。
>>點我看圖

73.Handbook of Applied Cryptography
陳彥銘 ★★★★★︰如果想要深入了解密碼學的原理及基礎,本書為不可或缺之參考書。同時也有免費線上 PDF 版。
>>點我看圖

74.Applied Cryptography
陳彥銘 ★★★★︰Bruce Schenier 的出名著作,對密碼學的理論部分不如上一本書來得深入,但是對於密碼學的應用廣為探討,也是必備的參考書。
>>點我看圖

75.The Code Book(碼書:編碼與解碼的戰爭)
陳彥銘 ★★★︰密碼學的故事書,雖然厚,但是值得輕鬆一看。
>>點我看圖

76.Advances in Cryptology
陳彥銘 ★★★︰Crypto、Asiacrypt、Eurocrypt等知名密碼學國際會議的論文集,可以藉此書了解每個會議的新觀念與論文。
>>點我看圖

77.Privacy on the Line
陳彥銘 ★★★★︰知名密碼學家Diffie所寫的關於隱私權的書籍,是適合了解觀念與觀點的好書。
>>點我看圖

78.Writing Secure Code
陳彥銘 ★★★︰關於撰寫安全軟體的書本濫觴之一。有些觀念及微軟的經驗還是很值得參考學習,但是書的內容並不足以涵蓋今日所需。
>>點我看圖

79.The Security Development Lifecycle
陳彥銘 ★★★★︰關於微軟執行 SDL 的著名參考著作。觀念完整,但是執行的部分應該配合微軟近年來發表的一些免費工具。
>>點我看圖

80.Software Security: Building Security In
陳彥銘 ★★★︰軟體安全的濫觴之一,此書是非微軟派別的基本書。但是兩者對 SDL 的觀念,其實有許多共同之處。
>>點我看圖

81.Improving Web Application Security
陳彥銘 ★★★︰微軟關於 web app 安全的書籍。不同處在於作者群是以pattern 的角度來看web app所面臨的威脅及反制之道,因此具參考價值。
>>點我看圖

82.How to Break Software Security
陳彥銘 ★★★︰本書推薦原因是因為書薄,言簡意賅,還有附工具軟體,值得參考。
>>點我看圖

83.How to Break Web Software
陳彥銘 ★★★︰同樣也是言簡意賅,書也很薄。只是本書是針對web app的安全測試而寫。
>>點我看圖

儲存管理

84.大話儲存-網路儲存系統原理精解與最佳實踐
threesecond ★★★★︰專門探討儲存媒體的書不多,但這本絕對是佼佼者,除了硬碟、RAID原理以外,包括FTTB通訊協定、指令集、儲存媒體虛擬化,都有提到,要廣泛了解各種儲存媒體的話,不能錯過這本。
>>點我看圖

85.資料重現-檔案系統原理精解與資料恢復最佳實踐
threesecond ★★★★︰這本和上一本是同時推出的兩本重量級好書,要談檔案救援必先精通檔案系統,這本書就是在介紹各類檔案系統與RAID救援的方法,以及各種問題原因、救援前的風險,若要深入了解資料救援必讀此書。
>>點我看圖

86.硬碟博士開講
threesecond ★★★★︰這本書絕版了。這本書是曾在Seagate任職的硬碟博士寫的,雖然很舊了(1999年出版),但溫徹斯特硬碟機原理不變,這本書的觀念也就不會變,仍然是了解硬碟機詳細構造的必讀好書。
>>點我看圖

通用新知與企業管理

87.The Old New Thing
王森 ★★★★★︰由一位一直從事Windows核心開發的工程師所撰寫,講述許多Windows之所以有目前設計的緣由,豐富的逸事和秘辛,當作歷史故事別有趣味。
>>點我看圖

88.Peopleware: Productive Projects and Teams
王建興 ★★★★★︰從以人為本的角度切入,探討如何增加軟體團隊的生產能力。倘若想成為一名稱職的軟體開發團隊主管,本書相當值得你一讀。
>>點我看圖

89.創意人:創意思考的自我訓練
陳昇瑋 ★★★★★:瞭解創意的來源,訓練自己成為有創意的程式人
>>點我看圖

90.第五項修練: 學習型組織的藝術與實務
陳宏一 ★★★★★:工作是不斷解決問題的過程,而問題的根本原因常常不僅是你眼前所看到的。察覺出隱含的問題,以系統化角度的方式去思考,才能對症下藥,一勞永逸。
>>點我看圖

91.深入淺出PMP
threesecond ★★★★︰專案管理是現代人必備的基本技能,學習專案管理才能有效運用時間與各項資源,有心進展主管職的人更應該讀,是每個人都必須讀的好書,這本書以非常多淺顯易懂的圖例來說明,很好上手。>>點我看圖

92.思考的技術
陳宏一 ★★★★★︰思考需要訓練,需要系統化進行,才會客觀理性。本書將思考視為一門技術,歸納出成功的思考途徑。
>>點我看圖

93.公司絕不會告訴你的50個祕密
陳宏一 ★★★★★︰在職場上很多事情不是想像中的那麼單純,很多理所當然的觀念,卻在真實工作環境裡是行不通的。本書的很多眉角,幫助你順利存活於職場上,保有正確的工作態度,社會新鮮人更是不可不看!>>點我看圖

94.別當正常的傻瓜: 避免正常人的錯誤,成為超凡的決策者
陳宏一 ★★★★︰人是情感的動物,決策時不免常忽略理性客觀的評估,而做出錯誤的決策,本書以生活常見的案例,提醒避開思路陷阱。
>>點我看圖

95.水煮三國
陳宏一 ★★★★︰三國題材一直是企業管理奉為圭臬的重要課題,本書以輕鬆詼諧的筆觸,以各個三國人物置入實際職場角色,讓讀者從中習得管理、策略、領導、心理等技巧,讓你您會心一笑。
>>點我看圖

96.科學革命:一段不存在的歷史
王盈勛 ★★★★:2010年你不容錯過的書。這是有趣的科技史,讓我們認識到,我們視為理所當然的科學革命,並沒有那麼理所當然。
>>點我看圖

97.杜拉克-管理的使命
王盈勛 ★★★★★:只讀一本杜拉克,就讀這一本。下個月是杜拉克101歲冥誕,可以讀這本書來紀念這位不朽的大師。
>>點我看圖

98.你拿什麼定義自己?:組織大師韓第的生命故事
王盈勛 ★★★★★:深厚的歐洲人文環境才出得來的管理思想家,如果你對美式管理思維已感到厭倦,看看韓第是怎麼說的。
>>點我看圖

99.資訊經營法則
王盈勛 ★★★★★:談網路與資訊經濟最基本而扎實的著作,連Google都請作者去當總顧問,你怎能不看?
>>點我看圖

100.資訊革命了什麼?
王盈勛 ★★★★★:打破資訊樂觀主義的迷思,告訴你為何科技對我們真正的影響,往往和我們預期的不一樣。
>>點我看圖

101.NET & TEN
王盈勛 ★★★★★:老牌科技預言家的著作,十多年後回顧,大體上都是正確的,相當不簡單。
>>點我看圖

原生JavaScript技巧大收集

1、原生JavaScript實現字串長度截取

function cutstr(str, len) {

var temp;

var icount = 0;

var patrn = /[^\x00-\xff]/;

var strre = “”;

for (var i = 0; i < str.length; i++) {

if (icount < len – 1) {

temp = str.substr(i, 1);

if (patrn.exec(temp) == null) {

icount = icount + 1

} else {

icount = icount + 2

}

strre += temp

} else {

break

}

}

return strre + “…”

}

2、原生JavaScript獲取功能變數名稱主機

function getHost(url) {

var host = “null”;

if(typeof url == “undefined”|| null == url) {

url = window.location.href;

}

var regex = /^\w+\:\/\/([^\/]*).*/;

var match = url.match(regex);

if(typeof match != “undefined” && null != match) {

host = match[1];

}

return host;

}

3、原生JavaScript清除空格

String.prototype.trim = function() {

var reExtraSpace = /^\s*(.*?)\s+$/;

return this.replace(reExtraSpace, “$1”)

}

4、原生JavaScript替換全部

String.prototype.replaceAll = function(s1, s2) {

return this.replace(new RegExp(s1, “gm”), s2)

}

5、原生JavaScript轉義html標籤

function HtmlEncode(text) {

return text.replace(/&/g, ‘&’).replace(/\”/g, ‘”‘).replace(/</g, ‘<‘).replace(/>/g, ‘>’)

}

6、原生JavaScript還原html標籤

function HtmlDecode(text) {

return text.replace(/&/g, ‘&’).replace(/”/g, ‘\”‘).replace(/</g, ‘<‘).replace(/>/g, ‘>’)

}

7、原生JavaScript時間日期格式轉換

Date.prototype.Format = function(formatStr) {

var str = formatStr;

var Week = [‘日’, ‘一’, ‘二’, ‘三’, ‘四’, ‘五’, ‘六’];

str = str.replace(/yyyy|YYYY/, this.getFullYear());

str = str.replace(/yy|YY/, (this.getYear() % 100) > 9 ? (this.getYear() % 100).toString() : ‘0’ + (this.getYear() % 100));

str = str.replace(/MM/, (this.getMonth() + 1) > 9 ? (this.getMonth() + 1).toString() : ‘0’ + (this.getMonth() + 1));

str = str.replace(/M/g, (this.getMonth() + 1));

str = str.replace(/w|W/g, Week[this.getDay()]);

str = str.replace(/dd|DD/, this.getDate() > 9 ? this.getDate().toString() : ‘0’ + this.getDate());

str = str.replace(/d|D/g, this.getDate());

str = str.replace(/hh|HH/, this.getHours() > 9 ? this.getHours().toString() : ‘0’ + this.getHours());

str = str.replace(/h|H/g, this.getHours());

str = str.replace(/mm/, this.getMinutes() > 9 ? this.getMinutes().toString() : ‘0’ + this.getMinutes());

str = str.replace(/m/g, this.getMinutes());

str = str.replace(/ss|SS/, this.getSeconds() > 9 ? this.getSeconds().toString() : ‘0’ + this.getSeconds());

str = str.replace(/s|S/g, this.getSeconds());

return str

}

8、原生JavaScript判斷是否為數字類型

function isDigit(value) {

var patrn = /^[0-9]*$/;

if (patrn.exec(value) == null || value == “”) {

return false

} else {

return true

}

}

9、原生JavaScript設置cookie

function setCookie(name, value, Hours) {

var d = new Date();

var offset = 8;

var utc = d.getTime() + (d.getTimezoneOffset() * 60000);

var nd = utc + (3600000 * offset);

var exp = new Date(nd);

exp.setTime(exp.getTime() + Hours * 60 * 60 * 1000);

document.cookie = name + “=” + escape(value) + “;path=/;expires=” + exp.toGMTString() + “;domain=360doc.com;”

}

10、原生JavaScript獲取cookie

function getCookie(name) {

var arr = document.cookie.match(new RegExp(“(^| )” + name + “=([^;]*)(;|$)”));

if (arr != null) return unescape(arr[2]);

return null

}

11、原生JavaScript加入我的最愛

function AddFavorite(sURL, sTitle) {

try {

window.external.addFavorite(sURL, sTitle)

} catch(e) {

try {

window.sidebar.addPanel(sTitle, sURL, “”)

} catch(e) {

alert(“加入收藏失敗,請使用Ctrl+D進行添加”)

}

}

}

12、原生JavaScript設為首頁

function setHomepage() {

if (document.all) {

document.body.style.behavior = ‘url(#default#homepage)’;

document.body.setHomePage(‘http://www.jq-school.com’)

} else if (window.sidebar) {

if (window.netscape) {

try {

netscape.security.PrivilegeManager.enablePrivilege(“UniversalXPConnect”)

} catch(e) {

alert(“該操作被流覽器拒絕,如果想啟用該功能,請在位址欄內輸入 about:config,然後將項 signed.applets.codebase_principal_support 值該為true”)

}

}

var prefs = Components.classes[‘@mozilla.org/preferences-service;1’].getService(Components.interfaces.nsIPrefBranch);

prefs.setCharPref(‘browser.startup.homepage’, ‘http://www.jq-school.com’)

}

}

13、原生JavaScript判斷IE6

var ua = navigator.userAgent.toLowerCase();

var isIE6 = ua.indexOf(“msie 6”) > -1;

if (isIE6) {

try {

document.execCommand(“BackgroundImageCache”, false, true)

} catch(e) {}

}

14、原生JavaScript載入樣式檔

function LoadStyle(url) {

try {

document.createStyleSheet(url)

} catch(e) {

var cssLink = document.createElement(‘link’);

cssLink.rel = ‘stylesheet’;

cssLink.type = ‘text/css’;

cssLink.href = url;

var head = document.getElementsByTagName(‘head’)[0];

head.appendChild(cssLink)

}

}

15、原生JavaScript返回腳本內容

function evalscript(s) {

if(s.indexOf(‘<script’) == -1) return s;

var p = /<script[^\>]*?>([^\x00]*?)<\/script>/ig;

var arr = [];

while(arr = p.exec(s)) {

var p1 = /<script[^\>]*?src=\”([^\>]*?)\”[^\>]*?(reload=\”1\”)?(?:charset=\”([\w\-]+?)\”)?><\/script>/i;

var arr1 = [];

arr1 = p1.exec(arr[0]);

if(arr1) {

appendscript(arr1[1], ”, arr1[2], arr1[3]);

} else {

p1 = /<script(.*?)>([^\x00]+?)<\/script>/i;

arr1 = p1.exec(arr[0]);

appendscript(”, arr1[2], arr1[1].indexOf(‘reload=’) != -1);

}

}

return s;

}

16、原生JavaScript清除腳本內容

function stripscript(s) {

return s.replace(/<script.*?>.*?<\/script>/ig, ”);

}

17、原生JavaScript動態載入指令檔

function appendscript(src, text, reload, charset) {

var id = hash(src + text);

if(!reload && in_array(id, evalscripts)) return;

if(reload && $(id)) {

$(id).parentNode.removeChild($(id));

}

 

evalscripts.push(id);

var scriptNode = document.createElement(“script”);

scriptNode.type = “text/javascript”;

scriptNode.id = id;

scriptNode.charset = charset ? charset : (BROWSER.firefox ? document.characterSet : document.charset);

try {

if(src) {

scriptNode.src = src;

scriptNode.onloadDone = false;

scriptNode.onload = function () {

scriptNode.onloadDone = true;

JSLOADED[src] = 1;

};

scriptNode.onreadystatechange = function () {

if((scriptNode.readyState == ‘loaded’ || scriptNode.readyState == ‘complete’) && !scriptNode.onloadDone) {

scriptNode.onloadDone = true;

JSLOADED[src] = 1;

}

};

} else if(text){

scriptNode.text = text;

}

document.getElementsByTagName(‘head’)[0].appendChild(scriptNode);

} catch(e) {}

}

18、原生JavaScript返回按ID檢索的元素物件

function $(id) {

return !id ? null : document.getElementById(id);

}

19、原生JavaScript返回流覽器版本內容

function browserVersion(types) {

var other = 1;

for(i in types) {

var v = types<i> ? types<i> : i;

if(USERAGENT.indexOf(v) != -1) {

var re = new RegExp(v + ‘(\\/|\\s)([\\d\\.]+)’, ‘ig’);

var matches = re.exec(USERAGENT);

var ver = matches != null ? matches[2] : 0;

other = ver !== 0 && v != ‘mozilla’ ? 0 : other;

}else {

var ver = 0;

}

eval(‘BROWSER.’ + i + ‘= ver’);

}

BROWSER.other = other;

}

20、原生JavaScript元素顯示的通用方法

function $(id) {

return !id ? null : document.getElementById(id);

}

function display(id) {

var obj = $(id);

if(obj.style.visibility) {

obj.style.visibility = obj.style.visibility == ‘visible’ ? ‘hidden’ : ‘visible’;

} else {

obj.style.display = obj.style.display == ” ? ‘none’ : ”;

}

}

21、原生JavaScript中有insertBefore方法,可惜卻沒有insertAfter方法?用如下函數實現

function insertAfter(newChild,refChild){

var parElem=refChild.parentNode;

if(parElem.lastChild==refChild){

refChild.appendChild(newChild);

}else{

parElem.insertBefore(newChild,refChild.nextSibling);

}

}

22、原生JavaScript中相容流覽器綁定元素事件

function addEventSamp(obj,evt,fn){

if (obj.addEventListener) {

obj.addEventListener(evt, fn, false);

}else if(obj.attachEvent){

obj.attachEvent(‘on’+evt,fn);

}

}

23、原生JavaScript游標停在文字的後面,文字方塊獲得焦點時調用

function focusLast(){

var e = event.srcElement;

var r =e.createTextRange();

r.moveStart(‘character’,e.value.length);

r.collapse(true);

r.select();

}

24、原生JavaScript檢驗URL連結是否有效

function getUrlState(URL){

var xmlhttp = new ActiveXObject(“microsoft.xmlhttp”);

xmlhttp.Open(“GET”,URL, false);

try{

xmlhttp.Send();

}catch(e){

}finally{

var result = xmlhttp.responseText;

if(result){

if(xmlhttp.Status==200){

return(true);

}else{

return(false);

}

}else{

return(false);

}

}

}

25、原生JavaScript格式化CSS樣式代碼

function formatCss(s){//格式化代碼

s = s.replace(/\s*([\{\}\:\;\,])\s*/g, “$1”);

s = s.replace(/;\s*;/g, “;”); //清除連續分號

s = s.replace(/\,[\s\.\#\d]*{/g, “{“);

s = s.replace(/([^\s])\{([^\s])/g, “$1 {\n\t$2”);

s = s.replace(/([^\s])\}([^\n]*)/g, “$1\n}\n$2”);

s = s.replace(/([^\s]);([^\s\}])/g, “$1;\n\t$2”);

return s;

}

26、原生JavaScript壓縮CSS樣式代碼

function yasuoCss (s) {//壓縮代碼

s = s.replace(/\/\*(.|\n)*?\*\//g, “”); //刪除注釋

s = s.replace(/\s*([\{\}\:\;\,])\s*/g, “$1”);

s = s.replace(/\,[\s\.\#\d]*\{/g, “{“); //容錯處理

s = s.replace(/;\s*;/g, “;”); //清除連續分號

s = s.match(/^\s*(\S+(\s+\S+)*)\s*$/); //去掉首尾空白

return (s == null) ? “” : s[1];

}

27、原生JavaScript獲取當前路徑

var currentPageUrl = “”;

if (typeof this.href === “undefined”) {

currentPageUrl = document.location.toString().toLowerCase();

}

else {

currentPageUrl = this.href.toString().toLowerCase();

}

28、原生JavaScriptIP轉成整型

function _ip2int(ip){

var num = 0;

ip = ip.split(“.”);

num = Number(ip[0]) * 256 * 256 * 256 + Number(ip[1]) * 256 * 256 + Number(ip[2]) * 256 + Number(ip[3]);

num = num >>> 0;

return num;

}

29、原生JavaScript整型解析為IP地址

function _int2iP(num){

var str;

var tt = new Array();

tt[0] = (num >>> 24) >>> 0;

tt[1] = ((num << 8) >>> 24) >>> 0;

tt[2] = (num << 16) >>> 24;

tt[3] = (num << 24) >>> 24;

str = String(tt[0]) + “.” + String(tt[1]) + “.” + String(tt[2]) + “.” + String(tt[3]);

return str;

}

30、原生JavaScript實現checkbox全選與全不選

function checkAll() {

var selectall = document.getElementById(“selectall”);

var allbox = document.getElementsByName(“allbox”);

if (selectall.checked) {

for (var i = 0; i < allbox.length; i++) {

allbox.checked = true;

}

} else {

for (var i = 0; i < allbox.length; i++) {

allbox.checked = false;

}

}

}

31、原生JavaScript判斷是否移動設備

function isMobile(){

if (typeof this._isMobile === ‘boolean’){

return this._isMobile;

}

var screenWidth = this.getScreenWidth();

var fixViewPortsExperiment = rendererModel.runningExperiments.FixViewport || rendererModel.runningExperiments.fixviewport;

var fixViewPortsExperimentRunning = fixViewPortsExperiment && (fixViewPortsExperiment.toLowerCase() === “new”);

if(!fixViewPortsExperiment){

if(!this.isAppleMobileDevice()){

screenWidth = screenWidth/window.devicePixelRatio;

}

}

var isMobileScreenSize = screenWidth < 600;

var isMobileUserAgent = false;

this._isMobile = isMobileScreenSize && this.isTouchScreen();

return this._isMobile;

}

32、原生JavaScript判斷是否移動設備訪問

function isAppleMobileDevice(){

return (/iphone|ipod|ipad|Macintosh/i.test(navigator.userAgent.toLowerCase()));

}

33、原生JavaScript判斷是否蘋果移動設備訪問

function isAppleMobileDevice(){

return (/iphone|ipod|ipad|Macintosh/i.test(navigator.userAgent.toLowerCase()));

}

34、原生JavaScript判斷是否安卓移動設備訪問

function isAndroidMobileDevice(){

return (/android/i.test(navigator.userAgent.toLowerCase()));

}

35、原生JavaScript判斷是否Touch螢幕

function isTouchScreen(){

return ((‘ontouchstart’ in window) || window.DocumentTouch && document instanceof DocumentTouch);

}

36、原生JavaScript判斷是否在安卓上的穀歌流覽器

function isNewChromeOnAndroid(){

if(this.isAndroidMobileDevice()){

var userAgent = navigator.userAgent.toLowerCase();

if((/chrome/i.test(userAgent))){

var parts = userAgent.split(‘chrome/’);

var fullVersionString = parts[1].split(” “)[0];

var versionString = fullVersionString.split(‘.’)[0];

var version = parseInt(versionString);

if(version >= 27){

return true;

}

}

}

return false;

}

37、原生JavaScript判斷是否打開視窗

function isViewportOpen() {

return !!document.getElementById(‘wixMobileViewport’);

}

38、原生JavaScript獲取移動設備初始化大小

function getInitZoom(){

if(!this._initZoom){

var screenWidth = Math.min(screen.height, screen.width);

if(this.isAndroidMobileDevice() && !this.isNewChromeOnAndroid()){

screenWidth = screenWidth/window.devicePixelRatio;

}

this._initZoom = screenWidth /document.body.offsetWidth;

}

return this._initZoom;

}

39、原生JavaScript獲取移動設備最大化大小

function getZoom(){

var screenWidth = (Math.abs(window.orientation) === 90) ? Math.max(screen.height, screen.width) : Math.min(screen.height, screen.width);

if(this.isAndroidMobileDevice() && !this.isNewChromeOnAndroid()){

screenWidth = screenWidth/window.devicePixelRatio;

}

var FixViewPortsExperiment = rendererModel.runningExperiments.FixViewport || rendererModel.runningExperiments.fixviewport;

var FixViewPortsExperimentRunning = FixViewPortsExperiment && (FixViewPortsExperiment === “New” || FixViewPortsExperiment === “new”);

if(FixViewPortsExperimentRunning){

return screenWidth / window.innerWidth;

}else{

return screenWidth / document.body.offsetWidth;

}

}

40、原生JavaScript獲取移動設備螢幕寬度

function getScreenWidth(){

var smallerSide = Math.min(screen.width, screen.height);

var fixViewPortsExperiment = rendererModel.runningExperiments.FixViewport || rendererModel.runningExperiments.fixviewport;

var fixViewPortsExperimentRunning = fixViewPortsExperiment && (fixViewPortsExperiment.toLowerCase() === “new”);

if(fixViewPortsExperiment){

if(this.isAndroidMobileDevice() && !this.isNewChromeOnAndroid()){

smallerSide = smallerSide/window.devicePixelRatio;

}

}

return smallerSide;

}

41、原生 JavaScript完美判斷是否為網址

function IsURL(strUrl) {

var regular = /^\b(((https?|ftp):\/\/)?[-a-z0-9]+(\.[-a-z0-9]+)*\.(?:com|edu|gov|int|mil|net|org|biz|info|name|museum|asia|coop|aero|[a-z][a-z]|((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9]\d)|\d))\b(\/[-a-z0-9_:\@&?=+,.!\/~%\$]*)?)$/i

if (regular.test(strUrl)) {

return true;

}

else {

return false;

}

}

42、原生JavaScript根據樣式名稱檢索元素物件

function getElementsByClassName(name) {

var tags = document.getElementsByTagName(‘*’) || document.all;

var els = [];

for (var i = 0; i < tags.length; i++) {

if (tags.className) {

var cs = tags.className.split(‘ ‘);

for (var j = 0; j < cs.length; j++) {

if (name == cs[j]) {

els.push(tags);

break

}

}

}

}

return els

}

43、原生JavaScript判斷是否以某個字串開頭

String.prototype.startWith = function (s) {

return this.indexOf(s) == 0

}

44、原生JavaScript判斷是否以某個字串結束

String.prototype.endWith = function (s) {

var d = this.length – s.length;

return (d >= 0 && this.lastIndexOf(s) == d)

}

45、原生JavaScript返回IE流覽器的版本號

function getIE(){

if (window.ActiveXObject){

var v = navigator.userAgent.match(/MSIE ([^;]+)/)[1];

return parseFloat(v.substring(0, v.indexOf(“.”)))

}

return false

}

46、原生JavaScript獲取頁面高度

function getPageHeight(){

var g = document, a = g.body, f = g.documentElement, d = g.compatMode == “BackCompat”

? a

: g.documentElement;

return Math.max(f.scrollHeight, a.scrollHeight, d.clientHeight);

}

47、原生JavaScript獲取頁面scrollLeft

function getPageScrollLeft(){

var a = document;

return a.documentElement.scrollLeft || a.body.scrollLeft;

}

48、原生JavaScript獲取頁面可視寬度

function getPageViewWidth(){

var d = document, a = d.compatMode == “BackCompat”

? d.body

: d.documentElement;

return a.clientWidth;

}

49、原生JavaScript獲取頁面寬度

function getPageWidth(){

var g = document, a = g.body, f = g.documentElement, d = g.compatMode == “BackCompat”

? a

: g.documentElement;

return Math.max(f.scrollWidth, a.scrollWidth, d.clientWidth);

}

50、原生JavaScript獲取頁面scrollTop

function getPageScrollTop(){

var a = document;

return a.documentElement.scrollTop || a.body.scrollTop;

}

51、原生JavaScript獲取頁面可視高度

function getPageViewHeight() {

var d = document, a = d.compatMode == “BackCompat”

? d.body

: d.documentElement;

return a.clientHeight;

}

52、原生JavaScript跨流覽器添加事件

function addEvt(oTarget,sEvtType,fnHandle){

if(!oTarget){return;}

if(oTarget.addEventListener){

oTarget.addEventListener(sEvtType,fnHandle,false);

}else if(oTarget.attachEvent){

oTarget.attachEvent(“on” + sEvtType,fnHandle);

}else{

oTarget[“on” + sEvtType] = fnHandle;

}

}

53、原生JavaScript跨流覽器刪除事件

function delEvt(oTarget,sEvtType,fnHandle){

if(!oTarget){return;}

if(oTarget.addEventListener){

oTarget.addEventListener(sEvtType,fnHandle,false);

}else if(oTarget.attachEvent){

oTarget.attachEvent(“on” + sEvtType,fnHandle);

}else{

oTarget[“on” + sEvtType] = fnHandle;

}

}

54、原生JavaScript去掉url首碼

function removeUrlPrefix(a){

a=a.replace(/:/g,”:”).replace(/./g,”.”).replace(///g,”/”);

while(trim(a).toLowerCase().indexOf(“http://”)==0){

a=trim(a.replace(/http:\/\//i,””));

}

return a;

}

55、原生JavaScript亂數時間戳記

function uniqueId(){

var a=Math.random,b=parseInt;

return Number(new Date()).toString()+b(10*a())+b(10*a())+b(10*a());

}

56、原生JavaScript全形半形轉換,iCase: 0全到半,1半到全,其他不轉化

function chgCase(sStr,iCase){

if(typeof sStr != “string” || sStr.length <= 0 || !(iCase === 0 || iCase == 1)){

return sStr;

}

var i,oRs=[],iCode;

if(iCase){/*半->全*/

for(i=0; i<sStr.length;i+=1){

iCode = sStr.charCodeAt(i);

if(iCode == 32){

iCode = 12288;

}else if(iCode < 127){

iCode += 65248;

}

oRs.push(String.fromCharCode(iCode));

}

}else{/*全->半*/

for(i=0; i<sStr.length;i+=1){

iCode = sStr.charCodeAt(i);

if(iCode == 12288){

iCode = 32;

}else if(iCode > 65280 && iCode < 65375){

iCode -= 65248;

}

oRs.push(String.fromCharCode(iCode));

}

}

return oRs.join(“”);

}

57、原生JavaScript確認是否鍵盤有效輸入值

function checkKey(iKey){

if(iKey == 32 || iKey == 229){return true;}/*空格和異常*/

if(iKey>47 && iKey < 58){return true;}/*數字*/

if(iKey>64 && iKey < 91){return true;}/*字母*/

if(iKey>95 && iKey < 108){return true;}/*數位鍵盤1*/

if(iKey>108 && iKey < 112){return true;}/*數位鍵盤2*/

if(iKey>185 && iKey < 193){return true;}/*符號1*/

if(iKey>218 && iKey < 223){return true;}/*符號2*/

return false;

}

58、原生JavaScript獲取網頁被卷去的位置

function getScrollXY() {

return document.body.scrollTop ? {

x: document.body.scrollLeft,

y: document.body.scrollTop

}: {

x: document.documentElement.scrollLeft,

y: document.documentElement.scrollTop

}

}

59、原生JavaScript另一種正則日期格式化函數+調用方法

Date.prototype.format = function(format){ //author: meizz

var o = {

“M+” : this.getMonth()+1, //month

“d+” : this.getDate(),    //day

“h+” : this.getHours(),   //hour

“m+” : this.getMinutes(), //minute

“s+” : this.getSeconds(), //second

“q+” : Math.floor((this.getMonth()+3)/3),  //quarter

“S” : this.getMilliseconds() //millisecond

}

if(/(y+)/.test(format)) format=format.replace(RegExp.$1,

(this.getFullYear()+””).substr(4 – RegExp.$1.length));

for(var k in o)if(new RegExp(“(“+ k +”)”).test(format))

format = format.replace(RegExp.$1,

RegExp.$1.length==1 ? o[k] :

(“00″+ o[k]).substr((“”+ o[k]).length));

return format;

}

alert(new Date().format(“yyyy-MM-dd hh:mm:ss”));

60、原生JavaScript時間個性化輸出功能

/*

1、< 60s, 顯示為“剛剛”

2、>= 1min && < 60 min, 顯示與當前時間差“XX分鐘前”

3、>= 60min && < 1day, 顯示與當前時間差“今天 XX:XX”

4、>= 1day && < 1year, 顯示日期“XX月XX日 XX:XX”

5、>= 1year, 顯示具體日期“XXXX年XX月XX日 XX:XX”

*/

function timeFormat(time){

var date = new Date(time)

, curDate = new Date()

, year = date.getFullYear()

, month = date.getMonth() + 1

, day = date.getDate()

, hour = date.getHours()

, minute = date.getMinutes()

, curYear = curDate.getFullYear()

, curHour = curDate.getHours()

, timeStr;

 

if(year < curYear){

timeStr = year +’年’+ month +’月’+ day +’日 ‘+ hour +’:’+ minute;

}else{

var pastTime = curDate – date

, pastH = pastTime/3600000;

 

if(pastH > curHour){

timeStr = month +’月’+ day +’日 ‘+ hour +’:’+ minute;

}else if(pastH >= 1){

timeStr = ‘今天 ‘ + hour +’:’+ minute +’分’;

}else{

var pastM = curDate.getMinutes() – minute;

if(pastM > 1){

timeStr = pastM +’分鐘前’;

}else{

timeStr = ‘剛剛’;

}

}

}

return timeStr;

}

61、原生JavaScript解決offsetX相容性問題

// 針對火狐不支持offsetX/Y

function getOffset(e){

var target = e.target, // 當前觸發的目標物件

eventCoord,

pageCoord,

offsetCoord;

 

// 計算當前觸發元素到文檔的距離

pageCoord = getPageCoord(target);

 

// 計算游標到文檔的距離

eventCoord = {

X : window.pageXOffset + e.clientX,

Y : window.pageYOffset + e.clientY

};

 

// 相減獲取游標到第一個定位的父元素的座標

offsetCoord = {

X : eventCoord.X – pageCoord.X,

Y : eventCoord.Y – pageCoord.Y

};

return offsetCoord;

}

 

function getPageCoord(element){

var coord = { X : 0, Y : 0 };

// 計算從當前觸發元素到根節點為止,

// 各級 offsetParent 元素的 offsetLeft 或 offsetTop 值之和

while (element){

coord.X += element.offsetLeft;

coord.Y += element.offsetTop;

element = element.offsetParent;

}

return coord;

}

62、原生JavaScript常用的規則運算式

//正整數

/^[0-9]*[1-9][0-9]*$/;

//負整數

/^-[0-9]*[1-9][0-9]*$/;

//正浮點數

/^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$/;

//負浮點數

/^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/;

//浮點數

/^(-?\d+)(\.\d+)?$/;

//email地址

/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/;

//url地址

/^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$/;

//年/月/日(年-月-日、年.月.日)

/^(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$/;

//匹配中文字元

/[\u4e00-\u9fa5]/;

//匹配帳號是否合法(字母開頭,允許5-10位元組,允許字母數位底線)

/^[a-zA-Z][a-zA-Z0-9_]{4,9}$/;

//匹配空白行的規則運算式

/\n\s*\r/;

//匹配中國郵遞區號

/[1-9]\d{5}(?!\d)/;

//匹配身份證

/\d{15}|\d{18}/;

//匹配國內電話號碼

/(\d{3}-|\d{4}-)?(\d{8}|\d{7})?/;

//匹配IP地址

/((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/;

//匹配首尾空白字元的規則運算式

/^\s*|\s*$/;

//匹配HTML標記的規則運算式

< (\S*?)[^>]*>.*?|< .*? />;

63、原生JavaScript實現返回頂部的通用方法

function backTop(btnId) {

var btn = document.getElementById(btnId);

var d = document.documentElement;

var b = document.body;

window.onscroll = set;

btn.style.display = “none”;

btn.onclick = function() {

btn.style.display = “none”;

window.onscroll = null;

this.timer = setInterval(function() {

d.scrollTop -= Math.ceil((d.scrollTop + b.scrollTop) * 0.1);

b.scrollTop -= Math.ceil((d.scrollTop + b.scrollTop) * 0.1);

if ((d.scrollTop + b.scrollTop) == 0) clearInterval(btn.timer, window.onscroll = set);

},

10);

};

function set() {

btn.style.display = (d.scrollTop + b.scrollTop > 100) ? ‘block’: “none”

}

};

backTop(‘goTop’);

64、原生JavaScript獲得URLGET參數值

// 用法:如果地址是 test.htm?t1=1&t2=2&t3=3, 那麼能取得:GET[“t1”], GET[“t2”], GET[“t3”]

function get_get(){

querystr = window.location.href.split(“?”)

if(querystr[1]){

GETs = querystr[1].split(“&”)

GET =new Array()

for(i=0;i<GETs.length;i++){

tmp_arr = GETs.split(“=”)

key=tmp_arr[0]

GET[key] = tmp_arr[1]

}

}

return querystr[1];

}

65、原生JavaScript實現全選通用方法

function checkall(form, prefix, checkall) {

var checkall = checkall ? checkall : ‘chkall’;

for(var i = 0; i < form.elements.length; i++) {

var e = form.elements;

if(e.type==”checkbox”){

e.checked = form.elements[checkall].checked;

}

}

}

66、原生JavaScript實現全部取消選擇通用方法

function uncheckAll(form) {

for (var i=0;i<form.elements.length;i++){

var e = form.elements;

if (e.name != ‘chkall’)

e.checked=!e.checked;

}

}

67、原生JavaScript實現打開一個表單通用方法

function openWindow(url,windowName,width,height){

var x = parseInt(screen.width / 2.0) – (width / 2.0);

var y = parseInt(screen.height / 2.0) – (height / 2.0);

var isMSIE= (navigator.appName == “Microsoft Internet Explorer”);

if (isMSIE) {

var p = “resizable=1,location=no,scrollbars=no,width=”;

p = p+width;

p = p+”,height=”;

p = p+height;

p = p+”,left=”;

p = p+x;

p = p+”,top=”;

p = p+y;

retval = window.open(url, windowName, p);

} else {

var win = window.open(url, “ZyiisPopup”, “top=” + y + “,left=” + x + “,scrollbars=” + scrollbars + “,dialog=yes,modal=yes,width=” + width + “,height=” + height + “,resizable=no” );

eval(“try { win.resizeTo(width, height); } catch(e) { }”);

win.focus();

}

}

68、原生JavaScript判斷是否為用戶端設備

function client(o){

var b = navigator.userAgent.toLowerCase();

var t = false;

if (o == ‘isOP’){

t = b.indexOf(‘opera’) > -1;

}

if (o == ‘isIE’){

t = b.indexOf(‘msie’) > -1;

}

if (o == ‘isFF’){

t = b.indexOf(‘firefox’) > -1;

}

return t;

}

69、原生JavaScript獲取選項按鈕的值

function get_radio_value(field){

if(field&&field.length){

for(var i=0;i<field.length;i++){

if(field.checked){

return field.value;

}

}

}else {

return ;

}

}

70、原生JavaScript獲取核取方塊的值

function get_checkbox_value(field){

if(field&&field.length){

for(var i=0;i<field.length;i++){

if(field.checked && !field.disabled){

return field.value;

}

}

}else {

return;

}

}

71、原生JavaScript判斷是否為郵箱

function isEmail(str){

var re=/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;

if (re.test(str) != true) {

return false;

}else{

return true;

}

}

72、原生JavaScript判斷是否有清單中的危險字元

function isValidReg(chars){

var re=/<|>|\[|\]|\{|\}|『|』|※|○|●|◎|§|△|▲|☆|★|◇|◆|□|▼|㊣|﹋|⊕|⊙|〒|ㄅ|ㄆ|ㄇ|ㄈ|ㄉ|ㄊ|ㄋ|ㄌ|ㄍ|ㄎ|ㄏ|ㄐ|ㄑ|ㄒ|ㄓ|ㄔ|ㄕ|ㄖ|ㄗ|ㄘ|ㄙ|ㄚ|ㄛ|ㄜ|ㄝ|ㄞ|ㄟ|ㄢ|ㄣ|ㄤ|ㄥ|ㄦ|ㄧ|ㄨ|ㄩ|■|▄|▆|\*|@|#|\^|\\/;

if (re.test( chars) == true) {

return false;

}else{

return true;

}

}

73、原生JavaScript判斷字串是否大於規定的長度

function isValidLength(chars, len) {

if (chars.length < len) {

return false;

}

return true;

}

74、原生JavaScript判斷字串是為網址不區分大小寫

function isValidURL( chars ) {

var re=/^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)(\S+\.\S+)$/;

if (!isNULL(chars)) {

chars = jsTrim(chars);

if (chars.match(re) == null)

return false;

else

return true;

}

return false;

}

75、原生JavaScript判斷字串是否為小數

function isValidDecimal( chars ) {

var re=/^\d*\.?\d{1,2}$/;

if (chars.match(re) == null)

return false;

else

return true;

}

76、原生JavaScript判斷字串是否為整數

function isNumber( chars ) {

var re=/^\d*$/;

if (chars.match(re) == null)

return false;

else

return true;

}

77、原生JavaScript判斷字串是否為浮點數

function isFloat( str ) {

for(i=0;i<str.length;i++)  {

if ((str.charAt(i)<“0″ || str.charAt(i)>”9”)&& str.charAt(i) != ‘.’){

return false;

}

}

return true;

}

78、原生JavaScript判斷字元是否為A-Za-z英文字母

function isLetters( str ){

var re=/^[A-Za-z]+$/;

if (str.match(re) == null)

return false;

else

return true;

}

79、原生JavaScript判斷字串是否郵遞區號

function isValidPost( chars ) {

var re=/^\d{6}$/;

if (chars.match(re) == null)

return false;

else

return true;

}

80、原生JavaScript判斷字元是否空NULL

function isNULL( chars ) {

if (chars == null)

return true;

if (jsTrim(chars).length==0)

return true;

return false;

}

81、原生JavaScript用規則運算式提取頁面代碼中所有網址

var aa = document.documentElement.outerHTML.match(/(url\(|src=|href=)[\”\’]*([^\”\’\(\)\<\>\[\] ]+)[\”\’\)]*|(http:\/\/[\w\-\.]+[^\”\’\(\)\<\>\[\] ]+)/ig).join(“\r\n”).replace(/^(src=|href=|url\()[\”\’]*|[\”\’\>\) ]*$/igm,””);

alert(aa)

82、原生JavaScript用規則運算式清除相同的陣列(低效率)

Array.prototype.unique=function(){

return this.reverse().join(“,”).match(/([^,]+)(?!.*\1)/ig).reverse();

};

83、原生JavaScript用規則運算式清除相同的陣列(高效率)

String.prototype.unique=function(){

var x=this.split(/[\r\n]+/);

var y=”;

for(var i=0;i<x.length;i++){

if(!new RegExp(“^”+x.replace(/([^\w])/ig,”\\$1″)+”[        DISCUZ_CODE_2        ]quot;,”igm”).test(y)){

y+=x+”\r\n”

}

}

return y

};

84、原生JavaScript用規則運算式按字母排序,對每行進行陣列排序

function SetSort(){

var text=K1.value.split(/[\r\n]/).sort().join(“\r\n”);//順序

var test=K1.value.split(/[\r\n]/).sort().reverse().join(“\r\n”);//反序

K1.value=K1.value!=text?text:test;

}

85、原生JavaScript字串反序

function IsReverse(text){

return text.split(”).reverse().join(”);

}

86、原生JavaScript用規則運算式清除html代碼中的腳本

function clear_script(){

K1.value=K1.value.replace(/<script.*?>[\s\S]*?<\/script>|\s+on[a-zA-Z]{3,16}\s?=\s?”[\s\S]*?”|\s+on[a-zA-Z]{3,16}\s?=\s?'[\s\S]*?’|\s+on[a-zA-Z]{3,16}\s?=[^ >]+/ig,””);

}

87、原生JavaScript動態執行JavaScript腳本

function javascript(){

try{

eval(K1.value);

}catch(e){

alert(e.message);

}

}

88、原生JavaScript動態執行VBScript腳本

function vbscript(){

try{

var script=document.getElementById(“K1″).value;

if(script.trim()==””)return;

window.execScript(‘On Error Resume Next \n’+script+’\n If Err.Number<>0 Then \n MsgBox “請輸入正確的VBScript腳本!”,48,”腳本錯誤!” \n End If’,”vbscript”)

}catch(e){

alert(e.message);

}

}

89、原生JavaScript實現金額大寫轉換函數

function transform(tranvalue) {

try {

var i = 1;

var dw2 = new Array(“”, “萬”, “億”); //大單位

var dw1 = new Array(“拾”, “佰”, “仟”); //小單位

var dw = new Array(“零”, “壹”, “貳”, “三”, “肆”, “伍”, “陸”, “柒”, “捌”, “玖”); //整數部分用

//以下是小寫轉換成大寫顯示在合計大寫的文字方塊中

//分離整數與小數

var source = splits(tranvalue);

var num = source[0];

var dig = source[1];

//轉換整數部分

var k1 = 0; //計小單位

var k2 = 0; //計大單位

var sum = 0;

var str = “”;

var len = source[0].length; //整數的長度

for (i = 1; i <= len; i++) {

var n = source[0].charAt(len – i); //取得某個位元數上的數字

var bn = 0;

if (len – i – 1 >= 0) {

bn = source[0].charAt(len – i – 1); //取得某個位元數前一位元上的數字

}

sum = sum + Number(n);

if (sum != 0) {

str = dw[Number(n)].concat(str); //取得該數位對應的大寫數位,並插入到str字串的前面

if (n == ‘0’) sum = 0;

}

if (len – i – 1 >= 0) { //在數字範圍內

if (k1 != 3) { //加小單位

if (bn != 0) {

str = dw1[k1].concat(str);

}

k1++;

} else { //不加小單位,加大單位

k1 = 0;

var temp = str.charAt(0);

if (temp == “萬” || temp == “億”) //若大單位前沒有數位則舍去大單位

str = str.substr(1, str.length – 1);

str = dw2[k2].concat(str);

sum = 0;

}

}

if (k1 == 3) //小單位到千則大單位進一

{

k2++;

}

}

//轉換小數部分

var strdig = “”;

if (dig != “”) {

var n = dig.charAt(0);

if (n != 0) {

strdig += dw[Number(n)] + “角”; //加數字

}

var n = dig.charAt(1);

if (n != 0) {

strdig += dw[Number(n)] + “分”; //加數字

}

}

str += “元” + strdig;

} catch(e) {

return “0元”;

}

return str;

}

//拆分整數與小數

function splits(tranvalue) {

var value = new Array(”, ”);

temp = tranvalue.split(“.”);

for (var i = 0; i < temp.length; i++) {

value = temp;

}

return value;

}

90、原生JavaScript常用的規則運算式大收集

匹配中文字元的規則運算式: [\u4e00-\u9fa5]

匹配雙位元組字元(包括漢字在內):[^\x00-\xff]

匹配空行的規則運算式:\n[\s| ]*\r

匹配 HTML 標記的規則運算式:<(.*)>.*<\/\1>|<(.*) \/>

匹配首尾空格的規則運算式:(^\s*)|(\s*$)

匹配 IP 地址的規則運算式:/(\d+)\.(\d+)\.(\d+)\.(\d+)/g

匹配 Email 地址的規則運算式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

匹配網址 URL 的規則運算式:http://(/[\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?

sql 語句:^(select|drop|delete|create|update|insert).*[        DISCUZ_CODE_39        ]nbsp;

非負整數:^\d+[        DISCUZ_CODE_39        ]nbsp;

正整數:^[0-9]*[1-9][0-9]*[        DISCUZ_CODE_39        ]nbsp;

非正整數:^((-\d+)|(0+))[        DISCUZ_CODE_39        ]nbsp;

負整數:^-[0-9]*[1-9][0-9]*[        DISCUZ_CODE_39        ]nbsp;

整數:^-?\d+[        DISCUZ_CODE_39        ]nbsp;

非負浮點數:^\d+(\.\d+)?[        DISCUZ_CODE_39        ]nbsp;

正浮點數:^((0-9)+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))[        DISCUZ_CODE_39        ]nbsp;

非正浮點數:^((-\d+\.\d+)?)|(0+(\.0+)?))[        DISCUZ_CODE_39        ]nbsp;

英文字串:^[A-Za-z]+[        DISCUZ_CODE_39        ]nbsp;

英文大寫串:^[A-Z]+[        DISCUZ_CODE_39        ]nbsp;

英文小寫串:^[a-z]+[        DISCUZ_CODE_39        ]nbsp;

英文字元數位串:^[A-Za-z0-9]+[        DISCUZ_CODE_39        ]nbsp;

英數字加底線串:^\w+[        DISCUZ_CODE_39        ]nbsp;

E-mail地址:^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+[        DISCUZ_CODE_39        ]nbsp;

URL:^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$ 或:^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\’:+!]*([^<>\”\”])*[        DISCUZ_CODE_39        ]nbsp;

郵遞區號:^[1-9]\d{5}[        DISCUZ_CODE_39        ]nbsp;

電話號碼:^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?[        DISCUZ_CODE_39        ]nbsp;

手機號碼:^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}[        DISCUZ_CODE_39        ]nbsp;

雙位元組字元(包括漢字在內):^\x00-\xff

匹配首尾空格:(^\s*)|(\s*$)

匹配 HTML 標記:<(.*)>.*<\/\1>|<(.*) \/>

匹配空行:\n[\s| ]*\r

提取資訊中的網路連結:(h|H)(r|R)(e|E)(f|F) *= *(‘|”)?(\w|\\|\/|\.)+(‘|”| *|>)?

提取資訊中的郵寄地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

提取資訊中的圖片連結:(s|S)(r|R)(c|C) *= *(‘|”)?(\w|\\|\/|\.)+(‘|”| *|>)?

提取資訊中的 IP 位址:(\d+)\.(\d+)\.(\d+)\.(\d+)

提取資訊中的中國手機號碼:(86)*0*13\d{9}

提取資訊中的中國固定電話號碼:(\(\d{3,4}\)|\d{3,4}-|\s)?\d{8}

提取資訊中的中國電話號碼(包括移動和固定電話):(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}

提取資訊中的中國郵遞區號:[1-9]{1}(\d+){5}

提取資訊中的浮點數(即小數):(-?\d*)\.?\d+

提取資訊中的任何數位 :(-?\d*)(\.\d+)?

IP:(\d+)\.(\d+)\.(\d+)\.(\d+)

電話區號:^0\d{2,3}$

騰訊 QQ 號:^[1-9]*[1-9][0-9]*[        DISCUZ_CODE_39        ]nbsp;

帳號(字母開頭,允許 5-16 位元組,允許字母數位底線):^[a-zA-Z][a-zA-Z0-9_]{4,15}[        DISCUZ_CODE_39        ]nbsp;

中文、英文、數位及底線:^[\u4e00-\u9fa5_a-zA-Z0-9]+$

91、原生JavaScript實現表單改變事件resize的操作(相容所以的流覽器)

(function(){

var fn = function(){

var w = document.documentElement ? document.documentElement.clientWidth : document.body.clientWidth

,r = 1255

,b = Element.extend(document.body)

,classname = b.className;

if(w < r){

//當表單的寬度小於1255的時候執行相應的操作

}else{

//當表單的寬度大於1255的時候執行相應的操作

}

}

if(window.addEventListener){

window.addEventListener(‘resize’, function(){ fn(); });

}else if(window.attachEvent){

window.attachEvent(‘onresize’, function(){ fn(); });

}

fn();

})();

92、原生JavaScript用正則清除空格分左右

function ltrim(s){ return s.replace( /^(\s*| *)/, “”); }

function rtrim(s){ return s.replace( /(\s*| *)$/, “”); }

function trim(s){ return ltrim(rtrim(s));}

93、原生JavaScript判斷變數是否空值

/**

* 判斷變數是否空值

* undefined, null, ”, false, 0, [], {} 均返回true,否則返回false

*/

function empty(v){

switch (typeof v){

case ‘undefined’ : return true;

case ‘string’    : if(trim(v).length == 0) return true; break;

case ‘boolean’   : if(!v) return true; break;

case ‘number’    : if(0 === v) return true; break;

case ‘object’    :

if(null === v) return true;

if(undefined !== v.length && v.length==0) return true;

for(var k in v){return false;} return true;

break;

}

return false;

}

94、原生JavaScript實現base64解碼

function base64_decode(data){

var b64 = “ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=”;

var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,ac = 0,dec = “”,tmp_arr = [];

if (!data) { return data; }

data += ”;

do {

h1 = b64.indexOf(data.charAt(i++));

h2 = b64.indexOf(data.charAt(i++));

h3 = b64.indexOf(data.charAt(i++));

h4 = b64.indexOf(data.charAt(i++));

bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;

o1 = bits >> 16 & 0xff;

o2 = bits >> 8 & 0xff;

o3 = bits & 0xff;

if (h3 == 64) {

tmp_arr[ac++] = String.fromCharCode(o1);

} else if (h4 == 64) {

tmp_arr[ac++] = String.fromCharCode(o1, o2);

} else {

tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);

}

} while (i < data.length);

dec = tmp_arr.join(”);

dec = utf8_decode(dec);

return dec;

}

95、原生JavaScript實現utf8解碼

function utf8_decode(str_data){

var tmp_arr = [],i = 0,ac = 0,c1 = 0,c2 = 0,c3 = 0;str_data += ”;

while (i < str_data.length) {

c1 = str_data.charCodeAt(i);

if (c1 < 128) {

tmp_arr[ac++] = String.fromCharCode(c1);

i++;

} else if (c1 > 191 && c1 < 224) {

c2 = str_data.charCodeAt(i + 1);

tmp_arr[ac++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));

i += 2;

} else {

c2 = str_data.charCodeAt(i + 1);

c3 = str_data.charCodeAt(i + 2);

tmp_arr[ac++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));

i += 3;

}

}

return tmp_arr.join(”);

}

96、原生JavaScript獲取表單可見範圍的寬與高

function getViewSize(){

var de=document.documentElement;

var db=document.body;

var viewW=de.clientWidth==0 ?  db.clientWidth : de.clientWidth;

var viewH=de.clientHeight==0 ?  db.clientHeight : de.clientHeight;

return Array(viewW ,viewH);

}

96、原生JavaScript判斷IE版本號(既簡潔、又向後相容!)

var _IE = (function(){

var v = 3, div = document.createElement(‘div’), all = div.getElementsByTagName(‘i’);

while (

div.innerHTML = ‘<!–[if gt IE ‘ + (++v) + ‘]><i></i><![endif]–>’,

all[0]

);

return v > 4 ? v : false ;

}());

97、原生JavaScript獲取流覽器版本號

function browserVersion(types) {

var other = 1;

for (i in types) {

var v = types ? types : i;

if (USERAGENT.indexOf(v) != -1) {

var re = new RegExp(v + ‘(\\/|\\s|: )([\\d\\.]+)’, ‘ig’);

var matches = re.exec(USERAGENT);

var ver = matches != null ? matches[2] : 0;

other = ver !== 0 && v != ‘mozilla’ ? 0 : other;

} else {

var ver = 0;

}

eval(‘BROWSER.’ + i + ‘= ver’);

}

BROWSER.other = other;

}

98、原生JavaScript判斷滑鼠是否移出事件

function isMouseOut(e, handler) {

if (e.type !== ‘mouseout’) {

return false;

}

var reltg = e.relatedTarget ? e.relatedTarget : e.type === ‘mouseout’ ? e.toElement : e.fromElement;

while (reltg && reltg !== handler) {

reltg = reltg.parentNode;

}

return (reltg !== handler);

}

99、原生JavaScript半形轉換為全形函數

function ToDBC(str){

var result = ”;

for(var i=0; i < str.length; i++){

code = str.charCodeAt(i);

if(code >= 33 && code <= 126){

result += String.fromCharCode(str.charCodeAt(i) + 65248);

}else if (code == 32){

result += String.fromCharCode(str.charCodeAt(i) + 12288 – 32);

}else{

result += str.charAt(i);

}

}

return result;

}

100、原生JavaScript全形轉換為半形函數

function ToCDB(str){

var result = ”;

for(var i=0; i < str.length; i++){

code = str.charCodeAt(i);

if(code >= 65281 && code <= 65374){

result += String.fromCharCode(str.charCodeAt(i) – 65248);

}else if (code == 12288){

result += String.fromCharCode(str.charCodeAt(i) – 12288 + 32);

}else{

result += str.charAt(i);

}

}

return result;

}

 

24個2012最受歡迎的jquery插件

—————————————————————————————————

Last month, many great jQuery plugins were created and new versions were released too. Now, lets go through some of the most popular plugins in February 2012.

1. turn.js

Adds a beautiful transition similar to real pages in a book or magazine for HTML5.

2. jQuery Scroll Path

It’s a plugin for defining custom scroll paths. It uses canvas flavored syntax to draw lines and arcs.

3. 3D Gallery

An experimental 3D gallery that uses CSS 3D transforms.

4. Anystretch

Allows you to add a dynamically-resized background image to any page or block level element.
The image will stretch to fit the page/element, and will automatically resize as the window size changes.

5. noty

It makes it easy to create alert, success, error and confirmation messages as an alternative the standard alert dialog.
Each notification is added to a queue. The notifications can be positioned at the top, topCenter (like GMail), bottom, centre, top left or top right.
There are lots of other options in the API to customize the text, animation, speed, buttons and much more.

6. Page Scroller

A powerful JavaScript based smooth scrolling navigation system that utilizes the robust jQuery library. Created entirely with ease of use in mind, the plugin will work on any website.

7. Sequence.js

Sequence is the jQuery slider plugin with infinite style. It provides the complete functionality for a website slider without forcing you to use a set theme.
In fact, Sequence has no in-built theme, leaving you complete creative control to build a unique slider using only CSS3.

8. Curtain.js

This plugin allows you to create a web page with multiple fixed panels that unroll with an amusing effect. Exactly like a curtain rises.

9. Glisse.js

jQuery plugin for creating a fully customizable photo viewer with beautiful CSS3 transition.

10. jQuery Shadow

A plugin to create drop shadows of various types.

11. fullscreen.js

This jQuery plugin lets you create full screen galleries where the slides are shown on the entire screen using the full screen APIs provided by Firefox 10+ and Chrome 15+ (and possibly Safari 5.1+).
In all other browsers it falls back to displaying the slideshow in the entire view port.

12. jPages

jPages is a client-side pagination plugin but it gives you a lot more features comparing to most of the other plugins for this purpose, such as auto page turn, key and scroll browse, showing items with delay, completely customizable navigation panel and also integration with Animate.css and Lazy Load.

13. jurlp

jQuery plugin for parsing, manipulating, filtering and monitoring URLs in “href” and “src” attributes within arbitrary elements (including document.location.href), as well as creating anchor elements from URLs found in HTML/text.

14. Metro JS

jQuery plugin developed to easily enable Metro interfaces on the web. This release focuses on Live Tiles, the Application Bar and Theming. It’s early in the development phase, but all features should work on at least IE7+(Win/WinPhone), Firefox, Chrome, Android, Opera, and Safari(OSX/iOS).

15. DataTables v1.9

A highly flexible tool, based upon the foundations of progressive enhancement, which will add advanced interaction controls to any HTML table

16. SimpleVid

SimpleVid is a free and easy way to host and embed your own fluid videos. It uses flash to for browsers that don’t support h.264, so you can encode once as a baseline h.264 mp4 and play anywhere.

17. blur.js

jQuery plugin that produces psuedo-transparent blurred elements over other elements.

18. Twitter Friends Widget v2.0

There is a Facebook like box, Google+ badge, what about a Twitter fan box?!

19. Bacon

Bacon is a jQuery plugin that allows you to wrap text around a bezier curve or a line.

20. Responsive Google Maps

When scrolling a website on your mobile device you can get trapped in a Google map due to the Maps scrollbar of death™. This plugin gives you a native Google maps on your website and a safe fallback to the static image API of Google maps for smaller devices.

21. ProQuo

ProQuo is a quick way to encourage your readers to spread your content through twitter. Simply define the regions in your markup that you would like to make “tweetable” and ProQuo will handle the rest.

22. Lazy Load v1.7

Lazy Load is a jQuery plugin to delay loading of images in long web pages. Images outside of viewport (visible part of web page) won’t be loaded before user scrolls to them.

23. Flippy

Flippy is a cross-browser flip effect plugin which allows you to flip whatever html element you want.

24. jQuery Geo v1.0a4

jQuery Geo, an open-source geospatial mapping project from Applied Geographics, provides a streamlined API for a large percentage of your online mapping needs. Whether you just want to display a map on a web page as quickly as possible or you are a more advanced GIS user, jQuery Geo can help!

Enjoyed this roundup? check Popular jQuery Plugins of January 2012.

MySQL 資料庫儲存引擎

 

這篇文章主要討論 Memory, MyISAM, InnoDB 三種儲存引擎

項目 MyISAM InnoDB Memory
空間限制 64TB 記憶體
transaction x x
大量 Insert 速度
設置外來鍵 x x
鎖定層級 資料表 資料列 資料表
二元樹索引 不知
雜湊索引 x
全文搜尋索引 x x
資料壓縮 x x
資料快取 x
索引快取
記憶體佔用
磁碟佔用 x

對於 MyISAM 來說,最大的好處是成本低,而且可以 create views ,這是其他儲存引擎辦不到的,但缺點就是鎖定層級以 table 為單位,而且不支援 transaction ,這些地方輸給 InnoDB 。不過 InnoDB 也是有缺點像是不支援 FULLTEXT 的索引,且記憶體佔用多、磁碟空間耗用大…等等。

我找到一篇文章針對 MyISAM, InnoDB 和 Falcon 來做比較,在這裡面 MyISAM和 InnoDB 表現都沒有差很多,唯獨在測 READ_PK_RANGE 和 READ_KEY_POINT 時候, MyISAM 爛掉了(不過主角其實是 Falcon 因為它被打趴了)。原因是:There MyISAM shows bad scalability with increasing count of thread. I think the reason is pread system call MyISAM uses to access data and retrieving from OS cache is not scaled.
InnoDB vs MyISAM vs Falcon benchmarks – part 1

而 Memory 儲存引擎的最大優點就是快、快、很快、不會對硬碟頻繁讀寫、並且用 HASH 雜湊索引(但不曉得有沒有 Btree 二元樹索引)!另外它有個特性,就是會在硬碟建立一個 .frm 檔,目的是為了存資料表的 scheme ,但是每一筆 record 還是儲存在記憶體中,這也意味著如果斷電或是關機,資料就會消失不見。

實際應用:

假設我有兩個不同類型的 Table ,分別儲存 App Data 和 Session ,我有大量連線,從伺服器上的紀錄看來,開機半天左右,總共處理近九百萬個連線(這是實際數據)。

系統開機至現在共進行 8,944,853 次查詢
總共 每小時 每分 每秒
8,945 k 806.51 k 12.73 k 224.19

而 App Data 的資料表作用和 Session 資料表個作用分別如下:

每個 App 啟動時,都會有一個 Session ID,而每筆 Session 都被當成一筆 Record Insert 到 Table 中做紀錄,當 Session 起始/結束的時候,才把更新的資料寫到 App Data 中。

對於 Session 個資料表的處理,我採用 Memory 為儲存引擎,因為 Session 掉了並不可惜,但卻可以換來極佳的效率,而 App Data 的資料表,我則是採用 InnoDB ,雖然相較於 MyISAM 會花上更多的 Cost 而且效率較差,但是他提供很好的鎖定(以row為單位)以及安全的復原機制,另外也支援外來鍵的設定。

推薦閱讀文章:
MySQL Storage Engine Architecture, Part 3: Details and Comparison
13.4. The MEMORY (HEAP) Storage Engine
MySQL Storage Engines

[問題排除]WORD文件結束後, 出現視窗, (MICROSOFT OFFICE WORLD 發生問題, 必需關閉, 謹此致歉), 回復工作後, 出現新的WORD文件, 要再關閉後才會結束.

連結

 

問題

WORD文件結束後, 出現視窗, (MICROSOFT OFFICE WORLD 發生問題, 必需關閉, 謹此致歉), 回復工作後, 出現新的WORD文件, 要再關閉後才會結束.

 

回答

跟 Normal.dot 範本有關

請到以下路徑,將 Normal.dot 檔案先更名,然後再開啟 Word 看看

C:\Documents and Settings\您的使用者名稱\Application Data\Microsoft\Templates

 

假如還是有問題,請參考

每次結束 Word 時,都會出現提示詢問您是否要將變更儲存至 Normal.dot 共用範本

http://support.microsoft.com/kb/291352/zh-tw