├── GROUP_BY.html ├── JOIN.html ├── arrays.html ├── basics.html ├── begin_end.html ├── bug_reports.html ├── builtin ├── bitwise.html ├── images │ ├── fflush_1.png │ └── fflush_2.png ├── io.html ├── numeric.html ├── string.html ├── time.html └── type.html ├── builtin_functions.html ├── builtin_variables.html ├── closing.md ├── command_line_options.html ├── control_statements.html ├── cover_awk.png ├── cover_bash.png ├── cover_macro.png ├── cover_make.png ├── cover_sed.png ├── data_types.html ├── debugging.html ├── escape_sequences.html ├── example.html ├── examples ├── cat.jpg └── webserver.awk ├── extensions.html ├── field_sep.html ├── functions.html ├── gawk ├── gawk-5.1.1 ├── getline.html ├── gitbook ├── app.js ├── fonts │ └── fontawesome │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ └── fontawesome-webfont.woff ├── images │ ├── apple-touch-icon-precomposed-152.png │ └── favicon.ico ├── plugins │ ├── gitbook-plugin-fontsettings │ │ ├── buttons.js │ │ └── website.css │ ├── gitbook-plugin-highlight │ │ ├── ebook.css │ │ └── website.css │ ├── gitbook-plugin-search │ │ ├── lunr.min.js │ │ ├── search.css │ │ └── search.js │ └── gitbook-plugin-sharing │ │ └── buttons.js └── style.css ├── images ├── array_for.png ├── array_if.png ├── buttons │ ├── binmode.png │ ├── convfmt.png │ ├── fieldwidths.png │ ├── fpat.png │ ├── fs.png │ ├── ignorecase.png │ ├── lint.png │ ├── ofmt.png │ ├── ofs.png │ ├── ors.png │ ├── prec.png │ ├── roundmode.png │ ├── rs.png │ ├── subsep.png │ └── textdomain.png ├── close_coproc.png ├── close_file.png ├── close_pipe.png ├── control_statements │ ├── do-while.png │ ├── for.png │ ├── if-else.png │ ├── switch.png │ └── while.png ├── data_example1.png ├── data_example2.png ├── data_example3.png ├── debugging.gif ├── extension_1.png ├── fflush_n.png ├── fflush_n2.png ├── fflush_y.png ├── function_1.png ├── function_2.png ├── function_ex.png ├── getline_pipe.png ├── named_pipe.mp4 ├── number_regex.gif ├── proc_net_tcp.png ├── sort_example.png ├── tcp_ip_fork.png ├── tcp_ip_uri.png └── workflow.png ├── index.html ├── index2.html ├── operators.html ├── patch ├── record_sep.html ├── redirection.html ├── regex.html ├── search_index.json ├── sort.html ├── subquery.html ├── tcp_ip.html ├── tips.html ├── variables.html ├── zero_one.html └── 실수값표현법.doc /bug_reports.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 14 | 15 | 16 | 17 | 18 | Bug reports | Introduction 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 |
68 | 69 | 70 |
71 | 656 |
657 | 658 |
659 |
660 | 670 | 671 |
672 |
673 | 674 | 675 |
676 | 677 |

Bug reports

678 |

책 내용 중에 수정, 보완해야 될 부분이 있거나 또는 추가하면 좋을 내용이 있으시면
아래 github issues 게시판을 통해 알려주시면 감사하겠습니다.

679 |

https://github.com/mug896/awk-script/issues

680 |
681 |

현재 gawk 5.1.0 버전까지 -M 옵션 사용시 버그가 있습니다.
버그 리포트를 보냈고 다음 버전에서 수정될 것 같습니다.

682 |

정식 버전이 나오기 전에 패치가 필요하신 분은 다음 파일을 받아서 gawk 소스에 적용하면 됩니다.

683 |
    684 |
  • 패치 파일 ( 현재 gawk maintainer 분이 보내준 패치입니다.) : patch
  • 685 |
  • 패치 적용한 실행파일 ( ubuntu 20.10 / x86_64 ) : gawk
  • 686 |
687 |
688 |

위 버그는 gawk 5.1.1 버전에서 수정되었습니다. 5.1.1 버전을 사용하세요 : gawk

689 |
690 |

Bash shell script 가이드

691 | 692 | 693 | 701 |
694 | 695 |

github

696 | https://mug896.github.io/bash-shell 697 | 698 |

github 게시판

699 | https://github.com/mug896/bash-shell/issues 700 |
702 | 703 | 704 |

Sed stream editor 가이드

705 | 706 | 707 | 715 |
708 | 709 |

github

710 | https://mug896.github.io/sed-stream-editor 711 | 712 |

github 게시판

713 | https://github.com/mug896/sed-stream-editor/issues 714 |
716 | 717 | 718 | 719 |

AWK script 가이드

720 | 721 | 722 | 730 |
723 | 724 |

github

725 | https://mug896.github.io/awk-script 726 | 727 |

github 게시판

728 | https://github.com/mug896/awk-script/issues 729 |
731 | 732 | 733 |

Make script 가이드

734 | 735 | 736 | 744 |
737 | 738 |

github

739 | https://mug896.github.io/make-script 740 | 741 |

github 게시판

742 | https://github.com/mug896/make-script/issues 743 |
745 | 746 | 747 | 748 | 749 | 750 | 751 |

Macro 가이드

752 | 753 | 754 | 762 |
755 | 756 |

github

757 | https://mug896.github.io/macro 758 | 759 |

github 게시판

760 | https://github.com/mug896/macro/issues 761 |
763 | 764 | 765 | 766 |
767 | 768 | 769 |
770 |
771 |
772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 |
780 |
781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 | 800 | 801 | 807 | 808 | 809 | 810 | 811 | 812 | -------------------------------------------------------------------------------- /builtin/images/fflush_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/builtin/images/fflush_1.png -------------------------------------------------------------------------------- /builtin/images/fflush_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/builtin/images/fflush_2.png -------------------------------------------------------------------------------- /builtin/type.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 14 | 15 | 16 | 17 | 18 | Type Functions | Introduction 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 |
68 | 69 | 70 |
71 | 656 |
657 | 658 |
659 |
660 | 670 | 671 |
672 |
673 | 674 | 675 |
676 | 677 |

Type functions

678 |

awk 는 실제 연산을 할 때는 숫자와 스트링의 구분이 있지만 679 | 내부적으로 관리하는 정보에는 단지 scalar 와 array 구분만 있습니다. 680 | 다음은 실행 중인 awk 에 설정되어 있는 identifiers 목록을 출력한 것입니다.

681 |
$ awk '
682 | BEGIN { 
683 |     PROCINFO["sorted_in"] = "@ind_str_asc"
684 |     for ( i in PROCINFO["identifiers"] )
685 |         print i, PROCINFO["identifiers"][i]     
686 | }' | column -t
687 | ARGC            scalar
688 | ARGIND          scalar
689 | ARGV            array
690 | BINMODE         scalar
691 | CONVFMT         scalar
692 | ENVIRON         array
693 | ERRNO           scalar
694 | FIELDWIDTHS     scalar
695 | FILENAME        scalar
696 | FNR             scalar
697 | FPAT            scalar
698 | FS              scalar
699 | FUNCTAB         array
700 | IGNORECASE      scalar
701 | LINT            scalar
702 | NF              scalar
703 | NR              scalar
704 | OFMT            scalar
705 | OFS             scalar
706 | ORS             scalar
707 | PREC            scalar
708 | PROCINFO        array
709 | RLENGTH         scalar
710 | ROUNDMODE       scalar
711 | RS              scalar
712 | RSTART          scalar
713 | RT              scalar
714 | SUBSEP          scalar
715 | SYMTAB          array
716 | TEXTDOMAIN      scalar
717 | and             builtin
718 | asort           builtin
719 | asorti          builtin
720 | atan2           builtin
721 | bindtextdomain  builtin
722 | close           builtin
723 | compl           builtin
724 | cos             builtin
725 | dcgettext       builtin
726 | dcngettext      builtin
727 | exp             builtin
728 | extension       builtin
729 | fflush          builtin
730 | gensub          builtin
731 | gsub            builtin
732 | i               untyped
733 | index           builtin
734 | int             builtin
735 | isarray         builtin
736 | length          builtin
737 | log             builtin
738 | lshift          builtin
739 | match           builtin
740 | mktime          builtin
741 | or              builtin
742 | patsplit        builtin
743 | rand            builtin
744 | rshift          builtin
745 | sin             builtin
746 | split           builtin
747 | sprintf         builtin
748 | sqrt            builtin
749 | srand           builtin
750 | strftime        builtin
751 | strtonum        builtin
752 | sub             builtin
753 | substr          builtin
754 | system          builtin
755 | systime         builtin
756 | tolower         builtin
757 | toupper         builtin
758 | xor             builtin
759 | 
760 |

