共享文件夹、盘会导致系统安全性下降,故IT部门需要搜集公司中每台电脑的共享情况,并且进行上报
WMI查询、Get请求、C++网络库mongoose
1、简单C++语法知识
2、mongoose库的导入
3、C++项目的启动
复制并不能直接使用,需导入mongoose库
完整github项目代码:http://github.com/Canwaiting/check_netshare
修改其中的变量url,app,white_list[],这个项目就是你的了
/*********************************************************
*
* 项目背景:共享文件夹、盘会导致系统安全性下降,故IT部门
* 需要搜集公司中每台电脑的共享情况,并且进行上报
*
*********************************************************/
#include <fstream>
#include <iostream>
#include "mongoose.h"
#define _WIN32_DCOM
#include <iostream>
#include <comdef.h>
#include <Wbemidl.h>
#include <string>
#include <time.h>
#include <sstream>
#include <iomanip>
#pragma comment(lib, "wbemuuid.lib")
#pragma comment( linker, "/subsystem:windows /entry:mainCRTStartup") //静默运行
using namespace std;
string wstring2string(wstring wstr, UINT nCode);
wstring string2wstring(string str);
LPCWSTR string2LPCWSTR(string str);
string WMIQuery(string table, string key);
string GetData();
string UploadData(string data);
string GetDateTime();
static void fn(struct mg_connection* c, int ev, void* ev_data, void* fn_data);
bool IsDefaultShare(string share_name, string share_path);
inline char* ConvertBSTRToString(BSTR pSrc);
//退出标志 用于控制关闭事件循环
static int exit_flag = 0;
//APP版本信息
static const string app = "XXX";
//白名单
static const string white_lists[] =
{
"IPC$",
"ADMIN$",
//"print$" 打印机,暂时不需要
};
//上传数据的地址前缀
static string url = "XXX";
int main(int argc, char** argv)
{
string data;
data = GetData();
//拼接数据,并转成UTF-8
url += data;
wstring wstr = string2wstring(url);
url = wstring2string(wstr, CP_UTF8);
UploadData(url);
//getchar();
return 0;
}
string GetData()
{
stringstream ss;
string date_time = "";
string host_name = "";
string machine_code= "";
string share_lists = "";
string data = "";
date_time = GetDateTime();
host_name = WMIQuery("Win32_ComputerSystem", "Name");
machine_code= WMIQuery("Win32_BIOS","SerialNumber");
share_lists = WMIQuery("win32_share",""); //这个特殊处理
ss << "&APP=" << app
<< "&DateTime=" << date_time
<< "&HostName=" << host_name
<< "&MachineCode=" << machine_code
<< "&ShareLists=" << share_lists;
data = ss.str();
/*
cout << "**********" << endl;
cout << "APP: " << app << endl;
cout << "DateTime: " << date_time << endl;
cout << "HostName: " << host_name << endl;
cout << "MachineCode: " << machine_code<< endl;
cout << "ShareLists: " << share_lists<< endl;
cout << "**********" << endl;
cout << "data: " << data << endl;;
*/
return data;
}
string UploadData(string data)
{
char* s_url = new char[strlen(url.c_str()) + 1];
strcpy(s_url,url.c_str());
struct mg_mgr mgr;
mg_mgr_init(&mgr); // Init manager
mg_http_connect(&mgr, s_url, fn, NULL); // Create client connection
while (exit_flag == 0) {
mg_mgr_poll(&mgr, 1000);
}
mg_mgr_free(&mgr); // Cleanup
string response = ""; //TODO 暂时没有什么要求
return response;
}
string WMIQuery(string table, string key) {
HRESULT hres;
string result = "";
string empty_result = "";
stringstream ss;
// Step 1: --------------------------------------------------
// Initialize COM. ------------------------------------------
hres = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hres))
{
cout << "Failed to initialize COM library. Error code = 0x"
<< hex << hres << endl;
return empty_result; // Program has failed.
}
// Step 2: --------------------------------------------------
// Set general COM security levels --------------------------
hres = CoInitializeSecurity(
NULL,
-1, // COM authentication
NULL, // Authentication services
NULL, // Reserved
RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication
RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation
NULL, // Authentication info
EOAC_NONE, // Additional capabilities
NULL // Reserved
);
if (FAILED(hres))
{
CoUninitialize();
return empty_result; // Program has failed.
}
// Step 3: ---------------------------------------------------
// Obtain the initial locator to WMI -------------------------
IWbemLocator* pLoc = NULL;
hres = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID*)&pLoc);
if (FAILED(hres))
{
CoUninitialize();
return empty_result; // Program has failed.
}
// Step 4: -----------------------------------------------------
// Connect to WMI through the IWbemLocator::ConnectServer method
IWbemServices* pSvc = NULL;
// Connect to the root\cimv2 namespace with
// the current user and obtain pointer pSvc
// to make IWbemServices calls.
hres = pLoc->ConnectServer(
_bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
NULL, // User name. NULL = current user
NULL, // User password. NULL = current
0, // Locale. NULL indicates current
NULL, // Security flags.
0, // Authority (for example, Kerberos)
0, // Context object
&pSvc // pointer to IWbemServices proxy
);
if (FAILED(hres))
{
cout << "Could not connect. Error code = 0x"
<< hex << hres << endl;
pLoc->Release();
CoUninitialize();
return empty_result; // Program has failed.
}
//cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;
// Step 5: --------------------------------------------------
// Set security levels on the proxy -------------------------
hres = CoSetProxyBlanket(
pSvc, // Indicates the proxy to set
RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx
RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx
NULL, // Server principal name
RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx
RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
NULL, // client identity
EOAC_NONE // proxy capabilities
);
if (FAILED(hres))
{
cout << "Could not set proxy blanket. Error code = 0x"
<< hex << hres << endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return empty_result; // Program has failed.
}
// Step 6: --------------------------------------------------
// Use the IWbemServices pointer to make requests of WMI ----
// For example, get the name of the operating system
IEnumWbemClassObject* pEnumerator = NULL;
string sql = "SELECT * FROM " + table;
hres = pSvc->ExecQuery(
bstr_t("WQL"),
bstr_t((wchar_t*) (_bstr_t(sql.c_str()))),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if (FAILED(hres))
{
pSvc->Release();
pLoc->Release();
CoUninitialize();
return empty_result; // Program has failed.
}
// Step 7: -------------------------------------------------
// Get the data from the query in step 6 -------------------
IWbemClassObject* pclsObj = NULL;
ULONG uReturn = 0;
while (pEnumerator)
{
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
&pclsObj, &uReturn);
if (0 == uReturn)
{
break;
}
VARIANT vtProp;
VariantInit(&vtProp);
// Get the value of the Name property
if (key == "") {
hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
string share_name = _com_util::ConvertBSTRToString(vtProp.bstrVal);
hr = pclsObj->Get(L"Path", 0, &vtProp, 0, 0);
string share_path = _com_util::ConvertBSTRToString(vtProp.bstrVal);
if (!IsDefaultShare(share_name, share_path))
{
ss << "\"" << share_name << "\"";
ss << ":";
ss << "\"" << share_path << "\"";
ss << ",";
}
}
else {
hr = pclsObj->Get(string2LPCWSTR(key), 0, &vtProp, 0, 0);
ss << ConvertBSTRToString(vtProp.bstrVal);
//ss << _com_util::ConvertBSTRToString(vtProp.bstrVal);
}
VariantClear(&vtProp);
pclsObj->Release();
}
// Cleanup
// ========
pSvc->Release();
pLoc->Release();
pEnumerator->Release();
CoUninitialize();
result = ss.str();
if (key == "") {
result = result.substr(0, result.length() - 1);
}
return result;
}
LPCWSTR string2LPCWSTR(string str)
{
size_t size = str.length();
int wLen = ::MultiByteToWideChar(CP_UTF8,
0,
str.c_str(),
-1,
NULL,
0);
wchar_t* buffer = new wchar_t[wLen + 1];
memset(buffer, 0, (wLen + 1) * sizeof(wchar_t));
MultiByteToWideChar(CP_ACP, 0, str.c_str(), size, (LPWSTR)buffer, wLen);
return buffer;
}
string GetDateTime()
{
string date_time = "";
time_t nowtime;
time(&nowtime); //获取1970年1月1日0点0分0秒到现在经过的秒数
tm tm_t;
localtime_s(&tm_t, &nowtime); //将秒数转换为本地时间,年从1900算起,需要+1900,月为0-11,所以要+1
stringstream ss;
ss << tm_t.tm_year + 1900
<< setw(2) << setfill('0') << tm_t.tm_mon + 1
<< setw(2) << setfill('0') << tm_t.tm_mday
<< " "
<< setw(2) << setfill('0') << tm_t.tm_hour
<< ":"
<< setw(2) << setfill('0') << tm_t.tm_min
<< ":"
<< setw(2) << setfill('0') << tm_t.tm_sec;
date_time = ss.str();
return date_time;
}
//不上报默认的、在白名单内的共享盘
bool IsDefaultShare(string share_name, string share_path)
{
//1、系统默认共享盘
if (!share_name.empty() && !share_path.empty() && // 非空
share_name[share_name.length() - 1] == '$' && // 共享名最后一个字符一定是$
share_path.length() == 3 && // 资源必须为 X:\ 的格式
share_name.substr(0,share_name.length() - 1) == share_path.substr(0,share_path.length() - 2)) // 盘符名一定要对得上
{
return true;
}
//2、白名单
for (string white_list_item : white_lists)
{
if (share_name == white_list_item)
{
return true;
}
}
return false;
}
static void fn(struct mg_connection* c, int ev, void* ev_data, void* fn_data)
{
char* s_url = new char[strlen(url.c_str()) + 1];
strcpy(s_url,url.c_str());
if (ev == MG_EV_CONNECT) {
struct mg_str host = mg_url_host(s_url);
// Send request
mg_printf(c,
"GET %s HTTP/1.0\r\n"
"Host: %.*s\r\n"
"\r\n",
mg_url_uri(s_url), (int)host.len, host.ptr);
} if (ev == MG_EV_HTTP_MSG) {
struct mg_http_message* hm = (struct mg_http_message*)ev_data;
exit_flag = 1;
}
}
//重新实现_com_util的ConvertBSTRToString
inline char* ConvertBSTRToString(BSTR pSrc)
{
//if (!pSrc) return NULL; 原本返回空会导致空指针异常
if (!pSrc)
{
char* szOut = new char[1];
szOut[0] = '\0';
return szOut;
}
DWORD cb, cwch = ::SysStringLen(pSrc);
char* szOut = NULL;
if (cb = ::WideCharToMultiByte(CP_ACP, 0,
pSrc, cwch + 1, NULL, 0, 0, 0))
{
szOut = new char[cb];
if (szOut)
{
szOut[cb - 1] = '\0';
if (!::WideCharToMultiByte(CP_ACP, 0,
pSrc, cwch + 1, szOut, cb, 0, 0))
{
delete[]szOut;//clean up if failed;
szOut = NULL;
}
}
}
return szOut;
};
wstring string2wstring(string str)
{
wstring result;
//获取缓冲区大小,并申请空间,缓冲区大小按字符计算
int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), NULL, 0);
TCHAR* buffer = new TCHAR[len + 1];
//多字节编码转换成宽字节编码
MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), buffer, len);
buffer[len] = '\0'; //添加字符串结尾
//删除缓冲区并返回值
result.append(buffer);
delete[] buffer;
return result;
}
string wstring2string(wstring wstr, UINT nCode)
{
string result;
//获取缓冲区大小,并申请空间,缓冲区大小事按字节计算的
int len = WideCharToMultiByte(nCode, 0, wstr.c_str(), wstr.size(), NULL, 0, NULL, NULL);
char* buffer = new char[len + 1];
//宽字节编码转换成多字节编码
WideCharToMultiByte(nCode, 0, wstr.c_str(), wstr.size(), buffer, len, NULL, NULL);
buffer[len] = '\0';
//删除缓冲区并返回值
result.append(buffer);
delete[] buffer;
return result;
}
本来是用C#写的,但是打出来的包几十M,不符合要求;还是得用回C++,各种轮子都要自己造,还得转字符;差点就完不成了 : )
http://www.jb51.net/softjc/2124_2.html
http://mongoose.ws/documentation/tutorials/http-client/
http://blog.csdn.net/hanxiaoyong_/article/details/123494927
http://github.com/tashaxing/cpphttpdemo
大家好,又见面了,我是你们的朋友全栈君。BigDecimal是java小数操作的一个专有类,在电商、金融行业存储跟金额有关的字段java里面明明已经有了,float,double这种精度的小数,为什么还需要BigDecimal呢?这难道不是多余吗?接下来看一个例子:1@Test2publicvoidtestDoubleSimple(){3doublea=3;4doubleb=10;5doublec=a/b;6System.out.println(c);7}控制台输出:0.3在小数操作中,我们通常希望能有多种自由的定义方式。例如在不同的场景可能需要返回:0.3,0.4,0.333不同精度,在不同的精度进位时希望能自主控制这个时候,就轮到BigDecimal出场了加减乘除首先来一段最简单的加减乘除1@Test2publicvoidtestDecimalSimple(){3BigDecimala=newBigDecimal(5);4BigDecimalb=newBigDecimal(40);5BigDecimaladd=a.add(b);6BigDecimalsubtract=a.subtr
[root@master~]#kubectlgetnodes 查看集群节点 NAME STATUS AGE node1 Ready 25m node2 Ready 19m [root@master~]#kubectlversion 查看版本 ClientVersion:version.Info{Major:"1",Minor:"5",GitVersion:"v1.5.2",GitCommit:"269f928217957e7126dc87e6adfa82242bfe5b1e",GitTreeState:"clean",BuildDate:"2017-07-03T15:31:10Z",GoVersion:"go1.7.4",Compiler:"gc",Platform:"linux/amd64"} ServerVersion:version.Info{Major:"1",Min
个人篇 1、请尝试用三个关键词介绍自己开源互助——积极热情地在开源社区为用户提供帮助与支持;拥抱变化——不断学习新事物,接受新挑战;程序媛——每天做着自己喜欢的编程工作。2、用一句话介绍自己要分享的内容结合AI技术与开源向量数据库Milvus,可以轻松实现音视频的分析与推荐。3、Zilliz公司的Milvus作为开源领域的一个明星产品,你认为最大的优势是什么?简单易用。Milvus提供Docker部署和多种API,让用户以最小的成本快速搭建自己的最小化产品。技术篇1、音视频领域随着技术的发展,有没有出现一些「内卷」的现象?有的话是什么?目前很多领域都开始做视频,从最早的娱乐和教育,到电商和技术直播,那么不同的领域又会有不同的需求,就需要设计不同的系统来适配,出现了越来越多的音视频平台进行竞争。2、你认为现阶段音视频技术最核心的问题是什么?音视频数据每时每刻都在生成,核心问题就在于如何实时处理这些庞大的数据。3、对于未来音视频技术的应用,你会有哪些期待?希望未来的音视频处理可以更加智能,比如推荐、语音处理等更加个性化。行业篇1、能否谈一下你对开源的理解?开源需要更多利他主义,把自己
群晖提供的套件给了我们很多便利的操作,本篇文章介绍的主要是DownloadStation与CloudSync套件的结合,实现自动下载,自动上传网盘的功能。同时,这也是目前爱动漫的解决方案。因为群晖面向的是大众,自然就是要把许多繁杂的设置简化,比如说比较实用的Docker,KVM都有相关的GUI界面。本篇教程也因为这种便捷化的设计变得非常简单。DownloadStation设置DownloadStation的功能主要负责定时从RSS订阅列表中抓取新的下载链接完成下载,既然时基于RSS订阅,我们自然需要订阅地址,很多资源站都提供了RSS订阅功能。就拿我使用的bangumi来说,只需要选择合适的关键词,就可以生成RSS地址。 TIM截图20190718080722.png我们将生成的地址,添加至RSS订阅中,并勾选自动下载,选择要下载到的目标文件夹。TIM截图20190718080950.png同时,在设置中可以设置定时抓取的间隔时长,个人认为间隔30分钟至2小时是比较合适的范围。CloudSync设置CloudSync支持多达几十种网盘的同步设置,设置同样非常简单。 TIM截图201907
C++结构体概述C++提供了许多种基本的数据类型,但是由于程序需要处理的问题往往比较复杂,而且呈多样化,已有的数据类型显得不能满足使用要求。因此C++允许程序员根据需要自己声明一些类型,程序员可以自己声明的类型有结构体类型、共用体类型、枚举类型、类类型等,这些都是程序员可以自己定义的类型。在一个组合项中包含若干个类型不同的数据项,C语言和C++都允许程序员自己指定这样一种数据类型,它称为结构体。C++声明一个结构体类型的一般形式为: struct 结构体类型名 {成员表列};复制在声明一个结构体类型时必须对各成员都进行类型声明,类型名成员名;复制每一个成员也称为结构体中的一个域,成员表列又称为域表,成员名的定名规则与变量名的定名规则相同。 声明结构体类型的位置一般在文件的开头,在所有函数之前,以便本文件中所有的函数都能利用它来定义变量,也可以在函数中声明结构体类型。在C语言中,结构体的成员只能是数据,C++在此基础上进行了扩充,结构体的成员既可以包括数据,又可以包括函数,以适应面向对象的程序设计。但是由于C++提供了类类型,一般情况下,不使用带函数的结构体。经典案例:C++使用结构体变
作者介绍:NickCameron,PingCAP研发工程师,Rust语言核心成员。感谢Rust语言中文社区伙伴们的翻译和审校:翻译:尚卓燃undefined审校:吴聪、张汉东过去几周,我一直在用Go语言编写程序。这是我首次在大型且重要的项目中使用Go。在研究Rust的特性时,我也看了很多关于Go的内容,包括体验示例和编写玩具程序。但真正用它编程又是一种完全不同的体验。我觉得把这次体验写下来应该会很有趣。在这篇文章中,我会尽量避免将Go与Rust进行过多的比较,不过,由于我是从Rust转向Go,难免也会包含一些比较。应该事先声明的是,我更偏袒Rust,但会尽力做到客观。总体印象用Go编程的感觉很棒。库程序里有我想要的一切,总体实现较为完善。学习体验也十分顺畅,不得不说,Go是一种经过精心设计的实用性语言。举个例子:一旦你知悉了Go的语法,就能将其他语言中惯用法延续到Go中。只要你学会一些Go,就可以相对轻易地推测Go语言的其他特性。凭借一些来自其他语言的知识,我能够阅读并理解Go代码,而不需要过多的搜索(Google)。与C/C++、Java、Python等相比,Go并没有那么多痛点,而
理解一个Thread只有一个Looper,每个Looper都有它对应的MessageQueue。 多个Handler可以向MessageQueue发送Message或Runnable。Looper依次处理MessageQueue中的Message(或Runnable),将Message发送给相应的Handler处理。 Looperhttps://developer.android.com/reference/android/os/Looper.html理解用的关系图该教程中的 http://www.runoob.com/wp-content/uploads/2015/07/25345060.jpg新建的Thread中,Handler的基本用法classLooperThreadextendsThread{ publicHandlermHandler; publicvoidrun(){ Looper.prepare(); mHandler=newHandler(){ publicvoidhandleMessage(Messagemsg){ //processincomingmessag
选自SIGIR2018作者:RocioCañamares、PabloCastells机器之心编译参与:刘晓坤、思源、李泽南ACM国际信息检索研究与发展会议SIGIR2018近日于美国密歇根州AnnArbor举行。昨日,大会公布了最佳论文等奖项,来自马德里自治大学(UniversidadAutónomadeMadrid)的学者RocioCañamares和PabloCastells的论文《ShouldIFollowtheCrowd?AProbabilisticAnalysisoftheEffectivenessofPopularityinRecommenderSystems》获得了最佳论文奖,微软与马萨诸塞大学阿姆赫斯特分校合作论文《Cross-DomainRegularizationforNeuralRankingModelsUsingAdversarialLearning》获得最佳短论文奖。本文将对最佳论文进行简要介绍。引言 使用IR方法论和指标用于推荐系统的评估在近年来发展迅速,已成为该领域中的常用实践方法,其将理解推荐看成排序任务[14]。然而IR指标已被发现在推荐受欢迎条目(即
选文:Shawn 翻译:Cody(姜咏耀) 校对:钟云岚 摘自:http://www.cio.com在最新发布的2016分析趋势报告中,德勤预测了六个将在2016年改变商业的主要趋势。德勤的JohnLucker表示,对于持续面临各式机遇和挑战的商界领袖来说,提前看到这些趋势能够对公司的运营产生深远的影响。许多公司选择对他们的运营模式做一个战略性的转变来应对如网络安全这样侵略性的问题。同时,作为一个日益凸显的问题,数据分析人才的缺乏也成为公司发展的一大障碍。然而有一点是肯定的:有效地利用数据分析能力对于帮助公司进一步的增长和创新至关重要。◆◆◆网络安全:进攻是最好的防御网络安全一词在德勤的趋势列表中已经不是第一次出现了,它从去年就开始被提及。“市场中正在发生一个改变。”Lucker认为。他引用了一个IDC的发现——去年,全球金融服务行业在信息安全上花费近274亿美元。这些机构不再满足于传统的被动式的安全模式,而是开始采用预测性的方法威胁情报和监控代替之。这些方法包括自动扫描可能威胁机构安全的聊天记录,和通过分析过去的实施来构建能够预测未来威胁的数学模型。随着网络安全和分析的出现,相比于被
Description 考虑正整数集合,现在有n组人依次来取数,假设第i组来了x人,他们每个取的数一定是x的倍数,并且是还剩下的最小的x个。 正整数中有m个数被标成了幸运数,问有哪些人取到了幸运数。Input 第一行一个正整数m(m<=1,000,000),下面m行每行一个正整数x(x<=1,000,000),表示x是一个幸运数。 接下来一行一个正整数n(n<=1,000,000),下面n行每行一个正整数x(x<=1,000,000),表示这一组来了x个人。Output第一行输出一个非负整数k,表示k个人取到了幸运数,下面k行依次表示取到幸运数的人的编号,人按照来的顺序从1开始编号。SampleInput4 1 6 8 16 3 4 2 4 SampleOutput3 2 4 6 HINT Hint 总共来了10个人,他们取走的数依次是4812162620242832。 第2、4、6个人取到的是幸运数8、16、6。(别把这题想太难,其实很水的)Source鸣谢Oimaster我真傻,真的。单知道这题是个大暴力就不用花半个小时去推式子。。。还是太菜了QWQ
导读:本文主要分析了云计算产业背景以及所处阶段;国内外云计算产业的发展现状与趋势;云计算产业当前的市场环境;云计算产业的技术特点与产品发展方向;云计算产业链各环节发展现状与趋势;云计算的主要应用领域及需求状况;云计算市场的主要领先企业经营情况;云计算产业未来的发展前景与投资机会;同时,佐之以全行业近年来全面详实的一手连续性市场数据,让您全面、准确地把握整个云计算产业的市场走向和发展趋势。1云计算产业细分市场发展现状与趋势分析公共云市场分析 (一)公共云市场规模分析(1)全球公共云市场规模分析2015年,以IaaS、PaaS和SaaS为代表的典型云服务市场达到了1750亿美元,增长率约15%。根据预测,2016年全球公共云市场将达到2040亿美元,公共云仍将快速增长,在2021年达到3820亿美元。(2)国内公共云市场规模分析2014年,IaaS服务已经得到国内企业用户的充分认可,成为游戏、视频、移动互联网等领域中小企业IT资源建设的首选,市场规模达到26.2亿元人民币,与2013年相比增长149%,据估算2015年仍保持较高的增速。(二)公共云市场认知水平《2015年中国公共云服务发展
本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法、类方法、属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程 经典类vs新式类 把下面代码用python2和python3都执行一下 1#_*_coding:utf-8_*_ 2 3 4classA: 5def__init__(self): 6self.n='A' 7 8classB(A): 9#def__init__(self): 10#self.n='B' 11pass 12 13classC(A): 14def__init__(self): 15self.n='C' 16 17classD(B,C): 18#def__init__(self): 19#self.n='D' 20pass 21 22obj=D() 23 24print(obj.n)复制 ViewCode classicalvsnewstyle: 经典类:深度优先 新式类:广度优先 super()用法 抽象接口 1importabc 2 3classAlert(obj
1.最重要的参考资料 官方的https://github.com/apache/hadoop/blob/trunk/BUILDING.txt 2.编译环境 Linux系统:Centos7.2 Jdk版本:jdk1.8 cmake版本:3.19 Hadoop版本:3.1.2 Maven版本:3.6.3 Protobuf版本:2.5 编译工具准备 a.安装依赖 yum-yinstallkernel-develgcc*glibc-headersgcc-c++zip-developenssl-develgitncurses-devellzo-develautoconflibtoolautomake 复制 b.java和maven环境 java和maven环境用到的太普遍了,这个就不重复了 c.安装protobuf 可以先查看yum上的版本 2.5.0正是所需要的,而不是官方里说的3.x,为什么呢? 直接 yuminstall-yprotobufx复制 下面是一段踩坑经历(可以跳过) 自己安装时,以为yum没有protobufx,
功能作用:将px像素自动转化为rem。 首先安装postcss-pxtorem。 1npminstallpostcss-pxtorem-D复制 新建一个postcss.config.js文件配置。 1module.exports={ 2plugins:{ 3//兼容浏览器,添加前缀 4autoprefixer:{ 5overrideBrowserslist:[ 6"Android4.1", 7"iOS7.1", 8"Chrome>31", 9"ff>31", 10"ie>=8", 11"last10versions",//所有主流浏览器最近10版本用 12], 13grid:true, 14}, 15"postcss-pxtorem":{ 16rootValue:16,//结果为:设计稿元素尺寸/16,比如元素宽320px,最终页面会换算成20rem 17propList:["*"],//是一个存储哪些将被转换的属性列表,这里设置为['*']全部,假设需要仅对边框进行设置,可以写['*','!border*'] 18unitPrecision:5,//保留rem
数组名和指针不一样的点,数组名是常量,不可用于arrayname=arrayname+1运算。 数组名sizeof返回数组长度,指针返回本身长度。 数组名默认是指向第一个指针,&arrayName是整个数组类型的指针,地址一样,但是+1运算,一个跨度是数组包含的类型,一个是整个数组的长度。 new创建在堆或自由存储区中,其他在栈。short(*p)[20] 类型为整个数组的指针, short*p[20]类型short的指针数组。 三种管理数据内存方式:自动存储、静态存储、动态存储、线程存储(c++11) 自动存储:函数里定义的常规变量,函数结束时,消除。 放在栈上 静态存储:整个程序执行期间都存在。函数外定义或者使用static可以实现该存储 动态存储:new创建delete删除 生命周期不受函数控制 c++11提供了auto关键字,避免复杂的指针创建如**p=x 直接autop=x 模板类vector 内部使用了new和delete进行管理,但是是自动的。 vector&l
C#位数不足补零:inti=10;方法1:Console.WriteLine(i.ToString("D5"));方法2:Console.WriteLine(i.ToString().PadLeft(5,'0'));//推荐方法3:Console.WriteLine(i.ToString("00000")); 在C#中可以对字符串使用PadLeft和PadRight进行轻松地补位。 PadLeft(inttotalWidth,charpaddingChar)//在字符串左边用paddingChar补足totalWidth长度PadLeft(inttotalWidth,charpaddingChar)//在字符串右边用paddingChar补足totalWidth长度示例:h=h.PadLeft(2,'0');注意第二个参数为char类型,所以用单引号,也可以用Convert.ToChar(stringvalue)把字符串转换成char类型。如果字符串长度大于1,则使用str.ToCharArray()[index]。