Author: Jalena

Centos/Mac 命令自动补全

常常使用tab来补全需要的命令参数,但在最小化安装系统的时候默认不安装,由于软件在epel库中,安装时先安装epel-release,再安装bash-completion,且需要重新建立bash环境。

yum -y install epel-release
yum -y install bash-completion
brew install bash-completion

Jackson反序列化 Y/N

Json表示布尔的标准形式是true和false,但在项目中也有使用0/1,或者Y/N来表示的。这时候就需要我们将其转换为布尔类型。

package utils;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

import java.io.IOException;

public class JsonCustomDeserializer extends JsonDeserializer<Boolean> {

	@Override
	public Boolean deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {

		JsonToken currentToken = jsonParser.getCurrentToken();

		if (currentToken.equals(JsonToken.VALUE_STRING)) {
			String text = jsonParser.getText();

			if ("X".equals(text)) {
				return Boolean.TRUE;
			} else if ("".equals(text)) {
				return Boolean.FALSE;
			}

			throw deserializationContext.weirdStringException(text, Boolean.class, "Only X or null values supported.");
		} else if (currentToken.equals(JsonToken.VALUE_NULL)) {
			return Boolean.FALSE;
		}

		return deserializationContext.reportBadDefinition(Boolean.class, "Can't parse boolean value: " + jsonParser.getText());
	}

}

使用

@TableField("LVORM")
@JsonProperty(value = "LVORM", access = JsonProperty.Access.WRITE_ONLY)
@JsonDeserialize(using = JsonCustomDeserializer.class)
private boolean lvorm;

Install PostgreSql with brew

安装brew的文章请查看:https://jalena.bcsytv.com/archives/2298

版本选择

可以在 https://formulae.brew.sh/formula/postgresql#default 这里找到你需要的PostgreSql版本。本文章使用的是postgresql@10

安装及锁定版本

# 搜索需要的程序
brew search postgresql

# 安装程序
brew install postgresql@10 

# 锁定程序版本
brew pin postgresql@10

初始化设置

# 写入环境变量
echo 'export PATH="/usr/local/opt/postgresql@10/bin:$PATH"' >> ~/.bash_profile

# 让变量立即生效
source ~/.bash_profile

# 如果不想每次输入data目录路径,可以设置数据文件环境变量
echo 'export PGDATA="/usr/local/var/postgresql@10"' >> ~/.bash_profile

启动、使用

# 启动数据库
brew services start postgresql@10

# 停止数据库
brew services stop postgresql@10

# 重启数据库
brew services restart postgresql@10

# 查看当前运行的所有服务
brew services run --all

# 进入数据库
# 这种方式默认初始化的数据库账号为当前系统用户
# 默认的数据库为 postgres
psql postgres

设置快捷命令

vim ~/.bash_profile
alias pgst='brew services start postgresql@10'
alias pgsp='brew services stop postgresql@10'
alias pgrs='brew services restart postgresql@10'
source ~/.bash_profile

现在就可以在任何地方使用pgst来启动数据库了。

Gcc update

Linux @ CERN

首先,验证您正在使用的CentOS版本:

$ cat /etc/centos-release
CentOS release 6.7 (Final)

导入CERN的GPG密钥:

sudo rpm --import http://ftp.scientificlinux.org/linux/scientific/5x/x86_64/RPM-GPG-KEYs/RPM-GPG-KEY-cern

保存/etc/yum.repos.d/slc6-devtoolset.repo系统上的存储库信息:

wget -O /etc/yum.repos.d/slc6-devtoolset.repo http://linuxsoft.cern.ch/cern/devtoolset/slc6-devtoolset.repo

安装:

sudo yum install devtoolset-2

启用环境:

scl enable devtoolset-2 bash

测试环境:

$ gcc --version
gcc (GCC) 4.8.2 20140120 (Red Hat 4.8.2-15)
...

$ g++ --version
g++ (GCC) 4.8.2 20140120 (Red Hat 4.8.2-15)
...

$ gfortran --version
GNU Fortran (GCC) 4.8.2 20140120 (Red Hat 4.8.2-15)
...

可选:永久启用scl工具链,将其放入你的.bashrc(警告:不要尝试使用scl enable devtoolset-2 bash之前的.bashrc中的命令。这会生成一个新的bash shell,如果在你的.bashrc中,它会创建一个新的shell,它会加载你的.bashrc,它会创建一个新的shell,等等。)

source /opt/rh/devtoolset-2/enable

WinCe 6.0 DataGrid 绑定List数据源

最近在项目中,使用了老的掉牙的Windows CE作为开发基础。在实际项目使用中,我从后端通过RestFul接口获取数据,然后将数据通过JSON转为了实体类,然后直接绑定到了DataGird中。

问题接着就来了,在DataGrid中使用List<T>作为数据源的时候,我要自定义DataGridTableStyle的时候,需要设置MappingName,但各种资料翻完也没有找到如何设置这个值的信息。

