PageSourceSearch

https://blog.spiderlang.org/post/103752682650/introducing-spider-01

html spiderlang.org collected 2026-10-06 13:34:12 UTC 71,460 bytes, 1,492 lines download raw bytes

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&rsquo;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&#039;s bad side while embracing its good side.&nbsp;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&amp;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&amp;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&rsquo;s bad side while embracing its good side.&nbsp;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.&nbsp;If you haven&rsquo;t heard of it yet, take a look at &ldquo;<a href="http://spiderlang.org/#why-spider">Why Spider?</a>&rdquo;.</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&rsquo;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 &lt;- message;
1082
1083  console.log("Message added to queue.");
1084}
1085
1086go {
1087  while true {
1088    smtp.send(&lt;-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 &amp; returns the value.</p><p>Yet again, the concept was stolen from another language. This time it&rsquo;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) -&gt; 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:&nbsp;<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>&nbsp;and&nbsp;<a href="http://spiderlang.org/index.html#switch-no-implicit-fallthrough">Fallthrough Statement</a>.</p><p>And that&rsquo;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&rsquo;re interested in it, make sure to <a href="https://github.com/alongubkin/spider">star the repo</a>&nbsp;and&nbsp;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&amp;post_id=103752682650&amp;color=black&amp;rk=q0bAHC9Y&amp;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">&copy; 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="{&quot;Components&quot;:{&quot;PostActivity&quot;:[],&quot;NotificationPoller&quot;:{&quot;messaging_keys&quot;:[],&quot;token&quot;:&quot;&quot;,&quot;inbox_unread&quot;:0},&quot;DesktopDashboardLogo&quot;:{&quot;animations&quot;:[[&quot;https:\/\/assets.tumblr.com\/images\/logo\/hover-animations\/1.png?_v=161861acded461bb6e995593a3bae835&quot;,&quot;https:\/\/assets.tumblr.com\/images\/logo\/hover-animations\/[email protected]?_v=496a774637302a598c851381d00009b0&quot;]]},&quot;Monetization&quot;:{&quot;client_side_waterfall&quot;:false,&quot;no_demand_reason&quot;:null},&quot;TumblelogIframe&quot;:{&quot;variant&quot;:null,&quot;isCompact&quot;:true,&quot;tumblelogBundleSrc&quot;:&quot;https:\/\/assets.tumblr.com\/client\/prod\/standalone\/tumblelog\/index.build.js?_v=1ba6c357e857b5c4be7fca41bb39029a&quot;,&quot;tumblelogName&quot;:&quot;alongubkin-blog&quot;,&quot;isLoggedIn&quot;:false,&quot;isFriend&quot;:false,&quot;formKey&quot;:&quot;&quot;,&quot;canSubscribe&quot;:false,&quot;isSubscribed&quot;:false,&quot;tumblelogTitle&quot;:&quot;Spider Blog&quot;,&quot;tumblelogAvatar&quot;:&quot;https:\/\/64.media.tumblr.com\/avatar_f6cbd80ac275_64.pnj&quot;,&quot;tumblelogAvatar128&quot;:&quot;https:\/\/64.media.tumblr.com\/avatar_f6cbd80ac275_128.pnj&quot;,&quot;tumblelogHost&quot;:&quot;https:\/\/blog.spiderlang.org&quot;,&quot;hasCustomDomain&quot;:true,&quot;isOptica&quot;:false,&quot;isCustomTheme&quot;:true,&quot;themeHeaderImage&quot;:&quot;https:\/\/assets.tumblr.com\/images\/default_header\/optica_pattern_04.png?_v=7c4e5e82cf797042596e2e64af1c383f&quot;,&quot;
1491themeBackgroundColor&quot;:&quot;#FAFAFA&quot;,&quot;themeTitleColor&quot;:&quot;#444444&quot;,&quot;themeAccentColor&quot;:&quot;#529ECC&quot;,&quot;brag&quot;:true,&quot;canShowAd&quot;:false,&quot;isPremium&quot;:false,&quot;geminiSectionCodeDesktop&quot;:&quot;a10bca9c-0c5d-4a02-ab13-14ab8513d81d&quot;,&quot;geminiSectionCodeMobile&quot;:&quot;ced63809-b609-4aca-96a0-abc099acba6b&quot;,&quot;currentPageType&quot;:&quot;single_post&quot;,&quot;currentPage&quot;:1,&quot;searchQuery&quot;:&quot;&quot;,&quot;tag&quot;:&quot;&quot;,&quot;query&quot;:&quot;&quot;,&quot;chrono&quot;:false,&quot;postId&quot;:&quot;103752682650&quot;,&quot;src&quot;:&quot;https:\/\/blog.spiderlang.org\/post\/103752682650\/introducing-spider-01&quot;,&quot;postUrl&quot;:&quot;&quot;,&quot;openInPeeprUrl&quot;:&quot;https:\/\/www.tumblr.com\/alongubkin-blog&quot;,&quot;isBlocked&quot;:null,&quot;isAdmin&quot;:false,&quot;lookupButtonUrl&quot;:&quot;&quot;,&quot;showSpamButton&quot;:false,&quot;showRootPostButton&quot;:false,&quot;rootPostUrl&quot;:&quot;&quot;,&quot;showRadarPostButton&quot;:false,&quot;radarKeys&quot;:&quot;&quot;,&quot;isUniblocked&quot;:false,&quot;isNsfw&quot;:false,&quot;isAdult&quot;:false,&quot;isSpam&quot;:false,&quot;isPrimaryBlog&quot;:false,&quot;canEdit&quot;:false,&quot;showRemoveAdsCta&quot;:false,&quot;canReblogSelf&quot;:false,&quot;showLikeButton&quot;:false,&quot;showReblogButton&quot;:false,&quot;reblogUrl&quot;:&quot;&quot;,&quot;showMessagingButton&quot;:false,&quot;loginCheckIframeSrc&quot;:&quot;https:\/\/assets.tumblr.com\/assets\/html\/iframe\/login_check.html?_v=3de94a184d600617102ddd5b48fb36e9&quot;,&quot;appInstallUrls&quot;:{&quot;android&quot;:&quot;https:\/\/play.google.com\/store\/apps\/details?id=com.tumblr\u0026referrer=utm_source%3Dtumblr%26utm_medium%3Diframe%26utm_campaign%3Dbn_continue_or_install_cta&quot;,&quot;ios&quot;:&quot;https:\/\/apps.apple.com\/app\/apple-store\/id305343404?pt=212308\u0026ct=bn_continue_or_install_cta\u0026mt=8&quot;},&quot;appOpenReferrer&quot;:&quot;bn_header_open_btn&quot;,&quot;isShowSearch&quot;:true,&quot;supplyLogging&quot;:[],&quot;secondsSinceLastActivity&quot;:-1,&quot;installUrlOpenFailed&quot;:{&quot;android&quot;:&quot;https:\/\/play.google.com\/store\/apps\/details?id=com.tumblr\u0026referrer=utm_source%3Dtumblr%26utm_medium%3Diframe%26utm_campaign%3Dbn_header_app_open_failed&quot;,&quot;ios&quot;:&quot;https:\/\/apps.apple.com\/app\/apple-store\/id305343404?pt=212308\u0026ct=bn_header_app_open_failed\u0026mt=8&quot;},&quot;loginWallVariant&quot;:&quot;small_center&quot;},&quot;CommunityLabels&quot;:{&quot;has_community_label&quot;:false,&quot;is_single&quot;:true,&quot;redirect_target&quot;:&quot;\/alongubkin-blog\/103752682650&quot;}},&quot;Flags&quot;:{&quot;features&quot;:&quot;eyJmaWx0ZXJfbnNmdyI6dHJ1ZSwibW9iaWxlX3dlYl9nYXRlIjp0cnVlLCJzYWZlX21vZGUiOnRydWUsInNhZmVfbW9kZV9lbmFibGVkIjp0cnVlLCJrZXljb21tYW5kX2F1dG9fcGFnaW5hdGUiOnRydWUsImxvZ2dlZF9vdXRfc2VhcmNoIjp0cnVlLCJrcmFrZW5fd2ViX2xvZ2dpbmdfbGlicmFyeSI6dHJ1ZSwibGl2ZXBob3Rvc193ZWIiOnRydWUsInVzZXJfdGFnX2ZpbHRlcmluZyI6dHJ1ZSwic2FmZV9tb2RlX293bl9wb3N0Ijp0cnVlLCJwcm9qZWN0X3hfYXBwZWFsIjp0cnVlLCJtb2JpbGVfd2ViX3Bob3Rvc2V0cyI6dHJ1ZSwiaGlkZV9kZWZhdWx0X2hlYWRlcnNfYmxvZ19jYXJkcyI6dHJ1ZSwibm90aWZpY2F0aW9uX3JlcGx
14915X2xpbmtfdG9fbm90ZXMiOnRydWUsInR5cGluZ19pbmRpY2F0b3Jfd3JpdGUiOnRydWUsInR1bWJscl92aWRlb19zcG9uc29yZWRfZGF5Ijp0cnVlLCJjYXB0Y2hhOnVzZV9yZWNhcHRjaGEyIjp0cnVlLCJsaXR0bGVfc2lzdGVyIjp0cnVlLCJlbmFibGVfanNfZXJyb3JzX2xvZyI6dHJ1ZSwibG9nX2xhZHkiOnRydWUsInJlZHBvcF9wb3N0X2Zvcm1fbW9iaWxlX2NyZWF0ZSI6dHJ1ZSwibGVnYWN5X3Bvc3RfZm9ybV9idXR0b25zX2xpbmtfdG9fcmVkcG9wIjp0cnVlLCJzaG93X3RzcF9jbGlja190aHJvdWdoX3RvZ2dsZSI6dHJ1ZSwiZGFybGFfYWRfZmVlZGJhY2siOnRydWUsInN0YXR1c19pbmRpY2F0b3IiOnRydWUsImNvbnZlcnNhdGlvbmFsX25vdGlmaWNhdGlvbnMiOnRydWUsImRpc2FibGVfeWFob29fYl9jb29raWUiOnRydWUsImxpdmVwaG90b3MiOnRydWUsImNvbW11bml0eV9sYWJlbHMiOnRydWUsIm1vbmV0aXphdGlvbiI6dHJ1ZX0=&quot;},&quot;Context&quot;:{&quot;name&quot;:&quot;default&quot;,&quot;time&quot;:1791293652000,&quot;userinfo&quot;:{&quot;primary&quot;:&quot;&quot;,&quot;name&quot;:&quot;&quot;,&quot;channels&quot;:[]},&quot;hosts&quot;:{&quot;assets_host&quot;:&quot;https:\/\/assets.tumblr.com&quot;,&quot;secure_assets_host&quot;:&quot;https:\/\/assets.tumblr.com&quot;,&quot;www_host&quot;:&quot;https:\/\/www.tumblr.com&quot;,&quot;secure_www_host&quot;:&quot;https:\/\/www.tumblr.com&quot;,&quot;embed_host&quot;:&quot;https:\/\/embed.tumblr.com&quot;,&quot;safe_host&quot;:&quot;https:\/\/safe.txmblr.com&quot;,&quot;platform_host&quot;:&quot;https:\/\/platform.tumblr.com&quot;},&quot;language&quot;:&quot;en_US&quot;,&quot;language_simple&quot;:&quot;en&quot;,&quot;assets&quot;:&quot;https:\/\/assets.tumblr.com\/client\/prod\/&quot;},&quot;Translations&quot;:{&quot;%1$sReport %2$s&#039;s post?%3$sIf it violates our user guidelines, we&#039;ll remove it.%4$s&quot;:&quot;%1$sReport %2$s&#039;s reblog?%3$sIf it violates our user guidelines, we&#039;ll remove it.%4$s&quot;,&quot;%1$sReport %2$s&#039;s reply?%3$sIf it violates our user guidelines, we&#039;ll remove it.%4$s&quot;:&quot;%1$sReport %2$s&#039;s reblog?%3$sIf it violates our user guidelines, we&#039;ll remove it.%4$s&quot;,&quot;%1$sDelete your tip??%2$s&quot;:&quot;%1$sDelete your tip?%2$s&quot;,&quot;Deleting your tip&quot;:&quot;Deleting your tip will only remove it from the replies tab and notes. %1$sYou won&#039;t receive a refund of your tip.%2$s For further help contact %3$sTumblr Support%4$s.&quot;}}"></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.