头文件中使用static变量

static是C/C++中让人迷惑的关键字。在一个文件对变量使用static关键字,则表示这个变量的作用范围仅限于本文件。
那么对于在头文件中使用static关键字,结果会如何呢。

首先,我们要明白,C++中对于头文件的处理。每个cpp文件在编译的时候都会将头文件(*.h)进行展开,这样就导致每个生成的*.o文件中均包含使用static修饰的变量,并且这个变量对其他文件不可见。结果是出现多份的变量,每个cpp文件中都只能访问本地的变量,这是一件较为危险的使用方法。

使用如下代码验证:

/*
    staticValue.hpp
    Check if static value will be copy in different .cpp s
*/
#pragma once

static int a = 0;
/*
    funcA.cpp
*/
#include <iostream>
#include "staticValue.hpp"

int funcA()
{
    std::cout<<"[funcA]"<<" &a\t= "<<&a<<std::endl;
    std::cout<<"[funcA]"<<" &::a\t= "<<&::a<<std::endl;
    return 0;
}
/*
    funcB.cpp
*/
#include <iostream>
#include "staticValue.hpp"

int funcB()
{
    std::cout<<"[funcB]"<<" &a\t= "<<&a<<std::endl;
    std::cout<<"[funcB]"<<" &::a\t= "<<&(::a)<<std::endl;
    return 0;
}
/*
    main.cpp
*/
#include <iostream>
#include "staticValue.hpp"

extern int funcA();
extern int funcB();

int main(void)
{
    std::cout<<"[main]"<<" &a:\t= "<<&a<<std::endl;
    std::cout<<"[main]"<<" &::a:\t= "<<&::a<<std::endl;
    funcA();
    funcB();
    return 0;
}

编译执行

iceyer@iceyer:~/$ g++ -g -o static-value main.cpp funcA.cpp funcB.cpp
iceyer@iceyer:~/$ ./static-value 
[main] &a:	= 0x602198
[main] &::a:	= 0x602198
[funcA] &a	= 0x6021a0
[funcA] &::a	= 0x6021a0
[funcB] &a	= 0x6021a8
[funcB] &::a	= 0x6021a8
继续阅读头文件中使用static变量

如何设置FolderView的透明度为0

  • Post author:
  • Post category:Ubuntu
  • Post comments:0评论

FolderView是毫不逊色于Fences的桌面图标分类软件(好吧,别吐槽在linux上为什么需要这种东西啦)

Fences有个很炫的效果就是在鼠标离开时能够自动隐藏。其实改动FolderView的代码也可以轻松实现。

只要在鼠标进入和离开窗口时设置窗口的opacity属性即可。

	def on_mouse_enter (self, event):
		self.clicked = False
		self.opacity = 1
		self.redraw_canvas()
		self.show_tip()

	def on_mouse_leave (self, event):
		"""Called when the mouse leaves the Screenlet's window."""
		if not self.clicked:
                #设置为0
		        self.opacity = 0
			self.cursor_position = [-1,-1]
			self.redraw_canvas()
			self.hide_tip()#self.timer1 = gobject.timeout_add(2000, self.hide_tip)

另外的方法就是去修改screenlet窗口透明度限制,这对所有的控件都有效

继续阅读如何设置FolderView的透明度为0

Ubuntu下压缩文件乱码问题小结

  • Post author:
  • Post category:Ubuntu
  • Post comments:0评论

一、问题由来
Ubuntu的Unity和Gnome环境默认的压缩管理器是File-roller,这玩意会调用各种库和程序来完成文件的压缩和解压缩,这是个很好的做法,但可惜的是它调用的库各种不靠谱。好吧,如果你狠心把File-roller干掉,换上xarchiver或者Ark(这个没乱码,但是是QT支持,有洁癖者慎用),那么问题就好多了。
File-roller调用的库包括unrar,unrar-free,p7zip, p7zip-full, p7zip-rar,足足有5个,File-roller会按照一定的顺序来调用这些库,可惜这些库有各自的问题。
unrar,unrar-free在本人的电脑上会显示× unrar is not rar archive,然后完全无法解压。
p7zip, p7zip-full, p7zip-rar对rar乱码无解。

