本脚本主要复制粘贴自:https://www.jianshu.com/p/1a5c0228efb0

git代码,如果在提交后,还希望将当时的名字、邮箱全部修改掉,则需要对其进行rebase调整

具体步骤1,git 的bash窗口,创建bare仓库中,

git clone --bare https://github.com/用户名/库名.git

步骤2,将下面的名字、邮箱修改正确,脚本代码:

#!/bin/shgit filter-branch --env-filter 'OLD_EMAIL="XXX@gmail.com"CORRECT_NAME="YYY"CORRECT_EMAIL="YYY@gmail.com"

if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL"]thenexport GIT_COMMITTER_NAME="$CORRECT_NAME"export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL"]thenexport GIT_AUTHOR_NAME="$CORRECT_NAME"export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
'--tag-name-filter cat -- --branches --tags

步骤3,进入目录,并执行此脚本

步骤4,强推入gitee或github

git push --force --tags origin 'refs/heads/*'

后续,推库后,则bare仓库就没用,可以删除了。

 

c++早期版本中,结构中的联合体,在初始化时,总有很多支持不佳的编译器,这儿提供一个通用类,用于实现联合体的初始化

classUnionValue {private:
union {
uint8_t value_u8_;
uint16_t value_u16_;
uint32_t value_u32_;
int8_t value_i8_;
int16_t value_i16_;
int32_t value_i32_;
floatvalue_f_;
} base_value_;
public:explicit UnionValue(uint8_t u8_) { base_value_.value_u8_ =u8_;}explicit UnionValue(uint16_t u16_){ base_value_.value_u16_ =u16_;}explicit UnionValue(uint32_t u32_){ base_value_.value_u32_ =u32_;}explicit UnionValue(int8_t i8_) { base_value_.value_i8_ =i8_;}explicit UnionValue(int16_t i16_) { base_value_.value_i16_ =i16_;}explicit UnionValue(int32_t i32_) { base_value_.value_i32_ =i32_;}explicit UnionValue(float f_) { base_value_.value_f_ =f_;}

uint8_t value_u8() {
returnbase_value_.value_u8_;}
uint16_t value_u16() {
returnbase_value_.value_u16_;}
uint32_t value_u32() {
returnbase_value_.value_u32_;}
int8_t value_i8() {
returnbase_value_.value_i8_;}
int16_t value_i16() {
returnbase_value_.value_i16_;}
int32_t value_i32() {
returnbase_value_.value_i32_;}float value_f() {returnbase_value_.value_f_;}
};

 

整个类定义简单,且不占用额外空间,使用时也不需要有额外的代码

示例结构体:

typedef structLevel_st {
uint8_t prior_;
//优先顺序顺序 uint8_t type_; //数值类型:0 - bool/1 - uint8_t/2 - uint16_t/3 - uint32_t/4 - uint8_t/5 - uint16_t/6 - uint32_t/7 - float uint32_t offset_; //偏移 UnionValue base_value_;
}Level_st ;

初始化代码如下:

Level_st override_level[] ={
{
0, 3, 2, UnionValue(uint32_t(0))},
{
1, 7, 2, UnionValue(0.95f)},
};

 

Window下,luarocks提供了一体式的EXE文件,节省了很多麻烦,同时也带来新的问题,配置文件不知道在哪儿 

搜索资料后,才知道这种会固定寻找配置文件路径,在

C:\Users\XXXX\AppData\Roaming\luarocks

目录下

建立诸如config-5.3.lua文件,内容如下:

rocks_trees ={
{ name
= [[system]], root = [[D:/lua_5.3.5_Win64]]},
}
variables
={
LUA
= 'D:/lua_5.3.5_Win64/lua53',
LUA_BINDIR
= 'D:/lua_5.3.5_Win64',
LUA_INCDIR
= 'D:/lua_5.3.5_Win64/include',
LUA_LIBDIR
= 'D:/lua_5.3.5_Win64',
CC
= 'D:/03.Ming64/mingw64/bin/x86_64-w64-mingw32-gcc.exe',
LD
= 'D:/03.Ming64/mingw64/bin/x86_64-w64-mingw32-gcc.exe',
}

这样就可以手工指定mingw编译器的文件名了。

 

Window中VB有InputBox的功能,但SDK、MFC、WTL等并未提供类似功能。

WTL有CIndirectDialogImpl,可以很简单的构建对话框。基于此,实现一个简单的InputBox功能