isarray( x )

761 |

이 함수는 다차원 배열을 다룰 때 해당 원소가 array 인지 scalar 인지 테스트할 때나 762 | 함수에 전달된 인수가 array 인지 scalar 인지 테스트할 때 사용할 수 있습니다.

763 | 764 | 765 |
766 | 767 | 768 |
769 |
770 |
771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 |
779 |
780 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 | 800 | 806 | 807 | 808 | 809 | 810 | 811 | -------------------------------------------------------------------------------- /closing.md: -------------------------------------------------------------------------------- 1 | # 맺음말 2 | 3 | 4 | 텍스트 데이터는 사람에게는 간단히 볼 수 있는 장점이 있지만 5 | 컴퓨터 입장에서는 처리하는데 비효율적인 형식입니다. 6 | 가령 숫자를 가지고 연산을 하려면 텍스트 데이터는 7 | 먼저 스트링을 cpu 에서 처리할 수 있는 숫자로 변경을 해줘야 합니다. 8 | 데이터량이 많지 않으면 별문제가 되지 않겠지만 그렇지 않고 9 | 데이터 크기가 커지면 시간이 누적되어 차이가 많이 나게 됩니다. 10 | 11 | 따라서 데이터 사이즈가 크고 여러번 처리를 해야 된다면 12 | 데이터 처리 전용 툴인 database 를 이용하는 것이 효율적입니다. 13 | 처음 insert 하는데 시간이 걸리기는 하지만 이후에는 14 | 아무런 index 생성을 안해도 database 가 훨씬 빠릅니다. 15 | 단순히 데이터 처리작업을 하는데 여러가지 설정을 해야 하는 database server 를 사용하기보다는 16 | [sqlite3](http://www.sqlite.org/) 를 이용하는 것도 좋습니다. 17 | 데몬 프로세스가 생성되는 것도 아니고 shell 에서 일반 명령 사용하듯이 간단히 사용할 수 있습니다. 18 | 19 | -------------------------------------------------------------------------------- /cover_awk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/cover_awk.png -------------------------------------------------------------------------------- /cover_bash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/cover_bash.png -------------------------------------------------------------------------------- /cover_macro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/cover_macro.png -------------------------------------------------------------------------------- /cover_make.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/cover_make.png -------------------------------------------------------------------------------- /cover_sed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/cover_sed.png -------------------------------------------------------------------------------- /debugging.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 14 | 15 | 16 | 17 | 18 | Debugging | Introduction 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 |
68 | 69 | 70 |
71 | 656 |
657 | 658 |
659 |
660 | 670 | 671 |
672 |
673 | 674 | 675 |
676 | 677 |

Debugging

678 |

아래의 스크립트는 어디가 잘못되었을까요? 679 | 자세히 보면 getine( getline ), prit( print ) 에 typo 오류가 있습니다. 680 | 하지만 이것은 awk 문법에 있어서 변수로 취급되어 오류가 되지 않기 때문에 681 | 값이 아무것도 표시되지 않을 뿐이지 정상적으로 실행이 됩니다.

682 |
$ awk 'BEGIN { getine var < "file1"; prit var }'   # 정상적으로 실행된다.
683 | $
684 | 
685 |

이때 --lint 옵션을 사용하면 기존에는 볼 수 없었던 다양한 메시지를 볼 수 있습니다.

686 |
$ awk --lint 'BEGIN { getine var < "file1"; prit var}' 
687 | awk: cmd. line:1: warning: statement may have no effect
688 | awk: warning: statement may have no effect
689 | awk: cmd. line:1: warning: reference to uninitialized variable 'getine'
690 | awk: cmd. line:1: warning: reference to uninitialized variable 'var'
691 | awk: cmd. line:1: warning: reference to uninitialized variable 'prit'
692 | awk: cmd. line:1: warning: reference to uninitialized variable 'var'
693 | 
694 |

awk 는 실행파일이 1M 도 안되는데 (660k 정도) 자체 내장 디버거가 있습니다. 695 | 이전에 gdb 를 사용해본 경험이 있으면 어렵지 않게 사용하실 수 있습니다. 696 | readline 라이브러리를 사용하므로 shell 에서처럼 history 와 라인 에디팅 기능을 사용할 수 있습니다.

697 |

다음은 실제 디버깅을 하는 영상입니다. 디버깅을 할때는 항상 코드를 파일로 만들어서 해야 합니다.

698 |
699 |

-o, --pretty-print 옵션을 이용해 파일을 생성할 수 있습니다.

700 |
701 |
$ cat transpose.awk 
702 | {
703 |     for(i=1; i<=NF; i++)
704 |         r[i]=r[i] sep $i
705 |     sep=FS
706 | } 
707 | END {
708 |     for(i=1; i<=NF; i++) 
709 |         print r[i]
710 | }
711 | ..................................
712 | 
713 | $ cat matrix 
714 | a1;a2;a3;a4;a5
715 | b1;b2;b3;b4;b5
716 | c1;c2;c3;c4;c5
717 | d1;d2;d3;d4;d5
718 | ..................................
719 | 
720 | $ awk -F\; -f transpose.awk matrix
721 | a1;b1;c1;d1
722 | a2;b2;c2;d2
723 | a3;b3;c3;d3
724 | a4;b4;c4;d4
725 | a5;b5;c5;d5
726 | ..................................
727 | 
728 | # 명령 옵션으로 '-D' 를 사용하면 디버깅을 할 수 있습니다.
729 | $ awk -D -F\; -f transpose.awk matrix
730 | gawk> ....
731 | 
732 |

[ 예제 출처 ] http://backreference.org/2010/02/10/idiomatic-awk/

733 | 734 | 735 |

Main Debugger Commands

736 |

https://www.gnu.org/software/gawk/manual/html_node/Debugger.html

737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 |
Breakpoint ControlControl of Breakpoints.
Debugger Execution ControlControl of Execution.
Viewing And Changing DataViewing and Changing Data.
Execution StackDealing with the Stack.
Debugger InfoObtaining Information about the Program and the Debugger State.
기타 Debugger CommandsMiscellaneous Commands.
745 | 746 |

Profiling

747 |

https://www.gnu.org/software/gawk/manual/html_node/Profiling.html