二、解决方法

1.使用unrar
完全卸载p7zip-rar,安装unrar。很多人能够通过这种办法解决,如果你能够正常使用,那么恭喜你了。如果不能,那么接着往下看。

2.使用带中文patch的p7zip
卸载掉p7zip, p7zip-full, p7zip-rar没错,卸掉所有的,然后去网上下载一个带中午补丁的p7zip,安装好,恩,无乱码的世界真美好。如果你足够蛋疼,那么接着往下看。

三、patch干了些什么?
对于一个linuxer来说,没有源码的东西,让人很不放心啊,这个中午patch能解决中文环境下的乱码问题,这么好的补丁问什么没有被Marge到代码中去呢?看看patch做了些什么吧……

-void CInArchive::ReadFileName(UInt32 nameSize, AString &dest)
+#include <iconv.h>
+void CInArchive::ReadFileName(UInt32 nameSize, AString &dest, const char *encoding)
{
...do something
}

这一段将ReadFileName函数增加encoding的控制参数

-  ReadFileName(headerNameSize, item.Name);
+  if (p[3] == NFileHeader::NHostOS::kUnix)
+    ReadFileName(headerNameSize, item.Name);
+  else
+    ReadFileName(headerNameSize, item.Name, MY_ENCODING);

这一段根据文件头信息来选择是使用默认处理方法还是自己修改的函数

+#define MY_ENCODING "gb18030"

在头文件中定义MY_ENCODING

相信这里大家看明白了,这个补丁只对gb18030编码有效。嗯嗯,估计永远不会被接受了……

继续阅读Ubuntu下压缩文件乱码问题小结

在非终端下启动Matlab

Ubuntu 的启动快捷方式是.desktop文件,而Matlab安装后默认是不创建这个文件的,如果自己去创建的话会发现必须将.desktop文件中的Terminal参数设置为true,Matlab才能正常启动。这对某些有各种奇怪癖好的人来说可能无法忍受了,并且你不小心关掉了一起启动的终端,matlab也会随之退出,这时就难免发生悲剧了。其实只要在matlab后面加一行 “-desktop”参数就行了,附上一个desktop文件的写法:

[Desktop Entry]
Name=Matlab
Comment=Matlab
Icon=/home/iceyer/Desktop/matlabicon/matlab.png
Exec=/home/usr/local/MATLAB/R2012a/bin/matlab -desktop
Terminal=false
Type=Application
GenericName[zh_CN]=Matlab R2012a
继续阅读在非终端下启动Matlab

WPS for linux is comming

  • Post author:
  • Post category:Ubuntu
  • Post comments:0评论

WPS终于要来了,虽然以前WPS技术实现往QT转型时就在想会不会有跨平台版本,没想到金山真的把它给捣鼓出来了~看看论坛上放出的消息吧:

终于,我们带着日久弥新的WPS Office向一个新的世界迈出一步。

这可能只是很小的一步——面对桌面电脑占有份额依然较低、生态环境纷繁复杂的Linux桌面市场,我们对未来还没有全盘的把握和充分的信心,我们只能小步小步地摸着石头过河。

您,是否愿意和我们一起迎接新世界的挑战?

这又可能会是 很大的一步——Linux及相关开源软件已走过了二十余年的风雨历程,业已占据了服务器、超级计算机、手机移动平台的大部分市场份额,而近年 来,Linux桌面平台的可用性也在高速提升,应用软件也在不断丰富。然而,由于工程规模较大、用户需求较苛刻,办公软件,作为人们日常使用最多的软件之 一,成为了完善Linux桌面可用性的最后一片大空白。能让用户(尤其是中文用户)普遍满意的办公软件的缺失,严重阻碍了Linux桌面的发展。

您,是否愿意和我们一起推动新世界的革新?

欢迎您加入WPS社区!

WPS for Linux 需要您的支持:
1. 为不同发行版制作安装包
2. 在不同的发行版和桌面环境下进行测试
3. 使用社区 bug 跟踪系统进行有效反馈(建设中)
4. 使用 wiki 系统(建设中)分享安装和使用心得
5. 以社区成员身份传递 WPS for Linux 项目的正确信息

