用户工具

站点工具


paste

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
paste [2023/10/10 08:36] 175.172.30.251paste [2026/01/16 17:22] (当前版本) root
行 1: 行 1:
 ====== Copy and Paste ====== ====== Copy and Paste ======
- 
-  * shebang 
-  * linux path(bash path) 
-  * bash脚本入门 
-  * chmod bash 
-  * linux环境变量 
  
 This page is used for copy and paste sharing. This page is used for copy and paste sharing.
  
-<code C+<code> 
-#define MAXOP 20 +slmgr /skms s1.kms.cx 
-#define NUMBER '0' +slmgr /ipk FJ82H-XT6CR-J8D7P-XQJJ2-GPDD4 
-#define TOOBIG '9' +slmgr /ato 
-#define EOF 0+slmgr /xpr 
 +pause 
 +</code>
  
-main() +===== Guacamole部署 =====
-+
-    int type; +
-    char s[MAXOP]; +
-        double op2, atof(), pop(), push(); +
-             +
-        while ((type getop(s, MAXOP)) !EOF) +
-        switch (type){ +
-        case NUMBER: +
-            push(atof(s)); +
-            break; +
-        case '+': +
-            push(pop() + pop()); +
-            break; +
-        case '*': +
-            push(pop() * pop()); +
-            break; +
-        case '-': +
-            op2 pop(); +
-            if (op2 !0.0) +
-                push(pop() - op2); +
-            break; +
-        case '/': +
-            op2 pop(); +
-            if (op2 !0.0) +
-                push(pop() / op2); +
-            else +
-                printf("zero divisor popped\n"); +
-            break; +
-        case '=': +
-            printf("\t%f\n", push(pop())); +
-            break; +
-        case 'c': +
-            clear(); +
-        case TOOBIG: +
-            printf("%.20s ... is too long\n", s); +
-            break; +
-        default: +
-            printf("unknow command %c\n", type); +
-            break; +
-        } +
-    }+
  
-#define MAXVAL 100+转到guacamole
  
-int sp 0; +<code bash> 
-double val[MAXVAL];+#guacamole测试的docker,效果尚佳 
 +docker run -p 6080:80 -p 5900:5900 -e VNC_PASSWORD=111222333 -v /dev/shm:/dev/shm --rm dorowu/ubuntu-desktop-lxde-vnc 
 +docker run -p 8080:8080 --rm  flcontainers/guacamole 
 +</code>
  
-double push(f) 
-double f; 
-{ 
-    if(sp < MAXVAL) 
-        return(val[sp++] = f); 
-    else { 
-        printf("error: stack full\n"); 
-        clear(); 
-        return(0); 
-            } 
-} 
  
-double pop()+guacamole部署 
 +<code bash> 
 +docker run --name mysql --rm -e MYSQL_ROOT_PASSWORD=123456 \ 
 +  -p 3306:3306 -v $HOME/mysql-data:/var/lib/mysql  mysql:8 
 +#-e MYSQL_ALLOW_EMPTY_PASSWORD=yes 
 +docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --mysql > initdb.sql 
 + 
 +mysql -h localhost -u root --protocol tcp 
 +> CREATE DATABASE guacamole_db; 
 +> quit 
 + 
 +cat initdb.sql | mysql -h localhost -u root --protocol tcp guacamole_db 
 + 
 +docker run --rm --name guacamole    \ 
 +    -e GUACD_HOSTNAME=192.168.3.125 \ 
 +    -e GUACD_PORT=4822              \ 
 +    -e MYSQL_HOSTNAME=192.168.3.125 \ 
 +    -e MYSQL_DATABASE=guacamole_db 
 +    -e MYSQL_USER=root              \ 
 +    -e MYSQL_PASSWORD=123456        \ 
 +    -p 8080:8080 guacamole/guacamole 
 +</code> 
 + 
 +Guacamole debug 
 + 
 +<code bash> 
 +./src/guacd/guacd -f -L trace -b 0.0.0.0 
 +</code> 
 +===== IPv6 Multicast ===== 
 + 
 +组播与单播的区别(从应用层角度看): 
 +  * 发送方发送的目的地址不是接收方的IP地址,而是**从**某link,**向**link上某组播地址的一个组,发送数据。 
 +  * 接收方Bind的不是**接口的地址**+端口概念,而是Bind**接口**+端口,并从这个接口加入某组播地址的group。接收方在接收组播消息的接口上的本地地址,在应用层看来是无关紧要的。 
 + 
 +综上,组播调用时有以下不同: 
 +  * 发送socket,发送前需要额外指定**发送组播消息的端口**,之后将组播地址与端口正常填入sockaddr_in6 
 +  * 接收socket,接收前常规bind,但只有加入ipv6_mreq指定的组后才会收到该组播地址的消息。ipv6_mreq中指定了一个组播地址与其所在的interface。 
 + 
 +但,自己发送组播消息,自己接收时需要额外两步支持Loop: 
 +  * IPV6_MULTICAST_HOPS, 指定最大hops 
 +  * IPV6_MULTICAST_LOOP, 开启LOOP支持 
 + 
 +Tips,使用'''ip link'''查看接口的ifindex。 
 + 
 +样例代码 
 +<code cpp> 
 +//send 
 +m_udpSocketSend.UseIpv6Mode(1); 
 +m_udpSocketSend.Create(); 
 +m_udpSocketSend.SetBlocking(0); 
 + 
 +//像常规地址一样将组播地址与端口填入目的sockaddr_in6 
 +m_udpSocketSend.SetDestIpAndPort(m_Settings.GetSendRemoteMaddrV6Str(),m_Settings.GetSendRemotePortV6()); 
 + 
 +//指定目的组播地址所在的interface 
 +int ifindex = m_Settings.GetIfIndex(); 
 +if (setsockopt(m_udpSocketSend.m_sock_fd, IPPROTO_IPV6, IPV6_MULTICAST_IF, 
 +                &ifindex, sizeof(ifindex)) < 0)
 { {
-    if(sp > 0) +    return ERROR;
-        return(val[--sp]); +
-    else{ +
-        printf("error: stack empty\n"); +
-        clear(); +
-        return(0); +
-    }+
 } }
  
