CentOS 6.5 系统默认自带的Python是2.6.6版本,由于yum服务也是依赖于python的,所以不能直接覆盖;
利用virtualenv很好的解决了这个多版本的问题;

使用现有的 python 2.6.x 安装pip

rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

yum install -y python-pip
阅读全文 »

这本书推荐阅读,从另一个角度诠释了如何学习的技巧,其本质都是殊途同归,利用大脑的特点来学习。

启发我整理一下自己所看的有关学习的书籍。相关的东西看了不少,但是感觉并未实际发挥效用,或者说发挥的效用较小。看来知道方法和使用并掌握方法还有段距离需要填补。

5f778ca7.png

RSA如果要加密长的信息时,需要在一个固定大小的块(block)上进行分块操作。

如果想支持256bit以上的明文,那么就需要自己实现分组加密。例如256bit密钥,采用了padding,那么一次可以加密的字符长度不能超过32-11=21个byte。同时分组加密后的明文在解密的时候也需要对应分组去解密。
EncryptPKCS1v15使用PKCS#1 v1.5规定的填充方案和RSA算法加密msg。明文长度(Bytes) <= 密钥长度(Bytes)- 11字节。
注意:使用本函数加密明文(而不是会话密钥)是危险的,请尽量在新协议中使用RSA OAEP。

阅读全文 »

HTTPS其实是有两部分组成:HTTP + SSL(Secure Sockets Layer)/TLS(Transport Layer Security),也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。

3fb48150.png 47479ef4.png

动名词(动词+ing)在句子中作为名词使用。

动名词主要有四种用法,做主语,作宾语,作表语,作定语,每种用法下又分小类别
以下为扩展内容,感觉还是不理解这个动名词呢!!!

作主语

  • 直接位于句首
    (Swimming) is a good sport in summer.
  • 用 it 作形式主语,把动名词(真实主语)置于句尾作后置主语。
    It is no use (telling) him not to worry.
    注意:important,essential,necessary 等形容词不能用于上述结构。
  • 用于“There be”结构中
    There is no (saying) when he’ll come.
  • 动名词的复合结构作主语:当动名词有自己的逻辑主语时,常可以在前面加上一个名词或代词的所有格,构成动名词的复合结构,
    动名词疑问句通常使用这种结构做主语
    Their (coming) to help was a great encouragement to us.
    Does your (saying) that mean anything to him?

作宾语

作表语

作定语

  • Seeing is believing.
  • Running a marathon is not an easy thing to do.
  • Watching TV is sometimes harmful.
  • Eating is always fun.
  • My hobby is painting.
  • She loves babysitting her sister.
  • I like listening to music.
  • I wasted all my afternoon by taking a nap.
  • I am afraid of singing a song on a stage.

一般所有格名词或代词在动名词的前面。

  • I hope that you don’t mind my using your pen.
  • Don’t be mad about my leaving early.
  • I don’t want you misunderstanding.
  • You will be amazed by my writing.

练习

填空

  1. I enjoy (draw) as a hobby.
  2. She likes (buy) clothes.
  3. Children are fond of (play) with water.
  4. (dance) is my favorite thing to do.
  5. I am upset at his (break) the rule.

答案:

  1. drawing
  2. buying
  3. playing
  4. Dancing
  5. breaking

多功能控件

CGridListCtrlEx 非常好用的扩展库

可编辑

m_ctrl_list_geometric_coeff.SetExtendedStyle(m_ctrl_list_geometric_coeff.GetExtendedStyle() | LVS_EX_DOUBLEBUFFER | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT |
LVS_EX_SUBITEMIMAGES);
{
CGridColumnTrait* pTrait = NULL;
CString colsName[] = {
L"编号",L"名字",L"描述",L"数值"
};
for (size_t i = 0; i < 4; ++i)
{
if (i > 0)
{
pTrait = new CGridColumnTraitEdit;
}
else
{
pTrait = new CGridColumnTrait;
}
m_ctrl_list_geometric_coeff.InsertColumnTrait(int(i + 1), colsName[i], LVCFMT_LEFT, 100, i, pTrait);
}
}