请将申请信发送至 [email protected] 。形式不限,字数不限,但应包含以下信息:
1. 您常用的 Linux 发行版以及桌面环境或窗口管理器
2. 您常参与的开源社区、论坛以及相应的ID
3. 您愿意为社区做点什么(比如打包、测试、文档等)

PS:申请邮箱持续有效!

首批邀请码将在3月28日发放。请原谅我们社区组织经验的缺乏,也为了保证对反馈进行最迅速的响应,首批社区成员预计50人左右。只要有大家的支持,我们的社区一定会逐渐扩大

继续阅读WPS for linux is comming

LiveLinux系列(2)–使用Grub2启动不同媒介

  • Post author:
  • Post category:Ubuntu
  • Post comments:2评论

上一篇文章介绍了如何在U盘上安装grub2,这篇讲解一下如何编写grub.cfg文件来启动不同的启动媒介,包括启动安装好的操作系统,Linux光盘镜像,PE光盘镜像等。

1.启动已安装的WinXP/Vista/Win7系统

menuentry "Windows 7 (loader) (on /dev/sda1)" --class windows --class os {
	insmod part_msdos
	insmod ntfs
	set root='(/dev/sda,msdos1)'
	chainloader +1
}

核心的部分是

	set root='(/dev/sda,msdos1)'
	chainloader +1

set root 语句是设置安装Windows系统的分区,'(/dev/sda,msdos1)’等价于(hd0,1)。

2.启动已安装的Linux系统

menuentry 'Ubuntu, with Linux 2.6.38-11-generic' --class ubuntu --class gnu-linux --class gnu --class os {
	insmod part_msdos
	insmod ext2
	set root='(/dev/sda,msdos3)'
	linux	/boot/vmlinuz-2.6.38-11-generic root=UUID=9fbd205b-1151-41c8-b48f-c8e0887f8d60 ro   quiet splash vt.handoff=7
	initrd	/boot/initrd.img-2.6.38-11-generic
}

上述给出的比较详细的写法,实际上可以写的更加简单一些:

insmod part_msdos
insmod ext2
set root='(/dev/sda,msdos3)'
linux /boot/vmlinuz-2.6.38-11-generic root=UUID=9fbd205b-1151-41c8-b48f-c8e0887f8d60 ro
initrd /boot/initrd.img-2.6.38-11-generic

linux是代替grub中的kernel指令,该指令后面的root参数必不可少,root参数后面要给出linux系统安装分区的位置,可以用uuid表示,如给出的例子所示,也可以用(hd0,3)这种传统的方法表示。

3.启动WinPE文件

menuentry 'Win7PE' --class windows --class os {
        set root='(/dev/sda,msdos4)'
        ntldr /boot/win7pe.bin
}

直接使用使用ntldr启动即可。

4.启动Dos镜像文件

Dos镜像文件一般为img格式,需要通过memdisk来启动,一般img会带上对应的memdisk文件。对于大于1.44Mb
的img文件,还需要添加c h s参数。实例如下:

menuentry 'DTSTool' --class dos --class os {
        set root='(/dev/sda,msdos4)'
        linux16  /boot/isolinux/memdisk  c=147 h=5 s=36 floppy
        initrd16 /boot/imgs/DTStool.IMA
}

使用linux16和initrd16来启动Dos镜像,c,h,s参数的设置方法可以参考:
http://www.syslinux.org/wiki/index.php/MEMDISK

继续阅读LiveLinux系列(2)–使用Grub2启动不同媒介

Ubuntu下APK文件反汇编

最近想研究一下qtadb,所以想得到qtadb.apk的源码,可惜网上没有给现成的,好在是java写的,反汇编一下可以凑合。具体方法如下:

1.解压APK文件

7z qtadb.apk -oqtadb

可以得到一个叫 classes.dex的文件,这个文件中就是油java文件编译成的class文件的合集了

2.生成jar文件

使用dex2jar生成包含class文件的jar。

dex2jar.sh qtadb/classes.dex

