Author: Tagore

recent new tech need to analysis and learn

reverse ssh tunnel nohup ssh -NfR 2222:localhost:22 root@106.12.13.xxx -p22 expect script   strip command Some useful line editing key bindings provided by the Readline library: Ctrl-A: go to the beginning of line Ctrl-E: go to the end of line Alt-B: skip one word backward Alt-F: skip one word forward Ctrl-U: delete to the beginning of
Read More »

c/c++编译相关技巧总结帖

链接时忽略文件中未用到的函数或者对象。这在移植代码过程中很有用, 我们就不需要去删除或者注释掉那些大量没用到的对象或者不需要去链接的对象。 For GCC, this is accomplished in two stages: First compile the data but tell the compiler to separate the code into separate sections within the translation unit. This will be done for functions, classes, and external variables by using the following two compiler flags: -fdata-sections -ffunction-sections Link the translation units together using the
Read More »

网站迁移笔记

迁移参考: https://www.digitalocean.com/community/tutorials/how-to-move-an-apache-web-root-to-a-new-location-on-ubuntu-16-04 Ubuntu1604 安装php5.6 由于Ubuntu1604 默认安装的是php7。由于网站兼容性问题,需要装php5。 步骤参考:https://phpraxis.wordpress.com/2016/05/16/install-php-5-6-or-5-5-in-ubuntu-16-04-lts-xenial-xerus/ > add-apt-repository ppa:ondrej/php > apt-get update > apt-get install php5.6 php5.6-mbstring php5.6-mysql php5.6-sqlite3 > 还有这些按需要装 php5.6-cli php5.6-curl php5.6-json php5.6-mcrypt php5.6-curl php-xdebug libapache2-mod-php5.6 libapache2-mod-php7.0 mysql-server-5.7 apache2 # php 版本切换方法2 > sudo a2dismod php7.0 ; sudo a2enmod php5.6 ; sudo service apache2 restart ; echo 1 | sudo update-alternatives –config
Read More »

linux bash shell 像cmd.exe 一样的滚动补齐功能

有些情况下,比如我们遇到文件名含有一些字符不容易输入时就很着急了,这时候就需要让linux shell像windows cmd.exe 一样自动补全部的文件名,且可自动按顺序一个个滚动切换。方法如下: 在用户目录创建 ~/.inputrc (若不存在则自己创建) 文件里添加一行: 。 登出再登陆用户就可以了。 For more details see the READLINE section in man bash .

gdb 简记

常用命令如下:(详情可以用 help 命令查看) r (run, restart) s (step into) n (next state, step over) finish (step out) q (quit) p (print anything you want) l (list) b (breakpoint) #设置断点: (gdb) b fileName.c:lineNumber 或者 (gdb) b function u (until) #运行到指定行 call  #调用函数 set  #设置变量 set args #设置main 的输入参数 bt (backtrace)  #查看堆栈 x #examine memory, (gdb)/FMT ADDRESS
Read More »

关于Apache httpd 的SSI和cgi使用和思考

因为在单片机上的web服务是使用删减版的httpd服务器,只保留最原始的扩展功能,SSI和CGI。无法像pc上的服务器可以使用php,jsp之类的引擎。 SSI主要是为了往网页里面插入实时的变量,CGI主要是处理客户端发送来的请求。这样即使是最古老的浏览器也不会有什么兼容性问题。 但是这样的做法的结果是服务端的编程变繁琐了。作为单片机这种嵌入式web应用,应该尽可能工作量放在客户端来完成,减少服务端的复杂度。而且不需要太考虑兼容古老的浏览器,因为落后的东西就应该被淘汰。 早期的浏览器作为通用的客户端只拥有简单的功能,比如实现get和post等几个方法。大量的跳转和内容生成是在服务端运行的,就造成服务器的负载较大。自从javascript成为浏览器端标准的脚本语言后,各种网站的内容交互方式就变得更加自由了。我这里感受最深的就是使用客户端脚本把动态网页的生成工作放在浏览器端来做,数据由ajax 单独请求更新。嵌入式web经常需要显示一些实时的数据,把单独的数据请求放在后台实时更新,然后由脚本把它填写至网页。不像早期的技术使用SSI,服务端需要检索整个网页的SSI tag,然后查找变量,将数据实时更新至网页,然后发送整张网页。可以想服务端的压力有多大。其实这种思维模式就像网站程序和网站数据分开放一个道理。好处多多! 因为用单片机的web服务器调试前端代码会比较繁琐,要转码要下载,频繁修改就不方便。所以直接在pc的web服务器上调试前端代码,并且使用SSI和CGI,模仿单片机C后台的动作,这里要有一些技巧。 在Apache httpd web服务器上使用SSI和cgi,可以参考服务器主页上的帮助文档 http://httpd.apache.org/docs/current/howto/ssi.html。这里简单做个记录。 SSI 按照官方介绍把SSI功能打开。怎么设置httpd.conf就不多说。这里简单记录下其使用规则。 想设置某个SSI tag时,可以使用 在需要调用它的地方使用 就可以显示出 xxxx 了。 仅仅是这样使用,跟我们在使用最原始的SSI还是有点不一样。 为了方便调试,我们可以在页面上头加上 重定义这个未找到SSI时的提示语言,原本的提示语言很长,不方便调试。 CGI有几个要点: 1. CGI开启后,默认设置ScriptAlias是只执行cgi-bin下的脚本。你可以将自己的web目录添加进去,因为实际请求的路径不一定是/cgi-bin。 2. 这里可以用perl、python或者bash脚本来模仿单片机c的后端应答动作。这样调试好前端代码后,下进单片机后再慢慢调试后端代码就方便了。注意在perl前面要设置好perl.exe的路径。同时可以修改.pl后缀为我们想要的.cgi它也可以得到执行。完美模仿单片机后端逻辑! Get!

总结几个C 语言比较高级的编写技巧

看了一些源代码,这里总结几个不常见的,但是比较好用的C 用法。也许这些功能在C++中有扩展,但是个人基本不用C++。其实这些应该是属于预处理器的功能。若是之前没有见过,遇到时会感觉云里雾里的。 直接定义字符串: 我们可以用#define 定义字符串常量,比如: #define HELLO   “hello” 这样就相当于是: char *HELLO= “hello”; 而且使用#define 来定义的好处是可以直接拼接字符串,这些应该都是由预处理器来帮我们处理的(没有仔细考证,但想像其中原理应该是这样)。比如: #define HELLO "hello" #define WORLD "world" puts( HELLO WORLD ); 定义内存池: 在嵌入式系统中一般不用内存堆的动态分配,因为容易产生内存碎片导致大块内存分配不到(可以用带小块内存合并功能内存管理方式),或者是会因为某个模块把内存堆耗尽了导致其它模块不能工作。通常会使用内存池的方式,而且每个软件模块有自己的不同大小固定数量内存池,这样可以做到每个模块内存互不干扰。说白一点就是一系列的分配好空间的数组。这可以参考lwip中内存池的分配。 #define LWIP_MEMPOOL(name,num,size,desc) u8_t memp_memory_ ## name ## _base [((num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size)))];