当前位置:  编程技术>综合
本页文章导读:
    ▪《Linux命令行与shell脚本编程大全》 第十章 学习笔记       第十章:构建基本脚本 这一章的内容都是非常基础的,作者大多都一带而过,没有细讲 之前读的《Unix & Linux大学教程》中,对这节所提到的内容全部都有详细的讲解,所以想看笔记的同.........
    ▪Android资源图片内存占用及优化      优化的两种方式: 1大背景图使用:9.png,使用9png不但能节省APK包容量,更能有效节省堆栈内存 2小技巧1:使用多分辨率图片设计[hdpi,mdpi,ldpi,xhdpi]。UI图片分别设计hdpi,mdpi,ldpi,xhdpi等多种规格.........
    ▪TCP_client      #include "common.h" int main (int argc, char *argv[]) {  int sock_fd,conn_fd;  struct sockaddr_in server_addr,client_addr;  socklen_t addrlen = ADDR_SIZE;  int wc = -1,rc = -1;  char buffer_r[BUFFER_SIZE],buffer_w[BUF.........

[1]《Linux命令行与shell脚本编程大全》 第十章 学习笔记
    来源:    发布时间: 2013-11-10

第十章:构建基本脚本

这一章的内容都是非常基础的,作者大多都一带而过,没有细讲

之前读的《Unix & Linux大学教程》中,对这节所提到的内容全部都有详细的讲解,所以想看笔记的同学可以参考我之前的笔记,我会在每个知识点后加上上一本书笔记相应的链接

 

使用多个命令

多个命令之间,用分号分隔即可

 

创建shell脚本文件

shell脚本的行中,井号用作注释行

shell脚本中第一行特例,井号后跟着叹号,告诉shell用哪个shell来运行脚本

#!/bin/bash

建立完脚本文件后,文件还需要有执行权限才行

chmod u+x file

 

显示消息

echo string

-n:与下一行消息显示在同一行