748 | 749 | 750 |
751 | 752 | 753 |
754 |
755 |
756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 |
764 |
765 | 766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 791 | 792 | 793 | 794 | 795 | 796 | -------------------------------------------------------------------------------- /examples/cat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/examples/cat.jpg -------------------------------------------------------------------------------- /examples/webserver.awk: -------------------------------------------------------------------------------- 1 | @load "filefuncs" 2 | @load "readfile" 3 | BEGIN { 4 | RS = ORS = "\r\n" 5 | datefmt = "Date: %a, %d %b %Y %H:%M:%S %Z" 6 | socket = "/inet/tcp/8080/0/0" 7 | while ((socket |& getline) > 0) { 8 | if ( $1 == "GET" ) { 9 | print "GET : ", $2 10 | $2 = substr($2, 2) 11 | switch ($2) { 12 | case /\.(jpg|gif|png)$/ : 13 | sendImage($2) 14 | break 15 | default : 16 | sendHtml() 17 | } 18 | } 19 | } 20 | } 21 | function sendHtml( arr) { 22 | arr["type"] = "text/html" 23 | arr["content"] = "\ 24 | \n\ 25 | Out Of Service\n\ 26 | \n\ 27 |

This site is temporarily out of service.

\n\ 28 |

\n\ 29 | \n\ 30 | \n\ 31 | " 32 | arr["length"] = length(arr["content"]) 33 | arr["date"] = strftime(datefmt, systime(), 1) 34 | 35 | send(arr) 36 | } 37 | function sendImage(file, com, st, arr, type) { 38 | RS="\n" 39 | com = "file -b --mime-type '" file "'" 40 | com | getline type; close(com) 41 | RS="\r\n" 42 | arr["type"] = type 43 | stat(file, st) 44 | arr["length"] = st["size"] 45 | arr["content"] = readfile(file) 46 | arr["date"] = strftime(datefmt, systime(), 1) 47 | 48 | send(arr) 49 | } 50 | function send(arr) { 51 | print "HTTP/1.0 200 OK" |& socket 52 | print arr["date"] |& socket 53 | print "Server: AWK" |& socket 54 | print "Content-Length: " arr["length"] |& socket 55 | print "Content-Type: " arr["type"] |& socket 56 | print "" |& socket 57 | print arr["content"] |& socket 58 | 59 | print "close socket" 60 | close(socket) 61 | } 62 | -------------------------------------------------------------------------------- /gawk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/gawk -------------------------------------------------------------------------------- /gawk-5.1.1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/gawk-5.1.1 -------------------------------------------------------------------------------- /gitbook/fonts/fontawesome/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/gitbook/fonts/fontawesome/FontAwesome.otf -------------------------------------------------------------------------------- /gitbook/fonts/fontawesome/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/gitbook/fonts/fontawesome/fontawesome-webfont.eot -------------------------------------------------------------------------------- /gitbook/fonts/fontawesome/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/gitbook/fonts/fontawesome/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /gitbook/fonts/fontawesome/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/gitbook/fonts/fontawesome/fontawesome-webfont.woff -------------------------------------------------------------------------------- /gitbook/images/apple-touch-icon-precomposed-152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/gitbook/images/apple-touch-icon-precomposed-152.png -------------------------------------------------------------------------------- /gitbook/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/gitbook/images/favicon.ico -------------------------------------------------------------------------------- /gitbook/plugins/gitbook-plugin-fontsettings/buttons.js: -------------------------------------------------------------------------------- 1 | require(["gitbook", "lodash", "jQuery"], function(gitbook, _, $) { 2 | var fontState; 3 | 4 | var THEMES = { 5 | "white": 0, 6 | "sepia": 1, 7 | "night": 2 8 | }; 9 | 10 | var FAMILY = { 11 | "serif": 0, 12 | "sans": 1 13 | }; 14 | 15 | // Save current font settings 16 | function saveFontSettings() { 17 | gitbook.storage.set("fontState", fontState); 18 | update(); 19 | } 20 | 21 | // Increase font size 22 | function enlargeFontSize(e) { 23 | e.preventDefault(); 24 | if (fontState.size >= 4) return; 25 | 26 | fontState.size++; 27 | saveFontSettings(); 28 | }; 29 | 30 | // Decrease font size 31 | function reduceFontSize(e) { 32 | e.preventDefault(); 33 | if (fontState.size <= 0) return; 34 | 35 | fontState.size--; 36 | saveFontSettings(); 37 | }; 38 | 39 | // Change font family 40 | function changeFontFamily(index, e) { 41 | e.preventDefault(); 42 | 43 | fontState.family = index; 44 | saveFontSettings(); 45 | }; 46 | 47 | // Change type of color 48 | function changeColorTheme(index, e) { 49 | e.preventDefault(); 50 | 51 | var $book = $(".book"); 52 | 53 | if (fontState.theme !== 0) 54 | $book.removeClass("color-theme-"+fontState.theme); 55 | 56 | fontState.theme = index; 57 | if (fontState.theme !== 0) 58 | $book.addClass("color-theme-"+fontState.theme); 59 | 60 | saveFontSettings(); 61 | }; 62 | 63 | function update() { 64 | var $book = gitbook.state.$book; 65 | 66 | $(".font-settings .font-family-list li").removeClass("active"); 67 | $(".font-settings .font-family-list li:nth-child("+(fontState.family+1)+")").addClass("active"); 68 | 69 | $book[0].className = $book[0].className.replace(/\bfont-\S+/g, ''); 70 | $book.addClass("font-size-"+fontState.size); 71 | $book.addClass("font-family-"+fontState.family); 72 | 73 | if(fontState.theme !== 0) { 74 | $book[0].className = $book[0].className.replace(/\bcolor-theme-\S+/g, ''); 75 | $book.addClass("color-theme-"+fontState.theme); 76 | } 77 | }; 78 | 79 | function init(config) { 80 | var $bookBody, $book; 81 | 82 | //Find DOM elements. 83 | $book = gitbook.state.$book; 84 | $bookBody = $book.find(".book-body"); 85 | 86 | // Instantiate font state object 87 | fontState = gitbook.storage.get("fontState", { 88 | size: config.size || 2, 89 | family: FAMILY[config.family || "sans"], 90 | theme: THEMES[config.theme || "white"] 91 | }); 92 | 93 | update(); 94 | }; 95 | 96 | 97 | gitbook.events.bind("start", function(e, config) { 98 | var opts = config.fontsettings; 99 | 100 | // Create buttons in toolbar 101 | gitbook.toolbar.createButton({ 102 | icon: 'fa fa-font', 103 | label: 'Font Settings', 104 | className: 'font-settings', 105 | dropdown: [ 106 | [ 107 | { 108 | text: 'A', 109 | className: 'font-reduce', 110 | onClick: reduceFontSize 111 | }, 112 | { 113 | text: 'A', 114 | className: 'font-enlarge', 115 | onClick: enlargeFontSize 116 | } 117 | ], 118 | [ 119 | { 120 | text: 'Serif', 121 | onClick: _.partial(changeFontFamily, 0) 122 | }, 123 | { 124 | text: 'Sans', 125 | onClick: _.partial(changeFontFamily, 1) 126 | } 127 | ], 128 | [ 129 | { 130 | text: 'White', 131 | onClick: _.partial(changeColorTheme, 0) 132 | }, 133 | { 134 | text: 'Sepia', 135 | onClick: _.partial(changeColorTheme, 1) 136 | }, 137 | { 138 | text: 'Night', 139 | onClick: _.partial(changeColorTheme, 2) 140 | } 141 | ] 142 | ] 143 | }); 144 | 145 | 146 | // Init current settings 147 | init(opts); 148 | }); 149 | }); 150 | 151 | 152 | -------------------------------------------------------------------------------- /gitbook/plugins/gitbook-plugin-fontsettings/website.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Theme 1 3 | */ 4 | .color-theme-1 .dropdown-menu { 5 | background-color: #111111; 6 | border-color: #7e888b; 7 | } 8 | .color-theme-1 .dropdown-menu .dropdown-caret .caret-inner { 9 | border-bottom: 9px solid #111111; 10 | } 11 | .color-theme-1 .dropdown-menu .buttons { 12 | border-color: #7e888b; 13 | } 14 | .color-theme-1 .dropdown-menu .button { 15 | color: #afa790; 16 | } 17 | .color-theme-1 .dropdown-menu .button:hover { 18 | color: #73553c; 19 | } 20 | /* 21 | * Theme 2 22 | */ 23 | .color-theme-2 .dropdown-menu { 24 | background-color: #2d3143; 25 | border-color: #272a3a; 26 | } 27 | .color-theme-2 .dropdown-menu .dropdown-caret .caret-inner { 28 | border-bottom: 9px solid #2d3143; 29 | } 30 | .color-theme-2 .dropdown-menu .buttons { 31 | border-color: #272a3a; 32 | } 33 | .color-theme-2 .dropdown-menu .button { 34 | color: #62677f; 35 | } 36 | .color-theme-2 .dropdown-menu .button:hover { 37 | color: #f4f4f5; 38 | } 39 | .book .book-header .font-settings .font-enlarge { 40 | line-height: 30px; 41 | font-size: 1.4em; 42 | } 43 | .book .book-header .font-settings .font-reduce { 44 | line-height: 30px; 45 | font-size: 1em; 46 | } 47 | .book.color-theme-1 .book-body { 48 | color: #704214; 49 | background: #f3eacb; 50 | } 51 | .book.color-theme-1 .book-body .page-wrapper .page-inner section { 52 | background: #f3eacb; 53 | } 54 | .book.color-theme-2 .book-body { 55 | color: #bdcadb; 56 | background: #1c1f2b; 57 | } 58 | .book.color-theme-2 .book-body .page-wrapper .page-inner section { 59 | background: #1c1f2b; 60 | } 61 | .book.font-size-0 .book-body .page-inner section { 62 | font-size: 1.2rem; 63 | } 64 | .book.font-size-1 .book-body .page-inner section { 65 | font-size: 1.4rem; 66 | } 67 | .book.font-size-2 .book-body .page-inner section { 68 | font-size: 1.6rem; 69 | } 70 | .book.font-size-3 .book-body .page-inner section { 71 | font-size: 2.2rem; 72 | } 73 | .book.font-size-4 .book-body .page-inner section { 74 | font-size: 4rem; 75 | } 76 | .book.font-family-0 { 77 | font-family: Georgia, serif; 78 | } 79 | .book.font-family-1 { 80 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 81 | } 82 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal { 83 | color: #704214; 84 | } 85 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal a { 86 | color: inherit; 87 | } 88 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h1, 89 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h2, 90 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h3, 91 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h4, 92 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h5, 93 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h6 { 94 | color: inherit; 95 | } 96 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h1, 97 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h2 { 98 | border-color: inherit; 99 | } 100 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h6 { 101 | color: inherit; 102 | } 103 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal hr { 104 | background-color: inherit; 105 | } 106 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal blockquote { 107 | border-color: inherit; 108 | } 109 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre, 110 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code { 111 | background: #fdf6e3; 112 | color: #657b83; 113 | border-color: #f8df9c; 114 | } 115 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal .highlight { 116 | background-color: inherit; 117 | } 118 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table th, 119 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table td { 120 | border-color: #f5d06c; 121 | } 122 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table tr { 123 | color: inherit; 124 | background-color: #fdf6e3; 125 | border-color: #444444; 126 | } 127 | .book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table tr:nth-child(2n) { 128 | background-color: #fbeecb; 129 | } 130 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal { 131 | color: #bdcadb; 132 | } 133 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal a { 134 | color: #3eb1d0; 135 | } 136 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h1, 137 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h2, 138 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h3, 139 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h4, 140 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h5, 141 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h6 { 142 | color: #fffffa; 143 | } 144 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h1, 145 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h2 { 146 | border-color: #373b4e; 147 | } 148 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h6 { 149 | color: #373b4e; 150 | } 151 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal hr { 152 | background-color: #373b4e; 153 | } 154 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal blockquote { 155 | border-color: #373b4e; 156 | } 157 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre, 158 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code { 159 | color: #9dbed8; 160 | background: #2d3143; 161 | border-color: #2d3143; 162 | } 163 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal .highlight { 164 | background-color: #282a39; 165 | } 166 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table th, 167 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table td { 168 | border-color: #3b3f54; 169 | } 170 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table tr { 171 | color: #b6c2d2; 172 | background-color: #2d3143; 173 | border-color: #3b3f54; 174 | } 175 | .book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table tr:nth-child(2n) { 176 | background-color: #35394b; 177 | } 178 | .book.color-theme-1 .book-header { 179 | color: #afa790; 180 | background: transparent; 181 | } 182 | .book.color-theme-1 .book-header .btn { 183 | color: #afa790; 184 | } 185 | .book.color-theme-1 .book-header .btn:hover { 186 | color: #73553c; 187 | background: none; 188 | } 189 | .book.color-theme-1 .book-header h1 { 190 | color: #704214; 191 | } 192 | .book.color-theme-2 .book-header { 193 | color: #7e888b; 194 | background: transparent; 195 | } 196 | .book.color-theme-2 .book-header .btn { 197 | color: #3b3f54; 198 | } 199 | .book.color-theme-2 .book-header .btn:hover { 200 | color: #fffff5; 201 | background: none; 202 | } 203 | .book.color-theme-2 .book-header h1 { 204 | color: #bdcadb; 205 | } 206 | .book.color-theme-1 .book-body .navigation { 207 | color: #afa790; 208 | } 209 | .book.color-theme-1 .book-body .navigation:hover { 210 | color: #73553c; 211 | } 212 | .book.color-theme-2 .book-body .navigation { 213 | color: #383f52; 214 | } 215 | .book.color-theme-2 .book-body .navigation:hover { 216 | color: #fffff5; 217 | } 218 | /* 219 | * Theme 1 220 | */ 221 | .book.color-theme-1 .book-summary { 222 | color: #afa790; 223 | background: #111111; 224 | border-right: 1px solid rgba(0, 0, 0, 0.07); 225 | } 226 | .book.color-theme-1 .book-summary .book-search { 227 | background: transparent; 228 | } 229 | .book.color-theme-1 .book-summary .book-search input, 230 | .book.color-theme-1 .book-summary .book-search input:focus { 231 | border: 1px solid transparent; 232 | } 233 | .book.color-theme-1 .book-summary ul.summary li.divider { 234 | background: #7e888b; 235 | box-shadow: none; 236 | } 237 | .book.color-theme-1 .book-summary ul.summary li i.fa-check { 238 | color: #33cc33; 239 | } 240 | .book.color-theme-1 .book-summary ul.summary li.done > a { 241 | color: #877f6a; 242 | } 243 | .book.color-theme-1 .book-summary ul.summary li a, 244 | .book.color-theme-1 .book-summary ul.summary li span { 245 | color: #877f6a; 246 | background: transparent; 247 | font-weight: normal; 248 | } 249 | .book.color-theme-1 .book-summary ul.summary li.active > a, 250 | .book.color-theme-1 .book-summary ul.summary li a:hover { 251 | color: #704214; 252 | background: transparent; 253 | font-weight: normal; 254 | } 255 | /* 256 | * Theme 2 257 | */ 258 | .book.color-theme-2 .book-summary { 259 | color: #bcc1d2; 260 | background: #2d3143; 261 | border-right: none; 262 | } 263 | .book.color-theme-2 .book-summary .book-search { 264 | background: transparent; 265 | } 266 | .book.color-theme-2 .book-summary .book-search input, 267 | .book.color-theme-2 .book-summary .book-search input:focus { 268 | border: 1px solid transparent; 269 | } 270 | .book.color-theme-2 .book-summary ul.summary li.divider { 271 | background: #272a3a; 272 | box-shadow: none; 273 | } 274 | .book.color-theme-2 .book-summary ul.summary li i.fa-check { 275 | color: #33cc33; 276 | } 277 | .book.color-theme-2 .book-summary ul.summary li.done > a { 278 | color: #62687f; 279 | } 280 | .book.color-theme-2 .book-summary ul.summary li a, 281 | .book.color-theme-2 .book-summary ul.summary li span { 282 | color: #c1c6d7; 283 | background: transparent; 284 | font-weight: 600; 285 | } 286 | .book.color-theme-2 .book-summary ul.summary li.active > a, 287 | .book.color-theme-2 .book-summary ul.summary li a:hover { 288 | color: #f4f4f5; 289 | background: #252737; 290 | font-weight: 600; 291 | } 292 | -------------------------------------------------------------------------------- /gitbook/plugins/gitbook-plugin-highlight/ebook.css: -------------------------------------------------------------------------------- 1 | pre, 2 | code { 3 | /* http://jmblog.github.io/color-themes-for-highlightjs */ 4 | /* Tomorrow Comment */ 5 | /* Tomorrow Red */ 6 | /* Tomorrow Orange */ 7 | /* Tomorrow Yellow */ 8 | /* Tomorrow Green */ 9 | /* Tomorrow Aqua */ 10 | /* Tomorrow Blue */ 11 | /* Tomorrow Purple */ 12 | } 13 | pre .hljs-comment, 14 | code .hljs-comment, 15 | pre .hljs-title, 16 | code .hljs-title { 17 | color: #8e908c; 18 | } 19 | pre .hljs-variable, 20 | code .hljs-variable, 21 | pre .hljs-attribute, 22 | code .hljs-attribute, 23 | pre .hljs-tag, 24 | code .hljs-tag, 25 | pre .hljs-regexp, 26 | code .hljs-regexp, 27 | pre .ruby .hljs-constant, 28 | code .ruby .hljs-constant, 29 | pre .xml .hljs-tag .hljs-title, 30 | code .xml .hljs-tag .hljs-title, 31 | pre .xml .hljs-pi, 32 | code .xml .hljs-pi, 33 | pre .xml .hljs-doctype, 34 | code .xml .hljs-doctype, 35 | pre .html .hljs-doctype, 36 | code .html .hljs-doctype, 37 | pre .css .hljs-id, 38 | code .css .hljs-id, 39 | pre .css .hljs-class, 40 | code .css .hljs-class, 41 | pre .css .hljs-pseudo, 42 | code .css .hljs-pseudo { 43 | color: #c82829; 44 | } 45 | pre .hljs-number, 46 | code .hljs-number, 47 | pre .hljs-preprocessor, 48 | code .hljs-preprocessor, 49 | pre .hljs-pragma, 50 | code .hljs-pragma, 51 | pre .hljs-built_in, 52 | code .hljs-built_in, 53 | pre .hljs-literal, 54 | code .hljs-literal, 55 | pre .hljs-params, 56 | code .hljs-params, 57 | pre .hljs-constant, 58 | code .hljs-constant { 59 | color: #f5871f; 60 | } 61 | pre .ruby .hljs-class .hljs-title, 62 | code .ruby .hljs-class .hljs-title, 63 | pre .css .hljs-rules .hljs-attribute, 64 | code .css .hljs-rules .hljs-attribute { 65 | color: #eab700; 66 | } 67 | pre .hljs-string, 68 | code .hljs-string, 69 | pre .hljs-value, 70 | code .hljs-value, 71 | pre .hljs-inheritance, 72 | code .hljs-inheritance, 73 | pre .hljs-header, 74 | code .hljs-header, 75 | pre .ruby .hljs-symbol, 76 | code .ruby .hljs-symbol, 77 | pre .xml .hljs-cdata, 78 | code .xml .hljs-cdata { 79 | color: #718c00; 80 | } 81 | pre .css .hljs-hexcolor, 82 | code .css .hljs-hexcolor { 83 | color: #3e999f; 84 | } 85 | pre .hljs-function, 86 | code .hljs-function, 87 | pre .python .hljs-decorator, 88 | code .python .hljs-decorator, 89 | pre .python .hljs-title, 90 | code .python .hljs-title, 91 | pre .ruby .hljs-function .hljs-title, 92 | code .ruby .hljs-function .hljs-title, 93 | pre .ruby .hljs-title .hljs-keyword, 94 | code .ruby .hljs-title .hljs-keyword, 95 | pre .perl .hljs-sub, 96 | code .perl .hljs-sub, 97 | pre .javascript .hljs-title, 98 | code .javascript .hljs-title, 99 | pre .coffeescript .hljs-title, 100 | code .coffeescript .hljs-title { 101 | color: #4271ae; 102 | } 103 | pre .hljs-keyword, 104 | code .hljs-keyword, 105 | pre .javascript .hljs-function, 106 | code .javascript .hljs-function { 107 | color: #8959a8; 108 | } 109 | pre .hljs, 110 | code .hljs { 111 | display: block; 112 | background: white; 113 | color: #4d4d4c; 114 | padding: 0.5em; 115 | } 116 | pre .coffeescript .javascript, 117 | code .coffeescript .javascript, 118 | pre .javascript .xml, 119 | code .javascript .xml, 120 | pre .tex .hljs-formula, 121 | code .tex .hljs-formula, 122 | pre .xml .javascript, 123 | code .xml .javascript, 124 | pre .xml .vbscript, 125 | code .xml .vbscript, 126 | pre .xml .css, 127 | code .xml .css, 128 | pre .xml .hljs-cdata, 129 | code .xml .hljs-cdata { 130 | opacity: 0.5; 131 | } 132 | -------------------------------------------------------------------------------- /gitbook/plugins/gitbook-plugin-search/lunr.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 0.5.12 3 | * Copyright (C) 2015 Oliver Nightingale 4 | * MIT Licensed 5 | * @license 6 | */ 7 | !function(){var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.5.12",t.utils={},t.utils.warn=function(t){return function(e){t.console&&console.warn&&console.warn(e)}}(this),t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var t=Array.prototype.slice.call(arguments),e=t.pop(),n=t;if("function"!=typeof e)throw new TypeError("last argument must be a function");n.forEach(function(t){this.hasHandler(t)||(this.events[t]=[]),this.events[t].push(e)},this)},t.EventEmitter.prototype.removeListener=function(t,e){if(this.hasHandler(t)){var n=this.events[t].indexOf(e);this.events[t].splice(n,1),this.events[t].length||delete this.events[t]}},t.EventEmitter.prototype.emit=function(t){if(this.hasHandler(t)){var e=Array.prototype.slice.call(arguments,1);this.events[t].forEach(function(t){t.apply(void 0,e)})}},t.EventEmitter.prototype.hasHandler=function(t){return t in this.events},t.tokenizer=function(t){return arguments.length&&null!=t&&void 0!=t?Array.isArray(t)?t.map(function(t){return t.toLowerCase()}):t.toString().trim().toLowerCase().split(/[\s\-]+/):[]},t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.registeredFunctions[e];if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");this._stack.splice(i,0,n)},t.Pipeline.prototype.remove=function(t){var e=this._stack.indexOf(t);-1!=e&&this._stack.splice(e,1)},t.Pipeline.prototype.run=function(t){for(var e=[],n=t.length,i=this._stack.length,o=0;n>o;o++){for(var r=t[o],s=0;i>s&&(r=this._stack[s](r,o,t),void 0!==r);s++);void 0!==r&&e.push(r)}return e},t.Pipeline.prototype.reset=function(){this._stack=[]},t.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Vector=function(){this._magnitude=null,this.list=void 0,this.length=0},t.Vector.Node=function(t,e,n){this.idx=t,this.val=e,this.next=n},t.Vector.prototype.insert=function(e,n){this._magnitude=void 0;var i=this.list;if(!i)return this.list=new t.Vector.Node(e,n,i),this.length++;if(en.idx?n=n.next:(i+=e.val*n.val,e=e.next,n=n.next);return i},t.Vector.prototype.similarity=function(t){return this.dot(t)/(this.magnitude()*t.magnitude())},t.SortedSet=function(){this.length=0,this.elements=[]},t.SortedSet.load=function(t){var e=new this;return e.elements=t,e.length=t.length,e},t.SortedSet.prototype.add=function(){var t,e;for(t=0;t1;){if(r===t)return o;t>r&&(e=o),r>t&&(n=o),i=n-e,o=e+Math.floor(i/2),r=this.elements[o]}return r===t?o:-1},t.SortedSet.prototype.locationFor=function(t){for(var e=0,n=this.elements.length,i=n-e,o=e+Math.floor(i/2),r=this.elements[o];i>1;)t>r&&(e=o),r>t&&(n=o),i=n-e,o=e+Math.floor(i/2),r=this.elements[o];return r>t?o:t>r?o+1:void 0},t.SortedSet.prototype.intersect=function(e){for(var n=new t.SortedSet,i=0,o=0,r=this.length,s=e.length,a=this.elements,h=e.elements;;){if(i>r-1||o>s-1)break;a[i]!==h[o]?a[i]h[o]&&o++:(n.add(a[i]),i++,o++)}return n},t.SortedSet.prototype.clone=function(){var e=new t.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},t.SortedSet.prototype.union=function(t){var e,n,i;return this.length>=t.length?(e=this,n=t):(e=t,n=this),i=e.clone(),i.add.apply(i,n.toArray()),i},t.SortedSet.prototype.toJSON=function(){return this.toArray()},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.Store,this.tokenStore=new t.TokenStore,this.corpusTokens=new t.SortedSet,this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var t=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,t)},t.Index.prototype.off=function(t,e){return this.eventEmitter.removeListener(t,e)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;return n._fields=e.fields,n._ref=e.ref,n.documentStore=t.Store.load(e.documentStore),n.tokenStore=t.TokenStore.load(e.tokenStore),n.corpusTokens=t.SortedSet.load(e.corpusTokens),n.pipeline=t.Pipeline.load(e.pipeline),n},t.Index.prototype.field=function(t,e){var e=e||{},n={name:t,boost:e.boost||1};return this._fields.push(n),this},t.Index.prototype.ref=function(t){return this._ref=t,this},t.Index.prototype.add=function(e,n){var i={},o=new t.SortedSet,r=e[this._ref],n=void 0===n?!0:n;this._fields.forEach(function(n){var r=this.pipeline.run(t.tokenizer(e[n.name]));i[n.name]=r,t.SortedSet.prototype.add.apply(o,r)},this),this.documentStore.set(r,o),t.SortedSet.prototype.add.apply(this.corpusTokens,o.toArray());for(var s=0;s0&&(i=1+Math.log(this.documentStore.length/n)),this._idfCache[e]=i},t.Index.prototype.search=function(e){var n=this.pipeline.run(t.tokenizer(e)),i=new t.Vector,o=[],r=this._fields.reduce(function(t,e){return t+e.boost},0),s=n.some(function(t){return this.tokenStore.has(t)},this);if(!s)return[];n.forEach(function(e,n,s){var a=1/s.length*this._fields.length*r,h=this,l=this.tokenStore.expand(e).reduce(function(n,o){var r=h.corpusTokens.indexOf(o),s=h.idf(o),l=1,u=new t.SortedSet;if(o!==e){var c=Math.max(3,o.length-e.length);l=1/Math.log(c)}return r>-1&&i.insert(r,a*s*l),Object.keys(h.tokenStore.get(o)).forEach(function(t){u.add(t)}),n.union(u)},new t.SortedSet);o.push(l)},this);var a=o.reduce(function(t,e){return t.intersect(e)});return a.map(function(t){return{ref:t,score:i.similarity(this.documentVector(t))}},this).sort(function(t,e){return e.score-t.score})},t.Index.prototype.documentVector=function(e){for(var n=this.documentStore.get(e),i=n.length,o=new t.Vector,r=0;i>r;r++){var s=n.elements[r],a=this.tokenStore.get(s)[e].tf,h=this.idf(s);o.insert(this.corpusTokens.indexOf(s),a*h)}return o},t.Index.prototype.toJSON=function(){return{version:t.version,fields:this._fields,ref:this._ref,documentStore:this.documentStore.toJSON(),tokenStore:this.tokenStore.toJSON(),corpusTokens:this.corpusTokens.toJSON(),pipeline:this.pipeline.toJSON()}},t.Index.prototype.use=function(t){var e=Array.prototype.slice.call(arguments,1);e.unshift(this),t.apply(this,e)},t.Store=function(){this.store={},this.length=0},t.Store.load=function(e){var n=new this;return n.length=e.length,n.store=Object.keys(e.store).reduce(function(n,i){return n[i]=t.SortedSet.load(e.store[i]),n},{}),n},t.Store.prototype.set=function(t,e){this.has(t)||this.length++,this.store[t]=e},t.Store.prototype.get=function(t){return this.store[t]},t.Store.prototype.has=function(t){return t in this.store},t.Store.prototype.remove=function(t){this.has(t)&&(delete this.store[t],this.length--)},t.Store.prototype.toJSON=function(){return{store:this.store,length:this.length}},t.stemmer=function(){var t={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},e={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",o=n+"[^aeiouy]*",r=i+"[aeiou]*",s="^("+o+")?"+r+o,a="^("+o+")?"+r+o+"("+r+")?$",h="^("+o+")?"+r+o+r+o,l="^("+o+")?"+i,u=new RegExp(s),c=new RegExp(h),f=new RegExp(a),d=new RegExp(l),p=/^(.+?)(ss|i)es$/,m=/^(.+?)([^s])s$/,v=/^(.+?)eed$/,y=/^(.+?)(ed|ing)$/,g=/.$/,S=/(at|bl|iz)$/,w=new RegExp("([^aeiouylsz])\\1$"),x=new RegExp("^"+o+i+"[^aeiouwxy]$"),k=/^(.+?[^aeiou])y$/,b=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,E=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,_=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,F=/^(.+?)(s|t)(ion)$/,O=/^(.+?)e$/,P=/ll$/,N=new RegExp("^"+o+i+"[^aeiouwxy]$"),T=function(n){var i,o,r,s,a,h,l;if(n.length<3)return n;if(r=n.substr(0,1),"y"==r&&(n=r.toUpperCase()+n.substr(1)),s=p,a=m,s.test(n)?n=n.replace(s,"$1$2"):a.test(n)&&(n=n.replace(a,"$1$2")),s=v,a=y,s.test(n)){var T=s.exec(n);s=u,s.test(T[1])&&(s=g,n=n.replace(s,""))}else if(a.test(n)){var T=a.exec(n);i=T[1],a=d,a.test(i)&&(n=i,a=S,h=w,l=x,a.test(n)?n+="e":h.test(n)?(s=g,n=n.replace(s,"")):l.test(n)&&(n+="e"))}if(s=k,s.test(n)){var T=s.exec(n);i=T[1],n=i+"i"}if(s=b,s.test(n)){var T=s.exec(n);i=T[1],o=T[2],s=u,s.test(i)&&(n=i+t[o])}if(s=E,s.test(n)){var T=s.exec(n);i=T[1],o=T[2],s=u,s.test(i)&&(n=i+e[o])}if(s=_,a=F,s.test(n)){var T=s.exec(n);i=T[1],s=c,s.test(i)&&(n=i)}else if(a.test(n)){var T=a.exec(n);i=T[1]+T[2],a=c,a.test(i)&&(n=i)}if(s=O,s.test(n)){var T=s.exec(n);i=T[1],s=c,a=f,h=N,(s.test(i)||a.test(i)&&!h.test(i))&&(n=i)}return s=P,a=c,s.test(n)&&a.test(n)&&(s=g,n=n.replace(s,"")),"y"==r&&(n=r.toLowerCase()+n.substr(1)),n};return T}(),t.Pipeline.registerFunction(t.stemmer,"stemmer"),t.stopWordFilter=function(e){return e&&t.stopWordFilter.stopWords[e]!==e?e:void 0},t.stopWordFilter.stopWords={a:"a",able:"able",about:"about",across:"across",after:"after",all:"all",almost:"almost",also:"also",am:"am",among:"among",an:"an",and:"and",any:"any",are:"are",as:"as",at:"at",be:"be",because:"because",been:"been",but:"but",by:"by",can:"can",cannot:"cannot",could:"could",dear:"dear",did:"did","do":"do",does:"does",either:"either","else":"else",ever:"ever",every:"every","for":"for",from:"from",get:"get",got:"got",had:"had",has:"has",have:"have",he:"he",her:"her",hers:"hers",him:"him",his:"his",how:"how",however:"however",i:"i","if":"if","in":"in",into:"into",is:"is",it:"it",its:"its",just:"just",least:"least",let:"let",like:"like",likely:"likely",may:"may",me:"me",might:"might",most:"most",must:"must",my:"my",neither:"neither",no:"no",nor:"nor",not:"not",of:"of",off:"off",often:"often",on:"on",only:"only",or:"or",other:"other",our:"our",own:"own",rather:"rather",said:"said",say:"say",says:"says",she:"she",should:"should",since:"since",so:"so",some:"some",than:"than",that:"that",the:"the",their:"their",them:"them",then:"then",there:"there",these:"these",they:"they","this":"this",tis:"tis",to:"to",too:"too",twas:"twas",us:"us",wants:"wants",was:"was",we:"we",were:"were",what:"what",when:"when",where:"where",which:"which","while":"while",who:"who",whom:"whom",why:"why",will:"will","with":"with",would:"would",yet:"yet",you:"you",your:"your"},t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter"),t.trimmer=function(t){var e=t.replace(/^\W+/,"").replace(/\W+$/,"");return""===e?void 0:e},t.Pipeline.registerFunction(t.trimmer,"trimmer"),t.TokenStore=function(){this.root={docs:{}},this.length=0},t.TokenStore.load=function(t){var e=new this;return e.root=t.root,e.length=t.length,e},t.TokenStore.prototype.add=function(t,e,n){var n=n||this.root,i=t[0],o=t.slice(1);return i in n||(n[i]={docs:{}}),0===o.length?(n[i].docs[e.ref]=e,void(this.length+=1)):this.add(o,e,n[i])},t.TokenStore.prototype.has=function(t){if(!t)return!1;for(var e=this.root,n=0;n', { 41 | 'class': 'book-search', 42 | 'role': 'search' 43 | }); 44 | 45 | $searchInput = $('', { 46 | 'type': 'text', 47 | 'class': 'form-control', 48 | 'val': value, 49 | 'placeholder': 'Type to search' 50 | }); 51 | 52 | $searchInput.appendTo($searchForm); 53 | $searchForm.prependTo(gitbook.state.$book.find('.book-summary')); 54 | } 55 | 56 | // Return true if search is open 57 | function isSearchOpen() { 58 | return gitbook.state.$book.hasClass("with-search"); 59 | } 60 | 61 | // Toggle the search 62 | function toggleSearch(_state) { 63 | if (isSearchOpen() === _state) return; 64 | 65 | gitbook.state.$book.toggleClass("with-search", _state); 66 | 67 | // If search bar is open: focus input 68 | if (isSearchOpen()) { 69 | gitbook.sidebar.toggle(true); 70 | $searchInput.focus(); 71 | } else { 72 | $searchInput.blur(); 73 | $searchInput.val(""); 74 | gitbook.sidebar.filter(null); 75 | } 76 | } 77 | 78 | // Recover current search when page changed 79 | function recoverSearch() { 80 | var keyword = gitbook.storage.get("keyword", ""); 81 | 82 | createForm(keyword); 83 | 84 | if (keyword.length > 0) { 85 | if(!isSearchOpen()) { 86 | toggleSearch(); 87 | } 88 | gitbook.sidebar.filter(_.pluck(search(keyword), "path")); 89 | } 90 | }; 91 | 92 | 93 | gitbook.events.bind("start", function(config) { 94 | // Pre-fetch search index and create the form 95 | fetchIndex(); 96 | createForm(); 97 | 98 | // Type in search bar 99 | $(document).on("keyup", ".book-search input", function(e) { 100 | var key = (e.keyCode ? e.keyCode : e.which); 101 | var q = $(this).val(); 102 | 103 | if (key == 27) { 104 | e.preventDefault(); 105 | toggleSearch(false); 106 | return; 107 | } 108 | if (q.length == 0) { 109 | gitbook.sidebar.filter(null); 110 | gitbook.storage.remove("keyword"); 111 | } else { 112 | var results = search(q); 113 | gitbook.sidebar.filter( 114 | _.pluck(results, "path") 115 | ); 116 | gitbook.storage.set("keyword", q); 117 | } 118 | }); 119 | 120 | // Create the toggle search button 121 | gitbook.toolbar.createButton({ 122 | icon: 'fa fa-search', 123 | label: 'Search', 124 | position: 'left', 125 | onClick: toggleSearch 126 | }); 127 | 128 | // Bind keyboard to toggle search 129 | gitbook.keyboard.bind(['f'], toggleSearch) 130 | }); 131 | 132 | gitbook.events.bind("page.change", recoverSearch); 133 | }); 134 | 135 | 136 | -------------------------------------------------------------------------------- /gitbook/plugins/gitbook-plugin-sharing/buttons.js: -------------------------------------------------------------------------------- 1 | require(["gitbook", "lodash"], function(gitbook, _) { 2 | var SITES = { 3 | 'facebook': { 4 | 'label': 'Facebook', 5 | 'icon': 'fa fa-facebook', 6 | 'onClick': function(e) { 7 | e.preventDefault(); 8 | window.open("http://www.facebook.com/sharer/sharer.php?s=100&p[url]="+encodeURIComponent(location.href)); 9 | } 10 | }, 11 | 'twitter': { 12 | 'label': 'Twitter', 13 | 'icon': 'fa fa-twitter', 14 | 'onClick': function(e) { 15 | e.preventDefault(); 16 | window.open("http://twitter.com/home?status="+encodeURIComponent(document.title+" "+location.href)); 17 | } 18 | }, 19 | 'google': { 20 | 'label': 'Google+', 21 | 'icon': 'fa fa-google-plus', 22 | 'onClick': function(e) { 23 | e.preventDefault(); 24 | window.open("https://plus.google.com/share?url="+encodeURIComponent(location.href)); 25 | } 26 | }, 27 | 'weibo': { 28 | 'label': 'Weibo', 29 | 'icon': 'fa fa-weibo', 30 | 'onClick': function(e) { 31 | e.preventDefault(); 32 | window.open("http://service.weibo.com/share/share.php?content=utf-8&url="+encodeURIComponent(location.href)+"&title="+encodeURIComponent(document.title)); 33 | } 34 | }, 35 | 'instapaper': { 36 | 'label': 'Instapaper', 37 | 'icon': 'fa fa-instapaper', 38 | 'onClick': function(e) { 39 | e.preventDefault(); 40 | window.open("http://www.instapaper.com/text?u="+encodeURIComponent(location.href)); 41 | } 42 | }, 43 | 'vk': { 44 | 'label': 'VK', 45 | 'icon': 'fa fa-vk', 46 | 'onClick': function(e) { 47 | e.preventDefault(); 48 | window.open("http://vkontakte.ru/share.php?url="+encodeURIComponent(location.href)); 49 | } 50 | } 51 | }; 52 | 53 | 54 | 55 | gitbook.events.bind("start", function(e, config) { 56 | var opts = config.sharing; 57 | 58 | // Create dropdown menu 59 | var menu = _.chain(opts.all) 60 | .map(function(id) { 61 | var site = SITES[id]; 62 | 63 | return { 64 | text: site.label, 65 | onClick: site.onClick 66 | }; 67 | }) 68 | .compact() 69 | .value(); 70 | 71 | // Create main button with dropdown 72 | if (menu.length > 0) { 73 | gitbook.toolbar.createButton({ 74 | icon: 'fa fa-share-alt', 75 | label: 'Share', 76 | position: 'right', 77 | dropdown: [menu] 78 | }); 79 | } 80 | 81 | // Direct actions to share 82 | _.each(SITES, function(site, sideId) { 83 | if (!opts[sideId]) return; 84 | 85 | gitbook.toolbar.createButton({ 86 | icon: site.icon, 87 | label: site.text, 88 | position: 'right', 89 | onClick: site.onClick 90 | }); 91 | }); 92 | }); 93 | }); 94 | -------------------------------------------------------------------------------- /images/array_for.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/array_for.png -------------------------------------------------------------------------------- /images/array_if.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/array_if.png -------------------------------------------------------------------------------- /images/buttons/binmode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/buttons/binmode.png -------------------------------------------------------------------------------- /images/buttons/convfmt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/buttons/convfmt.png -------------------------------------------------------------------------------- /images/buttons/fieldwidths.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/buttons/fieldwidths.png -------------------------------------------------------------------------------- /images/buttons/fpat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/buttons/fpat.png -------------------------------------------------------------------------------- /images/buttons/fs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/buttons/fs.png -------------------------------------------------------------------------------- /images/buttons/ignorecase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/buttons/ignorecase.png -------------------------------------------------------------------------------- /images/buttons/lint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/buttons/lint.png -------------------------------------------------------------------------------- /images/buttons/ofmt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/buttons/ofmt.png -------------------------------------------------------------------------------- /images/buttons/ofs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/buttons/ofs.png -------------------------------------------------------------------------------- /images/buttons/ors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/buttons/ors.png -------------------------------------------------------------------------------- /images/buttons/prec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/buttons/prec.png -------------------------------------------------------------------------------- /images/buttons/roundmode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/buttons/roundmode.png -------------------------------------------------------------------------------- /images/buttons/rs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/buttons/rs.png -------------------------------------------------------------------------------- /images/buttons/subsep.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/buttons/subsep.png -------------------------------------------------------------------------------- /images/buttons/textdomain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/buttons/textdomain.png -------------------------------------------------------------------------------- /images/close_coproc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/close_coproc.png -------------------------------------------------------------------------------- /images/close_file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/close_file.png -------------------------------------------------------------------------------- /images/close_pipe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/close_pipe.png -------------------------------------------------------------------------------- /images/control_statements/do-while.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/control_statements/do-while.png -------------------------------------------------------------------------------- /images/control_statements/for.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/control_statements/for.png -------------------------------------------------------------------------------- /images/control_statements/if-else.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/control_statements/if-else.png -------------------------------------------------------------------------------- /images/control_statements/switch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/control_statements/switch.png -------------------------------------------------------------------------------- /images/control_statements/while.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/control_statements/while.png -------------------------------------------------------------------------------- /images/data_example1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/data_example1.png -------------------------------------------------------------------------------- /images/data_example2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/data_example2.png -------------------------------------------------------------------------------- /images/data_example3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/data_example3.png -------------------------------------------------------------------------------- /images/debugging.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/debugging.gif -------------------------------------------------------------------------------- /images/extension_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/extension_1.png -------------------------------------------------------------------------------- /images/fflush_n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/fflush_n.png -------------------------------------------------------------------------------- /images/fflush_n2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/fflush_n2.png -------------------------------------------------------------------------------- /images/fflush_y.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/fflush_y.png -------------------------------------------------------------------------------- /images/function_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/function_1.png -------------------------------------------------------------------------------- /images/function_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/function_2.png -------------------------------------------------------------------------------- /images/function_ex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/function_ex.png -------------------------------------------------------------------------------- /images/getline_pipe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/getline_pipe.png -------------------------------------------------------------------------------- /images/named_pipe.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/named_pipe.mp4 -------------------------------------------------------------------------------- /images/number_regex.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/number_regex.gif -------------------------------------------------------------------------------- /images/proc_net_tcp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/proc_net_tcp.png -------------------------------------------------------------------------------- /images/sort_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/sort_example.png -------------------------------------------------------------------------------- /images/tcp_ip_fork.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/tcp_ip_fork.png -------------------------------------------------------------------------------- /images/tcp_ip_uri.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/tcp_ip_uri.png -------------------------------------------------------------------------------- /images/workflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/images/workflow.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 14 | 15 | 16 | 17 | 18 | Introduction | Introduction 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 |
66 | 67 | 68 |
69 | 654 |
655 | 656 |
657 |
658 | 668 | 669 |
670 |
671 | 672 | 673 |
674 | 675 |

