1<!DOCTYPE html> 2<html lang="en"> 3 4<head> 5 <meta charset="utf-8"> 6 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 7 <meta name="google-site-verification" content="xBT4GhYoi5qRD5tr338pgPM5OWHHIDR6mNg1a3euekI" /> 8 <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> 9 <meta name="description" content=""> 10 <meta name="keywords" content=""> 11 <meta name="theme-color" content="#000000"> 12 13 <!-- Open Graph --> 14 <meta property="og:title" content="About - ä¸åªèå±¥è«"> 15 16 <meta property="og:type" content="website"> 17 <meta property="og:description" content=""> 18 19 <meta property="og:image" content="/img/avatar-hux-ny.jpg"> 20 <meta property="og:url" content="/about/"> 21 <meta property="og:site_name" content="ä¸åªèå±¥è«"> 22 23 <title>About - ä¸åªèå±¥è«</title> 24 25 <!-- Web App Manifest --> 26 <link rel="manifest" href="/pwa/manifest.json"> 27 28 <!-- Favicon --> 29 <link rel="shortcut icon" href="/img/favicon.ico"> 30 31 <!-- Canonical URL --> 32 <link rel="canonical" href="/about/"> 33 34 <!-- Bootstrap Core CSS --> 35 <link rel="stylesheet" href="/css/bootstrap.min.css"> 36 37 <!-- Custom CSS --> 38 <link rel="stylesheet" href="/css/hux-blog.min.css"> 39 40 <!-- Custom Fonts --> 41 <!-- <link href="http://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet" type="text/css"> --> 42 <!-- Hux change font-awesome CDN to qiniu --> 43 <link href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet" type="text/css"> 44 45 46 <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> 47 <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> 48 <!--[if lt IE 9]> 49
49<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
49 50
50<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
50 51 <![endif]--> 52 53 <!-- ga & ba script hoook --> 54
54<script></script>
54 55</head> 56 57 58<!-- hack iOS CSS :active style --> 59<body ontouchstart=""> 60 61 <!-- Navigation --> 62 63 <nav class="navbar navbar-default navbar-custom navbar-fixed-top"> 64 65 <div class="container-fluid"> 66 <!-- Brand and toggle get grouped for better mobile display --> 67 <div class="navbar-header page-scroll"> 68 <button type="button" class="navbar-toggle"> 69 <span class="sr-only">Toggle navigation</span> 70 <span class="icon-bar"></span> 71 <span class="icon-bar"></span> 72 <span class="icon-bar"></span> 73 </button> 74 <a class="navbar-brand" href="/">ä¸åªèå±¥è«</a> 75 </div> 76 77 <!-- Collect the nav links, forms, and other content for toggling --> 78 <div id="huxblog_navbar"> 79 <div class="navbar-collapse"> 80 <ul class="nav navbar-nav navbar-right"> 81 <li> 82 <a href="/">Home</a> 83 </li> 84 85 86 87 88 <li> 89 <a href="/about/">About</a> 90 </li> 91 92 93 94 <li> 95 <a href="/archive/">Archive</a> 96 </li> 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 <li class="search-icon"> 116 <a href="javascript:void(0)"> 117 <i class="fa fa-search"></i> 118 </a> 119 </li> 120 </ul> 121 </div> 122 </div> 123 <!-- /.navbar-collapse --> 124 </div> 125 <!-- /.container --> 126 </nav> 127 128
128<script> 129 // Drop Bootstarp low-performance Navbar 130 // Use customize navbar with high-quality material design animation 131 // in high-perf jank-free CSS3 implementation 132 var $body = document.body; 133 var $toggle = document.querySelector('.navbar-toggle'); 134 var $navbar = document.querySelector('#huxblog_navbar'); 135 var $collapse = document.querySelector('.navbar-collapse'); 136 137 var __HuxNav__ = { 138 close: function () { 139 $navbar.className = " "; 140 // wait until animation end. 141 setTimeout(function () { 142 // prevent frequently toggle 143 if ($navbar.className.indexOf('in') < 0) { 144 $collapse.style.height = "0px" 145 } 146 }, 400) 147 }, 148 open: function () { 149 $collapse.style.height = "auto" 150 $navbar.className += " in"; 151 } 152 } 153 154 // Bind Event 155 $toggle.addEventListener('click', function (e) { 156 if ($navbar.className.indexOf('in') > 0) { 157 __HuxNav__.close() 158 } else { 159 __HuxNav__.open() 160 } 161 }) 162 163 /** 164 * Since Fastclick is used to delegate 'touchstart' globally 165 * to hack 300ms delay in iOS by performing a fake 'click', 166 * Using 'e.stopPropagation' to stop 'touchstart' event from 167 * $toggle/$collapse will break global delegation. 168 * 169 * Instead, we use a 'e.target' filter to prevent handler 170 * added to document close HuxNav. 171 * 172 * Also, we use 'click' instead of 'touchstart' as compromise 173 */ 174 document.addEventListener('click', function (e) { 175 if (e.target == $toggle) return; 176 if (e.target.className == 'icon-bar') return; 177 __HuxNav__.close(); 178 }) 179 </script>
179 180 <!-- Search --> 181<div class="search-page"> 182 <div class="search-icon-close-container"> 183 <span class="search-icon-close"> 184 <i class="fa fa-chevron-down"></i> 185 </span> 186 </div> 187 <div class="search-main container"> 188 <div class="row"> 189 <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1"> 190 <form></form> 191 <input type="text" id="search-input" placeholder="$ grep..."> 192 </form> 193 <div id="search-results" class="mini-post-list"></div> 194 </div> 195 </div> 196 </div> 197</div> 198 199 <!-- Page Header --> 200 201 202 203 204 205 206 207<header class="intro-header" style="background-image: url('/img/home-bg.jpg')"> 208 <div class="container"> 209 <div class="row"> 210 <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1"> 211 212 <div class="site-heading" id="tag-heading"> 213 214 <h1>About</h1> <!-- è¿éçHomeæ¯ä¸ªç¡¬ç¼ç ããã--> 215 <span class="subheading"></span> 216 </div> 217 </div> 218 </div> 219 </div> 220</header> 221 222 223<!-- Main Content --> 224<div class="container"> 225 <div class="row"> 226 227 228<!-- USE SIDEBAR --> 229 <!-- PostList Container --> 230 <div class=" 231 col-lg-8 col-lg-offset-1 232 col-md-8 col-md-offset-1 233 col-sm-12 234 col-xs-12 235 postlist-container 236 "> 237 <!-- Chinese Version --> 238<div class="zh post-container"> 239 240
241<p><strong>Hiï¼ææ¯éèµï¼ç¨åºååºæ¬åä¿®è¡ä¸â¦</strong><br /> 242[email protected]ï¼<a href="https://github.com/guosainpu">github</a></p> 243 244<p><img src="https://tva1.sinaimg.cn/large/008i3skNly1gqh1d2z4oyj31b20u07a4.jpg" alt="SOHO" /></p> 245 246 247</div> 248 249 </div> 250 <!-- Sidebar Container --> 251 <div class=" 252 col-lg-3 col-lg-offset-0 253 col-md-3 col-md-offset-0 254 col-sm-12 255 col-xs-12 256 sidebar-container 257 "> 258 <!-- Featured Tags --> 259 260 261 262<section> 263 264 <h5><a href="/archive/">FEATURED TAGS</a></h5> 265 <div class="tags"> 266 267 268 269 270 271 272 <a data-sort="0010" 273 href="/archive/?tag=%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80" 274 title="è®¡ç®æºåºç¡" 275 rel="23">è®¡ç®æºåºç¡</a> 276 277 <a data-sort="0021" 278 href="/archive/?tag=%E4%BB%8E0%E5%88%B01%E6%9E%84%E5%BB%BA%E8%AE%A1%E7%AE%97%E6%9C%BA" 279 title="ä»0å°1æå»ºè®¡ç®æº" 280 rel="12">ä»0å°1æå»ºè®¡ç®æº</a> 281 282 <a data-sort="0024" 283 href="/archive/?tag=iOS" 284 title="iOS" 285 rel="9">iOS</a> 286 287 <a data-sort="0028" 288 href="/archive/?tag=objc" 289 title="objc" 290 rel="5">objc</a> 291 292 <a data-sort="0029" 293 href="/archive/?tag=%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F" 294 title="æä½ç³»ç»" 295 rel="4">æä½ç³»ç»</a> 296 297 <a data-sort="0030" 298 href="/archive/?tag=%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80" 299 title="æ±ç¼è¯è¨" 300 rel="3">æ±ç¼è¯è¨</a> 301 302 <a data-sort="0030" 303 href="/archive/?tag=%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A1%AC%E4%BB%B6%E4%BD%93%E7%B3%BB" 304 title="è®¡ç®æºç¡¬ä»¶ä½ç³»" 305 rel="3">è®¡ç®æºç¡¬ä»¶ä½ç³»</a> 306 307 <a data-sort="0030" 308 href="/archive/?tag=OS%E5%86%85%E6%A0%B8" 309 title="OSå æ ¸" 310 rel="3">OSå æ ¸</a> 311 312 <a data-sort="0031" 313 href="/archive/?tag=%E6%95%B0%E5%AD%A6%E5%9F%BA%E7%A1%80" 314 title="æ°å¦åºç¡" 315 rel="2">æ°å¦åºç¡</a> 316 </div> 317</section> 318 319 320 <!-- Short About --> 321 <section class="visible-md visible-lg"> 322<!-- <hr> 323 <h5><a href="/about/">ABOUT ME</a></h5> 324 <div class="short-about"> 325 326 <img src="/img/avatar-hux-ny.jpg" /> 327 328 329 <p>For the next quantum leap<br>离å¼ä¸çä¹åï¼ä¸å齿¯è¿ç¨</p> 330 331 332 333 334<ul class="list-inline"> 335 336 337 338 339 340 341 342 343 344</ul> 345 </div> --> 346</section> 347 348 <!-- Friends Blog --> 349 350 </div> 351 352 </div> 353</div> 354 355 356 357 <!-- Footer --> 358<footer> 359 360</footer> 361 362<!-- jQuery -->
363<script src="/js/jquery.min.js "></script>
363 364 365<!-- Bootstrap Core JavaScript --> 366<!-- Currently, only navbar scroll-down effect at desktop still depends on this -->
367<script src="/js/bootstrap.min.js "></script>
367 368 369<!-- Custom Theme JavaScript -->
370<script src="/js/hux-blog.min.js "></script>
370 371 372<!-- Simple Jekyll Search -->
373<script src="/js/simple-jekyll-search.min.js"></script>
373 374 375<!-- Service Worker --> 376 377 378<!-- async load function -->
379<script> 380 function async(u, c) { 381 var d = document, t = 'script', 382 o = d.createElement(t), 383 s = d.getElementsByTagName(t)[0]; 384 o.src = u; 385 if (c) { o.addEventListener('load', function (e) { c(null, e); }, false); } 386 s.parentNode.insertBefore(o, s); 387 } 388</script>
388 389 390<!-- 391 Because of the native support for backtick-style fenced code blocks 392 right within the Markdown is landed in Github Pages, 393 From V1.6, There is no need for Highlight.js, 394 so Huxblog drops it officially. 395 396 - https://github.com/blog/2100-github-pages-now-faster-and-simpler-with-jekyll-3-0 397 - https://help.github.com/articles/creating-and-highlighting-code-blocks/ 398 - https://github.com/jneen/rouge/wiki/list-of-supported-languages-and-lexers 399--> 400<!-- 401
401<script> 402 async("http://cdn.bootcss.com/highlight.js/8.6/highlight.min.js", function(){ 403 hljs.initHighlightingOnLoad(); 404 }) 405 </script>
405 406 <link href="http://cdn.bootcss.com/highlight.js/8.6/styles/github.min.css" rel="stylesheet"> 407--> 408 409 410 411 412 413 414 415<!--fastClick.js -->
416<script> 417 async("//cdnjs.cloudflare.com/ajax/libs/fastclick/1.0.6/fastclick.min.js", function () { 418 var $nav = document.querySelector("nav"); 419 if ($nav) FastClick.attach($nav); 420 }) 421</script>
421 422 423 424<!-- Google Analytics --> 425
426<script> 427 // dynamic User by Hux 428 var _gaId = 'UA-49627206-1'; 429 var _gaDomain = 'huangxuan.me'; 430 431 // Originial 432 (function (i, s, o, g, r, a, m) { 433 i['GoogleAnalyticsObject'] = r; i[r] = i[r] || function () { 434 (i[r].q = i[r].q || []).push(arguments) 435 }, i[r].l = 1 * new Date(); a = s.createElement(o), 436 m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a, m) 437 })(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga'); 438 439 ga('create', _gaId, _gaDomain); 440 ga('send', 'pageview'); 441</script>
441 442 443 444 445<!-- Baidu Tongji --> 446 447 448 449<!-- Side Catalog --> 450
451<script type="text/javascript"> 452 function generateCatalog(selector) { 453 454 // interop with multilangual 455 if ('true' == 'true') { 456 _containerSelector = 'div.post-container.active' 457 } else { 458 _containerSelector = 'div.post-container' 459 } 460 461 // init 462 var P = $(_containerSelector), a, n, t, l, i, c; 463 a = P.find('h1,h2,h3,h4,h5,h6'); 464 465 // clean 466 $(selector).html('') 467 468 // appending 469 a.each(function () { 470 n = $(this).prop('tagName').toLowerCase(); 471 i = "#" + $(this).prop('id'); 472 t = $(this).text(); 473 c = $('<a href="' + i + '" rel="nofollow">' + t + '</a>'); 474 l = $('<li class="' + n + '_nav"></li>').append(c); 475 $(selector).append(l); 476 }); 477 return true; 478 } 479 480 generateCatalog(".catalog-body"); 481 482 // toggle side catalog 483 $(".catalog-toggle").click((function (e) { 484 e.preventDefault(); 485 $('.side-catalog').toggleClass("fold") 486 })) 487 488 /* 489 * Doc: https://github.com/davist11/jQuery-One-Page-Nav 490 * Fork by Hux to support padding 491 */ 492 async("/js/jquery.nav.js", function () { 493 $('.catalog-body').onePageNav({ 494 currentClass: "active", 495 changeHash: !1, 496 easing: "swing", 497 filter: "", 498 scrollSpeed: 700, 499 scrollOffset: 0, 500 scrollThreshold: .2, 501 begin: null, 502 end: null, 503 scrollChange: null, 504 padding: 80 505 }); 506 }); 507</script>
507 508 509 510 511<!-- Multi-Lingual --> 512 513<!-- Handle Language Change -->
514<script type="text/javascript"> 515 // get nodes 516 var $zh = document.querySelector(".zh"); 517 var $en = document.querySelector(".en"); 518 var $select = document.querySelector("select"); 519 520 // Changes at v1.8.1: include lang flag as a url query. This interop well with catalog hash anchors. 521 function getLang() { return new URLSearchParams(document.location.search).get("lang") } 522 523 function setLang(newLang) { 524 var params = new URLSearchParams(document.location.search) 525 params.set("lang", newLang) 526 document.location.search = params.toString() // refresh. 527 } 528 529 // handle render 530 function _render() { 531 var lang = getLang() 532 // en 533 if (lang == "en") { 534 $select.selectedIndex = 1; 535 $en.style.display = "block"; 536 $en.classList.add("active"); 537 $zh.style.display = "none"; 538 $zh.classList.remove("active"); 539 // default to zh-cn 540 } else { 541 $select.selectedIndex = 0; 542 $zh.style.display = "block"; 543 $zh.classList.add("active"); 544 $en.style.display = "none"; 545 $en.classList.remove("active"); 546 } 547 // interop with catalog 548 generateCatalog(".catalog-body"); 549 } 550 551 // handle select change 552 function onLanChange(index) { 553 if (index == 0) { 554 lang = "zh" 555 } else { 556 lang = "en" 557 } 558 setLang(lang) 559 } 560 561 // init 562 _render(); 563</script>
563 564 565 566<!-- Simple Jekyll Search -->
567<script> 568 // https://stackoverflow.com/questions/1912501/unescape-html-entities-in-javascript 569 function htmlDecode(input) { 570 var e = document.createElement('textarea'); 571 e.innerHTML = input; 572 // handle case of empty input 573 return e.childNodes.length === 0 ? "" : e.childNodes[0].nodeValue; 574 } 575 576 SimpleJekyllSearch({ 577 searchInput: document.getElementById('search-input'), 578 resultsContainer: document.getElementById('search-results'), 579 json: '/search.json', 580 searchResultTemplate: '<div class="post-preview item"><a href="{url}"><h2 class="post-title">{title}</h2><h3 class="post-subtitle">{subtitle}</h3><hr></a></div>', 581 noResultsText: 'No results', 582 limit: 50, 583 fuzzy: false, 584 // a hack to get escaped subtitle unescaped. for some reason, 585 // post.subtitle w/o escape filter nuke entire search. 586 templateMiddleware: function (prop, value, template) { 587 if (prop === 'subtitle' || prop === 'title') { 588 if (value.indexOf("code")) { 589 return htmlDecode(value); 590 } else { 591 return value; 592 } 593 } 594 } 595 }); 596 597 $(document).ready(function () { 598 var $searchPage = $('.search-page'); 599 var $searchOpen = $('.search-icon'); 600 var $searchClose = $('.search-icon-close'); 601 var $searchInput = $('#search-input'); 602 var $body = $('body'); 603 604 $searchOpen.on('click', function (e) { 605 e.preventDefault(); 606 $searchPage.toggleClass('search-active'); 607 var prevClasses = $body.attr('class') || ''; 608 setTimeout(function () { 609 $body.addClass('no-scroll'); 610 }, 400) 611 612 if ($searchPage.hasClass('search-active')) { 613 $searchClose.on('click', function (e) { 614 e.preventDefault(); 615 $searchPage.removeClass('search-active'); 616 $body.attr('class', prevClasses); // from closure 617 }); 618 $searchInput.focus(); 619 } 620 }); 621 }); 622</script>
622 623 624 625<!-- Image to hack wechat --> 626<img src="/img/icon_wechat.png" width="0" height="0" /> 627<!-- Migrate from head to bottom, no longer block render and still work --> 628 629</body> 630 631</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.