CINXE.COM

Sebastian Riedel about Perl and the Web

<!DOCTYPE html><script>var __pbpa = true;</script><script>var translated_warning_string = 'Warning: Never enter your Tumblr password unless \u201chttps://www.tumblr.com/login\u201d\x0ais the address in your web browser.\x0a\x0aYou should also see a green \u201cTumblr, Inc.\u201d identification in the address bar.\x0a\x0aSpammers and other bad guys use fake forms to steal passwords.\x0a\x0aTumblr will never ask you to log in from a user\u2019s blog.\x0a\x0aAre you absolutely sure you want to continue?';</script><script type="text/javascript" language="javascript" src="https://assets.tumblr.com/assets/scripts/pre_tumblelog.js?_v=b9f848c06fcba7eaf305d4a7cb7a1b98"></script><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# blog: http://ogp.me/ns/blog#"> <title>Sebastian Riedel about Perl and the Web</title> <style>figure{margin:0}.tmblr-iframe{position:absolute}.tmblr-iframe.hide{display:none}.tmblr-iframe--amp-cta-button{visibility:hidden;position:fixed;bottom:10px;left:50%;transform:translateX(-50%);z-index:100}.tmblr-iframe--amp-cta-button.tmblr-iframe--loaded{visibility:visible;animation:iframe-app-cta-transition .2s ease-out}</style><link rel="stylesheet" media="screen" href="https://assets.tumblr.com/client/prod/standalone/blog-network-npf/index.build.css?_v=f085dde138e244526309d4673db67b4c"><link rel="icon" href="https://64.media.tumblr.com/avatar_1bdefb12b400_128.pnj"/> <link rel="alternate" type="application/rss+xml" title="RSS" href="https://kraih.tumblr.com/rss"/> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta name="viewport" content="width=775"/> <meta name="text:Disqus Shortname" content="" /> <link rel="stylesheet" href="https://static.tumblr.com/xcxngn2/Gr0lm7i86/style.css" type="text/css" media="screen" /> <style type="text/css" media="screen"> </style> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js"></script> <script src="https://static.tumblr.com/fpifyru/VCxlv9xwi/writecapture.js"></script> <script src="https://static.tumblr.com/fpifyru/AKFlv9zdu/embedgist.js"></script> <script> var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); document.write(unescape( "%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E" )); </script> <script> try { var pageTracker = _gat._getTracker("UA-7866593-1"); pageTracker._trackPageview(); } catch(err) {} </script> <style> #contents { width: 900px } div.content.text { width: 600px } ol.notes { background: none; border: none; box-shadow: none; } .post blockquote { border-left: 1px dashed #CCCCCC } .post pre { background-color: #FAFAFA; border: 1px solid #EEEEEE; padding: 10px; } p code { background-color: #FAFAFA; border: 1px solid #EEEEEE; } </style> <link rel="alternate" href="android-app://com.tumblr/tumblr/x-callback-url/blog?blogName=kraih" /><link rel="alternate" href="ios-app://305343404/tumblr/x-callback-url/blog?blogName=kraih" /><script defer type="application/javascript" id="bilmur" data-provider="tumblr.com" data-service="blognetwork" data-customproperties='{"theme": ""}' nonce="uJ8YwEwYhS9VSrqWWdApNTIxyg" src="https://s0.wp.com/wp-content/js/bilmur.min.js?m=202512" ></script><script src="https://assets.tumblr.com/assets/scripts/tumblelog_post_message_queue.js?_v=a8fadfa499d8cb7c3f8eefdf0b1adfdd"></script><link rel="stylesheet" type="text/css" href="https://assets.tumblr.com/fonts/gibson/stylesheet.css?v=3"><!-- BEGIN TUMBLR FACEBOOK OPENGRAPH TAGS --><!-- If you'd like to specify your own Open Graph tags, define the og:url and og:title tags in your theme's HTML. --><!-- Read more: http://ogp.me/ --><meta property="fb:app_id" content="48119224995" /><meta property="og:site_name" content="Tumblr" /><meta property="og:title" content="Sebastian Riedel about Perl and the Web" /><meta property="og:url" content="https://kraih.tumblr.com/?og=1" /><meta property="og:description" content="" /><meta property="og:type" content="profile" /><meta property="og:image" content="https://64.media.tumblr.com/avatar_1bdefb12b400_128.pnj" /><meta property="al:ios:url" content="tumblr://x-callback-url/blog?blogName=kraih" /><meta property="al:ios:app_name" content="Tumblr" /><meta property="al:ios:app_store_id" content="305343404" /><meta property="al:android:url" content="tumblr://x-callback-url/blog?blogName=kraih" /><meta property="al:android:app_name" content="Tumblr" /><meta property="al:android:package" content="com.tumblr" /><!-- END TUMBLR FACEBOOK OPENGRAPH TAGS --><!-- TWITTER TAGS --><meta charset="utf-8"><meta name="twitter:site" content="tumblr" /><meta name="twitter:card" content="summary" /><meta name="twitter:description" content="" /><meta name="twitter:title" content="Sebastian Riedel about Perl and the Web" /><meta name="twitter:app:name:iphone" content="Tumblr" /><meta name="twitter:app:name:ipad" content="Tumblr" /><meta name="twitter:app:name:googleplay" content="Tumblr" /><meta name="twitter:app:id:iphone" content="305343404" /><meta name="twitter:app:id:ipad" content="305343404" /><meta name="twitter:app:id:googleplay" content="com.tumblr" /><meta name="twitter:app:url:iphone" content="tumblr://x-callback-url/blog?blogName=kraih&amp;referrer=twitter-cards" /><meta name="twitter:app:url:ipad" content="tumblr://x-callback-url/blog?blogName=kraih&amp;referrer=twitter-cards" /><meta name="twitter:app:url:googleplay" content="tumblr://x-callback-url/blog?blogName=kraih&amp;referrer=twitter-cards" /><!-- GOOGLE CAROUSEL --><script type="application/ld+json"> {"@type":"ItemList","url":"https:\/\/kraih.tumblr.com","itemListElement":[{"@type":"ListItem","position":1,"url":"https:\/\/kraih.tumblr.com\/post\/178173935636\/mojolicious-80-released-perl-real-time-web"},{"@type":"ListItem","position":2,"url":"https:\/\/kraih.tumblr.com\/post\/147632979106\/mojolicious-70-released-perl-real-time-web"},{"@type":"ListItem","position":3,"url":"https:\/\/kraih.tumblr.com\/post\/112170845701\/mojolicious-60-released-perl-real-time-web"},{"@type":"ListItem","position":4,"url":"https:\/\/kraih.tumblr.com\/post\/87229338726\/mojolicious-50-released-perl-real-time-web"},{"@type":"ListItem","position":5,"url":"https:\/\/kraih.tumblr.com\/post\/76535091594\/mojoconf-2014"},{"@type":"ListItem","position":6,"url":"https:\/\/kraih.tumblr.com\/post\/69783934209\/convos-chatting-in-the-cloud-with-mojolicious"},{"@type":"ListItem","position":7,"url":"https:\/\/kraih.tumblr.com\/post\/50517069291\/mojolicious-40-released-perl-real-time-web"},{"@type":"ListItem","position":8,"url":"https:\/\/kraih.tumblr.com\/post\/43199352166\/mangolicious"},{"@type":"ListItem","position":9,"url":"https:\/\/kraih.tumblr.com\/post\/43199244554\/mojolicious-30-released-perl-real-time-web"},{"@type":"ListItem","position":10,"url":"https:\/\/kraih.tumblr.com\/post\/43199195822\/a-new-look-for-mojolicious"}],"@context":"http:\/\/schema.org"}</script><link rel="canonical" href="https://www.tumblr.com/kraih" /></head> <body> <div class="noise"> <div id="container"> <div id="header"> <h1><a href="/">Sebastian Riedel about Perl and the Web</a></h1> <ul id="nav"> </ul> </div> <a name="contents"></a> <div id="contents"> <div class="post"> <div class="sidebar"> <ul> <li class="date"><h2>17th September 2018</h2></li> <li class="notes"> <a href="https://kraih.tumblr.com/post/178173935636/mojolicious-80-released-perl-real-time-web/#notes">3 notes</a>&nbsp; </li> <li class="permalink"><a href="https://kraih.tumblr.com/post/178173935636/mojolicious-80-released-perl-real-time-web">Permalink</a></li> <li class="tweet"><a href="http://twitter.com/home?status=https://tmblr.co/Zb_kEy2bx-e0K" target="_blank">Tweet this</a></li> </ul> <p class="tags"> </p> </div> <div class="content text"> <div class="text-post"> <a href="https://kraih.tumblr.com/post/178173935636/mojolicious-80-released-perl-real-time-web">A TEXT POST</a> </div> <h3><a href="https://kraih.tumblr.com/post/178173935636/mojolicious-80-released-perl-real-time-web">Mojolicious 8.0 released: Perl real-time web framework</a></h3> <div class="go"> <p><img src="https://64.media.tumblr.com/43075598f8b8b223de5c9506e9ff07e3/tumblr_inline_pf5oi3Ctk11qcosu5_540.png" alt="" /></p><p>I&rsquo;m excited to announce the release of <a href="https://mojolicious.org">Mojolicious</a> 8.0 (Supervillain).</p><p>This release marks the culmination of a 2 year development cycle, reaching its conclusion last week at <a href="http://mojoconf.org">Mojoconf</a> in Norway. Where we were fortunate enough to have the whole core team present, for many very productive discussions and some <a href="https://github.com/mojolicious/Mojo-AsyncAwait">crazy fun experiments</a> to get <code>async</code>/<code>await</code> working with Perl and Mojolicious.</p><p>The project has been growing steadily in the past few years, with <a href="https://github.com/mojolicious/mojo/wiki/Projects-and-Companies-using-Mojolicious#companies">many companies</a> relying on Mojolicious to develop new code bases, and even 20 year old behemoths like <a href="https://bugzilla.mozilla.org">Bugzilla</a> getting <a href="https://www.youtube.com/watch?v=0jIk3s7GsEo">ported to Mojolicious</a>. To support the continued growth we&rsquo;ve decided to make a few organizational changes. From now on all new development will be consolidated in a single <a href="https://github.com/mojolicious">GitHub organization</a>. And our official IRC channel (<a href="https://kiwiirc.com/nextclient/#irc://irc.freenode.net/mojo?nick=guest-?">say hi!</a>) with almost 200 regulars will be moving to Freenode (<code>#mojo</code> on <code>irc.freenode.net</code>), to make it easier for people not yet part of the Perl community to get involved.</p><p><img src="https://64.media.tumblr.com/5390a982e912f7d73e96a357780f7016/tumblr_inline_pf5tpdRWA81qcosu5_540.jpg" alt="" /></p><p>When it comes to new features, this is probably our biggest release yet with 26 major features. For a complete overview you can take a look at the <a href="https://speakerdeck.com/kraih/eight-point-oh">slides from my Mojoconf talk</a> or <a href="https://www.youtube.com/watch?v=nYlFprRybzA">watch the video</a>. Here&rsquo;s a list of the highlights:</p><ul><li><strong>New logo</strong>: See above. :)</li><li><strong>Promises/A+</strong>: A <a href="https://mojolicious.org/perldoc/Mojo/Promise">new module</a> and <a href="https://speakerdeck.com/kraih/eight-point-oh?slide=51">pattern</a> for working with event loops.</li><li><strong>Roles</strong>: A new way to <a href="https://mojolicious.org/perldoc/Mojolicious/Guides/Testing#Extending-Test::Mojo">extend Mojo classes</a>.</li><li><strong>Subprocesses</strong>: Mix event loops and <a href="https://speakerdeck.com/kraih/eight-point-oh?slide=14">computationally expensive tasks</a>.</li><li><strong>Placeholder types</strong>: <a href="https://speakerdeck.com/kraih/eight-point-oh?slide=75">Avoid repretitive routes</a>.</li><li><strong>Mojo::File</strong>: A brand <a href="https://mojolicious.org/perldoc/Mojo/File">new module</a> for dealing with file systems.</li><li><strong>Cpanel::JSON::XS</strong>: Process JSON much much faster now.</li><li><strong>Mojo::PG</strong>: Many new <a href="https://mojolicious.org/perldoc/SQL/Abstract/Pg">SQL::Abstract extensions</a> for Postgres features.</li><li><strong>Minion</strong>: Our job queue now has an <a href="https://speakerdeck.com/kraih/eight-point-oh?slide=130">admin ui</a>.</li></ul><p>As usual there is a lot more to discover, see <a href="https://github.com/mojolicious/mojo/blob/v8.0/Changes">Changes</a> on GitHub for the full list of improvements.</p><p>Have fun!</p> </div> </div> </div> <div class="post"> <div class="sidebar"> <ul> <li class="date"><h2>19th July 2016</h2></li> <li class="notes"> <a href="https://kraih.tumblr.com/post/147632979106/mojolicious-70-released-perl-real-time-web/#notes">8 notes</a>&nbsp; </li> <li class="permalink"><a href="https://kraih.tumblr.com/post/147632979106/mojolicious-70-released-perl-real-time-web">Permalink</a></li> <li class="tweet"><a href="http://twitter.com/home?status=https://tmblr.co/Zb_kEy29Vd7oY" target="_blank">Tweet this</a></li> </ul> <p class="tags"> </p> </div> <div class="content text"> <div class="text-post"> <a href="https://kraih.tumblr.com/post/147632979106/mojolicious-70-released-perl-real-time-web">A TEXT POST</a> </div> <h3><a href="https://kraih.tumblr.com/post/147632979106/mojolicious-70-released-perl-real-time-web">Mojolicious 7.0 released: Perl real-time web framework</a></h3> <div class="go"> <figure data-orig-width="438" data-orig-height="289" class="tmblr-full"><img src="https://64.media.tumblr.com/fd7a8598b2e94ad17942e8d1bc676380/tumblr_inline_oaixylYAbp1qcosu5_500.png" alt="image" data-orig-width="438" data-orig-height="289" width="438" height="289" /></figure><p>I&rsquo;m excited to announce the release of <a href="http://mojolicious.org">Mojolicious</a> 7.0 (Doughnut).</p><p>While the community around Mojolicious keeps growing, you might be surprised to hear that the distribution itself has actually been shrinking. This is a very good thing, even with all the features we added over the years, we&rsquo;ve managed to reduce the code size from 11247 lines in 2010, to 8490 lines today.</p><figure data-orig-width="1038" data-orig-height="268" class="tmblr-full"><img src="https://64.media.tumblr.com/ffdd41342d502bf03fd5cf4b8e4de4da/tumblr_inline_oaj2zo7He21qcosu5_500.png" alt="image" data-orig-width="1038" data-orig-height="268" width="500" height="129" /></figure><p>As you can see, it&rsquo;s not a new trend, we put a lot of emphasis on iterative improvements, and that includes finding more efficient solutions to already solved problems. At the same time the number of tests has grown with every release, and we have now reached a very comfortable test coverage score of 95% with 11245 tests.</p><figure data-orig-width="1040" data-orig-height="284" class="tmblr-full"><img src="https://64.media.tumblr.com/8cb9c26b75d30ced3996f7971597ebf7/tumblr_inline_oaj3ocko311qcosu5_500.png" alt="image" data-orig-width="1040" data-orig-height="284" width="500" height="137" /></figure><p>With every release so far, we&rsquo;ve also seen significant performance improvements. This is once again the case in 7.0, even though it keeps getting harder to find opportunities for optimizations. And especially ones that would show up on the &ldquo;requests per second&rdquo; benchmarks we run regularly.</p><figure data-orig-width="1040" data-orig-height="280" class="tmblr-full"><img src="https://64.media.tumblr.com/67062a94174a9c39742c9c22be7d758f/tumblr_inline_oaj525etyB1qcosu5_500.png" alt="image" data-orig-width="1040" data-orig-height="280" width="500" height="135" /></figure><p>Additionally, we&rsquo;ve refactored a few internals, to <a href="https://github.com/kraih/mojo/issues/925">make sure</a> that our built-in HTTP and WebSocket servers can scale efficiently with large numbers of CPU cores, which have become much more commonly available.<br /></p><p>While the main focus this year has been on stability,&nbsp;there are also a few new features, here&rsquo;s a list of the highlights:<br /></p><ul><li><b>Named variables in all templates:</b> Mojo::Template now supports named variables natively. (<a href="http://mojolicious.org/perldoc/Mojo/Template#SYNOPSIS">example</a>)</li><li><b>HTTP methods:</b> An &ldquo;_method<i>&rdquo;</i> query parameter can now be used to override the request method. (<a href="http://mojolicious.org/perldoc/Mojolicious/Guides/Routing#HTTP-methods">example</a>)</li><li><b>SNI:</b> Now also on the server-side. (<a href="http://mojolicious.org/perldoc/Mojo/Server/Daemon#listen">example</a>)</li><li><b>Windows:</b> Full support for <a href="https://github.com/kraih/mojo/issues/954">Ubuntu on Windows</a>, including zero downtime software upgrades.<br /></li><li><b>Validation filters:</b> Parameters can now be filtered before validation. (<a href="http://mojolicious.org/perldoc/Mojolicious/Validator#FILTERS">example</a>)</li><li><b>WebSocket subprotocols:</b> We now support WebSocket subprotocol negotiation. (<a href="http://mojolicious.org/perldoc/Mojolicious/Guides/Cookbook#WebSocket-web-service">example</a>)</li><li><b>Minion:</b>&nbsp;Our little <a href="http://mojolicious.org/perldoc/Minion">job queue</a> got much faster and now has support for parallel processing, multiple named queues, retrying failed jobs automatically and job dependencies.<br /></li><li><b>Code of conduct:</b> Diversity matters a lot to us, and therefore we have decided to adopt a <a href="http://mojolicious.org/perldoc/Mojolicious/Guides/Contributing#CODE-OF-CONDUCT">code of conduct</a>.</li></ul><p>And as usual there is a lot more to discover, see <a href="https://github.com/kraih/mojo/blob/v7.0/Changes">Changes</a> on GitHub for the full list of improvements.</p><p>P.S.: We now have <a href="https://www.stickermule.com/user/1070707933/stickers">stickers</a>.</p><figure data-orig-width="600" data-orig-height="338" class="tmblr-full"><img src="https://64.media.tumblr.com/a0922e1b0ddf33bdc07562afafb81db0/tumblr_inline_oajl9gcJQn1qcosu5_500.jpg" alt="image" data-orig-width="600" data-orig-height="338" width="500" height="282" /></figure><p>Have fun!</p> </div> </div> </div> <div class="post"> <div class="sidebar"> <ul> <li class="date"><h2>27th February 2015</h2></li> <li class="notes"> <a href="https://kraih.tumblr.com/post/112170845701/mojolicious-60-released-perl-real-time-web/#notes">11 notes</a>&nbsp; </li> <li class="permalink"><a href="https://kraih.tumblr.com/post/112170845701/mojolicious-60-released-perl-real-time-web">Permalink</a></li> <li class="tweet"><a href="http://twitter.com/home?status=https://tmblr.co/Zb_kEy1eTvqO5" target="_blank">Tweet this</a></li> </ul> <p class="tags"> </p> </div> <div class="content text"> <div class="text-post"> <a href="https://kraih.tumblr.com/post/112170845701/mojolicious-60-released-perl-real-time-web">A TEXT POST</a> </div> <h3><a href="https://kraih.tumblr.com/post/112170845701/mojolicious-60-released-perl-real-time-web">Mojolicious 6.0 released: Perl real-time web framework</a></h3> <div class="go"> <figure data-orig-height="289" data-orig-width="438" data-orig-src="https://64.media.tumblr.com/cd4a8aade59688b3e171f040df65b31c/tumblr_inline_nke9302a1u1qcosu5.png"><img src="https://64.media.tumblr.com/cd4a8aade59688b3e171f040df65b31c/tumblr_inline_pa2h76NjVN1qcosu5_500.png" alt="image" data-orig-height="289" data-orig-width="438" data-orig-src="https://64.media.tumblr.com/cd4a8aade59688b3e171f040df65b31c/tumblr_inline_nke9302a1u1qcosu5.png" width="438" height="289" /></figure><p>It fills me with great joy to announce the release of <a href="http://mojolicious.org">Mojolicious</a> 6.0 (Clinking Beer Mugs).</p><p>This has been the first major release for the newest member of our core team, please welcome <a href="https://twitter.com/jhthorsen">Jan Henning Thorsen</a>. It would appear that 2015 will be remembered as the year of the <a href="https://fosdem.org/2015/schedule/event/get_ready_to_party/">6.0 releases</a>, but the year is still young and there&rsquo;s a lot more for us to look forward to. The IETF has just&nbsp;<a href="http://www.ietf.org/blog/2015/02/http2-approved/">approved HTTP/2</a>, which may, for better or worse, change completely how we develop web applications, and we can&rsquo;t wait to see where this will lead us. There will also be a&nbsp;Mojoconf this year, in New York, preparations have already begun and we should be able to share more details very soon.</p><p>As real-time web technologies are becoming more and more mainstream, the community has matured, but kept up a steady growth rate. We have been able to reinforce our position as the most <a href="https://github.com/kraih/mojo">starred</a> Perl project on GitHub, and every day there are now hundreds of users browsing through the <a href="http://mojolicious.org/perldoc">official documentation</a>. The&nbsp;<a href="https://groups.google.com/forum/#!forum/mojolicious">mailing-list</a> is actually just about to reach 1000 subscribers, thanks everyone!</p><p>The main focus this year has been performance, pretty much everything got faster and/or scales better. But there are also quite a few new features, here&rsquo;s a list of the highlights:</p><ul><li><b>Nested helpers:</b>&nbsp;Organize your helpers into namespaces, like the new built-in helper <a href="http://mojolicious.org/perldoc/Mojolicious/Plugin/DefaultHelpers#reply-asset">reply-&gt;asset</a>. (<a href="http://mojolicious.org/perldoc/Mojolicious/Guides/Rendering#Adding-helpers">example</a>)</li><li><b>SOCKS5 support:</b>&nbsp;Through <a href="http://mojolicious.org/perldoc/Mojo/UserAgent#proxy">IO::Socket::Socks</a>. (<a href="http://">example</a>)</li><li><b>Non-blocking name resolution support:</b>&nbsp;Through <a href="https://metacpan.org/pod/Net::DNS::Native">Net::DNS::Native</a>.</li><li><b>New Mojo::DOM:</b> Completely redesigned <a href="http://mojolicious.org/perldoc/Mojo/DOM">API</a> and experimental support for case-insensitive attribute selectors like [foo=&ldquo;bar&rdquo; i].<br /></li><li><b>RFC 3339 support: </b>Almost every new REST API uses it.&nbsp;(<a href="http://mojolicious.org/perldoc/Mojo/Date#parse">example</a>)</li><li><b>Content negotiation:</b>&nbsp;Now with If-None-Match and If-Modified-Since. (<a href="http://mojolicious.org/perldoc/Mojolicious/Plugin/DefaultHelpers#is_fresh">example</a>)</li><li><b>IPv6 everywhere:</b>&nbsp;<a href="https://metacpan.org/pod/IO::Socket::IP">IO::Socket::IP</a> has become so reliable that we now use it for everything, all the time.</li><li><b>No more &ldquo;wantarray()&rdquo;:</b>&nbsp;To prevent <a href="https://groups.google.com/forum/#!msg/mojolicious/aJTYjRCPjOE/QJZB6ORfYJAJ">security vulnerabilities</a>, it is gone from the entire code base.</li><li><b>Mojo::Pg and Minion:</b>&nbsp;Had stable 1.0 releases and have since become official <a href="http://mojolicious.org/perldoc#SPIN-OFFS">spin-off projects</a>.</li></ul><p>And as usual there is a lot more to discover, see <a href="https://github.com/kraih/mojo/blob/v6.0/Changes">Changes</a> on GitHub for the full list of improvements.</p><p>Have fun!</p> </div> </div> </div> <div class="post"> <div class="sidebar"> <ul> <li class="date"><h2>29th May 2014</h2></li> <li class="notes"> <a href="https://kraih.tumblr.com/post/87229338726/mojolicious-50-released-perl-real-time-web/#notes">17 notes</a>&nbsp; </li> <li class="permalink"><a href="https://kraih.tumblr.com/post/87229338726/mojolicious-50-released-perl-real-time-web">Permalink</a></li> <li class="tweet"><a href="http://twitter.com/home?status=https://tmblr.co/Zb_kEy1HFHXHc" target="_blank">Tweet this</a></li> </ul> <p class="tags"> </p> </div> <div class="content text"> <div class="text-post"> <a href="https://kraih.tumblr.com/post/87229338726/mojolicious-50-released-perl-real-time-web">A TEXT POST</a> </div> <h3><a href="https://kraih.tumblr.com/post/87229338726/mojolicious-50-released-perl-real-time-web">Mojolicious 5.0 released: Perl real-time web framework</a></h3> <div class="go"> <figure class="tmblr-full" data-orig-height="375" data-orig-width="500" data-orig-src="https://64.media.tumblr.com/ed6ab4e2502ee26c2bda0e22d0a75a67/tumblr_inline_n6cnloBsee1qcosu5.png"><img src="https://64.media.tumblr.com/88df4d1e8cb01857eecd1cd8f964aab2/tumblr_inline_pa2h765RZO1qcosu5_500.png" alt="image" data-orig-height="375" data-orig-width="500" data-orig-src="https://64.media.tumblr.com/ed6ab4e2502ee26c2bda0e22d0a75a67/tumblr_inline_n6cnloBsee1qcosu5.png" width="500" height="375" /></figure><p>I&rsquo;m excited to announce the release of <a href="http://mojolicious.org">Mojolicious</a>&nbsp;5.0 (Tiger Face).</p><p>It is named after the <a href="http://www.visitoslo.com/en/product/?TLp=495431">location</a> of our very first <a href="http://www.mojoconf.org/mojo2014/">Mojoconf</a>, which has been a huge success and ended just a few days ago. The Oslo Perl Mongers have really done an amazing job putting it all together, and we would love to see this turn into a yearly event, so if you&rsquo;d like to host the next Mojoconf in 2015, please <a href="http://www.mojoconf.org/mojo2014/news/1201">get in touch</a>!</p><p>The community keeps growing fast, and just a few months ago we&rsquo;ve actually been the very first Perl project on GitHub to be <a href="https://github.com/kraih/mojo">starred</a>&nbsp;more than 1000 times. On IRC we now see about 170 regulars and the <a href="https://groups.google.com/forum/#!forum/mojolicious">mailing-list</a> has grown to over 800 subscribers, thanks everyone!</p><p>There are many new features this year, for a quick overview you can take a look at the <a href="https://speakerdeck.com/kraih/five-point-oh">slides from my Mojoconf talk</a>.&nbsp;Here&rsquo;s a list of the highlights:</p><ul><li><b>Redesigned:</b>&nbsp;All new exception and not_found pages. (<a href="http://mojolicious.org/perldoc/Mojolicious/Lite#Built-in_exception_and_not_found_pages">usage example</a>)</li><li><b>Form validation:</b> Simple and extensible. (<a href="http://mojolicious.org/perldoc/Mojolicious/Guides/Rendering#Form_validation">example</a>)</li><li><b>CSRF protection:</b> You can&rsquo;t have form validation without it. (<a href="http://mojolicious.org/perldoc/Mojolicious/Guides/Rendering#Cross-site_request_forgery">example</a>)</li><li><b>Template variants:</b> When responsive web design is not enough. (<a href="http://mojolicious.org/perldoc/Mojolicious/Guides/Rendering#Template_variants">example</a>)</li><li><b>All new Mojo::DOM:</b> With support for many different node types and new ways to manipulate HTML. (<a href="http://mojolicious.org/perldoc/Mojo/DOM#node">example</a>)</li><li><b>New hooks:</b> The framework got a lot more extensible with hooks like <a href="http://mojolicious.org/perldoc/Mojolicious#around_action">around_action</a> and <a href="http://mojolicious.org/perldoc/Mojolicious#before_render">before_render</a>.</li><li><b>SO_REUSEPORT:</b> A new way to do zero downtime restarts and high performance web servers. (<a href="http://mojolicious.org/perldoc/Mojolicious/Guides/Cookbook#Zero_downtime_software_upgrades">example</a>)</li><li><b>Rotating secrets:</b> More security without having to invalidate existing sessions. (<a href="http://mojolicious.org/perldoc/Mojolicious#secrets">example</a>)</li><li><b>Non-blocking bridges:</b> A new way to reuse non-blocking code. (<a href="http://mojolicious.org/perldoc/Mojolicious/Guides/Routing#Bridges">example</a>)</li><li><b>Cheap helpers:</b> You can now have as many as you like.</li><li><b>Optional placeholders everywhere:</b>&nbsp;Even at the beginning of your route pattern.</li><li><b>RFC 7159:</b> Support for the new JSON spec.</li><li><b>permessage-deflate:</b> WebSocket compression.</li><li><b>Minion:</b> A new spin-off project, because every full-stack framework needs a job queue. (<a href="http://mojolicious.org/perldoc/Minion#SYNOPSIS">example</a>)</li></ul><p>And as usual there is a lot more to discover, see&nbsp;<a href="https://github.com/kraih/mojo/blob/v5.0/Changes">Changes</a>&nbsp;on GitHub for the full list of improvements.</p><p>Have fun!</p> </div> </div> </div> <div class="post"> <div class="sidebar"> <ul> <li class="date"><h2>13th February 2014</h2></li> <li class="notes"> <a href="https://kraih.tumblr.com/post/76535091594/mojoconf-2014/#notes">6 notes</a>&nbsp; </li> <li class="permalink"><a href="https://kraih.tumblr.com/post/76535091594/mojoconf-2014">Permalink</a></li> <li class="tweet"><a href="http://twitter.com/home?status=https://tmblr.co/Zb_kEy17HsD6A" target="_blank">Tweet this</a></li> </ul> <p class="tags"> </p> </div> <div class="content text"> <div class="text-post"> <a href="https://kraih.tumblr.com/post/76535091594/mojoconf-2014">A TEXT POST</a> </div> <h3><a href="https://kraih.tumblr.com/post/76535091594/mojoconf-2014">Mojoconf 2014</a></h3> <div class="go"> <p></p><figure class="tmblr-full" data-orig-height="289" data-orig-width="459" data-orig-src="https://64.media.tumblr.com/afed7e22e207a22fee360c118f8f3c67/tumblr_inline_n0xznfdMpj1qcosu5.png"><img alt="image" src="https://64.media.tumblr.com/afed7e22e207a22fee360c118f8f3c67/tumblr_inline_pa2h76GnoW1qcosu5_500.png" data-orig-height="289" data-orig-width="459" data-orig-src="https://64.media.tumblr.com/afed7e22e207a22fee360c118f8f3c67/tumblr_inline_n0xznfdMpj1qcosu5.png" width="459" height="289" /></figure><p>I&rsquo;m very happy to announce that this year <a href="http://mojolicio.us">Mojolicious</a> will be getting its very own conference, from the <strong>23rd</strong> to <strong>25th</strong> of <strong>May</strong> 2014 the <strong>Oslo</strong> Perl Mongers will be hosting the very first <a href="http://www.mojoconf.org/mojo2014/">Mojoconf</a>. And the whole core team will be there to talk about Perl and the Web!</p> </div> </div> </div> <div class="post"> <div class="sidebar"> <ul> <li class="date"><h2>12th December 2013</h2></li> <li class="notes"> <a href="https://kraih.tumblr.com/post/69783934209/convos-chatting-in-the-cloud-with-mojolicious/#notes">1 note</a>&nbsp; </li> <li class="permalink"><a href="https://kraih.tumblr.com/post/69783934209/convos-chatting-in-the-cloud-with-mojolicious">Permalink</a></li> <li class="tweet"><a href="http://twitter.com/home?status=https://tmblr.co/Zb_kEy10-SbK1" target="_blank">Tweet this</a></li> </ul> <p class="tags"> </p> </div> <div class="content text"> <div class="text-post"> <a href="https://kraih.tumblr.com/post/69783934209/convos-chatting-in-the-cloud-with-mojolicious">A TEXT POST</a> </div> <h3><a href="https://kraih.tumblr.com/post/69783934209/convos-chatting-in-the-cloud-with-mojolicious">Convos: Chatting in the cloud with Mojolicious</a></h3> <div class="go"> <p></p><figure class="tmblr-full" data-orig-height="55" data-orig-width="300" data-orig-src="https://64.media.tumblr.com/ecee058bd7fce0f763d5f6ae795b6a90/tumblr_inline_mxp222x7oW1qcosu5.png"><img alt="image" src="https://64.media.tumblr.com/ecee058bd7fce0f763d5f6ae795b6a90/tumblr_inline_pa2h771gYY1qcosu5_400.png" data-orig-height="55" data-orig-width="300" data-orig-src="https://64.media.tumblr.com/ecee058bd7fce0f763d5f6ae795b6a90/tumblr_inline_mxp222x7oW1qcosu5.png" width="300" height="55" /></figure><p>If you like IRC&nbsp;and Perl, we&rsquo;ve got a real treat for you! Our friends at <a href="http://nordaaker.com/">Nordaaker</a> have just open sourced&nbsp;<a href="http://convos.by/">Convos</a>.</p><blockquote><p>Convos is the simplest way to use IRC. It is always online, and accessible to your web browser, both on desktop and mobile. Run it on your home server, or cloud service easily.</p></blockquote><p></p><figure class="tmblr-full" data-orig-height="313" data-orig-width="500" data-orig-src="https://64.media.tumblr.com/f74aa73f9f49720cfb42388cb5aac9e6/tumblr_inline_mxp33w32FP1qcosu5.jpg"><img alt="image" src="https://64.media.tumblr.com/bf3360b5fb6ecd022b128c875bd8f159/tumblr_inline_pa2h77v7UU1qcosu5_500.jpg" data-orig-height="313" data-orig-width="500" data-orig-src="https://64.media.tumblr.com/f74aa73f9f49720cfb42388cb5aac9e6/tumblr_inline_mxp33w32FP1qcosu5.jpg" width="500" height="313" /></figure><p>Have fun!</p> </div> </div> </div> <div class="post"> <div class="sidebar"> <ul> <li class="date"><h2>15th May 2013</h2></li> <li class="notes"> <a href="https://kraih.tumblr.com/post/50517069291/mojolicious-40-released-perl-real-time-web/#notes">15 notes</a>&nbsp; </li> <li class="permalink"><a href="https://kraih.tumblr.com/post/50517069291/mojolicious-40-released-perl-real-time-web">Permalink</a></li> <li class="tweet"><a href="http://twitter.com/home?status=https://tmblr.co/Zb_kEyl33Kth" target="_blank">Tweet this</a></li> </ul> <p class="tags"> </p> </div> <div class="content text"> <div class="text-post"> <a href="https://kraih.tumblr.com/post/50517069291/mojolicious-40-released-perl-real-time-web">A TEXT POST</a> </div> <h3><a href="https://kraih.tumblr.com/post/50517069291/mojolicious-40-released-perl-real-time-web">Mojolicious 4.0 released: Perl real-time web framework</a></h3> <div class="go"> <p></p><figure class="tmblr-full" data-orig-height="289" data-orig-width="438"><img alt="image" src="https://64.media.tumblr.com/454275e79c6fbcb2f45a063702e4436a/4375eb68d18c5c21-fe/s500x750/f728c2e7f0fa4edfea8469485796b7c583a7c464.png" data-orig-height="289" data-orig-width="438" width="438" height="289" /></figure><p>It fills me with great joy to announce our classiest release yet, <a href="http://mojolicio.us">Mojolicious</a> 4.0 (Top Hat).</p><p>This is the first major release for the newest member of our core team, please welcome <a href="https://twitter.com/joelaberger">Dr. Joel Berger</a>, he was responsible for many of the new features. It has only been 11 months since our <a href="http://blog.kraih.com/post/43199244554/mojolicious-3-0-released-perl-real-time-web-framework">3.0 release</a>&nbsp;and the new development process is working out very well for us so far. The community keeps growing fast, we&rsquo;ve now been <a href="https://github.com/kraih/mojo">starred</a> almost 900 times&nbsp;on GitHub and the IRC channel regularly reaches more than 150 visitors, thanks everyone!</p><p>While the main focus of this release has been on the removal of legacy APIs, there are also quite a few new features, here are the highlights:</p><ul><li><strong>Content generators:</strong> &ldquo;json&rdquo; and &ldquo;form&rdquo; generators are built right in. (<a href="http://mojolicio.us/perldoc/Mojolicious/Guides/Cookbook#Content_generators">example</a>)</li><li><strong>JSON WebSocket messages:</strong> Native serialization and deserialization support. (<a href="http://mojolicio.us/perldoc/Mojolicious/Lite#WebSockets">example</a>)</li><li><strong>JSON WebSocket tests:</strong>&nbsp;Just as easy to use as their HTTP equivalents. (<a href="http://mojolicio.us/perldoc/Mojolicious/Guides/Cookbook#Testing_WebSocket_web_services">example</a>)</li><li><strong>Event synchronization:</strong> Avoid callback spaghetti with <a href="http://mojolicio.us/perldoc/Mojo/IOLoop/Delay">delays</a>. (<a href="http://mojolicio.us/perldoc/Mojolicious/Guides/Cookbook#Backend_web_services">example</a>)</li><li><strong>Scalability:</strong> The event loop got a lot better at managing more than 10k concurrent connections. (<a href="https://gist.github.com/kraih/5551292">example</a>)</li><li><strong>Smooth restarting:</strong> The <a href="http://mojolicio.us/perldoc/Mojolicious/Guides/Cookbook#Morbo">Morbo</a> development web server does not have any noticeable downtime while restarting anymore.</li><li><strong>Hooks:</strong> The framework got more extensible with new <a href="http://mojolicio.us/perldoc/Mojolicious#hook">hooks</a>. (<a href="http://mojolicio.us/perldoc/Mojolicious/Guides/Rendering#Post-processing_dynamic_content">example</a>)</li><li><strong>GZip:</strong> Compression is now transparently supported by the user agent.</li><li><strong>HTML5 forms:</strong> Tag helpers have been added for many of the new form elements. (<a href="http://mojolicio.us/perldoc/Mojolicious/Plugin/TagHelpers#email_field">example</a>)</li><li><strong>Session expiration:</strong> Can now be controlled with a relative value that persists within the session. (<a href="http://mojolicio.us/perldoc/Mojolicious/Guides/Growing#State_keeping">example</a>)</li><li><strong>GET/POST parameters:</strong> Retrieve multiple values at once with the much more secure multi name form. (<a href="http://mojolicio.us/perldoc/Mojolicious/Controller#param">example</a>)</li><li><strong>JSON Pointers:</strong>&nbsp;Now fully&nbsp;<a href="http://tools.ietf.org/html/rfc6901">RFC 6901</a>&nbsp;compliant. (<a href="http://mojolicio.us/perldoc/Test/Mojo#json_message_is">example</a>)</li><li><strong>Monotonic clock support:</strong> All built-in web servers are now very resilient to time jumps.</li></ul><p>And as usual there is a lot more to discover, see <a href="https://github.com/kraih/mojo/blob/v4.0/Changes">Changes</a>&nbsp;on GitHub for the full list of improvements.</p><p>Have fun!</p> </div> </div> </div> <div class="post"> <div class="sidebar"> <ul> <li class="date"><h2>11th February 2013</h2></li> <li class="notes"> <a href="https://kraih.tumblr.com/post/43199352166/mangolicious/#notes">3 notes</a>&nbsp; </li> <li class="permalink"><a href="https://kraih.tumblr.com/post/43199352166/mangolicious">Permalink</a></li> <li class="tweet"><a href="http://twitter.com/home?status=https://tmblr.co/Zb_kEyeEuSrc" target="_blank">Tweet this</a></li> </ul> <p class="tags"> </p> </div> <div class="content text"> <div class="text-post"> <a href="https://kraih.tumblr.com/post/43199352166/mangolicious">A TEXT POST</a> </div> <h3><a href="https://kraih.tumblr.com/post/43199352166/mangolicious">Mangolicious</a></h3> <div class="go"> <p></p><figure class="tmblr-full" data-orig-height="289" data-orig-width="438"><img alt="image" src="https://64.media.tumblr.com/ad0d1f78d576dc9b699098e135019964/c20c5952546d7930-c3/s500x750/59404bfef965383459a9a21a40f7ca6cf7ec88db.png" data-orig-height="289" data-orig-width="438" width="438" height="289" /></figure><p>I&rsquo;m very happy to announce the first alpha release of&nbsp;<a href="https://github.com/kraih/mango">Mango</a>, a new pure-Perl non-blocking I/O&nbsp;<a href="http://www.mongodb.org/">MongoDB</a>&nbsp;driver, and the latest&nbsp;<a href="http://mojolicio.us/">Mojolicious</a>&nbsp;spin-off project.</p><p>If you&rsquo;ve ever worked with the official MongoDB driver for Perl, you&rsquo;re probably well aware of its many shortcomings, so i&rsquo;m not gonna ramble on about it&hellip; it&rsquo;s basically the only driver i could find that still defaults to unsafe writes.</p><p>While MongoDB itself can be a bit quirky as well, it is also a hell of a lot of fun to work with, especially for rapid prototyping HTML5 web applications. Now that real-time web technologies such as&nbsp;<a href="http://en.wikipedia.org/wiki/WebSocket">WebSockets</a>&nbsp;are becoming more and more popular, there is a growing demand for versatile non-blocking datastores that work well with event loops. So Mango has been designed from the ground up with the same hybrid architecture as the popular&nbsp;<a href="http://mojolicio.us/perldoc/Mojo/UserAgent">Mojo::UserAgent</a>, and both share the same general characteristics.</p><p>Some of the most important features are:</p><ul><li>Clean blocking and&nbsp;<strong>non-blocking</strong>&nbsp;hybrid API.</li><li>All operations are&nbsp;<strong>safe</strong>&nbsp;by default, you have to work to lose data.</li><li>Fast and&nbsp;<strong>simple</strong>&nbsp;installation, no C compiler needed.</li><li>Optimized for use with&nbsp;<strong>Mojolicious</strong>.</li></ul><p>And of course here&rsquo;s the obligatory example application. ;)</p><div class="gist"><a href="https://gist.github.com/kraih/4756855">https://gist.github.com/kraih/4756855</a></div><p>So, what are you waiting for? Get yourself a free account over at&nbsp;<a href="https://www.mongohq.com/">MongoHQ</a>&nbsp;or&nbsp;<a href="https://mongolab.com/">MongoLab</a>&nbsp;and start writing awesome web applications.</p><p>Have fun!</p> </div> </div> </div> <div class="post"> <div class="sidebar"> <ul> <li class="date"><h2>25th June 2012</h2></li> <li class="notes"> <a href="https://kraih.tumblr.com/post/43199244554/mojolicious-30-released-perl-real-time-web/#notes">4 notes</a>&nbsp; </li> <li class="permalink"><a href="https://kraih.tumblr.com/post/43199244554/mojolicious-30-released-perl-real-time-web">Permalink</a></li> <li class="tweet"><a href="http://twitter.com/home?status=https://tmblr.co/Zb_kEyeEu2aA" target="_blank">Tweet this</a></li> </ul> <p class="tags"> </p> </div> <div class="content text"> <div class="text-post"> <a href="https://kraih.tumblr.com/post/43199244554/mojolicious-30-released-perl-real-time-web">A TEXT POST</a> </div> <h3><a href="https://kraih.tumblr.com/post/43199244554/mojolicious-30-released-perl-real-time-web">Mojolicious 3.0 released: Perl real-time web framework</a></h3> <div class="go"> <p></p><figure class="tmblr-full" data-orig-height="289" data-orig-width="438"><img alt="image" src="https://64.media.tumblr.com/cab925d907e33d60ff20bd1ba937eb45/6ff0723891e026e7-54/s500x750/3479c394c8177093239321db9ec03136669ed1c6.png" data-orig-height="289" data-orig-width="438" width="438" height="289" /></figure><p>It fills me with great joy to announce the release of&nbsp;<a href="http://mojolicio.us/">Mojolicious</a>&nbsp;3.0 (Rainbow).</p><p>This marks the first major release for our newly formed core team, consisting of Glen Hinkle, Marcus Ramberg,&nbsp;Abhijit Menon-Sen and yours truly.&nbsp;A lot has happened during the last 8 months since our&nbsp;<a href="http://blog.kraih.com/post/43198085334/mojolicious-2-0-released-perl-real-time-web-framework">2.0 release</a>, most design decisions are now made by majority vote. The core feature set is not changing much anymore, and we are in the process of refocusing our efforts on making Mojolicious more approachable for beginners and easier to extend. The community is still growing fast, and we&rsquo;ve just passed&nbsp;<a href="https://github.com/kraih/mojo">666 watchers</a>&nbsp;on GitHub, thanks everyone! :)</p><p>There are many new features, here are the highlights:</p><ul><li><strong>TLS and IPv6:</strong>&nbsp;Support for both has been greatly improved.</li><li><strong>Commands:</strong>&nbsp;The command system has been completely revamped. (<a href="http://mojolicio.us/perldoc/Mojolicious/Guides/Cookbook#Adding_commands_to_Mojolicious">example</a>)</li><li><strong>Plugins:</strong>&nbsp;Generator and CPAN upload commands make extending Mojolicious easier than ever. (<a href="http://mojolicio.us/perldoc/Mojolicious/Guides/Rendering#Helper_plugins">example</a>)</li><li><strong>Event loops:</strong>&nbsp;Mojolicious no longer needs to control the event loop. (<a href="http://blog.kraih.com/post/43198561287/mojolicious-hack-of-the-day-more-anyevent-oh-my">example</a>)</li><li><strong>Content negotiation:</strong>&nbsp;Write more RESTful web services. (<a href="http://mojolicio.us/perldoc/Mojolicious/Guides/Rendering#Content_negotiation">example</a>)</li><li><strong>JSON Pointers:</strong>&nbsp;Many features dealing with JSON got a lot smarter. (<a href="http://mojolicio.us/perldoc/Test/Mojo#json_is">example</a>)</li><li><strong>Flexible router:</strong>&nbsp;Routes can now be rearranged. (<a href="http://mojolicio.us/perldoc/Mojolicious/Guides/Routing#Rearranging_routes">example</a>)</li><li><strong>Flexible renderer:</strong>&nbsp;Serve templates and static files from as many DATA sections and paths as you like. (<a href="http://blog.kraih.com/post/43198653667/mojolicious-hack-of-the-day-mojolyst">example</a>)</li><li><strong>Asset plugins:</strong>&nbsp;Easily bundle assets such templates and static files with plugins. (<a href="http://mojolicio.us/perldoc/Mojolicious/Guides/Rendering#Bundling_assets_with_plugins">example</a>)</li><li><strong>Not found page:</strong>&nbsp;Is now actually a&nbsp;<a href="http://blog.kraih.com/post/43199195822/a-new-look-for-mojolicious">development tool</a>.</li><li><strong>Hypnotoad:</strong>&nbsp;Doesn&rsquo;t require a separate configuration file anymore. (<a href="http://mojolicio.us/perldoc/Mojolicious/Guides/Cookbook#Hypnotoad">example</a>)</li><li><strong>WebSockets:</strong>&nbsp;Fully&nbsp;<a href="http://tools.ietf.org/html/rfc6455">RFC 6455</a>&nbsp;compliant. (<a href="http://mojolicio.us/perldoc/Mojolicious/Guides/Cookbook#WebSocket_web_service">example</a>)</li><li><strong>Relaxed placeholders:&nbsp;</strong>Now look like &ldquo;/#foo&rdquo; instead of &ldquo;/(.foo)&rdquo;. (<a href="http://mojolicio.us/perldoc/Mojolicious/Guides/Routing#Relaxed_placeholders">example</a>)</li><li><strong>I18N plugin:</strong>&nbsp;Maintained as a&nbsp;<a href="https://github.com/sharifulin/mojolicious-plugin-i18n">separate distribution</a>&nbsp;from now on.</li></ul><p>And as usual there is a lot more to discover, see&nbsp;<a href="https://github.com/kraih/mojo/blob/v3.0/Changes">Changes</a>&nbsp;on GitHub for the full list of improvements.</p><p>Have fun!</p> </div> </div> </div> <div class="post"> <div class="sidebar"> <ul> <li class="date"><h2>21st June 2012</h2></li> <li class="notes"> <a href="https://kraih.tumblr.com/post/43199195822/a-new-look-for-mojolicious/#notes">1 note</a>&nbsp; </li> <li class="permalink"><a href="https://kraih.tumblr.com/post/43199195822/a-new-look-for-mojolicious">Permalink</a></li> <li class="tweet"><a href="http://twitter.com/home?status=https://tmblr.co/Zb_kEyeEtsgk" target="_blank">Tweet this</a></li> </ul> <p class="tags"> </p> </div> <div class="content text"> <div class="text-post"> <a href="https://kraih.tumblr.com/post/43199195822/a-new-look-for-mojolicious">A TEXT POST</a> </div> <h3><a href="https://kraih.tumblr.com/post/43199195822/a-new-look-for-mojolicious">A new look for Mojolicious</a></h3> <div class="go"> <p>You may remember&nbsp;<a href="http://blog.kraih.com/post/43196937506/a-missing-raptor-and-the-mojolicious-user-experience">last year</a>&nbsp;when we introduced all-new not found and server error pages for&nbsp;<a href="http://mojolicio.us/">Mojolicious</a>. Well, it&rsquo;s that time of the year again, and we&rsquo;ve recently been modernizing some of them. While both raptor pages still pass with flying colors, the more artsy development mode not found page only got mixed reviews. So it has been redesigned from scratch, and turned into more of a development tool, listing all the routes of your application.</p><p></p><figure class="tmblr-full" data-orig-height="263" data-orig-width="500"><img alt="image" src="https://64.media.tumblr.com/e22fe50003c2961a11d4031c52cab692/b8374533fcc3ef96-d7/s500x750/1661064b5cf6bf0a81165e83a60dbed0362ef57c.png" data-orig-height="263" data-orig-width="500" width="500" height="263" /></figure><p>The server error page only needed a few small refinements for both to have a similar look and feel, hope you like it.</p><p></p><figure class="tmblr-full" data-orig-height="265" data-orig-width="500"><img alt="image" src="https://64.media.tumblr.com/5dec0d626f84c156afd967bbfb9a520c/b8374533fcc3ef96-58/s500x750/63bd588b4c40aa726b747c125aa3225f5f586f62.png" data-orig-height="265" data-orig-width="500" width="500" height="265" /></figure><p>Have fun!</p> </div> </div> </div> <div class="post" style="margin-bottom: 40px;"> <div class="sidebar"> </div> <div class="footer-nav clearfix" style="text-transform:lowercase;"> <a class="next-page" href="/page/2">Next &#187;</a> </div> </div> </div> <a name="description"></a> <div id="footer" class="clearfix"> </div> </div> </div> <iframe scrolling="no" width="1" height="1" frameborder="0" style="background-color:transparent; overflow:hidden; position:absolute; top:0; left:0; z-index:9999;" id="ga_target"></iframe><script type="text/javascript"> (function(){ var analytics_frame = document.getElementById('ga_target'); var analytics_iframe_loaded; var user_logged_in; var blog_is_nsfw = 'No'; var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent"; var eventer = window[eventMethod]; var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message"; eventer(messageEvent,function(e) { var message = (e.data && e.data.split) ? e.data.split(';') : ''; switch (message[0]) { case 'analytics_iframe_loaded': analytics_iframe_loaded = true; postCSMessage(); postGAMessage(); break; case 'user_logged_in': user_logged_in = message[1]; postGAMessage(); break; } }, false); analytics_frame.src = "https://assets.tumblr.com/analytics.html?_v=9f5febfd57a8a649c598d888f2d9e062#" + "https://kraih.tumblr.com"; function postGAMessage() { if (analytics_iframe_loaded && user_logged_in) { var is_ajax = false; analytics_frame.contentWindow.postMessage(['tick_google_analytics', is_ajax, user_logged_in, blog_is_nsfw, '/?route=%2F'].join(';'), analytics_frame.src.split('/analytics.html')[0]); } } function postCSMessage() { COMSCORE = true; analytics_frame.contentWindow.postMessage('enable_comscore;' + window.location, analytics_frame.src.split('/analytics.html')[0]); } })(); </script><script type="text/javascript" nonce="uJ8YwEwYhS9VSrqWWdApNTIxyg">!function(s){s.src='https://px.srvcs.tumblr.com/impixu?T=1742479933&J=eyJ0eXBlIjoidXJsIiwidXJsIjoiaHR0cDovL2tyYWloLnR1bWJsci5jb20vIiwicmVxdHlwZSI6MCwicm91dGUiOiIvIn0=&U=FLPPHIOKJO&K=b1e7f86917ecbd9c8be53393efc78504a1b0bd5a7394bceab7b23073403c798c&R='.replace(/&R=[^&$]*/,'').concat('&R='+escape(document.referrer)).slice(0,2000).replace(/%.?.?$/,'');}(new Image());</script><noscript><img style="position:absolute;z-index:-3334;top:0px;left:0px;visibility:hidden;" src="https://px.srvcs.tumblr.com/impixu?T=1742479933&J=eyJ0eXBlIjoidXJsIiwidXJsIjoiaHR0cDovL2tyYWloLnR1bWJsci5jb20vIiwicmVxdHlwZSI6MCwicm91dGUiOiIvIiwibm9zY3JpcHQiOjF9&U=FLPPHIOKJO&K=3b76fa2fc3bbfb7c77d8658053834661c83fa552f5c060a587023f0ffc893d1c&R="></noscript><script type="text/javascript" nonce="uJ8YwEwYhS9VSrqWWdApNTIxyg">!function(s){s.src='https://px.srvcs.tumblr.com/impixu?T=1742479933&J=eyJ0eXBlIjoicG9zdCIsInVybCI6Imh0dHA6Ly9rcmFpaC50dW1ibHIuY29tLyIsInJlcXR5cGUiOjAsInJvdXRlIjoiLyIsInBvc3RzIjpbeyJwb3N0aWQiOiIxNzgxNzM5MzU2MzYiLCJibG9naWQiOjYwODI5NjcsInNvdXJjZSI6MzN9LHsicG9zdGlkIjoiMTQ3NjMyOTc5MTA2IiwiYmxvZ2lkIjo2MDgyOTY3LCJzb3VyY2UiOjMzfSx7InBvc3RpZCI6IjExMjE3MDg0NTcwMSIsImJsb2dpZCI6NjA4Mjk2Nywic291cmNlIjozM30seyJwb3N0aWQiOiI4NzIyOTMzODcyNiIsImJsb2dpZCI6NjA4Mjk2Nywic291cmNlIjozM30seyJwb3N0aWQiOiI3NjUzNTA5MTU5NCIsImJsb2dpZCI6NjA4Mjk2Nywic291cmNlIjozM30seyJwb3N0aWQiOiI2OTc4MzkzNDIwOSIsImJsb2dpZCI6NjA4Mjk2Nywic291cmNlIjozM30seyJwb3N0aWQiOiI1MDUxNzA2OTI5MSIsImJsb2dpZCI6NjA4Mjk2Nywic291cmNlIjozM30seyJwb3N0aWQiOiI0MzE5OTM1MjE2NiIsImJsb2dpZCI6NjA4Mjk2Nywic291cmNlIjozM30seyJwb3N0aWQiOiI0MzE5OTI0NDU1NCIsImJsb2dpZCI6NjA4Mjk2Nywic291cmNlIjozM30seyJwb3N0aWQiOiI0MzE5OTE5NTgyMiIsImJsb2dpZCI6NjA4Mjk2Nywic291cmNlIjozM31dfQ==&U=DAAPEBNAAM&K=602745b6fd648c021b9cd7b3a14a77506267336cd8d7a3a0fad8eae389c56bde&R='.replace(/&R=[^&$]*/,'').concat('&R='+escape(document.referrer)).slice(0,2000).replace(/%.?.?$/,'');}(new Image());</script><noscript><img style="position:absolute;z-index:-3334;top:0px;left:0px;visibility:hidden;" src="https://px.srvcs.tumblr.com/impixu?T=1742479933&J=eyJ0eXBlIjoicG9zdCIsInVybCI6Imh0dHA6Ly9rcmFpaC50dW1ibHIuY29tLyIsInJlcXR5cGUiOjAsInJvdXRlIjoiLyIsInBvc3RzIjpbeyJwb3N0aWQiOiIxNzgxNzM5MzU2MzYiLCJibG9naWQiOjYwODI5NjcsInNvdXJjZSI6MzN9LHsicG9zdGlkIjoiMTQ3NjMyOTc5MTA2IiwiYmxvZ2lkIjo2MDgyOTY3LCJzb3VyY2UiOjMzfSx7InBvc3RpZCI6IjExMjE3MDg0NTcwMSIsImJsb2dpZCI6NjA4Mjk2Nywic291cmNlIjozM30seyJwb3N0aWQiOiI4NzIyOTMzODcyNiIsImJsb2dpZCI6NjA4Mjk2Nywic291cmNlIjozM30seyJwb3N0aWQiOiI3NjUzNTA5MTU5NCIsImJsb2dpZCI6NjA4Mjk2Nywic291cmNlIjozM30seyJwb3N0aWQiOiI2OTc4MzkzNDIwOSIsImJsb2dpZCI6NjA4Mjk2Nywic291cmNlIjozM30seyJwb3N0aWQiOiI1MDUxNzA2OTI5MSIsImJsb2dpZCI6NjA4Mjk2Nywic291cmNlIjozM30seyJwb3N0aWQiOiI0MzE5OTM1MjE2NiIsImJsb2dpZCI6NjA4Mjk2Nywic291cmNlIjozM30seyJwb3N0aWQiOiI0MzE5OTI0NDU1NCIsImJsb2dpZCI6NjA4Mjk2Nywic291cmNlIjozM30seyJwb3N0aWQiOiI0MzE5OTE5NTgyMiIsImJsb2dpZCI6NjA4Mjk2Nywic291cmNlIjozM31dLCJub3NjcmlwdCI6MX0=&U=DAAPEBNAAM&K=1de1f52dd370e0bc66d55831f63d55a091d1aad6bc630c2bd6901fb59d9798ea&R="></noscript><noscript id="bootloader" data-bootstrap="{&quot;Components&quot;:{&quot;PostActivity&quot;:[],&quot;NotificationPoller&quot;:{&quot;messaging_keys&quot;:[],&quot;token&quot;:&quot;&quot;,&quot;inbox_unread&quot;:0},&quot;DesktopDashboardLogo&quot;:{&quot;animations&quot;:[[&quot;https:\/\/assets.tumblr.com\/images\/logo\/hover-animations\/1.png?_v=161861acded461bb6e995593a3bae835&quot;,&quot;https:\/\/assets.tumblr.com\/images\/logo\/hover-animations\/1@2x.png?_v=496a774637302a598c851381d00009b0&quot;]]},&quot;TumblelogIframe&quot;:{&quot;unified&quot;:true,&quot;variant&quot;:null,&quot;isCompact&quot;:true,&quot;tumblelogBundleSrc&quot;:&quot;https:\/\/assets.tumblr.com\/client\/prod\/standalone\/tumblelog\/index.build.js?_v=fe23fd6389c5ebd8c99ea80f0b1c77ba&quot;,&quot;tumblelogName&quot;:&quot;kraih&quot;,&quot;isLoggedIn&quot;:false,&quot;isFriend&quot;:false,&quot;formKey&quot;:&quot;&quot;,&quot;canSubscribe&quot;:false,&quot;isSubscribed&quot;:false,&quot;tumblelogTitle&quot;:&quot;Sebastian Riedel about Perl and the Web&quot;,&quot;tumblelogAvatar&quot;:&quot;https:\/\/64.media.tumblr.com\/avatar_1bdefb12b400_64.pnj&quot;,&quot;tumblelogAvatar128&quot;:&quot;https:\/\/64.media.tumblr.com\/avatar_1bdefb12b400_128.pnj&quot;,&quot;tumblelogHost&quot;:&quot;https:\/\/kraih.tumblr.com&quot;,&quot;hasCustomDomain&quot;:false,&quot;isOptica&quot;:false,&quot;isCustomTheme&quot;:true,&quot;themeHeaderImage&quot;:&quot;https:\/\/assets.tumblr.com\/images\/default_header\/optica_pattern_10.png?_v=eafbfb1726b334d86841955ae7b9221c&quot;,&quot;themeBackgroundColor&quot;:&quot;#FAFAFA&quot;,&quot;themeTitleColor&quot;:&quot;#444444&quot;,&quot;themeAccentColor&quot;:&quot;#529ECC&quot;,&quot;brag&quot;:true,&quot;canShowAd&quot;:true,&quot;isPremium&quot;:false,&quot;showLrecAds&quot;:false,&quot;showStickyLrecBackfill&quot;:false,&quot;showGeminiAds&quot;:false,&quot;geminiSectionCodeDesktop&quot;:&quot;a10bca9c-0c5d-4a02-ab13-14ab8513d81d&quot;,&quot;geminiSectionCodeMobile&quot;:&quot;ced63809-b609-4aca-96a0-abc099acba6b&quot;,&quot;currentPageType&quot;:&quot;blog&quot;,&quot;currentPage&quot;:1,&quot;searchQuery&quot;:&quot;&quot;,&quot;tag&quot;:&quot;&quot;,&quot;query&quot;:&quot;&quot;,&quot;chrono&quot;:false,&quot;postId&quot;:&quot;&quot;,&quot;src&quot;:&quot;https:\/\/kraih.tumblr.com\/&quot;,&quot;postUrl&quot;:&quot;&quot;,&quot;openInPeeprUrl&quot;:&quot;https:\/\/www.tumblr.com\/kraih&quot;,&quot;isBlocked&quot;:null,&quot;isAdmin&quot;:false,&quot;lookupButtonUrl&quot;:&quot;&quot;,&quot;showSpamButton&quot;:false,&quot;showRootPostButton&quot;:false,&quot;rootPostUrl&quot;:&quot;&quot;,&quot;showRadarPostButton&quot;:false,&quot;radarKeys&quot;:&quot;&quot;,&quot;isUniblocked&quot;:false,&quot;isNsfw&quot;:false,&quot;isAdult&quot;:false,&quot;isSpam&quot;:false,&quot;isPrimaryBlog&quot;:false,&quot;canEdit&quot;:false,&quot;canReblogSelf&quot;:false,&quot;showLikeButton&quot;:false,&quot;showReblogButton&quot;:false,&quot;reblogUrl&quot;:&quot;&quot;,&quot;showMessagingButton&quot;:false,&quot;loginCheckIframeSrc&quot;:&quot;https:\/\/assets.tumblr.com\/assets\/html\/iframe\/login_check.html?_v=3de94a184d600617102ddd5b48fb36e9&quot;,&quot;appInstallUrls&quot;:{&quot;android&quot;:&quot;https:\/\/play.google.com\/store\/apps\/details?id=com.tumblr\u0026referrer=utm_source%3Dtumblr%26utm_medium%3Diframe%26utm_campaign%3Dbn_continue_or_install_cta&quot;,&quot;ios&quot;:&quot;https:\/\/apps.apple.com\/app\/apple-store\/id305343404?pt=212308\u0026ct=bn_continue_or_install_cta\u0026mt=8&quot;},&quot;appOpenReferrer&quot;:&quot;bn_header_open_btn&quot;,&quot;isShowSearch&quot;:true,&quot;supplyLogging&quot;:[],&quot;secondsSinceLastActivity&quot;:-1,&quot;installUrlOpenFailed&quot;:{&quot;android&quot;:&quot;https:\/\/play.google.com\/store\/apps\/details?id=com.tumblr\u0026referrer=utm_source%3Dtumblr%26utm_medium%3Diframe%26utm_campaign%3Dbn_header_app_open_failed&quot;,&quot;ios&quot;:&quot;https:\/\/apps.apple.com\/app\/apple-store\/id305343404?pt=212308\u0026ct=bn_header_app_open_failed\u0026mt=8&quot;},&quot;loginWallVariant&quot;:&quot;small_center&quot;},&quot;CommunityLabels&quot;:{&quot;has_community_label&quot;:false,&quot;is_single&quot;:false,&quot;redirect_target&quot;:null}},&quot;Flags&quot;:{&quot;features&quot;:&quot;eyJmaWx0ZXJfbnNmdyI6dHJ1ZSwibW9iaWxlX3dlYl9nYXRlIjp0cnVlLCJzYWZlX21vZGUiOnRydWUsInNhZmVfbW9kZV9lbmFibGVkIjp0cnVlLCJrZXljb21tYW5kX2F1dG9fcGFnaW5hdGUiOnRydWUsImxvZ2dlZF9vdXRfc2VhcmNoIjp0cnVlLCJrcmFrZW5fd2ViX2xvZ2dpbmdfbGlicmFyeSI6dHJ1ZSwibGl2ZXBob3Rvc193ZWIiOnRydWUsInVzZXJfdGFnX2ZpbHRlcmluZyI6dHJ1ZSwic2FmZV9tb2RlX293bl9wb3N0Ijp0cnVlLCJwcm9qZWN0X3hfYXBwZWFsIjp0cnVlLCJtb2JpbGVfd2ViX3Bob3Rvc2V0cyI6dHJ1ZSwiaGlkZV9kZWZhdWx0X2hlYWRlcnNfYmxvZ19jYXJkcyI6dHJ1ZSwibm90aWZpY2F0aW9uX3JlcGx5X2xpbmtfdG9fbm90ZXMiOnRydWUsInR5cGluZ19pbmRpY2F0b3Jfd3JpdGUiOnRydWUsInR1bWJscl92aWRlb19zcG9uc29yZWRfZGF5Ijp0cnVlLCJjYXB0Y2hhOnVzZV9yZWNhcHRjaGEyIjp0cnVlLCJsaXR0bGVfc2lzdGVyIjp0cnVlLCJsb2dfbGFkeSI6dHJ1ZSwicmVkcG9wX3Bvc3RfZm9ybV9tb2JpbGVfY3JlYXRlIjp0cnVlLCJsZWdhY3lfcG9zdF9mb3JtX2J1dHRvbnNfbGlua190b19yZWRwb3AiOnRydWUsInNob3dfdHNwX2NsaWNrX3Rocm91Z2hfdG9nZ2xlIjp0cnVlLCJkYXJsYV9hZF9mZWVkYmFjayI6dHJ1ZSwic3RhdHVzX2luZGljYXRvciI6dHJ1ZSwiY29udmVyc2F0aW9uYWxfbm90aWZpY2F0aW9ucyI6dHJ1ZSwiZGlzYWJsZV95YWhvb19iX2Nvb2tpZSI6dHJ1ZSwibGl2ZXBob3RvcyI6dHJ1ZSwiY29tbXVuaXR5X2xhYmVscyI6dHJ1ZX0=&quot;},&quot;Context&quot;:{&quot;name&quot;:&quot;default&quot;,&quot;time&quot;:1742479933000,&quot;userinfo&quot;:{&quot;primary&quot;:&quot;&quot;,&quot;name&quot;:&quot;&quot;,&quot;channels&quot;:[]},&quot;hosts&quot;:{&quot;assets_host&quot;:&quot;https:\/\/assets.tumblr.com&quot;,&quot;secure_assets_host&quot;:&quot;https:\/\/assets.tumblr.com&quot;,&quot;www_host&quot;:&quot;https:\/\/www.tumblr.com&quot;,&quot;secure_www_host&quot;:&quot;https:\/\/www.tumblr.com&quot;,&quot;embed_host&quot;:&quot;https:\/\/embed.tumblr.com&quot;,&quot;safe_host&quot;:&quot;https:\/\/safe.txmblr.com&quot;,&quot;platform_host&quot;:&quot;https:\/\/platform.tumblr.com&quot;},&quot;language&quot;:&quot;en_US&quot;,&quot;language_simple&quot;:&quot;en&quot;,&quot;assets&quot;:&quot;https:\/\/assets.tumblr.com\/client\/prod\/&quot;},&quot;Translations&quot;:{&quot;%1$sReport %2$s&#039;s post?%3$sIf it violates our user guidelines, we&#039;ll remove it.%4$s&quot;:&quot;%1$sReport %2$s&#039;s reblog?%3$sIf it violates our user guidelines, we&#039;ll remove it.%4$s&quot;,&quot;%1$sReport %2$s&#039;s reply?%3$sIf it violates our user guidelines, we&#039;ll remove it.%4$s&quot;:&quot;%1$sReport %2$s&#039;s reblog?%3$sIf it violates our user guidelines, we&#039;ll remove it.%4$s&quot;,&quot;%1$sDelete your tip??%2$s&quot;:&quot;%1$sDelete your tip?%2$s&quot;,&quot;Deleting your tip&quot;:&quot;Deleting your tip will only remove it from the replies tab and notes. %1$sYou won&#039;t receive a refund of your tip.%2$s For further help contact %3$sTumblr Support%4$s.&quot;}}"></noscript><script src="https://assets.tumblr.com/client/prod/standalone/tumblelog/index.build.js?_v=fe23fd6389c5ebd8c99ea80f0b1c77ba"></script></body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10