通过Debug,原来设置List为数据源需要将MappingName设置为 List`1

经过反复测试,发现直接设置为 typeof(List).Name即可

参考代码

// 实体对应类
public class MTPDAOnTheShelfTaskQueryResp
{
    public ControlInfo ControlInfo { get; set; }
    public List<ITEM> ITEM { get; set; }
    public RETURN RETURN { get; set; }
}
// 初始化界面设定
private void StockInQuery_Load(object sender, EventArgs e)
{
    dateTimePickerStart.Value = DateTime.Now;
    dateTimePickerEnd.Value = DateTime.Now;

    // 设定 Style
    ColumnStyle[] columnStyles = new ColumnStyle[]{
                new ColumnStyle("MBLNR","任务单号",100),
                new ColumnStyle("MAKTX", "日期", 70),
                new ColumnStyle("MATNR", "创建人", 100)
            };
    CommonHandles.SetDataGridStyles(dataGrid, columnStyles, "List`1");
}

/// <summary>
/// 设置DataGird列样式
/// </summary>
/// <param name="dataGrid"></param>
/// <param name="styles"></param>
/// <param name="mappingName"></param>
public static void SetDataGridStyles(DataGrid dataGrid, ColumnStyle[] styles, string mappingName)
{
    dataGrid.TableStyles.Clear();

    DataGridTableStyle tableStyle = new DataGridTableStyle();
    tableStyle.MappingName = mappingName;
    foreach (ColumnStyle style in styles)
    {
        DataGridColumnStyle col = new DataGridTextBoxColumn();
        col.MappingName = style.MappingName;
        col.HeaderText = style.DisplayName;
        col.Width = style.Width;
        tableStyle.GridColumnStyles.Add(col);
    }

    dataGrid.TableStyles.Add(tableStyle);

    // 设置行头不可见
    dataGrid.RowHeadersVisible = false;
    //dataGrid.ColumnHeadersVisible = false;
}

// 数据绑定
if (!string.IsNullOrEmpty(result))
{
    StockInQueryRespnose respnose = JsonConvert.DeserializeObject<StockInQueryRespnose>(result);
    if (respnose.MT_PDA_On_The_Shelf_Task_Query_Resp.RETURN.MSGTYPE.Equals("E"))
    {
        MessageBox.Show(respnose.MT_PDA_On_The_Shelf_Task_Query_Resp.RETURN.MSGTXT, "警告", MessageBoxButtons.OK, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button1);
        return;
    }
    else if (respnose.MT_PDA_On_The_Shelf_Task_Query_Resp.RETURN.MSGTYPE.Equals("S"))
    {
        dataGrid.DataSource = respnose.MT_PDA_On_The_Shelf_Task_Query_Resp.ITEM;
    }
}

Odoo邮件配置

在项目中,我们通常会使用到消息通知。然而在Odoo中,它提供来多种方式,Email、备注、消息通知。

这里我们使用Email作为消息的通知方式,那么说到Email发送消息,首先就需要配置Email到发送服务SMTP。在什么都不设置都情况下,我们需要为每一个用户都Email去设置这样都配置。极其不方便。

这里就延伸出来Odoo发送邮件都几种方式。

简单发送

mail.catchall.domain不设置

直接用发送账号发出,发件人需要与发送账号相同或者是其同一账号下的其他别名,否则会被邮件系统拒绝,如SMTPSenderRefused: 501 mail from address must be same as authorization user test@bcsytv.com。

接收方也直接回复该真实地址,非常容易理解,属于最原始的模式,最适合做邮件通知这种只集成发送不用集成接收的情况

代理发送

mail.catchall.domain设置,mail.bounce.alias不设置

间接用postmaster-odoo账号代发出,发送账号需要具有该名称授权,否则也会被邮件系统拒绝,如SMTPSenderRefused: 501 mail from address must be same as authorization user postmaster-odoo@bcsytv.com。

接收方默认回复catchall专用地址,由于属于代发,且发件地址、代发地址、回复地址都可以不相同,第一次使用还会有些颠覆邮箱观,甚至某些客户端出于谨慎还会出现欺诈提醒,但这确是目前国内用的最多的务实模式。

反弹发送

mail.catchall.domain设置,mail.bounce.alias设置

间接用bounce地址代发出,如bounce+5-res.users-2@bcsytv.com或者bounce+5@bcsytv.com,其中+5为邮件流水号,-2为单据流水号,可见前者还是单据相关邮件,接收方也默认回复catchall专用地址,因为其涉及到邮件接收等相关知识,而且国内免费邮箱服务基本没有完美支持,本文将不深入探讨,待以后ODOO邮件接收集成的时候在讨论如何配合Postfix实现完美收发自如。

认识了Odoo支持都几种发送方式后,这里我们选择第二种。

配置Odoo默认域

设置默认域

设置发件服务器

设置——技术——发件服务器

设置邮件发送服务器

设置收件服务器

设置——技术——收件服务器

设置邮件接收服务器

设定系统参数

设置——技术——系统参数

设定系统参数

如果系统参数中存在 mail.bounce.alias ,那么需要将其删除掉。

测试

设定测试内容

Archives