编辑完成事件

(msdn)[https://docs.microsoft.com/en-us/windows/win32/controls/lvn-itemchanged]

LVN_ITEMCHANGED

```

## 常用代码

```c++
m_wndList.Create(WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_SHOWSELALWAYS, CRect(0, 0, 0, 0), this, IDC_FRM_FILE_LIST);//|LVS_SINGLESEL
m_wndList.SetExtendedStyle(m_wndList.GetExtendedStyle() | LVS_EX_DOUBLEBUFFER | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT |
LVS_EX_SUBITEMIMAGES);//LVS_EX_ONECLICKACTIVATE||LVS_EX_TRACKSELECT
//::SendMessageW(m_wndList.m_hWnd,LVM_SETHOVERTIME,0,1);

m_wndList.InsertColumn(0, TEXT("Name"), LVCFMT_LEFT, 400);
m_wndList.InsertColumn(1, TEXT("Ext"), LVCFMT_LEFT, 130);
m_wndList.InsertColumn(2, TEXT("Size"), LVCFMT_LEFT, 80);
m_wndList.InsertColumn(3, TEXT("Date"), LVCFMT_LEFT, 100);

m_wndList.SetColumnWidth(0, LVSCW_AUTOSIZE_USEHEADER);
if (m_wndList.GetColumnWidth(0) < 200)
{
m_wndList.SetColumnWidth(0, 200);
}
m_imageList.Create(16, 16, ILC_COLOR24, 7, 7);
m_wndList.SetImageList(&m_imageList, LVSIL_SMALL);


BOOL CDlgIconList::FillList(HWND hwnd)
{
// Clear the list before we start
// ListView_DeleteAllItems(hwnd);

CDevHelperApp* pwnd = (CDevHelperApp*)AfxGetApp();
ListView_SetImageList(hwnd, pwnd->m_hLarge, LVSIL_NORMAL);

// Get number of icons in system image list
count = ImageList_GetImageCount(pwnd->m_hLarge);

LVITEM lvitem;
TCHAR ach[20];
// add to list
for (int i = 0; i < 10; ++i)
{
wsprintf(ach, TEXT("%d"), i);
lvitem.mask = LVIF_TEXT;
lvitem.iItem = i;
lvitem.iSubItem = 0;
lvitem.pszText = ach;
ListView_InsertItem(m_wndView.m_hWnd, &lvitem);

m_wndView.SetItemText(i, 1, TEXT("1"));
m_wndView.SetItemText(i, 2, TEXT("2"));
}
return TRUE;
}

//从扩展名中获取图标信息
SHFILEINFO shfi;
memset(&shfi, 0, sizeof(shfi));
if (0 == SHGetFileInfo(TEXT("*.rxs"), FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(shfi), SHGFI_ICON | SHGFI_USEFILEATTRIBUTES))
{
AfxMessageBox(TEXT("Failed"));
}
int idx = m_imageList.Add(shfi.hIcon);
if (0 == SHGetFileInfo(TEXT("*.doc"), FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(shfi), SHGFI_ICON | SHGFI_USEFILEATTRIBUTES))
{
AfxMessageBox(TEXT("Failed"));
}
m_imageList.Add(shfi.hIcon);
m_wndList.InsertItem(1, TEXT("dd"), idx);
m_wndList.InsertItem(2, TEXT("test"), idx + 1);

InsertItem
Return Value
The index of the new item if successful or - 1 otherwise.
//== == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == ==
BOOL DeleteItem(int nItem);
Return Value
Nonzero if successful; otherwise zero.
//== == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == ==
插入项带图标
nt idx = m_imageList.Add(shfi.hIcon);
m_wndList.InsertItem(1, TEXT("dd"), idx);

双击事件

使用向导添加NM_DBLCLK即可

...
ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CTradeQuery::OnNMDblclkList1)
END_MESSAGE_MAP()

