0%

Ubuntu 安装GTK

我利用此方法成功在UBUNTU 10.04下安装GTK 2.20.1。

安装

1、安装gcc/g++/gdb/make 等基本编程工具

1
$sudo apt-get install build-essential

2、安装 libgtk2.0-dev libglib2.0-dev 等开发相关的库文件

1
$sudo apt-get install gnome-core-devel

3、用于在编译GTK程序时自动找出头文件及库文件位置  

1
$sudo apt-get install pkg-config

4、安装 devhelp GTK文档查看程序

1
$sudo apt-get install devhelp

5、安装 gtk/glib 的API参考手册及其它帮助文档

1
$sudo apt-get install libglib2.0-doc libgtk2.0-doc

6、安装基于GTK的界面GTK是开发Gnome窗口的c/c++语言图形库

1
$sudo apt-get install glade libglade2-dev

或者

1
$sudo apt-get install glade-gnome glade-common glade-doc

7、安装gtk2.0 或者 将gtk+2.0所需的所有文件统通下载安装完毕

1
$sudo apt-get install libgtk2.0-dev

或者

1
$sudo apt-get install libgtk2.0*

  

查看GTK库版本

1、查看1.2.x版本

1
$pkg-config –modversion gtk+

2、查看 2.x 版本

1
$pkg-config –modversion gtk+-2.0

3、查看pkg-config的版本

1
$pkg-config –version

4、查看是否安装了gtk

1
$pkg-configlist-all grep gtk

  

测试程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//Helloworld.c

#include <gtk/gtk.h>

int main(int argc,char *argv[])
{
GtkWidget *window;
GtkWidget *label;

gtk_init(&argc,&argv);

/* create the main, top level, window */
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

/* give it the title */
gtk_window_set_title(GTK_WINDOW(window),“Hello World”);

/* connect the destroy signal of the window to gtk_main_quit
* when the window is about to be destroyed we get a notification and
* stop the main GTK+ loop
*/
g_signal_connect(window,“destroy”,G_CALLBACK(gtk_main_quit),NULL);

/* create the “Hello, World” label */
label = gtk_label_new(“Hello, World”);

/* and insert it into the main window */
gtk_container_add(GTK_CONTAINER(window),label);

/* make sure that everything, window and label, are visible */
gtk_widget_show_all(window);

/* start the main loop, and let it rest until the application is closed */
gtk_main();

return 0;
}

  

编译运行

1、编译

1
$gcc -o Helloworld Helloworld.c `pkg-config –cflags –libs gtk+-2.0`

2、运行

1
$./Helloworld

C语言的赋值运算符

​ 赋值运算符就是把表达式或者值赋给变量,比如极易混淆的=为赋值,等于是==

​ 其实赋值运算符可以和很多前面说的算术运算符、逻辑运算符和按位运算符合并使用。

​ 如下如下:

赋值运算符 含义
= 赋值,等于
+= 加后赋值
-= 减后赋值
*= 乘后赋值
/= 除后赋值
%= 取模后赋值
&= 按位与后赋值
|= 按位或后赋值
^= 按位异或后赋值
<<= 按位左移后赋值
>>= 按位右移后赋值

举个例子来show一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/*advance/operator/operator2.c*/
#include <stdio.h>

int main()
{
int a;
printf("a is %d\n", a);
a = 5; //0b101
printf("a is %d\n", a);

printf("%d += 2 -> %d \n", a, a += 2);
a = 5; //0b101
printf("%d -= 2 -> %d \n", a, a -= 2);
a = 5; //0b101
printf("%d *= 2 -> %d \n", a, a *= 2);
a = 5; //0b101
printf("%d /= 2 -> %d \n", a, a /= 2);
a = 5; //0b101
printf("%d %%= 2 -> %d \n", a, a %= 2);
a = 5; //0b101
printf("%d &= 2 -> %d \n", a, a &= 2);
a = 5; //0b101
printf("%d |= 2 -> %d \n", a, a |= 2);
a = 5; //0b101
printf("%d ^= 2 -> %d \n", a, a ^= 2);
a = 5; //0b101
printf("%d <<= 2 -> %d \n", a, a <<= 2);
a = 5; //0b101
printf("%d >>= 2 -> %d \n", a, a >>= 2);

return 0;
}

