1<!DOCTYPE html>
1<script>var __pbpa = true;</script>
1<script>var translated_warning_string = 'Warning: Never enter your Tumblr password unless \u201chttps://www.tumblr.com/login\u201d\x0ais the address in your web browser.\x0a\x0aYou should also see a green \u201cTumblr, Inc.\u201d identification in the address bar.\x0a\x0aSpammers and other bad guys use fake forms to steal passwords.\x0a\x0aTumblr will never ask you to log in from a user\u2019s blog.\x0a\x0aAre you absolutely sure you want to continue?';</script>
1<script type="text/javascript" language="javascript" src="https://assets.tumblr.com/assets/scripts/pre_tumblelog.js?_v=b9f848c06fcba7eaf305d4a7cb7a1b98"></script>
1<!DOCTYPE html> 2<html> 3 <head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# blog: http://ogp.me/ns/blog#"> 4 <title>Spider Blog â Introducing Spider 0.1</title> 5 6 <meta charset="utf-8"> 7 <meta name="description" content="Introducing Spider 0.1" /> 8 9 <meta name="color:Accent" content="#4EA3D0"/> 10 <meta name="font:Body" content="'Helvetica Neue', Helvetica, Arial, sans-serif"/> 11 <meta name="if:Two column posts" content="1"/> 12 13 <!-- Appearance option --> 14 <meta name="if:Show bar on top" content="1"/> 15 <meta name="if:Show blog title" content="1"/> 16 <meta name="if:Show blog description" content="1"/> 17 <meta name="if:Show profile photo" content="1"/> 18 <meta name="if:Use endless scrolling" content="1"/> 19 20 21 <meta name="if:Show right column" content="1"/> 22 <meta name="if:Place timestamp in left column" content="1"/> 23 <meta name="if:Use larger font for quotes" content="0"/> 24 <meta name="if:Show image shadows" content="1"/> 25 <meta name="if:Show tags" content="1"/> 26 <meta name="if:Show post notes" content="1"/> 27 <meta name="if:Show copyright in footer" content="1"/> 28 <meta name="text:Disqus Shortname" content="" /> 29 <meta name="text:Google Analytics ID" content=""/> 30 31 <style>figure{margin:0}.tmblr-iframe{position:absolute}.tmblr-iframe.hide{display:none}.tmblr-iframe--amp-cta-button{bottom:10px;left:50%;position:fixed;transform:translateX(-50%);visibility:hidden;z-index:100}.tmblr-iframe--amp-cta-button.tmblr-iframe--loaded{animation:iframe-app-cta-transition .2s ease-out;visibility:visible}</style><link rel="stylesheet" media="screen" href="https://assets.tumblr.com/client/prod/standalone/blog-network-npf/index.build.css?_v=c84cc817a1ee7fd25e460c8fcc102f7b"><link rel="shortcut icon" href="https://64.media.tumblr.com/avatar_f6cbd80ac275_128.pnj" /> 32 <link rel="alternate" type="application/rss+xml" title="RSS" href="https://blog.spiderlang.org/rss"/> 33<link href="http://spiderlang.org/css/default.css" rel="stylesheet"> 34<link href='http://fonts.googleapis.com/css?family=Droid+Sans+Mono' rel='stylesheet' type='text/css'> 35 <!-- HTML5 Shiv --> 36 <!--[if lt IE 9]> 37
37<script src="https://static.tumblr.com/hriofhd/Qj0m8pn7q/html5shiv.js"></script>
37 38 <![endif]--> 39 40 <!-- Reset CSS --> 41 <link rel="stylesheet" href="https://static.tumblr.com/thpaaos/DIcklyl4z/reset.css" type="text/css"> 42 43 <!-- Theme CSS --> 44 <style type="text/css" media="screen"> 45 body { 46 -webkit-font-smoothing: antialiased; 47 font-size: 15px; 48 font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 49 line-height: 24px; 50 margin: 0; 51 padding: 0; 52 } 53 54 *:active, *:focus { outline-width: 0px; } 55 img { max-width: 100% } 56 .post .top.media img { width: 100%; } 57 a { text-decoration: none; color: #4EA3D0; } 58 a img { border-width: 0px; } 59 strong { font-weight: bold; } 60 em { font-style: italic; } 61 62 .group:after { 63 visibility: hidden; 64 display: block; 65 content: ""; 66 clear: both; 67 height: 0; 68 } 69 * html .group { zoom: 1; } /* IE6 */ 70 *:first-child+html .group { zoom: 1; } /* IE7 */ 71 72 iframe#tumblr_controls { 73 top: 12px !important; 74 } 75 76 #color_bar { 77 height: 12px; 78 background: #4EA3D0; 79 } 80 81 #container { 82 width: 950px; 83 margin: 0 auto; 84 padding: 60px 20px; 85 } 86 87 #header { 88 height: 48px; 89 margin: 0 0 60px 0; 90 } 91 92 #blog_info { 93 width: 700px; 94 margin: 0 60px 0 0; 95 float: left; 96 } 97 98 #blog_info h1 { 99 font-size: 36px; 100 font-weight: bold; 101 letter-spacing: -1px; 102 line-height: 36px; 103 margin: 8px 0 0 0; 104 } 105 106 #blog_info h1 a { 107 color: #333333; 108 } 109 110 #blog_info h1 a:hover { 111 color: #000; 112 } 113 114 #blog_info h1 a:active { 115 position: relative; 116 top: 1px; 117 } 118 119 #blog_info p, #blog_info .cont { 120 color: #646464; 121 margin-top: 7px; 122 } 123 124 .cont { 125 margin-bottom: 7px; 126 } 127 128 #blog_avatar { 129 width: 188px; 130 position: relative; 131 float: right; 132 133 } 134 135 #blog_avatar a { 136 width: 48px; 137 height: 48px; 138 139 -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, .21); 140 box-shadow: 0px 1px 3px rgba(0, 0, 0, .21); 141 142 position: absolute; 143 top: 0; 144 left: 0; 145 display: block; 146 } 147 148 #blog_avatar img { 149 width: 48px; 150 -webkit-border-radius: 2px; 151 -moz-border-radius: 2px; 152 border-radius: 2px; 153 } 154 155 #blog_avatar a::before { 156 content: " "; 157 width: 46px; 158 height: 46px; 159 -webkit-border-radius: 2px; 160 -moz-border-radius: 2px; 161 border-radius: 2px; 162 border: 1px solid rgba(0,0,0,.1); 163 position: absolute; 164 top: 0px; 165 left: 0px; 166 z-index: 999; 167 display: block; 168 } 169 170 #blog_avatar:hover a { 171 width: 64px; 172 height: 64px; 173 top: -8px; 174 left: -8px; 175 } 176 177 #blog_avatar:hover a img { 178 width: 64px; 179 } 180 181 #blog_avatar:hover a::before { 182 width: 62px; 183 height: 62px; 184 } 185 186 #blog_avatar:active a { 187 top: -7px; 188 -webkit-box-shadow: 0px 0px 1px rgba(0, 0, 0, .21); 189 box-shadow: 0px 0px 1px rgba(0, 0, 0, .21); 190 } 191 192 #posts { 193 width: 700px; 194 color: #4C4C4C; 195 margin: 0 60px 0 0; 196 float: left; 197 } 198 199 #posts .post { 200 list-style-type: none; 201 border-bottom: 1px solid #E6E6E6; 202 margin: 0 0 45px 0; 203 padding: 0 0 45px 0; 204 } 205 206 207 208 .top.audio * { 209 width: 700px; 210 height: 91px 211 } 212 213 .top.media { 214 line-height: 0; 215 216 -webkit-box-shadow: 0px 2px 7px 0px rgba(0, 0, 0, .27); 217 box-shadow: 0px 2px 7px 0px rgba(0, 0, 0, .27); 218 219 position: relative; 220 display: inline-block; 221 } 222 223 .top.media.photoset { 224 line-height: 0; 225 226 -webkit-box-shadow: none; 227 box-shadow: none; 228 229 position: relative; 230 display: inline-block; 231 } 232 233 .media img { 234 -webkit-border-radius: 2px; 235 -moz-border-radius: 2px; 236 border-radius: 2px; 237 } 238 239 .link_post .link { 240 color: #4EA3D0; 241 font-size: 21px; 242 font-weight: bold; 243 border: 1px solid rgba(78,163,208, 0.13); 244 background: rgba(78,163,208, 0.13); 245 -webkit-border-radius: 2px; 246 -moz-border-radius: 2px; 247 border-radius: 2px; 248 padding: 15px 53px 15px 20px; 249 position: relative; 250 display: block; 251 } 252 253 .link .arrow { 254 width: 0; 255 height: 0; 256 border-top: 8px solid transparent; 257 border-bottom: 8px solid transparent; 258 border-left: 12px solid #4EA3D0; 259 position: absolute; 260 top: 50%; 261 right: 20px; 262 margin-top: -8px; 263 display: block; 264 } 265 266 .link_post .link:hover { 267 border: 1px solid rgba(78,163,208, 0.2); 268 background: rgba(78,163,208, 0.2); 269 } 270 271 .link_post .link:active { 272 position: relative; 273 top: 1px; 274 } 275 276 #posts .post .caption_and_post_info.after_top_part { 277 border-top: 0;
278 margin: 30px auto auto auto; 279 padding-top: 0; 280 } 281 282 .post .caption { 283 width: auto; 284 float: none; 285 } 286 287 288 .post .caption { 289 width: 513px; 290 float: right; 291 } 292 293 294 .content_source { 295 margin-bottom: 20px; 296 } 297 298 .content_source img { 299 margin: 0 0 0 4px !important; 300 opacity: 0.7; 301 vertical-align: middle; 302 } 303 304 .caption a, .description a { 305 color: #4EA3D0; 306 padding: 0 1px; 307 } 308 309 .caption a:hover, .description a:hover { 310 background: rgba(78,163,208, 0.13); 311 } 312 313 .caption a:active, .description a:active { 314 background: rgba(78,163,208, 0.2); 315 } 316 317 .caption h2 { 318 font-size: 32px; 319 line-height: 33px; 320 margin: 0 0 18px 0; 321 } 322 323 .caption h2 a { 324 color: #333; 325 font-weight: bold; 326 letter-spacing: -1px; 327 } 328 329 .caption h2 a:hover { 330 color: #4EA3D0; 331 background: transparent; 332 } 333 334 .caption blockquote { 335 border-left: 2px solid #E6E6E6; 336 padding: 1px 0 1px 20px; 337 } 338 339 .caption pre { 340 background: #eee; 341 font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Anonymous Pro", "Courier New", monospace, serif; 342 overflow: scroll; 343 padding: 10px; 344 border-radius: 3px; 345 font-size: 13px; 346 line-height: 19px; 347 } 348 349 .caption p, 350 .caption ol, 351 .caption ul, 352 .caption pre, 353 .caption h1, 354 .caption h2, 355 .post h3, 356 .caption h4, 357 .caption h5, 358 .caption blockquote, 359 .caption img, 360 .caption embed, 361 .caption object { 362 margin: 0 0 20px 0; 363 } 364 365 .caption p:empty { 366 display: none; 367 } 368 369 .caption iframe { 370 display: block !important; 371 } 372 373 .post .caption ul, 374 .post .caption ol { 375 margin-left: 18px; 376 } 377 378 .caption .question { 379 display: block; 380 padding: 15px; 381 font-size: 15px; 382 } 383 384 .caption .answer { 385 margin-top: 20px; 386 } 387 388 .caption .asker { 389 line-height: 24px; 390 margin: 25px 20px 0 23px; 391 } 392 393 .caption .asker img { 394 float: left; 395 margin: 0 7px 0 0; 396 } 397 398 .caption .asker a { 399 margin-left: 0; 400 } 401 402 .caption .quote { 403 color: #333; 404 font-weight: bold; 405 } 406 407 .quote span { 408 display: inline-block; 409 } 410 411 .quote.short_text { 412 font-size: 50px; 413 letter-spacing: -2px; 414 line-height: 48px; 415 margin: 0 0 18px 0; 416 } 417 418 .quote.short_text span { 419 margin: 0 0 0 -22px; 420 } 421 422 .quote.medium_text { 423 font-size: 36px; 424 letter-spacing: -1px; 425 line-height: 36px; 426 margin: 0 0 20px 0; 427 } 428 429 .quote.medium_text span { 430 margin: 0 0 0 -13px; 431 } 432 433 .quote.long_text, 434 .quote.text { 435 font-size: 24px; 436 line-height: 27px; 437 margin: 0 0 20px 0; 438 } 439 440 .quote.long_text span { 441 margin: 0 0 0 -9px; 442 } 443 444 .quote.larger_text { 445 font-size: 50px !important; 446 letter-spacing: -2px !important; 447 line-height: 48px !important; 448 margin: 0 0 18px 0 !important; 449 } 450 451 .quote.larger_text span { 452 margin: 0 0 0 -22px !important; 453 } 454 455 .quote_source { 456 margin: 0 0 20px 0 !important; 457 } 458 459 .caption .conversation { 460 margin-left: 0 !important; 461 margin-bottom: 30px; 462 list-style-type: none; 463 } 464 465 .conversation .chat_line { 466 padding: 10px 16px; 467 } 468 469 .conversation .chat_line.user1 { 470 background: #f5f5f5; 471 } 472 473 .conversation .chat_line.user2 { 474 background: #fff; 475 } 476 477 .conversation .chat_line.user3 { 478 background: #ddd; 479 } 480 481 .conversation .chat_line.user4 { 482 background: #ccc; 483 } 484 485 .post .post_info { 486 width: auto; 487 font-size: 12px; 488 font-family: 'Times New Roman', Times, serif; 489 letter-spacing: 2px; 490 text-transform: uppercase; 491 list-style-type: none; 492 -webkit-font-smoothing: subpixel-antialiased; 493 margin: 1px 0 0 -3px; 494 overflow: hidden; 495 } 496 497 .post_info li { 498 line-height: 14px; 499 margin: 10px 0; 500 float: left; 501 } 502 503 .post_info li a { 504 margin: 0 10px 0 0; 505 padding: 0 2px 0 5px; 506 } 507 508 .post_info .timestamp { 509 color: #4c4c4c; 510 padding: 0 2px 0 5px; 511 display: inline-block; 512 } 513 514 .post_info .timestamp:hover { 515 background: rgba(0,0,0,.08); 516 } 517 518 .post_info .timestamp:active { 519 background: rgba(0,0,0,.1); 520 } 521 522 .post_info .notecount { 523 color: #4c4c4c; 524 padding: 0 2px 0 5px; 525 display: inline-block; 526 } 527 528 .post_info .notecount:hover { 529 background: rgba(0,0,0,.08); 530 } 531 532 .post_info .notecount:active { 533 background: rgba(0,0,0,.1); 534 } 535 536 /* Post controls */ 537 538 .post_controls { 539 border: 1px solid #e8e8e8; 540 border-radius: 3px; 541 float: left; 542 list-style: none; 543 margin: -10px 15px 15px 0; 544 } 545 546 /* requires high specificity */ 547 .post .post_info .post_controls li, 548 .post .post_info.floating .post_controls li { 549 float: left; 550 margin: 0; 551 padding: 7px 15px; 552 height: 21px; 553 } 554 555 .post_controls li:first-child { 556 border-right: 1px solid #e8e8e8; 557 } 558 559 .post .post_info .post_controls li a, 560 .post .post_info.floating .post_controls li a { 561 margin: 0; 562 padding: 0; 563 } 564 565 566 /* Baselines */ 567 568 .tag { 569 color: #4EA3D0; 570 display: table; 571 } 572 573 .tag span { 574 color: #4c4c4c; 575 display: table-cell; 576 } 577 578 .tag:hover { 579 background: rgba(78,163,208, 0.13); 580 } 581 582 .tag:hover span { 583 color: #4EA3D0; 584 } 585 586 .tag:active { 587 background: rgba(78,163,208, 0.2); 588 } 589 590 .post .post_info.floating { 591 width: 157px; 592 float: left; 593 } 594 595 .post .post_info.floating li { 596 float: none; 597 } 598 599 .post_notes { 600 clear: both; 601 } 602 603 ol.notes { 604 color: #4C4C4C; 605 font-size: 13px; 606 text-shadow: 0px 1px 0px rgba(255,255,255,.7); 607 text-align: left; 608 list-style-type: none; 609 border-top: solid 1px #E6E6E6; 610 -webkit-font-smoothing: subpixel-antialiased !important; 611 margin: 40px auto auto auto; 612 } 613 614 ol.notes li.note { 615 border-bottom: solid 1px #E6E6E6; 616 padding: 9px 0 10px 0; 617 } 618 619 ol.notes li.note img.avatar { 620 width: 16px; 621 height: 16px; 622 border-radius: 3px; 623 vertical-align: -4px; 624 margin-right: 6px; 625 } 626 627 ol.notes a { 628 color: #4C4C4C; 629 text-decoration: underline; 630 } 631 632 ol.notes a:hover { 633 color: #4C4C4C; 634 } 635 636 ol.notes li.note blockquote { 637 border-color: #eee; 638 padding: 4px 10px; 639 margin: 10px 0px 0px 25px; 640 } 641 642 ol.notes li.note blockquote a { 643 text-decoration: none; 644 } 645 646 ol.notes li.note:last-child { 647 border-width: 0px; 648 } 649 650 #sidebar { 651 width: 188px; 652 color: #4c4c4c; 653 font-size: 14px; 654 margin: -8px 0 0 0; 655 float: right; 656 } 657 658 #sidebar .description { 659 line-height: 21px; 660 border-bottom: 1px solid #E6E6E6; 661 margin: 3px 0 20px 0; 662 padding: 0 0 20px 0; 663 } 664 665 #sidebar .links { 666 font-size: 12px; 667 font-family: 'Times New Roman', Times, serif; 668 letter-spacing: 2px; 669 text-transform: uppercase; 670 list-style-type: none; 671 -webkit-font-smoothing: subpixel-antialiased; 672 margin: 0 0 20px 0; 673 line-height: 20px; 674 } 675 676 #sidebar .links a { 677 color: #4c4c4c; 678 } 679 680 #sidebar .links a:hover { 681 color: #4EA3D0; 682 } 683 684 .links .icon { 685 width: 12px; 686 height: 12px; 687 background: #383838 url('https://static.tumblr.com/thpaaos/1xRm66voi/icons_sprite.png'); 688 margin: 0 8px 0 0; 689 display: inline-block; 690 } 691 692 .links a:hover .icon { 693 background-color: #4EA3D0; 694 } 695 696 .ask .icon { background-position: 0 0; margin-bottom: -2px; } 697 .submit .icon { background-position: 0 -12px; margin-bottom: -1px; } 698 .rss .icon { background-position: 0 -24px; } 699 .archive .icon { background-position: 0 -36px; } 700 701 .bubble { 702 color: #6f6f6f; 703 font-size: 13px; 704 line-height: 20px; 705 background: #f5f5f5; 706 border: 1px solid #d5d5d5; 707 -webkit-border-radius: 4px; 708 -moz-border-radius: 4px; 709 border-radius: 4px; 710 padding: 8px 12px; 711 position: relative; 712 display: none; 713 } 714 715 #twitter_container .bubble:first-child { 716 display: block; 717 } 718 719 .bubble .arrow { 720 width: 0; 721 height: 0; 722 position: absolute; 723 display: block; 724 } 725 726 .bubble .arrow.fill { 727 border-left: 8px solid transparent; 728 border-right: 8px solid transparent; 729 border-top: 8px solid #f5f5f5; 730 bottom: -8px; 731 left: 25px; 732 } 733 734 .bubble .arrow.border { 735 border-left: 10px solid transparent; 736 border-right: 10px solid transparent; 737 border-top: 10px solid #d5d5d5; 738 bottom: -10px; 739 left: 23px; 740 } 741 742 .bubble:hover { 743 background: #f2f2f2; 744 border-color: #CFCFCF; 745 } 746 747 .bubble:hover .arrow.fill { 748 border-top-color: #F1F1F1; 749 } 750 751 .bubble:hover .arrow.border { 752 border-top-color: #d5d5d5; 753 } 754 755 .twitter_username { 756 max-width: 166px; 757 color: #4c4c4c; 758 font-size: 12px; 759 font-family: 'Times New Roman', Times, serif; 760 letter-spacing: 0.4em; 761 text-transform: uppercase; 762 text-overflow: ellipsis; 763 -webkit-font-smoothing: subpixel-antialiased; 764 margin: 11px 0 0 22px; 765 overflow: hidden; 766 display: inline-block; 767 opacity: 1;
768 } 769 770 .twitter_username:hover { 771 color: #4EA3D0; 772 } 773 774 #footer { 775 width: 700px; 776 color: #4C4C4C; 777 font-size: 12px; 778 font-family: 'Times New Roman', Times, serif; 779 letter-spacing: 2px; 780 text-transform: uppercase; 781 -webkit-font-smoothing: subpixel-antialiased; 782 } 783 784 #footer .copyright { 785 width: 50%; 786 float: left; 787 } 788 789 #footer .pagination { 790 width: 230px; 791 text-align: right; 792 float: right; 793 position: relative; 794 } 795 796 .pagination .count { 797 float: left; 798 } 799 800 .pagination .buttons { 801 width: 113px; 802 height: 30px; 803 margin: -2px 0 0 30px; 804 float: right; 805 position: absolute; 806 top: 0; 807 right: 0; 808 z-index: 10; 809 } 810 811 .pagination .buttons.disabled { 812 z-index: 9; 813 } 814 815 .buttons a, 816 .buttons li { 817 width: 56px; 818 height: 28px; 819 line-height: 999px; 820 text-align: center; 821 border: 1px solid #C8C8C8; 822 -webkit-box-shadow: inset 0px 1px 0px 0px rgba(255, 255, 255, 1); 823 box-shadow: inset 0px 1px 0px 0px rgba(255, 255, 255, 1); 824 background: #f1f1f1; /* Old browsers */ 825 background: -moz-linear-gradient(top, #f1f1f1 0%, #e8e8e8 100%); /* FF3.6+ */ 826 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f1f1f1), color-stop(100%,#e8e8e8)); /* Chrome,Safari4+ */ 827 background: -webkit-linear-gradient(top, #f1f1f1 0%,#e8e8e8 100%); /* Chrome10+,Safari5.1+ */ 828 background: -o-linear-gradient(top, #f1f1f1 0%,#e8e8e8 100%); /* Opera 11.10+ */ 829 background: -ms-linear-gradient(top, #f1f1f1 0%,#e8e8e8 100%); /* IE10+ */ 830 background: linear-gradient(top, #f1f1f1 0%,#e8e8e8 100%); /* W3C */ 831 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f1f1f1', endColorstr='#e8e8e8',GradientType=0 );/* IE6-9 */ 832 list-style-type: none; 833 overflow: hidden; 834 position: relative; 835 display: block; 836 } 837 838 .buttons.disabled li { 839 background: #f5f5f5; 840 } 841 842 .buttons a:active { 843 -webkit-box-shadow: none; 844 box-shadow: none; 845 background: #E6E6E6; 846 } 847 848 .buttons .arrow { 849 width: 10px; 850 height: 14px; 851 position: absolute; 852 top: 50%; 853 display: block; 854 background-image: url(https://static.tumblr.com/ogedyaw/xu1m8jxnf/arrow_sprite.png); 855 } 856 857 .buttons .left { 858 -webkit-border-top-left-radius: 2px; 859 -webkit-border-bottom-left-radius: 2px; 860 -moz-border-radius-topleft: 2px; 861 -moz-border-radius-bottomleft: 2px; 862 border-top-left-radius: 2px; 863 border-bottom-left-radius: 2px; 864 position: absolute; 865 left: 0; 866 } 867 868 .left .arrow { 869 background-position: 0 15px; 870 margin: -7px auto auto 20px; 871 } 872 873 .disabled .left .arrow { 874 background-position: 0 0; 875 } 876 877 .buttons .right { 878 border-left-width: 1px; 879 -webkit-border-top-right-radius: 2px; 880 -webkit-border-bottom-right-radius: 2px; 881 -moz-border-radius-topright: 2px; 882 -moz-border-radius-bottomright: 2px; 883 border-top-right-radius: 2px; 884 border-bottom-right-radius: 2px; 885 position: absolute; 886 right: 0; 887 } 888 889 .right .arrow { 890 background-position: 10px -71px; 891 margin: -7px auto auto 24px; 892 } 893 894 .disabled .right .arrow { 895 background-position: 10px -56px; 896 } 897 898 /* Protection for parents that have floating children */ 899 #header:after, 900 #container:after, 901 .caption_and_post_info:after,
902 #footer:after 903 .buttons:after { 904 content: "."; 905 display: block; 906 height: 0; 907 clear: both; 908 visibility: hidden; 909 } 910 </style> 911 912 913 <!-- Simplified permalink pages (Hides right column) --> 914 <style type="text/css" media="screen"> 915 #container { 916 width: 700px; 917 } 918 919 #header { 920 width: 700px; 921 } 922 923 #blog_info { 924 width: 513px; 925 margin: 0; 926 } 927 928 #blog_avatar { 929 width: 48px; 930 height: 48px; 931 backround-color: red; 932 } 933 934 #blog_avatar a { 935 position: absolute; 936 left: auto; 937 right: 0; 938 } 939 940 #blog_avatar:hover a { 941 left: auto; 942 right: -8px; 943 } 944 945 #sidebar { 946 display: none; 947 } 948 949 #blog_info { 950 951 } 952 953 #blog_info .description { 954 margin-bottom: 60px; 955 } 956 957 .post .post_info, 958 .post .post_info.floating, 959 .post .caption { 960 width: auto !important; 961 float: none; 962 } 963 964 .post .post_info { 965 margin-top: 45px; 966 } 967 968 .post .post_info li, 969 .post .post_info.floating li { 970 line-height: 14px; 971 margin-bottom: 10px; 972 float: left; 973 } 974 975 .post .post_info li a, 976 .post .post_info.floating li a { 977 margin: 0 10px 0 0; 978 padding: 0 2px 0 5px; 979 } 980 </style> 981 982 983 984 985 <!-- Custom CSS --> 986 <style type="text/css" media="screen"> 987 988 </style> 989<style> 990 pre { 991 padding: 0 !important; 992 overflow: hidden !important; 993 } 994 pre code { 995 font-family: 'Droid Sans Mono'; 996 } 997 h3{ 998 font-size: 20px; 999 } 1000</style> 1001 <link rel="alternate" href="android-app://com.tumblr/tumblr/x-callback-url/blog?blogName=alongubkin-blog%26postID=103752682650" /><link rel="alternate" href="ios-app://305343404/tumblr/x-callback-url/blog?blogName=alongubkin-blog&postID=103752682650" /><link rel="alternate" type="application/json+oembed" href="https://www.tumblr.com/oembed/1.0?url=https://blog.spiderlang.org/post/103752682650/introducing-spider-01" title="Introducing Spider 0.1 1002Spider is a brand new language to avoid JavaScript’s bad side while embracing its good side. It takes the best ideas of Go, Swift, Python, C# and CoffeeScript, and targets ES5 and ES6. 1003It was introduced two weeks ago, and since..."/><link rel="amphtml" href=https://blog.spiderlang.org/post/103752682650/introducing-spider-01/amp />
1003<script 1004 defer 1005 type="application/javascript" 1006 id="bilmur" 1007 data-provider="tumblr.com" 1008 data-service="blognetwork" 1009 data-customproperties='{"theme": ""}' 1010 nonce="GAhC9LluHa5NRhHLZ1GgainAyw" 1011 src="https://s0.wp.com/wp-content/js/bilmur.min.js?m=202641" 1012 ></script>
1012<script src="https://assets.tumblr.com/assets/scripts/tumblelog_post_message_queue.js?_v=a8fadfa499d8cb7c3f8eefdf0b1adfdd"></script>
1012<link rel="stylesheet" type="text/css" href="https://assets.tumblr.com/fonts/gibson/stylesheet.css?v=3"><!-- BEGIN TUMBLR FACEBOOK OPENGRAPH TAGS --><!-- If you'd like to specify your own Open Graph tags, define the og:url and og:title tags in your theme's HTML. --><!-- Read more: http://ogp.me/ --><meta property="fb:app_id" content="48119224995" /><meta property="og:site_name" content="Tumblr" /><meta property="og:title" content="Introducing Spider 0.1" /><meta property="og:description" content="Spider is a brand new language to avoid JavaScript's bad side while embracing its good side. It takes the best ideas of Go, Swift, Python, C# and CoffeeScript, and targets ES5 and ES6. 1013It was..." /><meta property="og:url" content="https://blog.spiderlang.org/post/103752682650/introducing-spider-01" /><meta property="og:type" content="article" /><meta property="al:ios:url" content="tumblr://x-callback-url/blog?blogName=alongubkin-blog&postID=103752682650" /><meta property="al:ios:app_name" content="Tumblr" /><meta property="al:ios:app_store_id" content="305343404" /><meta property="al:android:url" content="tumblr://x-callback-url/blog?blogName=alongubkin-blog&postID=103752682650" /><meta property="al:android:app_name" content="Tumblr" /><meta property="al:android:package" content="com.tumblr" /><!-- END TUMBLR FACEBOOK OPENGRAPH TAGS --><!-- GOOGLE CAROUSEL -->
1013<script type="application/ld+json"> 1014 {"@type":"SocialMediaPosting","url":"https:\/\/blog.spiderlang.org\/post\/103752682650\/introducing-spider-01","mainEntityOfPage":true,"datePublished":"2014-11-27T21:43:00+00:00","author":{"@type":"Person","name":"alongubkin-blog","url":"https:\/\/blog.spiderlang.org\/","image":{"@type":"ImageObject","url":"https:\/\/64.media.tumblr.com\/avatar_f6cbd80ac275_96.pnj","width":96,"height":96}},"headline":"Introducing Spider 0.1","articleBody":"Spider is a brand new language to avoid JavaScript\u2019s bad side while embracing its good side. It takes the best ideas of Go, Swift, Python, C# and CoffeeScript, and targets ES5 and ES6.\nIt was introduced two weeks ago, and since then, it got almost 700 stars in GitHub, 84 issues and dozens of new...","@context":"http:\/\/schema.org"}</script>
1014<link rel="canonical" href="https://blog.spiderlang.org/post/103752682650/introducing-spider-01" /></head> 1015 <body> 1016 <section id="color_bar"></section> 1017 1018 <section id="container" class="group"> 1019 <header id="header"> 1020 <section id="blog_info"> 1021 <h1><a href="/">Spider Blog</a></h1> 1022 1023 1024 </section> 1025 1026 1027 <section id="blog_avatar"> 1028 <a href="/" class="avatar"><img src="https://64.media.tumblr.com/avatar_f6cbd80ac275_64.pnj"></a> 1029 </section> 1030 1031 </header> 1032 1033 <aside id="sidebar"> 1034 1035 1036 1037 1038 <ul class="links" style="display:none;"> 1039 1040 1041 </ul> 1042 1043 <ul class="links"> 1044 <li><a href="https://blog.spiderlang.org/rss" class="rss"><span class="icon"></span>rss</a></li> 1045 <li><a href="/archive" class="archive"><span class="icon"></span>archive</a></li> 1046 </ul> 1047 1048 1049 </aside> 1050 1051 <ul id="posts"> 1052 <!-- START POSTS --> 1053 1054 1055 <li class="post group" style="padding:0" > 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 <section class="group caption_and_post_info 1068 1069 1070 1071 1072 1073 "> 1074 1075 <section class="caption group"> 1076 <h2><a href="https://blog.spiderlang.org/post/103752682650/introducing-spider-01">Introducing Spider 0.1</a></h2> 1077 <div class="cont group"><p><a href="http://spiderlang.org/">Spider</a> is a brand new language to avoid JavaScript’s bad side while embracing its good side. It takes the best ideas of <strong>Go</strong>, <strong>Swift</strong>, <strong>Python</strong>, <strong>C#</strong> and <strong>CoffeeScript</strong>, and targets <strong>ES5</strong> and <strong>ES6</strong>.</p><p>It was introduced two weeks ago, and since then, it got almost <a href="https://github.com/alongubkin/spider">700 stars in GitHub</a>, <a href="https://github.com/alongubkin/spider/issues">84 issues</a> and dozens of new features and bugfixes. If you haven’t heard of it yet, take a look at “<a href="http://spiderlang.org/#why-spider">Why Spider?</a>”.</p><p>In this post, I want to highlight <em>some</em> of the new features that might excite you.</p><h3><strong>Channels</strong></h3><p><a href="http://spiderlang.org/#channels">Channels</a> are an easy way to communicate between sequential processes. They can be used anywhere: from <strong>UI abstraction</strong> in the browser to <strong>complex Node.js services</strong>.</p><p>Channels were highly inspired (or, more accurately, stolen) from Google’s Go programming language.</p><pre><code class="lang-js">var channel = new Channel(); 1078 1079fn sendMail(title, body) { 1080 var message = { title, body }; 1081 channel <- message; 1082 1083 console.log("Message added to queue."); 1084} 1085 1086go { 1087 while true { 1088 smtp.send(<-channel); 1089 } 1090}; 1091</code></pre><h3><strong>Async/Await</strong></h3><p>With <a href="http://spiderlang.org/#async">async functions</a>, you can await on a promise. This halts the function in a non-blocking way, waits for the promise to resolve & returns the value.</p><p>Yet again, the concept was stolen from another language. This time it’s C#, though.</p><pre><code>async fn loadStory() { 1092 try { 1093 var story = await getJSON('story.json'); 1094 addHtmlToPage(story.heading); 1095 for chapter in story.chapterURLs.map(getJSON) { 1096 addHtmlToPage((await chapter).html); 1097 } 1098 addTextToPage("All done"); 1099 } catch err { 1100 addTextToPage("Argh, broken: \(err.message)"); 1101 } 1102} 1103</code></pre><p>With a little help from the <a href="https://github.com/petkaantonov/bluebird">bluebird</a> library, <code>await</code> can also be used on Node.js-style callbacks to get rid of <a href="http://callbackhell.com/">callback hell</a>:</p><pre><code>var fs = Promise.promisifyAll(require("fs")); 1104 1105async fn readFiles() { 1106 var file1 = await fs.readFileAsync("file1.json"); 1107 var file2 = await fs.readFileAsync("file2.json"); 1108 var file3 = await fs.readFileAsync("file3.json"); 1109 var file4 = await fs.readFileAsync("file4.json"); 1110 console.log(file1, file2, file3, file4); 1111} 1112</code></pre><p>Parallel version:</p><pre><code>var fs = Promise.promisifyAll(require("fs")); 1113 1114async fn readFiles() { 1115 var [file1, file2, file3, file4] = await Promise.all([ 1116 fs.readFileAsync("file1.json"), 1117 fs.readFileAsync("file2.json"),
1118 fs.readFileAsync("file3.json"), 1119 fs.readFileAsync("file4.json") 1120 ]); 1121 1122 console.log(file1, file2, file3, file4); 1123}</code></pre><h3><strong>Pattern Matching</strong></h3><p><a href="http://spiderlang.org/#switch-pattern-matching">Pattern matching</a> is a powerful technique that allows you to use a switch statement on multiple variables or expressions.</p><pre><code>fn fizzbuzz(i) { 1124 var result = [i % 3, i % 5]; 1125 switch result { 1126 case [0, 0]: { 1127 return "FizzBuzz" 1128 } 1129 1130 case [0, ]: { 1131 return "Fizz" 1132 } 1133 1134 case [, 0]: { 1135 return "Buzz" 1136 } 1137 1138 default: { 1139 return "\(i)" 1140 } 1141 } 1142} 1143 1144for number in [1...100] { 1145 console.log(fizzbuzz(number)) 1146} 1147</code></pre><h3><strong>Curried Functions</strong></h3><p><a href="http://spiderlang.org/#functions-curried-functions">Currying</a> is a technique of transforming a function which takes multiple arguments in such a way that it can be called as a chain of functions.</p><p>Curried functions work extremely well in functional-style programming.</p><pre><code>fn sortBy(key, array) { 1148 return array.sort((a, b) -> a[key] - b[key]); 1149} 1150 1151var sortById = sortBy^("id"); 1152var sortByAge = sortBy^("age"); 1153 1154var people = [ 1155 { id: 1, name: "Daniel", age: 27 }, 1156 { id: 5, name: "John", age: 18 }, 1157 { id: 2, name: "Robot", age: 70 } 1158]; 1159 1160var peopleById = sortById(people); 1161var peopleByAge = sortByAge(people);</code></pre><p>Among the new features that were added: <a href="http://spiderlang.org/index.html#using-spider-compilation-target">ES6 Compilation Target</a>, <a href="http://spiderlang.org/index.html#modules">Modules</a>, <a href="http://spiderlang.org/index.html#destructuring">Destructring Assignments</a>, <a href="http://spiderlang.org/index.html#shorthand-notations">Shorthand Notations</a>, <a href="http://spiderlang.org/index.html#strings-multi-line-strings">Multi-line Strings</a> and <a href="http://spiderlang.org/index.html#switch-no-implicit-fallthrough">Fallthrough Statement</a>.</p><p>And that’s just the beginning. Some of the upcoming features are: macros, optional typing and generators.</p><p>Spider is still extremely new, but it is advancing fast. If you’re interested in it, make sure to <a href="https://github.com/alongubkin/spider">star the repo</a> and join the IRC channel (<a href="http://webchat.freenode.net/?channels=spiderlang">#spiderlang</a> on Freenode).</p></div> 1162 1163 </section> 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 <ul class=" 1183 post_info 1184 1185 floating 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 "> 1201 1202 <li> 1203 <ul class="post_controls group"> 1204 <li><a href="https://www.tumblr.com/reblog/alongubkin-blog/103752682650/q0bAHC9Y" class="reblog_button"style="display: block;width:21px;height:21px;"><svg width="100%" height="100%" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="#000"><path d="M5.01092527,5.99908429 L16.0088498,5.99908429 L16.136,9.508 L20.836,4.752 L16.136,0.083 L16.1360004,3.01110845 L2.09985349,3.01110845 C1.50585349,3.01110845 0.979248041,3.44726568 0.979248041,4.45007306 L0.979248041,10.9999998 L3.98376463,8.30993634 L3.98376463,6.89801007 C3.98376463,6.20867902 4.71892527,5.99908429 5.01092527,5.99908429 Z"></path><path d="M17.1420002,13.2800293 C17.1420002,13.5720293 17.022957,14.0490723 16.730957,14.0490723 L4.92919922,14.0490723 L4.92919922,11 L0.5,15.806 L4.92919922,20.5103758 L5.00469971,16.9990234 L18.9700928,16.9990234 C19.5640928,16.9990234 19.9453125,16.4010001 19.9453125,15.8060001 L19.9453125,9.5324707 L1
12047.142,12.203"></path></svg></a></li> 1205 <li><div class="like_button" data-post-id="103752682650" data-blog-name="alongubkin-blog" id="like_button_103752682650"><iframe id="like_iframe_103752682650" src="https://assets.tumblr.com/assets/html/like_iframe.html?_v=c96f30edcf75919c3976e1403422560b#name=alongubkin-blog&post_id=103752682650&color=black&rk=q0bAHC9Y&slug=introducing-spider-01" scrolling="no" width="21" height="21" frameborder="0" class="like_toggle" allowTransparency="true" name="like_iframe_103752682650"></iframe></div></li> 1206 </ul> 1207 </li> 1208 1209 <li><a href="https://blog.spiderlang.org/post/103752682650/introducing-spider-01" class=" 1210 timestamp 1211 has_caption with_title 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 ">November 27, 2014 (11:43 pm)</a></li> 1222 1223 1224 1225 <li><a class="notecount" href="https://blog.spiderlang.org/post/103752682650/introducing-spider-01#notes">9 notes</a></li> 1226 1227 1228 1229 1230 1231 1232 </ul> 1233 1234 <section class="post_notes"> 1235 <a name="notes"> 1236 1237<ol class="notes"><!-- START NOTES --><li class="note like tumblelog_alebagnato without_commentary"><a rel="nofollow" class="avatar_frame" target="_blank" href="https://alebagnato.tumblr.com/" title="ale " rel="nofollow"><img src="https://64.media.tumblr.com/avatar_0256111d693c_16.pnj" class="avatar " alt="" /></a><span class="action"><a rel="nofollow" href="https://alebagnato.tumblr.com/" title="ale" rel="nofollow">alebagnato</a> liked this </span><div class="clear"></div></li><li class="note like tumblelog_watnotevenmad without_commentary"><a rel="nofollow" class="avatar_frame" target="_blank" href="https://watnotevenmad.tumblr.com/" title="Ballad of an INTJ " rel="nofollow"><img src="https://64.media.tumblr.com/avatar_040545337a01_16.pnj" class="avatar " alt="" /></a><span class="action"><a rel="nofollow" href="https://watnotevenmad.tumblr.com/" title="Ballad of an INTJ" rel="nofollow">watnotevenmad</a> liked this </span><div class="clear"></div></li><li class="note reblog tumblelog_kevintcoughlin without_commentary"><a rel="nofollow" class="avatar_frame" target="_blank" href="https://kevintcoughlin.tumblr.com/" title="Kevin Coughlin"><img src="https://64.media.tumblr.com/avatar_153dbbc13059_16.pnj" class="avatar " alt="" /></a><span class="action" data-post-url="https://kevintcoughlin.tumblr.com/post/103823028020"><a rel="nofollow" href="https://kevintcoughlin.tumblr.com/post/103823028020" class="tumblelog" title="Kevin Coughlin">kevintcoughlin</a> reblogged this from <a rel="nofollow" href="https://blog.spiderlang.org/" class="source_tumblelog" title="Spider Blog">alongubkin-blog</a> </span><div class="clear"></div></li><li class="note like tumblelog_kevintcoughlin without_commentary"><a rel="nofollow" class="avatar_frame" target="_blank" href="https://kevintcoughlin.tumblr.com/" title="Kevin Coughlin " rel="nofollow"><img src="https://64.media.tumblr.com/avatar_153dbbc13059_16.pnj" class="avatar " alt="" /></a><span class="action"><a rel="nofollow" href="https://kevintcoughlin.tumblr.com/" title="Kevin Coughlin" rel="nofollow">kevintcoughlin</a> liked this </span><div class="clear"></div></li><li class="note like tumblelog_asitemap without_commentary"><a rel="nofollow" class="avatar_frame" target="_blank" href="https://asitemap.tumblr.com/" title="something " rel="nofollow"><img src="https://64.media.tumblr.com/avatar_db058f269ddd_16.pnj" class="avatar " alt="" /></a><span class="action"><a rel="nofollow" href="https://asitemap.tumblr.com/" title="something" rel="nofollow">asitemap</a> liked this </span><div class="clear"></div></li><li class="note like tumblelog_thefox21 without_commentary"><a rel="nofollow" class="avatar_frame" target="_blank" href="https://thefox21.tumblr.com/" title="TheFox21 " rel="nofollow"><img src="https://64.media.tumblr.com/avatar_ce25eed7b193_16.pnj" class="avatar " alt="" /></a><span class="action"><a rel="nofollow" href="https://thefox21.tumblr.com/" title="TheFox21" rel="nofollow">thefox21</a> liked this </span><div class="clear"></div></li><li class="note like tumblelog_neatocode without_commentary"><a rel="nofollow" class="avatar_frame" target="_blank" href="https://neatocode.tumblr.com/" title="NeatoCode Techniques " rel="nofollow"><img src="https://64.media.tumblr.com/avatar_589171471a1e_16.pnj" class="avatar " alt="" /></a><span class="action"><a rel="nofollow" href="https://neatocode.tumblr.com/" title="NeatoCode Techniques" rel="nofollow">neatocode</a> liked this </span><div class="clear"></div></li><li class="note like tumblelog_whisperstorm without_commentary"><a rel="nofollow" class="avatar_frame" target="_blank" href="https://whisperstorm.tumblr.com/" title="Untitled " rel="nofollow"><img src="https://assets.tumblr.com/images/default_avatar_16.png" class="avatar " alt="" /></a><span class="action"><a rel="nofollow" href="https://whisperstorm.tumblr.com/" title="Untitled" rel="nofollow">whisperstorm</a> liked this </span><div class="clear"></div></li><li class="note like tumblelog_jesusgollonet without_commentary"><a rel="nofollow" class="avatar_frame" target="_blank" href="https://jesusgollonet.tumblr.com/" title="tangents " rel="nofollow"><img src="https://64.media.tumblr.com/avatar_95ecfb345f6a_16.pnj" class="avatar " alt="" /></a><span class="action"><a rel="nofollow" href="https://jesusgollonet.tumblr.com/" title="tangents" rel="nofollow">jesusgollonet</a> liked this </span><div class="clear"></div></li><li class="note reblog tumblelog_alongubkin-blog original_post without_commentary"><a rel="nofollow" class="avatar_frame" target="_blank" href="https://blog.spiderlang.org/" title="Spider Blog"><img src="https://64.media.tumblr.com/avatar_f6cbd80ac275_16.pnj" class="avatar " alt="" /></a><span class="action" data-post-url="https://blog.spiderlang.org/post/103752682650"><a rel="nofollow" href="https://blog.spiderlang.org/" class="tumblelog" title="Spider Blog">alongubkin-blog</a> posted this </span><div class="clear"></div></li><!-- END NOTES --></ol></a> 1238 </section> 1239 1240 1241 1242 1243 1244 </section> 1245 </li> 1246 1247 1248 <!-- END POSTS --> 1249 </ul> 1250 1251 1252 1253 <footer id="footer"> 1254 1255 <section class="copyright">© 2014â2026 Spider Blog</section> 1256 1257 1258 </footer> 1259 </section> 1260 1261 1262
1262<script type="text/javascript" src="https://assets.tumblr.com/assets/scripts/jquery-1.7.2.min.js"></script>
1262 1263
1263<script type="text/javascript"> 1264 var Tumblelog = {}; 1265 1266 // AJAX 1267 Tumblelog.Ajax = (function(url, callbackFunction) { 1268 this.bindFunction = function (caller, object) { 1269 return function() { 1270 return caller.apply(object, [object]); 1271 }; 1272 }; 1273 1274 this.stateChange = function (object) { 1275 if (this.request.readyState==4) this.callbackFunction(this.request.responseText); 1276 }; 1277 1278 this.getRequest = function() { 1279 if (window.ActiveXObject) 1280 return new ActiveXObject('Microsoft.XMLHTTP'); 1281 else if (window.XMLHttpRequest) 1282 return new XMLHttpRequest(); 1283 return false; 1284 }; 1285 1286 this.postBody = (arguments[2] || ""); 1287 this.callbackFunction=callbackFunction; 1288 this.url=url; 1289 this.request = this.getRequest(); 1290 1291 if(this.request) { 1292 var req = this.request; 1293 req.onreadystatechange = this.bindFunction(this.stateChange, this); 1294 1295 if (this.postBody!=="") { 1296 req.open("POST", url, true); 1297 req.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); 1298 req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 1299 req.setRequestHeader('Connection', 'close'); 1300 } else { 1301 req.open("GET", url, true); 1302 } 1303 1304 req.send(this.postBody); 1305 } 1306 }); 1307 1308 // Infinite Scroll 1309 Tumblelog.Infinite = (function() { 1310 1311 var _$window = $(window); 1312 var _$posts = $('#posts'); 1313 var _trigger_post = null; 1314 1315 var _current_page = 1; 1316 var _total_pages = 1; 1317 var _url = document.location.href.split("#")[0]; 1318 var _infinite_timeout = null; 1319 var _is_loading = false; 1320 var _posts_loaded = false; 1321 1322 var _Ajax = Tumblelog.Ajax; 1323 1324 function init() { 1325 set_trigger(); 1326 enable_scroll(); 1327 } 1328 1329 function set_trigger () { 1330 var $all_posts = _$posts.find('li.post'); 1331 1332 if (!_posts_loaded) { 1333 _posts_loaded = $all_posts.length; 1334 } 1335 1336 if (_posts_loaded >= 4) { 1337 _trigger_post = _$posts.find('li.post:eq(' + ($all_posts.length - 4) + ')').get(0); 1338 } else if (_posts_loaded >= 3) { 1339 _trigger_post = _$posts.find('li.post:eq(' + ($all_posts.length - 3) + ')').get(0); 1340 } else { 1341 _trigger_post = _$posts.find('li.post:last').get(0); 1342 } 1343 }; 1344 1345 function in_viewport (el) { 1346 if (el == null) return; 1347 var top = el.offsetTop; 1348 var height = el.offsetHeight; 1349 1350 while (el.offsetParent) { 1351 el = el.offsetParent; 1352 top += el.offsetTop; 1353 } 1354 1355 return (top < (window.pageYOffset + window.innerHeight)); 1356 }; 1357 1358 function enable_scroll() { 1359 $('#footer .pagination').hide(); 1360 _$window.scroll(function(){ 1361 clearTimeout(_infinite_timeout); 1362 infinite_timeout = setTimeout(infinite_scroll, 100); 1363 }); 1364 } 1365 1366 function disable_scroll() { 1367 clearTimeout(_infinite_timeout); 1368 $(window).unbind('scroll'); 1369 } 1370 1371 function infinite_scroll() { 1372 if (_is_loading) return; 1373 1374 if (in_viewport(_trigger_post)) { 1375 load_more_posts(); // w00t 1376 } 1377 }; 1378 1379 function load_more_posts() { 1380 if (_is_loading) return; 1381 _is_loading = true; 1382 1383 // Build URL 1384 if (_url.charAt(_url.length - 1) != '/') _url += '/'; 1385 if (_current_page === 1) _url += 'page/1'; 1386 _current_page++; 1387 _url = _url.replace('page/' + (_current_page - 1), 'page/' + _current_page); 1388 1389 // Fetch 1390 _Ajax(_url, function(data) { 1391 var new_posts_html = data.split('<!-- START' + ' POSTS -->')[1].split('<!-- END' + ' POSTS -->')[0]; 1392 var $new_posts = $('#posts', data); 1393 1394 // Insert posts and update counters 1395 $('#posts').append(new_posts_html); 1396 _posts_loaded = $new_posts.find('li.post').length; 1397 1398 if (_posts_loaded) { 1399 var post_ids = []; 1400 var like_buttons = $('#posts', data).find('.like_button'); 1401 for (var i = 0; i < like_buttons.length; i++) { 1402 var button = like_buttons[i]; 1403 if ($(button).attr('data-post-id')) { 1404 post_ids.push($(button).attr('data-post-id')); 1405 } 1406 } 1407 if (post_ids.length > 0) Tumblr.LikeButton.get_status_by_post_ids(post_ids); 1408 } 1409 1410 if ((_posts_loaded > 0) && (_current_page < _total_pages)) { 1411 set_trigger(); 1412 _is_loading = false; 1413 1414 } else { 1415 disable_scroll(); 1416 } 1417 }); 1418 1419 // Stats 1420 1421 } 1422 1423 return { 1424 init: init 1425 }; 1426 }); 1427 1428 $(function() { 1429 1430 }); 1431 </script>
1431 1432 1433 1434 1435 1436 1437
1437<script src="http://spiderlang.org/js/highlight.pack.js"></script>
1437 1438
1438<script> 1439 $('pre code').each(function(i, block) { 1440 hljs.highlightBlock(block); 1441 }); 1442 </script>
1442 1443 1444<iframe scrolling="no" width="1" height="1" frameborder="0" style="background-color:transparent; overflow:hidden; position:absolute; top:0; left:0; z-index:9999;" id="ga_target"></iframe>
1444<script type="text/javascript"> 1445 (function(){ 1446 var analytics_frame = document.getElementById('ga_target'); 1447 var analytics_iframe_loaded; 1448 var user_logged_in; 1449 var blog_is_nsfw = 'No'; 1450 1451 var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent"; 1452 var eventer = window[eventMethod]; 1453 var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message"; 1454 eventer(messageEvent,function(e) { 1455 var message = (e.data && e.data.split) ? e.data.split(';') : ''; 1456 switch (message[0]) { 1457 case 'analytics_iframe_loaded': 1458 analytics_iframe_loaded = true; 1459 postCSMessage(); 1460 postGAMessage(); 1461 break; 1462 case 'user_logged_in': 1463 user_logged_in = message[1]; 1464 postGAMessage(); 1465 break; 1466 } 1467 }, false); 1468 1469 analytics_frame.src = "https://assets.tumblr.com/analytics.html?_v=9f5febfd57a8a649c598d888f2d9e062#" + 1470 "https://blog.spiderlang.org"; 1471 function postGAMessage() { 1472 if (analytics_iframe_loaded && user_logged_in) { 1473 var is_ajax = false; 1474 analytics_frame.contentWindow.postMessage(['tick_google_analytics', is_ajax, user_logged_in, blog_is_nsfw, '/post/103752682650/introducing-spider-01?route=%2Fpost%2F%3Aid%2F%3Asummary'].join(';'), analytics_frame.src.split('/analytics.html')[0]); 1475 } 1476 } 1477 function postCSMessage() { 1478 COMSCORE = true; 1479 analytics_frame.contentWindow.postMessage('enable_comscore;' + window.location, analytics_frame.src.split('/analytics.html')[0]); 1480 } 1481 })(); 1482</script>
1482<script type="text/javascript" nonce="GAhC9LluHa5NRhHLZ1GgainAyw">!function(s){s.src='https://px.srvcs.tumblr.com/impixu?T=1791293652&J=eyJ0eXBlIjoidXJsIiwidXJsIjoiaHR0cDovL2Jsb2cuc3BpZGVybGFuZy5vcmcvcG9zdC8xMDM3NTI2ODI2NTAvaW50cm9kdWNpbmctc3BpZGVyLTAxIiwicmVxdHlwZSI6MCwicm91dGUiOiIvcG9zdC86aWQvOnN1bW1hcnkifQ==&U=JBKJFFLIMH&K=6400bf3177e8fab2610bd6918a3cfeee2d009137b7967e4453edf0147947a335&R='.replace(/&R=[^&$]*/,'').concat('&R='+escape(document.referrer)).slice(0,2000).replace(/%.?.?$/,'');}(new Image());</script>
1482<noscript><img style="position:absolute;z-index:-3334;top:0px;left:0px;visibility:hidden;" src="https://px.srvcs.tumblr.com/impixu?T=1791293652&J=eyJ0eXBlIjoidXJsIiwidXJsIjoiaHR0cDovL2Jsb2cuc3BpZGVybGFuZy5vcmcvcG9zdC8xMDM3NTI2ODI2NTAvaW50cm9kdWNpbmctc3BpZGVyLTAxIiwicmVxdHlwZSI6MCwicm91dGUiOiIvcG9zdC86aWQvOnN1bW1hcnkiLCJub3NjcmlwdCI6MX0=&U=JBKJFFLIMH&K=3921244a34e059a9e59453d38498e628e8319428b64a2df709f9762c1088fea4&R="></noscript>
1482<script type="text/javascript" nonce="GAhC9LluHa5NRhHLZ1GgainAyw">!function(s){s.src='https://px.srvcs.tumblr.com/impixu?T=1791293652&J=eyJ0eXBlIjoicG9zdCIsInVybCI6Imh0dHA6Ly9ibG9nLnNwaWRlcmxhbmcub3JnL3Bvc3QvMTAzNzUyNjgyNjUwL2ludHJvZHVjaW5nLXNwaWRlci0wMSIsInJlcXR5cGUiOjAsInJvdXRlIjoiL3Bvc3QvOmlkLzpzdW1tYXJ5IiwicG9zdHMiOlt7InBvc3RpZCI6IjEwMzc1MjY4MjY1MCIsImJsb2dpZCI6MjEyNTk2NDAxLCJzb3VyY2UiOjMzfV19&U=DFCBDLPPLP&K=60945bdf77260cd456be8df249960ecac488595f4d9f704a09ded63e669657ff&R='.replace(/&R=[^&$]*/,'').concat('&R='+escape(document.referrer)).slice(0,2000).replace(/%.?.?$/,'');}(new Image());</script>
1482<noscript><img style="position:absolute;z-index:-3334;top:0px;left:0px;visibility:hidden;" src="https://px.srvcs.tumblr.com/impixu?T=1791293652&J=eyJ0eXBlIjoicG9zdCIsInVybCI6Imh0dHA6Ly9ibG9nLnNwaWRlcmxhbmcub3JnL3Bvc3QvMTAzNzUyNjgyNjUwL2ludHJvZHVjaW5nLXNwaWRlci0wMSIsInJlcXR5cGUiOjAsInJvdXRlIjoiL3Bvc3QvOmlkLzpzdW1tYXJ5IiwicG9zdHMiOlt7InBvc3RpZCI6IjEwMzc1MjY4MjY1MCIsImJsb2dpZCI6MjEyNTk2NDAxLCJzb3VyY2UiOjMzfV0sIm5vc2NyaXB0IjoxfQ==&U=DFCBDLPPLP&K=808170ab82122a6bcebe9cfbbc2c13d95e15e2eb99064189756ee213d60baf11&R="></noscript><iframe 1483 id="blue-space-api-calls-iframe" 1484 src="https://www.tumblr.com/dashboard/iframe/monetization?tumblelog=alongubkin-blog&src=https%3A%2F%2Fblog.spiderlang.org%2Fpost%2F103752682650%2Fintroducing-spider-01" 1485 style="display: none;" 1486 sandbox="allow-scripts allow-same-origin"></iframe>
1486<script async src="https://securepubads.g.doubleclick.net/tag/js/gpt.js" crossorigin="anonymous" nonce="GAhC9LluHa5NRhHLZ1GgainAyw"></script>
1486<!-- 1487Open GAM console on the page: 14881. Open browser JS console 14892. Run `googletag.openConsole()` 14903. GAM debug UI should appear and tell some more info on the ad itself and its fulfillment status 1491--><noscript id="bootloader" data-bootstrap="{"Components":{"PostActivity":[],"NotificationPoller":{"messaging_keys":[],"token":"","inbox_unread":0},"DesktopDashboardLogo":{"animations":[["https:\/\/assets.tumblr.com\/images\/logo\/hover-animations\/1.png?_v=161861acded461bb6e995593a3bae835","https:\/\/assets.tumblr.com\/images\/logo\/hover-animations\/[email protected]?_v=496a774637302a598c851381d00009b0"]]},"Monetization":{"client_side_waterfall":false,"no_demand_reason":null},"TumblelogIframe":{"variant":null,"isCompact":true,"tumblelogBundleSrc":"https:\/\/assets.tumblr.com\/client\/prod\/standalone\/tumblelog\/index.build.js?_v=1ba6c357e857b5c4be7fca41bb39029a","tumblelogName":"alongubkin-blog","isLoggedIn":false,"isFriend":false,"formKey":"","canSubscribe":false,"isSubscribed":false,"tumblelogTitle":"Spider Blog","tumblelogAvatar":"https:\/\/64.media.tumblr.com\/avatar_f6cbd80ac275_64.pnj","tumblelogAvatar128":"https:\/\/64.media.tumblr.com\/avatar_f6cbd80ac275_128.pnj","tumblelogHost":"https:\/\/blog.spiderlang.org","hasCustomDomain":true,"isOptica":false,"isCustomTheme":true,"themeHeaderImage":"https:\/\/assets.tumblr.com\/images\/default_header\/optica_pattern_04.png?_v=7c4e5e82cf797042596e2e64af1c383f","
1491themeBackgroundColor":"#FAFAFA","themeTitleColor":"#444444","themeAccentColor":"#529ECC","brag":true,"canShowAd":false,"isPremium":false,"geminiSectionCodeDesktop":"a10bca9c-0c5d-4a02-ab13-14ab8513d81d","geminiSectionCodeMobile":"ced63809-b609-4aca-96a0-abc099acba6b","currentPageType":"single_post","currentPage":1,"searchQuery":"","tag":"","query":"","chrono":false,"postId":"103752682650","src":"https:\/\/blog.spiderlang.org\/post\/103752682650\/introducing-spider-01","postUrl":"","openInPeeprUrl":"https:\/\/www.tumblr.com\/alongubkin-blog","isBlocked":null,"isAdmin":false,"lookupButtonUrl":"","showSpamButton":false,"showRootPostButton":false,"rootPostUrl":"","showRadarPostButton":false,"radarKeys":"","isUniblocked":false,"isNsfw":false,"isAdult":false,"isSpam":false,"isPrimaryBlog":false,"canEdit":false,"showRemoveAdsCta":false,"canReblogSelf":false,"showLikeButton":false,"showReblogButton":false,"reblogUrl":"","showMessagingButton":false,"loginCheckIframeSrc":"https:\/\/assets.tumblr.com\/assets\/html\/iframe\/login_check.html?_v=3de94a184d600617102ddd5b48fb36e9","appInstallUrls":{"android":"https:\/\/play.google.com\/store\/apps\/details?id=com.tumblr\u0026referrer=utm_source%3Dtumblr%26utm_medium%3Diframe%26utm_campaign%3Dbn_continue_or_install_cta","ios":"https:\/\/apps.apple.com\/app\/apple-store\/id305343404?pt=212308\u0026ct=bn_continue_or_install_cta\u0026mt=8"},"appOpenReferrer":"bn_header_open_btn","isShowSearch":true,"supplyLogging":[],"secondsSinceLastActivity":-1,"installUrlOpenFailed":{"android":"https:\/\/play.google.com\/store\/apps\/details?id=com.tumblr\u0026referrer=utm_source%3Dtumblr%26utm_medium%3Diframe%26utm_campaign%3Dbn_header_app_open_failed","ios":"https:\/\/apps.apple.com\/app\/apple-store\/id305343404?pt=212308\u0026ct=bn_header_app_open_failed\u0026mt=8"},"loginWallVariant":"small_center"},"CommunityLabels":{"has_community_label":false,"is_single":true,"redirect_target":"\/alongubkin-blog\/103752682650"}},"Flags":{"features":"eyJmaWx0ZXJfbnNmdyI6dHJ1ZSwibW9iaWxlX3dlYl9nYXRlIjp0cnVlLCJzYWZlX21vZGUiOnRydWUsInNhZmVfbW9kZV9lbmFibGVkIjp0cnVlLCJrZXljb21tYW5kX2F1dG9fcGFnaW5hdGUiOnRydWUsImxvZ2dlZF9vdXRfc2VhcmNoIjp0cnVlLCJrcmFrZW5fd2ViX2xvZ2dpbmdfbGlicmFyeSI6dHJ1ZSwibGl2ZXBob3Rvc193ZWIiOnRydWUsInVzZXJfdGFnX2ZpbHRlcmluZyI6dHJ1ZSwic2FmZV9tb2RlX293bl9wb3N0Ijp0cnVlLCJwcm9qZWN0X3hfYXBwZWFsIjp0cnVlLCJtb2JpbGVfd2ViX3Bob3Rvc2V0cyI6dHJ1ZSwiaGlkZV9kZWZhdWx0X2hlYWRlcnNfYmxvZ19jYXJkcyI6dHJ1ZSwibm90aWZpY2F0aW9uX3JlcGx
14915X2xpbmtfdG9fbm90ZXMiOnRydWUsInR5cGluZ19pbmRpY2F0b3Jfd3JpdGUiOnRydWUsInR1bWJscl92aWRlb19zcG9uc29yZWRfZGF5Ijp0cnVlLCJjYXB0Y2hhOnVzZV9yZWNhcHRjaGEyIjp0cnVlLCJsaXR0bGVfc2lzdGVyIjp0cnVlLCJlbmFibGVfanNfZXJyb3JzX2xvZyI6dHJ1ZSwibG9nX2xhZHkiOnRydWUsInJlZHBvcF9wb3N0X2Zvcm1fbW9iaWxlX2NyZWF0ZSI6dHJ1ZSwibGVnYWN5X3Bvc3RfZm9ybV9idXR0b25zX2xpbmtfdG9fcmVkcG9wIjp0cnVlLCJzaG93X3RzcF9jbGlja190aHJvdWdoX3RvZ2dsZSI6dHJ1ZSwiZGFybGFfYWRfZmVlZGJhY2siOnRydWUsInN0YXR1c19pbmRpY2F0b3IiOnRydWUsImNvbnZlcnNhdGlvbmFsX25vdGlmaWNhdGlvbnMiOnRydWUsImRpc2FibGVfeWFob29fYl9jb29raWUiOnRydWUsImxpdmVwaG90b3MiOnRydWUsImNvbW11bml0eV9sYWJlbHMiOnRydWUsIm1vbmV0aXphdGlvbiI6dHJ1ZX0="},"Context":{"name":"default","time":1791293652000,"userinfo":{"primary":"","name":"","channels":[]},"hosts":{"assets_host":"https:\/\/assets.tumblr.com","secure_assets_host":"https:\/\/assets.tumblr.com","www_host":"https:\/\/www.tumblr.com","secure_www_host":"https:\/\/www.tumblr.com","embed_host":"https:\/\/embed.tumblr.com","safe_host":"https:\/\/safe.txmblr.com","platform_host":"https:\/\/platform.tumblr.com"},"language":"en_US","language_simple":"en","assets":"https:\/\/assets.tumblr.com\/client\/prod\/"},"Translations":{"%1$sReport %2$s's post?%3$sIf it violates our user guidelines, we'll remove it.%4$s":"%1$sReport %2$s's reblog?%3$sIf it violates our user guidelines, we'll remove it.%4$s","%1$sReport %2$s's reply?%3$sIf it violates our user guidelines, we'll remove it.%4$s":"%1$sReport %2$s's reblog?%3$sIf it violates our user guidelines, we'll remove it.%4$s","%1$sDelete your tip??%2$s":"%1$sDelete your tip?%2$s","Deleting your tip":"Deleting your tip will only remove it from the replies tab and notes. %1$sYou won't receive a refund of your tip.%2$s For further help contact %3$sTumblr Support%4$s."}}"></noscript>
1491<script src="https://assets.tumblr.com/client/prod/standalone/tumblelog/index.build.js?_v=1ba6c357e857b5c4be7fca41bb39029a"></script>
1491</body> 1492</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.