afx_msg void OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult);

void CTradeQuery::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: Add your control notification handler code here


*pResult = 0;
}

删除一行/多行

m_ctrl_list.DeleteItem(nItem);

// 多行删除
while (m_ctrl_list.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED) != -1)
{
int nItem = m_ctrl_list.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED);
m_ctrl_list.DeleteItem(nItem);
}

删除列

inline void CMRLGaugerProgramerDlg::deleteAllColumns()
{
int nColumnCount = m_list_data.GetHeaderCtrl()->GetItemCount();

// Delete all of the columns.
for (int i = 0; i < nColumnCount; i++)
{
m_list_data.DeleteColumn(0);
}
m_list_data.DeleteAllItems();
}

添加一行

++nItem;
int curItem = m_ctrl_list_geometric_coeff.InsertItem(nItem, utils::format(100, L"%d", nItem).c_str());
m_ctrl_list_geometric_coeff.SetItemText(curItem, 1, utils::format(100, L"k%d", nItem).c_str());
m_ctrl_list_geometric_coeff.SetItemText(curItem, 2, utils::format(100, L"Geom. Coeff.%d", nItem).c_str());
m_ctrl_list_geometric_coeff.SetItemText(curItem, 3, L"0.00");

遍历

//Get all selected item
POSITION pos = m_list.GetFirstSelectedItemPosition();
CString str;
DWORD dwID = 0;
if (pos == NULL)
{
AfxMessageBox(TEXT("No item selected"));
}
else
{
while (pos)
{
// if delete item need this
//pos = m_list.GetFirstSelectedItemPosition();
int nItem = m_list.GetNextSelectedItem(pos);
strTmp.Format(TEXT("item %s selected"), str);
dwID = m_wndList.GetItemData(nItem);
str = m_wndList.GetItemText(nItem, 0);
}
}

获取字段文字

CString str;
str = m_ctrl_list.GetItemText(pNMListView->iItem, 7);

获取列数量

m_ctrl_list_geometric_coeff.GetHeaderCtrl()->GetItemCount();

获取保存的 data

POSITION listPos = m_ctrl_list.GetFirstSelectedItemPosition();
if (listPos == NULL) return;
int itemData = m_ctrl_list.GetNextSelectedItem(listPos);

可编辑列表框

void CfireShanghaiYongTianEF_01ConfigDlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
m_ctrl_list.OnListEdit();

*pResult = 0;
}


m_list_car.setControlId(IDC_LIST_CAR);
m_list_car.InsertColumn(0, TEXT("车牌号"), LVCFMT_LEFT, 100);
m_list_car.InsertColumn(1, TEXT("车牌类型"), LVCFMT_LEFT, 100);
m_list_car.InsertColumn(2, TEXT("车辆类型"), LVCFMT_LEFT, 130);
m_list_car.InsertColumn(3, TEXT("注册人"), LVCFMT_LEFT, 100);
m_list_car.InsertColumn(4, TEXT("联系手机"), LVCFMT_LEFT, 100);
m_list_car.InsertColumn(5, TEXT("备注"), LVCFMT_LEFT, 120);
m_list_car.SetExtendedStyle(m_list_car.GetExtendedStyle() | LVS_EX_DOUBLEBUFFER | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT |
LVS_EX_SUBITEMIMAGES);

多功能控件

CGridListCtrlEx 非常好用的扩展库

可编辑

m_ctrl_list_geometric_coeff.SetExtendedStyle(m_ctrl_list_geometric_coeff.GetExtendedStyle() | LVS_EX_DOUBLEBUFFER | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT |
LVS_EX_SUBITEMIMAGES);
{
CGridColumnTrait* pTrait = NULL;
CString colsName[] = {
L"编号",L"名字",L"描述",L"数值"
};
for (size_t i = 0; i < 4; ++i)
{
if (i > 0)
{
pTrait = new CGridColumnTraitEdit;
}
else
{
pTrait = new CGridColumnTrait;
}
m_ctrl_list_geometric_coeff.InsertColumnTrait(int(i + 1), colsName[i], LVCFMT_LEFT, 100, i, pTrait);
}
}

