<![CDATA[TimBroder.com RSS Feed]]>https://www.timbroder.comGatsbyJSFri, 29 Mar 2024 12:53:09 GMT<![CDATA[No title]]>https://www.timbroder.com/2024/02/games-i-was-addicted-to-in-2014https://www.timbroder.com/2024/02/games-i-was-addicted-to-in-2014<div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">---</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <p>author: tim comments: true date: 2015-03-10 14:03:30+00:00 dsq_thread_id: '3716258245' layout: post link: <a href="http://tekside.net/iphonaddict/2015/1/11/games-i-was-addicted-to-in-20">http://tekside.net/iphonaddict/2015/1/11/games-i-was-addicted-to-in-20</a> slug: games-i-was-addicted-to-in-2014 title: Games I was addicted to in 2014 wordpress_id: 1805 category: Commentary tags:</p> <ul> <li>ios</li> </ul> <hr> <p>I posted on <a href="http://tekside.net/iphonaddict/2015/1/11/games-i-was-addicted-to-in-20">TekSide</a>:</p> <p>I don't consider myself a gamer anymore. I used to be. Countless, countless hours in Final Fantasy 6-9, Zelda, Tetris, Alleyway, Neverwinter, Halo, Fallout, Half life, Oblivion. The list goes on. I cut my teeth on a gameboy and SNES and kept going. Things dropped off after Halo 2. I surfaced for Halo  3 (a lot) and 4 (less so). I didn't play much on my phone during my years on Android; the games really weren't that great or polished.</p> <p>Part of my commute is a 10 minute subway ride. Something quick to play is appreciated, but I've been looking for something a little more immersive. Something I can sit and get lost in for a few hours. The other part of my commute is a 30 min commuter train ride where I'm either reading instapaper, napping, or playing a game while listening to podcasts.</p> <p><strong><a href="http://apple.co/1DzraiL">Baldur's Gate</a></strong> - I found this very late in the year. In fact I think I installed it at my in-laws on Christmas morning. I had never played either of the originals and was curious. It was one of the few games that consistently showed up on "best iOS RPG" when I was searching for something to play. The face that it looked like Neverwinter was a huge bonus for me. The tutorial for this game is very, very buggy and was very off-putting. Once I got past that though, everything changed. The game mechanics started making sense: pinching and zooming the map is fluid and tapping on your party to direct their targets just felt completely natural. The story quickly swept me in and I started questing. When I play RPGs, I try to do all the side quests. Baldur's Gate is no different. I'm currently grinding my way through a number of maps looking for someone's lost cloak. Perfect gameplay for listening to podcasts on the train. Outside of that though the music and sound effects are top notch. If you were ever a fan of D&#x26;D style point+click RPGs, this will feel right at home. If you've never tried them, I can't recommend this game enough.</p> <p><a href="/images/2015/03/1.png"><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <span class="gatsby-resp-image-background-image" style="padding-bottom: 75.31645569620254%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC+UlEQVR42pWQ2W7jRhREW5Qors19p2iKErV4bEsitY2tSWwgxiBBtv//mhNIHmTmMXk4qO6L6rroEvd3OZPWJ9q5pH1AuLNZXe7YvEz4+nfP6x9bVpeSqjO522osO53VwWXah5Q7n7wLmJ08ZrOAeVIgPlURs2VEeYhIDz7hzmV5aXg6eRz6lD9/f+HTKaM62Mw3Gg97h/YYUnUBdR9xtw9ZfQ5YrTMeyhrRzTPq1mfRZ8x3KeUxIut8ZluVbWfz+ODTPFnUe0ndS5reozlE1PuIYuMw3VvMO4O6DmjyAnFYFayXIc/HGT89t7SnmOkuYNlJ3t5XrDuH5UGy6E3SrU3V+0zOAcG1oieLfDEmmSjEoU3sBojHWcbxoeSvtw2/fXnkfKpYb1w2Z4/ny5ztseDytmTRGWy+lDR9SP0SMTmGxK2Fk6iYUiH2PD7dNYjtPGPTZvx6eeDr6z3dOaV+Mnl5X3P+ecrz64LDqeTxFPDLe89Tn3J/jokXEi/SGWsqQgxIPI9VPUWc1iWZbyJNg2YW0uwTsp3L5lLzeCz5fFmweZ5wfylYbhLyUuI4OsPBEGWgMBDKLTB1LCZxiugXGZNIMhoMUZUhlqXh5xbpSpLPLOYLm3rhEmc2tqmgKgrqQMFQRzd0Vb3N8jBkmuWItspYTiIsbYShjXFsE8+5PrZwpY3n2rjSxJUWnmPd7tI20VQFXR0ijTFt4RC5LosiRSR5wzRPUYRAjjUmukZp6NSmTnOtwTSYmgZ3hk6hawS6jj1S0cUAIQSjoUIVSxxTp04jRFuEtJnL8NtXTDHAEIN/1fpBzR/nyrU/gTockgUWoWPTVjlimvpMY8lIUW4bxW3zf0HcuAYWoU3oSaos/AhsMwdl8N30f1CHCpPEJZQ6bWYjirKmSgJcQ8XWxkj9O5E0COwPfOtDHUO/+WxNxVRHeJZO6tuE0mRZeIgqD/BsE32kYqjjG9ezOR6TBB5x4JMnMWkU4kkb17a+eUY3n66OUYRC4kua3Ocf24F2iOiqOF4AAAAASUVORK5CYII='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="1" title="" src="/static/60f332685554ae0583a489badb98183b/f058b/1-1024x768.png" srcset="/static/60f332685554ae0583a489badb98183b/c26ae/1-1024x768.png 158w, /static/60f332685554ae0583a489badb98183b/6bdcf/1-1024x768.png 315w, /static/60f332685554ae0583a489badb98183b/f058b/1-1024x768.png 630w, /static/60f332685554ae0583a489badb98183b/40601/1-1024x768.png 945w, /static/60f332685554ae0583a489badb98183b/2bef9/1-1024x768.png 1024w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </span></a></p> <p><strong><a href="http://apple.co/1Dzrkql">Tiny Tower</a> &#x26; <a href="http://apple.co/1LGeXPK">Pocket Trains</a></strong> - I put these games together because while very different games, they have similar gameplay mechanics. Build out your empire! In Tiny Tower, this takes the form of expanding a single tower. Inside this tower are all your Bitizens live: Where they eat, where they work, and where they have fun. Ala Sim City, but in an enclosed environment. In Pocket trains, you expand your train line, going for a trans-continental goal. Pick the cargo for your trains, build tracks, repair the engines, and race against the clock. Both games have IAP to buy coins and bucks to get you through the game faster. I've never used real world money in either and it's just as enjoyable</p> <p><strong><a href="http://apple.co/1LGeYmQ">RGB Express</a></strong> - This is a good puzzle game where you draw routes for your drivers, picking up packages and making sure that every house receives the correct package. Setup your route, press play, watch your trucks zoom, and hope you didn't create any collisions! Pro Tip: You can set the playback to run the trucks at a faster speed. Kudos to the iOSDocked crew for making this the GameCenter Showdown in episode 77.</p> <p><strong><a href="http://apple.co/1Dzrxdd">Threes</a></strong> - Threes is a tiny puzzle that grows on you. It looks simple at first. But at some point you figure out you need a strategy to go higher. Match the same number, it triples and collapses. Keep going. Build higher and higher. Compete with your friends. It gets harder the higher you go and becomes addicting trying to get to that next score. I play tower defense style: Building into one of the top two corners and slowly growing numbers in those directions. What's your high score?</p> <p><a href="/images/2015/03/2.png"><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <span class="gatsby-resp-image-background-image" style="padding-bottom: 177.8481012658228%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAkCAIAAAAGkY33AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFlElEQVR42qVV60/bVhT3P9ovU9dNayttnaZq0qQyRqVpQpq0tdC1pYwAXUgKCTgP4iROSDDk4bx5JoSA84Q8nQT7PnztKTZvVfuyo0i5Pvf8fJ7+HQr9D6GMP4yxoigY49t3ii53NHj0u7a6BEuS1Gp1RLGPEDQ0AIBWu9PudIEMrsF9GbUkdHGloDDGkiSbPtpDXNxkthdLgqapqkoYdjPCZ9zeEMNymqapCBz28OShahHU13kCdBeUouDh8OLFxJ9LVufznyZTmT1NlwXz2qvphXcfLAvmtdEzBtEz/E1MfZXXnvCqDBG+9uz1cUsWVyAY7XR6hCiSJEVjGYvVbbG6Y/EsgFDBqHeBAoW+NdEI7p3f5AwArJ81W+2OqmoYY0KU82a7WBKa7c55q12u1kWxr1cUSxdiQzhpVCt3CkYIURQFAAChUTBMCDG6QAgxugANvaoq+hWEiNLt74t+B3WYcfyMgaIolKap130jhBjVAgDIMnC6fccnAoRIUQy9ej0Usiw3zppUjM9Ikmy8qVyps0Fuzel1utlgKPL7q/d2mvEHODvNMP5wMr1z7VPs9wOhKLURjhaOSpqmKQr2eDeESm2vUPT6QwBAbpvPF4rlco12eXs9kXb5KpW6pqoQwpFzBKn3H+bKlbqqEoQxy4ZR6qAfSphm503zc9ZPttdTUzMzM4wvYFtZXrLaa/WzkSVCF0BeZcOUn/EVj0dThTD2B8Lw/KyVLwQC4Xq94fUHozHe52c93kAul1ul1yvVuqqqCCIJAudGmHo+6y4eHaujcpA5G/NsmX9m5hasjlqtYVlxxPh0Orv39/xSuVJfNNuEclXT9LARVlRCfWHfLxV1MEFvnVtf8fhrTpxdce9mUl5/MM7zcZ7fjiZazfPQZvRUGIERhADB+N4h9eXafunoBvw4iZ5si3+Z17xu5yrtXvcwTqdrKxJfX3cHNraEclVVVYzQQJZMdif19J37uFgywp5d8T5aSjya50wWR6Vc+8di5yLxTS46t2ApHp+Owq5chY1Rdzigtrcieb1VGGMfG+532lVBCG5w3W43FI4c5I9qo8qFBoMB4w+dXuWMEGp0u5R9zXlyWjFUW5Ek4/VGojG3x2e1LAWC4ampqenpaW4rxjIexrdR1qt9GbbNSbk97FHx5NJzYDMSjW9FYm4Pm05n1hk2EuW9PnbV4yt32q5AWBAu3UCEsoUC5XD58oXjUb0IWXUwB/liIpX7ZHO0O+KnFUc6vXNQEha/G6s++3Xp+1+ExpmmEqNVRFWpRCpn5Awh5CKJVCrFJxLp7O5RIb9/UEgmkrFsJvnjpDb+lvt24rRxrhGCILoAwO4PUXwyc5AvGuDQZiydySRTaT6R9nmZTHaPj/PJvT3++W/axNvQ4xelekNTiTFh7tAm5XD7avUzokswHPEHOI93Y/7jMp/MzX9c9jBBlovO/jARefqzbeKPltgnimKEjTCmwlu8LMvGVypJslCuliv1Sq0hlKvVWkOo1EaHs6Z/OxFJ5u5QPoRUq9WRZfma7g0yGJHvHSHShXR+3roiqSve7nTahKgGuWia9n5mhqZps9lcq9U4jnO5XDRNJ5NJjuMGg8G9BULt7O4avAMA0DRtdXX14cOHk5OTLMsuLi6Oj4+/fPlybGzswYMHu1eWN+DhcHgdM8bY6XTmcjmTyWSz2ebm5miatlqtNE2/efPm8PDQaMoN+N5yM7hW07RmszkcDo3hMYj5nuUIfPtNGGP9EUIAFP0MR8xskDMwDD6zYg2RARgMhp1ur9MVRXHQ7w+6PbEn9ns9sd3pDYZD+dbGvAPGGHe7veOTMp/aSWX3iyWhUDxJZfb3D4rZncMYny2dlLtdUY/uc56NhXSZ5OiIFX3p6ymPcv6vsK8mB94bhts76Db4X4CpdG3BVEzxAAAAAElFTkSuQmCC'); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="2" title="" src="/static/cd2fedb8b1ff6941ee9e487586960f3d/f058b/2.png" srcset="/static/cd2fedb8b1ff6941ee9e487586960f3d/c26ae/2.png 158w, /static/cd2fedb8b1ff6941ee9e487586960f3d/6bdcf/2.png 315w, /static/cd2fedb8b1ff6941ee9e487586960f3d/f058b/2.png 630w, /static/cd2fedb8b1ff6941ee9e487586960f3d/1d69c/2.png 750w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </span></a></p> <p><strong><a href="http://apple.co/1LGf2Dc">2048</a></strong> - This game is very similar to threes (maybe too much so). But, it's still fun. I keep this one around because it takes a little less concentration than threes. It's more mindless and good for when I'm tired or need to think. It's a good distraction. 2048 is my checkers to my Threes chess.</p> <p><a href="/images/2015/03/3.png"><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <span class="gatsby-resp-image-background-image" style="padding-bottom: 177.8481012658228%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAkCAIAAAAGkY33AAAACXBIWXMAAAsTAAALEwEAmpwYAAAGw0lEQVR42oWUWW8b1xmG+Sd614vepBcBCrRAgf6Eok1RF81SBHZRI+iW1LGTOo0d25EcWRYTa5esyJIox9RiS9z3TdwXcRfX4XAdcrgOZ4b7DDlDimRBSbCYAEWBBx8O3vM9OGcwBx+j1Shf0MKJdp0ga5cQlRHjCVlrtfBWAzlXGD263qNqvVOSKgab8pmmaq6pmh2hWWjqVpq61aZ6/iJRzTUVTKoQ6PXbI4WuM7pUrdup9PqddlSHLfwWf/oOvvo2tvR7bP19/OA/+KtPseU/4MtX8NW38afvYAtvkaC2N6C77UqXqo3JcRP+7XsV1vXKxtXa3o2GZKohYzYkjxrSmdrex/jG1QrrOr7+p3bM2BtQ3c4P5JgBW3wLX3sXW75SZX840gRfNpWzLfVibe9jbPnKaGvpd+2obnTya5nuVGiqTtWyZMJEJi0jEmYybiRj+os6llO1LE3V6dfXHvSJQb816HeGw+Fg2B+VMwaj2n/NYHg6HPZGzaf1/mmzS9cZHQLLJgNw3JeJnWSi3uzZIh31pqNeOO6DE4FMInhONhGE4yCcjMPJeDYFtlsoAyul3HpJBnBBIUc67LRreDGPMhPSwSGdzyIOcJ7k+BMwbwLiMY/5E2HJzwHJLyLSN+3Cv2OlPAMrJqMeU7WQ9Fo09RIUtCmrsDPikmcBfQYwQ9yHPdMi7d5piCb90rsly0/Lx7/Ejt8Iqz9AS3kGWkxG3YZC3C9+tV3JRgNWOZqwcr9b9Jl4MGCOHz6g3LtUylwRT/qk9xH3r6vArQb4z7D+C7SQZmClZMipL6Zj0YC7nE16zfJ80p5N2ItpN+g3pDnTXclDSs5s8qe8ortJ1Y8h1U8yqh95JdcwpMiooBmbcAtQbEaUm0H5pkXAOjmYD3LmgwffOA9XeErW7tHannp1/2hLK172yj7yyG945f+wimdwBGZgaA7kMdvSuy31DCG+E3j1NbJ0rbL4Xv3ptcz6zTuejXehlavJ1fej6yr1ZNn0Zt70M8TyRkD1V7RUYGBoHuA+bptXqZy/ofjKtz+NHjxsap7RXlliZ+K5n7eLGg8QIyurPdLONeNflwMfVoEbgHkWLSQZKJqL8h53NY9oz35bdi/4cgZbvd58/i9KzMxu33148vyjPPtWjn0TeqnRPqr7/ojYf1Xz/wbQ30aLMANHYTv/W1A0B3CZEfGijbce2H4Q2vo8vH7Ly57Z1rJmrWvz5rUF84ZGsuSX/sUn/5tf/meb+CscyTJwBPKaRIWEI59wwDG7W70Pi6YL0mlENg2IlhLmR62Tmw3PLdz9yYn0aYH/pCBgIkJmQLCGIhkGWkxFHHI8fWxV7tbynuDRXo3/WTcg7BoXIO7D9MksXXjczs218s9C8nlCcp8OCmntTJTPRJHsSI65lanAEffFEg67g9qXVf6dHmTtObYg7lTGw+wX1rqlnTYiCskWCPlUL23vmlcuZAyBfCZhMWaGQ9ocaPaodvO8B4hwEhPeB3lPQPtjPHq7HPm8ELrjlSyV+F+WhJOo4F6Qv4AiMKNShmxqHuDUg25D2KGzKg/9ZhFwLIs45E6dwMOajS0/AFcngNUJq2gnaJMCdilgl9vVHKyUGr1t0G2ol1LJoKNRggJWRSVjLyUsGGSDwgZ49rPB7L97s5+2mTeD4u0G4suDxkrGHnUrR/8ZK6ZAtzGfCPD3NjEY9FsVaMrGfbHsNQkygCm9dK9vENOqA4K7ERRsIGnny825iFMe92rKo0dSSIAuAwKFA3ZdrZj0W2TlhCXilOYi+lRIl3lyu7/8RXdjivjmk6CIhcHOkE1UiptAl6KcTzBqeNZtlIIeI+gxhp06p04UsCmibg3oUntM0hPOJshejLAXw7srThUn5FBFPUegS+MxSqoozKA7VaKBNKqFZr1ItsodAiNbKNEsky20Q2BtqkbSDZKqk1StQ+JkC23WSo1qgWggFwOwR9eHfaKKpl0Gqces8JjlLqPUpRe79GKnTuzUCt0Gqccoc5tGeaWcHvbJ0cC+GL3tyqDXLEBh+f4zNWdbebBlEO+bFRyLgmNR8o41Iq2ArTzYUnO25fvP8lBocNq6HL10p9o/bRUzEdUhSytgqznbTr0M9NkjXlvU70gCJza1QM3d1grYqkNWIQ0M+gTdqX5PLmWjGu53etGeTrirE+5qBTtaAfuc80Qn2jvivSjB4OB0TD6HaleIeumSBnLJWE6dXfjym19z2m38X8b7vyePQ3dqXar6v3Yv5OGwPQ5B4Oe0CXzQzJJE5QJyVAcDcryZkc/Gx8lmomfEcnAsd7Y4X5/nP2j+Lx6/zwUg/5MWAAAAAElFTkSuQmCC'); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="3" title="" src="/static/5bd2fc54bbc91c9afe2cb8396e3fdab5/f058b/3.png" srcset="/static/5bd2fc54bbc91c9afe2cb8396e3fdab5/c26ae/3.png 158w, /static/5bd2fc54bbc91c9afe2cb8396e3fdab5/6bdcf/3.png 315w, /static/5bd2fc54bbc91c9afe2cb8396e3fdab5/f058b/3.png 630w, /static/5bd2fc54bbc91c9afe2cb8396e3fdab5/1d69c/3.png 750w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </span></a></p> <p><strong><a href="http://apple.co/1DzrKgm">Honorable Mention: Monument Valley</a></strong> - I can't stress enough that you NEED to go play this game. There is no other experience like it on iOS. Control your character through immersive M.C. Escher-like paintings. The levels are gorgeous. You'll spend time just staring at them, moving pieces around just to see what they do. It only gets Honorable Mention because of replay value. I played through it once in a few hours and that was that. But, it's magical. Everyone should play it</p> <p><a href="/images/2015/03/4.jpeg"><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <span class="gatsby-resp-image-background-image" style="padding-bottom: 133.54430379746836%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAbABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIDAQT/xAAWAQEBAQAAAAAAAAAAAAAAAAACAQT/2gAMAwEAAhADEAAAAe4R4JCDzmS2liZT/8QAGxAAAQQDAAAAAAAAAAAAAAAAAAECEBEgITH/2gAIAQEAAQUClC9WI6hvcP/EABgRAAMBAQAAAAAAAAAAAAAAAAABEQIS/9oACAEDAQE/AU7mnYtQh//EABcRAAMBAAAAAAAAAAAAAAAAAAAQERL/2gAIAQIBAT8Bhl//xAAZEAABBQAAAAAAAAAAAAAAAAAQABEgITH/2gAIAQEABj8CLrTUf//EABwQAQACAwADAAAAAAAAAAAAAAEAERAhMXGRsf/aAAgBAQABPyEqPiNXFq3Jsk2X3g3PIm/3gcLP/9oADAMBAAIAAwAAABBLH7z/xAAXEQEBAQEAAAAAAAAAAAAAAAABABAR/9oACAEDAQE/EESLGYcx/8QAFxEBAQEBAAAAAAAAAAAAAAAAAREAEP/aAAgBAgEBPxCB4S67/8QAGxABAAMBAQEBAAAAAAAAAAAAAQARITFxUeH/2gAIAQEAAT8QQIGnTXc5AoKy0ULdg1dqffz5G7cusK6JnsOPdaqrPGWRq7FYl9n/2Q=='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="4" title="" src="/static/29b3667d9e61ac981915cb69d9202052/828fb/4.jpg" srcset="/static/29b3667d9e61ac981915cb69d9202052/ff44c/4.jpg 158w, /static/29b3667d9e61ac981915cb69d9202052/a6688/4.jpg 315w, /static/29b3667d9e61ac981915cb69d9202052/828fb/4.jpg 630w, /static/29b3667d9e61ac981915cb69d9202052/212bf/4.jpg 768w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </span></a></p> <p><a href="/images/2015/03/5.jpeg"><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <span class="gatsby-resp-image-background-image" style="padding-bottom: 133.54430379746836%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAbABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAECBAX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAHiNWw4q4vbMJQP/8QAHBAAAgICAwAAAAAAAAAAAAAAAQIAAxAREiAh/9oACAEBAAEFAgvnHFEbSrK7CkFh10//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAbEAABBAMAAAAAAAAAAAAAAAABABARISAiYf/aAAgBAQAGPwKXKrXjUiZvH//EABwQAQACAgMBAAAAAAAAAAAAAAEAESExIEFhUf/aAAgBAQABPyG5211PBEio9IJV3DdO9PZjuOuGe/kHcZxeH//aAAwDAQACAAMAAAAQcwwA/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPxAf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPxAf/8QAHBABAQADAAMBAAAAAAAAAAAAAREAITEQQVFx/9oACAEBAAE/ENNBQaduLdIvwMi51mkAANpHvMQAWgrXjXYT04zDoKjYr+PmE3UtW3tuKq+LqeP/2Q=='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="5" title="" src="/static/87ad171eb70417d7a00b1cb18ca0eeb5/828fb/5.jpg" srcset="/static/87ad171eb70417d7a00b1cb18ca0eeb5/ff44c/5.jpg 158w, /static/87ad171eb70417d7a00b1cb18ca0eeb5/a6688/5.jpg 315w, /static/87ad171eb70417d7a00b1cb18ca0eeb5/828fb/5.jpg 630w, /static/87ad171eb70417d7a00b1cb18ca0eeb5/212bf/5.jpg 768w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </span></a></p><![CDATA[Fussy Coffee]]>https://www.timbroder.com/2024/02/fussy-coffeehttps://www.timbroder.com/2024/02/fussy-coffee<p>Over the years I've <a href="http://www.marco.org/2010/06/16/the-coffee-setup-2010-i-own-a-lot-of-ways-to" title="read">read</a> or <a href="http://techdistortion.com/podcasts/pragmatic/episode-30-coffee" title="listened">listened</a> to some of the <a href="http://www.caseyliss.com/2014/7/25/neat-ice-kit" title="fussy">fussy</a> drinking <a href="https://david-smith.org/blog/2014/05/22/my-travel-coffee-kit/" title="habbits">habbits</a> of people I respect and follow. I've been meaning to write about what I do for coffee for a while. A <a href="https://twitter.com/jessicalippke" title="coworker">coworker</a> of mine has asked and a recent post by my friend <a href="http://www.samuelstrickland.me/blog/2015/7/coffee-nerdery" title="Sam">Sam</a> kicked me to sit down and write it.</p> <p>Sam talks about Coffee Nerdery and it made me stop and think about how much I get into it. When I was younger, "nerd" had a negative connotation. I learned to not let it bother me a long time ago. <a href="http://fishingboatproceeds.tumblr.com/post/31143873695/now-available-for-pre-order-at-dftba-com-in" title="Nerds are passionate about many things">Nerds are passionate about many things</a>. For me it was comics, computers, books. Now, add a liiiitle bit of coffee into that.</p> <p>Don't get me wrong, <a href="http://www.marco.org/2014/03/31/throwing-k-cups-in-glass-houses" title="regular coffee is just fine">regular coffee is just fine</a>. Half the time, at work, I just have a cup from the pot. (Granted, that's <a href="http://gorillacoffee.com/" title="good coffee">good coffee</a>). But, as I've written about previously, <a href="http://timbroder.com/2014/09/morning-rituals.html" title="rituals are important">rituals are important</a>. Some of what I do with coffee is for the taste. Some of it is the ritual of preparing it and the comfort that it brings. Some of it is feeling included in a club, even if that club exists only online in the form of twitter, slack, and blog posts. Because of a few of the gadgets I use, I thought I was a little nerdier. But, the gadgets is where it ends. I don't fiddle with temperature or what I use to stir. I just get good beans and prep them with what I have.</p> <p>At the end of the day it doesn't matter. If you are passionate about something, want to throw all of your energy into it, are just curious, or just want to fiddle. Do it. If it entertains you, it scratches an itch, or you get something else out of it. Do it. Nerdism is starting to feel like a post within itself. Back to coffee.</p> <p>Here's what I do: I start up the kettle. When it hisses, I pour it in <img src="https://farm1.staticflickr.com/523/19799533225_f86f5625d2_z_d.jpg" alt=""></p> <p>The beans I use are usually from the <a href="https://bluebottlecoffee.com/f4a9df89" title="Blue Bottle Coffee mail service">Blue Bottle Coffee mail service</a>. (&#x3C;-- referral link. help me out!) I'll do a review of the service at some point in the future. For now, check out <a href="http://www.marco.org/2012/05/29/tonx-coffee" title="Marco&#x27;s">Marco's</a> <img src="https://farm1.staticflickr.com/452/19178658403_356e1f2eeb_z_d.jpg" alt=""></p> <p>I grind the beans by hand using a <a href="http://amzn.to/1Mefklf" title="hand">Porlex JP-30 Stainless Steel Coffee Grinder</a></p> <p><img src="https://farm4.staticflickr.com/3732/19611530590_717563e7a2_z_d.jpg" alt=""></p> <p><img src="https://farm1.staticflickr.com/560/19773361246_66d5776853_z_d.jpg" alt=""></p> <p>Next is brewing. I use an <a href="http://www.amazon.com/gp/product/B001HBCVX0?ref_=oh_aui_search_detailpage&#x26;redirect=true&#x26;psc=1&#x26;tag=nyen0e-20" title="AeroPress">AeroPress</a> and LOVE it. Even if you use coffee grinds from the supermarket, the Aeropress make brewing so darned easy. Both brewing and cleaning. It makes one cup at a time. Add the coffee, the water, let it sit and then pump it out. Cleaning is just popping the "puck" of spent coffee into the garbage, rinsing everything with water, and throwing it in the drainboard. I use the "inverted method" as I find it the easiest. Check out this <a href="https://bluebottlecoffee.com/frequency/aeropress-video?tonx=1" title="1 min">1 min</a> Blue Bottle video that explains it. Sometimes, I also use the <a href="https://itunes.apple.com/us/app/aeropress-timer-for-aerobies/id602496538?mt=8&#x26;at=11laRZ&#x26;ct=pro" title="AeroPress Timer">AeroPress Timer</a> app on my phone that, in theory, gets a better tasting brew. I stir it with the handle of the AeroPress scoop</p> <p><img src="https://farm1.staticflickr.com/304/19611557190_c75f29d297_z_d.jpg" alt=""></p> <p><img src="https://farm1.staticflickr.com/259/19799586545_8fa60e61ee_z_d.jpg" alt=""></p> <p>Most of the time, I have the coffee exactly as it comes out of the press. This is a little closer to espresso than coffee. The instructions say "add water to taste". I've been home with <a href="https://twitter.com/timothybroder/status/617041906040762368" title="Charlie">Charlie</a> the past few weeks and have been trying this. I like both, I'm not sure which method I'll end up with. Either way, I add my 2 ice cubes</p> <p><img src="https://farm4.staticflickr.com/3690/19614589349_11ff2ac88c_z_d.jpg" alt=""></p> <p>Now. Bulletproof Coffee. I've done this on and off over the past few years. Gizmodo <a href="http://gizmodo.com/bulletproof-coffee-debunking-the-hot-buttered-hype-1681321467" title="debunked">debunked</a> it earlier this year. What do I think? For the most part. It works. For the first few months, you feel like you've had rocket fuel and can do anything. Then, it tapers off. I do it a few times a year, usually close to the release of a website for a little boost. I eyeball a tablespoon or so of <a href="http://amzn.to/1Megeyb" title="Kerry Gold Butter">Kerry Gold Butter</a> and add a tablespoon of <a href="http://amzn.to/1fgmicy" title="MCT Oil">MCT Oil</a>. If you are going to try it, don't buy the bulletproof brand. It's not any better and amazon can save you money.</p> <p>However you take your coffee; whether you are super fussy, love your starbucks, or dabble a little bit at home: <a href="http://www.marco.org/2014/03/31/throwing-k-cups-in-glass-houses" title="It doesn’t matter">It doesn’t matter</a>. ENJOY your coffee</p><![CDATA[Podcasts I Listen To]]>https://www.timbroder.com/podcasts-i-listen-tohttps://www.timbroder.com/podcasts-i-listen-to<p>These days I almost exclusively listen to 3 podcasts/networks. Most of these are Tabletop Roleplaying Game Actual Plays of Dungeons and Dragons and Pathfinder. Think of it as listening to improve fantasy storytelling where dice rolls decide major decisions and you are a long for the ride right with the cast. They are great fun</p> <ul> <li><a href="http://atp.fm/">Accidental Tech Podcast</a></li> <li><a href="https://critrole.com/">Critical Cole</a></li> <li><a href="https://www.glasscannonnetwork.com/">The Glass Cannon Network</a></li> <li><a href="https://worldsbeyondnumber.com/">Worlds Beyond Number</a></li> <li><a href="https://www.dropout.tv/dimension-20">Dimension 20</a></li> </ul> <p>These are some of the podcasts I used listen to every week. Some I cherry picked.</p> <ul> <li><a href="http://atp.fm/">Accidental Tech Podcast</a></li> <li><a href="http://relay.fm/analogue">Analog(ue)</a></li> <li><a href="http://relay.fm/b-sides">B-Sides</a></li> <li><a href="http://5by5.tv/b2w">Back to Work</a></li> <li><a href="http://bitsplitting.org/">Bitsplitting</a></li> <li><a href="">Build Phase</a></li> <li><a href="http://5by5.tv/cmdspace">CMD+Space</a></li> <li><a href="http://carpeaqua.com/cocoaradio">CocoaRadio</a></li> <li><a href="http://relay.fm/connected">Connected</a></li> <li><a href="http://www.coreint.org/">Core Intuition</a></li> <li><a href="http://dadsbeingdads.net/">Dads Being Dads</a></li> <li><a href="http://www.imore.com/debug/">Debug</a></li> <li><a href="http://developingperspective.com/">Developing Perspective</a></li> <li><a href="http://5by5.tv/founderstalk">Founders Talk</a></li> <li><a href="http://5by5.tv/quit">Grit</a></li> <li><a href="http://5by5.tv/homework">Home Work</a></li> <li><a href="http://www.earwolf.com/show/how-did-this-get-made/">How Did This Get Made?</a></li> <li><a href="http://www.relay.fm/inquisitive">Inquisitive</a></li> <li><a href="http://www.iterate.tv/">Iterate</a></li> <li><a href="http://5by5.tv/mpu">Mac Power Users</a></li> <li><a href="http://magetalk.com/">MageTalk: The Magento Podcast</a></li> <li><a href="http://mobilecouch.co/">Mobile Couch</a></li> <li><a href="http://nsbrief.com/">NSBrief</a></li> <li><a href="http://notificationcenter.tv/">Notification Center</a></li> <li><a href="http://pipes.yahoo.com/pipes/pipe.info?_id=8c527db6f0bc8abded0526805a638f00">Podcast Reruns</a></li> <li><a href="http://techdistortion.com/podcasts/pragmatic">Pragmatic</a></li> <li><a href="http://www.raywenderlich.com/">Ray Wenderlich</a></li> <li><a href="http://releasenotes.tv/">Release Notes</a></li> <li><a href="http://www.imore.com/reviewcast">Review</a></li> <li><a href="http://serialpodcast.org/">Serial</a></li> <li><a href="http://today.shawnblanc.net/">Shawn Today</a></li> <li><a href="http://softwareindie.com/">Software Indie</a></li> <li><a href="http://springboardshow.com/">Springboard</a></li> <li><a href="http://swordandlaser.com/">Sword &#x26; Laser</a></li> <li><a href="http://www.artofmanliness.com/">The Art of Manliness</a></li> <li><a href="http://www.theincomparable.com/theincomparable">The Incomparable</a></li> <li><a href="http://nathanbarry.com/">The Nathan Barry Show</a></li> <li><a href="http://5by5.tv/prompt">The Prompt</a></li> <li><a href="http://therecord.co/">The Record</a></li> <li><a href="http://weeklybriefly.net/">The Weekly Briefly</a></li> <li><a href="http://turningthiscararound.com/">Turning This Car Around</a></li> <li><a href="http://www.imore.com/vector">Vector</a></li> <li><a href="http://www.ifanboy.com/">iFanboy.com Comic Book Podcast</a></li> <li><a href="http://tekside.net/iosdocked/">iOSDocked Podcast</a></li> </ul><![CDATA[Apps]]>https://www.timbroder.com/appshttps://www.timbroder.com/apps<p>Once upon a time, I built native iOS apps.</p> <p>I really wanted to learn native app development. Having a C background and having a bad experience with Android Dev, I got myself an iPhone 5, formed an <a href="http://taco23.com/">LLC</a>, and dove in on nights/weekends. In a perfect world I would have made millions! It's been a lot of fun. Lately, I've been learning Swift</p> <p>It's been featured on:</p> <ul> <li><a href="http://lifehacker.com/weather-notifications-gives-you-a-forecast-without-open-1458155902" title="LifeHacker">LifeHacker</a></li> <li><a href="https://www.macstories.net/reviews/daily-weather-summaries-with-weather-notifications/" title="Macstories">Macstories</a></li> <li><a href="http://tekside.net/iphonaddict/2013/10/23/iphonaddict-review-weather-notifications" title="TekSide">TekSide</a></li> <li><a href="http://www.cultofmac.com/252729/weather-notifications-customized-weather-alerts-deliverted-to-your-notification-center/" title="Cult of Mac">Cult of Mac</a></li> </ul> <p><a href="https://itunes.apple.com/us/app/weather-notifications/id704052114?mt=8&#x26;at=11laRZ&#x26;ct=pro">Weather Notifications – Custom Push Alerts</a></p> <p><a href="https://itunes.apple.com/us/app/weather-notifications/id704052114?mt=8&#x26;at=11laRZ&#x26;ct=pro"><img src="https://taco23.com/weathernotifications/wp-content/uploads/sites/2/2013/09/AppIcon76x76@2x2.png" alt="icon350x350"></a></p> <p>Coming Soon: <em>(clearly they didnt ;-)</em></p> <ul> <li>Something fun with <a href="http://timbroder.com/2014/03/avspeechsynthesizers-queue-doesnt-work.html">AVSpeechSynthesizer</a>. <em>(Coming in hopefully 2016)</em></li> <li>Something <a href="https://itunes.apple.com/us/app/tinder/id547702041?mt=8&#x26;at=11laRZ&#x26;ct=pro">Tinder</a>-like using CloudKit for soon-to-be parents <em>(Coming in 2015)</em></li> <li>Something with CoreAudio for new parents <em>(Coming in 2016)</em></li> </ul><![CDATA[Podcasts]]>https://www.timbroder.com/podcastshttps://www.timbroder.com/podcasts<p>Up until the pandemic, I co-hosted 3 podcasts on the <a href="http://tekside.net/show-tell/">Tekside</a>. Combined, my shows garnered in between 10,000 and 15,000 listeners every month. It was great fun and I hope to be able to do it again some day</p> <ul> <li>GTDGedi was a show about productivity; the apps, methods, and tools we used to stay organized and move fast in the digital age</li> <li>JACKEDcast was about staying physically and mentally healthy, and making a better version of ourselves</li> <li>The Show and Tell Cast was a love letter to movies. Every month all the hosts would bring a movie they had seen before and discuss everyone's experience watching it. It let me meet new people and connect with some very old friends</li> </ul> <p>Check out the shows that <a href="/podcasts-i-listen-to">I listen to</a></p> <p><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 225px; " > <a class="gatsby-resp-image-link" href="/static/87524f1147fdf5deb3a65ef0c5eeec7e/3684f/gtdj.png" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAC1UlEQVR42oVSSU9TURR+e7cq0ZVrf4BLE9du9b+Qlk5ShPK6I0ZUEkotCHEhhrRUIvQ9Xgc6hNJAgBAIY5mHFMJQGvjMd8xrXm0bb/LlDPee75x7zlEMwwAxPT0tUtd1TE1NCWKxWFVvBE3TamIJ5V+yXC6Hw8NDHB8fY21tDQcHB9jb2xNJP3XK/f195PN5ibFyKNYKk8kkyuUyzs/Psbu7i9XVVQnmoe/s7Ez0nZ0dlEol3N/fI51OV0lrCFk+M/Jks1lkMhmsrKzI49vbW8zPz4uPJHw7OzsrbwuFQvXrdRXG43HJfHNzg0qlgsvLS7m7u7vD4uKiJOJhO66vr3F1dSW/atpDZmIP2R8GbW1tSWXFYlEIiaOjI/ETtK3framQ1XFym5ubUgW/aYJ9ZEWsnFWdnJxgY2NDbMbVVWglZMP5VQ6Bkn2cmZmRFiwsLCCVSklCJuB9Q0Kzf5OTk9je3sbFxYUQkoTTXl9fFxJWxQTm1LkRdYRWg4vM/vFbJLJWyiQE79iW5eVlnJ6e1i+2aZBsaWlJsnN5afOOTTdh2uadiYaLzYdc0rm5uWqgNagWBvQmUMyxJxIJ2SnqlGw+wR7xjnoilRaZThrIJHVkElodlJ6eHvT29qK/vx+BQAAjIyMYHh5GKBTC0NCQ+EKDgwh9DeJb4BMGgkF8CP7Ax+8xDEQLCIzna6A4HA60tbXB4/GgtbUVPp9PdJvNBrvdDqfTCY/bBZvzHV57onjeWcSzrhKedlfwxA88UWuhuFwuEB0dHRLs9/vh9XpFp9/ucKLTY8Pbrt944AceqsAjFXisAi3dQItaCyF0u91ob2+XqlRVrZLT/77Th26vA298Mbz4DLzqK+Pll8pf9NVDCYfDIMbGxjA6OopIJCIw/RMTExiPhPEzqiGi5fBLzyCqZRHVLbDYCidoTpgwbRPmlJMJAwlDR9zQRTaD0nzXGu/f//AHSTsfyycgwFIAAAAASUVORK5CYII='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="gtdj" title="" src="/static/87524f1147fdf5deb3a65ef0c5eeec7e/3684f/gtdj.png" srcset="/static/87524f1147fdf5deb3a65ef0c5eeec7e/c26ae/gtdj.png 158w, /static/87524f1147fdf5deb3a65ef0c5eeec7e/3684f/gtdj.png 225w" sizes="(max-width: 225px) 100vw, 225px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span></p> <p><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 225px; " > <a class="gatsby-resp-image-link" href="/static/27aa4ab69620683078c7b36fc0930544/3684f/st.png" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD9UlEQVR42o3U609TZxwH8EduFWjPpZSeU9lQLrJpQUfRtVxKoYhQWm7GCYyJ28w2oq6igSwEDcIALXIxkXATC24E28JgUMel9lx6npZTWlra7KIv3F4s/iFL3ZK90MUln/yS3/O8/f6+gEKJ/wWXUeIDlDCZEqBUHPIKCiIfGOlApE6UcKLE08j8d/3nBZdRAoyKEVIpGbRKzRjqGEMdnV8MnAhBJ0r8ZCrEyL9xQqlf+q4Hl7lRAiJSD06ycQitKnYNDkGKhoEA9Pvh7i70+QCTIKE/qb5dWWjRKBerNLbThasNlT2aE9+pTz7Wa36o1s4bipdbL3kmp+gKA9N4Hq6vQxcHnRR0uQCPy4bLlMp3iPE6rV6bV68+fqFW/XHe0fMlitoKpSI3s1xX/OOanXsvx7kvngKxbMvnrtAeGw65JqcBhxIrNdrTZXktZSfPHc86m53ZLM+or1B2ZWedzT2S+36avtqw66SeSlKc+zEKCJiGZp9tMTg8CqceABYlrBJZrwCx4qQliZxHpY8FWLdAuBorssg/WFpaXLLZPD4/e6uXycljlGp+de1qSakGgDWLBTgRKcTIZ6kZECFYsWwvMyt0KPOXQ4eDRMpuZ1fw+TMv5Hb3Ap6NTbrzxsZP689fvLgzOtpw8aLP5wO0QMzUll2tUX8fLeSzs282ll/KPzb2Vd2VU8ppU8fYzLSH3xqcGPZ8cbkUgJumO309PaUlJXqdrkqnAzBRsvJZLZmTdiNX7o1PulWR35Kc3PmRtjhXPmzquNbUFJgZaTqj99iW2tuufdnaqlAorFarw+EwGo1gGyXGNR9mytNOiETbQulUZdE3JNldriouUtw1dWrl6fdrNZpjGbe/7fr5199UKuXc3Fw4HIYQBoNBQKPERkLSVAL+KDGJQgk7SixjxEoCfv/w0RWzeQwnZnFiKmr/ZKHaGwzkKRQLCwvBYJDjOL/fDyLpwwgOI1mUfJXNSFqpeDFMP+Kmae+ZBhiV6EYJz8g9NhhoMxqLioocDgfHcf39/YDHyDfAZV6hZGfGzO14XUPDLovN+3A2PzrO2NHRfv26SqWq0ukKCgpAfwL2ugFRUi+IGW9s5kMhbscLwyF+eqb9YHr3wMCfL18uLi/33R30+nwA3Rf1OiwqWghAqghZtll5nucoyhMI3DOZrpxrsJnNX1/4VAzA7MQEWEekb7SBkfZYxKHWut3uyBmNT9qFknkQ/YQ8uNl6+Ym+jp57BBiU+C8sLqNjRbShHobDbG8fA+I4aWpkDo1s//E799AM3l4gMUKmsNQ1PkFryihEymhOwa0t6HZDlgVvLyDxgUj1SFOZqhrW2MbZ7ZDnIYRwc/MvyczeFL+mIJwAAAAASUVORK5CYII='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="st" title="" src="/static/27aa4ab69620683078c7b36fc0930544/3684f/st.png" srcset="/static/27aa4ab69620683078c7b36fc0930544/c26ae/st.png 158w, /static/27aa4ab69620683078c7b36fc0930544/3684f/st.png 225w" sizes="(max-width: 225px) 100vw, 225px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span></p><![CDATA[Projects]]>https://www.timbroder.com/projectshttps://www.timbroder.com/projects<p>Most of my projects are client work and under NDA. If I have free time, I hack on random things</p> <ul> <li><a href="https://github.com/broderboy/jira-tabs">JiraTabs</a> – I have a particular Jira workflow when I’m triaging and assigning to team members. This bookmarklet lets me open every Jira in view in a new tab to power through them faster</li> <li><a href="https://github.com/broderboy/iphone-DoneCancelNumberPadToolbar">DoneCancelNumberPadToolbar</a> – Adds Done and Cancel buttons to an iPhone Number Pad. Was my first experience adding to <a href="http://cocoadocs.org/docsets/DoneCancelNumberPadToolbar/0.6.0/">CocoaPods</a></li> <li><a href="https://github.com/broderboy/JsonEndpoint">JsonEndpoint</a> – We needed fast and dirty JSON mocking for a project at work. Apiary didn't exist yet, so I rolled a quick one</li> <li><a href="https://github.com/broderboy/magento-callstack">Magento Callstack</a> – A helper extension to aid in debugging <a href="http://magento.com/">Magento</a></li> <li><a href="https://github.com/broderboy/PythonistaTrello">PythonistaTrello</a> – Used to add cards to Trello using <a href="https://itunes.apple.com/us/app/launch-center-pro/id532016360?mt=8&#x26;at=11laRZ&#x26;ct=pro">Launch Center Pro</a> and <a href="https://itunes.apple.com/us/app/pythonista/id528579881?mt=8&#x26;at=11laRZ&#x26;ct=pro">Pythonista</a>. Tutorial <a href="http://timbroder.com/2013/03/automating-adding-to-trello-on-ios.html">here</a></li> <li><a href="https://github.com/broderboy/dotfiles">Dot files</a> – My config for oh-my-zsh.</li> <li><a href="https://github.com/broderboy/casey.coffee">casey.coffee</a> – Quick fun site I threw together for <a href="https://twitter.com/caseyliss">Casey Liss</a> and to try deploying static or php to Heroku</li> <li><a href="https://github.com/broderboy/Inbox-Zero-Macros">Inbox Zero Macros</a> – The macros for both windows and Mac that help me keep Inbox Zero</li> <li><a href="https://github.com/broderboy/AlfredJsonLint">JsonLint for Alfred</a> – Part of how <a href="http://timbroder.com/2014/07/format-json-and-save-to-gist.html">I Format JSON and save to gist with Alfred</a></li> <li><a href="https://github.com/broderboy/django-solr-demo">django-solr-demo</a> – An <a href="http://timbroder.com/2012/08/getting-started-with-solr-and-django.html">introduction</a> to using Solr with django</li> <li><a href="https://github.com/broderboy/django-admin-remainingcharacters">django-admin-remainingcharacters</a> – Django package to show the remaining characters on a field in the admin</li> <li><a href="https://github.com/broderboy/django-admin-preview/">django-admin-preview</a> – Django package to enable inline template previews of a model in a list view in the admin</li> <li><a href="http://about.broder.us/">broder.us</a> – A fun little website I threw together for my wedding</li> </ul> <p>Launched Side Projects that are now deceased:</p> <ul> <li>Twitter2Gtalk – I started this at an AppEngine hackathon the Google hosted years ago. It ran until I hit my limit on the free tier (about 10,000 users). I shudder to look at the <a href="https://code.google.com/p/gpowered/source/browse/#svn%2Ftrunk%2Fgpowered%2Fappengine%2Ftwitter2gTalk%253Fstate%253Dclosed">code</a> to this.</li> <li>SimpleWod – I started a site to keep track of workouts I was doing. I had about 20 friends beta testing it. Then Beyond The Whiteboard came out and it was doing everything we would need</li> <li>ReaderFollow – When Google removed comments from Google Reader, I built this to hold the comments. I had a pretty hardcore group of Reader friends. It was a combination of a Greasmonkey script and a Django backend that let my friends and I continue to comment. It had about 500 users when Google shut down reader entirely. I thought about building a full RSS service. But seeing what <a href="https://feedbin.com/">FeedBin</a> was doing got me excited about that.</li> <li><a href="https://github.com/broderboy/beyondthewhiteboard2rss">Beyond The Whiteboard 2 RSS</a> – Used to create an RSS feed from your workout entries on &#x3C;https: beyondthewhiteboard.com=""> on AppEngine.</li> <li>Took it down after the BTWB redesign. I had a few hundred users for fun.</li> </ul> <p>See my <a href="https://github.com/broderboy/">Github</a> for more</p><![CDATA[Talks]]>https://www.timbroder.com/talkshttps://www.timbroder.com/talks<p>I give talks at <a href="https://cakeandarrow.com/">Cake &#x26; Arrow</a>, conferences, and various <a href="http://www.meetup.com/members/7329143/">Meetups</a> around NYC</p> <ul> <li><a href="http://www.slideshare.net/broderboy/vagrant-magento-mm-ny-v11">Saving Time and Money with Vagrant</a> – Given at Meet Magento NY 2014 Vagrant can aid businesses and developers by creating development environments that mirror production. This talk discusses the basics of Vagrant, real world stories, and how it can be used in various projects. This is the 3rd evolution of this talk. Links and resources can be found <a href="https://github.com/timbroder/vagrant-presentation">here</a> as well as <a href="https://github.com/timbroder/vagrant-presentation/tree/gh-pages">v1</a> and <a href="https://github.com/timbroder/vagrant-magento-presentation">v2</a></li> <li><a href="http://timbroder.github.io/jira-presentation/#/">Jira Process and Etiquette</a> – This is a talk I give every year or so at Cake &#x26; Arrow to detail how <strong>we</strong> use Jira as a company. It’s great for new hires and a gentle reminder to the old guard</li> <li><a href="http://www.slideshare.net/broderboy/launch-week">Launch Week</a> – was given to employees at Cake &#x26; Arrow as a discussion starter to the activities and events around the launch of a site: Why technology says or does the things we do, and why we may turn into werewolves. I also had wanted to try making a deck in a time box (45 mins) while learning <a href="https://itunes.apple.com/us/app/deckset-turn-your-notes-into/id847496013?at=11laRZ&#x26;ct=pro&#x26;ls=1&#x26;mt=12">DeckSet</a>. Markdown for the slides can be found <a href="https://github.com/timbroder/LaunchWeekPresentation">here</a>.</li> <li><a href="http://timbroder.github.io/git-presentation/#/">Git and Distributed Source Control</a> – This is an older talk I gave at I as an intro to DCVS systems. The audience was for technical people as well as non-technical so there was a common understanding of the tools we use</li> </ul><![CDATA[What's your best life hack?]]>https://www.timbroder.com/2020/03/best-life-hackhttps://www.timbroder.com/2020/03/best-life-hackFri, 20 Mar 2020 00:00:00 GMT<p>To make sure I have time for a few non movable things each week or day. The 2-3 core things that are for me, my sanity, and my mental health. Skipping sleep isn’t great but these things would take priority on a weird day. If I found myself skipping sleep long term, I’d re-evaluate my schedule</p> <p>For me these are the gym 3-4 times a week. I get punchy and anxious if I don’t go.</p> <p>Daily it’s meditation and 30 mins of fiction (sci-fi and fantasy) before bed.</p><![CDATA[Kids are Home]]>https://www.timbroder.com/2020/03/kids-homehttps://www.timbroder.com/2020/03/kids-homeTue, 17 Mar 2020 00:00:00 GMT<p><em>Updated 03/18/2020</em></p> <p>If you are fortunate enough to be able to work from home during the current crisis, your kids may also be home with you. We've been figuring out a handoff schedule, what hours to work; very early and late as needed, and what activities to do with the boys. Ours are 4 and 2. I understand we've very privileged to be in this position but I hope this list of links helps anyone else looking for activities to do</p> <h1>Activities</h1> <ul> <li><a href="https://busytoddler.com/2020/03/indoor-activities/">40+ Best Indoor Activities from Busy Toddler</a> (Busy Toddler)</li> <li><a href="https://www.abcmouse.com">ABC Mouse</a> (e-learning)</li> <li><a href="https://www.amazon.com/gp/product/1948209101/ref=ppx_yo_dt_b_asin_title_o02_s02?psc=1&#x26;tag=nyen0e-20&#x26;ie=UTF8">Alphabet Letter Tracing</a></li> <li><a href="https://docs.google.com/document/u/1/d/1o6kEgCKLn3cyIm2hehhhSTIk7yRTd0C3zx49JS4wwCI/mobilebasic">GIANT LIST OF IDEAS FOR BEING HOME WITH KIDS</a></li> <li><a href="https://www.amazon.com/gp/product/B072C7Z8BQ/ref=ppx_od_dt_b_asin_title_s00?psc=1&#x26;tag=nyen0e-20&#x26;ie=UTF8">Glider Planes</a></li> <li><a href="https://www.ixl.com/">IXL</a> personalized learning (e-learning)</li> <li><a href="https://www.amazon.com/gp/product/B07WHFCSQF/ref=ppx_yo_dt_b_asin_title_o02_s00?psc=1&#x26;tag=nyen0e-20&#x26;ie=UTF8">Lego</a></li> <li><a href="https://www.amazon.com/gp/product/160159948X/ref=ppx_yo_dt_b_asin_title_o02_s01?psc=1&#x26;tag=nyen0e-20&#x26;ie=UTF8">Little Thinkers Workbook</a></li> <li><a href="https://www.amazon.com/gp/product/B07VDCVN3T/ref=ppx_od_dt_b_asin_title_s00?psc=1&#x26;tag=nyen0e-20&#x26;ie=UTF8">Origami</a></li> <li><a href="https://busytoddler.com/2017/07/playing-preschool-homeschool-preschool/">Playing Preschool</a> (Busy Toddler)</li> <li><a href="https://classroommagazines.scholastic.com/support/learnathome.html">Scholastic</a> learn at home</li> <li><a href="https://www.amazon.com/gp/product/1948209608/ref=ppx_yo_dt_b_asin_title_o02_s02?psc=1&#x26;tag=nyen0e-20&#x26;ie=UTF8">Scissor Skills</a></li> <li><a href="https://parks.ny.gov/">State Parks</a> (if allowed)</li> <li><a href="https://twitter.com/paulg/status/1239524522711306241">Story Creating</a></li> <li><a href="https://twitter.com/coolanimalspod/status/1237795975940296704?s=12">What do we do if school is cancelled? Are their online resources to help the kids continue learning and keep the family from going bonkers?</a></li> <li><a href="https://huntingtonmoms.com/2020/03/17/10-homeschooling-resources-to-get-you-through-coronavirus/">10 Homeschooling Resources to get you through Coronavirus</a></li> <li><a href="https://m.facebook.com/BrooklynPublicLibraryFamily/">Brooklyn public library also does virtual story time every day</a></li> <li><a href="https://littlelearningclub.com/shop/">Little Learning Club</a> Shop</li> </ul> <h1>Games</h1> <ul> <li><a href="https://www.amazon.com/Hasbro-Gaming-Kingdom-Adventures-Exclusive/dp/B00000DMF5/ref=sr_1_1_sspa?sr=1-1-spons&#x26;tag=nyen0e-20&#x26;keywords=candy%2Bland&#x26;s=toys-and-games&#x26;psc=1&#x26;qid=1584466622">Candy Land</a></li> <li><a href="https://www.amazon.com/Chutes-Ladders-Game-Amazon-Exclusive/dp/B00000DMF6/ref=sr_1_3?sr=1-3&#x26;qid=1584466601&#x26;keywords=snakes%2Band%2Bladders&#x26;sprefix=snak%252Ctoys-and-games%252C150&#x26;tag=nyen0e-20&#x26;crid=28GG1ODAID2G3&#x26;s=toys-and-games">Chutes &#x26; Ladders</a></li> <li><a href="https://www.amazon.com/Hasbro-Guess-Who-Classic-Game/dp/B01N6PRX20/ref=sr_1_2?sr=1-2&#x26;keywords=guess%2Bwho&#x26;s=toys-and-games&#x26;tag=nyen0e-20&#x26;qid=1584466637">Guess Who</a></li> <li><a href="https://www.wired.com/2013/01/hero-kids/">Hero Kids</a> (cooperative table top RPG, similar to Dungeons and Dragons, but for kids</li> <li><a href="https://www.amazon.com/gp/product/B06XYLL66Y/ref=ox_sc_act_title_1?psc=1&#x26;tag=nyen0e-20&#x26;smid=ATVPDKIKX0DER">Monopoly Junior</a></li> <li><a href="https://apps.apple.com/us/app/peek-a-view/id1491554407?ls=1">Peek-A-View</a></li> <li><a href="https://www.amazon.com/ThinkFun-Rush-Deluxe-Traffic-Logic/dp/B000GVSO4C/ref=sr_1_2?sr=1-2&#x26;keywords=rush%2Bhour&#x26;s=toys-and-games&#x26;tag=nyen0e-20&#x26;qid=1584466582">Rush Hour</a></li> <li><a href="https://www.facebook.com/StoryToys/posts/free-from-storytoys-to-help-kids-continue-learning-while-at-home-weve-made-some-/2773436026106260/">Story Toys</a> are now free</li> <li><a href="https://www.amazon.com/UNO-Super-Mario-Card-Game/dp/B01ARGC2VQ/ref=sr_1_1?sr=1-1&#x26;keywords=uno%2Bjunior&#x26;s=toys-and-games&#x26;tag=nyen0e-20&#x26;qid=1584466566">Super Mario Junior</a></li> </ul> <h1>Schedules</h1> <ul> <li><a href="https://imgur.com/a/jzAr6iv">Sample</a></li> <li><a href="https://docs.google.com/document/d/1rSBQReDJVCgSxd04HNyKWvLxUYqwEmOqVf3S_vCZMLM/edit?usp=sharing">Sample 2</a></li> </ul><![CDATA[My PhpStorm Tweaks]]>https://www.timbroder.com/2020/02/phpstorm-tweakshttps://www.timbroder.com/2020/02/phpstorm-tweaksFri, 21 Feb 2020 00:00:00 GMT<p>We are breaking ground on a <a href="https://facebook.github.io/react-native/">new app</a> at <a href="https://wavemeditation.com/">work</a> and are tinkering with a few IDE's. Up until now we've standardized on Xcode and PhpStorm. <a href="https://code.visualstudio.com/">Code</a> is the gold standard for react these days but I've never really given it an honest try; to get everything set up right. In the past, for "regular" react work, I've opened the react project in PhpStorm (which has all the power of WebStorm) and everything "just works". Full intellisense gives me great autocomplete, introspection, auto importing, etc. Granted, Code can do all this too, but it was nice to just open the IDE I'm familiar with and get to work. Also, at least the last time I tried, a bunch of plugins were needed. I believe most of this works OOB now</p> <p>Some of my co-workers are poking around with PhpStorm to see how they like it so I'm writing out the tweaks I do to any fresh install. Laracasts has an amazing (and free!) video series on the topic: <a href="https://laracasts.com/series/how-to-be-awesome-in-phpstorm">Be Awesome in PHPStorm</a></p> <p>I also just learned that you can <a href="https://www.jetbrains.com/help/phpstorm/sharing-your-ide-settings.html#settings-repository">sync your settings</a> to git, so I've done that <a href="https://github.com/timbroder/PhpStorm-Settings">here</a></p> <h1>Editor Settings</h1> <ul> <li>Turn off <code class="language-text">confirmExit</code> and <code class="language-text">showTipsOnStartup</code>. They are annoying</li> <li>Hide or minimize all the toolbars unless you need them. I rely on hotkeys</li> <li>Change Editor Tab limit to 1 --> This, combined with the split editor hotkeys below, will make it so if you make a new editor window, <code class="language-text">cmd+w</code> will close it instead of cycling through a history of what was in that tab. To get to recently opened files, with auto complete, use <code class="language-text">cmd+e</code> instead which will open the <code class="language-text">Recent Files</code> modal</li> </ul> <h1>Key Maps</h1> <p>Full keymap file is available <a href="https://github.com/timbroder/PhpStorm-Settings/blob/master/keymaps/Default%20copy.xml">here</a></p> <h2>Delete a Line</h2> <p>PhpStorm will copy or cut a whole line, if you don't have anything highlighted and you mash the appropriate keys. So, why not delete the line you are on?</p> <p><code class="language-text">EditorDeleteLine </code> mapped to <code class="language-text">cmd+d</code></p> <h2>Split Editor Window</h2> <p>If you want to have 2 editor windows side by side, make as many as you want!</p> <p><code class="language-text">SplitVertically</code> mapped to <code class="language-text">alt+v</code></p> <p><em>Note: There is probably a better binding for this, but I already use those for my window manager, <a href="https://manytricks.com/moom/">Moom</a></em></p> <h2>Common Default Hotkeys</h2> <ul> <li><code class="language-text">cmd+e</code> opens <code class="language-text">Recent Files</code></li> <li><code class="language-text">cmd+shit+o</code> opens <code class="language-text">Open Project Files</code> (<code class="language-text">shift</code>, <code class="language-text">shift</code> is also very useful but it can have a lot of noise depending on the type of project)</li> <li><code class="language-text">cmd+1</code> hides the sidebar</li> </ul> <h1>Styles</h1> <h2>Theme</h2> <p>I go back and forth between these</p> <ul> <li><a href="https://plugins.jetbrains.com/plugin/12275-dracula-theme">Dracula</a></li> <li><a href="https://plugins.jetbrains.com/plugin/8006-material-theme-ui">Material</a> <code class="language-text">oceanic</code> or <code class="language-text">deep ocean</code></li> <li>I used to use <a href="https://plugins.jetbrains.com/plugin/12112-solarized-theme">Solarized</a> Dark but I don't like it as much these days. My terminal still uses it</li> </ul> <h2>Fonts</h2> <ul> <li>I've used <a href="https://github.com/tonsky/FiraCode/wiki/Intellij-products-instructions">FiraCode</a> forever and really like it. Can't beat how good the programming ligatures look</li> <li>JetBrains recently came out with <a href="https://www.jetbrains.com/lp/mono/">Mono</a> which feels very similar to Fira. I'm using it now but the jury is still out</li> </ul><![CDATA[Small Wins]]>https://www.timbroder.com/2019/09/small-winshttps://www.timbroder.com/2019/09/small-winsSat, 07 Sep 2019 00:00:00 GMT<p>Great short read. Remember to value the little wins. Not just the big ones</p> <p>​</p> <blockquote> <p>I've missed out on a lot of moments where I could've been celebrating but my brain had already moved on.</p> </blockquote> <p>​</p> <blockquote> <p>It's way too easy to forget the hundreds of small things which go right.</p> </blockquote> <p>​</p> <blockquote> <p>Celebrate your progress, no matter how small. Don't rob yourself of the collective joy of each of those wins. Enjoy the ride. Work hard, knowing the only reward may be the knowledge of a job well-done, but by celebrating the small wins along the way, you could be motivated to break through to the next level.</p> </blockquote> <p>​</p><![CDATA[Gtdjedi Podcast - Ep043 - App Battle Iii - Reminders Vs Omnifocus 3 Vs Todoist]]>https://www.timbroder.com/2018/09/gtdjedi-podcast---ep043---app-battle-iii---reminders-vs-omnifocus-3-vs-todoisthttps://www.timbroder.com/2018/09/gtdjedi-podcast---ep043---app-battle-iii---reminders-vs-omnifocus-3-vs-todoistSun, 09 Sep 2018 08:17:00 GMT<blockquote> <p>App Battle: Task Managers: Reminders vs Omnifocus 3 vs Todoist</p> </blockquote> <p>​</p><![CDATA[Jackedcast - Ep038 - Transformations With Timothy Broder]]>https://www.timbroder.com/2018/08/jackedcast---ep038---transformations-with-timothy-broderhttps://www.timbroder.com/2018/08/jackedcast---ep038---transformations-with-timothy-broderTue, 28 Aug 2018 13:27:00 GMT<h1>The Big Discussion</h1> <blockquote> <p>Transformations with special guest Timothy Broder</p> </blockquote> <h1>Episode Links</h1> <ul> <li><a href="https://www.reddit.com/r/keto/wiki/keto_in_a_nutshell/">Keto in a nutshell</a></li> <li>Reddit <a href="https://www.reddit.com/r/keto/wiki/faq/">Keto FAQ</a></li> <li>Reddit <a href="https://www.reddit.com/r/ketogains/wiki/index">KetoGains FAQ</a></li> <li><a href="https://ketogains.com/ketogains-calculator/">KetoGains macro calculator</a></li> <li>KetoGains <a href="https://ketogains.com/2015/09/supplements-and-ketogenic-diets-facts-and-myths/">Suggested supplements that work well with all ketogenic diets (SKD, TKD, CKD)</a></li> <li>KetoGains <a href="https://ketogains.com/2016/08/ketogains-seven-must-supplements/">must have supplements</a></li> <li>Tim’s <a href="https://www.amazon.com/gp/product/B01AP9DWK0/ref=oh_aui_search_detailpage?psc=1&#x26;tag=nyen0e-20&#x26;ie=UTF8">Gummy Bears</a></li> <li><a href="https://www.ditchthecarbs.com/fat-head-pizza/">FatHead Pizza</a></li> <li><a href="http://www.ketochow.xyz/">Keto Chow</a></li> <li><a href="http://www.timbroder.com/2018/08/My-favorite-Keto-recipes.html">Tim’s favorite recipes</a></li> <li>Tim’s favorite recipe sites <ul> <li><a href="https://www.ketoconnect.net/recipes/">Keto Connect</a></li> <li><a href="https://www.ruled.me/keto-recipes/">Ruled.me</a></li> </ul> </li> <li>Tim’s <a href="https://crossfitnyc.com/2013/06/26/athlete-profile-tim-broder/">old bio</a> from CrossfitNYC</li> </ul><![CDATA[Show & Tell Cast - S02Ep017 - Escape From New York, The Delta Force & Big Trouble In Little China]]>https://www.timbroder.com/2018/08/show-&-tell-cast---s02ep017---escape-from-new-york,-the-delta-force-&-big-trouble-in-little-chinahttps://www.timbroder.com/2018/08/show-&-tell-cast---s02ep017---escape-from-new-york,-the-delta-force-&-big-trouble-in-little-chinaMon, 27 Aug 2018 20:47:00 GMT<blockquote> <p>This Episode’s Films</p> <p>Tim: The Delta Force</p> <p>Jonathon: Escape NY</p> </blockquote> <p>​</p><![CDATA[My Favorite Keto Recipes]]>https://www.timbroder.com/2018/08/My-favorite-Keto-recipeshttps://www.timbroder.com/2018/08/My-favorite-Keto-recipesFri, 24 Aug 2018 08:30:00 GMT<p><em>As mentioned on my guest appearance on <a href="http://tekside.net/jacked/2018/8/25/jackedcast-ep038-transformations-with-timothy-broder">The JackedCast Episode 38</a></em></p> <p><em>Updated: 08/24/2018</em></p> <h1>Links</h1> <ul> <li><a href="https://www.ketoconnect.net/almond-ricotta-cookies/" title="Almond Ricotta Cookies">Almond Ricotta Cookies</a></li> <li><a href="https://www.ketoconnect.net/asian-noodle-bowl" title="Asian Noodle Bowl">Asian Noodle Bowl</a></li> <li><a href="https://www.ketoconnect.net/cheesecake-smoothie/" title="Blueberry Cheesecake Smoothie">Blueberry Cheesecake Smoothie</a></li> <li><a href="https://www.ketoconnect.net/low-carb-muffins" title="Blueberry Muffins">Blueberry Muffins</a></li> <li><a href="https://www.mincerepublic.com/buffalo-chicken-empanadas-keto/" title="Buffalo Chicken Empanadas">Buffalo Chicken Empanadas</a></li> <li><a href="https://blog.bulletproof.com/low-carb-bread-recipe-keto-bread/" title="Bulletproof Bread">Bulletproof Bread</a></li> <li><a href="https://www.delish.com/cooking/recipe-ideas/recipes/a51924/cauliflower-alla-vodka-recipe/" title="Cauliflower Alla Vodka">Cauliflower Alla Vodka</a></li> <li><a href="https://www.ketoconnect.net/low-carb-cheese-crackers/" title="Cheese Crackers">Cheese Crackers</a></li> <li><a href="https://www.ditchthecarbs.com/cheesy-keto-garlic-bread/" title="Cheesy Garlic Bread">Cheesy Garlic Bread</a></li> <li><a href="https://ketosizeme.com/keto-cheesy-taco-casserole-recipe-lchf/" title="Cheesy Taco Casserole">Cheesy Taco Casserole</a></li> <li><a href="https://www.ketoconnect.net/chili-with-bacon/" title="Chili w/Bacon">Chili w/Bacon</a></li> <li><a href="https://jensketokitchen.wordpress.com/2018/03/25/coconut-flour-flatbread/" title="Coconut Flour Flatbread">Coconut Flour Flatbread</a></li> <li><a href="https://www.ditchthecarbs.com/fat-head-pizza/" title="Fat Head Pizze - The Holy Grail">Fat Head Pizze - The Holy Grail</a></li> <li><a href="http://ketosavage.com/keto-fried-pasta-made-with-miracle-noodles/" title="Fried Pasta">Fried Pasta</a></li> <li><a href="https://www.ketoconnect.net/keto-gingerbread/" title="Gingerbread Cake">Gingerbread Cake</a></li> <li><a href="https://www.ruled.me/keto-gyros/" title="Gyros">Gyros</a></li> <li><a href="https://www.ruled.me/jalapeno-popper-fat-bombs/" title="Jalapeno Popper Fat Bombs">Jalapeno Popper Fat Bombs</a></li> <li><a href="https://www.legendaryfoodsonline.com/blogs/recipes/keto-mason-jar-ice-cream-by-keto-connect" title="Mason Jar Ice Cream">Mason Jar Ice Cream</a></li> <li><a href="http://www.tryketowith.me/2015/09/09/easy-keto-mozzarella-sticks/" title="Mozzarella Sticks">Mozzarella Sticks</a></li> <li><a href="https://www.ketoconnect.net/pork-rind-pancakes" title="Pork Rind Pancakes">Pork Rind Pancakes</a></li> <li><a href="https://www.eatfatbeatfat.com/ketorecipes/keto-pulled-pork" title="Slow Cooker Pulled Pork">Slow Cooker Pulled Pork</a></li> <li><a href="https://www.ditchthecarbs.com/keto-cheese-taco-shells/" title="Taco Shells">Taco Shells</a></li> <li><a href="https://www.reddit.com/r/ketorecipes/comments/8yv60x/uber_wings_with_kenji_tech/e2dxmyg/" title="Uber Wings">Uber Wings</a></li> <li><a href="https://www.ketoconnect.net/low-carb-bars" title="“Granola” Bars">“Granola” Bars</a></li> </ul> <h1>Mini Everything Bagels</h1> <p><em>This used to be hosted at <a href="http://mommy-mania.com/recipe/keto-diet-friendly-mini-everything-bagels-recipe/" title="Mommy Mania">Mommy Mania</a> but no longer exists there</em></p> <h2>Ingredients</h2> <h3>Bagels</h3> <ul> <li>3 Cups Shredded Mozzarella Cheese</li> <li>1/4 Cup Cream Cheese</li> <li>1 teaspoon Xantham Gum</li> <li>1 teaspoon Baking Soda</li> <li>1/2 Cup Almond Flour (Finely ground Almond Meal works too)</li> <li>1/2 teaspoon "lite salt"</li> </ul> <h3>Everything Topping</h3> <ul> <li>1 teaspoon Garlic Powder</li> <li>1 teaspoon Onion Powder</li> <li>1 teaspoon Poppy Seeds</li> <li>1 teaspoon Sesame Seeds</li> <li>1/2 teaspoon "lite salt"</li> <li>1/4 teaspoon Ground Pepper</li> </ul> <h2>Directions</h2> <p>Preheat oven to 400 degrees and line a baking sheet with parchment paper.</p> <p>In a small bowl, mix together the almond flour, xantham gum, baking soda, and salt.</p> <p>In a double boiler or microwave (30 seconds at a time on high), melt cream cheese and mozzarella together and stir until it forms a dough. Let cool slightly.</p> <p>Knead together the cheese dough and dry ingredients until they are thoroughly and doughy.</p> <p>Separate into 16 even pieces. Roll each piece into a long log shape and pinch the ends together into a bagel shape. Lay out on your baking sheet.</p> <p>Mix all of the "everything topping" ingredients together in a small bowl. Brush the bagels liberally with water and sprinkle seasoning over them. Flip over and repeat until all topping is used.</p> <p>Bake for 10-12 minutes, until they are browned. Watch carefully so they don't burn! Let cool slightly before serving.</p> <p>Store extras in a sealed container in the refrigerator, reheat in a toaster oven or regular oven for a few minutes.</p> <p>Nutritional Info: Each Mini Bagel: Calories: 117, Fat: 8.7g, Carbs: 3.2g (total), Fiber: 1.2g, Sugars: .5g, Protein: 7.9g</p><![CDATA[Show & Tell Cast - S02Ep017 - Escape From New York, The Delta Force & Big Trouble in Little China]]>https://www.timbroder.com/2018/08/show-&-tell-cast---s02ep017https://www.timbroder.com/2018/08/show-&-tell-cast---s02ep017Sat, 11 Aug 2018 09:09:00 GMT<blockquote> <p>This Episode’s Films</p> <p>Tim: The Delta Force</p> <p>Clay: Big Trouble Little China</p> <p>Jonathon: Escape NY</p> </blockquote> <p>​</p><![CDATA[Gtdjedi Podcast - Ep042 - Geeking Out With Mac Utilities]]>https://www.timbroder.com/2018/08/gtdjedi-podcast---ep042---geeking-out-with-mac-utilitieshttps://www.timbroder.com/2018/08/gtdjedi-podcast---ep042---geeking-out-with-mac-utilitiesFri, 03 Aug 2018 16:40:00 GMT<blockquote> <p>Jedi Weapons of Choice</p> <p>Clay - Hazel, Bartender</p> <p>Jerry - My Big Discussion Mac Utilities</p> <p>Tim - TextExpander, Alfred</p> </blockquote> <p>​</p><![CDATA[Gtdjedi Podcast - Ep041 - Noise Reduction]]>https://www.timbroder.com/2018/07/gtdjedi-podcast---ep041---noise-reductionhttps://www.timbroder.com/2018/07/gtdjedi-podcast---ep041---noise-reductionThu, 19 Jul 2018 11:55:00 GMT<blockquote> <p>The Big Discussion</p> <p>Eliminating the Noise &#x26; Getting Productive</p> <p>Best Environment for Productivity</p> <p>Maximizing Your Energy &#x26; Time</p> <p>Multitasking vs. Single-tasking</p> <p>Notification Settings</p> <p>Do Not Disturb Settings</p> <p>Screen Time Goals</p> <p>Home Screen Setup</p> </blockquote> <p>​</p><![CDATA[Show & Tell Cast - S02Ep016 - The Outsiders, Stardust & How To Train Your Dragon]]>https://www.timbroder.com/2018/06/show-&-tell-cast---s02ep016---the-outsiders,-stardust-&-how-to-train-your-dragonhttps://www.timbroder.com/2018/06/show-&-tell-cast---s02ep016---the-outsiders,-stardust-&-how-to-train-your-dragonFri, 22 Jun 2018 09:09:00 GMT<blockquote> <p>This Episode’s Films</p> <p>Tim: How to Train Your Dragon</p> <p>Clay: The Outsiders</p> <p>Jonathan: Stardust</p> </blockquote> <p>​</p><![CDATA[Gtdjedi Podcast - Ep040 - Wwdc Recap]]>https://www.timbroder.com/2018/06/gtdjedi-podcast---ep040---wwdc-recaphttps://www.timbroder.com/2018/06/gtdjedi-podcast---ep040---wwdc-recapWed, 06 Jun 2018 14:19:00 GMT<p><strong>iLikes/iDislike</strong></p> <ul> <li>Clay: Siri Shorcuts, Walkie Talkie, Dark Mode on macOS</li> <li>Jerry - WatchOS 5, Siri Shortcuts</li> <li>Tim: iLike - Shortcuts hopefully having access to bluetooth, Dark mode iDislike - walkie talkie, pushing kids to play with AR instead of real toys, siri raise to speak on the watch</li> </ul> <p><strong>Bantha Fodder</strong></p> <p><strong>What could you have done without?</strong></p> <ul> <li>Clay: AR Demos (not that into it), Pride band &#x26; watch face</li> <li>Jerry: MeMoji</li> <li>Tim: Leaning heavily on what they announced last year to pad time &#x26; the Adobe CTO</li> </ul> <p>Read the full show notes <a href="http://tekside.net/gtdjedi/2018/6/6/gtdjedi-podcast-ep040-wwdc-recap" title="here">here</a>.</p><![CDATA[Show & Tell Cast - S02Ep015 - Casablanca, Amadeus & Forrest Gump]]>https://www.timbroder.com/2018/05/show-&-tell-cast---s02ep015---casablanca,-amadeus-&-forrest-gumphttps://www.timbroder.com/2018/05/show-&-tell-cast---s02ep015---casablanca,-amadeus-&-forrest-gumpWed, 09 May 2018 09:30:00 GMT<blockquote> <p>This Episode’s Films</p> <p>Tim: Forrest Gump</p> <p>Clay: Amadeus</p> <p>Jonathan: Casablanca</p> </blockquote> <p>​</p><![CDATA[Gtdjedi Podcast - Ep037 - Talking Drafts With Jedi Master Greg Pierce]]>https://www.timbroder.com/2018/03/gtdjedi-podcast---ep037---talking-drafts-with-jedi-master-greg-piercehttps://www.timbroder.com/2018/03/gtdjedi-podcast---ep037---talking-drafts-with-jedi-master-greg-pierceWed, 21 Mar 2018 17:31:00 GMT<blockquote> <p>The Dev Seg</p> <p>Special Guest Greg Pierce of <a href="https://twitter.com/agiletortoise" title="@agiletortoise">@agiletortoise</a></p> </blockquote> <p>​</p><![CDATA[No title]]>https://www.timbroder.com/2018/03/heymamma-2https://www.timbroder.com/2018/03/heymamma-2Mon, 05 Mar 2018 19:10:00 GMT<p>I join my wife for a special episode of her podcast, Heymama</p> <blockquote> <p>Laura is joined by her husband Tim this week for a show about life with two kids. They discuss their evolving nighttime routine, why the weekends are hard, and just in general: life with two kids is not relaxing.</p> </blockquote> <p>​</p><![CDATA[Show And Tell Cast - S02Ep014 - The Postman, Reign Of Fire & Book Of Eli]]>https://www.timbroder.com/2018/02/show-and-tell-cast---s02ep014---the-postman,-reign-of-fire-&-book-of-elihttps://www.timbroder.com/2018/02/show-and-tell-cast---s02ep014---the-postman,-reign-of-fire-&-book-of-eliSat, 24 Feb 2018 09:18:00 GMT<blockquote> <p>This Episode’s Films</p> <p>Tim: Reign of Fire</p> <p>Clay: Book of Eli</p> <p>Jonathan: The Postman</p> </blockquote> <p>​</p><![CDATA[Gtdjedi Podcast - Ep036 - App Battle Ii - Notes Vs. Evernote Vs. Bear Notes]]>https://www.timbroder.com/2018/02/gtdjedi-podcast---ep036---app-battle-ii---notes-vs.-evernote-vs.-bear-noteshttps://www.timbroder.com/2018/02/gtdjedi-podcast---ep036---app-battle-ii---notes-vs.-evernote-vs.-bear-notesWed, 21 Feb 2018 08:53:00 GMT<p>Note taking App Battle! I represent Bear!</p> <blockquote> <p>App Battle: Apple Notes vs. Bear Notes vs. Evernote</p> </blockquote> <p>​</p><![CDATA[Show & Tell Cast - S02Ep013 - Braveheart, The Patriot & We Were Soldiers]]>https://www.timbroder.com/2018/02/show-&-tell-cast---s02ep013---braveheart,-the-patriot-&-we-were-soldiershttps://www.timbroder.com/2018/02/show-&-tell-cast---s02ep013---braveheart,-the-patriot-&-we-were-soldiersSat, 03 Feb 2018 07:34:00 GMT<blockquote> <p>This Episode’s Films</p> <p>Tim: Braveheart</p> <p>Clay: The Patriot</p> <p>Jonathan: We Were Soldiers</p> </blockquote> <p>​</p><![CDATA[Omni Roadmap 2018 - The Omni Group]]>https://www.timbroder.com/2018/01/omni-roadmap-2018---the-omni-grouphttps://www.timbroder.com/2018/01/omni-roadmap-2018---the-omni-groupFri, 26 Jan 2018 18:49:00 GMT<p>I amy very, very excited about this OmniFocus 3 <a href="https://www.omnigroup.com/blog/omni-roadmap-2018">news</a>. I’ve been using Due for daily tasks and it will be great to go back to just 1 app.</p> <p>My highlights:</p> <blockquote> <p>The term that makes more intuitive sense to most people is tags: you can tag an item with a tag—or multiple tags—and later you can look at that tag to see all the items assigned to it.</p> </blockquote> <p>​</p> <blockquote> <p>Tags are incredibly flexible, letting you organize things in whatever ways make the most sense to you.</p> </blockquote> <p>​</p> <blockquote> <p>OmniFocus 3 solves this issue by letting each tag track its own independent ordering of tasks.</p> </blockquote> <p>​</p> <blockquote> <p>For OmniFocus 3, we wanted to add more flexible scheduling, but we also wanted to avoid overwhelming anyone with a bunch of decisions that they might not care about. To solve this, we turned to a design principle called progressive disclosure: we ask you to make simple decisions up front (like checking the option “does this repeat or not”), and as you proceed through the interface we progressively disclose more and more options based on what we already know about the task</p> </blockquote> <p>​</p> <blockquote> <p>OmniFocus 3 will still coalesce related notifications</p> </blockquote> <p>​</p> <blockquote> <p>Finally, for those cases where there is something that really absolutely must get done now, without delay (like taking your medication), we’re adding a new type of repeating notification that will keep reminding you about a task every few minutes until you tell OmniFocus that you’ve completed that task.</p> </blockquote> <p>​</p> <blockquote> <p>or OmniFocus 3, we’ll be adding powerful JavaScript-based automation much like what we’ve already shipped in OmniGraffle</p> </blockquote> <p>​</p> <blockquote> <p>This will enable dual-platform scripts which can be used to manipulate tasks in all sorts of ways, such as filtering, reporting, or creating content based on templates.</p> </blockquote> <p>​</p> <blockquote> <p>For OmniFocus 3, we’re adding support for linking tasks between unrelated databases. The idea is that I can send you a task (with its notes and attachments and due date) and propose that our tasks be linked, and you can choose whether to accept the link or not. While our tasks are linked, we can each see updates to the status of that specific task</p> </blockquote> <p>​</p> <blockquote> <p>we’re building OmniFocus for the Web. It will be greatly simplified from the OmniFocus you know</p> </blockquote> <p>​</p><![CDATA[Gtdjedi Podcast - Ep034 - Our Favorite Things Of 2017]]>https://www.timbroder.com/2017/11/gtdjedi-podcast---ep034---our-favorite-things-of-2017https://www.timbroder.com/2017/11/gtdjedi-podcast---ep034---our-favorite-things-of-2017Wed, 22 Nov 2017 16:40:00 GMT<blockquote> <p>The Big Discussion</p> <p>2017 Favorites</p> <p>Favorite Device:</p> <p>Jerry: iPhone X</p> <p>Tim: Abstain (only new device was iPhone 8)</p> <p>Clay: iPhone X</p> <p>Favorite Accessory:</p> <p>Jerry: Bose Soundsport Free</p> <p>Clay: AirPods</p> <p>Favorite New Software Feature:</p> <p>Jerry: Multitasking on iPad Pro</p> <p>Tim: Flashlight mode on Watch</p> <p>Clay: Swipe Gesture Navigation on iPhone X</p> <p>Favorite Productivity App:</p> <p>Jerry: 1Password</p> <p>Tim: Due</p> <p>Clay: Newton Mail</p> <p>Favorite Social Network App:</p> <p>Jerry: Tweetbot</p> <p>Tim: Narwhal (Reddit)</p> <p>Clay: Twitterrific</p> <p>Favorite Game:</p> <p>Jerry: N/A</p> <p>Tim: Baldur’s Gate</p> <p>Clay: Conquist 2</p> <p>Favorite Podcast (Non-TEKSide):</p> <p>Jerry: MacBreak Weekly</p> <p>Tim: The Glass Cannon</p> <p>Clay: The Savage Nation</p> <p>Favorite Movie:</p> <p>Favorite TV Show:</p> <p>Jerry: Real Time With Bill Maher</p> <p>Tim: Stranger Things</p> <p>Clay: Game of Thrones</p> <p>Favorite Musical Artist:</p> <p>Jerry: Bruno Mars</p> <p>Tim: Dragonforce</p> <p>Clay: The Chainsmokers</p> </blockquote> <p>​</p><![CDATA[Show & Tell Cast - S02Ep011 - Star Wars Rogue One, Holiday Special & Force Awakens]]>https://www.timbroder.com/2017/11/show-&-tell-cast---s02ep011---star-wars-rogue-one,-holiday-special-&-force-awakenshttps://www.timbroder.com/2017/11/show-&-tell-cast---s02ep011---star-wars-rogue-one,-holiday-special-&-force-awakensSun, 05 Nov 2017 08:39:00 GMT<blockquote> <p>This Episode’s Films</p> <p>Star Wars: The Force Awakens</p> <p>Rogue One: A Star Wars Story</p> <p>The Star Wars Holiday Special</p> </blockquote><![CDATA[Gtdjedi Podcast - Ep033 - Watching Forward]]>https://www.timbroder.com/2017/11/gtdjedi-podcast---ep033---watching-forwardhttps://www.timbroder.com/2017/11/gtdjedi-podcast---ep033---watching-forwardThu, 02 Nov 2017 08:38:00 GMT<blockquote> <p>The Big Discussion</p> <p>watchOS 4</p> <p>My take on my Apple Watch Edition Series 3 with LTE</p> <p>How has watchOS 4 changed how we use our Apple Watch?</p> <p>What does the future hold for the Apple Watch? Could it become a primary device in the future? And what changes need to be made and what features need to be added for that to become a possibility?</p> <p>Revisiting the Dock: The apps that have earned their place</p> <p>How is the Series 0 handling it?</p> <p>Our recommendation to listeners who are on the fence about a purchase?</p> </blockquote> <p>​</p><![CDATA[Show & Tell Cast - S02Ep010 - Dune, Mystic River & Final Girls]]>https://www.timbroder.com/2017/10/show-&-tell-cast---s02ep010---dune,-mystic-river-&-final-girlshttps://www.timbroder.com/2017/10/show-&-tell-cast---s02ep010---dune,-mystic-river-&-final-girlsThu, 12 Oct 2017 08:33:00 GMT<blockquote> <p>This Episode’s Films</p> <p>Tim: Mystic River</p> <p>Clay: Dune</p> <p>Jonathan: Final Girls</p> </blockquote> <p>​</p><![CDATA[Gtdjedi Podcast - Ep032 -Mixed Emotions On Ios 11]]>https://www.timbroder.com/2017/09/gtdjedi-podcast---ep032--mixed-emotions-on-ios-11https://www.timbroder.com/2017/09/gtdjedi-podcast---ep032--mixed-emotions-on-ios-11Wed, 27 Sep 2017 08:28:00 GMT<blockquote> <p>The Big Discussion</p> <p>How iOS 11 and macOS High Sierra can make us more productive</p> <p>Our take on the latest builds.</p> <p>Favorite new iOS features</p> <p>Favorite app updates that take advantage of the new APIs?</p> <p>What software changes we don’t like?</p> <p>Where do we go from here?</p> <p>Jedi Weapons of Choice (apps or features)</p> <p>Clay - new device setup method, drag &#x26; drop</p> <p>Jerry - iOS miscellaneous- new Screen shots, screen recording, Notes PDF capture..</p> <p>Tim - Siri for todos -> Omnifocus</p> </blockquote> <p>​</p><![CDATA[Show & Tell Cast - S02Ep009 - The Dark Crystal, Labyrinth & Tango & Cash]]>https://www.timbroder.com/2017/09/show-&-tell-cast---s02ep009---the-dark-crystal,-labyrinth-&-tango-&-cashhttps://www.timbroder.com/2017/09/show-&-tell-cast---s02ep009---the-dark-crystal,-labyrinth-&-tango-&-cashSun, 10 Sep 2017 11:33:00 GMT<blockquote> <p>This Episode’s Films</p> <p>Tim: The Dark Crystal</p> <p>Clay: Tango &#x26; Cash</p> <p>Jonathan: Labyrinth</p> </blockquote> <p>​</p><![CDATA[Gtdjedi Podcast - Ep031 - An Array Of Topics]]>https://www.timbroder.com/2017/08/gtdjedi-podcast---ep031---an-array-of-topicshttps://www.timbroder.com/2017/08/gtdjedi-podcast---ep031---an-array-of-topicsThu, 24 Aug 2017 08:26:00 GMT<blockquote> <p>The Big Discussion</p> <p>Follow-up (Tim)</p> <p>Vacation Home screen (Tim)</p> <p>Notability at a Work Conference (Jerry)</p> <p>Goal &#x26; Habit Tracking (Clay)</p> </blockquote> <p>​</p><![CDATA[Fuze Code Studio Will Let Kids Use The Switch To Code Their Own Switch Games]]>https://www.timbroder.com/2017/07/fuze-code-studio-will-let-kids-use-the-switch-to-code-their-own-switch-gameshttps://www.timbroder.com/2017/07/fuze-code-studio-will-let-kids-use-the-switch-to-code-their-own-switch-gamesSat, 22 Jul 2017 18:49:00 GMT<p>Amazing</p> <blockquote> <p>Of the hundreds of noble efforts to teach kids to code, Fuze is one of them. Fuze has created its own programming language, Fuze BASIC, a riff on the classic BASIC programming language that was the foundation of Microsoft as a company and a formative experience for anyone who typed a program into an Apple II or Commodore 64. And now Fuze BASIC is coming to the Switch.</p> </blockquote> <p>​</p><![CDATA[Gtdjedi Podcast - Ep030 - Health Tracking — Gtdjedi Podcast - The Tekside Network — Overcast]]>https://www.timbroder.com/2017/07/gtdjedi-podcast---ep030---health-tracking-—-gtdjedi-podcast---the-tekside-network-—-overcasthttps://www.timbroder.com/2017/07/gtdjedi-podcast---ep030---health-tracking-—-gtdjedi-podcast---the-tekside-network-—-overcastFri, 21 Jul 2017 22:30:00 GMT<blockquote> <p>The Big Discussion</p> <p>Apps We Use for Monitoring Our Health</p> <ul> <li> <p>Fitness</p> </li> <li> <p>Nutrition</p> </li> <li> <p>Special Needs</p> </li> <li> <p>Mental Health</p> </li> <li> <p>Lifestyle</p> </li> </ul> <p>Jedi Weapons of Choice</p> <ul> <li> <p>Clay - Health Kit, AutoSleep, Headspace, Lose It!, Peak</p> </li> <li> <p>Jerry - OneTouch Reveal, Health Kit, Power Sync</p> </li> <li> <p>Tim - Runkeeper, Beyond the Whiteboard, My Fitness Pal, Sleep Pulse 2, Sleep++, Zero, HealthKit, Headspace</p> </li> </ul> </blockquote> <p>​</p><![CDATA[Gtdjedi Podcast - Ep029 - Let'S Talk Sherlock]]>https://www.timbroder.com/2017/07/gtdjedi-podcast---ep029---let's-talk-sherlockhttps://www.timbroder.com/2017/07/gtdjedi-podcast---ep029---let's-talk-sherlockSat, 08 Jul 2017 10:12:00 GMT<blockquote> <p>The Big Discussion</p> <p>With WWDC behind us, the GTDJedi Council examines which categories of 3rd party apps may have been “sherlocked”.</p> </blockquote> <p>​</p><![CDATA[Show & Tell Cast - S02Ep007 - Full Metal Jacket, Sneakers & Pcu]]>https://www.timbroder.com/2017/07/show-&-tell-cast---s02ep007---full-metal-jacket,-sneakers-&-pcuhttps://www.timbroder.com/2017/07/show-&-tell-cast---s02ep007---full-metal-jacket,-sneakers-&-pcuSat, 08 Jul 2017 10:11:00 GMT<blockquote> <p>This Episode’s Films</p> <p>Tim: Sneakers</p> <p>Clay: Full Metal Jacket</p> <p>Jonathan: PCU</p> </blockquote> <p>​</p><![CDATA[Gtdjedi Podcast - Ep028 - App Battle - Ios Mail Vs Airmail Vs Newton]]>https://www.timbroder.com/2017/07/gtdjedi-podcast---ep028---app-battle---ios-mail-vs-airmail-vs-newtonhttps://www.timbroder.com/2017/07/gtdjedi-podcast---ep028---app-battle---ios-mail-vs-airmail-vs-newtonSat, 08 Jul 2017 10:10:00 GMT<blockquote> <p>The Big Discussion</p> <p>App Battles - Battle of the Email Clients</p> </blockquote> <p>​My pick won an Apple Design Award at WWDC 2017 🤘</p> <blockquote> <p>Jedi Weapons of Choice</p> <p>Clay - Newton</p> <p>Jerry - iOS Mail</p> <p>Tim - Airmail</p> </blockquote> <p>​</p><![CDATA[Show & Tell Cast - S02Ep006 - The Wedding Singer, Super Troopers & Anchorman]]>https://www.timbroder.com/2017/07/show-&-tell-cast---s02ep006---the-wedding-singer,-super-troopers-&-anchormanhttps://www.timbroder.com/2017/07/show-&-tell-cast---s02ep006---the-wedding-singer,-super-troopers-&-anchormanSat, 08 Jul 2017 10:09:00 GMT<blockquote> <p>This Episode’s Films</p> <p>Tim: Anchorman</p> <p>Clay: The Wedding Singer</p> <p>Jonathan: Super Troopers</p> </blockquote> <p>​</p><![CDATA[Gtdjedi Podcast - Ep027 - Device-Wise]]>https://www.timbroder.com/2017/07/gtdjedi-podcast---ep027---device-wisehttps://www.timbroder.com/2017/07/gtdjedi-podcast---ep027---device-wiseSat, 08 Jul 2017 10:07:00 GMT<blockquote> <p>The Big Discussion</p> <p>Device Cycles (How long do we hold onto our devices?</p> <p>Laptops/Desktops</p> <p>Tablets</p> <p>Phones</p> <p>Watches</p> <p>Cost vs. Features: How do you know when it is the right time to make a purchase?</p> <p>Do you buy refurbished? The pros and cons?</p> <p>How to maximize the life out of your devices?</p> <p>Payment plan vs. outright purchase? Which is best for you?</p> <p>Best way to get rid of your old device?</p> </blockquote> <p>​</p><![CDATA[Show And Tell Cast - S02Ep005 - The Rocketeer, Reservoir Dogs & Groundhog Day]]>https://www.timbroder.com/2017/05/show-and-tell-cast---s02ep005---the-rocketeer,-reservoir-dogs-&-groundhog-dayhttps://www.timbroder.com/2017/05/show-and-tell-cast---s02ep005---the-rocketeer,-reservoir-dogs-&-groundhog-dayMon, 01 May 2017 15:24:00 GMT<blockquote> <p>This Episode’s Films</p> <p>Tim: The Rocketeer</p> <p>Clay: Groundhog Day</p> <p>Jonathan: Reservoir Dogs</p> </blockquote> <p>​</p><![CDATA[Sensegrow PivotalTracker case study]]>https://www.timbroder.com/2017/04/sensegrowhttps://www.timbroder.com/2017/04/sensegrowThu, 27 Apr 2017 12:45:00 GMT<blockquote> <p>For example, you should prioritize and select features based on an evaluation matrix and not just on the whims and fancies of individuals or customers.</p> </blockquote> <p>Preach 🙏 ​</p><![CDATA[Gtdjedi Podcast - Ep026 - A Day In The Life Of A Gtdjedi Master]]>https://www.timbroder.com/2017/03/gtdjedi-podcast---ep026---a-day-in-the-life-of-a-gtdjedi-masterhttps://www.timbroder.com/2017/03/gtdjedi-podcast---ep026---a-day-in-the-life-of-a-gtdjedi-masterThu, 02 Mar 2017 20:55:00 GMT<blockquote> <p>The Big Discussion</p> <p>Our Daily Routines (workflows that flow for us)</p> </blockquote> <p>​</p><![CDATA[Kidfund is on Betalist!]]>https://www.timbroder.com/2017/02/kidfund-is-on-betalist!https://www.timbroder.com/2017/02/kidfund-is-on-betalist!Fri, 24 Feb 2017 09:31:00 GMT<p>My startup, Kidfund has been <a href="https://betalist.com/startups/kidfund" title="featured on Betalist">featured on Betalist</a>!!</p> <p>It would be a HUGE help to us if you could "<a href="https://betalist.com/startups/kidfund" title="heart">heart</a>" it. Doubly so if you could share on social media!</p><![CDATA[Feb 23 was a security day]]>https://www.timbroder.com/2017/02/feb-23-was-a-security-dayhttps://www.timbroder.com/2017/02/feb-23-was-a-security-dayFri, 24 Feb 2017 09:22:00 GMT<p>Busy day yesterday:</p> <ul> <li><a href="https://blog.cloudflare.com/incident-report-on-memory-leak-caused-by-cloudflare-parser-bug/" title="Cloudflare leaked secrets">Cloudflare leaked secrets</a></li> <li><a href="http://www.theverge.com/2017/2/23/14712118/google-sha1-collision-broken-web-encryption-shattered" title="Google cracked SHA-1">Google cracked SHA-1</a></li> <li>Dropbox opensourced <a href="https://blogs.dropbox.com/tech/2017/02/meet-securitybot-open-sourcing-automated-security-at-scale/" title="Securitybot: Open Sourcing Automated Security at Scale">Securitybot: Automated Security at Scale</a></li> </ul><![CDATA[Show & Tell Cast - S02Ep003 - Blues Brothers, Drop Zone & American History X]]>https://www.timbroder.com/2017/02/show-&-tell-cast---s02ep003---blues-brothers,-drop-zone-&-american-history-xhttps://www.timbroder.com/2017/02/show-&-tell-cast---s02ep003---blues-brothers,-drop-zone-&-american-history-xWed, 15 Feb 2017 08:28:00 GMT<blockquote> <p>This Episode’s Films</p> <p>Tim: Drop Zone</p> <p>Clay: American History X</p> <p>Jonathan: Blues Brothers</p> </blockquote> <p>​</p><![CDATA[The best iPhone case I've ever owned]]>https://www.timbroder.com/2017/01/review:-caudabe---the-sheath-for-iphone-7https://www.timbroder.com/2017/01/review:-caudabe---the-sheath-for-iphone-7Tue, 24 Jan 2017 19:29:00 GMT<p>Thank you, <a href="http://www.techmusings.me/3/post/2016/12/review-caudabe-the-sheath-for-iphone-7.html" title="Jerry">Jerry</a></p> <blockquote> <p>The Sheath, the case is a svelte .90mm thick, full coverage case. Caudabe calls the material ShockLite, a soft gel-like flexible polymer with shock protection.</p> </blockquote> <p>The Caudabe Sheath, on my iPhone 7+, is the best case I've ever used.</p> <p>I need a case. I drop my phone on a weekly basis and I'm nitpicky. Apple's silicon grips my pocket too much. The leather feels weird when I sweat running. Bumpers are too wide. Other 3rd party cases don't stay on as well</p> <p>This case nails it all: It feels great in my hand and pocket, its super thin, and so far has survived drop "tests"</p> <p>Check out Jerry's full review <a href="http://www.techmusings.me/3/post/2016/12/review-caudabe-the-sheath-for-iphone-7.html" title="Here">here</a></p><![CDATA[Adding Smart Speed to any audio file with Audacity]]>https://www.timbroder.com/2017/01/adding-smartspeed-to-any-audio-filehttps://www.timbroder.com/2017/01/adding-smartspeed-to-any-audio-fileSun, 15 Jan 2017 09:18:00 GMT<p>The <a href="https://geo.itunes.apple.com/us/app/overcast-podcast-player/id888422857?at=11laRZ&#x26;ct=afp15&#x26;ls=1&#x26;mt=8" title="Overcast">Overcast</a> podcast app by <a href="https://twitter.com/marcoarment" title="Marco Arment">Marco Arment</a> has a killer feature called Smart Speed and it has ruined all audio listening for me outside of the app. Smart Speed <em>dynamically shortens silences in talk shows</em>; it saves you time, and makes them feel tighter and more produced. I wish I had it everywhere.</p> <p><a href="http://tekside.net/" title="Tekside">Tekside</a> is a podcast network I'm part of, and while some of our shows are heavily edited, many are not. While doing some audio work for <a href="http://heymamapodcast.com/" title="something else">something else</a>, my <a href="https://twitter.com/bingopajamas" title="wife">wife</a> noticed that <a href="http://www.audacityteam.org/" title="Audacity">Audacity</a> (cross platform) has a crud version of this type of audio processing. Here's how to set it up.</p> <h2>Setup</h2> <ol> <li><a href="http://www.audacityteam.org/download/" title="Download Audacity">Download Audacity</a> &#x26; install it. But don't run it yet. (If it opened as part of install, close it)</li> <li>If you are working with audio files already, head to "Making it work". If you are pulling in .mov files from <a href="http://www.ecamm.com/mac/callrecorder/" title="Skype Call Recorder">Skype Call Recorder</a> see step 3</li> <li>Install FFMPEG: If you are on a Mac, download and install <a href="http://lame3.buanzo.com.ar/FFmpeg_v0.6.2_for_Audacity_on_OSX.dmg" title="this">this</a> Otherwise, see <a href="http://manual.audacityteam.org/man/faq_installation_and_plug_ins.html#ffdown" title="these instructions">these instructions</a></li> </ol> <h2>Making it work</h2> <ol> <li>Open Audacity</li> <li>Click File -> Import Audio</li> <li>Choose your audio recording</li> <li>Optional: If Audacity prompts you to "Select Stream(s) to import", select all of them and hit OK <img src="https://c1.staticflickr.com/6/5567/32174620192_8f027bbbef_b.jpg" alt=""></li> <li>Select one of the audio streams and hit CMD+A to highlight all of the audio</li> <li>Click Effect -> Truncate Silence</li> <li>I currently have <strong>duration</strong> set to <strong>0.9</strong> and <strong>truncate to</strong> set to <strong>0.5</strong>. What this does is find any silence longer that 0.9 seconds and shorten it to 0.5 seconds <img src="https://c1.staticflickr.com/1/281/32174511182_ee8cfc68db_b.jpg" alt=""></li> <li>Hit ok &#x26; let it run</li> <li>File -> Export <em>(As a WAV. You may have to hit OK a few times)</em></li> <li>Done!</li> </ol> <p>I'm still figuring out which duration will work best for which shows. It depends how fast the people on it already naturally talk and flow which each other. For <a href="http://tekside.net/showandtell/" title="Show and Tell">Show and Tell</a>, our movie podcast, the above settings strip a 55 min recording to 48 mins and it sounds a lot tighter.</p><![CDATA[Show And Tell Cast - S02Ep002 - Westworld, Point Break & The Departed]]>https://www.timbroder.com/2017/01/show-and-tell-cast---s02ep002---westworld,-point-break-&-the-departedhttps://www.timbroder.com/2017/01/show-and-tell-cast---s02ep002---westworld,-point-break-&-the-departedSun, 15 Jan 2017 13:44:00 GMT<blockquote> <p>This Episode’s Films</p> <p>Tim: The Departed</p> <p>Clay: Point Break (Original)</p> <p>Jonathan: Westworld (1973)</p> </blockquote> <p>​</p><![CDATA[Remembering All Those Helpful Stackoverflow Posts]]>https://www.timbroder.com/2017/01/remembering-all-those-helpful-stackoverflow-postshttps://www.timbroder.com/2017/01/remembering-all-those-helpful-stackoverflow-postsMon, 09 Jan 2017 14:38:00 GMT<p>How often has this happened to you?</p> <p><strong>2 years ago</strong></p> <ul> <li>You are spelunking on Google and StackOverflow (SO).</li> <li>You find what you need.</li> <li>You graciously upvote and/or leave a comment.</li> <li>You update your code and leave a comment.</li> <li><strong>You move on</strong></li> </ul> <p><strong>Now</strong></p> <ul> <li>You come across the <em>same</em> problem. You remember finding it before. But it's a different job or project. Spelunking begins!</li> <li>You look through your bookmarks</li> <li>You try to remember how you Googled for it the <em>last</em> time</li> <li>You eventually find it after an hour</li> <li><strong>You move on</strong></li> <li><em>This possibly happens again in the future</em></li> </ul> <p>Now in the perfect world, we're keeping a <a href="https://geo.itunes.apple.com/app/quiver-programmers-notebook/id866773894?at=11laRZ&#x26;ct=afp15&#x26;ls=1&#x26;mt=12" title="programming notebook">programming notebook</a> or remembering to bookmark/tag/organize what we find. If you do, awesome, I wish I was you. For the rest of us mere mortals, read on.</p> <p>I wanted something that would let me search <em>my</em> collection of SO <em>things</em> so I could find it later. Here's where I ended up: Every SO post I star being automatically bookmarked with full-text search</p> <p><strong>The Flow</strong></p> <ol> <li>Use an instance of <a href="stack2rss" title="stack2rss">stack2rss</a> to get an RSS feed of SO posts I've starred.</li> <li>Run a <a href="https://zapier.com/" title="Zap">Zap</a> that pulls these in and sends them to my <a href="https://pinboard.in/u:broderboy/t:stackoverflow/" title="bookmarks">bookmarks</a> (tagged as 'stackoverflow')</li> <li>Search using <a href="https://pinboard.in/upgrade/" title="Pinboard Premium">Pinboard Premium</a> which downloads the questions and archives them. <em>(this is optional)</em></li> </ol> <p>This has been working for me and I've already be able to re-find things that helped me before.</p> <p><strong>Setup</strong></p> <ol> <li>Spin up an instance of <a href="https://github.com/nathan-osman/stack2rss" title="stack2rss">stack2rss</a>. There is a <a href="http://stack2rss.quickmediasolutions.com/" title="demo">demo</a> available, but I've found it tends to go down. I've submitted a <a href="https://github.com/nathan-osman/stack2rss/pull/3" title="PR">PR</a> so you can 1 click install to Heroku. Click this <a href="https://heroku.com/deploy?template=https://github.com/nathan-osman/stack2rss/"><img src="https://www.herokucdn.com/deploy/button.svg" alt="Deploy"></a></li> <li>Get the url for your starred feeds: <code class="language-text">https://[YOUR-HEROKU-APP].herokuapp.com/2.2/users/[YOUR-SO-ID]/favorites?order=desc&amp;sort=activity&amp;site=stackoverflow</code></li> <li>Login or Register with <a href="https://zapier.com/" title="Zapier">Zapier</a></li> <li>Create a 2 step zap with the trigger being <code class="language-text">RSS by Zapier</code> and Pinboard's <code class="language-text">create bookmark</code> action</li> <li>Set each up as follows</li> </ol> <p><img src="https://c5.staticflickr.com/1/622/32066204692_74e32cdde5_z.jpg" alt=""></p> <p><img src="https://c1.staticflickr.com/1/515/32066204992_a2aa11295d_z.jpg" alt=""></p> <p><img src="https://c5.staticflickr.com/1/571/32176780436_a1fec1e26d_z.jpg" alt=""></p> <p>This has already saved me a lot of time. If you'd like help setting up, leave me a comment below</p><![CDATA[Show & Tell Cast - S02Ep001 - Dr. Strangelove, Young Guns & The Boondock Saints]]>https://www.timbroder.com/2016/12/show-&-tell-cast---s02ep001---dr.-strangelove,-young-guns-&-the-boondock-saintshttps://www.timbroder.com/2016/12/show-&-tell-cast---s02ep001---dr.-strangelove,-young-guns-&-the-boondock-saintsFri, 23 Dec 2016 09:19:00 GMT<blockquote> <p>This Episode’s Films</p> <p>Tim: Boondock Saints</p> <p>Clay: Young Guns</p> <p>Jonathan: Dr. Strangelove</p> </blockquote> <p>​</p><![CDATA[Gtdjedi Podcast - Ep022 - Where, When & How We Use Our Devices]]>https://www.timbroder.com/2016/11/gtdjedi-podcast---ep022---where,-when-&-how-we-use-our-deviceshttps://www.timbroder.com/2016/11/gtdjedi-podcast---ep022---where,-when-&-how-we-use-our-devicesFri, 11 Nov 2016 13:26:00 GMT<blockquote> <p>The Big Discussion</p> <p>Device Setups</p> <p>App layout (home screens and dock)</p> <p>Where, when and how we use our Apple Devices</p> <p>Desktop</p> <p>Laptop</p> <p>Tablet</p> <p>Phone</p> </blockquote> <p>​</p><![CDATA[Laravel 5.4 – Higher Order Messaging For Collections]]>https://www.timbroder.com/2016/11/laravel-54-–-higher-order-messaging-for-collectionshttps://www.timbroder.com/2016/11/laravel-54-–-higher-order-messaging-for-collectionsMon, 07 Nov 2016 09:59:00 GMT<p>Two words: HELL, YES</p> <blockquote> <p>The best way of showcasing this new feature is through code samples. Pretend you have a collection and you want to perform an operation on each of the items:</p> </blockquote> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token variable">$invoices</span><span class="token operator">-></span><span class="token function">each</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token variable">$invoice</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$invoice</span><span class="token operator">-></span><span class="token function">pay</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span></span></pre></div> <blockquote> <p>With this new feature you will be able to simplify this into:</p> </blockquote> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token variable">$invoices</span><span class="token operator">-></span><span class="token property">each</span><span class="token operator">-></span><span class="token function">pay</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <p>via <a href="https://laravel-news.com/2016/11/higher-order-messaging/" title="Laravel News">Laravel News</a></p><![CDATA[Using an Encrypted Realm in a background or notification processes?]]>https://www.timbroder.com/2016/10/using-an-encrypted-realm-with-background-or-notificatio-processeshttps://www.timbroder.com/2016/10/using-an-encrypted-realm-with-background-or-notificatio-processesSun, 30 Oct 2016 13:54:00 GMT<p><em>Note: This post's primary purpose is to help me think through this problem. I have no prescribed solution at the end of it. The conversation will continue on <a href="http://stackoverflow.com/q/40332246/647343" title="Stack Overflow">Stack Overflow</a>. I will update this post once I have a final approach.</em></p> <p>Realm has a great <a href="https://realm.io/docs/swift/latest/#encryption" title="write up">write up</a> and <a href="https://github.com/realm/realm-cocoa/blob/master/examples/ios/swift-2.2/Encryption/ViewController.swift" title="sample code">sample code</a> for encrypting your database. This documentation and sample work as intended, until you try to decrypt realm when:</p> <ol> <li>A user has a password on their phone</li> <li>The device is locked</li> <li>Your app is trying to do work with Realm when a remote notification comes in</li> </ol> <p>This happens because we can't access the keychain to get (or create) the key to en/decrypt the Realm. The default <code class="language-text">kSecAttrAccessible</code> value is <code class="language-text">kSecAttrAccessibleWhenUnlocked</code></p> <p>There are a few options as I see them:</p> <ol> <li>Change <code class="language-text">kSecAttrAccessible</code> to <code class="language-text">kSecAttrAccessibleAlways</code>. I don't like this because it's a) too open and b) it was <a href="http://stackoverflow.com/questions/32112678/ksecattraccessiblealways-deprecated-in-ios-9#comment53491023_32600761" title="slated to be deprecated in iOS 9">slated to be deprecated in iOS 9</a></li> <li>Change <code class="language-text">kSecAttrAccessible</code> to <code class="language-text">kSecAttrAccessibleAfterFirstUnlock</code> or <code class="language-text">kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly</code>. This is better but still feels too open to <em>me</em>, even though the <a href="https://developer.apple.com/reference/security/ksecattraccessibleafterfirstunlockthisdeviceonly" title="docs">docs</a> state: <em>This is recommended for items that need to be accessed by background applications</em></li> <li>Create a second, non-encrypted Realm to use as a staging database. Store notification data here, then when the app wakes up from user interaction (the device would be unlocked), move the data from the staging Realm into the encrypted real one. This doesn't feel right either, as we'll have data temporarily not encrypted</li> <li>Combine 2 and 3 and encrypt the staging Realm, and protect it's key with <code class="language-text">kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly</code></li> <li>??</li> </ol> <p>I'm currently trying to decide if #2, if #3 is worth putting the time into, or if I can come up with a #5</p><![CDATA[Using iOS 10 devices with Xcode 7]]>https://www.timbroder.com/2016/08/using-ios-10-devices-with-xcode-7https://www.timbroder.com/2016/08/using-ios-10-devices-with-xcode-7Wed, 31 Aug 2016 16:33:00 GMT<p><a href="https://twitter.com/steipete" title="Peter Steinberger">Peter Steinberger</a> started a GREAT <a href="https://gist.github.com/steipete/d9b44d8e9f341e81414e86d7ff8fb62d" title="gist">gist</a> on <em>Using Xcode 7.3.1 and iOS 10 devices</em>.</p> <p>Below is what worked for me to get a few extra test devices (my carry phone runs the 10 beta) working with Xcode 7. Can't upgrade to 8 just yet. Working with a contractor and don't want to move too many pieces.</p> <p><strong>My Setup</strong></p> <p>Xcode 7.3.1 and Beta 6 iOS 10 beta 6 <em>(Beta 7 is out, after getting this to work, I don't think I'm upgrading just yet)</em></p> <p><strong>Steps</strong></p> <ol> <li><code class="language-text">sudo ln -s /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/10.0\ \(14A5339a\)/ /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport</code></li> <li>iPhone: Settings > General > Reset > Network Settings</li> <li>Reboot iPhone <em>(after it wakes back up from the network reset)</em></li> <li>Reboot Mac <em>(restarting Xcode alone didn't work)</em></li> </ol> <p>It these steps don't work for you, check out the <a href="https://gist.github.com/steipete/d9b44d8e9f341e81414e86d7ff8fb62d" title="gist">gist</a> for other options.</p><![CDATA[How To Give Your Brain A Vacation]]>https://www.timbroder.com/2016/08/how-to-give-your-brain-a-vacationhttps://www.timbroder.com/2016/08/how-to-give-your-brain-a-vacationMon, 22 Aug 2016 10:47:00 GMT<blockquote> <p>a 2011 UC study revealed that we take in the about 174 newspapers’ worth of information daily</p> </blockquote> <p>😳😳😳</p> <p>Click through for some great tips ​</p><![CDATA[Metallica’S New Song Is Their Ballsiest In Decades]]>https://www.timbroder.com/2016/08/metallica’s-new-song-is-their-ballsiest-in-decadeshttps://www.timbroder.com/2016/08/metallica’s-new-song-is-their-ballsiest-in-decadesSun, 21 Aug 2016 10:58:00 GMT<blockquote> <p>The metal-heads who thought Metallica had turned into tired old wussies should sit down and shut up for three minutes, because the quartet is back with a new song that ranks as its best work in decades.</p> </blockquote> <p>​"Hell Yeah"</p> <p>Metallica has been my favorite band since middle school. Their discography playlist is constantly played on Spotify. Since S&#x26;M, their work has been lack-luster. I've listened to it in the hopes it will be good. It never is.</p> <p>After listening to this teaser song, I am VERY, VERY, excited. It's GREAT</p><![CDATA[Opening iTerm2 Tabs at Specific Directories]]>https://www.timbroder.com/2016/07/opening-iterm2-tabs-at-specific-directorieshttps://www.timbroder.com/2016/07/opening-iterm2-tabs-at-specific-directoriesThu, 21 Jul 2016 10:22:00 GMT<p>I love iTerm2. I can customize the stock Terminal.app just about as much, but it's much easier in iTerm. I find myself always opening the same 3 or 4 tabs when I get into coding mode. Luckily iTerm2 has <strong>great</strong> <a href="https://www.iterm2.com/documentation-scripting.html" title="scripting support">scripting support</a></p> <p>The 4 tabs I always open for <a href="http://www.kidfund.us/" title="Kidfund">Kidfund</a> are:</p> <ol> <li>Our iOS project</li> <li>Our Laravel project. Usually where I run artisan commands</li> <li>Our Laravel project; Tails most recent file in the log directory</li> <li>Our Laravel project; I jump around from here. Usually CD-ing to 1. the realm directory to pop it into <a href="https://github.com/realm/realm-browser-osx" title="Realm Browser">Realm Browser</a></li> </ol> <p>I didn't want this to run <em>all</em> of the time so I didn't have this script run each time iTerm opens. I instead wired it into an Alfred command. If you are interested you can download that <a href="https://github.com/Kidfund/KidTabs" title="here">here</a></p> <p>The underlying script is as follows. It's crud, and could definitely be more flexible, but it works for me at the moment. Hopefully it can help you craft something to your needs</p> <div class="gatsby-highlight" data-language="applescript"><pre style="counter-reset: linenumber NaN" class="language-applescript line-numbers"><code class="language-applescript"><span class="token keyword">tell</span> <span class="token class-name">application</span> <span class="token string">"iTerm2"</span> <span class="token keyword">tell</span> current session <span class="token keyword">of</span> current window write <span class="token class-name">text</span> <span class="token string">"cd ~/workspace/kidfund/ios"</span> <span class="token keyword">end</span> <span class="token keyword">tell</span> <span class="token keyword">tell</span> current window create tab <span class="token keyword">with</span> default profile <span class="token keyword">tell</span> current session <span class="token keyword">of</span> current tab write <span class="token class-name">text</span> <span class="token string">"cd ~/workspace/kidfund/web"</span> <span class="token keyword">end</span> <span class="token keyword">tell</span> <span class="token keyword">end</span> <span class="token keyword">tell</span> <span class="token keyword">tell</span> current window create tab <span class="token keyword">with</span> default profile <span class="token keyword">tell</span> current session <span class="token keyword">of</span> current tab write <span class="token class-name">text</span> <span class="token string">"cd ~/workspace/kidfund/web &amp;&amp; tail -f storage/logs/\"$(ls -at storage/logs | head -n 1)\""</span> <span class="token keyword">end</span> <span class="token keyword">tell</span> <span class="token keyword">end</span> <span class="token keyword">tell</span> <span class="token keyword">tell</span> current window create tab <span class="token keyword">with</span> default profile <span class="token keyword">tell</span> current session <span class="token keyword">of</span> current tab write <span class="token class-name">text</span> <span class="token string">"cd ~/workspace/kidfund/web"</span> <span class="token keyword">end</span> <span class="token keyword">tell</span> <span class="token keyword">end</span> <span class="token keyword">tell</span> <span class="token keyword">end</span> <span class="token keyword">tell</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[Gtdjedi Podcast - Ep018 - Dock Worthy Watch Apps]]>https://www.timbroder.com/2016/07/gtdjedi-podcast---ep018---dock-worthy-watch-appshttps://www.timbroder.com/2016/07/gtdjedi-podcast---ep018---dock-worthy-watch-appsWed, 20 Jul 2016 09:18:00 GMT<blockquote> <p>The Big Discussion</p> <p>6 Dock Worthy watchOS apps</p> </blockquote> <p>Clay</p> <blockquote> <p>Reminders</p> <p>Drafts</p> <p>2Do</p> <p>Fantastical</p> <p>Overcast</p> <p>Workflow</p> </blockquote> <p>Jerry</p> <blockquote> <p>Reminders</p> <p>Alarm.com</p> <p>MLB At Bat</p> <p>Automatic</p> <p>1Password</p> <p>Now Playing</p> </blockquote> <p>Tim</p> <blockquote> <p>Now playing</p> <p>Workout</p> <p>Omnifocus 2</p> <p>Quick Switch</p> <p>Runkeeper (future)</p> </blockquote> <p>​</p><![CDATA[Gtdjedi Podcast - Ep017 - Automation Faves]]>https://www.timbroder.com/2016/06/gtdjedi-podcast---ep017---automation-faveshttps://www.timbroder.com/2016/06/gtdjedi-podcast---ep017---automation-favesThu, 23 Jun 2016 18:35:00 GMT<blockquote> <p>GTDJedi Show Notes</p> <p>Episode #: 17</p> <p>Date: 06/21/16</p> <p>Hosts: Clay Russell, Jerry Goldbaum &#x26; Timothy Broder</p> <p>The Big Discussion</p> <p>Top 5 Launch Center Pro &#x26; Workflow Use Cases</p> </blockquote> <p>​</p><![CDATA[Hey Mama! Podcast]]>https://www.timbroder.com/2016/06/hey-mama-16https://www.timbroder.com/2016/06/hey-mama-16Mon, 20 Jun 2016 15:05:00 GMT<blockquote> <p>We bring our husbands on to discuss #fatherhood, have them share their #igotthis and #idontgotthis moments since becoming dads, and they make recommendations on apps, books and more for soon-to-be or new dads. We tell stories about their early parenting days and as usual, talk about our weeks.</p> </blockquote> <p>I joined the Hey Mama! podcast for a very special Father's Day episode.</p> <p>Check it out!</p><![CDATA[App Launching On Apple Watch]]>https://www.timbroder.com/2016/06/app-launching-on-apple-watchhttps://www.timbroder.com/2016/06/app-launching-on-apple-watchSun, 19 Jun 2016 19:35:00 GMT<blockquote> <p>I love using the Stopwatch and Timer apps while I'm cooking or brewing coffee, but I don't want their complications visible during the rest of the day. The ability to swipe left and bring up an entire watch face devoted to them and any other complications relevant to cooking is a game changer for me. I'll keep my existing primary watch face configured with the date, and a few activity / fitness complications, and I'll also have my Movie watch face with no distractions that Ryan Considine inspired me to use.</p> </blockquote> <p>I hadn't even thought about using different watch faces for different tasks or themes of tasks.</p> <p>I already switch faces of its the weekend (don't need calendar for example) but this will take it to a whole new level</p><![CDATA[Github File and Link Tricks]]>https://www.timbroder.com/2016/06/github-file-and-link-trickshttps://www.timbroder.com/2016/06/github-file-and-link-tricksThu, 09 Jun 2016 10:25:00 GMT<p>2 tricks I learned today that I'd like to share: reliably linking to a specific line and searching for files using fuzzy matching.</p> <h1>Reliably link to a specific line</h1> <p>Say you are on the master branch, and you want to reference a line in a file. This could either be for a conversation you are having at that moment, answering a question in a PR, or adding information to a ticket. At that point in time, your link will work great. But, what about when that file gets changed tomorrow? More lines get added higher up, above the link, and the line that the link it pointing to, now points to something else!</p> <p>You can easily have github switch to the latest commit for the file you are viewing. Just press 'y'. Then, when you link to a line, you are linking to THAT version of the file. You reference will always be intact.</p> <h1>Search for files using fuzzy matching</h1> <p>When you are browsing through files, there is a button in the upper right that says "Find file". I'm sure it's been there forever, but I just noticed it.</p> <p>This brings you to a full file tree that you can search using fuzzy matching. Just like if you were in your IDE quick-opening a file!</p><![CDATA[Gtdjedi Podcast - Ep016 - Custom Keyboard Input]]>https://www.timbroder.com/2016/06/gtdjedi-podcast---ep016---custom-keyboard-inputhttps://www.timbroder.com/2016/06/gtdjedi-podcast---ep016---custom-keyboard-inputThu, 02 Jun 2016 12:21:00 GMT<blockquote> <p>The Big Discussion</p> <p>Custom Keyboards</p> </blockquote> <blockquote> <p>Jedi Weapons of Choice</p> <p>Clay - Gboard, Copied</p> <p>Jerry - Gboard</p> <p>Tim - Gboard, Bitmoji, MS Flow</p> </blockquote> <blockquote> <p>Bantha Fodder (apps deleted from our devices)</p> <p>Jerry - MS Flow</p> <p>Tim - Rock Clock</p> </blockquote> <p>​</p><![CDATA[Open source everything]]>https://www.timbroder.com/2016/05/open-source-everythinghttps://www.timbroder.com/2016/05/open-source-everythingTue, 24 May 2016 16:51:00 GMT<p>Great 2 part series by <a href="https://twitter.com/jesse_squires" title="@jesse_squires">@jesse_squires</a> on the importance of documenting everything and the gains of working in open source. I picked up a few tricks, especially <a href="https://github.com/onevcat/VVDocumenter-Xcode" title="VVDocumenter-Xcode">VVDocumenter-Xcode</a> for docblock generation. But, more importantly is the ethos in which he approaches his work</p> <ul> <li><a href="http://www.jessesquires.com/swift-documentation/" title="Swift Documentation">Swift Documentation</a></li> <li><a href="http://www.jessesquires.com/open-source-everything/" title="Open Source Everything">Open Source Everything</a></li> </ul><![CDATA[Avoiding Blackberry’S Fate – Marco.Org]]>https://www.timbroder.com/2016/05/avoiding-blackberry’s-fate-–-marco.orghttps://www.timbroder.com/2016/05/avoiding-blackberry’s-fate-–-marco.orgSun, 22 May 2016 07:44:00 GMT<blockquote> <p>The BlackBerry’s success came to an end not because RIM started releasing worse smartphones, but because the new job of the smartphone shifted almost entirely outside of their capabilities, and it was too late to catch u</p> </blockquote> <p>​</p> <blockquote> <p>Today, Amazon, Facebook, and Google are placing large bets on advanced AI, ubiquitous assistants, and voice interfaces, hoping that these will become the next thing that our devices are for.</p> <p>If they’re right — and that’s a big “if” — I’m worried for Apple.</p> </blockquote> <p>Marco makes a lot of good points and I agree with this 100%. The mobile phone market as we know it is primed for the "next big thing" by someone. Who that is, and whether they are right remains to be seen. Do I mean that the current market is stagnant, or that innovation is dead? Of course not. But, I do think changes we'll see from the big 2 to their platforms will be incremental. There will always be new UI paradigms, features, and apps that can augment a platform.</p> <p>The next large improvement will be what our devices start DOING with the data we give them. Not just inputs and outputs. But contextually understanding the data and begin to make predictions on it. Apple is "good" at the former; give them something and they will give it back to you quickly. iMessage and the new photos are examples of this. Passwords, backups, and sync are examples of where they fall short. However, they can't act on that data. Photos knows who someone is because you tagged them. Or knows how much you liked a photo or a restaurant because you gave it stars. Input and outputs. Compare this to Google photos (which is downright amazing) that automatically just "knows" who is in the photo or figures out that an event took place because you traveled to it.</p> <p>Google is king of data mining and context (Facebook and Amazon are not far behind). As Marco explains in his piece, Apple just can't catch up to that. It's my hope that the awesome that Google will bring in the form of Ai to devices won't be restricted to Android. I'm sure that Android will always have the most seamless experience, but it will be nice if Google's apps bring much of it to iPhone. Even better, would be for Google and Apple to get along again ala when Google Maps came installed on your iPhone</p><![CDATA[Setup and Teardown the Database Once Per Test Suite in PHPUnit]]>https://www.timbroder.com/2016/05/setup-and-teardown-the-database-once-per-test-suite-with-phpunit-listenershttps://www.timbroder.com/2016/05/setup-and-teardown-the-database-once-per-test-suite-with-phpunit-listenersWed, 04 May 2016 16:15:00 GMT<p>I'm working on a series of integration tests where I want to set up and reset the database for each run. This could easily be done in the setUp and tearDown methods, but doing the full db each time is slow. Yes, I could just do the tables I need, but I was curious, and now I don't have to worry about which tables are setup in my testing DB. In this example, I'm using Laravel's migrations and SQLite as the test DB.</p> <p><strong>UPDATE 05/05/2016</strong>: As Sebastian <a href="http://www.timbroder.com/2016/05/Setup-and-Teardown-the-Database-Once-Per-Test-Suite-with-PHPUnit-Listeners.html#comment-2659950789" title="point out below">points out below</a> (thanks!) there is a much more appropriate way. Using <code class="language-text">setUpBeforeClass</code> and <code class="language-text">tearDownAfterClass</code> we achieve the same effect</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">function</span> <span class="token function-definition function">setUpBeforeClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword static-context">parent</span><span class="token operator">::</span><span class="token function">setUpBeforeClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">exec</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'php artisan migrate --database sqlite_test'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">function</span> <span class="token function-definition function">tearDownAfterClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">exec</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'php artisan migrate:reset --database sqlite_test'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword static-context">parent</span><span class="token operator">::</span><span class="token function">tearDownAfterClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p><del>PHPUnit has <a href="https://phpunit.de/manual/current/en/extending-phpunit.html#extending-phpunit.examples.SimpleTestListener.php" title="listeners">listeners</a> that you can tap into at various parts of your tests' lifecycle. I'm particularly interested in when a specific suite starts and ends. We'll need to do 2 things:</del></p> <ol> <li><del>Create our Listener</del></li> <li><del>Register this Listener in phpunit.xml</del></li> </ol> <p>The listener is as follows:</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">FullDBListener</span> <span class="token keyword">extends</span> <span class="token class-name">PHPUnit_Framework_BaseTestListener</span> <span class="token punctuation">{</span> <span class="token keyword">protected</span> <span class="token variable">$suites</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string single-quoted-string">'UserIntegrationTest'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'AccountIntegrationTest'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">startTestSuite</span><span class="token punctuation">(</span><span class="token class-name type-declaration">PHPUnit_Framework_TestSuite</span> <span class="token variable">$suite</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">in_array</span><span class="token punctuation">(</span><span class="token variable">$suite</span><span class="token operator">-></span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">suites</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">exec</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'php artisan migrate --database sqlite_test'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">endTestSuite</span><span class="token punctuation">(</span><span class="token class-name type-declaration">PHPUnit_Framework_TestSuite</span> <span class="token variable">$suite</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">in_array</span><span class="token punctuation">(</span><span class="token variable">$suite</span><span class="token operator">-></span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">suites</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">exec</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'php artisan migrate:reset --database sqlite_test'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>This does a few things:</p> <ol> <li><del>Stores the class names of each suite we want to run the db migrations for</del></li> <li><del>In <code class="language-text">startTestSuite</code> it checks to see if we're in the right suite</del></li> <li><del>If we are, run an artisan migration on our test db</del></li> <li><del>In <code class="language-text">endTestSuite</code> it checks to see if we're in the right suite</del></li> <li><del>If we are, run an artisan migration:reset on our test db</del></li> </ol> <p><del>Next, we need to make PHPUnit aware of this listener. Update your path accordingly</del></p> <div class="gatsby-highlight" data-language="xml"><pre style="counter-reset: linenumber NaN" class="language-xml line-numbers"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>listeners</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>listener</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>FullDBListener<span class="token punctuation">"</span></span> <span class="token attr-name">file</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>./tests/app/FullDBListener.php<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>listener</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>listeners</span><span class="token punctuation">></span></span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span></span></pre></div> <p>That's it!</p> <p>I do do some basic teardown in my test suite's <code class="language-text">setUp</code> method to give me a blank slate. This has proven faster then doing the migrations each time</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">setUp</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword static-context">parent</span><span class="token operator">::</span><span class="token function">setUp</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name static-context">User</span><span class="token operator">::</span><span class="token function">truncate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>I hope this helped you, if you have any questions, let me know!</p><![CDATA[Sketch Git Plugin]]>https://www.timbroder.com/2016/05/sketch-git-pluginhttps://www.timbroder.com/2016/05/sketch-git-pluginWed, 04 May 2016 11:10:00 GMT<blockquote> <p>A Git client built right into Sketch. Generate pretty diffs so that everybody knows what are the changes!</p> </blockquote> <p>Designers can use git too!</p><![CDATA[Gtdjedi Podcast - Ep015 - Notes On Notes]]>https://www.timbroder.com/2016/04/gtdjedi-podcast---ep015---notes-on-noteshttps://www.timbroder.com/2016/04/gtdjedi-podcast---ep015---notes-on-notesWed, 27 Apr 2016 09:22:00 GMT<blockquote> <p>Note Management &#x26; Organization</p> <p>What kind of notes go where: images, text, bookmarks, photos?</p> <p>Will we see services eventually go away as native solutions become more complete?</p> <p>The importance of syncing and sharing</p> <p>Note Widgets: Do you use them? Which ones &#x26; how?</p> </blockquote> <p>​</p><![CDATA[Being A Developer After 40 — Medium]]>https://www.timbroder.com/2016/04/being-a-developer-after-40-—-mediumhttps://www.timbroder.com/2016/04/being-a-developer-after-40-—-mediumTue, 26 Apr 2016 18:33:00 GMT<p>Good #longread for any developer. Regardless of how long you've been doing this</p> <blockquote> <p>Hi everyone, I am a forty-two years old self-taught developer, and this is my story.</p> </blockquote> <p>​</p><![CDATA[Presenting Unanticipated Errors To Users]]>https://www.timbroder.com/2016/04/Great-Series-on-Errors-&-Their-Presentationhttps://www.timbroder.com/2016/04/Great-Series-on-Errors-&-Their-PresentationTue, 26 Apr 2016 10:25:00 GMT<p>This is the start of a really great series. It uses Swift for the examples but everything in the articles holds true for any language/platform</p> <ul> <li><a href="http://www.cocoawithlove.com/blog/2016/03/17/non-pure-errors.html" title="Errors: unexpected, composite, non-pure, external">Errors: unexpected, composite, non-pure, external</a></li> <li><a href="http://www.cocoawithlove.com/blog/2016/04/14/error-recovery-attempter.html" title="Presenting unanticipated errors to users">Presenting unanticipated errors to users</a></li> </ul> <blockquote> <p>First, some quick terminology:</p> <ol> <li> <p>an error condition is a failed conditional check that results in a function skipping its usual functionality and instead returning an nominated error value.</p> </li> <li> <p>an error is a value used to report that an error condition occurred and normal functionality was skipped</p> </li> <li> <p>error handling is code that looks for errors and performs different actions based on the presence of those errors</p> </li> <li> <p>error reporting communicates an error result from a user task to the user</p> </li> </ol> </blockquote> <p>​</p><![CDATA[Trying to Mock a Self Booting Laravel Model Trait]]>https://www.timbroder.com/2016/04/trying-to-mock-a-self-booting-laravel-model-traithttps://www.timbroder.com/2016/04/trying-to-mock-a-self-booting-laravel-model-traitTue, 12 Apr 2016 11:01:00 GMT<p><a href="http://www.archybold.com/blog/post/booting-eloquent-model-traits" title="Bootable">Bootable</a> Model traits are pretty nifty. I'm using them to register certain events for the models using my Trait. However, I've run into an issue trying to mock models that are using the trait. Specifically, when a Mockery version of the model is instantiated, it's boot code agrees that it should have a bootMyTrait method, but can't find it when it tries to call it.</p> <p><a href="https://github.com/timbroder/mock-bootable-laravel-model-trait" title="Sample Repository">Sample Repository</a> for the below, with commands to reproduce.</p> <p>As an example, here is a trait:</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token keyword">namespace</span> <span class="token package">App</span><span class="token punctuation">;</span> <span class="token keyword">trait</span> <span class="token class-name-definition class-name">MyTrait</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">function</span> <span class="token function-definition function">bootMyTrait</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"Booting MyTrait\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>And a model using it:</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token keyword">namespace</span> <span class="token package">App</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Database<span class="token punctuation">\</span>Eloquent<span class="token punctuation">\</span>Model</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">MyModel</span> <span class="token keyword">extends</span> <span class="token class-name">Model</span> <span class="token punctuation">{</span> <span class="token keyword">use</span> <span class="token package">MyTrait</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Instantiating the model regularly works fine. This shows the desired output:</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token variable">$model</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MyModel</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <p>However, trying to mock this model does not cooperate. This:</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Foundation<span class="token punctuation">\</span>Testing<span class="token punctuation">\</span>WithoutMiddleware</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Foundation<span class="token punctuation">\</span>Testing<span class="token punctuation">\</span>DatabaseMigrations</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Foundation<span class="token punctuation">\</span>Testing<span class="token punctuation">\</span>DatabaseTransactions</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">ExampleTest</span> <span class="token keyword">extends</span> <span class="token class-name">TestCase</span> <span class="token punctuation">{</span> <span class="token comment">/** * A basic functional test example. * * @return void */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">testTraitBooting</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$model</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">getMock</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'App\MyModel'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Fails. Adding some debugging to Eloquent:</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"> <span class="token comment">/** * Boot all of the bootable traits on the model. * * @return void */</span> <span class="token keyword">protected</span> <span class="token keyword">static</span> <span class="token keyword">function</span> <span class="token function-definition function">bootTraits</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$class</span> <span class="token operator">=</span> <span class="token keyword static-context">static</span><span class="token operator">::</span><span class="token keyword">class</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token function">class_uses_recursive</span><span class="token punctuation">(</span><span class="token variable">$class</span><span class="token punctuation">)</span> <span class="token keyword">as</span> <span class="token variable">$trait</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"\nTesting that class: <span class="token interpolation"><span class="token variable">$class</span></span> has method: "</span> <span class="token operator">.</span> <span class="token variable">$method</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'boot'</span><span class="token operator">.</span><span class="token function">class_basename</span><span class="token punctuation">(</span><span class="token variable">$trait</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string double-quoted-string">" because of Trait: <span class="token interpolation"><span class="token variable">$trait</span></span>\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">method_exists</span><span class="token punctuation">(</span><span class="token variable">$class</span><span class="token punctuation">,</span> <span class="token variable">$method</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'boot'</span><span class="token operator">.</span><span class="token function">class_basename</span><span class="token punctuation">(</span><span class="token variable">$trait</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"Class: <span class="token interpolation"><span class="token variable">$class</span></span> has method: <span class="token interpolation"><span class="token variable">$method</span></span> \n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token function">forward_static_call</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token variable">$class</span><span class="token punctuation">,</span> <span class="token variable">$method</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name class-name-fully-qualified"><span class="token punctuation">\</span>PHPUnit_Framework_MockObject_BadMethodCallException</span> <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"Class: <span class="token interpolation"><span class="token variable">$class</span></span> failed calling <span class="token interpolation"><span class="token variable">$method</span></span>\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">throw</span> <span class="token variable">$e</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Gives us this failure:</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">PHPUnit 5.1.0 by Sebastian Bergmann and contributors. E 1 / 1 (100%) Testing that class: Mock_MyModel_9ee820db has method: bootMyTrait because of Trait: App\MyTrait Class: Mock_MyModel_9ee820db has method: bootMyTrait Class: Mock_MyModel_9ee820db failed calling bootMyTrait Time: 129 ms, Memory: 18.00Mb There was 1 error: 1) ExampleTest::testTraitBooting PHPUnit_Framework_MockObject_BadMethodCallException: mock-bootable-laravel-model-trait/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:326 mock-bootable-laravel-model-trait/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:309 mock-bootable-laravel-model-trait/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:296 mock-bootable-laravel-model-trait/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:277 mock-bootable-laravel-model-trait/tests/ExampleTest.php:16</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>I've also tried creating the mock a few different ways. Using <a href="https://github.com/laravel/framework/blob/2a38acf7ee2882d831a3b9a1361a710e70ffa31e/tests/Database/DatabaseSoftDeletingTraitTest.php#L14" title="DatabaseSoftDeletingTraitTest">DatabaseSoftDeletingTraitTest</a> as an example:</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Foundation<span class="token punctuation">\</span>Testing<span class="token punctuation">\</span>WithoutMiddleware</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Foundation<span class="token punctuation">\</span>Testing<span class="token punctuation">\</span>DatabaseMigrations</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Foundation<span class="token punctuation">\</span>Testing<span class="token punctuation">\</span>DatabaseTransactions</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Mockery</span> <span class="token keyword">as</span> m<span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">ExampleTest</span> <span class="token keyword">extends</span> <span class="token class-name">TestCase</span> <span class="token punctuation">{</span> <span class="token comment">/** * A basic functional test example. * * @return void */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">testTraitBooting</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$mock</span> <span class="token operator">=</span> <span class="token class-name static-context">m</span><span class="token operator">::</span><span class="token function">mock</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'App\MyModel'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$mock</span><span class="token operator">-></span><span class="token function">shouldReceive</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'bootMyTrait'</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">once</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>But here, bootMyTrait is never called:</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">PHPUnit 5.1.0 by Sebastian Bergmann and contributors. E 1 / 1 (100%) Time: 149 ms, Memory: 19.25Mb There was 1 error: 1) ExampleTest::testTraitBooting Mockery\Exception\InvalidCountException: Method bootMyTrait() from Mockery_0_App_MyModel should be called exactly 1 times but called 0 times. mock-bootable-laravel-model-trait/vendor/mockery/mockery/library/Mockery/CountValidator/Exact.php:37 mock-bootable-laravel-model-trait/vendor/mockery/mockery/library/Mockery/Expectation.php:271 mock-bootable-laravel-model-trait/vendor/mockery/mockery/library/Mockery/ExpectationDirector.php:120 mock-bootable-laravel-model-trait/vendor/mockery/mockery/library/Mockery/Container.php:297 mock-bootable-laravel-model-trait/vendor/mockery/mockery/library/Mockery/Container.php:282 mock-bootable-laravel-model-trait/vendor/mockery/mockery/library/Mockery.php:142 mock-bootable-laravel-model-trait/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php:122</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>So, I can move the code I'm doing in the boot method to a ServiceProvider, but then I'll need to register each Model that uses the trait. This feels dirty, and using the boot method seems appropriate. So I think I've either hit a bug, or am Mocking the trait-using-model incorrectly. I've looked at <code class="language-text">getMockForTrait</code> but I also need the mocked instance to extend Eloquent (a few of the trait's methods call eloquent methods)</p> <p>If anyone sees something I missed, much appreciated</p> <p><em>Update Apr, 22 (Friday) 2016-04-22 03:28 PM</em></p> <p>Thanks to <a href="http://stackoverflow.com/a/36771173/647343" title="Marcin">Marcin</a>, we have a solution!</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token php language-php"><span class="token delimiter important">&lt;?php</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Foundation<span class="token punctuation">\</span>Testing<span class="token punctuation">\</span>WithoutMiddleware</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Foundation<span class="token punctuation">\</span>Testing<span class="token punctuation">\</span>DatabaseMigrations</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Foundation<span class="token punctuation">\</span>Testing<span class="token punctuation">\</span>DatabaseTransactions</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Mockery</span> <span class="token keyword">as</span> m<span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">ExampleTest</span> <span class="token keyword">extends</span> <span class="token class-name">TestCase</span> <span class="token punctuation">{</span> <span class="token comment">/** * A basic functional test example. * * @return void */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">testTraitBooting</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$mock</span> <span class="token operator">=</span> <span class="token class-name static-context">m</span><span class="token operator">::</span><span class="token function">mock</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'App\MyModel'</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">makePartial</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$mock</span><span class="token operator">-></span><span class="token function">shouldReceive</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'bootMyTrait'</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">once</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$mock</span><span class="token operator">-></span><span class="token function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[Everything Is Possible But Nothing Is Free]]>https://www.timbroder.com/2016/04/everything-is-possible-but-nothing-is-free-—-signal-v.-noisehttps://www.timbroder.com/2016/04/everything-is-possible-but-nothing-is-free-—-signal-v.-noiseMon, 04 Apr 2016 17:47:00 GMT<blockquote> <p>What those asking really want to know, though, is one of two things:</p> <p>Can you just build this thing I want, in addition to all the other things already on your plate, without moving any of your estimates?</p> </blockquote> <p>​</p> <blockquote> <p>Is this “easy” to do?</p> </blockquote> <p>​</p> <blockquote> <p>Here’s a simpler approach: I would like to have this and I’m willing to pay up to that.</p> </blockquote> <p>​</p><![CDATA[Gtdjedi Podcast - Ep014 - Getting Social]]>https://www.timbroder.com/2016/04/gtdjedi-podcast---ep014---getting-socialhttps://www.timbroder.com/2016/04/gtdjedi-podcast---ep014---getting-socialSun, 03 Apr 2016 15:30:00 GMT<blockquote> <p>The Big Discussion</p> <p>Social Networking</p> <p>Which services we use</p> <p>Which services manage which relationships</p> <p>Which services we stay away from</p> <p>What routines are in place that help keep our circles and feeds streamlined</p> <p>What does it take for a social network to have staying power on your devices?</p> <p>Jedi Weapons of Choice</p> <p>Clay - Tweetbot</p> <p>Jerry - Facebook Paper</p> <p>Tim - Cluster</p> </blockquote> <p>​</p><![CDATA[Jumping Ship on Basecamp 3]]>https://www.timbroder.com/2016/03/jumping-ship-on-basecamp-3https://www.timbroder.com/2016/03/jumping-ship-on-basecamp-3Tue, 29 Mar 2016 18:06:00 GMT<p>I love Basecamp. I've used it in <a href="https://help.basecamp.com/basecamp" title="some form">some shape</a> or <a href="https://basecamp.com/2" title="form">form</a> for almost <a href="https://www.alexanderinteractive.com/" title="7 years">7 years</a>. I was <a href="http://www.timbroder.com/2015/10/a-preview-of-what&#x27;s-new-in-basecamp-3.html" title="super excited">super excited</a> for Basecamp 3. I wish I could say "It's not you, it's me" but that would be a lie.</p> <p><strong>Basecamp 3 is not ready</strong></p> <p>Does it have bugs? No, none that I've seen. Does it have downtime? No, it's been rock solid. What v3 is missing are some key features found in v2. Ones I didn't realize were missing until I went to use them. I've tried to live without them, or work around them best I can, but I'm done.</p> <p>I started at a <a href="http://www.kidfund.us/" title="new company">new company</a> in January and choosing our tools is my responsibility. Slack and Google Apps were first on the list. Next came something to handle tracking long form conversations and company/project todos. I love basecamp. A new version just came out. Easy decision. One that I now regret.</p> <p>What I miss from Basecamp 2:</p> <ol> <li><a href="https://basecamp.com/help/2/guides/projects/email-in" title="Email In">Email In</a></li> <li>An <a href="https://github.com/basecamp/bcx-api/issues/196" title="API">API</a> (specifically <a href="https://zapier.com/zapbook/basecamp3/" title="Zapier">Zapier</a> integration)</li> <li>Sorting posts by most recently commented</li> </ol> <p><em>(The third one pushed me over the edge)</em></p> <h1>Email-in</h1> <p>There are a lot of people in this world that don't like tools like Basecamp. "Why can't I just use email", "the search sucks", "It's just another thing I have to check" can be heard with regularity. Part of my job involved parading around the office championing Basecamp (or forcing people to use it). Email-in made part of these complaints bearable. It made it "just as easy" as email for starting, or replying to, threads. Basecamp 3 was the promise land that addressed a lot of this with better search and better notifications.</p> <p>Email in <a href="https://twitter.com/timothybroder/status/696784457055993856" title="isn’t on the roadmap">isn’t on the roadmap</a> nor is it listed on the <a href="https://basecamp.com/3/transition/should-we-go-bc3" title="“should we switch">“should we switch"</a> page.</p> <p>This functionality is partially there, hidden away in the "forward from client" section. When I found out it was missing I almost left, but I figured I could cobble something together with the API and Zapier...</p> <h1>API</h1> <p>I have a few main <a href="https://github.com/basecamp/bcx-api/issues/196#issuecomment-181549941" title="use cases">use cases</a> for an API. The primary one being a hacked together Email-in. The second is <a href="http://www.timbroder.com/2015/10/how-to-sync-basecamp-todos-to-omnifocus-or-todoist-.html" title="replicating">replicating</a> Basecamp tasks in my todo app. (I happen to use Omnifocus.)</p> <p>Lacking an API, or a roadmap for one, I grumbled. But, I figured I could wait and make my tasks by hand. After all, that's me wanting to work the way I like to. Manually entering emails into Basecamp, littering messages with "as communicated by," seemed a small price to pay.</p> <p>The missing API <em>is</em> listed on the should we switch page, after a long discussion on <a href="https://github.com/basecamp/bcx-api/issues/196#issuecomment-185243532" title="Github">Github</a></p> <p>The good news on the API front is that there has been <a href="https://github.com/basecamp/bcx-api/issues/196#issuecomment-198436989" title="GREAT progress">GREAT progress</a>. I got excited. Soon everything would be as it should</p> <h1>Post Sorting</h1> <p>This hurdle just dawned on me this morning while I was scrolling down looking for something. Basecamp 3 only sorts posts by their created date. Which meant that our most frequently updated post, with dozens of comments, is all the way at the bottom, with a bunch of fluff between me and it. It seemed like there had to be a way to change the sort, but I confirmed with Basecamp this is not available.</p> <p><em>Use search!</em> Ok, but now an app is asking me to take on cognitive load of something it should handle</p> <p><em>You are using it wrong!</em> <strong>Don't even go there</strong>, I spent years at my last job working with some of the <a href="https://www.alexanderinteractive.com/work/" title="best">best</a> UX and Creative Designers I've ever seen. If <em>"the customer just isn't using it right"</em> was used as an argument, we hadn't solved the problem</p> <p><em>Use notifications!</em> I do, they go away</p> <p>One could argue that I'm just annoyed that <em>"things have changed and I just want things to go back to the way they were in 2"</em>. I thought about that. Is this just me? Am I just whining? Email in and an API are missing, not changed.</p> <p><em>Using "Email In" isn't the way the product was meant to be used!</em> Tough, it was there for years.</p> <p>Even if I could suck it up and trudge through lacking email and API, It is beyond me why you would want older content above newer content</p> <p>So, I'm leaving. We are moving too fast for this to slow us down. I can't wait for "someday/maybe" (Basecamp does not release timelines; I respect that but it doesn't help me here)</p> <p>Tim, if you love v2 so much, just use it. <strong>I might</strong>! But:</p> <ul> <li>I'm not sure how long v2 will be around</li> <li>When it does get decommissioned, will my above issues still exist?</li> <li>Will a v2 to v3 migratory <a href="https://basecamp.com/3/transition/faqs" title="exist">exist</a>? (I would hope so)</li> </ul> <p>The barrier to switching will be much higher if/when v2 dies than it is now. Should I switch to v2? Probably. Should I take some time and look at something like <a href="asana.com" title="http://asana.com">http://asana.com</a>? Yep, I have. Now if I could just get over how they format the emails...</p><![CDATA[How to Get Notified if someone stars, forks, or follows your Github]]>https://www.timbroder.com/2016/03/how-to-get-notified-if-someone-stars,-forks,-or-follows-your-githubhttps://www.timbroder.com/2016/03/how-to-get-notified-if-someone-stars,-forks,-or-follows-your-githubFri, 25 Mar 2016 15:41:00 GMT<p>I've been using <a href="https://gitnotifier.io/" title="GitNotifier">GitNotifier</a> for a few weeks now. I get a weekly report emailed to me of who has starred or forked any of my repositories, as well as follow/unfollows. It's a nice little touch to put on top of Github's already great service</p><![CDATA[How To Set Up An Ios And Android Smart App Banner]]>https://www.timbroder.com/2016/03/how-to-set-up-an-ios-and-android-smart-app-bannerhttps://www.timbroder.com/2016/03/how-to-set-up-an-ios-and-android-smart-app-bannerTue, 22 Mar 2016 21:04:00 GMT<blockquote> <p>Leveraging their link redirect and deep linking expertise, Branch just released a fully customizable, cross-platform, deep linking and tracking smart app banner. It works on all browsers: Safari, Chrome, Firefox, stock browsers and even desktop versions.</p> </blockquote> <p>​This looks pretty good. Curious how well it will play with JLRoutes</p><![CDATA[Tektok Podcast - Ep025 - Ocd & The Se]]>https://www.timbroder.com/2016/03/tektok-podcast---ep025---ocd-&-the-sehttps://www.timbroder.com/2016/03/tektok-podcast---ep025---ocd-&-the-seTue, 22 Mar 2016 20:46:00 GMT<blockquote> <p>TEK Topics</p> <p>Patrick: iPhone SE</p> <p>What are your thoughts on the iPhone SE, was Apple smart to hold this device out for Spring announcement?</p> <p>Jerry: Smartphone as a primary (and only) computing device?</p> <p>Can your smartphone be your primary (and only) computing device?</p> </blockquote> <blockquote> <p>Tim: Mobile Money</p> <p>How comfortable are you sending money with your phone? (venmo, square cash, FBM, snapchat)</p> <p>How comfortable are you giving these apps your CC or checking account info?</p> </blockquote> <p>Snuck in some discussion about Kidfund ;)</p> <p>Disclosed of course</p> <blockquote> <p>Justin: RSS and news apps</p> <p>What is your routine for saving news/blog posts? By the time you get to them are they already old news?</p> <p>Clay: Homescreens on iOS</p> <p>How would you like to see the home screen changed in iOS?</p> </blockquote><![CDATA[Gtdjedi Podcast - Ep013 - Default Worthy Apps]]>https://www.timbroder.com/2016/03/gtdjedi-podcast---ep013---default-worthy-appshttps://www.timbroder.com/2016/03/gtdjedi-podcast---ep013---default-worthy-appsThu, 10 Mar 2016 15:07:00 GMT<blockquote> <p>GTDJedi Show Notes</p> <p>Episode #: 13</p> <p>Date: 03/08/16</p> <p>Hosts: Clay Russell, Jerry Goldbaum &#x26; Timothy Broder</p> <p>The Big Discussion</p> <p>Which 3rd party apps have you replaced native apps with?</p> </blockquote> <p>​</p><![CDATA[Jira Filter Subscriptions]]>https://www.timbroder.com/2016/02/jira-filter-subscriptionshttps://www.timbroder.com/2016/02/jira-filter-subscriptionsMon, 22 Feb 2016 23:00:00 GMT<p>I'm working in a Jira that I don't have admin access to. It's been a while since that's happened!</p> <p>I wanted a way to get notified if anyone in the system opens a new ticket, so I could decide if I wanted to watch it or not. Jira makes this fairly straightforward with filters and subscriptions.</p> <p>First, create a filter that picks up any tickets created in the last hour. I named mine "Recently Created"</p> <p><img src="https://farm2.staticflickr.com/1529/24572160063_d61b56b982_z_d.jpg" alt=""></p> <p>Then, click details, and new subscription</p> <p><img src="https://farm2.staticflickr.com/1488/25172705536_1b486d9f4c_z_d.jpg" alt=""></p> <p>Setup the schedule to be every 30 mins, 24 hours a day, and to <strong>not</strong> email you if there are no new issues</p> <p><img src="https://farm2.staticflickr.com/1644/24831359639_ab75c74611_z_d.jpg" alt=""></p> <p>You'll get a well formatted email if there are new issues, and you can cherry pick the ones you want to watch</p><![CDATA[Gtdjedi Podcast - Ep012 - Notification Organization]]>https://www.timbroder.com/2016/02/gtdjedi-podcast---ep012---notification-organization (1)https://www.timbroder.com/2016/02/gtdjedi-podcast---ep012---notification-organization (1)Wed, 03 Feb 2016 08:41:00 GMT<blockquote> <p>Hosts: Clay Russell, Jerry Goldbaum &#x26; Timothy Broder</p> <p>Jedi Tricks from Around the Web (check out our website for links to all these GTDJedi Tricks)</p> <p>Secret Safari Shortcuts by Rene Ritchie</p> <p>How Email to 2Do Has Improved My Daily Email Workflow by Federico Viticci</p> <p>Ultimate Omnifocus Evernote Integration That Actually Works by Alpha Efficiency</p> <p>How to Master Slack at the Office by Jessica Plautz</p> <p>If you, our listeners, have at trick you would like to share with us, simply tweet us @GTDJedi.</p> <p>The Big Discussion</p> <p>Notification Management</p> <p>Jedi Weapons of Choice</p> <p>Clay - my Apple Watch</p> <p>Jerry - Notify, Apple Watch, Outlook</p> <p>Tim - Slack, General iOS/Mac practices</p> </blockquote> <p>​</p><![CDATA[Activist Engineering]]>https://www.timbroder.com/2016/02/activist-engineeringhttps://www.timbroder.com/2016/02/activist-engineeringTue, 02 Feb 2016 18:16:00 GMT<blockquote> <p>What matters is that you’re the engineer that’s noticed this capital-B Bad Idea. You know why it’s a problem. This time it’s not just the technical debt or the time it’d take to implement. This idea is bad because it trades a worse product for a better “business”: revenue, eyeballs, impressions, you know the drill.</p> <p>You have a choice in this moment. You can stay quiet and hope it goes away or point it out, question it, and even argue against it</p> </blockquote> <p>​</p><![CDATA[Giving Better Code Reviews]]>https://www.timbroder.com/2016/02/giving-better-code-reviewshttps://www.timbroder.com/2016/02/giving-better-code-reviewsMon, 01 Feb 2016 19:08:00 GMT<p>Great read. I would have ended up quoting most of it. Enjoy</p> <blockquote> <p>Your team is only as good as your weakest reviewer.</p> </blockquote> <p>​</p> <blockquote> <p>Trust no one</p> </blockquote> <p>​</p> <blockquote> <p>Giving a valuable code review requires that pull requests are small (&#x3C;200 lines as a rough gauge)</p> </blockquote> <p>​</p><![CDATA[Testing UIViewController Transitions with Quick and Swift]]>https://www.timbroder.com/2016/01/testing-uiviewcontroller-transitionshttps://www.timbroder.com/2016/01/testing-uiviewcontroller-transitionsSun, 31 Jan 2016 14:57:00 GMT<p><em>The examples below are using the <a href="https://github.com/Quick/Quick" title="Quick">Quick</a> test framework, but the principals we're going to talk about can be used in any setup.</em></p> <p>We have some complicated logic further down our user registration flow. I want to make sure that the right UIViewControllers are appearing when they are supposed to. I've been reading a <a href="http://swiftandpainless.com/testing-if-a-view-controller-got-pushed/" title="few">few</a> <a href="https://www.natashatherobot.com/ios-testing-view-controllers-swift/" title="different">different</a> <a href="http://www.iosmike.com/2014/08/unit-testing-viewcontrollers-in-swift.html" title="approaches">approaches</a> on how to handle this. Below is where I've ended up, and I'm pretty happy with it.</p> <p>For simplicity's sake, I'm going to show how to test if the user has tapped "Login" or "Register" on our opening screen. We can assume we have a LoadingViewController which represents the first screen. On this screens are two buttons, which correspond to these actions:</p> <div class="gatsby-highlight" data-language="swift"><pre style="counter-reset: linenumber NaN" class="language-swift line-numbers"><code class="language-swift"><span class="token attribute atrule">@IBAction</span> <span class="token keyword">func</span> <span class="token function-definition function">tapLogin</span><span class="token punctuation">(</span>sender<span class="token punctuation">:</span> <span class="token class-name">AnyObject</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">self</span><span class="token punctuation">.</span>navigationController<span class="token operator">?</span><span class="token punctuation">.</span><span class="token function">pushViewController</span><span class="token punctuation">(</span><span class="token keyword">self</span><span class="token punctuation">.</span>storyboard<span class="token operator">?</span><span class="token punctuation">.</span><span class="token function">instantiateViewControllerWithIdentifier</span><span class="token punctuation">(</span><span class="token string-literal"><span class="token string">"loginview"</span></span><span class="token punctuation">)</span> <span class="token keyword">as</span><span class="token operator">!</span> <span class="token class-name">LoginViewController</span><span class="token punctuation">,</span> animated<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token attribute atrule">@IBAction</span> <span class="token keyword">func</span> <span class="token function-definition function">tapRegister</span><span class="token punctuation">(</span>sender<span class="token punctuation">:</span> <span class="token class-name">AnyObject</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">self</span><span class="token punctuation">.</span>navigationController<span class="token operator">?</span><span class="token punctuation">.</span><span class="token function">pushViewController</span><span class="token punctuation">(</span><span class="token keyword">self</span><span class="token punctuation">.</span>storyboard<span class="token operator">?</span><span class="token punctuation">.</span><span class="token function">instantiateViewControllerWithIdentifier</span><span class="token punctuation">(</span><span class="token string-literal"><span class="token string">"registerview"</span></span><span class="token punctuation">)</span> <span class="token keyword">as</span><span class="token operator">!</span> <span class="token class-name">RegisterViewController</span><span class="token punctuation">,</span> animated<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">)</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>We also have a UINavigationController taking care of the view hierarchy. I also want to use the transitions and IDs already set up in the Storyboard.</p> <p>Let's start by referencing the UINavigationController and the UIViewController we're going to start with.</p> <div class="gatsby-highlight" data-language="swift"><pre style="counter-reset: linenumber NaN" class="language-swift line-numbers"><code class="language-swift"><span class="token keyword">class</span> <span class="token class-name">LandingScreenUITests</span><span class="token punctuation">:</span> <span class="token class-name">QuickSpec</span> <span class="token punctuation">{</span> <span class="token keyword">override</span> <span class="token keyword">func</span> <span class="token function-definition function">spec</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string-literal"><span class="token string">"Landing Screen"</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> viewController<span class="token punctuation">:</span> <span class="token class-name">LoadingViewController</span><span class="token operator">!</span> <span class="token keyword">var</span> navigationController<span class="token punctuation">:</span> <span class="token class-name">UINavigationController</span><span class="token operator">!</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Next, we're going to instantiate the storyboard, both controllers, and push the VC onto the view hierarchy</p> <div class="gatsby-highlight" data-language="swift"><pre style="counter-reset: linenumber NaN" class="language-swift line-numbers"><code class="language-swift">beforeEach <span class="token punctuation">{</span> <span class="token keyword">let</span> storyboard <span class="token operator">=</span> <span class="token class-name">UIStoryboard</span><span class="token punctuation">(</span>name<span class="token punctuation">:</span> <span class="token string-literal"><span class="token string">"Main"</span></span><span class="token punctuation">,</span> bundle<span class="token punctuation">:</span> <span class="token class-name">NSBundle</span><span class="token punctuation">(</span>forClass<span class="token punctuation">:</span> <span class="token keyword">self</span><span class="token punctuation">.</span>dynamicType<span class="token punctuation">)</span><span class="token punctuation">)</span> viewController <span class="token operator">=</span> storyboard<span class="token punctuation">.</span><span class="token function">instantiateViewControllerWithIdentifier</span><span class="token punctuation">(</span><span class="token string-literal"><span class="token string">"loadingview"</span></span><span class="token punctuation">)</span> <span class="token keyword">as</span><span class="token operator">!</span> <span class="token class-name">LoadingViewController</span> navigationController <span class="token operator">=</span> storyboard<span class="token punctuation">.</span><span class="token function">instantiateViewControllerWithIdentifier</span><span class="token punctuation">(</span><span class="token string-literal"><span class="token string">"navigationcontroller"</span></span><span class="token punctuation">)</span> <span class="token keyword">as</span><span class="token operator">!</span> <span class="token class-name">UINavigationController</span> navigationController<span class="token punctuation">.</span><span class="token function">pushViewController</span><span class="token punctuation">(</span>viewController<span class="token punctuation">,</span> animated<span class="token punctuation">:</span> <span class="token boolean">false</span><span class="token punctuation">)</span> <span class="token keyword">let</span> <span class="token omit keyword">_</span> <span class="token operator">=</span> viewController<span class="token punctuation">.</span>view <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Two gotchas to watch out for here:</p> <ol> <li>Make sure Main.Storyboard is available in your Test target</li> <li>Make sure to use the <code class="language-text">self.dynamicType</code> bundle above</li> </ol> <p>Missing either of these may result in a weird casting error:</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">Could not cast value of type 'MyApp.LoadingViewController' (0x10b9f5e50) to MyAppUITests.LoadingViewController' (0x11f894370).</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <p>Finally, lets call the appropriate methods on our initial UIViewController, and test the type of the UIViewController that has been put on the top of the hierarchy. <em>Note: I use <code class="language-text">toEventually</code> here to wait for the transition animation</em></p> <div class="gatsby-highlight" data-language="swift"><pre style="counter-reset: linenumber NaN" class="language-swift line-numbers"><code class="language-swift"><span class="token function">describe</span><span class="token punctuation">(</span><span class="token string-literal"><span class="token string">"User wants to log in"</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">it</span><span class="token punctuation">(</span><span class="token string-literal"><span class="token string">"taps Login"</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span> viewController<span class="token punctuation">.</span><span class="token function">tapLogin</span><span class="token punctuation">(</span><span class="token keyword">self</span><span class="token punctuation">)</span> <span class="token function">expect</span><span class="token punctuation">(</span>navigationController<span class="token punctuation">.</span>visibleViewController<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toEventually</span><span class="token punctuation">(</span><span class="token function">beAKindOf</span><span class="token punctuation">(</span><span class="token class-name">LoginViewController</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string-literal"><span class="token string">"User wants to register"</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">it</span><span class="token punctuation">(</span><span class="token string-literal"><span class="token string">"taps Register"</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span> viewController<span class="token punctuation">.</span><span class="token function">tapRegister</span><span class="token punctuation">(</span><span class="token keyword">self</span><span class="token punctuation">)</span> <span class="token function">expect</span><span class="token punctuation">(</span>navigationController<span class="token punctuation">.</span>visibleViewController<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toEventually</span><span class="token punctuation">(</span><span class="token function">beAKindOf</span><span class="token punctuation">(</span><span class="token class-name">RegisterViewController</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>For reference, here is the whole test class together:</p> <div class="gatsby-highlight" data-language="swift"><pre style="counter-reset: linenumber NaN" class="language-swift line-numbers"><code class="language-swift"><span class="token keyword">import</span> <span class="token class-name">Foundation</span> <span class="token keyword">import</span> <span class="token class-name">Quick</span> <span class="token keyword">import</span> <span class="token class-name">Nimble</span> <span class="token attribute atrule">@testable</span> <span class="token keyword">import</span> <span class="token class-name">MyApp</span> <span class="token keyword">class</span> <span class="token class-name">LandingScreenUITests</span><span class="token punctuation">:</span> <span class="token class-name">QuickSpec</span> <span class="token punctuation">{</span> <span class="token keyword">override</span> <span class="token keyword">func</span> <span class="token function-definition function">spec</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string-literal"><span class="token string">"Landing Screen"</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> viewController<span class="token punctuation">:</span> <span class="token class-name">LoadingViewController</span><span class="token operator">!</span> <span class="token keyword">var</span> navigationController<span class="token punctuation">:</span> <span class="token class-name">UINavigationController</span><span class="token operator">!</span> beforeEach <span class="token punctuation">{</span> <span class="token keyword">let</span> storyboard <span class="token operator">=</span> <span class="token class-name">UIStoryboard</span><span class="token punctuation">(</span>name<span class="token punctuation">:</span> <span class="token string-literal"><span class="token string">"Main"</span></span><span class="token punctuation">,</span> bundle<span class="token punctuation">:</span> <span class="token class-name">NSBundle</span><span class="token punctuation">(</span>forClass<span class="token punctuation">:</span> <span class="token keyword">self</span><span class="token punctuation">.</span>dynamicType<span class="token punctuation">)</span><span class="token punctuation">)</span> viewController <span class="token operator">=</span> storyboard<span class="token punctuation">.</span><span class="token function">instantiateViewControllerWithIdentifier</span><span class="token punctuation">(</span><span class="token string-literal"><span class="token string">"loadingview"</span></span><span class="token punctuation">)</span> <span class="token keyword">as</span><span class="token operator">!</span> <span class="token class-name">LoadingViewController</span> navigationController <span class="token operator">=</span> storyboard<span class="token punctuation">.</span><span class="token function">instantiateViewControllerWithIdentifier</span><span class="token punctuation">(</span><span class="token string-literal"><span class="token string">"navigationcontroller"</span></span><span class="token punctuation">)</span> <span class="token keyword">as</span><span class="token operator">!</span> <span class="token class-name">UINavigationController</span> navigationController<span class="token punctuation">.</span><span class="token function">pushViewController</span><span class="token punctuation">(</span>viewController<span class="token punctuation">,</span> animated<span class="token punctuation">:</span> <span class="token boolean">false</span><span class="token punctuation">)</span> <span class="token keyword">let</span> <span class="token omit keyword">_</span> <span class="token operator">=</span> viewController<span class="token punctuation">.</span>view <span class="token punctuation">}</span> <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string-literal"><span class="token string">"User wants to log in"</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">it</span><span class="token punctuation">(</span><span class="token string-literal"><span class="token string">"taps Login"</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span> viewController<span class="token punctuation">.</span><span class="token function">tapLogin</span><span class="token punctuation">(</span><span class="token keyword">self</span><span class="token punctuation">)</span> <span class="token function">expect</span><span class="token punctuation">(</span>navigationController<span class="token punctuation">.</span>visibleViewController<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toEventually</span><span class="token punctuation">(</span><span class="token function">beAKindOf</span><span class="token punctuation">(</span><span class="token class-name">LoginViewController</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string-literal"><span class="token string">"User wants to register"</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">it</span><span class="token punctuation">(</span><span class="token string-literal"><span class="token string">"taps Register"</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span> viewController<span class="token punctuation">.</span><span class="token function">tapRegister</span><span class="token punctuation">(</span><span class="token keyword">self</span><span class="token punctuation">)</span> <span class="token function">expect</span><span class="token punctuation">(</span>navigationController<span class="token punctuation">.</span>visibleViewController<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toEventually</span><span class="token punctuation">(</span><span class="token function">beAKindOf</span><span class="token punctuation">(</span><span class="token class-name">RegisterViewController</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p><em>Many thanks to the blog posts referenced at the top of this post</em></p><![CDATA[Tektok Podcast - Ep023 - Overly Connected]]>https://www.timbroder.com/2016/01/tektok-podcast---ep023---overly-connectedhttps://www.timbroder.com/2016/01/tektok-podcast---ep023---overly-connectedThu, 28 Jan 2016 15:21:00 GMT<p>I had the pleasure of joining the Tektok podcast this week</p> <blockquote> <p>Episode #: 23</p> <p>Date: 01/25/16</p> <p>Hosts: Brian Feldhaus,Timothy Broder &#x26; Clay Russell</p> <p>TEK Topics</p> <p>Brian: Android in more places. How do you feel about this??</p> <p>JetBlue entertainment system, Clover payments, etc.</p> <p>Tim: Communication: we are way past email and texting with slack, hangouts, Facebook groups, basecamp, hip chat, etc.</p> <p>What is everyone using to communicate at home and at work?</p> <p>Clay: Getting to Know our Panelists:</p> <p>Name one app, movie, TV show, book and album that best define who you are.</p> <p>Sweet &#x26; Sour TEK</p> <p>Tim: <a href="https://geo.itunes.apple.com/us/app/nuzzel-news-from-friends-influencers/id692285770?mt=8&#x26;at=11laRZ&#x26;ct=afp15" title="Nuzzle">Nuzzle</a> for iOS</p> <p>Clay: <a href="https://geo.itunes.apple.com/app/id1045605097?at=11laRZ&#x26;ct=afp15" title="Interact">Interact</a> for iOS (Universal $4.99)</p> </blockquote> <p>​</p><![CDATA[The Wertzone: A History Of Epic Fantasy - Part 1]]>https://www.timbroder.com/2016/01/the-wertzone:-a-history-of-epic-fantasy---part-1https://www.timbroder.com/2016/01/the-wertzone:-a-history-of-epic-fantasy---part-1Sun, 10 Jan 2016 20:57:00 GMT<blockquote> <p>Rather than simply throw up my own list (although I may put together a Gratuitous List of such in the coming weeks), I thought it might be more interesting to look at epic fantasy, or at least the modern interpretation of the subgenre, through a chronological perspective. This has the benefit of allowing works to be listed without too much regard for whether they're any "good" or not, but more by their importance in the development of the field.</p> </blockquote> <p>I'm only about 1/4 way through reading this blog series but it's very well written, I'm learning new things, and adding PLENTY to my goodreads list.</p> <p>Highly recommend if you are a fan of the genre</p><![CDATA[5 Reasons Why You Should Build A Small Business — Not A Start-Up]]>https://www.timbroder.com/2015/12/5-reasons-why-you-should-build-a-small-business-—-not-a-start-up-—-life-learninghttps://www.timbroder.com/2015/12/5-reasons-why-you-should-build-a-small-business-—-not-a-start-up-—-life-learningSat, 26 Dec 2015 10:24:00 GMT<blockquote> <p>The question we ask, whenever we hear about a new business or idea, whether it’s renewable energy or a messaging app or a fucking hamster sled, is this:</p> <p>Will it scale?</p> </blockquote> <p>​</p> <blockquote> <p>You Can Focus On Simplicity</p> </blockquote> <p>​</p> <blockquote> <p>People Matter More</p> </blockquote> <p>​</p><![CDATA[Vagrant 1.8 is out! Linked clones, snapshots, port, ansible and more!]]>https://www.timbroder.com/2015/12/vagrant-1.8---hashicorphttps://www.timbroder.com/2015/12/vagrant-1.8---hashicorpMon, 21 Dec 2015 18:59:00 GMT<p>Vagrant 1.8 is out and it's a huge update. My 3 favorite features are below. Click through above for the full list</p> <blockquote> <p>Snapshots are a feature of hypervisors that allow the point-in-time state of a virtual machine to be saved and restored</p> </blockquote> <p>This is awesome. No more copy disks around or worrying you forgot to back up the DB or git stash!</p> <blockquote> <p>New command: port - This will display a list of forwarded ports to the guest machine. This is especially useful if Vagrant is auto-correcting ports in the case of collisions.</p> </blockquote> <p>​</p> <blockquote> <p>New provisioner: ansible_local - This executes Ansible on the guest machine rather than on the host machine.</p> </blockquote> <p>​</p><![CDATA[Installing Vagrant and other Hashicorp products using brew cask on OSX]]>https://www.timbroder.com/2015/12/install-hashicorp-through-homebrew-caskhttps://www.timbroder.com/2015/12/install-hashicorp-through-homebrew-caskFri, 18 Dec 2015 19:12:00 GMT<p>Came accross <a href="https://github.com/hashicorp/otto/issues/121" title="this">this</a> awesome gem today while setting up a new laptop</p> <div class="gatsby-highlight" data-language="bash"><pre style="counter-reset: linenumber NaN" class="language-bash line-numbers"><code class="language-bash">➜ ~ vagrant zsh: <span class="token builtin class-name">command</span> not found: vagrant ➜ ~ brew cask <span class="token function">install</span> vagrant <span class="token operator">==</span><span class="token operator">></span> Downloading https://releases.hashicorp.com/vagrant/1.7.4/vagrant_1.7.4.dmg Already downloaded: /Library/Caches/Homebrew/vagrant-1.7.4.dmg <span class="token operator">==</span><span class="token operator">></span> Running installer <span class="token keyword">for</span> vagrant<span class="token punctuation">;</span> your password may be necessary. <span class="token operator">==</span><span class="token operator">></span> Package installers may <span class="token function">write</span> to any location<span class="token punctuation">;</span> options such as <span class="token parameter variable">--appdir</span> are ignored. <span class="token operator">==</span><span class="token operator">></span> installer: Package name is Vagrant <span class="token operator">==</span><span class="token operator">></span> installer: Installing at base path / <span class="token operator">==</span><span class="token operator">></span> installer: The <span class="token function">install</span> was successful. 🍺 vagrant staged at <span class="token string">'/opt/homebrew-cask/Caskroom/vagrant/1.7.4'</span> <span class="token punctuation">(</span><span class="token number">6</span> files, 82M<span class="token punctuation">)</span> ➜ ~ vagrant Usage: vagrant <span class="token punctuation">[</span>options<span class="token punctuation">]</span> <span class="token operator">&lt;</span>command<span class="token operator">></span> <span class="token punctuation">[</span><span class="token operator">&lt;</span>args<span class="token operator">></span><span class="token punctuation">]</span> -v, <span class="token parameter variable">--version</span> Print the version and exit. -h, <span class="token parameter variable">--help</span> Print this help. Common commands: box manages boxes: installation, removal, etc. connect connect to a remotely shared Vagrant environment destroy stops and deletes all traces of the vagrant machine global-status outputs status Vagrant environments <span class="token keyword">for</span> this user <span class="token function">halt</span> stops the vagrant machine <span class="token builtin class-name">help</span> shows the <span class="token builtin class-name">help</span> <span class="token keyword">for</span> a subcommand init initializes a new Vagrant environment by creating a Vagrantfile login log <span class="token keyword">in</span> to HashiCorp's Atlas package packages a running vagrant environment into a box plugin manages plugins: install, uninstall, update, etc. provision provisions the vagrant machine push deploys code <span class="token keyword">in</span> this environment to a configured destination rdp connects to machine via RDP reload restarts vagrant machine, loads new Vagrantfile configuration resume resume a suspended vagrant machine share share your Vagrant environment with anyone <span class="token keyword">in</span> the world <span class="token function">ssh</span> connects to machine via SSH ssh-config outputs OpenSSH valid configuration to connect to the machine status outputs status of the vagrant machine <span class="token function">suspend</span> suspends the machine up starts and provisions the vagrant environment version prints current and latest Vagrant version For <span class="token builtin class-name">help</span> on any individual <span class="token builtin class-name">command</span> run <span class="token variable"><span class="token variable">`</span>vagrant COMMAND <span class="token parameter variable">-h</span><span class="token variable">`</span></span> Additional subcommands are available, but are either <span class="token function">more</span> advanced or not commonly used. To see all subcommands, run the <span class="token builtin class-name">command</span> <span class="token variable"><span class="token variable">`</span>vagrant list-commands<span class="token variable">`</span></span><span class="token builtin class-name">.</span> ➜ ~</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[Why Quizup Turned The Fastest-Growing Game In History Into A Social Platform]]>https://www.timbroder.com/2015/12/why-quizup-turned-the-fastest-growing-game-in-history-into-a-social-platformhttps://www.timbroder.com/2015/12/why-quizup-turned-the-fastest-growing-game-in-history-into-a-social-platformFri, 18 Dec 2015 19:12:00 GMT<blockquote> <p>Being data-driven helped grow QuizUp from a hot new game that could acquire users into a social platform that could keep them around. They worked to understand how people were using their app, and what actions lead a user to be retained. Then they worked as a team to develop QuizUp’s social features and solve the second half of the growth formula. In the process, by utilizing usage data throughout the development process, they created the thing that their customers had been telling them they wanted all along.</p> </blockquote> <p>​</p><![CDATA[Show & Tell Cast - Ep014 - Star Wars Prequel Trilogy]]>https://www.timbroder.com/2015/12/show-&-tell-cast---ep014---star-wars-prequel-trilogyhttps://www.timbroder.com/2015/12/show-&-tell-cast---ep014---star-wars-prequel-trilogyFri, 11 Dec 2015 08:51:00 GMT<blockquote> <p>Star Wars: The Prequel Trilogy</p> <p>Episode I: The Phantom Menace</p> <p>Episode II: Attack of the Clones</p> <p>Episode III: Revenge of the Sith</p> </blockquote> <p>Listen in if you want to hear me intro the show as Jar Jar Binks!</p><![CDATA[Why 2Do Is My New Favorite Ios Task Manager]]>https://www.timbroder.com/2015/12/why-2do-is-my-new-favorite-ios-task-managerhttps://www.timbroder.com/2015/12/why-2do-is-my-new-favorite-ios-task-managerFri, 11 Dec 2015 08:25:00 GMT<p>Great review of 2Do by Viticci. If I wasn't already so invested in Omnifocus, this looks like it would be perfect.</p> <blockquote> <p>2Do perfectly adapts to the way I work.</p> </blockquote> <p>This is THE most critical thing when choosing a task manager. Trello still maps 100% to the way I think, but Omnifocus fits seamlessly in with the way I work</p><![CDATA[New Manager Tools]]>https://www.timbroder.com/2015/12/new-manager-toolshttps://www.timbroder.com/2015/12/new-manager-toolsWed, 09 Dec 2015 10:45:00 GMT<p><em>This article leans slightly towards Technology Management but is applicable across disciplines</em></p> <p>You've been a great senior resource, you've lead a team or a project, and you've made the decision, along with your manager to transition to some kind of management role. If you are still thinking about it, or wondering what it will be like, start here: <a href="http://firstround.com/review/this-90-day-plan-turns-engineers-into-remarkable-managers/" title="This 90-Day Plan Turns Engineers into Remarkable Managers">This 90-Day Plan Turns Engineers into Remarkable Managers</a>. This article will give you all of the thought starters your need to decide if management is something you want to pursue.</p> <p>Below are some required reading to add to your utility belt. Start taking a read through these, and make sure you block off the appropriate amount of time each week to continue your learning! This list is meant to be a starting point for new managers, not an all inclusive list of manager resources</p> <h2>Books</h2> <ul> <li><a href="http://www.amazon.com/Managing-Right-First-David-Baker/dp/1605440027?tag=nyen0e-20" title="Managing Right for the First Time">Managing Right for the First Time</a> - This book is intended as a field guide for first time managers, or for managers who want to begin doing a better job. <a href="https://www.recourses.com/" title="David Baker">David Baker</a> worked closely with 600+ companies and interviewed more than 10,000 employees, then summarized the findings in an interesting and eminently readable form. Read this book and you're likely to understand management and leadership like you never have before, but also learn very practical steps toward becoming a better manager and leader.</li> <li><a href="http://www.amazon.com/Getting-Things-Done-Stress-Free-Productivity-ebook/dp/B00KWG9M2E/ref=tmm_kin_swatch_0?qid=&#x26;sr=&#x26;tag=nyen0e-20&#x26;_encoding=UTF8" title="Getting Things Done: The Art of Stress-Free Productivity">Getting Things Done: The Art of Stress-Free Productivity</a> - <em>Note</em>: I'm not advocating for using the GTD system. Use what works for you. However, the first half of this book is a <strong>gold mine</strong> for how to think about planning, resources, and managing your own and other's tasks. I personally do use GTD, but the lessons, and the way of thinking that this book opens up is transferable to any system. It got me <strong>thinking</strong> about planning and delegating in different and exciting ways. Read the introduction and I guarantee that you'll see scenarios you recognize and want to scream <em>"YES, YES I DEAL WITH THIS. I HATE IT! HOW DO I FIX IT?"</em></li> <li><a href="http://www.amazon.com/The-Personal-MBA-Master-Business/dp/1591845572?tag=nyen0e-20" title="The Personal MBA: Master the Art of Business">The Personal MBA: Master the Art of Business</a> - This book is, but isn't about MBA. It's a toolkit of how to handle various situations and grow your skill set. It's not meant to be read cover to cover, but peruse the table of contents you'll see things you want to read.</li> <li><a href="http://www.amazon.com/Emotional-Intelligence-Project-Managers-Outstanding/dp/0814474160?tag=nyen0e-20" title="Emotional Intelligence for Project Managers: The People Skills You Need to Achieve Outstanding Results">Emotional Intelligence for Project Managers: The People Skills You Need to Achieve Outstanding Results</a> - Great book on emotional intelligence</li> </ul> <h2>Articles to read</h2> <ul> <li><a href="http://firstround.com/review/this-90-day-plan-turns-engineers-into-remarkable-managers/" title="This 90-Day Plan Turns Engineers into Remarkable Managers">This 90-Day Plan Turns Engineers into Remarkable Managers</a></li> <li><a href="https://hbr.org/1999/11/management-time-whos-got-the-monkey" title="Management Time: Who’s Got the Monkey?">Management Time: Who’s Got the Monkey?</a> - How to delegate and not be caught under a fire hose of people waiting on you</li> <li><a href="https://library.gv.com/meetings-that-don-t-suck-959b8b5df3a4#.qxdgj8nmx" title="Meetings that don’t suck">Meetings that don’t suck</a></li> <li><a href="https://hbr.org/2015/03/what-everyone-needs-to-know-about-running-productive-meetings" title="What Everyone Needs to Know About Running Productive Meetings">What Everyone Needs to Know About Running Productive Meetings</a></li> <li><a href="https://github.com/kyleboon/managing_engineers" title="Managing Engineers Reading List">Managing Engineers Reading List</a> on Github</li> <li><a href="https://hbr.org/2015/08/tough-love-performance-reviews-in-10-minutes" title="Tough Love Performance Reviews, in 10 Minutes">Tough Love Performance Reviews, in 10 Minutes</a></li> </ul> <h2>Websites to subscribe to</h2> <ul> <li><a href="https://hbr.org/" title="Harvard Business Review">Harvard Business Review</a> - I subscribe to these tags and have learned SO much: <a href="https://hbr.org/topic/coaching" title="Coaching">Coaching</a>, <a href="https://hbr.org/topic/decision-making" title="Decision Making">Decision Making</a>, <a href="https://hbr.org/topic/leadership" title="Leadership">Leadership</a>, <a href="https://hbr.org/topic/leadership" title="Leadership">Leadership</a>, <a href="https://hbr.org/topic/motivating-people?" title="Motivating People">Motivating People</a>, <a href="https://hbr.org/topic/leading-teams" title="Leading Teams">Leading Teams</a>, <a href="https://hbr.org/topic/managing-people" title="Managing People">Managing People</a>, <a href="https://hbr.org/topic/communication" title="Communication">Communication</a>, <a href="https://hbr.org/topic/managing-yourself" title="Managing Yourself">Managing Yourself</a>, <a href="https://hbr.org/topic/productivity" title="Productivity">Productivity</a>, <a href="https://hbr.org/topic/work-life-balance" title="Work-Life Balance">Work-Life Balance</a></li> <li><a href="http://softwareleadweekly.com/" title="Software Lead Weekly">Software Lead Weekly</a></li> <li><a href="http://blog.precipice.org/" title="Marc Hedlund&#x27;s Blog">Marc Hedlund's Blog</a> - This hasn't been updated in a few years, but skim the article list. Lots of good things</li> <li><a href="http://randsinrepose.com/" title="http://randsinrepose.com/">http://randsinrepose.com/</a></li> </ul> <h2>Listening</h2> <ul> <li><a href="https://www.manager-tools.com/all-podcasts?field_content_domain_tid=4" title="Manager Tools Podcast">Manager Tools Podcast</a> - A huge library of how to deal with any situation. Skim the list, there will be something in there you want to learn about. Don't forget to subscribe!</li> </ul> <p>*Thanks to <a href="https://twitter.com/mshmsh5000" title="mshmsh5000">mshmsh5000</a> and <a href="https://twitter.com/jessicalippke" title="jessicalippke">jessicalippke</a> for input If you have anything that should be on this starter list, let me know!</p><![CDATA[Omnifocus For Mac V2.4 Ready For A Push - The Omni Group]]>https://www.timbroder.com/2015/12/omnifocus-for-mac-v2.4-ready-for-a-push---the-omni-grouphttps://www.timbroder.com/2015/12/omnifocus-for-mac-v2.4-ready-for-a-push---the-omni-groupMon, 07 Dec 2015 15:42:00 GMT<blockquote> <p>Due Soon also includes a new option—“Today”—which includes only items due before midnight instead of over “the next 24 hours.”</p> </blockquote> <p>I am so happy for this. My most wanted feature. I use a hacky 8pm default time to make "due soon" be "today, sort of, even if I'm working a little late".</p> <p>Now to figure out what my new default time will be!</p> <blockquote> <p>So, over the past few months, we built our own service for Mac to match what Apple’s APN provided us on iOS.</p> </blockquote> <p>This is just impressive</p><![CDATA[Still Using Feedbin]]>https://www.timbroder.com/2015/12/still-using-feedbinhttps://www.timbroder.com/2015/12/still-using-feedbinMon, 07 Dec 2015 11:45:00 GMT<blockquote> <p>Feedbin is under continual development and every few of months there's a new feature released or small improvements made to the user-interface.</p> </blockquote> <p>I signed up for <a href="https://feedbin.com/" title="%fill:name%">Feedbin</a> and <a href="https://itunes.apple.com/us/app/feed-wrangler/id634486174?mt=8&#x26;at=11laRZ&#x26;ct=Wflw6" title="%fill:name%">Feed Weangler</a> the day they came out. I was a <em>huge</em> Google Reader junkie (and had even written add-on modules for it ). I wanted to make sure I had a great service when it finally shut down. I paid for both services for 2 years to fully try them both out.</p> <p>I've been more than happy with Feedbin. It gets regular updates, is super fast, and integrates with all of the apps I use on my phone or Mac. Feed Wrangler had the killer feature of not showing RSS items if you had already loaded them into Instapaper. I wanted this to be enough to keep using it, but unfortunately it wasn't. I love <a href="https://mobile.twitter.com/_davidsmith" title="%fill:name%">David Smith</a>, his work, and all he does for the community. But it's obvious that Feed Wrangler isn't his main focus. That's ok! But, I want a product they continually approves beyond security updates</p><![CDATA[Five Lesser-Known Features Of Php 7 | Colin O'Dell]]>https://www.timbroder.com/2015/12/five-lesser-known-features-of-php-7-|-colin-o'dellhttps://www.timbroder.com/2015/12/five-lesser-known-features-of-php-7-|-colin-o'dellFri, 04 Dec 2015 06:34:00 GMT<blockquote> <p>With the imminent release of PHP 7 on the horizon, I thought it would be cool to check out some of the lesser-known features coming with the 7.0.0 release</p> </blockquote> <p>​</p><![CDATA[Craig Federighi Talks Open Source Swift And What’S Coming In Version 3.0]]>https://www.timbroder.com/2015/12/craig-federighi-talks-open-source-swift-and-what’s-coming-in-version-3.0https://www.timbroder.com/2015/12/craig-federighi-talks-open-source-swift-and-what’s-coming-in-version-3.0Thu, 03 Dec 2015 20:31:00 GMT<p>So many good things happened with Swift and open source today.</p> <blockquote> <p>The project will be hosted on GitHub and will include the compiler, the LLDB debugger, the REPL command-line environment, the standard and core libraries, and code from supporting projects.</p> </blockquote> <p>There is a LOT over on Apple's new <a href="https://github.com/apple" title="%fill:name%">GitHub</a></p> <blockquote> <p>New to Swift (and also open source) is the Swift Package Manager</p> </blockquote> <p>​</p> <blockquote> <p>Apple engineers working on Swift will start using the GitHub repos, developing the language out in the open.</p> </blockquote> <p>​</p> <blockquote> <p>So instead of getting a big Swift 3.0 info dump at WWDC 2016 in the summer and then digging into the Xcode betas and adapting, developers can already find an “evolution document” on the Swift site that maps out where the language is headed in its next major version.</p> </blockquote> <p>​</p> <blockquote> <p>One of Apple’s goals for Swift 3.0 is source compatibility going forward so that Swift code that is written may need to be recompiled as the language continues to evolve, but it will need to be rewritten or changed less frequently or not at all.</p> </blockquote> <p>​</p> <blockquote> <p>“We’ll be supporting Objective-C and continuing to evolve it as necessary to fit into this evolving world. We do think that Swift is the language that we recommend for new developers to our platform who are investing for the future and building new apps. We think Swift is absolutely the right place to start. But we’ll continue to maintain, advance, and support Objective-C for as far as we can see</p> </blockquote> <p>​</p><![CDATA[Awesome Self Hosted]]>https://www.timbroder.com/2015/12/awesome-self-hostedhttps://www.timbroder.com/2015/12/awesome-self-hostedWed, 02 Dec 2015 09:37:00 GMT<p>Great list of self hosted OSS</p><![CDATA[First Timers Only]]>https://www.timbroder.com/2015/11/first-timers-onlyhttps://www.timbroder.com/2015/11/first-timers-onlyWed, 25 Nov 2015 15:45:00 GMT<p>A suggestion to Open Source project maintainers</p> <blockquote> <p>The hard part of getting into open source for the first time isn’t the implementation of a feature, but figuring out how to actually contribute code.</p> </blockquote> <p>Great read on setting up your open source project for success as well as making it EASY for people to make their first contribution</p><![CDATA[Top Four 5: Podcasts]]>https://www.timbroder.com/2015/11/top-four-5https://www.timbroder.com/2015/11/top-four-5Sat, 14 Nov 2015 07:42:00 GMT<blockquote> <p>Marco and Tiff rank their four favorite podcasts (right now)</p> </blockquote> <p>​This episode of Top Four was great. It did NOTHING to help the number of podcasts that I want to <a href="http://www.timbroder.com/podcasts-i-listen-to.html">listen to</a>. I already listen to a lot so adding would have to mean removing something if it was for my personal queue.</p> <p>​Luckily, it did give Laura and I some great ideas for shows to listen to together in the car. As we get closer to holiday season and start driving around the northeast, these will be a huge help:</p> <ul> <li>​<a href="http://undisclosed-podcast.com/">Undisclosed</a></li> <li><a href="http://youlooknicetoday.com/">You Look Nice Today</a></li> </ul> <p>​<a href="http://www.merlinmann.com/roderick/">Roderick on the Line</a> sounds like something I'd really enjoy. But, at 178 episodes it's too intimidating. I can only handle <a href="http://5by5.tv/b2w">one</a> "catch up" show. (Interesting that both of these involve Merlin). If I had more space/time, <a href="https://gimletmedia.com/show/reply-all/">Reply All</a> would be first up</p><![CDATA[Show & Tell - Ep013 - Star Wars Original Trilogy]]>https://www.timbroder.com/2015/11/show-&-tell---ep013---star-wars-original-trilogyhttps://www.timbroder.com/2015/11/show-&-tell---ep013---star-wars-original-trilogyTue, 10 Nov 2015 09:24:00 GMT<blockquote> <p>Star Wars: The Original Trilogy</p> </blockquote> <ul> <li>A New Hope!</li> <li>The Empire Strikes Back!</li> <li>Return of the Jedi!</li> </ul> <p>This episode was a lot of fun and has a few surprise guests</p><![CDATA[Science Says Snapchat Makes You Happy]]>https://www.timbroder.com/2015/11/science-says-snapchat-makes-you-happyhttps://www.timbroder.com/2015/11/science-says-snapchat-makes-you-happySun, 01 Nov 2015 09:23:00 GMT<blockquote> <p>The study, titled “Sharing the small moments: ephemeral social interaction on Snapchat,” concluded that Snapchat interactions are correlated with increased “social enjoyment and positive mood” compared to those on platforms like Facebook. In other words, the quick-fire moments you experience on Snapchat — which is used to share videos and photographs that disappear after a short amount of time — might make you happier than other social media.</p> </blockquote> <p>I need to get better at understanding snapchat. I feel like a dinosaur</p> <p>I seem to have the mental bandwidth for 2 social networks. For me the non-negotiable one is Twitter where I read everything. Part of this is keeping the number of people I follow to ~200 and a heavy use of mute filters. I've recently gotten better at browsing Facebook and Instagram, more to see what my friends are up to. I went through a HEAVY unfollow process on Facebook. I now probably only see 30 people in my feed compared to the hundreds of people I'm friends with.</p> <p>I do find myself chuckling when I get snaps compared to any other network so this article tracks</p><![CDATA[12 Months of the Show & Tell Podcast]]>https://www.timbroder.com/2015/10/12-months-of-a-movie-podcasthttps://www.timbroder.com/2015/10/12-months-of-a-movie-podcastSun, 25 Oct 2015 17:56:00 GMT<p>The 12th episode of <a href="http://tekside.net/show-tell/" title="Show &#x26; Tell">Show &#x26; Tell</a>, my monthly movie podcast came out recently. We've been doing it for a year, and I can't believe I've never mentioned it on this site!</p> <p>The show is hosted by <a href="https://twitter.com/samdakark" title="Samuel Strickland">Samuel Strickland</a>, accompanied by myself and <a href="https://twitter.com/rockerchick" title="Ellyn MaNamara">Ellyn MaNamara</a>. Each month, we pick a movie that we've each seen before, and bring it to the show to discuss. We chat, rate, review, and once in a while go off the rails. It has been SO much fun working with the crew on the <a href="http://tekside.net/" title="Tekside">Tekside</a> network, being part of a podcast, and leaning the ins &#x26; outs of recording and producing.</p> <p>It's been great as forced relaxation for me. I was hesitant to jump into a show with people I'd never spoken to before (we had 1 Skype call before we recorded episode 1). Immediately, recording became one of the highlights of the week (month) that I look forward to. Sam and Ellyn are a lot of fun to talk to on the air or hang out in our Slack channel. There have definitely been movies I never would have considered otherwise that I really liked. We're currently gearing up for our Star Wars spectacular and I can't wait!</p> <p>Our episodes to date (I started with Top Gun, obviously)</p> <p><a href="http://tekside.net/show-tell/2014/11/17/show-tell-cast-ep001-top-gun-fargo-captain-america-the-winter-soldier" title="Episode 1">Episode 1</a></p> <ul> <li>Top Gun</li> <li>Fargo</li> <li>Captain America: The Winter Soldier</li> </ul> <p><a href="http://tekside.net/show-tell/2014/12/24/show-tell-cast-ep002-the-girl-with-the-dragon-tattoo-the-one-i-love-a-most-wanted-man" title="Episode 2">Episode 2</a></p> <ul> <li>The Girl with the Dragon Tattoo</li> <li>The One I Love</li> <li>A Most Wanted Man</li> </ul> <p><a href="http://tekside.net/show-tell/2015/1/14/episode-3-mad-max-oldboy-snowpeircer" title="Epidode 3">Epidode 3</a></p> <ul> <li>Mad Max</li> <li>Oldboy</li> <li>Snowpiercer</li> </ul> <p><a href="http://tekside.net/show-tell/2015/2/13/show-tell-cast-ep004-calgary-the-lego-movie-nightcrawler" title="Episode 4">Episode 4</a></p> <ul> <li>Calvary</li> <li>The Lego Movie</li> <li>Nightcrawler</li> </ul> <p><a href="http://tekside.net/show-tell/2015/3/4/show-tell-cast-ep005-vampires-kiss-faceoff-the-wicker-man" title="Episode 5 (Nic Cage!!)">Episode 5 (Nic Cage!!)</a></p> <ul> <li>Vampire's Kiss</li> <li>Face-off</li> <li>The Wicker Man</li> </ul> <p><a href="http://tekside.net/show-tell/2015/4/3/episode-6" title="Episode 6">Episode 6</a></p> <ul> <li>Knocked Up</li> <li>Inglorious Bastards</li> <li>Blue Ruin</li> </ul> <p><a href="http://tekside.net/show-tell/2015/5/5/show-tell-cast-ep007-alien-empire-records-practical-magic" title="Episode 7">Episode 7</a></p> <ul> <li>Alien</li> <li>Empire Records</li> <li>Practical Magic</li> </ul> <p><a href="http://tekside.net/show-tell/2015/6/11/show-tell-cast-ep008-the-princess-bride-the-master-lost-river" title="Episode 8">Episode 8</a></p> <ul> <li>The Princess Bride</li> <li>The Master</li> <li>Lost River</li> </ul> <p><a href="http://tekside.net/show-tell/2015/7/22/show-tell-cast-ep009-inception-her-john-wick" title="Episode 9">Episode 9</a></p> <ul> <li>Inception</li> <li>Her</li> <li>John Wick</li> </ul> <p><a href="http://tekside.net/show-tell/2015/8/14/show-tell-cast-ep010-equilibrium-django-unchained-whiplash" title="Episode 10">Episode 10</a></p> <ul> <li>Inception</li> <li>Django Unchained</li> <li>Whiplash</li> </ul> <p><a href="http://tekside.net/show-tell/2015/9/2/show-tell-cast-ep011-ray-hard-candy-ex-machina" title="Episode 11">Episode 11</a></p> <ul> <li>Ray</li> <li>Hard Candy</li> <li>Ex Machina</li> </ul> <p><a href="http://tekside.net/show-tell/2015/10/13/show-tell-cast-ep012-blade-runner-the-neverending-story-8-mile" title="Episode 12">Episode 12</a></p> <ul> <li>Blade Runner</li> <li>Never-ending Story</li> <li>8 Mile</li> </ul> <p><img src="https://static1.squarespace.com/static/511f025be4b09463c75fdc0e/t/54f8d6c9e4b02dcbd8f736d1/1425594059527/1500w/sat.png" alt=""></p><![CDATA[Sending Email to Omnifocus in Airmail2]]>https://www.timbroder.com/2015/10/sending-email-to-omnifocus-in-airmail2https://www.timbroder.com/2015/10/sending-email-to-omnifocus-in-airmail2Sun, 25 Oct 2015 09:10:00 GMT<p><a href="https://itunes.apple.com/us/app/airmail-2.5/id918858936?mt=12&#x26;at=11laRZ&#x26;ct=pro" title="Airmail2">Airmail2</a> is my desktop client of choice for Gmail. It keeps the same hotkeys as the web version of gmail and has some good integrations.</p> <p>In outlook, I use <code class="language-text">^O</code> to send an email to <a href="https://itunes.apple.com/us/app/omnifocus-2/id867299399?mt=12&#x26;at=11laRZ&#x26;ct=pro" title="Omnifocus">Omnifocus</a>. That workflow also attaches the outlook email to the task for easy reference later. I wanted something similar for gmail besides just forwarding the email to Omnifocus. With that, I still had to go find the email to actually reply to it. Omnifocus integration is the single most important reason (to me) for using Airmail. Airmail will add an in-app link back to the email in Airmail in the notes section of the task.</p> <p>But, I don't like the default hotkey, I just want it to be <code class="language-text">^O</code>. To get this to work:</p> <ol> <li>Go to Settings.app > Keyboard > Shortcuts</li> <li>Add Airmail2</li> <li>Add an action with the Menu Title of: <code class="language-text">OmniFocus...</code></li> <li>Record your keyboard shortcut to be ^O</li> </ol> <p><img src="https://farm1.staticflickr.com/568/22484974791_0b2b82d3d6_o_d.png" alt=""></p><![CDATA[How to Sync Basecamp Todos to Omnifocus or Todoist]]>https://www.timbroder.com/2015/10/how-to-sync-basecamp-todos-to-omnifocus-or-todoist-https://www.timbroder.com/2015/10/how-to-sync-basecamp-todos-to-omnifocus-or-todoist-Sat, 17 Oct 2015 11:54:00 GMT<p><a href="https://basecamp.com/" title="Basecamp">Basecamp</a> is a large part of our process at Ai. It tracks most of our communication (a lot of this has been moving to <a href="https://slack.com/" title="Slack">Slack</a>). Basecamp serves as our system of record for signs-offs and deliverables. We also use it's "todo" function pretty heavily in the planning stages and tracking client tasks. Once we get into implementation, we transition to <a href="https://www.atlassian.com/software/jira" title="Jira">Jira</a>, as it's more powerful. Clients do not have access to Jira.</p> <p>I don't have an issue tracking Basecamp tasks. It's really good at emailing you when something is due. But, as I've said before, I'd be even BETTER at it, if the tasks were <a href="http://www.timbroder.com/2015/10/using-omnifocus-as-a-honey-do-app.html" title="in my world">in my world</a>. My world is <a href="https://itunes.apple.com/us/app/omnifocus-2/id867299399?mt=12&#x26;at=11laRZ&#x26;ct=pro" title="Omnifocus">Omnifocus</a>, but there is a VERY large contingent of <a href="https://itunes.apple.com/us/app/todoist-to-do-list-task-list/id585829637?mt=12&#x26;at=11laRZ&#x26;ct=pro" title="Todoist">Todoist</a> users at Ai. I am the outlier in this. In the past, my reasons for not using Todoist were I didn't want Ai tasks and personal project tasks in the same app, the hotkeys weren't up to snuff, and I didn't want to pay for premium to get notifications. I've since ignored these rules with Omnifocus; It runs everything in my life, it DOES have great hotkeys, and I dropped the $$$ for premium Omnifocus which was more expensive than Todoist premium in the long run. But, this is a topic for another post.</p> <p>Back on track. How to get Basecamp todos into my system? Again, Zapier to the rescue. Zapier can connect to Basecamp, do some basic filtering to make sure I only get tasks that I care about, and drop them into my Omnifocus inbox. Most of the following steps hold true for both Omnifocus and Todoist</p> <ol> <li> <p>Create a new Zap that triggers when a new Basecamp todo is created. Have it create a new task in your system</p> <p><img src="https://farm6.staticflickr.com/5713/22062008838_fe08637466_k_d.jpg" alt=""></p> </li> <li> <p>Select the appropriate Basecamp account and test it</p> <p><img src="https://farm6.staticflickr.com/5776/22249798545_09e03d2937_o_d.png" alt=""></p> </li> <li> <p>Select and test your Todoist/Omnifocus account</p> <p><img src="https://farm1.staticflickr.com/737/22260363271_38415f36d9_o_d.png" alt=""></p> </li> <li> <p>Choose your Basecamp Account, Project, and Todo list. If you want to filter even more by only items assigned to you, add a custom filter. Do this by either Assignee ID or Name</p> <p><img src="https://farm1.staticflickr.com/669/22063082689_9af276bb66_o_d.png" alt=""></p> </li> <li> <p>Match up the Basecamp data to your tool of choice. First is how I send it to Omnifocus. Note, I do need to populate the due date by hand. In both options, I add the url back to the task in Basecamp so I can easy mark it off or comment in it when I'm done. Todoist lets you be a LOT more granular and handles all of the fields so you have no manual intervetntion</p> <p><img src="https://farm6.staticflickr.com/5697/22062121310_feb74fe493_o_d.png" alt=""></p> <p><img src="https://farm1.staticflickr.com/734/22062436938_6ef239ce7f_o_d.png" alt=""></p> </li> <li> <p>My tasks are now in my world. Profit.</p> </li> </ol><![CDATA[Creating a Custom Podcast Feed Using Dropbox and Huffduffer]]>https://www.timbroder.com/2015/10/creating-a-custom-podcast-feed-using-dropbox-and-huffdufferhttps://www.timbroder.com/2015/10/creating-a-custom-podcast-feed-using-dropbox-and-huffdufferTue, 13 Oct 2015 18:28:00 GMT<p>I use <a href="http://apple.co/1hyKcRq" title="Overcast">Overcast</a> as my podcast client because of it's SmartSpeed feature. This feature is now 100% free with the new 2.0 <a href="http://bit.ly/1hyKfN4" title="update">update</a>. SmartSpeed has spoiled me. Before Overcast I would listen to most shows at 2x. This resulted in "chipmunk voice" which I dealt with to try to get through a few more episodes each week. Overcast let's me reduce this by speeding up playback by removing a certain % of silence.</p> <p>Sometimes I'll find other recordings, episodes, or files that I want to listen to. I don't want to see if they are already in a feed somewhere, or subscribe to a whole podcast. So, these files just sat in a dropbox folder that I'd "listen to one day". I forgot it was there. Recently, <a href="https://twitter.com/cgpgrey" title="CGPGrey">CGPGrey</a> was talking on <a href="https://www.relay.fm/cortex" title="Cortex">Cortex</a> about a similar problem (though with audio books). The result was this workflow below.</p> <p>I've been using it to create a custom podcast feed of random audio files that I throw in dropbox. I get a notification in Overcast when they are ready, and I can add them to my existing listening queue. Awesome</p> <h2>Prerequisites</h2> <ol> <li><a href="https://itunes.apple.com/us/app/dropbox/id327630330?mt=8&#x26;at=11laRZ&#x26;ct=pro" title="Dropbox">Dropbox</a> (iOS App)</li> <li><a href="https://itunes.apple.com/us/app/workflow-powerful-automation/id915249334?mt=8&#x26;at=11laRZ&#x26;ct=pro" title="Workflow">Workflow</a> (iOS App)</li> <li>Any podcast client that accepts an RSS feed. (<a href="http://apple.co/1hyKcRq" title="Overcast">Overcast</a> is 100% free)</li> <li><a href="https://huffduffer.com/" title="Huffduffer">Huffduffer</a> Account</li> <li>You have audio files in Dropbox somewhere</li> </ol> <h2>Setup</h2> <ol> <li>Setup Dropbox on iOS</li> <li>Open <a href="https://workflow.is/workflows/8e8692c8bacd4dc39c944edb18b0dea8" title="this url">this url</a> in Safari</li> <li>Tap "Get Workflow" <img src="https://farm6.staticflickr.com/5690/22099535245_93b81398fb_o_d.jpg" alt=""></li> <li>Allow Safari to open Workflow <img src="https://farm6.staticflickr.com/5711/22099516045_42ec98f0d2_o_d.png" alt=""></li> <li>Open the workflow in Workflow <img src="https://farm6.staticflickr.com/5672/22073343796_82eb407d66_o_d.jpg" alt=""></li> <li>Check to see if Workflow has access to Dropbox <img src="https://farm1.staticflickr.com/693/21911637698_f4f1c3f0d2_o_d.jpg" alt=""></li> <li>Hit Done</li> <li>Go back into the workflow and run it</li> <li>Navigate to where your audio files are in dropbox <img src="https://farm6.staticflickr.com/5767/21911561790_82249be6f8_o_d.png" alt=""></li> <li>Tap the one you want, and give it a Title <img src="https://farm1.staticflickr.com/693/22109773541_ff38564705_o_d.png" alt=""></li> <li>Go to your profile page in huffduffer and grab the RSS url for your profile</li> <li>Add this by URL in your podcast app of choice <img src="https://farm6.staticflickr.com/5658/22087276112_010ff80060_o_d.jpg" alt=""></li> <li>You are done! <img src="https://farm6.staticflickr.com/5771/22099817315_0cbdc22934_o_d.png" alt=""></li> </ol><![CDATA[A Preview Of What'S New In Basecamp 3]]>https://www.timbroder.com/2015/10/a-preview-of-what's-new-in-basecamp-3https://www.timbroder.com/2015/10/a-preview-of-what's-new-in-basecamp-3Wed, 07 Oct 2015 16:37:00 GMT<p>Basecamp 3 is <a href="https://signalvnoise.com/posts/3955-a-preview-of-whats-new-in-basecamp-3" title="coming">coming</a> and I'm exited. Below are excerpts from Basecamp's preview post on what I'm looking forward to most</p> <blockquote> <p>Basecamp won'€™t send you any emails, push notifications, or in-app notifications if it's outside your specified work hours. Live a little! Work Can Wait until you're back at work.</p> </blockquote> <blockquote> <p>group chat room for quick discussions</p> </blockquote> <p>This is cool but it came a little too late. We've been using slack for project based and individual chat. It has a dedicated app that is easy to cmd+tab to. I see campfire in the browser sitting in an unchecked tab and not being useful</p> <blockquote> <p>Show someone you care by clicking the Applause button on any message, comment, document, or answer on any automatic question. They'll get a discrete notification letting them know you appreciated what they said. This is a great way to show your support for someone’s suggestion, idea, or point of view without also sending a notification to everyone else on the project.</p> </blockquote> <blockquote> <p>e.g. What did you work on today€ or Are you blocked on anything?)</p> </blockquote> <p>Hmm, I wonder if this could be used for virtual scrum?</p> <blockquote> <p>@mentions: Psst!</p> </blockquote> <p>YES, YES, YES, A MILLION TIMES, YES</p> <blockquote> <p>They'll instantly get a notification letting them know they've been mentioned, along with a direct link right back to where you mentioned them</p> </blockquote> <blockquote> <p>If you're not in the desktop app</p> </blockquote> <p>Buhhh wait what? Ok maybe what I said about the tabs and apps above might not apply</p> <blockquote> <p>You can bookmark just about anything in Basecamp 3 so you can jump right back to it from anywhere else</p> </blockquote> <p>This will be handy. Here are always a few key threads I end up digging for. Usually long running threads about key deliverables</p> <blockquote> <p>At the bottom of every project is a timeline of all activity going back to the moment you started the project</p> </blockquote> <p>I like this if search hadn't been improved. This has a lot easier than scrolling through all the lists looking for something around a certain time</p> <blockquote> <p>So you can make a folder and put a photoshop file, a Google doc</p> </blockquote> <p>👍🏻</p> <blockquote> <p>Now you can assign to-dos to multiple people. Now you can set date ranges, not just single due dates. Now you can bulk assign multiple to-dos with a single click. Now you can select multiple to-dos and move them as a group.</p> </blockquote> <p>😭😭😭</p> <blockquote> <p>Now you can save any new message or document as a draft before you publish it</p> </blockquote> <blockquote> <p>Basecamp 3 allows you to see all the work you've assigned to other people</p> </blockquote> <p>You can sign up for an early invite <a href="http://basecamp.com/3-is-coming" title="here">here</a></p><![CDATA[Magento 2: Q&A With A Systems Architect]]>https://www.timbroder.com/2015/10/magento-2:-q&a-with-a-systems-architecthttps://www.timbroder.com/2015/10/magento-2:-q&a-with-a-systems-architectSun, 04 Oct 2015 16:55:00 GMT<blockquote> <p>Magento 2 has revamped the architecture of the platform. Many of these changes introduced tried and true design patterns into the platform. Although these design patterns are more advanced, they come with a lot of literature to describe how they should be used in practice (read up on the ‘Gang of Four’). For eCommerce managers, these fundamental changes provide their team with a more structurally sound platform to scale-up their business.</p> </blockquote> <p>​I am very excited about the direction Magento 2 has taken. It feels more thought out, more complete, and more flexible. Magento 1 feels bolted together by this point. Between composer, the new service layer, and it's component based architecture, Magento 2 requires a higher order of developer. This is a good thing. Script kiddies and SO copy/plasters will not survive or at least REALLY have to learn OOP and new architecture patterns. ​ ​Bring it on</p><![CDATA[Using Omnifocus as a Honey-Do App]]>https://www.timbroder.com/2015/10/using-omnifocus-as-a-honey-do-apphttps://www.timbroder.com/2015/10/using-omnifocus-as-a-honey-do-appThu, 01 Oct 2015 12:40:00 GMT<p>Laura and I are trying a formal Honey-Do List. We're both very task-oriented people and we really like lists. There are a lot of things I can do to help with Charlie but have to wait until I get home from work. Vice-versa, stuff I'll think of while I'm at work that Laura should take a look at on the days she's home.</p> <p>We probably should have done this a long time ago but even suggesting that one of us ditch our to-do app of choice would have been blasphemy. I switched to <a href="http://apple.co/1CHgCmI" title="Omnifocus">OmniFocus</a> this year and you'd have to pry it from my cold dead fingers. Laura really likes <a href="http://apple.co/1Vqhyo8" title="Remember The Milk">Remember The Milk</a> [RTM] but I've never cared for it. One option was just use another app just for the HoneyDo list. The front-runner would be <a href="http://apple.co/1PQawlI" title="WunderList">Wunderlist</a>. This would work.... but meh. This would mean another slot on our coveted iPhone home screens. A space we didn't want to give up. I personally would have trouble remembering to go into it. If it's not in OmniFocus, it's not in my world.</p> <p>There had to be a solution. What actually mattered? It boiled down to two things:</p> <ol> <li>The tasks entering "our world" of to-dos</li> <li>The other party being notified (or at least aware) that a task had been completed (or is still outstanding)</li> </ol> <p>Neither OmniFocus or RTM have the ability to do 2-way sync. But, they CAN take in tasks through email addresses. Ok, there is a way for tasks to get into our respective worlds from somewhere else. Check.</p> <p>The next step was to have something be the single point of entry for tasks. This entry point would also serve as the aggregate list of both our worlds. Wunderlist and Todoist both have great API's, there had to be something. There was also a good chance that <a href="https://ifttt.com/" title="IFTTT">IFTTT</a> or <a href="https://zapier.com" title="Zapier">Zapier</a> could connect to everything. IFTTT was a bust, but Zapier hooked us up. I went with Wunderlist because Todoist's notifications are a premium only feature. We're not sure if we'll actually use the notifications, but I didn't feel like switching if we decided to in the future. Wunderlist could also handle shared lists, asignees, and due dates.</p> <p>How to set it up:</p> <ol> <li> <p>Choose a trigger and action</p> <p>When this happens: Wunderlist; New Task</p> <p>Do this: OmniFocus; Create Task</p> <p><img src="https://farm1.staticflickr.com/719/21681067339_db906f98a5_o_d.png" alt=""></p> </li> <li> <p>Make sure your Wunderlist and Omnifocus accounts are set up</p> <p><img src="https://farm6.staticflickr.com/5809/21679942520_236c324ea8_o_d.png" alt=""></p> </li> <li> <p>Create a shared list in Wunderlist and add someone to it</p> <p><img src="https://farm1.staticflickr.com/709/21680180338_e6cc122036_o_d.png" alt=""></p> </li> <li> <p>Tell Zapier to only trigger on the list you just created. (We'll add advanced filtering later)</p> <p><img src="https://farm6.staticflickr.com/5691/21680197978_0b416d2374_o_d.png" alt=""></p> </li> <li> <p>Create the OmniFocus task. I put "BroderFam" in front so I know where it came from, the name of the task, and the due date. (I manually set the due date when I process my OmniFocus inbox)</p> <p>In the body, I set urls back to Wunderlist so I can mark the item as done in there as well as in Omnifocus. The first URL is for when I'm on my laptop and want to open the Wunderlist website. The 2nd one is a deep link to the iOS app for when I'm on my phone</p> <p>Keep note of the assignee ID on the first task that comes in, you'll want it for advanced filtering</p> <p><img src="https://farm1.staticflickr.com/590/21245318674_4fbd5a2429_o_d.png" alt=""></p> </li> <li> <p>Test the Zap and turn it on. Now, any task that goes into your list will go to OmniFocus. But, we don't want that. We only want the ones that are assigned to me.</p> <p>Now that you have the assigneeID from the first task, go back into the Zap and add a custom filter</p> <p><img src="https://farm6.staticflickr.com/5658/21841976776_1f20a8cf24_o_d.png" alt=""></p> <p>Also go back in and remove AssigneeID from the body of the task</p> </li> </ol> <p>So, a little bit of double work when marking things as read. But I'm really happy with this system. Let me know in the comments if you have any trouble setting this up and I'll help</p><![CDATA[Workflow 1.3 Brings Powerful Widget, Sync, Health Actions, And More]]>https://www.timbroder.com/2015/09/workflow-1.3-brings-powerful-widget,-sync,-health-actions,-and-morehttps://www.timbroder.com/2015/09/workflow-1.3-brings-powerful-widget,-sync,-health-actions,-and-moreSun, 20 Sep 2015 10:17:00 GMT<blockquote> <p>I’m even more excited about the ability to read and automate Health data in Workflow and combine the results with actions, custom UIs, and other iOS apps.</p> <p>With a new Find Health Samples action, you can read any Health category where samples match filters that include dates, source, name, and value; this allows you to, say, fetch steps for the last month, calories logged by a specific app, or heart rate from your Apple Watch. Each unit can be grouped, sorted, and limited; once fetched from Health, you can also get additional details of a sample.</p> </blockquote> <p>This is cool. I've been meaning to export all of the health data I've been collecting into a few spreadsheets and start picking through it. It's nice to know that there are a number of options available through Workflow to muck with this data</p><![CDATA[Adobe Aims To Bring Photoshop To Mobile Masses With Upcoming App - Cnet]]>https://www.timbroder.com/2015/09/adobe-aims-to-bring-photoshop-to-mobile-masses-with-upcoming-app---cnethttps://www.timbroder.com/2015/09/adobe-aims-to-bring-photoshop-to-mobile-masses-with-upcoming-app---cnetSun, 20 Sep 2015 09:32:00 GMT<blockquote> <p>Photoshop is so well known that the product name is synonymous with photo editing. But the software itself is a success only on personal computers, not smartphones or tablets.</p> <p>Photoshop's maker, Adobe Systems, hopes that will change in October at its Max conference for developers and creative professionals when it introduces a new Photoshop app for editing photos on Apple's iPhones and iPads initially and Android-powered devices later. The free software, called only Project Rigel for now, is designed to bring a more accessible interface to what can be a dauntingly complex program on PCs.</p> </blockquote> <p>Click through for full details</p><![CDATA[Threes’ Free Version Doubles Developers’ Profits]]>https://www.timbroder.com/2015/09/threes’-free-version-doubles-developers’-profitshttps://www.timbroder.com/2015/09/threes’-free-version-doubles-developers’-profitsSat, 19 Sep 2015 15:31:00 GMT<blockquote> <p>The free version of popular puzzle game Threes has doubled its developers’ profits, as reported by Eurogamer and as Threes developer Asher Vollmer shared in a series of tweets</p> </blockquote> <p>​</p><![CDATA[Spotify'S Latest Trick Is A Personalized Weekly Playlist Of Deep Cuts]]>https://www.timbroder.com/2015/09/spotify's-latest-trick-is-a-personalized-weekly-playlist-of-deep-cutshttps://www.timbroder.com/2015/09/spotify's-latest-trick-is-a-personalized-weekly-playlist-of-deep-cutsSat, 19 Sep 2015 12:52:00 GMT<blockquote> <p>Spotify says the Discover Weekly playlist is built based on the music that you listen to in addition to what other, similar users have been listening to. It’s designed to surface the lesser-known tracks and deep cuts, as opposed to just being a playlist of the most popular songs out right now. It’s available at the top of each user’s Playlist folder.</p> </blockquote> <p>I'm very, very excited about this. That was one feature I thought Apple Music did well. But, I still love my Spotify. Prior to this, the weekly "for you" emails that I got from Spotify were spot on. So happy this is now built right into the app!</p><![CDATA[Uie Article: Themes - A Small Change To Product Roadmaps With Large Effects]]>https://www.timbroder.com/2015/09/uie-article:-themes---a-small-change-to-product-roadmaps-with-large-effectshttps://www.timbroder.com/2015/09/uie-article:-themes---a-small-change-to-product-roadmaps-with-large-effectsThu, 17 Sep 2015 08:33:00 GMT<blockquote> <p>Themes are a Promise to Solve Problems, Not Build Features</p> </blockquote> <p>​</p><![CDATA[The Best Place to Order Baby Supplies Online, In Bulk]]>https://www.timbroder.com/2015/09/ordering-baby-supplies-online-in-bulkhttps://www.timbroder.com/2015/09/ordering-baby-supplies-online-in-bulkSun, 13 Sep 2015 16:07:00 GMT<p>We live in an age were BJ's and Costco are no longer the only game in town to get bulk supplies. Many websites are offering very competitive prices to the giant warehouse wholesale clubs. <em>(Thank goodness, those places stress me out).</em> We knew when we had Charlie that joining one of these clubs was probably going to happen.</p> <p>For a while now, I've been seeing subway ads for sites that are going head to head with BJ's and Costco, but with free shipping and without the yearly membership fee. We've been using <a href="http://amzn.to/1KgCanf" title="Amazon Prime">Amazon Prime</a> forever and have always loved it. Very rarely has a package not shown up on time or damaged. We get most of our household items from their <a href="http://amzn.to/1KgCdPY" title="Subscribe &#x26; Save">Subscribe &#x26; Save</a> program. On some months this lands us 15% off Amazon's already low prices.</p> <p>I knew there would be a good chance we'd stick with Amazon, but I wanted to check out the other contenders; <a href="http://amzn.to/1KgCYbY" title="Amazon Mom">Amazon Mom</a>, <a href="https://www.boxed.com/" title="Boxed.com">Boxed.com</a>, <a href="http://www.diapers.com/" title="Diapers.com">Diapers.com</a>, and <a href="https://jet.com/" title="Jet.com">Jet.com</a>. My test products were:</p> <ul> <li><a href="http://amzn.to/1KgCBhs" title="Pampers Swaddlers Diapers Size 1 Economy Pack Plus 216 Count">Pampers Swaddlers Diapers Size 1 Economy Pack Plus - 216 Count</a></li> <li><a href="http://amzn.to/1EWiSb0" title="Pampers Sensitive Wipes 13x Multipack, 808 Count">Pampers Sensitive Wipes - 808 Count</a></li> </ul> <p>I had high hopes for either Boxed.com who really tout their competitive prices and free shipping over $50. I have a few friends who swore by Diapers.com for their kids. Jet.com was a new player, and technically did have the lowest overall price. But, they have a secret formula that they apply to your cart which lowers the price. I really didn't like not knowing how that worked of if it would change month to month.</p> <p><img src="https://farm6.staticflickr.com/5759/21204183788_3cc3122ec0_o_d.png" alt=""></p> <p>In the end, Amazon won out. We get our usual 15% off Subscribe &#x26; Save the months we receive 5+ items (you play with it and game it a little) Diapers always get 20% off. If you find yourself running low, just hit the "I need it now" button and you will get your next shipment early. Bonus points: We also have an Amazon Credit Card (that is only used at Amazon) for an additional 1-3% cash back. We let this charge up and then every few years buy something nice with it. It's how we got our <a href="http://amzn.to/1KgDOWb" title="Sonos Playbar">Sonos Playbar</a>.</p> <p>If you are interested in the spreadsheet above, it can be found <a href="http://bit.ly/1KgDzdJ" title="here">here</a></p><![CDATA[Apiary Releases ‘World'S First’ Automated Api Ci Testing Service - The New Stack]]>https://www.timbroder.com/2015/08/apiary-releases-‘world's-first’-automated-api-ci-testing-service---the-new-stackhttps://www.timbroder.com/2015/08/apiary-releases-‘world's-first’-automated-api-ci-testing-service---the-new-stackSat, 22 Aug 2015 10:45:00 GMT<blockquote> <p>Industrial API Model</p> <p>This reflects Tung’s model which found that in the enterprise, API maturity often begins with an individual use case for an application or workflow which leads to the creation of a specific API within that use case department. But then, over the next six months or so, other parts of the enterprise take similar approaches to pilot projects quickly leading to a chaotic catalog of APIs that have been use-case built without a long term, industrial mindset for the agency’s broader needs. Accenture’s Industrial API model suggests that after the first couple of use cases demonstrate the power and efficacy of APIs, that future design be built using internal standards so that there is common nomenclature and endpoint descriptions for APIs, and that opening data sources and functionality via API is thought of in terms of wider potential uses rather than just a single use case.</p> </blockquote> <p>We see this time and time again with our large enterprise clients. They either have one of two things. Hundreds of smaller APIs and services, with heavy overlap of functionality. "If you need this type of data, hit endpoint X, but if you need this one other enrichment field, hit this other endpoint. But that one isn't updated as frequently, so you really need to hit both, and do a merge or something on your end". There were a number of small teams, who needed data or a process, but didn't want to get tied up in a larger department initiative, and be tied to another teams timeline. So, they built their own to very specific use cases</p> <p>The other case we see a lot, is a large company trying to unify all of their APIs and data, but going about it in the wrong way. They are tying all the systems to a large initiate and building a god system. A project like this usually spans years, and by the time you get to the end of it, the earlier changes are already out of date.</p> <p>Part of the work we do with clients like this is to get the teams to agree on a unified API language first, then start converting different systems one by one. As we identify overlap, we will role those systems together. That transformation or merging should be transparent to anything consuming from those systems.</p> <p>We do this for a number of reasons. First and foremost is so we can get user facing changed out faster. Get the new site, or tool public so we can begin testing it against real users. Then, if we need to make UI changes, we aren't locked down to a back office system. That is all behind an API that we helped define, and can assume won't change for a while. We can iterate faster, while the back office systems continue on their slower timelines</p><![CDATA[The Drupal 8 Admin Menu Needs a Fix]]>https://www.timbroder.com/2015/08/drupal-8-admin-menu-needs-a-fixhttps://www.timbroder.com/2015/08/drupal-8-admin-menu-needs-a-fixFri, 21 Aug 2015 17:07:00 GMT<blockquote> <p>I initially wanted to lead with something like “The Drupal 8 Admin Menu Sucks,” but I remember repeated corrections by one my engineering professors that things don’t suck only blow inwardly.</p> </blockquote> <p>​</p> <blockquote> <p>I pulled in the WordPress top and left admin menus to a Drupal 8 module and named it WordPress Menu.</p> </blockquote> <p>Nice. Check it out <a href="https://github.com/ndevrinc/wpmenu">here</a></p><![CDATA[How Relay Fm Proves That Podcasts Aren’T An Overnight Success]]>https://www.timbroder.com/2015/08/how-relay-fm-proves-that-podcasts-aren’t-an-overnight-successhttps://www.timbroder.com/2015/08/how-relay-fm-proves-that-podcasts-aren’t-an-overnight-successFri, 21 Aug 2015 06:29:00 GMT<blockquote> <p>Just a year later, Relay FM features 16 different shows and delivers 1.5 million episodes every month.</p> </blockquote> <p>A huge congrats to Myke and Stephen. I listen to a lot of the shows on Relay and couldn't be more impressed or happier with the content the network puts out</p> <blockquote> <p>While the number of shows has tripled during Relay FM’s first year, monthly revenue has quadrupled over the same period.</p> </blockquote> <p>​</p><![CDATA[Just keep showing up]]>https://www.timbroder.com/2015/08/keep-on-showing-uphttps://www.timbroder.com/2015/08/keep-on-showing-upThu, 20 Aug 2015 10:22:00 GMT<blockquote> <p>Just keep showing up</p> </blockquote> <p>Very inspiring article by my friend, <a href="http://twitter.com/jessicalippke">Jess</a></p><![CDATA[Surviving Anxiety, Or, How I Re-Met Adam Culp Today | Remarks]]>https://www.timbroder.com/2015/08/surviving-anxiety,-or,-how-i-re-met-adam-culp-today-|-remarkshttps://www.timbroder.com/2015/08/surviving-anxiety,-or,-how-i-re-met-adam-culp-today-|-remarksTue, 18 Aug 2015 06:44:00 GMT<blockquote> <p>My running is teaching me two things. One is to “push through” – to go beyond a point when I want to give up short of a goal. The other is to pay attention and take a break when I need it lest I end up hurting myself.</p> </blockquote> <p>​One day I will write about my anxiety. But not yet</p> <blockquote> <p>I encourage everyone to read Adam’s brief, powerful post. Even if you are not dealing with crushing anxiety, it’s certain that you know someone who is. It’s a terrible thing to experience, and it’s a wonderful thing to be past, though I’m always worried that it’s waiting for me in the wings – one never fully recovers from it, I suspect.</p> </blockquote> <p>​</p><![CDATA[Cushion - From Beta To Launch - The Subdomain]]>https://www.timbroder.com/2015/08/cushion---from-beta-to-launch---the-subdomainhttps://www.timbroder.com/2015/08/cushion---from-beta-to-launch---the-subdomainTue, 18 Aug 2015 06:33:00 GMT<blockquote> <p>When I started Cushion, I knew I wanted to keep the marketing website and the web app separate. I’ve worked on apps in the past where the marketing site is baked into the app code, so any change—even a typo—required a deploy of the entire app. This approach would make me think twice about updating the marketing site—it turned a simple task into a daunting one. Because of this experience, I deliberately separated the two, hosting the marketing site at the root domain while the app lived on a subdomain</p> </blockquote> <p>Separation of concerns. This is a good idea. Curious about SEO implications though</p> <blockquote> <p>Someone suggested get.cushionapp.com when I was looking for subdomain suggestions, but I dismissed it. I’m not a fan of the “get” prefix when you’ve already signed up for the app, but “get” does make sense for the sign up process, though.</p> <p>At the time, I was also wrapping up the referral system for Cushion. Once I considered get.cushionapp.com, everything became crystal clear. I would use get.cushionapp.com for the sign up page, and the referral links could be get.cushionapp.com/REFERRAL_CODE. Now, the “get” prefix makes sense and reads well, too—“get cushion app”.</p> <p>I couldn’t be happier with the combination of get.cushionapp.com and my.cushionapp.com. The simplicity and casual feel matches perfectly with the tone I’ve been trying to convey with Cushion. Everything seems to be falling into place, and I’m so relieved to finally be over the hurdle of this transition. Cushion has officially graduated and I’m so excited to see where it goes next.</p> </blockquote> <p>​</p><![CDATA[Things I'Ve Quit Doing At My Desk]]>https://www.timbroder.com/2015/08/things-i've-quit-doing-at-my-deskhttps://www.timbroder.com/2015/08/things-i've-quit-doing-at-my-deskSun, 16 Aug 2015 21:00:00 GMT<blockquote> <p>In reality, we do all sorts of things at our desks that aren’t real work (or affect our ability to produce our best work).</p> </blockquote> <p>​We do do a lot at our desks. It's interesting though how much of "work" has spilled onto our other devices. At least during the day I'm in outlook and Omnifocus on my phone. When I have 1:1s with my directs, I bring my iPad with Omnifocus to review goals or notes I've kept track of</p> <blockquote> <p>Thinking: Nobody does their best thinking sitting at their desk.</p> </blockquote> <p>I do my best thinking in the shower at home. I've had sooooo many epiphanies over the years in the shower. Either brand new ideas or some problem that may have had me stumped for days.</p> <p>I think it's the sensory deprivation. There's nothing to distract you, your mind is free to wander, and there is plenty of ambient noise. Sing if it helps!</p> <p>This doesn't work as well for me in the shower at the gym. I'm usually rushing to let the next people in or to get to work, and the water temperature is usually lukewarm or cold to help me cool down. Anything I can help to do stop my sweating before work.</p> <blockquote> <p>Socializing</p> </blockquote> <p>I think a standing desk hurts me on this regard. I notice that more people come up to me to chit chat than if my desk is down and I'm sitting</p><![CDATA[When Our Blog Became A Business - $2,000 From One Post]]>https://www.timbroder.com/2015/08/when-our-blog-became-a-business---$2,000-from-one-posthttps://www.timbroder.com/2015/08/when-our-blog-became-a-business---$2,000-from-one-postSun, 16 Aug 2015 20:52:00 GMT<blockquote> <p>If I lacked passion or expertise I think my wife’s readers would be able to see right through it. Readers are smart; they know when you don’t care, and they know when you don’t know what you’re talking about. Don’t fake it.</p> </blockquote> <p>​Hmm. Should I try a daddy blog? With nerdery, tech, and productivity?</p> <blockquote> <p>It’s tough building your thing online.</p> </blockquote> <p>​</p><![CDATA[Gitlab: Almost Everything We Do Will Be Open]]>https://www.timbroder.com/2015/08/gitlabhttps://www.timbroder.com/2015/08/gitlabFri, 07 Aug 2015 17:01:00 GMT<blockquote> <p>Today we’re announcing a move from doing the majority of our development work internally, to almost exclusively working in public issue trackers on GitLab.com. This means that anyone can view and comment on all of our discussion and work. This includes bugs, new features, performance issues and everything else that relates to our products.</p> </blockquote> <p>Awesome. We use Gitlab for our source control at <a href="http://alexanderinteractive.com">work</a> and I couldn't be happier to see this.</p> <blockquote> <p>We were not working in the open as a true open source project should.</p> </blockquote> <p>​</p><![CDATA[Open Sourcing Energy - Artsy Engineering]]>https://www.timbroder.com/2015/08/open-sourcing-energy---artsy-engineeringhttps://www.timbroder.com/2015/08/open-sourcing-energy---artsy-engineeringFri, 07 Aug 2015 17:00:00 GMT<blockquote> <p>It’s worth mentioning that we don’t just talk externally about Open Source. Internally, the Mobile team runs talks about Open Source for the rest of the Artsy staff. As well, we discuss the tooling and business implications of having our work in public repos. Artsy strives for an open culture, in this case the development team, on the whole, is just further along in the process.</p> </blockquote> <p>A great read about Artsy's open source culture</p><![CDATA[Cutting Back]]>https://www.timbroder.com/2015/08/cutting-backhttps://www.timbroder.com/2015/08/cutting-backThu, 06 Aug 2015 09:31:00 GMT<blockquote> <p>I actually treated a vacation like a vacation but I fully expected to be stuck attending to work, checking RSS, and the like. Turns out it was kind of... nice?</p> </blockquote> <p>I think I'm pretty good about doing this. Work email and calendar are deleted from my phone when I go on vacation. If there is a true emergency, I'll get a text or a phone call.</p> <p>Vacations are important. You need to recharge, you need a mental break. Give your mind some rest.</p> <p>This is especially important from work, but other things as well.</p> <p>On as many vacations as I can (especially beach ones) I'll go into "no devices mode". No phone, tablet, TV. just books. My Kindle gets a pass. Sometimes. Others I'll grab some library books. On vacation to Italy last year, I made an exception with Instapaper. I shouldn't have. Our train rides became about getting through as much Instapaper as possible instead of a relaxing read or enjoying the countryside</p> <blockquote> <p>There is more new stuff on the internet that I'd like to be a part of than I have hours in the day to participate.</p> </blockquote> <p>Yeeeeeah</p> <blockquote> <p>It's been a long time since I had to accept that I won't be able to take it all in. Still, I try.</p> </blockquote> <p>I do too. There are more tweets, RSS/Instapaper articles, and podcasts than I can keep up with. I want t,o but let's be realistic. I read Twitter as a completionist or I've been known to take a week or even a month off. For RSS and Instapaper I mark everything as read twice a year; On New Years and my birthday. My podcasts I should really prune. Some I listen every week, some I cherry pick. I think I need less that I want to listen to every episode</p> <blockquote> <p>The hard part about letting go of my fear of missing out is the process of falling behind</p> </blockquote> <p>​</p><![CDATA[Invalid predicate when filtering CKRecords by the same keys?]]>https://www.timbroder.com/2015/08/invalid-predicate-when-filtering-CKRecords-by-the-same-keyshttps://www.timbroder.com/2015/08/invalid-predicate-when-filtering-CKRecords-by-the-same-keysSat, 01 Aug 2015 20:19:00 GMT<p>Originally posted on <a href="http://stackoverflow.com/questions/31441807/invalid-predicate-when-filtering-ckrecords-by-the-same-keys" title="StackOverflow">StackOverflow</a></p> <p>I have a CKRecord type "Follow" which stores the user's ID and the ID of a friend they follow. (Assume that a user can only follow 1 person and the logic around that is handled elsewhere).</p> <p>Screenshot of record definition in CloudKit</p> <p><img src="https://farm1.staticflickr.com/313/20186044436_b4629376af_z_d.jpg" alt=""></p> <p>I want to query the Follow records to confirm that two users follow each other and are in fact, friends.</p> <p>These are the base queries. Each works fine on it's own</p> <div class="gatsby-highlight" data-language="swift"><pre style="counter-reset: linenumber NaN" class="language-swift line-numbers"><code class="language-swift"><span class="token keyword">let</span> followPredicate <span class="token operator">=</span> <span class="token class-name">NSPredicate</span><span class="token punctuation">(</span>format<span class="token punctuation">:</span> <span class="token string-literal"><span class="token string">"userID == %@ AND followsID == %@"</span></span><span class="token punctuation">,</span> userId<span class="token punctuation">,</span> followsID<span class="token punctuation">)</span> <span class="token keyword">let</span> followedPredicate <span class="token operator">=</span> <span class="token class-name">NSPredicate</span><span class="token punctuation">(</span>format<span class="token punctuation">:</span> <span class="token string-literal"><span class="token string">"followsID == %@ AND userID == %@"</span></span><span class="token punctuation">,</span> userId<span class="token punctuation">,</span> followsID<span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span></span></pre></div> <p>I want to combine these two predicates and query once, so that if two records come back, it's assumed that the different users follow each other</p> <p>I've tried to combine them both manually and by using a NSCompoundPredicate:</p> <div class="gatsby-highlight" data-language="swift"><pre style="counter-reset: linenumber NaN" class="language-swift line-numbers"><code class="language-swift"><span class="token keyword">let</span> friendPredicate <span class="token operator">=</span> <span class="token class-name">NSCompoundPredicate</span><span class="token punctuation">(</span>type<span class="token punctuation">:</span> <span class="token class-name">NSCompoundPredicateType</span><span class="token punctuation">.</span><span class="token class-name">OrPredicateType</span><span class="token punctuation">,</span> subpredicates<span class="token punctuation">:</span> <span class="token punctuation">[</span>followPredicate<span class="token punctuation">,</span> followedPredicate<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token keyword">let</span> friendPredicate <span class="token operator">=</span> <span class="token class-name">NSPredicate</span><span class="token punctuation">(</span>format<span class="token punctuation">:</span> <span class="token string-literal"><span class="token string">"(followsID == %@ AND userID == %@) OR (userID == %@ AND followsID == %@)"</span></span><span class="token punctuation">,</span> userId<span class="token punctuation">,</span> followsID<span class="token punctuation">,</span> userId<span class="token punctuation">,</span> followsID<span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span></span></pre></div> <p>I then use the query here:</p> <div class="gatsby-highlight" data-language="swift"><pre style="counter-reset: linenumber NaN" class="language-swift line-numbers"><code class="language-swift"><span class="token keyword">let</span> friendQuery <span class="token operator">=</span> <span class="token class-name">CKQuery</span><span class="token punctuation">(</span>recordType<span class="token punctuation">:</span> <span class="token string-literal"><span class="token string">"Follow"</span></span><span class="token punctuation">,</span> predicate<span class="token punctuation">:</span> friendPredicate<span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <p>In both versions of friendPredicate above, I get an Invalid Predicate Exception.</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">*** Terminating app due to uncaught exception 'CKException', reason: 'Invalid predicate: (userID == "_1570bb2652d0658c12320bcd658e5898" AND followsID == "_fb7ebeb0841f6411099ad094424d66ac") OR (followsID == "_1570bb2652d0658c12320bcd658e5898" AND userID == "_fb7ebeb0841f6411099ad094424d66ac") (Error Domain=CKErrorDomain Code=12 "Invalid predicate (userID == "_1570bb2652d0658c12320bcd658e5898" AND followsID == "_fb7ebeb0841f6411099ad094424d66ac") OR (followsID == "_1570bb2652d0658c12320bcd658e5898" AND userID == "_fb7ebeb0841f6411099ad094424d66ac")" UserInfo=0x14e63010 {ck_isComparisonError=false, NSLocalizedDescription=Invalid predicate (userID == "_1570bb2652d0658c12320bcd658e5898" AND followsID == "_fb7ebeb0841f6411099ad094424d66ac") OR (followsID == "_1570bb2652d0658c12320bcd658e5898" AND userID == "_fb7ebeb0841f6411099ad094424d66ac")})'</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p><em>Am I approaching this wrong or making an invalid assumption? Any help is much appreciated</em></p><![CDATA[World'S Best Whisky Is Being Sent To Age In Space]]>https://www.timbroder.com/2015/07/world's-best-whisky-is-being-sent-to-age-in-spacehttps://www.timbroder.com/2015/07/world's-best-whisky-is-being-sent-to-age-in-spaceFri, 31 Jul 2015 09:38:00 GMT<blockquote> <p>will send six samples of its whiskies and other alcohols to the International Space Station (ISS) next month, in order to observe the effects of zero-gravity on the aging process.</p> </blockquote> <p>​</p> <blockquote> <p>The first samples will return to Earth after one year, while the other group of samples will remain aboard the ISS for at least two years. Unfortunately, there are no plans to sell the drinks once they come back to Earth.</p> </blockquote> <p>Bummer 😕🍹</p><![CDATA[When To Give Up Trying To Start A New Habit]]>https://www.timbroder.com/2015/07/when-to-give-up-trying-to-start-a-new-habithttps://www.timbroder.com/2015/07/when-to-give-up-trying-to-start-a-new-habitThu, 30 Jul 2015 11:19:00 GMT<blockquote> <p>For me being active is like meditation, a daily ritual that keeps me sane amid the chaos of my life. Without it I feel weak, lethargic and a little depressed.</p> </blockquote> <p>This very much holds true for me. There was a period of time a few months ago where the gym I was going to closed for renovations. I thought I could keep up with my activity at home. I planned on running, doing <a href="https://itunes.apple.com/us/app/fitstar-personal-trainer-burn/id535640259?mt=8&#x26;at=11laRZ&#x26;ct=Wflw6" title="%fill:name%">FitStar</a> or <a href="https://itunes.apple.com/us/app/yoga-studio/id567767430?mt=8&#x26;at=11laRZ&#x26;ct=Wflw6" title="%fill:name%">Yoga</a> from my phone, and doing kettle bell work. For the most part I stuck with this. But only in a certain sense. Yes I was going for runs. But not as hard as I should have. Yes, I was doing FitStar, but wasn't getting my heart rate up enough. I slacked on the kettle bell work. None of this had me lifting heavy or getting my hear rate through the roof. (I need both of these for stress relief)</p> <p>It eventually had an effect on me. I became more stressed and depressed. It was harder to get up for my early alarm to try to be active before work. (I can't work out after work. I either don't have time, am exhausted, or want to go spend time with my family or TV).</p> <p>I should have seen this coming. I wish I had but I didn't.</p> <p>Part of this is the social aspect of the gym. I've been training with the same group of people for almost 6 years. Seeing them in the morning and shooting the shit is a strong part of my week. We've become close friends. Having that missing also contributed to my negative mood</p> <p>After a while I stared realizing that our gym wasn't going to reopen. That I was using that as an excuse to not find a new gym. We had talked about it but were all lethargic about pulling the trigger. One weekend I couldn't take it anymore. "I need to lift something". I texted a few people and we did a drop in at a new gym that Monday. The facility is ok, the people are great, and the programming is fantastic. We've re-upped our membership and I'm very happy to be pushing myself again</p> <p>Paternity leave threw a little bit of a wrench into this. I knew it was coming and knew I would have to find a gym close to home. (I train in the city near where I work). I found one close by. It's not one I would join full time, but it's great for a stop gap during leave/vacation or the odd weekend. I've only gone once a week (setting an alarm with a new born is risky. Yes I acknowledge that I'm using that as an excuse and should have sucked it up a lot more). I've also been running and last week did the first longer run in over a year. I'm in week 4 and I'm starting to feel like I really, really need to lift something. But, next week I'm back in the saddle with work, and will be re-joining my friends at our new gym</p> <blockquote> <p>Giving up on something you have previously committed to isn’t an easy thing to do. It can feel like failure or defeat. But sometimes giving up your goal is the smartest thing to do. Sometimes the cost of achieving it isn’t worth the price of admission.</p> </blockquote> <p>​Continue reading at <a href="http://summertomato.com/when-to-give-up-trying-to-start-a-new-habit/" title="%fill:name%">summertomatoe</a></p><![CDATA[Git 2.5, Including Multiple Worktrees And Triangular Workflows]]>https://www.timbroder.com/2015/07/git-2.5,-including-multiple-worktrees-and-triangular-workflowshttps://www.timbroder.com/2015/07/git-2.5,-including-multiple-worktrees-and-triangular-workflowsThu, 30 Jul 2015 10:26:00 GMT<p>Git 2.5 has been released with worktrees, better triangular workflows, and performance enhancements. Read GitHub's take on it <a href="https://github.com/blog/2042-git-2-5-including-multiple-worktrees-and-triangular-workflows" title="%fill:name%">here</a></p> <blockquote> <p>The new Git subcommand git worktree creates additional working trees connected to an existing Git repository [1]. Each linked working tree is a pseudo-repository with its own checked-out working copy. Its .git is actually a file that refers to the history and references from the main repository</p> </blockquote> <p>Nice. This is Git's solution to having multiple clones for different long running streams. I do this more often than I thought</p> <blockquote> <p>Git has many features that support triangular workflows, but it’s sometimes hard to see how to use them together in real life. Let’s take a closer look at triangular workflows, including the new command line shorthand <reference>@{push} that was added in Git 2.5.</p> </blockquote> <p>This is neat. It might take me a little while to adopt this. The existing flow works well for me</p><![CDATA[Reading: Getting Things Done By David Allen]]>https://www.timbroder.com/2015/07/reading:-getting-things-done-by-david-allenhttps://www.timbroder.com/2015/07/reading:-getting-things-done-by-david-allenWed, 29 Jul 2015 22:05:00 GMT<p>\n</p><![CDATA[How To Remember Tar Flags]]>https://www.timbroder.com/2015/07/how-to-remember-tar-flagshttps://www.timbroder.com/2015/07/how-to-remember-tar-flagsTue, 28 Jul 2015 17:43:00 GMT<p>how to remember tar flags 🎏</p> <p>tar -xzf 👈 eXtract Ze Files!</p> <p>tar -czf 👈 Compress Ze Files!</p> <p>via <a href="https://twitter.com/_tessr/status/626076327133577216" title="%fill:name%">@_tessr</a></p><![CDATA[Recent Omnifocus Reading and Things I Want to Try]]>https://www.timbroder.com/2015/07/recent-omnifocus-readinghttps://www.timbroder.com/2015/07/recent-omnifocus-readingTue, 28 Jul 2015 15:56:00 GMT<p>I've been doing some reading on Omnifocus over the past few days. I've also purchased David Allen's new <a href="http://amzn.to/1IDjHqq" title="GTD Book">GTD Book</a>. Below are pieces of interest that I've found along with brief commentary on things I want to try.</p> <p>I use Omnifocus heavily for both <a href="http://apple.co/1CHgCmI" title="iOS">iOS</a> and <a href="http://apple.co/1euWetx" title="Mac">Mac</a></p> <h2><a href="http://tekside.net/gtdjedi/2015/6/14/a-new-strategy-for-the-omnifocus-widget">A New Strategy for the Omnifocus Widget</a></h2> <blockquote> <p>Flags were always a part of Omnifocus that I didn't find much use for. So I was delighted to discover this unique strategy in making good use of them in a way that doesn't confuse but rather compliments my workflow. I have reserved the use of flags for today's tasks of priority. It allows me to make sure that the things I must get done today don't get lost in the the massive amount of stuff I am keeping up with at one time. Omnifocus allows for up to 4 tasks to be displayed in the widget. Any more and you will have to go back into the app to view those additional tasks. So my regimen now is just to simply review my forecasted due and overdue tasks and select up to 4 of the highest priority and flag them.</p> </blockquote> <p>This is a very good and interesting idea. I've upgraded to OmniFocus pro on my laptop but haven't yet taken the plunge on my iPhone. While I do use custom perspectives on my Mac I don't immediately need them with me at all times though. I really like what Clay has set up though. It might be time.</p> <h2><a href="http://macsparky.com/omnifocus/">OmniFocus Video Field Guide</a></h2> <blockquote> <p>The OmniFocus Video Field Guide is a screencast, not a book. A lot of people have asked me to write a book about OmniFocus but instead I made this 2.5 hour video that takes you, soup to nuts, through the Omni Group's supremely bad-ass task manager. The screencast can turn an OmniFocus novice into a task-managing ninja.</p> </blockquote> <p>I'm about halfway through this video and it is well worth the $10</p> <h3><a href="http://tyler.io/2014/11/my-omnifocus-habits-four-years-later/">My OmniFocus Habits - Four Years Later</a></h3> <blockquote> <p>Personal Tandum (my day job) Freelance (my side business)</p> </blockquote> <p>This setup would fit well for me. Freelance would be Taco23 (I don't have the time to Freelance these days. Taco is for fun/profit and a good creative outlet for me)</p> <blockquote> <p>And that’s one of the key lessons I’ve learned as my use of OmniFocus has evolved. Don’t feel like everything has to fit into a neat, pre-existing category. Don’t artificially restrict yourself. Feel free to let things land wherever makes sense to you.</p> </blockquote> <blockquote> <p>The final folder is for template projects. These are projects that have many steps and frequently repeat. Instead of recreating the project from scratch each time, I create it one time and place it on hold. Then, whenever that project occurs, I can drag a copy of it into one of my active folders.</p> </blockquote> <p>This is nice. I need to do this for employee onboarding and new projects (steps which should also be on our Wiki)</p> <blockquote> <p>One rule of thumb I’ve learned the hard way is to never nest folders. Folders within folders just lead to a world of hurt and cognitive load. I’ve found it’s best to keep as flat a hierarchy as possible. Your milage may vary of course.</p> </blockquote> <p>Interesting. I do this</p> <blockquote> <p>But after re-reading Getting Things Done last year, I came to the realization that most of my tasks are bounded not by what tools I have available, but by my energy level.</p> </blockquote> <p>Very interesting. I'm glad I picked up GTD to read</p> <blockquote> <p>You’ll also notice I have on-hold contexts for tasks that other people owe me. I wrote in detail about how I manage the relationships between tasks and other people a few weeks ag</p> </blockquote> <p>Ooo!</p> <blockquote> <p>The biggest and best improvement I made to my daily workflow was to codify my morning routine for picking what I’m going to work on that day. (In fact, a big part of determining what to work on each day was simply realizing I need to a concrete series of repeatable steps for choosing my day’s tasks.)</p> </blockquote> <p>I want to start doing this. This is how I should start my day vs looking at a mountain of email</p> <h2><a href="http://sethclifford.me/2015/05/embracing-contexts-and-perspectives-in-omnifocus-pro/">Embracing contexts and perspectives in OmniFocus Pro. | Greetings from the Grid</a></h2> <blockquote> <p>I manage everything in OmniFocus. Personal tasks, work projects, home renovations, writing activities, et. al. I have tightly organized project structures, but feel that I need to focus on critical tasks in specific scenarios, e.g., I don’t need to know that the trash goes out tonight if I’m standing in my office.</p> </blockquote> <p>Same. For me, add chores, HoneyDo, code ideas, tasks for sore code projects, department ideas, items to talk to employees about at 1:1s</p> <blockquote> <p>I’d avoided, namely flagged items and defer dates. I’ve used contexts selectively in the past, but never managed to make them really stick.</p> </blockquote> <p>Reading this early in this post was exciting. I've avoided contexts and deferring. It's interesting to see how others are using them</p> <blockquote> <p>First, I created three new contexts: “9am-5pm”, “5pm-9am”, and “Weekend”.</p> </blockquote> <p>I'm not sure if this would work for me. I always work some hours outside of 9-5. Usually 8-6 or 7. I feel like this arbitrary bounds on "work" would stress me out if I was at work outside of the "rule". I think I'd rather do: work, home, taco</p> <blockquote> <p>I also made the decision to start using flagged tasks to indicate dated or undated tasks that require a follow up activity either on my part or the part of someone else. (Some people use a “Waiting” context for things like this, but I could never make that stick either.)</p> </blockquote> <p>"Waiting" feels more natural to me</p> <blockquote> <p>Location is a modifier on time</p> </blockquote> <p>I could see the reverse of this being true as well</p> <h2><a href="http://tyler.io/assigning-relationships-between-tasks-and-people-in-omnifocus/">Assigning Relationships Between Tasks and People in OmniFocus</a></h2> <blockquote> <p>Number one, tasks assigned to another person, can be handled as mentioned above by giving the task a context corresponding to the name of the person it’s assigned to. So, if I’m waiting on Jeff to complete a design document, I’d give that task an on-hold context of “Jeff”. This lets me quickly filter tasks that Jeff owes me whenever I run into him. Great. I’ve been doing this for years.</p> </blockquote> <p>I can't wait to start doing this. Check the rest of the post for ideas on tracking tasks you are sharing with another person and tracking ones you are doing for something else</p> <h2><a href="http://tyler.io/one-concrete-action/">One Concrete Action</a></h2> <blockquote> <p>None of that would have happened if I had spent much time looking at my ever growing todo list. I would have been too overwhelmed. Instead, I’ve been making progress on all of my areas of responsibility by way of one simple trick.</p> <p>Every day, no matter how small, I open up OmniFocus and find one concrete action I can take that will move me closer towards one of my goals.</p> </blockquote> <h2><a href="http://www.relativesanity.com/articles/a-seemingly-empty-room">Meetings, awesomeness and potential bodily harm: an OmniFocus story - Relative Sanity</a></h2> <blockquote> <p>But how on earth do I manage hundreds of contexts? The long answer is another article, but the quick answer is that I don't. I let OmniFocus do it for me.</p> </blockquote> <h2><a href="https://brooksreview.net/2015/06/a-new-context/">A New Context</a></h2> <blockquote> <p>Urgency in and of itself is not a problem. The problem is when we find ourselves craving projects, work environments, and scenarios where there is a fire to put out. And thus we never have the time to do the important task which doesn’t have to be done today</p> </blockquote> <p>🔥🔥🔥</p> <blockquote> <p>I hadn’t touched my contexts inside of OmniFocus in, well, years. There was a ton of cruft in there stemming from various different techniques and ideas that I have tried over the years. Device based context, person based context, time based contexts, and location based contexts. For the better part of a year, all of my new tasks in OmniFocus simply went under the Mac context and — well — that’s not really using the tool very well.</p> </blockquote> <blockquote> <p>All of a sudden it clicked: I should just have two contexts. One would be Urgent and the other would be Important.</p> </blockquote> <p>O_o</p> <blockquote> <p>Obviously that was rather ambitious, but I took my 30+ contexts and whittled them down to just six: Important, Urgent, Goal, Writing, Minutiae, and Waiting.</p> </blockquote> <h2><a href="http://www.speirs.org/blog/2012/9/15/from-omnifocus-to-evernote.html">From OmniFocus to Evernote</a></h2> <blockquote> <p>I eventually figured out what it was: with the move to mobile devices, ubiquitous internet and functional data syncing, contexts have disappeared for me.</p> <p>In the olden days, there were contexts. There was online and offline. There was work and there was home. I used to actually go to these places called shops. These locations and phases of the day were distinct and the affordances of each place were different.</p> </blockquote> <p>​</p> <h2><a href="http://inside.omnifocus.com/gtd">Getting Things Done® - Inside OmniFocus</a></h2> <blockquote> <p>One other thing to consider: can you do it, or does it require someone elses action? If someone else: delegate it. Send them an email right then, or create an action to “Email Brian about this one thing.”</p> </blockquote> <p>Yessss</p> <blockquote> <p>Review</p> <p>Reviewing is a key facet of GTD® that keeps everything going smoothly. In short, we’re periodically looking over projects and making some considerations.</p> <p>The GTD Weekly Review® is just that: weekly. And it should do three big things:</p> <p>Get Clear Did your desk get physically full over the past week? Clear it out. Scan in new items or type in notes so that you can file all of that clutter away. Get your Inbox to zero Now that you’ve just added to your Inbox, process it. Empty your head Anything else that needs to come out? Take the time to do a brain dump, like we did at the beginning, to make room for the next week.</p> </blockquote> <p>I need to do this regularly</p> <blockquote> <p>Then, we’ll get current. To get current, review each project and action list. Consider these questions.</p> <p>Do I need to add a new first step? Is the first action action-able enough? Does this project represent your goals? Should I still be worrying about it, or should I drop it? Does the metadata represent what you want? Could you defer it? Should you set a flag for higher priority? Are my Waiting-For lists actionable yet? Has anyone emailed you? Should you check back on an unanswered email?</p> </blockquote> <blockquote> <p>You can toggle specific calendars by using the View Popover in the toolbar.</p> <p>And let’s say it’s the end of the day on Thursday, but you still have a few more things to do for the week. In the Forecast view, you can drag from 1 day to another—using the minicalendar—to reschedule, or modify the Due Date. Holding down the Command key will instead modify the Defer Date. Holding down both the Command and Option key will change both.</p> </blockquote> <p>Sweet. Did not know this</p> <blockquote> <p>Resources</p> <p>Delegation</p> <p>Listening</p> <p>Intro to GTD and the following episodes on the Back to Work podcast. Merlin Mann &#x26; Dan Benjamin. OmniFocus &#x26; GTD by Kelly Forrester at the David Allen Company. Preneurcast 025: Getting Things Done With OmniFocus.</p> </blockquote> <p>​</p><![CDATA[The Best Apps for New Dads]]>https://www.timbroder.com/2015/07/best-apps-for-new-dadshttps://www.timbroder.com/2015/07/best-apps-for-new-dadsMon, 27 Jul 2015 12:32:00 GMT<p>I posted over on <a href="http://tekside.net/iphonaddict/2015/7/15/the-best-apps-for-new-dads" title="TekSide">TekSide</a>:</p> <p>We have a newborn named <a href="https://twitter.com/timothybroder/status/617041906040762368" title="Charlie">Charlie</a>. He's 2 weeks old so I'm no expert on being a Dad, but there have been a few apps the have been extremely helpful throughout the whole process. I tried a number of apps with tips, data entry, tools, and other functions, but these are the ones that stuck. As always, my iPhone is constantly by my side and I couldn't imagine going through pregnancy, labor, or fatherhood without them.</p> <p><a href="http://apple.co/1O6Fg0E">Who's Your Daddy? The Pregnancy Guide for First Time Dads</a></p> <p>As soon as you find out your pregnant, download this app and put in the tentative due date of the baby. The app will then start giving you daily tips. These range from the practical:</p> <ul> <li>Make sure your life insurance is appropriate for a family</li> <li>Create a gift registry</li> <li>Pack the hospital bag (later on)</li> </ul> <p>To things for you:</p> <ul> <li>Go out for one last romp with the boys</li> <li>Is your paternity leave sorted?</li> <li>You have one responsibility now: be there for her</li> </ul> <p>To things for <strong>her</strong>. (These are the true gems)</p> <ul> <li>Being home her favorite snacks tonight</li> <li>Tell her she looks beautiful today</li> <li>Kiss her long and hard when you get home tonight</li> <li>Schedule a date at your favorite place tonight</li> <li>Hit the movies one last time</li> </ul> <p>These daily notification were HUGE. They let me know when I should be doing things and gave suggestions on how to do them. The app also has a list of tools including a hospital bag list, baby name tracking, and a contraction counter. We ended up not using the contraction counter though. I didn't trust it. The app closed in the middle of one and it forgot that we had a timer going. We then switched over to the standard <a href="http://apple.co/1O6Foxb">Full Term</a>, which is mentioned below.</p> <p>This app was on my home screen for the duration of pregnancy</p> <p><img src="https://farm1.staticflickr.com/490/19535083889_fc74ddc6d8_o_d.png" alt="Daddy Features"> <img src="https://farm1.staticflickr.com/341/19100803003_f49e041b03_o_d.png" alt="Daddy Tip 1"> <img src="https://farm1.staticflickr.com/308/19695513376_43bb959f3a_o_d.png" alt="Daddy Tip 2"></p> <p><a href="http://apple.co/1CHgsMa">Nurture</a></p> <p>Nurture was great both as a visual log of my wife during her pregnancy, and as an information resource as to what was going on with Baby. Every week, the app prompted Laura to take a photo of herself. It was really cool to see how she changed from week to week. At the end, the app also strings these images together in a nice little animation.</p> <p>The feature I liked most about Nurture was the description of how big Charlie actually was. It lists a fruit or a piece of candy which really lets you correlate his size to something real. From a Skittle, to a mango, to a melon, we looked forward to seeing the update every Tuesday.</p> <p>Every week I would scroll through the relevant medical and parenting articles that the app suggested. Most were very good and worth reading. I also read a few books which I'll cover in a future post.</p> <p><img src="https://farm1.staticflickr.com/268/19101397623_e102831237_o_d.png" alt="Nurture Screenshot"></p> <p><a href="http://apple.co/1O6Foxb">Full Term</a></p> <p>This was our (and everywhere on the internet) contraction counter of choice. Starting and stopping the counter was super easy. Especially at a time where you can't really do more than glance at your phone. The app also presents the last contraction, an average of the last hour, and an average of the last 6 hours in an easy to read format. We ended up going through all of the labor at the hospital where Laura was hooked up to a machine. But, had we done it at home, this app would have been perfect to figure out when we should head in.</p> <p>My one wish would have been having a watch app alongside this to make start/stopping even easier</p> <p><a href="http://apple.co/1CHgoMc">BabyConnect</a></p> <p>Data Entry! This app looks quite dated (It's still using the old iOS6 design language) but it is very, very functional. It can track:</p> <ul> <li>Feedings</li> <li>Diaper</li> <li>Sleep</li> <li>Mood</li> <li>Activity</li> <li>Medical</li> <li>Milestones</li> <li>Daycare Dropoff/Pickup</li> <li>Messages to baby for the future</li> <li>Photos</li> </ul> <p>We've only been using the Feed, Diaper, and Milestone functions so far. Photos we're using a shared album in Photos.app which is shared with immediate family and very close friends. Mood and Activity are on the short list to start using. The app can aggregate any of these data points into graphs which give you quick info when you need it. "How many times per day are we feeding him?" This is handy when we went to the pediatrician early on and he wanted to know how many wet diapers Charlie had per day. (The only measure of if he's getting enough food when breastfeeding)</p> <p>The killer feature of BabyConnect is it's sync capabilities. We have it set up where both Laura and I are the parents of Charlie and either of us can enter information from any device and it immediately syncs. Just in case we forgot to grab our phone for a night feeding, we also have an iPod touch sitting in the nursery with this app installed so we can track what goes on at night. I also have notifications turned on (for now anyway) so I can see when Laura does certain things with Charlie</p> <p><img src="https://farm1.staticflickr.com/274/19100802803_1e098e6101_o_d.png" alt="BabyConnect Features"> <img src="https://farm1.staticflickr.com/558/19726310291_212508717f_o_d.png" alt="BabyConnect Chart"></p> <p><a href="http://apple.co/1CHg9kn">Quick Tips</a></p> <p>Great quick tips and how-to's for new dads. I find myself browsing these while I'm trying to get Charlie to calm down at night. How to deal with crying or feeding or tutorials on holding, diaper changes, and bath time.</p> <p><img src="https://farm1.staticflickr.com/483/19099268484_68f0d377cc_o_d.png" alt="Quick Tips"> <img src="https://farm1.staticflickr.com/466/19721849935_d39099a900_o_d.png" alt="How To"></p> <p><a href="http://apple.co/1CHgy6p">DayOne</a></p> <p>I won't go into Journaling as a whole in this article, but Day One is a great app to get frustrations or despair out of your head. Baby will pick up on these and it's a good mechanism to get back in the moment. Whether you are alone or it's not something you can or should discuss with your spouse at that point in time</p> <p><a href="http://apple.co/1CHgCmI">Omnifocus</a></p> <p>My to-do list of choice. Used for things like</p> <ul> <li>Set up Will</li> <li>Order Stroller</li> <li>Confirm insurance</li> <li>etc</li> </ul> <p>Non-App Resources</p> <ul> <li><a href="http://thenightlight.com/">TheNightLight</a> - If you like the <a href="http://thewirecutter.com/">The Wire Cutter</a> check this site out. It's from the same team and they have great reviews on everything from bottles, to monitors, to strollers.</li> <li><a href="http://www.lucieslist.com/">Lucie's List</a> - This is technically a mommy blog, but sign up for their weekly newsletter. The info is great and it's another source that will remind you to do things; Decide on circumcision, Picking a godparent, and more</li> </ul><![CDATA[Apple Music Followup: Part 1]]>https://www.timbroder.com/2015/07/apple-music-followup-part-1https://www.timbroder.com/2015/07/apple-music-followup-part-1Sun, 26 Jul 2015 21:55:00 GMT<p>A few new articles popped up in my RSS feed since I <a href="http://www.timbroder.com/2015/07/apple-music-is-a-nightmare-and-i%E2%80%99m-done-with-it.html">mentioned</a> Apple Music</p> <p><a href="http://www.loopinsight.com/2015/07/24/i-got-my-music-back-at-least-most-of-it/">I got my music back. At least most of it</a></p> <blockquote> <p>At this point, I’m just glad to have most of music back, but I still have no idea what happened to the other songs, for sure.</p> </blockquote> <p>Jim was able to meet with Apple privately and investigate a lot of his issues. Check out his post for the full story</p> <p><a href="http://www.loopinsight.com/2015/07/24/dave-mark-why-im-not-done-with-apple-music/">Dave Mark: Why I’m not done with Apple Music</a></p> <blockquote> <p>My Mac and iOS devices might as well be on different planets. When I search for a song on my iPhone, I can tap the Apple Music tab and, assuming the song is available on the Apple Music library, I can add the song to my current playlist, download it to my device for offline play, and mark it with a For You heart. Easy peasy.</p> <p>On my Mac, not so simple. Unlike the iOS universe, there is no Apple Music application on my Mac. On my iOS device, things are clear cut. There’s the iTunes Store app for buying music and the Apple Music app for streaming.</p> </blockquote> <blockquote> <p>So all this said, why am I still pushing on? Why don’t I make the move to Spotify?</p> <p>It’s all about potential.</p> </blockquote> <p>Click through to continue</p> <p><a href="http://morrick.me/archives/7371">Apple Music ought to be better than this</a></p> <blockquote> <p>Mark is not the only one willing to cut Apple some slack. I’ve heard other people — satisfied enough with Apple Music — sharing this kind of forgiving attitude.</p> <p>Well, I don’t agree with it. I think people should expect better from Apple. A better service. Better quality, and yes, from day one. Apple has the resources to make it happen. Apple is a bigger company than any other in the music streaming industry. Apple has the advantage of its ecosystem, not to mention the data already accumulated through the Genius algorithm within iTunes. Yet Apple Music feels more rushed, more confusing, feels like a patchwork of different ideas and directions, and it ultimately feels more ‘beta’ than other competing apps and services when these first launched.</p> </blockquote> <p>As I said last time. I expected more. A higher quality</p> <blockquote> <p>The problems with iTunes 12.2, iCloud Music Library, etc., give me the impression that Apple Music’s features have been hurriedly bolted on the already pachydermic, bloated, jack-of-all-trades iTunes app, and shipped without extensive, thorough testing.</p> </blockquote> <p>​</p> <blockquote> <p>Would people be equally forgiving if third-party paid music streaming apps and services caused the same mess Apple Music did for a lot of users? Would they talk of ‘potential’, or things getting better with the next version/iteration? I’m not so sure.</p> </blockquote> <p>​</p> <blockquote> <p>A few people wrote me that I was “crazy” for not dropping Spotify and instantly switch to Apple Music like they did; none of them said exactly why I should do so, the only vague criticism towards Spotify being “It’s just a mess” (huh?)</p> </blockquote> <p>I don't understand this</p> <p><a href="http://www.marco.org/2015/07/26/dont-order-the-fish">Don’t order the fish – Marco.org</a></p> <blockquote> <p>But the iTunes Store back-end is a toxic hellstew of unreliability. Everything that touches the iTunes Store has a spotty record for me and almost every Mac owner I know.</p> <p>And the iTunes app itself is the toxic hellstew. iTunes has an impossible combination of tasks on its plate that cannot be done well. iTunes is the definition of cruft and technical debt. It was an early version of iTunes that demonstrated the first software bugs to Grace Hopper in 1946.</p> </blockquote> <p>​</p><![CDATA[Gigster Does The Dev Dirty Work To Turn Your Idea Into An App]]>https://www.timbroder.com/2015/07/gigster-does-the-dev-dirty-work-to-turn-your-idea-into-an-apphttps://www.timbroder.com/2015/07/gigster-does-the-dev-dirty-work-to-turn-your-idea-into-an-appFri, 24 Jul 2015 11:31:00 GMT<blockquote> <p>Crew and Toptal pre-vet their freelancers, but all the management issues remain</p> </blockquote> <p>We've had varying levels of success with TopTal. But, the management side of it wasn't the issue. The issue was code quality and expertise. But, we got what we paid for</p> <blockquote> <p>Just go to Gigster’s site, instant message with a sales engineer, tell them what you want built, and in 10 minutes you get a guaranteed quote for what it will cost and how long it will take. Give Gigster the go-ahead, and it will manage an elite set of freelance coders and designers to build your product and give you status reports each week. Once you get your project back, Gigster will even maintain the code, and you can pay to add upgrades or new features.</p> </blockquote> <p>I'm trying to decide if this is worth trying. Next week when I'm back at work I might float a small project their way to see what the quote is. (Assuming I already know what it would cost us to do it ourselves</p><![CDATA[Apple Music Is A Nightmare And I’m Done With It]]>https://www.timbroder.com/2015/07/apple-music-is-a-nightmare-and-i’m-done-with-ithttps://www.timbroder.com/2015/07/apple-music-is-a-nightmare-and-i’m-done-with-itWed, 22 Jul 2015 15:51:00 GMT<p>Jim Dalrymple at The Loop has had some scathing issues with Apple Music. My thoughts below.</p> <blockquote> <p>I love Apple. I love them because they take difficult problems and come up with innovative, simple solutions. The things they make just work and we trust them. Unfortunately, my experience with Apple Music has been exactly the opposite. As of today, I’m missing about 4,700 songs from my library with little hope of getting them back.</p> <p>I had high hopes for Apple Music. I really wanted it to work and become my default music streaming service, but after the problems I’ve experienced over the last couple of weeks, I’m disabling it altogether</p> </blockquote> <p>I had mediocre hopes for apple music. A lot of my friends at <a href="https://www.alexanderinteractive.com/" title="work">work</a> and at <a href="http://tekside.net/" title="Tekside">Tekside</a> are raving about it. But, it's a service. A web/cloud/backend service. Apple historically has sucked at these. (Ping, iCloud sync, iMessage still isn't perfect).</p> <p>This isn't a review because as I'm still playing with it. But I'm looking at it from the perspective of someone who has used Spotify for years. I've commented a few times that I've been delighted at the new music their weekly newsletter recommends for me. I end up <strong>LOVING</strong> about 80% of them and they get discography playlists. (Unless I'm listening to trance or classical I make discography playlists for every band I listen to. I usually listen to them in order. It never been one for a more traditionally playlist or shuffling different bands on a play. I like to listen to albums, the way they were destined to be listened to.</p> <p>What I'm trying to get at, is Apple is coming to me at a high bar. Their music service can't be good, or even great. It has to knock my socks off. It has to make me love it. It has to make me want to go through the trouble of canceling my Spotify subscription and recreate the way I listen to music in it's ecosystem</p> <p>I don't have to worry too much about music I've purchased. I went from Napster to Pandora to Spotify. There are a few bands that I own the music for the I've added to Spotify (looking at you Beatles and Tool)</p> <p>Also, EVERYONE at work is on Spotify and playlists are passed around all the time. It will be interesting to see how his shakes out. (I've been home on paternity leave so I'm not sure what's going on with Apple music over there)</p> <blockquote> <p>As if all of that wasn’t enough, Apple Music gave me one more kick in the head. Over the weekend, I turned off Apple Music and it took large chunks of my purchased music with it. Sadly, many of the songs were added from CDs years ago that I no longer have access to. Looking at my old iTunes Match library, before Apple Music, I’m missing about 4,700 songs. At this point, I just don’t care anymore, I just want Apple Music off my devices.</p> <p>I trusted my data to Apple and they failed. I also failed by not backing up my library before installing Apple Music. I will not make either of those mistakes again.</p> </blockquote> <p>I'm assuming Apple Music uses cloudkit. I'm <strong>hoping</strong> it does. If it uses iCloud sync, it's screwed. I've seen how that works. Heck I've built apps that use it so I know its shortcomings. I have little trust in apples cloud ability</p> <p>Beats1 alone is not enough to take my money. But we will see how I use it over the next month. I'll be exclusively using it to give it an honest try</p> <p>But, here's another thing. This launch had to be <strong>flawless</strong>. This has Apple and some of the biggest names in music behind it. Hearing repeat content within the first few days on Beats1 is inexcusable. Losing music is horrid. And downtime if such a high profile service is even worse.</p> <p>All 3 of these things have happened. "It's a new service" is not an excuse for this. This isn't some startup or kickstater project. This is Apple and while they didn't trip out of the gate, it wasn't far behind</p><![CDATA[Sam: Ios Games You Need To Play]]>https://www.timbroder.com/2015/07/ios-games-you-need-to-playhttps://www.timbroder.com/2015/07/ios-games-you-need-to-playTue, 21 Jul 2015 11:03:00 GMT<p>I wrote about my <a href="http://timbroder.com/2015/03/games-i-was-addicted-to-in-2014.html">favorite games of 2014</a>. <a href="http://www.samuelstrickland.me/blog/2015/7/ios-games-you-need-to-play?utm_content=buffer125bf&#x26;utm_medium=social&#x26;utm_source=twitter.com&#x26;u">Sam</a> posted his list. You should take a look.</p> <blockquote> <p><a href="http://apple.co/1MnhKiF">Sword &#x26; Sworcery</a> This is one of my favorite games of all time. It tells a tragic and beautiful story full of fantastical mystery. The world is unlike anything else; creating an amazing blend between high fantasy, music culture, and otherworldly charm. Everything reacts to your touch. It makes you feel like you are a guide and a participant in this story, following the Sythian through her journey as a companion rather than an observer.</p> </blockquote> <p>This has been on my list of games to try forever. It's not that I balked at the $4.99 price tag. Plenty of the Final Fantasy games I've bought were $15. I didn't like the look of sword and sorcery from the screenshots. But Sam's recent game recommendations to me have been great. I'm currently working on a combination of Final Fantasy 6 and Baldur's Gate. Maybe when I finish one of those</p> <blockquote> <p><a href="http://apple.co/1MnhQ9Q">Botanicula</a> &#x26; <a href="http://apple.co/1GAdYdk">Machinarium</a> Unlike a lot of adventure games, these never dive into obtuse logic puzzles or irreconcilable fail states. Instead, they let you freely explore their worlds and solve puzzles on your own terms.</p> </blockquote> <p>I'll add another vote do Machinarium. After playing through the Room I &#x26; II last summer Laura and I looked for another puzzle/adventure game. We landed on Machinarium and have been playing through it together when we have time</p> <blockquote> <p><a href="http://apple.co/1GAe3hd">realMyst</a> A modern translation of the classic adventure game, realMyst takes the original game, Myst, and opens up the world to free movement.</p> </blockquote> <p>I LOVED the original Myst. But replaying it scares me. I survived it. I conquered it. I don't know if I would want to open that back up.</p> <p>It's HARD</p><![CDATA[Up In The Air: Meet The Man Who Flies Around The World For Free]]>https://www.timbroder.com/2015/07/up-in-the-air:-meet-the-man-who-flies-around-the-world-for-freehttps://www.timbroder.com/2015/07/up-in-the-air:-meet-the-man-who-flies-around-the-world-for-freeMon, 20 Jul 2015 20:12:00 GMT<p>This was a fascinating read about a quasi-underground culture or gaming airline systems and flying for free. Luxury only: business class and private rooms only</p> <blockquote> <p>“At that point, I was like, ‘Screw it,’ ” he remembers. “I decided I might as well do this full-time.” In April 2014, at the end of his lease, he walked into Seattle-Tacoma International Airport. He hasn’t come down since.</p> </blockquote> <p>​This article reminded me of the <a href="http://www.hitch50.com/">Hitch 50</a> blog from years ago. Back in 2006, Scotty and Fiddy embarked on an adventure to visit the capitals of all 50 states in 50 days. Solely through hitchhiking. That was a fun tale to watch in real time</p><![CDATA[Blog Little Things - Coffee Coder]]>https://www.timbroder.com/2015/07/blog-little-things---coffee-coderhttps://www.timbroder.com/2015/07/blog-little-things---coffee-coderMon, 20 Jul 2015 13:32:00 GMT<blockquote> <p>don’t fear to blog little things. It doesn’t need to be big, significant, detailed, mind-blowing to come out but just of a little value. It is helpful to think just of one person who had the exact same problem as yours and was helped by your post. Maybe the post won’t get thousands of shares as we see in our reading list but hey, it saved someone’s time</p> </blockquote> <p>​</p><![CDATA[More Quick Blogging Workflows | Manton Reece]]>https://www.timbroder.com/2015/07/more-quick-blogging-workflows-|-manton-reecehttps://www.timbroder.com/2015/07/more-quick-blogging-workflows-|-manton-reeceSun, 19 Jul 2015 22:32:00 GMT<blockquote> <p>We all want to get better at writing and posting more frequently. As I mentioned in yesterday'€™s post, the best way to improve anything is to do more of it, more often</p> </blockquote> <p>100% agree. Rebuilding my blog was fun. Let's see if I can get myself to write mode ;)</p> <p>I'm also trying a "habit app"</p> <blockquote> <p>a big part of posting regularly is just having a system that makes it easy</p> </blockquote> <p>Amen</p> <blockquote> <p>Posting to a blog first and then Twitter second seems like a simple idea, but it is extremely powerful. Years from now you end up with an archive of all your short-form writing at your own domain. Not as an afterthought, but as the default.</p> </blockquote> <p>This is a very interesting idea. It's somewhere in the list for my site rebuild. Somewhere in the middle</p> <p>I do really like using buffer though. But I could still go to buffer from IFTTT</p><![CDATA[We Need More Bad Ideas]]>https://www.timbroder.com/2015/07/we-need-more-bad-ideas-|-manton-reecehttps://www.timbroder.com/2015/07/we-need-more-bad-ideas-|-manton-reeceSun, 19 Jul 2015 22:25:00 GMT<p><a href="http://www.manton.org/2015/06/we-need-more-bad-ideas.html">Manton Reece</a>:</p> <blockquote> <p>The essay reminds me of something that always stuck with me reading about legendary Warner Bros. animation director Chuck Jones years ago. He said that when he was young, his father would give him and his siblings essentially unlimited paper to draw on, unused supplies from his business. We all have 100,000 bad drawings in us. The sooner we get through all the bad drawings — in Shawn’s essay, the bad ideas — the sooner we can start producing our best work.</p> </blockquote> <p>Write your ideas down. Good or bad. They aren't a thing while they just rattle around in your head.</p> <p>Get them out: onto paper, Omnifocus, evernote, whatever. This makes them real</p> <p>Then you can decide what's good or bad</p><![CDATA[Learning from Brent]]>https://www.timbroder.com/2015/07/inessential-secret-projects-diary-swift-2-protocolshttps://www.timbroder.com/2015/07/inessential-secret-projects-diary-swift-2-protocolsSun, 19 Jul 2015 21:42:00 GMT<p>I learn more about how to think about programming from Brent Simmons' blog than any place I can think of. I wish he wrote books or did full length tutorials. Probably more the later. I really like his thought process and how he breaks problems down.</p> <p>A good follow up to his Swift Protocol issue can be found <a href="http://owensd.io/2015/07/19/brents-feed-problem.html">here</a> by David Owen. I learn a lot from him too</p> <blockquote> <p>Let's say I'€™m writing an RSS reader. (This is the example I tend to use on my blog, for historical reasons, and shouldn't be taken as indicative of anything.)</p> <p>Let'€™s say the RSS reader can have a mix of stand-alone feeds and feeds that are synced with FeedBin, Feedly, NewsBlur, etc. I might very well do this:</p> <p>Create a Feed protocol. Create classes for each different type of feed: LocalFeed, FeedBinFeed, FeedlyFeed, etc. Each one of these conforms to the Feed protocol. (Why? Because each syncing system is different, and rather than have a giant Feed class that can handle all the different types, it's smarter to have a Feed protocol and then specific implementations for each different type of feed.)</p> <p>RSS readers tend to have folders too. But folders may have different rules, depending on the system: folders inside folders may or may not be allowed, for instance. So, similarly, I might do this:</p> <p>Create a Folder protocol. Create classes for each different type of folder: LocalFolder, FeedBinFolder, FeedlyFolder, etc. Each one of these conforms to the Folder protocol.</p> </blockquote><![CDATA[Open-Sourcing Jewelbots]]>https://www.timbroder.com/2015/05/open-sourcing-jewelbotshttps://www.timbroder.com/2015/05/open-sourcing-jewelbotsSat, 02 May 2015 17:08:34 GMT<blockquote> <p>I’ve always wondered why companies (and individuals) don’t put more of their</p> </blockquote> <p>source code out there</p><![CDATA[PHP7 Vagrant Box]]>https://www.timbroder.com/2015/03/php7-vagrant-boxhttps://www.timbroder.com/2015/03/php7-vagrant-boxSat, 07 Mar 2015 16:13:24 GMT<p>I’m keeping a close eye (or as much as I can anyway) on PHP7 and what it means for the future of the language. Installing in your local dev machine is risky, especially if you have ongoing work. As usual, Vagrant comes to the rescue!</p> <p><a href="https://twitter.com/rasmus/">Rasmus Lerdorf</a> has put together a Vagrant box to ease in the setup and isolate your testing.</p> <p>If you use Atlas, check out the box <a href="https://atlas.hashicorp.com/rasmus/boxes/php7dev">here</a>. Otherwise, the readme is available on <a href="https://github.com/rlerdorf/php7dev/blob/master/README.md">Github</a></p><![CDATA[Beyond UXKit - Robert Böhnke]]>https://www.timbroder.com/2015/02/beyond-uxkit-robert-bohnkehttps://www.timbroder.com/2015/02/beyond-uxkit-robert-bohnkeSat, 07 Feb 2015 15:46:33 GMT<p>Robert Böhnke wrote a good [piece](<a href="http://robb.is/thinking-about/beyond-">http://robb.is/thinking-about/beyond-</a> uxkit/) on what UXKit could mean for the future of iOS/Mac UI Engineering</p> <blockquote> <p>The new Photos for Mac is based on a new private framework in 10.10.3,</p> </blockquote> <p>UXKit. It is essentially a replica of UIKit, based on top of AppKit.</p> <p>He also comments on what something like react native could mean for engineers, and the attitude the community has had around other “non-native” in the past</p><![CDATA[Mongular, a Content Delivery System]]>https://www.timbroder.com/2015/02/mongular-content-delivery-systemhttps://www.timbroder.com/2015/02/mongular-content-delivery-systemFri, 06 Feb 2015 16:03:23 GMT<p>Mongular is something to keep a close eye on. We’ve had a number of projects at <a href="https://www.alexanderinteractive.com">work</a> where we might want something… other than a CMS. Where content is king and that content is decoupled from the system using or displaying it.  Other solutions that we’re excited about are <a href="https://prismic.io/">Prismic</a> and <a href="https://www.contentful.com/">Contentful</a>.</p> <p>Systems like this would let us do <strong>whatever</strong> we wanted with the site. Not being tied to the confines of a particular CMS’ way of doing things could be freeing. These systems offer much more powerful ways to relate content or parts of content to each other. Going far beyond just weighted tags.</p> <blockquote> <p>What is Mongular?</p> </blockquote> <blockquote> </blockquote> <blockquote> <p>Mongular is a Content Delivery System (Framework?... not really) built to</p> </blockquote> <p>take advantage of all the tools available to speed up the delivery of your content to users, and reduce server load.</p> <blockquote> </blockquote> <blockquote> <p>Content Delivery System?</p> </blockquote> <blockquote> </blockquote> <blockquote> <p>Mongular wasn't built to be a Content Management System, even though with</p> </blockquote> <p>enough development it could probably be built to do just that.</p> <blockquote> </blockquote> <blockquote> <p>Mongular was built to deliver content in an easy, efficient and extendable</p> </blockquote> <p>manner. Where developers take it, is up to them.</p> <p>Related reading:</p> <ul> <li><a href="https://blog.prismic.io/UyheDQEAAIYqPg5V/structured-text-a-cleaner-way-to-deal-with-rich-text-in-manageable-content">Structured Text: A cleaner way to deal with Rich Text in Manageable Content</a></li> <li><a href="https://blog.prismic.io/VD0Bdi8AADEA8qOm/experiments-compare-content-variations-efficacy-on-a-blog-or-page">Experiments: compare content variations efficacy on a blog or page</a></li> <li><a href="http://www.theguardian.com/open-platform/blog/what-is-powering-the-content-api">What's powering the Content API? - The Guardian speaks at Lucene Eurocon 2010</a></li> </ul><![CDATA[Equality in the Apple Blogging Scene]]>https://www.timbroder.com/2015/01/equality-in-the-apple-blogging-scenehttps://www.timbroder.com/2015/01/equality-in-the-apple-blogging-sceneMon, 12 Jan 2015 00:10:24 GMT<p>Long time Mac developer, Daniel Jalkut posited a question last night on Twitter.</p> <blockquote> <p>I find it far easier to follow brilliant women on Twitter than in blogs. Do</p> </blockquote> <p>women in the Apple scene not blog as much, or am I missing them?</p> <blockquote> </blockquote> <blockquote> <p>— Daniel Jalkut (@danielpunkass) [January 10,</p> </blockquote> <p>2015](<a href="https://twitter.com/danielpunkass/status/553983430095302656">https://twitter.com/danielpunkass/status/553983430095302656</a>)</p> <p>This question came out of some of the responses to Marco Arment’s “hot” <a href="http://www.marco.org/2015/01/04/apple-lost-functional-high-ground">post</a> last week about the state of Apple’s software ecosystem. Daniel got a good number of replies.</p> <p>I’m always looking for more to read, especially technical blogs. I’ve gone through them and added the following to my iOS RSS folder:</p> <ul> <li><a href="http://www.catehuston.com/blog/">Accidentally in Code</a> by <a href="https://twitter.com/catehstn">@catehstn</a></li> <li><a href="http://ericasadun.com/">Erica Sadun</a></li> <li><a href="http://www.mistys-internet.website/blog/">The Future Is Now</a> by <a href="https://twitter.com/mistydemeo">@mistydemeo</a></li> <li><a href="http://khanlou.com/">KHANLOU.COM</a></li> <li><a href="http://natashatherobot.com/">Natasha The Robot</a> by <a href="https://twitter.com/NatashaTheRobot">@NatashaTheRobot</a></li> <li><a href="http://blog.ashleynh.me/">Ashley Nelson-Hornstein</a> </li> </ul><![CDATA[Contributing to Magento2]]>https://www.timbroder.com/2015/01/contributing-to-magento2https://www.timbroder.com/2015/01/contributing-to-magento2Wed, 07 Jan 2015 17:04:00 GMT<p>The Magento2 dev team is now using Github in the traditional sense: They have an internal repo that gets pushed out to github at the end of their sprint. All commits stay intact. This is WAY better than the previous method of pushing a giant commit with everything each sprint.</p> <p>Ben has a <a href="http://bhmarks.com/blog/contributing-to-magento-2/">good walkthrough</a> on submitting a pull request to the repo. He links to a few resources to get up and running on the new platform.  Alan Kent goes into more <a href="https://alankent.wordpress.com/2014/12/27/behind-the-recent-magento-2-github-changes/">detail</a> on the “why” of the change.</p> <p>It’s not just code that has been opened up. The <a href="https://alankent.wordpress.com/2014/12/20/about-magento-2-0-developer-documentation/">documentation</a> lives on Github now too.</p> <p>These are all great changes. The more eyes we have on code the better. Do your part: <a href="https://github.com/magento/magento2">Install</a> the Magento 2 developer preview and get testing</p><![CDATA[My $2375 Amazon EC2 Mistake]]>https://www.timbroder.com/2015/01/my-2375-amazon-ec2-mistakehttps://www.timbroder.com/2015/01/my-2375-amazon-ec2-mistakeWed, 07 Jan 2015 16:02:04 GMT<p>A word of warning: Know what your modules/extensions/pods/plugins are doing, <strong>especially</strong> if they use any of your credentials.</p> <p>I’m actually surprised that this actually was up that long. I accidentally did this once and Amazon was on the phone with me 10 mins later.</p> <blockquote> <p>Turns out through the S3 API you can actually spin up EC2 instances, and my</p> </blockquote> <p>key had been spotted by a bot that continually searches GitHub for API keys. Amazon AWS customer support informed me this happens a lot recently, hackers have created an algorithm that searches GitHub 24 hours per day for API keys… Once it finds one it spins up max instances of EC2 servers to farm itself bitcoins…</p> <blockquote> <p>Boom! A $2375 bill in the morning. Just for trying to learn rails.</p> </blockquote><![CDATA[The Programmer's Dream]]>https://www.timbroder.com/2014/12/the-programmers-dreamhttps://www.timbroder.com/2014/12/the-programmers-dreamFri, 26 Dec 2014 14:59:48 GMT<p>Great short piece by Nick Bradbury</p> <blockquote> <p>Programmers dream of new code.</p> </blockquote> <blockquote> </blockquote> <blockquote> <p>We spend a good deal of our time working on code we didn’t write for</p> </blockquote> <p>software we didn’t create, much of which we believe is horribly written (or, at least, could be done much better). We dream of a chance to start fresh, working from scratch on a brand new piece of software that will eventually become something someone else has to work on and believes is horribly written.</p> <blockquote> </blockquote> <blockquote> <p>If we’re lucky our software will look pretty solid from the outside. It may</p> </blockquote> <p>do weird things from time to time or very occasionally crash, but on the whole end users will think it’s stable and well thought out. Those of us who can look at it from the inside are amazed by this because we see a house of cards just waiting to come tumbling down. I think one of the benefits of open source is that we can see more clearly that everyone else’s code is just as frightening as our own is.</p> <p><a href="http://nickbradbury.com/2014/12/11/the-programmers-dream-a-ramble/" title="Keep reading">Keep reading</a></p><![CDATA[Integrated Automation for iOS 8]]>https://www.timbroder.com/2014/12/integrated-automation-for-ios-8https://www.timbroder.com/2014/12/integrated-automation-for-ios-8Sat, 20 Dec 2014 21:34:24 GMT<p>I can't wait to play with <a href="https://appsto.re/us/2IzJ2.i&#x26;at=11laRZ&#x26;ct=LCP">Workflow</a> more over the holidays</p> <blockquote> <p>“Workflow – first teased by Ari Weinstein and team in January 2014 – takes</p> </blockquote> <p>another approach: instead of relying heavily on a specific functionality (such as text editing) or third-party apps and services (like IFTTT and Dropbox), Workflow is primarily aimed at automating native iOS apps and features.</p> <blockquote> </blockquote> <blockquote> <p>Workflow can automate Calendar events and Reminders, it can parse and</p> </blockquote> <p>extract data from webpages in Safari, and it has full support for Photos and sharing services. It even works with iCloud Drive and extensions. Workflow’s first version lacks some obvious features like backup and sync, but what it does today is an extremely powerful proposition – from both practical and conceptual standpoints.”</p><![CDATA[Apple Pay and Magento]]>https://www.timbroder.com/2014/12/apple-pay-and-magentohttps://www.timbroder.com/2014/12/apple-pay-and-magentoSat, 13 Dec 2014 23:12:12 GMT<p><strong>The Business of Apple Pay</strong> (Alec Simonson)</p> <p>On the outset, Apple Pay is very cool and could very well be the wave of the future. A lot of this hinges on “what’s under the hood” in terms of Apple’s contract with the leading credit card companies who helped with the development. If everything is open, and companies like Samsung can let their customers pay with NFC technology as well, I could see this as something that will be successful, adopted, and an example of Apple leading the way. However, if Apple goes all proprietary (as they love to do) and contractually forces these major credit cards to only use their devices, or charges other companies like Samsung to license their payment platform, or otherwise mandate that all touch-to-pay via smartphone methods are hereby known as “Apple Pay,” I could see adoption problems happening. Open standards have frequently been key to paving the way to adoption, and this has never really been Apple’s model in the past. For example, AirPlay is really cool and loved but does not work outside the environs of iOS, and can therefore never reach greater than 14.8% penetration as of this writing. So Chromecast was born, and while not nearly as simple or feature rich, it’s open to both Android and iOS and therefore has a much higher potential of adoption. Feature expansion will follow.</p> <p>One of the aspects of Apple Pay that I think is great is that merchants aren’t really troubled with much of everything, since most of this is really on the backend. A new reader with NFC capabilities, and they’re off and running. Low cost or no cost adoption. Or is it? Nobody has mentioned what Apple’s commission is on this latest development. An article on Forbes suggested it may be around 0.2%, giving Apple $0.20 for every $100 spent. That’s not much, but when you consider what percentage that is of the credit card companies’ net (perhaps around 14%), it starts to look more substantial. Credit card companies like their investors, so it’s hard to imagine them not wanting to pass that extra cost onto merchants, who will be all-too-willing to share that with consumers.</p> <p>All of that aside, it’s very smart and forward thinking, and early adopters will likely be looked upon with jealousy by others. From an implementation perspective, adding Apple Pay will likely be as easy as it was to add Google+, and merchants will do it. But the long-term prospects will rely highly on what sort of deal Apple made….the devil is always in the details.</p> <p><strong>The Technology of Apple Pay</strong> (Tim Broder)</p> <p>Out of the gate, Pay is native app only. This leaves Magento sites at a disadvantage. In the future I’d like to see Apple open up this functionality to Safari on both mobile and desktop. Pay already has one-time number generation. This could be implemented in the browser similar to how [1Password](<a href="https://itunes.apple.com/us/app/1password-password-">https://itunes.apple.com/us/app/1password-password-</a> manager/id443987910?mt=12&#x26;at=11laRZ&#x26;ct=pro) can inject a credit card number into a form. Until something like this happens, only sites with a native app siting in front of Magento’s API will be able to take advantage.  If you are looking to investigate this space, <a href="http://meets.io/">meets.io</a>, an unofficial Magento SDK, is a great starting point.</p> <p>I’ll be curious if a developer comes up with a browser dedicated to this functionality. Tap into the Pay API and generate credit card numbers ad hoc, and bridge between Pay and e-commerce sites. Or, take it a step further and develop a custom keyboard for iOS 8. If allowed, it would be more seamless than a whole seperate browser. I say “if allowed” because there are some restrictions on what 3rd party keyboard can do. For example, they cannot touch passwords. The stock keyboard reasserts itself when tapping on a password field.</p><![CDATA[Facebook, you creepy piece of sh*t]]>https://www.timbroder.com/2014/11/facebook-creepy-piece-shthttps://www.timbroder.com/2014/11/facebook-creepy-piece-shtSun, 09 Nov 2014 02:04:35 GMT<p>I debated posting this for a few days. I’m deciding to because when I was googling for something. I found nothing. I hope this helps someone:</p> <p>A lot of people don't talk about this. Some do. Most don't. I'm not sure why. Maybe embarrassment. Maybe fear. Maybe they think they are alone. You aren't. It happens. It's real. I've talked to some people and we aren't alone.</p> <p>Laura and I have been trying to conceive for a bit. I won't go into how long, at least not right now, so don't ask. Talking to some people has helped. But, only a little. The internet, as far as we have found (Googled) doesn't have much info.</p> <p>"Just stop trying, it will happen"</p> <p>"It's so much fun!"</p> <p>"It just happened!!"</p> <p>I'm happy for these people? I really am. But at the same time F**K YOU, it’s just not that way for us.</p> <p>2 things have happened recently that have set me over the edge. We took a break this month, just casually "trying" without any kind of schedule. We randomly thought we had a bite on the line so I went to the pharmacy to buy a test. The cashier wished me congratulations when I checked out. Then she asked me if I was excited. There are so many things wrong with this type of person doing this. I had a few friends in high school that worked as a cashier at a pharmacy. They aren’t supposed to ask personal questions. If they see a classmate buying something like condoms they aren’t supposed to say anything about it to anyone. It’s private. Ok, back to the present. First of all, f<strong>k you. Second, that’s so dangerous. My response was “hopeful.” That’s about all I could get out without leaping over the register. It’s annoying enough that that is in no way shape or form the “congratulations” part of the timeline. You don’t know yet, that’s why you are getting the TEST. Second, can you imagine if we weren’t trying and something happened and this was completely unexpected. What would have been going through my head and then to hear those words? The response would have been: “Terrified, you b</strong>ch”</p> <p>The second thing happened this morning, and what spurned this post. I was still asleep. Laura was on Facebook. Facebook served her an adoption ad. Facebook, you fucking sleazy, creepy, f**king awful piece of sh*t. I don’t even want to know how you have the data to correlate that. I could probably figure it out, but that would probably end in me canceling my account. If you are going to show an ad like that (at least on Facebook), you need to KNOW that the person is looking to adopt. Not just something like “the person got married,” then “googled something baby,” and now months later, hasn’t googled “stroller”. Showing an ad like that to someone who is trying is beyond fucked up.</p> <p>Facebook: For what you did to my wife this morning, if you were a person, I would have found you, and I would have hurt you.</p><![CDATA[Twitter is not a replacement for blogs]]>https://www.timbroder.com/2014/11/twitter-is-not-a-replacement-for-blogs-marco-orghttps://www.timbroder.com/2014/11/twitter-is-not-a-replacement-for-blogs-marco-orgTue, 04 Nov 2014 15:21:15 GMT<blockquote> <p>Too much of my writing in the last few years has gone exclusively into</p> </blockquote> <p>Twitter. I need to find a better balance.</p><![CDATA[A Tale of Two iPhones: Part 2]]>https://www.timbroder.com/2014/10/a-tale-of-two-iphones-part-2https://www.timbroder.com/2014/10/a-tale-of-two-iphones-part-2Mon, 13 Oct 2014 15:02:46 GMT<p>My iPhone decision, posted on <a href="http://tekside.net/iphonaddict/2014/10/7/a-tale-of-two-iphones">The Tekside Network</a></p> <p>Size matters, and it’s all in how you use it. In my last post, I went through my thought process of picking a new phone. Since then, I’ve had a lot more hands on time with the 6 Plus, and came to a decision. Quick recap: Big screens are pretty, big screens are harder to fit in pockets, I read a lot, I should get a big one as a developer device.</p> <p>A coworker of mine has the 6 Plus and was gracious enough to let me use his for some lengths of time. We were both at a conference last Monday. This gave me ample walking around and sitting time with the 6 Plus. The 6 Plus sticks out of the top of my front pocket. I tried it in two different pairs of Jeans (Express and Levis). Neither pair is considered a “skinny jean”. I might have been able to get used to that. Maybe. And no, I’m not going to put it in my back pocket. Risk of bending or not, I’ll forget it’s there and do something stupid. While it “fit” in my pocket, I couldn’t slide it around. There is a decent number of times where I have my laptop on my lap; On the commuter train going into NYC or on a couch at work. When I do this with my 5s, I slide it to the side of my pocket so the laptop isn’t sitting right on it. If I left it, it would dig into my leg or eventually do something bad to the phone’s screen. Not an option with the 6 Plus (it is with the 6, I tried).</p> <p>Walking around with the 6 Plus in my front pocket wasn’t bad. I do tend to keep my hands in my pockets a lot and it was only slightly annoying. Sitting at the conference’s chairs wasn’t too horrible. I knew it was there, and it was different, but I could have gotten used to it. Back at work though, it felt very weird. At my chair at work, the phone was digging into my hip. I possibly, possibly could have gotten used to this as well. I probably would have started taking it out of my pocket to sit down. Then, knowing me I’d forget it at my desk and need it shortly after to check where I’m supposed to be or what meeting I’m supposed to be in.</p> <p>Reading on a bigger device isn’t too much of a deal breaker. I don’t mind reading through my Instapaper queue or a Kindle book on my 5s (while on the go, I have a Paperwhite at home). 90% of the time I have my backpack with me which has my laptop and iPad Mini in it. I do a lot of reading on the iPad. The 6 Plus is not big enough for reading comics so there’s no way it could ever be replaced. I’ve made my decision at this point. Getting the 6. There was one thing still on my mind though: I was worried about was doing development work and having the 6 Plus with all it’s new size classes. I do my iOS dev on nights and weekends. If I did it full time, I could justify weighing that reason over the rest of my thinking. Maybe one day. For now, I’ll stick with comfort.</p> <p>Space Gray, 64 gig 6, here I come.</p> <p><em>(I wasn’t up for renewal until Sept 22. As of this writing, my phone will show up on Oct 17)</em></p><![CDATA[My Packing List]]>https://www.timbroder.com/2014/10/my-packing-listhttps://www.timbroder.com/2014/10/my-packing-listTue, 07 Oct 2014 18:01:55 GMT<p>I’ve been <a href="http://en.wikipedia.org/wiki/Tokyo">traveling</a> for <a href="http://en.wikipedia.org/wiki/Dublin">work</a> a <a href="http://en.wikipedia.org/wiki/Raleigh,_North_Carolina">bit</a> this <a href="http://en.wikipedia.org/wiki/Warwick,_Rhode_Island">year</a>.  Sometimes with little notice and it’s helped me to have a go to packing list.  I also use it for personal trips as well. I just need less things.  I was originally managing this in <a href="https://itunes.apple.com/us/app/clear-tasks-to-do-list/id493136154?mt=8&#x26;at=11laRZ&#x26;ct=pro">clear</a>. Lately I’ve been managing it in <a href="https://itunes.apple.com/us/app/listacular-for-dropbox-rapid/id624606571?at=11laRZ&#x26;ct=pro&#x26;ls=1&#x26;mt=8">Listacular</a>. I like that this app syncs text file todo lists over dropbox. Easy to update on my Mac.</p> <ul> <li>Aftershave</li> <li><a href="http://www.amazon.com/AeroBed-Classic-Inflatable-Mattress-Pump/dp/B006FTIY26/ref=sr_1_3?sr=8-3&#x26;ie=UTF8&#x26;keywords=aerobed&#x26;tag=nyen0e-20&#x26;qid=1412704779">Air bed</a> </li> <li><a href="http://www.amazon.com/Joes-USA-Lacrosse-Balls-Massage/dp/B009FMNBV4/ref=sr_1_1?sr=8-1&#x26;ie=UTF8&#x26;keywords=lacrosse%2Bball&#x26;tag=nyen0e-20&#x26;qid=1412704743">Ball</a></li> <li>Bathing suit </li> <li>Belt</li> <li><a href="http://www.amazon.com/Bose-QuietComfort-Acoustic-Cancelling-Headphones/dp/B0054JJ0QW/ref=sr_1_1?sr=8-1&#x26;ie=UTF8&#x26;keywords=bose%2Bqc15&#x26;tag=nyen0e-20&#x26;qid=1412704762">Big headphones</a></li> <li>Boots </li> <li>Charge ipad </li> <li>Charge kindle </li> <li>Charge laptop </li> <li><a href="https://bluebottlecoffee.com/f4a9df89">Coffee</a> </li> <li>Deodorant </li> <li>Dress shirts </li> <li>Earplugs </li> <li><a href="http://www.amazon.com/Trigger-Point-Performance-Revolutionary-Roller/dp/B0040EGNIU/ref=sr_1_1?sr=8-1&#x26;ie=UTF8&#x26;keywords=trigger%2Bpoint%2Btherapy&#x26;tag=nyen0e-20&#x26;qid=1412704830">Foam roller</a> </li> <li>Hat </li> <li><a href="http://www.amazon.com/Alternative-Rocky-Hoodie-Black-Large/dp/B005CWNYUO/ref=sr_1_3?sr=8-3&#x26;ie=UTF8&#x26;keywords=american%2Bgiant&#x26;tag=nyen0e-20&#x26;qid=1412704849">Hoodie</a></li> <li>Inhalers </li> <li>Kindle </li> <li>Laptop </li> <li>Laptop charger </li> <li>Local currency </li> <li>Meds </li> <li>Money clip </li> <li><a href="http://www.amazon.com/Nightwave-Sleep-Assistant-Nw-102-Original/dp/B0036FJ7AU/ref=sr_1_1?sr=8-1&#x26;ie=UTF8&#x26;keywords=nightwave&#x26;tag=nyen0e-20&#x26;qid=1412704873">Nightwave</a> </li> <li>Pajamas </li> <li>Passport</li> <li>Phone charger </li> <li>Pillow </li> <li>Razor</li> <li>Sandles </li> <li>Shaving cream</li> <li>Shorts</li> <li>Small Headphones</li> <li>Socks </li> <li>Sunglasses </li> <li>Toothbrush </li> <li>Toothpaste </li> <li>Tshirts </li> <li>Undershirts </li> <li>Underwear </li> <li><a href="http://www.amazon.com/Vestal-Unisex-DIG008-Digichord-Digital/dp/B0039YT6WM/ref=sr_1_5?sr=8-5&#x26;ie=UTF8&#x26;keywords=vestal%2Bwatch&#x26;tag=nyen0e-20&#x26;qid=1412704898">Watch</a> </li> <li>Workout clothes </li> <li>Yoga Matt </li> <li>iPad </li> <li>iPhone</li> </ul><![CDATA[Meet Magento 2014 New York – a Personal Summary]]>https://www.timbroder.com/2014/10/meet-magento-2014-new-york-a-personal-summaryhttps://www.timbroder.com/2014/10/meet-magento-2014-new-york-a-personal-summarySun, 05 Oct 2014 22:56:35 GMT<p>Alan Kent, Chief Architect of Magento 2 has a great write up of Meet Magento NY</p> <blockquote> <p>Tim Broder of Alexander Interactive talked about his use of Vagrant to build</p> </blockquote> <p>standard images, ensuring more consistent development environments for all users. He pointed out you can have a Vagrant container mount a file system from your local laptop so you can use a local IDE while having the files run in a standard Vagrant environment image. In development you may mount it read/write and in production read-only. The idea was to ensure all developers had a consistent supported environment. Oh, and he mentioned a few times “Vagrant Share” which allows you to share your environment with anyone in the world. This looked really useful when collaborating with clients as you can guarantee they have the same set up as you are using to develop the code.</p><![CDATA[A Tale of Two iPhones]]>https://www.timbroder.com/2014/10/a-tale-of-two-iphoneshttps://www.timbroder.com/2014/10/a-tale-of-two-iphonesSun, 05 Oct 2014 20:59:39 GMT<p>I wrote up my thoughts on picking a new phone over on <a href="http://tekside.net/iphonaddict/2014/9/23/a-tale-of-two-iphones">the Tekside Network.</a></p> <p>It’s almost upgrade time. Normally this is an easy decision: get the new phone. Apple threw us a curve ball this year by launching two entirely new phones. Now every Apple fan has a choice to make and it's a much, much harder choice than the 5s vs. the underpowered 5c last year.  This year’s choice boils down to screen size. Yes, granted, the 6 Plus has better battery life and a better camera. Those two things will influence the choice of some people. Their scope pales in comparison to SIZE.  During the keynote, when Apple announced the size, my initial reaction was to go with the 6. My gut reaction to the 6 Plus was “No. NO. No. It’s too big! It’s never going to fit in my pocket. WHY would anyone buy that? NO.”  Now, I’m not so sure.</p> <p>Let me take a step back. I’ve had big phones in the past. Prior to switching to iPhone, I was the Android guy at work. I liked how configurable it was and how it bashed the iPhone’s battery life, lack of copy/paste, and it’s “closed system”. We’re not going down that rabbit hole today though. The point is, I never had a “small” iPhone. I had a Droid, an Incredible, and a Galaxy Nexus. Each one getting bigger with the Nexus capping out at 4.65 inches. I really, really liked that size. Then for a number of reasons, I switched to iPhone. I was tired of apps crashing. I wanted something new and slick and I started writing apps for it. I picked up an iPhone 5, entering in at that form factor. I LOVED it.  It took a week or so for it to stop feeling small, but then it felt perfect.</p> <p>I initially thought: “The 6 is 4.7 inches and has a 3x screen? I’ve had that screen size before. Done.” I can upgrade on Sept 22 and now I don’t even have to think about it. I know what I’m going to get.</p> <p>It’s currently Sunday, Sept 21. On Friday, a few 6’s started getting delivered to work.  They exceeded everything I thought about the phone. They look great and the screen is insane. I'm still very happy with my decision.</p> <p>Now some doubts are starting to pop up…  I poked around in Xcode and I’m seeing the things the 6 Plus does under the hood with screen layout. On Twitter, I’m seeing other devs talking about how the 6 Plus behaves. As a developer, wouldn’t it be the responsible decision to get the bigger phone so I understand how it acts first hand?  Do I need the better battery life? I read on my phone a lot, but I like reading on my Retina Mini more. The screen is gorgeous. Can I really pass that up?</p> <p>Even with all of these questions, the choice still boils down to size. Will it fit comfortably in my pocket? That is the deal breaker. On Monday, I’m going to borrow a coworkers 6 Plus for an hour or so and sit with it in my pocket. I’m going to walk around with it. I’m going to climb some stairs. If it’s just too big, the 6+ is out. If it’s something I think I can adjust to, I am SO in.</p><![CDATA[These are the apps you want to try on your new iPhone]]>https://www.timbroder.com/2014/09/these-are-the-apps-you-want-to-try-on-your-new-iphonehttps://www.timbroder.com/2014/09/these-are-the-apps-you-want-to-try-on-your-new-iphoneSat, 20 Sep 2014 15:18:31 GMT<blockquote> </blockquote> <p>iOS 8 offers a whole range of features that let apps extend themselves — into other apps, and even into widgets inside notification center.</p> <p>This is a great writeup of how exciting things are getting in the ecosystem for both new and old apps alike</p><![CDATA[On Morning Rituals]]>https://www.timbroder.com/2014/09/morning-ritualshttps://www.timbroder.com/2014/09/morning-ritualsTue, 16 Sep 2014 15:51:28 GMT<p>Rituals are important. I’m a creature of habit. But, I had never characterized some of the things I do as rituals.  I read some posts by <a href="http://www.caseyliss.com/2014/6/28/go-pack">Casey Liss</a> and <a href="http://david-smith.org/blog/2014/05/22/my-travel-coffee-kit/">David Smith</a> that were not unlike some of the things I do.  I like repetition. I like not having to think about a decision or even make one to begin with.  Similar things for breakfast each day. If I cook a big meal I’ll have the leftovers for subsequent meals until they are gone.</p> <p>Having these rituals help me get my day going. They let me know that all is right in the world.</p> <p>My morning ritual is something of a decision tree:</p> <p><strong>Gym</strong></p> <p>I used to go to my gym a lot more often; 4-6 days a week. Adding in runs on top of that if I was training for a race. Lately 3 days a week seems to be my norm. I’ve grown to be ok with this. Personal and work stress are adding up, and that’s what I can do right now. Which is funny because the gym is a <em>huge</em> stress relief for me. But, I digress.  If I go to the gym, I shower at the gym after my workout, then walk to work.  I either have breakfast with me or I pick it up on the way to the office. If I have it with me, it means I cooked it the night before: 3-4 eggs fried in coconut oil, seasoning, maybe some sourcraut (It’s a lot better than you think it is). If I pick it up it’s some kind of veggie omelet or scrambled eggs with a vegetable. This has been my morning gym ritual for about 5 years now.  I started drinking coffee about a year ago. I have a half cup from the pot of work if I eat breakfast there.  I add 2 cubes of ice to it from work’s freezer.  I want to drink it immediately and this brings it to the right temperature for my taste. Having this repetition helps me start my day. I usually eat my food at the cafe table, with my laptop, doing a quick pass of email.  I’m trying to shift this into <em>doing</em> something with the first hour of my day, not just drowning in email.</p> <p>Wakeup time: 5:35am. Catch 6:07 train into the city. My clothes are laid out the night before. Wakeup, chug protein shake so I’m not starving, wash face, brush teeth, do inhaler, run to train.</p> <p><strong>Home</strong></p> <p>If I sleep in, I eat and have coffee at home.  I’ll wakeup and jump in the shower to wake up a little. Breakfast will be 3 eggs and sometimes a few strips of bacon.  I put the frying pan on high. While it’s heating up I put the kettle on.  I crack a few eggs into the pan. While they are sitting, I start getting the Aeropress ready.  I love the Aeropress. It’s perfect for a single cup, or even 2 if I’m making one for Laura. I get my coffee from <a href="https://tonx.org/f4a9df89">Tonx</a>. If you aren’t familiar with them, I highly recommend. You get your coffee every 2 weeks for a monthly fee. The beans are roasted fresh, which apparently augments the taste.  I don’t have to worry about running out, or remembering to pick some up from the store. It just shows up. Less stress.  The amount of coffee I drink is perfect for their lowest plan. At most I end up with an extra cup and a half of beans. It’s very, very rare that I run out. I also tried Drifwaway coffee which I <strong>really</strong> liked. They send you a sample pack of 4 types of coffee. You rate each one and this effects what your shipments are in the future. I consistently got something I really enjoyed. I occasionally get something I’m not a big fan of with Tonx.  You might wonder why I don’t just pick 1 thing and stick with it. That would be less stress, actually. But, I’m still getting into coffee and exploring what I like. I can’t tell you right now what type of coffee I like using the right terminology. But, Driftaway’s shipment size was too big for me, I ended up having a decent amount leftover.</p> <p>Wakeup time: in between 7 and 8, depending on what my morning for work looks like</p> <p><strong>Run</strong></p> <p>I may, like I did this morning, get up 30-60 mins before my sleep in time and get a run in.  If it’s going to be raining I’ll opt for this. I love running in the rain.  The amount of running I’ve been doing recently has dropped drastically. I’m trying to get back into it. I really do love it. After the run, I fall into what I normally do at home.</p> <p>I use an alarm for all of these. For the gym, I’ll set the <a href="http://www.amazon.com/Sony-Machine-Cassette-Player-Icf-cs650/dp/B00KNKJYQS?tag=nyen0e-20">Sony clock radio</a> I’ve had since I was 6. I’m amazed it still works, though it took me a while to find a link to it online. I wake up at the same time for the gym, no matter the day. I just flip on the alarm. Laura keeps it tuned to NPR, so I wake up to that.  The other days I’ll use my phone. Siri sets alarms for whatever time I need.</p> <p>I never snooze. Never have, don’t think I ever will.  If I’m not going to get up until 20 mins later, I’d rather just get that as real sleep time.  My alarm clock has always been in a place where I have to get up to turn it off. (This was particularly helpful in college. I woke up at 4:40 for practice. Sleep was very valuable)</p> <p>If you are frazzled in the morning or feel stressed out getting ready for work, think about repetition. What would you want to do every morning? What of your routine can be ritualized?</p> <p>If you did a few things the night before (pick clothes) would that lessen your stress in the morning? Think about it. I love it. If you have any rituals that help you start your day, or lower your stress, let me below in the comments or on</p><![CDATA[The Rise and Fall of Communication Mediums]]>https://www.timbroder.com/2014/09/the-rise-and-fall-of-communication-mediumshttps://www.timbroder.com/2014/09/the-rise-and-fall-of-communication-mediumsSun, 07 Sep 2014 20:49:49 GMT<p><a href="http://inessential.com/2014/08/27/waffle_on_social_media">Brent Simmons</a>:</p> <blockquote> <p>My blog’s older than Twitter and Facebook, and it will outlive them. It has</p> </blockquote> <p>seen Flickr explode and then fade. It’s seen Google Wave and Google Reader come and go, and it’ll still be here as Google Plus fades. When Medium and Tumblr are gone, my blog will be here.</p> <blockquote> </blockquote> <blockquote> <p>The things that will last on the internet are not owned. Plain old websites,</p> </blockquote> <p>blogs, RSS, irc, email.</p> <p><a href="http://www.marco.org/2014/08/27/brentwaffle">Marco Arment</a>:</p> <blockquote> <p>This is why I’m still championing blogs, RSS, and using your own domain even</p> </blockquote> <p>though supposedly “everyone” has moved to social networks.</p> <p>I’m very, very glad I started blogging 7 years ago.  I started out just wanting to help people. I’ve continued posting code both for tutorial purposes and to work through my own problems. At some times it’s been a voice for me, and I’ve dabbled in commentary.  Facebook is older than this blog, but I’m fairly close to Twitter.  I never thought we’d see the day when Google Reader would shut down. These days Google doesn’t surprise me anymore. Which, should say something. I was a <a href="http://timbroder.com/2007/07/begining.html">HUGE</a> Google fanboy. Since moving off blogger, I’ve managed the servers and software that run this blog. I plan on being around for a long time. It’s too much fun to stop</p><![CDATA[Don't Skimp on Coffee: A CTO's Plea]]>https://www.timbroder.com/2014/08/dont-skimp-on-coffee-a-ctos-pleahttps://www.timbroder.com/2014/08/dont-skimp-on-coffee-a-ctos-pleaThu, 21 Aug 2014 13:56:27 GMT<p>My friend <a href="https://twitter.com/mshmsh5000">Matt</a>, CTO of <a href="https://www.dosomething.org/">DoSomething.org</a>, posted a great article on the importance of coffee, ritual, and how they relate to the happiness, productivity, and health of your company</p> <blockquote> <p>If you’re looking for an office Rosetta Stone, a way to assess company</p> </blockquote> <p>culture across industries, coffee is it.</p><![CDATA[Podcast Reruns]]>https://www.timbroder.com/2014/08/podcast-rerunshttps://www.timbroder.com/2014/08/podcast-rerunsMon, 18 Aug 2014 18:06:58 GMT<p>Last year, I had been plowing through old episodes of a few Tech podcasts. I was able to get through all of <a href="http://developingperspective.com/">Developing Perspective</a> (they are short) and was working on <a href="http://5by5.tv/buildanalyze">Build and Analyze</a>.  I’m halfway-ish through B&#x26;A, but my listening has died off in leu of new episodes of <a href="http://timbroder.com/podcasts">other shows</a>.</p> <p>I’ve missed listening to it.  The reason it dropped of is playlist related. Everything I listen to is in one playlist that I prune from time to time. I didn’t add B&#x26;A to it because I didn’t want to have to download each episode each time. I downloaded them all at once. If I added it to the playlist, all 108 episodes would have shown up.  I had a separate playlist just for this show. But, I would forget about it.</p> <p>I got to thinking about reruns. TV has them. YouTube has them.  Why not this medium?  Whether specifically for podcasts or RSS feeds in general, I thought something might exist. Something that would take a feed and give back the items at a pubDate+days interval. This way, whatever you consume the feeds with, will think it’s new. This could be done by modifying the pubDate, though some feed scrapers might not care that a pubDate might be in the future.  The other method would be to restrict a feed based on a range of days (or weeks for Podcasts).</p> <p>I googled around for a bit. The back of my mind thinks it remembers something from…. 5 or so years ago? No luck. Then I wanted to build a service to do it… Then I remembered time is scarce these days. Yahoo Pipes to the rescue!!</p> <p>I got a pipe working that overcast would accept and process. Then tweaked it for more public consumption.</p> <p><a href="http://pipes.yahoo.com/timbroder/podcastreruns">http://pipes.yahoo.com/timbroder/podcastreruns</a></p> <p>The Pipe has 3 inputs (listed in a different order from that link for ease of explanation)</p> <ul> <li>Feed URL: Paste in the url of your podcast feed here</li> <li>How Many Weeks ago to start: This is when in the podcast to start pulling from. If want to start at the very first episode, use the number of weeks between when the episode first aired, and now.  I want to start B&#x26;A at episode 49. It aired on 10/24/2011. It’s currently 7/29/2014. So, I want to start 145 weeks ago</li> <li>How many episodes do you want per week: This depends on how much you want, and how often the podcast released episodes.  If it was a weekly podcast and you want to get 1 episode a week, put 1. If it was weekly and you want 4 episodes a week to catch up faster, put 4.  What this is doing is loading all the feed items in between the “start week” and this number at once. Podcasts that come out more than once a week will be multiplied by this number</li> </ul> <p>Configure as needed, then cick “Run Pipe” to confirm you see the appropriate episodes. Then, grab the RSS url for this configuration. Load this URL into your pod catcher.</p> <p><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <a class="gatsby-resp-image-link" href="/static/d267a1b21722b401e290122f0c70cdce/442cb/2014-07-29_16021.png" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 62.65822784810127%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB+ElEQVR42p2T627UMBCF8/A8C8+BxEWI8qt/6O4CLdkkzsa52I6d2yb5kL3blKpFSIx0NLKUnDlzZiYSIic/nRBCUJYV0zThY11XnmIN73/BR7Tf7zkc9ux2d+S5YJpG1mVmns+czxdM54Vl+bMAW9EXhLJpiaUlk4ZEtqSyJSkMQmra1mJti3Yj43m9kvDX8KSR7QaUHWi7AeMGWjdgbB/y1vbqFXrVM8uyBKzzjLOWumlQ2oROgsKmaairkkIWVFVJXdcYrS8whr7vGceRrutwzj1TtADT1RZfLBCmQiDLKrSnjcG5bvshFTlJmiJlSZ6faOqLGqs1w+d3jLc3L/yMpnHY5D6rfHfLZLxahVI1WjV0ztIajbMtnUjoyoJxHEIXm0KhJky/cqxnvscNZaLoqpr9py/cHHpiDXUHTe+xULkFPSxbcU9mrX0ifPOh4/1eY3XDMc05iRwpUjLZcJ8bjnmJLBvK6gJZ1ZS+dT8MpYLPRVFs/kZvvzo+7hSHpGGXar4liqwyuFZjjQot6uuQfG6NQStFGGZdh+y994MLhFkaB+N//kq4j1N+PMQkmSA+JmQiD/khvnyTZBnHJAkD8op8AedsuKTHa4pmv1NhQkuA37n1umuvwXv1uJ/9GUq7ItuZfrr4GvGf4Un9OZ6XlXlZtwv6DXQW7AyW2+B9AAAAAElFTkSuQmCC'); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="2014 07 29 1602" title="" src="/static/d267a1b21722b401e290122f0c70cdce/f058b/2014-07-29_16021.png" srcset="/static/d267a1b21722b401e290122f0c70cdce/c26ae/2014-07-29_16021.png 158w, /static/d267a1b21722b401e290122f0c70cdce/6bdcf/2014-07-29_16021.png 315w, /static/d267a1b21722b401e290122f0c70cdce/f058b/2014-07-29_16021.png 630w, /static/d267a1b21722b401e290122f0c70cdce/442cb/2014-07-29_16021.png 752w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span></p> <p>I’ve been testing this for a few weeks now and it’s working great! Another good use would be [Overcast’s](<a href="https://itunes.apple.com/us/app/overcast-">https://itunes.apple.com/us/app/overcast-</a> podcast-player/id888422857?mt=8&#x26;at=11laRZ&#x26;ct=pro) “Retired Greats” Section:</p> <p> <span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 600px; " > <a class="gatsby-resp-image-link" href="/static/ab4e8a272e531f6ce4dbbee3f99dac82/b4294/overcast1.jpg" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 88.60759493670886%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAASABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUEBgL/xAAWAQEBAQAAAAAAAAAAAAAAAAABAAL/2gAMAwEAAhADEAAAAZ1mNaLQ8J5/ozWdoH//xAAeEAACAQMFAAAAAAAAAAAAAAAAAgQBAxEQEhMhNP/aAAgBAQABBQIjs3HucwRerS4rpE85/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAIBAAAQMCBwAAAAAAAAAAAAAAAgABEBETITEyM2GRof/aAAgBAQAGPwJC1uvK2vYHF8lqPqAj/8QAHhAAAgICAgMAAAAAAAAAAAAAAAERMSFBYbFRgfD/2gAIAQEAAT8h5Q+kyc42R39+ikrYyurbEYsZDhufImTudiSVI//aAAwDAQACAAMAAAAQHCcA/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAEQITH/2gAIAQMBAT8QRQtj/8QAGREAAwADAAAAAAAAAAAAAAAAAAEREDFh/9oACAECAQE/EIXg9LH/xAAdEAEAAwEBAAMBAAAAAAAAAAABABEhMUFRYbHh/9oACAEBAAE/EE4xfa/jEwO7xVa/PMipFX5EwhKGOciF4LSNb9MaihGdJYFq87AWVtftAKAO4T//2Q=='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="Overcast1" title="" src="/static/ab4e8a272e531f6ce4dbbee3f99dac82/b4294/overcast1.jpg" srcset="/static/ab4e8a272e531f6ce4dbbee3f99dac82/ff44c/overcast1.jpg 158w, /static/ab4e8a272e531f6ce4dbbee3f99dac82/a6688/overcast1.jpg 315w, /static/ab4e8a272e531f6ce4dbbee3f99dac82/b4294/overcast1.jpg 600w" sizes="(max-width: 600px) 100vw, 600px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span></p> <p>If you are interested in the inner workings of this Pipe, here is a screenshot. Though, looking at this now, getting more than 1 episode a week needs some tweaking.</p> <p><a href="/images/2014/07/2014-07-29_16061.png"><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <span class="gatsby-resp-image-background-image" style="padding-bottom: 59.49367088607595%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAACFUlEQVR42nWS3W7TQBCF/f6PxEWRWqqWtkIICJQmaY3TxHb8b+96195df8ibJrQILkYza43POTNzguunnIunks+F4yazfIoledMzuIneOJRxPo9u4rnVvFs88/5+x92mZr0XXP8quXzMuIkqdpUk+LYOWT6FJGXFtqiIG0GjDdq6E+BcmwmSuuPrzweiXUxSt2wqwe3igftww1NaknWaYF+3iF7RtC2tEFRSI0aHsgewOZphjom0VSRlQyUVYjA+p2VFIxVlP3ghQaEdkXBEnSVsDYkYkaM9qLPOg18uE+6SnodCUwnlScNCELUDuRhoe418WU3wI665Cku+VhNfcsM6k55dvYw8N0ZpSVLUtNr4b5V2XIU1H7fS9/e+f/LTBNo4nLW0ZqKew0I+TGg7YaaJUhkuVns+bATfE0E/WjaV5HKVsigNm7JHjfZ0vMBfcIJF2nEWSa6SgfN44Hynuc0st7ljFdd+rH5WYSdaNbBLMzrZ+/fxeOoAaNEOtvuC1WPINsmItjHxPqfupAcS2tDpw25n+0SN5mxdcrFV3M+qX60oUMflD8ZfS+qRXChiOTKMBqEH5GiQw1yP/t30mqzuqESPNNNJnTqOfATV7jDSnLMR9hYUoCYONnrlzYM/p5O9evOXwj8sFmVBy5p0s6DYLhibHf0MbuyJ/M0/r+p/ADqUg162dOkSmS3RbepJ3vT8J34DFReYsM4764oAAAAASUVORK5CYII='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="2014 07 29 1606" title="" src="/static/5ba529a6be13c278406f52d91c250393/f058b/2014-07-29_16061.png" srcset="/static/5ba529a6be13c278406f52d91c250393/c26ae/2014-07-29_16061.png 158w, /static/5ba529a6be13c278406f52d91c250393/6bdcf/2014-07-29_16061.png 315w, /static/5ba529a6be13c278406f52d91c250393/f058b/2014-07-29_16061.png 630w, /static/5ba529a6be13c278406f52d91c250393/40601/2014-07-29_16061.png 945w, /static/5ba529a6be13c278406f52d91c250393/4fa52/2014-07-29_16061.png 1241w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </span></a></p><![CDATA[“make” time]]>https://www.timbroder.com/2014/08/make-timehttps://www.timbroder.com/2014/08/make-timeWed, 13 Aug 2014 23:13:59 GMT<blockquote> <p>We’re often told you need to “make” time, a phrase that rankles me.</p> </blockquote> <p>Drives me nuts as well. Our days are already packed. "Making time" isn't making it; it's prioritizing time. If you make time for something, you are acknowledging that the thing you are making time for has a priority at the expense of something else.</p> <blockquote> <p>That’s why it’s important to know how long something takes, or to break it</p> </blockquote> <p>down into micro projects. By doing so, you may discover that you can reclaim time “might” by being more efficient, or by delegating tasks (whether they be personal or business-related).</p> <p>This is interesting. I'd be interested in trying it and seeing where all my time is during the day. (I already track all my work hours. Outside of that) I would worry about it being consuming though. Then stressing about missed logs. Maybe</p><![CDATA[UITableViewCell Action Swiping in iOS8 and Swift]]>https://www.timbroder.com/2014/08/uitableviewcell-action-swiping-in-ios8-and-swifthttps://www.timbroder.com/2014/08/uitableviewcell-action-swiping-in-ios8-and-swiftSat, 09 Aug 2014 20:43:58 GMT<p>Mail.app in iOS7 brought swiping cells to the inbox. The iOS8 beta added a 3rd button to it.  Apple has also introduced an API to assist with creating this effect: <a href="https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UITableViewRowAction_class/index.html">UITableViewRowAction</a>. Prior to this, I used <a href="https://github.com/CEWendel/SWTableViewCell">SWTableViewCell</a>.</p> <p><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 577px; " > <a class="gatsby-resp-image-link" href="/static/1d68da34f66c552bd72d02612229e800/b739f/14870105002_77af4bf515_b.jpg" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 59.49367088607595%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAgABBf/EABUBAQEAAAAAAAAAAAAAAAAAAAED/9oADAMBAAIQAxAAAAHtlkBbFf/EABsQAAEEAwAAAAAAAAAAAAAAAAABAhITAxEh/9oACAEBAAEFAuITYTYakVsKsZ//xAAYEQACAwAAAAAAAAAAAAAAAAAAAREjQf/aAAgBAwEBPwFzhWf/xAAYEQACAwAAAAAAAAAAAAAAAAAAAREhQf/aAAgBAgEBPwFzhZ//xAAYEAEBAQEBAAAAAAAAAAAAAAAAMgERIf/aAAgBAQAGPwL1WKxzUpf/xAAbEAEAAgIDAAAAAAAAAAAAAAABABEQITFRYf/aAAgBAQABPyHTep2wDjC6AjZc1VSeWf/aAAwDAQACAAMAAAAQQ+//xAAYEQACAwAAAAAAAAAAAAAAAAAAETFhof/aAAgBAwEBPxCAK2H/xAAWEQEBAQAAAAAAAAAAAAAAAAAAIYH/2gAIAQIBAT8QgZf/xAAZEAEAAwEBAAAAAAAAAAAAAAABACExEZH/2gAIAQEAAT8QVTBPDgQJQGqMtXZ7pB9FQZeoulxZtfZ//9k='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="14870105002 77af4bf515 b" title="" src="/static/1d68da34f66c552bd72d02612229e800/b739f/14870105002_77af4bf515_b.jpg" srcset="/static/1d68da34f66c552bd72d02612229e800/ff44c/14870105002_77af4bf515_b.jpg 158w, /static/1d68da34f66c552bd72d02612229e800/a6688/14870105002_77af4bf515_b.jpg 315w, /static/1d68da34f66c552bd72d02612229e800/b739f/14870105002_77af4bf515_b.jpg 577w" sizes="(max-width: 577px) 100vw, 577px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span></p> <p>Below is how to get the basic functionality working. Please note that you have to implement the 2nd function whether it has a body or not</p> <div class="gatsby-highlight" data-language="swift"><pre style="counter-reset: linenumber NaN" class="language-swift line-numbers"><code class="language-swift"><span class="token keyword">class</span> <span class="token class-name">TIMUITableViewDelegate</span><span class="token punctuation">:</span> <span class="token class-name">NSObject</span><span class="token punctuation">,</span> <span class="token class-name">UITableViewDelegate</span> <span class="token punctuation">{</span> <span class="token keyword">func</span> <span class="token function-definition function">tableView</span><span class="token punctuation">(</span>tableView<span class="token punctuation">:</span> <span class="token class-name">UITableView</span><span class="token operator">!</span><span class="token punctuation">,</span> editActionsForRowAtIndexPath indexPath<span class="token punctuation">:</span> <span class="token class-name">NSIndexPath</span><span class="token operator">!</span><span class="token punctuation">)</span> <span class="token operator">-&amp;</span>gt<span class="token punctuation">;</span> <span class="token punctuation">[</span><span class="token class-name">AnyObject</span><span class="token punctuation">]</span><span class="token operator">!</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> shareAction <span class="token operator">=</span> <span class="token class-name">UITableViewRowAction</span><span class="token punctuation">(</span>style<span class="token punctuation">:</span> <span class="token punctuation">.</span><span class="token class-name">Normal</span><span class="token punctuation">,</span> title<span class="token punctuation">:</span> <span class="token string-literal"><span class="token string">"Share"</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">(</span>action<span class="token punctuation">,</span> indexPath<span class="token punctuation">)</span> <span class="token operator">-&amp;</span>gt<span class="token punctuation">;</span> <span class="token class-name">Void</span> <span class="token keyword">in</span> tableView<span class="token punctuation">.</span>editing <span class="token operator">=</span> <span class="token boolean">false</span> <span class="token function">println</span><span class="token punctuation">(</span><span class="token string-literal"><span class="token string">"shareAction"</span></span><span class="token punctuation">)</span> <span class="token punctuation">}</span> shareAction<span class="token punctuation">.</span>backgroundColor <span class="token operator">=</span> <span class="token class-name">UIColor</span><span class="token punctuation">.</span><span class="token function">grayColor</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">var</span> doneAction <span class="token operator">=</span> <span class="token class-name">UITableViewRowAction</span><span class="token punctuation">(</span>style<span class="token punctuation">:</span> <span class="token punctuation">.</span><span class="token class-name">Default</span><span class="token punctuation">,</span> title<span class="token punctuation">:</span> <span class="token string-literal"><span class="token string">"Done"</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">(</span>action<span class="token punctuation">,</span> indexPath<span class="token punctuation">)</span> <span class="token operator">-&amp;</span>gt<span class="token punctuation">;</span> <span class="token class-name">Void</span> <span class="token keyword">in</span> tableView<span class="token punctuation">.</span>editing <span class="token operator">=</span> <span class="token boolean">false</span> <span class="token function">println</span><span class="token punctuation">(</span><span class="token string-literal"><span class="token string">"readAction"</span></span><span class="token punctuation">)</span> <span class="token punctuation">}</span> doneAction<span class="token punctuation">.</span>backgroundColor <span class="token operator">=</span> <span class="token class-name">UIColor</span><span class="token punctuation">.</span><span class="token function">greenColor</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">var</span> deleteAction <span class="token operator">=</span> <span class="token class-name">UITableViewRowAction</span><span class="token punctuation">(</span>style<span class="token punctuation">:</span> <span class="token punctuation">.</span><span class="token class-name">Default</span><span class="token punctuation">,</span> title<span class="token punctuation">:</span> <span class="token string-literal"><span class="token string">"Delete"</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">(</span>action<span class="token punctuation">,</span> indexPath<span class="token punctuation">)</span> <span class="token operator">-&amp;</span>gt<span class="token punctuation">;</span> <span class="token class-name">Void</span> <span class="token keyword">in</span> tableView<span class="token punctuation">.</span>editing <span class="token operator">=</span> <span class="token boolean">false</span> <span class="token function">println</span><span class="token punctuation">(</span><span class="token string-literal"><span class="token string">"deleteAction"</span></span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token punctuation">[</span>deleteAction<span class="token punctuation">,</span> doneAction<span class="token punctuation">,</span> shareAction<span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function-definition function">tableView</span><span class="token punctuation">(</span>tableView<span class="token punctuation">:</span> <span class="token class-name">UITableView</span><span class="token operator">!</span><span class="token punctuation">,</span> commitEditingStyle editingStyle<span class="token punctuation">:</span> <span class="token class-name">UITableViewCellEditingStyle</span><span class="token punctuation">,</span> forRowAtIndexPath indexPath<span class="token punctuation">:</span> <span class="token class-name">NSIndexPath</span><span class="token operator">!</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>I can’t get the (-) delete indicator to appear when I put the table into edit mode though. Setting UITableViewCell.shouldIndentWhileEditing = NO is supposed to disable this effect. I’ve tried setting it in 3 places:</p> <ul> <li>On the cell directly </li> <li>In interface builder: <a href="http://screencast.com/t/TUg7To46vKd0">http://screencast.com/t/TUg7To46vKd0 </a></li> <li>In the appropriate delegate method</li> </ul> <p>I’ve had to add some workarounds to deal with this for now.  I’ve filed <a href="http://openradar.appspot.com/17969970">rdar://17969970</a> against this. For now, this is how I’m handling by checking if I’m already in edit mode when I build out the actions array. This isn’t ideal at all. I don’t even want to be able to delete when I’m in edit mode, just reorder. Apologies for switching back to obj-c. The delegate I’m working in is older.</p> <div class="gatsby-highlight" data-language="swift"><pre style="counter-reset: linenumber NaN" class="language-swift line-numbers"><code class="language-swift"><span class="token operator">-</span> <span class="token punctuation">(</span>void<span class="token punctuation">)</span> endEditing <span class="token punctuation">{</span> <span class="token keyword">self</span><span class="token punctuation">.</span>editMode <span class="token operator">=</span> <span class="token constant">NO</span><span class="token punctuation">;</span> <span class="token keyword">self</span><span class="token punctuation">.</span>editControlButton<span class="token punctuation">.</span>title <span class="token operator">=</span> @<span class="token string-literal"><span class="token string">"Reorder"</span></span><span class="token punctuation">;</span> <span class="token punctuation">[</span><span class="token keyword">self</span> setEditing<span class="token punctuation">:</span><span class="token constant">NO</span> animated<span class="token punctuation">:</span><span class="token constant">YES</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">//[self.tableView reloadData];</span> <span class="token punctuation">}</span> <span class="token operator">-</span> <span class="token punctuation">(</span>void<span class="token punctuation">)</span> startEditing <span class="token punctuation">{</span> <span class="token keyword">self</span><span class="token punctuation">.</span>editMode <span class="token operator">=</span> <span class="token constant">YES</span><span class="token punctuation">;</span> <span class="token keyword">self</span><span class="token punctuation">.</span>editControlButton<span class="token punctuation">.</span>title <span class="token operator">=</span> @<span class="token string-literal"><span class="token string">"Done"</span></span><span class="token punctuation">;</span> <span class="token punctuation">[</span><span class="token keyword">self</span><span class="token punctuation">.</span>tableView setEditing<span class="token punctuation">:</span><span class="token constant">YES</span> animated<span class="token punctuation">:</span><span class="token constant">YES</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token other-directive property">#pragma</span> <span class="token operator">-</span> mark <span class="token class-name">UITableViewDelegate</span> <span class="token operator">-</span> <span class="token punctuation">(</span><span class="token constant">BOOL</span><span class="token punctuation">)</span>tableView<span class="token punctuation">:</span><span class="token punctuation">(</span><span class="token class-name">UITableView</span> <span class="token operator">*</span><span class="token punctuation">)</span>tableView canEditRowAtIndexPath<span class="token punctuation">:</span><span class="token punctuation">(</span><span class="token class-name">NSIndexPath</span> <span class="token operator">*</span><span class="token punctuation">)</span>indexPath <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token constant">YES</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator">-</span> <span class="token punctuation">(</span><span class="token class-name">UITableViewCellEditingStyle</span><span class="token punctuation">)</span>tableView<span class="token punctuation">:</span><span class="token punctuation">(</span><span class="token class-name">UITableView</span> <span class="token operator">*</span><span class="token punctuation">)</span>tableView editingStyleForRowAtIndexPath<span class="token punctuation">:</span><span class="token punctuation">(</span><span class="token class-name">NSIndexPath</span> <span class="token operator">*</span><span class="token punctuation">)</span>indexPath <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token class-name">UITableViewCellEditingStyleDelete</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator">-</span> <span class="token punctuation">(</span><span class="token constant">BOOL</span><span class="token punctuation">)</span>tableView<span class="token punctuation">:</span><span class="token punctuation">(</span><span class="token class-name">UITableView</span> <span class="token operator">*</span><span class="token punctuation">)</span>tableview shouldIndentWhileEditingRowAtIndexPath<span class="token punctuation">:</span><span class="token punctuation">(</span><span class="token class-name">NSIndexPath</span> <span class="token operator">*</span><span class="token punctuation">)</span>indexPath <span class="token punctuation">{</span> <span class="token class-name">NSLog</span><span class="token punctuation">(</span>@<span class="token string-literal"><span class="token string">"shouldIndentWhileEditingRowAtIndexPath"</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token constant">NO</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator">-</span> <span class="token punctuation">(</span>void<span class="token punctuation">)</span>tableView<span class="token punctuation">:</span><span class="token punctuation">(</span><span class="token class-name">UITableView</span> <span class="token operator">*</span><span class="token punctuation">)</span>tableView didSelectRowAtIndexPath<span class="token punctuation">:</span><span class="token punctuation">(</span><span class="token class-name">NSIndexPath</span> <span class="token operator">*</span><span class="token punctuation">)</span>indexPath <span class="token punctuation">{</span> <span class="token class-name">TCORead</span> <span class="token operator">*</span>item <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token keyword">self</span><span class="token punctuation">.</span>fetchedResultsControllerDataSource selectedItem<span class="token punctuation">]</span><span class="token punctuation">;</span> manager<span class="token punctuation">.</span>currentRead <span class="token operator">=</span> item<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator">-</span> <span class="token punctuation">(</span><span class="token class-name">NSArray</span> <span class="token operator">*</span><span class="token punctuation">)</span>tableView<span class="token punctuation">:</span><span class="token punctuation">(</span><span class="token class-name">UITableView</span> <span class="token operator">*</span><span class="token punctuation">)</span>tableView editActionsForRowAtIndexPath<span class="token punctuation">:</span><span class="token punctuation">(</span><span class="token class-name">NSIndexPath</span> <span class="token operator">*</span><span class="token punctuation">)</span>indexPath <span class="token punctuation">{</span> <span class="token class-name">UITableViewRowAction</span> <span class="token operator">*</span>deleteAction <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token class-name">UITableViewRowAction</span> rowActionWithStyle<span class="token punctuation">:</span><span class="token class-name">UITableViewRowActionStyleDestructive</span> title<span class="token punctuation">:</span>@<span class="token string-literal"><span class="token string">"Delete"</span></span> handler<span class="token punctuation">:</span><span class="token operator">^</span><span class="token punctuation">(</span><span class="token class-name">UITableViewRowAction</span> <span class="token operator">*</span>action<span class="token punctuation">,</span> <span class="token class-name">NSIndexPath</span> <span class="token operator">*</span>indexPath<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token punctuation">[</span><span class="token keyword">self</span><span class="token punctuation">.</span>tableView setEditing<span class="token punctuation">:</span><span class="token constant">NO</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">//workaround, rdar://17969970</span> <span class="token comment">//normally don't want to be able to get into this menu when reordering</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">self</span><span class="token punctuation">.</span>editMode<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name">UITableViewRowAction</span> <span class="token operator">*</span>shareAction <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token class-name">UITableViewRowAction</span> rowActionWithStyle<span class="token punctuation">:</span><span class="token class-name">UITableViewRowActionStyleNormal</span> title<span class="token punctuation">:</span>@<span class="token string-literal"><span class="token string">"Share"</span></span> handler<span class="token punctuation">:</span><span class="token operator">^</span><span class="token punctuation">(</span><span class="token class-name">UITableViewRowAction</span> <span class="token operator">*</span>action<span class="token punctuation">,</span> <span class="token class-name">NSIndexPath</span> <span class="token operator">*</span>indexPath<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token punctuation">[</span><span class="token keyword">self</span><span class="token punctuation">.</span>tableView setEditing<span class="token punctuation">:</span><span class="token constant">NO</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">;</span> shareAction<span class="token punctuation">.</span>backgroundColor <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token class-name">UIColor</span> grayColor<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token class-name">UITableViewRowAction</span> <span class="token operator">*</span>doneAction <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token class-name">UITableViewRowAction</span> rowActionWithStyle<span class="token punctuation">:</span><span class="token class-name">UITableViewRowActionStyleDestructive</span> title<span class="token punctuation">:</span>@<span class="token string-literal"><span class="token string">"Done"</span></span> handler<span class="token punctuation">:</span><span class="token operator">^</span><span class="token punctuation">(</span><span class="token class-name">UITableViewRowAction</span> <span class="token operator">*</span>action<span class="token punctuation">,</span> <span class="token class-name">NSIndexPath</span> <span class="token operator">*</span>indexPath<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token punctuation">[</span><span class="token keyword">self</span><span class="token punctuation">.</span>tableView setEditing<span class="token punctuation">:</span><span class="token constant">NO</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">;</span> doneAction<span class="token punctuation">.</span>backgroundColor <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token class-name">UIColor</span> greenColor<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">[</span><span class="token keyword">self</span> startEditing<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">return</span> @<span class="token punctuation">[</span>deleteAction<span class="token punctuation">,</span> doneAction<span class="token punctuation">,</span> shareAction<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> @<span class="token punctuation">[</span>deleteAction<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator">-</span> <span class="token punctuation">(</span>void<span class="token punctuation">)</span>tableView<span class="token punctuation">:</span><span class="token punctuation">(</span><span class="token class-name">UITableView</span> <span class="token operator">*</span><span class="token punctuation">)</span>tableView didEndEditingRowAtIndexPath<span class="token punctuation">:</span><span class="token punctuation">(</span><span class="token class-name">NSIndexPath</span> <span class="token operator">*</span><span class="token punctuation">)</span>indexPath <span class="token punctuation">{</span> <span class="token punctuation">[</span><span class="token keyword">self</span> endEditing<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator">-</span> <span class="token punctuation">(</span>void<span class="token punctuation">)</span>tableView<span class="token punctuation">:</span><span class="token punctuation">(</span><span class="token class-name">UITableView</span> <span class="token operator">*</span><span class="token punctuation">)</span>tableView commitEditingStyle<span class="token punctuation">:</span><span class="token punctuation">(</span><span class="token class-name">UITableViewCellEditingStyle</span><span class="token punctuation">)</span>editingStyle forRowAtIndexPath<span class="token punctuation">:</span><span class="token punctuation">(</span><span class="token class-name">NSIndexPath</span> <span class="token operator">*</span><span class="token punctuation">)</span>indexPath <span class="token punctuation">{</span> <span class="token comment">//empty on purpose</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>This post and the Radar helped me collect my thoughts to post on <a href="http://stackoverflow.com/questions/25222872/uitableviewcell-not-respecting-shouldindentwhileediting-no">Stack</a>. I’ve been afraid of backlash or Noob. Time to get over it.</p> <p><strong>Update 2014-09-11</strong></p> <p><a href="http://timbroder.com/2014/08/uitableviewcell-action-swiping-in-ios8-and-swift.html#comment-1565598353">Vanyas</a> has a great sample application that addresses what I’m trying to do.  I was forcing the delete button on the right hand side myself.  Updating editingStyleForRowAtIndexPath to the below fixed my issue:</p> <div class="gatsby-highlight" data-language="c"><pre style="counter-reset: linenumber NaN" class="language-c line-numbers"><code class="language-c"><span class="token operator">-</span> <span class="token punctuation">(</span>UITableViewCellEditingStyle<span class="token punctuation">)</span>tableView<span class="token operator">:</span><span class="token punctuation">(</span>UITableView <span class="token operator">*</span><span class="token punctuation">)</span>tableView editingStyleForRowAtIndexPath<span class="token operator">:</span><span class="token punctuation">(</span>NSIndexPath <span class="token operator">*</span><span class="token punctuation">)</span>indexPath <span class="token punctuation">{</span> <span class="token comment">//return UITableViewCellEditingStyleDelete;</span> <span class="token keyword">return</span> tableView<span class="token punctuation">.</span>isEditing <span class="token operator">?</span> UITableViewCellEditingStyleNone<span class="token operator">:</span> UITableViewCellEditingStyleDelete<span class="token punctuation">;</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[How to Restore a Time Machine Backup From a Synology NAS]]>https://www.timbroder.com/2014/08/restore-time-machine-backup-synology-nashttps://www.timbroder.com/2014/08/restore-time-machine-backup-synology-nasMon, 04 Aug 2014 22:28:26 GMT<p>My Sunday morning started off like this:</p> <blockquote> <p>“There’s an error with the EFI system partition’s file system.” Well today’s</p> </blockquote> <p>off to a great start // <a href="https://twitter.com/siracusa">@siracusa</a> — Tim Broder (@timothybroder) <a href="https://twitter.com/timothybroder/statuses/495938712375939073">August 3, 2014</a></p> <p>My laptop wouldn’t finish booting.</p> <p>All I got was a backlit, black, screen.  I went through numerous combinations of booting with option, cmd+R, cmd+shift+R, un-mounting, ejecting. In all methods, trying in vain to get the Disk Utility to verify and <a href="http://www.cultofmac.com/264991/repair-verify-hard-drive-command-line-os-x-tips/">repair</a> the hard drive. I tried from Recovery Mode and a fresh OSX install on a USB hard drive. The things I saw on my screen included:</p> <ul> <li>The aforementioned <a href="https://discussions.apple.com/message/18177363">black screen</a></li> <li>A backlit, white, screen</li> <li>A gray screen with a flashing <a href="http://support.apple.com/kb/TS1440?viewlocale=en_US&#x26;locale=en_US">Folder</a> with a question mark in it</li> <li>“Live file system repair is <a href="https://discussions.apple.com/thread/5739421?tstart=0">not supported</a>”</li> <li>There’s an error with the EFI system partition’s file system.”</li> <li>Clean installs were failing: "<a href="https://discussions.apple.com/thread/5467959?tstart=0">An Error</a> occurred while preparing the installation.  Try running this application again.”</li> <li>“Verified failure: <a href="http://forums.macrumors.com/showthread.php?t=1667862">unrecognized</a> file system”</li> </ul> <p>After a few hours I moved from “I need to fix this” to “I need to get my laptop back up.”</p> <p>Ok let’s do a clean install: "An Error occurred while preparing the installation.  Try running this application again.”</p> <p>Crap.</p> <p>At this point I booked a genius bar appointment for the next day just in case. 3 clean installs failed. Took a break to think about it…. I got back into Disk Utility and formatted the partition. Then deleted/recreated the partitions. Formatted again (why not?). At this point a clean install worked. Ok… Seems like the drive isn’t totally dead. But, I want to do a fresh restore from my Time Machine backup on my <a href="http://www.amazon.com/gp/product/B008U69LC4/ref=wms_ohs_product?psc=1&#x26;tag=nyen0e-20&#x26;ie=UTF8">NAS</a>. I normally also have a SuperDuper! backup. I didn’t. That’s a story for another time. Apple doesn’t quite support NAS Time Machine; there are a few hoops you have to jump through:</p> <ol> <li>Get into recovery mode (Boot while holding cmd+R)</li> <li>Open the terminal</li> <li>Go to Volumes <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">cd /Volumes ls -la</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span></span></pre></div> </li> <li>Make a place to mount the NAS <code class="language-text">mkdir synology</code></li> <li>Double check it’s there <code class="language-text">ls -la</code></li> <li>Mount your NAS. This is the IP of it in my house. This should be the IP you use to get to the admin console. My Admin is: <a href="http://192.168.1.205:5000">http://192.168.1.205:5000</a></li> </ol> <p>You’ll also need to know what share your Time Machine back is in. For me, it has it’s own drive, represented by “timstimemachine”. I’ll go into the details of my NAS setup in a future post <code class="language-text">mount -t afp afp://admin:[password]@192.168.1.205/timstimemachine synology</code></p> <ol> <li>Check you see files in the synology folder <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">cd synology ls -la</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span></span></pre></div> </li> <li>Even though we’re mounted, we won’t see this backup in Time Machine Restore just yet. Use hdid (hard drive image driver) to mount the sparse bundle image <code class="language-text">hdid [your back-up name].sparsebundle</code></li> <li>If your drive or the backup was encrypted, You’ll need to enter it’s password at this time</li> <li>Make sure your backup is still mounted <code class="language-text">ls -la</code></li> <li>Ok, quit the Terminal and load up Time Machine Restore</li> <li>You should see the backup we just mounted</li> <li>Start the restore. It can take a while. Mine is around 360 gigs and it estimated 16 hours. It took a lot less than that but it finished when I was sleeping so I don’t have an accurate time.</li> </ol> <p>Sunday was a stressful day. Hopefully this can help you.</p><![CDATA[Twitter or RSS]]>https://www.timbroder.com/2014/08/twitter-or-rsshttps://www.timbroder.com/2014/08/twitter-or-rssSun, 03 Aug 2014 22:34:34 GMT<blockquote> <p>If you had to choose between only reading Twitter or only reading weblogs,</p> </blockquote> <p>which would you choose? Losing Twitter would be a bummer for a lot people, but losing weblogs would decimate the web. We should do more to strengthen weblogs and RSS because they are the foundation for so much of the most important writing on the web.</p> <p>#RSS4LIFE</p> <p>Joking aside, I do get a lot of my news from twitter these days. I would say half the articles that I'd be interested in reading (dumping to <a href="https://itunes.apple.com/us/app/instapaper/id288545208?mt=8&#x26;at=11laRZ&#x26;ct=LCP">Instapaper</a> from <a href="https://itunes.apple.com/us/app/reeder-2/id697846300?mt=8&#x26;at=11laRZ&#x26;ct=LCP">Reeder</a> or <a href="https://itunes.apple.com/us/app/mr.-reader/id412874834?mt=8&#x26;at=11laRZ&#x26;ct=LCP">Mr. reader</a>) I've already added from twitter. Luckily, I use <a href="https://itunes.apple.com/us/app/feed-wrangler/id634486174?mt=8k">Feed Wrangler</a> so I don't see duplicates of something already in Instapaper when browsing my feeds.</p><![CDATA[The Most Dangerous Word In Software Development]]>https://www.timbroder.com/2014/08/the-most-dangerous-word-in-software-developmenthttps://www.timbroder.com/2014/08/the-most-dangerous-word-in-software-developmentSun, 03 Aug 2014 19:12:41 GMT<blockquote> <p>“Just put it up on a server somewhere.”</p> </blockquote> <blockquote> </blockquote> <blockquote> <p>“Just add a favorite button to the right side of the item.”</p> </blockquote> <blockquote> </blockquote> <blockquote> <p>“Just add [insert complex option here] to the settings screen.”</p> </blockquote> <p>If any of these sentences rings true or makes you cringe, read this article.</p><![CDATA[Dismiss a Modal UIViewController created in Interface Builder]]>https://www.timbroder.com/2014/07/dismiss-a-modal-uiviewcontroller-created-in-interface-builderhttps://www.timbroder.com/2014/07/dismiss-a-modal-uiviewcontroller-created-in-interface-builderSun, 27 Jul 2014 22:31:11 GMT<p>There are a <a href="http://stackoverflow.com/questions/2796438/uibarbuttonitem-target-action-not-working">number</a> of posts on this <a href="http://stackoverflow.com/questions/7719237/add-a-custom-selector-to-a-uibarbuttonitem">subject</a> on Stack. They involve re-instantiating (this seems slower to me) or yanking the view from a UIButton (this feels dirty).</p> <p>I’d rather just update the UIBarButtonItem that I already have:</p> <p><a href="https://www.flickr.com/photos/timothybroder/14575059147" title="View &#x27;2014-07-27_1826&#x27; on Flickr.com"><img src="https://farm6.staticflickr.com/5566/14575059147_d33d111203_b.jpg" alt="2014-07-27_1826"></a></p> <p>All I needed to do, was attach the appropriate target and action to the UIBarButtonItem:</p> <div class="gatsby-highlight" data-language="swift"><pre style="counter-reset: linenumber NaN" class="language-swift line-numbers"><code class="language-swift"><span class="token keyword">class</span> <span class="token class-name">SettingsTableViewController</span> <span class="token punctuation">:</span> <span class="token class-name">UITableViewController</span> <span class="token punctuation">{</span> <span class="token attribute atrule">@IBOutlet</span> <span class="token keyword">weak</span> <span class="token keyword">var</span> doneBarButton<span class="token punctuation">:</span> <span class="token class-name">UIBarButtonItem</span><span class="token operator">!</span> <span class="token keyword">init</span><span class="token punctuation">(</span>coder aDecoder<span class="token punctuation">:</span> <span class="token class-name">NSCoder</span><span class="token operator">!</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">super</span><span class="token punctuation">.</span><span class="token keyword">init</span><span class="token punctuation">(</span>coder<span class="token punctuation">:</span> aDecoder<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">override</span> <span class="token keyword">func</span> <span class="token function-definition function">viewDidLoad</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">super</span><span class="token punctuation">.</span><span class="token function">viewDidLoad</span><span class="token punctuation">(</span><span class="token punctuation">)</span> doneBarButton<span class="token punctuation">.</span>target <span class="token operator">=</span> <span class="token keyword">self</span> doneBarButton<span class="token punctuation">.</span>action <span class="token operator">=</span> <span class="token string-literal"><span class="token string">"donePressed:"</span></span> <span class="token punctuation">}</span> <span class="token attribute atrule">@IBAction</span> <span class="token keyword">func</span> <span class="token function-definition function">donePressed</span><span class="token punctuation">(</span>b<span class="token punctuation">:</span><span class="token class-name">UIBarButtonItem</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">self</span><span class="token punctuation">.</span><span class="token function">dismissViewControllerAnimated</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">,</span> completion<span class="token punctuation">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[Using PonyDebugger on a device]]>https://www.timbroder.com/2014/07/using-ponydebugger-on-a-devicehttps://www.timbroder.com/2014/07/using-ponydebugger-on-a-deviceSun, 27 Jul 2014 20:25:59 GMT<p>PonyDebugger is awesome. I use it mostly for Core Data debugging. Most of the time, I find it easier then firing up <a href="https://itunes.apple.com/us/app/sqlite-professional-sql-coredata/id586001240?mt=12&#x26;at=11laRZ&#x26;ct=pro">SQLite Professional</a>.</p> <p>When using the simulator, hitting localhost:9000 is fine. On a device, not so much; you need to hit your machine. <a href="http://xip.io/">xip.io</a>to the rescue! What it is: xip.io is a magic domain name that provides wildcard DNS for any IP address. We use this heavily at work if the machine we’re on isn’t hooked up to a subdomain or [Vagrant Share](<a href="https://www.vagrantup.com/blog/feature-">https://www.vagrantup.com/blog/feature-</a> preview-vagrant-1-5-share.html).</p> <p>We can use this wildcard to have our iPhone hit our laptop’s instance of PonyDebugger.</p> <p>First, get your IP. I use <a href="https://www.dropbox.com/s/mngjeqwe64z5zkl/MyIP.alfredworkflow">this</a> Alfred workflow. Take note of your local IP.</p> <p>Start PonyDebugger listening on that IP:</p> <p><code class="language-text">bashponyd serve —listen-interface=192.168.1.10 </code></p> <p>For handy access, alias this command:</p> <p><code class="language-text">bashalias pony="ponyd serve --listen-interface=192.168.1.10" </code></p> <p>Load Pony in your browser by appending your IP to the a xip.io URL: <a href="http://192.168.1.10.xip.io:9000/">http://192.168.1.10.xip.io:9000/</a></p> <p>To access via the simulator or a device:</p> <div class="gatsby-highlight" data-language="swiftletpony = pddebugger.defaultinstance()"><pre style="counter-reset: linenumber NaN" class="language-swiftletpony = pddebugger.defaultinstance() line-numbers"><code class="language-swiftletpony = pddebugger.defaultinstance()">pony.connectToURL(NSURL.URLWithString(&quot;ws://192.168.1.10.xip.io:9000/device&quot;)) pony.enableNetworkTrafficDebugging() pony.enableCoreDataDebugging() ``` </code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span></span></pre></div><![CDATA[UITapGestureRecognizer in Swift]]>https://www.timbroder.com/2014/07/uitapgesturerecognizer-in-swifthttps://www.timbroder.com/2014/07/uitapgesturerecognizer-in-swiftSun, 27 Jul 2014 14:47:33 GMT<p>I have a subclass of UIView that has a label:</p> <div class="gatsby-highlight" data-language="swift"><pre style="counter-reset: linenumber NaN" class="language-swift line-numbers"><code class="language-swift"><span class="token keyword">class</span> <span class="token class-name">PlayerView</span> <span class="token punctuation">:</span> <span class="token class-name">UIView</span> <span class="token punctuation">{</span> <span class="token attribute atrule">@IBOutlet</span> <span class="token keyword">weak</span> <span class="token keyword">var</span> playLabel<span class="token punctuation">:</span> <span class="token class-name">UILabel</span><span class="token operator">!</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span></span></pre></div> <p>I want to attach a Tap Gesture to it:</p> <div class="gatsby-highlight" data-language="swift"><pre style="counter-reset: linenumber NaN" class="language-swift line-numbers"><code class="language-swift"><span class="token keyword">class</span> <span class="token class-name">PlayerView</span> <span class="token punctuation">:</span> <span class="token class-name">UIView</span> <span class="token punctuation">{</span> <span class="token attribute atrule">@IBOutlet</span> <span class="token keyword">weak</span> <span class="token keyword">var</span> playLabel<span class="token punctuation">:</span> <span class="token class-name">UILabel</span><span class="token operator">!</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span></span></pre></div><![CDATA[Creating a conforming delegate (UITableViewDelegate) in Swift]]>https://www.timbroder.com/2014/07/creating-a-conforming-delegate-uitableviewdelegate-in-swifthttps://www.timbroder.com/2014/07/creating-a-conforming-delegate-uitableviewdelegate-in-swiftSun, 27 Jul 2014 02:11:16 GMT<p>This tripped me up for a bit so I hope this helps someone.</p> <p>I started out with this class, thinking I could just continue on my merry way. This errors in Xcode with: "<em>class does not conform to NSObjectProtocol</em>”</p> <div class="gatsby-highlight" data-language="swift"><pre style="counter-reset: linenumber NaN" class="language-swift line-numbers"><code class="language-swift"><span class="token keyword">class</span> <span class="token class-name">FastListUITableViewDelegate</span> <span class="token punctuation">:</span> <span class="token class-name">UITableViewDelegate</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <p>Hmm ok, but much there yet, what did I miss? This should definitely be a class; not a protocol (I have methods to implement), not a @class_protocol (wrong use, based on the docs), hmm.</p> <p>This obviously behaves different than in objective-c. What is inherent in the obj-c version of this that would conform to NSObjectProtocol? NSObject. Every class and C eventually rolls up to this…</p> <p>This is working so far:</p> <div class="gatsby-highlight" data-language="swift"><pre style="counter-reset: linenumber NaN" class="language-swift line-numbers"><code class="language-swift"><span class="token keyword">class</span> <span class="token class-name">FastListUITableViewDelegate</span> <span class="token punctuation">:</span> <span class="token class-name">NSObject</span><span class="token punctuation">,</span> <span class="token class-name">UITableViewDelegate</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <p>I’ll report back here if this solution changes</p><![CDATA[Why I turned off email notifications]]>https://www.timbroder.com/2014/07/why-i-turned-off-email-notificationshttps://www.timbroder.com/2014/07/why-i-turned-off-email-notificationsWed, 23 Jul 2014 01:02:24 GMT<blockquote> <p>Just about a week ago I had an epiphany: Email is a constant. It will never</p> </blockquote> <p>end.</p> <blockquote> </blockquote> <blockquote> <p>More often than not nothing is actionable I made a quick change — turn off</p> </blockquote> <p>all notifications for email. None shall pass.</p> <p>NO EMAIL NOTIFICATIONS. I've been doing this for about a year now on my phone and it's amazing. I've been doing it for 3 years on my laptop. I don't know why I didn't do it on all my devices sooner. (I don't get outlook or gmail notifications). It lowers stress and helps me focus on <strong>actual tasks</strong> instead of context switching into email all the time. Context switching is <strong>expensive</strong></p> <blockquote> <p>Reply too fast, expectations are set</p> </blockquote> <p>No arguments here. If someone thinks you respond to emails within 5 mins, they will expect it. When you don't, you'll be under delivering.</p> <blockquote> <p>If it’s urgent, why are you using email?</p> </blockquote> <p>This is a <strong>huge</strong> pet peeve of mine. "Did you have a chance to respond to that email I sent you 30 seconds ago?" drives me nuts. If it's an emergency, send me an IM. If I'm offline or don't respond, get up off your ass and walk over. If I'm remote and offline for some reason, text me.</p><![CDATA[Coding Under Par]]>https://www.timbroder.com/2014/07/coding-under-parhttps://www.timbroder.com/2014/07/coding-under-parWed, 23 Jul 2014 01:02:13 GMT<blockquote> <p>when it’s midnight and I’m on a perceived roll with some coding challenge,</p> </blockquote> <p>there doesn’t appear to be any stopping me. I “have all night,” or at least that’s what my monkey brain says. Of course, the smarter half of me knows I should be getting calling it a day and getting some much-needed rest.</p> <p>I hear this. As I get older, and keep to a rigid sleep schedule, I tend to find myself being useless after 9pm. I do miss the old days io burning through until 2am. Now that flux exists to take care of the circadian issues, we should be able to burn all night. Right? RIGHT!?!</p><![CDATA[Looping through subviews and downcasting in Swift]]>https://www.timbroder.com/2014/07/looping-subviews-downcasting-swifthttps://www.timbroder.com/2014/07/looping-subviews-downcasting-swiftTue, 22 Jul 2014 23:23:27 GMT<p>I've been playing around with Auto-Layout. This snippet was helpful to see what constraints were set on what views in my View Hierarchy.</p> <p>Getting the downcast right on the subviews Array took a few tries:</p> <div class="gatsby-highlight" data-language="swift"><pre style="counter-reset: linenumber NaN" class="language-swift line-numbers"><code class="language-swift"><span class="token keyword">func</span> <span class="token function-definition function">showAL</span><span class="token punctuation">(</span>view<span class="token punctuation">:</span> <span class="token class-name">UIView</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">println</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>quot<span class="token punctuation">;</span><span class="token operator">!&amp;</span>quot<span class="token punctuation">;</span><span class="token punctuation">)</span> <span class="token function">println</span><span class="token punctuation">(</span>view<span class="token punctuation">)</span> <span class="token function">println</span><span class="token punctuation">(</span>view<span class="token punctuation">.</span><span class="token function">constraints</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">for</span> view <span class="token keyword">in</span> <span class="token keyword">self</span><span class="token punctuation">.</span>subviews <span class="token keyword">as</span> <span class="token punctuation">[</span><span class="token class-name">UIView</span><span class="token punctuation">]</span> <span class="token punctuation">{</span> <span class="token function">showAL</span><span class="token punctuation">(</span>view<span class="token punctuation">)</span> <span class="token keyword">for</span> subview <span class="token keyword">in</span> view<span class="token punctuation">.</span>subviews <span class="token keyword">as</span> <span class="token punctuation">[</span><span class="token class-name">UIView</span><span class="token punctuation">]</span> <span class="token punctuation">{</span> <span class="token function">showAL</span><span class="token punctuation">(</span>subview<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> ```</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[Functions or Read-Only Properties in Swift?]]>https://www.timbroder.com/2014/07/functions-vs-read-properties-swifthttps://www.timbroder.com/2014/07/functions-vs-read-properties-swiftSat, 12 Jul 2014 23:22:03 GMT<p>I’m not sure which is better.  If it's returning something that is directly tied to the class: a slice/dice of properties is already has, I'm leaning towards properties. Because of the many examples I <em>feel</em> like read-only properties are the way to do.  I’m not the only person [wondering](<a href="http://stackoverflow.com/questions/24035276/computed-read-only-">http://stackoverflow.com/questions/24035276/computed-read-only-</a> property-vs-function-in-swift), so that’s validating.</p> <p>Property:</p> <div class="gatsby-highlight" data-language="c"><pre style="counter-reset: linenumber NaN" class="language-c line-numbers"><code class="language-c">extension String <span class="token punctuation">{</span> var fullSentences<span class="token operator">:</span> <span class="token punctuation">[</span>String<span class="token punctuation">]</span> <span class="token punctuation">{</span> <span class="token comment">// stuff</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Function:</p> <div class="gatsby-highlight" data-language="c"><pre style="counter-reset: linenumber NaN" class="language-c line-numbers"><code class="language-c">extension String <span class="token punctuation">{</span> func <span class="token function">fullSentences</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">&amp;</span>gt<span class="token punctuation">;</span> <span class="token punctuation">[</span>String<span class="token punctuation">]</span> <span class="token punctuation">{</span> <span class="token comment">// stuff</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[Playgrounds in Swift are Awesome]]>https://www.timbroder.com/2014/07/playgrounds-in-swift-are-awesomehttps://www.timbroder.com/2014/07/playgrounds-in-swift-are-awesomeSat, 12 Jul 2014 23:19:42 GMT<p>Man alive, I missed this from Python.  More live editing, less edit+build+run.</p> <p><a href="https://www.flickr.com/photos/timothybroder/14451913518" title="View &#x27;2014-07-12_1822&#x27; on Flickr.com"><img src="https://farm6.staticflickr.com/5483/14451913518_c2ef7c5358_b.jpg" alt="2014-07-12_1822"></a></p> <p><img src="https://sd.keepcalm-o-matic.co.uk/i/everything-is-awesome-6.png" alt=""></p><![CDATA[Parsing sentences from a String in Swift]]>https://www.timbroder.com/2014/07/parsing-sentences-string-swifthttps://www.timbroder.com/2014/07/parsing-sentences-string-swiftSat, 12 Jul 2014 23:08:57 GMT<p>I’ve been looking at how to <a href="https://pinboard.in/u:broderboy/t:sentences/">parse sentences</a> from text recently. While I’m still looking for a more Machine Learning approach, I found NSStringEnumerationBySentences which can get me there faster (for now).  I need to get all of the sentences from a given String.  This could easily be an Objective-C category method.  But, I’m trying to learn as much Swift as I can. I haven’t played with extensions yet. Here we go. <code class="language-text">enumerateSubstringsInRange:options:usingBlock:</code> is what I’ll need, but I need the extension first:</p> <div class="gatsby-highlight" data-language="swift"><pre style="counter-reset: linenumber NaN" class="language-swift line-numbers"><code class="language-swift"><span class="token keyword">extension</span> <span class="token class-name">String</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> fullSentences<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token class-name">String</span><span class="token punctuation">]</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Fiddling with Swift’s closure syntax for a little while, and using the shorthand for NSStringEnumerationBySentences, I end up with this:</p> <div class="gatsby-highlight" data-language="swift"><pre style="counter-reset: linenumber NaN" class="language-swift line-numbers"><code class="language-swift"><span class="token keyword">extension</span> <span class="token class-name">String</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> fullSentences<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token class-name">String</span><span class="token punctuation">]</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> sentences <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token class-name">String</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">let</span> range <span class="token operator">=</span> <span class="token keyword">self</span><span class="token punctuation">.</span><span class="token function">rangeOfString</span><span class="token punctuation">(</span><span class="token keyword">self</span><span class="token punctuation">)</span> <span class="token keyword">self</span><span class="token punctuation">.</span><span class="token function">enumerateSubstringsInRange</span><span class="token punctuation">(</span>range<span class="token punctuation">,</span> options<span class="token punctuation">:</span> <span class="token punctuation">.</span><span class="token class-name">BySentences</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> substring<span class="token punctuation">,</span> substringRange<span class="token punctuation">,</span> enclosingRange<span class="token punctuation">,</span> <span class="token keyword">inout</span> <span class="token keyword">in</span> sentences <span class="token operator">+=</span> substring <span class="token punctuation">}</span> <span class="token keyword">return</span> sentences <span class="token punctuation">}</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>This could have been condensed even more, but I find this very hard to read:</p> <div class="gatsby-highlight" data-language="swift"><pre style="counter-reset: linenumber NaN" class="language-swift line-numbers"><code class="language-swift"><span class="token keyword">extension</span> <span class="token class-name">String</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> fullSentences<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token class-name">String</span><span class="token punctuation">]</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> sentences <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token class-name">String</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">let</span> range <span class="token operator">=</span> <span class="token keyword">self</span><span class="token punctuation">.</span><span class="token function">rangeOfString</span><span class="token punctuation">(</span><span class="token keyword">self</span><span class="token punctuation">)</span> <span class="token keyword">self</span><span class="token punctuation">.</span><span class="token function">enumerateSubstringsInRange</span><span class="token punctuation">(</span>range<span class="token punctuation">,</span> options<span class="token punctuation">:</span> <span class="token punctuation">.</span><span class="token class-name">BySentences</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> substring<span class="token punctuation">,</span> <span class="token omit keyword">_</span><span class="token punctuation">,</span> <span class="token omit keyword">_</span><span class="token punctuation">,</span> <span class="token omit keyword">_</span> <span class="token keyword">in</span> sentences <span class="token operator">+=</span> substring <span class="token punctuation">}</span> <span class="token keyword">return</span> sentences <span class="token punctuation">}</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Ah, but alas. Now I can’t use this in Objective-C. It won’t see the String extension. It needs to be NSString:</p> <div class="gatsby-highlight" data-language="swift"><pre style="counter-reset: linenumber NaN" class="language-swift line-numbers"><code class="language-swift"><span class="token keyword">extension</span> <span class="token class-name">NSString</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> fullSentences<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token class-name">String</span><span class="token punctuation">]</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> sentences <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token class-name">String</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">let</span> range <span class="token operator">=</span> <span class="token keyword">self</span><span class="token punctuation">.</span><span class="token function">rangeOfString</span><span class="token punctuation">(</span><span class="token keyword">self</span><span class="token punctuation">)</span> <span class="token keyword">self</span><span class="token punctuation">.</span><span class="token function">enumerateSubstringsInRange</span><span class="token punctuation">(</span>range<span class="token punctuation">,</span> options<span class="token punctuation">:</span> <span class="token punctuation">.</span><span class="token class-name">BySentences</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> substring<span class="token punctuation">,</span> substringRange<span class="token punctuation">,</span> enclosingRange<span class="token punctuation">,</span> <span class="token keyword">inout</span> <span class="token keyword">in</span> sentences <span class="token operator">+=</span> substring <span class="token punctuation">}</span> <span class="token keyword">return</span> sentences <span class="token punctuation">}</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>I haven’t quite figured out the naming convention for Swift Extension files yet. Right now, I have this in StringExtentions.swift in my categories folder. Though…. I guess to be proper it should be NSStringExtentions.swift…</p><![CDATA[Apple's Swift Blog]]>https://www.timbroder.com/2014/07/apples-swift-bloghttps://www.timbroder.com/2014/07/apples-swift-blogFri, 11 Jul 2014 17:46:58 GMT<blockquote> <p>This new blog will bring you a behind-the-scenes look into the design of the</p> </blockquote> <p>Swift language by the engineers who created it, in addition to the latest news and hints to turn you into a productive Swift programmer.</p> <p>I LOVE the new, open-er Apple. From the barriers between iOS and OSX coming down, some Apple devs being more open on twitter and in the dev forums, and now this <a href="https://developer.apple.com/swift/blog/">blog</a>.</p> <p>It’s an amazing time to be using Apple dev tools</p><![CDATA[On Working From Home and Running a Business]]>https://www.timbroder.com/2014/07/on-working-from-home-and-running-a-businesshttps://www.timbroder.com/2014/07/on-working-from-home-and-running-a-businessFri, 11 Jul 2014 01:11:46 GMT<p>Shawn Blanc talks about how he organizes himself and his company for working from home. One day...</p> <blockquote> <p>I cannot express enough just how absolutely critical it has been to have a</p> </blockquote> <p>budget — both for our company and for our personal household expenses.</p> <blockquote> </blockquote> <blockquote> <p>Did you know that most of America’s millionaires are people who earn low-</p> </blockquote> <p>six-figure incomes? They have a high net worth (between $1 – $10 million) because they live simply and budget their money.</p> <p>When we were saving for the down pay payment on our condo we were using a combination of mint.com and an allowance (envelope method, cash) I've started playing around with mint again to get a better idea of what we spend lonely on and prep us for the next chapter.</p><![CDATA[Format JSON and save to gist with Alfred]]>https://www.timbroder.com/2014/07/format-json-and-save-to-gisthttps://www.timbroder.com/2014/07/format-json-and-save-to-gistTue, 08 Jul 2014 21:02:32 GMT<p>At work, we have an Angular app that deals with a lot of custom JSON. With a distributed dev team, we pass a LOT of JSON around.  Copying from Chrome’s net tab, formatting, adding to a Github <a href="https://gist.github.com/">gist</a> for easy transport is a PITA when you are doing it 20 times a day. I have 2 Alfred workflows to help with this.</p> <p>My Use:</p> <ol> <li>Copy unformatted JSON to clipboard</li> <li>Alfred “JsonLint”. Formatted JSON is now in my clipboard</li> <li>Alfred “gist”. URL to raw gist is now in my clipboard</li> <li>One of these days I’ll chain these together</li> </ol> <p>To get this working:</p> <ol> <li>You’ll need the Alfred <a href="http://www.alfredapp.com/powerpack/">PowerPack</a></li> <li>Install my JSON lint <a href="https://github.com/broderboy/AlfredJsonLint/blob/master/Json%20Lint.alfredworkflow?raw=true">workflow</a>. (It needs work, but gets the job done)</li> <li>Install <a href="https://github.com/phallstrom/AlfredGist">AlfredGist</a></li> </ol> <ul> <li>Be sure to follow the setup <a href="https://github.com/phallstrom/AlfredGist">instructions</a>.</li> <li>I prefer to have the ‘raw’ url returned from AlfredGist. (in the clipboard and opened)</li> </ul> <p>To enable this, open functions.sh<br> Look for this line: <code class="language-text">gist_url=$(get_json_key “html_url" "$json") </code> Modify to: <code class="language-text">gist_url=$(get_json_key “raw_url” "$json")</code></p> <ul> <li>In “gistconfig” set the gists to be private</li> </ul> <p>You should now be able to chain together as I listed above</p> <p>Let me know if you have any questions!</p><![CDATA[Whatever goes up, that’s what we do]]>https://www.timbroder.com/2014/07/whatever-goes-up-thats-what-we-dohttps://www.timbroder.com/2014/07/whatever-goes-up-thats-what-we-doSun, 06 Jul 2014 19:57:34 GMT<p>This is a quite from a Facebook employee:</p> <blockquote> <p>We’re blind. It doesn’t matter what any individual person thinks about</p> </blockquote> <p>something new. Everything must be tested. It’s feature echolocation: we throw out an idea, and when the data comes back we look at the numbers. Whatever goes up, that’s what we do. We are slaves to the numbers. We don’t operate around innovation. We only optimize. We do what goes up.</p> <p>There is a flip side to this too, right? Facebook HAS that kind of data. What I wouldn't DO for that kind of data. Do we have our own custom tracking (Google Analytics) on our magneto sites at work? Of course. Does it get us the data we need? Yes and know. We can track conversions, user flows, A/B test what we need. But, the pixel level knowledge of HOW a user is using the site that Facebook seems to have seems pretty slick.</p><![CDATA[SwiftInFlux]]>https://www.timbroder.com/2014/07/swiftinfluxhttps://www.timbroder.com/2014/07/swiftinfluxSun, 06 Jul 2014 19:56:24 GMT<blockquote> <p>SwiftInFlux, a community-based project for cataloguing the changes that</p> </blockquote> <p>Apple is probably going to make to Swift before 1.0 ships</p> <p>I'm really happy someone is doing this. Even between seeds 1 and 2 there was a number of changes. The differences were buried in the Xcode release notes. I think they deserve their own diffs. If you agree, please file a radar</p><![CDATA[Don't Be Scared Of Functional Programming]]>https://www.timbroder.com/2014/07/dont-be-scared-of-functional-programminghttps://www.timbroder.com/2014/07/dont-be-scared-of-functional-programmingFri, 04 Jul 2014 14:07:25 GMT<p>This [article](<a href="http://www.smashingmagazine.com/2014/07/02/dont-be-scared-of-">http://www.smashingmagazine.com/2014/07/02/dont-be-scared-of-</a> functional-programming/) made a LOT of things click for me. I hadn't quite grasped the concepts of functional programming. (I hadn't really tried to). It's a little long. But, worth it.</p> <blockquote> <p>Functional programming can be daunting, but remember that it isn’t only for</p> </blockquote> <p>PhDs, data scientists and architecture astronauts. For most of us, the real benefit of adopting a functional style is that our programs can be broken down into smaller, simpler pieces that are both more reliable and easier to understand.</p><![CDATA[Launch Center Pro to Trello via IFTTT]]>https://www.timbroder.com/2014/06/launch-center-pro-trello-via-ifttthttps://www.timbroder.com/2014/06/launch-center-pro-trello-via-iftttSun, 15 Jun 2014 17:11:21 GMT<p>I previously <a href="http://timbroder.com/2013/03/automating-adding-to-trello-on-ios.html">wrote</a> about automating adding to Trello from my phone using <a href="https://itunes.apple.com/us/app/launch-center-pro/id532016360?mt=8&#x26;at=11laRZ&#x26;ct=pro">Launch Center Pro</a>.  That method involved some scripting and <a href="https://itunes.apple.com/us/app/pythonista/id528579881?mt=8&#x26;at=11laRZ&#x26;ct=pro">Pythonista</a>. It was fun to figure out, but cumbersome to update.</p> <p>Now that LCP has <a href="http://www.macstories.net/reviews/launch-center-pro-2-3-extends-ios-automation/">IFTTT integration</a>, this process can be simplified. You can chain an event from LCP through IFTTT to email a card to Trello. <em>Note: This will only work for 1 list per board. I haven’t figured out if there is a way to email to multiple lists on the same board.</em></p> <ol> <li>Set up the Launch Center Pro <a href="https://ifttt.com/launch_center">channel</a> on IFTTT.</li> <li>Set up Launch Center Connect on your device</li> </ol> <p><img src="https://farm4.staticflickr.com/3893/14417105171_dc5bd5d78a_z_d.jpg" alt=""></p> <ol start="3"> <li>In IFTTT, create a new recipe. Set the “This” to the Launch Center Pro channel. Then, choose “Trigger”</li> <li>Name the trigger something that will help identify it. I used “Roadmap”.  Keep note of this, you’ll need the same name later</li> </ol> <p><img src="https://farm4.staticflickr.com/3921/14427559984_5b527ef1fe_m_d.jpg" alt=""></p> <ol start="5"> <li>On the Trello board you wish to work with: Go into the settings and click “Email-to-board Settings.” Grab the email address for that board. Choose which list the card should be added and it’s position._ The email in this screenshot is hooked up to anything._</li> </ol> <p><img src="https://farm4.staticflickr.com/3881/14427446122_587019f3fe_z_d.jpg" alt=""></p> <ol start="6"> <li>In the “Then” of your IFTTT recipe, choose Gmail. In the To Address, add in the trello address. Leave just <code class="language-text">{% verbatim %} “{{Value 1}}” {% endverbatim %}</code> in the subject. This will become the title of the card.  If you want to add a description or other attributes of the card, use the other Values that Launch Center Pro provides. More on how email variables are used by Trello is available <a href="http://blog.trello.com/create-cards-via-email/">here</a>.</li> </ol> <p><img src="https://farm6.staticflickr.com/5073/14425422041_9acc965248_z_d.jpg" alt=""></p> <ol start="7"> <li>In LCP: Add a new action -> System Actions -> IFTTT. Name can be anything. Trigger Name must match the trigger name in IFTTT. For each value you want to use, add a text prompt. In this example I’m only using Value 1.</li> </ol> <p><img src="https://farm6.staticflickr.com/5537/14427367292_6f2249df85_z_d.jpg" alt=""></p> <ol start="8"> <li>Hit done and you are good to go! Please note: <em>After sending the information to IFTTT it may take up to 5 mins to appear in your board.</em></li> </ol> <p><img src="https://farm4.staticflickr.com/3879/14233796739_efd5e6b108_z_d.jpg" alt=""><br> <img src="https://farm6.staticflickr.com/5238/14420441225_452eec6f4d_z_d.jpg" alt=""><br> <img src="https://farm4.staticflickr.com/3887/14428758365_d2df4fc207_m_d.jpg" alt=""></p><![CDATA[Opening SourceTree from the Command line]]>https://www.timbroder.com/2014/06/opening-sourcetree-from-the-command-linehttps://www.timbroder.com/2014/06/opening-sourcetree-from-the-command-lineFri, 06 Jun 2014 15:33:35 GMT<p>SourceTree is my weapon of choice for a git GUI. I do most of my git work from the command line, but it’s great to look at diffs and branch trees.</p> <p>I was finding it tedious to open SourceTree with Alfred, then opening the correct project.</p> <p>I use this alias to open it right from my working directory:</p> <p><code class="language-text">alias</code> <code class="language-text">sourcetree=``'open -a SourceTree'</code></p> <hr> <p>Then, just <code class="language-text">“sourcetree .”</code> from where I am</p><![CDATA[Delayed Liveblog on the WWDC 2014 Keynote]]>https://www.timbroder.com/2014/06/delayed-thoughts-wwdc-2014-keynotehttps://www.timbroder.com/2014/06/delayed-thoughts-wwdc-2014-keynoteTue, 03 Jun 2014 01:08:39 GMT<p>I was stuck in meetings most of the day but I was able to download the keynote for the train ride home :)</p> <p>Here are some thoughts. If I live tweeted, it probably would have gone something like this. Maybe a few more here..</p> <ul> <li>The dev intro video was awesome. It’s like Apple saying “We love you, we’ve heard you”</li> <li>That’s a lot of Apple engineers present</li> <li>It’s a shame I can’t risk my laptop. I want to play with Yosemite! I dig the</li> </ul> <p>new look</p> <ul> <li> <p>Ooo dark mode</p> </li> <li> <p>Mail drop is huge for work</p> </li> <li> <p>Airdrop from phone to laptop!!</p> </li> <li> <p>Proximity awareness is great for starting an email on the can and finishing it at the desk ;)</p> </li> <li> <p>Proximity hotspot is PERFECT for when I’m on the train</p> </li> <li> <p>Texts in Messages!!!!!</p> </li> <li> <p>Proximity calls is crazy. Listening to music on laptop with headphones, call comes in, boom.</p> </li> <li> <p>Hmm, maybe I’ll install the public beta…..</p> </li> <li> <p>Interactive notifications, thank god. one of the few things still on my “I miss from Android list”</p> </li> <li> <p>Context typing looks hot. I missed switfkey</p> </li> <li> <p>I’m curious if Health can accurately track my sleep. But, I don’t want my device in bed with me</p> </li> <li> <p>Family sharing and photo stream will be cool :) The purchases is great. Laura and I overlap on so many apps and games</p> </li> <li> <p>I’m really curious what your iCloud size limit is going to be. Unlimited? It can store ALL your photos.  I wonder if people will be dumping photos into this from other services</p> </li> <li> <p>Ah, there we go. Paid tiers. Will probably stick with Flickr for my ultimate backup. (All are also backed up to CrashPlan)</p> </li> <li> <p>Hah, Shazam Siri. Nice</p> </li> <li> <p>50 mins in the keynote for DEV</p> <ul> <li>App store improvements are awesome. The lists, searches, App bundles. Apple LISTENED. wow. Whoa App preview videos</li> <li>Ahh There’s Test Flight! And it’s free</li> <li>Extensibility: Inter-app. boom.</li> <li>Notification Center Widgets. boom</li> <li>3rd party keyboards. boom</li> <li>Can’t wait for TouchID support in 1password</li> <li>The user implications of HomeKit are nice. We have a WiMo so I’m on board with other home automation things</li> <li>CloudKit. Boom. The cloud pricing wars were already insane. I’m worried about the performance and availability… Code once though…. I</li> <li>The Metal demos are sick. I don’t do much of that type of gaming. Might be time to start again</li> <li>Mentioning Objective-C. OMG</li> <li>Swift. <strong>BOOM. HOLY SHIT</strong>. Closures, Generics, Namespaces</li> <li>OMG the playground</li> <li>Grabbing the book right now. It’s trending. Pretty cool</li> <li><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 338px; " > <a class="gatsby-resp-image-link" href="/static/8b7d150e8794a8667f30786c904f3e34/2b41d/Bugshot_2014-06-02_210418.png" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 177.21518987341773%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAjCAYAAACU9ioYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAIWUlEQVR42oWVC3CU1RXHr2E6nenYOrWWtoJYHygF0dLiIxgSkwoiHQ0mEPIANUYkxSCEV4ESDSIyGsCoaAHrIwMYIJAxTyIPTTDm/WCTTbKbx773291vX9ndbB67SX6dXcChU6c9M7859565957v++75n08oevpoVXSiNRhRdPegVPfRqzfSb7Fj8Y2gsbvpMkj0mKxoZFc4ZnB40NsH0ctu1FoDnSo1SnUvWsmGqFXbqOxwUtImc17ppFLpoqbPRZ/DQ0OvjpKaOqoa27jY2kFlXTMtGjM9sheFwU671sqlbpmKDieVHQ5qVRLikkLH2QYDhXUmTjaYKW0z81WriVadlVadxIXWTs5+W0t5fQtf1TbRqLPQIg3ynVamvl+i/IqZM40mihqNXFAYEI+szCJy5ToeT8okMmU9MWtzOPv5IU4efZc9pyqou1zDmdpmjnxdzbdfV/DGuQYyam3sbrQQt/MjHl6ZxYLULBakZPFochZCTH8Ecft8xG/nIWYsQESm8saG5/n73xLIyC/gdP6/yD9WTl5RKS3nitl0+hIHqrWcqNdy60t7EdMfQ9xxnUcRETPmE3HHfCKmzWPKPY8jFq4mL2kRh9Li2PrhCbjSwbcNXazK3sHbG9cQ/498LinM1LQMMC1jH+KuKKbc+QgR1xARM6OIuC+KKfdFETErhp9EJZGVnMr6FStJzvuChvPVfFRZx/SkNdyzYCF3vZLDjuJGso5WcPOz6xGz45gy6wki7o8m4r5ohPjdPMLc/qerTJuPuDsa8dCziIXPI558BfHUOsTidYi4lxFRqxF/TkTMWoS4MxIx/eGre67vnxOzjAfjljM3NoG5cYnMjU3kobjlPBibyAMxCcyOfo7Z0df9VebEJDDniRCJV8cxodiyMGJoyI/RaMRmtWGzWrHZZMxmMw6Hk0Gvj+GRUfzDI/hHRhgeGSG0/jperw+fbwi/33+NYcTExAQGg55+rY4OlZoBzQC9vb20NTfh97j4f+Z0OpFlmdGxsfBcjI6MUFpaTlNFGdoLFRR+eZoeZSeD49Bu8dMpD9Nu9XPF4sftG6aiooKSslLKyko4ceI4NTU1DHm9mLQD9Ku6ETabjcylT1J1YDPKszlsXxbFkXf20u6CvZcljlZqOfCNibxmF0qtmcWLY4lb8iRPx8dz/wNzSU5LxWG18MVH+eS9mYOwOxy8nxGPomg/pq5jHH4xhk/y30PjnuR4eR9nK/oprBigsNqE3uYkPT2VpUuXEJ+wjCXLnmFt5kt4XQ4OvJXLqYJPEXa7ncf/MIvXM1dQ+M9tzJk6lbdzd2MagRPtZspUMmVdEvVaN1bZSeaal0j6axQZyU+zMn4hr659EZfNSsmXBVRXlSGsFgv33H0n2SmLOZb7MvdOu43cnJ14gUqlmuoBmWqtkzqjF5fLzcENa1my4DEWR/6RlOjZHNr8AnaLxJH8/Xz68fsIg9nMur9EokiPRdoay8nsFZw69hnWwRHqe7T02bz0mNx0mT2M+D2o89dwOnMJx15dyndr76V73yq+/76O2bNm8nH+foTJamPDkkU0r19N16ZkCuJjyc87iN2gpaSyhqpOC2XNWkqatThdDug5xGTHB3jOb0W9byH6oi1UfX2Omb//DdGPzkU43W52b95MwebXOJO1hn2Jz3H48BHGhoa4WKvkeL2FTy5pOXxeg9XlQVLXYe1oRnm5gqIPP6O6+ByNTQ2kJCexPGEZIhAIoFar6Vap6FL3YpQs4QK12R2YJAuTExOEajVkwUCQgT4tWs0AkmT8obi9Xi8qlSosCDE+Ph6WmtVqxWwyhRkeHsZkNNLS0hxe2NPTzejoKMFgMDzu6upCp9Mzci1RyIfkK0kS4sfkNDk5GV7k8/lwuVy43e6wDyUPPY3HM4jH4wnLLhS70cRkKDA58WPH/ndofDyc7EYL9YIQoYNDCP8k1DS30qxUUn+lg7aeXjoHtDQpu6lpauVySxsqvZFhYOxamkAwSDA4TnA8xMR/IGxFnzKwLZ2uLa+g3LQK1dbnUW97gb7t6XRtSkOZnUbfjgzkPa9iL8gnEAz8z+4jnNnJSA3F6M9txNN6Ee+VJoYUjXja639gsLUWc0s9hi2r+GTjBhK3fMjq1/JI23aYtJzjpL31FWm5RaTuOoWwHtqDD3DJF8IZDDYH7T0q1DpD+PWuf7FBoHrvLrKjFyMit3Bz3HZuS/2AX6V/wU+Xf8ZNCZ9z6/oihO29ndx4JWOBQLgsQrd4o4Vml1/fSm5KBjO2V/LAxmIe2nmemVsv8uDuWmbu/IZ7t5UgpIM70chOHJIRl0VC6lJi6O9H1mmx9arxyDY8JgP2oTFq3tzFrpS1TEkvZsaGYqZmFvGzhKNMTTnEr1e+y83P5CL0e9ZzsVePakCLStGJRtWL0eVBZ5XRGcxorHZ0ZgsSoDj4JjueXcVNyQX8Mv4Av3hqN7cszOaWJ17j54+lc8u8JIQjewWGd7Zhzs9B2r8d6f0cpPxdV/0Hr1/117BnL8fUXIcnCJ5BH4PeoTCe4RE8Pj+DHi/C2t+Lp+okrqpTSOWnsZSfRCorDGMpK8RafhJ71RmspScwK1rxB4IEx0IyDISlGCIwNkaoJwTHgwgmg5xSwXElBCYncY+BXnZicrrxBQIMjwepv6KgXdXLaGAMt8uJxWJBlm34vN6wFE1mM5JkCf9axZjfz9kWP6WtPnzOQew2FwaNDotWg182MeYw09FYS1vdZXx2Cy7Zis1iQjLqGHTZcbsc4eYiy3Z8oQONtmFa+vw0qXxoDF7MOguGAT3mPjWDOhUefTduXQ/ygBKrRoVs0tLb3Ym2rwdZMmDSa9HrdeHuY5Md/BstTXkrs5K+MAAAAABJRU5ErkJggg=='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="Bugshot 2014 06 02 210418" title="" src="/static/8b7d150e8794a8667f30786c904f3e34/2b41d/Bugshot_2014-06-02_210418.png" srcset="/static/8b7d150e8794a8667f30786c904f3e34/c26ae/Bugshot_2014-06-02_210418.png 158w, /static/8b7d150e8794a8667f30786c904f3e34/6bdcf/Bugshot_2014-06-02_210418.png 315w, /static/8b7d150e8794a8667f30786c904f3e34/2b41d/Bugshot_2014-06-02_210418.png 338w" sizes="(max-width: 338px) 100vw, 338px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span></li> </ul> </li> </ul> <p>————<br> Written using [MarsEdit](<a href="https://itunes.apple.com/us/app/marsedit-blog-editor-">https://itunes.apple.com/us/app/marsedit-blog-editor-</a> for-wordpress/id402376225?mt=12&#x26;at=11laRZ&#x26;ct=pro)</p><![CDATA[Reordering a NSFetchedResultsController]]>https://www.timbroder.com/2014/05/reordering-nsfetchedresultscontrollerhttps://www.timbroder.com/2014/05/reordering-nsfetchedresultscontrollerSat, 31 May 2014 16:14:22 GMT<p>I’m working with a NSFetchedResultsController backed UITableView.  Up until now I’ve just been ordering the items by the time they were added.</p> <p>I’m moving on to Delete and Edit.  Editing the content itself isn’t needed, once an item is added to this list, it can’t be changed. Deleting is straightforward in</p> <div class="gatsby-highlight" data-language="c"><pre style="counter-reset: linenumber NaN" class="language-c line-numbers"><code class="language-c"><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span>controller<span class="token operator">:</span><span class="token punctuation">(</span>NSFetchedResultsController <span class="token operator">*</span><span class="token punctuation">)</span>controller didChangeObject<span class="token operator">:</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span>anObject atIndexPath<span class="token operator">:</span><span class="token punctuation">(</span>NSIndexPath <span class="token operator">*</span><span class="token punctuation">)</span>indexPath forChangeType<span class="token operator">:</span><span class="token punctuation">(</span>NSFetchedResultsChangeType<span class="token punctuation">)</span>type newIndexPath<span class="token operator">:</span><span class="token punctuation">(</span>NSIndexPath <span class="token operator">*</span><span class="token punctuation">)</span>newIndexPath <span class="token punctuation">{</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span></span></pre></div> <p>With reordering, I have a conundrum.  I have an <a href="http://stackoverflow.com/a/2013070/647343">approach</a> for the actual re-order that will have the View and the data playing nice. But, now I need to persist the order.  I don’t have a property in Core Data for this (yet).  I’m trying to figure out what to set this property to. The brute force approach is to use the indexPath of the cell.  I have concerns with this.  Adding an item automatically puts it at the top of the list. This would give it an index of 0 (I only have 1 section).  But, then I would have to update the order property of every other item in the list. The same goes for moving: each item and every item in between (I can luckily skip the outer bounds) will have to be updated. I don’t like this. There has to be a better way, I just need to figure it out.</p> <p>Some kind of indexPath+hash? indexPath+integer?</p> <p>Eventually I’ll reach a list size where I run into performance problems with the brute force approach. The cop out would be to limit the size of the list. I don’t want to do that either.  I don’t know if I’ll go to the extreme of Brent Simmons’ data set of <a href="http://inessential.com/2013/10/05/vesper_sync_diary_2_core_data">30,000 items from Daring Fireball’s archive</a>, but I want to shoot for that.</p> <p>I’ll update this post with my progress</p> <p><strong>Update</strong> 2014-05-31 01:02 PM</p> <p><a href="http://stackoverflow.com/a/1648504">This</a> is a great starting point for dealing with reordering. I was on the right track with only dealing with the differences between items that get moved.  Dragging an item way down on a list may(?) not happen much, it’s annoying to do. I think I’m going with that assumption for now.  I still don’t feel great about the number of updates for an insert…</p> <p>Batch fetch/update/save is my starting point</p> <p><strong>Update</strong> 2014-06-06 04:04 PM</p> <p>It looks like iOS 8 might have better bulk update support. Downloading <a href="http://devstreaming.apple.com/videos/wwdc/2014/225xxgzhqylosff/225/225_hd_whats_new_in_core_data.mov?dl=1">this</a> session now</p> <blockquote> <p><a href="https://twitter.com/inessential">@inessential</a></p> </blockquote> <p><a href="https://twitter.com/brentsimmons">@brentsimmons</a> You might like the Core Data video. new NSBatchUpdateRequest api with a “mark all as read” example as the demo</p> <blockquote> </blockquote> <blockquote> <p>-- solsberg (@solsberg) [June 6,</p> </blockquote> <p>2014](<a href="https://twitter.com/solsberg/statuses/474993780186447872">https://twitter.com/solsberg/statuses/474993780186447872</a>)</p><![CDATA[The Old Reader on Good Ol’ RSS]]>https://www.timbroder.com/2014/05/the-old-reader-on-good-ol-rsshttps://www.timbroder.com/2014/05/the-old-reader-on-good-ol-rssFri, 09 May 2014 22:40:24 GMT<blockquote> <p>It’s always odd to hear people say RSS is dead. The fact is, RSS is easily</p> </blockquote> <p>the most successful stealth, insurgent technology on the web. It is pervasive and is the engine for much of the Internet.</p> <p>Long live RSS!</p><![CDATA[Up and Running with MindSea: Doing it the Right Way]]>https://www.timbroder.com/2014/05/up-and-running-with-mindsea-doing-it-the-right-wayhttps://www.timbroder.com/2014/05/up-and-running-with-mindsea-doing-it-the-right-wayFri, 09 May 2014 02:03:47 GMT<blockquote> <p>I once worked with a company that told me if just two lines of code are</p> </blockquote> <p>repeated, then there’s probably a better abstraction that I should be using instead. A bit extreme, I know, but I took that to heart. I haven’t looked back and that advice has served me well.</p> <p>Ash Furrow talks about the benefits of abstraction and how it can aid in ramp up. A good, short read</p><![CDATA[Poking at an AngularJS model from within an iFrame]]>https://www.timbroder.com/2014/05/poking-angularjs-model-within-iframehttps://www.timbroder.com/2014/05/poking-angularjs-model-within-iframeWed, 07 May 2014 16:07:24 GMT<p>Full Disclosure: This is dirty and hacky. You may feel unclean after reading. Grab soap.</p> <p>For a few infrastructure reasons I won’t get into, we have an iFrame on a page that Angular renders.  It pulls in a page that exists within our code base and on the same site. Thankfully, no Cross Domain issues to worry about.  The page within the iFrame needs some configuration from the parent page. When a user is done in the iframe and hits a button inside of it, the parent page needs some information from it.  This information has to be updated in an Angular model on the parent page.</p> <p>Starting off a partial template:</p> <div class="gatsby-highlight" data-language="html"><pre style="counter-reset: linenumber NaN" class="language-html line-numbers"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>iframe</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/....html<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>100%<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>800<span class="token punctuation">"</span></span> <span class="token attr-name">scrolling</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>no<span class="token punctuation">"</span></span> <span class="token attr-name">seamless</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>seamless<span class="token punctuation">"</span></span> <span class="token special-attr"><span class="token attr-name">style</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token value css language-css"><span class="token property">border</span><span class="token punctuation">:</span>0<span class="token punctuation">;</span></span><span class="token punctuation">"</span></span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>iframe</span><span class="token punctuation">></span></span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <p>On the directive, I attach a configuration method to the window. Not great, I know.</p> <div class="gatsby-highlight" data-language="javascript"><pre style="counter-reset: linenumber NaN" class="language-javascript line-numbers"><code class="language-javascript"><span class="token function-variable function">link</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">scope<span class="token punctuation">,</span> element<span class="token punctuation">,</span> attrs</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> top<span class="token punctuation">.</span>window<span class="token punctuation">.</span><span class="token function-variable function">TTTpassConfig</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> config <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span> config<span class="token punctuation">.</span>RPCurl <span class="token operator">=</span> attrs<span class="token punctuation">.</span>initRpcurl<span class="token punctuation">;</span> config<span class="token punctuation">.</span>xml <span class="token operator">=</span> attrs<span class="token punctuation">.</span>initXml<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>This gets called from within the iFrame:</p> <div class="gatsby-highlight" data-language="javascript"><pre style="counter-reset: linenumber NaN" class="language-javascript line-numbers"><code class="language-javascript">parent<span class="token punctuation">.</span><span class="token function">passConfig</span><span class="token punctuation">(</span><span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <p>At some point, the inner page is done, and needs to call back to the parent with data:</p> <div class="gatsby-highlight" data-language="javascript"><pre style="counter-reset: linenumber NaN" class="language-javascript line-numbers"><code class="language-javascript">parent<span class="token punctuation">.</span><span class="token function">callSave</span><span class="token punctuation">(</span>outputXml<span class="token punctuation">)</span><span class="token punctuation">;</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <p>But, this method needs to live in the partial template AND update the model. For simplicity, I went with inline JS and created the proper textarea to hold my data and bind to the model. Below I can see that the data is coming back, and the textarea has the text. There are two problems with this: 1) The model itself isn’t getting updated and 2) This js is outside of Angular’s scope so I can’t just call $apply. Angular’s dirty checking won’t see this change. I needed a way to update the model from outside Angular.</p> <div class="gatsby-highlight" data-language="html"><pre style="counter-reset: linenumber NaN" class="language-html line-numbers"><code class="language-html">{% verbatim %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text/javascript<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">function</span> <span class="token function">callSave</span><span class="token punctuation">(</span><span class="token parameter">payload</span><span class="token punctuation">)</span><span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'Data being saved from iframe: '</span><span class="token punctuation">,</span> payload<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">var</span> $elm <span class="token operator">=</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#iframe-data'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> $elm<span class="token punctuation">.</span><span class="token function">val</span><span class="token punctuation">(</span>payload<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>iframe</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/....html<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>100%<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>800<span class="token punctuation">"</span></span> <span class="token attr-name">scrolling</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>no<span class="token punctuation">"</span></span> <span class="token attr-name">seamless</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>seamless<span class="token punctuation">"</span></span> <span class="token special-attr"><span class="token attr-name">style</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token value css language-css"><span class="token property">border</span><span class="token punctuation">:</span>0<span class="token punctuation">;</span></span><span class="token punctuation">"</span></span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>iframe</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>pre</span><span class="token punctuation">></span></span>{{parent[uuid][data.id].value}}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>pre</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>textarea</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text<span class="token punctuation">"</span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>iframe-data<span class="token punctuation">"</span></span> <span class="token attr-name">ng-model</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>parent[uuid][data.id].value<span class="token punctuation">"</span></span> <span class="token attr-name">data-name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{{data.name}}<span class="token punctuation">"</span></span> <span class="token attr-name">data-id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{{data.id}}<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{{data.value}}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>textarea</span><span class="token punctuation">></span></span> {% endverbatim %}</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>The trick ended up being that ngModel listens for an “input” event. Use that, hide the textarea, and I’m good to go</p> <div class="gatsby-highlight" data-language="html"><pre style="counter-reset: linenumber NaN" class="language-html line-numbers"><code class="language-html">{% verbatim %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text/javascript<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">function</span> <span class="token function">callSave</span><span class="token punctuation">(</span><span class="token parameter">payload</span><span class="token punctuation">)</span><span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'Data being saved from iframe: '</span><span class="token punctuation">,</span> payload<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">var</span> $elm <span class="token operator">=</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#iframe-data'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> $elm<span class="token punctuation">.</span><span class="token function">val</span><span class="token punctuation">(</span>payload<span class="token punctuation">)</span><span class="token punctuation">;</span> $elm<span class="token punctuation">.</span><span class="token function">trigger</span><span class="token punctuation">(</span><span class="token string">'input'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>iframe</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/....html<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>100%<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>800<span class="token punctuation">"</span></span> <span class="token attr-name">scrolling</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>no<span class="token punctuation">"</span></span> <span class="token attr-name">seamless</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>seamless<span class="token punctuation">"</span></span> <span class="token special-attr"><span class="token attr-name">style</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token value css language-css"><span class="token property">border</span><span class="token punctuation">:</span>0<span class="token punctuation">;</span></span><span class="token punctuation">"</span></span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>iframe</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>pre</span><span class="token punctuation">></span></span>{{parent[uuid][data.id].value}}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>pre</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>textarea</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text<span class="token punctuation">"</span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>iframe-data<span class="token punctuation">"</span></span> <span class="token attr-name">ng-model</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>parent[uuid][data.id].value<span class="token punctuation">"</span></span> <span class="token attr-name">data-name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{{data.name}}<span class="token punctuation">"</span></span> <span class="token attr-name">data-id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{{data.id}}<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{{data.value}}<span class="token punctuation">"</span></span> <span class="token special-attr"><span class="token attr-name">style</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token value css language-css"><span class="token property">display</span><span class="token punctuation">:</span> none<span class="token punctuation">;</span></span><span class="token punctuation">"</span></span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>textarea</span><span class="token punctuation">></span></span> {% endverbatim %}</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>I know the Angular way to do this would have been a combination of $watch and $apply from within the directive. I went down that road for a few hours. Because of timeline constraints I have to leave as is. I’ve acknowledged that I’m incurring technical debt and marked a TODO that may or may never get addressed.</p><![CDATA[Facebook Launches AppLinks To Make Deep Linking Between Apps Easier]]>https://www.timbroder.com/2014/05/facebook-launches-applinks-to-make-deep-linking-between-apps-easierhttps://www.timbroder.com/2014/05/facebook-launches-applinks-to-make-deep-linking-between-apps-easierSat, 03 May 2014 00:09:09 GMT<blockquote> <p>So with this new scheme, you just pass the app a web URL and if a compatible</p> </blockquote> <p>mobile app is installed, it will automatically load that app instead of the web version. AppLinks will learn which links are handled by which apps. “We crawl the web for you. You don’t have to do it – but you can, you just don’t have to,” Sukhar said. Developers simply mark up their web pages with a few new meta properties. Facebook also offers a Parse module and an API to support these features.</p> <p>Nice. Not the better inter-app communication that we've been wanting from Apple but it will help</p><![CDATA[How to be an open source gardener]]>https://www.timbroder.com/2014/05/how-to-be-an-open-source-gardenerhttps://www.timbroder.com/2014/05/how-to-be-an-open-source-gardenerFri, 02 May 2014 21:09:48 GMT<p>A good read on triaging issues using the Rails project as an example</p> <blockquote> <p>What are Issues?</p> </blockquote> <blockquote> </blockquote> <blockquote> <p>The very first thing your project needs to do is to figure out what Issues</p> </blockquote> <p>are supposed to be for. Each project is different. For example, in Rails, we keep Issues strictly for bugs only. Help questions go to Stack Overflow, and new feature discussion and requests go to the rails-core mailing list. For Rust, we have issues for feature requests, meta-issues… everything. For some repositories, closing all of the issues is not feasible, and for others, you’re shooting for zero. (If you don’t believe that this is even possible, check out Sequel. Issues are rarely even open for more than a few days!)</p><![CDATA[Ember, iCloud & App Reviews by @dancounsell — Realmac Blog]]>https://www.timbroder.com/2014/04/ember-icloud-app-reviews-by-dancounsell-realmac-bloghttps://www.timbroder.com/2014/04/ember-icloud-app-reviews-by-dancounsell-realmac-blogSat, 26 Apr 2014 23:26:35 GMT<blockquote> <p>The worst thing is we can't reply to those users. It makes me sad to see</p> </blockquote> <p>users that are having issues and know that we can help, but yet have no way of contacting them. This is one thing that needs to change on the App Store.</p> <p>I agree. I sometimes have luck with stalking people down on twitter. But, it breaks my heart when I could easily help someone if they have an issue with <a href="https://itunes.apple.com/us/app/weather-notifications/id704052114?ls=1&#x26;mt=8&#x26;at=11laRZ&#x26;ct=LCP">Weather Notifications</a></p><![CDATA[Build 2014]]>https://www.timbroder.com/2014/04/build-2014https://www.timbroder.com/2014/04/build-2014Fri, 11 Apr 2014 23:58:54 GMT<p><a href="http://carpeaqua.com/2014/04/07/build-2014/">Justin</a> goes over his experience at the Microsoft Build conference this year:</p> <blockquote> <p>With things like C#, the Roslyn compiler/frameworks, and the modern WinRT</p> </blockquote> <p>runtime, it feels like Microsoft is way ahead of Apple in the future looking regard. As a developer, I’m jealous of a lot of the technologies coming out of Microsoft. As a user? They’ve got a long ways to go before I consider using Windows over a Mac. That said, this is the new Microsoft. They don’t need me to use Windows or Windows Phone as long as I use Microsoft services like Azure, Office 365 and the like.</p> <p>After following what both he and Brent Simmons have been doing with Azure, I'm more than a little curious to tinker with it. I've only recently tried something higher level than AWS, I was a heroku virgin. So, I don't feel I'm biased. The price wars, as well as a <a href="http://carpeaqua.com/2014/03/26/the-parts-of-your-platform/">number</a> of <a href="http://www.marco.org/2014/03/27/web-hosting-for-app-developers">arguments</a> for/<a href="http://inessential.com/2014/03/27/on_running_your_own_servers_and_why_we">against</a> VPS vs <a href="http://www.marco.org/2014/03/27/what-did-brent-learn">higher</a> level have had this on my kind lately. Mobile Services as a first class citizen on Azure is interesting. AWS is trying with their push service, but it feels like an afterthought at the moment.</p><![CDATA[“Security”]]>https://www.timbroder.com/2014/04/securityhttps://www.timbroder.com/2014/04/securityFri, 11 Apr 2014 23:53:21 GMT<blockquote> <p>Were the National Security Agency an agency charged with the security of our</p> </blockquote> <p>nation, it would have reported the Heartbleed bug immediately instead of exploiting it.</p><![CDATA[NSA Said to Exploit Heartbleed Bug for Years]]>https://www.timbroder.com/2014/04/nsa-said-to-exploit-heartbleed-bug-for-yearshttps://www.timbroder.com/2014/04/nsa-said-to-exploit-heartbleed-bug-for-yearsFri, 11 Apr 2014 23:51:07 GMT<blockquote> <p>If an organized hacker ring sabotaged security standards and major tech</p> </blockquote> <p>infrastructure for years, compromising the security of hundreds of millions of people and many governments including our own (and potentially causing billions of dollars in damages when these exploits were found by others), and exploited any flaws they found or created to spy on millions of people in the world including our own citizens, what should they be charged with? Mass criminal sabotage, cybercrime, cyberwarfare, and computer fraud? Obviously. Terrorism? Maybe, but not quite. At what point do the NSA’s actions qualify as treason? I’d say they’re well past that point.</p> <p>~ Marco</p><![CDATA[Brian on Data Migration]]>https://www.timbroder.com/2014/04/brian-on-data-migrationhttps://www.timbroder.com/2014/04/brian-on-data-migrationWed, 09 Apr 2014 22:32:16 GMT<blockquote> <p>Pretty much any migration can be done without stopping the world. You</p> </blockquote> <p>migrate in steps, with double writes and double reads at some points. Here’s the general outline</p><![CDATA[Then and Now]]>https://www.timbroder.com/2014/04/nowhttps://www.timbroder.com/2014/04/nowSun, 06 Apr 2014 13:46:28 GMT<p><a href="/images/2014/04/140324.jpg"><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <span class="gatsby-resp-image-background-image" style="padding-bottom: 137.34177215189874%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAbABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAABAABAwUG/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAFWNVDoFY0nZ8+02RM//8QAHhAAAgEDBQAAAAAAAAAAAAAAAQIAAxETBBASITL/2gAIAQEAAQUCVwGym4YsMdMAInGDT22SlkEbqUPH/8QAGREAAgMBAAAAAAAAAAAAAAAAABEBAhAS/9oACAEDAQE/AXB3XEf/xAAZEQADAAMAAAAAAAAAAAAAAAAAAQIQERL/2gAIAQIBAT8BUs4rGz//xAAgEAACAQIHAQAAAAAAAAAAAAAAEQEhgRASMTJBYZHR/9oACAEBAAY/AqzOo447Po0NeFDe7DY82Nz/xAAcEAADAAIDAQAAAAAAAAAAAAAAAREhMUFhcVH/2gAIAQEAAT8hdslfWGO9FSCwjXohVt4FGrPRrp6xqZ6LoRqusXEGYZZ4RRm0Tc3Kbx//2gAMAwEAAgADAAAAEFfNDv/EABkRAAMBAQEAAAAAAAAAAAAAAAABEWEhMf/aAAgBAwEBPxDJj0K3ekP0/8QAGBEAAwEBAAAAAAAAAAAAAAAAAAERQTH/2gAIAQIBAT8QSXRQwUWFYf/EACAQAQEAAgEEAwEAAAAAAAAAAAERACFBMVFh4XGRobH/2gAIAQEAAT8QMTwDUOZlpzOjbWcauDDw4l/MoQcwWP3jeRMCHPzvGRaPc9mNN0b7jAoyHZN98dMOgaXz185VN5A9LsS14xwDu/hn/9k='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="140324" title="" src="/static/96696e11b801746df415441ebcbbcd51/828fb/140324.jpg" srcset="/static/96696e11b801746df415441ebcbbcd51/ff44c/140324.jpg 158w, /static/96696e11b801746df415441ebcbbcd51/a6688/140324.jpg 315w, /static/96696e11b801746df415441ebcbbcd51/828fb/140324.jpg 630w, /static/96696e11b801746df415441ebcbbcd51/0c96c/140324.jpg 692w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </span></a></p><![CDATA[inessential.com: Paul’s Talk on Core Data]]>https://www.timbroder.com/2014/04/inessential-com-pauls-talk-core-datahttps://www.timbroder.com/2014/04/inessential-com-pauls-talk-core-dataThu, 03 Apr 2014 12:41:35 GMT<blockquote> <p>it’s more that I’m eternally on the fence about Core Data.</p> </blockquote> <p>Brent Simmons goes into a few examples on the mind games you have to play when thinking about Core Data scenarios. We are all pretty wired for relational thinking. More recently we've learned to think more TKTK. Core Data and it's object graph is yet another way of thinking</p> <p>I'm learning Core Data as part of my next app and am enjoying it so far. Eventually I'll be tackling sync. I need to see for myself how bad Coe Data sync is. I've had some exposure to FMDB by tinkering with Marco Arment's FCOfflineQueue in the same app.</p><![CDATA[Begging For App Ratings]]>https://www.timbroder.com/2014/04/begging-app-ratingshttps://www.timbroder.com/2014/04/begging-app-ratingsTue, 01 Apr 2014 13:51:28 GMT<blockquote> <p>John Gruber recently suggested that users who are annoyed by “Please Rate</p> </blockquote> <p>This App” panes should leave one-star reviews. We have a “contact us” menu item under our Help menu, but if users decide to post reviews instead, we cannot provide any tech support. So we also can’t tell the other four people that their crashers should be fixed now, and they should update to the version on our website (or wait for the App Store approval). Apple’s customers are Apple’s customers, except we’re supposed to support them, but we aren’t provided the tools by Apple to do so.</p><![CDATA[inessential.com: Azure Takes Over]]>https://www.timbroder.com/2014/04/inessential-com-azure-takeshttps://www.timbroder.com/2014/04/inessential-com-azure-takesTue, 01 Apr 2014 13:50:22 GMT<blockquote> <p>There’s still a lot of the old Microsoft there, the Windows, Office,</p> </blockquote> <p>Exchange, and Sharepoint (WOES) company. It’s most of the company by far, surely. (I just made up the acronym WOES. It fits.)</p> <p>Brent Simmons talked a little about the new Microsoft CEO coming from the azure team and what it could mean. I love this acronym.</p><![CDATA[Tips and Resources for beginning iOS Development]]>https://www.timbroder.com/2014/03/tips-resources-beginning-ios-developmenthttps://www.timbroder.com/2014/03/tips-resources-beginning-ios-developmentSun, 30 Mar 2014 17:41:32 GMT<blockquote> <p>While you are planning and building out your application, think about the</p> </blockquote> <p>user experience and interface a lot. Tweak, try things out, and above all, design something that avoids complexity. If you look at all of the top selling apps, they are the ones that have removed complexity, and distilled down the application idea into its most simplistic form possible while still maintaining a good range of functionality. There's a fine line begin being simple and being useless, and it's up to you to find that line and stay on the useful side.</p> <p>I'm trying harder to plan out the design of my next app when appropriate. This time I sketched out all the user flows I could think of, in advance, on paper. This helped a lot when modeling classes and data.  This is something I really have to force myself to do, I really just want to jump into the code. But, we know that just bites you in the ass, you just end up with spaghetti code. Case and point being the massive UIViewController in <a href="https://itunes.apple.com/us/app/weather-notifications/id704052114?ls=1&#x26;mt=8&#x26;at=11laRZ&#x26;ct=blog">Weather Notifications</a>.  It's due for a refactor. I have a post in draft about the new features for that app.</p> <p>As I code, I do find issues with the flow. I'm playing around with the app in the simulator, realize that what I designed just doesn't work, so I fix it in the code. The philosophical question at this point is do I update my mocks? Why didn't I catch it? Is there a way I could have? Still thinking about the answer to those.</p><![CDATA[Quote of the day by David of 37signals]]>https://www.timbroder.com/2014/03/quote-day-david-37signalshttps://www.timbroder.com/2014/03/quote-day-david-37signalsSat, 29 Mar 2014 15:40:50 GMT<blockquote> <p>“But what’s the harm in over-testing, Phil, don’t you want your code to be</p> </blockquote> <p>safe? If we catch just one bug from entering production, isn’t it worth it?”. Fuck no it ain’t, and don’t call me Phil. This line of argument is how we got the TSA, and how they squandered billions fondling balls and confiscating nail clippers.</p><![CDATA[ReadKit article sorting: group by feed in Feed Wrangler smart streams]]>https://www.timbroder.com/2014/03/readkit-article-sorting-group-feed-feed-wrangler-smart-streamshttps://www.timbroder.com/2014/03/readkit-article-sorting-group-feed-feed-wrangler-smart-streamsSat, 29 Mar 2014 15:40:16 GMT<blockquote> <p>I upgraded to Version 2.4 of ReadKit the other day and found my new</p> </blockquote> <p>feeds—the ones in the RSS News smart folder—in reverse chronological order. I could’ve sworn I had them set up the other way in 2.3, so I hunted for a way to switch the ordering around. It’s not in the or under the menu. You have to right-click on the RSS News item in the left panel and choose from the popup menu. That brings up a sheet where you can set the ordering.</p> <p>Thank god. This was driving me nuts.</p><![CDATA[Drafts]]>https://www.timbroder.com/2014/03/draftshttps://www.timbroder.com/2014/03/draftsFri, 28 Mar 2014 16:07:22 GMT<p>On the plane last night I realize that I have quite a number of draft posts sitting in <a href="https://itunes.apple.com/us/app/weather-notifications/id704052114?ls=1&#x26;mt=8&#x26;uo=4&#x26;at=11l4Cf&#x26;ct=blog">Drafts</a>. These came in from <a href="https://itunes.apple.com/en/app/instapaper/id288545208?mt=8&#x26;uo=4&#x26;at=11l4Cf&#x26;ct=blog">Instapaper</a> on the train. I probably read an unhealthy amount of things in Instapaper.  I’m going to try to be more diligent about posting these in real time. For now I’ve scheduled these out over the next few days</p><![CDATA[Automating Layouts Bring Flipboard’s Magazine Style To Web And Windows]]>https://www.timbroder.com/2014/03/automating-layouts-bring-flipboards-magazine-style-to-web-and-windowshttps://www.timbroder.com/2014/03/automating-layouts-bring-flipboards-magazine-style-to-web-and-windowsMon, 24 Mar 2014 22:52:37 GMT<blockquote> <p>We automate the whole process of layout design and editing by slotting your</p> </blockquote> <p>content into custom-designed page layouts — like fitting puzzle pieces together. We start with a set of page layouts created by human designers. Then our layout engine figures out how to best fit your content into these layouts, considering things like page density, pacing, rhythm, image crop and scale. In many ways, that is the key to Flipboard’s signature look and feel: at its heart are the work of real designers.</p> <p>I've worked on 4 major publishing sites at Ai. 2 were our custom django publishing platform, the other two were wordpress with heavy customization on the backend. The hardest part is designing, in advance, article templates that can be infinitely flexible for an army of editors you may never meet. (We try to meet all we can, but staffs change over time)</p> <p>The way that flipboard handles this is fascinating. I wish we had time on one of these sites to get to this level.</p><![CDATA[How I use my Launch Center Pro homescreen]]>https://www.timbroder.com/2014/03/launch-center-pro-homescreenhttps://www.timbroder.com/2014/03/launch-center-pro-homescreenMon, 24 Mar 2014 19:58:57 GMT<p>Recently <a href="http://jwie.be/launch-center-pro-daily-journaling">there</a> have <a href="http://nerdgap.com/launch-center-pro-an-adoption-strategy-for-those-having-trouble-adopting-it/">been</a> a <a href="http://johnnyrk.com/blog/2014/3/19/updating-updates">few</a> Launch Center Pro articles that have recaptured my attention. I had tried a few months ago to simplify my home screen, no luck. This time, it's sticking.</p> <p><a href="/images/2014/03/BjINmu5IQAAlbgA.png"><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 600px; " > <span class="gatsby-resp-image-background-image" style="padding-bottom: 177.21518987341773%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAjCAIAAAAblL1PAAAACXBIWXMAAAsTAAALEwEAmpwYAAAH/0lEQVR42k2VfVRT9xnHf7yEJJDk3pvcm3uT3OTm7eY9IS+EAOE1gKAI8aUieYUQiIBIAgqIFBSnPfhSrFpsV5kvnaweZ31rHVaP1U4Pm+6s7ea6aVfX6plnf2j12Orqqmd3J/afff57/vg+L9/nnOcBCAQLJSJYI6KsagzHODlsIYriBIFiGIqKRChGQTAGgCAjAwCQncPlEmpYbYZwOSsrE4AsEDy/OnV/a+DbgZJdtYDDr/7Ztr//9W97P5gD5vzFANxkgZtG+a3mBhoAV/drO64/Gr14r+vQJyCTDUAeGL41efS7s/77PVXvLeGp1KOH374xP3f26hxRU9urhpmtscfnTzxNtXsBWDY5e+cpc/mrb9/7w13AgkFWLou+VJm4O3r0xW+MPy/VWY2/Pjo1M73+7OzrjcHmTiNgrh37vqvjRxuolICaddNf3P9PwfYrhvG5DK4AAAC4cWnuDkq125G7COFw4JJEY2B4eWfDEh5tdkjBQQ9nVpI9syCHyAV8U5kzvlnkH87zBjMyMtPiPA5HJpJgIjIjI5PNZst1WhFJyg0GXCYDAOTyeTKVms3mgJeIYKFGpmJlZf8UAu6CaP3QmqkddRU+RTYAqVzhq3n8EW4eDQCQUP7hib1TOz09gyCbjxbxizbZvRNOVTSdF2TmcCQHHr71+Rzz0HFmr9RBq/7yy8FnRw4xH81NNCwEi9r2PGIY5kXiy2fAVlm+x9Qzk1g13h6Y92eLsgCbh0gH7/imvj5z8p3xwYSvpurci9s37x9jnjNbxzaAihWJPz0+cfOfDRe/Bs4q1xbz0tQr/qbGxQeaWJIcwOMjEv/v5ZGHqq4f+RUHy9zO+XtPf3frFnN99WBUBNzL+AeuZ0xd4E1f5mhcSI+05JPGisk6w97iDF4W4LBZEpVbW9ymdkcQTAsjgiULF8WWFaxYTigVKIcHqcvrqPKFck8Fm8VGSBTzKvAyCjHg6ZlzOByVWFilxMsUGCGE8vLyKNqgsxfRVi9OSHm5uRolJZdKKJmUzc4Ri7Aih6fEVaxRqDMzMwEsEFzQyh+sXPJ4hX+axMR629DJPw+fu7Pp8r8Kl8QIqSzQvW58+56maILLh7ZNTn7+2WdXrvx2fn5eIBAAPId1d2nDs+nd/90yMaeR0cWLwjOfDu4/3n3kU2d4XKfXv3no2Km5jzftmEYl5IcfnPnH7dvHjx9//vyFTCYDaE7OFzbL477eB7DgJI8lsje0bjv97kr1xq27JYtHlQr5xm37pmd+legf4/KRM6dPPXr06KNz554+eUKSJIARZB2Xe5AgDiNIipTihoLy5QMnA7Z4IE55m2mNylpQUVhaS9G2bBY7Go2ePnX6FzP7JzZuhBEEIEKhgCDcHk9ZTY3L6/W4CxbU1QWisZZQuKrc63K56uoWlJaW2mxWGIZxHDcajfn5+TRNQxAEIAiCBAJcLNZqNGaTye12V1dXV1VWBAKBjs5EU1NTSYmXpmmSJHEcF4lEgv8DwC9BEISiKIvFYrfbfT5fJBIZGxvbt++tLVu2rFmzJh6P22w2hYKSSiUYhkEQxOPx+Hw+QBBELBYjCIKiKEmSGo3GaDRWV9ckk32dnR2bN09MTb1+ZHY2HA47nQ69Xm8wGORyOQRBOI4DPp8Pw7BQKMQwDMdxhUJB07TeoJdRCrlGbbSaVVqtxWHXm806vd5sMXs8HpPJJJFICIIAP3UPw7BIJMIwTKVS6XQ6GSmHUJQvFLL5fFZebg4vT0QQMIpJSdLlchmNRqVSKZVK05UhCJJIJCRJarVai8ViMhllCjkiFsNiMYSiHIEAwjBKo8YIiTR9IwxqtTo/P9/pdL50G4JkMpnBYGhsbPT7/Var1eF0OAtcqf7+9s6OPCGi1GpMVgshk6nUGpvNZrVaTS9Jt42iKEVRDoejsrKyuLjYZrOZTEZfte/99483t6zkQgJar3e6nIRMptbSlZWV5eXlBoNBp9MBoVCI47hUKrVarfF43OfzFRYWmq0WgiTrFzeICYKdmyvEcUqtllNpL+12u9frdTgcbrcbkCRJUZRSqaRp2ufzeTyewkK3wWzii0RZXK5CKVepFRAq4qOoyWIpLS21Wq0FBQV2u93lcgGCIND0XxEREgKXErgElytIGENzBAKuUEjICBRDBBAvO49vszt9vlpPUZHT6dRqtek96/V6nU6nUqlopdYo15sUhgKzk9JqzBa915NvN1FmA0Wp5Hq9oqjA2FhXurq7MxgKlZWVOhwOEAwGQ+FwJBCOrm0PH1gVPtgV3JWIREIN3eNVw/t96/c3rh6PxSINHW9Udrxb3z3bs+61kfWDg4NDAwMDoKWlpSUYCCxdGTnTe4y5cI25MfbdG6/0BU1DN4cvMUMXGevoDX9rsmTb951HmKZ3GN/IxyODfQNrB5PJZFocCAablzcnTgw8YX5gGObUg3MLk83VXX+8euPJlRv/ru+dL2sf2Xn9KcM8v/cDU7/76kCqd2BgbTKZAi2BlkAo0LoiUrCvZtWd0cm7b7vmG/w9zU0rz/dv/KZ//Bt/y4f+noHia89av2QWf8WUH7iU6urs7Uv29vaCQCAQDIUigXAwFfXt8JdO1jdsXhFti4TCg+HIzmjbVCiyNtoaqB3fXvvmUd+uw4H+oa7OjlVdadLiUCgUDAVXJ3pGkyOvJjdsSK2PRls7Em2pga5UalUsHg4EW1qblw71dPbFwtFgS1ss1h6LxePx/wE8b13UEUq1qAAAAABJRU5ErkJggg=='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="BjINmu5IQAAlbgA" title="" src="/static/a3f36550e7ab7d34fb359bc45e853c1f/0a47e/BjINmu5IQAAlbgA.png" srcset="/static/a3f36550e7ab7d34fb359bc45e853c1f/c26ae/BjINmu5IQAAlbgA.png 158w, /static/a3f36550e7ab7d34fb359bc45e853c1f/6bdcf/BjINmu5IQAAlbgA.png 315w, /static/a3f36550e7ab7d34fb359bc45e853c1f/0a47e/BjINmu5IQAAlbgA.png 600w" sizes="(max-width: 600px) 100vw, 600px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </span></a></p> <p>A few people have asked me on twitter what flows I use in LCP so I'm throwing this post together. Please note my screens are very much a work in progress. There are some Actions in multiple groups, as well as on the home screen. I also just noticed I'm missing a browser. A lot of these are app launches instead of true actions. Working on adding to that so it's more efficient. But, for things like Instapaper or Pinboard, they detect something in the clipboard on open so a custom action isn't needed.</p> <p>I left a phone on my homescreen because I don't trust myself to realize I missed a call just with notifications. iTrans is a metro north schedule app that I check before I leave work because I'm paranoid a schedule has changed (very healthy, I know).  <a href="https://itunes.apple.com/us/app/clear-tasks-to-do-list/id493136154?mt=8&#x26;at=11laRZ&#x26;ct=lcpbp">Clear</a> and <a href="http://trello.com">Trello</a> organize my work/personal life. (Aside from Jira, but I have yet to find a good iOS app).  <a href="https://itunes.apple.com/us/app/check-the-weather/id557872119?mt=8&#x26;at=11laRZ&#x26;ct=lcpbp">Check the weather</a> has been my weather app of choice since it came out. It's fast and simple.  At work I need to check my calendar a lot so <a href="https://itunes.apple.com/us/app/id718043190?mt=8&#x26;at=11laRZ&#x26;ct=lcpbp">Fantastical 2</a> stays. I've been trying to force myself to use <a href="https://itunes.apple.com/us/app/day-one-journal-diary/id421706526?mt=8&#x26;at=11laRZ&#x26;ct=lcpbp">Day One</a> and <a href="https://itunes.apple.com/us/app/evernote/id281796108?mt=8&#x26;at=11laRZ&#x26;ct=lcpbp">Evernote</a> a lot more. Having them on my homescreen has been invaluable.  The last 4 (<a href="https://itunes.apple.com/us/app/pocket-casts/id414834813?mt=8&#x26;at=11laRZ&#x26;ct=lcpbp">PocketCasts</a>, <a href="https://itunes.apple.com/us/app/tweetbot-3-for-twitter-iphone/id722294701?mt=8&#x26;at=11laRZ&#x26;ct=lcpbp">Tweetbot</a>, <a href="https://itunes.apple.com/us/app/tweetbot-3-for-twitter-iphone/id722294701?mt=8&#x26;at=11laRZ&#x26;ct=lcpbp">Riposte</a>, and <a href="https://itunes.apple.com/us/app/instapaper/id288545208?mt=8&#x26;at=11laRZ&#x26;ct=lcpbp">Instapaper</a>) get opened multiple times a day on average so they needed to stay.</p> <p><a href="/images/2014/03/IMG_2099.png"><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <span class="gatsby-resp-image-background-image" style="padding-bottom: 177.21518987341773%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAjCAIAAAAblL1PAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEuklEQVR42nVVzW8bRRQ3XECCG2orlbSopfSW1Gkcr3d35r2ZWe/3p9e7XsdOkzRRkSgSHxJSKk45UBSpJ77UC7e2F24FFYmq6oULHy1/ARBVAgkOiIorQkbrcbZ2CNLImn2e37z3fu/93tSaS0uh75tCNOp1pdFoLC4ySrtJkoSh77q+48RBkKcpUtpYXFQaS416vS24aYjl8+drRNOAEKJpuqrqqio3WqultVpqs6kqiqYoqqLoaouout4g+jKBJupNnWhajSMyAKvd9hzH4JwBMACOKBhzLMtzHMEYR2AURZtGO/PhtTPRtbPmisJ0VkNKTcPopmkvy6Ig4IhIKRDi2nbe7Xbi2LEsBIIqmoWS3T3y7vf25rdn3J2z2OQl2LWsvNsd9PtJHBucS7DnOIN+/8r2tu95QAmqzOgvXfjq5W9+vbP9wDR3TrOmqMkgQ9+XThgAUoqUWu22a9tFntuWVYI1FGGr99mpN+5B8eVJ++15VFhNnrZNs7PvVi7BWBJFoe+3hUBKGVAk4Oci3MBk3TQMRAoTsMG5a9uSPHmUA9iWbVu2wZm8jgE1mWlz1xaOAMZgDJYAIKTaIy0jFdgyUKWkdMIoBUREMDkKBnR8slbVRrqVYErwzu6Jx7ePPr599M7uCSBAANJW66Gm/0jpI8AdpdWswNXiAEDA4Lj34VOjh6+NHlza++hpk2EL2cV6/edz5/68ceOv4eonp08vc34YmIKBdO/9Z0f3h6N7xd7VZ9pIVMYHCws/zM39dv36L7aze/xFxTAOgstFKaV4a+uln7af27vy/M3Nk5QAADia9vHc3I0Xjtw8dmxrfl5j7BDwmFj0wyTpdMMoiZOMY0l4GIZpngdRFHU63Ty3pj1PEzZNocCJkZd75FN/zZRKwqpfeeiAUTBWfU7aM8+yrc3NwPOqDjMNo5fnvTwvu2nSJOA5zkpRpEnCx1fUZG+uDoevX77cyzLBmIwi8LzhYLA6GIS+L4MyOI/DcHU47GVZKTVKa9Ja9HrDlZVOHMssgBDHslbHYMeyqoyiIFhfWyt6PamCSW+bhhH6PkNk+2FzxMD3A88r095PkgGUM2ucyCTnKqRKGNISBUESx9M5yyEhU5thu7q72lBdp7r+X2Mlof9rknLjOo7rONNGwZhr21a7PeP5AFiGV+R5keeubVeE5d1umiQV/rDeHucWeN76hQsba2vTperEcZamcRh6rguEHO5Z8p+laZam04Q5lhWHYbfTmWlPhuM1m3MUBNUwfmIMQ8s0ccxZTSI5IAeUV0yEAeDYtu+6sjBPWLTt2TqrAKDrvIU6ZTogTDRA9fJNOSCMmVLRBkl33J1Hb33w43tvPlw3OxzUSVWSKEqiqPI8eVs6ncDzJmByXlu9lf0x+n30z+ju31+wV3XWLJ17jtMvin5R+GNipRijIFgpiixNbdMcl2oJtE/170YPRqPR1ce7jc0loTAA4rvuxfX1ixsbgedV4E4cX9raGvT7pqyz0WQL79Rf+Xph4f7y8c9PkUhnWulZMBZ43kQYU2EnUeS57lSHaWC5ZpRHjmkxfV+Sth2Pc/bHRyvCfNeVenxSZ4GszcXUc1OOl7YQbSGm544kspp2/wJUz0t/ThSYHQAAAABJRU5ErkJggg=='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="IMG_2099" title="" src="/static/bf081933877d903af60902075876629f/f058b/IMG_2099.png" srcset="/static/bf081933877d903af60902075876629f/c26ae/IMG_2099.png 158w, /static/bf081933877d903af60902075876629f/6bdcf/IMG_2099.png 315w, /static/bf081933877d903af60902075876629f/f058b/IMG_2099.png 630w, /static/bf081933877d903af60902075876629f/6af66/IMG_2099.png 640w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </span></a></p> <p>This is my main screen. From bottom left to top right: Text my wife Apps that I use to consume things Apps that I use to "do" things Contacts and logging to Day One Group texting and communication Random things and <a href="http://timbroder.com/2013/03/automating-adding-to-trello-on-ios.html">adding to Trello</a></p> <p><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <a class="gatsby-resp-image-link" href="/static/2a8b1650bf8a536a16c51e7fee1e11b4/6af66/IMG_2100.png" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 177.21518987341773%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAjCAIAAAAblL1PAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEz0lEQVR42u2VW29UVRTHzxuGAN4SEGovc677fs6cOZ1zZuac6Vw6pUVa6mhbkBYKdGgoOm3pfbCFYdILbbWUQtqggRISH0yMiSaiJvAAEqL4CXjQCFFDUCMCiiSlZjoViUDCByD5v+y91y9rZ+3/WpuTRfF/kgSBERK07Wg4HA2HI6GQxpjI8w9HcgjChwUBALJ8XxCAR4ZxFONHihGSFcbsMQEU48fCT6Kn8FP4iWBGiEqpSplK6X/2xFhb0IP2VLM7RMOE3YcxhILLxRcVSYJAMSYLBwBjARMBE7CwzG1KGAoYCAThHIwhtLzerQ1bmhOJ1+PxXAaEcTnBCSAlFLGcIPQvX4s8CeTdrnh82QthrjA//8jU1K/Xf7lw/qs7f92pWr9eFkWVkEsamG+qn2/ZcUnHKkIyRhugejvWdG//zPyeiUkYKMSQKyooODk7e/XKldkTJ+bm7m2qqxMEwSPL35aGfs/sv96w8RtD8wAgQPiGx/oxGL+6ueXWppZpf8wFlGzmYzMzd/+++/np07dv3qyJx0VRVBE6u3rVrZrXri195syKZdnMBFdLyg+q9f0q1w3FPQ6ICyFOkaQNlZUz09OTExOpnm5DdxMImaY1ulyDa9YMFeQ3iiKmlGCsAdDp4sccJ4NwzMVDSheeilKPbvgsn7fYSzEhCFler+E4qt/vdhzDtj26TrNVw8S0zJKQ7pRApjKEOIoJhYqq8EQuQlIRRShbWISQoiB5QQrIvRNFiEkuKhUiPp8CiWLCUSBT+xVYP27vmi3dPkGoThEkCMWiwdr4utr4ulg0SBCiCFJVRzV79R3T5clTuvMqARLHpELcMLb21Pxnl+8d/nIOmHUU8IzQpsbao5PDRyeHmxprGaFUEUmwypi4NnZu7ux3886W40jM54hY4Nv5ftvH859cvBHu/BnoVQyKjLLqyrIL589cOH+murJMpYzIgh6tq57586OLf7S/NydFxhgo5KjCo7K3/F2X1eaf8kLHAbYoAhSTSNhpqK9pqK+NhB1KCIUyMaLGri98nb8VVJ0T3JtVJHIqIX6/bce2BKL1pq/Mb5o5t5vFxSWOHbT9xR6d5KoIgeGvcNbusOwqSlSKEadS6jO9PkMNmJrfNEyjOGdjXXPb/oDPstyalqs2QcjQsG2xgE+nGC12FVQUSQKimP1YoCIFnNC2XR1bm9sbEq0Nidatze3bWjqdYARDBQHKF1CJJ5QsdBVBuFj36Ej0a4LFBFmC4WhZR/9YR//owPDUwPBUR/9ox8BYtGydxMtuQ9iZejFWnScLkBHMQUkIbUptzHzauKe/vrVPkmAoEkv2DnbvG00fnEofPNK9bzTZNxgprZBFsbH3+c7R5V2Hl3ptF1Yop/Iv57WfXPbh/PJ45rngdgmScDiW7BvqTY+PHDo2cuhYb3q8NTUUjVVIvNSUXvH2ySWdM0sWYcYXik1dKz/4+iWPlbfyBSBLoUhZW2qoLTXUm36nJz3e2jfYtnc4EiuXBZnpfG3yWbt89eK1s6YFwG9ZpZGIaVpwER7uSY8PDB/eNzKVyrzbvnckUloOZNFrmLY3FjBLGHlgeqqUulVVYwwpcjAU2911YHdXOtmTSfZm3uw+sLv7QCi6FiqySqnuVt0qy03PfwCTlACEJAb94wAAAABJRU5ErkJggg=='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="IMG_2100" title="" src="/static/2a8b1650bf8a536a16c51e7fee1e11b4/f058b/IMG_2100.png" srcset="/static/2a8b1650bf8a536a16c51e7fee1e11b4/c26ae/IMG_2100.png 158w, /static/2a8b1650bf8a536a16c51e7fee1e11b4/6bdcf/IMG_2100.png 315w, /static/2a8b1650bf8a536a16c51e7fee1e11b4/f058b/IMG_2100.png 630w, /static/2a8b1650bf8a536a16c51e7fee1e11b4/6af66/IMG_2100.png 640w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span></p> <p>Reading/Listening apps that I just can't live without. Instapaper stayed on the homscreen. Tried living without it, didn't work. I open that app multiple times a day.  When I'm in the mood, I use Velocity for speed reading. <a href="https://itunes.apple.com/us/app/pushpin-for-pinboard/id548052590?mt=8&#x26;at=11laRZ&#x26;ct=lcpbp">Pushpin</a> is a new addition. I'm a fan of <a href="https://itunes.apple.com/us/app/pinbook-for-pinboard/id564452716?mt=8&#x26;at=11laRZ&#x26;ct=lcpbp">Pinbook</a>, but giving this one a try.</p> <p><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <a class="gatsby-resp-image-link" href="/static/2c140ddaa5d2771743d0100ce92d3e51/6af66/IMG_2101.png" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 177.21518987341773%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAjCAIAAAAblL1PAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFlElEQVR42t2UW1BVZRTH90OvPfomh7Pv+7vuG3vvc/FwLoIaVxUIGOEQmJjXQ9wSzQQBDThyUUTQNLGb3awsI02w6QJdtLFiLM1UJtOaZnqph5pppDnnmNND0Hsz62HNN+u3vvWtb60/IwnCXBbw+x3LEnl+rgAGAjCXKZKkyPI8AQxBaC6jGFOM5wmYD/5P+x/COGl3fQhTzUMweZj054YxVglRCSF/NxwCQBC0DaJTDBTl32EMIUHI1HVD0wxNM3WdYqxIciSYefHTyYuXvr9xbaalIca52X+HKcamrmuUapSmHJ7jomWln9yc2Xnh3Eu3pg4Nj7hdrrlhTVMJ+QfMRsuiozNvVVx4uPv24J7h/bwrfb6yU5WnygaynLnI/9apN06+P3Zu8r31a9cIHMekxjDVm3vDiCFUCcmKhJdkZ2mUJtMlMmZFwksXL84Oh03dwBAmYASAyHM8y8qCkCQTPJAViRNlQYEyuPcWkefd6S6eZVO5GASAZWaUl5ZVV1UV5BekSKiAYNhbtCqnsCQcCFsIwBRfXlZeV/fo2rWPeGwbAcAIHLsxVj/20cXRk++9fGoiHIookmhQY/cLj0z98ub54fqXmitphiGyXNHKous//Ng7MPjFpSv7D4ykL1zISDwXa2wZPD7WN3J03/NjOcuWiTxvG1b81fo3ruyZPtH4dFOtZuhcenp1dc3YuxP5BYVDw4cOPvU063IxIs+trl1/6MTE8Osf7j/2WigYApIMkfzk8ei3t6bOTp1+drTTUInAccXFJR99emHf0Mj4+5PxvgE29c/BYKi8oqp0VVVRcallZhAEIYB5y43VG5vzo+3exSspUhCEuqq1trXv7uqJ9/bn5eYpksiYmhYMBj2O43UyfB4r4PcnfgtCoFC/1xPwmgTBVBcxBKapWZZhGKpKk4uRWB1JgJybcyusG0AF3p0WkePc6ZzbjUU+tWEEIshBwAPAQiwjghFDZUFZUryoY3j4cE1vPC9DTy6dIqs1sf7R5/pHn1NrYliRCURUR1mtTtHe7LyBzIxciiXIqNxCd+xo/tSdX6/mzX6tlD0ARQESSuArn9/4c3bmz1n0yueYUswBswjXnMtfHata92p5do8FXYChkksof0rpudNx5MQ7L/ZmL1kGRAFTjR063T/9Y/9Xt9mh00hVCQfVIrngmG9FYWHptrxAG0EsZIicxoc70x761V3zc3r194rxAAECQXhBy8H7+sbv6xtf0HKQYERkBAOCcvz+0GEQGkFoXRrmMGPqms8btINRK7Pal/mg32NTQggAwHTM/FI9twQYNoUAI+S1HCfHsEuop1jzBRyNqIyuqj7HcixqZxC/Y3gdJwEjpALFY2heQ1NhcjEQtC3bl+FzVI9H8/psr6aqiSGRZAWKEhVFWZDkpDhhhBRFwaJIRFEBAMhyTkFxzYamyjWbo7WxytpYtLYuWlvH8BBuMszzjv9jO3jGdkIqBRAihA5Y9md24IITGLYsWZaKy6ub2/qadvS0du3f1tlfv72rbutuRnLLj/esuXX71Oy3H/wx89OqklKOY23NfGa847frp2dvfnVl8ksCQWFJRdOO+Ja2eFv34BO7Bhq2d21oamPcaWlHjhydmL3zy+Xx2ZuXV1XmcG7e1tXJy9fe/v3a7Dfnr06fJVha/mC0qXXP1vbenr2Hd8aHGrd3bWzeyXCsu7Hu0alL16Ynej55XgotAkBJSNaRw0enpr/+7kz1sW5WFKSisqqGJ7rrt+3e1tHX3BqPtXRueqydwRDqmpabFc5dYoUXR1SqI6BYphkJhXIi3qXZdiRrmaGqKxI3xzdv6dja3lf/+JOxls7NWzruCqBGqUoTEksxTsmVrqqUUJUkdB8BpbCkYnPLrvUNOzY9tnNDU9v6xtZ1DTv+AghIS0iHOROoAAAAAElFTkSuQmCC'); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="IMG_2101" title="" src="/static/2c140ddaa5d2771743d0100ce92d3e51/f058b/IMG_2101.png" srcset="/static/2c140ddaa5d2771743d0100ce92d3e51/c26ae/IMG_2101.png 158w, /static/2c140ddaa5d2771743d0100ce92d3e51/6bdcf/IMG_2101.png 315w, /static/2c140ddaa5d2771743d0100ce92d3e51/f058b/IMG_2101.png 630w, /static/2c140ddaa5d2771743d0100ce92d3e51/6af66/IMG_2101.png 640w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span></p> <p>I've started playing around with more Actions here. New Day One entry, new Fantastical reminder, go right to search in Google Maps, go right to search in <a href="https://itunes.apple.com/us/app/1password-password-manager/id568903335?mt=8&#x26;at=11laRZ&#x26;ct=lcpbp">1Password</a>, new post in <a href="https://itunes.apple.com/us/app/buffer-for-twitter-facebook/id490474324?mt=8&#x26;at=11laRZ&#x26;ct=lcpbp">Buffer</a>.</p> <p><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <a class="gatsby-resp-image-link" href="/static/c9a8964f5667439909832ade48472c8c/6af66/IMG_2102.png" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 177.21518987341773%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAjCAIAAAAblL1PAAAACXBIWXMAAAsTAAALEwEAmpwYAAAECUlEQVR42u2U208cVRzH548wNU267G3m3M+Zmd1hd1l2l72xbLULBbbIJcSoqSZCilCWkl2Wm8DugsilNgZtH0rUN+uLT9o03l6qxHh7wDReYmJMwFTF1litjNkFMamt0sTHTj4Pk5zvJ2fmnHx/EpDlW4CKIjschssVj0Yb6usNl0t2OKCi/DMpEYxvBSGCMYYQAQABuE3gLyRO6W0RjO1wpwCnVPqXtf/knnxP/p9lwZkQFdjdy8SJiR1jO2KI3IXMCBGUBdqqg49VRx/xu30aQ2R/MqNUxr4md+GX4ZXt2SlzoHm5AVng/mROuZPyNnLp2kXzhrlmXm5+PgWtYL87C5mBJnBssyu/NXn416NknnPrHT57bxLswQhVXdwybL9v+mBV0clTQgBWkfcuQLDy72FMICyDKuy8Y2Ro7lh1POqOxYx40BPkjErlNMDYipANYRumEHm8NY3prsbWzlRLR6qlo7G1synd5fX5KQJUsXKlisoWCmVOmURlHEh7O1aPdK8ebVlq4BoORxoGx+dPjs5lpxazU4snR2cz48/G4klCOetdlDMvocwqj7dwqEjIAlvPHf7UfP/6zZ9e2X5Rb6Ehf31fdnowXxorLo8Vlwfzpb5sMVYXtgabu9/bfvqzm8F3TNx/VjgsErbC2JnIhrlpbpsXtl6Tm+0Rf0NfbmZ4cr6wsFJYWBmenO/LFePhcFWgOfry5tVrN5Y+Nu3Hz6iKVVJt3DbqTH2X7v16gHyiKzFnOJA4kZ0eyBXyM0v5mcWB3ExfthCNxGR35P6xj2IrX1ie+eZQc04FNokTynRiO+oA3RAmEQEwHE3050pP5Qr5wlK+sDQwUuwfKUViSZUST6KVJR/2PNhdUxviZOeeCXUDLaQGNCQIAqFwvCcz8WRmbCBbyIyUeofGe4Ym6iIJwWjQV+3Xhd9QfR5jtxgUEMoQEE6GCYNEVYVheA3do3t1zasbuqfa8GqqSgGGADBBGWFYRmWZ2FBiMJT/8sTC5xM9l7uMiEYBpgi1nU8WrpwqXDnVdj5JEaIAu8Pa8Ac9Q+vHB7969IHBCLYhCVaB9LkjP5gb5h/mm7+/rrczbudQV4rr42blKa6PQ10Rdq6249XfXjh9fS5tJlJn46QKScyKXc+518wPzW1z+seSklY0hwCa3L7WtWX+vGF+/9BaJ9Bk4WDsGPN+6y9dnZs159TTarkYqoPZn5Cdb1N60XXggoUGCYflIzy0YKdvuW2X8MH5KkEYh5QF6YFXLdY3UPDdeuVxKByVAxOIai5RG6nROOe4Un2EfYY3nKgLRgM1bi9FmBFSrbtj4UgoFqyJ++pqg3+PIUGZzsVOdTnZbaUuVF2oKue7Y4gzjQuNC5eqaWo5/CcFywJE3zHTIAAAAABJRU5ErkJggg=='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="IMG_2102" title="" src="/static/c9a8964f5667439909832ade48472c8c/f058b/IMG_2102.png" srcset="/static/c9a8964f5667439909832ade48472c8c/c26ae/IMG_2102.png 158w, /static/c9a8964f5667439909832ade48472c8c/6bdcf/IMG_2102.png 315w, /static/c9a8964f5667439909832ade48472c8c/f058b/IMG_2102.png 630w, /static/c9a8964f5667439909832ade48472c8c/6af66/IMG_2102.png 640w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span></p> <p>Fast ways to text/call/email my family.</p> <p><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <a class="gatsby-resp-image-link" href="/static/a82f06ce100d742bdf6be14cd2403697/6af66/IMG_2103.png" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 177.21518987341773%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAjCAIAAAAblL1PAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE3klEQVR42u2TW0wUZxTHJ5I09amN1RRR2J37fJeZb2bZmd1ld1kuC1tglXAJWGqKUNLGUsEsXVjFgoSbCyIRLxijSAwmjaRiQwyVxPah1gdbNLQxatKQEC0Vq2mgMT4YmGbWtkl9Mk365sn/5fxzfjn5zvkOJXCcwPNiQgLPW2lCoiD4fb5gTo4oCP+YL1RSEELEsbwtzWazSbY0KIoAAAgAZGz21FTGboOMHQIroChKiTLeloY4FkJIEYHjwxWR0fGLExP5vcclh1OBAEuSujM2PH5x+PyEujOGJUmBQHI483uHv5yYiIyO8+EKInCURqeltB4bWTJNc6VkdpktKCMcgxQCx2fmn5nzz0w4PoMUQjiGLSgrmV02zZWRJTOl9ZhGp1EqRyc3xmuuPzwxe88zeYcJlao8CxWVPj7deXOh8+YCPTwNFZXwDJNf6pm8c2L2Xs31xeTGuMrRFOGYzZX1aw5dobon1/ZcENwBWRRkjN9qOkL1Xab6vlrXdERGSJEEKSN7bc8E1T2ZdOjK5sp6wjEUwSiQle0qLDXC5UZekcfQZYSxJOr+rIziyvR3SpzegAwBhtBBiFVQXKkXlLg9XgVBSkbIbRhujbiI7HZohq7LCGEInarqcaiGgg2H9twhimJoqkcjLlVx6U4ZIQuGgiDLsqpqGCIkihghGUIsSYSohKhIEmUILR5IGCGVaIqsQFGwYJW107VNR28/ePLoYemlG0JGFpFEDAAZGJtZeDTzyyMyMGalkihkBEov3Xjy+OHR2w/stU0qa6c01pYcHTy5uGqaK1uvLTAFZSrPIKKKZ6/OPV2de7oqnr2KiKryDFNQtvXar6a5cnJxNTk6qLE2q/PGXb369P0tU3e58VtssJjwLFLIxqGp4OW5vMtzKUNT1p55lg0Ws+dvbZm6o0/f37ir1+pMRJ4NV73eejap+dQbuw9j3S1DIEOQsiOW1HImqWUk+f1mBQIZSMjpenP30JroqddiZ+iCSuuHQVHAIp/lcfkM3Wc4ocAjICEAvIZelBfMyfR7XQaSJGvVCOVm+sOh/By/L8NlIAAory/gy8z2Zmb7M7P9gVx/IEfXXdbAJZGnaZ6hCQRyYv4yRojnWJqWWIZgZE37k2hn496ehj3dDbHuXS1dTW0Hy6s+ABxHsvO219Ztr61TAkE50RlB5N5a/mFdXdF71SDdUACg6qP7d+/tbj8wFD98smV/f1NbX3lVjSSKyrmr8yvm/IqpnPsWYUwEjssNl994bJrm6JKZ+mmfSqdR9dGOaHtf18Dw4InRtt7D0f0D5dt2iBCJp7+5trj83YNl/tTXkGgqz9ChssIrc7/9vnTw5z/ejvRrnN2CI/sOdMSPdPYfb+0abGrrL3+3BkjShviF9WM/bhj7af2BL7CsKALHZxWuG/l+w5kf1n1+d9NH7YRNwA2xrkhrb6xjoCHWGfksXlZVA3lWDFel1ramVLfwhdtkYL1ZdaTbKj7eVN2yuboZ+vMUSaQa9/RE9sWj7f3t8WORffHmjsGK7XUSz/t1R36GKzNdzTTSMYIywj6Px6cpAaeW5dS8eroiy1RuflFeaEswFA6GwnmhcKigOMMXwBAihJEVGCP8/Kr+NnHCTKwKiAIQ/iWYWMzLiFIwfkEvSf51z/9Zr+BX8P8L/wnvhC0Slu4f7QAAAABJRU5ErkJggg=='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="IMG_2103" title="" src="/static/a82f06ce100d742bdf6be14cd2403697/f058b/IMG_2103.png" srcset="/static/a82f06ce100d742bdf6be14cd2403697/c26ae/IMG_2103.png 158w, /static/a82f06ce100d742bdf6be14cd2403697/6bdcf/IMG_2103.png 315w, /static/a82f06ce100d742bdf6be14cd2403697/f058b/IMG_2103.png 630w, /static/a82f06ce100d742bdf6be14cd2403697/6af66/IMG_2103.png 640w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span></p> <p>Some quick logging that I've been playing with in Day One<span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <a class="gatsby-resp-image-link" href="/static/17babbccc04b1ffe267f7b2c554a6cec/6af66/IMG_2104.png" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 177.21518987341773%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAjCAIAAAAblL1PAAAACXBIWXMAAAsTAAALEwEAmpwYAAAG5klEQVR42l2VjW9T1xnG7x+xL0Ec29f3nq/3nPthO4kdO47txHHiBFiCmUmgtKGslbqNJArJSCDOUkhIwNCqNCClilJRdaVVA5NY1RQQEtOkCYZotzEpoBYqtVA1YbSQltKG5EzXZtO0q6Ore18975Hu897ndxSkaUj/n6U5C+t6dThUl0yk6utqohHd5yvV/0+pMEaJilG5rrs1VI4oJoxSRqju0nwu1VemIpfuVCilmKByVJTpRMWMUYX5aKwj9PSp1udmO7KvNdmVJqdMEMjk4ztO53aczmXycUGAU2ZXmptea3xutmPbqdZYR4j5qEJcKDuduS4/+uHxd++svB7MmdwL1ML5+d578st7ciE/30stzL1QkTPfWZn5/vHDG/Jv2ekMcWGFuXHtZOyO/EKuypNLb+NNuqUamqX2fNgji1fPhz2apVqqgTfpbz04KVflHflF7WQtc2PF9Aj3gBr7NN1xo9NziZAUMXTgHNxv69lbW9Mfbyg7qQoOhg44hekV6+kbv/TfrPYMaqaHK4KBsLmVs1k7tzKWoMCBCQosROkvGOQ4C7H/FnES8y0GtHIwqWCgCAADeFhURUV1pQgKAGc7DgbhVbSiWoQMyp8UAUwkYmY0xCsdU3mxmRNgJka2DzjlxBFxxgQDauvE0gUrvhZlXDBkq8zEoihTqIekB2vHFvun7hzu/mdnMGkBcjq3vrv+6ML+o4v7t7y7XjAAxIJ1Vve1Z6buHB67258ejFEPUUg5aptqvicX5Yr84NEZK8cNL0eWNnYtX3J77FoeWZrh5VaOzz06I1fkV/Ju61QzKUcKL2fmpH1BXvx29eGepWE9q1mqgUy99Wr2M3n7Y3nz51c3YtOZn57VhpdefLT6/fvyrDXp5+VMMX3cu13znCX6++JHv18LEef3Mhh3TajkvO06i9ZMeEwmBAEWoWvfUtmc/8dzLnW7bvq4Y5jAEAmFU/V1kYowEMYZZRgxL6r0ByKVIfARhhBnVDBuEB6pDldYAYGLhjk2UgYq414AjXFgtmVHa+KRWDwaS0Sdezxak7AtPwcGGgMvMC91RgWgcMICIbOmMxh5NhDNVQDGtYlU957xnQOjXYNjXYNjO3eP9uyZSNQ3Moyjucros4GazmAgZHLCFOLCG15JzcqZy6sXCw+HAs08Fqnv3jPWu/fA8PjR340f7d17oGfvWLwm7c/wwndDl1cvzsqZDa+knGAQN1p3vGlJPpDL8tw3c6xNj1enu/aM7R4p7Csc2184tnuk0L33QDLaRFv1c0tzclkuyQfrjjcRN1IMN9eO4H1y/A8/nGlZbPM1e5MRp7kvf3Bf4di+wrG+/MHuvQfqazKeZnf2Xx3vLX+wSw6iI8xwg2IgjtJ47ai3bFxds8vNOK6Np7oGR7sGRnePFHaPFLoG9ncNjiWSjZSjsj5v+YT20/0unMYG4orgIHQWEaGGcF0Q2UxH8bp079DB/pFDw4cmRw4f/+2Lh3uHDiVTGaYjv2amq+ujIiT0UjA4AKbYg5FXpyoFQgPBilR6XTKWqY001kYak7FMqnF9MFgJhFCVIo+OPRgwdZpBo9FsVfuJlqdOtLa93GAHDSCE+PS6rnD7TKZ9JlPXFSY+nRFiB422lxu2nWhtP9ESzVaB5jAMb5xu+oe8/O3j+2+uTFXkTK4C2GRovudL+fmCvD003wM24arDsDdXpr55fP+a/OvG6SZnVNSN6yYTC8VUzd4/RTahEsP6r/aVUtV/ta/EMLIJzT44JVflolysm0zQEsM8eV/LnbZf3+ohH5kkTQydc858p8mO2y/kPtvmPYWEAEPnOI3Nv1f2fNof+zzlzetFhlEQfhBPGbSTi/VGEVcgKNAIQVsJ3kpplDqaYgT4esG2c7HV5H5Ho5T4FDHDyUC8QgQc0METhoWhqlqEDcKdcTKHgQFmx61YxAobwJ+kChCjgHVDBUKeMIwyjhkxdOcbMCtliBMASpGhUkAOqgAU5iENu2L5mzuPXB954dKWYMIC7DBs8xvNE58MTnwysPmNZodhmAUT1q8ubXnp+sjQrd807IoxD1FwOcpOt3wlF+SKPLf8R3szF16OLe3A/HDJ7fH5YWxpwsvtzfzsssOwr+VidroFOwxzU/+rgSvyqlyVo19P6FkHV8jSNl/Zcl8uLci7uSvtyHLApmW1ifsFuSr/LP8SeDXI3VQxVe593qf9icP5wE9mXVDDHMQwKHvJyy8GPRfomiNug3GBgdVQ12nNPF/1swse9XndVEvBwKwyXBFLxYL+gCCs5L9BeSRRHUtGHfoVjwtBWMD21zbEqiNhQf7jtnOOgLCFWRrAEymAxQ1bmKXn0hkkAGzDtIRRKv4bFNGqO8l2CGwAAAAASUVORK5CYII='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="IMG_2104" title="" src="/static/17babbccc04b1ffe267f7b2c554a6cec/f058b/IMG_2104.png" srcset="/static/17babbccc04b1ffe267f7b2c554a6cec/c26ae/IMG_2104.png 158w, /static/17babbccc04b1ffe267f7b2c554a6cec/6bdcf/IMG_2104.png 315w, /static/17babbccc04b1ffe267f7b2c554a6cec/f058b/IMG_2104.png 630w, /static/17babbccc04b1ffe267f7b2c554a6cec/6af66/IMG_2104.png 640w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span></p> <p>This is one of the main things I miss about widgets in android. Quick texting a contact. This is THE reason I bought LCP when I first got an iPhone. I would go so far as to say I wouldn't have bought an iPhone without LCP.<span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <a class="gatsby-resp-image-link" href="/static/7045fa26330cc2085fe3bb6cb094365a/6af66/IMG_2105.png" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 177.21518987341773%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAjCAIAAAAblL1PAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEP0lEQVR42u1V3U9cRRS/f4Q+SCns3Xvv3Jk5M/feZXfZzbK7fAlbQimfsjbIV+DJdFvkYykfZcvyTcESLDaSGJOmNX1oiUlraIkx7UNfmkhs5KEPxphAo4LRVFLFDxhzWUzaBmpifNPJ7+HMOeeXyZxz5jcSUtV9oGmKLGd7PD6vV5FlXdP2TZMoIQcB6zrR9RckSBzgH+O/TKaMU8YAOANO4WnnX7YdYs86d8kYmEmIS7PD2PYySjkBaunU0jnZ3cJuiAFxacwgfDdNIg4c6Q2PbHTNP5pqW2nyFFqAKKdQd+3Y7Prw7PpQ3bVjnAIg6im02laa5h9NjWx0RXrDxIElnIGq5kt/EBtiW9zeumFFmSEzZKmjKwNid42uDCBLNWRmRdmtrRtiW/wovq+cL8UZSGIZ1LxgfSruPtn5pW8zodWoltNApla5XLMq1r4UX1UsV+umZjkNrUZNbCa3dn5dFEvWXBbLoJKpMGeL5lgi2iJ/6cNDEKD2fQikj8v4E9fhJS1tPNMgjGOAIE2/qsAt98u3M5QWZKncLlgoO5Afzs0Nh44UFPvcXiDEAMYR9fuyc3x+juxqAcFEUd3MzAsFw74AUzHVkWRXmFBwAsgAKt1rFQNABGRqQycMqMfrC+XmB8N5oXBBMGwbwWCuxDB1+81QsyenxR2s9RjAGFCGqS+SFWz1BFs9/iNurGpVrzd2DEydPD3c1jd2snfkVM9orHtYwof18tmi6+KD+zt3z/3cn13uAsWegxOfNdwRH98RN2PLjVjXqqINHYnJeGIyOTnXPzLzVu9orDsp4UxUdrFkU/wkfhdLm4u8lppOrlrO4c/Pplo18mDQQdOra5vig9M9yenh6YuJ8XfiickT8aRkZDL1bX1IjH/0283S9UpUgUyFUwN77wUui6vvbs+77/l1rFZHGzsT53qS02Pn3zs7caG9fyzWPSQZiOkR/ZWhjLQxR1pnJreAUXtglWaUPu48NOFQW3SqoMpoQ/uZyVg8eXpwqr3PZton2+VF4KfeAm+eB7l4aowp8XFvoTev2F8YMP1YU2uON3cnZ071jPYMne84M9neP9HWO2aTQSe6rCMZESdOvQEOQBSCZIQciCgECAnkhCMl5UWRslcjR4siZSlDApUEa3zHLx2tv1RZNVPs8hiMUIYh0hmuv1xRf6Ui0hlmGCjGBKHnYLeq+v2SL8T9J388vrI9742aTLYfY//Dtm/F6ndirf9hGzF0gzKDM4M9A4lk6oVz+etiQ+yI648X8GvIchqq5Ywvd6VaFV/uUgzZJNyuznNKYjq4Y0Ap+6Ym9nU7eWDhCDY0xhhVFnDr2pvR1XrHAtpTkn1kiAJzUWeFotYhFNH3kjDleYw0An4DeB63twdqGKFu7AqZARPxlJcBtagRsnIC3J8FFgP6IgFkQCkl7KlbpTwA5CDm30iv8f938y+T/wTvtBuSlo2iGgAAAABJRU5ErkJggg=='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="IMG_2105" title="" src="/static/7045fa26330cc2085fe3bb6cb094365a/f058b/IMG_2105.png" srcset="/static/7045fa26330cc2085fe3bb6cb094365a/c26ae/IMG_2105.png 158w, /static/7045fa26330cc2085fe3bb6cb094365a/6bdcf/IMG_2105.png 315w, /static/7045fa26330cc2085fe3bb6cb094365a/f058b/IMG_2105.png 630w, /static/7045fa26330cc2085fe3bb6cb094365a/6af66/IMG_2105.png 640w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span></p> <p>Quick work contacts<span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <a class="gatsby-resp-image-link" href="/static/b52c69b4e4523a1b1a08a45fe90d07e9/6af66/IMG_2106.png" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 177.21518987341773%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAjCAIAAAAblL1PAAAACXBIWXMAAAsTAAALEwEAmpwYAAADsElEQVR42uWVX2xTVRzHGxJf9GEhwRdHvb29t/eev/fe/q+ba7vRUl5Gy8rSMUY6NIPNLTDW1ZZ2tGWrXaFroY7/OJWEEB/YnOj0QR80JBrQGIMZcQbQ+GB0GJcYTaY+1NTii7tLOl9Nvjk5ucnnfH/n+7vnHI1ex+gZpjrWJgzDs6yB4yAAXo/H590OATBwnMDza6XZGewOdPb4d++tKdgVdm/zAVEUWIZ/upHXNgosgyBUlWY4ORlJFWLjpUS2PJoqxCbKoX19gOcCLxzrLd/oPX0jMDCGgUgxXivNQCQ9kpwcy55K5cqxTGHk2MmOUBhDdHD26yvfVq58UzlwfUmiEkGQYvJveDB6/MV0IZ2fHi+cS2ZL0Uwx2BVGiDgv3M3fXs3dWm05v0glha4HDydy8fFiMntqNJWPpAq7u/cjUWDj72rPPdx6dlkXW6AYUYRUyj4Uzw4nJmOZqcyJM5GxfDQz1bn3eWjgFIfLvjPs8PcqDidZb899h472HxkbHE0fjk/0H0kORY8HOnsQEBVCbApxmCSFYKJGVmGT0SSbrRab3Wa1mcxWxWxRZAVDKCHYbFKaTEaKEFaruQqzEI9A7Xfwifu44WOyxQUFESIJgmtz89HFleSd5Teuz1IEVc01HCIli3inw3Vzf/BhfCBEBBYgt1keWrinvPVLsPzJ4XeWWiwKBFAia9LmIHrJhD4IeN7b47+3w9EBeD1ATqucnr/fdbWiFP9IvPmgxSqrwwZC93Ha+YZNsw2bLm5+rAkChAmB4NWZ15KvLB6duXv50gyBQL1sgpDRbHF7tru2eZ51t1EqUYwQgBaTsX1Ha7uv1WYxIwDUA6OEYAB4nY5jGEGvp/hRYyRCqn8lJhKh1Y9IDcYQPmOzP3fgYN/AYGeom6zTFXVn3VZt6cx05aMPfytO/Lz0pX9Xh8Bxa7NRhzmGnb50OnN+NJfpWvk8uaenn2cZmdK6YEarvTB99u0fby58Fln94VZgV0jg9PU6Q1Hweb0nJ3LFE1ORSNwoS/VvWyMRIhoMrE6nyLJex2wssFpXZEprY/3kI/g/6/8CS6SqDcIIU/K3/lliY84YYAyILFePJxIIJXXCBCMRO1pQ5v2nSp/ypS8ag0O8yJK64Or9wFFnUHd52bTy51e3K6mel7cARq7XmfCS2d84/qD5p9+/n/s14c03YF39MMBKE/C+vrl97knf/OP2sJZwtN7ACEYSom6X09XW3NbqtpttGMGNtUqRJKX6ZEq1I/QX/0Ht5fLUhZcAAAAASUVORK5CYII='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="IMG_2106" title="" src="/static/b52c69b4e4523a1b1a08a45fe90d07e9/f058b/IMG_2106.png" srcset="/static/b52c69b4e4523a1b1a08a45fe90d07e9/c26ae/IMG_2106.png 158w, /static/b52c69b4e4523a1b1a08a45fe90d07e9/6bdcf/IMG_2106.png 315w, /static/b52c69b4e4523a1b1a08a45fe90d07e9/f058b/IMG_2106.png 630w, /static/b52c69b4e4523a1b1a08a45fe90d07e9/6af66/IMG_2106.png 640w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span></p> <p>Random things I play around with</p><![CDATA[AVSpeechSynthesizer's queue doesn't work]]>https://www.timbroder.com/2014/03/avspeechsynthesizers-queue-doesnt-workhttps://www.timbroder.com/2014/03/avspeechsynthesizers-queue-doesnt-workSat, 01 Mar 2014 20:46:39 GMT<p>Sort of. It acts as a queue, but subsequent items have problems. Taken from the <a href="https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVSpeechSynthesizer_Ref/Reference/Reference.html#//apple_ref/occ/instm/AVSpeechSynthesizer/speakUtterance:" title="documentation">documentation</a> of <code class="language-text">- (void)speakUtterance:(AVSpeechUtterance *)_utterance_</code></p> <blockquote> <p>Calling this method adds the utterance to a **queue; utterances are spoken</p> </blockquote> <p>in the order in which they are added to the queue**. If the synthesizer is not currently speaking, the utterance is spoken immediately.</p> <p>This is true. You can queue up as many AVSpeechUtterance objects as you want, and they will be spoken, in order.  The problem is if you try to act on the Synthesizer after the first Utterance has been spoken. Specifically, I'm having an issue with pausing. But, stopping has an issue as well. If I try to pause during the first utterance using pauseSpeakingAtBoundary:AVSpeechBoundaryImmediate, I get the expected behavior. The speech stops and I can start it again with continueSpeaking. (Even on the first Utterance, AVSpeechBoundaryWord, is giving me issues so I'm putting that aside for now). However, if I try to pause on any of the subsequent Utterances, nothing happens.  The pausedSpeaking call is ignored. (The synthesizer isn't nil, I checked). So, why am I queuing up a lot of text? I plan on having AVSpeechSynthesizer speak a lot of text. This text is stored in CoreData.  Let's say my main object is called Read. Instead of storing all of the text for that object in Read.text I've split out the text into slices, stored in a separate Text entity. A Read object can have many of these.  This gives me control over how much text I load into memory at once.  My original plan was to load each slice into an Utterance.  When the speaking was done for that Utternace, queue up the next one (it should start immediatly or close to it). Fragments of this below:</p> <div class="gatsby-highlight" data-language="c"><pre style="counter-reset: linenumber NaN" class="language-c line-numbers"><code class="language-c"> self<span class="token punctuation">.</span>speechSynthesizer <span class="token operator">=</span> <span class="token punctuation">[</span>AVSpeechSynthesizer new<span class="token punctuation">]</span><span class="token punctuation">;</span> self<span class="token punctuation">.</span>speechSynthesizer<span class="token punctuation">.</span>delegate <span class="token operator">=</span> self<span class="token punctuation">;</span> <span class="token operator">-</span> <span class="token punctuation">(</span>BOOL<span class="token punctuation">)</span>addWordsToQueue<span class="token operator">:</span><span class="token punctuation">(</span>NSString <span class="token operator">*</span><span class="token punctuation">)</span>words <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span>words <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> NO<span class="token punctuation">;</span> <span class="token punctuation">}</span> AVSpeechUtterance <span class="token operator">*</span>utterance <span class="token operator">=</span> <span class="token punctuation">[</span>AVSpeechUtterance speechUtteranceWithString<span class="token operator">:</span>words<span class="token punctuation">]</span><span class="token punctuation">;</span> utterance<span class="token punctuation">.</span>rate <span class="token operator">=</span> AVSpeechUtteranceMinimumSpeechRate<span class="token punctuation">;</span> <span class="token punctuation">[</span>self<span class="token punctuation">.</span>speechSynthesizer speakUtterance<span class="token operator">:</span>utterance<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">return</span> YES<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">//used in view</span> <span class="token operator">-</span> <span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span>play <span class="token punctuation">{</span> <span class="token punctuation">[</span>self<span class="token punctuation">.</span>speechSynthesizer continueSpeaking<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator">-</span> <span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span>pause <span class="token punctuation">{</span> <span class="token punctuation">[</span>self<span class="token punctuation">.</span>speechSynthesizer pauseSpeakingAtBoundary<span class="token operator">:</span>AVSpeechBoundaryImmediate<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator">-</span> <span class="token punctuation">(</span>BOOL<span class="token punctuation">)</span>isPaused <span class="token punctuation">{</span> <span class="token keyword">return</span> self<span class="token punctuation">.</span>speechSynthesizer<span class="token punctuation">.</span>isPaused<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">pragma</span> <span class="token expression">mark <span class="token operator">-</span> AVSpeechSynthesizerDelegate</span></span> <span class="token operator">-</span> <span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span>speechSynthesizer<span class="token operator">:</span><span class="token punctuation">(</span>AVSpeechSynthesizer <span class="token operator">*</span><span class="token punctuation">)</span>synthesizer didFinishSpeechUtterance<span class="token operator">:</span><span class="token punctuation">(</span>AVSpeechUtterance <span class="token operator">*</span><span class="token punctuation">)</span>utterance <span class="token punctuation">{</span> NSString <span class="token operator">*</span>words <span class="token operator">=</span> <span class="token punctuation">[</span>read getAndIncrementCurrentWordsAsString<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> words <span class="token operator">!=</span> nil <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">[</span>self addWordsToQueue<span class="token operator">:</span>words<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Again, the first Utterance works fine, the rest don't. I've also experimented with queueing multiple slices at once, as well as checking if the synthesizer I get in didFinishSpeechUtterance is the correct instance.</p> <p>I'm <a href="http://stackoverflow.com/questions/19672814/an-issue-with-avspeechsynthesizer-any-workarounds">not</a> the first person to run into this issue. There are also a number of <a href="http://openradar.appspot.com/search?query=AVSpeechSynthesizer+">radars</a>. I've added one as well.</p> <p>There is a workaround, but it's dirty and shouldn't be needed. In didFinishSpeechUtterance I recreate my AVSpeechSynthesizer so I'm always dealing with the first item in the queue. I really don't like it.  This is still broken in 7.1 beta 5. Hopefully it gets fixed. I'd like to implement this properly.</p> <div class="gatsby-highlight" data-language="c"><pre style="counter-reset: linenumber NaN" class="language-c line-numbers"><code class="language-c"><span class="token operator">-</span> <span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span> resetSynth <span class="token punctuation">{</span> self<span class="token punctuation">.</span>speechSynthesizer <span class="token operator">=</span> <span class="token punctuation">[</span>AVSpeechSynthesizer new<span class="token punctuation">]</span><span class="token punctuation">;</span> self<span class="token punctuation">.</span>speechSynthesizer<span class="token punctuation">.</span>delegate <span class="token operator">=</span> self<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">pragma</span> <span class="token expression">mark <span class="token operator">-</span> AVSpeechSynthesizerDelegate</span></span> <span class="token operator">-</span> <span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span>speechSynthesizer<span class="token operator">:</span><span class="token punctuation">(</span>AVSpeechSynthesizer <span class="token operator">*</span><span class="token punctuation">)</span>synthesizer didFinishSpeechUtterance<span class="token operator">:</span><span class="token punctuation">(</span>AVSpeechUtterance <span class="token operator">*</span><span class="token punctuation">)</span>utterance <span class="token punctuation">{</span> <span class="token punctuation">[</span>self resetSynth<span class="token punctuation">]</span><span class="token punctuation">;</span> NSString <span class="token operator">*</span>words <span class="token operator">=</span> <span class="token punctuation">[</span>read getAndIncrementCurrentWordsAsString<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> words <span class="token operator">!=</span> nil <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">[</span>self addWordsToQueue<span class="token operator">:</span>words<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>This unfortunately still happens in the 7.1 beta</p><![CDATA[Quote of the week: Brent Simmons on terrible things]]>https://www.timbroder.com/2014/02/quote-week-brent-simmons-terrible-thingshttps://www.timbroder.com/2014/02/quote-week-brent-simmons-terrible-thingsThu, 27 Feb 2014 16:43:15 GMT<blockquote> <p>I have to design as if terrible things could happen — because by doing so I</p> </blockquote> <p>can better prevent terrible things from happening.</p> <p>via <a href="http://inessential.com/2014/02/15/vesper_sync_diary_8_the_problem_of_un">inessential.com: Vesper Sync Diary #8 - The Problem of Unique IDs</a>.</p><![CDATA[Expansion Followed By Consolidation]]>https://www.timbroder.com/2014/02/expansion-followed-by-consolidationhttps://www.timbroder.com/2014/02/expansion-followed-by-consolidationFri, 21 Feb 2014 00:46:40 GMT<p>David Smith:</p> <blockquote> <p>I wouldn’t be surprised, however, if the pressures of remaining a small,</p> </blockquote> <p>independent fish in this Big Fish Pond became untenable or undesirable at some point.</p> <p>:-/</p> <p>That's a shame. Indie is something that's been on my mind to see of it was possible. We will see what happens over the next year for me as well</p><![CDATA[House of Cards regex mute filter for Tweetbot]]>https://www.timbroder.com/2014/02/house-cards-regex-mute-filter-tweetbothttps://www.timbroder.com/2014/02/house-cards-regex-mute-filter-tweetbotSat, 15 Feb 2014 22:12:22 GMT<p>Some regular expressions if you don't want to see spoilers in your timeline Just the show name. <a href="tweetbot:///mute/keyword?regex=1&#x26;text=(%3Fi)%23%3Fhouse(%20%3Fof)%3F(%3F%3D%20%3Fcards)" title="tweetbot:///mute/keyword?regex=1&#x26;text=(%3Fi)%23%3Fhouse(%20%3Fof)%3F(%3F%3D%20%3Fcards)">tweetbot:///mute/keyword?regex=1&#x26;text=(%3Fi)%23%3Fhouse(%20%3Fof)%3F(%3F%3D%20%3Fcards)</a></p> <ul> <li>@housecards</li> <li>#houseofcards</li> <li>#housecards</li> <li>House of Cards</li> <li>House cards</li> <li>house cards</li> </ul> <p>Includes some cast member names and character names:</p> <p><a href="tweetbot:///mute/keyword?regex=1&#x26;text=(%3Fi)%23%3Fhouse(%20%3Fof)%3F(%3F%3D%20%3Fcards)%7C(%3Fi)%23%3Fkevin(%3F%3D%20%3Fspacey)%7C(%3Fi)%23%3FFrancis(%3F%3D%20%3FUnderwood)%7C(%3Fi)%23%3FRobin(%3F%3D%20%3FWright)%7C(%3Fi)%23%3FClaire(%3F%3D%20%3FUnderwood)%7C(%3Fi)%23%3FKate(%3F%3D%20%3FMara)%7C(%3Fi)%23%3FZoe(%3F%3D%20%3FBarnes)" title="tweetbot:///mute/keyword?regex=1&#x26;text=(%3Fi)%23%3Fhouse(%20%3Fof)%3F(%3F%3D%20%3Fcards)%7C(%3Fi)%23%3Fkevin(%3F%3D%20%3Fspacey)%7C(%3Fi)%23%3FFrancis(%3F%3D%20%3FUnderwood)%7C(%3Fi)%23%3FRobin(%3F%3D%20%3FWright)%7C(%3Fi)%23%3FClaire(%3F%3D%20%3FUnderwood)%7C(%3Fi)%23%3FKate(%3F%3D%20%3FMara)%7C(%3Fi)%23%3FZoe(%3F%3D%20%3FBarnes)">tweetbot:///mute/keyword?regex=1&#x26;text=(%3Fi)%23%3Fhouse(%20%3Fof)%3F(%3F%3D%20%3Fcards)%7C(%3Fi)%23%3Fkevin(%3F%3D%20%3Fspacey)%7C(%3Fi)%23%3FFrancis(%3F%3D%20%3FUnderwood)%7C(%3Fi)%23%3FRobin(%3F%3D%20%3FWright)%7C(%3Fi)%23%3FClaire(%3F%3D%20%3FUnderwood)%7C(%3Fi)%23%3FKate(%3F%3D%20%3FMara)%7C(%3Fi)%23%3FZoe(%3F%3D%20%3FBarnes)</a></p><![CDATA[Background fetch: An Unexpected Botnet]]>https://www.timbroder.com/2014/02/background-fetch-an-unexpected-botnethttps://www.timbroder.com/2014/02/background-fetch-an-unexpected-botnetSat, 15 Feb 2014 14:37:08 GMT<blockquote> <p>When enabled within your applications you are essentially building a</p> </blockquote> <p>massively distributed botnet. Each copy of your application will be periodically awoken and sent on a mission to seek and assimilate internet content with only the OS safeguards holding it back. As your app grows in popularity this can lead to some rather significant increases in activity.</p> <p>David Smith's article on the implications (and related cost) of background fetch gave me a few things to think about. I have a few parts of my new app that use background fetch. Thus far I have been guilty of #2: <strong>Be honest when your application didn’t get data from a fetch.</strong> This needs to change.</p><![CDATA[Quote of the Day: Marco Arment]]>https://www.timbroder.com/2014/02/quote-of-the-day-marco-armenthttps://www.timbroder.com/2014/02/quote-of-the-day-marco-armentWed, 05 Feb 2014 13:09:33 GMT<blockquote> <p>“Emphasizing and rewarding length over quality results in worse writing and</p> </blockquote> <p>more reader abandonment.” – Marco Arment</p><![CDATA[Follow Pie – The Story Of The Instagram Bot Made To Increase App Store Downloads]]>https://www.timbroder.com/2014/02/follow-pie-the-story-of-the-instagram-bot-made-to-increase-app-store-downloadshttps://www.timbroder.com/2014/02/follow-pie-the-story-of-the-instagram-bot-made-to-increase-app-store-downloadsSun, 02 Feb 2014 21:55:45 GMT<blockquote> <p>“How the hell do you have 18,000 followers on Instagram???”</p> </blockquote> <p>Not helpful for any of my current ideas I don't think. Maybe one of the ides on the short list... Good read though</p><![CDATA[Interesting Lessons from Building a Pedometer - David Smith]]>https://www.timbroder.com/2014/02/interesting-lessons-from-building-a-pedometer-david-smithhttps://www.timbroder.com/2014/02/interesting-lessons-from-building-a-pedometer-david-smithSat, 01 Feb 2014 14:25:34 GMT<blockquote> <p>It is a rare thing for a software developer to know that what I’m building</p> </blockquote> <p>is tangibly improving the health and lives of my customers.</p> <p>Such an awesome feeling. I can only hope my next app helps improve someone. This one won't help their health, but hopefully other parts of their life.</p><![CDATA[Hypercritical: The Road to Geekdom]]>https://www.timbroder.com/2014/02/hypercritical-the-road-to-geekdomhttps://www.timbroder.com/2014/02/hypercritical-the-road-to-geekdomSat, 01 Feb 2014 14:19:54 GMT<blockquote> <p>Geekdom is not a club; it’s a destination, open to anyone who wants to put</p> </blockquote> <p>in the time and effort to travel there. And if someone lacks the opportunity to get there, we geeks should help in any way we can. Take a new friend to a meetup or convention. Donate your old games, movies, comics, and toys. Be welcoming. Sharing your enthusiasm is part of being a geek.</p> <blockquote> </blockquote> <blockquote> <p>Anyone trying to purposely erect border fences or demanding to see ID upon</p> </blockquote> <p>entry to the land of Geekdom is missing the point. They have no power over you. Ignore them and dive headfirst into the things that interest you. Soak up every experience. Lose yourself in the pursuit of knowledge. When you finally come up for air, you’ll find that the long road to geekdom no longer stretches out before you. No one can deny you entry. You’re already home.</p><![CDATA[How I lost my $50,000 Twitter username]]>https://www.timbroder.com/2014/02/how-i-lost-my-50000-twitter-usernamehttps://www.timbroder.com/2014/02/how-i-lost-my-50000-twitter-usernameSat, 01 Feb 2014 10:59:35 GMT<blockquote> <p>I had a rare Twitter username, @N. Yep, just one letter. I’ve been offered</p> </blockquote> <p>as much as $50,000 for it. People have tried to steal it. Password reset instructions are a regular sight in my e-mail inbox. As of today, I no longer control @N. I was extorted into giving it up.</p> <p>Another reason I am quite happy I recently moved all if my domains from godaddy to hover. (They even took my godaddy login and did it all for me). I'd like to cancel paypal but I just can't bring myself to do it</p><![CDATA[Google Bringing Chrome Apps to iOS and Android]]>https://www.timbroder.com/2014/02/google-bringing-chrome-apps-to-ios-and-androidhttps://www.timbroder.com/2014/02/google-bringing-chrome-apps-to-ios-and-androidSat, 01 Feb 2014 10:49:51 GMT<blockquote> <p>Google today launched Chrome apps for iOS and Android, which will see</p> </blockquote> <p>Chrome-based apps encased in a native application shell that allows them to be distributed through the Apple App Store and Google Play. Currently, Chrome- packaged apps are written in JavaScript, HTML, and CSS, but are able to launch outside the browser, access APIs and work offline.</p> <p>I feel like this should just be called "yet another cross platform mobile solution." I'd like to say this will be crisp, feel native, actually work, or gain traction. Google owning or pushing products/technologies used to mean something. Open social? Reader? I've lost faith in them over the past few years. (And this blog's original name was gPowered) Time will tell but the "best" option IMO is still Titanium. I say that with finger quotes because they all suck.</p><![CDATA[My URL Schemes for Posting Links From My iPhone and iPad Using Poster]]>https://www.timbroder.com/2014/01/my-url-schemes-for-posting-links-from-my-iphone-and-ipad-using-posterhttps://www.timbroder.com/2014/01/my-url-schemes-for-posting-links-from-my-iphone-and-ipad-using-posterSun, 26 Jan 2014 20:39:57 GMT<blockquote> <p>Instapaper → Drafts → Poster</p> </blockquote> <p>This is awesome. Since I do most of my internet reading on iOS these days, maybe this wil convince me to blog more. Huge thanks to Shawn Blanc for posting this!</p><![CDATA[Motivation — Sam Soffes]]>https://www.timbroder.com/2013/11/motivation-sam-soffeshttps://www.timbroder.com/2013/11/motivation-sam-soffesFri, 08 Nov 2013 14:13:07 GMT<p>This hit pretty home for me. I have motivation problems sometimes. Sometimes the TV just looks SO good.</p> <blockquote> <p><a href="http://sam.roon.io/motivation">Motivation — Sam Soffes</a>: "My friend has a</p> </blockquote> <p>great saying:</p> <blockquote> </blockquote> <blockquote> <p>I want to program wet and naked.</p> </blockquote> <blockquote> </blockquote> <blockquote> <p>— Ernie Miller</p> </blockquote> <blockquote> </blockquote> <blockquote> <p>I love this. He was talking about getting ideas in the shower and getting so</p> </blockquote> <p>excited that you get out and start programming before you can even dry off."</p><![CDATA[Weather Notifications on Lifehacker!]]>https://www.timbroder.com/2013/11/weather-notifications-on-lifehackerhttps://www.timbroder.com/2013/11/weather-notifications-on-lifehackerTue, 05 Nov 2013 19:08:53 GMT<p>OMG. I’m on lifehacker.</p> <blockquote> <p>[Weather Notifications Gives You a Forecast without Opening the</p> </blockquote> <p>App](<a href="http://lifehacker.com/weather-notifications-gives-you-a-forecast-without-open-1458155902">http://lifehacker.com/weather-notifications-gives-you-a-forecast-without-open-1458155902</a>): "iPhone: One of the problems with weather apps on the iPhone is that you have to actually open them to get the information you want. Weather Notifications is an app that'll send customized notifications to your lock screen for only the information you care about.</p> <blockquote> </blockquote> <blockquote> <p>At a glance, Weather Notifications isn't that different from the weather</p> </blockquote> <p>information that's already in Notification Center. You can set it up so you get a quick forecast of your day if you want, but what's useful about Weather Notifications is the level of customization you can get with alerts. You can set it up so you get alerts for rain, snow, fog, temperature alerts, humidity, or wind. Basically, you can make it so you're only alerted to junky weather, and you never have to actually open the app if you don't want to. It's an interesting approach to a weather app that's worth a look if you're only curious about specific types of weather."</p><![CDATA[Why Android First is a Myth | steve cheney – technology, business & strategy]]>https://www.timbroder.com/2013/10/why-android-first-is-a-myth-steve-cheney-technology-business-strategyhttps://www.timbroder.com/2013/10/why-android-first-is-a-myth-steve-cheney-technology-business-strategyWed, 23 Oct 2013 14:17:41 GMT<p>This article made me think back to when I switch to iOS to make apps. (I was a hardcore android proponent in general and at work).  I’m happy to have other validation with my choice</p> <blockquote> <p>[Why Android First is a Myth | steve cheney – technology, business &#x26;</p> </blockquote> <p>strategy](<a href="http://stevecheney.com/why-android-first-is-a-myth/">http://stevecheney.com/why-android-first-is-a-myth/</a>):</p> <blockquote> <p>In mobile,</p> </blockquote> <p>particularly in consumer markets, there has been an ongoing debate about when or if Android will become the first platform that sophisticated startups develop for. Often times, this argument is wrongly centered around vanity metrics for Android such as worldwide shipments or installed base of each platform."</p><![CDATA[GarageBand for iOS 7 to Become Free with In-App Purchases as Apple Reveals Full Set of New iLife and iWork Icons - Mac Rumors]]>https://www.timbroder.com/2013/10/garageband-for-ios-7-to-become-free-with-in-app-purchases-as-apple-reveals-full-set-of-new-ilife-and-iwork-icons-mac-rumorshttps://www.timbroder.com/2013/10/garageband-for-ios-7-to-become-free-with-in-app-purchases-as-apple-reveals-full-set-of-new-ilife-and-iwork-icons-mac-rumorsMon, 21 Oct 2013 15:01:03 GMT<p>With all the discussion around pricing the past few weeks, it's very interesting that Apple is using a IAP model in one of it's apps</p> <p><a href="http://www.macrumors.com/2013/10/20/garageband-for-ios-to-become-free-with-in-app-purchases-as-apple-reveals-full-set-of-new-ilife-and-iwork-icons/?utm_content=bufferfe593&#x26;utm_source=buffer&#x26;utm_medium=twitter&#x26;utm_campaign=Buffer">GarageBand for iOS 7 to Become Free with In-App Purchases as Apple Reveals Full Set of New iLife and iWork Icons - Mac Rumors</a>:</p> <blockquote> <p>Aside from the new icons, the updated page also reveals in a footnote</p> </blockquote> <p>that GarageBand will become a free basic download for all iOS 7 devices, joining the other five iLife and iWork apps that became free alongside the release of iOS 7.</p> <blockquote> <p>GarageBand will, however, include in-app purchase content from Apple, with</p> </blockquote> <p>additional instruments and sounds available for a fee. Licensing fees associated with some of those sounds had been the presumed reason why GarageBand was left out the original move to make Apple's iLife and iWork apps for iOS free of charge, and it appears that the company has settled on in-app purchases as a way around this issue, offering basic functionality for free and then premium content through the paid upgrade options.</p><![CDATA[inessential.com: Why Care About 30,000 Notes?]]>https://www.timbroder.com/2013/10/inessential-com-why-care-about-30000-noteshttps://www.timbroder.com/2013/10/inessential-com-why-care-about-30000-notesSun, 20 Oct 2013 15:14:45 GMT<p>Brent Simmons posts some interesting philosophy on sample data sizes. I'm definitely going to be using this thinking in my next app</p> <blockquote> <p>I’ve learned that I’m unlikely to over-estimate the amount of data people like</p> </blockquote> <p>to keep.</p> <p>via <a href="http://inessential.com/2013/10/05/why_care_about_30_000_notes_">inessential.com: Why Care About 30,000 Notes?</a>.</p><![CDATA[Gamasutra: David Framptons Blog - Postmortem: The Blockheads]]>https://www.timbroder.com/2013/10/gamasutra-david-framptons-blog-postmortem-the-blockheadshttps://www.timbroder.com/2013/10/gamasutra-david-framptons-blog-postmortem-the-blockheadsThu, 17 Oct 2013 21:50:50 GMT<p>The Blockheads is an extremely popular (and profitable) game. David Frampton does a great Post Mortem write up of what went right and wrong:</p> <p>The Blockheads is an exploration/mining/crafting massive world sandbox game released for iOS in January 2013 and only just launched for Android. To date it has had over 7 million downloads on iOS, and has a passionate and growing fan-base, rarely dipping below 100,000 daily active users since its launch 9 months ago. The Blockheads was entirely made by one guy - me, over the course of about a year, and since version 1.0 Ive released 4 major updates. Its an ever-evolving game, and the potential additions are limitless. Perhaps in part due to this constant evolution, I havent felt I could write a postmortem until now. It still feels a long way from "complete", but I think now with the release of the 1.4 update it finally no longer feels "incomplete". So its time to share some of the story of its development, and where I feel I went right and wrong with The Blockheads.</p> <p>via <a href="http://www.gamasutra.com/blogs/DavidFrampton/20131012/202246/Postmortem_The_Blockheads.php">Gamasutra: David Framptons Blog - Postmortem: The Blockheads</a>.</p><![CDATA[Why We Do What We Do]]>https://www.timbroder.com/2013/09/why-we-do-what-we-dohttps://www.timbroder.com/2013/09/why-we-do-what-we-doSun, 29 Sep 2013 21:09:22 GMT<p>In his talk at Smashing Conf in Freiburg Germany 2013 Dan Rubin talked about the impact of motivation on our work. Here are some notes from his talk Why We Do What We Do:</p> <p>via <a href="http://www.lukew.com/ff/entry.asp?1791=">Smashing Conf: Why We Do What We Do</a>.</p><![CDATA[Fixing YouTube embeds in Wordpress]]>https://www.timbroder.com/2013/05/fixing-youtube-embeds-in-wordpresshttps://www.timbroder.com/2013/05/fixing-youtube-embeds-in-wordpressFri, 10 May 2013 16:42:32 GMT<p>In some wordpress themes, youtube embeds just show up as a black screen. As discussed <a href="http://wordpress.org/support/topic/dynamically-change-youtube-iframe-embeds-to-auto-add-transparent-mode?replies=8">here</a>, the solution is adding a transparency setting to the iframe's src.</p> <p>However, the solution in that thread only works if the src is right next to the frameborder. Updated code below if you are running into this problem</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token keyword">function</span> <span class="token function-definition function">add_video_wmode_transparent</span><span class="token punctuation">(</span> <span class="token variable">$html</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$pattern</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'#(src=&amp;quot;https?://www.youtube(?:-nocookie)?.com/(?:v|embed)/([a-zA-Z0-9-]+).&amp;quot;)#'</span><span class="token punctuation">;</span> <span class="token function">preg_match_all</span><span class="token punctuation">(</span> <span class="token variable">$pattern</span><span class="token punctuation">,</span> <span class="token variable">$html</span><span class="token punctuation">,</span> <span class="token variable">$matches</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token function">count</span><span class="token punctuation">(</span> <span class="token variable">$matches</span> <span class="token punctuation">)</span> <span class="token operator">&amp;</span>gt<span class="token punctuation">;</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span> <span class="token variable">$matches</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token keyword">as</span> <span class="token variable">$orig_src</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span><span class="token function">strstr</span><span class="token punctuation">(</span><span class="token variable">$orig_src</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'wmode=transparent'</span> <span class="token punctuation">)</span> <span class="token operator">&amp;</span>amp<span class="token punctuation">;</span><span class="token operator">&amp;</span>amp<span class="token punctuation">;</span> <span class="token operator">!</span><span class="token function">strstr</span><span class="token punctuation">(</span> <span class="token variable">$orig_src</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'hd=1'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$add</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'hd=1&amp;amp;wmode=transparent&amp;quot;'</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span><span class="token function">strstr</span><span class="token punctuation">(</span><span class="token variable">$orig_src</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'?'</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$add</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'?'</span> <span class="token operator">.</span> <span class="token variable">$add</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$new_src</span> <span class="token operator">=</span> <span class="token function">substr</span><span class="token punctuation">(</span> <span class="token variable">$orig_src</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span> <span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token variable">$add</span><span class="token punctuation">;</span> <span class="token variable">$html</span> <span class="token operator">=</span> <span class="token function">str_replace</span><span class="token punctuation">(</span> <span class="token variable">$orig_src</span><span class="token punctuation">,</span> <span class="token variable">$new_src</span><span class="token punctuation">,</span> <span class="token variable">$html</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token variable">$html</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">add_filter</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'the_content'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'add_video_wmode_transparent'</span><span class="token punctuation">,</span> <span class="token number">10</span> <span class="token punctuation">)</span><span class="token punctuation">;</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>New thread in the wordpress forums can be found <a href="htp://wordpress.org/support/topic/dynamically-change-youtube-iframe-embeds-to-auto-add-transparent-mode-updated">here</a>. (The original was closed)</p><![CDATA[Automate Adding to Trello on iOS with Launch Center Pro and Pythonista]]>https://www.timbroder.com/2013/03/automating-adding-to-trello-on-ioshttps://www.timbroder.com/2013/03/automating-adding-to-trello-on-iosSat, 23 Mar 2013 17:38:14 GMT<p>I love using <a href="https://trello.com/">Trello </a>to organize my life and work. While I kind of like it's iOS app, sometimes navigating to a board to add a card can be a little time consuming.  I want this process to be faster. I also use Launch Center Pro to get some quick actions that I miss from Android. Mostly around quick communication, adding events, and now, adding to Trello.  LCP uses x-callback-urls for inter-app communication, but Trello doesn't have any that I could see. Inspired by Federico <a href="https://twitter.com/viticci">Viticci</a>'s article on <a href="http://www.macstories.net/stories/automating-ios-how-pythonista-changed-my-workflow/">automating his iOS workflow</a>, I decided to take a crack at it using pythonista. All code shown below can be found on <a href="https://github.com/broderboy/PythonistaTrello">GitHub</a>.</p> <p><a href="http://timbroder.com/2013/03/automating-adding-to-trello-with-launch-center-pro-and-pythonista.html/2013-02-11-14-32-57"><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <span class="gatsby-resp-image-background-image" style="padding-bottom: 177.21518987341773%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAjCAIAAAAblL1PAAAACXBIWXMAAAsTAAALEwEAmpwYAAAHEklEQVR42k1Qe2yddRn+YjAhkWmGMctcgwhzxIHBXs453/1+v/0u3+2cnp7T9vS06+301K0rbdd17NLSsUvbwUBgBWNgYyw62Rhbow7HYNPA3BL9B51EIQaFRBwhSwQN5msh+vvjlyfP+z7v874PEQZ4anJyZMvmMMCFfFIsFMYfeGBmenpmenrH1NTktok9u3fvnX1oz+5dxUKhEEdxEPT1dA8NDsZhSOTjOEAQeB6CAEEQR2GIcYgx8D3fc33XBb4XIIQRjOMI5hOUT2A+j8IgH0dEGOC+3k1zBw/Oz83PzMzkkzgOwzDAY2NjhxYWFhbmR7duDTGO4qgtCBZk40lB+aEg9/t+mCQEAmDLls2vX7p04cKFxcWnC/l8FAYYobn5+d9evfrmlSv79j2MEcQIDfZU3/758b8v/eyjX50/vHOX63kERrCr0nVkcfHls2f379+PEYrDEAEwNjZ27tzS2bPnRkZGMIIQgOGh2ns33//okw8++8+NJ5+Ysy2bCDFOorhSqdRqtYGBAQhAFAQYwlJbW71er9VqxWIx3QSA7krntatXrl976b1Lk9PbN3keJAKMWlsLXZVKd7Xa1dkZhUGAUYBRGASdHR3VrkqUJpAG1loo1AYGhnrL9cFqqa0UYJSunURRR3u5q1KpdHQECCEIMIIBxp3t7T3VahRFGKZrx1FUamsrFIqlUns+n2AIUzGA0Pc937E930cQQQAwBAHyPd91PQdDDwOQkgBC4CPoQ9dHXhohYcNwCja9Ftx6ofXrp9DqBDgAQAy9TOlZafYt/+S78uRR5NnIR17eajy0hv3FV9XfrbLHycAKCRPGO6RvXtucvX589rR5S8FRPAAR8NfHL1uTb+Fn/tk4fhECBzrQLEl3HfrywCuh/M5qbu93Ai0iTBhuFe44E6/7zSPDz1qrQ1PyfAB8707zKF+/zva+ebd1BPgOdIESCHc/uGrkdLVxtqG5857QCQnHh2Utu41cNcHcPsKtBY7lup7v2o3SyEb7uQ38bCPTDjzHcz3LMTYm39rQveYuay1vMsiHhOvYYRRv6h/s6x8cqNWB7zu27TpOgPz+TdWeamcUomXG9ly3q73S35PSAUau4xCOba/UXMdxnRTblvUF6biO49jO/8j/a3Ns+3OxbZqmYXyO0z5rBdimmZKWZVvLwLZMw1jGaQNhW5Zlmp7rYoQs07Qt0zINyzStFZltr5ArGss0EYRfkFYqliWxPjR0/Phxz3UNXTcNwzR009Dn5+bn5+YMQzd1wzQMTVWTOD5x4sQPhocVWU7FpmHomoYgrHZVTcMwdN3QteVfL5dK7eXyCjZ0faWtu1rNJ4muaaZhEEZKaul5lmWkQk3X1BXGdRxr+dS0Q1UNXVcVOTVTVV1LDQhN1RRFCuOg2lOxHFNVFU1RFFnGGFcqlXK5HIahIsuamk7UVD1J8o7jqIqqayqhKLImahqjK6Su0JoiK7IkKbLMsQxL5Rgyx7F0OkxKCyJPsXSOZ3KyxKuKSqiCKkS55skG4dF1yvR3ZU1SJFkUhIHN4w8ePLJr/kj/8Kgo8LIkqapR7DuwZcfTtfGnLL9NFnlCo4zv1Ru2/b66+K+p7NtfEhApczInCFufOn/+T58ceu1G9eBpURAkgZXM1u6H3//xuY/3HP230bpP4jKEyugbKw17Xh2ZPjfe9KNvMG5W4SReEBp6f3rxDx8ffuWDO6rPCTwvi2xOCFs639j+xB9bd/75PmVCE3OEzMr3muvXbr5l3dCtDd7tFJ8TeVHgWGFmqW/pw+Dkh9zOUwLLSCLXTFt3aotG5Sfftp5fn+vSJIrQNB1h5ASWFzsOsIHncxwn8HxcLPqlSqGnNyzkBYFPH8fysme5BdkIeUEUBJ6QJQlCAH2IAQ6CwPd8lmE4jvNs2zMN4NiubS8LWY5lLVMPMPRcK5VyHMGxLJkhyQyZy2TJFpIiKZZlOJalaZphmFwuR1M0x7Isw3IMQ2YzDJllyQxNkRzHEVQLmfTFsy89tHBmbvSZrZIiMTTNLvvkslld1wVBYFmWpkhVtx5/4ZeHT15+7NQb5U31XKaFoJtocVB8/a/XPr352Z6lvY3i/TzFsQxDU9TExMSxY8ckSUrNqWyzjKZOXr98/cbYi3/jytvZ7PcJsUlcU1sz/ZcDF/9xtflM7l5pI09yNENTJDU6OlqvD2cyGZblOLLlPimkHnn31+98Gjx/c328W8zeT/BN3D29G7724m2rXvjKqsXbKJGkc3R6ME03NzW3NLfQNEXTDJXL0rJhHTjrP/aq8fhlvnWQamkkaJpis4xreYW4oPM6mSVpiqJIUhSEJEnaim08z1MkmctmLdNIQpSPg2I+CDFkGJZIXWiK4zhJFNnlkKn0pc4CL8iSxDDM8rQ0XlGUBF4QBFEURJqm/wva+9Ge/tsByQAAAABJRU5ErkJggg=='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="2013-02-1114.32.57" title="" src="/static/d7cf05a0d7ab253399d21400491e0cad/f058b/2013-02-11-14.32.57.png" srcset="/static/d7cf05a0d7ab253399d21400491e0cad/c26ae/2013-02-11-14.32.57.png 158w, /static/d7cf05a0d7ab253399d21400491e0cad/6bdcf/2013-02-11-14.32.57.png 315w, /static/d7cf05a0d7ab253399d21400491e0cad/f058b/2013-02-11-14.32.57.png 630w, /static/d7cf05a0d7ab253399d21400491e0cad/6af66/2013-02-11-14.32.57.png 640w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </span></a></p> <p><a href="http://timbroder.com/2013/03/automating-adding-to-trello-with-launch-center-pro-and-pythonista.html/2013-02-11-14-33-00"><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <span class="gatsby-resp-image-background-image" style="padding-bottom: 177.21518987341773%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAjCAIAAAAblL1PAAAACXBIWXMAAAsTAAALEwEAmpwYAAAHjklEQVR42k2QeWxU1xWHX0MIKYM3vHuW996996333bfOjGe3PbZngLLZEAzGxGYp4AU7McEltik2BhsvNGCLRYX2D0qIK5SIEpYECBACCqJt0giKEA20hLQEGkpsoKJS1KmGKFGloyudT7/vnKtDGYZlmG7TdH/3mqZbJXosNq2+vmF1fUNzyystLa9WVs5XFNX8PvCsLMOwKN1wE0XHgooFggVV00xdt4iqixwWkCxAWeRkVdV13dI08/sYURVdNyyKYL28Il4/UN/Y3/Bye63b7VU1Q1PN+fUvNQ02Ngw0VKyoVImhaobH51u6oa6xv3H11lXRmWVE0SnMqfHm+Jl7F/7x6Jv+c0PErxrEUlR11b7V18f+dm3sVu1wnUJUnVhasb7945Gvnoyf+OJ0dGWUCBplCp6cpbmjf3334Vhi1juVTo/LrfoEIquD+ucP7l++d53rFmRC3GphfqBgybEVT58ktv95b051riV5KYvz5jblFVzOhxfZiYefV/yqppgaMdJG0vjLXObHU1MHU3XF0hRTLJKnnLCRS8qkiy84fuoyeQ+VPIZlhRdGQjURX9xPiK5qhoI1f2kwWBMOV0e8ET9RkpAoul5qBWpCnlmFiqZrmpmUVdUoCZbHiqYHvKGkTHSFaIXuQGkoVh6J+7wBhWiE6ETVTdUTDZYHPZHkONWgiKoriiZKmBNFLKvkmUmIjrEqSLIgSf8PiaLzkiRjQpTkLErk8Kxls7edGtp9evfP9reZHg/GqoK1Fb0rdn6wc+TMSO3GWllSMVY9AV/7wdf3nN7Tf6J/evUMkVcoCRLPcu9Htz/5z3ji50c3Awtq2OKxWPVG9d0HT778emz2lrmCLGnYhH609eQvvn2cOHnjgrHYwJxG6cBKq09v/3v38Yfn8Puqy8tqssVj2b7b+dt/HXnj3p7soRxZJppkFYTtwXNFH41/suTG8qnLsnRoUQTpzmo6ZdT24m9esI3YZJMkvy3rOZ25KaO2iaMTctblEknHsip6cerulCkHJk98cwI7DxLOoLCiSpwSDZXPm7PAq/olUZFkwvOiLpmzp82dM63CJG6eFyVZkSViYs/8uVXF/lKRU7CiUpJMBAnznCSJRBBlUVIUYnh84cJAxB8q9oWKvYGIxxdWiCHKmOMlkcc8LwkSlmVCCSI23Z6SWdHwzKJIrEQQJH+odFXLhqa1Xc1tPc1tPU1ru1a1bPCHooIoF01PxopnluqmJYoKBV38zKZZb90YPX3r7OZTW2RDCQSjLW096zcOdvcNd/cNr9842NLW4wtEVZ82cG7gzK0P91/bH18+DTECJTIYVKOLn/8xMZ5oOdSWLWeHw/HW9t6NW3Ycfe/M0ffObNyyo7W9NxKMZ+lZne/2JJ4kTlw9y8wHEiCU4tSmNKdOuzuj6atXMs5Pdeh0KFDe2tHb1Te8a++BXXsPdPXtaO3oDfljeb4C+hLz+v1OclNNX5mJXRolIswWo6x1WWnr0/JW5iGe94eia9Zt6ti0bfPAzp7+kc5N29as2+QPRoHAOdY4szqzMl/LBCFO5DDFizLHyl4+EHPPwC4NQt4fKm1c2/1612Dftl09A8Pt3YONa7v9oVKWRW7BPz9aFZAiHJB4SaY4QQKQd9HA6WIZFkIkYGIEi8oLfSVeb7HXW1LoKwkWxTAxIBJcNHC4GBcNAOQ5QaIAywXKwrUddXUddS81LRBlBSKepkGsKl6zvqZmfU1pZRntAhDxsqJWtSyq7ah7ub22sDgAAE+5CmBZU/kH989/MX6///wgMgQEJcBzq35Vf2381tWxv9QO1wHEISgKPmn7peE7j78+/uXJyLIixoEo3iFPrc565+bJp98k5h1alImzJUQckNF6zdv/HLt69w7XIdIASJCkGxnLjtQnHid+eeXNjMpMwYUpvkBOX50BP2PVP5CJx55ndAiBCKCQuivFumI4/2S3DdkQKyIgOn1M+qlU/6f+lN/bsutyeLtMAcDzWPIs8FkLPUqJBgAPEA+BwKgIV6hkjsYSDgIBcgLLclrc9C72GbMtKAgQCRRAPEJiuLC4JFCmEYuFHIBJHwDBqwc8mg8AIdlCnoFIV9zF/rJCM4C4JKTY5G2R3U7n211OB2AAx0KOAVwSOhiHg6Fp9AN0OkC+3elwsDSNWMRT9gKmdGGs53DP4OHB5j3NAsY0ixgWLe6s6f/dwNYjfQvWLaRpSLNQ1tXWfa1Dh4e63u4qqog67CzlzGPdS72X7l759t+Jze9vLVAckBXtLF09vOT+o6d3xx/P7at0MAxkRLvp2nZu5L9PE2dvX9IW6a4CSMFccfKyKVvvbL/w8FPrmDdLyUWMZGdp5w7m+IMPf31vNLs318kAREtpVmbZ6emfPbrZcP3VKdVpKF+iQD6fXZVre3vyjw9OmrTrRVqGDIMYmkvfkJFyyDZh9Ln01zJYF8cwyKUB277JKQdtz731o7wKO1vAUwxEtAP6C8Px2AxVNF0ukFzDQOASysriJUVlwCXQLKQBcjqBjt0zfjLb5w7SDshARDEAMQBBXhBEDBCfNFn0HeQFmRcxA9EPkEWcIGFOkJ4FuP8BVoJc4nkzD10AAAAASUVORK5CYII='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="2013-02-11 14.33.00" title="" src="/static/8fe4de835564d2527e9b7aeb9d2cfb6a/f058b/LCP.png" srcset="/static/8fe4de835564d2527e9b7aeb9d2cfb6a/c26ae/LCP.png 158w, /static/8fe4de835564d2527e9b7aeb9d2cfb6a/6bdcf/LCP.png 315w, /static/8fe4de835564d2527e9b7aeb9d2cfb6a/f058b/LCP.png 630w, /static/8fe4de835564d2527e9b7aeb9d2cfb6a/6af66/LCP.png 640w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </span></a></p> <p><a href="http://omz-software.com/pythonista/">Pythonista</a> lets you edit and run python scripts on your phone. There are a few ways to get scripts onto your device:</p> <ul> <li>Edit right in the app</li> <li>Import <a href="https://gist.github.com/omz/b0644f5ed1d94bd32805">from a gist</a></li> <li>Use <a href="http://tapbots.com/software/pastebot/">pastebot</a>. A great app that gives you multiple clipboards on your device that will also sync with your mac. This is my preferred method.</li> </ul> <p>The endgame of all this: I want to be able to add a card to a specific board, with as few taps as possible. Check out this video for what we are going to build. Digging into the <a href="https://trello.com/docs/api/card/index.html#post-1-cards">Trello API</a>, we can see that to add a card, we'll need a name for the card and the ID of the list to add it to. We also see that we'll need a token for any of the API calls. To get all of our lists, we'll also need to know about all of our boards.  This breaks our tasks out as follows:</p> <ol> <li>Get an App API Key</li> <li>Get an API Token</li> <li>Get a list of every board we heve</li> <li>Get the IDs of every list on each of these boards</li> <li>Add a new card to our list of choice</li> </ol> <p>To get an App API Key, you can generate one <a href="https://trello.com/1/appKey/generate" title="here">here</a>.  In theory, the one I distribute with these scripts should be ok. Get this first script into Pythonista and run it. It will generate a permanant API token for you that you can leave in Launch Center Pro when running these scripts.</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token comment">#GetTrelloToken</span> <span class="token keyword">import</span> webbrowser url <span class="token operator">=</span> <span class="token string">'https://trello.com/1/authorize?key=3e2cd730f3dcccbe15eaf0d39d219a37&amp;amp;name=PythonistaTrello&amp;amp;expiration=never&amp;amp;response_type=token&amp;amp;scope=read,write'</span> <span class="token comment">#open web browser to get a permanant Trello API Token</span> webbrowser<span class="token punctuation">.</span><span class="token builtin">open</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p><a href="http://timbroder.com/2013/03/automating-adding-to-trello-with-launch-center-pro-and-pythonista.html/2013-02-11-14-54-35"><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <span class="gatsby-resp-image-background-image" style="padding-bottom: 177.21518987341773%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAjCAIAAAAblL1PAAAACXBIWXMAAAsTAAALEwEAmpwYAAACU0lEQVR42u3UTU/bMBgH8HxsRE/lRUijjPIpuNAbvcKhVYvEKJpbaFKapFmaxm1eHDtxnNhOMoVy3MbUaZom8ZcPtuWfbD2yrTQajaOjo1ardXFxcXh42Gw2G685Pf3UPj//fHbWap02Go39/f29vb1ms3l8fHxyctJutw8ODhSEUK/XWywWCKHr62sAQJZlpmWb1jcURebCspeOFwSc8+Fw2Ol0kiRxXRcAgDFWRqNRt9u9u7sDAFx1rm5ubsbjcX8w7PUHD6NRfzDsD4ZfHh4mk0m32728vByPx/f397e3twAAhWCSUkoIqTtpmsQJjSlNkiSOCSHJa2JCMMaUUsYYxng77ziOApO16ms2tm1iO8SxsKUGGhOsei+EEEVKySUXUohCCClyyXOZF0VRvpcoihRJeKwhvmYojL4CoOvGbDbTDUNK+euda1yWJeeirKqqKMotKMtKylKIUoq6XxSVlNvJqizL7XCLke+7y2WMUL5Zs/kLe5nlKydf2tnSzpd2vnJSTWX6nM00pr+whZlqU+FvSikjhBQZhkybZjXTMstkxjydPjFjXgNTz0w91abp9IlOQGYaqfpcL1Cf6dM4hK5S5pn0Pel7RRjIzVr4XuF7ErrCXYnAkzjKrIXwPQ7d+kRwlTtLDl3he+EaKizLVhDiOA6jKKaU5TyiNKYpwjjL83cKhhBSVXXlOIahryFEmFgrd7PZQNfNGHur349ajatd84Z/dg1+C//Rzv8A169qZwwh3B3XP8l/WLAP/IH/Lg7DcHccBIHCOd8NPz4+fgdv9NmGm33jmwAAAABJRU5ErkJggg=='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="2013-02-11 14.54.35" title="" src="/static/470a009396cfdafc293c519c6dce1897/f058b/2013-02-11-14.54.35.png" srcset="/static/470a009396cfdafc293c519c6dce1897/c26ae/2013-02-11-14.54.35.png 158w, /static/470a009396cfdafc293c519c6dce1897/6bdcf/2013-02-11-14.54.35.png 315w, /static/470a009396cfdafc293c519c6dce1897/f058b/2013-02-11-14.54.35.png 630w, /static/470a009396cfdafc293c519c6dce1897/6af66/2013-02-11-14.54.35.png 640w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </span></a></p> <p><a href="http://timbroder.com/2013/03/automating-adding-to-trello-with-launch-center-pro-and-pythonista.html/2013-02-11-14-54-40"> <span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <span class="gatsby-resp-image-background-image" style="padding-bottom: 177.21518987341773%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAjCAIAAAAblL1PAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFkUlEQVR42m1VS4gcVRSdreBGMIgQ0IUS0YUgggvBDwiCWxeCQty5EN24mwyjMZPMTEZhZBIxiwhiEjUZjZ1JYpJOQkJ6pulPVXX961VV1/+91z1d1fXpqq7u1oDS/TozmeChKd5r3ql7z73n3ZpZWFhYXl5eW1s7ceLE4uLi0aNH5+fn5+bmlpaWVldXV1ZWlpeXZ2dn5+bmZmdnjxz5euHo4qEvj321sLK4dHxmNBp1u91Wq5VPQLZRFA2HwyzL+v0++XM0Gg2Go3//GZyo9T++fv/Dq/8cK2UzkiSxLMswjCzLoigKolijKJpheEEUhPGWnzwFQeQE0VCExavaB+fR+7/iQ5f0GdM0LcuybducwHNs5LmOY7c8F7quY9ue4zQNo2kYzuSMYxlm07AMw7XMmdYDtFstjPEdRrheZXnNOHurfK3KugjVJXXp/LWLpfp2u40xHp9sj3+tVmsGP8B2u9W0neuVxlrh1k/F0vH161+c/v3g6s+fn7owf2bjk5O//HGv5m9vI4R2KLvkVgu7EJ69tfX+8o+Hz105e6u8sUUfPnf58LnL82c2VtZvWI5LstslI4Q8z3Mn8DzPtGzHdTCCGMLtFu60MUYQQa/TwtDbA4TQDISQ9CaO46TXy7IsS9M4mSJOkl4vHa96Y4RhGE/Q7XYhhOO0wzBst9uu68qyzHFco9HQm7qmabIsAwAajYaiKKIoSpLk+77jOAihJEnGkRFC3W5XluVqtcqy7MbGxs2bN0ulUrFYvHPnTrFYvHv3Lk3TV65cuXHjhqIopVKp0WjEcTxNO47jKIrCOEz7KcSQYiiWZ3VDr1N1lmdZnuU4rlarYYx7vR5RMCUjhKIo6iW9UTq6n9/3ke9qDjJQgAILmMhEpmbqum6aZhiG00JMMI2cxEkn9C9rV/8Elzb0yxe1wu/qxYJ26S/rWkHfqGOq63c7ficIAmKnXbIHvX6vDzDYf+rZJ07u2/f906//9ubbF9557vSBJ08+9djq4x9dOqgISqFQWF9fv337Ns/zhDyuNoQw62U61l/+7pXnv3nhhW9feuOHt949/d6ra68d+PbF/UvPfPrHZ7IgF28WC4VCsVjcS0bjgoVRCFxVcRTgAs7iGyYr2hLwgOwqNrb9CaIoCoLA9/3dtEnB4jjOszzP8n7a/3vw97A/JNs0SftZP0mSiXfSMAzHfZlYZUoOw1BVVVVXJVlSgELRFCdwmq6JkkgzdK1W29zcvHfvHk3TaZr2er00TadkjHEQBFtbW9VqdXNzs1wuk6OapimKommaKIqapjUajWazCQDQNM00zalmhFAQBPV6vTEBTdMcx9XrdUVRKIoql8vVapXjuEqlUi6XS6WSIAidTieKol3NjuOQi4UQIgsIIQDAMAxVVQ3D0HVdluVms4kxTtN0Sib2HAwG/QmyLBsMBnmeZ1k2HA7zPO/3+0QnqVmSJHsK1u12WZbdEcmyrKIouq6zLAsAgBCSCpErQFqzp1U8zxNhsizTNC0IgiRJFEUJgmAYRhRFvu/vXOa93k6SdrttGAbDMAAAVVU1TZMkyTRNAADP85IkCYLgeV6SJP8TOc9zhBDDMJIkcRwniqJlWUQkUUtA1nsix3HcbrcRQpZlkUnmOI7neZZlwQnI9Nh5kuC7aWOMm80mRVGVSoU4gYwkTdMAAKIoGoYBANB1XVEUIn5qEpI2hFCbIAzD4XA4GAxIq/I8Hw6H6QM8mjaJbJomy7KWZem6TtpGXGGaJnlj9ACPasYYe56nqqo9gWmahmFYlkUMt6Pz0VaNPzTb2wzDsCxLusLzfKVSEQTBtm2S/2Aw2BldO5hqTpKEDG2GYXRdJ31WFEV6CJ1O52H+1NuWZSVJEgQB8cnOpwRC6LquZVnOBL7vPxLctu3/AF249T49t5UrAAAAAElFTkSuQmCC'); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="2013-02-1114.54.40" title="" src="/static/c87bd9df23e3523bd2a141e0425494d7/f058b/2013-02-11-14.54.40.png" srcset="/static/c87bd9df23e3523bd2a141e0425494d7/c26ae/2013-02-11-14.54.40.png 158w, /static/c87bd9df23e3523bd2a141e0425494d7/6bdcf/2013-02-11-14.54.40.png 315w, /static/c87bd9df23e3523bd2a141e0425494d7/f058b/2013-02-11-14.54.40.png 630w, /static/c87bd9df23e3523bd2a141e0425494d7/6af66/2013-02-11-14.54.40.png 640w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </span></a></p> <p>Now that we have our key and tokens, let's get get all of our boards and the lists on each one. Run this script and pass in your token and your email address as arguments. (In pythonista hold down run to get the "Run with arguments dialog"). Add your arguments separated by spaces. For me, this could look something like: <code class="language-text">"EGYlyiOdggDOaPoTUxaTQobmS6gtiX timothy.broder@gmail.com"</code></p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token comment">#List all lists by user</span> <span class="token keyword">import</span> urllib2 <span class="token keyword">import</span> urllib <span class="token keyword">import</span> json <span class="token keyword">import</span> sys <span class="token keyword">if</span> <span class="token builtin">len</span><span class="token punctuation">(</span>sys<span class="token punctuation">.</span>argv<span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token number">3</span><span class="token punctuation">:</span> <span class="token keyword">raise</span> Exception<span class="token punctuation">(</span><span class="token string">"Usage: list_trello_lists.py [token] [email]"</span><span class="token punctuation">)</span> key <span class="token operator">=</span> <span class="token string">"3e2cd730f3dcccbe15eaf0d39d219a37"</span> args <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token string">'key'</span><span class="token punctuation">:</span> key<span class="token punctuation">,</span> <span class="token string">'token'</span><span class="token punctuation">:</span> sys<span class="token punctuation">.</span>argv<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string">'filter'</span><span class="token punctuation">:</span> <span class="token string">'open'</span><span class="token punctuation">}</span> <span class="token comment">#build out api url</span> username <span class="token operator">=</span> sys<span class="token punctuation">.</span>argv<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> boards_url <span class="token operator">=</span> <span class="token string">"https://api.trello.com/1/members/%s/boards/?%s"</span> <span class="token operator">%</span> <span class="token punctuation">(</span>username<span class="token punctuation">,</span> urllib<span class="token punctuation">.</span>urlencode<span class="token punctuation">(</span>args<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">#get board data from api</span> <span class="token keyword">try</span><span class="token punctuation">:</span> data <span class="token operator">=</span> urllib2<span class="token punctuation">.</span>urlopen<span class="token punctuation">(</span>boards_url<span class="token punctuation">)</span> <span class="token keyword">except</span> urllib2<span class="token punctuation">.</span>HTTPError <span class="token keyword">as</span> inst<span class="token punctuation">:</span> <span class="token keyword">raise</span> Exception<span class="token punctuation">(</span><span class="token string">"Key or Token incorrect"</span><span class="token punctuation">)</span> boards <span class="token operator">=</span> json<span class="token punctuation">.</span>loads<span class="token punctuation">(</span>data<span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">#loop through each board</span> <span class="token keyword">for</span> board <span class="token keyword">in</span> boards<span class="token punctuation">:</span> board_id <span class="token operator">=</span> board<span class="token punctuation">[</span><span class="token string">'id'</span><span class="token punctuation">]</span> lists_url <span class="token operator">=</span> <span class="token string">"https://api.trello.com/1/boards/%s/lists?%s"</span> <span class="token operator">%</span> <span class="token punctuation">(</span>board_id<span class="token punctuation">,</span> urllib<span class="token punctuation">.</span>urlencode<span class="token punctuation">(</span>args<span class="token punctuation">)</span><span class="token punctuation">)</span> data <span class="token operator">=</span> urllib2<span class="token punctuation">.</span>urlopen<span class="token punctuation">(</span>lists_url<span class="token punctuation">)</span> lists <span class="token operator">=</span> json<span class="token punctuation">.</span>loads<span class="token punctuation">(</span>data<span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">print</span> <span class="token string">"-- %s"</span> <span class="token operator">%</span> board<span class="token punctuation">[</span><span class="token string">'name'</span><span class="token punctuation">]</span> <span class="token comment">#output each list in board</span> <span class="token keyword">for</span> lizt <span class="token keyword">in</span> lists<span class="token punctuation">:</span> <span class="token keyword">print</span> <span class="token string">"\"%s\" %s"</span> <span class="token operator">%</span> <span class="token punctuation">(</span>lizt<span class="token punctuation">[</span><span class="token string">'name'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> lizt<span class="token punctuation">[</span><span class="token string">'id'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token keyword">print</span> <span class="token string">"\n"</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Running this, we'll get the IDs of the lists we need</p> <p><a href="http://timbroder.com/2013/03/automating-adding-to-trello-with-launch-center-pro-and-pythonista.html/2013-02-11-15-06-39"><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <span class="gatsby-resp-image-background-image" style="padding-bottom: 177.21518987341773%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAjCAIAAAAblL1PAAAACXBIWXMAAAsTAAALEwEAmpwYAAAHtElEQVR42j3VWVBTaRYA4PvaTzM1L2P32M6IomO149ggqAk2thsmbM0iSDYMZCELIQRIQpJ7bwLZATEJmIUtIdx7yUouEU1LoLEFXOhRwQUZRQHjbpej1dVTU9U1NWXQ+R5Onf/8S52n8wO1tbVlZWUcDkckEpHJZCqVKpFIqqpZp5hVtbUiDpdbzWLz+YKGhoaSkpJjx46JxWIej0ej0cRiMSDgC/hJAoGgqqqKy+EKhUIej19Tw+MLBDw+n8fjCQQCoVDIYrGYTKZAIODxeFwul8/nA0qVUqlSqkCVClRBMARCoDKZgyD4sQhBIASBIATDsFqtBkFonVQqBaRKqUhW19jcWC+rlyqkjc2NYll9vUzSIG+ol0skcgn0CZj0/6VcLgdgEFZDsF6n0+m0Wq1Wp9Pp9XqTyWg2m9vM5va2D9FkMhmNBoNBr9frdTqtTqfVaDQymQwAZQq1wtRidLUYHaC2q1ltUbV2aYxOjcHRYnRpDE61waExfohqvUNtdLSanC0ml9bQKZfLAC0Il5WJdx9g7T3CreRp1QYXS2SQQV1qY4+4+YxK61BozsqgLilklau7KCyYkMPbnc2iMBthSAnoYU1OTjXw++zPNhz+3SbS1rSTG78qTvm6PGV3+V92lf01k7qTwNi8u2zL1+V/3lX6x235n31+GPjDwdwSnkYNAgatlnGqgS8xg612GdzVBFplkE0G2eRwV7OmWwrZGlWWZs3Z5JZFBtkgnUPY1F7Jlmo0EGBo1SpU5pXVJ2urj54m1h4+uP/+/duVx8s/v3m5/HDp0fLS4r2FxJPVZ0/XksVXr14+TSSeK+A2jRoGOkxmSZMuHI1HRmOhkbHgyNjouYuhyPkRPIb6wnj04rAfH0QCocj5cOR8GL8QGhkL4eONzXqNBgbsNmsFvTE1k5Z5iJN+kJP+LSctm5V5hJdFEmYe5mccERwuajhUIMki1RKPC7NIwuxc0d+ITBpL3t5mAnocDrYAKqmEOHVtDQqruNkibrbUNVu4ko7cMlmNuL3bFTrd5ev14Pa+cGe3v8OGQYYBQS1k6TADHpedRhN/+VX5noNspkDPFBqqhIbvaODu7Jq/f8MuoKiqa9srBeaWtkFtm4dd307l6PIpIFsA2butgGegjy+C0r6pPHCcS8zhHiDxs8mCb/OFOcX1h/JFBRWyimq47JSyiCYvosqLqLJiquzod6Lahhan0w6csViMRpOt2+Fx9QZ6es8NoeModik8Mhs9d2Pqx7kLF2bx0alg6HsvgvcPDNsd/ac7u/XGfldP99mzQJfN1nn6dDAYiI2N/ePK7OKlHxL376+srN5eWPj1l1/++9tv//n3r+/f/evF82ePHjyYv3lj5vKP38cu+AOB7u5uoL+/f9jni/j9sSHvNB5ZuHnzzvzSP28/vDN/a+H2/MrqqydPn79582Z1dW1x8f7cTz9NTV06d25seHj4w+W+3l6f3z8aCsXxkdnYhYW5ueXl5cT8rZ/v3X31/Nn7d+/evn374sWLlceP7969e/369R8mJ6PRKIZhNpsNcDqdbrfb7w+MRqPT09M3b9xaXFx6+OjR47W1xNMXL1+/fvX69ZNE4sHD5fnbt69cvRqfnMRHR1EMs1itgMlk0ul0nZ2ddrs9gkcmxqcuj09fjo9fGr94/cqNe7fmVx4sLd25Mz93/drM9FQ8Hg0FfcjQgNOpa20FSktLCwsLT5w4wUhisdl8NktUXS3mciWi2joOu5bDEXI4fCaTxWAw6TRmRTm9vKyiqKiooAAYGhryeDw9PT0Oh8PtdmMo1j8w0O92IyiGohiCYkMoOoQgg17vSCQSwfEBt8fj9Xq8XgRFAXdSX19fT08PhmEjIyMoiiIIMjkxEY/H4+Pj4xcvBvz+YQybnZ2dmZ4e9HhQFPX7/dFoFGCz2RVJ1E/odDoticFg0JI5lUqtqKg4ebL85MlyCoWyfpjFYgF/+uILEASVSqVcLl9P1qlUqvVZmZy7oFqthiBIqVQqFAoQBGEY3rBhA7Bz504URUOhUDgUDgaDGIb5fL5wODwxMbHeXsDvRxDk2rVrsVjM6/WGw+FYLDYzM5Oamgps2rRJrVZrtdoPUz4JBMGWlhaDwaD48B0o1TAMwfDHLkAQSu5CELRx45dARkYGkUjcvn378ePHSSQyiZybm5tLIpGO5eSQyWQSiZSXl5f7SUFBQX5+/o4dO4hEYnp6OgDDsM/nKy0tHRwcxHE8FAoFg8FAIIDjeDgcjkQibrcbQRCv1+vz+Vwul9lsplAoV69etVqtQE1NTWdn59GjR202G4IgAwMDfUlut3toaAhBEJvNZrfbXS6X0+m02Ww6nY5MJqMoqlAogNTU1G3btqWkpGRkZOzZs2fv3r0EAiEjIyMzM3NvEoFA2Ldv3/79+9cjgUDYvHnz1q1bt2zZAjAYDIlEkpeXJ5PJ6HS62WzGMEylUuE4PjY2Nop/FI/Hz5w5U1pSIhKJ6urqJBIJhUIBJBJJb29vcXFxb2+vVCpFEGRqaqq/v38xaTJpbm4ukUjgOE6n0y0Wi9Vq7ejoqKysBNLS0ohE4q5du7KystLT0xkMRlNTU2Fh4frzYrG4PqmpqYlGo6WnpxOJRAKBkJWVlZaW9j+u9kUIQbb2lQAAAABJRU5ErkJggg=='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="2013-02-11 15.06.39" title="" src="/static/0d0c07e588c77e2b3ad334c47c32f095/f058b/2013-02-11-15.06.39.png" srcset="/static/0d0c07e588c77e2b3ad334c47c32f095/c26ae/2013-02-11-15.06.39.png 158w, /static/0d0c07e588c77e2b3ad334c47c32f095/6bdcf/2013-02-11-15.06.39.png 315w, /static/0d0c07e588c77e2b3ad334c47c32f095/f058b/2013-02-11-15.06.39.png 630w, /static/0d0c07e588c77e2b3ad334c47c32f095/6af66/2013-02-11-15.06.39.png 640w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </span></a></p> <p><a href="http://timbroder.com/2013/03/automating-adding-to-trello-with-launch-center-pro-and-pythonista.html/2013-02-11-15-07-13"><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <span class="gatsby-resp-image-background-image" style="padding-bottom: 177.21518987341773%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAjCAIAAAAblL1PAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGiUlEQVR42m1S+VcaWRaufy7+MGfaOT3LOUmmF9t0T4zd5iQmamIY20g0ExUVwQVKVAQV2QRRWQRkKWpfqaKKAgpQ25CwKf/BHKTbSafnq++8c9879b1773cfkM/nXS4XRVHFYlGv1x8fH79//x6GYYvFIstyKpVSqVSZTEaSpEgkgqJosVjkeT4UCpXLZYDn+XQ6zfN8JpOBIAjH8UwmQxAEjuM8z9M0HY1GWZZNp9MkSdI0zfM8y7IkSfI8D3z48KFSqRQKBUmS6vV6s9ms1Wr1er3RaFSr1Xq9fnV1VbtBo9Go1+vVarXzQ7VaBer1ej6fF2+gKArHcZIkdcpJp9OdVCRJMjcoFoutVqtxg2azCVSrVY7jGIbJ5XKlUgnHcZIkMQzrFIYgCI7jCIJAEIRhWKlUurq6avyGtpjneYZheJ6vVCoMw3Ach6IogiCCILAsSxAEwzAIghAEwXFcp6P/iQVBwDBMkiRFUSiKIkkSRdFUKkVRFE3TFEUlEgkIgiiKyufzjU8A1Gq1YrGYz+crlUo+ny8UCqIoyrKsKErHxU9Pms3m5+Lr6+tWq3V1dXV9fd1ZO8EfTxq/B1AqlWq1miRJgiBUq9XP7v5s+7n44uKiUCgIgiBJUqlUYm9AkiRFUdlsVpIkURQpiuI4ThCEcrn8O7drtVo6nWYYptMYDMPJZDIej0MQxHFcx7N4PI6iKI7jnVHdGt52W5ZlQRAuLi5EUeQ47vYZSpIky3LnPfI8L4rip3P6NfOtJa1Wq7O2Wq1Pu72N/4+40WiUSqVyuawoyvn5uaIoZ2dnnSn85vN1+/uD4e2yJUkiSVLg+VwuR5JECoJgGOb5tCzLoihms+1BZLPZQiEvy3Kz2bi9Avj48aMkSSyXzohSrqAIosRnxIyUxUmKpBkUI0iawQmK4dIUw2IEIecLopStVCpt8eXl5fnZmZgrioVzIVeWlAtJuZBLl5JykS3+ki3+IpcuszeHWaW9zeTPxVyR47izszJA0wxBkLEUFkeZJM4mMKZN9FfGEapNlI6jdAJjblYWwuhEMkmQJAAhRCQG4TSHU1wMQttMIokUBiFkEiEwikNJFiVZjGRhjEZwBkKIJEKsmHZ1RisQjSe9h34YpxCMOg5FAien/lDUH4qgBIPgVBxqX5RCiRRGxpJwCiWOA2F/MPLz28UX4zPA5q5nY9u9ZnGYLC6T1bW25TBZnes3wdqWw2i2g2Y7uOUAtxyGzT3Dhs1kdZqszvkVs9ZgAWKJVCwJh6OJ4MlpLAnDKHkaT8USKRglO2ynRYhkCmPTIpsWozEoASEQjMMIDmxuWS3W3Y1NC2ja2LM7Pd7DnV379s5eJBo/iZyGwtHQSdTucNn2HCkYS8GYxbpjszudLs+B7wjQGTZntMa5JdPC8oZGtzarBef0pjn92uwi2N7qwNlFcFZnnF0EpxcM0wsGjX5No2tTZzADQ2Mzbl/IdRC07x87vUHH/rF93+/wtOn0BJzegOsg6PIGPEdht+/E6Q049v3ug6DnKDw0Ng2o3mj39trVHviOPF6fw7nvcnu8B0exOGTbc7jcXve+17bnIEjmJHK6s2s/8B2dhKMIio+MzwIDw2rdimnZuLmwBM7rjPM6w4LeqF9dXzVZNNoVzeKqdmlNqwfn9UbtErigB7VLoH7FpFsGH4+ogScvJp+8nHz0dEw9rZ94p1dPL6lnlibe6cf/s/hmph2/mVlWzyxNzi6/mVme0qxMza32PRkbGFa3xVNzBpPFNTKucXsP/cHwoT90eBw6OAoEQtEjfygQiuw53K79A4fL4/X5zZadVaNJNakNx2DQbAcGR99OaQyPnv5sADesu46NrZ118/a62Wq22rZ3nds259IKuApugOtbRpNZv2yYmdP+NDSxbnFNzq4AX95/+Od/9P796/5v/jX49fdPevqeP/hx+NuHg988HOzpe9bT96y3f6j30dB3j4Z6+p739g896B/521eP/vTXnr/c/QF4PPz65fj09wMv/63WPB5+bdjYsbl8OsPmYTDiD8d8gbDPH/YFwiex5LrV/sPA6ODo5JDq7fDYu/7BMeC5amoZ3Pr24bNl0Dz6etpic3kPg1abGydpjKC8R0HvYSgaTwmi5DkMfNc/9G5+RaMDJ2f1vf3DwJ3ue3e673Z1/7Or+96dL+4PPHulGp960P98+NXEC5V65NXEiEo9olK/HJv88eloV/f9O1/c7eq+19WW3PsvRDkh6y7PuvYAAAAASUVORK5CYII='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="2013-02-1115.07.13" title="" src="/static/fda5ec5cdd088a7eb2a0114685ff13a7/f058b/2013-02-11-15.07.13.png" srcset="/static/fda5ec5cdd088a7eb2a0114685ff13a7/c26ae/2013-02-11-15.07.13.png 158w, /static/fda5ec5cdd088a7eb2a0114685ff13a7/6bdcf/2013-02-11-15.07.13.png 315w, /static/fda5ec5cdd088a7eb2a0114685ff13a7/f058b/2013-02-11-15.07.13.png 630w, /static/fda5ec5cdd088a7eb2a0114685ff13a7/6af66/2013-02-11-15.07.13.png 640w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </span></a></p> <p>Finally, we'll need to take our key, the id of the list, what we want our card to say, and hit the API with them.  I also add in a position so the cards I add this way will appear at the top of their list. We'll pass these in as parameters:</p> <p><code class="language-text">"EGYlyiOdggDOaPoTUxaTQobmS6gtiX V12t3k6RQQ2r8X top the name of my card goes here"</code></p> <p>Two things to point out inthis script:</p> <ul> <li>we put the name of the card at the end so we can just loop through all the remaining words and not have to worry about wrapping the name in quotes to deal with spaces.</li> <li>since the end game of this is to run from Launch center pro, we want to jump back to Launch Center Pro at the end using it's x-callback-url</li> </ul> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token comment">#Add card to List</span> <span class="token keyword">import</span> urllib2 <span class="token keyword">import</span> urllib <span class="token keyword">import</span> json <span class="token keyword">import</span> sys <span class="token keyword">import</span> webbrowser arglen <span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>sys<span class="token punctuation">.</span>argv<span class="token punctuation">)</span> <span class="token keyword">if</span> arglen <span class="token operator">&lt;</span> <span class="token number">5</span><span class="token punctuation">:</span> <span class="token keyword">raise</span> Exception<span class="token punctuation">(</span><span class="token string">"Usage: list_trello_lists.py [token] [list_id] [position] [card_name]"</span><span class="token punctuation">)</span> name <span class="token operator">=</span> sys<span class="token punctuation">.</span>argv<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span> <span class="token comment">#take care of spaces if arglen > 5:</span> <span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">,</span>arglen<span class="token punctuation">)</span><span class="token punctuation">:</span> name <span class="token operator">=</span> <span class="token string">"%s %s"</span> <span class="token operator">%</span> <span class="token punctuation">(</span>name<span class="token punctuation">,</span> sys<span class="token punctuation">.</span>argv<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> key <span class="token operator">=</span> <span class="token string">"3e2cd730f3dcccbe15eaf0d39d219a37"</span> token <span class="token operator">=</span> sys<span class="token punctuation">.</span>argv<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> args <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token string">'key'</span><span class="token punctuation">:</span> key<span class="token punctuation">,</span> <span class="token string">'token'</span><span class="token punctuation">:</span> sys<span class="token punctuation">.</span>argv<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string">'name'</span><span class="token punctuation">:</span> name<span class="token punctuation">,</span> <span class="token string">'pos'</span><span class="token punctuation">:</span> sys<span class="token punctuation">.</span>argv<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string">'idList'</span><span class="token punctuation">:</span> sys<span class="token punctuation">.</span>argv<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token punctuation">}</span> card_add_url <span class="token operator">=</span> <span class="token string">"https://api.trello.com/1/cards"</span> <span class="token keyword">try</span><span class="token punctuation">:</span> data <span class="token operator">=</span> urllib2<span class="token punctuation">.</span>urlopen<span class="token punctuation">(</span>card_add_url<span class="token punctuation">,</span> urllib<span class="token punctuation">.</span>urlencode<span class="token punctuation">(</span>args<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">except</span> urllib2<span class="token punctuation">.</span>HTTPError <span class="token keyword">as</span> inst<span class="token punctuation">:</span> <span class="token keyword">raise</span> Exception<span class="token punctuation">(</span><span class="token string">"Key or Token incorrect"</span><span class="token punctuation">)</span> <span class="token comment">#jump back to Launch Center Pro</span> webbrowser<span class="token punctuation">.</span><span class="token builtin">open</span><span class="token punctuation">(</span><span class="token string">"launchpro:"</span><span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>To run this in Launch Center Pro, Add an Action > Pythonista > Run Script with Arguments. Put in the name of the script, then in arguments, but everything from above except the name: "EGYlyiOdggDOaPoTUxaTQobmS6gtiX V12t3k6RQQ2r8X top," then hit the button that says input prompt. Now, when you run the script, Launch Center Pro will prompt you for text, enter the name of the card and hit go.</p> <p>Add as many of these as you want! Just swap out the list ID.</p><![CDATA[Why Git?]]>https://www.timbroder.com/2013/03/why-githttps://www.timbroder.com/2013/03/why-gitThu, 07 Mar 2013 15:45:55 GMT<p>A few months ago I gave a presentation at <a href="https://www.alexanderinteractive.com/">work</a> about why we moved from SVN to distributed source and git. Totally forgot to put it in a post here. I also had a lot of fun playing with [reveal.js](<a href="http://broderboy.github.com/git-">http://broderboy.github.com/git-</a> presentation/) for the slides and setting up <a href="http://pages.github.com/">github pages</a>. I cover the following:</p> <ul> <li>What is traditional source control?</li> <li>How does distributed differ?</li> <li>Why Git?</li> <li>Git at <a href="http://bit.ly/aiwork">Ai</a></li> </ul> <p>Check out the slides <a href="http://broderboy.github.com/git-presentation/">here</a></p><![CDATA[Adding a Delete Line hotkey in Xcode]]>https://www.timbroder.com/2013/02/adding-a-delete-line-hotkey-in-xcodehttps://www.timbroder.com/2013/02/adding-a-delete-line-hotkey-in-xcodeFri, 08 Feb 2013 15:49:20 GMT<p>When I switched from eclipse to sublime text 2, the first hotkey I moved over was cmd+d to delete a line. I use it pretty heavily.  After using Xcode for a few months it was driving me crazy that it didn't have delete line as an option under hotkeys. Thanks to <a href="http://stackoverflow.com/questions/5834096/how-do-i-create-a-delete-line-keyboard-shortcut-in-xcode-4-the-xcode-3-solution/12678985#12678985">stackoverflow</a> for the solve. To add a new custom key binding, we have to edit the Key Binding plist file: (close Xcode)</p> <div class="gatsby-highlight" data-language="c"><pre style="counter-reset: linenumber NaN" class="language-c line-numbers"><code class="language-c">sudo vi <span class="token operator">/</span>Applications<span class="token operator">/</span>Xcode<span class="token punctuation">.</span>app<span class="token operator">/</span>Contents<span class="token operator">/</span>Frameworks<span class="token operator">/</span>IDEKit<span class="token punctuation">.</span>framework<span class="token operator">/</span>Resources<span class="token operator">/</span>IDETextKeyBindingSet<span class="token punctuation">.</span>plist</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <p>Add this text just ABOVE the close of the <code class="language-text">&lt;dict></code> at the bottom of this file:</p> <div class="gatsby-highlight" data-language="xml"><pre style="counter-reset: linenumber NaN" class="language-xml line-numbers"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>key</span><span class="token punctuation">></span></span>Custom<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>key</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dict</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>key</span><span class="token punctuation">></span></span>Delete Current Line In One Hit<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>key</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>string</span><span class="token punctuation">></span></span>moveToEndOfLine:, deleteToBeginningOfLine:, deleteToEndOfParagraph:<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>string</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dict</span><span class="token punctuation">></span></span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Note that:</p> <ul> <li>This is <em>inside</em> the existing <code class="language-text">&lt;dict></code> so there is a <code class="language-text">&lt;/dict>&lt;/plist></code> after this</li> <li>This associates the named action "Delete Current Line In One Hit" to the three key actions in the string. I played around with different options here to get the right combination. For instance, if you try moveToBeginningOfLine, deleteToEndOfLine instead of vice versa, then using it on empty lines will delete the line <em>and</em> the entire next line. Which is unpleasant</li> </ul> <p>Save this and open XCode</p> <ol> <li>Open XCode Preferences</li> <li>Select Key Bindings</li> <li>Click on All</li> <li>In the SEarch box type "Delete" and search for "Delete Current Line in One Hit"</li> <li>Add your new binding.</li> </ol> <p>I use cmd+d, so I had to map duplicate to something else first</p><![CDATA[Citrix CCA Exam for Windows 2003 Server and XenApp]]>https://www.timbroder.com/2013/01/citrix-cca-exam-for-windows-2003-server-and-xenapphttps://www.timbroder.com/2013/01/citrix-cca-exam-for-windows-2003-server-and-xenappSun, 20 Jan 2013 23:26:19 GMT<p>Through the successful completion of the Citrix CCA XenApp Windows Server 2003 exam (<a href="http://www.testslive.com/citrix-1y0-a23.html">1Y0-A23</a> exam) you can achieve validation of your administration skills with the achievement of a Citrix Certified Administrator (CCA) certification. This exam is the only requirement for achieving the certification, which is a valuable credential to obtain in the IT industry. As more and more enterprises across all sectors or the market utilize Citrix platforms, the XenApp 1Y0-A23 exam is a positive step in your professional development. Whether you work for a single employer, contract your services to corporate clients, or are a self employed IT professional serving a variety of customers, formally documenting your unique skills and abilities is essential. Passing the Citrix 1Y0-A23 exam is certainly a step in the right direction. The Citrix 1Y0-A23 exam features 66 questions in ten primary subject areas, including everything from implementation and configuration to troubleshooting and maintenance. A passing score of 60 percent or higher is required for success, and you’ll need to ensure you spend plenty of time and energy preparing for your exam. Citrix offers formal training in the discipline through online, self paced and instructor led training. Onsite, in person training is also available in some areas. Courses include labs that will allow you to hone your skills and knowledge through hands on application. Additionally, you can utilize other resources available through <a href="http://www.testslive.com/">online prep services</a> such as TestsLive.com, which include tutorials and full length, detailed practice exams. Practice tests are among the most valuable of exam prep activities as they allow you to measure your knowledge attainment and testing readiness prior to scheduling your 1Y0-A23 exam.</p><![CDATA[How to Remove or Change the way Wordpress Links to Images in Posts]]>https://www.timbroder.com/2012/12/how-to-remove-or-change-the-way-wordpress-links-to-images-in-postshttps://www.timbroder.com/2012/12/how-to-remove-or-change-the-way-wordpress-links-to-images-in-postsMon, 24 Dec 2012 20:34:43 GMT<p>By default, WordPress will link directly to an image in the category or post view. In a project I was working on today I wanted to change that. On the category view I wanted the image just to link to the post, and in the post, I didn’t want a link at all. Useful trick I found below:</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token keyword">function</span> <span class="token function-definition function">change_image_permalink</span><span class="token punctuation">(</span><span class="token variable">$content</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token variable">$format</span> <span class="token operator">=</span> <span class="token function">get_post_format</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//category listing page. link image to post</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">is_single</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token constant boolean">FALSE</span> <span class="token keyword">AND</span> <span class="token variable">$format</span> <span class="token operator">==</span> <span class="token string single-quoted-string">'image'</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token variable">$content</span> <span class="token operator">=</span> <span class="token function">preg_replace</span><span class="token punctuation">(</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'{&lt;a(.*?)(wp-att|wp-content/uploads)[^>]*>&lt;img}'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'{ wp-image-[0-9]*&amp;quot; />&lt;/a>}'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'&lt;a href=&amp;quot;'</span> <span class="token operator">.</span> <span class="token function">get_permalink</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'&amp;quot;>&lt;img'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'&amp;quot; />&lt;/a>'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token variable">$content</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">//post page. remove link</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$format</span> <span class="token operator">==</span> <span class="token string single-quoted-string">'image'</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token variable">$content</span> <span class="token operator">=</span> <span class="token function">preg_replace</span><span class="token punctuation">(</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'{&lt;a(.*?)(wp-att|wp-content/uploads)[^>]*>&lt;img}'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'{ wp-image-[0-9]*&amp;quot; />&lt;/a>}'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'&lt;img'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'&amp;quot; />'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token variable">$content</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token variable">$content</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">add_filter</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'the_content'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'change_image_permalink'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[Getting Started with Varnish Edge Side Includes and Wordpress]]>https://www.timbroder.com/2012/12/getting-started-with-varnish-edge-side-includes-and-wordpresshttps://www.timbroder.com/2012/12/getting-started-with-varnish-edge-side-includes-and-wordpressTue, 18 Dec 2012 20:20:35 GMT<p>There are a lot of cases on blogs where once you write the post, the cache for that page doesn't really have to be updated all that often.  Comments can be powered by Disqus so you don't need to bust the cache every time someone comments. If you make a change to a post, it's page and any pages that display it (home, category, etc) should be updated automatically anyway; <a href="https://github.com/pkhamre/wp-varnish">wp- varnish</a> is the best plugin for that btw.</p> <p>Now, the sidebar. That's where it can get tricky.  On a lot of the content sites I work on, we can cache most pages for days, the backend doesn't need to keep generating them, the content just lives in varnish. Except for the sidebar.  This could have things like "Popular Posts" or "New Posts". Things that are going to change outside of the context of the post you are currently looking at.</p> <p>This is where <a href="http://en.wikipedia.org/wiki/Edge_Side_Includes">Edge Side Includes</a> (ESI) comes in. For a while, <a href="http://www.akamai.com/html/support/esi.html">Akamai</a> was the only way to get this behavior, and they are quite expensive. Don't get me wrong, they are amazing, but you have to be getting serious traffic to need them. <a href="https://www.varnish-cache.org/">Varnish</a> is one of the best caching solutions you can use, especially for Wordpress. If you are unsure where to start with Varnish and wordpress, <a href="http://www.ewanleith.com/blog/900/10-million-hits-a-day-with-wordpress-using-a-15-server">this article</a> is a great starting point. I'v also bookmarked some other articles <a href="https://pinboard.in/u:broderboy/t:varnish/t:wordpress">here</a>.</p> <p>ESI was introduced in 2.1, and really fleshed out in 3.0 and can be thought of as fragment caching for Varnish. It's really easy to fix the example I gave above: we want to be able to cache most of the content for 24 hours but refresh just the sidebar every 10 mins.  Varnish will do this processing for us, keeping the rest of the page cached, and splicing in the sidebar (and having your webserver process just the sidebar) when it needs to. Most of what I'm going to do below is in the ESI [documentation](<a href="https://www.varnish-">https://www.varnish-</a> cache.org/docs/3.0/tutorial/esi.html).</p> <p>We're going to assume that our theme has a dynamic sidebar called "Sidebar" and that there are cases where we want ESI to be active (production) and some where wordpress should just behave normally (dev).  This is what we have before we start thinking about Varnish:</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token entity named-entity" title="&quot;">&amp;quot;</span>five</span> <span class="token attr-name">columns&amp;quot;</span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important">&lt;?php</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span><span class="token function">function_exists</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'dynamic_sidebar'</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token operator">!</span><span class="token function">dynamic_sidebar</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>quot<span class="token punctuation">;</span>Sidebar<span class="token operator">&amp;</span>quot<span class="token punctuation">;</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>The two varnish tags we are going to use are an esi comment, and an esi:remove tag. These are the switch that will process the page properly whether you have ESI or not. esi:remove will ignore everything between them if ESI is enabled. This is where we put our “normal processing” code. If ESI is not active, this code will run as normal. Inside the esi comment we put the code that we want to run if ESI is enabled. If it is not, the code will be ignored.</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token entity named-entity" title="&quot;">&amp;quot;</span>five</span> <span class="token attr-name">columns&amp;quot;</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">esi:</span>remove</span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important">&lt;?php</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span><span class="token function">function_exists</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'dynamic_sidebar'</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token operator">!</span><span class="token function">dynamic_sidebar</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>quot<span class="token punctuation">;</span>Sidebar<span class="token operator">&amp;</span>quot<span class="token punctuation">;</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">esi:</span>remove</span><span class="token punctuation">></span></span> <span class="token comment">&lt;!--esi &lt;esi:include src=&amp;quot;/wp-content/plugins/myplugin/esihandler.php&amp;quot;/> --></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Now our sidebar display is ESI ready, but we need to give Varnish an endpoint to hit so it can generate the fragment of the sidebar. So lets create esihandler.php:</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token php language-php"><span class="token delimiter important">&lt;?php</span> <span class="token variable">$cwd</span> <span class="token operator">=</span> <span class="token function">getcwd</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$path</span> <span class="token operator">=</span> <span class="token function">substr</span><span class="token punctuation">(</span><span class="token variable">$cwd</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token function">strpos</span><span class="token punctuation">(</span><span class="token variable">$cwd</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'wp-content/'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">require</span> <span class="token variable">$path</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'wp-blog-header.php'</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span><span class="token function">function_exists</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'dynamic_sidebar'</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token operator">!</span><span class="token function">dynamic_sidebar</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>quot<span class="token punctuation">;</span>Sidebar<span class="token operator">&amp;</span>quot<span class="token punctuation">;</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword">endif</span><span class="token punctuation">;</span></span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Lastly, we’ll have to tell Varnish to cache for different timeframes. A full Varnish config is out of the scope of this post, see the links above for more info. What we need is in the sub vcl_fetch call. Add this at the top:</p> <div class="gatsby-highlight" data-language="c"><pre style="counter-reset: linenumber NaN" class="language-c line-numbers"><code class="language-c"><span class="token keyword">if</span> <span class="token punctuation">(</span>req<span class="token punctuation">.</span>url <span class="token operator">~</span> <span class="token operator">&amp;</span>quot<span class="token punctuation">;</span>esihandler<span class="token punctuation">.</span>php<span class="token operator">&amp;</span>quot<span class="token punctuation">;</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> set beresp<span class="token punctuation">.</span>ttl <span class="token operator">=</span> <span class="token number">10</span>m<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> set beresp<span class="token punctuation">.</span>do_esi <span class="token operator">=</span> true<span class="token punctuation">;</span> set beresp<span class="token punctuation">.</span>ttl <span class="token operator">=</span> <span class="token number">1440</span>m<span class="token punctuation">;</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>And you should be all set. When developing you can use smaller timeframes (10 seconds, and 1min). Drop some logging in to see it in action.</p> <p>Let me know of any questions in the comments</p><![CDATA[Generating an InlineModelAdmin Form on the fly in Django]]>https://www.timbroder.com/2012/09/generating-an-inlineadmin-form-on-the-fly-in-djangohttps://www.timbroder.com/2012/09/generating-an-inlineadmin-form-on-the-fly-in-djangoTue, 11 Sep 2012 19:17:52 GMT<p>I'm adding drag/drop uploading to the django admin for one of our open source projects called <a href="https://github.com/aiaio/ai-stager">Stager</a>. A blog post about that will follow, it's not screen-shot ready yet.  While doing this I knew we needed a pretty seamless transition after the upload finished, and that we would have to refresh the inline.  I didn't want a full page refresh, so let's ajax it in.</p> <p>For these examples just assume that we have a parent CompAdmin which has an model of Comp and an inline called CompSlideInline.  We store the instance of the Comp in comp.</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token keyword">from</span> django<span class="token punctuation">.</span>template <span class="token keyword">import</span> loader<span class="token punctuation">,</span> Context <span class="token keyword">from</span> django<span class="token punctuation">.</span>contrib<span class="token punctuation">.</span>admin <span class="token keyword">import</span> helpers <span class="token keyword">from</span> django<span class="token punctuation">.</span>db <span class="token keyword">import</span> transaction <span class="token keyword">from</span> django<span class="token punctuation">.</span>contrib <span class="token keyword">import</span> admin comp <span class="token operator">=</span> Comp<span class="token punctuation">.</span>objects<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token builtin">id</span><span class="token operator">=</span>comp_id<span class="token punctuation">)</span> <span class="token comment">#get the current site</span> admin_site <span class="token operator">=</span> admin<span class="token punctuation">.</span>site compAdmin <span class="token operator">=</span> CompAdmin<span class="token punctuation">(</span>Comp<span class="token punctuation">,</span> admin_site<span class="token punctuation">)</span> <span class="token comment">#get all possible inlines for the parent Admin</span> inline_instances <span class="token operator">=</span> compAdmin<span class="token punctuation">.</span>get_inline_instances<span class="token punctuation">(</span>request<span class="token punctuation">)</span> prefixes <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token keyword">for</span> FormSet<span class="token punctuation">,</span> inline <span class="token keyword">in</span> <span class="token builtin">zip</span><span class="token punctuation">(</span>compAdmin<span class="token punctuation">.</span>get_formsets<span class="token punctuation">(</span>request<span class="token punctuation">,</span> comp<span class="token punctuation">)</span><span class="token punctuation">,</span> inline_instances<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token comment">#get the inline of interest and generate it's formset</span> <span class="token keyword">if</span> <span class="token builtin">isinstance</span><span class="token punctuation">(</span>inline<span class="token punctuation">,</span> CompSlideInline<span class="token punctuation">)</span><span class="token punctuation">:</span> prefix <span class="token operator">=</span> FormSet<span class="token punctuation">.</span>get_default_prefix<span class="token punctuation">(</span><span class="token punctuation">)</span> prefixes<span class="token punctuation">[</span>prefix<span class="token punctuation">]</span> <span class="token operator">=</span> prefixes<span class="token punctuation">.</span>get<span class="token punctuation">(</span>prefix<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span> <span class="token keyword">if</span> prefixes<span class="token punctuation">[</span>prefix<span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token number">1</span> <span class="token keyword">or</span> <span class="token keyword">not</span> prefix<span class="token punctuation">:</span> prefix <span class="token operator">=</span> <span class="token operator">&amp;</span>quot<span class="token punctuation">;</span><span class="token operator">%</span>s<span class="token operator">-</span><span class="token operator">%</span>s<span class="token operator">&amp;</span>quot<span class="token punctuation">;</span> <span class="token operator">%</span> <span class="token punctuation">(</span>prefix<span class="token punctuation">,</span> prefixes<span class="token punctuation">[</span>prefix<span class="token punctuation">]</span><span class="token punctuation">)</span> formset <span class="token operator">=</span> FormSet<span class="token punctuation">(</span>instance<span class="token operator">=</span>comp<span class="token punctuation">,</span> prefix<span class="token operator">=</span>prefix<span class="token punctuation">,</span> queryset<span class="token operator">=</span>inline<span class="token punctuation">.</span>queryset<span class="token punctuation">(</span>request<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">#get possible fieldsets, readonly, and prepopulated information for the parent Admin</span> fieldsets <span class="token operator">=</span> <span class="token builtin">list</span><span class="token punctuation">(</span>inline<span class="token punctuation">.</span>get_fieldsets<span class="token punctuation">(</span>request<span class="token punctuation">,</span> comp<span class="token punctuation">)</span><span class="token punctuation">)</span> readonly <span class="token operator">=</span> <span class="token builtin">list</span><span class="token punctuation">(</span>inline<span class="token punctuation">.</span>get_readonly_fields<span class="token punctuation">(</span>request<span class="token punctuation">,</span> comp<span class="token punctuation">)</span><span class="token punctuation">)</span> prepopulated <span class="token operator">=</span> <span class="token builtin">dict</span><span class="token punctuation">(</span>inline<span class="token punctuation">.</span>get_prepopulated_fields<span class="token punctuation">(</span>request<span class="token punctuation">,</span> comp<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">#generate the inline formset</span> inline_admin_formset <span class="token operator">=</span> helpers<span class="token punctuation">.</span>InlineAdminFormSet<span class="token punctuation">(</span>inline<span class="token punctuation">,</span> formset<span class="token punctuation">,</span> fieldsets<span class="token punctuation">,</span> prepopulated<span class="token punctuation">,</span> readonly<span class="token punctuation">,</span> model_admin<span class="token operator">=</span>compAdmin<span class="token punctuation">)</span> <span class="token comment">#render the template</span> t <span class="token operator">=</span> loader<span class="token punctuation">.</span>get_template<span class="token punctuation">(</span><span class="token string">'tabular.html'</span><span class="token punctuation">)</span> c <span class="token operator">=</span> Context<span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token string">'inline_admin_formset'</span><span class="token punctuation">:</span> inline_admin_formset <span class="token punctuation">}</span><span class="token punctuation">)</span> rendered <span class="token operator">=</span> t<span class="token punctuation">.</span>render<span class="token punctuation">(</span>c<span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[iOS: Multiple Lines of Text in a UITableViewCell]]>https://www.timbroder.com/2012/09/ios-multiple-lines-of-text-in-a-uitableviewcellhttps://www.timbroder.com/2012/09/ios-multiple-lines-of-text-in-a-uitableviewcellMon, 10 Sep 2012 23:32:42 GMT<p>Have you ever wanted to display multiple lines of text in your Table Cell? It's easy to do in your UITableViewController.</p> <p><img src="/images/2012/09/2012-09-10_1921.png" alt=""></p> <p>First, let's define the type of font we're going to use. We'll need this in 2 places:</p> <div class="gatsby-highlight" data-language="c"><pre style="counter-reset: linenumber NaN" class="language-c line-numbers"><code class="language-c"><span class="token operator">*</span><span class="token punctuation">)</span>fontForCell <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">[</span>UIFont boldSystemFontOfSize<span class="token operator">:</span><span class="token number">18.0</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">[</span><span class="token operator">/</span>c<span class="token punctuation">]</span> </code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <p>Next, calculate the height of the cell by using the height of a Label:</p> <div class="gatsby-highlight" data-language="c"><pre style="counter-reset: linenumber NaN" class="language-c line-numbers"><code class="language-c"><span class="token operator">-</span> <span class="token punctuation">(</span>CGFloat<span class="token punctuation">)</span>tableView<span class="token operator">:</span><span class="token punctuation">(</span>UITableView <span class="token operator">*</span><span class="token punctuation">)</span>tableView heightForRowAtIndexPath<span class="token operator">:</span><span class="token punctuation">(</span>NSIndexPath <span class="token operator">*</span><span class="token punctuation">)</span>indexPath <span class="token punctuation">{</span> NSString <span class="token operator">*</span>cellText <span class="token operator">=</span> <span class="token comment">/* get your text */</span><span class="token punctuation">;</span> UIFont <span class="token operator">*</span>cellFont <span class="token operator">=</span> <span class="token punctuation">[</span>self fontForCell<span class="token punctuation">]</span><span class="token punctuation">;</span> CGSize constraintSize <span class="token operator">=</span> <span class="token function">CGSizeMake</span><span class="token punctuation">(</span><span class="token number">280.0f</span><span class="token punctuation">,</span> MAXFLOAT<span class="token punctuation">)</span><span class="token punctuation">;</span> CGSize labelSize <span class="token operator">=</span> <span class="token punctuation">[</span>cellText sizeWithFont<span class="token operator">:</span>cellFont constrainedToSize<span class="token operator">:</span>constraintSize lineBreakMode<span class="token operator">:</span>UILineBreakModeWordWrap<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">return</span> labelSize<span class="token punctuation">.</span>height <span class="token operator">+</span> <span class="token number">20</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Finally, we'll set some attributes on the cell itself to change the height and tell the text to wrap:</p> <div class="gatsby-highlight" data-language="c"><pre style="counter-reset: linenumber NaN" class="language-c line-numbers"><code class="language-c"><span class="token operator">-</span> <span class="token punctuation">(</span>UITableViewCell <span class="token operator">*</span><span class="token punctuation">)</span>tableView<span class="token operator">:</span><span class="token punctuation">(</span>UITableView <span class="token operator">*</span><span class="token punctuation">)</span>tableView cellForRowAtIndexPath<span class="token operator">:</span><span class="token punctuation">(</span>NSIndexPath <span class="token operator">*</span><span class="token punctuation">)</span>indexPath <span class="token punctuation">{</span> <span class="token keyword">static</span> NSString <span class="token operator">*</span>CellIdentifier <span class="token operator">=</span> @<span class="token operator">&amp;</span>quot<span class="token punctuation">;</span>MyIdentifier<span class="token operator">&amp;</span>quot<span class="token punctuation">;</span><span class="token punctuation">;</span> UITableViewCell <span class="token operator">*</span>cell <span class="token operator">=</span> <span class="token punctuation">[</span>tableView dequeueReusableCellWithIdentifier<span class="token operator">:</span>CellIdentifier<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>cell<span class="token punctuation">)</span> <span class="token punctuation">{</span> cell <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">[</span>UITableViewCell alloc<span class="token punctuation">]</span> initWithStyle<span class="token operator">:</span>UITableViewCellStyleDefault reuseIdentifier<span class="token operator">:</span>CellIdentifier<span class="token punctuation">]</span><span class="token punctuation">;</span> cell<span class="token punctuation">.</span>textLabel<span class="token punctuation">.</span>lineBreakMode <span class="token operator">=</span> UILineBreakModeWordWrap<span class="token punctuation">;</span> cell<span class="token punctuation">.</span>textLabel<span class="token punctuation">.</span>numberOfLines <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> cell<span class="token punctuation">.</span>textLabel<span class="token punctuation">.</span>font <span class="token operator">=</span> <span class="token punctuation">[</span>self fontForCell<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">[</span>cell<span class="token punctuation">.</span>textLabel setText<span class="token operator">:</span><span class="token comment">/* get your text */</span><span class="token punctuation">;</span><span class="token punctuation">]</span><span class="token punctuation">;</span> cell<span class="token punctuation">.</span>accessoryType <span class="token operator">=</span> UITableViewCellAccessoryDisclosureIndicator<span class="token punctuation">;</span> <span class="token keyword">return</span> cell<span class="token punctuation">;</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[How to tell if it's HTML5]]>https://www.timbroder.com/2012/09/how-to-tell-if-its-html5https://www.timbroder.com/2012/09/how-to-tell-if-its-html5Thu, 06 Sep 2012 14:44:32 GMT<p><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <a class="gatsby-resp-image-link" href="/static/1fa76d41e28909e1b492e1860f022e35/ac99c/jxBZG.jpg" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 133.54430379746836%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAbABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAQFAwL/xAAWAQEBAQAAAAAAAAAAAAAAAAABAAL/2gAMAwEAAhADEAAAAZzHVIoo4ZZGi2y4jQP/xAAfEAACAQMFAQAAAAAAAAAAAAABAgADBBEQEhMUMkH/2gAIAQEAAQUCo0eQdQQ2+JaePhZSdzIahbVBmBRP/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAEQEiH/2gAIAQMBAT8BhaUP/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAEQEv/aAAgBAgEBPwFRmj//xAAcEAACAgIDAAAAAAAAAAAAAAAAAQIyEBEgMXH/2gAIAQEABj8CLM7H7iyGoyZffH//xAAcEAEAAwACAwAAAAAAAAAAAAABABEhMUGBkcH/2gAIAQEAAT8hB1UbrI0fCWKv6m5lDTM4nmIaAemYi9zS3Js5YFr6jDif/9oADAMBAAIAAwAAABBA3U3/xAAZEQEBAAMBAAAAAAAAAAAAAAABABEhQVH/2gAIAQMBAT8Qc8i2JC9v/8QAGBEAAwEBAAAAAAAAAAAAAAAAAAEhEUH/2gAIAQIBAT8QZdG6RTJ//8QAHhABAAICAQUAAAAAAAAAAAAAAQARITFRQWGBsdH/2gAIAQEAAT8QOrMFIG55RPeoTMG/gihQDlqooStaxFIRuLYA3rKhcZ3KUVRW1yrMF30dpZW7fM//2Q=='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="jxBZG" title="" src="/static/1fa76d41e28909e1b492e1860f022e35/828fb/jxBZG.jpg" srcset="/static/1fa76d41e28909e1b492e1860f022e35/ff44c/jxBZG.jpg 158w, /static/1fa76d41e28909e1b492e1860f022e35/a6688/jxBZG.jpg 315w, /static/1fa76d41e28909e1b492e1860f022e35/828fb/jxBZG.jpg 630w, /static/1fa76d41e28909e1b492e1860f022e35/0ede0/jxBZG.jpg 945w, /static/1fa76d41e28909e1b492e1860f022e35/3ac88/jxBZG.jpg 1260w, /static/1fa76d41e28909e1b492e1860f022e35/ac99c/jxBZG.jpg 1536w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span></p><![CDATA[The top 10 best Wordpress plugins to get up and running with everything you need.]]>https://www.timbroder.com/2012/09/the-top-10-best-wordpress-plugins-to-get-up-and-runninghttps://www.timbroder.com/2012/09/the-top-10-best-wordpress-plugins-to-get-up-and-runningMon, 03 Sep 2012 00:39:24 GMT<p>These are the top 10 best wordpress plugins I use to quickly get a wordpress blog up and running with everything I need.  I used these last week to get a new site going in about 2 hours.  Leave some time for analytics to catch up and you are all set.</p> <ul> <li><a href="http://ronaldheft.com/code/analyticator/">Google Analyticator</a> harnesses the power of Google Analytics for your blog. See where traffic is coming from, where its going, as well as basic hit tracking. The plugin also comes with an easily customizable widget that can be used to display specific information that is gathered by Google Analytics using the Google Analytics API. It supports all of the tracking mechanisms that Google Analytics supports such as external link tracking, download tracking, tracking without counting administrative users, and any other advanced tracking the user wishes to add. Google Analyticator works with a majority of themes as long as these themes provide the proper plugin hooks.Features: <ul> <li>Supports standard Google Analytics tracking via the latest async tracking methods (faster and more reliable than the older ga.js tracking method)</li> <li>Includes an admin dashboard widget that displays a graph of the last 30 days of visitors, a summary of site usage, the top pages, the top referrers, and the top searches</li> <li>Provides a widget that can be used to display visitor stat information on the front-end</li> <li>Supports external link tracking of all links on the page, including links not managed by WordPress</li> <li>Supports download link tracking</li> <li>Supports event tracking with outbound links / downloads instead of the old pageview tracking method</li> <li>Supports site speed tracking</li> <li>Supports hiding Administrator visits without affecting Google Analytics’ site overlay feature</li> <li>Supports any advanced tracking code Google provides</li> <li>Installs easily, only requiring the user know their UID</li> <li>Provides complete control over options; disable any feature if needed</li> <li>Supports localization – get the settings page in your language of choice</li> </ul> </li> <li> <a href="http://flagrantdisregard.com/feedburner/">FD Feedburner Plugin for WordPress</a> lets you track subscribers to your feed by redirecting the main feed and optionally the comments feed to Feedburner.com. It does this seamlessly without the need to modify templates, setup new hidden feeds, modify .htaccess files, or asking users to migrate to a new feed. All existing feeds simply become Feedburner feeds seamlessly and transparently for all users. Just tell the plugin what your Feedburner feed URL is and you’re done.</li> <li><a href="http://plugins.josepardilla.com/fancybox-for-wordpress/">FancyBox for WordPress</a> will automatically show all images in a fancy popup window when clicked. Handy for resized images where you don't want your users stuck on just the image file when they click on it.</li> <li><a href="http://www.thulasidas.com/plugins/easy-adsense">Easy AdSense</a> manages all aspects of Google AdSense for a blog: insert ads into posts and sidebar, and add a Google Search box.Features: <ul> <li>Remembers AdSense code and your options by theme, so that you don’t have to re-enter them if you play with multiple themes. [This feature provides a solution to Google's unwillingness to let you modify and customize the AdSense code -- you just store all the code variants in your blog database.]</li> <li>Enforces the Google policy of not more than three ad blocks per page.</li> <li>Sidebar Widgets: <ul> <li>For AdSense for content with custom title.</li> <li>For search with customizable text or image title.</li> <li>For Link Units.</li> </ul> </li> <li>Rich set of Options: <ul> <li>To put Link Units or Ad Blocks in header or footer.</li> <li>To suppress ads on all pages (as opposed to posts), or on the front/home page.</li> <li>To add a customizable mouse-over border decoration on ad blocks.</li> </ul> </li> <li>Control over the positioning and display of AdSense blocks in each post or page.</li> <li>Simplest possible configuration interface — nothing more than cutting and pasting AdSense code, and with sensible defaults for the few options present, all with clear instructions.</li> <li>Internationalized (multiple languages supported).</li> </ul> </li> <li> <a href="http://yoast.com/wordpress/seo/">WordPress SEO by Yoast</a> is the most complete WordPress SEO plugin that exists today for WordPress.org users. It incorporates everything from a snippet preview and page analysis functionality that helps you optimize your pages content, images titles, meta descriptions and more to XML sitemaps, and loads of optimization options in between.  I use it to help generate a complete Google sitemap and tweak how my sites show up in Google.Features: <ul> <li>Post titles and meta descriptions</li> <li>Robots Meta configuration</li> <li>Canonical</li> <li>Breadcrumbs</li> <li>Permalink clean up</li> <li>XML Sitemaps</li> <li>RSS enhancements</li> <li>Edit your robots.txt and .htaccess</li> <li>Clean up head section</li> </ul> </li> <li> <a href="http://www.w3-edge.com/wordpress-plugins/w3-total-cache/">w3-total-cache</a>is THE performance plugin for wordpress.  It's the fastest and most complete WordPress performance optimization plugin. W3 Total Cache improves the user experience of your blog by improving your server performance, caching every aspect of your site, reducing the download time of your theme and providing transparent content delivery network (CDN) integration.  I use it heavily for it's memcached integration, front-end compression, and CDN integration.Benefits: <ul> <li>At least 10x improvement in site performance (when fully configured: Grade A in YSlow or great Google Page Speed Improvements)</li> <li>“Instant” second page views (browser caching after first page view)</li> <li>Reduced page load time: increased visitor time on site (visitors view more pages)</li> <li>Optimized progressive render (pages appear to load instantly)</li> <li>Improved web server performance (easily sustain high traffic spikes)</li> <li>Up to 80% Bandwidth savings via Minify and HTTP compression of HTML, CSS, JavaScript and RSS feeds</li> </ul> </li> </ul> <p>Features:</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">* Compatible with shared hosting, virtual private servers and dedicated servers / clusters * Transparent content delivery network (CDN) integration with Media Library, theme files and WordPress itself * Caching of (minified and compressed) pages and posts in memory or on disk * Caching of (minified and compressed) CSS and JavaScript in memory, on disk or on CDN * Caching of RSS (comments, page and site) feeds in memory or on disk * Caching of search results pages (i.e. URIs with query string variables) in memory or on disk * Caching of database objects in memory * Minification of posts and pages and RSS feeds * Minification (combine and remove comments / white space) of inline, embedded or 3rd party JavaScript (with automated updates) * Minification (combine and remove comments / white space) of inline, embedded or 3rd party CSS (with automated updates) * Browser caching of CSS, JavaScript and HTML using future expire headers and entity tags (ETag) * JavaScript grouping by template (home page, post page etc) with embed location management * Non-blocking JavaScript embedding * Import post attachments directly into the Media Library (and CDN)</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <ul> <li>Since most of my infrastructure is already on Amazon I use the <a href="http://wordpress.org/extend/plugins/amazon-ses-and-dkim-mailer/">Amazon SES DKIM Mailer</a> plugin to use <a href="http://aws.amazon.com/ses/">SES</a> as my mail provider.  It's a quick, easy way to get guaranteed delivery.</li> <li><a href="http://contactform7.com/">Contact Form 7</a> is the best contact form out there.  It allows you to flexibly design the form and mail. You can manage multiple contact forms as well.  In addition, it supports many features including AJAX submitting, CAPTCHA, Akismet spam filtering, file uploading, etc.</li> <li><a href="http://dialect.ca/code/wp-smushit/">WP Smush.it</a>  taps into the API behind Yahoo’s excellent Exceptional Performance series recommends optimizing images in several lossless ways: stripping meta data from JPEGs, optimizing JPEG compression, converting certain GIFs to indexed PNGs and stripping the un-used colours from indexed images.</li> <li>This last one isn't required for all setups, but if like me you have varnish sitting in front of your app servers, <a href="https://github.com/pkhamre/wp-varnish">wp-varnish</a> is a must have. It automatically clears your varnish caches as needed.</li> </ul><![CDATA[Get 18+ Gigs on a Free Dropbox account for $10-$20]]>https://www.timbroder.com/2012/08/get-18-gigs-on-a-free-dropbox-account-for-10-20https://www.timbroder.com/2012/08/get-18-gigs-on-a-free-dropbox-account-for-10-20Wed, 29 Aug 2012 14:03:28 GMT<p>Dropbox recently raised the cap on it's free tier to 18 gigs. But, you only get 2 gigs out of the gate. The rest is easy to get, but takes a little leg work. [![](<a href="http://timbroder.com/wp-">http://timbroder.com/wp-</a> content/uploads/2012/08/dropbox01.png)](<a href="http://timbroder.com/wp-">http://timbroder.com/wp-</a> content/uploads/2012/08/dropbox01.png) First, log into Dropbox and click on "Get free space!" at the top right. Then, do all the Facebook/twitter/social offers to get free space.</p> <p>Really bumping up your space involves Google <a href="https://adwords.google.com">Adwords</a>.  You can max out your space by putting your referral link on Dropbox ads that will show up in Google. How much this will end up costing you can vary. One of my coworkers spent $7, another $11, and I spent $19. If you set it up like I show below, you don't even have to think about it.</p> <p>Log into AdWords, create a new campaign and copy the below settings: (Click to zoom in)</p> <p><a href="/images/2012/08/dropbox1.png"><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <span class="gatsby-resp-image-background-image" style="padding-bottom: 53.79746835443038%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABOElEQVR42p1Si27DIBDL///jJm0NCUmahgTIA0g9+VYmpkmrtpPcAzXYvkflnMNxHIgxIqUkuN/v+GvwDVHxcp4nbrcblsXCGAPvPdZ1RQhBBGIIOBMFP0Fxgv8TpYGKZDn4eNs2ISQ5nVvn8fL6hqYd8F5rqLZH3/foO+ZBzmYysNYixoSK7FQjUVYlUVZN5wm7Riw+YXYRbktf5WXQFCEl84cEznns+/5wtwjxf6Ki1XIopWrZpxAiwuPO78pBlKjyYeMQYsAwXqFUg7quxSmHQJJyEE8JyzCzQac1tO6k0XSa14nI93KY30rOhDl7a9G3LVTTYBgGTNOEcRwlc7WcdeDust+/Osx5sQ6XSw3daiil0KhGVuN6HWVVtNaY5/l5yTmzT3zAcgWLlV7yTFfH8XOZy5I/AMjTXTiUwBo7AAAAAElFTkSuQmCC'); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="dropbox1" title="" src="/static/635e277fd98e17d9ab7ed70fc8c21767/f058b/dropbox1.png" srcset="/static/635e277fd98e17d9ab7ed70fc8c21767/c26ae/dropbox1.png 158w, /static/635e277fd98e17d9ab7ed70fc8c21767/6bdcf/dropbox1.png 315w, /static/635e277fd98e17d9ab7ed70fc8c21767/f058b/dropbox1.png 630w, /static/635e277fd98e17d9ab7ed70fc8c21767/40601/dropbox1.png 945w, /static/635e277fd98e17d9ab7ed70fc8c21767/ad997/dropbox1.png 1012w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </span></a> <a href="/images/2012/08/dropbox2.png"><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <span class="gatsby-resp-image-background-image" style="padding-bottom: 56.32911392405063%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABWUlEQVR42o1S7W7DIAzM+7/KJq1/11fYC0zqtHUjkDZb8wEhEALcZNKoXZpKs3Q6B6KzsS8zxkBKBSkl6qpO3LZtypVSCCHAe49xHBNijKCYeRnZ9Q+91hicgxAFeM7RNA201tC6g7UW1pizUEy8how6WFY7HErs95/gXCDPOU6nCv+NJDh3OAtrVSEXAqIoURxLVI2EVB2C7xG9uY8YloJTbusXFLsHiN0TDm8bsNdHHN83MOUz7M8W9ns78QLB1ZcZXgdd6OYDutlDtxO84QiDQLAisbc8nSU+I4YB2bRlmbbpnEMIHtT0XIbYB2D0F7gxIt6bIVkiiQ1DskmnNRjLITgHYwyFEOiUmu4IXQfZtslK07bDFeLtk6lL9sUSyI9939/d6Nq4/iyFgiqT/6qqPo9gMnbiEDC4AOsoXzf4jSB9U1e96ZOp6Yk0ZzonaOOheo/Rrwv+AuzIWJ5B/y94AAAAAElFTkSuQmCC'); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="dropbox2" title="" src="/static/a8ae10d655a8c5cafeb44716ca82f8ba/f058b/dropbox2.png" srcset="/static/a8ae10d655a8c5cafeb44716ca82f8ba/c26ae/dropbox2.png 158w, /static/a8ae10d655a8c5cafeb44716ca82f8ba/6bdcf/dropbox2.png 315w, /static/a8ae10d655a8c5cafeb44716ca82f8ba/f058b/dropbox2.png 630w, /static/a8ae10d655a8c5cafeb44716ca82f8ba/748b0/dropbox2.png 868w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </span></a> <a href="/images/2012/08/dropbox3.png"><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <span class="gatsby-resp-image-background-image" style="padding-bottom: 57.59493670886076%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAABfElEQVR42pVT226dMBDk/z+qSpo8pZH6CVWTqPhgjPEFc/Btol0CJCiNlJWGMQgPO7OmGYYBUkqM44haK3LOKKUgFzBKBSqAWt+Ag89F+xtaOOtgRoNpChCXCzohIJXFv4uG0g4ft9cdtZZ3WN9ptsVWrnuA+PMD8ukW3d8bhnz6if75DurlHvPwC0E94KofEe1vREN4RFn6VZAuZPN6vTI7I6GVgBnljnG4rKw7eNvzfZg0UGbUHFbUdAguywJjDLP3ATFSjpU5pYwYE3IuiCljiYmf/zfDzbL3HvM8I4QArTUPKcaIlNLO70GDW3M8sHdItW0iQWsdnHNIOeOc8bmjczUhTGz1u7WJnUWbvu+hesXHZhwNrLVsl2xTrqt9A+88nJ9hp4yUD7GzMGeYYkTbtixAHyDITvKBJ3Sd5Cgot1K/tr5nOKiBOyEx0bYQrWC0rYBSCtO0RpPSMSjCpx1SUQfblI2x699jDA+HTgAJUhzbPbPzb9M+BF8BjlmnIV3AQ7UAAAAASUVORK5CYII='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="dropbox3" title="" src="/static/280bb601a0262528593e4e7b90aff3f2/f058b/dropbox3.png" srcset="/static/280bb601a0262528593e4e7b90aff3f2/c26ae/dropbox3.png 158w, /static/280bb601a0262528593e4e7b90aff3f2/6bdcf/dropbox3.png 315w, /static/280bb601a0262528593e4e7b90aff3f2/f058b/dropbox3.png 630w, /static/280bb601a0262528593e4e7b90aff3f2/bcb8c/dropbox3.png 879w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </span></a> <a href="/images/2012/08/dropbox4.png"><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <span class="gatsby-resp-image-background-image" style="padding-bottom: 33.54430379746836%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsTAAALEwEAmpwYAAAA/ElEQVR42mVQi26EMAzj//9xu4lNUBBHKfT98pSUY0wXyTINqV2nG4YB67rCGMOwxja29oSDeetZOOdgfb5gXEZMBd2yLMg584UYE3LKSCkxqF9KYdB3zuU6N+CGiloruutl1kJrfbkzqGc8DhNgfUKpJNIMY4zNlI3TaVbRqU1hHEfM84y+7yGEgPeeX0COZDBNCz4+BR6PCXJVLS4be3iC9/AhI5Pgtm0g0efzCSkl/yR3EqMi1sbie5wxjCv2Xf9FPmfu1d0v3ovO1KLdqf3A14/AICR2pXk1x34wv/bd5iu6d5H/BsYGSHUgRIcYKZ7jFCEEZopP/Jr/BYzDIfVRe1mPAAAAAElFTkSuQmCC'); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="dropbox4" title="" src="/static/a3dfd035959fef7797696d9045436e7c/f058b/dropbox4.png" srcset="/static/a3dfd035959fef7797696d9045436e7c/c26ae/dropbox4.png 158w, /static/a3dfd035959fef7797696d9045436e7c/6bdcf/dropbox4.png 315w, /static/a3dfd035959fef7797696d9045436e7c/f058b/dropbox4.png 630w, /static/a3dfd035959fef7797696d9045436e7c/40601/dropbox4.png 945w, /static/a3dfd035959fef7797696d9045436e7c/78612/dropbox4.png 1260w, /static/a3dfd035959fef7797696d9045436e7c/5f652/dropbox4.png 1302w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </span></a> <a href="/images/2012/08/dropbox5.png"><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <span class="gatsby-resp-image-background-image" style="padding-bottom: 93.0379746835443%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAAAsTAAALEwEAmpwYAAACOUlEQVR42pVUWZKbMBDl/vfIGXKEfOcnnvIkMzaLjQGhDYRAgpdqYWxsz2QcVb1Sa2t1v14iISWynMHYEeOE/xrTNGEcxxtE1vYoKo68YBBCQisFKSWUVFAkCxnWWmtIqdA0TViT3HVdULpG1BmDoiggOA+PhmF4uPQv3I/IDQOSOEGWpsiPOYriBCUFpBDgnEMIAcHFPK9Q13WwdnH9YiH5/bY74OV1jzjOkGQnVEygqiWk0uERuU7QSl+pkBK2szcKg4V936OuORirUZYMp7pDwQeUYgDXDoObngrOxWXijDEWLPHOwTmPwY1wbkTXezjvIbVFnBscyhaysSGapIQ4J3mtNFo2Ph8jZOvxe8+w2WzxtsswDC6cVBWD9/5R4Rprguf1CNV67LMKf163SOIYxpjwmILzYOHiclVVwYX7qAETlBmxS0psXzaI4wTj+YwUrxWGKH+US/dDtg7JUeD9fY/8VF72l8S+zUPn0LYtrLUhqSnqBJJn9BCyQcUbMNFCNwbWduisDYG83psRLOzPizWXRPYC4nE68zmdz+7vLnNEvxB/ZOWy+QwNn42ISmi32yFNMxyyA9I0xSnP5wZxqRAFqnkKAn3cNu1FNu2yP88RcUeVwrkIUW703E14zUOnoXquqhqmmzmm7kRvFq7XMiGi6qDcOuY5asZQliWMubYlTBNUY2Hs8JzLxJkQCpzL0MKIAlJIKUG/E9bV8BWiX6nHtx8e33/60F2kFNDntvRRA/gqYH8BIBjJaI28e00AAAAASUVORK5CYII='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="dropbox5" title="" src="/static/4b4d599d63688417f58ee4eff49751bb/f058b/dropbox5.png" srcset="/static/4b4d599d63688417f58ee4eff49751bb/c26ae/dropbox5.png 158w, /static/4b4d599d63688417f58ee4eff49751bb/6bdcf/dropbox5.png 315w, /static/4b4d599d63688417f58ee4eff49751bb/f058b/dropbox5.png 630w, /static/4b4d599d63688417f58ee4eff49751bb/4ef49/dropbox5.png 890w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </span></a></p> <p>After this the campaign should be approved and you are all set. Keep an eye on it at the end of every day and see if you want to continue it to keep getting more space</p> <p>Get free space!</p><![CDATA[Compiling Textmate]]>https://www.timbroder.com/2012/08/compiling-textmatehttps://www.timbroder.com/2012/08/compiling-textmateSun, 26 Aug 2012 18:24:16 GMT<p>TextMate 2 recently went <a href="http://blog.macromates.com/2012/textmate-2-at-github/">open source</a> on <a href="https://github.com/textmate/textmate">github</a> and a coworker <a href="https://twitter.com/tweetonwards">friend</a> of mine was asking if I had compiled it yet. Here's the quick and easy on how to compile it.</p> <h2>Prerequisites</h2> <ul> <li>Either <a href="http://mxcl.github.com/homebrew/">homebrew</a> or <a href="http://www.macports.org/">macports</a> (I'll be using homebrew for this post)</li> <li><a href="http://itunes.apple.com/us/app/xcode/id497799835?mt=12">Xcode</a> 4.4+ (make sure to open at least once and accept licence agreement)</li> </ul> <p>Now install the needed apps with brew: [shell] brew install ragel boost multimarkdown hg ninja proctools [/shell]</p> <ul> <li><a href="http://martine.github.com/ninja/">ninja</a> — build system similar to <code class="language-text">make</code></li> <li><a href="http://www.complang.org/ragel/">ragel</a> — state machine compiler</li> <li><a href="http://www.boost.org/">boost</a> — portable C++ source libraries</li> <li><a href="http://fletcherpenney.net/multimarkdown/">multimarkdown</a> — marked-up plain text compiler</li> <li><a href="http://mercurial.selenic.com/">mercurial</a> — distributed SCM system</li> <li>pgrep and pkill - part of protocols</li> </ul> <p>If the hg install gives you issues, get the latest command line tools from <a href="https://developer.apple.com/downloads/index.action">Apple</a>. (At the time of this writing it is Command Line Tools (OS X Lion) for Xcode - August 2012) Compile</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">git clone https://github.com/textmate/textmate.git cd textmate git submodule update --init ./configure &amp;amp;&amp;amp; ninja </code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span></span></pre></div> <p>Install and Cleanup</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">cp -R ~/build/TextMate/Applications/TextMate/TextMate.app ~/Applications rm -Rf ~/build/TextMate*</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span></span></pre></div><![CDATA[Getting Started with Solr and Django]]>https://www.timbroder.com/2012/08/getting-started-with-solr-and-djangohttps://www.timbroder.com/2012/08/getting-started-with-solr-and-djangoThu, 23 Aug 2012 19:45:56 GMT<p><a href="http://lucene.apache.org/solr/">Solr</a> is a very powerful search tool and it is pretty easy to get the basics, such as full text search, facets, and related assets up and running pretty quickly. We will be using haystack to do the communication between Django and Solr. All code for this can be viewed on <a href="https://github.com/broderboy/django-solr-demo">github</a>.</p> <h2>Install</h2> <p>Assuming you already have Django up and running, the first thing we need to do is install Solr.</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">curl -O http://mirrors.gigenet.com/apache/lucene/solr/4.0.0-BETA/apache-solr-4.0.0-BETA.zip unzip apache-solr-4.0.0-BETA.zip cd apache-solr-4.0.0-BETA cd example java -jar start.jar</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Next install pysolr and haystack. (At the time of this writing the git checkout of haystack works better with the Solr 4.0 beta then the 1.2.7 that's in pip.)</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">pip install pysolr pip install -e https://github.com/toastdriven/django-haystack.git</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span></span></pre></div> <p>Add 'haystack' to INSTALLED_APPS in settings.py and add the following haystack connection:</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python">HAYSTACK_CONNECTIONS <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token string">'default'</span><span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token string">'ENGINE'</span><span class="token punctuation">:</span> <span class="token string">'haystack.backends.solr_backend.SolrEngine'</span><span class="token punctuation">,</span> <span class="token string">'URL'</span><span class="token punctuation">:</span> <span class="token string">'http://127.0.0.1:8983/solr'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <h2>Full Text Search</h2> <p>For the example, we're going to create a simple job database that a recruiter might use. Here is the model:</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token keyword">from</span> django<span class="token punctuation">.</span>db <span class="token keyword">import</span> models <span class="token keyword">from</span> django<span class="token punctuation">.</span>contrib<span class="token punctuation">.</span>localflavor<span class="token punctuation">.</span>us <span class="token keyword">import</span> models <span class="token keyword">as</span> us_models JOB_TYPES <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span><span class="token string">'pt'</span><span class="token punctuation">,</span> <span class="token string">'Part Time'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'ft'</span><span class="token punctuation">,</span> <span class="token string">'Full Time'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'ct'</span><span class="token punctuation">,</span> <span class="token string">'Contract'</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">class</span> <span class="token class-name">Company</span><span class="token punctuation">(</span>models<span class="token punctuation">.</span>Model<span class="token punctuation">)</span><span class="token punctuation">:</span> name <span class="token operator">=</span> models<span class="token punctuation">.</span>CharField<span class="token punctuation">(</span>max_length<span class="token operator">=</span><span class="token number">64</span><span class="token punctuation">)</span> address <span class="token operator">=</span> models<span class="token punctuation">.</span>TextField<span class="token punctuation">(</span>blank<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">,</span> null<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span> contact_email <span class="token operator">=</span> models<span class="token punctuation">.</span>EmailField<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">def</span> <span class="token function">__unicode__</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">return</span> self<span class="token punctuation">.</span>name <span class="token keyword">class</span> <span class="token class-name">Location</span><span class="token punctuation">(</span>models<span class="token punctuation">.</span>Model<span class="token punctuation">)</span><span class="token punctuation">:</span> city <span class="token operator">=</span> models<span class="token punctuation">.</span>CharField<span class="token punctuation">(</span>max_length<span class="token operator">=</span><span class="token number">64</span><span class="token punctuation">)</span> state <span class="token operator">=</span> us_models<span class="token punctuation">.</span>USStateField<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">def</span> <span class="token function">__unicode__</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">return</span> <span class="token string">"%s, %s"</span> <span class="token operator">%</span> <span class="token punctuation">(</span>self<span class="token punctuation">.</span>city<span class="token punctuation">,</span> self<span class="token punctuation">.</span>state<span class="token punctuation">)</span> <span class="token keyword">class</span> <span class="token class-name">Job</span><span class="token punctuation">(</span>models<span class="token punctuation">.</span>Model<span class="token punctuation">)</span><span class="token punctuation">:</span> name <span class="token operator">=</span> models<span class="token punctuation">.</span>CharField<span class="token punctuation">(</span>max_length<span class="token operator">=</span><span class="token number">64</span><span class="token punctuation">)</span> description <span class="token operator">=</span> models<span class="token punctuation">.</span>TextField<span class="token punctuation">(</span><span class="token punctuation">)</span> salary <span class="token operator">=</span> models<span class="token punctuation">.</span>CharField<span class="token punctuation">(</span>max_length<span class="token operator">=</span><span class="token number">64</span><span class="token punctuation">,</span> blank<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">,</span> null<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span> <span class="token builtin">type</span> <span class="token operator">=</span> models<span class="token punctuation">.</span>CharField<span class="token punctuation">(</span>max_length<span class="token operator">=</span><span class="token number">2</span><span class="token punctuation">,</span> choices<span class="token operator">=</span>JOB_TYPES<span class="token punctuation">)</span> company <span class="token operator">=</span> models<span class="token punctuation">.</span>ForeignKey<span class="token punctuation">(</span>Company<span class="token punctuation">,</span> related_name<span class="token operator">=</span><span class="token string">'jobs'</span><span class="token punctuation">)</span> location <span class="token operator">=</span> models<span class="token punctuation">.</span>ForeignKey<span class="token punctuation">(</span>Location<span class="token punctuation">,</span> related_name<span class="token operator">=</span><span class="token string">'location_jobs'</span><span class="token punctuation">)</span> contact_email <span class="token operator">=</span> models<span class="token punctuation">.</span>EmailField<span class="token punctuation">(</span>blank<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">,</span> null<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span> added_at <span class="token operator">=</span> models<span class="token punctuation">.</span>DateTimeField<span class="token punctuation">(</span>auto_now<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span> <span class="token keyword">def</span> <span class="token function">__unicode__</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">return</span> self<span class="token punctuation">.</span>name <span class="token keyword">def</span> <span class="token function">get_contact_email</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">if</span> self<span class="token punctuation">.</span>contact_email<span class="token punctuation">:</span> <span class="token keyword">return</span> self<span class="token punctuation">.</span>contact_email <span class="token keyword">return</span> self<span class="token punctuation">.</span>company<span class="token punctuation">.</span>contact_email</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>The next step is to create the SearchIndex object that will be used to transpose to data to Solr. save this as search_indexes.py in the same folder as your models.py. The text field with its template will be used for full text search on Solr. The other two fields will be used to faceted (drill down) navigation. For more details on this file, check out the [haystack tutorial](<a href="http://django-">http://django-</a> haystack.readthedocs.org/en/latest/tutorial.html#handling-data).</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">class JobIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.CharField(document=True, use_template=True) type = indexes.CharField(model_attr='type', faceted=True) location = indexes.CharField(model_attr='location', faceted=True) def get_model(self): return Job def index_queryset(self): return self.get_model().objects.all()</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Create the search index template in your template folder with the following naming convention: <code class="language-text">search/indexes/[app]/[model]_text.txt</code></p> <p>For us, this is templates/search/indexes/jobs/job_text.txt</p> <div class="gatsby-highlight" data-language="html"><pre style="counter-reset: linenumber NaN" class="language-html line-numbers"><code class="language-html">{% verbatim %} {{ object.name }} {{ object.description }} {{ object.salary }} {{ object.type }} {{ object.added_at }} {% endverbatim %}</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Now, lets get our data into Solr. Run ./manage.py build_solr_schema to generate a schema.xml file. Move this into example\solr\conf in your Solr install. Note: if using Solr 4, edit this file and replace stopwords_en.txt with lang/stopwords_en.txt in all locations. To test everything and load your data, run: manage.py rebuild_index Subsequent updates can be made with: manage.py update_index.</p> <p>If that all worked we can start working on the front-end to see the data in Django. Add this to your urls.py</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">(r'^$', include('haystack.urls')),</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <p>At this point there are at least two templates we'll need. One for the search results page, and a sub-template to represent each item we are pulling back. My example uses <a href="http://twitter.github.com/bootstrap/">twitter bootstrap</a> for some layout help and styling, see my base.html [here](<a href="https://github.com/broderboy/django-solr-">https://github.com/broderboy/django-solr-</a> demo/blob/master/templates/base.html) if interested.</p> <p>Create templates/search/search.html This gives you a basic search form, the results, and pagination for a number of results</p> <div class="gatsby-highlight" data-language="html"><pre style="counter-reset: linenumber NaN" class="language-html line-numbers"><code class="language-html">{% verbatim %} {% extends 'base.html' %} {% block hero_text %}Search{% endblock %} {% block header %}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>Click around!<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span>{% endblock %} {% block content %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>span12<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span>Search<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>form</span> <span class="token attr-name">method</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>get<span class="token punctuation">"</span></span> <span class="token attr-name">action</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>.<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>.form-search<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>table</span><span class="token punctuation">></span></span> {{ form.as_table }} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>table</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>submit<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Search<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>form</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> {% if query %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>span2<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h3</span><span class="token punctuation">></span></span>Filter<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h3</span><span class="token punctuation">></span></span> {% if facets.fields.type %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h4</span><span class="token punctuation">></span></span>Type<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h4</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ul</span><span class="token punctuation">></span></span> {% for type in facets.fields.type %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{{ request.get_full_path }}<span class="token entity named-entity" title="&amp;">&amp;amp;</span>selected_facets=type_exact:{{ type.0|urlencode }}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>{{ type.0 }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span> ({{ type.1 }})<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">></span></span> {% endfor %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>ul</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> {% endif %} {% if facets.fields.location %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h4</span><span class="token punctuation">></span></span>Location<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h4</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ul</span><span class="token punctuation">></span></span> {% for location in facets.fields.location %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{{ request.get_full_path }}<span class="token entity named-entity" title="&amp;">&amp;amp;</span>selected_facets=location_exact:{{ location.0|urlencode }}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>{{ location.0 }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span> ({{ location.1 }})<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">></span></span> {% endfor %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>ul</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> {% endif %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>span6<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h3</span><span class="token punctuation">></span></span>Results<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h3</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>accordion<span class="token punctuation">"</span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>accordion2<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> {% for result in page.object_list %} {% include 'search/_result_object.html' %} {% empty %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>No results found.<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span> {% endfor %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> {% if page.has_previous or page.has_next %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span><span class="token punctuation">></span></span> {% if page.has_previous %}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>?q={{ query }}<span class="token entity named-entity" title="&amp;">&amp;amp;</span>page={{ page.previous_page_number }}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>{% endif %}<span class="token entity named-entity" title="&laquo;">&amp;laquo;</span> Previous{% if page.has_previous %}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span>{% endif %} | {% if page.has_next %}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>?q={{ query }}<span class="token entity named-entity" title="&amp;">&amp;amp;</span>page={{ page.next_page_number }}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>{% endif %}Next <span class="token entity named-entity" title="&raquo;">&amp;raquo;</span>{% if page.has_next %}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span>{% endif %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> {% endif %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> {% else %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>span6<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> {# Show some example queries to run, maybe query syntax, something else? #} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> {% endif %} {% endblock %} {% endverbatim %}</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>And the templates/search/_result_object.txt</p> <div class="gatsby-highlight" data-language="html"><pre style="counter-reset: linenumber NaN" class="language-html line-numbers"><code class="language-html">{% verbatim %} {% load more_like_this %} {% with obj=result.object %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>accordion-group<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>accordion-heading<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>accordion-toggle<span class="token punctuation">"</span></span> <span class="token attr-name">data-toggle</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>collapse<span class="token punctuation">"</span></span> <span class="token attr-name">data-parent</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#accordion2<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#collapse_{{ obj.id }}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> {{ obj.name }} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token special-attr"><span class="token attr-name">style</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token value css language-css"><span class="token property">padding</span><span class="token punctuation">:</span> 8px 15px<span class="token punctuation">;</span></span><span class="token punctuation">"</span></span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>Company: {{ obj.company }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>Type: {{ obj.type }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span> {% if obj.salary %}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>Salary: {{ obj.salary }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span>{% endif %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>Location: {{ obj.location }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>collapse_{{ obj.id }}<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>accordion-body collapse in<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>accordion-inner<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>Contact: <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>mailto:{{ obj.get_contact_email }}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>{{ obj.get_contact_email }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span> {{ obj.description }} {% more_like_this obj as related_content limit 5 %} {% if related_content %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>br</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>strong</span><span class="token punctuation">></span></span>Related:<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>strong</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ul</span><span class="token punctuation">></span></span> {% for related in related_content %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span><span class="token punctuation">></span></span>{{ related.object.name }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">></span></span> {% endfor %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>ul</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> {% endif %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> {% endwith %} {% endverbatim %}</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Start up your dev server for search!</p> <p><a href="/images/2012/08/solr1.png"><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <span class="gatsby-resp-image-background-image" style="padding-bottom: 125.31645569620254%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAYAAAAxFw7TAAAACXBIWXMAAAsTAAALEwEAmpwYAAACIElEQVR42qVV0YriMBTtDykI+iYyvyo7MIv4MivsgOCLoI6C4sPsmwOzojhra9u0aZo0rWe40bqzC7tWLRza3DQn556b3lr1eh13d3doNBqgZ0KpVEK1WkWlUkGtVjN3ipXL5bOwJpMJnp9H6PV6GI/HmM/nmM1mmE6nGI1GJjYcDgvDUkpBSomvDw9oNpt4evqOx8dv6HQ6uL//gtVqZeajKCoEy/d9OI6Dfr+PdruNVquFbrdrdhsMBnh7+4ndbgfbts1752AFQWAWLJdLrNdro4gW025hGII2pHnXdQvBYowZAhrkC3NFuSoa5/dzMB7m+XPOQYoJpO4aWJ7nGTIRRSDyWy/rx8sLBoMhJpMxNpuNCaZpiizLTtjv94VhiuL7zKikAJH9DYrTVYiQVC0Wr0jTDPt/LLooZTour4uF8bCoiv8qZGGEpe1jyxWYym4iJb8tnaZgPIIbcLgsvKnSRqGMY7xvNgiDAEIIJEly8vIqwiRR8HYOQsbAfA8R53+8cLGHSqfwYw12BFcpmNQQSYr9p7NYFJZKNBwu4XIJOxBgkYQTCHCpjyovTFlJie37BgFjxkeC57qIhbgo7d+ESsHebk1DIP/EkQhXFOZQFK0RRjG4OCAUMciG7Ar/jIdSp/DiA+wowS+eQOjshiorBcfegvm+6c4B/RJsxzSLS9M+HGwpTdtiLDj0RRFf1RROhFpr06nzbv2Z8Jpv+QPuC2B2G1SHOwAAAABJRU5ErkJggg=='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="solr1" title="" src="/static/5b22c7c951003e35ad55d64afb9cbb21/f058b/solr1.png" srcset="/static/5b22c7c951003e35ad55d64afb9cbb21/c26ae/solr1.png 158w, /static/5b22c7c951003e35ad55d64afb9cbb21/6bdcf/solr1.png 315w, /static/5b22c7c951003e35ad55d64afb9cbb21/f058b/solr1.png 630w, /static/5b22c7c951003e35ad55d64afb9cbb21/4597d/solr1.png 631w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </span></a></p> <h2>Related Items</h2> <p>Adding Related Items is as simple as using the related_content tag in the haystack more_like_this tag library and tweaking out Solr config. Open up solrconfig.xml and add a MoreLikeThisHandler within thetag:</p> <div class="gatsby-highlight" data-language="xml"><pre style="counter-reset: linenumber NaN" class="language-xml line-numbers"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>requesthandler</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/mlt<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>solr.MoreLikeThisHandler<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>requesthandler</span><span class="token punctuation">></span></span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <p>Our full _result_object.html now looks like this:</p> <div class="gatsby-highlight" data-language="html"><pre style="counter-reset: linenumber NaN" class="language-html line-numbers"><code class="language-html">{% verbatim %} {% load more_like_this %} {% with obj=result.object %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>accordion-group<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>accordion-heading<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>accordion-toggle<span class="token punctuation">"</span></span> <span class="token attr-name">data-toggle</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>collapse<span class="token punctuation">"</span></span> <span class="token attr-name">data-parent</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#accordion2<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#collapse_{{ obj.id }}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> {{ obj.name }} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token special-attr"><span class="token attr-name">style</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token value css language-css"><span class="token property">padding</span><span class="token punctuation">:</span> 8px 15px<span class="token punctuation">;</span></span><span class="token punctuation">"</span></span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>Company: {{ obj.company }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>Type: {{ obj.type }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span> {% if obj.salary %}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>Salary: {{ obj.salary }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span>{% endif %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>Location: {{ obj.location }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>collapse_{{ obj.id }}<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>accordion-body collapse in<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>accordion-inner<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>Contact: <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>mailto:{{ obj.get_contact_email }}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>{{ obj.get_contact_email }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span> {{ obj.description }} {% more_like_this obj as related_content limit 5 %} {% if related_content %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>br</span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>strong</span><span class="token punctuation">></span></span>Related:<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>strong</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ul</span><span class="token punctuation">></span></span> {% for related in related_content %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span><span class="token punctuation">></span></span>{{ related.object.name }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">></span></span> {% endfor %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>ul</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> {% endif %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> {% endwith %} {% endverbatim %}</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <h2>Facets</h2> <p>To get our type and location facets, we'll have to add them to a queryset and pass this to a FacetedSearchView instead of the default one. urls.py now looks like this:</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token keyword">from</span> django<span class="token punctuation">.</span>conf<span class="token punctuation">.</span>urls <span class="token keyword">import</span> patterns<span class="token punctuation">,</span> include<span class="token punctuation">,</span> url <span class="token keyword">from</span> django<span class="token punctuation">.</span>contrib <span class="token keyword">import</span> admin admin<span class="token punctuation">.</span>autodiscover<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">from</span> haystack<span class="token punctuation">.</span>forms <span class="token keyword">import</span> FacetedSearchForm <span class="token keyword">from</span> haystack<span class="token punctuation">.</span>query <span class="token keyword">import</span> SearchQuerySet <span class="token keyword">from</span> haystack<span class="token punctuation">.</span>views <span class="token keyword">import</span> FacetedSearchView sqs <span class="token operator">=</span> SearchQuerySet<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>facet<span class="token punctuation">(</span><span class="token string">'type'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>facet<span class="token punctuation">(</span><span class="token string">'location'</span><span class="token punctuation">)</span> urlpatterns <span class="token operator">=</span> patterns<span class="token punctuation">(</span><span class="token string">'haystack.views'</span><span class="token punctuation">,</span> url<span class="token punctuation">(</span><span class="token string">r'^$'</span><span class="token punctuation">,</span> FacetedSearchView<span class="token punctuation">(</span>form_class<span class="token operator">=</span>FacetedSearchForm<span class="token punctuation">,</span> searchqueryset<span class="token operator">=</span>sqs<span class="token punctuation">)</span><span class="token punctuation">,</span> name<span class="token operator">=</span><span class="token string">'haystack_search'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">)</span> urlpatterns <span class="token operator">=</span> urlpatterns <span class="token operator">+</span> patterns<span class="token punctuation">(</span><span class="token string">''</span><span class="token punctuation">,</span> url<span class="token punctuation">(</span><span class="token string">r'^admin/'</span><span class="token punctuation">,</span> include<span class="token punctuation">(</span>admin<span class="token punctuation">.</span>site<span class="token punctuation">.</span>urls<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token comment">#(r'^', include('haystack.urls')),</span> <span class="token punctuation">)</span> <span class="token operator">-</span> See more at<span class="token punctuation">:</span> http<span class="token punctuation">:</span><span class="token operator">//</span>timbroder<span class="token punctuation">.</span>com<span class="token operator">/</span><span class="token number">2012</span><span class="token operator">/</span><span class="token number">08</span><span class="token operator">/</span>getting<span class="token operator">-</span>started<span class="token operator">-</span><span class="token keyword">with</span><span class="token operator">-</span>solr<span class="token operator">-</span><span class="token keyword">and</span><span class="token operator">-</span>django<span class="token punctuation">.</span>html?preview<span class="token operator">=</span>true<span class="token operator">&amp;</span>preview_id<span class="token operator">=</span><span class="token number">1167</span><span class="token operator">&amp;</span>preview_nonce<span class="token operator">=</span>f6c209628d<span class="token comment">#sthash.2NVpbeDJ.dpuf</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Then, we can use the generated facets in the search template in the facets variable</p> <div class="gatsby-highlight" data-language="html"><pre style="counter-reset: linenumber NaN" class="language-html line-numbers"><code class="language-html">{% verbatim %} {% extends 'base.html' %} {% block hero_text %}Search{% endblock %} {% block header %}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>Click around!<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span>{% endblock %} {% block content %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>span12<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span>Search<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>form</span> <span class="token attr-name">method</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>get<span class="token punctuation">"</span></span> <span class="token attr-name">action</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>.<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>.form-search<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>table</span><span class="token punctuation">></span></span> {{ form.as_table }} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>table</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>submit<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Search<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>form</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> {% if query %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>span2<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h3</span><span class="token punctuation">></span></span>Filter<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h3</span><span class="token punctuation">></span></span> {% if facets.fields.type %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h4</span><span class="token punctuation">></span></span>Type<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h4</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ul</span><span class="token punctuation">></span></span> {% for type in facets.fields.type %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{{ request.get_full_path }}<span class="token entity named-entity" title="&amp;">&amp;amp;</span>selected_facets=type_exact:{{ type.0|urlencode }}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>{{ type.0 }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span> ({{ type.1 }})<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">></span></span> {% endfor %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>ul</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> {% endif %} {% if facets.fields.location %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h4</span><span class="token punctuation">></span></span>Location<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h4</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ul</span><span class="token punctuation">></span></span> {% for location in facets.fields.location %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{{ request.get_full_path }}<span class="token entity named-entity" title="&amp;">&amp;amp;</span>selected_facets=location_exact:{{ location.0|urlencode }}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>{{ location.0 }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span> ({{ location.1 }})<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">></span></span> {% endfor %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>ul</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> {% endif %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>span6<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h3</span><span class="token punctuation">></span></span>Results<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h3</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>accordion<span class="token punctuation">"</span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>accordion2<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> {% for result in page.object_list %} {% include 'search/_result_object.html' %} {% empty %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>No results found.<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span> {% endfor %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> {% if page.has_previous or page.has_next %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span><span class="token punctuation">></span></span> {% if page.has_previous %}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>?q={{ query }}<span class="token entity named-entity" title="&amp;">&amp;amp;</span>page={{ page.previous_page_number }}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>{% endif %}<span class="token entity named-entity" title="&laquo;">&amp;laquo;</span> Previous{% if page.has_previous %}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span>{% endif %} | {% if page.has_next %}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>?q={{ query }}<span class="token entity named-entity" title="&amp;">&amp;amp;</span>page={{ page.next_page_number }}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>{% endif %}Next <span class="token entity named-entity" title="&raquo;">&amp;raquo;</span>{% if page.has_next %}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span>{% endif %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> {% endif %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> {% else %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>span6<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> {# Show some example queries to run, maybe query syntax, something else? #} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> {% endif %} {% endblock %} {% endverbatim %}</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>And we're done! As I said, check out the [haystack documentation](http ://django-haystack.readthedocs.org/en/latest/index.html) for more information. Leave any questions in the comments and I'll be sure to answer them</p> <p>[![](<a href="http://timbroder.com/wp-">http://timbroder.com/wp-</a> content/uploads/2012/08/solr2.png)](<a href="http://timbroder.com/wp-">http://timbroder.com/wp-</a> content/uploads/2012/08/solr2.png)</p><![CDATA[Hiding fields in the Django admin based on permission]]>https://www.timbroder.com/2012/08/hiding-fields-in-the-admin-based-on-permissionhttps://www.timbroder.com/2012/08/hiding-fields-in-the-admin-based-on-permissionMon, 20 Aug 2012 16:53:46 GMT<p>Quick and easy if you have one group of users that can only edit an asset, and another group that has publishing rights</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token keyword">def</span> <span class="token function">remove_from_fieldsets</span><span class="token punctuation">(</span>fieldsets<span class="token punctuation">,</span> fields<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">for</span> fieldset <span class="token keyword">in</span> fieldsets<span class="token punctuation">:</span> <span class="token keyword">for</span> field <span class="token keyword">in</span> fields<span class="token punctuation">:</span> <span class="token keyword">if</span> field <span class="token keyword">in</span> fieldset<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'fields'</span><span class="token punctuation">]</span><span class="token punctuation">:</span> new_fields <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token keyword">for</span> new_field <span class="token keyword">in</span> fieldset<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'fields'</span><span class="token punctuation">]</span><span class="token punctuation">:</span> <span class="token keyword">if</span> <span class="token keyword">not</span> new_field <span class="token keyword">in</span> fields<span class="token punctuation">:</span> new_fields<span class="token punctuation">.</span>append<span class="token punctuation">(</span>new_field<span class="token punctuation">)</span> fieldset<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'fields'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">tuple</span><span class="token punctuation">(</span>new_fields<span class="token punctuation">)</span> <span class="token keyword">break</span> <span class="token keyword">class</span> <span class="token class-name">PositionAdmin</span><span class="token punctuation">(</span>admin<span class="token punctuation">.</span>ModelAdmin<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token keyword">def</span> <span class="token function">get_fieldsets</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> request<span class="token punctuation">,</span> obj<span class="token operator">=</span><span class="token boolean">None</span><span class="token punctuation">)</span><span class="token punctuation">:</span> fieldsets <span class="token operator">=</span> <span class="token builtin">super</span><span class="token punctuation">(</span>PositionAdmin<span class="token punctuation">,</span> self<span class="token punctuation">)</span><span class="token punctuation">.</span>get_fieldsets<span class="token punctuation">(</span>request<span class="token punctuation">,</span> obj<span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token keyword">not</span> request<span class="token punctuation">.</span>user<span class="token punctuation">.</span>is_superuser <span class="token keyword">and</span> request<span class="token punctuation">.</span>user<span class="token punctuation">.</span>groups<span class="token punctuation">.</span><span class="token builtin">filter</span><span class="token punctuation">(</span>name<span class="token operator">=</span><span class="token string">'publisher'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>count<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">:</span> remove_from_fieldsets<span class="token punctuation">(</span>fieldsets<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'is_published'</span><span class="token punctuation">,</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span> fieldsets</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[Animate an AdWhirlView from the Bottom of the Screen]]>https://www.timbroder.com/2012/08/animate-adwhirl-bottomhttps://www.timbroder.com/2012/08/animate-adwhirl-bottomSat, 18 Aug 2012 00:50:47 GMT<p>If you are using <a href="https://www.adwhirl.com/">AdWhirl</a> and want the ad to slide in from the bottom of the screen when your View loads, use this snippet:</p> <div class="gatsby-highlight" data-language="c"><pre style="counter-reset: linenumber NaN" class="language-c line-numbers"><code class="language-c"><span class="token operator">-</span> <span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span>viewDidLoad <span class="token punctuation">{</span> <span class="token punctuation">[</span>super viewDidLoad<span class="token punctuation">]</span><span class="token punctuation">;</span> AdWhirlView <span class="token operator">*</span>adWhirlView <span class="token operator">=</span> <span class="token punctuation">[</span>AdWhirlView requestAdWhirlViewWithDelegate<span class="token operator">:</span>self<span class="token punctuation">]</span><span class="token punctuation">;</span> adWhirlView<span class="token punctuation">.</span>delegate <span class="token operator">=</span> self<span class="token punctuation">;</span> adWhirlView<span class="token punctuation">.</span>frame <span class="token operator">=</span> <span class="token function">CGRectMake</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">430</span><span class="token operator">+</span>kAdWhirlViewHeight<span class="token punctuation">,</span> kAdWhirlViewWidth<span class="token punctuation">,</span> kAdWhirlViewHeight<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">[</span>self<span class="token punctuation">.</span>parentViewController<span class="token punctuation">.</span>view insertSubview<span class="token operator">:</span>adWhirlView belowSubview<span class="token operator">:</span>self<span class="token punctuation">.</span>view<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">[</span>UIView beginAnimations<span class="token operator">:</span>@<span class="token operator">&amp;</span>quot<span class="token punctuation">;</span>AdWhirlIn<span class="token operator">&amp;</span>quot<span class="token punctuation">;</span> context<span class="token operator">:</span>nil<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">[</span>UIView setAnimationDuration<span class="token operator">:</span><span class="token number">.5</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">[</span>UIView setAnimationCurve<span class="token operator">:</span>UIViewAnimationCurveEaseInOut<span class="token punctuation">]</span><span class="token punctuation">;</span> adWhirlView<span class="token punctuation">.</span>frame <span class="token operator">=</span> <span class="token function">CGRectMake</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">430</span><span class="token punctuation">,</span> kAdWhirlViewWidth<span class="token punctuation">,</span> kAdWhirlViewHeight<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">[</span>UIView commitAnimations<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[Adding Done and Cancel buttons to an iOS number pad]]>https://www.timbroder.com/2012/08/adding-done-and-cancel-buttons-to-an-ios-number-padhttps://www.timbroder.com/2012/08/adding-done-and-cancel-buttons-to-an-ios-number-padFri, 17 Aug 2012 15:49:55 GMT<p>There are some cases when you may want to have a "Done" or "Cancel" button on an iOs number pad when editing a text field. This doesn't come by default, but is easy to add. See the example snippets below, or check out the code on <a href="https://github.com/broderboy/iphone-DoneCancelNumberPadToolbar">github</a>.</p> <p><a href="/images/2012/08/Done-Cancel-Iphone.png"><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 336px; " > <span class="gatsby-resp-image-background-image" style="padding-bottom: 96.83544303797468%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAAAsTAAALEwEAmpwYAAAD/UlEQVR42o2T20+cRRjGv13gEv8N06ZWsYFycKUsVAjactiFPQG7sOdlz3y7sEuhbMu5sLBsYGktbaPlQo2XtepFicZEq0aLlmpJSYxtqok2Gv+Bn5nhIImJ8eL55pnneeedeef9Rukw2ShcWWNmboH5xSUWllZYzBf+J1bIFtaZXX6Xy29/QEt7J8qRo8fQ152iva2Vhno9dfp6bD0OzNYuzNZuOVps3RIHmm0XJrOJpthnOBd/xzj+K8+faEY5dryMisoaKiqrEVx/uglDp5VWg4lWo4k2o5mzbR0SggttX281GKk1TdDQt0aj+xpHXqpBqa1/nVhqEm84zcjFLIHoCJ5QCnf/IJ7gEK7+IdT0BMnhScmFJr1QikD0HKOZCTz+CFE1TbVOj1KlO40rmMbWF2U4M4fDq9LjUel2xbB7BrA4ImQmc4xNLkouNOF1u+J4QmlyKzewexO4QiOUV9WhnDhZKwMNFi+tJjcGqxejzYfB4pHosPnpj53D0z+IweqTvvSsPuzuGP3RNB1dfpnjxZerUWpqGwmpGZz+JJFEBl84jVuUGkjK0lz9g8QGLxBWx2TJYi694BD+yDBqalyuDakXOFmzV7I/dp4ed5zly2/JpA5vgl5fgj5/ki5nnPGZvESXKy414Ykyw2qG1bV1ORc5KkTJZeU6TPYwpu4AYXUUW2+YNrOXdotnD178kTR9/gRtZo+8mn1dnHQgdRGrI4TZHuGFsiqUylfq8UVG6POpRBNjsou9PhWHN06vd4A+X0Jegy+cklxowhPcExoiGB+R8f7oCOWVtSjVr75GJDkuS5nJrhKMn5fdE3fkCaZkx7P5q8zl3pRcaMJzB9OEExlu3HxPxoeT47t3KI7Zbg1gtgcJRIfpdkY5Y3TS0umS3RPdjCUzRNQxyYXW0unkbIdLViXWWOxBmePo8QqU5jPt5Javc2mhQG55jezSFWayK6RHp7E4gvS4YvS4ovS4Y5ILLTU6xWy2wNLKNfIr1/bWXqepuQUlkRzit2d/svVgmx+3d/jh4SN+fvyU2x9vyO45A0NkpsSPnZNcaLc/2uDxk1/4dnOLWx/e4d7mFs/++Iv4QAIlFImzvfOEz7+8x1ff3Ofu19+xef8h77x/C4sjjKVXvKB50mNzkgtNeN8/eMSdT76gcHWdjU/vsvPTUwLBCEp9QyOL+VUmpuaYmskyOT3PpWxevs1KXSM6/RtU6pokdnkj0YEUs/M5GZ/NLTMxPcfCUoFTdQ0oikYjPhyMyj9zjVaLRqNFq92FRsYo/43i4mIEivZRdBhFciwuLqG4pETOtXubiOSag0McSqjVFqEtOgTtPrQygdistLSU0tLnJBf6v5Icwt/a9iWeahVb6gAAAABJRU5ErkJggg=='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="Done Cancel Iphone" title="" src="/static/96396b74126092858b1a40b41eff5046/d99f2/Done-Cancel-Iphone.png" srcset="/static/96396b74126092858b1a40b41eff5046/c26ae/Done-Cancel-Iphone.png 158w, /static/96396b74126092858b1a40b41eff5046/6bdcf/Done-Cancel-Iphone.png 315w, /static/96396b74126092858b1a40b41eff5046/d99f2/Done-Cancel-Iphone.png 336w" sizes="(max-width: 336px) 100vw, 336px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </span></a></p> <p>Sample Usage:</p> <div class="gatsby-highlight" data-language="c"><pre style="counter-reset: linenumber NaN" class="language-c line-numbers"><code class="language-c"><span class="token comment">//In the view controller that's going ot use the component, put this in the header after the class being extended.</span> <span class="token operator">&lt;</span>DoneCancelNumberPadToolbarDelegate<span class="token operator">></span> <span class="token comment">// Then instantiate your toolbar component where it's needed</span> DoneCancelNumberPadToolbar <span class="token operator">*</span>toolbar <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">[</span>DoneCancelNumberPadToolbar alloc<span class="token punctuation">]</span> initWithTextField<span class="token operator">:</span>textField<span class="token punctuation">]</span><span class="token punctuation">;</span> toolbar<span class="token punctuation">.</span>delegate <span class="token operator">=</span> self<span class="token punctuation">;</span> textField<span class="token punctuation">.</span>inputAccessoryView <span class="token operator">=</span> toolbar<span class="token punctuation">;</span> <span class="token comment">// Finally, implement the following two delegate methods</span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">pragma</span> <span class="token expression">mark <span class="token operator">-</span> DoneCancelNumberpadToolbar delegate</span></span> <span class="token operator">-</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span>doneCancelNumberPadToolbarDelegate<span class="token operator">:</span><span class="token punctuation">(</span>DoneCancelNumberPadToolbar <span class="token operator">*</span><span class="token punctuation">)</span>controller didClickDone<span class="token operator">:</span><span class="token punctuation">(</span>UITextField <span class="token operator">*</span><span class="token punctuation">)</span>textField <span class="token punctuation">{</span> <span class="token function">NSLog</span><span class="token punctuation">(</span>@<span class="token operator">&amp;</span>quot<span class="token punctuation">;</span><span class="token operator">%</span>@<span class="token operator">&amp;</span>quot<span class="token punctuation">;</span><span class="token punctuation">,</span> textField<span class="token punctuation">.</span>text<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator">-</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span>doneCancelNumberPadToolbarDelegate<span class="token operator">:</span><span class="token punctuation">(</span>DoneCancelNumberPadToolbar <span class="token operator">*</span><span class="token punctuation">)</span>controller didClickCancel<span class="token operator">:</span><span class="token punctuation">(</span>UITextField <span class="token operator">*</span><span class="token punctuation">)</span>textField <span class="token punctuation">{</span> <span class="token function">NSLog</span><span class="token punctuation">(</span>@<span class="token operator">&amp;</span>quot<span class="token punctuation">;</span>Canceled<span class="token operator">:</span> <span class="token operator">%</span>@<span class="token operator">&amp;</span>quot<span class="token punctuation">;</span><span class="token punctuation">,</span> <span class="token punctuation">[</span>textField description<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>DoneCancelNumberPadToolbar.h</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">#import &lt;UIKit/UIKit.h> @class DoneCancelNumberPadToolbar; @protocol DoneCancelNumberPadToolbarDelegate &lt;NSObject> -(void)doneCancelNumberPadToolbarDelegate:(DoneCancelNumberPadToolbar *)controller didClickDone:(UITextField *)textField; -(void)doneCancelNumberPadToolbarDelegate:(DoneCancelNumberPadToolbar *)controller didClickCancel:(UITextField *)textField; @end @interface DoneCancelNumberPadToolbar : UIToolbar { UITextField* textField; }</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>DoneCancelNumberPadToolbar.m</p> <div class="gatsby-highlight" data-language="c"><pre style="counter-reset: linenumber NaN" class="language-c line-numbers"><code class="language-c"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">import</span> <span class="token expression"><span class="token operator">&amp;</span>quot<span class="token punctuation">;</span>DoneCancelNumberPadToolbar<span class="token punctuation">.</span>h<span class="token operator">&amp;</span>quot<span class="token punctuation">;</span></span></span> @implementation DoneCancelNumberPadToolbar @synthesize delegate<span class="token punctuation">;</span> <span class="token operator">-</span> <span class="token punctuation">(</span>id<span class="token punctuation">)</span> initWithTextField<span class="token operator">:</span><span class="token punctuation">(</span>UITextField <span class="token operator">*</span><span class="token punctuation">)</span>aTextField <span class="token punctuation">{</span> self <span class="token operator">=</span> <span class="token punctuation">[</span>super initWithFrame<span class="token operator">:</span><span class="token function">CGRectMake</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">320</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>self<span class="token punctuation">)</span> <span class="token punctuation">{</span> textField <span class="token operator">=</span> aTextField<span class="token punctuation">;</span> self<span class="token punctuation">.</span>barStyle <span class="token operator">=</span> UIBarStyleBlackTranslucent<span class="token punctuation">;</span> self<span class="token punctuation">.</span>items <span class="token operator">=</span> <span class="token punctuation">[</span>NSArray arrayWithObjects<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">[</span>UIBarButtonItem alloc<span class="token punctuation">]</span>initWithTitle<span class="token operator">:</span>@<span class="token operator">&amp;</span>quot<span class="token punctuation">;</span>Cancel<span class="token operator">&amp;</span>quot<span class="token punctuation">;</span> style<span class="token operator">:</span>UIBarButtonItemStyleBordered target<span class="token operator">:</span>self action<span class="token operator">:</span>@<span class="token function">selector</span><span class="token punctuation">(</span>cancelNumberPad<span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token punctuation">[</span>UIBarButtonItem alloc<span class="token punctuation">]</span>initWithBarButtonSystemItem<span class="token operator">:</span>UIBarButtonSystemItemFlexibleSpace target<span class="token operator">:</span>nil action<span class="token operator">:</span>nil<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token punctuation">[</span>UIBarButtonItem alloc<span class="token punctuation">]</span>initWithTitle<span class="token operator">:</span>@<span class="token operator">&amp;</span>quot<span class="token punctuation">;</span>Done<span class="token operator">&amp;</span>quot<span class="token punctuation">;</span> style<span class="token operator">:</span>UIBarButtonItemStyleDone target<span class="token operator">:</span>self action<span class="token operator">:</span>@<span class="token function">selector</span><span class="token punctuation">(</span>doneWithNumberPad<span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">,</span> nil<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">[</span>self sizeToFit<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> self<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator">-</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span>cancelNumberPad <span class="token punctuation">{</span> <span class="token punctuation">[</span>textField resignFirstResponder<span class="token punctuation">]</span><span class="token punctuation">;</span> textField<span class="token punctuation">.</span>text <span class="token operator">=</span> @<span class="token operator">&amp;</span>quot<span class="token punctuation">;</span><span class="token operator">&amp;</span>quot<span class="token punctuation">;</span><span class="token punctuation">;</span> <span class="token punctuation">[</span>self<span class="token punctuation">.</span>delegate doneCancelNumberPadToolbarDelegate<span class="token operator">:</span>self didClickCancel<span class="token operator">:</span>textField<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator">-</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span>doneWithNumberPad <span class="token punctuation">{</span> <span class="token punctuation">[</span>textField resignFirstResponder<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">[</span>self<span class="token punctuation">.</span>delegate doneCancelNumberPadToolbarDelegate<span class="token operator">:</span>self didClickDone<span class="token operator">:</span>textField<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> @end @<span class="token function">property</span> <span class="token punctuation">(</span>nonatomic<span class="token punctuation">,</span> weak<span class="token punctuation">)</span> id <span class="token operator">&lt;</span>DoneCancelNumberPadToolbarDelegate<span class="token operator">></span> delegate<span class="token punctuation">;</span> <span class="token operator">-</span> <span class="token punctuation">(</span>id<span class="token punctuation">)</span> initWithTextField<span class="token operator">:</span><span class="token punctuation">(</span>UITextField <span class="token operator">*</span><span class="token punctuation">)</span>textField<span class="token punctuation">;</span> @end</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Special thanks to [akozl ik](<a href="http://www.reddit.com/r/iOSProgramming/comments/ydrzv/adding_done_and_canc">http://www.reddit.com/r/iOSProgramming/comments/ydrzv/adding_done_and_canc</a> el_buttons_to_an_ios_number/c5v4rpt) for the help with delegates.</p><![CDATA[Improve your Magento workflow: Use git or mercurial]]>https://www.timbroder.com/2012/07/improve-your-magento-workflow-use-git-or-mercurialhttps://www.timbroder.com/2012/07/improve-your-magento-workflow-use-git-or-mercurialTue, 31 Jul 2012 13:18:07 GMT<p>Most of our new projects at work are on mercurial and I've moved most of my personal projects over to git.  We do, unfortunately, still have one Magento install that lives in our old subversion repository.  If you've ever tried to work with a project the size of Magento in SVN with branching, you know the kind of pain this can cause. My machine at work is no slouch. An i7, 8 gigs of ram, 256 megs graphics card, and an SSD. Perfect for any number of high performance or <a href="http://sv.partypoker.com/">online games</a>, compiling, or video editing. Yet, switching branches on the mercurial project brings it to its knees.  It's honestly better to go shoot a quick game of pool while its switching rather then try to get anything done.  Eventually... we'll get it into mercurial. Anyway, to migrate a project from svn to git, use the following command: [code]git svn clone <a href="http://svn/repo/here/trunk%5B/code%5D">http://svn/repo/here/trunk[/code]</a> To migrate a project from svn to hg, use the following command:</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">hg convert http://svn/repo/here/trunk``` Branching is now much, much easier and if that isn't enough for you to switch here are a few more reasons: * git is much easier to use than when it first came out * merging is exponentially smoother than SVN * distributed: you can branch, merge, commit, revert all locally without effecting your team until you push. All this happens locally = faster * you can work offline * can centralize only if you want to * branching takes on a whole new level. Create custom workflows base on release, or bug, or whatever you want * merging is exponentially smoother than SVN (yes, I listed this twice) * visual branch diagrams</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[iOS Game Engines]]>https://www.timbroder.com/2012/07/ios-game-engineshttps://www.timbroder.com/2012/07/ios-game-enginesMon, 30 Jul 2012 20:06:21 GMT<p>After playing Rovio's new <a href="http://teaser.amazingalex.com/">Amazing Alex</a> game for a while, and seeing <a href="http://www.bgr.com/2012/07/30/amazing-alex-sales-app-store/">this article</a> on BGR this morning, it made me remember some old success stories that I had read about, and I got to thinking about what it would take to develop a <a href="http://sv.partypoker.com/">game</a> for iOS. More just to see what options were out there than anything else; I know nothing about game programming. Side note: Amazing Alex is great. If you have ever played the incredible machine, you'll feel right at home.</p> <p>One success story I remember is Ethan Nicholas and iShoot, which made him over $800k. Check out how he did it, and how to get started with iOS here: <a href="http://www.lookingforiphone.com/2012/05/17/iphone-developer-in-eight-easy-steps/">iPhone developer in eight easy steps</a>. If he can do it... why not? But, I digress. ManiacDev has great lists of both <a href="http://maniacdev.com/2009/08/the-open-source-iphone-game-engine-comparison/">Open Source</a> and <a href="http://maniacdev.com/2009/09/the-commercial-iphone-game-engine-comparison-3d-and-2d/">Commercial </a>graphic engines for iOS. As far as free goes, <a href="http://www.cocos2d-iphone.org/">cocos2d</a> and <a href="http://gamua.com/sparrow/">sparrow</a> both jumped out at me. Sparrow seemed like the fastest ramp-up time and after a quick look at it's <a href="http://wiki.sparrow-framework.org/manual/display_objects">api</a>, felt familiar. Without diving too much into the examples, it seems to follow similar patterns to some of the python/js UI frameworks I've used. Unfortunately, the <a href="http://forum.sparrow-framework.org/">forum</a> seems pretty sparse. Cocos2d, while looking like a steeper learning curve, seems a little more mature and a much more engaged community. It's forum has 85% more posts than sparrow, which coming from a busy php/python community, I like to see. As for commercial engines, after reading about how Infinity Blade was Epic's most <a href="http://www.geek.com/articles/mobile/infinity-blade-is-epics-most-profitable-game-20120627/">profitable game ever</a>, and seeing that a license would only be $99, the <a href="http://www.udk.com/">Unreal Development Kit For iOS</a> is totally the way I would go.</p> <p>[sponsored post]</p><![CDATA[Refreshing all the css on a page using jQuery]]>https://www.timbroder.com/2012/07/refreshing-all-the-css-on-a-page-using-jqueryhttps://www.timbroder.com/2012/07/refreshing-all-the-css-on-a-page-using-jqueryMon, 16 Jul 2012 19:16:03 GMT<p>I have a client project where we let them customize some css attributes in the admin, show them the updates in a small preview area, then save the changes back to the server. The custom css attributes are in a small css file that is generated on pageload and then cached to the server. All of the admin functionality is done through ajax, so I wanted a good way to update the UI of the site without having to do a full pageload. The below function was a great help.</p> <div class="gatsby-highlight" data-language="javascript"><pre style="counter-reset: linenumber NaN" class="language-javascript line-numbers"><code class="language-javascript"><span class="token keyword">function</span> <span class="token function">reloadStylesheets</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> queryString <span class="token operator">=</span> <span class="token string">'?reload='</span> <span class="token operator">+</span> <span class="token keyword">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'link[rel=&amp;quot;stylesheet&amp;quot;]'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">each</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>href <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>href<span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">\?.*|$</span><span class="token regex-delimiter">/</span></span><span class="token punctuation">,</span> queryString<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[Important Magento Security Update – Zend Platform Vulnerability]]>https://www.timbroder.com/2012/07/important-magento-security-update-zend-platform-vulnerabilityhttps://www.timbroder.com/2012/07/important-magento-security-update-zend-platform-vulnerabilityFri, 06 Jul 2012 18:47:04 GMT<p>While doing routine sanity checks, on of our QA Engineers, Sammy Shaar, was alerted about an important Magento <a href="http://by.ai/MnzJ">security update</a>. The vulnerability potentially allows an attacker to read any file on the web server where the <a href="http://by.ai/rk3s">Zend XMLRPC</a> functionality is enabled. This might include password files, configuration files, and possibly even databases if they are stored on the same machine as the Magento web server. To see if you site has been affected, please see <a href="http://by.ai/CpYr">this page</a>. Luckily, Magento has released patches for all supported versions:</p> <ul> <li>Magento Enterprise Edition and Professional Edition merchants: You may access the Zend Security Upgrade patch from Patches &#x26; Support for your product in the Downloads section of your Magento account. Account log-in is required.<a href="http://www.magentocommerce.com/products/customer/account/" title="Download"> Download</a></li> <li>Magento Community Edition merchants:<a href="http://www.magentocommerce.com/downloads/assets/1.7.0.2/CE_1.4.0.0-1.4.1.1.patch" title="Community Edition 1.4.0.0 through 1.4.1.1"> Community Edition 1.4.0.0 through 1.4.1.1</a><a href="http://www.magentocommerce.com/downloads/assets/1.7.0.2/CE_1.4.2.0.patch" title="Community Edition 1.4.2.0"> Community Edition 1.4.2.0</a><a href="http://www.magentocommerce.com/downloads/assets/1.7.0.2/CE_1.5.0.0-1.7.0.1.patch" title="Community Edition 1.5.0.0 through 1.7.0.1"> Community Edition 1.5.0.0 through 1.7.0.1</a></li> </ul> <p>To install the patch, place the patch file in the root of your Magento site and run the following command: patch -p0 &#x3C; zendxml_fix.patch If you don't have ssh access or patch installed on your machine, please see this stack overflow <a href="http://by.ai/1LtK">post </a>for alternative methods.</p><![CDATA[Setting up Office 365 email on Android]]>https://www.timbroder.com/2012/05/setting-office-365-email-androidhttps://www.timbroder.com/2012/05/setting-office-365-email-androidFri, 25 May 2012 16:42:48 GMT<p><a href="/images/2012/05/Screenshot_2012-05-24-14-05-231.png">![](/images/2012/05/Screenshot_2012-05-24-14- 05-231.png)</a></p><![CDATA[Making virtualenv on windows with powershell a little cleaner]]>https://www.timbroder.com/2012/05/making-virtualenv-on-windows-with-powershell-a-little-cleanerhttps://www.timbroder.com/2012/05/making-virtualenv-on-windows-with-powershell-a-little-cleanerTue, 22 May 2012 15:27:45 GMT<p>While I code on a mac at home, I can't live without my giant dual screens and solid state drive at work so I'm on a windows 7 box.  Most of the time it's fine, does everything I need, and I'm happy.  I became full of rage for the first time last week trying to properly get virtualenv to play nice with powershell.  (If you code on windows and are in the terminal a lot, switch to powershell, its great and comes with windows 7. There is a download for Windows XP) I'm not going to recap how to set up virtualenv for your project as there is a great walk through on that <a href="http://www.saltycrane.com/blog/2009/05/notes-using-pip-and-virtualenv-django/">here</a>.  The issue on windows is around when you want to activate your project.  Powershell has a restricted execution policy turned on by default. The manual way around this is to run powershell as an administrator, and run this: [code] Set-ExecutionPolicy Unrestricted [/code] Works, but that's an extra click.  You can also change this value permanently in the registry at the key listed below, but that didn't seem to stick when opening powershell through <a href="http://www.launchy.net/">launchy</a> [code] HKLM\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell [/code] Enter my hacked up solution. Create a shortcut for powershell with these parameters:</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">Target: %SystemRoot%\syswow64\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Unrestricted Start In: %HOMEDRIVE%%HOMEPATH% </code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span></span></pre></div> <p>Then, if your workspace and projects are set up relatively the same, you can create a powershell script (or a cmd script if not using powershell), named workon.ps1 that looks something like this:</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">$ENV:PYTHONPATH="" cd C:\Users\tbroder\workspace\$args\ .\myenv\Scripts\activate</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span></span></pre></div> <p>I threw this in my C:\Python26\Scripts folder.  It assumes your project lives in a workspace folder, that your project name is a single word, and that all of your virtualenvs are called myenv.  Example of using it below:</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">Windows PowerShell Copyright (C) 2009 Microsoft Corporation. All rights reserved. PS C:\Users\tbroder&amp;gt; workon gsb (myenv) PS C:\Users\tbroder\workspace\gsb&amp;gt;</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span></span></pre></div><![CDATA[Developing with multiple versions of Django on windows]]>https://www.timbroder.com/2012/04/developing-with-multiple-versions-of-django-on-windowshttps://www.timbroder.com/2012/04/developing-with-multiple-versions-of-django-on-windowsThu, 19 Apr 2012 16:47:46 GMT<p>At <a href="https://www.alexanderinteractive.com/">work</a>, we have sites that use various versions of <a href="https://www.djangoproject.com/">Django</a>, so there is a need to switch packages.  On my mac I use <a href="http://www.virtualenv.org/en/latest/index.html">virtualenv</a> to handle this, but I've never quite gotten it to play nice with windows, and just switching Django versions has sufficed so far. If you can set up virtualenv, that's a much better solution</p> <ol> <li>Download <a href="http://technet.microsoft.com/en-us/sysinternals/bb896768">junction</a> (think symbolic links for windows). Put the executable somewhere in your path. I put it in my Python scripts folder <code class="language-text">(C:\Python26\Scripts)</code></li> <li>Plan out your directory structure: Make sure you don't have any stock django eggs or folders in your site-packages folder</li> <li>Create a django_veresions folder in site-packages <code class="language-text">(C:\Python26\Lib\site-packages\django_versions)</code></li> <li>In this folder I put my different django installs</li> </ol> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">``` C:\Python26\Lib\site-packages\django_versions\1.1\django C:\Python26\Lib\site-packages\django_versions\1.3\django C:\Python26\Lib\site-packages\django_versions\1.4\django ```</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span></span></pre></div> <ol start="5"> <li>I also put a txt file inside the django folder to easily see what version is there (this will be helpful later to double check)</li> </ol> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">```C:\Python26\Lib\site-packages\django_versions\1.4\django\1.4.txt</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <ol start="6"> <li>Create a file called djangoversion.cmd and drop it in C:\Python26\Scripts ```junction -d C:\Python26\Lib\site-packages\django junction</li> </ol> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">C:\Python26\Lib\site-packages\django C:\Python26\Lib\site-packages\django_versions\%1\django ```</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span></span></pre></div> <ol start="7"> <li>The first line removes any links that may have been there. The second line creates a new link to the version you'll pass in.</li> <li>Now, to switch versions, just run this from the command line:</li> </ol> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">``` djangoversion 1.4 PS C:\Users\tbroder> djangoversion 1.4 C:\Users\tbroder>junction -d C:\Python26\Lib\site-packages\django Junction v1.06 - Windows junction creator and reparse point viewer Copyright (C) 2000-2010 Mark Russinovich Sysinternals - www.sysinternals.com Deleted C:\Python26\Lib\site-packages\django. C:\Users\tbroder>junction C:\Python26\Lib\site-packages\django C:\Python26\Lib\site-packages\django_versions\1.4\django Junction v1.06 - Windows junction creator and reparse point viewer Copyright (C) 2000-2010 Mark Russinovich Sysinternals - www.sysinternals.com Created: C:\Python26\Lib\site-packages\django Targetted at: C:\Python26\Lib\site-packages\django_versions\1.4\django PS C:\Users\tbroder> ```</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <ol start="9"> <li>Switch as needed</li> </ol><![CDATA[Sync side-loaded content between your Kindle and other devices]]>https://www.timbroder.com/2012/04/sync-side-loaded-content-between-your-kindle-and-other-deviceshttps://www.timbroder.com/2012/04/sync-side-loaded-content-between-your-kindle-and-other-devicesMon, 16 Apr 2012 17:35:23 GMT<p>I read a lot of books on my kindle that I got from other sources, mostly <a href="http://www.manning.com/catalog/mobile/">Manning</a> and <a href="http://shop.oreilly.com/category/ebooks.do">O'Rielly</a>, but these won't sync between my phone and my kindle.  Only books purchased from Amazon will sync between devices. [Again](<a href="http://timbroder.com/2011/01/getting-it-onto-the-">http://timbroder.com/2011/01/getting-it-onto-the-</a> kindle.html), Calibre to the rescue. For this to work, the book must already exist on the kindle and be sold through Amazon.  The example book I'm going to use is <a href="http://shop.oreilly.com/product/9780596520137.do">Version Control with Git</a>.</p> <ol> <li>Add the book to your Calibre library</li> <li>Update any needed metadata.</li> <li>Jump over to Amazon and open the <a href="http://www.amazon.com/Version-Control-Git-collaborative-ebook/dp/B002L4EXHO/ref=tmm_kin_title_0?ie=UTF8&#x26;m=AG56TWVU5XWC2&#x26;qid=1334596465&#x26;sr=1-1">book's page</a></li> <li>Make sure you are on the Kindle edition of the book.  If there is no kindle edition, this will not work.</li> <li>Make note of the ASIN code. <img src="https://farm8.staticflickr.com/7249/7084540211_05042bf0fc_o.png" alt=""></li> <li>Take this code and use it as the ISBN number in Calibre (it will not like this, that's ok) <img src="https://farm8.staticflickr.com/7233/7084540251_5ce233f54c_o.png" alt=""></li> <li>Convert the book to .mobi (Even if it is already in .mobi format, you have to do this)</li> <li>Copy the book to your kindle via USB. Either by dragging it in your file manager or through Calibre. Do not use email, wifi, or 3g to do this, it will remove the ASIN code that we just wrapped onto the document. Once it is on the device syncing over wifi/3g will function as normal)</li> <li>Using USB, copy the file to your device. For android this is the kindle folder on your SD card. I haven't tested but doing through iTunes is supposed to work for an iphone/ipad.</li> </ol> <p>Enjoy!</p><![CDATA[Where the new Ice Cream Sandwich build of dropbox stores files]]> download a file.  This has been replaced by "favorite". Instead of going…]]>https://www.timbroder.com/2011/12/where-the-new-ice-cream-sandwich-build-of-dropbox-stores-fileshttps://www.timbroder.com/2011/12/where-the-new-ice-cream-sandwich-build-of-dropbox-stores-filesSat, 24 Dec 2011 16:21:12 GMT<p>In the old version of dropbox, you used to be able to long press > download a file.  This has been replaced by "favorite". Instead of going to: <code class="language-text">/sdcard/dropbox</code> These files are now stored in: <code class="language-text">/sdcard/Android/data/com.dropbox.android/files/scratch</code></p><![CDATA[What do you listen to? (podcast edition)]]>https://www.timbroder.com/2011/10/what-do-you-listen-to-podcast-editionhttps://www.timbroder.com/2011/10/what-do-you-listen-to-podcast-editionFri, 21 Oct 2011 16:25:07 GMT<p>I tend to listen to a decent number of podcasts. Usually while doing the dishes, running, or something or other in the park.  Some are book/comic related and help me keep up to date with what's coming out and how some books were that I didn't have time to read.  Others are tech and help me get other opinions on the new libraries or trends.  I've found a number of fun libraries /how-tos from listening. Check them out below, what do you listen to? Tech</p> <ul> <li>Sitepoint - Web Dev news, tutorials, interviews <a href="http://www.sitepoint.com/"> http://www.sitepoint.com/</a></li> <li>Official jQuery podcast* - Javascript library <a href="http://podcast.jquery.com/">http://podcast.jquery.com/</a></li> <li>yayQuery* - Front End Dev podcast <a href="http://yayquery.com/"> http://yayquery.com/</a></li> <li>djangodose* - Had great news about jquery, but I think its dead <a href="http://djangodose.com/">http://djangodose.com/</a></li> <li>techzinglive - Random tech/hacker news <a href="http://techzinglive.com/">http://techzinglive.com/</a></li> <li>The Dev Show - Ruby,Php, Java, Javascript <a href="http://5by5.tv/devshow">http://5by5.tv/devshow</a></li> <li>The changelog - Open source news <a href="http://thechangelog.com/"> http://thechangelog.com/</a></li> <li>ATX Web Show - web stuff <a href="http://atxwebshow.com/">http://atxwebshow.com/</a></li> <li>The javascript show* - great js news and library coverage <a href="http://javascriptshow.com/">http://javascriptshow.com/</a></li> </ul> <p>Non Tech</p> <ul> <li>iFanboy* - Comic book news and reviews <a href="http://javascriptshow.com/">http://ifanboy.com/</a></li> <li>Sword and Laser* - Science Fiction and Fantasy book club <a href="http://www.swordandlaser.com/">http://www.swordandlaser.com/</a></li> <li>11 O'Clock Comics - Comic news and culture <a href="http://bullpenbulletinspodcast.com/">http://bullpenbulletinspodcast.com/</a></li> <li>Word Balloon - Comic creator interviews <a href="http://wordballoon.com/"> http://wordballoon.com/</a></li> <li>Fuzzy Typewriter - Random media / culture <a href="http://fuzzytypewriter.wordpress.com/"> http://fuzzytypewriter.wordpress.com/</a></li> </ul> <p>** I listen to every episode, others I cherry-pick</p><![CDATA[Creating a stateless request in Magento]]>https://www.timbroder.com/2011/10/1060https://www.timbroder.com/2011/10/1060Mon, 17 Oct 2011 16:22:06 GMT<p>Have you ever wanted to create a stateless request in Magento? Something that doesn't touch any of Magento's sessions?  We were having issues with some of the ajax calls on our cart and checkout pages mucking with the user's cart and had get stateless on these calls.  The issue we were having was our checkout page was loading, then a javascript include was going out and bringing code from a 3rd party relevance engine into our dom, which was in turn calling back an ajax request to our servers.  This issue with this being that at the start of the page load, the checkout session was being set to a certain state.  This state was then being sent through the rest of the page load, and the ajax calls. Unfortunately, by the time the ajax call got back to our server, the session was different in both locations, creating a race condition.  The ajax request usually won, removing the work the full page load had done with trying to process checkout.  The good news was there was nothing in the ajax call that needed to touch the session, it was just some data lookup. So, nix the session part of that call, and our troubles should be over... Magento's api controller is the only place that implements a stateless request this but its fairly easy to do (after a bit of digging).</p> <p>As long as Mage_Core_Controller_Varien_Action is a parent in your controller's hierchy, you are good to go (it probably is).  This class has a const FLAG_NO_START_SESSION which looks promising. Digging into the code a little we see that it controls whether cookies are processed or the session is started:</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token php language-php"><span class="token delimiter important">&lt;?php</span> <span class="token operator">...</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token function">getFlag</span><span class="token punctuation">(</span><span class="token string single-quoted-string">''</span><span class="token punctuation">,</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token constant">FLAG_NO_START_SESSION</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$checkCookie</span> <span class="token operator">=</span> <span class="token function">in_array</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token function">getRequest</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">getActionName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_cookieCheckActions</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$checkCookie</span> <span class="token operator">=</span> <span class="token variable">$checkCookie</span> <span class="token operator">&amp;</span>amp<span class="token punctuation">;</span><span class="token operator">&amp;</span>amp<span class="token punctuation">;</span> <span class="token operator">!</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token function">getRequest</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">getParam</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'nocookie'</span><span class="token punctuation">,</span> <span class="token constant boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$cookies</span> <span class="token operator">=</span> <span class="token class-name static-context">Mage</span><span class="token operator">::</span><span class="token function">getSingleton</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'core/cookie'</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$checkCookie</span> <span class="token operator">&amp;</span>amp<span class="token punctuation">;</span><span class="token operator">&amp;</span>amp<span class="token punctuation">;</span> <span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$cookies</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">setFlag</span><span class="token punctuation">(</span><span class="token string single-quoted-string">''</span><span class="token punctuation">,</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token constant">FLAG_NO_COOKIES_REDIRECT</span><span class="token punctuation">,</span> <span class="token constant boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token class-name static-context">Mage</span><span class="token operator">::</span><span class="token function">getSingleton</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'core/session'</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'name'</span> <span class="token operator">=></span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_sessionNamespace</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>By adding to the preDispatch() method of our Action or Controller we can toggle this:</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token php language-php"><span class="token delimiter important">&lt;?php</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">Ai_AjaxCatalog_Controller_Action</span> <span class="token keyword">extends</span> <span class="token class-name">Mage_Core_Controller_Front_Action</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">preDispatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">setFlag</span><span class="token punctuation">(</span><span class="token string single-quoted-string">''</span><span class="token punctuation">,</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token constant">FLAG_NO_START_SESSION</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Do not start standard session</span> <span class="token keyword static-context">parent</span><span class="token operator">::</span><span class="token function">preDispatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Now, any action in this controller will be stateless and not effect any sessions.</p><![CDATA[Jira Tabs: Open all those Jira's at once! ]]>https://www.timbroder.com/2011/04/jira-tabs-open-all-those-jiras-at-oncehttps://www.timbroder.com/2011/04/jira-tabs-open-all-those-jiras-at-onceFri, 22 Apr 2011 18:21:22 GMT<p>Update: Code lives on <a href="https://github.com/broderboy/jira-tabs" title="GitHub">GitHub</a></p> <p>Ever want to open all the Jira’s on the screen in new tabs? Jess does, I do, and you should too! For firefox and chrome we now have the JiraTabs bookmark button. Go to <a href="http://broderboy.github.io/jira-tabs/" title="this page">this page</a> and drag the link up to your bookmarks bar. Then, whenever you are on a filter or search view of Jira's, click the button and all the jira's on your screen will open up in new tabs</p> <p>Demo:</p> <p><a href="http://www.youtube.com/watch?v=PltTkfuhKfM"><img src="https://img.youtube.com/vi/PltTkfuhKfM/0.jpg" alt=""></a></p><![CDATA[Google’s Groupon Competitor Goes Live]]>https://www.timbroder.com/2011/04/groupon-competitor-goes-livehttps://www.timbroder.com/2011/04/groupon-competitor-goes-liveThu, 21 Apr 2011 21:43:56 GMT<p><a href="http://bit.ly/eFvNwn">http://bit.ly/eFvNwn</a></p><![CDATA[Skynet Becomes Self Aware Tonight]]>https://www.timbroder.com/2011/04/skynethttps://www.timbroder.com/2011/04/skynetTue, 19 Apr 2011 21:25:05 GMT<h2>Terminator: The Sarah Connor Chronicles [![Edit Terminator: The Sarah Connor</h2> <p>Chronicles section](<a href="http://images1.wikia.nocookie.net/__cb35594/common/skins/common/blank.gif)%5D(http://terminator.wikia.com/index.php?title=2011/04/21&#x26;action=edit&#x26;section=1)">http://images1.wikia.nocookie.net/__cb35594/common/skins/common/blank.gif)](http://terminator.wikia.com/index.php?title=2011/04/21&#x26;action=edit&#x26;section=1)</a></p> <ul> <li> <p><strong>April 21, <a href="http://terminator.wikia.com/wiki/2011" title="2011">2011</a></strong>. <a href="http://terminator.wikia.com/wiki/Judgment_Day" title="Judgment Day">Judgment Day</a>. <a href="http://terminator.wikia.com/wiki/Kyle_Reese" title="Kyle Reese">Kyle Reese</a> and <a href="http://terminator.wikia.com/wiki/Derek_Reese" title="Derek Reese">Derek Reese</a> witness the launch of U.S. missiles while playing ball in their yard.<a href="http://terminator.wikia.com/wiki/2011/04/21#cite_note-0">[1]</a></p> <p>As a result of temporal interference by <a href="http://terminator.wikia.com/wiki/Sarah_Connor" title="Sarah Connor">Sarah Connor</a>, her son <a href="http://terminator.wikia.com/wiki/John_Connor" title="John Connor">John</a>, <a href="http://terminator.wikia.com/wiki/Miles_Dyson" title="Miles Dyson">Miles Dyson</a>, and the <a href="http://terminator.wikia.com/wiki/T-800_%28Terminator_2%29" title="T-800 (Terminator 2)">T-800</a><a href="http://terminator.wikia.com/wiki/2011/04/21#cite_note-1">[2]</a> destroying<a href="http://terminator.wikia.com/wiki/Cyberdyne" title="Cyberdyne">Cyberdyne</a> headquarters and all backups of the research in <a href="http://terminator.wikia.com/wiki/1995" title="1995">1995</a>, the date for Judgment day is moved back to here.<a href="http://terminator.wikia.com/wiki/2011/04/21#cite_note-2">[3]</a> Skynet is destined to go online a few days earlier on <strong><a href="http://terminator.wikia.com/wiki/2011/04/19" title="2011/04/19">April 19</a>, <a href="http://terminator.wikia.com/wiki/2011" title="2011">2011</a></strong> at <strong>20:11</strong></p> </li> </ul><![CDATA[Extending a Magento Controller]]>https://www.timbroder.com/2011/04/extending-a-magento-controllerhttps://www.timbroder.com/2011/04/extending-a-magento-controllerTue, 19 Apr 2011 21:16:46 GMT<p>We're ajaxing part of the Magento shopping cart so we need to modify/extend some of the cart controller functionality.  Sometimes when modifying controller's you have to worry about updating the routes. For this, we don't need to, we still want all the urls to be used the same way.</p> <p>app/code/local/Ai/Checkout/etc/config.xml:</p> <div class="gatsby-highlight" data-language="xml"><pre style="counter-reset: linenumber NaN" class="language-xml line-numbers"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>config</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>modules</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Ai_Checkout</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>version</span><span class="token punctuation">></span></span>0.0.1<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>version</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Ai_Checkout</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>modules</span><span class="token punctuation">></span></span> ... <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>frontend</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>routers</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>checkout</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>use</span><span class="token punctuation">></span></span>standard<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>use</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>args</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>module</span><span class="token punctuation">></span></span>Ai_Checkout<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>module</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>frontName</span><span class="token punctuation">></span></span>checkout<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>frontName</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>args</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>checkout</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>routers</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>frontend</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>config</span><span class="token punctuation">></span></span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>app/code/local/Ai/Checkout/controllers/CartController.php:</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token keyword">require_once</span> <span class="token class-name static-context">Mage</span><span class="token operator">::</span><span class="token function">getModuleDir</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'controllers'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'Mage_Checkout'</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token constant">DS</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'CartController.php'</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">Ai_Checkout_CartController</span> <span class="token keyword">extends</span> <span class="token class-name">Mage_Checkout_CartController</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">updatePostAction</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name static-context">Mage</span><span class="token operator">::</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>quot<span class="token punctuation">;</span><span class="token keyword">NEW</span> <span class="token class-name">CONTROLLER</span><span class="token operator">&amp;</span>quot<span class="token punctuation">;</span><span class="token punctuation">,</span> <span class="token constant">null</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'tim.log'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token punctuation">[</span><span class="token operator">/</span>php<span class="token punctuation">]</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[Moving Gmail Gadgets to the Right Side]]>https://www.timbroder.com/2011/04/moving-gmail-gadgets-to-the-right-sidehttps://www.timbroder.com/2011/04/moving-gmail-gadgets-to-the-right-sideThu, 07 Apr 2011 14:56:39 GMT<p>I started using Remember the Milk recently but didn't want the <a href="http://www.rememberthemilk.com/services/gmail/gadget/">gmail gadget</a> to be so far down on the left hand side of my screen.  There is no built in way to move gadgets to the right hand side with the exception of chat (labels used to do this but was removed in favor of drag in drop back in late 2009). <a href="/images/2011/04/gmail_right_widgets.png"><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <span class="gatsby-resp-image-background-image" style="padding-bottom: 88.60759493670886%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAIAAADUsmlHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC10lEQVR42pWT2Y/kNBDG8/+/8cJySQghEM888IDEHrAzbDfTPQPTx3TnvhPbcezEV2wnQenWLMvyxE+fpU9Vqiq7JDtnLw3TsgCkBBRiVqNFCHNCRyFmwa3gllJTAQUbA9BQQRoXpIR9jagTBOGrdz+s71aUUmPkoJkxgkn4lPy0C398u/3m9uHb3//87s366183X/52930NqtGacTRaD87Bvzknb0v8UOD7IP/Di7dueH/wbl6uP3u5evHm7vPXmxe3f316u/vq5vDJ6vQFatOirGlHpRIOABBCNI6zUPjJXwWBe3YPQfQUBEGaJFEYZnkIGr9ufESCqt3XKEAIowYyzpwgvz34r5J6VbQr0meD1koJNUip+MdaDnLD48mPozwvYe242S9efhOA1xH6GeKEkK5pmrZt8QVCaNPgtm0JwbjFlNUVjLPqKWu2Gbx3yhIFYWHtpC1r2qzvGKGkox1pCaW06zpCSNf1hF6LAUBZVp0yuEnh1kEIQYTmaZaatH2ulJKSS8mVEotRQiohBL8El2ufw9PuGKUVJFw4EDVRlGDcMQlP4TvPP53d/dnbu97R84+uf/SCx6R4SIt9Bh5StE4KL0rSqHwCJHPqGkRxyrniEsflNsoe3XATJNuTv/aT7Tm4C9JNjpYX1nRX00dt2TzP4yit5U5RlKeT23W9GiQXvdJDzxntu0Wsr0GZ5WlZlXVdMc6EFIOejJ2nadZmdvK8TJJsnmdjNWdcSk0oazDFbY/xZUvLslsAUN9zxhjpRy4nYydMJ6eqQNO0xlith77rQF2XRZmmeZKkSZLG8bOSLM8LSrv5A5yirM5nnxDKpRjH6WOeI+OFeZ6n58ppmpfJcZxaa+1opmm6Jhfzb66Ra6N/JlNCawCUUuN46fB/cIoqazCyo+55Z4x+j3nmvdcfYK01xjj7w2F3OBDaLr9MSq21EGIYBqXU8B+stdeUEEJK+Te35ucL83hCjAAAAABJRU5ErkJggg=='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="gmail right widgets" title="" src="/static/54caa1ea89ea0ba16a777352c63fae18/f058b/gmail_right_widgets.png" srcset="/static/54caa1ea89ea0ba16a777352c63fae18/c26ae/gmail_right_widgets.png 158w, /static/54caa1ea89ea0ba16a777352c63fae18/6bdcf/gmail_right_widgets.png 315w, /static/54caa1ea89ea0ba16a777352c63fae18/f058b/gmail_right_widgets.png 630w, /static/54caa1ea89ea0ba16a777352c63fae18/77800/gmail_right_widgets.png 855w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </span></a> If you don't have anything in the right hand column, <em>enable Right-Side Chat</em> from Gmail Labs.  We are going to add in some custom css to gmail so install either [Stylist ](https:// chrome.google.com/extensions/detail/pabfempgigicdjjlccdgnbmeggkbjdhd)for Chrome or <a href="https://addons.mozilla.org/en-US/firefox/addon/stylish/">Stylish</a> for Firefox. Add the following style:</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">div.TZ:nth-child(8) { position:absolute !important; right:0px; top:165px; width:164px; }</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>In chrome you can also restrict the domain to mail.google.com. For me, the Remember the Milk gadget was the 8th child. Play with this until it looks right for you. You may also have to play with the "top" element depending on how much room your chat gadget takes up</p><![CDATA[New Digg reverse paywall coming]]>https://www.timbroder.com/2011/04/new-digg-reverse-paywall-cominghttps://www.timbroder.com/2011/04/new-digg-reverse-paywall-comingWed, 06 Apr 2011 13:45:21 GMT<p>Interesting: <a href="http://about.digg.com/blog/cha-ching">http://about.digg.com/blog/cha-ching</a></p> <blockquote> <p>_Welcome to the future of killing time on the internet, and getting paid for</p> </blockquote> <p>it: Digg is implementing a reverse pay wall! We believe this will greatly enhance the Digg experience. Early reaction from test users has been great. Can Duruk, developer at Digg, sums it up well:_ <em>"I thought Rebecca Black's 'Friday' video was great now that I got paid to watch it!"</em></p> <p>Now, I used to be on Digg for at least an hour a day. then v4 came... and it kind of sucks now..... Losing nested categories was a huge loss for me.</p> <p>(9:39:48 AM) Tim: i would totally go back to digg to get paid <a href="http://about.digg.com/blog/cha-ching">http://about.digg.com/blog/cha-ching</a></p> <p>(9:40:46 AM) Laura: Hmm</p> <p>(9:41:00 AM) Laura: Digg is so horrible, that's a little like being ok with becoming a prostitute</p> <p>(9:41:03 AM) Laura: I mean, you get paid</p> <p><a href="http://about.digg.com/blog/cha-ching" title="http://about.digg.com/blog/cha-ching">http://about.digg.com/blog/cha-ching</a></p><![CDATA[42.75" New Box Jump PR]]>https://www.timbroder.com/2011/04/42-75-new-box-jump-prhttps://www.timbroder.com/2011/04/42-75-new-box-jump-prTue, 05 Apr 2011 13:24:33 GMT<p><a href="https://www.facebook.com/timbroder/videos/679430254336/?l=2066031206978693743" title="video">video</a></p><![CDATA[Firefox 4 landing]]>https://www.timbroder.com/2011/03/firefox-4-landinghttps://www.timbroder.com/2011/03/firefox-4-landingMon, 21 Mar 2011 20:01:55 GMT<p><img src="https://content.screencast.com/users/broderboy/folders/Jing/media/f18ea796-51be-45a3-b4f7-58a8b1104c99/2011-03-21_1559.png" alt=""> It will be updating on your current installs tomorrow.</p> <p>To download now: <a href="http://fileforum.betanews.com/detail/Mozilla-Firefox-v4-for-Windows/1032985422/16">Windows</a>, <a href="http://fileforum.betanews.com/detail/Mozilla-Firefox-v4-for-Mac-OS-X/1032985422/17">Mac</a>, and <a href="http://fileforum.betanews.com/detail/Mozilla-Firefox-v4-for-Linux/1032985422/18">Linux</a></p><![CDATA[Setting a project as the default redmine homepage]]>https://www.timbroder.com/2011/03/setting-a-project-as-the-default-redmine-homepagehttps://www.timbroder.com/2011/03/setting-a-project-as-the-default-redmine-homepageTue, 15 Mar 2011 23:31:01 GMT<p>Only have a single project running on <a href="http://www.redmine.org/">redmine</a>? want it to be the homepage?</p> <p>In <code class="language-text">config/routes.rb in cofig/routes.rb</code></p> <div class="gatsby-highlight" data-language="ruby"><pre style="counter-reset: linenumber NaN" class="language-ruby line-numbers"><code class="language-ruby">map<span class="token punctuation">.</span>home <span class="token string-literal"><span class="token string">''</span></span><span class="token punctuation">,</span> <span class="token symbol">:controller</span> <span class="token operator">=</span><span class="token operator">&amp;</span>gt<span class="token punctuation">;</span> <span class="token string-literal"><span class="token string">'projects'</span></span><span class="token punctuation">,</span> <span class="token symbol">:action</span> <span class="token operator">=</span><span class="token operator">&amp;</span>gt<span class="token punctuation">;</span> <span class="token string-literal"><span class="token string">'show'</span></span><span class="token punctuation">,</span> <span class="token symbol">:id</span> <span class="token operator">=</span><span class="token operator">&amp;</span>gt<span class="token punctuation">;</span> <span class="token string-literal"><span class="token string">'my_project_name'</span></span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div><![CDATA[Jump Higher]]>https://www.timbroder.com/2011/03/jump-higherhttps://www.timbroder.com/2011/03/jump-higherTue, 15 Mar 2011 21:22:42 GMT<p><a href="http://www.youtube.com/watch?v=tPZdYboa-HY"><img src="https://img.youtube.com/vi/tPZdYboa-HY/0.jpg" alt=""></a></p><![CDATA[Crossfit 2011. Are you Ready?]]>https://www.timbroder.com/2011/03/crossfit-2011-are-you-readyhttps://www.timbroder.com/2011/03/crossfit-2011-are-you-readyFri, 04 Mar 2011 18:25:24 GMT<p><a href="http://www.youtube.com/watch?v=xqbw6hZW91k"><img src="https://img.youtube.com/vi/xqbw6hZW91k/0.jpg" alt=""></a></p><![CDATA[Stress Relief: Blow things up]]>https://www.timbroder.com/2011/02/stress-relief-blow-things-uphttps://www.timbroder.com/2011/02/stress-relief-blow-things-upMon, 28 Feb 2011 20:09:35 GMT<p><a href="http://www.physicsgames.net/">Online Physics Games</a></p><![CDATA[Running Mongodb as a service on windows]]>https://www.timbroder.com/2011/02/running-mongodb-as-a-service-on-windowshttps://www.timbroder.com/2011/02/running-mongodb-as-a-service-on-windowsWed, 23 Feb 2011 20:55:22 GMT<div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">> c:\mongodb\mongod.exe --logpath "c:\mongodb\logs\mongo.log" --logappend --dbpath "c:\mongodb\dat a" --directoryperdb --install all output going to: c:\mongodb\logs\mongo.log Creating service MongoDB. Service creation successful. Service can be started from the command line via 'net start "MongoDB"'. > net start MongoDB The Mongo DB service was started successfully. > > mongo MongoDB shell version: 1.6.5 connecting to: test ></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[A note on Magento and multiple nodes using Memcached]]>https://www.timbroder.com/2011/02/a-note-on-magento-and-multiple-nodes-using-memcachedhttps://www.timbroder.com/2011/02/a-note-on-magento-and-multiple-nodes-using-memcachedFri, 11 Feb 2011 18:35:44 GMT<p>If you have multiple nodes using a shared memcached server, make sure you define a shared prefix for the keys to use.</p> <p>In local.xml:</p> <div class="gatsby-highlight" data-language="xml"><pre style="counter-reset: linenumber NaN" class="language-xml line-numbers"><code class="language-xml"> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>cache</span><span class="token punctuation">></span></span> ... <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>prefix</span><span class="token punctuation">></span></span>a1i<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>prefix</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>id_prefix</span><span class="token punctuation">></span></span>a1i<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>id_prefix</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>memcached</span><span class="token punctuation">></span></span> ...</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[Wolverine? Or 2 Batmen?]]>https://www.timbroder.com/2011/02/wolverine-or-2-batmenhttps://www.timbroder.com/2011/02/wolverine-or-2-batmenTue, 08 Feb 2011 20:59:49 GMT<p>![](<a href="http://www.igeektrooper.com/wp-">http://www.igeektrooper.com/wp-</a> content/uploads/2011/02/wolverinebatmen.jpg)</p><![CDATA[Twitter recap of the superbowl halftime show]]>https://www.timbroder.com/2011/02/twitter-recap-of-the-superbowl-halftime-showhttps://www.timbroder.com/2011/02/twitter-recap-of-the-superbowl-halftime-showMon, 07 Feb 2011 01:36:05 GMT<p>Ok so, the superbowl halftime was just god awful</p> <p>@tomkaters I just put Prince on the turntable. #MakeMyOwnHalftimeShow</p> <p>@cskilpatrick This halftime show needs more Bieber. #superbowl</p> <p>@CobraCommander Who is this tranny singer butchering Guns at halftime?</p> <p>@iamunscared Fergie is a train wreck, just ruined G n R.</p> <p>@amyasparklethe sound from the halftime show is completely messed up. awful.</p> <p>@garyvee No more pls</p> <p>@tomkaters Enjoy halftime by tom. <a href="http://www.youtube.com/watch?v=_bP48M2BEs0">http://www.youtube.com/watch?v=_bP48M2BEs0</a></p> <p>@cskilpatrick They should play this halftime show when they're trying to get cultists to leave their compound. #superbowl</p> <p>@brianshaler Glad everyone already tweeted about all the flaws in the Super Bowl halftime show. Now I don't have to.</p> <p>@garyvee It's time for a new format for superbowl halftime shows, how about interviews at the 50 yrd line ...conan and Jon Stewart interview Prince</p> <p>@brianshaler My favorite part of the halftime show was when they played the song "Where is the Lol? E"</p> <p>@werty Pretty sure Fergie raided Ace Frehley's closet for her Super Bowl halftime show costume. #superbowl #blackeyedpeas</p><![CDATA[Want to output the full xml config Magento is running?]]>https://www.timbroder.com/2011/01/want-to-output-the-full-xml-config-magento-is-runninghttps://www.timbroder.com/2011/01/want-to-output-the-full-xml-config-magento-is-runningThu, 27 Jan 2011 19:56:14 GMT<div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token class-name static-context">Mage</span><span class="token operator">::</span><span class="token function">getConfig</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">&amp;</span>gt<span class="token punctuation">;</span><span class="token function">getNode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">&amp;</span>gt<span class="token punctuation">;</span><span class="token function">asNiceXml</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'full_config.xml'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <p>Where full_config.xml is the file you want it dumped to.</p><![CDATA[Getting it onto the Kindle]]>https://www.timbroder.com/2011/01/getting-it-onto-the-kindlehttps://www.timbroder.com/2011/01/getting-it-onto-the-kindleThu, 27 Jan 2011 15:05:49 GMT<p>Been loving my Kindle 3 since I upgraded from my sony reader. There are so many options for getting various reading materials onto it. Here are a few of the ones I like the best:</p> <ul> <li>Want to get some RSS feeds onto the Kindle? (12 feeds for free) <a href="http://kindlefeeder.com/">KindleFeeder</a> is the way to go. It also has a bookmarklet for capturing and sending whole pages from your browser.I use this to send articles in Google Reader that I want to read later to my Kindle. I use my starred items to do this. Starred items have their own RSS feed which you can put into kindlefeeder. For information on how to get the link to the RSS of your starred items, <a href="http://www.freewaregenius.com/2008/01/16/how-to-broadcast-your-google-reader-starred-items-to-an-rss-feed-or-widget-on-your-blog/">click here</a>.</li> <li>"<a href="https://chrome.google.com/webstore/detail/ipkfnchcgalnafehpglfbommidgmalan#">Send to Kindle</a>" for chrome is a button that will send the content of the page your are currently viewing.</li> <li>The third method is the built in free Kindle email address that isn't broadly advertised: <a href="your.name@free.kindle.com">your.name@free.kindle.com</a> will beam most docs that you mail it to your Kindle over wifi (does not work with 3G)</li> <li><a href="http://calibre-ebook.com/" title="calibre">Calibre</a> is great for managing what is on your Kindle and converting just about any file format to .mobi (a format the Kindle can read).  Calibre can also be used to <a href="https://apprenticealf.wordpress.com/2011/01/13/ebooks-formats-drm-and-you-%E2%80%94-a-guide-for-the-perplexed/">strip the DRM</a> off of your purchased Kindle books</li> </ul> <p><a href="http://www.youtube.com/watch?v=Xu_FgtM_Oqs" title="http://www.youtube.com/watch?v=Xu_FgtM_Oqs">http://www.youtube.com/watch?v=Xu_FgtM_Oqs</a></p><![CDATA[My picks for the 2011 Oscars]]>https://www.timbroder.com/2011/01/my-picks-for-the-2011-oscarshttps://www.timbroder.com/2011/01/my-picks-for-the-2011-oscarsTue, 25 Jan 2011 16:24:40 GMT<h2>Best Supporting Actress</h2> <p>Amy Adams, <em>The Fighter</em> Helena Bonham Carter, <em>The King's Speech</em> Melissa Leo, <em>The Fighter</em> <strong>Hailee Steinfeld, <em>True Grit</em></strong> Jackie Weaver, <em>The Animal Kingdom</em> This was close between Steinfeld and Leo</p> <h2>Best Supporting Actor</h2> <p><strong>Christian Bale, <em>The Fighter</em></strong> John Hawkes, <em>Winter's Bone</em> Jeremy Renner, <em>The Town</em> Mark Ruffalo, <em>The Kids Are All Right</em> Geoffrey Rush, <em>The King's Speech</em> As much as I loved the town, not even close_ _</p> <h2>Best Actress</h2> <p>Annette Bening, <em>The Kids Are All Right</em> Nicole Kidman, <em>Rabbit Hole</em> Jennifer Lawrence, <em>Winter's Bone</em> <strong>Natalie Portman, <em>The Black Swan</em></strong> Michelle Williams, <em>Blue Valentine</em></p> <h2>Best Actor</h2> <p>Javier Bardem, <em>Biutiful</em> Jeff Bridges, <em>True Grit</em> <strong>Jesse Eisenberg, <em>The Social Network</em></strong> Colin Firth, <em>The King's Speech</em> James Franco, <em>127 Hours</em></p> <h2>Best Director</h2> <p><strong>Darren Aronofsky, <em>Black Swan</em></strong> ** David O. Russell, <em>The Fighter</em>** Tom Hooper, <em>The King's Speech</em> <strong>David Fincher, <em>The Social Network</em></strong> Joel &#x26; Ethan Coen, <em>True Grit</em> Seriously? True Grit sucked balls_. <em>I can't decide though</em> _</p> <h2>Best Original Screenplay</h2> <p><em>Another Year</em> - Mike Leigh <em>The Fighter</em> - Scott Silver, Paul Tamasy &#x26; Eric Johnson <strong><em>Inception</em> - Christopher Nolan</strong> <em>The Kids Are All Right</em> - Lisa Cholodenko &#x26; Stuart Blumberg <em>The King's Speech</em> - David Seidler</p> <h2>Best Adapted Screenplay</h2> <p><em>127 Hours</em> - Danny Boyle &#x26; Simon Beaufoy <strong><em>The Social Network</em> - Aaron Sorkin</strong> <em>Toy Story 3</em> - Michael Arndt <em>True Grit</em> - Joel &#x26; Ethan Coen <em>Winter's Bone</em> - Debra Granik &#x26; Anne Rossellini</p> <h2>Best Foreign Film</h2> <p><em>Biutiful</em> (Mexico) <em>Dogtooth</em> (Greece) <em>In a Better World</em> (Denmark) <em>Incendies</em> (Canada) <em>Outside the Law</em> (France) Didn't see any of these</p> <h2>Best Animated Film</h2> <p><strong><em>How to Train Your Dragon</em></strong> <em>The Illusionist</em> <em>Toy Story 3</em> go Eli!_ _</p> <h2>Best Picture</h2> <p><em>Black Swan</em> <em>The Fighter</em> <strong><em>Inception</em></strong> <em>The Kids Are All Right</em> <em>The King's Speech</em> <em>127 Hours</em> <em>The Social Network</em> <em>Toy Story 3</em> <em>True Grit</em> <em>Winter's Bone</em> INCEPTION INCEPTION INCEPTION!!!!</p><![CDATA[Breaking them in]]>https://www.timbroder.com/2011/01/breaking-them-inhttps://www.timbroder.com/2011/01/breaking-them-inSun, 23 Jan 2011 18:24:49 GMT<p>![image](/images/2011/01/wpid- IMAG0003.jpg)</p><![CDATA[Want to trace the call stack in Magento?]]>https://www.timbroder.com/2011/01/want-to-trace-the-call-stack-in-magentohttps://www.timbroder.com/2011/01/want-to-trace-the-call-stack-in-magentoTue, 04 Jan 2011 21:35:38 GMT<p>Update: This code is also available on <a href="https://github.com/broderboy/magento-callstack" title="Github">Github</a> as a Mageno module</p> <p>This has helped me immensely in situations like "Where is this getting called from??!?"</p> <p>Create a helper like so:</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Timbroder_Stack_Helper_Callstack</span> <span class="token keyword">extends</span> <span class="token class-name">Mage_Core_Helper_Abstract</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">get_callstack</span><span class="token punctuation">(</span><span class="token variable">$delim</span><span class="token operator">=</span><span class="token operator">&amp;</span>quot<span class="token punctuation">;</span>\n<span class="token operator">&amp;</span>quot<span class="token punctuation">;</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$dt</span> <span class="token operator">=</span> <span class="token function">debug_backtrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$cs</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$dt</span> <span class="token keyword">as</span> <span class="token variable">$t</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$cs</span> <span class="token operator">.=</span> <span class="token variable">$t</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'file'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string single-quoted-string">' line '</span> <span class="token operator">.</span> <span class="token variable">$t</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'line'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string single-quoted-string">' calls '</span> <span class="token operator">.</span> <span class="token variable">$t</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'function'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token operator">&amp;</span>quot<span class="token punctuation">;</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">&amp;</span>quot<span class="token punctuation">;</span> <span class="token operator">.</span> <span class="token variable">$delim</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token variable">$cs</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">toLog</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name static-context">Mage</span><span class="token operator">::</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">&amp;</span>gt<span class="token punctuation">;</span><span class="token function">get_callstack</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">toFirePhp</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$stack</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">&amp;</span>gt<span class="token punctuation">;</span><span class="token function">get_callstack</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token function">explode</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>quot<span class="token punctuation">;</span>\n<span class="token operator">&amp;</span>quot<span class="token punctuation">;</span><span class="token punctuation">,</span> <span class="token variable">$stack</span><span class="token punctuation">)</span> <span class="token keyword">as</span> <span class="token variable">$line</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name static-context">Mage</span><span class="token operator">::</span><span class="token function">helper</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'firephp'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">&amp;</span>gt<span class="token punctuation">;</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token variable">$line</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>That can be called from anywhere:</p> <p>``PHP Mage::helper('stack/callstack')->toFirePhp(); Mage::helper('stack/callstack')->toLog();</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text"> I've also wrapped this into a module that you can drop right into your project. Details here: [https://bitbucket.org/broderboy/magento_callstack/src](https://bitbucket.org/broderboy/magento_callstack/src "https://bitbucket.org/broderboy/magento_callstack/src") Example output: </code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>.../app/code/community/Timbroder/Stack/Helper/Callstack.php line 16 calls get_callstack() .../app/design/frontend/mongoose/default/template/catalog/cms/bikes_bmx.phtml line 12 calls toLog() .../app/design/frontend/mongoose/default/template/catalog/cms/bikes.phtml line 21 calls require_once() .../app/code/core/Mage/Core/Block/Template.php line 212 calls include() .../app/code/core/Mage/Core/Block/Template.php line 239 calls fetchView() .../app/code/core/Mage/Core/Block/Template.php line 253 calls renderView() .../app/code/core/Mage/Core/Block/Abstract.php line 668 calls _toHtml() .../app/code/core/Mage/Core/Model/Email/Template/Filter.php line 190 calls toHtml() .../lib/Varien/Filter/Template.php line 134 calls call_user_func() .../app/code/core/Mage/Core/Model/Email/Template/Filter.php line 501 calls filter() .../app/code/core/Mage/Cms/Block/Page.php line 100 calls filter() .../app/code/core/Mage/Core/Block/Abstract.php line 668 calls _toHtml() .../app/code/core/Mage/Core/Block/Abstract.php line 513 calls toHtml() .../app/code/core/Mage/Core/Block/Abstract.php line 460 calls _getChildHtml() .../app/code/local/Mage/Page/Block/Html/Wrapper.php line 52 calls getChildHtml() .../app/code/core/Mage/Core/Block/Abstract.php line 668 calls _toHtml() .../app/code/core/Mage/Core/Block/Text/List.php line 43 calls toHtml() .../app/code/core/Mage/Core/Block/Abstract.php line 668 calls _toHtml() .../app/code/core/Mage/Core/Block/Abstract.php line 513 calls toHtml() .../app/code/core/Mage/Core/Block/Abstract.php line 464 calls _getChildHtml() .../app/design/frontend/mongoose/default/template/page/1column.phtml line 55 calls getChildHtml() .../app/code/core/Mage/Core/Block/Template.php line 212 calls include() .../app/code/core/Mage/Core/Block/Template.php line 239 calls fetchView() .../app/code/core/Mage/Core/Block/Template.php line 253 calls renderView() .../app/code/core/Mage/Core/Block/Abstract.php line 668 calls _toHtml() .../app/code/core/Mage/Core/Model/Layout.php line 529 calls toHtml() .../app/code/local/Mage/Core/Controller/Varien/Action.php line 389 calls getOutput() .../app/code/core/Mage/Cms/Helper/Page.php line 130 calls renderLayout() .../app/code/core/Mage/Cms/Helper/Page.php line 52 calls _renderPage() .../app/code/core/Mage/Cms/controllers/PageController.php line 45 calls renderPage() .../app/code/local/Mage/Core/Controller/Varien/Action.php line 418 calls viewAction() .../app/code/core/Mage/Core/Controller/Varien/Router/Standard.php line 254 calls dispatch() .../app/code/core/Mage/Core/Controller/Varien/Front.php line 177 calls match() .../app/code/core/Mage/Core/Model/App.php line 304 calls dispatch() .../app/Mage.php line 598 calls run() .../index.php line 155 calls run()</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text"> Thanks to [nextide](http://www.nextide.ca/node/518) for some of the code</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span></span></pre></div><![CDATA[Want user available in every template in Django?]]>https://www.timbroder.com/2010/12/want-user-available-in-every-template-in-djangohttps://www.timbroder.com/2010/12/want-user-available-in-every-template-in-djangoWed, 29 Dec 2010 03:08:52 GMT<p>Create a context processor</p> <p>settings.py</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python">TEMPLATE_CONTEXT_PROCESSORS <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token string">'myapp.context_processors.user'</span><span class="token punctuation">,</span> <span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span></span></pre></div> <p>context_processors.py</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token keyword">def</span> <span class="token function">user</span><span class="token punctuation">(</span>request<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">if</span> <span class="token builtin">hasattr</span><span class="token punctuation">(</span>request<span class="token punctuation">,</span> <span class="token string">'user'</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">return</span> <span class="token punctuation">{</span><span class="token string">'user'</span><span class="token punctuation">:</span>request<span class="token punctuation">.</span>user <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token punctuation">{</span><span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span></span></pre></div> <p>user is now available in any template:</p> <div class="gatsby-highlight" data-language="html"><pre style="counter-reset: linenumber NaN" class="language-html line-numbers"><code class="language-html">{% verbatim %} {% if user.is_authenticated %}Do Something Special{% endif %} {% endverbatim %}</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span></span></pre></div> <p>source: <a href="http://stackoverflow.com/questions/41547/always-including-the-user-in-the-django-template-context" title="StackOverflow">StackOverflow</a></p><![CDATA[Want to dump every SQL query Magento runs?]]>https://www.timbroder.com/2010/12/want-to-dump-every-sql-query-magento-runshttps://www.timbroder.com/2010/12/want-to-dump-every-sql-query-magento-runsThu, 02 Dec 2010 22:35:04 GMT<p>In: <code class="language-text">lib/Zend/DB/Adapter/Adapter.php</code></p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">query</span><span class="token punctuation">(</span><span class="token variable">$sql</span><span class="token punctuation">,</span> <span class="token variable">$bind</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// connect to the database if needed</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">_connect</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// is the $sql a Zend_Db_Select object?</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$sql</span> <span class="token keyword">instanceof</span> <span class="token class-name">Zend_Db_Select</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$bind</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$bind</span> <span class="token operator">=</span> <span class="token variable">$sql</span><span class="token operator">-></span><span class="token function">getBind</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$sql</span> <span class="token operator">=</span> <span class="token variable">$sql</span><span class="token operator">-></span><span class="token function">assemble</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$time_start</span> <span class="token operator">=</span> <span class="token function">microtime</span><span class="token punctuation">(</span><span class="token constant boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// make sure $bind to an array;</span> <span class="token comment">// don't use (array) typecasting because</span> <span class="token comment">// because $bind may be a Zend_Db_Expr object</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">is_array</span><span class="token punctuation">(</span><span class="token variable">$bind</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$bind</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token variable">$bind</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// prepare and execute the statement with profiling</span> <span class="token variable">$stmt</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">prepare</span><span class="token punctuation">(</span><span class="token variable">$sql</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$stmt</span><span class="token operator">-></span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token variable">$bind</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// return the results embedded in the prepared statement object</span> <span class="token variable">$stmt</span><span class="token operator">-></span><span class="token function">setFetchMode</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_fetchMode</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$time_end</span> <span class="token operator">=</span> <span class="token function">microtime</span><span class="token punctuation">(</span><span class="token constant boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$time</span> <span class="token operator">=</span> <span class="token variable">$time_end</span> <span class="token operator">-</span> <span class="token variable">$time_start</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"SQL[<span class="token interpolation"><span class="token variable">$time</span></span> | <span class="token interpolation"><span class="token variable">$sql</span></span> ]"</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"\n&lt;br />\n"</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$stmt</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[Magento: Want CKEditor to appear on Category edit pages in Magento?]]>https://www.timbroder.com/2010/12/magento-want-ckeditor-to-appear-on-category-edit-pages-in-magentohttps://www.timbroder.com/2010/12/magento-want-ckeditor-to-appear-on-category-edit-pages-in-magentoThu, 02 Dec 2010 16:50:50 GMT<p>It is pretty common to replace the <a href="http://tinymce.moxiecode.com/">TinyMCE </a>editor in the Magento Admin with the <a href="http://ckeditor.com/">CKEditor </a>using this <a href="http://www.magentocommerce.com/magento-connect/Fontis/extension/586/fontis-wysiwyg-editor">extension</a></p> <p>However, the way magento ajaxes the form fields into view on the category pages breaks this functionality.</p> <p>This snippet should help anyone trying to get it to work in <code class="language-text">app/design/adminhtml/default/default/template/fontis/wysiwyg/wysiwyg.phtml</code></p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php">{% verbatim %} <span class="token php language-php"><span class="token delimiter important">&lt;?php</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$editorType</span> <span class="token operator">==</span> <span class="token string single-quoted-string">'ckeditor'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text/javascript<span class="token punctuation">"</span></span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important">&lt;?php</span> <span class="token keyword">echo</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">getJsUrl</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token delimiter important">?></span></span>fontis/ckeditor/ckeditor.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text/javascript<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">var</span> pageLoaded <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">applyCKEditor</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>pageLoaded<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> editable_areas <span class="token operator">=</span> <span class="token string">'<span class="token php language-php"><span class="token delimiter important">&lt;?php</span> <span class="token keyword">echo</span> <span class="token variable">$editableAreas</span> <span class="token delimiter important">?></span></span>'</span><span class="token punctuation">;</span> <span class="token php language-php"><span class="token delimiter important">&lt;?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">strpos</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token function">helper</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'core/url'</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">getCurrentUrl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'catalog_category'</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token constant boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token delimiter important">?></span></span> <span class="token constant">CKEDITOR</span><span class="token punctuation">.</span>instances <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token php language-php"><span class="token delimiter important">&lt;?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span> <span class="token php language-php"><span class="token delimiter important">&lt;?php</span> <span class="token comment">/* Add CKeditor to any matching textareas. */</span> <span class="token delimiter important">?></span></span> editable_areas<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">','</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">each</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">dom_id</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">$</span><span class="token punctuation">(</span>dom_id<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token php language-php"><span class="token delimiter important">&lt;?php</span> <span class="token comment">/* Remove the required-entry CSS class so Magento will allow the contents of the editor to be submitted. */</span> <span class="token delimiter important">?></span></span> <span class="token keyword">var</span> loopCheck <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span><span class="token function">$</span><span class="token punctuation">(</span>dom_id<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">hasClassName</span><span class="token punctuation">(</span><span class="token string">'required-entry'</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> loopCheck <span class="token operator">&lt;</span> <span class="token number">10</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">$</span><span class="token punctuation">(</span>dom_id<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">removeClassName</span><span class="token punctuation">(</span><span class="token string">'required-entry'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> loopCheck <span class="token operator">+=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token constant">CKEDITOR</span><span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span>dom_id<span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token literal-property property">width</span> <span class="token operator">:</span> <span class="token number">640</span><span class="token punctuation">,</span> <span class="token literal-property property">height</span><span class="token operator">:</span> <span class="token number">350</span><span class="token punctuation">,</span> <span class="token literal-property property">protectedSource</span> <span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">'(/{{[\s\S]*?}}/g)'</span><span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> window<span class="token punctuation">.</span><span class="token function-variable function">onload</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> pageLoaded <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token php language-php"><span class="token delimiter important">&lt;?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">strpos</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token function">helper</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'core/url'</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">getCurrentUrl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'catalog_category'</span><span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token constant boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token delimiter important">?></span></span> <span class="token function">applyCKEditor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token php language-php"><span class="token delimiter important">&lt;?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span> <span class="token punctuation">}</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important">&lt;?php</span> <span class="token punctuation">}</span> <span class="token delimiter important">?></span></span> {% endverbatim %}</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>in <code class="language-text">app/design/adminhtml/default/default/template/catalog/category/edit/form.phtml</code> add this at the bottom but inside the script tag</p> <div class="gatsby-highlight" data-language="javascript"><pre style="counter-reset: linenumber NaN" class="language-javascript line-numbers"><code class="language-javascript"><span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">typeof</span> applyCKEditor <span class="token operator">==</span> <span class="token string">'function'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">applyCKEditor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span></span></pre></div><![CDATA[How Batman and Robin #16 should have ended]]>https://www.timbroder.com/2010/11/how-batman-and-robin-16-should-have-endedhttps://www.timbroder.com/2010/11/how-batman-and-robin-16-should-have-endedThu, 18 Nov 2010 16:08:40 GMT<p>What really happened:</p> <p>[![](<a href="http://timbroder.com/wp-">http://timbroder.com/wp-</a> content/uploads/2010/11/batmaninc1.jpg)](<a href="http://timbroder.com/wp-">http://timbroder.com/wp-</a> content/uploads/2010/11/batmaninc1.jpg)[![](http://timbroder.com/wp- content/uploads/2010/11/batmaninc2.jpg)](<a href="http://timbroder.com/wp-">http://timbroder.com/wp-</a> content/uploads/2010/11/batmaninc2.jpg)</p> <p>What SHOULD have happened:</p> <p>[![](<a href="http://timbroder.com/wp-">http://timbroder.com/wp-</a> content/uploads/2010/11/batman3.jpg)](<a href="http://timbroder.com/wp-">http://timbroder.com/wp-</a> content/uploads/2010/11/batman3.jpg)Thanks to <a href="http://twitter.com/#!/falcore000">John </a>for the images</p><![CDATA[oh amazon]]>https://www.timbroder.com/2010/10/oh-amazonhttps://www.timbroder.com/2010/10/oh-amazonMon, 18 Oct 2010 14:19:31 GMT<p>(10:18:07 AM) Laura: I think you ordered two plastic ball and chaisn</p> <p>(10:18:10AM) Laura: chains</p> <p>(10:18:20 AM) Me: i did</p> <p>(10:18:22 AM) Laura: Oh</p> <p>(10:18:24AM) Laura: Why?</p> <p>(10:18:35 AM) Me: i got enough bachelor parties coming up where i'll use it</p> <p>(10:18:39 AM) Laura: Ah</p> <p>(10:18:43 AM) Laura: Cool</p><![CDATA[Pesto]]>https://www.timbroder.com/2010/10/pestohttps://www.timbroder.com/2010/10/pestoMon, 04 Oct 2010 20:35:20 GMT<p>Really want to try this this week (via <a href="http://twitter.com/mrblondeau">Jon</a>)</p> <ul> <li>1 to 1 1/2 cups of olive oil</li> <li>2 cups fresh basil chopped (i usually get a couple of bushels 3 or 4 depends on what much u want to make its breaks down, i usually just take it off the stem and throw it in)</li> <li>1/2 tsp fresh ground pepper</li> <li>5 cloves of garlic chopped</li> <li>1 tsp salt</li> <li>1/2 cup grated Parmesan cheese</li> </ul> <p>Put like 1/2 cup of oil in blender to start with and add the basil. pepper garlic and salt.  Keep adding basil and the rest of oil till it all blend smooth Mix with Parmesan cheese before serving</p><![CDATA[Huge omelet after OPT]]>https://www.timbroder.com/2010/10/huge-omelet-after-opthttps://www.timbroder.com/2010/10/huge-omelet-after-optSun, 03 Oct 2010 13:49:39 GMT<p>![image](/images/2010/10/wpid- IMG_20101002_113547.jpg)</p> <p>James OPT Fitzgerald came to the black box yesterday which was a lot of fun. Needed a huge omelet after.</p><![CDATA[Goo.gl url shortener goes public]]>https://www.timbroder.com/2010/10/goo-gl-url-shortener-goes-publichttps://www.timbroder.com/2010/10/goo-gl-url-shortener-goes-publicFri, 01 Oct 2010 14:53:20 GMT<p>Google's URL shortener service is now public, complete with QR code generation Check it out: <a href="http://goo.gl/AP5t">http://goo.gl/AP5t</a> <a href="http://goo.gl/AP5t.qr">http://goo.gl/AP5t.qr</a> It will be interesting to see how this stands up to <a href="http://bit.ly">bit.ly</a></p><![CDATA[Some reading from django-nyc]]>https://www.timbroder.com/2010/09/some-reading-from-django-nychttps://www.timbroder.com/2010/09/some-reading-from-django-nycThu, 30 Sep 2010 18:04:45 GMT<p>Went to the <a href="http://www.djangonyc.org/">django-nyc</a> meetup last night, it was in Manhattan and much easier to get to then when it's at huge in bk.  Wrote down a few things to read up on:</p> <ul> <li><a href="http://celeryproject.org/">Celery</a> - Celery is an asynchronous task queue/job queue based on distributed message passing. It is focused on real-time operation, but supports scheduling as well.</li> <li><a href="http://github.com/justinlilly/django-ideas">Django ideas</a> - Voting on things with limited numbers of votes to spread around, ala UserVoice</li> <li><a href="http://www.meetup.com/NYC-GTUG/">Google tech meetup</a></li> <li><a href="http://code.google.com/apis/predict/">Google prediction api</a></li> <li><a href="http://www.meetup.com/javascript-7/">Nyc js</a></li> <li><a href="http://www.google.com/search?q=Ben+Firshman+class+based+views&#x26;ie=utf-8&#x26;oe=utf-8&#x26;aq=t&#x26;rls=org.mozilla:en-US:official&#x26;client=firefox-a">Ben Firshman class based views</a></li> <li><a href="http://djangocon.blip.tv/">Django con blip tv</a></li> <li><a href="http://djangocon.blip.tv/file/4135225/">Scaling worlds largest Django install </a></li> <li>Maps of imaginary lands</li> <li>Eric's keynote</li> <li><a href="http://a.images.blip.tv/Robertlofthouse-PonyPwning373-117.jpg">Pony pwning security risks</a></li> <li><a href="http://djangocon.blip.tv/file/4107023/">How to sell Django</a></li> <li><a href="http://djangocon.blip.tv/file/4111172/">Nosql and Django</a></li> <li><a href="http://djangocon.blip.tv/file/4134218/">How to come up to speed with new codebase</a></li> <li>Frameworks</li> <li>Virtualenv wrapper</li> <li><a href="http://www.google.com/search?q=Fabric&#x26;ie=utf-8&#x26;oe=utf-8&#x26;aq=t&#x26;rls=org.mozilla:en-US:official&#x26;client=firefox-a#sclient=psy&#x26;hl=en&#x26;client=firefox-a&#x26;hs=X5N&#x26;rls=org.mozilla%3Aen-US%3Aofficial&#x26;source=hp&#x26;q=Fabric+django&#x26;aq=f&#x26;aqi=g1g-m1g-o1&#x26;aql=&#x26;oq=&#x26;gs_rfai=&#x26;pbx=1&#x26;fp=84f34ab5383c7ee9">Fabric</a></li> <li><a href="http://www.capistranorb.com/">Capistrana</a></li> <li>Django picket ajax</li> <li><a href="http://dajaxproject.com/">Dajax</a></li> </ul><![CDATA[Face vs. watermelon = BRUTAL]]>https://www.timbroder.com/2010/09/face-vs-watermelon-brutalhttps://www.timbroder.com/2010/09/face-vs-watermelon-brutalWed, 08 Sep 2010 22:33:52 GMT<![CDATA[Google goes Instant]]>https://www.timbroder.com/2010/09/google-goes-instanthttps://www.timbroder.com/2010/09/google-goes-instantWed, 08 Sep 2010 19:21:05 GMT<p>Google Instant is a new search enhancement that shows results as you type. We are pushing the limits of our technology and infrastructure to help you get better search results, faster. Our key technical insight was that people type slowly, but read quickly, typically taking 300 milliseconds between keystrokes, but only 30 milliseconds (a tenth of the time!) to glance at another part of the page. This means that you can scan a results page while you type. The most obvious change is that you get to the right content much faster than before because you don’t have to finish typing your full search term, or even press “search.” Another shift is that seeing results as you type helps you formulate a better search term by providing instant feedback. You can now adapt your search on the fly until the results match exactly what you want. In time, we may wonder how search ever worked in any other way.</p> <h2>Benefits</h2> <p><strong>Faster Searches:</strong> By predicting your search and showing results before you finish typing, Google Instant can save 2-5 seconds per search.</p> <p><strong>Smarter Predictions:</strong> Even when you don’t know exactly what you’re looking for, predictions help guide your search. The top prediction is shown in grey text directly in the search box, so you can stop typing as soon as you see what you need.</p> <p><strong>Instant Results:</strong> Start typing and results appear right before your eyes. Until now, you had to type a full search term, hit return, and hope for the right results. Now results appear instantly as you type, helping you see where you’re headed, every step of the way.</p><![CDATA[Outtake from our engagement photo shoot.]]>https://www.timbroder.com/2010/09/outtake-from-our-engagement-photo-shoothttps://www.timbroder.com/2010/09/outtake-from-our-engagement-photo-shootWed, 08 Sep 2010 18:31:54 GMT<p><img src="https://scontent-lga1-1.xx.fbcdn.net/hphotos-xpa1/v/t1.0-9/58397_674436202390_998421_n.jpg?oh=8aeee1c0251130261bf3083400d40faa&#x26;oe=56500E63" alt=""></p><![CDATA[Magento:: Enabling the Product Review form anywhere]]>https://www.timbroder.com/2010/09/magento-enabling-the-product-review-form-anywherehttps://www.timbroder.com/2010/09/magento-enabling-the-product-review-form-anywhereWed, 08 Sep 2010 18:03:07 GMT<p>the form code lives in <code class="language-text">app/design/frontend/yourtemplate/default/template/review/form.phtml</code> in catalog.xml enable it with:</p> <div class="gatsby-highlight" data-language="xml"><pre style="counter-reset: linenumber NaN" class="language-xml line-numbers"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>block</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>review/form<span class="token punctuation">"</span></span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>product.info.review_form<span class="token punctuation">"</span></span> <span class="token attr-name">as</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>review_form<span class="token punctuation">"</span></span> <span class="token attr-name">template</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>review/form.phtml<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <p>and in your template:</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token php language-php"><span class="token delimiter important">&lt;?php</span> <span class="token keyword">echo</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">getChildHtml</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'review_form'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div><![CDATA[Using widgets outside of the CMS in Magento]]>https://www.timbroder.com/2010/09/using-widgets-outside-of-the-cms-in-magentohttps://www.timbroder.com/2010/09/using-widgets-outside-of-the-cms-in-magentoTue, 07 Sep 2010 19:51:46 GMT<p>Magento ships with widget functionality that lets you build out data models and then reuse them on product and CMS pages. If you want to use these in a custom template however, you are out of luck.  This can be done by extending the Widget Collection class.</p> <p>Create the following directory structure:</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">app/code/local/Mage/Widget/Model/Myswql4/Widget/Instance</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <p>Copy <code class="language-text">app/code/core/Mage/Widget/Model/Myswql4/Widget/Instance/Collection.php</code> into your new directory</p> <p>The Mage_Widget_Model_Mysql4_Widget_Instance_Collection comes with a store filter but thats about it.  To be more usefull we are going to add a type filter, a title filter, and a sorter.</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Mage_Widget_Model_Mysql4_Widget_Instance_Collection</span> <span class="token keyword">extends</span> <span class="token class-name">Mage_Core_Model_Mysql4_Collection_Abstract</span> <span class="token punctuation">{</span> <span class="token comment">/** * Constructor */</span> <span class="token keyword">protected</span> <span class="token keyword">function</span> <span class="token function-definition function">_construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword static-context">parent</span><span class="token operator">::</span><span class="token function">_construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">_init</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'widget/widget_instance'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * Filter by store ids * * @param array|integer $storeIds * @param boolean $withDefaultStore if TRUE also filter by store id '0' * @return Mage_Widget_Model_Mysql4_Widget_Instance_Collection */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">addStoreFilter</span><span class="token punctuation">(</span><span class="token variable">$storeIds</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token variable">$withDefaultStore</span> <span class="token operator">=</span> <span class="token constant boolean">true</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">is_array</span><span class="token punctuation">(</span><span class="token variable">$storeIds</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$storeIds</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token variable">$storeIds</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$withDefaultStore</span> <span class="token operator">&amp;&amp;</span> <span class="token operator">!</span><span class="token function">in_array</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token variable">$storeIds</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">array_unshift</span><span class="token punctuation">(</span><span class="token variable">$storeIds</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$select</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">getSelect</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$storeIds</span> <span class="token keyword">as</span> <span class="token variable">$storeId</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$select</span><span class="token operator">-></span><span class="token function">orWhere</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'FIND_IN_SET(?, `store_ids`)'</span><span class="token punctuation">,</span> <span class="token variable">$storeId</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">addTypeFilter</span><span class="token punctuation">(</span><span class="token variable">$type</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">getSelect</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">where</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'type=?'</span><span class="token punctuation">,</span> <span class="token variable">$type</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">addTitleFilter</span><span class="token punctuation">(</span><span class="token variable">$type</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">getSelect</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">where</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'title=?'</span><span class="token punctuation">,</span> <span class="token variable">$type</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">addAttributeToSort</span><span class="token punctuation">(</span><span class="token variable">$attribute</span><span class="token punctuation">,</span> <span class="token variable">$dir</span><span class="token operator">=</span><span class="token string single-quoted-string">'asc'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">getSelect</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">order</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$attribute</span><span class="token punctuation">}</span></span> <span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$dir</span><span class="token punctuation">}</span></span>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Now we should be able to query any widgets from any template in our system:</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token operator">&lt;</span> <span class="token operator">?</span><span class="token class-name type-declaration">php</span> <span class="token variable">$wids</span> <span class="token operator">=</span> <span class="token class-name static-context">Mage</span><span class="token operator">::</span><span class="token function">getModel</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'widget/widget_instance'</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">getCollection</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">addTypeFilter</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'masswidget/list'</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">addAttributeToSort</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'title'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'asc'</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">load</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$wids</span> <span class="token keyword">as</span> <span class="token variable">$wid</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token variable">$params</span> <span class="token operator">=</span> <span class="token variable">$wid</span><span class="token operator">-></span><span class="token function">getWidgetParameters</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token variable">$params</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'custom_param'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token variable">$wid</span><span class="token operator">-></span><span class="token function">gettitle</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">endforeach</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[The Primal Blueprint 30-Day Challenge]]>https://www.timbroder.com/2010/09/the-primal-blueprint-30-day-challengehttps://www.timbroder.com/2010/09/the-primal-blueprint-30-day-challengeTue, 07 Sep 2010 17:24:45 GMT<p><img src="https://i247.photobucket.com/albums/gg158/MDA2008/MDA2009/primal_30day_challenge-1.gif" alt="primal 30day challenge 1"></p> <p>If you want to lose weight, gain muscle, reduce stress, increase energy or just generally look and feel healthier you’ve come to the right place. Oh, and you can win lots of cool Primal gear, too (Over $10,000 in prizes!). That’s right, it’s the annual Primal Blueprint 30-Day Challenge! Watch the following video and read <a href="http://www.marksdailyapple.com/the-primal-blueprint-30-day-challenge/">the article</a> for all the details.</p><![CDATA[Google Reader adds to trends view]]>https://www.timbroder.com/2010/08/google-reader-adds-to-trends-viewhttps://www.timbroder.com/2010/08/google-reader-adds-to-trends-viewTue, 31 Aug 2010 13:22:38 GMT<p>Google Reader has added some more stats up at the top.  Number of subscriptions, 30 days summary, when you started using Google reader, and total number of articles read From your <strong>233 subscriptions</strong>, over the last 30 days <strong>you read 1,227 items</strong>, <strong>clicked 6 items</strong>, <strong>starred 0 items</strong>, <strong>shared 62 items</strong>, and <strong>emailed 28 items</strong>.</p> <p>Since <strong>September 12, 2006</strong> you have read a total of <strong>72,380</strong> items.</p><![CDATA[How fuc**d is your database?]]>https://www.timbroder.com/2010/08/how-fucd-is-your-databasehttps://www.timbroder.com/2010/08/how-fucd-is-your-databaseThu, 26 Aug 2010 20:53:42 GMT<p>Are you using PostgreSQL, MySQL, MSSQL, Oracle, SQLite, MS Access, or NoSQL? <a href="http://howfuckedismydatabase.com/">http://howfuckedismydatabase.com/</a></p><![CDATA[Gmail to real phone calling]]>https://www.timbroder.com/2010/08/gmail-to-real-phone-callinghttps://www.timbroder.com/2010/08/gmail-to-real-phone-callingWed, 25 Aug 2010 19:07:05 GMT<p>We're playing with this at the office, pretty slick.  Seems like google just really wants to be skype though <img src="https://3.bp.blogspot.com/_JE4qNpFW6Yk/THRyAaGzsCI/AAAAAAAAAsI/Kv0RN0TmcLU/s800/screenshot2.jpeg" alt=""> "<a href="http://gmailblog.blogspot.com/2008/11/say-hello-to-gmail-voice-and-video-chat.html">Gmail voice and video chat</a> makes it easy to stay in touch with friends and family using your computer’s microphone and speakers. But until now, this required both people to be at their computers, signed into Gmail at the same time. Given that most of us don’t spend all day in front of our computers, we thought, “wouldn’t it be nice if you could call people directly on their phones?” Starting today, you can call any phone right from Gmail." Full info can be found <a href="http://gmailblog.blogspot.com/2010/08/call-phones-from-gmail.html">here</a></p><![CDATA[AMC'S THE WALKING DEAD Trailer]]>https://www.timbroder.com/2010/08/amcs-the-walking-dead-trailerhttps://www.timbroder.com/2010/08/amcs-the-walking-dead-trailerTue, 24 Aug 2010 17:53:49 GMT<p>Very excited for this!</p><![CDATA[Digg 4v and Hulu Plus invites to give away]]>https://www.timbroder.com/2010/08/digg-4v-and-hulu-plus-invites-to-give-awayhttps://www.timbroder.com/2010/08/digg-4v-and-hulu-plus-invites-to-give-awayThu, 19 Aug 2010 19:32:25 GMT<p>If anyone wants invites to the <a href="http://new.digg.com/">new Digg site</a>, or a Hulu Plus invite that can be activated right now, Post in the comments and I'll divvy them out</p><![CDATA[Why VPS?]]>https://www.timbroder.com/2010/08/why-vpshttps://www.timbroder.com/2010/08/why-vpsThu, 19 Aug 2010 15:16:43 GMT<p>Lately the four main web hosting options are shared, VPS, dedicated, or a cloud based solution.  I'll follow up on this article at a later date with my experience with Amazon's cloud solution.  We are rolling out a magento install into the cloud in a few weeks and I'll be commenting on how that goes.  To start off, what is <a href="http://www.inmotionhosting.com/vps_hosting.html">VPS web hosting</a>? A Virtual Private Server (VPS) is a hosting environment that combines the benefits of both shared hosting and dedicated hosting. It does this by creating a virtual server that runs inside a hardware server via a specially designed partition. So why would you need one over shared hosting?</p> <ul> <li>Speed: Much faster then shared hosting.  There are fewer people sharing resources on the server and you have guaranteed resources.  If another site is hogging 100% of the cpu on its VPS, this will not effect your sites performance.  A VPS can handle might higher traffic loads then shared hosting.</li> <li>Security: Your files are isolated from other VPS instances</li> <li>Full root access to your instance</li> <li>Reboot: Reboot apache or your whole server instance without effecting the other servers</li> <li>Cost: Much cheaper then a dedicated instance with almost the same control/resources</li> <li>More space for files</li> <li>Custom Instances:  More control over what you get, and is not dependent on the other instances on the same physical server.  With shared hosting the provider usually picks the OS, with VPS there are usually dozens of options.</li> <li>Private email, IP, and domain: Shared hosts will have one email server for all the hosts</li> <li>Custom Security policies: From on server virus scanning to a customizable firewall</li> <li>Reseller: if you have extra resources available you can usually resell these</li> </ul> <p>The top VPS Hosting providers according to <a href="http://webhostinggeeks.com/vpshosting.html">Web Hosting Geeks</a> are:</p> <ul> <li><a href="http://www.inmotionhosting.com/vps_hosting.html">Inmotion</a></li> <li><a href="http://www.ultrahosting.com/">Ultrahosting</a></li> <li><a href="http://www.networksolutions.com/vps/index.jsp">Network Solutions</a></li> <li><a href="http://www.ace-host.net/index.html">Ace Host</a></li> <li><a href="http://www.hostican.com/">HostIcan</a></li> <li><a href="http://www.lpdedicated.com/index.php">Lunar Pages</a></li> <li><a href="http://order.1and1.com/xml/order/VirtualServer">1&#x26;1</a></li> <li><a href="http://www.xlhost.com/">xlhost</a></li> </ul><![CDATA[Powering Chrome to Phone with Android to Device Messaging ]]>https://www.timbroder.com/2010/08/powering-chrome-to-phone-with-android-to-device-messaginghttps://www.timbroder.com/2010/08/powering-chrome-to-phone-with-android-to-device-messagingThu, 12 Aug 2010 18:42:08 GMT<p>Android <a href="http://code.google.com/android/c2dm/">Cloud to Device Messaging (C2DM)</a> was launched recently as part of Android 2.2. C2DM enables third-party developers to push lightweight data messages to the phone. C2DM created a nice opportunity for us to pull together different Google developer tools to create a simple but useful application to enable users to push links and other information from their desktop / laptop to their phone. The result was Chrome to Phone - a <a href="http://www.google.com/intl/en/jobs/lifeatgoogle/englife/">20-percent time</a> project at Google. <a href="http://chrome.blogspot.com/">Chrome to Phone</a> comprises a Chrome Extension, an Android Application, and a Google AppEngine server. All of the code is open sourced and serves as a nice example of how to use C2DM. I really can't wait for the 2.2 update to my phone. Check out the technical brief <a href="http://android-developers.blogspot.com/2010/08/powering-chrome-to-phone-with-android.html">here</a></p><![CDATA[Fake Stan Lee vs. Comic Con 2009 ]]>https://www.timbroder.com/2010/08/fake-stan-lee-vs-comic-con-2009https://www.timbroder.com/2010/08/fake-stan-lee-vs-comic-con-2009Thu, 05 Aug 2010 15:01:33 GMT<p><a href="http://www.youtube.com/watch?v=6RX-gNBRgqc"><img src="https://img.youtube.com/vi/6RX-gNBRgqc/0.jpg" alt=""></a></p><![CDATA[Avengers teaser trailer from Comic Con]]>https://www.timbroder.com/2010/08/avengers-teaser-trailer-from-comic-conhttps://www.timbroder.com/2010/08/avengers-teaser-trailer-from-comic-conThu, 05 Aug 2010 15:00:32 GMT<![CDATA[gpowered.net is now timbroder.com]]>https://www.timbroder.com/2010/07/gpowered-net-is-now-timbroder-comhttps://www.timbroder.com/2010/07/gpowered-net-is-now-timbroder-comFri, 23 Jul 2010 19:48:27 GMT<p>Hi all, some of you may have noticed this site is no longer on the gpowered.net domain.  I've been wanting to move onto wordpress for a while now and also do some additional writing beyond code stuffs which would be outside of the scope of gpowered.  I also unfortunately (or fortunately because I love my <a href="https://www.alexanderinteractive.com/">job</a>) don't have as much time as I used to to research and post how to's.  Heavy django and magento going on lately, I'll try to post about those. There are two RSS links at the top, RSS has everything on this site including gpowered.  the gpowered RSS will continue to contain only tech articles. Let me know of any issues on the new site</p><![CDATA[Pig Roast]]>https://www.timbroder.com/2010/07/pig-roasthttps://www.timbroder.com/2010/07/pig-roastMon, 19 Jul 2010 21:40:21 GMT<p>Had a great time at <a href="http://www.crossfitvirtuosity.com/">Crossfit Virtuosity</a>'s anniversary pig roast this past weekend. mmmm pig</p> <p><img src="https://d208tez5h4u8q2.cloudfront.net/wp-content/uploads/2010/07/IMAG0124-150x150.jpg" alt=""> <img src="https://d208tez5h4u8q2.cloudfront.net/wp-content/uploads/2010/07/IMAG0125-150x150.jpg" alt=""> <img src="https://d208tez5h4u8q2.cloudfront.net/wp-content/uploads/2010/07/IMAG0126-150x150.jpg" alt=""></p><![CDATA[Front Runners New York Lesbian and Gay Pride Run (5M)]]>https://www.timbroder.com/2010/07/front-runners-new-york-lesbian-and-gay-pride-run-5mhttps://www.timbroder.com/2010/07/front-runners-new-york-lesbian-and-gay-pride-run-5mTue, 06 Jul 2010 22:03:12 GMT<p>Was hot, humid, and I was still tired from Thursday night's Wallstreet race, but a good time nevertheless <span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 246px; " > <a class="gatsby-resp-image-link" href="/static/55e7bed0519ca8311a027e4ced80d06a/92252/2010-07-06_1800.png" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 153.79746835443038%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAfCAYAAADnTu3OAAAACXBIWXMAAAsTAAALEwEAmpwYAAAIG0lEQVR42lWR+U/TCRrGv//LZjM/bDa7k81u3MTsOjrjyIwOOHgDwkg5RVoQUUHu+yrQlh5AoRylnOWoiArIocIAIyo3IjcFWpBDYTha+tnM7GZ290k+yfs8P7x53zxCSWUwLU/DMDX7UV/vR0j4GRSyMzQ1ejA5mcH8vJK5WSkWi5SNzUpiw0/TUCZiZDSA6dlM3r19xuR4Ij29HvT2ShAUhSEY6gOorbtOY0MQYeFOaLXned4tYWgolv5XySwsJjAzHc3GtobUeBfkqeeYno9ibb2IndetLC/qGR4J4kmzGCE2TURFjR819T5kyy9xU3KKinIPfuwJxGTy5FHLDR6agjEv69j6pECZc4EHwSeYmrmPxapit9XA6k8ZjIw/ICfhGsKDZB+MDbcx1nuTkXwFrx++IjXpIl2dQUxNK2h/FkVCwBV6O9KYW0pFkXmeEK+/8/bNAz5tFbNTkcX8kyyGpkJIueeEkJjpg6YoAH2dhNxsEb4+X5MWd4mJqTJ2t54yVhBKtt93PNJH0Ps6gaS4bwj2PIaxXkx/+y0+5sex0a7DvK4gNeKfCHFpnsiUfuTpJGgKJQR5nUQV5czYmIa1yjt8aAmmLC0Ag8yP/Kosbj0IJMTnOEkJzqSkfcObqCvsP67Caq6lzuCOkKf2I1sTgL4xmtKKCEJ9TpKTfJ76OCfWS0TUPdWSE+aO8p6Icq2OxwYZ0SFnCHQ7Rvjts1RmXWa7Ope1CQONGV4IKm0QufkBGOrukKXyJTb5HNlZIh6Z7tJTE0OIyBdn16tcvObOqW8vUZd1C01qIJE3vyf8xpdkprrRnCFmqDmDmetnER4ab6KSuyIKPE2q1IuolKuER3pTVRpJX106/l5ufH76EleuuZFx25cnpRkMVKbTVRhJjI8TNaoYxvsbeBv0Fe3OxxD6TOGUqq8SFuZMZNh5fEWu+Is8aFKH0q+LJ1V8lXt+l8kOdSc51JeSFDGdhffYGDTR05BPdbo/llcmhq+7oL94FuFpcSLyyOvUxLtyN9QFSaALdwK+40ZmOtL8dJRhnsSH3OCi703+cF6E5/VrzLSqODjYxjw/gVqdg5fGyKmSfpzKBxA6TDpSPE6hO/U77gVdJjjwMrHiCyQosujorudCeCrB0Ynkp94mJCaCL9yCaDLWwtEK7+emiVZW8nvNT0T0WbjbMoJgMpUidjuD0u8cdySXcf7uCyTiK6TESIiXZnNcnEJYRBQysTtB/r6c8IlFml9Oz0sjLzuayC3W83vtEIpRK7K+KYSgQHeCXf5KQaQHUkUc37ucRBxyHbHEg1DROU78cIs/+UTxuYeEz1xFXA6NJS4tgxR/J95215Kuq+EzVS/pI+uUD4whKKO8ued2jEzJRaIjRERFBHL3vh+5Cf5YGpNIiAzlz67uHHdx5dszxznn4owkQcvqk2x+7G4kKF3HyYJO/tG0hGf9CEJeUhDpSQHERbgTE+FJanIoyQlitIooptqVKGICuOL8JRecjnPB+TSBAT+QlBjBQEM28XH38fb1JiIlAa80GaG5+QhyeQSlxbHU10kxGNLR69OpqcygwpDJi3YdUWHeHP/bH/nqi78gvvY1SfcD0OmyaDXK0Shiib0voliTSEu9GoM6EmFouI2pdy+ZnullaWmItfVJrNZJrKvTbG5aqW404HH2BEWFWTRo4vmpq45t+z4f1hbZ2l7HYl1geXmGpZUZZs3jCPwmGw7s/7V2B/ZDO03VBRRHifi4sUiDIpahV638vxzYj/Z+c4LjyIHjl/jAhu3TDja7jb39Pez2Iw6P9kmK9udNTwcHdjuFMb5MDLT/e43dhsNmx350hMNxhOPIht1+8D8X7h1gs1hZMS+zvLnG+sY68+uLLC8P8sE6y9TcBNWaeFbnB7DsrbK8OcHW2nsse1vs2n7mcP8jBwdbCHbbHrbDXQ73ttlYX2BtbYrNrTm2tpbZOtwBjjhy7LAwN4KxMJ7FpT5Gx9oYG33K4lw/G1uz7O19wGH/GRyHCLs7aywuDDI50cnkeBs72+PY9y0c7q+zv7fKytIw62vvefO6h7sh3nzaWuXw4CO2gy3gkN2ddczmd8wtjGFe+q0UO1brIhOTPzL4po2+gce8HnzIQH8DrU9LKavIJlcRx01/N7SaFObmhrGumfn5YJOjo91fv5mZGWR+dhDh1ZtONrbNHLHHrm2Nsbl+Hj6roqJGia40k7z8JLLykpAqE5Hlp5GjTkZdmEq9UUlnWznPXzxkeKyf9Y9LbB9YEAp1Uoor5HS8MLJkGcHm2ODQscHmjpn5xVH6+p9gaimjpFKJVp+HqlSOulxOSaWKIr2cDGUyibI4MlUplFbkIRQU51CqV6Ary6GyppD+151YN+ZZ+zCHeeUdy+YR+gYeUVFTQHVtAXV1BTQaC2iqUvO4UkVblZoufR7deg21KhmCvDgHeVEOedocVIVSisvlmJpL6eqsoe9lE5NDbcwOtbM43MXC2xeMdjyms6aGpgoD1YZqtOV1qMobkBbXkaipRGg0qOho0PLqeQMTo33ML7xjcWGGpcVpllbMjM+v0D44RW3nIEXNL0grMxEmK+V2bgF3c5RE58qIk2WTJM8kTZ6K8Lihhdb2HvqG39P33szQ7DIT88vMLy2zallhcdXM8PsJunraedZWhdGooaQ8F2V+OjJ1Cor8tP+QjqIgE+Fhdzd1zU1U1ZZRUVlImV5FQ30hbU/KePFMz/O2clpMhRhrVRiqlGiKpORrpai1UnLUGUiVaeRq0n/ll/lfjTQsAmfKYzYAAAAASUVORK5CYII='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="2010 07 06 1800" title="" src="/static/55e7bed0519ca8311a027e4ced80d06a/92252/2010-07-06_1800.png" srcset="/static/55e7bed0519ca8311a027e4ced80d06a/c26ae/2010-07-06_1800.png 158w, /static/55e7bed0519ca8311a027e4ced80d06a/92252/2010-07-06_1800.png 246w" sizes="(max-width: 246px) 100vw, 246px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span></p><![CDATA[Cook/bake off at #aiaio!]]>https://www.timbroder.com/2010/07/cookbake-off-at-aiaiohttps://www.timbroder.com/2010/07/cookbake-off-at-aiaioThu, 01 Jul 2010 17:56:52 GMT<p>I made wings! <span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " > <a class="gatsby-resp-image-link" href="/static/bb60e6704d58afa8ba0cb6372a02c422/9657e/IMAG0109.jpg" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 168.35443037974682%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAiABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAMEBf/EABYBAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABR15CLOjpy0xrlJstkiswj//EABsQAAIDAQEBAAAAAAAAAAAAAAECAAMSESEz/9oACAEBAAEFAvZYDvNjxRgWW8BgfhuDFZhGl9wCQk9u+k//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AV//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AV//xAAdEAACAgIDAQAAAAAAAAAAAAAAAQIREBIhMUED/9oACAEBAAY/Ar8E1EujkZ2y3yjasbQ6ZrD3HzVksf/EAB8QAQADAAIBBQAAAAAAAAAAAAEAESExYRBBUYGhwf/aAAgBAQABPyFQnLpNwDlhYztgLa5gPiJX9oW0BVHvEXoO9RYEqvRlsOG9dRYIyprLn3vH/9oADAMBAAIAAwAAABDbJ01z/wD/xAAYEQADAQEAAAAAAAAAAAAAAAAAEBExQf/aAAgBAwEBPxC3CFXV/8QAGREAAgMBAAAAAAAAAAAAAAAAAAEQETFR/9oACAECAQE/EHS0sa7DyP/EAB8QAQEAAgEEAwAAAAAAAAAAAAERACExQVFhcRDh8P/aAAgBAQABPxAWRzUc/eFAGFi19Y4ZGgSamP0d0d8iEq85uLziVpeqsCPAEvhvy3E+tQJo9j1m3CnYqljx4bl4xkDj9dcq4MGzQot5maQ18P/Z'); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="IMAG0109" title="" src="/static/bb60e6704d58afa8ba0cb6372a02c422/828fb/IMAG0109.jpg" srcset="/static/bb60e6704d58afa8ba0cb6372a02c422/ff44c/IMAG0109.jpg 158w, /static/bb60e6704d58afa8ba0cb6372a02c422/a6688/IMAG0109.jpg 315w, /static/bb60e6704d58afa8ba0cb6372a02c422/828fb/IMAG0109.jpg 630w, /static/bb60e6704d58afa8ba0cb6372a02c422/0ede0/IMAG0109.jpg 945w, /static/bb60e6704d58afa8ba0cb6372a02c422/9657e/IMAG0109.jpg 1216w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span></p><![CDATA[Displaying Custom Attributes on the Product Page in Magento]]>https://www.timbroder.com/2010/06/displaying-custom-attributes-on-the-product-page-in-magentohttps://www.timbroder.com/2010/06/displaying-custom-attributes-on-the-product-page-in-magentoTue, 29 Jun 2010 16:27:47 GMT<p>At some point you may not want to use the canned attributes.phtml groupings that magento provides, or you just want to cherry pick which attributes to show on your product listing page template/catalog/product/view.phtml</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token variable">$_product</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">getProduct</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//For the attribute bike_specs_rear_shock</span> <span class="token variable">$_product</span><span class="token operator">-></span><span class="token function">getResource</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">getAttribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'bike_specs_rear_shock'</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">getStoreLabel</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//label</span> <span class="token variable">$_product</span><span class="token operator">-></span><span class="token function">getbike_specs_rear_shock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//value</span> </code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[iPhone4 vs HTC Evo]]>https://www.timbroder.com/2010/06/iphone4-vs-htc-evohttps://www.timbroder.com/2010/06/iphone4-vs-htc-evoMon, 28 Jun 2010 17:24:17 GMT<p>Warning: cursing</p> <p><a href="http://www.youtube.com/watch?v=FL7yD-0pqZg"><img src="https://img.youtube.com/vi/FL7yD-0pqZg/0.jpg" alt=""></a></p><![CDATA[Wedding Planning]]>https://www.timbroder.com/2010/06/wedding-planninghttps://www.timbroder.com/2010/06/wedding-planningTue, 22 Jun 2010 21:39:41 GMT<p>Tim: aside from not being a buffet, the food looks redic Tim: also, they are using joomla for their site</p> <p>via <a href="http://maybe-not.net/post/726385577">maybe-not</a>.</p><![CDATA[SyntaxHighlighter Evolved]]>https://www.timbroder.com/2010/06/syntaxhighlighter-evolvedhttps://www.timbroder.com/2010/06/syntaxhighlighter-evolvedFri, 18 Jun 2010 17:45:25 GMT<p>I'm currently in the process of migrating gpowerd.net over to this domain and onto wordpress. <a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter"> SyntaxHighlighter </a>has been upgraded quite a bit since I <a href="http://timbroder.com/2007/07/howto-post-code/">last</a> wrote about it.  I came across a <a href="http://wordpress.org/extend/plugins/syntaxhighlighter/">great plugin</a> to handle the code highlighting for me on wordpress.  I love the plugin, didn't have to go into the wordpress template. It doesn't support the old pre syntax that I had been using previously but it was simple to add in. Patch to add this to 2.3.8 is below, Thanks to <a href="http://www.viper007bond.com/wordpress-plugins/syntaxhighlighter/">Alex </a>for the plugin</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text"> --- syntaxhighlighter.orrig.php 2010-06-03 20:08:24.000000000 -0500 +++ syntaxhighlighter.php 2010-06-18 12:27:35.000000000 -0500 @@ -101,12 +101,15 @@ 'tabsize' => 4, 'toolbar' => 1, 'wraplines' => 1, + 'legacy' => 0, ) ); // Create the settings array by merging the user's settings and the defaults $usersettings = (array) get_option('syntaxhighlighter_settings'); $this->settings = wp_parse_args( $usersettings, $this->defaultsettings ); + if ( 1 == $this->settings['legacy'] ) + wp_register_script( 'syntaxhighlighter-brush-legacy', plugins_url('syntaxhighlighter/syntaxhighlighter/scripts/shLegacy.js'), array(), $this->agshver ); // Register generic hooks add_filter( 'the_content', array(&amp;$this, 'parse_shortcodes'), 7 ); @@ -175,6 +178,7 @@ 'javascript' => 'jscript', //'latex' => 'latex', 'tex' => 'latex', + 'legacy' => 'legacy', 'matlab' => 'matlabkey', 'objc' => 'objc', 'obj-c' => 'objc', @@ -583,6 +587,9 @@ echo " SyntaxHighlighter.config.strings.noBrush = '" . $this->js_escape_singlequotes( __( "Can't find brush for: ", 'syntaxhighlighter' ) ) . "';\n"; echo " SyntaxHighlighter.config.strings.brushNotHtmlScript = '" . $this->js_escape_singlequotes( __( "Brush wasn't configured for html-script option: ", 'syntaxhighlighter' ) ) . "';\n"; + if ( 1 == $this->settings['legacy'] ) + echo " dp.SyntaxHighlighter.HighlightAll('code');\n"; + if ( 1 != $this->settings['autolinks'] ) echo " SyntaxHighlighter.defaults['auto-links'] = false;\n"; @@ -687,6 +694,7 @@ 'tabsize' => false, 'toolbar' => false, 'wraplines' => false, + 'legacy' => false, ), $atts ) ); // Check for language shortcode tag such as [php]code[/php] @@ -771,6 +779,7 @@ 'smarttabs' => 'smart-tabs', 'tabsize' => 'tab-size', 'wraplines' => 'wrap-lines', + 'legacy' => 'legacy', ); // Allowed configuration parameters and their type @@ -925,6 +934,7 @@ settings['light'], 1 ); ?> /> settings['smarttabs'], 1 ); ?> /> settings['wraplines'], 1 ); ?> /> + settings['legacy'], 1 ); ?> /> @@ -1062,6 +1072,7 @@ $settings['smarttabs'] = ( !empty($settings['smarttabs']) ) ? 1 : 0; $settings['toolbar'] = ( !empty($settings['toolbar']) ) ? 1 : 0; $settings['wraplines'] = ( !empty($settings['wraplines']) ) ? 1 : 0; + $settings['legacy'] = ( !empty($settings['legacy']) ) ? 1 : 0; if ( 'true' != $settings['padlinenumbers'] &amp;&amp; 'false' != $settings['padlinenumbers'] ) $settings['padlinenumbers'] = (int) $settings['padlinenumbers']; ``` </code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[Lazy bum]]>https://www.timbroder.com/2010/06/lazy-bumhttps://www.timbroder.com/2010/06/lazy-bumThu, 03 Jun 2010 17:49:39 GMT<p><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 500px; " > <a class="gatsby-resp-image-link" href="/static/ad396c7199f78b83d39f6e845e6af456/41099/wpid-IMAG0048.jpg" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 168.35443037974682%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAiABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAECBAMF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQIA/9oADAMBAAIQAxAAAAG+K+64h5gb6uURXFLEyDjCf//EAB8QAAIBAwUBAAAAAAAAAAAAAAECAAMEERASFCExMv/aAAgBAQABBQJ4WwLcKaa098a0Upk04s5DZf6HkOrHv//EABURAQEAAAAAAAAAAAAAAAAAABEg/9oACAEDAQE/ASv/xAAWEQEBAQAAAAAAAAAAAAAAAAAREAD/2gAIAQIBAT8BY5v/xAAdEAACAQQDAAAAAAAAAAAAAAAAASECEBEiEiAx/9oACAEBAAY/Ajwk2qZqcXFngcZ7/wD/xAAaEAEAAwEBAQAAAAAAAAAAAAABABFBITFh/9oACAEBAAE/IaVBU7b2WkHsunA/bYzo3nYu6IyWOwt9MQshOysIVKX5DyPkbbP/2gAMAwEAAgADAAAAEAvJAwPP/8QAFxEBAQEBAAAAAAAAAAAAAAAAEQABEP/aAAgBAwEBPxChEZ3/xAAYEQEBAQEBAAAAAAAAAAAAAAABABEQMf/aAAgBAgEBPxBukItx5z//xAAdEAEAAgIDAQEAAAAAAAAAAAABABEhQTFRcYGR/9oACAEBAAE/EKHe9ynL5QQEQqx+R2cioTeGvWJAiWm1p3F27rcQKBa2Rj9FWTjzqP0i1KXGqNQtoFlDaRtswrAijhn/2Q=='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="image" title="" src="/static/ad396c7199f78b83d39f6e845e6af456/41099/wpid-IMAG0048.jpg" srcset="/static/ad396c7199f78b83d39f6e845e6af456/ff44c/wpid-IMAG0048.jpg 158w, /static/ad396c7199f78b83d39f6e845e6af456/a6688/wpid-IMAG0048.jpg 315w, /static/ad396c7199f78b83d39f6e845e6af456/41099/wpid-IMAG0048.jpg 500w" sizes="(max-width: 500px) 100vw, 500px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span> Jack guards the office</p><![CDATA[Never lose a bet at #aiaio]]>https://www.timbroder.com/2010/04/never-lose-a-bet-at-aiaiohttps://www.timbroder.com/2010/04/never-lose-a-bet-at-aiaioFri, 23 Apr 2010 13:38:07 GMT<p><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 499px; " > <a class="gatsby-resp-image-link" href="/static/0a496149bea4783575452002d9c5d492/5cb26/wpid-2010-04-21-14.15.53.jpg" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 74.68354430379746%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAQFAf/EABYBAQEBAAAAAAAAAAAAAAAAAAEAAv/aAAwDAQACEAMQAAAB2VbUspD4P//EABsQAQACAgMAAAAAAAAAAAAAAAIAARETEiMx/9oACAEBAAEFAuHT7ehw4Q2Aunmf/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAGxAAAgMAAwAAAAAAAAAAAAAAAAECESExQVH/2gAIAQEABj8CccuzNPBuKK7OD//EABsQAQEBAAIDAAAAAAAAAAAAAAERACExQVFh/9oACAEBAAE/IVSvapuKct8neErSujNSz3xkqF1DT43/2gAMAwEAAgADAAAAEHMP/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERIf/aAAgBAwEBPxCJmn//xAAWEQEBAQAAAAAAAAAAAAAAAAABABH/2gAIAQIBAT8QW0v/xAAcEAEAAwADAQEAAAAAAAAAAAABABEhMUFRYYH/2gAIAQEAAT8QIPjXOMxy+vYlms1Zr77KUIlRXOuJsMkaDT9lhCwrNZcgA8mf/9k='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="wpid 2010 04 21 14 15 53" title="" src="/static/0a496149bea4783575452002d9c5d492/5cb26/wpid-2010-04-21-14.15.53.jpg" srcset="/static/0a496149bea4783575452002d9c5d492/ff44c/wpid-2010-04-21-14.15.53.jpg 158w, /static/0a496149bea4783575452002d9c5d492/a6688/wpid-2010-04-21-14.15.53.jpg 315w, /static/0a496149bea4783575452002d9c5d492/5cb26/wpid-2010-04-21-14.15.53.jpg 499w" sizes="(max-width: 499px) 100vw, 499px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span></p><![CDATA[select foo, count(*) from bar group by foo in django]]>https://www.timbroder.com/2010/03/select-foo-count-from-bar-group-by-foo-in-djangohttps://www.timbroder.com/2010/03/select-foo-count-from-bar-group-by-foo-in-djangoWed, 31 Mar 2010 16:31:06 GMT<p>Every once in a while you need some old fashion SQL style queries in django. This is a common one for reporting and aggregation.  Its fairly easy to replicate in a queryset.  Say I wanted to get the authors and the number of articles they have written going back to the beginning of 2009 to the present:</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token keyword">from</span> django<span class="token punctuation">.</span>db<span class="token punctuation">.</span>models <span class="token keyword">import</span> Count Article<span class="token punctuation">.</span>objects <span class="token punctuation">.</span><span class="token builtin">filter</span><span class="token punctuation">(</span>created_date__gte<span class="token operator">=</span>datetime<span class="token punctuation">.</span>datetime<span class="token punctuation">(</span><span class="token number">2009</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">.</span>values<span class="token punctuation">(</span><span class="token string">'author'</span><span class="token punctuation">)</span> <span class="token punctuation">.</span>annotate<span class="token punctuation">(</span>Count<span class="token punctuation">(</span><span class="token string">'author'</span><span class="token punctuation">)</span><span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>The result:</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">[{'author__count': 1028, 'author': 17L}, {'author__count': 9, 'author': 9L}, {'author__count': 39, 'author': 12L}, {'author__count': 581, 'author': 10L}, {'author__count': 15, 'author': 7L}, {'author__count': 366, 'author': 13L}, {'author__count': 233, 'author': 5L}, {'author__count': 167, 'author': 15L}, {'author__count': 287, 'author': 14L}, {'author__count': 10, 'author': 6L}, {'author__count': 2101, 'author': 16L}]</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div><![CDATA[IE9 platform preview]]>https://www.timbroder.com/2010/03/ie9-platform-previewhttps://www.timbroder.com/2010/03/ie9-platform-previewTue, 16 Mar 2010 20:15:00 GMT<p><a href="https://www.blogcdn.com/www.switched.com/media/2009/11/ie9scribble.jpg"><img src="https://www.blogcdn.com/www.switched.com/media/2009/11/ie9scribble.jpg" alt=""></a></p> <p>Interested in checking out the new Web platform capabilities of Internet Explorer 9?</p> <p><a href="http://ie.microsoft.com/testdrive/info/ThankYou/Default.html">Download</a> the Internet Explorer Platform Preview right now.</p><![CDATA[Hide buzz without disabling it]]>https://www.timbroder.com/2010/02/hide-buzz-without-disabling-ithttps://www.timbroder.com/2010/02/hide-buzz-without-disabling-itFri, 12 Feb 2010 16:27:00 GMT<p>If you want people to see your buzzes, but like myself want to keep checking people's google reader shares IN google reader, and see twitter in twitter, you can hide the Buzz label. Go into settings > labels > buzz > hide</p><![CDATA[Why Google Needs Buzz]]>https://www.timbroder.com/2010/02/why-google-needs-buzzhttps://www.timbroder.com/2010/02/why-google-needs-buzzFri, 12 Feb 2010 14:34:00 GMT<p><a href="http://kevinrose.com/post/385156078">Why Google Needs Buzz</a>: "</p> <p>[![](<a href="https://feeds.feedburner.com/%7Eff/krose?i=Ma-">https://feeds.feedburner.com/%7Eff/krose?i=Ma-</a> a6KVRROg:XtH5NORu2hI:V_sGLiPBpWU)](<a href="https://feeds.feedburner.com/%7Eff/krose?a">https://feeds.feedburner.com/%7Eff/krose?a</a> =Ma-a6KVRROg:XtH5NORu2hI:V_sGLiPBpWU) [![](https://feeds.feedburner.com/%7Eff/k rose?d=7Q72WNTAKBA)](<a href="https://feeds.feedburner.com/%7Eff/krose?a=Ma-">https://feeds.feedburner.com/%7Eff/krose?a=Ma-</a> a6KVRROg:XtH5NORu2hI:7Q72WNTAKBA) [![](<a href="https://feeds.feedburner.com/%7Eff/krose">https://feeds.feedburner.com/%7Eff/krose</a> ?d=qj6IDK7rITs)](<a href="https://feeds.feedburner.com/%7Eff/krose?a=Ma-">https://feeds.feedburner.com/%7Eff/krose?a=Ma-</a> a6KVRROg:XtH5NORu2hI:qj6IDK7rITs) [![](https://feeds.feedburner.com/%7Eff/krose?i=Ma- a6KVRROg:XtH5NORu2hI:gIN9vFwOqvQ)](<a href="https://feeds.feedburner.com/%7Eff/krose?a">https://feeds.feedburner.com/%7Eff/krose?a</a> =Ma-a6KVRROg:XtH5NORu2hI:gIN9vFwOqvQ) [![](<a href="https://feeds.feedburner.com/%7Eff/k">https://feeds.feedburner.com/%7Eff/k</a> rose?d=yIl2AUoC8zA)](<a href="https://feeds.feedburner.com/%7Eff/krose?a=Ma-">https://feeds.feedburner.com/%7Eff/krose?a=Ma-</a> a6KVRROg:XtH5NORu2hI:yIl2AUoC8zA)</p><![CDATA[Google Buzz? Facebook Email?]]>https://www.timbroder.com/2010/02/google-buzz-facebook-emailhttps://www.timbroder.com/2010/02/google-buzz-facebook-emailWed, 10 Feb 2010 16:55:00 GMT<p><a href="http://www.google.com/buzz">Google Buzz</a> quetly came out, adds friendfeed like functionality to gmail</p> <p>Facebook is also <a href="http://gizmodo.com/5465353/facebook-eyes-webmail-with-project-titan">launching email</a>, interesting times ahead in the communication world.</p><![CDATA[Django Admin inline preview]]>https://www.timbroder.com/2010/02/django-admin-inline-previewhttps://www.timbroder.com/2010/02/django-admin-inline-previewTue, 09 Feb 2010 19:17:00 GMT<p>Update: This code lives on <a href="https://github.com/broderboy/django-admin-preview">Github</a></p> <p>To get inline Admin Previews in the list view</p> <ol> <li>Inherit from PreviewAdmin in your ModelAdmin</li> <li>In your model's template directory, create a folder called preview, and</li> </ol> <p>create a template for that model's preview</p> <p>Example for model Article</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token keyword">class</span> <span class="token class-name">ArticleAdmin</span><span class="token punctuation">(</span>PreviewAdmin<span class="token punctuation">,</span> other admin<span class="token punctuation">.</span>ModelAdmin<span class="token punctuation">,</span><span class="token punctuation">,</span><span class="token punctuation">,</span>_<span class="token punctuation">)</span><span class="token punctuation">:</span> list_display <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">,</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token string">'admin_slide_preview'</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> </code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span></span></pre></div> <p>then edit <code class="language-text">app_that_has_ArticleModel/templates/preview/article.html</code></p> <p>Whatever is in article.html will be shown inline<br> Access your Article object through {{ object }} in the template</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token keyword">class</span> <span class="token class-name">PreviewAdmin</span><span class="token punctuation">(</span>admin<span class="token punctuation">.</span>ModelAdmin<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token comment">#add to your ModelAdmin</span> <span class="token comment">#list_display = ('headline','created_date', 'state', 'admin_slide_preview')</span> <span class="token keyword">def</span> <span class="token function">admin_slide_preview</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> obj<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">return</span> <span class="token string">"&lt;div class=\"previewslide\" id=\"%s/preview/\">+&lt;/div>"</span> <span class="token operator">%</span> obj<span class="token punctuation">.</span><span class="token builtin">id</span> admin_slide_preview<span class="token punctuation">.</span>allow_tags <span class="token operator">=</span> <span class="token boolean">True</span> admin_slide_preview<span class="token punctuation">.</span>short_description <span class="token operator">=</span> <span class="token string">'Preview'</span> <span class="token keyword">def</span> <span class="token function">get_preview</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> request<span class="token punctuation">,</span> object_id<span class="token punctuation">)</span><span class="token punctuation">:</span> sub <span class="token operator">=</span> self<span class="token punctuation">.</span>queryset<span class="token punctuation">(</span>request<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> template <span class="token operator">=</span> <span class="token string">"preview/%s.html"</span> <span class="token operator">%</span> sub<span class="token punctuation">.</span>__class__<span class="token punctuation">.</span>__name__ <span class="token keyword">return</span> object_detail<span class="token punctuation">(</span>request<span class="token punctuation">,</span> queryset<span class="token operator">=</span>self<span class="token punctuation">.</span>queryset<span class="token punctuation">(</span>request<span class="token punctuation">)</span><span class="token punctuation">,</span> object_id<span class="token operator">=</span>object_id<span class="token punctuation">,</span> template_name<span class="token operator">=</span>template<span class="token punctuation">.</span>lower<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">def</span> <span class="token function">get_urls</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span> urls <span class="token operator">=</span> <span class="token builtin">super</span><span class="token punctuation">(</span>PreviewAdmin<span class="token punctuation">,</span> self<span class="token punctuation">)</span><span class="token punctuation">.</span>get_urls<span class="token punctuation">(</span><span class="token punctuation">)</span> my_urls <span class="token operator">=</span> patterns<span class="token punctuation">(</span><span class="token string">''</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">r'^(?P&lt;object_id>\d+)/preview/$'</span><span class="token punctuation">,</span> self<span class="token punctuation">.</span>get_preview<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token keyword">return</span> my_urls <span class="token operator">+</span> urls <span class="token keyword">class</span> <span class="token class-name">Media</span><span class="token punctuation">:</span> js <span class="token operator">=</span> js <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token string">'js/jquery.js'</span><span class="token punctuation">,</span> <span class="token string">'js/jquery.adminpreview.js'</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <div class="gatsby-highlight" data-language="css"><pre style="counter-reset: linenumber NaN" class="language-css line-numbers"><code class="language-css"><span class="token selector">//base.css .previewslide</span> <span class="token punctuation">{</span> <span class="token property">cursor</span><span class="token punctuation">:</span>pointer<span class="token punctuation">;</span> <span class="token property">cursor</span><span class="token punctuation">:</span>hand<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token selector">```javascript //jquery.adminpreview.js $(document).ready(function()</span><span class="token punctuation">{</span> <span class="token selector">$(".previewslide").click(function()</span><span class="token punctuation">{</span> <span class="token selector">$.ajax(</span><span class="token punctuation">{</span> <span class="token selector">url:$(this).attr('id'), context: $(this).parent().parent(), success:function(data)</span><span class="token punctuation">{</span> var $html = $<span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token selector">$('.previewed').each(function()</span><span class="token punctuation">{</span> $<span class="token punctuation">(</span>this<span class="token punctuation">)</span>.<span class="token function">remove</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token selector">if(!$html.hasClass('previewed'))</span><span class="token punctuation">{</span> $html.<span class="token function">addClass</span><span class="token punctuation">(</span><span class="token string">'previewed'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> $html.<span class="token function">addClass</span><span class="token punctuation">(</span>$<span class="token punctuation">(</span>this.context<span class="token punctuation">)</span>.<span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'class'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> $<span class="token punctuation">(</span>this.context<span class="token punctuation">)</span>.<span class="token function">after</span><span class="token punctuation">(</span>$html<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[Get the admin url for a django model]]>https://www.timbroder.com/2010/02/get-admin-url-for-django-modelhttps://www.timbroder.com/2010/02/get-admin-url-for-django-modelTue, 09 Feb 2010 18:48:00 GMT<p>Add this to your model to be able to get their admin change link from anywhere</p> <p>Useful if you want to jump to the admin screen of an object you are looking at on the front end</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token keyword">from</span> django<span class="token punctuation">.</span>core <span class="token keyword">import</span> urlresolvers <span class="token keyword">from</span> django<span class="token punctuation">.</span>contrib<span class="token punctuation">.</span>contenttypes<span class="token punctuation">.</span>models <span class="token keyword">import</span> ContentType <span class="token keyword">def</span> <span class="token function">get_admin_url</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span> content_type <span class="token operator">=</span> ContentType<span class="token punctuation">.</span>objects<span class="token punctuation">.</span>get_for_model<span class="token punctuation">(</span>self<span class="token punctuation">.</span>__class__<span class="token punctuation">)</span> <span class="token keyword">return</span> urlresolvers<span class="token punctuation">.</span>reverse<span class="token punctuation">(</span><span class="token string">"admin:%s_%s_change"</span> <span class="token operator">%</span> <span class="token punctuation">(</span>content_type<span class="token punctuation">.</span>app_label<span class="token punctuation">,</span> content_type<span class="token punctuation">.</span>model<span class="token punctuation">)</span><span class="token punctuation">,</span> args<span class="token operator">=</span><span class="token punctuation">(</span>self<span class="token punctuation">.</span><span class="token builtin">id</span><span class="token punctuation">,</span><span class="token punctuation">)</span><span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[Remaining character count in django admin]]>https://www.timbroder.com/2010/02/remaining-character-count-in-djangohttps://www.timbroder.com/2010/02/remaining-character-count-in-djangoMon, 01 Feb 2010 19:28:00 GMT<p>Update: This code also lives on <a href="https://github.com/broderboy/django-admin-remainingcharacters">Github</a></p> <p>Want to display the remaining characters on a text field in admin? (based off of maxlength or an override)</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token comment">#have your ModelAdmin inherit this to use</span> <span class="token keyword">class</span> <span class="token class-name">CounterAdmin</span><span class="token punctuation">(</span>admin<span class="token punctuation">.</span>ModelAdmin<span class="token punctuation">)</span><span class="token punctuation">:</span> counted_fields <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">#really for textareas</span> max_lengths <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token string">'abstract'</span><span class="token punctuation">:</span> <span class="token number">400</span><span class="token punctuation">,</span><span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name">Media</span><span class="token punctuation">:</span> js <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token string">'js/jquery.js'</span><span class="token punctuation">,</span> <span class="token string">'js/jquery.charCount.js'</span><span class="token punctuation">,</span><span class="token punctuation">)</span> <span class="token keyword">def</span> <span class="token function">formfield_for_dbfield</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> db_field<span class="token punctuation">,</span> <span class="token operator">**</span>kwargs<span class="token punctuation">)</span><span class="token punctuation">:</span> field <span class="token operator">=</span> <span class="token builtin">super</span><span class="token punctuation">(</span>CounterAdmin<span class="token punctuation">,</span> self<span class="token punctuation">)</span><span class="token punctuation">.</span>formfield_for_dbfield<span class="token punctuation">(</span>db_field<span class="token punctuation">,</span> <span class="token operator">**</span>kwargs<span class="token punctuation">)</span> <span class="token keyword">print</span> db_field<span class="token punctuation">.</span>name <span class="token keyword">print</span> self<span class="token punctuation">.</span>counted_fields <span class="token keyword">if</span> db_field<span class="token punctuation">.</span>name <span class="token keyword">in</span> self<span class="token punctuation">.</span>counted_fields<span class="token punctuation">:</span> <span class="token keyword">try</span><span class="token punctuation">:</span> <span class="token builtin">len</span> <span class="token operator">=</span> self<span class="token punctuation">.</span>max_lengths<span class="token punctuation">[</span>db_field<span class="token punctuation">.</span>name<span class="token punctuation">]</span> field<span class="token punctuation">.</span>widget<span class="token punctuation">.</span>attrs<span class="token punctuation">[</span><span class="token string">'maxlength'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">len</span> <span class="token keyword">except</span><span class="token punctuation">:</span> <span class="token keyword">pass</span> field<span class="token punctuation">.</span>widget<span class="token punctuation">.</span>attrs<span class="token punctuation">[</span><span class="token string">'class'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">'counted '</span> <span class="token operator">+</span> field<span class="token punctuation">.</span>widget<span class="token punctuation">.</span>attrs<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'class'</span><span class="token punctuation">,</span><span class="token string">''</span><span class="token punctuation">)</span> <span class="token keyword">return</span> field</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <div class="gatsby-highlight" data-language="javascript"><pre style="counter-reset: linenumber NaN" class="language-javascript line-numbers"><code class="language-javascript">jquery<span class="token punctuation">,</span>charCount<span class="token punctuation">.</span>js <span class="token comment">/* * Character Count Plugin - jQuery plugin * Dynamic character count for text areas and input fields * written by Alen Grakalic * http://cssglobe.com/post/7161/jquery-plugin-simplest-twitterlike-dynamic-character-count-for-textareas * * Copyright (c) 2009 Alen Grakalic (http://cssglobe.com) * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * * Built for jQuery library * http://jquery.com * */</span> <span class="token comment">/* * Modified 2010 Tim Broder for django-admin-charcount * https://gpowered.net */</span> <span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">$</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> $<span class="token punctuation">.</span>fn<span class="token punctuation">.</span><span class="token function-variable function">charCount</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">options</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment">// default configuration properties</span> <span class="token keyword">var</span> defaults <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token literal-property property">allowed</span><span class="token operator">:</span> <span class="token number">140</span><span class="token punctuation">,</span> <span class="token literal-property property">warning</span><span class="token operator">:</span> <span class="token number">20</span><span class="token punctuation">,</span> <span class="token literal-property property">css</span><span class="token operator">:</span> <span class="token string">'help'</span><span class="token punctuation">,</span> <span class="token literal-property property">counterElement</span><span class="token operator">:</span> <span class="token string">'p'</span><span class="token punctuation">,</span> <span class="token literal-property property">cssWarning</span><span class="token operator">:</span> <span class="token string">'warning'</span><span class="token punctuation">,</span> <span class="token literal-property property">cssExceeded</span><span class="token operator">:</span> <span class="token string">'exceeded'</span><span class="token punctuation">,</span> <span class="token literal-property property">counterText</span><span class="token operator">:</span> <span class="token string">''</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">var</span> options <span class="token operator">=</span> $<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span>defaults<span class="token punctuation">,</span> options<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">calculate</span><span class="token punctuation">(</span><span class="token parameter">obj</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">var</span> count <span class="token operator">=</span> <span class="token function">$</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">val</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>length<span class="token punctuation">;</span> <span class="token keyword">var</span> available <span class="token operator">=</span> options<span class="token punctuation">.</span>allowed <span class="token operator">-</span> count<span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>available <span class="token operator">&lt;</span> <span class="token operator">=</span> options<span class="token punctuation">.</span>warning <span class="token operator">&amp;&amp;</span> available <span class="token operator">>=</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">$</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">addClass</span><span class="token punctuation">(</span>options<span class="token punctuation">.</span>cssWarning<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token function">$</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">removeClass</span><span class="token punctuation">(</span>options<span class="token punctuation">.</span>cssWarning<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span><span class="token punctuation">(</span>available <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">$</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">addClass</span><span class="token punctuation">(</span>options<span class="token punctuation">.</span>cssExceeded<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token function">$</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">removeClass</span><span class="token punctuation">(</span>options<span class="token punctuation">.</span>cssExceeded<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">$</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">html</span><span class="token punctuation">(</span>options<span class="token punctuation">.</span>counterText <span class="token operator">+</span> available<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">each</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">after</span><span class="token punctuation">(</span><span class="token string">'&lt;'</span><span class="token operator">+</span> options<span class="token punctuation">.</span>counterElement <span class="token operator">+</span><span class="token string">' class="'</span> <span class="token operator">+</span> options<span class="token punctuation">.</span>css <span class="token operator">+</span> <span class="token string">'">'</span><span class="token operator">+</span> options<span class="token punctuation">.</span>counterText <span class="token operator">+</span><span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">calculate</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">keyup</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token function">calculate</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">change</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token function">calculate</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span>jQuery<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">/*function init_counters(selector, len){ $(selector).each(function() { //console.log($(this).attr('maxlength')); if(len==null){ len = $(this).attr('maxlength'); } $(this).charCount({ counterText: 'Characters Remaining: ', allowed: len, }); }); }*/</span> <span class="token function">$</span><span class="token punctuation">(</span>document<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">ready</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">".counted"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">each</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token function">$</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> len <span class="token operator">=</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'maxlength'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">charCount</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token literal-property property">counterText</span><span class="token operator">:</span> <span class="token string">'Characters Remaining: '</span><span class="token punctuation">,</span> <span class="token literal-property property">allowed</span><span class="token operator">:</span> len<span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//init_counters("input[maxlength]", 80);</span> <span class="token comment">//init_counters("textarea[maxlength]");</span> <span class="token comment">//init_counters("#id_abstract", 400);</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">/* * &lt;style type="text/css"> form .counter{ } form .warning{color:#600;} form .exceeded{color:#e00;} &lt;/style> */</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[Override QuerySet.delete() (one way of preventing cascading deletes)]]>https://www.timbroder.com/2010/01/override-querysetdelete-one-way-ofhttps://www.timbroder.com/2010/01/override-querysetdelete-one-way-ofThu, 07 Jan 2010 17:05:00 GMT<p>We needed to override the default QuerySet delete function to deal with a client problem that we were facing</p> <p>Yes This is monkey-patching, and probably bad practice but if anyone needs to conditionally override the cascading delete that django does at the application level from a queryset, this is how to do it</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token keyword">from</span> django<span class="token punctuation">.</span>db<span class="token punctuation">.</span>models<span class="token punctuation">.</span>query <span class="token keyword">import</span> QuerySet <span class="token comment">#save original delete method</span> orrigdelete <span class="token operator">=</span> QuerySet<span class="token punctuation">.</span>delete <span class="token keyword">def</span> <span class="token function">showdelete</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token comment">#add on to delete method</span> <span class="token keyword">for</span> test <span class="token keyword">in</span> self<span class="token punctuation">:</span> <span class="token keyword">if</span> <span class="token builtin">isinstance</span><span class="token punctuation">(</span>test<span class="token punctuation">,</span> YourObject<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">raise</span> Exception<span class="token punctuation">(</span><span class="token string">'someone tried to delete your object'</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token keyword">else</span><span class="token punctuation">:</span> <span class="token keyword">break</span> <span class="token comment">#call original delete</span> <span class="token keyword">return</span> orrigdelete<span class="token punctuation">(</span>self<span class="token punctuation">)</span> <span class="token comment">#set the queryset delete as our new method</span> QuerySet<span class="token punctuation">.</span>delete <span class="token operator">=</span> showdelete</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[A quick way to display your delicious links by tag]]>https://www.timbroder.com/2010/01/quick-way-to-display-your-delicioushttps://www.timbroder.com/2010/01/quick-way-to-display-your-deliciousTue, 05 Jan 2010 14:46:00 GMT<p>quick, dirty, and slow with lots of tags</p> <div class="gatsby-highlight" data-language="html"><pre style="counter-reset: linenumber NaN" class="language-html line-numbers"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text/javascript<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">function</span> <span class="token function">goforit</span> <span class="token punctuation">(</span><span class="token parameter">posts</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">(</span> <span class="token keyword">var</span> tagname <span class="token keyword">in</span> posts <span class="token punctuation">)</span> <span class="token punctuation">{</span> document<span class="token punctuation">.</span><span class="token function">writeln</span><span class="token punctuation">(</span><span class="token string">'&lt;scr'</span><span class="token operator">+</span><span class="token string">'ipt type="text/javascript" src="http://feeds.delicious.com/v2/js/NYCEndurance/'</span> <span class="token operator">+</span> tagname <span class="token operator">+</span> <span class="token string">'?title='</span> <span class="token operator">+</span> tagname <span class="token operator">+</span> <span class="token string">'&amp;icon;=s&amp;count;=100&amp;sort;=alpha&amp;tags;">&lt;/scr'</span><span class="token operator">+</span><span class="token string">'ipt>'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text/javascript<span class="token punctuation">"</span></span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://feeds.delicious.com/v2/json/tags/NYCEndurance?callback=goforit<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[Jack Vs Spider and Happy Holidays]]>https://www.timbroder.com/2009/12/jack-vs-spider-and-happy-holidayshttps://www.timbroder.com/2009/12/jack-vs-spider-and-happy-holidaysThu, 24 Dec 2009 15:46:00 GMT<p>Happy Holidays and thanks everyone for a great year.</p> <p>Check out my company's holiday E-card <a href="https://www.alexanderinteractive.com/holiday/2009/">here</a></p> <p>Our VP of Security takes on an 8 legged intruder</p> <p><a href="http://www.youtube.com/watch?v=HZB3N9bqBSg"><img src="https://img.youtube.com/vi/HZB3N9bqBSg/0.jpg" alt=""></a></p><![CDATA[Django gets Multi-DB]]>https://www.timbroder.com/2009/12/django-gets-multi-dbhttps://www.timbroder.com/2009/12/django-gets-multi-dbTue, 22 Dec 2009 19:58:00 GMT<p>For his Google Summer of Code project <a href="http://lazypython.blogspot.com/">Alex Gaynor</a> added Multiple Database support to Django, which just got pushed to Trunk.</p> <p>The Documentation is available <a href="http://docs.djangoproject.com/en/dev/topics/db/multi-db/">here</a>.</p> <p>Some of the offhand benifits I can see:</p> <ol> <li>Multiple of databases. Got some legacy systems you don't want to migrate but have access to the data? no problem</li> <li>Have a read and a write database. Want one of your databases to speed up by configuring faster indexes and disabling writes? done.</li> <li>Multiple TYPES of databases. This is the one I'm most excited about. This is going to enable people to use some of the NoSQL databases (<a href="http://www.mongodb.org/">MongoDB</a>, <a href="http://couchdb.apache.org/">CouchDB</a>, see <a href="http://en.wikipedia.org/wiki/NoSQL#List_of_NoSQL_open_source_projects">here </a>for a more complete list)</li> </ol> <p>For a great application of MongoDB on a news site see <a href="http://www.businessinsider.com/how-we-use-mongodb-2009-11">Business Insider</a></p><![CDATA[Share Google Reader folders with friends]]>https://www.timbroder.com/2009/12/share-google-reader-folders-withhttps://www.timbroder.com/2009/12/share-google-reader-folders-withTue, 22 Dec 2009 17:09:00 GMT<p>A quick rundown on how to share whole folders with friends so they can see what you are reading, there might be an easier way to do this but this was the quickest I found</p> <ol> <li>Click explore</li> <li>click "View all recommendations"</li> </ol> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">![](https://1.bp.blogspot.com/_Ng3QbVQfLZ8/SzD8khAOeNI/AAAAAAAAeX4/RBFGgN8O-B8/s1600-h/read1.png)</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <ol start="3"> <li> <p>click Browse</p> </li> <li> <p>click Create a bundle</p> </li> </ol> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">![](https://3.bp.blogspot.com/_Ng3QbVQfLZ8/SzD88D6_mgI/AAAAAAAAeYA/6QirJn9t9fc/s1600-h/read2.png) </code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <ol start="5"> <li> <p>Fill out the form and drag folders or individual feeds.</p> </li> </ol> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">![](http://2.bp.blogspot.com/_Ng3QbVQfLZ8/SzD9LFlFG9I/AAAAAAAAeYI/MRJizzHj1Sc/s640/read3.png) </code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <ol start="6"> <li>After this is done you can email the bundle to your friends</li> </ol><![CDATA[Sneak some advanced logic into a Django template]]>https://www.timbroder.com/2009/12/sneak-some-advanced-logic-into-djangohttps://www.timbroder.com/2009/12/sneak-some-advanced-logic-into-djangoThu, 17 Dec 2009 17:03:00 GMT<p>I was adding on an app to a Django project at work where I was overriding an existing template but did not have access to the view that called that template. I was left in a scenario where I had the variables that the view was originally set up with, but non of the new models that I had added.</p> <p>In a filter you can do whatever logic you want, and then pass information back to the view. Please keep in mind, this is probably a horrible practice, but it does have its uses. In this specific scenario I needed to query the new models without modifying the existing view, solution: add a filter and do the querying there.</p> <p>This is the filter that I used to do the querying:</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token punctuation">{</span><span class="token operator">%</span> verbatim <span class="token operator">%</span><span class="token punctuation">}</span> <span class="token keyword">from</span> django <span class="token keyword">import</span> template <span class="token keyword">from</span> stager<span class="token punctuation">.</span>jira<span class="token punctuation">.</span>models <span class="token keyword">import</span> JiraProject<span class="token punctuation">,</span> ProjectLink <span class="token keyword">from</span> stager<span class="token punctuation">.</span>staging<span class="token punctuation">.</span>models <span class="token keyword">import</span> <span class="token operator">*</span> register <span class="token operator">=</span> template<span class="token punctuation">.</span>Library<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">def</span> <span class="token function">has_jira</span><span class="token punctuation">(</span>value<span class="token punctuation">,</span> arg<span class="token punctuation">)</span><span class="token punctuation">:</span> client <span class="token operator">=</span> Client<span class="token punctuation">.</span>objects<span class="token punctuation">.</span>get<span class="token punctuation">(</span>path<span class="token operator">=</span>value<span class="token punctuation">)</span> project <span class="token operator">=</span> client<span class="token punctuation">.</span>projects<span class="token punctuation">.</span>get<span class="token punctuation">(</span>path<span class="token operator">=</span>arg<span class="token punctuation">)</span> <span class="token keyword">try</span><span class="token punctuation">:</span> jiras <span class="token operator">=</span> ProjectLink<span class="token punctuation">.</span>objects<span class="token punctuation">.</span>get<span class="token punctuation">(</span>ClientProject<span class="token operator">=</span>project<span class="token punctuation">)</span><span class="token punctuation">.</span>JiraProject<span class="token punctuation">.</span>exclude<span class="token punctuation">(</span>filter_id<span class="token operator">=</span><span class="token string">''</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token boolean">True</span> <span class="token keyword">except</span><span class="token punctuation">:</span> <span class="token keyword">return</span> <span class="token boolean">False</span> register<span class="token punctuation">.</span><span class="token builtin">filter</span><span class="token punctuation">(</span><span class="token string">'has_jira'</span><span class="token punctuation">,</span> has_jira<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token operator">%</span> endverbatim <span class="token operator">%</span><span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Then, in my template:</p> <div class="gatsby-highlight" data-language="html"><pre style="counter-reset: linenumber NaN" class="language-html line-numbers"><code class="language-html">{% verbatim %} {% load has_jira %} {% if client.path|has_jira:project.path %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>jira/projects<span class="token punctuation">"</span></span> <span class="token punctuation">></span></span>Jira<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">></span></span> {% endif %} {% endverbatim %}</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>A more general example if this would be to work around the annoyance of not being able to have multiple tests in an if statement in a template: You can’t do <code class="language-text">{% verbatim %} {% if this and that %} {% endverbatim %}</code></p> <p>A solution would be:</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token punctuation">{</span><span class="token operator">%</span> verbatim <span class="token operator">%</span><span class="token punctuation">}</span> <span class="token keyword">def</span> <span class="token function">if_and</span><span class="token punctuation">(</span>value<span class="token punctuation">,</span> arg<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">if</span> value <span class="token keyword">and</span> arg<span class="token punctuation">:</span> <span class="token keyword">return</span> <span class="token boolean">True</span> <span class="token keyword">else</span><span class="token punctuation">:</span> <span class="token keyword">return</span> <span class="token boolean">False</span> <span class="token keyword">def</span> <span class="token function">if_or</span><span class="token punctuation">(</span>value<span class="token punctuation">,</span> arg<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">if</span> value <span class="token keyword">or</span> arg<span class="token punctuation">:</span> <span class="token keyword">return</span> <span class="token boolean">True</span> <span class="token keyword">else</span><span class="token punctuation">:</span> <span class="token keyword">return</span> <span class="token boolean">False</span> <span class="token punctuation">{</span><span class="token operator">%</span> endverbatim <span class="token operator">%</span><span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <div class="gatsby-highlight" data-language="html"><pre style="counter-reset: linenumber NaN" class="language-html line-numbers"><code class="language-html">{% verbatim %} {% if True|if_and:False %} show {% else %} don't show {% endif %} {% endverbatim %}</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Let me know your thoughts, pros/cons of this method.</p> <p>Ai's stager project is open source and can be found at [github](<a href="http://github.com/aiaio/ai-stager">http://github.com/aiaio/ai-stager</a></p><![CDATA[We fix while we eat]]>https://www.timbroder.com/2009/12/we-fix-while-we-eathttps://www.timbroder.com/2009/12/we-fix-while-we-eatThu, 10 Dec 2009 16:48:00 GMT<p>Hey, thats me!</p> <p>[We fix while we eat](<a href="https://www.alexanderinteractive.com/blog/2009/12/we-fix-">https://www.alexanderinteractive.com/blog/2009/12/we-fix-</a> while-we-eat.html): "</p> <p><img src="https://www.alexanderinteractive.com/blog/IMAG0015.jpg" alt=""><br> Ai's David Napolitan and <a href="https://www.alexanderinteractive.com/blog/author/tim-broder-1/">Tim Broder</a> fix a late night production bug</p><![CDATA[Google Wave Invites]]>https://www.timbroder.com/2009/12/google-wave-inviteshttps://www.timbroder.com/2009/12/google-wave-invitesThu, 10 Dec 2009 15:01:00 GMT<p>I have quite a few Google Wave invites left, if you would like one <a href="mailto:timothy.broder@gmail.com">email</a> me, <a href="http://www.twitter.com/">@broderboy</a> me, or leave a comment below. In all cases, please leave the email address to send the invite to.</p><![CDATA[Take your batch into the cloud]]>https://www.timbroder.com/2009/11/take-your-batch-into-cloudhttps://www.timbroder.com/2009/11/take-your-batch-into-cloudMon, 16 Nov 2009 22:07:00 GMT<p>From the work blog:</p> <p><a href="https://www.alexanderinteractive.com/blog/2009/11/take-your-batch-into-the-cloud.html">Take your batch into the cloud</a>: "</p> <p>About a year ago I wrote a webapp called <a href="http://twitter2gtalk.appspot.com">twitter2gtalk</a>, which simply takes your latest Twitter message and sets it as your Google <a href="http://www.google.com/talk/">Talk </a>Status. Shortly there after I attended an <a href="http://code.google.com/appengine/">App Engine</a> Hackathon (GAE) at Google NYC. At the hackathon, I started porting the app over to app engine. At the time, there was no scheduling or cron support in GAE. I created a hybrid app running between GAE and my webfaction server. My webfaction server would handle the cron, proxy out the requests, and do some of the longer running tasks (the limit on an app engine request is 20 seconds).</p> <p>Now with the release of the <a href="http://code.google.com/appengine/docs/python/config/cron.html">Task Scheduler</a> and <a href="http://code.google.com/appengine/docs/python/taskqueue/">Task Queues</a>, you can break up a long winded process into the cloud. My batch was taking around 18 minutes to run, with about 800 users being processed each time. For each user the app had to get their Twitter status, then connect to Google's xmpp server, and after a couple of xmpp calls, update the Google Talk Status. Even being single threaded, this whole process started eating up a lot of juice on the server. The rest of my apache processes suffered and the entire site slowed down</p> <p>Using the new app engine features, I was able to do two things: 1) Move the scheduling into app engine itself and 2) have app engine do the bulk of the work, by having each user-update be its own task. These worker tasks are then processed anywhere in the cloud, and can be run in parallel, independently of each other</p> <p>The original code was something like:</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text"> for users in all my users: get twitter status connect to gtalk get current status update status</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>My process for converting this to app engine tasks was as follows:</p> <ol> <li>Create a process to load all of the users into a Task Queue</li> <li>Set up each Task Queue so that it can independently do the work for the</li> </ol> <p>user that it is associated with</p> <ol> <li>Schedule Step 1 to run every half hour</li> </ol> <p>Skeleton Code for Step 1:</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"> <span class="token keyword">class</span> <span class="token class-name">TaskLoader</span><span class="token punctuation">(</span>BaseRequestHandler<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">def</span> <span class="token function">get</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span> logging<span class="token punctuation">.</span>info<span class="token punctuation">(</span><span class="token string">"Starting to load tasks %s"</span> <span class="token operator">%</span> datetime<span class="token punctuation">.</span>datetime<span class="token punctuation">.</span>now<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> users <span class="token operator">=</span> Account<span class="token punctuation">.</span>gql<span class="token punctuation">(</span><span class="token string">'WHERE active = :1'</span><span class="token punctuation">,</span> <span class="token boolean">True</span><span class="token punctuation">)</span> count <span class="token operator">=</span> <span class="token number">0</span> <span class="token keyword">for</span> user <span class="token keyword">in</span> users<span class="token punctuation">:</span> send_key <span class="token operator">=</span> <span class="token comment"># data to send to the worker </span> taskqueue<span class="token punctuation">.</span>add<span class="token punctuation">(</span>url<span class="token operator">=</span><span class="token string">'/worker/'</span><span class="token punctuation">,</span> params<span class="token operator">=</span><span class="token punctuation">{</span><span class="token string">'key'</span><span class="token punctuation">:</span> send_key<span class="token punctuation">}</span><span class="token punctuation">)</span> count <span class="token operator">+=</span> <span class="token number">1</span> logging<span class="token punctuation">.</span>info<span class="token punctuation">(</span><span class="token string">"Ended load tasks (%d users) %s"</span> <span class="token operator">%</span> <span class="token punctuation">(</span>count<span class="token punctuation">,</span> datetime<span class="token punctuation">.</span>datetime<span class="token punctuation">.</span>now<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> </code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>The Url call for this method: ('/taskloader/', TaskLoader),</p> <p>The Skeleton code for step 2:</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"> <span class="token keyword">class</span> <span class="token class-name">TaskWorker</span><span class="token punctuation">(</span>BaseRequestHandler<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">def</span> <span class="token function">post</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span> key <span class="token operator">=</span> self<span class="token punctuation">.</span>request<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'key'</span><span class="token punctuation">)</span> t <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">.</span>join<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">"http://django.gpowered.net/xmppproxy/"</span><span class="token punctuation">,</span> key<span class="token punctuation">]</span><span class="token punctuation">)</span> logging<span class="token punctuation">.</span>info<span class="token punctuation">(</span><span class="token string">"URL !%s!"</span> <span class="token operator">%</span> t<span class="token punctuation">)</span> result <span class="token operator">=</span> urlfetch<span class="token punctuation">.</span>fetch<span class="token punctuation">(</span>t<span class="token punctuation">,</span> <span class="token boolean">None</span><span class="token punctuation">,</span> urlfetch<span class="token punctuation">.</span>GET<span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token string">'Cache-Control'</span><span class="token punctuation">:</span><span class="token string">'no-cache,max-age=0'</span><span class="token punctuation">,</span> <span class="token string">'Pragma'</span><span class="token punctuation">:</span>'no<span class="token operator">-</span> cache'<span class="token punctuation">}</span><span class="token punctuation">)</span> </code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Url call for this method: ('/worker/', TaskWorker),</p> <p>So, TaskLoader loads all of the users into the Task queue. App Engine processes these when it has the cpu cycles to do so, and for each of these, TaskWorker is called</p> <p>I can schedule these using cron.yaml in my project:</p> <p>cron:</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">description: load the task queue url: /taskloader/ schedule: every 30 minutes </code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span></span></pre></div> <p>This is a general overview of how to break up your batch in to smaller, easier to manage tasks. Please see the App Engine <a href="http://code.google.com/appengine/docs/python/overview.html">documentation </a>for more detailed information.</p><![CDATA[Online advertising moving to.... your car?]]>https://www.timbroder.com/2009/11/online-advertising-moving-to-your-carhttps://www.timbroder.com/2009/11/online-advertising-moving-to-your-carTue, 10 Nov 2009 22:38:00 GMT<p>Another one of mine on the work blog -</p> <p><a href="https://www.alexanderinteractive.com/blog/2009/11/online-advertising-moving-to-your-car.html">Online advertising moving to.... your car?</a>:</p> <blockquote> <p>With the release of [Android</p> </blockquote> <p>2.0](<a href="http://developer.android.com/sdk/android-2.0-highlights.html">http://developer.android.com/sdk/android-2.0-highlights.html</a>) on the Motorola [Droid](<a href="http://www.motorola.com/Consumers/US-EN/Consumer-Product-and-">http://www.motorola.com/Consumers/US-EN/Consumer-Product-and-</a> Services/Mobile-Phones/Motorola-DROID-US-EN), the Google Maps for Mobile application brings turn by turn GPS navigation (with voice) to your car. A great feature by far, it actually made Garmin and TomTom's stocks [tank](http: //<a href="http://www.wiseandroid.com/NewsItem.aspx?category=News&#x26;path=October&#x26;itemid=37">www.wiseandroid.com/NewsItem.aspx?category=News&#x26;path=October&#x26;itemid=37</a>), but what does it mean for the future?</p> <p>Currently adwords is all over the web; on pages, in your mail, on maps. Now picture this possibility and keep in mind this is all hypothetical: You are using Navigator to get you to the local movie theater and it randomly chimes in with 'You are about to pass Joe's Pizza!' This could be good and bad. Good because you might be able to set the navigator to find restaurants you've never tried and didn't know were there. Bad because it could get annoying. Good because it would open up a whole new form of advertising for small businesses.</p> <p>Either way, just something to think about, times are changing with all the technology we now carry around in our pockets.</p><![CDATA[Google’s Christmas gift to America is free Wi-Fi at airports starting today (reblog)]]>https://www.timbroder.com/2009/11/googles-christmas-gift-to-america-ishttps://www.timbroder.com/2009/11/googles-christmas-gift-to-america-isTue, 10 Nov 2009 21:03:00 GMT<p><a href="http://feedproxy.google.com/~r/TheBoyGeniusReport/~3/XoTZjgYPRM4/">Google’s Christmas gift to America is free Wi-Fi at airports starting today</a>:</p> <p><img src="https://media.boygeniusreport.com/wp-content/uploads/2009/11/google-xmas-wifi.jpg" alt="google-xmas-wifi"></p> <blockquote> <p>Those that hate Google but travel frequently might feel a bit conflicted over</p> </blockquote> <p>the next couple of months because of Google’s holiday gift to America. Starting today and ending on January 15th, Google will be offering up free, no strings attached Wi-Fi at 47 airports while Virgin American flyers will be getting free in-flight Wi-Fi as of the 18th. The In addition to this, Google has set up a way for travelers at each airport to donate to charities Engineers Without Borders, the One Economy Corporation and Climate Savers Computing Initiative. Google will match each airports donations up to $250,000 and will also give the most generous airport $15,000 for the charity of its choosing.</p> <p><a href="http://www.google.com/intl/en/press/pressrel/20091110_free_airport_wifi_holiday.html">Read</a></p> <p><img src="https://feeds.feedburner.com/~r/TheBoyGeniusReport/~4/XoTZjgYPRM4" alt=""></p><![CDATA[Google Wave as a Project Collaboration Tool]]>https://www.timbroder.com/2009/10/google-wave-as-project-collaborationhttps://www.timbroder.com/2009/10/google-wave-as-project-collaborationThu, 29 Oct 2009 17:21:00 GMT<p>I'm a'bloggin on the company blog! (Alexander Interactive) <a href="https://www.alexanderinteractive.com/blog/2009/10/google-wave-as-a-project-collaboration-tool.html">Google Wave as a Project Collaboration Tool</a>:</p> <p>If you aren't already familiar with Google Wave, check out some basic info, and a very in-depth video <a href="http://wave.google.com/help/wave/about.html">here</a>. Wave is a new project from Google that reinvents email communication. Forget everything you know about email, it was invented back in the 70's, things have changed; technology is faster, we have cloud computing, web apps look fancier, and for a while, a large portion of email users are moving (back) to web based clients.</p> <p>Email is the current method of communication and collaboration when working on a project. You usually have a folder for that project in Outlook, some rules to filter project related messages into that folder, and an email chain for each issue. People reply to messages inside that chain somewhere, the thread gets continued, people get added to the thread, people drop off. You don't know where you are in the chain when you check in a few hours later, and you get bombarded by... STOP!</p> <p>Wave is very early in its adoption, it's invite only, but it has the strong potential to fix a lot of these problems. It can clean up a lot of the clutter of project communication and throw it on the cloud so you can get to it anywhere. Wave does need some more security built in for the corporate settings, but that is in the pipeline. Right now waves can only be private or public, but once inside a private wave, that user can invite anyone.</p> <p>Some notes on how Wave can help a project:</p> <ul> <li> <p>Each Project would get its own folder in wave</p> </li> <li> <p>Anyone working on the project would have access to this folder</p> </li> <li> <p>Every issue or conversation would get its own wave and everyone who needs to be involved in the issue is added to the wave.</p> </li> <li> <p>At this point every project related message is confined to the projects folder. No Outlook rules or message dragging will ever be needed. If a new person needs to be involved in the discussion, they are just added to the wave, no forwarding or reply-all.</p> </li> <li> <p>The conversation can continue similar to email, with individual replies, but it can be so much more. In line replies with related topics can appear right with the original topic, not hidden down 6 replies in an email chain</p> </li> <li> <p>You can show only new replies on the wave and get caught back up in the discussion quickly</p> </li> <li> <p>You can do a playback of all or part of the discussion and see who chimed in and when</p> </li> <li> <p>Need to share documents? You will eventually be able to drag them right out of your file system into the browser and into the wave. (This is currently only supported for pictures)</p> </li> </ul> <p>As I said, Wave is very early in its adoption, but after more people join, and more developer plugins come out, I think it will be a very valuable tool both in the workplace and at home.</p><![CDATA[Use Google Voice with your existing number]]>https://www.timbroder.com/2009/10/use-google-voice-with-your-existinghttps://www.timbroder.com/2009/10/use-google-voice-with-your-existingTue, 27 Oct 2009 14:17:00 GMT<p>WOOHOO!!!! It's working on my verizon blackberry!</p> <p>"Up until now, if you wanted to use <a href="http://google.com/voice">Google Voice</a>, you needed to choose a new number (a "Google number"). Taking calls through your Google number allows us to offer features like call recording, call screening and getting text messages via email. But we know not everyone wants to switch to a new phone number, so it made sense for us to create a lighter version of Google Voice for people who are willing to trade some features for the ability to use their existing numbers.</p> <p>We're excited to announce that you now have the choice to get Google Voice with your existing mobile number OR with a Google number.</p> <p>If you sign up using your existing number, you'll still get many of Google Voice's features. Most notably, you'll get all the functionality of Google voicemail, as explained in this video:</p> <p>[](<a href="http://www.youtube.com/v/Ua9Q5frlQ2M&#x26;rel=0&#x26;color1=0xb1b1b1&#x26;color2=0xcfcfcf&#x26;">http://www.youtube.com/v/Ua9Q5frlQ2M&#x26;rel=0&#x26;color1=0xb1b1b1&#x26;color2=0xcfcfcf&#x26;</a> hl=en&#x26;feature=player_embedded&#x26;fs=1)[](<a href="http://www.youtube.com/v/Ua9Q5frlQ2M&#x26;rel">http://www.youtube.com/v/Ua9Q5frlQ2M&#x26;rel</a> =0&#x26;color1=0xb1b1b1&#x26;color2=0xcfcfcf&#x26;hl=en&#x26;feature=player_embedded&#x26;fs=1)[](http: //<a href="http://www.youtube.com/v/Ua9Q5frlQ2M&#x26;rel=0&#x26;color1=0xb1b1b1&#x26;color2=0xcfcfcf&#x26;hl=en&#x26;fe">www.youtube.com/v/Ua9Q5frlQ2M&#x26;rel=0&#x26;color1=0xb1b1b1&#x26;color2=0xcfcfcf&#x26;hl=en&#x26;fe</a> ature=player_embedded&#x26;fs=1)[](<a href="http://www.youtube.com/v/Ua9Q5frlQ2M&#x26;rel=0&#x26;color">http://www.youtube.com/v/Ua9Q5frlQ2M&#x26;rel=0&#x26;color</a> 1=0xb1b1b1&#x26;color2=0xcfcfcf&#x26;hl=en&#x26;feature=player_embedded&#x26;fs=1)[](<a href="http://www.yo">http://www.yo</a> utube.com/v/Ua9Q5frlQ2M&#x26;rel=0&#x26;color1=0xb1b1b1&#x26;color2=0xcfcfcf&#x26;hl=en&#x26;feature=pl ayer_embedded&#x26;fs=1)[](<a href="http://www.youtube.com/v/Ua9Q5frlQ2M&#x26;rel=0&#x26;color1=0xb1b1">http://www.youtube.com/v/Ua9Q5frlQ2M&#x26;rel=0&#x26;color1=0xb1b1</a> b1&#x26;color2=0xcfcfcf&#x26;hl=en&#x26;feature=player_embedded&#x26;fs=1)[](<a href="http://www.youtube.co">http://www.youtube.co</a> m/v/Ua9Q5frlQ2M&#x26;rel=0&#x26;color1=0xb1b1b1&#x26;color2=0xcfcfcf&#x26;hl=en&#x26;feature=player_emb edded&#x26;fs=1)[](<a href="http://www.youtube.com/v/Ua9Q5frlQ2M&#x26;rel=0&#x26;color1=0xb1b1b1&#x26;color">http://www.youtube.com/v/Ua9Q5frlQ2M&#x26;rel=0&#x26;color1=0xb1b1b1&#x26;color</a> 2=0xcfcfcf&#x26;hl=en&#x26;feature=player_embedded&#x26;fs=1)</p> <p>If you already have a Google Voice account, you can [add Google voicemail](htt p://<a href="http://www.google.com/support/voice/bin/answer.py?hl=en&#x26;answer=164652">www.google.com/support/voice/bin/answer.py?hl=en&#x26;answer=164652</a>) to any mobile phone you've linked to your account. If you're not yet using Google Voice, you can <a href="https://services.google.com/fb/forms/googlevoiceinvite/">request an invite</a> or ask a friend with a Google Voice account to send you an invitation. When you receive the invitation to sign up, you can choose to use Google Voice with your existing number — or to get a Google number for additional features.</p> <p>Google Voice is about giving you more control over your communications. We hope this new option makes it easier for you to manage your messages and personalize your voicemail experience."</p><![CDATA[Google Wave checker for firefox]]>https://www.timbroder.com/2009/10/google-wave-checker-for-firefoxhttps://www.timbroder.com/2009/10/google-wave-checker-for-firefoxWed, 14 Oct 2009 20:12:00 GMT<p>I'm liking google wave so far (not loving yet, but there aren't that many people on it yet), but one of the annoying things was actually having to be in the app to see if I have new waves. <a href="https://addons.mozilla.org/en-US/firefox/addon/14973">Firefox plugin</a>, problem solved!</p> <p><img src="https://1.bp.blogspot.com/_Ng3QbVQfLZ8/StYwiumOMGI/AAAAAAAAeDM/0zzwORULv6s/s1600-h/2009-10-14_1611_001.png" alt=""></p><![CDATA[Firefox Keyboard and Mouse Shortcuts]]>https://www.timbroder.com/2009/10/firefox-keyboard-and-mouse-shortcutshttps://www.timbroder.com/2009/10/firefox-keyboard-and-mouse-shortcutsMon, 05 Oct 2009 15:06:00 GMT<p><a href="http://www.mouserunner.com/FF_Shortcuts1Printable.html">Here is a list</a> of Firefox keyboard and mouse shortcuts for each of the three major operating systems organized by topic.</p><![CDATA[Checking if a remote file exists in python]]>https://www.timbroder.com/2009/09/checking-if-remote-file-exists-inhttps://www.timbroder.com/2009/09/checking-if-remote-file-exists-inWed, 30 Sep 2009 19:51:00 GMT<p>Normally, to check if a remote web file exists I would use urllib's getcode() but that is a 2.6 and newer feature. In Python 2.5 its a little more interesting. Thankfully, wget's spider command can help us out.</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token keyword">from</span> subprocess <span class="token keyword">import</span> Popen<span class="token punctuation">,</span> PIPE <span class="token keyword">def</span> <span class="token function">url_exists</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token punctuation">:</span> command <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">"wget"</span><span class="token punctuation">,</span> <span class="token string">"-S"</span><span class="token punctuation">,</span> <span class="token string">"--spider"</span><span class="token punctuation">,</span> url<span class="token punctuation">]</span> p <span class="token operator">=</span> Popen<span class="token punctuation">(</span>command<span class="token punctuation">,</span> stdout<span class="token operator">=</span>PIPE<span class="token punctuation">,</span> stderr<span class="token operator">=</span>PIPE<span class="token punctuation">)</span> stdout<span class="token punctuation">,</span> stderr <span class="token operator">=</span> p<span class="token punctuation">.</span>communicate<span class="token punctuation">(</span><span class="token punctuation">)</span> exists <span class="token operator">=</span> stderr<span class="token punctuation">.</span>find<span class="token punctuation">(</span><span class="token string">'ERROR 404'</span><span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token builtin">int</span><span class="token punctuation">(</span>exists<span class="token punctuation">)</span> <span class="token operator">></span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">:</span> <span class="token keyword">return</span> <span class="token boolean">False</span> <span class="token keyword">else</span><span class="token punctuation">:</span> <span class="token keyword">return</span> <span class="token boolean">True</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[Twitter get phone calls, Facebook gets voice chat]]>https://www.timbroder.com/2009/09/twitter-get-phone-calls-facebook-getshttps://www.timbroder.com/2009/09/twitter-get-phone-calls-facebook-getsFri, 18 Sep 2009 19:40:00 GMT<p>Twitter users on Thursday will, for the first time, be able to <a href="http://digg.com/d314ZwX">make voice calls</a> directly to each other through the microblogging service.</p> <p>Look out, Facebook users: <a href="http://digg.com/d314NzW">Here comes voice chat</a>.</p> <p>Sometime in the next few weeks, the social network's tens of millions of users will begin to be able to have high-quality voice conversations, even as its third-party developers are able to start including voice in their applications.</p><![CDATA[Fight Gone Bad IV]]>https://www.timbroder.com/2009/09/fight-gone-bad-ivhttps://www.timbroder.com/2009/09/fight-gone-bad-ivThu, 10 Sep 2009 19:18:00 GMT<p>Anyone want to help me out by donating?</p> <p><a href="http://feedproxy.google.com/~r/timbroder/~3/PDBIQvyH3rY/">Fight Gone Bad IV</a>:</p> <p>On Sept 26th I am competing in Fight Gone Bad IV to raise money for Wounded Warriors and Athletes for a cure.  Fight gone bad is a CrossFit workout scored by the number of reps.</p> <p>Description from the <a href="http://www.crossfit.com/cf-info/faq.html#WOD2">CrossFit website</a></p> <p><strong>4.3. Explain Fight Gone Bad</strong> In this workout you move from each of five stations after a minute. This is a five-minute round from which a one-minute break is allowed before repeating. We’ve used this in 3 and 5 round versions. The stations are:</p> <ol> <li>Wall-ball: 20 pound ball, 10 ft target. (Reps)</li> <li>Sumo deadlift high-pull: 75 pounds (Reps)</li> <li>Box Jump: 20″ box (Reps)</li> <li>Push-press: 75 pounds (Reps)</li> <li>Row: calories (Calories)</li> </ol> <p>The clock does not reset or stop between exercises. On call of “rotate,” the athlete/s must move to next station immediately for good score. One point is given for each rep, except on the rower where each calorie is one point.</p> <p>If you can, <a href="http://bit.ly/2N8ifX">please donate</a> to help me support these initiatives</p><![CDATA[Location, Location, Location]]>https://www.timbroder.com/2009/08/location-location-locationhttps://www.timbroder.com/2009/08/location-location-locationSat, 29 Aug 2009 18:39:00 GMT<p>This will be pretty cool when it comes out</p> <p><a href="http://blog.twitter.com/2009/08/location-location-location.html">Location, Location, Location</a>: "<img src="https://3.bp.blogspot.com/_E8ZD85Wzu9E/So20MKF3WiI/AAAAAAAAAnw/QjXxH9JTBGM/s1600-h/iStock_000006260161Small.jpg" alt="">Twitter platform developers have been doing innovative work with location for some time despite having access to only a rudimentary level of API support. Most of the location-based projects we see are built using the simple, account-level location field folks can fill out as part of their profile. Since anything can be written in this field, it's interesting but not very dependable.</p> <p>We're gearing up to launch a new feature which makes Twitter truly location- aware. A new API will allow developers to add latitude and longitude to any tweet. Folks will need to activate this new feature by choice because it will be off by default and the exact location data won't be stored for an extended period of time. However, if people do opt-in to sharing location on a tweet- by-tweet basis, compelling context will be added to each burst of information.</p> <p>For example, with accurate, tweet-level location data you could switch from reading the tweets of accounts you follow to reading tweets from anyone in your neighborhood or city—whether you follow them or not. It's easy to imagine how this might be interesting at an event like a concert or even something more dramatic like an earthquake. There will likely be many use cases we haven't even thought of yet which is part of what makes this so exciting.</p> <p>Developer Preview</p> <p>We're going to release geolocation to platform developers before we add the feature to Twitter.com. Most of the mobile applications people use and love are built by Twitter platform developers. Developers will have access to this new geolocation feature early which means it will most likely be available on your app of choice before it's available on Twitter's web site. Later, we'll add it to our mobile web site and Twitter.com as well.</p> <p>We're very excited about the potential of location metadata combined with Twitter. Our platform team has been on a roll lately. Geolocation lead @<a href="http://twitter.com/rsarver">rsarver</a> is particularly enthusiastic about location given his personal interest and involvement in events such as WhereCamp and his career history with location-aware services.</p> <p><img src="https://blogger.googleusercontent.com/tracker/23958943-4539167026890119148?l=blog.twitter.com" alt=""></p><![CDATA[Tech Support Cheat Sheet]]>https://www.timbroder.com/2009/08/tech-support-cheat-sheethttps://www.timbroder.com/2009/08/tech-support-cheat-sheetMon, 24 Aug 2009 18:32:00 GMT<p><a href="http://xkcd.com/627/">Tech Support Cheat Sheet</a>: <img src="https://imgs.xkcd.com/comics/tech_support_cheat_sheet.png" alt="&#x27;Hey Megan, it&#x27;s your father. How do I print out a flowchart?&#x27;"></p><![CDATA[Send To Tumblr And Track With Bitly Google Reader Custom Link]]>https://www.timbroder.com/2009/08/send-to-tumblr-and-track-with-bitlyhttps://www.timbroder.com/2009/08/send-to-tumblr-and-track-with-bitlyFri, 14 Aug 2009 13:43:00 GMT<p>Testing the "send to blogger" button... <a href="https://labs.kortina.net/2009/08/13/send-to-tumblr-and-track-with-bitly-google-reader-custom-link/">Send To Tumblr And Track With Bitly Google Reader Custom Link</a>: "</p> <p>Google Reader just launched a “Send to Twitter” feature that allows you to share bit.ly links to interesting items in your reader with your Twitter friends.  First, awesome!</p> <p>Second, Google Reader has been getting lots of product development attention lately, and with all the awesome stuff they are adding, I spend all of my time there as opposed to twitter.com/home, facebook.com/home, or Tumblr Dashboard. One thing I miss about Tumblr dashboard was easy reblogging.</p> <p><a href="https://labs.kortina.net/files/2009/08/2009-08-13_2354.png">![How to Create Custom Send To Links in Google Reader](https://labs.kortina.ne t/files/2009/08/2009-08-13_2354-300x173.png)</a></p> <p>How to Create Custom Send To Links in Google Reader</p> <p>There is a “Send to Tumblr” link as one of the defaults, but it doesn’t use bit.ly urls. So, I hacked together a custom “Send to Tumblr” link.</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">URL: http://tumblr.com/share?v=2&amp;u=&amp;t=Send To Tumblr And Track With Bitly Google Reader Custom Link&amp;s=Send To Tumblr And Track With Bitly Google Reader Custom Link%0Avia%20kortina`</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span></span></pre></div> <p><code class="language-text">Icon URL: http://assets.tumblr.com/images/favicon.gif?2</code></p> <p>[![Custom Send to Tumblr with Bitly Link from Google Reader Link](<a href="http://labs">http://labs</a>. kortina.net/files/2009/08/2009-08-13_2351-300x170.png)](<a href="https://labs.kortina.ne">https://labs.kortina.ne</a> t/files/2009/08/2009-08-13_2351.png)</p> <p>Custom Send to Tumblr with Bitly Link from Google Reader Link</p> <p><img src="https://labs.kortina.net/?ak_action=api_record_view&#x26;id=351&#x26;type=feed" alt=""></p> <p>Possibly related posts:</p> <ol> <li><a href="https://labs.kortina.net/2009/07/26/i-want-read-flare-plugins-for-sharing-in-google-reader/" title="Permanent Link: I Want “Read Flare” — Plugins for Sharing in Google Reader">I Want “Read Flare” — Plugins for Sharing in Google Reader</a></li> <li><a href="https://labs.kortina.net/2009/08/05/business-cards-have-google-maps-now/" title="Permanent Link: Business Cards Have Google Maps Now">Business Cards Have Google Maps Now</a></li> <li><a href="https://labs.kortina.net/2009/07/13/how-to-make-a-fixed-link-to-twitter-thats-always-visible-on-your-webpage/" title="Permanent Link: How To Make a Fixed Link to Twitter That’s Always Visible on Your Webpage">How To Make a Fixed Link to Twitter That’s Always Visible on Your Webpage</a></li> </ol> <p>[![](<a href="https://feeds.feedburner.com/~ff/kortina-">https://feeds.feedburner.com/~ff/kortina-</a> essays?d=yIl2AUoC8zA)](<a href="https://feeds.feedburner.com/~ff/kortina-">https://feeds.feedburner.com/~ff/kortina-</a> essays?a=o2hn6f5JGDQ:skeQbrLiUSU:yIl2AUoC8zA) [![](https://feeds.feedburner.com/~ff/kortina- essays?i=o2hn6f5JGDQ:skeQbrLiUSU:D7DqB2pKExk)](<a href="https://feeds.feedburner.com/~ff">https://feeds.feedburner.com/~ff</a> /kortina-essays?a=o2hn6f5JGDQ:skeQbrLiUSU:D7DqB2pKExk) [![](<a href="https://feeds.feedburner.com/~ff/kortina-">https://feeds.feedburner.com/~ff/kortina-</a> essays?d=qj6IDK7rITs)](<a href="https://feeds.feedburner.com/~ff/kortina-">https://feeds.feedburner.com/~ff/kortina-</a> essays?a=o2hn6f5JGDQ:skeQbrLiUSU:qj6IDK7rITs) [![](https://feeds.feedburner.com/~ff/kortina- essays?i=o2hn6f5JGDQ:skeQbrLiUSU:gIN9vFwOqvQ)](<a href="https://feeds.feedburner.com/~ff">https://feeds.feedburner.com/~ff</a> /kortina-essays?a=o2hn6f5JGDQ:skeQbrLiUSU:gIN9vFwOqvQ) [![](<a href="https://feeds.feedburner.com/~ff/kortina-">https://feeds.feedburner.com/~ff/kortina-</a> essays?d=7Q72WNTAKBA)](<a href="https://feeds.feedburner.com/~ff/kortina-">https://feeds.feedburner.com/~ff/kortina-</a> essays?a=o2hn6f5JGDQ:skeQbrLiUSU:7Q72WNTAKBA) [![](https://feeds.feedburner.com/~ff/kortina- essays?d=c-S6u7MTCTE)](<a href="https://feeds.feedburner.com/~ff/kortina-">https://feeds.feedburner.com/~ff/kortina-</a> essays?a=o2hn6f5JGDQ:skeQbrLiUSU:c-S6u7MTCTE)</p><![CDATA[Google Opt Out Feature Lets Users Protect Privacy by Moving to Remote Village]]>https://www.timbroder.com/2009/08/google-opt-out-feature-lets-usershttps://www.timbroder.com/2009/08/google-opt-out-feature-lets-usersThu, 13 Aug 2009 21:20:00 GMT<p><a href="http://www.theonion.com/content/video/google_opt_out_feature_lets_users?utm_source=videoembed">Google Opt Out Feature Lets Users Protect Privacy By Moving To Remote Village </a></p><![CDATA[The author of the Windows file copy dialog visits some friends]]>https://www.timbroder.com/2009/07/author-of-windows-file-copy-dialoghttps://www.timbroder.com/2009/07/author-of-windows-file-copy-dialogMon, 20 Jul 2009 13:40:00 GMT<p><a href="https://imgs.xkcd.com/comics/estimation.png"><img src="https://imgs.xkcd.com/comics/estimation.png" alt=""></a></p><![CDATA[Android hacked to run on x86]]>https://www.timbroder.com/2009/07/android-hacked-to-run-on-x86https://www.timbroder.com/2009/07/android-hacked-to-run-on-x86Wed, 15 Jul 2009 14:51:00 GMT<p>I foresee this being my weekend project <a href="https://androidcommunity.com/android-hacked-to-run-on-x86-20090714/">https://androidcommunity.com/android-hacked-to-run-on-x86-20090714/</a></p><![CDATA[Wordpress Plugin: Displaying your Google Reader RSS subscriptions]]>https://www.timbroder.com/2009/06/how-to-display-what-google-reader-rsshttps://www.timbroder.com/2009/06/how-to-display-what-google-reader-rssTue, 02 Jun 2009 15:07:00 GMT<p>I've been meaning to write this code for a while, and I really wanted to take a stab at writing a wordpress plugin so here it goes.</p> <p>The following takes in Google user credentials, and allows the user to display what RSS feeds they subscribe to on their wordpress blog</p> <p>Example: <a href="http://timbroder.gpowered.net/rss-i-read/">The RSS that I read</a><br> Update: This plugin is now hosted by wordpress. <a href="http://wordpress.org/extend/plugins/google-reader-subscription-list/">click here</a></p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token comment">/* Plugin Name: Google Reader Subscription List Version: 1 Author: Timothy Broder Description: Lists a users subscribed Google Reader feeds */</span> <span class="token comment">/* Copyright 2009 Timothy Broder (email : timothy.broder@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">class_exists</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'GoogleReaderSubList'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">GoogleReaderSubList</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> <span class="token variable">$show_list</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'show-google-reader-sub-list'</span><span class="token punctuation">;</span> <span class="token comment">//the hook in a page</span> <span class="token keyword">var</span> <span class="token variable">$login</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token keyword">var</span> <span class="token variable">$pass</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token keyword">var</span> <span class="token variable">$source</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'wordpress-google-reader-sub-list-'</span><span class="token punctuation">;</span> <span class="token comment">//the source the api sees when logging into Google</span> <span class="token keyword">var</span> <span class="token variable">$service</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'reader'</span><span class="token punctuation">;</span> <span class="token keyword">var</span> <span class="token variable">$login_url</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'https://www.google.com/accounts/ServiceLoginAuth?service=mail'</span><span class="token punctuation">;</span> <span class="token comment">//URL to login to google</span> <span class="token keyword">var</span> <span class="token variable">$subscription_list_url</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'http://www.google.com/reader/api/0/subscription/list'</span><span class="token punctuation">;</span> <span class="token comment">//URL that holds a users subscriptions</span> <span class="token keyword">function</span> <span class="token function-definition function">GoogleReaderSubList</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$options</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">get_admin_options</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">login</span> <span class="token operator">=</span> <span class="token variable">$options</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'google_login'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">pass</span> <span class="token operator">=</span> <span class="token variable">$options</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'google_pass'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">source</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">source</span> <span class="token operator">.</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">login</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function-definition function">show_sub_list</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$stop</span> <span class="token operator">=</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">login</span> <span class="token operator">==</span> <span class="token string single-quoted-string">''</span> <span class="token operator">||</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">login</span> <span class="token operator">==</span> <span class="token constant">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string single-quoted-string">'Google login not set&lt;br />'</span><span class="token punctuation">;</span> <span class="token variable">$stop</span> <span class="token operator">=</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">pass</span> <span class="token operator">==</span> <span class="token string single-quoted-string">''</span> <span class="token operator">||</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">pass</span> <span class="token operator">==</span> <span class="token constant">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string single-quoted-string">'Google password not set&lt;br />'</span><span class="token punctuation">;</span> <span class="token variable">$stop</span> <span class="token operator">=</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">//check to see if the zend plugin has been installed and activated</span> <span class="token comment">//http://wordpress.org/extend/plugins/zend-framework/</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token punctuation">(</span><span class="token function">defined</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'WP_ZEND_FRAMEWORK'</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token constant">WP_ZEND_FRAMEWORK</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string single-quoted-string">'The &lt;a href="http://wordpress.org/extend/plugins/zend-framework/" target="_blank">Zend Framework Plugin&lt;/a> is not active. Please install and activate it.'</span><span class="token punctuation">;</span> <span class="token variable">$stop</span> <span class="token operator">=</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$stop</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$client</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Zend_Http_Client</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">login_url</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//connect, authenticate, and handshake with Google</span> <span class="token variable">$client</span><span class="token operator">-></span><span class="token function">setCookieJar</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">setMethod</span><span class="token punctuation">(</span><span class="token class-name static-context">Zend_Http_Client</span><span class="token operator">::</span><span class="token constant">POST</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">setParameterPost</span><span class="token punctuation">(</span><span class="token keyword">array</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'continue'</span> <span class="token operator">=></span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">subscription_list_url</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'service'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'reader'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'niu'</span> <span class="token operator">=></span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'hl'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'en'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'Email'</span> <span class="token operator">=></span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">login</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'Passwd'</span> <span class="token operator">=></span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">pass</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'PersistentCookie'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'yes'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'asts'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">''</span> <span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//$error_level = error_reporting();</span> <span class="token comment">//error_reporting(1);</span> <span class="token variable">$response</span> <span class="token operator">=</span> <span class="token variable">$client</span><span class="token operator">-></span><span class="token function">request</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'POST'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$client</span><span class="token operator">-></span><span class="token function">setUri</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">subscription_list_url</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">setMethod</span><span class="token punctuation">(</span><span class="token class-name static-context">Zend_Http_Client</span><span class="token operator">::</span><span class="token constant">GET</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$response</span> <span class="token operator">=</span> <span class="token variable">$client</span><span class="token operator">-></span><span class="token function">request</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">getBody</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$client</span><span class="token operator">-></span><span class="token function">request</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">getStatus</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">400</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token operator">?</span><span class="token operator">></span>Unable to login with supplied Google login<span class="token operator">/</span>password<span class="token operator">&lt;</span> <span class="token operator">?</span> <span class="token keyword">return</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">//error_reporting($error_level);</span> <span class="token comment">//got the feed, parse it</span> <span class="token variable">$feed</span> <span class="token operator">=</span> <span class="token function">simplexml_load_string</span><span class="token punctuation">(</span><span class="token variable">$response</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$hashmap</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//organize the feeds by tag </span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$feed</span><span class="token operator">-></span><span class="token property">list</span><span class="token operator">-></span><span class="token keyword type-declaration">object</span> <span class="token keyword">as</span> <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$url</span> <span class="token operator">=</span> <span class="token variable">$e</span><span class="token operator">-></span><span class="token keyword type-declaration">string</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$title</span> <span class="token operator">=</span> <span class="token variable">$e</span><span class="token operator">-></span><span class="token keyword type-declaration">string</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$cat</span> <span class="token operator">=</span> <span class="token variable">$e</span><span class="token operator">-></span><span class="token property">list</span><span class="token operator">-></span><span class="token keyword type-declaration">object</span><span class="token operator">-></span><span class="token keyword type-declaration">string</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">//make sure a feed is filed somewhere</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$cat</span> <span class="token operator">==</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$cat</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'unfiled'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$t</span> <span class="token operator">=</span> <span class="token variable">$hashmap</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"<span class="token interpolation"><span class="token variable">$cat</span></span>"</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">//a category hasn't been used before</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$t</span> <span class="token operator">==</span> <span class="token constant">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$t</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token variable">$e</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$hashmap</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"<span class="token interpolation"><span class="token variable">$cat</span></span>"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$t</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">//category has been used before</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token function">array_push</span><span class="token punctuation">(</span><span class="token variable">$t</span><span class="token punctuation">,</span> <span class="token variable">$e</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$hashmap</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"<span class="token interpolation"><span class="token variable">$cat</span></span>"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$t</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">//sort the categories</span> <span class="token function">ksort</span><span class="token punctuation">(</span><span class="token variable">$hashmap</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//output</span> <span class="token operator">?</span><span class="token operator">></span> <span class="token operator">&lt;</span>p<span class="token operator">></span>Tags<span class="token punctuation">:</span> <span class="token operator">&lt;</span> <span class="token operator">?</span> <span class="token variable">$endKey</span> <span class="token operator">=</span> <span class="token function">end</span><span class="token punctuation">(</span><span class="token function">array_keys</span><span class="token punctuation">(</span><span class="token variable">$hashmap</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$hashmap</span> <span class="token keyword">as</span> <span class="token variable">$cat</span><span class="token operator">=></span><span class="token variable">$t</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"&lt;a href='#<span class="token interpolation"><span class="token variable">$cat</span></span>'><span class="token interpolation"><span class="token variable">$cat</span></span>&lt;/a>"</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$cat</span> <span class="token operator">!=</span> <span class="token variable">$endKey</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string single-quoted-string">', '</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator">?</span><span class="token operator">></span> <span class="token operator">&lt;</span><span class="token operator">/</span>p<span class="token operator">></span><span class="token operator">&lt;</span> <span class="token operator">?</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$hashmap</span> <span class="token keyword">as</span> <span class="token variable">$cat</span><span class="token operator">=></span><span class="token variable">$t</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"&lt;a name='<span class="token interpolation"><span class="token variable">$cat</span></span>'>&lt;/a>"</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"&lt;b><span class="token interpolation"><span class="token variable">$cat</span></span>&lt;/b>&lt;br />"</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$t</span> <span class="token keyword">as</span> <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">list</span><span class="token punctuation">(</span><span class="token variable">$feed</span><span class="token punctuation">,</span> <span class="token variable">$url</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token function">split</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'feed/'</span><span class="token punctuation">,</span> <span class="token variable">$e</span><span class="token operator">-></span><span class="token keyword type-declaration">string</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$title</span> <span class="token operator">=</span> <span class="token variable">$e</span><span class="token operator">-></span><span class="token keyword type-declaration">string</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"&lt;a href='<span class="token interpolation"><span class="token variable">$url</span></span>' target='_blank'><span class="token interpolation"><span class="token variable">$title</span></span>&lt;/a>&lt;br />"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">echo</span> <span class="token string single-quoted-string">'&lt;br />'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function-definition function">addContent</span><span class="token punctuation">(</span><span class="token variable">$content</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// Only do this if this is a page and it has the appropriate custom field</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">is_page</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$cust_field_values</span> <span class="token operator">=</span> <span class="token function">get_post_custom_values</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">show_list</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$cust_field_values</span> <span class="token operator">!=</span> <span class="token constant">NULL</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">defined</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'WP_ZEND_FRAMEWORK'</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token constant">WP_ZEND_FRAMEWORK</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">require_once</span> <span class="token string single-quoted-string">'Zend/Loader.php'</span><span class="token punctuation">;</span> <span class="token class-name static-context">Zend_Loader</span><span class="token operator">::</span><span class="token function">loadClass</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Zend_Http_Client'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$content</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">show_sub_list</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token variable">$content</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function-definition function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">get_admin_options</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function-definition function">get_admin_options</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$admin_options</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'google_login'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">''</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'google_pass'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">''</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'use_accordion'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'true'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$options</span> <span class="token operator">=</span> <span class="token function">get_option</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">adminOptionName</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$options</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$options</span> <span class="token keyword">as</span> <span class="token variable">$key</span> <span class="token operator">=></span> <span class="token variable">$option</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$admin_options</span><span class="token punctuation">[</span><span class="token variable">$key</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$option</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token function">update_option</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">admin_optionsName</span><span class="token punctuation">,</span> <span class="token variable">$admin_options</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$admin_options</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function-definition function">printAdminPage</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$options</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">get_admin_options</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_POST</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'update_greader_sub_list_settings'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_POST</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'greader_sub_list_login'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$options</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'google_login'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$_POST</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'greader_sub_list_login'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_POST</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'greader_sub_list_pass'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$options</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'google_pass'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$_POST</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'greader_sub_list_pass'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">update_option</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">admin_optionsName</span><span class="token punctuation">,</span> <span class="token variable">$options</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string single-quoted-string">'&lt;div class="updated">&lt;p>&lt;strong>'</span> <span class="token operator">.</span> <span class="token function">_e</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Settings Updated.'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'GoogleReaderSubList'</span><span class="token punctuation">)</span><span class="token operator">.</span> <span class="token string single-quoted-string">'&lt;/strong>&lt;/p>&lt;/div>'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">//$submit = _e('Update Settings', 'GoogleReaderSubList');</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"&lt;div class='wrap'> &lt;form method='post' action='"</span> <span class="token operator">.</span> <span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'REQUEST_URI'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"'> &lt;h2>Google Reader Subscription List&lt;/h2> &lt;h3>Google Login&lt;/h3> &lt;input type='text' name='greader_sub_list_login' value='"</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token function">_e</span><span class="token punctuation">(</span><span class="token function">apply_filters</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'format_to_edit'</span><span class="token punctuation">,</span> <span class="token variable">$options</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'google_login'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'GoogleReaderSubList'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"' /> &lt;h3>Google Password&lt;/h3> &lt;input type='password' name='greader_sub_list_pass' value='"</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token function">_e</span><span class="token punctuation">(</span><span class="token function">apply_filters</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'format_to_edit'</span><span class="token punctuation">,</span> <span class="token variable">$options</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'google_pass'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'GoogleReaderSubList'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"' /> &lt;div class='submit'> &lt;input type='submit' name='update_greader_sub_list_settings' value='"</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token function">_e</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Update Settings'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'GoogleReaderSubList'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"'/> &lt;/div> &lt;/form> &lt;/div>"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">class_exists</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'GoogleReaderSubList'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$greader_sub_list</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GoogleReaderSubList</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">function_exists</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'greader_sub_list_ap'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">function</span> <span class="token function-definition function">greader_sub_list_ap</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">global</span> <span class="token variable">$greader_sub_list</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$greader_sub_list</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">function_exists</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'add_options_page'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">add_options_page</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'gReader Subscriptions'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'gReader Subscriptions'</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token function">basename</span><span class="token punctuation">(</span><span class="token constant">__FILE__</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token variable">$greader_sub_list</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'printAdminPage'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$greader_sub_list</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">add_action</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'admin_menu'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'greader_sub_list_ap'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">add_action</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'activate_google-raeder-list/google-reader-list.php'</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token variable">$greader_sub_list</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'init'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">add_filter</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'the_content'</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token variable">$greader_sub_list</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'addContent'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'7'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[Quick Google Authentication in PHP]]>https://www.timbroder.com/2009/06/quick-google-authentication-in-phphttps://www.timbroder.com/2009/06/quick-google-authentication-in-phpTue, 02 Jun 2009 15:02:00 GMT<p>Here is a quick way to authenticate against Google and retrieve a protected feed. It does not use the supported ClientLogin method but it does allow you to get to some unsupported feeds (Reader, Bookmarks, etc) The <a href="http://framework.zend.com/download/gdata">Zend Gdata library</a> is required</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token variable">$show_list</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'show-google-reader-sub-list'</span><span class="token punctuation">;</span> <span class="token comment">//the hook in a page</span> <span class="token variable">$login</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token variable">$pass</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token variable">$source</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'wordpress-google-reader-sub-list-'</span><span class="token punctuation">;</span> <span class="token comment">//the source the api sees when logging into Google</span> <span class="token variable">$service</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'reader'</span><span class="token punctuation">;</span> <span class="token variable">$login_url</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'https://www.google.com/accounts/ServiceLoginAuth?service=mail'</span><span class="token punctuation">;</span> <span class="token comment">//URL to login to google</span> <span class="token variable">$subscription_list_url</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'http://www.google.com/reader/api/0/subscription/list'</span><span class="token punctuation">;</span> <span class="token comment">//URL that holds a users subscriptions</span> <span class="token variable">$client</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Zend_Http_Client</span><span class="token punctuation">(</span><span class="token variable">$login_url</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//connect, authenticate, and handshake with Google</span> <span class="token variable">$client</span><span class="token operator">-></span><span class="token function">setCookieJar</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">setMethod</span><span class="token punctuation">(</span><span class="token class-name static-context">Zend_Http_Client</span><span class="token operator">::</span><span class="token constant">POST</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">setParameterPost</span><span class="token punctuation">(</span><span class="token keyword">array</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'continue'</span> <span class="token operator">=></span> <span class="token variable">$subscription_list_url</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'service'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'reader'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'niu'</span> <span class="token operator">=></span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'hl'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'en'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'Email'</span> <span class="token operator">=></span> <span class="token variable">$login</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'Passwd'</span> <span class="token operator">=></span> <span class="token variable">$pass</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'PersistentCookie'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'yes'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'asts'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">''</span> <span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$response</span> <span class="token operator">=</span> <span class="token variable">$client</span><span class="token operator">-></span><span class="token function">request</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'POST'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$client</span><span class="token operator">-></span><span class="token function">setUri</span><span class="token punctuation">(</span><span class="token variable">$subscription_list_url</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">setMethod</span><span class="token punctuation">(</span><span class="token class-name static-context">Zend_Http_Client</span><span class="token operator">::</span><span class="token constant">GET</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$response</span> <span class="token operator">=</span> <span class="token variable">$client</span><span class="token operator">-></span><span class="token function">request</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">getBody</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$client</span><span class="token operator">-></span><span class="token function">request</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">getStatus</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">400</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token operator">?</span><span class="token operator">></span>Unable to login with supplied Google login<span class="token operator">/</span>password<span class="token string backtick-quoted-string">``</span>`</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[Diggnation NYC, June 4th!]]>https://www.timbroder.com/2009/05/diggnation-nyc-june-4thhttps://www.timbroder.com/2009/05/diggnation-nyc-june-4thThu, 28 May 2009 14:29:00 GMT<h5>Veeeeery excited about this. [Last</h5> <p>year](<a href="http://blog.gpowered.net/2008/06/live-diggnation-ny-photos.html">http://blog.gpowered.net/2008/06/live-diggnation-ny-photos.html</a>) was a blast</p> <h5>When?</h5> <p>Thursday, June 4th, 2009<br> 7:30pm</p> <h5>Where?</h5> <p>Webster Hall<br> 125 East 11th Street, New York City, NY<br> [view map](<a href="http://maps.google.com/?q=125%20East%2011th%20Street,%20New%20York%25">http://maps.google.com/?q=125%20East%2011th%20Street,%20New%20York%</a> 20City,%20NY)</p> <h5>Streaming?</h5> <p>No</p> <h5>Live Event?</h5> <p>Yes</p> <h5>Venue Website:</h5> <p><a href="http://websterhall.com/">websterhall.com</a></p><![CDATA[Google Maps F-Bombs street names!]]>https://www.timbroder.com/2009/05/google-maps-shows-interesting-streethttps://www.timbroder.com/2009/05/google-maps-shows-interesting-streetFri, 01 May 2009 00:16:00 GMT<p>Good stuff. <a href="http://maps.google.co.uk/maps?&#x26;ll=48.067541,12.862533&#x26;spn=0.006345,0.010267&#x26;t=h&#x26;z=17">Link</a></p> <p><a href="https://1.bp.blogspot.com/_Ng3QbVQfLZ8/Sfo_Jqi6JyI/AAAAAAAAbHo/QilHprrfP9c/s1600-h/Untitled.jpg">![](https://1.bp.blogspot.com/_Ng3QbVQfLZ8/Sfo_Jqi6JyI/AAAAAAAAbHo/QilHprrfP9c /s400/Untitled.jpg)</a></p><![CDATA[How a Programmer reads your resume]]>https://www.timbroder.com/2009/04/how-programmer-reads-your-resumehttps://www.timbroder.com/2009/04/how-programmer-reads-your-resumeTue, 28 Apr 2009 16:00:00 GMT<p><a href="https://www.hanovsolutions.com/resume_comic.png"><img src="https://www.hanovsolutions.com/resume_comic.png" alt=""></a></p><![CDATA[How to manage podcasts in Winamp (screw itunes)]]>https://www.timbroder.com/2009/04/how-to-manage-podcasts-in-winamp-screwhttps://www.timbroder.com/2009/04/how-to-manage-podcasts-in-winamp-screwFri, 17 Apr 2009 19:11:00 GMT<p>So I really have been digging the Windows 7 beta. However, Itunes does not sync podcasts correctly on the 64 bit version. IF syncing works at all, it takes a while. I had used winamp to listen to my music a while ago, but had switched to amarok when I started single booting linux (yes, I hated Vista that much). Now that I'm back to using windows a bit, I wanted my podcast experience to go flawlessly.</p> <p>As much as I dislike iTunes, they have got podcast management down pat</p> <ul> <li>search for podcast</li> <li>subscribe to podcast</li> <li>download episodes</li> <li>sync with ipod</li> <li><strong>after an episode has been listened to, delete from computer hard drive</strong></li> </ul> <p>That last point is the most important part, everything else can be done manually</p> <p>All this can be done with winamp. You will need two things, winamp and the <a href="http://mlipod.sourceforge.net/?page=downloads">ml_iPod</a> plugin. While winamp does come with ipod support built in, ml_iPod has many more features. The following steps should get you up to speed on podcasting with winamp</p> <ul> <li> <p>install winamp</p> </li> <li> <p>install the ml_iPod plugin (it will tell you it has to remove the built in ipod plugin, this is ok)</p> </li> <li> <p>set a directory to save the episodes in</p> </li> </ul> <p><img src="https://1.bp.blogspot.com/_Ng3QbVQfLZ8/SejSAesN5OI/AAAAAAAAbG8/i6n7ZuHGR7A/s1600-h/1.jpg" alt=""></p> <ul> <li> <p>plug in your ipod</p> </li> <li> <p>enable podcast support for the ipod</p> </li> <li> <p>point it to your episode folder</p> </li> <li> <p>set the query for when to delete old episodes</p> </li> </ul> <p><img src="https://4.bp.blogspot.com/_Ng3QbVQfLZ8/SejS5pxj2JI/AAAAAAAAbHE/zU0cecph26A/s1600-h/2.jpg" alt=""></p> <ul> <li> <p>Add your podcasts by searching for them in the directory, or adding them manually using their RSS feed</p> </li> </ul> <p><img src="https://4.bp.blogspot.com/_Ng3QbVQfLZ8/SejTsQ-8VoI/AAAAAAAAbHM/RGPUVDtoXpI/s1600-h/3.jpg" alt=""></p> <p>After this you should be good to go. podcasts!</p><![CDATA[Big Appengine news: Cron, Java, Firewalled Data, DB Import]]>https://www.timbroder.com/2009/04/big-appengine-news-cron-java-firewalledhttps://www.timbroder.com/2009/04/big-appengine-news-cron-java-firewalledWed, 08 Apr 2009 13:45:00 GMT<p><a href="http://googleappengine.blogspot.com/2009/04/seriously-this-time-new-language-on-app.html">Java Support</a>: This was the first, and most popular <a href="http://code.google.com/p/googleappengine/issues/detail?id=1">request </a>in the bug tracker. Followed closely by PHP support. Google has merged the simplicity of appengine with the robustness of java, and added it to their <a href="http://code.google.com/eclipse">Eclipse plugin</a> to boot.</p> <p><a href="http://code.google.com/appengine/docs/python/config/cron.html">Cron Support</a>: The cron support works by calling a URL at a given interval. I'm not sure if cron jobs are also restricted by the timeout policy, hopefully they will be allowed to be longer.</p> <p><a href="http://code.google.com/securedataconnector/">Secure Data Connector</a>: An exampled of this would be accessing data behind a corporate firewall. Might be a (good/bad) idea ;)</p> <p><a href="http://code.google.com/appengine/docs/python/tools/uploadingdata.html">Bulk Uploader</a>: Dump data into appengine from another database or a CSV file</p><![CDATA[Twitter Blog: Replies Are Now Mentions]]>https://www.timbroder.com/2009/03/twitter-blog-replies-are-now-mentionshttps://www.timbroder.com/2009/03/twitter-blog-replies-are-now-mentionsTue, 31 Mar 2009 14:33:00 GMT<p><a href="http://blog.twitter.com/2009/03/replies-are-now-mentions.html">Twitter Blog: Replies Are Now Mentions</a> Hopefully this is a step towards official support of @reply (or @mention) notifications again</p><![CDATA[First Google Chrome Extensions]]>https://www.timbroder.com/2009/03/first-google-chrome-extensionshttps://www.timbroder.com/2009/03/first-google-chrome-extensionsThu, 19 Mar 2009 17:11:00 GMT<p>Extensions <a href="http://dev.chromium.org/developers/design-documents/extensions/howto">are coming</a> for chrome.</p> <p>Google’s Matt Cutts <a href="http://www.mattcutts.com/blog/write-chrome-extension/">in a blog post says</a>: “Extensions currently have very Greasemonkey-like functionality: you identify which web pages should be modified, plus JavaScript to be added to those pages. By default, the extension’s JavaScript runs after the page loads, but you can specify that the extension’s JavaScript should run before the page loads. Right now, you can only load one JS file, but that could change in the future. You also can’t currently load Cascading Style Sheets (CSS), but that might also change.”</p> <p>Personally, I think they should just port greasemonkey directly so chrome can take advantage off all the <a href="http://userscripts.org/">existing scripts </a></p><![CDATA[Google’s JavaScript/ Chrome Experiments Showcase]]>https://www.timbroder.com/2009/03/googles-javascript-chrome-experimentshttps://www.timbroder.com/2009/03/googles-javascript-chrome-experimentsThu, 19 Mar 2009 17:08:00 GMT<p>Google at <a href="http://www.chromeexperiments.com/">ChromeExperiments.com</a> released a showcase site for JavaScript experiments especially aimed as promotion to demonstrate their own Chrome browser’s capabilities. From games to 3D graphics, these demo's really show off what the chrome javascript engine can do</p> <p><img src="https://1.bp.blogspot.com/_Ng3QbVQfLZ8/ScJ8EmTWaKI/AAAAAAAAbGE/_Oq790Qhn5Q/s1600-h/chrome.JPG" alt=""></p><![CDATA[No Content Found]]>https://www.timbroder.com/2009/03/test-post-from-sms-now-supported-byhttps://www.timbroder.com/2009/03/test-post-from-sms-now-supported-byMon, 16 Mar 2009 20:51:00 GMT<p>Test post from sms (now supported by blogger <a href="http://tinyurl.com/bx6vao">http://tinyurl.com/bx6vao</a> )</p><![CDATA[GrandCentral finally resurected]]>https://www.timbroder.com/2009/03/grandcentral-finally-resurectedhttps://www.timbroder.com/2009/03/grandcentral-finally-resurectedThu, 12 Mar 2009 13:46:00 GMT<p>GrandCentral <a href="http://googleblog.blogspot.com/2009/03/here-comes-google-voice.html">lives again</a>, as Google Voice. Google voice is rolling out, although currently only open to current GrandCentral users. To request an invite when it is open to all, click <a href="http://services.google.com/fb/forms/googlevoiceinvite">here</a></p> <p>Features:</p> <p><strong>Google number</strong> - One number for all your calls and SMS</p> <p><img src="https://www.google.com/voice/resources/3664525910-features_thumb1.jpg" alt="Features_thumb1"></p> <ul> <li><a href="https://www.google.com/voice/about#">Call screening</a> - Announce and screen callers</li> <li><a href="https://www.google.com/voice/about#">Listen in</a> - Listen before taking a call</li> <li><a href="https://www.google.com/voice/about#">Block calls</a> - Keep unwanted callers at bay</li> <li><a href="https://www.google.com/voice/about#">SMS</a> - Send, receive, and store SMS</li> <li><a href="https://www.google.com/voice/about#">Place calls</a> - Call US numbers for free</li> <li><a href="https://www.google.com/voice/about#">Taking calls</a> - Answer on any of your phones</li> <li><a href="https://www.google.com/voice/about#">Phone routing</a> - Phones ring based on who calls</li> <li><a href="https://www.google.com/voice/about#">Forwarding phones</a> - Add phones and decide which ring</li> </ul> <p><strong>Google voicemail</strong> - Voicemail as easy as email, with transcripts</p> <p><img src="https://www.google.com/voice/resources/4096164457-features_thumb2.jpg" alt="Features_thumb2"></p> <ul> <li><a href="https://www.google.com/voice/about#">Voicemail transcripts</a> - Read what your voicemail says</li> <li><a href="https://www.google.com/voice/about#">Listen to voicemail</a> - Check online or from your phone</li> <li><a href="https://www.google.com/voice/about#">Notifications</a> - Receive voicemails via email or SMS</li> <li><a href="https://www.google.com/voice/about#">Personalize greeting</a> - Vary greetings by caller</li> <li><a href="https://www.google.com/voice/about#">Share voicemail</a> - Forward or download voicemails</li> </ul> <p>|</p> <p><strong>Voice features</strong> - More cool things you can do with Google Voice</p> <p><img src="https://www.google.com/voice/resources/67413083-features_thumb3.jpg" alt="Features_thumb3"></p> <ul> <li><a href="https://www.google.com/voice/about#">Conference calling</a> - Join people into a single call</li> <li><a href="https://www.google.com/voice/about#">Call record</a> - Record calls and store them online</li> <li><a href="https://www.google.com/voice/about#">Call switch</a> - Switch phones during a call</li> <li><a href="https://www.google.com/voice/about#">Mobile site</a> - View your inbox from your mobile</li> <li><a href="https://www.google.com/voice/about#">GOOG-411</a> - Check directory assistance</li> <li><a href="https://www.google.com/voice/about#">Manage groups</a> - Set preferences by group</li> </ul><![CDATA[Google Calendar gets offline access with Gears]]>https://www.timbroder.com/2009/03/google-calendar-gets-offline-accesshttps://www.timbroder.com/2009/03/google-calendar-gets-offline-accessWed, 04 Mar 2009 13:50:00 GMT<p>4 of my 5 most used Google apps now have offline access through <a href="http://gears.google.com/">Gears </a>(Gmail, Docs, and reader being the other). I use picasa heavily also but there is way too much data there for gears. Head over to your <a href="https://www.google.com/calendar/">calendar </a>to add the feature.</p> <p><img src="https://4.bp.blogspot.com/_ZaGO7GjCqAI/Sa421fHmqBI/AAAAAAAAPJA/TgcJknPLigE/s1600/offline-calendar-1.png" alt=""></p><![CDATA[Installing Ubuntu Netbook Remix (with Jaunty) on an MSI Wind]]>https://www.timbroder.com/2009/02/installing-ubuntu-netbook-remix-withhttps://www.timbroder.com/2009/02/installing-ubuntu-netbook-remix-withWed, 25 Feb 2009 20:51:00 GMT<p>I recently picked up a MSI Wind Netbook and love the damn thing. <a href="http://www.canonical.com/projects/ubuntu/unr">Ubuntu Netbook Remix</a> brings in a great UI which makes navigating on the small screen much easier.I used Ubuntu Jaunty Jackalope Alpha 4 as the base install, mainly because I didn't want to go through the trouble of converting my ext3 partitions to ext4 when it comes out on April 23rd, and the driver support is more complete. I haven't had many problems with it aside from a few random firefox crashes.</p> <p><img src="https://1.bp.blogspot.com/_Ng3QbVQfLZ8/SaWunIJBkfI/AAAAAAAAa7c/XG8CFukv18E/s1600-h/Screenshot1.png" alt=""></p> <p><img src="https://3.bp.blogspot.com/_Ng3QbVQfLZ8/SaYPBBQ2EmI/AAAAAAAAa74/DBWWqZQOEko/s1600-h/partitions.png" alt=""></p> <ol> <li> <p>We're going to make a bootable USB stick to install Ubuntu</p> </li> <li> <p>On a separate machine, <a href="http://www.ubuntu.com/testing/jaunty/alpha4#Download%20Alpha%204">Download </a>the cd image. If you want to use 8.10, get the iso <a href="http://www.ubuntu.com/getubuntu/download">here</a></p> </li> <li> <p>if you are already using an Ubuntu install of 8.10 or higher, skip to step 11</p> </li> <li> <p>burn the image to a cd</p> </li> <li> <p>Boot to the cd, do not install, load the demo OS</p> </li> <li> <p>click System->Administration->Create a USB startup disk</p> </li> <li> <p>point it to either the cd in your drive, or the iso</p> </li> <li> <p>point to the correct USB stick</p> </li> <li> <p>the rest of the settings can stay default</p> </li> <li> <p>click Make Startup Disk</p> </li> <li> <p>Insert the usb drive into your wind, power it on, and hit delete to go into the bios, change the first boot device to USB Drive</p> </li> <li> <p>save and exit the bios</p> </li> <li> <p>If the wind boots off of the USB stick correctly, you should see the same screen as when you had booted off the cd</p> </li> <li> <p><a href="https://help.ubuntu.com/community/GraphicalInstall">Install </a>Ubuntu</p> </li> <li> <p>I made my partitions as follows:</p> </li> </ol> <p>|30 gig recovery partition|20 gig XP partition|15 Gig Ext4 Ubuntu Partition|4 gig swap partition|the rest of the drive as an ext4 partition<br> ![](<a href="https://3.bp.blogspot.com/_Ng3QbVQfLZ8/SaYPBBQ2EmI/AAAAA">https://3.bp.blogspot.com/_Ng3QbVQfLZ8/SaYPBBQ2EmI/AAAAA</a> AAAa74/DBWWqZQOEko/s1600-h/partitions.png)</p> <ol start="16"> <li>That last partition is where I will mount my home directory, as well as mount from windows xp using <a href="http://www.fs-driver.org/faq.html">ext2fs </a>(I havn't actually tried this yet)</li> <li>Add the netbook remix repositories to your system. This can be be done in synaptic or by typing the following into a terminal</li> </ol> <p>sudo gedit /etc/apt/sources.list</p> <ol start="18"> <li>add the following:</li> </ol> <p>deb <a href="http://ppa.launchpad.net/netbook-remix-team/ubuntu">http://ppa.launchpad.net/netbook-remix-team/ubuntu</a> intrepid main<br> deb-src <a href="http://ppa.launchpad.net/netbook-remix-team/ubuntu">http://ppa.launchpad.net/netbook-remix-team/ubuntu</a> intrepid main</p> <ol start="19"> <li>sudo apt-get update</li> <li>sudo apt-get install go-home-applet</li> </ol> <p>sudo apt-get install window-picker-applet<br> sudo apt-get install maximus<br> sudo apt-get install human-netbook-theme</p> <ol start="21"> <li> <p>Select the "Human Netbook Theme" in System Preferences>Apperance</p> </li> <li> <p>go into System Preferences-> sessions->startup programs and confirm that "Maximus" and "window-picker-applet" are thre</p> </li> <li> <p><strong>Disable Compiz Effects</strong> System Preferences->Appearance->None</p> <p>This is what is required to get netbook remix running, I continued with the</p> </li> </ol> <p>following to tweak it some more</p> <ol start="24"> <li> <p>Delete the bottom panel by right clicking on it</p> </li> <li> <p>Delete all the applets on the top panel by right clicking on them</p> </li> <li> <p>Add applets to the top panel so it ends up like:</p> </li> </ol> <p>Window Picker Applet | Trash Can |Notification Area | MixerApplet | Clock</p> <ol start="27"> <li>I also made alt+q the hotkey to show the desktop, makes navigating to it faster. Another option is the show desktop applet button that can be added to the top bar. Preferences->keyboard shortcuts->"Hide all normal windows....."</li> </ol> <p>More info is available <a href="http://wiki.msiwind.net/index.php/Ubuntu_8.04_Hardy_Heron">here</a>.</p><![CDATA[Google App Engine Blog: The sky's (almost) the limit! "High CPU" is no more.]]>https://www.timbroder.com/2009/02/google-app-engine-blog-skys-almosthttps://www.timbroder.com/2009/02/google-app-engine-blog-skys-almostTue, 17 Feb 2009 16:16:00 GMT<p>It looks like the app engine infrastructure is improving. No more High CPU request warnings, the response deadline (timeout) has been raised from 10 to 30 seconds, and the static file limit is now 10MB.</p><![CDATA[The Matrix Runs on Windows]]>https://www.timbroder.com/2009/01/matrix-runs-on-windowshttps://www.timbroder.com/2009/01/matrix-runs-on-windowsWed, 28 Jan 2009 19:39:00 GMT<p>See more <a href="http://www.collegehumor.com/videos">funny videos</a> and <a href="http://www.collegehumor.com/pictures">funny pictures</a> at <a href="http://www.collegehumor.com/">CollegeHumor</a>.</p><![CDATA[How to get brightkite photos into an RSS feed (to post to a blog)]]>https://www.timbroder.com/2009/01/how-to-get-brightkite-photos-into-rsshttps://www.timbroder.com/2009/01/how-to-get-brightkite-photos-into-rssMon, 26 Jan 2009 15:11:00 GMT<p>I started another <a href="http://timbroder.com">blog </a>so I have a place to rant about comics or movies or whatever else I need to get off my chest, and I needed an excuse to play with wordpress (something I've been wanting to do for a while). I plan on posting how I did certain things on that blog on gPowered. One of the things I really wanted to do was have my twitter photos show up as posts on that blog. For a while I have been using <a href="http://twitpic.com/photos/broderboy">twitpic</a>, but have recently changed over to <a href="http://brightkite.com/people/broderboy">brightkite</a>. Brightkite provides an rss feed of all your activity, but I was only interested in the photos. Looked like a job for <a href="http://pipes.yahoo.com/pipes/pipe.info?_id=PMOQjpHo3RGyu7JdLXO0Kg">Yahoo! Pipes</a>.</p> <p><a href="https://4.bp.blogspot.com/_Ng3QbVQfLZ8/SX3Uw_HR3KI/AAAAAAAAajI/XPnLMt02wdQ/s1600-h/pipe1.JPG">![](https://4.bp.blogspot.com/_Ng3QbVQfLZ8/SX3Uw_HR3KI/AAAAAAAAajI/XPnLMt02wdQ /s320/pipe1.JPG)</a></p> <p>I imported the bkite feed into pipes, filtered on the items that were photo posts, and renamed the title so it would have the title of the photo instead of the bkite location (by default bkite photo titles are the location where you most recently checked in). I also did some URL generation so anyone could <a href="http://pipes.yahoo.com/pipes/pipe.run?_id=PMOQjpHo3RGyu7JdLXO0Kg&#x26;_render=rss&#x26;username=broderboy">use the pipe</a> The next step was to get this into wordpress. I Installed the <a href="http://projects.radgeek.com/feedwordpress/">FeedWordPress</a> plugin and set it up to import the pipe's RSS feed. You can tweak the the settings on what user should be used to write the posts, categories, tags, permalinks (I set mine to point directly back to brightkite). Hope this helps someone out there, enjoy</p><![CDATA[Finding unread gmails (or: the best gmail filter ever)]]>https://www.timbroder.com/2008/12/finding-unread-gmails-or-best-gmailhttps://www.timbroder.com/2008/12/finding-unread-gmails-or-best-gmailTue, 23 Dec 2008 15:45:00 GMT<p>As the year starts to wind down, I figure I should start the year off with a clean inbox. I try to keep no unread messages in my inbox, instead I tag and archive. These past few weeks however, my inbox has gotten a little crazy.</p> <p>I found this filter to show me all my unread mail that is still in my inbox, hope it helps someone organize like it did me</p> <p>is:inbox is:unread</p> <p>Happy Holidays all</p><![CDATA[Google Reader gets a facelift]]>https://www.timbroder.com/2008/12/google-reader-gets-facelifthttps://www.timbroder.com/2008/12/google-reader-gets-faceliftFri, 05 Dec 2008 14:20:00 GMT<p>It's now less "bubble" looking. I'm wondering if its pulling from my gmail theme, but I unfortunately can't check that from work. I really like being able to hide the stats in the upper left. The only one I ever look at is how many total unread items I have.</p> <p><img src="https://1.bp.blogspot.com/_Ng3QbVQfLZ8/STk5K-WSxAI/AAAAAAAAT_c/dhYyr6IvNIk/s1600-h/reader.jpg" alt=""></p><![CDATA[Set / Change / Reset the MySQL root password on Ubuntu Linux (Ubuntu)]]>https://www.timbroder.com/2008/11/set-change-reset-mysql-root-password-onhttps://www.timbroder.com/2008/11/set-change-reset-mysql-root-password-onMon, 24 Nov 2008 23:53:00 GMT<p>This came in veeeerrryyy handy just now...</p> <ol> <li> <p>Stop the MySQL Server</p> <p>sudo /etc/init.d/mysql stop</p> </li> <li> <p>Start the mysqld config</p> <p>sudo mysqld --skip-grant-tables &#x26;</p> </li> <li> <p>Login to the server as root</p> <p>mysql -u root mysql</p> </li> <li> <p>Ser your NEWPASSWORD</p> <p>UPDATE user SET Password=PASSWORD('NEWPASSWORD') WHERE</p> <p>User='root'; FLUSH</p> <p>PRIVILEGES; exit;</p> </li> </ol> <p><a href="https://altezza.travel/groups.php">туры на майские праздники днепропетровск</a><a href="http://purmedispa.com/dengi-v-dolg-chastnoe-litso.php" title="потребительский кредит под залог недвижимости сбербанк">взять денег в долг срочно</a></p><![CDATA[Gmail adds voice and video chat]]>https://www.timbroder.com/2008/11/gmail-adds-voice-and-video-chathttps://www.timbroder.com/2008/11/gmail-adds-voice-and-video-chatTue, 11 Nov 2008 22:54:00 GMT<p>Is the death of Skype iminent?</p> <p><a href="https://mail.google.com/videochat?hl=en"><img src="https://mail.google.com/tools/dlpage/res/videochat/en/screenshot.png" alt=""></a></p> <p>The <a href="https://mail.google.com/videochat?hl=en">plugin</a> isn't out for Linux so I can't test it out just yet. Hopefully I'll be able to try it out on <a href="http://maybe-not.net/">Laura's</a> mac later. Until then, more info is available <a href="http://mashable.com/2008/11/11/gmail-video-voice-chat/">here</a>. If you've tried it out, let me <a href="http://www.twitter.com/broderboy/">know</a>.</p><![CDATA[Foxtrot Android]]>https://www.timbroder.com/2008/11/foxtrot-androidhttps://www.timbroder.com/2008/11/foxtrot-androidMon, 10 Nov 2008 14:37:00 GMT<p><a href="https://picayune.uclick.com/comics/ft/2008/ft081109.gif"><img src="https://picayune.uclick.com/comics/ft/2008/ft081109.gif" alt=""></a></p><![CDATA[Android Market now open. Full source released]]>https://www.timbroder.com/2008/11/android-market-now-open-full-sourcehttps://www.timbroder.com/2008/11/android-market-now-open-full-sourceMon, 03 Nov 2008 14:28:00 GMT<p>The Android Market is now open, register to add your apps! <a href="http://www.android.com/market/">http://www.android.com/market/</a></p> <p><a href="https://1.bp.blogspot.com/_Ng3QbVQfLZ8/SQ8LWQBaTRI/AAAAAAAATtw/vUbKNKpvwLg/s1600-h/market.JPG">![](https://1.bp.blogspot.com/_Ng3QbVQfLZ8/SQ8LWQBaTRI/AAAAAAAATtw/dg9Emi0zDTs /s320-R/market.JPG)</a></p> <p>The full source code for Android is now available: <a href="http://source.android.com/">http://source.android.com/</a></p><![CDATA[GWTPHP = Google Web Toolkit + PHP 5]]>https://www.timbroder.com/2008/10/gwtphp-google-web-toolkit-php-5https://www.timbroder.com/2008/10/gwtphp-google-web-toolkit-php-5Thu, 09 Oct 2008 20:28:00 GMT<p>I know there is a pretty high number of programmers who haven't tried to dable GWT yet because out of the box, the back end is java only. PHP developers rejoice!</p> <p>_Unlike most of the other frameworks, <a href="http://www.gwtphp.com/">GwtPHP </a>is a framework for both client and server part. In GwtPHP you don’t need to hack JavaScript, you work with modern, object oriented languages. User interface (client) is programmed in Java, then compiled by Google Web Toolkit (GWT) to browser-dependent JavaScript. Server part uses PHP 5. _</p> <p>Not yet available to the public, but you can sign up to be <a href="http://www.gwtphp.com/download/">notified </a>when it is</p><![CDATA[How to turn any webpage into an RSS feed]]>https://www.timbroder.com/2008/10/how-to-turn-any-webpage-into-rss-feedhttps://www.timbroder.com/2008/10/how-to-turn-any-webpage-into-rss-feedMon, 06 Oct 2008 12:55:00 GMT<p>Using a tool called <a href="http://www.dapper.net/">Dapper</a> and <a href="http://pipes.yahoo.com/pipes/">Yahoo Pipes</a>, its fairly easy to turn any webpage into an RSS feed. Dapper is a powerful HTML scrapping system and Pipes is a handy data remixing tool. Head on over to dapper.net and check to make sure someone hasn't already done what you are planning on doing (Do this by using dapper's search function.) If you can't find any, you are ready to go.</p> <p>For this example, I'm going to scrape <a href="http://ifanboy.com/users/broderboy/comics">http://ifanboy.com/users/broderboy/comics</a> which shows the comic books I'm interested in this week. Click "create new dapp" (located under the search bar). Once inside the Dapp Factory, input the url of the page you want to scrape. Then, change the format to RSS Feed. You can leave the format is Dapp XML if you want much more control over the data, as well as more options for output, but its harder to turn this into an RSS feed. I'll cover how to do this in a later article.</p> <p><img src="https://3.bp.blogspot.com/_Ng3QbVQfLZ8/SOoNorE0EnI/AAAAAAAATJ0/leCPt6SrNsQ/s1600-h/1.jpg" alt=""></p> <p>At this point I would recommend watching the Demo that will pop up. After the demo you should see a rendering of the page you were looking at. Click add to basket. Then, try to add more pages that are similar, but might have different data. For my example this would be other people's comics. Add these to the basket as well (you should try to have at least 4)</p> <p><a href="https://1.bp.blogspot.com/_Ng3QbVQfLZ8/SOoOoUkvuhI/AAAAAAAATJ8/ktxQucSBFxY/s1600-h/2.jpg">![](https://1.bp.blogspot.com/_Ng3QbVQfLZ8/SOoOoUkvuhI/AAAAAAAATJ8/WgfrxcqVv4E /s320-R/2.jpg)</a></p> <p>Click next step, and the system will analyze your pages. You can watch another demo at this point. Now you can start selecting page elements. The more example pages you gave dapper, the smarter the element selecting will be. All I'm interested in is the title of the comic, which I'm going to use for the title of the RSS article, and the number of pulls it had, which I will use for the body of the article.</p> <p><a href="https://3.bp.blogspot.com/_Ng3QbVQfLZ8/SOoP7VrxYiI/AAAAAAAATKE/cZegoqyOGRg/s1600-h/3.jpg">![](https://3.bp.blogspot.com/_Ng3QbVQfLZ8/SOoP7VrxYiI/AAAAAAAATKE/Sa8E9LiQTBU /s320-R/3.jpg)</a></p> <p>After I have these selected, I move on to the next step. Here you can preview or save you dapp. It should have already grouped your 2 items into an RSS group for you. Exit the wizard to get the RSS feed and options.</p> <p><a href="http://2.bp.blogspot.com/_Ng3QbVQfLZ8/SOoRHt1LJRI/AAAAAAAATKM/byTDlv2rlaA/s1600-h/4.jpg">![](http://2.bp.blogspot.com/_Ng3QbVQfLZ8/SOoRHt1LJRI/AAAAAAAATKM/xd4VjsOeDIk /s320-R/4.jpg)</a></p> <p>At this point, you have the RSS feed and are done with that portion. If you only need the address of the feed for yourself, there is no need to go any furthur. I wanted to make the input very easy for anyone to use the feed for any user on iFanboy. Enter Yahoo Pipes. I used a text input, string builder, and URL builder to create the URL I would need. Then sent this url into the dapp, and pulled back the RSS. The orriginal URL for the dapp was <a href="http://www.dapper.net/transform.php?dappName=iFanboyComicsfortheWeekRSS&#x26;transformer=RSS&#x26;extraArg_title=comic_title&#x26;extraArg_description%5B%5D=pulls&#x26;applyToUrl=http%3A%2F%2Fwww.ifanboy.com%2Fusers%2Fbroderboy%2Fcomics">http://www.dapper.net/transform.php?dappName=iFanboyComicsfortheWeekRSS&#x26;transformer=RSS&#x26;extraArg_title=comic_title&#x26;extraArg_description[]=pulls&#x26;applyToUrl=http%3A%2F%2Fwww.ifanboy.com%2Fusers%2Fbroderboy%2Fcomics</a>. While the 'broderboy' could have been replaced directly in this url, it might not have been clear. The new Pipes URL makes it a little easier to see <a href="http://pipes.yahoo.com/pipes/pipe.run?_id=GjdOGm9_3RGeKVooPxJ3AQ&#x26;_render=rss&#x26;username=broderboy">http://pipes.yahoo.com/pipes/pipe.run?_id=GjdOGm9_3RGeKVooPxJ3AQ&#x26;_render=rss&#x26;username=broderboy</a>.</p> <p><a href="https://1.bp.blogspot.com/_Ng3QbVQfLZ8/SOoTMSgH6JI/AAAAAAAATKU/fxS2mt00hNc/s1600-h/5.jpg">![](https://1.bp.blogspot.com/_Ng3QbVQfLZ8/SOoTMSgH6JI/AAAAAAAATKU/f6s1x0hbHF4 /s320-R/5.jpg)</a></p> <p>You can also merge multiple RSS feeds in the pipe using the Union node.</p> <p>Enjoy!</p><![CDATA[Debate 2.0]]>https://www.timbroder.com/2008/10/debate-20https://www.timbroder.com/2008/10/debate-20Thu, 02 Oct 2008 21:00:00 GMT<p>Last week during the presidential debate, the country was a-twitter. There were a bunch of sites doing some sort of realtime web 2.0 shows of the debate, with a lot of these using twitter and hashtags. If anyone knows of any sites that I haven't listed below, please let me know</p> <p>We had the TV, a couple of laptops, and a few bottles of wine going and it turned out to be great fun.</p> <p>My favorite site was definitely Current's <a href="http://current.com/topics/88834922_hack_the_debate">Hack the Debate</a> It displays the video/audio of the debate, as well as real time tweets that are tagged with #current. This is where I'll be spending most of my time.</p> <p>Twitter weighs in with <a href="http://election.twitter.com/">http://election.twitter.com/ </a></p> <p><a href="http://www.web-strategist.com/blog/2008/09/21/twitter-presidential-debates-sept-26/">#tweetdebate</a> was an experiment to use twitter to track in real time who is winning, this is tracked using search.twitter.com. See the [site](<a href="http://www.web-strategist.com/blog/2008/09/21/twitter-presidential-">http://www.web-strategist.com/blog/2008/09/21/twitter-presidential-</a> debates-sept-26/) for rules.</p> <p>Other websites with twitter mashups for the debate<br> <a href="http://friendfeed.com/search?q=obama+OR+mccain&#x26;who=everyone">FriendFeed</a><br> <a href="http://dnc08.c-span.org/?page_id=1579">C-SPAN</a> (democrats)<br> <a href="http://rnc08.c-span.org/?page_id=338">C-SPAN</a> (republicans)<br> <a href="http://www.perspctv.com/">http://www.perspctv.com/</a><br> [NPR](<a href="http://www.npr.org/blogs/politics/2008/10/help_us_factcheck_tonights_deb">http://www.npr.org/blogs/politics/2008/10/help_us_factcheck_tonights_deb</a> .html) (#factcheck)</p> <p>I'm cooking dinner / having wine for the VP debate tonight with some friends. Follow us up on twitter if you want to join in on the fun.</p> <p><a href="http://twitter.com/broderboy">http://twitter.com/broderboy</a><br> <a href="http://twitter.com/bingopajamas">http://twitter.com/bingopajamas</a><br> <a href="http://twitter.com/franksstella">http://twitter.com/franksstella</a><br> <a href="http://twitter.com/mrblondeau">http://twitter.com/mrblondeau</a><br> <a href="http://twitter.com/delapaz">http://twitter.com/delapaz</a><a href="https://altezza.travel/articles/Safari_in_Tanzania">поездка в танзанию</a></p><![CDATA[September Madness]]>https://www.timbroder.com/2008/09/september-madnesshttps://www.timbroder.com/2008/09/september-madnessTue, 30 Sep 2008 18:54:00 GMT<p>A little off the beaten path from what I usually post, but have at, we're taking bets here at work, winner gets to claim Alaska as their sovereign kingdom of awesomeness</p> <p><img src="https://www.techcrunch.com/wp-content/uploads/2008/09/septembermadnessb.jpg" alt=""></p><![CDATA[Digg and Facebook Heading to the Future of Web Apps expo]]>https://www.timbroder.com/2008/09/digg-and-facebook-heading-to-future-ofhttps://www.timbroder.com/2008/09/digg-and-facebook-heading-to-future-ofTue, 30 Sep 2008 14:17:00 GMT<p><a href="http://developers.facebook.com/news.php?blog=1&#x26;story=157">This </a>sounds like a lot of fun, some good presentations (interesting topics and good presenters), a live <a href="http://revision3.com/diggnation/">Diggnation</a>, and I LOVE London. Wish I could go</p> <p>Here's the lineup:</p> <ul> <li>Mark Zuckerberg - Fireside Chat</li> <li>Kevin Rose - The future of social news</li> <li>Dave Morin - A more social Web with [Facebook</li> </ul> <p>Connect](<a href="http://developers.facebook.com/connect.php">http://developers.facebook.com/connect.php</a>)</p> <ul> <li>Joe Stump - Languages don't scale</li> </ul> <p>To wrap up the conference there will be a live Diggnation on the main stage (Oct 10). Directly after that will be the wrap up party which is rumored to have an open bar, but you didn't hear that from me</p><![CDATA[What happens if you break the NDA with Apple's App Store]]>https://www.timbroder.com/2008/09/what-happens-if-you-break-nda-withhttps://www.timbroder.com/2008/09/what-happens-if-you-break-nda-withTue, 30 Sep 2008 14:08:00 GMT<p><a href="https://www.geekculture.com/joyoftech/joyimages/1156.jpg"><img src="https://www.geekculture.com/joyoftech/joyimages/1156.jpg" alt=""></a></p><![CDATA[I JUST WON £500,000.00 GBP FROM GOOGLE UK!!!]]>https://www.timbroder.com/2008/09/i-just-won-50000000-gbp-from-google-ukhttps://www.timbroder.com/2008/09/i-just-won-50000000-gbp-from-google-ukThu, 25 Sep 2008 15:27:00 GMT<p>Now, normally gmail's spam system picks up on these. I apparently was entered by using the "Googler" Search Engine. Oh well, next time it will know, and knowing is half the battle! ::hits spam button::</p> <p>_This E-mail is to inform you that your e-email have emerged you a winner of £500,000.00 GBP (Five Hundred Thousand British<br> Pounds) in our online Give-away 1Oth year Anniversary draws.<br> GoogleUK has successfully organized for the second time a Cash Give-Away marking 2008 10th Anniversary in the UK. Over £20,000,000.00 (Twenty Million British pounds) is to be given out for this Anniversary Draws.<br> No purchases of tickets were required. Participants for the draws were randomly selected from a world wide range of web searchers who use the Google search engine (Googler) and other Google ancillary services. Google is now the biggest search engine worldwide and in an effort to make sure that it remains the most widely used search engine, Google is running an e-mail beta test. Winners were selected randomly through a computer ballot system from worldwide users of the Google search engine.</p> <p>YOUR WINNING DETAILS ARE AS FOLLOW:<br> Computer Generated Profile Numbers (CGPN):7-22-71-00-66-12 Ticket number: 00869575733664 Serial numbers: / BTD/8070447706/06 Lucky numbers: 12-12-23-35-40-41(12)</p> <p>To claim your give-away prize, send the following Your full names.................<br> ,sex...............................,<br> Location............................,<br> Alternate e-mail address..................<br> Your winning details.................<br> To your processing agent (Mr. Francis Henson) who have been assigned to handle your winning file and payment processing.</p> <p>Your Processing Agent contact:<br> Mr. Francis Henson,<br> Email: <a href="mailto:f.henson002@gmail.com">f.henson002@gmail.com</a><br> We wish you the best of luck as you spend your good fortune.<br> Thank you for using Google!<br> Sincerely,<br> Mrs Anita Simon</p><![CDATA[Woohoo! Google Maps adds NYC transit directions]]>https://www.timbroder.com/2008/09/wooho-google-maps-adds-nyc-transithttps://www.timbroder.com/2008/09/wooho-google-maps-adds-nyc-transitWed, 24 Sep 2008 17:55:00 GMT<p>Finally! Took em long enough. It even has the New Jersey Path.</p> <p>I've been using <a href="http://www.gypsymaps.com/">GypsyMaps</a> up until now if I needed directions, we'll see how they stack up against each other</p> <p><a href="http://maps.google.com/nyc">http://maps.google.com/nyc</a></p><![CDATA[Google Android G1 T-Mobile announcement is streaming live]]>https://www.timbroder.com/2008/09/google-android-g1-t-mobile-announcementhttps://www.timbroder.com/2008/09/google-android-g1-t-mobile-announcementTue, 23 Sep 2008 14:36:00 GMT<p>Watch it <a href="http://announcement.t-mobileg1.com/">here</a></p><![CDATA[Twitter enters the Porn industry]]>https://www.timbroder.com/2008/09/twitter-enters-porn-industryhttps://www.timbroder.com/2008/09/twitter-enters-porn-industryTue, 23 Sep 2008 14:23:00 GMT<p>Just got this at work, I must have missed the memo...</p> <p><em>The site you have attempted to access has been blocked</em><br> _If you feel access to this site has a valid <strong>business justification</strong>, we welcome you to submit a request to access the site which will be reviewed for compliance with [my company here] Policy. _</p> <h2>URL Requested:</h2> <p><a href="http://www.tweettrak.com/">http://www.tweettrak.com/</a><br> URL Category: Sex<br> Date: 2008-09-23 14:20:25</p><![CDATA[How to stream video to an Xbox 360 from linux]]>https://www.timbroder.com/2008/09/how-to-stream-video-to-xbox-360-fromhttps://www.timbroder.com/2008/09/how-to-stream-video-to-xbox-360-fromMon, 22 Sep 2008 22:05:00 GMT<p>There are a couple of different methods floating around to do this, but I think this is the quickest and easiest to get set up. So far, I like this better then FTP'ing files over to my old modded xbox. Some notes about further investigating will be at the bottom. Note: this was tested on an Ubuntu machine.</p> <ul> <li>Make sure your 360 has all the current updates</li> <li>Install ushare <strong>"sudo apt-get install ushare"</strong></li> <li>if ushare complains about a missing libdlna dependency, get it from here: **"wget <a href="http://www.geexbox.org/debian/pool/main/libdlna/libdlna0_0.2.3-0ubuntu1_i386.deb">http://www.geexbox.org/debian/pool/main/libdlna/libdlna0_0.2.3-0ubuntu1_i386.deb</a>" **</li> <li>Edit the ushare configuration <strong>"sudo vim /etc/ushare.conf"</strong> update any ports or network devices you need to (I changed mine to eth1 so it would just use the wireless) as well as what folder to scan</li> <li>There is a mime-type you need to update <strong>"sudo vim /usr/share/mime/packages/freedesktop.org.xml"</strong> change <strong>mime-type type="video/x-msvideo"</strong> to <strong>mime-type type="video/x-ms-wmv"</strong></li> <li>restart gnome (<strong>ctrl + alt + backspace)</strong></li> <li>start ushare with <strong>"ushare -x"</strong></li> <li>Go to the media blade on your 360 dashboard</li> <li>Press 'X' to change the source</li> <li>You should see uShare (or whatever you named the share to in the configuration)</li> <li>play videos!</li> <li>note: **to play a .mkv file, rename it to .m4v **</li> </ul> <p>To Do:</p> <ul> <li>get uShare to automatically rescan the directory (currently if I add a video to the folder, the 360 will not see it until i restart uShare)</li> <li>get 1080p HD content to stream. I have tried a few re-encapsulation methods so far, nothing working yet</li> <li>this is an xbox thing, that hopefully will be fixed in the fall update, but navigating large folder trees can get annoying</li> </ul><![CDATA[Official: T-Mobile Android Announcement September 23rd]]>https://www.timbroder.com/2008/09/official-t-mobile-android-announcementhttps://www.timbroder.com/2008/09/official-t-mobile-android-announcementWed, 17 Sep 2008 22:31:00 GMT<p><a href="http://www.talkandroid.com/211-official-t-mobile-android-september/#comment-250">Cool</a>, for T-Mobile users anyway. Hopefully Verizon or AT&#x26;T; is next in line, and yes, I will leave Verizon for AT&#x26;T; if they get it first</p><![CDATA[Man I would love to do this]]>https://www.timbroder.com/2008/09/man-i-would-love-to-do-thishttps://www.timbroder.com/2008/09/man-i-would-love-to-do-thisWed, 17 Sep 2008 20:48:00 GMT<p><a href="http://googleblog.blogspot.com/2008/09/running-hood-to-coast.html">Official Google Blog: Running Hood to Coast</a></p> <p>"A 197-mile Oregon race that starts at Mount Hood, travels through Portland, and finishes on the beach in the town of Seaside. More than 1000 teams participate in the race, with 12 runners on each team running three legs each."</p><![CDATA[T-Mobile Android handset to retail for $199]]>https://www.timbroder.com/2008/09/t-mobile-android-handset-to-retail-forhttps://www.timbroder.com/2008/09/t-mobile-android-handset-to-retail-forWed, 17 Sep 2008 20:30:00 GMT<p>iPhone vs. Android, <a href="https://androidcommunity.com/t-mobile-android-handset-to-retail-for-199-20080918/">go!</a></p><![CDATA[Offerpal Media Facebook to Publish Event Directory for Search Engines]]>https://www.timbroder.com/2008/09/offerpal-media-facebook-to-publishhttps://www.timbroder.com/2008/09/offerpal-media-facebook-to-publishWed, 17 Sep 2008 20:04:00 GMT<p>Things have changed slightly since I <a href="http://blog.gpowered.net/2008/05/why-microsoft-will-buy-facebook-and.html">last</a> wrote about this, but for the better. Look like Google will be able to trawl some of Facebook <a href="http://www.insidefacebook.com/2008/09/12/facebook-to-publish-event-directory-for-search-engines/">after all</a>.</p> <p>Searchable data will include People, Pages, Applications, Events, and Groups.</p><![CDATA[Adobe AIR Beta Now Available for Linux]]>https://www.timbroder.com/2008/09/adobe-air-beta-now-available-for-linuxhttps://www.timbroder.com/2008/09/adobe-air-beta-now-available-for-linuxWed, 17 Sep 2008 20:00:00 GMT<p>Adobe air is out of alpha and can be downloaded <a href="http://labs.adobe.com/downloads/air_linux.html">here</a>. Also check out Life Hacker's <a href="http://lifehacker.com/396393/top-10-apps-worth-installing-adobe-air-for">top 10</a> apps worth installing Adobe AIR for</p><![CDATA[Diggnation in your living room!]]>https://www.timbroder.com/2008/09/diggnation-in-your-living-roomhttps://www.timbroder.com/2008/09/diggnation-in-your-living-roomWed, 17 Sep 2008 14:23:00 GMT<p>This could be a lot of fun. If you win, Kevin, Alex, Prager, the Hippie, and whoever else will come shoot an episode of Diggnation from your living room. I love Diggnation, either way, it will be a great episode.</p> <p>"<em>In this once in a lifetime opportunity, Kevin and Alex will travel to a fan’s house to shoot an episode of Diggnation this fall. From now until October 22, every time you use the code “<strong><a href="http://www.godaddy.com/">diggcouch</a></strong>” when you purchase something from Go Daddy you are automatically entered to win. Go Daddy will choose one lucky winner at random. This fall, Kevin and Alex will travel to their house to shoot an episode of Diggnation in their living room.</em></p> <p><em>In addition to entering the contest you also get 10% off your entire order when you use the code “diggcouch” at check out. So make sure you get over to <a href="http://www.godaddy.com/">GoDaddy.com</a> and make some purchases and get your entry in today!</em>"</p> <p><a href="http://revision3.com/blog/2008/09/15/kevin-and-alex-in-your-living-room/">Spread the word</a></p><![CDATA[Geek 1.0 vs. Geek 2.0]]>https://www.timbroder.com/2008/09/geek-10-vs-geek-20https://www.timbroder.com/2008/09/geek-10-vs-geek-20Fri, 12 Sep 2008 15:26:00 GMT<p><a href="http://spotonce.com/story.php?title=Geek_1-0_vs-_Geek_2-0__Pic"><img src="https://farm4.static.flickr.com/3044/2780453718_16d3121d13_o.gif" alt=""></a></p><![CDATA[First Community run Android App Market goes live]]>https://www.timbroder.com/2008/09/first-community-run-android-app-markethttps://www.timbroder.com/2008/09/first-community-run-android-app-marketTue, 09 Sep 2008 16:38:00 GMT<p><a href="http://www.google-phone.com/android-developer-challenge-winners-android-market-is-up-and-accessories-store-goes-live-08316.php">Check it out</a></p> <p><a href="https://4.bp.blogspot.com/_Ng3QbVQfLZ8/SMan487MRKI/AAAAAAAATDI/V5qQCIr-QD0/s1600-h/and.JPG">![](https://4.bp.blogspot.com/_Ng3QbVQfLZ8/SMan487MRKI/AAAAAAAATDI/V5qQCIr-QD0 /s400/and.JPG)</a></p><![CDATA[Chrome: Don't Clog the Tubes!]]>https://www.timbroder.com/2008/09/chrome-dont-clog-tubeshttps://www.timbroder.com/2008/09/chrome-dont-clog-tubesMon, 08 Sep 2008 19:06:00 GMT<p>A buddy at work mentioned this. There are also a lot more listed over at <a href="http://lifehacker.com/5045164/google-chromes-full-list-of-special-about-pages">lifehacker</a></p> <p><a href="https://3.bp.blogspot.com/_Ng3QbVQfLZ8/SMV4afne6pI/AAAAAAAATC8/PbOxUVJEpkI/s1600-h/clog.JPG">![](https://3.bp.blogspot.com/_Ng3QbVQfLZ8/SMV4afne6pI/AAAAAAAATC8/PbOxUVJEpkI /s400/clog.JPG)</a></p><![CDATA[WINE Updates with Better Chrome Support]]>https://www.timbroder.com/2008/09/wine-updates-with-better-chrome-supporthttps://www.timbroder.com/2008/09/wine-updates-with-better-chrome-supportMon, 08 Sep 2008 14:41:00 GMT<p>via <a href="http://lifehacker.com/5046581/wine-updates-with-better-chrome-support">lifehacker</a>: I'll be trying this when I get home.</p><![CDATA[Django 1.0 released!]]>https://www.timbroder.com/2008/09/django-10-releasedhttps://www.timbroder.com/2008/09/django-10-releasedFri, 05 Sep 2008 01:00:00 GMT<p>No, you’re not hallucinating, it’s really here.</p> <p>NOW GO <a href="http://www.djangoproject.com/download/">GET IT</a></p><![CDATA[Chrome coming to Android?]]>https://www.timbroder.com/2008/09/chrome-coming-to-androidhttps://www.timbroder.com/2008/09/chrome-coming-to-androidThu, 04 Sep 2008 13:24:00 GMT<p><a href="https://androidcommunity.com/google-chrome-coming-to-android-20080903/">Android Community</a> and a few other blogs have stated that Chrome will be making its way to android, but aside from the processing stack and improved javascriptability (yes I just made up a word), is it really going to be the full chrome app everyone is playing with or just a tweaked out webkit (which we already knew was going to be the native Android browser)</p><![CDATA[Android Market: a user-driven content distribution system]]>https://www.timbroder.com/2008/09/android-market-user-driven-contenthttps://www.timbroder.com/2008/09/android-market-user-driven-contentWed, 03 Sep 2008 14:31:00 GMT<p><a href="http://android-developers.blogspot.com/2008/08/android-market-user-driven-content.html">Android Developers Blog: Android Market: a user-driven content distribution system</a></p> <p>Eat it Apple<br> The beta version of the market will be available at launch</p> <p><img src="https://3.bp.blogspot.com/_-e06f1q-QQE/SLbW0tDkvKI/AAAAAAAAAF8/0eQVyZFDSCo/s320/1.png" alt=""> | <img src="https://4.bp.blogspot.com/_-e06f1q-QQE/SLbW928wXxI/AAAAAAAAAGE/HbP2fKv0hJE/s320/2.png" alt=""><br> <img src="https://4.bp.blogspot.com/_-e06f1q-QQE/SLbXEL6PcQI/AAAAAAAAAGM/SJKe1ay0_Ws/s320/3.png" alt=""> | <img src="https://1.bp.blogspot.com/_-e06f1q-QQE/SLbXI1U1D5I/AAAAAAAAAGU/PXiiPQS42q0/s320/4.png" alt=""></p><![CDATA[Share your code at ‘Google App Engine Cookbook’]]>https://www.timbroder.com/2008/09/share-your-code-at-google-app-enginehttps://www.timbroder.com/2008/09/share-your-code-at-google-app-engineTue, 02 Sep 2008 15:56:00 GMT<p><a href="http://googleappengine.blogspot.com/2008/08/our-favorite-recipes-for-app-engine-all.html">Google App Engine Blog: Our favorite recipes for App Engine, all in one place</a></p> <p>I'll be submitting some snippets in the near future. Said code will also be posted on here ;)</p><![CDATA[New Android news]]>https://www.timbroder.com/2008/09/new-android-newshttps://www.timbroder.com/2008/09/new-android-newsTue, 02 Sep 2008 15:47:00 GMT<ul> <li><a href="https://androidcommunity.com/t-mobile-g1-phone-images-leaked-20080830/">T-Mobile G1 phone images leaked!</a></li> </ul> <p><img src="https://androidcommunity.com/blog/wp-content/uploads/2008/08/t-mobile-g1-htc-android-dream_s.jpg" alt=""></p> <ul> <li> <p><a href="https://androidcommunity.com/congrats-to-winners-of-the-android-developer-challenge-i-20080829/">Android Developer Challenge Winners Announced</a></p> </li> <li> <p><a href="https://androidcommunity.com/android-market-confirmed-no-app-checking-by-google-20080828/">Android App Market Confirmed</a>. EAT IT IPHONE</p> </li> </ul><![CDATA[Javascript pacman clone]]>https://www.timbroder.com/2008/09/javascript-pacman-clonehttps://www.timbroder.com/2008/09/javascript-pacman-cloneTue, 02 Sep 2008 15:40:00 GMT<p>A <a href="http://www.digitalinsane.com/archives/2008/08/30/pacman/">great</a> example of javascript to create a pacman clone. (Uses <a href="http://developer.yahoo.com/yui/">YUI</a>)</p><![CDATA[Official Google Blog: A fresh take on the browser]]>https://www.timbroder.com/2008/09/official-google-blog-fresh-take-onhttps://www.timbroder.com/2008/09/official-google-blog-fresh-take-onTue, 02 Sep 2008 13:54:00 GMT<p><a href="http://googleblog.blogspot.com/2008/09/fresh-take-on-browser.html">Official Google Blog: A fresh take on the browser</a></p> <p>Not too sure how I feel about this. We'll see what it ends up being</p> <p>More info: <a href="http://www.google.com/googlebooks/chrome/index.html">comic</a></p><![CDATA[Resistance is Futile: Microsoft Paperclip comes to Unix]]>https://www.timbroder.com/2008/08/resistance-is-futile-microsofthttps://www.timbroder.com/2008/08/resistance-is-futile-microsoftThu, 28 Aug 2008 20:40:00 GMT<p><a href="https://houghi.org/shots/vim001.gif"><img src="https://houghi.org/shots/vim001.gif" alt=""></a><a href="https://altezza.travel/"> туры в танзанию килиманджаро</a></p><![CDATA[New third-party party tool for monitoring App Engine cluster status]]>https://www.timbroder.com/2008/08/new-third-party-party-tool-forhttps://www.timbroder.com/2008/08/new-third-party-party-tool-forSat, 23 Aug 2008 01:34:00 GMT<p><a href="http://www.cloudstatus.com/appengine">Cloud Status</a> has some pretty cool real-time appengine cloud stats. Check it out</p><![CDATA[T-Mobile Android slated for Oct 13th]]>https://www.timbroder.com/2008/08/t-mobile-android-slated-for-oct-13thhttps://www.timbroder.com/2008/08/t-mobile-android-slated-for-oct-13thFri, 22 Aug 2008 13:19:00 GMT<p>Highlights</p> <ul> <li>pre-order will go until Oct. 3 at 5pm</li> <li>Phones will be received on Oct 13th</li> <li>Price: $199</li> <li>$18 "upgrade" fee</li> <li>2 year contract required</li> <li>$35 unlimited data &#x26; messaging plan</li> <li>$25 plan including 400 messages</li> </ul> <p>Phone Features</p> <ul> <li>Touch Screen</li> <li>Full Qwerty keyboard</li> <li>3G/ WiFi</li> <li>Full HTML internet capabilities</li> <li>Easy access to all Google applications (Gmail, Gtalk, search)</li> <li>Maps</li> <li>Street view</li> <li>You Tube</li> <li>Phone</li> <li>IM/Text</li> <li>Email</li> <li>Camera 3.0mp</li> <li>Video (playback only, no recording)</li> <li>Music player &#x26; 1GB memory card pre-loaded</li> <li>Applications, all available in Google marketplace (icon on the homescreen)</li> </ul><![CDATA[Back from Vacation]]>https://www.timbroder.com/2008/08/back-from-vacationhttps://www.timbroder.com/2008/08/back-from-vacationTue, 12 Aug 2008 23:22:00 GMT<p>I did as much relaxing as I could on Vacation down at the Jersey Shore. No computers at all. Just me, the beach and a bunch of books. Went on the Human Sling shot (spring shot?) which was a lot of fun, see the video and pictures below.</p> <p>Also, Check out goodreads.com. Its a lot better then any of the other bookshelving services I've reviewed <a href="http://blog.gpowered.net/2007/09/google-books-my-library-vs-librarything.html">in the past</a>. The reasons why will be in a future post in the not so distant future.</p> <p>[<img src="https://www.goodreads.com/images/widget/widget_logo.gif" alt="Widget_logo">](http: //<a href="http://www.goodreads.com/user/show/1253891">www.goodreads.com/user/show/1253891</a>)</p> <h2><a href="http://picasaweb.google.com/timothy.broder/VacationInWIldwood"><img src="https://lh6.ggpht.com/timothy.broder/SJXRQBmxkJE/AAAAAAAASaM/y38REUtNRG8/s160-c/VacationInWIldwood.jpg" alt=""></a></h2> <p><a href="http://picasaweb.google.com/timothy.broder/VacationInWIldwood">Vacation in WIldwood</a></p><![CDATA[Android: Analyst HTC delay rumors debunked - Q4 launch still on track]]>https://www.timbroder.com/2008/08/analyst-htc-delay-rumors-debunked-q4https://www.timbroder.com/2008/08/analyst-htc-delay-rumors-debunked-q4Mon, 11 Aug 2008 14:41:00 GMT<p>Well thats good. Fingers crossed for Verizon release.</p> <p>Sorry for the lack of posts. 3 month project going live this weekend. Will hopefully have some free time after that.</p> <p>Via <a href="https://androidcommunity.com/analyst-htc-delay-rumors-debunked-q4-launch-still-on-track-20080808/">Android Community</a></p><![CDATA[Heading on Vacation]]>https://www.timbroder.com/2008/07/heading-on-vacationhttps://www.timbroder.com/2008/07/heading-on-vacationSat, 26 Jul 2008 13:45:00 GMT<p>Finally getting a vacation in, going down to the Jersey shore. Got a nice stack of books and comics. Can't wait to relax. My next project will be released a few days after I get back. It's almost done =)</p> <p><a href="http://twitpic.com/5gbx" title="Got my stack of books for vacation at the shore. Bye world se... on TwitPic">![Got my stack of books for vacation at the shore. Bye world se... on TwitPic](http://twitpic.com/img/5gbx- 67847ad849843df02601c352bc7ad4b0.488b2aa3.jpg)</a></p><![CDATA[I'm not sure I like the new Facebook Design]]>https://www.timbroder.com/2008/07/im-not-sure-i-like-new-facebook-designhttps://www.timbroder.com/2008/07/im-not-sure-i-like-new-facebook-designWed, 23 Jul 2008 02:19:00 GMT<p>Originally I had friendfeed taking care of all my Facebook status updates. I wasn't sure I liked this on the old profile and was experimenting. Now I definitely want it to go. But even working with other apps and feeds, I'm not sure the new profile can display what the old one could. These pics are from the new one. Some valuable information is missing from the posts, diggs, twitter isn't even showing up... I'll have to play some more. What do people think?</p> <p><a href="https://4.bp.blogspot.com/_Ng3QbVQfLZ8/SIaW5MGLaHI/AAAAAAAASOU/FrPl0GKnWr0/s1600-h/newfb2.jpg">![](https://4.bp.blogspot.com/_Ng3QbVQfLZ8/SIaW5MGLaHI/AAAAAAAASOU/VaZMmEpswdw /s400-R/newfb2.jpg)</a></p> <hr> <p><a href="https://3.bp.blogspot.com/_Ng3QbVQfLZ8/SIaW8qi4MXI/AAAAAAAASOc/pVuueWByKZI/s1600-h/newfb1.jpg"><img src="https://3.bp.blogspot.com/_Ng3QbVQfLZ8/SIaW8qi4MXI/AAAAAAAASOc/cNc-Mv1GYmY/s400-R/newfb1.jpg" alt=""></a></p><![CDATA[New and Improved Google Personal Homepage (ig)]]>https://www.timbroder.com/2008/07/new-and-improved-google-personalhttps://www.timbroder.com/2008/07/new-and-improved-google-personalFri, 18 Jul 2008 19:56:00 GMT<p>I unfortunately haven't had time to touch Google reader in almost 2 weeks now, but just caught on <a href="http://lifehacker.com/398759/the-new-igoogle-gets-full+screen-gmail">lifehacker</a> that Google is rolling out a new personal homepage. Some of you may have it enabled by default. If not, head over to <a href="http://www.google.com/ig/sandbox">www.google.com/ig/sandbox</a> and sign up to get into the developer sandbox. If you aren't a developer, fake it. My favorite addition is definitely full screen Gmail preview, which I can't get to at work. I wonder how long until they block it....</p> <p><a href="https://3.bp.blogspot.com/_Ng3QbVQfLZ8/SID2FFUAMUI/AAAAAAAASN8/Wr2BUjBqMs8/s1600-h/ig.JPG">![](https://3.bp.blogspot.com/_Ng3QbVQfLZ8/SID2FFUAMUI/AAAAAAAASN8/3uHMeD_JNbY /s320-R/ig.JPG)</a></p><![CDATA[gPowered Rated 8.2 on Blogged.com!]]>https://www.timbroder.com/2008/07/gpowered-rated-82-on-bloggedcomhttps://www.timbroder.com/2008/07/gpowered-rated-82-on-bloggedcomWed, 02 Jul 2008 01:19:00 GMT<p>I recently received an email about someone submitting gPowered to [blogged.com](<a href="http://www.blogged.com/blogs/gpowered-by-the-power-of-">http://www.blogged.com/blogs/gpowered-by-the-power-of-</a> google.html). To whoever submitted it, thank you so much!!</p> <p>_ Dear Timothy Broder,</p> <p>Our editors recently reviewed your blog and have given it an 8.2 score out of (10) in the Technology category of Blogged.com.</p> <p>This is quite an achievement!</p> <p>[ <a href="http://www.blogged.com/directory/technology%5D(">http://www.blogged.com/directory/technology](</a></p> <p><a href="http://www.blogged.com/directory/technology">http://www.blogged.com/directory/technology</a>)</p> <p>We evaluated your blog based on the following criteria: Frequency of Updates, Relevance of Content, Site Design, and Writing Style.</p> <p>After carefully reviewing each of these criteria, your site was given its 8.2 score.</p> <p>We’ve also created Blogged.com score badges with your score prominently displayed. Simply visit your website’s summary page on Blogged.com:</p> <p>Click on the "Show this rating on your blog!" link underneath the score and follow the instructions provided.</p> <p>Please accept my congratulations on a blog well-done!!</p> <p>Sincerely,</p> <p>Amy Liu<br> Marketing Department<br> <a href="mailto:amy@blogged.com">amy@blogged.com</a><br> <a href="http://www.blogged.com">www.blogged.com</a></p><![CDATA[Mars Robot twittered from Space]]>https://www.timbroder.com/2008/06/mars-robot-twittered-from-spacehttps://www.timbroder.com/2008/06/mars-robot-twittered-from-spaceMon, 23 Jun 2008 18:34:00 GMT<p>The Mars Phoenix robot found water on mars and what does it do? Sends a <a href="http://blog.twitter.com/2008/06/nasa-twitter-and-news-from-mars.html">tweet</a></p> <p>"Are you ready to celebrate? Well, get ready: We have ICE!!!!! Yes, ICE, <em>WATER ICE</em> on Mars! w00t!!! Best day ever!!"</p><![CDATA[Android Handset’s Could Be Delayed Until 2009]]>https://www.timbroder.com/2008/06/android-handsets-could-be-delayed-untilhttps://www.timbroder.com/2008/06/android-handsets-could-be-delayed-untilMon, 23 Jun 2008 18:28:00 GMT<p>Well... that would [suck](<a href="http://www.talkandroid.com/124-google-android-">http://www.talkandroid.com/124-google-android-</a> delayed/)</p><![CDATA[Social Badges]]>https://www.timbroder.com/2008/06/social-badgeshttps://www.timbroder.com/2008/06/social-badgesFri, 20 Jun 2008 00:25:00 GMT<p>So, for whatever reason. I never added my social network badges to this site. I should have, a long time ago. Feel free to follow me on <a href="http://friendfeed.com/broderboy">FriendFeed</a> or <a href="http://twitter.com/broderboy">Twitter</a>, be my friend on <a href="http://www.facebook.com/profile.php?id=17500954">Facebook</a> or <a href="http://www.linkedin.com/pub/5/749/644">linkedin</a>, see what I've <a href="http://www.digg.com/users/timothybroder">Dugg</a> or <a href="http://www.last.fm/user/broderboy/">listened</a> to, take a look at my <a href="http://picasaweb.google.com/timothy.broder">photos</a>, and more. Will definitly be seeing how this effects my <a href="http://code.google.com/apis/socialgraph/">social graph</a></p> <p><a href="http://friendfeed.com/broderboy"><img src="https://gpowered.net/php/images/internal.png" alt="FriendFeed"></a> <a href="http://twitter.com/broderboy"><img src="https://gpowered.net/php/images/twitter.png" alt="Twitter"></a> <a href="http://blog.gpowered.net/"><img src="https://gpowered.net/php/images/blog.png" alt="Blog"></a> <a href="http://www.facebook.com/profile.php?id=17500954"><img src="https://gpowered.net/php/images/facebook.png" alt="Facebook"></a> <a href="http://www.digg.com/users/timothybroder"><img src="https://gpowered.net/php/images/digg.png" alt="Digg"></a> <a href="http://www.google.com/reader/shared/16162999404522159936"><img src="https://gpowered.net/php/images/googlereader.png" alt="Google Reader"></a> <a href="http://www.last.fm/user/broderboy/"><img src="https://gpowered.net/php/images/lastfm.png" alt="Last.fm"></a> <a href="http://picasaweb.google.com/timothy.broder">![Picasa Web Albums](https://gpowered.net/php/imag es/picasa.png)</a> <a href="http://www.linkedin.com/pub/5/749/644">![LinkedIn](http: //gpowered.net/php/images/linkedin.png)</a> <a href="http://www.librarything.com/profile/broderboy"><img src="https://gpowered.net/php/images/librarything.png" alt="LibraryThing"></a> <a href="http://www.pandora.com/people/timothy.broder">![Pandora](https://gpowered.net/php/imag es/pandora.png)</a> <a href="http://del.icio.us/broderboy">![del.icio.us] (https://gpowered.net/php/images/delicious.png)</a> <a href="http://broderboy.stumbleupon.com/"><img src="https://gpowered.net/php/images/stumbleupon.png" alt="StumbleUpon"></a> <a href="http://broderboy.tumblr.com/"><img src="https://gpowered.net/php/images/tumblr.png" alt="Tumblr"></a> <a href="http://www.youtube.com/profile?user=broderboy">![YouTube](https://gpowered.net/php/images/youtub e.png)</a> <a href="http://pownce.com/broderboy/">![Pownce](http://gpowe red.net/php/images/pownce.png)</a></p><![CDATA[Python 2.6 and 3.0 Beta 1 Released.]]>https://www.timbroder.com/2008/06/httpjessenollercom20080619python-26-andhttps://www.timbroder.com/2008/06/httpjessenollercom20080619python-26-andThu, 19 Jun 2008 22:28:00 GMT<p>Get them while they're hot!</p> <p><a href="http://www.python.org/download/releases/2.6/">2.6</a></p> <p><a href="http://www.python.org/download/releases/3.0/">3.0 Beta</a></p><![CDATA[Wine 1.0 has been released]]>https://www.timbroder.com/2008/06/wine-10-has-been-releasedhttps://www.timbroder.com/2008/06/wine-10-has-been-releasedTue, 17 Jun 2008 15:37:00 GMT<p><a href="http://www.winehq.org/">Big Day</a> for software</p><![CDATA[Firefox3: Help set a world record starting at 1pm EST]]>https://www.timbroder.com/2008/06/firefox3-help-set-world-record-startinghttps://www.timbroder.com/2008/06/firefox3-help-set-world-record-startingTue, 17 Jun 2008 15:15:00 GMT<p><a href="http://www.spreadfirefox.com/en-US/worldrecord/">Do it</a></p><![CDATA[Google I/O session videos posted with slides]]>https://www.timbroder.com/2008/06/google-io-session-videos-posted-withhttps://www.timbroder.com/2008/06/google-io-session-videos-posted-withMon, 16 Jun 2008 19:11:00 GMT<p>As I said <a href="http://blog.gpowered.net/2008/04/select-google-io-sessions-to-be-posted.html">earlier</a>, Quite a few presentations from Google I/O have been <a href="http://sites.google.com/site/io/">posted</a> for your viewing pleasure. I'll be glued to these this weekend while I'm on call.</p> <p>Topics include<br> Ajax<br> KML<br> Sketchup<br> Android<br> OpenSocial<br> Appengine<br> Data APIs<br> Theory Talks<br> Youtube<br> Gears<br> Mashups<br> Maps<br> and more!</p><![CDATA[Google Toolbar Available for Firefox 3]]>https://www.timbroder.com/2008/06/google-toolbar-available-for-firefox-3https://www.timbroder.com/2008/06/google-toolbar-available-for-firefox-3Mon, 16 Jun 2008 17:54:00 GMT<p><a href="http://blogoscoped.com/archive/2008-06-16.html#n62">Finally</a>, the Google <a href="http://toolbar.google.com/">toolbar</a> is available for all those with the Firefox beta or RC releases. Just in time too... took them long enough... happy days are here again!</p><![CDATA[Live Diggnation NY Photos]]>https://www.timbroder.com/2008/06/live-diggnation-ny-photoshttps://www.timbroder.com/2008/06/live-diggnation-ny-photosThu, 05 Jun 2008 11:31:00 GMT<p>The show was absolutely nuts. Had a great time at Studio B. Sorry for the crappy photo quality, I forgot my camera and the blackberry doesn't do so well in the dark... I think the estimate for this meetup was about 2,000 people inside and 600 waiting outside in the rain? Great turnout, great show. Diggnation better come back to NY. (As they said at the show, NY creates/diggs the most content on Digg then anywhere else in the world, GO NEW YORK!</p> <p>[![](ht tp://2.bp.blogspot.com/_Ng3QbVQfLZ8/SEfPwSCzrtI/AAAAAAAASAk/uE3SLJhkVc4/s400/I MG00031.jpg)](<a href="http://2.bp.blogspot.com/_Ng3QbVQfLZ8/SEfPwSCzrtI/AAAAAAAASAk/uE">http://2.bp.blogspot.com/_Ng3QbVQfLZ8/SEfPwSCzrtI/AAAAAAAASAk/uE</a> 3SLJhkVc4/s1600-h/IMG00031.jpg) [![](<a href="https://4.bp.blogspot.com/_Ng3QbVQfLZ8/SEf">https://4.bp.blogspot.com/_Ng3QbVQfLZ8/SEf</a> PtyCzrsI/AAAAAAAASAc/peqDoJ87kDk/s400/IMG00032.jpg)](<a href="https://4.bp.blogspot.com/">https://4.bp.blogspot.com/</a> _Ng3QbVQfLZ8/SEfPtyCzrsI/AAAAAAAASAc/peqDoJ87kDk/s1600-h/IMG00032.jpg) [![](ht tp://2.bp.blogspot.com/_Ng3QbVQfLZ8/SEfPrSCzrrI/AAAAAAAASAU/eCCoFaLbTwo/s400/I MG00033.jpg)](<a href="http://2.bp.blogspot.com/_Ng3QbVQfLZ8/SEfPrSCzrrI/AAAAAAAASAU/eC">http://2.bp.blogspot.com/_Ng3QbVQfLZ8/SEfPrSCzrrI/AAAAAAAASAU/eC</a> CoFaLbTwo/s1600-h/IMG00033.jpg) [![](<a href="https://3.bp.blogspot.com/_Ng3QbVQfLZ8/SEf">https://3.bp.blogspot.com/_Ng3QbVQfLZ8/SEf</a> PliCzrqI/AAAAAAAASAM/tpEyMMpkI9I/s400/IMG00034.jpg)](<a href="https://3.bp.blogspot.com/">https://3.bp.blogspot.com/</a> _Ng3QbVQfLZ8/SEfPliCzrqI/AAAAAAAASAM/tpEyMMpkI9I/s1600-h/IMG00034.jpg) [![](ht tp://2.bp.blogspot.com/_Ng3QbVQfLZ8/SEfPgSCzrpI/AAAAAAAASAE/dSjsnwdN89U/s400/I MG00035.jpg)](<a href="http://2.bp.blogspot.com/_Ng3QbVQfLZ8/SEfPgSCzrpI/AAAAAAAASAE/dS">http://2.bp.blogspot.com/_Ng3QbVQfLZ8/SEfPgSCzrpI/AAAAAAAASAE/dS</a> jsnwdN89U/s1600-h/IMG00035.jpg) [![](<a href="https://3.bp.blogspot.com/_Ng3QbVQfLZ8/SEf">https://3.bp.blogspot.com/_Ng3QbVQfLZ8/SEf</a> PYiCzroI/AAAAAAAAR_8/knHsvfKP7Vs/s400/IMG00036.jpg)](<a href="https://3.bp.blogspot.com/">https://3.bp.blogspot.com/</a> _Ng3QbVQfLZ8/SEfPYiCzroI/AAAAAAAAR_8/knHsvfKP7Vs/s1600-h/IMG00036.jpg) [![](ht tp://3.bp.blogspot.com/_Ng3QbVQfLZ8/SEfPRiCzrnI/AAAAAAAAR_0/qAMV4gBESLs/s400/I MG00037.jpg)](<a href="https://3.bp.blogspot.com/_Ng3QbVQfLZ8/SEfPRiCzrnI/AAAAAAAAR_0/qA">https://3.bp.blogspot.com/_Ng3QbVQfLZ8/SEfPRiCzrnI/AAAAAAAAR_0/qA</a> MV4gBESLs/s1600-h/IMG00037.jpg) [![](<a href="https://3.bp.blogspot.com/_Ng3QbVQfLZ8/SEf">https://3.bp.blogspot.com/_Ng3QbVQfLZ8/SEf</a> PKiCzrmI/AAAAAAAAR_s/SAWtqLlV5Qw/s400/IMG00038.jpg)](<a href="https://3.bp.blogspot.com/">https://3.bp.blogspot.com/</a> _Ng3QbVQfLZ8/SEfPKiCzrmI/AAAAAAAAR_s/SAWtqLlV5Qw/s1600-h/IMG00038.jpg) [![](ht tp://3.bp.blogspot.com/_Ng3QbVQfLZ8/SEfPGiCzrlI/AAAAAAAAR_k/9ZVOZXOuhq8/s400/I MG00039.jpg)](<a href="https://3.bp.blogspot.com/_Ng3QbVQfLZ8/SEfPGiCzrlI/AAAAAAAAR_k/9Z">https://3.bp.blogspot.com/_Ng3QbVQfLZ8/SEfPGiCzrlI/AAAAAAAAR_k/9Z</a> VOZXOuhq8/s1600-h/IMG00039.jpg) [![](<a href="http://2.bp.blogspot.com/_Ng3QbVQfLZ8/SEf">http://2.bp.blogspot.com/_Ng3QbVQfLZ8/SEf</a> PDSCzrkI/AAAAAAAAR_c/HuoFOMnMPvw/s400/IMG00040.jpg)](<a href="http://2.bp.blogspot.com/">http://2.bp.blogspot.com/</a> _Ng3QbVQfLZ8/SEfPDSCzrkI/AAAAAAAAR_c/HuoFOMnMPvw/s1600-h/IMG00040.jpg) [![](https://4.bp.blogspot.com/_Ng3QbVQfLZ8/SEfPAyCzrjI/AAAAAAAAR_U/Fq-qaIQjk-E /s400/IMG00041.jpg)](<a href="https://4.bp.blogspot.com/_Ng3QbVQfLZ8/SEfPAyCzrjI/AAAAAAA">https://4.bp.blogspot.com/_Ng3QbVQfLZ8/SEfPAyCzrjI/AAAAAAA</a> AR_U/Fq-qaIQjk-E/s1600-h/IMG00041.jpg) [![](<a href="http://2.bp.blogspot.com/_Ng3QbVQfLZ8/SEfO-SCzriI/AAAAAAAAR_M/jaP9miTIGAE">http://2.bp.blogspot.com/_Ng3QbVQfLZ8/SEfO-SCzriI/AAAAAAAAR_M/jaP9miTIGAE</a> /s400/IMG00042.jpg)](<a href="http://2.bp.blogspot.com/_Ng3QbVQfLZ8/SEfO-">http://2.bp.blogspot.com/_Ng3QbVQfLZ8/SEfO-</a> SCzriI/AAAAAAAAR_M/jaP9miTIGAE/s1600-h/IMG00042.jpg)</p><![CDATA[Diggnation filming at Studio B in NYC tonight]]>https://www.timbroder.com/2008/06/diggnation-filming-at-studio-b-in-nychttps://www.timbroder.com/2008/06/diggnation-filming-at-studio-b-in-nycWed, 04 Jun 2008 11:36:00 GMT<p>Kevin Rose is filming Diggnation in Brooklyn tonight for <a href="http://www.internetweekny.com/">Internet Week</a>. It starts at 6 I should be able to get out of work in time. Anyone else going?</p> <p>"Diggnation is a weekly video podcast produced by Revision3. It is hosted by Kevin Rose and Alex Albrecht, who had previously hosted TechTV's The Screen Savers together. Its main purpose is to discuss the top stories from Digg, the social bookmarking website developed by Rose and others. The format of the show usually involves Rose and Albrecht reviewing one or more brands of beer at the opening of the show, of which they will consume throughout the show, (steadily getting more and more drunk until they are almost incoherent) followed by them discussing various Digg stories from the previous week. Both audio and video versions of the podcast are available from Revision3."</p><![CDATA[5 Reasons Why RIM Should Make A BlackBerry That Runs Android]]>https://www.timbroder.com/2008/06/5-reasons-why-rim-should-makehttps://www.timbroder.com/2008/06/5-reasons-why-rim-should-makeMon, 02 Jun 2008 23:21:00 GMT<p>I'd really enjoy this. 1) I'm obviously addicted to my crackberry. 2) I'm not sure how I feel about lots of typing in a touch screen. I played with the HTC Touch over the weekend. It was cool, it was pretty, but the screen wasn't as responsive as I would have hoped. We'll see what HTC can do with the <a href="http://www.htc.com/www/product.aspx?id=46278">Diamond</a> and the <a href="https://androidcommunity.com/first-live-images-of-fullscreen-android-demo-20080528/">Dream</a></p><![CDATA[I/O: MySpace installs gears]]>https://www.timbroder.com/2008/05/io-myspace-installs-gearshttps://www.timbroder.com/2008/05/io-myspace-installs-gearsThu, 29 May 2008 21:34:00 GMT<p>Myspace unveiled a new search feature of their message center at Google I/O utilizing gears. As you search your messages, results are shown in real time, coming out of the local cache stored in gears. Hopefully this will give gears more publicity and other sited (<a href="https://www.techcrunch.com/2008/05/28/myspace-shows-facebook-how-its-done-google-gears-to-power-messaging/">ahem</a>, facebook) will take a look at it ;)</p> <p>This almost makes me want to create a myspace account to go play with it... ALMOST...</p><![CDATA[I/O: AppEngine is open!]]>https://www.timbroder.com/2008/05/io-appengine-is-openhttps://www.timbroder.com/2008/05/io-appengine-is-openThu, 29 May 2008 14:02:00 GMT<p>Appengine is no longer limited to the first 10,000 people or hackathon attendees. Anyone can set up an account but each account is still limited to 3 apps. Guess all those extra gmail accounts will come in handy eh?</p><![CDATA[I/O: Lots of Android UI Videos!]]>https://www.timbroder.com/2008/05/io-lots-of-android-ui-videoshttps://www.timbroder.com/2008/05/io-lots-of-android-ui-videosThu, 29 May 2008 13:53:00 GMT<p>Check <a href="https://androidcommunity.com/first-live-images-of-fullscreen-android-demo-20080528/">them</a> out, as usual, youtube is blocked at work for me...</p><![CDATA[I/O: Web Browser, Meet Google Earth]]>https://www.timbroder.com/2008/05/io-web-browser-meet-google-earthhttps://www.timbroder.com/2008/05/io-web-browser-meet-google-earthWed, 28 May 2008 22:14:00 GMT<p>Enabling you to switch a Google Maps mashup or page to 3D Google earth with just a few lines of javascript</p><![CDATA[I/O: AOL Joins OpenSocial]]>https://www.timbroder.com/2008/05/aol-joins-opensocialhttps://www.timbroder.com/2008/05/aol-joins-opensocialWed, 28 May 2008 18:48:00 GMT<p>After today, AOL's products will <a href="https://www.techcrunch.com/2008/05/28/aol-joins-opensocial/">support</a> Google's OpenSocial.</p><![CDATA[I/O: Android on the HTC Dream]]>https://www.timbroder.com/2008/05/io-android-on-htc-dreamhttps://www.timbroder.com/2008/05/io-android-on-htc-dreamWed, 28 May 2008 18:37:00 GMT<p>You might see some random I/O posts popping up from me over the next few days... ;) In the keynote at Google I/O, the HTC Touch was demonstrated running Android. Touch streetview, and heck, when you move the phone, streetview moves with you!</p> <p>Video on <a href="http://www.engadgetmobile.com/2008/05/28/google-demos-the-htc-dream-at-i-o-conference/">Engadget</a> and stills on <a href="http://www.talkandroid.com/101-google-io-opening-android-keynote/">Talk Android</a></p><![CDATA[Google hosting popular javascript libraries]]>https://www.timbroder.com/2008/05/google-hosting-popular-javascripthttps://www.timbroder.com/2008/05/google-hosting-popular-javascriptWed, 28 May 2008 16:04:00 GMT<p>I came across this yesterday looking for the <a href="http://mootools.net/">mootools</a> download link. Google is hosting a bunch of the popular javascript libraries on their server for you.</p> <p>Pros:</p> <ul> <li>Use Google's Bandwidth</li> <li>Google takes care of keeping the files up to date</li> <li>Common include code across your apps</li> <li>Use Google as a Fast proxy</li> <li>Gadgets will have access to cached files</li> </ul> <p>Cons:</p> <ul> <li>Have to rely on Google to keep files up to date</li> <li>Probably won't include beta releases of libraries</li> </ul> <p>The main page is <a href="http://code.google.com/apis/ajaxlibs/">here</a> and currently includes:</p> <ul> <li><a href="http://jquery.com/">jQuery</a></li> <li><a href="http://www.prototypejs.org/">prototype</a></li> <li><a href="http://script.aculo.us/">script.aculo.us</a></li> <li><a href="http://mootools.net/">MooTools</a></li> <li><a href="http://dojotoolkit.org/">Dojo</a></li> </ul> <p>Example jQuery:</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">&lt;script src="http://www.google.com/jsapi">&lt;/script> &lt;script> // Load jQuery google.load("jquery", "1"); // on page load complete, fire off a jQuery json-p query // against Google web search google.setOnLoadCallback(function() { $.getJSON("http://ajax.googleapis.com/ajax/services/search/web?q=google&amp;;v=1.0&amp;;callback=?", // on search completion, process the results function (data) { if (data.responseDate.results &amp;&amp; data.responseDate.results.length>0) { renderResults(data.responseDate.results); } }); }); &lt;/script></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[AppEngine Pricing announced]]>https://www.timbroder.com/2008/05/appengine-pricing-announcedhttps://www.timbroder.com/2008/05/appengine-pricing-announcedWed, 28 May 2008 13:55:00 GMT<p>These look pretty cheap for what you get, and if one of my little apps actually got popular enough to fall outside of the free range, I'd gladly pay for it</p> <p>Free quota to get started: 500MB storage and enough CPU and bandwidth for about 5 million pageviews per month<br> $0.10 - $0.12 per CPU core-hour<br> $0.15 - $0.18 per GB-month of storage<br> $0.11 - $0.13 per GB outgoing bandwidth<br> $0.09 - $0.11 per GB incoming bandwidth</p> <p>Google I/O started this morning, unhappy I am not there...</p><![CDATA[Google Treasure Hunt Week 3 is up]]>https://www.timbroder.com/2008/05/google-treasure-hunt-week-3-is-uphttps://www.timbroder.com/2008/05/google-treasure-hunt-week-3-is-upTue, 27 May 2008 18:36:00 GMT<p>have at</p><![CDATA[twitter2gTalk Goes Live!]]>https://www.timbroder.com/2008/05/twitter2gtalk-goes-livehttps://www.timbroder.com/2008/05/twitter2gtalk-goes-liveThu, 22 May 2008 19:01:00 GMT<p><strong>Get your tweets onto Google Talk!</strong></p> <p><a href="http://www.twitter.com">Twitter</a>: A free social networking and micro-blogging service that allows users to send "updates" (or "tweets"; text-based posts, up to 140 characters long) to the Twitter website, via short message service (SMS), instant messaging, or a third-party application such as Twitterrific or Facebook.</p> <p><a href="http://www.google.com/talk/">gTalk</a>: (Google Talk) is a Windows and web-based application for voice over internet (VOIP) and instant messaging, offered by Google.</p> <p><a href="http://twitter2gtalk.appspot.com/">twitter2gTalk</a>: Takes your current tweet and sets it as your Google Talk status (away) message.</p> <p>I've been toying with <a href="http://blog.gpowered.net/2008/03/update-google-talk-status-with-twitter.html">this</a> for a while now. I really wanted to launch twitter2gTalk as a service that anyone could use. I had the backend code all done and was dragging my feet writing the django front-end. I went to a hackathon for <a href="code.google.com/appengine/">Google AppEngine</a> and converted most of the code to run on that. You need a Google Account to login, but then again, you need one to use gTalk anyway.</p> <p>I hope some people will find this cool or useful (some people have been <a href="http://heavycrag.blogspot.com/2008/05/new-reason-to-tweet.html">waiting</a> for this and already signed up). Feel free to follow <a href="http://twitter.com/broderboy">me</a> or <a href="http://twitter.com/twit2gTalk">the app</a> on twitter for feature updates or <a href="https://feeds.feedburner.com/gPpowered">subscribe</a> to this blog.</p><![CDATA[Why Microsoft will buy Facebook and keep it closed]]>https://www.timbroder.com/2008/05/why-microsoft-will-buy-facebook-andhttps://www.timbroder.com/2008/05/why-microsoft-will-buy-facebook-andMon, 19 May 2008 21:42:00 GMT<p>Normally I don't just link to other posts, but Scoble's <a href="http://scobleizer.com/2008/05/19/why-microsoft-will-buy-facebook-and-keep-it-closed/">latest article</a> is quite a read. It delves into Microsoft + Yahoo Search + Facebook giving Google and the rest of the open web quite a hard time. Definitely work the time to read.</p><![CDATA[Android Developer Challenge Judges and Top 50 Details]]>https://www.timbroder.com/2008/05/android-developer-challenge-judges-andhttps://www.timbroder.com/2008/05/android-developer-challenge-judges-andThu, 15 May 2008 12:27:00 GMT<p>The Android developer's challenge has release most of the top 50 (a few opted to not be made public for now). A slide deck of the winners is available <a href="http://code.google.com/android/images/adc1r1_deck.pdf">here</a>. I've gone through some of them and they have been blowing me away. <a href="http://www.talkandroid.com/92-developer-challenge-top-50-android-application/">Lists</a> are being put together with the websites for the winners. There is some really exciting work being done.</p> <p>Even though its the first one on the list, AndroidScan still blows me away. It uses the phone on the camera to take a photo of a bar code, look up the product in a database, and then gets you all the information you would need about that product and where you can buy it right from your phone (amazon, ebay, etc). Do yourself a favor and watch the <a href="https://scan.jsharkey.org/">video</a>.</p> <p><img src="https://scan.jsharkey.org/vlcsnap-7082040.png.jpg" alt=""></p> <p>I'll be going through that slide deck and will be posting some more of my favorites. Anyone else hope the HTC Diamond can run Android out of the box? ;)</p><![CDATA[Appengine Hackathon!]]>https://www.timbroder.com/2008/05/appengine-hackathonhttps://www.timbroder.com/2008/05/appengine-hackathonWed, 07 May 2008 12:07:00 GMT<p>I'm heading to Google NY for the day for an appengine hackathon. I have a bazillion ideas banging around in my head. We'll see what I come back with. If anyone else is going to be there send me an <a href="mailto:timothy.broder@gmail.com">email</a> me or send me a <a href="http://twitter.com/broderboy">tweet</a></p> <p><a href="http://maps.google.com/maps?f=q&#x26;hl=en&#x26;geocode=&#x26;q=76+Ninth+Avenue,+New+York,+NY+10011&#x26;sll=40.71453,-74.00713&#x26;sspn=0.208963,0.421944&#x26;ie=UTF8&#x26;ll=40.751744,-74.000387&#x26;spn=0.003845,0.010042&#x26;z=14&#x26;iwloc=addr&#x26;source=embed">View Larger Map</a></p><![CDATA[Got my Google appengine account!]]>https://www.timbroder.com/2008/05/got-my-google-appengine-accounthttps://www.timbroder.com/2008/05/got-my-google-appengine-accountTue, 06 May 2008 23:59:00 GMT<p>But someone already registered gpowered =(</p> <p><a href="https://3.bp.blogspot.com/_Ng3QbVQfLZ8/SCDxA_mVqRI/AAAAAAAARz8/mPX39zsC2Vk/s1600-h/no_gpowered.jpg">![](https://3.bp.blogspot.com/_Ng3QbVQfLZ8/SCDxA_mVqRI/AAAAAAAARz8/mPX39zsC2Vk /s400/no_gpowered.jpg)</a></p><![CDATA[New Work Blackberry]]>https://www.timbroder.com/2008/05/new-work-blackberryhttps://www.timbroder.com/2008/05/new-work-blackberryMon, 05 May 2008 21:31:00 GMT<p>Got a new blackberry at work today: The <a href="http://www.blackberry8800series.com/blackberry8820/">8820</a>. Much nicer then my old <a href="http://na.blackberry.com/eng/devices/device-detail.jsp?navId=H0,C63,P65">clunker</a> which... err... broke... yeah we'll go with broke. Getting the curve when it comes out on Friday for Verizon. I can't install any applications on my work one, but as soon as I get my personal one, Google Blackberry app reviews will be pouring out =)</p><![CDATA[Select Google I/O sessions to be posted online]]>https://www.timbroder.com/2008/04/select-google-io-sessions-to-be-postedhttps://www.timbroder.com/2008/04/select-google-io-sessions-to-be-postedWed, 30 Apr 2008 00:17:00 GMT<p>I won't be able to attend Google I/O (It's a bit expensive on short notice for me) bit it's a relieve that some of the sessions are going to be posted online after the conference.</p><![CDATA[Added a tag cloud]]>https://www.timbroder.com/2008/04/added-tag-cloudhttps://www.timbroder.com/2008/04/added-tag-cloudTue, 29 Apr 2008 22:57:00 GMT<p>I haven't been to crazy about how Blogger's default tag/label list looks lately. On some of my shorter posts it was taking up most of the vertical space on the page. I looked around to see if I could find a more traditional tag cloud. I found a pretty good (and very easy) <a href="http://phydeaux3.blogspot.com/2006/09/code-for-beta-blogger-label-cloud.html">tutorial</a> and just installed it. I have to play with the colors a bit but I like the way it looks.</p><![CDATA[Distributing Ubuntu]]>https://www.timbroder.com/2008/04/distributing-ubuntuhttps://www.timbroder.com/2008/04/distributing-ubuntuTue, 29 Apr 2008 20:39:00 GMT<p>... is much better then Windows ;-)</p> <p><a href="https://farm3.static.flickr.com/2031/2428594983_fe30642b19_o.jpg"><img src="https://farm3.static.flickr.com/2031/2428594983_fe30642b19_o.jpg" alt=""></a> In other news: I <a href="https://shipit.ubuntu.com/">requested</a> my Hardy Heron dvd =)</p><![CDATA[Limit Google Search Results by Date]]>https://www.timbroder.com/2008/04/limit-google-search-results-by-datehttps://www.timbroder.com/2008/04/limit-google-search-results-by-dateMon, 28 Apr 2008 14:43:00 GMT<p><a href="http://www.tech-recipes.com/rx/2860/google_how_to_access_filter_by_date_dropdown_box">Tech Recipes</a> goes into how how to restrict Google search results by date: Appending <code class="language-text">&amp;amp;as;_qdr=d</code> to a search will display a drop down that lets you choose how far back in time to search.</p> <p>A <a href="http://userscripts.org/scripts/show/25684">Greasemonkey script</a> will also do this for you. Pretty useful if you are searching about a brand new issue. This would have helped me a lot when I was having a problem with <a href="http://blog.gpowered.net/2008/04/fixing-nvidia-8600-gt-on-hardy-heron.html">Hardy</a></p> <p><a href="https://1.bp.blogspot.com/_Ng3QbVQfLZ8/SBXj3PmVqPI/AAAAAAAARzs/24rQwWzgGHA/s1600-h/search_lmit.JPG"><img src="https://1.bp.blogspot.com/_Ng3QbVQfLZ8/SBXj3PmVqPI/AAAAAAAARzs/24rQwWzgGHA/s400/search_lmit.JPG" alt=""></a></p><![CDATA[Fixing Nvidia 8600 GT on Hardy Heron]]>https://www.timbroder.com/2008/04/fixing-nvidia-8600-gt-on-hardy-heronhttps://www.timbroder.com/2008/04/fixing-nvidia-8600-gt-on-hardy-heronSat, 26 Apr 2008 19:22:00 GMT<p>After updating to Hardy I got a white screen of death upon rebooting. After some research it turned out that this was more of an Nvidia driver issue rather then Ubuntu. This may not have been the most correct way to fix it, but it worked for me.</p> <ol> <li> <p>Completely remove nvidia-glx-new</p> </li> <li> <p>Remove nvidia-kernel-common (this also removes linux-restricted-modules), (I am not sure if step 2 is required)</p> </li> <li> <p>install build-essentials</p> </li> <li> <p>Download the Nvidia beta driver that came out on April 10. You can get it <a href="http://www.nvidia.com/object/linux_display_ia32_173.08.html">here</a></p> </li> <li> <p>hit ctrl + alt + f1 to break out of gnome</p> </li> <li> <p>"sudo /etc/init.d/gdm stop" to shutdown the X server</p> </li> <li> <p>sudo sh NVIDIA-Linux-x86-173.08-pkg1.run to install the driver. If it asks you to update you're xorg.conf file, let it.</p> </li> <li> <p>Reboot. ("sudo reboot") You should now be able to enable Desktop effects. YAY FISH!</p> </li> </ol> <p>This issue has also been addressed on the <a href="http://ubuntuforums.org/showthread.php?t=712479">Ubuntu Forums</a> and on <a href="https://bugs.launchpad.net/ubuntu/+source/linux-restricted-modules-2.6.24/+bug/208718">launchpad</a></p> <p><em>Note: I have a Dell XPS M1530</em></p><![CDATA[Google Code Blog: Google App Engine Hack-a-thon coming to your coast!]]>https://www.timbroder.com/2008/04/google-code-blog-google-app-engine-hackhttps://www.timbroder.com/2008/04/google-code-blog-google-app-engine-hackFri, 25 Apr 2008 14:42:00 GMT<p>I'm going to the NYC one, anyone else?</p><![CDATA[But Daddy! I want and Andoid phone NOW!]]>https://www.timbroder.com/2008/04/but-daddy-i-want-and-andoid-phone-nowhttps://www.timbroder.com/2008/04/but-daddy-i-want-and-andoid-phone-nowFri, 25 Apr 2008 14:02:00 GMT<p>A Microsoft Office editor should be available at launch and based on these <a href="http://www.talkandroid.com/85-quickoffice-for-android/">screenshots</a>, its going to be pretty useful.</p> <p>I'll have to fire up the Android emulator this weekend and see how this stacks up against mobile Google Docs and Spreadsheets.</p> <p>[![](<a href="http://2.bp.blogspot.com/_Ng3QbVQfLZ8/SBHoRfmVqOI/AAAAAAAARzk/Z6ryO5Ce-mo">http://2.bp.blogspot.com/_Ng3QbVQfLZ8/SBHoRfmVqOI/AAAAAAAARzk/Z6ryO5Ce-mo</a> /s400/veruca+salt.jpg)](<a href="http://2.bp.blogspot.com/_Ng3QbVQfLZ8/SBHoRfmVqOI/AAAA">http://2.bp.blogspot.com/_Ng3QbVQfLZ8/SBHoRfmVqOI/AAAA</a> AAAARzk/Z6ryO5Ce-mo/s1600-h/veruca+salt.jpg)</p> <p><strong><a href="http://www.imdb.com/name/nm0170628/">Veruca Salt</a></strong>: Hey, Daddy, I want an Oompa Loompa. I want you to get me an Oompa Loompa right away.<br> <strong><a href="http://www.imdb.com/name/nm0455702/">Mr. Salt</a></strong>: All right, Veruca, all right. I'll get you one before the day is out.<br> <strong><a href="http://www.imdb.com/name/nm0170628/">Veruca Salt</a></strong>: I want an Oompa Loompa now!<br> <strong><a href="http://www.imdb.com/name/nm0630019/">Violet Beauregarde</a></strong>: Can it, you nit!<br> (<a href="http://www.imdb.com/title/tt0067992/">Willy Wonka &#x26; the Chocolate Factory</a>)<a href="https://altezza.travel/safari.php">тур в крым на майские праздники 2015</a><a href="http://uc-forsage.ru/dengi-v-dolg-dlya-studentov.php" title="деньги в долг студентам">деньги в долг студентам в казани</a></p><![CDATA[Upgrade Ubuntu to 8.04 Hardy Heron]]>https://www.timbroder.com/2008/04/upgrade-ubuntu-to-804-hardy-heronhttps://www.timbroder.com/2008/04/upgrade-ubuntu-to-804-hardy-heronThu, 24 Apr 2008 14:09:00 GMT<p>Hardy Heron came out this morning and ubuntu.com is very much down for the count</p> <p>You can Still update though, click <a href="http://72.14.205.104/search?q=cache:maBlktBTwPAJ:www.ubuntu.com/getubuntu/upgrading+upgrade+ubuntu&#x26;hl=en&#x26;ct=clnk&#x26;cd=1&#x26;gl=us&#x26;client=firefox-a">here</a> for the Google Cache version.</p> <p>Happy Updating!</p> <p>New Features in this release:</p> <p><a href="https://wiki.ubuntu.com/UbiquityPreserveHome">Install on an existing filesystem without overwriting /home</a><br> When I moved from feisty to gutsy, I decided to do a fresh install. One of the things I had to do was back up my home folder, and when I finished installing gutsy I just copied it back onto my computer. This new feature will allow people to install the new version of Ubuntu without it overwriting their home folder.I'm sure this will come in very handy for people who like trying out different distro's.</p> <p><a href="https://wiki.ubuntu.com/DesktopTeam/Specs/HardyHardwareDetection">Hardy Hardware Detection</a><br> This is more of a bug fix than a new feature. Gutsy already has excellent hardware support and the plan for hardy is even better and more robust detection of hardware. Sounds good to me.</p> <p><a href="https://wiki.ubuntu.com/DesktopTeam/Specs/GdmFaceBrowser">GDM Face Browser</a><br> One of the changes I made to my gutsy is the GDM. I replaced the old one with something that allows me to just click on a picture of my username and login. This will hopefully be the default for hardy.</p> <p><a href="https://wiki.ubuntu.com/X/AutodetectMonitorFrequency">Auto Detection of Monitor Frequency</a><br> While I was testing gutsy beta I had to manually configure xorg.conf to get it to the right resolution. It wasn't fun. This should be a thing of the past with hardy as it will automatically detect everything for you. Huzzah!</p> <p><a href="https://wiki.ubuntu.com/AptAuthenticationReliability">Apt Authentication Reliability</a><br> Have you ever had an update fail for no reason? Well it actually fails because of 'transient network failures'. The aim is to make hardy more robust against these errors.</p> <p><a href="https://wiki.ubuntu.com/DesktopTeam/Specs/RestrictedManagerRewrite">Redesign Restricted-Manager Code</a><br> They want to expand the role of the restricted manager and change it so that other distro's can share the joy.<br> <a href="https://wiki.ubuntu.com/HardyFullDiskHandling"><br> Handling Full Disks</a><br> I've never had this problem with Ubuntu, but if your disk gets full, things can get quite ugly. They plan to add a notification and disk clean-up tool when your running low on space.</p> <p><a href="https://wiki.ubuntu.com/DesktopTeam/Specs/HardyDesktopEffects">Desktop Effects</a><br> Make compiz fusion more robust and easier to use.</p> <p><a href="https://wiki.ubuntu.com/DesktopTeam/Specs/HardyTheme">New Theme</a><br> Hardy Heron will be getting a shiny new theme, I hope they move away from the brown theme and choose something lighter and more fresh.</p> <p><a href="https://wiki.ubuntu.com/EasyFileSharing">Easy File Sharing</a><br> To allow people to easily share files over a network. Not more I can say about this.</p> <p><a href="https://blueprints.launchpad.net/ubuntu/+spec/multi-monitor-config">Dual/Multi Monitor Support</a><br> Currently you have to manually tweak Ubuntu if you want to use more than one monitor. They want to fix this for hardy.</p> <p><a href="https://wiki.ubuntu.com/DesktopTeam/Specs/Prefetch">Integrate Prefetch into Ubuntu</a><br> I noticed a slightly increased start up time in gutsy compared to feisty. Hardy will use file prefetch and other optimisations to speed up boot time.</p> <p><a href="https://wiki.ubuntu.com/Automatix/Ubuntu_Team_Collaboration?highlight=%20automatix%20#81830218674224151">Automatix-Ubuntu Team Collaboration</a><br> Automatix was extremely helpful for me in feisty. Although I don't use it in gutsy, its good that they are collaborating with the automatix team.</p> <p><a href="https://wiki.ubuntu.com/SingleClickInstall">Single Click Install</a><br> Installing software is already pretty straightforward in Ubuntu. They want to make it even easier to install third party applications. I'm not complaining.</p> <p><a href="https://wiki.ubuntu.com/HardyAppArmor">Apparmor Integration</a><br> This is already a part of gutsy, the plan is to increase integration to make Ubuntu even safer.</p> <p><a href="https://blueprints.launchpad.net/ubuntu/+spec/ubuntu-firewall">Firewall</a><br> Make it easier for users to configure their firewall.</p> <p><a href="https://blueprints.launchpad.net/ubuntu/+spec/third-party-apt">Third Party Apt</a><br> Now when you install third party apps, you have to manually add the software repository to the sources.list. This spec makes it easy for users to install third party software and have it update automatically.</p> <p><a href="https://wiki.ubuntu.com/DesktopTeam/Specs/ExitStrategy"><strong>Revamped Logout Screen</strong></a><br> They want to streamline the options you have when you click that big red button, to make things less confusing.</p> <p>[Better Integrated Wine](<a href="https://blueprints.launchpad.net/ubuntu/+spec/better-">https://blueprints.launchpad.net/ubuntu/+spec/better-</a> integrated-wine)<br> Better Wine will make it easier for Windows users to convert, thus helping to solve <a href="https://blueprints.launchpad.net/bugs/1">bug #1</a>.</p> <p><a href="https://wiki.ubuntu.com/Xorg7.3Integration">Xorg 7.3</a><br> This is one of the features that missed the gutsy deadline. This should make manual configuration of xorg.conf obsolete. Another much anticipated feature is Bullet Proof X, which will go into a graphical safe mode if anything goes wrong with X.</p> <p><a href="https://wiki.ubuntu.com/SlickBoot">Slick Boot</a><br> To improve the boot and shutdown process and also make the things look nicer.</p><![CDATA[Almost time for a new Ubuntu]]>https://www.timbroder.com/2008/04/almost-time-for-new-ubuntuhttps://www.timbroder.com/2008/04/almost-time-for-new-ubuntuTue, 22 Apr 2008 10:59:00 GMT<p>Ubuntu 8.04, <a href="https://wiki.ubuntu.com/HardyHeron/">Hardy Heron</a> comes out in two days</p> <p>Be ready for it.</p> <p><em>(Or install it <a href="https://help.ubuntu.com/community/HardyUpgrades#head-d552909d23532acc4ecb9a4c51a902e79caab0e8">now</a>)</em></p><![CDATA[Google Website Optimizer is out of beta]]>https://www.timbroder.com/2008/04/google-website-optimizer-is-out-of-betahttps://www.timbroder.com/2008/04/google-website-optimizer-is-out-of-betaSat, 19 Apr 2008 02:46:00 GMT<p>Google's <a href="http://www.google.com/websiteoptimizer">Website Optimizer</a> is out of beta. I'll be running the blog portion of gPowered through it to see what it thinks of a blogger generated page ;) Results to follow.</p> <p>Everyone have a good weekend! I know I need it!</p><![CDATA[Non Google AppEngine hosting]]>https://www.timbroder.com/2008/04/non-google-appengine-hostinghttps://www.timbroder.com/2008/04/non-google-appengine-hostingFri, 18 Apr 2008 20:05:00 GMT<p>If you are like me, and are waiting to get in on the action, check it out: <a href="http://appdrop.com/">http://appdrop.com/</a></p><![CDATA[Best Android quote]]>https://www.timbroder.com/2008/04/best-android-quotehttps://www.timbroder.com/2008/04/best-android-quoteThu, 10 Apr 2008 23:00:00 GMT<blockquote> <p>Android handsets are poised to spread like wildfire across the open source and</p> </blockquote> <p>developer communities upon release.</p> <p>I can't wait. Verizon better have Android</p><![CDATA[test from my blackberry]]>https://www.timbroder.com/2008/04/test-from-my-blackberryhttps://www.timbroder.com/2008/04/test-from-my-blackberryThu, 10 Apr 2008 19:23:00 GMT<p>If you are reading this. I was able to post from my work blackberry, neat</p> <p><em>(Waiting for a baby shower, I mean meeting, to start. Currently guarding the cake) Mmmmm cake</em></p><![CDATA[Blogger adds bloggroll]]>https://www.timbroder.com/2008/04/blogger-adds-bloggrollhttps://www.timbroder.com/2008/04/blogger-adds-bloggrollThu, 03 Apr 2008 22:37:00 GMT<p>[Blogger](<a href="http://buzz.blogger.com/2008/04/blog-list-scheduled-post-publishing-">http://buzz.blogger.com/2008/04/blog-list-scheduled-post-publishing-</a> on.html) in <a href="http://draft.blogger.com/">draft</a> added 2 new features today: a blogroll page element, and post scheduling. Post scheduling is pretty useful, you can write up your post, set the time (in the future) that you want it to post, and Blogger will do it automatically. The second feature, a blogroll, I would like a lot more if it was done better. The main thing I like about it is that it integrates with Google Reader so if I'm linking to my friend's blogs, I just scroll to my 'Friends' Tag and add them. The thing I don't like however is that it does not support <a href="http://gmpg.org/xfn/">XFN</a> or <a href="http://gmpg.org/xfn/">FOAF</a> therefore not getting picked up by the <a href="http://code.google.com/apis/socialgraph/docs/">SocialGraph API</a>. For example, if I linked to my <a href="http://maybe-not.net/" title="Laura&#x27;s blog">girlfriend's blog</a>, the blogroll just lists this as</p> <div class="gatsby-highlight" data-language="html"><pre style="counter-reset: linenumber NaN" class="language-html line-numbers"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">'</span>http://maybe-not.net/<span class="token punctuation">'</span></span> <span class="token attr-name">target</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">'</span>_blank<span class="token punctuation">'</span></span><span class="token punctuation">></span></span>Maybe-Not<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <p>A better link, for example from a <a href="http://www.wordpress.org">wordpress</a> blogroll would look something like</p> <div class="gatsby-highlight" data-language="html"><pre style="counter-reset: linenumber NaN" class="language-html line-numbers"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://maybe-not.net/<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>friend sweetheart<span class="token punctuation">"</span></span> <span class="token attr-name">title</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Laura<span class="token entity" title="&#8217;">&amp;#8217;</span>s blog<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Maybe-Not<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span>&lt; </code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <p>...and get picked up but the SocialGraph as having a relationship to me. Blogger is great and I love using it, but the features of wordpress are blowing it out of the water.</p><![CDATA[Update Google Talk status with Twitter]]>https://www.timbroder.com/2008/03/update-google-talk-status-with-twitterhttps://www.timbroder.com/2008/03/update-google-talk-status-with-twitterSun, 30 Mar 2008 23:11:00 GMT<p>I've had this idea in my head for a while and just got it to work this morning.</p> <p>Basically you send a tweet from <a href="http://twitter.com/broderboy">Twitter</a> and this script runs, picks up your current twitter status, and if need be, updates your gChat status. I'm working on a service version of this where you could use gpowered.net to do all this for you. Stay tuned =) If I change the version of the script that I have running in the service, you will be able to see the source code that I have checked in [here](<a href="http://code.google.com/p/gpo">http://code.google.com/p/gpo</a> wered/source/browse/trunk/gpowered/scripts/twitter2gChat.py)</p> <p>For those of you that don't know what Twitter is: _<br> "Twitter is a free social networking and micro-blogging service that allows users to send "updates" (or "tweets"; text-based posts, up to 140 characters long) to the Twitter website, via short message service (e.g. on a cell phone), instant messaging, or a third-party application such as Twitterrific or Facebook. Updates are displayed on the user's profile page and instantly delivered to other users who have signed up to receive them. The sender can restrict delivery to those in his or her circle of friends (delivery to everyone is the default). Users can receive updates via the Twitter website, instant messaging, SMS, RSS, email or through an application. For SMS, four gateway numbers are currently available: short codes for the USA, Canada, and India, as well as a UK number for international use. Several third parties offer posting and receiving updates via email." (<a href="http://en.wikipedia.org/wiki/Twitter">Wikipidia</a>)_</p> <p>Requirements:<br> <a href="http://xmpppy.sourceforge.net/">xmpppy</a><br> <a href="http://code.google.com/p/python-twitter/">python-twitter</a></p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">import sys, xmpp, os, twitter class Twitter2gChat: twitter_login = os.environ['TWITTER_LOGIN'] twitter_pass = os.environ['TWITTER_PASS'] google_login = os.environ['GOOGLE_LOGIN'] google_pass = os.environ['GOOGLE_PASS'] twitter_status = None updated = False catches = 0 #keep looping and wait for xmpp response def GoOn(self,conn): while self.StepOn(conn): pass #keep listening for responses def StepOn(self,conn): try: conn.Process(1) except KeyboardInterrupt: return 0 return 1 #handle responses def iqHandler(self, conn,iq_node): print 'in iqHandler' self.catches = self.catches + 1 #we have looped enough, die if self.catches == 4: print 'i think we did it' sys.exit(0) #print response, don't need to send anything back if self.updated == True: print iq_node #havn't updated yet, sent status update else: #we can build of response node = iq_node.getChildren()[0] #remove what we don't ned node.delAttr('status-list-max') node.delAttr('status-max') node.delAttr('status-list-contents-max') iq_node.delAttr('from') iq_node.delAttr('type') iq_node.delAttr('to') #update the current status curr_status = node.getChildren()[0] #no need to update if curr_status.getData() == self.twitter_status: print 'status is already tweet' sys.exit(0) curr_status.setData(self.twitter_status) #set response iq_node.setType('set') print 'sending' print iq_node self.updated = True conn.send(iq_node) print 'end of iqHandler\n\n' #start talking to the server and update status def updateGtalkStatus(self): #connect jid=xmpp.protocol.JID(self.google_login) cl=xmpp.Client(jid.getDomain(),debug=[]) if not cl.connect(('talk.google.com',5222)): print 'Can not connect to server.' sys.exit(1) if not cl.auth(jid.getNode(),self.google_pass): print 'Can not auth with server' sys.exit(1) #build query to get current status iq = xmpp.Iq() iq.setType('get') iq.setTo('timothy.broder@gmail.com') node = xmpp.Node() node.setName('query') node.setAttr('xmlns', 'google:shared-status') iq.addChild(node=node) print iq #register with server and send subscribe to status updates cl.RegisterHandler('iq',self.iqHandler) cl.send(iq) self.GoOn(cl) cl.disconnect() #get current twitter status def getTwitterStatus(self): api = twitter.Api(username=self.twitter_login, password=self.twitter_pass) self.twitter_status = api.GetUserTimeline(self.twitter_login, 1)[0].text #don't want to use replies if self.twitter_status.find('@') >= 0: sys.exit(0) t = Twitter2gChat() t.getTwitterStatus() t.updateGtalkStatus()</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[Ressurection]]>https://www.timbroder.com/2008/03/ressurectionhttps://www.timbroder.com/2008/03/ressurectionWed, 19 Mar 2008 02:15:00 GMT<p>Hi all,</p> <p>I've been away for a while and for this I apologize. It's been a combination of work, real life, and traveling (both for work and for fun). Since my last post I've been to Tokyo, Southern Ireland, Paris, London, and Colorado, the longest stint being in London where I was working for a while. Check out my photos below.</p> <p>A lot has happened in my absence. At the top of my list are <a href="http://code.google.com/android">Android,</a> <a href="http://code.google.com/apis/opensocial">Open Social</a>, the <a href="http://code.google.com/apis/socialgraph">Social Graph</a>, and many many more. Just this morning RIM released an eclipse plugin for their IDE (the original one was a royal pain to get working on Linux). Expect me to try to get some Google API's running on it quite soon ;-)</p> <p>I'm toying with changing the format of the blog slightly: less articles, more content in each post. I would love to do a couple of posts each day like I used to but with work I just don't have the time. I work on <a href="http://www.lehman.com">Lehman Brother's</a> Brokerage Calculation Engine, and believe me, it never sleeps.</p> <p>I do have quite a few projects in the works though and I'll be posting about them soon: I want to try to get Google Bookmarks into a BlackBerry app, another side project to track online social web presence, and another involving <a href="http://twitter.com/broderboy">twitter</a> (which i joined a little while ago) and gChat. Should be fun, stay tuned ;)</p> <h2><a href="http://picasaweb.google.com/timothy.broder/Ireland">![](https://lh4.google.com/timothy.broder/R7oQM3bLe9E/AAAAAAAAQyw/3s0RxCSXkeU/ s160-c/Ireland.jpg)</a></h2> <h2><a href="http://picasaweb.google.com/timothy.broder/Ireland">Ireland</a><br> <a href="http://picasaweb.google.com/timothy.broder/Paris">![](https://lh6.google.com/timothy.broder/R7oW0XbLjZE/AAAAAAAARFI/NV_hA4idkxI/ s160-c/Paris.jpg)</a></h2> <p><a href="http://picasaweb.google.com/timothy.broder/Paris">Paris</a></p> <h2><a href="http://picasaweb.google.com/timothy.broder/London">![](https://lh4.google.com/timothy.broder/R7oyA3bLn1E/AAAAAAAARTA/1AHidVMV82c/ s160-c/London.jpg)</a></h2> <h2><a href="http://picasaweb.google.com/timothy.broder/London">London</a><br> <a href="http://picasaweb.google.com/timothy.broder/VisitingSeanInColorado">![](https://lh6.google.com/timothy.broder/R-B2C6mnXuE/AAAAAAAARlg/aDtJJCZj-fU/ s160-c/VisitingSeanInColorado.jpg)</a></h2> <p><a href="http://picasaweb.google.com/timothy.broder/VisitingSeanInColorado">Visiting Sean in Colorado</a></p><![CDATA[gPhone, or lack there of]]>https://www.timbroder.com/2007/11/gphone-or-lack-there-ofhttps://www.timbroder.com/2007/11/gphone-or-lack-there-ofThu, 08 Nov 2007 01:09:00 GMT<p>To be honest, when I heard that Google was going to announce whatever it is they have been working on with a "gPhone" I was really excited. The announcement of Android, their new open mobile platform is cool and all, but I was a little disappointed. Granted thats because might have been expecting something as cool as the iPhone, or that I desperately need a new phone. I've been following the <a href="http://www.openmoko.com/">openmoko</a> project and its going to be intersting how Android compares to it. For the full Android story, check out these articles</p> <ul> <li><a href="http://googleblog.blogspot.com/2007/11/wheres-my-gphone.html">Where's my Gphone?</a></li> <li><a href="http://gizmodo.com/gadgets/gphone/analysis-the-android-google-phone-and-the-four-carriers-319127.php">Analysis: Google's Android Phone and the Four Carriers</a></li> <li><a href="http://mashable.com/2007/11/05/google-android/">GPhone: The Facts are In; Google Launching Open Mobile Platform</a></li> <li><a href="http://mashable.com/2007/11/04/gphone-european-exec-confirms-its-existence/">gPhone: European Exec Confirms Its Existence</a></li> <li><a href="http://googlesystem.blogspot.com/2007/11/google-launches-android-open-mobile.html">Google Launches Android, an Open Mobile Platform</a></li> <li><a href="http://googlified.com/2007google-phone-announced/">Google Phone Announced</a></li> <li><a href="http://rejon.org/2007/11/05/open-mobile-space-growing/">Open Mobile Space Growing</a></li> <li><a href="http://blogoscoped.com/archive/2007-11-05-n74.html">Android: The "Gphone" Mobile Platform</a></li> <li><a href="http://www.nytimes.com/2007/11/04/technology/04google.html?_r=1&#x26;pagewanted=all">I, Robot: The Man Behind the Google Phone</a></li> </ul><![CDATA[October Speedlinking]]>https://www.timbroder.com/2007/11/october-speedlinkinghttps://www.timbroder.com/2007/11/october-speedlinkingMon, 05 Nov 2007 23:17:00 GMT<p>I haven't been able to post as often or as in depth as I'd like to have this past month. I chalk it up mostly to work, we all love 12 hour days right? But now that sign-off has passed and our last release of 2007 is calmly approaching (its on Friday), things have settled down a bit. Below are some great links from October, most of which I wanted to mention at some point and haven't gotten a chance to until now. Enjoy.</p> <ul> <li> <p>The <a href="http://googlemashupeditor.blogspot.com/2007/09/authenticated-calendar-support-via-new.html">JavaScript Library</a> for Google Calendar was released. This allows for authenticated, cross domain access. Hopefully Picasa Web will follow suit.</p> </li> <li> <p><a href="http://googlewebtoolkit.blogspot.com/2007/09/gwt-application-development-for-iphone.html">GWT</a> goes to the iPhone</p> </li> <li> <p>The <a href="http://googledataapis.blogspot.com/2007/09/python-client-library-same-great-taste.html">Python Client Library</a> came out with version 1.0.8</p> </li> <li> <p>The <a href="http://gearsblog.blogspot.com/2007/09/digg-oracle-using-workerpool-as-well-as.html">Digg Oracle</a> demonstrates Gears' Worker Pool</p> </li> <li> <p>Google's <a href="http://googlified.com/2007google-stock-passes-600-mark/#comment-17313">Stock broke $600</a>. It is now well over $700</p> </li> <li> <p><a href="http://mashable.com/2007/10/08/orkut/">Orkut</a> ramps up for a US push</p> </li> <li> <p><a href="http://gearsblog.blogspot.com/2007/10/vortex-simple-new-offline-and-sync.html">Vortex</a> combines the know-how of Dojo and Gears</p> </li> <li> <p><a href="http://googlemapsapi.blogspot.com/2007/10/labeledmarker-v11-now-supporting-marker.html">LabeledMarker v1.1</a> in Google Maps comes out with Marker and Label toggling</p> </li> <li> <p>Google Reader comes out with <a href="http://googlesystem.blogspot.com/2007/10/find-number-of-google-subscribers-for.html">Subscriber stats</a>. Read about the controversy <a href="http://blog.gpowered.net/2007/10/google-reader-stats-out-of-wack.html">here</a>. Google responds <a href="http://googlereader.blogspot.com/2007/10/subscriber-stats-summed-up.html">here</a></p> </li> <li> <p><a href="http://googlesystem.blogspot.com/2007/10/google-maps-becomes-social.html">Google Maps Goes Social</a></p> </li> <li> <p>The <a href="http://googleajaxsearchapi.blogspot.com/2007/10/direct-access-to-youtube-channels.html">AJAX Search API</a> gives direct access to YouTube Channels</p> </li> <li> <p>Blogger GData JavaScript client library released with <a href="http://google-code-updates.blogspot.com/2007/10/blogger-gdata-javascript-client-library.html">offline Blogger client example</a></p> </li> <li> <p>Google Code Search <a href="http://google-code-updates.blogspot.com/2007/10/tell-us-about-code-on-your-site-with.html">goes to SiteMaps</a></p> </li> <li> <p>The Ajax API gets <a href="http://googleajaxsearchapi.blogspot.com/2007/10/ajax-feed-api-addition-dynamic-feed.html">Dynamic Feed Control</a></p> </li> <li> <p>You can now play <a href="http://google-latlong.blogspot.com/2007/10/now-playing-youtube-videos-in-google.html">Youtube videos in Google Earth</a></p> </li> <li> <p>Summer of code wrapped up with <a href="http://google-code-updates.blogspot.com/2007/10/wrapping-up-our-third-summer-of-code.html">Graduation</a></p> </li> <li> <p><a href="http://mashable.com/2007/10/24/google-finance-gadgets/">Google Finance adds new Gadgets and an API</a></p> </li> <li> <p>YouTubes player becomes <a href="http://googlesystem.blogspot.com/2007/10/customize-youtubes-player.html">Customizable</a></p> </li> <li> <p>A Greasemonkey script lets you have <a href="http://googlesystem.blogspot.com/2007/10/nested-folders-in-gmail.html">nested folders</a> in Gmail</p> </li> <li> <p>Blogger adds <a href="http://buzz.blogger.com/2007/10/subscribe-to-comments-by-email.html">Comment Notification</a></p> </li> <li> <p>Google <a href="http://www.entrepreneurs-journey.com/864/possible-explanations-for-the-pagerank-penalty-sweep/"> cracks down</a> on pages selling PageRank links</p> </li> <li> <p>Google contributes to <a href="http://mashable.com/2007/10/25/mysql-google/">MySQL</a></p> </li> <li> <p>Google Mac <a href="http://googlemac.blogspot.com/2007/10/google-desktop-update-for-leopard.html">updates Leopard</a></p> </li> <li> <p>Gmail <a href="http://gmailblog.blogspot.com/2007/10/sync-your-inbox-across-devices-with.html">enables IMAP</a></p> </li> <li> <p>Google Maps gets <a href="http://googlemapsapi.blogspot.com/2007/10/clickable-polys-old-school-image-maps.html">Clickable Polygons</a></p> </li> <li> <p>There is now a wizard for adding <a href="http://bloggerindraft.blogspot.com/2007/10/new-feature-gadgets-for-your-blog.html">Google Gadgets to your blog</a></p> </li> <li> <p>Webmaster central fixes the <a href="http://googlewebmastercentral.blogspot.com/2007/10/dealing-with-sitemap-cross-submissions.html">Cross Domain Sitemap errors</a></p> </li> <li> <p>Google maps <a href="https://feeds.feedburner.com/~r/OfficialGoogleMapsApiBlog/~3/174019883/make-your-kml-flash-y.html">adds Flash Content</a> into KLM</p> </li> <li> <p><a href="http://googlesystem.blogspot.com/2007/11/google-notebook-adds-labels-and.html">Google Notebook adds labels and bookmarks</a></p> </li> <li> <p>Blog Search is <a href="http://googlesystem.blogspot.com/2007/11/blog-search-included-in-google-history.html">now included</a> in Google History</p> </li> <li> <p>A cheap "<a href="http://googlesystem.blogspot.com/2007/11/tentative-google-pc.html">Google PC</a>" is on the market</p> </li> <li> <p>A new <a href="http://googlesystem.blogspot.com/2007/10/google-photo-picker.html">Photo Picker</a> for Gmail and Orkut pulls from Picasa</p> </li> <li> <p>GTalk may soon be able to <a href="http://googlesystem.blogspot.com/2007/10/google-to-connect-to-other-im-networks.html">connect to other networks</a> like AIM and Yahoo! Talk</p> </li> <li> <p>The <a href="http://googlesystem.blogspot.com/2007/10/gmails-new-version-is-now-available.html">new version</a> of Gmail comes out</p> </li> <li> <p>Google Code gets a <a href="http://googlified.com/2007new-google-code/">facelift</a></p> </li> <li> <p>Webmaster Tools gets <a href="http://googlified.com/2007set-geographic-target-in-webmaster-tools/">Geographic Targeting</a></p> </li> <li> <p>The Google Gadget Directory gets a <a href="http://blogoscoped.com/archive/2007-11-01-n78.html">facelift</a></p> </li> <li> <p>Microsoft is going to release the <a href="http://mashable.com/2007/11/04/microsoft-sync-framework/">Microsoft Sync Framework</a> to compete with Gears</p> </li> <li> <p>Picasa Web gets <a href="http://googlephotos.blogspot.com/2007/11/better-connections-with-picasa-web.html">opened</a>. (Flikr can transfer a picasa album to itself)</p> </li> <li> <p>Webmasters can now <a href="http://googlewebmastercentral.blogspot.com/2007/10/webmasters-can-now-provide-feedback-on.html">provide feedback</a> on sitelinks</p> </li> <li> <p><a href="http://gearsblog.blogspot.com/2007/10/bloggears-offline-blogger-client.html">Blog.gears</a> comes out</p> </li> <li> <p>Mapplets gets a documentation and example <a href="http://googlemapsapi.blogspot.com/2007/10/updated-documentation-examples-for.html">update</a></p> </li> <li> <p>New articles are posted for <a href="http://googlemapsapi.blogspot.com/2007/10/kml-articles-abound-its-about-time.html">KML</a></p> </li> <li> <p>The Ajax slideshow gets a full <a href="http://googleajaxsearchapi.blogspot.com/2007/10/slide-show-update-full-control-panel.html">Control Panel</a></p> </li> <li> <p><a href="http://googlemapsapi.blogspot.com/2007/10/map-of-dead-screen-overlayed-shoot-em_31.html">Map of the Dead!!</a> Google Maps overlay shooting game!</p> </li> </ul><![CDATA[Linux Distro Popularity According to Google]]>https://www.timbroder.com/2007/10/linux-distro-popularity-according-tohttps://www.timbroder.com/2007/10/linux-distro-popularity-according-toTue, 30 Oct 2007 02:30:00 GMT<p>Over the years I've used a variety of Linux Distros: Mandrake, Red Hat, FreeBSD, Fedora, Gentoo, and Ubuntu. <a href="http://distrowatch.com/">Distrowatch</a> keeps track of everything we need to know about the distros, and recently there has been an enormous push in desktop Linux thanks to Dell putting Ubuntu on desktops and <a href="http://www.compiz-fusion.org">Compiz-Fusion</a> bringing snazzy eye candy to even low end machines. Distrowatch gives some pretty decent stats on the main Distros but for a while I've wanted to know how Google sees their popularity; mainly by how many pages mention specific distros.</p> <p>Using some python, a spreadsheet, and a little scraping, I was able to get my answer. To see how Google would rank different distros I'm using the number of results Google returns when searching for the Distro's name as my numbers. I'm going to write a HOWTO on the technical aspects of what I did sometime this week, but here are the basic steps</p> <ol> <li>In a Google Spreadsheet I made a sheet that held the names of the top distros on Distrowatch.</li> <li>Another sheet holds the full list from distro watch (366 on record at the time of this writing)</li> <li>I set up a dapp to take these names, and return the number of results Google would have if you searched them</li> <li>A python script pulls the distros out of the spreadsheet, queries the dapp, and puts the results back into another sheet</li> </ol> <p>I have 2 sets of results. One is a query using the vanilla list out of the spreadsheet. The second is appending the word Linux to the distro if it does not already have it as the title, I was curious as to how this would effect the results. Below are the results of the most popular Distros on Distrowatch. Look, Ubuntu! The spreadsheet that has all of the findings (and all 366 distros) is shared <a href="https://spreadsheets.google.com/pub?key=p919ps7OYXvugbqx9SegSTw">here</a></p> <table> <thead> <tr> <th><strong>Distro</strong></th> <th><strong>Page Hist</strong></th> </tr> </thead> <tbody> <tr> <td>Ubuntu</td> <td>96,800,000</td> </tr> <tr> <td>FreeBSD</td> <td>36,700,000</td> </tr> <tr> <td>Fedora</td> <td>35,800,000</td> </tr> <tr> <td>openSuse</td> <td>29,500,000</td> </tr> <tr> <td>Debian Linux</td> <td>28,100,000</td> </tr> <tr> <td>KNOPPIX</td> <td>12,500,000</td> </tr> <tr> <td>Mandriva Linux</td> <td>5,720,000</td> </tr> <tr> <td>Gentoo Linux</td> <td>4,430,000</td> </tr> <tr> <td>PCLinuxOS</td> <td>3,170,000</td> </tr> <tr> <td>Slackware Linux</td> <td>3,010,000</td> </tr> <tr> <td>MEPIS Linux</td> <td>1,640,000</td> </tr> </tbody> </table> <p><img src="https://spreadsheets.google.com/pub?key=p919ps7OYXvugbqx9SegSTw&#x26;oid=2&#x26;output=image" alt="Distro Chart"></p> <p>Stay tuned for the code behind it! <a href="https://feeds.feedburner.com/gPpowered">Subscribe</a> to the feed to get more updates.</p><![CDATA[Google Overheard in the Office]]>https://www.timbroder.com/2007/10/google-overheard-in-officehttps://www.timbroder.com/2007/10/google-overheard-in-officeFri, 26 Oct 2007 01:20:00 GMT<p>A few days ago I <a href="http://blog.gpowered.net/2007/10/google-overheard-in-new-york.html">posted</a> some <a href="www.overheardinnewyork.com">Overheard in New York</a> Google Posts. Today is some <a href="http://www.overheardintheoffice.com">Overhead in the Office</a>. It's not quite as good as the orriginal, but the office posts are still really funny. If you like these, <a href="http://www.overheardintheoffice.com/atom.xml">subscribe</a> to the feed, enjoy!</p> <p><strong>No Problem, Then</strong><br> Coworker #1 on speakerphone: How do I Google something?<br> Coworker #2: Go to W-W-W dot Google dot com. Then just use it like any other search engine.<br> Coworker #1: What's a search engine?<br> Coworker #2: You know, like when you use Yahoo or MSN to look something up.<br> Coworker #1: I've never Googled before in my life, and I never want to again!</p> <p>Overheard by: it actually got worse</p> <p><strong>Or Time Management. Whatever.</strong><br> Office manager: I'm going to Google time travel!</p> <p><strong>What Happens When You Use Google China</strong><br> Office manager: Civil War Battlefield Protection, how can I help you?<br> Woman on phone: Yes, I'm trying to find information on the Civil War and I just can't.<br> Office manager: Well, have you tried the internet?<br> Woman: Yes, I typed "Civil War" into Google and NOTHING comes up on the Civil War.<br> Office manager: ...Really?<br> Woman: Yes... so can you tell me who was in the Civil War?<br> Office manager: That would be the northern states and the southern states.<br> Woman: Not the British?<br> Office manager: Um, that was the Revolutionary War.<br> Overheard by: Astonished</p> <p><strong>Just Scan in His Photo and Use Face-Recognition Google</strong><br> Boss: I went to school with this guy...I don't remember his name, but he just became the president of some real estate development company in DC. Can you look him up on the internet? I'd like to send him a note.</p> <p><strong>I Think You'll Like the Results</strong><br> Boss : What is that red thing on top of a rooster's head called? I can't find a description anywhere on the Internet.<br> Employee: Just Google 'cock' and 'diagram.'</p> <p><strong>Internship</strong><br> Boss: How many servers do you think Google has?<br> Lackey: Infinite.<br> Boss: Infinite? You're a retard.<br> Overheard by: choking on a brownie</p> <p><strong>Technical Know-How</strong><br> Boss on phone: Wait, wait, wait, does your computer have Google on it? Yeah, just type it in there.</p> <p><strong>Update PR File</strong><br> CTO: My interview article is in USA Today!<br> Programer: Can you send me the link? Never mind, I'll just Google "USA Today"</p> <p><strong>Back to Work</strong><br> Engineer: I'm against Google Earth! The terrorists are using it! And the communists!</p> <p><strong>Sensitivity Training</strong><br> Boss: So what's the going rate for hiring midgets these days?<br> Boss: Yeah, I'm sure you can just fire up Google and type in "Midget to hire tri-state" and somthin's gonna pop up.</p> <p><strong>Send Out Press Release</strong><br> Boss: So see if you can find these people's email addresses.<br> Intern: ...You want me to find Desmond Tutu's email address?<br> Boss: Try Google if you get stumped.</p> <p><strong>Back to Work</strong><br> Producer: My friend went to the Galapagos Islands and was astounded. They have birds called blue boobies. Google "blue boobies". You'll see pictures of them.<br> Suit: I'm not searching for blue boobies on my computer. I'll get called into the office for a talk.<br> Producer: Oh, I'll do it...see?<br> Suit: Wow, who would have thought that would't have brought up a porn site?</p> <p><strong>Scan PC</strong><br> Tech: Oh crap, I've been infected by Google.</p> <p><strong>Install Yahoo!</strong><br> Boss: Do we have Google installed on our internet?<br> IT guy: We put it on your machine yesterday.</p><![CDATA[Google Reader stats out of Wack]]>https://www.timbroder.com/2007/10/google-reader-stats-out-of-wackhttps://www.timbroder.com/2007/10/google-reader-stats-out-of-wackThu, 25 Oct 2007 00:27:00 GMT<p>First, <a href="https://www.techcrunch.com/2007/10/14/top-blogs-on-google-reader/">Techcrunch</a> came up with a list of the top blogs that users subscribe to using Google Reader. The top 3 on the list were BBC with 202,463, Google News wih 192,100, and ESPN with 189,274 . Remember, these are only the stats if the subscriber is using Google Reader, obviously there are blogs with a higher subscription count, such as the <a href="http://googleblog.blogspot.com/">Official Google Blog</a> (They still haven't moved over to blogs.google.com eh?) with over 669,000 subscribers as reported by FeedBurner.</p> <p>It was all well and good that Google Reader showed high stats for these blogs, but.... we were apparently duped...</p> <p>In his article <a href="http://mashable.com/2007/10/15/google-reader-stats-are-bullshit-with-proof/">Google Reader Stats are BullSh*t (With Proof)</a>, Pete Cashmore goes into his explanation of the "default feed effect." A default feed is a feed that comes already subscribed in a news aggregator , or is part of a default group (like say Digg, Engadget, and Gizmodo being in the Technology group on Google Reader). Being in these groups is a major traffic boost.</p> <p>However the system has some flaws</p> <ul> <li> <p>There is subscription data for feeds that don't exist</p> </li> <li> <p>Google Reader does not check to see if a subscriber is active or not. (Someone signs up for Reader, adds a feed, and never touches Reader again, they count as a subscriber)</p> </li> <li> <p>Feedburner pulls some stats from Google Reader</p> </li> <li> <p>This problem is not limited to Google Reader. It includes many feed readers and start pages</p> </li> </ul> <p>Tune in next time after I do some research into how out wack FeedBurner statistics are.</p><![CDATA[New Blog Address]]>https://www.timbroder.com/2007/10/new-blog-address_23https://www.timbroder.com/2007/10/new-blog-address_23Tue, 23 Oct 2007 23:34:00 GMT<p>After doing quite a bit of reading over at Yaro Starak's <a href="http://www.entrepreneurs-journey.com/">Entrepreneur's Journey</a> and Darren Rowse's <a href="http://problogger.net">ProBlogger.net</a> I've decided to move gPowered onto my domain at <a href="http://blog.gpowered.net/">http://blog.gpowered.net/</a>.</p> <p>Over the coming days/weeks I'll be updating the template on the rest of the domain to coincide more with the blog, as well as adding the top menu to the blog. The blog is still powered by blogger and the old address nicely forwards to the new one, posts included. I also updated the <a href="https://feeds.feedburner.com/gPpowered">FeedBurner feed</a> so if you use that to subscribe you shouldn't have to change anything (although with the forwarding I don't think it matters, but why risk it). I also set up gpowered.net and <a href="http://www.gpowered.net">www.gpowered.net</a> to forward to the blog as the main page. Any of my python examples will be moved from <a href="https://gpowered.net">https://gpowered.net</a> to <a href="https://gpowered.net/g/">https://gpowered.net/g/</a>. I'm going to update all of the posts to reflect this.</p><![CDATA[Mashup of the Week]]>https://www.timbroder.com/2007/10/mashup-of-weekhttps://www.timbroder.com/2007/10/mashup-of-weekTue, 23 Oct 2007 22:16:00 GMT<p>It's been a little more then a week... Chalk it up to quite a bit of traveling. I'm around now until December, I promise ;)</p> <p>**This weeks winner: <a href="http://www.mappington.com">Mappington</a><br> ** API's used:</p> <ul> <li><a href="http://api.eventful.com/">Eventful</a></li> <li><a href="http://www.flickr.com/services/">Flickr</a></li> <li><a href="http://www.geonames.org/export/">GeoNames</a></li> <li><a href="http://www.google.com/apis/maps/">Google Maps</a></li> <li><a href="http://developer.kayak.com/">Kayak</a></li> <li><a href="http://dev.live.com/virtualearth">Microsoft Virtual Earth</a></li> <li><a href="http://technorati.com/developers/">Technorati</a></li> <li><a href="http://www.weather.com/services/xmloap.html">Weather Channel</a></li> <li><a href="http://developer.yahoo.com/answers">Yahoo Answers</a></li> <li><a href="http://developer.yahoo.net/search/local/">Yahoo Local Search</a></li> <li><a href="http://developer.yahoo.com/maps/">Yahoo Maps</a></li> <li><a href="http://developer.yahoo.com/traffic/index.html">Yahoo Traffic</a></li> <li><a href="http://developer.yahoo.com/travel/">Yahoo Travel</a></li> <li><a href="http://code.google.com/apis/youtube/overview.html">YouTube</a></li> </ul> <p>Why it won: Mappington is the most inclusive map / location information hub I have ever come across. "Mappington is a user created atlas of the world." It covers the following:</p> <ul> <li>Maps: Google Maps, Virtual Earth, Yahoo Maps, Google Earth</li> <li>Photos: Flickr</li> <li>Videos: Youtube</li> <li>Wikipedia Entries</li> <li>Opinions / Rating section</li> <li>Social Web on Wikipedia, Facebook, del.icio.us, furl, Yahoo MyWeb, Wink, ma.gnolia, spurl</li> <li>Discussions</li> <li>History</li> <li>News: Yahoo News</li> <li>Blog: Google Blog Search, Technorati</li> <li>Hotels</li> <li>Flights</li> <li>Weather: Weatherbug</li> <li>Events: e:vene</li> <li>Trips: Yahoo Travel</li> </ul> <p>The layout is crisp, clean, and easy on the eyes. There are minimal load times and Mappington makes good use of Ajax. If you are planning a trip or just want to explore new places, Mappington is the best place to do it. I'm definitely going to use it to plan out my trip to Ireland in a few months.</p> <p>What I think it could improve on:</p> <ul> <li> <p>The video's don't show that you can click on them (mouse pointer does not change)</p> </li> <li> <p>The photos should tap into Picasa Web also</p> </li> <li> <p>In the News section, it looked like there was supposed to be a left frame (Google News maybe?) but it never loaded</p> </li> <li> <p>I wish you could blow the map up full screen</p> </li> <li> <p>The thumbnail view in Google Maps wasn't working</p> </li> <li> <p>Mappington should build some widgets / gadgets to get more exposure on personal web pages and sites like myspace</p> </li> </ul> <p><strong>Runner Ups</strong></p> <p><a href="http://www.windsurfingclips.com/">Wind Surfing Clips</a></p> <ul> <li> <p>API's: youtube</p> </li> <li> <p>Clean interface</p> </li> <li> <p>For such exciting and energetic video's, the template is pretty bland</p> </li> <li> <p>I'd like a link to the original video on youtube</p> </li> </ul> <p><a href="http://www.babynamemap.com/">Baby Name Map</a></p> <ul> <li> <p>API's: Google Maps</p> </li> <li> <p>Very fitting interface</p> </li> <li> <p>Maps are slow</p> </li> <li> <p>The Javascript pop-up UI feels very out of place compared to the site's theme</p> </li> </ul> <p><a href="http://www.mynextdive.com/">My Next Dive</a></p> <ul> <li> <p>API's: Google Maps</p> </li> <li> <p>The popup on the main page won't go away</p> </li> </ul> <p><a href="http://www.mymapchat.com/">My Map Chat</a></p> <ul> <li> <p>API's: Google Maps</p> </li> <li> <p>Global shout outs are very entertaining</p> </li> </ul> <p><a href="http://www.zoogle.in/">Zoogle</a></p> <ul> <li> <p>API's: Amazon eCommerce, CNET, del.icio.us, Digg, eBay, Flickr, Google Search, Windows Live Search, Yahoo Search, YouTube</p> </li> <li> <p>The search box doesn't understand spaces?!? Ex: I put in "Tim Broder" it returned nothing and asked me if I meant "Tim+Broder" which returned some results that I expected</p> </li> </ul> <p><a href="http://www.croatia-map.net/">Croatia-Map.net</a></p> <ul> <li> <p>API's: Google Maps</p> </li> <li> <p>Very smooth, clean, well done</p> </li> </ul> <p><a href="http://www.cadoogle.com/">CADoogle</a><br> Demonstrates Autodesk Freewheel. Allows you to search, preview, and download publicly available CAD files indexed by Google. It is free to use and leverages Google Search and Autodesk Freewheel Web services.</p> <ul> <li>API's: Autodesk Freewheel, Google Search</li> <li>Sluggish</li> <li>Heavy Loads</li> </ul><![CDATA[Google Overheard in New York]]>https://www.timbroder.com/2007/10/google-overheard-in-new-yorkhttps://www.timbroder.com/2007/10/google-overheard-in-new-yorkFri, 19 Oct 2007 00:42:00 GMT<p>If you haven't heard about <a href="http://www.overheardinnewyork.com">Overheard in New York</a> ( OHNY ), or don't subscribe to it, I can't recommend it more. It's absolutely hilarious. It's been around for a while and is constantly updated with a dozen or so quotes a day that people hear while walking / riding around New York City. You don't have to live in the city to enjoy it, though you might not get all of the humor. I used <a href="https://gpowered.blogspot.com/2007/09/google-reader-adds-search-box.html">Google Reader Search</a> to go through the feed looking for Google references. Here are a few, note: there were a lot more but not all were appropriate for all audiences.</p> <p><strong>He's Started Scooping Matt Drudge</strong><br> Female Google suit: How's your son doing?<br> Male Google suit: Great! He's 11 months now, and he's starting to get a personality -- it's great!<br> Female Google suit: I'd love to see some pictures sometime!<br> Male Google suit: He's got a blog!<br> <em>--Elevator, Port Authority building, 15th &#x26; 9th</em></p> <p><strong>But Which One? Which One?</strong><br> Crazy guy: Can anyone tell me about the Chinese stock market? [Two minutes later] Can anyone tell me about the Chinese stock market? Come on, people, that's an easy question!<br> Suit, laughing: Here's an easy question for you: How far away is Saturn to Pluto?<br> Crazy guy: That is too easy. Why would you ask me something so easy? The answer is Google. Google is the answer. The real question is, are there aliens from Saturn and Pluto on this train right now? And how could you tell the difference? [Looks around, waits for an answer.] Well, I know, because I'm one of them! [Crazy guy gets off the train.]<br> <em>--1 train</em></p> <p><strong>But We'll Find Out for Sure When the Anime Comes Out</strong><br> Nerd #1: So, was she hot?<br> Nerd #2: According to Google Image search, yes.<br> <em>--Math Building, NYU</em></p> <p>**She Has Six Months Left to LiveJournal<br> ** Doctor guy: Okay, we have the chest x-ray and it explains what's going on. See this lesion? It is pretty impressive.<br> Patient lady: "Impresssive"? Is that a medical term? Am I gonna have to google that, too?<br> <em>--Office, 71st &#x26; Park</em><br> <strong>Wednsday One-Liners</strong><br> Sketchy doctor: I Google everything! I treat my patients with Google.<br> <em>--Mt. Sinai School of Medicine, 98th &#x26; Madison</em></p> <p>Teen chick on cell: Yeah, it's funny... Google it. Wait, do you guys even have Google in Florida?<br> <em>--54th &#x26; Park</em></p> <p>Girl: Google is, like, totally taking over the world!<br> <em>--Terminal 4, JFK</em></p><![CDATA[Ubuntu 7.10 Gutsy Gibbon is out!]]>https://www.timbroder.com/2007/10/ubuntu-710-gutsy-gibbon-is-outhttps://www.timbroder.com/2007/10/ubuntu-710-gutsy-gibbon-is-outThu, 18 Oct 2007 12:01:00 GMT<p><a href="http://www.ubuntu.com/getubuntu/download">Get</a> it while its hot! (Or try to, the servers, as usual, are bogged.</p> <p>To upgrade, do the following: (note: you can only upgrade using this method if you are already using Feisty Fawn)</p> <ol> <li> <p>Go to System -> Administration -> Update Manager<br> <img src="https://lh6.google.com/timothy.broder/RxdL9GuGX2I/AAAAAAAAMVI/NTvOIhO_TvI/s400/ub1.png?imgdl=1" alt=""></p> </li> <li> <p>Hit the Check button to check for new updates to your current install (Feisty)</p> </li> <li> <p>If there are any updates, hit the "Install Updates" button, this will install any updates for your current installation.</p> </li> <li> <p>A Message should appear stating there is a 7.10 release<br> <img src="https://lh6.google.com/timothy.broder/RxdL9GuGX3I/AAAAAAAAMVQ/8ZM55Mvs3og/s400/ub2.png?imgdl=1" alt=""></p> </li> <li> <p>Hit "Upgrade"</p> </li> <li> <p>Follow the instructions</p> </li> </ol><![CDATA[My First Google API ticket has been fixed]]>https://www.timbroder.com/2007/10/my-first-google-api-ticket-has-beenhttps://www.timbroder.com/2007/10/my-first-google-api-ticket-has-beenWed, 17 Oct 2007 02:57:00 GMT<p>My first <a href="http://code.google.com/p/gdata-issues/issues/detail?id=44">ticket</a> for the Google Document List API has been fixed. As I posted about [before](<a href="https://gpowered.blogspot.com/2007/08/quick-docs-api-example-">https://gpowered.blogspot.com/2007/08/quick-docs-api-example-</a> python.html), the Document List API did not have the ability to just retrieve the documents from a given folder or tag. This has now been made possible, thanks API team!</p> <p>Original ticket:</p> <blockquote> <p>It would be ideal if we could pull back a list of documents from a certain</p> </blockquote> <p>folder. This would give more functionality and make the size of the data smaller if you only needed to grab a list of file from a certain folder.</p> <p>Possibly something like: <code class="language-text">gdata.docs.service.DocumentQuery(folder=['myfolder1'])</code> or <code class="language-text">gdata.docs.service.DocumentQuery(folders=['myfolder1','folder2'])</code></p><![CDATA[Top Secret Picasa Features]]>https://www.timbroder.com/2007/10/google-photos-blog-lesser-known-andhttps://www.timbroder.com/2007/10/google-photos-blog-lesser-known-andTue, 16 Oct 2007 02:14:00 GMT<p><a href="http://googlephotos.blogspot.com/2007/10/lesser-known-and-secret-picasa-features.html">Google Photos Blog: Lesser-known (and secret) Picasa features</a></p> <p>Most people are familiar with Picasa's usual features; Editing, organizing, uploading, printing, etc, but Mike Herf, the Picasa Engineering manager is going to take us on a tour on some of the "easter egg-ish" features. He's going to be posting hidden features and tips on Wednesdays over at the <a href="http://googlephotos.blogspot.com">Google Photos</a> blog so check it out.</p> <p>The first up is search. While you might be familiar with searching for a filename, or a directory you know you put the photo in but can't find, you might not be aware that you can also put in dates, camera models, flash (for if one was used), what type of lens was used, or even the iso settings. All of these are indexed by Picasa and will be returned in a search. Another fun search term is color:red or color:gray. Try is out ;) The last hidden search feature is under Tools->Experimental->Show Duplicate files and Picasa will list all the files that show up more then once on your hard drive, pretty nifty for cleaning space.</p> <p>For more features on Wednesdays, <a href="https://feeds.feedburner.com/GooglePicasaBlog">subscribe</a> to the photo blog.</p><![CDATA[Tennessee for the weekend]]>https://www.timbroder.com/2007/10/tennessee-for-weekendhttps://www.timbroder.com/2007/10/tennessee-for-weekendFri, 12 Oct 2007 19:33:00 GMT<p>Be back Sunday<br> <a href="http://maps.google.com/maps?f=q&#x26;hl=en&#x26;geocode=&#x26;time=&#x26;date=&#x26;ttype=&#x26;q=tennessee&#x26;ie=UTF8&#x26;ll=37.857507,-84.902344&#x26;spn=11.960026,20.566406&#x26;z=6&#x26;iwloc=addr&#x26;om=1&#x26;source=embed">View Larger Map</a></p><![CDATA[How often do Google Blogs post?]]>https://www.timbroder.com/2007/10/how-often-do-google-blogs-posthttps://www.timbroder.com/2007/10/how-often-do-google-blogs-postThu, 11 Oct 2007 01:43:00 GMT<p>Google has been using it's blogger platform to deliver news about it's products and services to the masses. Including the multi-language blogs, there are about 76 Google blogs out there. But how often do they post? I went through each one (of the English blogs) and figured out the average number of posts, per month, that they have for 2007 so far. If a blog wasn't around back in January, I took that into account also.</p> <p>The top two are the official Google Blog, and the Google Code blog, which makes sense as they are all encompassing aspects of Google. Following these are Maps and Adsense, two of Google biggest products.</p> <p><img src="https://spreadsheets.google.com/pub?key=p919ps7OYXvu5ZpA4odOsHw&#x26;oid=2&#x26;output=image" alt=""></p> <p>This chart is live from the spreadsheet I made which you can view <a href="https://spreadsheets.google.com/pub?key=p919ps7OYXvu5ZpA4odOsHw">here</a></p><![CDATA[Google Mashup Editor Blog: New Stuff - 10/4 Feature Release]]>https://www.timbroder.com/2007/10/google-mashup-editor-blog-new-stuff-104https://www.timbroder.com/2007/10/google-mashup-editor-blog-new-stuff-104Thu, 11 Oct 2007 01:43:00 GMT<p><a href="http://googlemashupeditor.blogspot.com/2007/10/new-stuff-104-feature-release.html">Google Mashup Editor Blog: New Stuff - 10/4 Feature Release</a></p> <p>There was a feature release for the <a href="http://editor.googlemashups.com">Google Mashup Editor</a> and they also created a <a href="http://gmereleases.googlemashups.com">new blog</a> for all updates and notices.</p> <p>Features include</p> <ul> <li>Geo encoding of any element in feed</li> <li>XPath helper in Feed Browser</li> <li>In memory feed - ${tmp}</li> <li>google.mashups.isUserAuthenticated(): method that returns true if and only if the user is authenticated</li> <li>centerOnLocation(address) method added to map module: Takes a string and centers on the geo encoded location that is represented by the string</li> </ul> <p>Bug Fixes:</p> <ul> <li>Fixed IE6 error that causes fatal errors in some applications.</li> <li>Fixed Maps bugs and upgraded to Maps API version 2.88.</li> <li>Fixed the display of images in tabs.</li> <li>Performace improvements for syntax highlighting in the Editor.</li> </ul><![CDATA[NEW! Google Mashup of the Week]]>https://www.timbroder.com/2007/10/new-google-mashup-of-weekhttps://www.timbroder.com/2007/10/new-google-mashup-of-weekTue, 09 Oct 2007 03:47:00 GMT<p>So I've decided to add a new feature to gPowered, the Google Mashup of the week. So many of these get created all the time using various Google APIs and services. Each week I'm going to search around find a dozen or so of the newest ones, pick out the one I like the best and why... with a possible runner up. As for when I'll be doing these, the new mashups will be posted sometime in between Saturday and Monday. Usually on the weekend unless I'm going away... like next weekend (Tennessee).... and the weekend after that (Boston)...</p> <p>... and the Mashup of the Week goes to:</p> <p><a href="http://www.jolocate.com/Listings.aspx">Jolocate</a><br> APIs: <a href="http://www.google.com/apis/maps/">Google Maps</a>, <a href="www.craigslist.org">Craigslist</a><br> The Good: Its craigslist... with a map. Or I should say its a map with Craiglist in it. If you've ever gone apartment hunting, you know the value of this. Smooth, no lag when changing grids, Craiglist opens right in the same window. I also really like the account feature. The site tries to profile you for people looking for roommates, and also from what I gather, is going to email me suggestions when I need to start looking for a place for a July 1 move-in.<br> The Bad: Not necessarily bad, but I would have liked the option to have Craigslist open in a new window<br> The Ugly: New York wasn't in the default list!</p> <p>Other contestants:</p> <p>[Spell Boy Beta](<a href="http://www.google.com/ig/directory?hl=en&#x26;url=http://www.sends">http://www.google.com/ig/directory?hl=en&#x26;url=http://www.sends</a> ome.org/spellboy/modules/google_gadget/index.xml)<br> APIs: <a href="www.google.com/apis/gadgets/">Google Gadgets</a><br> Why it didn't make it: For on the web FireFox or Google toolbar can spell check all the forms for you, and if you're mail client can't spellcheck... well.. get a new one.</p> <p><a href="http://www.careersix.com/">http://www.careersix.com/</a><br> APIs: <a href="http://www.google.com/apis/maps/">Google Maps</a>, <a href="http://www.indeed.com/jsp/apiinfo.jsp">Indeed</a><br> Why it didn't make it: The website was VERY slow to load the first time, I almost stopped looking at it because I thought it was down. Also I didn't see any place to search by job? only by location and then I have to hit ctrl+F?</p> <p><a href="http://www.checker-forum.de/wbblite/portal.php">Checker-forum.de</a><br> Small community that uses the Youtube API to show off and comment on videos in users profiles.<br> APIs: <a href="www.youtube.com/dev">Youtube</a><br> Why it didn't make it: I don't speak German</p> <p><a href="http://100milediet.org/map/">100 Mile Diet</a><br> APIs: <a href="http://www.google.com/apis/maps/">Google Maps</a><br> "When the average North American sits down to eat, each ingredient has typically traveled at least 1,500 miles. Use this interactive map and the 100-Mile Diet book to eat local, think global."</p> <p><a href="http://www.formspring.com/blog/2007/09/07/using-google-calendar-with-the-formspring-api/">FormSpring + Google Calendar</a><br> APIs: <a href="code.google.com/apis/calendar/developers_guide_protocol.html">Google Calendar</a>, formspring<br> Why it didn't make it: Formspring costs money for anything worthwhile, free gives u 3 forms and 50 saves per form?</p><![CDATA[Picasa gets a blog!]]>https://www.timbroder.com/2007/10/picasa-get-bloghttps://www.timbroder.com/2007/10/picasa-get-blogSun, 07 Oct 2007 15:47:00 GMT<p><a href="http://googlephotos.blogspot.com/2007/09/posted-by-jason-cook-product-marketing_28.html">Google Photos Blog: Ready for our close- up</a></p> <p>The Picasa team has gotten a blog in the form of the <a href="http://googlephotos.blogspot.com/">Google Photos Blog</a>. I think this brings the number of Google blogs to 75 (including the international blogs). On the photo blog they will be posting feature updates to Picasa, photography tips, and the team's favorite photo albums.</p> <p>In addition to working on <a href="http://picasa.google.com/">Picasa</a> and the <a href="http://picasaweb.google.com/">Web albums features</a>, they are also in charge of hosting blogger's <a href="http://buzz.blogger.com/2007/03/blogger-and-picasa-web-albums.html">photo upload feature</a>, which is powered by Picasa web, developing Orkut's <a href="http://en.blog.orkut.com/2007/08/spice-up-your-scraps.html">photo picker</a>, and creating Mapplets for browsing <a href="http://google-latlong.blogspot.com/2007/08/posted-by-ping-hsin-chen-software.html">geotagged photos</a> inside of Google Maps.</p> <p>Subscribe to their <a href="https://feeds.feedburner.com/GooglePicasaBlog">feed</a> for updates.</p><![CDATA[Displaying what you read from Google Reader]]>https://www.timbroder.com/2007/10/displaying-what-you-read-in-googlehttps://www.timbroder.com/2007/10/displaying-what-you-read-in-googleFri, 05 Oct 2007 02:04:00 GMT<p>I've been wanting to <a href="http://www.gpowered.net/g/feeds/">share</a> what I subscribe to in Google Reader and using the <a href="https://gpowered.blogspot.com/2007/08/google-reader-api-functions.html">functions I wrote</a> I was able to do just that. Check out the article for the full run down on the unofficial Google Reader API. This is written in python but should be easily portable to php. If i get around to it, I want to make a WordPress plugin so bloggers can share what they read with their readers. This will be followed (or in parallel depending on my mood) with a Javascript version so Blogspot users can do the same in the sidebar. On to the code!</p> <p>To start off we'll just copy the functions we need from <a href="https://gpowered.blogspot.com/2007/08/google-reader-api-functions.html">last time</a>. Generally this is the login and SID token functions, as well as the feed list function.</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token keyword">from</span> django<span class="token punctuation">.</span>shortcuts <span class="token keyword">import</span> render_to_response <span class="token keyword">from</span> django<span class="token punctuation">.</span>template <span class="token keyword">import</span> Library <span class="token keyword">from</span> elementtree <span class="token keyword">import</span> ElementTree <span class="token keyword">import</span> urllib <span class="token keyword">import</span> urllib2 <span class="token keyword">import</span> re login <span class="token operator">=</span> <span class="token string">'timothy.broder@gmail.com'</span> password <span class="token operator">=</span> <span class="token string">'***'</span> source <span class="token operator">=</span> <span class="token string">'gPowered'</span> google_url <span class="token operator">=</span> <span class="token string">'http://www.google.com'</span> reader_url <span class="token operator">=</span> google_url <span class="token operator">+</span> <span class="token string">'/reader'</span> login_url <span class="token operator">=</span> <span class="token string">'https://www.google.com/accounts/ClientLogin'</span> token_url <span class="token operator">=</span> reader_url <span class="token operator">+</span> <span class="token string">'/api/0/token'</span> subscription_list_url <span class="token operator">=</span> reader_url <span class="token operator">+</span> <span class="token string">'/api/0/subscription/list'</span> <span class="token comment">#login / get SED</span> <span class="token keyword">def</span> <span class="token function">get_SID</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> header <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token string">'User-agent'</span> <span class="token punctuation">:</span> source<span class="token punctuation">}</span> post_data <span class="token operator">=</span> urllib<span class="token punctuation">.</span>urlencode<span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token string">'Email'</span><span class="token punctuation">:</span> login<span class="token punctuation">,</span> <span class="token string">'Passwd'</span><span class="token punctuation">:</span> password<span class="token punctuation">,</span> <span class="token string">'service'</span><span class="token punctuation">:</span> <span class="token string">'reader'</span><span class="token punctuation">,</span> <span class="token string">'source'</span><span class="token punctuation">:</span> source<span class="token punctuation">,</span> <span class="token string">'continue'</span><span class="token punctuation">:</span> google_url<span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> request <span class="token operator">=</span> urllib2<span class="token punctuation">.</span>Request<span class="token punctuation">(</span>login_url<span class="token punctuation">,</span> post_data<span class="token punctuation">,</span> header<span class="token punctuation">)</span> <span class="token keyword">try</span> <span class="token punctuation">:</span> f <span class="token operator">=</span> urllib2<span class="token punctuation">.</span>urlopen<span class="token punctuation">(</span> request <span class="token punctuation">)</span> result <span class="token operator">=</span> f<span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">except</span><span class="token punctuation">:</span> <span class="token keyword">print</span> <span class="token string">'Error logging in'</span> <span class="token keyword">return</span> re<span class="token punctuation">.</span>search<span class="token punctuation">(</span><span class="token string">'SID=(\S*)'</span><span class="token punctuation">,</span> result<span class="token punctuation">)</span><span class="token punctuation">.</span>group<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token comment">#get results from url</span> <span class="token keyword">def</span> <span class="token function">get_results</span><span class="token punctuation">(</span>SID<span class="token punctuation">,</span> url<span class="token punctuation">)</span><span class="token punctuation">:</span> header <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token string">'User-agent'</span> <span class="token punctuation">:</span> source<span class="token punctuation">}</span> header<span class="token punctuation">[</span><span class="token string">'Cookie'</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token string">'Name=SID;SID=%s;Domain=.google.com;Path=/;Expires=160000000000'</span> <span class="token operator">%</span> SID <span class="token keyword">print</span> url request <span class="token operator">=</span> urllib2<span class="token punctuation">.</span>Request<span class="token punctuation">(</span>url<span class="token punctuation">,</span> <span class="token boolean">None</span><span class="token punctuation">,</span> header<span class="token punctuation">)</span> <span class="token keyword">try</span> <span class="token punctuation">:</span> f <span class="token operator">=</span> urllib2<span class="token punctuation">.</span>urlopen<span class="token punctuation">(</span> request <span class="token punctuation">)</span> result <span class="token operator">=</span> f<span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">except</span><span class="token punctuation">:</span> <span class="token keyword">print</span> <span class="token string">'Error getting data from %s'</span> <span class="token operator">%</span> url <span class="token keyword">return</span> result <span class="token comment">#get a specific feed. It works for any feed, subscribed or not</span> <span class="token keyword">def</span> <span class="token function">get_feed</span><span class="token punctuation">(</span>SID<span class="token punctuation">,</span> url<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">return</span> get_results<span class="token punctuation">(</span>SID<span class="token punctuation">,</span> get_feed_url <span class="token operator">+</span> url<span class="token punctuation">.</span>encode<span class="token punctuation">(</span><span class="token string">'utf-8'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">#get a token, this is needed for modifying to reader</span> <span class="token keyword">def</span> <span class="token function">get_token</span><span class="token punctuation">(</span>SID<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">return</span> get_results<span class="token punctuation">(</span>SID<span class="token punctuation">,</span> token_url<span class="token punctuation">)</span> <span class="token comment">#get a list of the users subscribed feeds</span> <span class="token keyword">def</span> <span class="token function">get_subscription_list</span><span class="token punctuation">(</span>SID<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">return</span> get_results<span class="token punctuation">(</span>SID<span class="token punctuation">,</span> subscription_list_url<span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Then we'll want to get rid off all the information in the feed that we don't want and load what we do into a data dictionary. After its in the dictionary, feed names and links (and the folders they are in) are ready to be displayed. As usual, I use Django to display my pages, but everything is the same up to the final return in the Feeds method. Below is an example of what each subscription looks like in the Google Reader Feed, and below that is how to process it</p> <div class="gatsby-highlight" data-language="xml"><pre style="counter-reset: linenumber NaN" class="language-xml line-numbers"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>object</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>string</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>id<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>feed/http://www.ubuntu.com/rss.xml<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>string</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>string</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>title<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Ubuntu<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>string</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>list</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>categories<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>object</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>string</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>id<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>user/16162999404522159936/label/dev<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>string</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>string</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>label<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>dev<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>string</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>object</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>list</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>number</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>firstitemmsec<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>1186137757794<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>number</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>object</span><span class="token punctuation">></span></span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token keyword">class</span> <span class="token class-name">myFeed</span><span class="token punctuation">:</span> <span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> name<span class="token punctuation">,</span> link<span class="token punctuation">)</span><span class="token punctuation">:</span> self<span class="token punctuation">.</span>name <span class="token operator">=</span> name self<span class="token punctuation">.</span>link <span class="token operator">=</span> link <span class="token keyword">def</span> <span class="token function">Feeds</span><span class="token punctuation">(</span>request<span class="token punctuation">)</span><span class="token punctuation">:</span> SID <span class="token operator">=</span> get_SID<span class="token punctuation">(</span><span class="token punctuation">)</span> feeds <span class="token operator">=</span> get_subscription_list<span class="token punctuation">(</span>SID<span class="token punctuation">)</span> tree <span class="token operator">=</span> ElementTree<span class="token punctuation">.</span>fromstring<span class="token punctuation">(</span>feeds<span class="token punctuation">)</span> d <span class="token operator">=</span> <span class="token builtin">dict</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">#loop through each feed</span> <span class="token keyword">for</span> <span class="token builtin">object</span> <span class="token keyword">in</span> tree<span class="token punctuation">.</span>findall<span class="token punctuation">(</span><span class="token string">'list'</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>findall<span class="token punctuation">(</span><span class="token string">'object'</span><span class="token punctuation">)</span><span class="token punctuation">:</span> strings <span class="token operator">=</span> <span class="token builtin">object</span><span class="token punctuation">.</span>findall<span class="token punctuation">(</span><span class="token string">'string'</span><span class="token punctuation">)</span> key <span class="token operator">=</span> <span class="token builtin">object</span><span class="token punctuation">.</span>findall<span class="token punctuation">(</span><span class="token string">'list'</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>findall<span class="token punctuation">(</span><span class="token string">'object'</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>findall<span class="token punctuation">(</span><span class="token string">'string'</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span>text <span class="token comment">#tag already exists, add to the list</span> <span class="token keyword">try</span><span class="token punctuation">:</span> d<span class="token punctuation">[</span>key<span class="token punctuation">]</span><span class="token punctuation">.</span>append<span class="token punctuation">(</span>myFeed<span class="token punctuation">(</span>strings<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span>text<span class="token punctuation">,</span> strings<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>text<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">'feed/'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">#tag doesn't exist, create list</span> <span class="token keyword">except</span> KeyError<span class="token punctuation">:</span> d<span class="token punctuation">[</span>key<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span>myFeed<span class="token punctuation">(</span>strings<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span>text<span class="token punctuation">,</span> strings<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>text<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">'feed/'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">]</span> <span class="token keyword">return</span> render_to_response<span class="token punctuation">(</span><span class="token string">'pages/feeds.html'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token string">'feeds'</span><span class="token punctuation">:</span> d<span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>For those of you that use django or are just curious how I end up displaying the feeds, this is what i have in my view:</p> <div class="gatsby-highlight" data-language="html"><pre style="counter-reset: linenumber NaN" class="language-html line-numbers"><code class="language-html"> ### My Reading {% verbatim %} {% for item in feeds.items %} {{ item.0 }} {% for feed in item.1 %} [{{ feed.name }}]({{ feed.link }}) {% endfor %} {% endfor %} {% endverbatim %}</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Again, too see what I subscribe to, <a href="http://www.gpowered.net/g/feeds/">click here</a></p><![CDATA[Comments turned on]]>https://www.timbroder.com/2007/10/comments-turned-onhttps://www.timbroder.com/2007/10/comments-turned-onWed, 03 Oct 2007 23:10:00 GMT<p>For various reasons, I had these turned off initially when i started gPowered. I've now turned them on.</p><![CDATA[HOWTO: Use a Yahoo Pipe to filter feeds]]>https://www.timbroder.com/2007/10/howto-use-yahoo-pipe-to-filter-feedshttps://www.timbroder.com/2007/10/howto-use-yahoo-pipe-to-filter-feedsWed, 03 Oct 2007 22:59:00 GMT<p>One of my friends at work asked me today how I sift through volumes of news to find articles and information on Google and specifically on Google Code for my articles. The answer is simple, I don't. Granted, I DO read a LOT, but there just aren't enough hours in the day to read everything I want to. So, I have a <a href="http://pipes.yahoo.com/pipes/">Yahoo Pipe</a> sift through the feeds for me. Pipes is "a powerful composition tool to aggregate, manipulate, and mashup content from around the web." Its fairly easy to use and doesn't require any code or coding experience, although understanding the basic layout of an RSS or Atom feed is a definite plus. The method I'm going to describe could work for any blogger or anyone who wants to filter a single or large group of feeds by keyword. I'm not going to go into the details of Yahoo Pipes, there are plenty of tutorials and examples for that. I'm just going to describe how I built the small pipe I use to filter for Google news.</p> <p>The first step is to log into or create a Yahoo account and go to <a href="http://pipes.yahoo.com/pipes/">http://pipes.yahoo.com/pipes/</a> and click on Create Pipe. The first node we're going to use is under sources and is called "Fetch Feed". Add as many of these as you want to pull in all the feeds you will need.</p> <p><img src="https://lh6.google.com/timothy.broder/RwQeq2uGXrI/AAAAAAAAMTE/_APNQgTsUMQ/s400/pipe1.jpg?imgdl=1" alt=""></p> <p>Then use unions (located under Operators) to join these Fetches together. If you have more then 5 feeds, you will need multiple unions.</p> <p><img src="https://lh6.google.com/timothy.broder/RwQeq2uGXsI/AAAAAAAAMTM/uKp3MSfdtUg/s400/pipe2.jpg?imgdl=1" alt=""></p> <p>Finally, add a filter, also located under Operators. Here, "Permit" items that match "any" of the following. Then, add rules where item.description > Contains and then the word or phrase you want to search for. This filter will allow any posts that have the words through, and block everything else. Send the output of the Filter to the Pipe Output and you are done.</p> <p><img src="https://lh6.google.com/timothy.broder/RwQeq2uGXtI/AAAAAAAAMTU/zrI8IloMhiw/s400/pipe3.jpg?imgdl=1" alt=""></p> <p>You can then subscribe to the output of this pipe with the reader of your choice. When I subscribe to my pipe's [feed](<a href="http://pipes.yahoo.com/pipes/pipe">http://pipes.yahoo.com/pipes/pipe</a> .run?_id=vF35LapU3BG9UzFodbq02Q&#x26;_render=rss) in Google Reader, I only see posts that contain the word Google or google. I also could have done that as one filter with a regular expression, or just with "oogle".</p> <p>Here is a full view of the <a href="http://pipes.yahoo.com/pipes/pipe.info?_id=vF35LapU3BG9UzFodbq02Q">pipe</a></p> <p><img src="https://lh6.google.com/timothy.broder/RwQeq2uGXuI/AAAAAAAAMTc/RAnjUutsd5A/s400/pipe4.jpg?imgdl=1" alt=""></p><![CDATA[ProBlogger Birthday Bash: $54,000 in prizes!]]>https://www.timbroder.com/2007/10/problogger-birthday-bash-54000-inhttps://www.timbroder.com/2007/10/problogger-birthday-bash-54000-inWed, 03 Oct 2007 15:53:00 GMT<p>ProBlogger's Birthday is <a href="http://www.problogger.net/archives/2007/10/02/54000-worth-of-prizes-on-offer-in-the-problogger-birthday-bash-competitions/">here</a> and Darren is running small contests throughout the week with over $54,000 in prizes. I missed the first few, thank you work and being on call, but the prizes have been pretty good so far.</p> <p>The first contest was for copies of Aaron Wall’s <a href="http://www.seobook.com/">SEO Book</a> and all you had to do was comment on the post announcing the contest. The second set of prizes were free listings on <a href="http://www.seekzap.com/">SeekZap</a> and all you had to do was sign up! (This is the one I'm really bummed about missing.) The final prize for yesterday for the first 25 responders was tubes of Mederma scar treatment. For the full prize list, see <a href="https://feeds.feedburner.com/~r/ProbloggerHelpingBloggersEarnMoney/~3/164167517/">here</a></p> <p>You don't have to have a blog to participate in most of the competitions so if you want to have some fun over the next few days, and into the weekend (this is actually pretty good for me, I'm stuck home on call, now I'll have something to do ;), add the feed to your reader and try to keep up.</p> <p>Note: The current contest is for <a href="http://www.problogger.net/archives/2007/10/03/win-two-lg-usb-monitors-from-displaylink-giveaway/">2 20″ LG USB monitors</a></p> <p>Good luck to all!</p><![CDATA[Google Apps September recap]]>https://www.timbroder.com/2007/10/google-apps-september-recaphttps://www.timbroder.com/2007/10/google-apps-september-recapTue, 02 Oct 2007 23:28:00 GMT<p>Its definitely been a busy month for Google Apps with the launch of presentations (finally). As a result, there is a new <a href="http://youtube.com/watch?v=eRqUE6IHTEA">video</a> as well as an updated <a href="http://www.google.com/google-d-s/tour1.html">tour</a>. There is no API available yet but as soon as it comes out I'll post a HOWTO.</p> <p>Spreadsheets added <a href="http://docs.google.com/support/spreadsheets/bin/answer.py?answer=75507&#x26;query=googlereader&#x26;topic=&#x26;type=">new ways</a> to pull external data. The external sources can include XML, a URL, HTML, or any feed based file. Spreadsheets also added autofill (type Dec and it can autofill December. Type Jan, Feb, Mar, and it will fill in the rest of the months for you. This also works with days of the week, time, and more)</p> <p>The Reporting API was release into Google Apps Premier, Education, and Partner editions. This allows users to see detailed reports on how people in their organization are using Google Apps. They can track account activity, disk space, email client usage, and more.</p><![CDATA[Google StreetView Going Global?]]>https://www.timbroder.com/2007/10/google-streetview-going-globalhttps://www.timbroder.com/2007/10/google-streetview-going-globalMon, 01 Oct 2007 15:41:00 GMT<p>Or at least to London? A VW bug with a camera attached to the top has been spotted in London. Could be <a href="http://maps.google.com/help/maps/streetview/index.html">Google</a>? Maybe expanding to areas around their <a href="http://googlified.com/2007is-there-a-google-office-near-you/">offices</a> in other countries? Nothing has been confirmed yet.</p> <p>I think this could pick up if Google started going to major Global Cities. Think about it, you could go site seeing without ever leaving your desk. The top cities on my list would be London, Tokyo, Paris, Venice, Dublin, and Hong Kong. I am hopefully going to two of these in the next 6 months (Tokyo and London) around the holidays. Although, Google might have some <a href="http://www.theregister.co.uk/2007/06/05/google_street_view_legality_in_europe/">legal hoops</a> to jump through if they decide to do this.</p> <p><a href="https://4.bp.blogspot.com/_Ng3QbVQfLZ8/RwEVuTA7FPI/AAAAAAAAMSc/7eShW1mlfzk/s1600-h/googUK.jpg"><img src="https://4.bp.blogspot.com/_Ng3QbVQfLZ8/RwEVuTA7FPI/AAAAAAAAMSc/7eShW1mlfzk/s400/googUK.jpg" alt=""></a></p><![CDATA[By the Power of Grayskull.... I mean Google]]>https://www.timbroder.com/2007/09/by-power-of-grayskull-i-mean-googlehttps://www.timbroder.com/2007/09/by-power-of-grayskull-i-mean-googleSun, 30 Sep 2007 15:10:00 GMT<p>Most of my friends got the reference to the "By the Power of Google" tagline that I chose to use for gPowered. Being a child of the 80's I had the privilege to watch some of the greatest cartoons ever created. One of those, was He-Man where one of the popular lines is "BY THE POWER OF GRAYSKULL." When I was throwing around taglines with "powered by" (powered by Google), He-Man's line kept popping into my head and stuck. If you don't know what He-Man is, check out the short summery from wikipedia.</p> <p><em>The show takes place on the fictional planet of Eternia, a land of magic, myth and fantasy. The show's lead character is Prince Adam, the young son of Eternia's rulers, King Randor and Queen Marlena. Prince Adam is a seemingly cowardly, blond muscleman dressed in a Cote d'Azur chemise. However, Prince Adam possesses a magic sword, and when he holds it aloft and says the magic words "By the Power of Grayskull! I have the Power!" he is transformed into He-Man, the most powerful man in the universe. He-Man is a brave, blond muscleman in a baldric and loincloth. Together with his close allies, Battle Cat, Teela, Man-At-Arms and Orko, He-Man uses his powers to defend Eternia from the evil forces of Skeletor, a tyrannical warlord with a skull for a face. Skeletor's main goal is to conquer the mysterious fortress of Castle Grayskull, from which He-Man draws his powers. If he succeeds, Skeletor would be able to conquer not only Eternia, but the whole universe.</em> (<a href="http://en.wikipedia.org/wiki/He-Man_and_the_Masters_of_the_Universe">wikipedia</a>)</p> <p>And now for a blast from the past, here is the opening theme complete with the famous lines.</p><![CDATA[Ubuntu Gutsy Goes Beta]]>https://www.timbroder.com/2007/09/ubuntu-gutsy-goes-betahttps://www.timbroder.com/2007/09/ubuntu-gutsy-goes-betaSun, 30 Sep 2007 04:59:00 GMT<p>Ubuntu Gutsy Gibbon has gone beta and is on track for its October 18th Release. So, if you haven't been using it since tribe 2 like me, and want to upgrade from Fiesty Fawn, follow the below steps.</p> <ol> <li>Open a terminal.</li> <li>Type <em>sudo update-manager -d</em></li> <li>Follow the instructions</li> </ol> <p>More information about upgrading can be found <a href="https://help.ubuntu.com/community/GutsyUpgrades">here</a></p> <p>If you want to upgrade from a cd or do a fresh install, ISOs are available <a href="http://releases.ubuntu.com/releases/7.10/">here</a></p><![CDATA[Google Developer Podcast Ep 9 QuickCap]]>https://www.timbroder.com/2007/09/google-developer-podcast-ep-9-quickcaphttps://www.timbroder.com/2007/09/google-developer-podcast-ep-9-quickcapThu, 27 Sep 2007 23:36:00 GMT<p>I got some time today to listen to this Podcast today on the way to and from one of our other buildings today uptown. I was attending <a href="http://www.sas.com">SAS</a> training which is a pretty cool data mining / report generation tool.</p> <p>This episode was an interview with T.V. Raman and his seeing eye dog Hubbell on accessibility in a developer's world. Quick recap:</p> <ul> <li> <p>Why care about accessibility? (As a developer)</p> <ul> <li>You DON'T know your user</li> <li>try to build for the widest range of abilities</li> </ul> </li> <li> <p>Think about how people with different abilities will use the app</p> </li> <li> <p>FireFox, Internet Explorer, Safari, Konquerer. Browser specifics are a problem</p> </li> <li> <p>Generic browsers out of the box do not help vision, does not enhance views, or help the motion impaired</p> </li> <li> <p>you have to add on to the browser</p> </li> <li> <p>There is too much "slop", you need to take a step back and not assume what your user will use</p> </li> <li> <p>CSS is good for getting developer / user balance</p> </li> <li> <p>There are very good FireFox accessibility addons</p> </li> <li> <p>Google results page is an html mess so it can work in all browsers</p> </li> <li> <p>The standard GMail interface is an accessibility nightmare but this is remedied by using the mobile version</p> </li> <li> <p>A year from now Ajax accessibility will get much better with FireFox 3</p> </li> <li> <p><strong>Bottom Lines:</strong></p> <ul> <li>What is it that you are using for accessibility? Is it the base platform? Does it come with tools</li> <li>What is the focus?</li> <li>What platform are you on?</li> </ul> </li> <li> <p>Google books scan and OCR to voice is decent</p> </li> <li> <p>The mobile calendar is also good.</p> </li> </ul><![CDATA[Google Developer Podcast Ep 8 Summary]]>https://www.timbroder.com/2007/09/google-developer-podcast-ep-8-summaryhttps://www.timbroder.com/2007/09/google-developer-podcast-ep-8-summaryTue, 25 Sep 2007 03:24:00 GMT<p>I got some time today on the train today to listen to Episode 8 of the Google Developer Podcast. Normally I'll listen to it at work when it first comes out but it's been way to hectic. Here are some highlights some commentary thrown in.</p> <ul> <li>ZohoWriter goes on Gears - See my opinions about this <a href="https://gpowered.blogspot.com/2007/08/google-get-in-gear.html">here</a>. Google really needs to step it up and get Gears into their own services. The top two on my list being Gmail and Docs</li> <li>Embed Google Maps in a "youtube like way". Also the Drag zoom and custom marker manager controls have been improved. Very easy to use.</li> <li>Sky in Google Earth. I havn't played with this yet. I'll check it out after work tomorrow if Halo 3 isn't in the mailbox ;-) <ul> <li>Stars</li> <li>Google's proof that there probably is life on other planets: Earth is not just a "one off".</li> <li>We need a Marvin the Martian Easter egg</li> </ul> </li> <li>Google Objective-C library has been updated for code search, Picasa, and calendar</li> </ul> <p>The Guest in this episode was Mark Stahl, the Tech lead of GData since it started (about 2 1/2 years)</p> <ul> <li>GData is the way to interact with Google Data, See most of my <a href="https://gpowered.blogspot.com/search/label/HOWTO">HOWTO's</a> for examples.</li> <li>Uses the Atom publishing protocol (REST)</li> <li>Resources are represented as XML. Many, many libraries are out there for working with XML so no steep learning curve for working with the data.</li> <li>GET, PUT, POST, DEL to manipulate Data</li> <li>A feed is a container of Data Items</li> <li>Atom: syndication technology. It is a feed document. Used as a response for "get me the latest version of.... foofoo data set</li> <li>Atom publishing protocol added manipulation in the form of read/write</li> <li>Atom beat out RSS because it already had an ITEF committee</li> <li>GData builds on top of Atom publishing <ul> <li>Way to query, by passing parameters through a URL</li> <li>Standardized parameters</li> </ul> </li> <li>Atom has no concurrency to detect conflicts / multiple writes</li> <li>Etags are coming in the future to address this. Etags are strings that contain version info. This will enable for better caching solutions on the client, or any point in between the client and the server.</li> <li> <ul> <li>The GData team chose REST because the web is built on REST ideas. It already had developer Acceptability. It's also easy to learn.</li> </ul> </li> <li>REST is a style, its good at certain things, but has trouble mapping certain operations that would perhaps be better off as an RPC</li> <li>Atomic but not transactional</li> <li>The first service to get GData was Calendar, and it currently gets the most request, followed (in order) by Blogger, Base, and Spreadsheets.</li> <li>The most popular client libraries are the ones in Java and .net, followed by Python, PHP, Objective C, Lisp, and Ruby</li> <li>Authentication can be done via ClientLogin with a token (Programmatic login), or via authsub (Google handles credentials)</li> <li>Uses "kinds": Semantic level syndication (add custom info to an entry and helps define types of entries)</li> </ul><![CDATA[CanGoogleHearMe.com beta starts]]>https://www.timbroder.com/2007/09/cangooglehearmecom-beta-startshttps://www.timbroder.com/2007/09/cangooglehearmecom-beta-startsMon, 24 Sep 2007 12:10:00 GMT<p>The beta for <a href="http://cangooglehearme.com/">CanGoogleHearMe.com</a> has started (which I am part of), but that's all I can really say about it. If you don't know what CanGoogleHearMe is or what Aaron and the gang have been up to, check out the <a href="http://cangooglehearme.com/chapter1.php">original story</a></p><![CDATA[Bring on the GDrive!]]>https://www.timbroder.com/2007/09/bring-on-gdrivehttps://www.timbroder.com/2007/09/bring-on-gdriveThu, 20 Sep 2007 01:07:00 GMT<p>Do you want the GDrive? I know I do. Rumors have been flying around for almost 2 years about this thing, its been the brunt of an April Fool's joke, complete with official announcement and a Google Group (see below). Googlers use it, and if it ever comes out, it would change the way both home and corporate users think about file storage. Google is almost there, almost. When they integrate Gears into Docs they'll be one step closer. They would just need a few more features on the main Docs UI (bulk file upload, share files right from there instead of having to publish from within the document) and allow for any file type.</p> <p><img src="https://lh3.google.com/timothy.broder/RvHFzfREi8I/AAAAAAAAMSI/87CkGvBuJLI/s400/plat1.jpg?imgdl=1" alt=""></p> <p>Quick recap of the internal GDrive / Platypus client:<br> Backup: if your computer goes down, catches on fire, or just plain old BSOD's, just get a new computer, install the platypus client, and your files<br> will be on the new system before you know it You can sync across multiple computers. Great if you have multiple buildings, cubes, or a laptop floating around<br> VPN-less access<br> Disconnect Access. Google Gears anyone?<br> Other users can just mount your shares on their filesystem<br> FAST</p> <p>I took some time and went through similar offerings that are currently available</p> <p>** <a href="http://aws.amazon.com/s3">Amazon S3</a>**</p> <ul> <li> <p>uses Amazon account (just have to enable as a web service)</p> </li> <li> <p>$.15 per gig</p> </li> <li> <p>programmatic way to store files. No UI on Amazon's site</p> </li> </ul> <p><strong><a href="http://www.xdrive.com">Xdrive</a></strong></p> <p><img src="https://lh6.google.com/timothy.broder/RvHFzPREi4I/AAAAAAAAMRo/Z4qDjUvEaSM/s400/xdrive.jpg?imgdl=1" alt=""></p> <p>Pros</p> <ul> <li>Nothing to install</li> <li>Breaks into photos, docs, music, videos, downloads, and bookmarks by default</li> <li>can upload a folder or multiple files from the same folder</li> <li>good upload speed</li> <li>5 gigs of space is free</li> <li>you can make "shows" to show off your photos and/or videos</li> </ul> <p>Cons</p> <ul> <li>Had to sign in with my AIM account to sign up for the service. Then directly after signing up I had to sign in with my AIM account again.</li> <li>can't drag files into folders</li> <li>"Share with friend" email didn't come for 15 min</li> <li>the "close window" button after logging out didn't work</li> <li>login button is a little out of the way</li> </ul> <p><strong><a href="http://www.box.net">Box.net</a></strong></p> <p><img src="https://lh6.google.com/timothy.broder/RvHFzPREi5I/AAAAAAAAMRw/Z_IsNLXYdyw/s400/boxnet.jpg?imgdl=1" alt=""></p> <p>Pros</p> <ul> <li>fast site</li> <li>clean look</li> <li>5 gig free</li> <li>easy to embed folder into site or blog</li> <li>easy to send links to files in an email</li> <li>share folders as a link or an RSS feed</li> <li>drag and drop file upload in a popup</li> <li>there are groups in the paid account</li> </ul> <p>Cons</p> <ul> <li> <p>friends have to sign up to send files (I would rather be able to give them a public link to my folder)</p> </li> <li> <p>have to pay to get groups</p> </li> <li> <p>contacts section felt ackward</p> </li> </ul> <p><strong><a href="www.movedigital.com/">MoveDigital</a></strong></p> <p><img src="https://lh3.google.com/timothy.broder/RvHFzfREi6I/AAAAAAAAMR4/JBWgcFd5K4k/s400/movedigital.jpg?imgdl=1" alt=""></p> <p>Pros</p> <ul> <li>can upload a file from a URL</li> <li>Uploads showed all the details: speed, percent done, etc</li> <li>Has mobile phone access</li> </ul> <p>Cons</p> <ul> <li> <p>Expensive. The pricing starts at $10 for 1 gig and goes up exponentially</p> </li> <li> <p>Drag and drop is an install. And it didn't let me login (was using Vista to test these, I know... I know...)</p> </li> <li> <p>Slow uploads</p> </li> </ul> <p><strong><a href="www.omnidrive.com/">Omnidrive</a></strong></p> <p>![](<a href="https://lh3.google.com/timothy.broder/RvHFzfREi7I/AAAAAAAAMSA/P_Z24ztAeQ4/s">https://lh3.google.com/timothy.broder/RvHFzfREi7I/AAAAAAAAMSA/P_Z24ztAeQ4/s</a> 400/omni.jpg?imgdl=1)</p> <ul> <li>Sign up was very slow</li> <li>I tried to upload a 4 meg file and got a Java heapspace error</li> </ul> <p><strong>Microsoft Skydrive</strong><br> Pros</p> <ul> <li>Multiple file upload is very responsive and pretty</li> <li>Can embed in blog</li> <li>Has link to share with public</li> </ul> <p>Cons</p> <ul> <li> <p>Needed to install an ActiveX control (had to use IE, bummer) for multiple file upload.</p> </li> <li> <p>Doesn't show upload speed</p> </li> <li> <p>Only 500 MB</p> </li> <li> <p>50 MB Max file size</p> </li> </ul> <p>Overall I think I would have to go with Box.net. It was really smooth. Had some good features and it was really easy to upload files. the free 5 gigs wasn't too bad either.</p> <p>Some related GDrive articles:</p> <ul> <li><a href="http://googlified.com/2007gdrive-is-here-almost/">GDrive is Here, Almost</a></li> <li>[Evidence of GDrive in Google</li> </ul> <p>Apps](<a href="http://blogoscoped.com/archive/2007-09-04-n51.html">http://blogoscoped.com/archive/2007-09-04-n51.html</a>)</p> <ul> <li><a href="http://googlesystem.blogspot.com/2006/07/gdrive-is-on-way.html">GDrive Is On The Way</a></li> <li>[Inside the GDrive Platypus</li> </ul> <p>--Almost](<a href="http://battellemedia.com/archives/002986.php">http://battellemedia.com/archives/002986.php</a>)</p> <ul> <li><a href="https://www.techcrunch.com/2006/10/13/another-gdrive-platypus-leak/">Another GDrive “Platypus” Leak</a></li> <li>[Google Gdrive Client</li> </ul> <p>Leaked](<a href="http://blogoscoped.com/archive/2006-10-13-n53.html">http://blogoscoped.com/archive/2006-10-13-n53.html</a>)</p> <ul> <li><a href="http://googlified.com/2006gdrive-gdisk/">GDrive -> GDisk</a></li> <li>[When Will Gdrive Be Public (If</li> </ul> <p>Ever)?](<a href="http://blogoscoped.com/archive/2006-07-11-n52.html">http://blogoscoped.com/archive/2006-07-11-n52.html</a>)</p> <ul> <li><a href="https://www.techcrunch.com/2006/07/10/gdrive-plays-whack-a-mole-with-bloggers/">GDrive plays whack-a-mole with bloggers</a></li> <li>[Evidence of GDrive in Google</li> </ul> <p>Apps](<a href="http://blogoscoped.com/archive/2007-09-04-n51.html">http://blogoscoped.com/archive/2007-09-04-n51.html</a>) <a href="https://www.techcrunch.com/2007/08/19/what-ever-happened-to-gdrive/">What Ever Happened To GDrive?</a></p> <ul> <li>[Rumor: Was the Gdrive Release</li> </ul> <p>Canceled?](<a href="http://blogoscoped.com/archive/2007-08-19-n82.html">http://blogoscoped.com/archive/2007-08-19-n82.html</a>)</p><![CDATA[Using Blogger and Feedburner Sitemaps in Webmaster Tools]]>https://www.timbroder.com/2007/09/using-blogger-and-feedburner-sitemapshttps://www.timbroder.com/2007/09/using-blogger-and-feedburner-sitemapsThu, 20 Sep 2007 00:20:00 GMT<p>Blogger, good. FeedBurner, good. Google Webmaster tools, good. The 3 working together? A little more difficult. A few months ago blogger <a href="http://buzz.blogger.com/2007/07/attention-FeedBurner-fans.html">added support</a> to have FeedBurner + blogger integration. No more editing template code, just change a setting in blogger, and viola, FeedBurner will track all your subscribers. However, this method did not go over so well with Google Webmaster Tools. Previously you could just add your blog's feed as a sitemap for you blog and the Google Bot would have no problem. If you turned on FeedBurner however, sitemap errors popped up all over because the FeedBurner links were on a different domain from the blog, etc..</p> <p>Here is a way to make it work (assuming you already have a blog set up):</p> <ol> <li> <p>Make an account on <a href="http://www.FeedBurner.com/fb/a/home">FeedBurner</a> and add your blog to it<br> <img src="https://lh6.google.com/timothy.broder/RvE7pPREi1I/AAAAAAAAMRQ/rgAU_migW2A/s400/feedburne.jpg?imgdl=1" alt=""></p> </li> <li> <p>Then, in blogger go to settings > Site Feed > Post Feed Redirect URL and add your FeedBurner feed</p> <p><img src="https://lh6.google.com/timothy.broder/RvE7pPREi2I/AAAAAAAAMRY/yy7Obs753HM/s400/FeedBurner2.jpg?imgdl=1" alt=""></p> </li> <li> <p>Finally, if you want to track your blog in <a href="www.google.com/webmasters/sitemaps/">Google Webmaster Tools</a> you will have to add the sitemap a little differently then normal. Add a General Web sitemap as the "rss.xml?orderby=updated" feed off of your blog. FeedBurner does not pick up this feed in the redirects, so the Google Bot will not have trouble with it.</p> </li> </ol> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">![](https://lh3.google.com/timothy.broder/RvE7pfREi3I/AAAAAAAAMRg/s_PLXzrV9hE/s400/FeedBurner3.jpg?imgdl=1) </code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <ol start="4"> <li>After this your site will be tracked by FeedBurner as well as Google Webmaster tools and the Google Bot will be able to use the sitemap properly</li> </ol><![CDATA[Google Books “My Library” Vs. LibraryThing vs. Shelfari]]>https://www.timbroder.com/2007/09/google-books-my-library-vs-librarythinghttps://www.timbroder.com/2007/09/google-books-my-library-vs-librarythingWed, 19 Sep 2007 02:11:00 GMT<p>I love to read. I always have and I probably always will. When people ask me why I read so much or about how fast I can, I usually attest to the fact that when I was a child, the household rule was no television on weekdays, so, lots of books and reading. I still remember the first book I was able to finish on my own without any help from my mother; The Mouse and the Motorcycle.</p> <p>A few months ago when I was looking for a service to keep track of all my books (those I had read and those I wanted), the top two that I had come up with were <a href="http://www.shelfari.com/">Shelfari</a> and <a href="http://www.librarything.com/">LibraryThing</a>. At the time LibraryThing seemed slow and clunky while Shelfari came off as fairly polished. Note that I really didn’t spend too much time at either during this initial assessment and that I ended up going with Shelfari.</p> <p>Coming back to the present, I still use Shelfari and now that <a href="http://books.google.com/">Google Book search</a> has come out with the <a href="http://books.google.com/googlebooks/mylibrary/">“My Library”</a> feature, its time to do an assessment of this decision.</p> <p><strong>My Library</strong><br> Launched on September 6th, this is the latest feature of Google Book Search. Normally I just go to Amazon if I’m looking for a book, but that’s more likely because that’s what I am used to. Check out my test Library <a href="http://books.google.com/books?as_list=BDYjGJ9gQiI2fwZ2RhK_5ARoUEnPi_37Mmen-Zjyn9rNza5Y7yew&#x26;hl=en">here</a></p> <p><img src="https://lh6.google.com/timothy.broder/RvCD9fREiyI/AAAAAAAAMQ4/Rm4fglWiqd4/s400/mylibrary.jpg?imgdl=1" alt=""></p> <p>Pros</p> <ul> <li>Search doesn’t always return what I want. Sometimes I had to go find the ISBN and use that</li> <li>Very fast searching</li> <li>Once books are added to the library, you can search the text within those books and get a preview</li> <li>Has List view and cover view. The list view has a link to Add Labels, Write a Review, and More Editions</li> <li>Links to buy the book from Amazon, Barns &#x26; Noble, Booksense, or Froogle</li> <li>Can look for the book in a library</li> <li>Reviews from all over the internet (shows 10)</li> <li>References from all over the internet (shows 10)</li> <li>References from other books</li> <li>Links to other editions</li> <li>References from scholarly works</li> <li>Can share list as an RSS feed</li> <li>No need to sign up if you already have a Google account</li> <li>Unlimited books</li> </ul> <p>Cons</p> <ul> <li>limited preview, I know other services don’t even offer a preview, but its such a tease</li> <li>The library didn’t seem to be finding good results. I looked up a few books that I know are in the library up the street and it wasn’t finding them.</li> <li>No user reviews</li> <li>Only export format is RSS</li> <li>Can only import by ISBN by typing a list or copy/paste</li> <li>Need a Google account</li> </ul> <p><strong>LibraryThing</strong><br> I had initially been turned off by this one because the UI seemed clunky and was sluggish when I first tested it out. A lot of this has changed. Check out my test library <a href="http://www.librarything.com/catalog/broderboy">here</a></p> <p><img src="https://lh6.google.com/timothy.broder/RvCD9fREizI/AAAAAAAAMRA/rPQTBXANWPg/s400/librarything.jpg?imgdl=1" alt=""></p> <p>Pros</p> <ul> <li>If you really like Amazon (me), then using that as the database is a pro</li> <li>Good recommendations. The recommendations were pretty spot on. There are books on the list that I have been meaning to read for a while now (that I have not yet added)</li> <li>Lots of “Find At” (buy) options: Abebooks, Alibris, Amazon, Barnes &#x26; Noble, BookFinder, BookSense, Worldcat, and more</li> <li>The size differences and bolding in the tag cloud make it pretty easy to spot trends</li> <li>Reviews by users</li> <li>I love the book swapping links</li> <li>Good rating system (out of 5)</li> <li>Links to related Wikipedia articles</li> <li>Lots of options for blog cloud</li> <li>Can link with other social sites: Facebook, Digg, etc</li> </ul> <p>Cons</p> <ul> <li>only searches Amazon of the Library of congress</li> <li>You can only save 200 books. Lame. They charge $10/year or $25/lifetime to store unlimited books</li> <li>The Display styles of A, B, C, D, E are confusing if you don’t go look up what they mean</li> <li>The “click on cover” menu takes a little while to get used to</li> <li>Blog cloud is static</li> <li>Has a lot of social aspects, but no “Friends”</li> </ul> <p>LibraryThing Blog widget:</p> <p><strong>Shelfari</strong><br> This is the service I originally went with. Check out my main shelf <a href="http://www.shelfari.com/broderboy/shelf">here</a></p> <p><img src="https://lh6.google.com/timothy.broder/RvCD9fREi0I/AAAAAAAAMRI/GZLVbfjMVig/s400/shelfari.jpg?imgdl=1" alt=""></p> <p>Pros</p> <ul> <li>Multiple shelves</li> <li>Friends and groups, seems more social then the other two. (LibraryThing links to social aspects, but doesn’t have them as built in as Shelfari)</li> <li>Quite pretty</li> <li>Member reviews and Amazon reviews (linked separately)</li> <li>Can write notes (different from reviews) about each book or a shelf in general</li> </ul> <p>Cons</p> <ul> <li>Requires Flash</li> <li>Can only buy from Amazon</li> <li>Tag cloud doesn’t have enough difference in size</li> <li>Ads at the bottom of each page</li> <li>Has social aspect of friends, but doesn’t reach out to other social sites</li> </ul> <p>Shelfari Blog Widget:</p> <p>All in all I think I may stick with Shelfari. Yes My Library was the fastest for searching, and did relate the books to the most external sources, but sometimes it took a little longer to find the book I was looking for in the list. My searches in Shelfari, while slower always had the book I wanted in the top 3 results. I really like the recommendation and book swapping features of LibraryThing. What sold me on Shelfari and continues to do so, is the multiple shelves. I have a shelf for books I own and have read, a shelf for books I own but have not read, and a shelf for books I would like to buy. I just really like breaking it up this way. The only thing that could make this aspect better, would be if I could like my third list to my Amazon wish list.</p><![CDATA[Rest in Peace Robert Jordan]]>https://www.timbroder.com/2007/09/rest-in-peace-robert-jordanhttps://www.timbroder.com/2007/09/rest-in-peace-robert-jordanTue, 18 Sep 2007 10:55:00 GMT<p>Alas and woes, one of my favorite authors, <a href="http://www.dragonmount.com/RobertJordan/">Robert Jordan</a> has passed away. RJ is the author of the magnificent <a href="http://en.wikipedia.org/wiki/The_Wheel_of_Time">The Wheel of Time</a> Series. The series currently had 11 books plus a prequel. Jordan was feverishly working on the 12th and final book entitled A Memory of Light. My old Roommate <a href="http://www.shelfari.com/Kitster">Kit</a> got me into it and though I had previously tried the series when I was about 10 I didn't get into it, this time around I instantly fell in love with The Eye of the World (first book). I put RJ's work on the same level as Tolkien, who is my all time favorite author. Robert Jordan came to "dominate the world that Tolkien began to reveal to us." One of the words at the bottom of gpowered.net comes from a reference to the main character, Rand.</p> <p>RJ, you gave me a great world to escape this one into. I will miss you dearly. Rest in Peace and become a Memory of Light.</p><![CDATA[Google acquires Postini]]>https://www.timbroder.com/2007/09/google-acquires-postinihttps://www.timbroder.com/2007/09/google-acquires-postiniSun, 16 Sep 2007 17:31:00 GMT<p>Google has acquired <a href="http://www.postini.com/index.php">Postini</a> to better improve Google Apps.</p> <p>A blurb from Postini's website:<br> _With Postini Solutions, you can secure all of your electronic communications</p> <ul> <li>email, instant messaging and the web – and manage your company's</li> </ul> <p>communication policies from one central location. Postini Solutions can also make it easy to meet your archiving and encryption needs._</p> <p>Things I would like to see come out of this:</p> <ul> <li>The ability to encrypt Gmail messages and Google Docs without having to use</li> </ul> <p>greasemonkey</p> <ul> <li>A Google API to encrypt files and transfers in your own application or site</li> <li>(Ad?) subsidized access to Postini services</li> </ul> <p>The question on the tip of my tongue is, is Postini going to remain a separate entity though owned by Google, or are its services going to be completely integrated into Google's services?</p><![CDATA[GME 9/14 Feature Release]]>https://www.timbroder.com/2007/09/gme-914-feature-releasehttps://www.timbroder.com/2007/09/gme-914-feature-releaseSun, 16 Sep 2007 17:21:00 GMT<p>A new version of the <a href="http://editor.googlemashups.com">Google Mashup Editor</a> was released on Friday. Highlights of new features include:</p> <ul> <li>Ratings and Labels for external feeds</li> <li>Now uses GWT 1.4 (newest version)</li> <li>New "Save" event. List and item modules throw a save event when new entries</li> </ul> <p>are added to a feed</p> <ul> <li>Smarter loading of external libraries</li> <li>Documentation and samples were updated to support new features</li> </ul> <p>Bug fix highlights:</p> <ul> <li>Auto-complete can now be used when entry has a coma</li> <li>"nowrap" style for blue-theme CSS class was removed</li> <li>Documentation links in the editor now point to the correct docs</li> <li>Source highlighting in the editor was fixed</li> </ul> <p>For the complete list, check out this <a href="http://googlemashupeditor.blogspot.com/2007/09/more-new-stuff-914-feature-release.html">post</a></p><![CDATA[Playing Halo 3 on IMAX!]]>https://www.timbroder.com/2007/09/playing-halo-3-on-imaxhttps://www.timbroder.com/2007/09/playing-halo-3-on-imaxSun, 16 Sep 2007 16:12:00 GMT<p>Completely off topic, but I had to share. Last Thursday I had the amazing privilege to play Halo 3 on the Lincoln Center IMAX Screen. It was amazing. For those of you that don't know, the Lincoln center IMAX screen is 70-something feet tall. The master chief was bigger then me. My buddy who got the tickets was on line around 6:30, I shower up around 8 or so (they were only letting the first 200 people play), and we got into the theater around 9pm.</p> <p>Joe Tung and Luke started off by running through a campaign demo, showing off the saved video features, and blowing stuff up with Forge. The campaign demo we saw was 'The Storm' which had never been seen before. They fought through some baddies but turned off the demo as a gigantic spider mech came on to the screen, I guess we have to wait a few more days to see the rest of that...</p> <p>After the demos they let us play some slayer! 8 people at a time in 6 min rounds, I was #164 so I had to wait a bit, no worries though, seeing the other games on the giant screen made it worth the wait. When I got to play though, they only let 6 gamers onto the consoles... why? Joe and Luke had decided to join the fun! Playing Halo 3 against a producer and developer... super cool! I, of course, had my ass royally handed to me. I wish I had some photos to show but the security was pretty tight. In retrospect I should have tried to take a few on my way out. I had played and had nothing to lose... oh well...</p> <p>Halo 3 can't come soon enough (and I actually have a 360 now)...</p><![CDATA[Slight delay in next HOWTO]]>https://www.timbroder.com/2007/09/slight-delay-in-next-howtohttps://www.timbroder.com/2007/09/slight-delay-in-next-howtoThu, 13 Sep 2007 11:30:00 GMT<p>I was trying very hard to get the next HOWTO online last night. I got it about 3/4 of the way done but then went to bed so I could go to the gym this morning, but then I ended up setting my alarm for 6pm instead of 6am.... so that was a waste I probably could have finished it. Tonight I'm going to test out Halo 3 on the <a href="http://www.fandango.com/amcloewslincolnsquare13withimax_aabqi/theaterpage">Lincoln Center Imax Screen</a> which should just be crazy. Until then here's a good article I read yesterday entitled <a href="http://performancing.com/will-the-google-bashers-please-shut-up">Will The Google Bashers Please Shut Up?</a></p> <p>Till later, I'll see what time I get back tonight...</p> <p><a href="http://maps.google.com/maps?f=q&#x26;hl=en&#x26;geocode=&#x26;q=AMC+Loews+Lincoln+Square+13+with+IMAX&#x26;sll=37.0625,-95.677068&#x26;sspn=46.409192,82.265625&#x26;ie=UTF8&#x26;om=1&#x26;cid=40775399,-73982061,2461097962691146914&#x26;ll=40.784441,-73.977814&#x26;spn=0.019497,0.025749&#x26;z=14&#x26;iwloc=A&#x26;source=embed">View Larger Map</a></p><![CDATA[Last week recap]]>https://www.timbroder.com/2007/09/last-week-recaphttps://www.timbroder.com/2007/09/last-week-recapWed, 12 Sep 2007 01:24:00 GMT<p>These are just a few highlights from while I was gone...</p> <p><a href="http://googleblog.blogspot.com/2007/09/our-plans-for-code-jam.html">Google</a> Starts talking about a possible coding competition and gives some practice problems. Maybe I'll take a crack at them on the train on Friday...</p> <p><a href="http://googlemashupeditor.blogspot.com/2007/08/more-new-stuff-831-feature-release.html">Google Mashup Editor</a> had a feature release. Check out the post for the full list but my favorite new features include:</p> <ul> <li>Ability to edit XML, CSS and HTML files uploaded into the editor.</li> <li>New Tab styling and custom placement of tabs via CSS</li> <li>Documentation for new features</li> </ul> <p><a href="http://blogoscoped.com/archive/2007-08-30-n76.html">Blogoscoped</a> reported that iGoogle now has gadget to gadget communication. I think this will lead to the design of whole tabs with smaller more placeable gadgets that talk to each other rather then bigger uglier (possibly sluggish?) gadgets.</p> <p><a href="http://jessenoller.com/2007/08/31/python-30-alpha-1-released-you-want-it-because-its-cool/trackback/">Jessen Oller</a>: "Python 3.0 Alpha 1 released: You want it because it’s cool." Mmmmmmmmmm python. Get it <a href="http://python.org/download/releases/3.0/">here</a></p> <p><a href="http://google-code-updates.blogspot.com/2007/08/google-web-toolkit-out-of-beta-as-of-14.html">GWT</a> 1.4 came out of beta</p> <p><a href="http://gearsblog.blogspot.com/2007/08/google-gears-02-developer-release-ready.html">Google Gears</a> 0.2 developer release ready for download. New features include:</p> <ul> <li>Crosss-origin API support</li> <li>HttpRequest and Timer modules (can be used as workers)</li> </ul> <p><a href="http://blogoscoped.com/archive/2007-09-03-n45.html">Blogoscoped</a> reported that there are now new layout options on iGoogle. <a href="http://www.google.com/ig">Check it out</a></p> <p><a href="http://google-d-s.blogspot.com/2007/09/lazy-wednesday.html">Google Spreadsheets</a> got autocomplete. Its pretty nifty. It even understands Sun, Mon, and then what should come next, same for months and others.</p><![CDATA[Back in NY!]]>https://www.timbroder.com/2007/09/back-in-nyhttps://www.timbroder.com/2007/09/back-in-nyWed, 12 Sep 2007 00:57:00 GMT<p>Well as much fun as I had on the West Coast, there's no place like home and its good to be back. Highlights from my trip include Pike's Market, Tap House, Microsoft's campus, the Space Needle, and Mount Si in Seattle, and Dreamworks, Chinatown, and San Fransisco itself. Photos to come as soon as I have time to upload them to Picasa.</p> <p>As I <a href="https://gpowered.blogspot.com/2007/09/google-reader-adds-search-box.html">posted</a> while I was gone, my favorite thing I glanced at in reader was the fact that Google Reader added a search bar. This is great for me, there are so many times where I think "what the heck was that article about that thing...".</p> <p>Quick summery post of things I saw in reader coming up...</p><![CDATA[Google Reader adds Search Box!!]]>https://www.timbroder.com/2007/09/google-reader-adds-search-boxhttps://www.timbroder.com/2007/09/google-reader-adds-search-boxThu, 06 Sep 2007 18:20:00 GMT<p>Finally!! No more using Yahoo Pipes to search the feeds!</p> <p>I'm sitting here waiting for my friend Eli to pick me up from his apartment for a nice lunch over at dreamworks, glancing over a few feeds (I have a LOT to catch up on when I get back to NY), and one jumped out at me, the Google Reader Team has finally added a search box to Google reader.</p> <p><img src="https://lh3.google.com/timothy.broder/RuBD9JE6BbI/AAAAAAAAKqA/hVp1MIIZftM/s400/tim.jpg?imgdl=1" alt=""></p> <p>This box will search all of your feeds! Also included in this release are:</p> <ul> <li>Ability to hide side navigation (I just tried it, it's very well done)</li> <li>Unread count is now 1,000+ rather then 100+ (this is going to be good for</li> </ul> <p>me when I get back)</p> <ul> <li>Forward and Back buttons now have more responsiveness when moving between</li> </ul> <p>folders and feeds</p> <p>Check out <a href="http://blogsearch.google.com/">Google Blog Search</a> for more blog searching.</p><![CDATA[gPowered.net update: Diggs and HOWTO list]]>https://www.timbroder.com/2007/08/gpowerednet-update-diggs-and-howto-listhttps://www.timbroder.com/2007/08/gpowerednet-update-diggs-and-howto-listFri, 31 Aug 2007 23:50:00 GMT<p>Quick update while I'm sitting here waiting for my friends in Seattle to get home from work, and its dinner time in NY, I need food! Anyway, I added the Digg count and HOWTO lists to the <a href="https://gpowered.net/g/postlist/">Post List</a> page as YUI tabview tabs.</p><![CDATA[HOWTO: YUI Tabview]]>https://www.timbroder.com/2007/08/howto-yui-tabviewhttps://www.timbroder.com/2007/08/howto-yui-tabviewFri, 31 Aug 2007 23:25:00 GMT<p>A few days ago I added the Digg counts to the bottom of the <a href="https://gpowered.net/g/postlist">Posts</a> page on gPowered.net. Although, the more posts that I add, the further down on the page this section will get, so I decided to play around with YUI's <a href="http://developer.yahoo.com/yui/tabview/">tabview control</a> and put the post list in one tab, and the diggs in another. It turned out to be really easy:</p> <p>First we need a few dependencies</p> <div class="gatsby-highlight" data-language="html"><pre style="counter-reset: linenumber NaN" class="language-html line-numbers"><code class="language-html"> <span class="token comment">&lt;!-- Dependencies --></span> <span class="token comment">&lt;!-- core CSS --></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text/css<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://yui.yahooapis.com/2.3.0/build/tabview/assets/tabview.css<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token comment">&lt;!-- optional skin for border tabs --></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text/css<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://yui.yahooapis.com/2.3.0/build/tabview/assets/border_tabs.css<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text/javascript<span class="token punctuation">"</span></span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://yui.yahooapis.com/2.3.0/build/yahoo-dom-event/yahoo-dom-event.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text/javascript<span class="token punctuation">"</span></span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://yui.yahooapis.com/2.3.0/build/element/element-beta-min.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span> <span class="token comment">&lt;!-- Source file --></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text/javascript<span class="token punctuation">"</span></span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://yui.yahooapis.com/2.3.0/build/tabview/tabview-min.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span> </code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>And then we just need to organize some DIVs</p> <div class="gatsby-highlight" data-language="html"><pre style="counter-reset: linenumber NaN" class="language-html line-numbers"><code class="language-html"> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>demo<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>yui-navset<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ul</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>yui-nav<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>selected<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#posts<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>em</span><span class="token punctuation">></span></span>Posts<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>em</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#diggs<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>em</span><span class="token punctuation">></span></span>Diggs<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>em</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#HOWTOs<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>em</span><span class="token punctuation">></span></span>HOWTO's<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>em</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>ul</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>yui-content<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>posts<span class="token punctuation">"</span></span> <span class="token special-attr"><span class="token attr-name">style</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token value css language-css"><span class="token property">margin</span><span class="token punctuation">:</span> 10px</span><span class="token punctuation">"</span></span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h3</span><span class="token punctuation">></span></span>Posts<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h3</span><span class="token punctuation">></span></span> content <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>diggs<span class="token punctuation">"</span></span> <span class="token special-attr"><span class="token attr-name">style</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token value css language-css"><span class="token property">margin</span><span class="token punctuation">:</span> 10px</span><span class="token punctuation">"</span></span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h3</span><span class="token punctuation">></span></span>Diggs<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h3</span><span class="token punctuation">></span></span> content <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> ```HTML </code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[Vacation!]]>https://www.timbroder.com/2007/08/vacationhttps://www.timbroder.com/2007/08/vacationThu, 30 Aug 2007 20:21:00 GMT<p>Hi All,</p> <p>I'm leaving for vacation in a few. I'm going to be in Seattle, Washington until Wed morning and then San Fransisco until the following Sunday. I don't know if / when I'll be able to post anything but I'll try if I have some downtime ;)</p> <p>Hey look, an embedded map!!</p> <p><a href="http://maps.google.com/maps?f=d&#x26;hl=en&#x26;geocode=&#x26;saddr=Hoboken,+NJ&#x26;daddr=JFK+to:Seattle,+WA+to:Parnassus+Ave+%4037.762970,+-122.459770+to:JFK+-+John+F+Kennedy+Intl+Airport,+Queens,+NY+to:Hoboken,+NJ&#x26;mrcr=4&#x26;mra=pi&#x26;sll=42.7379,-98.589685&#x26;sspn=44.718271,82.265625&#x26;ie=UTF8&#x26;om=1&#x26;ll=42.7379,-98.589685&#x26;spn=44.718271,82.265625&#x26;source=embed">View Larger Map</a></p><![CDATA[HOWTO: Getting the Numer of Diggs from Digg (Python)]]>https://www.timbroder.com/2007/08/getting-numerof-diggs-from-digghttps://www.timbroder.com/2007/08/getting-numerof-diggs-from-diggThu, 30 Aug 2007 03:32:00 GMT<p>After 2 of my posts were on the Digg front page this morning (Thank you all very much to those that dugg them), I took my first look into the <a href="http://apidoc.digg.com/">Digg API</a>. I wanted a way to take a quick look to see how many Diggs certain stories were getting. In some ways it is similar to GData: make a call to a URL, get some XML back, parse it, etc. It does, however, feel lighter, probably due to its streamlined nature. It has one purpose, get information off of Digg. Using this, I've added a section in the <a href="https://gpowered.net/g/postlist/">Post List</a> section of gPowered.net that shows the Diggs of a few of the articles that I have submitted on Digg.</p> <p>The API is broken into 5 main sections or endpoints. Each of these will return related types of data:</p> <ul> <li>Stories</li> <li>Events</li> <li>Users</li> <li>Topics</li> <li>Errors</li> </ul> <p>In this quick HOWTO I'm going to take a quick look into the Stories endpoint so I can display the number of Diggs specific stories have. We'll start off by making a small class to hold our returned data (useful to send to a template or just for working with later on. We don't want to keep having to hit the ElementTree to get data out). All of the calls will be send to '<a href="http://services.digg.com/">http://services.digg.com/</a>'. In this example I will only be querying '<a href="http://services.digg.com/story/%7Bstory">http://services.digg.com/story/{story</a> clean title}'.</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token keyword">import</span> httplib2 <span class="token keyword">from</span> elementtree <span class="token keyword">import</span> ElementTree <span class="token comment">#for storing</span> <span class="token keyword">class</span> <span class="token class-name">MyDigg</span><span class="token punctuation">:</span> <span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> title<span class="token punctuation">,</span> link<span class="token punctuation">,</span> digg<span class="token punctuation">,</span> diggs<span class="token punctuation">)</span><span class="token punctuation">:</span> self<span class="token punctuation">.</span>title <span class="token operator">=</span> title self<span class="token punctuation">.</span>link <span class="token operator">=</span> link self<span class="token punctuation">.</span>digg <span class="token operator">=</span> digg self<span class="token punctuation">.</span>diggs <span class="token operator">=</span> diggs <span class="token keyword">def</span> <span class="token function">__str__</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">return</span> self<span class="token punctuation">.</span>title <span class="token operator">+</span> <span class="token string">' '</span> <span class="token operator">+</span> self<span class="token punctuation">.</span>diggs <span class="token comment">#stories to get diggs of</span> posts <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token string">'Google_NOT_releasing_it_s_Goobuntu_Desktop_OS_STOP_DIGGING_IT'</span><span class="token punctuation">,</span> <span class="token string">'New_Digg_Home_Page_breaks_the_Linux_section_on_IE'</span><span class="token punctuation">,</span> <span class="token string">'Google_Reader_API_Functions'</span> <span class="token punctuation">]</span> <span class="token comment">#hold returned info</span> my_diggs <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token comment">#all calls go through this</span> digg_service <span class="token operator">=</span> <span class="token string">'http://services.digg.com/'</span> <span class="token comment">#just looking at stories</span> service_endpoint <span class="token operator">=</span> digg_service <span class="token operator">+</span> <span class="token string">'story/%s'</span> <span class="token comment">#only need 1 result back</span> trailer <span class="token operator">=</span> <span class="token string">'?count=1&amp;appkey;=http%3A%2F%2Fgpowered.blogspot.com'</span> <span class="token comment">#keep track of total diggs</span> total_diggs <span class="token operator">=</span> <span class="token number">0</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>After we are set up, we will want to loop through each story we want to get Digg data for. Add the well formed title into the query string, and send it to the Digg service. Then, parse the response, and get the information we need.</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token keyword">for</span> story <span class="token keyword">in</span> posts<span class="token punctuation">:</span> curr_story <span class="token operator">=</span> service_endpoint <span class="token operator">%</span> story url <span class="token operator">=</span> curr_story <span class="token operator">+</span> trailer h <span class="token operator">=</span> httplib2<span class="token punctuation">.</span>Http<span class="token punctuation">(</span><span class="token punctuation">)</span> resp<span class="token punctuation">,</span> content <span class="token operator">=</span> h<span class="token punctuation">.</span>request<span class="token punctuation">(</span>url<span class="token punctuation">,</span> <span class="token string">"GET"</span><span class="token punctuation">,</span> body<span class="token operator">=</span><span class="token string">"nt"</span><span class="token punctuation">,</span> headers<span class="token operator">=</span><span class="token punctuation">{</span><span class="token string">'content-type'</span><span class="token punctuation">:</span><span class="token string">'text/plain'</span><span class="token punctuation">}</span> <span class="token punctuation">)</span> story <span class="token operator">=</span> ElementTree<span class="token punctuation">.</span>fromstring<span class="token punctuation">(</span>content<span class="token punctuation">)</span><span class="token punctuation">.</span>findall<span class="token punctuation">(</span><span class="token string">'story'</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> d <span class="token operator">=</span> MyDigg<span class="token punctuation">(</span>story<span class="token punctuation">.</span>findall<span class="token punctuation">(</span><span class="token string">'title'</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>text<span class="token punctuation">,</span> story<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'link'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> story<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'href'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> story<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'diggs'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> total_diggs <span class="token operator">=</span> total_diggs <span class="token operator">+</span> <span class="token builtin">int</span><span class="token punctuation">(</span>d<span class="token punctuation">.</span>diggs<span class="token punctuation">)</span> my_diggs<span class="token punctuation">.</span>append<span class="token punctuation">(</span>d<span class="token punctuation">)</span> <span class="token keyword">print</span> d <span class="token keyword">print</span> <span class="token string">'Total: '</span> <span class="token operator">+</span> <span class="token builtin">str</span><span class="token punctuation">(</span>total_diggs<span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>And that's that. my_diggs now has all the information we need!</p><![CDATA[Google's Newest Data Center [Pics]]]>https://www.timbroder.com/2007/08/google-newest-data-center-picshttps://www.timbroder.com/2007/08/google-newest-data-center-picsThu, 30 Aug 2007 03:25:00 GMT<p><a href="http://www.informationweek.com/galleries/showImage.jhtml?galleryID=62">Information Week</a> posted some photos of Google's newest data center near The Dalles' dam. Needless to say, I wouldn't mind access to this baby. Heck, I would want one, but there is no way I would be able to power it. I'm sure the proximity to the dam's power station and water supply were key factors in choosing the location.</p> <p><img src="https://i.cmpnet.com/infoweek/galleries/automated/62/google12_full.JPG" alt=""></p> <p><img src="https://i.cmpnet.com/infoweek/galleries/automated/62/google11_full.JPG" alt=""></p> <p><img src="https://i.cmpnet.com/infoweek/galleries/automated/62/google7_full.JPG" alt=""></p><![CDATA[NY State Fair Embedded Map]]>https://www.timbroder.com/2007/08/ny-state-fair-embedded-maphttps://www.timbroder.com/2007/08/ny-state-fair-embedded-mapWed, 29 Aug 2007 03:58:00 GMT<p>It's really, really easy to put maps onto any site or blog now using <a href="http://google-latlong.blogspot.com/2007/08/youtube-style-embeddable-maps_21.html">Embedded Maps</a>. I threw this together real quick to demonstrate. This past weekend I drove up to Syracuse for the New York State fair. A great time if you have never been. Plenty of fantastic food and drink. I also had to pick up my old roomie, and using Google Maps new multiple destination feature this was easy as well.</p> <p>First stop:</p> <p><img src="https://lh6.google.com/timothy.broder/RtTt55E6BVI/AAAAAAAAKo0/w16pCqdM2ZU/s400/emap1.gif?imgdl=1" alt=""></p> <p>Adding the second stop:</p> <p><img src="https://lh3.google.com/timothy.broder/RtTt6JE6BWI/AAAAAAAAKo8/gWekdVwBTkM/s400/emap2.gif?imgdl=1" alt=""></p> <p>Getting the code to embed the map by clicking on "Link to this page":</p> <p><img src="https://lh3.google.com/timothy.broder/RtTt6JE6BXI/AAAAAAAAKpE/HbyVJXrzdoc/s400/emap3.gif?imgdl=1" alt=""></p> <p>If you want, more advanced options:</p> <p><img src="https://lh5.google.com/timothy.broder/RtTuupE6BaI/AAAAAAAAKpg/l7pzHKuWAbo/s400/emap4.gif?imgdl=1" alt=""></p> <p><img src="https://lh3.google.com/timothy.broder/RtTt6JE6BZI/AAAAAAAAKpU/-pr_1w9SUe0/s400/emap5.gif?imgdl=1" alt=""></p> <p>And now, the final product:</p> <p>[View Larger Map](<a href="http://maps.google.com/maps?f=d&#x26;hl=en&#x26;geocode=&#x26;saddr=Hoboken">http://maps.google.com/maps?f=d&#x26;hl=en&#x26;geocode=&#x26;saddr=Hoboken</a> ,+NJ&#x26;daddr=Morristown,+NJ+to:Syracuse,+NY&#x26;mrcr=1&#x26;mra=pi&#x26;sll=40.759195,-74.2540 55&#x26;sspn=0.207522,0.466919&#x26;ie=UTF8&#x26;om=1&#x26;ll=41.87761,-75.10599&#x26;spn=2.862977,4.66 9189&#x26;z=7&#x26;source=embed)</p><![CDATA[Codeless Embedded Maps]]>https://www.timbroder.com/2007/08/codeless-embedded-mapshttps://www.timbroder.com/2007/08/codeless-embedded-mapsWed, 29 Aug 2007 03:42:00 GMT<p>Google Maps released <a href="http://google-latlong.blogspot.com/2007/08/youtube-style-embeddable-maps_21.html">Embeddable Maps</a>. It's as easy as embedding youtube videos. All you have to do is create your map, and then under the "Link to this page" menu, there is a new option under the link that has some HTML iframe code to add the map anywhere. Check out the next post to see the trip to Syracuse I took this weekend to go to the New York State Fair.</p><![CDATA[Programmable Web hits 500 API's!]]>https://www.timbroder.com/2007/08/programmable-web-hits-500-apishttps://www.timbroder.com/2007/08/programmable-web-hits-500-apisWed, 29 Aug 2007 03:32:00 GMT<p>This isn't a Google post per say, but if you haven't checked out <a href="http://programmableweb.com">Programmable Web</a>, I highly recommend doing so. They catalog API's, Mashups, Howto's, and host contests.</p> <p>Programmable Web has the following Google API's registered, next to them is each API's mashup count:</p> <ul> <li>Google AdSense 14</li> <li>Google AdWords 18</li> <li>Google Ajax Feeds 5</li> <li>Google Ajax Search 25</li> <li>Google Base 18</li> <li>Google Calendar 19</li> <li>Google Checkout 4</li> <li>Google Client Authentication 2</li> <li>Google Code Search 1</li> <li>Google Custom Search 0</li> <li>Google Desktop 8</li> <li>Google Documents 0</li> <li>Google Gears 0</li> <li>Google Homepage 32</li> <li>Google Maps 1128</li> <li>Google Mashup Editor 2</li> <li>Google Notebook 1</li> <li>Google Picasa 5</li> <li>Google Provisioning 0</li> <li>Google Research 0</li> <li>Google Safe Browsing 1</li> <li>Google Search 80</li> <li>Google Single SignOn 0</li> <li>Google Spreadsheets 2</li> <li>Google Talk 3</li> <li>Google Translate 0</li> <li>Google Web Authentication 1</li> </ul><![CDATA[Old Google Design back?]]>https://www.timbroder.com/2007/08/old-google-design-backhttps://www.timbroder.com/2007/08/old-google-design-backWed, 29 Aug 2007 03:29:00 GMT<p><a href="http://blogoscoped.com/archive/2007-08-27.html#n55">Blogoscoped</a> reports that some people have the old design (Google App links are above the search bar instead of the upper left). I checked at work on IE6 and firefox and at home on firefox (on Gutsy) and IE7 both logged in and logged out but still had the new interface. I wonder who has the old one...</p><![CDATA[Webmaster tools adds Internationalization support]]>https://www.timbroder.com/2007/08/webmaster-tools-addshttps://www.timbroder.com/2007/08/webmaster-tools-addsWed, 29 Aug 2007 03:27:00 GMT<p>You can now register domains in <a href="http://www.google.com/webmasters/">Webmaster Central</a> with non-English characters in them by supporting IDNA (Internationalizing Domain Names in Applications). Originally only domains with a-z, A-Z, 0-9, or '-' could be used. I tested it out and it looks like its working good!</p><![CDATA[Google is NOT working on a desktop OS for the public!!]]>https://www.timbroder.com/2007/08/google-is-not-working-on-desktop-os-forhttps://www.timbroder.com/2007/08/google-is-not-working-on-desktop-os-forTue, 28 Aug 2007 22:52:00 GMT<p>This is really just a quick response to <a href="http://digg.com/linux_unix/Google_is_preparing_its_own_distribution_of_Linux">this</a> Digg. How it made the front page is completely beyond my comprehension. The article itself is a year old and Google has denied countless times they are going to release "Goobuntu". Heck, I've been to a tech talk where its been stated that Goobuntu is just their internal OS that developers can use that comes with some snazzy Google tools. See below for some other confirmations that Goobuntu isn't coming out.</p> <ul> <li><a href="http://digg.com/linux_unix/Google_is_preparing_its_own_distribution_of_Linux">http://digg.com/linux_unix/Google_is_preparing_its_own_distribution_of_Linux</a></li> <li><a href="http://www.desktoplinux.com/news/NS3052748545.html">http://www.desktoplinux.com/news/NS3052748545.html</a></li> <li><a href="http://ubuntu.wordpress.com/2006/02/01/goobuntu-analysis-of-a-hoax/">http://ubuntu.wordpress.com/2006/02/01/goobuntu-analysis-of-a-hoax/</a></li> <li><a href="http://blogoscoped.com/forum/98978.html">http://blogoscoped.com/forum/98978.html</a></li> <li><a href="http://en.wikipedia.org/wiki/Goobuntu">http://en.wikipedia.org/wiki/Goobuntu</a></li> </ul> <p>I'm going to add to this list but I really need some dinner....</p> <p>Goobuntu is on every one's most wanted list from Google, Heck I'd rather have that then the gPhone... maybe... but as of right now, I'll have to wait forever....</p><![CDATA[New Digg Home Page breaks the Linux section on IE?]]>https://www.timbroder.com/2007/08/new-digg-home-page-breaks-linux-sectionhttps://www.timbroder.com/2007/08/new-digg-home-page-breaks-linux-sectionTue, 28 Aug 2007 17:05:00 GMT<p>So I'm sitting here eating lunch and go to see if there is anything new on Digg. Saw the new layout, looks nice, haven't really had a chance to play around with it yet. However, when i got to the <a href="http://digg.com/linux_unix">Linux/Unix</a> section, it wouldn't show up in Internet Explorer (6). It works fine in FireFox. Does someone over at Digg have a sense of humor or is my browser just acting on the bunk?</p> <p><a href="https://4.bp.blogspot.com/_Ng3QbVQfLZ8/RtRZ55E6BUI/AAAAAAAAKos/itsvL5UrT2c/s1600-h/screen_linux.gif"><img src="https://4.bp.blogspot.com/_Ng3QbVQfLZ8/RtRZ55E6BUI/AAAAAAAAKos/itsvL5UrT2c/s400/screen_linux.gif" alt=""></a></p><![CDATA[Blogger Update: Video in post is out of beta]]>https://www.timbroder.com/2007/08/blogger-update-video-in-post-is-out-ofhttps://www.timbroder.com/2007/08/blogger-update-video-in-post-is-out-ofTue, 28 Aug 2007 02:01:00 GMT<p>Or out of "in draft" I should say. Not much to show in the ways of how to use <a href="http://buzz.blogger.com/2007/08/3-2-1-action.html">this</a>: A button has been added next to the add an image icon. Maybe I'll use this in my upcoming post about using spreadsheets and base as a database... hmmm...</p> <p><img src="https://lh6.google.com/timothy.broder/RtOBZJE6BSI/AAAAAAAAKoc/83d-BWrBiFM/s400/blogger_video_post.jpg?imgdl=1" alt=""></p><![CDATA[Zoho Writer using Gears (cont'd)]]>https://www.timbroder.com/2007/08/zoho-writer-using-gears-contdhttps://www.timbroder.com/2007/08/zoho-writer-using-gears-contdTue, 28 Aug 2007 01:45:00 GMT<p>In a quick follow-up to my <a href="http://blog.gpowered.net/2007/08/google-get-in-gear.html">previous article</a>; Google <a href="http://google-code-updates.blogspot.com/2007/08/weekly-google-code-roundup-reaching-sky.html">code blog</a> posted a <a href="http://gearsblog.blogspot.com/2007/08/gearing-up-with-zoho-offline.html">video talk</a> about the experience the Zoho team had in incorporating Gears with their Writer.</p> <p>I hate to bring it up again, but like I said before, the Docs team better get moving... a Google product competitor using Google Gears first?</p><![CDATA[HOWTO: Google Reader API Functions]]>https://www.timbroder.com/2007/08/google-reader-api-functionshttps://www.timbroder.com/2007/08/google-reader-api-functionsThu, 23 Aug 2007 02:57:00 GMT<p>I've been wanting an API for Google reader since I started using it, and especially since i started gPowered so I could display a list of the feeds I read on the site. The official word on an API for reader is "It's coming in a few weeks," but that was back in late 2005. The reason being that at the time, the URLs the API would use were going to change a lot. So, after a bit of research and coding I came up with some python functions to do the job.</p> <p>The first step was authenticating against Google accounts without using the <a href="http://code.google.com/p/gdata-python-client/">client library</a>. The Python Gdata Library makes login very easy but Reader isn't part of the Client Library yet (maybe I'll try to add it, we'll see...) but <a href="http://djcraven.blogspot.com/2006/10/success-posting-to-blogger-beta-using.html">this</a> was the method I was using for gdata and python pre-Client Library, and the principles still hold true for working with Reader. Thankfully, most of the <a href="http://www.niallkennedy.com/blog/archives/2005/12/google_reader_a.html">research</a> for working with the 'Reader API' was done for me already by Niall Kennedy. This is an unofficial, unsupported API and the URLs for some of the queries have changed since the writing of that article. Here we go...</p> <p>We're going to use urllib(2) to handle the communication with this one. I rather would have used httplib, but I was having trouble with the authentication cookie. Each retrieval has its own URL to query against</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token keyword">import</span> urllib <span class="token keyword">import</span> urllib2 <span class="token keyword">import</span> re login <span class="token operator">=</span> <span class="token string">'timothy.broder@gmail.com'</span> password <span class="token operator">=</span> <span class="token string">'****'</span> source <span class="token operator">=</span> <span class="token string">'gPowered'</span> google_url <span class="token operator">=</span> <span class="token string">'http://www.google.com'</span> reader_url <span class="token operator">=</span> google_url <span class="token operator">+</span> <span class="token string">'/reader'</span> login_url <span class="token operator">=</span> <span class="token string">'https://www.google.com/accounts/ClientLogin'</span> token_url <span class="token operator">=</span> reader_url <span class="token operator">+</span> <span class="token string">'/api/0/token'</span> subscription_list_url <span class="token operator">=</span> reader_url <span class="token operator">+</span> <span class="token string">'/api/0/subscription/list'</span> reading_url <span class="token operator">=</span> reader_url <span class="token operator">+</span> <span class="token string">'/atom/user/-/state/com.google/reading-list'</span> read_items_url <span class="token operator">=</span> reader_url <span class="token operator">+</span> <span class="token string">'/atom/user/-/state/com.google/read'</span> reading_tag_url <span class="token operator">=</span> reader_url <span class="token operator">+</span> <span class="token string">'/atom/user/-/label/%s'</span> starred_url <span class="token operator">=</span> reader_url <span class="token operator">+</span> <span class="token string">'/atom/user/-/state/com.google/starred'</span> subscription_url <span class="token operator">=</span> reader_url <span class="token operator">+</span> <span class="token string">'/api/0/subscription/edit'</span> get_feed_url <span class="token operator">=</span> reader_url <span class="token operator">+</span> <span class="token string">'/atom/feed/'</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>When we authenticate against Google Reader with a gmail account and password in the browser, a cookie is stored. We'll have to recreate the values in this cookie. The static values are the Domain (.google.com), the Path (/), and Expires (we'll use 160000000000). The unique value, based on the current login session, is the SID (Session ID?), which we will need to retrieve. We'll do the login and retrieval in the same function:</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token comment">#login / get SED</span> <span class="token keyword">def</span> <span class="token function">get_SID</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> header <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token string">'User-agent'</span> <span class="token punctuation">:</span> source<span class="token punctuation">}</span> post_data <span class="token operator">=</span> urllib<span class="token punctuation">.</span>urlencode<span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token string">'Email'</span><span class="token punctuation">:</span> login<span class="token punctuation">,</span> <span class="token string">'Passwd'</span><span class="token punctuation">:</span> password<span class="token punctuation">,</span> <span class="token string">'service'</span><span class="token punctuation">:</span> <span class="token string">'reader'</span><span class="token punctuation">,</span> <span class="token string">'source'</span><span class="token punctuation">:</span> source<span class="token punctuation">,</span> <span class="token string">'continue'</span><span class="token punctuation">:</span> google_url<span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> request <span class="token operator">=</span> urllib2<span class="token punctuation">.</span>Request<span class="token punctuation">(</span>login_url<span class="token punctuation">,</span> post_data<span class="token punctuation">,</span> header<span class="token punctuation">)</span> <span class="token keyword">try</span> <span class="token punctuation">:</span> f <span class="token operator">=</span> urllib2<span class="token punctuation">.</span>urlopen<span class="token punctuation">(</span> request <span class="token punctuation">)</span> result <span class="token operator">=</span> f<span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">except</span><span class="token punctuation">:</span> <span class="token keyword">print</span> <span class="token string">'Error logging in'</span> <span class="token keyword">return</span> re<span class="token punctuation">.</span>search<span class="token punctuation">(</span><span class="token string">'SID=(\S*)'</span><span class="token punctuation">,</span> result<span class="token punctuation">)</span><span class="token punctuation">.</span>group<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>We'll also need a function that can handle any of those URLs, create the header, attach a cookie to it, and retrieve the data from Google. I left the return as a raw data string so you could use whatever XML parsing library you want. I personally like using [ElementTree](<a href="http://effbot.org/zone/element-">http://effbot.org/zone/element-</a> index.htm).</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token comment">#get results from url</span> <span class="token keyword">def</span> <span class="token function">get_results</span><span class="token punctuation">(</span>SID<span class="token punctuation">,</span> url<span class="token punctuation">)</span><span class="token punctuation">:</span> header <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token string">'User-agent'</span> <span class="token punctuation">:</span> source<span class="token punctuation">}</span> header<span class="token punctuation">[</span><span class="token string">'Cookie'</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token string">'Name=SID;SID=%s;Domain=.google.com;Path=/;Expires=160000000000'</span> <span class="token operator">%</span> SID request <span class="token operator">=</span> urllib2<span class="token punctuation">.</span>Request<span class="token punctuation">(</span>url<span class="token punctuation">,</span> <span class="token boolean">None</span><span class="token punctuation">,</span> header<span class="token punctuation">)</span> <span class="token keyword">try</span> <span class="token punctuation">:</span> f <span class="token operator">=</span> urllib2<span class="token punctuation">.</span>urlopen<span class="token punctuation">(</span> request <span class="token punctuation">)</span> result <span class="token operator">=</span> f<span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">except</span><span class="token punctuation">:</span> <span class="token keyword">print</span> <span class="token string">'Error getting data from %s'</span> <span class="token operator">%</span> url <span class="token keyword">return</span> result</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>The following methods are the calls that I've gotten working so far; I'm going to keep working on the 'edit' functions, like adding, removing feeds, changing tags, etc. See the comments for what they do. Note: Any edit against the API needs to send over a changing token as part of the call</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token comment">#get a token, this is needed for modifying to reader</span> <span class="token keyword">def</span> <span class="token function">get_token</span><span class="token punctuation">(</span>SID<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">return</span> get_results<span class="token punctuation">(</span>SID<span class="token punctuation">,</span> token_url<span class="token punctuation">)</span> <span class="token comment">#get a specific feed. It works for any feed, subscribed or not</span> <span class="token keyword">def</span> <span class="token function">get_feed</span><span class="token punctuation">(</span>SID<span class="token punctuation">,</span> url<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">return</span> get_results<span class="token punctuation">(</span>SID<span class="token punctuation">,</span> get_feed_url <span class="token operator">+</span> url<span class="token punctuation">.</span>encode<span class="token punctuation">(</span><span class="token string">'utf-8'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">#get a list of the users subscribed feeds</span> <span class="token keyword">def</span> <span class="token function">get_subscription_list</span><span class="token punctuation">(</span>SID<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">return</span> get_results<span class="token punctuation">(</span>SID<span class="token punctuation">,</span> subscription_list_url<span class="token punctuation">)</span> <span class="token comment">#get a feed of the users unread items</span> <span class="token keyword">def</span> <span class="token function">get_reading_list</span><span class="token punctuation">(</span>SID<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">return</span> get_results<span class="token punctuation">(</span>SID<span class="token punctuation">,</span> reading_url<span class="token punctuation">)</span> <span class="token comment">#get a feed of the users read items</span> <span class="token keyword">def</span> <span class="token function">get_read_items</span><span class="token punctuation">(</span>SID<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">return</span> get_results<span class="token punctuation">(</span>SID<span class="token punctuation">,</span> read_items_url<span class="token punctuation">)</span> <span class="token comment">#get a feed of the users unread items of a given tag</span> <span class="token keyword">def</span> <span class="token function">get_reading_tag_list</span><span class="token punctuation">(</span>SID<span class="token punctuation">,</span> tag<span class="token punctuation">)</span><span class="token punctuation">:</span> tagged_url <span class="token operator">=</span> reading_tag_url <span class="token operator">%</span> tag <span class="token keyword">return</span> get_results<span class="token punctuation">(</span>SID<span class="token punctuation">,</span> tagged_url<span class="token punctuation">.</span>encode<span class="token punctuation">(</span><span class="token string">'utf-8'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">#get a feed of a users starred items/feeds</span> <span class="token keyword">def</span> <span class="token function">get_starred</span><span class="token punctuation">(</span>SID<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">return</span> get_results<span class="token punctuation">(</span>SID<span class="token punctuation">,</span> starred_url<span class="token punctuation">)</span> <span class="token comment">#subscribe of unsubscribe to a feed</span> <span class="token keyword">def</span> <span class="token function">modify_subscription</span><span class="token punctuation">(</span>SID<span class="token punctuation">,</span> what<span class="token punctuation">,</span> do<span class="token punctuation">)</span><span class="token punctuation">:</span> url <span class="token operator">=</span> subscription_url <span class="token operator">+</span> <span class="token string">'?client=client:%s&amp;ac;=%s&amp;s;=%s&amp;token;=%s'</span> <span class="token operator">%</span> <span class="token punctuation">(</span> login<span class="token punctuation">,</span> do<span class="token punctuation">.</span>encode<span class="token punctuation">(</span><span class="token string">'utf-8'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'feed%2F'</span> <span class="token operator">+</span> what<span class="token punctuation">.</span>encode<span class="token punctuation">(</span><span class="token string">'utf-8'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> get_token<span class="token punctuation">(</span>SID<span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">print</span> url <span class="token keyword">return</span> get_results<span class="token punctuation">(</span>SID<span class="token punctuation">,</span> url<span class="token punctuation">)</span> <span class="token comment">#subscribe to a feed</span> <span class="token keyword">def</span> <span class="token function">subscribe_to</span><span class="token punctuation">(</span>SID<span class="token punctuation">,</span> url<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">return</span> modify_subscription<span class="token punctuation">(</span>SID<span class="token punctuation">,</span> url<span class="token punctuation">,</span> <span class="token string">'subscribe'</span><span class="token punctuation">)</span> <span class="token comment">#unsubscribe to a feed</span> <span class="token keyword">def</span> <span class="token function">unsubscribe_from</span><span class="token punctuation">(</span>SID<span class="token punctuation">,</span> url<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">return</span> modify_subscription<span class="token punctuation">(</span>SID<span class="token punctuation">,</span> url<span class="token punctuation">,</span> <span class="token string">'unsubscribe'</span><span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Example usage:</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python">SID <span class="token operator">=</span> get_SID<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">print</span> get_subscription_list<span class="token punctuation">(</span>SID<span class="token punctuation">)</span> <span class="token comment">#print get_reading_list(SID)</span> <span class="token comment">#print get_read_items(SID)</span> <span class="token comment">#print get_reading_tag_list(SID, 'me')</span> <span class="token comment">#print get_reading_tag_list(SID, 'nada-mas')</span> <span class="token comment">#print get_starred(SID)</span> <span class="token comment">#print get_token(SID)</span> <span class="token comment">#test_feed = 'http://picasaweb.google.com/data/feed/base/user/timothy.broder/albumid/5101347429735335089?kind=photo&amp;alt;=rss&amp;hl;=en_US'</span> <span class="token comment">#print subscribe_to(SID, test_feed)</span> <span class="token comment">#returns ok but I don't see the feed in reader?</span> <span class="token comment">#print get_feed(SID, test_feed)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Like I said, I'd like to keep going with this and get the edit functionality to work better. I'm also going to take a look into the Client Library and see if I could set this up as a patch that people could use if they wanted to use the API.</p><![CDATA[View Google Groups posts in Reader]]>https://www.timbroder.com/2007/08/view-google-groups-posts-in-readerhttps://www.timbroder.com/2007/08/view-google-groups-posts-in-readerWed, 22 Aug 2007 21:11:00 GMT<p>I don't know why I never noticed this before but you can subscribe to the mail sent to Google Groups through an RSS feed at the bottom of each group. I'm trying it out for a few groups, I might like it better then reading through the mail. I wonder if there is a way to subscribe to the rolled up versions of the posts...</p> <p><img src="https://lh5.google.com/timothy.broder/RsyngpE6BRI/AAAAAAAAKn8/F6Qvt7wUps4/s400/groups_reader.jpg?imgdl=1" alt=""></p><![CDATA[Blogger resumes service]]>https://www.timbroder.com/2007/08/blogger-resumes-servicehttps://www.timbroder.com/2007/08/blogger-resumes-serviceWed, 22 Aug 2007 14:52:00 GMT<p>Blogger was down this morning from a little after 9:30 until a few minutes ago, but now, all is well...</p> <p><img src="https://lh4.google.com/timothy.broder/RsxMBZE6BPI/AAAAAAAAKns/34s5L2TNEj0/s400/blogger_down1.jpg?imgdl=1" alt=""></p> <p><img src="https://lh5.google.com/timothy.broder/RsxMBpE6BQI/AAAAAAAAKn0/1OuOzxtuga0/s400/blogger_down2.jpg?imgdl=1" alt=""></p><![CDATA[Google Web Toolkit 1.4 Release Candidate 2]]>https://www.timbroder.com/2007/08/google-web-toolkit-14-release-candidatehttps://www.timbroder.com/2007/08/google-web-toolkit-14-release-candidateWed, 22 Aug 2007 03:47:00 GMT<p><a href="http://googlewebtoolkit.blogspot.com/2007/08/google-web-toolkit-14-release-candidate.html">Google Web Toolkit Blog: Google Web Toolkit 1.4 Release Candidate 2</a> Short post I know, but its getting late and I'm off call at midnight so...</p> <p>The latest release candidate for GWT is available for <a href="http://code.google.com/webtoolkit/download.html#rc">download</a>. There are over 100 bug fixes included in this RC. Some of the enhancements include:</p> <ul> <li>ArrayList toArray(SomeClass[]) is now implemented</li> <li>SuggestBox value now gettable</li> <li>DateTimeFormat parse defaults to 00:00:00 for dd-MM-yyyy format</li> <li>The current browser event is globally accessible</li> </ul><![CDATA[Google Mashup Editor Blog: New Tutorial: Using Picasa Web Album Feeds in GME]]>https://www.timbroder.com/2007/08/google-mashup-editor-blog-new-tutorialhttps://www.timbroder.com/2007/08/google-mashup-editor-blog-new-tutorialWed, 22 Aug 2007 03:34:00 GMT<p>The guys over on the Mashup team have posted a <a href="http://code.google.com/support/bin/answer.py?answer=74728&#x26;topic=12044">new tutorial</a> on how to use the Google Mashup Editor to mash Picasa Web Albums with a Google Map. The example is <a href="http://levsplaces.googlemashups.com/">here</a>. I started working on my own but I haven't really played with the GME before. Hopefully I'll have that tomorrow.</p><![CDATA[Gadgets now on Google Calendar!]]>https://www.timbroder.com/2007/08/gadgets-now-on-google-calendarhttps://www.timbroder.com/2007/08/gadgets-now-on-google-calendarWed, 22 Aug 2007 02:52:00 GMT<p>Google Gadgets can now be added to your calendar. Previously the only gadgets I had on my calendar were Google Doodles, Weather, phases of the moon, and PicasaWeb Photo of the day. Now just about anything is going to be possible. I briefly played around with it this morning and added horoscopes and Sudoku to my calendar.</p> <p><img src="https://lh5.google.com/timothy.broder/RsukR5E6BOI/AAAAAAAAKm4/QFkA3ZwVJ_M/s400/cal_gadgets.jpg?imgdl=1" alt=""></p> <p>Other new gadgets include Movie Release dates and famous people's birthdays. I expect that very soon there will be video game releases as well. <a href="http://code.google.com/apis/calendar/calendar_gadgets.html">Documentation</a> is out for the gadgets, so get coding!</p><![CDATA[C'mon Google! Get in Gear!!]]>https://www.timbroder.com/2007/08/google-get-in-gearhttps://www.timbroder.com/2007/08/google-get-in-gearWed, 22 Aug 2007 02:34:00 GMT<p>As of this morning (or at least sometime before lunch), <a href="http://writer.zoho.com/index.do">Zoho Writer</a> turned on offline mode with Google Gears. If you haven't heard about Gears yet is a small application (and framework for developers) to enable Ajax applications to go offline. It uses a very small local server and database to grab all the data you would need should the application go offline (this has to be set up by the developers of the application). There is a great podcast about it [here](<a href="http://google-code-">http://google-code-</a> updates.blogspot.com/2007/06/google-developer-podcast-episode-three.html) from the Google Developer Podcast. The first Google product to use it was Google Reader which I though was pretty nifty. Before you go on a trip, just hit "Go Offline" and it will download all of your unread posts... get on the plane and shazam, all your reading to keep you busy.</p> <p>Zoho currently only supports offline read which I assume means Gears will grab all of your documents and you can read them over. Zoho says they will be adding read/write functionality in 3-4 weeks.</p> <p>I must say though, I'm very disappointed that Google got beat to having this in Docs and Spreadsheets first. I'm sure it would help a great deal with the Google Office Hacks <a href="http://blogoscoped.com/archive/2007-08-08-n90.html">book</a> that Philipp Lenssen is writing. C'mon Google, GET IN GEAR(S)!!</p> <p><img src="https://lh6.google.com/timothy.broder/RsugnJE6BMI/AAAAAAAAKmo/W349O0lJ6LU/s400/zoho_gears1.jpg?imgdl=1" alt=""></p> <p><img src="https://lh3.google.com/timothy.broder/RsugnZE6BNI/AAAAAAAAKmw/ts_cV14F9LI/s400/zoho_gears2.jpg?imgdl=1" alt=""></p><![CDATA[My current fav Google Map Mashups]]>https://www.timbroder.com/2007/08/my-current-fav-google-map-mashupshttps://www.timbroder.com/2007/08/my-current-fav-google-map-mashupsSat, 18 Aug 2007 23:18:00 GMT<p>These are some sites I've found since people have started making Google Map Mashups either because they are really cool or I use them a lot.</p> <p><a href="http://www.bittrees.com/diggmap/">DiggMap</a> - Diggs are shown in real-time on the map for users that have specified their location in their profile.</p> <p><a href="http://www.wotton.org/map/batchgeo.html">Google Maps Batch Geocoder</a></p> <p><a href="http://www.google.com/maps/ms?msa=0&#x26;msid=112255436550398488662.00000111d25a08716efa7">Google Offices</a> - Shows Google Offices around the world</p> <p><a href="http://traffic.poly9.com/">Traffic and Weather Maps</a> - Mashes Traffic conditions, road closings, construction, and weather. Not too useful to me as I don't have a car anymore but it was when I did ;)</p> <p><a href="http://map.talleye.com/">Walk in a straight line around the world!</a> - Pick a spot on the map, then the direction you want to walk in, and the map will show you all the places you would hit if you walked around the world!</p> <p><a href="http://www.gypsymaps.com/">GypsyMaps</a> - My all time favorite. Gives Directions with the NYC subway system. I like it a lot better then <a href="http://www.hopstop.com">hopstop</a>, it just seems more responsive</p> <p><a href="http://www.walkscore.com">Walk Score</a> - Put in where you live and find all the walkable places near you. Great for living in a City and you don't have a car.</p> <p><a href="http://www.google.com/apis/maps/documentation/index.html">Google Maps API</a> - Not a map, but the starting resource for if you want to make a mashup</p> <p><a href="http://gmaps-samples.googlecode.com/svn/trunk/spreadsheetsmapwizard/makecustommap.htm">Google Maps with a spreadsheet</a> - Power a Google map from</p> <p><a href="http://streetviewr.com/">StreetViewr</a> - A collection of funny, interesting, random photos that people have found with <a href="http://maps.google.com/maps?f=q&#x26;hl=en&#x26;ie=UTF8&#x26;ll=37.09024,-95.712891&#x26;spn=47.167389,92.8125&#x26;z=4&#x26;om=1&#x26;layer=c&#x26;utm_campaign=en&#x26;utm_source=en-ha-na-us-google-svn&#x26;utm_medium=ha">Google Street View</a></p> <p><a href="http://the-edu-map.com/">The EDU Map</a> - See places of education for a given city</p> <p><a href="http://www.walkjogrun.net/">Walk Jog Run</a> - Share routes with other runner's. I've found some new, less boring ones using this =)</p><![CDATA[Site Update: Post list and Links section]]>https://www.timbroder.com/2007/08/site-update-post-list-and-links-sectionhttps://www.timbroder.com/2007/08/site-update-post-list-and-links-sectionSat, 11 Aug 2007 21:43:00 GMT<p>I Added an easier way to go through the posts I'v put on <a href="https://gpowered.blogspot.com/">blogger</a> and the <a href="https://gpowered.net/g/">site</a>. Quick tutorial on it is <a href="http://blog.gpowered.net/2007/08/howto-getting-list-of-post-titles-from.html">here</a>.</p> <p>Also added a <a href="https://gpowered.net/links">Links</a> section that pull from my Google Bookmarks. HOWTO is <a href="http://blog.gpowered.net/2007/08/howto-pulling-google-bookmarks-with.html">here</a></p><![CDATA[HOWTO: Pulling Google Bookmarks with Python]]>https://www.timbroder.com/2007/08/howto-pulling-google-bookmarks-withhttps://www.timbroder.com/2007/08/howto-pulling-google-bookmarks-withSat, 11 Aug 2007 21:22:00 GMT<p>I love using <a href="http://www.google.com/bookmarks/">Google Bookmarks</a> (usually with the <a href="http://toolbar.google.com">Google Toolbar</a>) because it lets me get to my bookmarks at home on my laptop or desktop, at work, or anywhere. It's great. Now I'm using those bookmarks to power the <a href="https://gpowered.net/g/links/">links</a> section of <a href="https://gpowered.net/g">gPowered.net</a><br> First we're going to need the <a href="http://code.google.com/p/httplib2/downloads/list">httplib2</a> library so we can authenticate against Google and grab the bookmark feed and then the <a href="http://effbot.org/zone/element-index.htm">ElementTree</a> to help process the rss feed.</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">import httplib2 from elementtree import ElementTree</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span></span></pre></div> <p>Then we'll setup the link to pull the rss from, authenticate against the request, and pull back the feed</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">login = "timothy.broder@gmail.com" password = "*****" url = 'https://www.google.com/bookmarks/?output=rss&amp;num;=1000' h = httplib2.Http() h.add_credentials(login, password) resp, content = h.request(url, "POST", body="nt", headers={'content-type':'text/plain'} )</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>I figured for this a hashmap (or dictionary) would work well using the tags on the bookmarks as keys, pointing to lists of bookmarks. Then when we display them, just iterate through the keys. I also kept a list of the keys to make sorting faster later on. So we define our objects and then loop through the rss object pulling out the tags for keys, the names of the links, and the urls. I define a small Bookmark class which holds a name and url which will go into the hashmap to make storing the bookmark's easier. When I try to add a bookmark to the dict's list I try to append it, if the key(tag) doesn't exist I know I have to start a new list.</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">class Bookmark: def __init__(self, name, link): self.name = name self.link = link d = dict() sort_keys = [] for item in tree.findall('item'): key = item.findtext('{http://www.google.com/searchhistory}bkmk_label') if (key != None) and (key != 'gpowered') and (key != 'BP') and (key != 'Quick Searches') and (key != 'Me'): title = item.findtext('title') link = item.findtext('link') try: d[key].append(Bookmark(title.encode('utf-8'), link)) except KeyError: d[key] = [Bookmark(title.encode('utf-8'), link)] sort_keys.append(key)</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Then we'll sort the key list and the list of each key. To do this we need a small function that defines how to sort a bookmark</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">def bookmark_compare(a, b): return cmp(a.name, b.name) sort_keys.sort() for key in sort_keys: d[key].sort(bookmark_compare)</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Check out the static HTML version <a href="https://gpowered.net/g/links/simple">Here</a>. I also made a <a href="https://gpowered.net/g/links/">fancier version</a> using <a href="http://developer.yahoo.com/yui/">YUI</a>'s <a href="http://developer.yahoo.com/yui/treeview/">TreeView</a></p><![CDATA[HOWTO: Getting a list of post titles from blogger (Python)]]>https://www.timbroder.com/2007/08/howto-getting-list-of-post-titles-fromhttps://www.timbroder.com/2007/08/howto-getting-list-of-post-titles-fromSat, 11 Aug 2007 18:25:00 GMT<p>This will be a quick one on how to pull the titles from your blog. I'm using it to <a href="https://gpowered.net/g/postlist">Lists the posts</a> I have available on <a href="https://gpowered.net/g/">gPowered.net</a>. Firstly we'll set up our imports and call to the blogger service.</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token keyword">from</span> elementtree <span class="token keyword">import</span> ElementTree <span class="token keyword">from</span> gdata <span class="token keyword">import</span> service <span class="token keyword">import</span> gdata <span class="token keyword">import</span> atom <span class="token keyword">import</span> getopt <span class="token keyword">import</span> sys blog_id <span class="token operator">=</span> <span class="token number">413573351281770670</span> blogger_service <span class="token operator">=</span> service<span class="token punctuation">.</span>GDataService<span class="token punctuation">(</span><span class="token string">'timothy.broder@gmail.com'</span><span class="token punctuation">,</span> <span class="token string">'*****'</span><span class="token punctuation">)</span> blogger_service<span class="token punctuation">.</span>source <span class="token operator">=</span> <span class="token string">'Blogger_Python_Sample-1.0'</span> blogger_service<span class="token punctuation">.</span>service <span class="token operator">=</span> <span class="token string">'blogger'</span> blogger_service<span class="token punctuation">.</span>server <span class="token operator">=</span> <span class="token string">'www.blogger.com'</span> blogger_service<span class="token punctuation">.</span>ProgrammaticLogin<span class="token punctuation">(</span><span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>For this query we're going to use the summary feed because all we really need for this is the titles, not the full posts:</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python">query <span class="token operator">=</span> service<span class="token punctuation">.</span>Query<span class="token punctuation">(</span><span class="token punctuation">)</span> query<span class="token punctuation">.</span>feed <span class="token operator">=</span> <span class="token string">'/feeds/'</span> <span class="token operator">+</span> <span class="token builtin">str</span><span class="token punctuation">(</span>blog_id<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">'/posts/summary'</span> feed <span class="token operator">=</span> blogger_service<span class="token punctuation">.</span>Get<span class="token punctuation">(</span>query<span class="token punctuation">.</span>ToUri<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span></span></pre></div> <p>Then I just do a little counting so I can use the links on my site. All the information we need is in feed.entry</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python">curr_id <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span>feed<span class="token punctuation">.</span>total_results<span class="token punctuation">.</span>text<span class="token punctuation">)</span> <span class="token keyword">for</span> entry <span class="token keyword">in</span> feed<span class="token punctuation">.</span>entry<span class="token punctuation">:</span> entry<span class="token punctuation">.</span>my_id <span class="token operator">=</span> curr_id curr_id <span class="token operator">-=</span> <span class="token number">1</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[Quick Docs Api Example (python)]]>https://www.timbroder.com/2007/08/quick-docs-api-example-pythonhttps://www.timbroder.com/2007/08/quick-docs-api-example-pythonFri, 10 Aug 2007 03:04:00 GMT<p>To use the gdata docs python client you need to upgrade to <a href="http://code.google.com/p/gdata-python-client/downloads/list">1.0.7</a> or higher. First thing is to import the modules you'll need.</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token keyword">import</span> gdata<span class="token punctuation">.</span>docs<span class="token punctuation">.</span>service <span class="token keyword">import</span> gdata<span class="token punctuation">.</span>docs</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span></span></pre></div> <p>Then, set up the usual authentication parameters for the client.</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python">gd_client <span class="token operator">=</span> gdata<span class="token punctuation">.</span>docs<span class="token punctuation">.</span>service<span class="token punctuation">.</span>DocsService<span class="token punctuation">(</span><span class="token punctuation">)</span> gd_client<span class="token punctuation">.</span>email <span class="token operator">=</span> <span class="token string">'timothy.broder'</span> gd_client<span class="token punctuation">.</span>password <span class="token operator">=</span> <span class="token string">'*****'</span> gd_client<span class="token punctuation">.</span>source <span class="token operator">=</span> <span class="token string">'gpowered-docs-list-ex'</span> gd_client<span class="token punctuation">.</span>ProgrammaticLogin<span class="token punctuation">(</span><span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>The most basic query will just return all of your documents</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python">feed <span class="token operator">=</span> gd_client<span class="token punctuation">.</span>GetDocumentListFeed<span class="token punctuation">(</span><span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <p>However, if we want to display just the spreadsheets, we build the query like this:</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python">q <span class="token operator">=</span> gdata<span class="token punctuation">.</span>docs<span class="token punctuation">.</span>service<span class="token punctuation">.</span>DocumentQuery<span class="token punctuation">(</span>categories<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">'spreadsheet'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> feed <span class="token operator">=</span> gd_client<span class="token punctuation">.</span>Query<span class="token punctuation">(</span>q<span class="token punctuation">.</span>ToUri<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span></span></pre></div> <p>Finally, we output the titles</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token keyword">if</span><span class="token punctuation">(</span><span class="token builtin">len</span><span class="token punctuation">(</span>feed<span class="token punctuation">.</span>entry<span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">print</span> <span class="token string">'No entries in feed.\n'</span> <span class="token keyword">for</span> i<span class="token punctuation">,</span> entry <span class="token keyword">in</span> <span class="token builtin">enumerate</span><span class="token punctuation">(</span>feed<span class="token punctuation">.</span>entry<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">print</span> <span class="token string">'%s %s (%s)'</span> <span class="token operator">%</span> <span class="token punctuation">(</span>i<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">,</span> entry<span class="token punctuation">.</span>title<span class="token punctuation">.</span>text<span class="token punctuation">.</span>encode<span class="token punctuation">(</span><span class="token string">'UTF-8'</span><span class="token punctuation">)</span><span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span></span></pre></div> <p>If we wanted to, we could also import the DateTime library and show when the document was last updated</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"><span class="token keyword">import</span> gdata<span class="token punctuation">.</span>docs<span class="token punctuation">.</span>service <span class="token keyword">import</span> gdata<span class="token punctuation">.</span>docs <span class="token keyword">from</span> mx <span class="token keyword">import</span> DateTime gd_client <span class="token operator">=</span> gdata<span class="token punctuation">.</span>docs<span class="token punctuation">.</span>service<span class="token punctuation">.</span>DocsService<span class="token punctuation">(</span><span class="token punctuation">)</span> gd_client<span class="token punctuation">.</span>email <span class="token operator">=</span> <span class="token string">'timothy.broder'</span> gd_client<span class="token punctuation">.</span>password <span class="token operator">=</span> <span class="token string">'*****'</span> gd_client<span class="token punctuation">.</span>source <span class="token operator">=</span> <span class="token string">'gpowered-docs-list-ex'</span> gd_client<span class="token punctuation">.</span>ProgrammaticLogin<span class="token punctuation">(</span><span class="token punctuation">)</span> q <span class="token operator">=</span> gdata<span class="token punctuation">.</span>docs<span class="token punctuation">.</span>service<span class="token punctuation">.</span>DocumentQuery<span class="token punctuation">(</span>categories<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">'spreadsheet'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token comment">#feed = gd_client.GetDocumentListFeed()</span> feed <span class="token operator">=</span> gd_client<span class="token punctuation">.</span>Query<span class="token punctuation">(</span>q<span class="token punctuation">.</span>ToUri<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token builtin">len</span><span class="token punctuation">(</span>feed<span class="token punctuation">.</span>entry<span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">print</span> <span class="token string">'No entries in feed.\n'</span> <span class="token keyword">for</span> i<span class="token punctuation">,</span> entry <span class="token keyword">in</span> <span class="token builtin">enumerate</span><span class="token punctuation">(</span>feed<span class="token punctuation">.</span>entry<span class="token punctuation">)</span><span class="token punctuation">:</span> dt <span class="token operator">=</span> DateTime<span class="token punctuation">.</span>ISO<span class="token punctuation">.</span>ParseDateTimeUTC<span class="token punctuation">(</span>entry<span class="token punctuation">.</span>updated<span class="token punctuation">.</span>text<span class="token punctuation">)</span> <span class="token keyword">print</span> <span class="token string">'%s %s (%s)'</span> <span class="token operator">%</span> <span class="token punctuation">(</span>i<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">,</span> entry<span class="token punctuation">.</span>title<span class="token punctuation">.</span>text<span class="token punctuation">.</span>encode<span class="token punctuation">(</span><span class="token string">'UTF-8'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> dt<span class="token punctuation">.</span>strftime<span class="token punctuation">(</span><span class="token string">'%m/%d/%Y %I:%M %p'</span><span class="token punctuation">)</span><span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>For me this outputs:</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">1 TDP2006 Contact Info (11/18/2006 05:41 AM) 2 contact info (07/23/2006 08:15 PM) 3 Tim and Rob (08/09/2007 10:18 PM) 4 nyc happy hour spreadsheet (07/04/2007 08:25 PM) 5 public_spring_2006_roster (10/16/2006 12:40 AM) 6 dax2006 (11/12/2006 11:23 PM) 7 project dream (07/13/2007 03:54 AM) 8 Stuff Tim should get (06/13/2007 01:53 AM) 9 Erg Test Results - 9/26 (10/15/2006 01:02 AM) 10 Head of the Charles Regatta Itineary (10/17/2006 04:54 PM) 11 tvshows (11/02/2006 11:44 PM) 12 HF (10/01/2006 03:36 PM)</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[New Documents List API]]>https://www.timbroder.com/2007/08/new-documents-list-apihttps://www.timbroder.com/2007/08/new-documents-list-apiMon, 06 Aug 2007 23:46:00 GMT<p><a href="http://googledataapis.blogspot.com/2007/08/new-api-it-slices-it-dices-it-uploads.html">Google Data API posts</a> now you can import your spreadsheets and word processor documents into <a href="http://docs.google.com/">Google Documents</a> using the new Documents List API.</p> <p>Until I write up a tutorial, check out the <a href="http://code.google.com/apis/documents/developers_guide_protocol.html">Documents List API</a></p><![CDATA[Posting to Blogger from Google Docs & Spreadsheets]]>https://www.timbroder.com/2007/08/posting-to-blogger-from-google-docshttps://www.timbroder.com/2007/08/posting-to-blogger-from-google-docsMon, 06 Aug 2007 01:17:00 GMT<p>I had seen some posts in the past (like <a href="http://websquirrel.blogspot.com/2006/11/post-google-docs-spreadsheetsto-your.html" title="this one">this one</a>) and figured I would give it a try. The first thing I liked was it feels a lot less cramped then the traditional blogger interface. Secondly it feels more responsive which for me is pretty good for me as I'm on a 6 year old laptop a lot of the time. Tagging is a little harder. You can tag existing tags in blogger but I found it easier to post from Docs &#x26; Spreadsheets and then go back into the Blogger interface to tag. Blogger picks up the post title from the title of the document, but you have to go back in to add the link for the title. Check it out, it might be better for you then the traditional interface.</p> <p>I published this from Docs and Spreadsheets. Check out the doc <a href="http://docs.google.com/Doc?id=dgvz8bxz_18dpvcrf">here</a></p><![CDATA[HOWTO: Displaying Blogger feeds with PHP]]>https://www.timbroder.com/2007/08/howto-displaying-blogger-feeds-with-phphttps://www.timbroder.com/2007/08/howto-displaying-blogger-feeds-with-phpSun, 05 Aug 2007 22:44:00 GMT<p>This HOWTO is going to follow the basic structure of the <a href="https://gpowered.net/g/post/2/">Python</a> one.</p> <p>To start out you'll have to grab the <a href="http://framework.zend.com/download/gdata">Zend Google data Client Library</a> and then set the include_path so you can use it</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token function">ini_set</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"include_path"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">".:../:./include:../include:/home/gpowered/webapps/php/includes/ZendGdata-1.0.1/library"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> <p>We then import the parts the we'll need:</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token keyword">require_once</span> <span class="token string single-quoted-string">'Zend/Loader.php'</span><span class="token punctuation">;</span> <span class="token class-name static-context">Zend_Loader</span><span class="token operator">::</span><span class="token function">loadClass</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Zend_Gdata'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name static-context">Zend_Loader</span><span class="token operator">::</span><span class="token function">loadClass</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Zend_Gdata_Query'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name static-context">Zend_Loader</span><span class="token operator">::</span><span class="token function">loadClass</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Zend_Gdata_ClientLogin'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span></span></pre></div> <p>One of the first things we're going to have to do is authenticate with google services. There are two ways to do this: <a href="http://code.google.com/apis/blogger/developers_guide_php.html#auth_sub">AuthSub proxy authentication</a> which has a user login using their own credentials, and <a href="http://code.google.com/apis/blogger/developers_guide_php.html#client_login"> ClientLogin username/password au thentication</a> where you send a username and password. We will be using ClientLogin. I built a small class called gPoweredBlogger to hold the different parts I will need for this example.</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">gPoweredBlogger</span><span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token variable">$user</span><span class="token punctuation">;</span><span class="token comment">// = 'timothy.broder';</span> <span class="token keyword">private</span> <span class="token variable">$pass</span><span class="token punctuation">;</span><span class="token comment">// = '**************';</span> <span class="token keyword">private</span> <span class="token variable">$service</span><span class="token punctuation">;</span><span class="token comment">// = 'blogger';</span> <span class="token keyword">private</span> <span class="token variable">$blog_id</span><span class="token punctuation">;</span><span class="token comment">// = '413573351281770670';</span> <span class="token keyword">private</span> <span class="token variable">$uri</span><span class="token punctuation">;</span><span class="token comment">// = "http://www.blogger.com/feeds/" . $blog_id . "/posts/default";</span> <span class="token keyword">private</span> <span class="token variable">$show_num</span><span class="token punctuation">;</span><span class="token comment">// = 5;</span> <span class="token keyword">private</span> <span class="token variable">$client</span><span class="token punctuation">;</span><span class="token comment">// = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);</span> <span class="token keyword">private</span> <span class="token variable">$gdClient</span><span class="token punctuation">;</span><span class="token comment">// = new Zend_Gdata($client);</span> <span class="token keyword">private</span> <span class="token variable">$query</span><span class="token punctuation">;</span><span class="token comment">// = new Zend_Gdata_Query($uri);</span> <span class="token keyword">private</span> <span class="token variable">$total_posts</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token variable">$output</span><span class="token punctuation">;</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Then we start setting up our call to the service.</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$user</span><span class="token punctuation">,</span> <span class="token variable">$pass</span><span class="token punctuation">,</span> <span class="token variable">$blog_id</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">user</span> <span class="token operator">=</span> <span class="token variable">$user</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">pass</span> <span class="token operator">=</span> <span class="token variable">$pass</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">service</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'blogger'</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">blog_id</span> <span class="token operator">=</span> <span class="token variable">$blog_id</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">uri</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"http://www.blogger.com/feeds/"</span> <span class="token operator">.</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">blog_id</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"/posts/default"</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">show_num</span> <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">client</span> <span class="token operator">=</span> <span class="token class-name static-context">Zend_Gdata_ClientLogin</span><span class="token operator">::</span><span class="token function">getHttpClient</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">user</span><span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">pass</span><span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">service</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">gdClient</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Zend_Gdata</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">client</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">query</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Zend_Gdata_Query</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">uri</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">total_posts</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">get_total</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">query</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>For more info see the <a href="http://code.google.com/apis/blogger/developers_guide_php.html">blogger developer's guide with php</a> or the <a href="http://code.google.com/apis/accounts/Authentication.html">Google Account Authentication documentation</a><br> After we have authenticated with Google we need to start building up our query to <a href="http://code.google.com/apis/gdata/">GData</a>. The first thing you'll need is your blog's id.<br> You can use the function in the dev guide to help you with this if you don't already know it.<br> Like the Python version, the below function returns the total number of posts that are in the feed. We can get a small response by sending 0 for the max results. Below is the function and the small response we get from it.</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">get_total</span><span class="token punctuation">(</span><span class="token variable">$query</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment">//query for no posts</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">query</span><span class="token operator">-></span><span class="token function">setParam</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'max-results'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'0'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">query</span><span class="token operator">-></span><span class="token function">setParam</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'start-index'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'1'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//get back entryless feed</span> <span class="token variable">$feed</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">gdClient</span><span class="token operator">-></span><span class="token function">getFeed</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">query</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$feed</span><span class="token operator">-></span><span class="token property">totalResults</span><span class="token operator">-></span><span class="token property">text</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <div class="gatsby-highlight" data-language="xml"><pre style="counter-reset: linenumber NaN" class="language-xml line-numbers"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns0:</span>feed</span> <span class="token attr-name"><span class="token namespace">xmlns:</span>ns0</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.w3.org/2005/Atom<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns1:</span>totalresults</span> <span class="token attr-name"><span class="token namespace">xmlns:</span>ns1</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://a9.com/-/spec/opensearchrss/1.0/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>5<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">ns1:</span>totalresults</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns1:</span>itemsperpage</span> <span class="token attr-name"><span class="token namespace">xmlns:</span>ns1</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://a9.com/-/spec/opensearchrss/1.0/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>0<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">ns1:</span>itemsperpage</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns1:</span>startindex</span> <span class="token attr-name"><span class="token namespace">xmlns:</span>ns1</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://a9.com/-/spec/opensearchrss/1.0/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>1<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">ns1:</span>startindex</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns0:</span>generator</span> <span class="token attr-name">uri</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.blogger.com<span class="token punctuation">"</span></span> <span class="token attr-name">version</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>7.00<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Blogger<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">ns0:</span>generator</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns0:</span>author</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns0:</span>name</span><span class="token punctuation">></span></span>Tim<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">ns0:</span>name</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">ns0:</span>author</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns0:</span>id</span><span class="token punctuation">></span></span>tag:blogger.com,1999:blog-413573351281770670<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">ns0:</span>id</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns0:</span>link</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://gpowered.blogspot.com/<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>alternate<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text/html<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns0:</span>link</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://gpowered.blogspot.com/feeds/posts/default<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://schemas.google.com/g/2005#feed<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>application/atom+xml<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns0:</span>link</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.blogger.com/feeds/413573351281770670/posts/default?max-results=0<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>self<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>application/atom+xml<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns0:</span>link</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.blogger.com/feeds/413573351281770670/posts/default<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://schemas.google.com/g/2005#post<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>application/atom+xml<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns0:</span>title</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>gPowered<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">ns0:</span>title</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns0:</span>updated</span><span class="token punctuation">></span></span>2007-07-18T10:55:06.728-05:00<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">ns0:</span>updated</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">ns0:</span>feed</span><span class="token punctuation">></span></span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>So we get the total number of posts and then we can start pulling data. Lets make a generic function, PostFrom, that can be used to show multiple posts, or just single ones, depending on what you pass to it. The start number that is passed to PostFrom has been set to the first post in the blog is considered to have an id of 1 and the latest post is the same as total_posts. This is useful so if viewers want to bookmark the page they are looking at, the post that is being displayed will not change. The following are the different functions that will make use of it.</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token comment">//show latest posts</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">Posts</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">ListPosts</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">total_posts</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">//show posts starting from a certain point</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">ListPosts</span><span class="token punctuation">(</span><span class="token variable">$start</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token variable">$start</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">total_posts</span> <span class="token operator">-</span> <span class="token variable">$start</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">PostFrom</span><span class="token punctuation">(</span><span class="token variable">$start</span><span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">show_num</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">//show a single post</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">Post</span><span class="token punctuation">(</span><span class="token variable">$start</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token variable">$start</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">total_posts</span> <span class="token operator">-</span> <span class="token variable">$start</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token function">PostFrom</span><span class="token punctuation">(</span><span class="token variable">$start</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">//show count number of posts starting from a certain point</span> <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">PostFrom</span><span class="token punctuation">(</span><span class="token variable">$start</span><span class="token punctuation">,</span> <span class="token variable">$count</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment">//query for count number of posts starting at the given post</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">query</span><span class="token operator">-></span><span class="token function">setParam</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'max-results'</span><span class="token punctuation">,</span> <span class="token variable">$count</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">query</span><span class="token operator">-></span><span class="token function">setParam</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'start-index'</span><span class="token punctuation">,</span> <span class="token variable">$start</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$feed</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">gdClient</span><span class="token operator">-></span><span class="token function">getFeed</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">query</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Now we have all the data we need in the feed variable. Its been turned into an object so we don't have to worry about XML parsing here. Every node has become an objects and lists. Objects for single nodes(title), and lists for where there are multiple nodes of the same name (entry, link)</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token comment">//for links</span> <span class="token variable">$curr_id</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">total_posts</span> <span class="token operator">-</span> <span class="token variable">$start</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token comment">//normalize data for output</span> <span class="token keyword">foreach</span><span class="token punctuation">(</span><span class="token variable">$feed</span><span class="token operator">-></span><span class="token property">entries</span> <span class="token keyword">as</span> <span class="token variable">$entry</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment">//id for links</span> <span class="token variable">$entry</span><span class="token operator">-></span><span class="token property">my_id</span> <span class="token operator">=</span> <span class="token variable">$curr_id</span><span class="token punctuation">;</span> <span class="token variable">$curr_id</span> <span class="token operator">-=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Of course we're going to need next and previous buttons as well. The way we've set up the math with total_posts and the start number, we only have to increment or decrement these by count (the number of posts to display on a page). I also set part of the link, as well as the page title, that I will use below in the HTML.</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token variable">$prev</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">total_posts</span> <span class="token operator">-</span> <span class="token punctuation">(</span><span class="token variable">$start</span> <span class="token operator">-</span> <span class="token variable">$count</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$prev</span> <span class="token operator">></span> <span class="token variable">$total_posts</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token variable">$prev</span> <span class="token operator">=</span> <span class="token constant">null</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$next</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">total_posts</span> <span class="token operator">-</span> <span class="token punctuation">(</span><span class="token variable">$start</span> <span class="token operator">+</span> <span class="token variable">$count</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$next</span> <span class="token operator">&lt;</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token variable">$next</span> <span class="token operator">=</span> <span class="token constant">null</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">//showing single post</span> <span class="token keyword">if</span><span class="token punctuation">(</span>count <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token variable">$link</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'post'</span><span class="token punctuation">;</span> <span class="token variable">$title</span> <span class="token operator">=</span> <span class="token variable">$feed</span><span class="token operator">-></span><span class="token property">entries</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">title</span><span class="token operator">-></span><span class="token property">text</span><span class="token punctuation">;</span> <span class="token comment">//listing posts</span> <span class="token punctuation">}</span> <span class="token keyword">else</span><span class="token punctuation">{</span> <span class="token variable">$link</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'posts'</span><span class="token punctuation">;</span> <span class="token variable">$title</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'home'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>The final part is to make a quick object that we can use in the HTML to output everything</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">output</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Output</span><span class="token punctuation">(</span><span class="token variable">$feed</span><span class="token operator">-></span><span class="token property">entries</span><span class="token punctuation">,</span> <span class="token variable">$title</span><span class="token punctuation">,</span> <span class="token variable">$prev</span><span class="token punctuation">,</span> <span class="token variable">$next</span><span class="token punctuation">,</span> <span class="token variable">$link</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">Output</span><span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token variable">$entries</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token variable">$title</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token variable">$prev</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token variable">$next</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token variable">$link</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$entries</span><span class="token punctuation">,</span> <span class="token variable">$title</span><span class="token punctuation">,</span> <span class="token variable">$prev</span><span class="token punctuation">,</span> <span class="token variable">$next</span><span class="token punctuation">,</span> <span class="token variable">$link</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">entries</span><span class="token operator">=</span><span class="token variable">$entries</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">title</span><span class="token operator">=</span><span class="token variable">$title</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">prev</span><span class="token operator">=</span><span class="token variable">$prev</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">next</span><span class="token operator">=</span><span class="token variable">$next</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">link</span><span class="token operator">=</span><span class="token variable">$link</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>To the HTML!</p> <p>The first part consists of displaying the post itself, along with its relevant information. So lets built up our objects</p> <div class="gatsby-highlight" data-language="php"><pre style="counter-reset: linenumber NaN" class="language-php line-numbers"><code class="language-php"><span class="token variable">$blog</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">gPoweredBlogger</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'timothy.broder'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'*************'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'413573351281770670'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$blog</span><span class="token operator">-></span><span class="token function">Posts</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$output</span> <span class="token operator">=</span> <span class="token variable">$blog</span><span class="token operator">-></span><span class="token property">output</span><span class="token punctuation">;</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span></span></pre></div> <p>Below all the php we can run through out output object and display the posts</p> <div class="gatsby-highlight" data-language="html"><pre style="counter-reset: linenumber NaN" class="language-html line-numbers"><code class="language-html"><span class="token prolog">&lt;? foreach($output->entries as $entry){ ?></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h2</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/post/&lt;? echo $entry->my_id ?><span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token prolog">&lt;? echo $entry->title->text ?></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h2</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span> <span class="token prolog">&lt;? echo $entry->content->text; $datetime = strtotime(substr($entry->published, 0, 10) . ' ' . substr($entry->published, 11, 8 )); ?></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>Posted by <span class="token prolog">&lt;? echo $entry->author[0]->name->text ?></span> on <span class="token prolog">&lt;? echo date("m/d/Y",$datetime) ?></span> at <span class="token prolog">&lt;? echo date("g:i a",$datetime) ?></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>divider<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> <span class="token prolog">&lt;?}?></span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>That's all for now. A working example is <a href="https://gpowered.net/php/blogger.php">here</a></p><![CDATA[First Google Gadget]]>https://www.timbroder.com/2007/08/google-code-updates-google-developerhttps://www.timbroder.com/2007/08/google-code-updates-google-developerSat, 04 Aug 2007 22:48:00 GMT<p>After being inspired about Google Gadgets from the <a href="http://google-code-updates.blogspot.com/2007/07/google-developer-podcast-episode-five.html">Google Developer Podcast</a> I came up with one that my old <a href="http://www.rpicrew.com">crew team</a> can use. We have a shared google calendar that some of us use to keep track of races, meetings, etc. This gadget pulls and formats it nicely for the google IG or desktop.</p> <p><a href="http://fusion.google.com/add?moduleurl=http%3A//hosting.gmodules.com/ig/gadgets/file/109141966999504040851/RPICrewSchedule.xml"><img src="https://buttons.googlesyndication.com/fusion/add.gif" alt="Add to Google"></a></p> <p>Javascript code for the gadget:</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">```html &lt;style type="text/css"> div.exp{ padding: 0; margin: 0; } div.loc{ margin-left: 19px; } &lt;/style> &lt;script type="text/javascript"> &lt;!-- /** * Season info * * 0 Fall: Aug 26 - Nov 1 * 1 Winter Training: Nov 2 - March 1 * 2 Spring: March 2 - May 25 * 3 Summer: May 26 - Aug 25 **/ /** * Callback function for the GData json-in-script call * Inserts the supplied list of events into a div of a pre-defined name * * @param {json} root is the JSON-formatted content from GData */ function processRaces(root) { displayRaces(root.feed, 'races'); } //meow function displayRaces(feed, divId){ var now = new Date(); var season = getSeason(now); var events = document.getElementById(divId); //clear "Loading..." if (events.childNodes.length > 0){ events.removeChild(events.childNodes[0]); } //display season var d = document.createElement('div'); d.appendChild(document.createTextNode(getSeasonText(season))); events.appendChild(d); //loop races for (var i=0; i&lt;feed.entry.length; i++){ var entry = feed.entry[i]; var d = getDate(entry['gd$when'][0].startTime); if(isCurrSeason(now, d)){ var title = entry.title.$t; var desc = entry.content.$t; //set up image and clicking to expand var div = document.createElement('div'); div.className = 'exp'; var toggle = document.createElement('img'); toggle.src= 'http://timothy.broder.googlepages.com/p.jpg'; toggle.align = 'absmiddle'; toggle.id = i; toggle.onclick = function() {toggleDiv(this); } div.appendChild(toggle); div.appendChild(document.createTextNode(' ' + d.getMonth() + "/" + d.getDay() + ' - ')); // get the href to link to the event for(var j=0; j&lt;entry['link'].length; j++){ if (entry['link'][j]['type'] == 'text/html' &amp;&amp; entry['link'][j]['rel'] == 'alternate'){ var href = entry['link'][j]['href']; } } //we can link to the cal if (typeof href != 'undefined'){ var link = document.createElement('a'); link.href = href; link.target = '_blank'; link.appendChild(document.createTextNode(title)); div.appendChild(link); } else{ //shouldn't get here but just in case div.appendChild(document.createTextNode(title)); } div.appendChild(document.createElement('br')); events.appendChild(div); var where = entry['gd$where'][0].valueString; var tDiv = document.createElement('div'); //div that will be hidden initially tDiv.id ='id' + i; tDiv.style['display'] = 'none'; tDiv.className = 'loc'; events.appendChild(tDiv); if(desc != null &amp;&amp; desc != ""){ //we have a desc (should be the teams we're competing against) var dDiv = document.createElement('span'); dDiv.appendChild(document.createTextNode(desc + " ")); tDiv.appendChild(dDiv); } //the location field is populated (hidden at start) if(where != null &amp;&amp; where != ""){ //we have a location var it = document.createElement('i'); var map = document.createElement('a'); map.target = '_blank'; //link to location on google maps map.href = 'http://maps.google.com/maps?f=q&amp;hl;=en&amp;&amp;q;=' + spaceLink(entry['gd$where'][0].valueString); map.appendChild(document.createTextNode(entry['gd$where'][0].valueString)); it.appendChild(document.createTextNode(" (")); it.appendChild(map); it.appendChild(document.createTextNode(")")); tDiv.appendChild(it); } } } } //format the date a little function getDate(when){ var data = when.split("-"); return new Date(data[0], data[1], data[2]); } //return int representation of season function getSeason(d){ var month = d.getMonth(); var day = d.getDate(); var year = d.getFullYear(); var aug = new Date(year, 8, 25); var nov = new Date(year, 11, 1); var mar = new Date(year, 3, 1); var may = new Date(year, 5, 25); if(aug &lt; d &amp;&amp; d &lt;= nov) return 0; //fall else if(mar &lt; d &amp;&amp; d &lt;= may) return 2; //spring else if(may &lt; d &amp;&amp; d &lt;= aug) return 3; //summer else return 1; //winter } //figure out the current season function isCurrSeason(now, d){ currSeason = getSeason(now); season = getSeason(d); if(currSeason == season){ //same season yes if(now.getFullYear() == d.getFullYear()){ //same year also, match return true; } if(season == 1 &amp;&amp; (d.getFullYear() == now.getFullYear()-1)){ //diff year, prob winter return true; } } return false; } //return text for season function getSeasonText(season){ if(season == 0) return "Fall Season"; if(season == 1) return "Winter Training"; if(season == 2) return "Spring Season"; if(season == 3) return "Summer Season"; return "no season"; //really shouldn't get here } //if the div is hidden show it, if not, hide it function toggleDiv(where_id){ var div = document.getElementById('id' + where_id.id); var img = document.getElementById(where_id.id); if(div != null){ if(div.style.display != 'none'){ div.style.display = 'none'; img.src= 'http://timothy.broder.googlepages.com/p.jpg'; } else{ div.style.display = 'block'; img.src= 'http://timothy.broder.googlepages.com/m.jpg'; } } } //convert the location so it can be used in a link to google maps function spaceLink(name){ return name.replace(' ', ',+'); } //--> &lt;/script> &lt;div id="races">&lt;p>Loading...&lt;/p>&lt;/div> &lt;script type="text/javascript" src="http://www.google.com/calendar/feeds/rpicrew@gmail.com/public/full?alt=json-in-script&amp;callback;=processRaces&amp;orderby;=starttime&amp;singleevents;=true&amp;sortorder;=ascending&amp;start-min;=2007-01-01T00:00:00">&lt;/script></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text"> And the XML for the gadget </code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">&lt;?xml version="1.0" encoding="UTF-8"?> &lt;Module> &lt;ModulePrefs title="RPI Crew Schedule" title_url="https://gpowered.net" author="Tim Broder" height="150" width="250" author_email="timothy.broder@gmail.com" thumbnail="http://timothy.broder.googlepages.com/RPICrewScheduleThumb.jpg" description="RPI Crew Race Schedule, links to the RPICrew shared google calendar" author_photo="http://timothy.broder.googlepages.com/timothybrodersimpsons.png" author_location="NYC" author_affiliation="gPowered" author_link="http://www.gpowered.net" screenshot="http://timothy.broder.googlepages.com/RPICrewScheduleScreen.jpg" > &lt;Require feature="dynamic-height"/> &lt;Require feature="analytics"/> &lt;/ModulePrefs> &lt;Content type="html">&lt;![CDATA[ &lt;script> // Track this gadget using Google Analytics. _IG_Analytics("UA-793489-6", "/RPICrewScheduleG"); &lt;/script> &lt;style type="text/css"> div.exp{ padding: 0; margin: 0; } div.loc{ margin-left: 19px; } &lt;/style> &lt;script type="text/javascript"> &lt;!-- /** * Season info * * 0 Fall: Aug 26 - Nov 1 * 1 Winter Training: Nov 2 - March 1 * 2 Spring: March 2 - May 25 * 3 Summer: May 26 - Aug 25 **/ /** * Callback function for the GData json-in-script call * Inserts the supplied list of events into a div of a pre-defined name * * @param {json} root is the JSON-formatted content from GData */ function processRaces(root) { displayRaces(root.feed, 'races'); } //meow function displayRaces(feed, divId){ var now = new Date(); var season = getSeason(now); var events = document.getElementById(divId); //clear "Loading..." if (events.childNodes.length > 0){ events.removeChild(events.childNodes[0]); } //display season var d = document.createElement('div'); d.appendChild(document.createTextNode(getSeasonText(season))); events.appendChild(d); //loop races for (var i=0; i&lt;feed.entry.length; i++){ var entry = feed.entry[i]; var d = getDate(entry['gd$when'][0].startTime); if(isCurrSeason(now, d)){ var title = entry.title.$t; var desc = entry.content.$t; //set up image and clicking to expand var div = document.createElement('div'); div.className = 'exp'; var toggle = document.createElement('img'); toggle.src= 'http://timothy.broder.googlepages.com/p.jpg'; toggle.align = 'absmiddle'; toggle.id = i; toggle.onclick = function() {toggleDiv(this); } div.appendChild(toggle); div.appendChild(document.createTextNode(' ' + d.getMonth() + "/" + d.getDay() + ' - ')); // get the href to link to the event for(var j=0; j&lt;entry['link'].length; j++){ if (entry['link'][j]['type'] == 'text/html' &amp;&amp; entry['link'][j]['rel'] == 'alternate'){ var href = entry['link'][j]['href']; } } //we can link to the cal if (typeof href != 'undefined'){ var link = document.createElement('a'); link.href = href; link.target = '_blank'; link.appendChild(document.createTextNode(title)); div.appendChild(link); } else{ //shouldn't get here but just in case div.appendChild(document.createTextNode(title)); } div.appendChild(document.createElement('br')); events.appendChild(div); var where = entry['gd$where'][0].valueString; var tDiv = document.createElement('div'); //div that will be hidden initially tDiv.id ='id' + i; tDiv.style['display'] = 'none'; tDiv.className = 'loc'; events.appendChild(tDiv); if(desc != null &amp;&amp; desc != ""){ //we have a desc (should be the teams we're competing against) var dDiv = document.createElement('span'); dDiv.appendChild(document.createTextNode(desc + " ")); tDiv.appendChild(dDiv); } //the location field is populated (hidden at start) if(where != null &amp;&amp; where != ""){ //we have a location var it = document.createElement('i'); var map = document.createElement('a'); map.target = '_blank'; //link to location on google maps map.href = 'http://maps.google.com/maps?f=q&amp;hl;=en&amp;&amp;q;=' + spaceLink(entry['gd$where'][0].valueString); map.appendChild(document.createTextNode(entry['gd$where'][0].valueString)); it.appendChild(document.createTextNode(" (")); it.appendChild(map); it.appendChild(document.createTextNode(")")); tDiv.appendChild(it); } } } } //format the date a little function getDate(when){ var data = when.split("-"); return new Date(data[0], data[1], data[2]); } //return int representation of season function getSeason(d){ var month = d.getMonth(); var day = d.getDate(); var year = d.getFullYear(); var aug = new Date(year, 8, 25); var nov = new Date(year, 11, 1); var mar = new Date(year, 3, 1); var may = new Date(year, 5, 25); if(aug &lt; d &amp;&amp; d &lt;= nov) return 0; //fall else if(mar &lt; d &amp;&amp; d &lt;= may) return 2; //spring else if(may &lt; d &amp;&amp; d &lt;= aug) return 3; //summer else return 1; //winter } //figure out the current season function isCurrSeason(now, d){ currSeason = getSeason(now); season = getSeason(d); if(currSeason == season){ //same season yes if(now.getFullYear() == d.getFullYear()){ //same year also, match return true; } if(season == 1 &amp;&amp; (d.getFullYear() == now.getFullYear()-1)){ //diff year, prob winter return true; } } return false; } //return text for season function getSeasonText(season){ if(season == 0) return "Fall Season"; if(season == 1) return "Winter Training"; if(season == 2) return "Spring Season"; if(season == 3) return "Summer Season"; return "no season"; //really shouldn't get here } //if the div is hidden show it, if not, hide it function toggleDiv(where_id){ var div = document.getElementById('id' + where_id.id); var img = document.getElementById(where_id.id); if(div != null){ if(div.style.display != 'none'){ div.style.display = 'none'; img.src= 'http://timothy.broder.googlepages.com/p.jpg'; } else{ div.style.display = 'block'; img.src= 'http://timothy.broder.googlepages.com/m.jpg'; } } } //convert the location so it can be used in a link to google maps function spaceLink(name){ return name.replace(' ', ',+'); } //--> &lt;/script> &lt;div id="races">&lt;p>Loading...&lt;/p>&lt;/div> &lt;script type="text/javascript" src="http://www.google.com/calendar/feeds/rpicrew@gmail.com/public/full?alt=json-in-script&amp;callback;=processRaces&amp;orderby;=starttime&amp;singleevents;=true&amp;sortorder;=ascending&amp;start-min;=2007-01-01T00:00:00">&lt;/script> ]]>&lt;/Content> &lt;/Module> ```</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div><![CDATA[New Calendar API features]]>https://www.timbroder.com/2007/08/new-calendar-api-featureshttps://www.timbroder.com/2007/08/new-calendar-api-featuresFri, 03 Aug 2007 02:45:00 GMT<p><a href="http://googledataapis.blogspot.com/2007/07/create-calendars-with-google-calendar.html">Google Calendar API</a> posts new read and write features. They have added:</p> <ul> <li><a href="http://code.google.com/apis/calendar/developers_guide_protocol.html#ManagingCalendars">owncalendars</a>: contains the collection of calendars that a user 'owns'</li> <li><a href="http://code.google.com/apis/calendar/developers_guide_protocol.html#ManagingSubscriptions">allcalendars</a>: contains all the calendars that a user has access to</li> </ul> <p>Useful for listing all your calendars if you manage a lot of them, or changing their settings all at once (both features have read and write capabilities)</p><![CDATA[domain!]]>https://www.timbroder.com/2007/07/domainhttps://www.timbroder.com/2007/07/domainTue, 31 Jul 2007 01:31:00 GMT<p>The design and domain have been set up (actually I finished it a week or so ago but work's been keeping me pretty crazy). All my examples will be implemented on <a href="https://gpowered.net/g/">gPowered.net</a> as well as a copy of theses posts. Enjoy.</p><![CDATA[Picasa Web Api updates]]>https://www.timbroder.com/2007/07/picasa-web-api-updateshttps://www.timbroder.com/2007/07/picasa-web-api-updatesTue, 24 Jul 2007 02:17:00 GMT<p><a href="http://googledataapis.blogspot.com/2007/07/picasa-web-albums-adds-new-api-features.html">Google Data Api's</a> posted a few updates today, a few of which I've really been looking forward to; Community Search, Retrieving a user's recently uploaded photos, Retrieving recently added comments for a particular user, Searching a user's photos, Filtering by tag, Uploading non-JPEG photos, Downloading the original photo.</p> <p>(my fav) <strong>Downloading the original photo</strong>: You can now download the original photo, including all EXIF data. This is accomplished by retrieving the feed with the <code class="language-text">imgmax=d</code> query parameter and value This will return a feed where the <code class="language-text">media:content</code> elements reference the original downloadable image.</p> <p>It's nice not having to use a <a href="http://groups.google.com/group/Google-Picasa-Data-API/browse_thread/thread/6311fb3da0673228/a165e494fe1c1d9d#a165e494fe1c1d9d">backdoor </a> for this anymore</p><![CDATA[HOWTO: post code]]>https://www.timbroder.com/2007/07/howto-post-codehttps://www.timbroder.com/2007/07/howto-post-codeTue, 24 Jul 2007 01:52:00 GMT<p>Posting code is made quite easy by using <a href="http://code.google.com/p/syntaxhighlighter/">SyntaxHighlighter</a>. It's pretty easy to set up and works on any html sites, as well as <a href="http://www.blogger.com">blogger</a> and <a href="http://www.wordpress.org">wordpress</a>. I'll be using it heavily throughout these posts. 3 easy steps:</p> <ol> <li> <p>Include the SyntaxHighlighter.css file at the top of your page.</p> <div class="gatsby-highlight" data-language="html"><pre style="counter-reset: linenumber NaN" class="language-html line-numbers"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text/css<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/php/js/dp.SyntaxHighlighter/Styles/SyntaxHighlighter.css<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>link</span><span class="token punctuation">></span></span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span></span></pre></div> </li> <li> <p>At the bottom of the page, include the</p> </li> </ol> <p><a href="http://code.google.com/p/syntaxhighlighter/wiki/Brushes">brushes</a> and other js files you will need, as well as the function call to stylize the &#x3C;pre> tags:</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">```html &lt;script language="javascript" src="/php/js/dp.SyntaxHighlighter/Scripts/shCore.js">&lt;/script> &lt;script language="javascript" src="/php/js/dp.SyntaxHighlighter/Scripts/shBrushCSharp.js">&lt;/script> &lt;script language="javascript" src="/php/js/dp.SyntaxHighlighter/Scripts/shBrushXml.js">&lt;/script> &lt;script language="javascript" src="/php/js/dp.SyntaxHighlighter/Scripts/shBrushPython.js">&lt;/script> &lt;script language="javascript"> dp.SyntaxHighlighter.ClipboardSwf = '/flash/clipboard.swf'; dp.SyntaxHighlighter.HighlightAll('code'); &lt;/script> ```</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <ol> <li>Then, place the code you want in between these two steps using &#x3C;pre></li> </ol> <p>tags that the javascript will stylize</p> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text">```html &lt;pre name="code" class="html"> &lt;!-- code here --> &lt;/pre> &lt;pre name="code" class="python"> # code here &lt;/pre></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <div class="gatsby-highlight" data-language="text"><pre style="counter-reset: linenumber NaN" class="language-text line-numbers"><code class="language-text"></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"></span></pre></div><![CDATA[HOWTO: Displaying Blogger feeds with Python]]>https://www.timbroder.com/2007/07/howto-get-blogger-feeds-using-pythonhttps://www.timbroder.com/2007/07/howto-get-blogger-feeds-using-pythonThu, 19 Jul 2007 03:07:00 GMT<p>This first HOWTO is going to cover how I did the basic structure of the posts section of gPowered: pulling from blogger. The main functions we'll need are to show a range of posts, a single post, and a function to get the total number of posts that are in the blog. The reason I try to get the total number is so the different pages can be bookmarkable. When retrieving a GData feed from blogger. Entry 1 in the feed is going to be the newest post so there is no 'id' that is going to be static, so we'll do a little math to get a number we can later use as the id. I use Django to handle rendering the python to the browser. I probably won't get into other methods.</p> <p>To start out you'll have to grab the following modules.</p> <ul> <li> <p>the <a href="http://code.google.com/p/gdata-python-client/downloads/list">gdata python client</a></p> </li> <li> <p><a href="http://effbot.org/zone/element-index.htm">ElementTree</a></p> </li> <li> <p><a href="http://www.egenix.com/products/python/mxBase/mxDateTime/">mxDateTime</a> (I used this for date formatting)</p> </li> </ul> <p>We then import the parts the we'll need (you can ignore the Django part for your own methods):</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"> <span class="token keyword">from</span> Django<span class="token punctuation">.</span>shortcuts <span class="token keyword">import</span> render_to_response <span class="token keyword">from</span> gdata <span class="token keyword">import</span> service <span class="token keyword">import</span> gdata <span class="token keyword">import</span> atom <span class="token keyword">import</span> getopt <span class="token keyword">import</span> sys <span class="token keyword">from</span> mx <span class="token keyword">import</span> DateTime</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>One of the first things we're going to have to do is authenticate with google services. There are two ways to do this: <a href="http://code.google.com/apis/blogger/developers_guide_python.html#auth_sub">AuthSub proxy authentication</a> which has a user login using their own credentials, and <a href="http://code.google.com/apis/blogger/developers_guide_python.html#client_login"> ClientLogin username/password authentication</a> where you send a username and password. We will be using ClientLogin. First off, set your login credentials to use later.</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"> <span class="token comment">#login info</span> user <span class="token operator">=</span> <span class="token string">'timothy.broder@gmail.com'</span> password <span class="token operator">=</span> <span class="token string">'********'</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span></span></pre></div> <p>Then we start setting up our call to the service.</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"> <span class="token comment">#set up service</span> blogger_service <span class="token operator">=</span> service<span class="token punctuation">.</span>GDataService<span class="token punctuation">(</span>user<span class="token punctuation">,</span> password<span class="token punctuation">)</span> blogger_service<span class="token punctuation">.</span>source <span class="token operator">=</span> <span class="token string">'gpowered'</span> blogger_service<span class="token punctuation">.</span>service <span class="token operator">=</span> <span class="token string">'blogger'</span> blogger_service<span class="token punctuation">.</span>server <span class="token operator">=</span> <span class="token string">'www.blogger.com'</span> blogger_service<span class="token punctuation">.</span>ProgrammaticLogin<span class="token punctuation">(</span><span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>For more info see the <a href="http://code.google.com/apis/blogger/developers_guide_python.html">blogger developer's guide with python</a> or the <a href="http://code.google.com/apis/accounts/Authentication.html">Google Account Authentication documentation</a></p> <p>After we have authenticated with Google we need to start building up our query to <a href="http://code.google.com/apis/gdata/">GData</a>, which will return as an ElementTree of data. The first thing you'll need is your blog's id.</p> <p>You can use the function in the dev guide to help you with this if you don't already know it.</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"> <span class="token keyword">def</span> <span class="token function">PrintUserBlogTitles</span><span class="token punctuation">(</span>blogger_service<span class="token punctuation">)</span><span class="token punctuation">:</span> query <span class="token operator">=</span> service<span class="token punctuation">.</span>Query<span class="token punctuation">(</span><span class="token punctuation">)</span> query<span class="token punctuation">.</span>feed <span class="token operator">=</span> <span class="token string">'/feeds/default/blogs'</span> feed <span class="token operator">=</span> blogger_service<span class="token punctuation">.</span>Get<span class="token punctuation">(</span>query<span class="token punctuation">.</span>ToUri<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">print</span> feed<span class="token punctuation">.</span>title<span class="token punctuation">.</span>text <span class="token keyword">for</span> entry <span class="token keyword">in</span> feed<span class="token punctuation">.</span>entry<span class="token punctuation">:</span> <span class="token keyword">print</span> <span class="token string">"\t"</span> <span class="token operator">+</span> entry<span class="token punctuation">.</span>title<span class="token punctuation">.</span>text</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>After you have the blog id we can start working on the query</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"> blog_id <span class="token operator">=</span> <span class="token number">413573351281770670</span> feed_url <span class="token operator">=</span> <span class="token string">'/feeds/%s/posts/default'</span> <span class="token operator">%</span> <span class="token builtin">str</span><span class="token punctuation">(</span>blog_id<span class="token punctuation">)</span> query <span class="token operator">=</span> service<span class="token punctuation">.</span>Query<span class="token punctuation">(</span><span class="token punctuation">)</span> query<span class="token punctuation">.</span>feed <span class="token operator">=</span> feed_url</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span></span></pre></div> <p>The below function returns the total number of posts that are in the feed. We can get a small response by sending 0 for the max results. Below is the function and the small response we get from it.</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"> <span class="token comment">#get the total number of posts for this feed</span> <span class="token keyword">def</span> <span class="token function">get_total</span><span class="token punctuation">(</span>query<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token comment">#query for no posts</span> query<span class="token punctuation">.</span>max_results <span class="token operator">=</span> <span class="token string">'0'</span> query<span class="token punctuation">.</span>start_index <span class="token operator">=</span> <span class="token string">'1'</span> <span class="token comment">#get back entryless feed</span> feed <span class="token operator">=</span> blogger_service<span class="token punctuation">.</span>Get<span class="token punctuation">(</span>query<span class="token punctuation">.</span>ToUri<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token builtin">int</span><span class="token punctuation">(</span>feed<span class="token punctuation">.</span>total_results<span class="token punctuation">.</span>text<span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <div class="gatsby-highlight" data-language="xml"><pre style="counter-reset: linenumber NaN" class="language-xml line-numbers"><code class="language-xml"> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns0:</span>feed</span> <span class="token attr-name"><span class="token namespace">xmlns:</span>ns0</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.w3.org/2005/Atom<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns1:</span>totalresults</span> <span class="token attr-name"><span class="token namespace">xmlns:</span>ns1</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://a9.com/-/spec/opensearchrss/1.0/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>1<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">ns1:</span>totalresults</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns1:</span>itemsperpage</span> <span class="token attr-name"><span class="token namespace">xmlns:</span>ns1</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://a9.com/-/spec/opensearchrss/1.0/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>0<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">ns1:</span>itemsperpage</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns1:</span>startindex</span> <span class="token attr-name"><span class="token namespace">xmlns:</span>ns1</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://a9.com/-/spec/opensearchrss/1.0/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>1<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">ns1:</span>startindex</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns0:</span>generator</span> <span class="token attr-name">version</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>7.00<span class="token punctuation">"</span></span> <span class="token attr-name">uri</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.blogger.com<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Blogger<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">ns0:</span>generator</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns0:</span>author</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns0:</span>name</span><span class="token punctuation">></span></span>Tim<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">ns0:</span>name</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">ns0:</span>author</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns0:</span>id</span><span class="token punctuation">></span></span>tag:blogger.com,1999:blog-413573351281770670<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">ns0:</span>id</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns0:</span>link</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://gpowered.blogspot.com/<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text/html<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>alternate<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">ns0:</span>link</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns0:</span>link</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://gpowered.blogspot.com/feeds/posts/default<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>application/atom+xml<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://schemas.google.com/g/2005#feed<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">ns0:</span>link</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns0:</span>link</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.blogger.com/feeds/413573351281770670/posts/default?max-results=0<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>application/atom+xml<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>self<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">ns0:</span>link</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns0:</span>link</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.blogger.com/feeds/413573351281770670/posts/default<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>application/atom+xml<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://schemas.google.com/g/2005#post<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">ns0:</span>link</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns0:</span>title</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>gPowered<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">ns0:</span>title</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">ns0:</span>updated</span><span class="token punctuation">></span></span>2007-07-18T10:55:06.728-05:00<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">ns0:</span>updated</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">ns0:</span>feed</span><span class="token punctuation">></span></span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>So we get the total number of posts and then we can start pulling data. Lets make a generic function, PostFrom, that can be used to show multiple posts, or just single ones, depending on what you pass to it. The start number that is passed to PostFrom has been set to the first post in the blog is considered to have an id of 1 and the latest post is the same as total_posts. This is useful so if viewers want to bookmark the page they are looking at, the post that is being displayed will not change. The following are the different functions that will make use of it.</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"> <span class="token comment">#show latest posts</span> <span class="token keyword">def</span> <span class="token function">Posts</span><span class="token punctuation">(</span>request<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">return</span> ListPosts<span class="token punctuation">(</span>request<span class="token punctuation">,</span> total_posts<span class="token punctuation">)</span> <span class="token comment">#show posts starting from a certain point </span> <span class="token keyword">def</span> <span class="token function">ListPosts</span><span class="token punctuation">(</span>request<span class="token punctuation">,</span> start<span class="token punctuation">)</span><span class="token punctuation">:</span> start <span class="token operator">=</span> total_posts <span class="token operator">-</span> <span class="token builtin">int</span><span class="token punctuation">(</span>start<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span> <span class="token keyword">return</span> PostFrom<span class="token punctuation">(</span>request<span class="token punctuation">,</span> start<span class="token punctuation">,</span> show_num<span class="token punctuation">)</span> <span class="token comment">#show a single post</span> <span class="token keyword">def</span> <span class="token function">Post</span><span class="token punctuation">(</span>request<span class="token punctuation">,</span> start<span class="token punctuation">)</span><span class="token punctuation">:</span> start <span class="token operator">=</span> total_posts <span class="token operator">-</span> <span class="token builtin">int</span><span class="token punctuation">(</span>start<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span> <span class="token keyword">return</span> PostFrom<span class="token punctuation">(</span>request<span class="token punctuation">,</span> start<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token keyword">def</span> <span class="token function">PostFrom</span><span class="token punctuation">(</span>request<span class="token punctuation">,</span> start<span class="token punctuation">,</span> count<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token comment">#query for count number of posts starting at the given post</span> query<span class="token punctuation">.</span>max_results <span class="token operator">=</span> <span class="token builtin">str</span><span class="token punctuation">(</span>count<span class="token punctuation">)</span> query<span class="token punctuation">.</span>start_index <span class="token operator">=</span> <span class="token builtin">str</span><span class="token punctuation">(</span>start<span class="token punctuation">)</span> feed <span class="token operator">=</span> blogger_service<span class="token punctuation">.</span>Get<span class="token punctuation">(</span>query<span class="token punctuation">.</span>ToUri<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Now we have all the data we need in the feed variable. Its been turned into an element tree so we don't have to worry about XML parsing here. Every node has become an objects and lists. Objects for single nodes(title), and lists for where there are multiple nodes of the same name (entry, link) At this stage I play with the data a little so it's easier to use in my Django template.</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"> <span class="token comment">#normalize data for output</span> <span class="token keyword">for</span> entry <span class="token keyword">in</span> feed<span class="token punctuation">.</span>entry<span class="token punctuation">:</span> <span class="token comment">#get link for template</span> entry<span class="token punctuation">.</span>my_link <span class="token operator">=</span> entry<span class="token punctuation">.</span>link<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>href <span class="token comment">#id for links</span> entry<span class="token punctuation">.</span>my_id <span class="token operator">=</span> curr_id curr_id <span class="token operator">-=</span> <span class="token number">1</span> <span class="token comment">#format published date</span> dt <span class="token operator">=</span> DateTime<span class="token punctuation">.</span>ISO<span class="token punctuation">.</span>ParseDateTimeUTC<span class="token punctuation">(</span>entry<span class="token punctuation">.</span>published<span class="token punctuation">.</span>text<span class="token punctuation">)</span> entry<span class="token punctuation">.</span>my_date <span class="token operator">=</span> dt<span class="token punctuation">.</span>strftime<span class="token punctuation">(</span><span class="token string">'%m/%d/%Y'</span><span class="token punctuation">)</span> entry<span class="token punctuation">.</span>my_time <span class="token operator">=</span> dt<span class="token punctuation">.</span>strftime<span class="token punctuation">(</span><span class="token string">'%I:%M %p'</span><span class="token punctuation">)</span> </code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>Of course we're going to need next and previous buttons as well. The way we've set up the math with total_posts and the start number, we only have to increment or decrement these by count (the number of posts to display on a page). I also set part of the link, as well as the page title, that I will use in my template.</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"> prev <span class="token operator">=</span> total_posts <span class="token operator">-</span> <span class="token punctuation">(</span>start <span class="token operator">-</span> count<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span> <span class="token keyword">if</span> prev <span class="token operator">></span> total_posts<span class="token punctuation">:</span> prev <span class="token operator">=</span> <span class="token boolean">None</span> <span class="token builtin">next</span> <span class="token operator">=</span> total_posts <span class="token operator">-</span> <span class="token punctuation">(</span>start <span class="token operator">+</span> count<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span> <span class="token keyword">if</span> <span class="token builtin">next</span> <span class="token operator">&lt;</span> <span class="token number">1</span><span class="token punctuation">:</span> <span class="token builtin">next</span> <span class="token operator">=</span> <span class="token boolean">None</span> <span class="token comment">#showing single post </span> <span class="token keyword">if</span> count <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">:</span> link <span class="token operator">=</span> <span class="token string">'post'</span> title <span class="token operator">=</span> feed<span class="token punctuation">.</span>entry<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>title<span class="token punctuation">.</span>text <span class="token comment">#listing posts</span> <span class="token keyword">else</span><span class="token punctuation">:</span> link <span class="token operator">=</span> <span class="token string">'posts'</span> title <span class="token operator">=</span> <span class="token string">'home'</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>The final part of the function is a return to the Django framework to populate my template. I'm going to get into the template more in the next post, but you now have all the information you need stored.</p> <div class="gatsby-highlight" data-language="python"><pre style="counter-reset: linenumber NaN" class="language-python line-numbers"><code class="language-python"> <span class="token keyword">return</span> render_to_response<span class="token punctuation">(</span><span class="token string">'posts/index.html'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token string">'entries'</span><span class="token punctuation">:</span> feed<span class="token punctuation">.</span>entry<span class="token punctuation">,</span> <span class="token string">'title'</span><span class="token punctuation">:</span> title<span class="token punctuation">,</span> <span class="token string">'tag_link'</span><span class="token punctuation">:</span> tag_link<span class="token punctuation">,</span> <span class="token string">'prev'</span><span class="token punctuation">:</span> prev<span class="token punctuation">,</span> <span class="token string">'next'</span><span class="token punctuation">:</span> <span class="token builtin">next</span><span class="token punctuation">,</span> <span class="token string">'link'</span><span class="token punctuation">:</span> link<span class="token punctuation">,</span> <span class="token string">'tab_home'</span><span class="token punctuation">:</span> <span class="token boolean">True</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span></code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>To the template!</p> <p>The first part consists of displaying the post itself, along with its relevant information</p> <div class="gatsby-highlight" data-language="html"><pre style="counter-reset: linenumber NaN" class="language-html line-numbers"><code class="language-html"> {% verbatim %} {% for entry in entries %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h2</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/post/{{ entry.my_id }}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>{{ entry.title.text }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h2</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span> {{ entry.content.text }} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>Posted by {% for auth in entry.author %}{{ auth.name.text }}{% if not forloop.last %}, {% endif %}{% endfor %} on {{ entry.my_date }} at {{ entry.my_time }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span> {% if entry.category %}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>Labels: {% for cat in entry.category %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{{ tag_link }}{{ cat.term }}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>{{ cat.term }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span> {% if not forloop.last %}, {% endif %} {% endfor %}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span>{% endif %}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{{ entry.my_link }}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>More...<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span> {% endfor %} {% endverbatim %}</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>And the second part handles the prev and next links</p> <div class="gatsby-highlight" data-language="html"><pre style="counter-reset: linenumber NaN" class="language-html line-numbers"><code class="language-html"> {% verbatim %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>br</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>br</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>nav<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> {% if prev %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/{{ link }}/{{ prev }}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>prev<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span> {% else %} {% endif %} {% if next %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/{{ link }}/{{ next }}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>next<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span> {% else %} {% endif %} <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> {% include 'bottom.html' %} {% endverbatim %}</code><span aria-hidden="true" class="line-numbers-rows" style="white-space: normal; width: auto; left: 0;"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div> <p>That's all for now. A working example is the <a href="https://gpowered.net/g/">gPowered.net</a> site I'm putting up. All posts on there are getting pulled from this blog. I'm going to get into tags and comments next time, as well as javascript and php versions. Stay tuned!</p><![CDATA[A begining]]>https://www.timbroder.com/2007/07/begininghttps://www.timbroder.com/2007/07/beginingSun, 15 Jul 2007 18:33:00 GMT<p>I've been meaning to start this project for a while now so here it goes...</p> <p>Part of my daily routine is reading a couple of comics including <a href="http://www.gocomics.com/calvinandhobbes/">Calvin and Hobbes</a>, <a href="http://www.dilbert.com/comics/dilbert/archive/">Dilbert</a>, <a href="http://www.gocomics.com/foxtrotclassics/">Foxtrot</a>, <a href="http://www.gocomics.com/garfield/">Garfield</a>, <a href="http://xkcd.com/">xkcd</a>, <a href="http://www.vgcats.com/comics/">vgcats</a>, and <a href="http://www.oreillynet.com/wateringhole/blog/">The Watering Hole</a>. Following the quick comic catch up I'll look through some various project blogs including <a href="http://www.ampache.org/">Ampache</a>, <a href="http://www.djangoproject.com/">django</a>, <a href="http://developer.yahoo.com/yui/">YUI</a>, and <a href="http://developers.facebook.com/">facebook</a>. But the highlight of my reading has always been what Google is up to. On this front my favorite blogs have been <a href="http://googlesystem.blogspot.com/">Google Operating System</a>, <a href="http://googlified.com/">Googlefied</a>, and <a href="http://blogoscoped.com/">Google Blogoscoped</a>. They keep me up to date on what Google is doing technically and in the business world. When new api's come out I try to take a look at their documentation and see what they can do. I'll also scan over Google's official blogs to see if I've missed anything for the day.</p> <p>So I guess now I have to get to the point of this project. With a little inspiration from <a href="http://www.cangooglehearme.com">CanGoogleHearMe?</a> I envision a website, starting out as a personal homepage, that is entirely powered by Google; All the data stored somehow in a Google service. I'm going to chronicle my journey of creating news, updates, photos, links, a profile, and anything else you would want to see in a personal page, all Google powered. Then later I also want to extend the tutorials to integrating Google with the Facebook platform. The languages I hope to cover are python, JavaScript, and PHP. I would also like to touch on Java if I can.</p> <p>I also will post some updates from Google themselves, but seeing that there are already popular sites that do that, those updates won't be the focal point of this blog. Without further adieu, let the tutorials commence!</p> <p>Edit: <a href="https://gpowered.net">Domain is live!</a></p>