maven 打包时间戳问题

maven 打包时,可以生成时间戳属性,利用该属性来组装包名。

<version>5.0.${build.time}B</version>
<properties>
  <maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format>
</properties>

对资源文件开启 filtering 功能,资源文件中的 POM 变量在打包过程中会被自动替换。在 java 代码中访问 properties 资源文件,就可以取到版本号。

<resource>
  <directory>src/main/resources</directory>
  <filtering>true</filtering>
</resource>

但是,这个时间戳属性有个问题,生成的时间 ${maven.build.timestamp} 是 UTC 时间,无法修改时区。网上找到一个办法,可以用插件解决这个问题。

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>build-helper-maven-plugin</artifactId>
  <version>1.8</version>
  <executions>
    <execution>
      <id>timestamp-property</id>
      <goals>
        <goal>timestamp-property</goal>
      </goals>
      <configuration>
        <name>build.time</name>
        <pattern>yyyyMMdd'.'HHmm</pattern>
        <timeZone>GMT+8</timeZone>
      </configuration>
    </execution>
  </executions>
</plugin>

该插件生成的属性 ${build.time} 已经是本地时区。

但是,在 IDEA 中, Build Projects ,再 Build Artifacts... ,属性文件中的 ${project.version} 并没有被替换。

摸索了一阵,发现 IDEA Build Projects 并不会调用 maven 生命周期,导致 plugin 不被执行。虽然 maven 自带变量可以被替换,但是自定义变量却不会被替换。

使用工具按钮的 maven install 打包,资源中的变量可以被正常替换。

还有一个方法,可以将 IDEA 的 Build 与 maven goal 绑定起来:

bind maven goal

图1  绑定 maven goal

mysql 占用 cpu 高问题分析

  • htop 查看 cpu 占用情况 mysql 占用了 95% 以上的 cpu 资源,java 占用 cpu 不多。
  • 查看 mysql 进程列表,未发现明显异常

    mysql -u root -p
    show processlist;
    
  • 将查询时间在 1 秒以上的 sql 语句记录到 log 中

    set global slow_query_log=1;
    set global long_query_time=1;
    set global slow_query_log_file="/var/log/mysql/slow-queries.log";
    
  • 查看 log,发现部分 sql 语句查询时间竟然有半分多钟

在 linode ubuntu 中开启 BBR

网上的解决方案,大多要求替换 linode 定制 kernel,换成原生 kernel,在控制面板中选择 grub2 启动方式。无意中看到这个解决方案, 提到可以直接在定制的 linode linux kernel 4.9.7 中,打开 BBR 功能。这就简单多了,试了一下, 网速好像真有提高。

echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p

C++ do’s and don’ts

do’s

  • 头文件中尽量使用前置声明
  • 可继承类的析构函数一定是虚函数

don’ts

  • 构造函数中不能调用虚函数

在 orgmode 中粘贴截图

用 org2blog 写博客有一段时间了,但是从来都不在文章中加配图。因为一直没有找到好的办法,可以在 orgmode 中粘贴并管理图片。

这个问题还是要解决的,在网上搜了一圈解决方案。一个办法是使用命令行截图软件,将图片保存到指定位置,然后在 orgmode 中插入路径。我平时使用 picpick 这个截图软件,不想更换其它软件,所以不采用这个方案。

最后在 stackoverflow 上找到一个方法, 先用 C# 写一个小程序,从剪切板中将图片保存到指定路径,然后在 orgmode 中插入这个路径。这个方法可以与 picpick 软件可以配合使用,感觉不错,决定试一下。

  • 用 VS2005 新建一个 C# Windows Program 项目,命名为 CbImage2File
  • 删除 Form1.cs
  • 修改 program.cs 文件
using System;
using System.Collections.Generic;
using System.Text;

namespace CbImage2File
{
    static class Program
    {
        private static int FAILURE = 1;

        private static void Failure(string description)
        {
            Console.Error.WriteLine("Clipboard does not contain image data");
            Environment.Exit(FAILURE);
        }

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            System.Drawing.Image image = System.Windows.Forms.Clipboard.GetImage();

            if (image == null)
            {
                Failure("Clipboard does not contain image data");
            }

            if (args.Length == 0)
            {
                Failure("You have not specified an output path for the image");
            }

            if (args.Length > 1)
            {
                Failure("You must only specify a file path (1 argument)");
            }

            string filePath = args[0];
            System.IO.DirectoryInfo folderInfo = new System.IO.FileInfo(filePath).Directory;

            if (!folderInfo.Exists)
            {
                System.IO.Directory.CreateDirectory(folderInfo.FullName);
            }

            image.Save(filePath);
        }
    }
}
  • 编译 release 版本,得到 CbImage2File.exe
  • myconfig/package.el 中增加
;;;###autoload
(defun org-insert-image-from-clipboard ()
  (interactive)
  (let* ((home-dir "d:/cygwin/home/fj/")
         (relative-dir "org/image")
         (attachments-dir (concat home-dir relative-dir))
         (png-file-name (format-time-string "%Y%m%d_%H%M%S.png"))
         (png-path (concat attachments-dir "/" png-file-name))
         (relative-path (concat relative-dir "/" png-file-name))
         (temp-buffer-name "CbImage2File-buffer"))
    (call-process "D:/tools/CbImage2File.exe" nil temp-buffer-name nil png-path)
    (let ((result (with-current-buffer temp-buffer-name (buffer-string))))
      (progn
        (kill-buffer temp-buffer-name)
        (if (string= result "")
            (progn 
              (insert (concat "[[~/" relative-path "]]"))
              ;(org-display-inline-images)
              )
          (insert result))))))

测试图片

图1  这是一张测试图片