编辑完成事件

(msdn)[https://docs.microsoft.com/en-us/windows/win32/controls/lvn-itemchanged]

LVN_ITEMCHANGED

```

## 常用代码

```c++
m_wndList.Create(WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_SHOWSELALWAYS, CRect(0, 0, 0, 0), this, IDC_FRM_FILE_LIST);//|LVS_SINGLESEL
m_wndList.SetExtendedStyle(m_wndList.GetExtendedStyle() | LVS_EX_DOUBLEBUFFER | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT |
LVS_EX_SUBITEMIMAGES);//LVS_EX_ONECLICKACTIVATE||LVS_EX_TRACKSELECT
//::SendMessageW(m_wndList.m_hWnd,LVM_SETHOVERTIME,0,1);

m_wndList.InsertColumn(0, TEXT("Name"), LVCFMT_LEFT, 400);
m_wndList.InsertColumn(1, TEXT("Ext"), LVCFMT_LEFT, 130);
m_wndList.InsertColumn(2, TEXT("Size"), LVCFMT_LEFT, 80);
m_wndList.InsertColumn(3, TEXT("Date"), LVCFMT_LEFT, 100);

m_wndList.SetColumnWidth(0, LVSCW_AUTOSIZE_USEHEADER);
if (m_wndList.GetColumnWidth(0) < 200)
{
m_wndList.SetColumnWidth(0, 200);
}
m_imageList.Create(16, 16, ILC_COLOR24, 7, 7);
m_wndList.SetImageList(&m_imageList, LVSIL_SMALL);


BOOL CDlgIconList::FillList(HWND hwnd)
{
// Clear the list before we start
// ListView_DeleteAllItems(hwnd);

CDevHelperApp* pwnd = (CDevHelperApp*)AfxGetApp();
ListView_SetImageList(hwnd, pwnd->m_hLarge, LVSIL_NORMAL);

// Get number of icons in system image list
count = ImageList_GetImageCount(pwnd->m_hLarge);

LVITEM lvitem;
TCHAR ach[20];
// add to list
for (int i = 0; i < 10; ++i)
{
wsprintf(ach, TEXT("%d"), i);
lvitem.mask = LVIF_TEXT;
lvitem.iItem = i;
lvitem.iSubItem = 0;
lvitem.pszText = ach;
ListView_InsertItem(m_wndView.m_hWnd, &lvitem);

m_wndView.SetItemText(i, 1, TEXT("1"));
m_wndView.SetItemText(i, 2, TEXT("2"));
}
return TRUE;
}

//从扩展名中获取图标信息
SHFILEINFO shfi;
memset(&shfi, 0, sizeof(shfi));
if (0 == SHGetFileInfo(TEXT("*.rxs"), FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(shfi), SHGFI_ICON | SHGFI_USEFILEATTRIBUTES))
{
AfxMessageBox(TEXT("Failed"));
}
int idx = m_imageList.Add(shfi.hIcon);
if (0 == SHGetFileInfo(TEXT("*.doc"), FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(shfi), SHGFI_ICON | SHGFI_USEFILEATTRIBUTES))
{
AfxMessageBox(TEXT("Failed"));
}
m_imageList.Add(shfi.hIcon);
m_wndList.InsertItem(1, TEXT("dd"), idx);
m_wndList.InsertItem(2, TEXT("test"), idx + 1);

InsertItem
Return Value
The index of the new item if successful or - 1 otherwise.
//== == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == ==
BOOL DeleteItem(int nItem);
Return Value
Nonzero if successful; otherwise zero.
//== == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == ==
插入项带图标
nt idx = m_imageList.Add(shfi.hIcon);
m_wndList.InsertItem(1, TEXT("dd"), idx);

双击事件

使用向导添加NM_DBLCLK即可

...
ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CTradeQuery::OnNMDblclkList1)
END_MESSAGE_MAP()

