0%

树莓派基本配置

  1. 树莓派设备安装RASPBIAN系统

  2. 使用raspi-config进行配置

    参考http://blog.csdn.net/xdw1985829/article/details/38816375

  3. 更新系统到最新sudo apt-get update & sudo apt-get upgrade

安装JRE环境

sudo apt-get install openjdk-7-jre

安装MySQL

sudo apt-get install mysql-server

安装PHPMyAdmin

sudo apt-get install phpmyadmin

安装Openfire服务

下载:wget http://download.igniterealtime.org/openfire/openfire_3.10.3_all.deb

安装:sudo dpkg -i openfire_3.10.3_all.deb

打开PHPMyAdmin创建数据库

  1. 创建数据库openfire
  2. 导入数据库文件openfire_mysql.sql,可以在/usr/share/openfire/resources/database目录中,找到每一个对应数据库类型的SQL文件。这个地方我使用的是MySQL。

启动Openfire并进行初始设置

通过命令可以对Openfire服务进行启动/停止/重启/强制加载 /etc/init.d/openfire {start|stop|restart|force-reload}

通过启动sudo /etc/init.d/openfire start并访问http://[openfire server ip]:9090进行初始设置

Mac OS 10.11 Openfire无法启动问题

安装好openfire_3_10_2.dmg后,无法通过【系统偏好设置】中的Openfire图标启动服务器。
1、JDK版本:1.8.65。经测试需要JDK 1.7版本以上。
2、Openfire版本:3.10.2

最终解决办法:在终端中执行命令

1
2
3
4
sudo su
cd /usr/local/openfire/bin
export JAVA_HOME=`/usr/libexec/java_home`
sh ./openfire.sh

卸载Openfire

只需要在openfire关闭的情况下,执行以下的命令即可:

1
2
3
sudo rm -rf /Library/PreferencePanes/Openfire.prefPane
sudo rm -rf /usr/local/openfire
sudo rm -rf /Library/LaunchDaemons/org.jivesoftware.openfire.plist

在QtWebkit的QWebView加载网页的时候,会随着每加载一次网页内存就会增加。为解决这个问题可以通过以下代码解决。

1
2
3
4
5
6
7
QWebSettings::globalSettings()->setAttribute(QWebSettings::AutoLoadImages, false);
QWebSettings::globalSettings()->setMaximumPagesInCache(0);
QWebSettings::globalSettings()->setObjectCacheCapacities(0, 0, 0);
QWebSettings::globalSettings()->setOfflineStorageDefaultQuota(0);
QWebSettings::globalSettings()->setOfflineWebApplicationCacheQuota(0);
QWebSettings::globalSettings()->clearIconDatabase();
QWebSettings::globalSettings()->clearMemoryCaches();

其中
QWebSettings::globalSettings()->clearIconDatabase(); QWebSettings::globalSettings()->clearMemoryCaches();
可以在下一次加载开始前调用,每次调用后会将上一次加载过的页面内存清空。

详细解析

  1. void QWebSettings::setMaximumPagesInCache(int pages)
    设置在内存中缓存的最大页数为pages。缓存页可以在浏览历史页面的时候提供更好的用户体验。
    详细介绍参考:http://webkit.org/blog/427/webkit-page-cache-i-the-basics/

  2. void QWebSettings::setObjectCacheCapacities(int cacheMinDeadCapacity, int cacheMaxDead, int totalCapacity)
    指定已死对象的内存容大小。已死包括stylesheets和scripts。
    cacheMinDeadCapacity指定当缓存在压力下,已死对象消耗的最小字节数。
    cacheMaxDead 是当缓存没在压力下,已死对象应该消耗的最大字节数。
    totalCapacity 指定缓存全部消耗的最大字节数。
    缓存默认是开启的。通过setObjectCacheCapacities(0, 0, 0)来禁用缓存。设置非零来开启。

  3. void QWebSettings::setOfflineStorageDefaultQuota(qint64 maximumSize)
    设置新的离线存储数据库的默认最大值为maximumSize

  4. void QWebSettings::setOfflineWebApplicationCacheQuota(qint64 maximumSize)
    设置离线web应用的缓存最大值为maximumSize

  5. void QWebSettings::clearIconDatabase()
    清除图标数据库。

  6. void QWebSettings::clearMemoryCaches()
    通过JavaScript垃圾回收器和清空比如页面、对象和字体等缓存,尽可能多地释放内存。