相应地Makefile如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#advance/operator/Makefile

ALL : operator1 operator2

operator1: operator1.c
gcc -o operator1 operator1.c

operator2: operator2.c
gcc -o operator2 operator2.c

.PHONY : clean

clean:
rm -f operator1 operator2

输入make,然后./operator2输出为:

1
2
3
4
5
6
7
8
9
10
11
12
a is 107106770
a is 5
5 += 2 -> 7
5 -= 2 -> 3
5 *= 2 -> 10
5 /= 2 -> 2
5 %= 2 -> 1
5 &= 2 -> 0
5 |= 2 -> 7
5 ^= 2 -> 7
5 <<= 2 -> 20
5 >>= 2 -> 1

可以看到结果就是对每一位进行的操作

那么问题来了,你知道为什么a刚开始的值是107106770吗,为什么每次都给a赋值吗?

C语言的按位运算符

​ 按位运算符,在实际的程序中用的不是很多,主要的应用是底层系统操作,比如嵌入式、驱动等,它的作用就是对位进行操作,这个就要比较熟悉各种进制的转换了。

​ 几个按位运算符的含义如下:

按位运算符 含义
& 按位与
| 按位或
^ 按位异或
~ 按位取反
<< 按位左移
>> 按位右移

举个例子来show一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*advance/operator/operator1.c*/
#include <stdio.h>

int main()
{
int a = 5; //0b101
int b = 3; //0b011

printf("%d & %d : %d\n", a, b, (a & b));
printf("%d | %d : %d\n", a, b, (a | b));
printf("%d ^ %d : %d\n", a, b, (a ^ b));
printf("~%d : %d\n", a, ~a);
printf("%d<<1 : %d\n", a, a << 1);
printf("%d>>1 : %d\n", b, b >> 1);

return 0;
}

相应地Makefile如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
#advance/operator/Makefile

ALL : operator1

operator1: operator1.c
gcc -o operator1 operator1.c

.PHONY : clean

clean:
rm -f operator1

我们可以看到,这一次的Makefile我们多了一个.PHONY行,这是一个伪目标,主要作用是防止Makefile定义的可执行命令的目标跟工作目录里面的文件重名而出现无法运行的问题,在这也提高了执行时的效率,建议每个Makefile都要包含。

输入make,然后./operator1输出为:

1
2
3
4
5
6
5 & 3 : 1
5 | 3 : 7
5 ^ 3 : 6
~5 : -6
5<<1 : 10
3>>1 : 1

可以看到结果就是对每一位进行的操作

python中read() readline()以及readlines()用法

文件对象提供了三个“读”方法: .read()、.readline() 和 .readlines()。
每种方法可以接受一个变量以限制每次读取的数据量,但它们通常不使用变量。

  • read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。然而 .read() 生成文件内容最直接的字符串表示,但对于连续的面向行的处理,它却是不必要的,并且如果文件大于可用内存,则不可能实现这种处理。
  • readline() 和 readlines() 非常相似。它们都在类似于以下的结构中使用:

Python .readlines() 示例

1
2
3
fh = open(‘c:\\autoexec.bat’)
for line in fh.readlines():
print line

.readline() 和 .readlines() 之间的差异是后者一次读取整个文件,象 .read() 一样。.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for … in … 结构进行处理。另一方面,.readline() 每次只读取一行,通常比 .readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 .readline()。

Linux 下的编辑器

[TOC]

遍寻编辑器那么多,最爱的还是VIM

gedit

gedit无需多言,Linux各个发行版默认都有的编辑器,类似于Windows的记事本,不过可以根据代码类型着色,这点可比记事本NB。

Sublime Text

最后一个神器就是Sublime Text 2,一个基本上可以称得上是IDE的编辑器,最先看到是在前公司的前端工程师的Mac上,看官方的介绍感觉又是一款类似于Vim的神器,但是比Vim界面更好看,功能更全面,非常适合PHP、Python、JavaScript这些Web开发。

下载/安装:http://www.sublimetext.com

Notepad++(Windows)