afx_msg void OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult);

void CTradeQuery::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: Add your control notification handler code here


*pResult = 0;
}

删除一行/多行

m_ctrl_list.DeleteItem(nItem);

// 多行删除
while (m_ctrl_list.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED) != -1)
{
int nItem = m_ctrl_list.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED);
m_ctrl_list.DeleteItem(nItem);
}

删除列

inline void CMRLGaugerProgramerDlg::deleteAllColumns()
{
int nColumnCount = m_list_data.GetHeaderCtrl()->GetItemCount();

// Delete all of the columns.
for (int i = 0; i < nColumnCount; i++)
{
m_list_data.DeleteColumn(0);
}
m_list_data.DeleteAllItems();
}

添加一行

++nItem;
int curItem = m_ctrl_list_geometric_coeff.InsertItem(nItem, utils::format(100, L"%d", nItem).c_str());
m_ctrl_list_geometric_coeff.SetItemText(curItem, 1, utils::format(100, L"k%d", nItem).c_str());
m_ctrl_list_geometric_coeff.SetItemText(curItem, 2, utils::format(100, L"Geom. Coeff.%d", nItem).c_str());
m_ctrl_list_geometric_coeff.SetItemText(curItem, 3, L"0.00");

遍历

//Get all selected item
POSITION pos = m_list.GetFirstSelectedItemPosition();
CString str;
DWORD dwID = 0;
if (pos == NULL)
{
AfxMessageBox(TEXT("No item selected"));
}
else
{
while (pos)
{
// if delete item need this
//pos = m_list.GetFirstSelectedItemPosition();
int nItem = m_list.GetNextSelectedItem(pos);
strTmp.Format(TEXT("item %s selected"), str);
dwID = m_wndList.GetItemData(nItem);
str = m_wndList.GetItemText(nItem, 0);
}
}

获取字段文字

CString str;
str = m_ctrl_list.GetItemText(pNMListView->iItem, 7);

获取列数量

m_ctrl_list_geometric_coeff.GetHeaderCtrl()->GetItemCount();

获取保存的 data

POSITION listPos = m_ctrl_list.GetFirstSelectedItemPosition();
if (listPos == NULL) return;
int itemData = m_ctrl_list.GetNextSelectedItem(listPos);

可编辑列表框

void CfireShanghaiYongTianEF_01ConfigDlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
m_ctrl_list.OnListEdit();

*pResult = 0;
}


m_list_car.setControlId(IDC_LIST_CAR);
m_list_car.InsertColumn(0, TEXT("车牌号"), LVCFMT_LEFT, 100);
m_list_car.InsertColumn(1, TEXT("车牌类型"), LVCFMT_LEFT, 100);
m_list_car.InsertColumn(2, TEXT("车辆类型"), LVCFMT_LEFT, 130);
m_list_car.InsertColumn(3, TEXT("注册人"), LVCFMT_LEFT, 100);
m_list_car.InsertColumn(4, TEXT("联系手机"), LVCFMT_LEFT, 100);
m_list_car.InsertColumn(5, TEXT("备注"), LVCFMT_LEFT, 120);
m_list_car.SetExtendedStyle(m_list_car.GetExtendedStyle() | LVS_EX_DOUBLEBUFFER | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT |
LVS_EX_SUBITEMIMAGES);

client

建立连接时的情况

  1. 网络不可达或对方服务未启动:立即返回
  2. 服务的listen backlog满:会阻塞,等待时间与server端的网络实现和设置有关。
  3. 网络延迟较大,Dial阻塞并超时

conn.Read的行为特点

阅读全文 »