tag:blogger.com,1999:blog-88425336882950125562024-02-07T21:40:50.094-08:00MeetingPavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.comBlogger49125tag:blogger.com,1999:blog-8842533688295012556.post-35277185819546528132022-02-05T07:26:00.003-08:002022-02-05T07:38:39.732-08:00Ruby FFI extension using Zig<p>
<em><a href="https://ziglang.org/">Zig</a> is an an emergent general-purpose programming language. Being "a better C", Zig is an order of magnitude simpler than Rust. You can understand Zig code almost immediately if you can read C. It makes Zig a good candidate to implement <a href="https://github.com/ffi/ffi">FFI extensions</a> for Ruby.
</em>
</p>
<p>Let's write a tiny little Zig library and call it via FFI from Ruby.</p>
<p>A Zig function with parameters passed "by value" is too simple for our example. To complicate the matter a bit, we will implement a function with "out" parameters to return a collection of structs from Zig to Ruby. In order to simplify domain, let our function to return a collection of random X:Y points. Our <code>build.zig</code> might look like:</p>
<pre><code>const std = @import("std");
pub fn build(b: *std.build.Builder) void {
const lib = b.addSharedLibrary("points", "src/main.zig", .unversioned);
lib.linkLibC();
lib.setBuildMode(.ReleaseSafe);
lib.install();
}
</code></pre>
<p>Since library versioning doesn't directly relate to the topic, we leave the lib unversioned. Please also note that we link LibC. It allows us to use <code>std.heap.c_allocator</code> to allocate memory for points.</p>
<p>A function to generate a collection of points has signature <code>export fn generatePoints(addr_ptr: *usize, len_ptr: *u8) bool</code>. There is no mechanism to simply return a collection as a function return value. Thus we need two "out" function parameters:</p>
<ul>
<li>an address of the collection (<code>addr_ptr</code>)</li>
<li>collection length (<code>len_ptr</code>)</li>
</ul>
Let's attach the function to a Ruby module:</p>
<pre><code>class Point < FFI::Struct
layout :x, :uchar,
:y, :uchar
end
module PointsLib
extend FFI::Library
ffi_lib "zig-out/lib/libpoints.so"
attach_function :generatePoints, [ULongPtr, UCharPtr], :bool
</code></pre>
<p><code>ULongPtr</code> and <code>UCharPtr</code> is a couple of auxiliary classes we introduce nearby.</p>
<pre><code>class ULongPtr < FFI::Struct
layout :value, :ulong
end
class UCharPtr < FFI::Struct
layout :value, :char
end
</code></pre>
<p>They allow us to handle the "out" parameters more elegantly. Just note that, attaching and using the function, we don't directly mention <code>Point</code>.</p>
<pre><code>addr_ptr = ULongPtr.new
len_ptr = UCharPtr.new
PointsLib.generatePoints(addr_ptr, len_ptr) or raise("Error in Zig")
addr, len = addr_ptr[:value], len_ptr[:value]
</code></pre>
<p>It is time to write Zig code.</p>
<pre><code>const Point = extern struct {
x: i8,
y: i8,
};
export fn generatePoints(addr_ptr: *usize, len_ptr: *u8) bool {
var rnd = std.rand.DefaultPrng.init(std.crypto.random.int(u64)).random();
var len = rnd.int(u8); // 1
var points = std.heap.c_allocator.alloc(Point, len) catch return false; // 2
var i: u8 = 0;
while (i < len) : (i += 1) {
points[i].x = rnd.int(i8); // 3
points[i].y = rnd.int(i8);
}
addr_ptr.* = @ptrToInt(points.ptr); // 4
len_ptr.* = len;
return true;
}
</code></pre>
<p>As you can see, we
<ol>
<li>randomly generate length of the collection</li>
<li>allocate memory for a slice of Points</li>
<li>iterate over the slice and randomly assign coordinates</li>
<li>set a memory address of the collection and collection length as "out" params values</li>
</ol>
<p>Returning to Ruby. We use FFI::Pointer to access the passed collection.</p>
<pre><code>addr, len = addr_ptr[:value], len_ptr[:value]
points_ptr = FFI::Pointer.new(Point.size, addr)
</code></pre>
<p>Having a pointer to the collection, we can get points:</p>
<pre><code>first_point = Point.new(points_ptr[0])
second_point = Point.new(points_ptr[1])
x, y = first_point[:x], first_point[:y]
</code></pre>
<p>The only missing piece is freeing the memory passed to Ruby from Zig. It is a separate Zig function. On Ruby side it looks like:</p>
<pre><code>attach_function :freePoints, [:ulong, :uchar], :void
</code></pre>
<p>and</p>
<pre><code>PointsLib.freePoints addr, len
</code></pre>
<p>On Zig side it is just:</p>
<pre><code>export fn freePoints(points_ptr: [*]Point, len: u8) void {
std.heap.c_allocator.free(points_ptr[0..len]);
}
</code></pre>
<p>A completed Ruby method which returns an array of <code>[x, y]</code> arrays is written as:</p>
<pre><code> def self.coordinates
addr_ptr = ULongPtr.new
len_ptr = UCharPtr.new
PointsLib.generatePoints(addr_ptr, len_ptr) or raise("Error in Zig")
addr, len = addr_ptr[:value], len_ptr[:value]
points_ptr = FFI::Pointer.new(Point.size, addr)
coords = (0...len).map do |i|
point = Point.new(points_ptr[i])
[point[:x], point[:y]]
end
PointsLib.freePoints addr, len
coords
end
</code></pre>
<p>That is pretty much it. There are probably many other ways to implement the same functionality. You can play with <code>FFI::ManagedStruct</code> to get rid of an explicit <code>PointsLib.freePoints</code> call. Or you can allocate memory on Ruby side and pass it to Zig to fill up with random points. In this post, we will limit ourselves to only one approach.
</p>
<p>As a recap. <strong>We generated a random number of structures on Zig side, returned and used them on Ruby side and freed allocated memory in the end.</strong></p>
<p>Source code is available on <a href="https://github.com/MitinPavel/ruby_zig_ffi_collection">Github</a>.</p>Pavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.com0tag:blogger.com,1999:blog-8842533688295012556.post-47504357994194424232022-01-06T23:26:00.001-08:002022-01-06T23:35:51.968-08:00The best 2021<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEhXLJYkdFQ9iVVyt5ZwLG32ILPmApDDX5K-WE6WWj1erS3Bs8hjNBXnF2Ka_fi-7g5ZrNWo_clXUfO_KPKjsbmoYmqVnDTqY7a2CSXCR29oGoSWhw26QCfh0qf_rdzXeIA92pogAJLyEEYIeP_D0v6D588x0TNu-FoXTy6QJm5mYyHyQgHDYlG4Rz4d=s946"
style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="946"
data-original-width="710" height="640"
src="https://blogger.googleusercontent.com/img/a/AVvXsEhXLJYkdFQ9iVVyt5ZwLG32ILPmApDDX5K-WE6WWj1erS3Bs8hjNBXnF2Ka_fi-7g5ZrNWo_clXUfO_KPKjsbmoYmqVnDTqY7a2CSXCR29oGoSWhw26QCfh0qf_rdzXeIA92pogAJLyEEYIeP_D0v6D588x0TNu-FoXTy6QJm5mYyHyQgHDYlG4Rz4d=w480-h640"
width="480"/>
</a>
</div>
<p>
<i>2021 has more distinctly manifested those tectonic shifts in the world that began in in 2020. I look into the future with a mixture of curiosity and feeling of danger. But my blog is not about such global things.</i>
</p>
<p>
<b>Language for pet projects</b>
<br/>
<a href="https://www.ruby-lang.org/en/news/2021/12/25/ruby-3-1-0-released/">Ruby</a> (RoR + Hotwire)
<br/>
<i>
<a href="https://crystal-lang.org/">Crystal</a>, <a href="https://www.purescript.org/">PureScript</a>,
<a href="https://www.rust-lang.org/">Rust</a> and
<a href="https://www.youtube.com/watch?v=Gv2I7qTux7g&t=1252s">Zig</a>.
</i>
</p>
<p>
<b>Tutorial</b>
<br/>
<a href="https://jordanmartinez.github.io/purescript-jordans-reference-site/content/01-Getting-Started/01-Why-Learn-PureScript.html">Jordan's Reference</a> for PureScript
</p>
<p>
<b>Functional programming</b>
<br/>
<a href="https://blog.ocharles.org.uk/posts/2016-01-26-transformers-free-monads-mtl-laws.html">Monad transformer</a>
</p>
<p>
<b>Library</b>
<br/>
<a href="https://hotwired.dev/">Hotwire</a>
<br>
<i>
<a href="https://viewcomponent.org">ViewComponent</a>
</i>
</p>
<p>
<b>IT book</b>
<br/>
<a href="https://www.manning.com/books/data-oriented-programming">Data-Oriented Programming</a> by Yehonathan Sharvit
</p>
<p>
<b>False start</b>
<br/>
<a href="https://yew.rs/">Yew</a> (a small WASM app crashes unpredictable in runtime)
</p>
<p>
<b>Historical video</b>
<br/>
<a href="https://www.youtube.com/watch?v=2-zw_SCRVd4&t=300s">На этот раз окончательный закат Западной цивилизации</a> Юрий Слёзкин
</p>
<p>
<b>Thinker</b>
<br/>
<a href="https://www.youtube.com/watch?v=T8xhayrxExA&list=PLJ-pRBc4AzKUcM1bXpew8bA5QEKemiJ5Q">Павел Щелин</a>
</p>
<p>
<b>Museum</b>
<br/>
<a href="https://en.wikipedia.org/wiki/Museo_del_Prado">Museo del Prado</a>
<br/>
<i>
<a href="https://en.wikipedia.org/wiki/Palau_Nacional"> Palau Nacional de Montjuïc</a>
</i>
</p>
Pavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.com0tag:blogger.com,1999:blog-8842533688295012556.post-27788890959422297602021-01-07T00:42:00.003-08:002022-01-04T09:40:34.247-08:00The best 2020<blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><p style="text-align: left;"> <i>The 21st century has finally begun.</i></p></blockquote><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMThEAPM_DzDoC-2CNmQIXyS5EIfdbYY6epjHUOKVM_u0rpMP-fyubpmQ8zzO1NUowPr4DTz1pgaU67UJh6KA_CO0fr0WMeAmlBrW4ZVR06qgI3dleVaqsYQF99dgE-Qa9BVo7SbgIOWM/s1318/rose.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="989" data-original-width="1318" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMThEAPM_DzDoC-2CNmQIXyS5EIfdbYY6epjHUOKVM_u0rpMP-fyubpmQ8zzO1NUowPr4DTz1pgaU67UJh6KA_CO0fr0WMeAmlBrW4ZVR06qgI3dleVaqsYQF99dgE-Qa9BVo7SbgIOWM/w640-h480/rose.png" width="640" /></a></div><br /><p></p><p><b>Phrase</b></p><p>Me: <i>There is no history. Only historiography.</i></p><p><b>Memoirs</b></p><p><a href="https://en.wikipedia.org/wiki/Cursed_Days">Окаянные дни</a> Ивана Бунина.</p><p><b>Historical video</b></p><p><a href="https://www.youtube.com/watch?v=36Zey9OnzDw">Присоединение Сибири: механизмы и логистика</a> Михаила Кречмара.</p><p><a href="https://www.youtube.com/watch?v=qNPRVyAvlEA">Что за татаро-монголы в русских былинах?</a> <i><span style="color: #999999;">Александра Пыжикова.</span></i></p><p><b>Tool</b></p><p>Wikipedia as a tool for the systematic study of history.</p><p><b>Entertaining video</b></p><p><a href="https://www.youtube.com/c/Astartes40k/videos">Warhammer 40,000 fan film project</a>.</p><p><b>Music</b></p><p><a href="https://www.youtube.com/watch?v=wNmyYgkG2z8">Les Indes galantes</a></p><p><b>Intrigue</b></p><p><a href="https://en.wikipedia.org/wiki/Otto_Celera_500L">Otto Celera 500L</a></p><p><b>Surprise</b></p><p>A seven-year-old watches sitcoms ("The IT Crowd", “The Big Bang Theory”, “How I Met Your Mother”, etc).</p><p><b>Family</b></p><p>My daughter has successfully passed admission tests to one of the very best state schools in the country.<br /></p>Pavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.com0tag:blogger.com,1999:blog-8842533688295012556.post-41774538541733411302020-01-08T04:31:00.000-08:002020-01-08T04:31:41.855-08:00The best 2019<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmJCgkTuG_Kg5KM6O9cjlnrHlwYAJutGJZQfHKc7TmWty6U11PeID4nMCYudTZQV9c_CSwNZ7gp_qxLpddVohf9fZEjLLL6iU5TfajC3UGsorGeGJypjYA5tObyV5rf7A98m-PGjB60us/s1600/tiles.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="766" data-original-width="1151" height="424" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmJCgkTuG_Kg5KM6O9cjlnrHlwYAJutGJZQfHKc7TmWty6U11PeID4nMCYudTZQV9c_CSwNZ7gp_qxLpddVohf9fZEjLLL6iU5TfajC3UGsorGeGJypjYA5tObyV5rf7A98m-PGjB60us/s640/tiles.png" width="640" /></a></div>
<b><br /></b>
<b>IT book</b><br />
<a href="http://shop.oreilly.com/product/0636920032175.do">Designing Data-Intensive Applications</a> by Martin Kleppmann<br />
<i><span style="color: #999999;"><a href="https://www.amazon.co.uk/Philosophy-Software-Design-John-Ousterhout/dp/1732102201">A Philosophy of Software Design</a> by John Ousterhout is the opposite of Kleppmann's book. Much shorter. Much more provocative.</span></i><br />
<br />
<b>IT blog post</b><br />
Startup strategy is like <a href="https://blog.asmartbear.com/kung-fu.html">Kung Fu</a><br />
<br />
<b>Intrigue</b><br />
<a href="https://flutter.dev/">Flutter</a> UI toolkit<br />
<i><span style="color: #999999;">Phoenix’s <a href="https://shift.infinite.red/phoenixs-liveview-client-side-elixir-at-last-2280716ae791">LiveView</a> approach adoption in Rails community.</span></i><br />
<i><span style="color: #999999;"><a href="https://webassembly.org/">WebAssembly</a>.</span></i><br />
<br />
<b>Library</b><br />
<a href="https://stimulusjs.org/">Stimulus</a> (especially in conjunction with <a href="https://github.com/turbolinks/turbolinks">Turbolinks</a>)<br />
<br />
<b>Tool</b><br />
<a href="https://developer.android.com/studio">Android Studio</a><br />
<br />
<b>False start</b><br />
<a href="https://vuejs.org/">Vue.js</a><br />
<br />
<b>Parallel reality</b><br />
Product automation software<br />
<br />
<b>Podcast episode</b><br />
<a href="https://devzen.ru/episode-0226/">Обучение программистов бесплатно за два часа без смс</a><br />
<br />
<b>Movie</b><br />
<a href="https://www.imdb.com/title/tt2358891/">The Great Beauty</a><br />
<br />
<b>TV Series</b><br />
<a href="https://en.wikipedia.org/wiki/Breaking_Bad_(season_1)">Breaking Bad</a> (season 1)<br />
<i><span style="color: #999999;"><a href="https://www.netflix.com/title/80153467">Unbelievable</a></span></i><br />
<i><span style="color: #999999;"><a href="https://en.wikipedia.org/wiki/Chernobyl_(miniseries)">Chernobyl</a> (miniseries)</span></i><br />
<br />
<b>Content</b><br />
Youtube as a social phenomenon.<br />
<br />
<b>Existential</b><br />
Intractable question: "If you could invite any five people (living or dead) to a dinner party, who would you invite?"<br />
<i><span style="color: #999999;"><a href="https://en.wikipedia.org/wiki/%CA%BBOumuamua">ʻOumuamua</a></span></i><br />
<br />
<b>Radio show</b><br />
<a href="https://govoritmoskva.ru/broadcasts/104/?month=4&year=2016">Донское побоище с Олегом Двуреченским</a><br />
<br />
<b>Blog post</b><br />
<a href="https://bohemicus.livejournal.com/16229.html">Манускрипты. Артефакты. Культуры</a><br />
<b><br class="Apple-interchange-newline" />Historian</b><br />
<a href="http://www.solonin.org/en">Mark Solonin</a><br />
<br />
<b>Historic site</b><br />
<a href="https://en.wikipedia.org/wiki/Doge%27s_Palace">Doge's Palace</a><br />
<i><span style="color: #999999;"><a href="https://en.wikipedia.org/wiki/Hampton_Court_Palace">Hampton Court Palace</a></span></i><br />
<i><br /></i>
<b>Museum</b><br />
<a href="https://en.wikipedia.org/wiki/Pinacoteca_di_Brera">Pinacoteca di Brera</a><br />
<i><span style="color: #999999;"><a href="https://en.wikipedia.org/wiki/National_Museum_of_Ancient_Art">Museu Nacional de Arte Antiga</a></span></i><br />
<i><span style="color: #999999;"><a href="https://en.wikipedia.org/wiki/Pinacoteca_Nazionale_di_Bologna">Pinacoteca Nazionale di Bologna</a></span></i><br />
<br />Pavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.com0tag:blogger.com,1999:blog-8842533688295012556.post-73709678146918399162019-07-02T05:15:00.000-07:002019-07-02T05:15:51.749-07:00JUN 2019 Podcasts<h2>
Service Mesh Wars with William Morgan</h2>
<div>
<a href="https://softwareengineeringdaily.com/2019/05/31/service-mesh-wars-with-william-morgan/">https://softwareengineeringdaily.com/2019/05/31/service-mesh-wars-with-william-morgan/</a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxH4nGPeB62sr8tWluVn1kDrNsEqwIrtmXSUhmu-cM3l7hNajH6KY0SUQooBfiq7Yy-GUqRAlyndjgts43Zeh2KDSRTwfe29RArvc0Q_aX5xobjuCZHJTcaOZ5uwkS35tve8wNWyvjehg/s1600/2019_05_William_Morgan.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="684" data-original-width="684" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxH4nGPeB62sr8tWluVn1kDrNsEqwIrtmXSUhmu-cM3l7hNajH6KY0SUQooBfiq7Yy-GUqRAlyndjgts43Zeh2KDSRTwfe29RArvc0Q_aX5xobjuCZHJTcaOZ5uwkS35tve8wNWyvjehg/s640/2019_05_William_Morgan.png" width="640" /></a></div>
<h2>
Python's new governance and core team</h2>
<div>
<a href="https://changelog.com/podcast/348">https://changelog.com/podcast/348</a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPLOX_JQ-hR-gFV36WdWA4SrhNBeFyMD0sZuy5potjupC4DyvSAK8nBqKRGGrBIIS2z574u_ncMW8MAbQxVbJJDw2jd4KPwcOlfDed-uatwv-DkLuWhq7XDFl5c4iQsNUjUMN_lcATdsI/s1600/2019_05_Brett_Cannon.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="827" data-original-width="827" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPLOX_JQ-hR-gFV36WdWA4SrhNBeFyMD0sZuy5potjupC4DyvSAK8nBqKRGGrBIIS2z574u_ncMW8MAbQxVbJJDw2jd4KPwcOlfDed-uatwv-DkLuWhq7XDFl5c4iQsNUjUMN_lcATdsI/s640/2019_05_Brett_Cannon.png" width="640" /></a></div>
<div>
<br /></div>
Pavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.com0tag:blogger.com,1999:blog-8842533688295012556.post-42472824657466074422019-06-04T04:14:00.000-07:002019-06-04T04:14:47.875-07:00MAY 2019 Podcasts<h3>
Facebook Strategy with Mike Vernal</h3>
<div>
<a href="https://softwareengineeringdaily.com/2019/05/17/facebook-strategy-with-mike-vernal/">https://softwareengineeringdaily.com/2019/05/17/facebook-strategy-with-mike-vernal/</a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghJqybaRd5C9z-b8Vz5ZiOByBrbvPzRtJp-lIgGu8cJuBUfVbJTMQhTe6N_YuFrVcoQ5eUY25wU7cAKTJnnLzdnNVlsJzVePsBzoTaD3CSLtprxK_GzoLBVxkg0b50HuZvVMJV60awOUA/s1600/2019_05_Mike_Vernal.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="911" data-original-width="911" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghJqybaRd5C9z-b8Vz5ZiOByBrbvPzRtJp-lIgGu8cJuBUfVbJTMQhTe6N_YuFrVcoQ5eUY25wU7cAKTJnnLzdnNVlsJzVePsBzoTaD3CSLtprxK_GzoLBVxkg0b50HuZvVMJV60awOUA/s640/2019_05_Mike_Vernal.png" width="640" /></a></div>
<h3>
Monolithic Repositories with Ciera Jaspan</h3>
<div>
<a href="https://softwareengineeringdaily.com/2019/05/22/monolithic-repositories-with-ciera-jaspan/">https://softwareengineeringdaily.com/2019/05/22/monolithic-repositories-with-ciera-jaspan/</a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZag_R_Qr7N3onuGtVzU0q4ejqO-8raFShzgSv8w2ZDjkqTVmwy2c1tPsOMi4RQzuMuVUWcmJELx2UBg6-bfQ_U35lvz1_Wz8Ap78rFIH_uc2IiIpdEvq23aI0VYGlPUUYByoP_ccnKn4/s1600/2019_05_Ciera_Jaspan.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="913" data-original-width="914" height="638" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZag_R_Qr7N3onuGtVzU0q4ejqO-8raFShzgSv8w2ZDjkqTVmwy2c1tPsOMi4RQzuMuVUWcmJELx2UBg6-bfQ_U35lvz1_Wz8Ap78rFIH_uc2IiIpdEvq23aI0VYGlPUUYByoP_ccnKn4/s640/2019_05_Ciera_Jaspan.png" width="640" /></a></div>
<div>
<br /></div>
Pavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.com0tag:blogger.com,1999:blog-8842533688295012556.post-24581676931666208082019-05-02T05:29:00.000-07:002019-05-02T05:29:20.902-07:00APR 2019 Podcasts<h3>
Sage Advice (and Reasons You Probably Won't Follow It) from Jason Cohen of WP Engine</h3>
<div>
<a href="https://www.indiehackers.com/podcast/088-jason-cohen-of-wp-engine">https://www.indiehackers.com/podcast/088-jason-cohen-of-wp-engine</a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc3YETzVCIxvF8R0k8UAMgyELICbg8WTZyZdnR7KAvIRR87uMCTcyiqd1yPhrOtwxo9oTnmaDG2jNTvaiIFsgdLmYWUVWAQNKNfZwyfd_qMZzshbKQa_iuDlSZdtYKVmVTCukeV3iMTkw/s1600/2019_05_Jason+Cohen.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="741" data-original-width="741" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc3YETzVCIxvF8R0k8UAMgyELICbg8WTZyZdnR7KAvIRR87uMCTcyiqd1yPhrOtwxo9oTnmaDG2jNTvaiIFsgdLmYWUVWAQNKNfZwyfd_qMZzshbKQa_iuDlSZdtYKVmVTCukeV3iMTkw/s640/2019_05_Jason+Cohen.png" width="640" /></a></div>
<div>
<br /></div>
<h3>
SE-Radio Episode 362: Simon Riggs on Advanced Features of PostgreSQL</h3>
<div>
<a href="https://www.se-radio.net/2019/04/se-radio-episode-362-simon-riggs-on-advanced-features-of-postgresql/">https://www.se-radio.net/2019/04/se-radio-episode-362-simon-riggs-on-advanced-features-of-postgresql/</a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUyeJBNUCS0LHDiE-xj8oyDjXB6avMM_6WFr1BHGDrPeh6wHR-KCEHOa_o8esUO1NNjyxr2ftSokylCssYG3M90iBEM_LAMvJkrcUi0_axsInZx9eefQO_LP9Vq7gk0dv-X0xz9EkkaIA/s1600/2019_04_Simon+Riggs.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="642" data-original-width="642" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUyeJBNUCS0LHDiE-xj8oyDjXB6avMM_6WFr1BHGDrPeh6wHR-KCEHOa_o8esUO1NNjyxr2ftSokylCssYG3M90iBEM_LAMvJkrcUi0_axsInZx9eefQO_LP9Vq7gk0dv-X0xz9EkkaIA/s640/2019_04_Simon+Riggs.png" width="640" /></a></div>
<h3>
Wasmer is taking WebAssembly beyond the browser</h3>
<div>
<a href="https://changelog.com/podcast/341">https://changelog.com/podcast/341</a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhY0M4Sv-rqeIVq75D8XBEq-UOm487K2IrdtM4Aq_eQxSyw_tnPbQG2p6Nvce6WZehNs5sgqWMS-svnnouL0gR5cVqw7NhIDd4TZcu7l9s-mcvxnCpk7LRMoNsoThfpdr2OO6We-CUusgE/s1600/2019_04_Syrus_Akbary.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="499" data-original-width="717" height="444" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhY0M4Sv-rqeIVq75D8XBEq-UOm487K2IrdtM4Aq_eQxSyw_tnPbQG2p6Nvce6WZehNs5sgqWMS-svnnouL0gR5cVqw7NhIDd4TZcu7l9s-mcvxnCpk7LRMoNsoThfpdr2OO6We-CUusgE/s640/2019_04_Syrus_Akbary.png" width="640" /></a></div>
<h3>
024 - Kent Beck, Author of Test-Driven Development: By Example</h3>
<div>
<a href="http://www.rubytestingpodcast.com/kent-beck">http://www.rubytestingpodcast.com/kent-beck</a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoGbqrfFm1GvlDObYdaw3XuDuoJ7woRJA3GIdmnLwwxGrpd8I3tXZndRNYwoQJeHNLKptQbHG8STziLkhybwEfMo1cYU17Y_NBkNyuvok64kCR4Cv94XPHxITGDTZEjMecKxmvKiMLxs0/s1600/2019_04_Kent_Beck.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="798" data-original-width="799" height="638" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoGbqrfFm1GvlDObYdaw3XuDuoJ7woRJA3GIdmnLwwxGrpd8I3tXZndRNYwoQJeHNLKptQbHG8STziLkhybwEfMo1cYU17Y_NBkNyuvok64kCR4Cv94XPHxITGDTZEjMecKxmvKiMLxs0/s640/2019_04_Kent_Beck.png" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
Pavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.com0tag:blogger.com,1999:blog-8842533688295012556.post-930050308531212652019-04-02T03:13:00.000-07:002019-04-02T03:13:22.700-07:00MAR 2019 Podcasts<h3>
<b>SE-Radio Episode 360: Pete Koomen on A/B Testing</b></h3>
<a href="https://www.se-radio.net/2019/03/se-radio-episode-360-pete-koomen-on-a-b-testing/">https://www.se-radio.net/2019/03/se-radio-episode-360-pete-koomen-on-a-b-testing/</a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZEyiXkWGuvzTX_U8WYftsi_LCfzP_yK1L3MSU17D8OUW4nr_PPrD_ThjcBtjtc6RCSyB8YODHB_3zW1fnrJ573cClZnKWCjg8xxsJRlaUmgRIp_UgAZYbD8XBbXt83NaoECV0DJCopGM/s1600/2019_03_Pete_Koomen.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="618" data-original-width="618" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZEyiXkWGuvzTX_U8WYftsi_LCfzP_yK1L3MSU17D8OUW4nr_PPrD_ThjcBtjtc6RCSyB8YODHB_3zW1fnrJ573cClZnKWCjg8xxsJRlaUmgRIp_UgAZYbD8XBbXt83NaoECV0DJCopGM/s640/2019_03_Pete_Koomen.png" width="640" /></a></div>
<h3>
<b>FaunaDB with Evan Weaver</b></h3>
<div>
<div>
<a href="https://softwareengineeringdaily.com/2019/03/21/faunadb-with-evan-weaver/">https://softwareengineeringdaily.com/2019/03/21/faunadb-with-evan-weaver/</a></div>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz50uZe06e9PoYODrMzw45IRJbFZiatPNQoGlGk2RVk34qkrDQS5mCiiaKbe8WAgyu8ofd-gWC-DWJU9Xar0RtDkweOd4j7Tt_UzzVpaKMhj4bFGSS1y0zJ8gVQ6vFk8yHU6gU2nRPoLA/s1600/2019_03_Evan_Weaver.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="698" data-original-width="698" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz50uZe06e9PoYODrMzw45IRJbFZiatPNQoGlGk2RVk34qkrDQS5mCiiaKbe8WAgyu8ofd-gWC-DWJU9Xar0RtDkweOd4j7Tt_UzzVpaKMhj4bFGSS1y0zJ8gVQ6vFk8yHU6gU2nRPoLA/s640/2019_03_Evan_Weaver.png" width="640" /></a></div>
<br />
<br />Pavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.com0tag:blogger.com,1999:blog-8842533688295012556.post-68822637014098511442019-03-02T00:37:00.001-08:002019-03-02T00:37:48.382-08:00FEB 2019 Podcasts<h3>
Grady Booch on Today’s Artificial Intelligence Reality and What it Means for Developers</h3>
<div>
<a href="https://www.infoq.com/podcasts/artificial-intelligence-reality">https://www.infoq.com/podcasts/artificial-intelligence-reality</a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil4_T68z4FS679yHYFNhPK5qOO-JFgz6ev2J7FPYayrX6BdBu5mFOi7p1084-hy1YOw1jLQ2waSJSWjv6LrRajBN5K4i9gkLbc_6PVuc7NCg57F_8_oO-AQ4oNPMB_6eL2ewKdWuSgMIg/s1600/2019_02_Grady_Booch.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="831" data-original-width="831" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil4_T68z4FS679yHYFNhPK5qOO-JFgz6ev2J7FPYayrX6BdBu5mFOi7p1084-hy1YOw1jLQ2waSJSWjv6LrRajBN5K4i9gkLbc_6PVuc7NCg57F_8_oO-AQ4oNPMB_6eL2ewKdWuSgMIg/s640/2019_02_Grady_Booch.png" width="640" /></a></div>
<h3>
A UI framework without the framework</h3>
<div>
<a href="https://changelog.com/podcast/332">https://changelog.com/podcast/332</a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYyMIBzkM2P7Pi_3AD6kUgDWimRLcbHPOFGXx0vcroHYt3ON8yD6eetdIaUo5GiA0e3b7_23tMvow4Xt2QLgvVESs3kzw7Z5b76_rVP0dhyphenhyphenLsH_ImTHv0LNo7v9hOqy-UbRSMw93_Aerw/s1600/2019_02_Rich_Harris.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="859" data-original-width="859" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYyMIBzkM2P7Pi_3AD6kUgDWimRLcbHPOFGXx0vcroHYt3ON8yD6eetdIaUo5GiA0e3b7_23tMvow4Xt2QLgvVESs3kzw7Z5b76_rVP0dhyphenhyphenLsH_ImTHv0LNo7v9hOqy-UbRSMw93_Aerw/s640/2019_02_Rich_Harris.png" width="640" /></a></div>
<h3>
RocksDB with Dhruba Borthakur and Igor Canadi</h3>
<div>
<a href="https://softwareengineeringdaily.com/2019/02/05/rocksdb-with-dhruba-borthakur-and-igor-canadi/">https://softwareengineeringdaily.com/2019/02/05/rocksdb-with-dhruba-borthakur-and-igor-canadi/</a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbn8zdz3QJbuFFACVw3PVSRuofX_l2IkBp494P7JWsXInKN3iRhR-LDS9G2mCGFcY_enPpxH-Tlu5RTNXwn5xlkiGcDNYM51Eg1HHgYBIOAZVRtS_MbN0Kj8zJdO8Peca_OZBG-kV2iGI/s1600/2019_02_RocksDB.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="696" data-original-width="695" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbn8zdz3QJbuFFACVw3PVSRuofX_l2IkBp494P7JWsXInKN3iRhR-LDS9G2mCGFcY_enPpxH-Tlu5RTNXwn5xlkiGcDNYM51Eg1HHgYBIOAZVRtS_MbN0Kj8zJdO8Peca_OZBG-kV2iGI/s640/2019_02_RocksDB.png" width="638" /></a></div>
<div>
<br /></div>
<h3>
SDCast #97: в гостях Александр Тоболь, руководитель разработки платформ видео и лента в ОК</h3>
<div>
<a href="https://sdcast.ksdaemon.ru/2019/01/sdcast-97/">https://sdcast.ksdaemon.ru/2019/01/sdcast-97/</a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9VdlnKN_GlZNnJB_JqoAYtm84Wq_aal_dwKFbPVDrT3AiiIMUiEVFIk9sOrFTY8dl4C1_nFhzgtLngANIjNLmpOkorkXte8pPjArLpQ0OuloUxIdVdum2B1wbXcMURDxUkwY9hmKDYEg/s1600/2019_01_02_sdcast_97.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="555" data-original-width="925" height="384" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9VdlnKN_GlZNnJB_JqoAYtm84Wq_aal_dwKFbPVDrT3AiiIMUiEVFIk9sOrFTY8dl4C1_nFhzgtLngANIjNLmpOkorkXte8pPjArLpQ0OuloUxIdVdum2B1wbXcMURDxUkwY9hmKDYEg/s640/2019_01_02_sdcast_97.png" width="640" /></a></div>
<div>
<br /></div>
Pavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.com0tag:blogger.com,1999:blog-8842533688295012556.post-39757309511129907702019-02-02T03:07:00.000-08:002019-02-02T03:07:19.115-08:00JAN 2019 Podcasts<span style="font-family: "arial" , "helvetica" , sans-serif;"><i>Interesting podcasts I found this January. I will do monthly posts on this topic.</i></span><br />
<h3>
<span style="font-family: "arial" , "helvetica" , sans-serif;">
Taking on Google and Facebook as a Solo Open-Source Founder with Evan You of Vue.js</span></h3>
<div>
<a href="https://www.indiehackers.com/podcast/078-evan-you-of-vue"><span style="font-family: "arial" , "helvetica" , sans-serif;">https://www.indiehackers.com/podcast/078-evan-you-of-vue</span></a></div>
<div>
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjy1Hqz0O_ognRpFQ1dFXl9Qj_L3E-vDhqt_R5qFg619ex0CPaVNGFvlOAlnkfgmh7zOT57Y4E25ARTlAkQe_0tnBHVS9fhFVvp6orJ8u69-W3uouKbo0y7zOzjQexpCPuQedhmdH6tS4U/s1600/2019_01_vue.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: "arial" , "helvetica" , sans-serif;"><img border="0" data-original-height="577" data-original-width="963" height="380" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjy1Hqz0O_ognRpFQ1dFXl9Qj_L3E-vDhqt_R5qFg619ex0CPaVNGFvlOAlnkfgmh7zOT57Y4E25ARTlAkQe_0tnBHVS9fhFVvp6orJ8u69-W3uouKbo0y7zOzjQexpCPuQedhmdH6tS4U/s640/2019_01_vue.png" width="640" /></span></a></div>
<h3>
<span style="font-family: "arial" , "helvetica" , sans-serif;">
Software as a Reflection of Values With Bryan Cantrill</span></h3>
<div>
<a href="https://corecursive.com/024-software-as-a-reflection-of-values-with-bryan-cantrill/"><span style="font-family: "arial" , "helvetica" , sans-serif;">https://corecursive.com/024-software-as-a-reflection-of-values-with-bryan-cantrill/</span></a></div>
<div>
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGwCSBrK5z_R3w-xqGnttYJOlN1LQL0WoJ6JqeeYQWJujExTYFfKHELahgda1dbQl5p-OIgzZ_AWKWs3rdtlHQhJyyNm-xbjwq6bd1WPrV_VVj7Qo0LRWyyjCGT3BSBohN0MYG7niGH6k/s1600/2019_o1_Bryan_Cantrill.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: "arial" , "helvetica" , sans-serif;"><img border="0" data-original-height="609" data-original-width="1015" height="384" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGwCSBrK5z_R3w-xqGnttYJOlN1LQL0WoJ6JqeeYQWJujExTYFfKHELahgda1dbQl5p-OIgzZ_AWKWs3rdtlHQhJyyNm-xbjwq6bd1WPrV_VVj7Qo0LRWyyjCGT3BSBohN0MYG7niGH6k/s640/2019_o1_Bryan_Cantrill.png" width="640" /></span></a></div>
<div>
<h3>
<span style="font-family: "arial" , "helvetica" , sans-serif;">
Anchor: Podcast Platform with Nir Zicherman</span></h3>
</div>
<div>
<a href="https://softwareengineeringdaily.com/2018/11/30/anchor-podcast-platform-with-nir-zicherman/"><span style="font-family: "arial" , "helvetica" , sans-serif;">https://softwareengineeringdaily.com/2018/11/30/anchor-podcast-platform-with-nir-zicherman/</span></a></div>
<div>
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifrOJWyYpyUtC0uKPWAnD-aiQqSKHlYdfPKMUQJm1X19V0rRTG2rXwTiJDmaC1-5SeBwwgvR6Waani10QEJjooW04W_H3rQ1ts2FF9B9SuHhEcG2g6gdoXyWYb8vM6Q8-Ox-Ilr_-9SBQ/s1600/2019_01_Anchor.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: "arial" , "helvetica" , sans-serif;"><img border="0" data-original-height="579" data-original-width="966" height="382" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifrOJWyYpyUtC0uKPWAnD-aiQqSKHlYdfPKMUQJm1X19V0rRTG2rXwTiJDmaC1-5SeBwwgvR6Waani10QEJjooW04W_H3rQ1ts2FF9B9SuHhEcG2g6gdoXyWYb8vM6Q8-Ox-Ilr_-9SBQ/s640/2019_01_Anchor.png" width="640" /></span></a></div>
<div>
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span></div>
<div>
<h3>
Обучение программистов бесплатно за два часа без смс — Episode 0226</h3>
</div>
<div>
<a href="https://devzen.ru/episode-0226/">https://devzen.ru/episode-0226/</a></div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZnlt5xgv7TN4tV4qGglVBbxJ6Hw1KH9KtFg0X54H9uIGCOW1S55denqk7p7_PXLQU2-1kvY7bT5t5otDv1pknRrLSkKLA4kM6L5y2WHki0E7vY9niW5YnycJEmnBV9g7BK8VL6iFXTac/s1600/2019_01_hexlet.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="781" data-original-width="1301" height="384" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZnlt5xgv7TN4tV4qGglVBbxJ6Hw1KH9KtFg0X54H9uIGCOW1S55denqk7p7_PXLQU2-1kvY7bT5t5otDv1pknRrLSkKLA4kM6L5y2WHki0E7vY9niW5YnycJEmnBV9g7BK8VL6iFXTac/s640/2019_01_hexlet.png" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
Pavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.com0tag:blogger.com,1999:blog-8842533688295012556.post-6536947589940746962019-01-07T22:50:00.000-08:002019-01-07T22:50:05.976-08:00The best 2018<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhliVM7CL39N94nTRsJR2Yy2RD1Ra9Bdz49zsd55D5bK3uTxdA0yzNsJWrj0rKAj1C0_pHNIJTIyZOVcz-AfOJVHgNKyoxzAXiPf3fSMQFvrf0yFDwQ2wQydOwlKrg2mXpb4HwzxJQR9cY/s1600/cardiff.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1067" data-original-width="1600" height="425" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhliVM7CL39N94nTRsJR2Yy2RD1Ra9Bdz49zsd55D5bK3uTxdA0yzNsJWrj0rKAj1C0_pHNIJTIyZOVcz-AfOJVHgNKyoxzAXiPf3fSMQFvrf0yFDwQ2wQydOwlKrg2mXpb4HwzxJQR9cY/s640/cardiff.JPG" width="640" /></a></div>
<b><span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span></b>
<br />
<b><span style="font-family: "arial" , "helvetica" , sans-serif;">IT book</span></b><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><a href="https://github.com/hmemcpy/milewski-ctfp-pdf/" target="_blank">Category Theory for Programmers</a> by Bartosz Milewski</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><i><span style="color: #999999; font-family: "arial" , "helvetica" , sans-serif;">I still read the book. Will see how it goes. The first third, I've read, is fascinating.</span></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><span style="font-family: "arial" , "helvetica" , sans-serif;"><i><span style="color: #999999;"><br /></span></i></span><span style="font-family: "arial" , "helvetica" , sans-serif;"><span style="font-family: "arial" , "helvetica" , sans-serif;"><b>Must read IT book</b></span></span></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><a href="https://www.amazon.co.uk/Writing-Effective-Crystal-Software-Development/dp/0201702258" target="_blank">Writing Effective Use Cases</a> by Alistair Cockburn</span><br />
<i><span style="color: #999999; font-family: "arial" , "helvetica" , sans-serif;">I found a new entry for my "must-read" book list. Highly recommend!</span></i><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><i><span style="color: #999999; font-family: "arial" , "helvetica" , sans-serif;"><br /></span></i><span style="font-family: "arial" , "helvetica" , sans-serif;"><b><span style="font-family: "arial" , "helvetica" , sans-serif;">Language for pet projects</span></b></span></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><a href="https://crystal-lang.org/">Crystal</a></span><br />
<span style="color: #999999; font-family: "arial" , "helvetica" , sans-serif;"><i>I want to play with </i><a href="http://www.purescript.org/" style="font-style: italic;">PureScript</a><i> a bit. </i><a href="https://www.rust-lang.org/" style="font-style: italic;" target="_blank">Rust</a><i> does improve the ergonomics little by little (but still painful).</i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><span style="color: #999999; font-family: "arial" , "helvetica" , sans-serif;"><i><br /></i></span><span style="font-family: "arial" , "helvetica" , sans-serif;"><b><span style="font-family: "arial" , "helvetica" , sans-serif;">Piece of code</span></b></span></span><br />
<pre class="scala" name="code">type Id[A] = A</pre>
<span style="font-family: "arial" , "helvetica" , sans-serif;"><b><br /></b></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;"><b>Intrigue</b></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">Minimal version selection in Golang</span><br />
<span style="color: #999999; font-family: "arial" , "helvetica" , sans-serif;"><i><a href="https://microsoft.github.io/language-server-protocol/" target="_blank">Language Server Protocol</a>.</i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><span style="color: #999999; font-family: "arial" , "helvetica" , sans-serif;"><a href="https://microsoft.github.io/language-server-protocol/" target="_blank"><i><br /></i></a></span><span style="font-family: "arial" , "helvetica" , sans-serif;"><b><span style="font-family: "arial" , "helvetica" , sans-serif;">Waste of time</span></b></span></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><a href="https://github.com/actix/actix" target="_blank">Actix</a> actor system</span><br />
<i><span style="color: #999999; font-family: "arial" , "helvetica" , sans-serif;">"Leaky Abstraction" is too dry term for describing the framework.</span></i><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><i><span style="color: #999999; font-family: "arial" , "helvetica" , sans-serif;"><br /></span></i><b><span style="font-family: "arial" , "helvetica" , sans-serif;">Podcast episode</span></b></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><a href="https://devzen.ru/episode-0217/" target="_blank">Ламповый брейнфак</a></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><span style="font-family: "arial" , "helvetica" , sans-serif;"><a href="https://devzen.ru/episode-0217/" target="_blank"><br /></a></span><span style="font-family: "arial" , "helvetica" , sans-serif;"><b><span style="font-family: "arial" , "helvetica" , sans-serif;">Retro TV Series</span></b></span></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><a href="https://www.imdb.com/title/tt0108778/" target="_blank">Friends</a></span><br />
<i><span style="color: #999999; font-family: "arial" , "helvetica" , sans-serif;"><a href="https://www.imdb.com/title/tt0290978/" target="_blank">The Office</a> (season 1) is good too.</span></i><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><i><span style="color: #999999; font-family: "arial" , "helvetica" , sans-serif;"><br /></span></i><span style="font-family: "arial" , "helvetica" , sans-serif;"><b>Documentary video</b></span></span><br />
<a href="https://www.imdb.com/title/tt1559549/" target="_blank"><span style="font-family: "arial" , "helvetica" , sans-serif;">Restrepo</span></a><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><a href="https://www.imdb.com/title/tt1559549/" target="_blank"><span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span></a><span style="font-family: "arial" , "helvetica" , sans-serif;"><span style="font-family: "arial" , "helvetica" , sans-serif;"><b>History</b></span></span></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><span style="font-family: "arial" , "helvetica" , sans-serif;"><a href="https://galkovsky.livejournal.com/263631.html" target="_blank">Что необходимо знать о Пушкине</a></span></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><span style="font-family: "arial" , "helvetica" , sans-serif;"><span style="font-family: "arial" , "helvetica" , sans-serif;"><a href="https://galkovsky.livejournal.com/263631.html" target="_blank"><br /></a></span></span><span style="font-family: "arial" , "helvetica" , sans-serif;"><span style="font-family: "arial" , "helvetica" , sans-serif;"><span style="font-family: "arial" , "helvetica" , sans-serif;"><b>The future is here</b></span></span></span></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><span style="font-family: "arial" , "helvetica" , sans-serif;"><a href="https://en.wikipedia.org/wiki/Cultured_meat" target="_blank">Cultured meat</a></span></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><span style="font-family: "arial" , "helvetica" , sans-serif;"><span style="font-family: "arial" , "helvetica" , sans-serif;"><a href="https://en.wikipedia.org/wiki/Cultured_meat" target="_blank"><br /></a></span></span><span style="font-family: "arial" , "helvetica" , sans-serif;"><b>Music</b></span></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><a href="https://www.youtube.com/user/ScottBradleeLovesYa/featured" target="_blank">PostmodernJukebox</a></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><span style="font-family: "arial" , "helvetica" , sans-serif;"><a href="https://www.youtube.com/user/ScottBradleeLovesYa/featured" target="_blank"><br /></a></span><span style="font-family: "arial" , "helvetica" , sans-serif;"><b><span style="font-family: "arial" , "helvetica" , sans-serif;">Museum</span></b></span></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><a href="https://en.wikipedia.org/wiki/Rijksmuseum" target="_blank">The Rijksmuseum</a> in Amsterdam</span><br />
<span style="background-color: white; color: #999999; font-family: "arial" , "helvetica" , sans-serif;"><i><a href="https://en.wikipedia.org/wiki/Louvre" target="_blank">The Louvre Museum</a> and <a href="https://en.wikipedia.org/wiki/Palace_of_Versailles" target="_blank">The Palace of Versailles</a></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><span style="background-color: white; color: #999999;"><i><a href="https://en.wikipedia.org/wiki/Palace_of_Versailles" target="_blank"><br /></a></i></span><span style="font-family: "arial" , "helvetica" , sans-serif;"><b><span style="font-family: "arial" , "helvetica" , sans-serif;">Vacation</span></b></span></span><br />
<a href="https://photos.google.com/share/AF1QipPQd5XWfpdASvrrDLkXWWGKDj2Nh67tq0GL9loYT09ZAITnsgafEDHZJi5RRXYePA?key=cFczenRrcEhRZGlrV3FCSnI0ZXlLbGNEMzFtTERn" target="_blank"><span style="font-family: "arial" , "helvetica" , sans-serif;">Cape Verde vacation</span></a><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
Pavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.com0tag:blogger.com,1999:blog-8842533688295012556.post-76822285541612545702018-01-15T23:23:00.000-08:002018-01-15T23:23:20.259-08:00The best 2017<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOw_at6m1B27ThE5v_AX7wU33cKHJr0S9K8AaQzCrl_yddfilqyCu8vuaLj5HKPq35ybAHwEVWvXMugevfkwMdLo0hAbOmzRZb0JakHHfbKGY_O7H5C_4GgGUplh7CIgBMySXvrcriQO4/s1600/krakow_postcard.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="873" data-original-width="582" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOw_at6m1B27ThE5v_AX7wU33cKHJr0S9K8AaQzCrl_yddfilqyCu8vuaLj5HKPq35ybAHwEVWvXMugevfkwMdLo0hAbOmzRZb0JakHHfbKGY_O7H5C_4GgGUplh7CIgBMySXvrcriQO4/s640/krakow_postcard.png" width="426" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="color: #444444; font-size: x-small;"><span style="font-family: Arial, Helvetica, sans-serif;">Christmas fair on Main Market Square (Kraków)</span></span></div>
<b><br /></b>
<b><span style="font-family: Arial, Helvetica, sans-serif;">Library</span></b><br />
<a href="https://github.com/turbolinks/turbolinks" target="_blank"><span style="font-family: Arial, Helvetica, sans-serif;">Turbolinks 5</span></a><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span>
<b><span style="font-family: Arial, Helvetica, sans-serif;">Programming fundamentals</span></b><br />
<span style="font-family: Arial, Helvetica, sans-serif;">Open/closed SOLID principle explained by Sandi Metz (<a href="https://www.sandimetz.com/99bottles/" target="_blank">99 Bottles of OOP</a>) and (independently?) by Michael Feathers</span><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span>
<b><span style="font-family: Arial, Helvetica, sans-serif;">Intrigue</span></b><br />
<a href="https://developers.google.com/web/ilt/pwa/" target="_blank"><span style="font-family: Arial, Helvetica, sans-serif;">Progressive Web Apps</span></a><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span>
<b><span style="font-family: Arial, Helvetica, sans-serif;">Pet project</span></b><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><a href="http://novembermeeting.blogspot.co.uk/2017/10/todoturbolinks-rocket-redis-turbolinks-5.html" target="_blank">A simple Turbolinks 5 application</a> visually indistinguishable from TodoMVC JavaScript apps</span><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span>
<b><span style="font-family: Arial, Helvetica, sans-serif;">Language for pet projects</span></b><br />
<a href="https://www.rust-lang.org/en-US/" target="_blank"><span style="font-family: Arial, Helvetica, sans-serif;">Rust </span></a><br />
<i><span style="font-family: Arial, Helvetica, sans-serif;"><a href="https://reasonml.github.io/" target="_blank">ReasonML</a> and <a href="http://elm-lang.org/" target="_blank">Elm</a> haven’t overcome the barrier of my pragmatism yet</span></i><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span>
<b><span style="font-family: Arial, Helvetica, sans-serif;">IT video</span></b><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><a href="https://www.youtube.com/watch?v=buY54I7mEjA" target="_blank">Type Checking Ruby</a> by Jeffrey Foster</span><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span>
<div>
<div>
<b><span style="font-family: Arial, Helvetica, sans-serif;">IT book</span></b></div>
<div>
<span style="font-family: Arial, Helvetica, sans-serif;"><a href="https://www.goodreads.com/book/show/18043011-clean-architecture" target="_blank">Clean Architecture</a> by Robert C. Martin</span></div>
</div>
<div>
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div>
<div>
<b><span style="font-family: Arial, Helvetica, sans-serif;">Podcast</span></b></div>
<div>
<a href="https://www.indiehackers.com/podcast" target="_blank"><span style="font-family: Arial, Helvetica, sans-serif;">The indie hackers podcast</span></a></div>
</div>
<div>
<i><span style="font-family: Arial, Helvetica, sans-serif;">Observation: the only technology that pops up over and over again in different episodes is Ruby on Rails</span></i><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div>
<div>
<b><span style="font-family: Arial, Helvetica, sans-serif;">Workshop</span></b></div>
<div>
<a href="https://codebar.io/" target="_blank"><span style="font-family: Arial, Helvetica, sans-serif;">Codebar</span></a></div>
<div>
<i><span style="font-family: Arial, Helvetica, sans-serif;">I took part in half a dozen events as a coach</span></i></div>
</div>
<div>
<b><span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></b></div>
<div>
<div>
<b><span style="font-family: Arial, Helvetica, sans-serif;">Hype</span></b></div>
<div>
<a href="https://en.wikipedia.org/wiki/Cryptocurrency" target="_blank"><span style="font-family: Arial, Helvetica, sans-serif;">Cryptocurrency</span></a></div>
<div>
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div>
<div>
<b><span style="font-family: Arial, Helvetica, sans-serif;">Blog post</span></b></div>
<div>
<span style="font-family: Arial, Helvetica, sans-serif;"><a href="https://www.joelonsoftware.com/2016/12/09/developers-side-projects/" target="_blank">Developers’ side projects</a> by Joel Spolsky</span></div>
<div>
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div>
<div>
<b><span style="font-family: Arial, Helvetica, sans-serif;">Popular-science post</span></b></div>
<div>
<a href="http://waitbutwhy.com/2017/04/neuralink.html" target="_blank"><span style="font-family: Arial, Helvetica, sans-serif;">Neuralink and the Brain’s Magical Future</span></a></div>
</div>
<div>
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div>
<div>
<b><span style="font-family: Arial, Helvetica, sans-serif;">Popular-science video</span></b></div>
<div>
<a href="https://www.youtube.com/watch?v=wgSZA3NPpBs" target="_blank"><span style="font-family: Arial, Helvetica, sans-serif;">Is the Universe a Simulation?</span></a></div>
</div>
<div>
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span id="docs-internal-guid-58aecf45-e91e-8cba-e6a5-80a74c05420d"><span style="font-family: "arial";"><span style="font-family: Arial, Helvetica, sans-serif; white-space: pre-wrap;"><b>Non-fiction book</b></span></span></span><br />
<a href="https://www.ozon.ru/context/detail/id/136154461/" style="white-space: pre-wrap;" target="_blank"><span style="font-family: Arial, Helvetica, sans-serif;">Лестница в небо. Диалоги о власти, карьере и мировой элите (RU)</span></a><br />
<i><span style="font-family: Arial, Helvetica, sans-serif;"><a href="https://en.wikipedia.org/wiki/Sapiens:_A_Brief_History_of_Humankind" target="_blank">Sapiens: A Brief History of Humankind</a> didn't strike me as something original. But I read it with some interest</span></i></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<span id="docs-internal-guid-58aecf45-e91e-8cba-e6a5-80a74c05420d" style="font-family: Arial, Helvetica, sans-serif;">
</span>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span id="docs-internal-guid-58aecf45-e91e-8cba-e6a5-80a74c05420d" style="font-family: Arial, Helvetica, sans-serif;"><b>Film director</b></span></div>
<span id="docs-internal-guid-58aecf45-e91e-8cba-e6a5-80a74c05420d"><span style="font-family: Arial, Helvetica, sans-serif;">
</span><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<a href="https://en.wikipedia.org/wiki/Denis_Villeneuve" target="_blank"><span style="font-family: Arial, Helvetica, sans-serif;">Denis Villeneuve</span></a></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<i><span style="font-family: Arial, Helvetica, sans-serif;">Disclaimer: I haven’t seen “Blade Runner 2049” yet</span></i></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<i><span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></i></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b><span style="font-family: Arial, Helvetica, sans-serif;">Television series</span></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
</div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: Arial, Helvetica, sans-serif;"><a href="https://en.wikipedia.org/wiki/Black_Mirror" target="_blank">Black Mirror</a> (series two and three)</span><br />
<b><span style="font-family: Arial, Helvetica, sans-serif;"><br class="Apple-interchange-newline" />Music video</span></b><br />
<a href="https://www.youtube.com/watch?v=O9G6mVo_AbQ&t=14m34s" target="_blank"><span style="font-family: Arial, Helvetica, sans-serif;">Top 80 Songs You Didn't Know Were Covers and Their Originals</span></a></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b><span style="font-family: Arial, Helvetica, sans-serif;">Personality</span></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<a href="http://david.heinemeierhansson.com/" target="_blank"><span style="font-family: Arial, Helvetica, sans-serif;">David Heinemeier Hansson</span></a><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span>
<b><span style="font-family: Arial, Helvetica, sans-serif;">Accessory</span></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span id="docs-internal-guid-bd2b197e-f89d-2ea9-a946-7bd612a82fbb"><span style="font-family: Arial, Helvetica, sans-serif; vertical-align: baseline; white-space: pre-wrap;">Christopher Ward <a href="https://vimeo.com/200259673" target="_blank">C60 Trident Pro 600</a></span></span><br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b><span style="font-family: Arial, Helvetica, sans-serif;"><br class="Apple-interchange-newline" />Quality of life</span></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: Arial, Helvetica, sans-serif;">Jogging at lunchtime</span><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: white; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Museum</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: white; font-family: Arial; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><a href="https://www.vam.ac.uk/collections?type=periods-and-styles" target="_blank">The Victoria and Albert Museum</a> </span><span style="background-color: white; color: #222222; font-family: sans-serif;">in London</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
</div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b><span style="font-family: Arial, Helvetica, sans-serif;">Vacation</span></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: Arial, Helvetica, sans-serif;">New Year's Eve in Krakow</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<i><span style="font-family: Arial, Helvetica, sans-serif;">Thank you for such a warm welcome <a href="https://twitter.com/GricaiAn">@GricaiAn</a>, <a href="https://twitter.com/alderko">@alderko</a>, <a href="https://twitter.com/h8_self">@h8_self</a> and <a href="https://twitter.com/andy128k">@andy128k</a></span></i></div>
</span></div>
</div>
</div>
Pavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.com0tag:blogger.com,1999:blog-8842533688295012556.post-66955798758854578072017-10-28T05:19:00.000-07:002017-11-04T01:49:27.316-07:00TodoTurbolinks: Rocket, Redis, Turbolinks 5 Turbolinks 5 looks awesome. Just <a href="https://www.youtube.com/watch?v=SWEts0rlezA&t=652s">check this video</a> to get the grasp of it. Having no experience with the library, I created a small web-application on Turbolinks, to test my expectations in practice.<br />
<br />
Since Turbolinks became a standalone JS library, I had the freedom to choose the backend stack. Thereby an additional goal was to make hands dirty with Rust on the server-side. To understand how painful it is (spoiler: it certainly is). I chose <a href="https://rocket.rs/">Rocket</a> and set to work.<br />
<br />
In order to have a simple domain to mess around, I started to build <a href="https://github.com/MitinPavel/todo_turbolinks">an app,</a> which should be visually indistinguishable from <a href="http://todomvc.com/">TodoMVC</a> apps.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdcCxDsENDSIrMlA6043t8JPZciAUI5ynU8sv_Tp03gCW8nBp274zKTd9-evROagYIQcXPwP_G3Zn5hOcs9TtaSTmvcZVx07nfr2K9kUeljXGD15wiME_ZB-mckX8BHLIlNcCWiGfQq1U/s1600/Screenshot+from+2017-11-03+21-04-25.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="717" data-original-width="539" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdcCxDsENDSIrMlA6043t8JPZciAUI5ynU8sv_Tp03gCW8nBp274zKTd9-evROagYIQcXPwP_G3Zn5hOcs9TtaSTmvcZVx07nfr2K9kUeljXGD15wiME_ZB-mckX8BHLIlNcCWiGfQq1U/s320/Screenshot+from+2017-11-03+21-04-25.png" width="240" /></a></div>
<span id="goog_1689949304"></span><span id="goog_1689949305"></span><br />
<br />
While working on the project, I found out that some secondary aspects are not covered in guides and examples. Thus I wrote this post to document it somehow.<br />
<h3>
Redis connection pool</h3>
Rocket Guide has a section about database support. In particular, it describes how to set up Diesel/SQLite. Having chosen Redis as a database for the project, I had to do it by myself.<br />
<br />
At first, I added <span style="font-family: inherit;">redis</span>, r2d2 and r2d2_redis crates to Cargo.toml.
<br />
<pre>[dependencies]
#...
redis = "0.8.0"
r2d2 = "*"
r2d2_redis = "*"</pre>
After that I created a type alias for r2d2::Pool.
<br />
<pre>type Pool = r2d2::Pool<RedisConnectionManager>;</pre>
<br />
To take advantage of Rocket request guards, I introduced a wrapper around r2d2::PooledConnection and implemented request::FromRequest for the wrapper.
<br />
<pre>type Pool = r2d2::Pool<RedisConnectionManager>;</pre>
<pre>impl<'a, 'r> request::FromRequest<'a, 'r> for RedisConnection {
type Error = ();
fn from_request(request: &'a request::Request<'r>) -> request::Outcome<RedisConnection, ()> {
let pool = request.guard::<State<Pool>>()?;
match pool.get() {
Ok(conn) => Outcome::Success(RedisConnection(conn)),
Err(_) => Outcome::Failure((http::Status::ServiceUnavailable, ())),
}
}
}
</pre>
It gave me an ability to have a Redis connection as a parameter of request handlers.
<br />
<pre>#[get("/")]
fn index(connection: RedisConnection) -> String {
let items: Vec<String> = connection.lrange(DB_KEY, 0, -1).unwrap();
items.join(", ")
}</pre>
Finally, I instantiated a pool and passed it as an application state.
<br />
<pre>fn main() {
let connection_manager = RedisConnectionManager::new(REDIS_ADDRESS).expect("connection manager");
let redis_config = Default::default();
let pool = r2d2::Pool::new(redis_config, manager).expect("db pool");
rocket::ignite()
.mount("/", routes![items::create, items::index])
.manage(pool)
.launch();
}</pre>
Further details could be <a href="https://github.com/MitinPavel/todo_turbolinks/blob/84da31647a741aa9ea3ed9852c4a7b0e5890d9f6/src/db/redis.rs#L12-L22">found here</a>. Or you can check out <a href="https://github.com/MitinPavel/rocket_redis_r2d2">a tiny example project</a>.<br />
<h3>
Extra configuration parameters</h3>
Rocket allows configuring an application via an optional Rocket.toml file. It can contain two types of entries:<br />
<ul>
<li>default configuration parameters</li>
<li>extra configuration parameters</li>
</ul>
While the default params are documented, extras suffer from a lack of examples. My app provides one.<br />
<br />
Configuring Redis, I added Rocket.toml with an extra param.
<br />
<pre>[development]
redis_connection_address = "redis://localhost:6379"</pre>
To gain access to the app config in the main function, I separated rocket ignition and lunch.
<br />
<pre>fn main() {
let app = rocket::ignite();
let app_config: &config::Config = app.config(); // <-
app.mount("/", routes![root::index])
.manage( db_pool(app_config))
.launch();
}</pre>
To extract the address value or fallback to default, I called "get" on extras.<br />
<pre>pub fn db_pool(app_config: &config::Config) -> Pool {
let address = app_config
.extras
.get("redis_connection_address")
.and_then(|v| v.as_str())
.unwrap_or_else(|| "redis://localhost");
// ...
</pre>
<h3>
Turbolinks 5</h3>
This part of my project was easy. I just added one line to HTML and all GET requests got accelerated.
<br />
<pre><script src="https://cdnjs.cloudflare.com/ajax/libs/turbolinks/5.0.3/turbolinks.js"></script></pre>
Form submissions were a little bit more involved. On the client side, I started to handle the "submit" event and send requests via AJAX.<br />
<pre>function submitForm(form) {
$.ajax({
url: form.action,
type: form.method,
dataType: 'script',
data: $(form).serialize()
});
}
document.addEventListener("turbolinks:load", function() {
$('form').submit(function (e) {
e.preventDefault();
submitForm(e.target);
});
});</pre>
On the server side, I substituted redirects with Turbolinks API calls. And that's it.<br />
<pre>#[delete("/<id>")]
fn destroy(
id: TodoId,
session_id: CookieSessionId,
db: RedisConnection,
) -> Result<String, status::Custom<String>> {
let repo = Repository::new(session_id.into(), db);
repo.clear(id)?;
Ok(format!("Turbolinks.clearCache(); Turbolinks.visit('/todos')"))
}</pre>
<h3>
Summary</h3>
Predictably, <b>Rust</b>'s strengths are quite far from traditional web development. I was in times less productive comparing with Ruby on Rails. It's worth it to have a look at Rust only if:<br />
<ul>
<li>a web project really needs runtime performance and/or small memory footprint</li>
<li>a team is willing to sacrifice development speed</li>
</ul>
<br />
<b>Turbolinks 5</b> has proved to be an excellent tool. I would consider Turbolinks each time an app is lucky to not be a SPA.<br />
<br />
Links:<br />
<ul>
<li><a href="https://github.com/MitinPavel/todo_turbolinks" target="_blank">Todo Turbolinks app (GitHub)</a></li>
<li><a href="https://github.com/MitinPavel/rocket_redis_r2d2">Redis r2d2 app (GitHub)</a></li>
</ul>
Pavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.com0tag:blogger.com,1999:blog-8842533688295012556.post-89124883175200356382017-01-09T04:06:00.002-08:002017-03-24T13:27:34.027-07:00The best 2016<b>A new language</b><br />
<a href="https://www.rust-lang.org/">Rust</a><br />
<br />
<b>Intrigue</b><br />
<a href="https://chatbotsmagazine.com/">Chatbots</a><br />
<br />
<b>Pet project</b><br />
A hobbyist <a href="https://github.com/MitinPavel/little_os">operating system</a> inspired by <a href="https://littleosbook.github.io/">The little book about OS development</a> and <a href="http://wiki.osdev.org/Main_Page">OSDev Wiki</a><br />
Nominees: <a href="https://github.com/MitinPavel/http_event_store">Greg's Event Store Rust HTTP Client</a><br />
<br />
<b>Blog series</b><br />
<a href="http://os.phil-opp.com/">Writing an OS in Rust</a><br />
<br />
<b>Programming trick</b><br />
<a href="http://os.phil-opp.com/modifying-page-tables.html#recursive-mapping">Recursively mapped page tables</a><br />
<br />
<b>MOOC</b><br />
<a href="https://www.coursera.org/learn/ml-foundations">Machine Learning Foundations: A Case Study Approach</a> by Carlos Guestrin and Emily Fox<br />
<br />
<b>Online coding practice</b><br />
<a href="http://www.exercism.io/">esxercism.io</a><br />
<i>"Implement and compare" approach works quite good for a new language</i><br />
<br />
<b>IT book</b><br />
<a href="https://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601">Java Concurrency in Practice</a> by Brian Goetz<br />
<i>Still in progress</i><br />
<br />
<b>Podcast</b><br />
<a href="https://softwareengineeringdaily.com/">Software Engineering Daily</a><br />
<br />
<b>Podcast episode</b><br />
<a href="https://gimletmedia.com/episode/1-how-not-to-pitch-a-billionaire/">How Not to Pitch a Billionaire</a> episode of StartUp podcast<br />
<br />
<b>Tweet</b><br />
<a href="https://twitter.com/map_and_filter/status/806904667015770113">Most essential #algorithms hang on trees</a><br />
<div>
<br /></div>
<b>Little surprise</b><br />
ML abbreviation is no longer associated with the programming language<br />
<br />
<b>Disappointment</b><br />
<a href="https://en.wikipedia.org/wiki/Farnborough_Airshow">Farnborough Airshow</a><br />
<i>Endless rows of closed pavilions at public weekend</i><br />
<i><br /></i>
<b>History</b><br />
The mystery behind <a href="https://en.wikipedia.org/wiki/Capriccio_(art)">Capriccio</a><br />
<br />
<b>Economy</b><br />
<a href="http://atlas.cid.harvard.edu/">The Atlas of Economic Complexity</a><br />
<i>Especially export <a href="http://atlas.cid.harvard.edu/explore/product_space/export/svn/all/show/2014/">charts</a></i><br />
<br />
<b>Alarming symptoms</b><br />
<a href="https://en.wikipedia.org/wiki/Basic_income">Basic income</a> in public discourse<br />
<br />
<b>Short documentary video</b><br />
<a href="https://vimeo.com/192179727">Autopilot Full Self-Driving Hardware</a><br />
<br />
<b>Movie</b><br />
<a href="https://en.wikipedia.org/wiki/Never_Let_Me_Go_(2010_film)">Never Let Me Go</a><br />
<br />
<b>Holiday</b><br />
<a href="https://t.co/xAeQQduwAx">Lovely</a> <a href="https://t.co/Q2iF1pCeh4">Italian</a> <a href="https://t.co/RYlmUyTFEe">vacation</a><br />
Nominees: <a href="https://goo.gl/photos/MArhd1MGpfzvwyKD9">Edinburgh</a>, Marmaris, Portsmouth, Isle of Wight, Birmingham<br />
<br />
<b>Main event</b><br />
I was invited as a guest to a popular Russian-speaking IT podcast <a href="http://devzen.ru/episode-0122/">DevZen</a><br />
<br />
<br />Pavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.com0tag:blogger.com,1999:blog-8842533688295012556.post-69701584797207424132016-01-07T05:22:00.000-08:002016-01-07T05:22:17.867-08:00The best 2015<b>A new language</b><br />
<a href="http://elm-lang.org/">Elm</a>
<br /><br />
<b>IT book</b><br />
<a href="http://chimera.labs.oreilly.com/books/1230000000545">High Performance Browser Networking</a> by Ilya Grigorik
<br /><br />
<b>IT teaser</b><br />
RESTful <a href="https://facebook.github.io/react/blog/2015/05/01/graphql-introduction.html">considered</a> <a href="http://codurance.com/2015/10/22/transcending-rest-and-rpc/">harmful</a>
<br /><br />
<b>Hype</b><br />
<a href="http://blog.rust-lang.org/2015/05/15/Rust-1.0.html">Rust</a>
<br /><br />
<b>Piece of code</b>
<pre class="ruby" name="code">
defmodule Stack do
use GenServer
def handle_call(:pop, _from, [h|t]) do
{:reply, h, t}
end
def handle_cast({:push, item}, state) do
{:noreply, [item|state]}
end
end
</pre>
<b>Tool</b><br />
<a href="https://www.intercom.io/">Intercom</a>
<br /><br />
<b>False start</b><br />
<a href="http://www.linuxfromscratch.org/lfs/">Linux From Scratch</a>
<br /><br />
<b>Waste of time</b><br />
<a href="https://www.coursera.org/course/algs4partI">Algorithms, Part I - Princeton University | Coursera</a>
<br /><br />
<b>Tweet</b><br />
<a href="https://twitter.com/map_and_filter/status/585911234224115712">Well, Ruby on Rails is a technical debt web framework. And it works really good.</a>
<br /><br />
<b>Community</b><br />
<a href="http://www.meetup.com/PHP-Berkshire/">PHP Berkshire</a>
<br /><br />
<b>Podcast</b><br />
<a href="https://www.functionalgeekery.com/">Functional Geekery</a>
<br /><br />
<b>Podcast episode</b><br />
<a href="http://runetologia.podfm.ru/606/">Рунетология (257): Партия еды</a>
<br /><br />
<b>Long documentary video</b><br />
<a href="http://www.imdb.com/title/tt4126304/">Cartel Land</a>
<br /><br />
<b>Short documentary video</b><br />
<a href="https://www.youtube.com/watch?t=98&v=7Z8EtlBe8Ts">A high speed camera can capture light in motion</a>
<br /><br />
<b>The future is here</b><br />
<a href="http://www.bbc.co.uk/news/uk-england-london-32495924">DNA-testing dog …</a>
<br /><br />
<b>Music</b><br />
<a href="https://en.wikipedia.org/wiki/The_Great_Gatsby:_Music_from_Baz_Luhrmann%27s_Film">The Great Gatsby (2013) - Soundtracks</a>
<br /><br />
<b>Museum</b><br />
<a href="http://www.rafmuseum.org.uk/london/">Royal Air Force Museum London</a>
<br /><br />
<b>Quality of life</b><br />
Getting your child to go to bed at 8:30 pm
<br /><br />
<b>Milestone</b><br />
<a href="http://uk-rainian.livejournal.com/4009.html">Relocation to the United Kingdom</a>
<br /><br />
<i>Undoubtedly, the main change in my life is that my family and I live in England now. We were pleasantly surprised to find that the British people are so wise and kind. Traveling in space has become a journey in time for us. I am immensely grateful to those who made it possible.</i>
<br />
Pavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.com0tag:blogger.com,1999:blog-8842533688295012556.post-23768096068521106222015-01-11T01:54:00.001-08:002016-01-03T04:40:09.673-08:00The best 2014<b><span style="font-size: large;">IT book</span></b><br />
<a href="http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools">Compilers: Principles, Techniques, and Tools</a> by Alfred V. Aho, Monica S. Lam, Ravi Sethi, and Jeffrey D. Ullman<br />
<i>Finally I found a book that I can recommend to every software engineer. The book is just gorgeous.</i>
<br /><br />
<span style="font-size: large;"><b>IT teaser</b></span><br />
<a href="http://lighttable.com/2014/03/27/toward-a-better-programming/">Spreadsheet-oriented programming</a><br />
Nominees: <a href="http://wiki.xenproject.org/wiki/Cloud_Operating_Systems">Cloud Operating Systems</a>,
<a href="http://www.moserware.com/2008/04/towards-moores-law-software-part-3-of-3.html">Viewpoints project</a>
<br /><br />
<span style="font-size: large;"><b>Scientific paper</b></span><br />
<a href="http://db.cs.berkeley.edu/papers/eurosys10-boom.pdf">BOOM Analytics: Exploring Data-Centric, Declarative Programming for the Cloud</a>
<br /><br />
<span style="font-size: large;"><b>Piece of code</b></span><br />
<pre class="ruby" name="code">list([ ]).
list([X|Xs]) ← list(Xs).
</pre>
<i>Yes, it’s Prolog :)</i>
<br /><br />
<span style="font-size: large;"><b>Podcast</b></span><br />
<a href="http://www.haskellcast.com/">The Haskell Cast</a>
<br /><br />
<span style="font-size: large;"><b>Conference videos</b></span><br />
<a href="http://www.youtube.com/channel/UC_QIfHvN9auy2CoOdSfMWDw">Strange Loop</a>
<br /><br />
<span style="font-size: large;"><b>My talk</b></span><br />
<a href="http://www.slideshare.net/MitinPavel/page-object">PageObject</a> for Coffee’n’Code Dnepr
<br /><br />
<span style="font-size: large;"><b>Media</b></span><br />
<a href="http://getprismatic.com/">Prismatic</a>
<br /><br />
<span style="font-size: large;"><b>Service</b></span><br />
<a href="https://www.goopti.com/">GoOpti</a><br />
Nominees: <a href="http://2gis.ua/">2ГИС</a>
<br /><br />
<span style="font-size: large;"><b>SF book</b></span><br />
<a href="http://en.wikipedia.org/wiki/The_Quantum_Thief">The Quantum Thief</a> by Hannu Rajaniemi<br />
<i>I'm still reading the book. But so far it is good enough to be in the list</i>
<br /><br />
<span style="font-size: large;"><b>Another look</b></span><br />
<a href="http://en.wikipedia.org/wiki/Nineteen_Eighty-Four">Nineteen Eighty-Four</a>
<br /><br />
<span style="font-size: large;"><b>City</b></span><br />
<a href="https://goo.gl/photos/5tjyT6ebexaQwe7d6">Ljubljana</a><br />
Nominees: <a href="https://www.google.com.ua/search?q=Dnipropetrovsk&espv=2&biw=1855&bih=923&source=lnms&tbm=isch&sa=X&ei=GTCyVMPoC8rlUpGvgpgJ&ved=0CAYQ_AUoAQ#tbm=isch&q=dnipropetrovsk+city&revid=495483564">Dnipropetrovsk</a>
<br /><br />
<span style="font-size: large;"><b>Event</b></span><br />
Our great <a href="https://goo.gl/photos/v3qRdKYdYFtqmcAu8">Italian wedding</a><br />
<br /><br />Pavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.com0tag:blogger.com,1999:blog-8842533688295012556.post-49369534576628310492014-01-16T09:30:00.005-08:002022-07-05T12:27:20.794-07:00Tracking my reading<ol>
<li><a href="https://www.oreilly.com/library/view/fundamentals-of-software/9781492043447/">Fundamentals of Software Architecture</a> by Mark Richards and Neal Ford</li>
<li><a href="https://book.purescript.org/index.html">PureScript by Example</a> by Phil Freeman</li><li><a href="https://www.oreilly.com/library/view/designing-data-intensive-applications/9781491903063/">Designing Data-Intensive Applications</a> by Martin Kleppmann</li><li><a href="https://www.amazon.co.uk/Philosophy-Software-Design-John-Ousterhout/dp/1732102201">A Philosophy of Software Design</a> by John Ousterhout</li><li><a href="https://github.com/hmemcpy/milewski-ctfp-pdf/" target="_blank">Category Theory for Programmers</a> by Bartosz Milewski <i><span style="color: #cccccc;">(I was lost in the last third)</span></i></li>
<li><a href="https://www.amazon.co.uk/Hooked-How-Build-Habit-Forming-Products/dp/0241184835">Hooked: How to Build Habit-Forming Products</a> by Nir Eyal</li>
<li><a href="https://underscore.io/books/scala-with-cats/">Scala with Cats</a> by Noel Welsh and Dave Gurnell</li>
<li><a href="https://www.amazon.co.uk/Object-Oriented-Software-Engineering-Approach/dp/0201544350">Object Oriented Software Engineering: A Use Case Driven Approach</a> by Ivar Jacobson</li>
<li><a href="https://leanpub.com/growing-rails">Growing Rails Applications in Practice</a> by Henning Koch and Thomas Eisenbarth</li>
<li><a href="https://www.amazon.co.uk/Clean-Architecture-Craftsmans-Software-Structure/dp/0134494164">Clean Architecture: A Craftsman's Guide to Software Structure and Design</a> by Robert C. Martin</li>
<li><a href="https://www.sandimetz.com/99bottles/">99 Bottles of OOP</a> by Sandi Metz and Katrina Owen</li>
<li><a href="https://www.nostarch.com/howlinuxworks2" target="_new">How Linux Works</a> by Brian Ward (2nd Edition)</li>
<li><a href="https://doc.rust-lang.org/book/" target="_new">The Rust Programming Language</a></li>
<li><a href="https://littleosbook.github.io/" target="_new">The little book about OS development</a> by Erik Helin and Adam Renberg</li>
<li><a href="http://chimera.labs.oreilly.com/books/1230000000545" target="_new">High Performance Browser Networking</a> by Ilya Grigorik</li>
<li><a href="http://www.amazon.com/Compilers-Principles-Techniques-Tools-Edition/dp/0321486811/ref=sr_1_2?ie=UTF8&qid=1406264607&sr=8-2&keywords=Compilers%3A+Principles%2C+Techniques+and+Tools" target="_new">Compilers: Principles, Techniques, and Tools (2nd Edition)</a> by Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman</li>
<li><a href="http://shop.oreilly.com/product/0636920028505.do" target="_new">Elasticsearch: The Definitive Guide</a> (early release) by Clinton Gormley and Zachary Tong</li>
<li><a href="http://www.poodr.com/" target="_new">Practical Object-Oriented Design in Ruby</a> by Sandi Metz</li>
<li><a href="http://www.amazon.com/Programming-Go-Creating-Applications-Developers/dp/0321774639" target="_new">Programming in Go: Creating Applications for the 21st Century</a> by Mark Summerfield</li>
<li><a href="http://learnyouahaskell.com/" target="_new">Learn You a Haskell for Great Good!</a> by Miran Lipovača</li>
<li><a href="http://www.amazon.com/Hadoop-Definitive-Guide-Tom-White/dp/1449311520" target="_new">Hadoop: The Definitive Guide</a> by Tom White</li>
<li>[POSTPONED] <a href="http://www.manning.com/bjarnason/" target="_new">Functional Programming in Scala</a> by Paul Chiusano and Rúnar Bjarnason</li>
<li><a href="http://www.ozon.ru/context/detail/id/3159814/" target="_new">Совершенный код</a> Стив Макконнелл <a href="http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670" target="_new">[en]</a></li>
<li><a href="http://exceptionalruby.com/" target="_new">Exceptional Ruby</a> by Avdi Grimm</li>
<li><a href="http://www.amazon.com/Programming-Scala-Comprehensive-Step-Step/dp/0981531644" target="_new">Programming in Scala: A Comprehensive Step-by-Step Guide</a> by Martin Odersky</li>
<li><a href="http://www.ozon.ru/context/detail/id/17562725/" target="_new">Пользовательские истории. Гибкая разработка программного обеспечения</a> Майк Кон <a href="http://www.amazon.com/User-Stories-Applied-Software-Development/dp/0321205685" target="_new">[en]</a></li>
<li><a href="http://restinpractice.com/book/" target="_new">REST in Practice: Hypermedia and Systems Architecture</a> by Jim Webber</li>
<li><a href="http://www.manning.com/fogus/" target="_new">The Joy of Clojure</a> by Michael Fogus and Chris Houser</li>
<li><a href="http://shop.oreilly.com/product/0636920020530.do" target="_new">Building Hypermedia APIs with HTML5 and Node</a> by Mike Amundsen</li>
<li><a href="http://www.ozon.ru/context/detail/id/1431767/" target="_new">Распределенные системы. Принципы и парадигмы</a> Таненбаум, Эндрю <a href="http://www.amazon.com/Distributed-Systems-Principles-Andrew-Tanenbaum/dp/0130888931" target="_new">[en]</a></li>
<li><a href="http://www.amazon.com/ERLANG-Programming-Francesco-Cesarini/dp/0596518188/ref=pd_sim_b_1" target="_new">ERLANG Programming</a> by Francesco Cesarini and Simon Thompson</li>
<li><a href="http://www.amazon.com/Erlang-OTP-Action-Martin-Logan/dp/1933988789/ref=pd_sim_b_2" target="_new">Erlang and OTP in Action</a> by Martin Logan, Eric Merritt and Richard Carlsson</li>
<li><a href="http://www.akkadia.org/drepper/cpumemory.pdf" target="_new">What Every Programmer Should Know About Memory</a> by Ulrich Drepper</li>
<li>[POSTPONED] <a href="http://www.amazon.com/Linux-Kernel-Development-Robert-Love/dp/0672329468" target="_new">Linux Kernel Development</a> by Robert Love</li>
<li><a href="http://lib.ru/BACH/" target="_new">Архитектура операционной системы Unix</a> Морис Дж. Бах <a href="http://www.amazon.com/Design-Operating-System-Prentice-Hall-Software/dp/0132017997" target="_new">[en]</a></li>
<li><a href="http://rhg.rubyforge.org/" target="_new">Ruby Hacking Guide</a></li>
<li><a href="http://objectsonrails.com/" target="_new">Objects on Rails</a> by Avdi Grimm</li>
<li><a href="http://www.ozon.ru/context/detail/id/5209853/" target="_new">97 этюдов для архитекторов программных систем</a> Нил Форд, Майкл Найгард, Билл де Ора <a href="http://www.amazon.com/Things-Every-Software-Architect-Should/dp/059652269X" target="_new">[en]</a></li>
<li><a href="http://ru.wikipedia.org/wiki/%D0%AF%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%A1%D0%B8_%28%D0%BA%D0%BD%D0%B8%D0%B3%D0%B0%29" target="_new">Язык программирования Си</a> Брайан Керниган, Деннис Ритчи <a href="http://en.wikipedia.org/wiki/The_C_Programming_Language" target="_new">[en]</a></li>
<li><a href="http://www.symbol.ru/alphabet/734220.html" target="_new">MySQL. Оптимизация производительности, 2-е издание</a> Заводны Д., Шварц Б., Зайцев П., Ткаченко В., Ленц А. <a href="http://www.amazon.com/High-Performance-MySQL-Optimization-Replication/dp/0596101716" target="_new">[en]</a></li>
<li><a href="http://www.williamspublishing.com/Books/978-5-8459-1738-6.html" target="_new">Предметно-ориентированные языки программирования</a> Мартин Фаулер <a href="http://www.amazon.com/Domain-Specific-Languages-Addison-Wesley-Signature-Fowler/dp/0321712943" target="_new">[en]</a></li>
<li><a href="http://www.ozon.ru/context/detail/id/986013/" target="_new">Программирование для Linux. Профессиональный подход</a> Митчелл Марк, Оулдем Джеффри, Самьюэл Алекс <a href="http://www.advancedlinuxprogramming.com/alp-folder" target="_new">[en]</a></li>
<li><a href="http://www.amazon.com/dp/1449381561?tag=wwwmongodborg-20&camp=14573&creative=327641&linkCode=as1&creativeASIN=1449381561&adid=0P5X48HY54TVQK51VYFZ&" target="_new">MongoDB: The Definitive Guide</a> by Kristina Chodorow and Michael Dirolf</li>
<li><a href="http://www.ozon.ru/context/detail/id/2164299/" target="_new">Психбольница в руках пациентов</a> Алан Купер <a href="http://www.amazon.com/Inmates-Are-Running-Asylum/dp/0672316498" target="_new">[en]</a></li>
<li><a href="http://www.manning.com/etzion/" target="_new">Event Processing in Action</a> by Opher Etzion and Peter Niblett</li>
<li><a href="http://ru.wikipedia.org/wiki/%D0%9C%D0%B8%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D1%87%D0%B5%D0%BB%D0%BE%D0%B2%D0%B5%D0%BA%D0%BE-%D0%BC%D0%B5%D1%81%D1%8F%D1%86" target="_new">Мифический человеко-месяц</a> Фредерик Брукс <a href="http://en.wikipedia.org/wiki/The_Mythical_Man-Month" target="_new">[en]</a></li>
<li><a href="http://professionalxmpp.com/" target="_new">Professional XMPP Programming with JavaScript and jQuery</a> by Jack Moffitt</li>
<li><a href="http://www.ozon.ru/context/detail/id/1099618/" target="_new">Экстремальное программирование</a> Кент Бек</li>
<li><a href="https://www.packtpub.com/nginx-http-server-for-web-applications/book" target="_new">Nginx HTTP Server</a> by Clément Nedelcu</li>
<li><a href="http://mann-ivanov-ferber.ru/books/paperbook/Rework/" target="_new">Rework Бизнес без предрассудков</a> Джейсон Фрайд и Дэвид Хайнемайер Хенссон <a href="http://www.amazon.com/Rework-Jason-Fried/dp/0307463745" target="_new">[en]</a></li>
<li><a href="http://www.ozon.ru/context/detail/id/1287732/" target="_new">Анализ алгоритмов. Вводный курс</a> Дж. Макконелл <a href="http://books.google.com/books?id=y-tRnU0trOUC" target="_new">[en]</a></li>
<li><a href="http://www.ozon.ru/context/detail/id/1501671/" target="_new">Экстремальное программирование: разработка через тестирование</a> Кент Бек <a href="http://books.google.com.ua/books?id=gFgnde_vwMAC" target="_new">[en]</a></li>
<li><a href="http://www.williamspublishing.com/Books/978-5-8459-1296-1.html" target="_new">Применение DDD и шаблонов проектирования: проблемно-ориентированное проектирование приложений с примерами на C# и .NET</a> Джимми Нильссон <a href="http://www.amazon.com/Applying-Domain-Driven-Design-Patterns-Examples/dp/0321268202" target="_new">[en]</a></li>
<li><a href="http://pragprog.com/titles/bksqla/sql-antipatterns" target="_new">SQL Antipatterns: Avoiding the Pitfalls of Database Programming</a> by Bill Karwin</li>
<li><a href="http://www.ozon.ru/context/detail/id/5011068/" target="_new">Чистый код. Создание, анализ и рефакторинг</a> Роберт Мартин <a href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882" target="_new">[en]</a></li>
<li><a href="http://www.amazon.com/Programming-Scala-Multi-Core-Complexity-Programmers/dp/193435631X/ref=pd_bxgy_b_img_c" target="_new">Programming Scala: Tackle Multi-Core Complexity on the Java Virtual Machine</a> by Venkat Subramaniam</li>
<li><a href="http://www.amazon.com/Beginning-Scala-David-Pollak/dp/1430219890" target="_new">Beginning Scala</a> by David Pollak</li>
<li><a href="http://www.amazon.com/Growing-Object-Oriented-Software-Guided-Tests/dp/0321503627" target="_new">Growing Object-Oriented Software, Guided by Tests</a> by Steve Freeman and Nat Pryce</li>
<li><a href="http://www.ozon.ru/context/detail/id/2309312/" target="_new">Введение в системы баз данных</a> К. Дж. Дейт <a href="http://www.amazon.com/Introduction-Database-Systems-8th/dp/0321197844" target="_new">[en]</a></li>
<li><a href="http://www.amazon.com/Analysis-Patterns-Reusable-Object-Models/dp/0201895420" target="_new">Analysis Patterns: Reusable Object Models</a> by Martin Fowler</li>
<li><a href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215/ref=sr_1_3?ie=UTF8&s=books&qid=1256489774&sr=1-3" target="_new">Domain-Driven Design: Tackling Complexity in the Heart of Software</a> by Eric Evans</li>
<li><a href="http://shop.oreilly.com/product/9780596523015.do" target="_new">Ruby Best Practices</a> by Gregory Brown</li>
<li><a href="http://www.ozon.ru/context/detail/id/4311012" target="_new">Эффективная работа с унаследованным кодом</a> Майкл К. Физерс <a href="http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052" target="_new">[en]</a></li>
<li><a href="http://www.amazon.com/Structure-Interpretation-Computer-Programs-Engineering/dp/0262011530/ref=sr_1_1?ie=UTF8&s=books&qid=1256489343&sr=1-1" target="_new">Structure and Interpretation of Computer Programs</a> by Harold Abelson</li>
</ol>
Pavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.com0tag:blogger.com,1999:blog-8842533688295012556.post-8599120500056451422014-01-07T22:37:00.000-08:002016-01-03T04:43:37.923-08:00The best 2013<h3>
Infrastructure tool</h3>
Vagrant <a href="http://www.vagrantup.com/">http://www.vagrantup.com/</a><br />
Nominees: Guard <a href="https://github.com/guard/guard">https://github.com/guard/guard</a><br />
<h3>
Management tool</h3>
GitHub pull request workflow <a href="https://help.github.com/articles/using-pull-requests">https://help.github.com/articles/using-pull-requests</a><br />
Nominees: Trello <a href="https://trello.com/">https://trello.com/</a><br />
<h3>
UX/UI tool</h3>
UserTesting <a href="http://www.usertesting.com/">http://www.usertesting.com/</a><br />
<h3>
A new language</h3>
The winner is not determined :/<br />
Nominees: Clojure <a href="http://clojure.org/">http://clojure.org/</a>, Go <a href="http://golang.org/">http://golang.org/</a><br />
<h3>
Another look</h3>
Haskell <a href="http://www.haskell.org/">http://www.haskell.org/</a><br />
<h3>
Distributed computing</h3>
Akka cluster <a href="http://doc.akka.io/docs/akka/snapshot/common/cluster.html">http://doc.akka.io/docs/akka/snapshot/common/cluster.html</a><br />
<h3>
Software architecture / Programming paradigm</h3>
Functional reactive programming <a href="http://en.wikipedia.org/wiki/Functional_reactive_programming">http://en.wikipedia.org/wiki/Functional_reactive_programming</a><br />
Nominees: The Lambda architecture <a href="http://manning.com/marz/">http://manning.com/marz/</a><br />
<h3>
Beautiful monster</h3>
Hadoop <a href="http://hadoop.apache.org/">http://hadoop.apache.org/</a><br />
Nominees: Scala <a href="http://www.scala-lang.org/">http://www.scala-lang.org/</a><br />
<h3>
Media</h3>
Russian-speaking community of LiveJournal <a href="http://www.livejournal.com/">http://www.livejournal.com/</a><br />
<h3>
The future is here</h3>
Сoursera <a href="https://www.coursera.org/">https://www.coursera.org/</a><br />
<h3>
Scientific paper</h3>
In Search of an Understandable Consensus Algorithm <a href="https://ramcloud.stanford.edu/wiki/download/attachments/11370504/raft.pdf">https://ramcloud.stanford.edu/wiki/download/attachments/11370504/raft.pdf</a><br />
<h3>
IT book</h3>
Learn You a Haskell for Great Good! by Miran Lipovača <a href="http://learnyouahaskell.com/">http://learnyouahaskell.com/</a><br />
<h3>
Popular science book</h3>
The Selfish Gene by Richard Dawkins <a href="http://en.wikipedia.org/wiki/The_Selfish_Gene">http://en.wikipedia.org/wiki/The_Selfish_Gene</a><br />
<h3>
SF book</h3>
Anathem by Neal Stephenson <a href="http://en.wikipedia.org/wiki/Anathem">http://en.wikipedia.org/wiki/Anathem</a><br />
Nominees: The Windup Girl by Paolo Bacigalupi <a href="http://en.wikipedia.org/wiki/The_Windup_Girl">http://en.wikipedia.org/wiki/The_Windup_Girl</a><br />
<h3>
Holiday</h3>
Christmas in Budapest <a href="https://goo.gl/photos/bcfHSmXguQecHp5DA">https://goo.gl/photos/bcfHSmXguQecHp5DA</a><br />
<h3>
Quality of life</h3>
35-hour workweekPavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.com0tag:blogger.com,1999:blog-8842533688295012556.post-47852990819457889052013-07-09T03:11:00.000-07:002013-07-09T03:11:12.518-07:00What I don't like about LISPThis post is not about parenthesis. It would be too easy.<br />
<br />
I really miss literals in Lisp. Ruby has tons of literals: numerics, strings, heredocs, symbols, regular expressions, arrays, hashes, ranges, classes, eigenclasses, modules... Special syntax for everything :) Everything has their own unique appearance. And such diversity allows to grasp landscape nearly instantly. It's expressive.<br />
<br />
In contrast, Lisp is poor in that respect. Lisp code is a garden overgrown with trees. Identical trees. With numbers, strings and symbols hanging on them. Compared to that, ruby code is full of variety: wagons, houses, kennels, containers and plastic bags.<br />
<br />
Don't get me wrong. I am not against s-expressions. I am against the fact, what s-expressions consist of a limited set of literals. And even if you write a custom internal DSL, you just cut and fertilize your monotone trees.<br />
<br />
By the way, Clojure knows about the problem.Pavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.com6tag:blogger.com,1999:blog-8842533688295012556.post-55026490699023768832013-01-14T23:40:00.001-08:002013-01-15T03:40:07.044-08:00Hypermedia API is about DRYThe hype around Hypermedia API (HATEOAS) just got too much recently. Opponents and advocates cross swords. But <a href="http://37signals.com/svn/posts/3373-getting-hyper-about-hypermedia-apis">critics</a> overlook one main point: Hypermedia API allows you to not <a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself">repeat</a> <a href="http://en.wikipedia.org/wiki/Separation_of_concerns">youself</a>.<br />
<br />
I could describe the topic in terms of "Hypermedia as the Engine of Application State". The "State Engine" directly relates to the issue. But I prefer to use more familiar dictionary.<br />
<br />
Consider yet another project tracker. There is a domain rule: <i>only Project Owner is able to delete a user story AND only stories in "initial" state can be deleted.</i> With the "traditional" REST approach the rule gets duplicated several times: on the server side and for each client app. Without such duplication a client cannot reason about visibility of the "delete story" control. Even worse, the rule is implemented in several languages, increasing the likelihood of errors.
<br />
<pre class="ruby" name="code"># Server side
def deletable_by?(user)
user.owner? @project && initial?
end
</pre>
<pre class="javascript" name="code">// Android client
private boolean isDeletableBy(User user, Story story) {
return user.isOwner(story.getProject()) && story.isInitial();
}
...
if (isDeletableByUser(user, story)) {
renderDeleteWidgetFor(story);
} else ...
</pre>
<pre class="javascript" name="code">// JavaScript client
function isDeletableBy (user, story) {
return user.isOwner(story.project) && story.isInInitialState()
}
...
<% if (isDeletableBy(user, story) { %>
<%= renderDeleteWidgetFor(story) %>
<% } %>
</pre>
With HATEOAS the rule is implemented once and only once. It doesn't spread domain logic across clients. They become fairly "silly".<br />
<pre class="ruby" name="code"># JSON generation on the server side
if story.deletable_by? current_user
json_builder.delete_link_for story
end
</pre>
<pre class="javascript" name="code">// Android client
if (story.hasDeleteLink()) {
renderDeleteWidgetFor(story);
} else ...</pre>
<pre class="javascript" name="code">// Javascript client
<% if (story.hasLink('delete') { %>
<%= renderDeleteWidgetFor(story) %>
<% } %></pre>
See, clients don't "figure out" or "calculate" button visibility. They render the button only if the "delete" link is present. That's all. It simplifies the iterative development process: changes in domain logic require only server code to be rewritten.<br />
<pre class="ruby" name="code"># Changed rule
def deletable_by?(user)
user.owner? @project
end</pre>
JavaScript, Android, iOS clients remain untouched. They still rely on absence/presence of the "delete" link. The "traditional" REST approach requires to rewrite/recompile/redestribute ALL client applications!<br />
<br />
Summing up: <b>Hypermedia API keeps domain logic on the server side. It reduces cost and encourages improvements.</b><br />
<br />Pavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.com2tag:blogger.com,1999:blog-8842533688295012556.post-80363684393808808522013-01-10T23:22:00.000-08:002013-01-10T23:23:55.831-08:00LISP is a 3d printer<div class="separator" style="clear: both; text-align: center;">
</div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbpCCy2MsXh2zlxmBfmZg3Y8K_2_7OdIrqq24bFx-a_QlbtQWajyI_xvtEXGoJU2_4Z9jQxQaybSrWW9mnpRvek1pSxxa5vUhmTNalsjmc7DFZo4szbzh-yw-VhEij3A6O4yN9botMTnQ/s1600/lisp_is_a_3d_printer.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="85" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbpCCy2MsXh2zlxmBfmZg3Y8K_2_7OdIrqq24bFx-a_QlbtQWajyI_xvtEXGoJU2_4Z9jQxQaybSrWW9mnpRvek1pSxxa5vUhmTNalsjmc7DFZo4szbzh-yw-VhEij3A6O4yN9botMTnQ/s200/lisp_is_a_3d_printer.jpg" width="200" /></a><br />
<br />
<span style="color: #222222; font-family: arial, sans-serif; font-size: x-small;"><span style="line-height: 16px;"><br /></span></span><span style="background-color: white; font-family: verdana; font-size: x-small;"><br /></span><br />
<span style="background-color: white; font-family: verdana; font-size: x-small;"><br /></span>
<span style="background-color: white; font-family: verdana; font-size: x-small;"><br /></span>
<span style="background-color: white; font-family: verdana; font-size: x-small;">Userd images:</span><br />
<a href="http://www.makerbot.com/blog/2012/03/14/makerbot-makes-a-pit-stop-at-a-baltimore-high-school/">http://www.makerbot.com/blog/2012/03/14/makerbot-makes-a-pit-stop-at-a-baltimore-high-school/</a><br />
<a href="http://www.intaiwan.de/2012/12/02/giant-bike-factory/">http://www.intaiwan.de/2012/12/02/giant-bike-factory/</a><br />
<a href="http://en.wikipedia.org/wiki/Hacker_Dojo">http://en.wikipedia.org/wiki/Hacker_Dojo</a><br />
<a href="http://www.colourbox.com/image/bicycle-tools-and-spares-image-3877175">http://www.colourbox.com/image/bicycle-tools-and-spares-image-3877175</a><br />
<a href="http://www.ubergizmo.com/2012/01/cube-3d-printer-will-not-break-the-bank/">http://www.ubergizmo.com/2012/01/cube-3d-printer-will-not-break-the-bank/</a><br />
<br />
<br />
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
Pavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.com0tag:blogger.com,1999:blog-8842533688295012556.post-26122982420618343302013-01-03T23:45:00.000-08:002013-01-05T09:51:03.777-08:00The best 2012<h4>
IT event</h4>
<a href="http://dou.ua/lenta/events/dou-hakaton-harkov-kak-eto-bylo/">Hackathon</a><br />
<h4>
Book</h4>
<div>
<a href="http://www.amazon.com/Linux-Kernel-Development-Robert-Love/dp/0672329468">Linux Kernel Development by Robert Love</a></div>
<div>
<h4>
Vintage book</h4>
</div>
<a href="http://lib.ru/BACH/">Морис Дж. Бах. Архитектура операционной системы Unix</a><br />
<h4>
Article</h4>
<a href="http://www.infoq.com/articles/cap-twelve-years-later-how-the-rules-have-changed">CAP Twelve Years Later: How the "Rules" Have Changed</a><br />
<h4>
Vintage article</h4>
<a href="http://www.laputan.org/mud/">Big Ball of Mud</a><br />
<h4>
Podcast</h4>
<a href="http://runetologia.podfm.ru/">Рунетология</a><br />
<h4>
Podcast episode</h4>
<a href="http://rubyrogues.com/056-rr-david-heinemeier-hansson/">David Heinemeier Hansson on Ruby Rogues</a><br />
<h4>
Teaser</h4>
<a href="https://www.coursera.org/">Coursera</a><br />
<h4>
Announcement</h4>
<a href="https://plus.google.com/+projectglass/about">Project Glass</a><br />
<h4>
Gadget</h4>
<a href="http://www.samsung.com/global/microsite/galaxytab2/7.0/index.html?type=find">Samsung Galaxy Tab 2 (7-Inch)</a><br />
<h4>
Tool</h4>
<a href="http://coffeescript.org/">CoffeeScript</a><br />
<h4>
Visionary</h4>
<a href="http://meteor.com/">Meteor</a><br />
<h4>
Ambiguity</h4>
<a href="http://backbonejs.org/">Backbone</a><br />
<h4>
Music</h4>
<a href="http://www.youtube.com/watch?v=JRWox-i6aAk">Lana Del Rey</a><br />
<h4>
Super bonus</h4>
<div>
Anadea's internal projects</div>
<h4>
BEST EVER</h4>
<a href="http://ru.wikipedia.org/wiki/%D0%A1%D1%87%D0%B0%D1%81%D1%82%D1%8C%D0%B5">Дочка</a><br />
<br />Pavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.com0tag:blogger.com,1999:blog-8842533688295012556.post-70773659748659339182012-12-12T11:56:00.000-08:002012-12-12T11:56:51.260-08:00Революционная верстка<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMsCpOcLpDB6QtEBkfEtYyqGedlEvxuUe0YtQsKuSOSo3FKgbIh5-xO52H0E2dqYu2CJDk_lRY6WoMtB4bAMnDelX35-qNs7ZyiYLOrd3NGHWlZ8A0C9HqecQzGuOcFbj93QNY_bC89EU/s1600/538f19801da011e291d612313804d44b_7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMsCpOcLpDB6QtEBkfEtYyqGedlEvxuUe0YtQsKuSOSo3FKgbIh5-xO52H0E2dqYu2CJDk_lRY6WoMtB4bAMnDelX35-qNs7ZyiYLOrd3NGHWlZ8A0C9HqecQzGuOcFbj93QNY_bC89EU/s1600/538f19801da011e291d612313804d44b_7.jpg" height="320" width="320" /></a></div>
<br />Pavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.com2tag:blogger.com,1999:blog-8842533688295012556.post-5342421922777466382012-12-12T11:47:00.000-08:002012-12-12T11:47:04.157-08:00My recent talks<iframe allowfullscreen="allowfullscreen" frameborder="0" height="356" marginheight="0" marginwidth="0" mozallowfullscreen="mozallowfullscreen" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/15298768" style="border-width: 1px 1px 0; border: 1px solid #CCC; margin-bottom: 5px;" webkitallowfullscreen="webkitallowfullscreen" width="427"> </iframe> <div style="margin-bottom: 5px;">
<strong> <a href="http://www.slideshare.net/MitinPavel/backbonejs-15298768" target="_blank" title="Backbone.js Профилактика сколиоза ">Backbone.js Профилактика сколиоза </a> </strong> from <strong><a href="http://www.slideshare.net/MitinPavel" target="_blank">MitinPavel</a></strong> </div>
<br />
<br />
<iframe allowfullscreen="allowfullscreen" frameborder="0" height="356" marginheight="0" marginwidth="0" mozallowfullscreen="mozallowfullscreen" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/15231125" style="border-width: 1px 1px 0; border: 1px solid #CCC; margin-bottom: 5px;" webkitallowfullscreen="webkitallowfullscreen" width="427"> </iframe> <div style="margin-bottom: 5px;">
<strong> <a href="http://www.slideshare.net/MitinPavel/cqrs-es-15231125" target="_blank" title="Command Query Responsibility Segregation and Event Sourcing">Command Query Responsibility Segregation and Event Sourcing</a> </strong> from <strong><a href="http://www.slideshare.net/MitinPavel" target="_blank">MitinPavel</a></strong> </div>
<br />
<br />
<iframe allowfullscreen="allowfullscreen" frameborder="0" height="356" marginheight="0" marginwidth="0" mozallowfullscreen="mozallowfullscreen" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/15413216" style="border-width: 1px 1px 0; border: 1px solid #CCC; margin-bottom: 5px;" webkitallowfullscreen="webkitallowfullscreen" width="427"> </iframe> <div style="margin-bottom: 5px;">
<strong> <a href="http://www.slideshare.net/MitinPavel/hypermedia-api-hateoas" target="_blank" title="Hypermedia api (HATEOAS)">Hypermedia api (HATEOAS)</a> </strong> from <strong><a href="http://www.slideshare.net/MitinPavel" target="_blank">MitinPavel</a></strong> </div>
Pavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.com1tag:blogger.com,1999:blog-8842533688295012556.post-83381177782321121592011-12-29T13:15:00.000-08:002011-12-29T23:00:39.199-08:00The best 2011<b>Book</b><br />
<a href="http://www.amazon.com/High-Performance-MySQL-Optimization-Replication/dp/0596101716">High Performance MySQL: Optimization, Backups, Replication, and More</a> by Baron Schwartz and others<br />
Nominees: <a href="http://www.amazon.com/Domain-Specific-Languages-Addison-Wesley-Signature-Fowler/dp/0321712943/ref=sr_1_2?s=books&ie=UTF8&qid=1325190968&sr=1-2">Domain-Specific Languages</a> by Martin Fowler<br />
<br />
<b>Development tool</b><br />
<a href="http://beginrescueend.com/">Ruby Version Manager (RVM) </a><br />
Nominees: <a href="http://www.zeromq.org/">ZeroMQ</a>, <a href="http://cukes.info/">Cucumber</a>, <a href="http://lucene.apache.org/solr/">Solr</a><br />
<br />
<b>Management tool</b><br />
Google+ Hangout<br />
Nominees: <a href="http://www.pivotaltracker.com/">Pivotal Tracker</a><br />
<br />
<b>Hardware</b><br />
<a href="http://en.wikipedia.org/wiki/Solid-state_drive">Solid-state drive (SSD)</a><br />
<br />
<b><span class="short_text" id="result_box" lang="en"><span class="hps">Teaser</span></span></b><br />
<span class="short_text" id="result_box" lang="en"><span class="hps"><a href="http://codebetter.com/gregyoung/2010/02/20/why-use-event-sourcing/">Event Sourcing (CQRS/ES)</a></span></span><br />
<span class="short_text" id="result_box" lang="en"><span class="hps">Nominees: <a href="http://en.wikipedia.org/wiki/Data,_context_and_interaction">Data, context and interaction (DCI)</a></span></span><br />
<span class="short_text" id="result_box" lang="en"><span class="hps"> </span></span><b> </b><br />
<b>Surprise</b><br />
<a href="http://martinfowler.com/articles/lmax.html">LMAX</a><br />
Nominees: <a href="http://coffeescript.org/">CoffeeScript</a><br />
<br />
<b>Media</b><br />
<a href="http://rubyrogues.com/">Ruby Rogues podcast</a> <br />
Nominees: <a href="http://skillsmatter.com/">Skills Matter</a><br />
<br />
<b>Person</b><br />
<a href="http://karmajunkie.com/">Keith Gaddis</a>Pavel Mitinhttp://www.blogger.com/profile/03323256413368409095noreply@blogger.com0