676 |

Introduction

677 |

Sed 가 텍스트를 처리하는데 있어서 훌륭한 툴이기는 하지만 한가지 단점이 678 | 연산을 할수가 없다는 것입니다. 679 | 가령 foo 라는 단어가 몇번 나왔는지 센다거나 숫자로된 스트링을 모두 더해서 680 | 합계를 구하려고 할때는 awk 를 사용해야 합니다. 681 | awk 는 sed 와 같이 텍스트 스트림을 입력받아 처리할 수 있는 스트림 에디터인데 682 | 내부적으로 연산자가 있고 변수와 함수를 사용할 수 있어서 683 | 필요한 데이터 조작을 쉽게 처리할 수가 있습니다. 684 | ( sed 가 원시적인 프로그래밍 언어라면 awk 는 그보다 좀 더 발전된 형태? )

685 |

awk 의 장점은 기존에 프로그래밍 경험이 있고 shell script 에 대한 지식이 있으면 686 | 실제 사용하는데 많은 시간이 들지 않는다는 것입니다. 687 | 예를 들어 입, 출력을 shell 에서와 같이 pipe 와 redirection 문자를 이용해 처리합니다. 688 | awk 는 실행하기 위해 꼭 데이터 입력 스트림이 필요하지 않습니다. 689 | BEGIN 블록을 이용하면 입력 스트림 없이도 독자적으로 스크립트를 실행시킬 수가 있습니다. 690 | awk 는 텍스트 조작에 필요한 스트링 함수 외에도 numeric, i/o, time 같은 함수들과 691 | socket 연결 기능도 제공하므로 데이터 스트림을 처리할 때뿐만 아니라 692 | 독립적인 프로그램 작성용으로도 활용할 수가 있습니다.