Notepad++ 是很多Windows用户寻找的比记事本更优秀的文本编辑器。它拥有很多丰富先进的特性,例如语法高亮显示,代码折叠和宏,但不同于大多数其他的基于GUI的文本编辑器功能,Notepad++是完全自由而且开放源代码。它和其他的编辑器相比可能并非性感如起飞的蝙蝠。但它完全定制,因此只受限于您的时间和想象力。作为一个编辑器,它的强大是不言而喻的。

Emacs (适合所有平台)

高级程序员的主要文本编辑器。在Emacs(编辑宏)最受欢迎的是内置宏和清大的键盘命令,使编辑的文本文件,尤其是代码很好高兴。常说:您可能不会完全明白Emacs的,直到您花一些时间去了解它。该程序已经被移植到几乎所有的平台,并有多个发行版,其中最流行的可能是GNU Emacs和XEmacs,它们都是免费、跨平台和开放源码。

UltraEdit (Windows)

共享软件UltraEdit($49.95)用户感觉很友好的编辑器,支持语法高亮显示,代码折叠宏和和同类软件相比拥有大量的可用功能。UltraEdit是一个很好的WEB开发平台,提供很多高级特性用来构建HTML,PHP,JavaScript和更多其它的网络编程语言。

TextMate (Mac OS X)

强大而且更具吸引力,TextMate ($63)出现在视野中仅仅几年时间而且因有吸引力的界面、功能强大的宏、以及可下载和可编辑的束,迅速的获得了狂热的追捧。Windows用户要是喜欢TextMate可以试一下E Text Editor(一个类似于TextMate且支持TextMate宏束的文本编辑器)。

Vim(所有平台)

Vim的强大就不用多说了,非常熟练Vim的话所有的工作都可以使用Vim去完成,Vim也称为编辑器的瑞士军刀,是高级程序员的一个强大工具。也类似于Emacs,Vim也有不同的口味,除了原来的,还有Windows平台的gVim 和 gVim Portable,Mac平台的MacVim,如果你认为你可能的兴趣在Vim中已经提供,但尚未准备好一步一步深入这款功能强大而又有点不易用的编辑器,

EditPlus

EditPlus(文字编辑器)汉化版一套功能强大,可取代记事本的文字编辑器,EditPlus拥有无限制的撤消与重做、英文拼字检查、自动换行、列数标记、搜寻取代、同时编辑多文件、全屏幕浏览功能。而它还有一个好用的功能,就是它有监视剪贴板的功能,能够同步于剪贴板自动将文字粘贴进 EditPlus 的编辑窗口中,让你省去粘贴的步骤。另外它也是一个非常好用的HTML编辑器,它除了支持颜色标记、HTML 标记,同时支持C、C++、Perl、Java,另外,它还内建完整的HTML & CSS1 指令功能,对于习惯用记事本编辑网页的朋友,它可帮你节省一半以上的网页制作时间,若你有安装IE3.0 以上版本,它还会结合IE浏览器于 EditPlus 窗口中,让你可以直接预览编辑好的网页(若没安装IE,也可指定浏览器路径)。因此,它是一个相当棒又多用途多状态的编辑软件。

Linux shell中的for循环用法详解

