diff --git a/go.mod b/go.mod index 6196fb79..d2242b7e 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module contexts +module github.com/shylinux/contexts go 1.13 diff --git a/src/README.md b/src/README.md deleted file mode 120000 index 23909298..00000000 --- a/src/README.md +++ /dev/null @@ -1 +0,0 @@ -../usr/local/wiki/自然/编程/index.md \ No newline at end of file diff --git a/src/examples/trash/team.go b/src/examples/trash/team.go deleted file mode 100644 index ed1eb2a4..00000000 --- a/src/examples/trash/team.go +++ /dev/null @@ -1,485 +0,0 @@ -package team - -import ( - "contexts/ctx" - "contexts/web" - "fmt" - "path" - "plugin" - "runtime" - "strconv" - "strings" - "time" - "toolkit" -) - -var Index = &ctx.Context{Name: "team", Help: "团队中心", - Caches: map[string]*ctx.Cache{}, - Configs: map[string]*ctx.Config{ - "skip_login": &ctx.Config{Name: "skip_login", Value: map[string]interface{}{"/consul": "true"}, Help: "免密登录"}, - "componet": &ctx.Config{Name: "componet", Value: map[string]interface{}{ - "login": []interface{}{ - map[string]interface{}{"componet_name": "code", "componet_tmpl": "head", "metas": []interface{}{ - map[string]interface{}{"name": "viewport", "content": "width=device-width, initial-scale=0.7, user-scalable=no"}, - }, "favicon": "favicon.ico", "styles": []interface{}{"example.css", "code.css"}}, - - map[string]interface{}{"componet_name": "login", "componet_help": "login", - "componet_tmpl": "componet", "componet_init": "initLogin", - "componet_ctx": "aaa", "componet_cmd": "auth", "componet_args": []interface{}{"@sessid", "ship", "username", "@username", "password", "@password"}, "inputs": []interface{}{ - map[string]interface{}{"type": "text", "name": "username", "value": "", "label": "username"}, - map[string]interface{}{"type": "password", "name": "password", "value": "", "label": "password"}, - map[string]interface{}{"type": "button", "value": "login"}, - }, - "display_append": "", "display_result": "", - }, - - map[string]interface{}{"componet_name": "tail", "componet_tmpl": "tail", - "scripts": []interface{}{"toolkit.js", "context.js", "example.js", "code.js"}, - }, - }, - "flash": []interface{}{ - map[string]interface{}{"componet_name": "flash", "componet_tmpl": "head", "metas": []interface{}{ - map[string]interface{}{"name": "viewport", "content": "width=device-width, initial-scale=0.7, user-scalable=no"}, - }, "favicon": "favicon.ico", "styles": []interface{}{"example.css", "code.css"}}, - - map[string]interface{}{"componet_name": "ask", "componet_help": "ask", "componet_tmpl": "componet", - "componet_view": "FlashText", "componet_init": "initFlashText", - "componet_ctx": "web.code", "componet_cmd": "flash", "componet_args": []interface{}{"text", "@text"}, "inputs": []interface{}{ - map[string]interface{}{"type": "textarea", "name": "text", "value": "", "cols": 50, "rows": 5}, - map[string]interface{}{"type": "button", "value": "添加请求"}, - }, - "display_result": "", "display_append": "", - }, - map[string]interface{}{"componet_name": "tip", "componet_help": "tip", "componet_tmpl": "componet", - "componet_view": "FlashList", "componet_init": "initFlashList", - "componet_ctx": "web.code", "componet_cmd": "flash", - "display_result": "", "display_append": "", - }, - - map[string]interface{}{"componet_name": "tail", "componet_tmpl": "tail", - "scripts": []interface{}{"toolkit.js", "context.js", "example.js", "code.js"}, - }, - }, - "schedule": []interface{}{ - map[string]interface{}{"componet_name": "flash", "componet_tmpl": "head", "metas": []interface{}{ - map[string]interface{}{"name": "viewport", "content": "width=device-width, initial-scale=0.7, user-scalable=no"}, - }, "favicon": "favicon.ico", "styles": []interface{}{"example.css", "code.css"}}, - - map[string]interface{}{"componet_name": "com", "componet_help": "com", "componet_tmpl": "componet", - "componet_view": "ComList", "componet_init": "initComList", - "componet_ctx": "web.code", "componet_cmd": "componet", "componet_args": []interface{}{"share", "@role", "@componet_group", "@tips"}, "inputs": []interface{}{ - map[string]interface{}{"type": "text", "name": "role", "value": "tech", "label": "role"}, - map[string]interface{}{"type": "text", "name": "tips", "value": "schedule", "label": "tips"}, - map[string]interface{}{"type": "button", "value": "共享页面"}, - }, - }, - - map[string]interface{}{"componet_name": "text", "componet_help": "text", "componet_tmpl": "componet", - "componet_view": "ScheduleText", "componet_init": "initScheduleText", - "componet_ctx": "web.code", "componet_cmd": "schedule", - "componet_args": []interface{}{"@time", "@name", "@place"}, "inputs": []interface{}{ - map[string]interface{}{"type": "text", "name": "time", "value": "", "label": "time"}, - map[string]interface{}{"type": "text", "name": "name", "value": "", "label": "name"}, - map[string]interface{}{"type": "text", "name": "place", "value": "", "label": "place"}, - map[string]interface{}{"type": "button", "value": "添加行程"}, - }, - "display_result": "", "display_append": "", - }, - map[string]interface{}{"componet_name": "list", "componet_help": "list", "componet_tmpl": "componet", - "componet_view": "ScheduleList", "componet_init": "initScheduleList", - "componet_ctx": "web.code", "componet_cmd": "schedule", - "inputs": []interface{}{ - map[string]interface{}{"type": "choice", "name": "view", "value": "default", "label": "显示字段", "choice": []interface{}{ - map[string]interface{}{"name": "默认", "value": "default"}, - map[string]interface{}{"name": "行程", "value": "order"}, - map[string]interface{}{"name": "总结", "value": "summary"}, - }}, - map[string]interface{}{"type": "button", "value": "刷新行程"}, - }, - "display_result": "", - }, - - map[string]interface{}{"componet_name": "tail", "componet_tmpl": "tail", - "scripts": []interface{}{"toolkit.js", "context.js", "example.js", "code.js"}, - }, - }, - "index": []interface{}{ - map[string]interface{}{"componet_name": "code", "componet_tmpl": "head", "metas": []interface{}{ - map[string]interface{}{"name": "viewport", "content": "width=device-width, initial-scale=0.7, user-scalable=no"}, - }, "favicon": "favicon.ico", "styles": []interface{}{"example.css", "code.css"}}, - map[string]interface{}{"componet_name": "banner", "componet_help": "banner", "componet_tmpl": "banner", - "componet_view": "Banner", "componet_init": "initBanner", - }, - - map[string]interface{}{"componet_name": "toolkit", "componet_help": "Ctrl+B", "componet_tmpl": "toolkit", - "componet_view": "KitList", "componet_init": "initKitList", - }, - // map[string]interface{}{"componet_name": "login", "componet_help": "login", "componet_tmpl": "componet", - // "componet_ctx": "aaa", "componet_cmd": "login", "componet_args": []interface{}{"@username", "@password"}, - // "inputs": []interface{}{ - // map[string]interface{}{"type": "text", "name": "username", "label": "username"}, - // map[string]interface{}{"type": "password", "name": "password", "label": "password"}, - // map[string]interface{}{"type": "button", "value": "login"}, - // }, - // "display_append": "", "display_result": "", - // }, - // map[string]interface{}{"componet_name": "userinfo", "componet_help": "userinfo", "componet_tmpl": "componet", - // "componet_ctx": "aaa", "componet_cmd": "login", "componet_args": []interface{}{"@sessid"}, - // "pre_run": true, - // }, - map[string]interface{}{"componet_name": "buffer", "componet_help": "buffer", "componet_tmpl": "componet", - "componet_view": "BufList", "componet_init": "initBufList", - "componet_ctx": "cli", "componet_cmd": "tmux", "componet_args": []interface{}{"buffer"}, "inputs": []interface{}{ - map[string]interface{}{"type": "text", "name": "limit", "value": "3", "label": "limit"}, - map[string]interface{}{"type": "text", "name": "index", "value": "0", "label": "index"}, - map[string]interface{}{"type": "button", "value": "refresh"}, - }, - "pre_run": true, - }, - map[string]interface{}{"componet_name": "dir", "componet_help": "dir", "componet_tmpl": "componet", - "componet_view": "DirList", "componet_init": "initDirList", - "componet_ctx": "nfs", "componet_cmd": "dir", "componet_args": []interface{}{"@dir", "dir_sort", "@sort_field", "@sort_order"}, "inputs": []interface{}{ - map[string]interface{}{"type": "choice", "name": "dir_type", "value": "both", "label": "dir_type", "choice": []interface{}{ - map[string]interface{}{"name": "all", "value": "all"}, - map[string]interface{}{"name": "both", "value": "both"}, - map[string]interface{}{"name": "file", "value": "file"}, - map[string]interface{}{"name": "dir", "value": "dir"}, - }}, - map[string]interface{}{"type": "text", "name": "dir", "value": "@current.dir", "label": "dir"}, - map[string]interface{}{"type": "button", "value": "refresh"}, - }, - "pre_run": false, "display_result": "", - }, - map[string]interface{}{"componet_name": "upload", "componet_help": "upload", "componet_tmpl": "componet", - "componet_view": "PutFile", "componet_init": "initPutFile", - "componet_ctx": "web", "componet_cmd": "upload", "form_type": "upload", "inputs": []interface{}{ - map[string]interface{}{"type": "file", "name": "upload"}, - map[string]interface{}{"type": "submit", "value": "submit"}, - }, - "display_result": "", - }, - map[string]interface{}{"componet_name": "pod", "componet_help": "pod", "componet_tmpl": "componet", - "componet_view": "PodList", "componet_init": "initPodList", - "componet_ctx": "ssh", "componet_cmd": "node", "inputs": []interface{}{ - map[string]interface{}{"type": "text", "name": "pod", "value": "@current.pod"}, - map[string]interface{}{"type": "button", "value": "refresh"}, - }, - "pre_run": true, "display_result": "", - }, - map[string]interface{}{"componet_name": "ctx", "componet_help": "ctx", "componet_tmpl": "componet", - "componet_view": "CtxList", "componet_init": "initCtxList", - "componet_pod": "true", "componet_ctx": "ssh", "componet_cmd": "context", "componet_args": []interface{}{"@ctx", "list"}, "inputs": []interface{}{ - map[string]interface{}{"type": "text", "name": "ctx", "value": "@current.ctx"}, - map[string]interface{}{"type": "button", "value": "refresh"}, - }, - "display_result": "", - }, - map[string]interface{}{"componet_name": "cmd", "componet_help": "cmd", "componet_tmpl": "componet", - "componet_view": "CmdList", "componet_init": "initCmdList", - "componet_ctx": "cli.shy", "componet_cmd": "source", "componet_args": []interface{}{"@cmd"}, "inputs": []interface{}{ - map[string]interface{}{"type": "text", "name": "cmd", "value": "", "class": "cmd", "clipstack": "void"}, - }, - }, - // map[string]interface{}{"componet_name": "mp", "componet_tmpl": "mp"}, - map[string]interface{}{"componet_name": "tail", "componet_tmpl": "tail", - "scripts": []interface{}{"toolkit.js", "context.js", "example.js", "code.js"}, - }, - }, - }, 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"}}, - }, Help: "闪存"}, - "schedule": &ctx.Config{Name: "schedule", Value: map[string]interface{}{ - "data": []interface{}{}, - "view": map[string]interface{}{ - "default": []interface{}{"面试时间", "面试公司", "面试地点", "面试轮次", "题目类型", "面试题目", "面试总结"}, - "summary": []interface{}{"面试公司", "面试轮次", "题目类型", "面试题目", "面试总结"}, - "order": []interface{}{"面试时间", "面试公司", "面试地点"}, - }, - "maps": map[string]interface{}{"baidu": "%s"}, - }, Help: "闪存"}, - - "counter": &ctx.Config{Name: "counter", Value: map[string]interface{}{ - "nopen": "0", "nsave": "0", - }, Help: "counter"}, - "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{})) - // 查看列表 - if len(arg) == 0 { - if index := m.Option("flash_index"); index != "" { - arg = append(arg, index) - } else { - m.Confm("flash", "data", func(index int, item map[string]interface{}) { - for _, k := range kit.View([]string{}, m.Confm("flash", "view")) { - m.Add("append", k, kit.Format(item[k])) - } - }) - m.Table() - return - } - - } - - index, item := -1, map[string]interface{}{"time": m.Time()} - if i, e := strconv.Atoi(arg[0]); e == nil && 0 <= i && i < total { - // 查看索引 - index, arg = total-1-i, arg[1:] - if item = m.Confm("flash", []interface{}{"data", index}); len(arg) == 0 { - // 查看数据 - for _, k := range kit.View([]string{}, m.Confm("flash", "view")) { - m.Add("append", k, kit.Format(item[k])) - } - m.Table() - return e - } - } - - switch arg[0] { - case "vim": // 编辑数据 - name := m.Cmdx("nfs.temp", kit.Format(item[kit.Select("code", arg, 1)])) - m.Cmd("cli.system", "vi", name) - item[kit.Select("code", arg, 1)] = m.Cmdx("nfs.load", name) - m.Cmd("nfs.trash", name) - - case "run": // 运行代码 - code := kit.Format(item[kit.Select("code", arg, 1)]) - if code == "" { - break - } - name := m.Cmdx("nfs.temp", code) - m.Cmdy("cli.system", "python", name) - item["output"] = m.Result(0) - m.Cmd("nfs.trash", name) - - default: - // 修改数据 - for i := 0; i < len(arg)-1; i += 2 { - item[arg[i]] = arg[i+1] - } - m.Conf("flash", []interface{}{"data", index}, item) - item["index"] = total - 1 - index - m.Echo("%d", total-1-index) - } - - return - }}, - "schedule": &ctx.Command{Name: "schedule [time name place]", Help: "行程安排", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { - if len(arg) == 0 { // 会话列表 - m.Confm("schedule", "data", func(index int, value map[string]interface{}) { - for _, v := range kit.View([]string{m.Option("view")}, m.Confm("schedule", "view")) { - if v == "面试地点" { - m.Add("append", "面试地点", fmt.Sprintf(m.Conf("schedule", "maps.baidu"), value["面试地点"], value["面试地点"])) - continue - } - m.Add("append", v, kit.Format(value[v])) - } - }) - m.Table() - return - } - - view := "default" - if m.Confs("schedule", arg[0]) { - view, arg = arg[0], arg[1:] - } - - data := map[string]interface{}{} - for _, k := range kit.View([]string{view}, m.Confm("schedule", "view")) { - if len(arg) == 0 { - data[k] = "" - continue - } - data[k], arg = arg[0], arg[1:] - } - - extra := map[string]interface{}{} - for i := 0; i < len(arg)-1; i += 2 { - data[arg[i]] = arg[i+1] - } - data["extra"] = extra - - m.Conf("schedule", []string{"data", "-1"}, data) - return - }}, - "12306": &ctx.Command{Name: "12306", Help: "12306", Form: map[string]int{"fields": 1, "limit": 1, "offset": 1}, Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { - date := time.Now().Add(time.Hour * 24).Format("2006-01-02") - if len(arg) > 0 { - date, arg = arg[0], arg[1:] - } - to := "QFK" - if len(arg) > 0 { - to, arg = arg[0], arg[1:] - } - from := "BJP" - if len(arg) > 0 { - from, arg = arg[0], arg[1:] - } - m.Echo("%s->%s %s\n", from, to, date) - - m.Cmd("web.get", fmt.Sprintf("https://kyfw.12306.cn/otn/leftTicket/queryX?leftTicketDTO.train_date=%s&leftTicketDTO.from_station=%s&leftTicketDTO.to_station=%s&purpose_codes=ADULT", date, from, to), "temp", "data.result") - for _, v := range m.Meta["value"] { - fields := strings.Split(v, "|") - m.Add("append", "车次--", fields[3]) - m.Add("append", "出发----", fields[8]) - m.Add("append", "到站----", fields[9]) - m.Add("append", "时长----", fields[10]) - m.Add("append", "二等座", fields[30]) - m.Add("append", "一等座", fields[31]) - } - m.Table() - return - }}, - "brow": &ctx.Command{Name: "brow url", Help: "浏览网页", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { - if len(arg) == 0 { - m.Cmd("tcp.ifconfig").Table(func(index int, value map[string]string) { - m.Append("index", index) - m.Append("site", fmt.Sprintf("%s://%s%s", m.Conf("serve", "protocol"), value["ip"], m.Conf("runtime", "boot.web_port"))) - }) - m.Table() - return - } - - switch runtime.GOOS { - case "windows": - m.Cmd("cli.system", "explorer", arg[0]) - case "darwin": - m.Cmd("cli.system", "open", arg[0]) - default: - m.Cmd("web.get", arg[0]) - } - return - }}, - - "/counter": &ctx.Command{Name: "/counter", Help: "/counter", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { - if len(arg) > 0 { - m.Option("name", arg[0]) - } - if len(arg) > 1 { - m.Option("count", arg[1]) - } - - count := m.Optioni("count") - switch v := m.Confv("counter", m.Option("name")).(type) { - case string: - i, e := strconv.Atoi(v) - m.Assert(e) - count += i - } - m.Log("info", "%v: %v", m.Option("name"), m.Confv("counter", m.Option("name"), fmt.Sprintf("%d", count))) - m.Echo("%d", count) - return - }}, - "counter": &ctx.Command{Name: "counter name count", Help: "counter", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { - if len(arg) > 1 { - m.Copy(m.Spawn().Cmd("get", m.Conf("counter_service"), "name", arg[0], "count", arg[1]), "result") - } - return - }}, - "tmux": &ctx.Command{Name: "tmux buffer", Help: "终端管理, buffer: 查看复制", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { - switch arg[0] { - case "buffer": - bufs := strings.Split(m.Spawn().Cmd("system", "tmux", "list-buffers").Result(0), "\n") - - n := 3 - if m.Option("limit") != "" { - n = m.Optioni("limit") - } - - for i, b := range bufs { - if i >= n { - break - } - bs := strings.SplitN(b, ": ", 3) - if len(bs) > 1 { - m.Add("append", "buffer", bs[0][:len(bs[0])]) - m.Add("append", "length", bs[1][:len(bs[1])-6]) - m.Add("append", "strings", bs[2][1:len(bs[2])-1]) - } - } - - if m.Option("index") == "" { - m.Echo(m.Spawn().Cmd("system", "tmux", "show-buffer").Result(0)) - } else { - m.Echo(m.Spawn().Cmd("system", "tmux", "show-buffer", "-b", m.Option("index")).Result(0)) - } - } - return - }}, - "windows": &ctx.Command{Name: "windows", Help: "windows", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { - m.Append("nclient", strings.Count(m.Spawn().Cmd("system", "tmux", "list-clients").Result(0), "\n")) - m.Append("nsession", strings.Count(m.Spawn().Cmd("system", "tmux", "list-sessions").Result(0), "\n")) - m.Append("nwindow", strings.Count(m.Spawn().Cmd("system", "tmux", "list-windows", "-a").Result(0), "\n")) - m.Append("npane", strings.Count(m.Spawn().Cmd("system", "tmux", "list-panes", "-a").Result(0), "\n")) - - m.Append("nbuf", strings.Count(m.Spawn().Cmd("system", "tmux", "list-buffers").Result(0), "\n")) - m.Append("ncmd", strings.Count(m.Spawn().Cmd("system", "tmux", "list-commands").Result(0), "\n")) - m.Append("nkey", strings.Count(m.Spawn().Cmd("system", "tmux", "list-keys").Result(0), "\n")) - m.Table() - return - }}, - "notice": &ctx.Command{Name: "notice", Help: "睡眠, time(ns/us/ms/s/m/h): 时间值(纳秒/微秒/毫秒/秒/分钟/小时)", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { - m.Cmd("cli.system", "osascript", "-e", fmt.Sprintf("display notification \"%s\"", kit.Select("", arg, 0))) - return - }}, - }, -} - -func init() { - code := &web.WEB{} - code.Context = Index - web.Index.Register(Index, code) -} diff --git a/src/contexts/aaa/aaa.go b/src/honor/src/contexts/aaa/aaa.go similarity index 100% rename from src/contexts/aaa/aaa.go rename to src/honor/src/contexts/aaa/aaa.go diff --git a/src/contexts/cli/cli.go b/src/honor/src/contexts/cli/cli.go similarity index 100% rename from src/contexts/cli/cli.go rename to src/honor/src/contexts/cli/cli.go diff --git a/src/contexts/cli/version.go b/src/honor/src/contexts/cli/version.go similarity index 100% rename from src/contexts/cli/version.go rename to src/honor/src/contexts/cli/version.go diff --git a/src/contexts/ctx/cgi.go b/src/honor/src/contexts/ctx/cgi.go similarity index 100% rename from src/contexts/ctx/cgi.go rename to src/honor/src/contexts/ctx/cgi.go diff --git a/src/contexts/ctx/core.go b/src/honor/src/contexts/ctx/core.go similarity index 100% rename from src/contexts/ctx/core.go rename to src/honor/src/contexts/ctx/core.go diff --git a/src/contexts/ctx/ctx.go b/src/honor/src/contexts/ctx/ctx.go similarity index 100% rename from src/contexts/ctx/ctx.go rename to src/honor/src/contexts/ctx/ctx.go diff --git a/src/contexts/ctx/misc.go b/src/honor/src/contexts/ctx/misc.go similarity index 100% rename from src/contexts/ctx/misc.go rename to src/honor/src/contexts/ctx/misc.go diff --git a/src/contexts/ctx/type.go b/src/honor/src/contexts/ctx/type.go similarity index 100% rename from src/contexts/ctx/type.go rename to src/honor/src/contexts/ctx/type.go diff --git a/src/contexts/gdb/gdb.go b/src/honor/src/contexts/gdb/gdb.go similarity index 100% rename from src/contexts/gdb/gdb.go rename to src/honor/src/contexts/gdb/gdb.go diff --git a/src/contexts/lex/lex.go b/src/honor/src/contexts/lex/lex.go similarity index 100% rename from src/contexts/lex/lex.go rename to src/honor/src/contexts/lex/lex.go diff --git a/src/contexts/log/log.go b/src/honor/src/contexts/log/log.go similarity index 100% rename from src/contexts/log/log.go rename to src/honor/src/contexts/log/log.go diff --git a/src/contexts/mdb/mdb.go b/src/honor/src/contexts/mdb/mdb.go similarity index 100% rename from src/contexts/mdb/mdb.go rename to src/honor/src/contexts/mdb/mdb.go diff --git a/src/contexts/nfs/nfs.go b/src/honor/src/contexts/nfs/nfs.go similarity index 100% rename from src/contexts/nfs/nfs.go rename to src/honor/src/contexts/nfs/nfs.go diff --git a/src/contexts/nfs/term.go b/src/honor/src/contexts/nfs/term.go similarity index 100% rename from src/contexts/nfs/term.go rename to src/honor/src/contexts/nfs/term.go diff --git a/src/contexts/ssh/ssh.go b/src/honor/src/contexts/ssh/ssh.go similarity index 100% rename from src/contexts/ssh/ssh.go rename to src/honor/src/contexts/ssh/ssh.go diff --git a/src/contexts/tcp/tcp.go b/src/honor/src/contexts/tcp/tcp.go similarity index 100% rename from src/contexts/tcp/tcp.go rename to src/honor/src/contexts/tcp/tcp.go diff --git a/src/contexts/web/parse.go b/src/honor/src/contexts/web/parse.go similarity index 100% rename from src/contexts/web/parse.go rename to src/honor/src/contexts/web/parse.go diff --git a/src/contexts/web/web.go b/src/honor/src/contexts/web/web.go similarity index 100% rename from src/contexts/web/web.go rename to src/honor/src/contexts/web/web.go diff --git a/src/contexts/yac/yac.go b/src/honor/src/contexts/yac/yac.go similarity index 100% rename from src/contexts/yac/yac.go rename to src/honor/src/contexts/yac/yac.go diff --git a/src/examples/chat/chat.go b/src/honor/src/examples/chat/chat.go similarity index 100% rename from src/examples/chat/chat.go rename to src/honor/src/examples/chat/chat.go diff --git a/src/examples/chat/feishu/chat.go b/src/honor/src/examples/chat/feishu/chat.go similarity index 100% rename from src/examples/chat/feishu/chat.go rename to src/honor/src/examples/chat/feishu/chat.go diff --git a/src/examples/code/code.go b/src/honor/src/examples/code/code.go similarity index 100% rename from src/examples/code/code.go rename to src/honor/src/examples/code/code.go diff --git a/src/examples/mall/mall.go b/src/honor/src/examples/mall/mall.go similarity index 100% rename from src/examples/mall/mall.go rename to src/honor/src/examples/mall/mall.go diff --git a/src/examples/team/team.go b/src/honor/src/examples/team/team.go similarity index 100% rename from src/examples/team/team.go rename to src/honor/src/examples/team/team.go diff --git a/src/examples/wiki/chart.go b/src/honor/src/examples/wiki/chart.go similarity index 100% rename from src/examples/wiki/chart.go rename to src/honor/src/examples/wiki/chart.go diff --git a/src/examples/wiki/wiki.go b/src/honor/src/examples/wiki/wiki.go similarity index 100% rename from src/examples/wiki/wiki.go rename to src/honor/src/examples/wiki/wiki.go diff --git a/src/extend/findgrep.go b/src/honor/src/extend/findgrep.go similarity index 100% rename from src/extend/findgrep.go rename to src/honor/src/extend/findgrep.go diff --git a/src/extend/shy.go b/src/honor/src/extend/shy.go similarity index 100% rename from src/extend/shy.go rename to src/honor/src/extend/shy.go diff --git a/src/plugin/context/index.go b/src/honor/src/plugin/context/index.go similarity index 100% rename from src/plugin/context/index.go rename to src/honor/src/plugin/context/index.go diff --git a/src/plugin/context/index.js b/src/honor/src/plugin/context/index.js similarity index 100% rename from src/plugin/context/index.js rename to src/honor/src/plugin/context/index.js diff --git a/src/plugin/context/index.shy b/src/honor/src/plugin/context/index.shy similarity index 100% rename from src/plugin/context/index.shy rename to src/honor/src/plugin/context/index.shy diff --git a/src/plugin/context/local.shy b/src/honor/src/plugin/context/local.shy similarity index 100% rename from src/plugin/context/local.shy rename to src/honor/src/plugin/context/local.shy diff --git a/src/plugin/docker/index.css b/src/honor/src/plugin/docker/index.css similarity index 100% rename from src/plugin/docker/index.css rename to src/honor/src/plugin/docker/index.css diff --git a/src/plugin/docker/index.go b/src/honor/src/plugin/docker/index.go similarity index 100% rename from src/plugin/docker/index.go rename to src/honor/src/plugin/docker/index.go diff --git a/src/plugin/docker/index.js b/src/honor/src/plugin/docker/index.js similarity index 100% rename from src/plugin/docker/index.js rename to src/honor/src/plugin/docker/index.js diff --git a/src/plugin/docker/index.shy b/src/honor/src/plugin/docker/index.shy similarity index 100% rename from src/plugin/docker/index.shy rename to src/honor/src/plugin/docker/index.shy diff --git a/src/plugin/dream/index.css b/src/honor/src/plugin/dream/index.css similarity index 100% rename from src/plugin/dream/index.css rename to src/honor/src/plugin/dream/index.css diff --git a/src/plugin/dream/index.go b/src/honor/src/plugin/dream/index.go similarity index 100% rename from src/plugin/dream/index.go rename to src/honor/src/plugin/dream/index.go diff --git a/src/plugin/dream/index.js b/src/honor/src/plugin/dream/index.js similarity index 100% rename from src/plugin/dream/index.js rename to src/honor/src/plugin/dream/index.js diff --git a/src/plugin/dream/index.shy b/src/honor/src/plugin/dream/index.shy similarity index 100% rename from src/plugin/dream/index.shy rename to src/honor/src/plugin/dream/index.shy diff --git a/src/plugin/favor/index.go b/src/honor/src/plugin/favor/index.go similarity index 100% rename from src/plugin/favor/index.go rename to src/honor/src/plugin/favor/index.go diff --git a/src/plugin/favor/index.js b/src/honor/src/plugin/favor/index.js similarity index 100% rename from src/plugin/favor/index.js rename to src/honor/src/plugin/favor/index.js diff --git a/src/plugin/favor/index.shy b/src/honor/src/plugin/favor/index.shy similarity index 100% rename from src/plugin/favor/index.shy rename to src/honor/src/plugin/favor/index.shy diff --git a/src/plugin/favor/local.shy b/src/honor/src/plugin/favor/local.shy similarity index 100% rename from src/plugin/favor/local.shy rename to src/honor/src/plugin/favor/local.shy diff --git a/src/plugin/favor/macro.js b/src/honor/src/plugin/favor/macro.js similarity index 100% rename from src/plugin/favor/macro.js rename to src/honor/src/plugin/favor/macro.js diff --git a/src/plugin/feature/index.css b/src/honor/src/plugin/feature/index.css similarity index 100% rename from src/plugin/feature/index.css rename to src/honor/src/plugin/feature/index.css diff --git a/src/plugin/feature/index.go b/src/honor/src/plugin/feature/index.go similarity index 100% rename from src/plugin/feature/index.go rename to src/honor/src/plugin/feature/index.go diff --git a/src/plugin/feature/index.js b/src/honor/src/plugin/feature/index.js similarity index 100% rename from src/plugin/feature/index.js rename to src/honor/src/plugin/feature/index.js diff --git a/src/plugin/feature/index.shy b/src/honor/src/plugin/feature/index.shy similarity index 100% rename from src/plugin/feature/index.shy rename to src/honor/src/plugin/feature/index.shy diff --git a/src/plugin/love/index.css b/src/honor/src/plugin/love/index.css similarity index 100% rename from src/plugin/love/index.css rename to src/honor/src/plugin/love/index.css diff --git a/src/plugin/love/index.go b/src/honor/src/plugin/love/index.go similarity index 100% rename from src/plugin/love/index.go rename to src/honor/src/plugin/love/index.go diff --git a/src/plugin/love/index.js b/src/honor/src/plugin/love/index.js similarity index 100% rename from src/plugin/love/index.js rename to src/honor/src/plugin/love/index.js diff --git a/src/plugin/love/index.shy b/src/honor/src/plugin/love/index.shy similarity index 100% rename from src/plugin/love/index.shy rename to src/honor/src/plugin/love/index.shy diff --git a/src/plugin/love/local.shy b/src/honor/src/plugin/love/local.shy similarity index 100% rename from src/plugin/love/local.shy rename to src/honor/src/plugin/love/local.shy diff --git a/src/plugin/love/maps.js b/src/honor/src/plugin/love/maps.js similarity index 100% rename from src/plugin/love/maps.js rename to src/honor/src/plugin/love/maps.js diff --git a/src/plugin/love/pics.js b/src/honor/src/plugin/love/pics.js similarity index 100% rename from src/plugin/love/pics.js rename to src/honor/src/plugin/love/pics.js diff --git a/src/plugin/mind/index.css b/src/honor/src/plugin/mind/index.css similarity index 100% rename from src/plugin/mind/index.css rename to src/honor/src/plugin/mind/index.css diff --git a/src/plugin/mind/index.go b/src/honor/src/plugin/mind/index.go similarity index 100% rename from src/plugin/mind/index.go rename to src/honor/src/plugin/mind/index.go diff --git a/src/plugin/mind/index.js b/src/honor/src/plugin/mind/index.js similarity index 100% rename from src/plugin/mind/index.js rename to src/honor/src/plugin/mind/index.js diff --git a/src/plugin/mind/index.shy b/src/honor/src/plugin/mind/index.shy similarity index 100% rename from src/plugin/mind/index.shy rename to src/honor/src/plugin/mind/index.shy diff --git a/src/plugin/mind/local.shy b/src/honor/src/plugin/mind/local.shy similarity index 100% rename from src/plugin/mind/local.shy rename to src/honor/src/plugin/mind/local.shy diff --git a/src/plugin/redis/index.css b/src/honor/src/plugin/redis/index.css similarity index 100% rename from src/plugin/redis/index.css rename to src/honor/src/plugin/redis/index.css diff --git a/src/plugin/redis/index.go b/src/honor/src/plugin/redis/index.go similarity index 100% rename from src/plugin/redis/index.go rename to src/honor/src/plugin/redis/index.go diff --git a/src/plugin/redis/index.js b/src/honor/src/plugin/redis/index.js similarity index 100% rename from src/plugin/redis/index.js rename to src/honor/src/plugin/redis/index.js diff --git a/src/plugin/redis/index.shy b/src/honor/src/plugin/redis/index.shy similarity index 100% rename from src/plugin/redis/index.shy rename to src/honor/src/plugin/redis/index.shy diff --git a/src/plugin/sort/index.go b/src/honor/src/plugin/sort/index.go similarity index 100% rename from src/plugin/sort/index.go rename to src/honor/src/plugin/sort/index.go diff --git a/src/plugin/storage/index.go b/src/honor/src/plugin/storage/index.go similarity index 100% rename from src/plugin/storage/index.go rename to src/honor/src/plugin/storage/index.go diff --git a/src/plugin/storage/index.js b/src/honor/src/plugin/storage/index.js similarity index 100% rename from src/plugin/storage/index.js rename to src/honor/src/plugin/storage/index.js diff --git a/src/plugin/storage/index.shy b/src/honor/src/plugin/storage/index.shy similarity index 100% rename from src/plugin/storage/index.shy rename to src/honor/src/plugin/storage/index.shy diff --git a/src/plugin/storage/local.shy b/src/honor/src/plugin/storage/local.shy similarity index 100% rename from src/plugin/storage/local.shy rename to src/honor/src/plugin/storage/local.shy diff --git a/src/plugin/story/index.css b/src/honor/src/plugin/story/index.css similarity index 100% rename from src/plugin/story/index.css rename to src/honor/src/plugin/story/index.css diff --git a/src/plugin/story/index.go b/src/honor/src/plugin/story/index.go similarity index 100% rename from src/plugin/story/index.go rename to src/honor/src/plugin/story/index.go diff --git a/src/plugin/story/index.js b/src/honor/src/plugin/story/index.js similarity index 100% rename from src/plugin/story/index.js rename to src/honor/src/plugin/story/index.js diff --git a/src/plugin/story/index.shy b/src/honor/src/plugin/story/index.shy similarity index 100% rename from src/plugin/story/index.shy rename to src/honor/src/plugin/story/index.shy diff --git a/src/plugin/task/index.css b/src/honor/src/plugin/task/index.css similarity index 100% rename from src/plugin/task/index.css rename to src/honor/src/plugin/task/index.css diff --git a/src/plugin/task/index.go b/src/honor/src/plugin/task/index.go similarity index 100% rename from src/plugin/task/index.go rename to src/honor/src/plugin/task/index.go diff --git a/src/plugin/task/index.js b/src/honor/src/plugin/task/index.js similarity index 100% rename from src/plugin/task/index.js rename to src/honor/src/plugin/task/index.js diff --git a/src/plugin/task/index.shy b/src/honor/src/plugin/task/index.shy similarity index 100% rename from src/plugin/task/index.shy rename to src/honor/src/plugin/task/index.shy diff --git a/src/plugin/test/index.go b/src/honor/src/plugin/test/index.go similarity index 100% rename from src/plugin/test/index.go rename to src/honor/src/plugin/test/index.go diff --git a/src/plugin/tmux/index.go b/src/honor/src/plugin/tmux/index.go similarity index 100% rename from src/plugin/tmux/index.go rename to src/honor/src/plugin/tmux/index.go diff --git a/src/plugin/tmux/index.js b/src/honor/src/plugin/tmux/index.js similarity index 100% rename from src/plugin/tmux/index.js rename to src/honor/src/plugin/tmux/index.js diff --git a/src/plugin/tmux/index.shy b/src/honor/src/plugin/tmux/index.shy similarity index 100% rename from src/plugin/tmux/index.shy rename to src/honor/src/plugin/tmux/index.shy diff --git a/src/plugin/tmux/local.shy b/src/honor/src/plugin/tmux/local.shy similarity index 100% rename from src/plugin/tmux/local.shy rename to src/honor/src/plugin/tmux/local.shy diff --git a/src/plugin/vim/index.css b/src/honor/src/plugin/vim/index.css similarity index 100% rename from src/plugin/vim/index.css rename to src/honor/src/plugin/vim/index.css diff --git a/src/plugin/vim/index.go b/src/honor/src/plugin/vim/index.go similarity index 100% rename from src/plugin/vim/index.go rename to src/honor/src/plugin/vim/index.go diff --git a/src/plugin/vim/index.js b/src/honor/src/plugin/vim/index.js similarity index 100% rename from src/plugin/vim/index.js rename to src/honor/src/plugin/vim/index.js diff --git a/src/plugin/vim/index.shy b/src/honor/src/plugin/vim/index.shy similarity index 100% rename from src/plugin/vim/index.shy rename to src/honor/src/plugin/vim/index.shy diff --git a/src/plugin/weixin/index.css b/src/honor/src/plugin/weixin/index.css similarity index 100% rename from src/plugin/weixin/index.css rename to src/honor/src/plugin/weixin/index.css diff --git a/src/plugin/weixin/index.go b/src/honor/src/plugin/weixin/index.go similarity index 100% rename from src/plugin/weixin/index.go rename to src/honor/src/plugin/weixin/index.go diff --git a/src/plugin/weixin/index.js b/src/honor/src/plugin/weixin/index.js similarity index 100% rename from src/plugin/weixin/index.js rename to src/honor/src/plugin/weixin/index.js diff --git a/src/plugin/weixin/index.shy b/src/honor/src/plugin/weixin/index.shy similarity index 100% rename from src/plugin/weixin/index.shy rename to src/honor/src/plugin/weixin/index.shy diff --git a/src/plugin/weixin/local.shy b/src/honor/src/plugin/weixin/local.shy similarity index 100% rename from src/plugin/weixin/local.shy rename to src/honor/src/plugin/weixin/local.shy diff --git a/src/plugin/zsh/index.css b/src/honor/src/plugin/zsh/index.css similarity index 100% rename from src/plugin/zsh/index.css rename to src/honor/src/plugin/zsh/index.css diff --git a/src/plugin/zsh/index.go b/src/honor/src/plugin/zsh/index.go similarity index 100% rename from src/plugin/zsh/index.go rename to src/honor/src/plugin/zsh/index.go diff --git a/src/plugin/zsh/index.js b/src/honor/src/plugin/zsh/index.js similarity index 100% rename from src/plugin/zsh/index.js rename to src/honor/src/plugin/zsh/index.js diff --git a/src/plugin/zsh/index.shy b/src/honor/src/plugin/zsh/index.shy similarity index 100% rename from src/plugin/zsh/index.shy rename to src/honor/src/plugin/zsh/index.shy diff --git a/src/support/wuhan/wuhan.go b/src/honor/src/support/wuhan/wuhan.go similarity index 100% rename from src/support/wuhan/wuhan.go rename to src/honor/src/support/wuhan/wuhan.go diff --git a/src/support/wuhan/wuhan.md b/src/honor/src/support/wuhan/wuhan.md similarity index 100% rename from src/support/wuhan/wuhan.md rename to src/honor/src/support/wuhan/wuhan.md diff --git a/src/toolkit/core.go b/src/honor/src/toolkit/core.go similarity index 100% rename from src/toolkit/core.go rename to src/honor/src/toolkit/core.go diff --git a/src/toolkit/misc.go b/src/honor/src/toolkit/misc.go similarity index 100% rename from src/toolkit/misc.go rename to src/honor/src/toolkit/misc.go diff --git a/src/toolkit/shy.go b/src/honor/src/toolkit/shy.go similarity index 100% rename from src/toolkit/shy.go rename to src/honor/src/toolkit/shy.go diff --git a/src/toolkit/type.go b/src/honor/src/toolkit/type.go similarity index 100% rename from src/toolkit/type.go rename to src/honor/src/toolkit/type.go diff --git a/usr/client/mp/app.js b/usr/client/mp/app.js deleted file mode 100644 index ccfb8e89..00000000 --- a/usr/client/mp/app.js +++ /dev/null @@ -1,218 +0,0 @@ -App({ - log: function(type, args) { - switch (type) { - case "info": - console.log(args) - break - default: - console.log(type, args) - } - }, - toast: function(text) { - wx.showToast(text) - }, - sheet: function(list, cb) { - wx.showActionSheet({itemList: list, success(res) { - typeof cb == "function" && cb(list[res.tapIndex]) - }}) - }, - confirm: function(content, confirm, cancel) { - wx.showModal({ - title: "context", content: content, success: function(res) { - res.confirm && typeof confirm == "function" && confirm() - res.cancel && typeof cancel == "function" && cancel() - } - }) - }, - place: function(cb) { - var app = this - wx.authorize({scope: "scope.userLocation"}) - - wx.chooseLocation({success: function(res) { - app.log(res) - typeof cb == "function" && cb(res) - }}) - }, - stoprefresh: function(cb) { - wx.stopPullDownRefresh() - }, - navigate: function(page, args) { - if (!page) { - wx.navigateBack() - return - } - var list = [] - for (var k in args) { - list.push(k+"="+args[k]) - } - - wx.navigateTo({url:"/pages/"+page+"/"+page + (list.length>0? "?"+list.join("&"): "")}) - }, - - request: function(data, done, fail) { - var app = this - data = data || {} - data.sessid = app.sessid || "" - - var what = {method: "POST", url: "https://shylinux.com/chat/mp", data: data, - success: function(res) { - what.res = res - app.log(what) - typeof done == "function" && done(res.data) - }, - fail: function(res) { - what.res = res - app.log(what) - typeof done == "function" && done(res.data) - }, - } - - wx.request(what) - }, - - sessid: "", - userInfo: {}, - login: function(cb) { - var app = this - if (app.sessid) { - typeof cb == "function" && cb(app.userInfo) - return - } - - wx.login({success: function(res) { - app.request({code: res.code}, function(sessid) { - app.sessid = sessid - - wx.getSetting({success: function(res) { - if (res.authSetting['scope.userInfo']) { - wx.getUserInfo({success: function(res) { - app.userInfo = res.userInfo - app.request(res, function() { - typeof cb == "function" && cb(app.userInfo) - }) - }}) - } - }}) - }) - }}) - }, - - command: function(args, cb) { - var app = this - var cmd = args["cmd"] - if (cmd[0] == "note") { - cmd = ["context", "ssh", "sh", "node", "note", "context", "mdb"].concat(args["cmd"]) - } - - app.login(function(userInfo) { - app.request({cmd: cmd}, function(res) { - app.toast("ok") - typeof cb == "function" && cb(res) - }) - }) - }, - table: function(res, cb) { - if (res.append) { - for (var i = 0; i < res[res.append[0]].length; i++) { - var obj = {} - var line = [] - for (var j = 0; j < res.append.length; j++) { - line.push(res[res.append[j]][i]) - obj[res.append[j]] = res[res.append[j]][i] - } - typeof cb == "function" && cb(i, obj, line) - } - } - }, - - model: {}, - data: {model: {}, list: []}, - load: function(type, cb) { - var app = this - switch (type) { - case "model": - if (app.data.length > 0 && app.data.model.length > 0) { - typeof cb == "function" && cb(app.data.model) - return - } - - var cmd = {"cmd": ["note", type]} - if (type == "note") { - cmd.cmd.push("note") - } - - app.command(cmd, function(res) { - var ncol = res.append.length - var nrow = res[res.append[0]].length - for (var i = 0; i < nrow; i++) { - var view = JSON.parse(res["view"][i] || "{}") - var data = JSON.parse(res["data"][i] || "[]") - data.unshift({"name": "model", "type": "text", "value": res["name"][i]}) - data.unshift({"name": "name", "type": "text"}) - if (view.edit) { - for (var j = 0; j < data.length; j++) { - data[j].view = view.edit[data[j].name] - } - } - - app.data.model[res["name"][i]] = {name: res["name"][i], data: data, view: view} - } - typeof cb == "function" && cb(app.data.model) - }) - break - case "list": - if (app.data.length > 0 && app.data.list.length > 0) { - typeof cb == "function" && cb(app.data.list) - return - } - - var cmd = {"cmd": ["note", "show", "username", "username", "full"]} - - app.command(cmd, function(res) { - if (!res || !res.append) { - return - } - - var list = [] - var ncol = res.append.length - var nrow = res[res.append[0]].length - for (var i = 0; i < nrow; i++) { - var value = JSON.parse(res["value"][i] || "[]") - value.unshift({"type": "text", "name": "model", "value": res["model"][i]}) - value.unshift({"type": "text", "name": "name", "value": res["name"][i]}) - value.unshift({"type": "text", "name": "create_date", "value": res["create_time"][i].split(" ")[0].replace("-", "/").replace("-", "/")}) - - var line = { - create_time: res["create_time"][i], - model: res["model"][i], value: value, - view: JSON.parse(res["view"][i] || "{}"), data: {}, - } - - for (var v in line.view) { - var view = line.view[v] - - var data = [] - for (var k in view) { - if (k in line) { - data.push({name: k, view: view[k], value: line[k]}) - } - } - for (var j = 0; j < value.length; j++) { - var k = value[j]["name"] - if (((v == "edit") || (k in view)) && !(k in line)) { - data.push({name: k, view: view[k] || "", value: value[j]["value"]}) - } - } - line.data[v] = data - } - - list.push(line) - } - - app.data.list = list - typeof cb == "function" && cb(list) - }) - break - } - }, -}) diff --git a/usr/client/mp/app.json b/usr/client/mp/app.json deleted file mode 100644 index bcbd8f1f..00000000 --- a/usr/client/mp/app.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "pages": [ - "pages/list/list", - "pages/index/index", - "pages/note/note" - ], - "window": { - "backgroundColor": "#000", - "backgroundColorTop": "#000", - "backgroundColorBottom": "#000", - "backgroundTextStyle": "light", - "navigationBarBackgroundColor": "#000", - "navigationBarTitleText": "context", - "navigationBarTextStyle": "white", - "enablePullDownRefresh": true - }, - "permission": { - "scope.userLocation": { - "desc": "你的位置信息将用于记录事情发生地点" - } - } -} diff --git a/usr/client/mp/app.wxss b/usr/client/mp/app.wxss deleted file mode 100644 index e69de29b..00000000 diff --git a/usr/client/mp/pages/index/index.js b/usr/client/mp/pages/index/index.js deleted file mode 100644 index 97e08060..00000000 --- a/usr/client/mp/pages/index/index.js +++ /dev/null @@ -1,121 +0,0 @@ -const app = getApp() - -Page({ - data: { - nodes: [ - ["note", "shy"], - ["ctx", "cmd"], - ["note", "show"], - ], - shows: [0, 0, 0], - ctx: "", cmd: "", focus: false, - append: [], table: [], result: "", - }, - getPod(cb) { - var page = this - app.command({"cmd": ["context", "ssh", "remote"]}, function(res) { - var pod = [""] - app.table(res, function(i, obj, line) { - pod.push(obj.key) - }) - page.data.nodes[0] = pod - page.data.shows[0] = 0 - page.setData({nodes: page.data.nodes, shows: page.data.shows}) - typeof cb == "function" && cb(pod) - }) - }, - getCtx(pod, cb) { - var page = this - app.command({"cmd": ["context", "ssh", "sh", pod, "context", "ctx", "context"]}, function(res) { - var ctx = [] - app.table(res, function(i, obj, line) { - ctx.push(obj.names) - }) - page.data.nodes[1] = ctx - page.data.shows[1] = 0 - page.setData({nodes: page.data.nodes, shows: page.data.shows}) - typeof cb == "function" && cb(ctx) - }) - }, - getCmd(pod, ctx, cb) { - var page = this - app.command({"cmd": ["context", "ssh", "sh", pod, "context", ctx, "command", "all"]}, function(res) { - var cmd = [""] - app.table(res, function(i, obj, line) { - cmd.push(obj.key) - }) - page.data.nodes[2] = cmd - page.data.shows[2] = 0 - page.setData({nodes: page.data.nodes, shows: page.data.shows}) - page.setData({ctx: "context ssh sh node '"+pod+"' context "+ctx+" "+cmd[0]}) - typeof cb == "function" && cb(cmd) - }) - }, - onChange: function(e) { - var column = e.detail.column - var value = e.detail.value - var page = this - page.data.shows[column] = value - - var pod = page.data.nodes[0][page.data.shows[0]] - var ctx = page.data.nodes[1][page.data.shows[1]] - var cmd = page.data.nodes[2][page.data.shows[2]] - switch (column) { - case 0: - page.getCtx(pod, function(ctx) { - page.getCmd(pod, ctx[0], function(cmd) { - this.onCommand({detail:{value: ""}}) - }) - }) - break - case 1: - page.getCmd(pod, ctx, function(cmd) { - this.onCommand({detail:{value: ""}}) - }) - break - case 2: - page.setData({ctx: "context ssh sh node '"+pod+"' context "+ctx+" "+cmd}) - this.onCommand({detail:{value: ""}}) - break - } - }, - onCommand: function(e) { - var cmd = e.detail.value - var page = this - app.command({"cmd": ["source", page.data.ctx, cmd]}, function(res) { - var table = [] - app.table(res, function(i, obj, line) { - table.push(line) - }) - - page.setData({append: res.append || [], table: table, result: res.result? res.result.join("") :res}) - if (page.data.cmd) { - return - } - app.command({"cmd": ["note", cmd, "proxy", page.data.ctx, cmd]}) - }) - }, - onLoad: function (options) { - app.log({page: this.route, options: options}) - var data = app.data.list[options.index] - var cmd = "" - var page = this - page.getPod(function(pod) { - page.getCtx(pod[0], function(ctx) { - page.getCmd(pod[0], ctx[0], function(cmd) { - }) - }) - }) - - if (data) { - for (var i = 0; i < data.value.length; i++) { - if (data.value[i].name == "cmd") { - cmd = data.value[i].value - this.onCommand({detail:{value: cmd}}) - } - } - } - - this.setData({cmd: cmd, focus: cmd? false: true}) - }, -}) diff --git a/usr/client/mp/pages/index/index.json b/usr/client/mp/pages/index/index.json deleted file mode 100644 index 8835af06..00000000 --- a/usr/client/mp/pages/index/index.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "usingComponents": {} -} \ No newline at end of file diff --git a/usr/client/mp/pages/index/index.wxml b/usr/client/mp/pages/index/index.wxml deleted file mode 100644 index d0c8a307..00000000 --- a/usr/client/mp/pages/index/index.wxml +++ /dev/null @@ -1,16 +0,0 @@ - - - {{ctx}} - - - - - - - {{item}} - {{item}} - - {{result}} - diff --git a/usr/client/mp/pages/index/index.wxss b/usr/client/mp/pages/index/index.wxss deleted file mode 100644 index e1ee67a5..00000000 --- a/usr/client/mp/pages/index/index.wxss +++ /dev/null @@ -1,35 +0,0 @@ -.page { - color:cyan; - font-size:16px; - font-family:Courier; - background-color:black; - min-height:800px; - overflow:auto; -} -.command { - border:solid 2px green; - width:calc(100% - 4px); -} -.table { - border:solid 1px green; - display:table; - overflow:auto; -} -.table-row { - display:table-row; -} -.table-th { - background-color:red; - padding:4px; - border:solid 1px green; - display:table-cell; -} -.table-td { - padding:4px; - border:solid 1px green; - display:table-cell; -} -.result { - white-space:pre; - width:100%; -} diff --git a/usr/client/mp/project.config.json b/usr/client/mp/project.config.json deleted file mode 100644 index a855c4c7..00000000 --- a/usr/client/mp/project.config.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "description": "Project configuration file", - "packOptions": { - "ignore": [] - }, - "setting": { - "urlCheck": true, - "es6": true, - "postcss": true, - "minified": true, - "newFeature": true, - "autoAudits": false - }, - "compileType": "miniprogram", - "libVersion": "2.5.1", - "appid": "wxf4e5104d83476ed6", - "projectname": "mp", - "debugOptions": { - "hidedInDevtools": [] - }, - "isGameTourist": false, - "condition": { - "search": { - "current": -1, - "list": [] - }, - "conversation": { - "current": -1, - "list": [] - }, - "plugin": { - "current": -1, - "list": [] - }, - "game": { - "currentL": -1, - "list": [] - }, - "miniprogram": { - "current": 1, - "list": [ - { - "id": 0, - "name": "note", - "pathName": "pages/note/note", - "query": "model=note", - "scene": null - }, - { - "id": -1, - "name": "list", - "pathName": "pages/list/list", - "query": "", - "scene": null - } - ] - } - } -} \ No newline at end of file diff --git a/usr/client/python/ssh/__init__.py b/usr/client/python/ssh/__init__.py deleted file mode 100644 index 0c1d4809..00000000 --- a/usr/client/python/ssh/__init__.py +++ /dev/null @@ -1,232 +0,0 @@ -import json -import urllib -import socket - -class Context(object): - def Ctx(self): - msg.echo("context") - def Cmd(self, msg): - msg.echo("command %s", dir(self)) - - def config(self, msg): - for k, v in self.configs.iteritems(): - msg.append("key", k) - msg.append("value", str(json.dumps(v))) - msg.table() - msg.log("fuck %s", msg.meta["result"]) - - def Cap(self): - msg.echo("cache") - -class Message(object): - - code = 0 - @classmethod - def _incr_count(cls): - cls.code += 1 - return cls.code - - def __init__(self, m=None, target=None, remote_code=-1, message=None, meta={}): - self.code = self._incr_count() - self.remote_code = remote_code - self.message = m.code if m else message - self.target = target - self.meta = meta - - def detail(self, *argv): - detail = self.meta.get("detail", []) - if argv: - try: - i = int(argv[0]) - if 0 <= i and i < len(detail): - return detail[i] - else: - return "" - except: - self.meta["detail"] = argv - return self.meta.get("detail") or [] - - def detaili(self, *argv): - v = self.detail(*argv) - try: - return int(v) - except: - return 0 - - def option(self, key=None, value=None): - if key: - msg = self - while msg: - if key in msg.meta["option"]: - return msg.meta[key] - msg = msg.message - return [] - return self.meta.get("option", []) - - def append(self, key=None, value=None): - if value is not None: - self.meta[key] = self.meta.get(key, []) - self.meta[key].append(value) - if key not in self.meta.get("append", []): - self.meta["append"] = self.meta.get("append", []) - self.meta["append"].append(key) - - if key is not None: - return self.meta.get(key, [""])[0] - - return self.meta.get("append", []) - - def result(self, s=None): - if s: - self.meta["result"] = self.meta.get("result", []) - self.meta["result"].append(s) - return self.meta.get("result", []) - - def table(self): - nrow = len(self.meta[self.meta["append"][0]]) - ncol = len(self.meta["append"]) - - for j, k in enumerate(self.meta["append"]): - self.echo(k) - self.echo(" " if j < ncol-1 else "\n") - for i in range(nrow): - for j, k in enumerate(self.meta["append"]): - self.echo(self.meta[k][i]) - self.echo(" " if j < ncol-1 else "\n") - - def echo(self, s, *argv): - if len(argv) == 0: - self.result(s if len(argv) == 0 else s % argv) - - def Conf(self, key=None, value=None): - if value is not None: - self.target.configs[key] = value - if key is not None: - return self.target.configs.get(key, "") - return self.target.configs - - def log(self, s, *argv): - print s % argv - -class SSH(Context): - def __init__(self, m, target=None, name="demo", host="127.0.0.1", port=9090): - self.target = target or self - self.m = m - self.host = host - self.port = port - self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.socket.connect((host, port)) - msg = Message(m) - msg.detail("recv", "add", name, "worker") - self.sendDetail(msg, self.recvResult, self) - self.recvLoop() - - sendMM = {} - def sendDetail(self, msg, fun=None, obj=None): - msg.recvFun = fun - msg.recvObj = obj - self.sendMM[msg.code] = msg - self.socket.send("code: %s\n" % msg.code) - data = ["detail: %s" % urllib.quote(d) for d in msg.detail()] - for k, option in enumerate(msg.option()): - for i, v in enumerate(option): - data.append("%s: %s" % (urllib.quote(k) ,urllib.quote(v))) - data.append("\n") - self.socket.send("\n".join(data)) - msg.log("send: %s %s", msg.code, data) - - def recvResult(self, msg): - msg.log("echo: %s", msg.result()) - - def recvLoop(self): - m = self.m - self.file = self.socket.makefile() - - meta = {} - while True: - l = self.file.readline() - if l == "\n": - m.log("recv: %s %s", meta.get("remote_code"), meta) - if "detail" in meta: - msg = Message(m, self.target, remote_code=meta.get("remote_code"), meta=meta) - self.recvDetail(msg) - else: - msg = self.sendMM[int(meta.get("remote_code"))] - msg.meta.update(meta) - msg.recvFun and msg.recvFun(msg) - msg.recvObj and msg.recvObj.recvResult(msg) - meta = {} - continue - - v = l.rstrip("\n").split(": ") - if v[0] == "code": - meta["remote_code"] = v[1] - elif v[0] == "detail": - meta["detail"] = meta.get("detail", []) - meta["detail"].append(v[1]) - elif v[0] == "result": - meta["result"] = meta.get("result", []) - meta["result"].append(v[1]) - else: - if v[0] == "remote_code": - continue - if v[0] not in meta: - if "detail" in meta: - meta["option"] = meta.get("option", []) - meta["option"].append(v[0]) - else: - meta["append"] = meta.get("append", []) - meta["append"].append(v[0]) - meta[v[0]] = meta.get(v[0], []) - meta[v[0]].append(v[1]) - - def pwd(self, msg): - msg.echo("shaoying") - - def recvDetail(self, msg): - if hasattr(self.target, msg.detail(1)): - getattr(self.target, msg.detail(1))(msg) - self.sendResult(msg) - - def sendResult(self, msg): - self.socket.send("code: %s\n" % msg.remote_code) - data = ["result: %s" % urllib.quote(d) for d in msg.result()] - for i, k in enumerate(msg.append()): - for i, v in enumerate(msg.meta[k]): - data.append("%s: %s" % (urllib.quote(k) ,urllib.quote(v))) - data.append("\n") - self.socket.send("\n".join(data)) - msg.log("send: %s %s", msg.remote_code, data) - -try: - import RPi.GPIO as GPIO -except: - GPIO = Context() - pass - -class RPI(Context): - def __init__(self): - self.configs = { - "setmode": False, - } - - def gpio(self, msg, *argv): - if msg.detail(2) == "init": - GPIO.setmode(GPIO.BCM) - elif msg.detail(2) == "out": - if not msg.Conf("setmode"): - msg.log("default setmode") - msg.Conf("setmode", True) - GPIO.setmode(GPIO.BCM) - if msg.Conf(msg.detail(3)) != GPIO.OUT: - msg.log("default output") - msg.Conf(msg.detail(3), GPIO.OUT) - GPIO.setup(msg.detaili(3), GPIO.OUT) - GPIO.output(msg.detaili(3), msg.detaili(4)) - elif msg.detail(2) == "exit": - GPIO.cleanup() - -import sys -SSH(Message(), RPI(), - sys.argv[1] if len(sys.argv) > 1 else "demo", - sys.argv[2] if len(sys.argv) > 2 else "127.0.0.1") diff --git a/usr/librarys/can_frame.js b/usr/librarys/can_frame.js deleted file mode 120000 index dba602f3..00000000 --- a/usr/librarys/can_frame.js +++ /dev/null @@ -1 +0,0 @@ -../volcanos/frame.js \ No newline at end of file diff --git a/usr/librarys/can_order.js b/usr/librarys/can_order.js deleted file mode 120000 index 2943b727..00000000 --- a/usr/librarys/can_order.js +++ /dev/null @@ -1 +0,0 @@ -../volcanos/order.js \ No newline at end of file diff --git a/usr/librarys/can_proto.js b/usr/librarys/can_proto.js deleted file mode 120000 index 4ad890e0..00000000 --- a/usr/librarys/can_proto.js +++ /dev/null @@ -1 +0,0 @@ -../volcanos/proto.js \ No newline at end of file diff --git a/usr/librarys/chat.css b/usr/librarys/chat.css deleted file mode 100644 index 71d4b691..00000000 --- a/usr/librarys/chat.css +++ /dev/null @@ -1,75 +0,0 @@ -fieldset.Ocean div.create pre:hover { - background-color:red; -} -fieldset.Ocean div.create pre:hover { - background-color:red; -} - -fieldset.River { - float:left; -} -fieldset.River>div.output { - padding:0; -} -fieldset.River>div.output>div.item { - padding-left:6px; -} -fieldset.Target div.output div.item:hover { - background-color:lightgreen; -} -fieldset.Target>div.output>div.item { - padding-top:6px; - clear:both; -} -fieldset.Target>div.output>div.item>div.text { - padding:6px; - float:left; -} -fieldset.Target>div.output>div.item>div.time { - padding-left:5px; - font-size:10px; - color:gray; -} -fieldset.Target>div.output>div.item>div.user { - border-right:solid 1px green; - border-bottom:solid 1px green; - float:left; - padding:6px; -} -fieldset.Source { - overflow:hidden; -} -fieldset.Source div.action { - padding:0; -} -fieldset.Source div.output { - padding:0; -} -fieldset.Action div.output div.item:hover { - background-color:lightblue; -} -fieldset.Storm { - float:right; -} -fieldset.Storm>div.output { - padding:0; -} -fieldset.Storm>div.output>div.item { - padding-left:6px; -} - -fieldset.Steam table.device { - padding:10px; - border:solid 1px green; - margin-left:10px; - float:left; -} -fieldset.Steam div.output tr.select { - background-color:red; -} -fieldset.Steam div.create { - /* clear:both; */ -} -fieldset.Steam div.create pre:hover { - background-color:red; -} diff --git a/usr/librarys/chat.js b/usr/librarys/chat.js deleted file mode 100644 index 334dc4cc..00000000 --- a/usr/librarys/chat.js +++ /dev/null @@ -1,689 +0,0 @@ -var page = Page({ - conf: {refresh: 1000, border: 4, first: "工作", mobile: "工作", layout: {header:30, footer:30, river:100, storm:100, action:180, source:45}}, - onlayout: function(event, sizes) { - var page = this - var height = document.body.clientHeight-page.conf.border - var width = document.body.clientWidth-page.conf.border - kit.device.isWindows && (document.body.style.overflow = "hidden") - - sizes = sizes || {} - sizes.header == undefined && (sizes.header = page.header.clientHeight) - sizes.footer == undefined && (sizes.footer = page.footer.clientHeight) - page.header.Pane.Size(width, sizes.header) - page.footer.Pane.Size(width, sizes.footer) - height -= page.header.offsetHeight+page.footer.offsetHeight - - sizes.river == undefined && (sizes.river = page.river.clientWidth) - sizes.storm == undefined && (sizes.storm = page.storm.clientWidth) - page.river.Pane.Size(sizes.river, height) - page.storm.Pane.Size(sizes.storm, height) - width -= page.river.offsetWidth+page.storm.offsetWidth - - sizes.action == -1 && (sizes.action = kit.device.isMobile? "": height, sizes.target = 0, sizes.source = 0) - sizes.action == undefined && (sizes.action = page.action.offsetHeight-page.conf.border) - sizes.source == undefined && (sizes.source = page.source.clientHeight) - sizes.target == undefined && (sizes.target = page.target.clientHeight) - sizes.source == 0 && sizes.target == 0 && !kit.device.isMobile && (sizes.action = height) - page.action.Pane.Size(width, sizes.action) - page.source.Pane.Size(width, sizes.source) - height -= sizes.target==0? height: page.source.offsetHeight+page.action.offsetHeight - - page.target.Pane.Size(width, height) - }, - oncontrol: function(event) { - var page = this - if (event.ctrlKey) { - switch (event.key) { - case "0": - page.source.Pane.Select() - break - case "1": - case "2": - case "3": - case "4": - case "5": - case "6": - case "7": - case "8": - case "9": - page.action.Pane.Select(parseInt(event.key)) - break - case "n": - page.ocean.Pane.Show() - break - case "m": - page.steam.Pane.Show() - break - case "i": - page.storm.Pane.Next() - break - case "o": - page.storm.Pane.Prev() - break - case "b": - page.action.Action["最大"](event) - - } - } else { - switch (event.key) { - case " ": - page.footer.Pane.Select() - break - case "Escape": - page.dialog && page.dialog.Pane.Show() - break - } - } - }, - - Action: { - title: function(event, item, value, page) { - ctx.Search({"river": page.river.Pane.which.get(), "storm": page.storm.Pane.which.get(), "layout": page.action.Pane.Layout()}) - }, - user: function(event, item, value, page) { - page.carte.Pane.Show(event, shy({ - "修改昵称": function(event) { - var name = kit.prompt("new name") - name && page.login.Pane.Run(event, ["rename", name], function(msg) { - page.header.Pane.State("user", name) - }) - }, - "退出登录": function(event) { - kit.confirm("logout?") && page.login.Pane.Exit() - }, - }, ["修改昵称", "退出登录"], function(event, value, meta) { - meta[value](event) - })) - }, - get: function(event, item, value, page) { - page.toast.Pane.Show("" - + "export ctx_dev="+location.protocol+"//"+location.host+" && curl -s $ctx_dev/publish/auto.sh | sh -s" + "" - + "export ctx_dev="+location.protocol+"//"+location.host+" && curl -s $ctx_dev/publish/boot.sh | bash -s installs context" + "" - + "export ctx_dev="+location.protocol+"//"+location.host+" && bin/boot.sh" + "" - + "export ctx_dev="+location.protocol+"//"+location.host+" && bin/user.sh" + "" - + "export ctx_box="+location.protocol+"//"+location.host+" && bin/node.sh" + "" - , "Copy to ClipBorad!", 30000) - }, - - "工作": function(event, value) { - page.which.set(value) - page.onlayout(event, page.conf.layout) - page.onlayout(event, {river:0, action:-1}) - }, - "办公": function(event, value) { - page.which.set(value) - page.onlayout(event, page.conf.layout) - page.onlayout(event, {river: 0, action:300}) - }, - "聊天": function(event, value) { - page.which.set(value) - page.onlayout(event, page.conf.layout) - }, - "最高": function(event, value) { - page.which.set(value) - page.onlayout(event, {action: -1}) - }, - "最宽": function(event, value) { - page.which.set(value) - page.onlayout(event, {river:0, storm:0}) - }, - "最大": function(event, value) { - page.which.set(value) - page.onlayout(event, {header:0, footer:0, river:0, storm:0, action: -1}) - }, - }, - Button: shy({"title": "github.com/shylinux/context", "user": "", "time": "", "get": "下载"}, ["time", "user", "get"], function(key, value) {var meta = arguments.callee.meta - return kit.isNone(key)? meta: kit.isNone(value)? meta[key]: (meta[key] = value, page.header.Pane.Show()) - }), - Status: shy({title: 'shylinux@163.com', "ncmd": "0", "ntxt": "0"}, ["ncmd", "ntxt"], function(key, value) {var meta = arguments.callee.meta - return kit.isNone(key)? meta: kit.isNone(value)? meta[key]: (meta[key] = value, page.footer.Pane.Show()) - }), - - initOcean: function(page, field, option, output) { - if (ctx.Search("feature") != "") {return} - var table = kit.AppendChild(output, "table") - var ui = kit.AppendChild(field, [{view: ["create"], list: [ - {title: "群聊名称", input: ["name", function(event) { - page.oninput(event, function(event) { - switch (event.key) { - case "1": - case "2": - case "3": - case "4": - case "5": - case "6": - case "7": - case "8": - var tr = table.querySelectorAll("tr.normal")[parseInt(event.key)-1] - tr && tr.childNodes[0].click() - return true - case "9": - field.Pane.Action["全选"](event) - return true - case "0": - field.Pane.Action["清空"](event) - return true - - case "-": - var tr = ui.list.querySelectorAll("tr")[1] - tr && tr.childNodes[0].click() - return true - case "=": - var td = table.querySelector("tr.normal td") - td && td.click() - return true - } - }), event.key == "Enter" && this.nextSibling.click() - - }]}, {button: ["创建群聊", function(event) { - if (!ui.name.value) {ui.name.focus(); return} - - var list = kit.Selector(ui.list, "tr", function(item) { - return item.dataset.user - }) - if (list.length == 0) {kit.alert("请添加组员"); return} - - - field.Pane.Create(ui.name.value, list) - - }]}, {name: "list", view: ["list", "table"], list: [{text: ["2. 已选用户列表", "caption"]}]}, - ]}]) - return { - Append: function(msg) { - kit.AppendChilds(table, [{text: ["1. 选择用户节点 ->", "caption"]}]) - kit.AppendTable(table, msg.Table(), ["key", "user.route"], function(value, key, row, i, tr, event) { - tr.className = "hidden" - var uis = kit.AppendChild(ui.list, [{row: [row.key, row["user.route"]], dataset: {user: row.key}, click: function(event) { - tr.className = "normal", uis.last.parentNode.removeChild(uis.last) - }}]) - }) - }, - Create: function(name, list) { - field.Pane.Run(event, ["spawn", "", name].concat(list), function(msg) { - field.Pane.Show(), page.river.Pane.Show(name) - }) - }, - Show: function(name) {var pane = field.Pane - if (ctx.Search("feature") != "") {return} - pane.Dialog(), ui.name.focus(), ui.name.value = name||"good", pane.Run(event, [], pane.Append) - }, - Action: { - "取消": function(event) {field.Pane.Show()}, - "清空": function(event) { - kit.Selector(ui.list, "tr", function(item) {item.click()}) - }, - "全选": function(event) { - kit.Selector(table, "tr.normal", function(item) {item.firstChild.click()}) - }, - }, - Button: ["取消", "清空", "全选"], - } - }, - initRiver: function(page, field, option, output) { - return { - Show: function(which) {var pane = field.Pane - if (ctx.Search("feature") != "") {return} - - pane.Event(event, {}, {name: pane.Zone("show", page.who.get())}) - output.innerHTML = "", pane.Appends([], "text", ["nick", "count"], "key", which||ctx.Search("river")||true, function(event, line) { - page.title(line.nick) - }) - }, - Action: { - "创建": function(event) { - page.ocean.Pane.Show() - }, - "共享": function(event) { - page.login.Pane.Run(event, ["relay", "river", "username", kit.prompt("分享给用户"), "url", ctx.Share({ - "river": page.river.Pane.which.get(), - "layout": page.action.Pane.Layout(), - })], function(msg) { - page.toast.Pane.Show({text: location.origin+location.pathname+"?relay="+msg.result.join(""), title: "共享链接", button: ["确定"], cb: function(which) { - page.toast.Pane.Show() - }}) - }) - }, - }, - // Button: ["创建", "共享"], - // Choice: ["创建", "共享"], - } - }, - initTarget: function(page, field, option, output) { - var river = "", which = {} - output.DisplayUser = true - output.DisplayTime = true - return { - Send: function(type, text, cb) {var pane = field.Pane - pane.Run(event, [river, "flow", type, text], function(msg) { - pane.Show(), typeof cb == "function" && cb(msg) - }) - }, - Stop: function() { - return field.style.display == "none" - }, - Show: function(i) {var pane = field.Pane - field.Pane.Load(river, output) - - var foot = page.footer.Pane, cmds = [river, "brow", i||which[river]||0] - cmds[2] || (output.innerHTML = ""), pane.Tickers(page.conf.refresh, cmds, function(line, index, msg) { - pane.Append("", line, ["text"], "index") - page.Status("ntxt", which[river] = cmds[2] = parseInt(line.index)+1) - }) - }, - Listen: { - river: function(value, old) { - field.Pane.Save(river, output) - river = value, field.Pane.Show() - }, - }, - Choice: [ - ["layout", "工作", "聊天", "最高"], - ], - } - }, - initSource: function(page, field, option, output) { - var ui = kit.AppendChild(field, [{"view": ["input", "textarea"], "data": {"onkeyup": function(event){ - page.oninput(event), kit.isSpace(event.key) && field.Pane.which.set(event.target.value) - event.key == "Enter" && !event.shiftKey && page.target.Pane.Send("text", event.target.value, field.Pane.clear) - event.stopPropagation() - }, "onkeydown": function(event) { - event.key == "Enter" && !event.shiftKey - event.stopPropagation() - }}}]) - return { - Select: function() { - ui.first.focus() - }, - clear: function(value) { - ui.first.value = "" - }, - Size: function(width, height) { - if (width > 0) { - field.style.width = width+"px" - ui.first.style.width = (width-7)+"px" - field.style.display = "block" - } else if (width === "") { - field.style.width = "" - field.style.display = "block" - } else { - field.style.display = "none" - return - } - - if (height > 0) { - field.style.height = height+"px" - ui.first.style.height = (height-7)+"px" - field.style.display = "block" - } else if (height === "") { - field.style.height = "" - field.style.display = "block" - } else { - field.style.display = "none" - return - } - }, - } - }, - initAction: function(page, field, option, output) { - if (ctx.Search("feature") != "") {return} - var river = "", storm = 0, input = "", share = "" - var temp = "" - var you = "" - output.DisplayRaw = true - page.Sync("plugin_you").change(function(value) { - page.title(value) - kit.Selector(field, "div.action>input.you", function(item) { - item.value = value - }) - }) - page.Sync("plugin_pod").change(function(value) { - kit.Selector(field, "div.action>input.pod", function(item) { - item.value = value - }) - }) - return { - Show: function() {var pane = field.Pane - if (river && storm && field.Pane.Load(river+"."+storm, output)) {return} - - var msg = pane.Event(event, {}, {name: pane.Zone("show", river, storm)}) - msg.Option("you", you) - output.innerHTML = "", pane.Appends([river, storm], "plugin", ["name", "help"], "name", true, null, function() { - }) - }, - Layout: function(name) {var pane = field.Pane - var layout = field.querySelector("select.layout") - name && page.Action[layout.value = name](window.event, layout.value) - return layout.value - }, - Listen: { - plugin_you: function(value, old) {you = value}, - river: function(value, old) {temp = value}, - storm: function(value, old) { - river && storm && field.Pane.Save(river+"."+storm, output) - ;(river = page.river.Pane.which.get(), storm = value) && field.Pane.Show(river, storm) - }, - source: function(value, old) {input = value}, - target: function(value, old) {share = value}, - }, - Option: { - }, - Action: { - "刷新": function(event, value) { - output.innerHTML = "", field.Pane.Show() - }, - "清屏": function(event, value) { - kit.Selector(output, "fieldset>div.output", function(item) { - item.innerHTML = "" - }) - }, - "并行": function(event, value) { - kit.Selector(output, "fieldset", function(item) { - item.Plugin.Runs(event) - }) - }, - "串行": function(event, value) { - var list = kit.Selector(output, "fieldset") - function run(list) { - list.length > 0? list[0].Plugin.Runs(event, function() { - field.Pane.Conf("running", true), setTimeout(function() { - run(list.slice(1)) - }, 100) - }): field.Pane.Conf("running", false) - } - run(list) - }, - - "表格": function(event, value) { - page.plugin && page.plugin.Plugin.onfigure("table") - }, - "编辑": function(event, value) { - page.plugin && page.plugin.Plugin.onfigure("editor") - }, - "绘图": function(event, value) { - page.plugin && page.plugin.Plugin.onfigure("canvas") - }, - "视频": function(event, value) { - page.plugin && page.plugin.Plugin.onfigure("video") - }, - "音频": function(event, value) { - page.plugin && page.plugin.Plugin.onfigure("audio") - }, - "相册": function(event, value) { - page.plugin && page.plugin.Plugin.onfigure("album") - }, - "媒体": function(event, value) { - page.plugin && page.plugin.Plugin.onfigure("media") - }, - - "复制": function(event, value) { - page.plugin && page.plugin.Plugin.Clone() - }, - "删除": function(event, value) { - page.plugin && page.plugin.Plugin.Delete() - }, - "加参": function(event, value) { - page.plugin && page.plugin.Plugin.Appends() - }, - "减参": function(event, value) { - page.plugin && page.plugin.Plugin.Remove() - }, - "执行": function(event, value) { - page.plugin && page.plugin.Plugin.Check() - }, - "下载": function(event, value) { - page.plugin && page.plugin.Plugin.Download() - }, - "清空": function(event, value) { - page.plugin && page.plugin.Plugin.clear() - }, - "返回": function(event, value) { - page.plugin && page.plugin.Plugin.Last() - }, - "调试": function(event, value) { - page.debug.Pane.Show() - }, - option: function(event, value) { - console.log(event, value) - }, - refresh: function(event, value) { - console.log(event, value) - }, - }, - Button: [["layout", "工作", "办公", "聊天", "最高", "最宽", "最大"], - "", "刷新", "清屏", "并行", "串行", - "", ["display", "表格", "编辑", "绘图", "媒体"], - "", "复制", "删除", "加参", "减参", - "", "执行", "下载", "清空", "返回", - "", kit.CreateMeta("input", "pod"), - "", kit.CreateMeta("input", "you"), - ], - Choice: [ - ["layout", "工作", "聊天", "最高"], - "", "刷新", "清屏", "并行", "串行", "调试", - ], - } - }, - initStorm: function(page, field, option, output) {var river = "" - var you = "" - return { - Show: function(which) {var pane = field.Pane - var data = river && field.Pane.Load(river, output) - if (data) {return pane.which.set(data.which)} - - pane.Event(event, {}, {name: pane.Zone("show", river)}) - output.innerHTML = "", pane.Appends([river], "text", ["key", "count"], "key", which||ctx.Search("storm")||true, null) - }, - Listen: { - plugin_you: function(value, old) {you = value}, - river: function(value, old) {var pane = field.Pane - river && pane.Save(river, output, {which: pane.which.get()}) - river = value, pane.which.set(""), pane.Show() - }, - }, - Action: { - "删除": function(event, value, meta, line) {var pane = field.Pane - kit.confirm("删除") && pane.Run(event, [river, "delete", line.key], function(msg) { - field.Pane.Show() - }) - }, - "共享": function(event, value, meta, line) { - var user = kit.prompt("分享给用户") - if (user == null) {return} - - page.login.Pane.Run(event, ["relay", "storm", "username", user, "url", ctx.Share({ - "river": page.river.Pane.which.get(), - "storm": line.key, - "layout": page.action.Pane.Layout(), - })], function(msg) { - var url = location.origin+location.pathname+"?relay="+msg.result.join("") - page.toast.Pane.Show({text: "", height: 320, width: 320, title: url, button: ["确定"], cb: function(which) { - page.toast.Pane.Show() - }}) - }) - }, - "复制": function(event, value, meta, line) {var pane = field.Pane - var name = kit.prompt("名称") - name && pane.Run(event, [river, "clone", name, line.key], function(msg) { - field.Pane.Show(name) - }) - }, - "恢复": function(event, value, meta, line) {var pane = field.Pane - field.Pane.Run(event, [river, "load", pane.which.get(), you], function(msg) { - if (!msg.status || msg.status.length == 0) {return} - var status = JSON.parse(msg.status[0]) - kit.Selector(page.action, "fieldset.item", function(field, index) { - var args = status[index].args - args = args.slice(kit.Selector(field, ".args", function(input, index) { - return input.value = args[index]||"" - }).length) - - kit.List(args, function(arg) { - field.Plugin.Append({type: "text"}, "", arg) - }) - }) - }) - }, - "保存": function(event, value, meta, line) {var pane = field.Pane - field.Pane.Run(event, [river, "save", pane.which.get(), you, - line.status=JSON.stringify(kit.Selector(page.action, "fieldset.item", function(field) { - return {name: field.Meta.name, args: kit.Selector(field, ".args", function(input) { - return input.value - })} - })), JSON.stringify(kit.Selector(page.action, "fieldset.item", function(field) { - return {group: field.Meta.group, index: field.Meta.index, name: field.Meta.name, node: field.Meta.node} - }))], function(msg) { - page.toast.Pane.Show("保存成功", you) - }) - }, - "创建": function(event) { - page.steam.Pane.Show() - }, - "刷新": function(event) {var pane = field.Pane - pane.Save(""), field.Pane.Show() - }, - }, - // Button: ["刷新", "创建"], - // Choice: ["刷新", "创建"], - // Detail: ["恢复", "保存", "复制", "共享", "删除"], - } - }, - initSteam: function(page, field, option, output) { - if (ctx.Search("feature") != "") {return} - var table = kit.AppendChild(output, "table") - var device = kit.AppendChild(field, [{"view": ["device", "table"]}]).last - var ui = kit.AppendChild(field, [{view: ["create"], list: [ - {title: "应用名称", input: ["name", function(event) { - page.oninput(event, function(event) { - switch (event.key) { - case "1": - case "2": - case "3": - case "4": - case "5": - case "6": - case "7": - case "8": - var tr = device.querySelectorAll("tr.normal")[parseInt(event.key)-1] - tr && tr.childNodes[0].click() - return true - case "9": - field.Pane.Action["全选"](event) - return true - case "0": - field.Pane.Action["清空"](event) - return true - - case "-": - var tr = ui.list.querySelectorAll("tr")[1] - tr && tr.childNodes[0].click() - return true - case "=": - var td = device.querySelector("tr.normal td") - td && td.click() - return true - - case "i": - var prev = table.querySelector("tr.select").previousSibling - prev && prev.childNodes[0].click() - return true - case "o": - var next = table.querySelector("tr.select").nextSibling - next && next.childNodes[0].click() - return true - } - }), event.key == "Enter" && this.nextSibling.click() - - }]}, {button: ["创建应用", function(event) { - if (!ui.name.value) {ui.name.focus(); return} - - var list = [] - kit.Selector(ui.list, "tr", function(item) { - list.push(item.dataset.pod) - list.push(item.dataset.group) - list.push(item.dataset.index) - list.push(item.dataset.name) - }) - - field.Pane.Create(ui.name.value, list) - - }]}, {name: "list", view: ["list", "table"], list: [{text: ["3. 已选命令列表", "caption"]}]}, - ]}]) - - var river = "", user = "", node = "" - return { - Select: function(com, pod) {var pane = field.Pane - var last = kit.AppendChild(ui.list, [{ - dataset: {pod: pod.node, group: com.key, index: com.index, name: com.name}, - row: [com.key, com.index, com.name, com.help], - click: function(event) {last.parentNode.removeChild(last)}, - }]).last - }, - Appends: function(list, pod) {var pane = field.Pane - kit.AppendChilds(device, [{text: ["2. 选择模块命令 ->", "caption"]}]) - kit.AppendTable(device, list, ["key", "index", "name", "help"], function(value, key, com, i, tr, event) { - pane.Select(com, pod) - }, function(value, key, com, i, tr, event) { - page.carte.Pane.Show(event, shy(pane.Action, pane.Detail, function(event, item, meta) { - meta[item](event, value, key, com) - })) - }) - }, - Append: function(msg) {var pane = field.Pane - kit.AppendChilds(table, [{text: ["1. 选择用户节点 ->", "caption"]}]) - kit.AppendTable(table, msg.Table(), ["user", "node"], function(value, key, pod, i, tr, event) { - pane.Event(event, {}, {name: pane.Zone("show", river, pod.user, pod.node)}) - kit.Selector(table, "tr.select", function(item) {item.className = "normal"}) - - node && field.Pane.Save(river+"."+user+"."+node, device) - user = pod.user, node = pod.node, tr.className = "select" - if (field.Pane.Load(river+"."+user+"."+node, device)) {return} - - pane.Run(event, [river, pod.user, pod.node], function(msg) { - pane.Appends(msg.Table(), pod) - }) - }), table.querySelector("td").click() - }, - Create: function(name, list) { - field.Pane.Run(event, [river, "spawn", name].concat(list||[]), function(msg) { - field.Pane.Show(), page.storm.Pane.Show(name) - }) - }, - Show: function(name) {var pane = field.Pane - pane.Event(event, {}, {name: pane.Zone("show", river)}) - pane.Dialog(), ui.name.focus(), ui.name.value = name||"nice", pane.Run(event, [river], pane.Append) - }, - Listen: { - river: function(value, old) {river = value}, - }, - Action: { - "取消": function(event) {field.Pane.Show()}, - "清空": function(event) { - kit.Selector(ui.list, "tr", function(item) {item.click()}) - }, - "全选": function(event) { - kit.Selector(device, "tr.normal", function(item) {item.firstChild.click()}) - }, - "刷新": function(event) { - field.Pane.Save(""), field.Pane.Show(), field.Pane.Show() - }, - "创建": function(event, value, key, line) { - field.Pane.Create(line.key) - }, - }, - Button: ["取消", "清空", "全选", "刷新"], - Choice: ["取消", "清空", "全选", "刷新"], - Detail: ["创建"], - } - }, - init: function(page) { - page.Action[ctx.Search("layout") || (kit.device.isMobile? page.conf.first: page.conf.mobile)]() - page.river.Pane.Show() - page.WSS() - var update = function() { - page.Button("time", kit.time("", "%H:%M:%S")) - setTimeout(update, 1000) - } - setTimeout(update, 1) - }, -}) - diff --git a/usr/librarys/code.css b/usr/librarys/code.css deleted file mode 100644 index c814401d..00000000 --- a/usr/librarys/code.css +++ /dev/null @@ -1,85 +0,0 @@ -/* ----- common ----- */ - fieldset { - margin-top:8px; - } - fieldset legend { - font-size:16px; - font-weight:bold; - font-family:monospace; - } - fieldset form.option div { - float:left; - } - fieldset form.option input { - margin-right:10px; - } - fieldset form.option input.cmd { - color:white; - background-color:#272822; - padding-left:10px; - width:600px; - } - fieldset form.option select { - margin-right:10px; - } - fieldset form.option hr { - clear:both; - } - - fieldset code.result pre.clipboard { - height:2em; - } -/* ----- FlashList ----- */ - fieldset.FlashList { - } - - fieldset.FlashList div.detail { - border:ridge 2px green; - border-bottom:0px; - margin-top:20px; - padding:5px; - } - fieldset.FlashList div.action { - border:ridge 2px green; - border-top:0px; - border-bottom:0px; - } - fieldset.FlashList code.output pre { - border:ridge 2px green; - margin:0px; - padding:5px; - border-top: 0px; - } -/* ----- KitList ----- */ - fieldset.KitList { - color:#e6dd37; - font-size:14px; - font-family:monospace; - background-color:#498bb1a8; - border:solid 3px red; - width:60px; - height:20px; - overflow:scroll; - position:fixed; - } - fieldset.KitList div:hover, fieldset.KitList li li:hover { - background-color:red; - } - fieldset.KitList div.stick, fieldset.KitList li li.stick { - background-color:red; - } - fieldset.KitList li>label.result{ - background-color:rgba(0,0,0,0.2); - padding:0 5px; - border:2px solid green; - margin-left: 10px; - } - fieldset.KitList li>input { - background-color:rgba(0,0,0,0.2); - } -/* ----- ScheduleList ----- */ - fieldset.ScheduleList table.append td { - max-width:240px; - min-width:100px; - } - diff --git a/usr/librarys/code.js b/usr/librarys/code.js deleted file mode 100644 index 9d9f3b1d..00000000 --- a/usr/librarys/code.js +++ /dev/null @@ -1,4 +0,0 @@ -page({ - init: function() { - }, -}) diff --git a/usr/librarys/context.js b/usr/librarys/context.js deleted file mode 100644 index ed1aeb22..00000000 --- a/usr/librarys/context.js +++ /dev/null @@ -1,200 +0,0 @@ -ctx = context = (function(kit) {var ctx = {__proto__: kit, - Run: shy("请求后端", {order: 0}, function(event, dataset, cmd, cb) { - var msg = ctx.Event(event) - - var option = {"cmds": cmd} - msg.option && msg.option.forEach(function(item) { - msg[item] && (option[item] = msg[item]) - }) - for (var k in dataset) { - option[k] = dataset[k].split(",") - } - - var what = ++arguments.callee.meta.order - - msg.option = [] - for (var k in option) { - msg.option.push(k) - msg[k] = option[k] - } - msg.detail = ["run", what].concat(option.group).concat(option.names).concat(option.cmds) - kit.Log(msg.detail.concat([msg])) - - kit.History("run", -1, option) - this.POST("", option, function(msg) { - kit.Log("run", what, "result", msg.result? msg.result[0]: "", msg) - typeof cb == "function" && cb(msg) - }, msg), delete(event.msg) - }), - Event: shy("封装事件", {order: 0}, function(event, msg, proto) { - if (event.msg && !msg) {return event.msg} - - event.msg = msg = msg || {}, proto = proto || {}, msg.__proto__ = proto, proto.__proto__ = { - Copy: function(res) { - res.result && (msg.result = res.result) - res.append && (msg.append = res.append) && res.append.forEach(function(item) { - res[item] && (msg[item] = res[item]) - }) - return msg - }, - Push: function(key, value) {msg.append = msg.append || [] - msg[key]? msg[key].push(value): (msg[key] = [value], msg.append.push(key)) - return msg - }, - Echo: function(res) { - kit.notNone(res) && (msg.result = (msg.result || []).concat(kit._call(kit.List, arguments))) - return msg - }, - Format: function() { - return msg.append && msg.append[0]? ["table", JSON.stringify(msg.Table())]: ["code", msg.result? msg.result.join(""): ""] - }, - Option: function(key, val) { - if (val == undefined) {return msg[key]} - msg.option = msg.option || [] - kit.List(msg.option, function(k) { - if (k == key) {return k} - }).length > 0 || msg.option.push(key) - msg[key] = kit.List(arguments).slice(1) - }, - Result: function() {return msg.result? msg.result.join(""): ""}, - Results: function() {return kit.Color(msg.Result().replace(//g, ">"))}, - Table: function(cb) {if (!msg.append || !msg.append.length || !msg[msg.append[0]]) {return} - var max = "", len = 0 - kit.List(msg.append, function(key, index) { - if (msg[key].length > len) { - max = key, len = msg[key].length - } - }) - - return kit.List(msg[max], function(value, index, array) {var one = {} - msg.append.forEach(function(key) {one[key] = msg[key][index]||""}) - return kit._call(cb, [one, index, array]) - }) - }, - }, msg.event = event - - kit.Log("event", ++arguments.callee.meta.order, event.type, (proto.name||[document.title]).join("."), msg) - return msg - }), - Share: shy("共享链接", function(objs, clear) {var obj = objs || {} - !clear && kit.Item(this.Search(), function(key, value) {obj[key] || (obj[key] = value)}) - return location.origin+location.pathname+(objs? "?"+kit.Item(obj, function(key, value) { - return kit.List(value, function(value) {return key+"="+encodeURIComponent(value)}).join("&") - }).join("&"): "") - }), - - Search: shy("请求变量", function(key, value) {var args = {} - location.search && location.search.slice(1).split("&").forEach(function(item) {var x = item.split("=") - x[1] != "" && (args[x[0]] = decodeURIComponent(x[1])) - }) - - if (typeof key == "object") { - kit.Item(key, function(key, value) { - if (kit.notNone(value)) {args[key] = value} - }) - } else if (kit.isNone(key)) { - return args - } else if (kit.isNone(value)) { - return args[key] || ctx.Cookie(key) - } else { - args[key] = value - } - - return location.search = kit.Item(args, function(key, value) { - return key+"="+encodeURIComponent(value) - }).join("&") - }), - Cookie: shy("会话变量", function(key, value, path) { - function set(k, v) {document.cookie = k+"="+v+";path="+(path||"/")} - - if (typeof key == "object") { - for (var k in key) {set(k, key[k])} - key = null - } - if (kit.isNone(key)) {var cs = {} - document.cookie.split("; ").forEach(function(item) { - var cookie = item.split("=") - cs[cookie[0]] = cookie[1] - }) - return cs - } - - kit.notNone(value) && set(key, value) - var result = (new RegExp(key+"=([^;]*);?")).exec(document.cookie) - return result && result.length > 0? result[1]: "" - }), - Upload: shy("上传文件", function(form, file, cb, detail) { - var data = new FormData() - for (var k in form) {data.append(k, form[k])} - data.append("upload", file) - - var xhr = new XMLHttpRequest() - xhr.onreadystatechange = function() { - if (xhr.readyState != 4) {return} - if (xhr.status != 200) {return} - } - xhr.upload.onprogress = function(event) {kit._call(detail, [event])} - xhr.onload = function(event) {kit._call(cb, [event, ctx.Event(event, JSON.parse(xhr.responseText||'{"result":[]}'), {name: [document.title]})])} - xhr.open("POST", "/upload", true) - xhr.send(data) - }), - POST: shy("请求后端", {order: 0}, function(url, form, cb, msg) { - var args = kit.Items(form, function(value, index, key) { - return key+"="+encodeURIComponent(value) - }) - - var xhr = new XMLHttpRequest() - xhr.onreadystatechange = function() { - if (xhr.readyState != 4) {return} - if (xhr.status != 200) {return} - - try { - var res = JSON.parse(xhr.responseText||'[{"result":[]}]') - res.length > 0 && res[0] && (res = res[0]) - - if (res.download_file) { - window.open(res.download_file.join("")) - } else if (res.page_redirect) { - location.href = res.page_redirect.join("") - } else if (res.page_refresh) { - location.reload() - } - } catch (e) { - var res = {"result": [xhr.responseText]} - } - - typeof cb == "function" && cb(msg.Copy(res)) - } - - xhr.open("POST", url) - xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded") - xhr.setRequestHeader("Accept", "application/json") - xhr.send(args.join("&")) - ++arguments.callee.meta.order - }), - WSS: shy("响应后端", {order: 0, wssid: ""}, function(cb, onerror, onclose, onopen) {var meta = arguments.callee.meta - var s = new WebSocket(location.protocol.replace("http", "ws")+"//"+location.host+"/wss?wssid="+meta.wssid) - s.onerror = onerror, s.onclose = onclose, s.onopen = onopen - s.onmessage = function(event) {var order = ++meta.order - try { - var msg = JSON.parse(event.data||'{}') - } catch (e) { - var msg = {"result": [event.data]} - } - - // Event入口 -1.0 - msg = ctx.Event(event, msg, {name: [document.title, "wss", msg.detail[0]], Order: order, Reply: function(msg) { - kit.Log(["wss", order, "result"].concat(msg.result).concat([msg])) - delete(msg.event), s.send(JSON.stringify(msg)) - }}) - - try { - kit.Log(["wss", order].concat(msg.detail).concat([msg])) - kit._call(cb, [event, msg]) - } catch (e) { - msg.Reply(kit.Log("err", e)) - } - } - return s - }), -}; return ctx})(kit) diff --git a/usr/librarys/example.css b/usr/librarys/example.css deleted file mode 100644 index 397febdf..00000000 --- a/usr/librarys/example.css +++ /dev/null @@ -1,513 +0,0 @@ -html, body { - background-color:#d8d8d8; - padding:0px; - height:100%; - width:100%; - margin:0px; -} -fieldset { - position:relative; - background-color:#d8d8d8; - padding:0px; - min-width:10px; - overflow:auto; - margin:0px; -} -legend { - margin-left:10px; -} - -.hidden { - display:none; -} -.normal { -} -.choice { -} -.select { -} - -fieldset>form.option { - padding:0 5px; - margin-right:3px; - float:left; -} -fieldset>form.option div { - margin-right:3px; - float:left; -} -fieldset>form.option div.hide { - display:none; -} -fieldset>form.option div.clear { - clear:both; -} -fieldset>form.option label { - margin-right:3px; -} -fieldset>form.option input.args.cmd { - color:white; - background-color: black; - width:160px; -} -fieldset>form.option input.args.char { - width:20px; -} -fieldset>form.option input.args.tiny { - width:40px; -} -fieldset>form.option input.args { - width:80px; -} -fieldset>form.option input.args.long { - width:240px; -} -fieldset>form.option input.args.full { - width:480px; -} -fieldset>form.option div.item.textarea { - float:left; - clear:both; -} -fieldset>div.action { - padding:6px; -} -fieldset>div.action div.space { - display:inline-block; - width:10px; -} -fieldset>div.output { - clear:both; - /* max-height:800px; */ - padding:5px; -} -fieldset>div.output div.item { - padding:2px; -} -fieldset>div.output div.item:hover { - cursor:pointer; - background-color:red; - border:ridge 2px yellow; -} -fieldset>div.output div.item.select { - background-color:red; - border:ridge 2px yellow; -} -fieldset>div.output div.code { - color:white; - font-size:14px; - font-family:monospace; - background-color:#272822; - white-space:pre; - padding:10px; - overflow:auto; - border:solid 3px green; - max-height:640px; -} -fieldset>div.output div.code span.red { - color:red; -} -fieldset>div.output div.code span.green { - color:green; -} -fieldset>div.output table td { - /* word-break:break-word; */ -} -fieldset>div.output table td.when { - /* word-break:break-word; */ - text-align:center; -} -fieldset>div.output table.edit { -} -fieldset>div.output table.edit td { - min-width:4px; - padding:0px; -} -fieldset>div.output table.edit td>input { - width:600px; - padding:0px; -} -fieldset>div.output table.edit { -} -fieldset>div.Help { - position:absolute; - width:calc(100% - 4px); - height:calc(100% - 4px); - left:0px; - top:0px; -} -fieldset>div.Help>div { - color:blue; - opacity:0.7; - background-color:cyan; - border:solid 2px red; - overflow:auto; -} - -fieldset.dialog { - background-color:lightgray; - padding:10px; - display:none; - position:absolute; - z-index:10; -} -fieldset.dialog>div.output { - padding:10px; - float:left; -} -fieldset.dialog>div.output table th { - min-width:130px; -} -fieldset.dialog>div.output table td { - min-width:100px; -} -fieldset.dialog>div.create { - padding:10px; - border:solid 1px red; - margin-left:10px; - float:left; -} -fieldset.dialog>div.create table { - min-width:240px; -} - -fieldset.dialog.Favor { - border:solid 2px red; - background-color:rgba(100,100,100,0.8); - position:absolute; - display:none; - z-index:100; -} -fieldset.dialog.Favor input.cmd { - color:white; - font-size:16px; - font-weight:bold; - font-family:monospace; - background-color:black; - border:solid 1px white; - padding:4px; - width:383px; -} -fieldset.dialog.Favor div.output { - color:white; - white-space:pre; - max-height: 200px; - overflow:auto; - width:383px; -} - -fieldset.dialog.Toast { - border:solid 2px red; - background-color:#ffffff; - position:absolute; - display:none; - z-index:200; -} -fieldset.dialog.Toast>div.action { - padding:0 0px; -} -fieldset.dialog.Toast>div.output { - padding:0 10px; - text-align:center; -} -fieldset.dialog.Toast>div.output>div.title { - font-size:12px; - text-align:center; - color:gray; -} -fieldset.dialog.Toast>div.output>div.content { - word-break:break-word; - white-space:pre-wrap; - text-align:center; - margin:0px; - padding:2px; - font-size:16px; -} -fieldset.dialog.Toast>div.output>div.tick { - font-size:12px; - color:gray; -} -fieldset.dialog.Carte { - padding:0; - border:solid 2px red; - background-color:greenyellow; - position:absolute; - display:none; - z-index:200; -} -fieldset.dialog.Carte>div.action { - padding:0; -} -fieldset.dialog.Carte>div.output { - padding:0; -} -fieldset.dialog.Carte>div.output button { - display:block; -} -fieldset.dialog.Carte>div.output select { - display:block; -} -fieldset.dialog.Carte>div.output div.layout>div { - float:left; -} -fieldset.dialog.Carte>div.output div.item { - padding:0px 6px; -} -fieldset.dialog.Carte>div.output div.space { - border:solid 1px gray; - margin-top:8px; - clear:both; -} -fieldset.dialog.Debug { - opacity:0.8; -} -fieldset.dialog.Debug tr.hide { - display:none; -} -fieldset.dialog.Debug tr.event { - background-color:red; -} -fieldset.dialog.Debug tr.run { - background-color:lightgreen; -} -fieldset.dialog.Debug tr.wss { - background-color:lightblue; -} -fieldset.dialog.Debug tr.key { - background-color:lightyellow; -} -fieldset.dialog.Debug>div.output { - overflow:auto; - margin-top:50px; -} -fieldset.dialog.Debug>div.output table caption { - position:absolute; - top:50px; - left:20px; -} -fieldset.dialog.Debug>div.output table thead { - position:absolute; - top:72px; - left:18px; -} -fieldset.dialog.Debug>div.output table thead th { - border:solid 1px red; -} -fieldset.dialog.Debug>div.output table caption>span { - margin-right:4px; -} -fieldset.dialog.Debug>div.output table caption>span:hover { - cursor:pointer; - background-color:red; -} -fieldset.dialog.Debug>div.output table th { - min-width:60px; -} -fieldset.dialog.Debug>div.output table td { - min-width:60px; -} - -fieldset.Login { - font-size:28px; - z-index:20; -} -fieldset.Login>form.option input { - font-size:18px; - height:28px; -} -fieldset.Login>form.option button { - font-size:18px; - height:28px; -} -fieldset.Header { - height:32px; - min-width:640px; - clear:both; -} -fieldset.Header>div.action { - padding:0; -} -fieldset.Header>div.output>div.title { - cursor:pointer; - float:left; -} -fieldset.Header>div.output>div.title:hover { - cursor:pointer; - background-color:red; - border:ridge 2px yellow; -} -fieldset.Header>div.output>div.state { - float:right; -} -fieldset.Header>div.output>div.state div.item { - padding:0; -} -fieldset.Header>div.output>div.state>div { - cursor:pointer; - margin-left:5px; - float:right; -} -fieldset.Header>div.output>div.state>div:hover { - background-color:red; -} -fieldset.Footer { - clear:both; - overflow:hidden; - height:32px; -} -fieldset.Footer>div.action { - padding:0; -} -fieldset.Footer>div.output div.title { - float:left; -} -fieldset.Footer>div.output div.magic { - float:right; - margin-top:-6px; -} -fieldset.Footer>div.output div.magic>label { - margin-right:2px; -} -fieldset.Footer>div.output div.magic>input { - background-color:black; - color:lightgreen;; -} -fieldset.Footer>div.output div.state { - float:right; -} -fieldset.Footer>div.output div.state div { - float:right; -} - -fieldset.item { - float:left; -} -fieldset.item:hover { - background-color:gold; - border:ridge 2px red; -} -fieldset.item.select { - background-color:gold; - border:ridge 2px red; -} -fieldset.item>form.option>div.item { - padding:0; - border:0; -} -fieldset.item>form.option>div.item:hover { - border:0; -} -fieldset.item>form.option>div.item.select { - border:0; -} -fieldset.item>div.output { - overflow:auto; -} -fieldset.item>div.output>canvas { - background-color:#8dd09e; -} -fieldset.item>div.output>div.action>button.trap { - background-color:lightblue; - border:2px blue solid; -} -fieldset.item>div.output>div.action>div.space { - width:10px; - display:inline-block; -} -fieldset.item>div.output>div.status>div { - float:left; - height:20px; - border:1px solid black; -} -fieldset.item>div.output>div.status>input.cmd { - float:left; - background-color:black; - color:lightgreen;; - font-size:16px; - width:250px; -} - -fieldset table { - font-size:14px; - overflow: auto; - border:solid 1px green; -} -fieldset table caption { - font-size:18px; - font-style:italic; - border:solid 1px green; -} -fieldset table tbody { - overflow:auto; -} -fieldset table tr:hover { - background-color:lightgreen; -} -fieldset table tr.select { - background-color:lightgreen; -} -fieldset table th { - font-family:monospace; - background-color:lightgreen; - cursor:pointer; - padding: 0 6px; -} -fieldset table th.order { - background-color:red; - cursor:pointer; -} -fieldset table td { - max-width:1200px; - font-family:monospace; - padding: 0 6px; - /* white-space: pre; */ -} -fieldset table td.clip { - background-color:red; -} -fieldset table td:hover { - background-color:red; -} -fieldset table td.select { - background-color:red; -} -fieldset pre code, fieldset code pre { - color:white; - font-size:14px; - background-color:#272822; - overflow:auto; - padding:5px; - border:solid 2px green; - border-left:solid 4px green; - display:block; -} - -fieldset.item>div.output>code.div { -} - -fieldset.item>div.output>div.code div.number { - float:left; -} - -fieldset ul.story li:hover { - background-color:red; -} -fieldset div.output div.story { - font-family:monospace; - font-size:16px; - white-space:pre; - padding:16px; - border:solid 2px green; -} - -fieldset.item div.output div.story.code { - color:white; - font-size:14px; - font-family:monospace; - background-color:#272822; - white-space:pre; - padding:10px; - overflow:auto; - border:solid 3px green; - max-height:640px; -} diff --git a/usr/librarys/example.js b/usr/librarys/example.js deleted file mode 100644 index b1676332..00000000 --- a/usr/librarys/example.js +++ /dev/null @@ -1,1714 +0,0 @@ -function Meta(zone, target, obj) { - // 级连对象 - var a = obj - for (var i = 3; i < arguments.length; i++) { - a.__proto__ = arguments[i], a = arguments[i] - } - - // 构造对象 - var id = 1 - var conf = {}, conf_cb = {}, old - var sync = {} - var cache = {}, datas = {} - var history = [] - var meta = {__proto__: obj, target: target, - ID: shy("单一序列", function() {return id++}), - Conf: shy("配置变量", function(key, value, cb) { - if (kit.isNone(key)) {return conf} - kit.notNone(cb) && (conf_cb[key] = cb) - if (kit.notNone(value)) { - old = conf[key], conf[key] = value - kit.Log("config", key, value, old) - kit._call(conf_cb[key], [value, old]) - } - return kit.isNone(conf[key]) && obj && obj.Conf? obj.Conf(key): conf[key] - }), - Sync: shy("同步变量", function(m) { - var meta = m, data = "", list = [] - return sync[m] || (sync[m] = { - change: function(cb) {list.push(cb); return list.length-1}, - eq: function(value) {return data == value}, - neq: function(value) {return data != value}, - get: function() {return data}, - set: function(value, force) { - if (kit.isNone(value)) {return} - if (value == data && !force) {return} - old = data, data = value - meta && kit.Log("key", meta, value, old) - kit.List(list, function(cb) {cb(value, old)}) - return value - }, - }) - }), - Save: shy("保存视图", function(name, output, data) {if (name === "") {return cache = {}} - kit.Log("view", "save", meta.Zone(name).join(".")) - var temp = document.createDocumentFragment() - while (output.childNodes.length>0) { - var item = output.childNodes[0] - item.parentNode.removeChild(item) - temp.appendChild(item) - } - cache[name] = temp - datas[name] = data || {} - return name - }), - Load: shy("恢复视图", function(name, output) {if (kit.isNone(cache[name])) {return} - kit.Log("view", "load", meta.Zone(name).join(".")) - while (cache[name].childNodes.length>0) { - var item = cache[name].childNodes[0] - item.parentNode.removeChild(item) - output.appendChild(item) - } - delete(cache[name]) - return datas[name] - }), - View: shy("添加视图", function(output, type, line, key) { - var text = line, list = [], item = false, style = "" - switch (type) { - case "icon": - list.push({img: [line[key[0]]]}) - break - - case "text": - list.push({text: [key.length>1? line[key[0]]+"("+line[key[1]]+")": - (key.length>0? line[key[0]]: "null"), "span"]}) - break - - case "code": - list.push({view: ["code", "div", key.length>1? line[key[0]]+"("+line[key[1]]+")": - (key.length>0? line[key[0]]: "null")]}) - break - - case "table": - list.push({type: "table", list: JSON.parse(line.text || "[]").map(function(item, index) { - return {type: "tr", list: item.map(function(value) { - return {text: [value, index == 0? "th": "td"]} - })} - })}) - break - - case "input": - style = " "+line.type - list.push(line) - break - - case "field": text = JSON.parse(line.text) - case "plugin": if (!text.name) {return {}} - var id = "plugin"+meta.ID() - list.push({view: ["item", "fieldset"], data: {id: id, draggable: false}, list: [ - {text: [text.name+"("+text.help+")", "legend"]}, - {view: ["option", "form"], list: [{type: "input", style: {"display": "none"}}]}, - {view: ["output", "div"]}, - ]}), item = true - break - } - - var ui = kit.AppendChild(output, item? list: [{view: ["item"+style], data: {id: "item"+meta.ID(), draggable: false}, list:list}]) - return ui["item"+style].Meta = text, ui - }), - Include: shy("加载脚本", function(src, cb) {src = kit.List(src) - function next(event) {src.length > 1? meta.Include(src.slice(1), cb): cb(event)} - kit.AppendChild(target, [file.endsWith(".css")? {require: [src[0], next]}: {include: [src[0], next]}]) - }), - History: shy("操作历史", function(value, target) {var item - return kit.isNone(value)? (item = history.pop()) && (item.target.value = item.value): - history.push({value: value, target: target}) - }), - Event: shy("事件入口", {name: zone}, function(event, msg, proto) { - return ctx.Event(event, msg, proto||arguments.callee.meta) - }), - _call: function(key) { - kit._call(meta, typeof key == "function"? key: meta[key], kit.List(arguments).slice(1)) - return true - }, - Zones: function(name) {return zone.concat(kit.List(arguments)).join(".")}, - Zone: function(name) {return zone.concat(kit.List(arguments))}, - } - - // 注册事件 - meta.onaction && kit.Item(meta.onaction.meta, function(key, cb) {target[key] = function(event) { - meta.onaction(event, key, cb) - }}) - return meta -} -function Page(page) { - kit.device.isWeiXin = true - var script = {}, record = "" - page = Meta([document.title], document.body, page, {check: true, - onload: function(event) { - if (ctx.Search("feature") != "") {return} - // Event入口 0 - if (page.Event(event, {}) && page.check && !ctx.Cookie("sessid")) { - // 用户登录 - kit.Selector(document, "body>fieldset.Login", function(field) { - page.Pane(page, field) - }), page.login.Pane.Dialog(1, 1) - } else { - // 登录成功 - document.querySelectorAll("body>fieldset").forEach(function(field) { - page.Pane(page, field) - }), page.check? page.login.Pane.Run(event, [], function(msg) { - msg.result && msg.result[0]? (page.who.set(msg.nickname[0]), page.init(page)) - :page.login.Pane.Dialog(1, 1) - }): page.init(page) - page.Button() - page.Status() - } - - // 事件回调 - document.body.onkeydown = function(event) { - // page.oncontrol(event) || page.onscroll(event) - }, document.body.onkeyup = function(event) { - }, document.body.oncontextmenu = function(event) { - }, document.body.onmousewheel = function(event) { - }, document.body.onmousedown = function(event) { - }, document.body.onmouseup = function(event) { - } - - window.onresize = function(event) { - page.onlayout(event) - } - }, - oninput: function(event, local) {var target = event.target - kit.History("key", -1, (event.ctrlKey? "Control+": "")+(event.shiftKey? "Shift+": "")+event.key) - - if (event.ctrlKey) { - if (local && kit._call(local, [event])) { - event.stopPropagation() - event.preventDefault() - return true - } - - var his = target.History || [] - var pos = target.Current || -1 - switch (event.key) { - case "p": - pos = (pos-1+his.length+1) % (his.length+1) - target.value = pos < his.length? his[pos]: "" - target.Current = pos - break - case "n": - pos = (pos+1) % (his.length+1) - target.value = pos < his.length? his[pos]: "" - target.Current = pos - break - case "a": - case "e": - case "f": - case "b": - break - case "h": - kit.DelText(target, target.selectionStart-1, target.selectionStart) - break - case "d": - kit.DelText(target, 0, target.selectionStart) - break - case "k": - kit.DelText(target, target.selectionStart) - break - case "u": - kit.DelText(target, 0, target.selectionEnd) - break - case "w": - var start = target.selectionStart-2 - var end = target.selectionEnd-1 - for (var i = start; i >= 0; i--) { - if (target.value[end] == " " && target.value[i] != " ") { - break - } - if (target.value[end] != " " && target.value[i] == " ") { - break - } - } - kit.DelText(target, i+1, end-i) - break - default: - return false - } - } else { - switch (event.key) { - case " ": - event.stopPropagation() - return true - case "Escape": - target.blur() - break - default: - if (kit.HitText(target, "jk")) { - kit.DelText(target, target.selectionStart-2, 2) - target.blur() - break - } - return false - } - } - - event.stopPropagation() - event.preventDefault() - return true - }, - onlayout: function() {}, - oncontrol: function() {}, - onscroll: function(event, target, action) { - switch (event.key) { - case " ": - page.footer.Pane.Select() - break - case "h": - if (event.ctrlKey) { - target.scrollBy(-conf.scroll_x*10, 0) - } else { - target.scrollBy(-conf.scroll_x, 0) - } - break - case "H": - target.scrollBy(-document.body.scrollWidth, 0) - break - case "l": - if (event.ctrlKey) { - target.scrollBy(conf.scroll_x*10, 0) - } else { - target.scrollBy(conf.scroll_x, 0) - } - break - case "L": - target.scrollBy(document.body.scrollWidth, 0) - break - case "j": - if (event.ctrlKey) { - target.scrollBy(0, conf.scroll_y*10) - } else { - target.scrollBy(0, conf.scroll_y) - } - break - case "J": - target.scrollBy(0, document.body.scrollHeight) - break - case "k": - if (event.ctrlKey) { - target.scrollBy(0, -conf.scroll_y*10) - } else { - target.scrollBy(0, -conf.scroll_y) - } - break - case "K": - target.scrollBy(0, -document.body.scrollHeight) - break - } - }, - title: function(title) { - document.title = title - }, - - Require: function(file, cb) { - if (!file || Plugin[file]) {return kit._call(cb, [Plugin[file]])} - file.endsWith(".css")? kit.AppendChild(document.body, [{require: ["/require/"+file, function(event) { - return Plugin[file] = file, kit._call(cb, [Plugin[file]]) - }]}]): kit.AppendChild(document.body, [{include: ["/require/"+file, function(event) { - return kit._call(cb, [Plugin[file]]) - }]}]) - }, - script: function(action, name, time) { - switch (action) { - case "create": - record = name, script[name] = [] - kit.Log("script", action, name) - break - case "record": - record && kit.Log("script", action, record, name) - record && script[record].push(name) - break - case "finish": - kit.Log("script", action, record) - record = "" - break - case "replay": - kit.Log("script", action, name) - record = "" - - var event = window.event - kit.List(script[name], function(item) { - kit.Log("script", action, name, item) - page.action.Pane.Core(event, {}, ["_cmd", item]); - }, time||1000, function() { - page.toast.Pane.Show("run "+name+" done") - }) - break - default: - return script - } - return true - }, - Help: function(pane, type, action) {return []}, - Jshy: shy("本地命令", function(event, args) {var msg = ctx.Event(event) - // 面板命令 - if (page[args[0]] && page[args[0]].type == "fieldset") { - return page[args[0]].Pane.Jshy(event, args.slice(1)) || page.Zone("select", args[0]) - } - // 控件命令 - if (typeof page.Action[args[0]] == "function") { - return kit._call(page.Action[args[0]], [event, args[0]]) || page.Zone("action", args[0]) - } - - // 脚本命令 - if (script[args[0]]) {return page.script("replay", args[0])} - - // 内部命令 - if (typeof page[args[0]] == "function") { - return kit._call(page[args[0]], args.slice(1)) || page.Zone("function", args[0]) - } - }), - WSS: function(cb, onerror, onclose, onopen) { - return page.socket || (page.socket = ctx.WSS(cb || (function(event, m) { - if (m.detail) { - page.action.Pane.Core(event, m, ["_cmd", m.detail], m.Reply) - } else { - page.toast.Pane.Show(m.result.join("")) - } - - }), onerror || (function() { - page.socket.close() - - }), onclose || (function() { - page.toast.Pane.Show("WSS Close") - delete(page.socket), setTimeout(function() { - page.WSS(cb, onerror, onclose) - }, 1000) - }), onopen || (function() { - page.toast.Pane.Show("WSS Open") - }))) - }, - - initToast: function(page, field, option, output) { - return { - Dialog: function(width, height) { - kit.ModifyView(field, {display: "block", dialog: [width, height], padding: 10}) - }, - Ticker: function(text, duration) { - var tick = 1 - var begin = kit.time(0, "%H:%M:%S") - function ticker() { - field.style.display != "none" && (text.innerText = begin+" ... "+(tick++)+"s") && setTimeout(ticker, 1000) - } - return duration == -1? setTimeout(ticker, 10): setTimeout(field.Pane.Hide, duration||3000) - }, - Show: function(text, title, duration) {if (!text) {return field.Pane.Hide()} - var args = typeof text == "object"? text: {text: text, title: title, duration: duration} - - var list = [{text: [args.title||"", "div", "title"]}, - typeof args.text == "string"? {text: [args.text||"", "div", "content"]}: args.text] - - kit.List(args.inputs, function(input) { - typeof input == "string"? list.push({label: input}, {input: [input, page.oninput]}): - list.push({label: input[0]}, {select: input.slice(1)}) - list.push({type: "br"}) - }) - kit.List(args.button, function(input) { - list.push({button: [input, function(event) { - var values = {} - output.querySelectorAll("input").forEach(function(input) { - values[input.name] = input.value - }) - output.querySelectorAll("select").forEach(function(input) { - values[input.name] = input.value - }) - kit._call(args.cb, [input, values]) && field.Pane.Hide() - }]}) - }) - list.push({view: ["tick"], name: "tick"}) - - field.Pane.Dialog(args.width||text.length*10+100, args.height||80) - return field.Pane.Ticker(kit.AppendChilds(output, list).tick, args.button? -1: args.duration || 3000) - }, - } - }, - initCarte: function(page, field, option, output) { - field.onmouseleave = function(event) {field.Pane.Hide()} - return { - Show: function(event, cb) {if (!cb.list || cb.list.length == 0) {return} - output.innerHTML = "" - kit.AppendActions(output, cb.list, function(event, value) { - kit._call(cb, [event, value, cb.meta]) && field.Pane.Hide() - }, true) - - var pos = {display: "block", left: event.x, top: event.y} - if (document.body.clientWidth - event.x < 60) { - var pos = {display: "block", right: event.x, top: event.y} - } - - kit.ModifyView(field, pos) - event.stopPropagation() - event.preventDefault() - }, - } - }, - initDebug: function(page, field, option, output) { - var table = kit.AppendChilds(output, "table") - var caption = kit.AppendChild(table, [{type: "caption"}]).last - var head = kit.AppendChild(table, [{type: "thead", list: [{row: ["index", "time", "type", "order", "action", "target", "args"], sub: "th"}]}]).tr - var list = kit.AppendChild(table, "tbody") - kit.OrderTable(table) - var last, types = {all: 0, event: 0, run: 0, key: 0} - - - kit.Log.meta.call.push(function(time, type, order, action, target) {var Choice = field.Pane && field.Pane.Choice || [] - if (kit.isNone(types[type])) {types[type] = 0, Choice.push(type)} - types[type]++ - - last = kit.AppendChild(list, [{className: type, row: [types.all++, time, type, order, action||"", target||"", kit.List(arguments, function(item) { - return typeof item == "object"? "{...}": item - }).slice(5).join(" ")]}]).last - field.Pane && field.Pane.Head() - - kit.AppendChilds(caption, kit.List(Choice.slice(1), function(item) {return {text: [item+": "+types[item], "span"], click: function(event) { - field.Pane.Action(event, item) - }}})) - }) - var layout - return { - Head: function() {if (kit.isNone(last)) {return} - caption.style.width = last.offsetWidth+"px" - kit.Selector(last, "td", function(item, index) { - head.childNodes[index] && (head.childNodes[index].style.width = item.offsetWidth-14+"px") - }) - }, - Show: function() {layout || (layout = field.Pane.Action.meta["最大"](), 1) - kit.ModifyView(field, {display: field.style.display != "block"? "block": "none"}) - field.Pane.Head() - }, - clear: function() { - var th = kit.AppendChilds(list, [{row: ["time", "type", "main", "arg", "args"], sub: "th"}]).last - }, - Action: shy({ - "关闭": function() { - field.Pane.Show() - }, - "最大": function() { - kit.size(output, document.body.clientWidth, document.body.clientHeight-160) - }, - "最小": function() { - kit.size(output, document.body.clientWidth/2, document.body.clientHeight/2) - }, - "左边": function() { - field.style.left = "0px" - kit.size(output, document.body.clientWidth/2, document.body.clientHeight) - }, - "右边": function() { - field.style.left = document.body.clientWidth/2+"px" - kit.size(output, document.body.clientWidth/2, document.body.clientHeight) - }, - }, function(event, type) {last = null - kit.Selector(list, "tr", function(item, index) { - type == "all" || kit.classList.has(item, type)? - (kit.classList.del(item, "hide"), last = item): kit.classList.add(item, "hide") - }) - field.Pane.Head() - }), - Choice: ["关闭", "all", "event", "run", "key"], - Button: ["关闭", "最大", "最小", "左边", "右边"], - } - }, - initLogin: function(page, field, option, output) { - var ui = kit.AppendChilds(option, [ - {label: "username"}, {input: ["username"], data: {autocomplete: "username"}}, {type: "br"}, - {label: "password"}, {password: ["password"], data: {autocomplete: "current-password"}}, {type: "br"}, - {button: ["login", function(value, event) { - if (!ui.username.value) {ui.username.focus(); return} - if (!ui.password.value) {ui.password.focus(); return} - - field.Pane.Login(ui.username.value, ui.password.value, function(sessid) { - if (!sessid) {kit.alert("用户或密码错误"); return} - page.login.Pane.Dialog(1, 1), page.onload(event) - }) - }]}, {type: "br"}, - ]) - - return { - WeiXin: function() { - // 微信接口 - kit.device.isWeiXin && page.login.Pane.Run(event, ["weixin"], function(msg) { - msg.appid[0] && page.Include(["https://res.wx.qq.com/open/js/jweixin-1.4.0.js"], function(event) { - wx.error(function(res){}) - wx.ready(function(){ - page.scanQRCode = function(cb) { - - } - page.getLocation = function(cb) { - wx.getLocation({success: cb}) - } - page.openLocation = function(latitude, longitude, name) { - wx.openLocation({latitude: parseFloat(latitude), longitude: parseFloat(longitude), name:name||"here"}) - } - }), wx.config({jsApiList: ["closeWindow", "scanQRCode", "getLocation", "openLocation"], - appId: msg.appid[0], nonceStr: msg.nonce[0], timestamp: msg.timestamp[0], signature: msg.signature[0]}) - }) - }) - }, - Login: function(username, password, cb) { - field.Pane.Run(event, [username, password], function(msg) {cb(msg.result && msg.result[0] || "")}) - }, - Exit: function() {ctx.Cookie("sessid", ""), kit.reload()}, - } - }, - initHeader: function(page, field, option, output) { - if (ctx.Search("feature") != "") {return} - var cb = function(event, item, value) {kit._call(page.Action[item], [event, item, value, page])} - field.onclick = function(event) {page.pane && page.pane.scrollTo(0, 0)} - page.who.change(function(value, old) {page.Button("user", value)}) - - return { - Show: function() {var meta = page.Button.meta, list = page.Button.list - kit.AppendChilds(output, [ - {"view": ["title", "div", meta.title], click: function(event) { - cb(event, "title", meta.title) - }}, - {"view": ["state"], list: list.map(function(item) {return {text: [meta[item], "div", "item"], click: function(event) { - cb(event, item, meta[item]) - }}})}, - ]) - }, - Help: function() {return []}, - } - }, - initFooter: function(page, field, option, output) { - var cb = function(event, item, value) {kit._call(page.Action[item], [event, item, value, page])} - var ui = kit.AppendChilds(output, [ - {"view": ["title", "div", page.Status.meta.title]}, - {"view": ["state"]}, - {"view": ["magic"], list: [{label: "0", name: "count"}, {input: ["magics", function(event) { - if (event.key == "Enter" || event.ctrlKey && event.key == "j") { - page.action.Pane.Core(event, {}, ["_cmd", event.target.value], function(msg) { - page.toast.Pane.Show(JSON.stringify(msg.result), event.target.value) - }); - - (ui.magic.History.length == 0 || ui.magic.History[ui.magic.History.length-1] != event.target.value) && ui.magic.History.push(event.target.value) - ui.magic.Current = ui.magic.History.length - ui.count.innerHTML = ui.magic.Current - event.target.value = "" - } else { - page.oninput(event, function(event) { - switch (event.key) { - case "Enter": - kit.Log(event.target.value) - break - default: - return false - } - return true - }) - } - ui.count.innerHTML = ui.magic.Current || 0 - field.Pane.Show() - }]}]}, - ]) - - ui.magic.History = [] - - return { - Select: function() {ui.magics.focus()}, - Size: function(width, height) { - kit.size(field, width, height) - ui && kit.size(ui.magics, (width - ui.count.offsetWidth - ui.first.offsetWidth - ui.state.offsetWidth - 40), height-6) - }, - Show: function() {var meta = page.Status.meta, list = page.Status.list - kit.AppendChilds(ui.state, list.map(function(item) {return {text: [item+":"+meta[item], "div", "item"], click: function(event) { - cb(event, item, meta[item]) - }}})) - field.Pane.Size(field.clientWidth, field.clientHeight) - }, - Help: function() {return []}, - } - }, - Pane: Pane, - }), page.which = page.Sync("layout"), page.who = page.Sync("username") - - kit.Log("init", "page", page) - return window.onload = page.onload, page -} -function Pane(page, field) { - var option = field.querySelector("form.option") - var action = field.querySelector("div.action") - var output = field.querySelector("div.output") - - var timer = "" - var name = option.dataset.names - var itemkey = "fieldset.item, div.item" - var itemkeys = "fieldset.item.select, div.item.select" - - var pane = Meta(page.Zone(name), field, (page[field.dataset.init] || function() {})(page, field, option, output) || {}, { - Appends: shy("添加列表", function(cmds, type, key, which, first, cb, cbs) { - var list = [] - pane.Runs(event||{}, cmds, function(line, index, msg) { - var ui = pane.Append(type, line, key, which, cb) - list.push(ui) - if (typeof first == "string") { - (line.key == first || line.name == first || line[which] == first || line[key[0]] == first) && ui.item.click() - } else { - first && index == 0 && ui.item.click() - } - if (index == msg[msg.append[0]].length-1) { - kit.Selector(output, itemkeys).length == 0 && pane.Select(0) - kit._call(cbs, [msg, list]) - } - }) - }), - Append: shy("添加列表", function(type, line, key, which, cb) {type = type || line.type - var ui = pane.View(output, type, line, key) - if (!ui.item) {return} - - ui.item.onclick = function(event) { if (pane.which.get() == line[which]) {return} - pane.Event(event, {}, {name: pane.Zone("select", line[key[0]])}) - page.script("record", [name, line[key[0]]]) - pane.Select(ui.item) - - pane.which.set(line[which]) - kit._call(cb, [event, line]) - } - ui.item.ondragstart = function(event) {if (event.target != ui.item) {return} - event.dataTransfer.setData("item", event.target.id) - event.stopPropagation() - event.preventDefault() - } - ui.item.ondragover = function(event) {if (event.target != ui.item) {return} - event.stopPropagation() - event.preventDefault() - pane.Select(ui.item) - } - ui.item.ondrop = function(event) {if (event.target != ui.item) {return} - var item = pane[event.dataTransfer.getData("item")] - output.insertBefore(item, event.target) - event.stopPropagation() - } - ui.item.oncontextmenu = function(event) { - pane.Detail && page.carte.Pane.Show(event, shy({}, pane.Detail, function(event, value, meta) { - pane.Check(event, value, meta, line) - })) - } - - if (type == "plugin" && line.name || type == "field") { - page.Require(line.init? line.group+"/"+line.init: "", function(init) { - page.Require(line.view? line.group+"/"+line.view: "", function(view) { - pane.Plugin(page, pane, ui.item, init, function(event, cmds, cbs) { - kit._call(cb||pane.Core, [event, line, cmds, cbs]) - }) - }) - }) - } - return pane[ui.item.id] = ui.item, ui - }), - Select: shy("选择列表", function(index) { - kit.Selector(output, itemkey, function(item, i) {if (item != index && i != index) {return} - kit.Selector(output, itemkeys, function(item) {kit.classList.del(item, "select")}) - kit.classList.add(item, "select") - }) - }), - - Next: function() { - var next = output.querySelector(itemkeys).nextSibling - next? next.click(): output.firstChild.click() - }, - Prev: function() { - var prev = output.querySelector(itemkeys).previousSibling - prev? prev.click(): output.lastChild.click() - }, - - Show: function() { - kit.ModifyView(field, {display: "block"}) - }, - Hide: function() { - kit.ModifyView(field, {display: "none"}) - }, - Size: function(width, height) { - if (width > 0) { - field.style.width = width+"px" - field.style.display = "block" - } else if (width === "") { - field.style.width = "" - field.style.display = "block" - } else { - field.style.display = "none" - return - } - - if (height > 0) { - field.style.height = height+"px" - field.style.display = "block" - } else if (height === "") { - field.style.height = "" - field.style.display = "block" - } else { - field.style.display = "none" - return - } - }, - Dialog: function(width, height) { - if (field.style.display != "block") { - page.dialog && page.dialog != field && page.dialog.style.display == "block" && page.dialog.Show() - page.dialog = field, field.style.display = "block", kit.ModifyView(field, {window: [width||80, height||200]}) - return true - } - field.style.display = "none" - delete(page.dialog) - return false - }, - - Help: function(type, action) { - var text = [] - switch (type) { - case "name": - case undefined: - text = [name] - break - case "list": - var list = [] - for (var k in pane) {list.push(k)} - list.sort(), text = text.concat(list.map(function(item) {return "func: "+item+"\n"})) - - var list = [] - for (var k in pane.Action) {list.push(k)} - list.sort(), text = text.concat(list.map(function(item) {return "action: "+item+"\n"})) - break - } - return text - }, - Jshy: shy("本地命令", function(event, args) {var msg = ctx.Event(event) - if (kit.isNone(args) || args.length == 0) { - return kit.classList.has(field, "dialog") && pane.Show() || pane.Zone("show", args[0]) - } - - // 插件命令 - if (pane[args[0]] && pane[args[0]].type == "fieldset") { - return pane[args[0]].Plugin.Jshy(event, args.slice(1)) || pane.Zone("plugin", args[0]) - } - // 控件命令 - if (typeof pane.Action[args[0]] == "function") { - return kit._call(pane.Action[args[0]], [event, args[0]]) || pane.Zone("action", args[0]) - } - // 列表命令 - var list = kit.Selector(output, itemkey, function(item) { - if (item.Meta.key == args[0] || item.Meta.name == args[0]) {return item} - }) - if (list.length > 0) {list[0].click(); return pane.Zone("select", args[0])} - - // 内部命令 - if (typeof pane[args[0]] == "function") { - return kit._call(pane[args[0]], args.slice(1)) || pane.Zone("function", args[0]) - } - }), - - Tickers: shy("定时刷新", function(time, cmds, cb) { - pane.Ticker(time, cmds, function(msg) {msg.Table(function(line, index) { - cb(line, index, msg) - })}) - }), - Ticker: shy("定时刷新", function(time, cmds, cb) {timer && clearTimeout(timer) - function loop() { - event = document.createEvent("Event") - pane.Event(event, {}, {name: pane.Zone("ticker")}) - !pane.Stop() && pane.Run(event, cmds, function(msg) { - cb(msg), timer = setTimeout(loop, time) - })} - time && (timer = setTimeout(loop, 10)) - }), - Check: shy("执行操作", function (event, value) { - // Event入口 1.1 - pane.Event(event, {}, {name: pane.Zone("click", value)}) - page.script("record", [name, value]) - - var cb = pane.Action.option || function() {} - if (pane.Action && pane.Action.meta && typeof pane.Action.meta[value] == "function") { - cb = pane.Action.meta[value] - } else if (pane.Action && typeof pane.Action[value] == "function") { - cb = pane.Action[value] - } else if (typeof pane.Action == "function") { - cb = pane.Action - } else if (typeof pane[value] == "function") { - cb = pane[value] - } - - if (page.Action && page.Action.meta && typeof page.Action.meta[value] == "function") { - cb = page.Action.meta[value] - } else if (page.Action && typeof page.Action[value] == "function") { - cb = page.Action[value] - } else if (typeof page.Action == "function") { - cb = page.Action - } else if (typeof page[value] == "function") { - cb = page[value] - } - kit._call(cb, arguments) - }), - Tutor: function() {var pane = field.Pane - var event = window.event - function loop(list, index) { - if (index >= list.length) {return} - kit.Log(index, list[index]) - pane.Core(event, {}, ["_cmd", list[index]]) - setTimeout(function() {loop(list, index+1)}, 1000) - } - loop([ - "聊天", "help", "最高", "最大", "聊天", - "工作", "串行", "清空", "并行", "help storm", "help storm list", "help action", "help action list", - "聊天", "help target", "help target list", - ], 0) - }, - Core: shy("命令分发", { - wssid: function(id) {return id && (page.wssid = id)}, - }, function(event, line, args, cbs) {var msg = pane.Event(event), meta = arguments.callee.meta - if (kit.isNone(args)) {return} - var plugin = event.Plugin || page.plugin && page.plugin.Plugin || {}, engine = { - share: function(args) { - return ctx.Share({"group": option.dataset.group, "names": option.dataset.names, "cmds": [ - line.river, line.storm, line.action, args[1]||"", - ]}) - }, - pwd: function(name, value) { - name && kit.Selector(page.action, "fieldset.item."+name, function(item) { - item.Plugin.Select() - }) - if (value) {return engine.set(value)} - return [page.river.Pane.which.get(), page.storm.Pane.which.get(), page.plugin && page.plugin.Meta.name, page.input && page.input.name, page.input && page.input.value] - }, - set: function(value, name) { - try { - if (value == undefined) { - msg.append = ["name", "value"] - msg.name = [], msg.value = [] - return kit.Selector(page.plugin, ".args", function(item) { - msg.Push("name", item.name) - msg.Push("value", item.value) - return item.name+":"+item.value - }) - - } else if (name == undefined) { - kit.Selector(page.plugin, "input[type=button]", function(item) { - if (item.value == value) {item.click(); return value} - }).length > 0 || (page.action.Pane.Action[value]? - page.action.Pane.Action[value](event, value): (page.input.value = value)) - } else { - page.plugin.Plugin.Inputs[name].value = value - } - } catch (e) { - engine._cmd("_cmd", [value, name]) - } - }, - dir: function(rid, sid, pid, uid) { - if (!rid) { - return kit.Selector(page.river, "div.output>div.item>div.text>span", function(item) { - return item.innerText - }) - } - if (!sid) { - return kit.Selector(page.storm, "div.output>div.item>div.text>span", function(item) { - return item.innerText - }) - } - if (!pid) { - return kit.Selector(page.action, "fieldset.item>legend", function(item) { - msg.Push("name", item.parentNode.Meta.name) - msg.Push("help", item.parentNode.Meta.help) - return item.innerText - }) - } - if (!uid) { - return kit.Selector(page.plugin, "input", function(item) { - msg.Push("name", item.name) - msg.Push("value", item.value) - return item.name+":"+item.value - }) - } - return [river, storm, page.plugin && page.plugin.Meta.name, page.input && page.input.name] - }, - echo: function(one, two) { - kit.Log(one, two) - }, - helps: function() { - engine.help("river") - engine.help("action") - engine.help("storm") - }, - help: function() { - var args = kit.List(arguments), cb, target - if (args.length > 0 && page.pane && page.pane.Pane[args[0]] && page.pane.Pane[args[0]].Plugin) { - cb = page.pane.Pane[args[0]].Plugin.Help, target = page.pane.Pane[args[0]], args = args.slice(1) - } else if (args.length > 1 && page[args[0]] && page[args[0]].Pane[args[1]]) { - cb = page[args[0]].Pane[args[1]].Plugin.Help, target = page[args[0]].Pane[args[1]], args = args.slice(2) - } else if (args.length > 0 && page[args[0]]) { - cb = page[args[0]].Pane.Help, target = page[args[0]], args = args.slice(1) - } else { - cb = page.Help, target = document.body, args - } - - if (kit.Selector(target, "div.Help", function(help) { - target.removeChild(help) - return help - }).length > 0) {return} - - var text = kit._call(cb, args) - var ui = kit.AppendChild(target, [{view: ["Help"], list: [{text: [text.join(""), "div"]}]}]) - setTimeout(function() {target.removeChild(ui.last)}, 30000) - }, - _split: function(str) {return str.trim().split(" ")}, - _cmd: function(arg) { - var args = typeof arg[1] == "string"? engine._split(arg[1]): arg[1]; - page.script("record", args) - - if (typeof meta[args[0]] == "function") { - return kit._call(meta[args[0]], args.slice(1)) - } - if (typeof engine[args[0]] == "function") { - return kit._call(engine[args[0]], args.slice(1)) - } - - // if (page.output && typeof page.output.Output[args[0]] == "function") { - // return kit._call(page.output.Output[args[0]], args.slice(1)) - // } - // if (page.input && typeof page.input.Input[args[0]] == "function") { - // return kit._call(page.input.Input[args[0]], args.slice(1)) - // } - if (page.plugin && typeof page.plugin.Plugin[args[0]] == "function") { - return kit._call(page.plugin.Plugin[args[0]], args.slice(1)) - } - - if (page.dialog && (res = page.dialog.Pane.Jshy(event, args))) {return res} - if (page.pane && (res = page.pane.Pane.Jshy(event, args))) {return res} - if (page.action && (res = page.action.Pane.Jshy(event, args))) {return res} - if (page.storm && (res = page.storm.Pane.Jshy(event, args))) {return res} - if (page.river && (res = page.river.Pane.Jshy(event, args))) {return res} - - if (page && (res = page.Jshy(event, args))) {return res} - - if (page.plugin && (res = page.plugin.Plugin.Jshy(event, args))) {return res} - return kit.Log(["warn", "not", "find"].concat(args)) - }, - _msg: function(msg) { - event.ctrlKey? kit._call(page.target.Pane.Send, msg.Format()): - event.shiftKey && page.target.Pane.Send("field", plugin.Reveal()) - }, - _run: function(msg) { - pane.Run(event, [Meta.river, Meta.storm, Meta.action].concat(args), function(msg) { - kit._call(cbs, [msg]), engine._msg(msg) - }) - }, - } - - var Meta = plugin && plugin.target && plugin.target.Meta || line || {} - kit.Log(["cmd"].concat(kit.List([Meta.river, Meta.storm, Meta.action])).concat(args[0] == "_cmd"? args[1]: args)) - - page.Status("ncmd", kit.History("cmd", -1, {args: args, meta: Meta})) - return args.length > 0 && meta[args[0]]? kit._call(cbs, [msg.Echo(meta[args[0]](args))]): - args.length > 0 && engine[args[0]]? kit._call(cbs, [msg.Echo(engine[args[0]](args))]): - event.shiftKey? engine._msg(msg): engine._run(msg) - }), - Runs: shy("执行命令", function(event, cmds, cb) { - pane.Run(event, cmds, function(msg) {msg.Table(function(line, index) { - (cb||pane.ondaemon)(line, index, msg) - })}) - }), - Run: shy("执行命令", function(event, cmds, cb) { - var msg = pane.Event(event, null, {name: pane.Zone(cmds[0])}) - kit.Selector(action, "input", function(item, index) { - msg.Option(item.name, item.value) - }) - ctx.Run(event, option.dataset, cmds, cb||pane.ondaemon) - }), - - onchoice: shy("菜单列表", { - "删除": "_table", - "修改": "_canvas", - }, ["删除", "修改"], function(event, value, meta) { - return pane._call(meta[value], event) - }), - onaction: shy("事件列表", { - oncontextmenu: function(event) { - page.carte.Pane.Show(event, pane.Choice? shy({}, pane.Choice, function(event, value, meta) { - pane.Check(event, value) - }): pane.onchoice) - }, - }, function(event, key, cb) {cb(event)}), - which: page.Sync(name), Listen: {}, Action: {}, Button: [], Choice: [], - Plugin: Plugin, - }) - - kit.Log("init", "pane", name, pane) - kit.AppendAction(action, pane.Button, pane.Check) - kit.Item(pane.Listen, function(key, cb) {page.Sync(key).change(cb)}) - return page[name] = field, field.Pane = pane -} - -function Plugin(page, pane, field, inits, runs) { - var option = field.querySelector("form.option") - var action = field.querySelector("div.action") - var output = field.querySelector("div.output") - - var meta = field.Meta - var name = meta.name, args = meta.args || [] - var inputs = JSON.parse(meta.inputs || "[]") - var feature = JSON.parse(meta.feature||'{}') - kit.classList.add(field, meta.group, name, feature.style) - - var plugin = Meta(pane.Zone(name), field, inits && inits(field, option, output) || {}, {Inputs: {}, Outputs: {}, - Appends: shy("添加控件", function(event, inputs) { - if (inputs) {return inputs.map(function(item) {plugin.Append(item)})} - - var name = "args"+kit.Selector(option, "input.args.temp").length - plugin.Append({type: "text", name: name, className: "args temp"}).focus() - }), - Append: shy("添加控件", function(item, name, value) { - var count = kit.Selector(option, ".args").length - args && count < args.length && (value = value || args[count] || "") - - item.before && kit.AppendChild(option, item.before) - item && item.width && (item.style = {}, item.style.width = item.width) - item.view == "full" && kit.AppendChild(option, "br") - var input = {plug: meta.name, type: "input", name: name || item.name || item.value || "input", data: item} - switch (item.type) { - case "upfile": item.type = "file"; break - case "select": - item.values = kit.Trans(item.values) - input.type = "select", input.list = item.values.map(function(value) { - return {type: "option", value: value, inner: value} - }) - item.value = value || item.value || item.values[0] - kit.classList.add(item, "args") - break - case "textarea": - var half = parseFloat(item.half||"1")||1 - input.type = "textarea", item.style = "height:"+(item.height||"50px")+";width:"+parseInt(((pane.target.clientWidth-35)/half))+"px" - // no break - case "text": - item.value = value || item.value || "" - kit.classList.add(item, "args") - item.autocomplete = "off" - break - } - kit.List((item.clist||"").split(" "), function(value) { - kit.classList.add(item, value) - }) - kit.classList.add(item, item.view) - return Inputs(plugin, input, item, plugin.View(option, "input", input)[input.name], option).target - }), - Select: shy("选择控件", function(target, focus) {field.onclick(event) - page.plugin = field, page.input = target = target || option.querySelectorAll("input")[1] - plugin.which.set(page.input.name) - focus && page.input.focus() - }), - Remove: shy("删除控件", function() { - var list = option.querySelectorAll("input.temp") - list.length > 0 && (option.removeChild(list[list.length-1].parentNode)) - }), - Rename: shy("命名", function() { - kit.prompt("控件名称", function(name) { - meta["help"] = name - kit.Selector(field, "legend", function(legend) { - legend.innerHTML = meta.name+"("+meta.help+")" - }) - }) - }), - - Delete: shy("删除插件", function() { - plugin.Prev().Plugin.Select(), field.parentNode.removeChild(field) - }), - Reveal: shy("导出插件", function() { - field.Meta.args = arguments.length > 0? kit.List(arguments): - kit.Selector(option, ".args", function(item) {return item.value}) - return JSON.stringify(field.Meta) - }), - Clone: shy("复制插件", function() { - return pane.Append("field", {text: plugin.Reveal(), init: meta.init, view: meta.view, group: meta.group}, [], "").item.Plugin.Select(null, true) - }), - clear: function() { - plugin.Save(""), output.innerHTML = "" - }, - - Move: function() { - return field.nextSibling || field.parentNode.firstChild - }, - Next: function() { - return field.nextSibling || field.parentNode.firstChild - }, - Prev: function() { - return field.previousSibling || field.parentNode.lastChild - }, - - Help: function(type, action) { - var text = [] - switch (type) { - case "name": - case undefined: - text = [meta.name] - break - case "list": - var list = [] - for (var k in plugin) {list.push(k)} - list.sort(), text = text.concat(list.map(function(item) {return "func: "+item+"\n"})) - - var list = [] - for (var k in plugin.ondaemon) {list.push(k)} - list.sort(), text = text.concat(list.map(function(item) {return "daemon: "+item+"\n"})) - - var list = [] - for (var k in plugin.onexport) {list.push(k)} - list.sort(), text = text.concat(list.map(function(item) {return "export: "+item+"\n"})) - - var list = [] - for (var k in plugin.onaction) {list.push(k)} - list.sort(), text = text.concat(list.map(function(item) {return "action: "+item+"\n"})) - break - } - return text - }, - Jshy: function(event, args) { - plugin.Select(), field.scrollIntoView() - // 显示命令 - if (plugin.Outputs[args[0]]) { - return plugin.Outputs[args[0]].Output.Jshy(event, args.slice(1)) || plugin.Zone("output", args[0]) - } - // 控件命令 - if (plugin.Inputs[args[0]]) { - return plugin.Inputs[args[0]].Input.Jshy(event, args.slice(1)) || plugin.Zone("input", args[0]) - } - // 内部命令 - if (typeof plugin[args[0]] == "function") { - return kit._call(plugin[args[0]], args.slice(1)) || plugin.Zone("function", args[0]) - } - // 远程命令 - return kit._call(plugin.Runs, [event]) || plugin.Zone("remote", args[0]) - }, - - ontoast: function() {kit._call(page.toast.Pane.Show, arguments)}, - oncarte: function() {kit._call(page.carte.Pane.Show, arguments)}, - - Option: function(key, value) { - kit.notNone(value) && option[key] && (option[key].value = value) - return kit.notNone(key)? (option[key]? option[key].value: ""): - kit.Selector(option, ".args", function(item, index) {return item.value}) - }, - upload: function(event) { - ctx.Upload({river: meta.river, table: plugin.Option("table")}, option.upload.files[0], function(event, msg) { - Output(plugin, "table", msg, null, output, option) - plugin.ontoast("上传成功") - }, function(event) { - plugin.ontoast("上传进度 "+parseInt(event.loaded*100/event.total)+"%") - }) - }, - Delay: shy("延时命令", function(time, event, text) {plugin.ontoast(text, "", -1) - return setTimeout(function() {plugin.Runs(event)}, time) - }), - Check: shy("检查命令", function(event, target, cb) { - kit.Selector(option, ".args", function(item, index, list) { - kit.isNone(target)? index == list.length-1 && plugin.Runs(event, cb): - item == target && (index == list.length-1? plugin.Runs(event, cb): page.plugin == field && list[index+1].focus()) - return item - }).length == 0 && plugin.Runs(event, cb) - }), - Last: shy("历史命令", function(event) {kit.notNone(plugin.History()) && plugin.Check(event)}), - Runs: shy("执行命令", function(event, cb) {plugin.Run(event, plugin.Option(), cb)}), - Run: shy("执行命令", function(event, args, cb, silent) {var show = true - page.script("record", ["action", name].concat(args)) - setTimeout(function() {show && plugin.ontoast(kit.Format(args||["running..."]), meta.name, -1)}, 1000) - event.Plugin = plugin, runs(event, args, function(msg) { - silent? kit._call(cb, [msg]): plugin.ondaemon(msg, cb), show = false, plugin.ontoast() - }) - }), - - ondaemon: shy("接收数据", function(msg, cb) { - plugin.msg = msg, plugin.Save(""), plugin.onfigure(plugin.onfigure.meta.type, msg, cb) - }), - onfigure: shy("显示数据", {type: feature.display||"table", - max: function(output) { - output.style.maxWidth = pane.target.clientWidth-30+"px" - output.style.maxHeight = pane.target.clientHeight-60+"px" - }, - size: function(cb) { - kit._call(cb, [pane.target.clientWidth, pane.target.clientHeight]) - }, - }, function(type, msg, cb) {var meta = arguments.callee.meta - type != meta.type && plugin.Save(meta.type, output), meta.type = type - if (type == "chart") { - can.chat.Output(can, plugin, type || feature.display, msg || plugin.msg, cb, output, option) - return - } - !plugin.Load(type, output) && (type=="chart"? can.chat.Output: Output)(plugin, type || feature.display, msg || plugin.msg, cb, output, option) - }), - onexport: shy("导出数据", { - "": function(value, name, line) { - return value - }, - see: function(value, name, line) { - return value.split("/")[0] - }, - you: function(value, name, line) { - event.Plugin = plugin - - line.you && name == "status" && (line.status == "start"? function() { - plugin.Delay(3000, event, line.you+" stop...") && plugin.Run(event, [option.pod.value, line.you, "stop"]) - }(): plugin.Run(event, [option.pod.value, line.you], function(msg) { - plugin.Delay(3000, event, line.you+" start...") - })) - return name == "status" || line.status == "stop" ? undefined: line.you - }, - pod: function(value, name, line, list) { - return (option[list[0]].value? option[list[0]].value+".": "")+value - }, - dir: function(value, name, line) { - name != "path" && (value = line.path) - return value - }, - tip: function(value, name, line) { - return option.tip.value + value - }, - }, JSON.parse(meta.exports||'["",""]'), function(event, value, name, line) { - var meta = arguments.callee.meta - var list = arguments.callee.list - - for (var i = 0; i < list.length; i += 3) {if (list[i+1] == name || list[i+2]) { - plugin.ontoast(list[i+1]? line[list[i+1]]: value, list[i+1]||name) - for (var i = 0; i < list.length; i += 3) { - page.Sync("plugin_"+list[i]).set(meta[list[i+2]||""](list[i+1]? line[list[i+1]]: value, list[i+1]||name, line, list)) - } - break - }} - }), - onchoice: shy("菜单列表", { - "返回": "Last", - "清空": "clear", - "克隆": "Clone", - "重命名": "Rename", - "删除": "Delete", - }, ["返回", "清空", "重命名", "克隆", "删除"], function(event, value, meta) { - return plugin._call(meta[value], event) - }), - onaction: shy("事件列表", { - oncontextmenu: function(event) { - plugin.oncarte(event, plugin.onchoice) - }, - }, function(event, key, cb) {cb(event)}), - }) - - kit.Log("init", "plugin", name, plugin) - plugin.which = plugin.Sync("input") - page[field.id] = pane[field.id] = pane[name] = field, field.Plugin = plugin - plugin.Appends(null, inputs) - return plugin -} -function Inputs(plugin, meta, item, target, option) { - var plug = meta.plug, name = meta.name, type = item.type - var input = Meta(plugin.Zone(name), target, item, { - getLocation: function(event) { - var x = parseFloat(option.x.value) - var y = parseFloat(option.y.value) - page.getLocation && page.getLocation(function(res) { - plugin.ondaemon({ - append: ["longitude", "latitude", "accuracy", "speed"], - longitude: [res.longitude+x+""], - latitude: [res.latitude+y+""], - accuracy: [res.accuracy+""], - speed: [res.speed+""], - }) - }) - }, - openLocation: function(event) { - var x = parseFloat(option.x.value) - var y = parseFloat(option.y.value) - page.getLocation && page.getLocation(function(res) { - page.openLocation && page.openLocation(res.latitude+y, res.longitude+x, option.pos.value) - }) - }, - clear: function() { - target.value = "" - }, - - Jshy: function(event, args) { - // 内部命令 - if (typeof plugin[args[0]] == "function") { - return kit._call(plugin[args[0]], args.slice(1)) || plugin.Zone("function", args[0]) - } - // 内部命令 - return (target.value = args[0]) || plugin.Zone("value", args[0]) - }, - - onformat: shy("数据转换", { - none: function(value) {return value||""}, - date: function(value) {return kit.time()}, - month: function(value) {return kit.time().slice(0, 7)}, - }, function(which, value) {var meta = arguments.callee.meta - return (meta[which||"none"]||meta["none"])(value) - }), - onimport: shy("导入数据", {}, kit.Trans(item.imports), function() { - kit.List(arguments.callee.list, function(imports) { - page.Sync(imports).change(function(value) { - plugin.History(target.value, target), target.value = value.trim() - input.Event(event = document.createEvent("Event")) - item.action == "auto" && plugin.Runs(event) - }) - }), item.type == "button" && item.action == "auto" && target.click() - }), - onchoice: shy("菜单列表", { - "返回": "Last", - "清空": "clear", - "加参": "Appends", - "减参": "Remove", - }, ["返回", "清空", "加参", "减参"], function(event, value, meta) { - return input._call(meta[value], event) - }), - onaction: shy("事件列表", { - oncontextmenu: function(event) { - item.type != "button" && plugin.oncarte(event, input.onchoice) - }, - onfocus: function(event) {plugin.Select(target)}, - onblur: function(event) {type == "text" && input.which.set(target.value)}, - onclick: function(event) {plugin.Select() - // Event入口 2.0 - type == "button" && input.Event(event, {}) && kit.Value(input[item.cb], plugin[item.cb], function(event, target) { - plugin.Check(event) - })(event, target) - }, - onchange: function(event) { - // Event入口 2.1 - type == "select" && input.Event(event, {}) && plugin.History(target.value, target) && plugin.Check(event, item.action == "auto"? undefined: target) - }, - ondblclick: function(event) { - var txt = kit.History("txt", -1); - (type == "text" || type == "textarea") && txt && (target.value = txt.data.trim()) - }, - onselect: function(event) { - kit.CopyText() - }, - onkeydown: function(event) { - switch (event.key) { - case " ": - event.stopPropagation() - return true - } - - page.oninput(event, function(event) { - switch (event.key) { - case " ": - case "w": - break - case "p": - action.Last() - break - case "i": - plugin.Next().Plugin.Select() - break - case "o": - plugin.Prev().Plugin.Select() - break - case "c": - plugin.clear() - break - case "r": - plugin.clear() - case "j": - plugin.Runs(event) - break - case "l": - target.scrollTo(0, plugin.target.offsetTop) - break - case "b": - plugin.Appends(event) - break - case "m": - plugin.Clone() - break - default: - return false - } - return true - }) - - // Event入口 2.1 - if (event.key == "Enter" && (event.ctrlKey || item.type == "text")) { - input.which.set(target.value) != undefined && plugin.History(target.value, target) - input.Event(event, {}) && event.ctrlKey? plugin.Runs(event): plugin.Check(event, target) - } - }, - onkeyup: function(event) { - switch (event.key) { - case " ": - event.stopPropagation() - return true - } - - page.oninput(event, function(event) { - switch (event.key) { - case " ": - case "w": - break - default: - return false - } - return true - }) - }, - }, function(event, key, cb) {cb(event)}), - which: plugin.Sync(name), - }, plugin) - - kit.Log("init", "input", input.Zones(), input) - - input.onimport() - target.value = input.onformat(item.init, item.value); - (type == "text" || type == "textarea") && !target.placeholder && (target.placeholder = item.name) - type == "text" && !target.title && (target.title = item.placeholder || item.name || "") - return plugin.Inputs[item.name] = target, target.Input = input -} -function Output(plugin, type, msg, cb, target, option) { - var name = plugin.target.Meta.name+"."+type - var feature = JSON.parse(plugin.target.Meta.feature||'{}') - var exports = JSON.parse(plugin.target.Meta.exports||'{}') - - var output = Meta(plugin.Zone(type), target, { - Format: function() { - var ext = ".csv", txt = kit.Selector(target, "tr", function(tr) { - return kit.Selector(tr, "td,th", function(td) { - return td.innerText - }).join(",") - }).join("\n"); - type == "editor" && msg.file && (ext = ".txt", txt = msg.result.join("\n")); - !txt && (ext = ".txt", txt = msg.result.join("")) - return [name, ext, txt] - }, - Download: function() { - var ps = output.Format() - - plugin.ontoast({text:''+ps[0]+ps[1]+'', title: "下载中...", width: 200}) - kit.Selector(page.toast, "a", function(item) {item.click()}) - }, - Copy: function(event) { - kit.CopyText(output.Format()[2]) - }, - - Jshy: function(event, args) { - // 内部命令 - if (typeof plugin[args[0]] == "function") { - return kit._call(plugin[args[0]], args.slice(1)) || plugin.Zone("function", args[0]) - } - // 内部命令 - return (target.value = args[0]) || plugin.Zone("value", args[0]) - }, - - size: function(cb, ncol, nrow) {ncol = ncol || 1, nrow = nrow || 1 - plugin.onfigure.meta.size(function(width, height) { - cb(width/ncol-10, height/nrow-10) - }) - }, - onimport: shy("导入数据", { - _video: function(msg, line, width, height) { - kit.AppendChild(target, [{type: "video", style: {width: width}, - data: {controls: "controls", autoplay: false, loop: true, src: line.file}}]) - }, - _image: function(msg, line, width, height) { - kit.AppendChild(target, [{type: "img", data: {src: line.file}, style: {width: width}}]) - }, - _table: function(msg, list) { - return list && list.length > 0 && kit.OrderTable(kit.AppendTable(kit.AppendChild(target, "table"), msg.Table(), list), "", output.onexport, function(event, value, name, line, index) { - var td = event.target - plugin.oncarte(event, shy("菜单列表", { - "选择": "select", - "修改": "modify", - "复制": function(event, text) {kit.CopyText(text), plugin.ontoast(text, "Copy to ClipBoard!")}, - "下载": "Download", - "删除": "delete", - }, feature.detail||["选择", "修改", "复制", "下载", "删除"], function(event, item, meta) { - var text = td.innerText.trim() - if (typeof meta[item] == "function") {meta[item](event, text); return} - - // 选项 - var msg = plugin.Event(event) - kit.Selector(option, ".args", function(item) { - msg.Option(item.name, item.value||"") - }) - - // 参数 - var cmd = [], id = "" - option.dream && cmd.push(option.dream.value) - option.table && cmd.push(option.table.value) - if (td.dataset && td.dataset.id) { - id = td.dataset.id - } else if (name == "value") { - id = option.index.value, name = line.key - } else { - for (var i = 0; i < exports.length-1; i += 3) { - line[exports[i+1]] && msg.Option(exports[i], line[exports[i+1]].trim()) - id = (id || line[exports[i+1]] || "").trim() - } - } - cmd.push(id, meta[item]||item) - - // 命令 - if (item == "修改") { - // 交互命令 - text = kit.AppendChilds(td, [{type: "input", value: text, style: {width: td.clientWidth+"px"}, data: {onkeydown: function(event) { - if (event.key != "Enter") {return} - - // 选项 - var msg = plugin.Event(event) - kit.Selector(option, ".args", function(item) { - msg.Option(item.name, item.value) - }) - - // 后端命令 - cmd.push(name, event.target.value) - plugin.Run(event, cmd, function(msg) { - td.innerHTML = event.target.value - plugin.ontoast("修改成功") - }, true) - }}}]).input, text.focus(), text.setSelectionRange(0, -1) - - } else if (output[meta[item]]) { - // 前端命令 - output[meta[item]](event) - - } else { - // 后端命令 - cmd.push(name, text) - plugin.Run(event, cmd, function(msg) { - console.log(msg) - }) - } - return true - }) - ) - }) - }, - _code: function(msg, line) { - return msg.result && msg.result.length > 0 && kit.OrderCode(kit.AppendChild(target, [{view: ["code", "div", msg.Results()]}]).first) - }, - _svg: function(width, height, src) { - kit.AppendChild(target, '') - }, - _svg2: function(msg, width, height) { - target.innerHTML = msg.result.join("") - }, - - svg: function(msg, cb) {var meta = output.onimport.meta - plugin.onfigure.meta.size(function(width, height) { - meta._svg2(msg, width, height*1.6) - }) - }, - code: function(msg, cb) {var meta = output.onimport.meta - target.innerHTML = "", output.onimport.meta._code(msg) - typeof cb == "function" && cb(msg) - }, - table: function(msg, cb) {var meta = output.onimport.meta - target.innerHTML = "" - output.onimport.meta._table(msg, msg.append) || output.onimport.meta._code(msg) - typeof cb == "function" && cb(msg) - }, - album: function(msg, cb) {var meta = output.onimport.meta - target.innerHTML = "", msg.Table(function(line) {meta._image(msg, line)}) - }, - video: function(msg, cb) {var meta = output.onimport.meta - target.innerHTML = "", msg.Table(function(line) {meta._video(msg, line)}) - }, - audio: function(msg, cb) {var meta = output.onimport.meta - target.innerHTML = "", msg.Table(function(line) {meta._audio(msg, line)}) - }, - media: function(msg, cb) {var meta = output.onimport.meta - output.size(function(width, height) { - target.innerHTML = "", msg.Table(function(line) {var ls = (line.file||line.path).split(".") - line.file = line.file? line.file: "/download/"+line.path - switch (ls[ls.length-1].toLowerCase()) { - case "mp4": meta._video(msg, line, width, height); break - case "png": meta._image(msg, line, width, height); break - case "svg": meta._svg(msg, line, width, height); break - } - }) - }, 3) - }, - inner: function(msg, cb) {var meta = output.onimport.meta - target.innerHTML = "", plugin.onfigure.meta.max(target) - output.onimport.meta._table(msg, msg.append) || kit.OrderCode(kit.ModifyNode(target, msg.result.join(""))) - kit._call(cb, [msg]) - kit.Selector(target, ".story", function(item) { - var data = item.dataset - item.oncontextmenu = function(event) { - plugin.oncarte(event, shy("", { - "提交": function(event) { - plugin.Run(event, [option.dream.value, "commit", option.story.value, data.scene, data.enjoy, data.happy], function(msg) { - plugin.ontoast(msg.Result()) - }, true) - }, - "复制": function(event) { - plugin.ontoast(kit.CopyText(data.happy)) - }, - "收藏": function(event) { - kit.prompt("收藏到", function(table) { - plugin.Run(event, [option.dream.value, "favor", table, option.story.value, data.scene, data.enjoy, data.happy], function(msg) { - }, true) - }) - }, - "共享": function(event) { - plugin.Run(event, [option.dream.value, "share", option.story.value, data.scene, data.enjoy, data.happy], function(msg) { - }, true) - }, - }, ["提交", "复制", "收藏", "共享"], function(event, value, meta) { - meta[value](event) - })) - } - }) - }, - editor: function(msg, cb) {var meta = output.onimport.meta - output.onimport.meta.table(msg, cb) - - var current = page.Sync("plugin_editor_index").get() - target.style.maxHeight = "" - if (msg.file) { - target.style.maxHeight = "500px" - var code = kit.AppendChild(target, [{view: ["code", "table"], list: kit.List(msg.result, function(line, index) { - return {view: ["line"+ (current == index+1? " select": ""), "tr"], - list: [{view: ["number", "td", index+1]}, {view: ["code", "td", kit.Origin(kit.Color(line))], style: {"white-space": "pre"}}], click: function(event) { - page.Sync("plugin_editor_file").set(msg.file[0]) - page.Sync("plugin_editor_index").set(index+1) - page.Sync("plugin_editor_line").set(line) - page.Sync("plugin_editor_word").set(kit.CopyText()) - }} - })}]) - kit.Selector(target, "tr.line.select", function(tr) { - tr.scrollIntoView() - }) - } - }, - canvas: function(msg, cb) {var meta = output.onimport.meta - target.innerHTML = "", plugin.onfigure.meta.size(function(width, height) { - Canvas(plugin, option, target, width-45, height-175, 10, msg) - }) - }, - }, function(type, msg, cb) {var meta = output.onimport.meta - page.output = target, meta[type](msg, cb) - }), - ondetail: shy("菜单列表", { - "删除": "_table", - "修改": "_canvas", - }, ["删除", "修改"], function(event, value, meta) { - kit._call(output, output[meta[value]], [event]) - return true - }), - onchoice: shy("菜单列表", { - "返回": "Last", - "清空": "clear", - "复制": "Copy", - "下载": "Download", - "表格": function() {plugin.onfigure("table")}, - "媒体": function() {plugin.onfigure("media")}, - "绘图": function() {plugin.onfigure("canvas")}, - }, ["返回", "清空", "复制", "下载", "表格", "媒体", "绘图"], function(event, value, meta) { - return output._call(meta[value], event) - }), - onaction: shy("事件列表", { - oncontextmenu: function(event) { - plugin.oncarte(event, output.onchoice) - }, - }, function(event, key, cb) {cb(event)}), - }, plugin) - kit.Log("init", "output", output.Zones(), output) - output.onimport(type, msg, cb) - return plugin.Outputs[type] = target, target.Output = output -} - - -var Config = {main: "chat", - list: ["toast", "carte"], -} diff --git a/usr/librarys/favicon.ico b/usr/librarys/favicon.ico deleted file mode 100644 index 08d3924d..00000000 Binary files a/usr/librarys/favicon.ico and /dev/null differ diff --git a/usr/librarys/share.css b/usr/librarys/share.css deleted file mode 100644 index 01e45bb7..00000000 --- a/usr/librarys/share.css +++ /dev/null @@ -1,12 +0,0 @@ -div.story.code { - color:white; - font-size:14px; - font-family:monospace; - background-color:#272822; - white-space:pre; - padding:10px; - border:solid 3px green; - max-height:640px; - overflow:auto; -} - diff --git a/usr/librarys/share.js b/usr/librarys/share.js deleted file mode 100644 index 1a77e35d..00000000 --- a/usr/librarys/share.js +++ /dev/null @@ -1,6 +0,0 @@ -window.onload = function() { - Volcanos("shy", {}, [], function(can) { - can.load() - }) -} - diff --git a/usr/librarys/toolkit.js b/usr/librarys/toolkit.js deleted file mode 100644 index b3a6313c..00000000 --- a/usr/librarys/toolkit.js +++ /dev/null @@ -1,1390 +0,0 @@ -shy = function(help, meta, list, cb) { - var index = -1, value = "", type = "string", args = arguments - function next(check) { - if (++index >= args.length) {return false} - if (check && check != typeof args[index]) {index--; return false} - return value = args[index], type = typeof value, value - } - - var cb = arguments[arguments.length-1] || function() {} - cb.help = next("string") || "还没有写" - cb.meta = next("object") || {} - cb.list = next("object") || {} - cb.runs = function() {} - return cb -} -kit = toolkit = (function() {var kit = {__proto__: document, - // 用户终端 - device: { - isWeiXin: navigator.userAgent.indexOf("MicroMessenger") > -1, - isMobile: navigator.userAgent.indexOf("Mobile") > -1, - isIPhone: navigator.userAgent.indexOf("iPhone") > -1, - isMacOSX: navigator.userAgent.indexOf("Mac OS X") > -1, - isWindows: navigator.userAgent.indexOf("Windows") > -1, - }, - alert: function(text) {alert(JSON.stringify(text))}, - confirm: function(text) {return confirm(text)}, - prompt: function(text, cb) { - var text = prompt(text) - text && kit._call(cb, text) - return text - }, - reload: function() {location.reload()}, - // 日志调试 - History: shy("历史记录", {lay: [], cmd: [], txt: [], key: []}, function(type, index, data) {var meta = arguments.callee.meta - if (kit.isNone(index)) {return meta[type]} - var list = meta[type] || [] - if (kit.isNone(data)) {var len = list.length - return list[(index+len)%len] - } - return meta[type] = list, list.push({time: Date.now(), data: data})-1 - }), - Debug: shy("调试断点", {why: true, msg: true, config: false}, function(key) { - if (arguments.callee.meta[key]) {debugger} - }), - Log: shy("输出日志", {hide: {"init": true, "wss": false}, call: [], - func: {debug: "debug", info: "info", parn: "warn", err: "error"}, - }, function(type, arg) {var meta = arguments.callee.meta - var args = [kit.time().split(" ")[1]].concat(kit.List(kit.isNone(arg)? type: arguments)) - !meta.hide[args[1]] && console[meta.func[args[1]]||"log"](args) - kit.List(meta.call, function(cb) {kit._call(cb, args)}) - kit.Debug(args[1]) - return args.slice(1) - }), - Tip: shy("用户提示", function() {}), - - // HTML节点操作 - classList: { - has: function(obj, key) { - var list = obj.className? obj.className.split(" "): [] - for (var i = 1; i < arguments.length; i++) { - if (list.indexOf(arguments[i]) == -1) { - return false - } - } - return true - }, - add: function(obj, key) {var list = obj.className? obj.className.split(" "): [] - return obj.className = list.concat(kit.List(arguments, function(value, index) { - return index > 0 && list.indexOf(value) == -1? value: undefined - })).join(" ") - }, - del: function(obj, key) { - var list = kit.List(arguments, function(value, index) {return index > 0? value: undefined}) - return obj.className = kit.List(obj.className.split(" "), function(value) { - return list.indexOf(value) == -1? value: undefined - }).join(" ") - }, - }, - ModifyView: function(which, args) { - var width = document.body.clientWidth-4 - var height = document.body.clientHeight-4 - kit.Item(args, function(key, value) {var w = h = value - if (typeof(value) == "object") {w = value[0], h = value[1]} - switch (key) { - case "dialog": // 设置宽高 - if (w > width) {w = width} - if (h > height) {h = height} - args["top"] = (height-h)/2 - args["left"] = (width-w)/2 - args["width"] = w - args["height"] = h - break - case "window": // 设置边距 - args["top"] = h/2 - args["left"] = w/2 - args["width"] = width-w-20 - args["height"] = height-h-20 - break - default: - return - } - delete(args[key]) - }) - - var list = ["top", "left", "width", "height", "padding", "margin"] - kit.Item(args, function(key, value) { - typeof value == "number" && list.indexOf(key) != -1 && (args[key] = value+"px") - }) - return kit.ModifyNode(which, {style: args}) - }, - ModifyNode: function(which, html) { - var node = typeof which == "string"? document.querySelector(which): which - typeof html == "string"? (node.innerHTML = html): kit.Item(html, function(key, value) { - typeof value != "object"? (node[key] = value): kit.Item(value, function(item, value) { - node[key] && (node[key][item] = value) - }) - }) - return node - }, - CreateNode: function(element, html) {return kit.ModifyNode(document.createElement(element), html)}, - AppendChild: function(parent, children, subs) { - if (typeof children == "string") { - var elm = kit.CreateNode(children, subs) - return parent.append(elm), elm - } - - // 基本属性: name value title - // 基本内容: inner innerHTML - // 基本样式: style className - // 基本事件: click dataset - // - // 按键: button select - // 输入: input password - // 输出: label img row - // - // 树状结构: tree fork leaf - // 普通视图: view text code - // 加载文件: include require styles - // - // 基本结构: type data list - - subs = subs || {} - children.forEach(function(child, i) {if (kit.isNone(child)) {return} - var type = child.type || "div", data = child.data || {} - var name = child.name || data.name - - kit.List([ - "name", "value", "title", - "innerHTML", - "className", - "dataset", - ], function(key) { - kit.notNone(child[key]) && (data[key] = child[key]) - }) - kit.notNone(child.click) && (data.onclick = child.click) - kit.notNone(child.inner) && (data.innerHTML = child.inner) - kit.notNone(child.style) && (data.style = typeof child.style == "string"? child.style: kit.Item(child.style, function(key, value) { - return [key, ": ", kit.pixs(key, value)].join("") - }).join("; ")) - - if (kit.notNone(child.button)) {var list = kit.List(child.button) - type = "button", name = name || list[0] - data.innerText = list[0], data.onclick = function(event) { - kit._call(list[1], [event, list[0]]) - } - - } else if (child.select) {var list = child.select - type = "select", name = name || list[0][0] - data.onchange = function(event) { - kit._call(list[1], [event, event.target.value]) - } - child.list = list[0].slice(1).map(function(value) { - return {type: "option", value: value, inner: value} - }) - data.className = list[0][0] || "" - - } else if (child.input) {var list = kit.List(child.input) - type = "input", name = name || list[0] - data.onkeydown = function(event) { - kit._call(list[1], [event]) - } - data.onkeyup = function(event) { - kit._call(list[2], [event]) - } - - } else if (child.password) {var list = kit.List(child.password) - type = "input", name = name || list[0] - data.type = "password" - - } else if (child.label) {var list = kit.List(child.label) - type = "label", data.innerText = list[0] - - } else if (child.img) {var list = kit.List(child.img) - type = "img", data.src = list[0], data.onload = function(event) { - kit._call(list[1], [event]) - } - - } else if (child.row) { - type = "tr" - child.list = child.row.map(function(item) {return {text: [item, child.sub||"td"]}}) - - } else if (child.tree) { - type = "ul", child.list = child.tree - - } else if (child.fork) {var list = kit.List(child.fork) - type = "li", child.list = [ - {"text": [list[0], "div"], "click": function(event) { - kit._call(list[2], [event]) - }}, - {"type": "ul", "list": list[1]}, - ] - - } else if (child.leaf) {var list = kit.List(child.leaf) - type = "li" - child.list = [{"text": [list[0], "div"]}] - data.onclick = function(event) { - kit._call(list[1], [event]) - } - - } else if (child.view) {var list = kit.List(child.view); - (list.length > 0 && list[0]) && (data.className = list[0]) - type = list[1] || "div" - data.innerHTML = list[2] || "" - name = name || list[3] || "" - - } else if (child.text) {var list = kit.List(child.text) - data.innerHTML = list[0] - type = list[1] || "pre" - list.length > 2 && (data.className = list[2]) - - } else if (child.code) {var list = kit.List(child.code) - type = "code" - child.list = [{type: "pre" ,data: {innerText: list[0]}, name: list[1]||""}] - list.length > 2 && (data.className = list[2]) - - } else if (child.script) { - type = "script", data.innerHTML = child.script - - } else if (child.include) {var list = kit.List(child.include) - type = "script", data.type = "text/javascript" - data.src = list[0], data.onload = function(event) { - kit._call(list[1], [event]) - } - - } else if (child.require) {var list = kit.List(child.require) - type = "link", data.type = "text/css", data.rel = "stylesheet" - data.href = list[0], data.onload = function(event) { - kit._call(list[1], [event]) - } - - } else if (child.styles) { - type = "style", data.type = "text/css" - data.innerHTML = typeof child.styles == "string"? child.styles: kit.Item(child.styles, function(key, value) { - return key + " {\n" + kit.Item(value, function(item, value) { - return [" ", item, ": ", kit.pixs(value)].join("") - }).join(";\n") + "\n}\n" - }).join("") - } - - name = name || data.className || type - var node = kit.CreateNode(type, data) - child.list && kit.AppendChild(node, child.list, subs) - subs.first || (subs.first = node), subs.last = node - name && (subs[name] = node) - parent && parent.append && parent.append(node) - }) - return subs - }, - AppendChilds: function(parent, children, subs) { - return parent.innerHTML = "", kit.AppendChild(parent, children, subs) - }, - InsertChild: function (parent, position, element, children) { - var elm = kit.CreateNode(element) - kit.AppendChild(elm, children) - return parent.insertBefore(elm, position || parent.firstElementChild) - }, - CreateMeta: function(type, name, meta) { - meta = meta || {} - meta.data = meta.data || {} - switch (type) { - case "input": - meta.type = type - meta.name = name - kit.classList.add(meta, name) - kit.SetDefault(meta.data, "title", name) - kit.SetDefault(meta.data, "placeholder", name) - } - return meta - }, - - // HTML控件操作 - AppendActions: function(parent, list, cb, diy) { - parent.innerHTML = "", kit.AppendAction(parent, list, cb, diy) - }, - AppendAction: function(parent, list, cb, diy) { - if (diy) { - return kit.AppendChild(parent, kit.List(list, function(item, index) { - return item === ""? {view: ["space"]}: - typeof item == "string"? {view: ["item", "div", item], click: function(event) { - kit._call(cb, [event, item]) - }}: item.forEach? {view: item[0], list: kit.List(item.slice(1), function(value) {return {text: [value, "div", "item"], click: function(event) { - kit._call(cb, [event, value]) - }}})}: item - })) - } - return kit.AppendChild(parent, kit.List(list, function(item, index) { - return item === ""? {view: ["space"]}: - typeof item == "string"? {button: [item, cb]}: - item.forEach? {select: [item, cb]}: item - })) - }, - AppendTable: function(table, data, fields, cb, cbs) {if (!data || !fields) {return} - kit.AppendChild(table, [{row: fields, sub: "th"}]) - data.forEach(function(row, i) { - var tr = kit.AppendChild(table, "tr", {className: "normal"}) - tr.Meta = row, fields.forEach(function(key, j) { - var td = kit.AppendChild(tr, "td", kit.Color(row[key])) - - if (key == "when") {td.className = "when"} - if ((row[key]||"").startsWith("http")) { - td.innerHTML = ""+row[key]+"" - } - - cb && (td.onclick = function(event) { - kit._call(cb, [row[key], key, row, i, tr, event]) - }) - cbs && (td.oncontextmenu = function(event) { - kit._call(cbs, [row[key], key, row, i, tr, event]) - event.stopPropagation() - event.preventDefault() - }) - }) - }) - return table - }, - RangeTable: function(table, index, sort_asc) { - var list = kit.Selector(table, "tr", function(tr) { - return tr.style.display == "none" || kit.classList.has(tr, "hide")? null: tr - }).slice(1) - - var is_time = true, is_number = true - kit.List(list, function(tr) { - var text = tr.childNodes[index].innerText - is_time = is_time && Date.parse(text) > 0 - is_number = is_number && !isNaN(parseInt(text)) - }) - - var num_list = kit.List(list, function(tr) { - var text = tr.childNodes[index].innerText - return is_time? Date.parse(text): - is_number? parseInt(text): text - }) - - for (var i = 0; i < num_list.length; i++) { - for (var j = i+1; j < num_list.length; j++) { - if (sort_asc? num_list[i] < num_list[j]: num_list[i] > num_list[j]) { - var temp = num_list[i] - num_list[i] = num_list[j] - num_list[j] = temp - var temp = list[i] - list[i] = list[j] - list[j] = temp - } - } - var tbody = list[i].parentElement - list[i].parentElement && tbody.removeChild(list[i]) - tbody.appendChild(list[i]) - } - }, - OrderTable: function(table, field, cb, cbs) {if (!table) {return} - table.oncontextmenu = table.onclick = function(event) {var target = event.target - target.parentElement.childNodes.forEach(function(item, i) {if (item != target) {return} - if (target.tagName == "TH") { - var dataset = target.dataset - dataset["sort_asc"] = (dataset["sort_asc"] == "1") ? 0: 1 - kit.RangeTable(table, i, dataset["sort_asc"] == "1") - } else if (target.tagName == "TD") {var index = 0 - kit.Selector(table, "tr", function(item, i) {item == target.parentElement && (index = i)}) - var name = target.parentElement.parentElement.querySelector("tr").childNodes[i].innerText - name.startsWith(field) && kit._call(event.type=="contextmenu"? cbs: cb, [event, item.innerText, name, item.parentNode.Meta, index]) - } else if (target.parentNode.tagName == "TD"){ - kit.Selector(table, "tr", function(item, i) {item == target.parentElement.parentElement && (index = i)}) - var name = target.parentElement.parentElement.parentElement.querySelector("tr").childNodes[i].innerText - name.startsWith(field) && kit._call(event.type=="contextmenu"? cbs: cb, [event, item.innerText, name, item.parentNode.Meta, index]) - } - }) - kit.CopyText() - } - return true - }, - Change: function(target, cb) { - var value = target.value - function reset(event) { - value != event.target.value && kit._call(cb, [event.target.value, value]) - target.innerHTML = event.target.value - } - kit.AppendChilds(target, [{type: "input", value: target.innerText, data: { - onblur: reset, - onkeydown: function(event) { - page.oninput(event), event.key == "Enter" && reset(event) - }, - }}]).last.focus() - }, - - // HTML显示文本 - OrderCode: function(code) {if (!code) {return} - code.onclick = function(event) {kit.CopyText()} - kit.Selector(code, "a", function(item) { - item.target = "_blank" - }) - }, - OrderLink: function(link) {link.target = "_blank"}, - OrderText: function(pane, text) { - text.querySelectorAll("a").forEach(function(value, index, array) { - kit.OrderLink(value, pane) - }) - text.querySelectorAll("code").forEach(function(value, index, array) { - kit.OrderCode(value) - }) - text.querySelectorAll("table").forEach(function(value, index, array) { - kit.OrderTable(value) - }) - - var i = 0, j = 0, k = 0 - var h0 = [], h2 = [], h3 = [] - text.querySelectorAll("h2,h3,h4").forEach(function(value, index, array) { - var id = "" - var text = value.innerText - var ratio = parseInt(value.offsetTop/pane.scrollHeight*100) - if (value.tagName == "H2") { - j=k=0 - h2 = [] - id = ++i+"." - text = id+" "+text - h0.push({"fork": [text+" ("+ratio+"%)", h2, function(event) { - location.hash = id - }]}) - } else if (value.tagName == "H3") { - k=0 - h3 = [] - id = i+"."+(++j) - text = id+" "+text - h2.push({"fork": [text+" ("+ratio+"%)", h3, function(event) { - location.hash = id - }]}) - } else if (value.tagName == "H4") { - id = i+"."+j+"."+(++k) - text = id+" "+text - h3.push({"leaf": [text+" ("+ratio+"%)", function(event) { - location.hash = id - }]}) - } - value.innerText = text - value.id = id - }) - return h0 - }, - Position: function(which) { - return (parseInt((which.scrollTop + which.clientHeight) / which.scrollHeight * 100)||0)+"%" - }, - // HTML输入文本 - CopyText: function(text) { - if (text) { - var input = kit.AppendChild(document.body, [{type: "textarea", inner: text}]).last - input.focus(), input.setSelectionRange(0, text.length) - } - - text = window.getSelection().toString() - if (text == "") {return ""} - - kit.History("txt", -1) && kit.History("txt", -1).data == text || kit.History("txt", -1, text) && document.execCommand("copy") - input && document.body.removeChild(input) - return text - }, - DelText: function(target, start, count) { - target.value = target.value.substring(0, start)+target.value.substring(start+(count||target.value.length), target.value.length) - target.setSelectionRange(start, start) - }, - HitText: function(target, text) { - var start = target.selectionStart - for (var i = 1; i < text.length+1; i++) { - var ch = text[text.length-i] - if (target.value[start-i] != ch && kit.History("key", -i).data != ch) { - return false - } - } - return true - }, - Delay: function(time, cb) { - return setTimeout(cb, time) - }, - - // 数据容器迭代 - Push: function(list, value) {list = list || [] - return (kit.notNone||check)(value) && list.push(value), list - }, - List: function(obj, cb, interval, cbs) {obj = typeof obj == "string"? [obj]: (obj || []) - if (interval > 0) { - function loop(i) {if (i >= obj.length) {return kit._call(cbs)} - kit._call(cb, [obj[i], i, obj]), setTimeout(function() {loop(i+1)}, interval) - } - obj.length > 0 && setTimeout(function() {loop(0)}, interval/4) - return obj - } - - var list = [] - for (var i = 0; i < obj.length; i++) { - kit.Push(list, kit._call(cb, [obj[i], i, obj])) - } - return list - }, - Item: function(obj, cb) {var list = [] - for (var k in obj) { - kit.Push(list, kit._call(cb, [k, obj[k]])) - } - return list - }, - Items: function(obj, cb) {var list = [] - for (var key in obj) { - list = list.concat(kit.List(obj[key], function(value, index, array) { - return kit._call(cb, [value, index, key, obj]) - })) - } - return list - }, - Span: function(list) {list = list || [] - list.span = function(value, style) { - return kit.List(arguments, function(item) { - kit._call(list, list.push, typeof item == "string"? [item]: ['', item[0], ""]) - }), list.push(""), list - } - return list - }, - Opacity: function(obj, interval, list) { - kit.List(kit.Value(list, [0, 0.2, 0.4, 0.6, 1.0]), function(value) { - obj.style.opacity = value - }, kit.Value(interval, 150)) - }, - Selector: function(obj, item, cb, interval, cbs) {var list = [] - kit.List(obj.querySelectorAll(item), function(item, index, array) { - kit.Push(list, kit._call(cb, [item, index, array])) - }, interval, cbs) - - for (var i = list.length-1; i >= 0; i--) { - if (list[i] !== "") {break} - list.pop() - } - return list - }, - SetDefault: function(obj, key, value) { - if (obj[key] == undefined) { - obj[key] = value - } - return - }, - // 数据类型转换 - Trans: function(c) { - return typeof c == "string"? c.split(" "): c - }, - isNone: function(c) {return c === undefined || c === null}, - notNone: function(c) {return !kit.isNone(c)}, - isSpace: function(c) {return c == " " || c == "Enter"}, - Format: function(objs) {return JSON.stringify(objs)}, - Origin: function(s) { - s = s.replace(//g, ">") - return s - }, - Color: function(s) {if (!s) {return s} - s = s.replace(/\033\[1m/g, "") - s = s.replace(/\033\[36m/g, "") - s = s.replace(/\033\[33m/g, "") - s = s.replace(/\033\[32m/g, "") - s = s.replace(/\033\[32;1m/g, "") - s = s.replace(/\033\[31m/g, "") - s = s.replace(/\033\[0m/g, "") - s = s.replace(/\033\[m/g, "") - s = s.replace(/\n/g, "") - return s - }, - Value: function() { - for (var i = 0; i < arguments.length; i++) { - switch (arguments[i]) { - case undefined: - case null: - case "": - break - default: - return arguments[i] - } - } - }, - distance: function(x0, y0, x1, y1) {return Math.sqrt(Math.pow(x1-x0, 2)+Math.pow(y1-y0, 2))}, - number: function(d, n) { - var result = [] - while (d>0) { - result.push(d % 10) - d = parseInt(d / 10) - n-- - } - while (n > 0) { - result.push("0") - n-- - } - result.reverse() - return result.join("") - }, - time: function(t, fmt) { - var now = t? new Date(t): new Date() - fmt = fmt || "%y-%m-%d %H:%M:%S" - fmt = fmt.replace("%y", now.getFullYear()) - fmt = fmt.replace("%m", kit.number(now.getMonth()+1, 2)) - fmt = fmt.replace("%d", kit.number(now.getDate(), 2)) - fmt = fmt.replace("%H", kit.number(now.getHours(), 2)) - fmt = fmt.replace("%M", kit.number(now.getMinutes(), 2)) - fmt = fmt.replace("%S", kit.number(now.getSeconds(), 2)) - return fmt - }, - size: function(obj, width, height) {obj.style.width = width+"px", obj.style.height = height+"px"}, - pixs: function(key, value) { - var list = ["top", "left", "width", "height", "padding", "margin"] - return typeof value == "number" && list.indexOf(key) != -1? value+"px": value - }, - type: function(obj, type) {return type == undefined? typeof obj: typeof obj == type? obj: null}, - _call: function() {// obj, cb, arg - var index = 0, obj, cb, arg; - (obj = kit.type(arguments[index], "object")) && index++ - (cb = kit.type(arguments[index], "function")), index++ - (arg = kit.type(arguments[index], "object")) && index++ - - arg = arg || [] - while (index < arguments.length) { - arg.push(arguments[index++]) - } - return typeof cb == "function"? cb.apply(obj||window, arg||[]): arg && arg.length > 0? arg[0]: null - }, -}; return kit})() - -function Editor(run, plugin, option, output, width, height, space, msg) { - exports = ["dir", "path", "dir"] - msg.append && kit.OrderTable(kit.AppendTable(kit.AppendChild(output, "table"), msg.Table(), msg.append), exports[1], function(event, value, name, line) { - page.Sync("plugin_"+exports[0]).set(plugin.onexport[exports[2]||""](value, name, line)) - }); - - var args = [option.pod.value, option.dir.value] - - if (msg.file) { - var action = kit.AppendAction(kit.AppendChild(output, [{view: ["action"]}]).last, [ - "追加", "提交", "取消", - ], function(value, event) { - switch (value) { - case "追加": - run(event, args.concat(["dir_sed", "add"])) - break - case "提交": - run(event, args.concat(["dir_sed", "put"])) - break - case "取消": - break - } - }) - - kit.AppendChild(output, [{view: ["edit", "table"], list: (msg.result||[]).map(function(value, index) { - return {view: ["line", "tr"], list: [{view: ["num", "td", index+1]}, {view: ["txt", "td"], list: [{value: value, style: {width: width+"px"}, input: [value, function(event) { - if (event.key == "Enter") { - field.Run(event, args.concat(["dir_sed", "set", index, event.target.value])) - } - }]}]}]} - })}]) - } -} -function Canvas(plugin, option, output, width, height, space, msg) { - var keys = [], data = {}, max = {}, nline = 0 - var nrow = msg[msg.append[0]].length - var step = width / (nrow - 1) - msg.append.forEach(function(key, index) { - var list = [] - msg[key].forEach(function(value, index) { - var v = parseInt(value) - !isNaN(v) && (list.push((value.indexOf("-") == -1)? v: value), v > (max[key]||0) && (max[key] = v)) - }) - list.length == nrow && (keys.push(key), data[key] = list, nline++) - }) - - var conf = { - font: "monospace", text: "hi", tool: "stroke", style: "black", - type: "ticket", shape: "drawText", means: "drawPoint", - limits: {scale: 3, drawPoint: 1, drawPoly: 3}, - - axies: {style: "black", width: 2}, - xlabel: {style: "red", width: 2, height: 5}, - plabel: {style: "red", font: "16px monospace", offset: 10, height: 20, length: 20}, - data: {style: "black", width: 1}, - - mpoint: 10, - play: 500, - } - - var view = [], ps = [], point = [], now = {}, index = 0 - var trap = false, label = false - - var what = { - reset: function(x, y) { - canvas.resetTransform() - canvas.setTransform(1, 0, 0, -1, space+(x||0), height+space-(y||0)) - canvas.strokeStyle = conf.data.style - canvas.fillStyle = conf.data.style - return what - }, - clear: function() { - var p0 = what.transform({x:-width, y:-height}) - var p1 = what.transform({x:2*width, y:2*height}) - canvas.clearRect(p0.x, p0.y, p1.x-p0.x, p1.y-p0.y) - return what - }, - - move: function(meta) { - var p0 = meta.ps[0] || {x:0, y:0} - var p1 = meta.ps[1] || now - canvas.save(), what.clear().drawLine(meta) - canvas.translate(p1.x-p0.x, p1.y-p0.y) - what.drawData().drawView() - meta.ps.length < 2 && canvas.restore() - }, - scale: function(meta) { - var ps = meta.ps - var p0 = ps[0] || {x:0, y:0} - var p1 = ps[1] || now - var p2 = ps[2] || now - - if (ps.length > 1) { - canvas.save(), what.clear() - what.drawLine({ps: [p0, {x: p1.x, y: p0.y}]}) - what.drawLine({ps: [{x: p1.x, y: p0.y}, p1]}) - what.drawLine({ps: [p0, {x: p2.x, y: p0.y}]}) - what.drawLine({ps: [{x: p2.x, y: p0.y}, p2]}) - canvas.scale((p2.x-p0.x)/(p1.x-p0.x), (p2.y-p0.y)/(p1.y-p0.y)) - what.drawData().drawView() - meta.ps.length < 3 && canvas.restore() - } - }, - rotate: function(meta) { - var p0 = meta.ps[0] || {x:0, y:0} - var p1 = meta.ps[1] || now - canvas.save(), what.clear().drawLine(meta) - canvas.rotate(Math.atan2(p1.y-p0.y, p1.x-p0.x)) - what.drawData().drawView() - meta.ps.length < 2 && canvas.restore() - }, - - draw: function(meta) { - function trans(value) { - if (value == "random") { - return ["black", "red", "green", "yellow", "blue", "purple", "cyan", "white"][parseInt(Math.random()*8)] - } - return value - } - canvas.strokeStyle = trans(meta.style || conf.style) - canvas.fillStyle = trans(meta.style || conf.style) - canvas[meta.tool||conf.tool]() - return meta - }, - drawText: function(meta) { - var p0 = meta.ps[0] || {x:0, y:0} - var p1 = meta.ps[1] || now - var t = meta.text||status.cmd.value||conf.text - - canvas.save() - canvas.translate(p0.x, p0.y) - canvas.scale(1, -1) - canvas.rotate(-Math.atan2(p1.y-p0.y, p1.x-p0.x)) - what.draw(meta) - canvas.font=kit.distance(p0.x, p0.y, p1.x, p1.y)/t.length*2+"px "+conf.font - canvas[(meta.tool||conf.tool)+"Text"](t, 0, 0) - canvas.restore() - return meta - }, - drawPoint: function(meta) { - meta.ps.concat(now).forEach(function(p) { - canvas.save() - canvas.translate(p.x, p.y) - canvas.beginPath() - canvas.moveTo(-conf.mpoint, 0) - canvas.lineTo(conf.mpoint, 0) - canvas.moveTo(0, -conf.mpoint) - canvas.lineTo(0, conf.mpoint) - what.draw(meta) - canvas.restore() - }) - return meta - }, - drawLine: function(meta) { - var p0 = meta.ps[0] || {x:0, y:0} - var p1 = meta.ps[1] || now - canvas.save() - canvas.beginPath() - canvas.moveTo(p0.x, p0.y) - canvas.lineTo(p1.x, p1.y) - what.draw(meta) - canvas.restore() - return meta - }, - drawPoly: function(meta) { - var ps = meta.ps - canvas.save() - canvas.beginPath() - canvas.moveTo(ps[0].x, ps[0].y) - for (var i = 1; i < ps.length; i++) { - canvas.lineTo(ps[i].x, ps[i].y) - } - ps.length < conf.limits.drawPoly && canvas.lineTo(now.x, now.y) - what.draw(meta) - canvas.restore() - return meta - }, - drawRect: function(meta) { - var p0 = meta.ps[0] || {x:0, y:0} - var p1 = meta.ps[1] || now - canvas.save() - what.draw(meta) - canvas[(meta.tool||conf.tool)+"Rect"](p0.x, p0.y, p1.x-p0.x, p1.y-p0.y) - canvas.restore() - return meta - }, - drawCircle: function(meta) { - var p0 = meta.ps[0] || {x:0, y:0} - var p1 = meta.ps[1] || now - canvas.save() - canvas.beginPath() - canvas.arc(p0.x, p0.y, kit.distance(p0.x, p0.y, p1.x, p1.y), 0, Math.PI*2, true) - what.draw(meta) - canvas.restore() - return meta - }, - drawEllipse: function(meta) { - var p0 = meta.ps[0] || {x:0, y:0} - var p1 = meta.ps[1] || now - var r0 = Math.abs(p1.x-p0.x) - var r1 = Math.abs(p1.y-p0.y) - - canvas.save() - canvas.beginPath() - canvas.translate(p0.x, p0.y) - r1 > r0? (canvas.scale(r0/r1, 1), r0 = r1): canvas.scale(1, r1/r0) - canvas.arc(0, 0, r0, 0, Math.PI*2, true) - what.draw(meta) - canvas.restore() - return meta - }, - - drawAxies: function() { - canvas.beginPath() - canvas.moveTo(-space, 0) - canvas.lineTo(width+space, 0) - canvas.moveTo(0, -space) - canvas.lineTo(0, height+space) - canvas.strokeStyle = conf.axies.style - canvas.lineWidth = conf.axies.width - canvas.stroke() - return what - }, - drawXLabel: function(step) { - canvas.beginPath() - for (var pos = step; pos < width; pos += step) { - canvas.moveTo(pos, 0) - canvas.lineTo(pos, -conf.xlabel.height) - } - canvas.strokeStyle = conf.xlabel.style - canvas.lineWidth = conf.xlabel.width - canvas.stroke() - return what - }, - - figure: { - trend: { - draw: function() { - what.drawAxies().drawXLabel(step) - canvas.beginPath() - for (var key in data) { - data[key].forEach(function(value, i) { - i == 0? canvas.moveTo(0, value/max[key]*height): canvas.lineTo(step*i, value/max[key]*height) - i == index && (canvas.moveTo(step*i, 0), canvas.lineTo(step*i, value/max[key]*height)) - }) - } - canvas.strokeStyle = conf.data.style - canvas.lineWidth = conf.data.width - canvas.stroke() - }, - show: function(p) { - index = parseInt(p.x/step) - canvas.moveTo(p.x, -space) - canvas.lineTo(p.x, height) - canvas.moveTo(-space, p.y) - canvas.lineTo(width, p.y) - return p - }, - }, - ticket: { - draw: function() { - what.drawAxies().drawXLabel(step) - if (keys.length < 3) { - return - } - - var sum = 0, total = 0 - for (var i = 0; i < nrow; i++) { - sum += data[keys[1]][i] - sum > total && (total = sum) - sum -= data[keys[2]||keys[1]][i] - } - if (!data["sum"]) { - var sum = 0, max = 0, min = 0, end = 0 - keys = keys.concat(["sum", "max", "min", "end"]) - data["sum"] = [] - data["max"] = [] - data["min"] = [] - data["end"] = [] - for (var i = 0; i < nrow; i++) { - max = sum + data[keys[1]][i] - min = sum - data[keys[2||keys[1]]][i] - end = sum + data[keys[1]][i] - data[keys[2]||keys[1]][i] - data["sum"].push(sum) - data["max"].push(max) - data["min"].push(min) - data["end"].push(end) - sum = end - } - msg.append.push("sum") - msg.sum = data.sum - msg.append.push("max") - msg.max = data.max - msg.append.push("min") - msg.min = data.min - msg.append.push("end") - msg.end = data.end - } - - for (var i = 0; i < nrow; i++) { - canvas.beginPath() - canvas.moveTo(step*i, data["min"][i]/total*height) - if (data["sum"][i] < data["end"][i]) { - canvas.strokeStyle = "white", canvas.lineTo(step*i, data["sum"][i]/total*height), canvas.stroke() - canvas.fillStyle = "white", canvas.fillRect(step*i-step/3, data["sum"][i]/total*height, step/3*2, (data["end"][i]-data["sum"][i])/total*height) - canvas.moveTo(step*i, data["end"][i]/total*height) - } else { - canvas.strokeStyle = "black", canvas.lineTo(step*i, data["end"][i]/total*height), canvas.stroke() - canvas.fillStyle = "black", canvas.fillRect(step*i-step/3, data["sum"][i]/total*height, step/3*2, (data["end"][i]-data["sum"][i])/total*height) - canvas.moveTo(step*i, data["sum"][i]/total*height) - } - canvas.lineTo(step*i, data["max"][i]/total*height), canvas.stroke() - } - // canvas.strokeStyle = conf.data.style - // canvas.lineWidth = conf.data.width - // canvas.stroke() - }, - show: function(p) { - index = parseInt(p.x/step) - canvas.moveTo(p.x, -space) - canvas.lineTo(p.x, height) - canvas.moveTo(-space, p.y) - canvas.lineTo(width, p.y) - return p - }, - }, - stick: { - draw: function() { - what.drawAxies().drawXLabel(step) - canvas.beginPath() - - var total = 0 - for (var key in max) { - total += max[key] - } - - for (var i = 0; i < nrow; i++) { - canvas.moveTo(step*i, 0) - for (var key in data) { - canvas.lineTo(step*i, data[key][i]/total*height) - canvas.moveTo(step*i-step/2, data[key][i]/total*height) - canvas.lineTo(step*i+step/2, data[key][i]/total*height) - canvas.moveTo(step*i, data[key][i]/total*height) - } - } - canvas.strokeStyle = conf.data.style - canvas.lineWidth = conf.data.width - canvas.stroke() - }, - show: function(p) { - index = parseInt(p.x/step) - canvas.moveTo(p.x, -space) - canvas.lineTo(p.x, height) - canvas.moveTo(-space, p.y) - canvas.lineTo(width, p.y) - return p - }, - }, - weight: { - conf: { - space: 20, - focus: "white", - style: "black", - width: 1, - least: 0.01, - }, - draw: function() { - var that = this - var space = width / (nline+1) - - canvas.translate(0, height/2) - for (var key in data) { - var total = 0 - data[key].forEach(function(value) { - total += value - }) - - var sum = 0 - canvas.translate(space, 0) - data[key].forEach(function(value, i) { - if (value/total < that.conf.least) { - return - } - - var a = sum/total*Math.PI*2 - var b = (sum+value)/total*Math.PI*2 - sum+=value - - canvas.beginPath() - canvas.moveTo(0, 0) - canvas.arc(0, 0, (space/2)-that.conf.space, a, b, false) - canvas.closePath() - - if (i == index) { - canvas.fillStyle = that.conf.focus - canvas.fill() - } else { - canvas.strokeStyle = that.conf.style - canvas.lineWidth = that.conf.width - canvas.stroke() - } - }) - } - }, - show: function(p) { - var nspace = width / (nline+1) - var which = parseInt((p.x-nspace/2)/nspace) - which >= nline && (which = nline-1), which < 0 && (which = 0) - - var q = what.reverse(p) - canvas.translate((which+1)*nspace, height/2) - var p = what.transform(q) - - var a = Math.atan2(p.y, p.x) - a < 0 && (a += Math.PI*2) - var pos = a/2/Math.PI - - var total = 0 - data[keys[which]].forEach(function(value) { - total += value - }) - var sum = 0, weight = 0 - data[keys[which]].forEach(function(value, i) { - sum += value, sum / total < pos && (index = i+1) - index == i && (weight = parseInt(value/total*100)) - }) - - canvas.moveTo(0, 0) - canvas.lineTo(p.x, p.y) - canvas.lineTo(p.x+conf.plabel.length, p.y) - - canvas.scale(1, -1) - canvas.fillText("weight: "+weight+"%", p.x+conf.plabel.offset, -p.y+conf.plabel.offset) - canvas.scale(1, -1) - return p - }, - }, - }, - - drawData: function() { - canvas.save() - what.figure[conf.type].draw() - canvas.restore() - return what - }, - drawView: function() { - view.forEach(function(view) { - view.meta && what[view.type](view.meta) - }) - return what - }, - drawLabel: function() { - if (!label) { return what } - - index = 0 - canvas.save() - canvas.font = conf.plabel.font || conf.font - canvas.fillStyle = conf.plabel.style || conf.style - canvas.strokeStyle = conf.plabel.style || conf.style - var p = what.figure[conf.type].show(now) - canvas.stroke() - - canvas.scale(1, -1) - p.x += conf.plabel.offset - p.y -= conf.plabel.offset - - if (width - p.x < 200) { - p.x -= 200 - } - canvas.fillText("index: "+index, p.x, -p.y+conf.plabel.height) - msg.append.forEach(function(key, i) { - msg[key][index] && canvas.fillText(key+": "+msg[key][index], p.x, -p.y+(i+2)*conf.plabel.height) - }) - canvas.restore() - return what - }, - drawShape: function() { - point.length > 0 && (what[conf.shape]({ps: point}), what[conf.means]({ps: point, tool: "stroke", style: "red"})) - return what - }, - - refresh: function() { - return what.clear().drawData().drawView().drawLabel().drawShape() - }, - cancel: function() { - point = [], what.refresh() - return what - }, - play: function() { - function cb() { - view[i] && what[view[i].type](view[i].meta) && (t = kit.Delay(view[i].type == "drawPoint"? 10: conf.play, cb)) - i++ - status.nshape.innerText = i+"/"+view.length - } - var i = 0 - what.clear().drawData() - kit.Delay(10, cb) - return what - }, - back: function() { - view.pop(), status.nshape.innerText = view.length - return what.refresh() - }, - push: function(item) { - item.meta && item.meta.ps < (conf.limits[item.type]||2) && ps.push(item) - status.nshape.innerText = view.push(item) - return what - }, - wait: function() { - status.cmd.focus() - return what - }, - trap: function(value, event) { - event.target.className = (trap = !trap)? "trap": "normal" - page.localMap = trap? what.input: undefined - }, - label: function(value, event) { - event.target.className = (label = !label)? "trap": "normal" - }, - - movePoint: function(p) { - now = p, status.xy.innerHTML = p.x+","+p.y; - (point.length > 0 || ps.length > 0 || label) && what.refresh() - }, - pushPoint: function(p) { - if (ps.length > 0) { - ps[0].meta.ps.push(p) > 1 && ps.pop(), what.refresh() - return - } - - point.push(p) >= (conf.limits[conf.shape]||2) && what.push({type: conf.shape, - meta: what[conf.shape]({ps: point, text: status.cmd.value||conf.text, tool: conf.tool, style: conf.style}), - }) && (point = []) - conf.means == "drawPoint" && what.push({type: conf.means, meta: what[conf.means]({ps: [p], tool: "stroke", style: "red"})}) - }, - transform: function(p) { - var t = canvas.getTransform() - return { - x: (p.x-t.c/t.d*p.y+t.c*t.f/t.d-t.e)/(t.a-t.c*t.b/t.d), - y: (p.y-t.b/t.a*p.x+t.b*t.e/t.a-t.f)/(t.d-t.b*t.c/t.a), - } - }, - reverse: function(p) { - var t = canvas.getTransform() - return { - x: t.a*p.x+t.c*p.y+t.e, - y: t.b*p.x+t.d*p.y+t.f, - } - }, - - check: function() { - view.forEach(function(item, index, view) { - item && item.send && plugin.Run(window.event||{}, item.send.concat(["type", item.type]), function(msg) { - msg.text && msg.text[0] && (item.meta.text = msg.text[0]) - msg.style && msg.style[0] && (item.meta.style = msg.style[0]) - msg.ps && msg.ps[0] && (item.meta.ps = JSON.parse(msg.ps[0])) - what.refresh() - }) - index == view.length -1 && kit.Delay(1000, what.check) - }) - }, - parse: function(txt) { - var meta = {}, cmds = [], rest = -1, send = [] - txt.trim().split(" ").forEach(function(item) { - switch (item) { - case "stroke": - case "fill": - meta.tool = item - break - case "black": - case "white": - case "red": - case "yellow": - case "green": - case "cyan": - case "blue": - case "purple": - meta.style = item - break - case "cmds": - rest = cmds.length - default: - cmds.push(item) - } - }), rest != -1 && (send = cmds.slice(rest+1), cmds = cmds.slice(0, rest)) - - var cmd = { - "t": "drawText", - "l": "drawLine", - "p": "drawPoly", - "r": "drawRect", - "c": "drawCircle", - "e": "drawEllipse", - }[cmds[0]] || cmds[0] - cmds = cmds.slice(1) - - var args = [] - switch (cmd) { - case "send": - plugin.Run(window.event, cmds, function(msg) { - kit.Log(msg) - }) - return - default: - meta.ps = [] - for (var i = 0; i < cmds.length; i+=2) { - var x = parseInt(cmds[i]) - var y = parseInt(cmds[i+1]) - !isNaN(x) && !isNaN(y) && meta.ps.push({x: x, y: y}) || (args.push(cmds[i]), i--) - } - } - meta.args = args - - switch (cmd) { - case "drawText": - meta.text = args.join(" "), delete(meta.args) - case "drawLine": - case "drawPoly": - case "drawRect": - case "drawCircle": - case "drawEllipse": - what.push({type: cmd, meta: what[cmd](meta), send:send}) - } - - return (what[cmd] || function() { - return what - })(meta) - }, - input: function(event) { - var map = what.trans[event.key] - map && action[map[0]] && (action[map[0]].value = map[1]) - map && what.trans[map[0]] && (map = what.trans[map[1]]) && (conf[map[0]] && (conf[map[0]] = map[1]) || what[map[0]] && what[map[0]]()) - what.refresh() - }, - trans: { - "股价图": ["type", "ticket"], - "折线图": ["type", "trend"], - "柱状图": ["type", "stick"], - "饼状图": ["type", "weight"], - - "移动": ["shape", "move"], - "旋转": ["shape", "rotate"], - "缩放": ["shape", "scale"], - - "文本": ["shape", "drawText"], - "直线": ["shape", "drawLine"], - "折线": ["shape", "drawPoly"], - "矩形": ["shape", "drawRect"], - "圆形": ["shape", "drawCircle"], - "椭圆": ["shape", "drawEllipse"], - - "辅助点": ["means", "drawPoint"], - "辅助线": ["means", "drawRect"], - - "画笔": ["tool", "stroke"], - "画刷": ["tool", "fill"], - - "黑色": ["style", "black"], - "红色": ["style", "red"], - "绿色": ["style", "green"], - "黄色": ["style", "yellow"], - "蓝色": ["style", "blue"], - "紫色": ["style", "purple"], - "青色": ["style", "cyan"], - "白色": ["style", "white"], - "随机色": ["style", "random"], - "默认色": ["style", "default"], - - "清屏": ["clear"], - "刷新": ["refresh"], - "取消": ["cancel"], - "播放": ["play"], - "回退": ["back"], - "输入": ["wait"], - - "标签": ["label"], - "快捷键": ["trap"], - - "x": ["折线图", "折线图"], - "y": ["折线图", "饼状图"], - - "a": ["移动", "旋转"], - "m": ["移动", "移动"], - "z": ["移动", "缩放"], - - "t": ["文本", "文本"], - "l": ["文本", "直线"], - "v": ["文本", "折线"], - "r": ["文本", "矩形"], - "c": ["文本", "圆形"], - "e": ["文本", "椭圆"], - - "s": ["画笔", "画笔"], - "f": ["画笔", "画刷"], - - "0": ["黑色", "黑色"], - "1": ["黑色", "红色"], - "2": ["黑色", "绿色"], - "3": ["黑色", "黄色"], - "4": ["黑色", "蓝色"], - "5": ["黑色", "紫色"], - "6": ["黑色", "青色"], - "7": ["黑色", "白色"], - "8": ["黑色", "随机色"], - "9": ["黑色", "默认色"], - - "j": ["刷新", "刷新"], - "g": ["播放", "播放"], - "b": ["回退", "回退"], - "q": ["清空", "清空"], - - "Escape": ["取消", "取消"], - " ": ["输入", "输入"], - }, - } - - var action = kit.AppendAction(kit.AppendChild(output, [{view: ["action"]}]).last, [ - ["", "股价图", "折线图", "柱状图", "饼状图"], - ["", "移动", "旋转", "缩放"], - ["", "文本", "直线", "折线", "矩形", "圆形", "椭圆"], - ["", "辅助点", "辅助线"], - ["", "画笔", "画刷"], - ["", "黑色", "红色", "绿色", "黄色", "蓝色", "紫色", "青色", "白色", "随机色", "默认色"], - "", "清屏", "刷新", "播放", "回退", - "", "标签", "快捷键", - ], function(event, value) { - var map = what.trans[value] - conf[map[0]] && (conf[map[0]] = map[1]) || what[map[0]] && what[map[0]](value, event) - what.refresh() - }) - - var canvas = kit.AppendChild(output, [{view: ["draw", "canvas"], data: {width: width+20, height: height+20, - onclick: function(event) { - what.pushPoint(what.transform({x: event.offsetX, y: event.offsetY}), event.clientX, event.clientY) - }, onmousemove: function(event) { - what.movePoint(what.transform({x: event.offsetX, y: event.offsetY}), event.clientX, event.clientY) - }, - }}]).last.getContext("2d") - - var status = kit.AppendAction(kit.AppendChild(output, [{view: ["status"]}]).last, [{name: "nshape"}, {"className": "cmd", style: {width: (output.clientWidth - 100)+"px"}, data: {autocomplete: "off"}, input: ["cmd", function(event) { - var target = event.target - event.type == "keyup" && event.key == "Enter" && what.parse(target.value) && (!target.History && (target.History=[]), - target.History.push(target.value), target.Current=target.History.length, target.value = "") - event.type == "keyup" && page.oninput(event), event.stopPropagation() - - }]}, {name: "xy"}], function(value, name, event) { - - }) - - return what.reset().refresh() -} - diff --git a/usr/librarys/weixin.js b/usr/librarys/weixin.js deleted file mode 100644 index e3b65c83..00000000 --- a/usr/librarys/weixin.js +++ /dev/null @@ -1,43 +0,0 @@ -function scan(event, cb) { - wx.scanQRCode({ - needResult: 1, - scanType: ["qrCode", "barCode"], - desc: "what", - success: function(res) { - cb(res.resultStr) - }, - fail: function(res) { - alert(res.errMsg) - }, - }) -} -function close() { - wx.closeWindow({ - success: function(res) { - alert(res.resultStr) - }, - fail: function(res) { - alert(res.errMsg) - }, - }) -} - -function choose() { - wx.chooseImage({ - count: 1, // 默认9 - sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有 - sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有 - success: function (res) { - var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片 - }, - fail: function(res) { - alert(res.errMsg) - }, - }); -} -function wopen(event) { - wx.openAddress({success: function(res) { - context.Command("show", res) - }}) -} - diff --git a/usr/librarys/wiki.css b/usr/librarys/wiki.css deleted file mode 100644 index 1d089a5e..00000000 --- a/usr/librarys/wiki.css +++ /dev/null @@ -1,37 +0,0 @@ -fieldset.Tree>div.output>div.gap { - height:6px; - clear:both; -} -fieldset.Tree>div.output>div.tree>div { - border:solid 2px green; - padding:4px; - float:left; -} -fieldset.Tree>div.output>div.list>div { - border:solid 1px green; - padding:4px; - float:left; -} - -fieldset.Text>div.output>div.menu { - border-right:solid 1px black; - padding-right:10px; - overflow:auto; -} -fieldset.Text>div.output>div.menu.left { - float:left; -} -fieldset.Text>div.output>div.menu li>div:hover { - background-color:red; -} -fieldset.Text>div.output>div.text { - padding:10px; - overflow:auto; -} -fieldset.Text>div.output>div.text strong { - background-color:yellow; - border-left:solid 2px green; - border-top:solid 2px green; - color:red; -} - diff --git a/usr/librarys/wiki.js b/usr/librarys/wiki.js deleted file mode 100644 index 63c15bee..00000000 --- a/usr/librarys/wiki.js +++ /dev/null @@ -1,180 +0,0 @@ -var page = Page({check: false, conf: {border: 4}, - onlayout: function(event, sizes) { - var height = document.body.clientHeight-page.conf.border - var width = document.body.clientWidth-page.conf.border - page.conf.height = height - page.conf.width = width - - sizes = sizes || {} - sizes.header == undefined && (sizes.header = page.header.clientHeight) - sizes.footer == undefined && (sizes.footer = page.footer.clientHeight) - page.header.Pane.Size(width, sizes.header) - page.footer.Pane.Size(width, sizes.footer) - - sizes.tree == undefined && (sizes.tree = page.tree.clientHeight) - // page.tree.Size(width, sizes.tree) - - sizes.text = height - sizes.tree - sizes.header - sizes.footer - page.conf.border * 3 - page.text.Pane.Size(width, sizes.text) - }, - oncontrol: function(event) { - if (event.ctrlKey) { - switch (event.key) { - case "t": - page.tree.Pane.Tree() - break - case "m": - page.text.Pane.Menu() - break - case "n": - page.tree.Pane.Tree("none") - page.text.Pane.Menu("none") - break - } - } - }, - - Action: { - title: function(event, item, value, page) { - ctx.Search("layout", ctx.Search("layout")? "": "max") - }, - user: function(event, item, value, page) { - page.carte.Pane.Show(event, shy({ - "修改昵称": function(event) { - var name = kit.prompt("new name") - name && page.login.Pane.Run(event, ["rename", name], function(msg) { - page.header.Pane.State("user", name) - }) - }, - "退出登录": function(event) { - kit.confirm("logout?") && page.login.Pane.Exit() - }, - }, ["修改昵称", "退出登录"], function(event, value, meta) { - meta[value](event) - })) - }, - menu: function() { - page.text.Pane.Menu() - }, - tree: function() { - page.tree.Pane.Tree() - }, - - }, - Button: shy({title: "github.com/shylinux/context", tree: "tree", menu: "menu"}, ["tree", "menu"], function(key, value) {var meta = arguments.callee.meta - return kit.isNone(key)? meta: kit.isNone(value)? meta[key]: (meta[key] = value, page.header.Pane.Show()) - }), - Status: shy({title: 'shylinux@163.com', text: "0", menu: "0"}, ["text", "menu"], function(key, value) {var meta = arguments.callee.meta - return kit.isNone(key)? meta: kit.isNone(value)? meta[key]: (meta[key] = value, page.footer.Pane.Show()) - }), - - initTree: function(page, field, form, output) { - var ui = kit.AppendChild(output, [ - {"view": ["back"], "name": "back"}, {"view": ["gap"]}, - {"view": ["tree"], "name": "tree"}, {"view": ["gap"]}, - {"view": ["list"], "name": "list"}, {"view": ["gap"]}, - ]) - - return { - Tree: function(value) { - page.Conf("tree.display", value || (page.Conf("tree.display")? "": "none")) - }, - Show: function() { - page.Conf("tree.display", "", function(value, old) { - field.style.display = value - page.onlayout() - }) - - ctx.Run(event, form.dataset, [], function(msg) { - ui.back.innerHTML = "", kit.AppendChild(ui.back, [ - {"button": ["知识", function(event) { - ctx.Search({"level": "", "class": "", "favor": ""}) - }]}, - ].concat(ctx.Search("class").split("/").map(function(value, index, array) { - return value && {"button": [value, function(event) { - location.hash = "", ctx.Search({"class": array.slice(0, index+1).join("/")+"/", "favor":""}) - }]} - }))) - - ui.tree.innerHTML = "", kit.AppendChild(ui.tree, msg.Table(function(value, index) { - return value.file.endsWith("/") && {"text": [value.file, "div"], click: function(event, target) { - location.hash = "", ctx.Search({"class": ctx.Search("class")+value.file, "favor": ""}) - }} - })) - ui.list.innerHTML = "", kit.AppendChild(ui.list, msg.Table(function(value, index) { - return !value.file.endsWith("/") && {"text": [value.time.substr(5, 5)+" "+value.file, "div"], click: function(event, target) { - location.hash = "", ctx.Search("favor", value.file) - }} - })) - }) - }, - } - }, - initText: function(page, field, form, output) { - var ui = kit.AppendChild(output, [ - {"view": ["menu", "div", "", "menu"]}, - {"view": ["text", "div", "", "text"]}, - ]) - ui.text.onscroll = function(event) { - page.Status("text", kit.Position(ui.text)) - } - ui.menu.onscroll = function(event) { - page.Status("menu", kit.Position(ui.menu)) - } - return { - Menu: function(value) { - page.Conf("menu.display", value || (page.Conf("menu.display")? "": "none")) - }, - Size: function(width, height) { - if (kit.device.isMobile) { - return - } - if (page.Conf("menu.float")) { - ui.menu.className = "menu left" - } else { - ui.menu.className = "menu" - } - if (page.Conf("menu.float") && page.Conf("menu.scroll")) { - ui.menu.style.height = (height-8)+"px" - ui.text.style.height = ((ui.menu.clientHeight||height)-8-20)+"px" - } else { - ui.menu.style.height = " " - ui.text.style.height = " " - } - - if (location.hash) { - location.href = location.hash - } - ui.text.onscroll() - ui.menu.onscroll() - }, - Show: function() { - page.Conf("menu.display", "", function(value, old) { - ui.menu.style.display = value - }) - page.Conf("menu.float", !kit.device.isMobile, function(value, old) { - page.onlayout() - }) - page.Conf("menu.scroll", true, function(value, old) { - page.onlayout() - }) - - ctx.Search("layout") == "max" && (page.Conf("tree.display", "none"), page.Conf("menu.display", "none")) - - ctx.Run(event, form.dataset, [], function(msg) { - ui.menu.innerHTML = "", ui.text.innerHTML = msg.result? msg.result.join(""): "" - kit.AppendChild(ui.menu, [{"tree": kit.OrderText(field, ui.text)}]) - page.Status("count", msg.visit_count) - page.Status("visit", msg.visit_total) - page.onlayout() - return - }) - }, - } - }, - init: function(page) { - page.tree.Pane.Show() - page.text.Pane.Show() - page.Button("tree", "tree") - }, -}) diff --git a/usr/local/wiki/index.md b/usr/local/wiki/index.md deleted file mode 100644 index aadeee99..00000000 --- a/usr/local/wiki/index.md +++ /dev/null @@ -1,33 +0,0 @@ -天行健,君子以自强不息 - -|--------|----|----|----|--------|----|----|----|--------|----|----|----| -|--------|----|----|----|--------|----|----|----|--------|----|----|----| -|**人文**|感性|理性|灵性|**社会**|行业|企业|产业|**自然**|微观|宏观|宇观| -|**哲学**|世界|价值|人生|**史学**|经济|政治|文化|**科学**|实验|理论|方程| -|--------|----|----|----|--------|----|----|----|--------|----|----|----| -|**意识**|生活|工作|学习|**意志**|学位|职位|地位|**意义**|问题|难题|课题| -|**欲望**|幸福|财富|智慧|**缘份**|同学|同事|同行|**成就**|创造|创新|创始| -|--------|----|----|----|--------|----|----|----|--------|----|----|----| -|**做人**|随缘|随性|随心|**做事**|交易|交流|交情|**做学**|多做|多看|多想| -|**教育**|习惯|信用|道德|**资本**|资源|资格|资历|**工程**|技术|学术|艺术| -|--------|----|----|----|--------|----|----|----|--------|----|----|----| - -|--------|----|----|----|--------|----|----|----|--------|----|----|----| -|--------|----|----|----|--------|----|----|----|--------|----|----|----| -|**精神**|需求|追求|要求|**历史**|英雄|家族|阶级|**宇宙**|天文|气象|地质| -|**语言**|词汇|语法|语义|**经济**|生产|市场|消费|**物理**|物质|能量|信息| -|**文学**|散文|诗歌|小说|**政治**|外交|法制|民生|**数学**|代数|函数|几何| -|**艺术**|音乐|美术|体育|**军事**|战略|战术|战争|**生命**|基因|组织|系统| -|--------|----|----|----|--------|----|----|----|--------|----|----|----| -|**信仰**|科学|民主|自由|**人际**|心理|伦理|道理|**传感**|属性|关系|规律| -|**表达**|意识|情感|意志|**管理**|物力|人力|才力|**编程**|语言|框架|平台| -|**修养**|益智|怡情|养性|**物流**|交通|管道|电信|**控制**|过程|状态|特征| -|**阅读**|摘要|情节|典故|**金融**|基金|股票|保险|**设计**|功能|性能|智能| -|--------|----|----|----|--------|----|----|----|--------|----|----|----| -|**黑客**|博学|博识|博爱|**总裁**|路线|方针|政策|**建筑**|地基|栋梁|装饰| -|**读者**|搜集|检索|查阅|**经理**|客户|产品|服务|**机械**|原动|传动|制动| -|**朋友**|相识|相知|相交|**总监**|行情|行规|行家|**电子**|输入|处理|输出| -|**演讲**|论点|论据|论证|**董事**|提案|表决|监督|**电脑**|硬件|软件|文件| -|--------|----|----|----|--------|----|----|----|--------|----|----|----| - -地势坤,君子以厚德载物 diff --git a/usr/local/wiki/miss.md b/usr/local/wiki/miss.md deleted file mode 100644 index f636cc56..00000000 --- a/usr/local/wiki/miss.md +++ /dev/null @@ -1,90 +0,0 @@ -# {{title "Hello World"}} - -{{chart "block" `hello 慕尼黑 world` "white" "red" "32"}} -{{chart "block" `hello world` "red" "green"}} - -{{chart "chain" ` -chat - ocean - river - dream fg red bg white - zsh - auto.sh - tmux - docker - git - vim data { hi hello } rect { nice world } - auto.vim - storm - steam -`}} - -{{chart "table" ` -'{ text 宇宙 fg white bg green }' '{ text 天文 fg red bg white }' 气象 地质 -'{ text 物理 fg white bg blue' 物质 '{ text 能量 fg red bg white }' 信息 -'{ text 数学 fg white bg green }' '{ text 代数 fg red bg white }' 函数 几何 -'{ text 生命 fg white bg blue' 基因 '{ text 组织 fg red bg white }' 系统 -`}} - -{{chart "table" ` -'{ text 编程 fg white bg green }' '{ text 语言 fg red bg white }' 框架 平台 -'{ text 设计 fg white bg blue' 功能 '{ text 性能 fg red bg white }' 智能 -`}} - -命令 参数 选项 配置 - -## 消息队列 - -## 应用开发 - -{{table "hello" ` - zsh tmux docker git vim -code wiki chat team mall - src etc bin var usr -`}} - -{{table "circle" ` -传感 编程 控制 设计 -属性 语言 过程 功能 -关系 框架 状态 性能 -规律 平台 特征 智能 -`}} - -{{order "启动流程" ` -zone.sh -user.sh -node.sh -`}} - -{{order "会话流程" ` -ocean -river -action -source -target -storm -steam -`}} - -{{order "工作流程" ` -dream -favor -story -share -stage -order -`}} - -## 系统设计 - -{{table "context" ` -ctx cli aaa web -lex yac gdb log -tcp nfs ssh mdb -`}} - -{{order "" ` -模块化 -脚本化 -自动化 -`}} diff --git a/usr/local/wiki/volcano.md b/usr/local/wiki/volcano.md deleted file mode 100644 index f9a70e2d..00000000 --- a/usr/local/wiki/volcano.md +++ /dev/null @@ -1,99 +0,0 @@ -# {{title "Volcanos.js"}} - -volcanos是一个前端框架,通过模块化、配置化提升项目的复用性、灵活性。 - -{{chart "chain" ` -volcanos - proto.js - "ID 生成器" - "Log 日志器" - "Conf 配置器" - "Sync 同步器" - "Timer 定时器" - "Event 触发器" - "Dream 构造器" - "Cache 缓存器" - "Story 存储器" - frame.js bg blue - Page - Pane bg blue - "base 基础模块" - "core 核心模块" - "misc 工具模块" - "page 网页模块" - "user 用户模块" - Plugin bg red - "state.js" - "input.js" - "table.js" - "inner.js" - "media.js" - Inputs bg blue - "onimport 导入数据" - "onaction 控件交互" - "onchoice 控件菜单" - "ondetail 控件详情" - "onexport 导出数据" - Output - order.js - Header - Ocean - River - Target - Source - Action - Storm - Steam - Footer - -` "" "" 16}} - -## {{chapter "原型 proto.js"}} -### {{section "ID 生成器"}} -### {{section "Log 日志器"}} -### {{section "Conf 配置器"}} -### {{section "Sync 同步器"}} -### {{section "Timer 定时器"}} -### {{section "Event 触发器"}} -### {{section "Dream 构造器"}} -### {{section "Cache 缓存器"}} -### {{section "Story 存储器"}} - -## {{chapter "框架 frame.js"}} -### {{section "Page 页面"}} -### {{section "Pane 面板"}} -### {{section "Plugin 插件"}} -### {{section "Inputs 控件"}} -### {{section "Output 组件"}} - -## {{chapter "核心模块 lib/"}} -### {{section "base 模块"}} -### {{section "core 模块"}} -### {{section "misc 模块"}} -### {{section "page 模块"}} -### {{section "user 模块"}} - -## {{chapter "事件模块 pane/"}} -### {{section "onimport 模块"}} -### {{section "onaction 模块"}} -### {{section "onchoice 模块"}} -### {{section "ondetail 模块"}} -### {{section "onexport 模块"}} - -## {{chapter "插件模块 plugin/"}} -### {{section "state.js 模块"}} -### {{section "input.js 模块"}} -### {{section "table.js 模块"}} -### {{section "inner.js 模块"}} -### {{section "media.js 模块"}} - -## {{chapter "配置 order.js"}} -### {{section "Header"}} -### {{section "Ocean"}} -### {{section "River"}} -### {{section "Target"}} -### {{section "Source"}} -### {{section "Action"}} -### {{section "Storm"}} -### {{section "Steam"}} -### {{section "Footer"}} diff --git a/usr/local/wiki/自然/index.md b/usr/local/wiki/自然/index.md deleted file mode 100644 index 3505e5d8..00000000 --- a/usr/local/wiki/自然/index.md +++ /dev/null @@ -1,309 +0,0 @@ -## 应用简介 - -context是一种新的编程语言与应用框架,通过模块化、集群化、自动化,实现软件的快速开发,快速共享,快速使用。 - -context是以群聊的形式,进行资源的共享。 -用户可以创建任意的群聊,把相关人员聚集在一起,每个人可以将自己的设备,共享到群聊中,供组员使用,从而实现资源的最大利用。 -每个设备上有一堆命令,用户可以将任意设备上任意命令,添加到自定义的应用界面中,按照自己的需求去组合,从面实现场景化与个性化的定制。 -所以每个群聊中会有各种各样自定义的应用,所有的命令都是以群聊作为场景,进行权限的检查与分配。 -这些应用,可以像文本与图片一样,在群聊里自由的流动,可以被更快分享出去,再次收藏与组合形成新的应用组件,还可以在聊天记录中直接使用。 - -context是以分布式的方式,进行程序的开发。 -开发者,可以用脚本语言开发应用,随时随地的在自己任意设备上加载脚本,然后将动态域名分享出去,应用就可以被用户在群聊中任意的传播。 -所有的代码与数据,都在自己设备上,可以进行任意的实时控制。 -消灭所有中间环节,让几行代码的小函数,就可以成为独立的应用,从而实现软件的快速开发与快速传播,将任意一行代码的价值,放大成千上万倍。 - -## 下载安装 -### 下载 -在Linux或Mac上,可以直接用命令下载, -在Windows上,推荐先安装 [GitBash](https://www.git-scm.com/download/),然后在GitBash中执行命令下载。 -``` -$ export ctx_dev=https://shylinux.com; curl $ctx_dev/publish/boot.sh | bash -s install context -``` -*install后面的参数context,就是指定的下载目录,如不指定,会把相关文件下载到当前目录。* - -*ctx_dev环境变量指定服务器地址,所以也可以自行搭建服务器。* - -### 启动 -下载完成后,会自动启动context, -windows下的GitBash中,如果自动启动失败,则需要手动启动一下,如下命令。 -``` -$ cd context && bin/boot.sh -``` - -### 使用 -启动后context,提供了一种交互式的shell,直接可以执行各种内部命令和本地命令。 -如下查看当前目录与相关目录下的文件。 -``` -0[22:21:19]nfs> pwd -/home/homework/context - -1[22:21:20]nfs> dir -time size line path -2019-09-12 22:21:18 103 5 bin/ -2019-09-12 22:20:40 72 3 etc/ -2019-09-12 22:20:40 55 3 var/ -2019-09-12 22:21:18 50 2 usr/ - -2[20:51:21]nfs> dir bin -time size line path -2019-09-16 20:51:14 18782016 5209 bin/bench -2019-09-16 20:51:14 2634 99 bin/boot.sh -2019-09-16 20:51:14 125 5 bin/node.sh -2019-09-16 20:51:14 96 6 bin/user.sh -2019-09-16 20:51:14 147 9 bin/zone.sh - -3[20:51:22]nfs> dir etc -time size line path -2019-09-16 20:51:14 339 11 etc/common.shy -2019-09-16 20:51:14 244 11 etc/exit.shy -2019-09-16 20:51:14 297 18 etc/init.shy - -4[22:21:20]nfs> -``` -- bin目录,就是各种启动脚本与命令 -- etc目录,就是各种配置脚本与文件 -- var目录,就是各种输出文件,如日志与缓存文件 -- usr目录,就是各种前端文件与数据,如js、css文件 - -*如需要自行启动context,必须进入下载后的目录中,然后运行bin/boot.sh脚本。否则会找不到相关文件。* - -quit命令退出context - -``` -4[22:21:20]nfs> quit -quit, wait 1s -time code -2019-09-17 10:29:59 0 -4[22:21:20]nfs> -$ -``` -*如果需要搭建私有服务,可以直接运行bin/zone.sh,启动根服务节点。* - - -## 基本功能 - -除了命令行交互,还可以访问,通过浏览器使用更丰富的功能。 -context启动后,默认监听9095端口,启动网页服务。 - -context的应用界面是群聊的形式进行组织,每个群聊下可以创建任意的应用列表。 -所以每个应用都有群聊的上下文,可以获取当前群组的相关信息,也可以把执行结果发送到群聊中。 -另外应用也可以像文本或图片一样发送出去,共享给别的群组,再重新组合成新的应用界面。 - -如下左图,左边栏是群组列表,右边栏是当前群组下的应用列表。 -中上栏,是当前群组的聊天记录。中下栏是当前应用的界面。 -如下右图,在应用界面的左上角有界面选项,还可以把应用界面切换到不同的大小。 -``` -+----------------------------+ +----------------------------+ -| | | | -+------+--------------+------+ +---------------------+------+ -| | | | | | | -| 群 | | 应 | | | 应 | -| 组 | 聊天记录 | 用 | | | 用 | -| 列 | | 列 | | 应用界面 | 列 | -| 表 +--------------+ 表 | | | 表 | -| | | | | | | -| | 应用界面 | | | | | -| | | | | | | -+------+--------------+------+ +---------------------+------+ -| | | | -+----------------------------+ +----------------------------+ -``` - -这些应用的服务器,可是群聊中任意组员的设备,所以组员越多设备也越多,应用种类也就越丰富。 - -任意组员,都可以使用这些共享设备提供的命令,组合成各种应用界面,更加契合当前群组的使用需求。 -所有的应用与数据,都存放在本地设备上,可以被安全的管理与备份。 - -### 创建群聊 -左边栏的左上角,有创建按钮,点击便可打开群聊创建窗口。 - -左方框中,就是当前网络中所有的用户节点,点击即可添加到右方框中。 - -在右方框中,点击用户节点,便可删除选择。 - -输入群组名称,点击创建,便可用已选中的用户创建新的群聊。 - -### 创建应用 -右边栏的左上角,有创建按钮,点击便可打开应用创建窗口。 - -左边方框是当前群组的所有成员,选择某个成员,中间框便显示,此成员设备上的所有命令。 - -从中间方框中,选中所需要的命令,便可组合成所需的应用。 - -在右方框中,输入应用名称,便可创建归属当前群组的应用。 - -### 共享应用 - -本群组内的应用,除了可以本群组成员一起使用,还可以分享给其它用户。 - -点击共享按钮,便可以生成共享链接或二维码,其它用户点击登录后,便可加入此群组,使用此应用。 - -## 应用开发 - -context提供了插件的机制,可以自由的扩展应用,满足用户更多定制化的需求。 - -src/plugin目录下,就是各种插件。 -每个插件,都有后端index.go文件、index.shy文件、前端index.js文件、index.css文件。 - -推荐使用index.shy开发所需应用,shy语言,是context开发的一种新的编程语言,不需要编译,可以在任意设备上自由的使用。 - -当应用过于复杂或对性能有过高要求时,可以在index.go实现命令。 - -当有特殊的交互需求时,可以在index.js中实现前端功能。 - -当有界面美化需求时,可以在index.css加入样式。 - -context提供了,完整的开发工具链,从插件的创建、编译、发布、加载,简化了所有开发环节。 - -### 创建插件 -### 编译插件 -### 加载插件 - -## 创建集群 - -context不仅可以单机提供服务,还支持自动化的集群,实现了自动组网、自动路由、自动认证。 - -在bin目录下,就是各种启动脚本。 - -- bin/zone.sh 启动区域节点 -- bin/user.sh 启动用户节点 -- bin/node.sh 启动工作节点 -- bin/boot.sh 启动默认节点 - -在公共服务器上,执行bin/zone.sh脚本,会创建一个独立的工作域,所有的子节点,都会将用户信息注册到此节点。 -每个用户便可在自己的设备上,设置ctx_dev变量,指向区域向区域ip与端口。 -使用bin/user.sh启动自己的节点,便可自动获取动态域名与注册用户信息。 - -在同一区域下的所有节点,可以自由的相互访问,并可以在任意设备上创建群聊,所有的信息会自动的分发到其它节点。 - -- 个人使用,可以创建一个区域节点,下挂多个工作节点。 -- 团队使用,需要创建一个区域节点,多个用户节点,每个用户节点下,可以挂多个工作节点。 -- 如果用户节点或工作节点过多,可以创建分机节点,通过增加层级来降低单机负载。 - -context每个启动的进程都是一个独立的节点,根据网络框架中的功能作用,可以分为区域节点、用户节点、工作节点、分机节点。 -这几种节点,除了网络框架中的作用外,其它的功能模块与命令都完全一样,没有差别。 -远程命令与本地命令,无差别的运行,从而实现无限扩容的分布式计算。 - -### 个人使用 -#### 启动区域节点 -打开终端,进入context目录,执行如下命令, -``` -$ bin/zone.sh -0[13:26:27]nfs> -``` - -#### 启动工作节点 -再打开终端,进入context目录,执行如下命令, -``` -$ bin/node.sh create app/hello - -0[13:26:27]nfs> remote -create_time pod type -2019-07-30 13:26:27 com master -``` -启动context后,调用remote命令,可以查看到有一个上级节点。 - -#### 启动工作节点 -再打开终端,进入context目录,执行如下命令, -``` -$ bin/node.sh create app/world - -0[13:26:27]nfs> remote -create_time pod type -2019-07-30 13:26:27 com master -``` - -#### 分布式命令 -启动两种节点节点后,就可以在任意节点上调用命令,也可以调用远程节点的命令。 -如在区域节点上调用remote,就可以看到两个工作节点。 -``` -4[13:27:26]nfs> remote -create_time pod type -2019-07-30 13:26:27 hello worker -2019-07-30 13:26:30 world worker -``` - -查看当前路径 -``` -3[13:39:29]nfs> pwd -D:\context/var -4[13:40:03]nfs> -``` - -查看当时目录 -``` -4[13:40:03]nfs> dir -time size line path -2019-07-23 21:36:36 387 4 var/hi.png -2019-07-27 13:41:56 4096 4 var/log/ -2019-06-15 10:58:03 0 1 var/run/ -2019-07-30 12:55:19 4096 8 var/tmp/ -5[13:40:20]nfs> -``` - -执行远程命令,只需要在命令前加上节点名与冒号。 -``` -6[13:41:28]nfs> hello:pwd -D:\context\hello/var -6[13:41:28]nfs> world:pwd -D:\context\world/var -``` - -在任意随机节点上执行命令,用百分号作节点名。 -``` -5[13:40:20]nfs> %:pwd -D:\context\hello/var -5[13:40:20]nfs> %:pwd -D:\context\world/var -``` - -在所有节点上执行命令,用星号作节点名。 -``` -7[13:41:36]nfs> *:pwd -D:\context\hello/var D:\context\hello/var -``` - -### 团队使用 -context也可以支持团队协作使用,这时候就需要将区域节点部署到公共主机上。 -区域节点的作用就是生成动态域名,分发路由,解决命名冲突,与权限分配等功能。 - -#### 启动用户节点 -在公共主机上启动区域节点后,每个组员就可以在自己主机上启动用户节点,但需要指定区域节点的地址。 -如下命令,ip换成自己的公共主机,9095端口保留,这是context默认的web端口。 -``` -$ ctx_dev=http://192.168.88.102:9095 bin/user.sh -``` - -#### 启动工作节点 -同样每个用户都可以启动多用工作节点。 -``` -$ bin/node.sh create world -``` - -#### 启动团队协作 -当有多个用户连接到公共节点后,用户与用户之间就可以相互访问对方的所有节点。 -但是默认启用了节点认证,所有命令都没有权限。所以调用对应节点上的命令,需要对方开启命令权限。 - -每个用户随时都可以在自己节点上,为其它用户设置任意角色,给每个角色分配任意命令。 -从而实现安全快速的资源共享。 - - -### 启动分机节点 -当区域的用户节点过多,就可以启动分机节点。 -启动分机节点,只需要指定上级节点即可。 -用户在连接公共节点时,指定这个新节点的ip即可。 -context会自动生成新的网络路由。 - -``` -$ ctx_dev=http://192.168.88.102:9095 bin/boot.sh -``` - -## 系统架构 - -| |数据流|命令流|权限流|应用流| -|---|---|---|---|---| -|应用层|ctx|cli|aaa|web| -|控制层|lex|yac|log|gdb| -|数据层|tcp|nfs|ssh|mdb| - diff --git a/usr/local/wiki/自然/编程/index.md b/usr/local/wiki/自然/编程/index.md deleted file mode 100644 index 6c233832..00000000 --- a/usr/local/wiki/自然/编程/index.md +++ /dev/null @@ -1,930 +0,0 @@ -## 源码解析 - -- toolkit 工具类代码 -- contexts 框架类代码 -- examples 应用类代码 -- extend 启动代码 -- plugin 插件代码 - -## 系统架构 -| |数据流|命令流|权限流|应用流| -|---|---|---|---|---| -|应用层|ctx|cli|aaa|web| -|控制层|lex|yac|gdb|log| -|数据层|tcp|nfs|ssh|mdb| - -### 模块化 -### 命令化 -### 插件化 - -## 插件开发 -### 前端 -### 后端 -## 应用开发 -### code代码 -### wiki文档 -### chat聊天 -### team办公 -### mall商务 -## 框架开发 -### 通信框架 -### 存储引擎 -### 应用框架 -### 解析引擎 - - - -更新到此....敬请期待 ----------------------------------------------- - -## 创建群聊 -除了命令行的使用的方式之外,context还有自己的前端框架。 -不仅降低了使用难度,还提供更加场景化、自动化的应用界面。 - -用户可以访问区域节点或是任意用户节点的网页服务。 - -http://127.0.0.29:9095 - -输入用户名与初始密码,即可登录,如果用户与主机上的用户名相同,则是管理员权限,如果不同,则是普通用户,只有最小的功能权限。 - -所以任意节点都支持多用户共享使用,但只有管理用户有所有权限,进行资源的管理与分配。 - -打开应用界面,就可以看到context以办公聊天软件的形式提供各种丰富的功能。 - -左边框是用户群组列表,用户可以选择群聊或是创建新的群聊。 -中间就是聊天记录与输入框,用户可以自由的聊天收发消息。 - -与其它聊天软件不同的是,context提供了自定义的功能列表。 -右边框中,就是此群组的功能列表。 -每个用户都可以将自己设备上的命令添加到这个群组的功能列表中,分享给本组员使用。 -每个组员都可以根据自己的需求组合这些命令,生成自己的应用界面。 - -以每个群聊作为场景,进行资源的共享与应用的开发,从而实现更加场景化与个性化应用。 - -通过这种精细化的应用场景,进行工具化、标准化、流程化。提高各行各业的工作效率。 - -## 应用开发 - -网络框架与应用界面,已经实现了标准化与自动化,剩下就是应用的开发了。 - -开发者,可以在任意机器上开发自己的应用。以模块与函数为单位进行开发与上线。 -一个函数,即使只有几行代码,也是一个独立完整的应用,可以随时上线,被任意用户使用。 - -用户还可以在任意群聊中转发此应用,更自由的传播出去。 -从而将软件开发的速度提升成千上万倍,将代码的使用效率提升成千上万倍。 - -### 创建项目 -在任意节点上,执行project命令,指定项目名,即可创建应用目录。 -``` -$ bin/user.sh -8[13:41:41]nfs> project hello -time line hash path -2019-07-30 14:27:09 35 eba8eda2 src/plugin/hello/index.go -2019-07-30 14:27:09 1 b858cb28 src/plugin/hello/index.shy -2019-07-30 14:27:09 1 b858cb28 src/plugin/hello/local.shy -2019-07-30 14:27:09 4 407265b6 src/plugin/hello/index.js -9[14:27:09]nfs> -``` -每个项目,都可以用go语言开发低层应用,用js开发前端交互。 -除此,context有自己的通用语法解析器,开者完全可以随时自定义语法,定制自己的解析器。 -用自己喜欢的语法开发应用。 - -默认的shy语法,提供了一个完整的前后端应用框架。创建项目时,自动创建的模块如下。 -``` -fun hello world "" "" \ - public \ - text "" \ - button "执行" - copy pwd -end -``` - -这个模板就是一个完整的应用,fun关键字开关,end关键字结束。 -前四行就是定义应用界面,剩下代码就是后端脚本。 -public代表,这个应用是公共的,所以有人都可以访问。也可以是private,只有管理用户可以访问。 - -text与button,就是需要前端展示的控件。用户在前端点击此button,就会将请求发送到后端,执行此脚本。 -然后将执行结果返回给前端界面。 - -### 加载项目 -切换到cli模块,使用upgrade命令,加载新的项目应用。 -``` -8[13:41:41]nfs> ~cli -8[13:41:41]cli> upgrade plugin hello -3[15:55:53]cli> ~ -names ctx msg status stream helps -ctx 0 start stdio 模块中心 -cli ctx 4 begin 管理中心 -hello cli 5958 start shy -4[15:57:00]cli> -``` - -切换到hello模块,使用command命令,可以查看到hello模块下的命令列表,然后就可以调用hello命令。 -``` -8[13:41:41]cli> ~hello -6[15:58:42]hello> command -key name -hello hello world public text button 执行 -7[20:27:32]nice> hello -D:\context/var -``` - -同时在前端界面上添加功能,即可看到此函数。 - -context内部实现了很多功能模块,每个模块下有很多命令,每条命令就是一种应用。 - -context的使用方式有很多种, - -- 可以直接调用,像Shell一样,去解析一条命令 -- 可以启动cli服务,像MySQL一样,交互式使用格式化命令 -- 可以启动web服务,像LabView一样,可以自定义各种图形界面 -- 可以自动组网,将任意台设备组合在一起,实现分布式应用 -- 可以自动建群,在群聊场景中,实现多用户、多会话、多任务、多设备的使用 - -### 命令模式 -如果只是使用一条命令,或是写在脚本文件中,可以使用这种方式。 - -例如,dir命令就是查看目录, -``` -$ bin/bench dir -time size line filename -2019-06-16 10:35:18 324 11 common.shy -2019-06-16 10:35:18 201 9 exit.shy -2019-06-16 10:35:18 261 13 init.shy -``` - -还可以加更多参数,dir_deep递归查询目录,dir_type文件类型过滤,dir_sort输出表排序。 -``` -$ bin/bench dir ../ dir_deep dir_type file dir_sort line int_r -time size line filename -2019-06-16 10:22:52 13256968 91314 bench -2019-06-16 11:10:16 1535 66 boot.sh -2019-06-16 11:10:16 613 31 node.sh -2019-06-16 11:10:16 261 13 init.shy -2019-06-16 11:10:16 324 11 common.shy -2019-06-16 11:10:16 201 9 exit.shy - -``` - -### 交互模式 - -启动服务,可以提供更丰富的命令与环境。 -``` -$ bin/bench -0[11:35:46]ssh> dir -time size line filename -2019-06-16 11:35:06 160 3 log/ -2019-06-16 11:35:06 96 1 run/ -2019-06-16 11:35:44 192 4 tmp/ -1[11:35:46]ssh> -``` - -如果集中管理,命令越多,系统只会越复杂,学习成本越高,使用越低效,开发越困难。 - -所以通过模块化,分而治之,更高效的管理丰富的命令。 - -context命令就是用来管理模块,没有参数时,直接查看当前模块的信息。 - -如下,第二行是当前模块,第一行是当前模块的父模块,其它行都是当前模块的子模块。 - -``` -1[11:39:01]ssh> context -names ctx msg status stream helps -ctx 0 start shy 模块中心 -ssh ctx 10 begin ctx.nfs.file3 集群中心 -``` - -context第一个参数,可以指定当前模块, -如下,切换到nfs模块,然后查看各种IO模块, -切换到ctx根模块,查看所有模块。 -``` -2[11:43:57]ssh> context nfs - -3[11:43:58]nfs> context -names ctx msg status stream helps -ctx 0 start shy 模块中心 -nfs ctx 9 begin 存储中心 -stdio nfs 1174 start stdio scan stdio - -4[11:44:22]ssh> context ctx - -5[11:45:17]ctx> context -names ctx msg status stream helps -ctx 0 start shy 模块中心 -aaa ctx 3 begin 认证中心 -cli ctx 4 begin 管理中心 -gdb ctx 232 start 调试中心 -lex ctx 6 begin 词法中心 -log ctx 31 start bench 日志中心 -mdb ctx 8 begin 数据中心 -nfs ctx 9 begin 存储中心 -ssh ctx 10 begin 集群中心 -tcp ctx 11 begin 网络中心 -web ctx 1094 start :9094 应用中心 -yac ctx 13 begin 35,14,23 语法中心 -shy cli 1171 start engine shell -matrix1 lex 34 start 76,28,2 matrix -stdio nfs 1174 start stdio scan stdio -chat web 14 begin 会议中心 -code web 15 begin 代码中心 -wiki web 16 begin 文档中心 -engine yac 1173 start stdio parse - -``` - -command命令,就是用来管理当前模块的命令, -``` -17[11:52:02]nfs> context nfs - -17[11:52:02]nfs> command -key name -_init _init -action action cmd -copy copy to from -dir dir [path [fields...]] -export export filename -git git sum -hash hash filename -import import filename [index] -json json str -load load file [buf_size [pos]] -open open file -path path filename -printf printf arg -prompt prompt arg -pwd pwd [all] | [[index] path] -read read [buf_size [pos]] -remote remote listen|dial args... -save save file string... -scan scan file name -send send [file] args... -temp temp data -term term action args... -trash trash file -write write string [pos] - -``` - -help子命令,查看命令帮助信息。 -``` -18[11:59:19]nfs> command help dir -dir: dir [path [fields...]] - 查看目录, path: 路径, fields...: 查询字段, time|type|full|path|tree|filename|size|line|hash - dir_deep: 递归查询 - dir_type both|file|dir|all: 文件类型 - dir_reg reg: 正则表达式 - dir_sort field order: 排序 -``` - - -### 集群模式 - -context提供自动化集群的功能,可以自动组网、自动认证。从而快速实现多台设备的协同工作。 - -#### 启动服务节点 -``` -$ bin/boot.sh -0[11:35:12]ssh> -``` - -#### 启动工作节点 - -新打开一个终端,启动工作节点,执行remote命令,查看上级节点, -``` -$ bin/boot.sh create app/demo -0[15:15:30]ssh> remote -key type module create_time -mac master ctx.nfs.file3 2019-06-16 15:15:23 -``` - -回到服务节点终端,执行remote命令,可以查看到所有远程节点。 -``` -2[15:15:31]ssh> remote -key type module create_time -com master ctx.nfs.file4 2019-06-16 14:25:10 -demo worker ctx.nfs.file7 2019-06-16 15:15:23 -``` - -默认配置中,子节点信任父,所以父节点可以调用子节点的命令。还有更复杂的认证机制,可以灵活配置。 - -远程命令和本地命令一样,没有任何区别。如下调用demo节点的pwd命令。还支持更复杂的多节点命令,可以更快速的同时管理多台设备。 -``` -2[15:15:31]ssh> remote demo pwd -/Users/shaoying/context/app/demo/var -``` - -#### 启动分机节点 - -在服务节点的终端,查看服务地址 -``` -3[15:49:00]ssh> web.brow -index site -0 http://192.168.199.139:9094 -``` - -同样,在另一台设备上下载context,然后启动服务节点。 -通过环境变量ctx_dev指定上级节点。 -``` -$ ctx_dev="http://192.168.199.139:9094" bin/boot.sh -0[15:49:00]ssh> remote -key type module create_time -mac master ctx.nfs.file3 2019-06-16 15:15:23 -``` - -回到服务节点终端,执行remote命令,可以查看到新添加了一个服务子节点。 -``` -2[15:15:31]ssh> remote -key type module create_time -com master ctx.nfs.file4 2019-06-16 14:25:10 -demo worker ctx.nfs.file7 2019-06-16 15:15:23 -sub server ctx.nfs.file8 2019-06-16 16:15:23 -``` - -同样可以远程调用命令。 -``` -2[15:15:31]ssh> remote sub pwd -/Users/shaoying/context/app/sub/var -``` - -#### 文件管理 -调用本地命令,查看当前目录下的文件列表, -``` -0[10:53:25]ssh> ls -total 0 -drwxr-xr-x 5 shaoying staff 160 May 10 03:57 bin -drwxr-xr-x 5 shaoying staff 160 May 10 03:30 etc -drwxr-xr-x 2 shaoying staff 64 May 10 03:30 usr -drwxr-xr-x 8 shaoying staff 256 May 10 03:36 var -``` - -调用内部命令,查看文件列表,如下dir与ls命令用途相似,但提供了更丰富的功能,如统计文件行数 -``` -5[10:56:24]ssh> dir etc -time size line filename -2019-04-14 21:29:21 316 10 common.shy -2019-04-29 21:12:28 130 7 exit.shy -2019-04-29 21:12:12 191 12 init.shy -``` - -"%"是一个内部命令,可以对前一步命令结果进行各种处理。如下按字段line排序 -``` -5[10:56:24]ssh> dir etc % order line -time size line filename -2019-04-29 21:12:12 191 12 init.shy -2019-04-14 21:29:21 316 10 common.shy -2019-04-29 21:12:28 130 7 exit.shy -``` - -如下按字段""聚合,即可得到汇总结果,所有文件的总字节数、总行数、总文件数 -``` -16[11:04:30]ssh> dir etc % group "" -time size line filename count -2019-04-14 21:29:21 637 29 common.shy 3 -``` - -#### 时间管理 -查看当前时间戳 -``` -18[11:11:01]ssh> time -1557457862000 -``` -将时间戳转换成日期 -``` -19[11:11:14]ssh> time 1557457862000 -2019-05-10 11:11:02 -``` -将日期转换成时间戳 -``` -20[11:11:25]ssh> time "2019-05-10 11:11:02" -1557457862000 -``` - -#### 网卡管理 -``` -2[10:53:25]ssh> ifconfig -index name ip mask hard -5 en0 192.168.0.106 24 c4:b3:01:cf:0b:51 -``` - -### 完整版 -命令行模式,只是context最基本的功能。context还提供了一个前端框架, -让用户可以自由的组合功能列表,满足自己的需求。 - -使用更丰富的功能,可以直接下载源码, -``` -$ git clone https://github.com/shylinux/context.git -``` -下载完源码后,如果安装了golang,就可以对源码直接进行编译, -如果没有可以去官网下载安装golang()。 -第一次make时,会自动下载各种依赖库,所以会慢一些。 -``` -$ cd context && make -``` - -#### 启动服务 -bin目录下是各种可执行文件,如启动脚本boot.sh与node.sh。 - -node.sh用来启动单机版context,boot.sh用来启动网络版context。 - -如下,直接运行脚本,即可启动context。 - -启动context后,就可以解析执行各种命令,即可是本地的shell命令,也可以是内部模块命令。 - -``` -$ bin/node.sh -0[03:58:43]ssh> -``` - -#### 网页服务 - -下载完整版的context,启动的服务节点,就会带有前端网页服务。 - -#### 知识库 - -wiki模块提供了知识库管理。 - -访问:http://localhost:9094/wiki - -wiki模块会将usr/wiki目录下的md文件进行解析,生成网页文件,并自动生成目录与索引。 - -可以创建自己的知识库,如下创建目录与文件。 - -``` -$ mkdir -p usr/wiki/some -$ echo "hello world" > usr/wiki/some/hi.md -``` - -然后在服务终端上,切换到新建的知识库, -``` -0[10:53:25]ssh> ~wiki config wiki_level wiki/some -``` - -也可以加到启动文件中, -``` -$ cat etc/local.shy -~wiki - config wiki_level wiki/some -``` - -#### 用户界面 - -chat模块提供了完整的功能系统。 - -在一台公共的设备上启动服务节点,在etc/local.shy的启动脚本中加入如下两行命令。此设备就可以成为公共服务器。 -``` -~ssh - work serve -``` - -在任意其它设备上,每个用户都可以启动自己的节点,在启动脚本etc/local.shy,添加如下两行代码,此设备就可以成为用户的主控节点。 -``` -~ssh - work create -``` - -在启动用户节点时,只要指定服务节点,就可以实现用户注册,自动加入群组。 -``` - ctx_dev=http://172.0.0.172 bin/boot.sh -``` - -然后登录 http://172.0.0.172:9095/chat 或 http://127.0.0.127:9095/chat , -输入自己的用户名,与初始密码,就可以登录系统。 - -然后就可以自由的创建群聊、共享设备、实时聊天。 - -#### 模块开发 -``` -project hello -compile hello -publish hello -``` - -### 所有目录 - -#### 一级目录 - -- src -- etc -- bin -- var -- usr - -#### 源码目录 - -- src/toolkit -- src/context -- src/example -- src/plugin - -#### 配置文件 - -- etc/init.shy -- etc/common.shy -- etc/exit.shy - -#### 执行文件 - -- bin/boot.sh -- bin/node.sh -- bin/bench - -#### 日志文件 - -- var/log/boot.log -- var/log/error.log -- var/log/right.log -- var/log/bench.log -- var/log/debug.log -- var/run/bench.pid -- var/run/user/cert.pem -- var/run/user/key.pem -- var/run/node/cert.pem -- var/run/node/key.pem -- var/tmp/runtime.json -- var/tmp/auth.json - -#### 应用目录 - -- usr/template -- usr/librarys -- usr/upgrade -- usr/client - -## 应用开发 -- Windows -- Mac -- pi -- mp -- iOS -- Android - -### 应用接口 - -context的应用模块都是web的子模块,在web模块启动HTTP服务后,会根据模块名与命令名自动生成路由。 -web模块会将所有的HTTP请求转换成context的命令调用,所以HTTP的应用接口和普通命令,除了名字必须以"/"开头,其它没有太大区别。 - -当web接收到HTTP请求后,可以调用单个命令如 http://shylinux.com/code/consul 就会调用code模块下的/consul命令 - -可以调用多个命令如 http://shylinux.com/code/?componet_group=login 就会调用web模块下的/render命令, -根据code的componet下的login组件,依次调用每个接口的命令,然后将执行结果与参数一起,调用golang的template,渲染生成HTML。 - -所有命令都解析完成后就可以生成一个完整的网页。当然如果Accept是application/json,则会跳过模块渲染,直接返回多条命令的执行结果。 -所以componet就是接口的集合,统一提供参数配置、权限检查、命令执行、模板渲染,前端展示样式,前端初始化函数,降低内部命令与外部应用的耦合性,但又将前后端完全融合在一起。 - -如下,是web.code模块的应用接口定义。配置componet下定义了多个组件,每个组件下定义了多个接口。 - -login就是登录页面,下面定义了三个接口code、login、tail, -其中code,使用模板head生成网页头,会包括一些配置,如favicon可以指定图标文件,styles指定引用模式表。 -其中tail,使用模板tail生成网页尾,会包括一些配置,如scripts指定引用脚本文件。 -login就是网页组件了,生成一个网页登录的输入表单,并接收表单请求调用aaa模块的auth命令,进行用户身份的验证。 -其中arguments指定了Form表单字段的列表。 -``` -... -var Index = &ctx.Context{Name: "code", Help: "代码中心", - Caches: map[string]*ctx.Cache{}, - Configs: map[string]*ctx.Config{ - "skip_login": &ctx.Config{Name: "skip_login", Value: map[string]interface{}{"/consul": "true"}, Help: "免密登录"}, - "componet": &ctx.Config{Name: "componet", Value: map[string]interface{}{ - "login": []interface{}{ - map[string]interface{}{"componet_name": "code", "componet_tmpl": "head", "metas": []interface{}{ - map[string]interface{}{"name": "viewport", "content": "width=device-width, initial-scale=0.7, user-scalable=no"}, - }, "favicon": "favicon.ico", "styles": []interface{}{"example.css", "code.css"}}, - - map[string]interface{}{"componet_name": "login", "componet_help": "login", "componet_tmpl": "componet", - "componet_ctx": "aaa", "componet_cmd": "auth", "componet_args": []interface{}{"@sessid", "ship", "username", "@username", "password", "@password"}, "inputs": []interface{}{ - map[string]interface{}{"type": "text", "name": "username", "value": "", "label": "username"}, - map[string]interface{}{"type": "password", "name": "password", "value": "", "label": "password"}, - map[string]interface{}{"type": "button", "value": "login"}, - }, - "display_append": "", "display_result": "", - }, - - map[string]interface{}{"componet_name": "tail", "componet_tmpl": "tail", - "scripts": []interface{}{"toolkit.js", "context.js", "example.js", "code.js"}, - }, - }, -... -``` -### 网页开发 - -#### 模板 - -usr/template 存放了网页的模板文件,context会调用golang的template接口进行后端渲染,生成html文件。 -不同的应用模块都会有自己的模板目录,也有公共模板库。 - -- usr/template/common.tmpl 公共模板 -- usr/template/code/ code模块的模板 -- usr/template/wiki/ wiki模块的模板 -- usr/template/chat/ chat模块的模板 - -#### 样式 - -所有的css都存放usr/librarys - -- example.css -- code.css -- wiki.css -- chat.css - -#### 脚本 - -所有的js都存放usr/librarys - -- toolkit.js 工具库,主要是网页相关的操作,如AppendChild -- context.js 通信库,主要是用来与后端context进行通信 -- example.js 框架库,统一定义了网页的框架,每个应用网页都会继承 -- code.js 工具链应用的网页 -- wiki.js 知识库应用的网页 -- chat.js 信息流应用的网页 - -### 小程序 -### 开发板 - -## 接口开发 -### componet -### python -### java -### c - -## 模块开发 -### 应用模块 -#### 简单模块 -#### 复杂模块 -#### 脚本模块 -### 插件模块 -#### 独立插件 -#### 扩展插件 -### 核心模块 -#### 模块中心ctx -#### 命令中心cli -#### 认证中心aaa -#### 应用中心web -#### 网络中心tcp -#### 存储中心nfs -#### 集群中心ssh -#### 数据中心mdb - -### 应用框架 -#### 模块 - -context内部使用模块组织功能,每个模块都可以独立编译,独立运行。 -解除了代码之间的包依赖、库依赖、引用依赖、调用依赖。 -通过map查找模块,通过map查找命令,通过map查找配置,从而实现完全自由的模块。 - -**模块定义:** -``` -type Context struct { // src/contexts/ctx/ctx.go - Name string - Help string - - Caches map[string]*Cache - Configs map[string]*Config - Commands map[string]*Command - - ... - - contexts map[string]*Context - context *Context - root *Context - - ... - Server -} - -``` -Name:模块名称,Help:模块帮助。 -模糊搜索搜索时,会根据Name与Help进行匹配。 - -每个模块会有命令集合Commands,配置集合Configs,缓存集合Caches。通过这种形式提供功能集合。 - -contexts:所有子模块,context:指向父模块,root:指向根模块。 -从而组成一个模块树,所以可以通过路由查找模块, -如ctx.web.code,code的父模块是web,web的父模块是ctx,ctx是根模块。 -所以可以通过命令,查看到当前程序所有模块的信息。 - -**缓存定义:** -``` -type Cache struct { - Value string - Name string - Help string - Hand func(m *Message, x *Cache, arg ...string) string -} -``` -Value:存放的数据,Name:变量名称,Help:变量帮助,Hand读写函数。 - -缓存数量是一种数据接口,用来存放一些状态量,向外部显示程序进行状态,对外部来说一般是只读的。对内部来说可读可写。 -所以可以通过命令,查看到当前程序任意模块的状态数据。 - -如下,ncontext当前有多少个模块。nserver有多少个模块运行了守护协程。 - -``` -"nserver": &Cache{Name: "nserver", Value: "0", Help: "服务数量"}, -"ncontext": &Cache{Name: "ncontext", Value: "0", Help: "模块数量"}, -``` - -**缓存读写:** -``` -func (m *Message) Cap(key string, arg ...interface{}) string {} -func (m *Message) Capi(key string, arg ...interface{}) int {} -func (m *Message) Caps(key string, arg ...interface{}) bool {} -``` -定义了缓存数据的三种读写接口。 - -m.Cap()只有一个参数时,会从当前模块查询缓存变量,如果查到则返回Value,如果没有,则依次查询父模块。 -如果查找到根模块还没有查到找,变返回空字符串。 - -m.Cap()有两个参数时,同样会从当前模块依次查询父模块,直到查到变量,然后设置其值。 - -m.Capi()是对m.Cap()封装了一下,在int与str相互转换,从而实现用str存储int。 -所有转换失败的数据,都会返回0。 - -m.Caps(),实现了str存储bool。返回false的值有"", "0", "false", "off", "no", "error: ",其它都返回true。 - -**配置定义:** -``` -type Config struct { - Value interface{} - Name string - Help string - Hand func(m *Message, x *Cache, arg ...string) string -} -``` -Value:存放的数据,Name:变量名称,Help:变量帮助,Hand读写函数。 -与Cache相似,只是Value的类型不再是String而是interface{},所以可以用来存放更复杂的数据。 - -一般用来存放配置数据,是外部控制内部数据接口。 -所以可以通过命令,实时修改当前程序任意模块的配置数据。 -避免只是修改某个配置变量,就要重启整个进程,从而实现高效灵活的配置。 -把每个进程当成一个生命来对待,不要轻易杀死任何一个进程。有问题可以用微创手术解决。 - -**配置读写:** -``` -func (m *Message) Conf(key string, args ...interface{}) string {} -func (m *Message) Confi(key string, arg ...interface{}) int {} -func (m *Message) Confs(key string, arg ...interface{}) bool {} -func (m *Message) Confx(key string, args ...interface{}) string {} -func (m *Message) Confv(key string, args ...interface{}) interface{} {} -func (m *Message) Confm(key string, args ...interface{}) map[string]interface{} {} -``` -与Cache相似,也定义了各种读写的接口。 - -因为interface{}可以是任意复合类型,所以数据嵌套很深时,查询会涉及各种类型转换,非常麻烦。 -Conf()定义了键值链。内部去处理类型转换与嵌套的深入。 -如m.Conf("runtime", "user.node")、m.Conf("runtime", []string{"user", "node"})、m.Conf("runtime", []interface{}{"user", "node"}) -都会查询配置runtime下的user下的node的值。 - -m.Confx()内部进行选择,如果m.Option(key)中取到了值,则直接返回m.Option(key),否则返回m.Conf(key)。 -把配置当成一个备用的默认值,如果命令参数设置了此参数,则用命令中的参数。 - -m.Confv()直接读写原始数据。 -m.Confm()则定义了更丰富的接口,m就是map意思,直接返回map[string]interface{} -m另外一个意思就是magic,可以传入各种回调函数。 -如下配置node类型是map[string]interface{},m.Confm()会遍历此map,查到value也是map[string]interface{}的键值,调用回调函数。 -``` - ... - m.Confm("node", func(name string, node map[string]interface{}) { - if kit.Format(node["type"]) != "master" { - ps = append(ps, kit.Format(node["module"])) - } - }) - ... -``` - -**命令定义:** -``` -type Command struct { - Form map[string]int - Name string - Help interface{} - Auto func(m *Message, c *Context, key string, arg ...string) (ok bool) - Hand func(m *Message, c *Context, key string, arg ...string) (e error) -} -``` -Name:命令语法,Help:命令帮助。 - -Hand:命令处理函数,m是调用消息,c是当前模块,key是命令名,arg是命令参数。 - -在命令解析时,会根据Form将[key value...]形式的参数,取出存放到m.Option中,方便用key直接查找参数。 -所以arg中只剩下序列参数,通过index序号查找参数。 - -Auto:终端自动补全函数。在使用终端每输入一个单词时,就调用此函数输出提示信息。所以在命令执行前,这个函数会被调用多次。 - -如下定义了trans命令 -``` - ... - "trans": &Command{Name: "trans option [type|data|json] limit 10 [index...]", Help: "数据转换", - Form: map[string]int{"format": 1, "fields": -1}, - Hand: func(m *Message, c *Context, key string, arg ...string) (e error) { - ... - }} - ... -``` - -**命令调用:** -``` -func (m *Message) Cmd(args ...interface{}) *Message {} -func (m *Message) Cmdx(args ...interface{}) string {} -func (m *Message) Cmds(args ...interface{}) bool {} -func (m *Message) Cmdy(args ...interface{}) *Message {} -func (m *Message) Cmdm(args ...interface{}) *Message {} -``` -m.Cmd()根据第一个参数去当前查找命令,如果没有查找到,则去父模块查找。如果没有查找,则不会执行。 -剩下的参数会根据Form定义来解析,存放到m.Option中。 - -m.Cmds()当返回值转换成bool规则同m.Caps()与m.Confs()。 -m.Cmdx()当返回值转换成str。 m.Cmdy()将结果复制到当前Message。 - -m.Cmdm(),m同样是magic,会根据当前会话,自动定向到远程某主机某模块,远程调用其命令,当然也可能定向到本机。 - -#### 协程 -#### 消息 - -context内部调用都是 - - -### 解析引擎 -#### 文件扫描 -#### 词法解析 -#### 语法解析 -#### 执行命令 -### 通信框架 -#### 节点路由 -每个节点在启动时,自动向上级注册,生成一个动态域名,作为本节点的地址。 -如com.mac.led,led的上级节点是mac,mac的上级节点是com。 -其它节点,就可以通过个这个地址查找到此节点。 - -在调用远程命令时,通信模块根据远程地址的第一个字段,查找子节点,查取成功后,会将剩余的地址与命令发送给查到的子节点。 -子节点收到地址与命令后,继续查找子节点,直到目标节点收到命令,然后将执行结果原路返回。 - -在查找的过程中,如果没有查找到子节点,则会传给上级节点重新处理。 - -#### 节点认证 - -**节点加密** -每个节点都有证书与密钥。每个节点在发送命令时,都会用自己的密钥签名,目标节点都会用它的证书验签。以此保证命令来源的可靠性。 - -**节点类型** - -- 初始节点,没有归属的节点 -- 主控节点,有用户证书与密钥的节点 -- 从属节点,有用户证书的节点 - -- 代理节点,主控节点指定的代理节点 -- 共享节点,允许多个用户控制的节点 -- 认证节点,专门用来存放与查询用户证书的节点 - -用户在某一设备上添加自己的证书与密钥,此节点即为主控节点。 在其它节点上绑定自己的证书,此即为从属节点。 - -主控节点就可任意控制从属节点,从属节点不能控制主控节点,从属节点之间也不能相互控制。 - -主控节点可以指定代理节点,代理节点可以代替主控节点控制从属节点。 - -共享节点,会有多个用户,可能产生冲突,所以需要认证节点协调。 - -访问共享节点前,需要向认证节点注册,共享节点会从认证节点取出访问用户的信息。 - -#### 节点权限 - -***角色*** - -每个访问用户,都会指定一个角色。 -主控节点的用户默认有root权限。即拥有设备的所有控制权限。 - -认证节点的用户默认有tech权限。一般是部分功能。 - -其它节点的用户默认有void权限。即拥有最小集合的权限,一般是只读的命令。 - -***组件*** - -组件是功能的集合,远程访问至少要有remote与source组件的权限才可以执行命令。 - -每个角色下都会有多个组件的权限。 - -***命令*** - -命令就节点向外提供功能的最小单元。 - -每个组件下都会有多条命令。 - -***规则*** - -每条命令内部可以用组件与命令的权限机制自定义权限检查。 - -权限的分配完全由主控节点与从属节点自己配置,其它节点不许配置。 - -***示例*** - -如下配置,用户shy的角色是tech,角色tech下有两个组件remote与source,每个组件下都有命令pwd与dir,所以用户shy就可以远程调用命令dir与pwd -``` -role tech user shy -role tech componet remote command pwd dir -role tech componet source command pwd dir -``` - -### 存储引擎 -#### 配置 -#### 缓存 -#### 数据 - - diff --git a/usr/local/wiki/自然/编程/前端小程序/chrome.md b/usr/local/wiki/自然/编程/前端小程序/chrome.md deleted file mode 100644 index e69de29b..00000000 diff --git a/usr/local/wiki/自然/编程/前端小程序/html5.md b/usr/local/wiki/自然/编程/前端小程序/html5.md deleted file mode 100644 index 6124479f..00000000 --- a/usr/local/wiki/自然/编程/前端小程序/html5.md +++ /dev/null @@ -1 +0,0 @@ -## html5 diff --git a/usr/local/wiki/自然/编程/前端小程序/index.md b/usr/local/wiki/自然/编程/前端小程序/index.md deleted file mode 100644 index e69de29b..00000000 diff --git a/usr/local/wiki/自然/编程/前端小程序/javascript.md b/usr/local/wiki/自然/编程/前端小程序/javascript.md deleted file mode 100644 index 4f45184d..00000000 --- a/usr/local/wiki/自然/编程/前端小程序/javascript.md +++ /dev/null @@ -1 +0,0 @@ -## javascript diff --git a/usr/local/wiki/自然/编程/前端小程序/miniCAD/html5.css b/usr/local/wiki/自然/编程/前端小程序/miniCAD/html5.css deleted file mode 100644 index dd613d87..00000000 --- a/usr/local/wiki/自然/编程/前端小程序/miniCAD/html5.css +++ /dev/null @@ -1,34 +0,0 @@ -canvas { - border: solid 1px green; -} -.debug_info { - border: solid 1px gray; - margin: 10px 0; - padding: 0 10px; - max-height:100px; - width:380px; - overflow:auto; -} -.debug_info p { - margin:0; - padding:0; -} -thead { - display:block; - width:100%; -} -th,td { - width:60px; - padding:0; - margin:0; -} -#draw_history { - display:inline-block; - max-height:120px; - overflow-y:scroll; -} -.demo { - float:left; - margin-right:10px; - border: solid 1px green; -} diff --git a/usr/local/wiki/自然/编程/前端小程序/miniCAD/html5.js b/usr/local/wiki/自然/编程/前端小程序/miniCAD/html5.js deleted file mode 100644 index 3e1390ed..00000000 --- a/usr/local/wiki/自然/编程/前端小程序/miniCAD/html5.js +++ /dev/null @@ -1,660 +0,0 @@ -var canvas = document.getElementById("heart");//{{{ -var ctx = canvas.getContext('2d'); - -var main_angle = 30; -function refreshHeart() { - ctx.clearRect(0,0,400,400) - drawHeart(ctx,200,200,60,main_angle); - main_angle += 10; - for (var i = 0; i < 10; i++) { - var x = Math.random() * 400; - var y = Math.random() * 400; - var scale = Math.random() * 20+10; - var angle = Math.random() * 360; - drawHeart(ctx,x,y,scale,angle); - } - setTimeout(refreshHeart, 200); -} -setTimeout(refreshHeart, 200); - -function drawHeart(ctx,x,y,scale,angle, style, stroke) {//{{{ - ctx.save(); - ctx.translate(x,y); - ctx.rotate(angle/180*Math.PI); - ctx.scale(scale, scale); - heartPath(ctx); - ctx.shadowColor = "gray"; - ctx.shadowOffsetX = 5; - ctx.shadowOffsetY = 5; - ctx.shadowBlur = 5; - if (stroke == "stroke") { - ctx.strokeStyle = style||"red"; - ctx.stroke(); - } else { - ctx.fillStyle = style||"red"; - ctx.fill(); - } - ctx.restore(); -} -//}}} -function heartPath(ctx) {//{{{ - ctx.beginPath(); - ctx.arc(-1,0,1,Math.PI,0,false); - ctx.arc(1,0,1,Math.PI,0,false); - ctx.bezierCurveTo(1.9, 1.2, 0.6, 1.6, 0, 3.0); - ctx.bezierCurveTo( -0.6, 1.6,-1.9, 1.2,-2,0); - ctx.closePath(); -} -//}}} - -var ctx0 = document.getElementById("demo0").getContext("2d"); -ctx0.fillStyle = "green"; -ctx0.fillRect(10,10,100,100); - -var ctx2 = document.getElementById("demo2").getContext("2d"); -ctx2.beginPath(); -ctx2.moveTo(60,10); -ctx2.lineTo(10,110); -ctx2.lineTo(110,110); -ctx2.fill(); - - -function draw3() { - for (var i = 0; i < 120; i+=20) { - for (var j = 0; j < 120; j+=20) { - r = Math.random()*255; - g = Math.random()*255; - b = Math.random()*255; - ctx3.fillStyle = "rgb("+r+","+g+","+b+")"; - ctx3.fillRect(i, j, 20, 20); - } - } -} -var demo3 = document.getElementById("demo3"); -var ctx3 = demo3.getContext("2d"); -demo3.onclick = draw3; -draw3() -//}}} - -var draw_history = [{shape:"hide"}]; -var his = document.getElementById("draw_history"); -var draw = document.getElementById("draw").getContext("2d"); - -var current_ctx = {//{{{ - agent: {}, - big_scale: 1.25, - small_scale: 0.8, - font: '32px sans-serif', - - index_point: false, - begin_point: null, - end_point: null, - last_point: null, - last_move: 0, - - config: { - shape: {value: "rect", list: [ - {text: "移动", value: "move"}, - {text: "隐藏", value: "hide"}, - {text: "心形", value: "heart"}, - {text: "圆形", value: "cycle"}, - {text: "矩形", value: "rect"}, - {text: "直线", value: "line"}, - {text: "文字", value: "text"}, - ]}, - stroke: {value: "stroke", list: [ - {text: "画笔", value: "stroke"}, - {text: "画刷", value: "fill"}, - ]}, - color: {value: "green", list: [ - {text: "黑色", value: "black"}, - {text: "红色", value: "red"}, - {text: "黄色", value: "yellow"}, - {text: "绿色", value: "green"}, - {text: "蓝色", value: "blue"}, - {text: "紫色", value: "purple"}, - {text: "白色", value: "white"}, - ]}, - scale: {text: "比例", value: 1}, - offsetX: {text: "X偏移", value: 0}, - offsetY: {text: "Y偏移", value: 0}, - point: {text: "坐标", value: "0,0"}, - interval: {text: "间隔", value: 100}, - json: {text: "数据", value: ""}, - }, - command: { - cmd_shape: { - move: {text: "移动", key: "m", conf:{"shape": "move"}}, - hide: {text: "隐藏", key: "h"}, - heart: {text: "心形", key: "e", - conf:{"shape": "heart", "stroke": "fill"}, - cmd:{"fill": "cmd_stroke"}, - }, - cycle: {text: "圆形", key: "c", conf:{"shape": "cycle"}}, - rect: {text: "矩形", key: "r", conf:{"shape": "rect"}}, - line: {text: "直线", key: "v", - conf:{"shape": "line", "stroke": "stroke"}, - cmd:{"stroke": "cmd_stroke"}, - }, - text: {text: "文字", key: "t", - conf:{"shape": "text", "stroke": "fill"}, - cmd:{"fill": "cmd_stroke"}, - }, - }, - cmd_stroke: { - stroke: {text: "画笔", key: "s", conf:{"stroke": "stroke"}}, - fill: {text: "画刷", key: "f", conf:{"stroke": "fill"}}, - }, - cmd_color: { - black: {text: "黑色", key: "", conf:{"color": "black"}}, - red: {text: "红色", key: "", conf:{"color": "red"}}, - yellow: {text: "黄色", key: "", conf:{"color": "yellow"}}, - green: {text: "绿色", key: "", conf:{"color": "green"}}, - purple: {text: "紫色", key: "", conf:{"color": "purple"}}, - blue: {text: "蓝色", key: "", conf:{"color": "blue"}}, - white: {text: "白色", key: "", conf:{"color": "white"}}, - }, - ctrl_status: { - shape: {type: "config"}, - stroke: {type: "config"}, - color: {type: "config"}, - scale: {type: "cache"}, - point: {type: "cache"}, - }, - ctrl_show: { - big: {text: "放大", key: "+"}, - small: {text: "缩小", key: "-"}, - play: {text: "播放", key: "a"}, - interval: {type: "config", width: 30}, - }, - ctrl_data: { - delete: {text: "删除", key: "d"}, - clear: {text: "清空", key: "q"}, - export: {text: "导出"}, - import: {text: "导入"}, - json: {type: "config", width: 80}, - }, - "": {}, - }, -} -//}}} -function init(configs, commands) {//{{{ - current_ctx.agent.isChrome = window.navigator.userAgent.indexOf("Chrome")>-1; - current_ctx.agent.isMobile = window.navigator.userAgent.indexOf("Mobile")>-1; - - for (var group in commands) { - var cs = document.getElementsByClassName(group+" bar"); - for (var i = 0; i < cs.length; i++) { - for (var which in commands[group]) { - var command = commands[group][which]; - - var config = configs[which]; - if (command.type == "cache") { - var label = cs[i].appendChild(document.createElement("label")); - label.innerText = config.text+": "; - - var label = cs[i].appendChild(document.createElement("label")); - label.innerText = config.value; - label.className = "config "+which; - } else if (command.type == "config") { - if (config.list) { - var select = cs[i].appendChild(document.createElement("select")); - select.className = "config "+which; - - for (var j in config.list) { - var item = config.list[j]; - var option = select.appendChild(document.createElement("option")); - option.value = item.value; - option.text = item.text; - if (config.value == item.value) { - select.selectedIndex = j - } - } - - (function() { - var bar = group; - var key = which; - select.onchange = function(event) { - current_ctx.config[key].value = event.target[event.target.selectedIndex].value; - } - })(); - } else { - var label = cs[i].appendChild(document.createElement("label")); - label.innerText = config.text+": "; - - var input = cs[i].appendChild(document.createElement("input")); - input.style.width = command.width+"px"; - input.value = config.value; - input.className = "config "+which; - - (function() { - var key = which; - input.onblur = function(event) { - current_ctx.config[key].value = event.target.value; - } - input.onkeyup = function(event) { - switch (event.key) { - case "Enter": - current_ctx.config[key].value = event.target.value; - break - case "Escape": - event.target.value = current_ctx.config[key].value; - break - } - } - })(); - } - } else { - var cmd = cs[i].appendChild(document.createElement("button")); - cmd.className = group+" "+which; - - if (command.key) { - control_map[command.key] = [group, which]; - cmd.innerText = command.text+"("+command.key+")"; - } else { - cmd.innerText = command.text - } - - (function() { - var key = which; - var bar = group; - cmd.onclick = function(event) { - action(event, key, bar); - } - })(); - } - } - } - } -}//}}} -function conf(group, which, value) {//{{{ - var config = current_ctx[group][which]; - if (value != undefined) { - config.value = value; - var cs = document.getElementsByClassName(group+" "+which); - for (var i = 0; i < cs.length; i++) { - if (cs[i].nodeName == "LABEL") { - cs[i].innerText = value; - } else { - cs[i].value = value; - } - } - } - return config.value -}//}}} -function info() {//{{{ - var list = [] - for (var i = 0; i < arguments.length; i++) { - if (typeof arguments[i] == "object") { - list.push("{") - for (var k in arguments[i]) { - list.push(k+": "+arguments[i][k]+",") - } - list.push("}") - } else { - list.push(arguments[i]) - } - } - - var debug_info = document.getElementsByClassName("debug_info"); - for (var i = 0; i < debug_info.length; i++) { - var p = debug_info[i].appendChild(document.createElement("p")); - p.appendChild(document.createTextNode(list.join(" "))); - debug_info[i].scrollTop+=100; - } -} -//}}} - -var control_map = {//{{{ - Escape: ["", "escape"], - - action: { - "escape": [function() { - current_ctx.begin_point = null; - current_ctx.end_point = null; - }], - "hide": [function() { - var s = {shape: "hide", time:1} - add_history(his, s); - draws(draw, s); - }], - "big": [function(){ - draw.scale(current_ctx.big_scale, current_ctx.big_scale); - var m = draw.getTransform(); - conf("config", "scale", m.a); - }], - "small": [function(){ - draw.scale(current_ctx.small_scale, current_ctx.small_scale); - var m = draw.getTransform(); - conf("config", "scale", m.a); - }], - "play": [function() { - draw.resetTransform(); - conf("config", "scale", 1) - conf("config", "offsetX", 0) - conf("config", "offsetY", 0) - - refresh(conf("config", "interval"), 0, "", function() { - var m = draw.getTransform(); - conf("config", "scale", m.a); - conf("config", "offsetX", m.e) - conf("config", "offsetY", m.f) - }); - return false - }], - "delete": [function() { - if (draw_history.length > 1) { - var tr = his.rows[his.rows.length-1]; - tr.parentElement.removeChild(tr) - draw_history.pop(); - } - }], - "clear": [function() { - if (confirm("clear all?")) { - draw_history.length = 1; - var th = his.rows[0]; - his.innerHTML = ""; - his.appendChild(th); - } - }], - "export": [function() { - conf("config", "json", JSON.stringify(draw_history)); - return false - }], - "import": [function() { - var im = JSON.parse(conf("config", "json")); - for (var i in im) { - add_history(his, im[i]); - draws(draw, im[i]); - } - }], - "default": [function(event, which, group) { - var cs = document.getElementsByClassName(group); - for (var i = 0; i < cs.length; i++) { - cs[i].style.backgroundColor = "white"; - } - - var cs = document.getElementsByClassName(group+" "+which); - for (var i = 0; i < cs.length; i++) { - cs[i].style.backgroundColor = "lightblue"; - } - }], - } -} -//}}} -function control(event) {//{{{ - if (event.type == "keyup" && control_map[event.key]) { - action(event, control_map[event.key][1], control_map[event.key][0]); - } -} -//}}} -function action(event, which, group) {//{{{ - var w = control_map.action[which]? which: "default"; - while (control_map.action[w]) { - var command = current_ctx.command[group][which] || {}; - for (var k in command.conf) { - conf("config", k, command.conf[k]); - } - for (var i in control_map.action[w]) { - var next = control_map.action[w][i](event, which, group); - w = next || w; - } - for (var k in command.cmd) { - action(event, k, command.cmd[k]) - } - next == undefined && refresh() - w = next; - } -} -//}}} - -function trans(point) {//{{{ - return { - x: point.x/conf("config", "scale")-conf("config","offsetX"), - y: point.y/conf("config", "scale")-conf("config","offsetY"), - } -} -//}}} -function draw_point(event) {//{{{ - var point = trans({ - x: event.type == "touchstart"? event.touches[0].clientX: event.offsetX, - y: event.type == "touchstart"? event.touches[0].clientY: event.offsetY, - }); - conf("config", "point", parseInt(point.x)+","+parseInt(point.y)); - - if (!current_ctx.begin_point) { - current_ctx.begin_point = point; - info(event.type, "begin_point: ", current_ctx.begin_point) - return - } - current_ctx.end_point = point; - info(event.type, "end_point: ", current_ctx.end_point) - - var s = { - shape: conf("config", "shape"), - stroke: conf("config", "stroke"), - color: conf("config", "color"), - begin_point: current_ctx.begin_point, - end_point: current_ctx.end_point, - text: conf("config", "shape") == "text"? prompt("请入文字", ""): "", - }; - - add_history(his, s); - draws(draw, s); - refresh(); - - current_ctx.begin_point = null; - current_ctx.end_point = null; -} -//}}} -function draw_move(event) {//{{{ - var point = trans({x:event.offsetX, y:event.offsetY}); - conf("config", "point", parseInt(point.x)+","+parseInt(point.y)); - - if (current_ctx.agent.isMobile) { - return - } - - var color = conf("config", "color"); - var stroke = conf("config", "stroke"); - var shape = conf("config", "shape"); - - if (current_ctx.begin_point) { - switch (conf("config", "shape")) { - case "move": - var m = draw.getTransform() - draw.translate(point.x-current_ctx.begin_point.x,point.y-current_ctx.begin_point.y); - refresh(); - draw.setTransform(m) - break - default: - refresh(); - draws(draw, { - shape: shape, stroke: stroke, color: color, - begin_point: current_ctx.begin_point, - end_point: point, - text: "", - }); - } - } -} -//}}} - -function add_history(his, s) {//{{{ - s.index = draw_history.length; - switch (s.shape) { - case "move": - s.type = "image" - } - - draw_history.push(s); - if (s.begin_point) { - var begin_x = s.begin_point.x; - var begin_y = s.begin_point.y; - var end_x = s.end_point.x; - var end_y = s.end_point.y; - } - - var tr = his.appendChild(document.createElement("tr")) - var headers = ["shape", "stroke", "color", "x1", "y1", "x2", "y2", "text"] - var fields = [s.shape, s.stroke, s.color, - parseInt(begin_x), parseInt(begin_y), parseInt(end_x), parseInt(end_y), s.text] - - for (var i in fields) { - var td = tr.appendChild(document.createElement("td")); - switch (headers[i]) { - case "color": - case "stroke": - case "shape": - var select = td.appendChild(document.createElement("select")); - var list = current_ctx.config[headers[i]].list; - for (var j in list) { - var option = select.appendChild(document.createElement("option")); - option.value = list[j].value; - option.text = list[j].text; - if (option.value == fields[i]) { - select.selectedIndex = j; - } - } - - (function() { - var index = headers[i]; - select.onchange = function(event) { - draw_history[tr.rowIndex][index] = event.target[event.target.selectedIndex].value; - refresh(); - } - })(); - break - default: - var input = td.appendChild(document.createElement("input")); - input.value = fields[i]; - input.style.width="46px"; - - (function() { - var row = draw_history[tr.rowIndex] - var col = headers[i] - input.onblur = input.onkeyup = function(event) { - if (event.key && event.key != "Enter") { - return - } - var value = event.target.value; - switch (col) { - case "x1": - row.begin_point.x = value; - break - case "y1": - row.begin_point.y = value; - break - case "x2": - row.end_point.x = value; - break - case "y2": - row.end_point.y = value; - break - default: - row[data.col] = value; - } - refresh() - } - })() - } - } - - his.scrollTop+=100; - return s; -} -//}}} -function refresh(time, i, last, done) {//{{{ - i = i || 0 - if (!last || last > draw_history.length) { - last = draw_history.length; - } - - if (time) { - if (i < last) { - draws(draw, draw_history[i]); - if (draw_history[i].type == "image") { - refresh(0, 0, i); - } - - setTimeout(function(){refresh(time, i, last, done)}, draw_history[i].time||time); - i++ - return - } - - typeof done == "function" && done(); - return - } - - for (i = i || 0; i < last; i++) { - if (draw_history[i].type != "image") { - draws(draw, draw_history[i]); - } - } -} -//}}} -function draws(draw, h) {//{{{ - if (h.begin_point) { - var begin_x = h.begin_point.x; - var begin_y = h.begin_point.y; - var end_x = h.end_point.x; - var end_y = h.end_point.y; - } - - switch (h.shape) { - case "init": - case "move": - draw.translate(end_x-begin_x, end_y-begin_y); - var m = draw.getTransform(); - conf("config", "offsetX", m.e) - conf("config", "offsetY", m.f) - return - } - - draw.save(); - - if (h.color) { - if (h.stroke == "stroke") { - draw.strokeStyle = h.color; - } else { - draw.fillStyle = h.color; - } - } - - switch (h.shape) { - case "hide": - draw.clearRect(-conf("config", "offsetX")/conf("config", "scale"), -conf("config", "offsetY")/conf("config", "scale"), 400/conf("config", "scale"), 400/conf("config", "scale")); - break - case 'heart': - r = Math.sqrt(Math.pow(begin_x-end_x, 2)+Math.pow(begin_y-end_y,2)); - a = Math.atan((end_y-begin_y)/(end_x-begin_x))/Math.PI*180; - drawHeart(draw, begin_x, begin_y, r, a, h.color, h.stroke) - break - case 'cycle': - draw.beginPath(); - r = Math.sqrt(Math.pow(begin_x-end_x, 2)+Math.pow(begin_y-end_y,2)); - draw.arc(begin_x, begin_y, r, 0, 2*Math.PI) - draw[h.stroke]() - break - case 'line': - draw.beginPath(); - draw.moveTo(begin_x, begin_y); - draw.lineTo(end_x, end_y); - draw[h.stroke]() - break - case 'rect': - draw[h.stroke+"Rect"](begin_x, begin_y, end_x-begin_x, end_y-begin_y); - break - case 'text': - draw.font = current_ctx.font; - draw[h.stroke+"Text"](h.text, begin_x, begin_y, end_x-begin_x); - } - - draw.restore(); -} -//}}} - -init(current_ctx.config, current_ctx.command); -action(null, "heart", "cmd_shape"); -action(null, "red", "cmd_color"); - diff --git a/usr/local/wiki/自然/编程/前端小程序/miniCAD/html5.md b/usr/local/wiki/自然/编程/前端小程序/miniCAD/html5.md deleted file mode 100644 index 0315e983..00000000 --- a/usr/local/wiki/自然/编程/前端小程序/miniCAD/html5.md +++ /dev/null @@ -1,136 +0,0 @@ - - -## 简介 - -- 文档: -- 文档: - -### miniCAD在线绘图 - - - - - - - - - - - -color -stroke -shape -x1 -y1 -x2 -y2 -text - - - - - - -### canvas绘图 - -``` - - -``` - -### 画矩形 - -``` -fillRect(x, y, width, height) -strokeRect(x, y, width, height) -clearRect(x, y, width, height) -``` - -### 画路径 - -``` - - -``` - -``` -beginPath() -moveTo(x, y) -LineTo(x, y) -closePath() -stroke() -fill() - -arc(x, y, radius, startAngle, endAngle, anticlockwise) -arcTo(x1, y1, x2, y2, radius) -quadraticCurveTo(cp1x, cp1y, x, y) -bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) -new Path2D() -``` -### 设置样式 - -``` -fillStyle = "red" -fillStyle = "#FF0000" -fillStyle = "rgb(255,0,0)" -fillStyle = "rgb(255,0,0,1)" -strokeStyle = - -var img = new Image(); -img.src = "img.png"; -img.onLoad = function() {} -createPattern(img, style) - -createLinearGradient(x1, y1, x2, y2) -createRadialGradient(x1, y1, r1, x2, y2, r2) - addColorStop(position, color) - -shadowOffsetX -shadowOffsetY -shadowBlur -shadowColor - -lineWidth -lineCap -lineJoin -``` -### 输出文字 -``` -font -textAlign -textBaseline -direction -measureText() -fillText(text, x, y[, maxWidth]) -strokeText(text, x, y[, maxWidth]) -``` - -### 坐标变换 -``` -save() -restore() -translate(x,y) -rotate(angle) -scale(x, y) -transform(a,b,c,d,e,f) -setTransform(a,b,c,d,e,f) -resetTransform() -``` - - - diff --git a/usr/local/wiki/自然/编程/前端小程序/nodejs.md b/usr/local/wiki/自然/编程/前端小程序/nodejs.md deleted file mode 100644 index e69de29b..00000000 diff --git a/usr/local/wiki/自然/编程/前端小程序/weixin.md b/usr/local/wiki/自然/编程/前端小程序/weixin.md deleted file mode 100644 index e69de29b..00000000 diff --git a/usr/local/wiki/自然/编程/后端技术栈/consul.md b/usr/local/wiki/自然/编程/后端技术栈/consul.md deleted file mode 100644 index e69de29b..00000000 diff --git a/usr/local/wiki/自然/编程/后端技术栈/context.md b/usr/local/wiki/自然/编程/后端技术栈/context.md deleted file mode 100644 index 1558f851..00000000 --- a/usr/local/wiki/自然/编程/后端技术栈/context.md +++ /dev/null @@ -1,845 +0,0 @@ -## context - -context是一种新的编程语言与应用框架,通过模块化、集群化、自动化,实现软件的快速开发,快速共享,快速使用。 - -context是以群聊的形式,进行资源的共享。 -用户可以创建任意的群聊,把相关人员聚集在一起,每个人可以将自己的设备,共享到群聊中,供组员使用,从而实现资源的最大利用。 -每个设备上有一堆命令,用户可以将任意设备上任意命令,添加到自定义的应用界面中,按照自己的需求去组合,从面实现场景化与个性化的定制。 -所以每个群聊中会有各种各样自定义的应用,所有的命令都是以群聊作为场景,进行权限的检查与分配。 -这些应用,可以像文本与图片一样,在群聊里自由的流动,可以被更快分享出去,再次收藏与组合形成新的应用组件,还可以在聊天记录中直接使用。 - -context是以分布式的方式,进行程序的开发。 -开发者,可以用脚本语言开发应用,随时随地的在自己任意设备上加载脚本,然后将动态域名分享出去,应用就可以被用户在群聊中任意的传播。 -所有的代码与数据,都在自己设备上,可以进行任意的实时控制。 -消灭所有中间环节,让几行代码的小函数,就可以成为独立的应用,从而实现软件的快速开发与快速传播,将任意一行代码的价值,放大成千上万倍。 - -## 下载安装 -在Linux或Mac上,可以直接用脚本下载, -在Windows上,可以先安装[GitBash](https://www.git-scm.com/download/),然后在GitBash中执行命令下载。 -``` -$ curl https://shylinux.com/publish/boot.sh | bash -s install context -``` - -install后面的参数context,就是指定的下载目录, -进入下载目录,可以看到的有六个文件。 - -在bin目录下,就是各种执行文件 - -- bin/bench,context的执行程序 -- bin/boot.sh,context的启动脚本 -- bin/node.sh,简化版的启动脚本 - -context内部实现了语法解析,通过自定义的脚本语言,实现功能的灵活控制。 - -在etc目录下,就是context执行过程中用到的脚本。 - -- etc/init.shy,启动时加载的脚本 -- etc/exit.shy,结束时运行的脚本 -- etc/common.shy,init.shy调用到的脚本 - -## 使用方式 - -context内部实现了很多功能模块,每个模块下有很多命令,每条命令就是一种应用。 - -context的使用方式有很多种, - -- 可以直接调用,像Shell一样,去解析一条命令 -- 可以启动cli服务,像MySQL一样,交互式使用格式化命令 -- 可以启动web服务,像LabView一样,可以自定义各种图形界面 -- 可以自动组网,将任意台设备组合在一起,实现分布式应用 -- 可以自动建群,在群聊场景中,实现多用户、多会话、多任务、多设备的使用 - -### 命令模式 -如果只是使用一条命令,或是写在脚本文件中,可以使用这种方式。 - -例如,dir命令就是查看目录, -``` -$ bin/bench dir -time size line filename -2019-06-16 10:35:18 324 11 common.shy -2019-06-16 10:35:18 201 9 exit.shy -2019-06-16 10:35:18 261 13 init.shy -``` - -还可以加更多参数,dir_deep递归查询目录,dir_type文件类型过滤,dir_sort输出表排序。 -``` -$ bin/bench dir ../ dir_deep dir_type file dir_sort line int_r -time size line filename -2019-06-16 10:22:52 13256968 91314 bench -2019-06-16 11:10:16 1535 66 boot.sh -2019-06-16 11:10:16 613 31 node.sh -2019-06-16 11:10:16 261 13 init.shy -2019-06-16 11:10:16 324 11 common.shy -2019-06-16 11:10:16 201 9 exit.shy - -``` - -### 交互模式 - -启动服务,可以提供更丰富的命令与环境。 -``` -$ bin/bench -0[11:35:46]ssh> dir -time size line filename -2019-06-16 11:35:06 160 3 log/ -2019-06-16 11:35:06 96 1 run/ -2019-06-16 11:35:44 192 4 tmp/ -1[11:35:46]ssh> -``` - -如果集中管理,命令越多,系统只会越复杂,学习成本越高,使用越低效,开发越困难。 - -所以通过模块化,分而治之,更高效的管理丰富的命令。 - -context命令就是用来管理模块,没有参数时,直接查看当前模块的信息。 - -如下,第二行是当前模块,第一行是当前模块的父模块,其它行都是当前模块的子模块。 - -``` -1[11:39:01]ssh> context -names ctx msg status stream helps -ctx 0 start shy 模块中心 -ssh ctx 10 begin ctx.nfs.file3 集群中心 -``` - -context第一个参数,可以指定当前模块, -如下,切换到nfs模块,然后查看各种IO模块, -切换到ctx根模块,查看所有模块。 -``` -2[11:43:57]ssh> context nfs - -3[11:43:58]nfs> context -names ctx msg status stream helps -ctx 0 start shy 模块中心 -nfs ctx 9 begin 存储中心 -stdio nfs 1174 start stdio scan stdio - -4[11:44:22]ssh> context ctx - -5[11:45:17]ctx> context -names ctx msg status stream helps -ctx 0 start shy 模块中心 -aaa ctx 3 begin 认证中心 -cli ctx 4 begin 管理中心 -gdb ctx 232 start 调试中心 -lex ctx 6 begin 词法中心 -log ctx 31 start bench 日志中心 -mdb ctx 8 begin 数据中心 -nfs ctx 9 begin 存储中心 -ssh ctx 10 begin 集群中心 -tcp ctx 11 begin 网络中心 -web ctx 1094 start :9094 应用中心 -yac ctx 13 begin 35,14,23 语法中心 -shy cli 1171 start engine shell -matrix1 lex 34 start 76,28,2 matrix -stdio nfs 1174 start stdio scan stdio -chat web 14 begin 会议中心 -code web 15 begin 代码中心 -wiki web 16 begin 文档中心 -engine yac 1173 start stdio parse - -``` - -command命令,就是用来管理当前模块的命令, -``` -17[11:52:02]nfs> context nfs - -17[11:52:02]nfs> command -key name -_init _init -action action cmd -copy copy to from -dir dir [path [fields...]] -export export filename -git git sum -hash hash filename -import import filename [index] -json json str -load load file [buf_size [pos]] -open open file -path path filename -printf printf arg -prompt prompt arg -pwd pwd [all] | [[index] path] -read read [buf_size [pos]] -remote remote listen|dial args... -save save file string... -scan scan file name -send send [file] args... -temp temp data -term term action args... -trash trash file -write write string [pos] - -``` - -help子命令,查看命令帮助信息。 -``` -18[11:59:19]nfs> command help dir -dir: dir [path [fields...]] - 查看目录, path: 路径, fields...: 查询字段, time|type|full|path|tree|filename|size|line|hash - dir_deep: 递归查询 - dir_type both|file|dir|all: 文件类型 - dir_reg reg: 正则表达式 - dir_sort field order: 排序 -``` - - -### 集群模式 - -context提供自动化集群的功能,可以自动组网、自动认证。从而快速实现多台设备的协同工作。 - -#### 启动服务节点 -``` -$ bin/boot.sh -0[11:35:12]ssh> -``` - -#### 启动工作节点 - -新打开一个终端,启动工作节点,执行remote命令,查看上级节点, -``` -$ bin/boot.sh create app/demo -0[15:15:30]ssh> remote -key type module create_time -mac master ctx.nfs.file3 2019-06-16 15:15:23 -``` - -回到服务节点终端,执行remote命令,可以查看到所有远程节点。 -``` -2[15:15:31]ssh> remote -key type module create_time -com master ctx.nfs.file4 2019-06-16 14:25:10 -demo worker ctx.nfs.file7 2019-06-16 15:15:23 -``` - -默认配置中,子节点信任父,所以父节点可以调用子节点的命令。还有更复杂的认证机制,可以灵活配置。 - -远程命令和本地命令一样,没有任何区别。如下调用demo节点的pwd命令。还支持更复杂的多节点命令,可以更快速的同时管理多台设备。 -``` -2[15:15:31]ssh> remote demo pwd -/Users/shaoying/context/app/demo/var -``` - -#### 启动分机节点 - -在服务节点的终端,查看服务地址 -``` -3[15:49:00]ssh> web.brow -index site -0 http://192.168.199.139:9094 -``` - -同样,在另一台设备上下载context,然后启动服务节点。 -通过环境变量ctx_dev指定上级节点。 -``` -$ ctx_dev="http://192.168.199.139:9094" bin/boot.sh -0[15:49:00]ssh> remote -key type module create_time -mac master ctx.nfs.file3 2019-06-16 15:15:23 -``` - -回到服务节点终端,执行remote命令,可以查看到新添加了一个服务子节点。 -``` -2[15:15:31]ssh> remote -key type module create_time -com master ctx.nfs.file4 2019-06-16 14:25:10 -demo worker ctx.nfs.file7 2019-06-16 15:15:23 -sub server ctx.nfs.file8 2019-06-16 16:15:23 -``` - -同样可以远程调用命令。 -``` -2[15:15:31]ssh> remote sub pwd -/Users/shaoying/context/app/sub/var -``` - -#### 文件管理 -调用本地命令,查看当前目录下的文件列表, -``` -0[10:53:25]ssh> ls -total 0 -drwxr-xr-x 5 shaoying staff 160 May 10 03:57 bin -drwxr-xr-x 5 shaoying staff 160 May 10 03:30 etc -drwxr-xr-x 2 shaoying staff 64 May 10 03:30 usr -drwxr-xr-x 8 shaoying staff 256 May 10 03:36 var -``` - -调用内部命令,查看文件列表,如下dir与ls命令用途相似,但提供了更丰富的功能,如统计文件行数 -``` -5[10:56:24]ssh> dir etc -time size line filename -2019-04-14 21:29:21 316 10 common.shy -2019-04-29 21:12:28 130 7 exit.shy -2019-04-29 21:12:12 191 12 init.shy -``` - -"%"是一个内部命令,可以对前一步命令结果进行各种处理。如下按字段line排序 -``` -5[10:56:24]ssh> dir etc % order line -time size line filename -2019-04-29 21:12:12 191 12 init.shy -2019-04-14 21:29:21 316 10 common.shy -2019-04-29 21:12:28 130 7 exit.shy -``` - -如下按字段""聚合,即可得到汇总结果,所有文件的总字节数、总行数、总文件数 -``` -16[11:04:30]ssh> dir etc % group "" -time size line filename count -2019-04-14 21:29:21 637 29 common.shy 3 -``` - -#### 时间管理 -查看当前时间戳 -``` -18[11:11:01]ssh> time -1557457862000 -``` -将时间戳转换成日期 -``` -19[11:11:14]ssh> time 1557457862000 -2019-05-10 11:11:02 -``` -将日期转换成时间戳 -``` -20[11:11:25]ssh> time "2019-05-10 11:11:02" -1557457862000 -``` - -#### 网卡管理 -``` -2[10:53:25]ssh> ifconfig -index name ip mask hard -5 en0 192.168.0.106 24 c4:b3:01:cf:0b:51 -``` - -### 完整版 -命令行模式,只是context最基本的功能。context还提供了一个前端框架, -让用户可以自由的组合功能列表,满足自己的需求。 - -使用更丰富的功能,可以直接下载源码, -``` -$ git clone https://github.com/shylinux/context.git -``` -下载完源码后,如果安装了golang,就可以对源码直接进行编译, -如果没有可以去官网下载安装golang()。 -第一次make时,会自动下载各种依赖库,所以会慢一些。 -``` -$ cd context && make -``` - -#### 启动服务 -bin目录下是各种可执行文件,如启动脚本boot.sh与node.sh。 - -node.sh用来启动单机版context,boot.sh用来启动网络版context。 - -如下,直接运行脚本,即可启动context。 - -启动context后,就可以解析执行各种命令,即可是本地的shell命令,也可以是内部模块命令。 - -``` -$ bin/node.sh -0[03:58:43]ssh> -``` - -#### 网页服务 - -下载完整版的context,启动的服务节点,就会带有前端网页服务。 - -#### 知识库 - -wiki模块提供了知识库管理。 - -访问:http://localhost:9094/wiki - -wiki模块会将usr/wiki目录下的md文件进行解析,生成网页文件,并自动生成目录与索引。 - -可以创建自己的知识库,如下创建目录与文件。 - -``` -$ mkdir -p usr/wiki/some -$ echo "hello world" > usr/wiki/some/hi.md -``` - -然后在服务终端上,切换到新建的知识库, -``` -0[10:53:25]ssh> ~wiki config wiki_level wiki/some -``` - -也可以加到启动文件中, -``` -$ cat etc/local.shy -~wiki - config wiki_level wiki/some -``` - -#### 用户界面 - -chat模块提供了完整的功能系统。 - -在一台公共的设备上启动服务节点,在etc/local.shy的启动脚本中加入如下两行命令。此设备就可以成为公共服务器。 -``` -~ssh - work serve -``` - -在任意其它设备上,每个用户都可以启动自己的节点,在启动脚本etc/local.shy,添加如下两行代码,此设备就可以成为用户的主控节点。 -``` -~ssh - work create -``` - -在启动用户节点时,只要指定服务节点,就可以实现用户注册,自动加入群组。 -``` - ctx_dev=http://172.0.0.172 bin/boot.sh -``` - -然后登录 http://172.0.0.172:9095/chat 或 http://127.0.0.127:9095/chat , -输入自己的用户名,与初始密码,就可以登录系统。 - -然后就可以自由的创建群聊、共享设备、实时聊天。 - -#### 模块开发 -``` -project hello -compile hello -publish hello -``` - -### 所有目录 - -#### 一级目录 - -- src -- etc -- bin -- var -- usr - -#### 源码目录 - -- src/toolkit -- src/context -- src/example -- src/plugin - -#### 配置文件 - -- etc/init.shy -- etc/common.shy -- etc/exit.shy - -#### 执行文件 - -- bin/boot.sh -- bin/node.sh -- bin/bench - -#### 日志文件 - -- var/log/boot.log -- var/log/error.log -- var/log/right.log -- var/log/bench.log -- var/log/debug.log -- var/run/bench.pid -- var/run/user/cert.pem -- var/run/user/key.pem -- var/run/node/cert.pem -- var/run/node/key.pem -- var/tmp/runtime.json -- var/tmp/auth.json - -#### 应用目录 - -- usr/template -- usr/librarys -- usr/upgrade -- usr/client - -## 应用开发 -- Windows -- Mac -- pi -- mp -- iOS -- Android - -### 应用接口 - -context的应用模块都是web的子模块,在web模块启动HTTP服务后,会根据模块名与命令名自动生成路由。 -web模块会将所有的HTTP请求转换成context的命令调用,所以HTTP的应用接口和普通命令,除了名字必须以"/"开头,其它没有太大区别。 - -当web接收到HTTP请求后,可以调用单个命令如 http://shylinux.com/code/consul 就会调用code模块下的/consul命令 - -可以调用多个命令如 http://shylinux.com/code/?componet_group=login 就会调用web模块下的/render命令, -根据code的componet下的login组件,依次调用每个接口的命令,然后将执行结果与参数一起,调用golang的template,渲染生成HTML。 - -所有命令都解析完成后就可以生成一个完整的网页。当然如果Accept是application/json,则会跳过模块渲染,直接返回多条命令的执行结果。 -所以componet就是接口的集合,统一提供参数配置、权限检查、命令执行、模板渲染,前端展示样式,前端初始化函数,降低内部命令与外部应用的耦合性,但又将前后端完全融合在一起。 - -如下,是web.code模块的应用接口定义。配置componet下定义了多个组件,每个组件下定义了多个接口。 - -login就是登录页面,下面定义了三个接口code、login、tail, -其中code,使用模板head生成网页头,会包括一些配置,如favicon可以指定图标文件,styles指定引用模式表。 -其中tail,使用模板tail生成网页尾,会包括一些配置,如scripts指定引用脚本文件。 -login就是网页组件了,生成一个网页登录的输入表单,并接收表单请求调用aaa模块的auth命令,进行用户身份的验证。 -其中arguments指定了Form表单字段的列表。 -``` -... -var Index = &ctx.Context{Name: "code", Help: "代码中心", - Caches: map[string]*ctx.Cache{}, - Configs: map[string]*ctx.Config{ - "skip_login": &ctx.Config{Name: "skip_login", Value: map[string]interface{}{"/consul": "true"}, Help: "免密登录"}, - "componet": &ctx.Config{Name: "componet", Value: map[string]interface{}{ - "login": []interface{}{ - map[string]interface{}{"componet_name": "code", "componet_tmpl": "head", "metas": []interface{}{ - map[string]interface{}{"name": "viewport", "content": "width=device-width, initial-scale=0.7, user-scalable=no"}, - }, "favicon": "favicon.ico", "styles": []interface{}{"example.css", "code.css"}}, - - map[string]interface{}{"componet_name": "login", "componet_help": "login", "componet_tmpl": "componet", - "componet_ctx": "aaa", "componet_cmd": "auth", "componet_args": []interface{}{"@sessid", "ship", "username", "@username", "password", "@password"}, "inputs": []interface{}{ - map[string]interface{}{"type": "text", "name": "username", "value": "", "label": "username"}, - map[string]interface{}{"type": "password", "name": "password", "value": "", "label": "password"}, - map[string]interface{}{"type": "button", "value": "login"}, - }, - "display_append": "", "display_result": "", - }, - - map[string]interface{}{"componet_name": "tail", "componet_tmpl": "tail", - "scripts": []interface{}{"toolkit.js", "context.js", "example.js", "code.js"}, - }, - }, -... -``` -### 网页开发 - -#### 模板 - -usr/template 存放了网页的模板文件,context会调用golang的template接口进行后端渲染,生成html文件。 -不同的应用模块都会有自己的模板目录,也有公共模板库。 - -- usr/template/common.tmpl 公共模板 -- usr/template/code/ code模块的模板 -- usr/template/wiki/ wiki模块的模板 -- usr/template/chat/ chat模块的模板 - -#### 样式 - -所有的css都存放usr/librarys - -- example.css -- code.css -- wiki.css -- chat.css - -#### 脚本 - -所有的js都存放usr/librarys - -- toolkit.js 工具库,主要是网页相关的操作,如AppendChild -- context.js 通信库,主要是用来与后端context进行通信 -- example.js 框架库,统一定义了网页的框架,每个应用网页都会继承 -- code.js 工具链应用的网页 -- wiki.js 知识库应用的网页 -- chat.js 信息流应用的网页 - -### 小程序 -### 开发板 - -## 接口开发 -### componet -### python -### java -### c - -## 模块开发 -### 应用模块 -#### 简单模块 -#### 复杂模块 -#### 脚本模块 -### 插件模块 -#### 独立插件 -#### 扩展插件 -### 核心模块 -#### 模块中心ctx -#### 命令中心cli -#### 认证中心aaa -#### 应用中心web -#### 网络中心tcp -#### 存储中心nfs -#### 集群中心ssh -#### 数据中心mdb - -## 系统架构 - -| |数据流|命令流|权限流|应用流| -|---|---|---|---|---| -|应用层|ctx|cli|aaa|web| -|控制层|lex|yac|log|gdb| -|数据层|tcp|nfs|ssh|mdb| - -### 应用框架 -#### 模块 - -context内部使用模块组织功能,每个模块都可以独立编译,独立运行。 -解除了代码之间的包依赖、库依赖、引用依赖、调用依赖。 -通过map查找模块,通过map查找命令,通过map查找配置,从而实现完全自由的模块。 - -**模块定义:** -``` -type Context struct { // src/contexts/ctx/ctx.go - Name string - Help string - - Caches map[string]*Cache - Configs map[string]*Config - Commands map[string]*Command - - ... - - contexts map[string]*Context - context *Context - root *Context - - ... - Server -} - -``` -Name:模块名称,Help:模块帮助。 -模糊搜索搜索时,会根据Name与Help进行匹配。 - -每个模块会有命令集合Commands,配置集合Configs,缓存集合Caches。通过这种形式提供功能集合。 - -contexts:所有子模块,context:指向父模块,root:指向根模块。 -从而组成一个模块树,所以可以通过路由查找模块, -如ctx.web.code,code的父模块是web,web的父模块是ctx,ctx是根模块。 -所以可以通过命令,查看到当前程序所有模块的信息。 - -**缓存定义:** -``` -type Cache struct { - Value string - Name string - Help string - Hand func(m *Message, x *Cache, arg ...string) string -} -``` -Value:存放的数据,Name:变量名称,Help:变量帮助,Hand读写函数。 - -缓存数量是一种数据接口,用来存放一些状态量,向外部显示程序进行状态,对外部来说一般是只读的。对内部来说可读可写。 -所以可以通过命令,查看到当前程序任意模块的状态数据。 - -如下,ncontext当前有多少个模块。nserver有多少个模块运行了守护协程。 - -``` -"nserver": &Cache{Name: "nserver", Value: "0", Help: "服务数量"}, -"ncontext": &Cache{Name: "ncontext", Value: "0", Help: "模块数量"}, -``` - -**缓存读写:** -``` -func (m *Message) Cap(key string, arg ...interface{}) string {} -func (m *Message) Capi(key string, arg ...interface{}) int {} -func (m *Message) Caps(key string, arg ...interface{}) bool {} -``` -定义了缓存数据的三种读写接口。 - -m.Cap()只有一个参数时,会从当前模块查询缓存变量,如果查到则返回Value,如果没有,则依次查询父模块。 -如果查找到根模块还没有查到找,变返回空字符串。 - -m.Cap()有两个参数时,同样会从当前模块依次查询父模块,直到查到变量,然后设置其值。 - -m.Capi()是对m.Cap()封装了一下,在int与str相互转换,从而实现用str存储int。 -所有转换失败的数据,都会返回0。 - -m.Caps(),实现了str存储bool。返回false的值有"", "0", "false", "off", "no", "error: ",其它都返回true。 - -**配置定义:** -``` -type Config struct { - Value interface{} - Name string - Help string - Hand func(m *Message, x *Cache, arg ...string) string -} -``` -Value:存放的数据,Name:变量名称,Help:变量帮助,Hand读写函数。 -与Cache相似,只是Value的类型不再是String而是interface{},所以可以用来存放更复杂的数据。 - -一般用来存放配置数据,是外部控制内部数据接口。 -所以可以通过命令,实时修改当前程序任意模块的配置数据。 -避免只是修改某个配置变量,就要重启整个进程,从而实现高效灵活的配置。 -把每个进程当成一个生命来对待,不要轻易杀死任何一个进程。有问题可以用微创手术解决。 - -**配置读写:** -``` -func (m *Message) Conf(key string, args ...interface{}) string {} -func (m *Message) Confi(key string, arg ...interface{}) int {} -func (m *Message) Confs(key string, arg ...interface{}) bool {} -func (m *Message) Confx(key string, args ...interface{}) string {} -func (m *Message) Confv(key string, args ...interface{}) interface{} {} -func (m *Message) Confm(key string, args ...interface{}) map[string]interface{} {} -``` -与Cache相似,也定义了各种读写的接口。 - -因为interface{}可以是任意复合类型,所以数据嵌套很深时,查询会涉及各种类型转换,非常麻烦。 -Conf()定义了键值链。内部去处理类型转换与嵌套的深入。 -如m.Conf("runtime", "user.node")、m.Conf("runtime", []string{"user", "node"})、m.Conf("runtime", []interface{}{"user", "node"}) -都会查询配置runtime下的user下的node的值。 - -m.Confx()内部进行选择,如果m.Option(key)中取到了值,则直接返回m.Option(key),否则返回m.Conf(key)。 -把配置当成一个备用的默认值,如果命令参数设置了此参数,则用命令中的参数。 - -m.Confv()直接读写原始数据。 -m.Confm()则定义了更丰富的接口,m就是map意思,直接返回map[string]interface{} -m另外一个意思就是magic,可以传入各种回调函数。 -如下配置node类型是map[string]interface{},m.Confm()会遍历此map,查到value也是map[string]interface{}的键值,调用回调函数。 -``` - ... - m.Confm("node", func(name string, node map[string]interface{}) { - if kit.Format(node["type"]) != "master" { - ps = append(ps, kit.Format(node["module"])) - } - }) - ... -``` - -**命令定义:** -``` -type Command struct { - Form map[string]int - Name string - Help interface{} - Auto func(m *Message, c *Context, key string, arg ...string) (ok bool) - Hand func(m *Message, c *Context, key string, arg ...string) (e error) -} -``` -Name:命令语法,Help:命令帮助。 - -Hand:命令处理函数,m是调用消息,c是当前模块,key是命令名,arg是命令参数。 - -在命令解析时,会根据Form将[key value...]形式的参数,取出存放到m.Option中,方便用key直接查找参数。 -所以arg中只剩下序列参数,通过index序号查找参数。 - -Auto:终端自动补全函数。在使用终端每输入一个单词时,就调用此函数输出提示信息。所以在命令执行前,这个函数会被调用多次。 - -如下定义了trans命令 -``` - ... - "trans": &Command{Name: "trans option [type|data|json] limit 10 [index...]", Help: "数据转换", - Form: map[string]int{"format": 1, "fields": -1}, - Hand: func(m *Message, c *Context, key string, arg ...string) (e error) { - ... - }} - ... -``` - -**命令调用:** -``` -func (m *Message) Cmd(args ...interface{}) *Message {} -func (m *Message) Cmdx(args ...interface{}) string {} -func (m *Message) Cmds(args ...interface{}) bool {} -func (m *Message) Cmdy(args ...interface{}) *Message {} -func (m *Message) Cmdm(args ...interface{}) *Message {} -``` -m.Cmd()根据第一个参数去当前查找命令,如果没有查找到,则去父模块查找。如果没有查找,则不会执行。 -剩下的参数会根据Form定义来解析,存放到m.Option中。 - -m.Cmds()当返回值转换成bool规则同m.Caps()与m.Confs()。 -m.Cmdx()当返回值转换成str。 m.Cmdy()将结果复制到当前Message。 - -m.Cmdm(),m同样是magic,会根据当前会话,自动定向到远程某主机某模块,远程调用其命令,当然也可能定向到本机。 - -#### 协程 -#### 消息 - -context内部调用都是 - - -### 解析引擎 -#### 文件扫描 -#### 词法解析 -#### 语法解析 -#### 执行命令 -### 通信框架 -#### 节点路由 -每个节点在启动时,自动向上级注册,生成一个动态域名,作为本节点的地址。 -如com.mac.led,led的上级节点是mac,mac的上级节点是com。 -其它节点,就可以通过个这个地址查找到此节点。 - -在调用远程命令时,通信模块根据远程地址的第一个字段,查找子节点,查取成功后,会将剩余的地址与命令发送给查到的子节点。 -子节点收到地址与命令后,继续查找子节点,直到目标节点收到命令,然后将执行结果原路返回。 - -在查找的过程中,如果没有查找到子节点,则会传给上级节点重新处理。 - -#### 节点认证 - -**节点加密** -每个节点都有证书与密钥。每个节点在发送命令时,都会用自己的密钥签名,目标节点都会用它的证书验签。以此保证命令来源的可靠性。 - -**节点类型** - -- 初始节点,没有归属的节点 -- 主控节点,有用户证书与密钥的节点 -- 从属节点,有用户证书的节点 - -- 代理节点,主控节点指定的代理节点 -- 共享节点,允许多个用户控制的节点 -- 认证节点,专门用来存放与查询用户证书的节点 - -用户在某一设备上添加自己的证书与密钥,此节点即为主控节点。 在其它节点上绑定自己的证书,此即为从属节点。 - -主控节点就可任意控制从属节点,从属节点不能控制主控节点,从属节点之间也不能相互控制。 - -主控节点可以指定代理节点,代理节点可以代替主控节点控制从属节点。 - -共享节点,会有多个用户,可能产生冲突,所以需要认证节点协调。 - -访问共享节点前,需要向认证节点注册,共享节点会从认证节点取出访问用户的信息。 - -#### 节点权限 - -***角色*** - -每个访问用户,都会指定一个角色。 -主控节点的用户默认有root权限。即拥有设备的所有控制权限。 - -认证节点的用户默认有tech权限。一般是部分功能。 - -其它节点的用户默认有void权限。即拥有最小集合的权限,一般是只读的命令。 - -***组件*** - -组件是功能的集合,远程访问至少要有remote与source组件的权限才可以执行命令。 - -每个角色下都会有多个组件的权限。 - -***命令*** - -命令就节点向外提供功能的最小单元。 - -每个组件下都会有多条命令。 - -***规则*** - -每条命令内部可以用组件与命令的权限机制自定义权限检查。 - -权限的分配完全由主控节点与从属节点自己配置,其它节点不许配置。 - -***示例*** - -如下配置,用户shy的角色是tech,角色tech下有两个组件remote与source,每个组件下都有命令pwd与dir,所以用户shy就可以远程调用命令dir与pwd -``` -role tech user shy -role tech componet remote command pwd dir -role tech componet source command pwd dir -``` - -### 存储引擎 -#### 配置 -#### 缓存 -#### 数据 - diff --git a/usr/local/wiki/自然/编程/后端技术栈/golang.md b/usr/local/wiki/自然/编程/后端技术栈/golang.md deleted file mode 100644 index 77d146c8..00000000 --- a/usr/local/wiki/自然/编程/后端技术栈/golang.md +++ /dev/null @@ -1,187 +0,0 @@ -## golang - -- 官网: -- 下载: -- 文档: -- 源码: -- 开源: - -bash tmux golang git vim - -## 命令 - -``` -env help version -run test install -get list -``` - -## 文件 -``` -package -import -const -type -func -var -``` - -## 语句 -``` -if else for range break continue -switch case default fallthrough -defer recover panic -goto return -go select -``` - -## 表达式 -``` -// -``` -``` -0 iota true false nil "" '' `` - -int float -bool error -rune string -byte uintptr - -interface struct -map chan - -make len cap -append copy delete close -new complex real imag -``` - -## 官方包 -``` -os flag path time -io bufio -fmt -sync - -math -bytes -image -unicode -strings -strconv - -net -log -``` - -io fmt log net bufio bytes database -os flag time path errors syscall plugin -runtime context sync expvar testing debug reflect unsafe -math hash crypto sort container index -unicode strings strconv regexp -encoding archive compress -mime text html image - -go/ast -go/build -go/constant -go/doc -go/format -go/importer -go/internal/gccgoimporter -go/internal/gcimporter -go/internal/srcimporter -go/parser -go/printer -go/scanner -go/token -go/types -internal/bytealg -internal/cpu -internal/nettrace -internal/poll -internal/race -internal/singleflight -internal/syscall/unix -internal/syscall/windows -internal/syscall/windows/registry -internal/syscall/windows/sysdll -internal/testenv -internal/testlog -internal/trace -``` -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/local/wiki/自然/编程/后端技术栈/index.md b/usr/local/wiki/自然/编程/后端技术栈/index.md deleted file mode 100644 index 462b3eae..00000000 --- a/usr/local/wiki/自然/编程/后端技术栈/index.md +++ /dev/null @@ -1,335 +0,0 @@ -## 后端技术栈 - -- 数据结构 -- 编程语言 -- 开源软件 -- 项目经验 -- 基础知识 - -## 嵌入式架构 -树莓派 -## 集中式架构 -## 分布式架构 - - -## 单机架构 -### LAMP -#### Linux -#### Apache -#### Mysql -#### PHP -### OpenResty -#### Nginx -#### Sqlite3 -#### Lua -### Flask -#### Python -### NodeJS+MongoDB -#### NodeJS -#### MongoDB -## 集群架构 -### 平台 -#### 应用接口 -- REST API - -#### 反向代理 -- nginx - -#### 服务发现 -- consul - -#### 服务治理 - -#### 代码仓库 -- gitlab - -#### 虚拟容器 -- docker -- linux -- K8S - -#### 配置中心 -- ETCD - -#### 日志监控 - -#### 同步通信 -- Thrift -- gRPC - -#### 异步通信 -- Kafka - -#### 缓冲存储 -- Redis - -#### 事务存储 -- MySQL - -#### 搜索引擎 -- es - -#### 推荐引擎 - -### 设计 -#### DDD -#### 事务性 -#### 分布式 -#### 高并发 -#### 高可用 - -### 开发 -#### 逻辑性 -#### 可读性 -### 测试 -#### 单元测试 -#### 集成测试 -### 部署 -#### 持续集成 -#### 持续部署 -### 运维 -#### DevOps - -## 基础入门 -### Linux -Linux系统的应用十分广泛,有很多流行的桌面操作系统与移动操作系统,尤其是在云计算的服务器领域和物联网的嵌入式设备中, -因为有大量免费开源的软件可以自由的下载与使用,尤其是有很多优秀的软件开发工具,可以搭建起高效的开发与测试环境,所以熟练掌握Linux是程序员必备的技能。 - -严格上意义上讲Linux只是一个系统内核,没法直接使用,还需要各种应用软件。 -GNU是一个软件基金组织,提供了各种各样免费开源的自由软件。 -Debian就是把Linux内核与GNU软件打包成一个完整的操作系统,并且提供了软件包管理工具,可以很方便的下载各种应用软件。 -Ubuntu在Debian的基础上,提供了更加友好的桌面系统,降低了使用难度。 -Apache也是一个著名的软件基金组织,赞助了一系列的开源软件,尤其是服务器相关的软件,所以推动了WEB繁荣发展。 -Mozilla是一个软件社区,开发了浏览器Firefox,提供了一系列的Web技术与文档,推动了WEB繁荣发展。 - -- [Linux官网](https://www.linux.org/) -- [GNU官网](https://www.gnu.org/) -- [Debian官网](https://www.debian.org/) -- [Ubuntu官网](https://www.ubuntu.com/) -- [Apache官网](https://www.apache.org/) -- [Mozilla官网](https://developer.mozilla.org/) - -电脑端常见的操作系统是MacOSX与Windows。 -所以使用Linux常用的方式有: - -- 购买一个开发板,如树莓派开发板,提供了一整套完整的环境,可以制作各种电子设备,软硬件结合,更加有直观的成就感。 -- 租用一个云主机,如阿里云的服务器也很便宜,再申请一个域名与证书,就可以搭建一服务器,提供各种应用服务,也会很有成就感。 -- 本地安装虚拟机,当然最主要的还是在自己电脑上安装一下,可以选择各种虚拟机软件安装如VMWare或VirtualBox,像应用软件一样安装操作系统。最近流行的Docker容器技术,也可以尝试一下。 - -#### 软件管理 -Linux之所以这么流行,就是因为有大量优秀的开源软件与免费软件可以自由的获取与使用。 -apt是Debian的软件管理工具,只需要一条命令即可下载所需的软件。 -软件包,是开发人员将程序、文档、脚本、配置等相关打包在一起,方便软件的分发与部署。 -软件源,是专门存放软件包的服务器,用户可以在线搜索、查看、下载各种软件包。 -软件包之间会存在依赖关系,使用apt下载软件包时,会检测软件包的依赖关系,自动下载并安装相关的软件包。 - - -最常用的两条命令是update与install,更新软件信息列表和安装软件包。 -更新软件包信息列表,从软件源服务器上下载软件包的信息列表。安装软件时,会根据这些信息下载相关软件包。 -需要经常更新一下。 -``` -$ sudo apt-get update -``` -安装软件包,只需输入软件包名就可以自动下载并安装相关软件。如下安装vim。 -``` -$ sudo apt-get install vim -``` -当不知道软件包的完整名字时,可以使用search命令,如下搜索docker。 -``` -$ apt-cache search docker -``` - -- 软件源 /etc/apt/sources.list -- 软件包清单 /var/lib/apt/lists -- 软件包缓存 /var/cache/apt/archives/ -- 更新软件源 apt-get update -- 安装软件包 apt-get install -- 卸载软件包 apt-get remove -- 清空软件包 apt-get purge -- 清理缓存包 apt-get clean -- 清理无用包 apt-get autoclean -- 搜索软件包 apt-cache search -- 查看软件包 apt-cache show - -#### 帮助信息 -Linux有大量的软件与工具,每个软件都有自己的使用方法与参数。 -一下子记住这么多信息是不可能的,所以需要快速找到相关的帮助信息。 - -最直接的帮助信息是软件自带,输入参数-h或是--help,就可以查看参数列表及相关信息。如下查看命令ps的帮助信息。 -``` -$ ps --help -``` -另外,查看更详细的使用信息使用man命令。man手册,使用交互式查看文档,可以翻页,可以搜索。 -``` -$ man ps -``` -使用whatis可以查看命令的简要描述信息。 -``` -$ whatis ps -``` -查看命令所在的文件。 -``` -$ which ps -``` -当不知道命令的完整名字时,可以使用模糊搜索。 -``` -$ apropos nice -``` -很多软件都有自己的官网,如果还需要更多的信息,可以去官网查阅在线的文档。 - -#### 远程登录 -很多时候运行环境并不在本机,需要去远程登录设备,如访问服务器,如连接开发板。 -这时就会用到ssh工具,ssh是security shell的简写,提供加密通信的远程连接。可以远程执行各种命令,传输文件等。 - -ssh参数指定所需要用户名与主机地址,即可。 -``` -$ ssh shy@10.0.0.10 -``` - -如果使用密码认证,每次都需要输入密码,很是麻烦,尤其是开发环境也在远程设备上,需要频繁的输入密码。 -可以使用ssh-keygen命令,生成密钥对,使用密钥文件登录。 -``` -$ ssh-keygen -``` - -密钥生成后,用ssh-copy-id命令将公钥上传到远程主机。下次再用ssh登录时就不用再输入密码了。 -``` -$ ssh-copy-id shy@10.0.0.10 -``` - -有时候需要上传或是下载文件,scp命令像cp命令一样简单,可以直接在本机与远程主机传输文件。 -与cp不同的是,远程文件名前需要加上用户名与主机地址。 - -将远程主机的文件下载到本地。 -``` -$ scp shy@10.0.0.10:/home/shy/.vimrc vimrc -``` -将本地文件上传到远程主机。 -``` -$ scp vimrc shy@10.0.0.10:/home/shy/.vimrc -``` -当需传输更多文件时,可以使用sftp命令,交互式的访问远程目录。使用get下载文件,put上传文件。 -``` -$ sftp shy@10.0.0.10 -``` - -- 私钥文件 ~/.ssh/id_rsa -- 公钥文件 ~/.ssh/id_rsa.pub -- 授权公钥 ~/.ssh/authorized_keys - -#### 编译代码 -计算机由硬件与软件组成,软件又分为操作系统与应用程序。 - -无论是Linux,还是MacOSX,还是Windows,操作系统给应用程序提供了API接口。 -应用程序通过调用这些API接口,实现各种各样的功能。 - -如果现有的工具不能满足需求时,就需要下载工具的源码进行定制编译,或是开发一些模块。 - -API - - - -##### Makefile -make命令根据Makefile文件中定义的规则,调用各种命令,来生成目标文件。 -可以用来调用编译器,将项目的源码文件,编译成可执行文件。 -将源码文件编译成可执行文件。 -[Makefile官方文档](https://www.gnu.org/software/make/manual/make.html) -<> - -#### 本地化 - -- locale - -#### 网络管理 - -- hostname -- /etc/hosts -- /etc/resolv.conf - -#### 用户管理 - -- /etc/passwd -- /etc/shadow -- /etc/group -- /etc/shells -- vipw -- vigr -- passwd -- chsh -- newgrp -- id -- addgroup -- delgroup -- groupmod -- adduser -- /etc/adduser.conf -- /etc/skel -- bash -- /etc/bash.bashrc -- /etc/profile -- ~/.bashrc -- ~/.bash_profile -- zsh -- /etc/zshrc -- /etc/zshenv - -#### 时间管理 - -- date -- /etc/timezone - -#### 权限管理 - -- sudo -- visudo -- /etc/sudoers - -#### 磁盘管理 - -- /etc/fstab -- mount -- umount - -#### 内核管理 -#### 系统启动 -system - -### Nginx -nginx是一种Web服务器,尤其是反向代理与负载均衡功能在高并发的服务器上应用广泛。更多信息参考:[nginx官网](http://nginx.org/) - -安装nginx -``` -$ sudo apt-get install nginx -``` -启动nginx -``` -$ sudo nginx -``` -访问nginx -``` -$ curl localhost -``` - -nginx通过丰富的配置文件,启用各种功能。查看nginx相关的文件。 -``` -$ nginx -V -``` - -### Python -Mac上自带python,不需要安装。Ubuntu上也自带python。更多信息参考:[python官网](https://www.python.org/) - -### MySQL -### Redis -## 微服务化 -### es -### etcd -### kafka -### consul -### thrift -### databus -## 源码解析 -### Linux -### Nginx -### Python -### MySQL -### Redis diff --git a/usr/local/wiki/自然/编程/后端技术栈/kafka.md b/usr/local/wiki/自然/编程/后端技术栈/kafka.md deleted file mode 100644 index 93730394..00000000 --- a/usr/local/wiki/自然/编程/后端技术栈/kafka.md +++ /dev/null @@ -1,8 +0,0 @@ -## 简介 - -Kafka - -- 官网: -- 文档: -- 源码: -- 开源: diff --git a/usr/local/wiki/自然/编程/后端技术栈/linux.md b/usr/local/wiki/自然/编程/后端技术栈/linux.md deleted file mode 100644 index 1c513549..00000000 --- a/usr/local/wiki/自然/编程/后端技术栈/linux.md +++ /dev/null @@ -1,880 +0,0 @@ -## GNU - -- 官网: -- grub: -- bash: -- libc: -- gcc: -- gdb: - -C99 -``` -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -``` -POSIX.1 -``` -#include -#include - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -``` -## 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 - do_basic_setup() - sock_init() // net/socket.c:2025 - 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) -``` -### 进程调度 -``` -struct task_struct { // linux-3.7.4/include/linux/sched.h:1190 - // 进程状态 - 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 - 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 -} - -schedule() -``` - -### 时间管理 -``` -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 -``` -### 系统中断 -``` -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 -``` -### 系统调用 -``` -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_socketcall // net/socket.c:1897 - sys_socket() - socket_create() - __sock_create() - net_families[i]->create()/inet_create() - inetsw_array[j]->prot->init()/tcp_v2_init_sock() - sys_bind() - sys_connect() - sys_listen() - sys_accept() - sys_getsocketname() - sys_getpeername() - sys_socketpair() - sys_send() - sys_sendto() - sys_sendto() - socket_sendmsg() - __sock_sendmsg() - sys_recv() - sys_recvfrom() - sys_recvfrom() - sock_recvmsg() - __sock_recvmsg() - sock->ops->recvmsg()/inetsw_array[j]->ops->recvmsg()/inet_stream_ops->recvmsg()/sock_common_recvmsg() - sk->sk_prot->recvmsg()/inetsw_array[j]->prot->recvmsg()/tcp_prot->recvmsg()/tcp_recvmsg() - sk_wait_data() - prepare_to_wait(sk->sk_sleep) - sk_wait_event() - release_sock() - __release_sock() - sk->sk_backlog_rcv()/sk->sk_prot->backlog_rcv()/inetsw_array[j]->prot->backlog_rcv()/tcp_prot->backlog_rcv()/tcp_v4_do_rcv() - sys_shutdown() - sys_setsocketopt() - sys_getsocketopt() - sys_sendmsg() - sys_recvmsg() - -... -``` - -## 网络编程 -### 网络协议 -MAC ARP -IP ICMP -TCP UDP SCTP -RIP BGP OSPF -DNS NAT DHCP -FTP SSH SNMP -SMTP IMAP POP3 -HTTP HTML - -### 网络命令 -``` -ifconfig -nslookup -netstat -tcpdump -telnet -ping -wget -curl - -/etc/resolve.conf -/etc/hostname -/etc/hosts -``` - -### 网络编程 -``` -#include -socket() -bind() -listen() -accept() -connect() -recv() -send() -shutdown() - -#include -socket_in: struct - sin_len: uint8_t - sin_family: sa_family_t - sin_port: in_port_t - sin_addr: struct in_addr - s_addr: in_addr_t -htons() -ntohs() - -#include -inet_addr() -inet_ntoa() -inet_aton() - -#include -gethostbyname() -gethostbyaddr() -getservbyname() -getservbyport() -``` - -### 系统调用 -``` -socket()/sys_socket() // net/socket.c:1180 - sock_create(family, type, protocol, &sock) - __sock_create(family, type, protocol, res, 0) - net_families[PF_INET]->create(sock, protocol)/inet_create() - sock_init_data(sock, sk) - skb_queue_head_init(&sk->sk_receive_queue) - skb_queue_head_init(&sk->sk_write_queue) - skb_queue_head_init(&sk->sk_error_queue) - sk->sk_state_change = sock_def_wakeup - sk->sk_data_ready = sock_def_readable - sk->sk_prot->init(sk)/tcp_v4_init_sock() - tcp_init_xmit_timers(sk) - tp->retransmit_timer.function = &tcp_write_timer - tp->delack_timer.function = &tcp_delack_timer - sk->sk_timer.function = &tcp_keepalive_timer - sk->sk_state = TCP_CLOSE - sock_map_fd(sock) - file->f_op = SOCK_INODE(sock)->i_fop = &socket_file_ops - -bind()/sys_bind() // net/socket.c:1276 - sock->ops->bind(sock)/inet_bind() - -listen()/sys_listen() // net/socket.c:1306 - sock->ops->listen(sock)/inet_listen() // net/ipv4/af_inet.c:193 - tcp_listen_start(sk) - tp->accept_queue = tp->accept_queue_tail = NULL - -accept()/sys_accept() // net/socket.c:1340 - sock->ops->accept(sock, newsock)/inet_accept() // net/ipv4/af_inet.c:590 - sk1->sk_prot->accept(sk1)/tcp_accept() // net/ipv4/tcp.c:1895 - wait_for_connect(sk, timeo) - prepare_to_wait_exclusive(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE) - tp->accept_queue->sk - -connect()/sys_connect() // net/socket.c:1410 - sock->ops->connect()/inet_stream_connect() // net/ipv4/af_inet.c:504 - sk->sk_prot->connect(sk)/tcp_v4_connect() // net/ipv4/tcp_ipv4.c:747 - tcp_set_state(sk, TCP_SYN_SENT) // include/net/tcp.h:1607 - tcp_v4_hash_connect(sk) - tcp_connect(sk) // net/ipv4/tcp_output.c:1481 - __skb_queue_tail(&sk->sk_write_queue, buff) - tcp_transmit_skb(sk, skb_clone(buff, GFP_KERNEL)) - tcp_reset_xmit_timer(sk, TCP_TIME_RETRANS, tp->rto) - inet_wait_for_connect(sk, timeo) - prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE) - -recv()/sys_recv() // net/socket.c:1592 - sock_recvfrom() - sock_recvmsg() - __sock_recvmsg() - sock->ops->recvmsg()/inetsw_array[j]->ops->recvmsg()/inet_stream_ops->recvmsg()/sock_common_recvmsg() - sk->sk_prot->recvmsg()/inetsw_array[j]->prot->recvmsg()/tcp_prot->recvmsg()/tcp_recvmsg() - sk_wait_data() - prepare_to_wait(sk->sk_sleep) - sk_wait_event() - release_sock() - __release_sock() - sk->sk_backlog_rcv()/sk->sk_prot->backlog_rcv()/inetsw_array[j]->prot->backlog_rcv()/tcp_prot->backlog_rcv()/tcp_v4_do_rcv() -send()/sys_send() // net/socket.c:1541 - sys_send_to() - sock_sendmsg(sock, &msg, len) - __sock_sendmsg(&iocb, sock, msg, size) - sock->ops->sendmsg(iocb, sock, msg, size)/tcp_sendmsg() - skb_entail(sk, tp, skb) - __skb_queue_tail(&sk->sk_write_queue, skb) - sk->sk_send_head = skb - tcp_push_one(sk, mss_now) - tcp_transmit_skb(sk, skb_clone(skb, sk->sk_allocation)) - -shutdown()/sys_shutdown() // net/socket.c:1660 - sock->ops->shutdown(sock, how)/inet_shutdown() // net/ipv4/af_inet.c:671 - sk->sk_prot->shutdown(sk, how)/tcp_shutdown() // net/ipv4/tcp.c:1571 - tcp_close_state() - tcp_send_fin() // net/ipv4/tcp_output.c:1247 -``` - -### 内核模块 -``` -static struct inet_protosw inetsw_array[] = { // net/ipv4/af_inet.c:857 - { - type/SOCK_STREAM - protocol/IPPROTO_TCP - prot/tcp_prot // net/ipv4/tcp_ipv4.c:2593 - init/tcp_v4_init_sock - accept/tcp_accept - connect/tcp_v4_connect - sendmsg/tcp_sendmsg - recvmsg/tcp_recvmsg - shutdown/tcp_shutdown, - ops/inet_stream_ops // net/ipv4/af_inet.c:777 - bind/inet_bind - listen/inet_listen - accept/inet_accept - connect/inet_stream_connect - sendmsg/inet_sendmsg - recvmsg/sock_common_recvmsg - shutdown/inet_shutdown - }, -} - -struct tcp_func ipv4_specific = { // net/ipv4/tcp_ipv4.c:2023 - syn_recv_sock/tcp_v4_syn_recv_sock - conn_request/tcp_v4_conn_request - send_check/tcp_v4_send_check - queue_xmit/ip_queue_xmit -} - -enum { // include/linux/tcp.h:59 - TCP_ESTABLISHED = 1, - TCP_SYN_SENT, - TCP_SYN_RECV, - TCP_FIN_WAIT1, - TCP_FIN_WAIT2, - TCP_TIME_WAIT, - TCP_CLOSE, - TCP_CLOSE_WAIT, - TCP_LAST_ACK, - TCP_LISTEN, - TCP_CLOSING, /* now a valid state */ - - TCP_MAX_STATES /* Leave at the end! */ -}; - -module_init(inet_init) net/ipv4/af_inet.c:1115 - inet_init() net/ipv4/af_inet.c:1012 - sock_register() - net_families[PF_INET]=inet_family_ops - proto_register(&tcp_prot, 1) - proto_register(&udp_prot, 1) - proto_register(&raw_prot, 1) - arp_init() - ip_init() - dev_add_pack() - tcp_v4_init() - tcp_init() - icmp_init() -``` - -### 网卡驱动 -``` -e1000_up() // drivers/net/e1000/e1000_main.c:297 - e1000_configure_rx() - adapter->clean_rx = e1000_clean_rx_irq - request_irq(e1000_intr) -e1000_intr() - adapter->clean_rx()/e1000_clean_rx_irq() - netif_receive_skb(skb) - deliver_skb(skb, pt_prev) - pt_recv->func()/ip_rcv() // net/ipv4/ip_input():360 - ip_rcv_finish() - dst_input() - skb->dst->input()/ip_local_deliver() - ip_local_deliver_finish() - ipprot->handler()/tcp_v4_rcv() - tcp_v4_do_rcv() - TCP_LISTEN? tcp_v4_hnd_req(sk, skb) - tcp_check_req(sk, skb, req, prev) - tcp_acceptq_queue(sk, req, child) - tp->accept_queue = req - tcp_rcv_state_process() -tcp_rcv_state_process() // net/ipv4/tcp_input.c:4688 - TCP_LISTEN? tp->af_specific->conn_request()/tcp_func->conn_request()/tcp_v4_conn_request() // net/ipv4/tcp_ipv4.c:1396 - tcp_v4_send_synack(sk, req, dst) - TCP_SYN_SENT? tcp_rcv_synsent_state_process(sk, skb, th, len) - th->ack&&th->syn? tcp_ack(sk, skb, FLAG_SLOWPATH) - th->ack&&th->syn? tcp_set_state(sk, TCP_ESTABLISHED) - sk_wake_async(sk, 0, POLL_OUT); - th->rst? tcp_reset() - tcp_done() - tcp_set_state(sk, TCP_CLOSE) - th->ack? - TCP_SYN_RECV? tcp_set_state(sk, TCP_ESTABLISHED) - TCP_SYN_RECV? sk_wake_async(sk,0,POLL_OUT) - TCP_FIN_WAIT1? tcp_set_state(sk, TCP_FIN_WAIT2) - TCP_CLOSING? tcp_time_wait(sk, TCP_TIME_WAIT, 0) - TCP_LAST_ACK? tcp_done() - tcp_urg(sk, skb, th) - TCP_ESTABLISHED? tcp_data_queue(sk, skb) - __skb_queue_tail(&sk->sk_receive_queue, skb) - th->fin? tcp_fin(skb, sk, th) - TCP_SYN_RECV? tcp_set_state(sk, TCP_CLOSE_WAIT) - TCP_ESTABLISHED? tcp_set_state(sk, TCP_CLOSE_WAIT) - TCP_FIN_WAIT1? tcp_send_ack(sk); - TCP_FIN_WAIT1? tcp_set_state(sk, TCP_CLOSING); - TCP_FIN_WAIT2? tcp_send_ack(sk); - TCP_FIN_WAIT2? tcp_set_state(sk, TCP_TIME_WAIT); - sk->sk_data_ready()/sock_def_readable() - wake_up_interruptible(sk->sk_sleep) - sk_wake_async(sk,1,POLL_IN) -``` - -## 并发编程 -### 文件 -``` -#include -#include -fcntl()sys_fcntl() // fs/fcntl.c:333 -open()/sys_open() // fs.open.c:933 - fd = get_unused_fd() - f = filp_open() - nd = open_namei(filename) - path_lookup(name, nd) - nd->mnt = mntget(current->fs->rootmnt); - nd->dentry = dget(current->fs->root); - nd->mnt = mntget(current->fs->pwdmnt); - nd->dentry = dget(current->fs->pwd); - link_path_walk(name, nd); - __link_path_walk(name, nd); - do_lookup(nd, &this, &next); - real_lookup(nd->dentry, name, nd); - dir->i_op->lookup(dir, dentry, nd)/ext3_lookup() - ext3_find_entry(dentry, &de) - __lookup_hash(&nd->last, nd->dentry, nd) - cached_lookup(base, name, nd) - new = d_alloc(base, name) - inode->i_op->lookup(inode, new, nd) - vfs_create(dir->d_inode, path.dentry, mode, nd) - dir->i_op->create(dir, dentry, mode, nd)/ext3_create() - inode = ext3_new_inode(handle, dir, mode) - new_inode() - alloc_inode(sb) - sb->s_op->alloc_inode(sb) - inode->i_op = &ext3_file_inode_operations; - inode->i_fop = &ext3_file_operations; - dentry_open(nd.dentry, md.mnt) - f->f_dentry = dentry - f->f_vfsmnt = mnt - inode = dentry->d_inode - f->f_op = fops_get(inode->i_fop) - f->f_op->open(inode,f) - fd_install(fd, f) - files->fd[fd] = f -read()/sys_read() // fs/read_write.c:312 - file_pos_read() - vfs_read() - rw_verify_area(READ, file, pos, count) - locks_mandatory_area() - __posix_lock_file(inode, &fl) - wait_event_interruptible(fl.fl_wait, !fl.fl_next) - file->f_op->read(file, buf, count, pos)/do_sync_read() - filp->f_op->aio_read(&kiocb, buf, len, kiocb.ki_pos)/generic_file_aio_read() - __generic_file_aio_read(iocb, &local_iov, 1, &iocb->ki_pos) - do_generic_file_read(filp,ppos,&desc,file_read_actor) - do_generic_mapping_read(filp->f_mapping) - find_get_page(mapping, index) - radix_tree_lookup(&mapping->page_tree, offset) - page_cache_get(page) - mapping->a_ops->readpage(filp, page)/ext3_readpage() - mpage_readpage() - do_mpage_readpage() - mpage_bio_submit(READ, bio) - submit_bio(rw, bio) - generic_make_request(bio) - block_wait_queue_running(q) - prepare_to_wait_exclusive(&rl->drain, &wait, TASK_UNINTERRUPTIBLE) - file_pos_write() -write()/sys_write() // fs/sys_write():330 - file_pos_read(file) - vfs_write(file, buf, count, &pos) - rw_verify_area(WRITE, file, pos, count) - file->f_op->write(file, buf, count, pos)/do_sync_write() - filp->f_op->aio_write(&kiocb, buf, len, kiocb.ki_pos)/ext3_file_write() - generic_file_aio_write(iocb, buf, count, pos) - __generic_file_aio_write_nolock(iocb, &local_iov, 1, &iocb->ki_pos) - generic_file_buffered_write(iocb, iov, nr_segs, pos, ppos, count, written) - a_ops->commit_write(file, page, offset, offset+bytes)/ext3_writeback_commit_write() - generic_commit_write(file, page, from, to) - __block_commit_write(inode,page,from,to) - sync_page_range(inode, mapping, pos, ret) - file_pos_write(file, pos) -current:*struct task_struct - fs:*struct fs_struct - pwd:*struct dentry - root:*struct dentry - altroot:*struct dentry - pwdmnt:*struct vfsmount - rootmnt:*struct vfsmount - altrootmnt:*struct vfsmount - files:*struct files_struct - fd:**struct file // include/linux/fs.h:576 - f_pos:loff_t - f_count:atomic_t - f_op:*struct file_operations - f_dentry:*struct dentry // include/linux/dcache.h:83 - d_name:struct qstr - d_inode:*struct inode // include/linux/fs.h:427 - i_ino:unsigned long - i_size:loff_t - i_op:*struct inode_operations/ext3_dir_inode_operations - lookup:ext3_lookup - create:ext3_create - i_op:*struct inode_operations/ext3_file_inode_operations - i_op:*struct inode_operations/ext3_symlink_inode_operations - i_op:*struct inode_operations/ext3_fast_symlink_inode_operations - - i_fop:*struct file_operations/ext3_dir_operations - i_fop:*struct file_operations/ext3_file_operations - open:generic_file_open - ioctl:ext3_ioctl - read:do_sync_read - write:do_sync_write - aio_read:generic_file_aio_read - aio_write:ext3_file_write - llseek:generic_file_llseek - release:ext3_release_file - i_mapping:*struct address_space - a_ops:*struct address_space_operations/ext3_writeback_aops - commit_write:ext3_writeback_commit_write - writepage:ext3_writeback_writepage - d_op:*struct dentry_operations - d_sb:*struct super_block - s_op:*struct super_operations - f_vfsmnt:*struct vfsmount - -ext3_sops:struct super_operations - alloc_inode:ext3_alloc_inode - destroy_inode:ext3_destroy_inode - read_inode:ext3_read_inode - write_inode:ext3_write_inode -module_init(init_ext3_fs) - register_filesystem(&ext3_fs_type) -``` - -``` -/dev/null -/dev/stdio -/dev/stdout -/dev/stderr - - -#include -STDIN_FILENO -STDOUT_FILENO -STDERR_FILENO - -read() -write() -lseek() -close() - -ioctl() - -sync() -fsync() -fdatasync() -``` - -### 信号 -signal() - -### 进程并发 -fork() -exec() -exit() -wait() - -### 线程并发 -pthread_create() -pthread_self() -pthread_exit() -pthread_join() -pthread_detach() - -pthread_mutex_lock() -pthread_mutex_unlock() - -pthread_cond_wait() -pthread_cond_signal() - -## 系统编程 -### 启动 -/etc/passwd -/etc/shadow - fork() - setsid() -### 配置 -### 多路 -select() -epoll() -``` -``` -### 日志 -``` -#include -errno:int - -#include -strerror() - -#include -perror() - -#include -syslog() -``` - -### 用户 -``` -/etc/passwd -/etc/shadow -/etc/group - -getuid() -getpid() -``` - -### 调试 -### 定时 -### 延时 -alarm() - -### 集群 -### 存储 - -## 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() - -``` diff --git a/usr/local/wiki/自然/编程/后端技术栈/mongodb.md b/usr/local/wiki/自然/编程/后端技术栈/mongodb.md deleted file mode 100644 index d2a2b00c..00000000 --- a/usr/local/wiki/自然/编程/后端技术栈/mongodb.md +++ /dev/null @@ -1,6 +0,0 @@ -## mongodb - -- 官网: -- 文档: -- 源码: -- 开源: diff --git a/usr/local/wiki/自然/编程/后端技术栈/mysql.md b/usr/local/wiki/自然/编程/后端技术栈/mysql.md deleted file mode 100644 index 45d88d48..00000000 --- a/usr/local/wiki/自然/编程/后端技术栈/mysql.md +++ /dev/null @@ -1,267 +0,0 @@ -## mysql - -MySQL 是一个开源的关系型数据库管理系统。 - -- 官网: -- 源码: -- 文档: -- 开源: - -## 下载安装 -### Ubuntu安装MySQL -安装服务器与客户端 -``` -sudo apt-get install mysql-server mysql-client -``` - -相关目录与文件 - -- 配置目录 /etc/mysql/ -- 运行状态 /var/run/mysqld/ -- 日志目录 /var/log/mysql/ -- 数据目录 /var/lib/mysql/ -- 其它文件 /var/lib/mysql-files/ -- 动态插件 /usr/lib/mysql/plugin/ - -## 基础命令 -初次登录,直接用安装时设置的密码连接 -``` -$ mysql -u root -p -Enter password -mysql> -``` -查看帮助信息 -``` -mysql> help -... -``` -其中常用的命令有 - -- status 查看当前状态 -- system 调用系统shell命令 -- source 加载并执行sql文件 -- delimiter 设置行分隔符 -- connect 重新连接服务器 -- use 切换数据库 - -### 配置操作 -mysql启动时会从/etc/mysql/my.cnf加载配置,show variables;可以查看当前配置 - -### 数据库操作 - -- 查看 show databases -- 切换 use demo -- 创建 create database demo -- 删除 drop database demo - -查看数据库列表 -``` -mysql> show databases; -``` -创建数据库 -``` -mysql> create database demo; -``` -切换数据库 -``` -mysql> use demo; -``` -删除数据库 -``` -mysql> drop database demo; -``` - -### 关系表操作 - -- 查看 show tables -- 创建 create table demo(a int) -- 修改 alter table add column b int -- 查看 desc demo -- 删除 drop table demo - -### 数据操作 - -- 查询 select * from demo -- 添加 insert into demo values(1,2) -- 修改 update demo set a=1, b=2 where a=3 -- 删除 delete from demo where a=1 - -## 存储引擎 - -- 源码: -- 文档: - -``` -mysql> show engines; -``` - -|engine|comment| -|------|-------| -|InnoDB| supports transactions, row-level locking, and foreign keys| -|MyISAM| | -|MEMORY|hash based, stored in memory, useful for temporary tables| -|BLACKHOLE| | -|ARCHIVE| | -|CSV| | -|MRG_MYISAM| | -|PERFORMANCE_SCHEMA| | -|FEDERATED| | - -### InnoDB - -InnoDB是一种支持ACID事务的存储引擎 - -- 源码: -- 文档: - -InnoDB是多线程的,通过命令可以看各线程的状态 -``` -mysql> show engine innodb status\G -``` -|meta|task| -|------|----| -|BACKGROUND| 主线程 | -|FILE I/O| IO线程 | -|INSERT BUFFER AND HASH INDEX| 插入缓存与哈希索引 | -|SEMAPHORES| | -|TRANSACTIONS| | -|BUFFER POOL AND MEMORY| | -|ROW OPERATIONS| | -|LOG| | - -#### 线程与缓存 -MySQL的存储引擎是模块化,所以需要注册模块信息 -``` -// 注册模块 struct st_mysql_plugin {} // mysql-5.5.62/include/mysql/plugin.h:423 -mysql_declare_plugin(innobase) { // mysql-5.5.62/storage/innobase/handler/ha_innodb.cc:11925 - MYSQL_STORAGE_ENGINE_PLUGIN, - &innobase_storage_engine, - innobase_hton_name, - plugin_author, - "Supports transactions, row-level locking, and foreign keys", - PLUGIN_LICENSE_GPL, - innobase_init, /* Plugin Init */ - NULL, /* Plugin Deinit */ - INNODB_VERSION_SHORT, - innodb_status_variables_export,/* status variables */ - innobase_system_variables, /* system variables */ - NULL, /* reserved */ - 0, /* flags */ -} -... -mysql_declare_plugin_end; -``` - -InnoDB在初始化函数中,会注册各种回调函数,并启动各种工作线程 -``` -innobase_init() // mysql-5.5.62/storage/innobase/handler/ha_innodb.cc:2218 - // 注册各种回调函数 struct handlerton {} // mysql-5.5.62/sql/handler.h:705 - innobase_hton->state = SHOW_OPTION_YES; - innobase_hton->db_type= DB_TYPE_INNODB; - innobase_hton->savepoint_offset=sizeof(trx_named_savept_t); - innobase_hton->close_connection=innobase_close_connection; - innobase_hton->savepoint_set=innobase_savepoint; - innobase_hton->savepoint_rollback=innobase_rollback_to_savepoint; - innobase_hton->savepoint_release=innobase_release_savepoint; - innobase_hton->commit=innobase_commit; - innobase_hton->rollback=innobase_rollback; - innobase_hton->prepare=innobase_xa_prepare; - innobase_hton->recover=innobase_xa_recover; - innobase_hton->commit_by_xid=innobase_commit_by_xid; - innobase_hton->rollback_by_xid=innobase_rollback_by_xid; - innobase_hton->create_cursor_read_view=innobase_create_cursor_view; - innobase_hton->set_cursor_read_view=innobase_set_cursor_view; - innobase_hton->close_cursor_read_view=innobase_close_cursor_view; - innobase_hton->create=innobase_create_handler; - innobase_hton->drop_database=innobase_drop_database; - innobase_hton->panic=innobase_end; - innobase_hton->start_consistent_snapshot=innobase_start_trx_and_assign_read_view; - innobase_hton->flush_logs=innobase_flush_logs; - innobase_hton->show_status=innobase_show_status; - innobase_hton->flags=HTON_SUPPORTS_FOREIGN_KEYS; - innobase_hton->release_temporary_latches=innobase_release_temporary_latches; - - // 启动各种工作线程 - innobase_start_or_create_for_mysql() // srv/srv0start.c:1028 - os_thread_create(io_handler_thread, NULL, NULL); - os_thread_create(&srv_lock_time_thread, NULL, NULL); - os_thread_create(&srv_error_monitor_thread, NULL, NULL); - os_thread_create(&srv_monitor_thread, NULL, NULL); - os_thread_create(&srv_master_thread, NULL, NULL); - os_thread_create(&srv_purge_thread, NULL, NULL); -``` - -主线程 -``` -srv_master_thread() // mysql-5.5.62/storage/innobase/srv/srv0srv.c:2748 -loop: - srv_main_1_second_loops++; - - // 同步日志缓存 - srv_sync_log_buffer_in_background(); // srv/srv0srv.c:2702 - log_buffer_sync_in_background(TRUE); // log/log0log.c:1689 - log_write_up_to(lsn, LOG_NO_WAIT, flush); - mutex_enter(&(log_sys->mutex)); - log_sys->write_lsn = log_sys->lsn; - fil_flush(group->space_id); // fil/fil0fil.c:4755 - mutex_enter(&fil_system->mutex); - os_file_flush(file); // os/os0file.c:2119 - os_file_fsync(file); - fsync(file); - - // 合并插入缓存 - ibuf_contract_for_n_pages(FALSE, PCT_IO(5)); - - // 刷新数据缓存 - buf_flush_list(PCT_IO(100), IB_ULONGLONG_MAX); // buf/buf0flu.c:1928 - buf_flush_batch(buf_pool, BUF_FLUSH_LRU, min_n, 0); - buf_pool_mutex_enter(buf_pool); - buf_flush_LRU_list_batch(buf_pool, min_n); - buf_flush_flush_list_batch(buf_pool, min_n, lsn_limit); - buf_flush_buffered_writes(); - mutex_enter(&(trx_doublewrite->mutex)); - buf_flush_sync_datafiles(); - - // 执行清理任务 - srv_master_do_purge(); - trx_purge(srv_purge_batch_size); // trx/trx0purge.c:1139 - rw_lock_x_lock(&purge_sys->latch); - thr = que_fork_start_command(purge_sys->query); - que_run_threads(thr); - -background_loop: - srv_main_background_loops++; - row_drop_tables_for_mysql_in_background(); // row/row0mysql.c:2253 - mem_free(drop->table_name); - -flush_loop: - srv_main_flush_loops++; - log_checkpoint(TRUE, FALSE); // log/log0log.c:2077 - log_groups_write_checkpoint_info(); - log_group_checkpoint(group); - -suspend_thread: - srv_suspend_thread(slot); - -``` - -- 插入缓存与两次写 -- 自适应哈希索引 -- 启动、恢复、关闭 -- 引擎插件升级 - -#### 各种文件 - -配置文件,MySQL在启动时会加载配置文件,这些配置在运行时也可以随时读写 - -- show variables; -- show variables like 'timeout'; -- set [global|session] var=val - -日志文件 -数据文件 - -### MyISAM - -- 源码: -- 文档: diff --git a/usr/local/wiki/自然/编程/后端技术栈/nginx.md b/usr/local/wiki/自然/编程/后端技术栈/nginx.md deleted file mode 100644 index 5ea17631..00000000 --- a/usr/local/wiki/自然/编程/后端技术栈/nginx.md +++ /dev/null @@ -1,45 +0,0 @@ -## nginx -Nginx 是一个异步框架的Web服务器,也可以用作反向代理,负载均衡和HTTP缓存。 - -- 官网: -- 文档: -- 源码: -- 开源: - -## 源码安装 -``` -$ wget http://nginx.org/download/nginx-1.0.15.tar.gz -$ tar xzf nginx-1.0.15.tar.gz && cd nginx-1.0.15 -$ ./configure && make -$ sudo make install -$ sudo nginx -$ curl localhost -... -``` -## 基本配置 -``` -http { - server { - listen 80; - server_name localhost; - - location / { - root html; - index index.html index.htm; - } - - location /proxy { - proxy_pass http://localhost:9094; - } - } -} -``` -### http 系统配置 -### server 服务配置 -#### listen 网络连接 -#### server_name 服务名称 -### location 路由配置 - -#### root 文件目录 -#### index 索引文件 -#### proxy_pass 反向代理 diff --git a/usr/local/wiki/自然/编程/后端技术栈/nodejs.md b/usr/local/wiki/自然/编程/后端技术栈/nodejs.md deleted file mode 100644 index 32b82502..00000000 --- a/usr/local/wiki/自然/编程/后端技术栈/nodejs.md +++ /dev/null @@ -1,6 +0,0 @@ -## nodejs - -- 官网: -- 文档: -- 源码: -- 开源: diff --git a/usr/local/wiki/自然/编程/后端技术栈/python.md b/usr/local/wiki/自然/编程/后端技术栈/python.md deleted file mode 100644 index 33371034..00000000 --- a/usr/local/wiki/自然/编程/后端技术栈/python.md +++ /dev/null @@ -1,6 +0,0 @@ -## python - -- 官网: -- 文档: -- 源码: -- 开源: diff --git a/usr/local/wiki/自然/编程/后端技术栈/raspi.md b/usr/local/wiki/自然/编程/后端技术栈/raspi.md deleted file mode 100644 index e47d0c67..00000000 --- a/usr/local/wiki/自然/编程/后端技术栈/raspi.md +++ /dev/null @@ -1,117 +0,0 @@ -## 树莓派 - -- 官网: -- 文档: -- 开源: - -## 基本配置 - -- 官网: -- 文档: - -lsb_release -raspi-config -/boot/config.txt - -/etc/network/interfaces -/etc/wpa_supplicant/wpa_supplicant.conf - -/etc/hostname -/etc/hosts - -## 基本命令 - -- 官网: -- 文档: - -ls -cp -mv -rm -cd -pwd -mkdir -rmdir - -cat -echo -more -nano -vi - -sudo -chmod -chown - -find -grep - -ps -fg -bg -top -kill -killall -history -alias -man - -df -date -lsusb -lsmod - -wget -curl -tar -git - -apt-get update -apt-get install -apt-get remove -apt-get clean - -apt-get install python-pip -pip install - -crontab -/etc/rc.local -/etc/init.d/ -update-rc.d - -## 基础编程 - -- 官网: -- 文档: - -python -hi.py - -input() -print() -open() - -int() -str() -len() - -if -elif -else -for in range/enumerate -while -break -continue - -def - -class -new - -try -except -else -finally - -from import as - diff --git a/usr/local/wiki/自然/编程/后端技术栈/redis.md b/usr/local/wiki/自然/编程/后端技术栈/redis.md deleted file mode 100644 index 5b7b7d07..00000000 --- a/usr/local/wiki/自然/编程/后端技术栈/redis.md +++ /dev/null @@ -1,499 +0,0 @@ -## redis - -Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可持久性的键值对存储数据库。 -Redis是最流行的键值对存储数据库。 - -- 官网: -- 源码: -- 文档: -- 开源: - -## 源码安装 -``` -$ wget http://download.redis.io/releases/redis-4.0.11.tar.gz -$ tar xzf redis-4.0.11.tar.gz && cd redis-4.0.11 && make -``` -#### 启动服务端 -``` -$ src/redis-servce -... -``` -#### 启动客户端 -``` -$ src/redis-cli -127.0.0.1:6379> -``` -#### 基本命令 -``` -$ src/redis-cli -127.0.0.1:6379> set employee_name shy -OK -127.0.0.1:6379> get employee_name -"shy" -``` -## 源码解析 -### 数据结构 -#### sds -#### dict -#### intset -#### adlist -#### ziplist -#### geohash -#### geo - -### 数据类型 -#### string -#### list -#### hash -#### set -#### zset - -### 数据存储 -#### db -#### expire -#### notify -#### script -#### multi -#### sort - -### 服务框架 -#### server -#### config -#### module -#### ae -#### aof -#### rdb - -### 服务集群 -#### replication -#### sentinel -#### cluster -#### pubsub - -### 应用场景 -#### 数据缓存 -#### 分布式锁 -#### 计数统计 -#### 消息队列 - -基本类型 -``` -typedef struct redisObject { // server.h:585 - unsigned type:4; - unsigned encoding:4; - unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or - * LFU data (least significant 8 bits frequency - * and most significant 16 bits access time). */ - int refcount; - void *ptr; -} robj; -``` -``` -typedef struct redisDb { // server.h:611 - dict *dict; /* The keyspace for this DB */ - dict *expires; /* Timeout of keys with a timeout set */ - dict *blocking_keys; /* Keys with clients waiting for data (BLPOP)*/ - dict *ready_keys; /* Blocked keys that received a PUSH */ - dict *watched_keys; /* WATCHED keys for MULTI/EXEC CAS */ - int id; /* Database ID */ - long long avg_ttl; /* Average TTL, just for stats */ -} redisDb; - -struct redisServer { // server.h:874 - ... - redisDb *db; - ... - int dbnum; /* Total number of configured DBs */ - ... -} -``` - - -## 基本类型 -### 字符串sds -``` -struct __attribute__ ((__packed__)) sdshdr64 { // sds.h:68 - uint64_t len; /* used */ - uint64_t alloc; /* excluding the header and null terminator */ - unsigned char flags; /* 3 lsb of type, 5 unused bits */ - char buf[]; -}; -``` - -### 双链表adlist -``` -typedef struct listNode { // adlist.h - struct listNode *prev; - struct listNode *next; - void *value; -} listNode; - -typedef struct list { - listNode *head; - listNode *tail; - void *(*dup)(void *ptr); - void (*free)(void *ptr); - int (*match)(void *ptr, void *key); - unsigned long len; -} list; -``` - -``` -struct redisCommand redisCommandTable[] = { -} -``` - -### 哈希表dict -``` -typedef struct dictEntry { // dict.h - void *key; - union { - void *val; - uint64_t u64; - int64_t s64; - double d; - } v; - struct dictEntry *next; -} dictEntry; - -typedef struct dictType { - uint64_t (*hashFunction)(const void *key); - void *(*keyDup)(void *privdata, const void *key); - void *(*valDup)(void *privdata, const void *obj); - int (*keyCompare)(void *privdata, const void *key1, const void *key2); - void (*keyDestructor)(void *privdata, void *key); - void (*valDestructor)(void *privdata, void *obj); -} dictType; - -/* This is our hash table structure. Every dictionary has two of this as we - * implement incremental rehashing, for the old to the new table. */ -typedef struct dictht { - dictEntry **table; - unsigned long size; - unsigned long sizemask; - unsigned long used; -} dictht; - -typedef struct dict { - dictType *type; - void *privdata; - dictht ht[2]; - long rehashidx; /* rehashing not in progress if rehashidx == -1 */ - unsigned long iterators; /* number of iterators currently running */ -} dict; -``` - -### 跳跃表zskiplist -``` -zskiplistNode { // server.h - sds ele; - double score; - struct zskiplistNode *backward; - struct zskiplistLevel { - struct zskiplistNode *forward; - unsigned int span; - } level[]; -} zskiplistNode; - -typedef struct zskiplist { - struct zskiplistNode *header, *tail; - unsigned long length; - int level; -} zskiplist; -``` - -### 整数集合intset -``` -typedef struct intset { // intset.h - uint32_t encoding; - uint32_t length; - int8_t contents[]; -} intset; -``` - -## 源码解析 -### 目录解析 - -- COPYING 版权文件 -- README.md 说明文档 -- Makefile make文件 -- deps/ 依赖库 -- src/ 源码目录 -- tests/ 测试脚本 -- utils/ 工具脚本 -- redis.conf 配置文件 -- sentinel.conf 配置文件 - -BUGS -INSTALL -MANIFESTO -CONTRIBUTING -00-RELEASENOTES - -dump.rdb -runtest -runtest-cluster -runtest-sentinel - -### 代码解析 -``` -server.h //服务端 - redisObject:struct //数据结构 - type:unsigned - encoding:unsigned - lru:unsigned - refcount:int - ptr:void* - -server.c //服务端 - server: redisServer //服务端上下文 - pid: pid_t - configfile: char* - executable: char* - exec_argv: char* - commands: dict* //命令哈希表 - db: redisDb* //数据库 - dict: dict* - expires: dict* - blocking_keys: dict* - ready_keys: dict* - watched_keys: dict* - id: int - avg_ttl: long long - clients: list/client //客户端连接 - id: uint64 - fd: int - db: redisDb* - name: robj* - querybuf: sds - pending_querybuf: sds - argc: int - argv: robj** - cmd: redisCommand* - reply: list* - - redisCommandTable: redisCommand //命令列表 - "get": getCommand - "set": setCommand - setGenericCommand(c) - setKey(c->db,k,v) - lookupKeyWrite(db,k) - lookupKey(db,k) - dictFind(db->dict,k->ptr) - dbAdd(db,k,v) - dictAdd(db->dict,k->ptr,v) - dbOverwrite(db,k,v) - dictReplace(db->dict,k->ptr,v) - addReply(c, o) - prepareClientToWrite(c) - listAddNodeHead(server.clients_pending_write, c) - _addReplyToBuffer(c, o) - c->buf - c->bufpos - _addReplyObjecToList(c, o) - listAddNodeTail(c->reply, sdsdup(o->ptr)) - - serverLog() //输出日志 - server.verbosity - serverLogRaw() - server.logfile - ustime() - mstime() - - - main() //程序入口 - initServerConfig() //初始化server - populateCommandTable() //加载命令列表 - server.commands = redisCommandTable - loadServerConfig() //加载配置文件 - initServer() // - aeCreateFileEvent() - loadDataFromDisk() - aeMain():ae.c //事件循环 - el->beforesleep() - handleClientsWithPendingWrites() //返回命令执行结果 - writeToClient(c) - write(c->buf) - aeProcessEvents(el):ae.c - aeApiPoll() - el->aftersleep() - fe->rfileProc()/acceptTcpHandler() //添加网络监听事件 - anetTcpAccept() - acceptCommonHandler() - createClient() - aeCreateFileEvent()/readQueryFromClient(el) //添加读取数据事件 - read(c->querybuf) - processInputBuffer(c) - processInlineBuffer() //解析客户端命令 - c->argv[i]=createObject() - processCommand(c) //执行客户端命令 - c->cmd=lookupCommand() - dictFetchValue(server.commands) - call(c) - c->cmd->proc(c)/setCommand(c) - - fe->wfileProc() - fe->rfileProc() - processTimeEvnts() - -db.c - setKey() -t_string.c - setGenericCommand() - setCommand() - -t_hash.c - -t_list.c -t_set.c -t_zset.c - -networking.c // - createClient() - -adlist.h //双链表 -aslist.c -ae.h //事件循环 -ae.c -ae_epoll.c -ae_evport.c -ae_kqueue.c -ae_select.c -anet.h //网络接口 -anet.c -aof.c -asciilogo.h -atomicvar.h -bio.h -bio.c -bitops.c -blocked.c -childinfo.c -cluster.h -cluster.c -config.h -config.c -crc16.c -crc64.c -crc64.h -debug.c -debugmacro.h -defrag.c -dict.h -dict.c -edianconv.c -edianconv.h -evict.c -expire.c -fmacros.h -geo.c -geo.h -geohash.h -geohash.c -geohash_helper.h -geohash_helper.c -help.h -hyperloglog.c -intset.h -intset.c -latency.h -latency.c -lazyfree.c -lzf.h -lzf_c.h -lzf_d.h -lzfP.h -memtest.c -module.c -multi.c -networking.c -notify.c -object.c -pqsort.c -pqsort.h -pubsub.c -quicklist.c -quicklist.h -rand.c -rand.h -rax.c -rax.h -rax.malloc.h -rdb.c -rdb.h -redis-benchmark.c -redis-cli.c -redisassert.h -redismodule.h -release.c -release.h -replication.c -rio.h -rio.c -scripting.c -sds.h -sds.c -sdsalloc.h -sentinel.c -setproctitle.c -sha1.h -sha1.c -siphash.h -siphash.c -sort.c -sparkline.h -sparkline.c -syncio.c -testhelp.c -util.c -util.h -version.h -ziplist.h -ziplist.c -zipmap.c -zipmap.h -zmalloc.c -zmalloc.h - - - - - -dict.c // - dict:struct - type:dictType - privdata:void* - ht:dictht[2] - table:dictEntry** - key:void* - v:union - next:void* - size:long - sizemask:long - used:long - rehashidx:long - iterators:long - -zmalloc.c //内存管理 - zmalloc() - zcalloc() - zrealloc() - zmalloc_size() - zfree() - zstrdup() -``` - -### server.h -#### struct redisServer -#### struct client -#### struct redisObject -### networking.c -### db.c -### object.c -### t_hash.c -### t_list.c -### t_set.c -### t_string.c -### t_zset.c -### ae.c 事件循环 - diff --git a/usr/local/wiki/自然/编程/后端技术栈/thrift.md b/usr/local/wiki/自然/编程/后端技术栈/thrift.md deleted file mode 100644 index e69de29b..00000000 diff --git a/usr/local/wiki/自然/编程/后端技术栈/uwsgi.md b/usr/local/wiki/自然/编程/后端技术栈/uwsgi.md deleted file mode 100644 index e69de29b..00000000 diff --git a/usr/local/wiki/自然/编程/终端工具链/alpine.md b/usr/local/wiki/自然/编程/终端工具链/alpine.md deleted file mode 100644 index c0d6cf7c..00000000 --- a/usr/local/wiki/自然/编程/终端工具链/alpine.md +++ /dev/null @@ -1,79 +0,0 @@ -## alpine - -- 官网: https://www.alpinelinux.org/ -- 文档: https://wiki.alpinelinux.org/ -- 源码: https://github.com/alpinelinux/docker-alpine -- 博客: https://blog.csdn.net/zl1zl2zl3/article/details/80118001 - -## 安装 - -``` -docker run alpine -it pwd -``` - -## 安装 -### 主机名 -``` -$ echo myos > /etc/hostname -$ hostname -F /etc/hostname -$ sed -i -r 's#127.0.0.1.*#127.0.0.1 myos#g' /etc/hosts -$ /etc/resolv.conf -``` - -### 网络配置 -``` -$ ip -$ ping -$ udhcpc -$ ifconfig -$ /etc/network/interfaces -auto lo -iface lo inet lookback -auto eth0 -iface eth0 inet dhcp -iface eth1 inet static -iface eth1 inet static - address 192.168.1.21 - netmask 255.255.0.0 - gateway 192.168.1.1 - -$ wpa_supplicant -$ /etc/wpa_supplicant/wpa_supplicant.conf -``` - -### 包工具 -``` -/etc/apk/repositories -/var/cache/apk -/etc/apk/world -$ apk -$ apk update -$ apk search -$ apk cache -$ apk info -$ apk add -$ apk del -``` - -### 开发环境 - -``` -$ apk update -$ apk add build-base -``` - -``` -/* vi hi.c */ -#include - -int main(int argc, char *argv[]) { - println("hello c world!"); -} -``` - -``` -$ gcc hi.c -o hi -$ ./hi -hello c world! -``` - diff --git a/usr/local/wiki/自然/编程/终端工具链/docker.md b/usr/local/wiki/自然/编程/终端工具链/docker.md deleted file mode 100644 index 5a5a9e1d..00000000 --- a/usr/local/wiki/自然/编程/终端工具链/docker.md +++ /dev/null @@ -1,59 +0,0 @@ -## 简介 -docker为应用软件提供一个完整的独立的运行环境,比物理机与虚拟机更加轻量。 - -- 官网: -- 文档: -- 源码: -- 入门: - -配置镜像加速器 - -MAC->Preferences->Daemon->Register Mirrors->"https://registry.docker-cn.com" - -### 基本命令 -下载镜像,启动容器。 -``` -$ docker pull busybox:latest -$ docker run -it busybox -# -``` - -挂载目录,启动容器。 -``` -$ docker run -it -v ~/share:/home/share busybox -``` - -### 镜像管理 docker image - -- 查看: docker image ls -- 删除: docker image rm -- 清理: docker image prune - -### 容器管理 docker container -- 查看: docker container ls -- 查看: docker container ls -a -- 清理: docker container prune - -### 启动容器 docker run -- 交互式启动: docker run -it busybox - -- 守护式启动: docker run -dt busybox - - 交互式连接: docker exec -it *container* sh - - 一次性执行: docker exec *container* ls - - 停止容器: docker stop *container* - -### 制作镜像 - -- 交互式: docker commit *container* *repos:tag* -- 脚本式: docker build *deploy_path* - -``` -$ mkdir image && cd image -$ vi Dockerfile -FROM debian -RUN apt-get update\ - && apt-get install python \ - && apt-get install git -$ docker build . -``` - diff --git a/usr/local/wiki/自然/编程/终端工具链/git.md b/usr/local/wiki/自然/编程/终端工具链/git.md deleted file mode 100644 index e69de29b..00000000 diff --git a/usr/local/wiki/自然/编程/终端工具链/index.md b/usr/local/wiki/自然/编程/终端工具链/index.md deleted file mode 100644 index 4e1d4714..00000000 --- a/usr/local/wiki/自然/编程/终端工具链/index.md +++ /dev/null @@ -1,1449 +0,0 @@ -## 《终端工具链》简介 -终端工具链,就是对编程开发过程中所用到的各种命令行的工具进行高效的组合,不断的提升编程速度与开发效率。 - -- 在主流的系统中,Ubuntu的命令行最为强大,有丰富的命令行工具,可以很容易组合出自己的终端工具链; -- 其次是MacOSX,命令行也很丰富,再搭配上苹果电脑的硬件与系统,可以组合出很流畅的终端工具链; -- 最后是Windows,命令行功能弱的可以忽略,但可以安装一个shell工具[git-scm](https://git-scm.com/downloads),使用一些基本的命令,如果需要更丰富的命令行工具,可以本地安装虚拟机或是远程连接云主机,使用Ubuntu。 - -命令行终端,与图形界面不同,是以一种文本化的方式与系统进行交互。 -可以很直接、很高效执行各种系统操作,同时各种重复性的操作,都可以很方便的写成程序脚本,和系统命令一样直接调用,不断的提升操作效率。 - -在终端里,有大量丰富的命令可以使用,不可能全部掌握,一些基本的命令会使用即可。 -但在开发流程,想提升编程速度与开发效率,就需要深入理解与熟练掌握这几个工具:zsh、tmux、docker、git、vim。 - -- **zsh** 和系统默认自带的bash一样,也是一种shell,不断的解析用户或脚本的输入,执行各种命令。但提供了更丰富的特性,如各种补全,命令补全、文件补全、历史补全,可以极大的提升操作效率。 -- **tmux** 是一款高效的终端分屏器,可以在终端把一块屏幕分成多个小窗口,每个窗口都启动一个独立shell,这样就可以充分的利用屏幕,同时执行多个命令。 -- **docker** 是一种容器软件,像虚拟机一样为应用软件提供一个完整独立的运行环境,但以一种更加轻量简捷的方式实现,极大的简化的软件的部署与分发。 -- **git** 是代码的版本控制软件,用来管理代码的每次变化,分支与版本,本地与远程代码仓库,可以实现多人协作开发。 -- **vim** 是一款极其强大的编辑器,通过模式化快捷键提升编辑速度,通过灵活的脚本与插件扩展丰富的功能。 - -使用zsh+tmux+vim的工具链,根据自己的使用习惯进行个性化配置,就可以极大的提升编程速度与开发效率。 - -## 基础入门 -每个系统上打开终端的方式都不一样,根据自己的系统进行操作。 - -- 在Ubuntu中,按Ctrl+Alt+T,可以直接打开终端。 -- 在Mac中,打开Finder,然后打开,应用->实用工具->终端。 -- 在Windows里,先下载一个应用:[git-scm](https://git-scm.com/downloads),按步骤安装即可,然后打开应用Git bash。 - -打开终端后,你就打开了一个全新的世界,通过命令行,你就可以自由自在的控制你自己的电脑,并可以直接与世界上成千上万的计算机进行各种交互。 - -先来体验一下几个基本的命令吧。 - -输入"date",并按回车,即可查看当前日期与时间。 -``` -$ date -Wed Sep 12 09:32:53 CST 2018 -``` -输入"pwd",并按回车,即可查看当前所在目录。 -``` -$ pwd -/Users/shaoying -``` -在Mac上输入"open"可以打开各种应用,如访问网页。 -``` -$ open http://www.baidu.com -``` -在Mac上将文字转换成语音播放。 -``` -say hello -``` -查看电脑开机时长。 -``` -$ uptime -19:31 up 26 days, 21:21, 3 users, load averages: 2.00 1.96 1.98 -``` -查看主机名。 -``` -$ hostname -shy-MacBook-Pro.local -``` -下载文件,使用wget命令,参数输入下载链接地址,即可下载文件到当前目录。 -``` -$ wget http://www.baidu.com -``` - -如果Mac上没有brew,可以安装一下[Mac包管理器](https://github.com/Homebrew/brew)。更多信息参考[HomeBrew官网](https://brew.sh/) -``` -$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" -``` -### zsh使用 -Mac上自带zsh,不用安装,但Ubuntu上需要自己安装一下。 -``` -$ sudo apt-get install zsh -``` -原生的zsh不是很好用,可以安装一个[zsh插件管理器](https://github.com/robbyrussell/oh-my-zsh)。 -更多信息可以查看[ohmyzsh官网](https://ohmyz.sh/)。 -``` -$ sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" -``` -如果在Ubuntu上没有安装curl,可以安装一下。 - -在终端常用的搜索命令有find与grep。 -ag就是取代grep,对指定目录下的所有文件的内容进行全文搜索。 -度h -``` -$ sudo apt-get install curl -``` -``` -$ brew install the_silver_searcher -``` -``` -$ sudo apt-get install silversearcher-ag -``` -### tmux使用 -在开发与测试的过程中,经常会同时处理多个事情,就用到多个终端窗口,可以使用SecureCRT、PuTTY、Terimal、iTerm、Konsole等软件去管理这些终端。 -不过窗口一多,在一堆标签中来回切换窗口,简直是恶梦一样,经常会翻来翻去,搞半天才能找到自己想用的终端窗口。 -而且尤其是连接远程服务器,网络一但断开,所有的窗口就要重新连接,而且终端里的操作历史基本上就废了,很多工作就要重新操作一遍了。 - -tmux就是一款极其强大的终端管理软件。 -它不仅可以把一个窗口分隔成任意多个小窗口,每个窗口都是一个独立的终端,像IDE一样把几个相关的终端窗口放在一个界面中。 -而且即使网络中断也不会丢失任何数据,重新连接后可以继续工作,不会感觉出现场环境有任何变化。 -仅凭这两点,tmux就可以极大的提高工作的效率和工作连续性。 - -Ubuntu上安装tmux -``` -$ sudo apt-get install tmux -``` -Mac上安装tmux -``` -$ brew install tmux -``` -Windows上安装tmux还是算了,太折腾了,放弃吧。 - -启动或连接tmux。 -``` -$ tmux -``` -每次在终端运行tmux命令时,tmux命令本身作为一个客户端,会去连接后台服务,如果服务进程不存在,就会创建一个后台服务进程。 -所以tmux是以CS的服务模式管理终端的,即使网络中断了,客户端退出了,所有的运行终端都完整的保存在服务进程中。 - -服务启动后,和普通终端一样,就可以在tmux的窗口中执行各种命令行了。 -tmux有三种交互方式,快捷键,命令行,配置文件。 - -#### tmux快捷键体验 -tmux默认的控制键是Ctrl+b,然后再输入命令字符。就可以对tmux进行各种控制。 - -示例如下,按下Ctrl+b,然后再按引号键,就可以将当前终端窗口分隔成上下两个终端。 -``` -Ctrl+b " -``` -示例如下,按下Ctrl+b,然后再按百分号键,就可以将当前终端窗口分隔成左右两个终端。 -``` -Ctrl+b % -``` -示例如下,按下Ctrl+b,然后再按字母o,就可以在两个终端窗口间来回切换。 -``` -Ctrl+b o -``` - -示例如下,按下Ctrl+b,然后再按字母c,就可以创建一个新窗口。 -``` -Ctrl+b c -``` -示例如下,按下Ctrl+b,然后再按字母n,就可以切换到后一个窗口。 -``` -Ctrl+b n -``` -示例如下,按下Ctrl+b,然后再按字母p,就可以切换到前一个窗口。 -``` -Ctrl+b p -``` -示例如下,按下Ctrl+b,然后再按字母d,就会断开当前连接,回到原始的终端窗口,但tmux会话中的所有终端都还在运行。 -``` -Ctrl+b d -``` -断开连接后,在终端中再次执行tmux命令,tmux会重新连接会话,之前的窗口都会原样打开。 -``` -$ tmux -``` - -示例如下,按下Ctrl+b,然后再按问号?,就可以查看所有快捷键。可以按方向键上下翻页,按字母q可以退出查看。 -``` -Ctrl+b ? -``` - -#### tmux命令行体验 -tmux的控制方式除了方便的快捷键,还有丰富的命令行。 - -如下命令,查看有多少个窗口。 -``` -$ tmux list-windows -``` -如下命令,创建一个新窗口。再调用list-windows,就可以看到新的窗口。 -``` -$ tmux new-window -``` -如下命令,查看有多少个会话。 -``` -$ tmux list-sessions -``` -如下命令,连接最近的会话。 -``` -$ tmux attach-session -``` - -除了在外部终端命令行中执行tmux命令,还可以在tmux中执行命令,按Ctrl+b然后按冒号,就进入底行模式,然后就可以输入各种命令,最后按回车执行。 -``` -Ctrl+b : split-window -``` -显示时间,按任意键退出。 -``` -Ctrl+b : clock-mode -``` -显示状态条 -``` -Ctrl+b : set status on -``` -隐藏状态条 -``` -Ctrl+b : set status on -``` - -#### tmux功能详解 -每次运行tmux都会启动一个客户端client,每个客户端client会连接到服务端server下的某一个会话session。 -当然多个客户端client可以连接同一个会话session,所以client与session是多对一的关系。 - -每一个会话session下面可以管理多个窗口window,每个窗口window可以被分隔成多个窗格pane,每个窗格pane就是一个独立的终端teriminal。 -所以从server->session->window->pane就形成一个树状的结构,每个叶子节点就是pane,即一个终端。 - -命令如下,查看客户端列表。 -``` -$ tmux list-clients -/dev/ttys000: context [158x42 xterm-256color] (utf8) -``` -其中"/dev/ttys000"就是客户端设备, "context"是会话名,"158x42"是窗口宽高,utf8是字符集。 - -命令的详细定义可以查man手册,"man tmux",可以查看每条命令的详细定义。 -``` -list-clients (lsc) [-F format] [-t target-session] -``` -其中"list-clients"是命令,lsc是命令简写, -"-F format",可以指定输出内容格式, -"-t target-session",可以查看指定会话下有多少客户端连接,默认查看所有会话下的客户端。 - -查看所有会话session -``` -list-sessions (ls) [-F format] -``` - -查看某会话或所有会话下的所有窗口window -``` -list-windows (lsw) [-a] [-F format] [-t target-session] -``` - -查看某窗口或所有窗口下的所有空格pane -``` -list-panes (lsp) [-as] [-F format] [-t target-window] -``` -除了终端管理,tmux还提供了缓存管理,方便在终端间复制文字。tmux会保存每次复制的内容。 -``` -list-buffers (lsb) [-F format] -``` - -查看所有命令行 -``` -list-commands (lscm) [-F format] -``` -查看所有快捷键 -``` -list-keys (lsk) [-t mode-table] [-T key-table] -``` - -#### tmux会话管理 -新建会话 -``` -new-session (new) [-AdDEP] [-c start-directory] [-F format] [-n window-name] [-s session-name] [-t target-session] [-x width] [-y height] [command] -``` -- "-s session-name" 指定会话名 -- "-n window-name" 指定初始窗口的名字 -- "-c start-directory" 设定起始目录 -- "-d" 会话创建成功后,不自动连接 - - "-x width" 指定窗口宽度 - - "-y width" 指定窗口调试 -- "-A" 如果会话存在就自动连接 - - "-D" 自动连接会话时,断开会话与其它客户端连接 -- "-t target-session" 创建共享会话,新会话session-name与已存在的target-session共享所有窗口 -- "-P format" 指定命令输出的格式 -- "command" 窗口创建成功后执行的shell命令 - - -会话是否存在 -``` -has-session (has) [-t target-session] -``` -重命名会话 -``` -rename-session (rename) [-t target-session] new-name -``` -连接会话 -``` -attach-session (attach) [-dEr] [-c working-directory] [-t target-session] -``` -锁定会话 -``` -lock-session (locks) [-t target-session] -``` -删除会话 -``` -kill-session (killp) [-a] [-t target-pane] -``` - -#### tmux窗口管理 -创建窗口 -``` -new-window (neww) [-adkP] [-c start-directory] [-F format] [-n window-name] [-t target-window] [command] -``` -- -n 指定新窗口的名字 -- -t 指定新窗口的位置 - - -a 新创建的窗口在-t指定窗口后面的位置 - - -k -t指定的位置如果存在窗口,则删除此窗口,并插入新的窗口 -- -c 指定新窗口的当前目录 -- -d 新窗口创建后,不切换为当前窗口 -- -P 命令执行成功后,返回字符串 - - -F 返回字符串的格式 -- command 窗口启动后执行的命令 - -分割窗口,将一个窗口分成上下或左右两个窗口 -``` -split-window (splitw) [-bdfhvP] [-c start-directory] [-F format] [-p percentage|-l size] [-t target-pane] [command] -``` -- -t 被分割的窗口 -- -h 分割成左右两个窗口 -- -v 分割成上下两个窗口 -- -b 指定新窗口的位置在左边或是上边 -- -f 新窗口高度占满整个窗口 -- -p 指定窗口宽度或高度百分比 -- -l 指定窗口的宽度或高度 -- -P 命令执行成功后返回字符串 - - -F 返回字符串的格式 -- -d 新窗口不切换为当前窗口 -- -c 新窗口的当前目录 -- command 执行的命令 - -重命令窗口 -``` -rename-window (renamew) [-t target-window] new-name -``` -查找窗口 -``` -find-window (findw) [-CNT] [-F format] [-t target-window] match-string -``` -- -N 从窗口名字中匹配 -- -C 从窗口内容中匹配 -- -T 从窗口标题中匹配 -- match-string 匹配字符串 - -切换最近使用的窗口 -``` -last-window (last) [-t target-session] -``` -切换下一个的窗口 -``` -next-window (next) [-a] [-t target-session] -``` -切换上一个的窗口 -``` -previous-window (prev) [-a] [-t target-session] -``` - -交换两个窗口的位置 -``` -swap-window (swapw) [-d] [-s src-window] [-t dst-window] -``` -移动窗口到指定位置 -``` -move-window (movew) [-dkr] [-s src-window] [-t dst-window] -``` -镜像出一个窗口 -``` -link-window (linkw) [-dk] [-s src-window] [-t dst-window] -``` -删除镜像 -``` -unlink-window (unlinkw) [-k] [-t target-window] -``` -删除窗口 -``` -kill-window (killw) [-a] [-t target-window] -``` -激活窗口 -``` -respawn-window (respawnw) [-k] [-t target-window] [command] -``` - -循环移动窗口位置 -``` -rotate-window (rotatew) [-DU] [-t target-window] -``` - -窗口切换到下一种布局 -``` -next-layout (nextl) [-t target-window] -``` -窗口切换到上一种布局 -``` -previous-layout (prevl) [-t target-window] -``` - -显示所有窗口的序号 -``` -display-panes (displayp) [-t target-client] -``` - -切换到上一次选中的面板 -``` -last-pane (lastp) [-de] [-t target-window] -``` - -交换两个面板的位置 -``` -swap-pane (swapp) [-dDU] [-s src-pane] [-t dst-pane] -``` -合并面板,把"-t dst-pane"的面板分割成两个, 把-s指定的面板移到新分割的位置中,-t与-s位于相同的窗口中 -``` -move-pane (movep) [-bdhv] [-p percentage|-l size] [-s src-pane] [-t dst-pane] -``` -合并面板,把"-t dst-pane"的面板分割成两个, 把-s指定的面板移到新分割的位置中,-t与-s位于不同的窗口中 -``` -join-pane (joinp) [-bdhv] [-p percentage|-l size] [-s src-pane] [-t dst-pane] -``` -把某个面板,移动到一个新的窗口 -``` -break-pane (breakp) [-dP] [-F format] [-s src-pane] [-t dst-window] -``` -调整大小 -``` -resize-pane (resizep) [-DLMRUZ] [-x width] [-y height] [-t target-pane] [adjustment] -``` -- -Z 占满全屏或恢复原大小 -- -U 扩大上边缘位置 -- -D 扩大下边缘位置 -- -L 扩大左边缘位置 -- -R 扩大右边缘位置 - -``` -pipe-pane (pipep) [-o] [-t target-pane] [command] -``` - -捕获面板内容 -``` -capture-pane (capturep) [-aCeJpPq] [-b buffer-name] [-E end-line] [-S start-line][-t target-pane] -``` -- -e 保留转义格式 -- -p 输出内容到标准输出 -- -b 输出内容到缓存 -- -S start-line 起始行 -- -E end-line 结束行 -- -t 目标面板 - -重新激活面板 -``` -respawn-pane (respawnp) [-k] [-t target-pane] [command] -``` - -删除一个面板 -``` -kill-pane (killp) [-a] [-t target-pane] -``` - -切换当前窗口 -``` -select-window (selectw) [-lnpT] [-t target-window] -``` - -切换当前面板 -``` -select-pane (selectp) [-DdegLlMmRU] [-P style] [-t target-pane] -``` -- -d 禁止面板输入 -- -e 使能面板输入 -- -m 标记面板,被标记的面板作为join-pane swap-pane swap-window命令-s的默认参数 -- -M 取消标记 -- -g 显示终端属性 -- -P style 设置终端属性 -- -t 目标面板 -- -D -U -L -R 目标面板为-t指定面板的相邻面板 - -选择窗口布局 -``` -select-layout (selectl) [-nop] [-t target-window] [layout-name] -``` - -交互式选择客户端 -``` -choose-client (capturep) [-aCeJpPq] [-b buffer-name] [-E end-line] [-S start-line][-t target-pane] -``` -交互式选择会话 -``` -choose-session (capturep) [-aCeJpPq] [-b buffer-name] [-E end-line] [-S start-line][-t target-pane] -``` -交互式选择窗口 -``` -choose-window (capturep) [-aCeJpPq] [-b buffer-name] [-E end-line] [-S start-line][-t target-pane] -``` -交互式选择会话或窗口 -``` -choose-tree (capturep) [-aCeJpPq] [-b buffer-name] [-E end-line] [-S start-line][-t target-pane] -``` -交互式选择缓存 -``` -choose-buffer (capturep) [-aCeJpPq] [-b buffer-name] [-E end-line] [-S start-line][-t target-pane] -``` - -#### tmux缓存管理 -进入复制模式 -``` -copy-mode [-t target-pane] -``` -复制模式,用户就可以浏览此窗口的输出历史,并可以复制内容到缓存 - -清空面板输出的历史记录 -``` -clear-history (clearhist) [-t target-pane] -``` - -粘贴缓存内容到指定面板 -``` -paste-buffer (pasteb) [-dpr] [-s separator] [-b buffer-name] [-t target-pane] -``` -设置缓存内容 -``` -set-buffer (setb) [-a] [-b buffer-name] [-n new-buffer-name] data -``` -- -a 保存缓存内容,并追加到后面 -- -b 指定缓存的名字 -- -n 缓存的新名字 -- data 新加内容 - -显示某条缓存的内容 -``` -show-buffer (showb) [-b buffer-name] -``` -将某条缓存内容保存到文件 -``` -save-buffer (saveb) [-a] [-b buffer-name] path -``` -将文件内容加载到某条缓存 -``` -load-buffer (loadb) [-b buffer-name] path -``` -删除某条缓存 -``` -delete-buffer (deleteb) [-b buffer-name] -``` - -#### tmux快捷键与命令行 - -发送前缀键到面板 -``` -send-prefix [-t target-pane] -``` -发送字符到面板 -``` -send-keys (send) [-lRM] [-t target-pane] key ... -``` -快捷键映射到命令行 -``` -bind-key (bind) [-cnr] [-t mode-table] [-R repeat-count] [-T key-table] key command [arguments] -``` -取消映射 -``` -unbind-key (unbind) [-acn] [-t mode-table] [-T key-table] key -``` - -``` -clock-mode (clearhist) [-t target-pane] -``` - -输出信息 -``` -display-message (display) [-p] [-c target-client] [-F format] [-t target-pane] [message] -``` -- -p 作为命令的输出,否则输出到状态行 -- -c target-client 指定客户端 -- -t target-pane 指定面板 -- message 输出的消息 - -查看输出历史 -``` -show-messages (showmsgs) [-JT] [-t target-client] -``` - -执行命令前,让用户选择一下是否执行 -``` -confirm-before (confirm) [-p prompt] [-t target-client] command -``` -执行命令前,让用户输出一些参数 -``` -command-prompt [-p prompts] [-I inputs] [-t target-client] [template] -``` -- -p 提示信息 -- -I 参数默认值 -- -t 指定客户端 -- template 命令模板 -``` - -执行Shell命令 -``` -run-shell (run) [-b] [-t target-pane] shell-command -``` -执行完Shell命令,根据执行结果,选择执行tmux的命令 -``` -if-shell (if) [-bF] [-t target-pane] shell-command command [command] -``` - -显示环境变量 -``` -show-environment (showenv) [-gs] [-t target-session] [name] -``` -设置环境变量 -``` -set-environment (setenv) [-gru] [-t target-session] name [value] -``` - -显示配置 -``` -show-options (show) [-gqsvw] [-t target-session|target-window] [option] -``` -- -s 服务级配置 -- -w 窗口级配置 -- -g 显示全局配置 -- -v 只显示配置值 -- -t 目标会话或窗口 -- option 配置项 - -修改配置 -``` -set-option (set) [-agosquw] [-t target-window] option [value] -``` - -加载脚本, -可以将tmux命令写文件中,并随时加载执行,tmux服务在启动时,会默认加载~/.tmux.conf,所以可以将一些默认的配置写此文件中 -``` -source-file (source) [-q] path -``` - -同步机制, -tmux提供了一种同步机制,shell命令可以等待tmux条件,tmux可触发条件 -``` -wait-for (wait) [-L|-S|-U] channel -``` - -其它命令 -``` -set-hook (setenv) [-gru] [-t target-session] name [value] -show-hooks (showenv) [-gs] [-t target-session] [name] -``` - -#### tmux客户端与服务端 -刷新客户端 -``` -refresh-client (refresh) [-S] [-C size] [-t target-client] -``` -挂起客户端 -``` -suspend-client (suspendc) [-t target-client] -``` -切换客户端与会话的关系 -``` -switch-client (switchc) [-Elnpr] [-c target-client] [-t target-session] [-T key-table] -``` -断开客户端与会话的连接 -``` -detach-client (detach) [-P] [-a] [-s target-session] [-t target-client] -``` -锁定客户端 -``` -lock-client (lockc) [-t target-client] -``` -查看服务信息 -``` -server-info (info) -``` -启动服务进程 -``` -start-server (start) -``` -结束服务进程 -``` -kill-server -``` -锁定所有客户端 -``` -lock-server (lock) -``` - -#### tmux服务配置 -常规配置 -``` -buffer-limit 20 -message-limit 100 -exit-unattached off -set-clipboard on - -default-terminal "screen" -escape-time 500 -focus-events off -history-file "" -quiet off -terminal-overrides "xterm*:XT:Ms=\E]52;%p1%s;%p2%s\007:Cs=\E]12;%p1%s\007:Cr=\E]112\007:Ss=\E[%p1%d q:Se=\E[2 q,screen*:XT" -``` - -#### tmux会话配置 -使用set命令,可以修改tmux一些配置,让tmux更加个性化 - -启用鼠标 -``` -mouse on -``` -设置命令前缀 -``` -prefix C-s -prefix2 None -``` -设置状态栏 -``` -status on -status-keys vi -status-interval 15 -status-justify left -status-position bottom -status-style fg=black,bg=green -status-left "[#S] " -status-left-length 10 -status-left-style default -status-right " "#{=21:pane_title}" %H:%M %d-%b-%y" -status-right-length 40 -status-right-style default -message-style fg=black,bg=yellow -message-command-style fg=yellow,bg=black -visual-activity off -visual-bell off -visual-silence off -bell-action any -bell-on-alert off -set-titles off -set-titles-string "#S:#I:#W - "#T" #{session_alerts}" -``` - -窗口显示的配置 -``` -display-panes-active-colour red -display-panes-colour blue -display-panes-time 5000 -display-time 5000 -``` - -启动或结束的窗口时的配置 -``` -detach-on-destroy on -destroy-unattached off -set-remain-on-exit off -default-command "" -default-shell "/bin/zsh" -lock-after-time 0 -lock-command "lock -np" -update-environment "DISPLAY SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION WINDOWID XAUTHORITY" -``` - -常规配置 -``` -base-index 1 -renumber-windows on -history-limit 50000 -word-separators " -_@" -key-table "root" -repeat-time 500 -assume-paste-time 1 -``` - -#### tmux窗口配置 -使用set -w命令或是set-window-option命令,可以设置窗口的一些配置 -窗口布局设置 -``` -force-height 0 -force-width 0 -main-pane-height 24 -main-pane-width 80 -other-pane-height 0 -other-pane-width 0 -``` - -窗口样式 -``` -pane-border-style default -pane-border-status off -pane-active-border-style fg=green -pane-border-format "#{?pane_active,#[reverse],}#{pane_index}#[default] "#{pane_title}"" - -window-style default -window-active-style default - -clock-mode-style 24 -clock-mode-colour blue -``` - -状态栏样式 -``` -window-status-separator " " -window-status-style default -window-status-bell-style reverse -window-status-last-style default -window-status-current-style default -window-status-activity-style reverse -window-status-format "#I:#W#{?window_flags,#{window_flags}, }" -window-status-current-format "#I:#W#{?window_flags,#{window_flags}, }" -``` - -常规配置 -``` -mode-keys vi -mode-style fg=black,bg=yellow -allow-rename off -automatic-rename on -automatic-rename-format "#{?pane_in_mode,[tmux],#{pane_current_command}}#{?pane_dead,[dead],}" -pane-base-index 1 -``` - -其它配置 -``` -aggressive-resize off -alternate-screen on -monitor-activity off -monitor-silence 0 -synchronize-panes off - -wrap-search on -xterm-keys off -remain-on-exit off -``` - -### docker使用 - -程序在运行的过程中,很多都需要依赖外部系统环境,如配置文件、环境变量、缓存文件等。 -现在软件往往将这些文件打包成软件包,交付给用户,并部署到生产环境。但这种方式还存在很多问题。 - -- 测试环境的一些文件或环境变量没有放到软件包中 -- 生产环境中程序与程序之间使用相同的资源,产生冲突 -- 在测试环境中,测试运行没问题,但一部署到生产环境,就出现了问题。 -- 当系统的程序一多,使用时间一长,就会积累下一堆垃圾文件,尤其是Windows和Android。 - -docker以容器的形式,将程序运行的所有环境,打包成一个独立的镜像,进行交付与部署。 -应用程序运行的容器中,有一个独立的根文件系统,并可以监听任意端口,设置环境变量,就好像独自占有一个操作系统。 -这样就可以保证程序运行环境的完整性与独立性,测试环境与生产环境不会有差异。 -在外部看来就只是一个镜像文件,很方便的添加与删除,也不会在系统残留任何文件。 -并且这个容器中的运行环境,可以像git管理代码一样,记录下各个历史版本,并可以随时切换。 - -与VMware或是VirtualBox之类的虚拟机相比,docker更加轻量,docker中的进程和本机进程一样,docker中的文件和本机文件一样,docker只是将它们组织在一起。 -而不像虚拟机一样,需要虚拟出一个完整的操作系统,并提供一堆设备驱动程序,一台普通的电脑开几个虚拟机资源就不足了,但docker却像进程一样占有很少的资源,可以运行很多容器。 - -docker分为企业版EE,社区版CE,对于个人使用社区版即可。更多信息参考:[docker官网](https://docs.docker.com/) - -- [Windows版docker下载](https://store.docker.com/editions/community/docker-ce-desktop-windows) -- [Mac版docker下载](https://store.docker.com/editions/community/docker-ce-desktop-mac) - -Ubuntu上安装docker,还需要将docker官网加到软件源中 -``` -$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - -$ sudo add-apt-repository \ - "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ - $(lsb_release -cs) \ - stable" -$ sudo apt-get update -$ sudo apt-get install docker-ce -``` - -#### 入门体验 -如下示例,run命令用busybox镜像,启动了docker的一个容器。 -``` -$ docker run -it busybox -Unable to find image 'busybox:latest' locally -latest: Pulling from library/busybox -8c5a7da1afbc: Pull complete -Digest: sha256:cb63aa0641a885f54de20f61d152187419e8f6b159ed11a251a09d115f_f9bd -Status: Downloaded newer image for busybox:latest -/ # -``` -这里本机并没有busybox的镜像,所以docker自动从dockhub上,下载了busybox的镜像,并用这个镜像启动了一个容器。 -像github共享代码一样,dockhub上也共享了各种系统镜像,用户可以自由的下载与上传。 - -run命令需要一个参数,指定镜像的名称与版本,这里镜像的名字为busybox,默认的版本为latest,即最新版。 -busybox是将Unix下的常用命令经过挑选裁剪集成到一个程序中,搭配Linux内核就可以做出一个小型的操作系统,在嵌入式领域应用广泛。 -体积小到只有1M左右,下载很快,所以这里用做示例。更多信息参考[busybox官网](https://busybox.net/) - -"/ #",看到最后一行的的命令提示符,就知道容器已经启动了,就可以在这个容器的shell中,执行各种命令与操作了。最后用Ctrl+D或关闭终端窗口,就可以结束容器。 -再次运行run,又可以重新启动容器。 - - - -如下示例,除了交互式启动容器,还可以用守护的方式启动容器。 -``` -$ docker run -dt --name demo busybox -d71c8e37bcc153db239f8b1eccb5fa53d202df84d3ffa7ae4e7f8c051d0d481a -``` -- "-dt",指定容器守护的方式运行,即使终端窗口关闭了,守护式的容器会在后台一直运行,可以被反复连接使用。 -- "--name demo",指定了容器的名字为demo,每个容器启动后docker会生成一个sha256的哈希值,如这里的"d71c8e37bcc153db239f8b1eccb5fa53d202df84d3ffa7ae4e7f8c051d0d481a" -在之后的命令中,参数中需要指定容器的地方,都可以这个sha256的哈希值,也可以只写出前几位。但为了方便记忆,可以给容器指定名字。 -- "busybox",指定镜像名字与版本 - -如下示例,ps命令可以查看正在运行的容器。 -``` -$ docker ps -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -d71c8e37bcc1 busybox "sh" 14 seconds ago Up 13 seconds demo -``` -如下示例,top命令可以查看某容器中运行的进程 -``` -$ docker top demo -PID USER TIME COMMAND -4163 root 0:00 sh -``` - -如下示例,exec可以在容器中运行各种命令,并将命令输出到当前终端。 -``` -$ docker exec demo uname -Linux -$ docker exec demo hostname -d71c8e37bcc1 -``` -如下示例,还可以连接容器,启动一个交互shell。Ctrl+D或是关闭终端窗口,只会结束当前shell,容器依然还在后台继续运行。还可以被反复连接。 -``` -$ docker exec -it demo sh -/ # -``` -如下示例,还可以对容器进行重命名。可以用ps命令查看,新名字已经生效。 -``` -$ docker rename demo demo1 -``` - -容器中的根文件系统与本机的文件系统是完全隔离的,所以才能提供给容器中应用一个独立的运行环境。 - -如下示例,可以将本机文件复制到容器中。 -``` -$ docker cp ~/.vimrc demo1:/root -$ docker exec demo1 ls -a /root -. -.. -.vimrc -``` -如下示例,可以将容器中文件复制到本机。 -``` -$ docker cp demo1:/root vimrc -$ ls -vimrc -``` - -如下示例,停止容器 -``` -$ docker stop demo1 -``` - -ps命令默认只查看正在运行的容器,如果要查看已经停止的容器可以加参数-a -``` -$ docker ps -a -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -513a5e1fc6f4 busybox "sh" 4 minutes ago Exited (137) 3 seconds ago demo1 -``` - -如下示例,已经停止的容器,还可以再启动,继续运行。 -``` -$ docker start demo1 -``` - -如下示例,如果确定已经停止的容器,不会再次启动使用,可以删除掉。 -``` -$ docker rm demo1 -``` - -#### 镜像管理 -``` -docker images -image Manage images - -images List images -search Search the Docker Hub for images -pull Pull an image or a repository from a registry -push Push an image or a repository to a registry -save Save one or more images to a tar archive (streamed to STDOUT by default) -load Load an image from a tar archive or STDIN -rmi Remove one or more images - -history Show the history of an image -build Build an image from a Dockerfile -tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE -``` - -#### 容器管理 -``` -stats Display a live stream of container(s) resource usage statistics -attach Attach local standard input, output, and error streams to a running container -container Manage containers -commit Create a new image from a container's changes -diff Inspect changes to files or directories on a container's filesystem -kill Kill one or more running containers -wait Block until one or more containers stop, then print their exit codes -create Create a new container -pause Pause all processes within one or more containers -unpause Unpause all processes within one or more containers -export Export a container's filesystem as a tar archive -import Import the contents from a tarball to create a filesystem image -logs Fetch the logs of a container -restart Restart one or more containers -update Update configuration of one or more containers -volume Manage volumes -network Manage networks -``` - -#### 系统管理 -``` -deploy Deploy a new stack or update an existing stack -version Show the Docker version information -system Manage Docker -info Display system-wide information -login Log in to a Docker registry -logout Log out from a Docker registry -inspect Return low-level information on Docker objects -secret Manage Docker secrets -trust Manage trust on Docker images -``` - -#### 集群管理 -``` -config Manage Docker configs -checkpoint Manage checkpoints -plugin Manage plugins -service Manage services -swarm Manage Swarm -node Manage Swarm nodes -stack Manage Docker stacks -``` - -### git使用 -软件的开发是不断的迭代,不断的优化,不断的升级,是一个循序渐进的过程。 -所以需要对代码进行版本管理,记录每次提交的代码,可以随时查看变化与切换版本。 - -软件开发有时需要同时进行多个任务,如在开发新功能时,需要修复线上bug,所以需要分支管理。 -一般一个项目中至少会有三种分支:master、feature、bugfix。 - -此外软件开发的项目都一般是由团队完成,要多人协作共同完成功能开发,所以需要仓库管理,管理多人的代码。 - -git就是这样一种开源的代码管理工具,可以用来管理代码的版本、分支、仓库等。 - -Mac上自带git,不需要安装。 -Windows上安装了的git-scm,也集成了git,也不需要单独安装。 -但Ubuntu需要自己安装一下。 -``` -$ sudo apt-get install git -``` -#### git 基础入门 -git help tutorial -git help everyday -git help workflows -git help glossary - -git是一个命令集合,有很多子命令,可以通过help命令来查看。 -``` -$ git help -``` - -git init -git status -git diff -git add -git mv -git rm -git reset -git commit -git checkout -git blame -git log -git tag - -git branch -git merge -git rebase - -git config -git clone -git remote -git revert -git fetch -git pull -git push - -git bisect -git grep -git show - - -add merge-octopus -add--interactive merge-one-file -am merge-ours -annotate merge-recursive -apply merge-resolve -archimport merge-subtree -archive merge-tree -bisect mergetool -bisect--helper mktag -blame mktree -branch mv -bundle name-rev -cat-file notes -check-attr p4 -check-ignore pack-objects -check-mailmap pack-redundant -check-ref-format pack-refs -checkout patch-id -checkout-index prune -cherry prune-packed -cherry-pick pull -citool push -clean quiltimport -clone read-tree -column rebase -commit receive-pack -commit-tree reflog -config relink -count-objects remote -credential remote-ext -credential-cache remote-fd -credential-cache--daemon remote-ftp -credential-osxkeychain remote-ftps -credential-store remote-http -cvsexportcommit remote-https -cvsimport remote-testsvn -cvsserver repack -daemon replace -describe request-pull -diff rerere -diff-files reset -diff-index rev-list -diff-tree rev-parse -difftool revert -difftool--helper rm -fast-export send-email -fast-import send-pack -fetch sh-i18n--envsubst -fetch-pack shell -filter-branch shortlog -fmt-merge-msg show -for-each-ref show-branch -format-patch show-index -fsck show-ref -fsck-objects stage -gc stash -get-tar-commit-id status -grep stripspace -gui--askpass submodule -hash-object submodule--helper -help subtree -http-backend svn -http-fetch symbolic-ref -http-push tag -imap-send unpack-file -index-pack unpack-objects -init update-index -init-db update-ref -instaweb update-server-info -interpret-trailers upload-archive -log upload-pack -ls-files var -ls-remote verify-commit -ls-tree verify-pack -mailinfo verify-tag -mailsplit web--browse -merge whatchanged -merge-base worktree -merge-file write-tree -merge-index - -### vim入门 -Mac上自带vim,不需要安装。 -Windows上安装了的git-scm,也集成了vim,也不需要单独安装。 -但Ubuntu默认只安装了vi,vim需要自己安装一下。 -``` -$ sudo apt-get install vim -``` -vim是最高效的编辑器,没有之一。熟练掌握它的使用,会极大的提升文本或代码的编辑速度。 - -当然与常见的其它编辑器不同,vim有独特的操作模式,刚开始使用会有些奇怪。 -不过一但你理解了它的运行逻辑,适应了它的操作习惯,你这辈子都不会再想用其它的编辑器。 - -输入命令vim,如果带有参数则会打开此文件,如果没有参数,则直接打开一个空文件。 -``` -$ vim hi.txt -``` -按字母"i",进入编辑模式,然后就可以输入任意文本。 -``` -Hello Vim World! -Vim is best and fast. -You can use vim to input text or code into complute in a free style. -``` -输入完内容后,按左上角的"Esc"键,就可以退出编辑模式,回到命令模式。 -在命令模式下可以对文件内容,进行各种查看、搜索、修改等操作。vim很多高效的操作都是在命令模式下执行的。 - -最后,需要保存文件并退出时,按冒号键":",进入底行模式,再输入"wq"并按回车。 -``` -:wq -``` -#### vim的常用模式 -与其它编辑器不同,vim是一种模式化编辑器,即处在不同模式下,每个按键都会不同的功能。 -之所以vim是最高效的编辑器,这就是其中的原因之一。 - -常见的模式有:命令模式、编辑模式、底行模式。 -启动vim后,默认的模式是命令模式,其它模式都是以命令模式为基准中心进行相互切换。 -即由命令模式切到到编辑模式,由编辑模式切换到命令模式;由命令模式切换到底行模式,由底行模式切换到命令模式。 - -- 命令模式: 通过各种快捷键,对文件内容进行各种快速的查看、搜索、修改等操作。 -- 编辑模式: 和其它编辑器一样,各种字母数字按键会当成文件的内容直接输入。 -- 底行模式: 通过输入各种命令行,调用vim各种函数或脚本对文件内容进行复杂的处理。 - -不同模式下按键的功能是不一样的,所以要知道当前的模式,并能自由切换。如果不知道自己所在的模式,就按\总会回到命令模式的。 - -- 命令模式->底行模式: 输入冒号键":",从命令模式切换到底行模式。 -- 命令模式<-底行模式: 输入回车键\执行命令,或输入退出键\不执行命令,然后从底行模式,返回到命令模式。 -- 命令模式->编辑模式: 输入"i"、"I"、"a"、"A"、"o"、"O"、"s"、"S",其中任何一个键都可以进行编辑模式。 - - "i": 在光标左边的位置开始插入内容 - - "a": 在光标右边的位置开始插入内容 - - "o": 在光标下面新加一空白并开始插入内容 - - "O": 在光标上面新加一空白并开始插入内容 - - "A": 在光标当前行尾的位置开始插入内容 - - "I": 在光标当前行首的位置开始插入内容 - - "s": 删除光标下的字符,并在光标当前的位置开始插入内容 - - "S": 删除光标当前行的所有字符,并在光标当前行开始插入内容 -- 命令模式<-编辑模式: 输入退出键\,从编辑模式返回到命令模式。 - -#### vim的帮助文档 -vim有很灵活的快捷键,大量的配置与命令,和丰富的插件,所以除了要多练习,还需要多看文档。vim自带的帮助文档就很丰富很完整。 - -英文不好也没关系,vim帮助文档中的英语单词都比较简单,很容易阅读与理解。 -当然也有很多复杂的单词,不过那也无所谓,就算每篇文档只看懂一半,也能学到很多有用的技巧。 -因为英文的文档,是最接近作者的思维,功能讲解的也更加全面,所以直接查看英文文档是一个优秀程序的必备修养。 -所以要克服自己的心理,刚开始看懂多少是多少,慢慢养成直接看英文文档的习惯,文档看的多了,自然看懂的就会越来越多。 -阅读英文文档不仅可以提高英文水平,而且对你写文档和写代码的水平也会有很大的帮助。 - -打开vim,在命令模式下输入":help"并按回车,就可以进入文档中心,查看各种文档。 -``` -:help -``` - -***学VIM第一要掌握的四个快捷键就是hjkl***。 -把双手自然的放在键盘上,右手离的最近的四个键就是hjkl,所以这么黄金的位置当然分配给了使用最频繁的光标移动了。 - -- "h"键在最左边,所以按"h"当然就是把光标左移 -- "l"键在最右边,所以按"l"当然就是把光标右移 -- "j"键在食指下面,是按键最快的,所以按"j"当然就是把光标向下移。 -- 最后是"k"键,当然就是把光标向上移。 - -在帮助文档中,可以练习一下光标移动的这四个键,多体验一下,你就会感觉到vim的强大。 -在vim鼠标就是最影响编辑速度的瓶颈,练习过一段时间的快捷键后,再碰鼠标,你就会很明显的感觉到鼠标严重拖慢你的操作速度。 -再练习过一段时间后,别说鼠标了,就是那四个方向键和"Esc"键你会懒得去用,因为那太慢太慢了。 -最终使用vim的效果就是你的手腕不会有任何移动,只有手指在26个字母和10个数字键上噼里啪啦的在敲击。 - -在vim有tags标签,就像网页中的超链接一样,可以点击访问另外一个文档。 -使用的方式就是,把光标移动到有特殊标记的单词上,按下两个组合键快捷"Ctrl+]",就可以跳到另外一篇文档中。 -看完那篇文档后,按下组合键"Ctrl+T",就可以返回原来的文档。 - -另外浏览文件常用的快捷键还有。 - -- Ctrl+F 向下翻页 -- Ctrl+B 向上翻页 -- Ctrl+D 向下翻半页 -- Ctrl+U 向上翻半页 -- gg 跳到文件第一行 -- G 跳到文件最后一行 - -#### vim的文本修改 -除了前面的光标移动与翻页功能,命令模式下还有很多操作命令。 - -- cc 删除当前行,并进入编辑模式 -- dd 删除当前行 -- yy 复制当前行 -- p 在光标之后粘贴复制的内容 -- x 删除光标所在的字符 -- r 替换光标所在的字符,输入字符r后,接着输入新字符 -- u 取消操作 -- Ctrl+R 恢复取消的操作 - -#### vim的单词搜索 -除了hjkl,移动光标外,还有更快捷移动光标的方式,就是搜索。 - -- 行内搜索: "f"与"t",当用h或l进行左右移动时,经常需要按多好次键才能移动到目标位置,所以输入f加上目标位置所在的字符就可以直接跳过去。t与f相同也是跳转,只是t是跳到目标字符的左边一个位置。 -- 匹配搜索: "\*"与"#",按一下"\*",vim就会用光标所在的单词,向下搜索,直接跳到当前单词出现的下一位置。#与\*相反,是向上搜索。 -- 全文搜索: "?"与"/",如果相搜索任意单词,在命令模式下输入"/",然后输入想要搜索的单词,最后输入回车即可向下搜索并移动光标到单词所在位置。?与/相反是向上搜索。 - -#### vim的命令组合 -#### vim的常用配置 -除了前面那一堆高效的快捷键外,vim另一强大的原因就是灵活的配置。 -你完全可以根据自己的习惯,修改各种各样的配置,让编辑器更加得心应手。 - -vim的配置命令是set,在命令模式中输入":set ",再加上需要修改的配置。 - -***显示行号***,输入":set number",即可在窗口左边显示文件的所有行号,就可以很清楚的知道当前的位置。 -``` -:set number -``` -***显示相对行号***,很多时候目标位置距当前位置相隔很多行,还要去目测或一行行去数相对位置。 -设置显示相对行号后,就可以直接看到窗口中所有行相对于当前行的相对行号。 -``` -:set relativenumber -``` - -***显示光标纬线***,有时屏幕屏幕太大,往往对不准同一列的字符或同一行的内容,就可以显示经纬经。 -``` -:set cursorline -``` -***显示光标经线*** -``` -:set cursorcolumn -``` -状态行,也可以显示很多用有的信息。 -***显示光标位置*** -``` -:set ruler -``` -***显示当前命令*** -``` -:set showcmd -``` -***显示当前模式*** -``` -:set showmode -``` -#### vim的启动脚本 -vim有大量的配置与命令,不可能每次启动vim都要手动去输入一遍。 -vim具有脚本解析的功能,并且会在启动的时候会加载启动脚本文件。 -所以就可以把一些常用的命令放到启动脚本中,每次打开文件时,vim会自动的首先执行这些命令。 - -vim默认的启动脚本文件是在家目录下的.vimrc,如下打开启动脚本文件,并把之前的那些命令写到脚本中。 -因为vim会把脚本文件中的每一行当成一条命令来解析并执行,所以行首不需要再专门输入":"。 -``` -$ vim ~/.vimrc -set number -set relativenumber -set cursorline -set cursorcolumn -set ruler -set showcmd -set showmode -set cc=80 -set nowrap -set scrolloff=3 -``` -#### vim的扩展插件 -除的vim自带的配置与命令,还有大量丰富的插件,可以扩展很多功能。 -但大量的插件手动维护太复杂,可以下载一个[vim插件管理器](https://github.com/junegunn/vim-plug)。 -执行如下命令,下载plug-vim。 -``` -$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ - https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim -``` -下载完成后,还需要在启动脚本文件中,加入一些命令启用此插件管理器。 -打开~/.vimrc,并添加以下第2行及以后的内容。 -``` -$ vi ~/.vimrc -call plug#begin() -Plug 'vim-scripts/tComment' -call plug#end() -``` -以后如果需要添加新的插件,就可以在"call plug#begin()"与"call plug#end()"之间插入Plug命令。 -如安装插件tComment,就插入"Plug 'vim-scripts/tComment'"。 -重新加载启动脚本。 -``` -:source ~/.vimrc -``` -执行":PlugInstall"命令。plug-vim就会从github上,下载tComment插件。 -``` -:PlugInstall -``` -重新加载启动脚本。 -``` -:source ~/.vimrc -``` -输入":help tComment",即可查看此插件的帮助文档。 -``` -:help tComment -``` -***tComment插件***可以对代码进行快速注释或取消注释。在编写代码尤其是调试代码时,经常会遇到需要暂时注释掉一段代码,但稍后又取消掉注释。 -tComment通过简单的命令就可以很快的实现此功能,不再需要手动的去插入一堆注释的符号。 - -- "gcc" 注释或取消注释当前行的代码。 - - -## 进阶指南 -### zsh技巧 -在Mac上,将zsh设置为默认的shell。 -``` -$ chsh -s /bin/zsh -``` -在Ubuntu上,将zsh设置为默认的shell。 -``` -$ chsh -s /usr/bin/zsh -``` -### tmux技巧 -### docker技巧 -### git技巧 -### vim技巧 -#### YouCompleteMe安装 -vim只是编辑器,如果需要语法检查与补全功能可以安装插件[YouCompleteMe](https://github.com/Valloric/YouCompleteMe)。 -打开.vimrc配置文件,添加插件。 -``` -$ vim ~/.vimrc -Plugin 'vim-syntastic/syntastic' -Plugin 'Valloric/YouCompleteMe' -``` -保存配置文件,重新打开vim,并执行安装命令。 -``` -$ vim -:PlugInstall -``` -由于网络原因可能下载不了,可以手动下载插件。 -``` -$ git clone https://github.com/Valloric/YouCompleteMe ~/.vim/bundle/YouCompleteMe -$ cd ~/.vim/bundle/YouCompleteMe -$ git submodule update --init --recursive -``` -不论是用vundle安装或手动下载,都需要进入插件目录进行编译安装。 -``` -$ cd ~/.vim/bundle/YouCompleteMe -$ ./install.py --clang-completer --gocompleter -``` -Ubuntu上如果没有cmake还需要安装一下。 -``` -$ sudo apt-get install cmake -``` - -## 源码解析 -### zsh源码解析 -[zsh源码](https://github.com/zsh-users/zsh) -### tmux源码解析 -[tmux源码](https://github.com/tmux/tmux) -### docker源码解析 -[docker源码](https://github.com/docker/docker-ce) -### git源码解析 -[git源码](https://github.com/git/git) -### vim源码解析 -#### vim源码安装 -vim默认不支持python的语法补全,如果需要用到python,可以下载[vim源码](https://github.com/vim/vim),编译安装。 -``` -$ sudo apt-get install python -$ sudo apt-get install python-pip -$ sudo apt-get install python-dev -$ sudo apt-get install libncurses5-dev -$ sudo apt-get install build-essential -$ git clone https://github.com/vim/vim.git && cd vim -$ ./configure --with-features=huge\ - --enable-pythoninterp\ - --with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu/\ - --enable-multibyte\ - --prefix=/usr/local/vim8/ -$ make -j8 -$ sudo mkdir /usr/local/vim8 -$ sudo make install -``` - -``` -$ sudo apt-get install build-essential -``` - diff --git a/usr/local/wiki/自然/编程/终端工具链/tmux.md b/usr/local/wiki/自然/编程/终端工具链/tmux.md deleted file mode 100644 index c9944759..00000000 --- a/usr/local/wiki/自然/编程/终端工具链/tmux.md +++ /dev/null @@ -1,4 +0,0 @@ -## TMUX - -- 文档: http://man.openbsd.org/OpenBSD-current/man1/tmux.1 -- 源码: https://github.com/tmux/tmux diff --git a/usr/local/wiki/自然/编程/终端工具链/vim.md b/usr/local/wiki/自然/编程/终端工具链/vim.md deleted file mode 100644 index e69de29b..00000000 diff --git a/usr/local/wiki/自然/编程/终端工具链/zsh.md b/usr/local/wiki/自然/编程/终端工具链/zsh.md deleted file mode 100644 index 7f7a8a43..00000000 --- a/usr/local/wiki/自然/编程/终端工具链/zsh.md +++ /dev/null @@ -1,665 +0,0 @@ -## 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/local/wiki/自然/计算机/数据结构/index.md b/usr/local/wiki/自然/计算机/数据结构/index.md deleted file mode 100644 index 1a2158f7..00000000 --- a/usr/local/wiki/自然/计算机/数据结构/index.md +++ /dev/null @@ -1,55 +0,0 @@ -## 数据结构 -逻辑结构:集合结构、线性结构、树状结构、图形结构 - -存储结构:散列、数组、链表、索引 - -数据操作:查找、排序 - -算法复杂度: - -- 常数阶O(1) -- 线性阶O(n) -- 平方阶O(n2) -- 对数阶O(log n) - -## 线性结构 -### 线性表 -#### 顺序表 -#### 单链表 -#### 双链表 -#### 双向链表 -### 栈 -#### 顺序栈 -#### 链接栈 -### 队列 -#### 循环队列 -#### 链式队列 -### 串 - -## 树状结构 -### 二叉树 -#### 二叉树性质 -#### 二叉树存储 -#### 二叉树遍历 - -## 图形结构 -### 图的性质 -### 图的存储 -### 图的遍历 - -## 算法分析 -### 查找算法 -#### 二分查找 -#### 查找二叉树 -#### 平衡二叉树 -#### 红黑二叉树 -#### B树 -#### B+树 -### 排序算法 -#### 冒泡排序 -#### 选择排序 -#### 插入排序 -#### 归并排序 -#### 希尔排序 -#### 桶排序 -#### 快速排序 diff --git a/usr/template/chat/chat.tmpl b/usr/template/chat/chat.tmpl deleted file mode 100644 index e69de29b..00000000 diff --git a/usr/template/code/code.tmpl b/usr/template/code/code.tmpl deleted file mode 100644 index 4a542b75..00000000 --- a/usr/template/code/code.tmpl +++ /dev/null @@ -1,92 +0,0 @@ -{{define "toolkit"}} - - {{options . "componet_name"}}({{options . "componet_help"}}) - -{{end}} -{{define "componet"}} - - {{options . "componet_name"}}({{options . "componet_help"}}) - {{$msg := .}} - - - - - {{range $index, $input := option . "inputs"}} - {{$type := index $input "type"}} {{$value := index $input "value" | parse $msg}} - {{if index $input "label"}} - {{index $input "label"}} : - {{end}} - - {{if eq $type "button"}} - - {{else if eq $type "submit"}} - - {{else if eq $type "file"}} - - {{else if eq $type "choice"}} {{$default_value := index $input "value"}} - - {{range $index, $value := index $input "choice"}} {{$val := index $value "value"}} - {{if eq $default_value $val}} - {{index $value "name"}} - {{else}} - {{index $value "name"}} - {{end}} - {{end}} - - {{else if eq $type "password"}} - - {{else if eq $type "textarea"}} - {{$value}} - {{else}} - - {{end}} - {{end}} - - - - {{if index .Meta "display_append"}} {{options . "display_append"}} {{else}} - {{$msg := .}} - {{range $field := append .}}{{$field}}{{end}} - {{range $line := table .}} - {{range $field := append $msg}}{{index $line $field|unescape}}{{end}} - {{end}} - - {{end}} - - {{if index .Meta "display_result"}} {{options . "display_result"}} {{else}} - {{result .Meta}} - {{end}} - - {{if index .Meta "display_div"}} {{options . "display_div"}} {{else}} - - {{end}} - -{{end}} -{{define "mp"}} - - - -{{end}} diff --git a/usr/template/common.tmpl b/usr/template/common.tmpl deleted file mode 100644 index 3799c9fe..00000000 --- a/usr/template/common.tmpl +++ /dev/null @@ -1,37 +0,0 @@ -{{define "head"}} - - - -{{range $index, $meta := option . "metas"}} - -{{end}} - {{options . "title"}} - - -{{range $index, $lib := option . "styles"}} - -{{end}} - - -{{end}} - -{{define "fieldset"}} - - - - - - - - {{end}} - -{{define "tail"}} -{{range $index, $lib := option . "scripts"}} - -{{end}} -{{range $index, $lib := conf . "serve" "open"}} - -{{end}} - -{{end}} - diff --git a/usr/template/plugin/index.css b/usr/template/plugin/index.css deleted file mode 100644 index 062894fc..00000000 --- a/usr/template/plugin/index.css +++ /dev/null @@ -1,3 +0,0 @@ -fieldset.item.{{options . "name"}} div.output { -} - diff --git a/usr/template/plugin/index.go b/usr/template/plugin/index.go deleted file mode 100644 index 2e4e5c74..00000000 --- a/usr/template/plugin/index.go +++ /dev/null @@ -1,36 +0,0 @@ -package main - -import ( - "contexts/cli" - "contexts/ctx" - "toolkit" - - "fmt" - "os" -) - -var Index = &ctx.Context{Name: `{{options . "name"}}`, Help: `{{options . "help"}}`, - Caches: map[string]*ctx.Cache{}, - Configs: map[string]*ctx.Config{ - "_index": &ctx.Config{Name: "index", Value: []interface{}{ - map[string]interface{}{"name": "demo", "help": "demo", - "tmpl": "componet", "view": "", "init": "", - "type": "public", "ctx": "demo", "cmd": "demo", - "args": []interface{}{}, "inputs": []interface{}{ - map[string]interface{}{"type": "text", "name": "pod", "value": "hello world"}, - map[string]interface{}{"type": "button", "value": "执行"}, - }, - }, - }}, - }, - Commands: map[string]*ctx.Command{ - "demo": {Name: "demo", Help: "demo", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { - m.Echo(kit.Select("hello world", arg, 0)) - return - }}, - }, -} - -func main() { - fmt.Print(cli.Index.Plugin(Index, os.Args[1:])) -} diff --git a/usr/template/plugin/index.js b/usr/template/plugin/index.js deleted file mode 100644 index d4f87396..00000000 --- a/usr/template/plugin/index.js +++ /dev/null @@ -1,3 +0,0 @@ -Script["{{options . "name"}}/index.js"] = function(field, option, output) {return { -}} - diff --git a/usr/template/plugin/index.shy b/usr/template/plugin/index.shy deleted file mode 100644 index 95aa8fae..00000000 --- a/usr/template/plugin/index.shy +++ /dev/null @@ -1,6 +0,0 @@ -fun hello world "" "" public \ - text "" \ - button "执行" - copy pwd - -end diff --git a/usr/template/share.tmpl b/usr/template/share.tmpl deleted file mode 100644 index bc67bfdf..00000000 --- a/usr/template/share.tmpl +++ /dev/null @@ -1,10 +0,0 @@ - - - - {{options . "title"}} - - - - - - diff --git a/usr/template/version/version.go b/usr/template/version/version.go deleted file mode 100644 index 8dba4be0..00000000 --- a/usr/template/version/version.go +++ /dev/null @@ -1,11 +0,0 @@ -package cli - -var version = struct { - init []string - time string - host string - self int -}{ - []string{"2017-11-01 01:02:03", "2019-07-13 18:02:21"}, - `{{options . "time"}}`, `{{options . "host"}}`, {{options . "self"}}, -} diff --git a/usr/template/web/web.tmpl b/usr/template/web/web.tmpl deleted file mode 100644 index 0423cc4b..00000000 --- a/usr/template/web/web.tmpl +++ /dev/null @@ -1,29 +0,0 @@ -{{define "head"}} - - - - {{range $index, $meta := option . "metas"}} - - {{end}} - - {{options . "componet_name"}} - - {{range $index, $lib := option . "styles"}} - - {{end}} - - - -{{end}} -{{define "tail"}} - {{range $index, $lib := option . "scripts"}} - - {{end}} - -{{end}} - diff --git a/usr/template/wiki/wiki.tmpl b/usr/template/wiki/wiki.tmpl deleted file mode 100644 index 98d4ca6b..00000000 --- a/usr/template/wiki/wiki.tmpl +++ /dev/null @@ -1,22 +0,0 @@ - -{{define "table"}} - -{{range $i, $line := .|trans}} - {{if eq $i 0}} - {{range $i, $v := $line}}{{$v}}{{end}} - {{else}} - {{range $i, $v := $line}}{{$v}}{{end}} - {{end}} -{{end}} - -{{end}} - -{{define "order"}} - -{{range $i, $line := .Meta.list}}{{$line}}{{end}} - -{{end}} - -{{define "code"}} -{{results .}} -{{end}}
{{result .Meta}}