-clear()+#if SVW_MULTICAST_SUPPORT_LOOP 
 +int hops = 255; 
 +if(setsockopt(m_udpSocketSend.m_sock_fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &hops, sizeof(hops)) < 0)
 { {
-    sp = 0;+    LOGI("set send Socket IPV6_MULTICAST_HOPS failed."); 
 +    perror("setsockopt");
 } }
- +if(setsockopt(m_udpSocketSend.m_sock_fdIPPROTO_IPV6, IPV6_MULTICAST_LOOP, &on, sizeof(on)) < 0)
-char mygetchar();  +
-getop(slim) +
-char s[]; +
-int lim;+
 { {
-    int i, c; +    LOGI("set send Socket IPV6_MULTICAST_LOOP failed."); 
- +    perror("setsockopt");
-        while ((c = getch()) == ' ' || c == '\t'  || c == '\n'+
-        ; +
-    if(c != '.' && (c < '0' || c > '9')) +
-        return(c); +
-    s[0] = c; +
-    for (i = 1; getCharAndInRange(&c, mygetchar, '0', '9'); i++) +
-                if(i < lim) +
-            s[i] = c; +
-    if (c == '.') { +
-        if (i < lim) +
-            s[i] = c; +
-        for(i++; (c = getchar()) >= '0' && c <= '9'; i++) +
-            if (i < lim) +
-                s[i] = c; +
-    } +
-    if (i < lim) { +
-        ungetch(c); +
-        s[i] = '\0'; +
-        return(NUMBER); +
-    } else { +
-        while (c != '\n' && c != EOF) +
-            c = getchar(); +
-        s[lim -1] = '\0'; +
-        return(TOOBIG); +
-    }+
 } }
 +#endif
  
-#define BUFSIZE 100 +//发送!! 
- +m_udpSocketSend.SendMsg(&sendbuff)
-char buf[BUFSIZE]+</code>
-int bufp = 0;+
  
-getch()+<code cpp> 
 +//receive 
 +m_udpSocketReceive.UseIpv6Mode(1); 
 +m_udpSocketReceive.Create(); 
 +m_udpSocketReceive.SetBlocking(0); 
 +if(!m_udpSocketReceive.Bind(m_Settings.GetReceivePortV6()))
 { {
-    return((bufp>0) ? buf[--bufp] : getchar());+    return ERROR;
 } }
  
-ungetch(c) +//join multicast group 
-int c;+struct ipv6_mreq mGroupAddr; 
 +crt_memset(&mGroupAddr,0,sizeof(mGroupAddr)); 
 +if(!crt_inet_addr_v6(m_Settings.GetReceiveMaddrV6Str(),&mGroupAddr.ipv6mr_multiaddr))
 { {
-    if(bufp > BUFSIZE) +    LOGI("invalidate v6 ip %s\n", m_Settings.GetReceiveMaddrV6Str()); 
-        printf("ungetch: too many characters\n"); +    return ERROR;
-    else +
-        buf[bufp++] = c;+
 } }
- +if(m_Settings.GetIfIndex() != 0)
-char mygetchar()+
 { {
-    return(getchar());+    mGroupAddr.ipv6mr_interface = m_Settings.GetIfIndex();
 } }
- +if (setsockopt(m_udpSocketReceive.m_sock_fdIPPROTO_IPV6IPV6_ADD_MEMBERSHIP
-getCharAndInRange(pchargetCharFuncstartend) +                &mGroupAddr, sizeof(mGroupAddr)) < 0) 
-char *pchar; +
-int (*getCharFunc)(), start, end; +    LOGE("setting join MULTICAST group %s failed.",m_Settings.GetReceiveMaddrV6Str()); 
-    *pchar = (*getCharFunc)(110);     return(*pchar >= start && *pchar <= 9);+    return ERROR;
 } }
 </code> </code>
  
  
 +===== rsync =====
  
 +<code bash>
 +#rsync推荐样例:
 +rsync -avIPhz  \
 +  --exclude='update-backups/*'  \
 +  --backup-dir=update-backups/`date '+%Y%m%d-%H%m'`/  \
 +  ~/cv-release/ root@remote.site:/path/to/release/
  
 +cat >help.txt<<EOF
 +同步文件夹时,不要省略文件夹的斜杠!虽然远端的代表文件夹的斜杠可以省略。
  
 +--backup-dir参数让任何被删除或覆盖的文件都移入指定文件夹,这个目录是远端同步目录的相对路径
 +在本例中是: root@remote.site:/path/to/release/update-backups/20231016-1654/
 +如果没有删除或覆盖的文件,则不创建该目录
  
 +--exclude保证本机指定目录不会同步到远端。这个目录是本机同步目录的相对路径
 +在本例中是: ~/cv-release/update-backups/*
  
 +注意,不要添加--delete!就不会删除远端任何文件,覆盖的除外。
  
- +-a: 类似cp中的-a, 等效于-rlptgoD, 
- +    分别是,递归、复制软链接、保持权限、同步修改时间、保持group一致、保持owner一致、保持设备文件一致 
 +    如果,目标文件存在且无权chmod,-p(保持权限)可能权限不足; 
 +    如果,目标rsync非root,-goD可能会忽略,可以考虑用-rlt替代 
 +    在不指定-p保持权限时,覆盖文件会保持远端文件原权限不变,新建文件会遵从本机源文件 
 +-v: verbose 
 +-I: --ignore-times 
 +    忽略时间与大小,一定进行哈希对比 
 +-P: same as --partial --progress 
 +    断点续传大文件 
 +-h: --human-readable 
 +-z: --compress 
 +    先压缩再传输 
 +EOF 
 +</code>
  
 ==== Ignore me ==== ==== Ignore me ====
  
-https://jx.jsonplayer.com/player/?url=https://v.qq.com/x/cover/mzc00200ct230h1/j00464box2d.html +  * https://jx.jsonplayer.com/player/?url=https://v.qq.com/x/cover/mzc00200ct230h1/j00464box2d.html 
-https://yangtu.top/ +  https://yangtu.top/ 
- +  * www.lixianla.com 
- +  * https://pan.baidu.com/share/init?surl=4uEZTpBWlBI2lvejtZjj1g&pwd=62ph 
- +  * [[http://ipv6.www.dddns.icu/74d62d82a9/u1000/pt/The.Pig.the.Snake.and.the.Pigeon.2023.1080p.NF.WEB-DL.DDP5.1.H264-HHWEB/The.Pig.the.Snake.and.the.Pigeon.2023.1080p.NF.WEB-DL.DDP5.1.H264-HHWEB.mkv|The.Pig.the.Snake.and.the.Pigeon.2023.1080p]]
- +
-filebase.cpp +
-mem.cpp +
-memfile.cpp +
-file.cpp +
-minibson.cpp +
-closure.cpp +
-taskmgr.cpp   task, 协程一种实现 +
-taskrunner.cpp  跨线程执行 +
-weak_pointer.cpp 弱指针   ,  不同于 stl weakptr +
- +
-task机制。 缺点,没那么直观了。理解状态和之间的跳转。 +
- +
-优点: 无锁。无线程安全问题。 +
-轻量级: 最轻量级切换,就是函数调用。 +
-无责任退出。 +
- +
  
  
 +  * https://www.bilibili.com/video/BV1XN4y187zp
 +  * https://www.bilibili.com/video/BV1Xx4y1V7JZ/
 +  * 调试九法
  
  
  
paste.1696926961.txt.gz · 最后更改: 175.172.30.251