潇洒与从容

现代人已经很少再说“潇洒”一词,那仿佛只出现武侠与诗词中;现代人说某某潇洒,总带着一股子鄙夷与不屑,只是比“放荡形骸”程度轻一些。

我们为什么不能潇洒一点?压力。这是现代人脱口而出的词。为扮各种角色,需正襟危坐,或道貌岸然,或低声下气,此为压力之一。或为家庭,或为私念,或为“理想”,忍一时之不快,望明日之宽余,此为压力之二。纵是腰酸背痛,依旧任劳任怨。

何苦?!何必?!

立身,冲一杯咖啡,品质不重要,品牌不重要,器皿不重要,细呷牛饮皆可,要的是一份闲适与需要。就是想喝咖啡了,手头有,已很幸福,哪需要那么多条件。多了许多前提,待一切准备就绪,或许都不想喝,这本来就失去了原始的乐趣。没有乐趣,喝什么又有什么区别?

现代说从容,仿佛与年龄和地位相关。老者多从容?位高更从容?未必!从容与心态相关。开车的时间多了,反倒觉得走路是一种奢侈。虽说时间翻倍,但也不觉有何损失。早出门一点,路上步子慢一点,看看匆匆而过的路人,原来不是每一个都是面无表情;细心去听,城市的各种声响有着自己的节奏。留心脚下,发现昨天那个位子还停着那辆车,满是泥尘,车胎发瘪,试着编一编车主人发生的故事,也挺有趣。

发现点滴乐趣,从点滴中发现乐趣,从学习潇洒与从容开始。

随遇而安,接受生活

过去的一年,说实话,有些累。一个“奢侈”的春节假期过去,这几日闲来无事,痛快地读了好几本书,汲了些养分,多了几分感悟。终于可以静下来写点东西,整理好心情,回顾往昔,展望明日。

与长者语,最大的收获是这四个字–随遇而安。想起前几日写的四句打油诗:人生如此凶险, 何必目光短浅。看淡人情冷眼,还请诸君自勉。竟是如此契合。生活的智慧总是如此难得,不经历不可得,不烦恼无清悠。

过去自已总在跟自己较劲,不禁两鬓华发,连体检的老医生也劝说,“小伙子,豁达一些,不要劳心过剩”。劳心者劳力,总是试图做到最好,却时常事与愿违,以至于心力交瘁,心虚气短。老父叮嘱,”新的一年,休息好,身体养好”。是的,自己不好,怎能有力去爱人。境由心生,心没有养好,发乎表,现于形,养心修性就是这个道理吧。

蔡澜说他父亲教给三条原则:守时,重友情,做事有责任。很是受用。做好自己,一切自然来。做好自己,看云淡风轻。对已守时,决定之事即刻开始,不拖延,不放松。既是决定之事,必然爱之;爱之全情投入,哪来压力之说。决定之事包括爱人,教子,习字和喝茶。对人守时,必重诺。博人一信,好运自然来。纵然有不如意,也看作生活的馈赠,没有一二,何来八九。重友情,重点要情字上,可作同窗同事,也可作家人,朋友,甚至推及陌生人。用心去爱,主动去爱。生活是镜子,总是给我脸上同样的表情。所以,从下一次主动给陌生人一个的招呼,一个微笑开始。做事有责任,讲的处世哲学。所做之事,予人结果,于己练心,对人对己,都要对得起。每次都是“麻烦终结者”,才会有更多的“麻烦”找上来。

从新出发,从心出发。每一件事,看作一个练习。好好利用每一寸光阴,每一次机会,学会豁达,学会接受。

随遇而安,接受生活。

用python生成时间列表

Q: 计算2017-02-22到2017-04-02的时间列表

A:   

from datetime import timedelta, date
def get(start,end): # get("2017-02-24","2017-04-02")
    #startList = start.split('-')
    #start_day = date(int(startList[0]),int(startList[1]),int(startList(2))
    #end_day = date(int(startList[0]),int(startList[1]),int(startList(2))
    start = date(2017,2,22)
    end = date(2017,4,2)
    delta = timedelta(days=1)
    ndays = abs(end-start).days
    b = []
    for i in range(ndays):
        newday = start + delta
        aa = newday.isoformat()
        b.append( aa )
        start = newday

    return b

用VBA实现B1=A1+B1

做会计的人让我帮忙解决一个问题:

假如现在B1单元格的数是100,我在A1里输入50,回车后,B1的数值就累加到150了,下次我再到A1里输入20,B1单元格里数值又累加到170了

看似简单的问题,其实excel的基本功能是不能实现,需要编程。直接给出答案:

1. 点击”文件->选项->保存”,选择”Excel启用宏的工作薄(*.xlsm)”