dex2jar下载地址:http://code.google.com/p/dex2jar/

3.使用jd-gui获得源码

jd-gui是个图形化的将jar中的class文件转化为java代码的程序。

直接打开由dex2jar生成的jar文件,然后保存源代码即可。

继续阅读Ubuntu下APK文件反汇编

更换驱动解决Ubuntu 11.10下Adobe Flash Player崩溃

  • Post author:
  • Post category:Ubuntu
  • Post comments:3评论

最近更新到Ubuntu11.10后adobe flash player开始不断崩溃,根据一些表现推断是硬件加速除了问题,正好碰上捣鼓Nvidia GT240的驱动,终于发现通过更换驱动能解决问题,下面的方法就简单了。

1.切换到tty1

Ctrl+Alt+F1

2.登录
输入用户名+“回车”+密码登录

3.停止X server

sudo services ligthdm stop

4.安装Nvidia驱动
可以安装软件源中的nvidia-current驱动

sudo apt-get install nvidia-current

也可以去Nividia 官网下载二进制驱动包NVIDIA-Linux-x86-290.10.run安装。目前测试只有这个版本的驱动工作的比较好,NVIDIA- Linux-x86-295.20的驱动会导致屏幕分裂,而其他几个版本的驱动会导致flash player崩溃。更早的版本没有测试。另外主要的是内核版本也会有影响,我现在用的的3.0.0.16的内核,ppa上3.2的版本和二进制驱动不兼 容。
安装方法:

sudo ./NVIDIA-Linux-x86-290.10.run

5.重新启动X server

sudo services ligthdm start

6.切换回GUI

Ctrl+Alt+F7
继续阅读更换驱动解决Ubuntu 11.10下Adobe Flash Player崩溃

Ubuntu 11.10 启动美化

一、安装burg系统引导器

1.从PPA源安装burgs

sudo add-apt-repository ppa:n-muench/burg
sudo apt-get update
sudo apt-get install burg burg-themes

安装burg引导

sudo burg-install "(hd0)"

或者

sudo burg-install /dev/sda

更新burg配置文件

sudo update-burg

2.隐藏启动提示“grub loading”

burg启动时会提示“grub loading”,是在是太碍眼,要去掉这个稍微有点麻烦,需要重新编译burg。

需要修改的源代码详见:

http://code.google.com/p/burg/issues/detail?id=29&q=grub%20loading

可使用

sudo apt-get source burg

来获取burg源代码。注意代码中可能有bug……

3.修复plymouth主题

burg和plymouth主题兼容不是很好,需要使用以下方法修复:

二、配置plymouth主题

配置plymouth方法较为简单,主要替换相应的默认plymouth主题文件即可。

sudo update-alternatives --config default.plymouth

sudo update-initramfs -u

三、ligtm配置

自ubuntu11.10中,ligtm配置在/etc/lightdm文件夹下,主要修改unity-greeter.conf,里面内容非常简单,看着说明修改就行了,主要是修改背景和logo文件。

继续阅读Ubuntu 11.10 启动美化

ssh代理配置

首先需要ssh一枚,免费收费皆可。

1.创建ssh代理守护进程


ssh -N -v [email protected] -D 127.0.0.1:7070

之后就可以在本机的7070端口使用stocks代理来XXXX了。

2.配置密钥认证

默认情况下,ssh代理在每次登录的时候都需要使用密码认证,每次输入密码十分繁琐,可以使用rsa密钥认证方法来解决这个问题。 首先在本机生成密钥:


ssh-keygen -t rsa

直接按三次回车,不必理会其中出现的密码输入提示。生成密钥一般在~/.ssh目录下面。 将生成的密钥上传到服务器:


cd ~/.ssh

ssh-copy-id -i id_rsa.pub [email protected]

最后,为ssh-agent进程添加密钥,否则无法通过认证


ssh-add

3.使用plink指定密码登录

如果服务器不支持rsa认证的时候,可以使用plink指定密码登录ssh。


sudo apt-get install putty-tools

plink -N -v username@hostip -D 127.0.0.1:7070 -pw password

继续阅读ssh代理配置