海水正藍

          面朝大海,春暖花開
          posts - 145, comments - 29, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          一個精美的個人作品集網站是吸引更多客戶的最好方式。如果你正在建設個人作品集網站或者想重新設計的話可以參考本文收集的這些示例,相信這些精美的網站作品會帶給你靈感。同時,這些網站中匯集了豐富的設計作品、素材和教程,能為你的設計帶來很大的幫助。

          Emotions by Mike

          Emotions

          Mark Forrester

          Mark Forrester

          Jeff Sarmiento

          Jeff Sarmiento

          Rawkes

          Rawkes

          Darren Hoyt

          Darren Hoyt

          Spoon Graphics

          Spoon Graphics

          Dawghouse Design Studios

          Dawghouse

          Adaptd

          Adaptd

          David Hellman

          David Hellman

          Tony Geer

          Tony Geer

          Octwelve

          Octwelve

          Finchley Web Design

          Finchley

          Jason Reed

          Jason Reed

          Squawk

          Squawk

          Adit Shukla

          Adit Shukla

          Albert Lo

          Albert Lo

          Digital Mash

          Digital Mash

          Alessandro Cavallo

          Alessandro Cavallo

          Ganato Design

          Ganato Design

          Cleverful

          Cleverful

          Design Disease

          Design Disease

          Mohammed Alaa

          Mohammed Alaa

          Jen Germann

          Jen Germann

          45 Royale

          45 Royale

          Viget

          Viget

          Shylands

          Shylands

          Function

          Function

          Electric Pulp

          Electric Pulp

          Luke Larsen

          Luke Larsen

          Jason Santa Maria

          Jason Santa Maria

          Matt Bango

          Matt Bango

          Concentric Studio

          Concentric Studio

          Vesess

          Vesess

          Pixel Haven

          Pixel Haven

          Winnie Lim

          Winnie Lim

          Nathan Carnes

          Nathan Carnes

          Guilherme Neumann

          Neumann

          Artworking

          Artworking

          Jason Duerr

          Jason Duerr

          Ed Merritt

          Ed Merritt

          Robbie Manson

          Robbie Manson

          Kind Company

          Kind Company

          Rikcat Industries

          Rikcat Industries

          Jamie Gregory

          Jamie Gregory

          Mark Boulton

          Mark Boulton

          Simone Maranzana

          Simone Maranzana

          The Things We Make

          The Things We Make

          EdDidIt

          EdDidIt

          Noe Design Studio

          Noe

          Evan Eckard

          Evan Eckard

          Level 9 Design

          Level 9

          Timothy van Sas

          Timothy van Sas

          Surefire

          Surefire

          Merix

          Merix

          Vibrant Drive

          Vibrant Drive

          Quo Consulting

          Quo Consulting

          New Concept

          New Concept

          Ash Web Media

          Ash Web Media

          Ecstatic Media

          Ecstatic Media

          Ordered List

          Ordered List

          Sidebar Creative

          Sidebar Creative

          Chris Garrett

          Chris Garrett

          Kyle Haskins

          Kyle Haskins

          GoodBytes

          GoodBytes

          Leigh Taylor

          Leigh Taylor

          Holds’worth Design

          Holds'worth Design

          Wake Interactive

          Wake Interactive

          Hydra Studio

          Hydra Studio

          FortySeven Media

          FortySeven Media

          Mario H. Coelho

          Mario H. Coelho

          1minus1

          1minus1

          You Love Us

          You Love Us

          Edit Studios

          Edit Studios

          Andrew Bradshaw

          Andrew Bradshaw

          Marius Roosendaal

          Marius Roosendaal

          Rory Story

          Rory Story

          Freshest

          Freshest

          Digital Base

          Digital Base

          Fling Media

          Fling Media

          Deaxon

          Deaxon

          SimpleBits

          SimpleBits

          Cabedge

          Cabedge

          Ameravant

          Ameravant

          ImageX Media

          ImageX Media

          Paravel Design

          Paravel Design

          Mint Idea

          Mint Idea

          thruSITES

          thruSITES

          31Three

          31Three

          Texelate

          Texelate

          Pixeleden

          Pixeleden

          Kyan Media

          Kyan Media

          Fulspectrum Media

          Fulspectrum Media

          Designchuchi

          Designchuchi

          Wishingline Design Studio

          Wishingline Design Studio

          Happy Cog

          Happy Cog

          Callender Creates

          Callender Creates

          Dreamten Studios

          Dreamten Studios

          EmaStudios

          EmaStudios

          Dairien Boyd

          Dairien Boyd

          Third & Grand

          Third & Grand

          OnWired

          OnWired

          最后,推薦一個很不錯的收集個人作品集網站設計案例的網站foliofocus.com,去那尋找更多的設計靈感吧。

          (編譯來源:夢想天空  原文來自:101 Awesome Portfolio Sites

          posted @ 2012-07-15 20:01 小胡子 閱讀(152) | 評論 (0)編輯 收藏

          jQuery 是一個非常優秀的 JavaScript 框架,使用簡單靈活,同時還有許多成熟的插件可供選擇,它可以幫助你在項目中加入漂亮的效果,其中之一就是幻燈片效果的實現,這是一種在有限的網頁空間內 展示系列項目時非常好的方法。今天這篇文章要給大家分享的是60款很酷的 jQuery 幻燈片插件,相信里面一定會有你喜歡的。

          Cloud Carousel (演示 | 下載)

          Jqueryimage481 in Cool and Useful jQuery Image and Content Sliders and Slideshows

          ShineTime (演示 | 下載)

          Nivo Slider (演示 | 下載)

          Interactive Photo Desk (演示 | 下載)

          Beautiful Photo Stack Gallery with jQuery and CSS3 (演示 | 下載)

          Micro Image Gallery: A jQuery Plugin (演示 | 下載)

          Minimalistic Slideshow Gallery with jQuery (演示 | 下載)

          Image Slider with Unique Effects (演示 | 下載)

          Create image gallery in 4 lines of jQuery (演示 | 下載)

          Slideshow with strip effects (演示 | 下載)

          Nivo Zoom (演示 | 下載)

          AD Gallery, gallery plugin for jQuery (演示 | 下載)

          MLB.com Content Switcher with jQuery and CSS3 (演示 | 下載)

          Create Scrollable Interface (演示 | 下載)

          Animate Panning Slideshow with jQuery (演示 | 下載)

          Image Scale Carousel (演示 | 下載)

          Sudo Slider (演示 | 下載)

          GALLERYVIEW (演示 | 下載)

          Jquery Plugin MopSlider 2.4 (演示 | 下載)

          jQuery Image Scroller (演示 | 下載)

          Image Gallery Using jQuery and Flickr (演示 | 下載)

          jQuery plugin: Wilq32.RotateImage (演示 | 下載)

          jQZoom Evolution (演示 | 下載)

          Photo gallery using jQuery and VisualLightBox (演示 | 下載)

          Zoomimage (演示 | 下載)

          YoxView (演示 | 下載)

          Supersized (演示 | 下載)

          AnythingSlider (演示 | 下載)

          Photo Revealer (演示 | 下載)

          Exposure (演示 | 下載)

          Auto-Playing Featured Content Slider (演示 | 下載)

          Horinaja (演示 | 下載)

          S3 Slider (演示 | 下載)

          Slide Deck (演示 | 下載)

          Galleriffic (演示 | 下載)

          Photo Gallery – Dark Theme (演示 | 下載)

          jQuery morphing gallery (演示 | 下載)

          Simple Accordion w/ CSS and jQuery (演示 | 下載)

          Automatic Image Slider w/ CSS & jQuery (演示 | 下載)

          Create a Slick and Accessible Slideshow Using jQuery (演示 | 下載)

          Fancy Thumbnail Hover Effect w/ jQuery (演示 | 下載)

          Coda Slider Effect (演示 | 下載)

          Simple Controls Gallery (演示 | 下載)

          Popeye (演示 | 下載)

          Simple 演示 (演示 | 下載)

          ImageFlow (演示 | 下載)

          Moving Boxes (演示 | 下載)

          SlideViewerPro (演示 | 下載)

          Pirobox (演示 | 下載)

          jQuery simple panorama viewer (演示 | 下載)

          A Beautiful Apple-style Slideshow Gallery (演示 | 下載)

          Flickr Photobar Gallery (演示 | 下載)

          Step Carousel Viewer (演示 | 下載)

          Zoom-Info (演示 | 下載)

          Box Slider (演示 | 下載)

          jQuery Panel Gallery (演示 | 下載)

          Image Highlighting and Preview with jQuery (演示 | 下載)

          Multimedia Gallery for Images, Video and Audio (演示 | 下載)

          Awesome Mobile Image Gallery Web App (演示 | 下載)

          您可能還喜歡

           

           

          編譯來源:夢想天空 ◆ 關注前端開發技術 ◆ 分享網頁設計資源

          原文來自:Cool and Useful jQuery Image and Content Sliders and Slideshows

          posted @ 2012-07-15 19:58 小胡子 閱讀(266) | 評論 (0)編輯 收藏

          今天這篇文章收集了34個漂亮的應用程序后臺管理界面分享給大家。這些界面都是來自 themeforest網站,雖然直接下載需要付費的,不過大部分都提供了在線預覽,所以完全能夠復制下來,有的提供了預覽圖,設計師可以根據預覽圖自己 設計。希望這些漂亮的后臺管理界面設計案例能幫助到你。(有登錄界面的,點擊登錄即可進入后臺界面)

          Flexy Admin


          34個漂亮的應用程序后臺管理系統界面

          Broom Cupboard Admin Skin


          34個漂亮的應用程序后臺管理系統界面

          Fresh CMS


          34個漂亮的應用程序后臺管理系統界面

          Ultimate Admin Panel Solution


          34個漂亮的應用程序后臺管理系統界面

          Titanium


          34個漂亮的應用程序后臺管理系統界面

          Wide Admin


          34個漂亮的應用程序后臺管理系統界面

          AP Admin Panel


          34個漂亮的應用程序后臺管理系統界面

          Ninja Admin


          34個漂亮的應用程序后臺管理系統界面

          Sleek Admin Skin


          34個漂亮的應用程序后臺管理系統界面

          Pro Admin Template


          34個漂亮的應用程序后臺管理系統界面

          您可能還喜歡



          系列文章:34個漂亮的應用程序后臺管理界面(系列一)

          英文來源:Outstanding Admin Panels for Your Applications

          編譯來源:夢想天空 ◆ 關注前端開發技術 ◆ 分享網頁設計資源

          posted @ 2012-07-15 19:56 小胡子 閱讀(252) | 評論 (0)編輯 收藏

          基本介紹

            jQuery Tools 是基于 jQuery 開發的網站界面庫,包含網站最常用的Tabs(選項卡)、Tooltip(信息提示)、Overlay(遮罩、彈窗)、Scrollable(滾動控 制)、Form Validator(表單驗證)、Rangeinput(范圍選擇)、Dateinput(日期選擇)等眾多功能。jQuery Tools 提供了高自定義的API接口,能夠幫助開發者非常容易的實現所需要的功能,帶給用戶更佳的使用體驗。

           

           

            相比 jQuery UI,jQuery Tools 提供了作為網站應用更需要使用的功能,jQuery Tools 提供的功能分為三部分,分別是 UI Tools,Form Tools 和 Tools Box,下面會對每個功能模塊分別作介紹,另外 jQuery Tools 要比 jQuery UI 的界面更精美,可定制性更好。除此之外,jQuery Tools 核心代碼使用 GZIP 壓縮后只有3.9KB,及時包括搜有的擴展功能也才14KB,要比 jQuery UI 輕量很多。

          UI Tools

            UI Tools 部分包括Tabs、Tooltip、Overlay和Scrollable四個功能模塊,各功能模塊的Demo如下:

            Tabs(選項卡)

           

           

          1. Minimal setup for tabs
          2. Naming the tabs
          3. 4 different skins with CSS
          4. Using mouseover to switch tabs
          5. Making wizards with the tabs
          6. Making accordions with tabs
          7. Customizing the accordion effect
          8. Horizontal accordion using the tabs
          9. Multiple tabs and accordion instances
          10. Handling browsers back button
          11. Loading tab contents with ajax
          12. AJAXed tabs with history support
          13. Slideshow plugin for the tabs

            Tooltip(信息提示)

           

            

          1. Basics of using the tooltip
          2. Using any HTML inside the tooltip
          3. Imitating browsers default tooltip
          4. Using tooltips in form fields
          5. Using tooltips in tables or lists
          6. Custom tooltip effect
          7. Dynamic positioning of the tooltip

            Overlay(遮罩、彈窗)

           

           

          1. Minimal setup for overlay
          2. The apple effect for overlay
          3. Creating modal dialogs with overlay
          4. Opening overlays programmatically
          5. Overlays with different styles
          6. Loading external pages into overlay
          7. Multiple overlays on the same page
          8. Creating a customized overlay effect

            Scrollable(信息滾動)

           

           

          1. Minimal setup for scrollable
          2. A vertical scrollable
          3. A simple scrollable image gallery
          4. Gallery with multiple scrollables
          5. A scrollable registration wizard
          6. Scrollable plugins in action
          7. Browser back button navigation
          8. jQuery tools home page setup
          9. A complete navigational system
          10. Add and remove items from scrollable
          11. Customizing the scrolling animation

          Form Tools

            Form Tools 部分包括Validator、Rangeinput和Dateinput三個功能模塊,各功能模塊的Demo如下:

           

           

            Validator(表單驗證)

          1. Minimal setup for validator
          2. Custom input types and attributes
          3. Server & client-side validation
          4. Error Summary
          5. Validator events in action
          6. Localizing the validator

            Rangeinput(范圍選擇)

          1. Minimal setup for rangeinput
          2. A couple of vertical ranges
          3. Multiple small ranges
          4. A custom scrollbar for a DIV

            Dateinput(日期選擇)

          1. Minimal setup for dateinput
          2. A large skin for Dateinput
          3. Customizing Dateinput behavior
          4. Prompting for start and end dates
          5. Calendar that is always available
          6. Localizing the Dateinput (french)

          Tools Box

            Tools Box 部分包括Expose、Flashembed和Combinations三個功能模塊,各功能模塊的Demo如下:

           

           

            Expose(突出重點)

          1. Minimal setup for expose
          2. Styling the mask
          3. Exposing a form
          4. Exposing videos with a custom mask

            Flashembed(嵌入Flash)

          1. Basics of Flash embedding
          2. Flashembed and jQuery
          3. Loading flash on a mouse click
          4. Placing HTML on top of a flash object
          5. Handling old flash versions
          6. Flashembed and Flowplayer

            Combinations(整合功能)

          1. HTML5 form inside an overlay
          2. An artist’s portfolio
          3. Speeding up the portfolio

           

          您可能還喜歡

           

           

          本文鏈接:jQuery Tools:Web開發必備的 jQuery UI 庫

          編譯來源:夢想天空 ◆ 關注前端開發技術 ◆ 分享網頁設計資源

          posted @ 2012-07-15 19:56 小胡子 閱讀(289) | 評論 (0)編輯 收藏

          工具提示(Tooltip)在網站中的一個小功能,但卻有很重要的作用,常用于顯示一些溫馨的提示信息。如果網站中的工具提示功能做得非常有創意的話能夠加深用戶對網站印象。因此,今天這篇文章向大家推薦的20款優秀的 jQuery Tooltip 插件就是用于幫助你制作漂亮的工具提示效果。

          1. Dynamic tooltip

          flowplayer-dynamic-tooltip-jquery-tooltip-plugin-for-web-design

           

          2. jGrowl

          stanlemon-jgrowl-jquery-tooltip-plugin-for-web-design
           

          3. jQuery Horizontal Tooltips Menu Tutorials

          queness-horizontal-tooltips-menu-tutorials-jquery-tooltip-plugin-for-web-design

           

          4. Coda Popup Bubble

          jqueryfordesigners-coda-popup-bubble-jquery-tooltip-plugin-for-web-design

           

          5. The Tooltip

          banner js ajax freebies css

           

          6. TipTip

          code-drewwilson-tiptip-jquery-tooltip-plugin-for-web-design

           

          7. (mb)Tooltip

          pupunzi-mb-tooltip-jquery-tooltip-plugin-for-web-design

           

          8. vTip

          vertigo-project-vtip-jquery-tooltip-plugin-for-web-design
           

          10. jQuery Ajax Tooltip

          rndnext-blogspot-jquery-ajax-tooltip-jquery-tooltip-plugin-for-web-design

           

          11. Digg-style post sharing tool with jQuery

          queness-digg-style-post-sharing-tool-jquery-tooltip-plugin-for-web-design

           

          12. Input Floating Hint Box

          nicolae-namolovan-googlepages-input-hint-box-jquery-tooltip-plugin-for-web-design

           

          13. Simpletip

          simpletip-craigsworks-jquery-tooltip-plugin-for-web-design

           

          14. qTip

          craigsworks-qtip-jquery-tooltip-plugin-for-web-design

           

          15. Orbital Tooltip

          userfirst-orbital-jquery-tooltip-plugin-for-web-design

           

          16. Tooltip

          bassistance-tooltip-jquery-tooltip-plugin-for-web-design

           

          17. tipsy

          onehackoranother-tipsy-jquery-tooltip-plugin-for-web-design

           

          18. Easiest jQuery Tooltip Ever

          cssglobe-easiest-jquery-tooltip-ever-jquery-tooltip-plugin-for-web-design

           

          19. Shiny Tooltips

           

          20. BeautyTips

          lullabot-beautytips-jquery-tooltip-plugin-for-web-design

           

          您你可能還喜歡

           

          posted @ 2012-07-15 19:40 小胡子 閱讀(238) | 評論 (0)編輯 收藏

          jQuery的易擴展性吸引了來自全球的開發者來共同編寫jQuery插件。jQuery插件不僅能夠增強網站的可用性,有效地改善用戶體驗,還可以大大減少開發時間。現在的jQuery插件很多,可以根據您的項目需要來選擇。這里為您介紹20款非常不錯的插件。
          ?

          Creative Radical Web Typography

          Lettering.js是一個輕量經的、易于使用的jQuery插件,可創造出極具個性的網頁排版,是2010年最佳jQuery插件之一。 

          演示 | 下載

          New FancyMoves Jquery Product Slider

          Jquery Product Slider是一款效果很不錯的產品幻燈片插件。

          演示 | 下載

          Jquery Space Gallery

          Jquery Space Gallery是一款很有空間感的圖片庫插件。

          演示 | 下載

          Fancy Thumbnail Hover Effect

          這是一款非常不錯的Hover效果插件。

          演示 | 下載

          Jquery Inline Form Validation

          這是一款表單驗證插件。

          演示 | 下載

          Site Switcher

          這是一款站點切換插件。

          演示 | 下載

          AnythingSlider

          這是一款效果很棒的幻燈片插件。

          演示 | 下載

          Jquery Tooltip Coda Bubble

          這是一款簡潔的jQuery信息提示插件。

          演示 | 下載

          Jquery Upload and Crop Image

          這是一款圖片上傳和裁剪插件。

          演示 | 下載

          jQuery Carts

          這是一款jQuery圖表插件。

          演示 | 下載

          Twitter-like login box

          這是一款類似Twitter登陸框效果的插件。

          演示 | 下載

          File Download

          這是一款文件下載插件。

          演示 | 下載

          Polaroid Photo Viewer

          這是一款寶麗萊效果圖片瀏覽插件。

          演示 | 下載

          jquery Hover Sub Tag Cloud

          這是一款子標簽云顯示插件。

          演示 | 下載

          Graph Visualization

          這是一款圖標可視化插件。

          演示 | 下載

          Show/Hide Jquery Panel

          這是一款控制面板顯示和隱藏的插件。

          演示 | 下載

          Drop Down with CSS and jQuery

          這是一款下拉菜單插件。

          演示 | 下載

          Quick & Easy Zooming With jQuery – Zoomy

          這是一款非常好用的縮放插件。

          演示 | 下載

          Horizontal Accordions

          這是一款橫向手風琴效果插件。

          演示 | 下載

          Flexible Rating

          這是一款非常靈活的評分插件。

          演示 | 下載

          (編譯來源:夢想天空  原文來自:20 Useful jQuery Plugins Every Developer Should Know About

          posted @ 2012-07-15 19:39 小胡子 閱讀(139) | 評論 (0)編輯 收藏

          流體布局(一)

          jQuery插件:jQuery.Waterfall.js, js的計算方法

          jQuery1.4.4,IE8.0,opera,firefox,chrome測試通過

          圍觀請點擊:http://3vke.com

          下載地址:Waterfall on github

          1.使用方法:

          ①.加載jQuery庫;
          ②.加載jQuery.Waterfull.js , 必須在jQuery庫之后;
          ③.調用接口: $node.waterfull({/* 此處為設置選項, 可留空 */}) , 如:

          $('#container').waterfall({})

          2.設置選項:

          {
              itemSelector:
          '.post-home',   // 子元素id/class, 可留空
              columnCount:4,               // 列數,  純數字, 可留空
              columnWidth:300              // 列寬度, 純數字, 可留空
              isResizable: false,          // 自適應瀏覽器寬度, 默認false
              isAnimated: false,           // 元素動畫, 默認false
              Duration: 500,               // 動畫時間
              Easing: "swing",             // 動畫效果, 配合 jQuery Easing Plugin 使用
              endFn: function(){}          // 回調函數
          }

          3.Ajax說明:

          $.ajax({
              url: Url,
              beforeSend: function() {},
              success: function(date) {
                  $(
          '#container').append(date).waterfall({});
              }
          })

          流體布局(二)

          固定寬度的流體布局的個人思路:參考文獻:@qiqiboy javascript 圖片預加載 

          思路如下:

          1.imgReady可以在圖片沒有加載完成之前,通過頭信息獲取到圖片的大小(這種方法相當天才),于是我建立一個局部的數組,將圖片高度儲存起來:(div的高度亦可)

          var argg= new Array()//例如有10篇文章,就是一個length=10的數組

          2.通過瀏覽器的寬度,來判斷一行可以放幾張圖(假定3張),再建立一個全局數組,保存數據:

          var args= new Array()//初始化數據,全部設定為0 args=[0,0,0];

          3.排序,用for循環,每一次通過比較argg[i]和args的最小值,來確定下一個div放置的位置,放完之后,把args的最小值重新賦值:

          args[min]+=argg[i]

          新版iphoto主題,采用如上方法布局,包含ajax后只有8Kb,相當廉價,新版首頁觀光地址:http://icold.me/photo

          1.流體布局主題iPhoto新版首頁觀光地址:http://icold.me/photo

          2.流體布局js計算方法以及js源代碼下載:流體布局(三) 

           

           

          流體布局(三)

          本文主要寫固定寬度流體布局中的處理辦法(全文以iphoto主題為例)

          1.先看看Html結構


          <div id="container">
              
          <div class="post-home">xxoo..</div>
              
          <div class="post-home">xxoo..</div>
              
          <div class="post-home">xxoo..</div>
              
          <div class="post-home">xxoo..</div>
              
          <div class="post-home">xxoo..</div>
              
          </div>

          #container寬度我設定為1050px, .post-home寬度設定為350px,具體的css就不寫了(也就是3列)

          2.js的算法


          jQuery(document).ready(function($) {
            var args 
          = [000];
            
          /*儲存已排列的最后3個.post-home的top值, 初始時為[0,0,0];
              沒有儲存left值, 因為left已經是知道的, [0,350,700];
            
          */
            sort($(
          '#container > .post-home'));
            function sort(elem) { 
          // elem是傳入的DOM
              var r, // setTimeout相關變量
                  m = 0,// 初始變量
                  n = elem.length,// .post-home的數量
                  topArgs = new Array(); // 建立一個局部數組
              Array.prototype.min = function() {
                
          /*返回數組中最小值的序號
               0 ==>第一列(left = 0*350px)
               1 ==>第二列(left = 1*350px)
               2 ==>第三列(left = 2*350px)
                
          */
                var e,d 
          = 0,b = this[0],c = this.length;
                
          for (e = 1; e < c; e++) {
                  
          if (this[e] < b) {b = this[e];d = e}
                }
                
          return d
              };
              Array.prototype.max 
          = function() { // 返回數組中的最大值
                var d, b = this[0],c = this.length;
                
          for (d = 1; d < c; d++) {
                  
          if (this[d] > b) {b = this[d]}
                }
                
          return b
              };
              getHeight();
              function getHeight() {
                
          if (m < n) { // 用來判斷是不是獲取了所有的.post-home的高度
                  var $this = elem.eq(m), // 第m個.post-home
                      h = parseInt($this.height()) + 16// 第m個.post-home高度 + 16, 16是與下一個div的距高
                  topArgs.push(h); // 把第m個.post-home高度, 放到數組中去
                  m++// m累加
                  r = setTimeout(getHeight, 10// setTimeout來循環函數, 直到m==n 獲取所有的高度
                }
                
          if (m >= n) {
                  clearTimeout(r); 
          // 清除循環
                  r = null;
                  var d, e 
          = topArgs.length; //初始化數據
                  for (d = 0; d < e; d++) { // for循環來給topleft賦值
                    var minNum = args.min(), // 獲得args的最小值的序號
                        newTop = args[minNum],// 獲得args的最小值
                    $that = elem.eq(d); // 第d個.post-home
                    $that.css({ // for循環來給topleft賦值
                      position: "absolute",
                      top: newTop,
                      left: 
          350 * minNumber
                    });
                    args[minNum] 
          = newTop + topArgs[d];
                    
          /*改變args數組最小值的大小
                 這樣args[minNum]就不是最小了
                 而是這一列下一個.post-home的高度
                 如此循環,下一個args[minNum],就是第二列的下一個.post-home的高度
               
          */
                  }
                  $(
          '#container').css({
                    height: args.max() 
          //給$('#container')的高度賦值
                  });
                }
              }
            }
          });

          3.最重要的問題

          假如不能及時得到img的高度,將會錯位,所以這里推薦再談javascript圖片預加載技術, 如果你嫌麻煩,可以用$(window).load(function(){})把上面的代碼包括起來,$(window).load可以在圖片加載完成之后執行內部的代碼。


          http://3vke.com/2012/03/09/%E6%B5%81%E4%BD%93%E5%B8%83%E5%B1%80%E6%8F%92%E4%BB%B6waterfall/

          posted @ 2012-07-15 18:16 小胡子 閱讀(6406) | 評論 (0)編輯 收藏

          MySQL性能優化的21個最佳實踐

          今天,數據庫的操作越來越成為整個應用的性能瓶頸了,這點對于Web應用尤其明顯。關于數據庫的性能,這并不只是DBA才需要擔心的事,而這更是我 們程序員需要去關注的事情。當我們去設計數據庫表結構,對操作數據庫時(尤其是查表時的SQL語句),我們都需要注意數據操作的性能。這里,我們不會講過 多的SQL語句的優化,而只是針對MySQL這一Web應用最多的數據庫。希望下面的這些優化技巧對你有用。

            1. 為查詢緩存優化你的查詢

          大多數的MySQL服務器都開啟了查詢緩存。這是提高性最有效的方法之一,而且這是被MySQL的數據庫引擎處理的。當有很多相同的查詢被執行了多次的時候,這些查詢結果會被放到一個緩存中,這樣,后續的相同的查詢就不用操作表而直接訪問緩存結果了。

          這里最主要的問題是,對于程序員來說,這個事情是很容易被忽略的。因為,我們某些查詢語句會讓MySQL不使用緩存。請看下面的示例:


          上面兩條SQL語句的差別就是 CURDATE() ,MySQL的查詢緩存對這個函數不起作用。所以,像 NOW() 和 RAND() 或是其它的諸如此類的SQL函數都不會開啟查詢緩存,因為這些函數的返回是會不定的易變的。所以,你所需要的就是用一個變量來代替MySQL的函數,從而 開啟緩存。

            2. EXPLAIN 你的 SELECT 查詢

          使用 EXPLAIN 關鍵字可以讓你知道MySQL是如何處理你的SQL語句的。這可以幫你分析你的查詢語句或是表結構的性能瓶頸。

          EXPLAIN 的查詢結果還會告訴你你的索引主鍵被如何利用的,你的數據表是如何被搜索和排序的……等等,等等。

          挑一個你的SELECT語句(推薦挑選那個最復雜的,有多表聯接的),把關鍵字EXPLAIN加到前面。你可以使用phpmyadmin來做這個事。然后,你會看到一張表格。下面的這個示例中,我們忘記加上了group_id索引,并且有表聯接:

          當我們為 group_id 字段加上索引后:

          我們可以看到,前一個結果顯示搜索了 7883 行,而后一個只是搜索了兩個表的 9 和 16 行。查看rows列可以讓我們找到潛在的性能問題。

            3. 當只要一行數據時使用 LIMIT 1

          當你查詢表的有些時候,你已經知道結果只會有一條結果,但因為你可能需要去fetch游標,或是你也許會去檢查返回的記錄數。

          在這種情況下,加上 LIMIT 1 可以增加性能。這樣一樣,MySQL數據庫引擎會在找到一條數據后停止搜索,而不是繼續往后查少下一條符合記錄的數據。

          下面的示例,只是為了找一下是否有“中國”的用戶,很明顯,后面的會比前面的更有效率。(請注意,第一條中是Select *,第二條是Select 1)


            4. 為搜索字段建索引

          索引并不一定就是給主鍵或是唯一的字段。如果在你的表中,有某個字段你總要會經常用來做搜索,那么,請為其建立索引吧。

          從上圖你可以看到那個搜索字串 “last_name LIKE ‘a%’”,一個是建了索引,一個是沒有索引,性能差了4倍左右。

          另外,你應該也需要知道什么樣的搜索是不能使用正常的索引的。例如,當你需要在一篇大的文章中搜索一個詞時,如: “WHERE post_content LIKE ‘%apple%’”,索引可能是沒有意義的。你可能需要使用MySQL全文索引 或是自己做一個索引(比如說:搜索關鍵詞或是Tag什么的)

            5. 在Join表的時候使用相當類型的例,并將其索引

          如果你的應用程序有很多 JOIN 查詢,你應該確認兩個表中Join的字段是被建過索引的。這樣,MySQL內部會啟動為你優化Join的SQL語句的機制。

          而且,這些被用來Join的字段,應該是相同的類型的。例如:如果你要把 DECIMAL 字段和一個 INT 字段Join在一起,MySQL就無法使用它們的索引。對于那些STRING類型,還需要有相同的字符集才行。(兩個表的字符集有可能不一樣)


            6. 千萬不要 ORDER BY RAND()

          想打亂返回的數據行?隨機挑一個數據?真不知道誰發明了這種用法,但很多新手很喜歡這樣用。但你確不了解這樣做有多么可怕的性能問題。

          如果你真的想把返回的數據行打亂了,你有N種方法可以達到這個目的。這樣使用只讓你的數據庫的性能呈指數級的下降。這里的問題是:MySQL會不得 不去執行RAND()函數(很耗CPU時間),而且這是為了每一行記錄去記行,然后再對其排序。就算是你用了Limit 1也無濟于事(因為要排序)

          下面的示例是隨機挑一條記錄


            7. 避免 SELECT *

          從數據庫里讀出越多的數據,那么查詢就會變得越慢。并且,如果你的數據庫服務器和WEB服務器是兩臺獨立的服務器的話,這還會增加網絡傳輸的負載。

          所以,你應該養成一個需要什么就取什么的好的習慣。

            8. 永遠為每張表設置一個ID

          我們應該為數據庫里的每張表都設置一個ID做為其主鍵,而且最好的是一個INT型的(推薦使用UNSIGNED),并設置上自動增加的AUTO_INCREMENT標志。

          就算是你 users 表有一個主鍵叫 “email”的字段,你也別讓它成為主鍵。使用 VARCHAR 類型來當主鍵會使用得性能下降。另外,在你的程序中,你應該使用表的ID來構造你的數據結構。

          而且,在MySQL數據引擎下,還有一些操作需要使用主鍵,在這些情況下,主鍵的性能和設置變得非常重要,比如,集群,分區……

          在這里,只有一個情況是例外,那就是“關聯表”的“外鍵”,也就是說,這個表的主鍵,通過若干個別的表的主鍵構成。我們把這個情況叫做“外鍵”。比 如: 有一個“學生表”有學生的ID,有一個“課程表”有課程ID,那么,“成績表”就是“關聯表”了,其關聯了學生表和課程表,在成績表中,學生ID和課程 ID叫“外鍵”其共同組成主鍵。

            9. 使用 ENUM 而不是 VARCHAR

          ENUM 類型是非常快和緊湊的。在實際上,其保存的是 TINYINT,但其外表上顯示為字符串。這樣一來,用這個字段來做一些選項列表變得相當的完美。

          如果你有一個字段,比如“性別”,“國家”,“民族”,“狀態”或“部門”,你知道這些字段的取值是有限而且固定的,那么,你應該使用 ENUM 而不是 VARCHAR。

          MySQL也有一個“建議”(見第十條)告訴你怎么去重新組織你的表結構。當你有一個 VARCHAR 字段時,這個建議會告訴你把其改成 ENUM 類型。使用 PROCEDURE ANALYSE() 你可以得到相關的建議。

            10. 從 PROCEDURE ANALYSE() 取得建議

          PROCEDURE ANALYSE() 會讓 MySQL 幫你去分析你的字段和其實際的數據,并會給你一些有用的建議。只有表中有實際的數據,這些建議才會變得有用,因為要做一些大的決定是需要有數據作為基礎的。

          例如,如果你創建了一個 INT 字段作為你的主鍵,然而并沒有太多的數據,那么,PROCEDURE ANALYSE()會建議你把這個字段的類型改成 MEDIUMINT 。或是你使用了一個 VARCHAR 字段,因為數據不多,你可能會得到一個讓你把它改成 ENUM 的建議。這些建議,都是可能因為數據不夠多,所以決策做得就不夠準。

          在phpmyadmin里,你可以在查看表時,點擊 “Propose table structure” 來查看這些建議

          一定要注意,這些只是建議,只有當你的表里的數據越來越多時,這些建議才會變得準確。一定要記住,你才是最終做決定的人。

            11. 盡可能的使用 NOT NULL

          除非你有一個很特別的原因去使用 NULL 值,你應該總是讓你的字段保持 NOT NULL。這看起來好像有點爭議,請往下看。

          首先,問問你自己“Empty”和“NULL”有多大的區別(如果是INT,那就是0和NULL)?如果你覺得它們之間沒有什么區別,那么你就不要使用NULL。(你知道嗎?在 Oracle 里,NULL 和 Empty 的字符串是一樣的!)

          不要以為 NULL 不需要空間,其需要額外的空間,并且,在你進行比較的時候,你的程序會更復雜。 當然,這里并不是說你就不能使用NULL了,現實情況是很復雜的,依然會有些情況下,你需要使用NULL值。

            12. Prepared Statements

          Prepared Statements很像存儲過程,是一種運行在后臺的SQL語句集合,我們可以從使用 prepared statements 獲得很多好處,無論是性能問題還是安全問題。

          Prepared Statements 可以檢查一些你綁定好的變量,這樣可以保護你的程序不會受到“SQL注入式”攻擊。當然,你也可以手動地檢查你的這些變量,然而,手動的檢查容易出問題, 而且很經常會被程序員忘了。當我們使用一些framework或是ORM的時候,這樣的問題會好一些。

          在性能方面,當一個相同的查詢被使用多次的時候,這會為你帶來可觀的性能優勢。你可以給這些Prepared Statements定義一些參數,而MySQL只會解析一次。

          雖然最新版本的MySQL在傳輸Prepared Statements是使用二進制形勢,所以這會使得網絡傳輸非常有效率。

          當然,也有一些情況下,我們需要避免使用Prepared Statements,因為其不支持查詢緩存。但據說版本5.1后支持了。

          在PHP中要使用prepared statements,你可以查看其使用手冊:mysqli 擴展 或是使用數據庫抽象層,如: PDO.


            13. 無緩沖的查詢

          正常的情況下,當你在當你在你的腳本中執行一個SQL語句的時候,你的程序會停在那里直到沒這個SQL語句返回,然后你的程序再往下繼續執行。你可以使用無緩沖查詢來改變這個行為。

          mysql_unbuffered_query() 發送一個SQL語句到MySQL而并不像mysql_query()一樣去自動fethch和緩存結果。這會相當節約很多可觀的內存,尤其是那些會產生大 量結果的查詢語句,并且,你不需要等到所有的結果都返回,只需要第一行數據返回的時候,你就可以開始馬上開始工作于查詢結果了。

          然而,這會有一些限制。因為你要么把所有行都讀走,或是你要在進行下一次的查詢前調用 mysql_free_result() 清除結果。而且, mysql_num_rows() 或 mysql_data_seek() 將無法使用。所以,是否使用無緩沖的查詢你需要仔細考慮。

            14. 把IP地址存成 UNSIGNED INT

          很多程序員都會創建一個 VARCHAR(15) 字段來存放字符串形式的IP而不是整形的IP。如果你用整形來存放,只需要4個字節,并且你可以有定長的字段。而且,這會為你帶來查詢上的優勢,尤其是當 你需要使用這樣的WHERE條件:IP between ip1 and ip2。

          我們必需要使用UNSIGNED INT,因為 IP地址會使用整個32位的無符號整形。

          而你的查詢,你可以使用 INET_ATON() 來把一個字符串IP轉成一個整形,并使用 INET_NTOA() 把一個整形轉成一個字符串IP。在PHP中,也有這樣的函數 ip2long() 和 long2ip()。

            15. 固定長度的表會更快

          如果表中的所有字段都是“固定長度”的,整個表會被認為是 “static” 或 “fixed-length”。 例如,表中沒有如下類型的字段: VARCHAR,TEXT,BLOB。只要你包括了其中一個這些字段,那么這個表就不是“固定長度靜態表”了,這樣,MySQL 引擎會用另一種方法來處理。

          固定長度的表會提高性能,因為MySQL搜尋得會更快一些,因為這些固定的長度是很容易計算下一個數據的偏移量的,所以讀取的自然也會很快。而如果字段不是定長的,那么,每一次要找下一條的話,需要程序找到主鍵。

          并且,固定長度的表也更容易被緩存和重建。不過,唯一的副作用是,固定長度的字段會浪費一些空間,因為定長的字段無論你用不用,他都是要分配那么多的空間。

          使用“垂直分割”技術(見下一條),你可以分割你的表成為兩個一個是定長的,一個則是不定長的。

            16. 垂直分割

          “垂直分割”是一種把數據庫中的表按列變成幾張表的方法,這樣可以降低表的復雜度和字段的數目,從而達到優化的目的。(以前,在銀行做過項目,見過一張表有100多個字段,很恐怖)

          示例一:在Users表中有一個字段是家庭地址,這個字段是可選字段,相比起,而且你在數據庫操作的時候除了個人信息外,你并不需要經常讀取或是改 寫這 個字段。那么,為什么不把他放到另外一張表中呢? 這樣會讓你的表有更好的性能,大家想想是不是,大量的時候,我對于用戶表來說,只有用戶ID,用戶名,口令,用戶角色等會被經常使用。小一點的表總是會有 好的性能。

          示例二: 你有一個叫 “last_login” 的字段,它會在每次用戶登錄時被更新。但是,每次更新時會導致該表的查詢緩存被清空。所以,你可以把這個字段放到另一個表中,這樣就不會影響你對用戶 ID,用戶名,用戶角色的不停地讀取了,因為查詢緩存會幫你增加很多性能。

          另外,你需要注意的是,這些被分出去的字段所形成的表,你不會經常性地去Join他們,不然的話,這樣的性能會比不分割時還要差,而且,會是極數級的下降。

            17. 拆分大的 DELETE 或 INSERT 語句

          如果你需要在一個在線的網站上去執行一個大的 DELETE 或 INSERT 查詢,你需要非常小心,要避免你的操作讓你的整個網站停止相應。因為這兩個操作是會鎖表的,表一鎖住了,別的操作都進不來了。

          Apache 會有很多的子進程或線程。所以,其工作起來相當有效率,而我們的服務器也不希望有太多的子進程,線程和數據庫鏈接,這是極大的占服務器資源的事情,尤其是內存。

          如果你把你的表鎖上一段時間,比如30秒鐘,那么對于一個有很高訪問量的站點來說,這30秒所積累的訪問進程/線程,數據庫鏈接,打開的文件數,可能不僅僅會讓你泊WEB服務Crash,還可能會讓你的整臺服務器馬上掛了。

          所以,如果你有一個大的處理,你定你一定把其拆分,使用 LIMIT 條件是一個好的方法。下面是一個示例:

          18. 越小的列會越快

          對于大多數的數據庫引擎來說,硬盤操作可能是最重大的瓶頸。所以,把你的數據變得緊湊會對這種情況非常有幫助,因為這減少了對硬盤的訪問。

          參看 MySQL 的文檔 Storage Requirements 查看所有的數據類型。

          如果一個表只會有幾列罷了(比如說字典表,配置表),那么,我們就沒有理由使用 INT 來做主鍵,使用 MEDIUMINT, SMALLINT 或是更小的 TINYINT 會更經濟一些。如果你不需要記錄時間,使用 DATE 要比 DATETIME 好得多。

          當然,你也需要留夠足夠的擴展空間,不然,你日后來干這個事,你會死的很難看,參看Slashdot的例子(2009年11月06日),一個簡單的ALTER TABLE語句花了3個多小時,因為里面有一千六百萬條數據。

            19. 選擇正確的存儲引擎

          在 MySQL 中有兩個存儲引擎 MyISAM 和 InnoDB,每個引擎都有利有弊。酷殼以前文章《MySQL: InnoDB 還是 MyISAM?》討論和這個事情。
          MyISAM 適合于一些需要大量查詢的應用,但其對于有大量寫操作并不是很好。甚至你只是需要update一個字段,整個表都會被鎖起來,而別的進程,就算是讀進程都 無法操作直到讀操作完成。另外,MyISAM 對于 SELECT COUNT(*) 這類的計算是超快無比的。

          InnoDB 的趨勢會是一個非常復雜的存儲引擎,對于一些小的應用,它會比 MyISAM 還慢。他是它支持“行鎖” ,于是在寫操作比較多的時候,會更優秀。并且,他還支持更多的高級應用,比如:事務。

          下面是MySQL的手冊
          target=”_blank”MyISAM Storage Engine

          InnoDB Storage Engine

            20. 使用一個對象關系映射器(Object Relational Mapper)

          使用 ORM (Object Relational Mapper),你能夠獲得可靠的性能增漲。一個ORM可以做的所有事情,也能被手動的編寫出來。但是,這需要一個高級專家。

          ORM 的最重要的是“Lazy Loading”,也就是說,只有在需要的去取值的時候才會去真正的去做。但你也需要小心這種機制的副作用,因為這很有可能會因為要去創建很多很多小的查詢反而會降低性能。

          ORM 還可以把你的SQL語句打包成一個事務,這會比單獨執行他們快得多得多。

          目前,個人最喜歡的PHP的ORM是:Doctrine。

            21. 小心“永久鏈接”

          “永久鏈接”的目的是用來減少重新創建MySQL鏈接的次數。當一個鏈接被創建了,它會永遠處在連接的狀態,就算是數據庫操作已經結束了。而且,自 從我 們的Apache開始重用它的子進程后——也就是說,下一次的HTTP請求會重用Apache的子進程,并重用相同的 MySQL 鏈接。

          PHP手冊:mysql_pconnect()

          在理論上來說,這聽起來非常的不錯。但是從個人經驗(也是大多數人的)上來說,這個功能制造出來的麻煩事更多。因為,你只有有限的鏈接數,內存問題,文件句柄數,等等。

          而且,Apache 運行在極端并行的環境中,會創建很多很多的了進程。這就是為什么這種“永久鏈接”的機制工作地不好的原因。在你決定要使用“永久鏈接”之前,你需要好好地考慮一下你的整個系統的架構。

          轉自:
          http://3vke.com/2012/05/14/mysql%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E7%9A%8421%E4%B8%AA%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5/

          posted @ 2012-07-15 18:09 小胡子 閱讀(138) | 評論 (0)編輯 收藏

          一、起始之語

          我一直都是在PC上折騰網頁的,這會兒怎么風向周邊搗鼓起手機網頁開發呢?原因是公司原先使用Java開發的產品,耗了不少人力財力,但是最后的效果卻不怎么好。因為,Android系統一套東西,iPhone又是新的一套,折騰死人吶。

          于是總監發狠,讓我把手上的活都交出去,專心折騰web版的,看看最后效果如何。

          加上我覬覦手機上的開發學習很久了,于是,一拍即合,搞起了手機開發方面的學習。

          分享是很好的提高自身學習的方法。因為分享過程中梳理了所學,往往會有些意想不到的心得與收獲。如此利人利已的事情,自然樂意為之。于是,自己在文 章id > 2000 的這一歷史性時刻,新建了一個“mobile相關”的分類目錄,把移動相關的一些東西總結,整理,分享出去,大家共勉。

          二、我的選擇

          顯然,當下手機web開發移不開CSS3 + HTML5以及JavaScript。目前,也應運而生了很多開發的框架,有膠水層的,也有顯示層的(不羅列)。因為個人偏好以及篩選,決定使用PhoneGap實現與設備相機,通訊錄等交互,jQuery Mobile實現頁面UI的顯示以及相關交互。

          如果時間足夠,我想我會針對項目本身重新搞個更輕便靈活的交互框架。考慮到現實情況,還是決定使用他人的UI框架。

          下截圖為今兒個上午(2011-11-1 11:11)跑通的第一個PhoneGap下的Android手機程序:
          PhoneGap下Android第一個頁面程序效果展示截圖 張鑫旭-鑫空間-鑫生活

          不過PhoneGap是與膠水層打交道的東西,要說到這東西還需要些時日。我們可以先把目前投向與頁面顯示相關的UI框架上。例如,本文要說起的jQuery Mobile。

          三、我眼中的jQuery Mobile

          目前為止,jQuery Mobile的正式版還沒有出來,但是這并不妨礙對其的使用。官方首頁上說其代碼輕量(lightweight code)。可能跟Sencha Touch相比確實輕量。但是,在我看來(本身為框架的原因),其實代碼還是蠻啰嗦的(例如CSS文件min后有49K之多)。對于實際的項目而言,皮膚風格不可能幾種并存的,所以,其a~e的五種模板選擇實際有些多余,很多都是打醬油的命。

          而且,實際項目中的設計師設計東東的時候不可能是總是跟著jQuery Mobile的UI來的。因此,我們難免會碰到對其模板進行修改或是新添加的情況。

          不過,我可以確信的是,如果在個人網站或是其他一些非對外的中小項目上使用jQuery Mobile的話,一定會爽歪的!

          然后,還有一點我得承認。jQuery Mobile的上手可比Sencha Touch快多了。其UI顯示基本上就是基于HTML5的data-自定義屬性來的,跟它的老爸爸jQuery一樣,確實是write less, do more.

          頁面元素的UI顯示完全可以根據HTML代碼內容和屬性而來,不需要任何額外的JavaScript代碼或是CSS代碼,有模有樣的手機頁面效果就可以出爐。而且,要出效果頁面,你只要靜下心花個1整天的時間把官方的介紹文檔看一篇就可以了。真這么簡單。

          例如下面這個純顯示的頁面們(PC建議使用Chrome瀏覽器圍觀)。
          您可以狠狠地點擊這里:jQuery Mobile的UI展示頁面

          手機可以訪問以下地址:http://www.zhangxinxu.com/jq/mobile/

          這是在桌面版opera 10.1 mobile下的顯示效果:
          默認進入:
          demo頁面效果1 張鑫旭-鑫空間-鑫生活

          選擇“文章搜索”項 → 點擊搜索框后:
          demo頁面效果2 張鑫旭-鑫空間-鑫生活

          如果是在Android系統或是iPhone上,漸變效果,平滑切換效果都會顯露出來的。

          上面加起來差不多有10多個HTML頁面,搗鼓了幾個小時就出來的,當然是在無敵模式下。為什么快呢?因為基本上沒有動一點新的CSS代碼或是JavaScript代碼。直接write HTML即可。如果你對jQuery Mobile熟悉的話,可以更快。

          語義化
          要想使用jQuery Mobile,很重要的一點就是要注意語義化。到不是使用HTML5之類的標簽(考慮到漸進增強,jQuery Mobile使用的還是XHTML時代的標簽),而是div, p, ul ,li, h1~6等的使用。

          jQuery Mobile標簽下,不同的標簽所對應的UI效果很多都已經定死了。例如:

          <div data-role="header">     <h1>鑫空間-鑫生活</h1>     <a href="#" data-icon="arrow-r" data-iconpos="right">中文</a> </div>

          上面這段data-roleheader的div中,h1標簽不僅僅是個標題了,而是直接會修改當下頁面的title值,因此,上面幾行代碼對應的頁面的title就是“鑫空間-鑫生活”,即使你頭部的title寫的是“今天是小光棍節,呼啦啦~~”。

          而后面的a標簽文字雖然沒有指定data-role="button",但是,誰叫他生在data-role="header"的div下呢,于是,它就是個顯示按鈕的命。而且,JMobile自動將其定位到右側了。

          語義化的標簽決定了其位置,顯示等。確實方便,但是有所限制。可謂有利有弊。

          還有列表li標簽中的第一個圖片,會自動變成列表縮略圖等,好多好多,你試一下就會發現這東西還是挺有意思的。

          嘛,不過嗎,不用急,冰凍三尺非一日之寒,什么東西都是慢慢積累的。才剛開始,說多了未必是好。所以,本文就嘮叨這么多。

          轉自張鑫旭-鑫空間-鑫生活[http://www.zhangxinxu.com]

          posted @ 2012-07-14 22:47 小胡子 閱讀(6604) | 評論 (5)編輯 收藏

          本系列意在記錄Windwos線程的相關知識點,包括線程基礎、線程調度、線程同步、TLS、線程池等

           

          信號量內核對象

          信號量內核對象用來進行資源計數,它包含一個使用計數、最大資源數、當前資源計數。最大資源數表示信號量可以控制的最大資源數量,當前資源數表示信號當前可用的資源數量。

          設想一個場景:需要開發一個服務器進程,最多同時運行5個線程來響應客戶端請求,應該設計一個“線程池”。最開始的時候,5個線程都應該在等待狀 態,如果有一個客戶端請求到來,那么喚醒其中的一個線程以處理客戶端請求,如果同時的請求數量為5,那么5個線程將全部投入使用,再多的請求應該被放棄。 也就是說,隨著客戶端請求的增加,當前資源計數隨之遞減。

          我們可能需要這樣的一個內核對象來實現這個功能:初始化5個線程并同時等待一個內核對象觸發,當一個客戶端請求到來時,試圖觸發內核對象,這樣5個 線程中隨機一個被喚醒,并且自動使內核對象變為未觸發。外部判斷上限是否到達5。表面看來似乎用“自動重置的事件對象”即可實現這個功能啊,為什么要涉及 到信號量呢?因為信號量還可以控制一次喚醒多少個線程!!而且這個例子只是信號量的一個用途,后面我們會看到一個更實際的用途。

          總結一下,信號量內核對象是這樣的一種對象:它維護一個資源計數,當資源計數大于0,處于觸發狀態;資源計數等于0時,處于未觸發狀態;資源計數不可能小于0,也絕不可能大于資源計數上限。下圖展示了這種內核對象的特點:

          image

          如上圖,只有資源計數>0時才是觸發狀態,資源=0時為未觸發狀態,而WaitForSingleObject成功將遞減資源計數,調用ReleaseSemaphore將增加資源計數。

          下面兩個函數CreateSemaphoreCreateSemaphoreEx用于創建信號量對象:

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          HANDLE WINAPI CreateSemaphore(
            __in_opt  LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,//內核對象安全描述符
            __in      LONG lInitialCount,//資源計數的初始值
            __in      LONG lMaximumCount,//資源計數的最大值
            __in_opt  LPCTSTR lpName //內核對象命名
          );
           
          HANDLE WINAPI CreateSemaphoreEx(
            __in_opt    LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
            __in        LONG lInitialCount,
            __in        LONG lMaximumCount,
            __in_opt    LPCTSTR lpName,
            __reserved  DWORD dwFlags,
            __in        DWORD dwDesiredAccess
          );

          任何進程可以用OpenSemaphore來得到一個命名的信號量:

          1
          2
          3
          4
          5
          HANDLE WINAPI OpenSemaphore(
            __in  DWORD dwDesiredAccess,
            __in  BOOL bInheritHandle,
            __in  LPCTSTR lpName
          );

          線程通過調用ReleaseSemaphore來遞增資源計數,不一定每次只遞增1,可以設置遞增任意值。當將要超過資源上限值的時候,ReleaseSemaphore會返回FALSE。

          1
          2
          3
          4
          5
          BOOL WINAPI ReleaseSemaphore(
            __in       HANDLE hSemaphore,
            __in       LONG lReleaseCount,//可以設置遞增的值
            __out_opt  LPLONG lpPreviousCount//返回先前的資源計數
          );

           

          互斥量內核對象

          互斥量(mutex)用來確保一個線程獨占對一個資源的訪問。互斥量包含一個使用計數、線程ID和一個遞歸計數,互斥量與關鍵段的行為幾乎相同(因 為它記錄了線程ID和遞歸計數,使得互斥量可以支持遞歸調用的情況)。互斥量的規則十分簡單:如果線程ID為0(即沒有線程獨占它),那么它處于觸發狀 態,任何試圖等待該對象的線程都將獲得資源的獨占訪問;如果線程ID不為0,那么它處于未觸發狀態,任何試圖等待該對象的線程都將等待。

          可以使用CreateMutex或者CreateMutexEx創建互斥對象:

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          HANDLE WINAPI CreateMutex(
            __in_opt  LPSECURITY_ATTRIBUTES lpMutexAttributes,
            __in      BOOL bInitialOwner,//初始化對象的狀態,如果傳入FALSE則會初始化為觸發狀態,如果傳入TRUE,那么對象的線程ID會被設置成當前調用線程,并初始化為未觸發
            __in_opt  LPCTSTR lpName
          );
           
          HANDLE WINAPI CreateMutexEx(
            __in_opt  LPSECURITY_ATTRIBUTES lpMutexAttributes,
            __in_opt  LPCTSTR lpName,
            __in      DWORD dwFlags,
            __in      DWORD dwDesiredAccess
          );

          一如既往,OpenMutex用于打開一個已經命名的互斥量內核對象:

          1
          2
          3
          4
          5
          HANDLE WINAPI OpenMutex(
            __in  DWORD dwDesiredAccess,
            __in  BOOL bInheritHandle,
            __in  LPCTSTR lpName
          );

          線程在獲得對獨占資源的訪問權限之后,可以正常執行相關的邏輯,當需要釋放互斥對象的時候可以調用ReleaseMutex

          1
          2
          3
          BOOL WINAPI ReleaseMutex(
            __in  HANDLE hMutex
          );

          互斥量與其他內核對象不同,它會記錄究竟是哪個線程占用了共享資源,結合遞歸計數,同一個線程可以在獲得共享資源之后繼續訪問共享資源,這個行為就像關鍵段一樣。然而互斥量和關鍵段從本質上是不同的,關鍵段是用戶模式的線程同步方法,而互斥量是內核模式的線程同步方式。

           

          介紹完這兩個內核對象后,我們思考一下前面在【Windows】線程漫談——線程同步之Slim讀/寫鎖中 設計的一個場景:有一個共享的隊列,2個服務端線程負責讀取隊列中的條目以處理,2個客戶端線程負責寫入隊列中的條目以使服務先端線程處理,當隊列中沒有 條目的時候應當掛起服務端線程,直到有條目進入時才被喚醒,另一方面,當隊列已滿時,客戶端線程應當掛起直到服務端至少處理了一個條目,以釋放至少一個條 目的空間。

          現在我們來用信號量和互斥量來實現同樣的功能,下面的流程圖分別是客戶端寫入線程和服務端讀取線程的邏輯:

          1.首先創建一個互斥量對象m_hmtxQ,并初始化為未觸發狀態;之后創建一個信號量對象,并設置最大資源計數為隊列的長度,初始化資源計數為0,正好表征隊列元素的個數。

          1
          2
          m_hmtxQ = CreateMutex(NULL,FALSE,NULL);
          m_hsemNumElements = CreateSemaphore(NULL,0,nMaxElements,NULL);

          2.設計客戶端核心邏輯如下圖:

          image

          WatiForSingleObject:試圖獲得隊列的獨占訪問權限,對于這個隊列無論是讀還是寫都應該是線程獨占的。因此,使用互斥量對象來同步;

          ReleaseSemaphore:試圖增加一個資源計數,表征客戶端想要向隊列中增加一個元素,當然隊列可能現在已經滿了,對應的資源計數已達到 計數上限,此時ReleaseSemaphore會返回FALSE,這樣客戶端就不能像隊列中插入元素。反之,如果ReleaseSemaphore返回 TRUE,表示隊列沒有滿,客戶端可以向隊列中插入元素。

          ReleaseMutex:無論客戶端是否能夠像隊列中插入元素,在結束訪問后,都應該釋放互斥對象,以便其他線程能夠進入臨界資源。

          3.設計服務端核心邏輯如下圖:

          image

          WatiForSingleObject:試圖獲得隊列的獨占訪問權限,對于這個隊列無論是讀還是寫都應該是線程獨占的。因此,使用互斥量對象來同步;

          WaitForSingleObject(m_hsemNumElements…):試圖檢查信號量對象是否是觸發狀態。只有是觸發狀態的信號量對 象,線程才能進入;也就意味著:隊列中只要有元素(資源>0,觸發狀態),服務端就能讀取。反之,如果隊列中沒有元素(資源=0,未觸發狀態),服 務端將暫時不能訪問隊列,這時應該立即釋放Mutex。

          ReleaseMutex:無論客戶端是否能夠像隊列中插入元素,在結束訪問后,都應該釋放互斥對象,以便其他線程能夠進入臨界資源。



          原文:http://www.cnblogs.com/P_Chou/archive/2012/07/13/semaphore-and-mutex-in-thread-sync.html

          posted @ 2012-07-13 22:54 小胡子 閱讀(244) | 評論 (0)編輯 收藏

          僅列出標題
          共15頁: First 上一頁 7 8 9 10 11 12 13 14 15 下一頁 
          主站蜘蛛池模板: 大关县| 桂东县| 滨海县| 红河县| 达州市| 同江市| 定西市| 扎鲁特旗| 安宁市| 成安县| 莲花县| 宁化县| 临桂县| 鲁甸县| 廉江市| 临邑县| 乳山市| 大英县| 北流市| 吴川市| 孝昌县| 辽源市| 鄂尔多斯市| 荥经县| 盐城市| 虎林市| 外汇| 威远县| 靖宇县| 合山市| 文安县| 稻城县| 瑞安市| 清水县| 句容市| 武平县| 新蔡县| 姚安县| 宝鸡市| 皋兰县| 宁晋县|