2. Alt+F11,打开”sheet x”.

3.写入代码:

  

Private Sub Worksheet_Change(ByVal Target As Range)
For i = 1 To 50
If Target.Address = Cells(i, 1).Address Then
Range(Cells(i, 2).Address) = Range(Cells(i, 2).Address) + Target.Value
End If
Next
End Sub

以上对问题作了一点扩展,即可实现从1到50行的同样的功能。

提出问题的人最后没有说声谢谢,还说”你应该感谢我”让你多学了一门语言,

借kaldi来理解softmax

nnet-forward --feature-transform=final.feature_transform --no-softmax=false final.nnet scp:1.scp ark,t:output.ark.txt

final.feature_transform, final.nnet均由训练而来。final.feature_transform是对输入特征做转换,作为final.nnet的输入。

final.nnet是最后一层是softmax层,可以由–no-softmax这个参数来指定。

1.scp是输入特征文件的索引,为简单起见,只用一个特征文件。

ark,t:output.ark.txt将输出转成文本文件并输出到output.ark.txt中。这是一个m x n的矩阵,m是输入特征的帧数,n是final.nnet的输出状态数(这里是3000)。

选其中一帧的输出来理解softmax

sed -n '10p' output.ark.txt > 1.txt

(1)–no-softmax=false,做softmax

nnet-forward --feature-transform=final.feature_transform --no-softmax=false final.nnet scp:1.scp ark,t:output.ark.txt
sed -n '10p' output.ark.txt > 1.txt 
awk '{print NF}' 1.txt

显示是应该就是用nnet-info final.nnet看到的最后一层的值:3000

awk 'BEGIN{total=0.0}{for(i=1;i<=NF;i++)total += $i}END{print total}' 1.txt

这时应该看到就是1,说明softmax是起作用的。再看1.txt里应该是3000个特别小的数。

(2). –no-softmax=true,不做softmax

nnet-forward --feature-transform=final.feature_transform --no-softmax=true final.nnet scp:1.scp ark,t:output.ark.txt
sed -n '10p' output.ark.txt > 2.txt

再看2.txt中的内容,应该是非常大的不规整的值。大于1数有很多。

(3). 运行softmax算法将2.txt转成1.txt

算法描述:

    1. 找出3000个数中的最大值qMax。

    2. 将每一值转成Xi=exp(Xi-qMax), 并累加到qSum

    3. 将每一值转成Xi/qSum

用python实现:

import sys
import math

qList = open(sys.argv[1],'r').readline().split()
print len(qList)

qMax = 0.0
for i in range(len(qList)):
    cur = float(qList[i])
    if cur>qMax:
        qMax = cur

print qMax
qSum = 0.0
for i in range(len(qList)):
    cur = float(qList[i])
    qList[i] = math.exp(cur-qMax)
    qSum += qList[i]

print qSum
fout = open(sys.argv[2],'w')
for i in range(len(qList)):
    qList[i] = qList[i]/qSum
    fout.write('%g\t' % qList[i])

fout.write('\n')
fout.close()

以上只是为了描述算法,效率不做考虑。

python softmax.py 2.txt 2_sm.txt

(4)比较1.txt, 2_sm.txt的值,日常接近,小有差异可能是python的数据转换带来的,对于算法的正确性没有影响。


kaldi中的代码实现:

./src/matrix/kaldi-matrix.cc

template<typename Real>
Real MatrixBase<Real>::ApplySoftMax() {
  Real max = this->Max(), sum = 0.0;
  // the 'max' helps to get in good numeric range.
  for (MatrixIndexT i = 0; i < num_rows_; i++)
    for (MatrixIndexT j = 0; j < num_cols_; j++)
      sum += ((*this)(i, j) = Exp((*this)(i, j) - max));
  this->Scale(1.0 / sum);
  return max + Log(sum);
}

cannot find -lgcc_s

问题:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4.4.7/libgcc_s.so when searching for -lgcc_s
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4.4.7/libgcc_s.so when searching for -lgcc_s
/usr/bin/ld: cannot find -lgcc_s

解决办法:

yum install -y libgcc.i686

用链表实现基数排序

#include <stdio.h>
#include <stdlib.h>
typedef struct Node *PtrToNode;
typedef PtrToNode List;
struct Node{
	int value;
    PtrToNode Next;
};
enum Index {Gewei=1,Shiwei=10,Baiwei=100};
typedef enum Index Index;

void Delete(PtrToNode p[]);
void PrintList(PtrToNode p[]);
void CopyNode2Arr(PtrToNode p[],int a[]);
void LoadArr2NodeList(PtrToNode p[],int a[],int length,Index nIndex);
int *Sort(PtrToNode p[],int a[],int length, int iterNum);

