<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>Providing small and medium enterprises with a unique one-button social infrastructure.Enabling companies to control their own secure private cloud - hassle free.Watch us grow, or join in!</description><title>protonet</title><generator>Tumblr (3.0; @protonet)</generator><link>http://blog.protonet.info/</link><item><title>Meet the Team</title><description>&lt;p&gt;As of today the protonet core team consists of six employees. We gratefully received an innovation grant from the State Of Germany.&lt;/p&gt;



&lt;p&gt;Now it’s time to give you a quick introduction to “who’s who” of the people behind protonet:&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;&lt;img align="left" src="http://media.tumblr.com/tumblr_lypvmufpwP1qcc3wc.jpg"/&gt; Ali Jelveh, Co-Founder &amp; Chief Revolutionary Officer&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Ali has been a developer since back when he dropped out of university and needed the money. He started with building minimal billing solutions and grew to build teams and create ERPs for mid-size companies. With the rise of the web he moved from building first small webstores to designing and creating JavaScript architectures for one of the first big social networks. He joined the XING AG as a RoR developer early on where he had the opportunity to meet and work with truly amazing people. This is also where he finally decided to start working on an idea that was simmering in his head for quite some time. He told Christopher about it and the rest is history. When he isn’t working on protonet he spends his time thinking, planning and simulating (cue manic laughter here).&lt;/p&gt;



&lt;p&gt;Contact him via &lt;a href="https://www.xing.com/profile/Ali_Jelveh" target="_blank"&gt;XING&lt;/a&gt;, &lt;a href="http://www.linkedin.com/profile/view?id=59589498" target="_blank"&gt;LinkedIn&lt;/a&gt; or &lt;a href="https://twitter.com/#!/jelveh" target="_blank"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;&lt;img align="right" src="http://media.tumblr.com/tumblr_lypvqh0lON1qcc3wc.jpg"/&gt; Christopher Blum, Co-Founder &amp; Intergalactic President&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;At the age of 16 Christopher founded his own little company, PackYourFiles.com (a one-click share hoster, similar to megaupload, with file compression technology). After finishing school he studied communication design and started working as a freelancer in an online marketing agency. Later he got hired by the largest european social business network, &lt;a href="http://www.xing.com" target="_blank"&gt;XING.com&lt;/a&gt;, where he was mainly responsible for the JavaScript architecture and the integration of a third party app eco system. During that time he met Ali, who also worked at XING. Ali convinced Christopher from the first day on to work with him on protonet. Since then the first prototype was developed after work and on the weekends. Apart from that Christopher is the owner of &lt;a href="http://spellboy.com" target="_blank"&gt;SpellBoy.com&lt;/a&gt;, an online spell checker, that had in its best days more than 100,000 unique visitors per day. In his free time he enjoys playing football or having a cold beer with friends.&lt;/p&gt;



&lt;p&gt;Contact him via &lt;a href="https://www.xing.com/profile/Christopher_Blum2" target="_blank"&gt;XING&lt;/a&gt;, &lt;a href="http://www.linkedin.com/profile/view?id=12722565" target="_blank"&gt;LinkedIn&lt;/a&gt; or &lt;a href="https://twitter.com/#!/ChristopherBlum" target="_blank"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;&lt;img align="left" src="http://media.tumblr.com/tumblr_lypw0skkSJ1qcc3wc.jpg"/&gt; Wolfgang Peters, Serious Business Officer&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Early during schooldays Wolfgang developed websites for small local businesses for small money, later he finished commercial high school and studied Business Administration at the University of Kiel in Germany and the University of Tromso in Norway. During his studies Wolfgang worked on several consulting and startup projects. After finishing university in 2011 he started working as Business Analyst for the startup incubator Hanse Ventures in Hamburg. He earned major insights in the startup and venture capital industry and got prepared for founding and administrating an own business. During founder workshops at the betahaus Hamburg he met protonet who were looking for a business guy. After getting to know the product and team members the decision to work together was made. Wolfgang now is in charge of the business stuff, looking at numbers and cash, taking care of marketing and sales, doing everything he can to let the developers develop. Serious business so to speak.&lt;/p&gt;



&lt;p&gt;Contact him via &lt;a href="https://www.xing.com/profile/Wolfgang_Peters11" target="_blank"&gt;XING&lt;/a&gt;, &lt;a href="http://www.linkedin.com/profile/view?id=137464246" target="_blank"&gt;LinkedIn&lt;/a&gt; or &lt;a href="https://www.facebook.com/wolfgangpeters01" target="_blank"&gt;Facebook&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;&lt;img align="right" src="http://media.tumblr.com/tumblr_lypw5f7ySq1qcc3wc.jpg"/&gt;Henning Thies, Senior Interactive Developer&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;On the i486 of his parents Henning made his first foot steps on his programming career with Turbo Pascal. In school he got even more interested in the whole computer science, that he decided to study IT and Design in Lübeck. Next to the studies he worked in a small local agency and learned programming for the web. After he returned from a semester at the Universtitat Politècnica de Valencia he went to Hamburg. He started to use Ruby on Rails at Ubilabs and earned a Google Qualified Developer certificate. To finish his diploma Henning went to Kiel an started to develop various web-projects at empuxa. Once done he moved back to Hamburg and continued to work for empuxa out of the Betahaus. There he met Ali, Christopher and protonet. After being under observation for some time, they decided to ask him to join their team to make it even more awesome.  Now he tries to to implement new backend and frontend features. And of course support Ali and Christopher to maintain their growing bug collection. To get rid of all the messy weather-sites he co-founded the website &lt;a href="http://wetterwolke.com" target="_blank"&gt;wetterwolke.com&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;Contact him via &lt;a href="https://www.xing.com/profile/Henning_Thies3" target="_blank"&gt;XING&lt;/a&gt;, &lt;a href="http://www.linkedin.com/profile/view?id=57433392" target="_blank"&gt;LinkedIn&lt;/a&gt; or &lt;a href="https://twitter.com/#!/Henningthies" target="_blank"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;&lt;img align="left" src="http://media.tumblr.com/tumblr_lypwktWZ0d1qcc3wc.jpg"/&gt;Johannes von Bargen, Dynamic Research Scientist&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Johannes studied Architecture and Urban Development at HfbK and HCU Hamburg and graduated in late 2008. Additionally he’s very interested in information technology of all kind. Especially when making ones life easier and more fun with its help. Since highschool and througout his university studies he provided Web/Email/Backup-hosting services for small companies and did custom software development. He’s really unhappy with the current situation: People give away even their most private information and data unmindfully and put themselves into the hands of big companies that would sell their mothers soul to increase their profit. By putting his power behind protonet he wants to enable even the not so tech-savvy people to use the power of open source to get in charge of their own data and disburden them from the dependency on third party services.&lt;/p&gt;



&lt;p&gt;Contact him via &lt;a href="https://www.xing.com/profile/Johannes_vonBargen" target="_blank"&gt;XING&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;&lt;img align="right" src="http://media.tumblr.com/tumblr_lypwpomrCW1qcc3wc.jpg"/&gt; David Burkhardt, Senior Craft Meister&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;David had a knack for designing early on: with 17 he won the “Landeswettbewerb Jugend Forscht” with his passively cooled mini-computer. He then went on to design and build his own line of speciality cooling solution for custom PC hardware. While doing that, he started his design studies at the HfbK in Hamburg where he studied under Prof. Löw who incidentally connected him with the protonet project. Since then he turned the mere idea of an enclosure for our unique hard- and software combination into an actual physical thing, designed, built and assembled here in Hamburg. He spends the rest of his time either on his house boat thinking about artsy things, or at the university crafting even more artsy things. Oh and, he’s not only good at design, he’s also a great engineer, perfect combination if you ask us.&lt;/p&gt;

&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;

&lt;p&gt;&#13;
&lt;strong&gt;And that’s it! Six people to change the world, and now that we’ve finally solved the tough problem of naming our positions, it’s time to get some work done! Expect great things!&lt;/strong&gt;&lt;/p&gt;</description><link>http://blog.protonet.info/post/16864134090</link><guid>http://blog.protonet.info/post/16864134090</guid><pubDate>Wed, 01 Feb 2012 09:38:00 -0500</pubDate><category>team</category><category>ali</category><category>christopher</category><category>henning</category><category>johannes</category><category>david</category><category>company</category><category>wolfgang</category><dc:creator>christopher-blum</dc:creator></item><item><title>You're kick-ass business dude? Join us!</title><description>&lt;p&gt;After three years of hard work and our first shipments behind us - the time has come for us to walk out of the dark and change the world.&lt;/p&gt;

&lt;p&gt;Changing the world however is not an easy feat and we can’t do it alone. We need you to help us. This is a life changing opportunity and we’d love you to take this journey with us but before you say yes, here are some things you should know.&lt;/p&gt;

&lt;h2&gt;What we believe in:&lt;/h2&gt;

&lt;p&gt;We believe in freedom, we believe that computer can change the world, and we believe in using this power to catalyze true social change and to make businesses and communities less dependent on the big players for they’re most important tools.&lt;/p&gt;

&lt;p&gt;We also believe that true fundamental changes happen through the power of your local communities (whether it is a business or private community) and we want to enable these communities with tools that make them strong and independent.&lt;/p&gt;

&lt;p&gt;As far as user-computing is concerned we believe the web to be the operation system of the future and we’re preparing our company to be ready and on the (surf-)board when this spectacular wave hits the shores. 
&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;

&lt;h2&gt;What we do:&lt;/h2&gt;

&lt;p&gt;We’re building the next generation of social infrastructure, a mashup of a mini server - an accesspoint and a distributed social network. With our protonet nodes small and medium enterprises are enabled to create a secure and - most importantly - social infrastructure with the push of a button.&lt;/p&gt;

&lt;p&gt;In the long run we’re in fact creating a new kind of operation system meant to one day provide the IT and eSocial needs of SME’s and Communities in general.&lt;/p&gt;

&lt;p&gt;Check out some images: &lt;a href="http://twitter.com/#!/protonet/media/grid" target="_blank"&gt;http://twitter.com/#!/protonet/media/grid&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Some videos on our current splash-page: &lt;a href="http://protonet.info/" target="_blank"&gt;http://protonet.info/&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;

&lt;h1&gt;What you’ll be doing:&lt;/h1&gt;

&lt;h3&gt;Production and supply chain management&lt;/h3&gt;

&lt;p&gt;It’s a different kind of business, we do hardware, we do software, we do it locally, we do it distributed. you’ll be in charge in creating a supply chain that can handle our needs, and make sure we get our nodes produced in time, in perfect quality and for a good price, we’re going at the hardware problem as we go at the software problem, small iterations, small changes, short cycles. You’ll be helping us build stuff that is meant to last.&lt;/p&gt;

&lt;h3&gt;Marketing and sales&lt;/h3&gt;

&lt;p&gt;You should love to sell and since the market we’re catering to does not yet exist you’ll have to build that one too. You’ll be in charge of creating and managing a sales team (in- or outsourced), handling whatever marketing needs to be done to get the company off the ground.&lt;/p&gt;

&lt;h3&gt;Controlling and funding&lt;/h3&gt;

&lt;p&gt;As a company we’ll need numbers, we need to always know exactly where we stand, you’ll be creating the framework for us to know the company numbers at any given time. At some point we might take on external investment so you should know how to get that funding. if you don’t know it yet, don’t worry you’ll be able to learn this kind of stuff on the job.
&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Yes, we know this sounds like a job for a whole team (or several), and that’s what you’ll probably end up building and leading, but right now, our budget allows for just one position and that is yours. Currently all these task are handled internally within our team so you will not be alone on these issues.&lt;/em&gt;
&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;

&lt;h2&gt;How we work:&lt;/h2&gt;

&lt;p&gt;You’ll get the opportunity to work with some great coders (including 2 ex-XING Architects) an amazing industrial designer and you’ll be meeting a lot of great people in all kinds of fields helping us make this a reality. You’ll be able to tap some massive brainpower whenever you need help on something. Our company culture is a work in progress, as of now we just have one rule: create the most awesome thing you can within the given constraints.&lt;/p&gt;

&lt;p&gt;Just as our products are made to last we see this as a beginning to decades long journey, that is why we want to provide a healthy work life balance - we work 9-5 (rather 10-6) and leave enough breathing room for your creativity and skill set to grow. We understand that there is only a certain amount of work that can be achieved in a day, so be smart, keep  problem solutions as simple as possible and start on iterating from there.&lt;/p&gt;

&lt;p&gt;The pay is decent and there is equity but if you’re looking to earn big from the get go we’re not your startup.&lt;/p&gt;

&lt;p&gt;Our office is currently embedded within the great betahaus Hamburg.&lt;/p&gt;

