2015年2月23日 星期一

Rule of 72

How to remember rule of 72 rule?

1. Raise up right hand's middle finger
2. Flip all your 10 fingers up side down
3. The 7 and 2 are the numerator at the upper positor
4. Put the rate of return at the denominator
5. Division gives the number of year to get back the initial captial

2015年2月18日 星期三

A program to read CSV file with time elapsed reported


File:

"0#AU113554908=",6261,88,214
"![WTCL9700I6",4128,132,758
"/JNKO201504900.U",4007,115,575
"/2EH9675D5",4911,244,22


Code:
#include <iostream>
#include <fstream>
#include <iterator>
#include <sstream>
#include <vector>
#include <string>
#include <ctime>

using namespace std;

class CSVRow
{
public:
string const& operator[](size_t index) const
{
return vTokens[index];
}
size_t size() const
{
return vTokens.size();
}
void readNextRow(istream& str)
{
string line;
getline(str, line);

stringstream lineStream(line);
string token;

vTokens.clear();
while(getline(lineStream, token, ','))
{
vTokens.push_back(token);
}
}
private:
vector<string> vTokens;
};

istream& operator>>(istream& str, CSVRow& data)
{
data.readNextRow(str);
return str;
}

class Timer
{
string s;
clock_t t;
public:
Timer(string s="") : t(clock()), s(s) {}
~Timer()
{
cout << "Function " + s + " elapsed in seconds [" << double(clock() - t) / CLOCKS_PER_SEC << "]" << '\n';
};
};

class Instrument
{
public:
string name;
int pe;
int recordType;
int exchangeID;
Instrument():name(""), pe(0), recordType(0), exchangeID(0) {}
Instrument (const string & name, int pe, int recordType, int exchangeID)
: name(name), pe(pe), recordType(recordType), exchangeID(exchangeID) {}
};

void TestRouteine(const string & filepath, vector<Instrument> & vInstruments)
{
volatile Timer timer("ReadCSV");
vInstruments.reserve(40000000);
ifstream fs(filepath);
CSVRow row;
while (fs >> row)
{
vInstruments.push_back(Instrument(row[0], atoi(row[1].c_str()), atoi(row[2].c_str()), atoi(row[3].c_str())));
}

cout << "size: [" << vInstruments.size() << "]" << endl;
}

int main()
{
vector<Instrument> vInstruments(40000000);
TestRouteine("../InstradayWS/pen201502131002.txt", vInstruments);
system("PAUSE");
}

2015年2月6日 星期五

Regular Expression to match the error code of IIS FTP Log

Regular Expression to match the error code of IIS FTP Log

.*21\s(.*?)\s(.*?)\s[45]

2015-02-01 00:00:14 194.20.113.170 UK2I-ISASAAC01\isat.internal 194.20.113.192 21 NOOP - 200 0 0 f51b3e27-ca5c-4ff4-8f6e-b7b4e12fa6d4 -
2015-02-01 00:00:14 194.20.113.170 UK2I-ISASAAC01\isat.internal 194.20.113.192 21 CWD /NDA 250 0 0 f51b3e27-ca5c-4ff4-8f6e-b7b4e12fa6d4 /NDA
2015-02-01 00:00:14 194.20.113.170 UK2I-ISASAAC01\isat.internal 194.20.113.192 21 PWD - 257 0 0 f51b3e27-ca5c-4ff4-8f6e-b7b4e12fa6d4 -
2015-02-01 00:00:14 194.20.113.170 UK2I-ISASAAC01\isat.internal 194.20.113.192 21 NOOP - 200 0 0 f51b3e27-ca5c-4ff4-8f6e-b7b4e12fa6d4 -
2015-02-01 00:00:14 194.20.113.170 UK2I-ISASAAC01\isat.internal 194.20.113.192 21 CWD /NDA_Staging 250 0 0 f51b3e27-ca5c-4ff4-8f6e-b7b4e12fa6d4 /NDA_Staging

using Windows findstr
findstr /N /R /C:".*21[ ].*[ ].*[ ][45][0-9][0-9][ ]" *.log > ftpec.txt

findstr /N /R /C:".*[ ][45][0-9][0-9][ ]" *.log > ftpec.txt

2015年2月4日 星期三

Regular Expression


http://stackoverflow.com/questions/406230/regular-expression-to-match-string-not-containing-a-word


I know it is possible to match for the word and using tools options reverse the match. (eg. by grep -v) However I want to know if it is possible using regular expressions to match lines which does not contain a specific word, say hede?
Input:
Hoho
Hihi
Haha
hede
# grep "Regex for do not contain hede" Input
Output:
Hoho
Hihi
Haha


Note that the solution to does not start with “hede”:
^(?!hede).*$
is generally much more efficient than the solution to does not contain “hede”:
^((?!hede).)*$
The former checks for “hede” only at the input string’s first position, rather than at every position.


How to remove new line in Notepad++?
You need something like a regular expression.
You have to be in Extended mode
If you want all the lines to end up on a single line use \r\n. If you want to simply remove emptylines, use \n\r as @Link originally suggested.
Replace either expression with nothing.

2015年2月2日 星期一

XPath语法 在C#中使用XPath示例

http://www.cnblogs.com/yukaizhao/archive/2011/07/25/xpath.html

XPath语法 在C#中使用XPath示例

XPath可以快速定位到Xml中的节点或者属性。XPath语法很简单,但是强大够用,它也是使用xslt的基础知识。
示例Xml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="utf-8" ?>
<pets>
  <cat color="black" weight="10">
    <price>100</price>
    <desc>this is a black cat</desc>
  </cat>
  <cat color="white" weight="9">
    <price>80</price>
    <desc>this is a white cat</desc>
  </cat>
  <cat color="yellow" weight="15">
    <price>80</price>
    <desc>this is a yellow cat</desc>
  </cat>
 
 
  <dog color="black" weight="10">
    <price>100</price>
    <desc>this is a black dog</desc>
  </dog>
  <dog color="white" weight="9">
    <price>80</price>
    <desc>this is a white dog</desc>
  </dog>
  <dog color="yellow" weight="15">
    <price>80</price>
    <desc>this is a yellow dog</desc>
  </dog>
</pets>
XPath的语法:
1. XPath中的符号
符号
说明
示例
示例说明
/
表示从根节点开始选择
/pets
选择根节点pets
表示节点和子节点之间的间隔符
/pets/dog
选择pets节点下的dog节点
//xx
表示从整个xml文档中查找,而不考虑当前节点位置
//price
选择文档中所有的price节点
.
单个英文半角句点表示选择当前节点
/pets/.
选择pets节点
..
双点,表示选择父节点
/pets/dog[0]/..
表示pets节点,也就是第一个dog节点的父节点
@xx
表示选择属性
//dog/@color
表示选择所有dog节点的color属性集合
[…]
中括号表示选择条件,括号内为条件
//dog[@color=’white’]
所有colorwhitedog节点
//dog[/price<100]
所有price字节点值小于100dog节点
中括号内数字为节点索引,类似c#等语言中的数组,数组下标是从1开始的
//dog[1]
1dog节点
//dog[last()]
最后一个dog节点,last()xPath内置函数
|
单竖杠表示合并节点结合
//dog[@color=’white’] | //cat[@color=’white’]
color属性为whitedog节点和color属性为whitecat节点
*
星号表示任何名字的节点或者属性
//dog/*
表示dog节点的所有子节点
//dog/@*
表示dog节点的所有属性节点
2. XPath数学运算符
加号表示加
- 表示数字相减
* 表示乘以
div 表示除以,这里数学上的除号/已经被用作节点之间分隔符了
mod 表示取余
3. XPath逻辑运算符
= 等于,相当于c#中的 ==
!= 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于
and 并且 与关系
or 或者 或关系
4. XPath Axes 从字面翻译这个是XPath轴的意思,但根据我的理解这个翻译成XPath节点关系运算关键字更合适,就是一组关键字加上::双冒号表示和当前节点有关系的一个或者一组节点.
使用语法: axisname::nodetest[predicate] 即轴名字::节点名字[取节点条件]
具体说明如下:
关键字
说明
示例
示例说明
ancestor
当前节点的父祖节点
ancestor::pig
当前节点的祖先节点中的pig节点
ancestor-or-self
当前节点以及其父祖节点
ancestor::pig

attribute
当前节点的所有属性
attribute::weight
相当于@weightattribute::@是等价的
child
当前节点的所有字节点
child::*[name()!=’price’]
选择名字不是price的子节点
descendant
子孙节点
descendant::*[@*]
有属性的子孙节点
descendant-or-self
子孙节点以及当前节点
descendant-or-self::*

following
Xml文档中当前节点之后的所有节点
following::*

following-sibling
当前节点的同父弟弟节点
following-sibling::

preceding
Xml文档中当前节点之前的所有节点
preceding::*

namespace
选取当前节点的所有命名空间节点
namespace::*

parent
当前节点的父节点
parent::
相当于双点..
preceding-sibling
当前节点之后的同父兄节点
preceding-sibling::*

self
当前节点
self::*
相当于单点.