void LoadArr2NodeList(PtrToNode p[],int a[],int length,Index nIndex)
{
	int i;
	int bitNum;
	PtrToNode tmpCell,yun;

	for(i=0;i<length;i++){
		bitNum = a[i] /nIndex % 10;
		tmpCell = malloc(sizeof(struct Node));
		tmpCell->value = a[i];
		tmpCell->Next = NULL;
		if(p[bitNum]->Next == NULL)
			p[bitNum]->Next = tmpCell;
		else
		{
			yun = p[bitNum];
			while(yun->Next != NULL)
				yun = yun->Next;
			yun->Next = tmpCell;
		}
	}

}

void CopyNode2Arr(PtrToNode p[],int a[]){
	PtrToNode yun;
	int i=0;
	int j;
	for(j=0;j<10;j++){
		if(p[j]->Next != NULL){
			yun = p[j];
			while(yun->Next != NULL){
				yun = yun->Next;
				a[i] = yun->value;
				i++;
			}
		}
	}
}

void PrintList(PtrToNode p[])
{
	int i;
	PtrToNode yun;
	for (i=0;i<10;i++){
		printf("%d:",i);
		if(p[i]->Next != NULL){
			yun = p[i];
			while(yun->Next != NULL){
				yun = yun->Next;
				printf("%d\t",yun->value);
			}
		}
		printf("\n");
	}
	printf("\n");
}

void Delete(PtrToNode p[])
{
	PtrToNode yun,tmpCell;
	int i;

	for(i=0;i<10;i++){
		yun = p[i]->Next;
		p[i]->Next = NULL;
		while(yun != NULL){
			tmpCell = yun->Next;
			free(yun);
			yun = tmpCell;
		}
	}
}

/*
 * @ length: length of a
 * @ iterNum: wei num of max
 */
int *Sort(PtrToNode p[],int a[],int length, int iterNum)
{
	LoadArr2NodeList(p,a,length,Gewei);
	PrintList(p);
	CopyNode2Arr(p,a);
	Delete(p);
	
	LoadArr2NodeList(p,a,length,Shiwei);
	PrintList(p);
	CopyNode2Arr(p,a);
	Delete(p);

	LoadArr2NodeList(p,a,length,Baiwei);
	PrintList(p);
	CopyNode2Arr(p,a);
	Delete(p);

	return a;
}

int
main(int argc, char *argv[])
{
	PtrToNode p[10];
	int i;
	PtrToNode tmp;
	int *result;
	int a[12] = {2,512,34,315,256,65,108,99,11,234,78,89};
	for(i=0;i<10;i++){
		tmp = malloc(sizeof(PtrToNode));
		tmp->Next = NULL;
		p[i] = tmp;
	}
	result = Sort(p,a,12,3);
	for(i=0;i<12;i++)
		printf("%d\t",*(result+i));
	printf("\n");
}
结果如下:
0:
1:11	
2:2	512	
3:
4:34	234	
5:315	65	
6:256	
7:
8:108	78	
9:99	89	

0:2	108	
1:11	512	315	
2:
3:34	234	
4:
5:256	
6:65	
7:78	
8:89	
9:99	

0:2	11	34	65	78	89	99	
1:108	
2:234	256	
3:315	
4:
5:512	
6:
7:
8:
9:

2	11	34	65	78	89	99	108	234	256	315	512

CentOS6.2自动发邮件

需求:

    1.    每天自动统计信息。

    2.    每天自动发邮件给某些地址

难点:

    1.    自动任务定义

    2.    自动发送的配置

步骤:

    1.    把脚本加入到crontab中

crontab -e
0 8 * * * /home/orangespeech/autoReport.sh

    以上命令是每天8点自动运行autoReport.sh

    2.    安装sendmail

yum -y install sendmail

    3.    配置/etc/mail/sendmail.mc

    更改

    LOCAL_DOMAIN(`localhost.localdomain’)dnl

    为

    LOCAL_DOMAIN(`smtp.xxx.com’)dnl

    4.    配置/etc/hosts

    更改 127.0.0.1和::1两行为

    127.0.0.1   stmp.xxx.com localhost localhost.localdomain localhost4 localhost4.localdomain4

    ::1             stmp.xxx.com localhost localhost.localdomain localhost4 localhost4.localdomain4

    5.    把发送邮件的命令放在autoReport.sh中

echo "test" | mail -s "Report" sss@xxx.com

    以上命令是发送一个主题是”Report”,内容为”test”的邮件给sss@xxx.com

Bravo

如果收不到邮件,看/var/log/maillog