2022-03-12T10:46:57+00:00http://maxprokopiev.com"Boring" things2017-02-06T00:00:00+00:00http://maxprokopiev.com/posts/boring-things<p>One of the most useful skills for people working in tech industry is the ability to avoid hypes and focus on stuff that matters instead.
But the problem is that the things that matter, that improve your productivity and processes are considered “boring”.</p>
<p>Do you want to start using React or finally set up a proper error reporting solution for your frontend app?</p>
<p>Yes, I know the answer.</p>
<h2 id="security">Security</h2>
<p>Should you care about NSA breaking into your infrastructure if you’re running a food delivery company or a knitting website? Probably not.
I know it’s fun to spend nights coding your home-grown pentest solution or reverse engineering a binary to find a bug and write a 0-day exploit.
But that’s not what you should focus on. <em>Focus on boring stuff</em>.</p>
<p>Make sure that everyone’s laptop is properly encrypted.
Teach people how to use a password manager and burn all those pieces of paper around the office with “monkey32” written on them.
Monitor any phishing activity around your website, explain to your customers that you don’t ask them for their credit card data or send them executables with “new updates”.</p>
<h2 id="deployments">Deployments</h2>
<p>This one is usually an opposite of boring. For some teams deployment is crazy fun,
for some it’s so scary and complicated that they do that once a month and for some teams it doesn’t exist, because there is a special team that only does deploys.</p>
<p>You know how would my favorite deployment interface look like? One green button with “Deploy” written on it.</p>
<p><em>Deployments should be boring.</em></p>
<p>You shouldn’t care whether you need to push your branch to the remote server or run <code class="language-plaintext highlighter-rouge">npm install</code> before running a deployment script.
You shouldn’t care about tons of switches in that script either. Just hit that button.</p>
<p>Immutable Kubernetes cluster with a fleet of microservices deployed with your custom polished Go script sounds awesome.
But chances are you’ll probably be fine on OpsWorks with the classic “load balancer - app - db” solution (at least until you’re mature enough to explore other solutions).</p>
<h2 id="coding-style">Coding style</h2>
<p>Boy oh boy… How many times have you been involved in these hour-long “tabs VS spaces”-like discussions?
Aren’t you fed up with them already? Put a linter in place, agree once on all the rules and styles, be consistent with using them.</p>
<p><em>Let machines fight.</em></p>
<h2 id="keeping-stuff-up-to-date">Keeping stuff up-to-date</h2>
<p>You’re probably good at keeping an eye on the new versions of your favorite framework or programming language.</p>
<p>But remember that library you found on github a year ago and linked to your project because of the pending issue or PR?
Have you ever checked on the status of that PR?</p>
<p>What about that authentication library you’re using?
Didn’t someone just tweet about a new security patch for it? No, you missed it, because <em>cat gifs are much more fun</em>.</p>
<h2 id="collaboration">Collaboration</h2>
<p>AKA “speaking with other people in your team”.</p>
<p>I know it feels good when you just picked up a new feature from your tracker and immediately rushed into coding.
You have all those great ideas on how to build stuff and your fingers are flying over the keyboard. Slow down a bit.
Get up from your desk and walk 5 steps to the left where your colleagues sit.
Ask them for 10 minutes of their time and explain your solution over a cup of tea in the kitchen.</p>
<p>I knoooow that’s for old people, we are living on the edge - in a dark room with the closed door from where you can only hear some clicky sounds.
But just try that and you’ll never see these giant pull requests full of drama which you have after every iteration.</p>
<h2 id="learn-to-enjoy-boring">Learn to enjoy boring</h2>
<p>Next time you think about what to do next, make a list of “boring” chores that you’ve been avoiding for a long time.</p>
<p>Then start with the first item from that list.</p>
<p>It’ll pay off, I promise.</p>
<p>I love boring.</p>
Juggling and Zen2014-04-29T00:00:00+00:00http://maxprokopiev.com/posts/juggling-and-zen<p>The draft of this post was sitting in my mind since I’ve started periodically
throwing things in the air and trying to catch them all.</p>
<p>Juggling. People tend to think about juggling as a circus skill.
But it’s not like that anymore. Since 90-s juggling became a popular hobby
among people leading an active lifestyle. It’s saving me from spending my
whole day staring at infinite flow of coloured symbols in a terminal windows.</p>
<p>You remember this state when your mind is clear and your attention is focused
on a problem you’re working on right now. You are living in the current moment
and time seems to fall away. Some people call it “zone” or “flow”.</p>
<p>I love these moments. Everyone loves them. But it’s hard to get in there.
There is no magical spell that can get you “into the zone” (but I’m always will be praying for it).
I found that juggling helps me with this problem - in 5 minutes of juggling
I can feel myself relaxed, confident and ready to work on anything.
It transfers my mind to the place where everything seems to be clear and in the right order.</p>
<p>When I’m stuck with my tasks, everything is broken and world is falling apart
I just step back from the computer and juggle.</p>
<p>When I’m happy, the task is done and everything is ok I step back from the computer and juggle.</p>
<p>Always be juggling.</p>
The Setup2014-03-07T00:00:00+00:00http://maxprokopiev.com/posts/the-setup<p>I’m always curious about other people’s workflow. It’s just interesting what kind of tools they use to make things done.
And this is not about finding their secret sauce which keeps them productive or something, it’s more about exploring new things
and learning new ways to use your everyday tools.</p>
<p>That’s why I like to do pair programming from time to time. You just can seat near your team mate and see all these amazing things he does.</p>
<p>So here is my setup. I’ve structured it like they do it on <a href="http://usesthis.com/">usethis</a> website:</p>
<ul>
<li>What hardware do you use?</li>
<li>And what software?</li>
<li>Things you want to try <em>(this is my addition)</em></li>
<li>What would be your dream setup?</li>
</ul>
<h2 id="what-hardware-do-you-use">What hardware do you use?</h2>
<p>I use MacBook Pro 15”. Previously I had 13” MacBook and 17” Acer laptop before it.
I don’t use an external display for one reason: I want to have the same setup everywhere - at work, home, coffeeshop, etc.</p>
<h2 id="and-what-software">And what software?</h2>
<p>From the info above it’s obvious that I’m using Mac OS X.</p>
<p>I love one-desktop-one-application approach. It keeps me from distractions and allows to concentrate on one thing at a time.</p>
<p>Usually I have 5-6 desktops:</p>
<ul>
<li>First one usually has only Activity Monitor to quickly kill frozen process. Also I use it for temporary apps
like find something in the Downloads folder, upload a picture, mount a flash drive or quickly open mail app.</li>
<li>Next desktop is always for the Chrome web browser.</li>
<li>Then I have nerdy things like text editor and iTerm. I’m using Vim for several years, but this year I’ve started an expreriment trying different text editors.
First two months I was using Sublime Text 3 and it’s great. This month I’ve set up the Emacs.</li>
<li>Last two desktops are chats (Campfire, Hipchat, Skype) and <a href="https://culturedcode.com/things/">Things</a> app.</li>
</ul>
<h3 id="things">Things</h3>
<p>Things app is for getting things out of my head. Every new idea, task or important email going to an Inbox folder in this app.
Multiple times a day I’m processing Inbox and creating projects from it’s items.</p>
<p>This app helps me <strong>a lot</strong>.
Maybe I’ll write about my Things workflow in my next posts.</p>
<h3 id="iterm--friends">iTerm & friends</h3>
<p>I’m using <a href="http://tmux.sourceforge.net/">tmux</a> to manage my projects in console (running servers, background jobs, vim instances, ssh connections).
With the help of <a href="https://github.com/tmuxinator/tmuxinator">tmuxinator</a> I can define and save a layout of tmux windows and panes, running processes
in each window and start each project with one commmand. <a href="https://github.com/juggler/shellmagick/blob/master/tmux/tmux.conf">Here</a> I have my tmux config, you can borrow some stuff from it if you want.</p>
<h2 id="things-you-want-to-try">Things you want to try</h2>
<p>This section I’ve mostly written here for my future self to look back on.</p>
<ul>
<li>Emacs (already trying)</li>
<li>Standing desk</li>
<li>Ergo keyboard (like <a href="http://kinesis-ergo.com/shop/advantage-lf-for-pc-mac/">Kinesis Advantage</a> or <a href="http://ergodox.org/">ErgoDox</a> DIY keyboard)</li>
</ul>
<h2 id="what-would-be-your-dream-setup">What would be your dream setup?</h2>
<p>Computer that just works. You know, all things in IT are broken - computers are stupid, open source tools can ruin your workflow from time to time,
third-party services can leak your personal info to anyone. I want a machine/services which can recognize me through fingerprints or something like
that so I don’t need passwords. I want an infinite secure backup and storage solution for my documents and photos. I want…</p>
Automated Clojure deployment2013-10-02T00:00:00+00:00http://maxprokopiev.com/posts/automated-clojure-deployment<p>Today I’m releasing <a href="https://github.com/juggler/clojureweb-chef">clojureweb-chef</a> as I promised in <a href="http://maxprokopiev.com/posts/my-clojure-cup/">previous post</a>. <code class="language-plaintext highlighter-rouge">clojureweb-chef</code> is a collection of Chef recipes for setting up a server for Clojure deployment. Checkout <code class="language-plaintext highlighter-rouge">README</code> on github.</p>
<p>Also there is a <a href="https://github.com/juggler/clojureweb-chef-demoapp">demo application</a> for testing purposes.</p>
<p>Ping me on twitter if you have any questions or suggestions :)</p>
My Clojure Cup 20132013-10-01T00:00:00+00:00http://maxprokopiev.com/posts/my-clojure-cup<p>Last weekend I attended <a href="http://clojurecup.com/">Clojure Cup 2013</a>. Initially, I submitted my entry as a twitter mashup where users could create a dashboard based on service statuses (status is determined from a service’s twitter account, e.g. <a href="https://twitter.com/heroku_status">@heroku_status</a>).</p>
<p>But everything I did during this contest is writing Chef and Capistrano recipes for Clojure deployment.</p>
<p>On the one hand it’s caused by the lack of time to participate for the following reason:</p>
<blockquote class="twitter-tweet"><p>I'm getting married next week, but still attending <a href="https://twitter.com/clojurecup">@clojurecup</a>, what's your excuse? :)</p>— Max Prokopiev (@mprokopiev) <a href="https://twitter.com/mprokopiev/statuses/383980626132475904">September 28, 2013</a></blockquote>
<script async="" src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>On the other – by the lack of resources describing Clojure deployment on VPS like DigitalOcean.</p>
<p>There is a great article about <a href="https://juxt.pro/articles/manual-clojure-deployment.html">Manual Clojure Deployment</a> by <a href="https://juxt.pro/index.html">JUXT</a> team. But (as you may have already noticed) it describes <strong>manual</strong> Clojure deployment. Come on guys, it’s 2013, there are tools like Puppet and Chef to handle that. This is what I thought reading this article. So my Clojure Cup entry quickly mutated to <a href="http://clojurecup.com/app.html?app=wtf">“Automated Clojure Deployment”</a>.</p>
<p>I’ve picked initial Chef config from our <a href="https://github.com/fs/rails3-base-chef">chef template</a> which we are using at <a href="http://www.flatstack.com/">FlatStack</a> to prepare servers for deployment rails apps.</p>
<p>What I’ve done so far:</p>
<ul>
<li>recipe to set up <code class="language-plaintext highlighter-rouge">clojurecup</code> user (this was a requirement)</li>
<li>recipe to set up nginx config (as described in JUXT’s article) which works as a reverse proxy for the jetty server, serves static pages and caches content</li>
<li>jdk7</li>
<li>latest stable <a href="http://leiningen.org/">leniningen</a></li>
</ul>
<p>Also I’ve created a simple <a href="https://github.com/capistrano/capistrano">Capistrano</a> recipe. With task to start/stop/check and restart <a href="https://github.com/juggler/lein-daemon">lein daemon</a> (which I’m using to start an app server)</p>
<p>Today I’ll put my code to github with detailed readme. Keep in touch :)</p>
<p><strong>P.S.</strong></p>
<p>It was <strong>fun</strong>! Thanks to <a href="https://twitter.com/teropa">Tero Parviainen</a> and team.</p>
<p>During development I’ve made two pull requests to <a href="https://github.com/arohner/lein-daemon/pull/18">lein-daemon</a> and <a href="https://github.com/runa-labs/chef-leiningen/pull/3">chef-leiningen</a>. If anyone who reading this article have access to review and merge them - please do that ∧∧”</p>
Clojure resources2013-04-12T00:00:00+00:00http://maxprokopiev.com/posts/clojure-guide-for-rubists<p>Today at <a href="http://www.flatstack.com/">Flatstack</a> we were talking about Clojure and one of my collegues asked me to post a collection of links to Clojure resources. So this is not a guide, just a couple of links to start with:</p>
<p>First of all, offical resources. That’s where all should start their journey:</p>
<ul>
<li>Web site - <a href="http://clojure.org/">clojure.org</a></li>
<li>Docs - <a href="http://clojure.org/documentation">clojure.org/documentation</a></li>
</ul>
<p>Then there are community driven docs and conference talks:</p>
<ul>
<li>API Docs - <a href="http://clojuredocs.org/">clojuredocs.org</a></li>
<li>Community driven docs, tutorials, guides and articles - <a href="http://clojure-doc.org/">clojure-doc.org</a>. You can read about them in my <a href="http://maxprokopiev.com/posts/clojure-docs/">previous post</a>.</li>
<li>Youtube videos <a href="http://www.youtube.com/clojuretv">@clojuretv</a>. I highly recommend Rich Hickey talks. Especially: <a href="http://www.youtube.com/watch?v=f84n5oFoZBc">Hammock-Driven Development</a> and <a href="http://www.infoq.com/presentations/Simple-Made-Easy">Simple Made Easy</a>.</li>
</ul>
<p>And here you can dive into Clojure code:</p>
<ul>
<li><a href="http://clojurewerkz.org/">ClojureWerkz</a>. It is “a growing collection of open source Clojure libraries”. Some of them insired by Ruby’s ActionModel, ActionMailer and others.</li>
<li><a href="http://leiningen.org/">Leiningen</a>. This a build tool for Clojure projects. You can think of it as a Clojure’s rake, but it’s more than that.</li>
<li>Test framework - <a href="https://github.com/marick/Midje">midje</a></li>
<li><a href="https://github.com/ring-clojure/ring">Ring</a>. It’s like Rack in a Clojure world.</li>
<li><a href="https://github.com/weavejester/compojure">Compojure</a>. And this one is Ruby’s Sinatra.</li>
<li><a href="http://www.clojure-toolbox.com/">The Clojure Toolbox</a>. This one is like <a href="https://www.ruby-toolbox.com/">ruby toolbox</a> but much smaller. Somebody <a href="https://github.com/weavejester/clojure-toolbox.com">help them</a> already! There should be at least two useful features: search and one-line description for each library.</li>
</ul>
<p>Books:</p>
<ul>
<li><a href="http://www.clojurebook.com/">Clojure Programming</a> - learn language</li>
<li><a href="http://www.manning.com/fogus/">The Joy of Clojure</a> - learn philosphy</li>
</ul>
<p>Other lists:</p>
<ul>
<li><a href="https://twitter.com/teropa">Tero Parviainen</a> shared his <a href="https://gist.github.com/teropa/5346635">gist</a> with great collection of clojure tutorials and videos. You should definitely check it out.</li>
</ul>
<p>P.S. After posting this I’ve received email messages with other suggestions, so I’ll be updating this list to include more links to Clojure resources. Keep in touch!</p>
Clojure docs2013-02-28T00:00:00+00:00http://maxprokopiev.com/posts/clojure-docs<p>What is the first thing you do, when you discover a new language you want to try? Let me guess - you’ll open a new browser tab and google for it. Eventually you’ll end up on the official site searching for “getting started” tutorial in the docs section. On Clojure <a href="http://clojure.org/getting_started">official site</a> it says “download and unzip Clojure”. Wait, download and unzip? Where is info about my favorite package manager? Why there is only one sentence about <a href="https://github.com/technomancy/leiningen/">leiningen</a>?</p>
<p>There are <a href="http://stackoverflow.com/questions/14023317/build-error-while-installing-clojure-in-ubuntu">many</a> <a href="http://stackoverflow.com/questions/7843974/does-apt-get-work-to-install-clojure-on-linux-ubuntu-10">questions</a> on stackoverflow from ubuntu users trying to get ubuntu via apt-get or something. I think many problems would be solved if starters go first to this <a href="http://clojure-doc.org/articles/tutorials/introduction.html">getting started article</a> on community driven <a href="http://clojure-doc.org/">documentation site</a> for Clojure. This article is great for newbies.</p>
<p>I accidentally found it in this <a href="https://groups.google.com/forum/?fromgroups=#!topic/clojure/3aBMazxVCrk">discussion</a> on google groups titled “Improving visibility of clojure-doc.org”. It’s a pity that I didn’t know about it when I started digging clojure… And I hope that people reading this post will help newcomers and point them to this site.</p>
<hr />
<p>Great work by <a href="https://github.com/clojuredocs?tab=members">Clojure Documentation Team</a> and all it’s contributors. Thank you guys!</p>
Trying ClojureScript2013-02-27T00:00:00+00:00http://maxprokopiev.com/posts/trying-clojurescript<p>First of all I should say that <a href="https://github.com/clojure/clojurescript">ClojureScript</a> is a great tool for writing single page applications with complex client-side logic (take a look at <a href="http://blog.getprismatic.com/">prismatic</a>, they use it). Another great feature of ClojureScript is that you can <a href="https://github.com/emezeske/lein-cljsbuild/blob/0.3.0/doc/CROSSOVERS.md">re-use you server-side clojure code</a> in your scripts.</p>
<p>But here I want to list some small disadvantages, things that I found uncomfortable while trying ClojureScript.</p>
<h2 id="logging">Logging</h2>
<p>Remember old good console.log:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">Hello world</span><span class="dl">'</span><span class="p">);</span></code></pre></figure>
<p>Which looks more cleaner in CoffeeScript:</p>
<figure class="highlight"><pre><code class="language-coffeescript" data-lang="coffeescript"> <span class="nx">console</span><span class="p">.</span><span class="na">log</span> <span class="s">'Hello world'</span></code></pre></figure>
<p>Now look at ClojureScript’s version:</p>
<figure class="highlight"><pre><code class="language-clojure" data-lang="clojure"><span class="w"> </span><span class="p">(</span><span class="nf">.log</span><span class="w"> </span><span class="n">js/console</span><span class="w"> </span><span class="s">"Hello world"</span><span class="p">)</span></code></pre></figure>
<p>You can search github and you’ll find code like this:</p>
<figure class="highlight"><pre><code class="language-clojure" data-lang="clojure"><span class="w"> </span><span class="p">(</span><span class="k">defn</span><span class="w"> </span><span class="n">log</span><span class="w"> </span><span class="p">[</span><span class="n">obj</span><span class="p">]</span><span class="w">
</span><span class="p">(</span><span class="nf">.log</span><span class="w"> </span><span class="n">js/console</span><span class="w"> </span><span class="p">(</span><span class="nb">pr-str</span><span class="w"> </span><span class="n">obj</span><span class="p">)))</span></code></pre></figure>
<p>or this:</p>
<figure class="highlight"><pre><code class="language-clojure" data-lang="clojure"><span class="w"> </span><span class="p">(</span><span class="k">defn</span><span class="w"> </span><span class="n">log</span><span class="w"> </span><span class="p">[</span><span class="o">&</span><span class="w"> </span><span class="n">more</span><span class="p">]</span><span class="w">
</span><span class="p">(</span><span class="nf">.log</span><span class="w"> </span><span class="n">js/console</span><span class="w"> </span><span class="p">(</span><span class="nb">apply</span><span class="w"> </span><span class="nb">str</span><span class="w"> </span><span class="n">more</span><span class="p">)))</span></code></pre></figure>
<p>People don’t like to be typewriters :)</p>
<h2 id="javascript-objects">JavaScript objects</h2>
<p>Every time you want to interact with js objects you need to use js-obj construct:</p>
<figure class="highlight"><pre><code class="language-clojure" data-lang="clojure"><span class="w"> </span><span class="p">(</span><span class="nf">js-obj</span><span class="w"> </span><span class="s">"foo"</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="s">"bar"</span><span class="w"> </span><span class="mi">2</span><span class="p">)</span></code></pre></figure>
<p>For example to send some json to server you’ll need:</p>
<figure class="highlight"><pre><code class="language-clojure" data-lang="clojure"><span class="w"> </span><span class="p">(</span><span class="nf">send-to-server</span><span class="w"> </span><span class="p">(</span><span class="nf">.stringify</span><span class="w"> </span><span class="n">js/JSON</span><span class="w"> </span><span class="p">(</span><span class="nf">js-obj</span><span class="w"> </span><span class="s">"foo"</span><span class="w"> </span><span class="n">bar</span><span class="p">)))</span></code></pre></figure>
<p>Again people end up with helper functions for clojure map -> js object conversion:</p>
<figure class="highlight"><pre><code class="language-clojure" data-lang="clojure"><span class="w"> </span><span class="p">(</span><span class="k">defn</span><span class="w"> </span><span class="n">clj->js</span><span class="w">
</span><span class="s">"makes a javascript map from a clojure one"</span><span class="w">
</span><span class="p">[</span><span class="n">cljmap</span><span class="p">]</span><span class="w">
</span><span class="p">(</span><span class="k">let</span><span class="w"> </span><span class="p">[</span><span class="n">out</span><span class="w"> </span><span class="p">(</span><span class="nf">js-obj</span><span class="p">)]</span><span class="w">
</span><span class="p">(</span><span class="nb">doall</span><span class="w"> </span><span class="p">(</span><span class="nb">map</span><span class="w"> </span><span class="o">#</span><span class="p">(</span><span class="nb">aset</span><span class="w"> </span><span class="n">out</span><span class="w"> </span><span class="p">(</span><span class="nb">name</span><span class="w"> </span><span class="p">(</span><span class="nb">first</span><span class="w"> </span><span class="n">%</span><span class="p">))</span><span class="w"> </span><span class="p">(</span><span class="nb">second</span><span class="w"> </span><span class="n">%</span><span class="p">))</span><span class="w"> </span><span class="n">cljmap</span><span class="p">))</span><span class="w">
</span><span class="n">out</span><span class="p">))</span></code></pre></figure>
<script src="https://gist.github.com/lynaghk/1141054.js"></script>
<p></script></p>
<p>Seems like there is an issue for that in <a href="http://dev.clojure.org/jira/browse/CLJS-37">clojure’s JIRA</a>.</p>
<h2 id="debugging">Debugging</h2>
<p>Sometimes ClosureScript compiler crashes with NullPointerException and without ANY line number. It is very difficult when you need to comment lines to guess which one is failing.</p>
<hr />
<p>All of these I’ve experienced during <a href="https://github.com/http-kit/chat-websocket/blob/master/src-cljs/main.cljs">conversion</a> of <a href="https://github.com/http-kit/chat-websocket/">chat-websocket</a> js scripts to ClojureScript. I think that ClojureScript is not good for small utility scripts because of the runtime and necessity for helper functions. Next time when I need to write some simple frontend code I’ll use CoffeeScript. But I’m still learning and trying cljs, so there will be other posts about it.</p>
Releasing lein heroku-deploy2013-02-26T00:00:00+00:00http://maxprokopiev.com/posts/lein-heroku-deploy<p>Inspired by <a href="https://github.com/mattpolito/paratrooper">Paratrooper</a> I’ve released simple plugin for leiningen to simplify you heroku deploys - <a href="https://github.com/juggler/lein-heroku-deploy">heroku-deploy</a>.</p>
<p>Usage is just simple as running:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>lein heroku-deploy
</code></pre></div></div>
<p>This command will:</p>
<ul>
<li>Activating maintenance mode</li>
<li>Push changes to Heroku</li>
<li>Restart the application</li>
<li>Deactivate maintenance mode</li>
<li>Warm application instance by requesting home page url</li>
</ul>
<p>5 commands in one :)</p>
<p>Of course, there are many things to do:</p>
<ul>
<li>Overriding default command flow and inject custom commands</li>
<li>Output git push info by lines, not as a single line</li>
</ul>
<p>Finally, I want to say, that leiningen is <a href="https://github.com/technomancy/leiningen/blob/master/doc/PLUGINS.md">well documented</a> about how to write your own plugin and publish it to <a href="https://clojars.org/">clojars</a>.</p>
Useful links2013-02-25T00:00:00+00:00http://maxprokopiev.com/posts/useful-links<ul>
<li>Great <a href="http://zachholman.com/videos">screencasts</a> and <a href="http://zachholman.com/talks">talks</a> by githubber Zach Holman.</li>
<li>Ruby 2.0.0-p0 <a href="http://www.ruby-lang.org/en/news/2013/02/24/ruby-2-0-0-p0-is-released/">released</a>!</li>
<li>Intereseting <a href="http://blog.brownplt.org/2013/02/19/teaching-gc.html">post</a> about how to teach students the essential ideas behind garbage collection.</li>
<li><a href="http://rdegges.com/heroku-dynos-in-depth">Explaining</a> heroku’s dynos.</li>
<li>Tip: <a href="https://coderwall.com/p/d8iw2g">how to use Boxen</a></li>
<li>Tip: <a href="https://coderwall.com/p/psa3ng">how to open git conflicts in vim</a></li>
<li>Nice <a href="http://statico.github.com/vim.html">post</a> about using vim.</li>
<li>If you interested in leinengen <a href="http://blog.jr0cket.co.uk/2013/02/leningen-quick-peek-underneath.html">internals</a>.</li>
</ul>
Diving Into Clojure2013-02-24T00:00:00+00:00http://maxprokopiev.com/posts/diving-into-clojure<p>In a past few months I’ve started playing with <a href="http://clojure.org">Clojure</a>. There are many reasons for that. Currently I’m working with ruby at <a href="http://www.flatstack.com">Flatstack</a>. Actually, I work mostly with rails and this is already bored me. Not so much ruby, but the rails thing - when working with rails I’ve started to forget basic things and (which is even worse) stopped looking at how things really work . For example, why should I care how to rewrite this simple query in MongoDB console:</p>
<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"> <span class="no">Article</span><span class="p">.</span><span class="nf">where</span><span class="p">(</span><span class="ss">title: </span><span class="s1">'Clojure'</span><span class="p">).</span><span class="nf">order</span><span class="p">(</span><span class="ss">:published_at</span><span class="p">.</span><span class="nf">desc</span><span class="p">)</span></code></pre></figure>
<p>Rails will do that for me. You should only care about logic specific to your domain. And this is super cool! …if you want to build websites all your life. I want more hardcore programming like writing mongodb adapter or wrapper for <a href="http://thinkaurelius.github.com/titan/">Titan</a>.</p>
<p>So I started to look for other programming languages. I have been passively fond of functional programming languages. Tried scheme, erlang and even haskell. But there was one language which interested me the most - Clojure. So I thought to myself why not to try it. I’m not afraid of parentheses, interested in how JVM works, love FP.</p>
<p>I’ve started to read <a href="http://mitpress.mit.edu/sicp/full-text/book/book.html">SICP</a> and try to solve exersices with clojure. Then I’ve reached the web - ring, compojure, hiccup and clojurescript. Ring is like Rack, compojure is clojure’s sinatra - not so much difficult.</p>
<p>Now I want to organize all of this in my head. So I decided to start this blog.</p>
<hr />
<p>If you have an interesting clojure project and looking for a good developer to work with - ping me on Twitter - I’m <a href="http://twitter.com/mprokopiev">@mprokopiev</a>.</p>