Redmine与Gitblit联动
配置好redmine后,访问redmine地址,用管理员帐号登录,点击顶上的管理TAB菜单,左边的选项中选择信息,可以看到当前Redmine的各种环境的版本,本次搭建的最新版本(2019-11-07)如下
Environment:
Redmine version 4.0.5.stable
Ruby version 2.5.7-p206 (2019-10-01) [x86_64-linux]
Rails version 5.2.3
Environment production
Database adapter Mysql2
Mailer queue ActiveJob::QueueAdapters::AsyncAdapter
Mailer delivery smtp
SCM:
Subversion 1.12.2
Git 2.19.1
Filesystem
Step1:在管理->配置->API 中,勾选开启Webservice
Step2:在管理->配置 ->版本库中,开启自动获取程序变更与WebService,并生成一个key密钥。因为是内网布署的,所以亮出密钥了:P
Step3:在Gitblit目录中配置apkkey与url
修改${gitblit-1.8.0-dir}/data/groovy/redmine-fetch.groovy文件以下行
/* specify the URL of your Redmine instance here */
def redmineURL = "http://192.168.8.31:8080/redmine/"
/* specify the URL of your Redmine instance here */
def apiKey = "LNOcmjUSy0Dxxu3Dpjxi"
Step4:在Gitblit版本库->编辑->receive 中Selected加入redmine–fetch
Step5:待续
参考https://blog.csdn.net/weixin_33953384/article/details/91693565
OpenCV 下 op::putText 显示中文的方法
//头上加入 #include <hstring.h>
//方法开始 void GetStringSize(HDC hDC, const char* str, int* w, int* h) { SIZE size; GetTextExtentPoint32A(hDC, str, strlen(str), &size); if (w != 0) * w = size.cx; if (h != 0) * h = size.cy; } void paDrawString(cv::Mat& dst, const char* str, cv::Point org, cv::Scalar color, int fontSize, bool italic, bool underline) { CV_Assert(dst.data != 0 && (dst.channels() == 1 || dst.channels() == 3)); int x, y, r, b; if (org.x > dst.cols || org.y > dst.rows) return; x = org.x < 0 ? -org.x : 0; y = org.y < 0 ? -org.y : 0; LOGFONTA lf; lf.lfHeight = -fontSize; lf.lfWidth = 0; lf.lfEscapement = 0; lf.lfOrientation = 0; lf.lfWeight = 5; lf.lfItalic = italic; //斜体 lf.lfUnderline = underline; //下划线 lf.lfStrikeOut = 0; lf.lfCharSet = DEFAULT_CHARSET; lf.lfOutPrecision = 0; lf.lfClipPrecision = 0; lf.lfQuality = PROOF_QUALITY; lf.lfPitchAndFamily = 0; //此处可定义使用的字体 strcpy(lf.lfFaceName, "宋体"); HFONT hf = CreateFontIndirectA(&lf); HDC hDC = CreateCompatibleDC(0); HFONT hOldFont = (HFONT)SelectObject(hDC, hf); int strBaseW = 0, strBaseH = 0; int singleRow = 0; char buf[1 << 12]; strcpy(buf, str); //处理多行 { int nnh = 0; int cw, ch; const char* ln = strtok(buf, "\n"); while (ln != 0) { GetStringSize(hDC, ln, &cw, &ch); strBaseW = std::max(strBaseW, cw); strBaseH = std::max(strBaseH, ch); ln = strtok(0, "\n"); nnh++; } singleRow = strBaseH; strBaseH *= nnh; } if (org.x + strBaseW < 0 || org.y + strBaseH < 0) { SelectObject(hDC, hOldFont); DeleteObject(hf); DeleteObject(hDC); return; } r = org.x + strBaseW > dst.cols ? dst.cols - org.x - 1 : strBaseW - 1; b = org.y + strBaseH > dst.rows ? dst.rows - org.y - 1 : strBaseH - 1; org.x = org.x < 0 ? 0 : org.x; org.y = org.y < 0 ? 0 : org.y; BITMAPINFO bmp = { 0 }; BITMAPINFOHEADER& bih = bmp.bmiHeader; int strDrawLineStep = strBaseW * 3 % 4 == 0 ? strBaseW * 3 : (strBaseW * 3 + 4 - ((strBaseW * 3) % 4)); bih.biSize = sizeof(BITMAPINFOHEADER); bih.biWidth = strBaseW; bih.biHeight = strBaseH; bih.biPlanes = 1; bih.biBitCount = 24; bih.biCompression = BI_RGB; bih.biSizeImage = strBaseH * strDrawLineStep; bih.biClrUsed = 0; bih.biClrImportant = 0; void* pDibData = 0; HBITMAP hBmp = CreateDIBSection(hDC, &bmp, DIB_RGB_COLORS, &pDibData, 0, 0); CV_Assert(pDibData != 0); HBITMAP hOldBmp = (HBITMAP)SelectObject(hDC, hBmp); //color.val[2], color.val[1], color.val[0] SetTextColor(hDC, RGB(255, 255, 255)); SetBkColor(hDC, 0); //SetStretchBltMode(hDC, COLORONCOLOR); strcpy(buf, str); const char* ln = strtok(buf, "\n"); int outTextY = 0; while (ln != 0) { TextOutA(hDC, 0, outTextY, ln, strlen(ln)); outTextY += singleRow; ln = strtok(0, "\n"); } uchar* dstData = (uchar*)dst.data; int dstStep = dst.step / sizeof(dstData[0]); unsigned char* pImg = (unsigned char*)dst.data + org.x * dst.channels() + org.y * dstStep; unsigned char* pStr = (unsigned char*)pDibData + x * 3; for (int tty = y; tty <= b; ++tty) { unsigned char* subImg = pImg + (tty - y) * dstStep; unsigned char* subStr = pStr + (strBaseH - tty - 1) * strDrawLineStep; for (int ttx = x; ttx <= r; ++ttx) { for (int n = 0; n < dst.channels(); ++n) { double vtxt = subStr[n] / 255.0; int cvv = vtxt * color.val[n] + (1 - vtxt) * subImg[n]; subImg[n] = cvv > 255 ? 255 : (cvv < 0 ? 0 : cvv); } subStr += 3; subImg += dst.channels(); } } SelectObject(hDC, hOldBmp); SelectObject(hDC, hOldFont); DeleteObject(hf); DeleteObject(hBmp); DeleteDC(hDC); }
调用时替换原有的 cv:putText
paDrawString(*show_img, labelstr, pt_text, black_color, 12, 0, 0); //cv::putText(*show_img, labelstr, pt_text, cv::FONT_HERSHEY_COMPLEX_SMALL, font_size, black_color, 2 * font_size, CV_AA);
yarn VS npm 的优势
安装速度快 。
- 并行安装:无论 npm 还是 Yarn 在执行包的安装时,都会执行一系列任务。npm 是按照队列执行每个 package,也就是说必须要等到当前 package 安装完成之后,才能继续后面的安装。而 Yarn 是同步执行所有任务,提高了性能。
- 离线模式:如果之前已经安装过一个软件包,用Yarn再次安装时之间从缓存中获取,就不用像npm那样再从网络下载了。
- 安装版本统一:为了防止拉取到不同的版本,Yarn 有一个锁定文件 (lock file) 记录了被确切安装上的模块的版本号。每次只要新增了一个模块,Yarn 就会创建(或更新)yarn.lock 这个文件。这么做就保证了,每一次拉取同一个项目依赖时,使用的都是一样的模块版本。npm 其实也有办法实现处处使用相同版本的 packages,但需要开发者执行 npm shrinkwrap 命令。这个命令将会生成一个锁定文件,在执行 npm install 的时候,该锁定文件会先被读取,和 Yarn 读取 yarn.lock 文件一个道理。npm 和 Yarn 两者的不同之处在于,Yarn 默认会生成这样的锁定文件,而 npm 要通过 shrinkwrap 命令生成 npm-shrinkwrap.json 文件,只有当这个文件存在的时候,packages 版本信息才会被记录和更新。
- 更简洁的输出:npm 的输出信息比较冗长。在执行 npm install <package> 的时候,命令行里会不断地打印出所有被安装上的依赖。相比之下,Yarn 简洁太多:默认情况下,结合了 emoji直观且直接地打印出必要的信息,也提供了一些命令供开发者查询额外的安装信息。
- 多注册来源处理:所有的依赖包,不管他被不同的库间接关联引用多少次,安装这个包时,只会从一个注册来源去装,要么是 npm 要么是 bower, 防止出现混乱不一致。
- 更好的语义化: yarn改变了一些npm命令的名称,比如 yarn add/remove,感觉上比 npm 原本的 install/uninstall 要更清晰。
FFMpeg 提取关键帧命令
ffmpeg.exe -i D:\DShare\f2.mp4 -vf select=’eq(pict_type\,I)’,setpts=’N/(25*TB)’ D:\DShare\output\%09d.jpg
Anaconda 安装 tensorflow
Anaconda 安装 tensorflow
pip install –upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple –ignore-installed tensorflow
Anaconda 安装 tensorflowGPU
pip install –upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple –ignore-installed tensorflow-gpu
Ubuntu 16.04下 CPU 性能模式切换
查看CPU当前频率
cat /proc/cpuinfo | grep MHz
1、安装cpufrequtils:
sudo apt-get install cpufrequtils
2、查看当前cpu的状态:
cpufreq-info
3、把cpu调整到性能模式:
sudo cpufreq-set -g performance
使用上述方式,重启系统后又回到默认方式。修改默认模式:
1、安装sysfsutils
sudo apt-get install sysfsutils
2、编辑/etc/sysfs.conf ,增加如下语句:
devices/system/cpu/cpu0/cpufreq/scaling_governor = performance
可选的有
1. performance:CPU维持最高时脉运行。
2. ondemand:程序运行时,直接调高时脉运行。(但不一定是调到最高,而是依程式需求)。没有运行时,调低时脉。
3. conservative:同上,但调整的方式,是一阶一阶地调整,而非直接调整。
4. powersave:CPU维持最低时脉运行
5. userspace:是由使用者自己定义,需要安装其他软件管理
关于NuiTrack 的初始化 ColorSensor.GetOutputMode()数据异常
NuiTrack 的初始化时,必须先初始化DepthSensor,再初始化ColorSensor 的数据才正确,也许是SDK的BUG吧
public class NuiTest : MonoBehaviour
{
nuitrack.ColorSensor colorSensor;
nuitrack.DepthSensor depthSensor;
void Start()
{
nuitrack.Nuitrack.Init();
depthSensor = nuitrack.DepthSensor.Create();//////////////////// 没有这句话下面的数据是乱的
colorSensor = nuitrack.ColorSensor.Create();
Debug.Log(“CSLX:” + colorSensor.GetOutputMode().XRes + “,Y:” + colorSensor.GetOutputMode().YRes);
nuitrack.Nuitrack.Run();
}
void OnDestroy()
{
colorSensor.Release();
depthSensor.Release();
nuitrack.Nuitrack.Release();
Debug.Log(“Closing”);
}
}
先提交到官网吧
https://community.nuitrack.com/t/colorsensor-create-before-depthsensor-would-make-something-dirty/909
博客搬迁成功
终于将博客移出新浪云了,WordPress 的导入与导出功能实在太赞,直接导出成xml 中间文件再导入进新的WordPress 里就行了。
主题是一直用的ProwerV6主题的主题,迁移过来的时候因为版本问题费了小点劲。
为什么不换?因为真的喜欢这种简约风格的主题啊 ,友情@一下 prower.cn ProwerV6
Anyway,自从新浪云的MySQL服务各种坑以后,云豆一下两下跑得飞快,限制了云豆嘛,大部分时间是不能访问的,比阿里云/腾讯云还要贵,真的是很蛋疼,拜托,你那是半阉割的PaaS云好不好。
终于清静了,可以再次更新自己的博客了