diff --git a/bin/boot.sh b/bin/boot.sh index 157c0dc3..93d54837 100755 --- a/bin/boot.sh +++ b/bin/boot.sh @@ -3,7 +3,9 @@ export ctx_dev=${ctx_dev:="https://shylinux.com"} export ctx_root="/usr/local/context" export ctx_home=~/context -export ctx_bin="bench" + +ctx_bin="bench" && [ -e bin/bench ] && ctx_bin=bin/bench +export ctx_bin log() { echo -e $* @@ -64,6 +66,7 @@ log "dev:$ctx_dev\ndir: $dir\nbench: $ctx_bin\npid: $pid" case $1 in install) shift; prepare && install "$@";; + create) mkdir -p $2; cd $2 && shift && shift && prepare && main "$@";; start|"") shift; prepare && main "$@";; state) state;; stop) action QUIT;; diff --git a/bin/node.sh b/bin/node.sh index eb299ebb..bcf96999 100755 --- a/bin/node.sh +++ b/bin/node.sh @@ -3,7 +3,9 @@ export ctx_box=${ctx_box:="http://localhost:9094"} export ctx_root="/usr/local/context" export ctx_home=~/context -export ctx_bin="bench" + +ctx_bin="bench" && [ -e bin/bench ] && ctx_bin=bin/bench +export ctx_bin log() { echo -e $* @@ -22,7 +24,7 @@ main() { } case $1 in - create) mkdir $2; cd $2 && shift && shift && prepare && main "$@";; + create) mkdir -p $2; cd $2 && shift && shift && prepare && main "$@";; init) shift; prepare && main "$@";; *) mkdir -p var/run var/log && main "$@";; esac diff --git a/usr/librarys/example.css b/usr/librarys/example.css index dafd2c53..d8261316 100644 --- a/usr/librarys/example.css +++ b/usr/librarys/example.css @@ -63,3 +63,6 @@ fieldset.Banner>ul>li { fieldset.Banner>ul>li:hover { background-color:red; } +fieldset.Footer { + clear:both; +} diff --git a/usr/librarys/example.js b/usr/librarys/example.js index 7cd4b148..fc30347c 100644 --- a/usr/librarys/example.js +++ b/usr/librarys/example.js @@ -10,7 +10,7 @@ exp = example = { return this }, initHeader: function(page, field, option, output) { - return [{"text": ["shylinux", "div", "title"]}] + return [{"text": ["shycontext", "div", "title"]}] }, initBanner: function(page, field, option, output) { field.querySelectorAll("li").forEach(function(item) { @@ -24,7 +24,7 @@ exp = example = { return [{"text": ["shylinux", "div", "title"]}] }, initFooter: function(page, field, option) { - return [{"text": ["shycontext", "div", "title"]}] + return [{"view": ["title", "div", "shylinux@163.com"]}] }, onscroll: function(event, target, action) { var page = this diff --git a/usr/librarys/toolkit.js b/usr/librarys/toolkit.js index 7a2566c4..00ffc76b 100644 --- a/usr/librarys/toolkit.js +++ b/usr/librarys/toolkit.js @@ -317,7 +317,7 @@ kit = toolkit = { if (document.referrer) { location.href = document.referrer } else { - m.Search("componet_group", "") + ctx.Search("componet_group", "") } }) return diff --git a/usr/librarys/wiki.css b/usr/librarys/wiki.css index 91b21205..ee0a60aa 100644 --- a/usr/librarys/wiki.css +++ b/usr/librarys/wiki.css @@ -13,10 +13,23 @@ fieldset.Tree>div.output>div.list { clear:both; padding-top:5px; } +fieldset.Tree>div.output>div.list li { + display:inline; +} +fieldset.Tree>div.output>div.list li div { + float:left; + padding:5px; + border:solid 1px green; +} +fieldset.Text { + padding:0; +} fieldset.Text>div.output>div.menu li>div:hover { background-color:red; } fieldset.Text>div.output>div.text { position:relative; + overflow:auto; + padding:10px; } diff --git a/usr/librarys/wiki.js b/usr/librarys/wiki.js index 4c42f0d1..affc3633 100644 --- a/usr/librarys/wiki.js +++ b/usr/librarys/wiki.js @@ -1,5 +1,9 @@ var page = Page({ initTree: function(field, option, output) { + // if (!ctx.isMobile) { + // field.style.float = "left" + // } + ctx.Runs(page, option, function(msg) { output.innerHTML = "" var back = [{"button": ["知识", function(event) { @@ -113,6 +117,22 @@ var page = Page({ value.id = id }) kit.AppendChild(ui.menu, [{"tree": h0}]) + + + ui.text.style.width = document.body.offsetWidth-30+"px" + if (i > 0 && !ctx.isMobile) { + ui.menu.style.position = "absolute" + var width = ui.menu.offsetWidth + var height = ui.menu.offsetHeight>400?ui.menu.offsetHeight:600 + + field.style.marginLeft = width+10+"px" + ui.menu.style.marginLeft = -width-20+"px" + ui.text.style.height = height+"px" + ui.text.style.width = field.offsetWidth-30-width+"px" + + + // ui.text.style.width = field.offsetWidth-ui.menu.offsetWidth+"px" + } }) return }, diff --git a/usr/wiki/自然/编程/终端工具链/context.md b/usr/wiki/自然/编程/终端工具链/context.md index 1794b0ae..409f0318 100644 --- a/usr/wiki/自然/编程/终端工具链/context.md +++ b/usr/wiki/自然/编程/终端工具链/context.md @@ -1,35 +1,349 @@ -## 《跟我学编程》简介 -跟我学编程,在用golang开发context过程中,对所有新想法的记录总结,将各种技术融合到一起开发自己的一整套系统。 +## context -context 是用 golang 开发的一款系统级应用。 +context is not only context -- 一种新的应用框架,可以快速开发出各种实用工具。 -- 一种新的编程语言,可以用脚本编写各种业务应用。 -- 通过接口文本化,解除函数之间的硬性依赖,提高代码复用率。 -- 把每个函数当成一个服务来开发,把每个进程当一个集群来开发,实现微集群效应。 -- 每个函数既可以在浏览器中调用,也可以在命令行中调用,更可以当成库函数调用。 - -### 项目进度 -- 2017.11.01 项目启动 -- 2018.07.30 1.0 发布 - -### 相关链接 -- 开发者邮箱: -- 源码: -- 文档: - -### 源码安装 -首先安装好golang开发工具(参考: )。 +### 下载安装 +#### 简易版 +在Mac或Linux上,可以直接用脚本下载 +``` +$ mkdir context && cd context +$ curl https://shylinux.com/code/upgrade/boot_sh | bash -s install +``` + +#### 完整版 +如果对源码有兴趣,使用更丰富的功能,可以直接下载源码, +``` +$ git clone https://github.com/shylinux/context.git +``` +下载完源码后,如果安装了golang,就可以对源码直接进行编译, +如果没有可以去官网下载安装golang()。 +第一次make时,会自动下载各种依赖库,所以会慢一些。 ``` -$ git clone https://github.com/shylinux/context $ cd context && make -$ bench -> pwd -> ls ``` -## golang编程实践 -## context使用指南 -## context模块开发 -## context系统设计 +### 启动服务 +bin目录下是各种可执行文件,如启动脚本boot.sh与node.sh。 + +node.sh用来启动单机版context,boot.sh用来启动网络版context。 + +如下,直接运行脚本,即可启动context。 + +启动context后,就可以解析执行各种命令,即可是本地的shell命令,也可以是内部模块命令。 + +``` +$ bin/node.sh +0[03:58:43]ssh> +``` + +#### 文件管理 +调用本地命令,查看当前目录下的文件列表, +``` +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不仅只是一个shell,还可以用来组建集群。 + +#### 启动服务节点 + +启动服务节点,使用脚本boot.sh, +与node.sh不同的是,boot.sh启动的context, +会启动web模块监听9094端口,会启动ssh模块监听9090端口。 +``` +$ cd context +$ bin/boot.sh +0[11:23:03]ssh> +``` + +#### 启动工作节点 +启动工作节点,使用脚本node.sh, +它启动的context,会主动连接本地9090端口,向服务节点注册自己。 + +如下,新打开一个终端,调用boot.sh,创建并启动服务节点demo。 +``` +$ cd context +$ bin/node.sh create app/demo +0[11:23:03]ssh> +``` + +如下,再打开一个终端,调用boot.sh,创建并启动服务节点led。 +``` +$ cd context +$ bin/node.sh create app/led +0[11:23:03]ssh> +``` + +#### 调用远程命令 +如下回到服务节点终端,执行remote命令,可以查看到所有远程节点。 +``` +22[11:35:12]ssh> remote +key create_time module name type +com 2019-05-09 20:57:21 ctx.nfs.file4 com master +led 2019-05-09 20:59:28 ctx.nfs.file5 led worker +demo 2019-05-09 20:59:28 ctx.nfs.file5 demo worker +``` + +远程命令只需要在命令前加上节点名与冒号即可。 + +如下,远程调用led节点的命令。 +``` +24[11:41:15]ssh> led:pwd +/Users/shaoying/context/app/led/var +``` + +如下,远程调用demo节点的命令。 +``` +24[11:41:15]ssh> demo:pwd +/Users/shaoying/context/app/demo/var +``` + +如下,远程调用所有子节点的命令。 +``` +29[11:44:09]ssh> *:pwd +/Users/shaoying/context/app/led/var + +/Users/shaoying/context/app/demo/var +``` + +#### 启动分机服务 + +boot.sh不仅可以用来启动本地服务,还可以将不同的主机组建在一起。 + +在另外一台计算机上,重新下载安装一下context,然后启动服务节点。 + +其中环境变量ctx_dev,用来指定上级服务节点。 + +``` +$ cd context +$ ctx_dev=http://192.168.0.106:9094 boot.sh +0[11:53:11]ssh> +``` + +回到原主机的服务节点终端, +使用remote命令,可以查看到新加的从机节点。 +``` +30[11:55:38]ssh> remote +key create_time module name type +com 2019-05-09 20:57:21 ctx.nfs.file4 com master +mac 2019-05-10 10:53:00 ctx.nfs.file13 mac server +led 2019-05-09 20:59:28 ctx.nfs.file5 led worker +demo 2019-05-09 20:59:28 ctx.nfs.file5 demo worker +``` + +当然,也可以在本地启动多个服务节点,根据ctx_dev指定不同的上级节点,可以级联,也可以并联。 +``` +$ cd context +$ ctx_dev=http://localhost:9094 boot.sh create app/sub +``` +***注意,不指定ctx_dev时,默认连接 https://shylinux.com ,如果不信任此主机,记得设置ctx_dev*** + +### 网页服务 + +下载完整版的context,启动的服务节点,就会带有前端网页服务。 + +#### 工具链 + +code模块提供了工具链管理。 + +访问服务节点:http://localhost:9094/code + +因为工具链,可以直接调用各种命令,为了安全,所以需要用户认证才能授权。 + +可以在服务节点的终端,直接添加用户认证信息。 + +如下,添加一个角色为root的,用户名为who,用户密码为ppp。 +``` +25[11:54:44]ssh> ~aaa role root user who ppp +``` + +也可以在启动文件中,加入这条配置,记得重启一下服务节点 +``` +$ cat etc/local.shy +~aaa + role root user who who +``` + +然后,在登录网页上输入用户名与密码,即可登入网页工作台。 + +页面工作台,只是对命令进行了一层封装,但提供了更流畅的交互。 + +以fieldset的形式,将各种命令以弱耦合的形式,组织在一起。 + +每一个fielset就是一个命令,默认的工具链有 + +- buffer,tmux粘贴板管理 +- upload,文件上传 +- dir,文件列表管理 +- pod,节点列表管理 +- ctx,模块列表管理 +- cmd,命令行 + +使用pod,选择任意远程节点, 然后使用ctx,选择任意模块, +然后在cmd执行的命令,都会发送给指定的节点与模块。 + +#### 知识库 + +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模块提供了信息管理。 + +### 所有目录 + +#### 一级目录 + +- 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 + +## 接口开发 + +## 模块开发 +### 应用模块 +### 插件模块 +### 核心模块 + +## 系统架构 + +| |数据流|命令流|权限流|应用流| +|---|---|---|---|---| +|应用层|ctx|cli|aaa|web| +|控制层|lex|yac|log|gdb| +|数据层|tcp|nfs|ssh|mdb| + +### 应用框架 +### 解析引擎 +### 通信框架 +### 存储引擎