Webkit Page Cache机制

https://www.webkit.org/blog/427/webkit-page-cache-i-the-basics/
https://trac.webkit.org/wiki/MemoryCache

参考链接

http://qt-project.org/forums/viewthread/11105
http://webkit.sed.hu/content/disabling-cache

Qt读取MS Word/Excel/Powerpoint等主要通过ActiveQt来实现。实际上是调用MS Word的ActiveX APIs。
一下代码是读取word中的所有的文本。

1
2
3
4
5
6
7
8
9
10
QAxObject wordApplication("Word.Application");
QAxObject *documents = wordApplication.querySubObject("Documents");
QAxObject* document = documents->querySubObject("Open(const QString&, bool)", m_strWordFilePath, true);
QAxObject* words = document->querySubObject("Words");
QString textResult;
int countWord = words->dynamicCall("Count()").toInt();
for (int a = 0; a <= countWord; a++){
textResult.append(words->querySubObject("Item(int)", a)->dynamicCall("Text()").toString());
}
wordApplication.dynamicCall("Quit (void)");

详细介绍:
Word程序初始化:QAxObject wordApplication("Word.Application")也可以通过QAxWidget wordApplication("Word.Application"),都是初始化com组件对象。
word程序的子对象可以通过QAxBase::querySubObject()来获得。
e.g:QAxObject *documents = wordApplication.querySubObject("Documents");
任何涉及到word对象的方法调用都可以通过QAxBase::dynamicCall ()来实现。
e.g:activeDocument->dynamicCall("Close(void)");
参考链接:
http://qt-project.org/wiki/Using_ActiveX_Object_in_QT
http://qt-project.org/wiki/Handling_Document_Formats
http://qt-project.org/wiki/Handling_Microsoft_Word_file_format
https://qt-project.org/search/tag/ms~word
http://qt-project.org/forums/viewthread/20341

解决办法

1
2
3
4
5
6
    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
#if (QT_VERSION <= QT_VERSION_CHECK(5, 0, 0))
QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
QTextCodec::setCodecForTr(codec);
#endif

乱码出现的原因

QString内部采用的是 Unicode,它可以同时存放GBK中的字符”我是汉字”,BIG5中的字符”扂岆犖趼” 以及Latin-1中的字符”ÎÒÊǺº×Ö”。
当你需要从窄字符串 char* 转成Unicode的QString字符串的,你需要告诉QString你的这串char* 中究竟是什么编码?GBK、BIG5、Latin-1?
在你不告诉它的情况下,它默认选择了Latin-1,于是8个字符”ÎÒÊǺº×Ö”的unicode码被存进了QString中。最终,8个Latin字符出现在你期盼看到4中文字符的地方,
所谓的乱码出现了。
网上有很多方法介绍直接在main.cpp里设置:

1
2
3
4
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);

其实这在某些情况下也是有问题的,因为程序可能读到系统的中文路径,或者调用中文路径下的外部程序,这时候如果系统是gb2312就有问题了。
因为中文路径的编码是采用utf-8存到QString里的,系统读中文路径解码的时候采用的却是系统的gb2312,所以会调不起带中文路径的外部程序。
以上问题下面方法可以解决:

1
2
3
4
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());

对于外部字符串编码解码全部采用本地编码。
参考链接:http://blog.csdn.net/brave_heart_lxl/article/details/7186631

基本用法

