diff --git a/src/contexts/ctx/ctx_init.go b/src/contexts/ctx/ctx_init.go
index f4ac8bd1..59dd7521 100644
--- a/src/contexts/ctx/ctx_init.go
+++ b/src/contexts/ctx/ctx_init.go
@@ -647,7 +647,11 @@ var Index = &Context{Name: "ctx", Help: "模块中心", Server: &CTX{},
} else {
m.Add("append", "ctx", "")
}
- m.Add("append", "msg", msg.target.message.code)
+ if msg.target.message != nil {
+ m.Add("append", "msg", msg.target.message.code)
+ } else {
+ m.Add("append", "msg", "")
+ }
m.Add("append", "status", msg.Cap("status"))
m.Add("append", "stream", msg.Cap("stream"))
m.Add("append", "helps", msg.target.Help)
diff --git a/src/contexts/ctx/ctx_type.go b/src/contexts/ctx/ctx_type.go
index 41c231dd..4334671b 100644
--- a/src/contexts/ctx/ctx_type.go
+++ b/src/contexts/ctx/ctx_type.go
@@ -2,6 +2,7 @@ package ctx
import (
"fmt"
+ "log"
"math/rand"
"regexp"
"runtime"
@@ -60,11 +61,18 @@ type Context struct {
Server
}
-func (c *Context) Register(s *Context, x Server) {
+func (c *Context) Register(s *Context, x Server, args ...interface{}) {
if c.contexts == nil {
c.contexts = make(map[string]*Context)
}
- if x, ok := c.contexts[s.Name]; ok {
+ force := false
+ if len(args) > 0 {
+ switch arg := args[0].(type) {
+ case bool:
+ force = arg
+ }
+ }
+ if x, ok := c.contexts[s.Name]; ok && !force {
panic(errors.New(c.Name + "上下文中已存在模块:" + x.Name))
}
@@ -267,6 +275,24 @@ func (c *Context) BackTrace(m *Message, hand func(m *Message) (stop bool)) *Cont
return target
}
+func (c *Context) Plugin(args []string) string {
+ m := &Message{code: 0, time: time.Now(), source: c, target: c, Meta: map[string][]string{}}
+ if len(args) == 0 {
+ m.Echo("%s: %s\n", c.Name, c.Help)
+ for k, v := range c.Commands {
+ m.Echo("%s: %s %v\n", k, v.Name, v.Help)
+ }
+ } else if cs, ok := c.Commands[args[0]]; ok {
+ h := cs.Hand
+ if e := h(m, c, args[0], args[1:]...); e != nil {
+ m.Echo("error: ").Echo("%v\n", e)
+ }
+ } else {
+ m.Echo("error: ").Echo("not found: %v\n", args[0])
+ }
+ return strings.Join(m.Meta["result"], "")
+}
+
type DEBUG interface {
Wait(*Message, ...interface{}) interface{}
Goon(interface{}, ...interface{})
@@ -1178,6 +1204,8 @@ func (m *Message) Log(action string, str string, arg ...interface{}) *Message {
}
return m
}
+ } else {
+ log.Printf(str, arg...)
}
if action == "error" {
diff --git a/src/examples/code/code.go b/src/examples/code/code.go
index aae02db1..c3b02eb5 100644
--- a/src/examples/code/code.go
+++ b/src/examples/code/code.go
@@ -7,6 +7,7 @@ import (
"net/http"
"os"
"path"
+ "plugin"
"strconv"
"strings"
"time"
@@ -187,6 +188,17 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心",
}, Help: "组件列表"},
"componet_group": &ctx.Config{Name: "component_group", Value: "index", Help: "默认组件"},
+ "make": &ctx.Config{Name: "make", Value: map[string]interface{}{
+ "go": map[string]interface{}{
+ "build": []interface{}{"go", "build"},
+ "plugin": []interface{}{"go", "build", "-buildmode=plugin"},
+ "load": []interface{}{"load"},
+ },
+ "so": map[string]interface{}{
+ "load": []interface{}{"load"},
+ },
+ }, Help: "免密登录"},
+
"flash": &ctx.Config{Name: "flash", Value: map[string]interface{}{
"data": []interface{}{},
"view": map[string]interface{}{"default": []interface{}{"index", "time", "text", "code", "output"}},
@@ -281,6 +293,43 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心",
"counter_service": &ctx.Config{Name: "counter_service", Value: "http://localhost:9094/code/counter", Help: "counter"},
},
Commands: map[string]*ctx.Command{
+ "make": &ctx.Command{Name: "make [action] file [args...]", Help: "更新代码", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
+ target, action, suffix := path.Join(m.Conf("runtime", "boot.ctx_home"), "src/examples/app/bench.go"), "build", "go"
+ if len(arg) == 0 {
+ arg = append(arg, target)
+ }
+
+ if cs := strings.Split(arg[0], "."); len(cs) > 1 {
+ suffix = cs[len(cs)-1]
+ } else if cs := strings.Split(arg[1], "."); len(cs) > 1 {
+ action, suffix, arg = arg[0], cs[len(cs)-1], arg[1:]
+ }
+
+ target = m.Cmdx("nfs.path", arg[0])
+ if target == "" {
+ target = m.Cmdx("nfs.path", path.Join("src/plugin/", arg[0]))
+ }
+
+ cook := m.Confv("make", []string{suffix, action})
+ switch kit.Chains(cook, "0") {
+ case "load":
+ if suffix == "go" {
+ so := strings.Replace(target, ".go", ".so", -1)
+ m.Cmd("cli.system", m.Confv("make", "go.plugin"), "-o", so, target)
+ arg[0] = so
+ }
+
+ if p, e := plugin.Open(arg[0]); m.Assert(e) {
+ s, e := p.Lookup("Index")
+ m.Assert(e)
+ w := *(s.(**ctx.Context))
+ c.Register(w, nil, true)
+ }
+ default:
+ m.Cmdy("cli.system", cook, arg)
+ }
+ return
+ }},
"flash": &ctx.Command{Name: "flash", Help: "闪存", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
total := len(m.Confv("flash", "data").([]interface{}))
// 查看列表
diff --git a/src/plugin/sort.go b/src/plugin/sort.go
new file mode 100644
index 00000000..3bbeb8e9
--- /dev/null
+++ b/src/plugin/sort.go
@@ -0,0 +1,158 @@
+package main
+
+import (
+ "contexts/ctx"
+ "fmt"
+ "math"
+ "math/rand"
+ "os"
+ "toolkit"
+)
+
+func Merge(left []int, right []int) []int {
+ result := make([]int, 0, len(left)+len(right))
+ for len(left) > 0 || len(right) > 0 {
+ if len(right) == 0 || (len(left) > 0 && (left[0] < right[0])) {
+ result, left = append(result, left[0]), left[1:]
+ } else {
+ result, right = append(result, right[0]), right[1:]
+ }
+ }
+ return result
+}
+func MergeSort(m *ctx.Message, level int, data []int) []int {
+ if len(data) < 2 {
+ m.Add("append", kit.Format(level), fmt.Sprintf("[][]"))
+ return data
+ }
+ middle := len(data) / 2
+ m.Add("append", kit.Format(level), fmt.Sprintf("%v%v", data[:middle], data[middle:]))
+ return Merge(MergeSort(m, level+1, data[:middle]), MergeSort(m, level+1, data[middle:]))
+}
+func QuickSort(m *ctx.Message, level int, data []int, left int, right int) {
+ if left >= right {
+ return
+ }
+
+ p, l, r := left, left+1, right
+ for l < r {
+ for ; p < r && data[p] < data[r]; r-- {
+ }
+ if p < r {
+ data[p], data[r] = data[r], data[p]
+ p = r
+ }
+ for ; l < p && data[l] < data[p]; l++ {
+ }
+ if l < p {
+ data[l], data[p] = data[p], data[l]
+ p = l
+ }
+ }
+
+ m.Add("append", kit.Format(level), fmt.Sprintf("%v%v", data[left:p+1], data[p+1:right+1]))
+ QuickSort(m, level+1, data, left, p)
+ QuickSort(m, level+1, data, p+1, right)
+}
+
+var Index = &ctx.Context{Name: "sort", Help: "sort code",
+ Configs: map[string]*ctx.Config{
+ "data": &ctx.Config{Name: "data", Value: map[string]interface{}{
+ "seed": []int{47, 59, 81, 40, 56, 0, 94, 11, 18, 25},
+ }},
+ },
+ Commands: map[string]*ctx.Command{
+ "data": &ctx.Command{Name: "data", Help: "data", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
+ data := []int{}
+ for i := 0; i < kit.Int(kit.Select("10", arg, 0)); i++ {
+ data = append(data, rand.Intn(kit.Int(kit.Select("100", arg, 1))))
+ }
+ m.Confv("data", "seed", data)
+ m.Echo("data: %v", data)
+ return
+ }},
+ "select": &ctx.Command{Name: "select", Help: "select", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
+ data := append([]int{}, m.Confv("data", "seed").([]int)...)
+
+ m.Echo("data: %v\n", data)
+ for i := 0; i < len(data)-1; i++ {
+ for j := i + 1; j < len(data); j++ {
+ if data[j] < data[i] {
+ data[i], data[j] = data[j], data[i]
+ }
+ }
+ m.Echo("data: %d %v %v\n", i, data[:i+1], data[i+1:])
+ }
+ m.Echo("data: %v\n", data)
+ return
+ }},
+ "insert": &ctx.Command{Name: "insert", Help: "insert", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
+ data := append([]int{}, m.Confv("data", "seed").([]int)...)
+
+ m.Echo("data: %v\n", data)
+ for i, j := 1, 0; i < len(data); i++ {
+ tmp := data[i]
+ for j = i - 1; j >= 0; j-- {
+ if data[j] < tmp {
+ break
+ }
+ data[j+1] = data[j]
+ }
+ data[j+1] = tmp
+ m.Echo("data: %d %v %v\n", i, data[:i+1], data[i+1:])
+ }
+ m.Echo("data: %v\n", data)
+ return
+ }},
+ "bubble": &ctx.Command{Name: "bubble", Help: "bubble", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
+ data := append([]int{}, m.Confv("data", "seed").([]int)...)
+ m.Echo("data: %v\n", data)
+ for i := 1; i < len(data); i++ {
+ finish := true
+ for j := 0; j < len(data)-i; j++ {
+ if data[j] > data[j+1] {
+ finish, data[j], data[j+1] = false, data[j+1], data[j]
+ }
+ }
+ if finish {
+ break
+ }
+ m.Echo("data: %d %v %v\n", i, data[:len(data)-i], data[len(data)-i:])
+ }
+ m.Echo("data: %v\n", data)
+ return
+ }},
+ "quick": &ctx.Command{Name: "quick", Help: "quick", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
+ data := append([]int{}, m.Confv("data", "seed").([]int)...)
+ m.Echo("data: %v\n", data)
+ QuickSort(m, 0, data, 0, len(data)-1)
+ for i := 0; i < len(data); i++ {
+ meta, ok := m.Meta[kit.Format(i)]
+ if !ok {
+ break
+ }
+ m.Echo("data: %v %v\n", i, meta)
+ }
+ m.Echo("data: %v\n", data)
+ return
+ }},
+ "merge": &ctx.Command{Name: "merge", Help: "merge", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
+ data := append([]int{}, m.Confv("data", "seed").([]int)...)
+ m.Echo("data: %v\n", data)
+ data = MergeSort(m, 0, data)
+ for i := 0; int(math.Exp2(float64(i))) < len(data); i++ {
+ meta, ok := m.Meta[kit.Format(i)]
+ if !ok {
+ break
+ }
+ m.Echo("data: %v %v\n", i, meta)
+ }
+ m.Echo("data: %v\n", data)
+ return
+ }},
+ },
+}
+
+func main() {
+ fmt.Print(Index.Plugin(os.Args[1:]))
+}
diff --git a/usr/wiki/自然/编程/后端技术栈/golang.md b/usr/wiki/自然/编程/后端技术栈/golang.md
new file mode 100644
index 00000000..206434ee
--- /dev/null
+++ b/usr/wiki/自然/编程/后端技术栈/golang.md
@@ -0,0 +1,6 @@
+## golang
+
+- 官网:
+- 文档:
+- 源码:
+- 开源:
diff --git a/usr/wiki/自然/编程/后端技术栈/linux.md b/usr/wiki/自然/编程/后端技术栈/linux.md
index e69de29b..5c71ed4b 100644
--- a/usr/wiki/自然/编程/后端技术栈/linux.md
+++ b/usr/wiki/自然/编程/后端技术栈/linux.md
@@ -0,0 +1,289 @@
+## linux
+
+- 官网:
+- 文档:
+- 源码:
+- 开源:
+
+- 代理:
+
+## 内核源码
+
+lib
+arch
+init
+kernel
+include
+drivers
+ipc
+net
+mm
+fs
+
+firmware
+security
+crypto
+sound
+block
+virt
+
+tools
+scripts
+samples
+Makefile
+Kconfig
+Kbuild
+usr
+
+README
+COPYING
+CREDITS
+Documentation
+MAINTAINERS
+REPORTING-BUGS
+
+## 系统启动
+```
+startup_32() // linux-2.6.12/arch/i386/kernel/head.S:57
+start_kernel() // linux-2.6.12/init/main.c:424
+ sched_init()
+ trap_init() // arch/i386/kernel/traps.c
+ init_IRQ()
+ init_timers()
+ softirq_init()
+ time_init() // arch/i386/kernel/time.c
+ time_init_hook()
+ setup_irq(0, timer_interrupt)
+```
+
+## 进程调度
+```
+schedule()
+```
+
+## 系统中断
+```
+interrupt() // arch/i386/kernel/entry.S:397
+do_IRQ() // arch/i386/kernel/irq.c:51
+ __do_IRQ() // kernel/irq/handle.c:107
+ handle_IRQ_event()
+
+do_softirq() // arch/i386/kernel/softirq.c:158
+ __do_softirq() // kernel/softirq.c:74
+
+tasklet_schedule() // include/linux/interrupt.h
+ __tasklet_schedule() // kernel/softirq.c:223
+
+run_workqueue() // kernel/workqueue.c:145
+```
+
+## 并发同步
+```
+atomic_add() // include/asm-i386/atomic.h
+spin_lock_irq() // include/linux/spinlock.h
+down_interruptible() // include/asm-i386/semaphore.h
+wait_for_completion() // kernel/sched.c
+```
+
+## 时间管理
+```
+timer_interrupt() // arch/i386/kernel/time.c:292
+do_timer_interrupt() // arch/i386/kernel/time.c:250
+ do_timer_interrupt_hook()
+ do_timer() // kernel/timer.c:925
+```
+
+## 系统调用
+```
+system_call() // arch/i386/kernel/entry.S:225
+sys_call_table[] // arch/i386/kernel/syscall_table.S
+ .long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */
+ .long sys_exit() // kernel/exit.c:859
+ do_exit()
+ exit_mm()
+ exit_sem()
+ __exit_files()
+ __exit_fs()
+ exit_namespace()
+ exit_thread()
+ cpuset_exit()
+ exit_keys()
+ exit_notify()
+ schedule()
+ .long sys_fork // arch/i386/kernel/process.c:645
+ do_fork() // kernel/fork.c:1192
+ copy_process()
+ dup_task_struct()
+ copy_files()
+ copy_fs()
+ copy_sighand()
+ copy_signal()
+ copy_mm()
+ sched_fork()
+ wake_up_new_task()
+ .long sys_read
+ .long sys_write
+ .long sys_open /* 5 */
+ get_unused_fd()
+ filp_open()
+ open_namei()
+ path_lookup()
+ dentry_open()
+ fd_install()
+
+ .long sys_close
+ .long sys_waitpid
+ .long sys_creat
+ .long sys_link
+ .long sys_unlink /* 10 */
+ .long sys_execve
+ .long sys_chdir
+ .long sys_time
+...
+```
+
+## 进程管理
+```
+struct task_struct {
+ // 进程状态
+ state long / TASK_RUNNING // include/linux/sched.h:108
+
+ // 线程信息
+ thread_info *struct thread_info
+ task *struct task_struct
+ status
+
+ // 进程树
+ parent *struct task_struct
+ children struct list_head
+ sibling struct list_head
+
+ mm *struct mm_struct
+ binfmt *struct linux_binfmt
+ thread struct thread_struct
+ esp0
+ eip
+ esp
+ fs
+ gs
+
+ fs *struct fs_struct
+ files *struct files_struct
+ signal *struct signal_struct
+
+ pid pid_t
+ tgit pid_t
+}
+```
+
+## Compile
+```
+linux-3.7.4/Makefile
+include $(srctree)/arch/$(SRCARCH)/Makefile # linux-3.7.4/Makefile:495
+```
+sudo apt-get install libncurses5-dev
+make defconfig
+make menuconfig
+make
+make tags
+
+## GCC
+gcc -E hi.c -o hi.i
+gcc -S hi.c
+gcc -c hi.c
+
+ar -r hi.a hi.o he.o
+gcc -shared -fPIC -o hi.so hi.c he.c
+gcc -L./ -lhi main.c
+
+nm
+readelf -S hi.o
+objdump -d hi.o
+hexdump -C hi.o
+
+## GRUB
+- 下载:
+BIOS MBR GRUB
+
+## 内核启动
+```
+startup_32() // arch/x86/kernel/head_32.S:88
+i386_start_kernel() // arch/x86/kernel/head32.c:31
+start_kernel() // init/main.c:468
+ mm_init()
+ sched_init()
+ console_init()
+ signals_init()
+ rest_init()
+ kernel_thread(kernel_init)
+ do_fork() // kernel/fork.c:1548
+ copy_process()
+ wake_up_new_task() // kernel/sched/core.c:1622
+ activate_task()
+ enqueue_task(rq, p)
+
+kernel_init() // init/main.c:805
+ run_init_process()
+ kernel_execve() // fs/exec.c:1710
+ do_execve()
+ do_execve_common()
+ open_exec()
+ sched_exec() // kernel/sched/core.c:2538
+ select_task_rq()
+ bprm_mm_init()
+ prepare_binprm()
+ search_binary_handler()
+ formats[i]->load_binary()
+
+fair_sched_class() // kernel/sched/fair.c:5308
+ select_task_rq_fair()
+ pick_next_task_fair()
+ pick_next_entity()
+ __pick_first_entity()
+ rb_entry()
+
+formats[i]->load_binary()
+ load_elf_binary() // fs/binfmt_elf.c:561
+ current->mm->start_stack
+ set_brk(elf_bss, elf_brk)
+
+ start_thread() // arch/x86/kernel/process_32.c:200
+formats[i]->load_binary()
+ load_script()
+ bprm_change_interp()
+ open_exec()
+ prepare_binprm()
+ search_binary_handler()
+
+struct task_struct { // linux-3.7.4/include/linux/sched.h:1190
+ mm *struct mm_struct
+ start_code
+ end_code
+ start_data
+ end_data
+ start_brk
+ brk
+ mmap_base
+ start_stack
+ arg_start
+ arg_end
+ env_start
+ env_end
+
+ thread struct thread_struct
+ sp0
+ sp
+ es
+ ds
+ fsindex
+ gsindex
+ ip
+ fs
+ gs
+
+ fs *struct fs_struct
+ files *struct files_struct
+ pid pid_t
+ tgid pit_t
+}
+```
diff --git a/usr/wiki/自然/编程/后端技术栈/mongodb.md b/usr/wiki/自然/编程/后端技术栈/mongodb.md
new file mode 100644
index 00000000..d2a2b00c
--- /dev/null
+++ b/usr/wiki/自然/编程/后端技术栈/mongodb.md
@@ -0,0 +1,6 @@
+## mongodb
+
+- 官网:
+- 文档:
+- 源码:
+- 开源:
diff --git a/usr/wiki/自然/编程/后端技术栈/mysql.md b/usr/wiki/自然/编程/后端技术栈/mysql.md
index 301c3b05..45d88d48 100644
--- a/usr/wiki/自然/编程/后端技术栈/mysql.md
+++ b/usr/wiki/自然/编程/后端技术栈/mysql.md
@@ -1,4 +1,4 @@
-## 简介
+## mysql
MySQL 是一个开源的关系型数据库管理系统。
diff --git a/usr/wiki/自然/编程/后端技术栈/nginx.md b/usr/wiki/自然/编程/后端技术栈/nginx.md
index 4dc7fd8e..5ea17631 100644
--- a/usr/wiki/自然/编程/后端技术栈/nginx.md
+++ b/usr/wiki/自然/编程/后端技术栈/nginx.md
@@ -1,4 +1,4 @@
-## 简介
+## nginx
Nginx 是一个异步框架的Web服务器,也可以用作反向代理,负载均衡和HTTP缓存。
- 官网:
diff --git a/usr/wiki/自然/编程/后端技术栈/nodejs.md b/usr/wiki/自然/编程/后端技术栈/nodejs.md
new file mode 100644
index 00000000..32b82502
--- /dev/null
+++ b/usr/wiki/自然/编程/后端技术栈/nodejs.md
@@ -0,0 +1,6 @@
+## nodejs
+
+- 官网:
+- 文档:
+- 源码:
+- 开源:
diff --git a/usr/wiki/自然/编程/后端技术栈/python.md b/usr/wiki/自然/编程/后端技术栈/python.md
index e69de29b..33371034 100644
--- a/usr/wiki/自然/编程/后端技术栈/python.md
+++ b/usr/wiki/自然/编程/后端技术栈/python.md
@@ -0,0 +1,6 @@
+## python
+
+- 官网:
+- 文档:
+- 源码:
+- 开源:
diff --git a/usr/wiki/自然/编程/后端技术栈/redis.md b/usr/wiki/自然/编程/后端技术栈/redis.md
index a5fe904e..5b7b7d07 100644
--- a/usr/wiki/自然/编程/后端技术栈/redis.md
+++ b/usr/wiki/自然/编程/后端技术栈/redis.md
@@ -1,4 +1,4 @@
-## 简介
+## redis
Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可持久性的键值对存储数据库。
Redis是最流行的键值对存储数据库。
diff --git a/usr/wiki/自然/编程/终端工具链/golang.md b/usr/wiki/自然/编程/终端工具链/golang.md
index bd487b6b..b0972d36 100644
--- a/usr/wiki/自然/编程/终端工具链/golang.md
+++ b/usr/wiki/自然/编程/终端工具链/golang.md
@@ -1,11 +1,84 @@
-## 简介
-golang 是 google 开发的一种静态的强类型、编译型、并发型、并具有垃圾回收功能的编程语言。
+## golang
-- 既有编译语言的严谨与高效,又具有脚本语言的动态与灵活。
-
-### 相关链接
- 官网:
-- 源码:
+- 文档:
+- 源码:
+- 开源:
+
+## 基本命令
+```
+run clean build install
+fmt fix vet bug
+mod get doc list
+env help version
+test tool generate
+```
+## 编译过程
+```
+main() // cmd/compile/main.go:40
+ gc.Main() // cmd/compile/internal/gc/main.go:130
+ parseFiles() // cmd/compile/internal/gc/noder.go:26
+ syntax.Parse() // cmd/compile/internal/syntax/syntax.go:58
+ p.fileOrNil() // cmd/compile/internal/syntax/parser.go:58
+ p.funcDeclOrNil()
+ p.funcBody()
+ p.blockStmt()
+ p.stmtList()
+ p.stmtOrNil()
+ p.simpleStmt()
+ p.exprList()
+ p.expr()
+ p.binaryExpr()
+ p.unaryExpr()
+
+```
+
+fmt
+mime
+text
+html
+image
+unicode
+strings
+strconv
+encoding
+
+hash
+math
+sort
+index
+container
+compress
+archive
+crypto
+regexp
+
+os
+flag
+path
+time
+errors
+syscall
+
+io
+log
+net
+bytes
+bufio
+database
+
+go
+cmd
+sync
+debug
+plugin
+vendor
+unsafe
+expvar
+runtime
+context
+testing
+reflect
+builtin
+internal
-### 源码安装
-可以去官网下载各种安装包(),直接进行安装。
diff --git a/usr/wiki/自然/编程/终端工具链/shell.md b/usr/wiki/自然/编程/终端工具链/shell.md
new file mode 100644
index 00000000..7f7a8a43
--- /dev/null
+++ b/usr/wiki/自然/编程/终端工具链/shell.md
@@ -0,0 +1,665 @@
+## shell
+
+- 官网:
+- 文档:
+- 源码:
+
+
+
+## 文件管理
+```
+etc lib dev usr
+boot proc
+root home
+sbin bin
+var tmp run sys
+opt srv mnt media
+```
+
+ls
+cp
+ln
+mv
+rm
+cd
+pwd
+mkdir
+rmdir
+
+cat
+more
+less
+head
+tail
+stat
+file
+hexdump
+objdump
+touch
+
+## 进程管理
+ps
+top
+kill
+killall
+nice
+renice
+
+## 磁盘管理
+df
+du
+mount
+umount
+
+find
+grep
+sort
+tar
+
+## 网络管理
+
+## 权限管理
+/etc/passwd
+/etc/shadow
+/etc/skel
+useradd
+userdel
+usermod
+passwd
+chpasswd
+chsh
+chfn
+chage
+groupadd
+groupmod
+groupdel
+
+umask
+chmod
+chown
+chgrp
+
+## 环境变量
+env
+set
+unset
+export
+alias
+PATH
+PS1
+
+## 使用命令
+```
+$=
+<< < | > >>
+
+nohup & C-C C-Z fg bg trap sleep jobs
+crontab inittab rc.local
+```
+
+## 脚本编程
+```
+#! /bin/bash
+echo "hello world"
+```
+source
+return
+bash
+exit
+
+```
+[ -eq -gt -lt -ne -ge -le ]
+[ < <= = >= > != -z -n ]
+[ -d -f -e -r -w -x -nt -ot ]
+
+if cmd; then cmd; elif cmd; then cmd; else cmd; fi
+case var in cond) cmd;; esac
+
+IFS= for var in list; do cmd; done
+while true; do cmd; done
+until false; do cmd; done
+break continue
+
+$0 $1 $# $* $@ shift
+OPTARG= OPTINDEX= getopts fmt var
+select var in list; do cmd; done
+REPLY read
+
+function local return
+```
+
+
+
+uname
+umount
+touch
+tar
+su
+sleep
+sed
+rm
+ps
+ping
+netstat
+mv
+nano
+more
+lsmod
+ls
+ln
+less
+kill
+gzip
+grep
+false
+echo
+dd
+dmesg
+date
+cp
+chgrp
+cat
+bash
+sh
+chmod
+chown
+cpio
+df
+dir
+gunzip
+hostname
+lsblk
+mkdir
+mknod
+mount
+pwd
+rmdir
+true
+which
+
+
+default
+alternatives
+adduser.conf
+
+bash.bashrc
+
+dhcp
+timezone
+
+init
+init.d
+systemd
+rc.local
+rc0.d
+rc1.d
+rc2.d
+rc3.d
+rc4.d
+rc5.d
+rc6.d
+rcS.d
+
+fstab
+fstab.aliyun_backup
+fstab.aliyun_backup.xen
+fstab.d
+
+ld.so.cache
+ld.so.conf
+ld.so.conf.d
+
+passwd
+
+inputrc
+ssh
+ssl
+shells
+skel
+zsh
+
+vim
+pki
+terminfo
+zsh_command_not_found
+
+network
+networks
+host.conf
+hostname
+hosts
+hosts.allow
+hosts.deny
+qemu
+qemu-ifdown
+qemu-ifup
+
+cron.d
+cron.daily
+cron.hourly
+cron.monthly
+cron.weekly
+crontab
+
+apt
+perl
+python
+python2.7
+python3
+python3.4
+rsyslog.conf
+rsyslog.d
+php5
+X11
+apache2
+mysql
+
+apm
+apparmor
+apparmor.d
+backup
+bash_completion
+bash_completion.d
+bindresvport.blacklist
+blkid.conf
+blkid.tab
+ca-certificates
+ca-certificates.conf
+ca-certificates.conf.dpkg-old
+calendar
+chatscripts
+cloud
+console-setup
+dbus-1
+debconf.conf
+debian_version
+deluser.conf
+depmod.d
+dictionaries-common
+discover-modprobe.conf
+discover.conf.d
+dpkg
+drirc
+emacs
+environment
+fonts
+fuse.conf
+gai.conf
+gdb
+groff
+group
+group-
+grub.d
+gshadow
+gshadow-
+hdparm.conf
+initramfs-tools
+insserv
+insserv.conf
+insserv.conf.d
+iproute2
+iscsi
+issue
+issue.net
+kbd
+kernel
+kernel-img.conf
+ldap
+legal
+libaudit.conf
+libnl-3
+locale.alias
+localtime
+logcheck
+login.defs
+logrotate.conf
+logrotate.d
+lsb-release
+ltrace.conf
+lynx-cur
+magic
+magic.mime
+mailcap
+mailcap.order
+manpath.config
+mime.types
+mke2fs.conf
+modprobe.d
+modules
+motd
+mtab
+nanorc
+newt
+nscd.conf
+nsswitch.conf
+ntp.conf
+ntp.conf.backup
+opt
+os-release
+pam.conf
+pam.d
+passwd-
+pm
+popularity-contest.conf
+ppp
+profile
+profile.d
+protocols
+pulse
+resolv.conf
+resolvconf
+rmt
+rpc
+securetty
+security
+selinux
+sensors.d
+sensors3.conf
+services
+sgml
+shadow
+shadow-
+subgid
+subgid-
+subuid
+subuid-
+sudoers
+sudoers.d
+sysctl.conf
+sysctl.d
+sysstat
+ucf.conf
+udev
+ufw
+update-manager
+update-motd.d
+updatedb.conf
+upstart-xsessions
+vtrgb
+wgetrc
+xml
+
+bunzip2
+busybox
+bzcat
+bzcmp
+bzdiff
+bzegrep
+bzexe
+bzfgrep
+bzgrep
+bzip2
+bzip2recover
+bzless
+bzmore
+chacl
+chvt
+dash
+dbus-cleanup-sockets
+dbus-daemon
+dbus-uuidgen
+dnsdomainname
+domainname
+dumpkeys
+ed
+egrep
+fgconsole
+fgrep
+findmnt
+fuser
+fusermount
+getfacl
+gzexe
+ip
+kbd_mode
+kmod
+lessecho
+lessfile
+lesskey
+lesspipe
+loadkeys
+login
+loginctl
+lowntfs-3g
+mktemp
+mountpoint
+mt
+mt-gnu
+nc
+nc.openbsd
+nc.traditional
+netcat
+nisdomainname
+ntfs-3g
+ntfs-3g.probe
+ntfs-3g.secaudit
+ntfs-3g.usermap
+ntfscat
+ntfsck
+ntfscluster
+ntfscmp
+ntfsdump_logfile
+ntfsfix
+ntfsinfo
+ntfsls
+ntfsmftalloc
+ntfsmove
+ntfstruncate
+ntfswipe
+open
+openvt
+pidof
+ping6
+plymouth
+plymouth-upstart-bridge
+rbash
+readlink
+red
+rnano
+run-parts
+running-in-container
+rzsh
+setfacl
+setfont
+setupcon
+sh.distrib
+ss
+static-sh
+stty
+sync
+tailf
+tempfile
+udevadm
+ulockmgr_server
+uncompress
+unicode_start
+vdir
+whiptail
+ypdomainname
+zcat
+zcmp
+zdiff
+zegrep
+zfgrep
+zforce
+zgrep
+zless
+zmore
+znew
+zsh
+zsh5
+
+
+
+fdisk
+fsck
+halt
+ifconfig
+ldconfig
+lsmod
+mkfs
+modinfo
+reboot
+rmmod
+route
+shutdown
+modprobe
+ifdown
+ifquery
+ifup
+
+
+
+
+MAKEDEV
+acpi_available
+agetty
+apm_available
+apparmor_parser
+badblocks
+biosdevname
+blkid
+blockdev
+bridge
+capsh
+cfdisk
+crda
+ctrlaltdel
+debugfs
+depmod
+dhclient
+dhclient-script
+discover
+discover-modprobe
+discover-pkginstall
+dmsetup
+dosfsck
+dosfslabel
+dumpe2fs
+e2fsck
+e2image
+e2label
+e2undo
+fatlabel
+findfs
+fsck.cramfs
+fsck.ext2
+fsck.ext3
+fsck.ext4
+fsck.ext4dev
+fsck.fat
+fsck.minix
+fsck.msdos
+fsck.nfs
+fsck.vfat
+fsfreeze
+fstab-decode
+fstrim
+fstrim-all
+getcap
+getpcaps
+getty
+hdparm
+hwclock
+init
+initctl
+insmod
+installkernel
+ip
+ip6tables
+ip6tables-apply
+ip6tables-restore
+ip6tables-save
+ipmaddr
+iptables
+iptables-apply
+iptables-restore
+iptables-save
+iptunnel
+isosize
+kbdrate
+killall5
+ldconfig.real
+logsave
+losetup
+mii-tool
+mkdosfs
+mke2fs
+mkfs.bfs
+mkfs.cramfs
+mkfs.ext2
+mkfs.ext3
+mkfs.ext4
+mkfs.ext4dev
+mkfs.fat
+mkfs.minix
+mkfs.msdos
+mkfs.ntfs
+mkfs.vfat
+mkhomedir_helper
+mkntfs
+mkswap
+mntctl
+mount.fuse
+mount.lowntfs-3g
+mount.ntfs
+mount.ntfs-3g
+mountall
+nameif
+ntfsclone
+ntfscp
+ntfslabel
+ntfsresize
+ntfsundelete
+on_ac_power
+pam_tally
+pam_tally2
+parted
+partprobe
+pivot_root
+plipconfig
+plymouthd
+poweroff
+rarp
+raw
+regdbdump
+reload
+resize2fs
+resolvconf
+restart
+rtacct
+rtmon
+runlevel
+setcap
+setvtrgb
+sfdisk
+shadowconfig
+slattach
+start
+start-stop-daemon
+startpar
+startpar-upstart-inject
+status
+stop
+sulogin
+swaplabel
+swapoff
+swapon
+switch_root
+sysctl
+tc
+telinit
+tune2fs
+udevadm
+udevd
+unix_chkpwd
+unix_update
+upstart-dbus-bridge
+upstart-event-bridge
+upstart-file-bridge
+upstart-local-bridge
+upstart-socket-bridge
+upstart-udev-bridge
+ureadahead
+wipefs
+xtables-multi
diff --git a/usr/wiki/自然/计算机/数据结构/index.md b/usr/wiki/自然/计算机/数据结构/index.md
new file mode 100644
index 00000000..1a2158f7
--- /dev/null
+++ b/usr/wiki/自然/计算机/数据结构/index.md
@@ -0,0 +1,55 @@
+## 数据结构
+逻辑结构:集合结构、线性结构、树状结构、图形结构
+
+存储结构:散列、数组、链表、索引
+
+数据操作:查找、排序
+
+算法复杂度:
+
+- 常数阶O(1)
+- 线性阶O(n)
+- 平方阶O(n2)
+- 对数阶O(log n)
+
+## 线性结构
+### 线性表
+#### 顺序表
+#### 单链表
+#### 双链表
+#### 双向链表
+### 栈
+#### 顺序栈
+#### 链接栈
+### 队列
+#### 循环队列
+#### 链式队列
+### 串
+
+## 树状结构
+### 二叉树
+#### 二叉树性质
+#### 二叉树存储
+#### 二叉树遍历
+
+## 图形结构
+### 图的性质
+### 图的存储
+### 图的遍历
+
+## 算法分析
+### 查找算法
+#### 二分查找
+#### 查找二叉树
+#### 平衡二叉树
+#### 红黑二叉树
+#### B树
+#### B+树
+### 排序算法
+#### 冒泡排序
+#### 选择排序
+#### 插入排序
+#### 归并排序
+#### 希尔排序
+#### 桶排序
+#### 快速排序