annotate src/getexr/getexr.go @ 42:c58172a59534

bug fix.
author pyon@macmini
date Tue, 10 Mar 2020 21:12:29 +0900
parents 38b64afbaf79
children 49656dc40069
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
1 package main
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
2
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
3 import (
14
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
4 "bytes"
12
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
5 "fmt"
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
6 "flag"
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
7 "io/ioutil"
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
8 "log"
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
9 "math"
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
10 "net/http"
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
11 "net/smtp"
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
12 "os"
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
13 "strconv"
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
14 "strings"
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
15 "time"
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
16
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
17 "golang.org/x/net/html"
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
18 )
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
19
14
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
20 var ver = "0.2.0"
12
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
21
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
22 func main() {
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
23
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
24 version := flag.Bool( "v", false, "print version" )
13
4fb189ae0a46 getexr: version up.
pyon@macmini
parents: 12
diff changeset
25 verbose := flag.Bool( "V", false, "verbose" )
4fb189ae0a46 getexr: version up.
pyon@macmini
parents: 12
diff changeset
26 file := flag.String( "f", "usd.dat", "data file" )
12
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
27 flag.Parse()
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
28
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
29 if ( *version ) {
16
38b64afbaf79 add ut. ( unix-like tools )
pyon@macmini
parents: 14
diff changeset
30 fmt.Fprintf( os.Stderr, "getexr - Get Exchange Rate [ version = %s ]\n", ver )
12
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
31 os.Exit( 0 )
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
32 }
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
33
14
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
34 t := time.Now()
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
35 now := t.Format( "2006-01-02 15:04:05" )
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
36
12
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
37 // Get USD Rate
13
4fb189ae0a46 getexr: version up.
pyon@macmini
parents: 12
diff changeset
38 PrintVerbose( *verbose, "> get rate from yahoo..." )
12
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
39 url := "http://finance.yahoo.co.jp/"
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
40 resp, err := http.Get( url )
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
41 if err != nil {
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
42 log.Fatal( err )
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
43 }
14
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
44 PrintVerbose( *verbose, "success\n" )
12
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
45
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
46 z := html.NewTokenizer( resp.Body )
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
47 usd, err := ParseHtml( z )
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
48 if err != nil {
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
49 log.Fatal( err )
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
50 }
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
51 defer resp.Body.Close()
14
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
52 PrintVerbose( *verbose, fmt.Sprintf( "> rate = %.2f\n", usd ) )
12
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
53
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
54 content, err := ioutil.ReadFile( *file )
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
55 if err != nil {
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
56 log.Fatal( err )
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
57 }
14
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
58 fc := 0
12
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
59
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
60 buf1 := strings.Split( string( content ), "\n" )
14
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
61
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
62 // Compare Alert Rate
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
63 buf2 := strings.Split( buf1[ 0 ], "," )
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
64 flg := buf2[0]
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
65 thr, _ := strconv.ParseFloat( buf2[1], 32 )
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
66
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
67 if ( strings.EqualFold( "H", flg ) && thr < usd ) {
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
68 fc = -1
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
69 content = bytes.Replace( content, []byte( "H" ), []byte( "-" ), 1 )
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
70 if err := AlertMail( "H", now, usd ); err != nil {
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
71 log.Fatal( err )
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
72 }
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
73 PrintVerbose( *verbose, "> rate higher.\n> sending alert mail.\n" )
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
74
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
75 } else if ( strings.EqualFold( "L", flg ) && thr > usd ) {
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
76 fc = -1
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
77 content = bytes.Replace( content, []byte( "L" ), []byte( "-" ), 1 )
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
78 if err := AlertMail( "L", now, usd ); err != nil {
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
79 log.Fatal( err )
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
80 }
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
81 PrintVerbose( *verbose, "> rate lower.\n> sending alert mail.\n" )
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
82 }
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
83
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
84 // Compare Past Rate
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
85 buf2 = strings.Split( buf1[ len( buf1 ) - 2 ], "," )
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
86 ymd0 := buf2[0]
12
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
87 usd0, _ := strconv.ParseFloat( buf2[1], 32 )
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
88
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
89 if ( math.Abs( usd0 - usd ) > 1.0 ) {
14
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
90 fc = 1
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
91 // Post E-mail
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
92 PrintVerbose( *verbose, "> sending notify mail.\n" )
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
93 if err := NotifyMail( now, usd, ymd0, usd0 ); err != nil {
12
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
94 log.Fatal( err )
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
95 }
14
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
96 PrintVerbose( *verbose, "> rate changed.\n" )
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
97 } else {
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
98 PrintVerbose( *verbose, "> not changed.\n" )
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
99 }
12
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
100
14
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
101 // Save Rate
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
102 if ( fc != 0 ) {
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
103 if ( fc == 1 ) {
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
104 buf := fmt.Sprintf( "%s,%.2f\n", now, usd )
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
105 content = append( content, buf... )
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
106 }
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
107 if err := ioutil.WriteFile( *file, content, 0777 ); err != nil {
12
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
108 log.Fatal( err )
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
109 }
14
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
110 PrintVerbose( *verbose, "> data file overwrited.\n" )
12
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
111 }
13
4fb189ae0a46 getexr: version up.
pyon@macmini
parents: 12
diff changeset
112
4fb189ae0a46 getexr: version up.
pyon@macmini
parents: 12
diff changeset
113 PrintVerbose( *verbose, "> finish.\n" )
12
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
114 }
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
115
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
116 func ParseHtml( z *html.Tokenizer ) ( float64, error ) {
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
117 for {
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
118 tt := z.Next()
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
119 switch tt {
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
120 case html.ErrorToken:
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
121 return 0.0, nil
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
122
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
123 case html.StartTagToken:
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
124 tag, _ := z.TagName()
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
125 key, val, _ := z.TagAttr()
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
126 if string( tag ) == "strong" && string( key ) == "class" && string( val ) == "bkLine" {
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
127 z.Next()
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
128 //fmt.Printf( "%s %s %s\n", key, val, z.Token() )
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
129 return strconv.ParseFloat( z.Token().String(), 32 )
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
130 }
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
131 }
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
132 }
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
133 }
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
134
14
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
135 func NotifyMail( now string, usd float64, old string, usd0 float64 ) error {
13
4fb189ae0a46 getexr: version up.
pyon@macmini
parents: 12
diff changeset
136 address := "muty@willcom.com"
14
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
137 msg := "To: " + address + "\r\n" +
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
138 "Subject: Exchange-Mail\r\n" +
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
139 "\r\n" +
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
140 "rate changed\r\n" +
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
141 now + "\r\n" +
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
142 fmt.Sprintf( "[ USD/JPY : %.2f ].", usd ) + "\r\n\r\n" +
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
143 old + "\r\n" +
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
144 fmt.Sprintf( "[ USD/JPY : %.2f ].", usd0 ) + "\r\n" // mail body
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
145 if err := SendMail( address, msg ); err != nil {
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
146 return err
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
147 }
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
148 return nil
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
149 }
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
150
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
151 func AlertMail( flg, now string, usd float64 ) error {
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
152 address := "muty@willcom.com"
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
153 msg := "To: " + address + "\r\n" +
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
154 "Subject: Exchange-Mail\r\n" +
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
155 "\r\n" +
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
156 "rate changed\r\n" +
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
157 now + "\r\n" +
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
158 fmt.Sprintf( "[ USD/JPY : %.2f ].", usd ) + "\r\n" // mail body
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
159 if err := SendMail( address, msg ); err != nil {
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
160 return err
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
161 }
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
162 return nil
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
163 }
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
164
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
165 func SendMail( address, msg string ) error {
12
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
166 hostname := "sdm.sakura.ne.jp"
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
167 auth := smtp.PlainAuth( "", "bad_user@sdm.sakura.ne.jp", "hogehoge3", hostname )
13
4fb189ae0a46 getexr: version up.
pyon@macmini
parents: 12
diff changeset
168 to := []string{ address }
14
001e2aa380ad getexr: add alert.
pyon@macmini
parents: 13
diff changeset
169 err := smtp.SendMail( hostname + ":587", auth, "bad_user@sdm.sakura.ne.jp", to, []byte( msg ) )
12
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
170 if err != nil {
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
171 return err
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
172 }
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
173 return nil
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
174 }
aea69f84ed33 add getexr ( Get Foreign-Exchange )
pyon@macmini
parents:
diff changeset
175
13
4fb189ae0a46 getexr: version up.
pyon@macmini
parents: 12
diff changeset
176 func PrintVerbose( y bool, msg string ) {
4fb189ae0a46 getexr: version up.
pyon@macmini
parents: 12
diff changeset
177 if y {
4fb189ae0a46 getexr: version up.
pyon@macmini
parents: 12
diff changeset
178 fmt.Fprintf( os.Stderr, msg )
4fb189ae0a46 getexr: version up.
pyon@macmini
parents: 12
diff changeset
179 }
4fb189ae0a46 getexr: version up.
pyon@macmini
parents: 12
diff changeset
180 }
4fb189ae0a46 getexr: version up.
pyon@macmini
parents: 12
diff changeset
181