海康工業相機驅動

1.新建基于對話框的MFC程序,界面布局如下

2.修改控件ID,為控件綁定變量

3.創建全局變量,構造函數中初始化變量,初始化對話框界面,補齊各控件按鈕響應函數

全文程序如下:


// MFC_GrabimageDlg.h : 頭文件
//#pragma once
#include"MvCameraControl.h"
#include "afxwin.h"// CMFC_GrabimageDlg 對話框
class CMFC_GrabimageDlg : public CDialogEx
{
// 構造
public:CMFC_GrabimageDlg(CWnd* pParent = NULL);	// 標準構造函數~CMFC_GrabimageDlg();	// 
// 對話框數據enum { IDD = IDD_MFC_GRABIMAGE_DIALOG };protected:virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持// 實現
protected:HICON m_hIcon;// 生成的消息映射函數virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()public:void* handle;//用于存放相機句柄MV_SAVE_IAMGE_TYPE m_enSaveImageType;//用于存儲保存圖片的類型MV_DISPLAY_FRAME_INFO stDisplayInfo;//原始數據轉換int m_imagenum;//圖像采集的幀號afx_msg void OnBnClickedButtonOpen();afx_msg void OnBnClickedButtonClose();afx_msg void OnBnClickedButtonGrabimage();CStatic m_picture;//PictureCtrl控件變量afx_msg void OnBnClickedButtonSave();afx_msg void OnBnClickedRadioBmp();afx_msg void OnBnClickedRadioIpg();afx_msg void OnBnClickedRadioPng();afx_msg void OnBnClickedRadioTif();
};
// MFC_GrabimageDlg.cpp : 實現文件
//#include "stdafx.h"
#include "MFC_Grabimage.h"
#include "MFC_GrabimageDlg.h"
#include "afxdialogex.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif// 用于應用程序“關于”菜單項的 CAboutDlg 對話框class CAboutDlg : public CDialogEx
{
public:CAboutDlg();// 對話框數據enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 實現
protected:DECLARE_MESSAGE_MAP()
};CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()// CMFC_GrabimageDlg 對話框CMFC_GrabimageDlg::CMFC_GrabimageDlg(CWnd* pParent /*=NULL*/): CDialogEx(CMFC_GrabimageDlg::IDD, pParent)
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);handle = NULL;m_enSaveImageType = MV_Image_Bmp;//先默認為bmp格式,后續添加單選按鈕來獲取,保存的圖像類型格式
}void CMFC_GrabimageDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_PICTURE, m_picture);
}BEGIN_MESSAGE_MAP(CMFC_GrabimageDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON_OPEN, &CMFC_GrabimageDlg::OnBnClickedButtonOpen)ON_BN_CLICKED(IDC_BUTTON_CLOSE, &CMFC_GrabimageDlg::OnBnClickedButtonClose)ON_BN_CLICKED(IDC_BUTTON_GRABIMAGE, &CMFC_GrabimageDlg::OnBnClickedButtonGrabimage)ON_BN_CLICKED(IDC_BUTTON_SAVE, &CMFC_GrabimageDlg::OnBnClickedButtonSave)ON_BN_CLICKED(IDC_RADIO_BMP, &CMFC_GrabimageDlg::OnBnClickedRadioBmp)ON_BN_CLICKED(IDC_RADIO_IPG, &CMFC_GrabimageDlg::OnBnClickedRadioIpg)ON_BN_CLICKED(IDC_RADIO_PNG, &CMFC_GrabimageDlg::OnBnClickedRadioPng)ON_BN_CLICKED(IDC_RADIO_TIF, &CMFC_GrabimageDlg::OnBnClickedRadioTif)
END_MESSAGE_MAP()// CMFC_GrabimageDlg 消息處理程序BOOL CMFC_GrabimageDlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 將“關于...”菜單項添加到系統菜單中。// IDM_ABOUTBOX 必須在系統命令范圍內。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 設置此對話框的圖標。  當應用程序主窗口不是對話框時,框架將自動//  執行此操作SetIcon(m_hIcon, TRUE);			// 設置大圖標SetIcon(m_hIcon, FALSE);		// 設置小圖標// TODO:  在此添加額外的初始化代碼// 默認選中IDC_RADIO_BMPCheckRadioButton(IDC_RADIO_BMP, IDC_RADIO_TIF, IDC_RADIO_BMP);//單選按鈕設置return TRUE;  // 除非將焦點設置到控件,否則返回 TRUE
}void CMFC_GrabimageDlg::OnSysCommand(UINT nID, LPARAM lParam)
{if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}
}// 如果向對話框添加最小化按鈕,則需要下面的代碼
//  來繪制該圖標。  對于使用文檔/視圖模型的 MFC 應用程序,
//  這將由框架自動完成。void CMFC_GrabimageDlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // 用于繪制的設備上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使圖標在工作區矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 繪制圖標dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}
}//當用戶拖動最小化窗口時系統調用此函數取得光標
//顯示。
HCURSOR CMFC_GrabimageDlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}void CMFC_GrabimageDlg::OnBnClickedButtonOpen()
{// TODO:  在此添加控件通知處理程序代碼//https://blog.csdn.net/weixin_44840658/article/details/89174782//枚舉相機//先定義一個設備列表,用來存放枚舉到的設備MV_CC_DEVICE_INFO_LIST cam_List;//列表 用于存放枚舉到的相機列表//枚舉int nRet = MV_OK;nRet = MV_CC_EnumDevices(MV_GIGE_DEVICE, &cam_List);if (MV_OK != nRet){MessageBox(_T("枚舉相機失敗"));return ;}else//找到相機{//枚舉到相機后,就可以獲取到相機的一些設備信息//打印設備的SN碼、設備名稱、制造商//獲取枚舉到的相機數量int cam_num = cam_List.nDeviceNum;CString str;str.Format(_T("相機數量:%d"), cam_num);MessageBox(str);//留給后邊研究,沒有運行成功MV_CC_DEVICE_INFO* p_cam_Info = cam_List.pDeviceInfo[0];//相機相關參數輸出//PrintDeviceInfo(p_cam_Info);//檢查指定設備是否可訪問int MV_A = MV_CC_IsDeviceAccessible(p_cam_Info, MV_ACCESS_Control);if (!MV_A){MessageBox(_T("設備不允許訪問!"));return;}else{MessageBox(_T("設備允許訪問!"));}}//創建相機句柄int nRet2 = MV_OK;nRet2 = MV_CC_CreateHandle(&handle, cam_List.pDeviceInfo[0]);//枚舉相機列表中的第一個相機if (MV_OK != nRet2){MessageBox(_T("創建句柄失敗!"));return;}//打開相機int nRet3 = MV_OK;nRet3 = MV_CC_OpenDevice(handle);if (MV_OK != nRet3){MessageBox(_T("相機打開失敗!"));return;}
}void CMFC_GrabimageDlg::OnBnClickedButtonClose()
{// TODO:  在此添加控件通知處理程序代碼//關閉相機int nRet4 = MV_OK;nRet4 = MV_CC_CloseDevice(handle);if (MV_OK != nRet4){MessageBox(_T("相機關閉失敗!"));return;}else{MessageBox(_T("相機關閉成功!"));}//銷毀句柄if (handle != NULL){MV_CC_DestroyHandle(handle);handle = NULL;}
}void CMFC_GrabimageDlg::OnBnClickedButtonGrabimage()
{// TODO:  在此添加控件通知處理程序代碼int nRet = MV_OK;//開始取流// Start grab imagenRet = MV_CC_StartGrabbing(handle);if (MV_OK != nRet){MessageBox(_T("取流失敗!!"));return ;}MV_FRAME_OUT stImageInfo = { 0 };//MV_DISPLAY_FRAME_INFO stDisplayInfo = { 0 };stDisplayInfo = { 0 };HWND p_hwnd = m_picture.m_hWnd;//獲取控件的窗口句柄CRect rect;m_picture.GetClientRect(&rect);int width = rect.Width();   // 控件的寬度int height = rect.Height(); // 控件的高度nRet = MV_CC_GetImageBuffer(handle, &stImageInfo, 1000);if (nRet == MV_OK){CString str;str.Format(_T("相機采集圖像的寬度:%d"), stImageInfo.stFrameInfo.nWidth);MessageBox(str);str.Format(_T("相機采集圖像的高度:%d"), stImageInfo.stFrameInfo.nHeight);MessageBox(str);m_imagenum = stImageInfo.stFrameInfo.nFrameNum;str.Format(_T("相機采集圖像的幀號:%d"), m_imagenum);MessageBox(str);//將圖片顯示在PictureCtrl控件窗口上if (p_hwnd){stDisplayInfo.hWnd = p_hwnd;stDisplayInfo.pData = stImageInfo.pBufAddr;// 指向圖像數據的指針stDisplayInfo.nDataLen = stImageInfo.stFrameInfo.nFrameLen;//數據長度 stDisplayInfo.nWidth = stImageInfo.stFrameInfo.nWidth;   // 圖像的寬度(像素)//stDisplayInfo.nWidth = width; // 圖像的寬度(像素)用控件的寬度來代替stDisplayInfo.nHeight = stImageInfo.stFrameInfo.nHeight; // 圖像的高度(像素//stDisplayInfo.nHeight = height;// 圖像的高度(像素)用控件的高度來代替stDisplayInfo.enPixelType = stImageInfo.stFrameInfo.enPixelType;  // 像素類型,如黑白、RGB、Bayer等MV_CC_DisplayOneFrame(handle, &stDisplayInfo);//顯示圖像}MV_CC_FreeImageBuffer(handle, &stImageInfo);//需要用 MV_CC_FreeImageBuffer() 接口將pstFrame內的數據指針權限進行釋放}else{MessageBox(_T("沒有數據!"));}//停止采集// Stop grab imagenRet = MV_CC_StopGrabbing(handle);if (MV_OK != nRet){MessageBox(_T("停止采集失敗!"));return ;}}CMFC_GrabimageDlg::~CMFC_GrabimageDlg()
{handle=NULL;
}void CMFC_GrabimageDlg::OnBnClickedButtonSave()
{// TODO:  在此添加控件通知處理程序代碼MV_SAVE_IMG_TO_FILE_PARAM stSaveFileParam;memset(&stSaveFileParam, 0, sizeof(MV_SAVE_IMG_TO_FILE_PARAM));stSaveFileParam.enImageType = m_enSaveImageType; // ch:需要保存的圖像類型 | en:Image format to savestSaveFileParam.enPixelType = stDisplayInfo.enPixelType;  // ch:相機對應的像素格式 | en:Camera pixel typestSaveFileParam.nWidth = stDisplayInfo.nWidth;         // ch:相機對應的寬 | en:WidthstSaveFileParam.nHeight = stDisplayInfo.nHeight;          // ch:相機對應的高 | en:HeightstSaveFileParam.nDataLen = stDisplayInfo.nDataLen;stSaveFileParam.pData = stDisplayInfo.pData;stSaveFileParam.iMethodValue = 0;// ch:jpg圖像質量范圍為(50-99], png圖像質量范圍為[0-9] | en:jpg image nQuality range is (50-99], png image nQuality range is [0-9]if (MV_Image_Bmp == stSaveFileParam.enImageType){sprintf_s(stSaveFileParam.pImagePath, 256, "Image_w%d_h%d_fn%03d.bmp", stSaveFileParam.nWidth, stSaveFileParam.nHeight, m_imagenum);//這段代碼使用了 `sprintf_s` 函數來格式化一個字符串,該字符串將用于存儲圖像文件的路徑。`sprintf_s` 是一個安全版本的 `sprintf` 函數,用于格式化輸出到一個字符數組中,它可以防止緩沖區溢出。//讓我們詳細分析一下這段代碼://sprintf_s(stSaveFileParam.pImagePath, 256, "Image_w%d_h%d_fn%03d.bmp", stSaveFileParam.nWidth, stSaveFileParam.nHeight, m_stImageInfo.nFrameNum);// `stSaveFileParam.pImagePath`: 這是指向字符數組的指針,該數組將用來存儲生成的文件路徑字符串。這個數組應該足夠大以容納生成的字符串。//`256`: 這個數字是 `pImagePath` 指向的字符數組的大小,單位是字節。`sprintf_s` 需要知道目標緩沖區的大小,以避免寫入超出邊界。// `"Image_w%d_h%d_fn%03d.bmp"`: 這是格式化字符串,其中包含占位符 `%d` 和 `%03d`。`%d` 用于插入十進制整數,而 `%03d` 表示一個至少三位數的十進制數,不足部分用前導零填充。// `stSaveFileParam.nWidth`: 這是一個整數值,表示圖像的寬度,它將被插入到第一個 `%d` 占位符的位置。// `stSaveFileParam.nHeight`: 這也是一個整數值,表示圖像的高度,它將被插入到第二個 `%d` 占位符的位置。// `m_stImageInfo.nFrameNum`: 這是幀號,一個整數值,它將被插入到 `%03d` 占位符的位置,表示圖像的序號,并確保至少有三位數字,不足則用零填充。//整個字符串 `"Image_w%d_h%d_fn%03d.bmp"` 將會被格式化成類似于 `"Image_w640_h480_fn001.bmp"` 的形式,其中 `w640`、`h480` 和 `fn001` 分別代表圖像的寬度、高度和幀號。//這樣做的目的是為了生成一個唯一的文件名,便于在保存圖像時區分不同的圖像文件,尤其是當有多張圖像需要按順序保存時。這種格式化字符串的方式在處理大量圖像文件或需要動態生成文件名時非常常見。}else if (MV_Image_Jpeg == stSaveFileParam.enImageType){stSaveFileParam.nQuality = 80;sprintf_s(stSaveFileParam.pImagePath, 256, "Image_w%d_h%d_fn%03d.jpg", stSaveFileParam.nWidth, stSaveFileParam.nHeight, m_imagenum);}else if (MV_Image_Tif == stSaveFileParam.enImageType){sprintf_s(stSaveFileParam.pImagePath, 256, "Image_w%d_h%d_fn%03d.tif", stSaveFileParam.nWidth, stSaveFileParam.nHeight, m_imagenum);}else if (MV_Image_Png == stSaveFileParam.enImageType){stSaveFileParam.nQuality = 8;sprintf_s(stSaveFileParam.pImagePath, 256, "Image_w%d_h%d_fn%03d.png", stSaveFileParam.nWidth, stSaveFileParam.nHeight, m_imagenum);}int nRet = MV_CC_SaveImageToFile(handle, &stSaveFileParam);if (MV_OK != nRet){MessageBox(_T("圖像保存失敗!"));return;}
}void CMFC_GrabimageDlg::OnBnClickedRadioBmp()
{// TODO:  在此添加控件通知處理程序代碼m_enSaveImageType = MV_Image_Bmp;//設置圖片為bmp格式
}void CMFC_GrabimageDlg::OnBnClickedRadioIpg()
{// TODO:  在此添加控件通知處理程序代碼m_enSaveImageType = MV_Image_Jpeg;//設置圖片為jpg格式
}void CMFC_GrabimageDlg::OnBnClickedRadioPng()
{// TODO:  在此添加控件通知處理程序代碼m_enSaveImageType = MV_Image_Png;//設置圖片為png格式
}void CMFC_GrabimageDlg::OnBnClickedRadioTif()
{// TODO:  在此添加控件通知處理程序代碼m_enSaveImageType = MV_Image_Tif;//設置圖片為tif格式
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45081.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45081.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45081.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【動態規劃Ⅰ】斐波那契、爬樓梯、楊輝三角

動態規劃—斐波那契系列 什么是動態規劃斐波那契數組相關題目509. 斐波那契數 Easy1137. 第 N 個泰波那契數 Easy 楊輝三角118. 楊輝三角 Easy 爬樓梯相關題目70. 爬樓梯 Easy746. 使用最小花費爬樓梯 Easy 什么是動態規劃 動態規劃是一種通過將原問題分解為相對簡單的子問題來…

linux下解壓命令

在Linux下&#xff0c;解壓縮文件通常涉及多種命令&#xff0c;具體取決于文件的壓縮格式。以下是一些常用的解壓縮命令&#xff1a; tar.gz / .tgz 如果文件擴展名為 .tar.gz 或 .tgz&#xff0c;你可以使用 tar 命令來解壓縮&#xff1a; tar -xzf filename.tar.gz這里的 -x …

近期幾首小詩匯總-生活~卷

生活 為生活飄零&#xff0c;風雨都不阻 路見盲人艱&#xff0c;為她心點燈 賀中科大家長論壇成立十五周年 科學家園有喜賀 園外丑漢翹望中 曾一學子入我科 正育科二盼長大 憧憬也能入此家 與科學家論短長 園外翹首聽高論 發現有隙入此壇 竟然也能注冊成 入園瀏覽惶然立 此貼…

系統架構的基礎:定義、原則與發展歷程

目錄 1. 系統架構的定義 2. 系統架構的基本組成部分 2.1 架構層次 2.2 架構視圖 2.3 架構原則 3. 系統架構的發展歷程 3.1 初期階段:單體架構(Monolithic Architecture) 3.2 面向對象和組件化階段 3.3 客戶端-服務器架構(Client-Server Architecture) 3.4 三層架…

在 Linux 上使用 lspci 命令查看 PCI 總線硬件設備信息

lspci 命令用于顯示 Linux 系統上的設備和驅動程序 當在個人電腦或服務器上運行 Linux 時&#xff0c;有時需要識別該系統中的硬件。lspci 命令用于顯示連接到 PCI 總線的所有設備&#xff0c;從而滿足上述需求。該命令由 pciutils 包提供&#xff0c;可用于各種基于 Linux 和…

JAVA中的回溯算法解空間樹,八皇后問題以及騎士游歷問題超詳解

1.回溯算法的概念 回溯算法顧名思義就是有回溯的算法 回溯算法實際上一個類似枚舉的搜索嘗試過程&#xff0c;主要是在搜索嘗試過程中尋找問題的解&#xff0c;當發現已不滿足求解條件時&#xff0c;就“回溯”返回&#xff0c;嘗試別的路徑。回溯法是一種選優搜索法&#xff…

E12.【C語言】練習:求兩個數的最大公約數

1.枚舉 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() {int a 0;int b 0;int tmp 0;scanf("%d %d", &a, &b);if (a < b){for (int i1; i < a; i){if (0a% i && 0b%i)tmp i;}}if (a>b){for (int i 1; i <…

[線性RNN系列] Mamba: S4史詩級升級

前言 iclr24終于可以在openreview上看預印本了 這篇&#xff08;可能是顛覆之作&#xff09;文風一眼c re組出品&#xff1b;效果實在太驚艷了&#xff0c;實驗相當完善&#xff0c;忍不住寫一篇解讀分享分享。 TL;DR &#xff08;overview&#xff09; Structured State-Sp…

Nginx 日志統計分析命令

統計訪問量最多的IP地址&#xff1a; awk {print $1} /path/to/nginx/access.log | sort | uniq -c | sort -nr | head -n 10統計不同狀態碼的出現次數&#xff1a; awk {print $9} /path/to/nginx/access.log | sort | uniq -c | sort -nr統計訪問量最多的URL&#xff1a; awk…

SQL Server端口配置指南

SQL Server是微軟推出的關系型數據庫管理系統&#xff0c;它支持多種操作系統平臺。默認情況下&#xff0c;SQL Server使用TCP/IP協議的1433端口進行通信。然而&#xff0c;出于安全或其他考慮&#xff0c;我們可能需要更改SQL Server實例的默認端口。本文將指導你如何更改SQL …

利率債與信用債的區別及其與債券型基金的關系

利率債與信用債的定義及其區別 定義 利率債&#xff1a; 定義&#xff1a;利率債是指由主權或類主權主體&#xff08;如中華人民共和國財政部、國家開發銀行等&#xff09;發行的債券。這些債券通常被認為沒有信用風險&#xff0c;因為它們由國家信用背書。特點&#xff1a;由…

【Python】 深入了解 Python 字典的 | 更新操作

我白天是個 搞笑廢物 表演不在乎 夜晚變成 憂傷怪物 撕扯著孤獨 我曾經是個 感性動物 小心地感觸 現在變成 無關人物 &#x1f3b5; 張碧晨/王赫野《何物》 Python 3.9 引入了一種新的字典更新操作&#xff0c;即使用 | 運算符合并字典。這種方式不僅簡潔…

xshell公鑰免密登錄

設備&#xff1a;一臺linux系統機器&#xff0c;一臺windows系統機器 軟件&#xff1a;xshell 要求&#xff1a;公鑰免密登錄 一、生成公鑰、私鑰 1、打開shell &#xff1b; 點擊工具 &#xff1b; 新建用戶生成密鑰向導 2、生成密鑰參數 密鑰類型&#xff1a;RS…

element ui ts table重置排序

#日常# 今天帶的實習生&#xff0c;在遇到開發過程中&#xff0c;遇到了element ui table 每次查詢的時候都需要重置排序方式&#xff0c;而且多個排序是由前端排序。 <el-table :data"tableData" ref"restTable"> </<el-table> <script…

bi項目筆記

1.bi是什么 bi項目就是商業智能系統&#xff0c;也就是數據可視畫、報表可視化系統&#xff0c;如下圖的就是bi項目了 2.技術棧

Linux rsync文件同步工具

scp的不足 1. 性能問題 單線程傳輸 SCP只使用單線程進行傳輸&#xff0c;這意味著在傳輸大文件或大量小文件時&#xff0c;其傳輸速度和效率可能不如其他多線程工具。 無法壓縮數據傳輸 SCP不支持內置的壓縮機制&#xff0c;這在傳輸大文件時會導致帶寬使用效率較低。 2.…

我花了5年時間訓練自己這種能力,希望你也能成功

人生最重要的能力是日拱一卒&#xff0c;即每天做一點點對自己有利的事并持續足夠長的時間。作者之前急于求成&#xff0c;減肥失敗。同事通過每月改進一件小事成功減肥且知識儲備豐富。作者受啟發后&#xff0c;通過走樓梯、換代糖等小改變&#xff0c;用 4 年減了 40 斤&…

Hive的基本操作(創建與修改)

必備知識 數據類型 基本類型 類型寫法字符char, varchar, string?整數tinyint, smallint, int?, bigint?小數float, double, numeric(m,n), decimal(m,n)?布爾值boolean?時間date?, timestamp? 復雜類型(集合類型) 1、數組&#xff1a;array<T> 面向用戶提供…

從頭開始搭建一套Elasticsearch集群

前言 剛開始使用ES接觸的就是rpm或者是云上提供的ES服務&#xff0c;基本上開箱即用。特別是云上的ES服務&#xff0c;開局就是集群版本&#xff0c;提供的是優化后的參數配置、開箱即匹配訪問鑒權及常用插件&#xff0c;如無特殊需要基本上屏蔽了所有細節&#xff0c;直接可投…

深入了解 MySQL 的 EXPLAIN 命令

一、什么是 EXPLAIN 命令&#xff1f; EXPLAIN 命令用于顯示 MySQL 如何執行某個 SQL 語句&#xff0c;尤其是 SELECT 語句。通過 EXPLAIN 命令&#xff0c;可以看到查詢在實際執行前的執行計劃&#xff0c;這對于優化查詢性能至關重要。 二、EXPLAIN 的基本用法 要使用 EXP…