693 |

awk 는 1970년대에 Bell 연구소에서 Alfred Aho, Peter Weinberger, Brian Kernighan 694 | 세 사람에 의해 처음 만들어졌는데 awk 라는 이름은 이 세 사람 이름의 첫 글자를 따서 만들었다고 합니다. 695 | Brian Kernighan 은 awk 를 만든 이유에 대해 696 | "필요한 프로그램을 단 몇 줄의 라인으로도 쉽게 만들 수 있게 하려고.." 라고 했는데요. 697 | 실제 awk 를 사용해보면 이 말의 의미를 알수가 있습니다.

698 |
Ubuntu Linux 에서 GNU Awk version 4.2.1 를 이용하여 설명하였습니다.
699 | 
700 | 필요에 따라 수시로 업데이트 되므로 파일을 다운로드하는 것보다는 웹에서 보는 것이 좋습니다.
701 | 흰색 바탕이 너무 밝을 경우 좌측 상단에 보면 어두운 바탕으로 테마를 변경할 수 있습니다.
702 | ( 참고로 페이지는 Night 모드에서 작성하였습니다. )
703 | 
704 | 705 |
706 | 707 | 708 |
709 |
710 |
711 | 712 | 713 | 714 | 715 | 716 |
717 |
718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 744 | 745 | 746 | 747 | 748 | 749 | -------------------------------------------------------------------------------- /index2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 14 | 15 | 16 | 17 | 18 | Index | Introduction 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 |
68 | 69 | 70 |
71 | 656 |
657 | 658 |
659 |
660 | 670 | 671 |
672 |
673 | 674 | 675 |
676 | 677 |

