IPFire内网网卡地址一旦设置完成后,在Web控制的主界面中,是找不到修改的地方的,因此,只能在命令行中重新调用设置命令来重新配置。
在Web页面中开启SSH Access,以支持Shell进行控制


在Shell的登陆界面中输入setup界面,唤出设置界面:

接下来,就是一步步的设置了

IPFire内网网卡地址一旦设置完成后,在Web控制的主界面中,是找不到修改的地方的,因此,只能在命令行中重新调用设置命令来重新配置。
在Web页面中开启SSH Access,以支持Shell进行控制


在Shell的登陆界面中输入setup界面,唤出设置界面:

接下来,就是一步步的设置了

IPFire是Linux源代码建立的防火墙,并且还带有大量的附加功能。它易于设置和管理。它采用的状态检测防火墙,内容过滤引擎,通信质量控制(QoS),VPN技术,和大量的记录。IPFire是基于模块化设计具有高度的灵活性,最重要它是开源的并且基于状态检测的防火墙。你可以到http://www.ipfire.org/downloads下载安装镜像。
一.下面是用Virtual Box虚拟机安装过程,首先新建一个虚拟机
二.选择下载好的镜像文件
2.1在这里需要注意,安装IPFire至少要有两张网卡 ,分别绑定到两个个区域(下面会讲到)


三.运行虚拟机,进入安装画面,键入Enter继续
四.选择安装语言,没有中文 = = 


五.选择安装到哪些硬盘,确定是否进行分区

六.选择文件系统,默认ext4即可。
七.安装完成Reboot
八.重启进行选择界面 
九.对IPFire进行初始化(键盘,时区,主机名,系统密码,web管理密码,安全区域等)
9.1 键盘布局

9.2 时区选择

9.3 主机名设置

9.4 域名称设置

9.5 系统密码设置(root)

9.6 Web管理密码设置(admin)

9.7 安全区域设置


IPFire把网络分为不同的颜色代表一个共同的计算机的安全等级:
9.8 将两张网卡关联到两个安全区域上


9.9 分别设置两个区域的IP地址


9.10 RED区域就是所谓的外网,可以用三种方式(静态,DHCP, PPPOE),此处的外网,我们直接使用DHCP来分配即可。


9.11 设置DNS和网关地址


9.12 最后是否为内网启用DHCP功能

十. 完成后,用浏览器访问https://green接口地址:444,用admin帐号登陆.Red网卡的地址是不能通过外网来访问的。