行尾2空格 + 1回车 = 换行
连续2回车 = 空行分段
*斜体*
**粗体**
4空格 = 代码块
> = 引用
-,*,+ = 无序列表
1. = 有序列表
<http://foo.com> = 链接网址
[文字](http://url) = 链接文字
![说明](http://imgurl) = 图片

阅读全文 »

Windows API

FindWindow

  • 函数功能:该函数获得一个顶层窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数不查找子窗口。在查找时不区分大小写。
  • 函数原型:HWND FindWindow(LPCTSTR IpClassName,LPCTSTR IpWindowName);
  • 参数:IpClassName:指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobafAddAtom函数产生的全局成员。该成员为16位,必须位于IpClassName的低 16位,高位必须为 0。
    IpWindowName:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为空,则为所有窗口全匹配。
  • 返回值:如果函数成功,返回值为具有指定类名和窗口名的窗口句柄;如果函数失败,返回值为NULL。这个函数有两个参数,第一个是要找的窗口的类,第二个是要找的窗口的标题。在搜索的时候不一定两者都知道,但至少要知道其中的一个。有的窗口的标题是比较容易得到的,如”计算器”,所以搜索时应使用标题进行搜索。但有的软件的标题不是固定的,如”记事本”,如果打开的文件不同,窗口标题也不同,这时使用窗口类搜索就比较方便。如果找到了满足条件的窗口,这个函数返回该窗口的句柄,否则返回0。也可以通过SendMessage(hwnd, WM_CLOSE, NULL, NULL);来关闭窗口。

GetWindowThreadProcessId

  • 函数功能:在得到窗口句柄后我们可以通过GetWindowThreadProcessId这个函数来获得窗口所属进程ID和线程ID,从而判断创建窗口的进程和线程。
  • 函数原型:DWORD GetWindowThreadProcessId(HWND hWnd,LPDWORD lpdwProcessId);
  • 参数:hWnd:传入的窗口句柄;lpdwProcessId:返回的进程ID地址。
  • 返回值:函数返回的是窗口所属线程ID。
    这个函数可以结合FindWindow共同使用。通过FindWindow查找窗口句柄。

XULRunner 可以通过运用 Web 开发技术构建桌面应用程序。它提供了丰富的 UI 部件集,使用 XUL,可以直接与 HTML 混合使用并可大量使用 JavaScript。

基本概念

XULRunner

XULRunner是Mozilla运行包,可以启动类似Firefox和Tunderbird这样多功能的XUL+XPCOM结合的程序。它为程序提供安装、升级、删除机制。 XULRunner还会提供libxul, 它允许其它项目或产品嵌入使用谋智(Mozilla)技术。

XUL

XUL是一个Mozilla使用XML来描述用户界面的一种技术,使用XUL你可以快速的创建出跨平台,基于因特网的应用程序。基于XUL技术的应用程序可以很方便的使用好看的字体、图形以及方便的界面布局,而且也更容易部署和定制。如果程序员已经熟悉了Dynamic HTML (DHTML),那学习XUL将是更容易的事,也可以更快的开发基于XUL的应用程序。

XPCOM

XPCOM(Cross Platform Component Object Model)是一种跨平台组件对象模型,其原理与微软的COM技术类似,它支持多种语言绑定(Language Bindings)。也就是说,我们可以使用C++、JAVA、JavaScript、Python、Ruby、Perl等语言来编写组件。而XPCOM的接口是用一种叫做XPIDL的IDL(Interface Description Language)来定义的。
XPCOM 本身提供了一套核心的组件和类,用于诸如内存管理,线程,基本数据结构(strings, arrays, variants)等 。但是大部分的XPCOM组件并不是这个核心库提供的,而是由很多第三方的平台(例如Gecko或者Necko)提供,或者由一个应用,甚至一个扩展提供。

应用程序目录结构

XULRunner应用、扩展和主题都共享相同的目录结构,并且这样的目录结构某些时候还可以用于像可安装应用扩展那样的独立XULRunner应用。

最近公司开发的Windows软件总是被360检出病毒,特别恼火。总结了几种方法。

1. 程序数字签名

基本上在第一轮和杀毒软件的PK中绝大多数是会通过的,但是在程序中包含特征码那另当别论,杀毒软件立即会报毒。

2. 编译器选项

在VC++里有#pragma code_seg("PAGE")//其中PAGE是区段的名称。这个是免杀中最有用的一个编译器选项,它可以把cpp文件里的代码放到一个单独的区段里,这样在对付杀毒软件的代码查杀的时候,给我们带来了非常大的方便。

3. VC++ 源代码中加入汇编语句

1
2
3
4
5
6
7
__asm
{
nop //汇编指令
nop
nop
nop
}

4. 加花指令

花指令:其实是一段垃圾代码,和一些乱跳转,但并不影响程序的正常运行。加了花指令后,使一些杀毒软件无法正确识别木马程序,从而达到免杀的效果。

加花指令制作过程详解

  • 第一步:配置一个不加壳的木马程序。
  • 第二步:用OD载入这个木马程序,同时记下入口点的内存地址。
  • 第三步:向下拉滚动条,找到零区域(也就是可以插入代码的都是0的空白地方)。并记下零区域的起始内存地址。
  • 第四步:从这个零区域的起始地址开始一句一句的写入我们准备好的花指令代码。
  • 第五步:花指令写完后,在花指令的结束位置加一句:JMP 刚才OD载入时的入口点内存地址。
  • 第六步:保存修改结果后,最后用PEditor这款工具打开这个改过后的木马程序。在入口点处把原来的入口地址改成刚才记下的零区域的起始内存地址,并按应用更改。使更改生效。

加花指令免杀技术总结

优点:通用性非常不错,一般一个木马程序加入花指令后,就可以躲大部分的杀毒软件,不像改特征码,只能躲过某一种杀毒软件。

缺点:这种方法还是不能过具有内存查杀的杀毒软件,比如瑞星内存查杀等。

以后将加花指令与改入口点,加壳,改特征码这几种方法结合起来混合使用效果将非常不错。

加花指令免杀要点

由于黑客网站公布的花指令过不了一段时间就会被杀软辨认出来,所以需要你自己去搜集一些不常用的花指令,另外目前还有几款软件可以自动帮你加花,方便一些不熟悉的朋友,例如花指令添加器等。

阅读全文 »

1.安装flash

从flash官网下载对应的版本的压缩包。(https://www.adobe.com/support/flashplayer/downloads.html)
解压文件,拷贝文件。

1
2
sudo cp libflashplayer.so /usr/lib/mozilla/plugins/
sudo cp -r ./usr/* /usr/

2.安装RVM

1
2
3
4
5
curl -L https://get.rvm.io | bash -s stable
source ~/.rvm/scripts/rvm
rvm install 2.0.0
rvm use 2.0.0
/bin/bash --login

3.安装sublime text 3

1
2
3
sudo add-apt-repository ppa:webupd8team/sublime-text-3
sudo apt-get update
sudo apt-get install sublime-text-installer

4.安装ubuntu-tweak

1
2
3
sudo add-apt-repository ppa:tualatrix/ppa
sudo apt-get update
sudo apt-get install ubuntu-tweak

5.生成ssh密钥

1
2
3
4
5
ssh-keygen -t rsa -C "chaosky.me@gmail.com"
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
sudo apt-get install xclip
xclip -sel clip < ~/.ssh/id_rsa.pub

6.配置VPN

(http://www.iqlinkus.net/help.action)

7.安装zsh

具体配置参考池老师的MacTalk的文章《终极shell》

8.安装Ubuntu Tweak

最新版本下载地址:https://launchpad.net/ubuntu-tweak/+download或使用PPA方式进行安装:

1
2
3
sudo add-apt-repository ppa:tualatrix/ppa
sudo apt-get update
sudo apt-get install ubuntu-tweak

9.安装星际译王

主页:http://stardict-4.sourceforge.net/
终端安装:$ sudo apt-get install stardict
安装词典:http://abloz.com/huzheng/stardict-dic/
下载词典并解压到 ~/.stardict/dic 或 /usr/share/stardict/dic
现在以安装文件名为stardict-zh-en.tar.bz2 的词典为例:

1
2
tar -xjvf stardict-zh-en.tar.bz2
sudo mv stardict-zh-en /usr/share/stardict/dic

注意:stardict-zh-en.tar.bz2是词典文件,stardict-zh-en 是解压出来的词典目录
重新启动stardict,新的词典就会被自动加载了。
安装真人语音库:WyabdcRealPeopleTTS.tar.bz2
sudo tar -xvf WyabdcRealPeopleTTS.tar.bz2 -C /usr/share