&lt;p&gt;&lt;br/&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you’re interested and not afraid to challenge the status quo, drop us a line at: team [ät] protonet [döt] info .&lt;/strong&gt;&lt;/p&gt;</description><link>http://blog.protonet.info/post/14864297911</link><guid>http://blog.protonet.info/post/14864297911</guid><pubDate>Tue, 27 Dec 2011 10:46:00 -0500</pubDate><dc:creator>dudemeister</dc:creator></item><item><title>blogpost on his internship at protonet by our own @danopia - do check it out!</title><description>&lt;a href="http://blog.danopia.net/2011/12/betahaus.html?showComment=1323940672413#c5619199453080750985"&gt;blogpost on his internship at protonet by our own @danopia - do check it out!&lt;/a&gt;</description><link>http://blog.protonet.info/post/14257093332</link><guid>http://blog.protonet.info/post/14257093332</guid><pubDate>Thu, 15 Dec 2011 04:19:00 -0500</pubDate><dc:creator>dudemeister</dc:creator></item><item><title>Hostapd: Beacon set failed</title><description>&lt;p&gt;Right now you’re probably thinking&lt;em&gt; ”Mhhhmm, Bacon”&lt;/em&gt; (but no this is about “&lt;strong&gt;beacons”&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;For our current revision of high-end nodes, we use a motherboard named Asus E35M1-I Deluxe.&lt;/p&gt;
&lt;p&gt;This board includes an Atheros AR9280 WLAN chipset which is usually well supported by the &lt;a href="http://linuxwireless.org/en/users/Drivers/ath9k" target="_blank"&gt;default linux compat wireless drivers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Our software setup (Ubuntu 10.04 LTS3) contains the latest stable version of the HostAP Daemon (v0.7.3) which is compiled with the following build options:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CONFIG_DRIVER_NL80211=y&lt;br/&gt;CONFIG_IEEE80211N=y&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Our hostapd config looks a little bit like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ctrl_interface=/var/run/hostapd&lt;br/&gt;driver=nl80211&lt;br/&gt;hw_mode=g&lt;br/&gt;wme_enabled=1&lt;br/&gt;ieee80211n=1&lt;br/&gt;ht_capab=[HT40-][SHORT-GI-40][DSSS_CCK-40]&lt;br/&gt;channel=6&lt;br/&gt;ssid=protonet-private&lt;br/&gt;interface=wlan0&lt;br/&gt;macaddr_acl=0&lt;br/&gt;auth_algs=1&lt;br/&gt;ignore_broadcast_ssid=0&lt;br/&gt;wpa=2&lt;br/&gt;wpa_psk=abcdefghijklmnopqrstuvwxyz&lt;br/&gt;wpa_key_mgmt=WPA-PSK&lt;br/&gt;wpa_pairwise=TKIP&lt;br/&gt;rsn_pairwise=CCMP&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And here comes the main reason why I’m writing this blog post:&lt;br/&gt;Whenever we try to start hostapd in verbose mode it shows the following error:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nl80211: Set beacon (beacon_set=0)&lt;br/&gt;nl80211: Beacon set failed: -22 (Invalid argument)&lt;br/&gt;Failed to set beacon head/tail or DTIM period&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It seemed like we were the only ones having that issue. Google Search didn’t offer any help. Writing to the &lt;a href="http://www.spinics.net/lists/linux-wireless/msg81592.html" target="_blank"&gt;linux wireless mailing list&lt;/a&gt; didn’t help much either.&lt;/p&gt;
&lt;p&gt;So we went with the trial and error approach and therefore compiled hostapd over and over again based on different build configurations.&lt;/p&gt;
&lt;p&gt;After 10 days of debugging (seriously!) we finally managed to find a fix.&lt;br/&gt;It turns out that including this build option magically heals hostapd:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CONFIG_IEEE80211R=y&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Don’t ask us why enabling Fast BSS Transition (802.11r) solves it. We’ve no idea. If you’re a hostapd developer reading this please enlighten us.&lt;/p&gt;</description><link>http://blog.protonet.info/post/14120407823</link><guid>http://blog.protonet.info/post/14120407823</guid><pubDate>Mon, 12 Dec 2011 11:33:00 -0500</pubDate><category>hostapd</category><category>ubuntu</category><category>linux</category><category>wireless</category><category>wlan</category><category>wifi</category><category>hardware</category><category>software</category><dc:creator>christopher-blum</dc:creator></item><item><title>How to save plenty of Cash on HDDs these Days</title><description>&lt;p&gt;As you probably already have heard the price of hard drives has increased significantly due to the &lt;a target="_blank" href="http://www.tweaktown.com/news/21400/more_hdd_price_drama_from_thailand_floods/index.html"&gt;horrible flooding in Thailand&lt;/a&gt;.&lt;/p&gt;



&lt;ul&gt;&lt;li&gt;Western Digital, the world leader in HDD production, was &lt;a target="_blank" href="http://www.brightsideofnews.com/news/2011/11/1/photo-horrific-images-of-flooded-western-digital-factory.aspx"&gt;heavily affected&lt;/a&gt; by the natural disaster&lt;/li&gt;&#13;
&lt;li&gt;Seagate, an American company that outsourced its HDD production to factories in Thailand, lowered it &lt;a target="_blank" href="http://www.reuters.com/article/2011/11/03/seagate-idUSL4E7M32IB20111103"&gt;shipments estimate&lt;/a&gt;&lt;/li&gt;&#13;
&lt;li&gt;Altogether it seems that every HDD manufacturer has (or is dependent on) production facilities in Thailand&lt;/li&gt;&#13;
&lt;li&gt;&lt;a target="_blank" href="http://www.eweek.com/c/a/Data-Storage/Thailand-Flooding-Could-Impact-Global-HDD-Production-Until-Spring-2012-371193/"&gt;Some news sources&lt;/a&gt; say the flooding could impact global HDD production until spring 2012 while at the same time the global demand for HDDs is continuously growing&lt;/li&gt;&#13;
&lt;/ul&gt;&lt;p&gt;Now if you look at this graph that compares consumer prices of a Seagate 2TB HDD over the last 90 days, you’ll see an increase by more than 100%.&lt;/p&gt;



&lt;p&gt;&lt;a target="_blank" href="http://geizhals.at/deutschland/?phist=588865"&gt;&lt;img src="http://media.tumblr.com/tumblr_lu9bcuefDd1qcc3wc.png"/&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;We at protonet are suffering big time from the price drama since we are preparing our &lt;a target="_blank" href="https://www.facebook.com/photo.php?fbid=313818068635096&amp;set=a.291348414215395.89887.287057047977865&amp;type=1"&gt;first delivery of nodes to our customers&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;But, lucky us, we managed to find a way to bypass the increasing of prices (temporarily): It turns out that the prices for external HDD are pretty much not affected yet.&lt;/p&gt;



&lt;p&gt;We think this is because those vendors still have big stock reserves. Look at a price comparison of a LaCie 2TB Hard Disk (which contains exactly the above mentioned Seagate hardware):&lt;/p&gt;



&lt;p&gt;&lt;a target="_blank" href="http://geizhals.at/deutschland/?phist=430737"&gt;&lt;img src="http://media.tumblr.com/tumblr_lu9bf5CWMF1qcc3wc.png"/&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;We even spotted local shops that have plenty of supplies and offer it even cheaper than shown in the graph above.&lt;/p&gt;



