Index: trunk/tools/wsor/category_editors/get_category_editors.py |
— | — | @@ -40,8 +40,7 @@ |
41 | 41 | ) < period |
42 | 42 | |
43 | 43 | for editor in db.enwiki_editors_raw.find(): |
44 | | - logging.debug("Processing %(editor)s:%(username)s..." % editor) |
45 | | - |
| 44 | + thresh = False |
46 | 45 | for year, month, edits in get_months_of_edits(editor['edits']): |
47 | 46 | catEdits = [e for e in edits if e['article'] in catIds] |
48 | 47 | if len(catEdits) >= args.n: |
— | — | @@ -54,11 +53,12 @@ |
55 | 54 | len(catEdits) |
56 | 55 | ]) |
57 | 56 | ) |
58 | | - LOGGING_STREAM.write("o") |
59 | | - else: |
60 | | - LOGGING_STREAM.write("-") |
| 57 | + thresh = True |
61 | 58 | |
62 | | - LOGGING_STREAM.write("\n") |
| 59 | + if thresh: |
| 60 | + LOGGING_STREAM.write("o") |
| 61 | + else: |
| 62 | + LOGGING_STREAM.write("-") |
63 | 63 | |
64 | 64 | |
65 | 65 | |
Index: trunk/tools/wsor/overworked/R/patrol_distribuions.R |
— | — | @@ -0,0 +1,199 @@ |
| 2 | +source("loader/load_patroller_days.R") |
| 3 | + |
| 4 | +patroller_days = load_patroller_days() |
| 5 | +patroller_days = patroller_days[!grepl("bot( |$)", patroller_days$username, ignore.case=T),] |
| 6 | +patroller_days = patroller_days[!grepl("DASHBot", patroller_days$username, ignore.case=T),] |
| 7 | + |
| 8 | +library(lattice) |
| 9 | +library(doBy) |
| 10 | + |
| 11 | + |
| 12 | +patroller_years = with( |
| 13 | + summaryBy( |
| 14 | + count ~ year + user_id + username, |
| 15 | + data=patroller_days, |
| 16 | + FUN=sum |
| 17 | + ), |
| 18 | + data.frame( |
| 19 | + year = year, |
| 20 | + user_id = user_id, |
| 21 | + username = username, |
| 22 | + count = count.sum |
| 23 | + ) |
| 24 | +) |
| 25 | + |
| 26 | +patroller_years = patroller_years[order(patroller_years$count),] |
| 27 | +patroller_years$count_bucket = 2^round(log(patroller_years$count, base=2)) |
| 28 | + |
| 29 | +patroller_years.count_dist = with( |
| 30 | + summaryBy( |
| 31 | + user_id ~ year + count, |
| 32 | + data = patroller_years, |
| 33 | + FUN=length |
| 34 | + ), |
| 35 | + data.frame( |
| 36 | + year = year, |
| 37 | + count = count, |
| 38 | + freq = user_id.length |
| 39 | + ) |
| 40 | +) |
| 41 | + |
| 42 | +png('plots/dist.patroller_years_activity.png', height=768, width=1024) |
| 43 | +xyplot( |
| 44 | + freq ~ count | as.character(year), |
| 45 | + data = patroller_years.count_dist, |
| 46 | + panel = function(x, y, subscripts, group, ...){ |
| 47 | + panel.xyplot(x, y) |
| 48 | + panel.lines(x, y) |
| 49 | + }, |
| 50 | + main="Distribution of activity level among editors", |
| 51 | + ylab="Frequency", |
| 52 | + xlab="Activity level", |
| 53 | + #scales=list( |
| 54 | + # x=list( |
| 55 | + # log=2, |
| 56 | + # at=2^(1:max(patroller_years.count_dist$count)), |
| 57 | + # labels=2^(1:max(patroller_years.count_dist$count)) |
| 58 | + # ) |
| 59 | + #), |
| 60 | + layout=c(length(unique(patroller_years.count_dist$year)), 1) |
| 61 | +) |
| 62 | +dev.off() |
| 63 | + |
| 64 | + |
| 65 | + |
| 66 | +for(year in sort(unique(patroller_years$year))){ |
| 67 | + p_year = patroller_years[patroller_years$year==year,] |
| 68 | + p_year = p_year[order(p_year$count, decreasing=T),] |
| 69 | + png(paste('plots/bars.patroller_years_activity', year, 'png', sep="."), height=768, width=1024) |
| 70 | + print(barchart( |
| 71 | + reorder(substring(as.character(username),1,30), count) ~ count, |
| 72 | + data=p_year[1:50,], |
| 73 | + horizontal=T, |
| 74 | + xlim=c(0, 110000), |
| 75 | + xlab="Patrolled pages" |
| 76 | + )) |
| 77 | + dev.off() |
| 78 | + cat(year, "\n") |
| 79 | + print(summary(p_year$count)) |
| 80 | +} |
| 81 | + |
| 82 | + |
| 83 | +patroller_months = with( |
| 84 | + summaryBy( |
| 85 | + count ~ year + month + user_id + username, |
| 86 | + data=patroller_days, |
| 87 | + FUN=sum |
| 88 | + ), |
| 89 | + data.frame( |
| 90 | + year = year, |
| 91 | + month = month, |
| 92 | + user_id = user_id, |
| 93 | + username = username, |
| 94 | + count = count.sum |
| 95 | + ) |
| 96 | +) |
| 97 | + |
| 98 | +nNoNA = function(x){ |
| 99 | + length(subset(x, !is.na(x))) |
| 100 | +} |
| 101 | +sdNoNA = function(x){ |
| 102 | + sd(x, na.rm=T)/sqrt(nNoNA(x)) |
| 103 | +} |
| 104 | +meanNoNA = function(x){ |
| 105 | + mean(x, na.rm=T) |
| 106 | +} |
| 107 | + |
| 108 | +patrol_months.per_user = with( |
| 109 | + summaryBy( |
| 110 | + count ~ year + month, |
| 111 | + data=patroller_months, |
| 112 | + FUN=c(meanNoNA, sdNoNA, nNoNA) |
| 113 | + ), |
| 114 | + data.frame( |
| 115 | + year = year, |
| 116 | + month = month, |
| 117 | + year.month = year + month/100, |
| 118 | + count.mean = count.meanNoNA, |
| 119 | + count.sd = count.sdNoNA, |
| 120 | + count.n = count.nNoNA |
| 121 | + ) |
| 122 | +) |
| 123 | + |
| 124 | +model = lm( |
| 125 | + count.mean ~ as.numeric(factor(year.month)), |
| 126 | + data=patrol_months.per_user[patrol_months.per_user$year.month <= 2011.05,] |
| 127 | +) |
| 128 | +summary(model) |
| 129 | +monthLine = function(x){ |
| 130 | + model$coefficients[['(Intercept)']] + model$coefficients[['as.numeric(factor(year.month))']]*x |
| 131 | +} |
| 132 | + |
| 133 | +png("plots/patrol_months.per_user.png", height=768, width=1024) |
| 134 | +print(xyplot( |
| 135 | + count.mean ~ as.factor(year.month), |
| 136 | + data = patrol_months.per_user[patrol_months.per_user$year.month <= 2011.05,], |
| 137 | + panel = function(x, y, subscripts, ...){ |
| 138 | + f = patrol_months.per_user[patrol_months.per_user$year.month <= 2011.05,][subscripts,] |
| 139 | + panel.xyplot(x, y, col="#000000", ...) |
| 140 | + se = f$count.sd/sqrt(f$count.n) |
| 141 | + panel.arrows(x, y+se, x, y-se, ends="both", angle=90, col="#000000", length=0.05, ...) |
| 142 | + panel.lines(x[order(x)], y[order(x)], lwd=2, ...) |
| 143 | + panel.lines(x[order(x)], monthLine(as.numeric(x[order(x)])), lwd=2, col="#000000") |
| 144 | + }, |
| 145 | + #main="Average Patroller workload by month", |
| 146 | + ylab="Mean patrolled pages per user", |
| 147 | + xlab="Month", |
| 148 | + scales=list(x=list(rot=45)) |
| 149 | +)) |
| 150 | +dev.off() |
| 151 | + |
| 152 | +patrol_years.per_user = with( |
| 153 | + summaryBy( |
| 154 | + count ~ year, |
| 155 | + data=patroller_years, |
| 156 | + FUN=c(meanNoNA, sdNoNA, nNoNA) |
| 157 | + ), |
| 158 | + data.frame( |
| 159 | + year = year, |
| 160 | + count.mean = count.meanNoNA, |
| 161 | + count.sd = count.sdNoNA, |
| 162 | + count.n = count.nNoNA |
| 163 | + ) |
| 164 | +) |
| 165 | + |
| 166 | +model = lm( |
| 167 | + count.mean ~ year, |
| 168 | + data=patrol_years.per_user[patrol_years.per_user$year <= 2010,] |
| 169 | +) |
| 170 | +summary(model) |
| 171 | + |
| 172 | +model = lm( |
| 173 | + count.mean ~ log(year-2006, base=2), |
| 174 | + data=patrol_years.per_user[patrol_years.per_user$year <= 2010,] |
| 175 | +) |
| 176 | +summary(model) |
| 177 | +yearCurve=function(x){ |
| 178 | + model$coefficients[['(Intercept)']] + log(x-2006, base=2)*model$coefficients[['log(year - 2006, base = 2)']] |
| 179 | +} |
| 180 | +png("plots/patrol_years.per_user.png", height=768, width=1024) |
| 181 | +print(xyplot( |
| 182 | + count.mean ~ year-2006, |
| 183 | + data = patrol_years.per_user[patrol_years.per_user$year <= 2010,], |
| 184 | + panel = function(x, y, subscripts, ...){ |
| 185 | + f = patrol_years.per_user[patrol_years.per_user$year.month <= 2011.05,][subscripts,] |
| 186 | + panel.xyplot(x, y, col="#000000", ...) |
| 187 | + se = f$count.sd/sqrt(f$count.n) |
| 188 | + panel.arrows(x, y+se, x, y-se, ends="both", angle=90, col="#000000", length=0.05, ...) |
| 189 | + #panel.lines(x[order(x)], y[order(x)], lwd=2, ...) |
| 190 | + #panel.curve(myCurve, 2006, 2011, col="#000000") |
| 191 | + panel.lines(seq(0, 5, .1), yearCurve(seq(2006, 2011, .1)), lwd=2, col="#000000") |
| 192 | + }, |
| 193 | + #main="Average Patroller workload by year", |
| 194 | + ylab="Mean patrolled pages per user", |
| 195 | + xlab="Year (log scaled)", |
| 196 | + pch=20, |
| 197 | + scales=list(x=list(at=1:5, labels=2007:2010)) |
| 198 | +)) |
| 199 | +dev.off() |
| 200 | + |
Index: trunk/tools/wsor/overworked/R/plots/patrol_months.per_user.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/tools/wsor/overworked/R/plots/patrol_months.per_user.png |
___________________________________________________________________ |
Added: svn:mime-type |
1 | 201 | + application/octet-stream |
Index: trunk/tools/wsor/overworked/R/plots/patrol_years.top_50.per_user.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/tools/wsor/overworked/R/plots/patrol_years.top_50.per_user.png |
___________________________________________________________________ |
Added: svn:mime-type |
2 | 202 | + application/octet-stream |
Index: trunk/tools/wsor/overworked/R/plots/test.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/tools/wsor/overworked/R/plots/test.png |
___________________________________________________________________ |
Added: svn:mime-type |
3 | 203 | + application/octet-stream |
Index: trunk/tools/wsor/overworked/R/plots/bars.patroller_years_activity.2007.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/tools/wsor/overworked/R/plots/bars.patroller_years_activity.2007.png |
___________________________________________________________________ |
Added: svn:mime-type |
4 | 204 | + application/octet-stream |
Index: trunk/tools/wsor/overworked/R/plots/bars.patroller_years_activity.2008.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/tools/wsor/overworked/R/plots/bars.patroller_years_activity.2008.png |
___________________________________________________________________ |
Added: svn:mime-type |
5 | 205 | + application/octet-stream |
Index: trunk/tools/wsor/overworked/R/plots/patrol_months.top_50.per_user.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/tools/wsor/overworked/R/plots/patrol_months.top_50.per_user.png |
___________________________________________________________________ |
Added: svn:mime-type |
6 | 206 | + application/octet-stream |
Index: trunk/tools/wsor/overworked/R/plots/bars.patroller_years_activity.2009.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/tools/wsor/overworked/R/plots/bars.patroller_years_activity.2009.png |
___________________________________________________________________ |
Added: svn:mime-type |
7 | 207 | + application/octet-stream |
Index: trunk/tools/wsor/overworked/R/plots/dist.patroller_years_activity.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/tools/wsor/overworked/R/plots/dist.patroller_years_activity.png |
___________________________________________________________________ |
Added: svn:mime-type |
8 | 208 | + application/octet-stream |
Index: trunk/tools/wsor/overworked/R/plots/dist.patroller_days.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/tools/wsor/overworked/R/plots/dist.patroller_days.png |
___________________________________________________________________ |
Added: svn:mime-type |
9 | 209 | + application/octet-stream |
Index: trunk/tools/wsor/overworked/R/plots/patrol_years.per_user.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/tools/wsor/overworked/R/plots/patrol_years.per_user.png |
___________________________________________________________________ |
Added: svn:mime-type |
10 | 210 | + application/octet-stream |
Index: trunk/tools/wsor/overworked/R/plots/bars.patroller_years_activity.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/tools/wsor/overworked/R/plots/bars.patroller_years_activity.png |
___________________________________________________________________ |
Added: svn:mime-type |
11 | 211 | + application/octet-stream |
Index: trunk/tools/wsor/overworked/R/plots/bars.patroller_years_activity.2010.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/tools/wsor/overworked/R/plots/bars.patroller_years_activity.2010.png |
___________________________________________________________________ |
Added: svn:mime-type |
12 | 212 | + application/octet-stream |
Index: trunk/tools/wsor/overworked/R/plots/patol_months.per_user.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/tools/wsor/overworked/R/plots/patol_months.per_user.png |
___________________________________________________________________ |
Added: svn:mime-type |
13 | 213 | + application/octet-stream |
Index: trunk/tools/wsor/overworked/R/plots/bars.patroller_years_activity.2011.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/tools/wsor/overworked/R/plots/bars.patroller_years_activity.2011.png |
___________________________________________________________________ |
Added: svn:mime-type |
14 | 214 | + application/octet-stream |
Index: trunk/tools/wsor/overworked/R/loader/load_patroller_days.R |
— | — | @@ -0,0 +1,14 @@ |
| 2 | +source("util/env.R") |
| 3 | + |
| 4 | +PATROLLER_DAYS <<- NULL |
| 5 | + |
| 6 | +load_patroller_days = function(verbose=T, reload=F){ |
| 7 | + filename = paste(DATA_DIR, "en.patroller_days.20110610.no_bots.tsv", sep="/") |
| 8 | + PATROLLER_DAYS <<- read.table( |
| 9 | + filename, |
| 10 | + header=T, sep="\t", |
| 11 | + quote="'\"", comment.char="", |
| 12 | + na.strings="\\N", |
| 13 | + ) |
| 14 | + PATROLLER_DAYS |
| 15 | +} |
Index: trunk/tools/wsor/overworked/R/Rplots.pdf |
— | — | @@ -0,0 +1,580 @@ |
| 2 | +%PDF-1.4 |
| 3 | +%���ρ�\r |
| 4 | +1 0 obj |
| 5 | +<< |
| 6 | +/CreationDate (D:20110610225803) |
| 7 | +/ModDate (D:20110610225803) |
| 8 | +/Title (R Graphics Output) |
| 9 | +/Producer (R 2.13.0) |
| 10 | +/Creator (R) |
| 11 | +>> |
| 12 | +endobj |
| 13 | +2 0 obj |
| 14 | +<< |
| 15 | +/Type /Catalog |
| 16 | +/Pages 3 0 R |
| 17 | +>> |
| 18 | +endobj |
| 19 | +7 0 obj |
| 20 | +<< |
| 21 | +/Type /Page |
| 22 | +/Parent 3 0 R |
| 23 | +/Contents 8 0 R |
| 24 | +/Resources 4 0 R |
| 25 | +>> |
| 26 | +endobj |
| 27 | +8 0 obj |
| 28 | +<< |
| 29 | +/Length 9 0 R |
| 30 | +>> |
| 31 | +stream
|
| 32 | +1 J 1 j q |
| 33 | +Q q |
| 34 | +Q q |
| 35 | +BT |
| 36 | +/sRGB cs 0.000 0.000 0.000 scn |
| 37 | +/F2 1 Tf 12.00 0.00 -0.00 12.00 279.25 12.00 Tm [(P) 40 (atrolled pages)] TJ |
| 38 | +ET |
| 39 | +Q q |
| 40 | +Q q |
| 41 | +Q q |
| 42 | +Q q 160.73 50.80 319.93 418.19 re W n |
| 43 | +Q q |
| 44 | +Q q |
| 45 | +/sRGB CS 0.000 0.000 0.000 SCN |
| 46 | +0.75 w |
| 47 | +[] 0 d |
| 48 | +1 J |
| 49 | +1 j |
| 50 | +10.00 M |
| 51 | +172.58 468.99 m 172.58 474.66 l S |
| 52 | +231.82 468.99 m 231.82 474.66 l S |
| 53 | +291.07 468.99 m 291.07 474.66 l S |
| 54 | +350.32 468.99 m 350.32 474.66 l S |
| 55 | +409.57 468.99 m 409.57 474.66 l S |
| 56 | +468.81 468.99 m 468.81 474.66 l S |
| 57 | +Q q |
| 58 | +Q q |
| 59 | +BT |
| 60 | +/sRGB cs 0.000 0.000 0.000 scn |
| 61 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 109.08 52.21 Tm [(Gonz) 15 (onoir)] TJ |
| 62 | +ET |
| 63 | +BT |
| 64 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 94.00 60.54 Tm [(T) 120 (eapotgeorge)] TJ |
| 65 | +ET |
| 66 | +BT |
| 67 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 117.27 68.87 Tm (Pichpich) Tj |
| 68 | +ET |
| 69 | +BT |
| 70 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 121.71 77.20 Tm (Pdcook) Tj |
| 71 | +ET |
| 72 | +BT |
| 73 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 109.34 85.53 Tm [(Acroter) -15 (ion)] TJ |
| 74 | +ET |
| 75 | +BT |
| 76 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 65.89 93.86 Tm [(W) 30 (ereSpielChequers)] TJ |
| 77 | +ET |
| 78 | +BT |
| 79 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 115.03 102.19 Tm (Bonadea) Tj |
| 80 | +ET |
| 81 | +BT |
| 82 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 122.27 110.53 Tm (Melaen) Tj |
| 83 | +ET |
| 84 | +BT |
| 85 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 113.37 118.86 Tm (PhGustaf) Tj |
| 86 | +ET |
| 87 | +BT |
| 88 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 99.08 127.19 Tm [(W) 40 (a) 30 (yne Slam)] TJ |
| 89 | +ET |
| 90 | +BT |
| 91 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 101.15 135.52 Tm (Prestonmag) Tj |
| 92 | +ET |
| 93 | +BT |
| 94 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 105.61 143.85 Tm (Catfish Jim) Tj |
| 95 | +ET |
| 96 | +BT |
| 97 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 104.59 152.18 Tm [(Cindam) 10 (use)] TJ |
| 98 | +ET |
| 99 | +BT |
| 100 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 130.05 160.51 Tm (Mono) Tj |
| 101 | +ET |
| 102 | +BT |
| 103 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 121.16 168.84 Tm (Scapler) Tj |
| 104 | +ET |
| 105 | +BT |
| 106 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 109.10 177.17 Tm [(Jimm) 15 (y Pitt)] TJ |
| 107 | +ET |
| 108 | +BT |
| 109 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 121.73 185.50 Tm (WWGB) Tj |
| 110 | +ET |
| 111 | +BT |
| 112 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 91.00 193.83 Tm [(Elektr) -15 (ik Shoos)] TJ |
| 113 | +ET |
| 114 | +BT |
| 115 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 50.67 202.16 Tm [(Phar) 10 (aoh of the Wizards)] TJ |
| 116 | +ET |
| 117 | +BT |
| 118 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 96.13 210.49 Tm (Seb az86556) Tj |
| 119 | +ET |
| 120 | +BT |
| 121 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 103.31 218.82 Tm [(F) 50 (alcon8765)] TJ |
| 122 | +ET |
| 123 | +BT |
| 124 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 132.83 227.15 Tm (Stifle) Tj |
| 125 | +ET |
| 126 | +BT |
| 127 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 106.16 235.48 Tm (Andyjsmith) Tj |
| 128 | +ET |
| 129 | +BT |
| 130 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 76.97 243.81 Tm [(Marcus Qw) 10 (er) -40 (tyus)] TJ |
| 131 | +ET |
| 132 | +BT |
| 133 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 112.28 252.14 Tm (Clubmarx) Tj |
| 134 | +ET |
| 135 | +BT |
| 136 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 121.16 260.47 Tm (TheTito) Tj |
| 137 | +ET |
| 138 | +BT |
| 139 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 129.64 268.80 Tm [(Xtz) 15 (ou)] TJ |
| 140 | +ET |
| 141 | +BT |
| 142 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 129.91 277.13 Tm [(Shir) -15 (ik)] TJ |
| 143 | +ET |
| 144 | +BT |
| 145 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 99.48 285.46 Tm (MuffledThud) Tj |
| 146 | +ET |
| 147 | +BT |
| 148 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 112.36 293.79 Tm [(T) 120 (r) 10 (a) 20 (v) 25 (elbird)] TJ |
| 149 | +ET |
| 150 | +BT |
| 151 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 38.84 302.13 Tm [(V) 80 (ejv) 25 (an\\xc4\\x8dick\\xc3\\xbd)] TJ |
| 152 | +ET |
| 153 | +BT |
| 154 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 121.16 310.46 Tm (VQuakr) Tj |
| 155 | +ET |
| 156 | +BT |
| 157 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 98.63 318.79 Tm [(Air) -30 (planeman)] TJ |
| 158 | +ET |
| 159 | +BT |
| 160 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 63.91 327.12 Tm (Daemonic Kangaroo) Tj |
| 161 | +ET |
| 162 | +BT |
| 163 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 106.56 335.45 Tm [(Der) -15 (ild4921)] TJ |
| 164 | +ET |
| 165 | +BT |
| 166 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 115.33 343.78 Tm [(K) 30 (udpung)] TJ |
| 167 | +ET |
| 168 | +BT |
| 169 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 106.72 352.11 Tm (Realkyhick) Tj |
| 170 | +ET |
| 171 | +BT |
| 172 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 115.04 360.44 Tm (Gilo1969) Tj |
| 173 | +ET |
| 174 | +BT |
| 175 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 17.67 368.77 Tm [(The Blade of the Nor) -40 (ther) -25 (n Ligh)] TJ |
| 176 | +ET |
| 177 | +BT |
| 178 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 112.21 377.10 Tm [(RadioF) 50 (an)] TJ |
| 179 | +ET |
| 180 | +BT |
| 181 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 110.60 385.43 Tm (Timneu22) Tj |
| 182 | +ET |
| 183 | +BT |
| 184 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 119.08 393.76 Tm [(Tton) 15 (yb1)] TJ |
| 185 | +ET |
| 186 | +BT |
| 187 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 97.97 402.09 Tm [(Shado) 15 (wjams)] TJ |
| 188 | +ET |
| 189 | +BT |
| 190 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 53.36 410.42 Tm (Ser Amantio di Nicolao) Tj |
| 191 | +ET |
| 192 | +BT |
| 193 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 105.06 418.75 Tm (Malcolmxl5) Tj |
| 194 | +ET |
| 195 | +BT |
| 196 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 64.57 427.08 Tm [(Dr) 10 (agonflySixtyse) 30 (v) 25 (en)] TJ |
| 197 | +ET |
| 198 | +BT |
| 199 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 111.70 435.41 Tm (Sopher99) Tj |
| 200 | +ET |
| 201 | +BT |
| 202 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 115.60 443.74 Tm (Eeekster) Tj |
| 203 | +ET |
| 204 | +BT |
| 205 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 113.93 452.07 Tm (Ironholds) Tj |
| 206 | +ET |
| 207 | +BT |
| 208 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 104.48 460.40 Tm (Blanchardb) Tj |
| 209 | +ET |
| 210 | +Q q |
| 211 | +Q q |
| 212 | +/sRGB CS 0.000 0.000 0.000 SCN |
| 213 | +0.75 w |
| 214 | +[] 0 d |
| 215 | +1 J |
| 216 | +1 j |
| 217 | +10.00 M |
| 218 | +172.58 50.80 m 172.58 45.13 l S |
| 219 | +231.82 50.80 m 231.82 45.13 l S |
| 220 | +291.07 50.80 m 291.07 45.13 l S |
| 221 | +350.32 50.80 m 350.32 45.13 l S |
| 222 | +409.57 50.80 m 409.57 45.13 l S |
| 223 | +468.81 50.80 m 468.81 45.13 l S |
| 224 | +BT |
| 225 | +/sRGB cs 0.000 0.000 0.000 scn |
| 226 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 169.80 32.29 Tm (0) Tj |
| 227 | +ET |
| 228 | +BT |
| 229 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 217.92 32.29 Tm (50000) Tj |
| 230 | +ET |
| 231 | +BT |
| 232 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 274.39 32.29 Tm (100000) Tj |
| 233 | +ET |
| 234 | +BT |
| 235 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 333.64 32.29 Tm (150000) Tj |
| 236 | +ET |
| 237 | +BT |
| 238 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 392.89 32.29 Tm (200000) Tj |
| 239 | +ET |
| 240 | +BT |
| 241 | +/F2 1 Tf 10.00 0.00 -0.00 10.00 452.13 32.29 Tm (250000) Tj |
| 242 | +ET |
| 243 | +Q q |
| 244 | +Q q 160.73 50.80 319.93 418.19 re W n |
| 245 | +/sRGB cs 0.000 1.000 1.000 scn |
| 246 | +/sRGB CS 0.000 0.000 0.000 SCN |
| 247 | +0.75 w |
| 248 | +[] 0 d |
| 249 | +1 J |
| 250 | +1 j |
| 251 | +10.00 M |
| 252 | +160.73 452.89 13.26 5.55 re B |
| 253 | +160.73 461.22 13.26 5.55 re B |
| 254 | +160.73 444.56 13.26 5.55 re B |
| 255 | +160.73 436.23 13.28 5.55 re B |
| 256 | +160.73 427.90 13.28 5.55 re B |
| 257 | +160.73 419.56 13.34 5.55 re B |
| 258 | +160.73 411.23 13.36 5.55 re B |
| 259 | +160.73 402.90 13.38 5.55 re B |
| 260 | +160.73 394.57 13.38 5.55 re B |
| 261 | +160.73 386.24 13.38 5.55 re B |
| 262 | +160.73 377.91 13.39 5.55 re B |
| 263 | +160.73 369.58 13.39 5.55 re B |
| 264 | +160.73 361.25 13.41 5.55 re B |
| 265 | +160.73 352.92 13.48 5.55 re B |
| 266 | +160.73 344.59 13.49 5.55 re B |
| 267 | +160.73 336.26 13.52 5.55 re B |
| 268 | +160.73 327.93 13.56 5.55 re B |
| 269 | +160.73 319.60 13.62 5.55 re B |
| 270 | +160.73 311.27 13.71 5.55 re B |
| 271 | +160.73 302.94 13.77 5.55 re B |
| 272 | +160.73 294.61 13.78 5.55 re B |
| 273 | +160.73 286.28 13.85 5.55 re B |
| 274 | +160.73 277.95 13.99 5.55 re B |
| 275 | +160.73 269.62 14.01 5.55 re B |
| 276 | +160.73 261.29 14.06 5.55 re B |
| 277 | +160.73 252.96 14.14 5.55 re B |
| 278 | +160.73 244.63 14.14 5.55 re B |
| 279 | +160.73 236.30 14.23 5.55 re B |
| 280 | +160.73 227.96 14.29 5.55 re B |
| 281 | +160.73 219.63 14.35 5.55 re B |
| 282 | +160.73 211.30 14.39 5.55 re B |
| 283 | +160.73 202.97 14.49 5.55 re B |
| 284 | +160.73 194.64 14.62 5.55 re B |
| 285 | +160.73 186.31 14.66 5.55 re B |
| 286 | +160.73 177.98 14.69 5.55 re B |
| 287 | +160.73 169.65 14.94 5.55 re B |
| 288 | +160.73 161.32 15.38 5.55 re B |
| 289 | +160.73 152.99 16.45 5.55 re B |
| 290 | +160.73 144.66 17.24 5.55 re B |
| 291 | +160.73 136.33 17.31 5.55 re B |
| 292 | +160.73 128.00 17.66 5.55 re B |
| 293 | +160.73 119.67 18.54 5.55 re B |
| 294 | +160.73 111.34 18.57 5.55 re B |
| 295 | +160.73 103.01 20.23 5.55 re B |
| 296 | +160.73 94.68 21.28 5.55 re B |
| 297 | +160.73 86.35 22.11 5.55 re B |
| 298 | +160.73 78.02 22.20 5.55 re B |
| 299 | +160.73 69.69 22.37 5.55 re B |
| 300 | +160.73 61.36 23.52 5.55 re B |
| 301 | +160.73 53.03 23.55 5.55 re B |
| 302 | +Q q |
| 303 | +Q q |
| 304 | +/sRGB CS 0.000 0.000 0.000 SCN |
| 305 | +0.75 w |
| 306 | +[] 0 d |
| 307 | +1 J |
| 308 | +1 j |
| 309 | +10.00 M |
| 310 | +160.73 50.80 319.93 418.19 re S |
| 311 | +Q q |
| 312 | +Q q |
| 313 | +Q q |
| 314 | +Q |
| 315 | +endstream |
| 316 | +endobj |
| 317 | +9 0 obj |
| 318 | +6726 |
| 319 | +endobj |
| 320 | +3 0 obj |
| 321 | +<< |
| 322 | +/Type /Pages |
| 323 | +/Kids [ |
| 324 | +7 0 R |
| 325 | +] |
| 326 | +/Count 1 |
| 327 | +/MediaBox [0 0 504 504] |
| 328 | +>> |
| 329 | +endobj |
| 330 | +4 0 obj |
| 331 | +<< |
| 332 | +/ProcSet [/PDF /Text] |
| 333 | +/Font <</F2 11 0 R >> |
| 334 | +/ExtGState << >> |
| 335 | +/ColorSpace << /sRGB 5 0 R >> |
| 336 | +>> |
| 337 | +endobj |
| 338 | +5 0 obj |
| 339 | +[/ICCBased 6 0 R] |
| 340 | +endobj |
| 341 | +6 0 obj |
| 342 | +<< /N 3 /Alternate /DeviceRGB /Length 9433 /Filter /ASCIIHexDecode >> |
| 343 | +stream |
| 344 | +00 00 0c 48 4c 69 6e 6f 02 10 00 00 6d 6e 74 72 |
| 345 | +52 47 42 20 58 59 5a 20 07 ce 00 02 00 09 00 06 |
| 346 | +00 31 00 00 61 63 73 70 4d 53 46 54 00 00 00 00 |
| 347 | +49 45 43 20 73 52 47 42 00 00 00 00 00 00 00 00 |
| 348 | +00 00 00 00 00 00 f6 d6 00 01 00 00 00 00 d3 2d |
| 349 | +48 50 20 20 00 00 00 00 00 00 00 00 00 00 00 00 |
| 350 | +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
| 351 | +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
| 352 | +00 00 00 11 63 70 72 74 00 00 01 50 00 00 00 33 |
| 353 | +64 65 73 63 00 00 01 84 00 00 00 6c 77 74 70 74 |
| 354 | +00 00 01 f0 00 00 00 14 62 6b 70 74 00 00 02 04 |
| 355 | +00 00 00 14 72 58 59 5a 00 00 02 18 00 00 00 14 |
| 356 | +67 58 59 5a 00 00 02 2c 00 00 00 14 62 58 59 5a |
| 357 | +00 00 02 40 00 00 00 14 64 6d 6e 64 00 00 02 54 |
| 358 | +00 00 00 70 64 6d 64 64 00 00 02 c4 00 00 00 88 |
| 359 | +76 75 65 64 00 00 03 4c 00 00 00 86 76 69 65 77 |
| 360 | +00 00 03 d4 00 00 00 24 6c 75 6d 69 00 00 03 f8 |
| 361 | +00 00 00 14 6d 65 61 73 00 00 04 0c 00 00 00 24 |
| 362 | +74 65 63 68 00 00 04 30 00 00 00 0c 72 54 52 43 |
| 363 | +00 00 04 3c 00 00 08 0c 67 54 52 43 00 00 04 3c |
| 364 | +00 00 08 0c 62 54 52 43 00 00 04 3c 00 00 08 0c |
| 365 | +74 65 78 74 00 00 00 00 43 6f 70 79 72 69 67 68 |
| 366 | +74 20 28 63 29 20 31 39 39 38 20 48 65 77 6c 65 |
| 367 | +74 74 2d 50 61 63 6b 61 72 64 20 43 6f 6d 70 61 |
| 368 | +6e 79 00 00 64 65 73 63 00 00 00 00 00 00 00 12 |
| 369 | +73 52 47 42 20 49 45 43 36 31 39 36 36 2d 32 2e |
| 370 | +31 00 00 00 00 00 00 00 00 00 00 00 12 73 52 47 |
| 371 | +42 20 49 45 43 36 31 39 36 36 2d 32 2e 31 00 00 |
| 372 | +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
| 373 | +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
| 374 | +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
| 375 | +58 59 5a 20 00 00 00 00 00 00 f3 51 00 01 00 00 |
| 376 | +00 01 16 cc 58 59 5a 20 00 00 00 00 00 00 00 00 |
| 377 | +00 00 00 00 00 00 00 00 58 59 5a 20 00 00 00 00 |
| 378 | +00 00 6f a2 00 00 38 f5 00 00 03 90 58 59 5a 20 |
| 379 | +00 00 00 00 00 00 62 99 00 00 b7 85 00 00 18 da |
| 380 | +58 59 5a 20 00 00 00 00 00 00 24 a0 00 00 0f 84 |
| 381 | +00 00 b6 cf 64 65 73 63 00 00 00 00 00 00 00 16 |
| 382 | +49 45 43 20 68 74 74 70 3a 2f 2f 77 77 77 2e 69 |
| 383 | +65 63 2e 63 68 00 00 00 00 00 00 00 00 00 00 00 |
| 384 | +16 49 45 43 20 68 74 74 70 3a 2f 2f 77 77 77 2e |
| 385 | +69 65 63 2e 63 68 00 00 00 00 00 00 00 00 00 00 |
| 386 | +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
| 387 | +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
| 388 | +00 00 00 00 64 65 73 63 00 00 00 00 00 00 00 2e |
| 389 | +49 45 43 20 36 31 39 36 36 2d 32 2e 31 20 44 65 |
| 390 | +66 61 75 6c 74 20 52 47 42 20 63 6f 6c 6f 75 72 |
| 391 | +20 73 70 61 63 65 20 2d 20 73 52 47 42 00 00 00 |
| 392 | +00 00 00 00 00 00 00 00 2e 49 45 43 20 36 31 39 |
| 393 | +36 36 2d 32 2e 31 20 44 65 66 61 75 6c 74 20 52 |
| 394 | +47 42 20 63 6f 6c 6f 75 72 20 73 70 61 63 65 20 |
| 395 | +2d 20 73 52 47 42 00 00 00 00 00 00 00 00 00 00 |
| 396 | +00 00 00 00 00 00 00 00 00 00 00 00 64 65 73 63 |
| 397 | +00 00 00 00 00 00 00 2c 52 65 66 65 72 65 6e 63 |
| 398 | +65 20 56 69 65 77 69 6e 67 20 43 6f 6e 64 69 74 |
| 399 | +69 6f 6e 20 69 6e 20 49 45 43 36 31 39 36 36 2d |
| 400 | +32 2e 31 00 00 00 00 00 00 00 00 00 00 00 2c 52 |
| 401 | +65 66 65 72 65 6e 63 65 20 56 69 65 77 69 6e 67 |
| 402 | +20 43 6f 6e 64 69 74 69 6f 6e 20 69 6e 20 49 45 |
| 403 | +43 36 31 39 36 36 2d 32 2e 31 00 00 00 00 00 00 |
| 404 | +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
| 405 | +00 00 00 00 76 69 65 77 00 00 00 00 00 13 a4 fe |
| 406 | +00 14 5f 2e 00 10 cf 14 00 03 ed cc 00 04 13 0b |
| 407 | +00 03 5c 9e 00 00 00 01 58 59 5a 20 00 00 00 00 |
| 408 | +00 4c 09 56 00 50 00 00 00 57 1f e7 6d 65 61 73 |
| 409 | +00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 |
| 410 | +00 00 00 00 00 00 00 00 00 00 02 8f 00 00 00 02 |
| 411 | +73 69 67 20 00 00 00 00 43 52 54 20 63 75 72 76 |
| 412 | +00 00 00 00 00 00 04 00 00 00 00 05 00 0a 00 0f |
| 413 | +00 14 00 19 00 1e 00 23 00 28 00 2d 00 32 00 37 |
| 414 | +00 3b 00 40 00 45 00 4a 00 4f 00 54 00 59 00 5e |
| 415 | +00 63 00 68 00 6d 00 72 00 77 00 7c 00 81 00 86 |
| 416 | +00 8b 00 90 00 95 00 9a 00 9f 00 a4 00 a9 00 ae |
| 417 | +00 b2 00 b7 00 bc 00 c1 00 c6 00 cb 00 d0 00 d5 |
| 418 | +00 db 00 e0 00 e5 00 eb 00 f0 00 f6 00 fb 01 01 |
| 419 | +01 07 01 0d 01 13 01 19 01 1f 01 25 01 2b 01 32 |
| 420 | +01 38 01 3e 01 45 01 4c 01 52 01 59 01 60 01 67 |
| 421 | +01 6e 01 75 01 7c 01 83 01 8b 01 92 01 9a 01 a1 |
| 422 | +01 a9 01 b1 01 b9 01 c1 01 c9 01 d1 01 d9 01 e1 |
| 423 | +01 e9 01 f2 01 fa 02 03 02 0c 02 14 02 1d 02 26 |
| 424 | +02 2f 02 38 02 41 02 4b 02 54 02 5d 02 67 02 71 |
| 425 | +02 7a 02 84 02 8e 02 98 02 a2 02 ac 02 b6 02 c1 |
| 426 | +02 cb 02 d5 02 e0 02 eb 02 f5 03 00 03 0b 03 16 |
| 427 | +03 21 03 2d 03 38 03 43 03 4f 03 5a 03 66 03 72 |
| 428 | +03 7e 03 8a 03 96 03 a2 03 ae 03 ba 03 c7 03 d3 |
| 429 | +03 e0 03 ec 03 f9 04 06 04 13 04 20 04 2d 04 3b |
| 430 | +04 48 04 55 04 63 04 71 04 7e 04 8c 04 9a 04 a8 |
| 431 | +04 b6 04 c4 04 d3 04 e1 04 f0 04 fe 05 0d 05 1c |
| 432 | +05 2b 05 3a 05 49 05 58 05 67 05 77 05 86 05 96 |
| 433 | +05 a6 05 b5 05 c5 05 d5 05 e5 05 f6 06 06 06 16 |
| 434 | +06 27 06 37 06 48 06 59 06 6a 06 7b 06 8c 06 9d |
| 435 | +06 af 06 c0 06 d1 06 e3 06 f5 07 07 07 19 07 2b |
| 436 | +07 3d 07 4f 07 61 07 74 07 86 07 99 07 ac 07 bf |
| 437 | +07 d2 07 e5 07 f8 08 0b 08 1f 08 32 08 46 08 5a |
| 438 | +08 6e 08 82 08 96 08 aa 08 be 08 d2 08 e7 08 fb |
| 439 | +09 10 09 25 09 3a 09 4f 09 64 09 79 09 8f 09 a4 |
| 440 | +09 ba 09 cf 09 e5 09 fb 0a 11 0a 27 0a 3d 0a 54 |
| 441 | +0a 6a 0a 81 0a 98 0a ae 0a c5 0a dc 0a f3 0b 0b |
| 442 | +0b 22 0b 39 0b 51 0b 69 0b 80 0b 98 0b b0 0b c8 |
| 443 | +0b e1 0b f9 0c 12 0c 2a 0c 43 0c 5c 0c 75 0c 8e |
| 444 | +0c a7 0c c0 0c d9 0c f3 0d 0d 0d 26 0d 40 0d 5a |
| 445 | +0d 74 0d 8e 0d a9 0d c3 0d de 0d f8 0e 13 0e 2e |
| 446 | +0e 49 0e 64 0e 7f 0e 9b 0e b6 0e d2 0e ee 0f 09 |
| 447 | +0f 25 0f 41 0f 5e 0f 7a 0f 96 0f b3 0f cf 0f ec |
| 448 | +10 09 10 26 10 43 10 61 10 7e 10 9b 10 b9 10 d7 |
| 449 | +10 f5 11 13 11 31 11 4f 11 6d 11 8c 11 aa 11 c9 |
| 450 | +11 e8 12 07 12 26 12 45 12 64 12 84 12 a3 12 c3 |
| 451 | +12 e3 13 03 13 23 13 43 13 63 13 83 13 a4 13 c5 |
| 452 | +13 e5 14 06 14 27 14 49 14 6a 14 8b 14 ad 14 ce |
| 453 | +14 f0 15 12 15 34 15 56 15 78 15 9b 15 bd 15 e0 |
| 454 | +16 03 16 26 16 49 16 6c 16 8f 16 b2 16 d6 16 fa |
| 455 | +17 1d 17 41 17 65 17 89 17 ae 17 d2 17 f7 18 1b |
| 456 | +18 40 18 65 18 8a 18 af 18 d5 18 fa 19 20 19 45 |
| 457 | +19 6b 19 91 19 b7 19 dd 1a 04 1a 2a 1a 51 1a 77 |
| 458 | +1a 9e 1a c5 1a ec 1b 14 1b 3b 1b 63 1b 8a 1b b2 |
| 459 | +1b da 1c 02 1c 2a 1c 52 1c 7b 1c a3 1c cc 1c f5 |
| 460 | +1d 1e 1d 47 1d 70 1d 99 1d c3 1d ec 1e 16 1e 40 |
| 461 | +1e 6a 1e 94 1e be 1e e9 1f 13 1f 3e 1f 69 1f 94 |
| 462 | +1f bf 1f ea 20 15 20 41 20 6c 20 98 20 c4 20 f0 |
| 463 | +21 1c 21 48 21 75 21 a1 21 ce 21 fb 22 27 22 55 |
| 464 | +22 82 22 af 22 dd 23 0a 23 38 23 66 23 94 23 c2 |
| 465 | +23 f0 24 1f 24 4d 24 7c 24 ab 24 da 25 09 25 38 |
| 466 | +25 68 25 97 25 c7 25 f7 26 27 26 57 26 87 26 b7 |
| 467 | +26 e8 27 18 27 49 27 7a 27 ab 27 dc 28 0d 28 3f |
| 468 | +28 71 28 a2 28 d4 29 06 29 38 29 6b 29 9d 29 d0 |
| 469 | +2a 02 2a 35 2a 68 2a 9b 2a cf 2b 02 2b 36 2b 69 |
| 470 | +2b 9d 2b d1 2c 05 2c 39 2c 6e 2c a2 2c d7 2d 0c |
| 471 | +2d 41 2d 76 2d ab 2d e1 2e 16 2e 4c 2e 82 2e b7 |
| 472 | +2e ee 2f 24 2f 5a 2f 91 2f c7 2f fe 30 35 30 6c |
| 473 | +30 a4 30 db 31 12 31 4a 31 82 31 ba 31 f2 32 2a |
| 474 | +32 63 32 9b 32 d4 33 0d 33 46 33 7f 33 b8 33 f1 |
| 475 | +34 2b 34 65 34 9e 34 d8 35 13 35 4d 35 87 35 c2 |
| 476 | +35 fd 36 37 36 72 36 ae 36 e9 37 24 37 60 37 9c |
| 477 | +37 d7 38 14 38 50 38 8c 38 c8 39 05 39 42 39 7f |
| 478 | +39 bc 39 f9 3a 36 3a 74 3a b2 3a ef 3b 2d 3b 6b |
| 479 | +3b aa 3b e8 3c 27 3c 65 3c a4 3c e3 3d 22 3d 61 |
| 480 | +3d a1 3d e0 3e 20 3e 60 3e a0 3e e0 3f 21 3f 61 |
| 481 | +3f a2 3f e2 40 23 40 64 40 a6 40 e7 41 29 41 6a |
| 482 | +41 ac 41 ee 42 30 42 72 42 b5 42 f7 43 3a 43 7d |
| 483 | +43 c0 44 03 44 47 44 8a 44 ce 45 12 45 55 45 9a |
| 484 | +45 de 46 22 46 67 46 ab 46 f0 47 35 47 7b 47 c0 |
| 485 | +48 05 48 4b 48 91 48 d7 49 1d 49 63 49 a9 49 f0 |
| 486 | +4a 37 4a 7d 4a c4 4b 0c 4b 53 4b 9a 4b e2 4c 2a |
| 487 | +4c 72 4c ba 4d 02 4d 4a 4d 93 4d dc 4e 25 4e 6e |
| 488 | +4e b7 4f 00 4f 49 4f 93 4f dd 50 27 50 71 50 bb |
| 489 | +51 06 51 50 51 9b 51 e6 52 31 52 7c 52 c7 53 13 |
| 490 | +53 5f 53 aa 53 f6 54 42 54 8f 54 db 55 28 55 75 |
| 491 | +55 c2 56 0f 56 5c 56 a9 56 f7 57 44 57 92 57 e0 |
| 492 | +58 2f 58 7d 58 cb 59 1a 59 69 59 b8 5a 07 5a 56 |
| 493 | +5a a6 5a f5 5b 45 5b 95 5b e5 5c 35 5c 86 5c d6 |
| 494 | +5d 27 5d 78 5d c9 5e 1a 5e 6c 5e bd 5f 0f 5f 61 |
| 495 | +5f b3 60 05 60 57 60 aa 60 fc 61 4f 61 a2 61 f5 |
| 496 | +62 49 62 9c 62 f0 63 43 63 97 63 eb 64 40 64 94 |
| 497 | +64 e9 65 3d 65 92 65 e7 66 3d 66 92 66 e8 67 3d |
| 498 | +67 93 67 e9 68 3f 68 96 68 ec 69 43 69 9a 69 f1 |
| 499 | +6a 48 6a 9f 6a f7 6b 4f 6b a7 6b ff 6c 57 6c af |
| 500 | +6d 08 6d 60 6d b9 6e 12 6e 6b 6e c4 6f 1e 6f 78 |
| 501 | +6f d1 70 2b 70 86 70 e0 71 3a 71 95 71 f0 72 4b |
| 502 | +72 a6 73 01 73 5d 73 b8 74 14 74 70 74 cc 75 28 |
| 503 | +75 85 75 e1 76 3e 76 9b 76 f8 77 56 77 b3 78 11 |
| 504 | +78 6e 78 cc 79 2a 79 89 79 e7 7a 46 7a a5 7b 04 |
| 505 | +7b 63 7b c2 7c 21 7c 81 7c e1 7d 41 7d a1 7e 01 |
| 506 | +7e 62 7e c2 7f 23 7f 84 7f e5 80 47 80 a8 81 0a |
| 507 | +81 6b 81 cd 82 30 82 92 82 f4 83 57 83 ba 84 1d |
| 508 | +84 80 84 e3 85 47 85 ab 86 0e 86 72 86 d7 87 3b |
| 509 | +87 9f 88 04 88 69 88 ce 89 33 89 99 89 fe 8a 64 |
| 510 | +8a ca 8b 30 8b 96 8b fc 8c 63 8c ca 8d 31 8d 98 |
| 511 | +8d ff 8e 66 8e ce 8f 36 8f 9e 90 06 90 6e 90 d6 |
| 512 | +91 3f 91 a8 92 11 92 7a 92 e3 93 4d 93 b6 94 20 |
| 513 | +94 8a 94 f4 95 5f 95 c9 96 34 96 9f 97 0a 97 75 |
| 514 | +97 e0 98 4c 98 b8 99 24 99 90 99 fc 9a 68 9a d5 |
| 515 | +9b 42 9b af 9c 1c 9c 89 9c f7 9d 64 9d d2 9e 40 |
| 516 | +9e ae 9f 1d 9f 8b 9f fa a0 69 a0 d8 a1 47 a1 b6 |
| 517 | +a2 26 a2 96 a3 06 a3 76 a3 e6 a4 56 a4 c7 a5 38 |
| 518 | +a5 a9 a6 1a a6 8b a6 fd a7 6e a7 e0 a8 52 a8 c4 |
| 519 | +a9 37 a9 a9 aa 1c aa 8f ab 02 ab 75 ab e9 ac 5c |
| 520 | +ac d0 ad 44 ad b8 ae 2d ae a1 af 16 af 8b b0 00 |
| 521 | +b0 75 b0 ea b1 60 b1 d6 b2 4b b2 c2 b3 38 b3 ae |
| 522 | +b4 25 b4 9c b5 13 b5 8a b6 01 b6 79 b6 f0 b7 68 |
| 523 | +b7 e0 b8 59 b8 d1 b9 4a b9 c2 ba 3b ba b5 bb 2e |
| 524 | +bb a7 bc 21 bc 9b bd 15 bd 8f be 0a be 84 be ff |
| 525 | +bf 7a bf f5 c0 70 c0 ec c1 67 c1 e3 c2 5f c2 db |
| 526 | +c3 58 c3 d4 c4 51 c4 ce c5 4b c5 c8 c6 46 c6 c3 |
| 527 | +c7 41 c7 bf c8 3d c8 bc c9 3a c9 b9 ca 38 ca b7 |
| 528 | +cb 36 cb b6 cc 35 cc b5 cd 35 cd b5 ce 36 ce b6 |
| 529 | +cf 37 cf b8 d0 39 d0 ba d1 3c d1 be d2 3f d2 c1 |
| 530 | +d3 44 d3 c6 d4 49 d4 cb d5 4e d5 d1 d6 55 d6 d8 |
| 531 | +d7 5c d7 e0 d8 64 d8 e8 d9 6c d9 f1 da 76 da fb |
| 532 | +db 80 dc 05 dc 8a dd 10 dd 96 de 1c de a2 df 29 |
| 533 | +df af e0 36 e0 bd e1 44 e1 cc e2 53 e2 db e3 63 |
| 534 | +e3 eb e4 73 e4 fc e5 84 e6 0d e6 96 e7 1f e7 a9 |
| 535 | +e8 32 e8 bc e9 46 e9 d0 ea 5b ea e5 eb 70 eb fb |
| 536 | +ec 86 ed 11 ed 9c ee 28 ee b4 ef 40 ef cc f0 58 |
| 537 | +f0 e5 f1 72 f1 ff f2 8c f3 19 f3 a7 f4 34 f4 c2 |
| 538 | +f5 50 f5 de f6 6d f6 fb f7 8a f8 19 f8 a8 f9 38 |
| 539 | +f9 c7 fa 57 fa e7 fb 77 fc 07 fc 98 fd 29 fd ba |
| 540 | +fe 4b fe dc ff 6d ff ff > |
| 541 | +endstream |
| 542 | +endobj |
| 543 | +10 0 obj |
| 544 | +<< |
| 545 | +/Type /Encoding |
| 546 | +/BaseEncoding /WinAnsiEncoding |
| 547 | +/Differences [ 45/minus 96/quoteleft |
| 548 | +144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent |
| 549 | +/dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] |
| 550 | +>> |
| 551 | +endobj |
| 552 | +11 0 obj << |
| 553 | +/Type /Font |
| 554 | +/Subtype /Type1 |
| 555 | +/Name /F2 |
| 556 | +/BaseFont /Helvetica |
| 557 | +/Encoding 10 0 R |
| 558 | +>> endobj |
| 559 | +xref |
| 560 | +0 12 |
| 561 | +0000000000 65535 f |
| 562 | +0000000021 00000 n |
| 563 | +0000000164 00000 n |
| 564 | +0000007092 00000 n |
| 565 | +0000007175 00000 n |
| 566 | +0000007287 00000 n |
| 567 | +0000007320 00000 n |
| 568 | +0000000213 00000 n |
| 569 | +0000000293 00000 n |
| 570 | +0000007072 00000 n |
| 571 | +0000016856 00000 n |
| 572 | +0000017114 00000 n |
| 573 | +trailer |
| 574 | +<< |
| 575 | +/Size 12 |
| 576 | +/Info 1 0 R |
| 577 | +/Root 2 0 R |
| 578 | +>> |
| 579 | +startxref |
| 580 | +17212 |
| 581 | +%%EOF |
Index: trunk/tools/wsor/overworked/R/util/env.R |
— | — | @@ -0,0 +1 @@ |
| 2 | +DATA_DIR = "~/data/overworked" |
Index: trunk/tools/wsor/overworked/get_patrol_activity.py |
— | — | @@ -0,0 +1,68 @@ |
| 2 | +import MySQLdb, MySQLdb.cursors, re |
| 3 | + |
| 4 | + |
| 5 | + |
| 6 | +AUTO_PATROLLED = re.compile(r'[0-9]+\n[0-9]\n1') |
| 7 | + |
| 8 | +class DB: |
| 9 | + |
| 10 | + def __init__(self, conn): |
| 11 | + self.conn = conn |
| 12 | + |
| 13 | + def getPatrolerDays(self, removeAuto=True, namespaces=[], bots=): |
| 14 | + cursor = self.conn.cursor(MySQLdb.cursors.SSDictCursor) |
| 15 | + query = """ |
| 16 | + SELECT |
| 17 | + l.log_user, |
| 18 | + u.user_name, |
| 19 | + SUBSTRING(log_timestamp,1,4), |
| 20 | + SUBSTRING(log_timestamp,5,2), |
| 21 | + SUBSTRING(log_timestamp,5,2) |
| 22 | + FROM logging l |
| 23 | + INNER JOIN user u |
| 24 | + ON u.user_id = l.log_user |
| 25 | + WHERE log_action = "patrol" |
| 26 | + AND log_type = "patrol" |
| 27 | + GROUP BY |
| 28 | + l.log_user, |
| 29 | + u.user_name, |
| 30 | + SUBSTRING(log_timestamp,1,4), |
| 31 | + SUBSTRING(log_timestamp,5,2), |
| 32 | + SUBSTRING(log_timestamp,5,2) |
| 33 | + """ |
| 34 | + if removeAuto: |
| 35 | + query += "AND log_params NOT REGEXP '[0-9]+\\n[0-9]\\n1'\n" |
| 36 | + |
| 37 | + if len(namespaces) > 0: |
| 38 | + query += "AND log_namespace in (" + ",".join(str(int(n)) for n in namespaces) + ")" |
| 39 | + |
| 40 | + cursor.execute(query) |
| 41 | + |
| 42 | + return cursor |
| 43 | + |
| 44 | + |
| 45 | + |
| 46 | +def main(args): |
| 47 | + |
| 48 | + |
| 49 | +if __name__ == "__main__": |
| 50 | + parser = argparse.ArgumentParser( |
| 51 | + description='Produces a list of patrol events.' |
| 52 | + ) |
| 53 | + parser.add_argument( |
| 54 | + 'bots', |
| 55 | + metavar="<path>", |
| 56 | + type=lambda fn:open(fn, "r"), |
| 57 | + help='the path to the bots file' |
| 58 | + ) |
| 59 | + parser.add_argument( |
| 60 | + '-i', '--input', |
| 61 | + metavar="<path>", |
| 62 | + type=lambda fn:open(fn, "r"), |
| 63 | + help='the path of the file to filter (defaults to stdin)', |
| 64 | + default=sys.stdin |
| 65 | + ) |
| 66 | + args = parser.parse_args() |
| 67 | + main(args) |
| 68 | + |
| 69 | + |
Index: trunk/tools/wsor/overworked/fix_long_number_bs.py |
— | — | @@ -0,0 +1,21 @@ |
| 2 | +import types, sys |
| 3 | + |
| 4 | +def clean(v): |
| 5 | + if type(v) == types.LongType: |
| 6 | + return str(int(v)) |
| 7 | + else: |
| 8 | + return repr(v) |
| 9 | + |
| 10 | + |
| 11 | + |
| 12 | +f = open("patroller_days.20110610.tsv") |
| 13 | +out = open("patroller_days.fixed.tsv", "w") |
| 14 | + |
| 15 | +for line in f: |
| 16 | + vals = [eval(val) for val in line.strip().split("\t")] |
| 17 | + out.write("\t".join(clean(val) for val in vals)) |
| 18 | + out.write("\n") |
| 19 | + |
| 20 | +out.close() |
| 21 | + |
| 22 | + |
Index: trunk/tools/wsor/overworked/remove_bots.py |
— | — | @@ -0,0 +1,41 @@ |
| 2 | +import sys, argparse |
| 3 | + |
| 4 | + |
| 5 | +def main(args): |
| 6 | + |
| 7 | + bots = set() |
| 8 | + for line in args.bots: |
| 9 | + bots.add(int(line.strip())) |
| 10 | + |
| 11 | + headerLine = args.input.readline().strip() |
| 12 | + headers = [eval(h) for h in headerLine.split("\t")] |
| 13 | + print(headerLine) |
| 14 | + |
| 15 | + for line in args.input: |
| 16 | + row = dict(zip(headers, [eval(v) for v in line.strip().split("\t")])) |
| 17 | + if row['user_id'] not in bots: |
| 18 | + print(line.strip()) |
| 19 | + |
| 20 | + |
| 21 | + |
| 22 | + |
| 23 | +if __name__ == "__main__": |
| 24 | + parser = argparse.ArgumentParser( |
| 25 | + description= |
| 26 | + 'Removes bot editors from patrollers file' |
| 27 | + ) |
| 28 | + parser.add_argument( |
| 29 | + 'bots', |
| 30 | + metavar="<path>", |
| 31 | + type=lambda fn:open(fn, "r"), |
| 32 | + help='the path to the bots file' |
| 33 | + ) |
| 34 | + parser.add_argument( |
| 35 | + '-i', '--input', |
| 36 | + metavar="<path>", |
| 37 | + type=lambda fn:open(fn, "r"), |
| 38 | + help='the path of the file to filter (defaults to stdin)', |
| 39 | + default=sys.stdin |
| 40 | + ) |
| 41 | + args = parser.parse_args() |
| 42 | + main(args) |
Index: trunk/tools/wsor/overworked/testing.sql |
— | — | @@ -0,0 +1,95 @@ |
| 2 | ++------------+-------------+ |
| 3 | +| log_action | log_type | |
| 4 | ++------------+-------------+ |
| 5 | +| delete | delete | |
| 6 | +| upload | upload | |
| 7 | +| protect | protect | |
| 8 | +| block | block | |
| 9 | +| unblock | block | |
| 10 | +| restore | delete | |
| 11 | +| unprotect | protect | |
| 12 | +| rights | rights | |
| 13 | +| move | move | |
| 14 | +| move_redir | move | |
| 15 | +| | | |
| 16 | +| renameuser | renameuser | |
| 17 | +| newusers | newusers | |
| 18 | +| create | newusers | |
| 19 | +| create2 | newusers | |
| 20 | +| modify | protect | |
| 21 | +| overwrite | upload | |
| 22 | +| upload | import | |
| 23 | +| patrol | patrol | |
| 24 | +| delete | suppress | |
| 25 | +| autocreate | newusers | |
| 26 | +| delete | globalauth | |
| 27 | +| whitelist | gblblock | |
| 28 | +| dwhitelist | gblblock | |
| 29 | +| move_prot | protect | |
| 30 | +| reblock | block | |
| 31 | +| event | suppress | |
| 32 | +| event | delete | |
| 33 | +| revision | delete | |
| 34 | +| revision | suppress | |
| 35 | +| reblock | suppress | |
| 36 | +| modify | abusefilter | |
| 37 | +| block | suppress | |
| 38 | +| usergroups | gblrights | |
| 39 | +| interwiki | import | |
| 40 | +| groupprms2 | gblrights | |
| 41 | +| config | stable | |
| 42 | +| approve-ia | review | |
| 43 | +| approve-a | review | |
| 44 | +| unapprove | review | |
| 45 | +| approve | review | |
| 46 | +| reset | stable | |
| 47 | +| modify | stable | |
| 48 | +| approve-i | review | |
| 49 | +| hide-afl | suppress | |
| 50 | +| unhide-afl | suppress | |
| 51 | ++------------+-------------+ |
| 52 | +46 rows in set (2 min 28.77 sec) |
| 53 | + |
| 54 | +SELECT log_user, count(*) |
| 55 | +FROM logging l |
| 56 | +WHERE log_action = "patrol" |
| 57 | +AND log_type = "patrol" |
| 58 | + |
| 59 | +SELECT SUBSTRING(log_timestamp,1,4) as year, count(*) as count |
| 60 | +FROM logging l |
| 61 | +WHERE log_action = "patrol" |
| 62 | +AND log_type = "patrol" |
| 63 | +GROUP BY SUBSTRING(log_timestamp,1,4); |
| 64 | + |
| 65 | + |
| 66 | +SELECT p.page_id, p.page_title, count(*) |
| 67 | +FROM logging l |
| 68 | +INNER JOIN page p |
| 69 | +ON l.log_page = p.page_id |
| 70 | +WHERE log_action = "suppress" |
| 71 | +AND log_timestamp BETWEEN "20040000000000" AND "20049999999999" |
| 72 | +GROUP BY p.page_id, p.page_title; |
| 73 | + |
| 74 | + |
| 75 | + |
| 76 | +CREATE TABLE halfak.reverted_20100130( |
| 77 | + revision_id INT, |
| 78 | + username VARBINARY(255), |
| 79 | + user_id INT, |
| 80 | + comment VARBINARY(255), |
| 81 | + rvtg_id INT, |
| 82 | + rvtg_username VARBINARY(255), |
| 83 | + rvtg_user_id INT, |
| 84 | + rvtg_comment VARBINARY(255), |
| 85 | + rvtto_id INT, |
| 86 | + rvtto_username VARBINARY(255), |
| 87 | + rvtto_user_id INT, |
| 88 | + rvtto_comment VARBINARY(255), |
| 89 | + is_vandalism BOOL, |
| 90 | + revs_reverted INT |
| 91 | +) |
| 92 | + |
| 93 | + |
| 94 | +--SELECT * FROM revision WHERE rev_comment LIKE "Requesting speedy deletion%" |
| 95 | + |
| 96 | + |
Index: trunk/tools/wsor/overworked/get_patroller_talk_posts.py |
— | — | @@ -0,0 +1,8 @@ |
| 2 | + |
| 3 | + |
| 4 | + |
| 5 | + |
| 6 | + |
| 7 | +def main(args): |
| 8 | + |
| 9 | + for patrol in |
Index: trunk/tools/wsor/overworked/patroller_days.fixed.tsv |
Index: trunk/tools/wsor/scripts/extract_revision_meta.py |
— | — | @@ -0,0 +1,200 @@ |
| 2 | +import sys, subprocess, os, errno, re, argparse, logging, hashlib, types
|
| 3 | +from difflib import SequenceMatcher
|
| 4 | +from gl import wp
|
| 5 | +from gl.containers import LimitedDictLists
|
| 6 | +
|
| 7 | +from text import STOP_WORDS, MARKUP
|
| 8 | +
|
| 9 | +class FileTypeError(Exception):pass
|
| 10 | +class FileTypeWarning(Warning):pass
|
| 11 | +
|
| 12 | +def clean(v):
|
| 13 | + if type(v) == types.LongType:
|
| 14 | + return str(int(v))
|
| 15 | + elif v == None:
|
| 16 | + return "\\N"
|
| 17 | + else:
|
| 18 | + return repr(v)
|
| 19 | +
|
| 20 | +
|
| 21 | +EXTENSIONS = {
|
| 22 | + 'xml': "cat",
|
| 23 | + 'bz2': "bzcat",
|
| 24 | + '7z': "7z e -so"
|
| 25 | +}
|
| 26 | +
|
| 27 | +EXT_RE = re.compile(r'\.([^\.]+)$')
|
| 28 | +def dumpFile(path):
|
| 29 | + path = os.path.expanduser(path)
|
| 30 | + if not os.path.isfile(path):
|
| 31 | + raise FileTypeError("Can't find file %s" % path)
|
| 32 | +
|
| 33 | + match = EXT_RE.search(path)
|
| 34 | + if match == None:
|
| 35 | + raise FileTypeError("No extension found for %s." % path)
|
| 36 | + elif match.groups()[0] not in EXTENSIONS:
|
| 37 | + raise FileTypeError("File type %r is not supported." % path)
|
| 38 | + else:
|
| 39 | + call = EXTENSIONS[match.groups()[0]]
|
| 40 | + process = subprocess.Popen("%s %s" % (call, path), shell=True, stdout=subprocess.PIPE)
|
| 41 | + return process.stdout
|
| 42 | +
|
| 43 | +
|
| 44 | +def output(path):
|
| 45 | + path = os.path.expanduser(path)
|
| 46 | + try:
|
| 47 | + os.makedirs(path)
|
| 48 | + except OSError as e:
|
| 49 | + if e.errno == errno.EEXIST:
|
| 50 | + return path
|
| 51 | + else:
|
| 52 | + raise e
|
| 53 | +
|
| 54 | + return path
|
| 55 | +
|
| 56 | +def tokenize(text):
|
| 57 | + return re.findall(
|
| 58 | + r"[\w]+|\[\[|\]\]|\{\{|\}\}|\n+| +|&\w+;|'''|''|=+|\{\||\|\}|\|\-|.",
|
| 59 | + text
|
| 60 | + )
|
| 61 | +
|
| 62 | +def simpleDiff(a, b):
|
| 63 | + sm = SequenceMatcher(None, a, b)
|
| 64 | + added = []
|
| 65 | + removed = []
|
| 66 | + for (tag, i1, i2, j1, j2) in sm.get_opcodes():
|
| 67 | + if tag == 'replace':
|
| 68 | + removed.extend(a[i1:i2])
|
| 69 | + added.extend(b[j1:j2])
|
| 70 | + elif tag == 'delete':
|
| 71 | + removed.extend(a[i1:i2])
|
| 72 | + elif tag == 'insert':
|
| 73 | + added.extend(b[i1:i2])
|
| 74 | +
|
| 75 | + return (added, removed)
|
| 76 | +
|
| 77 | +
|
| 78 | +
|
| 79 | +def main(args):
|
| 80 | + LOGGING_STREAM = sys.stderr
|
| 81 | + logging.basicConfig(
|
| 82 | + level=logging.DEBUG,
|
| 83 | + stream=LOGGING_STREAM,
|
| 84 | + format='%(asctime)s %(levelname)-8s %(message)s',
|
| 85 | + datefmt='%b-%d %H:%M:%S'
|
| 86 | + )
|
| 87 | +
|
| 88 | + logging.info("Setting up output files in %s" % args.out)
|
| 89 | + reverts = open(os.path.join(args.out, "revert.tsv"), "w")
|
| 90 | + revertHeaders = ['rev_id', 'to_id', 'revs_reverted']
|
| 91 | + #reverts.write("\t".join(revertHeaders) + "\n")
|
| 92 | +
|
| 93 | + reverted = open(os.path.join(args.out, "revert.tsv"), "w")
|
| 94 | + revertedHeaders = ['rev_id', 'rvtg_id', 'rvtto_id', 'revs_reverted']
|
| 95 | + #reverted.write("\t".join(revertedHeaders) + "\n")
|
| 96 | +
|
| 97 | + meta = open(os.path.join(args.out, "revert.tsv"), "w")
|
| 98 | + metaHeaders = ['rev_id', 'checksum', 'tokens', 'cs_added', 'cs_removed', 'ts_added', 'ts_removed', 'ws_added', 'ws_removed', 'ms_added', 'ms_removed']
|
| 99 | + #meta.write("\t".join(metaHeaders) + "\n")
|
| 100 | +
|
| 101 | + logging.info("Reading from dump file.")
|
| 102 | + for page in wp.dump.Iterator(args.dump).readPages():
|
| 103 | + logging.debug("Processing %s:%s..." % (page.getId(), page.getTitle()))
|
| 104 | + recentRevs = LimitedDictLists(maxsize=15)
|
| 105 | + lastTokens = []
|
| 106 | + for revision in page.readRevisions():
|
| 107 | + checksum = hashlib.md5(revision.getText().encode("utf-8")).hexdigest()
|
| 108 | + if checksum in recentRevs:
|
| 109 | + LOGGING_STREAM.write("r")
|
| 110 | + #found a revert
|
| 111 | + revertedToRev = recentRevs[checksum]
|
| 112 | +
|
| 113 | + #get the revisions that were reverted
|
| 114 | + revertedRevs = [r for (c, r) in recentRevs if r.getId() > revertedToRev.getId()]
|
| 115 | +
|
| 116 | + #write revert row
|
| 117 | + revert.write(
|
| 118 | + "\t".join(clean(v) for v in [
|
| 119 | + revision.getId(),
|
| 120 | + revertedToRev.getId(),
|
| 121 | + len(revertedRevs)
|
| 122 | + ]) + "\n"
|
| 123 | + )
|
| 124 | +
|
| 125 | + LOGGING_STREAM.write(str(len(revertedRevs)))
|
| 126 | + for rev in revertedRevs:
|
| 127 | + reverted.write(
|
| 128 | + "\t".join(clean(v) for v in [
|
| 129 | + rev.getId(),
|
| 130 | + revision.getId(),
|
| 131 | + revertedToRev.getId(),
|
| 132 | + len(revertedRevs)
|
| 133 | + ]) + "\n"
|
| 134 | + )
|
| 135 | + else:
|
| 136 | + LOGGING_STREAM.write("-")
|
| 137 | +
|
| 138 | + tokens = tokenize(revision.getText())
|
| 139 | +
|
| 140 | + tokensAdded, tokensRemoved = simpleDiff(lastTokens, tokens)
|
| 141 | +
|
| 142 | + row = {
|
| 143 | + 'rev_id': revision.getId(),
|
| 144 | + 'checksum': checksum,
|
| 145 | + 'tokens': len(revision.getText()),
|
| 146 | + 'cs_added': 0,
|
| 147 | + 'cs_removed': 0,
|
| 148 | + 'ts_added': 0,
|
| 149 | + 'ts_removed': 0,
|
| 150 | + 'ws_added': 0,
|
| 151 | + 'ws_removed': 0,
|
| 152 | + 'ms_added': 0,
|
| 153 | + 'ms_removed': 0
|
| 154 | + }
|
| 155 | + for token in tokensAdded:
|
| 156 | + row['ts_added'] += 1
|
| 157 | + row['cs_added'] += len(token)
|
| 158 | + if token.strip() == '': pass
|
| 159 | + if token in MARKUP: row['ms_added'] += 1
|
| 160 | + elif token not in STOP_WORDS: row['ws_added'] += 1
|
| 161 | + for token in tokensRemoved:
|
| 162 | + row['ts_removed'] += 1
|
| 163 | + row['cs_removed'] += len(token)
|
| 164 | + if token.strip() == '': pass
|
| 165 | + if token in MARKUP: row['ms_removed'] += 1
|
| 166 | + elif token not in STOP_WORDS: row['ws_removed'] += 1
|
| 167 | +
|
| 168 | +
|
| 169 | + reverted.write(
|
| 170 | + "\t".join([clean(row[h]) for h in metaHeaders]) + "\n"
|
| 171 | + )
|
| 172 | +
|
| 173 | + lastTokens = tokens
|
| 174 | +
|
| 175 | + LOGGING_STREAM.write("\n")
|
| 176 | +
|
| 177 | +
|
| 178 | +
|
| 179 | +
|
| 180 | +
|
| 181 | +
|
| 182 | +if __name__ == "__main__":
|
| 183 | + parser = argparse.ArgumentParser(
|
| 184 | + description='Extracts identity reverts and diff information from dump file(s)'
|
| 185 | + )
|
| 186 | + parser.add_argument(
|
| 187 | + '-d', '--dump',
|
| 188 | + metavar="<path>",
|
| 189 | + type=dumpFile,
|
| 190 | + help='the path to the XML dump file to process (defaults to stdin)',
|
| 191 | + default=sys.stdin
|
| 192 | + )
|
| 193 | + parser.add_argument(
|
| 194 | + '-o', '--out',
|
| 195 | + metavar="<path>",
|
| 196 | + type=output,
|
| 197 | + help='the path to a diectory to write output files/read previous files from',
|
| 198 | + default="."
|
| 199 | + )
|
| 200 | + args = parser.parse_args()
|
| 201 | + main(args)
|
Index: trunk/tools/wsor/scripts/extract_checksums.py |
— | — | @@ -0,0 +1,48 @@ |
| 2 | +import sys, subprocess, os
|
| 3 | +from gl import wp
|
| 4 | +
|
| 5 | +class FileTypeError(Exception):pass
|
| 6 | +class FileTypeWarning(Warning):pass
|
| 7 | +
|
| 8 | +EXTENSIONS = {
|
| 9 | + 'xml': "cat",
|
| 10 | + 'bz2': "bzcat"
|
| 11 | + '7z': "7z e -so"
|
| 12 | +}
|
| 13 | +
|
| 14 | +EXT_RE = re.compile(r'\.(.+)')
|
| 15 | +def dumpFile(fn):
|
| 16 | + match = EXT_RE.find(fn)
|
| 17 | + if match == None:
|
| 18 | + raise FileTypeError("No extension found for %s." % fn)
|
| 19 | + elif match.groups(1) not in EXTENSIONS:
|
| 20 | + raise FileTypeError("File type %s for %s is not supported." % (match.groups(1), fn))
|
| 21 | + else:
|
| 22 | + call = EXTENSIONS[match.groups(1)]
|
| 23 | + process = subprocess.Popen("%s %s" % (call, fn), shell=True, stdout=subprocess.PIPE)
|
| 24 | + return wp.dump.Iterator(process.stdout)
|
| 25 | +
|
| 26 | +
|
| 27 | +
|
| 28 | +
|
| 29 | +
|
| 30 | +
|
| 31 | +if __name__ == "__main__":
|
| 32 | + parser = argparse.ArgumentParser(
|
| 33 | + description='Extracts identity reverts and diff information from dump file(s)'
|
| 34 | + )
|
| 35 | + parser.add_argument(
|
| 36 | + 'dumpFile',
|
| 37 | + metavar="<path>",
|
| 38 | + type=dumpFile,
|
| 39 | + help='the path to the bots file'
|
| 40 | + )
|
| 41 | + parser.add_argument(
|
| 42 | + '-i', '--input',
|
| 43 | + metavar="<path>",
|
| 44 | + type=lambda fn:open(fn, "r"),
|
| 45 | + help='the path of the file to filter (defaults to stdin)',
|
| 46 | + default=sys.stdin
|
| 47 | + )
|
| 48 | + args = parser.parse_args()
|
| 49 | + main(args)
|
Index: trunk/tools/wsor/scripts/extract_reverts.py |
— | — | @@ -0,0 +1 @@ |
| 2 | +
|
Index: trunk/tools/wsor/scripts/text.py |
— | — | @@ -0,0 +1,557 @@ |
| 2 | +import re
|
| 3 | +
|
| 4 | +MARKUP = set([
|
| 5 | + "[[",
|
| 6 | + "]]",
|
| 7 | + "{{",
|
| 8 | + "}}",
|
| 9 | + "&\w+;",
|
| 10 | + "'''",
|
| 11 | + "''",
|
| 12 | + "=+",
|
| 13 | + "{|",
|
| 14 | + "|}",
|
| 15 | + "|-"
|
| 16 | +])
|
| 17 | +
|
| 18 | +STOP_WORDS = set([
|
| 19 | + '--',
|
| 20 | + '---',
|
| 21 | + 'able',
|
| 22 | + 'about',
|
| 23 | + 'above',
|
| 24 | + 'according',
|
| 25 | + 'accordingly',
|
| 26 | + 'across',
|
| 27 | + 'actually',
|
| 28 | + 'after',
|
| 29 | + 'afterwards',
|
| 30 | + 'again',
|
| 31 | + 'against',
|
| 32 | + 'aint',
|
| 33 | + 'all',
|
| 34 | + 'allow',
|
| 35 | + 'allows',
|
| 36 | + 'almost',
|
| 37 | + 'alone',
|
| 38 | + 'along',
|
| 39 | + 'already',
|
| 40 | + 'also',
|
| 41 | + 'although',
|
| 42 | + 'always',
|
| 43 | + 'am',
|
| 44 | + 'among',
|
| 45 | + 'amongst',
|
| 46 | + 'an',
|
| 47 | + 'and',
|
| 48 | + 'another',
|
| 49 | + 'any',
|
| 50 | + 'anybody',
|
| 51 | + 'anyhow',
|
| 52 | + 'anyone',
|
| 53 | + 'anything',
|
| 54 | + 'anyway',
|
| 55 | + 'anyways',
|
| 56 | + 'anywhere',
|
| 57 | + 'apart',
|
| 58 | + 'appear',
|
| 59 | + 'appreciate',
|
| 60 | + 'appropriate',
|
| 61 | + 'are',
|
| 62 | + 'arent',
|
| 63 | + 'around',
|
| 64 | + 'as',
|
| 65 | + 'aside',
|
| 66 | + 'ask',
|
| 67 | + 'asking',
|
| 68 | + 'associated',
|
| 69 | + 'at',
|
| 70 | + 'available',
|
| 71 | + 'away',
|
| 72 | + 'awfully',
|
| 73 | + 'be',
|
| 74 | + 'became',
|
| 75 | + 'because',
|
| 76 | + 'become',
|
| 77 | + 'becomes',
|
| 78 | + 'becoming',
|
| 79 | + 'been',
|
| 80 | + 'before',
|
| 81 | + 'beforehand',
|
| 82 | + 'behind',
|
| 83 | + 'being',
|
| 84 | + 'believe',
|
| 85 | + 'below',
|
| 86 | + 'beside',
|
| 87 | + 'besides',
|
| 88 | + 'best',
|
| 89 | + 'better',
|
| 90 | + 'between',
|
| 91 | + 'beyond',
|
| 92 | + 'both',
|
| 93 | + 'brief',
|
| 94 | + 'but',
|
| 95 | + 'by',
|
| 96 | + 'came',
|
| 97 | + 'can',
|
| 98 | + 'cannot',
|
| 99 | + 'cant',
|
| 100 | + 'cause',
|
| 101 | + 'causes',
|
| 102 | + 'certain',
|
| 103 | + 'certainly',
|
| 104 | + 'changes',
|
| 105 | + 'clearly',
|
| 106 | + 'cmon',
|
| 107 | + 'co',
|
| 108 | + 'com',
|
| 109 | + 'come',
|
| 110 | + 'comes',
|
| 111 | + 'concerning',
|
| 112 | + 'consequently',
|
| 113 | + 'consider',
|
| 114 | + 'considering',
|
| 115 | + 'contain',
|
| 116 | + 'containing',
|
| 117 | + 'contains',
|
| 118 | + 'corresponding',
|
| 119 | + 'could',
|
| 120 | + 'couldnt',
|
| 121 | + 'course',
|
| 122 | + 'cs',
|
| 123 | + 'currently',
|
| 124 | + 'definitely',
|
| 125 | + 'described',
|
| 126 | + 'despite',
|
| 127 | + 'did',
|
| 128 | + 'didnt',
|
| 129 | + 'different',
|
| 130 | + 'do',
|
| 131 | + 'does',
|
| 132 | + 'doesnt',
|
| 133 | + 'doing',
|
| 134 | + 'done',
|
| 135 | + 'dont',
|
| 136 | + 'down',
|
| 137 | + 'downwards',
|
| 138 | + 'during',
|
| 139 | + 'each',
|
| 140 | + 'edu',
|
| 141 | + 'eg',
|
| 142 | + 'eight',
|
| 143 | + 'either',
|
| 144 | + 'else',
|
| 145 | + 'elsewhere',
|
| 146 | + 'enough',
|
| 147 | + 'entirely',
|
| 148 | + 'especially',
|
| 149 | + 'et',
|
| 150 | + 'etc',
|
| 151 | + 'even',
|
| 152 | + 'ever',
|
| 153 | + 'every',
|
| 154 | + 'everybody',
|
| 155 | + 'everyone',
|
| 156 | + 'everything',
|
| 157 | + 'everywhere',
|
| 158 | + 'ex',
|
| 159 | + 'exactly',
|
| 160 | + 'example',
|
| 161 | + 'except',
|
| 162 | + 'far',
|
| 163 | + 'few',
|
| 164 | + 'fifth',
|
| 165 | + 'first',
|
| 166 | + 'five',
|
| 167 | + 'followed',
|
| 168 | + 'following',
|
| 169 | + 'follows',
|
| 170 | + 'for',
|
| 171 | + 'former',
|
| 172 | + 'formerly',
|
| 173 | + 'forth',
|
| 174 | + 'four',
|
| 175 | + 'from',
|
| 176 | + 'further',
|
| 177 | + 'furthermore',
|
| 178 | + 'get',
|
| 179 | + 'gets',
|
| 180 | + 'getting',
|
| 181 | + 'given',
|
| 182 | + 'gives',
|
| 183 | + 'go',
|
| 184 | + 'goes',
|
| 185 | + 'going',
|
| 186 | + 'gone',
|
| 187 | + 'got',
|
| 188 | + 'gotten',
|
| 189 | + 'greetings',
|
| 190 | + 'had',
|
| 191 | + 'hadnt',
|
| 192 | + 'happens',
|
| 193 | + 'hardly',
|
| 194 | + 'has',
|
| 195 | + 'hasnt',
|
| 196 | + 'have',
|
| 197 | + 'havent',
|
| 198 | + 'having',
|
| 199 | + 'he',
|
| 200 | + 'hello',
|
| 201 | + 'help',
|
| 202 | + 'hence',
|
| 203 | + 'her',
|
| 204 | + 'here',
|
| 205 | + 'hereafter',
|
| 206 | + 'hereby',
|
| 207 | + 'herein',
|
| 208 | + 'heres',
|
| 209 | + 'hereupon',
|
| 210 | + 'hers',
|
| 211 | + 'herself',
|
| 212 | + 'hes',
|
| 213 | + 'hi',
|
| 214 | + 'him',
|
| 215 | + 'himself',
|
| 216 | + 'his',
|
| 217 | + 'hither',
|
| 218 | + 'hopefully',
|
| 219 | + 'how',
|
| 220 | + 'howbeit',
|
| 221 | + 'however',
|
| 222 | + 'id',
|
| 223 | + 'ie',
|
| 224 | + 'if',
|
| 225 | + 'ignored',
|
| 226 | + 'ill',
|
| 227 | + 'im',
|
| 228 | + 'immediate',
|
| 229 | + 'in',
|
| 230 | + 'inasmuch',
|
| 231 | + 'inc',
|
| 232 | + 'indeed',
|
| 233 | + 'indicate',
|
| 234 | + 'indicated',
|
| 235 | + 'indicates',
|
| 236 | + 'inner',
|
| 237 | + 'insofar',
|
| 238 | + 'instead',
|
| 239 | + 'into',
|
| 240 | + 'inward',
|
| 241 | + 'is',
|
| 242 | + 'isnt',
|
| 243 | + 'it',
|
| 244 | + 'itd',
|
| 245 | + 'itll',
|
| 246 | + 'its',
|
| 247 | + 'itself',
|
| 248 | + 'ive',
|
| 249 | + 'just',
|
| 250 | + 'keep',
|
| 251 | + 'keeps',
|
| 252 | + 'kept',
|
| 253 | + 'know',
|
| 254 | + 'known',
|
| 255 | + 'knows',
|
| 256 | + 'last',
|
| 257 | + 'lately',
|
| 258 | + 'later',
|
| 259 | + 'latter',
|
| 260 | + 'latterly',
|
| 261 | + 'least',
|
| 262 | + 'less',
|
| 263 | + 'lest',
|
| 264 | + 'let',
|
| 265 | + 'lets',
|
| 266 | + 'like',
|
| 267 | + 'liked',
|
| 268 | + 'likely',
|
| 269 | + 'little',
|
| 270 | + 'look',
|
| 271 | + 'looking',
|
| 272 | + 'looks',
|
| 273 | + 'ltd',
|
| 274 | + 'mainly',
|
| 275 | + 'many',
|
| 276 | + 'may',
|
| 277 | + 'maybe',
|
| 278 | + 'me',
|
| 279 | + 'mean',
|
| 280 | + 'meanwhile',
|
| 281 | + 'merely',
|
| 282 | + 'might',
|
| 283 | + 'more',
|
| 284 | + 'moreover',
|
| 285 | + 'most',
|
| 286 | + 'mostly',
|
| 287 | + 'much',
|
| 288 | + 'must',
|
| 289 | + 'my',
|
| 290 | + 'myself',
|
| 291 | + 'name',
|
| 292 | + 'namely',
|
| 293 | + 'nd',
|
| 294 | + 'near',
|
| 295 | + 'nearly',
|
| 296 | + 'necessary',
|
| 297 | + 'need',
|
| 298 | + 'needs',
|
| 299 | + 'neither',
|
| 300 | + 'never',
|
| 301 | + 'nevertheless',
|
| 302 | + 'new',
|
| 303 | + 'next',
|
| 304 | + 'nine',
|
| 305 | + 'no',
|
| 306 | + 'nobody',
|
| 307 | + 'non',
|
| 308 | + 'none',
|
| 309 | + 'noone',
|
| 310 | + 'nor',
|
| 311 | + 'normally',
|
| 312 | + 'not',
|
| 313 | + 'nothing',
|
| 314 | + 'novel',
|
| 315 | + 'now',
|
| 316 | + 'nowhere',
|
| 317 | + 'obviously',
|
| 318 | + 'of',
|
| 319 | + 'off',
|
| 320 | + 'often',
|
| 321 | + 'oh',
|
| 322 | + 'ok',
|
| 323 | + 'okay',
|
| 324 | + 'old',
|
| 325 | + 'on',
|
| 326 | + 'once',
|
| 327 | + 'one',
|
| 328 | + 'ones',
|
| 329 | + 'only',
|
| 330 | + 'onto',
|
| 331 | + 'or',
|
| 332 | + 'other',
|
| 333 | + 'others',
|
| 334 | + 'otherwise',
|
| 335 | + 'ought',
|
| 336 | + 'our',
|
| 337 | + 'ours',
|
| 338 | + 'ourselves',
|
| 339 | + 'out',
|
| 340 | + 'outside',
|
| 341 | + 'over',
|
| 342 | + 'overall',
|
| 343 | + 'own',
|
| 344 | + 'particular',
|
| 345 | + 'particularly',
|
| 346 | + 'per',
|
| 347 | + 'perhaps',
|
| 348 | + 'placed',
|
| 349 | + 'please',
|
| 350 | + 'plus',
|
| 351 | + 'possible',
|
| 352 | + 'presumably',
|
| 353 | + 'probably',
|
| 354 | + 'provides',
|
| 355 | + 'que',
|
| 356 | + 'quite',
|
| 357 | + 'qv',
|
| 358 | + 'rather',
|
| 359 | + 'rd',
|
| 360 | + 're',
|
| 361 | + 'really',
|
| 362 | + 'reasonably',
|
| 363 | + 'regarding',
|
| 364 | + 'regardless',
|
| 365 | + 'regards',
|
| 366 | + 'relatively',
|
| 367 | + 'respectively',
|
| 368 | + 'right',
|
| 369 | + 'said',
|
| 370 | + 'same',
|
| 371 | + 'saw',
|
| 372 | + 'say',
|
| 373 | + 'saying',
|
| 374 | + 'says',
|
| 375 | + 'second',
|
| 376 | + 'secondly',
|
| 377 | + 'see',
|
| 378 | + 'seeing',
|
| 379 | + 'seem',
|
| 380 | + 'seemed',
|
| 381 | + 'seeming',
|
| 382 | + 'seems',
|
| 383 | + 'seen',
|
| 384 | + 'self',
|
| 385 | + 'selves',
|
| 386 | + 'sensible',
|
| 387 | + 'sent',
|
| 388 | + 'serious',
|
| 389 | + 'seriously',
|
| 390 | + 'seven',
|
| 391 | + 'several',
|
| 392 | + 'shall',
|
| 393 | + 'she',
|
| 394 | + 'should',
|
| 395 | + 'shouldnt',
|
| 396 | + 'since',
|
| 397 | + 'six',
|
| 398 | + 'so',
|
| 399 | + 'some',
|
| 400 | + 'somebody',
|
| 401 | + 'somehow',
|
| 402 | + 'someone',
|
| 403 | + 'something',
|
| 404 | + 'sometime',
|
| 405 | + 'sometimes',
|
| 406 | + 'somewhat',
|
| 407 | + 'somewhere',
|
| 408 | + 'soon',
|
| 409 | + 'sorry',
|
| 410 | + 'specified',
|
| 411 | + 'specify',
|
| 412 | + 'specifying',
|
| 413 | + 'still',
|
| 414 | + 'sub',
|
| 415 | + 'such',
|
| 416 | + 'sup',
|
| 417 | + 'sure',
|
| 418 | + 'take',
|
| 419 | + 'taken',
|
| 420 | + 'tell',
|
| 421 | + 'tends',
|
| 422 | + 'th',
|
| 423 | + 'than',
|
| 424 | + 'thank',
|
| 425 | + 'thanks',
|
| 426 | + 'thanx',
|
| 427 | + 'that',
|
| 428 | + 'thats',
|
| 429 | + 'the',
|
| 430 | + 'their',
|
| 431 | + 'theirs',
|
| 432 | + 'them',
|
| 433 | + 'themselves',
|
| 434 | + 'then',
|
| 435 | + 'thence',
|
| 436 | + 'there',
|
| 437 | + 'thereafter',
|
| 438 | + 'thereby',
|
| 439 | + 'therefore',
|
| 440 | + 'therein',
|
| 441 | + 'theres',
|
| 442 | + 'theres',
|
| 443 | + 'thereupon',
|
| 444 | + 'these',
|
| 445 | + 'they',
|
| 446 | + 'theyd',
|
| 447 | + 'theyll',
|
| 448 | + 'theyre',
|
| 449 | + 'theyve',
|
| 450 | + 'think',
|
| 451 | + 'third',
|
| 452 | + 'this',
|
| 453 | + 'thorough',
|
| 454 | + 'thoroughly',
|
| 455 | + 'those',
|
| 456 | + 'though',
|
| 457 | + 'three',
|
| 458 | + 'through',
|
| 459 | + 'throughout',
|
| 460 | + 'thru',
|
| 461 | + 'thus',
|
| 462 | + 'to',
|
| 463 | + 'together',
|
| 464 | + 'too',
|
| 465 | + 'took',
|
| 466 | + 'toward',
|
| 467 | + 'towards',
|
| 468 | + 'tried',
|
| 469 | + 'tries',
|
| 470 | + 'truly',
|
| 471 | + 'try',
|
| 472 | + 'trying',
|
| 473 | + 'ts',
|
| 474 | + 'twice',
|
| 475 | + 'two',
|
| 476 | + 'un',
|
| 477 | + 'under',
|
| 478 | + 'unfortunately',
|
| 479 | + 'unless',
|
| 480 | + 'unlikely',
|
| 481 | + 'until',
|
| 482 | + 'unto',
|
| 483 | + 'up',
|
| 484 | + 'upon',
|
| 485 | + 'us',
|
| 486 | + 'use',
|
| 487 | + 'used',
|
| 488 | + 'useful',
|
| 489 | + 'uses',
|
| 490 | + 'using',
|
| 491 | + 'usually',
|
| 492 | + 'value',
|
| 493 | + 'various',
|
| 494 | + 'very',
|
| 495 | + 'via',
|
| 496 | + 'viz',
|
| 497 | + 'vs',
|
| 498 | + 'want',
|
| 499 | + 'wants',
|
| 500 | + 'was',
|
| 501 | + 'wasnt',
|
| 502 | + 'way',
|
| 503 | + 'we',
|
| 504 | + 'wed',
|
| 505 | + 'welcome',
|
| 506 | + 'well',
|
| 507 | + 'went',
|
| 508 | + 'were',
|
| 509 | + 'werent',
|
| 510 | + 'weve',
|
| 511 | + 'what',
|
| 512 | + 'whatever',
|
| 513 | + 'whats',
|
| 514 | + 'when',
|
| 515 | + 'whence',
|
| 516 | + 'whenever',
|
| 517 | + 'where',
|
| 518 | + 'whereafter',
|
| 519 | + 'whereas',
|
| 520 | + 'whereby',
|
| 521 | + 'wherein',
|
| 522 | + 'wheres',
|
| 523 | + 'whereupon',
|
| 524 | + 'wherever',
|
| 525 | + 'whether',
|
| 526 | + 'which',
|
| 527 | + 'while',
|
| 528 | + 'whither',
|
| 529 | + 'who',
|
| 530 | + 'whoever',
|
| 531 | + 'whole',
|
| 532 | + 'whom',
|
| 533 | + 'whos',
|
| 534 | + 'whose',
|
| 535 | + 'why',
|
| 536 | + 'will',
|
| 537 | + 'willing',
|
| 538 | + 'wish',
|
| 539 | + 'with',
|
| 540 | + 'within',
|
| 541 | + 'without',
|
| 542 | + 'wonder',
|
| 543 | + 'wont',
|
| 544 | + 'would',
|
| 545 | + 'wouldnt',
|
| 546 | + 'yes',
|
| 547 | + 'yet',
|
| 548 | + 'you',
|
| 549 | + 'youd',
|
| 550 | + 'youll',
|
| 551 | + 'your',
|
| 552 | + 'youre',
|
| 553 | + 'yours',
|
| 554 | + 'yourself',
|
| 555 | + 'yourselves',
|
| 556 | + 'youve'
|
| 557 | +])
|
| 558 | +
|
Index: trunk/tools/wsor/scripts/test_lock_speed.py |
— | — | @@ -0,0 +1,19 @@ |
| 2 | +import time |
| 3 | +from threading import Lock |
| 4 | + |
| 5 | +num = 0 |
| 6 | +start = time.time() |
| 7 | +for i in range(0, 1000): |
| 8 | + num = sum(n for n in range(0, i)) |
| 9 | + |
| 10 | +print("Without lock took %s seconds" % (time.time()-start)) |
| 11 | + |
| 12 | +num = 0 |
| 13 | +l = Lock() |
| 14 | +start = time.time() |
| 15 | +for i in range(0, 1000): |
| 16 | + l.acquire() |
| 17 | + num = sum(n for n in range(0, i)) |
| 18 | + l.release() |
| 19 | + |
| 20 | +print("With lock took %s seconds" % (time.time()-start)) |
Index: trunk/tools/wsor/ts_samples/testing.sql |
— | — | @@ -23,3 +23,20 @@ |
24 | 24 | WHERE user_registration BETWEEN "20040000000000" AND "20041231115959" |
25 | 25 | ORDER BY RAND() |
26 | 26 | LIMIT 10; |
| 27 | + |
| 28 | + |
| 29 | +CREATE TABLE halfak.user_meta ( |
| 30 | + user_id INT, |
| 31 | + first_edit VARBINARY(14), |
| 32 | + last_edit VARBINARY(14) |
| 33 | +) |
| 34 | + |
| 35 | +INSERT INTO halfak.user_meta |
| 36 | +SELECT rev_user, min(rev_timestamp), max(rev_timestamp) |
| 37 | +FROM revision |
| 38 | +WHERE rev_user IS NOT NULL |
| 39 | +GROUP BY rev_user; |
| 40 | + |
| 41 | +CREATE UNIQUE INDEX user_id_idx ON halfak.user_meta (user_id); |
| 42 | +CREATE INDEX first_edit_idx ON halfak.user_meta (first_edit); |
| 43 | +CREATE INDEX last_edit_idx ON halfak.user_meta (last_edit); |