ktec-subtrac 0.1.15 → 0.1.16
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION.yml +1 -1
- data/lib/subtrac/templates/trac/themes/subtractheme/prototype/css/subtrac.css +56 -56
- data/lib/subtrac/templates/trac/themes/subtractheme/prototype/subtractheme.html +19 -255
- data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/templates/subtrac_theme.html +1 -1
- metadata +1 -1
data/VERSION.yml
CHANGED
@@ -123,7 +123,7 @@ a:active {
|
|
123
123
|
color: #111;
|
124
124
|
text-align: center;
|
125
125
|
margin: 0;
|
126
|
-
background: url(
|
126
|
+
background: url(img/slogan.png) no-repeat center -16px;
|
127
127
|
padding-top: 30px;
|
128
128
|
}
|
129
129
|
|
@@ -138,7 +138,7 @@ a:active {
|
|
138
138
|
padding: 1px 0 2px;
|
139
139
|
text-indent: 0;
|
140
140
|
text-align: center;
|
141
|
-
background: url(
|
141
|
+
background: url(img/more.png) no-repeat;
|
142
142
|
font: bold 13px/26px "Helvetica Neue", Helvetica, Arial, sans-serif;
|
143
143
|
text-transform: lowercase;
|
144
144
|
color: #ccc;
|
@@ -211,18 +211,18 @@ a:active {
|
|
211
211
|
|
212
212
|
html {
|
213
213
|
background-color: #333;
|
214
|
-
background-image: url(
|
214
|
+
background-image: url(img/body-home.png);
|
215
215
|
}
|
216
216
|
|
217
217
|
body {
|
218
|
-
background: #fff url(
|
218
|
+
background: #fff url(img/body.png) repeat 0 0;
|
219
219
|
font: 12px/18px "Lucida Grande", Verdana, sans-serif;
|
220
220
|
color: #333;
|
221
221
|
text-shadow: #fff 0 1px 1px;
|
222
222
|
}
|
223
223
|
|
224
224
|
body#home {
|
225
|
-
background: url(
|
225
|
+
background: url(img/body-home.png) repeat 0 0;
|
226
226
|
}
|
227
227
|
|
228
228
|
/* @end */
|
@@ -233,7 +233,7 @@ body#home {
|
|
233
233
|
width: 660px;
|
234
234
|
margin: -180px auto 0;
|
235
235
|
padding: 30px 30px 0;
|
236
|
-
background: url(
|
236
|
+
background: url(img/content.png) no-repeat 0 0;
|
237
237
|
min-height: 400px;
|
238
238
|
}
|
239
239
|
|
@@ -246,7 +246,7 @@ body#home {
|
|
246
246
|
}
|
247
247
|
|
248
248
|
.product #content {
|
249
|
-
background: url(
|
249
|
+
background: url(img/content-product.png) no-repeat right 0;
|
250
250
|
padding: 10px 10px 0;
|
251
251
|
width: 700px;
|
252
252
|
min-height: 500px;
|
@@ -258,7 +258,7 @@ body#home {
|
|
258
258
|
height: 40px;
|
259
259
|
font: bold 13px/36px "Helvetica Neue", Helvetica, Arial, sans-serif;
|
260
260
|
text-transform: lowercase;
|
261
|
-
background: #ccc url(
|
261
|
+
background: #ccc url(img/sec-navigation.png) repeat-x;
|
262
262
|
-webkit-border-top-right-radius: 7px;
|
263
263
|
-webkit-border-top-left-radius: 7px;
|
264
264
|
-moz-border-radius-topright: 7px;
|
@@ -275,7 +275,7 @@ body#home {
|
|
275
275
|
#sec-navigation li {
|
276
276
|
padding-right: 2px;
|
277
277
|
float: left;
|
278
|
-
background: url(
|
278
|
+
background: url(img/sec-navigation-li.png) no-repeat right 0;
|
279
279
|
}
|
280
280
|
|
281
281
|
#sec-navigation li.first {
|
@@ -342,7 +342,7 @@ li#sn-rss {
|
|
342
342
|
li#sn-rss a {
|
343
343
|
color: #fff;
|
344
344
|
text-shadow: #c60 0 1px 1px;
|
345
|
-
background: url(
|
345
|
+
background: url(img/rss.png) no-repeat right 10px;
|
346
346
|
padding-right: 19px;
|
347
347
|
padding-left: 0;
|
348
348
|
margin-right: 10px;
|
@@ -363,7 +363,7 @@ li#sn-rss a span {
|
|
363
363
|
float: left;
|
364
364
|
padding-left: 10px;
|
365
365
|
padding-right: 7px;
|
366
|
-
background: url(
|
366
|
+
background: url(img/rss-span.png) no-repeat 0 9px;
|
367
367
|
}
|
368
368
|
|
369
369
|
/* @end */
|
@@ -391,7 +391,7 @@ li#sn-search input {
|
|
391
391
|
padding: 5px 7px;
|
392
392
|
vertical-align: top;
|
393
393
|
height: 17px;
|
394
|
-
background: url(
|
394
|
+
background: url(img/search.png) no-repeat 0 0;
|
395
395
|
opacity: .9;
|
396
396
|
font: 11px/16px "Lucida Grande", Verdana, sans-serif;
|
397
397
|
color: #666;
|
@@ -412,7 +412,7 @@ li#sn-search input:focus {
|
|
412
412
|
|
413
413
|
#sec-navigation li#sn-archive a {
|
414
414
|
padding-right: 33px;
|
415
|
-
background: url(
|
415
|
+
background: url(img/archive.png) no-repeat right 17px;
|
416
416
|
}
|
417
417
|
|
418
418
|
#sec-navigation li#sn-archive.selected a {
|
@@ -453,17 +453,17 @@ li#sn-search input:focus {
|
|
453
453
|
#sn-archive-popup ul li {
|
454
454
|
padding: 0 11px;
|
455
455
|
width: 180px;
|
456
|
-
background: url(
|
456
|
+
background: url(img/archive-li.png) repeat-y center 0;
|
457
457
|
float: none;
|
458
458
|
}
|
459
459
|
|
460
460
|
#sn-archive-popup ul li.first {
|
461
|
-
background: url(
|
461
|
+
background: url(img/archive-li-first.png) no-repeat center 0;
|
462
462
|
padding-top: 10px;
|
463
463
|
}
|
464
464
|
|
465
465
|
#sn-archive-popup ul li.last {
|
466
|
-
background: url(
|
466
|
+
background: url(img/archive-li-last.png) no-repeat center bottom;
|
467
467
|
padding-top: 17px;
|
468
468
|
padding-bottom: 16px;
|
469
469
|
}
|
@@ -472,7 +472,7 @@ li#sn-search input:focus {
|
|
472
472
|
display: block;
|
473
473
|
float: none;
|
474
474
|
padding: 0 15px;
|
475
|
-
background: url(
|
475
|
+
background: url(img/archive-li-hover.png) repeat-x 0 20px;
|
476
476
|
color: #333;
|
477
477
|
}
|
478
478
|
|
@@ -529,11 +529,11 @@ li#sn-search input:focus {
|
|
529
529
|
/* @group wrapper */
|
530
530
|
|
531
531
|
#wrapper {
|
532
|
-
background: url(
|
532
|
+
background: url(img/wrapper.png) repeat-x 0 0;
|
533
533
|
}
|
534
534
|
|
535
535
|
#home #wrapper {
|
536
|
-
background: url(
|
536
|
+
background: url(img/wrapper-home.png) repeat-x 0 0;
|
537
537
|
}
|
538
538
|
|
539
539
|
/* @end */
|
@@ -542,7 +542,7 @@ li#sn-search input:focus {
|
|
542
542
|
|
543
543
|
#header {
|
544
544
|
height: 340px;
|
545
|
-
background: url(
|
545
|
+
background: url(img/header.png) no-repeat 50% 0;
|
546
546
|
}
|
547
547
|
|
548
548
|
#home #header {
|
@@ -571,14 +571,14 @@ li#sn-search input:focus {
|
|
571
571
|
#home #products {
|
572
572
|
height: auto;
|
573
573
|
overflow: hidden;
|
574
|
-
background: url(
|
574
|
+
background: url(img/products-li-large.png) no-repeat center 0;
|
575
575
|
}
|
576
576
|
|
577
577
|
#products li {
|
578
578
|
float: left;
|
579
579
|
width: 220px;
|
580
580
|
padding: 5px 20px 5px 0;
|
581
|
-
background: url(
|
581
|
+
background: url(img/products-li.png) no-repeat 229px center;
|
582
582
|
}
|
583
583
|
|
584
584
|
#home #products li {
|
@@ -625,27 +625,27 @@ li#product-tfi,
|
|
625
625
|
}
|
626
626
|
|
627
627
|
#product-s a {
|
628
|
-
background-image: url(
|
628
|
+
background-image: url(img/scribbles-small-name.png);
|
629
629
|
}
|
630
630
|
|
631
631
|
#product-tfi a {
|
632
|
-
background-image: url(
|
632
|
+
background-image: url(img/tweetiei-small-name.png);
|
633
633
|
}
|
634
634
|
|
635
635
|
#product-tfm a {
|
636
|
-
background-image: url(
|
636
|
+
background-image: url(img/tweetiem-small-name.png);
|
637
637
|
}
|
638
638
|
|
639
639
|
#home #product-s a {
|
640
|
-
background-image: url(
|
640
|
+
background-image: url(img/scribbles-large-name.png);
|
641
641
|
}
|
642
642
|
|
643
643
|
#home #product-tfi a {
|
644
|
-
background-image: url(
|
644
|
+
background-image: url(img/tweetiei-large-name.png);
|
645
645
|
}
|
646
646
|
|
647
647
|
#home #product-tfm a {
|
648
|
-
background-image: url(
|
648
|
+
background-image: url(img/tweetiem-large-name.png);
|
649
649
|
}
|
650
650
|
|
651
651
|
#products a img {
|
@@ -672,7 +672,7 @@ li#product-tfi,
|
|
672
672
|
width: 740px;
|
673
673
|
margin: 0 auto 9px;
|
674
674
|
height: 61px;
|
675
|
-
background: url(
|
675
|
+
background: url(img/masthead.png) no-repeat center bottom;
|
676
676
|
}
|
677
677
|
|
678
678
|
/* @group navigation */
|
@@ -688,13 +688,13 @@ li#product-tfi,
|
|
688
688
|
#navigation li {
|
689
689
|
float: left;
|
690
690
|
padding-right: 2px;
|
691
|
-
background: url(
|
691
|
+
background: url(img/nav-li.png) no-repeat right 0;
|
692
692
|
}
|
693
693
|
|
694
694
|
#navigation li a {
|
695
695
|
float: left;
|
696
696
|
padding: 1px 20px 5px;
|
697
|
-
background: url(
|
697
|
+
background: url(img/nav-a.png) repeat-x 0 0;
|
698
698
|
color: #666;
|
699
699
|
}
|
700
700
|
|
@@ -721,7 +721,7 @@ li#product-tfi,
|
|
721
721
|
}
|
722
722
|
|
723
723
|
#navigation li.first a {
|
724
|
-
background: url(
|
724
|
+
background: url(img/nav-a-first.png) no-repeat 0 0;
|
725
725
|
padding-left: 22px;
|
726
726
|
}
|
727
727
|
|
@@ -731,7 +731,7 @@ li#product-tfi,
|
|
731
731
|
}
|
732
732
|
|
733
733
|
#navigation li.last a {
|
734
|
-
background: url(
|
734
|
+
background: url(img/nav-a-last.png) no-repeat right 0;
|
735
735
|
padding-right: 22px;
|
736
736
|
}
|
737
737
|
|
@@ -748,7 +748,7 @@ h1 a {
|
|
748
748
|
display: block;
|
749
749
|
width: 100px;
|
750
750
|
height: 40px;
|
751
|
-
background: url(
|
751
|
+
background: url(img/logo.png) no-repeat 0 1px;
|
752
752
|
text-indent: 150%;
|
753
753
|
overflow: hidden;
|
754
754
|
opacity: .75;
|
@@ -776,7 +776,7 @@ h1 a:active {
|
|
776
776
|
#footer {
|
777
777
|
padding: 20px 0;
|
778
778
|
height: 20px;
|
779
|
-
background: url(
|
779
|
+
background: url(img/footer.png) repeat-x 0 0;
|
780
780
|
font: bold 13px/20px "Helvetica Neue", Helvetica, Arial, sans-serif;
|
781
781
|
color: #999;
|
782
782
|
text-shadow: #222 0 -1px 1px;
|
@@ -784,7 +784,7 @@ h1 a:active {
|
|
784
784
|
}
|
785
785
|
|
786
786
|
#home #footer {
|
787
|
-
background: url(
|
787
|
+
background: url(img/slogan.png) no-repeat center -46px;
|
788
788
|
}
|
789
789
|
|
790
790
|
#footer ul {
|
@@ -842,7 +842,7 @@ h1 a:active {
|
|
842
842
|
padding: 23px 20px 7px;
|
843
843
|
float: right;
|
844
844
|
height: 141px;
|
845
|
-
background: url(
|
845
|
+
background: url(img/contact-gs.png) no-repeat;
|
846
846
|
font: bold 13px/16px "Helvetica Neue", Helvetica, Arial, sans-serif;
|
847
847
|
color: #bce1f3;
|
848
848
|
text-shadow: #069 0 -1px 1px;
|
@@ -867,7 +867,7 @@ h1 a:active {
|
|
867
867
|
-webkit-border-radius: 5px;
|
868
868
|
-moz-border-radius: 5px;
|
869
869
|
border-radius: 5px;
|
870
|
-
background: #eee url(
|
870
|
+
background: #eee url(img/inner.png) repeat-x 0 0;
|
871
871
|
width: 438px;
|
872
872
|
margin-bottom: 20px;
|
873
873
|
height: 165px;
|
@@ -958,7 +958,7 @@ h1 a:active {
|
|
958
958
|
text-indent: 150%;
|
959
959
|
overflow: hidden;
|
960
960
|
white-space: nowrap;
|
961
|
-
background-image: url(
|
961
|
+
background-image: url(img/gallery-nav.png);
|
962
962
|
}
|
963
963
|
|
964
964
|
#p-newer a {
|
@@ -1010,7 +1010,7 @@ h1 a:active {
|
|
1010
1010
|
font: 13px/20px "Helvetica Neue", Helvetica, Arial, sans-serif;
|
1011
1011
|
margin-bottom: 50px;
|
1012
1012
|
padding: 0 90px 30px;
|
1013
|
-
background: url(
|
1013
|
+
background: url(img/entry.png) no-repeat center bottom;
|
1014
1014
|
text-shadow: none;
|
1015
1015
|
}
|
1016
1016
|
|
@@ -1038,7 +1038,7 @@ h1 a:active {
|
|
1038
1038
|
-webkit-border-radius: 5px;
|
1039
1039
|
-moz-border-radius: 5px;
|
1040
1040
|
border-radius: 5px;
|
1041
|
-
background: #eee url(
|
1041
|
+
background: #eee url(img/inner.png) repeat-x 0 0;
|
1042
1042
|
}
|
1043
1043
|
|
1044
1044
|
.entry center img {
|
@@ -1068,7 +1068,7 @@ h1 a:active {
|
|
1068
1068
|
-moz-border-radius: 5px;
|
1069
1069
|
border-radius: 5px;
|
1070
1070
|
border: 1px solid #ccc;
|
1071
|
-
background: #eee url(
|
1071
|
+
background: #eee url(img/inner.png) repeat-x 0 0;
|
1072
1072
|
padding: 10px 20px;
|
1073
1073
|
}
|
1074
1074
|
|
@@ -1159,7 +1159,7 @@ h1 a:active {
|
|
1159
1159
|
-webkit-border-radius: 5px;
|
1160
1160
|
-moz-border-radius: 5px;
|
1161
1161
|
border-radius: 5px;
|
1162
|
-
background: #eee url(
|
1162
|
+
background: #eee url(img/inner.png) repeat-x 0 0;
|
1163
1163
|
margin: 0;
|
1164
1164
|
}
|
1165
1165
|
|
@@ -1201,7 +1201,7 @@ h1 a:active {
|
|
1201
1201
|
text-indent: 150%;
|
1202
1202
|
overflow: hidden;
|
1203
1203
|
white-space: nowrap;
|
1204
|
-
background-image: url(
|
1204
|
+
background-image: url(img/gallery-nav.png);
|
1205
1205
|
}
|
1206
1206
|
|
1207
1207
|
#gallery a.prev-slide {
|
@@ -1290,7 +1290,7 @@ h1 a:active {
|
|
1290
1290
|
-webkit-border-radius: 5px;
|
1291
1291
|
-moz-border-radius: 5px;
|
1292
1292
|
border-radius: 5px;
|
1293
|
-
background: #eee url(
|
1293
|
+
background: #eee url(img/inner.png) repeat-x 0 0;
|
1294
1294
|
}
|
1295
1295
|
|
1296
1296
|
#buy-button a {
|
@@ -1302,7 +1302,7 @@ h1 a:active {
|
|
1302
1302
|
text-transform: uppercase;
|
1303
1303
|
height: 41px;
|
1304
1304
|
margin-bottom: 5px;
|
1305
|
-
background: url(
|
1305
|
+
background: url(img/buy-button.png) no-repeat 0 0;
|
1306
1306
|
padding: 1px 0;
|
1307
1307
|
}
|
1308
1308
|
|
@@ -1493,7 +1493,7 @@ h1 a:active {
|
|
1493
1493
|
margin-left: -350px;
|
1494
1494
|
width: 220px;
|
1495
1495
|
height: 41px;
|
1496
|
-
background: url(
|
1496
|
+
background: url(img/calltoaction.png) no-repeat 0 0;
|
1497
1497
|
font: bold 13px/36px "Helvetica Neue", Helvetica, Arial, sans-serif;
|
1498
1498
|
text-shadow: #333 0 -1px 1px;
|
1499
1499
|
text-transform: lowercase;
|
@@ -1541,19 +1541,19 @@ h1 a:active {
|
|
1541
1541
|
}
|
1542
1542
|
|
1543
1543
|
#cta-buy {
|
1544
|
-
background: url(
|
1544
|
+
background: url(img/calltoaction-sep.png) no-repeat 109px center;
|
1545
1545
|
}
|
1546
1546
|
|
1547
1547
|
#cta-download {
|
1548
|
-
background: url(
|
1548
|
+
background: url(img/calltoaction-sep.png) no-repeat -1px center;
|
1549
1549
|
}
|
1550
1550
|
|
1551
1551
|
#cta-buy a {
|
1552
|
-
background-image: url(
|
1552
|
+
background-image: url(img/calltoaction-buy.png);
|
1553
1553
|
}
|
1554
1554
|
|
1555
1555
|
#cta-download a {
|
1556
|
-
background-image: url(
|
1556
|
+
background-image: url(img/calltoaction-download.png);
|
1557
1557
|
}
|
1558
1558
|
|
1559
1559
|
#calltoaction a:hover,
|
@@ -1598,7 +1598,7 @@ h1 a:active {
|
|
1598
1598
|
padding: 6px 10px;
|
1599
1599
|
top: -50px;
|
1600
1600
|
left: 0;
|
1601
|
-
background: url(
|
1601
|
+
background: url(img/tweetie-mac/introductory.png) no-repeat 0 0;
|
1602
1602
|
font-size: 12px;
|
1603
1603
|
color: #fff;
|
1604
1604
|
line-height: 14px;
|
@@ -1654,15 +1654,15 @@ h1 a:active {
|
|
1654
1654
|
}
|
1655
1655
|
|
1656
1656
|
#scribbles.product h2 a {
|
1657
|
-
background-image: url(
|
1657
|
+
background-image: url(img/scribbles-large-name.png);
|
1658
1658
|
}
|
1659
1659
|
|
1660
1660
|
#tweetie-mac.product h2 a {
|
1661
|
-
background-image: url(
|
1661
|
+
background-image: url(img/tweetiem-large-name.png);
|
1662
1662
|
}
|
1663
1663
|
|
1664
1664
|
#tweetie-iphone.product h2 a {
|
1665
|
-
background-image: url(
|
1665
|
+
background-image: url(img/tweetiei-large-name.png);
|
1666
1666
|
}
|
1667
1667
|
|
1668
1668
|
.product h2 a img {
|
@@ -1728,7 +1728,7 @@ h1 a:active {
|
|
1728
1728
|
-webkit-border-radius: 5px;
|
1729
1729
|
-moz-border-radius: 5px;
|
1730
1730
|
border-radius: 5px;
|
1731
|
-
background: #eee url(
|
1731
|
+
background: #eee url(img/inner.png) repeat-x 0 0;
|
1732
1732
|
padding: 19px 19px 10px;
|
1733
1733
|
margin-top: 5px !important;
|
1734
1734
|
margin-bottom: 20px;
|
@@ -46,199 +46,34 @@
|
|
46
46
|
<input type="text" value="search…" name="s" id="s" onfocus="if(this.value == 'search…'){this.value = ''}" onblur="if(this.value == ''){this.value = 'search…'}" />
|
47
47
|
</form>
|
48
48
|
</li>
|
49
|
-
<li id="sn-rss"><a href="http://blog.atebits.com/feed/rss/"><span>rss-feed</span></a></
|
49
|
+
<li id="sn-rss"><a href="http://blog.atebits.com/feed/rss/"><span>rss-feed</span></a></li>
|
50
50
|
</ul><!-- sec-navigation -->
|
51
51
|
|
52
52
|
|
53
53
|
<div class="entry" id="post-147">
|
54
|
-
<h3><a href="
|
54
|
+
<h3><a href="#" rel="bookmark">Title</a></h3>
|
55
55
|
<p class="posted">April 7, 2009</p>
|
56
|
-
<p><p>
|
57
|
-
<p>
|
58
|
-
<p>I will posting more details, screenshots, and maybe even some screencasts of Tweetie for Mac later this week. Be sure to follow <a href="http://twitter.com/atebits">@atebits</a> and <a href="http://twitter.com/tweetie">@tweetie</a> for up-to-the-minute info on the imminent release.</p>
|
59
|
-
</p>
|
56
|
+
<p><p>Lorem ipsum dolor sit amet, <b>consectetur adipiscing elit</b>. Maecenas gravida dolor eget urna. <a href="http://#">Aenean lorem metus</a>, blandit ac, mollis et, scelerisque rhoncus, felis. Pellentesque placerat vestibulum nisi. Donec posuere laoreet justo. Phasellus sodales gravida mi. Vivamus quis turpis. Suspendisse potenti. Aenean ut risus. Curabitur odio sapien, blandit at, volutpat ac, varius quis, dui. Integer vel sem. Vivamus eget nunc. Nulla pellentesque erat eget ligula. Maecenas neque erat, tincidunt luctus, gravida in, gravida et, massa. Quisque iaculis, eros sit amet ultrices semper, ligula eros vehicula urna, viverra aliquet sem eros et ligula.</p>
|
57
|
+
<p>Nulla adipiscing porttitor ipsum. Sed consequat. Fusce id diam. Nam id felis eget nulla fringilla varius. Phasellus semper ipsum quis ipsum. Suspendisse lacinia orci a ligula. Etiam sapien libero, viverra sit amet, eleifend at, elementum in, est. Donec fermentum, justo quis bibendum eleifend, felis quam faucibus dui, in rutrum dui felis sed urna. Nullam non lacus euismod justo sollicitudin rhoncus. Pellentesque cursus egestas massa. Nulla mattis ante. Donec eu leo. Mauris auctor dui vitae ligula. Praesent ut tellus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nullam pellentesque magna at nulla. Aliquam erat volutpat. Cras nec sem sed mauris ornare venenatis.</p>
|
60
58
|
</div>
|
61
59
|
|
62
60
|
|
63
61
|
|
64
62
|
<div class="entry" id="post-143">
|
65
|
-
<h3><a href="
|
63
|
+
<h3><a href="#" rel="bookmark">Proin dictum…</a></h3>
|
66
64
|
<p class="posted">March 11, 2009</p>
|
67
|
-
<p><p>
|
68
|
-
<
|
69
|
-
<
|
70
|
-
<p>First, <a href="http://atebits.cachefly.net/blog/simfinger/simfinger.zip">download a copy of SimFinger</a>. If you launch it, you’ll end up with something that looks like the shot below. SimFinger itself is composed of two parts. One is a fake “frame” that sits ontop of the simulator. It adds some shine and gives it an iPhone 3G-look. Clicking anywhere on it will just click-through to whatever is below. The other part is a little nub that follows around your cursor. It “indents” when you press down with your mouse, indicating what would be a “touch” on the phone.</p>
|
71
|
-
</p>
|
65
|
+
<p><p>Proin dictum. In iaculis sapien id neque. Nunc turpis odio, faucibus a, auctor sed, vehicula eu, ante. Proin nec nunc. Phasellus diam ligula, convallis at, fringilla ac, ultrices ut, enim. Donec libero nisl, faucibus nec, malesuada id, porttitor id, felis. Aenean ac neque. Morbi vehicula. Cras elit ligula, cursus eu, feugiat id, ullamcorper ac, magna. Nam auctor ipsum ut dui.</p>
|
66
|
+
<h2>Fusce tincidunt semper tellus</h2>
|
67
|
+
<p>Vestibulum ut purus a eros egestas aliquet. Nam dapibus mattis tortor. Donec vel mi. Curabitur diam leo, semper id, tempor nec, interdum sed, velit. Curabitur dui. In hac habitasse platea dictumst. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris suscipit condimentum lacus. Etiam diam. Vivamus mollis. Etiam hendrerit diam id metus. Fusce tincidunt semper tellus. Praesent sit amet lorem non mauris consectetur volutpat. In purus.</p>
|
72
68
|
</div>
|
73
69
|
|
74
70
|
|
75
|
-
|
76
|
-
<div class="entry" id="post-141">
|
77
|
-
<h3><a href="http://blog.atebits.com/2009/03/tweetie-13/" rel="bookmark">Tweetie 1.3</a></h3>
|
78
|
-
<p class="posted">March 2, 2009</p>
|
79
|
-
<p><p>I submitted Tweetie 1.3 to Apple a little while ago. Here’s the current (off the top of my head) list of fixes and fancy schmancy new features.</p>
|
80
|
-
<ul>
|
81
|
-
<li>Post pictures with <a href="http://mobypicture.com/">Mobypicture</a> and <a href="http://yfrog.com/">yfrog</a> (in addition to <a href="http://twitpic.com/">TwitPic</a>)</li>
|
82
|
-
<li>New “Link” button to Add to Instapaper faster, and repost individual links</li>
|
83
|
-
<li><a href="http://www.youtube.com/watch?v=zZbrIenzxZ4&feature=channel_page">View full-size profile images</a></li>
|
84
|
-
<li>Dark theme</li>
|
85
|
-
<li><a href="http://ping.fm/">Ping.fm</a> integration</li>
|
86
|
-
<li><a href="http://tweetshrink.com/">Tweetshrink</a> integration</li>
|
87
|
-
<li><a href="http://www.twitlonger.com/">Twitlonger</a> integration</li>
|
88
|
-
<li>German localization</li>
|
89
|
-
<li>Russian localization</li>
|
90
|
-
<li>Allow DMs up to 255 characters</li>
|
91
|
-
<li>Many UI tweaks</li>
|
92
|
-
<li>Play back <a href="http://song.ly/">Song.ly</a> links</li>
|
93
|
-
<li>Option to use “RT” syntax</li>
|
94
|
-
<li>Better feedback for posting a Map link</li>
|
95
|
-
<li>Improved international date formatting</li>
|
96
|
-
<li>Detect invalid profile images</li>
|
97
|
-
<li>Fixed account sorting</li>
|
98
|
-
<li>Fixed profile image URL decoding</li>
|
99
|
-
<li>Fixed links with # anchors</li>
|
100
|
-
<li>Fixed “(null)” problem when using bookmarklet</li>
|
101
|
-
<li>Fixed problem with @ character in password field</li>
|
102
|
-
</ul>
|
103
|
-
<p>Look for the update soon!</p>
|
104
|
-
</p>
|
105
|
-
</div>
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
<div class="entry" id="post-137">
|
110
|
-
<h3><a href="http://blog.atebits.com/2009/02/great-things/" rel="bookmark">Great Things</a></h3>
|
111
|
-
<p class="posted">February 27, 2009</p>
|
112
|
-
<p><p>1. Tweetie is featured on iTunes! Woohooo!</p>
|
113
|
-
<p><center><br />
|
114
|
-
<img src="http://atebits.cachefly.net/blog/featured.jpg"><br />
|
115
|
-
</center></p>
|
116
|
-
<p>2. Less awesome, but makes-me-happy: <a href="http://arstechnica.com/apple/news/2009/02/apple-issues-store-wide-emoji-take-down-order.ars">Apple has started pulling Emoji-enablers from the App Store</a>. About time. Hacks are bad.</p>
|
117
|
-
</p>
|
118
|
-
</div>
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
<div class="entry" id="post-133">
|
123
|
-
<h3><a href="http://blog.atebits.com/2009/02/replying-to-multiple-users/" rel="bookmark">Replying to Multiple Users</a></h3>
|
124
|
-
<p class="posted">February 21, 2009</p>
|
125
|
-
<p><p>I’m astonished that many people don’t know this. Say <code>@atebits</code> wanted to send a tweet to a bunch of users, he might try something like this:</p>
|
126
|
-
<blockquote><p>
|
127
|
-
<code><br />
|
128
|
-
@user1 @user2 @user3 let's all go to a party.<br />
|
129
|
-
</code>
|
130
|
-
</p></blockquote>
|
131
|
-
<p>Looks good, right?</p>
|
132
|
-
<p>Wrong.</p>
|
133
|
-
<p>First, some background on how replies in Twitter work (as of Feb 2, 2009 – they are updating all the time).</p>
|
134
|
-
<p>Twitter provides two ways to reply to someone. The first is to simply prefix a username at the start of a tweet. So for example, <code>@user1</code> could type in: “<code>@atebits man, I would *love* to go to a party with you.</code>“, and <code>@atebits</code> would see it as a reply to him. Awesome.</p>
|
135
|
-
<p>The other way to reply is to reply to a <i>specific tweet</i>. You can do this on twitter.com by clicking the little gray reply arrow next to a tweet. You can also do it in a client (that support it) by clicking the reply button when viewing a specific tweet. This does two things, first: it automatically prefixes a “<code>@username</code>” at the beginning of the tweet. Second: it sets the <code>in_reply_to_status_id</code> flag when posting to Twitter.</p>
|
136
|
-
<p>This last point is particularly cool – it’s a way for you to reply to a <em>specific</em> tweet. When people view this tweet on twitter.com, there will be a small link at the end of the tweet that says something like “<code>in reply to atebits</code>“. When you click it, it will take you to the specific tweet that user was replying to. In a client that supports following reply chains (like Tweetie), you can tap a button to see the tweet that someone was replying to.</p>
|
137
|
-
<p>Now, back to the original point. You wanted to invite <code>@user1</code>, <code>@user2</code> and <code>@user3</code> to a party. But <code>@user1</code> was the only person to get back to you. You <em>could</em> conclude that <code>@user2</code> and <code>@user3</code> think you smell and would never go to a party with you, or you could learn a little more about how Twitter replies work.</p>
|
138
|
-
<p>The truth is, <code>@user1</code> is the only one who saw that message in their Replies. <code>@user2</code> and <code>@user3</code> didn’t see it in their Replies <i>at all</i>. This is because Twitter only considers the <strong>first</strong> username as the person you’d like to reply to… it has <strong>no concept</strong> of multiple replies.</p>
|
139
|
-
<p>Today, if you want to send a reply to three people, you have to send three <em>separate</em> tweets.</p>
|
140
|
-
<p>I agree that it would be nice if you could include a few different <code>@usernames</code> in a tweet, and every username mentioned in it would get it as a reply. But that’s not how it works today, so you should keep it in mind. If you want it to change, well, I’m the wrong person to talk to – you could ask Twitter <a href="http://getsatisfaction.com/twitter">here</a> and see what happens.</p>
|
141
|
-
<p>As a side note: this is one of the reasons why Tweetie doesn’t include a Twitter “friend address book” in the Compose screen. A lot of people have requested it so they can reply to multiple people… to them I say: please read this blog post. There is a second reason why Tweetie doesn’t have that feature, but it’s more technical and probably deserves another blog post (short version: it would be a hack, and if you see it in any other Twitter client today, I can pretty much guarantee that it’s a half-assed implementation).</p>
|
142
|
-
<p><b>Update:</b> If you find yourself wanting to send a tweet to multiple users often, you might want to read <a href="http://blog.atebits.com/2009/02/twitter-groups/">Twitter Groups</a> (Type 1) and check out <a href="http://www.grouptweet.com/">http://www.grouptweet.com/</a>, a very cool looking service.</p>
|
143
|
-
</p>
|
144
|
-
</div>
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
<div class="entry" id="post-131">
|
149
|
-
<h3><a href="http://blog.atebits.com/2009/02/fixing-oauth/" rel="bookmark">Fixing OAuth</a></h3>
|
150
|
-
<p class="posted">February 18, 2009</p>
|
151
|
-
<p><p>Twitter is dancing around the idea of <a href="http://apiwiki.twitter.com/FAQ#WhenwillTwittersupportOAuth">deprecating</a> support for <a href="http://en.wikipedia.org/wiki/Basic_access_authentication">Basic Authentication</a>, leaving only <a href="http://en.wikipedia.org/wiki/OAuth">OAuth</a>.</p>
|
152
|
-
<p>The current authentication process for Twitter clients is straightforward:</p>
|
153
|
-
<ol>
|
154
|
-
<li>Launch a Twitter client</li>
|
155
|
-
<li>Enter your username and password</li>
|
156
|
-
<li>That’s it</li>
|
157
|
-
</ol>
|
158
|
-
<p>If Basic Authentication goes away, and OAuth is the only option, the process would look like this:</p>
|
159
|
-
<ol>
|
160
|
-
<li>Launch a Twitter client</li>
|
161
|
-
<li>Client does some magic, then quits and sends you to a special login page on twitter.com</li>
|
162
|
-
<li>You login on twitter.com</li>
|
163
|
-
<li>You “approve” the client that just sent you to the browser</li>
|
164
|
-
<li>Your browser quits, you get punted back to the client (where it then does some more magic to actually log you in)</li>
|
165
|
-
<li>That’s it</li>
|
166
|
-
</ol>
|
167
|
-
<p>OAuth will make you – the user – jump through these hoops so you don’t have to type your password into the client application directly, for your own security.</p>
|
168
|
-
<p>Time to be frank: any security that OAuth claims – with respect to native applications – is an illusion. If a native app wants to get a copy of your password, it will get a copy of your password. If it wants to hijack the authentication process, bring up a bogus “browser” for you to enter a password into, register keyloggers, muck with your system web proxy settings and sniff passwords before they hit the wire, or phish you some other way, guess what: it can and it will. OAuth does not solve these problems. It just adds complexity to the login process.</p>
|
169
|
-
<p>But this post is not meant to bash OAuth – I think it’s a <em>fantastic</em> solution to <strong>authenticate other web apps</strong>. The problem is that it flat-out sucks for everything else.</p>
|
170
|
-
<p>So why is there a push to standardize on this single authentication system? Why shouldn’t Twitter implement OAuth and keep Basic Auth around? Well, I think they should, but I can imagine a number of reasons why they don’t want to: buzzword compliance, implementation simplicity, the ability to remotely disable access tokens from misbehaving clients (which is a legitimately nice feature).</p>
|
171
|
-
<p>I think Basic Auth is fine (over SSL at least). But OAuth is the juggernaut of this new age of web stuff, here I am, holding back the tide of buzzword bullshit and I know I’m going to lose. And to be honest, a few years from now when OAuth is <em>finally</em> integrated sensibly, I think it actually will be <em>quite</em> nice.</p>
|
172
|
-
<p>“Integrated sensibly” is key. Today is an <a href="http://groups.google.com/group/twitter-development-talk/browse_thread/thread/629b03475a3d78a1/655a8425e1e5e045?show_docid=655a8425e1e5e045">opportunity</a> to get it right.</p>
|
173
|
-
<h2>Fixing OAuth</h2>
|
174
|
-
<p>I have a tendency to think of things that have already been thought of, so I apologize if this has already been discussed and rejected. I also have a tendency not to think things entirely through, though I’m hoping this post is a starting point, not a complete solution. In any event, I think there may be a way to fix OAuth and you’d only have to change 4 words of the spec.</p>
|
175
|
-
<p><center><br />
|
176
|
-
<img src="http://atebits.cachefly.net/blog/oauth_web_browser.jpg"><br />
|
177
|
-
</center></p>
|
178
|
-
<p>The <a href="http://oauth.net/core/1.0/">OAuth Core 1.0</a> spec hard codes the concept of a <b>web browser</b> as the means to authenticate with a provider. I would like to generalize that and introduce a new term, call it an <strong>authentication gateway</strong> for now.</p>
|
179
|
-
<p>An “authentication gateway” is any program that is capable of communicating securely between a device that is currently running a consumer and a service provider. A web browser is a perfectly acceptable type of authentication gateway. The idea is to allow for a few new types.</p>
|
180
|
-
<p>I think the ultimate goal is to have a single, global, native-looking, “blessed” authentication gateway on every device. This gateway could be expressed on different devices in different ways. On the iPhone for example, it could be represented as a special OS-provided window (running in a protected process) that slid up over an app, allowing the user to enter a password (or authenticate via something else like OpenID). The sheet would then slide back down revealing the app after authentication was complete. The requesting app would never need to quit. There would be no need for any web pages, and the authentication experience would be completely standardized across <em>every</em> app on that device that used OAuth.</p>
|
181
|
-
<p>On the Mac, the authentication gateway could be expressed much like the current keychain dialog today.</p>
|
182
|
-
<p>One added bonus of implementing OS-level “blessed” authentication gateways is that the OS vendor can use every trick in the book to prevent phishing. They can use secret APIs to make sure key strokes aren’t logged and proxy settings haven’t been compromised. They can also implement a system allowing users to validate the authenticity of the authentication gateway itself. For example, it would be trivial for a malicious application to bring up a window that looks and works exactly like the OS-provided gateway, but stole the user’s password. An OS vendor could prevent this by doing a “choose a special image when setting up your device, and check to make sure the image matches when you see an authentication window come up” (or ideally a something a little less cheesy). A number of financial sites use this trick. The benefit is that each provider wouldn’t have to come up with their own implementation of it (forcing the user to remember a different image on each site). The user would only have to remember one image, to check validity of their single, system gateway.</p>
|
183
|
-
<p>The other added bonus is that there is no reason why authentication gateways need to be limited to GUIs. A command-line gateway would be possible. So would some other gateway for an interface (or a device that doesn’t have an interface) that nobody has even thought of yet.</p>
|
184
|
-
<h2>Chicken / Egg</h2>
|
185
|
-
<p>There’s a bit of a problem here, and that is how to do this seamlessly and securely without explicit support from OS vendors. In a nutshell, we can’t. What we can do is build it, prove it works, then beg for support.</p>
|
186
|
-
<p>We can build this today. It won’t be perfectly secure, but it will be at least as secure as Basic Auth (in the sense that clients would still be able to see user passwords). That’s good enough for me, and that’s good enough for everyone who uses an email client today. It would be easy enough require other web apps to use the “web browser”-type authentication gateway, so security would stay exactly the same in that regard.</p>
|
187
|
-
<p>The only reasonable way to accomplish this today is to have each native app carry along their own implementation of an authentication gateway. On something like the iPhone, it would be unreasonable to require users to download a separate “authentication gateway” app to authenticate something else. On the desktop, you could certainly have apps that could install some shared gateway, but that could be easily abused by malicious apps, so it’s probably better for now for each app to carry their own.</p>
|
188
|
-
<p>There’s nothing stopping apps from sharing code, I’d be happy to contribute to an open source implementation of something like this. Again, this post was simply an attempt to get some discussion going. If you have your own thoughts, I encourage you to <a href="http://groups.google.com/group/twitter-development-talk/browse_thread/thread/629b03475a3d78a1">join in the discussion here</a> and contribute to the <a href="https://twitter.pbwiki.com/oauth-desktop-discussion">OAuth Desktop Discussion Wiki</a>.</p>
|
189
|
-
<p>Let’s get this right.</p>
|
190
|
-
</p>
|
191
|
-
</div>
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
<div class="entry" id="post-125">
|
197
|
-
<h3><a href="http://blog.atebits.com/2009/02/once-you-go-black/" rel="bookmark">Once You Go Black…</a></h3>
|
198
|
-
<p class="posted">February 16, 2009</p>
|
199
|
-
<p><p>This is pretty self-explanatory:</p>
|
200
|
-
<p><center><br />
|
201
|
-
<img src="http://atebits.cachefly.net/blog/statusbarmatch.jpg"><br />
|
202
|
-
</center></p>
|
203
|
-
<p>Stop fucking it up.</p>
|
204
|
-
</p>
|
205
|
-
</div>
|
206
|
-
|
207
|
-
|
208
|
-
|
209
71
|
<div class="entry" id="post-119">
|
210
72
|
<h3><a href="http://blog.atebits.com/2009/02/twitter-groups/" rel="bookmark">Twitter Groups</a></h3>
|
211
73
|
<p class="posted"></p>
|
212
|
-
<p><p>
|
213
|
-
<h3>
|
214
|
-
<p>
|
215
|
-
<h3>Twitter Group Type 2</h3>
|
216
|
-
<p>A client-side way for you to organize the people you follow into “subsets”, so you can classify tweets into different “streams” (for example, I could create a a Twitter development “group” that would just include tweets from only incredibly cool people like <a href="http://twitter.com/al3x">@al3x</a>, <a href="http://twitter.com/chockenberry">@chockenberry</a>, <a href="http://twitter.com/atebits">@atebits</a> (me!), <a href="http://twitter.com/tweetie">@tweetie</a>, etc).</p>
|
217
|
-
<p>A number of people want a client-side grouping (group type 2) feature in Tweetie, and it’s hard to blame them. If you follow a ton of people it’s really easy to get bogged down with information.</p>
|
218
|
-
<p>(Before I continue, there <i>are</i> existing methods to keep yourself from going into information-overload on Twitter. The first is to <b>stop following people</b>. If someone is clogging up your timeline with a thousand inane updates a day, just stop following them. It really is that simple. They can keep following you, everyone wins. The lack of bi-directional “friendships” is Twitter’s single greatest stroke of brilliance. It also helps to remember that <a href="http://www.twitterisntemail.com/">you don’t have to read every tweet</a>).</p>
|
219
|
-
<p>Anyway, from a technical perspective, there are three ways to implement client side grouping. Here is why they all suck.</p>
|
220
|
-
<h3>Method 1</h3>
|
221
|
-
<p>Implement grouping on top of the Twitter Search APIs. For example, if I wanted to see the tweets of a few people, I could perform a search like “<a href="http://search.twitter.com/search?q=from%3Atweetie+OR+from%3Aatebits+OR+from%3Agruber">from:tweetie OR from:atebits OR from:gruber</a>“. In fact, you can do this in Tweetie right now and use the saved searches feature to create pseudo-saved-”groups”.</p>
|
222
|
-
<p>This sucks for three reasons. The first problem is that the query length of a particular search is limited to 140 characters. So depending on the username lengths, you can only have a handful of people in a particular “group”. The second problem is that it flat-out doesn’t work for protected users. Now, I have my own thoughts on protected users (I think it goes against the open spirit of Twitter), but I understand why it exists, and any method that doesn’t work with protected accounts should be considered a hack. The third problem is that the search APIs have had some problems in the past (up until recently, doing a search for “from:tweetie” erroneously returned no results - by the way, Twitter: thanks for fixing that!)</p>
|
223
|
-
<p>You can get around the first problem by being clever in the client and breaking sets of users into multiple requests and then interleave the results back in the client. But you’d still be making O(n) requests to get the tweet stream for a particular group, so not only does it still exhibit problem 2 and 3, but you’re also dealing with something that doesn’t scale!</p>
|
224
|
-
<h3>Method 2</h3>
|
225
|
-
<p>Get timelines for each user individually, interleave the results client-side. At first glance this solves the problems of living on top of the search APIs, but in reality it sucks even more. Yes, it would fix problems with protected users and any potential search flakiness, but the scaling is even worse than Method 1.</p>
|
226
|
-
<h3>Method 3</h3>
|
227
|
-
<p>Implement groups by filtering your main timeline. In a nutshell, don’t do *any* extra work, just take the tweets already loaded as part of your main timeline and filter out certain ones based on some client-side group settings.</p>
|
228
|
-
<p>Does this work? Yes, <b>if your Twitter client is running all the time</b>. A desktop client can get away with this because it’s constantly grabbing the freshest stuff from Twitter. There are going to be very few “gaps” in your stream. A mobile client is a whole different story. Most mobile apps are open for brief spurts. When a Twitter client launches, it can only grab a certain number of “fresh” tweets in a single request. If you think about <i>why</i> people want groups, it’s probably because they want to single out a few important people who might not post as often as some others, but are completely drowned out by “noise”. There’s a good chance that there is enough “noise” to push those rare, important tweets way down in your timeline. As a result, they’ll never be seen by the client at all. In this respect, method 1 or 2 is better. If you launch your Twitter client often enough, or you don’t follow any “noisy” people, it might work fine. But “might” is not good enough for me.</p>
|
229
|
-
<h3>Let Me Blow Your Mind</h3>
|
230
|
-
<p>Now, what if I told you that Twitter <i>already has</i> this amazing feature that allows you to create sets of “followers” and could automatically interleave tweets from all these people server-side, so clients didn’t have to make tons of requests. Not only that, but it works with protected users and won’t ever get drowned by “noisy” tweeters.</p>
|
231
|
-
<p>Twitter <b>does</b> have this feature. It’s available today, for free, and clients don’t need to do any work to support it. Ready? Here it is: </p>
|
232
|
-
<p><i>Make another Twitter account</i>.</p>
|
233
|
-
<p>But wait… um, oh, hrm, wait, no… ah… so you’re saying… wait, yes, that just might work.</p>
|
234
|
-
<p><i>This is what the Twitter system was designed to do</i>. It was <i>designed</i> to let you get a stream of updates from some subset of people that you control. Call it a “subset”, call it a “group”, call it whatever you want. Want to add someone to a group? Follow them! Want to remove them from a group? Stop following them! The other secret benefit of this is that these “groups” will “sync” between all of your clients (well, the ones that support the idea of multiple accounts).</p>
|
235
|
-
<p>Tweetie has a fantastic multiple-account implementation. It takes one tap to see your different accounts. And when you’re replying there’s a button on the compose screen that lets you switch the “sender” account. You can set up a “follow”-only account and when you want to reply to something from it, just tap a switch to send it from your “real” account.</p>
|
236
|
-
<p>Now, the user-experience isn’t perfect, but it’s perfectly functional. Plus, you can do it today. Even cooler, Twitter doesn’t need to do anything special to support it, and neither does Tweetie. I don’t mean to sound lazy, but less features == less bugs.</p>
|
237
|
-
<p>(You can argue that Twitter should embrace the concept of “sub-accounts” that enforce the idea of a “follow-only” account/group/thing. I haven’t thought it through, but it might make sense).</p>
|
238
|
-
<p>Pretty cool, eh?</p>
|
239
|
-
<h3>What About Group Type 1</h3>
|
240
|
-
<p>All of this just-make-another-account stuff got me thinking about Type 1 groups again. I think there’s an opportunity for some clever web guys to come in and solve this problem. They can do it today, it won’t require any work on the part of Twitter or any Twitter client developers (less work for me, right?)</p>
|
241
|
-
<p>Here’s what I propose. A “group” would simply be another Twitter account. For example, I could make a group called @berkeley_cheese_eaters. I love cheese. I live in Berkeley (for a few more months, at least). I’m sure there are some other people here who love cheese. Now, I made this account, what I would do is register this account with this fancy new “twitter grouper service”. This service would monitor @replies to that account and basically re-post any tweets received on behalf of that account.</p>
|
74
|
+
<p><p>Sed sapien elit, commodo aliquet, tristique at, molestie ut, orci. Aliquam eget erat. Nulla congue urna ut felis. Cras mauris. Proin mauris nulla, malesuada sit amet, luctus a, condimentum gravida, ante.</p>
|
75
|
+
<h3>Nulla risus justo</h3>
|
76
|
+
<p>Nulla risus justo, mollis a, varius eget, viverra ac, sem. In hac habitasse platea dictumst. Cras pretium. Nunc at tortor sed ante tincidunt auctor. Vestibulum porttitor, est a feugiat laoreet, lectus sem tincidunt eros, id fringilla neque turpis sit amet diam. Aliquam aliquam posuere odio. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam varius fermentum nisl. Ut eros. Integer in nunc. Nam sollicitudin. Integer metus ligula, vestibulum et, porta sit amet, scelerisque et, urna. Duis eros.</p>
|
242
77
|
<p>If I wanted to send a tweet to a group, it would be as simple as tweeting:</p>
|
243
78
|
<blockquote><p>
|
244
79
|
<code><br />
|
@@ -252,80 +87,13 @@ Man, I love cheese.<br />
|
|
252
87
|
- @atebits<br />
|
253
88
|
</code>
|
254
89
|
</p></blockquote>
|
255
|
-
<p>Obviously, the tweet would be posted “from” @berkeley_cheese_eaters, so you’d have to put who it was really from somewhere.</p>
|
256
|
-
<p>If someone else wanted to subscribe to this group, all they have to do is follow @berkeley_cheese_eaters! You can implement “private” groups by protecting updates. Owners of a group can “block” people. Twitter already supports all the necessary functions.</p>
|
257
|
-
<p>The other benefit of a system like this is that there’s no lock-in. It lives right on top of the Twitter universe, and there’s nothing stopping a bunch of different “grouping” services with different fancy features. As long as they all used this basic mechanism, there wouldn’t be any interoperability issues, and they wouldn’t need any special treatment from Twitter or from client developers.</p>
|
258
|
-
<p>Someone go build that.</p>
|
259
|
-
<p><b>Update:</b> thanks to <a href="https://twitter.com/richyfrost">@richyfrost</a>, who just pointed me at <a href="http://www.grouptweet.com/"> grouptweet.com </a> which looks very slick (and I honestly had no idea even existed). You do have to DM the group (rather than send it a plain @reply), but perhaps that makes more sense?</p>
|
260
|
-
</p>
|
261
90
|
</div>
|
262
91
|
|
263
92
|
|
264
|
-
|
265
|
-
<div class="entry" id="post-115">
|
266
|
-
<h3><a href="http://blog.atebits.com/2009/02/updated-bookmarklet/" rel="bookmark">Updated Bookmarklet</a></h3>
|
267
|
-
<p class="posted">February 12, 2009</p>
|
268
|
-
<p><p>I just updated/shamelessly-ripped-off the instructions for setting up a bookmarklet for Tweetie.</p>
|
269
|
-
<p><a href="http://www.atebits.com/software/tweetie/bookmarklet/">http://www.atebits.com/software/tweetie/bookmarklet/</a></p>
|
270
|
-
<p><center><br />
|
271
|
-
<object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=3192272&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=3192272&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object><br /><a href="http://vimeo.com/3192272">Tweetie Bookmarklet</a> from <a href="http://vimeo.com/user1290196">atebits</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
|
272
|
-
<p>Here’s a crappy quality <a href="http://www.youtube.com/watch?v=lJmCvdVQqZE">YouTube link</a> for those of you using iPhones.<br />
|
273
|
-
</center></p>
|
274
|
-
</p>
|
275
|
-
</div>
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
93
|
<ul id="paging">
|
282
94
|
<li id="p-newer"><a href="http://blog.atebits.com/page/2/"></a></li>
|
283
95
|
<li id="p-older"><a href="http://blog.atebits.com/page/2/">Previous page</a></li>
|
284
96
|
</ul>
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
<!--
|
289
|
-
<div id="secondaryContent">
|
290
|
-
<center>
|
291
|
-
<table>
|
292
|
-
<tr>
|
293
|
-
<td valign=top>
|
294
|
-
|
295
|
-
<br>
|
296
|
-
<form id="searchform" method="get" action="http://blog.atebits.com">
|
297
|
-
<div>
|
298
|
-
<input type="text" name="s" id="s" size="15" />
|
299
|
-
<input type="submit" value="Search" />
|
300
|
-
</div>
|
301
|
-
</form>
|
302
|
-
|
303
|
-
</td>
|
304
|
-
<td valign=top>
|
305
|
-
|
306
|
-
<ul class="archiveList">
|
307
|
-
<li><a href='http://blog.atebits.com/2009/04/' title='April 2009'>April 2009</a></li>
|
308
|
-
<li><a href='http://blog.atebits.com/2009/03/' title='March 2009'>March 2009</a></li>
|
309
|
-
<li><a href='http://blog.atebits.com/2009/02/' title='February 2009'>February 2009</a></li>
|
310
|
-
<li><a href='http://blog.atebits.com/2009/01/' title='January 2009'>January 2009</a></li>
|
311
|
-
<li><a href='http://blog.atebits.com/2008/12/' title='December 2008'>December 2008</a></li>
|
312
|
-
<li><a href='http://blog.atebits.com/2008/11/' title='November 2008'>November 2008</a></li>
|
313
|
-
<li><a href='http://blog.atebits.com/2008/08/' title='August 2008'>August 2008</a></li>
|
314
|
-
<li><a href='http://blog.atebits.com/2008/03/' title='March 2008'>March 2008</a></li>
|
315
|
-
<li><a href='http://blog.atebits.com/2008/01/' title='January 2008'>January 2008</a></li>
|
316
|
-
<li><a href='http://blog.atebits.com/2007/12/' title='December 2007'>December 2007</a></li>
|
317
|
-
</ul>
|
318
|
-
|
319
|
-
|
320
|
-
</td>
|
321
|
-
</tr>
|
322
|
-
</table>
|
323
|
-
</center>
|
324
|
-
</div>
|
325
|
-
|
326
|
-
<div id="footer">
|
327
|
-
</div>
|
328
|
-
-->
|
329
97
|
</div><!-- content -->
|
330
98
|
<div id="footer">
|
331
99
|
<ul>
|
@@ -335,17 +103,13 @@ Man, I love cheese.<br />
|
|
335
103
|
</div><!-- footer -->
|
336
104
|
</div><!-- wrapper -->
|
337
105
|
<script type="text/javascript">
|
338
|
-
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
|
339
|
-
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
|
106
|
+
//var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
|
107
|
+
//document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
|
340
108
|
</script>
|
341
109
|
<script type="text/javascript">
|
342
|
-
try {
|
343
|
-
var pageTracker = _gat._getTracker("UA-7648202-1");
|
344
|
-
pageTracker._trackPageview();
|
345
|
-
} catch(err) {}
|
346
|
-
</
|
347
|
-
|
348
|
-
Design and front-end coding by Made by Elephant: http://madebyelephant.com/
|
349
|
-
-->
|
350
|
-
<!-- Dynamic Page Served (once) in 0.405 seconds -->
|
351
|
-
<!-- Cached page generated by WP-Super-Cache on 2009-04-21 13:34:25 -->
|
110
|
+
//try {
|
111
|
+
//var pageTracker = _gat._getTracker("UA-7648202-1");
|
112
|
+
//pageTracker._trackPageview();
|
113
|
+
//} catch(err) {}
|
114
|
+
</script></body>
|
115
|
+
</html>
|