#define BUF_LEN MAX_PATH

#define IDC_TEXT    (100)

class CInputBox: public CIndirectDialogImpl< CInputBox >{private:
LPCTSTR szPrompt_;
LPCTSTR szTitle_;
LPCTSTR szDefaultText_;
TCHAR strResult[BUF_LEN];
public:
BEGIN_DIALOG(
0, 0, 257, 62)
DIALOG_CAPTION(szTitle_
!= nullptr ? szTitle_ : _T(""))
DIALOG_STYLE(DS_MODALFRAME
| WS_POPUP | WS_CAPTION |WS_SYSMENU)
DIALOG_FONT(
9, _T("SimSun"))
END_DIALOG()

BEGIN_CONTROLS_MAP()
CONTROL_DEFPUSHBUTTON(_T(
"OK"), IDOK, 200, 11, 50, 14, 0, 0)
CONTROL_PUSHBUTTON(_T(
"Cancel"), IDCANCEL, 200, 31, 50, 14, 0, 0)
CONTROL_LTEXT(szPrompt_
!= nullptr ? szPrompt_ : _T("Please input:"), IDC_STATIC, 7, 7, 158, 14, 0, 0)
CONTROL_EDITTEXT(IDC_TEXT,
7, 31, 180, 14, 0, 0)
END_CONTROLS_MAP()

BEGIN_MSG_MAP(CInputBox)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_ID_HANDLER(IDOK, OnCloseCmd)
COMMAND_ID_HANDLER(IDCANCEL, OnCloseCmd)
END_MSG_MAP()

CInputBox::CInputBox() : szPrompt_(nullptr), szTitle_(nullptr), szDefaultText_(nullptr){
memset(strResult,
0, sizeof(TCHAR)*BUF_LEN);
}
static bool InputBox(LPCTSTR szPrompt, LPTSTR strResult, LPCTSTR szTitle = _T(""), LPCTSTR szDefaultText = _T(""), HWND hParent =nullptr){
CInputBox dlg;
dlg.szPrompt_
=szPrompt;
dlg.szTitle_
=szTitle;
dlg.szDefaultText_
=szDefaultText;if (IDOK ==dlg.DoModal(hParent)) {//get return string. lstrcpyn(strResult, dlg.strResult, BUF_LEN);return true;
}
return false;
}

LRESULT OnInitDialog(UINT
/*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
CenterWindow(GetParent());
if(szDefaultText_) {
::SetWindowText(::GetDlgItem(m_hWnd, IDC_TEXT), szDefaultText_);
}
//set focus to edit control item. ::SetFocus(::GetDlgItem(m_hWnd, IDC_TEXT));//return false to prevent setfocus in dialogproc. return false;
}

LRESULT OnCloseCmd(WORD
/*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
if (wID ==IDOK) {
::GetWindowText(::GetDlgItem(m_hWnd, IDC_TEXT), strResult, BUF_LEN
- 1);
}

EndDialog(wID);
return 0;
}
};

使用类似于如下:

voiddemo()
{
TCHAR strPassWd[MAX_PATH];
if (CInputBox::InputBox(_T("请输入加密密码:"), strPassWd, _T("输入密码"))) {//}return;
}

 

在ubuntu下递归追索一个包的所有必要依赖项apt_dep.sh

通过apt-cache depends 可以获取debian/ubuntu下一个包的依赖项,但依赖项本身也会依赖其他包,

希望递归追索所有依赖项,且不重复,则使用如下小脚本可以达到目的

#! /bin/bash

ALL_DEBS
=$1CHECKED_DEBS="libc6 $1"UNCHECK_DEBS="" functionis_check()
{
for item_one in ${CHECKED_DEBS}; do if [ $item_one == $1 ]; thenreturn1 fi done;
return
0}functionget_dep()
{
PACKAGE_NAME
="$1"DEPS_NAME="$(apt-cache depends"$PACKAGE_NAME"| grep" 依赖:"| awk -F":"'{ print $2}' | tr -d '<>' | tr '\n' ' ')"#echo "$1, ${DEPS_NAME}" for item_two in${DEPS_NAME};dois_check $item_twoif [ $? -eq 0 ] ; thenCHECKED_DEBS="${CHECKED_DEBS}""$item_two"get_dep $item_twofi done;
}

get_dep $
1 echo ${CHECKED_DEBS}