| PathRemoveArgs | 去除路径的参数 |
| PathRemoveBackslash | 去除路径最后的反斜杠"\" |
| PathAddBackslash | 在路径最后加上反斜杠"\" |
| PathRemoveBlanks | 去除路径前后的空格 |
| PathAddExtension | 在文件路径后面加上扩展名 |
| PathRemoveExtension | 去除文件路径扩展名 |
| PathRenameExtension | 更改文件路径扩展名 |
| PathRemoveFileSpec | 去除文件名,得到目录 |
| PathUnquoteSpaces | 去除路径中的首尾空格 |
| PathQuoteSpaces | 判断路径中是否有空格,有的话,就是用""引号把整个路径包含起来 |
| PathAppend | 将一个路径追加到另一个路径后面 |
| PathCombine | 合并两个路径 |
| PathSkipRoot | 去掉路径中的磁盘符或UNC部分。 |
| PathStripPath | 去掉路径中的目录部分,得到文件名。 |
| PathStripToRoot | 去掉路径的文件部分,得到根目录。 |
| |
|
| PathCompactPath | 根据像素值生成符合长度的路径。如原始路径:C:\path1\path2\sample.txt 根据120像素截断后为:C:\pat...\sample.txt 根据25像素截断后为: ...\sample.txt |
| PathCompactPathEx | 根据字符个数来生成符合长度的路径。 |
| |
|
| PathSetDlgItemPath | 将路径数据设置到对话框的子控件上。 |
| PathUndecorate | 去除路径中的修饰——具体还没看明白,的例子只是去掉了括号。 |
| PathUnExpandEnvStrings | 将路径中部分数据替换为系统环境变量格式 |
| PathFindOnPath | 从路径中查找路径 |
| PathFindExtension | 查找路径的扩展名 |
| PathFindFileName | 获取路径的文件名 |
| PathFindNextComponent | 查找匹配路径(不太熟悉) |
| PathFindSuffixArray | 查找给定的文件名是否有给定的后缀。 |
| PathGetArgs | 获取路径参数 |
| PathGetCharType | 获取路径字符类型 |
| PathGetDriveNumber | 根据逻辑盘符返回驱动器序号 |
| PathRelativePathTo | 创建一个路径到另一个路径的相对路径。 |
| PathResolve | 将一个相对路径或绝对路径转换为一个合格的路径,这个理解起来比较拗口。 |
| PathCanonicalize | 规范化路径。将格式比较乱的路径整理成规范的路径格式。 |
| PathBuildRoot | 根据给定的磁盘序号创建根目录路径 |
| CreateDirectory | 创建目录 |
| |
|
| GetShortPathName | 将长路径转为8.3格式的短路径格式 |
| GetLongPathName | 将短路径格式转为长路径。 |
| PathGetShortPath | 将长路径转为短路径格式(8.3格式) |
| PathCreateFromUrl | 将URL路径转为MS-DOS格式 |
| PathMakePretty | 把路径全部转为小写,增加可读性。 |
| PathMakeSystemFolder | 给路径增加系统属性 |
| PathUnmakeSystemFolder | 去除路径中的系统属性。 |
| PathMakeUniqueName | 从模板创建统一的路径格式——没用过,不熟悉 |
| PathProcessCommand | 生成一个可执行的路径,比如有参数的,会自动将路径用""包含。这在ShellExecute中比较有用。 |
| PathCleanupSpec | 去除路径中不合法的字符 |
| PathCommonPrefix | 比较并提取两个路径相同的前缀 |
| PathFileExists | 验证路径是否存在 |
| PathMatchSpec | 判断路径是否匹配制定的扩展名。 |
| PathIsDirectory | 判断路径是否是一个有效的目录 |
| PathIsFileSpec | 验证路径是否一个文件名(有可能是一个路径) |
| PathIsExe | 验证路径是否是可执行文件。注意:不仅仅是.exe,还有.bat,.com,.src等 |
| PathIsRoot | 路径是否为根路径 |
| PathIsRelative | 判断路径是否是相对路径 |
| PathIsContentType | 检测文件是否为制定类型。 例如:PathIsContentType("hello.txt", "text/plain") 返回TRUE PathIsContentType("hello.txt", "image/gif") 返回FALSE |
| PathIsHTMLFile | 判断路径是否是html文件类型——根据系统注册类型判断。 |
| PathIsLFNFileSpec | 判断路径是否是长路径格式 |
| PathIsNetworkPath | 判断路径是否是一个网络路径。 |
| PathIsPrefix | 判断路径是否含有指定前缀 |
| PathIsSameRoot | 判断路径是否有相同根目录 |
| PathIsSlow | 判断路径是否是一个高度延迟的网络连接——我也不太明白是啥意思。 |
| PathIsSystemFolder | 判断路径是否有系统属性(属性可以自己设定) |
| PathIsUNC | 路径是否是UNC格式(网络路径) |
| PathIsUNCServer | 路径是否是UNC服务器 |
| PathIsUNCServerShare | 路径是否仅仅是UNC的共享路径格式 |
| PathIsURL | 路径是否是http格式。 |
| PathYetAnotherMakeUnique |
基于已存在的文件,自动创建一个唯一的文件名。比较有用,比如存在"新建文件",此函数会创建文件名"新建文件(2)"。 |
系统环境:Windows 7
软件环境:Visual Studio 2015 Udpate 2
本次目的:在模态或非模态对话框中使用Tab Control控件,及引申在单/多文档中使用
查阅MSDN文档,对于创建Tab Control控件,MSDN上说明如下:
CTabCtrl1. 在对话框编辑区内,添加一个Tab Control控件到资源模板里面,设置它的控制ID
2. 使用添加成员变量向导,为控件添加一个CTabCtrl类型的成员变量,你可以使用这个变量调用CTabCtrl的成员函数
3. 对话框类的映射处理功能可以处理任何你需要处理的标签控件消息。有关更多信息,请参阅消息映射函数。
4. 在OnInitDialog()函数里面,设置CTabCtrl的风格。
CTabCtrl1. 定义在视图或窗口类的控件。
2. 调用控件的创建成员函数,可能在OnInitialUpdate中,可能在父窗口的OnCreate处理函数早期(如果你是子类的控件)。设置控件的风格。
下面介绍在对话框中添加Tab Control控件,工程不一定是要MFC基于对话框形式,单文档视图类派生自 CFormView的工程也行,或是任何工程弹出的对话框 ( 如登录界面等等 ) 都行 ( 个人没有都去实验,但理论上应该可以,看了下面就知道。 )
1. 首先在对话框资源上添加一个Tab Control控件ID为IDC_LOGIN_TAB,根据需要修改其属性,然后为其添加成员变量m_tab,类型为CTabCtrl
2. 需要几个选项卡,则在对话框资源添加几个对话框,在这里我添加两个选项卡,则要添加两个对话框,其ID分别为 IDD_TAB1_DIALOG,IDD_TAB2_DIALOG它们的属性style为Child,Border为None,其他的再根据自己调整。然后分别为其添加对应的基于CDialog类 CLoginTab1,CLoginTab2
3. 在主对话框添加子对话框头文件,然后再添加三个成员变量,为子对话框添加实例。在OnInitDialog()函数初始化Tab Control控件显示,若对话框没有OnInitDialog()函数,则重载这个函数,具体如下:
//主对话框头文件
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class LoginUser : public CDialog { ... protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 virtual BOOL OnInitDialog(); //没有这个,则在这里重载 DECLARE_MESSAGE_MAP() public: CTabCtrl m_tab; CLoginTab1 m_login_tab1; CLoginTab2 m_login_tab2; ... } |
//主对话框实现文件
|
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 |
BOOL LoginUser::OnInitDialog() { CDialog::OnInitDialog(); m_tab.InsertItem(0,_T("系统登录")); m_tab.InsertItem(1,_T("服务器设置")); m_login_tab1.Create(IDD_TAB1_DIALOG,GetDlgItem(IDC_LOGIN_TAB)); m_login_tab2.Create(IDD_TAB2_DIALOG,GetDlgItem(IDC_LOGIN_TAB)); //获得IDC_TABTEST客户区大小 CRect rs; m_tab.GetClientRect(&rs); //调整子对话框在父窗口中的位置,根据实际修改 rs.top+=25; rs.bottom-=60; rs.left+=1; rs.right-=10; //设置子对话框尺寸并移动到指定位置 m_login_tab1.MoveWindow(&rs); m_login_tab2.MoveWindow(&rs); //分别设置隐藏和显示 m_login_tab1.ShowWindow(true); m_login_tab2.ShowWindow(false); //设置默认的选项卡 m_tab.SetCurSel(0); return TRUE; } |
4. 响应选项卡切换事件消息,右键Tab Control控件,添加事件处理程序,选择TCN_SELCHANGE事件,在弹出的编辑区域,填入以下代码:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
void LoginUser::OnTcnSelchangeLoginTab(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: 在此添加控件通知处理程序代码 int CurSel = m_tab.GetCurSel(); switch(CurSel) { case 0: m_login_tab1.ShowWindow(true); m_login_tab2.ShowWindow(false); break; case 1: m_login_tab1.ShowWindow(false); m_login_tab2.ShowWindow(true); break; default: ; } *pResult = 0; } |
5. 编译运行。

接下来,来看看非模态对话框的实现,因为Tab Control控件要在对话框的OnInitDialog()函数初始化,而MSDN上说:
非模态对话框是在Create的时候一起调用初始化函数的,OnInitDialog()我们仍可以重载这个函数,来实现以上功能。对于单文档/多文档可以看前面的MSDN说明,这里不再详细写。本文若有错误,请指出。
目前测试,在Windows 7命令行调用Android截图命令screencap的时候,只能是如此操作才可以
|
1 2 3 |
$ adb shell screencap -p /sdcard/screen.png $ adb pull /sdcard/screen.png $ adb shell rm /sdcard/screen.png |
Android Studio 2.1.2在引用AAR的时候,如果AAR中包含armeabi-v7a版本的.so文件,而我们自带的.so又仅仅包含armeabi版本的,会导致我们的APK在运行的时候崩溃,报告找不到.so文件,另外就是会增大我们最后的APK的大小,因此我们需要排除armeabi-v7a目录下的.so文件.
操作方法如下:
|
1 2 3 4 5 6 7 8 9 |
android { .... defaultConfig { .... ndk { abiFilters "armeabi" } } } |
这个方法的本质是通过强制指定abi的方式来要求Android Studio排除其他系统版本的.so文件。
同样道理,可以用来在32位的APK中排除64位的.so文件,减少APK大小。
迅雷BT任务提示"任务出错",鼠标放到"任务出错"标签上,提示"任务信息请求失败"。如下图所示:

点击任务向右的箭头之后,点击"连接情况"标签,可以看到如下的内容,尤其是红色的"查询BT资源信息失败(文件编号:1)",如下图:

这个信息说明,在BT文件中的第2个文件信息无法正常查询到,文件的编号是从0开始的。
此时,我们点击"文件列表"标签,去查看一下第2个文件,可以看到,仅仅是个没有太大意义的"RARGB.com.txt",如下图:

此时,我们去掉对于"RARGB.com.txt"的下载即可解决问题,如下图:

然后再次重新开始任务,会发现,任务已经可以正常开始了。


Android Studio 2.1.2版本已经集成了JaCoCo用来进行代码覆盖的计算,严格上来说,这个功能并不是Android Studio实现的,而是IntelliJ IDEA早就实现的功能。
全部需要做的仅仅是在build.gradle中增加testCoverageEnabled = true即可,如下图:

然后,在命令行中执行
|
1 |
$ gradlew test createDebugCoverageReport |
即可在每个子项目的build\reports\coverage\debug\下面会生成代码覆盖率的统计文件。点击index.html即可查看代码覆盖情况,目前看到的情况是,貌似只能统计到test目录下覆盖到的代码,而无法统计androidTest目录下的测试代码的覆盖情况。
从目前的测试来看只能通过R159805这个应用来开启蓝牙,但是最新的Windows 10,系统版本 1511,OS版本10586.420的系统上面,只能开启蓝牙,安装的驱动属于Windows通用驱动,因此尽管可以看到蓝牙,却不能正常使用,比如罗技M336鼠标,是无法正常使用的。
Thunderbird使用时间长了之后,我是差不多两年多点了,打开提示“文件夹 收件箱 已满,无法保存更多消息。请删除旧邮件、不需要的邮件或者压缩文件夹来保存其他消息。”,如下图:

根据Thunderbird的中文帮助文档,可以看到如下内容:
这个实际上是属于Thunderbird文件存储系统的策略问题,尽管文件系统可以处理超过4GB的文件。但是为了兼容一些古老的系统,导致即使是到了目前的版本,依旧无法处理超过4GB的文件。
目前Thunderbird一直是32位的应用,没有出64位的版本,尽管可以使用64位的API访问文件系统,但是还是默认保留了4GB的限制。
网上的删除全部的.msf的方法,只是能解决邮件发生过删除,而实际占有的空间没有释放,因而可以通过重建索引文件的方式,来缓解问题,但是如果从来没有删除过邮件,邮件实际占有的空间已经真实超过4GB的情况下,那么这些方法实际上是无效的。
正确的做法是Ctrl+A选中全部的邮件,然后右击,出现的菜单中选择"归档",即可。这样操作的实质,其实是使用子文件夹的方式突破单个文件夹4GB的限制。

归档完成后,Thunderbird会提示是否压缩收件箱来节省空间,此时,一定要允许,否则收件箱的大小不会发生变化,如果此时没有点击许可,也可以手工在收件箱上面右击,弹出的菜单中选择压缩。