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
上说明如下:
CTabCtrl
1. 在对话框编辑区内,添加一个Tab Control
控件到资源模板里面,设置它的控制ID
2. 使用添加成员变量向导,为控件添加一个CTabCtrl
类型的成员变量,你可以使用这个变量调用CTabCtrl
的成员函数
3. 对话框类的映射处理功能可以处理任何你需要处理的标签控件消息。有关更多信息,请参阅消息映射函数。
4. 在OnInitDialog()
函数里面,设置CTabCtrl
的风格。
CTabCtrl
1. 定义在视图或窗口类的控件。
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 |
开发web页面时,经常要进行浏览器适配,浏览器的判断依据就是 userAgent
而navigator.userAgent字段是只读的
chrome浏览器提供了强大的调试工具,同时也提供了修改userAgent的功能。
在涂红处添加自己的userAgent,reload页面就可以了。
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鼠标,是无法正常使用的。