1<!doctype html> 2<html class="theme-next use-motion "> 3<head> 4 5 6<meta charset="UTF-8"/> 7<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> 8<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/> 9 10 11<meta http-equiv="Cache-Control" content="no-transform" /> 12<meta http-equiv="Cache-Control" content="no-siteapp" /> 13 14 15 16 17 18 19 20 21 <link rel="stylesheet" type="text/css" href="/vendors/fancybox/source/jquery.fancybox.css?v=2.1.5"/> 22 23 24 25 26 <link href='//fonts.lug.ustc.edu.cn/css?family=Lato:300,400,700,400italic&subset=latin,latin-ext' rel='stylesheet' type='text/css'> 27 28 29 30<link rel="stylesheet" type="text/css" href="/vendors/font-awesome/css/font-awesome.min.css?v=4.4.0" /> 31 32<link rel="stylesheet" type="text/css" href="/css/main.css?v=0.4.5.2"/> 33 34 35 36 37 <meta name="keywords" content="Hexo,next" /> 38 39 40 41 42 43 <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico?v=0.4.5.2" /> 44 45 46<meta name="description"> 47<meta property="og:type" content="website"> 48<meta property="og:title" content="xbay"> 49<meta property="og:url" content="http://xbay.github.io/index.html"> 50<meta property="og:site_name" content="xbay"> 51<meta property="og:description"> 52<meta name="twitter:card" content="summary"> 53<meta name="twitter:title" content="xbay"> 54<meta name="twitter:description"> 55 56
57<script type="text/javascript" id="hexo.configuration"> 58 var CONFIG = { 59 scheme: '', 60 sidebar: 'post' 61 }; 62</script>
62 63 64 65 66 <title> xbay </title> 67</head> 68 69<body itemscope itemtype="http://schema.org/WebPage" lang="zh-Hans"> 70 71 <!--[if lte IE 8]> 72 <div style=' clear: both; height: 59px; padding:0 0 0 15px; position: relative;margin:0 auto;'> 73 <a href="http://windows.microsoft.com/en-US/internet-explorer/products/ie/home?ocid=ie6_countdown_bannercode"> 74 <img src="http://7u2nvr.com1.z0.glb.clouddn.com/picouterie.jpg" border="0" height="42" width="820" 75 alt="You are using an outdated browser. For a faster, safer browsing experience, upgrade for free today or use other browser ,like chrome firefox safari." 76 style='margin-left:auto;margin-right:auto;display: block;'/> 77 </a> 78 </div> 79<![endif]--> 80 81 82 83 84 85 86 87 <div class="container one-column 88 page-home 89"> 90 <div class="headband"></div> 91 92 <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader"> 93 <div class="header-inner"><div class="site-meta "> 94 95 96 <div class="custom-logo-site-title"> 97 <a href="/" class="brand" rel="start"> 98 <span class="logo-line-before"><i></i></span> 99 <span class="site-title"></span> 100 <span class="logo-line-after"><i></i></span> 101 </a> 102 </div> 103 <p class="site-subtitle"></p> 104</div> 105 106<div class="site-nav-toggle"> 107 <button> 108 <span class="btn-bar"></span> 109 <span class="btn-bar"></span> 110 <span class="btn-bar"></span> 111 </button> 112</div> 113 114<nav class="site-nav"> 115 116 117 118 <ul id="menu" class="menu "> 119 120 121 <li class="menu-item menu-item-home"> 122 <a href="/" rel="section"> 123 124 <i class="menu-item-icon fa fa-home"></i> <br /> 125 126 é¦é¡µ 127 </a> 128 </li> 129 130 131 <li class="menu-item menu-item-archives"> 132 <a href="/archives" rel="section"> 133 134 <i class="menu-item-icon fa fa-archive"></i> <br /> 135 136 彿¡£ 137 </a> 138 </li> 139 140 141 <li class="menu-item menu-item-tags"> 142 <a href="/tags" rel="section"> 143 144 <i class="menu-item-icon fa fa-tags"></i> <br /> 145 146 æ ç¾ 147 </a> 148 </li> 149 150 151 152 153 </ul> 154 155 156 157</nav> 158 </div> 159 </header> 160 161 <main id="main" class="main"> 162 <div class="main-inner"> 163 <div id="content" class="content"> 164 <section id="posts" class="posts-expand"> 165 166 167 168 169 170 171 <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article"> 172 173 174 <header class="post-header"> 175 176 177 178 <h1 class="post-title" itemprop="name headline"> 179 180 181 182 <a class="post-title-link" href="/2016/04/19/shadowsocks_proxychainsNG_iterms2/" itemprop="url"> 183 ShadowSocks+ProxyChains-NG å®ç°ç»ç«¯(iTerm2)ä¸ä»£ç 184 </a> 185 186 187 </h1> 188 189 190 <div class="post-meta"> 191 <span class="post-time"> 192 åè¡¨äº 193 <time itemprop="dateCreated" datetime="2016-04-19T08:31:15+08:00" content="2016-04-19"> 194 2016-04-19 195 </time> 196 </span> 197 198 199 200 201 <span class="post-time"> 202 | 203 204 <span itemprop="name">mac.meng</span> 205 206 207 208 </span> 209 210 211 212 213 214 215 <span class="post-comments-count"> 216 | 217 <a href="/2016/04/19/shadowsocks_proxychainsNG_iterms2/#comments" itemprop="discussionUrl"> 218 <span class="post-comments-count disqus-comment-count" data-disqus-identifier="2016/04/19/shadowsocks_proxychainsNG_iterms2/" itemprop="commentsCount"></span> 219 </a> 220 </span> 221 222 223 224 225 226 </div> 227 </header> 228 229 230 231 <div class="post-body"> 232 233 234 235 236 237 238 <span itemprop="articleBody"> 239 240 <p><a href="https://segmentfault.com/a/1190000004607285" target="_blank" rel="external">åèåæ</a></p> 241<h3 id="å®è£ "><a href="#å®è£ " class="headerlink" title="å®è£ "></a>å®è£ </h3><p>
241ä½¿ç¨ Homebrew å®è£ proxychains-ng<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">~ $ brew install proxychains-ng</span><br></pre></td></tr></table></figure></p> 242<h3 id="ç¼è¾é ç½®æä»¶"><a href="#ç¼è¾é ç½®æä»¶" class="headerlink" title="ç¼è¾é ç½®æä»¶"></a>ç¼è¾é ç½®æä»¶</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vim /usr/local/etc/proxychains.conf</span><br></pre></td></tr></table></figure> 243<p>å¨ [ProxyList] ä¸é¢ï¼ä¹å°±æ¯æ«å°¾ï¼å å ¥ä»£çç±»åï¼ä»£çå°åå端å£<br>注éæåæ¥ç代çå¹¶æ·»å , 1080 å°±æ¯é»è®¤çshadowSocks æ¬å°ä»£ç端å£å·,</p> 244<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">socks5 127.0.0.1 1080</span><br></pre></td></tr></table></figure> 245<p>妿æçè½¯ä»¶æ¯æsocks5代ç, æ¯å¦ <strong>dropbox</strong> ,å¯ä»¥ç´æ¥è®¾ç½®, </p> 246<blockquote> 247<p>æä»¬å¨è¿éæè¿ä¹å¤é£æºå°±æ¯å 为, iTerm2 䏿¯æé 置代ç,èä¸å°±ç®ä½ å¨ç³»ç»è®¾ç½®äºä¹ä¸ç®¡ç¨.</p> 248</blockquote> 249<p>妿æå¨çç½ç»å¾å¤æï¼å¯è½éè¦å¨é ç½®æä»¶ä¸å¯ç¨<br>dynamic_chain - æç §å表ä¸åºç°ç代çæå¡å¨çå å顺åºç»æä¸æ¡é¾ï¼å¦ææä»£çæå¡å¨å¤±æï¼åèªå¨å°å ¶æé¤ï¼ä½è³å°è¦æä¸ä¸ªæ¯ææç<br>ç¶åå¨ [ProxyList] 䏿·»å å¤ä¸ªä»£ç<br>é»è®¤ï¼strict_chain - æç §åé¢å表ä¸åºç°ç代çæå¡å¨çå å顺åºç»æä¸æ¡é¾ï¼è¦æ±ææç代çæå¡å¨é½æ¯ææç</p> 250<h3 id="æµè¯"><a href="#æµè¯" class="headerlink" title="æµè¯"></a>æµè¯</h3><p> proxychains4 curl google.com<br>注æï¼proxychainsæ¯æçæ¯socksï¼http, httpsåè®®.å®ä»¬ä»¥tcpæè udpå议为åºç¡, pingå½ä»¤ç¨çæ¯ ICMP åè®®ï¼ proxychains 䏿¯æ;</p> 251<h3 id="ä¼å"><a href="#ä¼å" class="headerlink" title="ä¼å"></a>ä¼å</h3><p>alias å½ä»¤å«å<br>ç´æ¥å¨å½ä»¤è¡ä¸è¾å ¥</p> 252<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">~ $ alias pc="proxychains4â</span><br></pre></td></tr></table></figure> 253<p>iTermä¸åç¼è¡¥å ¨<br>ä½ è¾äºå¾é¿ä¸æ®µå½ä»¤ï¼ç¶åä½ çªç¶æ³ä½¿ç¨ä»£çåè½ï¼æä¹åï¼<br>ææ³ä½ åºè¯¥ä¼å¤å¶ä¸ä¸ï¼ç¶åéåï¼<br>ç°å¨ä½ å¯ä»¥è¿æ ·åï¼</p> 254<p>å¨ iTerm -> Preferences -> Profiles -> Keys ä¸ï¼æ°å»ºä¸ä¸ªå¿«æ·é®ï¼ä¾å¦ â¥(alt) + p ï¼Action éæ© Send Hex Codeï¼é®å¼ä¸º 0x1 0x70 0x63 0x20 0xdï¼ä¿åçæãè¿ä¸ª HexCode ç¨ <a href="http://www.rapidtables.com/convert/number/hex-to-ascii.htm" target="_blank" rel="external">hexCodeToAsciiText</a> å°±æ¯ âpcâä¸¤ä¸ªåæ¯</p> 255<p>以åå½ä»¤è¦ä»£çå°±ç´æ¥æ²å½ä»¤ï¼ç¶å ⥠+ p å³å¯ï¼è¿æ ·å½ä»¤è¡¥å ¨ä¹è½ä¿çäºã<br>æ¯å¦ git clone, npm install å éçç.</p> 256<h3 id="æ¨è-ç¦å©"><a href="#æ¨è-ç¦å©" class="headerlink" title="æ¨è(ç¦å©)"></a>æ¨è(ç¦å©)</h3><p>æåæ¨èä¸ä¸ªä¸è½½è§é¢çç¥å¨ <a href="https://github.com/soimort/you-get" target="_blank" rel="external">you-get</a>å¯ä»¥ä¸è½½å½å å¤ä¸»æµçè§é¢ç½ç«çè§é¢,made by python3. ä¹å¯ä»¥é ç½® proxychains4使ç¨</p> 257<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">~ $ pc you-get https://www.youtube.com/watch?v=fwoDwajwqdo</span><br></pre></td></tr></table></figure> 258<h3 id="è°å¢"><a href="#è°å¢" class="headerlink" title="è°å¢"></a>è°å¢</h3><p>å ³äºä½¿ç¨shadowSocks æ¶,dnsæ¯ä¸æ¯ä¸èµ·èµ°äºä»£çäº,è¿éé¢è¿æå¾å¤ç½ç»ç¥è¯ä¸æ¯ç¹å«æç½</p> 259 260 261 </span> 262 263 264 </div> 265 266 <footer class="post-footer"> 267 268 269 270 271 272 273 <div class="post-eof"></div> 274 275 </footer> 276 </article> 277 278 279 280 281 282 283 284 285 <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article"> 286 287 288 <header class="post-header"> 289 290 291 292 <h1 class="post-title" itemprop="name headline"> 293 294 295 296 <a class="post-title-link" href="/2016/03/31/React-Native-NativeComponent/" itemprop="url"> 297 ReactNative-NativeComponent -- 1. 宿¹æå¼ 298 </a> 299 300 301 </h1> 302 303 304 <div class="post-meta">
305 <span class="post-time"> 306 åè¡¨äº 307 <time itemprop="dateCreated" datetime="2016-03-31T12:03:15+08:00" content="2016-03-31"> 308 2016-03-31 309 </time> 310 </span> 311 312 313 314 315 <span class="post-time"> 316 | 317 318 <span itemprop="name">mac.meng</span> 319 320 321 322 </span> 323 324 325 326 327 328 329 <span class="post-comments-count"> 330 | 331 <a href="/2016/03/31/React-Native-NativeComponent/#comments" itemprop="discussionUrl"> 332 <span class="post-comments-count disqus-comment-count" data-disqus-identifier="2016/03/31/React-Native-NativeComponent/" itemprop="commentsCount"></span> 333 </a> 334 </span> 335 336 337 338 339 340 </div> 341 </header> 342 343 344 345 <div class="post-body"> 346 347 348 349 350 351 352 <span itemprop="articleBody"> 353 354 <h2 id="Native-Module-åºæ¬å为两ç§"><a href="#Native-Module-åºæ¬å为两ç§" class="headerlink" title="Native-Module åºæ¬å为两ç§"></a>Native-Module åºæ¬å为两ç§</h2><ul> 355<li>å¯è§çModule. (æ¾ç¤º,åçå¨ç»)<br>View æ¬èº«ç»§æ¿èªRCTView,妿æ³è¦å¨JSä¸ä½¿ç¨,éè¦åå®ç°ä¸ä¸ª Manager</li> 356<li>ä¸å¯è§çModule. (æ°æ®,ç½ç»,modeling)<br>éè¦å®ç° <rctbridgemodule>delegate</rctbridgemodule></li> 357</ul> 358<p>ä»å¤©æä»¬æ¥è®²è®²ç¬¬äºç§ä¸å¯è§çModule</p> 359<h3 id="Module-å-methodçå ³ç³»"><a href="#Module-å-methodçå ³ç³»" class="headerlink" title="Module å methodçå ³ç³»"></a>Module å methodçå ³ç³»</h3><h4 id="One-Module"><a href="#One-Module" class="headerlink" title="One Module"></a>One Module</h4><blockquote> 360<p>-> MethodA<br>-> MethodB<br>â¦<br>-> MethodN</p> 361</blockquote> 362<h3 id="宿¹æå¼"><a href="#宿¹æå¼" class="headerlink" title="宿¹æå¼"></a><a href="http://facebook.github.io/react-native/docs/native-modules-ios.html#content" target="_blank" rel="external">宿¹æå¼</a></h3><ol> 363<li>æ£å¸¸çåæ°, ææjsonæ ¼å¼çåæ°<br>èä¸æä¸ªå¼ºå¤§çUtil RCTConvert.h ä»åä½,é¢è²,string,numberé½å¯ä»¥è½¬æ¢</li> 364<li>æ¯æåè° callback, å¯ä»¥ä¼ functionè¿å»<br>åçç±»åæ¯ RCTResponseSenderBlock<br>åä¼ å齿¯ ç¨RCT_EXPORT_METHOD 声æ</li> 365<li><p>æ¯æPromise<br>使¯éè¦ç¨å° RCT_REMAP_METHOD 声æ,åè¾ å©ä¸¤ä¸ªblock<br>RCTPromiseResolveBlock/ RCTPromiseRejectBlock<br>JS å±é¢ ç¨ ES2016 <strong>async/await</strong> å»å, è¿ä¸ªéè¦çä¸ä¸</p> 366</li> 367<li><p>æ¥ä¸æ¥è®²å¤çº¿ç¨<br>methodQueue æ¯å¨ä¸ä¸ªModuleä¸çææmethodå ±äº«ç, è¦ä¹è¿ä¸ªmoduleæ¯å¨ä¸»çº¿ç¨ä¸æ§è¡,è¦ä¹å°±æ¯å¨æä¸ªçº¿ç¨ä¸æ§è¡. èä¸å¤§å®¶å¯ä»¥å ±äº«è¿ä¸ªçº¿ç¨<br>妿ææä¸ä¸ªæ¹æ³éè¦åç¬å¨æ°ç线ç¨ä¸æ§è¡æä¹å,æ¯å¦ç¸å¯¹èæ¶çåå¨çç.æå¯ä»¥å¨æ¹æ³éé¢ ç¨dispatch_asyncå ä¸ä¸æ§è¡ä»£ç ,æ§è¡å®ä¹åå¯ä»¥ç¨ 2.é颿å°çcallbackéç¥å¤é¢<br>æåæå°äº å¨ä¸åçModuleä¸å ±äº«çº¿ç¨,æ¯è¾é«æ·±</p> 368</li> 369<li><p>导åºå¸¸é<br>è¿åDictionaryçnative method å¨åå§åçæ¶å宿èµå¼,è¿è¡æ¶çæ¶ååæ¹åä»,js乿¿ä¸å°ææ°çå¼.<br>å¦æè¦æä¸¾å¸¸é,ä»å»ºè®®æ°å»ºä¸ä¸ªRCTConvertçextension</p> 370</li> 371<li>åJSåéEvent<br>å¦ä½ä½¿ç¨ bridge.eventDispatcher, å¦ä½å¨native send 以åå¦ä½å¨JS subscription. è¿æ ·Native ä¹å¯ä½ç¨å¨JSä¸äº,è¿æ¯é¤äº callbackçå¦ä¸ç§å®ç°.<br>éç¨çæ¯è§å¯è 模å¼. 妿æ³ç¨JSä½ç¨å¨Nativeä¸ç´æ¥è°åNative ç¨RCT_EXPORT_METHOD æ´é²åºæ¥ç彿°å°±å¥½äº,åç§åè°,promise,sender伺åä½ .</li> 372</ol> 373<p>è¿é夿°ä¸å¥,æä»¬å¨OCé常ç¨çä¼ éæ¶æ¯çæ¹å¼æå¾å¤ KVO,Delegate,Block. è¿æé«é¼æ ¼çNSOperation,GCD çç.åºæ¬ä¸RNé½ç¨äº.å¯è§facebookçåçååè¿æ¯æ¯è¾æ·±åç</p> 374<ol> 375<li>æåæå°äºå¦ä½å¨swift ç¨RN,ç¶å¹¶åµ.</li> 376</ol> 377<h3 id="RN-ReactNative"><a href="#RN-ReactNative" class="headerlink" title="RN = ReactNative"></a>RN = ReactNative</h3><p>ââââ</p> 378<h4 id="æå ´è¶£çåå¦å¯ä»¥è¯»ä¸ä¸å ·ä½-Module-å-Method-çåçå®ç°"><a href="#æå ´è¶£çåå¦å¯ä»¥è¯»ä¸ä¸å ·ä½-Module-å-Method-çåçå®ç°" class="headerlink" title="æå ´è¶£çåå¦å¯ä»¥è¯»ä¸ä¸å ·ä½ Module å Method çåçå®ç°"></a>æå ´è¶£çåå¦å¯ä»¥è¯»ä¸ä¸å ·ä½ Module å Method çåçå®ç°</h4><blockquote> 379<p>å ³äºBridgeçä¸ç¯facebookç<a href="http://tadeuzagallo.com/blog/react-native-bridge/" target="_blank" rel="external">å é¨åæ</a><br>å¦ä½ä¼åRNAppæ§è½ç<a href="https://code.facebook.com/posts/895897210527114/dive-into-react-native-performance/" target="_blank" rel="external">宿¹ä»ç»</a></p> 380</blockquote> 381<h4 id="next"><a href="#next" class="headerlink" title="next"></a>next</h4><p>ä¸ä¸é¨ååå¤æç §å®æ¹çæå¼åä¸ä¸ªDemo æè¿äºç¹ä¼ èµ·æ¥</p> 382 383 384 </span> 385 386 387 </div> 388 389 <footer class="post-footer"> 390 391 392 393 394 395 396 <div class="post-eof"></div> 397 398 </footer> 399 </article> 400 401 402 403 404 405 406 407 408 <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article"> 409 410 411 <header class="post-header"> 412 413 414 415 <h1 class="post-title" itemprop="name headline"> 416 417 418 419 <a class="post-title-link" href="/2016/02/26/scalaz_optionT/" itemprop="url"> 420 ç¨scalazçoptionT让ä¸å¡ä»£ç å徿´ç®æ´ 421 </a> 422 423 424 </h1> 425 426 427 <div class="post-meta">
428 <span class="post-time"> 429 åè¡¨äº 430 <time itemprop="dateCreated" datetime="2016-02-26T23:19:50+08:00" content="2016-02-26"> 431 2016-02-26 432 </time> 433 </span> 434 435 436 437 438 <span class="post-time"> 439 | 440 441 <span itemprop="name">uni.x.bell</span> 442 443 444 445 </span> 446 447 448 449 450 451 452 <span class="post-comments-count"> 453 | 454 <a href="/2016/02/26/scalaz_optionT/#comments" itemprop="discussionUrl"> 455 <span class="post-comments-count disqus-comment-count" data-disqus-identifier="2016/02/26/scalaz_optionT/" itemprop="commentsCount"></span> 456 </a> 457 </span> 458 459 460 461 462 463 </div> 464 </header> 465 466 467 468 <div class="post-body"> 469 470 471 472 473 474 475 <span itemprop="articleBody"> 476 477 <p>scalaé使ç¨Optionç±»åæ¥å°è£ ä¸ä¸ªå¯è½ä¸ºnullçå¼ç¨ï¼åJavaå¼ç¨ç¸æ¯ï¼å®é¿å äºç´æ¥æä½nullå¼åçå¼å¸¸ãä¸è¬æ¥è¯´å¯ä»¥ç¨switch/caseæ¥å¤çOptionï¼æ¯å¦è¦æä¸ä¸ªInt对象转æä¸ä¸ªString对象ï¼<br><figure class="highlight scala"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">f</span></span>(p: <span class="type">Option</span>[<span class="type">Int</span>]): <span class="type">Option</span>[<span class="type">String</span>] = {</span><br><span class="line"> p <span class="keyword">match</span> {</span><br><span class="line"> <span class="keyword">case</span> <span class="type">Some</span>(i) => i.toString</span><br><span class="line"> <span class="keyword">case</span> <span class="type">None</span> => <span class="type">None</span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p> 478<p>åJavaé夿å¼ç¨æ¯å¦ä¸ºç©ºç代ç å ¶å®æ¯ç±»ä¼¼çï¼ä¸è¿Optionçå°è£ ä¿è¯äºç¨åºåä¸ä¼å¿è®°å¤çç©ºçæ åµï¼ï¼é¤éç¨åºå使ç¨getåå¼ï¼é叏䏿¨èè¿æ ·åï¼<br><figure class="highlight scala"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">p.get.toString</span><br></pre></td></tr></table></figure></p> 479<p>è·Java䏿 ·ï¼è¿æ ·å代ç å¾å®¹ææ¶è·ä¸ä¸ªç©ºå¼ç¨å¼å¸¸ã<br>ä¸è¿éè¿Optionçmap彿°è½æä»£ç åå¾è·ç¨getæ±å¼ä¸æ ·ç®æ´ï¼è¿ä¸ä¼å¼å空å¼ç¨å¼å¸¸ã<br><figure class="highlight scala"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">f</span></span>(p: <span class="type">Option</span>[<span class="type">Int</span>]): <span class="type">Option</span>[<span class="type">String</span>] = p.map(_.toString)</span><br></pre></td></tr></table></figure></p> 480<p>map彿°åªå¨Option为Some()çæ¶åè°ç¨ä¼ å ¥ç彿°ï¼ä¹å°±æ¯è¯´ï¼Noneè¢«ç´æ¥âçè·¯âå°è¾åºäºï¼è¿å¯¹äºå¤§é¨åæ åµé½æ¯éç¨çã</p> 481<hr> 482<p>scalaéç¨Futureæ¥å°è£ IOæä½ï¼ä»£è¡¨âæªæ¥å¯è½ä¼è·å¾æä¸ªå¼âãæ¯å¦åèµ·ä¸ä¸ªHTTPè¯·æ±æè è®¿é®æ°æ®åºï¼å½æ°ä¼è¿åä¸ä¸ªFutureï¼åOptionæç¹ç±»ä¼¼ï¼Futureä¹æä¿©ç¶æï¼ä¸ä¸ªæ¯æåä¸ä¸ªæ¯å¤±è´¥ãæä»¥å¸¸ç¨çæ¹æ³ä¹æ¯mapã<br><figure class="highlight scala"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">f</span></span>(p: <span class="type">Future</span>[<span class="type">Int</span>]): <span class="type">Future</span>[<span class="type">String</span>] = p.map(_.toString)</span><br></pre></td></tr></table></figure></p> 483<p>å½IOæåçæ¶åï¼è·å¾çå¼ä¼è¢«ç¨ååæ°ï¼è°ç¨mapéä¼ å ¥ç彿°ï¼å¤±è´¥åç´æ¥âçè·¯âå°è¾åºã<br>æä»¬è¿å¯ä»¥ç¨flatMapç®åçæIOâ串èâèµ·æ¥ï¼<br><figure class="highlight scala"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">readById</span></span>(id: <span class="type">Int</span>): <span class="type">Future</span>[<span class="type">String</span>
483] = ...</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">readByName</span></span>(name: <span class="type">String</span>): <span class="type">Future</span>[<span class="type">Result</span>] = ...</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">getResult</span></span>(p: <span class="type">Future</span>[<span class="type">Int</span>]): <span class="type">Future</span>[<span class="type">Result</span>] = p.flatMap(id => {</span><br><span class="line"> readById(id).flatMap(name => {</span><br><span class="line"> readByName(name)</span><br><span class="line"> })</span><br><span class="line">})</span><br></pre></td></tr></table></figure></p> 484<p>è¿ä¹åå¨å½¢å¼ä¸æä¸ªå¼±ç¹ï¼ç±»ä¼¼åè°å½æ°ï¼æ¯æ¬¡ä¸²èé½ä¼å¸¦æ¥ä¸å±ç¼©è¿ï¼å½±åå¯è¯»æ§ãscalaæä¾äºforæ¥å¤çè¿ä¸ªé®é¢ï¼ä¸é¢è¿æ®µä»£ç åä¸é¢çå¤å±flatMapæ¯çä»·çï¼<br><figure class="highlight scala"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">readById</span></span>(id: <span class="type">Int</span>): <span class="type">Future</span>[<span class="type">String</span>] = ...</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">readByName</span></span>(name: <span class="type">String</span>): <span class="type">Future</span>[<span class="type">Result</span>] = ...</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">getResult</span></span>(p: <span class="type">Future</span>[<span class="type">Int</span>]): <span class="type">Future</span>[<span class="type">Result</span>] = <span class="keyword">for</span> {</span><br><span class="line"> id <- p</span><br><span class="line"> name <- readById(id)</span><br><span class="line"> result <- readByName(name)</span><br><span class="line">} <span class="keyword">yield</span>(result)</span><br></pre></td></tr></table></figure></p> 485<hr> 486<p>ä¸è¿çå®ä¸çéç代ç ä¼ç¨å¾®å¤æä¸äºï¼æä»¬ç»å¸¸ä¼æ··ç¨FutureåOptionï¼æå¸¸è§çæ¯IOè¿åç对象éï¼æäºå±æ§å¯è½ä¸ºç©ºï¼æä»¬ç¨Optionæ¥è¡¨ç¤ºè¿äºå±æ§çè¯ï¼æå³ç代ç é»è¾éä¼åºç°Future[Option[T]]è¿æ ·çç±»åãæä»¬å½ç¶å¯ä»¥å¨Futureçmap/flatMapéç¨match/caseæ¥åé»è¾ï¼å ¶å®ä¹æ¯è¾æ¸ æ°ï¼ä½æ¯ç¼©è¿ç屿°ä¼æ¯è¾å¤ï¼å½±åå¯è¯»æ§ãæ¥ç䏿®µå®é çä¾åï¼è¿æ¯ä»çå®ä¸ççä¸å¡ä»£ç éæ·è´/ç²è´´åºæ¥çï¼<br><figure class="highlight scala"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">cityCodeFriendly</span></span>(term: <span class="type">Option</span>[<span class="type">String</span>]): <span class="type">Future</span>[<span class="type">Option</span>[<span class="type">JsValue</span>]] = {</span><br><span class="line"> term <span class="keyword">match</span> {</span><br><span class="line"> <span class="keyword">case</span> <span class="type">Some</span>(cityCode) => {</span><br><span class="line">
486 <span class="type">AreaService</span>.findOneByCode(cityCode) flatMap { cityOption =></span><br><span class="line"> cityOption <span class="keyword">match</span> {</span><br><span class="line"> <span class="keyword">case</span> <span class="type">Some</span>(city) => {</span><br><span class="line"> <span class="type">AreaService</span>.findOneByCode(city.parentCode.getOrElse(<span class="string">""</span>)) map { provinceOption =></span><br><span class="line"> provinceOption <span class="keyword">match</span> {</span><br><span class="line"> <span class="keyword">case</span> <span class="type">Some</span>(province) => {</span><br><span class="line"> <span class="type">Some</span>(<span class="type">JsObject</span>(<span class="type">Seq</span>(<span class="string">"provinceName"</span> -> <span class="type">JsString</span>(province.name.getOrElse(<span class="string">""</span>)),</span><br><span class="line"> <span class="string">"cityName"</span> -> <span class="type">JsString</span>(city.name.getOrElse(<span class="string">""</span>)),</span><br><span class="line"> <span class="string">"cityCode"</span> -> <span class="type">JsString</span>(cityCode))))</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">case</span> <span class="type">None</span> => <span class="type">None</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">case</span> <span class="type">None</span> => <span class="type">Future</span>(<span class="type">None</span>)</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">case</span> <span class="type">None</span> => <span class="type">Future</span>(<span class="type">None</span>)</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p> 487<p>代ç é»è¾è¿æ¯æ¯è¾æ¸ æ°çï¼ä¼ å ¥ä¸ä¸ªåå¸idï¼å¯è½ä¸ºç©ºï¼ï¼ç¶å仿°æ®åºé便¬¡è¯»ååå¸çåç§°åæå±ç份çåç§°ï¼æåæç»æç»è£ æä¸ä¸ªjson对象è¾åºï¼åªè¦ä¸é´æä¸æ¥è¯»å°ç©ºå¼ï¼å°±è¾åºä¸ä¸ªç©ºçjson对象ã代ç 飿 ¼çèµ·æ¥æä¸¤ä¸ªé®é¢ï¼ä¸æ¯ç¼©è¿å¤ªå¤ï¼ç¬¬äºæ¯case None => Noneçèµ·æ¥å¾å¤ä½ã<br>è¯è¯ç¨OptionçflatMapæ¥æ¹é ä¸ä¸ï¼å¾å°å¦ä¸ç代ç ï¼<br><figure class="highlight scala"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">cityCodeFriendly</span></span>(term: <span class="type">Option</span>[<span class="type">String</span>]): <span class="type">Future</span>[<span class="type">Option</span>[<span class="type">JsValue</span>]] = {</span><br><span class="line"> term.map(cityCode => {</span><br><span class="line"> <span class="type">AreaService</span></span><br><span class="line"> .findOneByCode(cityCode)</span><br><span class="line"> .flatMap(cityOption => {</span><br><span class="line"> cityOption.map(city => {</span><br><span class="line"> city.parentCode.map(parentCode => {</span><br><span class="line">
487 <span class="type">AreaService</span>.findOneByCode(parentCode).map(provinceOption => {</span><br><span class="line"> provinceOption.map(province =></span><br><span class="line"> <span class="type">JsObject</span>(<span class="type">Seq</span>(<span class="string">"provinceName"</span> -> <span class="type">JsString</span>(province.name.getOrElse(<span class="string">""</span>)),</span><br><span class="line"> <span class="string">"cityName"</span> -> <span class="type">JsString</span>(city.name.getOrElse(<span class="string">""</span>)),</span><br><span class="line"> <span class="string">"cityCode"</span> -> <span class="type">JsString</span>(cityCode))))</span><br><span class="line"> })</span><br><span class="line"> }).getOrElse(<span class="type">Future</span>(<span class="type">None</span>))</span><br><span class="line"> }).getOrElse(<span class="type">Future</span>(<span class="type">None</span>))</span><br><span class="line"> })</span><br><span class="line"> }).getOrElse(<span class="type">Future</span>(<span class="type">None</span>))</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p> 488<p>çèµ·æ¥æ´ç³ç³äºï¼FutureçflatMapåªè½åFuture级èï¼OptionçflatMapåªè½åOptionç级èï¼æä»¥ä¸¤è é½ç¨flatMapå ¶å®å¹¶æ 好å¤ï¼åèéè¦ç¨.getOrElse(Future(None))æ¥å¤çåæ¯çæ å½¢ï¼æ¯switch/caseæ´ä¸æ¸ æ°ï¼ç¼©è¿åªæ¯ç¥å°ï¼æ»ä½æ¥è¯´å¾ä¸å¿å¤±ã<br>å 为FutureåOptionçflatMapäºç¸ä¸è½çº§èï¼æä»¥æä»¬æ²¡åç¨foræå®ä»¬ä¸²èèµ·æ¥ï¼ççflatMapåæ³éçgetOrElseå°±ç¥éäºã<br>使¯ä»é»è¾ä¸æ¥è¯´ï¼åºè¯¥åå¨ä¸ç§æ¹æ³ï¼è½æFutureåOption串起æ¥ï¼ä¸é´åªè¦æFuture.failureå°±çè·¯å°Future.failureï¼åªè¦æFuture(None)å°±çè·¯å°Future(None)ï¼è¿æ¯ä¸ä¸ªå¾æºæ¢°çé»è¾ï¼ç¼è¯å¨åºè¯¥è½å¤çã<br>scalazæä¾çoptionT彿°ï¼å°±è½åå°è¿ä¸ç¹ãæ¹é åå®ç°çèµ·æ¥æ¸ ç½å¤äºï¼<br><figure class="highlight scala"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">cityCodeFriendly</span></span>(term: <span class="type">Option</span>[<span class="type">String</span>]): <span class="type">Future</span>[<span class="type">Option</span>[<span class="type">JsValue</span>]] = {</span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">wrapCityCode</span></span>: <span class="type">Future</span>[<span class="type">Option</span>[<span class="type">String</span>]] = <span class="type">Future</span>(term)</span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">wrapJsObject</span></span>(province: <span class="type">Area</span>, city:<span class="type">Area</span>, cityCode: <span class="type">String</span>): <span class="type">Future</span>[<span class="type">Option</span>[<span class="type">JsValue</span>]] = </span><br><span class="line"> <span class="type">Future</span>(<span class="type">Some</span>(<span class="type">JsObject</span>(<span class="type">Seq</span>(</span><br><span class="line"> <span class="string">"provinceName"</span> -> <span class="type">JsString</span>(province.name.getOrElse(<span class="string">""</span>)),</span><br><span class="line"> <span class="string">"cityName"</span> -> <span class="type">JsString</span>(city.name.getOrElse(<span class="string">""</span>)),</span><br><span class="line">
488 <span class="string">"cityCode"</span> -> <span class="type">JsString</span>(cityCode)))))</span><br><span class="line"> </span><br><span class="line"> (<span class="keyword">for</span> {</span><br><span class="line"> cityCode <- optionT(wrapCityCode)</span><br><span class="line"> city <- optionT(<span class="type">AreaService</span>.findOneByCode(cityCode))</span><br><span class="line"> parentCode <- optionT(<span class="type">Future</span>(city.parentCode))</span><br><span class="line"> province <- optionT(<span class="type">AreaService</span>.findOneByCode(parentCode))</span><br><span class="line"> res <- optionT(wrapJsObject(province, city, cityCode))</span><br><span class="line"> } <span class="keyword">yield</span> res).run</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p> 489<p>optionT彿°æ¥æ¶ä¸ä¸ªFuture[Option[T]]ç±»åï¼è¿åä¸ä¸ªå°è£ 好çOptionTç±»åï¼OptionTç±»åç¸å½äºâæ··åâäºFutureåOptionçç¹æ§ï¼å®æä¾äºmap/flatMap彿°ï¼åªé对æåå¹¶æå¼çæ åµè°ç¨ä¼ å ¥ç彿°ï¼å¦åç´æ¥âçè·¯âå°è¾åºãè¿æ ·çåæ³ä¸ä½è®©ä
489»£ç åå¾ç®æ´ï¼å¹³æ¿çç»æï¼å¾å°ç缩è¿ï¼ï¼èä¸å¨ç¼åè¿ç¨ä¸ä¸éè¦åå»å ³æ³¨é误å¤çï¼ä¸éè¦åå å ¥case None => None æè getOrElseä¹ç±»çç©æäºï¼ã</p> 490 491 492 </span> 493 494 495 </div> 496 497 <footer class="post-footer"> 498 499 500 501 502 503 504 <div class="post-eof"></div> 505 506 </footer> 507 </article> 508 509 510 511 512 513 514 515 516 <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article"> 517 518 519 <header class="post-header"> 520 521 522 523 <h1 class="post-title" itemprop="name headline"> 524 525 526 527 <a class="post-title-link" href="/2016/02/26/sortInScala/" itemprop="url"> 528 åºæ¬æåºç®æ³çScalaå®ç° 529 </a> 530 531 532 </h1> 533 534 535 <div class="post-meta"> 536 <span class="post-time"> 537 åè¡¨äº 538 <time itemprop="dateCreated" datetime="2016-02-26T13:26:00+08:00" content="2016-02-26"> 539 2016-02-26 540 </time> 541 </span> 542 543 544 545 546 <span class="post-time"> 547 | 548 549 <span itemprop="name">hiddenlotus</span> 550 551 552 553 </span> 554 555 556 557 558 559 560 <span class="post-comments-count"> 561 | 562 <a href="/2016/02/26/sortInScala/#comments" itemprop="discussionUrl"> 563 <span class="post-comments-count disqus-comment-count" data-disqus-identifier="2016/02/26/sortInScala/" itemprop="commentsCount"></span> 564 </a> 565 </span> 566 567 568 569 570 571 </div> 572 </header> 573 574 575 576 <div class="post-body"> 577 578 579 580 581 582 583 <span itemprop="articleBody"> 584 585 <p>æåºç®æ³æ¯ç®æ³çåºç¡é¨åã<br>æ¬æè®²ç¨å½æ°å¼çæ¹æ³ï¼ç¨Scalaå®ç°4ç§å¸¸ç¨çæåºç®æ³ã<br>ç±äºæ¯ç¨å½æ°å¼çæ¹å¼ï¼æä»¥ä½¿ç¨List代æ¿Arrayã䏿ä¸ç»ä¸ç±âå表â代æ¿ã</p> 586<h2 id="éæ©æåº"><a href="#éæ©æåº" class="headerlink" title="éæ©æåº"></a>éæ©æåº</h2><p>ä»ä¸ä¸ªå表ä¸éåºæå°ææå¤§çå ç´ ï¼æå ¥å°å表头æå表尾ã<br>循ç¯ä¸æ¬¡ï¼å¯¹å表ä¸çæ¯ä¸ªå ç´ é½ååæ ·çå¤çã<br>平忶é´å¤æåº¦ä¸ºNçå¹³æ¹ï¼N为å表çé¿åº¦ã<br><img src="/images/selection.png" style="width: 250px"><br><figure class="highlight scala"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">selectionSort</span></span>[<span class="type">T</span> <% <span class="type">Ordered</span>[<span class="type">T</span>]](list: <span class="type">List</span>[<span class="type">T</span>]): <span class="type">List</span>[<span class="type">T</span>] = {</span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">remove</span></span>(e: <span class="type">T</span>, list: <span class="type">List</span>[<span class="type">T</span>]): <span class="type">List</span>[<span class="type">T</span>] =</span><br><span class="line">
586 list <span class="keyword">match</span> {</span><br><span class="line"> <span class="keyword">case</span> <span class="type">Nil</span> => <span class="type">Nil</span></span><br><span class="line"> <span class="keyword">case</span> x :: xs => <span class="keyword">if</span> (x == e) xs <span class="keyword">else</span> x :: remove(e, xs)</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> list <span class="keyword">match</span> {</span><br><span class="line"> <span class="keyword">case</span> <span class="type">Nil</span> => <span class="type">Nil</span></span><br><span class="line"> <span class="keyword">case</span> _ =></span><br><span class="line"> <span class="keyword">val</span> min = list.min</span><br><span class="line"> min :: selectionSort(remove(min, list))</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p> 587<h2 id="æå ¥æåº"><a href="#æå ¥æåº" class="headerlink" title="æå ¥æåº"></a>æå ¥æåº</h2><p>åå¹³æ¶æä»¬ææå æ¶æçï¼å¹¶ä¾æ¬¡æç §é¡ºåºæå ¥å°å表ä¸ç¸åºçä½ç½®ã<br>平忶é´å¤æåº¦ä¸ºNçå¹³æ¹ã<br><img src="/images/insertion.png" style="width: 250px"><br><figure class="highlight scala"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">
587insertionSort</span></span>[<span class="type">T</span> <% <span class="type">Ordered</span>[<span class="type">T</span>]](list: <span class="type">List</span>[<span class="type">T</span>]): <span class="type">List</span>[<span class="type">T</span>] = {</span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">insert</span></span>(e: <span class="type">T</span>, list: <span class="type">List</span>[<span class="type">T</span>]): <span class="type">List</span>[<span class="type">T</span>] =</span><br><span class="line"> list <span class="keyword">match</span> {</span><br><span class="line"> <span class="keyword">case</span> <span class="type">Nil</span> => <span class="type">List</span>(e)</span><br><span class="line"> <span class="keyword">case</span> x :: xs => <span class="keyword">if</span> (x < e) x :: insert(e, xs) <span class="keyword">else</span> e :: list</span><br><span class="line"> }</span><br><span class="line"> list.foldLeft(<span class="type">List</span>.empty[<span class="type">T</span>])((res, init) => insert(init, res))</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p> 588<h2 id="å½å¹¶æåº"><a href="#å½å¹¶æåº" class="headerlink" title="å½å¹¶æåº"></a>å½å¹¶æåº</h2><p>éå½çå°å表åæé¿åº¦æ´å°çå表ã彿¯ä¸ªåå表çé¿åº¦å°äºçäº1æ¶ï¼å°å表们å½å¹¶å¨ä¸èµ·ã<br>平忶é´å¤æåº¦ä¸ºNlogNã<br><img src="/images/merge.png" style="width: 250px"><br><figure class="highlight scala"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">mergeSort</span></span>[<span class="type">T</span> <% <span class="type">Ordered</span>[<span class="type">T</span>]](list: <span class="type">List</span>[<span class="type">T</span>]): <span class="type">List</span>[<span class="type">T</span>] = {</span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">merge</span></span>(l1: <span class="type">List</span>[<span class="type">T</span>], l2: <span class="type">List</span>[<span class="type">T</span>]): <span class="type">List</span>[<span class="type">T</span>] =</span><br><span class="line"> (l1, l2) <span class="keyword">match</span> {</span><br><span class="line"> <span class="keyword">case</span> (<span class="type">Nil</span>, l) => l</span><br><span class="line"> <span class="keyword">case</span> (l, <span class="type">Nil</span>) => l</span><br><span class="line"> <span class="keyword">case</span> (x :: xs, y :: ys) =></span><br><span class="line"> <span class="keyword">if</span> (x < y) x :: merge(xs, l2)</span><br><span class="line"> <span class="keyword">else</span> y :: merge(l1, ys)</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">val</span> n = list.length / <span class="number">2</span></span><br><span class="line"> <span class="keyword">if</span> (n == <span class="number">0</span>) list</span><br><span class="line"> <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">val</span> (ys, zs) = list.splitAt(n)</span><br><span class="line"> merge(mergeSort(ys), mergeSort(zs))</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p> 589<h2 id="å¿«éæåº"><a href="#å¿«éæåº" class="headerlink" title="å¿«éæåº"></a>å¿«éæåº</h2><p>ä»ä¸ä¸ªå表ä¸éæºéåºä¸ä¸ªå ç´ ä½ä¸ºåºåï¼åå«å¨è¿æ»¤åºå°äºå®çå ç´ ï¼å¤§äºçäºå®çå ç´ ï¼<br>éå½ç对è¿äºå表è°ç¨è¯¥ç®æ³ï¼æåå°å表åå¹¶ã<br>è¿é并没æéæºä»å表ä¸åå ç´ ï¼åªå第ä¸ä¸ªå ç´ ä½ä¸ºåºåå ç´ ã<br>平忶é´å¤æåº¦ä¸ºNlogNã<br><img src="/images/quick.png" style="width: 250px"><br><figure class="highlight scala"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">
589quickSort</span></span>[<span class="type">T</span> <% <span class="type">Ordered</span>[<span class="type">T</span>]](list: <span class="type">List</span>[<span class="type">T</span>]): <span class="type">List</span>[<span class="type">T</span>] =</span><br><span class="line"> list <span class="keyword">match</span> {</span><br><span class="line"> <span class="keyword">case</span> <span class="type">Nil</span> => <span class="type">Nil</span></span><br><span class="line"> <span class="keyword">case</span> x :: _ =></span><br><span class="line"> <span class="keyword">val</span> (smaller, eqs, bigger) = list.foldLeft((<span class="type">List</span>.empty[<span class="type">T</span>], <span class="type">List</span>.empty[<span class="type">T</span>], <span class="type">List</span>.empty[<span class="type">T</span>])) {</span><br><span class="line"> (res, init) =></span><br><span class="line"> <span class="keyword">if</span> (init < x) (init :: res._1, res._2, res._3)</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (init == x) (res._1, init :: res._2, res._3)</span><br><span class="line"> <span class="keyword">else</span> (res._1, res._2, init :: res._3)</span><br><span class="line"> }</span><br><span class="line"> quickSort(smaller) ::: eqs ::: quickSort(bigger)</span><br><span class="line"> }</span><br></pre></td></tr></table></figure></p> 590<p>注1ï¼å¾çæ¥æºäºç½ç»<br>注2ï¼<code>T <% Ordered[T]</code>为View Boundï¼è¡¨ç¤ºâI can use any T, so long as T can be treated as an Ordered[T].â</p> 591 592 593 </span> 594 595 596 </div> 597 598 <footer class="post-footer"> 599 600 601 602 603 604 605 <div class="post-eof"></div> 606 607 </footer> 608 </article> 609 610 611 612 613 614 615 616 617 <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article"> 618 619 620 <header class="post-header"> 621 622 623 624 <h1 class="post-title" itemprop="name headline"> 625 626 627 628 <a class="post-title-link" href="/2016/01/27/ASDK/" itemprop="url"> 629 ASDKåºæ¬åç 630 </a> 631 632 633 </h1> 634 635 636 <div class="post-meta"> 637 <span class="post-time"> 638 åè¡¨äº 639 <time itemprop="dateCreated" datetime="2016-01-27T18:15:50+08:00" content="2016-01-27"> 640 2016-01-27 641 </time> 642 </span> 643 644 645 646 647 <span class="post-time"> 648 | 649 650 <span itemprop="name">raven.zhang</span> 651 652 653 654 </span> 655 656 657 658 659 660 661 <span class="post-comments-count"> 662 | 663 <a href="/2016/01/27/ASDK/#comments" itemprop="discussionUrl"> 664 <span class="post-comments-count disqus-comment-count" data-disqus-identifier="2016/01/27/ASDK/" itemprop="commentsCount"></span> 665 </a> 666 </span> 667 668 669 670 671 672 </div> 673 </header> 674 675 676 677 <div class="post-body"> 678 679 680 681 682 683 684 <span itemprop="articleBody"> 685 686 <p>AsyncDisplayKitæ¯Facebook弿ºçä¸å¥ç¨äºæé«iOSç颿µç ç弿¥ç»å¶UIçæ¡æ¶ãå ¶æ ¸å¿ææ³æ¯å¯¹CPU以åGPUçä¼åï¼CPUæ¹é¢åæ¯å¨å°ä¸äºé«æ¶èè¿ç®æ¾å¨åå°çº¿ç¨ä¸è¿è¡ï¼å°½éå轻主线ç¨è´æ ï¼GPUæ¹é¢åæ¯å°æ¯ä¸å¸§çå 容渲ææä¸å¼ textureï¼è¿ä¸ªå·¥ä½å¯ä»¥å¨åå°çº¿ç¨ä¸å®æã</p> 687<p>AsyncDisplayKitçåºæ¬åå æ¯nodeï¼Nodeæ¯UIView以å对åºLayerçæ½è±¡å±ãä¸UIViewçæå¤§åºå«å¨äºï¼Nodeæ¯çº¿ç¨å®å ¨çï¼å¹¶å¯ä»¥è®¾ç½®å¯¹åºçNodeå é¨å±æ¬¡åå¨åå°çº¿ç¨ä¸è¿è¡ï¼èUIViewåªè½å°å¤§éçèæ¶æä½å ¨é½æ¾å¨ä¸»çº¿ç¨ä¸è¿è¡ï¼ä¸é¢æ¯AsyncDisplayKitåUIKitçä¸äºç±»å¯¹åºå ³ç³»ã</p> 688<p>ASDisplayNode. Counterpart to UIView â subclass to make custom nodes.<br>
688ASControlNode. Analogous to UIControl â subclass to make buttons.<br>ASImageNode. Like UIImageView â decodes images asynchronously.<br>ASTextNode. Like UITextView â built on TextKit with full-featured rich text support.<br>ASTableView and ASCollectionView. UITableView and UICollectionView subclasses that support nodes.</p> 689<p>ASDisplayNodeæ¯çº¿ç¨å®å ¨çï¼å®å¯ä»¥å¨åå°çº¿ç¨å建åä¿®æ¹ãNodeåå建æ¶ï¼å¹¶ä¸ä¼å¨å é¨å建UIViewåCALayerï¼ç´å°ç¬¬ä¸æ¬¡å¨ä¸»çº¿ç¨è®¿é®viewæè layer屿§æ¶ï¼å®æä¼å¨å é¨çæå¯¹åºç对象ãå½å®ç屿§ï¼æ¯å¦frame/transformï¼æ¹ååï¼å®å¹¶ä¸ä¼ç«å»åæ¥å°å ¶ææçviewælayerå»ï¼èæ¯æè¢«æ¹åç屿§ä¿åå°å é¨çä¸ä¸ªä¸é´åéï¼ç¨åå¨éè¦æ¶ï¼åéè¿æä¸ªæºå¶ä¸æ¬¡æ§è®¾ç½®å°å é¨çviewælayerãå®é çç»å¶ä»£ç å¨:ASDisplayNodeåASDisplayNode+AsyncDisplay.mmã</p> 690<p>ä»ä¸»çº¿ç¨ä¸å¥ç¦»åºæ¥çèæ¶è¿ç®æ¯è¾éè¦çå°±æ¯å¾åãå¸å±è¿æç»å¶ã<br>å¾åï¼è§£åä¸å¤çï¼ï¼ä¸è¬UIImageå¯¹å ¶å é¨å¾åæ ¼å¼çè§£ååçå¨å³å°å°å¾ç交ç»GPU渲æçæ¶åãä»API䏿¥çï¼ä¸è¬æä»¬è°ç¨[UIImage drawInRect]彿°æè å°UIViewå¯è§ï¼æ¾ç½®äºwindowä¸ï¼çæ¶åï¼UIImageä¼å°å ¶å é¨å¾åæ ¼å¼å¦PNGï¼JPEGè¿è¡è§£åãAsyncDisplayKitå°±æ¯éç¨åé¢é£ä¸ªæ¹å¼å°UIViewé¢å æ¾ç½®å ¥ä¸ä¸ªframe为空å¾workingviewä¸ä»¥è¾¾å°å°viewå é¨çimageè¿è¡é¢è§£åçç®çãå说å¾åçå¤çãä¸è¬å¾åéè¦ä¸äºblendè¿ç®æè å¾åéè¦strechæcropï¼è¿äºå·¥ä½å ¶å®å¯ä»¥çå¨GPUä¸è¿è¡å¿«é计ç®ï¼ä½å 为UIKit并没ææä¾æ¤ç±»çAPIï¼æä»¥æä»¬ä¸è¬é½æ¯éè¿CoreGraphicæ¥åï¼ä½CoreGraphicæ¯CPU drawingæ¯è¾è´¹æ¶ãAsyncDisplayKitå°è¿äºå¾åå¤çæ¾å¨å·¥ä½çº¿ç¨ä¸æ¥å¤çï¼è½ç¶ä¹æ¯CPU drawingï¼ä½ä¸ä¼å½±åå°UIå¾é¡ºæ»ååºã</p> 691<p>å¸å±ï¼ä»¥AsyncDisplayKitçASTableView为ä¾,TableViewçUIå¸å±éè¦è®¡ç®æ¯è¡çé«åº¦ï¼ç¶å计ç®è¡å å ç´ çå¸å±ï¼å°è¡æå ¥å°TableViewä¸ï¼åæ¶TableView忝scrollviewï¼éè¦ä¸ä¸æ»å¨ã䏿¦è¡ççæåæ¸²ææ¯è¾æ ¢ï¼å¿ ç¶å½±åå°æ»å¨æ¶çæµç ä½éªãå¨è¿ä¸ªè¿ç¨ä¸åªæå°è¡æå ¥å°TableViewä¸éè¦å¨UI线ç¨ä¸æ§è¡ãAsyncDisplayKitå¨å线ç¨ä¸åæ¹æ¬¡è®¡ç®è¡ï¼rowï¼ä»¥åå ¶åå ç´ çå¸å±ï¼è®¡ç®å¥½åéè¿dispatch_group_notifyéç¥UI线ç¨å°rowæå ¥å°viewä¸ãAsyncDisplayKitæä¸ä¸ªæ¯è¾ç»è »çæ¹å¼æ¯èèå°è®¾å¤çCPUæ ¸æ°ï¼æ ¹æ®æ ¸æ°æ¥åæ¹æ¬¡è®¡ç®rowç大å°ã</p> 692<p>ç»å¶ï¼AsyncDisplayKitå¦ä¸ä¸ªå¼ºå¤§ä¹å¤å¨äºå°UI CALayerçbacking imageçç»å¶æ¾å ¥å°å·¥ä½çº¿ç¨ãæä»¬ç¥éUIViewççæ£å±ç°å 容å¨äºå ¶CALayerçcontents屿§ï¼ècontents屿§å¯¹åºä¸ä¸ªBacking imageï¼æä»¬å¯ä»¥å°å ¶çè§£æä¸ä¸ªå åä½å¾ãé»è®¤æ åµä¸UIView䏿¦éè¦å±ç°ï¼å ¶ä¼èªå¨å建ä¸ä¸ªBacking imageï¼ä½æä»¬ä¹å¯ä»¥éè¿CALayerçdelegateæ¹å¼æ¥å®å¶è¿ä¸ªBacking imageãAsyncDisplayKitå°±æ¯éè¿CALayerçdelegateæ§å¶backing imageççæï¼å¹¶ä¸éè¿Core Graphicçæ¹å¼å¨å·¥ä½çº¿ç¨ä¸å°View以åå ¶åèç¹ç»å¶å°backing imageä¸ï¼è¿äºç»å¶å·¥ä½ä¼æ ¹æ®UIViewç屿¬¡æå»ºä¸ä¸ªç»å¶æ°ç»ç»ä¸æ§è¡ï¼ç»å¶å¥½ä¹åå¨UI线ç¨ä¸å°è¿ä¸ªbacking imageä¼ ç»CALayerçcontentsï¼æåå°CALayerçæ¸²ææ 交ç»GPUè¿è¡æ¸²æãè½ç¶è¿ä¸ªè¿ç¨ä¸ä¸»è¦ä¾èµäºCoreGraphicæ¥è¿è¡ç»å¶ï¼ä½å 为é½å¨åå°ï¼èä¸ç»å¶ä»¥ç»çæ¹å¼æ§è¡åå°äºgraphic contextç忢ï¼å¯¹äºUIæ§è½åé¡ºæ»æ§æ²¡æä»ä¹å½±åãèä¸ä»éè¿transactionçæ¹å¼ç®¡çdispatch_groupä¹é´çå ³ç³»ï¼å¹¶ä¸åªæå¨UI线ç¨å¤äºidleç¶ææå°éåºæ¶æå°transaction commitå¹¶å°backing imageèµç»CALayerçcontentsãé¤äºéè¿CAlayerçbacking imageç»å¶ï¼AsyncDisplayKitè¿æä¾UIViewçdrawRectç»å¶ä»¥åUIViewçrasterizeã两è é½ä¼ä½¿ç¨offscreen drawingï¼ä½åè ä¼å°UIView以忿åèç¹é½ç»å¶å¨ä¸ä¸ªbacking imageä¸ã</p> 693<p>æ ¸å¿ææ¯ï¼Runloop ä»»å¡åå<br>iOS çæ¾ç¤ºç³»ç»æ¯ç± VSync ä¿¡å·é©±å¨çï¼VSync ä¿¡å·ç±ç¡¬ä»¶æ¶éçæï¼æ¯ç§éååº 60 次ï¼è¿ä¸ªå¼åå³è®¾å¤ç¡¬ä»¶ï¼æ¯å¦ iPhone çæºä¸éå¸¸æ¯ 59.97ï¼ãiOS å¾å½¢æå¡æ¥æ¶å° VSync ä¿¡å·åï¼
693ä¼éè¿ IPC éç¥å° App å ãApp ç Runloop å¨å¯å¨å伿³¨å对åºç CFRunLoopSource éè¿ mach_port æ¥æ¶ä¼ è¿æ¥çæ¶éä¿¡å·éç¥ï¼éå Source çåè°ä¼é©±å¨æ´ä¸ª App çå¨ç»ä¸æ¾ç¤ºã</p> 694<p>Core Animation å¨ RunLoop 䏿³¨åäºä¸ä¸ª Observerï¼çå¬äº BeforeWaiting å Exit äºä»¶ãè¿ä¸ª Observer çä¼å çº§æ¯ 2000000ï¼ä½äºå¸¸è§çå ¶ä» Observerãå½ä¸ä¸ªè§¦æ¸äºä»¶å°æ¥æ¶ï¼RunLoop 被å¤éï¼App ä¸ç代ç 伿§è¡ä¸äºæä½ï¼æ¯å¦å建åè°æ´è§å¾å±çº§ã设置 UIView ç frameãä¿®æ¹ CALayer çéæåº¦ã为è§å¾æ·»å ä¸ä¸ªå¨ç»ï¼è¿äºæä½æç»é½ä¼è¢« CALayer æè·ï¼å¹¶éè¿ CATransaction æäº¤å°ä¸ä¸ªä¸é´ç¶æå»ï¼CATransaction çææ¡£ç¥ææå°è¿äºå 容ï¼ä½å¹¶ä¸å®æ´ï¼ãå½ä¸é¢æææä½ç»æåï¼RunLoop å³å°è¿å ¥ä¼ç ï¼æè éåºï¼æ¶ï¼å ³æ³¨è¯¥äºä»¶ç Observer é½ä¼å¾å°éç¥ãè¿æ¶ CA 注åçé£ä¸ª Observer å°±ä¼å¨åè°ä¸ï¼æææçä¸é´ç¶æåå¹¶æäº¤å° GPU 廿¾ç¤ºï¼å¦ææ¤å¤æå¨ç»ï¼CA ä¼éè¿ DisplayLink çæºå¶å¤æ¬¡è§¦åç¸å ³æµç¨ã</p> 695<p>ASDK 卿¤å¤æ¨¡æäº Core Animation çè¿ä¸ªæºå¶ï¼ææé对 ASNode çä¿®æ¹åæäº¤ï¼æ»æäºä»»å¡æ¯å¿ éæ¾å ¥ä¸»çº¿ç¨æ§è¡çãå½åºç°è¿ç§ä»»å¡æ¶ï¼ASNode 伿任å¡ç¨ ASAsyncTransaction(Group) å°è£ å¹¶æäº¤å°ä¸ä¸ªå ¨å±ç容å¨å»ãASDK ä¹å¨ RunLoop 䏿³¨åäºä¸ä¸ª Observerï¼çè§çäºä»¶å CA 䏿 ·ï¼ä½ä¼å çº§æ¯ CA è¦ä½ãå½ RunLoop è¿å ¥ä¼ç åãCA å¤çå®äºä»¶åï¼ASDK 就伿§è¡è¯¥ loop å æäº¤çææä»»å¡ãå ·ä½ä»£ç è§è¿ä¸ªæä»¶ï¼ASAsyncTransactionGroupã</p> 696<p>以䏿¯å两å¨ççä¸äºåçæ§çä¸è¥¿ï¼ä»£ç 太å¤å¤ªå¤æè¿æ²¡ç ç©¶æ~ï¼æ»ä¹ASDKå°±æ¯è½å®ç°æå¼æ¥ãå¹¶åçæä½åæ¥å°ä¸»çº¿ç¨å»ï¼å¹¶ä¸è·å¾ä¸éçæ§è½ãåªæ¯è¿ä¸ªåºæ¯æç¹éï¼ä½¿ç¨éè°¨æ ï¼è¦ç¨å°±å¾ç¨ä¸å¥nodeçä¸è¥¿ãå¦ææ²¡æç¹å«å¤å¾çå¤çæè 坿æ¬ç¼è¾çè¯ä¹ä½ç°ä¸åºå®çä¼å¿ã</p> 697 698 699 </span> 700 701 702 </div> 703 704 <footer class="post-footer"> 705 706 707 708 709 710 711 <div class="post-eof"></div> 712 713 </footer> 714 </article> 715 716 717 718 719 720 721 722 723 <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article"> 724 725 726 <header class="post-header"> 727 728 729 730 <h1 class="post-title" itemprop="name headline"> 731 732 733 734 <a class="post-title-link" href="/2016/01/13/symbol_es6/" itemprop="url"> 735 å ³äºES6 Symbolç±»åçå°å¸å£« 736 </a> 737 738 739 </h1> 740 741 742 <div class="post-meta"> 743 <span class="post-time"> 744 åè¡¨äº 745 <time itemprop="dateCreated" datetime="2016-01-13T16:54:50+08:00" content="2016-01-13"> 746 2016-01-13 747 </time> 748 </span> 749 750 751 752 753 <span class="post-time"> 754 | 755 756 <span itemprop="name">uni.bell</span> 757 758 759 760 </span> 761 762 763 764 765 766 767 <span class="post-comments-count"> 768 | 769 <a href="/2016/01/13/symbol_es6/#comments" itemprop="discussionUrl"> 770 <span class="post-comments-count disqus-comment-count" data-disqus-identifier="2016/01/13/symbol_es6/" itemprop="commentsCount"></span> 771 </a> 772 </span> 773 774 775 776 777 778 </div> 779 </header> 780 781 782 783 <div class="post-body"> 784 785 786 787 788 789 790 <span itemprop="articleBody"> 791 792 <p>å æ¥ççSymbol彿°çå®ä¹ï¼<br><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="title">Symbol</span><span class="params">(description?)</span></span> â symbol</span><br></pre></td></tr></table></figure></p> 793<p>æ¥æ¶ä¸ä¸ªæè¿°ï¼æè¿°å¯ä»¥ä¸ºundefinedï¼ï¼è¿åä¸ä¸ªsymbolç±»åçåéã<br>ç¶åæææçæ¥äºï¼é¦å ä¼ è¿å»çåæ°åªæ¯ä¸ªæè¿°ï¼ç»è¯»ä»£ç ç人ççï¼åè¿å弿 å ³ï¼Symbol彿°æ¯æ¬¡é½è¿åä¸ä¸ªä¸ä¸æ ·çsymbolç±»ååéï¼åè¿æ ·ï¼<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">> <span class="built_in">Symbol</span>() === <span class="built_in">Symbol</span>()</span><br><span class="line"><span class="literal">
793false</span></span><br><span class="line"></span><br><span class="line">> <span class="built_in">Symbol</span>(<span class="string">"a"</span>) === <span class="built_in">Symbol</span>(<span class="string">"a"</span>)</span><br><span class="line"><span class="literal">false</span></span><br><span class="line"></span><br><span class="line">> <span class="keyword">let</span> a = <span class="built_in">Symbol</span>(<span class="string">"this is a"</span>)</span><br><span class="line">> a === a </span><br><span class="line"><span class="literal">true</span></span><br></pre></td></tr></table></figure></p> 794<p>ä¸è¿è¦æ³¨æçæ¯ï¼symbolç±»åè½ç¶æ¯ä¸ä¸ªåºæ¬ç±»åï¼ä½æ¯ä¸è¬æ¥è¯´ä¸è¢«jsonæ ¼å¼æ¯æï¼ä¸è¦è¯å¾å¨jsonæ ¼å¼é使ç¨å®ï¼åè¿æ ·ï¼[k]çå«ä¹æ¯ç¨kçå 容ä½ä¸ºå¯¹è±¡é®-å¼å¯¹çé®è䏿¯ç¨kè¿ä¸ªå符串ä½ä¸ºé®ï¼ï¼<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">> <span class="keyword">let</span> k = <span class="built_in">Symbol</span>(<span class="string">"key"</span>)</span><br><span class="line">> <span class="keyword">let</span> obj = {[k]: <span class="number">5</span>}</span><br><span class="line">> <span class="built_in">JSON</span>.stringify(obj)</span><br><span class="line">{}</span><br></pre></td></tr></table></figure></p> 795<p>è¿å¯¼è´äºnodejsçREPLæå°å¯¹è±¡çæ¶å伿¼æä»¥symboleä½ä¸ºé®çå 容ï¼åè¿æ ·ï¼<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">> <span class="keyword">let</span> k = <span class="built_in">Symbol</span>(<span class="string">"key"</span>)</span><br><span class="line">> <span class="keyword">let</span> obj = {[k]: <span class="number">5</span>, d: <span class="number">6</span>}</span><br><span class="line">> obj</span><br><span class="line">{ d: <span class="number">6</span> }</span><br></pre></td></tr></table></figure></p> 796<p>ä¸è¿ç´æ¥è®¿é®æ¯æ²¡æé®é¢çï¼<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">> <span class="keyword">let</span> k = <span class="built_in">Symbol</span>(<span class="string">"key"</span>)</span><br><span class="line">> <span class="keyword">let</span> obj = {[k]: <span class="number">5</span>, d: <span class="number">6</span>}</span><br><span class="line">> obj[k]</span><br><span class="line"><span class="number">5</span></span><br></pre></td></tr></table></figure></p> 797<p>æä»¥Symbolæå¤§çç¨å¤æ¯ç¨æ¥å常éå®ä¹ï¼ç¸æ¯ï¼<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> ERROR = <span class="string">"error"</span></span><br></pre></td></tr></table></figure></p> 798<p>使ç¨Symbol<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> ERROR = <span class="built_in">Symbol</span>(<span class="string">"error"</span>)</span><br></pre></td></tr></table></figure></p> 799<p>伿´å¥½ä¸äºï¼æ¯å¦ä½ æä¸¤ä¸ªå logåprintï¼å®ä»¬çERROR常éå ¶å®ä¸æ¯ä¸åäºï¼ç¨Symbolå°±ä¼å¾æ¸ æ°ï¼<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">> log.ERROR === print.ERROR</span><br><span class="line"><span class="literal">
799false</span></span><br></pre></td></tr></table></figure></p> 800 801 802 </span> 803 804 805 </div> 806 807 <footer class="post-footer"> 808 809 810 811 812 813 814 <div class="post-eof"></div> 815 816 </footer> 817 </article> 818 819 820 821 822 823 824 825 826 <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article"> 827 828 829 <header class="post-header"> 830 831 832 833 <h1 class="post-title" itemprop="name headline"> 834 835 836 837 <a class="post-title-link" href="/2015/12/31/éçå¼é/" itemprop="url"> 838 éçå¼é 839 </a> 840 841 842 </h1> 843 844 845 <div class="post-meta"> 846 <span class="post-time"> 847 åè¡¨äº 848 <time itemprop="dateCreated" datetime="2015-12-31T17:43:50+08:00" content="2015-12-31"> 849 2015-12-31 850 </time> 851 </span> 852 853 854 855 856 <span class="post-time"> 857 | 858 859 <span itemprop="name">Uni.Bell</span> 860 861 862 863 </span> 864 865 866 867 868 869 870 <span class="post-comments-count"> 871 | 872 <a href="/2015/12/31/éçå¼é/#comments" itemprop="discussionUrl"> 873 <span class="post-comments-count disqus-comment-count" data-disqus-identifier="2015/12/31/éçå¼é/" itemprop="commentsCount"></span> 874 </a> 875 </span> 876 877 878 879 880 881 </div> 882 </header> 883 884 885 886 <div class="post-body"> 887 888 889 890 891 892 893 <span itemprop="articleBody"> 894 895 <p>æå¨å¦ä¹ å¤çº¿ç¨ç¼ç¨çæ¶åï¼å¾å°çç¬¬ä¸æ¡å ³äºæ§è½å¿ 忝éçå¼éå¾å¤§ãç±æ¤å¼åäºä¸ä¸ªé®é¢ï¼æå¤å¤§ï¼ä¸ºä»ä¹ä»¥åå¦ä½å°½éé¿å ã</p> 896<hr> 897<p>å¨è®¡ç®æºéï¼âå¾å¤§âå®å¨æ¯ä¸ä¸ªå¤ªè¿äºæ¨¡ç³çæ¦å¿µãæ¯å¦åæ ·æ¯å½æ°è°ç¨ï¼å¨ä¸ä¸ªç§»å¨APPç大é¨åå°æ¹ï¼æä»¬ä¼é¼å±å°½éæå¤§ç彿°æå以便äºé 读åç解代ç ï¼è妿è¿ä¸ªAPPå å«ä¸ä¸ªè§é¢codecï¼éè¾¹ä¸ºäºæçä¼å°½éé¿å å¨å¾ªç¯éå彿°è°ç¨ï¼çè³ä¼æå¾ªç¯å±å¼åå°è·³è½¬çæ¬¡æ°æ¥ä¼åå¤ç卿µæ°´çº¿ãæä»¥ç¬¼ç»ç说æä¸ªæä½âå¼éå¾å¤§â没太大çæä¹ï¼åªææ¯è¾ç²¾ç¡®çæµéåºå®é çå¼éæå¤å¤§ï¼æä»¬æè½å³å®ä½¿ç¨çæ¹å¼åä¼åæºå¶ã</p> 898<h2 id="éå¼éçæµé"><a href="#éå¼éçæµé" class="headerlink" title="éå¼éçæµé"></a>éå¼éçæµé</h2><p>æä»¬éå¯¹çæ¯å¤çº¿ç¨ç¯å¢ä¸çéæºå¶ï¼åºäºlinuxåæµè¯ãæ¯ç§ç¼ç¨è¯è¨æä¾çéæºå¶é½ä¸å¤ªä¸æ ·ï¼ä¸è¿æ 论å¦ä½ï¼æç»é½ä¼è½å®å°ä¸¤ç§æºå¶ä¸ï¼ä¸æ¯å¤ç卿ä¾çååæä½æä»¤ï¼ç°å¨ä¸è¬æ¯CASâcompare and swapï¼ï¼å¤çå¨ä¼ç¨è½®è¯¢çæ¹å¼è¯å¾è·å¾éï¼å¨å¤çå¨ï¼å æ¬å¤æ ¸ï¼æ¶æéè¿æ¯å¿ ä¸å¯å°çæºå¶ï¼äºæ¯å æ ¸æä¾çéç³»ç»è°ç¨ï¼å¨è¢«éä½çæ¶å伿å½å线ç¨ç½®äºç¡ç ï¼é»å¡ï¼ç¶æã</p> 899<p>å®é 䏿们å¨ç¼ç¨çæ¶åå¹¶ä¸ä¼ç´æ¥è°ç¨è¿ä¸¤ç§æºå¶ï¼èæ¯ä½¿ç¨ç¼ç¨è¯è¨æå¸¦å½æ°åºéçéæ¹æ³ï¼éæ¹æ³å 鍿··å使ç¨è¿ä¸¤ç§æºå¶ã以pthreadåºï¼NPTLï¼çpthread_mutexæ¥ä¸¾ä¾ï¼ä¸æéæ¬è´¨ä¸åªæ¯ä¸ä¸ªintç±»åçåéï¼å ç¨4个åèå åå¹¶ä¸å åè¾¹çæ4åè对é½ãå éçæ¶åå ç¨trylockæ¹æ³ï¼å é¨ä½¿ç¨çæ¯CASæä»¤ï¼æ¥å°è¯è·å¾éï¼å¦ææ æ³è·å¾éï¼åè°ç¨ç³»ç»è°ç¨sys_futexæ¥è¯å¾è·å¾éï¼è¿æ¶å妿è¿ä¸è½è·å¾éï¼å½å线ç¨å°±ä¼è¢«é»å¡ã</p> 900<p>javaä¹ç±»çè¯è¨ä¼ä½¿ç¨çèµ·æ¥åpthread_mutexå¾ä¸ä¸æ ·çéæºå¶ï¼æ¯å¦synchroniseï¼ï¼ä½æ¯å®é ä¸åºå±è¿æ¯éè¿pthread_mutexçæ¹æ³æ¥å éï¼æè æ¯æ··å使ç¨CASåsys_futexâåpthread_mutexå·®ä¸å¤ã</p> 901<p>æä»¥å¾å®¹æå¾å°ä¸ä¸ªç»è®ºï¼å¦æéä¸åå¨å²çªï¼æ¯æ¬¡è·å¾éåéæ¾éçå¤çå¨å¼éä» ä» æ¯CASæä»¤çå¼éï¼å¨x86-64å¤çå¨ä¸ï¼è¿ä¸ªå¼éåªæ¯ä¸æ¬¡å å访é®ï¼æ cac
901heï¼é«ä¸ç¹ï¼å¤§æ¦æ¯1.3åï¼ã以æç°å¨å¨ä½¿ç¨çMacBoolPro为ä¾ï¼å åçè§æ ¼æ¯DDR3-1600ï¼å®é çæ¶éé¢ç为800MHzï¼æ¯ä¸ªæ¶é卿1.25nsï¼çªåçå å访é®åå¨8个æ¶é卿çå»¶è¿ï¼è¿ä¸ªå»¶è¿ç缩å乿¯CASï¼åè<a href="https://en.wikipedia.org/wiki/CAS_latency" target="_blank" rel="external">https://en.wikipedia.org/wiki/CAS_latency</a>ï¼ï¼ä¹å°±æ¯10nsçå å访é®å»¶è¿ï¼è¿æ ·ç®ä¸æ¥ï¼CASæä»¤çå¼éå¤§æ¹æ¯åå¤ä¸ªnsã</p> 902<p>ç¡®å®ä¸ä»¶äºæ æå¥½çæ¹æ³æ¯å®é æµè¯åè§æµå®ï¼è®©æä»¬å䏿®µä»£ç æ¥æµè¯æ å²çªæ¶éçå¼éï¼æ ¸å¿ä»£ç å¤§æ¦æ¯è¿æ ·ï¼</p> 903<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">while</span>(c < MAX) {</span><br><span class="line"> pthread_mutex_lock(&mutex);</span><br><span class="line"> c = c + <span class="number">1</span>;</span><br><span class="line"> pthread_mutex_unlock(&mutex);</span><br><span class="line">}</span><br></pre></td></tr></table></figure> 904<p>å ¶å®å°±æ¯å¾ªç¯çlockåunlockãè¿è¡äºäº¿æ¬¡ä»¥åï¼è®¡ç®èæ¶ä¸º14.5så·¦å³ï¼å¹³æå°æ¯æ¬¡å é/è§£éæä½å¤§æ¹æ¯14nsæ¯æ¬¡å é/è§£éï¼æ£é¤å¾å°çä¸ç¹å¾ªç¯å¼éï¼ãè¿ä¸ªæ°å¼åCASæä»¤çç论å¼éå»åå¾å¾å¥½ã</p> 905<p>å¨éå²çªçæ åµä¸ï¼å¼é就没æè¿ä¹å°äºãé¦å pthread_mutex_lockä¼çæ£çè°ç¨sys_futexæ¥è¿å ¥å æ ¸æ¥è¯å¾å éï¼è¢«éä½ä»¥å线ç¨ä¼è¿å ¥ç¡ç ï¼è¿å¸¦æ¥äºä¸ä¸æåæ¢å线ç¨è°åº¦çå¼éãå¯ä»¥å两个äºç¸è§£éççº¿ç¨æ¥æµè¯è¿ä¸ªè¿ç¨çå¼éï¼<br>代ç ï¼ <a href="https://github.com/tsuna/contextswitch/blob/master/timetctxsw.c" target="_blank" rel="external">https://github.com/tsuna/contextswitch/blob/master/timetctxsw.c</a> ã<br>å¨åæ ¸ååæ ¸æºå¨ä¸å嫿µè¯ï¼é½æ¯å¨ä¸å°2.5GHzçCore i5ä¸ç¨vmware建çèææºï¼è¿è¡ubuntu linuxï¼ãå¨åæ ¸æºå¨ä¸æ¶è大约1080nsèåæ ¸æºå¨ä¸æ¶è大约3400nsï¼åæ ¸æºå¨ä¸éå²çªçå¼éå¤§æ¦æ¯åæ ¸ç3åã<br>å¦å¤ä¸ä¸ªcç¨åºå¯ä»¥ç¨æ¥æµè¯â纯ä¸ä¸æåæ¢âçå¼éï¼çº¿ç¨åªæ¯ä½¿ç¨sched_yieldæ¥æ¾å¼å¤çå¨ï¼å¹¶ä¸è¿å ¥ç¡ç ã<br>代ç ï¼<a href="https://github.com/tsuna/contextswitch/blob/master/timetctxsw2.c" target="_blank" rel="external">https://github.com/tsuna/contextswitch/blob/master/timetctxsw2.c</a> ã<br>ç»è®ºå¾æäººï¼å¨åæ ¸å¤çå¨ä¸ï¼â纯ä¸ä¸æåæ¢âåªæ¶èäºå¤§æ¦150nsã</p> 906<h2 id="éå¼éçæ¥æº"><a href="#éå¼éçæ¥æº" class="headerlink" title="éå¼éçæ¥æº"></a>éå¼éçæ¥æº</h2><p>è¿æ ·æä»¬å¤§è´å¯ä»¥æéå²çªçå¼éåæä¸é¨åï¼â纯ä¸ä¸æåæ¢âå¼éï¼å¤§æ¦æ¯150nsï¼è°åº¦å¨å¼éï¼æçº¿ç¨ä»ç¡ç åæå°±ç»ªæè åè¿æ¥ï¼å¤§æ¦æ¯900nsï¼å¨å¤æ ¸ç³»ç»ä¸ï¼è¿åå¨è·¨å¤çå¨è°åº¦çå¼éï¼é£é¨åå¼éå¾å¤§ï¼è¶ è¿2000nsãå¨çå®çåºç¨åºæ¯éï¼è¿è¦èèä¸ä¸æåæ¢å¸¦æ¥çcacheä¸å½ä¸åTLBä¸å½ä¸çå¼éï¼å¼éåªä¼è¿ä¸æ¥å 大ã</p> 907<h2 id="éçä¼å"><a href="#éçä¼å" class="headerlink" title="éçä¼å"></a>éçä¼å</h2><p>éçå®ç°æ¹å¼å¯¹æä»¬çä¼åæ¹åç»äºäºå¾å¥½çæç¤ºï¼è®©æä»¬åæ³ä¸ä¸ï¼ï¼å ç¨ä¸ä¸ªå¿«çæä½ï¼æ¯ç§7000䏿¬¡ï¼æ¥æµè¯éæ¯å¦å²çªï¼åç¨ä¸ä¸ªæ ¢çæä½æ¥å®é å éï¼æ¯ç§30䏿¬¡ï¼ãæä»¥çæ£æ¶èæ¶é´ç䏿¯ä¸éçæ¬¡æ°ï¼èæ¯éå²çªç次æ°ãåå°éå²çªçæ¬¡æ°ææ¯æåæ§è½çå ³é®ã<br>ä½¿ç¨æ´ç»ç²åº¦çéï¼å¯ä»¥åå°éå²çªãè¿é说çç²åº¦å æ¬æ¶é´å空é´ï¼æ¯å¦åå¸è¡¨å å«ä¸ç³»åå
907叿¡¶ï¼ä¸ºæ¯ä¸ªæ¡¶è®¾ç½®ä¸æéï¼ç©ºé´ç²åº¦å°±ä¼å°å¾å¤ï¼ï¼åå¸å¼ç¸äºä¸å²çªç访é®ä¸ä¼å¯¼è´éå²çªï¼è¿æ¯ä¸ºæ´ä¸ªåå¸è¡¨ç»´æ¤ä¸æéçå²çªæºçä½å¾å¤ãåå°æ¶é´ç²åº¦ä¹å¾å®¹æçè§£ï¼å éçèå´åªå å«å¿ è¦çä»£ç æ®µï¼å°½é缩çè·å¾éå°éæ¾éä¹é´çæ¶é´ï¼æéè¦çæ¯ï¼ç»å¯¹ä¸è¦å¨éä¸è¿è¡ä»»ä½å¯è½ä¼é»å¡çæä½ã使ç¨è¯»åé乿¯ä¸ä¸ªå¾å¥½çåå°å²çªçæ¹å¼ï¼è¯»æä½ä¹é´ä¸äºæ¥ï¼å¤§å¤§åå°äºå²çªã<br>éæ¬èº«çè¡ä¸ºä¹åå¨è¿ä¸æ¥ä¼åçå¯è½æ§ï¼sys_futexç³»ç»è°ç¨çä½ç¨å¨äºè®©è¢«éä½çå½å线ç¨ç¡ç ï¼è®©åºå¤çå¨ä¾å ¶å®çº¿ç¨ä½¿ç¨ï¼æ¢ç¶è¿ä¸ªè¿ç¨çæ¶èé«è¾¾å ånsï¼ä¹å°±æ¯è¯´å¦æè¢«éå®çæ¶é´ä¸è¶ è¿è¿ä¸ªæ°å¼çè¯ï¼æ ¹æ¬æ²¡æå¿ è¦è¿å æ ¸å éï¼ï¼éæ¾çå¤ç卿¶é´è¿ä¸å¤æ¶èçãsys_futexçæ¶é´æ¶èå¤è·äºç¾å¤æ¬¡compare and swapçï¼ä¹å°±æ¯è¯´ï¼å¯¹äºä¸ä¸ªéå²çªæ¯è¾é¢ç¹èä¸å¹³åé宿¶é´æ¯è¾ççç³»ç»ï¼ä¸ä¸ªå¼å¾èèçä¼åæ¹å¼æ¯å 循ç¯è°ç¨compare and swapæ¥å°è¯è·å¾éï¼è¿ä¸ªæä½ä¹è¢«ç§°ä½èªæéï¼ï¼å¨è¥å¹²æ¬¡å¤±è´¥ï¼ä¸è¬æ¯ä¸ç¾æ¬¡å·¦å³ï¼ååè¿å ¥å æ ¸çæ£å éãå½ç¶è¿ä¸ªä¼ååªè½å¨å¤å¤çå¨çç³»ç»éèµ·ä½ç¨ï¼å¾æå¦ä¸ä¸ªå¤ç卿¥è§£éï¼å¦åèªæéæ æä¹ï¼ãå¨glibcçpthreadå®ç°éï¼éè¿å¯¹pthread_mutex设置PTHREAD_MUTEX_ADAPTIVE_NP屿§å°±å¯ä»¥ä½¿ç¨è¿ä¸ªæºå¶ï¼å¨Javaä¸ççHotSpotèææºéï¼å¯ä»¥ç¨-XX:PreBlockSpinæ¥è®¾ç½®èªééå°è¯ç次æ°ã</p> 908 909 910 </span> 911 912 913 </div> 914 915 <footer class="post-footer"> 916 917 918 919 920 921 922 <div class="post-eof"></div> 923 924 </footer> 925 </article> 926 927 928 929 930 931 932 933 934 <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article"> 935 936 937 <header class="post-header"> 938 939 940 941 <h1 class="post-title" itemprop="name headline"> 942 943 944 945 <a class="post-title-link" href="/2015/12/31/length/" itemprop="url"> 946 lengthçå ç§åæ³ 947 </a> 948 949 950 </h1> 951 952 953 <div class="post-meta"> 954 <span class="post-time"> 955 åè¡¨äº 956 <time itemprop="dateCreated" datetime="2015-12-31T16:43:50+08:00" content="2015-12-31"> 957 2015-12-31 958 </time> 959 </span> 960 961 962 963 964 <span class="post-time"> 965 | 966 967 <span itemprop="name">hiddenlotus</span> 968 969 970 971 </span> 972 973 974 975 976 977 978 <span class="post-comments-count"> 979 | 980 <a href="/2015/12/31/length/#comments" itemprop="discussionUrl"> 981 <span class="post-comments-count disqus-comment-count" data-disqus-identifier="2015/12/31/length/" itemprop="commentsCount"></span> 982 </a> 983 </span> 984 985 986 987 988 989 </div> 990 </header> 991 992 993 994 <div class="post-body"> 995 996 997 998 999 1000 1001 <span itemprop="articleBody"> 1002 1003 <p>ä¸ä¸ªä¼ ç»ç¨åºåæ¯è¿ä¹åçï¼<br><figure class="highlight maxima"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">function <span class="built_in">length</span>(<span class="built_in">array</span>) {</span><br><span class="line"> <span class="built_in">var</span> <span class="built_in">sum</span> = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span>(<span class="built_in">var</span> i = <span class="number">0</span>; i < <span class="built_in">array</span>.<span class="built_in">length</span>; i++) {</span><br><span class="line"> <span class="built_in">
1003sum</span>++</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">return</span> <span class="built_in">sum</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure></p> 1004<p>ä¸ä¸ªè¯»è¿SICPçç¨åºåæ¯è¿ä¹åçï¼<br><figure class="highlight maxima"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">function <span class="built_in">length</span>(<span class="built_in">array</span>) {</span><br><span class="line"> <span class="keyword">if</span>(<span class="built_in">array</span>.<span class="built_in">length</span> === <span class="number">0</span>) {</span><br><span class="line"> <span class="built_in">return</span> <span class="number">0</span></span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="built_in">return</span> <span class="number">1</span> + <span class="built_in">length</span>(<span class="built_in">array</span>.slice(<span class="number">1</span>))</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p> 1005<p>å¦ä¸ä¸ªè¯»è¿SICPçç¨åºåï¼<br><figure class="highlight maxima"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">function <span class="built_in">length</span>(<span class="built_in">array</span>) {</span><br><span class="line"> function helper(<span class="built_in">array</span>, <span class="built_in">num</span>) {</span><br><span class="line"> <span class="keyword">if</span>(<span class="built_in">array</span>.<span class="built_in">length</span> === <span class="number">0</span>) {</span><br><span class="line"> <span class="built_in">return</span> <span class="built_in">num</span></span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="built_in">return</span> helper(<span class="built_in">array</span>.slice(<span class="number">1</span>), <span class="built_in">num</span> + <span class="number">1</span>)</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">return</span> helper(<span class="built_in">array</span>, <span class="number">0</span>)</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p> 1006<p>å彿°å¼ä¸ç¹ï¼<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">length</span><span class="params">(array)</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">array</span>.reduce(<span class="function"><span class="keyword">function</span><span class="params">(prev, cur)</span> </span>{ <span class="keyword">return</span> prev + <span class="number">1</span> }, <span class="number">0</span>)</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p> 1007<p>ä¸ä¸ªæé¢è¯è¿ç人â¦<br><figure class="highlight matlab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">length</span><span class="params">(array)</span> {</span></span><br><span class="line"> <span class="keyword">return</span> array.<span class="built_in">length</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure></p> 1008 1009 1010 </span> 1011 1012 1013 </div> 1014 1015 <footer class="post-footer"> 1016 1017 1018 1019 1020 1021 1022 <div class="post-eof"></div> 1023 1024 </footer> 1025 </article> 1026 1027 1028 1029 1030 1031 1032 1033 1034 <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article"> 1035 1036 1037 <header class="post-header"> 1038 1039 1040 1041 <h1 class="post-title" itemprop="name headline"> 1042 1043 1044 1045 <a class="post-title-link" href="/2015/12/31/AMD_CommonJS-1/" itemprop="url"> 1046 AMD å CommonJS -- 1. åºæ¬æ¦å¿µ 1047 </a> 1048 1049 1050 </h1> 1051 1052 1053 <div class="post-meta">
1054 <span class="post-time"> 1055 åè¡¨äº 1056 <time itemprop="dateCreated" datetime="2015-12-31T12:03:15+08:00" content="2015-12-31"> 1057 2015-12-31 1058 </time> 1059 </span> 1060 1061 1062 1063 1064 <span class="post-time"> 1065 | 1066 1067 <span itemprop="name">mac.meng</span> 1068 1069 1070 1071 </span> 1072 1073 1074 1075 1076 1077 1078 <span class="post-comments-count"> 1079 | 1080 <a href="/2015/12/31/AMD_CommonJS-1/#comments" itemprop="discussionUrl"> 1081 <span class="post-comments-count disqus-comment-count" data-disqus-identifier="2015/12/31/AMD_CommonJS-1/" itemprop="commentsCount"></span> 1082 </a> 1083 </span> 1084 1085 1086 1087 1088 1089 </div> 1090 </header> 1091 1092 1093 1094 <div class="post-body"> 1095 1096 1097 1098 1099 1100 1101 <span itemprop="articleBody"> 1102 1103 <h3 id="AMD-Asynchronous-Module-Definition"><a href="#AMD-Asynchronous-Module-Definition" class="headerlink" title="AMD = Asynchronous Module Definition"></a>AMD = Asynchronous Module Definition</h3><p>å®éç¨å¼æ¥æ¹å¼å 载模åï¼æ¨¡åçå è½½ä¸å½±åå®åé¢è¯å¥çè¿è¡ãææä¾èµè¿ä¸ªæ¨¡åçè¯å¥ï¼é½å®ä¹å¨ä¸ä¸ªåè°å½æ°ä¸ï¼çå°å è½½å®æä¹åï¼è¿ä¸ªåè°å½æ°æä¼è¿è¡ã</p> 1104<figure class="highlight crystal"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">require</span>([<span class="class"><span class="keyword">module</span>], <span class="title">callback</span>);</span></span><br></pre></td></tr></table></figure> 1105<p>第ä¸ä¸ªåæ°[module]ï¼æ¯ä¸ä¸ªæ°ç»ï¼éé¢çæåå°±æ¯è¦å è½½çæ¨¡åï¼ç¬¬äºä¸ªåæ°callbackï¼åæ¯å è½½æåä¹åçåè°å½æ°ã妿å°åé¢çä»£ç æ¹åæAMDå½¢å¼ï¼å°±æ¯ä¸é¢è¿æ ·ï¼</p> 1106<figure class="highlight lisp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">require([âjqueryâ,âmath'], function ($, math) {</span><br><span class="line"> math.add(<span class="number">2</span>, <span class="number">3</span>)<span class="comment">;</span></span><br><span class="line"> $(<span class="name">body</span>).show()<span class="comment">;</span></span><br><span class="line">})<span class="comment">;</span></span><br></pre></td></tr></table></figure> 1107<h3 id="CommonJS"><a href="#CommonJS" class="headerlink" title="CommonJS"></a>CommonJS</h3><p>é£ä»ä¹æ¯CommonJSå¢, æ»æ¯æ¿ä»åAMDæ¥å¯¹æ¯ä½¿ç¨<br>2009å¹´ï¼ç¾å½ç¨åºåRyan Dahlåé äºnode.js项ç®ï¼å°javascriptè¯è¨ç¨äºæå¡å¨ç«¯ç¼ç¨ã<br>node.jsçæ¨¡åç³»ç»ï¼å°±æ¯åç §<a href="http://wiki.commonjs.org/wiki/Modules/1.1" target="_blank" rel="external">CommonJS</a>è§èå®ç°çãå¨CommonJSä¸ï¼æä¸ä¸ªå ¨å±æ§æ¹æ³require()ï¼ç¨äºå 载模åãå宿ä¸ä¸ªæ°å¦æ¨¡åmath.jsï¼å°±å¯ä»¥åä¸é¢è¿æ ·å è½½ã<br><figure class="highlight oxygene"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> math = <span class="keyword">require</span>(<span class="string">'math'</span>);</span><br><span class="line">math.<span class="keyword">add</span>(<span class="number">2</span>,<span class="number">3</span>); <span class="comment">// 5</span></span><br></pre></td></tr></table></figure></p> 1108<h3 id="é£ä¹é®é¢æ¥äº"><a href="#é£ä¹é®é¢æ¥äº" class="headerlink" title="é£ä¹é®é¢æ¥äº"></a>é£ä¹é®é¢æ¥äº</h3><p>æäºæå¡å¨ç«¯æ¨¡å以åï¼å¾èªç¶å°ï¼å¤§å®¶å°±æ³è¦å®¢æ·ç«¯æ¨¡åãè䏿好䏤è è½å¤å ¼å®¹ï¼ä¸ä¸ªæ¨¡åä¸ç¨ä¿®æ¹ï¼å¨æå¡å¨åæµè§å¨é½å¯ä»¥è¿è¡ã<br>使¯ï¼ç±äºä¸ä¸ªé大çå±éï¼ä½¿å¾CommonJSè§èä¸éç¨äºæµè§å¨ç¯å¢ã<br>æå¡å¨ç«¯çæä»¶ä¾èµåªåå³äºç£çIO,使¯å®¢æ·ç«¯ä¼æç½ç»çä¸ç¡®å®æ§.åå³äºç½éçå¿«æ ¢ï¼å¯è½è¦çå¾é¿æ¶é´ï¼æµè§å¨å¤äºâåæ»âç¶æã</p> 1109<p>å æ¤ï¼æµè§å¨ç«¯ç模åï¼ä¸è½éç¨â忥å è½½âï¼synchronousï¼ï¼åªè½éç¨â弿¥å è½½âï¼asynchronousï¼ãè¿å°±æ¯AMDè§èè¯ççèæ¯.</p> 1110<h3 id="CommonJS-å°åºæ¯ä¸ªä»ä¹é¬¼"><a href="#CommonJS-å°åºæ¯ä¸ªä»ä¹é¬¼" class="headerlink" title="CommonJS å°åºæ¯ä¸ªä»ä¹é¬¼"></a>CommonJS å°åºæ¯ä¸ªä»ä¹é¬¼</h3><p><a href="http://www.commonjs.org/" target="_blank" rel="external">CommonJS</a> ç½ç«æ é¢ : javascript: not just for browsers any more!</p> 1111<p>With CommonJS-compliant systems, you can use JavaScript to write:</p> 1112<ul> 1113<li>Server-side JavaScript applications</li> 1114<li>Command line tools</li> 1115<li>Desktop GUI-based applications</li> 1116<li>Hybrid applications (Titanium, Adobe AIR)</li> 1117</ul> 1118<p>æè§åºæ¬å°±æ¯å®ä¹ä¸äºææ¡£åAPI, 大家é½éµå¾ª,èªå·±å»å®ç°. ç¶åæJSåçå°å¤é½æ¯,弿æ£å¶.</p> 1119<p><code>CommonJSæ¯æå¡å¨ç«¯æ¨¡åçè§èï¼Node.jséç¨äºè¿ä¸ªè§èã</code><br>æ ¹æ®CommonJSè§èï¼ä¸ä¸ªåç¬çæä»¶å°±æ¯ä¸ä¸ªæ¨¡åã å 载模å使ç¨requireæ¹æ³ï¼è¯¥æ¹æ³è¯»åä¸ä¸ªæä»¶å¹¶æ§è¡ï¼æåè¿åæä»¶å é¨çexports对象ã</p> 1120<h3 id="é¢å"><a href="#é¢å" class="headerlink" title="é¢å"></a>é¢å</h3><p>æ¥ä¸æ¥çå ç¯æç« æ¬¡ä¼æç §å è½½æ¹å¼çä¸å,讲解ä¸ä¸ require.js å AngularJS çå è½½æºå¶ 以åwebwork å serverwork çå¼åæ¹å¼, è¿æboweråºånpmåºçå¤å£³çä¸å.</p> 1121 1122 1123 </span> 1124 1125 1126 </div> 1127 1128 <footer class="post-footer"> 1129 1130 1131 1132 1133 1134 1135 <div class="post-eof"></div> 1136 1137 </footer> 1138 </article> 1139 1140 1141 1142 1143 1144 1145 1146 1147 <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article"> 1148 1149 1150 <header class="post-header"> 1151 1152 1153 1154 <h1 class="post-title" itemprop="name headline"> 1155 1156 1157 1158 <a class="post-title-link" href="/2015/12/27/gulp-browserify/" itemprop="url"> 1159 gulp_browserify 1160 </a> 1161 1162 1163 </h1> 1164 1165 1166 <div class="post-meta">
1167 <span class="post-time"> 1168 åè¡¨äº 1169 <time itemprop="dateCreated" datetime="2015-12-27T11:23:09+08:00" content="2015-12-27"> 1170 2015-12-27 1171 </time> 1172 </span> 1173 1174 1175 1176 1177 1178 1179 1180 1181 <span class="post-comments-count"> 1182 | 1183 <a href="/2015/12/27/gulp-browserify/#comments" itemprop="discussionUrl"> 1184 <span class="post-comments-count disqus-comment-count" data-disqus-identifier="2015/12/27/gulp-browserify/" itemprop="commentsCount"></span> 1185 </a> 1186 </span> 1187 1188 1189 1190 1191 1192 </div> 1193 </header> 1194 1195 1196 1197 <div class="post-body"> 1198 1199 1200 1201 1202 1203 1204 <span itemprop="articleBody"> 1205 1206 <h2 id="babel-intergate-and-source-map"><a href="#babel-intergate-and-source-map" class="headerlink" title="babel intergate and source map"></a><a href="https://egghead.io/lessons/javascript-gulp-and-browserify-adding-babel-source-maps" target="_blank" rel="external">babel intergate and source map</a></h2><p>debugger 令人å°è±¡æ·±å»<br>éè¿ exorcist å äºsource.map å¯ä»¥å¨æªç¼è¯è¿çæä»¶ä¸ææç¹äº</p> 1207<h2 id="Hooking-up-Watchify"><a href="#Hooking-up-Watchify" class="headerlink" title="Hooking up Watchify"></a><a href="https://egghead.io/lessons/javascript-gulp-and-browserify-hooking-up-watchify" target="_blank" rel="external">Hooking up Watchify</a></h2><p>Watchify è²ä¼¼åªè½è· browserifyä¸èµ·ç¨, åªå¯¹jså ¶ææ. ä¸ç¥éhtmlåcss åºè¯¥æä¹æ´.</p> 1208<h2 id="Live-Reload-with-Browsersync"><a href="#Live-Reload-with-Browsersync" class="headerlink" title="Live Reload with Browsersync"></a><a href="https://egghead.io/lessons/javascript-gulp-and-browserify-adding-live-reload-with-browsersync" target="_blank" rel="external">Live Reload with Browsersync</a></h2><p>Browsersync ä¸ç¨å¨æµè§å¨è£ livereload客æ·ç«¯äº. ä¸ç¥éå¦ä½æå®ç«¯å£</p> 1209<h2 id="Initial-Setup"><a href="#Initial-Setup" class="headerlink" title="Initial Setup"></a><a href="https://egghead.io/lessons/javascript-gulp-and-browserify-initial-setup" target="_blank" rel="external">Initial Setup</a></h2><p>browserify çä¸äºåå§åæä½, ç®å½ç»æç</p> 1210 1211 1212 </span> 1213 1214 1215 </div> 1216 1217 <footer class="post-footer"> 1218 1219 1220 1221 1222 1223 1224 <div class="post-eof"></div> 1225 1226 </footer> 1227 </article> 1228 1229 1230 1231 </section> 1232 1233 1234 1235 </div> 1236 1237 1238 1239 1240 </div> 1241 1242 1243 1244 1245 <div class="sidebar-toggle"> 1246 <div class="sidebar-toggle-line-wrap"> 1247 <span class="sidebar-toggle-line sidebar-toggle-line-first"></span> 1248 <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span> 1249 <span class="sidebar-toggle-line sidebar-toggle-line-last"></span> 1250 </div> 1251 </div> 1252 1253 <aside id="sidebar" class="sidebar"> 1254 <div class="sidebar-inner"> 1255 1256 1257 1258 1259 1260 <section class="site-overview sidebar-panel sidebar-panel-active "> 1261 <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person"> 1262 <img class="site-author-image" src="/images/default_avatar.png" alt="Alan, Bob, Mactive, Victor, Raven, Luka, Yak, Uni.Bell" itemprop="image"/> 1263 <p class="site-author-name" itemprop="name">Alan, Bob, Mactive, Victor, Raven, Luka, Yak, Uni.Bell</p> 1264 </div> 1265 <p class="site-description motion-element" itemprop="description"></p> 1266 <nav class="site-state motion-element"> 1267 <div class="site-state-item site-state-posts"> 1268 <a href="/archives"> 1269 <span class="site-state-item-count">10</span> 1270 <span class="site-state-item-name">æ¥å¿</span> 1271 </a> 1272 </div> 1273 1274 <div class="site-state-item site-state-categories"> 1275 1276 <span class="site-state-item-count">0</span> 1277 <span class="site-state-item-name">åç±»</span> 1278 1279 </div> 1280 1281 <div class="site-state-item site-state-tags"> 1282 <a href="/tags">
1283 <span class="site-state-item-count">23</span> 1284 <span class="site-state-item-name">æ ç¾</span> 1285 </a> 1286 </div> 1287 1288 </nav> 1289 1290 1291 1292 <div class="links-of-author motion-element"> 1293 1294 1295 <span class="links-of-author-item"> 1296 <a href="http://www.github.com/xbay" target="_blank"> 1297 <i class="fa fa-github"></i> GitHub 1298 </a> 1299 </span> 1300 1301 <span class="links-of-author-item"> 1302 <a href="http://www.twitter.com/xbay" target="_blank"> 1303 <i class="fa fa-twitter"></i> Twitter 1304 </a> 1305 </span> 1306 1307 1308 </div> 1309 1310 1311 1312 1313 <div class="links-of-author motion-element"> 1314 1315 </div> 1316 1317 </section> 1318 1319 1320 1321 </div> 1322 </aside> 1323 1324 1325 1326 </main> 1327 1328 <footer id="footer" class="footer"> 1329 <div class="footer-inner"> <div class="copyright" > 1330 1331 © 1332 <span itemprop="copyrightYear">2016</span> 1333 <span class="with-love"> 1334 <i class="icon-next-heart fa fa-heart"></i> 1335 </span> 1336 <span class="author" itemprop="copyrightHolder">Alan, Bob, Mactive, Victor, Raven, Luka, Yak, Uni.Bell</span> 1337</div> 1338 1339<div class="powered-by"> 1340 ç± <a class="theme-link" href="http://hexo.io">Hexo</a> 强åé©±å¨ 1341</div> 1342 1343<div class="theme-info"> 1344 ä¸»é¢ - 1345 <a class="theme-link" href="https://github.com/iissnan/hexo-theme-next"> 1346 NexT 1347 </a> 1348</div> 1349 1350 1351 </div> 1352 </footer> 1353 1354 <div class="back-to-top"></div> 1355 </div> 1356 1357
1357<script type="text/javascript" src="/vendors/jquery/index.js?v=2.1.3"></script>
1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367
1367<script type="text/javascript"> 1368 var disqus_shortname = 'xbay'; 1369 var disqus_identifier = 'index.html'; 1370 var disqus_title = ''; 1371 var disqus_url = ''; 1372 1373 function run_disqus_script(disqus_script){ 1374 var dsq = document.createElement('script'); 1375 dsq.type = 'text/javascript'; 1376 dsq.async = true; 1377 dsq.src = '//' + disqus_shortname + '.disqus.com/' + disqus_script; 1378 (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq); 1379 } 1380 1381 run_disqus_script('count.js'); 1382 1383 </script>
1383 1384 1385 1386 1387 1388 1389
1389<script type="text/javascript" src="/vendors/fancybox/source/jquery.fancybox.pack.js"></script>
1389 1390
1390<script type="text/javascript" src="/js/fancy-box.js?v=0.4.5.2"></script>
1390 1391 1392 1393
1393<script type="text/javascript" src="/js/helpers.js?v=0.4.5.2"></script>
1393 1394 1395 1396
1396<script type="text/javascript" src="/vendors/velocity/velocity.min.js"></script>
1396 1397
1397<script type="text/javascript" src="/vendors/velocity/velocity.ui.min.js"></script>
1397 1398 1399
1399<script type="text/javascript" src="/js/motion_global.js?v=0.4.5.2" id="motion.global"></script>
1399 1400 1401 1402 1403 1404
1404<script type="text/javascript" src="/js/nav-toggle.js?v=0.4.5.2"></script>
1404 1405
1405<script type="text/javascript" src="/vendors/fastclick/lib/fastclick.min.js?v=1.0.6"></script>
1405 1406 1407 1408 1409
1409<script type="text/javascript"> 1410 $(document).ready(function () { 1411 if (CONFIG.sidebar === 'always') { 1412 displaySidebar(); 1413 } 1414 if (isMobile()) { 1415 FastClick.attach(document.body); 1416 } 1417 1418 motionIntegrator.bootstrap(); 1419 }); 1420 </script>
1420 1421 1422 1423 1424 1425 1426 1427 1428 1429
1429<script type="text/javascript" src="/js/lazyload.js"></script>
1429 1430
1430<script type="text/javascript"> 1431 $(function () { 1432 $("#posts").find('img').lazyload({ 1433 placeholder: "/images/loading.gif", 1434 effect: "fadeIn" 1435 }); 1436 }); 1437 </script>
1437 1438</body> 1439</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.