不要太感性

执念不要有。

一切需看开。

做好份内事。

对自己不必要求太高。

以德报怨,何以报德?故,以直抱怨。

没有什么是永恒的,也没有什么是应该的。

所有的东西都是争取来的,而不是被给予的。

凡事太尽,缘分势必早尽。

Just Several Quotes to Share

Just in case that I lost them, so I have to write them down.
I think these are meaningful, they're short, but somehow give me strengh and peace.

Here you are:

如果想征服生命中的焦虑,活在当下,活在每一个呼吸里。——马特·海格《活下去的理由》

翅膀长在你的肩上,太在乎别人对于飞行姿势的批评,所以你飞不起来。——卡森·麦卡勒斯《伤心咖啡馆之歌》

你没有走错路,你是在等待风的到来。——伊吹有喜《等风的人》

杂乱无章的天空下有大片麦田,我没有必要表达悲伤和孤独。——文森特·梵高《亲爱的提奥》

生活优雅的人,将环境布置成看得见的灵魂翻版。——胡里奥·科塔萨尔《动物寓言集》

算法导论-动态规划-笔记

动态规划:找其中一个最优解
4个步骤来设计
1.刻画一个最优解的结构特征
2.递归地定义最优解的值
3.计算最优解的值,通常是自底向上的方法
4.构造解

适合用动态规划求解的最优化问题,应具备两个要素:
最优子结构、子问题重叠

对于不同问题领域,最优子结构的不同 体现在两个方面:

  1. 原问题的最优解中涉及多少个子问题
  2. 在确定最优解使用哪些子问题时,我们需要考察多少种选择

动态规划 vs 贪心算法
能够应用贪心算法的问题也必须具有最优子结构性质。两者不同之处是:
动态规划,首先寻找子问题的最优解,然后在其中选择
贪心算法,首先做一次“贪心”选择————在当时(局部)看来最优的选择————然后求解选出的子问题,从而不必求解所有可能相关的子问题

贪心算法两个关键要素:
贪心选择性质
最优子结构

GO SQL MySQL driver解读

GO标准库中的database/sql搭配社区开源的mysql驱动go-sql-driver/mysql,是我们常用的组合。

标准库实现了什么

Package sql provides a generic interface around SQL (or SQL-like) databases.
抽象了统一的连接、读写、事务等操作,负责调用实际的driver与特定的数据库交互(比如MySQL、SQLlite、Oracle等)
database/sql库维护了数据库连接池,它并发安全,可供多个协程并发调用。

driver实现了什么

与具体的数据库的交互过程

怎么用

用户代码直接调用标准库,同时指明使用哪个driver,使用之前要先注册driver

import (
"database/sql"
"time"

_ "github.com/go-sql-driver/mysql"
)

// ...
db, err := sql.Open("mysql", "user:password@/dbname")
if err != nil {
    panic(err)
}
// See "Important settings" section.
db.SetConnMaxLifetime(time.Minute * 3)
db.SetMaxOpenConns(10)
db.SetMaxIdleConns(10)

proftpd配置备忘

proftpd看似很简单、很强的ftp服务器,但是想快速配置、运行起来,却不太直观。

我的两个使用场景:
1.Mac开发 FTP代码同步到Linux开发机,在服务器中运行程序
2.给其他人共享一些文件

./configure
make
make install
三步骤完成后,怎么配置,才能正常跑起来?
这里分享一个同事写的shell脚本,命名为init.sh

#!/bin/sh

CURPATH=`cd $(dirname $0);pwd`

authmsg=$(id)

#uid=506(quanjing)
suid=$(echo $authmsg|awk -F' ' '{print $1}')
#gid=505(map)
sgid=$(echo $authmsg|awk -F' ' '{print $2}')

uid=$(echo $suid | awk -F'=' '{print $2}' | awk -F'(' '{print $1}')
gid=$(echo $sgid | awk -F'=' '{print $2}' | awk -F'(' '{print $1}')

uname=$(echo $suid | awk -F'(' '{print $2}' | awk -F')' '{print $1}')
gname=$(echo $sgid | awk -F'(' '{print $2}' | awk -F')' '{print $1}')


echo "uid $uid uname $uname gid $gid gname $gname";

proconf="$CURPATH/etc/proftpd.conf"

## 替换配置文件
function editconf()
{
opt="$1"
#sed -i "s/^.$opt[[:space:]]*.*/$opt     $2/" $proconf
sed -i "s#^\s*[#]*\s*$opt\s.*#$opt      $2#" $proconf
#echo "sed -i \"s/^\s*[#]*\s*$opt\s*.*/$opt $2/\" $proconf"
}

editconf "User"   "$uname"
editconf "Group"  "$gname"

editconf "DefaultRoot"  "$HOME"

editconf "AuthUserFile"        "$CURPATH/var/ftpd.passwd"
editconf "AuthGroupFile"       "$CURPATH/var/ftpd.group"
editconf "UserAlias"           "anonymous ftp $uname"

# 处理UID
bin/ftpasswd --home $HOME --name $uname --group $gname --shell /bin/bash --file $CURPATH/var/ftpd.group --uid $uid --gid $gid
bin/ftpasswd --home $HOME --name $uname --passwd $uname --shell /bin/bash --file $CURPATH/var/ftpd.passwd --uid $uid --gid $gid

我们执行 sh init.sh 它做的事儿是:
通过调用ftpasswd命令、替换默认配置文件,以当前用户作为ftp的用户

最后 sh start.sh启动服务

#!/bin/sh
CURDIR=`cd $(dirname $0);pwd`
export LD_LIBRARY_PATH=$CURDIR/lib:$LD_LIBRARY_PATH
nohup sbin/proftpd -c $CURDIR/etc/proftpd.conf -n &

附件 proftpd.tar.gz.zip 是已编译好的proftpd,先后执行init.sh start.sh 可快速运行起来。

参考 http://ftp.proftpd.org/docs/