for循环有多用用法,比如:

  • for i in “file1” “file2” “file3”
  • for i in /boot/*
  • for i in /etc/*.conf
  • for i in $(seq -w 10) –》等宽的01-10
  • for i in {1…10}
  • for i in $( ls )
  • for I in $(< file)
  • for i in “$@” –》取所有位置参数,可简写为for i

注意:bash shell支持C式for循环

Shell

ash shell

Ash shell是一种低预算的shell,体型较小,提供基本特性。尤其适合低内存应用,例如嵌入式Linux系统。

Dash shell是Debian Linux发型的ash shell,及Debian ash shell的缩写。

对于Ubuntu这里需要注意,Ubuntu Linux使用bash shell作为默认的交互式shell,但是使用dash shell作为默认的/bin/sh shell。这个特性很容易让shell编程人员感到混乱,甚至是有时脚本无法运行。

我们一般编写脚本的时候通常使用#!/bin/sh,但是由上面可以知道ubuntu会把这个指向dash,所以还是写成#!/bin/bash吧,这样比较保险。

tcsh shell

Linux世界中另一种流行的shell是C shell,C shell是将C编程语言中的特性合并到shell脚本中,最流行的开源C shell是tcsh shell。

C shell的目的是提供一个适合C编程人员的命令行和脚本编写环境。

20世纪70年代后期Ken Greer对C shell进行扩展,添加了TENEX操作系统的命令行编程特性,这就是tcsh的由来。

tcsh shell环境变量可能有点混淆、Bourne shell及其派生的bash、ash和dash都只是使用一种环境变量来存储系统信息。而tcsh shell包含两种环境变量:

  • shell变量;
  • 系统环境变量; 系统环境变量由大写字母组成,提供标准系统信息。Tcsh shell变量是小写变量,对shell具有特殊含义。

对于shell变量,可以使用set命令设置shell变量值。或者@也可以。

Korn shell

Korn shell在Unix世界中很流行,但是在Linux世界中并不同样流行。Korn shell提供了Bourne shell和c shell世界的混合特性。

原始Korn shell是David Korn于20世纪80年代在AT&T贝尔实验室工作期间开发的。

Korn shell分两种不同的路线:

  • Ksh88
  • Ksh93

大多数实现使用的是ksh93 shell。

Ksh93 shell的一个很棒的特性是可以轻松的使用数学运算。

执行数学运算的方法有两种;

  • let命令;
  • 双圆括号;

对于许多编程人员来说,ksh93 shell的卖点就是它对浮点数的完全支持。

zsh shell

Zsh shell提供一些神奇的特性,并将shell未来发展的门槛提高到相当高的高度。

Zsh是Paul Falstad开发的开源Unix Shell。它是集合了Bourne、bash、ash和tcsh等shell的特性,这句话很NB呀,并加入了许多特有的特性,以编程人员使用为目的而创建的一种成熟的高级shell。

其中一些特性使得zsh独具特色:

  • 改良的shell选项控制;
  • Shell兼容性的模式;
  • 可载入模块。

在这些特色中,可载入模块在shell设计中思想最先进。

zsh shell提供一个核心内置命令集,还提供添加附加命令模块(command modules)的功能。

Zsh是目前自定义功能最强的shell。

可以使用zmodload命令添加ash的模块,如果不加任何参数,可以显示zsh中的模块。

要删除一个模块可以使用-u参数,例如zmodload –u zsh/net/tcp就可以删除tcp模块了。

Linux shell 编写规范化、标准化

脚本中多写注释

作注释不仅方便自己还能帮助别人在翻阅你的脚本时了解脚本的不同部分所做的工作。

注释用 # 号来定义。

当运行失败时使脚本退出

有时即使某些命令运行失败,bash 可能继续去执行脚本,这样就影响到脚本的其余部分(会最终导致逻辑错误)。

此时可以把下面的内容写在脚本的前面在遇到命令失败时来退出脚本执行:

1
2
3
4
# 如果命令运行失败让脚本退出执行 
set -o errexit
# 或者
set -e

当 Bash 用未声明变量时使脚本退出

Bash 也可能会使用能导致起逻辑错误的未声明的变量。因此用下面行的方式去通知 bash

当它尝试去用一个未声明变量时就退出脚本执行:

1
2
3
4
# 若有用未设置的变量即让脚本退出执行 
set -o nounset
#或者
set -u

使用双引号来引用变量

用双引号有助于防止由于空格导致单词分割开和由于识别和扩展了通配符而导致的不必要匹配。

在脚本中使用函数

除了非常小的脚本(只有几行代码),总是记得用函数来使代码模块化且使得脚本更可读和可重用。

写函数的语法如下所示:
1
2
3
4
5
6
7
8
9
function  demo(){   
command1;
command2;
}
# 或
demo(){
command1;
command2;
}

如果写成单行代码时,每个命令后要用终止符号:

1
demo(){ command1; command2; }

字符串比较时用 = 而不是 ==

注意: == 是 = 的同义词,因此仅用个单 = 来做字符串比较,

用 $(command) 来做代换

命令代换是用这个命令的输出结果取代命令本身。用 $(command) 而不是引号 command 来做命令代换。

这种做法也是 shellcheck tool (可针对 shell 脚本显示警告和建议)所建议的。例如:

1
2
user=`echo$UID”` 
user=$(echo$UID”)

用 readonly 来声明静态变量

静态变量不会改变;它的值一旦在脚本中定义后不能被修改:

1
readonly mycountry=”China” 

环境变量用大写字母命名,而自定义变量用小写

所有的 bash 环境变量用大写字母去命名,因此用小写字母来命名你的自定义变量以避免变量名冲突:

其他需要注意的

  • 变量名,函数名要有实际意义,函数名以动名词形式,第二个单词首字母要大写。例如:updateConfig()
  • 取变量值使用大括号,如${varname}
  • 删除文件时,如果路径有变量的,要判断变量有值,如rm -f ${abc}/* 如果变量abc没有值,则会把根目录下的文件删除
  • 脚本中尽量不要使用cd变换目录
  • 函数中也要有功能描述,使用依法,版本,日期等
  • 函数的功能要单一,不要太复杂
  • $()比 更好
  • 尽量不要使用多层if语句,而应该以case语句替代
  • 如果需要执行确定次数的循环,应该用for语句替代while语句
  • 输入的参数要有正确性判断

Linux shell中的变量

检查变量是否存在

1
2
3
4
5
6
if [ -z "$a" ]
then
echo "not defined"
else
echo "defined"
fi

Shell

ash shell

Ash shell是一种低预算的shell,体型较小,提供基本特性。尤其适合低内存应用,例如嵌入式Linux系统。

Dash shell是Debian Linux发型的ash shell,及Debian ash shell的缩写。

对于Ubuntu这里需要注意,Ubuntu Linux使用bash shell作为默认的交互式shell,但是使用dash shell作为默认的/bin/sh shell。这个特性很容易让shell编程人员感到混乱,甚至是有时脚本无法运行。

我们一般编写脚本的时候通常使用#!/bin/sh,但是由上面可以知道ubuntu会把这个指向dash,所以还是写成#!/bin/bash吧,这样比较保险。

tcsh shell

Linux世界中另一种流行的shell是C shell,C shell是将C编程语言中的特性合并到shell脚本中,最流行的开源C shell是tcsh shell。

C shell的目的是提供一个适合C编程人员的命令行和脚本编写环境。

20世纪70年代后期Ken Greer对C shell进行扩展,添加了TENEX操作系统的命令行编程特性,这就是tcsh的由来。

tcsh shell环境变量可能有点混淆、Bourne shell及其派生的bash、ash和dash都只是使用一种环境变量来存储系统信息。而tcsh shell包含两种环境变量:

  • shell变量;
  • 系统环境变量; 系统环境变量由大写字母组成,提供标准系统信息。Tcsh shell变量是小写变量,对shell具有特殊含义。

对于shell变量,可以使用set命令设置shell变量值。或者@也可以。

Korn shell

Korn shell在Unix世界中很流行,但是在Linux世界中并不同样流行。Korn shell提供了Bourne shell和c shell世界的混合特性。

原始Korn shell是David Korn于20世纪80年代在AT&T贝尔实验室工作期间开发的。

Korn shell分两种不同的路线:

  • Ksh88
  • Ksh93

大多数实现使用的是ksh93 shell。

Ksh93 shell的一个很棒的特性是可以轻松的使用数学运算。

执行数学运算的方法有两种;

  • let命令;
  • 双圆括号;

对于许多编程人员来说,ksh93 shell的卖点就是它对浮点数的完全支持。

zsh shell

Zsh shell提供一些神奇的特性,并将shell未来发展的门槛提高到相当高的高度。

Zsh是Paul Falstad开发的开源Unix Shell。它是集合了Bourne、bash、ash和tcsh等shell的特性,这句话很NB呀,并加入了许多特有的特性,以编程人员使用为目的而创建的一种成熟的高级shell。

其中一些特性使得zsh独具特色:

  • 改良的shell选项控制;
  • Shell兼容性的模式;
  • 可载入模块。

在这些特色中,可载入模块在shell设计中思想最先进。

zsh shell提供一个核心内置命令集,还提供添加附加命令模块(command modules)的功能。

Zsh是目前自定义功能最强的shell。

可以使用zmodload命令添加ash的模块,如果不加任何参数,可以显示zsh中的模块。

要删除一个模块可以使用-u参数,例如zmodload –u zsh/net/tcp就可以删除tcp模块了。