summaryrefslogtreecommitdiff
path: root/.irssi
diff options
context:
space:
mode:
authorMike Crute <mcrute@gmail.com>2013-12-30 12:48:40 -0500
committerMike Crute <mike@crute.us>2013-12-30 12:48:40 -0500
commit416f25a75b59725b57f2a17a71d8c65aa9776bfe (patch)
tree8ba52fd4fe68848d75b2810cc04d014b5b51d27a /.irssi
parent8cf773590bdcfe87f1feef3695f34715a3bd935d (diff)
downloaddotfiles-416f25a75b59725b57f2a17a71d8c65aa9776bfe.tar.bz2
dotfiles-416f25a75b59725b57f2a17a71d8c65aa9776bfe.tar.xz
dotfiles-416f25a75b59725b57f2a17a71d8c65aa9776bfe.zip
Updated irssi configs
Diffstat (limited to '.irssi')
-rw-r--r--.irssi/config.clean135
-rw-r--r--.irssi/default.theme18
-rw-r--r--.irssi/ectobar.theme290
-rwxr-xr-x.irssi/modules/libfe_xmpp.sobin0 -> 64896 bytes
-rwxr-xr-x.irssi/modules/libtext_xmpp.sobin0 -> 14716 bytes
-rwxr-xr-x.irssi/modules/libxmpp_core.sobin0 -> 132360 bytes
l---------.irssi/scripts/autorun/notifier.pl1
-rw-r--r--.irssi/scripts/notifier.pl142
-rw-r--r--.irssi/scripts/twirssi.json1
-rw-r--r--.irssi/scripts/twirssi.pl1906
10 files changed, 458 insertions, 2035 deletions
diff --git a/.irssi/config.clean b/.irssi/config.clean
index d550891..4b14327 100644
--- a/.irssi/config.clean
+++ b/.irssi/config.clean
@@ -1,25 +1,16 @@
1servers = ( 1servers = (
2 { 2 {
3 address = "irc.freenode.com"; 3 address = "irc.freenode.com";
4 chatnet = "FreeNode"; 4 chatnet = "FreeNode";
5 port = "6667"; 5 port = "6667";
6 },
7 { address = "localhost"; chatnet = "AIM"; port = "6667"; },
8 {
9 address = "chat.ops.ag.com";
10 chatnet = "AGJabber";
11 port = "5223";
12 use_ssl = "yes";
13 autoconnect = "yes"; 6 autoconnect = "yes";
14 jid = "mcrute@chat.ops.ag.com";
15 password = "";
16 }, 7 },
17 { 8 {
18 address = "talk.google.com"; 9 address = "chat.finiteloopsoftware.com";
19 chatnet = "Gmail"; 10 chatnet = "FLSJabber";
20 port = "5223";
21 use_ssl = "yes"; 11 use_ssl = "yes";
22 jid = "mcrute@gmail.com"; 12 autoconnect = "yes";
13 jid = "";
23 password = ""; 14 password = "";
24 } 15 }
25); 16);
@@ -27,74 +18,17 @@ servers = (
27chatnets = { 18chatnets = {
28 FreeNode = { 19 FreeNode = {
29 type = "IRC"; 20 type = "IRC";
30 nick = "cruteme"; 21 nick = "mcrute";
31 autosendcmd = "/msg nickserv identify [REDACTED];wait 2000"; 22 autosendcmd = "/msg nickserv identify ;wait 2000";
32 };
33 AIM = {
34 type = "IRC";
35 nick = "cruteme";
36 autosendcmd = "/msg root identify [REDACTED];wait 2000";
37 }; 23 };
38 AGJabber = { type = "XMPP"; nick = "mcrute"; }; 24 FLSJabber = { type = "XMPP"; nick = "mike"; };
39 Gmail = { type = "XMPP"; nick = "mcrute"; };
40}; 25};
41 26
42channels = ( 27channels = (
43 { 28 {
44 name = "servicesteam@conference.chat.ops.ag.com"; 29 name = "fls@conference.chat.finiteloopsoftware.com";
45 chatnet = "AGJabber"; 30 chatnet = "FLSJabber";
46 autojoin = "yes";
47 },
48 {
49 name = "ag@conference.chat.ops.ag.com";
50 chatnet = "AGJabber";
51 autojoin = "yes";
52 },
53 {
54 name = "opshelp@conference.chat.ops.ag.com";
55 chatnet = "AGJabber";
56 autojoin = "yes";
57 },
58 {
59 name = "content@conference.chat.ops.ag.com";
60 chatnet = "AGJabber";
61 },
62 {
63 name = "endeca@conference.chat.ops.ag.com";
64 chatnet = "AGJabber";
65 },
66 {
67 name = "no-bs@conference.chat.ops.ag.com";
68 chatnet = "AGJabber";
69 },
70 {
71 name = "testing@conference.chat.ops.ag.com";
72 chatnet = "AGJabber";
73 },
74 {
75 name = "opensource@conference.chat.ops.ag.com";
76 chatnet = "AGJabber";
77 },
78 {
79 name = "agphoto@conference.chat.ops.ag.com";
80 chatnet = "AGJabber";
81 },
82 {
83 name = "release@conference.chat.ops.ag.com";
84 chatnet = "AGJabber";
85 },
86 {
87 name = "birthdaycalendar@conference.chat.ops.ag.com";
88 chatnet = "AGJabber";
89 },
90 {
91 name = "api@conference.chat.ops.ag.com";
92 chatnet = "AGJabber";
93 autojoin = "yes"; 31 autojoin = "yes";
94 },
95 {
96 name = "loadtest@conference.chat.ops.ag.com";
97 chatnet = "AGJabber";
98 } 32 }
99); 33);
100 34
@@ -276,6 +210,7 @@ settings = {
276 "fe-common/core" = { 210 "fe-common/core" = {
277 autolog = "yes"; 211 autolog = "yes";
278 autolog_path = "~/.irssi/logs/$tag/$0.log"; 212 autolog_path = "~/.irssi/logs/$tag/$0.log";
213 theme = "ectobar";
279 }; 214 };
280 "irc/core" = { channels_rejoin_unavailable = "yes"; }; 215 "irc/core" = { channels_rejoin_unavailable = "yes"; };
281 "perl/core/scripts" = { 216 "perl/core/scripts" = {
@@ -283,6 +218,7 @@ settings = {
283 awl_prefer_name = "yes"; 218 awl_prefer_name = "yes";
284 twirssi_first_run = "no"; 219 twirssi_first_run = "no";
285 twitter_poll_interval = "60"; 220 twitter_poll_interval = "60";
221 notifier_channel_regex = ".*";
286 }; 222 };
287}; 223};
288logs = { }; 224logs = { };
@@ -290,47 +226,14 @@ windows = {
290 1 = { immortal = "yes"; name = "(st)"; level = "ALL"; }; 226 1 = { immortal = "yes"; name = "(st)"; level = "ALL"; };
291 2 = { 227 2 = {
292 immortal = "yes"; 228 immortal = "yes";
293 name = "opshelp"; 229 name = "flschat";
294 sticky = "yes"; 230 sticky = "yes";
295 items = ( 231 items = (
296 { 232 {
297 type = "CHANNEL"; 233 type = "CHANNEL";
298 chat_type = "XMPP"; 234 chat_type = "XMPP";
299 name = "opshelp@conference.chat.ops.ag.com"; 235 name = "fls@conference.chat.finiteloopsoftware.com";
300 tag = "AGJabber"; 236 tag = "FLSJabber";
301 }
302 );
303 };
304 3 = {
305 name = "ag";
306 items = (
307 {
308 type = "CHANNEL";
309 chat_type = "XMPP";
310 name = "ag@conference.chat.ops.ag.com";
311 tag = "AGJabber";
312 }
313 );
314 };
315 4 = {
316 name = "api";
317 items = (
318 {
319 type = "CHANNEL";
320 chat_type = "XMPP";
321 name = "api@conference.chat.ops.ag.com";
322 tag = "AGJabber";
323 }
324 );
325 };
326 5 = {
327 name = "servicesteam";
328 items = (
329 {
330 type = "CHANNEL";
331 chat_type = "XMPP";
332 name = "servicesteam@conference.chat.ops.ag.com";
333 tag = "AGJabber";
334 } 237 }
335 ); 238 );
336 }; 239 };
@@ -339,10 +242,4 @@ windows = {
339# 1 = { first_line = "10"; lines = "45"; }; 242# 1 = { first_line = "10"; lines = "45"; };
340# 2 = { first_line = "1"; lines = "9"; }; 243# 2 = { first_line = "1"; lines = "9"; };
341#}; 244#};
342ignores = ( 245hilights = ( { text = "mcrute"; nick = "yes"; word = "yes"; } );
343 {
344 mask = "bstanek*";
345 level = "JOINS PARTS QUITS NICKS";
346 channels = ( "#cube-walls" );
347 }
348);
diff --git a/.irssi/default.theme b/.irssi/default.theme
index 98af18b..ac99356 100644
--- a/.irssi/default.theme
+++ b/.irssi/default.theme
@@ -63,7 +63,7 @@ abstracts = {
63 ## 63 ##
64 64
65 # text to insert at the beginning of each non-message line 65 # text to insert at the beginning of each non-message line
66 line_start = "%B-%W!%B-%n "; 66 line_start = "%B-%n!%B-%n ";
67 67
68 # timestamp styling, nothing by default 68 # timestamp styling, nothing by default
69 timestamp = "$*"; 69 timestamp = "$*";
@@ -138,7 +138,7 @@ abstracts = {
138 138
139 # $0 = nick mode, $1 = nick 139 # $0 = nick mode, $1 = nick
140 ownmsgnick = "{msgnick $0 $1-}"; 140 ownmsgnick = "{msgnick $0 $1-}";
141 ownnick = "%W$*%n"; 141 ownnick = "%_$*%n";
142 142
143 # public message in channel, $0 = nick mode, $1 = nick 143 # public message in channel, $0 = nick mode, $1 = nick
144 pubmsgnick = "{msgnick $0 $1-}"; 144 pubmsgnick = "{msgnick $0 $1-}";
@@ -163,7 +163,7 @@ abstracts = {
163 163
164 # own private message in query 164 # own private message in query
165 ownprivmsgnick = "{msgnick $*}"; 165 ownprivmsgnick = "{msgnick $*}";
166 ownprivnick = "%W$*%n"; 166 ownprivnick = "%_$*%n";
167 167
168 # private message in query 168 # private message in query
169 privmsgnick = "{msgnick %R$*%n}"; 169 privmsgnick = "{msgnick %R$*%n}";
@@ -173,7 +173,7 @@ abstracts = {
173 ## 173 ##
174 174
175 # used internally by this theme 175 # used internally by this theme
176 action_core = "%W * $*%n"; 176 action_core = "%_ * $*%n";
177 177
178 # generic one that's used by most actions 178 # generic one that's used by most actions
179 action = "{action_core $*} "; 179 action = "{action_core $*} ";
@@ -185,7 +185,7 @@ abstracts = {
185 ownaction_target = "{action_core $0}%K:%c$1%n "; 185 ownaction_target = "{action_core $0}%K:%c$1%n ";
186 186
187 # private action sent by others 187 # private action sent by others
188 pvtaction = "%W (*) $*%n "; 188 pvtaction = "%_ (*) $*%n ";
189 pvtaction_query = "{action $*}"; 189 pvtaction_query = "{action $*}";
190 190
191 # public action sent by others 191 # public action sent by others
@@ -211,9 +211,9 @@ abstracts = {
211 ctcp = "%g$*%n"; 211 ctcp = "%g$*%n";
212 212
213 # wallops 213 # wallops
214 wallop = "%W$*%n: "; 214 wallop = "%_$*%n: ";
215 wallop_nick = "%n$*"; 215 wallop_nick = "%n$*";
216 wallop_action = "%W * $*%n "; 216 wallop_action = "%_ * $*%n ";
217 217
218 # netsplits 218 # netsplits
219 netsplit = "%R$*%n"; 219 netsplit = "%R$*%n";
@@ -235,14 +235,14 @@ abstracts = {
235 # DCC chat, own msg/action 235 # DCC chat, own msg/action
236 dccownmsg = "[%r$0%K($1-%K)%n] "; 236 dccownmsg = "[%r$0%K($1-%K)%n] ";
237 dccownnick = "%R$*%n"; 237 dccownnick = "%R$*%n";
238 dccownquerynick = "%W$*%n"; 238 dccownquerynick = "%_$*%n";
239 dccownaction = "{action $*}"; 239 dccownaction = "{action $*}";
240 dccownaction_target = "{action_core $0}%K:%c$1%n "; 240 dccownaction_target = "{action_core $0}%K:%c$1%n ";
241 241
242 # DCC chat, others 242 # DCC chat, others
243 dccmsg = "[%G$1-%K(%g$0%K)%n] "; 243 dccmsg = "[%G$1-%K(%g$0%K)%n] ";
244 dccquerynick = "%G$*%n"; 244 dccquerynick = "%G$*%n";
245 dccaction = "%W (*dcc*) $*%n %|"; 245 dccaction = "%_ (*dcc*) $*%n %|";
246 246
247 ## 247 ##
248 ## statusbar 248 ## statusbar
diff --git a/.irssi/ectobar.theme b/.irssi/ectobar.theme
new file mode 100644
index 0000000..7f04ef2
--- /dev/null
+++ b/.irssi/ectobar.theme
@@ -0,0 +1,290 @@
1# When testing changes, the easiest way to reload the theme is with /RELOAD.
2# This reloads the configuration file too, so if you did any changes remember
3# to /SAVE it first. Remember also that /SAVE overwrites the theme file with
4# old data so keep backups :)
5
6# TEMPLATES:
7
8# The real text formats that irssi uses are the ones you can find with
9# /FORMAT command. Back in the old days all the colors and texts were mixed
10# up in those formats, and it was really hard to change the colors since you
11# might have had to change them in tens of different places. So, then came
12# this templating system.
13
14# Now the /FORMATs don't have any colors in them, and they also have very
15# little other styling. Most of the stuff you need to change is in this
16# theme file. If you can't change something here, you can always go back
17# to change the /FORMATs directly, they're also saved in these .theme files.
18
19# So .. the templates. They're those {blahblah} parts you see all over the
20# /FORMATs and here. Their usage is simply {name parameter1 parameter2}.
21# When irssi sees this kind of text, it goes to find "name" from abstracts
22# block below and sets "parameter1" into $0 and "parameter2" into $1 (you
23# can have more parameters of course). Templates can have subtemplates.
24# Here's a small example:
25# /FORMAT format hello {colorify {underline world}}
26# abstracts = { colorify = "%G$0-%n"; underline = "%U$0-%U"; }
27# When irssi expands the templates in "format", the final string would be:
28# hello %G%Uworld%U%n
29# ie. underlined bright green "world" text.
30# and why "$0-", why not "$0"? $0 would only mean the first parameter,
31# $0- means all the parameters. With {underline hello world} you'd really
32# want to underline both of the words, not just the hello (and world would
33# actually be removed entirely).
34
35# COLORS:
36
37# You can find definitions for the color format codes in docs/formats.txt.
38
39# There's one difference here though. %n format. Normally it means the
40# default color of the terminal (white mostly), but here it means the
41# "reset color back to the one it was in higher template". For example
42# if there was /FORMAT test %g{foo}bar, and foo = "%Y$0%n", irssi would
43# print yellow "foo" (as set with %Y) but "bar" would be green, which was
44# set at the beginning before the {foo} template. If there wasn't the %g
45# at start, the normal behaviour of %n would occur. If you _really_ want
46# to use the terminal's default color, use %N.
47
48#############################################################################
49
50# default foreground color (%N) - -1 is the "default terminal color"
51default_color = "-1";
52
53# print timestamp/servertag at the end of line, not at beginning
54info_eol = "false";
55
56# these characters are automatically replaced with specified color
57# (dark grey by default)
58replaces = { "[]=" = "%K$*%n"; };
59
60abstracts = {
61 ##
62 ## generic
63 ##
64
65 # text to insert at the beginning of each non-message line
66 line_start = "%B:%b:%B:%n ";
67
68 # timestamp styling, nothing by default
69 timestamp = "%k[%n$*%k]%n";
70
71 # any kind of text that needs hilighting, default is to bold
72 hilight = "%_$*%_";
73
74 # any kind of error message, default is bright red
75 error = "%R$*%n";
76
77 # channel name is printed
78 channel = "%_$*%_";
79
80 # nick is printed
81 nick = "%_$*%_";
82
83 # nick host is printed
84 nickhost = "[$*]";
85
86 # server name is printed
87 server = "%_$*%_";
88
89 # some kind of comment is printed
90 comment = "[$*]";
91
92 # reason for something is printed (part, quit, kick, ..)
93 reason = "{comment $*}";
94
95 # mode change is printed ([+o nick])
96 mode = "{comment $*}";
97
98 ##
99 ## channel specific messages
100 ##
101
102 # highlighted nick/host is printed (joins)
103 channick_hilight = "%b$*%n";
104 chanhost_hilight = "{nickhost %B$*%n}";
105
106 # nick/host is printed (parts, quits, etc.)
107 channick = "%B$*%n";
108 chanhost = "{nickhost $*}";
109
110 # highlighted channel name is printed
111 channelhilight = "%B$*%n";
112
113 # ban/ban exception/invite list mask is printed
114 ban = "%B$*%n";
115
116 ##
117 ## messages
118 ##
119
120 # the basic styling of how to print message, $0 = nick mode, $1 = nick
121 msgnick = "%K[%n$0$1-%K]%n %|";
122
123 # message from you is printed. "msgownnick" specifies the styling of the
124 # nick ($0 part in msgnick) and "ownmsgnick" specifies the styling of the
125 # whole line.
126
127 # Example1: You want the message text to be green:
128 # ownmsgnick = "{msgnick $0 $1-}%g";
129 # Example2.1: You want < and > chars to be yellow:
130 # ownmsgnick = "%Y{msgnick $0 $1-%Y}%n";
131 # (you'll also have to remove <> from replaces list above)
132 # Example2.2: But you still want to keep <> grey for other messages:
133 # pubmsgnick = "%K{msgnick $0 $1-%K}%n";
134 # pubmsgmenick = "%K{msgnick $0 $1-%K}%n";
135 # pubmsghinick = "%K{msgnick $1 $0$2-%n%K}%n";
136 # ownprivmsgnick = "%K{msgnick $*%K}%n";
137 # privmsgnick = "%K{msgnick %R$*%K}%n";
138
139 # $0 = nick mode, $1 = nick
140 ownmsgnick = "[$0$1-]: ";
141 ownnick = "%W$*%n";
142
143 # public message in channel, $0 = nick mode, $1 = nick
144 pubmsgnick = "[$0$1-]: ";
145 pubnick = "%N$*%n";
146
147 # public message in channel meant for me, $0 = nick mode, $1 = nick
148 pubmsgmenick = "{msgnick $0 $1-}";
149 menick = "%Y$*%n";
150
151 # public highlighted message in channel
152 # $0 = highlight color, $1 = nick mode, $2 = nick
153 pubmsghinick = "{msgnick $1 $0$2-%n}";
154
155 # channel name is printed with message
156 msgchannel = "%K:%B$*%n";
157
158 # private message, $0 = nick, $1 = host
159 privmsg = "[%R$0%K(%r$1-%K)%n] ";
160
161 # private message from you, $0 = "msg", $1 = target nick
162 ownprivmsg = "[%r$0%K(%R$1-%K)%n] ";
163
164 # own private message in query
165 ownprivmsgnick = "{msgnick $*}";
166 ownprivnick = "%W$*%n";
167
168 # private message in query
169 privmsgnick = "{msgnick %R$*%n}";
170
171 ##
172 ## Actions (/ME stuff)
173 ##
174
175 # used internally by this theme
176 action_core = "%W * $*%n";
177
178 # generic one that's used by most actions
179 action = "{action_core $*} ";
180
181 # own action, both private/public
182 ownaction = "{action $*}";
183
184 # own action with target, both private/public
185 ownaction_target = "{action_core $0}%K:%B$1%n ";
186
187 # private action sent by others
188 pvtaction = "%W (*) $*%n ";
189 pvtaction_query = "{action $*}";
190
191 # public action sent by others
192 pubaction = "{action $*}";
193
194
195 ##
196 ## other IRC events
197 ##
198
199 # whois
200 whois = "%# $[8]0 : $1-";
201
202 # notices
203 ownnotice = "[%r$0%K(%R$1-%K)]%n ";
204 notice = "%K-%M$*%K-%n ";
205 pubnotice_channel = "%K:%m$*";
206 pvtnotice_host = "%K(%m$*%K)";
207 servernotice = "%g!$*%n ";
208
209 # CTCPs
210 ownctcp = "[%r$0%K(%R$1-%K)] ";
211 ctcp = "%g$*%n";
212
213 # wallops
214 wallop = "%W$*%n: ";
215 wallop_nick = "%n$*";
216 wallop_action = "%W * $*%n ";
217
218 # netsplits
219 netsplit = "%R$*%n";
220 netjoin = "%b$*%n";
221
222 # /names list
223 names_prefix = "";
224 names_nick = "[%_$0%_$1-] ";
225 names_nick_op = "{names_nick $*}";
226 names_nick_halfop = "{names_nick $*}";
227 names_nick_voice = "{names_nick $*}";
228 names_users = "[%g$*%n]";
229 names_channel = "%G$*%n";
230
231 # DCC
232 dcc = "%g$*%n";
233 dccfile = "%_$*%_";
234
235 # DCC chat, own msg/action
236 dccownmsg = "[%r$0%K($1-%K)%n] ";
237 dccownnick = "%R$*%n";
238 dccownquerynick = "%W$*%n";
239 dccownaction = "{action $*}";
240 dccownaction_target = "{action_core $0}%K:%B$1%n ";
241
242 # DCC chat, others
243 dccmsg = "[%G$1-%K(%g$0%K)%n] ";
244 dccquerynick = "%G$*%n";
245 dccaction = "%W (*dcc*) $*%n %|";
246
247 ##
248 ## statusbar
249 ##
250
251 # default background for all statusbars. You can also give
252 # the default foreground color for statusbar items.
253 sb_background = "%7%K";
254
255 # default backround for "default" statusbar group
256 #sb_default_bg = "%4";
257 # background for prompt / input line
258 sb_prompt_bg = "%n";
259 # background for info statusbar
260 sb_info_bg = "%8";
261 # background for topicbar (same default)
262 #sb_topic_bg = "%4";
263
264 # text at the beginning of statusbars. sb-item already puts
265 # space there,so we don't use anything by default.
266 sbstart = "";
267 # text at the end of statusbars. Use space so that it's never
268 # used for anything.
269 sbend = " ";
270
271 prompt = "[$*] ";
272
273 sb = " %k[%n$*%k]%n";
274 sbmode = "(%k+%n$*)";
275 sbaway = " (%GzZzZ%n)";
276 sbservertag = ":$0 (c/w ^X)";
277
278 # activity in statusbar
279
280 # ',' separator
281 sb_act_sep = "%k$*";
282 # normal text
283 sb_act_text = "%c$*";
284 # public message
285 sb_act_msg = "%M$*";
286 # hilight
287 sb_act_hilight = "%M$*";
288 # hilight with specified color, $0 = color, $1 = text
289 sb_act_hilight_color = "$0$1-%n";
290};
diff --git a/.irssi/modules/libfe_xmpp.so b/.irssi/modules/libfe_xmpp.so
new file mode 100755
index 0000000..b88880d
--- /dev/null
+++ b/.irssi/modules/libfe_xmpp.so
Binary files differ
diff --git a/.irssi/modules/libtext_xmpp.so b/.irssi/modules/libtext_xmpp.so
new file mode 100755
index 0000000..78bcf42
--- /dev/null
+++ b/.irssi/modules/libtext_xmpp.so
Binary files differ
diff --git a/.irssi/modules/libxmpp_core.so b/.irssi/modules/libxmpp_core.so
new file mode 100755
index 0000000..870abcf
--- /dev/null
+++ b/.irssi/modules/libxmpp_core.so
Binary files differ
diff --git a/.irssi/scripts/autorun/notifier.pl b/.irssi/scripts/autorun/notifier.pl
new file mode 120000
index 0000000..01117fe
--- /dev/null
+++ b/.irssi/scripts/autorun/notifier.pl
@@ -0,0 +1 @@
../notifier.pl \ No newline at end of file
diff --git a/.irssi/scripts/notifier.pl b/.irssi/scripts/notifier.pl
new file mode 100644
index 0000000..a242545
--- /dev/null
+++ b/.irssi/scripts/notifier.pl
@@ -0,0 +1,142 @@
1# == WHAT
2# Simple script for irssi to trigger Mac OS X 10.8's Notification Center
3#
4# == WHO
5# Patrick Kontschak 2012
6#
7# Forked from Nate Murray's irssi-growl: https://github.com/jashmenn/irssi-growl
8#
9# == CONFIG
10# /SET notifier_on_regex [regex]
11# /SET notifier_channel_regex [regex]
12#
13# == EXAMPLES
14#
15# notifier on mynickname
16# /SET notifier_on_regex mynickname
17#
18# notifier on everything:
19# /SET notifier_on_regex .*
20#
21# everything but jdewey
22# /SET notifier_on_regex (?=^(?:(?!jdewey).)*$).*
23#
24# only notifier things for mychannel1 and mychannel2
25# /SET notifier_channel_regex (mychannel1|mychannel2)
26#
27# == INSTALL
28# Place notifier.pl in `~/.irssi/scripts/`.
29# /script load notifier.pl
30#
31
32use strict;
33use Irssi;
34use vars qw($VERSION %IRSSI);
35# use Config;
36
37# Dev. info ^_^
38$VERSION = "0.0";
39%IRSSI = (
40 authors => "Patrick Kontschak",
41 contact => "patrick.kontschak\@gmail.com",
42 name => "Notifier",
43 description => "Simple script that will trigger Mac OS X 10.8's Notification Center",
44 license => "GPL",
45 url => "http://www.codinggoat.com",
46 changed => "Wed 8 Aug 2012 14:40:15 EDT"
47);
48
49# All the works
50sub do_notifier {
51 my ($server, $title, $data) = @_;
52 $data =~ s/["';]//g;
53 system("terminal-notifier -message '$data' -title '$title' >> /dev/null 2>&1");
54 return 1
55}
56
57sub notifier_it {
58 my ($server, $title, $data, $channel, $nick) = @_;
59
60 my $filter = Irssi::settings_get_str('notifier_on_regex');
61 my $channel_filter = Irssi::settings_get_str('notifier_channel_regex');
62 my $notifier_on_nick = Irssi::settings_get_str('notifier_on_nick');
63
64 my $current_nick = $server->{nick};
65 if($filter) {
66 return 0 if $data !~ /$filter/;
67 }
68 if($channel_filter && $server->ischannel($channel)) {
69 return 0 if $channel !~ /$channel_filter/;
70 }
71
72 $title = $title . " " . $channel;
73 do_notifier($server, $title, $data);
74}
75
76# All the works
77sub notifier_message {
78 my ($server, $data, $nick, $mask, $target) = @_;
79 notifier_it($server, $nick, $data, $target, $nick);
80 Irssi::signal_continue($server, $data, $nick, $mask, $target);
81}
82
83sub notifier_join {
84 my ($server, $channel, $nick, $address) = @_;
85 notifier_it($server, "Join", "$nick has joined", $channel, $nick);
86 Irssi::signal_continue($server, $channel, $nick, $address);
87}
88
89sub notifier_part {
90 my ($server, $channel, $nick, $address) = @_;
91 notifier_it($server, "Part", "$nick has parted", $channel, $nick);
92 Irssi::signal_continue($server, $channel, $nick, $address);
93}
94
95sub notifier_quit {
96 my ($server, $nick, $address, $reason) = @_;
97 notifier_it($server, "Quit", "$nick has quit: $reason", $server, $nick);
98 Irssi::signal_continue($server, $nick, $address, $reason);
99}
100
101sub notifier_invite {
102 my ($server, $channel, $nick, $address) = @_;
103 notifier_it($server, "Invite", "$nick has invited you on $channel", $channel, $nick);
104 Irssi::signal_continue($server, $channel, $address);
105}
106
107sub notifier_topic {
108 my ($server, $channel, $topic, $nick, $address) = @_;
109 notifier_it($server, "Topic: $topic", "$nick has changed the topic to $topic on $channel", $channel, $nick);
110 Irssi::signal_continue($server, $channel, $topic, $nick, $address);
111}
112
113sub notifier_privmsg {
114 # $server = server record where the message came
115 # $data = the raw data received from server, with PRIVMSGs it is:
116 # "target :text" where target is either your nick or #channel
117 # $nick = the nick who sent the message
118 # $host = host of the nick who sent the message
119 my ($server, $data, $nick, $host) = @_;
120 my ($target, $text) = split(/ :/, $data, 2);
121 # only notify if we're permitting notification on privmsg
122 if (Irssi::settings_get_str('notifier_on_privmsg') == 1) {
123 notifier_it($server, $nick, $data, $target, $nick);
124 }
125 Irssi::signal_continue($server, $data, $nick, $host);
126}
127
128# Hook me up
129Irssi::settings_add_str('misc', 'notifier_on_regex', 0); # false
130Irssi::settings_add_str('misc', 'notifier_channel_regex', 0); # false
131Irssi::settings_add_str('misc', 'notifier_on_nick', 1); # true
132Irssi::settings_add_str('misc', 'notifier_on_privmsg', 0); # false
133Irssi::signal_add('message public', 'notifier_message');
134Irssi::signal_add('message private', 'notifier_message');
135Irssi::signal_add('message own_public', 'notifier_message');
136Irssi::signal_add('message own_private', 'notifier_message');
137Irssi::signal_add('message join', 'notifier_join');
138Irssi::signal_add('message part', 'notifier_part');
139Irssi::signal_add('message quit', 'notifier_quit');
140Irssi::signal_add('message invite', 'notifier_invite');
141Irssi::signal_add('message topic', 'notifier_topic');
142Irssi::signal_add('event privmsg', 'notifier_privmsg');
diff --git a/.irssi/scripts/twirssi.json b/.irssi/scripts/twirssi.json
deleted file mode 100644
index 726e3d2..0000000
--- a/.irssi/scripts/twirssi.json
+++ /dev/null
@@ -1 +0,0 @@
1{"google":[null,"14226259469","14236299387","14240600900","14248995829","14252002067","14262541126","14302926338","14303628114","14304997482","14305317958","14305931564","14306347895","14306745222","14309340889","14315676232","14371238178","14373755884","14383432355","14384805712","14433594882","14438656525","14441447104"],"docwes":[null,"14228034292","14257246631","14259140403"],"nateklaiber":[null,"14304103577","14331378445","14372455702","14403375677"],"scottfweintraub":[null,"14235307062"],"mhebrank":[null,"13683233111","14227742492","14228014682","14232426081","14234903304","14240621698","14248626928","14313150941","14338145742","14338365293","14366589291","14370272743","14372082398","14373973001","14374129829","14395963344","14396148093","14430901917","14441625864","14442072008","14442430013"],"jacobian":[null,"14231886931","14257235390","14366740373","14367084302","14382552810"],"djco":[null,"14369226798","14373722754"],"tfln":[null,"14306678173","14309003172","14309302715","14374631566","14378860196"],"playframework":[null,"14244349947","14306816389","14369049840","14432574960","14438243516"],"aquamindy":[null,"13628215602","14227527759","14228484307","14228715248","14228916682","14261579146","14305577465","14321252645","14369272834","14373901138","14374004505","14374375639","14379068200","14379865281","14436704579"],"pythoncoders":[null,"14438397768"],"brettsky":[null,"14243538384","14255368262","14259528450","14313956331","14313958001","14315765120","14322491041","14322708413","14325530679","14327053652","14380620408","14385090551","14394673337","14399450398","14399450778"],"hudsonsc":[null,"14231082342","14265997536","14318014957","14318812559","14367586538"],"__last_id":{"mcrute@Twitter":{"dm":"1134828018","reply":"14374614725","timeline":"14442430013"}},"brianmegilligan":[null,"14263539221","14308202606","14320826512","14321076324","14368648299","14384875124","14392368430","14398257813","14440171639"],"mrsamandasmith":[null,"14236197933","14315815897","14328069117","14328125756","14328281943","14329359038","14430823347","14436077333","14436168435","14437918990","14438125148","14441880866"],"thepsf":[null,"14226515198","14356358666","14421660503"],"codeshaman":[null,"14243723883","14245104651","14258017158","14302365167","14307859533","14318508132","14360180416","14360553700","14360665151","14363389689","14364196731","14368504941"],"nedbat":[null,"14297884943"],"holidayvalley":[null,"14235138367","14302856025"],"glbc_cleveland":[null,"14229082629","14235557454","14241266771","14248027941","14297677580","14311499182","14312154417","14361258649","14364731702","14372005096","14431978630"],"praxis1138":[null,"13686095346","13847225702","14301970710","14305481246","14363857128"],"mcrute":[null,"14231340732","14231353302","14231789325","14231972865","14226001871","14234620303","14237778256","14237859355","14252138395","14252303921","14291746505","14291841930","14295648196","14298152587","14326869801","14326886785","14329706197","14330271064","14330317575","14330726934","14330824524","14330844785","14331258400","14331305059","14331470704","14332159165","14332304892","14332719578","14333128048","14357537765","14359702131","14370261316"],"kevbo":[null,"14293720299"],"ironfroggy":[null,"14223337697","14236241739","14243988968","14247367979","14258877934","14269216888","14291644730","14294146633","14300381165","14302340392","14303364371","14309555260","14324125967","14356530408","14374300152","14375525133","14385774657","14422704098","14431914612","14432302776","14434648812","14441601704"],"clevelanddotcom":[null,"14221412539","14222723080","14223814069","14232017895","14233948659","14235353915","14235365281","14235885066","14237529412","14239494607","14241117638","14241956206","14244498176","14246251260","14249273113","14250922858","14252484052","14254139627","14256002199","14257832279","14259649749","14263472233","14265505675","14267473499","14277517248","14282515437","14283658685","14284813747","14285989316","14287195436","14288563965","14290033935","14291580313","14293253106","14295018690","14296858364","14298258168","14298588003","14300024079","14301622615","14303234755","14304740819","14306517229","14307713630","14308225601","14309766092","14310713104","14314727726","14316795433","14318264680","14319769406","14321338756","14325039301","14326997526","14328747192","14332757439","14336814673","14340410218","14348043276","14349117242","14352211394","14354489979","14357288594","14358894841","14358988846","14362316745","14364165944","14366020512","14369786562","14371641499","14373423179","14375144682","14376722709","14378250473","14381127572","14382685361","14382695298","14383934312","14385240086","14392933796","14394387499","14397677092","14399480425","14403471379","14409080305","14412378620","14416230851","14419398435","14420530768","14423159267","14424632399","14426216467","14426425128","14429680220","14431891734","14435364137","14435963396","14437898564","14441396566"],"jonrstahl":[null,"14370447112","14371487440","14434716426"],"joshwalsh":[null,"14246373551","14257119998","14297193091","14300698928","14300721027","14318608032","14334812374","14334916962"],"ianbicking":[null,"14239409695","14303327612","14304382544","14306721701","14308126855","14310493100"],"kentbeck":[null,"14239131824","14251969522","14297242626","14298160521","14298251222","14298783749","14299204486","14300128861","14300544281","14301269266","14304855069","14310300190","14313331098","14313950198","14314363574","14314877840","14316383335","14316441341","14330201080","14333560442","14373788769","14377762934","14378791969","14432772837","14433718351","14436461427"],"rtomayko":[null,"14276529662","14305057038","14373550775","14397288270","14409185093","14410186291"],"mattcutts":[null,"14231601366","14267475669","14299033041","14300436960","14300884508","14303402067","14303861501","14315948301","14316251365","14320750972","14322131491","14328257897","14332390135","14368581667","14368822166","14369253512","14369653245","14370924645","14371496664","14377141034","14404109767","14414323153","14434986010"],"ronjeffries":[null,"14224192028","14261167419","14263189416","14266406212","14268989105","14360879219","14361119008"],"timbecht":[null,"14304555337","14326293230","14330509551","14330742613","14424375442","14424976998"],"csitko":[null,"14236409611","14239354701","14239430835","14248400749","14263087916","14263142572","14268032638"],"holdenweb":[null,"14256575649"],"snowtrails":[null,"14376719047"],"pperon":[null,"14251747631","14303902740","14317777074","14334159631","14363060074","14368252896","14371705916","14372022767","14372182477","14399037342","14401072697","14401188647","14403097492","14427312745","14427686837","14429259891","14435126508"],"puredanger":[null,"14255281777","14266610348","14269124815","14294277210","14294320198","14300151314","14302938762","14307059962","14307899280","14308363010","14308375000","14308432991","14310137376","14315729293","14327606729","14332448761","14332681357","14366130736","14369043257","14371371396","14382975729","14422167304"],"markramm":[null,"14359748975"],"davenoyes":[null,"14400455120"],"aschulak":[null,"14224355794","14226634480","14258814841","14259391189","14261963910","14321827275","14375702922","14380685184","14381924856","14387114992"],"dmarsh":[null,"14243835081","14245705486","14256321646","14260582150","14262736320","14269482373","14269575391","14315987236","14361274217","14365503935","14365550764","14378176119","14402316769","14402409437","14424369657"],"developingchris":[null,"14226354699","14227572983","14227790699","14228187218","14271714346","14294060062","14423072576"],"catherinedevlin":[null,"14367258699","14396477245","14430573483","14430738414","14431834491"],"annoyatron":[null,"14253223381","14321270188"],"sadukie":[null,"14287942179","14329792434","14335394646","14335534813","14376747419","14389065906","14395765515"],"mpmselenic":[null,"14248296931","14313631243","14368602123"],"benjaminws":[null,"13561509968","13882498626","14191982752","14222994662","14227130021","14227899677","14228611238","14233697527","14241123803","14242471373","14242750586","14243669233","14244338662","14248025183","14249970821","14251037254","14259462930","14267783622","14268331942","14269386592","14270135754","14271238028","14295883295","14306085497","14306466287","14318389307","14321708910","14326702479","14327655439","14327673720","14327696413","14327710179","14327737708","14327748214","14327754340","14327784512","14328616827","14328814815","14329862613","14329908107","14331121710","14331595857","14331745928","14333023180","14335542681","14336729185","14363271835","14370371442","14370651483","14370772625","14370814986","14374614725","14391650798","14415303018","14430687082","14430693159","14431823820","14435688159","14436229496"],"mcantor":[null,"14242873597","14300725181","14321303335","14430499071"],"msnyder":[null,"14221921092","14223814009","14223900484","14293106213","14300882534","14432010167","14436217499","14436973292","14437272465"],"mpirnat":[null,"13628136290","13846990578","14228731264","14239270700","14241833157","14249005675","14251078309","14257895147","14259443565","14263060399","14326169577","14326454792","14390259728","14390513927","14395221426","14395429978","14396084915","14410717957","14435196891"],"chris_weisel":[null,"14433478028"],"joefiorini":[null,"14264553727","14323980590","14325058597","14325089792","14325224271","14400723428"],"calvinhp":[null,"14236441923","14244918814","14260510418","14363862085"],"javausers":[null,"14229998200","14244012570","14245585358","14319061335","14385929661","14431441897","14431692649","14431945763"],"garybernhardt":[null,"14191527438","14232937453","14233127534","14240570833","14240588996","14243308694","14243550634","14243563499","14244253387","14248518032","14250273748","14250780978","14250911414","14258160684","14258290786","14258438245","14258707442","14274707047","14278484050","14306745871","14308122399","14308149437","14309214926","14309984783","14315984847","14316094297","14316313825","14317986829","14319160652","14320056751","14320296470","14324034470","14325195733","14326610799","14326646904","14331836666","14341070017","14341337231","14368707503","14373180954","14379348795","14379495683","14379549071","14380223365","14390157376","14390482786","14401878464","14402243616","14404223386","14435746718"],"zedshaw":[null,"14240994810","14248423598","14265920624","14271420038","14274666731","14276704277","14279009308","14279426212","14280159075","14294291645","14295041524","14302192944","14303052501","14303155498","14303341549","14305016359","14305058976","14305114440","14310487367","14343625722","14380558728"],"mikemonkiewicz":[null,"14227429700","14232641315","14363310775","14433215497","14434147113"],"nickbarendt":[null,"14370623082","14425971752","14435450726"],"jessenoller":[null,"14258799467","14261182328","14261757941","14262747861","14262779794","14263087680","14263275392","14263353790","14319444269","14362516913","14369921005","14370664946","14370727116","14370761746","14378224101","14394277885","14395297532","14399396088","14422031993"],"tarek_ziade":[null,"14248412212","14250685953","14283828493","14387245125","14434436795"],"nasa":[null,"14222256056","14222483247","14222895530","14223133174","14223652855","14224456316","14225407995","14229742318","14232373604","14236445074","14239185195","14239283418","14239910098","14242921767","14242956036","14245007500","14250786290","14278883551","14279118614","14287631497","14287894143","14288247879","14290400242","14290533524","14294832410","14294897829","14294950962","14295813401","14296077496","14297835061","14298664801","14302680097","14303873978","14303950863","14304452541","14305206972","14307685572","14307813375","14312569002","14325332364","14336389559","14343855749","14353990295","14354091907","14357567726","14357683469","14358445225","14358445909","14359377987","14363024374","14368637557","14370646486","14372703590","14380500164","14380644607","14380821515","14385521907","14389332336","14410412409","14410466360","14420325280","14420444213","14424167397","14428039824","14430597841","14439733052"],"d_snyder":[null,"14302205907","14315714813","14368554966"],"rubbsdecvik":[null,"14195666806"],"jonathanpenn":[null,"14231396293","14240939756","14290061261","14290199754","14297715793","14299861949","14363696792","14367084252","14371833964","14374007157","14384236562","14396215074","14401733915","14401767327","14402182710","14402401037","14404259204","14433783493"],"ua6oxa":[null,"14430194015","14437577629"],"voidspace":[null,"14233440568","14272747444","14293837359","14295119721","14299882235","14301912517","14302815658","14302874234","14303152197","14303233411","14303491478","14307368413","14307446605","14307803017","14308130234","14308166489","14311353910","14314407597","14314872023","14316456077","14317220658","14318003217","14318111653","14318363833","14318423760","14322139023","14324927086","14325727293","14351088369","14354423133","14356413068","14356640264","14360139312","14360190835","14360689481","14361983604","14362053185","14365198289","14366001277","14366172050","14368453503","14371709504","14374567779","14380777147","14386351830","14422545263","14429947068","14430150432","14431585856","14432051944","14432146181","14438599176","14440354875","14441688603"],"appleinsider":[null,"14222914356","14230264146","14235391659","14245014107","14251223577","14258356411","14258357244","14290397006","14290400670","14292019574","14297449047","14300446209","14306933008","14308563982","14310127686","14323661569","14331097382","14360972829","14360973478","14366409433","14372150677","14377230386","14383133465","14400253874","14425374794","14428750512","14436560066","14441989795"],"jimweirich":[null,"14243829200","14261201904","14312940125","14437187465"],"jespern":[null,"14221822952","14237076474","14356323282","14383288460"],"clevemetroparks":[null,"14231000395","14243766720","14363133772","14371640255"],"railcar88":[null,"14223041605","14230069444","14316831722","14316912395","14356266610","14376348517"],"amazondeals":[null,"14226035097","14235527028","14244331526","14249815795","14258855873","14265744755","14280260707","14293746334","14305211688","14310712052","14316160950","14318984792","14321978604","14325128678","14328401655","14345933430","14359507875","14373640824","14379684818","14385082815","14395591202","14412792987","14426212167","14433194727","14440570908"],"gregmalcolm":[null,"14434140428"],"ctitusbrown":[null,"14300502148"],"club_is_open":[null,"14232257293","14239395024","14241442899","14244994241","14272827236","14295639250","14299267758","14314370620","14365801615","14366607222","14369842271","14370486765","14370685333","14370724720","14370854287","14376732439","14386516335","14432116761"],"clecitycouncil":[null,"14234692885","14246151184","14298496937","14313568943","14359709272"],"madssj":[null,"14356211817","14422770420"],"docondev":[null,"14221790541","14221954607","14260474918","14260549554","14262896816","14262964736","14298220465","14298974181","14300237749","14300517092","14300576914","14306767748","14315615605","14329555924","14329915198","14330035237","14360483383","14367657053","14368867203","14369404703","14370246985","14372957559","14373089019","14375323772","14381764200","14382865351","14383150301","14402447503","14427797339","14429275355","14434195497","14439231530"],"jleedev":[null,"14372014021","14382341297","14389976225","14404660418","14434643349"],"linode":[null,"14235391812","14239726913","14315634968"],"elizadushku":[null,"14242924191","14250102516","14258498235","14259464749","14261007457","14261206019","14261670630","14261935621","14262173820","14272283367","14275813978","14277535753","14277771849","14301113637","14301141535","14301386420","14306854979","14309001069","14310108072","14319368675","14339413532","14344626471","14384104684","14384567515","14384796511","14407431292","14408649041","14408770800","14408879020","14408944456","14409012907","14442190971"],"mitsuhiko":[null,"14235448026","14241455320","14249278771","14254993648","14303401322","14314265545","14357182376","14390671017","14418554873","14418803663","14439618763"],"__indexes":{"CleCityCouncil":5,"MikeMonkiewicz":5,"google":22,"nateklaiber":4,"scottfweintraub":1,"mhebrank":21,"jacobian":5,"djco":2,"playframework":5,"pythoncoders":1,"brettsky":15,"OfficialBrowns":11,"Aquamindy":15,"mrsamandasmith":12,"codeshaman":12,"nedbat":1,"holidayvalley":2,"praxis1138":5,"mcrute":32,"kevbo":1,"ironfroggy":22,"clevelanddotcom":99,"jonrstahl":3,"BrianMegilligan":9,"joshwalsh":8,"ianbicking":6,"rtomayko":6,"Docwes":3,"mattcutts":23,"timbecht":6,"csitko":7,"holdenweb":1,"pperon":17,"puredanger":22,"markramm":1,"HudsonSC":5,"davenoyes":1,"aschulak":10,"dmarsh":15,"developingchris":7,"catherinedevlin":5,"annoyatron":2,"sadukie":7,"mpmselenic":3,"benjaminws":59,"NASA":66,"mcantor":4,"msnyder":9,"mpirnat":19,"chris_weisel":1,"joefiorini":6,"calvinhp":4,"garybernhardt":50,"zedshaw":21,"SnowTrails":1,"nickbarendt":3,"jessenoller":19,"tarek_ziade":5,"d_snyder":3,"rubbsdecvik":1,"jonathanpenn":18,"ua6oxa":2,"TFLN":5,"ThePSF":3,"voidspace":54,"appleinsider":28,"jimweirich":4,"jespern":4,"clevemetroparks":4,"railcar88":6,"amazondeals":25,"ctitusbrown":1,"club_is_open":18,"madssj":2,"jleedev":5,"linode":3,"DiscoverOhio":35,"KentBeck":26,"elizadushku":32,"mitsuhiko":11,"iamfender":11,"meatballhat":16,"alex_gaynor":20,"chzy":6,"coreyhaines":36,"bikegriffith":13,"thafreak":13,"RonJeffries":7,"unimancorn":43,"jzawodn":4,"gvanrossum":4,"derrakostovic":2,"siddfinch":13,"dangoor":4,"GLBC_Cleveland":11,"thegreenhouse":7,"melindajacobs":5,"dstanek":33,"JavaUsers":8,"GregMalcolm":1,"judyz":2,"unclebobmartin":22,"dgou":36,"bstanek":1,"venkat_s":7,"mfeathers":4,"doughellmann":7,"leandog":1,"akuchling":14,"dowskimania":5,"andrew_holland":2,"feliciaday":10,"DocOnDev":32,"mw44118":11,"durin42":3,"martinfowler":5,"mrdomino":5,"iamamish":8},"iamfender":[null,"14227434584","14229424783","14249511430","14288447008","14293152960","14335279931","14364197483","14375538837","14435211935","14437659093","14438839515"],"alex_gaynor":[null,"14231330939","14232003769","14230612892","14241449698","14242103213","14247785110","14252041577","14255794576","14256997768","14261366974","14262028284","14262317602","14263016602","14263063142","14263420481","14316473053","14373788169","14399328104","14408529008","14438592132"],"meatballhat":[null,"14231197953","14227750768","14240533192","14241163954","14241273759","14244594487","14300550367","14301552850","14312794116","14362849676","14370295152","14371492492","14439067374","14441740096","14441926527","14442170853"],"chzy":[null,"14231601654","14319820949","14374834449","14374849004","14426979652","14427989606"],"coreyhaines":[null,"14231246074","14231593028","14221808116","14226936913","14226950653","14226966860","14227120237","14230789273","14235278713","14241179081","14251944957","14252026684","14264594780","14264599524","14264602472","14264605924","14296076035","14296110615","14296964366","14298264542","14303998075","14304689445","14308994666","14309348702","14309400331","14309423891","14309473245","14310279466","14312842160","14315676246","14358892695","14359118439","14368260296","14425387101","14432260340","14437176256"],"bikegriffith":[null,"14244275116","14244768407","14250946351","14251002644","14251141643","14259963453","14261217897","14261802065","14268784622","14270905153","14270998536","14308621448","14441113170"],"discoverohio":[null,"14231155503","14231389928","14231640300","14231736793","14224529198","14227597374","14243011373","14244648563","14246114890","14248447814","14249015576","14292268603","14293756428","14295303654","14304534888","14305518466","14309376204","14314799138","14357951727","14360337027","14361167431","14362900229","14363178523","14363512748","14363742952","14372890476","14378303836","14378871107","14383812696","14424696513","14429786738","14432940595","14434067588","14434171300","14434482220"],"thafreak":[null,"14237716965","14300631655","14302784656","14305113856","14305367518","14367926927","14367926972","14370309746","14370432537","14381594605","14381594659","14435698581","14435986290"],"__tweets":{"google":[null,"Introducing the Doodle 4 Google Regional Finalists - now it's your turn to vote on the top 40 doodles (until May 25) http://bit.ly/d0pnnG","Remember to tune in to live-streamed Google I/O keynotes - starting tomorrow at 9am http://goo.gl/K6sD (via @googleio)","RT @GoogleAtWork Automating business processes just got easier with Google Apps Script. http://bit.ly/9CfjGo","1000+ Bay Area Googlers celebrated Bike to Work Day last week — a roundup of the cycling fun http://bit.ly/d8Rx7M","Business users get more efficient w/contextual gadgets in Gmail (Google Enterprise Blog) http://bit.ly/bMI99B","Stand by, says @AndroidDev; countdown to @googleio is on. http://bit.ly/abBo3O","Google Wave for all! Sign in @ wave.google.com (no invite req'd) or enable your Google Apps domain http://bit.ly/9ga9nD (via @googlewave)","RT @googleio: Introducing WebM, open web media project supported by Chrome, Firefox, Opera, YouTube... http://www.webmproject.org/ #io2010","(Unrelated to #io2010) Calendar has a new look http://bit.ly/bUKl15 (via @googlecalendar)","We just previewed the Chrome Web Store, an open marketplace for web apps, at #io2010 http://bit.ly/9lVgFn","Announcing Google App Engine for Business: helps IT depts rapidly build & scale their apps on Google’s infrastructure http://bit.ly/d1Insm","We're teaming up with VMware to make it easier for businesses to build cloud-based apps w/ more deployment choices http://bit.ly/96ZBj4","For those of you not following the minute-by-minute of #io2010, here's a summary of today's announcements: http://bit.ly/dm2ol7","New in Custom Search: query autocompletion http://bit.ly/bESGni","RT @EarthOutreach Learn about Google's efforts to aid spread of information about Deepwater Horizon oil spill: http://bit.ly/bw46Ps","Announcing Android 2.2. codenamed Froyo: make your handset a portable hotspot & more http://bit.ly/cDl7iq #io2010","Combining TV with the Internet: Introducing Google TV http://bit.ly/cPmhKX #io2010","For those of you that missed it: RT @googleio: Full length Day 1 keynote video now available http://bit.ly/aYgbOz #io2010","Sign the Global Fund's YouTube petition for all children to be born HIV free by 2015 http://bit.ly/ck79ZF","Feeling lucky? Maybe you can get to level 256 of our first playable doodle. Happy birthday PAC-MAN! http://bit.ly/bHjgIc","The FTC has cleared our acquisition of AdMob http://bit.ly/aih4Y1","RT @googleio Google TV segment of #io2010 Day 2 keynote now available http://goo.gl/p5M2"],"docwes":[null,"@aschulak not to shabby. I rolled one on set too only 8 didn't use the XP potion","@aschulak logging my level 10 dude on set name is Drager i got to catch up to ya","@aschulak demo"],"nateklaiber":[null,"So glad that slot bar is gone now. That was annoying.","Goodbye Hit List, hello Things. I couldn't wait forever for an iPhone app.","@jonathanpenn - you should be scared later.","@joefiorini I shocked your mo....you know the rest :)"],"scottfweintraub":[null,"@dstanek aren't you also sick?"],"mhebrank":[null,"@mcrute should I be laughing that I just saw that on facebook? yes. yes I should.","!@aquamindy Seriously? Quick. . .send 'em over here. I've got a few people I could use dead.","!@benjaminws dammit! everytime you do that I go \"didn't he just link that yesterday?\" Noooo. last week. time goes too fast.","RT @portnik Sarcasm helps keep you from telling people what you really think of them. (via @kristenkaleal) | and they ignore when you do.","RT @charlietodd: Really happy with how the new Improv Everywhere Ghostbusters-themed video turned out: http://bit.ly/dDsUJA","dear programming community, cut it out with the new languages. Learn to to contribute to assembler. </grumps> (for @meatballhat)","World. You make me cry: http://myturl.com/0pB8n","RT @meatballhat is totally jazzed about the new Google font directory http://code.google.com/webfonts | uh. WHAT? http://twitpic.com/1p7db9","! @pperon games drive computer development and porn drives network development. This is fact.","@dstanek @benjaminws maybe he's hoping. . .unless he wants more kids!","OH \"Hi!\" \"Hi! What are you doing?\" \"Just standing on my desk!\" | uh. . .I have weird coworkers.","!@Aquamindy I'm trying to see if it fits into my schedule right now.","@pperon now you know why I follow you!","@Aquamindy I would expect nothing less. I might even be disappointed if you didn't.","@Aquamindy yes! and I'm hoping for an underdog victory so they take off their jerseys! Is that chauvinistic of me?","@mpirnat where by \"iffy\" you mean \"it's going to storm\"?","@mpirnat on the upside, I doubt it'll sell out so we can probably wait till saturday.","@mrsamandasmith beer and shots = awesomer!","RT @iamamish Bon Jovi? Really? http://yhoo.it/cyPcVU | I say again: The world makes me cry.","@meatballhat NO PANCAKES FOR YOU!","@meatballhat Yea. you know, family heritage and all."],"jacobian":[null,"\"Tests aren't an optional extra — they're how you prove that you've … thought about the problem you're trying to solve.\" - @freakboy3742","DjangoCon US: Sept. 7-9, Portland OR. I'm going, you should too! http://djangocon.us/ /via @jtauber","MCI -> CLT -- first leg of the trip that'll eventually get me to #djangocon.","@jessenoller @gregnewman a manpage to instapaper tool would rock -- or better yet, an ipad manpage viewer.","CLT-> FRA #djangocon"],"djco":[null,"RT @gvwilson: The Architecture of Open Source Applications: http://tinyurl.com/38dfyn9","I love it when a plan comes together. http://pypi.python.org/pypi/Sphinx-PyPI-upload/"],"tfln":[null,"(808): for future reference: anal bleach BEFORE boozing http://tfl.nu/book","(401): I'm inventing beer flavored vodka. This raspberry shit makes me feel like a pussy.","nice moves, @RichardWildwood. http://tcrn.ch/amJRwf","(780): I literally stabbed myself so I had a valid reason to get out of having sex with her http://tfl.nu/book","(970): ahh summer, the season during which the prefix for every verb is \"get drunk and\""],"playframework":[null,"Yes; I'm preparing a streamlined deployment platform for your play applications #teasing http://twitpic.com/1oxnzc","RT @dhh Loving the progress of HTML5. See what browsers are already ready for what: http://html5readiness.com/","#playframework session tonight at #oslo -- http://bit.ly/cBnCu6","Want to learn #scala the easy way? I've created a special package for that http://bit.ly/dC3rLU #playwithscala","And the video http://vimeo.com/11926707 #playwithscala"],"aquamindy":[null,"@mcrute I'm stuck with them. Like I'm stuck with someone else.","Ugh, this child is getting away with murder today.","To the person sending @mpirnat messages on MS Messenger, you actually contacted me and the kid watching Angelina Ballerina, try again.","Weintrub!!!!!!!!!!!!!!!!!!!","@mhebrank \"Bring out your dead! \"","@aschulak that all die!!!!!!!","Yo Gabba Gabba Live is coming to Cleveland!! #fb","Come explore w/DINOSAUR TRAIN! http://to.pbs.org/bnHQ8u Geocaching just in time for the summer! (via @hensoncompany)","Who wants to see womens us soccer play Germany on sat? #fb","@mhebrank if you can't fit it in your schedule, we get to tease you alot, right?","@mhebrank i mean, it's German women playing soccer!!!","@mhebrank actually, i expected that from you.","\"BARBIE'S SLIPPERS!!! A monkey take Barbie's slippers away!!!\" #fb","No matter how hard I try, I can never understand the plots of Barbie movies.","Is your job so dangerous you can retire early? http://twurl.nl/sr54nn"],"pythoncoders":[null,"Every python module should add these four lines (disable star imports from your module!) http://bit.ly/aCDxQr"],"brettsky":[null,"Outsourcing to an Indian Jail - Schneier on Security http://goo.gl/fb/jl7BK","My talk is listed along with ones from Guido, Raymond Hettinger, Wesley Chun, Mark Dickinson… http://goo.gl/fb/yqL7n","On the bus, three people listening to their iPhones, three just sitting there. Now I see why… http://goo.gl/fb/q3ZYp","Yes! Flash can hopefully be relegated to games in very short order for me. Too bad that you… http://goo.gl/fb/yR9pQ","It's good that Google is making sure people specify an alternative font family as that will… http://goo.gl/fb/RVSAz","For Oplop I have been using Hg commit hooks to generate and copy common files around. But… http://goo.gl/fb/T2zol","The whole Python discussion for Ubuntu's Maverick release due in October just reminded me… http://goo.gl/fb/cE8Ye","The one thing I could see using the new Latitude API is something that ties into your Google… http://goo.gl/fb/WA380","@alex_gaynor abstracts: http://www.europython.eu/talks/talk_abstracts/, speakers: http://www.europython.eu/talks/speakers/","While I appreciate the integrated dictionary and special characters, is that a necessary… http://goo.gl/fb/Doh2M","Android 2.2 and developers goodies. - Android Developers Blog http://goo.gl/fb/Dykbd","The problem Sprint is going to have is availability come the end of the year as Verizon… http://goo.gl/fb/yFgqU","This guy must be the nicest bus driver in the world. How they treat bus drivers in Denmark… http://goo.gl/fb/2WTNy","So nearly every person who comes into Australia and doesn't check the \"porn\" box is lying… http://goo.gl/fb/fEx88","As always, an important thing to point out is that America's population density is much lower… http://goo.gl/fb/DKHOO"],"hudsonsc":[null,"Anyone planning on presenting lightning talks for tomorrow night's meeting?","RT @ardalis: I may be ready to give a short bit of my upcoming TechEd AntiPatterns talk at @HudsonSC tomorrow night.","Getting ready for tonight's meeting - should be well attended if the nice weather doesn't keep people from coming...","If you're coming for the first time, we're on the 2nd floor in Henning Software's office","Great meeting last night - thanks to everyone for coming out and to @mfalanga for his presentation that kicked off great discussion."],"brianmegilligan":[null,"Anniversary mini-vacation, starting now!","My dad got an iPad. 3G. #Icantbelievemydadgotanipad","Not even going to ask. http://twitpic.com/1p8fro","I'm at Landry's Seafood (1312 Celebrity Circle, Myrtle Beach). http://4sq.com/dyvj71","Report from Myrtle Beach: sun, ocean, sand, wife. Life is good. The end.","4 of 5 stars to Life in a Medieval City by Frances Gies http://bit.ly/9DYIFW","I'm at Prestons Seafood Buffet (4530 highway 17, North Myrtle Beach). http://4sq.com/dzSFYo","RT @JanetMegilligan: Such a sweet day celebrating our 15th anniversary!! The night is still young and we are off enjoying no time restr ... -- http://twitter.com/BrianMegilligan/status/14398257813","The car we rented for the week. http://twitpic.com/1pq37s"],"mrsamandasmith":[null,"Celebrating my oldest 12th birthday! Out at Applebee's. http://twitpic.com/1owkwj","Sleepy... don't think I had enough coffee.","@benjaminws...a family that loves you. A wife that wants to see you become an accomplished musician. Children that want to learn from u...","@benjaminws Are u listening to a song or something? this band knows you well! lol","Ladies night!! Bring on the wine!!!!!","Oops! Did I do that? Damn. Slow down on the wine Amanda! Lol http://twitpic.com/1p9kyc","Donuts and coffee = awesome!","@mhebrank Well...until the next morning that is...","Gotta change cat litter asap or we will have to sleep in the back yard! For serious. #catownerfail","Going to rain tonight and tomorrow out at camp site. :(","Good thing I am going to Prom with my husband tonight!! Instead. Sooo excited. http://www.lakewoodchamber.net/special.htm","RT @BitchyMcWhiner: http://myhusbandisannoying.com"],"thepsf":[null,"The PyCon Australia 2010 conference program is now available at http://pycon-au.org/2010/conference/","More PyCon 2010 Conference Grants http://bit.ly/d0UffG","Have You Signed a Python Developer Contributor Agreement Yet? http://bit.ly/9Ei7ZY"],"codeshaman":[null,"Returned home from the house inspection. Not bad, not bad at all.","Surely you heard the *THUD*. Episode 0035 of The Secret Lair is now available for consumption. Topic: What is Art? http://bit.ly/c1yAvn","Re-reading Saberhagen's The First Book of Swords. Magic, man. Pure Magic. #fb","You cannot trust a thin cook.","New work-issued laptop is pretty decent. Windows 7 does not suck as bad as past versions. Still have an Ubuntu VM tho' #fb","Enjoying a nice hefeweizen while I pack up my office. #fb","♺ @cmdln: Interview: Cory Doctorow, \"For the Win\" http://ur1.ca/027e8 #tclp","New Words: Escape Pod: Thargus and Brian http://ur1.ca/02api","EP241: Thargus and Brian by Stephen Gaskell, read by @codeshaman, is up. http://escapepod.org/2010/05/20/ep241-thargus-and-brian/","♺ @thesecretlair: The Secret Lair: Tips from the Lair: Flower Photography http://tinyurl.com/39vnque (by@minitotoro!)","♺ @Nycteris: Added a photo 2 http://glimmerville.com and also a link to http://thesecretlair.com which now has EVIL flower photography tips.","Oh my. A Princess Leia Car Wash: http://is.gd/chtM7"],"nedbat":[null,"The next phase of telecommuting: http://anybots.com/ Fascinating."],"holidayvalley":[null,"sure could use some sun around here... head on over to fb for a great promotion from @myPOV360 (GoPro and Drift follow cams)","Hell of a day to bust out of work early and hit the course... Just sayin... Happy Hump Day!"],"glbc_cleveland":[null,"GLBC beer tasting at The Beer & Wine Cave in Toledo on 5/19 & 5/20 from 6PM-8PM. http://cot.ag/94MerQ","GLBC beer tasting at Blacklick Wine & Spirits in Blacklick, OH on 5/20 from 6PM-8PM. Only $8 per person! http://cot.ag/aK2dx4","RT @zippsbeer: Tonight we will be tasting out @GLBC_Cleveland and @foundersbrewing selections. Along with some goodies from my stash...","5 course beer dinner featuring GLBC at Revolution Pizza & Ale House in Charlotte, NC on Sun. 5-23. http://cot.ag/ccjF6R","GLBC is so EXCITED to be @phillybeerweek this year (6/4-6/13). Check out where we will be that week! http://cot.ag/9pbFfK","GLBC will be at the 3rd annual Cask AleFest in Dayton, OH this weekend! Don't miss out! Get your tickets here!","GLBC will be at the 3rd Annual Cask AleFest THIS Sat. in Dayton, OH. Don't miss out! Ticket info: http://cot.ag/99iAdK","Great Lakes Beer Dinner @WildfireRest in Oakbrook, IL on 6/14. More details here: http://cot.ag/dqCEIr","It's a BEAUTIFUL day in Cleveland. Come have lunch on the patio at GLBC! http://cot.ag/dsnQc9","Get your growlers ready! Moondog is NOW on tap at the GLBC Brewpub! http://cot.ag/a0v7pc","GLBC will be at Extreme Beer Fest on May 28th! Get your tickets here! http://cot.ag/azyau2"],"praxis1138":[null,"@mcrute ...and of course it will be completely gone from the interwebs. Even *I'm* not that naive, and I'm often pretty naive.","@mcrute Yeah, just shake your fist and yell \"get off of my lawn!\"","@mcantor Was that Vogon poetry?","RT @sitepointdotcom: Google Admits to WiFi Snooping http://bit.ly/aaeApj","We're doing some of the cool stuff here too, not just at the LHC http://bit.ly/9wRyii"],"mcrute":[null,"catdoc (for converting MS binary like doc and rtf) to plain text rocks my world.","Hrmm... parenthetical #fail","CentoS might be the only major Linux distribution you can't install from the LiveCD. I always forget that.","It sure would be nifty if people would always send their resume in some variety of plain-text.","@mw44118 all in the URL, put the summary at /gamethingy/123 and the detail at /gamethingy/123/details","Using the 'feh' application to view images from alpine. Nice and light, no gnome dependencies. #awesome","@dstanek the first week is tough after that it gets a lot easier.","@dstanek listening to music helps.","RT @meatballhat: is totally ready to #rocketfist this Java app to da moon.","@meatballhat this is how you have to say \"TO DA MOON!\" http://bit.ly/9NWLsG :-)","@mpirnat @garybernhardt clearly we're going to have to remedy THAT situation :-D","@dstanek docutils is a pile of pain although the rst2* programs are pretty nice.","Oh RPM how you vex me.","Wohoo! Finally solved this RPM problem, guess I should head into the office now.","@garybernhardt why the hate for Numbers?","@benjaminws but you still need more cowbell.","@dstanek hrmm... this? http://bit.ly/9i3v0a No decorators there. I would not have recommended decorators, I really hate them for that stuff","@benjaminws @dstanek decorators are almost always the wrong tool for the job and overused especially when they modify global state...","@benjaminws @dstanek ...I can rant on this if you ask tomorrow :-)","@dstanek @benjaminws and there's the matter of mixing of concerns.","@dstanek oh yeah, ignore that. I thought you would like the straight up routing API.","@dstanek also their affinity for thread locals is seriously annoying.","@dstanek I can't quite conceptualize that but your idea intrigues me and I would like to subscribe to your newsletter.","@benjaminws @dstanek decorators can be more evil in other contexts as well. Their use should be very carefully considered.","@dstanek the more I think about it that's a really interesting idea. Would have to work out the model->url mapping somehow. #hrmmm","@dstanek I have some hacks around a RESTful URL router that does content-type negotiation too. This smells like a new framework.","@garybernhardt @dstanek none of the existing URL routing packages is really satisfactory. They all suck in different ways.","Looks like #google wants a piece of the #s3 pie. http://bit.ly/bu1a3L","@dstanek I think your RST parser has some bugs. Every talk is the Hadoop talk :-P","@dstanek just read the source. Your use of objects even in a simple script makes me happy!","Wordpress.com approach to continuous deployment is worth a read for anybody making web applications. http://bit.ly/bod6xS","OH: \"It was getting blocked up, so I had to blow it out.\""],"kevbo":[null,"I really just can't win with the cta some days. Le sigh."],"ironfroggy":[null,"If religion is the opiate of the people, then surely spectator sports are the crack cocaine.","I think cats are aliens. Their pee crystalizes. Doesn't that just sound very sci-fi?","I feel so bad for the ACLU, constantly being bashed by constitutionalists for their hard work defending the constitution. WTF","Never let your morals prevent you from doing what is right.","The restaurant did not have my phone. I might have lost it completely.","HAVE ♻ @edcrypt: WANT http://bit.ly/cz1t6H","Coding to the groove of Squirrel Nut Zippers. Yeah, I said groove with a straight face. What of it?","@voidspace So I guessed you missed the memo then? Everyone has switched to Intercal!","♻ @voidspace: \"if everyone is doing best practises then it is the same thing as mediocre\" -- Scott Adams (dilbert)","GOOGLE IO TURN UP YOUR VOLUME. I have to turn my master and speaker volumes to max to barely hear it!","An announcement of opening VP8 open and freely, like no one expected that. #io2010","I am really getting tired of cowards today.","I am no longer in Arlen Specter's district, but I'm glad to see him gone just the same.","@voidspace Try vagrant on top of it some time","Next year will #googleio announce a Bluetooth replacement that doesnt get fucked with lots of devices in one room?","While watching the interviews with the Adobe guy at #googleio Flash crashed my Chrome browser on Youtube. Oops!","Wife accidentally found my phone in the reusable grocery bags. I guess that's a good thing...","@voidspace Chrome still can't close a tab when another window has an open dialog. Good thing it multitasks with all those processes!","@voidspace man file","@voidspace I actually expected there was some more direct way, even something i might have forgotten in stdlib. Don't see anything tho.","OMG ♻ @tarek_ziade: ah! we can play pacman on http://www.google.com.. :)","Anyone who attacks political opponents with the word \"unamerican\" is, imho, unamerican."],"clevelanddotcom":[null,"Laurel School's Alefiyah Lokhandwala, a Plain Dealer Senior Standout, is also a top debater: Teachers marvel at th... http://bit.ly/bPkoHj","Portage County ordered to repay over $700,000 in jobs funds: Nearly half the money was spent on unauthorized adver... http://bit.ly/9NXCav","Child medication recalls: Some answers to your questions: If you've been looking for an allergy medication for you... http://bit.ly/bqCSl4","Lee Fisher will not join President Obama today: Lee Fisher will not be at President Barack Obama's visit to Youngs... http://bit.ly/clNmdu","VIDEO: 2010 Rite Aid Cleveland Marathon http://tmogul.com/tweet/qgxtz","RT @Birmingham_News Geometry teacher uses wrong example to teach angles --- assassination of President Barack Obama","http://bit.ly/9LVXt2","RT @njdotcom Did Bruce Springsteen stay at the MTV Jersey Shore house? There's a conspicuous wink @ 2:23 in the video http://bit.ly/bB1mmX","19 percent of Gulf fishing shut down because of oil spill: Federal officials say they're expanding the area of the... http://bit.ly/dzNeYL","Toyota has paid $16.4 million government fine: The fine is the maximum allowed under law. The government accused t... http://bit.ly/br7K9K","Carry a balance? Banks may be gaming your payments: Landmark reforms this year were intended to stop billing pract... http://bit.ly/acFHhJ","Do you want tix to Insane Clown Posse at Nautica? RT for a chance to win! http://bit.ly/aN9R5k","FirstEnergy shareholders re-elect 11-member board: But the shareholders also expressed discontent with the Akron c... http://bit.ly/9ZkwAe","6 Somali pirates sentenced to death in Yemen for seizing tanker: A Yemeni security court has convicted six Somalis... http://bit.ly/b8pzCe","Jeremiah Wright, president's ex-pastor, says, 'Obama threw me under the bus': \"I am 'radioactive,' \" to the White ... http://bit.ly/aWlFmE","Nissan to recall 48,000 trucks, SUVs for suspension: Nissan Motor Co. is planning to recall 48,700 trucks and SUVs... http://bit.ly/c67S1c","Automobile thefts down in Cleveland region, according to new report.: The Cleveland-area saw a 21 percent decline ... http://bit.ly/c1TAYf","Faisal Shahzad, Times Square bomb suspect, appears in court: Faisal Shahzad, the suspect in a fizzled car bombing ... http://bit.ly/bTh0Oi","Wallzaz turns your digital photos into peel-and-stick wall art: Made of a strong-but-stretchy fabric-and-vinyl ble... http://bit.ly/9KSNWn","Ohio public safety chief says she's ready for her confirmation hearings: Ohio Department of Public Safety director... http://bit.ly/9G0XRD","Cap, gown and no health coverage? Starting now, insurers will stop dropping new graduates: Many major health insur... http://bit.ly/bDCQ16","Pushing Pakistan to attack could trigger terrorist blowback: Analysis: As the U.S. turns up the pressure on Pakist... http://bit.ly/9FZ0PL","Special education students host a special dance at Brush High School: Songs like \"Funkytown\" blared in a Brush Hig... http://bit.ly/d0ftTc","U.S. experts hustle after Cuba asks for help with BP oil spill risks: The sprawling oil spill in the Gulf of Mexic... http://bit.ly/bx4L1A","#rockhall #induction Johnny Cash's tour bus returns to Rock and Roll Hall of Fame and Museum: You can walk through... http://bit.ly/9ewt4R","Towpath Trail planners consider options in crossing through radioactive site in downtown Cleveland: Planners of th... http://bit.ly/8Z912u","Grendell, GOP must conduct Cathy Collins-Taylor's confirmation hearings with dignity: editorial: Republicans on th... http://bit.ly/90aZdK","Nine students wounded in latest knife attack at school in China: Eight children are slightly wounded, but one has ... http://bit.ly/bG4EF0","Rioters set fires throughout Bangkok as government troops crack down on demonstrators: Rioters set fires at the Th... http://bit.ly/bY7amW","Data-collecting sites scare users into paying: Plain Dealing with Sheryl Harris: Spokeo.com is notoriously inaccur... http://bit.ly/bvTMHe","Parma Heights sidelines parade but continues Memorial Day services: Joshua Gunter/Plain Dealer file photoThe Color... http://bit.ly/aM4Rl4","Rocky River shop a creative outlet for jewelry makers: On a recent weekend, Embellish is buzzing with activity. Th... http://bit.ly/doS6qD","Newburgh Heights' future in doubt when RTA closes Harvard District bus garage: When RTA closes its Harvard Distric... http://bit.ly/bQNEZu","A.M. Politics Links: Specter loses in Pennsylvania and all incumbents hear the bell toll, in Kentucky, Rand Paul c... http://bit.ly/bF1DBq","Facebook banned in Pakistan because of Muhammad-images page: The page on the social networking site has generated ... http://bit.ly/dsGbzO","Medina School Board approves bleak financial forecast and eliminates 93 teaching positions: “This is reality,” sai... http://bit.ly/9Rvplp","Hey #Cleveland tweeps, save the date: Thursday, June 3rd. Fun event in the works! Details coming soon.","SCLC doors padlocked as factions fight over leadership: Both sides have asked a judge to resolve the conflict beca... http://bit.ly/dtTJ1g","Mortgage delinquencies, foreclosures break records: The number of homeowners who missed at least one payment on th... http://bit.ly/aw0rEH","Bangkok landmarks burn as troops battle protesters; at least 5 dead: Using live ammunition, troops dispersed thous... http://bit.ly/bCXYkU","Princeton Review stops claim that it can boost SAT scores dramatically: Last year, the National Association for Co... http://bit.ly/a2E23m","VIDEO: President Barack Obama in Youngstown http://tmogul.com/tweet/qrM1d","Ballot box backlash: Anti-incumbent bias, weak political juice and a GOP wakeup call: Tuesday's primary results in... http://bit.ly/bZU6Hb","RT @njdotcom: Jersey City pimp sentenced to 18 years, but at least his hair is perfect http://bit.ly/aqngcG","Wal-Mart still selling Miley Cyrus cadmium jewelry: Jewelry from two entire lines being sold exclusively at Walmar... http://bit.ly/bBT382","Fire breaks out at Renaissance Hotel on Public Square in Cleveland: Firefighters were called this afternoon to the... http://bit.ly/bo8q4m","Hey Clevelanders, mark your calendars! cleveland.com & @tribetalk are hosting a TweetUp: June 3 @ the Corner Alley. More details to come!","Dow, down 66 . . . S&P, down 5 . . . NASDAQ, down 18: Another wave of selling hit stocks after fears grew that Eur... http://bit.ly/9r22zY","Senate fails to end debate on bank regulation bill: Republicans have succeeded in blocking for the time being a fi... http://bit.ly/aYMcUT","Girl's death in Detroit raid: Do reality TV cameras influence police behavior?: Do TV cameras influence police beh... http://bit.ly/b4R0eP","CWRU tour of Cleveland aims to improve 'cultural competancy': Eighty health care researchers took a tour of Clevel... http://bit.ly/aiQp3O","Mark Souder scandal suggests more pious they politick, harder they fall: But Rep. Mark Souder's fall may be harder... http://bit.ly/czOTLJ","BP oil spill's human side: Offshore workers accept risks along with good pay: The oil leak in the Gulf of Mexico h... http://bit.ly/aqd2p3","Ohio's public employee pension system joined national debate when it successfully lobbied to keep Hugo Boss factor... http://bit.ly/cZ8zlx","Here's what to do now to make moving go smoothly: About 42 million Americans move each year, or about one in four ... http://bit.ly/cisPzK","Politics of immigration reform on display in Mexican President Felipe Calderon's visit: It is one of the ironies o... http://bit.ly/cMO5o2","Passengers were in cockpit before Polish president's jetliner crashed: Aviation authorities offered new details of... http://bit.ly/9vntsh","Voters put insiders out, whatever their party: Dealt fresh blows from an angry electorate, Republican and Democrat... http://bit.ly/byLLAO","Cleveland council members wonder about conflict of interest in Sunpu-Opto deal: Several Cleveland City Council mem... http://bit.ly/cHXpP6","Pay up, Portage County Job and Family Services: editorial: Anita Herington, director of the Portage County Departm... http://bit.ly/bazbdv","Solon City Council OKs agreement with Twinsburg to curb economic poaching: SOLON -- City Council has approved a jo... http://bit.ly/99s7P5","Pick these showy perennials for low-maintenance beauty: Today's hot new perennials add easy beauty to area gardens. http://bit.ly/c0i6KK","Senior Standout and singer Willis Koomson balances so much with ease: Currently a senior at St. Ignatius High Scho... http://bit.ly/cUbIF4","Your child's behavior will help dictate proper treatment for a fever: Our bodies use fevers to help fight off infe... http://bit.ly/aODM8T","RT @syracusedotcom: Minivan crashes into entrance of restaurant after rear-ending one car and rolling over another http://bit.ly/dumO51","Illness keeps John Demjanjuk in hospital a 3rd day: The five-judge panel hearing the case against John Demjanjuk t... http://bit.ly/aydTbg","Brunswick student and essay winner claims biggest prize in Governor's Turkey Hunt: When he first heard about Ohio ... http://bit.ly/cpXGZX","Early medical mart and convention center plans preserve lake view: The designers of the medical mart and conventio... http://bit.ly/9MN7eu","Fairview Hospital trying to ease neighbors' expansion fears: CLEVELAND When the buildings of a major employer are ... http://bit.ly/c3sOtD","Bulging pant leg alerts police to shoplifting attempt: South Euclid Police Blotter: A 44-year-old Cleveland man at... http://bit.ly/cHVVB0","YouTube blocked by Pakistan for 'sacrilegious' content: The Pakistan Telecommunications Authority did not point to... http://bit.ly/dlP3he","Richmond Heights residents will now pay for trash pickup: City officials voted last week to transfer trash pick-up... http://bit.ly/9x2FWy","Former East-West Construction executive details payoffs in court testimony: Neal Patel, former executive with East... http://bit.ly/cJmjzq","North Ridgeville's Ohio Sports Park fights for survival: NORTH RIDGEVILLE City Law Director Andy Crites said the p... http://bit.ly/cvw6Al","Senate breaks impasse on financial regulation bill: The bill calls for new ways to watch for risks in the financia... http://bit.ly/dpuWVe","Mark your calendars, cleveland.com and @tribetalk are hosting a TweetUp on June 3! http://bit.ly/cQV8yv","Senate vote ends debate, breaks impasse on financial regulation bill: Before voting on final passage, senators mus... http://bit.ly/cyUpur","RT @lzone: @clevelanddotcom & @tribetalk are hosting a 6/3 tweetup at the Corner Alley. See ya there? http://bit.ly/am4e1G","Ceremony marks Cleveland police officers who have died in the line of duty: City, state and federal officials paid... http://bit.ly/av5Pr0","Oil spill oversight? Offshore drillers around world largely regulate themselves on safety: The U.S. government is ... http://bit.ly/dbccyy","Sophisticated train robberies, truck hijackings a growth industry in Mexico: Highway robbers and railway bandits a... http://bit.ly/bEef0D","Senate passes massive Wall Street regulation bill: Prodded by national anger at Wall Street, the Senate on Thursda... http://bit.ly/bUoa9A","Mexican president's message draws criticism: Mexican President Felipe Calderon's appearance Thursday before a join... http://bit.ly/d6g7oz","Animal activists in Westlake call for task force on pet safety after cop is cleared in dog shooting: WESTLAKE -- A... http://bit.ly/asCIu5","Three American hikers jailed in Iran visited by their mothers: Three Americans jailed in Iran since they allegedly... http://bit.ly/cKGXhT","TSA airport behavior scanners missed 16 linked to terror; GAO questions scientific basis: At least 16 people later... http://bit.ly/9T6SAQ","Now that the Cleveland Water Division is getting extra money, it has to do the job right: editorial: The Cleveland... http://bit.ly/adOlOt","Progressive field renovation plans: Editorial Cartoon: View full size... http://bit.ly/cahxiO","Court case against man accused of killing Kent State student goes to jury: The jury is deliberating in the trial o... http://bit.ly/9Zmtm7","Group upset about dog shooting questions Westlake officials: The leader of the group of about 30 pet lovers says s... http://bit.ly/acyMRq","West Geauga's Karen Kruzer sets her sights on research medicine while balancing love for painting, volunteering: K... http://bit.ly/ctySvT","Portage County can't afford $700,000 payback to state; commissioner vows to fight: Portage commissioners can't aff... http://bit.ly/9SP4D1","Will you be at the cleveland.com & Cleveland Indians tweetup? RSVP here! http://bit.ly/cFkDPo","A.M. News Links: A big cat, a big fire and more: Headlines from Northeast Ohio media sites first thing this morning: http://bit.ly/9AQhCU","Find courage to love yourself for who you are: Fighting Fat bloggers: Whether they're trying to lose 5 pounds or 5... http://bit.ly/crCzoj","Have a little fun at Southpark Mall this Sunday http://bit.ly/aNPNhK","Screening process shows promise in detecting ovarian cancer: Ovarian cancer is so deadly because nearly 80 percent... http://bit.ly/dCdUxP","P.M. Business Links: Does growing veggies upside down work? Drifting satellite could hurt cable TV reception after... http://bit.ly/blJN4o","Police take gun from JetBlue pilot: Massachusetts State Police say they took a gun off a JetBlue pilot at Logan In... http://bit.ly/dkkBaR"],"jonrstahl":[null,"\"Pre\" IT Martini at @leandog boat TODAY, we are co-sponsors, beer, wine & even sunshine ;) Come on by! 5:30-7:30 PM http://bit.ly/csRC82","Really excited that @DocOnDev has joined the @leandog team! It's taken a long time to make it happen, having fun with him already!","RT @leandog: Looking for Java | C# | Ruby | Web Design. Agile passion (entry 2 expert) Travel req. http://bit.ly/94A3Dk"],"joshwalsh":[null,"Thank you jqtouch, for this badness: body > * { display:none; } #css #jquery","I just got the hiccups for the first time ever! Weird, but kinda fun!","Damon and Carlton have severely impacted my ability to be productive today. #LOST","No honey, I didn't call you fat. @geico did. http://twitpic.com/1p5llg","No honey, I didn't call you fat. @geico did. http://twitpic.com/1p5lq4","@garybernhardt I would donate to your modal editor. I can't believe you would build a framework.","Google Fonts is a killer idea, but needs more variety. No serifs? http://code.google.com/webfonts","@nateklaiber @aboeving Things auto syncs if you leave it on your phone in idle, wifi sync hasn't bugged me yet."],"ianbicking":[null,"To have a separate Firefox with Firebug, create a shortcut: firefox -P Dev -no-remote %u Then inst... http://goo.gl/7A0j","@zedshaw strftime is among those things that Python inherits from the OS, warts and weirdnesses and everything. Not the best functions.","Flash will include VP8 support. Huh. This makes Adobe seem so... decent. http://goo.gl/7aQv","Looking at the Chrome web store (https://chrome.google.com/webstore) I'm unimpressed. I guess it mak... http://goo.gl/c8BG","SQL database for App Engine? I was not expecting that. http://goo.gl/pO15","@alex_gaynor @zzzeek I don't know any more than you guys. The timeline is extra vague."],"kentbeck":[null,".@topfunky great news! where's my money?","differentiation moves up the stack: http://bit.ly/bioMEe (via @sogrady) -- how far can it go and leave you with something to charge for?","loving GWT, hating waitin for compiles. a compile button? in a programming environment? what's up with that?","my bad on GWT, you don't need to compile. much happier camper. great thing about twitter--absolutely obvious broadcast ignorance.",".@dharmesh if you don't have good content i guess you can at least have honest ignorance",".@dhh and in the end, how has society benefited? patents aren't for stopping other people making money, they're for rewarding innovation.",".@krysole i can see that patents have become a bludgeon for incumbents. if they aren't serving a social purpose, get rid of them.",".@fcw i should have said \"encourage\" innovation.",".@tlberglund the french patent system emphasizes ideas as property of the inventor, the english/american the social benefits of innovation.",".@Daneel3001 the original idea was that inventors wouldn't invent if their results were immediately copied & they never benefited",".@patrick_mc software patents are a net loss to society at this point. i should blog the sad story of my one patent.","making a mobile version of Poker Workout with GWT. it's great to see ideas come alive on a little screen.","switching back from javascript to java i started making way too many abstractions. dialing back. abstract later.",".@livecut i agree, but it was interesting how the switch back to java influenced me to violate the principle of emerging abstractions.",".@The0retico no, i think it's more like \"known to unknown\"",".@livecut that or i'm just weak minded :-)/2",".@iterex tx for the heads up. i'll be bashed in the face by that rock when i come to it, i'm sure.",".@pablogl developer testing is good in general, but writing the tests first can be a profound change, so i'd prefer to keep the defn.","merging forks back into junit tonight with @dsaff. looking forward to grubbing in code.","committed class rules in junit (like method rules but applied once per class). tx alistair israel","i'm never happier working than when i have a long list of technical tasks and i can convince myself that they are my highest priority.","almost double conversion rate by having the dog on the page looking at the form to fill out http://bit.ly/d1nagf","mindboggling good illustration of a talk with cartoons: http://bit.ly/bykJ36 i'll never look at a powerpoint slide the same again.","i've finally come to accept that while i'm a good businessperson for a programmer, i don't have any great talent for business. now what?","the conversion funnel visualized with real data, the man in black, and the most beautiful princess in the world http://bit.ly/bIDa6I","RT @dsaff: http://google.com. Insert Coin. Really. You must do it. Now. Really."],"rtomayko":[null,"Drinking with @bigfleet. Huge fan.","Field trip to Half Moon Bay http://yfrog.com/gir11nj","Roped into another field trip. Botanical Gardens at GG park with a bunch of first graders. Crazy little scros know how to have a good time.","Great day. Heading to the okkervil river show thanks to @megs3441.","OH \"It's like devil music mixed with really slow devil music.\"","Worst show ever."],"mattcutts":[null,"Congrats to Microsoft on the new Windows Live Hotmail Wave 4: http://goo.gl/u8cm The features look useful/great for users: well-done!","Psst, the Google I/O keynotes will be live-streamed: http://goo.gl/K6sD You can also follow @googleio . Pass it on..","Someone asked a webmaster question about images with \"jpg?\" patterns. I ask for example urls/data here: http://goo.gl/EHHB","RT @googleio: @mattcutts will live wave #io2010 Day 1 keynote http://www.mattcutts.com/blog/","New blog post: Live-blogging (okay live-waving) Day 1 of Google I/O Keynote http://goo.gl/fb/LuxE8","Google is open-sourcing the VP8 codec with a royalty-free license. Read more: http://www.webmproject.org/ #io2010","Reminder: 2-3 Googlers (including me) are liveblogging the Google I/O keynote. Watch video/read more here: http://goo.gl/V2TW","Google just released a Font API + Directory for web developers: http://goo.gl/4oky Maybe now my blog will be less ugly? :)","Google also just announced Buzz APIs. Sounds like you can do practically everything via APIs instead of via the web.","RT @kvox: Little-known perk for women at tech conferences: no line at restrooms. Unlike the guys. #googleio","Verified my Square account today: http://yfrog.com/04g6mj Feel free to send me your credit card # now ;)","If you are at #googleio don't miss the after party at 6 pm where the keynote was!","In case you missed it, Google introduced a program to store/access data in the cloud: http://goo.gl/QYMk","New blog post: Live-buzzing Day 2 of the Google I/O keynote http://goo.gl/fb/HKsOm","Watch the day 2 Google I/O keynote, starting *right now*: http://goo.gl/H6Mb","Vic Gundotra just announced Android version 2.2, code-named Froyo! I'm live-buzzing here: http://goo.gl/IIWW","Froyo (Android 2.2) builds in both tethering and a portable wifi hotspot. I can attest that it kicks butt. :)","Just a reminder, I'm live-buzzing the Google I/O keynote at http://goo.gl/IIWW . A ton of great news so far.","Google just announced Google TV at Google I/O. I'm live-buzzing here: http://goo.gl/IIWW","In case you missed it: Google Latitude announced their API: http://goo.gl/cOaw Lots of cool things it can offer..","\"All other things being equal, I'd prefer not to be stabbed in the face repeatedly.\" (@widdowson after a long day of work) :)","RT @romainguy: Onto Gingerbread now. #android","Wakka wakka wakka! Pacman Google logo today. If Pacman is 30 years old, then that makes me... oh dear. Pretty old."],"ronjeffries":[null,"Microsoft: First, stick to your knitting. Second, if you must work on hotmail, work on the name. It has a bad one.","@unclebobmartin cool, omaha. say hi to my brother if you run into him.","I wonder if we're going to Agile 2010. It has moved ... and I'm not sure if we got the invited talk we were expecting or not.","re: Tea Parties. I'm kind of anti-tax myself, actually. But I don't see the need to be a jerk about it, nor dress up in a funny outfit.","so nice to know that Lindsay Lohan did not show up drunk for her DUI classes. i like to know that people can set a high bar and exceed it","RT @jurgenappelo: Published... The Three Manifestos http://bit.ly/ahfIMN #agile [nice]","RT @larsvonk: The best way to handover work is to leave a broken test for your colleague to fix. [note: that's broken TEST, not broken CODE]"],"timbecht":[null,"Laying next to Norah this a.m., she pulled her pacifier out and put in my mouth, she thought that was hilarious! Such a personality already!","Glad the sun is out again! Long several days of rain are gone for now.","unwind time.","Glad the sun is out again! It was a long several days of rain that are now gone for for a few days.","Don't see one of these very often... http://twitpic.com/1pnhb7","RT @stanendicott: Lets not take ourselves too seriously. There's just not that many people who care what we do. Take the pressure off."],"csitko":[null,"Treadmill delivered and assembled. Now for some lunch and then off to work.","I guess that power outage was my cue to go to the office.","Also I need to get my cable modem on a UPS.","@aschulak apparently there is a Nike+ iPod heart rate monitor coming http://bit.ly/9iVqzE","ran 3.01 mi on 5/18/2010 at 8:22 PM with a pace of 9'16\"/mi http://go.nike.com/07ebmrek","Bit slow after three weeks of laziness, but the the new treadmill is much nicer (and quieter) than the old one.","This rsync seems to be unnecessarily deleting and re-copying 4G of my iTunes library."],"holdenweb":[null,"New Holden Web subsidiary, \"Steve Holden's Mighty Python Empire\" will produce DjangoCon 2010 in Portland, OR. http ://djangocon.us/"],"snowtrails":[null,"http://bit.ly/dwbVcZ"],"pperon":[null,"Probably some of the sweetest Enduro/Adventure bikes I've seen: http://www.990adventure.com/ (WARNING: MAY SPAWN DIVORCE LAWYERS)","Bah. No breakdancers. #FATC #io2010","RT @leifwells: Seriously, somebody point me to a page that links me to all the announcements at today's GoogleIO. I'm exhausted trying t ... -- http://twitter.com/pperon/status/14317777074","I'm still convinced that some of the hardest programming challenges are found in games. That or I've been writing pansy apps lately.","RT @WillDady: Awesome MGMT Kids Cover by Seven Ukulele Band http://youtu.be/NvCFGqEJdSM","There is a scissor thief in my office! Cut it out, scissor thief!! (cue sad trombone)","I love lunch hour meetings that end in 15 minutes.","I need to follow more anti-Flash zealots on Twitter. It's always fun reading kooky tweets.","@mhebrank You would be the exception. And besides, you can just yell something and I'd hear you. :p","@mw44118 Dude, are you in my house?! That's exactly what I'm working on.","Metanet's Collision Detection tutorials are still some of the best around: http://bit.ly/94lt","RT @davenoyes: Nice Google I/O roundup. http://bit.ly/c61osm","Checking out my buddy's halfpipe this weekend so I'm firing up Skate on the PS3 which should... do... nothing. I'm gonna die.","Ninjas Save Man From Mugger! http://bit.ly/b70Sh3 (it would have been hilarious to watch)","RT @photonstorm: New blog post: FlxBitmapFont - A Bitmap Font class for Flixel 2 released http://bit.ly/cLTleb","It's your birthday, @jobemakar?! Happy Birthday!!!","RT @photonstorm: The Google pacman source code http://twurl.nl/5ra81i - all sound effects are done in Flash :)"],"puredanger":[null,"RT @rhauch: Panera Bread Co. store in Clayton, MO, doesn't have prices, but asks customers to donate what they want for the meal. http:/ ... -- http://twitter.com/puredanger/status/14255281777","RT @robilad: First draft of lambda translation strategy for javac: http://cr.openjdk.java.net/~mcimadamore/lambda_trans.pdf","So is Brian Goetz the only guy doing language work at Oracle now? (re virtual extension and lambda expression translation docs)","watched Glee last night; now I have that stupid Safety Dance song in my head today. I find Crazy Train is always a useful earworm antidote","Did some debugging on the way through Florida this week. http://twitpic.com/1p4rfu","RT @mfollett: Come see me talk about internal DSLs in #Perl at the STL-PM meeting tonight! Free pizza! http://stlouis.pm.org/2010/05/in ... -- http://twitter.com/puredanger/status/14300151314","let's all tweet about how tweets aren't working today and see if that helps","Reading the Clojure 1.2 datatypes page for the 5th time.... http://is.gd/cgmN6 Brain slowly absorbing.","It's possible that Wave might actually be useful in a work setting","Maybe I'll give Wave another shot in context of Strange Loop too","RT @strangeloop_stl: Happy to announce GitHub will be a sponsor for Strange Loop 2010!","so in Clojure, is the only reason to use deftype over defrecord to get those yucky mutable fields? ;)","RT @JavaSTL: RT @SPOTonChicago: Great video on what motivates us: Dan Pink - Drive http://ow.ly/1Nf6A","diving hard into Clojure records for the problem at hand. so far, nice improvement over former version.","RT @sharrissf: Ehcache 2.1 is GA, JTA/hibernate, new disk store, coherent methods putIfAbsent/replace..., fixes, non-stop cache, unlocke ... -- http://twitter.com/puredanger/status/14327606729","they renamed our JavaOne talk from \"Cool Hand Duke\" to \"Scala and Clojure Java VM Languages\". OMG FAIL","but hey, at least they accepted it :)","Pulling a Shrek, hanging out in the swamp. Just saw a big ol gator","Cool, watching a couple of pileated woodpeckers hammer away at a tree","Hello red-shouldered hawk, hello yellow-bellied sapsuckers","The CouchDB rap: http://is.gd/chVxt","Wish I could make it to NFJS St. Louis this weekend...but Florida is nice too ;)"],"markramm":[null,"reading the list of cognitive biases on wikipedia: http://en.wikipedia.org/wiki/List_of_cognitive_biases"],"davenoyes":[null,"Nice Google I/O roundup. http://bit.ly/c61osm"],"aschulak":[null,"This is good. RT @iamfender: High Scalability - 7 Lessons Learned While Building Reddit to 270 Million Page Views a Month http://j.mp/c7nQS2","@Docwes Got my BS up to level 12 last night using one of the 100% XP pots","@Docwes What class is Drager? I'll be on tonight after I catch up on House and Castle, assuming I don't pass out.","Time for Castle and House. Yes, I am one day behind all of you. No spoilers!","Shame on you xbox for forcing me into the hands of pirates to watch House!","Looks like Xbox video marketplace dropped the ball on last night's Lost as well. #arrrrrrrrrrrrrrrrrrrrr","This is good. | RT @allspaw: Anyone building 'open' sites should read this many times: http://bit.ly/aX9d9G #API #Flickr","Must... resist... | RT @Reddstone: 5PM we are open for 10cent tacos. Patio is open. Bring a friend! Bring your dog! Bring your appetite!","@feliciaday You better HOPE that it was technology that warmed up that seat. :)","I caved. Enjoying the patio and ten cent taco night at @Reddstone"],"dmarsh":[null,"RT @chrismarinos: learning about Bistro at @c4fsharp- join the meeting and check it out!","Watching Scott Davis' interview with @venkat_s with my 6 yo. She's home sick. She's a tiny bit interested. Good enough. http://bit.ly/de0hPJ","RT @smartyskirt: the key to change is to let go of fear - fav quote of the day","Our goldfish is nearly a year old. How long do these things live? (It was a \"gift\", ugh).","The elliptical awaits. Checking for a new #javaposse first ...","New Enterprise Forum Battle of Elevator pitches sounds entertaining. Thursday at Holiday Inn North, Ann Arbor. http://bit.ly/bisIO2","RT @ditesh: TechCrunch skoop: Google To Launch Amazon S3 Competitor ‘Google Storage’ At I/O http://ow.ly/1MSKn #io2010","RT @DavidGiard: Get your F# on at #MIGANG tonight in Southfield. @ChrisMarinos presents \"F# and Functional Programming for C# Developers\"","still hate the name, :-) go anyhow RT @BrianGenisio: Reminder: today is Ann Arbor Nerd Lunch. Mongo at noon. See you there? #aanerdlunch","(iTunes tip-parents!) RT @invalidname: http://specialchildren.about.com/b/2008/04/25/setting-up-an-itunes-account-without-a-credit-card.htm","Great news from Adaptive Materials! RT @fuelcellceo: Excited by our latest contract: Fuel cells for the Navy! http://bit.ly/amNAdI","RT @dickwall: Google TV - what Apple TV should have been. For one thing, it actually runs useful apps. What a wasted opportunity...","Did you play #paintwars at #codemash? #SRT is bringing it back at A2 HOM Tech Event on Saturday. http://www.aahom.org/tech_event/","RT @catherinedevlin: With TurboGears, forget the notion that a release is \"reliable\" but the trunk is \"edgy\". It's the other way around.","Nice job on the Lucy Ann lance show, @billwagner and @chrismarinos!"],"developingchris":[null,"r @agstemen @mikewo do what you want, as long as you can turn it off for those not scared of the QWERTY monster","r @sempf @mikewo Think about how resharper/coderush name your plugin would work with a ribbon, word doesn't really have that constraint",". @mikewo @sempf the constraint is that your average office user doesn't have 3 extras, your average dev has at least a few plugins","dear powershell, I like what you guys did, make it tabbed for the love of all that is good, really don't want to install alt shell 1st thing","lucid lynx is finally tamed on my lappy, off to open source program it up, gonna be ready for some sprints over coffee very soon",". @derickbailey can you elaborate on your current plugin/vimrc setup for vim, I really like that project drawe r and can't seem to find it","time to make the donuts, and drink plenty of coffee"],"catherinedevlin":[null,"Reading Japanese would be practically easy if they would just put spaces between their words. Of all the Western customs to reject...","With TurboGears, forget the notion that installing a release is \"reliable\" but the trunk is \"edgy\". It's the other way around.","Space for #pyohio is reserved at OSU! *whew#","@mw44118 @dstanek says we're OK but we'll consider late talk submissions. If they're awesome. :)","I probably shouldn't have admitted that #pyohio space wasn't reserved 'till now :) but that's how universities work... slowly..."],"annoyatron":[null,"RT @Grubblaren: Total bajsnödighet råder, tyst det är i huset tyst i huset. Brooklyn Lager höga midjor fitthår, höga fitthår.","Checking out the new AndTweet that has been updated by my Russian and German peons. Looks pretty darn good so far!"],"sadukie":[null,"Thanks to all who came out to hear what's new in Silverlight 4 last night. Great conversations at Mavis Winkle's afterwards!","Excited to hear that my much younger buddy \"little Sarah\" just graduated with her masters in Systems Analysis and Engineering :) So proud!","I know this is a stretch... but are there any .NET \"can't miss\" local events that happen in Wyoming? #lazytwitter","If not in Wyoming, any .NET \"can't miss\" local events near Denver? (Asking for a friend out there...) #lazytwitter","Really enjoying working on a project that feels out of my league. Reminds me that I have plenty of room to grow!","Goals for tonight... queue up a couple blog posts that came to me on my ride home, then working on @tdpe. Gonna be awesome this year!","Was about to download jquery for this app... then I remembered the awesome fact that it's included in vs2010. So excited about that!"],"mpmselenic":[null,"Come see me talk about crazy projects at the Hack Factory Cabaret this Thursday: http://bit.ly/9lhEW2","Fun fact: a cubic meter of tofu contains approximately 1M calories, weighs about one ton, and tastes good with soy sauce.","Reminder: the first Hack Factory Cabaret is tonight at 7 and is free! http://bit.ly/9lhEW2 #tcmaker"],"benjaminws":[null,"@mcrute YOU GOT SOFTWARED","@annoyatron @mcrute I dunno, I was just messin round on the dub dub dub and *pow*, there was Steam everywhere. I came for the porn.","@garybernhardt @mcrute Meh, I prefer apple butter.","RT @crucially: If you benchmark hard drives using only sequential read and write you are a moron.","Angry.","Dammit! http://is.gd/ceD1o","Happy birthday to my oldest Daniel! He's 12 today. Proxy birthday wishes through @mrsamandasmith :)","RT @dysolution: Don't worry. There are plenty of fish in the sea. Plenty of dead, oil-saturated fish. You'll die alone.","I don't want to hack mod_rpaf to allow for subnets. Alternatively, I do not want to hack our build system to generate lists of IPs for it.","The concept of Ubuntu One is noble. Not sure how I like the implementation yet, however. Not an empathy fan.","RT @trolololololo: LOLOLOLOLO LOLOLO LOLOLO","Really digging on some Isis http://en.wikipedia.org/wiki/Isis_(band) right now.","@bikegriffith Well said.","Fo tweny","WTFBBQ RT @mhebrank: World. You make me cry: http://myturl.com/0pB8n","I never thought I'd say this but I am thankful for the Apache APR.","@aschulak still not watched castle. Keep your mouth shut.","Fuck. You. Aventail.","@dstanek trying to motivate me to fix it for you?? It's working ;-)","@dstanek Fixed it.","@iamamish @dstanek http://pastebin.org/251633","@bikegriffith It works with the Java client via startctui, command line, not so much. Hadn't tried the browser.","RT @mcrute: Oh RPM how you vex me.","Looking for musical inspiration. Help me folks, give me good music to listen to.","I may be late to the game here, but Isis is flippin awesome. You should give them a listen.","Beautiful. Day.","0ccVC000000vv00000000vbnBVB BbbVVbhvVvnbNvhhhnNBBjbhnNNbbbNNmMmmMMmmMMnkkjnMkkjkMkkmmMnNnMkmMkkmMkkkMmknb","My beat is correct.","I am wrong a lot.","I make lots of mistakes.","I make bad ass biscuits and gravy.","Your mom loves me.","I am foul.","I am rude.","I am selfish.","Most importantly....","Woah, did I tweet that out loud??","Damn, my tweet is showing.","@dstanek I like decorators for routing. Any particular reason you hate on it?","@mcrute @dstanek all I hear is \"hate\". Explain.","@mcrute @dstanek oic, the global state and coupling to view/controller makes sense. Unintentional side effects ftl.","@mcrute @dstanek I much prefer a happy little dispatch table of routes.","@mcrute @dstanek I have yet to have a practical application for them. I honestly just thought the syntax was neat, new toy syndrome ;)","\"You tryin' to f*ck me, dude? This was cut with Boston Market gravy!\" - Cartman I've not watched enough Southpark lately.","@dstanek","@dstanek man, programmers are lazy. Twitter should have fixed that for me.","@jessenoller I too am in Tab Debt. I considered writing an extension to keep me in check.","@mcrute Super Colon Blow, FTW","RT @nickbarendt: I'm teaching a TDD in Python class with @garybernhardt in June. Please register if you want to come! http://bit.ly/cZ8COQ","@jessenoller Dude, come and look at both of our buildings.","@jessenoller Also, it should be noted that we are not Detroit.","We try.. RT @club_is_open: @jessenoller I'll concede that @benjaminws and @mcrute are changing my opinion of CLE ... slightly.","@garybernhardt are you serious????","Ugh","@catherinedevlin YESSS #pyohio","RT @catherinedevlin: Space for #pyohio is reserved at OSU! *whew","FYI: http://www.facebook.com/GuitarEdge/posts/119137414793273#!/group.php?gid=117727534929487","RT @durin42: Today's the 30th birthday of both Empire Strikes Back and PAC-MAN. Lazyweb: where's the mashup game?","@mrsamandasmith @mhebrank Right, which is why I start drinking again.. #ironliver"],"mcantor":[null,"What's the fastest Android phone out there WITH a slide-out keyboard? Is there a better one coming soon? My G1's age is showing! #fb","O frabjous day; callooh, callay! Amazon Kindle is coming to Android! #fb","Jon Stewart was surprisingly gentle with Ron Paul in his interview; he doesn't usually cut Republicans a lot of slack. #fb","My God. Zappos pays for 3-day return shipping, gives 100% store credit AND free 1-day shipping on returns. You guys are beasts."],"msnyder":[null,"@DocOnDev Good luck with that. I never got them all to coexist and play nice","Finished my morning deploy #ILoveGit","Back to setting this Rails app straight by wrapping it up in cukes/specs so the surgery can begin.","RT @unclebobmartin: Refactoring should never appear as a task on a schedule. Keeping code clean is just something that you do all the time.","Giving remarkable a try, so far so good. Enjoying the simplicity of the ActiveRecord matchers","Tired of fighting the mysql gem on Snow Leopard. Installing PostGreSQL","BEST GOOGLE LOGO EVER!!!! http://www.google.com/ #WakaWakaWaka","@coreyhaines Because sphinx apparently has a requirement for either mysql or postgresql. Trust me, I prefer sqlite for dev","@coreyhaines very much so. this scenario is definitely justification for CI. it's obvious these specs havent been run inawhile"],"mpirnat":[null,"@mcrute Apparently she doesn't have permission to change hosting providers for this site. (I know, totally lame...)","@mcrute yeah, I don't want my computers making any noise that I don't ask them to.","RT @Aquamindy: To the person sending @mpirnat messages on MS Messenger, you actually contacted me and the kid watching Angelina Ballerina.","RT @nprnews: Study Finds Dads Suffer Postpartum Depression, Too http://n.pr/a4iJzq","In my mind, this is what manually testing some of our mass-emailing cron jobs sounds like: http://www.youtube.com/watch?v=AEu9LLQpOF8","RT @csitko: @aschulak apparently there is a Nike+ iPod heart rate monitor coming http://bit.ly/9iVqzE","@bikegriffith I do not think you're linking to what you think you're linking to.","OH: \"I'm a BALLERINA MONSTER!! Rawwrrr!!!\"",".@garybernhardt sorry, was my 2.5 yo daughter. I wish I had new dirt on @mcrute, but there's nothing big since the Shortcake incident.","@aschulak I keep yelling at the TV, \"Look out, Beckett, he's a Cylon!\" but she doesn't listen! Sigh.","@nedbat I've actually had pipe dreams about building something exactly like the AnyBot... Dang.","RT @nprnews: White Castle Calls Health Law A Profit Bomb http://n.pr/9KP98z | And most people call White Castle a colon bomb.","Kiddo, Mom, and I just had our first geocaching experience. Whee!","@jessenoller Yes, his class is in CLE... On a boat! Next to a submarine!","Want to go to the US vs Germany soccer match on Saturday, but weather forecast looks iffy. :-/","The other problem with US vs Germany soccer is that I like both teams...","@mhebrank Something like that, yes. Hoping for only \"there's a *chance* it might storm\" but that's not consistent with my usual luck.","Rocking Keynote like a... Rock star. A very tired one. Playing to a packed house tomorrow, hope folks dig it.","Presentation went well; am trying not to think of the dollar cost of addressing all dev, web production, QA, and some Ops for an hour."],"chris_weisel":[null,"My bluetooth headphones (2 different sets) are some of my best purchases from the past year. Both also do hands free calling with my phone."],"joefiorini":[null,"Any Cleveland Rails devs looking for a side project?","Seeing some cool companies at #neosabot - Northeast Ohio's Best of Tech Awards!","Within3 up for Best Social Networking app at #neosabot! http://twitpic.com/1p90cl","RT @johnheaney: Love the concept but not lovin the execution at #neosabot. Uninspired presenters, no suspense, no dazzle or delight. Out ... -- http://twitter.com/joefiorini/status/14325089792","Congrats @smallbiztrends on the #neosabot win!","Shocked my body into realizing that it's been way too long since I last worked out. #ouch"],"calvinhp":[null,"RT @robzonenet: theming #plone is one of the biggest wall in getting started with plone. Here is a chance to learn in 2 days http://bit ... -- http://twitter.com/calvinhp/status/14236441923","RT @cdw9: I will be leading a training at #pse2010 next week on how to theme a #plone site. Sign up today! http://www.sixfeetup.com/pse2010","b2e speaker was outstanding tonight #rainmakers","RT @robzonenet: theming #plone is one of the biggest wall in getting started with plone. Learn in 2 days http://bit.ly/dAjQW3"],"javausers":[null,"#WSJ If you're concerned about your business name, it's smart to verify you've got the trademark--or that you're not... http://ht.ly/1MyjI","RT @sluk: This Sarcasm-Detecting Algorithm Is a Really Good Idea [Algorithms]: For on... http://bit.ly/d6wHLE","RT @GaryBaney: What are your strengths at sensing, understanding and effectively applying the power of emotions? - http://bit.ly/bdkShv","The Olmsted Falls Artificial Intelligence MeetUp thinks Duke will get smarter if he attends their MeetUp?!?! #ai","T3CHn!c #technic ~ Email: kcrabtree@medcitynews.com twitter: @KaseyCrabtree www.medcitynews.com www.medcitycust... http://ht.ly/17rsgK","http://ht.ly/1O9js T3CHn!c is a collaborative event for those interested in all things IT #HappyinCLE #technic","RT @BoundlessFlight T3CHn!c #technic ~>Duke can learn about #healthcare industry news at www.medcitynews.com- http://bit.ly/bc2f4M","RT @PMOsupportbabe: T3CHn!c #technic ~ #IT thrives in a collaborative environment www.medcitynews.com http://ht.ly/17rsgN"],"garybernhardt":[null,"@mcrute Have you tried almond butter? It's awesome with honey on toast. Peanut butter is old & busted, man!","@mw44118 Those are two resources with different URLs.","For the morning folks, RT self: Blogged: \"The Tar Pipe\" (a story about how Unix works) http://bit.ly/aMerxo","Of the 30,000 hits that yesterday's blog post received, less than 3% were from IE.","@meatballhat Which new frameworks?","@mw44118 I found @mcrute's suggestion perfectly acceptable. Although that's not a RESTfulness question; it's a URL design question. :)","Diff your list of installed Python packages against a known set on disk: diff <(pip freeze) requirements.txt","I need to come up with a cute example of <(foo) to write a blog post around...","\"pip freeze\": definitely not quite there yet.","According to FeedBurner, my blog readership was halved on its biggest traffic day in history. Softwared. :(","I just logged into the (brand new) CI server and saw eight green builds in a row. That's a big improvement. I am proud.","Mock is making me miss Dingus' powerful interaction querying. I'm such a nepotist!","Python's subprocess module is much better than anything I've ever encountered in the Ruby world. It's SO good!","@mpirnat You gotta specify who the OH is from, man! I'm guessing @mcrute.","Apparently, Mac Ports disallows the simultaneous installation of both setuptools and pip. Which is insane.","$ pip uninstall pip Uninstalling pip: ... Successfully uninstalled pip Freaky, man.","It seems like all MacPorts Python packages install their scripts into a directory that's not on the path. That's insane. Save me, @MacPorts!","@jessenoller I always seem to get forced into Git and Ruby now because everything good uses them...","There's a mosquito painted onto my bathroom wall. Some day, he will be used to clone an army of Gary Bernhardts.","@coreyhaines I don't understand. :(","When I hear \"$project is moving to $dvcs!\", I become confused. People are still using Subversion?","All claims that Lex is not the greatest piece of music ever created will be met with the maximum allowable punishment.","@coreyhaines Right, but a language with no namespaces, no packages, no method_missing, curly braces, and semicolons? Over Ruby? Why?","@coreyhaines Ha... I'm not moving back to a city with snow, man. No way! I'd visit for a few months during nice weather, though. ;)","For only $550 more than I pay now, I can get a monthly suite down the street and be 100% mobile (summers in Chicago?) @coreyhaines approves.","What's the site where people pledge money for someone else to complete a project?","If I proposed a modern modal editor, a terminal+shell, or a SOLID/testable Python web framework, which would you donate to on kickstarter?","I'll have to write a blog post (or three) about the editor, terminal+shell, and web framework. I can't go into sufficient detail here. :)","@joshwalsh Well, it's really hard to write tests for apps in the current ones, and I need to write apps, and I demand tests... :(","Idea: for every test in the system, plot max. call depth vs. coverage level. Shows you lurking huge integration tests.","When I think about how amazingly quickly Bash and zsh allow me to hack stuff together, the idea of writing a shell seems so arrogant...","The mixture of \".\" and \":\" used to specify Nose test paths, and the inconsistency between the two, costed a couple hours of my life today.","In the last two hours, I churned out 200 lines of totally untested Python to compute statistics about per-test coverage. I feel +0.","Early graph of tests' runtime vs. coverage (small sample so far). Not very useful yet. http://yfrog.com/jq7cap","In related news, Numbers is bad software.","@dstanek Sounds like you want Django's URL mechanism.","@dgou You can afford it, man! Typing isn't the bottleneck! :)","@dgou Oh, I never really put it in my vimrc. :) I should, though...","I'm teaching a TDD in Python class with @nickbarendt in June. Please register if you want to come! http://bit.ly/cZ8COQ","@dstanek Nope – it's intended for people who aren't super experienced in testing and design. They should know some Python, though.","A test reliably failed for me. Got frustrated; did other stuff. Then the test passed. Procrastination fixes tests. QED.","Branch A diverged from an old rev of master; branch B diverged from a new rev. \"git checkout B && git rebase -i A\" just blew my entire mind.","That's the first time I ever did \"git rebase -i\" to a branch that diverged from a mutual parent. I always treated \"rebase -i\" like histedit.","Analytics date selection works 25% of the time, Google Maps dragging doesn't work, Google Chat couldn't connect... what's going on today?","If your test suite is slow, you can tell when it's done by saying \"nosetests -x && say 'tests done. make them faster'\"","Put \"export PYTHONDONTWRITEBYTECODE=1\" in your shell config and Python will never generate those nasty .pyc files again!","@jonathanpenn Wow, really? Why switch away from OmniFocus? Is @joshwalsh all scoffy about it? ;)","@jonathanpenn I've never used it. I've been on Things since switching away from The Hit List about a year ago.","@jonathanpenn I don't use tags at all. Projects are normal stuff; areas are only used as \"someday\" lists like for blog posts. That's it. :)","@mpirnat What was it about?"],"zedshaw":[null,"http://nerds-central.blogspot.com/2010/05/knife-is-out-for-ruby.html My reply would be: \"Java is a dynamic language. Discuss.\"","How to know if your inverse troll worked: They write more than you and worse than you.","Well well well, I was just about to implement this tonight for NoNoSQL: http://tinyurl.com/2frcpmy","http://www.facebook.com/group.php?gid=117727534929487 \"I Refuse to Admit Dio Died of Cancer, I Believe a Dragon Ate Him.\" (via @mhalligan)","Safety Dance! http://www.youtube.com/watch?v=Xfhpp-4I60E","The NoNoSQL python API so far: http://dpaste.de/iN2R/ almost complete, just gonna add some notification events off 0mq.","Added a publish only socket to NoNoSQL that can do 1 million req/sec. http://dpaste.de/a1J6/ Yes, one million.","I'm bad at math: The publish socket does 100k req/sec http://dpaste.de/UCWn/ NOT one million. DAMN!","Fucking hilarious analysis of Star Trek: Insurrection http://www.redlettermedia.com/","Up early to play a litle guitar.","@benjaminws Nice.","Ok, so wtf Python, you can't strftime a date with year < 1900, BUT YOU PRINT THE FUCKING MESSAGE WITH THE DATE IN THE EXCEPTION?","Dear Python, this is completely retarded: http://dpaste.de/Jn5m/ How can strftime not put a number in a string?","What's *amazing* is someone actually took the time to craft that exception and the error, which is more code than just accepting the year.","I love how the reasoning is \"to conform with strftime\". THROW OFF YOUR C SHACKLES PYTHON. FREEDOM IS NEAR!","Well, with python's limitation on dates < 1900 I guess I can throw out my plans for an online library of victorian novels.","Python's limitation on dates < 1900 also means, well, so much for my \"Collected Works of J.S. Bach\" web site. Sigh.","Maybe there's a steam punk version of Python's strftime that only works on dates < 1900. It must use a difference engine.","I really hope Flash dies this year. Then maybe Hulu can use a real platform to play video at full speed.","Alright, if you try to tell me that \"Kademlia+UDP\" is somehow magically fast and reliable I must laugh in your face: http://telehash.org/","No I remember why I hate windows: You tell it to remove software, and the *software* can say you can't. Abuser: TrendMicro AV."],"mikemonkiewicz":[null,"Eldest son was dancing around the room this morning, singing They Might Be Giants. My work here is done.","\"April new housing starts are up.\" Why are we still building new houses? Don't we have enough empty urban blight?","Ninjas save the day. http://bit.ly/9qPczJ","The Empire Strikes Back is 30 years old today? http://bit.ly/cnRSdV #ifeelold and now I want to watch it again.","And more 30th birthday stuff - you can play Pacman on Google's logo today. Srsly. http://google.com"],"nickbarendt":[null,"I'm teaching a TDD in Python class with @garybernhardt in June. Please register if you want to come! http://bit.ly/cZ8COQ","Pairing on ENIAC! Jean Bartik tells how you should program: http://vurl.me/RQP :) (via @coreyhaines)","@LeanDog looking for Java | C# | Ruby | Web Design. Agile passion (entry 2 expert) Travel req. http://bit.ly/94A3Dk (via @leandog)"],"jessenoller":[null,"@garybernhardt lol macports lol","If you are, or have thought of, running a Python sprint near you, I'd like to talk to you.","@alex_gaynor I'll email you tonight. I have funding for you.","@alex_gaynor Ah, so Brian publicized it?","This is the reason I asked about Python Sprints - behold http://bit.ly/blhw53","@garybernhardt Trust me, you'll break it, hate it, etc. But it uses git a lot.","@alex_gaynor Read the notes at the bottom. Initially, they were not meant to; however, I can be convinced - better taken offline.","I'll do a longer blog post/discussion when I'm not feeling grouchy.","I want access to Google Storage for developers right now. Like, yesterday ok.","Oh my. 5 browser windows and at least 100 tabs open total - I'm about to declare browser bankruptcy.","@club_is_open REMEMBER THAT THING WITH THAT GOAT TAKE THAT","@club_is_open what holiday","@benjaminws Yeah, but his class is in cleveland: http://www.youtube.com/watch?v=ysmLA5TqbIY","@benjaminws see also: http://www.youtube.com/watch?v=oZzgAjjuqZM","I'm ass deep in alligators.","Djangocon is expensive, yo","Blog: \"Announcing - Python Sprint Sponsorship\" - http://jessenoller.com/2010/05/20/announcing-python-sprint-sponsorship/","@alex_gaynor That's not a real quote, right?","This idea seems to have no traction. Solomon grundy is displeased."],"tarek_ziade":[null,"Lost of great talks at google io http://bit.ly/5N5iHO #io2010","The man with the USB Hands - http://bit.ly/VoIrz - That's what I want for xmas","RT @voidspace: Shared: EuroPython: Speakers and Talk Abstracts Announced! - http://bit.ly/cuj2nV","OpenPlans drops Coactivate (that was expected) and Ethan takes over -- http://bit.ly/atsqGI -- thx Ethan","ah! we can play pacman on http://www.google.com.. :)"],"nasa":[null,"Mt. St. Helens exploded 30 yrs ago today. See the devastation & recovery from annual NASA satellite images. http://go.usa.gov/3lM","The Gulf of Mexico oil spill stretches to the southeast in yesterday's image from NASA's Terra satellite. http://go.usa.gov/3lt","Successful Spacewalk Tops Flight Day 4 http://youtu.be/o6M7hGidWE8","The crew has been given a \"go\" for docking of the Rassvet module to the space station's Zarya module. #STS132","Rassvet, the \"dawn,\" is docking at sunrise. The crew will wait until orbital sunrise to complete the docking procedure.","While orbiting 220 miles above Argentina, Rassvet arrived at its permanent home on the Russian segment of the space station at 8:20aET","[Image of the Day] Atlantis: This view of Atlantis' aft section includes the main engines, part of the cargo bay, ... http://bit.ly/c3Ux71","[News] NASA's Shuttle Atlantis Bringing a New \"Dawn\" for Space Station Science: NASA's space shuttle Atlantis is d... http://bit.ly/cMbNFx","Explore the history of the spacesuit through this interactive feature http://bit.ly/a3c8sB","http://www.nasaimages.org is honored as an outstanding reference site http://bit.ly/9HgaTi Check it out!","Mission Control has moved Atlantis' crew schedule 30 min earlier beginning with spacewalk \"campout\" now at 4:45pET","Spacewalkers Bowen & Good will sleep in the station’s Quest Airlock at reduced air pressure to prevent the “bends” when they exit.","What's it like at a shuttle launch? Listen to Dave @Late_Show http://cot.ag/9EiOHc or ask a #NASATweetup attendee http://cot.ag/8XbHN6","On NASA TV now: Atlantis crew interviews with Fox News and CNN http://www.nasa.gov/ntv","On NASA TV now: Atlantis and ISS crew interviews with Fox News and CNN http://www.nasa.gov/ntv","Today's #STS132 mission status briefing is scheduled to begin at 3:30pET on NASA TV and http://www.nasa.gov/ntv","Excited after a talk today with @WorldSciFest about next #NASATweetup…stay tuned for news in the next couple days!","Atlantis' crew woke to “Start Me Up” by the Rolling Stones, played for Mission Specialist Piers Sellers.","Today is 2nd spacewalk of mission, set for 7:15aET/11:15GMT. Updated NASA TV schedule available at: http://www.nasa.gov/shuttletv","Astronauts Steve Bowen & Michael Good have begun today's spacewalk. Watch on NASA TV and http://www.nasa.gov/ntv #STS132","Bowen's spacesuit has a solid red stripe; his helmet cam is #20. Good's suit has red & white barber pole stripes; his helmet cam is #19.","Bowen's 1st spacewalking task is to try to free a snagged cable at the camera on the end of the Orbiter Boom Sensor System.","Spacewalker Bowen freed the snagged cable at the camera on the Orbiter Boom Sensor System. Tests show overall full range of motion.","Bowen & Good next will replace 3 of 6 batteries on half of one of the station's solar arrays. Watch at http://www.nasa.gov/ntv","Astros Bowen & Good installed the 1st battery - A - on 1 of the station's 4 solar arrays. They will install 3 of 6 new batteries today.","Each battery weighs 375 lbs & has 8 kilowatt-hours of energy, enough to run a 100 watt bulb or LCD television for 80 hours.","Space station has 24 of these batteries, a total of 192 kilowatt-hours of energy - enough to run the avg US home for about 6 days.","Batteries are recharged during sunlit phase of each 90-min orbit & provide the station power during the shadow phase (up to 36 min).","At 10 amET/14:00 GMT, watch #NASATweetup at @NASA_Johnson online at http://www.ustream.tv/NASA2Explore","Spacewalkers Bowen & Good installed a 2nd battery - B - on 1 of the station's 4 solar arrays. They're moving on to the 3rd battery.","[News] NASA'S Digital Learning Network Teachers Earn Prestigious Award: The United States Distance Learning Associ... http://bit.ly/ag4FoJ","At 11:52aET, astronauts Bowen & Good installed a 4th battery on the space station's left side. 2 more batteries will be installed Friday.","Bowen & Good will continue the spacewalk. They'll try to tighten the bolts connecting the space-to-ground antenna dish to the boom.","The antenna dish & boom were installed on the central part of space station during Monday's spacewalk but have a 1mm gap.","It's not too late to tune in to today's spacewalk with astronauts Bowen & Good on NASA TV and http://www.nasa.gov/ntv","RT @nasatweetup: RT @GodspeedDiscvry: Wow... #nasatweetup is number two trending in Houston!","Astronauts Bowen & Good completed a 7hr, 9min spacewalk at 1:47pET. They successfully tightened bolts of the space-to-ground antenna & boom.","It was 2nd of 3 STS-132 spacewalks, 238th by U.S. astronauts, 5th for Bowen & 3rd for Good. 145th for station assembly & maintenance.","Today's mission status briefing is scheduled for 4pET/20:00 GMT and will air on NASA TV http://www.nasa.gov/ntv #sts132","[Image of the Day] Poised for Success: Anchored to the Canadarm2 mobile foot restraint, Garrett Reisman performed ... http://bit.ly/bvima7","\"Where Science Never Sleeps\" The Mars rovers ain't ready to call it quits. Check it: http://www.nasa.gov/rovers","Atlantis' crew woke to “Welcome to the Working Week” by Elvis Costello, for Mission Specialist Steve Bowen, yesterday's lead spacewalker.","At 6:52 amET/10:52 GMT, the hatch of the Mini Research Module-1, named Rassvet, was opened to put in an air filter http://go.usa.gov/3l6","The 11,000-lb module was attached to the space station Tuesday. It provides storage space & a new docking port for Russian spacecraft.","[Image of the Day] Docked at the Station: This image features the space shuttle Atlantis cabin and forward cargo b... http://bit.ly/d2fxTW","On NASA TV shortly: news interviews with Atlantis and space station astronauts in space. Watch at http://www.nasa.gov/ntv","[News] NASA Kicks Off Virtual Education Program For College Students: NASA will provide college students from acro... http://bit.ly/90Rt4M","[News] NASA Announces Live Web Streaming Of Space Exploration Workshop And Telephone Media Briefing: NASA Announce... http://bit.ly/cYelwG","New study shows Earth's upper ocean has warmed since 1993. Another indicator of a changing climate. http://go.usa.gov/3xq","Oil spill near the Mississippi Delta on Tuesday, captured by NASA's Aqua satellite. http://go.usa.gov/3xl","NASA-funded scientist gets close-up view of oil slick in the Gulf to help satellites better monitor spills. http://go.usa.gov/3xg","Hubble finds a star eatting a planet! Read about it and see the great picture here! http://cot.ag/9v7Ug0","The Webb telescope's Integrated Science Instrument Module Structure is undergoing tests at NASA Goddard! http://cot.ag/b1bq8j","NASA & @WorldSciFest host next #NASATweetup June 5 in NYC! Registration opens 10aET May 22 http://www.nasa.gov/tweetup","NASA & @WorldSciFest host next #NASATweetup June 5 in NYC! Registration opens 10aET May 21 http://www.nasa.gov/tweetup","Herschel's first Open Time Call offering 6592 hours of observing time has gone live! What would you look for? http://cot.ag/b9hkuB","June 5 #NASATweetup spkrs: @WorldSciFest co-founder B. Greene, Nobel prize winner Dr. Mather & @Astro_Flow http://go.usa.gov/3a8","NASA Chief Technologist Bobby Braun Talks About Technology's Role in NAS... http://youtu.be/AZvKBAaHnsQ","At 1:50am ET/5:50 GMT, Atlantis' crew woke to “Traveling Light,” by JJ Cale, played for Mission Specialist Piers Sellers.","At 6:45amET/10:45 GMT, astronauts Good & Reisman will begin the 3rd and final spacewalk of the mission. http://www.nasa.gov/ntv","At 6:27amET, STS-132 astronauts Michael Good & Garrett Reisman began the 3rd & final spacewalk of the mission. http://www.nasa.gov/ntv","Good's spacesuit has a band of red & white stripes; his helmet cam is #19. Reisman's spacesuit is all-white; his helmet cam is #20","At 8:13amET, spacewalkers Good & Reisman installed the 5th of the 6 new batteries for half of 1 of the station's 4 solar arrays.","Spacewalkers Good & Reisman installed the 6th and final new battery & put old batteries on a pallet to be returned to the space shuttle.","Spread the word...registration is now open for the @WorldSciFest #NASATweetup in #NYC June 5: http://www.nasa.gov/tweetup","[News] NASA Sets News Conference With Shuttle And Space Station Crews: The 12 crew members aboard space shuttle At... http://bit.ly/a4HTiG"],"d_snyder":[null,"I think we may need a cloud abstraction layer abstraction layer for all the cloud abstraction layers in development. #calal","I found a very nice tutorial on RESTful Web Services: http://bit.ly/b0loox (more here http://bit.ly/baVgle )","Any thoughts on #cassandra? Good, Bad, Ugly?"],"rubbsdecvik":[null,"@mcrute: PB and Honey is the best PB sandwich!"],"jonathanpenn":[null,"RT @Moltz: I only buy local produce. Take these Netflix DVDs, for example. They're from a local distribution center. I like to do my part.","@garybernhardt you *are* in an alternate universe!!!!","@garybernhardt will that be when you begin the Great War on Software™?","RT @navellabs: ReadMore v1.2.1 is submitted for review. Bug fixes and timer pauses on phone call.","Today is starting off complicated. If only :qa! worked in real life. #vim","Seriously, Apple, do you *really* want to jump in bed with these types? http://bit.ly/cb9vJD #softwarepatents","RT @dhh: Looking into options for patent lawsuit insurance. Microsoft might have come for Salesforce today, but anyone could be next.","Why can't Javascript interpreters do what I mean and not what I say? Eh? EH??!?!","OH: \"We'll worry about it later.\" I'm very scared right now.","\"But We’re Just Fine With the Two Men, One Company, One Search Engine Model.\" http://bit.ly/cdgcUL","The incredible success of the Rails/Merb merger is a tangible story of open source win.","Can you imagine if Google thought Gmail wasn't \"open\" enough and decided all email history should be public?","Switched from OmniFocus to Things. Again. For the third time.","Is there a support group in Northeast Ohio for addicts to productivity pr0n? It's for a friend.","@garybernhardt he and @joefiorini pushed me. iPad version is hella tight. Feature roadmap more promising. Tags. You still use OF?","@garybernhardt must learn from you! How is your Thingsfu? Any useful hints? Tag set?","@garybernhardt diggin' the simplicity.","Oh, Google. You can be so diabolical and endearing at the same time. http://yfrog.com/2dgdkp"],"ua6oxa":[null,"East side Melt opens in an hour. See you there!","Hour and a half wait at the new Melt. Yup, exactly the same... There is a huge bar, however."],"voidspace":[null,"Shared: Classics: now with favorite buttons!: picture: dunno source. lol caption: dunno source. We r adding favo... http://bit.ly/9OIyb7","Shared: EuroPython: Speakers and Talk Abstracts Announced!: The full list of speakers and the abstracts for all of... http://bit.ly/cuj2nV","Back home from Turkey after a week without thinking about programming or work! (Or answering emails...)","The new facebook privacy control centre launches. Shipping to all facebook users soon: http://bit.ly/aTqvGd","\"if everyone is doing best practises then it is the same thing as mediocre\" -- Scott Adams (dilbert)","Heh, slipped over 2000 followers without noticing. /me waves. Hello everybody.","@mitsuhiko looks to me like SA improved a lot - or ppl used to write really bad examples...","@mitsuhiko tutorials I read not so long ago had a lot of extra boilerplate to get simple Django-a-like model classes: hence the bad rep.","Considering jailbreaking my iphone to allow tethering. I haven't bothered so far (on this phone) as not needed any jailbroken functionality.","Previous iPhone was from the US so I *needed* to jailbreak it to use it. Rarely used any of the cydia apps though. Makes upgrading OS a PITA","Why is twitter so utterly sucky today? Google i/o conference perhaps? (I'm not seeing *many* tweets on it.)","Man, after an afternoon of playing catch-up I'm down to only 68 emails that need responding to. (Done the easy ones).","Highlights of the holiday: rafting and ziplining across a gorge, Roman amphitheatres, turkish bath/massage, beautiful mountains, no rain.","If Firefox, Flash and IE9 really do support VP8 then it will be hard to see it *not* winning. Big question is whether Apple will follow...","Downloading Portal for Mac. Disappointed that a) I haven't bought Team Fortress on Steam like I thought and b) Mac not supported yet anyway.","@ianbicking wow, nor was I. Lots of people want it though...","Why does google let a torrent of spam into google groups yet bounces *my* emails to one google apps alias?","Dammit. Bad network day. First I need to setup reverse-dns and SPF (not done yet) and now lost in port forwarding problems. :-(","Well I seem to have got port forwarding right. Lots of green icons where before there were only blue or yellow ones...","Succeeded in getting an SPF record setup with webfaction for voidspace.org.uk (thanks to some help from #python-dev ).","SPF record fixed - check-auth@verifier.port25.com gives me a pass - but google still bounces my email. *sigh*","Well spf record mostly fixed *and* port forwarding fixed *and* down to 30 emails. Next to upload pictures from the holiday to flickr.","Included in my backlog are *several* \"hey solve my IronPython problem\" type emails. I seem to have had more of these recently. Oh well.","Note - I don't *mind* \"hey solve my IronPython problem\" type emails, I just much prefer them on the mailing list than sent to me personally.","RT @DevHawk: Wraps taken off MSFT technical computing. For #ironpython fans wondering what Jim Hugunin has been up to, check out http:// ... -- http://twitter.com/voidspace/status/14318423760","My Techne lists 66 operating systems. I've used (worked with for non-trivial tasks) 16 of them. http://bit.ly/co8WGE","Northampton man in court *again* for breaching asbo forbidding him from wearing a skirt or showing his legs in public. http://bit.ly/dpG8Nf","Upload to flickr is slow today. First video from Turkey up: ziplining across a gorge (41s). http://bit.ly/bwJDK2","All the photos we took from Turkey are now on Flickr: http://bit.ly/aYFUG2","PyCon Australia is getting some nice publicity - appearing in both the Australian computerworld and lifehacker websites. Nice.","Virtualbox really *has* come a long way since I last tried it. Creating a Snow Leopard VM as we speak...","@ironfroggy looks very cool!","EuroPython talk acceptance emails are going out today... :-) A *great* lineup of talks...","EuroPython 2010 talk abstracts (full schedule available *soon*). 90 speakers and over 100 talks: http://bit.ly/9RpEIn","Looks like several really good Twisted talks @europython (from @esteve @terrycojones and @raymondh ) this year.","Q: What's the difference between chopped beef and pea soup? A: Everyone can chop beef, but not everyone can pea soup! (via Nathan Britten)","Policeman says \"It looks like your wife has been in a bad accident.\" man replies \"yes i know but she has a lovely personality\". (Dave Allen)","@doughellmann heh. Exact opposite to me. I use GR *all* the time, but have never found anything interesting through it...","Ooh - tweetdeck update with buzz integration. Interesting.","So now I can decouple my twitter account from my buzz account and choose which messages go to which. Great.","Cost of petrol in Turkey was *very* high - almost 2 euros a litre. Renting a car to explore with was fun but expensive.","iPhone plus iPad plus iPod makes up over 60% of mobile traffic to tumblr hosted blogs. Mac has >25% of non-mobile. http://bit.ly/cPyBs9","Shared: ZOMBO.com in HTML5: ZOMBO.com in HTML5. Uses SVG (scripted by JavaScript) and the audio element. Finally, ... http://bit.ly/aVwy8B","Got my teeth into the image upload/insert for our Silverlight rich text editor. Surprisingly easy (now) so working late on it. #ironpython","If someone with a public timeline blocks you in twitter you can see their tweets when not logged in but not if you are logged in... Odd.","Programmers (especially browser developers) don't block a whole app just because one window wants to show a dialog.","Fact of the day: Google, Microsoft and Canonical have all signed the PSF contributor agreement and are contributors (of code) to Python.","By no means perfect, but the MSDN API documentation for .NET is helpful (pretty complete) and navigable. #silverlight #ironpython","Man, so I have binary data that may or may not be an image in \"some\" format and have to detect it and save it appropriately. :-o","@ironfroggy eh? My binary data is in a byte array in Silverlight. Looks like when I post the data to django, PIL will handle it just fine.","@ironfroggy ah, I see. Yeah, writing it to disk and using file would be one way. Thankfully no need.","@pythoncoders yuck!","Man, so I have now been victorious with image upload - including doing ferocious battle with installing PIL on Mac OS X (again).","@ironfroggy does that include you?"],"appleinsider":[null,"[News] Apple releases updated $999 MacBook with GeForce 320M graphics http://tinyurl.com/2bx6v7f","[News] Hulu subscription plan for Apple iPad to arrive later than expected http://tinyurl.com/2u3b9op","[News] Nike+ heart rate monitor for Apple iPod coming June 1 http://tinyurl.com/35x9qxt","[News] Apple supplier Wintek says it treated workers for chemical exposure http://tinyurl.com/26gasxa","[News] Apple's fourth beta of Mac OS X 10.6.4 is clear of issues http://tinyurl.com/2e3neyf","[News] Apple scaling Final Cut Studio apps to fit prosumers http://tinyurl.com/329cne9","[News] Revised 2010 MacBook now supports HDMI with audio output http://tinyurl.com/34e3vqn","[News] Apple issues iPhone OS 4 beta 4, may support AT&T US tethering http://tinyurl.com/32rf4ba","[News] Google will fight to keep AdMob, calls Apple's iAd discriminatory http://tinyurl.com/373ul35","[News] iPod touch with 2MP camera spotted in yet another Vietnam leak http://tinyurl.com/2umaydq","[News] Fourth-generation iPhone cases match Apple's prototype design http://tinyurl.com/27ceabg","[News] Gartner: Apple's record quarter made it world's No. 7 cell phone maker http://tinyurl.com/2fkpjf8","[News] Alleged iPhone 4G part suggests Apple could offer white front panel http://tinyurl.com/34jmw3l","[News] Google announces free WebM video codec as H.264 alternative http://tinyurl.com/25fzxyv","[News] Rumor suggests voice & data on Verizon iPhone, AT&T talks exclusivity http://tinyurl.com/2vskojc","[News] X264 developer says Google's new VP8 WebM codec is a mess http://tinyurl.com/2bmuhxm","[News] Apple's latest iPhone OS 4 beta adds customizable user dictionary http://tinyurl.com/3ydaoba","[News] Teardown of Apple's latest MacBook reveals slightly larger battery http://tinyurl.com/26ksf7q","[News] Apple investigating contextual advertisements, coupons on iPhone http://tinyurl.com/27n7jex","[News] Apple's iPad believed to be outselling Macs in the US http://tinyurl.com/2fqvfon","[News] iPad has 91% consumer satisfaction, demand greater than pre-launch http://tinyurl.com/27nwj2j","[News] Google introduces Android-powered Apple TV competitor http://tinyurl.com/36ep5mt","[News] Apple repeals no-cash policy, gives woman free iPad for her troubles http://tinyurl.com/37kn9fr","[News] Steve Jobs says no to Google's VP8 WebM codec http://tinyurl.com/29rne5o","[News] iPad 3G remains completely sold out at US Apple retail stores http://tinyurl.com/2vahhn4","[News] Google compares Apple to 'Big Brother' from iconic 1984 ad http://tinyurl.com/2c5cuxb","[News] Apple shipping iPad preorders, opens international App Store, iBookstore http://tinyurl.com/2cljsh5","[News] FTC approves Google-AdMob deal, cites competition from Apple's iAd http://tinyurl.com/23s48o3"],"jimweirich":[null,"Lunchtime project was to obtain a Swedish power adapter. Mission accomplished. Ready for Nordic ruby.","17 people at cincy.rb tonight. We need to get more chairs.","Boarded for first leg of the trip to Nordic Ruby Conf.","Meeting for food before the elabs party — at Kök & Bar 67 http://gowal.la/c/Mzbb"],"jespern":[null,"This netbank is the worst. Almost just paid 120k for my Internet bill.","Travel agent called to confirm tickets to Berlin. #djangocon starts Sunday for me! Can't wait.","SSD arrived. Will install in my MBP tonight.","Now on SSD. Awesome!"],"clevemetroparks":[null,"RT @clemetzoo: (news release) On Father's Day, build memories with Dad at our second annual \"Hard Hat Day at the Zoo\": http://bit.ly/cQkaag","Go on a 6-mile history/nature adventure by bicycle Thurs w/ a stop 4 ice cream while you \"Bike the Ohio & Erie Canal\" http://bit.ly/aeYe8q","Have you gotten your Ledge Pool season passes yet? They're available for purchase online now! http://bit.ly/cEaaxN","2 busy 2 hit the golf course during the day? Want more time 2 play @ day's end? Our \"Twilight Rates\" will solve that! http://bit.ly/dnFGqo"],"railcar88":[null,"I'm enjoying this series of talks from Douglas Crockford on javascript: http://yhoo.it/dju9sS Volume One is a comp sci history lesson.","RT @jonbho: Let's see how this goes... ViEmu/VS2010 Beta 1 ready: http://bit.ly/cFiMfl. Thanks in advance for your feedback!","RT @openbsd: OpenBSD 4.7 released http://bit.ly/9wxfto","RT @etgryphon: Specter loss and Rand Paul Win! Today is a good day! http://bit.ly/dkccRO #politics #us #election","Our team needs one of these RT @github: Our new build status indicator http://bit.ly/arTpMe courtesy of @atduskgreg http://yfrog.com/104v2j","I see the code better when I make comments dark gray against my black background visual studio:)"],"amazondeals":[null,"Lightning Deal! $19.99 - Afterglow AW.1 Remote for Wii http://tinyurl.com/7lnpkg","Lightning Deal! $34.99 - Karaoke Revolution Bundle for $34.99 http://tinyurl.com/7lnpkg","Lightning Deal! $26.99 - Wand Core Pak for Wii http://tinyurl.com/7lnpkg","Lightning Deal! $29.99 - Disney Sing It: Pop Hits for Wii http://tinyurl.com/7lnpkg","Lightning Deal! $25.99 - NBA 2K10 for $25.99 http://tinyurl.com/7lnpkg","Lightning Deal! $34.99 - Toy Story Mania for Wii http://tinyurl.com/7lnpkg","Deal of the Day: $26.99 - \"Woodstock\" Ultimate Collector's Edition on Blu-ray http://tinyurl.com/7lnpkg","Lightning Deal! $99.99 - Yamaha BODiBEAT Music Player/Heart Rate Monitor http://tinyurl.com/7lnpkg","Lightning Deal! $42.99 - Freud Avanti 12-Inch Ultrafine-Finish Crosscut Blade http://tinyurl.com/7lnpkg","Lightning Deal! $78.99 - Harper Trucks Nylon Convertible Hand Truck http://tinyurl.com/7lnpkg","Lightning Deal! $26.00 - Envirosax Mikado Pouch, Multipack http://tinyurl.com/7lnpkg","Lightning Deal! $115.00 - Hobo International Berkely Satchel, Mocha http://tinyurl.com/7lnpkg","Lightning Deal! $385.00 - Rebecca Minkoff Mab Mini Satchel, Black http://tinyurl.com/7lnpkg","Lightning Deal! $365.00 - Linea Pelle Dylan Oversized Tote, Zucca http://tinyurl.com/7lnpkg","Lightning Deal! $7.49 - EatingWell (1-year subscription) http://tinyurl.com/7lnpkg","Deal of the Day: $249.99 - Escort Passport Radar and Laser Detector http://tinyurl.com/7lnpkg","Lightning Deal! $39.99 - Norton 360 4.0 1 User (3 PC) - Windows 7 / Vista / XP http://tinyurl.com/7lnpkg","Lightning Deal! $179.99 - B.C. Rich Son of Beast Avenge Electric Guitar http://tinyurl.com/7lnpkg","Lightning Deal! $99.99 - Silvertone Dreadnought Acoustic Guitar http://tinyurl.com/7lnpkg","Lightning Deal! $44.00 - Schumacher Automatic Speed Battery Charger http://tinyurl.com/7lnpkg","Lightning Deal! $34.99 - Iron Man 2 for PS3 http://tinyurl.com/7lnpkg","Deal of the Day: $84.99 - Iomega Prestige 1 TB Desktop External Hard Drive http://tinyurl.com/7lnpkg","Lightning Deal! $97.99 - Corsair 4GB PC2-6400 800Mhz 240-pin Dual Channel DDR2 Desktop Memory http://tinyurl.com/7lnpkg","Lightning Deal! $67.99 - Western Digital 1 TB Caviar Blue Desktop Hard Drive http://tinyurl.com/7lnpkg","Lightning Deal! $24.99 - Dance Off the Inches Fitness Bundle http://tinyurl.com/7lnpkg"],"gregmalcolm":[null,"RT @pmontgomery: RT @PeteOnSoftware: The playable pacman game on the google homepage is great"],"ctitusbrown":[null,"My deep cynicism strikes again: http://bit.ly/djnuWb . Too much leisure ==> bad for my career? #bioinformatics"],"club_is_open":[null,"Nothing pisses me off more than some douche developer who think to himself, \"Oh, resizing the client browser is my only option for this.\"","Perhaps SC2 with some coworkers @ lunch will remedy this day.","Smoked in SC2 by @csepic ... build more workers ... need to build more workers.","A 1970's \"Come Back to Jamaica\" reference was dropped by @jgro today - genius. http://www.youtube.com/watch?v=pokFsD1VHew","Hmmm. This JavaScript noodling I've been doing @ night might be going somewhere.","I really kind of like watching tsn.ca and seeing guys like Peca and Ferraro as analysts now.","I swear I nuked MacPorts on this machine. Swear.","FYI this is going to be the worst lightning talk ever. Perhaps the title \"A Culture of Failure\" was me being prescient. Frack.","Now playinh: DJ Shadow and Cut Chemist's \"Brainfreeze\" funk/soul set was trigged by @kumar303 by an add to the great opening guitar riffs.","\"Ya know, in case someone wants to buy a used Lamborgini in Denver ...\"","Love it when the past gets thrown in my face. LOVE. IT.","@jessenoller Reminds me. I need to mail him to you. I'll do that before the holiday and restart the TiP thread of who gets him next.","@garybernhardt if you don't open with the line you opened with @ the TiP BOF ... you're doing yourself and the attendees a disservice.","@jessenoller Memorial Day ... which means I'll mail him next week!","@jessenoller I'll concede that @benjaminws and @mcrute are changing my opinion of CLE ... slightly.","One of todays lightning talks about fixing car brakes makes me WISH we had auto shop in high school.","Inbox: 3 / ToDo List: 10 ... if only the TODO list were easier than EMAIL.","Ugh. What a morning of curveballs."],"clecitycouncil":[null,"Council to announce prescription discount card for city residents today at 1 p.m. Look for details this afternoon.","Cleveland Residents - save money on your prescriptions http://tinyurl.com/3yq5m69","Council legislation designates “Police Memorial Way” and “Police Memorial Square” today at 1:30 W. 3 & Lakeside Ave","Tomorrow is senior day. Free resource fair and more! http://tinyurl.com/y2rfze2","Mark Kellogg sentenced for 14 years in Slavic Village mortgage fraud scheme http://tinyurl.com/34xkx3a"],"madssj":[null,"Apparently I'm going to #djangocon in Berlin. Guess the beers are on @jespern and @ptrbrn","@jespern Are you not afraid of the lack of TRIM in OS X? Seems like one has to be fairly brave to run OS X on an SSD: http://bit.ly/4erJ5V"],"docondev":[null,"Having little success with Yahoo! small business email, Mac Mail, and MobileMe. Gawd how I love GMail.","Yes, but I am no longer the man who went in. RT @mtnygard: If you go into the woods, is it you who comes out?","Jury Duty is over. Not Guilty! Tomorrow I hang out on the boat and then Hudson SC Group.","I almost forgot to mention that I sincerely dislike the combination of Yahoo! small business mail and ... well ANY mail client. no IMAP.","I plan to be there - RT @adomokos: Thinking about attending the Hudson SC Group tomorrow.","Now with URL! RT @adomokos: Thinking about attending the Hudson SC Group - meeting tomorrow. http://bit.ly/alFWaA","Hmm, I don't know about that... RT @bguthrie: Willful ignorance is a loathsome thing.","I kid, I kid RT @DocOnDev: Hmm, I don't know about that... RT @bguthrie: Willful ignorance is a loathsome thing.","I love it! RT @lanettecream: Someone should make a blog about refactoring called \"Extreme Code Makeover\". Nothing but code made pretty.","On the boat!! Nice to be here again. Love the view even though @jonrstahl has kanban boards all over the windows.","Absolutely! RT @unclebobmartin: Refactoring should never appear on a schedule. Keeping code clean is just something you do all the time.","Blogged: Cleveland Ruby Group http://bit.ly/cfH8HM","Just uploaded 'Take Control Of Your Development Career' to SlideShare. http://slidesha.re/cnrWFs","Blogged: Take Control of your Development Career http://bit.ly/cIeL25","@unclebobmartin I hope you find this to be a growing trend.","Crap. I missed it. RT @adomokos: Great to hear @mfalanga's presentation at the Hudson SC Group meeting tonight.","In-expendable means no new oportunity RT @avivby: @DocOnDev Slides missing some context. Why would I /want/ to be expendable?","You switched to #vim? #baddah-bing RT @tobytripp: I think I've done it. I've reached #emacs nirvana.","Happy to announce I've joined the @LeanDog Team. Agile delivery, coaching, & training in Cleveland; all from a boat.","RT @garybernhardt: I'm teaching a TDD in Python class with @nickbarendt in June. Please register if you want to come! http://bit.ly/cZ8COQ","RT @rdempsey: When doing due dilligence, reading someone's blog will tell you a lot more about them than even their linkedin profile.","RT @jonrstahl: \"Pre\" IT Martini at @leandog boat TODAY - beer, wine & even sunshine ;) Come on by! 5:30-7:30 PM http://bit.ly/csRC82","Ummm.. Lifeguards guard LIVES. RT @cory_foy: Lifeguards get more training than ScrumMasters.","Absolutely! RT @cory_foy: @DocOnDev I want to see us start raising the bar on our whole industry.","RT @apprenticeshipp: .@avivby Links to every pattern can be found in my appendix: http://apprenticeship-patterns.labs.oreilly.com/apa.html","Great presentation! RT @KentBeck: mindboggling good illustration of talk w cartoons: http://bit.ly/bykJ36","Eschew Preconceptions - http://bit.ly/brdzKa","Attention Speakers - I have two slots at the Prairie Dev Conference June 2&3 that I need alternates for. Interested? DM me. Please.","@chzy I thought we were at Agile Coach Camp on June 12....","@coreyhaines @joelhelbling We need to get you back to CLE for a spell. .NET TDD Class is coming up....","Fun! RT @pzsembik: You can play PAC-MAN with the Google logo today!","RT @leandog: @LeanDog looking for Java | C# | Ruby | Web Design. Agile passion (entry 2 expert) Travel req. http://bit.ly/94A3Dk"],"jleedev":[null,"My shower's full of rubble. Guess I'll use the other one.","RT @mmeetra: Love this http://www.whatthefuckshouldimakefordinner.com/","I don’t want C++, I just want C with `this` and closures.","OH FUCK ME WHY DID I MAKE THIS UNSIGNED","Hey everyone, this isn’t Google’s first playable holiday. http://bit.ly/bfpkCX and http://bit.ly/c7WUvx for Valentine’s day and Easter."],"linode":[null,"We are investigating network issues in our Newark facility. Please monitor our status page for updates: http://bit.ly/bO1vKq","Newark facility engineers are working to restore service; we sincerely apologize for any issues this may cause: http://status.linode.com/","New Library Article: How to Contribute to the Linode Library http://bit.ly/bJSryX"],"elizadushku":[null,"YEAH Paul, that's right! RT @paulpierce34: You know we going crazy tonight. sorry Dwight","Momma Judy/Africa (Kampala, Uganda) i miss u http://twitpic.com/1oynmt","RT @MissCaraShane Haha, don't hate her at all, was totally messin' n playin' around. We gots love for Jake & Vienna! We're Bachelor junkies","YO! Peeps took my Twitpic/Vienna Bon Qui Qui riff for realz. We paused tivo & were dying laughing http://bit.ly/13PFHY","Friendly Reminder: u talk real smack=u get real blocked, real fast :) This isn't a Twitocracy- I'm my own Twictator! Twugs ;)","Long live Bon Qui Qui","Haddaway 'What Is Love' is poppin' right now! 'Whoa-oh-oh-ohhhh-ah!' Head bop~check!","RT @mariamenounos: Celts orlando game 2 about to begin!!! Wooooooooo!!","YES! Go 4 me if u can & report back someone! RT @anjelahjohnson I'll be at University of Redlands tomorrow night! 1night. 1 show. Done. #fb","RT @paulpierce34: What I tell ya! Good defense though. Time to get ready for Thursday","Dude, I LOVE being a student again! Just got my midterm back w/ a big circled 'A' on it- FIERCE! I studied w flashcards, people. Framing it.","Night y'all. & 4 the last time: I heart the Pavelka's. Will fresh CUT some flowers for Vienna in the a.m. & apologize if I hurt feelings! xx","Oh, & I'll tell u all in 3 wks what I'm studying! Right after my final- don't wanna jinx it. PEACE","RT @mariamenounos: @paulpierce34 aww...and here I was excited about your confident posts...haha..I had brooms ready!","RT @redsoxgame: #RedSox 7 #Yankees 6. Final.","Buenos DIAS!!","Depeche Mode- Enjoy The Silence.","Still gives me chills! (Aka proof ;) http://twitpic.com/1p6rtc","Lakers game tonight w/ my hunny, my bros. & fellow Angelino's. I'll be there as a mole to report back to my Celts, I swear! LOL","RT @Rickafox: I feel like the child of a divorce between my parents Papa Celtic-and Mama Laker-where should I spend the Finals? I'm such ... -- http://twitter.com/elizadushku/status/14319368675","Best part of the game ;) http://twitpic.com/1pavps","Hi guys & gals! Fun night, I had an air bread Philly cheese-steak @ Bazaar in SLS- strange but tasty, & liquid olive- exactly as it sounds..","ageism","1st off, g'morning!","AGEism's gettin a lil 'old' comin' from a-some-a-you.. My boo's 40. 10 yrs older-n-me- lol! He's the real deal & I'm CRAZY about him ;)","RT @Rickafox: Check this video out -- EXCLUSIVE! Rick Fox thoughts on Kobe, number retiring and the Hall of Fame! http://youtu.be/sy3ow- ... -- http://twitter.com/elizadushku/status/14407431292","RT @ViennaGirardi: Apparently the media hasn't seen \"Bon qui qui\"....\"RUDE\"!!! LoL I'm a big fan of yours @elizadushku xoxo","RT @righteoustmk: @elizadushku age ain't nothin' but a numba!","LOL, fun attitude, homie! @mschauer @elizadushku I'm only 9 years younger than you. So you're saying there's a chance ;)","Easy froggy @jfrog9676 thanx 4 the post i was worried cuz i like someone who's 8 yrs younger! thinkin maybe it's wrong! NO it's ok thanx :)","My ageism applies to 18+ ONLY!!!!","Damn, it's been a bloodbath for tv shows lately, eh? Any of your personal faves get cancelled?"],"mitsuhiko":[null,"Sharing is caring. There are now Badges for Flask powered applications: http://bit.ly/ctROkT :) Inspired by the Django ones.","@meatballhat @garybernhardt i know. i know. i will do a release","WTF? github, why the hell do you think that Flask contains PHP code? http://bit.ly/93AQdk","@ianschenk SA is cryptic? http://bit.ly/b33VCw / http://bit.ly/ctZ3dV - that looks nearly exactly like Django, just more flexible :)","Google is awesome. That's all","github should ask before forking. accidentally forked","Obj-C bindings suck for debugging. Code segfaults in apple code if I set the property, but if that property is set from the UI, it works.","Yes, yes, yes. God is an Astronaut was awesome today. Best concert in a while for me","\"God is an Astronaut\" yesterday in Graz was awesome. If you like postrock, you *have* to see those guys live.","Anyone got a good short introduction in how to format your mails and mailinglist rules? want to link that from my mailinglist page","Objective-C annoyance: do not use [NSObject objectWithFoo:] methods when using garbage collection"],"iamfender":[null,"sigh... at LEAST 3 copies of the std jslt tld files under WEB-INF","As a follow up to my http://highscalability.com tweet : http://imgur.com/wA8hw.png","For those that made it through the DiSC training: eBaum's World Sexual Harassment video http://j.mp/bPxHfo NSFW language/situations","RT @codinghorror: crossdomain.xml \"security\" -- bad idea, or WORST idea?","@unimancorn related? A chocolate T-Rexicorn http://i.imgur.com/6zMsB.jpg","Google, Mozilla, And Opera Take On H.264 With The WebM Project, A New Royalty-Free Video Codec http://j.mp/b7rSvx","@WillDady @pperon Promote the video on the artists' channel http://www.youtube.com/watch?v=HgpsXURZFo4","RT @allspaw: Anyone building 'open' sites should read this many times: http://bit.ly/aX9d9G #API #Flickr","NPH on a unicorn: http://i.imgur.com/WOzVs.jpg","#chipotle online order #FAIL","High voltage power line + tree = explosion (skip to 3 min or so) http://youtu.be/kVXi_0H_ZzM"],"meatballhat":[null,"oh dear otis ... ye make my tuesday so wonderfultastic http://www.last.fm/music/Otis+Redding/_/Security","is setting the heck out of some topics","dear #python community, cut it out with the new web frameworks, already. Learn to contribute to existing projects, eh? </grumps>","@mhebrank THANK YOU for that. hilarious.","@garybernhardt for today, I'm grumpy about Flask because the Zine project could really use @mitsuhiko's attention, IMNSHO ;-)","is totally ready to #rocketfist this Java app to da moon.","is migrating the fleep out of these projects. #mercurial","RT @newsycombinator: Apple, Adobe and Openness: Let's Get Real http://bit.ly/bQfCFw","is totally jazzed about the new Google font directory http://code.google.com/webfonts","is having a Thursday morning! HOTTT!","RT @therealfitz: 100,000+ Android phone activations per*day* now. Wow. #googleio","RT @dynamoe: Wiki-fun: Castor Beans. Four seeds will kill a rabbit, 5 a sheep, 6 an ox or horse, 7 a pig, 11 a dog, but it takes 80 to k ... -- http://twitter.com/meatballhat/status/14371492492","voted. you should, too -> http://www.google.com/doodle4google/vote.html","RT @jaynawallace: Google's banner today is the best I've seen yet, just click the \"Insert Coin\" button and play Pac-Man: http://google.com","who said it was okay to eat pancakes at work?? next to me?? without announcing pancakes??","@mhebrank it all makes so much sense now. You *ARE* the Pancake Nazi."],"alex_gaynor":[null,"I have never met a copyright-infringer capable of arguing rationally.","OH: \"The final exams are not available for review (and have already been recycled).\" That's fucking retarded","The average user uses about 25% of C++. I think this is probably true of websites as well.","@zedshaw \"dynamic, non compiled languages are neither clever nor difficult to implement\" I stopped reading there.","The internet is the ultimate gyges ring.","You don't need to be coming to DjangoCon.eu to ask questions for the panesl! http://bit.ly/bzYvC1 http://bit.ly/dvqao4","Found a possibility for a new peephole optimization in python: http://bugs.python.org/issue8758","@brettsky Linked post doesn't have a list of speakers, or a link to it #wtf","RT @jtauber: we've launched http://djangocon.us/ !","@jessenoller I'd help put one together in Chicago","@jessenoller I actually just watched Brian's Chipy talk, so I know the public details ;)","SSNs should be treated the way passwords are, if you need to authenticate me use oauth ;)","@jessenoller ja wohl","@jessenoller question: do these sprints include alternate python implementations?","@jessenoller aka somewhere else on the internet :D (never got that phrase)","RT @mytechne: we've relaunched with a new look, visual timelines and our third category: text editors! http://mytechne.com/","self-discipline isn't necessarily a good thing. Somethings demand our action, and obligate us to act out.","\"Some sexually frustrated geek teens are upset because web2py allows even the dumb guy dating their dream girl to do decent web development\"","Don S Davis had a PHd? Holy shit, badass.","Haha, Bones intro reminds me of when the ceiling collapsed on my bed :D"],"chzy":[null,"Too bad I won't be in town - Looks like I'll be teaching a tdd class in Cleveland in June on the boat: http://vurl.me/PDU (via @coreyhaines)","$3 cheeseburger night at Brazenhead","I'm teaching a TDD in Python class with @nickbarendt in June. Please register if you want to come! http://bit.ly/cZ8COQ (via @garybernhardt)","Happy to announce I've joined the @LeanDog Team. Agile delivery, coaching, & training in Cleveland; all from a boat. (via @DocOnDev)","thinking about putting together an all day ruby bash on the boat June 12th. Any takers?","@DocOnDev is that the date for the coach camp? now I have a conflict. @robpark is in town that weekend"],"coreyhaines":[null,"Looks like I'll be teaching a tdd class in Cleveland in June on the boat: http://vurl.me/PDU (just some logistics to work out)","Very, very excited about the direction my #nordicruby talk is heading. Unrelated: going to @obtivacorp geekfest today. :)","As usual, last night I changed the main focus of my #nordicruby talk. I think it is better. Now to figure out the details.","Second one there! RT @coderetreat Coderetreat Pittsburgh, July 10: http://vurl.me/PCG","This weekend! RT @coderetreat Coderetreat Boulder, CO, May 22nd http://vurl.me/PCH","This weekend! Awesome! RT @coderetreat Coderetreat Columbus, OH, May 22nd http://vurl.me/PCI","I'll be there! RT @coderetreat Coderetreat Gotenburg, SWEDEN! May 29th (with @coreyhaines). Registration starts tomorrow!","Happy Birthday @jamesbender","And knowing is half the battle! @garybernhardt explains things well that I don't know (but now I do): http://vurl.me/PDZ","Thanks to everyone at @obtivacorp #geekfest who listened to me ramble about spies.js http://yfrog.com/5dl7cej","Happy Birthday to @voxdolo, my first VIM instructor","Really fun time pairing on @redsquirrel's node.js app. I'm starting to see the rumblings of my web framework extracting itself","RT @coderetreat: Coderetreat Pittsburgh, July 10: http://vurl.me/PCG","RT @coderetreat: Coderetreat Boulder, CO, May 22nd http://vurl.me/PCH","RT @coderetreat: Coderetreat Columbus, OH, May 22nd http://vurl.me/PCI","RT @coderetreat: Coderetreat Gotenburg, SWEDEN! May 29th (with @coreyhaines). Registration starts tomorrow!","RT @acts_as_conf: Check it out: Super Early Bird Pricing Ending Friday http://bit.ly/9kDIPJ","Looking for a great, inexpensive conference? @acts_as_conf is worth checking out this fall.","Hey, @leshill, when do you land at AMS? I'm on the same flight as you to GOT.","Go register! Good times! RT @coderetreat Registration now open for #coderetreat Gothenburg, Sweden, on May 29th http://vurl.me/PZJ","Me too. I'm hoping to a majority before too long. RT @bryanl: I want to write all my apps in JavaScript going forward","On train... leaving ORD-AMT-GOT at 420. Get to Sweden tomorrow. Really looking forward to #nordicruby","@garybernhardt I'm hoping to start pushing some javaScript apps out the door this summer","@garybernhardt common.js has packages. Namespace via objects. Why separate concept. More malleable than ruby.","@garybernhardt not missing method missing, as I'm writing less object- based code.","@garybernhardt we'll talk when you come out here on your interviews. :)","@garybernhardt and I'm going to give coffee script a serious look-see","@garybernhardt it is beautiful here in the summer. Come spend a month, or two","RT @acts_as_conf: I'm thinking to invite some ppl to show us how to pair program at #aac2010 and set up an area for it. Any interest?","On plane. Strange. This flight usually has seat back entertainment systems. Guess I'll have to entertain myself with scotch. :) ORD-AMT","Made it to Sweden! Thanks to @cjkihlbom for the super awesome hotel! Extravaganza room with free truffles!","Starting to go through 'Purely Functional Data Structures' in javascript. Thanks @ rarepleasures for the book. git repo http://vurl.me/QSQ","RT @thinkrelevance: Come to Refresh tonight @ 6:30 to hear @jessmartin on improving designer/developer communication http://bit.ly/a81HkK","Pairing on ENIAC! Jean Bartik tells how you should program: http://vurl.me/RQP :)","@msnyder why would you install mysql? dev on sqlite","@msnyder doh! Sucks to be you then. :)"],"bikegriffith":[null,"iterations should start with spiking and end with TDD+pairing. rushing around at the end is recipe for quality out-of-control.","i'd rather see the asymptotes meet on the bottom of the burndown chart than on the top. i.e. concave up/right is preferred to down/left","is it wrong that i find it hilarious that the lifelock ceo got his identity stolen 13 times? http://bit.ly/9iVqzE","@garybernhardt the only favorable thing Mock still has going for it is it's `spec` argument. beside that, your dingus rocks its socks off",".@mpirnat doh! meant http://bit.ly/ae7YJC","BLOGGED: testing oauth with tweepy http://bit.ly/abR3sG #zine","@dstanek just testing stuff :)","Blogged: testing custom message format http://bit.ly/c9bXsb","Blogged: http://bit.ly/cjXrF9 #zine","Blogged: testing oauth with tweepy http://bit.ly/abR3sG #zine","@benjaminws does 2-factor auth work for you? even after that i can still only use the username/password login for aventail on 10.04x64","skeptical about chrome web store. i *want* it to be useful, so i hope they'll figure out DRM and make it easy to collect $$","what's with dojo.connect(node, \"onchange\" not firing when programatically toggling node.value ??"],"discoverohio":[null,"RT @lakecountyoh: Wednesday take a drive out to Lake Metroparks Farmpark for the first farmer's market of the season! http://ht.ly/1M2Rv","Who needs a FREE #Ohio getaway worth $500+? http://ow.ly/1MzkF #travel #contest #myOhio","RT @TravelEditor: RT @ThatTravelSpark Clever tricks when flying Southwest Airlines. http://ow.ly/1Mmne #TravelTuesday","RT @WarrenCountyOH: Today's #31Prizes31Days giveaway is 1 free canoe rental (4 will win) from Rivers Edge Outfitters. http://bit.ly/9EaYCt","Visit Canton’s National First Ladies’ Library for “America’s Goodwill Ambassadors: First Ladies Travel the World” http://ow.ly/1HbyJ #ohio","1 Segway Nature Tour participant rides for free when accompanied by a rider paying full price http://ow.ly/1Mueq #OHDeals #ohio #travel","Come out and experience the music of Earth, Wind & Fire, 6/1, The Toledo Zoo Amphitheatre http://ow.ly/1HbAV #ohio #travel #music","RT @WomenintheAir: See & fly in EAA's fully restored Ford Tri-Motor at Burke Lakefront Airport July 8-11. http://ow.ly/1MIK5 #ohio #travel","RT @InSpringfield: 101 Things to do in Greater Springfield: #5 Tour Pennsylvania House: http://ow.ly/1MJCR #ohio #travel #history","1 Segway Nature Tour participant rides for free when accompanied by a rider paying full price http://ow.ly/1MugJ #OHDeals #ohio #travel","RT @PositivelyCleve: Celebrate Jewish American Heritage Month at Maltz Museum w/specials, exhibits & programs thru May http://bit.ly/9nntpT","#Music on the Levee has arrived in #Marietta! Check out free music entertainment every weekend through September. http://ow.ly/1HbCn #ohio","RT @MILLERBOATLINE: Our next enews comes out soon, sign up for free + get $1 OFF adult roundtrip Put-in-Bay #ohio #travel http://ow.ly/1N2mJ","Shop/stay at Dublin Homewood Suites by Hilton, includes accomms & $25 Gift Card to Mall at Tuttle Crossing http://ow.ly/1N0iC #OHDeals","Vote now, vote often! :) RT @alexandluke: @discoverohio You are teamed up with west virginia for a new vote on http://alexandluke.com","Congrats! RT @MsGeauga: We are famous! http://bit.ly/9gxuID","If variety is the spice of life, then try something different, 5/29-5/31, 32nd Annual Taste of Cincinnati http://ow.ly/1HbEr #ohio #travel","Shop/stay at Dublin Homewood Suites by Hilton, includes accomms & $25 Gift Card to Mall at Tuttle Crossing http://ow.ly/1N0lq #OHDeals","Art and music! Club Friday Live Music: It's Essential (R&B/Jazz), 6/4, The Toledo Museum of Art http://ow.ly/1HbH9 #ohio #travel","RT @taftmuseum: Get a preview of TruthBeauty before it opens this Saturday. http://bit.ly/9c8bIG #ohio #travel #art","Love Amazing Race? Pointless Pursuit is a quirky adventure for teams of 2 in CMH 9/13. $8 off team registration http://ow.ly/1NxvX #OHDeals","Ready for some #Ohio fun in the sun? We've got some great ideas for you! And don't forget your cameras! http://ow.ly/1NBaC #travel #myOhio","RT @LESIWC: RT @Funcoast: Get in for free on Museum Day - Help celebrate International Museum Day this Sat, May 22. http://ow.ly/1NC5L #ohio","RT @MaryS_DublinCVB: Seeking a good PR/Social Media intern (with Irish attitude) for summer. Unpaid position. http://bit.ly/dcvbintern","RT @ExpCols: Win a #Columbus festivals prize package! Name your favorite May or June festival or event: http://bit.ly/btKRtm #ohio #travel","Have you checked us out on Facebook yet? You'll find info from us & from fellow travelers. Click \"Like\" to become a fan! http://ow.ly/1NIDR","Calling all you Material Girls: Thursdays are Ladies 80s Night at #Skully’s #Music Diner in Columbus! http://ow.ly/1HbIG #ohio #travel","RT @MILLERBOATLINE: For \"Kids Salute to the Troops\" @ Perry's Monument 5/29, military personel/Vets ride Miller Ferry/PIB FREE. 800-500-2241","Love Amazing Race? Pointless Pursuit is a quirky adventure for teams of 2 in CMH 9/13. $8 off team registration http://ow.ly/1Nxyi #OHDeals","Are you \"Livin' for the Weekend in #Ohio\"? #Multicultural Tourism Day, 6/5, Zoombezi Bay/ #Columbus Zoo & Aquarium http://ow.ly/1HbKU","Award-winning #Ohio Amish Country B&B offering weekday Buy 1 Get 1 at 50% off in May and June 2010 http://ow.ly/1O8hC #OHDeals #travel","RT @CincyPlay: a Cincinnati.com feature on The Fantasticks actor, Ron Bohmer! The show opened last night and runs until June 20! http:/ ... -- http://twitter.com/DiscoverOhio/status/14432940595","RT @Ohiofarmersmkts: RT @hillsmarket: Ohio strawberries & rhubarb! Artichokes on the stem! We're swooning. Get to our produce depart.today!","RT @stanhywet: Bring your dog for a garden walk on Sun, 10am-6pm. Last admission: 4:30pm.Dog admission $5. People $8, $4youth, mbrs free.","RT @tribetalk: Still looking for tix to #OhioCup and fireworks? Buy online with our Twitter-only special! www.indians.com/twitteroffer"],"thafreak":[null,"♺ @bdogg64: ♻ @snarf #Linux Mint 9 “Isadora” released! http://is.gd/ceKDD","If you ever looked into starting your own ISP just to have better bandwidth at your house... #youmightbeanerd","♺ @klimpong: OH: \"The @twitter API is more unavailable than your mom!\"","Ok, just had a sales person at one of my client's ask for me to help her install FileMaker on her desktop. um. NO! FileMaker = #FAIL #fb","♺ @linuxjournal: Using Linux to Disinfect Windows - Are you responsible for one or more Windows computers? If yes ... http://ow.ly/17qsTo","Why do I keep buying things on ebay, when they always get shipped in the most ghetto way possible? And it's usually wrong too. #fb","Why do I keep buying things on ebay, when they always get shipped in the most ghetto way possible? And it's usually wrong too. #fb","I SWEAR the next person who replies to an email I sent WITHOUT READING IT FIRST, will get punched in the THROAT! YOU'VE ALL BEEN WARNED! #fb","Also note, that my niceness quota has been squandered today. Tread lightly my friends, tread lightly. #thatisall","Huh, well that's a first, while looking at one web site's HTTP headers, one of the headers instructed me to apply for a job with them. #fb","Huh, well that's a first, while looking at one web site's HTTP headers, one of the headers instructed me to apply for a job with them. #fb","Check out my brand new gnome desktop o.O! http://twitpic.com/1ppgqy","Check out my brand new #gnome desktop o.O! http://twitpic.com/1ppgqy #ubuntu"],"unimancorn":[null,"RT @thomasjelliott @unimancorn Selling yourself again? http://bit.ly/9umCfa - Yea, trying to sneak around prostitution laws. . .","RT @CheShA @classroomtweets @icaruswingz I'm a friendly pink unicorn *Neeiiigghh* you can trust me. - No you're not. I am. :-)","RT @jewelry_center #4: Invisible Pink Unicorn Lapel Pin - Wait. Invisible AND pink? Wow. That's some seriously good magic there.","RT @tweetreddit The 10 Worst Unicorn Tattoos: http://kl.am/cF71 #reddit - Proof that we unicorns are far kinkier than you thought.","RT @aislingkennan @zbussey that singing unicorn completely brightened up my day!! :) - If you ever need a dancing one, I can come over.","RT @AntigoneSuicide This is my unicorn. http://twitpic.com/1ox9sd (via @Vivka) lol! - Aw. I'm so happy to know I belong to someone!","RT @karmaapple Guess who now has a unicorn tattoo? - These people? http://myturl.com/0pB8i","!@siddfinch oh hell yea. owner ALWAYS pays my bar tab. I don't spend very long in any one person's possession.","RT @lanabella @yummyandcompany Have any see about a stop eating unicorns shirt from @tinaseamonster - Why deny unicorns their pleasure?","RT @m_slago @jimettarose rephrase: I tamed the unicorn that @guerillamilk refers to in her last tweet - Cuz he was wimpy. Can't tame me!","RT @aschulak Time for Castle and House. Yes, I am one day behind all of you. No spoilers! - people die! muahahaha. I'm evil!","!@mark_henry @johnnie_cakes Oh please guys. I've got a HORN on my head! Think I'm afraid of a guy named after pastry?","RT @fleshforks so fancy: http://yfrog.com/69pzeaj - Is that a. . .dog biscuit? If so, at least real beef flavored?","RT @Taskmask @DonnaKat my butt only itches in the morning or when there is a unicorn around - Have you checked it for stray rainbows?","! @iamfender @unimancorn related? A chocolate T-Rexicorn http://i.imgur.com/6zMsB.jpg - Noo. . .looks wimpy. Bet I could bite its head off.","Aw man. . .if the cat keeps dragging things like that in, I'll have to put it down!","You have any idea how long I had to pose for this? http://myturl.com/0pB8N","RT @Monica_777 Go pull weeds outside of someone else's office window!! #CREEPER - Is \"pull weeds\" a euphamism here?","RT @DarkBunnyTees Gaff must have had more bloody patience than me http://twitpic.com/1p5ukd - OMG! Am I a replicant?","RT @robotgoboom damn... just saw a unicorn at work of all places. - Aw man! He better NOT ruin our lazy reputation!","RT @Slimmyblaze Never seen a bad bitch like a unicorn - You ain't kidding. We are BAAAAAAAAAADDD. And no, that's not a sheep sound.","RT @VirginiaOxford Nothing like a certain sort of text message to make a girl's day better. maybe a unicorn - That sort of text from me?","RT @VirginiaOxford you have won me over with your unimancorn charm. You now have one more follower. - Thanks! See, this one wasn't so weird!","RT @johnnie_cakes Phrases like, \"we're going to double our penetration\" shouldn't be used on conference calls. - You must not work in porn.","RT @egspoony You had me at Tequila...and vomiting unicorn... - Whoa. Stories of me on a 3 month bender did it for you? nice!","RT @LukeRomyn \"Bite me\" is a term appropriate for almost any situation... almost. - You said that once during fellatio, didn't you?","RT @bridgetmcmanus @DinoKaren Unicorn pink? I thought unicorns were purple. - Some pink. Some purple. . .Some blue.","RT @cdnmathfish @alydenisof If you're chubby, then I'm a sea cucumber, or a unicorn. Or both. - Well, since I'm a unicorn, she's safe.","RT @GlamourWounds @BluePudding483 one timei had a dream about a zebra unicorn who pooped like a dog!!!! - Naw. that was me in disguise.","RT @evafilomena ...Anything w a unicorn reference is top in my books - WOO! Wait, does that include me?","!@wickedlpixie that's Lindsay's story? ha! I would suggest she now could hang out with Roman Polanski. . .but she's too old.","RT @PanicAtTheBoy @fuckyeahwolfboy what about a nice unicorn ? :D Or a monkey :D - Or. . .a unicorn spanking the monkey?","I see tattoos like this and feel better about myself or. . .turned on? http://myturl.com/0pB9u","RT @roythejackalope @myklroventine Rookie mistake: NEVER invite a unicorn to your birthday party - He's not kidding. We'll drink EVERYTHING!","RT @StephNunneley /facepalm http://store.bonetown.com/storefront/ - If they were smart they'ld make it an MMORPG!","RT @boardopboy @unimancorn, this true? RT @JerryThomas: Unicorns hate playing horseshoes on many levels - Totally true. one level is easier","RT @Vivka: Busey @unimancorn shows you the dance. http://twitpic.com/1pj7pq","RT @bobford @briankeene You may be right. I just passed a truck with a dead unicorn tied to the hood. - Whoa! I'll be staying away then.","RT @HeartsofTrees @limecrime There's tons more of unicorn man here..so ridiculous..haha: http://tinyurl.com/2e2sscq - The pics keep leaking!","RT @5and1 @Leprakans my daughter insists that she has a sister named Rainbow. Rainbow is a unicorn!- your daughter is at least half unicorn?","RT @iamfender @actuallyNPH on a unicorn: http://i.imgur.com/WOzVs.jpg - Now. . .where's @actuallyNPH on a @unimancorn pic?","RT @QueenofSpain @ritaarens I think my unicorn is transgendered, just so you know. - Sooo. . .where does a unicorn go for that surgery? vet?","RT @HadoukenUK OMG saw an actual unicorn!!!... oh no, it's just a horse wearing party hat. - Nope. A unicorn disguised as a horse in a hat."],"jzawodn":[null,"wow! Ubuntu 10.4 boots up FAST #ubutnu","upgrading my cl desktop to 64bit Ubuntu 10.4: WIN. Forgetting to install ssh server: FAIL","DayQuil LiquiCaps(R) and Ricola are my friends today. sigh.","WTF did eBay bill me $50.50 for \"monthly seller fees\"?!?!"],"gvanrossum":[null,"Only one day to go until my talk at #io2010 about Appstats. Wave: http://bit.ly/bNFJqW . #appengine1","My #io2010 talk on Appstats for #appengine1 starts in 80 minutes. New Wave url: http://bit.ly/appengine1 -- ask questions online!","Wave is now open to all!","Notes from my #googleio #io2010 talk about Appstats are up in Wave: http://bit.ly/appengine1"],"derrakostovic":[null,"1/2 day of work then it's family time. What kind of crazy memory can we make this weekend?!","Is trying to decide if it's bad to drink sweet tea for breakfast."],"siddfinch":[null,"\"The server *seems* unavailable\", Me: \"It was decomm'd two years ago\", \"So, when will be be available again?\", Me: \"Friday\" #lie","RT @tsgnews: Ohio teen busted for assaulting, spitting blood on cops at her H.S. prom: http://www.thesmokinggun.com/archive/years/2010/0 ... -- http://twitter.com/siddfinch/status/14232598230","Jason Donald, welcome to the big leagues. Assuming, of course, you plane is on time.","@mhebrank No, FORTRAN can do so much and is a great language for web programming #mylawngetoffit","Hmm, wonder how this http://myturl.com/0pB8h would be treated if s/NFL/MLB/g","@unimancorn Does that mean he has to pick up the bar tab then?","@benjaminws @mcrute: Oh RPM, how you vex me with your inability to deliver the functionality that deb's have had since their inception.","RT @TweetDeck: Twitter is currently experiencing major problems. Lets all be cool and hope they get it sorted soon :)","RT @BenBadler: I hope teams avoid signing teenagers with bad makeup. could end up with a guy like Hanley Ramirez | Or Tammy Fay Barker","RT @hoynsie: Cabrera underwent surgery on l forearm today. Out 8 to 10 weeks.","RT @castrovince: Asdrubal Cabrera out 8-10 wks following forearm surgery. Grady Sizemore out at least 15 days (DL move) w/left knee bone ... -- http://twitter.com/siddfinch/status/14314654736","When asked about the Cabrera/Peralta collision, Former mgr Eric Wedge, \"Jhonny is a grinder, finding new ways to hurt the team\"","It's Friday, I have the day off, and more things to do then if I was at work. Still, it is a 3 day weekend! #woohoo #fb"],"dangoor":[null,"RT @jeresig: HUGE news regarding open web video: http://j.mp/bWDxec VP8 codec opened up","Chrome Web Store is not at all how I'd envision a web app store working.","RT @commonjs: RT @commonjs: Daniel Buchner introduces CommonJS modules in the context of Mozilla Jetpack http://mzl.la/9MtBhd","RT @mozlabs: An Open Web App Store - Let’s start the discussion. What do you think is important? http://cot.ag/9pOOqc"],"thegreenhouse":[null,"checking out the @BelvedereNYC online before I check in tomorrow. Looking forward to being back in the city & cooking at Lincoln Center","http://tweetphoto.com/23050013 On my to NYC, the picture is man/boy from continental emergency exit book. He always freaks me out!","Dear @katekrader, I'm in NYC for 3 days, are you free tomorrow night? I am dying to eat at Torrisi!!!'n","http://tweetphoto.com/23067965 Now that's a plowsman lunch!","Cool article featuring some of this year's Food & Wine Best New Chefs (including Cleveland's own Jonathon Sawyer) http://bit.ly/bUwQox","WOW Motorino is still the king of NYC pizza. Thanx Allysa","Good Morning Family, Catcher Louisiana, Amelia, Potato & Vito http://tweetphoto.com/23186822 Daddy misses and loved you!"],"melindajacobs":[null,"Oh classic Penguin Chat, how I miss you. Music throwback with Tas 1000's \"I've Been Delayed\" http://bit.ly/5OegBy Love it.","Another Tas 1000 classic, \"Protein Shoes\": http://bit.ly/aqUSvp","All of Tas 1000 songs were created from an old answering machine tape the group found at a yard sale.","At #nmediaus getting ready to hear Greg Shapiro speak.","At \"New Media & Journalism\" #nmediaus"],"dstanek":[null,"@mcrute :-( no tests for any of your snake-guice code","@mcrute i was thinking more of changeset 03eb05fb36","@mcrute i must be missing something","@mcrute I already know where you stand #iFollower","how can people can work standing up? i've been doing it for the last hour and i'm finding it increasingly difficult to concentrate",".@natw maybe it's just not for me; have you tried it?",".@scottfweintraub yeah, but i was able to concentrate more when i was sitting and my kids were yelling; not it's quiet and i'm standing","coughing uncontrollably to catch your breath is really an awesome stomach workout #fb",".@julio_menendez show no fear when looking into the eyes of the beast","i just want to parse rst into a data structure; this shouldn't be hard, but i don't see any relevant documentation; time to dive into code","@bikegriffith i don't have your blog running on port 4000","docutils fail - it is so much easier to parse rst with regular expressions","@benjaminws not man enough to handle it?","i'm going to make a Python roo clone and name it poo #googleio","@benjaminws put your tweet away; you're scarring the children","@mcrute was looking at werkzeug; i hate decorators for specifying URL routing and security requirements","@benjaminws decorators statically bind the view/controller to a particular URL; that normally reduces its reusability","@mcrute i was looking at http://werkzeug.pocoo.org/documentation/dev/tutorial.html#part-2-the-utilities","@mcrute i want a routing API that makes it just as easy to do something like: HttpRedirect(location=DomainObject); no hardcoding urls","@mcrute and most url_for type things suck","@mcrute i'm working on some code for it - if you're interested ask me again tomorrow","@garybernhardt django's is close to what i want; it's the one i like the best","@mcrute haha, yes; i'm finishing up a restful API for a friend and that's exactly what i'm doing","@garybernhardt urlconf's reverse function is cool, but i want to take a module and generate a url for it","@mcrute lol, simple f* up","@mcrute it's because i originally wasn't using itertools for grouping - so when i broke apart the for loops kaboom!","@mcrute re-running now :-)","@mcrute fixed. i attached the newest version of that script to the page. not sure if you saw the old version","@benjaminws yourself","@benjaminws twitter can't fix itself; how can you expect it to fix you?","@garybernhardt is your TDD class suitable for people without a ton of exposure to \"clean code\" or is there some prerequisite knowledge?","I may have to work late tonight :( I guess it's better than working the weekend #fb","@catherinedevlin @mw44118 do we have one in mind?"],"judyz":[null,"Being unemployed never sounded so good http://post.ly/gVeU","Scheduled a hair appt (long overdue) at Stlyus. I hope I get the same treatment like I experienced with Kristin in Ohio."],"unclebobmartin":[null,"About to start \"Clean Code III: Functions\". Always a hoot.","Wheels down EWR. A day of talks. Should be fun.","Off to Omaha. TDD course in Java.","Wheels down OMA.","Good morning Omaha!","Refactoring should never appear as a task on a schedule. Keeping code clean is just something that you do all the time.","Devs in my TDD class are more experienced in TDD than usual, so I've significatnly altered the curriculum to suit their needs.",". @fearphage You don't _find_ the time to refactor! Refactoring saves more time than it takes. Refactoring is what makes you go fast.",". @myfear Refactoring is the process by which code is kept clean. There is no clean code without refactoring.",". @myfear Refactoring on the project schedule is an excuse to make a leave the mess till later.",". @wmartinez You take refactoring into account by _shortening_ your estimates. Refactoring makes you go faster!",". @anshulbajpai You _can_ mock domain objects. If domain object A uses domain object B, then mock B while testing A.",". @davidjmemmett Only the very foolish waste time by _not_ refactoring.",". @catenate Please don't keep track of refactoring time. Don't put it into Pivotal as a chore. Red-Green-Refactor every minute.",". @admitriyev You make refactoring a habit by demanding high quality from devs at every instant. Explicit tasks encourage the opposite.",". @gregharley Refactoring is not a task in my reality. I still have bad dreams about the times when refactoring was a task.",". @jdegoes Keeping code clean is never a waste. There is no short/long term trade-off.",". @SolidSyntax Five PrimeFactor Katas and get a green band. cleancodeproject.com",". @gregharley <grin> Refactoring: Never a task! Always a joy.",". @kragen Martial artist: I'm too busy fighting. There's no time to practice. I keep getting the snot kicked out of me. Why?",". @LDribin Major changes to functionality should be scheduled, of course. Major changes to design should be incremental and unscheduled.","The walls between art and engineering exist only in our minds. Theo Jansen."],"dgou":[null,"Nice! RT @garybernhardt: Blogged: \"The Tar Pipe\" (a story about how Unix works) http://bit.ly/aMerxo","RT @vanyc http://www.stovetec.net/us/ \"Not All Stoves Are Created Equal StoveTec Stoves burn cleaner, use less fuel, & are more economical\"","RT @PghLesbian24: Happy Birthday to my @Ledcat!","RT @aezellisdead: Just bold-faced lying. -> NYTimes: Candidate’s Words on Vietnam Service Differ From History http://nyti.ms/d5xjMh","RT @carljm: Fraudonomics: http://www.nypress.com/article-21163-fraudonomics.html #bankshowdown","RT @StonewallPGH So here we we go...Election Day is today! Be sure to check out or endorsed and recommended candidates: http://bit.ly/d9f3vS","Off to vote, then work.","RT @projectsugru: sugru is going to @makerfaire ! http://sugru.com/blog/","RT @Brinstar @TheSexist: how chivalry encourages women to internalize misogyny: http://bit.ly/ayhO5E [This is a really awesome article.]","Once your \"coding style guidelines\" involve indentation, you've made some other syntax a redundant distraction. Python gets that right.","RT @schmarty: @cjyohe Dude, nice!","@garybernhardt good enough to implement \"tar\" pipeline-shell example in python? (haven't tried using it myself yet)","RT @myrddinthegeek @moleculo: A good compilation of Dayton Hamvention 2010 videos and pics: http://bit.ly/9DT948 #hamradio #hamr","Uh, robot avatars? RT @nedbat: The next phase of telecommuting: http://anybots.com/ Fascinating.","RT @pittmfug: Our May meeting is on Thursday. Come talk CS5 and win software! http://is.gd/ceCVW","Whoa, can run virtual Mac OS X!? RT @skim: new VirtualBox version 3.2.0.61806 is out http://www.virtualbox.org/wiki/News","RT @...: BP has lost all enviro goodwill it ever generated with it's solar programs. http://bit.ly/bWjDBg Threatening journos now.","RT @myrddinthegeek @moleculo: A good compilation of Dayton Hamvention 2010 videos and pics: http://bit.ly/9DT948 #hamradio #hamr","RT @clmerle @pourmecoffee 800 VA scientists sign letter opposing AG Cuccinelli's witch hunt against climatologist. http://bit.ly/99vOPs","RT @carljm: \"This is not a two-week story, but a hundred-year story.\" Gulf oil and Gulf coast Native peoples: http://bit.ly/aBvmGx","RT @...: Of course this exists: a download-based sheet music store! (new to me) http://bit.ly/d9NIfM","RT @aimeemann: You know, I love this Prius, but it has so many blind spots I might as well be driving with a white cane.","Wondering if should skip Dvorak and go straight to http://colemak.com/ ... well, just wondering when I can afford the hit to switch.","@garybernhardt Heh. Hey, how did your JK->() remapping work out?","RT @malcolmt: Worth reading for thought: an alternate and well written view on the Thai protests... http://tinyurl.com/33tbuws .","What is COBOL was your scripting language? // % remove file named 'sample.pyc' // % search every file named '*.c' for the string 'malloc('","Flat panels have won. CRTs are dead. Vacuum tube based displays... suck.","RT @EdLeafe: When is a terrorist not a terrorist? When they are white Christians! http://bit.ly/9PnkjB (via @trueslant)","Yay! RT @aclupa: ACLU representing anonymous #Twitter critics of Tom Corbett: http://bit.ly/c6z2pV #freespeech #pagovt","Il buono, Il cattivo, Il brutto - Ennio Morricone","RT @clmerle From 1929-1939 two-million individuals were forcibly repatriated to Mexico. 60% were American citizens http://n.pr/bVjt14","RT @coreyhaines: Pairing on ENIAC! Jean Bartik tells how you should program: http://vurl.me/RQP :)","@catherinedevlin Yay!","RT @byrnegreen: Must watch re: BPs incompetent response (Audio NSFW, Video NSF BP) http://bit.ly/cCLAVP via/@leashless","RT @ninajansen: Incredible Image: Atlantis and ISS Transit the Sun http://ff.im/-kHBGS","Having lunch at http://www.thecafencreamery.com/ (website admin just left, site is being revamped)."],"bstanek":[null,"The kids are watching Care Bears Movie II - I still say that Darkheart is one freaky motherf***er"],"venkat_s":[null,"Wrapping up Essence of Agility ( http://tinyurl.com/2d9tjhf ) course in Bangalore. Amazing participation from this multinational team.","Completing my 3rd trip to Bangalore this year. Just got word I will be back in Hyderabad in July.","Learning a lib, a lang is easy. To improve code & change development style is hard-requires discipline & great self awareness.","It is OK to break the build, it is not OK to leave it broken. blogged http://tinyurl.com/2vzml46","Landed in ORDeal, problem with cargo door, delayed by 2 hours. Still waiting. So close, yet so far away...","cd ~; sleep overnite; cd nfjsSTL","Now to this wonderful place called home."],"mfeathers":[null,"RT @niclasnilsson: Brilliant! RT @anoras: This clock is ingenious! http://www.bringtim.com/","jeffpatton","Twitter eats itself with a Markov chain: http://bit.ly/bcpWIh","One of the cool things about having all of the nerves pulled out of your tooth is that doesn't hurt anymore. There are other cool things too"],"doughellmann":[null,"Raccoons in the garbage again. Ugh.","Just added an awk command to our Makefile. Haven't done *that* in 10 years.","Working with Windows this morning has me out of my \"comfort zone\" and in my \"stabby zone\".","WANT! The next phase of telecommuting: http://anybots.com/ (via @nedbat)","Looking at tax paperwork while Windows installed. Because that's how my day is going.","@voidspace @gregnewman I use GR to find, and Instapaper to consume.","@voidspace I mean I go through my feeds and move anything long to IP to read later. It keeps the backlog from growing too large."],"leandog":[null,"@LeanDog looking for Java | C# | Ruby | Web Design. Agile passion (entry 2 expert) Travel req. http://bit.ly/94A3Dk"],"akuchling":[null,"RT @nytimesscience: Time to Review Workplace Reviews? http://nyti.ms/ahM7Bo","Oil enters the Loop Current & is headed to the Florida Keys http://bit.ly/9SNx25 (it was hoped winds would keep the oil out for a bit)","RT @Doris_Egan: Wow! In Hollywood, the truth that dare not speak its name. http://tinyurl.com/2aelocl","Obit: Richard E. LaMotta, inventor of the Chipwich ice cream sandwich http://www.nytimes.com/2010/05/16/business/16lamotta.html","Work: milestone! our product runs on Ubuntu Lucid (albeit in stumbling fashion) for the first time.","\"The Mummy\" (1932): Some effective pieces (Karloff, dragging bandages, statue of Isis) but the weakest of the Universal monster films. 3/5","Focus on the Family at hotel across street; saw no rentboys, though.","The mascots for the London 2012 Olympics are really weird, yet also boring http://bit.ly/bqRHn1","RT @raypride: 86-year-old Brit spent 8 years working on massive jigsaw puzzle; discovers a single piece is missing. http://bit.ly/bASDB1","Work: fire drill!","Good podcast-editing session; still need to record outro and then adjust the volume levels.","Amusing: '...they \"fit in.\" There's no way of differentiating someone from Canada from, say, someone from Michigan.' http://bit.ly/aXK40I","Work: waiting for bzr to complete copying a Mailman branch. <sigh>","No longer waiting for bzr checkout; now waiting for Launchpad to display a bug. Head->desk."],"dowskimania":[null,"i'm so glad this site is still up. i don't know what i'd do with an internet without http://www.zombo.com. #fb","RT @XIANITY: HISTORY: New ancient documents reveal early church fathers more like wacky uncles.","well bitbucket seems fast again. perhaps i was just impatient the other day.","i do not like archive files that expand to anything more than a single file or subdirectory.","RT @lawouach: ah ah #pacman on Google's home page. Bravo I say, Braaaaaaaaaavo!"],"andrew_holland":[null,"Heading to Asheville, NC this coming weekend for the first of the \"test\" events leading to Leadville. The road... http://bit.ly/cKxTt7","Four days till the Assault on Mitchell . . . Legs are feeling better after being pretty dead this past weekend. I... http://bit.ly/cDx1cp"],"feliciaday":[null,"Shooting at the house of @gregaronowitz today, so got to bring my dog Cubby to work on The Guild! http://yfrog.com/7b992rj","9th day of shooting and I finally had the sobbing breakdown over stress and scheduling! Yay! Thankfully I have a @kimevey to talk me down :)","Video from the world's only sloth orphanage: http://vimeo.com/11712103","I will be making an appearance in Torrance, CA Friday - had to reschedule (orig was today). Details: http://bit.ly/a5OZg6 /via @theguild","RT @tonyjanning: The 4th episode of 'Webventures' is up. Featuring @alexalbrecht @sandeepparikh @feliciaday and more! http://bit.ly/dgRr7s","So tired I've spent the last 45 minutes trying to decide what to do with the next hour and a half. Another 45 and I won't have to decide.","RT @theguild: Two more cast members will join Felicia tomorrow at the Season 3 DVD signing in Torrance (LA area) http://bit.ly/bXIdHV","Things not needed in a public restroom: advanced technology toilet seats. Absolutely freaked out when I sat down and the seat was VERY WARM!","Best Illusion of the Year Contest: http://illusioncontest.neuralcorrelate.com/cat/2010/","RT @popurls: Have you seen Google's homepage today? Totally Pac-Man!! http://pop.is/mp4z"],"mw44118":[null,"rest question: My game object has two text/plain views: summarized and detailed. What's the right way to specify the view in the request?","@garyberhardt: right, what should the two URLs look like?","RT @FarmerHaley: Q7 - dont go to the movies or google to get your facts about farms! ask a farmer! @followfarmer http://bit.ly/FFarmer # ... -- http://twitter.com/mw44118/status/14265307679","RT @selenamarie: OMG PostgreSQL is moving to git! august/september-ish! #pgcon","RT @bcwoods: OMG, the videos at www.coldsteel.com are like sword porn to me.","I love how primitive the SAS world is -- paper manuals, preprocessing macros, fixed-width data feeds, and the mailing list still uses NNTP.","@pperon: efficient collision detection and finding shortest path through a graph are common game tasks and really nasty problems.","@pperon -- haha, no; when I tried to write a few games, those are what stopped me. I've been researching those topics for the last 9 years.","What's going on with the #pyohio talk reviews? Are more still needed?","If you're already using a tuple, you might as well use a namedtuple and provide some meaningful names for the different elements. #python","@dstanek, @catherinedevlin: I sent in two talk proposals so far; at this point, I'm tapped out :)"],"durin42":[null,"At elephant and castle, waiting out front for other #NSLunch people.","Home of the first usenet server shuts down their usenet service: http://bit.ly/a5wuaE","Today's the 30th birthday of both Empire Strikes Back and PAC-MAN. Lazyweb: where's the mashup game?"],"martinfowler":[null,"some thoughts on lessons from Facebook/Twitter on enterprise development: http://bit.ly/b8eoOb","Me too! RT @dtsato: Latest from #AgileBrazil: 450 registered! This will be the biggest Agile event in Brazil. I'm excited to be part of it!","RT @jimwebber: The feature-complete Rough Cut of #RESTinPractice is now available: http://my.safaribooksonline.com/9781449383312","Working on some revisions to the DSL book triggered by Eric Evans's review.","RT @tackers: The Guardian's Open Platform is now open for business http://bit.ly/16G05Y #openplatform /via @openplatform"],"mrdomino":[null,"So who else is still in Cleveland?","Suddenly everything about pop music makes sense to me. http://www.wired.com/listening_post/2008/05/survey-produced/","Let the relaxinating begin.","Hey, cool—jsprettify just got mentioned by @smashingmag. Hope the bookmarklet still works…","#ff @TweetOvermind is a Markov chain that learns from the public tweet timeline and tweets randomly-generated text once an hour."],"officialbrowns":[null,"From our archive room. Former Browns Coaches Marty Schottenheimer and Bill Belichick shake hands after a game. http://twitpic.com/1ow10b","http://bit.ly/9gR5ut The Akron Browns Backers held their annual banquet at Tangier Restaurant Monday evening.","http://bit.ly/aCdrES Follow Joshua Cribbs' journey on graduation day at Kent State University.","http://bit.ly/9VJTe2 Browns OL Joe Thomas visited local students last Friday afternoon to support their efforts to help the Cleveland APL.","Browns coach Eric Mangini is currently hosting his first press conference during OTAs (Organized Team Activities).","Mangini on QBs: Right now, Jake and Seneca are getting the bulk of the reps and Colt and Brett are getting the third team reps.","Mangini on Delhomme: He's got a great repore with the offensive guys and defensive guys.","http://bit.ly/9vaXWn Browns coach Eric Mangini expects leadership from his veterans.","http://bit.ly/aSHy8A New Browns TE Benjamin Watson is looking to improve every day in practice and help the team win games.","From our archive room. 1974 Second Round Draft pick Billy Corbett goes over blocking assignments with Forrest Gre http://twitpic.com/1pg2hn","http://bit.ly/aeFjOH Browns QBs Seneca Wallace and Jake Delhomme are ready to compete."],"iamamish":[null,"Complexity of Chess, with Ken Thompson. Interesting even for non-chess players like me: http://bit.ly/bpa5bB","Not the good kind of tar balls I expect: http://slatest.slate.com/id/2254194/entry/6/","Wonders why tweetdeck auto-shortens URLs in desktop version with no bit.ly login, but won't in the iPhone version...","@benjaminws You should totally blog whatever it is that you did to fix it. For the good of humanity.","@benjaminws yup, that's what mgriffith found - build tun module, install sun-java6-jdk, and you're ready to go. Thought was 32-bit only...","A story of bad incentives: http://bit.ly/aBSKMu","running pylint on my first soon-to-be-prod python code; scoring system is bad for my self-esteem. On to see what it is complaining about.","Bon Jovi? Really? http://yhoo.it/cyPcVU"]},"unimancorn":[null,"14224125135","14227364342","14227582826","14233024077","14237294141","14243432923","14243523604","14243575185","14252899896","14255248092","14259451289","14260535699","14265830233","14266189373","14293863265","14293899734","14300464581","14303654163","14304270509","14308670790","14308828441","14309000776","14312748821","14312810034","14318207544","14338195985","14338930736","14339068470","14360717570","14367087198","14373809931","14374537599","14374603251","14384276953","14384362343","14395894726","14397556282","14422133533","14433410054","14433577447","14438285980","14438874778","14439031465"],"jzawodn":[null,"14249879209","14302025308","14329158503","14330733324"],"gvanrossum":[null,"14230962919","14303392431","14305365355","14315552638"],"derrakostovic":[null,"14420488735","14422075965"],"siddfinch":[null,"14227139708","14232598230","14234374354","14240725106","14242925132","14243526575","14296184247","14299429610","14309635143","14314613690","14314654736","14367591067","14421651530"],"dangoor":[null,"14306037063","14307437616","14316388372","14396266301"],"thegreenhouse":[null,"14273039681","14290618159","14291587293","14301463537","14312995855","14354221424","14355218747"],"melindajacobs":[null,"14251935675","14252006493","14252081449","14419409596","14422270686"],"dstanek":[null,"13641430695","13672738096","13673931475","13882626982","14234881196","14236231587","14236364768","14238213199","14239602263","14259804569","14260146984","14262810497","14268187480","14306411510","14329293829","14329457396","14330367843","14330408780","14331006503","14331021452","14331602271","14331997284","14332324609","14332466861","14333925375","14334082476","14334131881","14334437453","14335792483","14336884524","14372365367","14427938992","14434872753"],"judyz":[null,"14249301641","14313807784"],"unclebobmartin":[null,"14230810353","14225337651","14258975410","14271755581","14293041621","14293077774","14319990438","14320267184","14321114720","14321186172","14321222945","14321283296","14321364508","14321516364","14321676243","14321826801","14321890837","14322012231","14322495964","14322612946","14360564733","14423926520"],"dgou":[null,"14225127995","14225691662","14225876584","14225990451","14227676493","14228213626","14229499221","14239513826","14239752068","14239922282","14248215013","14251801128","14296606798","14302342171","14309058808","14315025580","14320545727","14335749828","14335875338","14335952327","14336835025","14340601956","14340896919","14341197092","14359953369","14363330652","14365209058","14365280003","14381267831","14397380872","14405775185","14430046349","14430616984","14437395179","14438450960","14438527658"],"bstanek":[null,"14319838105"],"venkat_s":[null,"14237236177","14237486630","14240513089","14241365786","14390553787","14396551637","14398476845"],"mfeathers":[null,"14222814519","14404361565","14436699177","14440742792"],"doughellmann":[null,"14225919699","14237176178","14299936511","14300396472","14309942148","14365104074","14365591800"],"leandog":[null,"14434674272"],"dowskimania":[null,"14240745558","14248569858","14298911028","14370009951","14435760631"],"akuchling":[null,"14231827994","14225876054","14226272124","14235357265","14247918887","14293021208","14317266494","14325442247","14333779457","14365367765","14395362906","14425995177","14429897987","14431286788"],"andrew_holland":[null,"14291046555","14353620712"],"feliciaday":[null,"14250257171","14273394966","14273763248","14320981329","14332198809","14332840960","14378585103","14381224455","14434072347","14437364918"],"mw44118":[null,"14225459741","14243128580","14265307679","14307884706","14397573689","14397953115","14398903793","14401921833","14424829164","14427477051","14438850054"],"durin42":[null,"14307191084","14395869998","14435609496"],"martinfowler":[null,"14248532473","14253728817","14297152323","14308020014","14356617860"],"mrdomino":[null,"14243217696","14246152223","14261704880","14329459468","14438990295"],"officialbrowns":[null,"14232309332","14240638771","14246493931","14249874692","14297671035","14297830601","14298596010","14313017269","14362844566","14376447543","14378838305"],"iamamish":[null,"14234496211","14256593077","14256753529","14269459491","14270240841","14303071084","14366124559","14441322422"]} \ No newline at end of file
diff --git a/.irssi/scripts/twirssi.pl b/.irssi/scripts/twirssi.pl
deleted file mode 100644
index 813aeb1..0000000
--- a/.irssi/scripts/twirssi.pl
+++ /dev/null
@@ -1,1906 +0,0 @@
1use strict;
2use Irssi;
3use Irssi::Irc;
4use HTTP::Date;
5use HTML::Entities;
6use File::Temp;
7use LWP::Simple;
8use Data::Dumper;
9use Encode;
10$Data::Dumper::Indent = 1;
11
12use vars qw($VERSION %IRSSI);
13
14$VERSION = "2.3.3";
15%IRSSI = (
16 authors => 'Dan Boger',
17 contact => 'zigdon@gmail.com',
18 name => 'twirssi',
19 description => 'Send twitter updates using /tweet. '
20 . 'Can optionally set your bitlbee /away message to same',
21 license => 'GNU GPL v2',
22 url => 'http://twirssi.com',
23 changed => '$Date$',
24);
25
26my $window;
27my $twit;
28my %twits;
29my $user;
30my $defservice;
31my $poll;
32my $last_poll;
33my $last_friends_poll = 0;
34my %nicks;
35my %friends;
36my %tweet_cache;
37my %id_map;
38my $failwhale = 0;
39my $first_call = 1;
40my $child_pid;
41my %fix_replies_index;
42
43my %irssi_to_mirc_colors = (
44 '%k' => '01',
45 '%r' => '05',
46 '%g' => '03',
47 '%y' => '07',
48 '%b' => '02',
49 '%m' => '06',
50 '%c' => '10',
51 '%w' => '15',
52 '%K' => '14',
53 '%R' => '04',
54 '%G' => '09',
55 '%Y' => '08',
56 '%B' => '12',
57 '%M' => '13',
58 '%C' => '11',
59 '%W' => '00',
60);
61
62sub cmd_direct {
63 my ( $data, $server, $win ) = @_;
64
65 return unless &logged_in($twit);
66
67 my ( $target, $text ) = split ' ', $data, 2;
68 unless ( $target and $text ) {
69 &notice("Usage: /dm <nick> <message>");
70 return;
71 }
72
73 &cmd_direct_as( "$user $data", $server, $win );
74}
75
76sub cmd_direct_as {
77 my ( $data, $server, $win ) = @_;
78
79 return unless &logged_in($twit);
80
81 my ( $username, $target, $text ) = split ' ', $data, 3;
82 unless ( $username and $target and $text ) {
83 &notice("Usage: /dm_as <username> <nick> <message>");
84 return;
85 }
86
87 return unless $username = &valid_username($username);
88
89 eval {
90 if ( $twits{$username}
91 ->new_direct_message( { user => $target, text => $text } ) )
92 {
93 &notice("DM sent to $target: $text");
94 $nicks{$target} = time;
95 } else {
96 my $error;
97 eval {
98 $error = JSON::Any->jsonToObj( $twits{$username}->get_error() );
99 $error = $error->{error};
100 };
101 die $error if $error;
102 &notice("DM to $target failed");
103 }
104 };
105
106 if ($@) {
107 &notice("DM caused an error: $@");
108 return;
109 }
110}
111
112sub cmd_retweet {
113 my ( $data, $server, $win ) = @_;
114
115 return unless &logged_in($twit);
116
117 $data =~ s/^\s+|\s+$//;
118 unless ($data) {
119 &notice("Usage: /retweet <nick[:num]> [comment]");
120 return;
121 }
122
123 my ( $id, $data ) = split ' ', $data, 2;
124
125 &cmd_retweet_as( "$user $id $data", $server, $win );
126}
127
128sub cmd_retweet_as {
129 my ( $data, $server, $win ) = @_;
130
131 unless ( Irssi::settings_get_bool("twirssi_track_replies") ) {
132 &notice("twirssi_track_replies is required in order to reteet.");
133 return;
134 }
135
136 return unless &logged_in($twit);
137
138 $data =~ s/^\s+|\s+$//;
139 my ( $username, $id, $data ) = split ' ', $data, 3;
140
141 unless ($username) {
142 &notice("Usage: /retweet_as <username> <nick[:num]> [comment]");
143 return;
144 }
145
146 return unless $username = &valid_username($username);
147
148 my $nick;
149 $id =~ s/[^\w\d\-:]+//g;
150 ( $nick, $id ) = split /:/, $id;
151 unless ( exists $id_map{ lc $nick } ) {
152 &notice("Can't find a tweet from $nick to retweet!");
153 return;
154 }
155
156 $id = $id_map{__indexes}{$nick} unless $id;
157 unless ( $id_map{ lc $nick }[$id] ) {
158 &notice("Can't find a tweet numbered $id from $nick to retweet!");
159 return;
160 }
161
162 unless ( $id_map{__tweets}{ lc $nick }[$id] ) {
163 &notice("The text of this tweet isn't saved, sorry!");
164 return;
165 }
166
167# Irssi::settings_add_str( "twirssi", "twirssi_retweet_format", 'RT $n: $t ${-- $c$}' );
168 my $text = Irssi::settings_get_str("twirssi_retweet_format");
169 $text =~ s/\$n/\@$nick/g;
170 if ($data) {
171 $text =~ s/\${|\$}//g;
172 $text =~ s/\$c/$data/;
173 } else {
174 $text =~ s/\${.*?\$}//;
175 }
176 $text =~ s/\$t/$id_map{__tweets}{ lc $nick }[$id]/;
177
178 my $modified = $data;
179 $data = &shorten($text);
180
181 return if &too_long($data);
182
183 my $success = 1;
184 eval {
185 if ($modified) {
186 $success = $twits{$username}->update(
187 {
188 status => $data,
189
190 # in_reply_to_status_id => $id_map{ lc $nick }[$id]
191 }
192 )
193 } else {
194 $success = $twits{$username}->retweet(
195 {
196 id => $id_map{ lc $nick }[$id]
197 }
198 )
199 }
200 &notice("Update failed") unless $success;
201 };
202 return unless $success;
203
204 if ($@) {
205 &notice("Update caused an error: $@. Aborted");
206 return;
207 }
208
209 foreach ( $data =~ /@([-\w]+)/ ) {
210 $nicks{$1} = time;
211 }
212
213 &notice("Retweet sent");
214}
215
216sub cmd_tweet {
217 my ( $data, $server, $win ) = @_;
218
219 return unless &logged_in($twit);
220
221 $data =~ s/^\s+|\s+$//;
222 unless ($data) {
223 &notice("Usage: /tweet <update>");
224 return;
225 }
226
227 &cmd_tweet_as( "$user\@$defservice $data", $server, $win );
228}
229
230sub cmd_tweet_as {
231 my ( $data, $server, $win ) = @_;
232
233 return unless &logged_in($twit);
234
235 $data =~ s/^\s+|\s+$//;
236 $data =~ s/\s\s+/ /g;
237 my ( $username, $data ) = split ' ', $data, 2;
238
239 unless ( $username and $data ) {
240 &notice("Usage: /tweet_as <username> <update>");
241 return;
242 }
243
244 return unless $username = &valid_username($username);
245
246 $data = &shorten($data);
247
248 return if &too_long($data);
249
250 my $success = 1;
251 eval {
252 unless ( $twits{$username}->update($data) )
253 {
254 &notice("Update failed");
255 $success = 0;
256 }
257 };
258 return unless $success;
259
260 if ($@) {
261 &notice("Update caused an error: $@. Aborted.");
262 return;
263 }
264
265 foreach ( $data =~ /@([-\w]+)/ ) {
266 $nicks{$1} = time;
267 }
268
269 my $away = &update_away($data);
270
271 &notice( "Update sent" . ( $away ? " (and away msg set)" : "" ) );
272}
273
274sub cmd_reply {
275 my ( $data, $server, $win ) = @_;
276
277 return unless &logged_in($twit);
278
279 $data =~ s/^\s+|\s+$//;
280 unless ($data) {
281 &notice("Usage: /reply <nick[:num]> <update>");
282 return;
283 }
284
285 my ( $id, $data ) = split ' ', $data, 2;
286 unless ( $id and $data ) {
287 &notice("Usage: /reply <nick[:num]> <update>");
288 return;
289 }
290
291 &cmd_reply_as( "$user $id $data", $server, $win );
292}
293
294sub cmd_reply_as {
295 my ( $data, $server, $win ) = @_;
296
297 unless ( Irssi::settings_get_bool("twirssi_track_replies") ) {
298 &notice("twirssi_track_replies is required in order to reply to "
299 . "specific tweets. Either enable it, or just use /tweet "
300 . "\@username <text>." );
301 return;
302 }
303
304 return unless &logged_in($twit);
305
306 $data =~ s/^\s+|\s+$//;
307 my ( $username, $id, $data ) = split ' ', $data, 3;
308
309 unless ( $username and $data ) {
310 &notice("Usage: /reply_as <username> <nick[:num]> <update>");
311 return;
312 }
313
314 return unless $username = &valid_username($username);
315
316 my $nick;
317 $id =~ s/[^\w\d\-:]+//g;
318 ( $nick, $id ) = split /:/, $id;
319 unless ( exists $id_map{ lc $nick } ) {
320 &notice("Can't find a tweet from $nick to reply to!");
321 return;
322 }
323
324 $id = $id_map{__indexes}{$nick} unless $id;
325 unless ( $id_map{ lc $nick }[$id] ) {
326 &notice("Can't find a tweet numbered $id from $nick to reply to!");
327 return;
328 }
329
330 if ( Irssi::settings_get_bool("twirssi_replies_autonick") ) {
331
332 # remove any @nick at the beginning of the reply, as we'll add it anyway
333 $data =~ s/^\s*\@?$nick\s*//;
334 $data = "\@$nick " . $data;
335 }
336
337 $data = &shorten($data);
338
339 return if &too_long($data);
340
341 my $success = 1;
342 eval {
343 unless (
344 $twits{$username}->update(
345 {
346 status => $data,
347 in_reply_to_status_id => $id_map{ lc $nick }[$id]
348 }
349 )
350 )
351 {
352 &notice("Update failed");
353 $success = 0;
354 }
355 };
356 return unless $success;
357
358 if ($@) {
359 &notice("Update caused an error: $@. Aborted");
360 return;
361 }
362
363 foreach ( $data =~ /@([-\w]+)/ ) {
364 $nicks{$1} = time;
365 }
366
367 my $away = &update_away($data);
368
369 &notice( "Update sent" . ( $away ? " (and away msg set)" : "" ) );
370}
371
372sub gen_cmd {
373 my ( $usage_str, $api_name, $post_ref ) = @_;
374
375 return sub {
376 my ( $data, $server, $win ) = @_;
377
378 return unless &logged_in($twit);
379
380 $data =~ s/^\s+|\s+$//;
381 unless ($data) {
382 &notice("Usage: $usage_str");
383 return;
384 }
385
386 my $success = 1;
387 eval {
388 unless ( $twit->$api_name($data) )
389 {
390 &notice("$api_name failed");
391 $success = 0;
392 }
393 };
394 return unless $success;
395
396 if ($@) {
397 &notice("$api_name caused an error. Aborted.");
398 return;
399 }
400
401 &$post_ref($data) if $post_ref;
402 }
403}
404
405sub cmd_switch {
406 my ( $data, $server, $win ) = @_;
407
408 $data =~ s/^\s+|\s+$//g;
409 $data = &normalize_username($data);
410 if ( exists $twits{$data} ) {
411 &notice("Switching to $data");
412 $twit = $twits{$data};
413 if ( $data =~ /(.*)\@(.*)/ ) {
414 $user = $1;
415 $defservice = $2;
416 } else {
417 &notice("Couldn't figure out what service '$data' is on");
418 }
419 } else {
420 &notice("Unknown user $data");
421 }
422}
423
424sub cmd_logout {
425 my ( $data, $server, $win ) = @_;
426
427 $data =~ s/^\s+|\s+$//g;
428 $data = $user unless $data;
429 return unless $data = &valid_username($data);
430
431 &notice("Logging out $data...");
432 $twits{$data}->end_session();
433 delete $twits{$data};
434 undef $twit;
435 if ( keys %twits ) {
436 &cmd_switch( ( keys %twits )[0], $server, $win );
437 } else {
438 Irssi::timeout_remove($poll) if $poll;
439 undef $poll;
440 }
441}
442
443sub cmd_login {
444 my ( $data, $server, $win ) = @_;
445 my $pass;
446 if ($data) {
447 ( $user, $pass ) = split ' ', $data, 2;
448 unless ($pass) {
449 &notice("usage: /twitter_login <username>[\@<service>] <password>");
450 return;
451 }
452 } elsif ( my $autouser = Irssi::settings_get_str("twitter_usernames")
453 and my $autopass = Irssi::settings_get_str("twitter_passwords") )
454 {
455 my @user = split /\s*,\s*/, $autouser;
456 my @pass = split /\s*,\s*/, $autopass;
457
458 # if a password ends with a '\', it was meant to escape the comma, and
459 # it should be concatinated with the next one
460 my @unescaped;
461 while (@pass) {
462 my $p = shift @pass;
463 while ( $p =~ /\\$/ and @pass ) {
464 $p .= "," . shift @pass;
465 }
466 push @unescaped, $p;
467 }
468
469 if ( @user != @unescaped ) {
470 &notice("Number of usernames doesn't match "
471 . "the number of passwords - auto-login failed" );
472 } else {
473 my ( $u, $p );
474 while ( @user and @unescaped ) {
475 $u = shift @user;
476 $p = shift @unescaped;
477 &cmd_login("$u $p");
478 }
479 return;
480 }
481 } else {
482 &notice("/twitter_login requires either a username and password "
483 . "or twitter_usernames and twitter_passwords to be set." );
484 return;
485 }
486
487 %friends = %nicks = ();
488
489 my $service;
490 if ( $user =~ /^(.*)@(twitter|identica)$/ ) {
491 ( $user, $service ) = ( $1, $2 );
492 } else {
493 $service = Irssi::settings_get_str("twirssi_default_service");
494 }
495 $defservice = $service = ucfirst lc $service;
496
497 eval "use Net::$service 3.05";
498 if ($@) {
499 &notice(
500 "Failed to load Net::$service when trying to log in as $user: $@");
501 return;
502 }
503
504 $twit = "Net::$service"->new(
505 username => $user,
506 password => $pass,
507 source => "twirssi",
508 ssl => Irssi::settings_get_bool("twirssi_avoid_ssl") ? 0 : 1,
509 );
510
511 unless ($twit) {
512 &notice("Failed to create Net::$service object! Aborting.");
513 return;
514 }
515
516 if ( my $timeout = Irssi::settings_get_int("twitter_timeout")
517 and $twit->can('ua') )
518 {
519 $twit->ua->timeout($timeout);
520 &notice("Twitter timeout set to $timeout");
521 }
522
523 unless ( $twit->verify_credentials() ) {
524 &notice("Login as $user\@$service failed");
525
526 if ( not Irssi::settings_get_bool("twirssi_avoid_ssl") ) {
527 &notice(
528 "It's possible you're missing one of the modules required for "
529 . "SSL logins. Try setting twirssi_avoid_ssl to on. See "
530 . "http://cpansearch.perl.org/src/GAAS/libwww-perl-5.831/README.SSL "
531 . "for the detailed requirements." );
532 }
533
534 $twit = undef;
535 if ( keys %twits ) {
536 &cmd_switch( ( keys %twits )[0], $server, $win );
537 }
538 return;
539 }
540
541 if ($twit) {
542 my $rate_limit = $twit->rate_limit_status();
543 if ( $rate_limit and $rate_limit->{remaining_hits} < 1 ) {
544 &notice(
545 "Rate limit exceeded, try again after $rate_limit->{reset_time}"
546 );
547 $twit = undef;
548 return;
549 }
550
551 $twits{"$user\@$service"} = $twit;
552 Irssi::timeout_remove($poll) if $poll;
553 $poll = Irssi::timeout_add( &get_poll_time * 1000, \&get_updates, "" );
554 &notice("Logged in as $user\@$service, loading friends list...");
555 &load_friends();
556 &notice( "loaded friends: ", scalar keys %friends );
557 if ( Irssi::settings_get_bool("twirssi_first_run") ) {
558 Irssi::settings_set_bool( "twirssi_first_run", 0 );
559 }
560 %nicks = %friends;
561 $nicks{$user} = 0;
562 return 1;
563 } else {
564 &notice("Login failed");
565 }
566}
567
568sub cmd_add_follow {
569 my ( $data, $server, $win ) = @_;
570
571 unless ($data) {
572 &notice("Usage: /twitter_add_follow_extra <username>");
573 return;
574 }
575
576 $data =~ s/^\s+|\s+$//;
577 $data =~ s/^\@//;
578 $data = lc $data;
579
580 if ( exists $id_map{__fixreplies}{"$user\@$defservice"}{$data} ) {
581 &notice("Already following all replies by \@$data");
582 return;
583 }
584
585 $id_map{__fixreplies}{"$user\@$defservice"}{$data} = 1;
586 &notice("Will now follow all replies by \@$data");
587}
588
589sub cmd_del_follow {
590 my ( $data, $server, $win ) = @_;
591
592 unless ($data) {
593 &notice("Usage: /twitter_del_follow_extra <username>");
594 return;
595 }
596
597 $data =~ s/^\s+|\s+$//;
598 $data =~ s/^\@//;
599 $data = lc $data;
600
601 unless ( exists $id_map{__fixreplies}{"$user\@$defservice"}{$data} ) {
602 &notice("Wasn't following all replies by \@$data");
603 return;
604 }
605
606 delete $id_map{__fixreplies}{"$user\@$defservice"}{$data};
607 &notice("Will no longer follow all replies by \@$data");
608}
609
610sub cmd_list_follow {
611 my ( $data, $server, $win ) = @_;
612
613 my $found = 0;
614 foreach my $suser ( sort keys %{ $id_map{__fixreplies} } ) {
615 my $frusers;
616 foreach my $fruser ( sort keys %{ $id_map{__fixreplies}{$suser} } ) {
617 $frusers = $frusers ? "$frusers, $fruser" : $fruser;
618 }
619 if ($frusers) {
620 $found = 1;
621 &notice("Following all replies as \@$suser: $frusers");
622 }
623 }
624
625 unless ($found) {
626 &notice("Not following all replies by anyone");
627 }
628}
629
630sub cmd_add_search {
631 my ( $data, $server, $win ) = @_;
632
633 unless ( $twit and $twit->can('search') ) {
634 &notice("ERROR: Your version of Net::Twitter ($Net::Twitter::VERSION) "
635 . "doesn't support searches." );
636 return;
637 }
638
639 $data =~ s/^\s+|\s+$//;
640 $data = lc $data;
641
642 unless ($data) {
643 &notice("Usage: /twitter_subscribe <topic>");
644 return;
645 }
646
647 if ( exists $id_map{__searches}{"$user\@$defservice"}{$data} ) {
648 &notice("Already had a subscription for '$data'");
649 return;
650 }
651
652 $id_map{__searches}{"$user\@$defservice"}{$data} = 1;
653 &notice("Added subscription for '$data'");
654}
655
656sub cmd_del_search {
657 my ( $data, $server, $win ) = @_;
658
659 unless ( $twit and $twit->can('search') ) {
660 &notice("ERROR: Your version of Net::Twitter ($Net::Twitter::VERSION) "
661 . "doesn't support searches." );
662 return;
663 }
664 $data =~ s/^\s+|\s+$//;
665 $data = lc $data;
666
667 unless ($data) {
668 &notice("Usage: /twitter_unsubscribe <topic>");
669 return;
670 }
671
672 unless ( exists $id_map{__searches}{"$user\@$defservice"}{$data} ) {
673 &notice("No subscription found for '$data'");
674 return;
675 }
676
677 delete $id_map{__searches}{"$user\@$defservice"}{$data};
678 &notice("Removed subscription for '$data'");
679}
680
681sub cmd_list_search {
682 my ( $data, $server, $win ) = @_;
683
684 my $found = 0;
685 foreach my $suser ( sort keys %{ $id_map{__searches} } ) {
686 my $topics;
687 foreach my $topic ( sort keys %{ $id_map{__searches}{$suser} } ) {
688 $topics = $topics ? "$topics, $topic" : $topic;
689 }
690 if ($topics) {
691 $found = 1;
692 &notice("Search subscriptions for \@$suser: $topics");
693 }
694 }
695
696 unless ($found) {
697 &notice("No search subscriptions set up");
698 }
699}
700
701sub cmd_upgrade {
702 my ( $data, $server, $win ) = @_;
703
704 my $loc = Irssi::settings_get_str("twirssi_location");
705 unless ( -w $loc ) {
706 &notice("$loc isn't writable, can't upgrade."
707 . " Perhaps you need to /set twirssi_location?" );
708 return;
709 }
710
711 my $md5;
712 unless ( $data or Irssi::settings_get_bool("twirssi_upgrade_beta") ) {
713 eval { use Digest::MD5; };
714
715 if ($@) {
716 &notice("Failed to load Digest::MD5."
717 . " Try '/twirssi_upgrade nomd5' to skip MD5 verification" );
718 return;
719 }
720
721 $md5 = get("http://twirssi.com/md5sum");
722 chomp $md5;
723 $md5 =~ s/ .*//;
724 unless ($md5) {
725 &notice("Failed to download md5sum from peeron! Aborting.");
726 return;
727 }
728
729 unless ( open( CUR, $loc ) ) {
730 &notice("Failed to read $loc."
731 . " Check that /set twirssi_location is set to the correct location."
732 );
733 return;
734 }
735
736 my $cur_md5 = Digest::MD5::md5_hex(<CUR>);
737 close CUR;
738
739 if ( $cur_md5 eq $md5 ) {
740 &notice("Current twirssi seems to be up to date.");
741 return;
742 }
743 }
744
745 my $URL =
746 Irssi::settings_get_bool("twirssi_upgrade_beta")
747 ? "http://github.com/zigdon/twirssi/raw/master/twirssi.pl"
748 : "http://twirssi.com/twirssi.pl";
749 &notice("Downloading twirssi from $URL");
750 LWP::Simple::getstore( $URL, "$loc.upgrade" );
751
752 unless ( -s "$loc.upgrade" ) {
753 &notice("Failed to save $loc.upgrade."
754 . " Check that /set twirssi_location is set to the correct location."
755 );
756 return;
757 }
758
759 unless ( $data or Irssi::settings_get_bool("twirssi_upgrade_beta") ) {
760 unless ( open( NEW, "$loc.upgrade" ) ) {
761 &notice("Failed to read $loc.upgrade."
762 . " Check that /set twirssi_location is set to the correct location."
763 );
764 return;
765 }
766
767 my $new_md5 = Digest::MD5::md5_hex(<NEW>);
768 close NEW;
769
770 if ( $new_md5 ne $md5 ) {
771 &notice("MD5 verification failed. expected $md5, got $new_md5");
772 return;
773 }
774 }
775
776 rename $loc, "$loc.backup"
777 or &notice("Failed to back up $loc: $!. Aborting")
778 and return;
779 rename "$loc.upgrade", $loc
780 or &notice("Failed to rename $loc.upgrade: $!. Aborting")
781 and return;
782
783 my ( $dir, $file ) = ( $loc =~ m{(.*)/([^/]+)$} );
784 if ( -e "$dir/autorun/$file" ) {
785 &notice("Updating $dir/autorun/$file");
786 unlink "$dir/autorun/$file"
787 or &notice("Failed to remove old $file from autorun: $!");
788 symlink "../$file", "$dir/autorun/$file"
789 or &notice("Failed to create symlink in autorun directory: $!");
790 }
791
792 &notice("Download complete. Reload twirssi with /script load $file");
793}
794
795sub load_friends {
796 my $fh = shift;
797 my $cursor = -1;
798 my $page = 1;
799 my %new_friends;
800 eval {
801 while ( $page < 11 and $cursor ne "0" )
802 {
803 print $fh "type:debug Loading friends page $page...\n"
804 if ( $fh and &debug );
805 my $friends;
806 if ( ref $twit =~ /^Net::Twitter/ ) {
807 $friends = $twit->friends( { cursor => $cursor } );
808 last unless $friends;
809 $cursor = $friends->{next_cursor};
810 $friends = $friends->{users};
811 } else {
812 $friends = $twit->friends( { page => $page } );
813 last unless $friends;
814 }
815 $new_friends{ $_->{screen_name} } = time foreach @$friends;
816 $page++;
817 }
818 };
819
820 if ($@) {
821 print $fh "type:debug Error during friends list update. Aborted.\n";
822 return;
823 }
824
825 my ( $added, $removed ) = ( 0, 0 );
826 print $fh "type:debug Scanning for new friends...\n" if ( $fh and &debug );
827 foreach ( keys %new_friends ) {
828 next if exists $friends{$_};
829 $friends{$_} = time;
830 $added++;
831 }
832
833 print $fh "type:debug Scanning for removed friends...\n"
834 if ( $fh and &debug );
835 foreach ( keys %friends ) {
836 next if exists $new_friends{$_};
837 delete $friends{$_};
838 $removed++;
839 }
840
841 return ( $added, $removed );
842}
843
844sub get_updates {
845 print scalar localtime, " - get_updates starting" if &debug;
846
847 $window =
848 Irssi::window_find_name( Irssi::settings_get_str('twitter_window') );
849 unless ($window) {
850 Irssi::active_win()
851 ->print( "Can't find a window named '"
852 . Irssi::settings_get_str('twitter_window')
853 . "'. Create it or change the value of twitter_window" );
854 }
855
856 return unless &logged_in($twit);
857
858 my ( $fh, $filename ) = File::Temp::tempfile();
859 binmode( $fh, ":utf8" );
860 $child_pid = fork();
861
862 if ($child_pid) { # parent
863 Irssi::timeout_add_once( 5000, 'monitor_child',
864 [ "$filename.done", 0 ] );
865 Irssi::pidwait_add($child_pid);
866 } elsif ( defined $child_pid ) { # child
867 close STDIN;
868 close STDOUT;
869 close STDERR;
870
871 my $new_poll = time;
872
873 my $error = 0;
874 my %context_cache;
875 foreach ( keys %twits ) {
876 $error++ unless &do_updates( $fh, $_, $twits{$_}, \%context_cache );
877
878 if ( $id_map{__fixreplies}{$_} ) {
879 my @frusers = sort keys %{ $id_map{__fixreplies}{$_} };
880
881 $error++
882 unless &get_timeline( $fh, $frusers[ $fix_replies_index{$_} ],
883 $_, $twits{$_}, \%context_cache );
884
885 $fix_replies_index{$_}++;
886 $fix_replies_index{$_} = 0
887 if $fix_replies_index{$_} >= @frusers;
888 print $fh "id:$fix_replies_index{$_} ",
889 "account:$_ type:fix_replies_index\n";
890 }
891 }
892
893 print $fh "__friends__\n";
894 if (
895 time - $last_friends_poll >
896 Irssi::settings_get_int('twitter_friends_poll') )
897 {
898 print $fh "__updated ", time, "\n";
899 my ( $added, $removed ) = &load_friends($fh);
900 if ( $added + $removed ) {
901 print $fh "type:debug %R***%n Friends list updated: ",
902 join( ", ",
903 sprintf( "%d added", $added ),
904 sprintf( "%d removed", $removed ) ),
905 "\n";
906 }
907 }
908
909 foreach ( sort keys %friends ) {
910 print $fh "$_ $friends{$_}\n";
911 }
912
913 if ($error) {
914 print $fh "type:debug Update encountered errors. Aborted\n";
915 print $fh "-- $last_poll";
916 } else {
917 print $fh "-- $new_poll";
918 }
919 close $fh;
920 rename $filename, "$filename.done";
921 exit;
922 } else {
923 &ccrap("Failed to fork for updating: $!");
924 }
925 print scalar localtime, " - get_updates ends" if &debug;
926}
927
928sub do_updates {
929 my ( $fh, $username, $obj, $cache ) = @_;
930
931 my $rate_limit = $obj->rate_limit_status();
932 if ( $rate_limit and $rate_limit->{remaining_hits} < 1 ) {
933 &notice("Rate limit exceeded for $username");
934 return undef;
935 }
936
937 print scalar localtime, " - Polling for updates for $username" if &debug;
938 my $tweets;
939 my $new_poll_id = 0;
940 eval {
941 if ( $id_map{__last_id}{$username}{timeline} )
942 {
943 $tweets = $obj->home_timeline( { count => 100 } );
944 } else {
945 $tweets = $obj->home_timeline();
946 }
947 };
948
949 if ($@) {
950 print $fh "type:debug Error during home_timeline call: Aborted.\n";
951 print $fh "type:debug : $_\n" foreach split /\n/, Dumper($@);
952 return undef;
953 }
954
955 unless ( ref $tweets ) {
956 if ( $obj->can("get_error") ) {
957 my $error = "Unknown error";
958 eval { $error = JSON::Any->jsonToObj( $obj->get_error() ) };
959 unless ($@) { $error = $obj->get_error() }
960 print $fh
961 "type:debug API Error during home_timeline call: Aborted\n";
962 print $fh "type:debug : $_\n" foreach split /\n/, Dumper($error);
963
964 } else {
965 print $fh
966 "type:debug API Error during home_timeline call. Aborted.\n";
967 }
968 return undef;
969 }
970
971 foreach my $t ( reverse @$tweets ) {
972 my $text = decode_entities( $t->{text} );
973 $text =~ s/[\n\r]/ /g;
974 my $reply = "tweet";
975 if ( Irssi::settings_get_bool("show_reply_context")
976 and $t->{in_reply_to_screen_name} ne $username
977 and $t->{in_reply_to_screen_name}
978 and not exists $friends{ $t->{in_reply_to_screen_name} } )
979 {
980 $nicks{ $t->{in_reply_to_screen_name} } = time;
981 my $context;
982 unless ( $cache->{ $t->{in_reply_to_status_id} } ) {
983 eval {
984 $cache->{ $t->{in_reply_to_status_id} } =
985 $obj->show_status( $t->{in_reply_to_status_id} );
986 };
987
988 }
989 $context = $cache->{ $t->{in_reply_to_status_id} };
990
991 if ($context) {
992 my $ctext = decode_entities( $context->{text} );
993 $ctext =~ s/[\n\r]/ /g;
994 if ( $context->{truncated} and ref($obj) ne 'Net::Identica' ) {
995 $ctext .=
996 " -- http://twitter.com/$context->{user}{screen_name}"
997 . "/status/$context->{id}";
998 }
999 printf $fh "id:%s account:%s nick:%s type:tweet %s\n",
1000 $context->{id}, $username,
1001 $context->{user}{screen_name}, $ctext;
1002 $reply = "reply";
1003 }
1004 }
1005 next
1006 if $t->{user}{screen_name} eq $username
1007 and not Irssi::settings_get_bool("show_own_tweets");
1008 if ( $t->{truncated} and ref($obj) ne 'Net::Identica' ) {
1009 $text .= " -- http://twitter.com/$t->{user}{screen_name}"
1010 . "/status/$t->{id}";
1011 }
1012 printf $fh "id:%s account:%s nick:%s type:%s %s\n",
1013 $t->{id}, $username, $t->{user}{screen_name}, $reply, $text;
1014 $new_poll_id = $t->{id} if $new_poll_id < $t->{id};
1015 }
1016 printf $fh "id:%s account:%s type:last_id timeline\n",
1017 $new_poll_id, $username;
1018
1019 print scalar localtime, " - Polling for replies since ",
1020 $id_map{__last_id}{$username}{reply}
1021 if &debug;
1022 $new_poll_id = 0;
1023 eval {
1024 if ( $id_map{__last_id}{$username}{reply} )
1025 {
1026 $tweets = $obj->replies(
1027 { since_id => $id_map{__last_id}{$username}{reply} } )
1028 || [];
1029 } else {
1030 $tweets = $obj->replies() || [];
1031 }
1032 };
1033
1034 if ($@) {
1035 print $fh "type:debug Error during replies call. Aborted.\n";
1036 return undef;
1037 }
1038
1039 foreach my $t ( reverse @$tweets ) {
1040 next
1041 if exists $friends{ $t->{user}{screen_name} };
1042
1043 my $text = decode_entities( $t->{text} );
1044 $text =~ s/[\n\r]/ /g;
1045 if ( $t->{truncated} ) {
1046 $text .= " -- http://twitter.com/$t->{user}{screen_name}"
1047 . "/status/$t->{id}";
1048 }
1049 printf $fh "id:%s account:%s nick:%s type:tweet %s\n",
1050 $t->{id}, $username, $t->{user}{screen_name}, $text;
1051 $new_poll_id = $t->{id} if $new_poll_id < $t->{id};
1052 }
1053 printf $fh "id:%s account:%s type:last_id reply\n", $new_poll_id, $username;
1054
1055 print scalar localtime, " - Polling for DMs" if &debug;
1056 $new_poll_id = 0;
1057 eval {
1058 if ( $id_map{__last_id}{$username}{dm} )
1059 {
1060 $tweets = $obj->direct_messages(
1061 { since_id => $id_map{__last_id}{$username}{dm} } )
1062 || [];
1063 } else {
1064 $tweets = $obj->direct_messages() || [];
1065 }
1066 };
1067
1068 if ($@) {
1069 print $fh "type:debug Error during direct_messages call. Aborted.\n";
1070 return undef;
1071 }
1072
1073 foreach my $t ( reverse @$tweets ) {
1074 my $text = decode_entities( $t->{text} );
1075 $text =~ s/[\n\r]/ /g;
1076 printf $fh "id:%s account:%s nick:%s type:dm %s\n",
1077 $t->{id}, $username, $t->{sender_screen_name}, $text;
1078 $new_poll_id = $t->{id} if $new_poll_id < $t->{id};
1079 }
1080 printf $fh "id:%s account:%s type:last_id dm\n", $new_poll_id, $username;
1081
1082 print scalar localtime, " - Polling for subscriptions" if &debug;
1083 if ( $obj->can('search') and $id_map{__searches}{$username} ) {
1084 my $search;
1085 foreach my $topic ( sort keys %{ $id_map{__searches}{$username} } ) {
1086 print $fh "type:debug searching for $topic since ",
1087 "$id_map{__searches}{$username}{$topic}\n";
1088 eval {
1089 $search = $obj->search(
1090 {
1091 q => $topic,
1092 since_id => $id_map{__searches}{$username}{$topic}
1093 }
1094 );
1095 };
1096
1097 if ($@) {
1098 print $fh
1099 "type:debug Error during search($topic) call. Aborted.\n";
1100 return undef;
1101 }
1102
1103 unless ( $search->{max_id} ) {
1104 print $fh "type:debug Invalid search results when searching",
1105 " for $topic. Aborted.\n";
1106 return undef;
1107 }
1108
1109 $id_map{__searches}{$username}{$topic} = $search->{max_id};
1110 printf $fh "id:%s account:%s type:searchid topic:%s\n",
1111 $search->{max_id}, $username, $topic;
1112
1113 foreach my $t ( reverse @{ $search->{results} } ) {
1114 my $text = decode_entities( $t->{text} );
1115 $text =~ s/[\n\r]/ /g;
1116 printf $fh "id:%s account:%s nick:%s type:search topic:%s %s\n",
1117 $t->{id}, $username, $t->{from_user}, $topic, $text;
1118 $new_poll_id = $t->{id}
1119 if not $new_poll_id
1120 or $t->{id} < $new_poll_id;
1121 }
1122 }
1123 }
1124
1125 print scalar localtime, " - Done" if &debug;
1126
1127 return 1;
1128}
1129
1130sub get_timeline {
1131 my ( $fh, $target, $username, $obj, $cache ) = @_;
1132 my $tweets;
1133 my $last_id = $id_map{__last_id}{$username}{$target};
1134
1135 print $fh "type:debug get_timeline("
1136 . "$fix_replies_index{$username}=$target > $last_id) started."
1137 . " username = $username\n";
1138 eval {
1139 $tweets = $obj->user_timeline(
1140 {
1141 id => $target,
1142 ( $last_id ? ( since_id => $last_id ) : () ),
1143 }
1144 );
1145 };
1146
1147 if ($@) {
1148 print $fh
1149 "type:debug Error during user_timeline($target) call: Aborted.\n";
1150 print $fh "type:debug : $_\n" foreach split /\n/, Dumper($@);
1151 return undef;
1152 }
1153
1154 unless ($tweets) {
1155 print $fh
1156 "type:debug user_timeline($target) call returned undef! Aborted\n";
1157 return 1;
1158 }
1159
1160 foreach my $t ( reverse @$tweets ) {
1161 my $text = decode_entities( $t->{text} );
1162 $text =~ s/[\n\r]/ /g;
1163 my $reply = "tweet";
1164 if ( Irssi::settings_get_bool("show_reply_context")
1165 and $t->{in_reply_to_screen_name} ne $username
1166 and $t->{in_reply_to_screen_name}
1167 and not exists $friends{ $t->{in_reply_to_screen_name} } )
1168 {
1169 $nicks{ $t->{in_reply_to_screen_name} } = time;
1170 my $context;
1171 unless ( $cache->{ $t->{in_reply_to_status_id} } ) {
1172 eval {
1173 $cache->{ $t->{in_reply_to_status_id} } =
1174 $obj->show_status( $t->{in_reply_to_status_id} );
1175 };
1176
1177 }
1178 $context = $cache->{ $t->{in_reply_to_status_id} };
1179
1180 if ($context) {
1181 my $ctext = decode_entities( $context->{text} );
1182 $ctext =~ s/[\n\r]/ /g;
1183 if ( $context->{truncated} and ref($obj) ne 'Net::Identica' ) {
1184 $ctext .=
1185 " -- http://twitter.com/$context->{user}{screen_name}"
1186 . "/status/$context->{id}";
1187 }
1188 printf $fh "id:%s account:%s nick:%s type:tweet %s\n",
1189 $context->{id}, $username,
1190 $context->{user}{screen_name}, $ctext;
1191 $reply = "reply";
1192 }
1193 }
1194 if ( $t->{truncated} and ref($obj) ne 'Net::Identica' ) {
1195 $text .= " -- http://twitter.com/$t->{user}{screen_name}"
1196 . "/status/$t->{id}";
1197 }
1198 printf $fh "id:%s account:%s nick:%s type:%s %s\n",
1199 $t->{id}, $username, $t->{user}{screen_name}, $reply, $text;
1200 $last_id = $t->{id} if $last_id < $t->{id};
1201 }
1202 printf $fh "id:%s account:%s type:last_id_fixreplies %s\n",
1203 $last_id, $username, $target;
1204
1205 return 1;
1206}
1207
1208sub monitor_child {
1209 my ($data) = @_;
1210 my $filename = $data->[0];
1211 my $attempt = $data->[1];
1212
1213 print scalar localtime, " - checking child log at $filename ($attempt)"
1214 if &debug;
1215 my ($new_last_poll);
1216
1217 # first time we run we don't want to print out *everything*, so we just
1218 # pretend
1219
1220 if ( open FILE, $filename ) {
1221 binmode FILE, ":utf8";
1222 my @lines;
1223 my %new_cache;
1224 while (<FILE>) {
1225 last if /^__friends__/;
1226 unless (/\n$/) { # skip partial lines
1227 # print "Skipping partial line: $_" if &debug;
1228 next;
1229 }
1230 chomp;
1231 my $hilight = 0;
1232 my %meta;
1233
1234 foreach my $key (qw/id account nick type topic/) {
1235 if (s/^$key:(\S+)\s*//) {
1236 $meta{$key} = $1;
1237 }
1238 }
1239
1240 if ( $meta{type} and $meta{type} eq 'fix_replies_index' ) {
1241 $fix_replies_index{ $meta{account} } = $meta{id};
1242 print "fix_replies_index for $meta{account} set to $meta{id}"
1243 if &debug;
1244 next;
1245 }
1246
1247 if ( not $meta{type} or $meta{type} !~ /searchid|last_id/ ) {
1248 if ( exists $meta{id} and exists $new_cache{ $meta{id} } ) {
1249 next;
1250 }
1251
1252 $new_cache{ $meta{id} } = time;
1253
1254 if ( exists $meta{id} and exists $tweet_cache{ $meta{id} } ) {
1255 next;
1256 }
1257 }
1258
1259 my $account = "";
1260 $meta{account} =~ s/\@(\w+)$//;
1261 $meta{service} = $1;
1262 if (
1263 lc $meta{service} eq
1264 lc Irssi::settings_get_str("twirssi_default_service") )
1265 {
1266 $account = "$meta{account}: "
1267 if lc "$meta{account}\@$meta{service}" ne lc
1268 "$user\@$defservice";
1269 } else {
1270 $account = "$meta{account}\@$meta{service}: ";
1271 }
1272
1273 my $marker = "";
1274 if ( $meta{type} ne 'dm'
1275 and Irssi::settings_get_bool("twirssi_track_replies")
1276 and $meta{nick}
1277 and $meta{id} )
1278 {
1279 $marker = ( $id_map{__indexes}{ $meta{nick} } + 1 ) % 100;
1280 $id_map{ lc $meta{nick} }[$marker] = $meta{id};
1281 $id_map{__indexes}{ $meta{nick} } = $marker;
1282 $id_map{__tweets}{ lc $meta{nick} }[$marker] = $_;
1283 $marker = ":$marker";
1284 }
1285
1286 my $hilight_color =
1287 $irssi_to_mirc_colors{ Irssi::settings_get_str("hilight_color") };
1288 my $nick = "\@$meta{account}";
1289 if ( $_ =~ /\Q$nick\E(?:\W|$)/i
1290 and Irssi::settings_get_bool("twirssi_hilights") )
1291 {
1292 $meta{nick} = "\cC$hilight_color$meta{nick}\cO";
1293 $hilight = MSGLEVEL_HILIGHT;
1294 }
1295
1296 if ( $meta{type} =~ /tweet|reply/ ) {
1297 push @lines,
1298 [
1299 ( MSGLEVEL_PUBLIC | $hilight ),
1300 $meta{type}, $account, $meta{nick}, $marker, $_
1301 ];
1302 } elsif ( $meta{type} eq 'search' ) {
1303 push @lines,
1304 [
1305 ( MSGLEVEL_PUBLIC | $hilight ),
1306 $meta{type}, $account, $meta{topic},
1307 $meta{nick}, $marker, $_
1308 ];
1309 if (
1310 exists $id_map{__searches}{ $meta{account} }{ $meta{topic} }
1311 and $meta{id} >
1312 $id_map{__searches}{ $meta{account} }{ $meta{topic} } )
1313 {
1314 $id_map{__searches}{ $meta{account} }{ $meta{topic} } =
1315 $meta{id};
1316 }
1317 } elsif ( $meta{type} eq 'dm' ) {
1318 push @lines,
1319 [
1320 ( MSGLEVEL_MSGS | $hilight ),
1321 $meta{type}, $account, $meta{nick}, $_
1322 ];
1323 } elsif ( $meta{type} eq 'searchid' ) {
1324 print "Search '$meta{topic}' returned id $meta{id}" if &debug;
1325 if (
1326 not
1327 exists $id_map{__searches}{ $meta{account} }{ $meta{topic} }
1328 or $meta{id} >=
1329 $id_map{__searches}{ $meta{account} }{ $meta{topic} } )
1330 {
1331 $id_map{__searches}{ $meta{account} }{ $meta{topic} } =
1332 $meta{id};
1333 } elsif (&debug) {
1334 print "Search '$meta{topic}' returned invalid id $meta{id}";
1335 }
1336 } elsif ( $meta{type} eq 'last_id' ) {
1337 $id_map{__last_id}{"$meta{account}\@$meta{service}"}{$_} =
1338 $meta{id}
1339 if $id_map{__last_id}{"$meta{account}\@$meta{service}"}{$_} <
1340 $meta{id};
1341 } elsif ( $meta{type} eq 'last_id_fixreplies' ) {
1342 $id_map{__last_id}{"$meta{account}\@$meta{service}"}{$_} =
1343 $meta{id}
1344 if $id_map{__last_id}{"$meta{account}\@$meta{service}"}{$_} <
1345 $meta{id};
1346 } elsif ( $meta{type} eq 'error' ) {
1347 push @lines, [ MSGLEVEL_MSGS, $_ ];
1348 } elsif ( $meta{type} eq 'debug' ) {
1349 print "$_" if &debug,;
1350 } else {
1351 print "Unknown line type $meta{type}: $_" if &debug,;
1352 }
1353 }
1354
1355 %friends = ();
1356 while (<FILE>) {
1357 if (/^__updated (\d+)$/) {
1358 $last_friends_poll = $1;
1359 print "Friend list updated" if &debug;
1360 next;
1361 }
1362
1363 if (/^-- (\d+)$/) {
1364 $new_last_poll = $1;
1365 if ( $new_last_poll >= $last_poll ) {
1366 last;
1367 } else {
1368 print "Impossible! ",
1369 "new_last_poll=$new_last_poll < last_poll=$last_poll!"
1370 if &debug;
1371 undef $new_last_poll;
1372 next;
1373 }
1374 }
1375 my ( $f, $t ) = split ' ', $_;
1376 $nicks{$f} = $friends{$f} = $t;
1377 }
1378
1379 if ($new_last_poll) {
1380 print "new last_poll = $new_last_poll" if &debug;
1381 print "new last_poll_id = ", Dumper( $id_map{__last_id} ) if &debug;
1382 if ($first_call) {
1383 print "First call, not printing updates" if &debug;
1384 } else {
1385 foreach my $line (@lines) {
1386 $window->printformat(
1387 $line->[0],
1388 "twirssi_" . $line->[1],
1389 @$line[ 2 .. $#$line - 1 ],
1390 &hilight( $line->[-1] )
1391 );
1392 }
1393 }
1394
1395 close FILE;
1396 unlink $filename
1397 or warn "Failed to remove $filename: $!"
1398 unless &debug;
1399
1400 # commit the pending cache lines to the actual cache, now that
1401 # we've printed our output
1402 %tweet_cache = ( %tweet_cache, %new_cache );
1403
1404 # keep enough cached tweets, to make sure we don't show duplicates.
1405 foreach ( keys %tweet_cache ) {
1406 next if $tweet_cache{$_} >= $last_poll - 3600;
1407 delete $tweet_cache{$_};
1408 }
1409 $last_poll = $new_last_poll;
1410
1411 # make sure the pid is removed from the waitpid list
1412 Irssi::pidwait_remove($child_pid);
1413
1414 # and that we don't leave any zombies behind, somehow
1415 wait();
1416
1417 # save id_map hash
1418 if ( keys %id_map
1419 and my $file =
1420 Irssi::settings_get_str("twirssi_replies_store") )
1421 {
1422 if ( open JSON, ">$file" ) {
1423 print JSON JSON::Any->objToJson( \%id_map );
1424 close JSON;
1425 } else {
1426 &ccrap("Failed to write replies to $file: $!");
1427 }
1428 }
1429 $failwhale = 0;
1430 $first_call = 0;
1431 return;
1432 }
1433 }
1434
1435 close FILE;
1436
1437 if ( $attempt < 24 ) {
1438 Irssi::timeout_add_once( 5000, 'monitor_child',
1439 [ $filename, $attempt + 1 ] );
1440 } else {
1441 print "Giving up on polling $filename" if &debug;
1442 Irssi::pidwait_remove($child_pid);
1443 wait();
1444 unlink $filename unless &debug;
1445
1446 return unless Irssi::settings_get_bool("twirssi_notify_timeouts");
1447
1448 my $since;
1449 my @time = localtime($last_poll);
1450 if ( time - $last_poll < 24 * 60 * 60 ) {
1451 $since = sprintf( "%d:%02d", @time[ 2, 1 ] );
1452 } else {
1453 $since = scalar localtime($last_poll);
1454 }
1455
1456 if ( not $failwhale and time - $last_poll > 60 * 60 ) {
1457 foreach my $whale (
1458 q{ v v v},
1459 q{ | | v | v},
1460 q{ | .-, | | |},
1461 q{ .--./ / | _.---.| },
1462 q{ '-. (__..-" \\},
1463 q{ \\ a |},
1464 q{ ',.__. ,__.-'/},
1465 q{ '--/_.'----'`}
1466 )
1467 {
1468 &ccrap($whale);
1469 }
1470 $failwhale = 1;
1471 }
1472
1473 if ( time - $last_poll < 600 ) {
1474 &ccrap("Haven't been able to get updated tweets since $since");
1475 }
1476 }
1477}
1478
1479sub debug {
1480 return Irssi::settings_get_bool("twirssi_debug");
1481}
1482
1483sub notice {
1484 $window->print( "%R***%n @_", MSGLEVEL_PUBLIC );
1485}
1486
1487sub ccrap {
1488 $window->print( "%R***%n @_", MSGLEVEL_CLIENTCRAP );
1489}
1490
1491sub update_away {
1492 my $data = shift;
1493
1494 if ( Irssi::settings_get_bool("tweet_to_away")
1495 and $data !~ /\@\w/
1496 and $data !~ /^[dD] / )
1497 {
1498 my $server =
1499 Irssi::server_find_tag( Irssi::settings_get_str("bitlbee_server") );
1500 if ($server) {
1501 $server->send_raw("away :$data");
1502 return 1;
1503 } else {
1504 &ccrap( "Can't find bitlbee server.",
1505 "Update bitlbee_server or disable tweet_to_away" );
1506 return 0;
1507 }
1508 }
1509
1510 return 0;
1511}
1512
1513sub too_long {
1514 my $data = shift;
1515 my $noalert = shift;
1516
1517 if ( length $data > 140 ) {
1518 &notice( "Tweet too long (" . length($data) . " characters) - aborted" )
1519 unless $noalert;
1520 return 1;
1521 }
1522
1523 return 0;
1524}
1525
1526sub valid_username {
1527 my $username = shift;
1528
1529 $username = &normalize_username($username);
1530
1531 unless ( exists $twits{$username} ) {
1532 &notice("Unknown username $username");
1533 return undef;
1534 }
1535
1536 return $username;
1537}
1538
1539sub logged_in {
1540 my $obj = shift;
1541 unless ($obj) {
1542 &notice("Not logged in! Use /twitter_login username pass!");
1543 return 0;
1544 }
1545
1546 return 1;
1547}
1548
1549sub sig_complete {
1550 my ( $complist, $window, $word, $linestart, $want_space ) = @_;
1551
1552 if (
1553 $linestart =~ /^\/(?:retweet|twitter_reply)(?:_as)?\s*$/
1554 or ( Irssi::settings_get_bool("twirssi_use_reply_aliases")
1555 and $linestart =~ /^\/reply(?:_as)?\s*$/ )
1556 )
1557 { # /twitter_reply gets a nick:num
1558 $word =~ s/^@//;
1559 @$complist = map { "$_:$id_map{__indexes}{$_}" }
1560 sort { $nicks{$b} <=> $nicks{$a} }
1561 grep /^\Q$word/i,
1562 keys %{ $id_map{__indexes} };
1563 }
1564
1565 if ( $linestart =~
1566/^\/(twitter_unfriend|twitter_add_follow_extra|twitter_del_follow_extra)\s*$/
1567 )
1568 { # /twitter_unfriend gets a nick
1569 $word =~ s/^@//;
1570 push @$complist, grep /^\Q$word/i,
1571 sort { $nicks{$b} <=> $nicks{$a} } keys %nicks;
1572 }
1573
1574 # /tweet, /tweet_as, /dm, /dm_as - complete @nicks (and nicks as the first
1575 # arg to dm)
1576 if ( $linestart =~ /^\/(?:tweet|dm)/ ) {
1577 my $prefix = $word =~ s/^@//;
1578 $prefix = 0 if $linestart eq '/dm' or $linestart eq '/dm_as';
1579 push @$complist, grep /^\Q$word/i,
1580 sort { $nicks{$b} <=> $nicks{$a} } keys %nicks;
1581 @$complist = map { "\@$_" } @$complist if $prefix;
1582 }
1583}
1584
1585sub event_send_text {
1586 my ( $line, $server, $win ) = @_;
1587 my $awin = Irssi::active_win();
1588
1589 # if the window where we got our text was the twitter window, and the user
1590 # wants to be lazy, tweet away!
1591 if ( ( $awin->get_active_name() eq $window->{name} )
1592 and Irssi::settings_get_bool("tweet_window_input") )
1593 {
1594 &cmd_tweet( $line, $server, $win );
1595 }
1596}
1597
1598sub get_poll_time {
1599 my $poll = Irssi::settings_get_int("twitter_poll_interval");
1600 return $poll if $poll >= 60;
1601 return 60;
1602}
1603
1604sub hilight {
1605 my $text = shift;
1606
1607 if ( Irssi::settings_get_str("twirssi_nick_color") ) {
1608 my $c = Irssi::settings_get_str("twirssi_nick_color");
1609 $c = $irssi_to_mirc_colors{$c};
1610 $text =~ s/(^|\W)\@(\w+)/$1\cC$c\@$2\cO/g if $c;
1611 }
1612 if ( Irssi::settings_get_str("twirssi_topic_color") ) {
1613 my $c = Irssi::settings_get_str("twirssi_topic_color");
1614 $c = $irssi_to_mirc_colors{$c};
1615 $text =~ s/(^|\W)(\#|\!)([-\w]+)/$1\cC$c$2$3\cO/g if $c;
1616 }
1617 $text =~ s/[\n\r]/ /g;
1618
1619 return $text;
1620}
1621
1622sub shorten {
1623 my $data = shift;
1624
1625 my $provider = Irssi::settings_get_str("short_url_provider");
1626 if (
1627 (
1628 Irssi::settings_get_bool("twirssi_always_shorten")
1629 or &too_long( $data, 1 )
1630 )
1631 and $provider
1632 )
1633 {
1634 my @args;
1635 if ( $provider eq 'Bitly' ) {
1636 @args[ 1, 2 ] = split ',',
1637 Irssi::settings_get_str("short_url_args"), 2;
1638 unless ( @args == 3 ) {
1639 &ccrap(
1640 "WWW::Shorten::Bitly requires a username and API key.",
1641 "Set short_url_args to username,API_key or change your",
1642 "short_url_provider."
1643 );
1644 return decode "utf8", $data;
1645 }
1646 }
1647
1648 foreach my $url ( $data =~ /(https?:\/\/\S+[\w\/])/g ) {
1649 eval {
1650 $args[0] = $url;
1651 my $short = makeashorterlink(@args);
1652 if ($short) {
1653 $data =~ s/\Q$url/$short/g;
1654 } else {
1655 &notice("Failed to shorten $url!");
1656 }
1657 };
1658 }
1659 }
1660
1661 return decode "utf8", $data;
1662}
1663
1664sub normalize_username {
1665 my $user = shift;
1666
1667 my ( $username, $service ) = split /\@/, $user, 2;
1668 if ($service) {
1669 $service = ucfirst lc $service;
1670 } else {
1671 $service =
1672 ucfirst lc Irssi::settings_get_str("twirssi_default_service");
1673 unless ( exists $twits{"$username\@$service"} ) {
1674 $service = undef;
1675 foreach my $t ( sort keys %twits ) {
1676 next unless $t =~ /^\Q$username\E\@(Twitter|Identica)/;
1677 $service = $1;
1678 last;
1679 }
1680
1681 unless ($service) {
1682 &notice("Can't find a logged in user '$user'");
1683 }
1684 }
1685 }
1686
1687 return "$username\@$service";
1688}
1689
1690Irssi::signal_add( "send text", "event_send_text" );
1691
1692Irssi::theme_register(
1693 [
1694 'twirssi_tweet', '[$0%B@$1%n$2] $3',
1695 'twirssi_search', '[$0%r$1%n:%B@$2%n$3] $4',
1696 'twirssi_reply', '[$0\--> %B@$1%n$2] $3',
1697 'twirssi_dm', '[$0%r@$1%n (%WDM%n)] $2',
1698 'twirssi_error', 'ERROR: $0',
1699 ]
1700);
1701
1702Irssi::settings_add_int( "twirssi", "twitter_poll_interval", 300 );
1703Irssi::settings_add_str( "twirssi", "twitter_window", "twitter" );
1704Irssi::settings_add_str( "twirssi", "bitlbee_server", "bitlbee" );
1705Irssi::settings_add_str( "twirssi", "short_url_provider", "TinyURL" );
1706Irssi::settings_add_str( "twirssi", "short_url_args", undef );
1707Irssi::settings_add_str( "twirssi", "twitter_usernames", undef );
1708Irssi::settings_add_str( "twirssi", "twitter_passwords", undef );
1709Irssi::settings_add_str( "twirssi", "twirssi_default_service", "Twitter" );
1710Irssi::settings_add_str( "twirssi", "twirssi_nick_color", "%B" );
1711Irssi::settings_add_str( "twirssi", "twirssi_topic_color", "%r" );
1712Irssi::settings_add_str( "twirssi", "twirssi_retweet_format",
1713 'RT $n: "$t" ${-- $c$}' );
1714Irssi::settings_add_str( "twirssi", "twirssi_location",
1715 ".irssi/scripts/twirssi.pl" );
1716Irssi::settings_add_str( "twirssi", "twirssi_replies_store",
1717 ".irssi/scripts/twirssi.json" );
1718
1719Irssi::settings_add_int( "twirssi", "twitter_friends_poll", 600 );
1720Irssi::settings_add_int( "twirssi", "twitter_timeout", 30 );
1721
1722Irssi::settings_add_bool( "twirssi", "twirssi_upgrade_beta", 0 );
1723Irssi::settings_add_bool( "twirssi", "tweet_to_away", 0 );
1724Irssi::settings_add_bool( "twirssi", "show_reply_context", 0 );
1725Irssi::settings_add_bool( "twirssi", "show_own_tweets", 1 );
1726Irssi::settings_add_bool( "twirssi", "twirssi_debug", 0 );
1727Irssi::settings_add_bool( "twirssi", "twirssi_first_run", 1 );
1728Irssi::settings_add_bool( "twirssi", "twirssi_track_replies", 1 );
1729Irssi::settings_add_bool( "twirssi", "twirssi_replies_autonick", 1 );
1730Irssi::settings_add_bool( "twirssi", "twirssi_use_reply_aliases", 0 );
1731Irssi::settings_add_bool( "twirssi", "twirssi_notify_timeouts", 1 );
1732Irssi::settings_add_bool( "twirssi", "twirssi_hilights", 1 );
1733Irssi::settings_add_bool( "twirssi", "twirssi_always_shorten", 0 );
1734Irssi::settings_add_bool( "twirssi", "tweet_window_input", 0 );
1735Irssi::settings_add_bool( "twirssi", "twirssi_avoid_ssl", 0 );
1736
1737$last_poll = time - &get_poll_time;
1738$window = Irssi::window_find_name( Irssi::settings_get_str('twitter_window') );
1739if ( !$window ) {
1740 Irssi::active_win()
1741 ->print( "Couldn't find a window named '"
1742 . Irssi::settings_get_str('twitter_window')
1743 . "', trying to create it." );
1744 $window =
1745 Irssi::Windowitem::window_create(
1746 Irssi::settings_get_str('twitter_window'), 1 );
1747 $window->set_name( Irssi::settings_get_str('twitter_window') );
1748}
1749
1750if ($window) {
1751 Irssi::command_bind( "dm", "cmd_direct" );
1752 Irssi::command_bind( "dm_as", "cmd_direct_as" );
1753 Irssi::command_bind( "tweet", "cmd_tweet" );
1754 Irssi::command_bind( "tweet_as", "cmd_tweet_as" );
1755 Irssi::command_bind( "retweet", "cmd_retweet" );
1756 Irssi::command_bind( "retweet_as", "cmd_retweet_as" );
1757 Irssi::command_bind( "twitter_reply", "cmd_reply" );
1758 Irssi::command_bind( "twitter_reply_as", "cmd_reply_as" );
1759 Irssi::command_bind( "twitter_login", "cmd_login" );
1760 Irssi::command_bind( "twitter_logout", "cmd_logout" );
1761 Irssi::command_bind( "twitter_switch", "cmd_switch" );
1762 Irssi::command_bind( "twitter_subscribe", "cmd_add_search" );
1763 Irssi::command_bind( "twitter_unsubscribe", "cmd_del_search" );
1764 Irssi::command_bind( "twitter_list_subscriptions", "cmd_list_search" );
1765 Irssi::command_bind( "twirssi_upgrade", "cmd_upgrade" );
1766 Irssi::command_bind( "twitter_updates", "get_updates" );
1767 Irssi::command_bind( "twitter_add_follow_extra", "cmd_add_follow" );
1768 Irssi::command_bind( "twitter_del_follow_extra", "cmd_del_follow" );
1769 Irssi::command_bind( "twitter_list_follow_extra", "cmd_list_follow" );
1770 Irssi::command_bind( "bitlbee_away", "update_away" );
1771 if ( Irssi::settings_get_bool("twirssi_use_reply_aliases") ) {
1772 Irssi::command_bind( "reply", "cmd_reply" );
1773 Irssi::command_bind( "reply_as", "cmd_reply_as" );
1774 }
1775 Irssi::command_bind(
1776 "twirssi_dump",
1777 sub {
1778 print "twits: ", join ", ",
1779 map { "u: $_->{username}\@" . ref($_) } values %twits;
1780 print "selected: $user\@$defservice";
1781 print "friends: ", join ", ", sort keys %friends;
1782 print "nicks: ", join ", ", sort keys %nicks;
1783 print "searches: ", Dumper \%{ $id_map{__searches} };
1784 print "last poll: $last_poll";
1785 if ( open DUMP, ">/tmp/twirssi.cache.txt" ) {
1786 print DUMP Dumper \%tweet_cache;
1787 close DUMP;
1788 print "cache written out to /tmp/twirssi.cache.txt";
1789 }
1790 }
1791 );
1792 Irssi::command_bind(
1793 "twirssi_version",
1794 sub {
1795 &notice(
1796 "Twirssi v$VERSION; "
1797 . (
1798 $Net::Twitter::VERSION
1799 ? "Net::Twitter v$Net::Twitter::VERSION. "
1800 : ""
1801 )
1802 . (
1803 $Net::Identica::VERSION
1804 ? "Net::Identica v$Net::Identica::VERSION. "
1805 : ""
1806 )
1807 . "JSON in use: "
1808 . JSON::Any::handler()
1809 . ". See details at http://twirssi.com/"
1810 );
1811 }
1812 );
1813 Irssi::command_bind(
1814 "twitter_follow",
1815 &gen_cmd(
1816 "/twitter_follow <username>",
1817 "create_friend",
1818 sub { &notice("Following $_[0]"); $nicks{ $_[0] } = time; }
1819 )
1820 );
1821 Irssi::command_bind(
1822 "twitter_unfollow",
1823 &gen_cmd(
1824 "/twitter_unfriend <username>",
1825 "destroy_friend",
1826 sub { &notice("Stopped following $_[0]"); delete $nicks{ $_[0] }; }
1827 )
1828 );
1829 Irssi::command_bind(
1830 "twitter_device_updates",
1831 &gen_cmd(
1832 "/twitter_device_updates none|im|sms",
1833 "update_delivery_device",
1834 sub { &notice("Device updated to $_[0]"); }
1835 )
1836 );
1837 Irssi::command_bind(
1838 "twitter_block",
1839 &gen_cmd(
1840 "/twitter_block <username>",
1841 "create_block",
1842 sub { &notice("Blocked $_[0]"); }
1843 )
1844 );
1845 Irssi::command_bind(
1846 "twitter_unblock",
1847 &gen_cmd(
1848 "/twitter_unblock <username>",
1849 "destroy_block",
1850 sub { &notice("Unblock $_[0]"); }
1851 )
1852 );
1853 Irssi::signal_add_last( 'complete word' => \&sig_complete );
1854
1855 &notice(" %Y<%C(%B^%C)%N TWIRSSI v%R$VERSION%N");
1856 &notice(" %C(_(\\%N http://twirssi.com/ for full docs");
1857 &notice(
1858 " %Y||%C `%N Log in with /twitter_login, send updates with /tweet");
1859
1860 my $file = Irssi::settings_get_str("twirssi_replies_store");
1861 if ( $file and -r $file ) {
1862 if ( open( JSON, $file ) ) {
1863 local $/;
1864 my $json = <JSON>;
1865 close JSON;
1866 eval {
1867 my $ref = JSON::Any->jsonToObj($json);
1868 %id_map = %$ref;
1869 my $num = keys %{ $id_map{__indexes} };
1870 &notice( sprintf "Loaded old replies from %d contact%s.",
1871 $num, ( $num == 1 ? "" : "s" ) );
1872 &cmd_list_search;
1873 &cmd_list_follow;
1874 };
1875 } else {
1876 &notice("Failed to load old replies from $file: $!");
1877 }
1878 }
1879
1880 if ( my $provider = Irssi::settings_get_str("short_url_provider") ) {
1881 &notice("Loading WWW::Shorten::$provider...");
1882 eval "use WWW::Shorten::$provider;";
1883
1884 if ($@) {
1885 &notice(
1886 "Failed to load WWW::Shorten::$provider - either clear",
1887 "short_url_provider or install the CPAN module"
1888 );
1889 }
1890 }
1891
1892 if ( my $autouser = Irssi::settings_get_str("twitter_usernames")
1893 and my $autopass = Irssi::settings_get_str("twitter_passwords") )
1894 {
1895 &cmd_login();
1896 &get_updates;
1897 }
1898
1899} else {
1900 Irssi::active_win()
1901 ->print( "Create a window named "
1902 . Irssi::settings_get_str('twitter_window')
1903 . " or change the value of twitter_window. Then, reload twirssi." );
1904}
1905
1906# vim: set sts=4 expandtab: