<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>outbreak</title>
	<atom:link href="http://friedcell.si/outbreak/feed/" rel="self" type="application/rss+xml" />
	<link>http://friedcell.si/outbreak</link>
	<description>bursts of ideas and rants by the alterego</description>
	<lastBuildDate>Fri, 21 Jan 2022 15:03:10 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.3.1</generator>
	<item>
		<title>Enabling camera and microphone in Chrome on M1</title>
		<link>http://friedcell.si/outbreak/2022/01/21/enabling-camera-and-microphone-in-chrome-on-m1/</link>
		<comments>http://friedcell.si/outbreak/2022/01/21/enabling-camera-and-microphone-in-chrome-on-m1/#comments</comments>
		<pubDate>Fri, 21 Jan 2022 15:03:10 +0000</pubDate>
		<dc:creator><![CDATA[Marko Mrdjenovic]]></dc:creator>
				<category><![CDATA[browsers]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[safari]]></category>

		<guid isPermaLink="false">http://friedcell.si/outbreak/?p=563</guid>
		<description><![CDATA[After installing my new MacBook Pro M1, I had an issue where Google Chrome would ask me to give permission to a site for using a camera and microphone, but would then show them as inaccessible. First level googling suggested going to System Preferences &#62; Security &#38; Privacy &#62; Privacy &#62; Camera and tick the [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>After installing my new MacBook Pro M1, I had an issue where Google Chrome would ask me to give permission to a site for using a camera and microphone, but would then show them as inaccessible.</p>
<p>First level googling suggested going to System Preferences &gt; <span class="nowrap">Security &amp; Privacy</span> &gt; Privacy &gt; Camera and tick the box next to Google Chrome. Just one problem &#8211; Google Chrome was not listed and there doesn&#8217;t seem to be a way to add a program to that list manually.</p>
<p>Another hit suggested upgrading Chrome and macOS &#8211; both were upgraded already.</p>
<p>I googled some more and found <a href="https://support.google.com/meet/thread/114716742/google-chrome-does-not-appear-in-mac-s-privacy-settings-so-how-can-i-allow-access?product_name=UnuFlow&#038;hl=en&#038;visit_id=637783706905528544-2392140042&#038;rd=1&#038;src=supportwidget0&#038;hl=en">this report of the same problem</a> with comments closed and no answer.</p>
<p>I tried a bunch of things in Chrome and had no success &#8211; settings, other sites, disabling/enabling camera&#8230; nothing worked.</p>
<p>So I gave up and opened Safari to see if I can at least use the camera there. It worked out of the box, the camera and mic turned on and I was in the meeting. I then opened System Preferences and Safari is not listed there at all &#8211; I guess that&#8217;s what you get when you work in the same building as the OS guys. Went back to Chrome to see if it works now and Chrome asked me for permissions again &#8211; only this time, it also appeared in Privacy list, where I could now allow access to Camera and Microphone.</p>
<p>I had a feeling using Safari first might trigger this, but it was more of a Hail Mary then anything else really. The other option &#8211; removing Chrome with all the profiles and trying from scratch &#8211; did not sound appealing at all.</p>
<p><a href="https://youtu.be/uyiTh8x12Ag?t=114">So now you know</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://friedcell.si/outbreak/2022/01/21/enabling-camera-and-microphone-in-chrome-on-m1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VMs on M1</title>
		<link>http://friedcell.si/outbreak/2021/12/27/vms-on-m1/</link>
		<comments>http://friedcell.si/outbreak/2021/12/27/vms-on-m1/#comments</comments>
		<pubDate>Mon, 27 Dec 2021 13:50:35 +0000</pubDate>
		<dc:creator><![CDATA[Marko Mrdjenovic]]></dc:creator>
				<category><![CDATA[apple]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[parallels]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[utm]]></category>
		<category><![CDATA[vm]]></category>
		<category><![CDATA[vmware]]></category>

		<guid isPermaLink="false">http://friedcell.si/outbreak/?p=532</guid>
		<description><![CDATA[I have upgraded my laptop. It&#8217;s been a while (Mid 2014) and I felt like the new MacBook Pro is finally a computer I can use a while. It&#8217;s got an SD card slot, an HDMI port, MagSafe and enough USB ports (even though they are all USB-C). What I&#8217;m missing is an easy way [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I have upgraded my laptop. It&#8217;s been a while (Mid 2014) and I felt like the new MacBook Pro is finally a computer I can use a while. It&#8217;s got an SD card slot, an HDMI port, MagSafe and enough USB ports (even though they are all USB-C). What I&#8217;m missing is an easy way to connect my old displayport screen, but I&#8217;ll fix that by upgrading that as well (it&#8217;s ~10 years old).</p>
<p>The machine is great &#8211; the screen, the silence even when under load, the fingerprint reader, I love it all. I have not had any issues with the apps due to it being Apple Silicon. What I have noticed is that some smaller utility apps I used have disappeared since I last did a fresh install &#8211; developers moved on, decided to not support the new platform or the new APIs. I have mostly<a href="#fn-532-apps" rel="footnote" id="fn-532-apps-source">1</a> found replacements, even if some are paid apps.</p>
<h4>Reasoning</h4>
<p>On my previous laptop I had all development stuff running directly on the Mac. This was a problem every time I upgraded the OS as random things would die and fixing them took a lot of time. So this time around I want to pack all my development stuff inside a linux VM that would then hold either code directly or docker containers.</p>
<p>My initial idea was to set up an x86_64 virtual machine, so that I could have an environment as close to what I normally use in production, but installing it in UTM took forever, so I abandoned that idea for now.</p>
<h4>Software</h4>
<p>Step one was setting up some virtual machines to test how that would work.</p>
<p class="withnext">I have previously used VirtualBox, but they have not yet decided to support the M1, so what I found and tested was:</p>
<ol>
<li><a href="https://mac.getutm.app/">UTM</a>,</li>
<li><a href="https://www.parallels.com/blogs/parallels-desktop-apple-silicon-mac/">Parallels Desktop for M1</a> and </li>
<li><a href="https://blogs.vmware.com/teamfusion/2021/09/fusion-for-m1-public-tech-preview-now-available.html">VMWare Fusion for Apple Silicon</a>.</li>
</ol>
<p>So I went about installing Ubuntu in all three environments. My source image was <a href="https://ubuntu.com/download/server/arm">Ubuntu 20.04.3 LTS</a>, the machines set up as arm with 8GB of RAM and 4 cores. In the case of UTM, the system is set to QEMU 5.0 ARM VM (virt-5.0)<a href="#fn-532-virt" rel="footnote" id="fn-532-virt-source">2</a> with CPU set to cortex-a72 and Force Multicore checked.</p>
<h4>Shared directory</h4>
<p class="withnext">After installing I looked at how I can share a directory from the host inside the VM:</p>
<ol class="withnext">
<li>
<h6>UTM</h6>
<p>I haven&#8217;t figured it out yet as it wanted me to install something on my Mac, so I gave up (for now).</p>
</li>
<li>
<h6>Parallels Desktop</h6>
<p><a href="http://download.parallels.com/stm/docs/en/Parallels_Desktop_Users_Guide/22907.htm">Default instructions</a> are to reboot and then mount a CD from which you install the relevant tools. This went well and the directories were shared under <code>/media/psf</code>.
</p>
</li>
<li>
<h6>VMWare Fusion</h6>
<p>VMWare requires you to install vmware tools on linux and you should get the mount automatically, but I didn&#8217;t, so I hade to add the line to <code>/etc/fstab</code> manually. Going with fstab is nice, as you can mount the share anywhere you like.
</p>
</li>
</ol>
<h4>Performance</h4>
<p>With that solved, I did a quick test of speed inside the VMs. Nothing comprehensive, just a quick feeler to see what kind of performance I can expect. To do that I ran the following python code, output mimicking that of the ping command:</p>
<pre><code>import statistics
import timeit

l = []
for i in range(10):
	l.append(timeit.timeit("hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000)", "import hashlib", number=100) / 100 * 1000)

print("min/avg/max/stddev = {:.3f}/{:.3f}/{:.3f}/{:.3f} us".format(
	min(l),
	statistics.mean(l),
	max(l),
	statistics.pstdev(l)
))
</code></pre>
<p class="withnext">Times:</p>
<ol class="withnext">
<li>
<h6>UTM</h6>
<p>min/avg/max/stddev = 15.442/15.479/15.510/0.018 us (python 3.8.10)</p>
</li>
<li>
<h6>Parallels Desktop</h6>
<p>min/avg/max/stddev = 14.582/14.659/14.809/0.077 us (python 3.8.10)</p>
</li>
<li>
<h6>VMWare Fusion<a href="#fn-532-fusion" rel="footnote" id="fn-532-fusion-source">3</a></h6>
<p>min/avg/max/stddev = 14.596/14.632/14.713/0.031 us (python 3.8.10)</p>
</li>
<li>
<h6>Host</h6>
<p>min/avg/max/stddev = 23.598/24.297/25.038/0.553 us (python 3.8.9)</p>
</li>
<li>
<h6>MacBook Pro (Mid 2014)</h6>
<p class="withnext">min/avg/max/stddev = 308.944/316.638/326.198/4.993 us (python 3.5.2)</p>
<p>min/avg/max/stddev = 64.027/64.870/66.026/0.658 us (python 3.8.8)</p>
</li>
</ol>
<p>I have no idea why the VMs are faster than the host &#8211; my guess is the VMs are running on performance cores, so python also gets a performance core, while python on the host runs on the efficiency core. Haven&#8217;t yet figured out how to confirm this though.</p>
<p><ins>Update:</ins> I added times from my old laptop. Oddly python 3.5 was way slower, while there is no difference in times between 3.5 and 3.8 on arm (tested on Parallels).</p>
<h4>Result</h4>
<p>I think UTM could be great especially with its low price (free online, <a href="https://apps.apple.com/us/app/utm-virtual-machines/id1538878817">9.99€ on the App Store</a>), but everything is a bit finicky. If you can use one of the images provided and you don&#8217;t need to set up directory sharing, it&#8217;s surely a good option.</p>
<p>I don&#8217;t yet have a preference between Parallels and Fusion &#8211; Fusion has better folder sharing approach but kidnaps the cursor, which is quite annoying. At the moment Fusion is free (full price for <a href="https://store-eu.vmware.com/vmware-fusion-12-player-5434551400.html">Fusion 12 Player is 135.53€</a> while <a href="https://store-eu.vmware.com/vmware-fusion-12-pro-5434554600.html">Pro is 180.98€</a> in the Europe store at the moment), while Parallels is already a paid product (<a href="https://www.parallels.com/eu/products/desktop/buy/?full">99.99€ one time or 79.99€ per year, 99.99€ per year for Pro</a>). As far as I have read, VMWare does not intend to support anything that is not Arm, while Parallels already has that support, which might make me go that way.</p>
<h4>Next up</h4>
<p>Next things I want to figure out:</p>
<ul>
<li>does running an x86_64 VM makes any sense?</li>
<li>is it possible to mount a VM HDD without running the VM?</li>
<li>set up PyCharm to work with this setup</li>
</ul>
<p>If you&#8217;re interested in anything else, let me know.</p>
<ol class="footnotes">
<li id="fn-532-apps">Anybody know of a replacement for PresenterMate? <a href="#fn-532-apps-source">^</a></li>
<li id="fn-532-virt">For some reason I could not make the install work on a higher version (5.1, 6.x) <a href="#fn-532-virt-source">^</a></li>
<li id="fn-532-fusion">I initially thought Fusion was much slower, but I likely screwed something up when measuring <a href="#fn-532-fusion-source">^</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://friedcell.si/outbreak/2021/12/27/vms-on-m1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sides of the story</title>
		<link>http://friedcell.si/outbreak/2020/09/17/sides-of-the-story/</link>
		<comments>http://friedcell.si/outbreak/2020/09/17/sides-of-the-story/#comments</comments>
		<pubDate>Thu, 17 Sep 2020 10:57:08 +0000</pubDate>
		<dc:creator><![CDATA[Marko Mrdjenovic]]></dc:creator>
				<category><![CDATA[thoughts]]></category>

		<guid isPermaLink="false">http://friedcell.si/outbreak/?p=521</guid>
		<description><![CDATA[We live in a world in which technology has increased people&#8217;s ability to sell bullshit. But it has also increased our options to check information and decide on our own if we believe it. The trust we once had for information sources is mostly gone &#8211; I find myself quoting the source and explicitly stating [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>We live in a world in which technology has increased people&#8217;s ability to sell bullshit. But it has also increased our options to check information and decide on our own if we believe it. The trust we once had for information sources is mostly gone &#8211; I find myself quoting the source and explicitly stating that I am just relaying information and not endorsing it way more often than I did. Sadly the ability of assholes usually evolves faster than our own ability to call them on their bullshit.</p>
<p>So it is weird to me that we haven&#8217;t become more wary of what people we know tell us. One would think that in the age where we don&#8217;t adopt any conclusions without checking with multiple sources, we&#8217;d do the same when information is shared privately &#8211; and one would be wrong. In other words &#8211; the government is lying to us, the media is lying to us, but what we hear at the bar is all true.</p>
<p>I&#8217;ve recently tried to become less susceptible to these kinds of one sided stories and try to check the other side before creating an opinion. I&#8217;ve been called out on adopting other people&#8217;s opinions a few times in the past and I&#8217;m trying to be better at this. But this means work and a few additional variables with all information you store in your brain &#8211; source and reliability. So now whenever I hear something I try to check it before I store it memory &#8211; and if I can&#8217;t, I store it as a rumour with a low reliability score, just as I would when I hear something on the news.</p>
<p>Adopting this has made me more content with myself, but also made it harder to converse with people who refuse to question things they have been told.</p>
]]></content:encoded>
			<wfw:commentRss>http://friedcell.si/outbreak/2020/09/17/sides-of-the-story/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hazelnut spreads</title>
		<link>http://friedcell.si/outbreak/2020/09/04/hazelnut-spreads/</link>
		<comments>http://friedcell.si/outbreak/2020/09/04/hazelnut-spreads/#comments</comments>
		<pubDate>Fri, 04 Sep 2020 14:54:00 +0000</pubDate>
		<dc:creator><![CDATA[Marko Mrdjenovic]]></dc:creator>
				<category><![CDATA[random]]></category>

		<guid isPermaLink="false">http://friedcell.si/outbreak/?p=505</guid>
		<description><![CDATA[I recently had a chance to taste two Slovenian bio hazelnut spreads and wanted to record my notes for future reference. Both are basically the same &#8211; 60% hazelnuts with coconut sugar and cocoa as the only other 2 components. Both are also advertised as eco, vegan, lactose free (no.2 notes that means &#60;0.1g lactose [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I recently had a chance to taste two Slovenian bio hazelnut spreads and wanted to record my notes for future reference. Both are basically the same &#8211; 60% hazelnuts with coconut sugar and cocoa as the only other 2 components. Both are also advertised as eco, vegan, lactose free (no.2 notes that means &lt;0.1g lactose per 100g), gluten free and both are marked as handmade in Slovenia.</p>
<ol>
<li>Lešnikov namaz (Hazelnut spread)<br />
<img class="alignright size-medium wp-image-513" src="http://friedcell.si/outbreak/wp-content/uploads/lesnikov-namaz-20chocolate-225x300.jpg" alt="lesnikov-namaz-20chocolate" width="225" height="300" />
<dl>
<dt>Manufacturer:</dt>
<dd><a href="https://20chocolate.si">20 Chocolate</a></dd>
<dt>Weight:</dt>
<dd>200g</dd>
<dt>Expires:</dt>
<dd>23-10-2020</dd>
<dt>Certification from:</dt>
<dd>SI-EKO-003 (Bureau Veritas)</dd>
<dt>Ingredients:</dt>
<dd>hazelnuts, cocoa beans, coconut sugar</dd>
<dt>Energy per 100g:</dt>
<dd>2373kJ/572kcal</dd>
<dt>Fat / saturated per 100g:</dt>
<dd>43,1g / 5,4g</dd>
<dt>Carbohydrate / sugars per 100g:</dt>
<dd>29,2g / 27,4g</dd>
<dt>Protein per 100g</dt>
<dd>12,6g</dd>
<dt>Salt per 100g</dt>
<dd>0,16g</dd>
</dl>
</li>
<li><a href="https://www.lizinvrt.com/trgovina/lesnikov-namaz/bio-lesnikov-namaz-190-g/">Bio lešnikov namaz</a> (Bio hazelnut spread)<br />
<img class="alignright size-medium wp-image-512" src="http://friedcell.si/outbreak/wp-content/uploads/lesnikov-namaz-lizin-vrt-225x300.jpg" alt="lesnikov-namaz-lizin-vrt" width="225" height="300" />
<dl>
<dt>Manufacturer:</dt>
<dd><a href="https://www.lizinvrt.com/">Lizin Vrt</a></dd>
<dt>Weight:</dt>
<dd>190g</dd>
<dt>Expires:</dt>
<dd>02-03-2021</dd>
<dt>Certification from:</dt>
<dd>SI-EKO-002 (IKC UM)</dd>
<dt>Ingredients:</dt>
<dd>hazelnut paste, cocoa paste, coconut sugar</dd>
<dt>Energy per 100g:</dt>
<dd>2560kJ/618kcal</dd>
<dt>Fat / saturated per 100g:</dt>
<dd>49,0g / 8,7g</dd>
<dt>Carbohydrate / sugars per 100g:</dt>
<dd>31,0g / 24g</dd>
<dt>Protein per 100g</dt>
<dd>9,42g</dd>
<dt>Salt per 100g</dt>
<dd>&lt;0,01g</dd>
</dl>
</li>
</ol>
<p>So even though they look the same based on the big claims on the container, they are quite dissimilar with the second one using more fat (8,7g vs 5,4g) and less sugar (24g vs 27,4g) resulting in higher energy value. I&#8217;m also a bit annoyed that it is 10g lighter even though it seems it&#8217;s using the same container.</p>
<p>Taste wise and texture wise I prefer the first one &#8211; it tastes a bit sweeter and creamier. I&#8217;ll see if the second turns creamier with time. Oddly, the second has a somewhat bitter taste as if the hazelnuts were a bit over and not really perfect. Might be a batch issue or an overall quality issue, who knows. Either way, I&#8217;d buy no.1 again, keeping no.2 in mind only as a backup.</p>
]]></content:encoded>
			<wfw:commentRss>http://friedcell.si/outbreak/2020/09/04/hazelnut-spreads/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>On meetups</title>
		<link>http://friedcell.si/outbreak/2017/09/19/on-meetups/</link>
		<comments>http://friedcell.si/outbreak/2017/09/19/on-meetups/#comments</comments>
		<pubDate>Tue, 19 Sep 2017 17:03:38 +0000</pubDate>
		<dc:creator><![CDATA[Marko Mrdjenovic]]></dc:creator>
				<category><![CDATA[thoughts]]></category>

		<guid isPermaLink="false">http://friedcell.si/outbreak/?p=479</guid>
		<description><![CDATA[I&#8217;ve recently been to a few meetups that were almost a complete waste of my time. The talks themselves weren&#8217;t necessarily bad, but it showed they weren&#8217;t managed and more often than not, most of the crowd leaves after the talks so there&#8217;s no networking opportunities either. That might sound a bit harsh, but I [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve recently been to a few meetups that were almost a complete waste of my time. The talks themselves weren&#8217;t necessarily bad, but it showed they weren&#8217;t managed and more often than not, most of the crowd leaves after the talks so there&#8217;s no networking opportunities either.</p>
<p>That might sound a bit harsh, but I always felt that as the organiser of an event (I was involved with <a href="http://urice.si">Spletne urice</a> &#8211; a weekly meetup &#8211; for quite a while) my job is to provide people with as much value as possible to show that I respect their time and effort to come sit in a hall for an hour or so and listen to something I consider important/relevant<a href="#footnote-1-479" rel="footnote" id="footnote-1-479-link">[1]</a>.</p>
<h3>Preparation and curation</h3>
<p>As we didn&#8217;t have meetups during the summer (less people in town + our space was closed), this meant that every season would start off with me going through all the possible topics I could think of that I felt had developments relevant to the community, brainstorm topics with other senior people in the community and then thinking of companies and people who could be good at presenting these topics.</p>
<h3>Convincing and scheduling</h3>
<p>Unfortunately Slovenians don&#8217;t really want to speak in public too much, so a lot of time was spent convincing people to actually present. If I started the season with 20 topics and people I could start at the beginning of the season and when people said &#8220;maybe in a few months&#8221; I set a date for them and kept reminding them. This was an ongoing thing as new topics and relevant speakers would pop up during the season. Because you can&#8217;t fill all the slots this way I had a set of &#8220;evergreen&#8221; topics and people who can present on them to fill it all up &#8211; this also helps in months when you have less time, but it does mean you owe people.</p>
<h3>Talk management</h3>
<p>I almost never let people write their own talk descriptions and titles. While I did ask them for a description it was more of a way to see what they want to talk about and the text I wrote was what I wanted them to talk about. This meant that I would give back suggestions on how to make the talk more relevant to the crowd and also to set the expectations &#8211; as the meetups were on the broad topic of web technologies, a good narrow description would pull in listeners that would otherwise not have come. For people who have not presented before or felt they might not do a good job I offered even more help &#8211;<br />
 checking their slides, possibly guiding them on how to tweak them for better effect.</p>
<h3>Sad state of affairs</h3>
<p>What I see nowadays feels more or less unmanaged and even though that sometimes means some awesome odd-ball talks, it often has the following result:</p>
<ul>
<li>the speaker is chosen from a friends/volunteer list, not a best-of list</li>
<li>title and description are ambiguous or even straight up misleading</li>
<li>the presentation is more of a trial run with not enough though given to the argument</li>
<li>the presentation is off-topic</li>
<li>the speaker does not know the crowd and the history and nobody helps him/her understand it before the event</li>
</ul>
<p>All of the above means that more often than not these things just waste people&#8217;s time and look like the organiser and the speaker have no respect for the time of the people attending. I know this is not true most of the time, but having a bunch of people show up because they are hiring and go to meetups to find new employees (of which there are usually none) only masks the fact that the event should be run better and provide more value to the community<a href="#footnote-2-479" rel="footnote" id="footnote-2-479-link">[2]</a>.</p>
<p>The question then is &#8211; if you can&#8217;t do a meetup properly, do you find another person or a team to do it better? And if there is no one else, do you want to up your game or just quit? Is something better than nothing?</p>
<ol class="footnotes">
<li id="footnote-1-479">All this is based on my memory of how it went down &#8211; I might have been an ignorant asshole and only have romantic memories of the whole affair. <a href="#footnote-1-479-link" rev="footnote">back</a></li>
<li id="footnote-2-479">Unless of course it&#8217;s just a ploy to find employees, then I&#8217;m not the intended audience so please disregard everything I just said. <a href="#footnote-2-479-link" rev="footnote">back</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://friedcell.si/outbreak/2017/09/19/on-meetups/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>On car configurators</title>
		<link>http://friedcell.si/outbreak/2016/05/03/on-car-configurators/</link>
		<comments>http://friedcell.si/outbreak/2016/05/03/on-car-configurators/#comments</comments>
		<pubDate>Tue, 03 May 2016 15:10:12 +0000</pubDate>
		<dc:creator><![CDATA[Marko Mrdjenovic]]></dc:creator>
				<category><![CDATA[thoughts]]></category>

		<guid isPermaLink="false">http://friedcell.si/outbreak/?p=476</guid>
		<description><![CDATA[I&#8217;ve recently gone into another cycle of find-a-new-car. I do this now and then to stay in touch with what is currently on market and what I could buy if my trusty Civic dies unexpectedly. What I&#8217;ve seen (again) is that the state of car configurators and comparison tools has not progressed a lot since [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve recently gone into another cycle of find-a-new-car. I do this now and then to stay in touch with what is currently on market and what I could buy if my trusty Civic dies unexpectedly.</p>
<p>What I&#8217;ve seen (again) is that the state of car configurators and comparison tools has not progressed a lot since I first started seeing them in about 2000 when working on a website for Renault. That&#8217;s why I like buying cars from Asian brands (actually Japanese brands) &#8211; they have a small number of trims and not a lot of things you can add, which makes for a simple decision process. The european brands however will basically sell you an engine with a steering wheel and a set of wheels and then let you add on whatever you want/need so that you actually buy a car &#8211; I&#8217;m exaggerating here, but not long ago BMW had manual rear windows in the default trim.</p>
<p>The state of the art seems to be adding numbered codes to equipment and then listing them in packages, sometimes online even notifying the user about the incompatibilities when selected (which is sometimes fun &#8211; I still can&#8217;t configure a Renault car).</p>
<p>The funny thing when comparing trims/models is the fact that there seem to be no links between items, which sometimes means that you&#8217;ll have a &#8220;Steering wheel&#8221; and some trims will not have it &#8211; cause they have &#8220;Leather steering wheel&#8221; a page lower (intentionally selected these cause you can&#8217;t solve this with a sort).</p>
<p>Modelling features seems somewhat simple:</p>
<ul>
<li>title</li>
<li>description</li>
<li>price</li>
<li>includes features</li>
<li>not with features</li>
<li>applies to models</li>
</ul>
<p>If you try to normalize this you will quickly notice that it gets highly confusing when you have the same commercial title for a feature pack that includes less features and is priced lower because it only applies to high-end trims. </p>
<p>If you&#8217;ve ever done this before you can also imagine this conundrum makes for a very fun UI experience &#8211; some features only apply to automatic transmission models, some only to models with a certain engine or number of doors. Let&#8217;s not even start with special editions&#8230;</p>
<p>What do you do to deal with all this mess?</p>
]]></content:encoded>
			<wfw:commentRss>http://friedcell.si/outbreak/2016/05/03/on-car-configurators/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Three-way CSS-only selector</title>
		<link>http://friedcell.si/outbreak/2016/02/11/three-way-css-only-selector/</link>
		<comments>http://friedcell.si/outbreak/2016/02/11/three-way-css-only-selector/#comments</comments>
		<pubDate>Thu, 11 Feb 2016 10:55:31 +0000</pubDate>
		<dc:creator><![CDATA[Marko Mrdjenovic]]></dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://friedcell.si/outbreak/?p=468</guid>
		<description><![CDATA[I was at the Slovenian CSS Meetup yesterday where I did a short talk on Quantity Queries. That&#8217;s a name given to a technique where you use pseudo class selectors to discern how many elements are inside a certain element &#8211; for example :first-child:nth-last-child(4) {} will only select the first child if there are exactly [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I was at the Slovenian CSS Meetup yesterday where I did a short talk on <a href="http://alistapart.com/article/quantity-queries-for-css">Quantity Queries</a>. That&#8217;s a name given to a technique where you use <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes">pseudo class selectors</a> to discern how many elements are inside a certain element &#8211; for example <code>:first-child:nth-last-child(4) {}</code> will only select the first child if there are exactly 4 elements. If you group that with the <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/General_sibling_selectors">general sibling selector <code>~</code></a>, you can also get all the other elements.</p>
<p>The idea of quantity queries has been around for a year or so and even though at first glance you might say &#8220;We&#8217;ve got <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Using_CSS_flexible_boxes">flexbox</a> for that now&#8221;, you&#8217;d only be right in certain cases. The thing that quantity queries bring to the table is the idea of being able to change the styling depending on the number of elements, which I guess people currently solve either on the backend or with javascript.</p>
<p>But that&#8217;s not the main reason I&#8217;m writing this &#8211; it&#8217;s the last talk of the night where a three-way selector solution was presented by <a href="http://www.meetup.com/slovenia-CSS-user-group/members/184411488/">Gorazd</a>. He created a CSS version but had problems with the smoothness of the animation as he didn&#8217;t know where the selector was before the selection to move it to the selected position after a user interaction. He resorted to using javascript that basically only did some class switching. This immediately gave me an idea that a sibling selector could be used for that if the indicator had the same parent as the inputs and was positioned after them in the code. And today I made a proof-of-concept solution I&#8217;m calling &#8220;the three-way CSS-only selector&#8221;.</p>
<p><iframe style="height:50px" src="http://friedcell.si/outbreak/wp-content/uploads/threeway.html"></iframe></p>
<p>It uses three radio buttons, so the form is perfectly submittable, the labels also select properly, it animates properly and does not use javascript. It&#8217;s only been tested on the browsers I have on my Mac, so I can easily see it breaking in IE or mobile browsers &#8211; if anyone wants to fix that please go ahead and ping me to add your solution to this post. You can also check the solution on <a href="https://jsbin.com/jacocu/">JSBin</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://friedcell.si/outbreak/2016/02/11/three-way-css-only-selector/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The airport confusion</title>
		<link>http://friedcell.si/outbreak/2015/05/19/the-airport-confusion/</link>
		<comments>http://friedcell.si/outbreak/2015/05/19/the-airport-confusion/#comments</comments>
		<pubDate>Mon, 18 May 2015 23:24:58 +0000</pubDate>
		<dc:creator><![CDATA[Marko Mrdjenovic]]></dc:creator>
				<category><![CDATA[blurps]]></category>
		<category><![CDATA[thoughts]]></category>

		<guid isPermaLink="false">http://friedcell.si/outbreak/?p=464</guid>
		<description><![CDATA[Frankfurt airport confuses me. I never know when I&#8217;ll have to go through security and when it&#8217;s only going to be border control. This means that I don&#8217;t really like flying through it as I don&#8217;t know if I can buy stuff at airports on the way in and Fraport is losing money. Same thing [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Frankfurt airport confuses me. I never know when I&#8217;ll have to go through security and when it&#8217;s only going to be border control. This means that I don&#8217;t really like flying through it as I don&#8217;t know if I can buy stuff at airports on the way in and Fraport is losing money. Same thing goes for shops at the airport &#8211; even store clerks don&#8217;t know if I need to clear security again. And I don&#8217;t like the idea of throwing away a 50 EUR bottle of rye bourbon.<br />
If they offered a service that would, based on the date of travel, origin and destination airports, tell me which gate I might arrive at and fly out of as well as what kind of controls I&#8217;d have to go through and which shops are on my way I&#8217;d like it more.</p>
]]></content:encoded>
			<wfw:commentRss>http://friedcell.si/outbreak/2015/05/19/the-airport-confusion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My ideal commuter bike</title>
		<link>http://friedcell.si/outbreak/2015/04/12/my-ideal-commuter-bike/</link>
		<comments>http://friedcell.si/outbreak/2015/04/12/my-ideal-commuter-bike/#comments</comments>
		<pubDate>Sun, 12 Apr 2015 19:49:51 +0000</pubDate>
		<dc:creator><![CDATA[Marko Mrdjenovic]]></dc:creator>
				<category><![CDATA[blurps]]></category>

		<guid isPermaLink="false">http://friedcell.si/outbreak/?p=460</guid>
		<description><![CDATA[I&#8217;ve been thinking about this for a while now and we&#8217;re getting closer but not there just yet. Since a few people have asked me and I always forget something I&#8217;ll list all the features here. Must haves beside wheels, frame, forks, saddle, pedals, handlebars and a reasonable price: breaks front &#038; back (disks a [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve been thinking about this for a while now and we&#8217;re getting closer but not there just yet. Since a few people have asked me and I always forget something I&#8217;ll list all the features here.</p>
<p>Must haves beside wheels, frame, forks, saddle, pedals, handlebars and a reasonable price:</p>
<ol>
<li>breaks front &#038; back (disks a plus)</li>
<li>fenders front &#038; back</li>
<li>internal gear hub</li>
<li>chain cover</li>
<li>reasonable weight</li>
</ol>
<p>Optionals:</p>
<ol>
<li>lights front &#038; back</li>
<li>hidden break and shifter cables</li>
<li>rear rack</li>
</ol>
<p>You can get the lights, but it&#8217;s way nicer if they look the part, cables inside the frame make the bike look nicer and a rear rack is useful for schlepping stuff around.</p>
<p>I&#8217;ve recently done another search and found that <a href="http://www.schwinnbikes.com/int/brighton-31">Schwinn Brighton</a> comes close &#8211; it has all the must-haves, but unfortunately it&#8217;s not available in Slovenia.</p>
<p><strong>Update:</strong> I found this bike in <a href="https://www.cube.eu/en/2017/trekking/town/cube-town-pro-black-2017/">Cube Town Pro black 2017</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://friedcell.si/outbreak/2015/04/12/my-ideal-commuter-bike/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shipping</title>
		<link>http://friedcell.si/outbreak/2014/10/05/shipping/</link>
		<comments>http://friedcell.si/outbreak/2014/10/05/shipping/#comments</comments>
		<pubDate>Sun, 05 Oct 2014 19:01:47 +0000</pubDate>
		<dc:creator><![CDATA[Marko Mrdjenovic]]></dc:creator>
				<category><![CDATA[blurps]]></category>

		<guid isPermaLink="false">http://friedcell.si/outbreak/?p=454</guid>
		<description><![CDATA[When we stared a hardware startup, I hoped that at least the logistics and shipping would not be a problem &#8211; from all the global shipping companies to all the fulfillment companies surely it&#8217;d be a breeze. Oh how wrong I was. Since then I found out that delivery guy ignorance and package mishandling doesn&#8217;t [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>When we stared a hardware startup, I hoped that at least the logistics and shipping would not be a problem &#8211; from all the global shipping companies to all the fulfillment companies surely it&#8217;d be a breeze. Oh how wrong I was.</p>
<p>Since then I found out that delivery guy ignorance and package mishandling doesn&#8217;t only happen here, it <a href="https://www.youtube.com/watch?v=PKUDTPbDhnA">happens elsewhere too</a>. I&#8217;ve even been told that the &#8220;this side up&#8221; sign is ignored, they only care where the label is so it can be scanned fast and automatically.</p>
<p>The prices on their price lists are also out right ridiculous. Most companies I&#8217;ve seen only offer fast shipping (1-2 business days in Europe), if you want anything cheaper/slower you go the way of the local post, which is unreliable and can&#8217;t guarantee anything (and will usually take 5-10 business days in Europe).</p>
<p>Returning packages is another thing that is far from solved &#8211; from the delivery companies to customs officers, so it&#8217;s really hard to create a good experience for the customer to return an item free of charge.</p>
<p>As usually with these huge systems you need to get to the people level to get things working &#8211; when you&#8217;re calling a person not a number, when you call the delivery guy by name everything works. For everything else you try to hack the system to get what you want&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://friedcell.si/outbreak/2014/10/05/shipping/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Benchmarking web servers</title>
		<link>http://friedcell.si/outbreak/2014/08/25/benchmarking-web-servers/</link>
		<comments>http://friedcell.si/outbreak/2014/08/25/benchmarking-web-servers/#comments</comments>
		<pubDate>Mon, 25 Aug 2014 14:19:06 +0000</pubDate>
		<dc:creator><![CDATA[Marko Mrdjenovic]]></dc:creator>
				<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://friedcell.si/outbreak/?p=442</guid>
		<description><![CDATA[We recently bought a server at CubeSensors and are now putting it through its paces. One of the things I was looking at was our HTTP server / load balancing setup. We&#8217;re currently using an Nginx server in front of Tornado instances and I was wondering if there is something that is more specialized and [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>We recently bought a server at CubeSensors and are now putting it through its paces.</p>
<p>One of the things I was looking at was our HTTP server / load balancing setup. We&#8217;re currently using an Nginx server in front of Tornado instances and I was wondering if there is something that is more specialized and thus likely faster that would allow for realtime upstream configuration changes. I found HAProxy.</p>
<p>I did a simple setup on the server (Ubuntu 14.04) to test things:</p>
<ul>
<li>Nginx 1.6.1</li>
<li>HAProxy 1.5.3</li>
<li>Tornado 4.0.1</li>
</ul>
<p>Tornado is running a very simple app that only returns OK at /, there&#8217;s two of them and both are started with 2 forks (<code>server.start(2)</code>). HAProxy is set up with <code>option http-keep-alive</code> with a 60s timeout and points to the two Tornados while Nginx has two virtual hosts, one linked directly to Tornados with <code>keepalive 4</code>, the other to HAProxy also the same keepalive setting, both with <code>proxy_http_version 1.1</code> and removed Connection header. Server timeout is set to 30s, client to 10s.</p>
<p>The first idea was to test with <code>ab</code> using something like <code>ab -n 10000 -c 100 URL</code>. On a machine that is running nothing else but the tests, the times were changing way too much from one test to another. I also noticed that ab is making HTTP 1.0 requests.</p>
<p>The second tool I tried is <code>siege</code>, which has a few different options than <code>ab</code> and also makes HTTP/1.1 requests. I used <code>siege -c 1000 -r 100 -b URL</code> and Nginx-Tornado combination manages a 50% higher transaction rate than any combination with HAProxy. But I think this says more about my ability to configure HAProxy than it does about HAProxy itself &#8211; I keep getting a bunch of stale connections (in TIME_WAIT state) hanging around even with <code>option forceclose</code>.</p>
<p>Resolution: sticking with Nginx. It can log POST body, upstream configuration changes will be handled by including the upstream configuration which can be changed and reloaded.</p>
]]></content:encoded>
			<wfw:commentRss>http://friedcell.si/outbreak/2014/08/25/benchmarking-web-servers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Security questions</title>
		<link>http://friedcell.si/outbreak/2013/09/23/security-questions/</link>
		<comments>http://friedcell.si/outbreak/2013/09/23/security-questions/#comments</comments>
		<pubDate>Mon, 23 Sep 2013 20:32:33 +0000</pubDate>
		<dc:creator><![CDATA[Marko Mrdjenovic]]></dc:creator>
				<category><![CDATA[blurps]]></category>

		<guid isPermaLink="false">http://friedcell.si/outbreak/?p=436</guid>
		<description><![CDATA[I was just asked two security questions by Apple after trying to buy an app. Apple says it&#8217;s the first app on this device, but what they really mean is &#8220;the first app on this device with iOS7&#8221;. I didn&#8217;t know the answer to any of them so I now have to reset them and [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I was just asked two security questions by Apple after trying to buy an app. Apple says it&#8217;s the first app on this device, but what they really mean is &#8220;the first app on this device with iOS7&#8221;. I didn&#8217;t know the answer to any of them so I now have to reset them and who knows what else.</p>
<p>I have no idea who decided that security questions were a good idea in the first place. The answer to the question can usually either be easily researched (maiden names, first teachers, first cars,&#8230;) or hard to remember. The first one is a problem because then they don&#8217;t really provide any security, only add friction to the process. </p>
<p>Remembering the answers is a bigger problem because of a few reasons. Some of the questions are hard to answer in the first place &#8211; I for one have no idea what my first concert was and even if I think about it I have no idea if when setting the answer I thought the one at school counts or was it the first one I bought tickets for myself, which band did I write or did I wrote all of them in what order and in what form. Geographic questions are also much fun because you never know how local your answer was &#8211; was it the street, town, county, state,&#8230; And because of the first issue, the easily researched questions get tricky answers that you never again remember unless they are really obvious, which again makes them easily breakable.</p>
<p>I can see some value in these kinds of questions when there is a person on the other side, but only if that person is trained to recognize people that make up stories and lie. But this doesn&#8217;t happen very often.</p>
<p>So if you want something to be secure, make users select stronger passwords. Don&#8217;t add shit that <a href="https://www.schneier.com/essay-081.html">doesn&#8217;t add security but problems</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://friedcell.si/outbreak/2013/09/23/security-questions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Work for food</title>
		<link>http://friedcell.si/outbreak/2013/06/04/work-for-food/</link>
		<comments>http://friedcell.si/outbreak/2013/06/04/work-for-food/#comments</comments>
		<pubDate>Tue, 04 Jun 2013 21:04:23 +0000</pubDate>
		<dc:creator><![CDATA[Marko Mrdjenovic]]></dc:creator>
				<category><![CDATA[thoughts]]></category>

		<guid isPermaLink="false">http://friedcell.si/outbreak/?p=427</guid>
		<description><![CDATA[I&#8217;ve recently been exposed to two different local companies looking to get work done for what is essentially free. Ads The first one was a request by a reputable event venue looking for the visual identity for an international Jazz festival. Their posting vas very raw, saying only what they want (a poster) and what [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve recently been exposed to two different local companies looking to get work done for what is essentially free.</p>
<h3>Ads</h3>
<p>The first one was a request by a reputable event venue looking for the visual identity for an international Jazz festival. Their posting vas very raw, saying only what they want (a poster) and what they give in return (tickets to the festival and a t-shirt).</p>
<p>The second one was a request by a PR agency for a month long stint doing &#8220;PR and Event Management&#8221;. The posting is humorous and very well written (PR agency, remember?) and also includes a list of what they want (full day of hard work) and what they give in return (lunchmoney).</p>
<h3>Interpretation</h3>
<p>As usually both postings leave a lot of room for interpretation and of course people base their interpretation on their feelings towards the company. To make things even I&#8217;ll try to make two interpretations for both &#8211; one optimistic and one pessimistic.</p>
<h4>Optimist</h4>
<p>The first request is targeted at aspiring designers who have either just finished their studies and cannot find work or are trying to find work as designers even though they studied something else. Maybe they&#8217;re just Jazz fans trying design while unemployed. Since the event organizer has a team of internal designers they&#8217;re not actually looking for all the applications (logo, poster, booklet, tickets,&#8230;) &#8211; they want a poster that communicates an idea (agencies will tell you that ideas are hard to come by, entrepreneurs will sell them a-dime-a-dozen). Since designers are usually hired based on their portfolios (preferring published work) winning this could jumpstart a career. It could even possibly lead to a job for a music label or another, bigger music festival.</p>
<p>The second request is targeted at people who know that in PR and Event Management it&#8217;s all about who you know and who you&#8217;ve worked with. This means that working for a company on multinational accounts can lead to a job in either this same company or at the multinationals &#8211; which could get you far. The company is only asking for a month of &#8220;free&#8221; work and is actually using this as a testing period for a full-time hire after the month expires. They&#8217;re a good standing company with loads of work and the salary is great. Since you&#8217;ll be working a lot with a great bunch of people you&#8217;re learn so much that after the month is over you&#8217;ll not only have the offer from this company, but from at least three more.</p>
<h4>Pessimist</h4>
<p>The first request is a way to get a free visual identity because they want to fire the internal design team as soon as possible. The winner will have to do all the applications for free after he wins and the tickets will be the worst you can possibly get for a concert, while the t-shirt will be of the wrong size. They will not allow you to sign your work or advertise that you did it.</p>
<p>The second request is a way to pay less for people who will pass out flyers at events, make coffee and type CEOs recordings of PR notices. It also includes sending <span title="spam">PR emails</span> from  to media and journalists and <span title="harassing">reminding</span> them every day until they publish. Since you&#8217;ll be working hard all day there won&#8217;t be any time for mentoring or observing what others do and after you&#8217;re done coworkers won&#8217;t even remember your name.</p>
<h3>But&#8230;</h3>
<p>People who supported one and not the other were probably thinking of one as a pessimist and the other as an optimist. Knowing the companies they might be right, but that doesn&#8217;t change the fact that none of these scenarios are probably true. </p>
<p>The economist in me will say that if you can make people work for you for free, just so they get an entry in their CV, you should. But <strong>is that the right thing to do?</strong> I don&#8217;t think so. It&#8217;s a tricky subject and there&#8217;s a lot of different arguments for and against such requests and quite a few of them surfaced in the discussions on Slovenian social media. The bottom line for me is that it&#8217;s a slippery slope&#8230; But that&#8217;s a whole new post.</p>
]]></content:encoded>
			<wfw:commentRss>http://friedcell.si/outbreak/2013/06/04/work-for-food/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A website is usually not just one product</title>
		<link>http://friedcell.si/outbreak/2012/05/15/a-website-is-usually-not-just-one-app/</link>
		<comments>http://friedcell.si/outbreak/2012/05/15/a-website-is-usually-not-just-one-app/#comments</comments>
		<pubDate>Tue, 15 May 2012 08:53:40 +0000</pubDate>
		<dc:creator><![CDATA[Marko Mrdjenovic]]></dc:creator>
				<category><![CDATA[blurps]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=420</guid>
		<description><![CDATA[By releasing Inside government we were testing a proposition (‘all of what government is doing and why in one place’), and two supporting products (a frontend website and a content management system). Ross Ferguson People usually forget this. When you don&#8217;t, your project has way more chances to succeed.]]></description>
				<content:encoded><![CDATA[<blockquote cite="http://digital.cabinetoffice.gov.uk/2012/05/14/feedback-isnt-just-for-cobain-and-hendrix-what-we-heard-from-the-inside-government-beta/">
<p>By releasing Inside government we were testing a proposition (‘all of what government is doing and why in one place’), and two supporting products (a frontend website and a content management system).</p>
<p><cite>Ross Ferguson</cite></p>
</blockquote>
<p>People usually forget this. When you don&#8217;t, <a href="http://digital.cabinetoffice.gov.uk/2012/05/14/feedback-isnt-just-for-cobain-and-hendrix-what-we-heard-from-the-inside-government-beta/">your project</a> has way more chances to succeed.</p>
]]></content:encoded>
			<wfw:commentRss>http://friedcell.si/outbreak/2012/05/15/a-website-is-usually-not-just-one-app/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Preloading resources</title>
		<link>http://friedcell.si/outbreak/2011/10/03/preloading-resources/</link>
		<comments>http://friedcell.si/outbreak/2011/10/03/preloading-resources/#comments</comments>
		<pubDate>Mon, 03 Oct 2011 09:05:36 +0000</pubDate>
		<dc:creator><![CDATA[Marko Mrdjenovic]]></dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=367</guid>
		<description><![CDATA[You might have read that when optimizing your site for speed HTTP requests are something to look at &#8211; less requests mean less waiting and usually a faster site. When doing that for CSS you&#8217;re faced with a dilemma: Put all of CSS in one file, which means less requests, but also means that the [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://developer.yahoo.com/performance/rules.html#num_http">You might have read</a> that when optimizing your site for speed <a href="http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol">HTTP</a> requests are something to look at &#8211; less requests mean less waiting and usually a faster site. When doing that for <a href="http://www.w3.org/Style/CSS/">CSS</a> you&#8217;re faced with a dilemma:</p>
<ol>
<li><strong>Put all of CSS in one file</strong>, which means less requests, but also means that the first time people land on your site, they will wait longer than needed to see the content which could mean a ruined first impression.</li>
<li><strong>Put CSS in per-section files</strong>, which means less loading up front but more request as people drill down into different sections of the page.</li>
</ol>
<p>When using the first option your only focus can be on how to optimize the CSS so that it loads as fast as possible and is as small as possible. As you have less files you can easily have that file minified and gzipped even if you&#8217;re not using a deployment solution that will do that for you.</p>
<p>Using the second variant gives you more options &#8211; you should still optimize the files, but now you have the option of deciding when to load them to make sure that the landing page does not get hit by the added request.</p>
<p>Even though I started with CSS preloading can be done for any resources needed on the page &#8211; fonts, scripts, images.</p>
<h3>When to preload?</h3>
<p>An very obvious case is a search results page. It usually has a very distinct design that requires certain resources not needed anywhere else. But that&#8217;s not enough &#8211; you need to know when the user will these resources so you don&#8217;t go preloading everything just in case. With search it&#8217;s when they focus inside a search box &#8211; they start typing the query, while you start preloading the resources in the background.</p>
<p>Other obvious places to preload resources:</p>
<ul>
<li>My account &#8211; when users click log-in or focus into the login form</li>
<li>Checkout &#8211; when users add stuff to their cart</li>
</ul>
<p>Other less obvious places are landing pages when the choice a user makes turns into many sub-options, especially when products have the same resources used on the content pages.</p>
<h3>To the code!</h3>
<p>If you&#8217;re already using a library it probably provides AJAX methods and event methods. If not, you can search <a href="http://microjs.com/#ajax">MicroJS</a> to find one and adapt the syntax.</p>
<p>A simple preloader is almost as simple as <em>helloWorld</em> &#8211; the only thing you need to make sure is that the type of data type is set to <code>text</code> so that it does not get executed.</p>
<pre><code>window.preload = function (src) {
	$.get(src, null, null, 'text');
} // call with preload('somefile.css');
</code></pre>
<p>If you want to allow the loading of multiple files at once you can detect if the passed element is an array.</p>
<pre><code>window.preload = function (data) {
	var a = $.isArray(data) ? data : [data];
	$.each(a, function (i, n) {
		$.get(n, null, null, 'text');
	});
}
// call with preload('somefile.css');
// or preload(['somefile.css', 'otherfile.js']);</code></pre>
<p>If you prefer to call the function with many parameters you can just use arguments in the each function call.</p>
<pre><code>window.preload = function () {
	$.each(arguments, function (i, n) {
		$.get(n, null, null, 'text');
	});
}
// call with preload('somefile.css');
// or preload('somefile.css', 'otherfile.js');</code></pre>
<p>Key element is to load the resources after the window.onload has happened &#8211; this means that any resources needed for the page to function properly have been loaded. If you do stuff sooner you might have to wait for other resources like fonts, images, videos. This means you need to know if the onload event happened &#8211; if it has, preload immediately, otherwise wait for the event to fire.</p>
<pre><code>(function () {
	var win = window,
		$ = window.jQuery,
		$win = $(win);
	$win.load(function () {
		$win.data('loaded', true);
	});
	win.preload = function (data) {
		var a = $.isArray(data) ? data : [data],
			fn = function (i, n) {
				$.each(a, function () {
					$.get(n, null, null, 'text');
				});
			};
		if ($win.data('loaded')) {
			fn();
		} else {
			$win.load(fn);
		}
	};
}());
// call with preload('somefile.css');
// or preload(['somefile.css', 'otherfile.js']);</code></pre>
<p>As you can see I also did a few other things &#8211; wrapped the code into a function to isolate all the variables. I also assigned window.jQuery to a local $ to make it a bit more bulletproof.</p>
<p>Needless to say this script needs to be loaded during the load stage. If you intend to load it afterwards you need to make sure that you properly detect the onload event &#8211; if you don&#8217;t nothing will get preloaded as it will be waiting for that event to fire.</p>
]]></content:encoded>
			<wfw:commentRss>http://friedcell.si/outbreak/2011/10/03/preloading-resources/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Taking your webapp offline</title>
		<link>http://friedcell.si/outbreak/2011/08/21/taking-your-webapp-offline/</link>
		<comments>http://friedcell.si/outbreak/2011/08/21/taking-your-webapp-offline/#comments</comments>
		<pubDate>Sun, 21 Aug 2011 21:05:39 +0000</pubDate>
		<dc:creator><![CDATA[Marko Mrdjenovic]]></dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[safari]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=358</guid>
		<description><![CDATA[I&#8217;ve recently done a few things that would benefit from having an offline mode. Empowered by Appcache Facts I tried to make the newly published La Vuelta 2011 results page an offline-capable app. Goal The goal of this exercise is twofold: To force caching of resources that slow down the loading of your page. To [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve recently done a few things that would benefit from having an offline mode. Empowered by <a href="http://appcachefacts.info">Appcache Facts</a> I tried to make the newly published <a href="http://friedcell.net/vuelta/">La Vuelta 2011 results page</a> an offline-capable app.</p>
<h3>Goal</h3>
<p>The goal of this exercise is twofold:</p>
<ol>
<li>To force caching of resources that slow down the loading of your page.</li>
<li>To actually be able to use the app when offline.</li>
</ol>
<h3>Solution</h3>
<p>It&#8217;s as simple as writing a cache manifest. It pays to name it [something]<strong>.manifest</strong>, as Apache already serves the correct header with that suffix. What you do is list all the files you want cached, add stuff you allow on the network (check <a href="http://appcachefacts.info">Appcache Facts</a> and <a href="http://diveintohtml5.org/offline.html">Dive Into HTML5 &#8211; Offline Web Applications</a>) and it all works. Except it doesn&#8217;t.</p>
<pre><code>CACHE MANIFEST
# version 1

CACHE:
resource.js

NETWORK:
&#42;
http:&#47;&#47;&#42;
https:&#47;&#47;&#42;</code></pre>
<h4>AJAX stuff</h4>
<p>If you&#8217;re using AJAX to get data from a server using jsonp/script, your framework of choice (jQuery in my case) will probably default to using a no-cache approach to loading it. This will mean that it will request the file + some suffix to prevent browser caching. This will mean that the resource will not be available if you&#8217;re actually online.</p>
<p>You can use <em>navigator.onLine</em> to switch cache on/off, but I suggest you first try requesting the no-cache resource and if it errors out, request the cached resource. The benefit is that even if you are online but the server is not, the users will still see the data / use the app.</p>
<pre><code>$.ajax({
	dataType: 'script',
	url: 'resource.js',
	cache: false,
	success: successHandler,
	error: function () {
		$.ajax({
			dataType: 'script',
			url: 'resource.js',
			cache: true,
			success: successHandler
		});
	}
});</code></pre>
<h4>iPad issues</h4>
<p>Fixing the AJAX meant that it worked properly on the desktop (test with Firefox that has offline mode) and in Safari on the iPad. The trouble started when I added the app to <em>Home Screen</em> &#8211; data failed to load. It was the same app as in Safari and it should have worked.</p>
<p>After some debugging I found out that the data actually was loaded but the eval failed (I was using $.getScript). Some weird testing showed that the problem was a newline character in the data. As I really liked the newline there I added some code to the error handling that removed the newline and evaled the data, then ran success. And it worked!</p>
<pre><code>$.ajax({
	dataType: 'script',
	url: 'resource.js',
	cache: false,
	success: successHandler,
	error: function () {
		$.ajax({
			dataType: 'script',
			url: 'resource.js',
			cache: true,
			success: successHandler,
			error: function (xhr) {
				eval(xhr.textResponse.replace(/\n/g, ''));
				successHandler();
			}
		});
	}
});</code></pre>
<h3>Debugging</h3>
<p>It&#8217;s somewhat hard to debug offline stuff. I suggest using a clearly visible version indicator in the file to make sure you know which version of the file you&#8217;re looking at. Also remember that the first time you load the app after changing the file &amp; cache manifest it is served from cache. At the same time the manifest is checked and on the iPad the files are downloaded after everything else is done (app finished loading and rendering).</p>
<h3>It works!</h3>
<p>After these problems were solved I used the aforementioned navigator.onLine to hide stuff that normally comes from the network but is not relevant to the offline app (banners, share links, like/+1 buttons) and you can now check the <a href="http://friedcell.net/vuelta/">La Vuelta 2011 results page</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://friedcell.si/outbreak/2011/08/21/taking-your-webapp-offline/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Form protection</title>
		<link>http://friedcell.si/outbreak/2011/08/05/form-protection/</link>
		<comments>http://friedcell.si/outbreak/2011/08/05/form-protection/#comments</comments>
		<pubDate>Fri, 05 Aug 2011 14:34:54 +0000</pubDate>
		<dc:creator><![CDATA[Marko Mrdjenovic]]></dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[general]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=346</guid>
		<description><![CDATA[I&#8217;ve seen a discussion recently on how to protect your forms from spammers/bots that come and fill the forms to either fill your database with crap data or fill your page with porn links. When I read the answers I figured out that none of the people read the amazing article I did years ago, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve seen a discussion recently on how to protect your forms from spammers/bots that come and fill the forms to either fill your database with crap data or fill your page with porn links. When I read the answers I figured out that none of the people read the amazing article I did years ago, so I decided to try to remember what it said. So, <strong>a big fat disclaimer</strong>: I read this in an article somewhere and I don&#8217;t remember where. If you know the original article please post it in the comments, I&#8217;d love to link to it, I bet it has way more info than this one.</p>
<h3>The problem</h3>
<p>Almost all websites now have some forms on them, some of them are contact / registration forms, others use the data submitted and display it on the site itself (comment forms). But letting others submit data to your site/database opens you to all sorts of attacks. If you actually show the content of the submitted form, you&#8217;ll get a bunch of spammers posting comments with lots of links. If you only store data and not show it anywhere you&#8217;re still at risk &#8211; if you don&#8217;t notice your disk can fill up, your database may grow beyond its limits,&#8230; So what we want to do is to <strong>prevent bogus form posting</strong>.</p>
<h3>Spammer approach</h3>
<p>If you think about writing a spam-bot that will try to spam as many sites you possibly can you have two basic approaches.</p>
<h4>Record / replay</h4>
<p>This is a very simple approach &#8211; you use a person to submit the form, preferably with something that looks like real input and record the request made. Then you hand that data off to the bot, it changes some content and tries to resubmit it.</p>
<h4>Automation based on heuristics</h4>
<p>I wanted to say AI, but it really isn&#8217;t. What it is is a set of simple rules and randomized values that the bot thinks might trick your site into accepting the submit. Let&#8217;s say you have three fields, two are inputs with field names &#8220;name&#8221; and &#8220;email&#8221; and the third field is &#8220;comment&#8221;. A simple script can fill these with &#8220;valid&#8221; data and try to submit it.</p>
<h4>Human entry</h4>
<p>By far the simplest, but also most costly for spammers. Go on Amazon Turk or whatever other service, send a link to a Google Spreadsheet and have people manually enter the stuff into your forms. This is the source of &#8220;Sorry, this is my job&#8221; endings to spam comments.</p>
<h3>Popular solutions</h3>
<h4><a href="http://en.wikipedia.org/wiki/Turing_test">Turing test</a></h4>
<p>Add a field to the form that the user must fill with something that humans can do easily, but machines can&#8217;t. The biggest group here are <strong>Captchas</strong> (display an image with distorted characters, possibly an audio link that reads out the same characters, and have the user somehow figure it out and write the solution), but there have been others, like a &#8220;Human?&#8221; checkbox, or &#8220;3 + 4 =&#8221; fields, &#8220;Is this a kitten?&#8221; with a pic next to it.</p>
<h4>2-step process</h4>
<p>Supposedly by far the easiest way to do this is by introducing a 2-step process. After the initial submit, you get back a preview of the submitted data, possibly with a checkbox that says &#8220;Is this correct?&#8221; and another submit button. Robots are usually not good at following through and thus don&#8217;t actually submit the content.</p>
<p>Both solutions have an impact on user experience. With Captchas it&#8217;s sometimes really hard to see what they are and even if they have a &#8220;different image&#8221; link, it just seems like the owner of the site wants to make your life hell before you can submit your data. The other challenges might be easier on the user, but also easier to figure out if you&#8217;re being targeted by bots. The 2-step process works great for comments, that usually don&#8217;t have an edit link, so it might actually be good for user experience if done right (not Wikipedia style), but are less appropriate on other types of forms.</p>
<h3>Protect yourself differently</h3>
<p>These are the techniques that should prevent most bogus form entries from random passing bots, except &#8220;Human entry&#8221; &#8211; no protection for that, even though Captchas try hard. There is not much you can do when you&#8217;re targeted&#8230;</p>
<h4>Honeypot field</h4>
<p>Use this field to trick autoguessing bots to submit something in a field you know should be empty.</p>
<ul>
<li>Add an input field to your form with a regular name (state, maiden-name,&#8230;) that does not appear on your form otherwise.</li>
<li>Use a label that will clearly communicate that it needs to be empty.</li>
<li>Hide it with CSS, preferably not by adding class=&#8221;hidden&#8221;.</li>
</ul>
<p>If the form post includes content in this field discard it and redirect back to the form. The trick is to make sure the bots don&#8217;t figure out this is a honeypot, so use valid looking but nonsensical classes&#8230;</p>
<h4>Date field</h4>
<p>Use it to prevent resubmit of data too far from the creation date. Allow users a few hours to post the form.</p>
<p>To prevent manual modification you can use either proper encryption (symetric or asymetric) that will allow you to decode it on form post or use this date in combination with the onetime token.</p>
<h4>Onetime token</h4>
<p>Use this field to prevent replay of request data. If you can, save it into the database.It is a good idea to make this token in a form that it cannot be faked (say one character changed ad you have a valid one). This can be done with hashing data or encryption.</p>
<p>This one can be as tricky as you want. What I usually do (disclaimer: I don&#8217;t know much about encryption so this might be crap advice) is use a plain datetime field with the onetime token generated from <strong>IP address</strong>, <strong>UserAgent</strong> and the date field with <a href="http://en.wikipedia.org/wiki/HMAC">HMAC</a>. There is no need for this token to be reversible &#8211; I can recreate the same thing with the data from the form post and check if it matches.</p>
<p>When using these techniques make sure you take care of the user experience. If you detect a problem on what might be valid user input (&#8220;timeout&#8221; on the date field with a non used onetime token, wrong onetime token from an ip change by the service provider), you might want to display a second step from the &#8220;2-step process&#8221;. Whatever you do, don&#8217;t call your users spammers or bots &#8211; be nice, bots don&#8217;t read the text anyway.</p>
<h3>Did I miss anything?</h3>
<p>I know of no plugin that uses all of these techniques, but I haven&#8217;t really looked for it. What I do know is that I don&#8217;t want to ever use a Captcha, cause it often keeps me out, and the 2-step process in just too weird sometimes. Hope this helps. And again &#8211; if you find the original article (must be some 5 years old now at least if not more) or have any other solutions you use or endorse, do leave a comment.</p>
]]></content:encoded>
			<wfw:commentRss>http://friedcell.si/outbreak/2011/08/05/form-protection/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>View Source Alliance</title>
		<link>http://friedcell.si/outbreak/2010/11/19/view-source-alliance/</link>
		<comments>http://friedcell.si/outbreak/2010/11/19/view-source-alliance/#comments</comments>
		<pubDate>Fri, 19 Nov 2010 21:35:47 +0000</pubDate>
		<dc:creator><![CDATA[Marko Mrdjenovic]]></dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[thoughts]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=343</guid>
		<description><![CDATA[Most of what I learned on the web in my early years was from &#8220;View Source&#8221;. Then came the books and the conferences. It makes me sad to see lots of sites minifying code for performance and not releasing the full version of the code so other developers could learn from it. It&#8217;s the openness that [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Most of what I learned on the web in my early years was from &#8220;View Source&#8221;. Then came the books and the conferences.</p>
<p>It makes me sad to see lots of sites minifying code for performance and not releasing the full version of the code so other developers could learn from it. It&#8217;s the openness that I really like about the web.</p>
<p>I think there should be a &#8220;View Source Alliance&#8221; that would set rules on how to release your code in a way that visitors can benefit from the speed of minified code, while web developers can still find your full files and learn from them.</p>
<p>I&#8217;ll set a few simple rules here, hoping somebody with more reach picks them up:</p>
<ol>
<li>If you minify the files for them, use a simple convention name.min.ext (say jquery.min.js)</li>
<li>When you deploy minified files, also deploy their full version at name.ext (say jquery.js)</li>
<li>If you for some reason can&#8217;t release the full files next to the minified ones, add this to the top of the minified file: /*viewsource*http://path.to/full.ext*/ (say /*viewsource*http://http://code.jquery.com/jquery-1.4.4.js*/)</li>
</ol>
<p>This way you will not only help others, but sometimes even stop breaking the law. Because you might be using some open source code with a licence that says you must release your code with a same/similar licence.</p>
]]></content:encoded>
			<wfw:commentRss>http://friedcell.si/outbreak/2010/11/19/view-source-alliance/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Motivation and hiring</title>
		<link>http://friedcell.si/outbreak/2010/11/16/motivation-and-hiring/</link>
		<comments>http://friedcell.si/outbreak/2010/11/16/motivation-and-hiring/#comments</comments>
		<pubDate>Tue, 16 Nov 2010 00:12:24 +0000</pubDate>
		<dc:creator><![CDATA[Marko Mrdjenovic]]></dc:creator>
				<category><![CDATA[thoughts]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=340</guid>
		<description><![CDATA[I don&#8217;t think I ever wrote about motivation much here even though it&#8217;s one of my favorite subjects and was also the main topic of my thesis. Recently I&#8217;ve been thinking about it quite a lot again and I&#8217;ve come to the conclusion that it&#8217;s very important to use it to hire the right person. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I don&#8217;t think I ever wrote about motivation much here even though it&#8217;s one of my favorite subjects and was also the main topic of my thesis. Recently I&#8217;ve been thinking about it quite a lot again and I&#8217;ve come to the conclusion that it&#8217;s very important to use it to hire the right person.</p>
<p>Back to the beginning. There are loads of theories on motivation and most of them just cover different aspects and mostly they can all live together. One of the aspects of motivation is where it comes from. That gives us <strong>intrinsic motivation</strong> and <strong>extrinsic motivation</strong>. Obviously it&#8217;s not a boolean thing as any individual sits on a line between the extremes. And there&#8217;s also the matter of having a different source of motivation for different things. Let&#8217;s not get into that.</p>
<h4>Intrinsic motivation</h4>
<p>Let me quote <a href="http://en.wikipedia.org/wiki/Motivation#Intrinsic_and_extrinsic_motivation">Wikipedia</a> on this:</p>
<blockquote><p><strong>Intrinsic motivation</strong> refers to motivation that is driven by an interest or enjoyment in the task itself, and exists within the individual rather than relying on any external pressure.</p></blockquote>
<p>We are motivated by the fact that we&#8217;re getting something done and by the feeling we get ourselves when we&#8217;re done. We&#8217;re not in it so someone can tell us we did a good job. We don&#8217;t really care. A friend of mine once said: &#8220;It&#8217;s for me. If somebody else likes it &#8211; great.&#8221; We like to think that the more we get into the subject, the better we&#8217;ll be at it and the better the result. In other words no relying on luck, no shortcuts, no marketing/selling, no subpar stuff. Because of all this we don&#8217;t like when others interfere with stuff we&#8217;re responsible for.</p>
<h4>Extrinsic motivation</h4>
<p>Another quote from Wikipedia:</p>
<blockquote><p>Common extrinsic motivations are rewards like money and grades, coercion and threat of punishment. Competition is in general extrinsic because it encourages the performer to win and beat others, not to enjoy the intrinsic rewards of the activity.</p></blockquote>
<p>These people often need to be &#8220;managed&#8221; to give them the sense of direction and success and are in that way more demanding. They also need more information about what is going on and might see the successes of their co-workers as their own and be empowered by them.</p>
<h4>Who to hire?</h4>
<p>You might want to hire intrinsically motivated people when you don&#8217;t have the management layers to keep them motivated or you just don&#8217;t have time to do that. On the other hand it&#8217;s very hard to keep them motivated when all the fun work is gone and thus tend to either switch tasks/assignments or try to over-explore/discover. These two reasons are also why some people want to hire intrinsically motivated employees only to later regret it as they can&#8217;t motivate them anymore or don&#8217;t know how.</p>
<p>Hiring extrinsically motivated people might be better for cases where you can manage them properly as they might feel lost without guidance. They are somewhat easier to motivate as you have a lot more ways to do it &#8211; sometimes even just a public pat on the back suffices. They are surely a better choice for a company in an established market as they thrive on beating the competition. If you have an &#8220;employee of the month&#8221; you should hire extrinsically motivated people.</p>
<p>I think it&#8217;s very important to hire a homogenous team motivation-wise. An extrinsically motivated manager might have a problem motivating an intrinsically employee and the employee won&#8217;t get why his extrinsically motivated colleague is bummed that he wasn&#8217;t complimented on the great work last week.</p>
<h4>The intrinsic problem</h4>
<p>We intrinsically motivated have a problem. Even though that extrinsically motivated people can internalize motivation when it matches their values and beliefs it is much more common for somewhat extrinsically motivated people to become more and more extrinsic with time due to the <a href="http://en.wikipedia.org/wiki/Overjustification_effect">Overjustification effect</a>. As that means that their number will go up with time, most of us are used to just getting in to solve the problems and then get out. Somewhat ironic that it sounds like a <a href="http://dictionary.reference.com/browse/mercenary">mercenary</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://friedcell.si/outbreak/2010/11/16/motivation-and-hiring/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>HTML Lint</title>
		<link>http://friedcell.si/outbreak/2010/08/30/html-lint/</link>
		<comments>http://friedcell.si/outbreak/2010/08/30/html-lint/#comments</comments>
		<pubDate>Mon, 30 Aug 2010 12:01:44 +0000</pubDate>
		<dc:creator><![CDATA[Marko Mrdjenovic]]></dc:creator>
				<category><![CDATA[blurps]]></category>

		<guid isPermaLink="false">http://friedcellcollective.net/outbreak/?p=328</guid>
		<description><![CDATA[From Lint Instructions: HTML Lint is a tool that makes sure your code looks good. While XHTML was very strict with syntax HTML 5 is more lenient like previous versions of HTML, which means keeping consistent code styles will become more difficult. Validating is not good enough anymore. HTML Lint is under constant development. If [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>From <a href="http://lint.brihten.com/html/help">Lint Instructions</a>:</p>
<blockquote><p><a href="http://lint.brihten.com/">HTML Lint</a> is a tool  that makes sure your code looks good. While XHTML was very strict with syntax HTML 5 is more lenient like previous versions of HTML, which means keeping consistent code styles will become more difficult. Validating is not good enough anymore.</p>
<p>HTML Lint is under constant development. If you find a bug, report it on Twitter.</p></blockquote>
<p>It started in Seattle, at <a class="zem_slink" title="An Event Apart" rel="homepage" href="http://www.aneventapart.com">An Event Apart</a>. <a class="zem_slink" title="Jeremy Keith" rel="homepage" href="http://adactio.com/">Jeremy Keith</a> said in his presentation that validation for <a class="zem_slink" title="HTML5" rel="wikipedia" href="http://en.wikipedia.org/wiki/HTML5">HTML5</a> doesn&#8217;t make much sense anymore and that there should be a <a href="http://en.wikipedia.org/wiki/Lint_%28software%29">Lint tool</a>. I started thinking about it and after lunch I asked Jeremy what options he wanted in it. I added some of my own and made the first version of it flying to Phoenix (going to <a class="zem_slink" title="IA Summit" rel="homepage" href="http://iasummit.org/2009">IA Summit</a>) and then fixed it flying back to <a class="zem_slink" title="Ljubljana" rel="wikipedia" href="http://en.wikipedia.org/wiki/Ljubljana">Ljubljana</a>.</p>
<p>We released the first version soon and updated it with a new design a few days ago. I&#8217;ve been putting the update off as I had a few other projects going on, but <a href="http://drupalradar.com/video-jeremy-keith-keynote-session">Jeremy mentioned it at Drupalcon</a> and <a href="http://remysharp.com/">Remy</a> pointed his <a href="http://htmllint.com">htmllint.com</a> to it and <a href="http://twitter.com/rem/statuses/22166149457">tweeted about it</a>. So it had to be done.</p>
<p>HTML Lint was coded in Python by <a href="http://mmm.si">MMM</a>, which consists of me (<a href="http://fry.si">Marko Mrdjenovič</a>) and <a href="http://markos.gaivo.net">Marko Samastur</a>. The design for it was done by <a href="http://saratusar.com">Sara Tušar Suhadolc</a>. The source code should be available soon.</p>
<h6 class="zemanta-related-title">Related articles by Zemanta</h6>
<ul class="zemanta-article-ul">
<li class="zemanta-article-ul-li"><a href="http://blog.reybango.com/2010/08/05/book-review-a-book-aparts-html5-for-web-designers-by-jeremy-keith/">Book Review: A Book Apart&#8217;s HTML5 for Web Designers by Jeremy Keith</a> (reybango.com)</li>
<li class="zemanta-article-ul-li"><a href="http://www.wait-till-i.com/2010/08/17/validate-dont/">validate() || dont()</a> (wait-till-i.com)</li>
<li class="zemanta-article-ul-li"><a href="http://www.nczonline.net/blog/2010/08/17/the-value-of-html-validation/">The value of HTML validation</a> (nczonline.net)</li>
<li class="zemanta-article-ul-li"><a href="http://www.456bereastreet.com/archive/201008/css3_is_not_html5/">CSS3 is not HTML5</a> (456bereastreet.com)</li>
</ul>
<div class="zemanta-pixie"><img class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=40289321-7ad8-4582-9f26-0f933f326927" alt="" /><span class="zem-script pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
]]></content:encoded>
			<wfw:commentRss>http://friedcell.si/outbreak/2010/08/30/html-lint/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
