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 的优势

      安装速度快 。

  1. 并行安装:无论 npm 还是 Yarn 在执行包的安装时,都会执行一系列任务。npm 是按照队列执行每个 package,也就是说必须要等到当前 package 安装完成之后,才能继续后面的安装。而 Yarn 是同步执行所有任务,提高了性能。
  2. 离线模式:如果之前已经安装过一个软件包,用Yarn再次安装时之间从缓存中获取,就不用像npm那样再从网络下载了。
  3. 安装版本统一:为了防止拉取到不同的版本,Yarn 有一个锁定文件 (lock file) 记录了被确切安装上的模块的版本号。每次只要新增了一个模块,Yarn 就会创建(或更新)yarn.lock 这个文件。这么做就保证了,每一次拉取同一个项目依赖时,使用的都是一样的模块版本。npm 其实也有办法实现处处使用相同版本的 packages,但需要开发者执行 npm shrinkwrap 命令。这个命令将会生成一个锁定文件,在执行 npm install 的时候,该锁定文件会先被读取,和 Yarn 读取 yarn.lock 文件一个道理。npm 和 Yarn 两者的不同之处在于,Yarn 默认会生成这样的锁定文件,而 npm 要通过 shrinkwrap 命令生成 npm-shrinkwrap.json 文件,只有当这个文件存在的时候,packages 版本信息才会被记录和更新。
  4. 更简洁的输出:npm 的输出信息比较冗长。在执行 npm install <package> 的时候,命令行里会不断地打印出所有被安装上的依赖。相比之下,Yarn 简洁太多:默认情况下,结合了 emoji直观且直接地打印出必要的信息,也提供了一些命令供开发者查询额外的安装信息。
  5. 多注册来源处理所有的依赖包,不管他被不同的库间接关联引用多少次,安装这个包时,只会从一个注册来源去装,要么是 npm 要么是 bower, 防止出现混乱不一致。
  6. 更好的语义化: 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云好不好。
终于清静了,可以再次更新自己的博客了