&lt;p&gt;Yes, you understood correctly: &lt;strong&gt;Right now if you need a Seagate 2TB HDD (or any other HDD) it is much cheaper to buy it with an external case than without.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here’s a list of external cases and their respective HDDs (no guarantees + if you have infos on any other cases please write their spec in our comments we’ll update our list):&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;“LACIE hard disk” EAN 3660619318711: Seagate Barracuda Green 2TB (ST2000DL001)&lt;/li&gt;
&lt;li&gt;“TOSHIBA STOR.E ALU 2S”, Seagate Barracuda Green 2TB (ST2000DL003)&lt;/li&gt;
&lt;li&gt;“SEAGATE GoFlex Desk 2TB”, Seagate Baraccuda LP (ST2000DL003)&lt;/li&gt;
&lt;/ul&gt;</description><link>http://blog.protonet.info/post/12463758761</link><guid>http://blog.protonet.info/post/12463758761</guid><pubDate>Mon, 07 Nov 2011 04:51:00 -0500</pubDate><category>hardware</category><category>hdd</category><category>hard disk</category><category>price</category><category>supply</category><dc:creator>christopher-blum</dc:creator></item><item><title>Launch date is coming closer</title><description>&lt;p&gt;&lt;em&gt;About &lt;a target="_blank" href="http://www.onlinehelp24.net"&gt;Onlinehelp24&lt;/a&gt;: We are about to setup an IT support infrastructure for protonet and have already deployed a handful nodes for early adopter customers.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The last two weeks were totally exciting and absolutely productive. We started to drum up business and focussed on how protonet can be used in the wild :)&lt;/p&gt;
&lt;p&gt;Besides of revolutionizing the way people socialize we came up with 2 scenarios where we think that protonet might also bring a big change and benefit for its users.&lt;/p&gt;
&lt;p&gt;Moving the world from data-stockpiling corporate social networks with almost no local impact to decentralized infrastructures where everybody can be a social network hoster and have a real effect in his everyday life.&lt;br/&gt;&lt;br/&gt;&lt;a title="protonet.-.the.real.social.network" target="_blank" href="http://protonet.info/docs/protonet_the_real_social_network.pdf"&gt;&lt;img src="http://media.tumblr.com/tumblr_lrrw15evsE1qfg88q.jpg"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Check out protonet as a office server for small and medium-sized enterprises:&lt;br/&gt;&lt;a target="_blank" href="http://protonet.info/docs/protonet_use_cases_smes.pdf"&gt;&lt;a href="http://protonet.info/docs/protonet_use_cases_smes.pdf" target="_blank"&gt;http://protonet.info/docs/protonet_use_cases_smes.pdf&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Check out the scenario for travelers at a hostel:&lt;br/&gt;&lt;a target="_blank" href="http://protonet.info/docs/protonet_use_cases_hostels.pdf"&gt;&lt;a href="http://protonet.info/docs/protonet_use_cases_hostels.pdf" target="_blank"&gt;http://protonet.info/docs/protonet_use_cases_hostels.pdf&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What do you think? What would be another convenient scenario for protonet?&lt;/p&gt;
&lt;p&gt;If you need help setting up your own protonet node at home or at your office, feel free to contact us at &lt;a target="_blank" href="mailto:protonet@onlinehelp24.net"&gt;protonet@onlinehelp24.net&lt;/a&gt;. We’ll deal with all your questions getting it up and running in no time.&lt;/p&gt;</description><link>http://blog.protonet.info/post/10403455491</link><guid>http://blog.protonet.info/post/10403455491</guid><pubDate>Mon, 19 Sep 2011 10:54:37 -0400</pubDate><category>hostel</category><category>onlinehelp24</category><category>presentation</category><category>scenario</category><category>setup</category><category>sme</category><category>support</category><category>use case</category><category>node</category><category>launch</category><dc:creator>onlinehelp24</dc:creator></item><item><title>Video</title><description>&lt;iframe src="http://player.vimeo.com/video/29049923" width="400" height="300" frameborder="0"&gt;&lt;/iframe&gt;&lt;br/&gt;&lt;br/&gt;</description><link>http://blog.protonet.info/post/10240971808</link><guid>http://blog.protonet.info/post/10240971808</guid><pubDate>Thu, 15 Sep 2011 11:39:20 -0400</pubDate><category>screencast</category><category>software</category><category>interface</category><category>social</category><dc:creator>christopher-blum</dc:creator></item><item><title>Introducing Hum + Melody - Simple Music Streaming and (Web-)Client</title><description>&lt;p&gt;When you have your own protonet-node and start putting all your stuff on there, there naturally comes a time when you decide that just storing your music on it is not enough, you also want to listen to that music, preferably from anywhere and with any device. Now since we haven’t got a third party app management (yet) you’ll have to do some package installing by hand.&lt;/p&gt;
&lt;p&gt;There are a couple of great solution for being your own music hoster and with the hardware power that the node brings it’s not hard to just use one of the existing solutions:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Subsonic &lt;a target="_blank" href="http://www.subsonic.org"&gt;&lt;a href="http://www.subsonic.org" target="_blank"&gt;http://www.subsonic.org&lt;/a&gt;&lt;/a&gt; is a full fledged server and web client + there are quite a few smartphone clients out there, this is what I tried out.&lt;/li&gt;
&lt;li&gt;Ampache &lt;a target="_blank" href="http://ampache.org/"&gt;&lt;a href="http://ampache.org/" target="_blank"&gt;http://ampache.org/&lt;/a&gt;&lt;/a&gt; similar to Subsonic but the reviews weren’t as good as what people wrote on Subsonic, so I passed.&lt;/li&gt;
&lt;li&gt;ORB &lt;a target="_blank" href="http://www.orb.com/"&gt;&lt;a href="http://www.orb.com/" target="_blank"&gt;http://www.orb.com/&lt;/a&gt;&lt;/a&gt; this one looked nice on paper (or web) but didn’t seem to be Linux compatible (a deal breaker since the nodes run a ubuntu server version).&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;em&gt;I am sure there are much more, feel free to post your feedback on anything you used and liked or disliked in the comments&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;After using Subsonic for a while I was mostly happy, there was however a main issue I had with it and that was that it wouldn’t allow me a jukebox style play of my entire collection. and while I was pondering that issue I was wondering why these players had to be this big and clunky. I thought that there certainly should be an easier player/client setup. A very simple server that just serves music and a simple client that allows you a simple way to play back that stuff.&lt;/p&gt;
&lt;p&gt;I wanted …&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;a music server that just serves music&lt;/li&gt;
&lt;li&gt;a music client that connect to any music server that follows a certain specification and plays/streams from the server&lt;/li&gt;
&lt;li&gt;to have my whole music collection available to me wherever I am.&lt;/li&gt;
&lt;li&gt;to be able to play random tracks from my entire collection without having to configure anything.&lt;/li&gt;
&lt;li&gt;to be able to search my entire collection&lt;/li&gt;
&lt;li&gt;to be able to queue tracks&lt;/li&gt;
&lt;li&gt;to be able to view the tracks that have been previously played&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Now apart from some other minor niceties I didn’t really expect much from a music player. Unfortunately I haven’t found anything like that, so What is a developer to do in such a situation. A developer develops!.&lt;/p&gt;
&lt;h2&gt;Welcome Melody &amp; Hum&lt;/h2&gt;
&lt;h3&gt;Melody&lt;/h3&gt;
&lt;p&gt;Melody is a music server that (at the moment) does three things&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Announces that it is the melody sever&lt;/li&gt;
&lt;li&gt;Publishes a list of all the music that it has in its catalogue&lt;/li&gt;
&lt;li&gt;Serves a track requested&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Besides this it also allows you to do a couple of other things in the background&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Configure multiple music source locations&lt;/li&gt;
&lt;li&gt;Index all the music from these configured locations&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;That is all it does, and maybe that is all it may ever do. But with just these three things it does about all it needs to do more or less, because less is more.&lt;/p&gt;
&lt;h3&gt;Hum&lt;/h3&gt;
&lt;p&gt;Hum is the client that talks to the melody server. So what can Hum do today? It might not be the prettiest looking player but it does do everything you would need in a player. Its features include:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Track Navigation (including smart skipping functions)&lt;/li&gt;
&lt;li&gt;Random play from your entire music collection&lt;/li&gt;
&lt;li&gt;Search for tracks, click on the track and play it&lt;/li&gt;
&lt;li&gt;Queuing. Queue tracks from which you have searched&lt;/li&gt;
&lt;li&gt;Previous list. Show a list of all your tracks to which you have listened, play them again or queue them to play later&lt;/li&gt;
&lt;li&gt;Volume. Independent volume control so you can control how loud your music is.&lt;/li&gt;
&lt;li&gt;Continuous play. Choose whether you want a next track to be loaded when the current track finishes or if it should just stop.&lt;/li&gt;
&lt;li&gt;Duration. Shows how much of the current track has been played, as well as the total length of the track&lt;/li&gt;
&lt;li&gt;ID3 information, if the track has it, it will be displayed&lt;/li&gt;
&lt;li&gt;Configurable server location. Choose to which Melody server you want to connect. Or any other music server that behaves like Melody.&lt;/li&gt;
&lt;li&gt;Fetch a new catalogue from the sever&lt;/li&gt;
&lt;li&gt;Re-index the tracks on the local client.&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Code and Tech&lt;/h2&gt;
&lt;p&gt;The code for melody is located at &lt;a target="_blank" href="https://github.com/protonet/melody"&gt;&lt;a href="https://github.com/protonet/melody" target="_blank"&gt;https://github.com/protonet/melody&lt;/a&gt;&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;It is a super simple Sinatra app. The main work happens in three files, and I think it is pretty easy to read, so I don’t think I need to expand on it here.&lt;/p&gt;
&lt;p&gt;Hum lives here: &lt;a target="_blank" href="https://github.com/protonet/hum"&gt;&lt;a href="https://github.com/protonet/hum" target="_blank"&gt;https://github.com/protonet/hum&lt;/a&gt;&lt;/a&gt; .Unlike Melody, Hum is a full Rails 3 application, as it needs to do a bit more than what Melody does. Apart from just Rails the other main component to Hum, is Soundmanager2 (&lt;a target="_blank" href="http://www.schillmania.com/projects/soundmanager2/"&gt;&lt;a href="http://www.schillmania.com/projects/soundmanager2/" target="_blank"&gt;http://www.schillmania.com/projects/soundmanager2/&lt;/a&gt;&lt;/a&gt;), without which, Hum as it is now would not be a possibility. Its API is great and extensive, and allows you to do just about anything with it. And the two main things that it does that is needed in Hum are&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Hit a URL and play whatever that URL returns if it can&lt;/li&gt;
&lt;li&gt;Fire a JavaScript callback event when it has finished playing a track.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;What this means is that we can pass something like this to SoundManager 2 and it will just play, as long as it returns a playable file.&lt;/p&gt;
&lt;p&gt;http://melodyserver_url/3y83ekkusahdua3e313&lt;/p&gt;
&lt;p&gt;Other things we used to get Hum working the way it does&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;jQuery - What can I say about this. Just the best of the best.&lt;/li&gt;
&lt;li&gt;Head.js Allows you to put JavaScript back in the head tag where it belongs, and downloads the js files in parallel&lt;/li&gt;
&lt;li&gt;facebox - A light-box for programmers&lt;/li&gt;
&lt;li&gt;Memcached - in memory cache to speeds everything up a lot and is actually required for some of the parts of Hum to work.&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Finally&lt;/h2&gt;
&lt;p&gt;What this means is that you can have your entire music collection available to you wherever you go, as long the server is accessible to you where you are. That could be on the internet, or on a LAN if you don’t need it accessible to the outside world or wherever. It is up to you.&lt;/p&gt;
&lt;p&gt;If you would like Melody or Hum to do more, let us know, or fork them, modify them, and make a pull request.&lt;/p&gt;
&lt;p&gt;What does this mean for Protonet? It means that not only will you be able to have your Protonet node with all the goodies that it provides, but now you will be able to have it configured to be a music client/server as well. Melody and Hum are likely to be the first of the third party apps integrated into Protonet. We will give you a simple interface to install and configure both Melody and Server. With Hum/Melody, what was great in Protonet is about to get better.&lt;/p&gt;
&lt;p&gt;Go ahead, Hum a Melody ;-)&lt;/p&gt;</description><link>http://blog.protonet.info/post/9831433036</link><guid>http://blog.protonet.info/post/9831433036</guid><pubDate>Mon, 05 Sep 2011 08:32:24 -0400</pubDate><dc:creator>ivercore</dc:creator></item><item><title>How To Setup A Cheap Exception Notifier For JavaScript</title><description>&lt;p&gt;It’s very common for back-end developers to implement a mechanism in production mode that tracks and aggregates exceptions.&lt;/p&gt;
&lt;p&gt;But what about your front-end code? How do you know when something on your website is seriously broken and you don’t see it since it only happens in a certain browser version, that you (or your QA department) isn’t testing on?&lt;/p&gt;
&lt;p&gt;JavaScript has defacto become one of the most popular programming languages on the web. Nowadays websites like Facebook, Twitter or GMail have a significant part of their application logic in their front-end.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I think it’s statistically more likely that exceptions happen on the client side than on the server side:&lt;br/&gt;&lt;/strong&gt;An important difference between your client side JavaScript and your server side language is, that your JavaScript is executed on thousands of different machines under different circumstances (different user agents, different OS, plugins, firewall, different internet connections, …) while your server side language runs in a stable environment that is under your control.&lt;/p&gt;
&lt;p&gt;With this blog post I’d like to show you a couple of ways how to implement a simple JavaScript exception notifier:&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;Option #1 - Let Google Analytics track your JavaScript errors&lt;/h2&gt;
&lt;p&gt;This is probably the easiest way especially if you are already using Google Analytics in your app.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
window.onerror = function(message, file, lineNumber) {
  _gaq.push([
   '_trackEvent',
   'error',
   file + ':' + lineNumber,
   message + ''
  ]);
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This option makes only sense if you are running a small to medium sized website. Keep in mind that Google Analytics wasn’t designed to handle exceptions. Also if you are running a rather large website, don’t piss off your marketing department by pushing your nerdy exceptions into their tool.&lt;/p&gt;
&lt;p&gt;Instead consider implementing option #2 or #3.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;Option #2 - Push it to your Apache error.log&lt;/h2&gt;
&lt;p&gt;This option is also rather tailored for low-traffic websites. Additionally you need some experience in inspecting Apache log files.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
window.onerror = function(message, file, lineNumber) {
  new Image().src = "/this_url_doesnt_exist?message="
    + encodeURIComponent(message)
    + "&amp;file=" + encodeURIComponent(file)
    + "&amp;lineNumber=" + encodeURIComponent(lineNumber);
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now each JavaScript error will generate a new log entry in your Apache’s error.log including all relevant error information (date, user agent, error message, file, …).&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;Option #3 - Use Airbrake&lt;/h2&gt;
&lt;p&gt;This is what &lt;strong&gt;we use at protonet&lt;/strong&gt; for collecting exceptions on the server side as well as on the client side.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://airbrakeapp.com/"&gt;Airbrake&lt;/a&gt; (formerly known as ‘Hoptoad’) is an app that takes your exceptions (regardless which programming language) and aggregates them for you.&lt;/p&gt;
&lt;p&gt;It’s very handy for teams since you can mark exceptions as resolved and if you register a paid account you can integrate it with GitHub or lighthouseapp.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lqs9gtvwLh1qcc3wc.png"/&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you want to send your JavaScript exceptions to Airbrake do the following:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Register an Airbrake account (&lt;a target="_blank" href="https://airbrakeapp.com/account/new/free"&gt;free&lt;/a&gt; or &lt;a target="_blank" href="https://airbrakeapp.com/account/new/"&gt;paid&lt;/a&gt;) and create a project&lt;/li&gt;
&lt;li&gt;Search for your api key (among other places you can find it when you click the “Edit this project” link)&lt;/li&gt;
&lt;li&gt;Include an Airbrake JavaScript notifier lib of your choice in your web app:&lt;br/&gt;We at protonet decided not to use the one that &lt;a target="_blank" href="http://hoptoadapp.com/javascripts/notifier.js"&gt;airbrake offers&lt;/a&gt; since it is way too big in terms of file size and logic for our needs (~8 KB or 3 KB gzipped). Instead we wrote our own lightweight lib. You can find it &lt;a target="_blank" href="https://github.com/protonet/simple-javascript-airbrake-notifier"&gt;here&lt;/a&gt; (including further instructions)&lt;/li&gt;
&lt;li&gt;Deploy, lean back, grab a cold beer and enjoy the incoming exceptions&lt;/li&gt;
&lt;/ol&gt;</description><link>http://blog.protonet.info/post/9620971736</link><guid>http://blog.protonet.info/post/9620971736</guid><pubDate>Wed, 31 Aug 2011 04:14:54 -0400</pubDate><category>error</category><category>exception</category><category>javascript</category><category>js</category><dc:creator>christopher-blum</dc:creator></item><item><title>Video</title><description>&lt;iframe src="http://player.vimeo.com/video/27912864" width="400" height="300" frameborder="0"&gt;&lt;/iframe&gt;&lt;br/&gt;&lt;br/&gt;</description><link>http://blog.protonet.info/post/9163124358</link><guid>http://blog.protonet.info/post/9163124358</guid><pubDate>Sat, 20 Aug 2011 08:49:01 -0400</pubDate><category>introduction</category><category>protonet</category><category>betahaus</category><dc:creator>christopher-blum</dc:creator></item><item><title>Filtercake: Protonet to go, or: Now what?! Pt. I</title><description>&lt;a href="http://filtercake.tumblr.com/post/2777423414/protonet-to-go-or-now-what-pt-i"&gt;Filtercake: Protonet to go, or: Now what?! Pt. I&lt;/a&gt;: &lt;p&gt;&lt;a href="http://filtercake.tumblr.com/post/2777423414/protonet-to-go-or-now-what-pt-i" target="_blank"&gt;filtercake&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Okay, I visited Protonet at the &lt;a href="http://hamburg.betahaus.de/" target="_blank"&gt;Betahaus Hamburg&lt;/a&gt; last thursday and took home a node installed on my old MacBook sporting an untouched fresh install of &lt;a href="http://www.ubuntu.com/desktop" target="_blank"&gt;Ubuntu 10.04&lt;/a&gt;. The node is running at home, right now.&lt;/p&gt;
&lt;p&gt;“&lt;strong&gt;What is the Protonet?&lt;/strong&gt;”, you might ask.&lt;/p&gt;
&lt;p&gt;Here’s the answer from &lt;a href="http://protonet.info/post/999541833/what-is-the-protonet" target="_blank"&gt;their blog&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lf49v9pDyM1qay5ij.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If I got it right so far, Protonet is a distributed (“decentralized”) Network, where everybody will be able set up their own node with the push of a button.&lt;/p&gt;
&lt;p&gt;So here are five bullets, also from &lt;a href="http://protonet.info/post/999541833/what-is-the-protonet" target="_blank"&gt;the blog&lt;/a&gt;, that should be enough to  get your undevided attention for a moment. Because it is already built. It’s a matter of months, until you can start using it. Free and for free, anywhere, for any purpose:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;&lt;li&gt;we want citizens to have an infrastructure they own themselves&lt;/li&gt;
&lt;li&gt;we want citizens to be the ones responsible for it, to maintain and to cultivate it&lt;/li&gt;
&lt;li&gt;we believe in responsibility, and we believe that only with taking responsibility freedom is possible&lt;/li&gt;
&lt;li&gt;we believe that building such an infrastructure needs to be as simple as pushing a button&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;and most important of all:&lt;/strong&gt; we believe that, for it to work, it needs to be awesomely fun to do it&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;
&lt;p&gt;“Most important of all.” Not the features. Not the speed, or the low price (“free”). It has to be fun to use it. “Press one button and it’s up and running.”&lt;/p&gt;
&lt;p&gt;&lt;img align="left" width="200" height="200" src="http://25.media.tumblr.com/tumblr_lf2l51O6Lh1qafu0so1_500.jpg"/&gt;&lt;/p&gt;
&lt;p&gt;And that’s exactly what they built. I copied two lines of shell code and pasted them in the  terminal. Script was running for about an hour, downloading tons of  stuff and compiling on the fly. And then it was up and running. I  created a user, uploaded the avatar, typed “hello world” and voila.&lt;/p&gt;
&lt;p&gt;At home I logged in with a MacBook, a Windows XP netbook and an iPhone. It’s there. It is up and running.&lt;/p&gt;
&lt;p&gt;If you’re interested in some background-thoughts on what this all means, have a look at the so-called “Protonet Primer” &lt;a href="http://www.slideshare.net/jelveh/protonet-primer" target="_blank"&gt;online on SlideShare&lt;/a&gt;, or &lt;a href="http://s.coop/protonetprimer" target="_blank"&gt;download the PDF (1.7 MB)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So, now what? &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Just let it sink in a little and spend some time daydreaming on what you could possibly use your own private network for - one that is connected to all other private networks. Don’t worry about any technical stuff - it will probably run with the push of a button. Just go wild.&lt;/p&gt;
&lt;p&gt;We will explore some use cases here in the next post, where you will be welcome to share your own ideas in the comments (as you are here, of course). Or write your own post and link it here or on the &lt;a href="http://protonet.info/" target="_blank"&gt;Protonet-blog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There are also lots of social (as in “society”) and even political implications to think about, too: this is pure, digital, global Anarchy. And &lt;a href="http://www.cleanternet.org/" target="_blank"&gt;the “Nazis-and-paedophiles”-police&lt;/a&gt; is probably waiting already.&lt;br/&gt;&lt;br/&gt;If you have any questions, direct them to the guys at Protonet. It says “Ask us anything!” in bold, so &lt;a href="http://protonet.info/ask" target="_blank"&gt;go and do so&lt;/a&gt;. &lt;a href="http://protonet.info/rss" target="_blank"&gt;Subscribe to their blog&lt;/a&gt; and stay on track &lt;a href="http://twitter.com/protonet" target="_blank"&gt;on twitter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You know, just do &lt;em&gt;something.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;See you soon.&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://blog.protonet.info/post/2778042628</link><guid>http://blog.protonet.info/post/2778042628</guid><pubDate>Sun, 16 Jan 2011 10:32:59 -0500</pubDate><category>protonet</category><category>betahaus</category><dc:creator>christopher-blum</dc:creator></item><item><title>The jQuery 'inview' Plugin</title><description>&lt;p&gt;A couple of months ago, we needed a way to detect whether an element is visible to the user.&lt;br/&gt; The use case behind this was that we wanted to implement an endless scrolling mechanism for the protonet dashboard timeline:&lt;br/&gt; If the user reaches the last message in the timeline more messages had to be loaded without the user clicking anywhere.&lt;br/&gt; You might have seen such thing in the new twitter web site.&lt;/p&gt;
&lt;p&gt;Thanks to Google, we stumbled upon &lt;a target="_blank" href="http://remysharp.com/2009/01/26/element-in-view-event-plugin/"&gt;this blog post written by Remy Sharp&lt;/a&gt;.&lt;br/&gt; There he shows off something that was exactly what we were searching for: A bindable event for jQuery which gets triggered as soon as the element appears in the browser’s viewport.&lt;/p&gt;
&lt;p&gt;The plugin was very suitable in the beginning. Then, when we broaden it’s usage, we noticed that a few essential things were missing:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;The plugin only honored vertical not horizontal coordinates: It was even triggered when the observed element was on the outer right or left of the viewport&lt;/li&gt;
&lt;li&gt;The plugin used the browser’s window.onscroll event to check whether an element is visible.&lt;br/&gt;The problem here is that elements also can come into view without the user performing a scroll. For instance an element could appear in the user’s view through an effect or by manipulating the dom (by removing or hiding elements before the observed element).&lt;/li&gt;
&lt;li&gt;Also, elements within &lt;em&gt;overflow: scroll;&lt;/em&gt; containers weren’t respected, since scrolling in such doesn’t fire the window.onscroll event.&lt;/li&gt;
&lt;li&gt;The event wasn’t working at all when using with jQuery’s mighty live/delegate methods&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Also we discovered a few bugs: One for example was that the event was triggered on elements that weren’t in the dom tree. Another issue was that it didn’t seem to work correctly in Mobile Safari on iOS (iPad, iPhone) versions.&lt;/p&gt;
&lt;p&gt;Luckily someone already brought the code &lt;a target="_blank" href="https://github.com/zuk/jquery.inview"&gt;to GitHub&lt;/a&gt;.  Starting a “hardcore forking action” and implementing/fixing the above mentioned issues was the obvious thing to do.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And now here we are, introducing a rebrushed, still lightweight, &lt;a target="_blank" href="https://github.com/protonet/jquery.inview"&gt;jQuery ‘inview’ plugin&lt;/a&gt;, with *drumroll* full test coverage.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;Browser Support&lt;/h2&gt;
&lt;p&gt;The plugin is compatible with the following browsers we tested:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Firefox 3+&lt;/li&gt;
&lt;li&gt;Safari 3+&lt;/li&gt;
&lt;li&gt;Chrome 7+&lt;/li&gt;
&lt;li&gt;Opera 10+&lt;/li&gt;
&lt;li&gt;IE 6+&lt;/li&gt;
&lt;li&gt;Mobile Safari on iPad 4.2.2&lt;/li&gt;
&lt;li&gt;Fennec 4b on Android 2.2&lt;/li&gt;
&lt;li&gt;Opera Mobile 10.1b on Android 2.2&lt;/li&gt;
&lt;li&gt;Mobile WebKit on Android 2.2&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;Usage&lt;/h2&gt;
&lt;h4&gt;#1 Simple example&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;$("#foobar").bind("inview", function(isVisible) {
  // Event is triggered once the element becomes visible in the browser's viewport, and once when it becomes invisible
  if (isVisible) {
    console.log("element #foobar became visible in the browser's viewport");
  } else {
    console.log("element #foobar became invisible in the browser's viewport");
  }
});&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;#2 Only load images when they appear in the viewport for performance reasons (reduce amount of http requests, yslow, yada yada …)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;$('img[data-src]').live('inview', function(event, isVisible) {
  if (!isVisible) { return; }
  
  var img = $(this);
  img
    .css('opacity', 0)
    // Show a smooth animation when the image is loaded
    .load(function() { img.animate({ opacity: 1 }, 500); })
    // Change src
    .attr('src', img.attr('data-src'))
    // Remove it from matching set of elements of live event selector
    .removeAttr('data-src');
});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;See this example, showing an overload of lolcats, &lt;a target="_blank" href="http://tifftiff.de/jquery.inview/example/live_event.htm"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;Links&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;&lt;a target="_blank" href="https://github.com/protonet/jquery.inview"&gt;GitHub repository&lt;/a&gt; (check the README or the other examples if this blog post didn’t provide answers to all your questions)&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://tifftiff.de/jquery.inview/example/live_event.html"&gt;Example: Loading lolcat images when they are in the viewport&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://tifftiff.de/jquery.inview/test/"&gt;QUnit test suite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://remysharp.com/2009/01/26/element-in-view-event-plugin/"&gt;Original blog post by Remy Sharp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;PS: If you are bound to the Prototype library, &lt;a target="_blank" href="https://github.com/xing/prototype-within-viewport/"&gt;check this similar solution&lt;/a&gt;, also authored by myself.&lt;/p&gt;</description><link>http://blog.protonet.info/post/2516624585</link><guid>http://blog.protonet.info/post/2516624585</guid><pubDate>Wed, 29 Dec 2010 16:06:00 -0500</pubDate><category>jquery</category><category>viewport</category><category>javascript</category><category>prototype</category><category>inview</category><category>performance</category><category>lazyload</category><dc:creator>christopher-blum</dc:creator></item><item><title>Visualizing the protonet using Raphaël.js</title><description>&lt;p&gt;For protonet we needed a way to show the structure of the protonet to the user in a compact and visually pleasing way.&lt;/p&gt;
&lt;h1&gt;1. Interactive graphics on the Net.&lt;/h1&gt;
&lt;p&gt;There are a number of possibilities when it comes to dynamic graphics on the net, just to name a few:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;plain JavaScript (maybe with some DIV-tags flying around)&lt;/li&gt;
&lt;li&gt;HTML5 Canvas Tag&lt;/li&gt;
&lt;li&gt;Flash&lt;/li&gt;
&lt;li&gt;Java&lt;/li&gt;
&lt;li&gt;SVG&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;We chose SVG and on top of that there is the beautifully simple yet powerful Raphaël.js framework.&lt;br/&gt;&lt;br/&gt;Let me summarize the advantages of SVG over the other options mentioned:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;can attach DOM events on any visual element&lt;/li&gt;
&lt;li&gt;anti-aliased rendering for free (see &lt;a href="http://en.wikipedia.org/wiki/Aliasing" target="_blank"&gt;http://en.wikipedia.org/wiki/Aliasing&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;scaling of visuals has no effect on the quality (see &lt;a href="http://en.wikipedia.org/wiki/Vector_graphics" target="_blank"&gt;http://en.wikipedia.org/wiki/Vector_graphics&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Sure, there are some disadvantages, but we will ignore them for now, because that is not exactly the topic of this post.&lt;/p&gt;
&lt;h1&gt;2. What kind of graph is a protonet?&lt;/h1&gt;
&lt;p&gt;A network is just a graph, but there are certain kinds of graphs. A protonet network structure can be very chaotic and random, so its most likely a general kind of graph. But when it comes to the part of the network where clients connect to their local protonet node, its a simple tree graph. This distinction is important, because the layout algorithms you choose directly depend on the type of graph you want to visualize.&lt;/p&gt;
&lt;h1&gt;3. What is a beautiful layout?&lt;/h1&gt;
&lt;p&gt;Suppose you have a group of nodes that are connected in a way that they form a kind of ring. The most structured way to display them would be to create a layout where the ring they form is clearly visible. So we have Simplicity (= make the structure visible) as the number one criterion for the beauty of a graph.&lt;br/&gt;&lt;br/&gt;Simplicity comes from a number of more specific characteristics:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;edges should not cross each other&lt;/li&gt;
&lt;li&gt;edge lengths should all be approx. the same&lt;/li&gt;
&lt;li&gt;distances between nodes should all be approx. the same&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;The topic of graph layout is a wide one and cannot be covered in an appropriate way in this blog post, so if you are interested in graph visualization, go ahead to &lt;a href="http://en.wikipedia.org/wiki/Information_visualization" target="_blank"&gt;http://en.wikipedia.org/wiki/Information_visualization&lt;/a&gt; and also &lt;a href="http://en.wikipedia.org/wiki/Graph_drawing" target="_blank"&gt;http://en.wikipedia.org/wiki/Graph_drawing&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;What does this mean for protonet?&lt;/p&gt;
&lt;p&gt;For protonet we essentially need two distinct graph drawing algorithms because we have two different types of (sub)graphs:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;random graph = the connected protonet nodes&lt;/li&gt;
&lt;li&gt;and tree subgraph(s) = the clients connected to their protonet node&lt;/li&gt;
&lt;/ul&gt;&lt;h1&gt;4. Force based approach.&lt;/h1&gt;
&lt;p&gt;What automaticly springs into mind when it comes to general graphs, is a physics/force-based layout. In such a modell the nodes are charged particles of the same charge, which means they move away from each other, and the edges are springs that create an opposite force which brings the connected nodes closer together. Here is a piece of pseudocode that draws such graph using physical forces:&lt;br/&gt;&lt;br/&gt;- place the nodes at random positions&lt;br/&gt;- iterate for about 50-100 times:&lt;br/&gt;  - calculate the attractive and repulsive forces&lt;br/&gt;  - apply the forces to each node&lt;br/&gt;  - draw the graph&lt;br/&gt;&lt;br/&gt;The forces (as described here: &lt;a href="http://en.wikipedia.org/wiki/Force" target="_blank"&gt;http://en.wikipedia.org/wiki/Force&lt;/a&gt; based_algorithms_%28graph_drawing%29) are calculated using the equation of Coulomb for the charged particles and Hooke’s Law for the spring forces.&lt;br/&gt;&lt;br/&gt;After a number of iterations (50-100) the graph should be displayed in a visually simple and ordered way.&lt;br/&gt;&lt;br/&gt;&lt;img src="http://media.tumblr.com/tumblr_l80aoxpKFF1qcm8rm.png"/&gt;&lt;/p&gt;
&lt;p&gt;This is, of course, a rather simplified version of the algorithm. To give you an idea of what is going on in reality, here is the actual code from the protonet network layout code base:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Graph.prototype.layout = function() {&lt;br/&gt;&lt;br/&gt;  // determine amount of nodes (not clients!)&lt;br/&gt;  var normal_nodes = new Array();&lt;br/&gt;  for (var n = 0; n &lt; this.nodes.length; n++) {&lt;br/&gt;    var node = this.nodes[n];&lt;br/&gt;    if (node.info.type != 'client')&lt;br/&gt;      normal_nodes.push(node);&lt;br/&gt;  }&lt;br/&gt;&lt;br/&gt;  // special case: one node&lt;br/&gt;  if (normal_nodes.length == 1) {&lt;br/&gt;    var node = normal_nodes[0];&lt;br/&gt;    node.position.x = this.w / 2;&lt;br/&gt;    node.position.y = this.h / 2;&lt;br/&gt;    this.layout_clients();&lt;br/&gt;    return true;&lt;br/&gt;  }&lt;br/&gt;&lt;br/&gt;  var delta_t = 1000.0 / 50.0; // starts 50 times within 1000 ms&lt;br/&gt;&lt;br/&gt;  if (this.temperature &gt; 0.0)&lt;br/&gt;  {&lt;br/&gt;    this.paper.clear();&lt;br/&gt;&lt;br/&gt;    // calculate repulsive forces&lt;br/&gt;    for (var n = 0; n &lt; this.nodes.length; n++) {&lt;br/&gt;      var node = this.nodes[n];&lt;br/&gt;      node.disp = new Vertex(0, 0);&lt;br/&gt;      node.adjusted = false;&lt;br/&gt;      for (var m = 0; m &lt; this.nodes.length; m++) {&lt;br/&gt;        var otherNode = this.nodes[m];&lt;br/&gt;        if (node.number != otherNode.number) {&lt;br/&gt;&lt;br/&gt;          var delta = node.position.diff( otherNode.position );&lt;br/&gt;          if (Math.floor(delta.len()) == 0) delta = new Vertex(1,1);&lt;br/&gt;          var d = delta.len();&lt;br/&gt;&lt;br/&gt;          node.disp = &lt;br/&gt;            node.disp.sum(&lt;br/&gt;              delta.quot(d).prod( &lt;br/&gt;                this.force_repulse(d * node.mass)&lt;br/&gt;              )&lt;br/&gt;            );&lt;br/&gt;        }&lt;br/&gt;      }&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    // calculate attractive forces&lt;br/&gt;    for (var e = 0; e &lt; this.edges.length; e++) {&lt;br/&gt;      var edge = this.edges[e];&lt;br/&gt;      var u = edge.fromNode;&lt;br/&gt;      var v = edge.toNode;&lt;br/&gt;&lt;br/&gt;      var delta = v.position.diff(u.position);&lt;br/&gt;      if (Math.floor(delta.len()) == 0) delta = new Vertex(1,1);&lt;br/&gt;      var d = delta.len();&lt;br/&gt;&lt;br/&gt;      v.disp =&lt;br/&gt;        v.disp.diff(&lt;br/&gt;          delta.quot(d).prod(&lt;br/&gt;            this.force_attract(d)&lt;br/&gt;          )&lt;br/&gt;        );&lt;br/&gt;&lt;br/&gt;      u.disp = &lt;br/&gt;        u.disp.sum(&lt;br/&gt;          delta.quot(d).prod(&lt;br/&gt;            this.force_attract(d)&lt;br/&gt;          )&lt;br/&gt;        );  &lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    for (var n = 0; n &lt; this.nodes.length; n++) {&lt;br/&gt;      var node = this.nodes[n];&lt;br/&gt;      if (node.info.type != 'client') {&lt;br/&gt;        node.position = &lt;br/&gt;          node.position.sum(&lt;br/&gt;            node.disp.quot(node.disp.len()).prod(&lt;br/&gt;              this.min(node.disp)&lt;br/&gt;            )&lt;br/&gt;          );&lt;br/&gt;&lt;br/&gt;        // don't let them escape the canvas&lt;br/&gt;        if (node.position.x &lt; 0)      node.position.x = 0;&lt;br/&gt;        if (node.position.x &gt; this.w) node.position.x = this.w;&lt;br/&gt;        if (node.position.y &lt; 0)      node.position.y = 0;&lt;br/&gt;        if (node.position.y &gt; this.h) node.position.y = this.h;&lt;br/&gt;      }&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    this.layout_clients();&lt;br/&gt;    this.cool();&lt;br/&gt;  }&lt;br/&gt;&lt;br/&gt;  return true; &lt;br/&gt;};&lt;br/&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Among other things, there is a also a cooling function that slows down the motion in the graph and also ways of avoiding nodes beeing at the same position. If you have any questions about the code, feel free to ask here!&lt;br/&gt;&lt;br/&gt;But what about the clients connected to the protonet node, that form tree subgraphs?&lt;/p&gt;
&lt;h1&gt;5. Circular approach.&lt;/h1&gt;
&lt;p&gt;Tree graphs can easily be layouted by placing them on a circle around the central protonet node and drawing the edges between them inside the circle. Thus no edges will overlap, since the clients are only connected to the node not to each other.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;img src="http://media.tumblr.com/tumblr_l80ay0YLlG1qcm8rm.png"/&gt;&lt;br/&gt;&lt;br/&gt;Simple, straight forward and faster as a force-based calculation.&lt;br/&gt;&lt;br/&gt;If you want to experiment with layout techniques yourself, you can have a look into the complete code of the protonet graphkit package:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Graph.prototype.layout_clients = function() {&lt;br/&gt;  // layout client nodes circular around each node&lt;br/&gt;  for (var n = 0; n &lt; this.nodes.length; n++) {&lt;br/&gt;    var node = this.nodes[n];&lt;br/&gt;    if (node.info.type != 'client') {&lt;br/&gt;      // find client node connected to this one&lt;br/&gt;      var clients = new Array();&lt;br/&gt;      for (var e = 0; e &lt; this.edges.length; e++) {&lt;br/&gt;        var edge = this.edges[e];&lt;br/&gt;        var u = edge.fromNode;&lt;br/&gt;        var v = edge.toNode;&lt;br/&gt;        if ((u.number == node.number &amp;&amp; v.info.type == 'client') ||&lt;br/&gt;            (v.number == node.number &amp;&amp; u.info.type == 'client')) {&lt;br/&gt;&lt;br/&gt;          if (u.number == node.number)&lt;br/&gt;            clients.push(v);&lt;br/&gt;          else&lt;br/&gt;            clients.push(u);&lt;br/&gt;        }&lt;br/&gt;      }&lt;br/&gt;&lt;br/&gt;      // position clients circular around node&lt;br/&gt;      if (clients.length &gt; 0) {&lt;br/&gt;        var radius = (this.small ? 5.0 : 10.0) + (clients.length * 5.0);&lt;br/&gt;        var angle  = 360.0 / clients.length;&lt;br/&gt;        //console.log(angle);&lt;br/&gt;        for (var c = 0; c &lt; clients.length; c++) {&lt;br/&gt;          var client = clients[c];&lt;br/&gt;          client.info.angle = (c &gt; Math.floor(clients.length / 2) ? 270 : 90) - angle * c;&lt;br/&gt;          client.position.x = node.position.x + Math.sin(deg_to_rad(angle * c)) * radius;&lt;br/&gt;          client.position.y = node.position.y + Math.cos(deg_to_rad(angle * c)) * radius;&lt;br/&gt;          client.info.nodepos = node.position;&lt;br/&gt;        }&lt;br/&gt;      }&lt;br/&gt;    }&lt;br/&gt;  }  &lt;br/&gt;};&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;6. Experiment with Graphkit.js&lt;/h1&gt;
&lt;p&gt;To draw a graph using the graphkit package, you have to include jQuery, raphael.js and graphkit.js (&lt;a href="http://github.com/protonet/graphkit/blob/master/graphkit.js" target="_blank"&gt;http://github.com/protonet/graphkit/blob/master/graphkit.js&lt;/a&gt;) into your webpage. Then you clone the Graph prototype and add nodes and edges to it.&lt;br/&gt;&lt;br/&gt;Finally call the render() method once or install a JavaScript interval and watch the network adjust itself.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var NetworkGraph;&lt;br/&gt;var ourInterval;&lt;br/&gt;&lt;br/&gt;// make graph&lt;br/&gt;NetworkGraph = new Graph("network", 50, false);&lt;br/&gt;&lt;br/&gt;// create some nodes&lt;br/&gt;var sn = new Node(1, {name: "super", type: "supernode"});&lt;br/&gt;&lt;br/&gt;var n1 = new Node(2, {name: "n#1",   type: "node"});&lt;br/&gt;var n2 = new Node(3, {name: "node#2",   type: "node"});&lt;br/&gt;var n3 = new Node(4, {name: "node#3",   type: "node"});&lt;br/&gt;var n4 = new Node(5, {name: "node#4",   type: "node"});&lt;br/&gt;var n5 = new Node(6, {name: "node#5",   type: "node"});&lt;br/&gt;var n6 = new Node(7, {name: "node#6",   type: "node"});&lt;br/&gt;&lt;br/&gt;var c1 = new Node(8,  {name: "client#1", type: "client"});&lt;br/&gt;var c2 = new Node(9,  {name: "client#2", type: "client"});&lt;br/&gt;var c3 = new Node(10, {name: "client#3", type: "client"});&lt;br/&gt;var c4 = new Node(11, {name: "client#4", type: "client"});&lt;br/&gt;var c5 = new Node(12, {name: "client#5", type: "client"});&lt;br/&gt;&lt;br/&gt;NetworkGraph.addNode(sn);&lt;br/&gt;NetworkGraph.addNode(n1);&lt;br/&gt;NetworkGraph.addNode(n2);&lt;br/&gt;NetworkGraph.addNode(n3);&lt;br/&gt;NetworkGraph.addNode(c1);&lt;br/&gt;NetworkGraph.addNode(c2);&lt;br/&gt;NetworkGraph.addNode(c3);&lt;br/&gt;NetworkGraph.addNode(c4);&lt;br/&gt;NetworkGraph.addNode(c5);&lt;br/&gt;&lt;br/&gt;// create some edges&lt;br/&gt;NetworkGraph.addEdge(new Edge(sn, n1));&lt;br/&gt;NetworkGraph.addEdge(new Edge(sn, n2));&lt;br/&gt;NetworkGraph.addEdge(new Edge(sn, n3));&lt;br/&gt;&lt;br/&gt;NetworkGraph.addEdge(new Edge(n1, n2));&lt;br/&gt;NetworkGraph.addEdge(new Edge(n2, n3));&lt;br/&gt;&lt;br/&gt;NetworkGraph.addEdge(new Edge(n1, c1));&lt;br/&gt;NetworkGraph.addEdge(new Edge(n1, c2));&lt;br/&gt;NetworkGraph.addEdge(new Edge(n1, c3));&lt;br/&gt;NetworkGraph.addEdge(new Edge(n1, c4));&lt;br/&gt;NetworkGraph.addEdge(new Edge(n1, c5));&lt;br/&gt;&lt;br/&gt;ourInterval = setInterval("NetworkGraph.render()", 100);&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The parameters of the Graph constructor are:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;The id of the HTML container to use for drawing.&lt;/li&gt;
&lt;li&gt;The maximum number of iterations (If the graph is considered “beautiful” the algorithm may stop before that).&lt;/li&gt;
&lt;li&gt;If a short or the normal version of the graph node should be drawn. In the short version clients are drawn without a label.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;The algorithm is not perfect - You can download the source here and have fun with it ;) - &lt;a href="http://github.com/protonet/graphkit" target="_blank"&gt;http://github.com/protonet/graphkit&lt;/a&gt;&lt;/p&gt;</description><link>http://blog.protonet.info/post/1041364814</link><guid>http://blog.protonet.info/post/1041364814</guid><pubDate>Tue, 31 Aug 2010 03:59:00 -0400</pubDate><dc:creator>tkirchner</dc:creator></item><item><title>Protonet App for webOS: Creating a webos socket</title><description>&lt;p&gt;So we’re building this thing we call protonet we all use it and we have fun using it. But when my brother isn’t sitting at his laptop, he’s virtually unreachable. After building a rudimentary iPhone client, I figured that if I can chat in the train on my iPhone, then why couldn’t my brother, Ali, on his Palm Pre? So, I set out to make a client for his phone.&lt;/p&gt;

&lt;p&gt;To understand why it’s necessary to do the things described in this blog post you need to understand how the palm SDK works.
When Palm called the thing webOS they didn’t call it that way because thought it might sound cool, they called it that way because essentially every application that ran on the pre in the beginning is actually a web application. Subsequently as with most web applications initially you could only write your palm pre applications in HTML/Js/css. In webOS terms this is called the MOJO toolkit. The result is that while it makes it very simple to write applications for the Pre it’s not possible to open sockets and do other things.&lt;/p&gt;

&lt;p&gt;The first step to overcome this was to allow creating SDL applications for games and similar applications. That still doesn’t solve our socket issue for normal applications though. So the second step is the so called Hybrid application. Think of it as a web application that has a daemon process loaded on start which is written in C or C++.&lt;/p&gt;

&lt;p&gt;The thing about these daemons is that they actually run in the SDL event loop. The first question would be why didn’t you just use SDL_net? SDL_net doesn’t support asynchronous operation and it doesn’t exactly have the most stable history in the world. You would have to use net2, which wraps SDL_net into its own thread. I also did not want to use libevent, partly because it adds a big library as dependency and partly because it actually IS an event loop.&lt;/p&gt;

&lt;p&gt;Here’s a quick overview of what how it works:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;You create the web application&lt;/li&gt;
&lt;li&gt;You create a c plugin&lt;/li&gt;
&lt;li&gt;You tell the web application to load the c plugin as an object, that will allow you to access the registered functions in javascript using
$(‘myPlugin’).whateverFunction&lt;/li&gt;
&lt;li&gt;You communicate between plugin and webapp using callbacks you register on each side&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;So, let’s get started! I’m going to start with the Javascript/HTML side and then explain the C side and I’ll show you how to glue them together along the way. The source-code for this project is available on &lt;a href="http://github.com/protonet/webos-socket" target="_blank"&gt;http://github.com/protonet/webos-socket&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you already have some webOS experience, you might probably want to skip section 1.&lt;/p&gt;

&lt;h1&gt;Section 1: The basics&lt;/h1&gt;

&lt;p&gt;When you launch your application you are pretty much in the app-assistant.js that’s where we’re going to tell it to load our socket scene. Scenes are the viewports in webOS terms.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;this.stageController.pushScene("socket", new socket());
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The HTML for this view is in “mojo/app/views/socket/socket-scene.html”. In there we create a Textfield for the server ip address, a button to connect and a place to output some data to:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;div x-mojo-element="TextField" id="ipField" class="ipClass" name="IpAddress"&gt;&lt;/div&gt;
&lt;div x-mojo-element="Button" id="ConnectBtn" class="connectClass" name="Connect"&gt;&lt;/div&gt;  
&lt;div id="status"&gt;&lt;/div&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We then need to instantiate the mojo elements in the views controller, which is the “app/controllers/socket-assistant.js” as defined in the sources.json file.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;this.controller.setupWidget('ConnectBtn',
  this.attributes = {
  },
  this.model = {
    label: 'Connect',
    disabled: false
  }
);
this.controller.setupWidget("ipField",
  this.attributes = {
    hintText: $L("ip address"),
    multiline: false,
    enterSubmits: true,
    focus: true
  },
  this.model = {
    value: "192.168.1.136",
    disabled: false
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That should be pretty self explanatory. Here’s a link to the &lt;a href="http://developer.palm.com/index.php?option=com_content&amp;view=article&amp;id=1932&amp;Itemid=310" target="_blank"&gt;textfield reference&lt;/a&gt; and the &lt;a href="http://developer.palm.com/index.php?option=com_content&amp;view=article&amp;id=1913&amp;Itemid=289" target="_blank"&gt;button reference&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We then tell the application to listen for taps on the connect button:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Mojo.Event.listen(this.controller.get("ConnectBtn"),Mojo.Event.tap, this.handleConnect);
&lt;/code&gt;&lt;/pre&gt;

&lt;h1&gt;Section 2: The hybrid glue&lt;/h1&gt;

&lt;p&gt;First of all you will need to add&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"plug-ins": true
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;to your appinfo.json. If you do not do this, the plugin application/daemon will not start no matter what. And it won’t throw any exceptions either. It will just silently fail.&lt;/p&gt;

&lt;p&gt;Once you’ve done that you tell your scene to load the plugin and you create a remote control that is usable from your javascript code.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;object type="application/x-palm-remote" id="socketPlugin" height="1" width="1" x-palm-pass-event="true"&gt;
  &lt;param name="appid" value="com.protonet.sockettest"&gt;
  &lt;param name="exe" value="socket_plugin"&gt;
&lt;/object&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Again pretty self explanatory. socket_plugin is the name of the executable you package with your application. socketPlugin will become your remote control. So if you use $(‘socketPlugin’) you can access methods that were declared within the plugin.&lt;/p&gt;

&lt;p&gt;So how do you use this? You put the above code in the top of the socket-scene.html. We already have a callback for a tap on the connect button defined in previous section. Let’s fill it with life:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  handleConnect: function(event)
  {
    $('socketPlugin').openSocket($('ipField').mojo.getValue(), 2000);
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The above code will actually execute a function that is registered inside your C plugin and pass it the value of our ip address text field and the port number 2000.&lt;/p&gt;

&lt;p&gt;We also create a callback function for the plugin to use whenever it has data available:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$('socketPlugin').didReceiveData = this.didReceiveData.bind(this);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And we bind it to the following function:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  didReceiveData: function(a)
  {
    $('status').innerHTML = String(a);
  },
&lt;/code&gt;&lt;/pre&gt;

&lt;h1&gt;Section 3: The actual plugin&lt;/h1&gt;

&lt;p&gt;The plugin will have it’s own appinfo in which you will specify how much memory consumption is allowed and what kind it is. In this case the file is called socket_plugin_appinfo.json&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
    "type": "hybrid",
    "requiredMemory": 5
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The basic structure is going to look like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;initialize_SDL();
initialize_PDL();

RegisterYourJSFunctions();

do {
    ProcessSDLEventLoop();
} while (Event.type != SDL_QUIT);

cleanupBeforeQuit();
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Functions that should be callable from your mojo/JS code will always be declared in the following way:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;PDL_bool openSocket(PDL_JSParameters *params)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then you need to actually register these to make them available:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;PDL_RegisterJSHandler("openSocket", openSocket);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Here’s what we do:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;JS calls our openSocket function&lt;/li&gt;
&lt;li&gt;We process the parameters, since this isn’t strictly typed. Keep in mind that the whole example is very basic and there’s virtually no exception handling. I’m basically considering a best case scenario.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;PDL has it’s own helper functions to handle parameter parsing.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if (PDL_GetNumJSParams(params) &lt; 2 )
{
    PDL_JSException(params, "You must provide the ip address and port");
    return PDL_TRUE;
}
const char *ip_address = PDL_GetJSParamString(params, 0);
int port               = PDL_GetJSParamInt(params, 1);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;PDL_JSException will actually throw an exception that you will not see in the application itself but may very well see using the
palm-log application.&lt;/p&gt;

&lt;p&gt;Let’s take a look at how we call the javascript callback for receiving data works:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;const char *params[1];
params[0] = theData;
PDL_Err mjErr = PDL_CallJS("didReceiveData", params, 1);
if ( mjErr != PDL_NOERROR )
{
    printf("error: %s\n", PDL_GetError());
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We will just call the callback defined in the socket-assistant.js with one parameter which is a string. Again this is self explanatory if you’ve seen it once.&lt;/p&gt;

&lt;h1&gt;Section 4: Building a basic asynchronous socket&lt;/h1&gt;

&lt;p&gt;The problem to solve was the following:&lt;/p&gt;

&lt;p&gt;How do you create a non blocking socket that works with the SDL event loop without too much effort?&lt;/p&gt;

&lt;p&gt;My solution was using SIGIO. Basic explanation:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;You create a socket&lt;/li&gt;
&lt;li&gt;You register a signal handler for SIGIO&lt;/li&gt;
&lt;li&gt;You make the socket asynchronous and let the signal handler do the rest&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;What happens is this:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;You connect to the server and you don’t need to worry about the SDL_event loop&lt;/li&gt;
&lt;li&gt;Once data is available for reading the signal handler kicks in. We proccess the data and may send it to our didReceiveData JS callback.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;So what do you do when you want to handle multiple socket connections at once? Well you use sa_sigaction and set a proper context. Either that or you wrap your socket connections into threads and instead of registering your signal handler to the current pid with getpid, you register them to the threads gettid. I haven’t tried the latter though.&lt;/p&gt;

&lt;p&gt;The result looks as follows:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if ((sock = socket(AF_INET, SOCK_STREAM, 0)) &lt; 0){
    printf("socket() failed");
    return -1;
}

/* Set up the server address structure */
memset(&amp;sockaddr, 0, sizeof(sockaddr));       /* Zero out structure */
sockaddr.sin_family = AF_INET;                /* Internet family */
sockaddr.sin_addr.s_addr = inet_addr(ip_address); /* Any incoming interface */
sockaddr.sin_port = htons(port);              /* Port */

/* Bind to the local address */
if (connect(sock, (struct sockaddr *) &amp;sockaddr, sizeof(sockaddr)) &lt; 0){
    printf("connect() failed");
    return -1;
}

/* Set signal handler for SIGIO */
handler.sa_sigaction = SIGIOHandler;
/* Create mask that mask all signals */
if (sigfillset(&amp;handler.sa_mask) &lt; 0){
    printf("sigfillset() failed");
    return -1;
}
/* No flags */
handler.sa_flags = 0;

if (sigaction(SIGIO|SIGHUP, &amp;handler, 0) &lt; 0){
    printf("sigaction() failed for SIGIO");
    return -1;
}

/* We must own the socket to receive the SIGIO message */
if (fcntl(sock, F_SETOWN, getpid()) &lt; 0){
    printf("Unable to set process owner to us");
    return -1;
}

/* Arrange for nonblocking I/O and SIGIO delivery */
if (fcntl(sock, F_SETFL, O_NONBLOCK | FASYNC) &lt; 0){
    printf("Unable to put client sock into non-blocking/async mode");
    return -1;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h1&gt;Section 5: Debugging/Running etc.&lt;/h1&gt;

&lt;p&gt;You can build and run the example using:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mac/package-it.sh
palm-install com.protonet.sockettest_1.0.0_all.ipk
palm-launch com.protonet.sockettest
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To see the Javascript exceptions you can then do:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;palm-log -f com.protonet.sockettest
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;However since I couldn’t figure out how to see the printf log messages. I wrote my log messages to the syslog
You might just want to ssh to the palm pre once it’s hooked up your USB and then tail the syslog.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ssh -l 10022 root@localhost
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;HTH Reza Jelveh&lt;/p&gt;

&lt;h1&gt;FAQ&lt;/h1&gt;

&lt;p&gt;Q. Why isn’t the plugin launching?&lt;/p&gt;

&lt;p&gt;A. Make sure you have&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;echo "filemode.755=socket_plugin" &gt; $STAGING_DIR/package.properties
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;somewhere in your packaging script.&lt;/p&gt;

&lt;p&gt;also make sure you have&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"plug-ins": true
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;in your appinfo.json&lt;/p&gt;

&lt;p&gt;Q. How would I package my socket in a thread?&lt;/p&gt;

&lt;p&gt;A. You need to replace getpid with gettid&lt;/p&gt;

&lt;p&gt;Q. The application doesn’t work in the emulator&lt;/p&gt;

&lt;p&gt;A. You cannot test hybrid applications in the emulator, yet. The emulator is i386 but the libraries provided by the Palm toolchain are arm. That might change in the future but for now your stuck with getting a real webOS device.&lt;/p&gt;</description><link>http://blog.protonet.info/post/1031949836</link><guid>http://blog.protonet.info/post/1031949836</guid><pubDate>Sun, 29 Aug 2010 13:32:00 -0400</pubDate><category>hybrid</category><category>palm</category><category>palmpre</category><category>pdk</category><category>pdl</category><category>plugin</category><category>pre</category><category>protonet</category><category>socket</category><category>webos sockets</category><dc:creator>flyingfishman</dc:creator></item><item><title>Hey, how far have you gone. Where can i try the router - or buy it or download the soft?&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Regards&lt;br /&gt;&#13;
Georg  - Spameater@muckefuck.org</title><description>&lt;p&gt;Hi Georg! We’re currently working on our release preparations and running tests with the hardware we’ll be shipping. We had a batch of ten units produced and those are currently being deployed on customer sites. As soon as we get through that we’ll be putting a version of the interface online (within the next weeks) plus pics, videos and more details on the hardware. You’ll then be able to buy one on our page. :)&lt;/p&gt;</description><link>http://blog.protonet.info/post/1014064231</link><guid>http://blog.protonet.info/post/1014064231</guid><pubDate>Thu, 26 Aug 2010 08:24:00 -0400</pubDate><dc:creator>dudemeister</dc:creator></item><item><title>The Art Of Turning URLs Into A User Readable Preview</title><description>&lt;p&gt;&lt;em&gt;If you’re of the impatient kind click &lt;a target="_blank" href="http://protonet.tifftiff.de/text_extensions/"&gt;here&lt;/a&gt; for the demo - otherwise enjoy the great finale ;).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In this blog post I’d like to introduce you to a technology that we here at protonet call &lt;strong&gt;“Text Extensions”&lt;/strong&gt;.&lt;br/&gt;Text extensions are small embeddable representations of urls mentioned in real time chat messages. Every time a user wants to share an url with the community we generate a preview including the most important information (title, short description, thumbnail, …) representing the website.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l7of3xrmZT1qcc3wc.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;This approach gives our users a series of benefits:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;The sender doesn’t need to explain what’s behind the url&lt;/li&gt;
&lt;li&gt;The Recipient gets more much more information than a link and can then decide whether it makes sense for him to leave protonet - for the moment - and give another (external) page his attention. Sometimes the preview is so good that the user doesn’t need to leave our chat in order to get that content. This is specially the case where we’re able to reflect the main information and interaction in the text extension: Twitter status updates, Slideshare presentations, YouTube videos, Flickr images, Google Maps, …&lt;/li&gt;
&lt;li&gt;Text Extensions generate more valuable data for our search index since we get all information associated with an url. Users don’t necessarily need to ask google for interesting pages related to a specific topic. At protonet they get search results that are locally and socially relevant. The users themselves are web crawlers delivering highly relevant external content.&lt;/li&gt;
&lt;li&gt;Text Extensions replace the need to use a social bookmarking tool (delicious, google bookmarks, …). Protonet users just have to share their urls with the community and are still able to find them in the future by searching for related keywords.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;Ok, so how do we fetch external data?&lt;/h2&gt;
&lt;p&gt;First let’s have a look at the tool that helps us scraping external web content:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;YQL&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Amongst other APIs we take advantage of a great service provided by Yahoo. It’s called Yahoo Query Language (YQL). YQL allows us to query the web by using simple SQL statements. In the “where” clause of those statements we can specify the url to fetch content for and also optionally an xpath selector. Using xpath selectors we ensure that YQL only gives back HTML segments that are of interest to us (such as meta tags).&lt;br/&gt;From my personal point of view xpath is not the best way for filtering/selecting html, but that’s just the opinion of a frontend developer who is used to CSS selectors. :-)&lt;/p&gt;
&lt;blockquote&gt;// Example query to fetch meta tags and title&lt;br/&gt;SELECT * FROM html WHERE url = ‘http://www.amazon.de’ AND xpath=’descendant-or-self::title | descendant-or-self::meta’&lt;br/&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;Getting structured machine readable data&lt;/h2&gt;
&lt;p&gt;In order to get the most relevant information for an url we rely on a bunch of (more or less) web standards that have evolved over the last years.&lt;/p&gt;
&lt;h3&gt;&lt;br/&gt;#1 Open Graph Protocol&lt;/h3&gt;
&lt;p&gt;By specifying certain meta tags, your website becomes a so called “graph object”. For instance, this is used on Facebook to enable any web page to have the same functionality as a Facebook Page.&lt;/p&gt;
&lt;p&gt;Example taken from the source code of this &lt;a target="_blank" href="http://mashable.com/2010/08/06/expedition-titanic/"&gt;article on mashable.com&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;em&gt;&lt;head&gt;&lt;br/&gt;&lt;/em&gt;&lt;em&gt;  &lt;meta property=”&lt;strong&gt;og:title&lt;/strong&gt;” content=”Explore the Titanic Wreck Site via Social Media [EXCLUSIVE]” /&gt;&lt;br/&gt;&lt;/em&gt;&lt;em&gt;  &lt;meta property=”&lt;strong&gt;og:description&lt;/strong&gt;” content=”A team of archaeologists, scientists and oceanographers will soon be revisiting the wreck of the Titanic for further scientific discovery and documentation.” /&gt;&lt;br/&gt;&lt;/em&gt;&lt;em&gt;  &lt;meta property=”&lt;strong&gt;og:image&lt;/strong&gt;” content=”http://cdn.mashable.com/wp-content/uploads/2010/08/titanic-1.jpg” /&gt;&lt;br/&gt;&lt;/em&gt;&lt;em&gt;&lt;/head&gt;&lt;/em&gt;&lt;/blockquote&gt;
&lt;p&gt;The resulting text extension: &lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l7ofkcS8WF1qcc3wc.png"/&gt;&lt;br/&gt;For more info see &lt;a target="_blank" href="http://opengraphprotocol.org/"&gt;&lt;a href="http://opengraphprotocol.org/" target="_blank"&gt;http://opengraphprotocol.org/&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&lt;br/&gt;&lt;br/&gt;#2 Facebook/Digg/Yahoo Share Standard&lt;/h3&gt;
&lt;p&gt;This standard is also based on meta tags and was invented by facebook for their way of converting urls in status updates into previews and later on was adapted by several other major web services such as Digg and Yahoo Search.&lt;/p&gt;
&lt;p&gt;Example taken from the source code of this &lt;a target="_blank" href="http://www.flickr.com/photos/nexeh/3888623982/"&gt;epic flickr photo&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;em&gt;&lt;head&gt;&lt;br/&gt;&lt;/em&gt;&lt;em&gt;  &lt;meta name=”&lt;strong&gt;title&lt;/strong&gt;” content=”Henley Beach Reflections”&gt;&lt;br/&gt;&lt;/em&gt;&lt;em&gt;  &lt;meta name=”&lt;strong&gt;description&lt;/strong&gt;” content=”Enjoy  - Canon 5D Mark2. - ISO 100, f16, 17mm. - Canon 17-40 f/4 L. - Tripod.  View On Black to see more :)  Standard 3 exposure (+2,0,-2 EV)  Processing  Photomatix - Tonemapped generated HDR using detail enhancer option  Photoshop - Adjustment of hue/saturation - Adjustment of curves to increase the overall contrast (Linear) - Adjustment of levels - USM on Background Layer - Reduced noise with Noiseware Pro - Sig/Borders Added  Thanks for all the comments, faves, views, notes and invites!”&gt;&lt;br/&gt;&lt;/em&gt;&lt;em&gt;  &lt;link rel=”&lt;strong&gt;image_src&lt;/strong&gt;” href=”http://farm3.static.flickr.com/2555/3888623982_fdc013b4d9_m.jpg”&gt;&lt;br/&gt;&lt;/em&gt;&lt;em&gt;&lt;/head&gt;&lt;/em&gt;&lt;/blockquote&gt;
&lt;p&gt;This snippet gives us all information we need for a basic text extension. Title and description are taken from the &lt;meta&gt; elements and the image preview from the &lt;link&gt; element.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l7oflj18s01qcc3wc.png"/&gt;&lt;br/&gt;&lt;br/&gt;Besides offering an image preview, webmasters can also specify other media types such as video or audio.&lt;/p&gt;
&lt;p&gt;Let’s have a look at the source code of this &lt;a target="_blank" href="http://vimeo.com/1828755"&gt;lovely music video on vimeo.com&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;em&gt;&lt;head&gt;&lt;br/&gt;&lt;/em&gt;&lt;em&gt;  &lt;meta name=”&lt;strong&gt;title&lt;/strong&gt;” content=”Colbie Caillat &amp;amp; Jason Reeves ‘Droplets’” /&gt;&lt;br/&gt; &lt;/em&gt;&lt;em&gt; &lt;meta name=”&lt;strong&gt;description&lt;/strong&gt;” content=”Shot on a Bluff in Malibu where the Song was written” /&gt;&lt;br/&gt; &lt;/em&gt;&lt;em&gt; &lt;meta name=”&lt;strong&gt;video_type&lt;/strong&gt;” content=”application/x-shockwave-flash” /&gt;&lt;br/&gt;&lt;/em&gt;&lt;em&gt;  &lt;link rel=”&lt;strong&gt;image_src&lt;/strong&gt;” href=”http://ats.vimeo.com/210/195/21019554_200.jpg” type=”image/jpeg” /&gt;&lt;br/&gt;&lt;/em&gt;&lt;em&gt;  &lt;link rel=”&lt;strong&gt;video_src&lt;/strong&gt;” href=”http://vimeo.com/moogaloop.swf?clip_id=1828755” type=”application/x-shockwave-flash” /&gt;&lt;br/&gt;&lt;/em&gt;&lt;em&gt;&lt;/head&gt;&lt;/em&gt;&lt;/blockquote&gt;
&lt;p&gt;Hackers! This is by far the best we could get by an external site. The source code gives us the title, a short description, a preview image and the most important thing, the url to the flash video in a simple machine readable format.&lt;br/&gt;Users can therefore embed videos in their messages allowing others to watch them directly within the timeline.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l7ofr42LM71qcc3wc.png"/&gt;&lt;br/&gt;&lt;img src="http://media.tumblr.com/tumblr_l7ofrnJB7L1qcc3wc.png"/&gt;&lt;/p&gt;
&lt;p&gt;You would be amazed if you knew how many popular video services out there support this. Just to name a few: Break.com, DailyMotion.com, CollegeHumor.com, Discovery.com, …&lt;/p&gt;
&lt;p&gt;For more info regarding this standard see &lt;a target="_blank" href="http://about.digg.com/thumbnails"&gt;&lt;a href="http://about.digg.com/thumbnails" target="_blank"&gt;http://about.digg.com/thumbnails&lt;/a&gt;&lt;/a&gt; or &lt;a target="_blank" href="http://forum.developers.facebook.com/viewtopic.php?id=32464"&gt;&lt;a href="http://forum.developers.facebook.com/viewtopic.php?id=32464" target="_blank"&gt;http://forum.developers.facebook.com/viewtopic.php?id=32464&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&lt;br/&gt;&lt;br/&gt;#3 Microformats (hCard)&lt;/h3&gt;
&lt;p&gt;Microformats are a set of simple machine readable open data formats.”hCard” (also known as vCard) is one of those data formats and is adopted by many websites for representing people, companies, organizations, and places. Webmasters highlight particular information by using semantic (X)HTML properties and values.&lt;/p&gt;
&lt;p&gt;Example taken from a &lt;a target="_blank" href="http://www.xing.com/profile/Christopher_Blum2"&gt;social profile on XING.com&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;em&gt;&lt;div class=”&lt;strong&gt;vcard&lt;/strong&gt;“&gt;&lt;/em&gt;&lt;br/&gt;&lt;em&gt;  &lt;span class=”type”&gt;work&lt;/span&gt;&lt;/em&gt;&lt;br/&gt;&lt;em&gt;  &lt;span class=”fn n”&gt;&lt;/em&gt;&lt;br/&gt;&lt;em&gt;    &lt;span class=”&lt;strong&gt;given-name&lt;/strong&gt;“&gt;Christopher&lt;/span&gt;&lt;/em&gt;&lt;br/&gt;&lt;em&gt;    &lt;span class=”&lt;strong&gt;family-name&lt;/strong&gt;“&gt;Blum&lt;/span&gt;&lt;/em&gt;&lt;br/&gt;&lt;em&gt;  &lt;/span&gt;&lt;/em&gt;&lt;br/&gt;&lt;em&gt;  &lt;span class=”&lt;strong&gt;title&lt;/strong&gt;“&gt;Frontend Engineer&lt;/span&gt;&lt;/em&gt;&lt;br/&gt;&lt;em&gt;  &lt;span class=”&lt;strong&gt;org&lt;/strong&gt;“&gt;XING AG&lt;/span&gt;&lt;/em&gt;&lt;br/&gt;&lt;em&gt;  &lt;img src=”/img/users/1/2/7/f98db1f73.6149675.jpg” class=”&lt;strong&gt;photo&lt;/strong&gt;” width=”140” height=”185” alt=”Christopher Blum”&gt;&lt;/em&gt;&lt;br/&gt;&lt;em&gt;&lt;/div&gt;&lt;/em&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l7og6mVC8I1qcc3wc.png"/&gt;&lt;/p&gt;
&lt;h3&gt;&lt;br/&gt;&lt;br/&gt;#4 OEmbed&lt;/h3&gt;
&lt;p&gt;OEmbed is probably the best tool for turning an url into an embedded representation. It doesn’t require us to parse the external page by ourselves by using complex xpath selectors. Instead we just have to take the url and ask the provider to give us structured json data back. Even though it’s pretty easy to use we haven’t implemented it (yet) in our text extensions code: at the moment the amount of websites supporting this is just too small (oembed.com lists only 10 providers). Also we figured out that most of those who support this have also adopted one of the other mentioned standards.&lt;/p&gt;
&lt;p&gt;See &lt;a target="_blank" href="http://oembed.com/"&gt;&lt;a href="http://oembed.com/" target="_blank"&gt;http://oembed.com/&lt;/a&gt;&lt;/a&gt; for detailed documentation.&lt;/p&gt;
&lt;h3&gt;&lt;br/&gt;&lt;br/&gt;#5 Special cases&lt;/h3&gt;
&lt;p&gt;Many websites don’t support one of the listed standards above. Some of them simply can’t because their content is too complex or specific to fit into a couple of structured html elements.&lt;/p&gt;
&lt;p&gt;To name two cases:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Protonet has currently a test instance running in an environment full of web developers whose daily need is to share code snippets and repository commits. To fullfill that need we decided to implement a GitHub text extensions that embeds code snippets and commit diffs into messages. Of course GitHub doesn’t support one of the standards explained above. So we had to came up with a dedicated solution. Luckily GitHub provides a JSON API which offers all related data to a specific commit (including the diff itself, message, author and many more). Thanks to the api we were able to easily satisfy our dearest Nerds. =)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Google Maps/Street View&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Google maps is probably one of the most used and shared services. As it is the same for GitHub we couldn’t generate a proper text extension for google maps based on the source code.&lt;br/&gt;So we had a closer look at typical google maps urls and how it is possible to embed a google map in your own web page. We were quite surprised when we found out that by adding “&amp;output=embed” to the url generates an embeddable map preview suitable for iframes.Every time a user enters a maps url, we attach an iframe with that url.&lt;/p&gt;
&lt;blockquote&gt;&lt;em&gt;&lt;a href="http://maps.google.com/maps?q=new+york" target="_blank"&gt;http://maps.google.com/maps?q=new+york&lt;/a&gt;&lt;/em&gt;&lt;/blockquote&gt;
&lt;p&gt;becomes &lt;/p&gt;
&lt;blockquote&gt;&lt;em&gt;&lt;a href="http://maps.google.com/maps?q=new+york" target="_blank"&gt;http://maps.google.com/maps?q=new+york&lt;/a&gt;&lt;strong&gt;&amp;output=embed&lt;/strong&gt;&lt;/em&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;br/&gt;Btw: The way the same applies for google street view. Just that the parameter to add is “&amp;output=svembed”.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l7ogc26hAJ1qcc3wc.png"/&gt;&lt;/p&gt;
&lt;h3&gt;&lt;br/&gt;&lt;br/&gt;#6 Fallback: Page Title, Meta Tags &amp; Screenshot&lt;/h3&gt;
&lt;p&gt;Luckily almost every website has a &lt;title&gt; element and a &lt;meta name=”description”&gt; element which allows us to still render basic information related to an url.&lt;br/&gt;In order to generate a thumbnail preview we capture a screenshot of the page. This is easily done by using one of the free/non-free services out there. The guys from sitepoint collected a list of screenshot providers: &lt;a target="_blank" href="http://www.sitepoint.com/blogs/2008/07/10/9-ways-to-put-site-screenshots-in-your-web-app/"&gt;&lt;a href="http://www.sitepoint.com/blogs/2008/07/10/9-ways-to-put-site-screenshots-in-your-web-app/" target="_blank"&gt;http://www.sitepoint.com/blogs/2008/07/10/9-ways-to-put-site-screenshots-in-your-web-app/&lt;/a&gt;&lt;br/&gt;&lt;/a&gt;Nevertheless we at protonet don’t want to rely on a third party provider, since it often takes minutes or even hours until the provider has generated a screenshot for an url. We therefore decided to setup our own screenhot service by using a free open source command line utility named “&lt;a target="_blank" href="http://cutycapt.sourceforge.net/"&gt;CutyCapt&lt;/a&gt;”.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l7ogktCy4h1qcc3wc.png"/&gt;&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;Demo!&lt;/h2&gt;
&lt;p&gt;Since we can’t give you access to our entire chat right now, we encapsulated the text extension code and &lt;a target="_blank" href="http://protonet.tifftiff.de/text_extensions/"&gt;set up a demo&lt;/a&gt; . Happy playing!&lt;/p&gt;</description><link>http://blog.protonet.info/post/1005627617</link><guid>http://blog.protonet.info/post/1005627617</guid><pubDate>Tue, 24 Aug 2010 18:58:00 -0400</pubDate><category>tech</category><category>javascript</category><category>chat</category><category>dashboard</category><dc:creator>christopher-blum</dc:creator></item><item><title>What is the protonet?</title><description>&lt;p style="text-align:left;"&gt;I really hope you’ve read the title as it was intended to be read:&lt;/p&gt;

&lt;img src="http://img838.imageshack.us/img838/6585/neoandmorpheusreverse.png"/&gt;&lt;p&gt;Obviously this conversation goes further than that, but we’ll leave those two alone (for now) and I’ll tell you a little more about what the protonet is. In our last blogpost I talked about the phase change moment - from idea to action - this time we’ll fast forward and see what the protonet is supposed to be - and what it is now. Let’s recap the fundamental ideas of protonet:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;we want citizens to have an infrastructure they own themselves&lt;/li&gt;
  &lt;li&gt;we want citizens to be the ones responsible for it, to maintain and to cultivate it&lt;/li&gt;
  &lt;li&gt;we believe in responsibility, and we believe that only with taking responsibility freedom is possible&lt;/li&gt;
  &lt;li&gt;we believe that building such an infrastructure needs to be as simple as pushing a button&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;and most important of all:&lt;/strong&gt; we believe that, for it to work, it needs to be awesomely fun to do it&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Our last point bears repeating: if our vision of a people owned infrastructure has any chance of becoming a reality (and it will), it needs to be fun. It needs to be easy, and it needs to be instantly gratifying, even - especially - if this new network consists of just your node. Now that we got the fundamentals, let’s do a deep dive:&lt;/p&gt;


&lt;em&gt;&lt;h3&gt;protonet, a vision of a different (web) future&lt;/h3&gt;&lt;/em&gt;

&lt;p&gt;To us, the protonet is not just an idea, it is our absolute belief that a different future is possible - for the web, and communications in general - and that this is a future worth creating for. It is a future in which we own our data, and not just the data, but the infrastructure too. A future in which we’re not bound by an endless amount of recurring fees (whether paid in money units or by matters of handing over our privacy - completely or piece by piece). A future full of the awesome stuff we now see popping up all over the net, only slightly different. Instead of having to rent a dropbox, you’ll own your copy. Instead of renting your googlemail account (by allowing google to read your mails and provide you with custom ads), you’ll own your own email account and you’ll be able to read your mails with your very own copy of a gorgeous webmail client. Instead of having to use facebook to connect to your friends from near or far you’ll be the owner of your social graph and decide - and own - the client that allows you to browse and interact with it. We’re not here to invent all of those things, but we’ll do whatever is needed so you can ‘feel’ it, and be instantly gratified.&lt;/p&gt;

&lt;em&gt;&lt;h3&gt;protonet, the holistic approach&lt;/h3&gt;&lt;/em&gt;

&lt;p&gt;We see protonet as a holistic approach to communication and exchange. We recognize the right to communicate as a fundamental human right and as such we believe that it should not be left to politics and governments to ensure. We believe that each and every single one of us holds the potential to be the guardian of such a right, to be the creator and owner of a piece of infrastructure, and that in joining these pieces we can create a more powerful, more diverse, more secure and ultimately free internet. An infrastructure truly owned and operated by we, the people.&lt;/p&gt;

&lt;em&gt;&lt;h3&gt;protonet, relearning ownership&lt;/h3&gt;&lt;/em&gt;

&lt;p&gt;We have no illusions, such an undertaking is profoundly complex and pinned with challenges, and seen in it’s totality, practically impossible. But that’s what makes it so fun. And isn’t our worlds history filled with impossibilities that have been, by passion and perseverance, pulled, dragged into reality? What can be more challenging (and rewarding) than for us - who have been taught to be the perfect consumers - to relearn ownership and responsibility, to understand creativity as our heritage and join hands in creating something maybe no population has ever created before in this magnitude: our own communications network?&lt;/p&gt;
&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;em&gt;stay tuned (subscribe to this blog or our &lt;a href="http://twitter.com/protonet" target="_blank"&gt;twitter account&lt;/a&gt;) and see us show off our hardware and software in our coming blogposts&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;ps. for those already using a protonet node, you’re right, we’ve reversed the messaging order for blogpost readability ;)&lt;/em&gt;&lt;/p&gt;</description><link>http://blog.protonet.info/post/999541833</link><guid>http://blog.protonet.info/post/999541833</guid><pubDate>Mon, 23 Aug 2010 16:20:56 -0400</pubDate><category>freedom</category><category>infrastructure</category><category>communication</category><dc:creator>dudemeister</dc:creator></item><item><title>How about we build a new one, eh?</title><description>&lt;p&gt;Approximately two years ago (actually, it was around 10pm on a tuesday night in august 2008 ;)) I had one of those discussions: sitting at a big round table in our flat-share we talked about religion, science, internet and of course: freedom. I can’t exactly remember the content of those - quite heated - discussions, but I remember that at some point, I started talking about how the infrastructure should belong to the people and that:&lt;/p&gt;
&lt;blockquote&gt;as long as we’re dependent on big corporations, governments and those friendly NGOs to provide us with the ability to communicate with each other, we’re at their mercy.&lt;/blockquote&gt;
&lt;p&gt;With communication and information-exchange becoming such an important part of our daily lives I felt we had to do something. For a couple of years now a set of ideas were brewing in my head, and that day I finally couldn’t take it anymore. I had repeated these lines so often, in so many conversations, at so many dinner parties that I felt like a broken record: all talk and no action. The time had come to choose: I would either put up or shut up. I stopped talking and started thinking while my roomies continued their discussions, I remember that I suddenly proclaimed: &lt;em&gt;“that’s it! I can’t take it anymore! I’m gonna build this f*cking thing and get it over with - f*ck!”&lt;/em&gt; and disappeared into my room.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;A couple of hours later I came back with this:
&lt;/p&gt;&lt;div style="width:477px" id="__ss_4894479"&gt;&lt;object id="__sse4894479" width="477" height="510"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/doc_player.swf?doc=protonetprimer-100803093600-phpapp01&amp;stripped_title=protonet-primer"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed name="__sse4894479" src="http://static.slidesharecdn.com/swf/doc_player.swf?doc=protonetprimer-100803093600-phpapp01&amp;stripped_title=protonet-primer" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="500" height="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;
&lt;div style="text-align:center;"&gt;&lt;a href="http://www.slideshare.net/jelveh/protonet-primer" title="protonet primer" target="_blank"&gt;the “protonet project primer”&lt;/a&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;The importance wasn’t so much the act of writing down an eloquent primer on the idea (maybe you will notice the non-eloquence) but that this was the actual first step in turning this idea into a reality. And as they (Goethe/Murray) say:
&lt;/p&gt;&lt;br/&gt;&lt;blockquote&gt;Whatever you can do, or dream you can do, begin it.&lt;br/&gt;
Boldness has genius, power, and magic in it!
&lt;/blockquote&gt;&lt;br/&gt;&lt;p&gt;That night, for protonet and all of us working our asses off making this dream real, the magic had just started.&lt;/p&gt;</description><link>http://blog.protonet.info/post/898286058</link><guid>http://blog.protonet.info/post/898286058</guid><pubDate>Tue, 03 Aug 2010 11:00:52 -0400</pubDate><category>internet</category><category>protonet</category><category>revolutions</category><dc:creator>dudemeister</dc:creator></item></channel></rss>

