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 CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
2
  :major: 0
3
3
  :minor: 1
4
- :patch: 15
4
+ :patch: 16
@@ -123,7 +123,7 @@ a:active {
123
123
  color: #111;
124
124
  text-align: center;
125
125
  margin: 0;
126
- background: url(http://atebits.cachefly.net/atebits/img/slogan.png) no-repeat center -16px;
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(http://atebits.cachefly.net/atebits/img/more.png) no-repeat;
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(http://atebits.cachefly.net/atebits/img/body-home.png);
214
+ background-image: url(img/body-home.png);
215
215
  }
216
216
 
217
217
  body {
218
- background: #fff url(http://atebits.cachefly.net/atebits/img/body.png) repeat 0 0;
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(http://atebits.cachefly.net/atebits/img/body-home.png) repeat 0 0;
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(http://atebits.cachefly.net/atebits/img/content.png) no-repeat 0 0;
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(http://atebits.cachefly.net/atebits/img/content-product.png) no-repeat right 0;
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(http://atebits.cachefly.net/atebits/img/sec-navigation.png) repeat-x;
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(http://atebits.cachefly.net/atebits/img/sec-navigation-li.png) no-repeat right 0;
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(http://atebits.cachefly.net/atebits/img/rss.png) no-repeat right 10px;
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(http://atebits.cachefly.net/atebits/img/rss-span.png) no-repeat 0 9px;
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(http://atebits.cachefly.net/atebits/img/search.png) no-repeat 0 0;
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(http://atebits.cachefly.net/atebits/img/archive.png) no-repeat right 17px;
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(http://atebits.cachefly.net/atebits/img/archive-li.png) repeat-y center 0;
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(http://atebits.cachefly.net/atebits/img/archive-li-first.png) no-repeat center 0;
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(http://atebits.cachefly.net/atebits/img/archive-li-last.png) no-repeat center bottom;
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(http://atebits.cachefly.net/atebits/img/archive-li-hover.png) repeat-x 0 20px;
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(http://atebits.cachefly.net/atebits/img/wrapper.png) repeat-x 0 0;
532
+ background: url(img/wrapper.png) repeat-x 0 0;
533
533
  }
534
534
 
535
535
  #home #wrapper {
536
- background: url(http://atebits.cachefly.net/atebits/img/wrapper-home.png) repeat-x 0 0;
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(http://atebits.cachefly.net/atebits/img/header.png) no-repeat 50% 0;
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(http://atebits.cachefly.net/atebits/img/products-li-large.png) no-repeat center 0;
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(http://atebits.cachefly.net/atebits/img/products-li.png) no-repeat 229px center;
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(http://atebits.cachefly.net/atebits/img/scribbles-small-name.png);
628
+ background-image: url(img/scribbles-small-name.png);
629
629
  }
630
630
 
631
631
  #product-tfi a {
632
- background-image: url(http://atebits.cachefly.net/atebits/img/tweetiei-small-name.png);
632
+ background-image: url(img/tweetiei-small-name.png);
633
633
  }
634
634
 
635
635
  #product-tfm a {
636
- background-image: url(http://atebits.cachefly.net/atebits/img/tweetiem-small-name.png);
636
+ background-image: url(img/tweetiem-small-name.png);
637
637
  }
638
638
 
639
639
  #home #product-s a {
640
- background-image: url(http://atebits.cachefly.net/atebits/img/scribbles-large-name.png);
640
+ background-image: url(img/scribbles-large-name.png);
641
641
  }
642
642
 
643
643
  #home #product-tfi a {
644
- background-image: url(http://atebits.cachefly.net/atebits/img/tweetiei-large-name.png);
644
+ background-image: url(img/tweetiei-large-name.png);
645
645
  }
646
646
 
647
647
  #home #product-tfm a {
648
- background-image: url(http://atebits.cachefly.net/atebits/img/tweetiem-large-name.png);
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(http://atebits.cachefly.net/atebits/img/masthead.png) no-repeat center bottom;
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(http://atebits.cachefly.net/atebits/img/nav-li.png) no-repeat right 0;
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(http://atebits.cachefly.net/atebits/img/nav-a.png) repeat-x 0 0;
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(http://atebits.cachefly.net/atebits/img/nav-a-first.png) no-repeat 0 0;
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(http://atebits.cachefly.net/atebits/img/nav-a-last.png) no-repeat right 0;
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(http://atebits.cachefly.net/atebits/img/logo.png) no-repeat 0 1px;
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(http://atebits.cachefly.net/atebits/img/footer.png) repeat-x 0 0;
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(http://atebits.cachefly.net/atebits/img/slogan.png) no-repeat center -46px;
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(http://atebits.cachefly.net/atebits/img/contact-gs.png) no-repeat;
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(http://atebits.cachefly.net/atebits/img/inner.png) repeat-x 0 0;
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(http://atebits.cachefly.net/atebits/img/gallery-nav.png);
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(http://atebits.cachefly.net/atebits/img/entry.png) no-repeat center bottom;
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(http://atebits.cachefly.net/atebits/img/inner.png) repeat-x 0 0;
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(http://atebits.cachefly.net/atebits/img/inner.png) repeat-x 0 0;
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(http://atebits.cachefly.net/atebits/img/inner.png) repeat-x 0 0;
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(http://atebits.cachefly.net/atebits/img/gallery-nav.png);
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(http://atebits.cachefly.net/atebits/img/inner.png) repeat-x 0 0;
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(http://atebits.cachefly.net/atebits/img/buy-button.png) no-repeat 0 0;
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(http://atebits.cachefly.net/atebits/img/calltoaction.png) no-repeat 0 0;
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(http://atebits.cachefly.net/atebits/img/calltoaction-sep.png) no-repeat 109px center;
1544
+ background: url(img/calltoaction-sep.png) no-repeat 109px center;
1545
1545
  }
1546
1546
 
1547
1547
  #cta-download {
1548
- background: url(http://atebits.cachefly.net/atebits/img/calltoaction-sep.png) no-repeat -1px center;
1548
+ background: url(img/calltoaction-sep.png) no-repeat -1px center;
1549
1549
  }
1550
1550
 
1551
1551
  #cta-buy a {
1552
- background-image: url(http://atebits.cachefly.net/atebits/img/calltoaction-buy.png);
1552
+ background-image: url(img/calltoaction-buy.png);
1553
1553
  }
1554
1554
 
1555
1555
  #cta-download a {
1556
- background-image: url(http://atebits.cachefly.net/atebits/img/calltoaction-download.png);
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(http://atebits.cachefly.net/atebits/img/tweetie-mac/introductory.png) no-repeat 0 0;
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(http://atebits.cachefly.net/atebits/img/scribbles-large-name.png);
1657
+ background-image: url(img/scribbles-large-name.png);
1658
1658
  }
1659
1659
 
1660
1660
  #tweetie-mac.product h2 a {
1661
- background-image: url(http://atebits.cachefly.net/atebits/img/tweetiem-large-name.png);
1661
+ background-image: url(img/tweetiem-large-name.png);
1662
1662
  }
1663
1663
 
1664
1664
  #tweetie-iphone.product h2 a {
1665
- background-image: url(http://atebits.cachefly.net/atebits/img/tweetiei-large-name.png);
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(http://atebits.cachefly.net/atebits/img/inner.png) repeat-x 0 0;
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&hellip;" name="s" id="s" onfocus="if(this.value == 'search&hellip;'){this.value = ''}" onblur="if(this.value == ''){this.value = 'search&hellip;'}" />
47
47
  </form>
48
48
  </li>
49
- <li id="sn-rss"><a href="http://blog.atebits.com/feed/rss/"><span>rss-feed</span></a></l>
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="http://blog.atebits.com/2009/04/bigbird/" rel="bookmark">Bigbird</a></h3>
54
+ <h3><a href="#" rel="bookmark">Title</a></h3>
55
55
  <p class="posted">April 7, 2009</p>
56
- <p><p>Chances are you&#8217;re reading this on the stunning redesign of <b>atebits.com</b>. Thanks to <a href="http://timvandamme.com/">Tim Van Damme</a> of <a href="http://madebyelephant.com/">Made by Elephant</a> for his brilliant work.</p>
57
- <p>This redesign is in celebration of the imminent release of a new app, <a href="http://www.atebits.com/tweetie-mac/">Tweetie for Mac</a>. In many ways it is the bigger cousin of the iPhone version (hence the codename: &#8220;Bigbird&#8221;). Tweetie for Mac is more than a port in fact, it&#8217;s a complete rewrite. The new core is faster, more stable, and more extensible than its predecessor. Not only will it form the foundation of the Mac version, but also the foundation of the next generation of Tweetie 2.0 for iPhone.</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="http://blog.atebits.com/2009/03/not-your-average-iphone-screencast/" rel="bookmark">Not Your Average iPhone Screencast</a></h3>
63
+ <h3><a href="#" rel="bookmark">Proin dictum&#8230;</a></h3>
66
64
  <p class="posted">March 11, 2009</p>
67
- <p><p>So you finished your amazing new iPhone app, it <a href="http://blog.atebits.com/2008/12/fast-scrolling-in-tweetie-with-uitableview/">scrolls like butter</a>, now you need to show the world. You could make a screencast by clicking around in the iPhone Simulator, but that has a tendency to look like you just clicked around in the iPhone Simulator.</p>
68
- <p>I&#8217;m starting to put together some <a href="http://www.youtube.com/8tebits">screencasts</a> for <a href="http://www.atebits.com/software/tweetie/">Tweetie</a>, and a number of developers asked how I made them look so awesome. Today I&#8217;m happy to share. The trick is a little app I wrote called SimFinger. It&#8217;s not a screencapture tool, rather it&#8217;s a bundle of little tricks to make a screencapture of the iPhone Simulator suck less.</p>
69
- <h2>SimFinger</h2>
70
- <p>First, <a href="http://atebits.cachefly.net/blog/simfinger/simfinger.zip">download a copy of SimFinger</a>. If you launch it, you&#8217;ll end up with something that looks like the shot below. SimFinger itself is composed of two parts. One is a fake &#8220;frame&#8221; 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 &#8220;indents&#8221; when you press down with your mouse, indicating what would be a &#8220;touch&#8221; 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&#8217;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 &#8220;Link&#8221; button to Add to Instapaper faster, and repost individual links</li>
83
- <li><a href="http://www.youtube.com/watch?v=zZbrIenzxZ4&#038;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 &#8220;RT&#8221; 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 &#8220;(null)&#8221; 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&#8217;m astonished that many people don&#8217;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: &#8220;<code>@atebits man, I would *love* to go to a party with you.</code>&#8220;, 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 &#8220;<code>@username</code>&#8221; 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&#8217;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 &#8220;<code>in reply to atebits</code>&#8220;. 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&#8217;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&#8217;d like to reply to&#8230; 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&#8217;s not how it works today, so you should keep it in mind. If you want it to change, well, I&#8217;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&#8217;t include a Twitter &#8220;friend address book&#8221; in the Compose screen. A lot of people have requested it so they can reply to multiple people&#8230; to them I say: please read this blog post. There is a second reason why Tweetie doesn&#8217;t have that feature, but it&#8217;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&#8217;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&#8217;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 &#8220;approve&#8221; 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&#8217;s it</li>
166
- </ol>
167
- <p>OAuth will make you – the user – jump through these hoops so you don&#8217;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 &#8220;browser&#8221; 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&#8217;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&#8217;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&#8217;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&#8217;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>&#8220;Integrated sensibly&#8221; 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&#8217;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&#8217;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 &#8220;authentication gateway&#8221; 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, &#8220;blessed&#8221; 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 &#8220;blessed&#8221; 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&#8217;t logged and proxy settings haven&#8217;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&#8217;s password. An OS vendor could prevent this by doing a &#8220;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&#8221; (or ideally a something a little less cheesy). A number of financial sites use this trick. The benefit is that each provider wouldn&#8217;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&#8217;t have an interface) that nobody has even thought of yet.</p>
184
- <h2>Chicken / Egg</h2>
185
- <p>There&#8217;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&#8217;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&#8217;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&#8217;s good enough for me, and that&#8217;s good enough for everyone who uses an email client today. It would be easy enough require other web apps to use the &#8220;web browser&#8221;-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 &#8220;authentication gateway&#8221; 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&#8217;s probably better for now for each app to carry their own.</p>
188
- <p>There&#8217;s nothing stopping apps from sharing code, I&#8217;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&#8217;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&#8230;</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>When people talk about Twitter Groups, they are probably talking about one of two completely different things.</p>
213
- <h3>Twitter Group Type 1</h3>
214
- <p>A way for a bunch of people to &#8220;join&#8221; a particular group, so that tweets sent to that group get routed to all the members.</p>
215
- <h3>Twitter Group Type 2</h3>
216
- <p>A client-side way for you to organize the people you follow into &#8220;subsets&#8221;, so you can classify tweets into different &#8220;streams&#8221; (for example, I could create a a Twitter development &#8220;group&#8221; 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&#8217;s hard to blame them. If you follow a ton of people it&#8217;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 &#8220;friendships&#8221; is Twitter&#8217;s single greatest stroke of brilliance. It also helps to remember that <a href="http://www.twitterisntemail.com/">you don&#8217;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 &#8220;<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>&#8220;. In fact, you can do this in Tweetie right now and use the saved searches feature to create pseudo-saved-&#8221;groups&#8221;.</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 &#8220;group&#8221;. The second problem is that it flat-out doesn&#8217;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&#8217;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 &#8220;from:tweetie&#8221; 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&#8217;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&#8217;re also dealing with something that doesn&#8217;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&#8217;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&#8217;s constantly grabbing the freshest stuff from Twitter. There are going to be very few &#8220;gaps&#8221; 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 &#8220;fresh&#8221; tweets in a single request. If you think about <i>why</i> people want groups, it&#8217;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 &#8220;noise&#8221;. There&#8217;s a good chance that there is enough &#8220;noise&#8221; to push those rare, important tweets way down in your timeline. As a result, they&#8217;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&#8217;t follow any &#8220;noisy&#8221; people, it might work fine. But &#8220;might&#8221; 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 &#8220;followers&#8221; and could automatically interleave tweets from all these people server-side, so clients didn&#8217;t have to make tons of requests. Not only that, but it works with protected users and won&#8217;t ever get drowned by &#8220;noisy&#8221; tweeters.</p>
231
- <p>Twitter <b>does</b> have this feature. It&#8217;s available today, for free, and clients don&#8217;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&#8230; um, oh, hrm, wait, no&#8230; ah&#8230; so you&#8217;re saying&#8230; 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 &#8220;subset&#8221;, call it a &#8220;group&#8221;, 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 &#8220;groups&#8221; will &#8220;sync&#8221; 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&#8217;re replying there&#8217;s a button on the compose screen that lets you switch the &#8220;sender&#8221; account. You can set up a &#8220;follow&#8221;-only account and when you want to reply to something from it, just tap a switch to send it from your &#8220;real&#8221; account.</p>
236
- <p>Now, the user-experience isn&#8217;t perfect, but it&#8217;s perfectly functional. Plus, you can do it today. Even cooler, Twitter doesn&#8217;t need to do anything special to support it, and neither does Tweetie. I don&#8217;t mean to sound lazy, but less features == less bugs.</p>
237
- <p>(You can argue that Twitter should embrace the concept of &#8220;sub-accounts&#8221; that enforce the idea of a &#8220;follow-only&#8221; account/group/thing. I haven&#8217;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&#8217;s an opportunity for some clever web guys to come in and solve this problem. They can do it today, it won&#8217;t require any work on the part of Twitter or any Twitter client developers (less work for me, right?)</p>
241
- <p>Here&#8217;s what I propose. A &#8220;group&#8221; 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&#8217;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 &#8220;twitter grouper service&#8221;. 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 &#8220;from&#8221; @berkeley_cheese_eaters, so you&#8217;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 &#8220;private&#8221; groups by protecting updates. Owners of a group can &#8220;block&#8221; people. Twitter already supports all the necessary functions.</p>
257
- <p>The other benefit of a system like this is that there&#8217;s no lock-in. It lives right on top of the Twitter universe, and there&#8217;s nothing stopping a bunch of different &#8220;grouping&#8221; services with different fancy features. As long as they all used this basic mechanism, there wouldn&#8217;t be any interoperability issues, and they wouldn&#8217;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&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=3192272&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;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&#8217;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) {}</script></body>
346
- </html>
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>
@@ -19,7 +19,7 @@
19
19
  <!--! Header -->
20
20
  <div id="header">
21
21
 
22
- <!--! Logotyp -->
22
+ <!--! Logotype -->
23
23
  <div id="logo" py:choose="">
24
24
  <a py:when="chrome.logo.src" href="${chrome.logo.link}"><img
25
25
  src="${chrome.logo.src}" alt="${chrome.logo.alt}" /></a>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ktec-subtrac
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.15
4
+ version: 0.1.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - Keith Salisbury