Index

678 |

컴퓨터가 속도가 빠르다고 하지만 처리해야 될 데이터량이 많아지면 679 | 속도가 느려질 수밖에 없는데요. 680 | 이때 사용할 수 있는 방법이 index 입니다. 681 | index 는 일종에 특정 컬럼 값을 중심으로 미리 정렬을 해놓는 것입니다. 682 | 레코드가 정렬되어 있다고 가정하면 특정 연산을 빠르게 683 | 처리할 수 있고 메모리 사용량도 줄일 수가 있습니다.

684 |
    685 |
  • ORDER BY amount LIMIT 100 연산을 할 경우
  • 686 |
687 |

레코드가 amount 값을 중심으로 정렬 되어있다고 가정하면 688 | 전체 데이터를 검색할 필요 없이 그냥 순차적으로 앞에서 100 개의 레코드를 출력하고 689 | 바로 연산을 종료할 수 있습니다.

690 |
    691 |
  • 레코드 값이 중복되어 저장될 경우 uniq 한 레코드만 출력하고자 할 때
  • 692 |
693 |

만약에 전체 데이터 크기가 1G 이고 uniq 한 레코드가 700M, 중복되는 레코드가 300M 694 | 라고 한다면 awk 에서 group by 를 이용해 array 로 700M 를 메모리로 읽어들여야 하는데요. 695 | 간단히 테스트해보면 알 수 있지만 awk 에서는 메모리가 딱 700M 만 사용되지 않습니다. 696 | 실제 데이터의 약 15 배 이상 사용되는 것을 볼 수 있는데요 697 | 만약에 레코드가 정렬되어 있다고 가정하면 다음과 같이 처리가 가능하기 때문에 698 | 메모리가 거의 사용되지 않습니다.

