├── .gitignore ├── README.md └── content ├── README.md ├── algorithm ├── monotone-stack.md └── 算法训练营.md ├── c ├── 3rd-libs │ ├── argparse.org │ ├── cjson.org │ ├── cmockery.org │ ├── collect-c.org │ ├── docopt.org │ ├── glibc.org │ ├── ilog3.org │ ├── libcurl.org │ ├── libev-manual.org │ ├── libev.org │ ├── libevent-code-analysis.org │ ├── libevent.org │ ├── libuv.org │ ├── thpool.org │ └── zlog.org ├── books │ ├── apue-notes.org │ ├── high-performance-linux-server-programming.org │ ├── points-on-c.org │ └── unp-notes.org ├── c-lang.org ├── c11.org ├── c99.org ├── memcached.org ├── tinyhttpd-analysis.org └── tools │ ├── ccls.org │ └── cpplint.org ├── centos └── centos.org ├── clang └── clang-format.org ├── cmake ├── cmake-build-system.org ├── cmake-language.org ├── cmake-practics.org ├── commands │ ├── find_package.org │ └── install.org └── effective-modern-cmake.org ├── code-analysis ├── coroutine-status.lua ├── lighttpd-analysis.org ├── linux-kernel-analysis.org ├── shadowsocks-code-analysis.org ├── skynet-analysis.org └── wget-analysis.org ├── cpp ├── 3rd-libs │ ├── asio.org │ ├── boost │ │ ├── boost.org │ │ └── program_options.org │ ├── gflags.org │ ├── glog.org │ ├── gtest.org │ ├── hiredis.org │ ├── log4cplus.org │ ├── rapidjson.org │ └── thrift.org └── cpp-summary.org ├── django ├── django-practice.org └── mysite.org ├── elisp ├── GNU_Emacs_Lisp_Reference_Manual.org ├── an-introduction-to-programming-in-emacs-lisp.org └── elisp-sumary.org ├── emacs ├── common-ide.org ├── emacs-build.org ├── emacs-complete-analysis.org ├── emacs-config-file-organization.org ├── emacs-font-setting.org ├── emacs-spell-check.org ├── emacs-startup-process.org ├── emacs-under-windows.org ├── golang-ide.org ├── json-ide.org ├── language-server-protocol.org ├── lua-ide.org ├── modes │ ├── all-the-icons.org │ ├── auth-source-pass.org │ ├── auto-complete-manual.org │ ├── cc-mode.org │ ├── company-lsp.org │ ├── company-lua.org │ ├── company-mode.org │ ├── company-quickhelp.org │ ├── company-statistics.org │ ├── cquery-mode.org │ ├── dap-mode.org │ ├── diminish.org │ ├── dired-mode.org │ ├── ediff-mode.org │ ├── eldoc.org │ ├── emacs-ccls.org │ ├── emmy-lua-ls-all.org │ ├── exec-path-from-shell.org │ ├── flycheck-mode.org │ ├── format-all.org │ ├── gnu-global-manual.org │ ├── gnu-global.org │ ├── go-eldoc.org │ ├── go-gen-test.org │ ├── go-guru.org │ ├── go-mode.org │ ├── go-playgound.org │ ├── google-this.org │ ├── gotest.org │ ├── header2.org │ ├── helm-core.org │ ├── helm-dash.org │ ├── helm-descbinds.org │ ├── helm-gtags.org │ ├── helm-locate.org │ ├── helm-projectile.org │ ├── helm-system-packages.org │ ├── helm-tramp.org │ ├── helm-xref.org │ ├── highlight-indents-guides.org │ ├── imenu.org │ ├── irony-mode.org │ ├── ivy.org │ ├── livedown.org │ ├── lsp-java.org │ ├── lsp-mode.org │ ├── lsp-pyright.org │ ├── lsp-python-ms.org │ ├── lsp-ui.org │ ├── lua-lsp.org │ ├── lua-mode.org │ ├── magit.org │ ├── markdown-mode.org │ ├── markdown-toc.org │ ├── org-mode-manual.org │ ├── org-mode.org │ ├── org2blog-mode.org │ ├── pangu-spacing.org │ ├── persp-projectile.org │ ├── perspective.org │ ├── projectile-mode.org │ ├── pyls.org │ ├── python-mode.org │ ├── revive-mode.org │ ├── rtags.org │ ├── sqlformat.org │ ├── sqlup-mode.org │ ├── tramp-mode.org │ ├── use-package-manual.org │ ├── vc-msg.org │ ├── vlf.org │ ├── web-mode.org │ ├── yasnippet-mode.org │ └── zeal-at-point.org ├── nginx-ide.org ├── offline-doc.org ├── projectile.html ├── python-ide.org ├── sql-IDE.org ├── yaml-ide.org └── yapfify.org ├── english └── 英语语法新思维.org ├── finance └── 12天理财课.org ├── first-aid.org ├── gRPC └── gRPC_practices.org ├── gdb └── gdb_practices.org ├── gfw ├── gcp.org ├── shadowsocks.org ├── sshuttle.org ├── use-dnsmasq-pdnds-openwrt-to-pass-GFW.org ├── v2ray.org ├── vpn-practices.org └── vps.org ├── git ├── git-branch-model.org ├── git-pro-v2.org ├── git.org ├── github.org ├── gitlab.org ├── hubot.org └── pro-git-note.org ├── golang ├── 3rd-lib │ ├── beego.org │ ├── collections.org │ ├── deepcopy.org │ ├── diff.org │ ├── gin.org │ ├── go-redis.org │ ├── gocache.org │ ├── gocheck.org │ ├── gomock.org │ ├── logrus.org │ ├── monkey.org │ ├── mysql-driver.org │ ├── mysql.org │ ├── ristretto.org │ ├── slf4go.org │ ├── state-of-cache-in-go.org │ └── zap.org ├── books │ └── the-way-to-go.org ├── deepcopy.org ├── go-cmd.org ├── golang-faq.org ├── golang-std-lib.org ├── golang-summary.org ├── golang-test-frame.org ├── golang-tutor.org ├── golang.org ├── lang │ ├── channel.org │ ├── context.org │ ├── defer.org │ ├── gc.org │ ├── gopath.org │ └── module.org ├── std-lib │ ├── errors.org │ ├── fmt.org │ ├── http.org │ ├── json.org │ ├── log.org │ ├── rand.org │ ├── reflect.org │ ├── stconv.org │ ├── strings.org │ ├── sync.org │ ├── testing.org │ └── time.org └── tools │ ├── dlv.org │ ├── errcheck.org │ ├── gb.org │ ├── go-fix.org │ ├── go-language-server.org │ ├── go-proto-validators.org │ ├── go-vet.org │ ├── gocode.org │ ├── godef.org │ ├── goimports.org │ ├── golint.org │ ├── gopls.org │ ├── goreporter.org │ ├── gotests.org │ ├── govendor.org │ ├── guru.org │ ├── protoc-gen-validate.org │ ├── staticcheck.org │ └── unconvert.org ├── hardware └── kinesis-advantage.org ├── img ├── centos-practices │ └── net-tools-vs-iproute2.png ├── django │ ├── hello.png │ ├── runserver-1.png │ ├── runserver-hello.png │ └── web-1.png ├── latex-practices │ ├── change-default-repository-1.png │ ├── change-default-repository-2.png │ ├── latex-workflow.png │ └── workflow-compare.jpg ├── robotframework-practices │ └── start_ride.png ├── se-beauty │ └── se-map.png ├── tinyhttpd-analysis │ ├── cgi-test-sh.png │ ├── display-abnormal.png │ ├── display-normal.png │ ├── fork-pipe.png │ ├── http-get-request.png │ ├── http-post-request.png │ ├── http-request-format.png │ ├── http-response-format.png │ ├── http-response.png │ ├── index.png │ └── tinyhttpd-work-flow.png ├── ubuntu-practices │ ├── input-config.png │ └── keyboard-layout.png └── vpn-practices │ ├── L2TP.jpg │ └── Site-to-site-pptp-example.jpg ├── java └── java.org ├── journey ├── 20180517-dubai.org ├── 20180616-guangdong-valley.org └── 2021-05-01-shanxi.md ├── js ├── npm.org └── yarn.org ├── latex └── latex_practices.org ├── linux ├── albert.html ├── albert.org ├── coturn.org ├── linux-cmd-tools.org ├── linux-high-performance-coding.org ├── pgformatter.org ├── powerline-shell.org ├── powerline.org ├── tools │ ├── awk.org │ ├── cloc.org │ ├── crontab.org │ ├── cut.org │ ├── date.html │ ├── date.org │ ├── echo.org │ ├── find.org │ ├── fio.org │ ├── grep.org │ ├── head-tail.org │ ├── ifconfig.org │ ├── iostat.org │ ├── less.org │ ├── locate.org │ ├── logrotate.org │ ├── ls.org │ ├── nc.org │ ├── netstat.org │ ├── number.txt │ ├── route.org │ ├── sed.org │ ├── sort.org │ ├── source.org │ ├── split.org │ ├── tcpdump.org │ ├── top.org │ ├── tree.org │ ├── uniq.org │ ├── wc.org │ ├── xargs.org │ └── zip.org └── wine.org ├── lua ├── 3rd-lib │ ├── lua-cjson.org │ ├── lua-snowflake.org │ ├── penlight.org │ ├── serpent.org │ └── version.org ├── coroutine.org ├── lua-source-code.org ├── lua-summary.org ├── lua-table-analysis.org ├── tools │ ├── formatter.org │ ├── ldoc-manual.org │ ├── ldoc.org │ ├── lua-code-formatter.org │ ├── luacheck.org │ ├── luacov.org │ ├── luarocks.org │ └── luaunit.org └── zerobrane-studio.org ├── macos ├── IINA.org ├── dash.org ├── finder.org ├── homebrew.org ├── item2.org ├── macos.org ├── ntfstool.org └── proxifier.org ├── make ├── gnu-make-manual │ ├── apppendix-a-quick-reference.html │ ├── apppendix-a-quick-reference.org │ └── gnu-make.org └── how_to_write_makefile_note.org ├── markdown └── markdown.org ├── message-queue └── 消息队列高手课.org ├── mysql ├── manual │ └── 13_SQL Statement Syntax.org ├── mysql-fifth-edition-notes.org ├── mysql-manual.org ├── mysql-practices.org ├── mysql5.5从零开始学习.org ├── mysql实战45讲.md └── sysbench.org ├── network ├── endianness.org ├── network.org ├── pracitcal-packet-analysis.org ├── tcp-ip-illustrated-v1.org └── wireshark网络分析就这么简单.org ├── nginx ├── limit_req.org ├── nginx-code-analysis.org ├── nginx-practices.org ├── ngx-optimization.org ├── upload-module.org └── 深入理解nginx模块开发与架构解析.org ├── openresty ├── lua-nginx-module.org ├── lua-resty-mysql.org ├── lua-resty-redis.org ├── openresty-summary.org ├── openresty-systemtap-toolkit.org └── resty-cli.org ├── other ├── fcitx_practices.org ├── mobile_game_server_analysis.org ├── panghuli-blog-tune.org ├── startup_tools.org └── wamp_practices.org ├── package-manager ├── snap.org └── yum.org ├── photography ├── iphone-photo.org ├── 数码摄影基础.org ├── 数码摄影术语.org ├── 构图之美.org └── 纽约摄影学院摄影教材.org ├── photoshop └── photoshop cc 数码摄影后期处理完全自学手册.org ├── protobuf ├── cpp-tutorial.org ├── language-guide-proto2.org ├── language-guide-proto3.org ├── python-tutorial.org └── style.org ├── python ├── 3rd-libs │ ├── concurrentloghandler.org │ ├── flask.org │ ├── mysql-connector.org │ ├── openpyxl.org │ ├── redis.org │ └── tornado.org ├── books │ ├── learning-python.org │ ├── python-for-data-analysis.org │ └── python核心编程笔记.org ├── package-manage.org ├── python-summary.org ├── std-libs │ └── logging.org ├── tools │ ├── black.org │ ├── httpbin.org │ ├── pip.org │ ├── pipenv.org │ └── yapf.org └── 听说你会python.org ├── reading-note ├── 10x程序员工作法.org ├── c++-primer-notes.org ├── cpp-concurrency-in-action.org ├── cpp-concurrency │ ├── Makefile │ └── hello-concurrency.cc ├── inside-c++-object-model-note.org ├── learn-more-study-less.org ├── nginx核心知识100讲.org ├── principles.org ├── rich-dad.org ├── the-annotated-stl-sources.org ├── 万历十五年.org ├── 从0开始学架构.org ├── 影响力.org ├── 淘宝技术这十年.org ├── 自控力.org └── 软件工程之美.org ├── redis ├── redis-architecture.org ├── redis-guide.org ├── redis-in-action.org ├── redis-sentinel-documentation.org ├── redis.org └── the-design-and-implementation-of-redis.org ├── renovate_house ├── chazuo.md ├── guide.md └── smart-home.md ├── ruby └── ruby基础教程笔记.org ├── schedule ├── 2016-2017.org └── 2018-2019.org ├── scrapy ├── 0_guide.org ├── anti-crawl.org ├── architecture.org ├── command-tools.org ├── deploy.org ├── distribute.org ├── dynamic-web.org ├── items.org ├── middleware.org ├── overview.org ├── pipelines.org ├── requests.org ├── selectors.org ├── settings.org ├── simple-project.org ├── simple-spider.org └── spiders.org ├── shell ├── bash-language-server.org ├── shell-summary.org └── shell_tips.org ├── software-engineering ├── aliyun.org ├── aws.org ├── concurrency-concepts.org ├── config-file.org ├── continuous-integration-practices.org ├── database.org ├── debug │ ├── DTrace.org │ ├── debug-with-gdb.org │ ├── factorial.c │ ├── flame-graph.org │ ├── log-system.org │ ├── memory.c │ ├── valgrind-practices.org │ ├── 软件调试实战.org │ └── 软件调试的艺术.org ├── doxygen.org ├── from-program-language-to-se.org ├── graphviz.org ├── language │ ├── how-to-learn-program-language.org │ ├── oop.org │ └── 关于程序语言的思考.org ├── lock │ └── use-lock.org ├── monitor │ └── falcon-practices.org ├── oauth.org ├── opengrok.org ├── program-language.org ├── reactor-proactor.org ├── restful-api-best-practices.org ├── sphinx.org ├── synchronous-asynchronous-blocking-nonblocking.html ├── synchronous-asynchronous-blocking-nonblocking.org ├── test │ ├── robot-framework-practices.org │ ├── robot-framework-user-guide.org │ └── traffic-replay.org ├── trace │ ├── goole-dapper.org │ ├── trace-overview.html │ ├── trace-overview.org │ └── zipkin.org ├── 原码-反码-补码理解.org └── 如何设计一个秒杀系统.org ├── softwares └── wrk.org ├── thinking └── 深度思维.org ├── traval ├── shenzhen.org ├── 出行准备.org ├── 大连.org ├── 杭州.org ├── 贵阳-重庆-成都.org └── 青海环线.org ├── ubuntu ├── fingerprint.org ├── gnome.org ├── mint-practices.org ├── software │ ├── asbru.org │ ├── shutter.org │ └── zssh.org ├── ubuntu-mount-ntfs-permission.org └── ubuntu-softwares.org ├── uml └── plantuml.org └── xpath ├── location-path.org └── node-tree.org /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # notebook 2 | 平时开发日记 3 | -------------------------------------------------------------------------------- /content/README.md: -------------------------------------------------------------------------------- 1 | 2 | **Table of Contents** 3 | 4 | - [概述](#概述) 5 | 6 | 7 | # 概述 8 | 本仓库是一些开发日志。 9 | -------------------------------------------------------------------------------- /content/algorithm/monotone-stack.md: -------------------------------------------------------------------------------- 1 | # 单调栈 2 | 3 | 单调栈(monotone-stack)是指栈内元素(栈底到栈顶)都是(严格)单调递增或者单调递减的。 4 | 5 | 如果有新的元素入栈,栈调整过程中 *会将所有破坏单调性的栈顶元素出栈,并且出栈的元素不会再次入栈* 。 6 | 7 | 由于每个元素只有一次入栈和出栈的操作,所以单调栈的维护时间复杂度是 O(n) 。 8 | 9 | 单调栈性质: 10 | 11 | 1. 单调栈里的元素具有单调性。 12 | 2. 递增(减)栈中可以找到元素左右两侧比自身小(大)的第一个元素。 13 | 14 | 我们主要使用第二条性质,该性质主要体现在栈调整过程中,下面以递增栈为例(假设所有元素都是唯一),当新元素入栈。 15 | 16 | + 对于将要出栈元素来说: 17 | + 新元素是右侧第一个比它小的元素。 18 | + 栈顶第二个元素是左侧第一个比它小的元素。 19 | + 栈底元素是递增趋势下,最后一个比它小的元素,也就是左侧递增的边界。 20 | + 对于新元素来说: 21 | + 栈顶元素是它左侧第一个比它大的数字。 22 | + 等待所有破坏递增顺序的元素出栈后,栈顶元素是左侧第一个比自身小的元素。 23 | 24 | ## 应用 25 | 26 | + [739 每日温度](https://leetcode-cn.com/problems/daily-temperatures/) 27 | 28 | 解法: 29 | 30 | + [496. 下一个更大元素 I](https://leetcode-cn.com/problems/next-greater-element-i/) 31 | 32 | + [503 下一个更大元素 II](https://leetcode-cn.com/problems/next-greater-element-ii/) 33 | 34 | + [84 柱状图形中最大的矩形](https://leetcode-cn.com/problems/largest-rectangle-in-histogram/) 35 | 36 | 解法: 37 | 38 | + [503 下一个更大元素 II](https://leetcode-cn.com/problems/maximal-rectangle/) 39 | 40 | + [42 接雨水](https://leetcode-cn.com/problems/trapping-rain-water/) 41 | 42 | 解法: 43 | -------------------------------------------------------------------------------- /content/c/3rd-libs/argparse.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: argparse 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/cofyc/argparse][argparse]] 8 | -------------------------------------------------------------------------------- /content/c/3rd-libs/cjson.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: cjson 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/DaveGamble/cJSON][cjson]] 是用 ANSI C 编写的超轻量级 JSON 解析器。 8 | 9 | * 编译 10 | 使用 cmake 进行编译。 11 | #+BEGIN_SRC sh 12 | mkdir build 13 | cd build 14 | cmake .. 15 | make 16 | #+END_SRC 17 | 18 | 可以传递给 CMake 的不同选项列表来更改构建过程。使用 =On and Off= 打开和关闭: 19 | 20 | * 使用 21 | 22 | ** 数据结构 23 | cJSON 使用 cJSON 结构数据类型表示 JSON 数据: 24 | #+BEGIN_SRC c 25 | /* The cJSON structure: */ 26 | typedef struct cJSON 27 | { 28 | struct cJSON *next; 29 | struct cJSON *prev; 30 | struct cJSON *child; 31 | int type; 32 | char *valuestring; 33 | /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */ 34 | int valueint; 35 | double valuedouble; 36 | char *string; 37 | } cJSON; 38 | #+END_SRC 39 | 40 | 此类型的项表示 JSON 值。类型作为位标志存储在 =type= 中(这意味着只通过比较类型的值找不到类型)。要检查项目的类型,请使用相应的 =cJSON_Is ...= 函数。它执行 =NULL= 检查,然后进行类型检查,如果项目属于此类型,则返回布尔值。 41 | 42 | 对于每个值类型,都有一个 =cJSON_Create ...= 函数,可用于创建该类型的项目。所有这些都将分配一个 cJSON 结构,以后可以使用 cJSON_Delete 删除它。请注意,必须在某个时候删除它们,否则会出现内存泄漏。要点:如果已将项添加到数组或对象中,则不得使用 cJSON_Delete 将其删除。将它添加到数组或对象会转移其所有权,以便在该数组或对象删除时,其中的项也会删除。 43 | 44 | ** 解析 json 45 | 46 | ** 打印 json 47 | -------------------------------------------------------------------------------- /content/c/3rd-libs/collect-c.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: collect-c 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | -------------------------------------------------------------------------------- /content/c/3rd-libs/docopt.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: docopt 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/docopt/docopt.c][docopt]] 8 | -------------------------------------------------------------------------------- /content/c/3rd-libs/glibc.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: glibc 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 8 | * 安装 9 | 10 | * 使用 11 | 12 | ** stdio.h 13 | ** stdlib.h 14 | ** inttypes.h 15 | ** ctype.h 16 | ** stddef.h 17 | 头文件定义了各种变量类型和宏 18 | ** string.h 19 | ** time.h 20 | ** math.h 21 | -------------------------------------------------------------------------------- /content/c/3rd-libs/ilog3.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: ilog3 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/calvinwilliams/iLOG3][ilog3]] 8 | -------------------------------------------------------------------------------- /content/c/3rd-libs/libev.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: libev 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[http://software.schmorp.de/pkg/libev.html][libev]] 是一个功能齐全且高性能的事件循环,在 libevent 之后被松散地建模,但没有它的限制和 bug。 8 | 9 | Blurb 功能包括 child/pid 观察者,基于 wallclock(绝对)时间的定期计时器(除了使用相对超时的计时器),以及 epoll/kqueue/event ports/inotify/eventfd/signalfd 支持,快速计时器管理,时间跳转检测和纠正,以及易用性。 10 | 11 | 它可以使用其仿真 API 作为 libevent 的替代品,或直接嵌入到您的程序中,而无需复杂的配置支持。还提供功能齐全且记录完备的 perl 界面。 12 | 13 | libev 的特有的一些功能: 14 | + 广泛而详细,可读的文档。 15 | + 完全支持 fork,可以通过各种方式检测 fork,并自动重新支持不支持 fork 的内核机制。 16 | + 高度优化的 select,poll,epoll,kqueue 和 event ports 后端。 17 | + 文件系统对象(路径)观察(通过可选的 linux inotify 支持)。 18 | + 基于 wallclock 的时间(使用绝对时间,类似 cron)。 19 | + 相对定时器/超时(处理时间跳跃)。 20 | + 多个事件循环之间的快速线程内通信(可选的快速 linux eventfd 后端)。 21 | + 非常容易嵌入(完全记录,没有依赖,支持 autoconf)。 22 | + 非常小的代码库,没有臃肿的库,简单的代码。 23 | + 通过插入事件循环,集成其他事件循环,集成其他事件循环用户,可以完全扩展。 24 | + 内存使用非常少(观察者小,事件循环数据小)。 25 | + 可选的 允许方法和函数回调 C++ 接口,无需额外的内存或运行时开销。 26 | + 具有类似特性的可选 Perl 接口(能够在 libev 上运行 Glib / Gtk2)。 27 | + 支持第三方提供的其他语言(多个 C++ 接口,D,Ruby,Python)。 28 | 29 | 使用 libev 的程序示例:EV perl 模块,node.js,auditd,rxvt-unicode,gvpe(GNU 虚拟专用以太网),Deliantra MMORPG 服务器,Rubinius(下一代 Ruby VM),Ebb Web 服务器, Rev 事件工具包。 30 | 31 | 32 | 33 | * 配置 34 | 35 | ** event 36 | 37 | ** event watcher 38 | 39 | ** event loop 40 | 41 | * 使用 42 | 43 | [[http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod][手册]] 44 | -------------------------------------------------------------------------------- /content/c/3rd-libs/libevent.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: libevent 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://libevent.org/][libevent]] API 提供了一种机制,用于在文件描述符上发生特定事件或达到超时后执行回调函数。此外,libevent 还支持由于信号或定期超时引起的回调。 8 | 9 | libevent 旨在替换事件驱动的网络服务器中的事件循环。应用程序只需调用 event_dispatch(),然后动态添加或删除事件,而无需更改事件循环。 10 | 11 | 目前,libevent 支持 /dev/poll,kqueue(2),event ports,POSIX select(2),Windows select(),poll(2)和 epoll(4)。内部事件机制完全独立于公开的事件 API,而 libevent 的简单更新可以提供新功能,而无需重新设计应用程序。因此,Libevent 允许可移植的应用程序开发,并提供操作系统上可用的最可扩展的事件通知机制。 Libevent 还可用于多线程应用程序,可以通过隔离每个 event_base 以便只有一个线程访问它,或者通过锁定访问单个共享 event_base。 Libevent 应该在 Linux,*BSD,Mac OS X,Solaris,Windows 等上编译。 12 | 13 | Libevent 还为缓冲网络 IO 提供了一个复杂的框架,支持套接字,过滤器,速率限制,SSL,零拷贝文件传输和 IOCP。 Libevent 包括对几种有用协议的支持,包括 DNS,HTTP 和最小的 RPC 框架。 14 | 15 | 16 | * 安装 17 | 18 | * 文档 19 | #+BEGIN_SRC sh 20 | doxygen Doxyfile 21 | #+END_SRC 22 | 然后打开浏览器 =/doxygen/html/index.html= ,就能看到 doxygen 生成的文档 23 | 24 | * 使用 25 | 参见 [[https://www.jianguoyun.com/p/DRJ5LBAQvdqoBxjQ0OgB][libevent 参考手册]] ,该文档是官网推荐手册的中文版。 26 | 27 | 代码参见 https://github.com/phenix3443/test/tree/master/c/libevent 28 | -------------------------------------------------------------------------------- /content/c/3rd-libs/libuv.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: libuv 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[http://docs.libuv.org/en/v1.x/][libuv]] 是一个多平台支持库,专注于异步I/O。它主要是为Node.js开发的,但它也被Luvit,Julia,pyuv和其他人使用。 8 | 9 | * 特性 10 | + 由epoll,kqueue,IOCP,事件端口支持的全功能事件循环。 11 | + 异步TCP和UDP套接字。 12 | + 异步DNS解析。 13 | + 异步文件和文件系统操作。 14 | + 文件系统事件 15 | + ANSI转义码控制TTY 16 | + IPC与套接字共享,使用Unix域套接字或命名管道(Windows) 17 | + 子进程 18 | + 线程池 19 | + 信号处理 20 | + 高分辨率时钟 21 | + 线程和同步原语 22 | -------------------------------------------------------------------------------- /content/c/3rd-libs/thpool.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: thpool 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/Pithikos/C-Thread-Pool][thpool]] 是一个小而高级的线程池实现。特性: 8 | + 符合 ANCI C 和 POSIX 标准 9 | + 暂停/恢复/等待 10 | + 简单易于理解的 API 11 | + 经过充分测试 12 | + MIT 许可 13 | 14 | * 安装 15 | 16 | * 使用 17 | 18 | * faq 19 | 20 | ** 为什么 pthread_exit()不用于退出线程? 21 | thread_do 曾经使用过 pthread_exit(),但这使得难于测试内存泄漏。因为调用 pthread_exit()时,pthread 并没有释放所有内存 (可能是为了将来的线程或错误地认为应用程序正在终止)。由于这些原因只是简单返回。 22 | 23 | 有趣的是,使用 pthread_exit()会导致分配更多的内存。 24 | 25 | ** 为什么在调用 thpool_destroy()之后使用 sleep()? 26 | 这仅在测试中需要。如果你调用 thpool_destroy 后立即退出,程序可能在所有线程解除分配之前退出。以这种方式,不可能检查内存泄漏。 27 | 28 | 在生产中不必担心这个,因为如果在销毁池之后立即调用 exit,那么线程将被操作系统释放。如果在程序中间销毁池也无关紧要,因为程序不会立即退出,因此线程将有足够的时间来终止。 29 | 30 | ** 为什么 wait()使用所有的 CPU? 31 | 注意:截至 2015 年 12 月 11 日,wait()不再使用轮询。而是使用条件变量,因此理论上不应该有任何 CPU 开销。 32 | 33 | 通常,wait()会在调用时将 CPU 使用率提高到满。这是正常的,只要它不会持续超过 1 秒。发生这种情况的原因是 wait()经历了轮询的各个阶段(所谓的智能轮询)。 34 | + 最初轮询之间没有间隔,因此 100%使用 CPU。 35 | + 之后,轮询间隔呈指数级增长。 36 | + 最后在 x 秒之后,如果仍有工作,则轮询会回落到很大的间隔。 37 | 38 | wait()以这种方式工作的原因是,有时它用于想要等待一些计算完成的场景。因此,假设计算需要很长时间,那么我们不希望过于频繁地进行轮询。在计算简单的情况下,我们仍然希望快速轮询。为了解决这两个问题,这种看似尴尬的行为就出现了。 39 | -------------------------------------------------------------------------------- /content/c/3rd-libs/zlog.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: zlog 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/HardySimpson/zlog][zlog]] 是一个高可靠性、高性能、线程安全、灵活、概念清晰的纯 C 日志函数库。 8 | 9 | * 安装 10 | #+BEGIN_SRC sh 11 | make && make install 12 | #+END_SRC 13 | 14 | * 使用 15 | 参见 [[http://hardysimpson.github.io/zlog/UsersGuide-CN.html][使用手册]] 16 | -------------------------------------------------------------------------------- /content/c/books/unp-notes.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 《Unix 网络编程》笔记 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | #+STARTUP: overview 6 | #+OPTIONS: author:nil date:nil creator:nil timestamp:nil validate:nil num:nil 7 | 8 | 9 | L11:线程函数遇到错误时并不设置标准 Unix 的 error 变量,而是把 errno 的值作为函数返回值返回调用者。 10 | L13: INADDR_ANY 的使用。 11 | L14:必须小心使用 sprintf、gets、strcat、strcpy,使用 snprintf、fgets、strlcat、strlcpy 替代。 12 | L17:网络应用绕过传输层直接使用 IPv4 和 IPv6 是可能的,这就是所谓的原始套接字。 13 | L25:套接字 API 对套接字地址结构的长度使用了 socklen_t 数据类型。不使用 size_t 是为了避免 32 和 64 位系统转换。 14 | 15 | L26:SCTP 与 TCP 类似之处在于它也是一个可靠的传输控制协议,但是他还提供消息边界、传输级别多宿支持以及将头端阻塞减少到最小的一种方法。 16 | L30:TCP 含有用于动态估算客户和服务器之间的往返时间(RTT)的算法,以便它知道等待一个确认需要多少时间。 17 | L31:UDP 可以是全双工的。 18 | L32:SYN 占据一个字节的序列号空间。 19 | L36:捎带 ack 通常在服务器处理请求并产生应答的时间少于 200ms 时产生。 20 | L37: 21 | MSL 最长分节生命期,是任何 IP 数据包能够在因特网上存活的最长时间。 22 | TIME_WAIT 状态有两个存在的理由:1)可靠地实现 TCP 全双工连接的终止。2)允许老的重复分解在网络中消逝。 23 | L44:在服务器主机上区分监听套接字和已连接套接字。已连接套接字使用与监听套接字相同的本地端口。还要注意在多宿主服务器主机上,连接一旦建立,已连接套接字的本地地址随即填入。 24 | L46:影响 IP 数据报大小的限制: 25 | 26 | L56:套接字地址结构会在内核与进程间传递。 27 | L57:所有的套接字地址结构大小至少都是 16 字节。 28 | L58:32 位 IPv4 地址存在两种不同的访问方法。 29 | L59:从应用程序开发人员的观点看,这些通用套接字地址结构的唯一用途就是对只想特定于协议的套接字地址结构的指针执行强制类型转换。 30 | L62:sock api 中传递值结果参数的作用。 31 | -------------------------------------------------------------------------------- /content/c/c11.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: c11 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 2011 年发布了新标准:ISO/IEC 9899:2011 8 | 9 | 10 | * gcc 11 | #+BEGIN_SRC sh 12 | -std=c11 13 | #+END_SRC 14 | -------------------------------------------------------------------------------- /content/c/memcached.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | #+title:memcached 3 | -------------------------------------------------------------------------------- /content/c/tools/cpplint.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: cpplint 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | Cpplint 是一个命令行工具,用于根据 [[http://google.github.io/styleguide/cppguide.html][Google C++ 样式指南]] 检查 C/C++ 文件的样式问题。 8 | 9 | * 安装 10 | 11 | * 配置 12 | 13 | * 使用 14 | -------------------------------------------------------------------------------- /content/centos/centos.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: centos使用 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | #+STARTUP: overview 6 | 7 | * 概述 8 | 9 | * tips 10 | 1. 修改文件编码,解决中文乱码问题 11 | #+BEGIN_SRC sh 12 | localectl set-locale LANG=zh_CN.UTF8 13 | #+END_SRC 14 | 然后重启机器。 15 | -------------------------------------------------------------------------------- /content/clang/clang-format.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: clang-format 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://clang.llvm.org/docs/ClangFormat.html][ClangFormat]] 描述了一组构建在 LibFormat 之上的工具,可用于格式化 C/C++/Java/JavaScript/Objective-C/Protobuf/C#代码。它既是独立工具,也可与编辑器集成。 8 | 9 | * 安装 10 | ** apt 11 | #+BEGIN_SRC sh 12 | sudo apt install clang-format 13 | #+END_SRC 14 | ** brew 15 | #+BEGIN_SRC sh 16 | brew install clang-format 17 | #+END_SRC 18 | ** yum 19 | #+BEGIN_SRC sh 20 | 21 | #+END_SRC 22 | 23 | * 使用 24 | #+BEGIN_SRC sh :exports both :results output scalar 25 | clang-format --help 26 | #+END_SRC 27 | 常用命令行选项: 28 | + ~-style=~ 编码格式,目前支持 LLVM, Google, Chromium, Mozilla, WebKit。使用 ~-style=~ 从当前源文件的所有父目录中查找 =.clang-format= 文件,并加载代码风格配置。使用 ~-style="{key:value,...}"~ 来设置特定参数,例如: ~-style="{BasedOnStyle: llvm, IndentWidth: 8}"~ 29 | + ~-fallback-style=~ 在使用 ~-style=file~ 调用 clang-format 但是找不到对应使用的 ~.clang-format~ 文件的情况下,该选项指定回退的预定义样式名字。 30 | + ~-i~ 原地替换 file。 31 | + ~-dump-config~ 将配置导出到标准输出。可以配合 =-style= 导出默认配置选项。例如: 32 | #+BEGIN_SRC sh 33 | clang-foramt -style=llvm --dump-config >_clang-format 34 | #+END_SRC 35 | 36 | 当所需的代码格式样式与可用选项不同时,可以使用 ~-style="{key:value,...}"~ 选项,将样式配置放在项目中的 =.clang_format= 或 =_clang-format= 中来自定义样式。使用 ~clang-fromat -style=file~ 格式化: 37 | 38 | #+BEGIN_SRC sh 39 | clang-format -i -style=google test.cc 40 | #+END_SRC 41 | 42 | 所有样式选项参见 [[https://clang.llvm.org/docs/ClangFormatStyleOptions.html][Clang-format Style Options]] . 43 | -------------------------------------------------------------------------------- /content/cmake/cmake-practics.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | #+title:cmake practice 3 | #+author:phenix3443 4 | #+email:phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 主要讲述使用cmake编译的项目布局应该如何组织。 8 | 9 | * 项目结构 10 | 遵循模块话的项目结构,工程目录如下: 11 | #+BEGIN_EXAMPLE 12 | project/ 13 | ├── CMakeLists.txt 14 | ├── src 15 | │ ├── CMakeLists.txt 16 | │ ├── main 17 | │ │ ├── CMakeLists.txt 18 | │ │ └── main.cpp 19 | │ └── module_1 20 | │ ├── CMakeLists.txt 21 | │ ├── person.cpp 22 | │ └── person.hpp 23 | └── test 24 | └── CMakeLists.txt 25 | #+END_EXAMPLE 26 | 27 | ** src 28 | 源代码目录,子目录按照项目模块进行组织,各模块都有各自的CMake文件,用于单独编译。 29 | 30 | ** test 31 | 存放测试代码,子目录也是按照模块进行组织。 32 | 33 | ** build 34 | 为了保证源代码目录下整洁,编译单独在build目录下进行。 35 | 36 | * 各cmake文件详解 37 | 38 | 参考 [[https://github.com/phenix3443/test/tree/master/cmake/cmake_dir][github代码]] 中cmake 文件中的注释。 39 | -------------------------------------------------------------------------------- /content/code-analysis/coroutine-status.lua: -------------------------------------------------------------------------------- 1 | -- [[file:lua-analysis.org::*%E5%8D%8F%E5%90%8C%E7%A8%8B%E5%BA%8F%E7%8A%B6%E6%80%81%E6%B5%8B%E8%AF%95][协同程序状态测试:1]] 2 | local co 3 | co = coroutine.create( function() 4 | print("before yield status: " .. coroutine.status(co)) 5 | coroutine.yield() 6 | print("after yield: " .. coroutine.status(co)) 7 | end) 8 | print("before start status: ",coroutine.status(co)) 9 | coroutine.resume(co) 10 | print("after yeild status: ",coroutine.status(co)) 11 | coroutine.resume(co) 12 | print("after end status: ",coroutine.status(co)) 13 | -- 协同程序状态测试:1 ends here 14 | -------------------------------------------------------------------------------- /content/code-analysis/lighttpd-analysis.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | -------------------------------------------------------------------------------- /content/code-analysis/linux-kernel-analysis.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | #+title: linux kernel analysis 3 | * 序 4 | 本章中涉及到的书籍和文章: 5 | + 《Linux 内核源码分析》 6 | + 《莱昂氏 Unix 源代码分析》 7 | + 《操作系统:设计与实现》 8 | + 《Linux--a Free unix-386 Kernel》 9 | + 《系统软件:系统编程导论》 10 | + 《UNIX 操作系统设计》 11 | + 《80386 Programer's Reference Manual》 12 | 13 | * 第一章 概述 14 | 本章涉及到的书籍和文章: 15 | + 《内核黑客手册》 16 | + 《Programming the 80386》 17 | 18 | * 第二章 微型计算机组成结构 19 | 20 | * 第三章 内核编程语言和环境 21 | 22 | * 第四章 80x86 保护模式及其编程 23 | 24 | * 第五章 Linux 内核体系结构 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 | -------------------------------------------------------------------------------- /content/code-analysis/shadowsocks-code-analysis.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | #+title:shadowsocks code analysis 3 | -------------------------------------------------------------------------------- /content/cpp/3rd-libs/asio.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: asio 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | * 概述 6 | [[https://think-async.com/Asio/][Asio]] 是一个用于网络和低级I/O编程的跨平台C++库,它使用现代C++方法为开发人员提供一致的异步模型。 7 | -------------------------------------------------------------------------------- /content/cpp/3rd-libs/boost/boost.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: boost 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | 7 | * 概述 8 | 9 | * 安装 10 | #+BEGIN_SRC sh 11 | ./bootstrap.sh && ./b2 && ./b2 install 12 | #+END_SRC 13 | * 使用 14 | -------------------------------------------------------------------------------- /content/cpp/3rd-libs/boost/program_options.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: program_options 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 8 | * 测试 9 | -------------------------------------------------------------------------------- /content/cpp/3rd-libs/gflags.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: gflags 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/gflags/gflags][gflags]] 包含一个实现命令行标志处理的 C++库。它包括对标准类型(如字符串)的内置支持,以及在使用它们的源文件中定义标志的功能。[[https://gflags.github.io/gflags/][在线文档]] 8 | 9 | * 使用 10 | -------------------------------------------------------------------------------- /content/cpp/3rd-libs/glog.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: glog 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/google/glog][glog]] 8 | -------------------------------------------------------------------------------- /content/cpp/3rd-libs/gtest.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE:gtest 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/google/googletest][gtest]](Google Test Framwork) 是 google 一套开源的 C++测试框架。主要包括两个部分:gtest和gmock两个部分。 8 | 9 | ** gtest 10 | 11 | 参考文档:[[http:https://github.com/google/googletest/blob/master/googletest/docs/Primer.md][google test primer]] 12 | 13 | ** gmock 14 | 15 | * 安装 16 | #+BEGIN_SRC sh 17 | sudo apt install libgtest-dev 18 | #+END_SRC 19 | 20 | 注意:这只是安装了gtest的源码文件,库文件需要手动编译。查找文件安装路径: 21 | 22 | #+BEGIN_SRC sh 23 | dpkg -L libgtest-dev 24 | #+END_SRC 25 | 26 | 可以看到源码安装位置 =/usr/src/gtest= ,编译 27 | 28 | #+BEGIN_SRC sh 29 | cd /usr/src/gtest 30 | sudo cmake . && make 31 | sudo cp *.a /usr/lib 32 | #+END_SRC 33 | 34 | * 使用 35 | 配合cmake使用如下: 36 | #+BEGIN_SRC cmake 37 | cmake_minimum_required(VERSION 3.0) 38 | add_executable(main main.cpp) 39 | find_package(GTest REQUIRED) 40 | target_link_libraries(main gtest ${GTEST_LIBRARIES} pthread) 41 | #+END_SRC 42 | 注意libgtest需要和pthread库一起编译。 43 | -------------------------------------------------------------------------------- /content/cpp/3rd-libs/hiredis.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: hiredis 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/redis/hiredis][hiredis]] 8 | -------------------------------------------------------------------------------- /content/cpp/3rd-libs/log4cplus.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: log4cplus 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | #+STARTUP: overview 6 | #+OPTIONS: author:nil date:nil creator:nil timestamp:nil validate:nil num:nil 7 | * 概述 8 | * 编译 9 | * 使用 10 | 11 | #+BEGIN_SRC sh 12 | log4cplus::initialize(); 13 | #+END_SRC 14 | -------------------------------------------------------------------------------- /content/cpp/3rd-libs/rapidjson.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: rapidjson 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/Tencent/rapidjson][rapidjson]] 8 | 9 | 知乎上关于 rapidjson 的一些 [[https://www.zhihu.com/question/23654513][讨论]] 。 10 | 11 | * 安装 12 | 13 | * 使用 14 | -------------------------------------------------------------------------------- /content/cpp/3rd-libs/thrift.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: thrift 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | * 安装[fn:1] 8 | 9 | thrift 10 | #+BEGIN_SRC sh 11 | docker run -it --rm centos:7 /bin/bash 12 | 13 | yum -y update && \ 14 | yum -y install epel-release && \ 15 | yum -y update && \ 16 | yum -y groupinstall "Development Tools" && \ 17 | yum -y install wget boost-devel boost-static libevent-devel zlib-devel openssl-devel 18 | #+END_SRC 19 | 20 | Upgrade autoconf,可选 21 | #+BEGIN_SRC sh 22 | wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz && \ 23 | tar xvf autoconf-2.69.tar.gz && \ 24 | cd autoconf-2.69 && \ 25 | ./configure && make && make install && cd .. 26 | #+END_SRC 27 | 28 | Upgrade automake,可选 29 | #+BEGIN_SRC sh 30 | wget http://ftp.gnu.org/gnu/automake/automake-1.14.tar.gz && \ 31 | tar xvf automake-1.14.tar.gz && \ 32 | cd automake-1.14 && \ 33 | ./configure && make && make install && cd .. 34 | #+END_SRC 35 | 36 | Upgrade bison,可选 37 | #+BEGIN_SRC sh 38 | wget http://ftp.gnu.org/gnu/bison/bison-2.5.1.tar.gz && \ 39 | tar xvf bison-2.5.1.tar.gz && \ 40 | cd bison-2.5.1 && \ 41 | ./configure && \ 42 | make && make install && cd .. 43 | #+END_SRC 44 | 45 | #+BEGIN_SRC sh 46 | wget http://mirrors.tuna.tsinghua.edu.cn/apache/thrift/0.12.0/thrift-0.12.0.tar.gz && tar zxf thrift-0.12.0.tar.gz && cd thrift-0.12.0 && ./configure && make && make install 47 | #+END_SRC 48 | * Footnotes 49 | 50 | [fn:1] https://thrift.apache.org/docs/install/centos 51 | -------------------------------------------------------------------------------- /content/cpp/cpp-summary.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8; -*- 2 | #+title:cpp summary 3 | #+author: 刘尚亮 4 | #+email: phenix3443@gmail.com 5 | #+startup:overview 6 | 7 | * 简介 8 | ** 起源 9 | ** 优点 10 | ** 特性 11 | ** 语言文化 12 | ** 编码规范 13 | *** 注释 14 | * 安装运行 15 | ** 安装 16 | ** 运行 17 | * 相关工具 18 | ** 标准命令 19 | ** 集成开发 20 | *** Vim 21 | *** Emacs 22 | ** 静态检查 23 | *** Coverity 24 | *** Lint 25 | *** Splint 26 | *** Fortify 27 | *** Codecheck 28 | *** Understand C++ 29 | ** 构建编译 30 | *** GCC 31 | ** 代码调试 32 | *** GDB 33 | *** DDD 34 | *** TotalView Debugger 35 | ** 内存检查 36 | *** Purify 37 | *** Valgrind 38 | *** KCachegrind 39 | ** 性能分析 40 | *** gprof 41 | ** 并行检查 42 | *** Intel 线程分析工具 43 | 44 | ** 自动测试 45 | ** 文档系统 46 | ** 包管理系统 47 | + [[https://conan.io/][conan]] 48 | ** 其他工具 49 | *** GNU binutils 50 | * 工程布局 51 | * 程序结构 52 | ** 函数 53 | *** 参数 54 | *** 返回值 55 | ** 变量 56 | *** 作用域 57 | * 类型系统 58 | ** 基本类型 59 | *** 布尔(bool) 60 | *** 数字(numeric) 61 | *** 字符串(string) 62 | ** 复合类型 63 | ** 默认值 64 | ** 类型转换 65 | * 运算符 66 | ** 算数运算符 67 | ** 逻辑运算符 68 | ** 位运算符 69 | ** 通信操作符 70 | * 表达式 71 | ** 赋值表达式 72 | 多变量赋值 73 | * 分支控制 74 | ** 判断 75 | ** 循环 76 | ** 跳转 77 | 78 | * 编程范式 79 | * 程序库 80 | ** 字符串处理 81 | ** 日志 82 | ** 数据库 83 | ** 网络 84 | * 参考书籍 85 | ** 入门 86 | + [[https://book.douban.com/subject/10789789/][C++ Primer Plus]] 87 | + [[https://book.douban.com/subject/25708312/][C++ Primer]] 88 | ** 高级 89 | ** 实践 90 | ** 原理 91 | + [[https://book.douban.com/subject/10427315/][深度探索 C++ 对象模型]] 92 | + [[http:https://book.douban.com/subject/1110934/][STL源码剖析]] 93 | + [[https://book.douban.com/subject/10536031/][C++ 语言的设计与演化]] 94 | -------------------------------------------------------------------------------- /content/elisp/an-introduction-to-programming-in-emacs-lisp.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 《Emacs Lisp入门》笔记 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * List Processing 7 | list是elisp基本的数据结构。list由word,number,其他list构成。 8 | 9 | 列表前的单引号是quote函数的语法糖。 10 | -------------------------------------------------------------------------------- /content/emacs/common-ide.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 通用 IDE 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 辅助编辑 7 | 8 | ** flycheck 9 | 10 | ** smart-comment 11 | 12 | ** auto-highlight-symbo 13 | 14 | ** helm-dash 15 | 参见 [[file:modes/helm-dash.org][helm-dash]] 。 16 | 17 | ** zeal-at-point 18 | 参见 [[file:modes/zeal-at-point.org][zeal-at-point]] 。 19 | 20 | 相比 helm-dash 需要在浏览器中打开对应的文档链接,zeal-at-point 在本地使用 zeal 打开已经缓存好的 docsets,这种方法更方便。 21 | 22 | * 代码补全 23 | ** yasnippet 24 | 参见 [[file:modes/yasnippet-mode.org][yasnippet]] 。 25 | 26 | ** helm-gtags 27 | 参见 [[file:modes/helm-gtags.org][helm-gtags]] 。 28 | 29 | ** company-mode 30 | 参见 [[file:modes/company-mode.org][company-mode]] 。 31 | 32 | ** lsp-mode 33 | 参见 [[file:modes/lsp-mode.org][lsp-mode]] 。 34 | 35 | ** smart-compile 36 | 37 | 38 | * 代码导航 39 | 40 | * 语法检查 41 | ** flycheck 42 | -------------------------------------------------------------------------------- /content/emacs/emacs-complete-analysis.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: Emacs 符号补全机制分析 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 8 | ** 前缀补全 9 | 10 | ** 模板补全 11 | 12 | ** 语义补全 13 | -------------------------------------------------------------------------------- /content/emacs/emacs-config-file-organization.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: Emacs 配置文件组织方式 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * Emacs 启动过程 7 | 8 | * .emacs vs .emacs.d 9 | 10 | =〜/.emacs.d/= 目录是用来额外存放每个用户 Emacs 特定文件的标准位置。各种 package 将信息存储在这个目录中。由于它位于主目录(〜/),因此它对于每个用户都是唯一的,就像 =〜/.emacs= 配置文件一样。请注意,由于 =.emacs.d= 以点开头,通常在 Unix 系统中隐藏,只有显示所有文件和文件夹(ls -a)时才会显示出来。 11 | 12 | 从 Emacs 22 开始,如果 =〜/.emacs= 不存在,Emacs 会尝试 =〜/.emacs.d/init.el= 和 =〜/.emacs.d/init.elc= 。还可以将 shell 初始化文件 =.emacs_SHELL= 放在 =〜/.emacs.d= 下。 13 | 14 | 从 Emacs 23 开始,user-emacs-directory 保存 =.emacs.d= 的位置。在 Windows 上,位置取决于 HOME 环境变量:如果设置为 =C:\=,则 =.emacs= 位于 =C:\.emacs= , =.emacs.d= 位于 =C:\.emacs.d= 。在 Windows 7 上,默认值为 =C:\Users\epich\AppData\Roaming\.emacs and .emacs.d= ,其中 epich 用户名。 15 | 16 | 用户目录本身不是加载路径的一部分,因为它包含了除库之外的其他内容,所以应该让它保留原样(不要添加到 load-path 中)。相反,应该将软件包安装在专用子目录(例如 =〜/.emacs.d/elisp/= )中,并将其添加到加载路径中。 17 | 18 | 使用 =.emacs.d= 而不是 =.emacs= 存放配置有以下优点: 19 | + 当 =.emacs= 中配置很多的时候, 使用 =.emacs.d= 可以对配置进行分解,分解的配置放在 =〜/.emacs.d/lisps/= 目录下, =〜/.emacs.d/init.el= 加载这些分解的配置,组织更加灵活,也更好修改。 20 | + =〜/.emacs.d/= 更利于版本控制,可以直接使用一下命令下载配置 21 | #+BEGIN_SRC sh 22 | git clone /my/emacs/config.git ~/.emacs.d 23 | #+END_SRC 24 | 也可以使用 dropbox 同步配置,这些都更有利于在不同电脑上同步配置。 25 | 26 | * .emcacs.d 组织方式 27 | 参见我的 emacs.d 项目:[[https://github.com/phenix3443/emacs.d][phenix3443-emacs.d]] 28 | -------------------------------------------------------------------------------- /content/emacs/emacs-font-setting.org: -------------------------------------------------------------------------------- 1 | #+BLOG:panghuli 2 | #+POSTID:3256 3 | #+DATE:Tue Aug 12 10:22:41 2014 4 | #+OPTIONS: 5 | #+CATEGORY:专业知识 6 | #+TAGS:Emacs 7 | #+DESCRIPTION:主要介绍如何在 Emacs 设置中英文字体。 8 | #+TITLE:Emacs 中的字体设置 9 | 10 | #+BEGIN_SRC sh 11 | M-x emacs-version 12 | #+END_SRC 13 | 14 | 今天主要说说 Emacs 中的字体设置。 15 | 16 | 符合我要求的字体系统应该是这样: 17 | 1) 编码应该选用 UTF-8 。这应该是一个趋势,很受不了 SI 的一个地方就是它不支持 UTF-8,导致代码的中文注释没有办法添加或经常显示乱码。恩,虽然有脚本可以支持,但毕竟不是原生的 UTF-8 啊。 18 | 2) 字体要适合 programer,程序代码中易混淆的字符,例如数字0和字母O,数字1、大写的字幕I、小写的字母l,要能分辨清楚。 19 | 3) 中文英文应该使用不同的字体,网上有人把中文和等宽英文字体合并为新的字体以方便编程使用,比如之前使用的微软雅黑 Monaco 字体就很不错,但这种方法的缺点在于你没办法单独换英文字体或中文字体,要换只能新做一个字体整体换掉。而且网上做的字体里面,并没有包含斜体,样式不够丰富。 20 | 4) 不仅支持当前窗口,对通过 C-x 5 2 或者 M-x new-frame 创建的新 frame 也应该起作用。 21 | 5) 要能根据不同的 OS 选择合适的中英文字体。 22 | 23 | 想清楚需求以后,通过阅读 Emacs 手册和网上的配置,最终的解决办法如下: 24 | 1) 编码系统和区域语言设置有密切的关系。设置语言环境为 utf-9。 25 | 2) 经过 Emacser 的多年实践,总结出了 Linux 和 Windows 下比较好的字体选择,分别是:英文 DeJaVu san 和 consolas ,中文 文泉驿系列和微软雅黑系列。 26 | 3) 变量 default-frame-alist 变量设置对 Emacs 中的所有 frame 都有影响。 27 | 4) 分别针对英文和中文给出字体候选列表,使用能在系统中找到的第一个字体。 28 | 29 | 最终效果参考配置文件 misc.el 和 frame-conf.el。 30 | 31 | 参考文章 32 | + [[http://www.gnu.org/software/emacs/manual/html_node/emacs/index.html][Emacs Manual]] 中的 22.14~16 21.8 21.11 14.8,主要说明了 Emacs 中的编码系统、字体定义和修改、frame设置。 33 | + [[http://zhuoqiang.me/torture-emacs.html][折腾Emacs]] : 主要说明了字体设置过程中一些考虑的方面。 34 | + [[http://ergoemacs.org/emacs/emacs_list_and_set_font.html][李杀网-如何设置 Emacs 字体]] :配置过程以及一些用用的链接。 35 | -------------------------------------------------------------------------------- /content/emacs/emacs-spell-check.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: Emacs 拼写检查 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 8 | * ispell 9 | 10 | * hunspell 11 | 12 | * aspell 13 | 14 | * flyspell 15 | 16 | 参考: 17 | https://www.emacswiki.org/emacs/InteractiveSpell 18 | http://www.hahack.com/tools/ispell-and-flyspell/ 19 | -------------------------------------------------------------------------------- /content/emacs/emacs-under-windows.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE:Emacs under Windows 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | * 概述 6 | 本文主要记录在 windows 下使用 Emacs 的一些注意事项以及有用的 tips。 7 | 8 | 正在使用的 window 系统是: 9 | 10 | #+BEGIN_SRC shell :exports results :results vector raw 11 | $psversiontable 12 | #+END_SRC 13 | 14 | 当前的 Emacs 版本:src_elisp[:exports results]{emacs-version} 15 | 16 | * tips 17 | 18 | ** 输入法 19 | + 启动 Emacs 后如果发现系统输入法不能再 Emacs 中使用,可以拖动 Emacs 窗口试试,然后就会发现又可以了。 20 | 21 | ** 快捷键 22 | + 使用 ctrl+shift+spc 替代系统默认的 ctrl+spc 来 mark-set。 23 | -------------------------------------------------------------------------------- /content/emacs/golang-ide.org: -------------------------------------------------------------------------------- 1 | #+title: Golang IDE 2 | #+author: 刘尚亮 3 | #+email: phenix3443@gmail.com 4 | 5 | * package 6 | 7 | ** go-mode 8 | 9 | ** company-go 10 | 11 | ** gotest 12 | -------------------------------------------------------------------------------- /content/emacs/json-ide.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: json-ide 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 编辑 json 文件所使用的 package。 8 | * packages 9 | 10 | ** json-mode 11 | -------------------------------------------------------------------------------- /content/emacs/language-server-protocol.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: Language Server Protocol 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | lsp-client 和语言智能提供程序(lsp-server)之间使用 [[https://langserver.org/][语言服务器协议(Language Server Protocol)]] 提供自动完成,转到定义,查找所有引用等功能。 8 | 9 | * lsp server 10 | 11 | * lsp client 12 | ** lsp-mode 13 | 参见[[file:lsp-mode.org][lsp-mode]] 14 | 15 | * lsp ui 16 | 参见[[file:lsp-ui.org][lsp-ui]] 17 | 18 | * company-lsp 19 | 参见[[file:company-lsp.org][company-lsp]] 20 | -------------------------------------------------------------------------------- /content/emacs/lua-ide.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: Lua IDE 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * luarocks 7 | 使用 luarocks 进行包管理。 8 | 9 | #+BEGIN_SRC sh 10 | apt install luarocks 11 | #+END_SRC 12 | 13 | * [[https://github.com/immerrr/lua-mode][lua-mode]] 14 | lua 编程的 major mode。详见[[file:lua-mode.org][lua-mode 实践]] 15 | 16 | * company-lua 17 | company 的 lua 补全后端。详见[[file:company-lua.org][company-lua 实践]] 18 | 19 | * [[https://github.com/martin-eden/lua_code_formatter][lua_code_formatter]] 20 | 代码格式化工具。优点: 21 | + 会删除空白行。 22 | 23 | 详见[[file:~/github/notebook/org/lua/lua-code-formatter.org][lua-code-formatter 实践]] 24 | 25 | * Formatter 26 | 代码格式化工具,优点: 27 | + 可以直接将格式化的代码写回源文件。 28 | 29 | 详见[[file:~/github/notebook/org/lua/formatter.org][formatter 实践]] 30 | 31 | * lsp server 32 | 33 | ** lua-lsp 34 | 目前还不是很完善。详见[[file:lua-lsp.org][lua-lsp 实践]] 。 35 | 36 | ** EmmyLua-LanguageServe 37 | 详见[[file:~/github/notebook/org/lua/emmy-lua-ls-all.org][emmylua-languageserver 实践]] 38 | 39 | ** [[https://github.com/sumneko/lua-language-server][lua-language-server]] 40 | 新服务,可以尝试一下。 41 | 42 | * 其他可用的 ide 43 | [[http://lua-users.org/wiki/LuaIntegratedDevelopmentEnvironments][Lua Integrated Development Environments]] 44 | -------------------------------------------------------------------------------- /content/emacs/modes/all-the-icons.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: all-the-icon 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/domtronn/all-the-icons.el][all-the-icon]] 是一个实用程序包,用于收集各种图标字体并在 Emacs 中对其进行属性化。 8 | 9 | * 配置 10 | 为了使图标正常工作,安装此软件包中包括的资源字体非常重要,这些字体位于 =fonts= 目录中。还可以通过调用以下函数在基于(猜测的) OS 中安装此软件包的最新字体; 11 | 12 | #+BEGIN_SRC elisp 13 | M-x all-the-icons-install-fonts 14 | #+END_SRC 15 | 16 | 请记住,这还将在 MacOS 和 Linux 上运行 =fc-cache -f -v= ,这可能需要一些时间才能完成。对于 Windows,此功能将提示提供下载目录,以供手动安装。 17 | 18 | * 使用 19 | 参考 [[https://github.com/domtronn/all-the-icons.el/wiki][wiki]] 使用示例 20 | -------------------------------------------------------------------------------- /content/emacs/modes/company-lsp.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: company-lsp 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | * 概述 6 | [[https://github.com/tigersoldier/company-lsp][company-lsp]] 使用 lsp-mode 作为 company 的后端,它提供了 lsp-mode + company-capf 没有的功能: 7 | + 支持触发字符。比如输入 =.= 的时候触发 TypeScript 的补全。 8 | + 使用补全条目的标签作为补全标签,如果可用的话,将其替换为对应的 insertText。(?) 9 | + 异步获取补全的候选项。 10 | + 不过不能补全,不缓存补全候选项。 11 | + 补全时候扩展 snippet(需要 yasnippet) 12 | 13 | * 配置 14 | 15 | ** company-lsp-enable-recompletion 16 | 如果设置为 non-nil,则当 company-lsp 完成补全,它会检查当前点是否在任何完成触发器字符之前。如果是,则重新触发另一个完成请求。 17 | 18 | C++ 中,这种情况有利于 std 按照 =std::= 进行补全。 19 | 20 | * 使用 21 | -------------------------------------------------------------------------------- /content/emacs/modes/company-lua.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: company-lua 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/ptrv/company-lua][company-lua]] 是 Lua 的 company-mode 的后端实现。 使用 ZeroBrane Studio(参见[[file:zerobrane-studio.org][ZeroBrane Studio 实践]]) 的 api 文件作为补全候选者的来源。现在只支持 Lua 5.1,5.2,5.3 和 LÖVE。 8 | 9 | * 安装 10 | 11 | * 配置 12 | 13 | * 使用 14 | -------------------------------------------------------------------------------- /content/emacs/modes/company-quickhelp.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: company-quickhelp 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/expez/company-quickhelp][company-quickhelp]] 是在补全候选框闲置时弹出有关候选项的文档窗口。 8 | 9 | * 配置 10 | 11 | * 使用 12 | -------------------------------------------------------------------------------- /content/emacs/modes/company-statistics.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: company-statistics 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/company-mode/company-statistics][company-statistics]] 是一个基于 company-mode 的全局 minor mode。 设想 shi 记录一定数量选择过的补全候选项以及一些上下文信息,以便下次选择时来对候选项进行排名-更期望的候选项位于补全列表的前面。 8 | 9 | company-statistics 是 company-mode 的附加组件,但只与它松散耦合(它通过向 company-transformers 添加排序函数以及向 company-completion-finished-hook 添加处理程序实现)。 对于记录的上下文信息和候选者的评分方式,它的设计考虑了一些灵活性:默认的函数对只是示例! 统计信息在会话之间自动持久化。 10 | * 配置 11 | 12 | * 使用 13 | -------------------------------------------------------------------------------- /content/emacs/modes/dap-mode.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: dap-mode 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | #+STARTUP: overview 6 | #+OPTIONS: author:nil date:nil creator:nil timestamp:nil validate:nil num:nil 7 | -------------------------------------------------------------------------------- /content/emacs/modes/diminish.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: diminish 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 8 | 当 diminish 一个 mode 时,希望继续使用它,但不在 mode line 进行提示。 9 | 10 | 该软件包实现了隐藏或使用简写替代 minor mode 在 mode line 的显示。 11 | 12 | * 安装 13 | 14 | * 配置 15 | 16 | * 使用 17 | #+BEGIN_SRC elisp 18 | (require 'diminish) 19 | ;; Hide jiggle-mode lighter from mode line 20 | (diminish 'jiggle-mode) 21 | ;; Replace abbrev-mode lighter with "Abv" 22 | (diminish 'abbrev-mode "Abv") 23 | #+END_SRC 24 | -------------------------------------------------------------------------------- /content/emacs/modes/dired-mode.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: dired 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 8 | * 配置 9 | 10 | * 使用 11 | ** 批量命名 12 | -------------------------------------------------------------------------------- /content/emacs/modes/ediff-mode.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: ediff-mode 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | -------------------------------------------------------------------------------- /content/emacs/modes/eldoc.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: eldoc-mode 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | Eldoc 是一个 buffer-local 辅助模式,有助于查找 Lisp 文档。当启用后,回显区会显示当前 buffer 中 point 处 Lisp 函数和变量的一些有用信息;函数显示参数列表,变量显示变量文档字符串的第一行。 8 | 9 | * 安装 10 | 11 | * 配置 12 | 13 | * 使用 14 | -------------------------------------------------------------------------------- /content/emacs/modes/emacs-ccls.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: emacs-ccls 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/MaskRay/emacs-ccls][emacs-ccls]] 是 [[https://github.com/MaskRay/ccls/wiki/FAQ][ccls]] 的客户端,ccls 是一个支持数百万行 C++代码库的 C/C++/Objective-C 语言服务器,由 libclang 提供支持。 它利用 lsp-mode,但也为 LSP 提供了一些 ccls 扩展: 8 | + semantic highlighting 9 | + skipped ranges (e.g. a #if false region) 10 | + cross references: $ccls/inheritance $ccls/call $ccls/vars 11 | 12 | * 安装 13 | 14 | * 配置 15 | #+BEGIN_SRC elisp 16 | (require 'ccls) 17 | (setq ccls-executable "/path/to/ccls/Release/ccls") 18 | #+END_SRC 19 | 20 | * 使用[fn:1] 21 | 22 | * Footnotes 23 | 24 | [fn:1] https://github.com/MaskRay/ccls/wiki/lsp-mode 25 | -------------------------------------------------------------------------------- /content/emacs/modes/emmy-lua-ls-all.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: emmylua-ls-all 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/EmmyLua/EmmyLua-LanguageServer][Emmy Lua Language Server]] 是一个 lua 语言的 lsp-server。该程序需要安装 JDK。 8 | 9 | * 安装 10 | 11 | 编译: 12 | #+BEGIN_SRC sh 13 | git clone https://github.com/EmmyLua/EmmyLua-LanguageServer.git 14 | cd EmmyLua-LanguageServer/ 15 | chmod +x gradlew 16 | ./gradlew shadowJar 17 | #+END_SRC 18 | 19 | 编译 LS 放在 =EmmyLua-LanguageServer/EmmyLua-LS/build/libs/EmmyLua-LS-all.jar= 20 | 21 | 最后一步编译不成功,是因为设置 gradle 版本错误。 22 | 23 | 或者在 docker 中搭建: 24 | #+BEGIN_SRC sh 25 | docker pull mcr.microsoft.com/java/jdk:8u192-zulu-ubuntu 26 | docker run --name emmy-lua-build -it -v :/EmmyLua-LanguageServer mcr.microsoft.com/java/jdk:8u192-zulu-ubuntu 27 | #+END_SRC 28 | 29 | 30 | * 使用 31 | 启动 LS,然后客户端就可以对接使用了。 32 | #+BEGIN_SRC sh 33 | java -cp EmmyLua-LS-all.jar com.tang.vscode.MainKt 34 | #+END_SRC 35 | -------------------------------------------------------------------------------- /content/emacs/modes/format-all.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: format-all 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/lassik/emacs-format-all-the-code][format-all]] 目的是使用同一命令格式化多种语言源码,而不需要学习每种语言的不同 Emacs 软件包和格式化命令。 8 | 9 | 只要执行 =M-x format-all-buffer= ,就可以执行代码格式化。要在保存时自动格式化代码,请使用 =format-all-mode= minor mode,该模式会在保存代码的时候自动格式化当前 buffer。 10 | -------------------------------------------------------------------------------- /content/emacs/modes/go-eldoc.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: go-eldoc 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/syohex/emacs-go-eldoc][go-eldoc]] 提供 Go 语言的 eldoc。 go-eldoc.el 显示函数的变量,函数和当前参数位置的类型信息。 8 | 9 | * 安装 10 | 依赖 gocode 和 go-mode。 11 | 12 | * 配置 13 | 14 | * 使用 15 | -------------------------------------------------------------------------------- /content/emacs/modes/go-gen-test.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: go-gen-test 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 8 | [[https://github.com/s-kostyaev/go-gen-test][go-gen-test]] 是 Emacs 中为 go 代码生成测试用例的 package。它简单包装了 gotests。 9 | 10 | * 使用 11 | + go-gen-test-dwim 12 | 13 | 生成所需功能的测试。如果在区域处于活动状态时调用此函数,它将提取在该区域中定义的函数并为其生成测试。否则,它会为导出的或所有功能生成测试。您可以使用 go-gen-test-default-functions 自定义此行为。 14 | 15 | + go-gen-test-all 16 | 17 | Generate tests for all functions. 18 | 19 | + go-gen-test-exported 20 | 21 | Generate tests for all exported functions. 22 | -------------------------------------------------------------------------------- /content/emacs/modes/go-guru.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: go-guru 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | -------------------------------------------------------------------------------- /content/emacs/modes/go-playgound.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: go-playground 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | * 概述 6 | [[https://github.com/grafov/go-playground][go-playerground]] 是 GNU / Emacs 的简单模式,用于在本地 设置 Go 语言游乐场,功能类似 play.golang.org 上的服务,且在 go-mode 的帮助下甚至超越!。你可以把它当做 go 版本的 REPL。这不是在 Emacs 中使用来 play.golang.org 的包装器(它已经通过原始的 go-mode 完成),这是在 Emacs 中设置本地游乐场而不使用浏览器进行代码片段实验的完全替代方案。 7 | 8 | play.golang.org 上的网络游乐场是个不错的主意。它不需要设置,它可以在一个不会损坏系统的受限环境中执行代码。但它也带来了很多限制,特别是当你想使用额外的助手来处理你的代码时:格式化程序,代码完成程序等.Emacs 为 Go 开发提供了许多这样的工具,所以它是最舒适的用 Emacs 内部的片段而不是粗鲁的 webeditor。当然,当地游乐场需要你设置 Go 环境,但如果你在 Go 中开发(或者你想要这样做),你无论如何都需要设置 go-mode 和 helper 工具以便以舒适的方式处理代码。 9 | 10 | * 特性 11 | + 它在 go-mode 下工作,并可使用安装的所有插件(如自动补全,linters 等) 12 | + 在 GOPATH 下的子目录中保存 playground 文件,这有助于保留有用的片段库 13 | + 它可以将代码分成任意数量的文件 14 | + 它可以从你的 GOPATH 导入任何外部包 15 | + 在您的代码段目录中使用 vendored packages 16 | 17 | * 安装 18 | 首先安装 go-mode 和 gotest - 这些都是强制性的。为 Golang 设置你想要的任何其他工具(参见 Emacs Wiki 获取指南或 google 获取“emacs + golang”)。我个人建议使用 goimports 自动将导入子句添加到你的片段。因为通常当您测试一些想法时,您希望尽快获得工作代码。而 goimports 帮助它。 19 | 20 | 从 MELPA 安装游乐场: 21 | #+BEGIN_SRC sh 22 | M-x package-install RET go-playground 23 | #+END_SRC 24 | 如果你想要共享片段,请从 go-mode 使用 go-play-buffer。如果你想在 github.com 上发布 gists,请从 MELPA 安装 gist-buffer。 25 | -------------------------------------------------------------------------------- /content/emacs/modes/google-this.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: google-this 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/Malabarba/emacs-google-this][google-this]] 是一个包,提供一组功能和键绑定,用于从emacs中启动谷歌搜索。 8 | 9 | * 使用 10 | + google-search (C-c / RET) 11 | + google-word (C-c / w) 12 | + google-symbol (C-c / s) 13 | + google-line (C-c / l) 14 | + google-region (C-c / SPC) 15 | + google-this (C-c / t) 16 | + google-this-ray (C-c / a) google 当前 point 到 行尾的文本。 17 | + google-this-translate-query-or-region (C-c / c) 翻译。 18 | + google-this-lucky-search (C-c / g) google lucky。 19 | + google-this-forecast (C-c / f) google搜索天气。 20 | -------------------------------------------------------------------------------- /content/emacs/modes/gotest.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE:gotest 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/nlamirault/gotest.el][gotest]] 可以直接从 Emacs 中运行 =go test= 。 8 | 9 | * 使用 10 | 有很多命令可以从多角度运行命令。 11 | 12 | + go-test-current-test 13 | 14 | Launch unit tests for the current test. 15 | 16 | + go-test-current-test-cache 17 | 18 | Rerun the current test. 19 | 20 | + go-test-current-file 21 | 22 | Launch unit tests and examples for the current file 23 | 24 | + go-test-current-project 25 | 26 | Launch unit tests and examples for the current project. 27 | 28 | + go-test-current-coverage 29 | 30 | Launch unit tests coverage for the current project. 31 | 32 | + go-test-current-benchmark 33 | 34 | Launch go benchmark on current benchmark 35 | 36 | + go-test-current-file-benchmarks 37 | 38 | Launch go benchmark on current file 39 | 40 | + go-test-current-project-benchmarks 41 | 42 | Launch go benchmark on current project 43 | -------------------------------------------------------------------------------- /content/emacs/modes/header2.org: -------------------------------------------------------------------------------- 1 | #+TITLE:header2 2 | #+AUTHOR: liushangliang 3 | #+EMAIL: phenix3443+github@gmail.com 4 | -------------------------------------------------------------------------------- /content/emacs/modes/helm-core.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: helm 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/emacs-helm/helm][helm]] 是一个Emacs框架,用于增量补全和缩小选择范围。 它为希望在Emacs中构建自己的Helm应用程序的开发人员提供了一个易于使用的API,以及强大的搜索工具和几十个已经内置的命令,几乎可以补全所有任务。 对于任何使用Emacs作为主要工作环境的人来说,它都是必备的。 Helm已被许多Emacs高级用户广泛采用。 它在Melpa中可用,可以从Emacs包管理器轻松安装。 8 | 9 | * 配置 10 | 11 | * 使用 12 | 13 | 在任何helm会话中,在 helm buffer 中出现候选者的时候, =C-h m= 弹出一个 org 缓冲区,其中包含有关当前命令的详细文档以及有关helm的更多通用信息。 14 | -------------------------------------------------------------------------------- /content/emacs/modes/helm-descbinds.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: helm-descbinds 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/emacs-helm/helm-descbinds][helm-descbinds]] 提供一个界面来展示 Emacs 按键绑定。 8 | -------------------------------------------------------------------------------- /content/emacs/modes/helm-gtags.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: helm-gtags 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/syohex/emacs-helm-gtags][helm-gtags]] 是 GNU Global 的 helm 前端。 8 | -------------------------------------------------------------------------------- /content/emacs/modes/helm-system-packages.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: helm-system-packages 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/emacs-helm/helm-system-packages][Helm System Packages]] 是一个基于Emacs的接口,用于操作系统和远程系统的包管理器。 8 | 9 | 启动helm-system-packages以列出所有可用的包(已安装的包以及在各自的面中显示的依赖项)。模糊搜索,标记并执行任何选择的包所需的操作: 10 | + 安装。 11 | + 卸载。 12 | + 显示包裹详细信息(在 org 模式中!)或在当前 point 处插入详细信息。 13 | + 查找包所拥有的文件。 14 | + 通过网络执行以上所有操作! 15 | 16 | Helm System Packages为以下包管理器提供统一的界面: 17 | + brew(macOS) 18 | + DNF 19 | + dpkg(apt&friends) 20 | + guix 21 | + pacman 22 | + portage (emerge & friends) 23 | + xbps 24 | 25 | * 使用 26 | 只需要执行 =helm-system-packages= ,输入要查找的包的名字,然后使用 =C-i= 可以显示后续可以执行的动作。 27 | -------------------------------------------------------------------------------- /content/emacs/modes/helm-tramp.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: helm-tramp 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/masasam/emacs-helm-tramp][helm-tramp]] 是 Tramp helm interface for ssh server and docker and vagrant。 8 | 9 | * 安装 10 | 11 | * 配置 12 | 13 | * 使用 14 | -------------------------------------------------------------------------------- /content/emacs/modes/helm-xref.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: helm-xref 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | 7 | * 概述 8 | [[https://github.com/brotzeit/helm-xref][helm-xref]] 9 | 10 | * 安装 11 | 12 | * 配置 13 | #+BEGIN_SRC elisp 14 | (require 'helm-xref) 15 | (setq xref-show-xrefs-function 'helm-xref-show-xrefs) 16 | #+END_SRC 17 | 18 | * 使用 19 | -------------------------------------------------------------------------------- /content/emacs/modes/highlight-indents-guides.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: highlight-indent-guides 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/DarthFennec/highlight-indent-guides][highlight-indent-guide]] ,可以使用字符的形式显示当前模块的缩进,同时还可以动态展示当前光标所处位置的缩进级别。 8 | -------------------------------------------------------------------------------- /content/emacs/modes/imenu.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: imenu 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | #+STARTUP: overview 6 | #+OPTIONS: author:nil date:nil creator:nil timestamp:nil validate:nil num:nil 7 | -------------------------------------------------------------------------------- /content/emacs/modes/ivy.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: ivy 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 7 | [[https://github.com/abo-abo/swiper][Ivy]] 是一个 Emacs 的通用补全机制。虽然它与其他补全方案(如 icomplete-mode)的运行方式类似,但 Ivy 的目标是更高效,更小,更简单,使用更顺畅,但可高度自定义。 8 | 9 | ivy-mode 确保任何使用 completing-read-function 的 Emacs 命令都使用 ivy 补全。 10 | 11 | Counsel 更进一步,提供常规 Emacs 命令的版本,这些命令是为了充分利用 ivy 而定制的。例如,counsel-find-file 有一些额外的键绑定。按 DEL 将移动到父目录。 12 | 13 | Swiper 是 isearch 的替代品,它使用 ivy 来显示所有匹配的概述。 14 | * 安装 15 | 16 | * 配置 17 | 参见 [[https://oremacs.com/swiper/][ivy manual]] 18 | 19 | * 使用 20 | 启用 counsel-mode 重新映射具有 counsel 替换功能的内置 Emacs 功能: 21 | -------------------------------------------------------------------------------- /content/emacs/modes/livedown.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: livedown 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | -------------------------------------------------------------------------------- /content/emacs/modes/lsp-java.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: lsp-java 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/emacs-lsp/lsp-java][lsp-java]] 模式支持以下 JDT 功能: 8 | + 输入时分析和编译错误的报告时(通过 =flycheck / lsp-ui=) 9 | + 代码补全,使用 =company-lsp= 或内置的 =complete-at-poin= 10 | + Javadoc 悬停-使用 =lsp-ui= 11 | + 代码操作-使用 =lsp-ui= 12 | + 代码大纲-使用内置的 imenu 13 | + 代码导航-使用内置的 xref 14 | + Code Lens(参​​​​考/实现)-使用内置的 xref 15 | + 代码高亮 16 | + 代码格式化 17 | + Maven pom.xml 项目支持 18 | + 有限的 Gradle 支持 19 | + 可视化调试器, =dap-mode= 20 | + 测试运行器 =dap-mode= 21 | + 项目资源管理器集成-TreeMacs 22 | + 与 Spring Initializr 集成 23 | 24 | ** [[https://projects.eclipse.org/projects/eclipse.jdt.ls][Eclipse JDT Language Server]] 25 | lsp-java 将自动检测服务器是否存在,并将在首次启动之前下载 Eclipse JDT Language Server。服务器安装将在 lsp-java-server-install-dir 中。它将检测是否存在 dap-mode 并下载所需的服务器端插件/组件。如果要更新服务器,则可以运行 lsp-java-update-server。要运行特定版本的 Eclipse JDT Language Server,请使用 lsp-java-server-install-dir。 26 | 27 | * 使用 28 | 29 | 30 | * 配置 31 | -------------------------------------------------------------------------------- /content/emacs/modes/lsp-pyright.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: lsp-pyright 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/emacs-lsp/lsp-pyright/][lsp-pyright]] 支持 . [[https://github.com/microsoft/pyright][Pyright ]]是用于大型 Python 源库的快速类型检查器。它可以在“监视”模式下运行,并在修改文件后执行快速的增量更新。相比 mspyls,pyright 更快,vs code 也计划使用基于 pyright 构建的 Pylance 替代 mspyls。 8 | 9 | * 配置 10 | ** pyright 11 | #+BEGIN_SRC sh 12 | sudo npm i -g pyright 13 | #+END_SRC 14 | 15 | * 使用 16 | -------------------------------------------------------------------------------- /content/emacs/modes/lsp-ui.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: lsp-ui 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/Emacs-lsp/lsp-ui][lsp-ui]] 包含了 lsp-mode 的所有更高级 UI 模块,如 flycheck 支持和 code lenses。 8 | 9 | ** lsp-ui-sideline 10 | 显示当前行上符号的信息。 它还显示了 flycheck 诊断和 LSP 代码动作(code action)。 11 | 12 | ** lsp-ui-peek 13 | [[https://code.visualstudio.com/docs/editor/editingevolved#_peek][peek]] 可以直接打开一个小窗口查看和编辑符号相关的上下文,例如函数的定义和引用等。 14 | 15 | ** lsp-ui-imenu 16 | 17 | ** lsp-ui-doc 18 | 在 child frame 中显示光标处对象的文档。 19 | 20 | * 使用 21 | -------------------------------------------------------------------------------- /content/emacs/modes/lua-lsp.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: lua-lsp 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | lua 语言的 lsp-server,缺点: 8 | + 功能补全。 9 | + module 不能识别。 10 | 11 | * 安装 12 | #+BEGIN_SRC sh 13 | sudo luarocks install --server=http://luarocks.org/dev lua-lsp 14 | #+END_SRC 15 | 这将安装 lua-lsp 命令,然后 lsp-client 可以使用 stdio 作为传输与此过程进行通信。 16 | 17 | lua-lsp 在安装时自动与常见的 lua 软件包集成。 18 | 19 | lua-lsp 读取几个项目级配置文件来完成它的工作: 20 | 21 | + 要配置 linting,需要读取标准 =.luacheckrc= 文件。 22 | + 对于自动补全支持,需要重新实现 atom-autocomplete-lua 创建 [[https://github.com/dapetcu21/atom-autocomplete-lua#configuration][.luacompleterc]] 格式。特别是,需要 luaVersion 来正确理解你的代码。 23 | 24 | 目前没有怎么使用这个插件。 25 | 26 | * 插件 27 | lua-lsp 在安装时会自动与常用的 lua 软件包集成。对于 linting 使用 luacheck,对于代码格式化,目前支持 Formatter 和 LCF。Formatter 仅支持 5.1,而 lcf 仅支持 5.3。 28 | 29 | ** [[https://github.com/mpeterv/luacheck][lua-check]] 30 | 参见[[file:~/github/notebook/org/lua/luacheck.org][luacheck 实践]] 31 | 32 | ** Formatter 33 | 参见[[file:~/github/notebook/org/lua/formatter.org][Formatter 实践]] 34 | -------------------------------------------------------------------------------- /content/emacs/modes/lua-mode.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: lua-mode 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | lua-mode 是在 Emacs 中编辑 Lua 源的主要模式。主要支持以下功能: 8 | + 代码缩进和高亮。 9 | + 在 lua 子进程中对代码行(lines),块(regions),函数(functions),文件(files)求值,或直接与其进行交互。 10 | + 使用在线或离线手册进行文档查找。 11 | 12 | * 配置 13 | ** lua-indent-level 14 | 缩进量 15 | 16 | ** lua-documentation-url 17 | 文档查找的 url,默认是 =http://www.lua.org/manual/5.1/manual.html#pdf-= ,可以定制该变量查找 lua5.1,lua5.2 或 lua5.3 的文档。 18 | 19 | ** lua-documentation-function 20 | 用于显示文档的函数,默认是 =browse-url= ,Emacs 25 可选 eww。 21 | 22 | ** lua-default-application 23 | 启动交互式解析器(REPL)的命令,默认是 =lua= 。 24 | 25 | ** lua-default-command-switches 26 | 在启动 REPL 时传递的参数,默认为 =-i= ,(如果希望以交互方式使用 Lua shell,请确保-i 在那里)。 27 | 28 | ** lua-always-show 29 | 发送内容后显示 REPL buffer。 30 | 31 | * 使用 32 | 33 | 以下的这些功能都有助于方便的调试 lua 代码: 34 | 35 | ** lua-show-process-buffer 36 | switch to REPL buffer 37 | 38 | ** lua-hide-process-buffer 39 | 隐藏展示 REPL buffer 的 window。 40 | 41 | ** lua-send-buffer 42 | 求值当前 buffer 43 | 44 | ** lua-send-current-line 45 | 求值当前行 46 | 47 | ** lua-send-defun 48 | 求值当前函数 49 | 50 | ** lua-send-region 51 | 求值激活的 region 52 | 53 | ** lua-restart-with-whole-file 54 | 55 | 重启 REPL 并发送整个缓冲区 56 | -------------------------------------------------------------------------------- /content/emacs/modes/magit.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8; -*- 2 | #+TITLE: magit 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 简介 7 | [[https://github.com/magit/magit][magit]] 是版本控制系统 Git 的 Emacs 接口。 8 | 9 | * 安装 10 | 11 | * 配置 12 | 13 | * 使用 14 | -------------------------------------------------------------------------------- /content/emacs/modes/markdown-toc.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE:markdown-toc 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/ardumont/markdown-toc][markdown-toc]] 为格式良好的 markdown 文件生成目录。 8 | 9 | * 配置 10 | 11 | * 使用 12 | + M-x markdown-toc-generate-toc 13 | 14 | 在光标处生成 TOC。 15 | 16 | + M-x markdown-toc-refresh-toc 17 | 18 | 更新当期的 TOC。 19 | 20 | + M-x markdown-toc-delete-toc 21 | 22 | 删除当前的 TOC 23 | -------------------------------------------------------------------------------- /content/emacs/modes/org-mode-manual.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | #+title:Org manual 3 | #+author: 刘尚亮 4 | #+email: phenix3443@gmail.com 5 | * Org Mode Manual 6 | * Introduction 7 | * Document structure 8 | * Tables 9 | * Hyperlinks 10 | * items 11 | * Tags 12 | * Properties and columns 13 | * Dates and times 14 | * Capture - Refile - Archive 15 | * Agenda views 16 | * Markup for rich export 17 | * Exporting 18 | * Publishing 19 | * Working with source code 20 | * Miscellaneous 21 | * Appendix A Hacking 22 | * Appendix B MobileOrg 23 | * Appendix C History and acknowledgments 24 | * Appendix D GNU Free Documentation License 25 | * Concept index 26 | * Key index 27 | * Command and function index 28 | * Variable index 29 | -------------------------------------------------------------------------------- /content/emacs/modes/pangu-spacing.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: pangu-space 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/coldnew/pangu-spacing][pangu-spacing]] pangu-spacing-mode 是一种在中英文字符之间自动添加空格的辅助模式。 请注意,这些空白字符并未要真正添加到内容中。 8 | 9 | * 安装 10 | 11 | * 配置 12 | 默认不会真的在中英文之间插入空格,如果确实想这么做,作如下配置: 13 | #+BEGIN_SRC sh 14 | (setq pangu-spacing-real-insert-separtor t) 15 | #+END_SRC 16 | * 使用 17 | -------------------------------------------------------------------------------- /content/emacs/modes/persp-projectile.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: persp-projectile 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/nex3/perspective-el][Perspective]]是一种 minor mode,可以管理不同的工作区。 如果需要同时打开许多项目,透视图可以帮助将每个项目相关的缓冲区和窗口设置与其他项目分开,类似于 MacOS 上的多个空间,这样可以专注于当前活动项目的文件。 8 | 9 | * 安装 10 | 使用 elpa 安装。或者,Debian 9 或更高版本或 Ubuntu 16.04 或更高版本的用户可以 =apt-get install elpa-persp-projectile= 。 11 | 12 | * 配置 13 | 14 | * 使用 15 | 当调用 ido-switch-buffer 时,只有当前项目相关文件显示在迷你缓冲区中,而模式行中的指示符告诉我我在哪个项目中。 16 | 17 | 使用截图详见 [[https://github.com/bbatsov/persp-projectile][persp-projectile]] 18 | -------------------------------------------------------------------------------- /content/emacs/modes/perspective.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: perspective 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/nex3/perspective-el][perspective]] 在 Emacs 中标记工作区,类似于窗口管理器中的工作区,窗口管理器类似 Awesome 和 XMonad(有点类似于 Gnome 中的多个桌面或 OS X 中的 Spaces)。 8 | 9 | perspective.el 为每个 Emacs 框架提供多个工作区(或 “perspective”)。 这使得在许多单独的项目中工作变得容易,而不会迷失在所有缓冲区中。 10 | 11 | 每个 perspective 由窗口配置和一组缓冲区组成。切换到 perspective 会激活其窗口配置,而在 perspective 中,默认情况下只有其缓冲区可用。 12 | 13 | * 安装 14 | 建议您从 MELPA 安装 perspective.el。 或者,可以将它放在加载路径中并运行 =(require 'perspective)= 。 15 | 16 | Debian 9 或更高版本或 Ubuntu 16.04 或更高版本的用户可能只需要 =apt-get install elpa-perspective= 。 17 | 18 | * 配置 19 | 20 | * 使用 21 | =persp-mode= 激活 perspective。命令都以 C-x x 为前缀。 以下是主要命令: 22 | + s -- persp-switch: 查询要切换或创建的 perspective。 23 | + k -- persp-remove-buffer:查询从当前 perspective 中删除的 buffer。 24 | + c -- persp-kill : 查询要杀死的 perspective。 25 | + r -- persp-rename: 重命名当前 perspective。 26 | + a -- persp-add-buffer: 在当前 perspective 中添加 buffer。 27 | + A -- persp-set-buffer: 将 buffer 添加到当前 perspective 并将其从其他 perspective 中删除。 28 | + i -- persp-import: 从另一个框架导入给定的 perspective。 29 | + n, -- persp-next : 切换到下一个 perspective。 30 | + p, -- persp-prev: 切换到前一个 perspective。 31 | -------------------------------------------------------------------------------- /content/emacs/modes/pyls.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: pyls 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/palantir/python-language-server][python-language-server]] (pylsp)是纯 python 开发的 lsp server。 8 | 9 | ** 安装 10 | #+BEGIN_SRC sh 11 | pip3 install --user python-language-server[all] 12 | #+END_SRC 13 | 14 | 安装以下 lib: 15 | + Rope:补全和重命名 16 | + Pyflakes: 检测各种错误的 linter 17 | + McCabe: 用于复杂性检查 18 | + pycodestyle:用于代码风格检查的 linter 19 | + pydocstyle:用于文档字符串样式检查的 linter(默认情况下禁用) 20 | + autopep8 用于代码格式化 21 | + YAPF 用于代码格式化(优先于 autopep8) 22 | 23 | ** 使用 24 | 目前该配置 pyls 使用还比较卡顿,暂时放弃。 25 | -------------------------------------------------------------------------------- /content/emacs/modes/python-mode.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: python-mode 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/emacsmirror/python-mode][python-mode]] 是 python 的 major mode。 8 | -------------------------------------------------------------------------------- /content/emacs/modes/revive-mode.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: revive-mode 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 简介 7 | 用来保存窗体布局和打开 buffer。 8 | 9 | * TODO 恢复之后窗体大小和原来不一致。 10 | -------------------------------------------------------------------------------- /content/emacs/modes/sqlformat.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: sqlformat 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/purcell/sqlformat][sqlformat]] 可使用 [[https://sqlformat.org/][sqlformat]] 和 [[file:~/github/notebook/org/linux/pgformatter.org][pg_format]] 等外部程序轻松重新格式化 SQL。 8 | 9 | * 安装 10 | #+BEGIN_SRC sh 11 | pip3 install sqlparse 12 | #+END_SRC 13 | 14 | * 配置 15 | 16 | 17 | * 使用 18 | sql 代码: 19 | #+BEGIN_SRC sql 20 | create TABLE `tb11` ( 21 | `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, 22 | UNIQUE KEY `id` (`id`) 23 | ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; 24 | 25 | #+END_SRC 26 | 格式化需求: 27 | + 所有关键字大写 28 | + 每列一行 29 | + 每列左起有 4 个空格。 30 | 31 | sqlformat 格式化 =sqlformat -k upper test.sql= : 32 | #+BEGIN_SRC sql 33 | CREATE TABLE `tb11` ( 34 | `id` int(11) NOT NULL AUTO_INCREMENT, 35 | `name` varchar(20) DEFAULT NULL, 36 | UNIQUE KEY `id` (`id`) 37 | ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; 38 | #+END_SRC 39 | 40 | 只处理了关键字大写。 41 | 42 | pg_format 格式化 =pg_format test.sql= : 43 | #+BEGIN_SRC sql 44 | CREATE TABLE `tb11` ( 45 | `id` int (11) NOT NULL AUTO_INCREMENT, 46 | `name` varchar(20) DEFAULT NULL, 47 | UNIQUE KEY `id` (`id`)) ENGINE = InnoDB AUTO_INCREMENT = 3 DEFAULT CHARSET = utf8; 48 | #+END_SRC 49 | 50 | 而且,sqlformat 这个 minor mode 不能给 sqlformat-command 添加参数,这样看来 pg_format 更满足需求。 51 | -------------------------------------------------------------------------------- /content/emacs/modes/sqlup-mode.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: sqlup-mode 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | * 概述 6 | sqlup-mode 编写 SQL 时关键字自动大写。该模式还支持 =redis-mode= 。 7 | 8 | * 配置 9 | 可以将 Sqlup 配置为忽略某些关键字,方法是将它们添加到列表 sqlup-blacklist 中。 10 | 11 | * 使用 12 | 使用 =M-x sqlup-mode= 启用该模式,也可由以下键触发: 13 | + SPC 14 | + ( 15 | + , 16 | + ; 17 | + RET 18 | + ' 19 | -------------------------------------------------------------------------------- /content/emacs/modes/vc-msg.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: vc-msg 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/redguardtoo/vc-msg][vc-msg]] 显示当前行的版本控制软件(VCS)提交消息。该软件包是 emacs-git-messenger 的扩展.x 8 | 9 | * 配置 10 | 11 | * 使用 12 | =M-x vc-msg-show= 13 | -------------------------------------------------------------------------------- /content/emacs/modes/web-mode.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: web-mode 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[http://web-mode.org/][web-mode]] 8 | -------------------------------------------------------------------------------- /content/emacs/modes/zeal-at-point.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: zeal-at-point 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 用 Zeal 搜索单词 Zeal 是一个简单的离线 API 文档浏览器,受 Dash(OS X 应用程序)的启发,适用于 Linux 和 Windows。 8 | 9 | * 安装 10 | 11 | * 配置 12 | 13 | 在 point 处运行 zeal-at-point 启动 Zeal 并搜索单词。使用前缀参数 C-u 先编辑搜索的字符串。 14 | 15 | #+BEGIN_SRC sh 16 | (global-set-key "\C-cd" 'zeal-at-point) 17 | #+END_SRC 18 | 19 | 可以使用 docset 前缀缩小 Zeal 查询的范围。自定义文档集和主要模式之间的关系: 20 | 21 | #+BEGIN_SRC elisp 22 | (add-to-list 'zeal-at-point-mode-alist '(perl-mode . "perl")) 23 | ;; Use multiple docsets 24 | (add-to-list 'zeal-at-point-mode-alist '(python-mode . ("python" "django"))) 25 | #+END_SRC 26 | 27 | Additionally, the buffer-local variable zeal-at-point-docset can be set in a specific mode hook (or file/directory local variables) to programmatically override the guessed docset. For example: 28 | 此外,buffer-local 变量 zeal-at-point-docset 可以在特定 mode(或文件/目录局部变量)中设置 hoook,以覆盖猜测的 docset。例如: 29 | #+BEGIN_SRC elisp 30 | (add-hook 'rinari-minor-mode-hook 31 | (lambda () (setq zeal-at-point-docset "rails"))) 32 | 33 | ;; Use multiple docsets 34 | (add-hook 'python-mode-hook 35 | (lambda () (setq zeal-at-point-docset '("python" "django")))) 36 | #+END_SRC 37 | 38 | You are also possible to set docset for current buffer with zeal-at-point-set-docset 39 | 40 | 还可以使用 zeal-at-point-set-docset 为当前缓冲区设置 docset。 41 | 42 | * 使用 43 | -------------------------------------------------------------------------------- /content/emacs/nginx-ide.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: nginx IDE 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * nginx-mode 7 | [[https://github.com/ajc/nginx-mode/tree/a2bab83c2eb233d57d76b236e7c141c2ccc97005][nginx-mode]] 用来编辑 nginx 配置文件的 major mode,主要提供了关键词高亮功能。该模式在打开以下文件时自动激活: 8 | + nginx.conf 9 | + 以 =nginx= 目录下以 =.conf= 结尾的文件。 10 | 11 | * company-nginx 12 | 13 | [[https://github.com/stardiviner/company-nginx][company-nginx]] 结合 company-mode 提供编辑 nginx 配置文件时的自动补全功能,主要是通过 company-nginx-keywords 数据,将 nginx 关键字写入 company-keywords-alist,然后通过 company-keywords 后端实现补全。 14 | -------------------------------------------------------------------------------- /content/emacs/offline-doc.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 离线文档工具 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 程序员开发过程中经常需要查询各种文档,不同语言,不同代码库或者工具需要登录不同的网站,比较繁琐,如果能有一个工具集中查询会比较好。下面介绍几款这样的工具: 8 | 9 | * dash 10 | Dash 是一个 API 文档浏览器(API Documentation Browser),以及代码片段管理工具(Code Snippet Manager)。但是该软件只支持 MacOS。 11 | 12 | 13 | * zeal 14 | 是一个跨平台工具,没有代码片段功能。 15 | 16 | * devdocs 17 | [[https://devdocs.io/][devdocs]] 搜索功能不如 zeal。 18 | 19 | * Velocity 20 | 21 | Windows 平台工具 22 | 23 | * LovelyDocs 24 | Android 平台工具。 25 | 26 | * Emacs 扩展 27 | ** dash-at-point 28 | 要求安装 dash。 29 | 30 | ** helm-dash 31 | 参见 [[file:modes/helm-dash.org][helm-dash 实践]] 32 | 33 | ** zeal-at-point 34 | 参见[[file:modes/zeal-at-point.org][zeal-at-point]] 实践 35 | 36 | ** 总结 37 | 使用过程中发现,zeal 下载文档更方便,可以选中多个 docsets 同时下载。zeal-at-point 打开 zeal 速度也要比 helm-dash 在浏览器文档要快,推荐使用 zeal-at-point。 38 | 39 | 但如果想使用 eww 展示 api,则需要 helm-dash。 40 | -------------------------------------------------------------------------------- /content/emacs/python-ide.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: Python IDE 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | -------------------------------------------------------------------------------- /content/emacs/sql-IDE.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: SQL IDE 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * sql-mode 7 | 8 | * sql-indent 9 | 10 | * sqlformat 11 | 参见[[file:modes/sqlformat.org][sqlformat 实践]] 12 | 13 | * sqlup-mode 14 | 参见[[file:modes/sqlup-mode.org][sqlup-mode 实践]] 15 | -------------------------------------------------------------------------------- /content/emacs/yaml-ide.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: yaml-ide 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 8 | * pakcage 9 | 10 | ** yaml-model 11 | 12 | ** yaml-imenu 13 | 14 | ** format-all 15 | 使用 [[https://prettier.io/][prettier]] 来格式化代码。 16 | -------------------------------------------------------------------------------- /content/emacs/yapfify.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: yapfify 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/JorisE/yapfify][yapfify]] 使用 yapf 格式化 Python buffer。可以在某个 buffer 上显式调用它,但是更方便的是,提供了 minor mode“ yapf-mode”,该功能可以自动运行。 8 | 9 | * 配置 10 | -------------------------------------------------------------------------------- /content/english/英语语法新思维.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | #+title: 《英语语法新思维》读书笔记 3 | 4 | * 序言 5 | + 训练和培养自己的英语思维才是学好英语的根本出路。 6 | + 对英语的误解修正: 7 | + 先有语言,然后再重大量的语言实践中总结出人们在使用这种语言时所遵循的一般思维或表达倾向,即所谓的规则。 8 | + 雅法规则是对这些规律性语言现象的归纳和总结,但并不能涵盖所有的语言现象。 9 | + 语法规则要灵活使用,符合语境。 10 | + 词汇和语法都有形式(准确性)、意义(表意性)和用法(合适性)。 11 | + 形式与意义的关系: 12 | + 用短暂动词的完成进行时表示到目前为止的一段时间内重复法生的动作。 13 | + 现在完成进行时在表示重复动作时不能说明具体次数。 14 | + 句子与语境关系: 15 | + 同一个句子放在不同的语境中表达含义不一样。 16 | + 我们要构造出形式正确、能够表达意义、符合语境的句子。 17 | + 英语思维和汉语思维差异: 18 | + 英语中有动作和状态的区分,以及时态方面的问题。 19 | + 了解英语句子的深层结构。 20 | + 本书逻辑体系: 21 | + 初级 22 | + 名词内容:名词短语、限定词、形容词 23 | + 动词内容:五种基本句型。 24 | + 中级 25 | + 从句内容:三大从句。 26 | + 动词内容:时态等谓语形式。 27 | + 高级 28 | + 从句内容:难句。 29 | + 动词内容:三大非谓语。 30 | 31 | * 绪论 名词短语 32 | -------------------------------------------------------------------------------- /content/gRPC/gRPC_practices.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | -------------------------------------------------------------------------------- /content/gfw/gcp.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: google cloud platform 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | -------------------------------------------------------------------------------- /content/gfw/use-dnsmasq-pdnds-openwrt-to-pass-GFW.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 通过 openwrt 翻墙 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | 好久没有更新博客了,最近一周都在尝试使用 openwrt 作为二级路由进行整个局域网的翻墙。今天顺便把我使用过的翻墙技术总结一下,比较一下优劣。 7 | 8 | 首先,一个理想的翻墙环境应该是这样的: 9 | 10 | 1.DNS 解析要能兼顾防污染和 CDN 网络。 11 | 12 | 2.IP 智能解析,国内能访问的直连,访问速度过慢甚至不能访问的通过代理直接访问。 13 | 14 | 3.不影响 SSL 证书。 15 | 16 | 4.过滤广告。 17 | 18 | 看起来是很简单的要求,但是自从大学之后经历了诸多翻墙软件之后,目前能够满意的还是 GoAgent 或者 shadowsocks+vps。 19 | 20 | 这两天尝试通过 openwrt 上面一些软件达到智能上网的目的,主要使用的软件有如下几种: 21 | 22 | 1.chinaDns,chinaDns 配置国内 DNS 和第三方抗污染的 DNS,虽然能实现 DNS 解析分流,但是需要维护一个域名白名单。 23 | 24 | 2.dnsmasq,有 dns cache 和分流的功能。同时还有 dhcp 的功能。但是不支持 dns 请求通过 tcp 进行查询,也就是不能抗污染。 25 | 26 | 3.pdnsd,有 dns cache 的作用,但主要作用还是做通过 tcp 进行 dns 请求的转发。 27 | 28 | 通过这两天的尝试,主要问题如下: 29 | 30 | 1.不能智能区分一个域名到底是走国内还是国外。 31 | 32 | 2.不能智能区分一个 IP 应该直连还是走代理通道。有人直接将 SS 设为透明代理,然后给国内 IP 设置白名单,但是代理软件天生的速度缺陷并不适合这样做。 33 | 34 | 3.通过 VPS,包括我自己也在 DO 上面搭建了一个,但是宽带上(长城宽带)还是很大程度上影响代理的连接速度。并不适合所有国外流量都走代理通道。 35 | -------------------------------------------------------------------------------- /content/gfw/v2ray.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | #+TITLE:v2ray 3 | #+author:刘尚亮 4 | #+email: phenix3443@gmail.com 5 | 6 | * 概述 7 | [[https://www.v2ray.com/][v2ray]] 是一款翻墙工具, 8 | 9 | * 安装 10 | 11 | * 配置的文件 12 | 13 | * 附录 14 | [[http://www.jianshu.com/p/b59150fd8f47][V2Ray 环境搭建]] 15 | -------------------------------------------------------------------------------- /content/gfw/vps.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | #+title:VPS 实践 3 | #+author:刘尚亮 4 | #+email: phenix3443@gmail.com 5 | 6 | * vps 厂商 7 | 8 | ** vultr 9 | 推荐使用 vultr 家的主机,使用我的[[http://www.vultr.com/?ref%3D6862956][推荐链接]] 可以有优惠。 10 | 11 | ** goolge cloud platform(GCP) 12 | 13 | * 一些有意思应用 14 | 15 | ** 代理 16 | 使用 shadowsocks 或者 v2ray 搭建代理。 17 | 18 | ** VPN 19 | 搭建 vpn。 20 | 21 | ** GPS 跟踪 22 | 23 | ** owncloud 24 | 搭建自己的网络存储。 25 | 26 | * 开启 bbr 27 | #+BEGIN_SRC sh 28 | wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh && chmod +x bbr.sh && sudo ./bbr.sh 29 | #+END_SRC 30 | 31 | #+BEGIN_SRC 32 | sysctl net.ipv4.tcp_available_congestion_control 33 | #+END_SRC 34 | 35 | 返回值一般为: 36 | #+begin_example 37 | net.ipv4.tcp_available_congestion_control = reno cubic bbr 38 | #+end_example 39 | 40 | #+BEGIN_SRC sh 41 | sysctl net.ipv4.tcp_congestion_control 42 | #+END_SRC 43 | 44 | 返回值一般为: 45 | #+begin_example 46 | net.ipv4.tcp_congestion_control = bbr 47 | #+end_example 48 | 49 | 50 | #+BEGIN_SRC 51 | sysctl net.core.default_qdisc 52 | #+END_SRC 53 | 54 | 返回值一般为: 55 | #+begin_example 56 | net.core.default_qdisc = fq 57 | #+end_example 58 | 59 | #+BEGIN_SRC sh 60 | lsmod | grep bbr 61 | #+END_SRC 62 | 返回值有 tcp_bbr 模块即说明 bbr 已启动。 63 | 64 | * 安装 shadowsocks 65 | 66 | * 安装 v2ray 67 | -------------------------------------------------------------------------------- /content/git/git.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8; -*- 2 | #+title:git 3 | #+author: 刘尚亮 4 | #+email: phenix3443@gmail.com 5 | -------------------------------------------------------------------------------- /content/git/github.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: github实践 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443@gmail.com 5 | 6 | * 概述 7 | github 是全球最大的程序员交友社区,关于 github 入门使用,[[https://book.douban.com/subject/26462816/][《GitHub入门与实践》]] 进行了很好的描述:github 网站基本界面与使用,如何管理项目,合作项目的 fork 与 pull request(PR),git page,git gist,开发流程 git-follow,以及如何在持续集成中将 github 与其他工具配合使用,概述具有实践指导意义。 8 | 9 | * branch 10 | github 网站本身不支持分支合并,只能是在本地合并后,推送到 github 的远程分支。 11 | 12 | 13 | * gist 14 | 15 | 16 | * tips 17 | 18 | ** 使用 git 协议替代 http 19 | 使用 git 协议可以避免 http 协议下载需要输入密码的麻烦。 20 | #+BEGIN_SRC sh 21 | git config --global url."git@github.com:".insteadOf "https://github.com/" 22 | cat ~/.gitconfig 23 | #+END_SRC 24 | -------------------------------------------------------------------------------- /content/git/gitlab.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8; -*- 2 | #+title:gitlab 3 | #+author: 刘尚亮 4 | #+email: phenix3443@gmail.com 5 | 6 | * GFM 7 | [[https://docs.gitlab.com/ee/user/markdown.html][GitLab Flavored Markdown (GFM) ]] 8 | 9 | * go get 10 | go get 底层使用 git 去操作。可以配置 =.gitconfig= 将 clone 时使用的 http 转为 ssh,来避免 http 需要输入密码的问题: 11 | #+BEGIN_SRC sh 12 | git config --global url."git@mygitlab.com:".insteadOf "http://mygitlab.com/" 13 | #+END_SRC 14 | 15 | #+begin_example 16 | $ cat ~/.gitconfig 17 | [url "git@mygitlab.com:"] 18 | insteadOf = http://mygitlab.com/ 19 | #+end_example 20 | 注意: git@mygitlab.com: 后面有个冒号 =:=, 且 http://mygitlab.com/ 末尾有个斜杠 =/= ,这样 21 | #+BEGIN_SRC sh 22 | git clone https://github.com/golang/go.git 23 | #+END_SRC 24 | 25 | 就变成 26 | #+BEGIN_SRC sh 27 | git clone git@github.com:golang/go.git 28 | #+END_SRC 29 | 30 | 同样还可以处理 github 上的私人仓库: 31 | #+BEGIN_SRC sh 32 | git config --global url."git@github.com:".insteadOf "http://github.com/" 33 | #+END_SRC 34 | -------------------------------------------------------------------------------- /content/git/hubot.org: -------------------------------------------------------------------------------- 1 | #+title:hubot practices 2 | #+startup: overview 3 | 4 | * install[fn:1] 5 | require 6 | #+BEGIN_SRC sh 7 | sudo apt-get install redis-server 8 | sudo npm install -g coffee-script 9 | #+END_SRC 10 | #+BEGIN_SRC sh 11 | sudo npm install -g yo generator-hubot 12 | #+END_SRC 13 | 14 | 15 | #+BEGIN_SRC sh 16 | cd ~/github/ 17 | mkdir myhubot 18 | cd myhubot 19 | yo hubot 20 | #+END_SRC 21 | 22 | 遇到问题:https://github.com/npm/npm/issues/5869 23 | 24 | #+BEGIN_SRC sh 25 | sudo npm cache clean 26 | # 再次执行 27 | yo hubot 28 | #+END_SRC 29 | 运行: 30 | #+BEGIN_SRC sh 31 | bin/hubot 32 | #+END_SRC 33 | * Footnotes 34 | 35 | [fn:1] [[https://hubot.github.com/docs/][hubot doc]] 36 | -------------------------------------------------------------------------------- /content/golang/3rd-lib/beego.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: beego 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://beego.me/][beego]] 是一个简易的 HTTP 开发框架。 8 | 9 | * 安装 10 | 11 | * 配置 12 | 13 | * 使用 14 | 15 | #+BEGIN_SRC sh 16 | bee new project 17 | #+END_SRC 18 | 或者创建 api 项目 19 | #+BEGIN_SRC sh 20 | bee new api-project 21 | cd api-project 22 | bee run 23 | #+END_SRC 24 | 25 | 打开 =http://localhost:8080/= 就能看到简单的启动页面了。 26 | 27 | 常用的其他命令: 28 | + bee pack 打包发布 29 | + bee dockerize 生成 docker 镜像 30 | -------------------------------------------------------------------------------- /content/golang/3rd-lib/collections.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: collections 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://godoc.org/github.com/golang-collections/collections][collection]] 是一些通用的数据结构,包括: 8 | + 队列(Queue) 9 | + 集合(Set) 10 | + 跳表(Skip list) 11 | 12 | 跳表是一种在链接列表的层次结构中存储节点的数据结构。通过使用随机数量的前向链接来跳过列表的某些部分,它的性能类似于二进制搜索树。 13 | 14 | + 伸展树树(Splay Tree) 15 | 16 | [[https://zh.wikipedia.org/wiki/%25E4%25BC%25B8%25E5%25B1%2595%25E6%25A0%2591][伸展树]] 是二叉搜索树的一种,其中对树的每次访问都会导致树的重新排列,从而使当前节点位于最前面。 17 | 18 | + 栈(Stack) 19 | 20 | + 字典树(Trie) 21 | [[https://zh.wikipedia.org/zh-hans/Trie][字典树]] 又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。trie 树常用于搜索提示。如当输入一个网址,可以自动搜索出可能的选择。当没有完全匹配的搜索结果,可以返回前缀最相似的可能。 22 | 23 | + 三叉搜索树(Ternary Search Tree) 24 | 25 | * 安装 26 | #+BEGIN_SRC sh 27 | go get -u github.com/golang-collections/collections 28 | #+END_SRC 29 | 30 | * 使用 31 | 32 | ** 集合 (set) 33 | 参见 [[https://github.com/phenix3443/test/blob/master/golang/collections/set/main.go][示例代码]] 34 | + =func (this *Set) ProperSubsetOf(set *Set) bool= 35 | 36 | 判断 set 是否 this 的真子集 37 | 38 | + =func (this *Set) SubsetOf(set *Set) bool= 39 | 40 | 判断 set 是否 this 的子集 41 | -------------------------------------------------------------------------------- /content/golang/3rd-lib/deepcopy.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: deepcopy 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/antlabs/deepcopy][deepcopy]] 用于 golang 中两个类型的深度拷贝。 8 | -------------------------------------------------------------------------------- /content/golang/3rd-lib/gin.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: gin 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/gin-gonic/gin][gin]] 8 | 9 | [[https://gin-gonic.com/zh-cn/docs/][文档]] 10 | 11 | * 安装 12 | 13 | * 配置 14 | 15 | * 使用 16 | -------------------------------------------------------------------------------- /content/golang/3rd-lib/go-redis.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: go-redis 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/go-redis/redis][go-redis]] 8 | 9 | * 安装 10 | #+BEGIN_SRC sh 11 | go get -u github.com/go-redis/redis 12 | #+END_SRC 13 | 14 | * 使用 15 | -------------------------------------------------------------------------------- /content/golang/3rd-lib/gocache.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: gocache 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://godoc.org/github.com/patrickmn/go-cache][go-cache]] 基于内存的 kv 缓存系统。 8 | -------------------------------------------------------------------------------- /content/golang/3rd-lib/gocheck.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: gocheck 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://labix.org/gocheck][gocheck]] 单元测试。没什么好说的,看手册吧。 8 | -------------------------------------------------------------------------------- /content/golang/3rd-lib/gomock.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: gomock 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/golang/mock][gomock]] 是用于 Go 编程语言的 mock 框架。它与 Go 的内置测试包很好地集成在一起,但是也可以在其他环境中使用。 8 | 9 | * 安装 10 | 11 | * 使用 12 | -------------------------------------------------------------------------------- /content/golang/3rd-lib/monkey.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: monkey 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 关于 monkey patch,就是在程序运行的过程中动态的修改一些模块、类、方法,而不是在静态代码中去修改相应的实现,参考https://zhuanlan.zhihu.com/p/37679547 8 | 9 | 这篇文章记录了 monkey 的实现原理:https://bou.ke/blog/monkey-patching-in-go/ 10 | -------------------------------------------------------------------------------- /content/golang/3rd-lib/mysql-driver.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE:mysql-driver 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://godoc.org/github.com/go-sql-driver/mysql][mysql-driver]] mysql 数据库驱动,配合 sql 库使用。 8 | -------------------------------------------------------------------------------- /content/golang/deepcopy.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: golang deepcopy 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | * 概述 6 | 7 | 浅拷贝(shadow copy)和 深拷贝(deep copy)是经常遇到的两种情况。 8 | 9 | * 实现 10 | golang 中实现的三种方式: 11 | + 序列化后反序列化:json 和 gob 12 | + 反射实现基本类型的拷贝。 13 | 14 | ** json vs gob([[)https://stackoverflow.com/questions/46790190/quicker-way-to-deepcopy-objects-in-golang][参考]]) 15 | encoding/gob 包需要传输类型定义: 16 | #+begin_example 17 | 该实现为流中的每种数据类型编译自定义编解码器,当使用单个 Encoder 传输值流时,效率最高,从而摊销了编译成本。 18 | #+end_example 19 | 当“首次”序列化类型的值时,必须包含/传输类型的定义,因此解码器可以正确地解释和解码流,《[[https://stackoverflow.com/questions/37618399/efficient-go-serialization-of-struct-to-disk/37620399#37620399][将 struct 高效序列化到磁盘]]》对此进行详细说明。: 20 | #+begin_example 21 | gobs 流是自描述的。流中的每个数据项之前都有其类型的规范,以一小套预定义类型表示。 22 | #+end_example 23 | 24 | JSON 格式编码/解码,表示中不包含类型描述。 25 | 26 | ** 对比 27 | https://github.com/antlabs/deepcopy 28 | -------------------------------------------------------------------------------- /content/golang/golang-faq.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: golang 常见问题 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | -------------------------------------------------------------------------------- /content/golang/golang-std-lib.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: golang 标准库 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * [[https://golang.org/pkg/bytes/][bytes]] 7 | 实现了操作 bytes 序列的相关操作,类似 strings。 8 | 9 | * [[https://golang.org/pkg/encoding/binary/][binary]] 10 | 实现 bytes 和数字之间的转换。 11 | 12 | * [[https://golang.org/pkg/errors/][errors]] 13 | 错误处理。 14 | 15 | * [[https://golang.org/pkg/encoding/hex/][hex]] 16 | 实现十六进制字符串 bytes 的转换。 17 | 18 | * [[https://golang.org/pkg/encoding/json/][json]] 19 | 实现了 json 序列化的操作。 20 | 21 | * [[https://golang.org/pkg/net/][net]] 22 | 底层网络接口 23 | 24 | * [[https://golang.org/pkg/net/http/][http]] 25 | http 协议,client,server 相关实现。 26 | * [[https://golang.org/pkg/os/][os]] 27 | 28 | 29 | * [[https://golang.org/pkg/path/filepath/][filepath]] 30 | 31 | * [[https://golang.org/pkg/database/sql/][sql]] 32 | 33 | * [[https://golang.org/pkg/strconv/][strconv]] 34 | 实现字符串和基础数据结构中之间的转换。 35 | 36 | * [[https://golang.org/pkg/strings/][strings]] 37 | 实现了字符串相关操作,例如,查找,切片,strip,split 等。 38 | 39 | * [[https://golang.org/pkg/time/][time]] 40 | 实现日期时间相关的函数。 41 | -------------------------------------------------------------------------------- /content/golang/golang-test-frame.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8; -*- 2 | #+title: golang 3 | #+author: 刘尚亮 4 | #+email: phenix3443@gmail.com 5 | 6 | * 概述 7 | 测试情景: 8 | + local function 9 | + package function 10 | + interface 11 | + struct method 12 | 13 | 14 | 测试方法: 15 | + 子测试(subtests) 16 | + 表格驱动测试(table-driven tests) 17 | + 帮助函数(helpers) 18 | + 网络测试和基准测试(Benchmark) 19 | 20 | 如何编写可测试的代码: 21 | + 使用 interface? 22 | * 测试框架 23 | ** testing 24 | ** gotests 25 | ** gocheck 26 | ** gunit 27 | ** ginkgo 28 | ** gomock 29 | [[https://godoc.org/github.com/golang/mock/gomock][gomock]] 似乎是和 interface 有关? 30 | ** mockery 31 | [[https://github.com/vektra/mockery][mockery]] 32 | ** testify 33 | ** monkey 34 | [[https://github.com/bouk/monkey][monkey]] 35 | 36 | 37 | * 参考文章 38 | -------------------------------------------------------------------------------- /content/golang/lang/channel.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: golang channel 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 如何优雅的关闭channel https://www.jianshu.com/p/d24dfbb33781 8 | -------------------------------------------------------------------------------- /content/golang/lang/context.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: context 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | #+STARTUP: overview 6 | #+OPTIONS: author:nil date:nil creator:nil timestamp:nil validate:nil num:nil 7 | -------------------------------------------------------------------------------- /content/golang/lang/defer.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: golang defer 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 坑 7 | -------------------------------------------------------------------------------- /content/golang/lang/gc.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: Golang垃圾回收机制 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 什么是垃圾回收 7 | 8 | * GC 常见算法 9 | 10 | * golang 的垃圾回收 11 | 12 | http://legendtkl.com/2017/04/28/golang-gc/ 13 | 14 | 三色标记法,主要流程如下: 15 | + 所有对象最开始都是白色。 16 | + 从 root 开始找到所有可达对象,标记为灰色,放入待处理队列。 17 | + 遍历灰色对象队列,将其引用对象标记为灰色放入待处理队列,自身标记为黑色。 18 | + 处理完灰色对象队列,执行清扫工作 19 | 20 | * 如何调优 21 | 22 | * 注意事项 23 | -------------------------------------------------------------------------------- /content/golang/lang/gopath.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: GOPATH 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | Go 路径用于解析 import 语句。它实现和文档位于 go/build 包。 8 | 9 | GOPATH 环境变量列出了查找 Go 代码的位置。在 Unix 上,该值是以冒号分隔的字符串。在 Windows 上,该值是以分号分隔的字符串。在 Plan 9 中,值是一个列表。 10 | 11 | 如果未设置环境变量,GOPATH 默认为用户主目录中名为“go”的子目录(在 Unix 上为 =$HOME/go= ,在 Windows 上为 =%USERPROFILE%\go= ),除非该目录包含 Go 分发。运行 =go env GOPATH= 查看当前的 GOPATH。 12 | 13 | GOPATH 中列出的每个目录都必须具有规定的结构: 14 | + src 目录包含源代码。 src 下面的路径确定导入路径或可执行文件名。 15 | + pkg 目录包含已安装的包对象。在 Go 树一样,每个目标操作系统和体系结构对都有自己的子目录 pkg(pkg/GOOS_GOARCH)。 16 | + bin 目录保存已编译的命令。每个命令都以其源目录命名,但仅以最终元素命名,如果设置了 GOBIN 环境变量,则命令将安装到它命名的目录而不是 DIR/bin。 GOBIN 必须是绝对路径。 17 | 18 | 如果 DIR 是 GOPATH 中列出的目录,则可 19 | + 以将包含 DIR/src/foo/bar 源的包通过“foo/bar”导入。 20 | + go build 产生的编译结果位于 =DIR/bin/bar= 。 21 | + 编译形式安装到 =DIR/pkg/GOOS_GOARCH/foo/bar.a= 。 22 | 23 | * 设置 24 | 参见https://github.com/golang/go/wiki/SettingGOPATH 25 | -------------------------------------------------------------------------------- /content/golang/std-lib/errors.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: errors 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://golang.org/pkg/errors/][errors]] 包错误实现了处理错误的功能。 8 | 9 | 函数 New 创建仅包含文本消息的错误。 10 | 11 | Unwrap,Is 和 As 函数可处理可能会包装其他错误的错误。如果错误的类型具有方法 Unwrap,则该错误将包装另一个错误。 12 | -------------------------------------------------------------------------------- /content/golang/std-lib/fmt.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: fmt 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://golang.org/pkg/fmt/][fmt]] 使用与 C 的 printf 和 scanf 类似的功能实现格式化的 I/O。格式“verbs”派生自 C,但更简单。 8 | 9 | * 打印 10 | 常用格式化字符 11 | + =%v= 以默认格式打印值,如果是 struct, =%+v= 会打印字段名。 12 | 13 | * func Errof 14 | #+BEGIN_SRC go 15 | func Errorf(format string, a ...interface{}) error 16 | #+END_SRC 17 | Errorf 根据格式说明符设置格式,并返回字符串作为满足 error 的值。 18 | 19 | 如果格式说明符包含 =%w= 动词,并且后续也有 error 类型的实参,则返回的 error 将实现 Unwrap 方法,以返回该实参。包含多个 =%w= 动词或向其提供未实现 error 接口的操作数是无效的。另外, =%w= 动词是 =%v= 的同义词。 20 | -------------------------------------------------------------------------------- /content/golang/std-lib/http.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: net/http 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://golang.org/pkg/net/http/][http]] 8 | -------------------------------------------------------------------------------- /content/golang/std-lib/json.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: json 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://golang.org/pkg/encoding/json/][json]] 8 | -------------------------------------------------------------------------------- /content/golang/std-lib/log.org: -------------------------------------------------------------------------------- 1 | 2 | # -*- coding:utf-8-*- 3 | #+TITLE: log 4 | #+AUTHOR: liushangliang 5 | #+EMAIL: phenix3443+github@gmail.com 6 | 7 | * 概述 8 | [[https://golang.org/pkg/log/][log]] 9 | -------------------------------------------------------------------------------- /content/golang/std-lib/rand.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: rand 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://golang.org/pkg/math/rand/][rand]] 8 | 9 | * func Int 10 | #+BEGIN_SRC go 11 | func Int() int 12 | #+END_SRC 13 | 返回一个非负的伪随机整数。 14 | 15 | * func Intn 16 | #+BEGIN_SRC go 17 | func Intn() int 18 | #+END_SRC 19 | 返回一个 [0,n) 范围内的非负的伪随机整数。 20 | 21 | * func Perm 22 | #+BEGIN_SRC go 23 | func Perm(n int) []int 24 | #+END_SRC 25 | Perm 返回 [0,n)的伪随机排列。 26 | 27 | * func Seed 28 | #+BEGIN_SRC go 29 | func Seed(seed int64) 30 | #+END_SRC 31 | 32 | 使用 seed 来初始化随机数集合。 Rand.Seed 方法不同,Seed 可以安全地同时使用。 33 | 34 | * func Shuffle 35 | #+BEGIN_SRC go 36 | func Shuffle(n int, swap func(i, j int)) 37 | #+END_SRC 38 | 39 | 使用默认的 Source 伪随机化元素的顺序。 n 是元素数。swap 交换索引为 i 和 j 的元素。 40 | -------------------------------------------------------------------------------- /content/golang/std-lib/stconv.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: strconv 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 8 | [[https://golang.org/pkg/strconv/][strconv]] 9 | -------------------------------------------------------------------------------- /content/golang/std-lib/strings.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: strings 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://golang.org/pkg/strings/][strings]] 实现简单的函数来处理 UTF-8 编码的字符串。 8 | 9 | * 使用 10 | -------------------------------------------------------------------------------- /content/golang/std-lib/sync.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: sync 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://golang.org/pkg/sync/][sync]] 包提供基本的同步原语,如互斥锁。除了 Once 和 WaitGroup 类型之外,大多数类型都是供低级库例程使用的。更高层的同步最好通过 channel 和 communication 来完成。 8 | 9 | 包含此包中定义的类型的值不应被复制。 10 | 11 | * once 12 | 13 | * waitgroup 14 | WaitGroup 等待一系列 goroutine 完成。主 goroutine 调用 Add 来设置要等待的 goroutines 的数量。然后,每个 goroutine 运行并在完成后调用 Done。同时,Wait 可以用来阻塞,直到所有的 goroutines 都完成了。 15 | -------------------------------------------------------------------------------- /content/golang/tools/dlv.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: dlv 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/go-delve/delve][delve]] 是 Go 语言的调试器。 8 | 9 | * 安装 10 | #+BEGIN_SRC sh 11 | go get github.com/go-delve/delve/cmd/dlv 12 | #+END_SRC 13 | * 配置 14 | 15 | * 使用 16 | 出现错误: 17 | #+BEGIN_SRC sh 18 | Could not attach to pid 6814: set /proc/sys/kernel/yama/ptrace_scope to 0 19 | #+END_SRC 20 | 原因: 21 | https://www.kernel.org/doc/Documentation/security/Yama.txt, you will need to set that to 0 in order to attach to a running process. 22 | 解决办法: 23 | #+BEGIN_SRC sh 24 | echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope 25 | #+END_SRC 26 | -------------------------------------------------------------------------------- /content/golang/tools/errcheck.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: errcheck 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/kisielk/errcheck][errcheck]] 是一个用于检查 go 程序中未经处理的错误的程序。 8 | 9 | * 安装 10 | #+BEGIN_SRC sh 11 | go get -u github.com/kisielk/errcheck 12 | #+END_SRC 13 | 14 | errcheck 需要 Go 1.9 或更高版本,并且取决于 golang.org/x/tools 存储库中的包 go / packages。 15 | -------------------------------------------------------------------------------- /content/golang/tools/gb.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: gb 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[http://getgb.io/][gb]] 将单个项目当做 workspace,与 $GOPATH 无关。 8 | 9 | gb 两个重要的目录 10 | + src/ 业务代码 11 | + vendor/src/ 第三方的依赖 12 | 13 | * 安装 14 | #+BEGIN_SRC sh 15 | go get github.com/constabulary/gb/... 16 | #+END_SRC 17 | 18 | * 使用 19 | 20 | ** gb([[https://godoc.org/github.com/constabulary/gb/cmd/gb-vendor][doc]]) 21 | 22 | #+BEGIN_SRC sh :exports both :results output scalar 23 | gb help 24 | #+END_SRC 25 | 26 | ** gb-vendor 27 | 28 | 使用 gb vendor([[https://godoc.org/github.com/constabulary/gb/cmd/gb-vendor][doc]])处理依赖,例如: 29 | #+BEGIN_SRC 30 | gb vendor fetch github.com/urfave/cli 31 | #+END_SRC 32 | 33 | 34 | ** gitlab CI 35 | -------------------------------------------------------------------------------- /content/golang/tools/go-fix.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: go-fix 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | * 概述 6 | 用于将你的 Go 代码从旧的发行版迁移到最新的发行版,它主要负责简单的、重复的、枯燥无味的修改工作,如果像 API 等复杂的函数修改,工具则会给出文件名和代码行数的提示以便让开发人员快速定位并升级代码。Go 开发团队一般也使用这个工具升级 Go 内置工具以及 谷歌内部项目的代码。go fix 之所以能够正常工作是因为 Go 在标准库就提供生成抽象语法树和通过抽象语法树对代码进行还原的功能。该工具会尝试更新当前目录下的所有 Go 源文件,并在完成代码更新后在控制台输出相关的文件名称。 7 | * 安装 8 | * 使用 9 | -------------------------------------------------------------------------------- /content/golang/tools/go-language-server.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: go-langserver 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/sourcegraph/go-langserver][go-langserver]] 是一个 Go 语言服务器,它使用语言服务器协议(Language Server Protocol)。它支持编辑器功能,例如 Go 项目的 go-to-definition,hover 和 find-references。 8 | 9 | * 安装 10 | #+BEGIN_SRC sh 11 | go get -u github.com/sourcegraph/go-langserver 12 | #+END_SRC 13 | -------------------------------------------------------------------------------- /content/golang/tools/go-vet.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: govet 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | #+STARTUP: overview 6 | #+OPTIONS: author:nil date:nil creator:nil timestamp:nil validate:nil num:nil 7 | * 概述 8 | Vet 检查 Go 源代码并报告可疑构造,例如其参数与格式字符串不对齐的 Printf 调用。 Vet 使用的启发式方法并不能保证所有报告都是真正的问题,但它可以找到编译器未捕获的错误。 9 | 10 | 更多请参考 https://golang.org/cmd/vet/ 11 | 12 | * 安装 13 | 14 | * 使用 15 | 通常通过 go 命令调用 Vet。此命令将检查当前目录中的包: 16 | #+BEGIN_SRC sh 17 | go vet 18 | #+END_SRC 19 | -------------------------------------------------------------------------------- /content/golang/tools/gocode.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: gocode 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | 7 | * 概述 8 | [[https://github.com/mdempsky/gocode][gocode]] 是一个用来进行 golang 语法分析的模块,现在已经不再维护,不要使用该功能。 9 | 10 | * 安装 11 | #+BEGIN_SRC 12 | go get -u github.com/nsf/gocode 13 | #+END_SRC 14 | 15 | * 配置 16 | 17 | * 使用 18 | -------------------------------------------------------------------------------- /content/golang/tools/godef.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: godef 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/rogpeppe/godef][godef]] 用于查找定义。 8 | 9 | * 安装 10 | #+BEGIN_SRC sh 11 | go get github.com/rogpeppe/godef 12 | #+END_SRC 13 | -------------------------------------------------------------------------------- /content/golang/tools/goimports.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: goimports 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://godoc.org/golang.org/x/tools/cmd/goimports][goimports]] 更新您的 Go 导入行,添加缺失的行并删除未引用的行。 8 | 9 | * 安装 10 | #+BEGIN_SRC sh 11 | go get -u golang.org/x/tools/cmd/goimports 12 | #+END_SRC 13 | 14 | 除了修复导入之外,goimports 还以与 gofmt 相同的样式格式化您的代码,因此它可以用作编辑器的 gofmt-on-save 挂钩的替代品。对于 emacs,请确保您拥有最新的 go-mode.el: 15 | -------------------------------------------------------------------------------- /content/golang/tools/golint.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: golint 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | #+STARTUP: overview 6 | #+OPTIONS: author:nil date:nil creator:nil timestamp:nil validate:nil num:nil 7 | * 概述 8 | 9 | Golint 与 gofmt 不同。 Gofmt 重新格式化 Go 源代码,而 golint 打印出样式错误。 10 | 11 | Golint 与 govet 不同。 Govet 关心的是正确性,而 golint 则关注编码风格。 Golint 在谷歌使用,它寻求匹配开源 Go 项目的公认风格。golint 仅是提出建议。 Golint 并不完美,既有误报。不要将其输出视为黄金标准。我们不会添加编译指示或其他旋钮来抑制特定警告,因此不要指望或要求代码完全“完全不告警”。 Golint 为 Effective Go 和 CodeReviewComments 中列出的许多可机械检查项目提出建议。 12 | 13 | * 安装 14 | #+BEGIN_SRC sh 15 | go get -u golang.org/x/lint/golint 16 | #+END_SRC 17 | -------------------------------------------------------------------------------- /content/golang/tools/gopls.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE:gopls 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/golang/tools/blob/master/gopls/README.md][gopls]] (发音为“go please”)是 Go 的语言服务器协议(LSP)的实现。 LSP 允许使用类似 IDE 的功能扩展任何文本编辑器。 8 | 9 | * 安装 10 | 要安装或更新 gopls,请运行: 11 | #+BEGIN_SRC sh 12 | go get golang.org/x/tools/gopls@latest 13 | #+END_SRC 14 | 15 | 不要使用 =-u= 标志,因为它会将您的依赖项更新为不兼容的版本。 16 | 17 | 如果您看到此错误: 18 | #+begin_example 19 | $ go get golang.org/x/tools/gopls@latest 20 | go: cannot use path@version syntax in GOPATH mode 21 | #+end_example 22 | 运行 ~GO111MODULE=on go get golang.org/x/tools/gopls@latest~ 。如果您使用 Go 模块,则需要将编辑器打开到包含 go.mod 文件的目录。 23 | 24 | * 配置 25 | 26 | 27 | * 使用 28 | -------------------------------------------------------------------------------- /content/golang/tools/goreporter.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: goreporter 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/360EntSecGroup-Skylar/goreporter][goreporter]] 整合其他工具,做代码质量检测,生成网页版报告。 8 | * 安装 9 | 10 | * 使用 11 | -------------------------------------------------------------------------------- /content/golang/tools/gotests.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: gotests 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/cweill/gotests][gotests]] 使编写 Go 测试变得容易。这是一个 Golang 命令行工具,可根据其目标源文件的函数和方法签名生成表驱动的测试。测试文件中的所有新依赖项都将自动导入。 8 | -------------------------------------------------------------------------------- /content/golang/tools/govendor.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: govendor 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 8 | * 安装 9 | #+BEGIN_SRC sh 10 | go get -u github.com/kardianos/govendor 11 | #+END_SRC 12 | * 配置 13 | 14 | * 使用 15 | -------------------------------------------------------------------------------- /content/golang/tools/guru.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: guru 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://godoc.org/golang.org/x/tools/cmd/guru][Guru]] 代码导航工具。 8 | 9 | * 安装 10 | #+BEGIN_SRC sh 11 | go get golang.org/x/tools/cmd/guru 12 | #+END_SRC 13 | 14 | * 使用 15 | 这里有 [[http://www.jianshu.com/p/994e85e21135][说明]] 。 16 | 17 | [[https://docs.google.com/document/d/1_Y9xCEMj5S-7rv2ooHpZNH15JgRT5iM742gJkw5LtmQ/edit][原版文档]] 18 | -------------------------------------------------------------------------------- /content/golang/tools/staticcheck.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: staticcheck 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://staticcheck.io/][staticcheck]] 是 Go 的一套静态分析工具。它专注于查找错误,代码简单,性能和编辑器集成。 8 | 9 | Staticcheck 是开源的,免费提供。通过新的和改进的检查不断增强。 10 | 11 | * 安装 12 | #+BEGIN_SRC sh 13 | go get honnef.co/go/tools/cmd/staticcheck 14 | #+END_SRC 15 | 16 | * 配置 17 | 18 | * 使用 19 | 参见 https://staticcheck.io/docs/ 20 | -------------------------------------------------------------------------------- /content/golang/tools/unconvert.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: unconvert 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/mdempsky/unconvert][unconvert]] 程序分析 Go 包以识别不必要的类型转换;即表达式 T(x),其中 x 已经具有类型 T. 8 | 9 | * 安装 10 | #+BEGIN_SRC sh 11 | go get -u github.com/mdempsky/unconvert 12 | #+END_SRC 13 | 14 | * 使用 15 | + 使用 -v 标志,unrevert 还将打印源行和插入符号以指示其中不必要的转换位置。 16 | + 使用 -apply 标志,unrevert 将重写 Go 源文件,处理不必要的类型转换。 17 | + 使用 -all 标志,unrevert 将分析所有可能的 GOOS/GOARCH 组合下的 Go 包,并仅识别在所有情况下都不必要的转换。 18 | 19 | 例如,syscall.Timespec 的 Sec 和 Nsec 字段在 linux/amd64 下是 int64,在 linux/386 下是 int32。出现在 linux/amd64-only 文件中的 int64(ts.Sec)转换将被识别为不必要,但如果它出现在为 linux/amd64 和 linux/386 编译的文件中,它将被保留。 20 | -------------------------------------------------------------------------------- /content/img/centos-practices/net-tools-vs-iproute2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/centos-practices/net-tools-vs-iproute2.png -------------------------------------------------------------------------------- /content/img/django/hello.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/django/hello.png -------------------------------------------------------------------------------- /content/img/django/runserver-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/django/runserver-1.png -------------------------------------------------------------------------------- /content/img/django/runserver-hello.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/django/runserver-hello.png -------------------------------------------------------------------------------- /content/img/django/web-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/django/web-1.png -------------------------------------------------------------------------------- /content/img/latex-practices/change-default-repository-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/latex-practices/change-default-repository-1.png -------------------------------------------------------------------------------- /content/img/latex-practices/change-default-repository-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/latex-practices/change-default-repository-2.png -------------------------------------------------------------------------------- /content/img/latex-practices/latex-workflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/latex-practices/latex-workflow.png -------------------------------------------------------------------------------- /content/img/latex-practices/workflow-compare.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/latex-practices/workflow-compare.jpg -------------------------------------------------------------------------------- /content/img/robotframework-practices/start_ride.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/robotframework-practices/start_ride.png -------------------------------------------------------------------------------- /content/img/se-beauty/se-map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/se-beauty/se-map.png -------------------------------------------------------------------------------- /content/img/tinyhttpd-analysis/cgi-test-sh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/tinyhttpd-analysis/cgi-test-sh.png -------------------------------------------------------------------------------- /content/img/tinyhttpd-analysis/display-abnormal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/tinyhttpd-analysis/display-abnormal.png -------------------------------------------------------------------------------- /content/img/tinyhttpd-analysis/display-normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/tinyhttpd-analysis/display-normal.png -------------------------------------------------------------------------------- /content/img/tinyhttpd-analysis/fork-pipe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/tinyhttpd-analysis/fork-pipe.png -------------------------------------------------------------------------------- /content/img/tinyhttpd-analysis/http-get-request.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/tinyhttpd-analysis/http-get-request.png -------------------------------------------------------------------------------- /content/img/tinyhttpd-analysis/http-post-request.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/tinyhttpd-analysis/http-post-request.png -------------------------------------------------------------------------------- /content/img/tinyhttpd-analysis/http-request-format.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/tinyhttpd-analysis/http-request-format.png -------------------------------------------------------------------------------- /content/img/tinyhttpd-analysis/http-response-format.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/tinyhttpd-analysis/http-response-format.png -------------------------------------------------------------------------------- /content/img/tinyhttpd-analysis/http-response.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/tinyhttpd-analysis/http-response.png -------------------------------------------------------------------------------- /content/img/tinyhttpd-analysis/index.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/tinyhttpd-analysis/index.png -------------------------------------------------------------------------------- /content/img/tinyhttpd-analysis/tinyhttpd-work-flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/tinyhttpd-analysis/tinyhttpd-work-flow.png -------------------------------------------------------------------------------- /content/img/ubuntu-practices/input-config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/ubuntu-practices/input-config.png -------------------------------------------------------------------------------- /content/img/ubuntu-practices/keyboard-layout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/ubuntu-practices/keyboard-layout.png -------------------------------------------------------------------------------- /content/img/vpn-practices/L2TP.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/vpn-practices/L2TP.jpg -------------------------------------------------------------------------------- /content/img/vpn-practices/Site-to-site-pptp-example.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phenix3443/notebook/14c2d26e96974f4c36107362180d2151a23f1b9a/content/img/vpn-practices/Site-to-site-pptp-example.jpg -------------------------------------------------------------------------------- /content/java/java.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: java 实践 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | * 安装 8 | ** open-jdk 9 | #+BEGIN_SRC sh 10 | apt install -y default-jdk 11 | #+END_SRC 12 | 13 | ** oracle-jdk 14 | #+BEGIN_SRC sh 15 | add-apt-repository ppa:linuxuprising/java 16 | apt update 17 | apt install -y oracle-java11-installer oracle-java11-set-default 18 | #+END_SRC 19 | 20 | * 配置 21 | * 使用 22 | -------------------------------------------------------------------------------- /content/journey/20180616-guangdong-valley.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE:广东大峡谷游览 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 景点概述 7 | 8 | * 往返交通 9 | 10 | * 衣食住行 11 | 12 | * 景点路线 13 | 14 | ** 英西峰林走廊 15 | 16 | ** 广东大峡谷 17 | -------------------------------------------------------------------------------- /content/js/npm.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: npm 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 8 | * 安装 9 | 10 | * 配置 11 | ** 切换源 12 | #+BEGIN_SRC sh 13 | npm config set registry https://registry.npm.taobao.org 14 | #+END_SRC 15 | -------------------------------------------------------------------------------- /content/js/yarn.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: yarn 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | yarn 是一个包管理工具。更多信息参考[[https://juejin.im/post/5b14909de51d4506bd72bb61][《npm\yarn\pnpm》]] 8 | 9 | 10 | * 安装 11 | #+BEGIN_SRC sh 12 | curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - 13 | echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list 14 | apt update 15 | apt install yarn 16 | #+END_SRC 17 | 测试安装成功: 18 | #+BEGIN_SRC sh 19 | yarn --version 20 | #+END_SRC 21 | -------------------------------------------------------------------------------- /content/linux/linux-cmd-tools.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | #+title:linux 常用命令说明 3 | #+author: 刘尚亮 4 | #+email: phenix3443@gmail.com 5 | #+startup:overview 6 | 7 | * 查找 8 | + find 9 | + locate 10 | + whereis 11 | + which 12 | 13 | 14 | * 数据统计 15 | + awk 16 | + sed 17 | + wc 18 | + uniq 19 | + cut 20 | + grep 21 | + head 22 | + tail 23 | + tee 24 | 25 | * 系统性能 26 | + ps 27 | + psstack 28 | + pstree 29 | + sar 30 | + ulimit 31 | 32 | * 程序调试 33 | + gdb 34 | + pstack 35 | + strace 36 | + pmap 37 | + readelf 38 | + objdump 39 | + nm 40 | + ldd 41 | + sar 42 | + c++filt 43 | 44 | * 网络 45 | + ip 46 | + tracert 47 | + route 48 | + netstat 49 | + ss 50 | + whois 51 | + ifconfig 52 | + ping 53 | 54 | * 打包压缩解压 55 | + gzip 56 | + gunzip 57 | + tar 58 | + xz 59 | 60 | * 文件传输 61 | + ftp 62 | + scp 63 | + rsync 64 | + rzsz 65 | 66 | * 其他 67 | + cron 68 | + nohup 69 | + xargs 70 | -------------------------------------------------------------------------------- /content/linux/linux-high-performance-coding.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | #+title:Linux高性能服务器编程读书笔记 3 | #+author:刘尚亮 4 | #+email:phenix3443@gmail.com 5 | 6 | 7 | * TCP/IP 协议族 8 | 9 | * IP 协议详解 10 | 11 | * TCP 协议详解 12 | 13 | * TCP/IP 通信案例 14 | 15 | * linux 网络编程基础 16 | 17 | * 高级 IO 函数 18 | 19 | * linux 服务器程序规范 20 | 21 | * 高性能服务器程序框架 22 | 23 | * IO 复用 24 | 25 | * 信号 26 | 27 | * 定时器 28 | 29 | * 高性能 IO 框架库 libevent 30 | 31 | * 多进程编程 32 | 33 | * 多线程编程 34 | 35 | * 进程池和线程池 36 | 37 | * 服务器调制、调试和测试 38 | -------------------------------------------------------------------------------- /content/linux/powerline-shell.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: powerline-shell 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 8 | [[https://github.com/b-ryan/powerline-shell][powerline-shell]] 是 Bash,ZSH,Fish 和 tcsh 的一个漂亮而有用的提示生成器。 9 | 10 | + 显示有关 git/svn/hg/fossil 分支的一些重要细节(见下文) 11 | + 如果最后一个命令退出并显示失败代码,则更改颜色。 12 | + 如果您对目录树太深,请使用省略号缩短显示的路径。 13 | + 显示当前的 Python virtualenv 环境。 14 | + 它易于定制和扩展。 15 | 16 | 生成的提示类似于 [[file:powerline.org][powerline]] ,但此项目与 powerline 线无关。 17 | 18 | * 安装 19 | 20 | * 配置 21 | 22 | * 使用 23 | -------------------------------------------------------------------------------- /content/linux/tools/awk.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: awk 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | * 内置函数 8 | ** match 9 | 只打印正则表达式匹配的部分。 10 | #+BEGIN_SRC awk 11 | gawk 'match($0, pattern, ary) {print ary[1]}' 12 | # example: 13 | echo "abcdef" | gawk 'match($0, /b(.*)e/, a) {print a[1]}' 14 | #+END_SRC 15 | -------------------------------------------------------------------------------- /content/linux/tools/cloc.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: cloc 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/AlDanial/cloc][cloc]] 是一个源码统计工具。 8 | -------------------------------------------------------------------------------- /content/linux/tools/cut.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: cut 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | -------------------------------------------------------------------------------- /content/linux/tools/echo.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: echo 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 常用参数: 8 | #+BEGIN_EXAMPLE 9 | -e 默认不会解释字符串中的转义字符,添加选项解释字符串中的转义字符。 10 | -n 选项输出后不在末尾进行换行。 11 | #+END_EXAMPLE 12 | -------------------------------------------------------------------------------- /content/linux/tools/fio.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: fio 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | fio 是一种 I/O 工具,用于基准测试和压力/硬件验证。它支持 19 种不同类型的 I/O 引擎(sync,mmap,libaio,posixaio,SG v3,splice,null,network,syslet,guasi,solarisaio 等),I/O 优先级(适用于较新的 Linux 内核) ,评估 I/O,分叉或线程作业等等。它可以在块设备和文件上工作。fio 以简单易懂的文本格式接受职位描述。包含几个示例作业文件。fio 显示各种 I/O 性能信息,包括完整的 IO 延迟和百分位数。Fio 在许多地方广泛使用,用于基准测试,QA 和验证目的。它支持 Linux,FreeBSD,NetBSD,OpenBSD,OS X,OpenSolaris,AIX,HP-UX,Android 和 Windows。[fn:1] 8 | 9 | * Footnotes 10 | 11 | [fn:1] https://blog.51cto.com/shaonian/2319175 12 | -------------------------------------------------------------------------------- /content/linux/tools/grep.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: grep 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | -------------------------------------------------------------------------------- /content/linux/tools/head-tail.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: head and tail 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | head 和 tail 分别用来输出文件的头部和尾部。 8 | 9 | * 示例 10 | ** 输出指定区域 11 | 比如要显示 test.log 1000-2000 行之间的文本: 12 | #+BEGIN_SRC sh 13 | head -n 2000 test.log | tail -n 1000 14 | #+END_SRC 15 | -------------------------------------------------------------------------------- /content/linux/tools/ifconfig.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: ifconfig 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | * 概述 6 | * 常用参数 7 | -------------------------------------------------------------------------------- /content/linux/tools/iostat.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: iostat 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | #+STARTUP: overview 6 | 7 | * 概述 8 | iostat 命令用于观察 I/O 设备负载,以便定位问题和进一步优化。 9 | 10 | * 使用 11 | 使用 =-x= 参数打印详细信息: 12 | #+BEGIN_SRC sh 13 | iostat -x 14 | #+END_SRC 15 | 16 | 还可以持续打印日志,比如,每个 2 秒,总共打印 3 次。 17 | #+BEGIN_SRC sh 18 | iostat 2 3 19 | #+END_SRC 20 | 21 | * 实践 22 | #+BEGIN_EXAMPLE 23 | Linux 4.4.0-117-generic (iZwz93bc56k6c6veekzhypZ) 04/21/19 _x86_64_ (2 CPU) 24 | 25 | avg-cpu: %user %nice %system %iowait %steal %idle 26 | 0.11 0.00 0.09 0.00 0.00 99.79 27 | 28 | Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util 29 | vda 0.00 0.13 0.01 0.18 0.09 3.02 33.83 0.00 6.74 2.38 6.87 0.28 0.01 30 | #+END_EXAMPLE 31 | 32 | 第一行末尾表明 CPU 是双核的(2 CPU)。 33 | 34 | 第二行是 CPU 相关统计信息。 35 | 36 | + cpu信息 37 | 38 | + IO信息 39 | 40 | 主要关注以下几个参数: 41 | 42 | + aqu-sz 43 | 44 | 发给设备的请求的平均队列长度。显而易见,该值越小越好。 45 | 46 | + %util 47 | 48 | 向设备发出 I/O 请求所经过的时间百分比(设备的带宽利用率)。对于按顺序提供请求的设备,此值接近 100%时,会发生设备饱和。 但对于并行处理请求的设备,例如 RAID 阵列和现代 SSD,此数字并不反映其性能限制。 49 | -------------------------------------------------------------------------------- /content/linux/tools/less.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: less 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | #+STARTUP: overview 6 | #+OPTIONS: author:nil date:nil creator:nil timestamp:nil validate:nil num:nil 7 | * 概述 8 | less 与 more 类似,用来对文件或其他输出进行分页展示。但它的功能更多 9 | 10 | * 使用 11 | less [options] filename .. 12 | 13 | 14 | ** options 15 | + ~-i~ 搜索时忽略大小写。 16 | + ~-N~ 显示行号。 17 | 18 | 19 | ** command 20 | + h 显示帮助页面。 21 | + q 退出。 22 | + f 向前滚动一个屏幕。 23 | + b 向后滚动一个屏幕。 24 | + d 向前滚动半个屏幕。 25 | + u 向后滚动半个屏幕 26 | + j 向前滚动一行。 27 | + k 向后滚动一行。 28 | + g 文档顶部。 29 | + G 文档底部。 30 | + m 后跟一个小写字母,使用该字母标记当前位置。 31 | + ' 跳转到之前标记的地方。 32 | + /pattern 向前搜索。 33 | + ?pattern 向后搜索。 34 | + n 向前重复之前的搜索。 35 | + N 向前重复之前的搜索。 36 | + &pattern 只显示包含 pattern 的行。 37 | 38 | * 示例 39 | -------------------------------------------------------------------------------- /content/linux/tools/locate.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: locate 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 在整个系统范围内查找文件,windows 上类似的工具是 everything search。 8 | 9 | 查找的数据库通过 =updatedb= 命令进行更新。 10 | 11 | 如果未指定 --regex,则 PATTERN 可以包含通配符。如果任何 PATTERN 不包含通配符,则 locate 的行为就像是模式是 * PATTERN *。 12 | 13 | #+BEGIN_EXAMPLE 14 | locate [OPTION]... PATTERN... 15 | #+END_EXAMPLE 16 | 17 | 注意,可以包含多个 pattern。 18 | 19 | 常用参数: 20 | #+BEGIN_EXAMPLE 21 | -A 仅打印与所有 PATTERN 匹配的条目,而不是仅要求其中一个匹配。 22 | 可用此来匹配文件路径多个词组,精确匹配文件。 23 | -b 参数来只查找 basename,而扩展为*basename* 24 | -i 忽略大小写。 25 | -r 使用正则表达式。 26 | #+END_EXAMPLE 27 | -------------------------------------------------------------------------------- /content/linux/tools/logrotate.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: logrotate 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | -------------------------------------------------------------------------------- /content/linux/tools/ls.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: ls 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | * 概述 6 | ls 用于显示目录内容。 7 | 8 | 常用参数: 9 | #+BEGIN_EXAMPLE 10 | -a 显示隐藏文件 11 | -A 不显示 . 和 .. 12 | -B 不显示以~结尾的文件 13 | -d 只显示目录本身,而不显示其内容 14 | -h 结合-l 或-s 使用,打印人类可读的大小 15 | -I, --ignore=PATTERN 忽略匹配正则表达式的文件 16 | -l 长格式显示文件 17 | -m 使用逗号分割要显示的文件文件,最后结果是一个字符串列表。 18 | -R 递归打印子目录内容。 19 | -S 按照文件大小排序,从大到小 20 | --sort=WORD 按照 WORD 而不是名字排序: none (-U), size (-S), time (-t),version (-v), extension (-X) 21 | -t 按修改时间排序 22 | --time=WORD 按照 WORD 而不是修改时间排序,可以 atime 或 access 23 | #+END_EXAMPLE 24 | 25 | * 举例 26 | 27 | ** 只显示目录 28 | 1. 利用 ls 命令的 -d 选项: 29 | #+BEGIN_SRC sh 30 | ls -d */ 31 | #+END_SRC 32 | 33 | 2. 利用 ls 命令的 -F 选项: 34 | #+BEGIN_SRC sh 35 | ls -F |grep "/$" 36 | #+END_SRC 37 | 38 | ** 只显示文件 39 | 1. 利用 ls 命令的 -F 选项: 40 | #+BEGIN_SRC sh 41 | ls -F |grep -Ev '@$|/$' 42 | #+END_SRC 43 | -------------------------------------------------------------------------------- /content/linux/tools/nc.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: nc 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | * 概述 6 | 使用 nc 可以方便的建立 tcp、udp 连接,利用这个特性可以做很多事情:建立监听端口,传输文件,端口扫描,代理等。 7 | 8 | 常用的参数: 9 | #+BEGIN_EXAMPLE 10 | -l 指定监听模式。 11 | #+END_EXAMPLE 12 | 13 | * 示例 14 | 15 | ** 建立服务器 16 | 监听本地 1234 端口,接受到的消息可以原样打印出来。可以用来做 mock 服务器。 17 | 18 | #+BEGIN_SRC sh 19 | nc -l 1234 20 | #+END_SRC 21 | 22 | ** 传输文件 23 | 原理:一端建立监听服务,将接收到的数据写入文件: 24 | #+BEGIN_SRC sh 25 | nc -l 1234 > file.txt 26 | #+END_SRC 27 | 28 | 另一端连接监听端口,发送数据: 29 | #+BEGIN_SRC sh 30 | nc 127.0.0.1 1234 --send-only < file.txt 31 | #+END_SRC 32 | =--send-only= 选项会在文件拷贝完后立即关闭连接。 如果不加该选项, 我们需要手工按下 ctrl+c 来关闭连接。 33 | 34 | ** 扫描端口 35 | =-z= 选项可以用来扫描端口: 36 | #+BEGIN_SRC sh 37 | nc -vz 127.0.0.1 1234 38 | #+END_SRC 39 | -------------------------------------------------------------------------------- /content/linux/tools/netstat.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: netstat 与 ss 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | -------------------------------------------------------------------------------- /content/linux/tools/number.txt: -------------------------------------------------------------------------------- 1 | 1.23e2 2 | 1.23456 3 | 10.3 4 | 2.1 5 | 2a1 6 | 2,67 7 | 3.5e1 8 | -1 9 | -------------------------------------------------------------------------------- /content/linux/tools/route.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: route 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | #+STARTUP: overview 6 | #+OPTIONS: author:nil date:nil creator:nil timestamp:nil validate:nil num:nil 7 | -------------------------------------------------------------------------------- /content/linux/tools/sed.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: sed 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 8 | * 示例 9 | -------------------------------------------------------------------------------- /content/linux/tools/sort.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: sort 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | * 概述 6 | 用来排序文本中的行。 7 | #+BEGIN_EXAMPLE 8 | -c 检查输入是否排序。 9 | -b 忽略行前空白符。 10 | -g 按照通用数值排序。 11 | -h 按照人类可读的数字(例如,2k,1G)排序。 12 | -n 按照字符串数值进行排序。 13 | -k 选项可以通过指定列范围进行排序。 14 | -r 逆序。 15 | -s 稳定排序。 16 | -V 按照行中的版本号进行排序。 17 | --parallel 参数来加快排序速度。 18 | #+END_EXAMPLE 19 | ** =-g= 和 =-n-= 区别[fn:1] 20 | #+BEGIN_EXAMPLE 21 | -g, --general-numeric-sort 22 | compare according to general numerical value 23 | -n, --numeric-sort 24 | compare according to string numerical value 25 | #+END_EXAMPLE 26 | 27 | #+BEGIN_SRC sh :exports both 28 | cat number.txt 29 | #+END_SRC 30 | 31 | general-numeric-sort,它是用标准 C 函数把数字转换成双精度浮点数进行比较,支持科学计数法,例如 1.23e5。 32 | #+BEGIN_SRC sh :exports both 33 | sort -g number.txt 34 | #+END_SRC 35 | 36 | 2,67 和 2a1 可以看作 2 后面跟着字符串,而 sort -g 的排序规则是先字符串,然后数字,所以这两个都排在 2.1 之前。再根据字符串的排序规则,ASCII 码小的排在前面,所以 "," 排在 "a" 前面。 37 | 38 | 一般情况下,不建议用 - g 选项对数字进行排序,因为浮点数的排序比较慢,而且在把数字转换成浮点数时会产生进位误差。 39 | 40 | 再来看看 numeric-sort,按数字大小排序,如果一行中有非数字字符,则按照非数字字符前面的数字大小排序。 41 | 42 | #+BEGIN_SRC sh :exports both 43 | sort -n number.txt 44 | #+END_SRC 45 | 46 | sort -n 不支持科学计数法,因此 1.23e2 被作为数字 1.23 参与排序,3.5e1 作为数字 3.5 参与排序。2a1 作为数字 2 参与排序,因此排在 2.1 之前。 47 | 48 | 值得注意的是 2,67 排在最后,这里我看了半天,显然 - n 选项没有把 "," 看作是一般的字符串,而是看作了千分位的逗号,因此,2,67 实际被作为 267 参与排序,因而排在最后。 49 | 50 | 51 | * 示例 52 | 53 | * Footnotes 54 | 55 | [fn:1] [[https://blog.csdn.net/xicikkk/article/details/61414825][gnu sort 命令的 --general-numeric-sort 选项与 --numeric-sort 选项区别]] 56 | -------------------------------------------------------------------------------- /content/linux/tools/source.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: source 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 引用其他文件。 8 | -------------------------------------------------------------------------------- /content/linux/tools/split.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: split 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | * 概述 6 | 用来分割文件。 7 | 8 | 比较有用的参数: 9 | #+BEGIN_EXAMPLE 10 | -d 使用数字作为后缀,默认是字母 a-z。 11 | -a 指定后缀的长度。 12 | -b 按照字节大小分割 13 | -l 按照行数分割 14 | --filter=COMMAND 直接将小文件输出到命令处理。 15 | #+END_EXAMPLE 16 | * 示例 17 | #+BEGIN_SRC sh 18 | split -a 4 -l 1000 -d bigfile "small/small-" 19 | #+END_SRC 20 | 该命令将 bigfile 每 1000 行分成一个小文件,放在 small 目录下,每个小文件名字为 small-0000,small-0001 等。 21 | -------------------------------------------------------------------------------- /content/linux/tools/tree.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: tree 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | tree 命令以树状格式列出目录的内容。 8 | 9 | * 语法 10 | #+BEGIN_SRC sh 11 | tree [-acdfghilnpqrstuvxACDFQNSUX] [-L level [-R]] [-H baseHREF] [-T title] 12 | [-o filename] [--nolinks] [-P pattern] [-I pattern] [--inodes] [--device] 13 | [--noreport] [--dirsfirst] [--version] [--help] [--filelimit #] [--si] 14 | [--prune] [--du] [--timefmt format] [--matchdirs] [--] [directory ...] 15 | #+END_SRC 16 | 17 | 18 | * options 19 | 下面介绍常用的选项 20 | 21 | ** LISTING OPTIONS 22 | + =-a= 显示所有文件。 23 | + =-d= 只显示目录。 24 | + =-L level= 目录的最大显示深度。 25 | + =-P pattern= 只列出与通配符模式匹配的文件。 26 | + =-I pattern= 不显示与通配符模式匹配的文件。 27 | 28 | ** FILE OPTIONS 29 | 30 | ** SORTING OPTIONS 31 | 32 | ** GRAPHICS OPTIONS 33 | 34 | ** XML/JSON/HTML OPTIONS 35 | + =-X= 开始 XML 输出。 36 | + =-J= 开始 JSON 输出。 37 | -------------------------------------------------------------------------------- /content/linux/tools/uniq.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: uniq 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 文件去重,uniq 只能判断相邻行是否重复。使用前需要先将文件内容排序。 8 | 9 | 常用参数: 10 | #+BEGIN_EXAMPLE 11 | -c 参数输出重复次数。 12 | -d 只输出重复的行,每组一个 13 | -f 跳过每行前 N 个域进行比较。 14 | -s 跳过每行前 N 个字符进行比较。 15 | -u 只输出不重复的行。 16 | #+END_EXAMPLE 17 | -------------------------------------------------------------------------------- /content/linux/tools/wc.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: wc 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 打印每个文件的换行符,单词和字节计数。 8 | 9 | 比较有用的参数: 10 | #+BEGIN_EXAMPLE 11 | -c 打印字节数 12 | -m 打印字符数 13 | -l 打印行数 14 | -L 打印最大行长度 15 | -w 打印单词数 16 | #+END_EXAMPLE 17 | -------------------------------------------------------------------------------- /content/linux/tools/xargs.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: xargs 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | -------------------------------------------------------------------------------- /content/linux/tools/zip.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 压缩命令 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | * gzip 6 | ** 压缩保留源文件 7 | #+BEGIN_SRC sh 8 | gzip -c filename > filename.gz 9 | #+END_SRC 10 | 11 | 12 | * gunzip 13 | ** 解压缩保留源文件 14 | #+BEGIN_SRC sh 15 | gunzip -c filename.gz > filename 16 | #+END_SRC 17 | 18 | * tar 19 | 20 | * xz 21 | -------------------------------------------------------------------------------- /content/linux/wine.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: wine 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | #+STARTUP: overview 6 | 7 | * 概述 8 | 9 | * 安装 10 | 11 | * 使用[fn:1] 12 | #+BEGIN_SRC 13 | wget -nc https://dl.winehq.org/wine-builds/winehq.key 14 | sudo apt-key add winehq.key 15 | sudo apt-add-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ bionic main' 16 | #+END_SRC 17 | 18 | * Footnotes 19 | 20 | [fn:1] https://wiki.winehq.org/Ubuntu_zhcn 21 | -------------------------------------------------------------------------------- /content/lua/3rd-lib/lua-cjson.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: lua-cjson 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | * 概述 6 | 7 | #+BEGIN_SRC sh 8 | luarocks install lua-cjson 9 | #+END_SRC 10 | 11 | * 使用 12 | Json 有两种常用的数据类型:object 和 array 13 | 14 | cjson 对于空的 table,会默认处理为 object,对于 Lua 本身,是无法区分空数组和空字典的,但是对于强类型语言(C/C++, Java 等),这时候就会出现问题,必须作容错处理. 15 | 16 | 方案一:使用 metatable 将 table 标记为 array 17 | #+BEGIN_SRC lua 18 | setmetatable(tab, cjson.empty_array_mt) 19 | #+END_SRC 20 | 21 | 推荐使用这种方案。 22 | 23 | 方案二 使用 encode_empty_table_as_object 方法 24 | #+BEGIN_SRC lua 25 | cjson.encode_empty_table_as_object(false) 26 | #+END_SRC 27 | -------------------------------------------------------------------------------- /content/lua/3rd-lib/lua-snowflake.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: lua-snowflake 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/stuartcarnie/lua-snowflake][lua-snowflake]] 是 [[http://www.machengyu.net/tech/2019/12/04/snowflake.html][雪花算法(Snowflake)]] 的 lua 实现。雪花算法是一种支持有序分布式 ID 生成的算法。 8 | 9 | * 安装 10 | #+BEGIN_SRC sh 11 | luarocks install --local snowflake 12 | #+END_SRC 13 | 14 | * 使用 15 | #+BEGIN_SRC lua 16 | local sf = require("snowflake") 17 | sf.init(0x01, 0x01) 18 | local uuid = sf.next_id() 19 | #+END_SRC 20 | 21 | uuid 将是一个以字符串形式表示的 64 位数字,其结构如下: 22 | 23 | #+begin_example 24 | 6 6 5 4 3 2 1 25 | 3210987654321098765432109876543210987654321098765432109876543210 26 | 27 | tttttttttttttttttttttttttttttttttttttttttdddddnnnnnsssssssssssss 28 | #+end_example 29 | 30 | 此处: 31 | + s 是一个 12 位整数,当在同一毫秒内多次调用 next_id()时,它会递增 32 | + n 是一个 5 位整数,代表给定数据中心内的节点 33 | + d 是一个 5 位整数,代表唯一的数据中心或服务器组 34 | + t 是一个 42 位整数,表示当前时间戳(以毫秒为单位) 自 1413817200000 或 2014-10-20T15:00:00.000Z 以来经过的毫秒数 35 | 36 | 37 | =sf.init(datacenter_id,node_id)= 用于初始化雪花并为 ddddd 和 nnnnn 设置值,如下所示: 38 | + datacenter_id 是整数 n,其中 0≤n≤0x1f,并指定 id 的 ddddd 部分 39 | + node_id 是整数 n,其中 0≤n≤0x1f,并指定 id 的 nnnnn 部分 40 | -------------------------------------------------------------------------------- /content/lua/3rd-lib/penlight.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: penlight 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/stevedonovan/Penlight][penlight]] 是一组纯 Lua 库,专注于输入数据处理(如读取配置文件),函数式编程(如 map,reduce,占位符表达式等)和 OS 路径管理。 许多功能都受到 Python 标准库的启发。 8 | 9 | * 安装 10 | 使用 luarocks 安装: 11 | #+BEGIN_SRC sh 12 | luarocks install penlight 13 | #+END_SRC 14 | 15 | 或者拷贝 =lua/pl= 目录到 Lua module path. 该目录在 linux 系统上通常位于 =/usr/local/share/lua/5.x= ,windows 系统上位于 =C:\Program Files\Lua\5.x\lua= 。 16 | 17 | 18 | penglight 还依赖 LuaFileSystem,如果使用路径相关的库,需要将其拷贝到对应的路径。 19 | 20 | * 使用 21 | 22 | 使用参考[[https://stevedonovan.github.io/Penlight/api/index.html][api 文档]] 23 | -------------------------------------------------------------------------------- /content/lua/lua-table-analysis.org: -------------------------------------------------------------------------------- 1 | #+title:Lua 表深入分析 2 | -------------------------------------------------------------------------------- /content/lua/tools/formatter.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: formatter 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | lua 代码格式化工具。 8 | 9 | * 安装 10 | 该程序依赖 checks。 11 | #+BEGIN_SRC sh 12 | luarocks install checks 13 | luarocks install Formatter 14 | #+END_SRC 15 | 16 | * 使用 17 | #+BEGIN_SRC 18 | luaformatter [option] [files] 19 | #+END_SRC 20 | 21 | 可用参数: 22 | #+BEGIN_EXAMPLE 23 | -a, --autosave Flush formatted Lua in given file instead of stdout. 24 | -s, --spaces (default 2) Spaces to use as indentation. 25 | -t, --tabs (default 0) Tabulation(s) to use as indentation. 26 | -d, --delimiter (default unix) Type of new line to detect and use while formatting: 27 | * unix: '\n' LF Line feed. 28 | * windows: '\r\n' CR+LF 29 | * mac: '\r' CR Carriage Return of Macs before OSX. 30 | -h, --help This help. 31 | [files] Files to format. 32 | 33 | #+END_EXAMPLE 34 | 35 | 示例: 36 | #+BEGIN_SRC sh 37 | luaformatter -a -s 4 test.lua 38 | #+END_SRC 39 | -------------------------------------------------------------------------------- /content/lua/tools/ldoc.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: ldoc 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | ldoc 用于生成 lua 代码文档。 8 | 9 | * 安装 10 | 可以使用 luarocks 进行安装: 11 | #+BEGIN_SRC sh 12 | sudo luarocks install lua-discount 13 | sudo luarocks install ldoc 14 | #+END_SRC 15 | 16 | * 配置 17 | 18 | * 使用 19 | 参见[[file:ldoc-manual.org][ldoc manual]] 20 | -------------------------------------------------------------------------------- /content/lua/tools/lua-code-formatter.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: lua code formatter 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/martin-eden/lua_code_formatter][lua_code_formatter]] 是一个 lua 代码格式化工具。 8 | 9 | 调整代码行以适合给定的边距。 10 | 11 | 格式化后,含有无效 Lua 语法的文件可能会丢失内容!在运行重新格式化之前验证文件的正确性: =luac -p = 。 12 | 13 | * 安装 14 | #+BEGIN_SRC sh 15 | luarocks install lcf 16 | #+END_SRC 17 | 18 | 安装脚本将部署三个命令行脚本: 19 | #+BEGIN_EXAMPLE 20 | lua.reformat 21 | lua.get_ast 22 | lua.get_formatter_ast 23 | #+END_EXAMPLE 24 | 25 | * 使用 26 | 27 | #+BEGIN_SRC sh 28 | lua.reformat [options] [lua_file]> [out_file] 29 | #+END_SRC 30 | 不带参数调用将显示可用的命令行参数。 31 | 32 | 例如: 33 | #+BEGIN_SRC sh 34 | lua.reformat --indent=' ' test.lua 35 | #+END_SRC 36 | 37 | ** options 38 | #+BEGIN_EXAMPLE 39 | --indent= Use given string as indent chunk. 40 | 41 | --right-margin= Right margin, including indent part. 42 | --max-text-width= Maximum text length, excluding indent part. 43 | 44 | --keep-comments Keep comments. 45 | --~keep-comments Remove comments. 46 | 47 | --keep-unparsed-tail Keep unparsed file end. 48 | --~keep-unparsed-tail Remove unparsed file end. 49 | #+END_EXAMPLE 50 | 51 | ** out_file 52 | 如果使用 out_file 参数,必须与 lua_file 不同。 53 | -------------------------------------------------------------------------------- /content/lua/zerobrane-studio.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/pkulchenko/ZeroBraneStudio][ZeroBrane Studio]] 是一个轻量级的跨平台 Lua IDE,具有代码完成,语法高亮,远程调试器,代码分析器,实时编码以及各种 Lua 引擎的调试支持(Lua 5.1,Lua 5.2,Lua 5.3,Lua 5.4,LuaJIT,LÖVE,Moai,Gideros,Corona,Marmalade Quick,Cocos2d-x,OpenResty/Nginx,Torch7,Redis,GSL-shell,Adobe Lightroom,Lapis,Moonscript 等)。http://studio.zerobrane.com/ 8 | 9 | * 安装[fn:1] 10 | #+BEGIN_SRC sh 11 | wget https://download.zerobrane.com/ZeroBraneStudioEduPack-1.80-linux.sh 12 | sh ZeroBraneStudioEduPack-1.80-linux.sh 13 | #+END_SRC 14 | 15 | * 配置 16 | 17 | * 使用 18 | 19 | * Footnotes 20 | 21 | [fn:1] https://studio.zerobrane.com/doc-installation 22 | -------------------------------------------------------------------------------- /content/macos/IINA.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: IINA 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | macos 超强播放器。 8 | -------------------------------------------------------------------------------- /content/macos/dash.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: dash 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://kapeli.com/dash][Dash]] 是 API 文档浏览器和代码片段管理器。 Dash 存储代码片段并立即搜索 200 多个 API,100 多个备忘单等的离线文档集。您甚至可以生成自己的 docsets 或请求包含 docset。 8 | -------------------------------------------------------------------------------- /content/macos/finder.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: finder 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 8 | * 快捷键 9 | + 全屏: control + command + f 10 | + 剪切: command + option + v 或者直接拖动到目标文件夹。 11 | + 最大化:按住 Option 双击左上角或右下角,最大化。 12 | + 关闭所有窗口: Command + option + w 13 | + 一般的双击就是默认打开方式,双击的同时按下 Command 键就是以 tab 或 new window 来打开 14 | + 弹出地址栏:command+shift+g 15 | + 复制绝对路径: command+option+c 16 | + Command + 上箭头:到上一级目录 17 | 18 | * Footnotes 19 | 20 | [fn:1] https://www.jianshu.com/p/6505ead00d59 21 | -------------------------------------------------------------------------------- /content/macos/item2.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: iterm2 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://www.iterm2.com/index.html][iterm2]] 8 | -------------------------------------------------------------------------------- /content/macos/macos.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: macos faq 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 修改 hostname 7 | #+BEGIN_SRC sh 8 | sudo scutil --set HostName 新的主机名 9 | #+END_SRC 10 | 11 | * 修改终端提示符前缀 12 | =~/.bash_profile= 中添加如下内容: 13 | #+begin_example 14 | export PS1='\u@\H:\w$ ' 15 | #+end_example 16 | 17 | * 使用 locate 18 | #+BEGIN_SRC sh 19 | alias updatedb=/usr/libexec/locate.updatedb 20 | #+END_SRC 21 | 22 | * 程序代理 23 | https://wi1dcard.dev/posts/redirecting-network-traffic-of-various-apps-on-macos-to-proxies/ 24 | 25 | * PATH 26 | MacOS 环境变量配置文件,加载顺序依次为: 27 | + /etc/profile 28 | + /etc/paths 29 | + /etc/paths.d/ 30 | + ~/.bash_profile 31 | + ~/.bash_login 32 | + ~/.profile 33 | + ~/.bashrc 34 | + /etc/profile 和/etc/paths, /etc/paths.d/是系统级别的,系统启动就会加载; 35 | 36 | 后面几个是当前用户级的环境变量。后面 3 个按照从前往后的顺序读取,如果~/.bash_profile 文件存在,则后面的几个文件就会被忽略不读了,如果~/.bash_profile 文件不存在,才会以此类推读取后面的文件。 37 | 38 | ~/.bashrc 没有上述规则,它是 bash shell 打开的时候载入的。 39 | 40 | ** 添加/修改系统级$PATH 41 | /etc/paths.d/目录下添加(推荐) 42 | 43 | 44 | ** 修改用户的环境变量 45 | 修改~/.bash_profile 文件(推荐) 46 | -------------------------------------------------------------------------------- /content/macos/ntfstool.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: ntfstool 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/ntfstool/ntfstool][ntfstool]] 支持 NTFS 磁盘读写,安装,启动,管理和其他功能。 8 | -------------------------------------------------------------------------------- /content/macos/proxifier.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: proxifier 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 8 | 有些应用程序没有设置网络代理的选项,通过 [[https://www.proxifier.com/][Proxifier]] ,让这些程序也可以通过 SOCKS 或 HTTPS 代理链接网络。 9 | -------------------------------------------------------------------------------- /content/make/gnu-make-manual/gnu-make.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: gnu make manual 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | * 概述 6 | 7 | 此文件记录了 [[https://www.gnu.org/software/make/manual/html_node/index.html#Top][GNU make]] 实用程序,该实用程序自动确定需要重新编译大型程序的哪些部分,并发出重新编译它们的命令。 8 | 9 | * Overview of make 10 | * An Introduction to Makefiles 11 | * Writing Makefiles 12 | * Writing Rules 13 | * Writing Recipes in Rules 14 | * How to Use Variables 15 | * Conditional Parts of Makefiles 16 | * Functions for Transforming Text 17 | * How to Run make 18 | * Using Implicit Rules 19 | * Using make to Update Archive Files 20 | * Extending GNU make 21 | * Integrating GNU make 22 | * Features of GNU make 23 | * Incompatibilities and Missing Features 24 | * Makefile Conventions 25 | * Appendix A Quick Reference 26 | * Appendix B Errors Generated by Make 27 | * Appendix C Complex Makefile Example 28 | * Index of Concepts 29 | * Index of Functions, Variables, & Directives 30 | -------------------------------------------------------------------------------- /content/make/how_to_write_makefile_note.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | #+title:跟我一起写 makefile笔记 3 | #+author:phenix3443 4 | #+email:phenix3443+github@gmail.com 5 | 6 | 7 | * 概述 8 | ** 疑问: 9 | + 程序编译过程中不同的阶段是什么? 10 | + 库文件的用途是什么?其内容和组织方式是什么? 11 | 12 | * makefile 介绍 13 | 14 | * 书写规则 15 | + 核心规则: 16 | #+BEGIN_SRC makefile 17 | targets: prerequisites 18 | commands 19 | #+END_SRC 20 | 21 | 依赖(prerequisites) 中如果有一个以上的文件比 目标(target) 文件要新的话,命令(command)部分就会被执行。 22 | 23 | + 隐式规则如非必要不要写出来,减少中间文件的生成。 24 | + 多目标规则中的静态模式可以根据模式匹配让规则变得更灵活。 25 | + 使用自动生成依赖性解决依赖问题。 26 | 27 | ** 疑问: 28 | + sed 如何处理自动依赖 29 | 30 | * 书写命令 31 | + 总控 makefile 中的显示声明的变量会传递到下级的 makefile 中,但不会覆盖下层 makefile 所定义的变量。 32 | + 嵌套执行 makefile,子模块中可能从上层 export 的变量应该使用'?='定义。 33 | 34 | * 使用变量 35 | ** 疑问 36 | + 变量赋值等号两边可以有空格么? 37 | 38 | * 使用条件判断 39 | 40 | * 使用函数 41 | 42 | * make 的运行 43 | 44 | * 隐含规则 45 | + 一般不要修改隐含规则,而是修改编译选项变量或链接选项变量。 46 | * 使用 make 更新函数库文件 47 | 48 | * Footnotes 49 | 50 | [fn:4] [[https://www.gnu.org/software/make/manual/make.html][GNU make manual]] 51 | 52 | [fn:3] [[https://github.com/seisman/how-to-write-makefile][跟我一起写 Makefile (PDF 重制版)]] 53 | -------------------------------------------------------------------------------- /content/markdown/markdown.org: -------------------------------------------------------------------------------- 1 | #+title:Markdown 实践 2 | #+author:刘尚亮 3 | #+email:phenix3443@gmail.com 4 | 5 | * 概览 6 | 7 | * 现状 8 | ** 原生 Markdown 9 | Markdown 于 2004 年发布,包含一套纯文本格式化语法步采纳,现在使用它的有 GitHub、Reddit、Stack Exchange、SourceForge、Atlassian Confluence 等,所以我们可以认为 Markdown 已经被整个软件社区所采用。Markdown 的成功与其简洁性紧密相关。 [[https://zhuanlan.zhihu.com/p/69210764][主流Markdown编辑器推荐]] 。 10 | 11 | ** Github Flavored Markdown(GFM) 12 | 由于 markdown 语言标准本身“缺陷”,各种衍生版本和扩展功能繁多,导致不同的编辑器支持不同的扩展功能。所以最好还是使用 github 推荐的。具体[[https://github.github.com/gfm/][语言规范]]。 13 | -------------------------------------------------------------------------------- /content/mysql/mysql-practices.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: mysql 实践 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 8 | * 安装 9 | ** ubuntu 10 | #+BEGIN_SRC sh 11 | sudo apt install -y mysql-server 12 | #+END_SRC 13 | 如果在安装过程中,没有出现安全设置界面来设置 root 账号的密码,那么安装后将无法通过空密码登录: 14 | #+BEGIN_SRC sh 15 | ERROR 1698 (28000): Access denied for user 'root'@'localhost' 16 | #+END_SRC 17 | 此时,可通过如下方法设置密码: 18 | #+BEGIN_SRC sh 19 | sudo mysql -uroot 20 | #+END_SRC 21 | 修改安全策略,降低密码要求等级: 22 | #+BEGIN_SRC sh 23 | set global validate_password_policy=0; 24 | #+END_SRC 25 | 否则设置密码会提示: 26 | #+begin_example 27 | ERROR 1819 (HY000): Your password does not satisfy the current policy requirements 28 | #+end_example 29 | 30 | 设置密码: 31 | #+BEGIN_SRC sh 32 | ALTER user 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; 33 | #+END_SRC 34 | 35 | 然后登录: 36 | #+BEGIN_SRC sh 37 | mysql -uroot -ppassword 38 | #+END_SRC 39 | 40 | ** centos 41 | 42 | ** macos 43 | 44 | * 使用 45 | -------------------------------------------------------------------------------- /content/mysql/mysql5.5从零开始学习.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | #+title: MYSQL 5.5 从零开始学习笔记 3 | #+author:phenix3443 4 | #+email:phenix3443+github@gmail.com 5 | 6 | * 第 1 章 7 | 8 | * 第 5 章 数据类型和运算符 9 | 10 | * 第 7 章 查询数据 11 | + 连接查询 12 | + 内连接查询 13 | 14 | 使用 where 自语据定义连接条件比较简单明了,而 inner join 是 ansi sql 的标准规范。 15 | 16 | + 外连接查询 17 | 18 | 连接查询将查询多个表中相关联的行,内连接时,返回查询结果集合中的近视符合查询条件和连接条件的行。但有时候需要包含 ~没有关联~ 的行中的数据。 19 | + 左外连接查询 20 | 21 | 返回包含左表中的所有记录和右表中连接字段相等的记录 。 22 | 23 | + 右外连接查询 24 | 25 | 返回包含右表中的所有数据和左表中连接字段相等的记录。 26 | 27 | + 符合条件查询 28 | 29 | 在连接条件中添加过滤条件。 30 | 31 | + 子查询 32 | + ALL ANY IN EXISTS 33 | 34 | + DESC 只能对其前面的列进行降序排列。如果要对多列进行降序排列,必须要在每一列后面家 DESC 关键字。 35 | 36 | + DISTINCT 关键字应于所有列,不能部分使用。 37 | 38 | * 第 8 章 插入、更新与删除数据 39 | 40 | * 第 9 章 索引 41 | + 索引用于快速找出在某个劣种有一个特定值的行。索引是对数据库表中一列或多列的值进行排序的一种结构,利用索引课题高数据库中特定数据的查询速度。 42 | + 送因十一个单独的、存储在磁盘上的数据结构,他们包含着对数据表里所有记录的引用指针。 43 | -------------------------------------------------------------------------------- /content/network/endianness.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 字节序 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 在几乎所有的机器上,多字节对象都是被存储为连续的字节序列。大小端问题主要涉及的是非单字节非字符串外的其余数据的表示和传递,如 short 型、int 型等。 8 | 9 | * 大端(高尾端) 10 | 数据的低位保存在内存的高地址中,而数据的高位存储时放在低地址。 11 | 12 | 这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放, *存储顺序与我们所看到的数据顺序一致* 。 13 | 14 | 优点:符号位在所表示的数据的内容的第一个字节中,便于快速判断数据的正负和大小。 15 | 16 | * 小端(低尾端) 17 | 18 | 数据的低位或低字节,存储时放在低地址,读取时放在流的末尾,而数据的高位或高字节保存在内存的高地址中。 19 | 20 | 优点: 21 | + 低地址放低字节,所以在强制转换时不需要调整字节的内容。比如把 int 的 4 字节强制转换成 short 的 2 字节时,就直接把 int 数据存储的前两个字节给 short 就行,因为其前两个字节刚好就是最低的两个字节,符合转换逻辑。 22 | + CPU 做数值运算时从内存中依次从低到高取数据进行运算直到最后刷新最高位的符号位,这样运算方式会更高效。 23 | -------------------------------------------------------------------------------- /content/network/network.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 网络协议实践 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | * 概述 6 | 主要介绍网络协议的学习路径。 7 | * 理论 8 | ** TCP/IP 三卷 9 | 10 | * 工具 11 | ** tcpdump 12 | ** wireshark 13 | 《wireshark 数据包分析实战》主要介绍了如何使用 wireshark 分析网络数据。该书既介绍了 wireshark 捕获捕获、保存、分析数据包的基本操作,也介绍了使用 wireshark 中 analysis 和 statics 分析网络情况的高级用法。既有 eth、arp、ip、tcp、udp、dns 等网络协议的基本介绍,也教授读者分析解决具体的实际问题的思路,是不错的入门书籍。 14 | 15 | 《wireshark 网络分析就这么简单》《wireshark 网络分析的艺术》两本书有更多的实践示例,可供进一步参考练习。 16 | 17 | ** scapy 18 | Scapy 是一个可以让用户发送、侦听和解析并伪装网络报文的 Python 程序。这些功能可以用于制作侦测、扫描和攻击网络的工具。 19 | -------------------------------------------------------------------------------- /content/network/wireshark网络分析就这么简单.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: wireshark 网络分析就这么简单 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | * 从一道面试题说起 6 | 知识点:(第三章) 7 | + IP 地址分分类,子网划分,子网掩码作用。 8 | + IP 选路。 9 | * 小试牛刀 10 | 什么是 vlan? 11 | 12 | * excel 文件的保存过程 13 | 14 | * 你一定喜欢的技巧 15 | + 抓包的时候只抓必要的部分。 16 | + 只抓包头。 17 | + 过滤。 18 | + 做标记。 19 | 20 | * 快递员的工作 21 | tcp windows scale 22 | 23 | * 重传的讲究 24 | 能导致网络拥塞的数据量称为拥塞点。 25 | 26 | + 慢启动 27 | + 拥塞避免(注意临界窗口取值) 28 | + 超时重传,RTO 29 | + 调整拥塞窗口临界值 30 | + 快速重传 31 | + 快速恢复 32 | 33 | 34 | 收到缺失的后续包如何处理?有三种方案 35 | + 缺失包之后的所有包都重传。(原始) 36 | + 顺序发送丢失和确认。(NewReno) 37 | + 将已收到的包通告发送端(SACK) 38 | 39 | * 延迟确认和 Nagle 算法 40 | 延迟确认:如果收到一个包后暂时没有什么数据要发送,就延迟一段时间再确认。如果折算时间内恰好有数据要发送,那确认信息就可以和数据在一个包里发出去了。 41 | 42 | Nagle 算法:在发出去的数据还没有被确认之前,假如又有小数据生成,那就把小数据收集起来,凑满一个 MSS 或者等收到确认后再发送。 43 | 44 | 延迟确认和 Nagle 算法并没有提高性能,它只是减少了部分确认包,减轻了网络负担。 45 | 46 | * 百家争鸣 47 | 各种拥塞避免算法: 48 | + RFC2001, 49 | + westwood 算法 50 | + Vegas 算法 51 | 52 | * DNS 小科普 53 | A 记录与 CNAME 54 | 55 | 递归查询与迭代查询 56 | 57 | DNS 循环工作模式,广泛用于负载平衡。 58 | 59 | * FTP 60 | 主动模式和被动模式。 61 | 62 | * HTTP 63 | 64 | * Tshark 65 | Tshark 命令行使用技巧。 66 | -------------------------------------------------------------------------------- /content/nginx/nginx-code-analysis.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | #+title:nginx code analysis 3 | -------------------------------------------------------------------------------- /content/nginx/nginx-practices.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE:nginx practices 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 8 | * 编译 9 | #+BEGIN_SRC 10 | apt install -y build-essential perl libpcre3-dev zlib1g-dev libssl-dev 11 | ./configure && make && make install 12 | #+END_SRC 13 | 14 | * 安装 15 | 16 | * 使用 17 | 18 | * Footnotes 19 | 20 | [fn:1] http://nginx.org/en/linux_packages.html 21 | -------------------------------------------------------------------------------- /content/nginx/ngx-optimization.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: nginx 性能优化 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | https://imququ.com/post/my-nginx-conf-for-wpo.html 8 | -------------------------------------------------------------------------------- /content/nginx/upload-module.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: upload module 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | -------------------------------------------------------------------------------- /content/openresty/lua-resty-redis.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE:lua-resty-redis 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/openresty/lua-resty-redis][lua-resty-redis]] 是基于 cosocket AP 的 ngx_lua 的 Lua redis 客户端驱动程序。这个 Lua 库利用了 ngx_lua 的 cosocket API,可以确保 100%的非阻塞行为。 8 | 9 | * 方法 10 | 所有 Redis 命令都有自己的小写的同名方法。 11 | 12 | 所有这些命令方法成功返回单个结果(res),否则返回 nil。如果出现错误或失败,它还将返回第二个值(err),该值是描述错误的字符串。 13 | 14 | Redis “status reply” 返回字符串类型,但是没有“+” 前缀。 15 | 16 | Redis “integer reply” 返回 Lua 数字类型。 17 | 18 | Redis “error reply” 返回值 false 和描述错误的字符串。 19 | 20 | non-nil Redis“bulk reply” 返回 Lua 字符串。nil 批量回复会产生 ngx.null 返回值。 21 | 22 | non-nil Redis“multi-bulk reply” 会犯 包含所有对应值的 Lua 表(如果有的话)。 如果任何组成值是有效的 redis 错误值,那么它将是一个双元素表 {false,err}。 23 | 24 | nil “multi-bulk replay” 返回 ngx.null。 25 | 26 | 有关各种 Redis 回复类型的详细信息,请参阅 http://redis.io/topics/protocol。 27 | -------------------------------------------------------------------------------- /content/openresty/resty-cli.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: resty-cli 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/openresty/resty-cli][resty]] 命令行实用程序可像 lua 或 luajit 命令行实用程序一样,直接从命令行运行 OpenResty 的 Lua 脚本。它可以使用 OpenResty Lua 创建各种命令行实用程序。 8 | 9 | 该工具通过创建 head-less nginx 实例,禁用守护程序,master_process,access_log 以及其他不需要的东西来工作。没有配置 =server {}= ,因此根本不涉及侦听套接字。 10 | 11 | Lua 代码由 init_worker_by_lua 指令启动,并在 ngx.timer 回调的上下文中运行。因此,在 ngx.timer 回调上下文中可用的所有 ngx_lua 的 Lua API 也可以在 resty 实用程序中使用。不过,我们将来可能会删除一些剩余的限制。 12 | 13 | * 使用 14 | 15 | ** =--errlog-level LEVEL= 16 | 17 | Set nginx error_log level.Can be debug, info, notice, warn, error, crit, alert,or emerg. 18 | 19 | 执行: 20 | #+BEGIN_SRC sh 21 | ./bin/resty --errlog-level=debug -e 'ngx.say("hello")' 22 | #+END_SRC 23 | ** =--http-include PATH= 24 | nginx http 配置块中包含的文件,可以包含多个配置文件。 25 | 26 | ** =-I DIR= 27 | 添加搜索 lua 库的目录。 28 | #+BEGIN_SRC sh 29 | ./bin/resty -I /Users/lsl/.luarocks/share/lua/5.3/ resty-cli/lib.lua 30 | #+END_SRC 31 | 32 | ** =--ns IP= 33 | 指定名字服务地址。 34 | 35 | ** =--shdict 'NAME SIZE'= 36 | 在 HTTP 代码块中创建内存字典,可以同时设置多个。 37 | 38 | #+BEGIN_SRC sh 39 | ./bin/resty --shdict 'dogs 1m' resty-cli/shm.lua 40 | #+END_SRC 41 | 42 | ** =--stap= 43 | 使用 sysetmtap 运行底层 nginx C process. 44 | 45 | ** =--stap-opts OPTS= 46 | systemtap 命令行选项。 47 | 48 | ** =-V= 49 | 打印版本号和 nginx 配置。 50 | -------------------------------------------------------------------------------- /content/other/panghuli-blog-tune.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8; -*- 2 | #+BLOG: panghuli_blog 3 | #+POSTID: 13 4 | #+DATE: [2014-10-21 周二 15:44] 5 | #+CATEGORY:专业知识 6 | #+TAGS:wordpress 7 | #+DESCRIPTION:blog.panghuli.org 主题调整 8 | #+TITLE:【WordPress】Blog Tune 9 | 10 | 本文主要记录对 Blog 进行的各种设置和微调。 11 | * 主题(Theme) 12 | 1. 使用 GroundWork theme。 13 | 2. 调整行间距和段落间距。 14 | 后台->外观->主题->编辑,在相应的 css 文件末尾添加如下代码: 15 | 16 | #+NAME: style.css 17 | #+BEGIN_SRC css :export code :tangle no 18 | /*style.css, add by panghuli*/ 19 | #content p { 20 | font-size: large; 21 | margin: 0.5% 0 0.5% 0; 22 | line-height: 180%; 23 | } 24 | #content h2 { 25 | margin: 1% 0 1% 0; 26 | } 27 | #content li { 28 | margin: 0.5%; 29 | } 30 | 31 | #sidebar li { 32 | margin: 1% 0 1% 0; 33 | } 34 | #+END_SRC 35 | * 插件(plugin) 36 | + [[https://wordpress.org/plugins/crayon-syntax-highlighter/][Crayon Syntax Highlighter]] 37 | + [[https://wordpress.org/plugins/social-media-widget/][Social Media Widget]] 38 | + [[https://wordpress.org/plugins/syntaxhighlighter/][SyntaxHighlighter Evolved]] 39 | + [[https://wordpress.org/plugins/wordpress-23-related-posts-plugin/][WordPress Related Posts]] 40 | + [[https://wordpress.org/plugins/wp-pagenavi/][WP-PageNavi 分页导航]] 41 | -------------------------------------------------------------------------------- /content/package-manager/snap.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: snap 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://snapcraft.io/][snap]] 将应用程序和所有依赖项打包在一起,可以在所有流行的 Linux 发行版上运行。它们会自动更新并优雅地回滚。 8 | 9 | * 安装 10 | 11 | ** apt 12 | #+BEGIN_SRC sh 13 | sudo apt install snapd 14 | #+END_SRC 15 | ** yum 16 | Snap 在 CentOS 7.6+和 Red Hat Enterprise Linux 7.6+ 可用,可从企业 Linux 附加软件包(EPEL)存储库中获取。可以使用以下命令将 EPEL 存储库添加到系统中: 17 | #+BEGIN_SRC sh 18 | sudo yum install epel-release 19 | #+END_SRC 20 | 21 | 安装 snap: 22 | #+BEGIN_SRC sh 23 | sudo yum install snapd 24 | #+END_SRC 25 | 26 | 安装完成后,需要启用用于管理主快照通信套接字的 systemd 单元: 27 | #+BEGIN_SRC 28 | sudo systemctl enable --now snapd.socket 29 | #+END_SRC 30 | 31 | 为了支持 classic snap,建立符号链接:(什么是 classic snap ?) 32 | #+BEGIN_SRC sh 33 | sudo ln -s /var/lib/snapd/snap /snap 34 | #+END_SRC 35 | 36 | * 使用 37 | 38 | 列出计算机上所有 snap 安装情况: 39 | #+BEGIN_SRC sh 40 | snap list 41 | #+END_SRC 42 | 43 | 在应用商店中查找 snap: 44 | #+BEGIN_SRC sh 45 | sudo snap find <软件包名> 46 | #+END_SRC 47 | 48 | 安装 Snap 软件: 49 | #+BEGIN_SRC sh 50 | sudo snap install 51 | #+END_SRC 52 | 53 | 更新 Snap 软件: 54 | #+BEGIN_SRC sh 55 | sudo snap refresh 56 | #+END_SRC 57 | 58 | 更新所有的 snap 软件包: 59 | 60 | #+BEGIN_SRC sh 61 | sudo snap refresh all 62 | #+END_SRC 63 | 64 | 要将 Snap 还原到以前安装的版本: 65 | #+BEGIN_SRC sh 66 | sudo snap revert 67 | #+END_SRC 68 | 69 | 卸载 snap 软件: 70 | #+BEGIN_SRC sh 71 | sudo snap remove 72 | #+END_SRC 73 | -------------------------------------------------------------------------------- /content/package-manager/yum.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: yum 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 8 | * EPEL 9 | [[https://fedoraproject.org/wiki/EPEL/zh-cn][EPEL]] 的全称叫 Extra Packages for Enterprise Linux 。EPEL 是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。装上了 EPEL 之后,就相当于添加了一个第三方源。 10 | 11 | 查看当前的仓库: 12 | 13 | #+BEGIN_SRC sh 14 | yum repolist 15 | #+END_SRC 16 | 17 | 安装 epel: 18 | #+BEGIN_SRC 19 | yum install epel-release 20 | #+END_SRC 21 | 22 | 更新仓库: 23 | #+BEGIN_SRC sh 24 | yum repolist 25 | #+END_SRC 26 | -------------------------------------------------------------------------------- /content/photography/数码摄影术语.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 摄影基本术语 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 焦距 7 | ** 标准镜头 8 | + 定义:通常焦距 50mm 左右。 9 | + 优点:标准镜头更接近人眼正常的视觉范围。 10 | + 缺点:是拍摄效果普通。 11 | + 用途:拍摄人像。 12 | 13 | ** 广角镜头 14 | + 定义:50mm 以下的焦距都是广角。普通广角镜头的焦距一般是 38-24mm,超广角镜头的焦距是 20-14mm。 15 | + 优点:距离近,视角大,景深长。 16 | + 缺点:但边缘存在畸变。 17 | + 用途: 18 | + 可以表现非常大的清晰范围 19 | + 能够强调画面的透视效果(近大远小),表现景物的空间感与立体感。 20 | + 适合拍摄风光。 21 | 22 | ** 长焦镜头 23 | + 定义:在底片成像大。普通长焦镜头焦距位 85-300mm。 24 | + 优点:距离远,视角小,景深小。 25 | + 缺点:远近对比不明显。 26 | + 用途:拍摄野生动物,演唱会等长距离拍摄内容,由于虚化效果好,畸变小,也适合人像。 27 | 28 | ** 特殊定焦焦段 29 | *** 35mm 定焦 30 | + 特性:非常中立的焦段,进可人像,退可风光。 31 | + 用途:推荐新手的最佳定焦。 32 | 33 | *** 50mm 定焦 34 | + 特性:标准焦段,某种意义上和人眼看到的差不多。 35 | + 用途:人文街拍,人像。 36 | 37 | *** 85mm 定焦 38 | + 特性:人像黄金焦段,既保证了和模特距离不远,又能在焦距和光圈上有着非常好的虚化效果。 39 | 40 | * 光圈 41 | + 大光圈:F1.2-F4,突出主体物,虚化前后背景。 42 | + 中等光圈:F4-F8,成像质量最好。 43 | + 小光圈:F8-F32,更大的景深和更好的成像品质。 44 | + 最佳光圈? 45 | 46 | * 快门 47 | + 高速快门,1/250s 以上就是比较高的快门速度了。 48 | + 低速快门, 49 | + 安全快门,安全快门大于 1/镜头焦距。 50 | 51 | * 感光度(ISO) 52 | + ISO400 以上为高感光度。 53 | 54 | * 景深 55 | 56 | * 色温 57 | 58 | * 对焦 59 | 对焦其实是对景深的控制。 60 | + 自动对焦 61 | + 手动对焦 62 | 63 | * 测光 64 | 65 | * 曝光 66 | + 曝光补偿 67 | + 测光 68 | + 曝光模式 69 | 70 | 71 | * Footnotes 72 | 73 | [fn:1] [[https://zhuanlan.zhihu.com/p/57225708][iPhone 相机操作指南 2.0]] 74 | -------------------------------------------------------------------------------- /content/photography/构图之美.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 构图之美 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | #+STARTUP: overview 6 | 7 | * 前言 8 | 构图的终极目标是引导观赏者的视线,让他们关注你认为重要的个体。 9 | 10 | 如果想要传递情绪,通过充满韵律地摆布画面元素,可以做到这一点。 11 | 12 | * 从传统的视角看构图 13 | + 三分构图法:用来追求画面的平衡。缺点:不适用多个视觉主题。 14 | + 黄金分割螺旋 15 | + 黄金分割三角 16 | + 对角线构图 17 | + 曲线 18 | + 视觉句号 19 | + 前景和背景 20 | + 主体和客体 21 | 22 | 在画面中尽量减小景深,这样画面是由一系列的形状构成的。画面有形式感(?)。 23 | 24 | 平衡和抵消:视觉平衡。 25 | 26 | 建立尺寸、比例和大小的意识:利用大小对比,透视 27 | * 用构图树立个人风格 28 | 29 | * 在后期处理中优化构图 30 | 31 | * 用全新的眼光看构图 32 | -------------------------------------------------------------------------------- /content/photography/纽约摄影学院摄影教材.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | #+title:《美国纽约摄影学院摄影教材》读书笔记 3 | #+author:刘尚亮 4 | #+email:phenix3443@gmail.com 5 | 6 | * 第一课 摄影家的眼力 7 | + 摄影三原则: 8 | + 主题明确 9 | + 主体吸引注意力 10 | + 画面简洁 11 | * 第二课 相机和镜头 12 | + 镜头是为了汇聚光线。 13 | + 光圈表示在特定时间内能传送的光量的多少。它综合考虑了孔径和焦距对曝光量的影响。 14 | + 焦距决定了拍摄的物体在成像平面上所形成影像的大小。相同的拍摄同一物体,焦距越大,成像越大。 15 | + 焦距越短(广角镜头),像场就越宽,焦距越长(远射镜头),像场就越窄。 16 | + 17 | * 第三课 如何使用照相机 18 | + 取景器: 19 | + 光圈越小,景深越大。焦点越远,景深越大。焦距越短,景深越大。 20 | 21 | * 第四课 胶片 22 | 23 | * 第五课 曝光 24 | 25 | * 第八课 培养你的眼力 26 | 突出重点: 27 | + 通过布局突出重点:常用三分法,使用靠边或放在中心来突出重点。 28 | + 通过物体大小比例突出重点。 29 | + 通过搭画框的方法突出主体。当被摄物体由于相对尺寸较小而无法主导画面的时候(或距离较远,又想表现出距离感),吸引注意力的技法之一就是给它搭个画框。 30 | + 通过用光来突出主体。明暗对比, 31 | + 通过汇聚线条 32 | + 通过选择焦点 33 | + 通过重复 34 | 35 | * 第十三课 完美的照片 36 | -------------------------------------------------------------------------------- /content/python/3rd-libs/concurrentloghandler.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: concurrentloghandler 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | #+STARTUP: overview 6 | #+OPTIONS: author:nil date:nil creator:nil timestamp:nil validate:nil num:nil 7 | * 概述 8 | 9 | * 安装 10 | #+BEGIN_SRC sh 11 | pip3 install --user concurrentloghandler 12 | #+END_SRC 13 | * 配置 14 | 15 | * 使用 16 | -------------------------------------------------------------------------------- /content/python/3rd-libs/flask.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE:Flask 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | Flask 是一个轻量级的 Web 服务程序,它简单、易用、灵活。 8 | -------------------------------------------------------------------------------- /content/python/3rd-libs/mysql-connector.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: mysql-connnect 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | mysql 的 python client 驱动。 8 | 9 | manual:https://dev.mysql.com/doc/connector-python/en/ 10 | 11 | * 安装 12 | #+BEGIN_SRC sh 13 | pip3 install --user mysql-connector 14 | #+END_SRC 15 | * 使用 16 | -------------------------------------------------------------------------------- /content/python/3rd-libs/openpyxl.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: openpyxl 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://openpyxl.readthedocs.io/en/stable/index.html][openpyxl]] 可以用来操作 excel 。 8 | 使用 openpyxl 的一般流程为: 9 | 1. 创建/读取 excel 文件 10 | 2. 选择 sheet 对象 11 | 3. 对表单/cell 进行操作 12 | 4. 保存 excel 13 | 14 | * 使用 15 | 16 | https://geek-docs.com/python/python-tutorial/python-openpyxl.html 17 | -------------------------------------------------------------------------------- /content/python/3rd-libs/tornado.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: Tornado 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | 7 | * 概述 8 | [[https://tornado-zh.readthedocs.io/zh/latest/#][Tornado]] 是一个支持异步的 Web 框架,通过使用非阻塞 I/O 流,它可以支撑成千上万的开放连接,效率非常高。 9 | -------------------------------------------------------------------------------- /content/python/books/python-for-data-analysis.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | #+title:利用 Python 进行数据分析读书笔记 3 | #+author:刘尚亮 4 | #+email:phenix3443@gmail.com 5 | 6 | 7 | * 第一章 准备工作 8 | #+BEGIN_SRC sh 9 | sudo pip install pandas 10 | sudo apt install python-tk 11 | #+END_SRC 12 | * 第二章 引言 13 | #+BEGIN_SRC python 14 | import json 15 | import numpy as np 16 | import pandas as pd 17 | 18 | from pandas import DataFrame, Series 19 | 20 | path = 'usagov_bitly_data2012-03-16-1331923249.txt' 21 | 22 | records = [json.loads(line) for line in open(path)] 23 | 24 | frame = DataFrame(records) 25 | 26 | clean_tz = frame['tz'].fillna('Missing') 27 | 28 | clean_tz[clean_tz == ''] = 'Unknown' 29 | 30 | tz_counts = clean_tz.value_counts() 31 | 32 | tz_counts[:10].plot(kind='barh',rot=0) 33 | #+END_SRC 34 | 35 | * 第三章 IPython 36 | 37 | * 第四章 NumPy 基础:数组和矢量计算 38 | 39 | * 第五章 pandas 入门 40 | 41 | * 第六章 数据加载、存储与文件格式 42 | 43 | * 第七章 数据规整化 44 | 45 | * 第八章 绘图和可视化 46 | 47 | * 第九章 数据聚合与分组运算 48 | 49 | * 第十章 时间序列 50 | 51 | * 第十一章 金融和经济数据应用 52 | 53 | * 第十二章 NumPy 高级应用 54 | -------------------------------------------------------------------------------- /content/python/books/python核心编程笔记.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | #+title:Python 核心编程(第三版)读书笔记 3 | #+author:刘尚亮 4 | #+email:phenix3443@gmail.com 5 | 6 | * 正则表达式 7 | 8 | * 网络编程 9 | + 套接字非阻塞模式 10 | + 当一方关闭链接或向对方发送一个空字符串时,通常会关闭链接。 11 | + SocketServer 模块。 12 | + Twisted 框架。 13 | 14 | * 因特网客户端编程 15 | 16 | * 数据库编程 17 | -------------------------------------------------------------------------------- /content/python/package-manage.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: python 包管理工具 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 8 | * pip 9 | 10 | * virtualenv 11 | 12 | * pipenv 13 | pipenv 是一个旨在为项目创建 package 管理环境。 14 | 15 | 它会自动为项目创建和管理 virtualenv,并在安装/卸载软件包时在 Pipfile 文件中 添加/删除中的软件包。它还生成一个非常重要的 Pipfile.lock,用于生成确定性构建。 16 | 17 | ** 背景 18 | 如果要为项目建立虚拟环境,需要先后调用 virtualenv 和 pip 命令,并通过 requests.txt 来管理虚拟环境中的包。 19 | 20 | ** 有点 21 | pipenv 主要解决的问题是: 22 | + 不再需要单独使用 pip 和 virtualenv。 23 | + 管理 requirements.txt 文件可能会有[[https://www.kennethreitz.org/essays/a-better-pip-workflow][问题]], 因此 Pipenv 使用 Pipfile 和 Pipfile.lock,这对于基本用例来说更胜一筹。 24 | + 使用散列保证安全。 25 | + 通过依赖图深入了解依赖关系(例如 =$pipenv graph= )。 26 | + 通过加载 =.env= 文件简化开发工作流程。 27 | 28 | ** pipfile 29 | 通过 pipifle 自动查找项目的根目录,并将依赖关系记录在此文件中。 30 | 31 | ** lock 文件 32 | 用来管理 pipfile 中安装包的版本。 33 | 34 | ** 安装 35 | #+BEGIN_SRC sh 36 | pip3 install pipenv 37 | #+END_SRC 38 | 39 | ** 使用 40 | 初始化 41 | #+BEGIN_SRC sh 42 | pipenv --three 43 | #+END_SRC 44 | 45 | 安装依赖 46 | #+BEGIN_SRC sh 47 | pipenv install requests 48 | #+END_SRC 49 | 50 | 进入虚拟环境 51 | #+BEGIN_SRC 52 | pipenv shell 53 | #+END_SRC 54 | -------------------------------------------------------------------------------- /content/python/tools/black.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: black 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/psf/black][black]] 是 Python 代码格式化程序。 8 | 9 | black 通过产生尽可能小的差异使代码检查更快。 10 | 11 | 可以尝试一下 [[https://black.now.sh/][black playground]]。观看 [[https://youtu.be/esZLCuWs_2Y][PyCon 2019]] 演讲以了解更多信息。 12 | 13 | * 安装 14 | #+BEGIN_SRC sh 15 | pip3 install --user black 16 | #+END_SRC 17 | 18 | * 配置 19 | -------------------------------------------------------------------------------- /content/python/tools/httpbin.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: httpbin 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://httpbin.org/][httpbin]] 可以返回自己请求的参数,类似 echo 服务器,但是功能更加强大。不仅可以查看所有的 http 动作,还可以查看 url 跳转等。 8 | 9 | * 使用 10 | 11 | ** sh 12 | #+BEGIN_SRC sh 13 | pip3 install --user httpbin gunicorn 14 | gunicorn httpbin:app 15 | #+END_SRC 16 | 17 | ** docker 18 | 使用 docker 安装, 19 | #+BEGIN_SRC 20 | docker pull kennethreitz/httpbin 21 | docker run -d --restart=always --name=httpbin -p 1234:80 kennethreitz/httpbin 22 | #+END_SRC 23 | 24 | 然后配置 =/etc/hosts= 本地域名 25 | #+begin_example 26 | 127.0.0.1 myhttpbin.org 27 | #+end_example 28 | 29 | #+BEGIN_SRC sh 30 | curl -i http://myhttpbin.org:1234/get 31 | #+END_SRC 32 | -------------------------------------------------------------------------------- /content/python/tools/pip.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: pip 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 8 | * 安装 9 | 10 | ** macos 11 | #+BEGIN_SRC 12 | python3 -m pip install --user 13 | #+END_SRC 14 | 15 | 然后将 =~/Library/Python/3.7/bin= 添加到 PATH 变量。 16 | -------------------------------------------------------------------------------- /content/python/tools/pipenv.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: pipenv 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | * 概述 6 | pipenv 主要来方便的创建虚拟工作环境。 7 | 8 | * 参数 9 | #+BEGIN_SRC sh :exports both :results output scalar 10 | pipenv --help 11 | #+END_SRC 12 | 13 | * 初次使用 14 | 1. 使用 =--three= 创建 python3 环境。 15 | 2. 使用 =pipenv install = 安装需要的包,然后就可以在当前目录下看到生成 Pipfile 文件,里面就是包的依赖内容。 16 | 17 | * 重建环境 18 | 如果有 Pipfile,可以根据 Pipfile 直接重建应用环境。 19 | 1. 使用 =--three= 创建 python3 环境,还可以使用 =pipenv --rm= 删除创建的虚拟环境。 20 | 2. 使用 =pipenv update= 自动安装需要的包。 21 | 22 | * 运行环境 23 | 1. 使用 =pipenv shell= 在当前 tty 中进入创建的虚拟工作目录中。 24 | 2. 或者使用 =pipenv run= 直接在虚拟环境中执行脚本。 25 | 26 | * 问题 27 | ** 运行报错 28 | #+BEGIN_EXAMPLE 29 | Locking [dev-packages] dependencies... 30 | Locking [packages] dependencies... 31 | env/utils.py", line 402, in resolve_deps 32 | req_dir=req_dir 33 | File "/usr/local/lib/python3.6/dist-packages/pipenv/utils.py", line 250, in actually_resolve_deps 34 | req = Requirement.from_line(dep) 35 | File "/usr/local/lib/python3.6/dist-packages/pipenv/vendor/requirementslib/models/requirements.py", line 704, in from_line 36 | line, extras = _strip_extras(line) 37 | TypeError: 'module' object is not callable 38 | #+END_EXAMPLE 39 | 40 | 需要先升级一下 pip 和 pipenv 41 | #+BEGIN_SRC sh 42 | pip3 install --user --upgrade pip 43 | pip3 install --user -upgrade pipenv 44 | #+END_SRC 45 | -------------------------------------------------------------------------------- /content/python/听说你会python.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | #+title:听说你会 Python 3 | #+author:刘尚亮 4 | #+email:phenix3443@gmail.com 5 | 6 | 7 | * 序列 8 | + The slice of s from i to j is defined as the sequence of items with index k such that i <= k < j 9 | 10 | + Values of n less than 0 are treated as 0 (which yields an empty sequence of the same type as s). Note that items in the sequence s are not copied; they are referenced multiple times. This often haunts new Python programmers; consider: 11 | #+BEGIN_SRC python 12 | >>> lists = [[]] * 3 13 | >>> lists 14 | [[], [], []] 15 | >>> lists[0].append(3) 16 | >>> lists 17 | [[3], [3], [3] 18 | #+END_SRC 19 | + Concatenating immutable sequences always results in a new object. This means that building up a sequence by repeated concatenation will have a quadratic runtime cost in the total sequence length. To get a linear runtime cost, you must switch to one of the alternatives below: 20 | + if concatenating str objects, you can build a list and use str.join() at the end or else write to an io.StringIO instance and retrieve its value when complete 21 | + if concatenating bytes objects, you can similarly use bytes.join() or io.BytesIO, or you can do in-place concatenation with a bytearray object. bytearray objects are mutable and have an efficient overallocation mechanism 22 | + if concatenating tuple objects, extend a list instead 23 | + for other types, investigate the relevant class documentation 24 | -------------------------------------------------------------------------------- /content/reading-note/cpp-concurrency-in-action.org: -------------------------------------------------------------------------------- 1 | #+TITLE:c++并发编程 2 | 3 | c++ concurrency in action 是一本讲述如何使用C++11进行并发编程的书籍,内容从 std::thread、std::mutex、std::future 和 std::async 等基础类的使用,到内存模型和原子操作、基于锁和无锁数据结构的构建,再扩展到并行算法、线程管理,最后还介绍了多线程代码的测试工作。已有网友将该书翻译成中文放在网上[fn:1] 4 | 5 | * c++ 的并发世界 6 | ** 你好,并发世界 7 | #+BEGIN_SRC c++ :tangle cpp-concurrency/hello-concurrency.cc 8 | #include 9 | #include 10 | 11 | void Hello(void) { 12 | std::cout << "Hello,concurrency world" << std::endl; 13 | } 14 | 15 | int main(int argc, char *argv[]) 16 | { 17 | std::thread t(Hello); 18 | t.join(); 19 | 20 | return 0; 21 | } 22 | #+END_SRC 23 | * Footnotes 24 | 25 | [fn:1] [[https://www.gitbook.com/book/chenxiaowei/cpp_concurrency_in_action/details][C++并发编程中文翻译版]] 26 | -------------------------------------------------------------------------------- /content/reading-note/cpp-concurrency/Makefile: -------------------------------------------------------------------------------- 1 | SOURCE := $(wildcard *.cc) 2 | TARGET := $(SOURCE:%.cc=%.out) 3 | CFLAGS := -g 4 | CXXFLAGS := -std=c++11 5 | INCLUDE_DIR := 6 | LIB_DIR := 7 | LIBS := -lpthread 8 | CC := g++ 9 | 10 | all:$(TARGET) 11 | 12 | $(TARGET):%.out:%.cc 13 | $(CC) $(CFLAGS) $(CXXFLAGS) $(INCLUDE_DIR) $(LIB_DIR) $< -o $@ $(LIBS) 14 | 15 | clean: 16 | -rm $(TARGET) 17 | -------------------------------------------------------------------------------- /content/reading-note/cpp-concurrency/hello-concurrency.cc: -------------------------------------------------------------------------------- 1 | // [[file:cpp-concurrency-in-action.org::*%E4%BD%A0%E5%A5%BD%EF%BC%8C%E5%B9%B6%E5%8F%91%E4%B8%96%E7%95%8C][你好,并发世界:1]] 2 | #include 3 | #include 4 | 5 | void Hello(void) { 6 | std::cout << "Hello,concurrency world" << std::endl; 7 | } 8 | 9 | int main(int argc, char *argv[]) 10 | { 11 | std::thread t(Hello); 12 | t.join(); 13 | 14 | return 0; 15 | } 16 | // 你好,并发世界:1 ends here 17 | -------------------------------------------------------------------------------- /content/reading-note/learn-more-study-less.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE:如何高效学习 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | 7 | * 什么是完整性学习 8 | 9 | ** 结构 10 | 结构是为了能够将只是系统的组织起来,方便记忆和理解。 11 | 12 | ** 模型 13 | 模型是结构的基础,模型是为了简化信息,然后在模型上进一步延伸,纠错,是为了更加方便的理解知识。 14 | 15 | ** 高速公路 16 | 高速公路是为了建立知识之间的联系,不同学科之间的只是联系更利于理解和创新。 17 | 18 | * 如何完整性学习 19 | 20 | ** 获取信息 21 | 通过获取信息来学习知识。信息有 5 种: 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 | 62 | + 处理方法:图表 63 | + 图表法:流程图,概念图,图像(具象) 64 | 65 | ** 应用 66 | 67 | 应用才是学习的目的。以项目为基础的学习。 68 | 69 | ** 纠错 70 | 71 | 进行模型纠错。 72 | 73 | * 其他 74 | 75 | ** 能量管理 76 | 控制健身,睡眠,饮食, 77 | 78 | ** 多实践 79 | 实践同样是在学习。 80 | 81 | ** 不拖延 82 | 83 | ** 批处理 84 | 85 | ** 有组织 86 | -------------------------------------------------------------------------------- /content/reading-note/principles.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 原则 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 8 | * 其他 9 | 城市之光书店? 10 | 11 | 桥水基金是怎么样的? 12 | 13 | 这本书教给我们什么? 14 | 15 | 如果应用这些原则进行实践? 16 | 17 | 为什么原则重要? 18 | + 思维决定过程。《快思慢想》 19 | + 独立思考真相是什么 20 | 21 | 机器: 22 | + 自己的决策机器是什么 23 | + 为什么会失败(信息,逻辑,理性,常识),常识很重要 24 | + 自我意识障碍和?障碍: 25 | + 每个人都有权利和责任尽力了解重要的事情,还必须保持和非常开放的心态。 26 | + 不同层级上的机器 27 | 28 | 29 | 进化: 30 | + 极度开放 31 | + 极度透明 32 | + 基于可信度加权的创意择优 33 | + 有意义的工作 34 | + 有意义的人际关系(新人和支持 35 | + 在高层次上,我们寻找能独立思考,心态开放和行事果断的人,更重要的是,他们能坚持追求真相和卓越,从而带动自我和机构的快速进步。由于我们对待工作不仅仅是为了谋生,我们要寻找的潜在员工不仅是一名雇员,还是能够与我们分享生活的人。我们坚持与我们共事的人要初始周到,并且怀有强烈的责任感去从事艰苦和正确的事。我们要找慷慨大方和对工作有很高追求的人。最重要的是,他们不刚愎自用,有自知之明。 36 | + 价值观 37 | + 3c(品格、常识、创造力) 38 | + 严厉之爱 39 | -------------------------------------------------------------------------------- /content/reading-note/the-annotated-stl-sources.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE:《STL源码剖析》读书笔记 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | -------------------------------------------------------------------------------- /content/reading-note/万历十五年.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 万历十五年 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 8 | * 9 | -------------------------------------------------------------------------------- /content/reading-note/从0开始学架构.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 从 0 开始学架构 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | 本文是极客时间[[https://time.geekbang.org/column/intro/81][《从 0 开始学架构》]]笔记。 7 | 8 | * 开篇词 9 | 10 | 架构设计的关键思想是判断和取舍,程序设计的关键思维是逻辑与实现。 11 | 12 | * 架构到底是什么? 13 | + 系统与子系统 14 | + 系统是相互协作可运行的实体。 15 | + 模块与组件 16 | + 组件是从技术维度上的复用。 17 | + 模块是从业务维度上职责的划分。 18 | + 框架与架构 19 | + 框架是面向变成或配置的半成品。 20 | + 架构软件的顶层设计。 21 | 22 | * 架构设计的历史背景 23 | + 第一次软件危机引出了“结构化”编程。 24 | 25 | 结构化程序的特点是抛弃 goto 语句,采用“自顶向下、逐步细化、模块化”的指导思想。本质上还是一种面向过程的设计思想。 26 | 27 | 第一次软件危机的根源在于软件的“逻辑”变得非常复杂。 28 | 29 | + 第二次软件危机引出了“面向对象”编程。 30 | 31 | 第二次软件危机的根源在于当时软件“扩展”变得非常复杂。 32 | 33 | + 软件架构的出现是因为软件的“规模”愈加庞大。 34 | 35 | 当系统由许多部分组成时,整个系统的组织,也就是所谓的“软件架构”,导致了一系列新的设计问题。 36 | 37 | * 架构设计的目的 38 | 架构设计的主要目的是为了解决软件系统复杂度带来的问题。 39 | 40 | 那么,如何做架构设计呢?就是要找到软件系统系统的的“复杂点”。 41 | 42 | 常见架构设计错误: 43 | + 架构混乱。要分析需求,识别复杂点。 44 | + 照搬别人的架构。错在不同的系统复杂点不同,架构自然不同。 45 | + 贪大求全。架构设计并不是为了面面俱到,而是识别复杂点,针对性的解决问题。 46 | 47 | * 复杂度来源:高性能 48 | -------------------------------------------------------------------------------- /content/reading-note/淘宝技术这十年.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8; -*- 2 | #+title: 《淘宝技术这十年》读书笔记 3 | #+author: 刘尚亮 4 | #+email: phenix3443@gmail.com 5 | #+startup:overview 6 | 7 | * 第 0 章 8 | + DNS 如何将不同的访问分配到不同的入口? 9 | + 大量文件的内容分发网络(CDN) 10 | + 大量文件的分布式文件系统(TFS) 11 | + 淘宝的主搜索系统,根据搜索关键词判断购物意图,展现不同结果。 12 | + 交易快照的保存,Tair 13 | + 访问日志的实时传输(TimeTunnel) 14 | + 数据仓库,极限存储,数据挖掘和分析。 15 | 16 | 17 | * 第 1 章 18 | + “买一个”是创业初期最快的方式。 19 | + ebay 收购易趣后没有注重用户体验,丧失用户。 20 | + 快速响应用户需求。 21 | 22 | * 第 2 章 23 | + 创业初期顶尖人才的重要性:快速解决各种疑难问题。 24 | + 好的架构和功能都是进化来的。 25 | + 支付手段和交流方式的创新。 26 | 27 | * 第 3 章 28 | + 技术选型:选择最成熟的,参考竞争对手的选择。 29 | + 技术实施:用最好人解决最复杂的问题。 30 | + 技术改造:分模块渐进式改造。 31 | + 围绕性能,容量,成本进化。 32 | 33 | * 第 4 章 34 | + TFS,Tair,isearch 35 | 36 | * 第5章 37 | + 分布式系统要求底层具有超大规模的容量和非常高的可用性,需要中间件提供系统间的通信和异步消息通知。 38 | + HSF,高性能服务框架,解决系统间的通信。这是一个分布式的标准service方式的RPC,service方式基于OSGI方式,通讯层采用TCP/IP方式。(对比grpc) 39 | + Notify,解决异步通信问题。 40 | + Tbsession,解决用户登录状态问题。 41 | + TDDL,分布式数据访问层,实现:消息路由,数据的多向非对称复制(类似读写分离),数据存储的自由扩展(异构数据库)。 42 | + 开放平台,SOA,OAuth2, 43 | 44 | * 第6 章 45 | + 有想法没用,要有产品出来,还要能迅速推向市场。 46 | 47 | * 第7 章 48 | + 正明:找到自己感兴趣的,花时间投进去,通过实践后的指示积累比只看书有用的多。 49 | + 正祥: 50 | + OceanBase 51 | + 数据库本质上是一个单机系统,分布式是一个解决方案(不懂!) 52 | + 把做事,做成事当作主要目标,心态决定成就。 53 | + 毕玄: 54 | + 最重要的是看对公司做出了多少贡献。 55 | + 跳出自己的工作范围,考虑公司将来会面临什么问题,最好是能解决这些问题。 56 | 57 | + 放翁: 58 | + 坚持把一个产品做精,做深,最后具有一定的技术发展和影响力。 59 | + P7要求人员对一个小的产品或团队有方向性的指导。 60 | + P8 要求在一个大部门或公司级的产品上有方向性的指导。 61 | + P9要求除了考虑自身产品外,还要求在公司的角度考虑自身的产品对公司的发展有什么帮助。 62 | -------------------------------------------------------------------------------- /content/redis/redis-in-action.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | #+title:Redis in action 3 | #+author: 刘尚亮 4 | #+email:phenix3443@gmail.com 5 | 6 | * 第一章 初识 redis 7 | + k/v 数据库。 8 | + 可以将数据持久化到硬盘。 9 | + 可以使用复制特性来扩展读性能。 10 | + 可以使用客户端分片来扩展写性能。 11 | 12 | 文章得分的计算方式设计比较精妙。将文章的发表时间和投票得分结合在一起,常数因子 432 的定义精巧。 13 | 14 | * 第二章 使用 redis 构建 web 应用 15 | 即使经过优化,大多数关系数据库在每台数据库服务器上每秒也只能插入、更新或者删除 200~2000 个数据库行。 16 | 17 | 统计浏览次数可以使用负数进行累加,这样方便排行,也是个技巧。 18 | 19 | * 第三章 redis 命令 20 | 支持的数据结构: 21 | + string 22 | + list 23 | + hash 24 | + set 25 | + order-set 26 | + pub/sub 27 | + transaction 28 | + script 29 | + geo 30 | + hyperloglog 31 | + stream 32 | 33 | 在客户端断线时间,服务端发送的消息,客户端都会丢失。 34 | 35 | * 第四章 数据安全与性能保障 36 | 如果 redis 内存占用量高达十几个 G,并且剩余容量不多,执行 bgsave 可能会导致系统长时间停顿。 37 | 38 | 虽然 save 会一直阻塞 redis 直到快照生成完成,但是因为它不需要创建子进程,所以就不会向 bgsave 一样因为创建子进程而导致停顿。 39 | 40 | 事务型流水线:使用 pipline/watch/multi/exec 等命令构成。 41 | 42 | 使用非事务型 pipeline 减少多个命令的网络消耗。 43 | 44 | redis-benchmark 命令判断 redis 性能,然后和实际性能作对比。 45 | 46 | * 第五章 使用 redis 构建支持程序 47 | 48 | * 第六章 使用 redis 构建应用程序组件 49 | 使用 watch 实现的是乐观锁。 50 | 51 | 使用 sexnx 实现锁,注意锁的力度。 52 | 53 | 计数信号量 54 | 55 | 任务队列 56 | 57 | * 第七章 基于搜索的应用程序 58 | 59 | * 第八章 构建简单社交网站 60 | 61 | * 第九章 降低内存使用 62 | 三种方法: 63 | + 短结构:压缩表,整数集合 64 | + 分片 结构 65 | + 打包存储二进制位 66 | 67 | * 第十章 扩展 redis 68 | 69 | * 第十一章 redis 的 Lua 脚本 70 | -------------------------------------------------------------------------------- /content/redis/redis.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | #+title:Redis 3 | #+author: 刘尚亮 4 | #+email:phenix3443@gmail.com 5 | 6 | * 概述 7 | redis 8 | 9 | * 安装 10 | 11 | ** apt 12 | #+BEGIN_SRC sh 13 | apt install redis-server redis-tools 14 | #+END_SRC 15 | 16 | 设置监听的 IP、端口、密码等: 17 | #+BEGIN_SRC sh 18 | vim /etc/redis/redis.conf 19 | #+END_SRC 20 | 重新启动服务: 21 | #+BEGIN_SRC sh 22 | sudo systemctl restart redis-server 23 | #+END_SRC 24 | 25 | ** yum 26 | 27 | ** brew 28 | 29 | * 使用 30 | -------------------------------------------------------------------------------- /content/redis/the-design-and-implementation-of-redis.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | #+title: redis设计与实现 3 | #+author: 刘尚亮 4 | #+email: phenix3443@gmail.com 5 | 6 | * 简介 7 | -------------------------------------------------------------------------------- /content/renovate_house/chazuo.md: -------------------------------------------------------------------------------- 1 | # 分类 2 | 按电流分一般可分为10A、16A,普通插座都是10A的,空调、热水器等大功率电器需要使用16A的插座。 3 | 4 | # 品牌 5 | 进口品牌阵营推荐松下(日本)、西门子(德国)、施耐德(法国)、立维腾(美国)、西蒙(西班牙) 6 | 7 | 国产品牌阵营推荐公牛、飞雕、德力西、正泰、欧普。 8 | 9 | # 功能 10 | 11 | # 购买 12 | ## 入室花园 13 | 进门左手侧鞋柜台面上布置**一个斜五孔插座**,我打算在这里安装一个智能摄像头,鞋柜灯带。 14 | 15 | 弱电箱预留**两个斜五孔插座**,给光猫和路由器使用。 16 | 17 | ## 厨房 18 | 吊顶上方预留**一个五孔插座**给油烟机使用。 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 | 预留**3个五孔插座**给智能家居。 56 | 57 | ## 主卧 58 | 床两侧预留**两个五孔插座** 充手机。 59 | 60 | 窗帘处预留**五孔插座**,电动窗帘。 61 | 62 | 高处预留**一个五孔插座**,给空调。 63 | 64 | ## 老人房 65 | 办公区预留**一个五孔插座**给台灯。 66 | 67 | 窗帘处预留**五孔插座**,电动窗帘。 68 | 69 | 高处预留**一个五孔插座**,给空调。 70 | 71 | ## 客房 72 | 飘窗旁边预留**一个五孔插座**。 73 | 74 | 高处预留**一个五孔插座**,给空调。 -------------------------------------------------------------------------------- /content/renovate_house/guide.md: -------------------------------------------------------------------------------- 1 | # 房屋情况 2 | 3 | # 整体思路 4 | 5 | # 入室花园 6 | 7 | # 餐厅 8 | 9 | # 厨房 10 | 11 | # 卫生间 12 | 13 | # 客厅 14 | 15 | # 老人房 16 | 17 | # 客房 18 | 19 | # 主卧 -------------------------------------------------------------------------------- /content/renovate_house/smart-home.md: -------------------------------------------------------------------------------- 1 | # 房屋装修-智能家居 2 | 3 | # 需求 4 | ## 常见场景 5 | 1. 智能门锁。 6 | 2. 晚上到家,开门时,自动打开入室花园灯、客厅灯,鞋柜的灯带。 7 | 1. 智能门锁。 8 | 2. 门锁和相关灯智能联动。 9 | 3. 进入客厅以后2分钟后,自动关闭入室花园灯、鞋柜灯带。如果重新进入入室花园,等打开。 10 | 1. 人体感应。 11 | 4. 打开阳台门,自动点亮阳台灯。关闭阳台门后一分钟,自动关闭阳台灯。 12 | 1. 门锁联动。 13 | 5. 晚上时间段,进入卧室一定时间后,关闭客厅灯。 14 | 1. 门锁联动 15 | 6. 打开卫生间门,点亮卫生间灯;关闭卫生间门,关闭灯。 16 | 7. 人站到洗手台前面,点亮镜面灯。 17 | 8. 晚上起夜,感应到人体,点亮床边等,开卧室门,以柔和模式,点亮走廊灯、客厅灯、卫生间灯。 18 | 9. 重新上床后,关闭卫生间等,客厅灯,走廊灯,床边等。 19 | 10. 晚上自动关闭窗帘、早上自动打开窗帘,支持手动。 20 | 11. 扫地机器人定时运行。 21 | 12. 下雨天自动关窗。 22 | 13. 烟雾传感器自动报警。 23 | 14. 温度传感器自动开空调。 24 | 15. 25 | ## 特殊场景 26 | 1. 家里有老人,希望让生活尽可能简单,方便老人开灯、开门,晚上起夜。 27 | 1. 灯具自动开关。 28 | 2. 需要人体感应。 29 | 2. 家里有猫,希望能自动清理猫毛,保持家里卫生。 30 | 1. 扫地机器人。 31 | 3. 周边可能装修,保持家里的空气质量。 32 | 1. 空气进化器。 33 | 34 | 35 | # 品牌 36 | ## 米家 37 | ## 华为 38 | 39 | # 购买 40 | 41 | |种类|位置| 42 | |---|---| 43 | |智能插座(16A)|卧室空调(3)| 44 | ||主卧和老人房自动窗帘(2) 45 | |智能灯(开关)|入室花园灯开关(1) 46 | ||餐厅灯开关(2) 47 | ||厨房灯开关(1) 48 | ||客厅灯开关(1) 49 | ||卫生间灯开关(1) 50 | ||阳台灯开关(1) 51 | ||阳台晾衣架(1) 52 | ||走廊灯开关(3) 53 | ||卧室灯开关(3) 54 | -------------------------------------------------------------------------------- /content/ruby/ruby基础教程笔记.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8; -*- 2 | #+title:Ruby 基础教程读书笔记 3 | #+author: 刘尚亮 4 | #+email: phenix3443@gmail.com 5 | 6 | * 第一章 Ruby 初探 7 | + 单引号中的特殊字符不经过转义。 8 | + p 方法可以区分输出的是数字还是字符串。 9 | + 使用 ~#~ 作为注释符号。 ~=begin~ 和 ~=end~ 括起来的部分也是注释。 10 | + 使用 ~inlucde~ 导入库。 11 | + 条件判断: ~if then else end~ 12 | + 循环: 13 | + ~while do end~ 14 | + ~循环次数.times do~ 15 | 16 | * 第二章 便利的对象 17 | + 数组 18 | + 形式: 19 | #+BEGIN_SRC ruby 20 | lang = ["c", "c++", "ruby"] 21 | #+END_SRC 22 | + 可以用来保存对象,支持不同类型对象的混合保存,下标从 0 开始。 23 | + 方法: 24 | #+BEGIN_SRC ruby 25 | print(lang.size) 26 | #+END_SRC 27 | + 遍历: 28 | #+BEGIN_SRC ruby 29 | lang.each do |e| 30 | print(e) 31 | end 32 | #+END_SRC 33 | + 散列 34 | + 形式: 35 | #+BEGIN_SRC ruby 36 | person = {name: "ruby", :age => 18} 37 | #+END_SRC 38 | 39 | + 存储键值对 40 | + 散列中使用符号做 key 要比字符串更有效率。 41 | + 遍历: 42 | #+BEGIN_SRC ruby 43 | person.each do |key, value| 44 | print(key,value) 45 | end 46 | #+END_SRC 47 | + 正则表达式 48 | + 形式: /模式/ 49 | #+BEGIN_SRC ruby 50 | /Ruby/ =~ "ruby" 51 | #+END_SRC 52 | 53 | + 使用 ~=~~ 来匹配字符串,成功返回匹配部分的位置,失败返回 nil。 54 | 55 | * 第三章 创建命令 56 | + 内置数组 ARGV 表示命令行传递的参数。0 表示第一个参数,而不是脚本文件。 57 | + 遍历文件: 58 | #+BEGIN_SRC ruby 59 | file = File.open('test.txt') 60 | file.each_line do |line| 61 | puts(line) 62 | end 63 | #+END_SRC 64 | + 定义方法: 65 | #+BEGIN_SRC ruby 66 | def say_hello 67 | puts("hello") 68 | end 69 | #+END_SRC 70 | + 使用 require 引用其他文件。 71 | -------------------------------------------------------------------------------- /content/schedule/2018-2019.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 2018-2019 回顾和展望 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 2018 7 | 工作技能: 8 | + 深入理解了 openresty 技术开发 9 | 10 | * 2019 11 | 主要包括个人技能: 12 | 1. 练字 13 | 2. 摄影 14 | 3. 急救 15 | 4. 雅思 16 | 5. 驾驶 17 | 6. 素描 18 | 19 | 运动: 20 | + 跑步:掌握正确的跑步方法。 21 | + 游泳:熟练游泳技能。 22 | + 力量训练: 23 | 24 | 生活: 25 | + 游览深圳周边景点和城市。 26 | + 提高自己的文学素养。 27 | 28 | 个人习惯: 29 | + 自控力 30 | + 专注力 31 | + 效率 32 | 33 | 工作技能: 34 | + 分布式 35 | + 网络 36 | + k8s 37 | + 算法 38 | + 三高程序设计 39 | + 设计模式 40 | + 深入已有技术 41 | + redis 42 | + mysql 43 | + golang 44 | 45 | + 源码阅读 46 | + Lua 源码 47 | + Redis 源码 48 | + 极客时间 49 | + 软件工程之美:每周 2,4,6 50 | + 10x 程序员工作法:每周 1,3,5 51 | + nginx 核心知识 100 讲 52 | + MySQL 实战 45 讲 53 | 54 | 55 | 有些技能需要持续的学习理论知识:例如雅思,以及工作技能。利用工作之余的大块时间学习,例如午休、下班后、周末。 56 | 57 | 有些技能则更需要日常生活实践,例如摄影,练字,急救等。可以利用日常的碎片时间练习。 58 | 59 | ** 练字 60 | 61 | ** 摄影 62 | + 摄影的系统学习 63 | + 色彩 64 | + 构图 65 | + 手机摄影 66 | + 单反摄影 67 | 68 | ** 急救 69 | + 常见的急救方法。 70 | + AHA 急救证书 71 | 72 | ** 雅思 73 | 74 | ** 驾驶 75 | 76 | ** 跑步 77 | 正确系统的跑步方法。 78 | 79 | ** 游泳 80 | 81 | ** 深圳周边景点 82 | + 华侨城文化创意园 83 | + 何香凝美术馆 84 | 85 | ** 文学素养 86 | + 古诗词 87 | + 文学作品 88 | + 历史 89 | 90 | ** 自控力 91 | 92 | ** 高效 93 | 94 | ** 分布式 95 | 96 | ** 网络知识 97 | 98 | ** k8s 99 | 100 | ** 算法 101 | -------------------------------------------------------------------------------- /content/scrapy/0_guide.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: scrapy 指南 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 文中代码如无特殊说明都来自[[https://doc.scrapy.org/en/latest/][Scrapy 1.5 documentation]], 8 | 9 | * 第一部分 基础 10 | 11 | ** overview 12 | scrapy 基本介绍:背景、优缺点、安装方式。 13 | 14 | ** command-tools 15 | 了解常用命令行工具。 16 | 17 | ** simple spider 18 | 编写一个简单的爬虫。 19 | 20 | ** simple project 21 | 编写一个简单的项目。 22 | 23 | ** settings 24 | 25 | ** logging 26 | 了解爬虫的日志系统。 27 | 28 | ** exception 29 | 了解异常处理。 30 | 31 | * 第二部分 进阶 32 | 33 | ** architecture 34 | 了解节本架构。 35 | 36 | ** requests 37 | 38 | ** responses 39 | 40 | ** selectors 41 | 42 | ** items 43 | 44 | ** pipeline 45 | 46 | * 第三部分 高阶 47 | 48 | ** 抓取动态页面 49 | 50 | ** 部署 51 | 52 | ** 去重 53 | 54 | ** 断点续爬 55 | 56 | ** 分布式爬虫 57 | 58 | ** 反爬虫 59 | 介绍常见的反爬虫手段及应对方法。 60 | -------------------------------------------------------------------------------- /content/scrapy/anti-crawl.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 反爬虫策略 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | 本文说明常见的反爬虫手段和应对措施。 7 | 8 | * 抓取频率 9 | scrapy 中默认开启 ~RANDOMIZE_DOWNLOAD_DELAY~ ,可以在访问同一站点页面延迟一段时间(0.5*DOWNLOAD_DELAY 到 1.5*DOWNLOAD_DELAY)。通过如下设置生效: 10 | #+BEGIN_EXAMPLE 11 | DOWNLOAD_DELAY = 3 12 | #+END_EXAMPLE 13 | 14 | * user-agent 15 | 16 | * cookie 17 | 18 | * 代理 IP 19 | ** 付费代理 20 | 知乎《[[https://www.zhihu.com/question/47419361][国内有什么好的代理 IP(http) 提供商?]]》 21 | 22 | + 无忧代理 23 | 24 | ** 免费代理 25 | *** haipproxy 26 | *** dungproxy 27 | 28 | * 验证码 29 | ** tessserocr 30 | tesserocr 是 Python 的一个 OCR 识别库,可以用来识别图形验证码。其实是对 tesseract 做的一层 Python API 封装。 31 | 32 | ** 滑动验证码 33 | 使用 selenium 模拟人操作。 34 | 35 | ** 点触验证码 36 | 使用 selenium 模拟人操作。 37 | 38 | * 鼠标轨迹 39 | -------------------------------------------------------------------------------- /content/scrapy/distribute.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 分布式爬虫 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 8 | * 技术要点 9 | 10 | ** 存储队列 11 | 12 | ** 去重 13 | 14 | ** 防止中断 15 | 16 | ** 部署 17 | 18 | * Scrapy-redis 19 | 20 | * Gerapy 21 | Gerapy 是一个 Scrapy 分布式管理模块。 22 | -------------------------------------------------------------------------------- /content/scrapy/dynamic-web.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 抓取动态页面 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | 主要介绍动态渲染页面的抓取。 7 | * 动态页面技术 8 | ** Ajax 9 | Ajax,全称为 Asynchronous JavaScript and XML,即异步的 JavaScript 和 XML。 它不是一门编程语言,而是利用 JavaScript 在保证页面不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页的技术 。 10 | 11 | 通过 chrome 或者 Firefox 自带的开发者工具分析 Ajax 请求的网络连接。 12 | 13 | * 请求库 14 | 15 | ** Selenium 16 | 用于驱动浏览器执行特定的动作。 17 | 18 | ** ChromeDriver 19 | 配置 selenium 操作 chrome 浏览器。 20 | 21 | ** GeckoDriver 22 | 配合 selenium 操作 Firefox 浏览器 23 | 24 | ** PhantomJS 25 | PhantomJS 是一个无界面的 、可脚本编程的 WebKit 浏览器引擎,它原生支持多种 Web 标准 :DOM 操作、css 选择器、JSON、Canvas 以及 SVG。 26 | 27 | Selenium 支持 PhantomJS,这样在运行的时候就不会再弹出 一个浏览器了 。 28 | 29 | ** appunim 30 | Appium 是移动端的自动化测试工具,类似于前面所说的 Selenium,利用它可以驱动 Android、iOS 等设备完成向动化测试,比如模拟点击、滑动、输入等操作。 31 | -------------------------------------------------------------------------------- /content/scrapy/items.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: scrapy 之 items 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 为了定义通用输出数据格式,Scrapy 提供了 Item 类。Item 对象是用于收集已抓取数据的简单容器。它们提供类似字典的 API,用来声明其可用字段。 8 | 9 | 各种 Scrapy 组件使用 Items 提供的额外信息:导出器查看声明的字段以确定要导出的列,可以使用 Item 字段元数据自定义序列化,trackref 跟踪 Item 实例以帮助查找内存泄漏(请参阅使用 trackref 调试内存泄漏)等。 10 | 11 | * 声明 12 | #+BEGIN_SRC python 13 | import scrapy 14 | 15 | class Product(scrapy.Item): 16 | name = scrapy.Field() 17 | price = scrapy.Field() 18 | stock = scrapy.Field() 19 | last_updated = scrapy.Field(serializer=str) 20 | #+END_SRC 21 | 22 | * Item 23 | Field 对象用于指定每个字段的元数据。例如,上面示例中说明的 last_updated 字段的序列化函数。 24 | 25 | 可以为每个字段指定任何类型的元数据。Field 对象接受的值没有限制。出于同样的原因,没有所有可用元数据键的参考列表。Field 对象中定义的每个键可以由不同的组件使用,只有那些组件知道它。 也可以根据自己的需要在项目中定义和使用任何其他 Field 键。Field 对象的主要目标是提供一种在一个地方定义所有字段元数据的方法。通常,行为取决于每个字段的那些组件使用某些字段键来配置该行为。必须参考其文档以查看每个组件使用的元数据键。 26 | 27 | 请务必注意,用于声明项目的 Field 对象不会保留为类属性。相反,可以通过 Item.fields 属性访问它们。 28 | 29 | * 实践 30 | 31 | ** 元数据 32 | -------------------------------------------------------------------------------- /content/scrapy/middleware.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: scrapy 之 middleware 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 8 | * spider middleware 9 | 10 | * download middleware 11 | 位于 scrapy 的 engine 和 download 之间的处理模块。 12 | 13 | Downloader Middleware 在整个架构中主要作用: 14 | + 在 Scheduler 调度出队列的 Request 发送给 Doanloader 下载之前对其进行修改 。 15 | + 在下载后生成的 Response 发送给 Spider 之前,对其进行修改。 16 | 17 | Downloader Middleware 的功能卡分强大,修改 User-Agent、 处理重定向 、设置代理、失败重试、设置 Cookies 等功能都需要借助它来实现。 18 | 19 | ** process_requrest(reqest, spider) 20 | 返回值如下: 21 | + None 22 | + Request 23 | + Response 24 | + IgnoreRequest 异常 25 | 26 | ** process_response(reqest, response, spider) 27 | 返回值如下: 28 | + Request 29 | + Response 30 | + IgnoreRequest 异常 31 | 32 | ** process_exception(request, exception, spider) 33 | 返回值如下: 34 | + None 35 | + Request 36 | + Response 37 | -------------------------------------------------------------------------------- /content/scrapy/overview.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: scrapy 概述 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | scrapy 是一个 python 编写的爬虫框架。 8 | 9 | * 优点 10 | 1. 抽象爬虫的工作流程,实现了很多通用的模块,如下载模块,解析模块。我们只要关注核心的业务模块就可以了。 11 | 2. 提供了很多内置的功能,例如内置的几种 export 模块。 12 | 3. 可以高性能、分布式的爬取信息。scrapy 基于 twisted 实现了异步请求,可以异步处理爬虫任务。 13 | 14 | * 请求库 15 | ** urlib 16 | ** requests 17 | 18 | * 解析库 19 | 20 | ** re 21 | 正则表达式。 22 | 23 | ** lxml 24 | lxml 是 Python 的一个解析库,支持 HTML 和 XML 的解析,支持 XPath 解析方式,而且解析效率非常高。 25 | 26 | ** Beautiful Soup 27 | Beautiful Soup 依赖于 lxml 库,它拥有强大的 API 和多样的解析方式, 28 | 29 | ** pyquery 30 | pyquery 同样是一个强大的网页解析工具,它提供了和 jQuery 类似的语法来解析 HTML 文梢,支持 css 选择器,使用非常方便 31 | 32 | * 安装 33 | #+BEGIN_SRC sh 34 | pip3 install scrapy 35 | #+END_SRC 36 | -------------------------------------------------------------------------------- /content/scrapy/requests.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: scrapy 之 requests 和 response 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | 7 | * request 8 | 9 | ** url 10 | 11 | ** callback 12 | 13 | ** errback 14 | 15 | * response 16 | 17 | ** follow() 18 | -------------------------------------------------------------------------------- /content/scrapy/settings.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: scrapy 之 settings 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | * 概述 6 | Scrapy settings 允许自定义所有 Scrapy 组件的行为,包括核心,扩展,管道和蜘蛛本身。 7 | 8 | 可以使用环境变量 SCRAPY_SETTINGS_MODULE 来指明 scrapy 使用哪个设置。 9 | 10 | setting 的是一个字典结构,代码可以从中提取配置值。可以通过不同的机制填充设置,按优先顺序递减如下表: 11 | 1. 命令行选项 12 | 2. 每个爬虫选项 13 | 3. 项目设置选项 14 | 4. 每个命令的默认设置 15 | 5. 全局默认设置。 16 | 17 | * 实践 18 | spider 自身 =self.crawler.settings= 访问项目的相关属性。 19 | -------------------------------------------------------------------------------- /content/scrapy/simple-project.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 简单的 scrapy 爬虫工程项目 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 本文描述如何创建 scrapy 项目,还是抓取以 http://quotes.toscrape.com 为例。 8 | 9 | * 创建项目 10 | 11 | #+BEGIN_SRC sh 12 | scrapy startproject tutorial 13 | #+END_SRC 14 | 15 | 上面的命令建立了一个名为 tutorial 的爬虫项目: 16 | #+BEGIN_EXPORT html 17 | 18 | #+END_EXPORT 19 | 20 | * 创建爬虫 21 | 22 | #+BEGIN_SRC sh 23 | scrapy genspider quotes quotes.toscrape.com 24 | #+END_SRC 25 | 可以看到新生成 =tutorial/spiders/quotes.py= 文件,此处的 parse 方法如同 [[file:simple-spider.html][simple-spider ]]。 26 | 27 | * 运行爬虫 28 | #+BEGIN_SRC sh 29 | scrapy crawl -o quotes.jl quotes 30 | #+END_SRC 31 | 32 | 这里使用了 =quotes.jl= ,而不是前文的 =quote.json= ,二者差别: 33 | + quotes.json 数据都被放在 json 数组中,经过多次追加之后,整个文件就不是一个规范的 json 文件。 34 | + quotes.j 每条数据一行记录,相比前者,更方便后续解析。 35 | 36 | 注意:动词运行该命令,输出是追加到文件中,它并不会清空原先输出文件中的内容。 37 | 38 | * 修改设置 39 | 通过调整项目配置( ~tutorial/tutorial/settings.py~ ), 可以解决结果文件中的编码问题。设置相关参考 [[https://docs.scrapy.org/en/latest/topics/settings.html][settings]]。 40 | 41 | #+BEGIN_SRC python 42 | # export settings 43 | FEED_EXPORT_ENCODING = "utf-8" 44 | #+END_SRC 45 | 46 | * 下一页 47 | -------------------------------------------------------------------------------- /content/scrapy/simple-spider.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 一个简单爬虫的实现 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 本文实现抓取 http://quotes.toscrape.com 上名人名言的爬虫。 8 | 9 | * 创建 10 | #+BEGIN_SRC 11 | scrapy genspider quotes quotes.toscrape.com 12 | #+END_SRC 13 | 14 | 修改代码: 15 | #+BEGIN_EXPORT html 16 | 17 | #+END_EXPORT 18 | 19 | + 这个爬虫从网页中提取两个内容:格言的内容(text)和作者(author)。 20 | + next_page 表示继续爬取下一页内容。 21 | + ~-o~ 参数表示将提取的内容保存到 ~quotes.json~ 文件中。 22 | 23 | * 运行 24 | 通过 ~scrapy runspider~ 可以直接运行一个爬虫,而不用建立工程。 25 | #+BEGIN_SRC sh 26 | scrapy runspider quotes_spider.py -o quotes.json 27 | #+END_SRC 28 | 29 | * 结果 30 | #+BEGIN_SRC json 31 | [{ 32 | "author": "Jane Austen", 33 | "text": "\u201cThe person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.\u201d" 34 | }, 35 | { 36 | "author": "Groucho Marx", 37 | "text": "\u201cOutside of a dog, a book is man's best friend. Inside of a dog it's too dark to read.\u201d" 38 | }, 39 | { 40 | "author": "Steve Martin", 41 | "text": "\u201cA day without sunshine is like, you know, night.\u201d" 42 | }, 43 | ...] 44 | #+END_SRC 45 | 46 | 上面保存的文件中,有些编码\uxxx,这是 json 库编码问题,通过 scrapy 设置项可解决。 47 | 48 | * 基本概念 49 | ** spider 50 | ** requests 51 | ** responese 52 | ** selector 53 | -------------------------------------------------------------------------------- /content/scrapy/spiders.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: scrapy 之 spiders 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | spider 是定义如何抓取特定网站(或一组网站)信息的类。 8 | 9 | * 属性或函数 10 | 11 | ** name 12 | 爬虫的名字。在项目中唯一。 13 | 14 | ** start_urls 15 | 开始爬网的 URL 列表。 16 | 17 | ** custom_settings 18 | 爬虫的设置,可以覆盖 project 相关的设置选项。 19 | 20 | ** crawler 21 | 初始化类后,此属性由 =from_crawler()= 类方法设置,并链接到此 spider 实例绑定到的 Crawler 对象。 22 | 23 | 出于访问需要,Crawler 封装了项目中的许多组件(例如扩展,中间件,信号管理器等)。请参阅 Crawler API 以了解有关它们的更多信息。 24 | 25 | 可以通过该属性,访问项目的设置。 26 | 27 | ** settings 28 | 运行此蜘蛛的配置。这是一个“setting”实例,有关此主题的详细介绍,请参阅“设置”主题。 29 | 30 | ** logger 31 | 使用 spider 命名的 logger。 32 | 33 | ** from_crawler(crawler, *args, **kwargs) 34 | 这是 Scrapy 用于创建蜘蛛的类方法。 35 | 36 | 可能不需要直接覆盖它,因为默认实现作为 =__init__()= 方法的代理,使用给定参数 args 和命名参数 kwargs 调用它。 37 | 38 | 尽管如此,此方法在新实例中设置 crawler 和 settings 属性,以便稍后可以在 spider 代码中访问它们。 39 | 40 | ** parse(response) 41 | 其 requess 未指定回调时处理下载的响应,这是 Scrapy 使用的默认回调函数。 42 | 43 | * 实践 44 | -------------------------------------------------------------------------------- /content/shell/bash-language-server.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: bash-language-server 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/mads-hartmann/bash-language-server][bash-language-server]] 是 bash 的 language server,支持: 8 | + 跳转到声明 9 | + 查找引用 10 | + 代码大纲、显示符号 11 | + 高亮显示 12 | + 代码补全(常用的 shell 命令) 13 | + 简单的诊断报告 14 | + 悬停标志的说明文档 15 | 16 | * 安装 17 | #+BEGIN_SRC sh 18 | sudo npm i -g bash-language-server 19 | #+END_SRC 20 | 21 | * 配置 22 | 23 | ** emacs 24 | Lsp-mode 具有内置的客户端,可以通过 use-package 安装。将配置添加到您的 =.emacs.d/init.el= 25 | #+BEGIN_SRC elisp 26 | (use-package lsp-mode 27 | :commands lsp 28 | :hook 29 | (sh-mode . lsp)) 30 | #+END_SRC 31 | -------------------------------------------------------------------------------- /content/shell/shell_tips.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: shell常见的语句 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | 7 | * 查找目录下最大的文件 8 | 9 | #+BEGIN_SRC 10 | find /usr/ -type f | xargs du -sk | sort -rn | head -1 11 | #+END_SRC 12 | -------------------------------------------------------------------------------- /content/software-engineering/aliyun.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 阿里云主机实践 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 记录阿里云主机使用期间的使用。 8 | 9 | * 疑问 10 | 11 | ** ECS 网络类型 12 | + 专有网络:基于阿里云构建的一个隔离的网络环境。疑问:这是一个怎么样的网络环境?类似 docker 的么?网络性能会不会有问题? 13 | + 经典网络:这是物理网络么? 14 | 15 | * 实践 16 | -------------------------------------------------------------------------------- /content/software-engineering/aws.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: aws 实践 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | * sshfs 6 | #+BEGIN_SRC sh 7 | sshfs @<公有 DNS>: /data/aws -o IdentityFile= 8 | #+END_SRC 9 | 10 | 注意: 11 | + 公有 DNS 后面的冒号(:)不能省略,否在会报错: 12 | #+BEGIN_QUOTE 13 | missing host 14 | see `sshfs -h' for usage 15 | #+END_QUOTE 16 | + =aws-key.pem= 要使用绝对路径,否则会报错: 17 | #+BEGIN_QUOTE 18 | read: Connection reset by peer 19 | #+END_QUOTE 20 | -------------------------------------------------------------------------------- /content/software-engineering/concurrency-concepts.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8; -*- 2 | #+title: 关于并发(行)的一些概念 3 | #+author: 刘尚亮 4 | #+email: phenix3443@gmail.com 5 | 6 | * concurrency and parallel 7 | 二者的区别 8 | * semaphore 9 | * mutex 10 | * lock 11 | -------------------------------------------------------------------------------- /content/software-engineering/config-file.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 软件工程中的配置文件 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443@gmail.com 5 | 6 | * 概述 7 | 配置是程序很重要的一部分,程序配置应该最少支持三个级别:内置、配置文件、命令行选项,优先级一次递增。 8 | 1. 内置提供配置项的默认值。 9 | 2. 配置文件是程序配置的主要配置手段,程序的运行主要依赖配置文件。 10 | 3. 命令行选项主要用于调试,比如修改日志的优先级等。 11 | 12 | 配置文件是程序很重要的一部分。一个良好的配置文件应该满足如下的需求: 13 | 1. 语法简单,灵活。 14 | 2. 添加注释。注释是为了开发或运维人员修改方便。 15 | 3. 配置项支持引用。配置文件中有些配置项目是通用的,如果可以通过变量引用会更方便。 16 | 4. 配置文件支持继承。公共的配置项目和不同实例的差异配置项目可以分开。 17 | 5. 有各种语言实现的解析器。配置文件应该独立于具体语言。 18 | 19 | * 常见配置文件 20 | 21 | ** 语言支持 22 | 有些脚本语言,如lua,python,可以将配置写在独立的脚本(如config.suffix),然后导入该模块。 23 | 24 | ** ini 25 | 26 | ** json 27 | json不能添加注释。 28 | 29 | ** yaml 30 | 31 | ** HOCON 32 | 33 | * 对比 34 | | | lang | ini | json | yaml | HOCON | 35 | |--------------+------+-----+------+------+-------| 36 | | 语法简单 | Y | Y | Y | Y | | 37 | | 支持注释 | Y | Y | N | Y | | 38 | | 变量引用 | Y | N | N | Y | | 39 | | 配置文件继承 | Y | N | N | N | | 40 | | 多语言支持 | N | Y | Y | Y | | 41 | -------------------------------------------------------------------------------- /content/software-engineering/continuous-integration-practices.org: -------------------------------------------------------------------------------- 1 | #+title:持续集成实践 2 | 3 | * 简介 4 | * 常用软件 5 | -------------------------------------------------------------------------------- /content/software-engineering/database.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 数据库产品分析 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | -------------------------------------------------------------------------------- /content/software-engineering/debug/DTrace.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: DTrace.org 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://en.wikipedia.org/wiki/DTrace][DTrace]] 8 | 9 | * 安装 10 | 11 | * 使用 12 | 13 | * 扩展阅读 14 | 15 | + [[https://openresty.org/posts/dynamic-tracing/][动态追踪技术漫谈]] 16 | -------------------------------------------------------------------------------- /content/software-engineering/debug/debug-with-gdb.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8; -*- 2 | #+title: 《Debug with gdb》笔记 3 | #+author: 刘尚亮 4 | #+email: phenix3443@gmail.com 5 | #+startup:overview 6 | 7 | * getting in and out of gdb 8 | 9 | * gbd commands 10 | 11 | ** command syntax 12 | + 空行在大部分情况下表示重复执行命令。 13 | + 对于list和x命令,使用RET重复会创新新的参数,而不是重复输入。 14 | + RET也可以用来分割多行输出,就和more一样。 15 | + #之后的文本表示注释,什么都不做,多用在command file中。 16 | + Ctrl-o用来重复执行复杂的命令序列。该命令接受当前行,如RET,然后从历史记录中提取相对于当前行的下一行以进行编辑。(没有搞明白) 17 | 18 | ** completion 19 | + 有时候补全的字符串中有gdb认为不是单词的部分,比如(,这时候可以使用单引号将补全的字符串括起来,这在设置C++函数名字的时候很有用,比如: 20 | #+BEGIN_EXAMPLE 21 | (gdb) b 'bubble( M-? 22 | bubble(double,double) bubble(int,int) 23 | #+END_EXAMPLE 24 | + gdb不仅可以补全命令,还可以补全变量,结构体等。 25 | 26 | ** help 27 | + info用来描述程序运行状态。可以查看程序函数参数,寄存器,或者断点点戏。 28 | + show用来描述gdb运行状态。 29 | 30 | * Running Programs Under GDB 31 | -------------------------------------------------------------------------------- /content/software-engineering/debug/factorial.c: -------------------------------------------------------------------------------- 1 | /* factorial.c */ 2 | /* 第三章代码程序,测试gdb基本使用 */ 3 | #include 4 | #include 5 | 6 | int factorial(int n) { 7 | int result=1; 8 | if(n==0) { 9 | return result; 10 | } 11 | result = n * factorial(n-1); 12 | return result; 13 | } 14 | 15 | int main(int argc, char *argv[argc]) 16 | { 17 | int n,result; 18 | if(argc !=2){ 19 | fprintf(stderr, "usage: factorial n, n>=0\n"); 20 | return 1; 21 | } 22 | n = atoi(argv[1]); 23 | result = factorial(n); 24 | printf("factorial %d=%d\n",n,result); 25 | return 0; 26 | } 27 | -------------------------------------------------------------------------------- /content/software-engineering/debug/flame-graph.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: flame graph 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | #+STARTUP: overview 6 | 7 | * 概述 8 | 9 | * 使用 10 | 11 | * 扩展 12 | + [[https://www.slideshare.net/brendangregg/blazing-performance-with-flame-graphs][Blazing Performance with Flame Graphs]] 13 | -------------------------------------------------------------------------------- /content/software-engineering/debug/log-system.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 日志系统 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 通过日志可以: 8 | 1. 了解线上系统的运行状态 9 | 2. 快速准确定位线上问题 10 | 3. 发现系统瓶颈 11 | 4. 预警系统潜在风险 12 | 5. 挖掘产品最大价值 13 | 6. …… 14 | 15 | * 分类 16 | 日志从功能来说,可以分为: 17 | + 诊断日志:调试代码、追踪问题,输出到控制台。 18 | + 统计日志:统计请求、数据埋点,格式化输出,方便进一步数据处理。 19 | 20 | * 原则 21 | + 日志打印不能阻塞业务流程。 22 | + 不同功能或类型的日志输出到不同文件。 23 | + 日子文件按时间进行分割,方便定位问题。 24 | + 日志中的信息量应该合理,不多不少。 25 | + 日志需要不断优化。 26 | + 请求处理流程应该使用 RequestID 串起来。 27 | + 日志格式应该统一规范。 28 | 29 | * 数据 30 | 下面这些数据应该打印: 31 | + 服务启动参数,初始化流程。 32 | + 代码异常处理逻辑。 33 | + 请求和响应都应该打印,方便出问题的时候还原场景。 34 | 35 | * tip 36 | + 日志组件支持动态修改日志级别,方便线上调试 bug。例如可以当特定 userid,或参数中携带 ~debug=on~ 这样的参数时,就将日志级别修改为 =debug= ,打印更加详细的信息。 37 | + 日志分割可以借助第三方工具来实现,并不一定需要日志组件支持。 38 | + 分布式日志可以对接 ELK 等系统,方便汇总处理,形成图表。 39 | + 使用格式化字符串拼装日志信息,不要使用字符串拼接。 40 | -------------------------------------------------------------------------------- /content/software-engineering/debug/memory.c: -------------------------------------------------------------------------------- 1 | /* memory.c */ 2 | /* 第四章程序,用于测试内存错误 */ 3 | #include 4 | #include 5 | 6 | int main(int argc, char *argv[argc]) 7 | { 8 | const int size = 100; 9 | int sum = 0; 10 | int *A = (int *)malloc(sizeof(int)*size); 11 | 12 | for (int n=size;n>0;n--) { 13 | A[n] = n; 14 | } 15 | 16 | for (int n=0;n -j QUEUE 20 | #+END_SRC 21 | 22 | 注意这里的port就是服务器监听的端口 23 | 24 | 3. 启动intercept 25 | #+BEGIN_SRC sh 26 | intercept 27 | #+END_SRC 28 | 29 | 注意:配置好iptbales之后不要去运行service iptables start,不然新加的配置又会被清空了,如果iptables没有启动,可以在加规则之前启动;如果1,2已经设置并起效的话,只要运行intercept就好了;测试完成之后要调用iptables -F 把过滤规则去掉。 30 | 31 | 然后启动TCP Client进行包的转发。 32 | #+BEGIN_SRC sh 33 | ./tcpcopy -x 线上服务器监听端口号-测试服务器ip地址:测试服务器监听端口 34 | #+END_SRC 35 | 36 | 另外可以加 -n 参数,进行多重复制,此参数的值就是代表复制过去的流量是在线的n 倍。 37 | 38 | #+BEGIN_SRC sh 39 | iptables -I OUTPUT -p tcp --sport 80 -j QUEUE 40 | tcpcopy -x 80-61.155.184.113:80 41 | #+END_SRC 42 | 43 | ** goreplay 44 | https://github.com/buger/goreplay 45 | -------------------------------------------------------------------------------- /content/software-engineering/trace/goole-dapper.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: google dapper介绍 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | #+STARTUP: overview 6 | #+OPTIONS: author:nil date:nil creator:nil timestamp:nil validate:nil num:nil 7 | -------------------------------------------------------------------------------- /content/software-engineering/trace/zipkin.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: zipkin 介绍 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | #+STARTUP: overview 6 | #+OPTIONS: author:nil date:nil creator:nil timestamp:nil validate:nil num:nil 7 | -------------------------------------------------------------------------------- /content/traval/出行准备.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 旅行准备 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 计划 7 | 8 | * 衣 9 | + 换洗衣服。 10 | + 吸盘,可以吸在空调下,下面挂衣服,还可以当衣帽钩。 11 | + 晾衣绳,除了晾衣服,还可以捆扎带。 12 | + 折叠衣架。 13 | + 雨衣。 14 | + 塑料袋。 15 | 16 | * 食 17 | + 药品:创可贴 18 | + 水杯 19 | + 洗漱用品。 20 | 21 | * 住 22 | 23 | * 行 24 | -------------------------------------------------------------------------------- /content/traval/大连.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 大连 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | #+STARTUP: overview 6 | #+OPTIONS: author:nil date:nil creator:nil timestamp:nil validate:nil num:nil 7 | 8 | * 景点 9 | ** 环城巴士 10 | 11 | ** 星海广场 12 | 13 | ** 金石滩 14 | 15 | ** 棒棰岛 16 | 17 | ** 旅顺 18 | 19 | * 美食 20 | 21 | ** 无限虾享 22 | -------------------------------------------------------------------------------- /content/ubuntu/fingerprint.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: 使用指纹解锁 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 安装 fingerprint-gui 7 | #+BEGIN_SRC 8 | sudo add-apt-repository ppa:fingerprint/fingerprint-gui 9 | sudo apt update 10 | sudo apt install fingerprint-gui policykit-1-fingerprint-gui libbsapi 11 | #+END_SRC 12 | 其中 libbsapi 是专为 UPEK 芯片安装的 13 | 14 | * 确定启用了指纹登录 15 | #+BEGIN_SRC 16 | sudo pam-auth-update 17 | #+END_SRC 18 | 19 | 20 | 确认第一项是 "Fingerprint authentication by FingerprintGUI”,并且是选中启用的,如果不是,使用下面命令: 21 | #+BEGIN_SRC 22 | sudo pam-auth-update –force 23 | #+END_SRC 24 | 25 | * 录入指纹 26 | 运行 fingerprint-gui 程序,录入指纹。有任何问题可以查看安装日志:/var/log/auth.log,以查找问题原因。 27 | 28 | * 使用体验 29 | thinkpad x230 指纹识别太慢了。 30 | -------------------------------------------------------------------------------- /content/ubuntu/software/asbru.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: Ásbrú Connection Manager 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | [[https://github.com/asbru-cm/asbru-cm][asbru-cm]] 是一个类似的 windows 上 xshell 的远程连接管理软件。 8 | 9 | * 安装 10 | 11 | ** Debian / Ubuntu 12 | #+BEGIN_SRC sh 13 | curl -s https://packagecloud.io/install/repositories/asbru-cm/asbru-cm/script.deb.sh | sudo bash 14 | sudo apt-get install asbru-cm 15 | #+END_SRC 16 | -------------------------------------------------------------------------------- /content/ubuntu/software/shutter.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8-*- 2 | #+TITLE: shutter 3 | #+AUTHOR: liushangliang 4 | #+EMAIL: phenix3443+github@gmail.com 5 | 6 | * 概述 7 | 8 | * 使用 9 | 10 | * 注意 11 | 12 | ** 编辑按钮灰色 13 | ubuntu 18.04 和 linux mint 19 可能会遇到编辑按钮变灰色,不能编辑图片的问题。 14 | 15 | 按序安装[[https://launchpad.net/ubuntu/%2Barchive/primary/%2Bfiles/libgoocanvas-common_1.0.0-1_all.deb][libgoocanvas-common]] ,[[https://launchpadlibrarian.net/226687722/libgoocanvas3_1.0.0-1_amd64.deb][libgoocanvas]], [[https://launchpadlibrarian.net/330848267/libgoo-canvas-perl_0.06-2ubuntu3_amd64.deb][libgoo-canvas-perl]] 以后重启 shutter。 16 | -------------------------------------------------------------------------------- /content/ubuntu/ubuntu-mount-ntfs-permission.org: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8; -*- 2 | #+title:ubuntu挂载 ntfs 系统 3 | #+author: 刘尚亮 4 | #+email: phenix3443+github@gmail.com 5 | 6 | 今天发现系统启动之后自动加载的 ntfs 系统中的可执行文件不能执行,ls 之后看奥所有文件的权限都是 400,owner 也都是 root,这说明系统在自动挂载文件系统的时候为上面的文件指定了默认的所有者和文件权限。经过 google 之后,总结要解决的问题实际上有两个: 7 | 8 | 1. ntfs 系统中现有文件、目录的默认属性。 9 | 2. 使用 chmod、chown 等命令更改文件的属性。 10 | 11 | 第一个问题需要在 [[https://help.ubuntu.com/community/Fstab][Fstab]] 中进行设置,第二个问题据说通过 [[https://wiki.archlinux.org/index.php/Ntfs#Linux_compatible_permissions][NTFS-3G]] 可以解决问题,但经过我实践,发现并没有效果,所以最后的结果只能在 fstab 中将 fmask 设置为 023 来达到想要的效果,但是每个文件都具有可执行权限,这样显然是不合适的,这个问题只能等到以后再解决了。 12 | --------------------------------------------------------------------------------