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

初始化PostgreSql

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

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

# 初始化数据库
initdb -D /usr/local/var/postgresql@10 -E UTF-8 --locale=C -U postgres -W

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

创建启动、停止脚本

#! /bin/bash

PGDATA=/usr/local/var/postgresql@10
PGLOG=/usr/local/var/postgresql@10/logfile

function start_postgresql(){
    pg_ctl -D ${PGDATA} -l ${PGLOG} start
}

function restart_postgresql(){
    pg_ctl -D ${PGDATA} restart -s -m fast
}

function stop_postgresql(){
    pg_ctl -D ${PGDATA} stop -s -m fast
}

function status_postgresql(){
    pg_ctl -D ${PGDATA} status
}

action=$1

case "$action" in 
start)
    start_postgresql
    ;;
restart)
    restart_postgresql
    ;;
stop)
    stop_postgresql
    ;;
status)
    status_postgresql
    ;;
*)
    echo -e "\033[1;36mUsage: pgsql start|restart|stop|status"
esac

设置脚本权限

chmod u+x pgsql.sh

启动、停止、重启、查看状态

./pgsql.sh start
./pgsql.sh stop
./pgsql.sh restart
./pgsql.sh status

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 ,那么需要将其删除掉。

测试

设定测试内容

Install HomeBrew in Mac

HomeBrew是Mac下类型于Centos下但Yum包管理工具,使用Mac作为开发平台,使用HomeBrew是非常有必要的。

你可以在https://brew.sh/index_zh-cn这里找到更多关于HomeBrew的使用技巧。

安装HomeBrew

拷贝如下命令行在终端中执行。

# 安装Xcode
xcode-select --install

# 安装HomeBrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

# 检查
brew doctor

# 更多命令
brew --help

镜像加速

注:该镜像是 Homebrew 二进制预编译包的镜像。本镜像站同时提供 Homebrew 的 formula 索引的镜像(即 brew update 时所更新内容),请参考 Homebrew 镜像使用帮助。

# 临时替换
export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.cloud.tencent.com/homebrew-bottles
# 永久替换
echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.cloud.tencent.com/homebrew-bottles' >> ~/.bash_profile
source ~/.bash_profile
# 永久替换
echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.cloud.tencent.com/homebrew-bottles' >> ~/.zshrc
source ~/.zshrc

更新 Homebrew

要获取最新的包的列表,首先得更新 Homebrew 自己。这可以用 brew update 来达到更新自身到目的。

更新包 (formula)

更新之前,可以使用 brew outdated 查看哪些包可以更新。Homebrew 会安装新版本的包,但旧版本仍然会保留。

# 更新所有的包
brew upgrade

# 更新指定的包
brew upgrade $FORMULA

锁定不想更新的包

如果经常更新的话,brew update 一次更新所有的包是非常方便的。但有时候会担心自动升级把一些不希望更新的包更新了。数据库就属于这一类,尤其是 PostgreSQL 跨 minor 版本升级都要迁移数据库的。我们更希望找个时间单独处理它。这时可用 brew pin 去锁定这个包,然后 brew update 就会略过它了。

# 锁定某个包
brew pin $FORMULA

# 取消锁定
brew unpin $FORMULA

清理旧版本

新版本安装了,旧版本就不需要了。我会用 brew cleanup 清理旧版本和缓存文件。Homebrew 只会清除比当前安装的包更老的版本,所以不用担心有些包没更新但被删了。

# 清理所有包的旧版本
brew cleanup

# 清理指定包的旧版本
brew cleanup $FORMULA

# 查看可清理的旧版本包,不执行实际操作
brew cleanup -n 

彻底卸载

brew uninstall formula_name --force

Mybatis 插入或更新数据

在日常的开发中,我们经常会遇到这样的需求,我们有一个存储主数据的表,当有新的数据写入的时候,若库中存在数据则更新,否则当作新的数据写入。

一般情况下,我们会先对数据库进行一次Select,若数据存在我们则执行更新操作,当然这种方法在大部分情况下是可行的,但数据量大或者数据写入频繁的时候,这种方法就表现出来它的不稳定。

其实在数据库中都提供了UNIQUE约束规则,我们可以在数据库中建立UNIQUE约束规则,这样我们在插入具有约束限制数据的时候,我们就会得到一个异常,我们可以捕获这个异常,在异常块中进行更新操作。

在Mysql中我们可以使用更加简单的方式,Mysql提供了这样一个方法on duplicate key update可以让数据库直接搞定数据的插入或更新。

首先在数据库中创建约束

create unique index mytest_uindex on table (fieldA, FieldB);

编写SQL语句

insert into table (fieldA, filedB)) values ('a', 'b') on duplicate key update filedA = a1, fieldB = a2;

这样一波操作下来,你会神奇的发现,原来可以如此简单。。

该方法会删除掉已有数据,再进行插入,具体可以观察数据的自增ID。

具体用法可以查看这里:https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html