699 |
$ awk -F, '
700 |     { current = $0 }
701 |     previous != current { print }
702 |     { previous = current }
703 | ' mydata > mydata.uniq
704 | 
705 |

awk 는 database 가 아니기 때문에 따로 index 를 생성해서 사용하는 기능은 없습니다. 706 | 하지만 sort 명령을 이용해 미리 데이터를 정렬해놓은 다음 awk 명령을 707 | 사용하면 index 를 사용하는 효과를 볼 수 있습니다.

708 |

sort 명령도 실행 시에 메모리를 많이 사용합니다. 709 | 경우에 따라서 실제 데이터 크기의 10 배 이상 사용하는 것을 볼 수 있는데요 710 | 따라서 먼저 데이터를 작은 사이즈로 split 한 다음 개별 파일을 sort 하고 711 | 마지막으로 merge sort 를 해서 하나로 만들어야 합니다.

712 |
$ cat sort.sh 
713 | #!/bin/sh -e
714 | 
715 | dataFile=mydata_file              # sort 하고자 하는 데이터 파일명
716 | sortOptions="-t ',' -k3,3 -k2,2r" # FS 는 ',' 3번째 컬럼을 ASC 정렬하고 2번째 컬럼을 DESC 정렬
717 | splitSize=100M                    # 100M 크기로 split
718 | tmpFile=$(mktemp -p .)
719 | 
720 | split --additional-suffix=.split -C $splitSize "$dataFile"
721 | 
722 | for splitFile in *.split; do                         # sort 명령은 기본적으로
723 |     sort $sortOptions $splitFile > $tmpFile          # multicore 를 사용합니다.
724 |     mv -f $tmpFile $splitFile
725 | done
726 | 
727 | sort -m $sortOptions *.split > "$dataFile.sorted"    # merge sort
728 | 
729 | rm -f *.split $tmpFile
730 | 
731 | 732 | 733 |
734 | 735 | 736 |
737 |
738 |
739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 |
747 |
748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 764 | 765 | 766 | 767 | 768 | 774 | 775 | 776 | 777 | 778 | 779 | -------------------------------------------------------------------------------- /patch: -------------------------------------------------------------------------------- 1 | diff -ruN a/mpfr.c b/mpfr.c 2 | --- a/mpfr.c 2019-08-29 03:54:14.000000000 +0900 3 | +++ b/mpfr.c 2020-07-08 14:00:38.477382839 +0900 4 | @@ -293,6 +293,17 @@ 5 | else 6 | cp1 = cp; 7 | 8 | + /* 9 | + * Maybe "+" or "-" was the field. mpg_strtoui 10 | + * won't check for that and set errno, so we have 11 | + * to check manually. 12 | + */ 13 | + if (*cp1 == '\0') { 14 | + *cpend = save; 15 | + mpg_zero(n); 16 | + return false; 17 | + } 18 | + 19 | if (do_nondec) 20 | base = get_numbase(cp1, cpend - cp1, use_locale); 21 | 22 | diff -ruN a/node.c b/node.c 23 | --- a/node.c 2020-02-07 05:52:57.000000000 +0900 24 | +++ b/node.c 2020-07-08 14:00:35.245287010 +0900 25 | @@ -315,11 +315,13 @@ 26 | r = mpg_integer(); 27 | mpz_set(r->mpg_i, n->mpg_i); 28 | r->flags = n->flags; 29 | + r->strndmode = MPFR_round_mode; 30 | } else if ((n->flags & MPFN) != 0) { 31 | r = mpg_float(); 32 | int tval = mpfr_set(r->mpg_numbr, n->mpg_numbr, ROUND_MODE); 33 | IEEE_FMT(r->mpg_numbr, tval); 34 | r->flags = n->flags; 35 | + r->strndmode = MPFR_round_mode; 36 | } else { 37 | #endif 38 | getnode(r); 39 | @@ -342,6 +344,7 @@ 40 | emalloc(r->stptr, char *, n->stlen + 1, "r_dupnode"); 41 | memcpy(r->stptr, n->stptr, n->stlen); 42 | r->stptr[n->stlen] = '\0'; 43 | + r->stlen = n->stlen; 44 | if ((n->flags & WSTRCUR) != 0) { 45 | r->wstlen = n->wstlen; 46 | emalloc(r->wstptr, wchar_t *, sizeof(wchar_t) * (n->wstlen + 1), "r_dupnode"); 47 | -------------------------------------------------------------------------------- /실수값표현법.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mug896/awk-script/d6e6ba1e6bf99c984286a56ebfcfbe3ef712e998/실수값표현법.doc --------------------------------------------------------------------------------