r90095 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r90094‎ | r90095 | r90096 >
Date:22:36, 14 June 2011
Author:halfak
Status:deferred
Tags:
Comment:
Adding overworked code and some scripts
Modified paths:
  • /trunk/tools/wsor/category_editors/get_category_editors.py (modified) (history)
  • /trunk/tools/wsor/overworked (added) (history)
  • /trunk/tools/wsor/overworked/R (added) (history)
  • /trunk/tools/wsor/overworked/R/Rplots.pdf (added) (history)
  • /trunk/tools/wsor/overworked/R/loader (added) (history)
  • /trunk/tools/wsor/overworked/R/loader/load_patroller_days.R (added) (history)
  • /trunk/tools/wsor/overworked/R/patrol_distribuions.R (added) (history)
  • /trunk/tools/wsor/overworked/R/plots (added) (history)
  • /trunk/tools/wsor/overworked/R/plots/bars.patroller_years_activity.2007.png (added) (history)
  • /trunk/tools/wsor/overworked/R/plots/bars.patroller_years_activity.2008.png (added) (history)
  • /trunk/tools/wsor/overworked/R/plots/bars.patroller_years_activity.2009.png (added) (history)
  • /trunk/tools/wsor/overworked/R/plots/bars.patroller_years_activity.2010.png (added) (history)
  • /trunk/tools/wsor/overworked/R/plots/bars.patroller_years_activity.2011.png (added) (history)
  • /trunk/tools/wsor/overworked/R/plots/bars.patroller_years_activity.png (added) (history)
  • /trunk/tools/wsor/overworked/R/plots/dist.patroller_days.png (added) (history)
  • /trunk/tools/wsor/overworked/R/plots/dist.patroller_years_activity.png (added) (history)
  • /trunk/tools/wsor/overworked/R/plots/patol_months.per_user.png (added) (history)
  • /trunk/tools/wsor/overworked/R/plots/patrol_months.per_user.png (added) (history)
  • /trunk/tools/wsor/overworked/R/plots/patrol_months.top_50.per_user.png (added) (history)
  • /trunk/tools/wsor/overworked/R/plots/patrol_years.per_user.png (added) (history)
  • /trunk/tools/wsor/overworked/R/plots/patrol_years.top_50.per_user.png (added) (history)
  • /trunk/tools/wsor/overworked/R/plots/test.png (added) (history)
  • /trunk/tools/wsor/overworked/R/util (added) (history)
  • /trunk/tools/wsor/overworked/R/util/env.R (added) (history)
  • /trunk/tools/wsor/overworked/fix_long_number_bs.py (added) (history)
  • /trunk/tools/wsor/overworked/get_patrol_activity.py (added) (history)
  • /trunk/tools/wsor/overworked/get_patroller_talk_posts.py (added) (history)
  • /trunk/tools/wsor/overworked/patroller_days.fixed.tsv (added) (history)
  • /trunk/tools/wsor/overworked/remove_bots.py (added) (history)
  • /trunk/tools/wsor/overworked/testing.sql (added) (history)
  • /trunk/tools/wsor/scripts (added) (history)
  • /trunk/tools/wsor/scripts/extract_checksums.py (added) (history)
  • /trunk/tools/wsor/scripts/extract_reverts.py (added) (history)
  • /trunk/tools/wsor/scripts/extract_revision_meta.py (added) (history)
  • /trunk/tools/wsor/scripts/test_lock_speed.py (added) (history)
  • /trunk/tools/wsor/scripts/text.py (added) (history)
  • /trunk/tools/wsor/ts_samples/testing.sql (modified) (history)

Diff [purge]

Index: trunk/tools/wsor/category_editors/get_category_editors.py
@@ -40,8 +40,7 @@
4141 ) < period
4242
4343 for editor in db.enwiki_editors_raw.find():
44 - logging.debug("Processing %(editor)s:%(username)s..." % editor)
45 -
 44+ thresh = False
4645 for year, month, edits in get_months_of_edits(editor['edits']):
4746 catEdits = [e for e in edits if e['article'] in catIds]
4847 if len(catEdits) >= args.n:
@@ -54,11 +53,12 @@
5554 len(catEdits)
5655 ])
5756 )
58 - LOGGING_STREAM.write("o")
59 - else:
60 - LOGGING_STREAM.write("-")
 57+ thresh = True
6158
62 - LOGGING_STREAM.write("\n")
 59+ if thresh:
 60+ LOGGING_STREAM.write("o")
 61+ else:
 62+ LOGGING_STREAM.write("-")
6363
6464
6565
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
1201 + 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
2202 + 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
3203 + 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
4204 + 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
5205 + 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
6206 + 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
7207 + 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
8208 + 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
9209 + 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
10210 + 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
11211 + 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
12212 + 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
13213 + 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
14214 + 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 @@
2424 WHERE user_registration BETWEEN "20040000000000" AND "20041231115959"
2525 ORDER BY RAND()
2626 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);

Status & tagging log