5. 常用的XPath函数介绍:
在XPath表达式中常用的函数有下面两个:
position() 表示节点的序号例如 //cat[position() = 2] 表示取序号为2的dog节点
last() 表示取最后一个节点 //cat[last()] 
name() 表示当前节点名字 /pets/*[name() != 'pig'] 表示/pets下名字不是pig的子节点
XPath的函数还有很多,包括字符串函数,数字函数和时间函数等,具体可以参考w3的网站。
以上是XPath的语法,下面我们看下如何在.Net中使用XPath
在.Net中可以通过XPathDocument或者XmlDocument类使用XPath。XPathDocument是只读的方式定位Xml节点或者属性文本等,而XmlDocument则是可读写的。
如下代码示例展示了如何使用XPathDocument和XmlDocument
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.XPath;
using System.Xml;
 
namespace UseXPathDotNet
{
    class Program
    {
        static void Main(string[] args)
        {
            UseXPathWithXPathDocument();
 
            UseXPathWithXmlDocument();
 
            Console.Read();
        }
 
        static void UseXPathWithXmlDocument()
        {
            XmlDocument doc = new XmlDocument();
            doc.Load("http://www.cnblogs.com/yukaizhao/rss");
            //使用xPath选择需要的节点
            XmlNodeList nodes = doc.SelectNodes("/rss/channel/item[position()<=10]");
            foreach (XmlNode item in nodes)
            {
                string title = item.SelectSingleNode("title").InnerText;
                string url = item.SelectSingleNode("link").InnerText;
                Console.WriteLine("{0} = {1}", title, url);
            }
        }
 
        static void UseXPathWithXPathDocument()
        {
            XPathDocument doc = new XPathDocument("http://www.cnblogs.com/yukaizhao/rss");
            XPathNavigator xPathNav = doc.CreateNavigator();
            //使用xPath取rss中最新的10条随笔
            XPathNodeIterator nodeIterator = xPathNav.Select("/rss/channel/item[position()<=10]");
            while (nodeIterator.MoveNext())
            {
                XPathNavigator itemNav = nodeIterator.Current;
                string title = itemNav.SelectSingleNode("title").Value;
                string url = itemNav.SelectSingleNode("link").Value;
                Console.WriteLine("{0} = {1}",title,url);
            }
 
        }
    }
}
XPath使用示例,请看下面的代码注释 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
 
namespace UseXPath1
{
    class Program
    {
        static void Main(string[] args)
        {
            string xml = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
<pets>
  <cat color=""black"" weight=""10"" count=""4"">
    <price>100</price>
    <desc>this is a black cat</desc>
  </cat>
  <cat color=""white"" weight=""9"" count=""5"">
    <price>80</price>
    <desc>this is a white cat</desc>
  </cat>
  <cat color=""yellow"" weight=""15"" count=""1"">
    <price>110</price>
    <desc>this is a yellow cat</desc>
  </cat>
 
 
  <dog color=""black"" weight=""10"" count=""7"">
    <price>114</price>
    <desc>this is a black dog</desc>
  </dog>
  <dog color=""white"" weight=""9"" count=""4"">
    <price>80</price>
    <desc>this is a white dog</desc>
  </dog>
  <dog color=""yellow"" weight=""15"" count=""15"">
    <price>80</price>
    <desc>this is a yellow dog</desc>
  </dog>
 
    <pig color=""white"" weight=""100"" count=""2"">
    <price>8000</price>
    <desc>this is a white pig</desc>   
    </pig>
</pets>";
 
            using (StringReader rdr = new StringReader(xml))
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(rdr);
 
                //取所有pets节点下的dog字节点
                XmlNodeList nodeListAllDog = doc.SelectNodes("/pets/dog");
 
                //所有的price节点
                XmlNodeList allPriceNodes = doc.SelectNodes("//price");
 
                //取最后一个price节点
                XmlNode lastPriceNode = doc.SelectSingleNode("//price[last()]");
 
                //用双点号取price节点的父节点
                XmlNode lastPriceParentNode = lastPriceNode.SelectSingleNode("..");
 
                //选择weight*count=40的所有动物,使用通配符*
                XmlNodeList nodeList = doc.SelectNodes("/pets/*[@weight*@count=40]");
 
                //选择除了pig之外的所有动物,使用name()函数返回节点名字
                XmlNodeList animalsExceptPigNodes = doc.SelectNodes("/pets/*[name() != 'pig']");
                
 
                //选择价格大于100而不是pig的动物
                XmlNodeList priceGreaterThan100s = doc.SelectNodes("/pets/*[price div @weight >10 and name() != 'pig']");
                foreach (XmlNode item in priceGreaterThan100s)
                {
                    Console.WriteLine(item.OuterXml);
                }
 
                //选择第二个dog节点
                XmlNode theSecondDogNode = doc.SelectSingleNode("//dog[position() = 2]");
 
                //使用xpath ,axes 的 parent 取父节点
                XmlNode parentNode = theSecondDogNode.SelectSingleNode("parent::*");
 
                //使用xPath选择第二个dog节点前面的所有dog节点
                XmlNodeList dogPresibling = theSecondDogNode.SelectNodes("preceding::dog");
 
                //取文档的所有子孙节点price
                XmlNodeList childrenNodes = doc.SelectNodes("descendant::price");
            }
 
            Console.Read();
        }
    }
}
C#处理Xml的相关随笔:

2023 Promox on Morefine N6000 16GB 512GB

2023 Promox on Morefine N6000 16GB 512GB Software Etcher 100MB (not but can be rufus-4.3.exe 1.4MB) Proxmox VE 7.4 ISO Installer (1st ISO re...