(更多见#1 )

 

使用变量

在变量名前加美元符号($)

如果只是想单纯的显示美元符号,在双引号中需要加反斜线(\)

echo "$15":会把$1当做一个变量处理,所以要使用echo "\$15"

关于双引号的详细说明,见#1

 

用户变量

任何不超过20个字母、数字或下划线的文本字符串。变量区分大小写

赋值时等号两边不能有空格

(更多见#1 )

 

反引号

反引号允许将shell命令的输出赋给变量

test=`date`

(更多见#2 )

 

重定向输入和输出

重定向输出使用大于号(>)

> file:表示输出到file中

>> file:表示将输出追加到file文件末尾,不会覆盖file之前的内容

重定向输入使用小于号(<)

< file:表示从file中读取数据

<< file:内联输入重定向(inline input redirection)。允许在命令行而不是文件指定输入重定向的数据

必须指定一个文本标记来划分要输入数据的开始和结尾

(更多见#3 )

 

管道

Linux会同时运行管道两边的程序。在第一个命令产生输出时,输出会立即传个第二个命令,传输数据不会到任何中间文件或缓冲区

(更多见#3 )

 

执行数学运算

expr命令

expr命令允许在命令行上处理数学表达式,但是特别笨拙

expr命令操作符

操作符 描述 ARG1 | ARG2 如果没有参数是null或0值,返回ARG1,否则返回ARG2 ARG1 & ARG2 如果没有参数是null或0值,返回ARG1,否则返回0 ARG1 < ARG2 如果表达式为真,返回1,否则返回0 ARG1 <= ARG2 如果表达式为真,返回1,否则返回0 ARG1 = ARG2 如果表达式为真,返回1,否则返回0 ARG1 != ARG2 如果表达式为真,返回1,否则返回0 ARG1 >= ARG2 如果表达式为真,返回1,否则返回0 ARG1 > ARG2 如果表达式为真,返回1,否则返回0 ARG1 + ARG2 返回ARG1和ARG2的算术和 ARG1 - ARG2 返回ARG1和ARG2的算术差 ARG1 * ARG2 返回ARG1和ARG2的算术乘积 ARG1 / ARG2 返回ARG1被ARG2除的算术商 ARG1 % ARG2 返回ARG1被ARG2除的算术余数 STRING : REGEXP
如果REGEXP匹配到了STRIN中的某个模式,返回该模式匹配 match STRING REGEXP 如果REGEXP匹配到了STRIN中的某个模式,返回该模式匹配 substr STRING POS LENGTH
返回起始位置为POS(从1开始计数)、长度为LENGTH个字符的子字符串 index STRING CHARS 返回在STRING中找到的CHARS字符串的位置;否则返回0
length STRING 返回字符串STRING的数值长度
+ TOKEN 将TOKEN解释成字符串,即使是个关键字
(EXPRESSION) 返回EXPRESSION的值

直接使用expr可能会有很多问题,比如*需要加转义符号等

expr 5 \* 2

 

使用方括号

bash中,将一个数学运算结果赋给某个变量时,可以用美元符和方括号($[])将数学表达式圈起来(android中似乎不支持)

$ var1=$[1+5]  
$ echo $var1  
6
$ var2=$[$var1*2]  
$ echo $var2  
12
$ var3=$[($var1 + 4) * $var2]  
$ echo $var3  
120

bash不支持浮点运算,zsh支持

浮点解决方案

bc

能够识别数字(整数和浮点数)、变量(包括数组)、注释、表达式、编程语句、函数

使用浮点运算,必须设置scale,默认是0

-q:去掉bc的欢迎屏显示

 

在脚本中使用bc

基本格式:

variable=`echo "options;expression"|bc`

options允许设置变量,多个变量间用分号分隔

var=`echo "scale=2; 2/3" | bc`

如果计算很复杂,可以采用内联输入重定向

variable=`bc << EOF
options
statments
expressions
EOF`

这样看上去清晰多了,也不用单独写一个文件,然后传递给bc

这里EOF只是个标识符而已

(关于bc的更多讲解见#4 )

 

退出脚本

shell中每个命令都使用退出状态码(exit status)来告诉shell它完成了处理

退出状态码范围为[0,255],命令结束运行时由命令传给shell,可以捕获并使用

查看退出状态码(变量$?)

$date aaaaaa
$echo $?
$nothingnothingnothing
$echo $?
状态码 描述 0 命令成功结束 1 通用未知错误 2 误用shell命令 126 命令不可执行 127 没找到命令 128 无效退出参数 128+x Linux信号x的严重错误 130 命令通过ctrl+c终止 255 退出状态码越界

 

exit命令

默认情况下,shell脚本会以脚本中最后一个退出状态码退出

可以在脚本结束时指定退出状态码,也可以使用变量

exit code
exit $mycode

注意:如果状态码越界了,程序不会出错,shell会将其除以256后取余数

 

1.《Unix & Linux 大学教程》 - 第十二章 学习笔记 使用shell:变量和选项

2.《Unix & Linux 大学教程》 - 第十三章 学习笔记 使用shell:命令和定制

3.《Unix & Linux 大学教程》 - 第十五章 学习笔记 标准I/O:重定向和管道

4.《Unix & Linux 大学教程》 - 第八章 学习笔记 能够立即使用的程序


    
[2]Android资源图片内存占用及优化
    来源: 互联网  发布时间: 2013-11-10

优化的两种方式:
1大背景图使用:9.png,使用9png不但能节省APK包容量,更能有效节省堆栈内存
2小技巧1:使用多分辨率图片设计[hdpi,mdpi,ldpi,xhdpi]。UI图片分别设计hdpi,mdpi,ldpi,xhdpi等多种规格,这也是官方推荐的方式,
 使用这种方式,还有好处就是可以降低峰值内存,优先避免内存溢出。在android中图片的加载会根据分辨率来自动缩放【缩放的过程会额外消耗内存】
 看看android图片的内部加载方式[ BitmapFactory.java]
 Android 版本的一个inefficient:
 
 private static Bitmap finishDecode(Bitmap bm, Rect outPadding, Options opts) {
   //....
      float scale = targetDensity / (float)density;
      // TODO: This is very inefficient and should be done in native by Skia
      final Bitmap oldBitmap = bm;
      bm = Bitmap.createScaledBitmap(oldBitmap, (int) (bm.getWidth() * scale + 0.5f),
              (int) (bm.getHeight() * scale + 0.5f), true);
      oldBitmap.recycle();
 //...
  }
3小技巧2:图片资源放在assets或no-dpi中,也可以避免因缩放导致峰值内存过高
  如果你的程序经常因加载某图片溢出,但又想继续使用的话,你也可以直接使用:
   try{
     //load big memory data
   }catch(java.lang.OutOfMemoryError e){
    //TODO 替代方案
   }
测试:
1将图片A放置在no-dpi中,内存只会加载一次,不会进行任何缩放
2只在drawable-hdpi:下放置一张480-800的PNG图片A,
  2.1当测试机为avd2.3.3-320-480-mdpi
     2.1.1会先加载原始图片A到内存中【480-800】
     2.1.2在原图片A【480-800】的基础上再创建一张经过缩小的图片B【此时占用双份内存】--导致内存溢出
     2.1.3释放原图片A
     如果在drawable-mdpi中再放置一张480-800的PNG图片A,则只会执行一次创建:图片A到内存中
  2.2当测试机为AVD2.3.3-1024-600-mdpi
    2.2.1会先加载原始图片A到内存中【480-800】
     2.2.2在原图片A【480-800】的基础上再创建一张经过缩小的图片B【此时占用双份内存】--导致内存溢出
     2.2.3释放原图片A
     如果在drawable-mdpi中再放置一张480-800的PNG图片A,则只会执行一次创建:图片A到内存中
    测试结论:
      1图片是否会在创建的时候进行二次缩放只跟屏幕密度有关【与屏幕的尺寸无关】
      2图片最后适应屏幕大小,会在BitmapDrawable中进行
      BitmapDrawable对Bitmap的包装【内部会进行缩放】
         if (mApplyGravity) {
                    Gravity.apply(state.mGravity, mBitmapWidth, mBitmapHeight,
                            getBounds(), mDstRect);
                    mApplyGravity = false;
                }
          canvas.drawBitmap(bitmap, null, mDstRect, state.mPaint);
  2.3当测试机为AVD2.3.3-320-480-hdpi:
     图片只加载一次
     
  结论:
     对于大图片在mdpi中/xhdpi/ldpi中放置类似图片
     hdpi的图-->mdpi中需要:创建一次,再缩小一次【中间过程需要消耗更多内存】
     hdpi的图-->xhdpi中需要:创建一次,再放大一次【中间过程需要消耗更多内存】
     节省峰值内存的两种方式:
     1针对大尺寸图:分别设计hdpi,mdpi,xhdpi的资源图
     2将大尺寸图放入:no-dpi中,这样只会创建一次
    

友盟后台-创建缩放图片的爆内存的异常[第2号内存杀手]
java.lang.OutOfMemoryError: bitmap size exceeds VM budget
 at android.graphics.Bitmap.nativeCreate(Native Method)
 at android.graphics.Bitmap.createBitmap(Bitmap.java:477)
 at android.graphics.Bitmap.createBitmap(Bitmap.java:444)
 at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:349)
 at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:498)
 at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:473)
 at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336)
 at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
 at android.content.res.Resources.loadDrawable(Resources.java:1709)
 at android.content.res.Resources.getDrawable(Resources.java:581)
 at android.view.View.setBackgroundResource(View.java:7533)

 

作者:modiaGame 发表于2013-1-9 13:09:24 原文链接
阅读:0 评论:0 查看评论

    
[3]TCP_client
    来源: 互联网  发布时间: 2013-11-10

#include "common.h"

int main (int argc, char *argv[])
{
 int sock_fd,conn_fd;
 struct sockaddr_in server_addr,client_addr;
 socklen_t addrlen = ADDR_SIZE;
 int wc = -1,rc = -1;
 char buffer_r[BUFFER_SIZE],buffer_w[BUFFER_SIZE];
 int con_times = 0;
 int i = 1;
 struct hostent *host;
 
 if(argc != 2)
 {
  fprintf(stderr,"Usage:%s ip\n",argv[0]);
  exit(EXIT_FAILURE);
 }
 
 sock_fd = socket(AF_INET,SOCK_STREAM,0);
 if(sock_fd == -1)
  Err_sys("Client socket:")
 
 //host = gethostbyname("localhost");
 //host = gethostbyname("localhost.localdomain");
 host = gethostbyname(argv[1]);
 
 bzero(&server_addr,ADDR_SIZE);
 server_addr.sin_family = AF_INET;
 server_addr.sin_port = htons(Server_port);
 //server_addr.sin_addr.s_addr = inet_addr("192.168.59.128");;
 server_addr.sin_addr = *((struct in_addr *)host->h_addr);
 
 
 //bzero(&client_addr,ADDR_SIZE);
 //client_addr.sin_family = AF_INET;
 //client_addr.sin_port = htons(8080);
 //client_addr.sin_addr.s_addr = inet_addr("127.0.0.1");;
 
 
 
 setsockopt(sock_fd,SOL_SOCKET,SO_REUSEADDR,(void *)&i,sizeof(i));
 
 //if(bind(sock_fd,(struct sockaddr *)&client_addr,addrlen) == -1)
 // Err_sys("Client bind:")

 while((conn_fd = connect(sock_fd,(struct sockaddr *)&server_addr,addrlen)) == -1)
 {
  if(con_times < 3)
  {
   printf("Client connecting ...........\n");
   sleep(3);
  }
  else
  {
   printf("Client connected failfully \n");
   exit(EXIT_FAILURE);
  }
  con_times++;
 } //while
 
 while(RUNNING)
 {
  memset(buffer_w,0,BUFFER_SIZE);
  printf("[Client send]:");
  fflush(stdout);
  fgets(buffer_w,BUFFER_SIZE,stdin);
  wc =  send(sock_fd,buffer_w,BUFFER_SIZE,0);
  if(wc <= 0)
   Err_sys("Client send:")
 
  memset(buffer_r,0,BUFFER_SIZE);
 
  fflush(stdout);
  rc =  recv(sock_fd,buffer_r,BUFFER_SIZE,0);
  if(rc <= 0)
   Err_sys("Client recv:")
 
  printf("[Client recv]:%s\n",buffer_r);

 } //while
 
 close(sock_fd);
 return 0;
}

作者:qianzhaotu 发表于2013-1-9 13:09:10 原文链接
阅读:0 评论:0 查看评论

    
最新技术文章:
▪error while loading shared libraries的解決方法    ▪版本控制的极佳实践    ▪安装多个jdk,多个tomcat版本的冲突问题
▪简单选择排序算法    ▪国外 Android资源大集合 和个人学习android收藏    ▪.NET MVC 给loading数据加 ajax 等待loading效果
▪http代理工作原理(3)    ▪关注细节-TWaver Android    ▪Spring怎样把Bean实例暴露出来?
▪java写入excel2007的操作    ▪http代理工作原理(1)    ▪浅谈三层架构
▪http代理工作原理(2)    ▪解析三层架构……如何分层?    ▪linux PS命令
▪secureMRT Linux命令汉字出现乱码    ▪把C++类成员方法直接作为线程回调函数    ▪weak-and算法原理演示(wand)
▪53个要点提高PHP编程效率    ▪linux僵尸进程    ▪java 序列化到mysql数据库中
▪利用ndk编译ffmpeg    ▪活用CSS巧妙解决超长文本内容显示问题    ▪通过DBMS_RANDOM得到随机
▪CodeSmith 使用教程(8): CodeTemplate对象    ▪android4.0 进程回收机制    ▪仿天猫首页-产品分类
▪从Samples中入门IOS开发(四)------ 基于socket的...    ▪工作趣事 之 重装服务器后的网站不能正常访...    ▪java序列化学习笔记
▪Office 2010下VBA Addressof的应用    ▪一起来学ASP.NET Ajax(二)之初识ASP.NET Ajax    ▪更改CentOS yum 源为163的源
▪ORACLE 常用表达式    ▪记录一下,AS3反射功能的实现方法    ▪u盘文件系统问题
▪java设计模式-观察者模式初探    ▪MANIFEST.MF格式总结    ▪Android 4.2 Wifi Display核心分析 (一)
▪Perl 正则表达式 记忆方法    ▪.NET MVC 给loading数据加 ajax 等待laoding效果    ▪java 类之访问权限
▪extjs在myeclipse提示    ▪xml不提示问题    ▪Android应用程序运行的性能设计
▪sharepoint 2010 自定义列表启用版本记录控制 如...    ▪解决UIScrollView截获touch事件的一个极其简单有...    ▪Chain of Responsibility -- 责任链模式
▪运行skyeye缺少libbfd-2.18.50.0.2.20071001.so问题    ▪sharepoint 2010 使用sharepoint脚本STSNavigate方法实...    ▪让javascript显原型!
▪kohana基本安装配置    ▪MVVM开发模式实例解析    ▪sharepoint 2010 设置pdf文件在浏览器中访问
▪spring+hibernate+事务    ▪MyEclipse中文乱码,编码格式设置,文件编码格...    ▪struts+spring+hibernate用jquery实现数据分页异步加...
▪windows平台c++开发"麻烦"总结    ▪Android Wifi几点    ▪Myeclipse中JDBC连接池的配置
▪优化后的冒泡排序算法    ▪elasticsearch RESTful搜索引擎-(java jest 使用[入门])...    ▪MyEclipse下安装SVN插件SubEclipse的方法
▪100个windows平台C++开发错误之七编程    ▪串口转以太网模块WIZ140SR/WIZ145SR 数据手册(版...    ▪初识XML(三)Schema
▪Deep Copy VS Shallow Copy    ▪iphone游戏开发之cocos2d (七) 自定义精灵类,实...    ▪100个windows平台C++开发错误之八编程
▪C++程序的内存布局    ▪将不确定变为确定系列~Linq的批量操作靠的住...    ▪DIV始终保持在浏览器中央,兼容各浏览器版本
▪Activity生命周期管理之三——Stopping或者Restarti...    ▪《C语言参悟之旅》-读书笔记(八)    ▪C++函数参数小结
▪android Content Provider详解九    ▪简单的图片无缝滚动效果    ▪required artifact is missing.
▪c++编程风格----读书笔记(1)    ▪codeforces round 160    ▪【Visual C++】游戏开发笔记四十 浅墨DirectX教程...
▪【D3D11游戏编程】学习笔记十八:模板缓冲区...    ▪codeforces 70D 动态凸包    ▪c++编程风格----读书笔记(2)
▪Android窗口管理服务WindowManagerService计算Activity...    ▪keytool 错误: java.io.FileNotFoundException: MyAndroidKey....    ▪《HTTP权威指南》读书笔记---缓存
▪error while loading shared libraries的解決方法    ▪版本控制的极佳实践    ▪安装多个jdk,多个tomcat版本的冲突问题 iis7站长之家
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3