<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/resources/xsl/feed.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Nikola Plejić: blog</title>
  <link href="https://nikola.plejic.com/" rel="alternate"></link>
  <link href="https://nikola.plejic.com/feeds/all.atom.xml" rel="self"></link>
  <id>https://nikola.plejic.com/</id>
  <updated>2023-12-26T12:45:00+01:00</updated>
  
  <entry>
    <title type="html">Tracking Butterflies</title>
    <link href="https://nikola.plejic.com/shorts/2024-04-23-tracking-butterflies" rel="alternate"></link>
    <published>2024-04-23T09:45:00+02:00</published>
    <updated>2024-04-23T09:45:00+02:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2024-04-23:/shorts/2024-04-23-tracking-butterflies</id>
    <summary type="html">Tiny devices on tiny insects.
</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;Link:&lt;/strong&gt; &lt;a href=&quot;https://cacm.acm.org/opinion/technical-perspective-creating-the-internet-of-biological-and-bio-inspired-things/&quot;&gt;Technical Perspective: Creating the Internet of Biological and Bio-Inspired Things – Communications of the ACM&lt;/a&gt; (&lt;a href=&quot;https://cacm.acm.org/research/msail-milligram-scale-multi-modal-sensor-platform-for-monarch-butterfly-migration-tracking/&quot;&gt;full paper&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;I &lt;em&gt;love&lt;/em&gt; the CACM’s “Technical Perspective” series where they provide an accompanying (technical) summary of a larger research paper! More than once it made me dive deeper into papers that I would’ve skipped otherwise — like this research wholesome enough to warrant a break from the all-encompassing cynicism of 2024. I’m unsure about the animal welfare aspects of this, but it seems non-invasive and useful so I’m willing to give it the benefit of the doubt.&lt;/p&gt;
&lt;p&gt;Humanity has tracked migratory patterns of different animals for a while, but these were limited to larger species that make it easy to attach the necessary devices. I recently heard Felix Stalder talk about &lt;a href=&quot;https://latentspaces.zhdk.ch/imb/&quot;&gt;the project “Infrastructure of a Migratory Bird”&lt;/a&gt; based on data collected by such research, and it’s a wonderful (and beautiful) way to understand what’s involved in these undertakings (spoiler: it’s &lt;strong&gt;a lot&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;In this paper, the authors build infrastructure to track the migration of monarch butterflies. Butterflies are &lt;em&gt;tiny&lt;/em&gt;, and attaching a full-blown tracking device to a minuscule living thing that travels up to 4000 kilometers sounds impossible… yet here we are. It’s utterly fascinating to read what goes into this: it combines seemingly contradictory features like low-power computing, offline-first (with 16 kB of memory!), and machine learning to provide insight into the Earth’s ecology.&lt;/p&gt;
</content>
    
    <category term="link"></category>
    
    <category term="longread"></category>
    
    <category term="paper"></category>
    
  </entry>
  
  <entry>
    <title type="html">On User Interfaces On the Web &amp; Beyond</title>
    <link href="https://nikola.plejic.com/shorts/2024-04-16-on-user-interfaces" rel="alternate"></link>
    <published>2024-04-16T09:45:00+02:00</published>
    <updated>2024-04-16T09:45:00+02:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2024-04-16:/shorts/2024-04-16-on-user-interfaces</id>
    <summary type="html">Old man yells at modern UIs.
</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;Link:&lt;/strong&gt; &lt;a href=&quot;https://www.datagubbe.se/usab2/&quot;&gt;The Decline of Usability: Revisited | datagubbe.se&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This has to be an “old man yells at cloud” situation if there ever was one, but as someone who remembers at least some of the systems outlined in the article, it’s hard to disagree with its conclusions. The web is the platform that’s most familiar to me and resonates the most, but the text repeatedly demonstrates things aren’t great on other platforms either. (Although, with the Electrons and the likes, it’s not even clear where the web ends and “other platforms” begin.)&lt;/p&gt;
&lt;p&gt;During the peak of &lt;a href=&quot;https://getbootstrap.com/&quot;&gt;Bootstrap&lt;/a&gt;, people complained that &lt;a href=&quot;https://www.dagusa.com/&quot;&gt;all&lt;/a&gt; &lt;a href=&quot;https://www.fastcompany.com/90501691/science-confirms-it-web-sites-really-do-all-look-the-same&quot;&gt;websites&lt;/a&gt; &lt;a href=&quot;https://www.friday.ie/blog/why-do-all-websites-look-the-same/&quot;&gt;and&lt;/a&gt; &lt;a href=&quot;https://news.ycombinator.com/item?id=11287413&quot;&gt;webapps&lt;/a&gt; are starting to look the same. I am &lt;strong&gt;demonstrably&lt;/strong&gt; not a designer, and I’m sure there are good arguments to be made in favor of some diversity being desireable. That said, I always thought that “websites looking the same” isn’t the most expensive price we could pay for &lt;em&gt;familiarity&lt;/em&gt; and &lt;em&gt;consistency&lt;/em&gt; of our interfaces. We’ve since long abandoned any attempts to achieve that — to great success.&lt;/p&gt;
&lt;p&gt;Browsers, of course, have decent defaults for dealing with web &lt;em&gt;sites&lt;/em&gt; (see, e.g., &lt;a href=&quot;https://danluu.com&quot;&gt;danluu.com&lt;/a&gt;), although it would be difficult to argue that this feels remotely “familiar” in 2024. There are no good defaults for web &lt;em&gt;apps&lt;/em&gt; — HTML was never intended to be a UI toolkit, so at best, we’re playing catch-up. I was hoping that the likes of React and Web Components might result in a couple of well-adopted, powerful UI toolkits for the browser, but it’s predominantly used as a way to churn out gazillions of ad-hoc, low-quality, non-standardised components.&lt;/p&gt;
&lt;p&gt;(To be fair, there &lt;strong&gt;are&lt;/strong&gt; good UI toolkits built on top of modern web frameworks out there. I’ve worked with a few: they’re mostly commercial, but that’s fair game. None of them could be described as “well-adopted”, though.)&lt;/p&gt;
&lt;p&gt;The unexplainable need to replicate mobile &amp;amp; e-commerce UIs to software in general sounds like a plausible explanation for this mess. My unproveable side-hypothesis is that there’s another component at play: the incredible ease of updating modern software. Early on, distributing software was &lt;strong&gt;hard&lt;/strong&gt;. Distributing updates meant having users savvy enough to figure out an update had been released, &lt;strong&gt;and&lt;/strong&gt; determined enough to actually install it. You really had to think long and hard about your UI choices, and unless you’ve had very good reasons not to, you chose consistency. Today? Release any random crap, then measure and/or listen for feedback. No need for serious thought — it’s not like you’re burning this on a CD.&lt;/p&gt;
</content>
    
    <category term="link"></category>
    
    <category term="longread"></category>
    
  </entry>
  
  <entry>
    <title type="html">Current Affairs on Ye</title>
    <link href="https://nikola.plejic.com/shorts/2024-03-29-current-affairs-on-ye" rel="alternate"></link>
    <published>2024-03-29T10:23:00+01:00</published>
    <updated>2024-03-29T10:23:00+01:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2024-03-29:/shorts/2024-03-29-current-affairs-on-ye</id>
    <summary type="html">Kanye West, politically unacceptable art, and politically unacceptable artists.
</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;Link:&lt;/strong&gt; &lt;a href=&quot;https://www.currentaffairs.org/2024/03/ye-and-the-problem-of-fascist-art/&quot;&gt;Ye and the Problem of Fascist Art ❧ Current Affairs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Any fan of “extreme” music comes to terms with the questions posed by this article on a regular basis. This is certainly not the first event of its kind in the mainstream, but it might be the most blatantly direct specimen: it’s almost cathartic to see people wrapping their minds around it in real-time. The analysis here is convincing, if a bit obvious: becoming a billionaire seems to have an uncanny tendency to make you stare into the abyss of fascism a tad too long.&lt;/p&gt;
&lt;p&gt;I do like the attempt at adding nuance to the idea of the “death of the author”, where the question becomes whether the line between the artwork &amp;amp; the author has been completely blurred to the point of the author using their art as a vessel to — purposefully or not — disseminate their less than stellar life choices. I’m unsure how much of this is just a desperate attempt to reconcile the cognitive dissonance, but it’s a compelling framework to consider.&lt;/p&gt;
&lt;p&gt;It’s not too surprising that a Current Affairs article ends up — very correctly — talking about “blame misdirection” and systemic issues, and I find it very hard to argue with the conclusion. The single remains in Billboard’s Top 10, though. Ye’s art might not be his own anymore, but it’s still out there, legitimizing the bile and mobilizing the crowds. So what should we do? Some of those beats &lt;em&gt;are&lt;/em&gt; sick. Should the critics give it four stars and dive head-first into a marxist critique in sentence one? I think they &lt;em&gt;certainly&lt;/em&gt; should do the latter, but it probably won’t do wonders for their reach.&lt;/p&gt;
&lt;p&gt;Personally, the obvious case of Ye aside, I think there’s too much music out there to waste time on assholes. I won’t go actively digging for dirt in artists’ histories, but I’m trying to be aware of the context — I’ll skim through the liner notes, I’ll look at the iconography, I’ll read an interview. I’m more than willing to give the benefit of the doubt to people who clearly distance themselves from their mistakes. Otherwise, heeding the good advice of Jon Stewart: if I smell something, I’ll say something — and actively support the deserving non-assholes.&lt;/p&gt;
</content>
    
    <category term="link"></category>
    
    <category term="longread"></category>
    
  </entry>
  
  <entry>
    <title type="html">Antirez on LLMs</title>
    <link href="https://nikola.plejic.com/shorts/2024-03-27-antirez-on-llms" rel="alternate"></link>
    <published>2024-03-27T19:35:00+01:00</published>
    <updated>2024-03-27T19:35:00+01:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2024-03-27:/shorts/2024-03-27-antirez-on-llms</id>
    <summary type="html">On Salvatore Sanfilippo&#x27;s &quot;LLMs and Programming in the first days of 2024&quot;.
</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;Link:&lt;/strong&gt; &lt;a href=&quot;http://antirez.com/news/140&quot;&gt;LLMs and Programming in the first days of 2024&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Salvatore Sanfilippo is certainly a programmer I look up to: I’ve appreciated both his software and his writing for a long time. This article that’s been in my reading queue for a while is a sober take on the topic, and I found it insightful to see how he incorporates LLMs into his workflow.&lt;/p&gt;
&lt;p&gt;What he calls “junk knowledge” — obscure APIs, convoluted protocols — seems like a good use case for these tools. I’ve tried to steer my usage in this direction, too: I’ve recently had to work with AWS a fair amount, and ChatGPT ended up being genuinely useful. While the “CloudWatch Logs Insights query language” is handy, and I’m sure someone had &lt;em&gt;a lot&lt;/em&gt; of fun implementing it, I’ll gladly opt out of learning even more syntax I’ll rarely use.&lt;/p&gt;
&lt;p&gt;All of that said, it’s important to continuously remind ourselves of the cost of these tools — in watts of power, in [insert unit]s of privacy — particularly by our thought leaders. I haven’t seen much of that in this article, but &lt;a href=&quot;https://simonwillison.net/2024/Mar/22/claude-and-chatgpt-case-study/&quot;&gt;Simon Willison’s recent writing&lt;/a&gt; on “ad-hoc sidequests” does a good job in its closing words. I’ve been enjoying his other writing on this topic as well.&lt;/p&gt;
</content>
    
    <category term="link"></category>
    
    <category term="longread"></category>
    
  </entry>
  
  <entry>
    <title type="html">2023: A Year In Review</title>
    <link href="https://nikola.plejic.com/blog/2023-a-year-in-review" rel="alternate"></link>
    <published>2023-12-26T12:45:00+01:00</published>
    <updated>2023-12-26T12:45:00+01:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2023-12-26:/blog/2023-a-year-in-review</id>
    <summary type="html">Wrapped up my graduate studies, wrapped up my shoulder recovery, and went for a wonderful trip to Scotland.
</summary>
    <content type="html">&lt;p&gt;&lt;a href=&quot;../2019-a-year-in-review/&quot;&gt;Previously (2019)&lt;/a&gt;,
&lt;a href=&quot;../2020-a-year-in-review/&quot;&gt;previously (2020)&lt;/a&gt;,
&lt;a href=&quot;../2022-a-year-in-review/&quot;&gt;previously (2022)&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Academics&lt;/h3&gt;
&lt;p&gt;I’m writing this during a (lengthy) layover in Salt Lake City on the way back from my visit to the US. (Mental note: do visit SLC one day! It looks pretty.) This one included a much anticipated graduation ceremony: after slightly more than two years, I’ve finally graduated from the &lt;a href=&quot;https://omscs.gatech.edu/&quot;&gt;OMSCS program at Georgia Tech&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;
&lt;img src=&quot;/images/gatech.jpg&quot; width=&quot;4032&quot; alt=&quot;Me in front of the Klaus Advanced Computing Building at Georgia Tech&quot; title=&quot;Thanks Sara for the photo&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;As a kid, I dreamed about going to MIT: I still have no idea where I had first heard about the school but studying computer science at a prestigious US university seemed like the bee’s knees. Going to Boston, of course, wasn’t likely to happen: I was no planetary-grade wunderkind, and my post-war working-class parents had too few internal organs to sell. All this made it extra surreal to walk around the Georgia Tech campus as a fresh graduate.&lt;/p&gt;
&lt;p&gt;People tend to ask why I’ve decided to do this, and the answer is… because I could? I certainly didn’t have to: it’s not likely this diploma will have any immediate impact on my career. It was a fun, decent challenge: I’ve learned a lot, and it feels good to have a formal verification of my skills.&lt;/p&gt;
&lt;h3&gt;Travel&lt;/h3&gt;
&lt;p&gt;The big trip of the year was our &lt;a href=&quot;https://www.flickr.com/photos/zweistein/albums/72177720310781580&quot;&gt;summer vacation in Scotland&lt;/a&gt;. We were insanely lucky, and had the best weather one could hope for — to the extent that it doesn’t really feel like we’ve &lt;em&gt;properly&lt;/em&gt; experienced Scotland. We saw Edinburgh, parts of Skye, and walked the very final stretch of the West Highland Way. It’s a beautiful country: I have photos but they can’t do it justice.&lt;/p&gt;
&lt;p&gt;&lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://www.flickr.com/photos/zweistein/53147093721/in/album-72177720310781580/&quot; title=&quot;Walk towards Sligachan Waterfalls&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53147093721_9b2b2bd816_h.jpg&quot; width=&quot;1600&quot; alt=&quot;Walk towards Sligachan Waterfalls&quot;/&gt;&lt;/a&gt;&lt;script async src=&quot;//embedr.flickr.com/assets/client-code.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;Otherwise, work led me to London a few times, Sara and I spent some time on the beautiful Croatian island of Vis, and took a short weekend trip to my place of birth, Sarajevo. The year wrapped up with a visit to Atlanta (see above) followed by an almost traditional end-of-the-year trip to Phoenix.&lt;/p&gt;
&lt;h3&gt;Books&lt;/h3&gt;
&lt;p&gt;Fiction-wise, I’ve read all five books in Abir Mukherjee’s “Wyndham &amp;amp; Banerjee” series. It’s a very well-written set of detective stories set in early 20th-century India with a lot of references to its colonial past. In a vaguely similar vein, I’ve read Holly Watt’s “To The Lions” and “The Dead Line” which were a bit more taxing but very good.&lt;/p&gt;
&lt;p&gt;I dove into Ruth Ozaki’s “The Book of Form and Emptiness” after a review in The Guardian, and thought the review did it justice — it was captivating, and any air of pretentiousness disappeared after a few pages.&lt;/p&gt;
&lt;p&gt;As far as biographies &amp;amp; memoirs go, Chelsea Manning’s “README.txt” was an important but painful read. Ananyo Bhattacharya’s biography of John von Neumann, “The Man from the Future”, was brilliant: it’s quite a feat to attempt to capture the life of someone who had such an impact on the 20th century, and I’d say this was a success.&lt;/p&gt;
&lt;p&gt;On the more technical side, William Kent’s “Data and Reality” is often mentioned as a classic of our field. Its examples are expectedly outdated, which does make it overly difficult to read but it’s extremely insightful: this is the book you want your domain experts to read in order to understand what the hell’s happening in your head when you’re writing software.&lt;/p&gt;
&lt;p&gt;Finally, I’ve read “Facts and Fallacies of Software Engineering” by Robert L. Glass. It was undoubtedly good and important but the quantitative aspects of it seemed less than convincing. The referencing is very good, so I guess it’s up to me to follow up and convince myself.&lt;/p&gt;
&lt;h3&gt;Music&lt;/h3&gt;
&lt;p&gt;The event of the year was &lt;a href=&quot;https://www.freejazzblog.org/2023/06/peter-brotzmann-1941-2023.html&quot;&gt;the departure of Peter Brötzmann&lt;/a&gt;, the great German sax player. I still remember hearing “Machine Gun” for the first time in high school, and being — somewhat literally — blown away: I had no idea you were allowed to do that on a record, and I’m not exaggerating when I say it had changed my view of music.&lt;/p&gt;
&lt;p&gt;I’ve had the privilege of seeing Brötzmann play live in Zagreb several times, most recently with Heather Leigh, and his level of dedication to the music was always inspiring. &lt;a href=&quot;https://www.zeit.de/kultur/musik/2023-06/peter-broetzmann-freejazz-saxofon-tod/komplettansicht&quot;&gt;This posthumously published interview of his&lt;/a&gt; (in German) got me very emotional — what a brilliant human being.&lt;/p&gt;
&lt;p&gt;Concert-wise, things seem to be picking up pace, yet I’ve been lazier than I should’ve been. The crown jewel was &lt;a href=&quot;https://www.cafeoto.co.uk/events/lean-left-2023/&quot;&gt;Lean Left’s residency in Cafe Oto&lt;/a&gt; which wonderfully coincided with a work visit — and what a residency it was.&lt;/p&gt;
&lt;p&gt;The list of albums is a bit shorter this year but it’s not due to lack of music — it’s definitely me:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://algierstheband.bandcamp.com/album/shook&quot;&gt;Algiers: Shook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ambroseakinmusire.bandcamp.com/album/beauty-is-enough&quot;&gt;Ambrose Akinmusire: Beauty is Enough&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dawnofadarkage.bandcamp.com/album/the-book-of-lies-liber-i&quot;&gt;A.M.E.N.: The Book of Lies - Liber I&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anohni.bandcamp.com/album/my-back-was-a-bridge-for-you-to-cross-2&quot;&gt;ANOHNI: My Back Was A Bridge For You To Cross&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Arooj Aftab, Vijay Iyer, Shahzad Ismaily: Love in Exile&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cattledecapitation.bandcamp.com/album/terrasite&quot;&gt;Cattle Decapitation: Terrasite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dawnrayd.bandcamp.com/album/to-know-the-light&quot;&gt;Dawn Ray’d: To Know the Light&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Feist: Multitudes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://feverray.bandcamp.com/album/radical-romantics&quot;&gt;Fever Ray: Radical Romantics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://forestswords.bandcamp.com/album/bolted?t=1&quot;&gt;Forest Swords: Bolted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;John Zorn: New Masada Quartet, Vol. 2&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://liturgy.bandcamp.com/album/93696&quot;&gt;Liturgy: 93696&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://oozingwound.bandcamp.com/album/we-cater-to-cowards&quot;&gt;Oozing Wound: We Cater To Cowards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://outerheaven.bandcamp.com/album/infinite-psychic-depths?t=10&quot;&gt;Outer Heaven: Infinite Psychic Depths&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ayler-records.bandcamp.com/album/perpetual-motion&quot;&gt;Satoko Fujii &amp;amp; Otomo Yoshihide: Perpetual Motion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thetallestmanonearth.bandcamp.com/album/henry-st&quot;&gt;The Tallest Man on Earth: Henry St.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://theygrieve.bandcamp.com/album/to-which-i-bore-witness&quot;&gt;They Grieve: To Which I Bore Witness&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wednesdayband.bandcamp.com/album/rat-saw-god&quot;&gt;Wednesday: Rat Saw God&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://yves-tumor.bandcamp.com/album/praise-a-lord-who-chews-but-which-does-not-consume-or-simply-hot-between-worlds&quot;&gt;Yves Tumor: Praise A Lord Who Chews But Which Does Not Consume; (Or Simply: Hot Between Worlds)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Politics&lt;/h3&gt;
&lt;p&gt;Locally, the green-left party in Zagreb is still making strides. It’s difficult to address 20+ years of neglect and active destruction in three years’ time, and it’s even more difficult to properly communicate this to the public. Next year is super-electoral: it’s likely we’ll have all four types of elections (parliamentary, EU, presidential, and local) in a one-year period, and it’ll be interesting to see how it unfolds.&lt;/p&gt;
&lt;p&gt;I’ve been significantly less active due to my academic endeavors, and I’m looking forward to getting back into it next year.&lt;/p&gt;
&lt;h3&gt;Misc.&lt;/h3&gt;
&lt;p&gt;I’ve spent some more time recovering from my shoulder surgery, and recently started feeling like I finally have a decent range of motion. It’s been long and painful but the shoulder is stable, and that’s all I could ask for.&lt;/p&gt;
&lt;p&gt;I’ve never been much of a gamer but I bought a Steam Deck as a graduation present to myself. I’ve been enjoying it a lot: if someone had told me 10 years ago that we’d have a handheld device running AAA games running Linux, I’d suggest them be institutionalized — but here we are. Kudos to the folks at Valve.&lt;/p&gt;
&lt;p&gt;I’ve continued helping my good friend IMS with his website for &lt;a href=&quot;https://programaudioseries.com/&quot;&gt;The Program Audio Series&lt;/a&gt;. There were no substantial updates to the website itself but he did release a couple of amazing episodes, and anyone reading this should check them out.&lt;/p&gt;
&lt;p&gt;All else has been stable, and I wouldn’t mind it staying that way.&lt;/p&gt;
&lt;h3&gt;Plans for 2024&lt;/h3&gt;
&lt;p&gt;I’ve started toying with a user-land implementation of TCP/IP, both as a way of understanding the protocols a bit better, and as a foundation for a more ambitious project I have in mind. Motivation and inspiration are elusive beasts but I’d be happy to make any kind of substantial progress towards finishing it.&lt;/p&gt;
&lt;p&gt;Otherwise:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;keep up with my workout schedule, as it’s certainly doing me good;&lt;/li&gt;
&lt;li&gt;(finally) visit Rome with Sara;&lt;/li&gt;
&lt;li&gt;be a good and supportive partner;&lt;/li&gt;
&lt;li&gt;live to see 2025.&lt;/li&gt;
&lt;/ul&gt;
</content>
    
    <category term="review"></category>
    
  </entry>
  
  <entry>
    <title type="html">Thoughts on Large Language Models</title>
    <link href="https://nikola.plejic.com/blog/thoughts-on-large-language-models" rel="alternate"></link>
    <published>2023-03-11T13:10:00+01:00</published>
    <updated>2023-03-11T13:10:00+01:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2023-03-11:/blog/thoughts-on-large-language-models</id>
    <summary type="html">Summarizing a couple of discussions on LLMs at the hacklab.
</summary>
    <content type="html">&lt;p&gt;Epistemic status: &lt;em&gt;I have no idea what I’m doing&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;We’ve been discussing so-called “Large Language Models” (LLMs) during our past few gatherings in the &lt;a href=&quot;https://razmjenavjestina.org/&quot;&gt;local hackerspace&lt;/a&gt;. None of us are ML experts, but we’re all experienced professionals (mostly in software engineering of various kinds), and have diverse enough backgrounds for it to be interesting.&lt;/p&gt;
&lt;p&gt;I wanted to jot some of the resulting thoughts down for posterity. I have no way of attributing these to any particular person as the discussions were… lively, but all of it has gone through yours truly thus it’s certainly plagued by my own misunderstanding and misconstruction. Nonetheless, it might be interesting to revisit them in a few years’ time.&lt;/p&gt;
&lt;h3&gt;The Ugly&lt;/h3&gt;
&lt;p&gt;The interesting part is that &lt;strong&gt;none of us seemed to be worried about the short- and medium-term prospects of AGI&lt;/strong&gt; (artificial general intelligence). Personally, this is equal parts due to my scepticism on “strong” AGI in general, and a lack of belief that society will live long enough to achieve AGI. In addition, I always feel uneasy discussing AGI as I find it to be an ill-defined topic: we’re not really sure what “intelligence” and “consciousness” are when it comes to humans, and attributing such properties to computer programs seems odd.&lt;/p&gt;
&lt;p&gt;There also seems to be a consensus that &lt;strong&gt;the LLMs we currently have are dangerous enough&lt;/strong&gt;, and that the “AGI scaremongers” aren’t doing much about it. I always thought it’s interesting how the loudest and most paranoid folks sit on boards of companies and “think-tanks” most likely to end up actually producing AGI. My dudes&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;: if you’re so freaked out by the prospects of what you’re doing, simply… stop?&lt;/p&gt;
&lt;p&gt;The argument here seems to be “if we don’t do it, someone else will”. This one’s kinda hard to refute, but here’s where I like to remind myself that the acronym for “mutually assured destruction” is “MAD”, and I can’t imagine that to be a coincidence. There’s some prior art here, and it’s not necessarily working in our favour.&lt;/p&gt;
&lt;p&gt;The most immediate thing everyone’s worried about is the ability to generate &lt;strong&gt;a huge amount of very convincing text that has little to do with reality&lt;/strong&gt;… a.k.a. complete and utter bullshit. Sure, OpenAI has these huge filtering layers that try to prevent the most disgusting of the options. These are… not perfect, and they mostly deal with the gory aspects of humanity. When it’s not trying to convince you that your obvious attempts at racial profiling are morally wrong, it’s still full of crap.&lt;/p&gt;
&lt;p&gt;As a very benign example, my own attempts at using ChatGPT to clarify certain aspects of my quantum computing class weren’t great. I tried to see if it’d be able to argue whether a Toffoli gate is a valid oracle for the Deutsch-Jozsa algorithm&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt;
&lt;p&gt;First, it claimed it’s not a valid oracle because it maps two input qubits to one output qubit rather than n qubits to one output qubit, which is silly as n=2 is a perfectly valid scenario.&lt;/p&gt;
&lt;img alt=&quot;ChatGPT answering whether a Toffoli gate is a valid oracle in the Deutsch-Jozsa algorithm, saying no&quot; src=&quot;/images/chatgpt_01.png&quot;/&gt;
&lt;p&gt;As a follow-up, I asked whether it’s a valid oracle in case where I only have two qubits as inputs, and it claimed it was.&lt;/p&gt;
&lt;img alt=&quot;ChatGPT answering whether a Toffoli gate is a valid oracle in the Deutsch-Jozsa algorithm when dealing with only two input qubits, saying yes&quot; src=&quot;/images/chatgpt_02.png&quot;/&gt;
&lt;p&gt;I wasn’t convinced, though: with the target qubit set to &lt;code&gt;|1&amp;gt;&lt;/code&gt; as in the Deutsch-Jozsa circuit, the Toffoli gate doesn’t seem to represent a balanced or constant function, which is a requirement for the oracle…&lt;/p&gt;
&lt;img alt=&quot;ChatGPT answering whether a Toffoli gate really really is a valid oracle for the Deutsch-Jozsa algorithm&quot; src=&quot;/images/chatgpt_03.png&quot;/&gt;
&lt;p&gt;That truth table simply isn’t correct. At this point, I decided there really is no alternative to shutting up and calculating.&lt;/p&gt;
&lt;h3&gt;The Bad&lt;/h3&gt;
&lt;p&gt;Setting aside deeper existential concerns, there’s a different set of more prosaic issues that pop up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It’s impossible to reproduce ChatGPT&lt;/strong&gt;. The resources required for running LLMs are immense, and the resources needed to train them more-so — assuming you’re able to get your hands on the training corpus. Even if this ends up being the most benign and useful tool in the history of mankind, we’ll end up in the same place we always seem to do — with the means of production concentrated in the hands of the rich few. Sounds vaguely familiar.&lt;/p&gt;
&lt;p&gt;Another issue is the “&lt;strong&gt;lack of traceability&lt;/strong&gt;”. LLMs regurgitate things found in their corpus, which isn’t completely unreasonable, as that’s what they’re designed to do (ish?). However, there seems to be no way of programming these networks to actually attribute this regurgitation to its sources. Fighting bullshit is far simpler if the bullshitter quotes their sources (which, I guess, is why they rarely do), and avoiding plagiarism is far easier if you provide proper references. The level of granularity of LLMs probably makes this extremely difficult, and that’s not great.&lt;/p&gt;
&lt;h3&gt;The (Possibly?) Good&lt;/h3&gt;
&lt;p&gt;Now the good part: there seems to be &lt;em&gt;some&lt;/em&gt; merit to it all. As a writing dilettante, I found the intra-textual &lt;strong&gt;stylistic coherence&lt;/strong&gt; to be one of the more interesting parts of both GPT-3 and ChatGPT. Limiting my unsubstantiated claims exclusively to the English language, I feel like text generated by these models is more stylistically uniform than what ends up being produced by most non-professional writers.&lt;/p&gt;
&lt;p&gt;I can imagine these systems being used by domain experts to write large amounts of text: prompt ChatGPT, sift through the bullshit, counter-prompt a few corrections &amp;amp; refinements, and finally edit the text to remove factual errors. It might not save any time compared to writing from scratch, but the end result might be better (for certain definitions of “better”). Finally, analyzing the resulting text could be a good exercise, the end goal being to become a better writer sans GPT&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#3&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;conversational aspect&lt;/strong&gt; of these models shouldn’t be underestimated either. Us hacker folks have spent most of our lives “prompt engineering” our machines in different ways — the idiosyncrasies of these systems are so ingrained into our brains we simply fail to imagine someone having trouble interacting with them. These failures happen regularly, though, and interacting with the machine in natural language is very attractive. Instead of adding quotes or minus signs or “site:reddit.com” to your search query, you can ask the machine to refine its output in your spoken language of choice.&lt;/p&gt;
&lt;p&gt;That &lt;em&gt;is&lt;/em&gt; powerful, and that &lt;em&gt;is&lt;/em&gt; appealing. We need to make sure people understand there’s still a machine behind the output, together with all implications of this fact. I’m not sure whether we’re doing a very good job at the moment, and there be dragons. A good, approachable paper on this topic well-worth a read is &lt;a href=&quot;https://arxiv.org/abs/2212.03551v2&quot;&gt;M. Shanahan’s “Talking About Large Language Models”&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On a bit more science fiction-y note, there’s the very interesting question of &lt;strong&gt;what these models really are&lt;/strong&gt;. &lt;a href=&quot;https://arxiv.org/abs/2210.13382&quot;&gt;People managed to train something GPT-like to play Othello&lt;/a&gt;, and the model seems to have inferred certain properties of the game&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#4&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;. Is this pure statistical symbol manipulation? Is it something more? Is there a difference? It’s fascinating to think about, and it’ll be fun to see if it produces some good science and/or philosophy.&lt;/p&gt;
&lt;p&gt;I’m trying to wrap this up on a positive note, although the obvious position &lt;em&gt;is&lt;/em&gt; defeatist. &lt;a href=&quot;https://doi.org/10.1145/3442188.3445922&quot;&gt;There’s many, many more things to consider here&lt;/a&gt;, yet we keep on keeping on without proper evaluation. I’m hoping we’ll be seeing much more good science and philosophy than well-written misinformation and terawatts of electricity flushed down the toilet, but this century doesn’t give too much material to cling to. Here’s to being alive and well enough to see the outcome.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;1&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;1&lt;/sup&gt;
&lt;p&gt;Interestingly enough, it’s &lt;em&gt;always&lt;/em&gt; dudes, isn’t it?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;2&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;2&lt;/sup&gt;
&lt;p&gt;This is just another example where it’s almost critical for the user of the LLM to be a domain expert when using it in a research capacity. I had no illusions of the results being infallible so I triple-checked, but I might as well have taken it at face value.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;3&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;3&lt;/sup&gt;
&lt;p&gt;Of course, you can totally do that without LLMs — by reading and analyzing text written by good writers. However, within highly specialized niches, it might not be obvious who these good writers are.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;4&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;4&lt;/sup&gt;
&lt;p&gt;This is a preprint, and I’m not sure whether it’s been verified or reproduced — even if it has, I wouldn’t really be able to tell.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
    
    <category term="misc"></category>
    
  </entry>
  
  <entry>
    <title type="html">2022: A Year In Review</title>
    <link href="https://nikola.plejic.com/blog/2022-a-year-in-review" rel="alternate"></link>
    <published>2022-12-23T16:55:00+01:00</published>
    <updated>2022-12-23T16:55:00+01:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2022-12-23:/blog/2022-a-year-in-review</id>
    <summary type="html">It&#x27;s always better to skip one, rather than two... Decent year, all things considered.
</summary>
    <content type="html">&lt;p&gt;&lt;a href=&quot;../2019-a-year-in-review/&quot;&gt;Previously (2019)&lt;/a&gt;,
&lt;a href=&quot;../2020-a-year-in-review/&quot;&gt;previously (2020)&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;2021&lt;/h3&gt;
&lt;p&gt;Since I skipped the review of the eventful 2021, here&#x27;s an attempt at a
summary in place of an intro:&lt;/p&gt;
&lt;p&gt;Trying to bounce back after the mess that was 2020 was a decent
challenge on its own, topped with illness in my immediate family (now
under control, thanks to the marvels of modern medicine), getting
vaccinated against COVID, and receiving the Christmas gift of COVID for
both Sara &amp;amp; myself (tough, but with no serious consequences).&lt;/p&gt;
&lt;p&gt;On the upside, I managed to squeeze in a couple of trips in &amp;amp; around
Croatia, and even abroad. It was also the year I started my graduate
studies at Georgia Tech’s OMSCS program, and the year the green-left
coalition won the mayoral mandate and formed the majority in the city
council of Zagreb.&lt;/p&gt;
&lt;p&gt;Things in 2022 were mostly natural follow-ups to these… So here we
go:&lt;/p&gt;
&lt;h3&gt;Academics&lt;/h3&gt;
&lt;p&gt;As planned, I started Georgia Tech’s &lt;a href=&quot;https://omscs.gatech.edu/&quot;&gt;Online MSc in Computer
Science&lt;/a&gt; (“OMSCS”) in Fall of 2021. As my
bachelor’s was delivered online, too, there were no big shocks
regarding the format &amp;amp; expectations. The experience of OMSCS just
reaffirmed my already positive views on formal education, especially
in a distributed (distance learning) setting.&lt;/p&gt;
&lt;p&gt;While I think anyone outside the United States would have to be &lt;em&gt;very&lt;/em&gt;
hard-pressed to describe an 8000+ dollar degree as &amp;quot;affordable&amp;quot;,
it&#x27;s commendable how Georgia Tech managed to further &lt;em&gt;decrease&lt;/em&gt; the
costs of tuition during my studies. For the benefit of everyone
outside of North America, I can only hope this trend will continue.&lt;/p&gt;
&lt;p&gt;All classes I took so far were outstanding, but I’d have to point out
the Operating Systems (both the
&lt;a href=&quot;https://omscs.gatech.edu/cs-6200-introduction-operating-systems&quot;&gt;introductory&lt;/a&gt;
and the
&lt;a href=&quot;https://omscs.gatech.edu/cs-6210-advanced-operating-systems&quot;&gt;advanced&lt;/a&gt;),
and the &lt;a href=&quot;https://omscs.gatech.edu/cs-6290-high-performance-computer-architecture&quot;&gt;Computer
Architecture&lt;/a&gt;
classes as the outliers. They helped structure plenty of things I’ve
previously glanced over or heard of, and augment it with a ton of
context and depth.&lt;/p&gt;
&lt;p&gt;In the meantime, Georgia Tech added a &lt;a href=&quot;https://omscs.gatech.edu/cs-8803-o13-quantum-computing&quot;&gt;Quantum
Computing&lt;/a&gt;
class to OMSCS’ offerings, and I’m very much looking forward to taking
it next semester.  If all goes well, Fall of 2023 should be my last
semester before graduating.&lt;/p&gt;
&lt;h3&gt;Work&lt;/h3&gt;
&lt;p&gt;After almost six years, I felt like I needed a change of pace
career-wise. I left tvbeat and joined
&lt;a href=&quot;https://www.minimum.eco/&quot;&gt;Minimum&lt;/a&gt;, a carbon accounting &amp;amp; management
start-up, as a software engineer. As well as an opportunity to work on
something I deeply care about, this also gave me the chance to —
again! — work with one of my dearest and bestest of friends, Boni. It
was also a great reason to seriously dive back into Python after a
long while.&lt;/p&gt;
&lt;p&gt;It would be difficult to overstate how much I&#x27;ve learned during my
tenure at tvbeat, and how privileged I felt to be one of the few people
to get paid to write Rust all the way back in 2018.&lt;/p&gt;
&lt;h3&gt;Travel&lt;/h3&gt;
&lt;p&gt;I spent &lt;a href=&quot;https://www.flickr.com/photos/zweistein/albums/72177720298693758&quot;&gt;late 2021 and early 2022 in
Phoenix&lt;/a&gt;,
a place I liked significantly more during winter than during
summer.&lt;/p&gt;
&lt;p&gt;&lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://www.flickr.com/photos/zweistein/52054348016/in/album-72177720298693758/&quot; title=&quot;Phoenix in winter. Cacti!&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/52054348016_201b558dc9_b.jpg&quot; width=&quot;1024&quot; alt=&quot;Phoenix in winter. Cacti!&quot;&gt;&lt;/a&gt;&lt;script async src=&quot;//embedr.flickr.com/assets/client-code.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;During the rest of the year, I &lt;a href=&quot;https://www.flickr.com/photos/zweistein/albums/72177720303308254&quot;&gt;roamed around the UK a
bit&lt;/a&gt;
to visit my new colleagues in London, in addition to going up north
for a short trip to the beautiful city of York. After a long time, I
visited
&lt;a href=&quot;https://www.flickr.com/photos/zweistein/albums/72177720304198939&quot;&gt;Budapest&lt;/a&gt;
again. After three years, I visited my not-quite-birthplace,
Vareš. Also:
&lt;a href=&quot;https://www.flickr.com/photos/zweistein/albums/72177720299502799&quot;&gt;Rovinj&lt;/a&gt;,
&lt;a href=&quot;https://www.flickr.com/photos/zweistein/albums/72177720301160008&quot;&gt;Gorski
Kotar&lt;/a&gt;,
Plitvice.&lt;/p&gt;
&lt;h3&gt;Books&lt;/h3&gt;
&lt;p&gt;There&#x27;s this treasure of a website for Croatian readers called
&amp;quot;&lt;a href=&quot;https://lektire.skole.hr/&quot;&gt;e-lektire&lt;/a&gt;&amp;quot;, providing ebook versions
of a huge chunk of assigned
reading for Literature classes in elementary and high schools. Its
unsurprising focus is on Croatian literature, but there&#x27;s a fair deal
of European classics available as well: certainly enough to keep one
busy for a while.&lt;/p&gt;
&lt;p&gt;Perusing it, I read two books I skipped as a student: Dostoevsky&#x27;s
&amp;quot;Crime and Punishment&amp;quot;, and Tolstoy&#x27;s &amp;quot;Anna Karenina&amp;quot;. Sadly,
both Croatian translations available through the website were
ancient — one of them from 1916! Consequently, the language and style
was very hermetic and archaic for the modern reader, but not
prohibitively so.&lt;/p&gt;
&lt;p&gt;Making a value judgement on two seminal novels would be too pretentious
even for a very personal text like this one, so let&#x27;s just say I&#x27;m
glad I finally faced my omissions. As a matter of happenstance, a
modern translation of Crime and Punishment was published in 2022... I
might treat myself to a re-read!&lt;/p&gt;
&lt;p&gt;On a less pretentious note, earlier in the year, I spent some time
hanging out with Andrea Camilleri&#x27;s &lt;a href=&quot;https://it.wikipedia.org/wiki/Il_commissario_Montalbano&quot;&gt;commissario
Montalbano&lt;/a&gt;,
a remarkable series of crime novels set in Sicily. My Italian is
nowhere near the level required to read these, so I relied on Croatian
translations here, too: this time the translation felt extraordinarily
successful, almost to the point of absence.&lt;/p&gt;
&lt;p&gt;Non-fiction-wise:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Four Thousand Weeks by Oliver Burkeman: a funny, important, brilliant investigation of humanity&#x27;s relationship with time;&lt;/li&gt;
&lt;li&gt;Stolen Focus by Johann Hari: an unexpectedly broad and nuanced text on our (lack of) ability to focus in modern times;&lt;/li&gt;
&lt;li&gt;An Event, Perhaps by Peter Salmon: a biography of Jacques Derrida which I found worked much better as a nose-dive into his philosophy than as a biography.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Music&lt;/h3&gt;
&lt;p&gt;Not a lot of concerts this year for me. Slight COVID paranoia combined
with post-lockdown laziness did its thing, and I found it very tricky
to get back into it. A few that particularly stood out were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;75 Dollar Bill @ Močvara, Zagreb;&lt;/li&gt;
&lt;li&gt;Anne Gillis &amp;amp; XT (Paul Abbott and Seymour Wright) @ Cafe Oto, London;&lt;/li&gt;
&lt;li&gt;Senyawa @ Močvara, Zagreb.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://www.flickr.com/photos/zweistein/52467470500/in/datetaken-ff/&quot; title=&quot;Anne Gillis, Seymour Wright &amp;amp; Paul Abbot @ Cafe OTO&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/52467470500_a8084edeae_b.jpg&quot; width=&quot;768&quot; alt=&quot;Anne Gillis, Seymour Wright &amp;amp; Paul Abbot @ Cafe OTO&quot;&gt;&lt;/a&gt;&lt;script async src=&quot;//embedr.flickr.com/assets/client-code.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;As far as recorded music is concerned, I&#x27;ll continue the tradition of
listing albums I thought were particularly great in 2022 with Bandcamp /
indie links where available:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Andrew Cyrille, William Parker &amp;amp; Enrico Rava: 2 Blues For Cecil&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://i-voidhangerrecords.bandcamp.com/album/clarity-came-with-a-cool-summers-breeze&quot;&gt;ARKHETH: Clarity Came With A Cool Summer&#x27;s Breeze&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ashenspire.bandcamp.com/album/hostile-architecture&quot;&gt;Ashenspire: Hostile Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rodrigoamado.bandcamp.com/album/love-ghosts&quot;&gt;The Attic - Rodrigo Amado / Gonçalo Almeida / Onno Govaert: Love Ghosts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bjork.bandcamp.com/album/fossora&quot;&gt;Björk: Fossora&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://brankomataja.bandcamp.com/album/traditional-and-folk-songs-of-yugoslavia&quot;&gt;Branko Mataja: Over Fields And Mountains&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chatpile.bandcamp.com/album/gods-country&quot;&gt;Chat Pile: God&#x27;s Country&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thecometiscoming.lnk.to/HyperDimensionalExpansionBeam&quot;&gt;The Comet Is Coming: Hyper-Dimensional Expansion Beam&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Danger Mouse &amp;amp; Black Thought: Cheat Codes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://epochofunlight.bandcamp.com/album/at-war-with-the-multiverse&quot;&gt;Epoch of Unlight: At War With the Multiverse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ericminguselliottsharp.bandcamp.com/album/songs-from-a-rogue-state&quot;&gt;Eric Mingus &amp;amp; Elliott Sharp: Songs From A Rogue State&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://flock.bandcamp.com/album/flock-2&quot;&gt;Flock: Flock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://weinsist.bandcamp.com/album/three-tsuru-origami&quot;&gt;Gabriele Mitelli, John Edwards, Mark Sanders: Three Tsuru Origami&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://southernlord.bandcamp.com/album/gammels-ter-marhaug-higgs-boson&quot;&gt;Gammelsæter &amp;amp; Marhaug - Higgs Boson&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gospel.bandcamp.com/album/the-loser&quot;&gt;Gospel: The Loser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hermanosgutierrez.bandcamp.com/album/el-bueno-y-el-malo&quot;&gt;Hermanos Gutiérrez: El bueno y el malo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://johnescreet-whirlwind.bandcamp.com/album/seismic-shift&quot;&gt;John Escreet: Seismic Shift&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://redmanmehldaumcbrideblade.bandcamp.com/album/longgone&quot;&gt;Joshua Redman Quartet: LongGone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lawrenceenglish.bandcamp.com/album/approach&quot;&gt;Lawrence English: Approach&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://intlanthem.bandcamp.com/album/in-these-times&quot;&gt;Makaya McCraven: In These Times&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marinaherlop.bandcamp.com/album/pripyat&quot;&gt;Marina Herlop: Pripyat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://messaproject.bandcamp.com/album/close&quot;&gt;Messa: Close&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peterbroetzmann.bandcamp.com/album/an-eternal-reminder-of-not-today-live-at-moers&quot;&gt;OXBOW &amp;amp; Peter Brötzmann: An Eternal Reminder of Not Today / Live at Moers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://siavashamini.bandcamp.com/album/songs-for-sad-poets-2&quot;&gt;Siavash Amini &amp;amp; Eugene Thacker: Songs for Sad Poets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peaceville.bandcamp.com/album/shiki&quot;&gt;Sigh: SHIKI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sundowning.bandcamp.com/album/in-the-light-of-defeat-i-cease-to-exist&quot;&gt;Sundowning: In The Light Of Defeat, I Cease To Exist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sundawei.bandcamp.com/album/h-u&quot;&gt;Sun Dawei: Hòu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sirom.bandcamp.com/album/the-liquified-throne-of-simplicity&quot;&gt;Širom: The Liquified Throne of Simplicity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tomniesner.bandcamp.com/album/be-vou&quot;&gt;Tomáš Niesner: Bečvou&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://trevordunnpyroclastic.bandcamp.com/album/s-ances&quot;&gt;Trevor Dunn’s Trio-Convulsant avec Folie à Quatre: Sèances&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wvsorcerer.bandcamp.com/album/dolina-kralja-viktora&quot;&gt;Zagušljivi dim: Dolina kralja Viktora&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also went down the rabbit hole of Albert Ayler’s music, encouraged
by the wonderful remasters released on the important &lt;a href=&quot;https://ezz-thetics.bandcamp.com/&quot;&gt;ezz-thetics
series&lt;/a&gt; by Hat Hut.&lt;/p&gt;
&lt;h3&gt;Politics&lt;/h3&gt;
&lt;p&gt;As mentioned, the Croatian green-left party Možemo! and their local
partner Zagreb je NAŠ!, both featuring yours truly as a member, won the
local election in Zagreb in 2021. Managing a big city like Zagreb would
be tricky in any case, but after 20+ years of corrupt government, it
proved to be even more challenging than expected.&lt;/p&gt;
&lt;p&gt;I&#x27;ve carried on coordinating the parties&#x27; IT working group together
with Dražen, and a few of us were trying to make sense of the city&#x27;s
digital infrastructure by volunteering in one of the mayor&#x27;s working
groups. After more than a year doing so, I feel significantly more
informed on the public procurement legislature of Croatia, but terribly
overwhelmed by the scale &amp;amp; velocity of change required for tangible
progress.&lt;/p&gt;
&lt;p&gt;That said, I met quite a few smart people working in the city
administration, and found parts of the infrastructure to be in much
better shape than I could ever imagine.&lt;/p&gt;
&lt;h3&gt;Health&lt;/h3&gt;
&lt;p&gt;Health-wise, I finally had to face an issue I’ve been fighting since
elementary school: my notoriously unstable shoulder joint. Early in
the year, I suffered another luxation. I stopped counting somewhere
around dislocation #30, and I took this as a sign to finally go ahead
with Bankart repair surgery.&lt;/p&gt;
&lt;p&gt;I was in good hands in Zagreb’s Traumatology Clinic: the surgery
itself was as uneventful as one could hope it’d be. The recovery
was… long and painful. My range of motion was non-existent for the
better part of the month post-op, and the pain during the first week
was intense. Certain aspects of physical therapy were mentally
draining: I felt prepared for physical pain (I wasn’t), but the stress
of having to go through shoulder movements which would previously
imply instant dislocation — that was on an entirely different level.&lt;/p&gt;
&lt;p&gt;Luckily, I had Sara by my side, a good therapist, and visible, if
slow, progress on a weekly basis. All of that helped keep my spirits
up, and here we are. My range of motion still isn’t 100% there — it’s
unclear if it’ll ever be — but the pain is gone, the shoulder feels
stable, and I can do everything I used to and more.&lt;/p&gt;
&lt;h3&gt;Misc.&lt;/h3&gt;
&lt;p&gt;The only “side-project” worth mentioning is a bit of technical support
I do for my good friend IMS with his fantastic fictional podcast, &lt;a href=&quot;https://programaudioseries.com/&quot;&gt;The
Program audio series&lt;/a&gt;. Other than
regular maintenance of the website, I implemented a very simple rating
widget for individual episodes using &lt;a href=&quot;https://deno.com/deploy&quot;&gt;Deno
Deploy&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://neon.tech/&quot;&gt;Neon&lt;/a&gt;. I
enjoyed the development experience between the two — both have their
rough edges UI-wise, but the platforms themselves work well.&lt;/p&gt;
&lt;p&gt;This was also my first time using Web Components in anger: I reused
the &lt;a href=&quot;https://nudeui.com/index.html&quot;&gt;Nude UI&lt;/a&gt; &lt;a href=&quot;https://nudeui.com/nd-rating/&quot;&gt;rating
widget&lt;/a&gt; which pleasantly surprised me
with its simplicity and ergonomics.&lt;/p&gt;
&lt;p&gt;In other news, I slightly redesigned this website to keep up with the
times. To top that, I wrote a very simple Markdown static site
generator thingy in Rust, which was a very entertaining exercise. Now
I have a bit more flexibility with regards to the organization here —
let’s see if I actually make use of it.&lt;/p&gt;
&lt;h3&gt;Plans for 2023&lt;/h3&gt;
&lt;p&gt;Simplicity seems to have worked for 2021, so let&#x27;s unimaginatively give
that another shot. This year wrapped up with both Sara and myself being
healthy, safe &amp;amp; sound, and having stable careers — can’t really
ask for much more in these times.&lt;/p&gt;
&lt;p&gt;Thus, in 2023, I&#x27;d like to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;graduate, and for bonus points, visit the graduation ceremony in
Atlanta: it&#x27;s cheesy, but COVID meant I couldn&#x27;t attend my
bachelor&#x27;s ceremony, and it&#x27;s something I&#x27;d be keen to
experience;&lt;/li&gt;
&lt;li&gt;help implement useful, impactful digital technologies in Zagreb;&lt;/li&gt;
&lt;li&gt;read, listen to music, have fun;&lt;/li&gt;
&lt;li&gt;shoot some photos, for bonus points — while travelling;&lt;/li&gt;
&lt;li&gt;be a good and supportive partner;&lt;/li&gt;
&lt;li&gt;live to see 2024.&lt;/li&gt;
&lt;/ul&gt;
</content>
    
    <category term="review"></category>
    
  </entry>
  
  <entry>
    <title type="html">2020: A Year In Review</title>
    <link href="https://nikola.plejic.com/blog/2020-a-year-in-review" rel="alternate"></link>
    <published>2021-01-11T16:30:00+01:00</published>
    <updated>2021-01-11T16:30:00+01:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2021-01-11:/blog/2020-a-year-in-review</id>
    <summary type="html">...wherein I try to make sense of the mess that was 2020. Pandemics, earthquakes, music, books &amp;amp; plans for the future that may not be.
</summary>
    <content type="html">&lt;p&gt;I liked going back to my &lt;a href=&quot;https://nikola.plejic.com/blog/2019-a-year-in-review/&quot;&gt;previous “year in review”
post&lt;/a&gt;, so let’s keep it
up. I particularly liked how funny it looks in retrospect. Having good sense of
humor is important.&lt;/p&gt;
&lt;p&gt;So, 2020… Whew. Oh boy.&lt;/p&gt;
&lt;h3&gt;The Ugly&lt;/h3&gt;
&lt;p&gt;COVID-19 happened very early on. Luckily, it did not seriously affect anyone
close to me, but it did change everyone’s approach to living.&lt;/p&gt;
&lt;p&gt;In March, Zagreb got hit by a &lt;a href=&quot;https://en.wikipedia.org/wiki/2020_Zagreb_earthquake&quot;&gt;fairly strong M=5.3
earthquake&lt;/a&gt;. The city and
its surroundings are still recovering: the renovation project is painfully
slow, and the leadership was dreadful. Me and my partner were dislocated for a
few months, but have since returned to our rental.&lt;/p&gt;
&lt;p&gt;In December, Petrinja got hit by a &lt;a href=&quot;https://en.wikipedia.org/wiki/2020_Petrinja_earthquake&quot;&gt;devastating M=6.4
earthquake&lt;/a&gt; which
basically destroyed several smaller cities, a lot of villages, and caused
widespread damage in central Croatia. The aftershocks are still strong, and if
Zagreb is any indicator, the recovery will be ongoing for years to come.&lt;/p&gt;
&lt;p&gt;It’s been a traumatic year all-around, and I’m sure we’ll all be dealing with
it for quite a while.&lt;/p&gt;
&lt;h3&gt;“Academics”&lt;/h3&gt;
&lt;p&gt;In 2018, I have started pursuing a &lt;a href=&quot;http://www.openuniversity.edu/courses/qualifications/r51&quot;&gt;BSc in Physics at The Open
University&lt;/a&gt;. This
year, I finally graduated — with first class honors. It was probably the
pinnacle of the year, and one of my prouder achievements.&lt;/p&gt;
&lt;p&gt;I was very happy with the distance learning approach. While I don’t see
face-to-face teaching disappearing from the face of the Earth any time soon, I
believe there’s much to explore and experiment within that approach to
teaching.&lt;/p&gt;
&lt;p&gt;I will be applying to Georgia Tech’s &lt;a href=&quot;https://omscs.gatech.edu/&quot;&gt;Online MS in Computer
Science&lt;/a&gt; in the Fall 2021 semester. I seem to be on
a roll, and it’d be a shame to stop now.&lt;/p&gt;
&lt;h3&gt;Travel&lt;/h3&gt;
&lt;p&gt;COVID-19 meant I was mostly roaming around Croatia:
&lt;a href=&quot;https://www.flickr.com/photos/zweistein/albums/72157715056155993&quot;&gt;Vis&lt;/a&gt;,
&lt;a href=&quot;https://www.flickr.com/photos/zweistein/albums/72157716500325723&quot;&gt;Prvić&lt;/a&gt;,
&lt;a href=&quot;https://www.flickr.com/photos/zweistein/albums/72157716353750581&quot;&gt;Fužine&lt;/a&gt;,
&lt;a href=&quot;https://www.flickr.com/photos/zweistein/albums/72157716500325723&quot;&gt;Ozalj&lt;/a&gt;,
Plitvice. I very much did not mind that.&lt;/p&gt;
&lt;h3&gt;Books&lt;/h3&gt;
&lt;p&gt;This year, I’ve read a disproportional amount of fiction written in my mother
tongue. I very much did not mind that, either. A couple, regardless of genre,
that I found particularly impactful:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Judgment of Richard Richter and W by Igor Štiks&lt;/li&gt;
&lt;li&gt;Selected Poems by Constantinos P. Cavafy&lt;/li&gt;
&lt;li&gt;Huzur by Martina Mlinarević Sopta&lt;/li&gt;
&lt;li&gt;Meho by Amin Kaplan&lt;/li&gt;
&lt;li&gt;Permanent Record by Edward Snowden&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dreamsongs.com/Files/PatternsOfSoftware.pdf&quot;&gt;Patterns of Software&lt;/a&gt;
by Richard P. Gabriel&lt;/li&gt;
&lt;li&gt;Homo Faber by Max Frisch&lt;/li&gt;
&lt;li&gt;Blue Horses by Mary Oliver&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Music&lt;/h3&gt;
&lt;p&gt;I was slightly less mindful of music this year than usual. However, here’s a
few albums I particularly enjoyed, in alphabetical order with Bandcamp or other
indie-ish purchase links where available:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ambrose Akinmusire: &lt;a href=&quot;https://ambroseakinmusire.lnk.to/onthetenderspot&quot;&gt;on the tender spot of every calloused moment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ancst: &lt;a href=&quot;https://angstnoise.bandcamp.com/album/summits-of-despondency&quot;&gt;Summits of Despondency&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Brad Mehldau: Suite: &lt;a href=&quot;https://bradmehldau.bandcamp.com/album/suite-april-2020&quot;&gt;April 2020&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;clipping.:  &lt;a href=&quot;https://clppng.bandcamp.com/album/there-existed-an-addiction-to-blood&quot;&gt;There Existed An Addiction To Blood&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Deftones: Ohms&lt;/li&gt;
&lt;li&gt;Emma Ruth Rundle &amp;amp; Thou: &lt;a href=&quot;https://thou.bandcamp.com/album/may-our-chambers-be-full&quot;&gt;May Our Chambers Be Full&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Expander: &lt;a href=&quot;https://expander.bandcamp.com/album/neuropunk-boostergang&quot;&gt;Neuropunk Boostergang&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fiona Apple: Fetch the Bolt Cutters&lt;/li&gt;
&lt;li&gt;FIRE-TOOLZ: &lt;a href=&quot;https://fire-toolz.bandcamp.com/album/rainbow-bridge&quot;&gt;Rainbow Bridge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Giorgi Mikadze: &lt;a href=&quot;https://giorgimikadze.bandcamp.com/album/georgian-microjamz&quot;&gt;Georgian Microjamz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Greg Fox: &lt;a href=&quot;https://gregfox.bandcamp.com/album/contact&quot;&gt;Contact&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Haken: &lt;a href=&quot;https://haken.lnk.to/Virus&quot;&gt;Virus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Imperial Triumphant: Alphaville&lt;/li&gt;
&lt;li&gt;Ingrid Laubrock: &lt;a href=&quot;https://ingrid-laubrock.bandcamp.com/album/contemporary-chaos-practices&quot;&gt;Contemporary Chaos Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Meslamtaea: &lt;a href=&quot;https://tartarusrecords.com/album/geketend-in-de-schaduw-van-het-leven&quot;&gt;Geketend in de schaduw van het leven&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Open Mike Eagle: &lt;a href=&quot;https://openmikeeagle.bandcamp.com/album/anime-trauma-and-divorce&quot;&gt;Anime, Trauma and Divorce&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Rudresh Mahanthappa: &lt;a href=&quot;https://rudreshmahanthappa-whirlwind.bandcamp.com/album/hero-trio&quot;&gt;Hero Trio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Run the Jewels: &lt;a href=&quot;https://runthejewels.com/music/rtj4/&quot;&gt;RTJ4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sumac: &lt;a href=&quot;https://sumac.bandcamp.com/album/may-you-be-held&quot;&gt;May You Be Held&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;tētēma: &lt;a href=&quot;https://tetema.bandcamp.com/album/necroscape&quot;&gt;Necroscape&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The End: &lt;a href=&quot;https://endisnear.bandcamp.com/album/allt-r-intet&quot;&gt;Allt Är Intet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The Ocean: &lt;a href=&quot;https://theocean.bandcamp.com/album/phanerozoic-ii-mesozoic-cenozoic&quot;&gt;Phanerozoic II: Mesozoic | Cenozoic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Thy Catafalque: &lt;a href=&quot;https://thycatafalqueuk.bandcamp.com/album/naiv&quot;&gt;Naiv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Villaelvin: &lt;a href=&quot;https://hakunakulala.bandcamp.com/album/headroof&quot;&gt;Headroof&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Zeal &amp;amp; Ardor: &lt;a href=&quot;https://zealandardor.bandcamp.com/album/wake-of-a-nation-ep&quot;&gt;Wake of a Nation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Other&lt;/h3&gt;
&lt;h4&gt;Photography&lt;/h4&gt;
&lt;p&gt;I bought a new camera (a Canon EOS M6 Mark II) and took &lt;a href=&quot;https://www.flickr.com/photos/zweistein/&quot;&gt;a fair amount of
photos&lt;/a&gt;. I don’t do much
conventionally creative work so I’m enjoying playing around with the camera and
post-processing — with various degrees of success. It’s also a great motivator
to go outside and move.&lt;/p&gt;
&lt;p&gt;I really liked this one:&lt;/p&gt;
&lt;center&gt;
&lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://www.flickr.com/photos/zweistein/50632995283/in/datetaken/&quot; title=&quot;Downhill&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/50632995283_f38b8669bf.jpg&quot; width=&quot;500&quot; height=&quot;333&quot; alt=&quot;Downhill&quot;&gt;&lt;/a&gt;&lt;script async src=&quot;//embedr.flickr.com/assets/client-code.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/center&gt;
&lt;p&gt;For the first time ever, I made a photobook of photos taken during a trip I
went to with my partner in 2018! It turned out really well, and I think I’ll be
doing more of these in the future.&lt;/p&gt;
&lt;center&gt;&lt;img src=&quot;/images/2018-photobook.jpg&quot; alt=&quot;A picture of a photobook.&quot; /&gt;&lt;/center&gt;
&lt;h4&gt;Soldering&lt;/h4&gt;
&lt;p&gt;Last year, one of my plans was to learn some electronics and embedded
programming, and I’ve managed to at least get that going by buying a &lt;a href=&quot;https://github.com/BenRoe/Lily58L-Build-Guide/&quot;&gt;Lily58L
keyboard kit&lt;/a&gt; and assembling
the thing! I love it, and it’s the keyboard I now use daily. Here’s me trying
really hard not to burn myself:&lt;/p&gt;
&lt;center&gt;&lt;img src=&quot;/images/soldering.jpg&quot; alt=&quot;A picture of me soldering.&quot; /&gt;&lt;/center&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;https://lovro.oreskovic.me/&quot;&gt;Lovro&lt;/a&gt; for both teaching me how to
solder &amp;amp; find my way around the project, as well as for taking this picture! It
was an incredibly fun feat.&lt;/p&gt;
&lt;h4&gt;Politics&lt;/h4&gt;
&lt;p&gt;In the recent election, &lt;a href=&quot;https://www.mozemo.hr/&quot;&gt;Možemo!&lt;/a&gt;, the green/left
political party featuring yours truly as a member, ended up with four seats in
the Croatian Parliament. As limited as it is, this was a remarkable result, and
a refreshing change to the parliamentary structure.&lt;/p&gt;
&lt;h3&gt;Plans for 2021&lt;/h3&gt;
&lt;p&gt;This time I’ll try to keep it simple. Throughout 2021, I’d like to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;get vaccinated against COVID-19;&lt;/li&gt;
&lt;li&gt;get into Georgia Tech’s MS in CS program;&lt;/li&gt;
&lt;li&gt;read, listen to music;&lt;/li&gt;
&lt;li&gt;take some pictures, preferably while travelling;&lt;/li&gt;
&lt;li&gt;survive, preferably without any serious long-term consequences.&lt;/li&gt;
&lt;/ul&gt;
</content>
    
    <category term="review"></category>
    
  </entry>
  
  <entry>
    <title type="html">org the ultimate API client</title>
    <link href="https://nikola.plejic.com/blog/org-the-ultimate-api-client" rel="alternate"></link>
    <published>2020-12-03T18:20:00+01:00</published>
    <updated>2020-12-03T18:20:00+01:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2020-12-03:/blog/org-the-ultimate-api-client</id>
    <summary type="html">Using emacs &amp;amp; org-mode as an exploratory API client.
</summary>
    <content type="html">&lt;p&gt;There’s a genre of software I like to call “GUIs for curl”: Postman,
&lt;a href=&quot;https://patchgirl.io/&quot;&gt;PatchGirl&lt;/a&gt;, and others. Their aim is to make
web developers’ lives easier by providing nice graphical interfaces
for executing HTTP requests. I never got around to get into a habit of
using them since they either had clunky UIs or were not free
software. Thus, I defaulted to using curl in a shell.&lt;/p&gt;
&lt;p&gt;With time, I did come up with a wishlist of things I wish I could do
with this setup. This boils down to being able to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;execute HTTP requests&lt;/li&gt;
&lt;li&gt;parse, analyze and extract data from API responses&lt;/li&gt;
&lt;li&gt;“compose” API requests by using parts of the response of one API request in
the body of another
&lt;ul&gt;
&lt;li&gt;this is most notable during authentication: somewhere early on in your
workflow you’ll usually get an access token that you need to pass in each
subsequent request&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;“bookmark” (persist) well-formulated API calls&lt;/li&gt;
&lt;li&gt;annotate queries&lt;/li&gt;
&lt;li&gt;tag the queries&lt;/li&gt;
&lt;li&gt;share your queries with others&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I tend to spend my working days in Emacs. Unlike the average Emacs person, I don’t
really &lt;em&gt;live&lt;/em&gt; in Emacs, thus I don’t mind an occasional context shift,
yet a decent integrated solution is always appreciated. As it turns
out, &lt;a href=&quot;https://orgmode.org/&quot;&gt;org-mode&lt;/a&gt; ticks all the boxes (as it
usually does).&lt;/p&gt;
&lt;h2&gt;Executing HTTP requests&lt;/h2&gt;
&lt;p&gt;You could certainly use
&lt;a href=&quot;https://github.com/tkf/emacs-request&quot;&gt;request.el&lt;/a&gt; to send HTTP
requests out into the world. However, I just use an
&lt;a href=&quot;https://orgmode.org/worg/org-contrib/babel/intro.html&quot;&gt;org-babel&lt;/a&gt;
“shell” block and &lt;code&gt;curl&lt;/code&gt; like a barbarian. I believe &lt;code&gt;curl&lt;/code&gt; is the
de-facto standard HTTP client, and it’s familiar to a lot of
people. This approach has the extra benefit of transferring nicely
into the command-line should it prove necessary.&lt;/p&gt;
&lt;p&gt;Here’s a sample HTTP POST request:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;* Example API Request: Authentication

  #+NAME: auth
  #+begin_src shell :cache no :results verbatim
    curl -X POST \
      --data &amp;quot;grant_type=password&amp;amp;username=nikola&amp;amp;password=hunter22&amp;amp;scope=all&amp;quot; \
      http://localhost:8080/v1/auth
  #+end_src

  #+RESULTS[...]: auth
  : {&amp;quot;access_token&amp;quot;: &amp;quot;f744cb5c55d2946c4jzb3d7d61fb4850967.dae42e4e4d40&amp;quot;, &amp;quot;expires&amp;quot;: &amp;quot;...&amp;quot;}
  #+end_src
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;CTRL-c CTRL-c&lt;/code&gt; (or &lt;code&gt;leader leader&lt;/code&gt; for evil folks) executes the block and
outputs the result to be used further in the document. Which leads us to…&lt;/p&gt;
&lt;h2&gt;Parsing, analyzing and extracting data in API responses&lt;/h2&gt;
&lt;p&gt;Most APIs these days output JSON or XML, thus having results in the
form of plain strings isn’t very useful.&lt;/p&gt;
&lt;p&gt;Let’s say we’re only interested in the &lt;code&gt;access_token&lt;/code&gt; property of the response
to the request executed above. Again, you could very legitimately &lt;a href=&quot;https://www.gnu.org/software/emacs/manual/html_node/elisp/Parsing-JSON.html&quot;&gt;manipulate
that data in
elisp&lt;/a&gt;,
but since we’re in the shell, we can pipe the data to another process:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;  #+NAME: auth
  #+begin_src shell :cache no :results verbatim
    curl -X POST \
      --data &amp;quot;grant_type=password&amp;amp;username=nikola&amp;amp;password=hunter22&amp;amp;scope=all&amp;quot; \
      http://localhost:8080/v1/auth | jq .access_token
  #+end_src

  #+RESULTS[...]: auth
  : f744cb5c55d2946c4jzb3d7d61fb4850967.dae42e4e4d40
  #+end_src
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This uses &lt;a href=&quot;https://stedolan.github.io/jq/&quot;&gt;jq&lt;/a&gt;, a nice little tool for
manipulating JSON documents on the command line. There are similar tools for
XML/XPath as well.&lt;/p&gt;
&lt;h2&gt;Using API results as API parameters&lt;/h2&gt;
&lt;p&gt;Using some wonderful features of org-babel, you can trivially use results of
previous commands in subsequent code blocks:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;  #+begin_src shell :var t=auth :results verbatim :cache no
    curl \
        -H &amp;quot;Authorization: Bearer ${t}&amp;quot; \
        http://localhost:8080/v1/endpoint | jq .
  #+end_src
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will capture the result of our &lt;code&gt;auth&lt;/code&gt; code block into a variable called
&lt;code&gt;t&lt;/code&gt;, which will then be available within the code block as a regular variable in
your language of choice. org-babel will keep track of dependencies and offer to
execute any code blocks that are necessary to figure out all of the variables
used by the current one.&lt;/p&gt;
&lt;p&gt;This has other handy use-cases as well. Need to generate some JSON for your API
requests? Just do it in your favorite language:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;  #+NAME: json_data
  #+begin_src python :results verbatim :python python3
    import json
    import random

    return json.dumps({&amp;quot;param1&amp;quot;: random.randint(0, 100)})
  #+end_src

  #+RESULTS: json_data
  : {&amp;quot;param1&amp;quot;: 49}

  #+begin_src shell :var data=json_data :var t=token :results verbatim :cache no
    curl \
        -X POST \
        -H &amp;quot;Authorization: Bearer ${t}&amp;quot; \
        -H &amp;quot;Content-Type: application/json&amp;quot; \
        --data &amp;quot;${data}&amp;quot; \
        https://httpbin.org/post | jq .
  #+end_src
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Bookmarking, tagging and annotating API calls&lt;/h2&gt;
&lt;p&gt;org-mode files are text files, so each entry is automatically “persisted” when
you save the file. Everything outside of code blocks is regular org, and org
works well for taking notes! You can embed images, add tables, annotate,
whatever. For tagging, I just use org’s built in tagging facilities at the
heading level.&lt;/p&gt;
&lt;h2&gt;Sharing&lt;/h2&gt;
&lt;p&gt;org-mode files are plain text files, so anyone can open them in their prefered
text editor and have a reasonably decent reading experience. But org can also
export to various formats, and exporting to HTML will give you readable API
documentation for free!&lt;/p&gt;
&lt;p&gt;By default, org-babel will only export source blocks — not the results. This
is good default behavior since sometimes API results involve secrets (e.g.
access tokens). To override this, annotate your code block with &lt;code&gt;:exports both&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;  #+NAME: auth
  #+begin_src shell :cache no :results verbatim :exports both
    curl -X POST \
      --data &amp;quot;grant_type=password&amp;amp;username=nikola&amp;amp;password=hunter22&amp;amp;scope=all&amp;quot; \
      http://localhost:8080/v1/auth
  #+end_src

  #+RESULTS[...]: auth
  : {&amp;quot;access_token&amp;quot;: &amp;quot;f744cb5c55d2946c4jzb3d7d61fb4850967.dae42e4e4d40&amp;quot;, &amp;quot;expires&amp;quot;: &amp;quot;...&amp;quot;}
  #+end_src
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Problems&lt;/h2&gt;
&lt;p&gt;When exporting, org will export your code blocks literally — any variables will
be exported verbatim and not replaced by its respective value. This may or may
not be desired — I think it’s acceptable, but it can be confusing. There may be
a snippet of Elisp somewhere that makes this go away.&lt;/p&gt;
&lt;h2&gt;Feedback&lt;/h2&gt;
&lt;p&gt;Feedback, corrections, comments &amp;amp; co. are welcome: you can &lt;a href=&quot;/contact.html&quot;&gt;write me an email or
contact me on Matrix&lt;/a&gt;.&lt;/p&gt;
</content>
    
    <category term="web"></category>
    
    <category term="HTTP"></category>
    
    <category term="emacs"></category>
    
  </entry>
  
  <entry>
    <title type="html">Living and Coding In Times of Crises</title>
    <link href="https://nikola.plejic.com/blog/living-and-coding-in-times-of-crises" rel="alternate"></link>
    <published>2020-03-28T11:08:00+01:00</published>
    <updated>2020-03-28T11:08:00+01:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2020-03-28:/blog/living-and-coding-in-times-of-crises</id>
    <summary type="html">...wherein I try to convince myself that everything will be alright.
</summary>
    <content type="html">&lt;p&gt;&lt;em&gt;Note: These are a few slightly melodramatic thoughts written in the aftermath
of several somewhat traumatic weeks involving a pandemic, an earthquake, and a
substantial change in the everyday. The few links that are scattered around I
find interesting and important; the rest is here as a permanent reminder to
myself. Hope everyone&#x27;s well. Wash your hands.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I had hoped I would be able to write the word &quot;crisis&quot; in singular in the title
of this post, but life tends to be a prescriptivist bastard. Writing this in the
middle of a pandemic, after a non-catastrophic, yet devastating earthquake in
Zagreb on Sunday, feels surreal. The apartment I just recently moved into
roughed up, parts of it possibly significantly damaged, unable to socialize
even in the most mundane of ways, exams canceled. Two events tearing into the
fabric of what one considers the most social and the most personal, at the same
time... and I&#x27;m lucky to be healthy, safe, and sound.&lt;/p&gt;
&lt;p&gt;It&#x27;s interesting how disruptive events quickly redefine the &quot;normal&quot;. Just a few
weeks ago, no one could imagine being quarantined indefinitely, yet here we are
in week one of being unable to leave our place of residence. Redefining &lt;em&gt;normal&lt;/em&gt;
also tends to give way to malice, as we witness more and more calls to increase
surveillance and invade people&#x27;s privacy in order to (at least formally) keep
track of the spread and unwanted public gatherings. Once again the political
emerges as inseparable from the technological to the detriment of the
techno-elite. Go figure.&lt;/p&gt;
&lt;p&gt;Science, with all of its problems, gives us hope. Both of these events have been
properly assessed: epidemiologists and infectious disease experts have been
warning us of the possible consequences of SARS-CoV-2 weeks before the situation
got out of control outside of China, and seismologists have been fairly clear
that a strong earthquake around Zagreb is imminent. The problem with complex
systems is that they&#x27;re hard to grasp even for experts, and our intuition for
statistics is slim to none. Even when we do manage to become aware of some
aspects of the risks involved, &lt;a href=&quot;https://mindhacks.com/2020/03/20/do-we-suffer-behavioural-fatigue-for-pandemic-prevention-measures/&quot;&gt;this tends to fall apart as quickly as it
materializes&lt;/a&gt;.
Coupled with the fear of &quot;collapsing markets&quot; and their existential
consequences, this often means we&#x27;re more comfortable with the status quo than
with taking action. Informed apathy can be as dangerous as uninformed sympathy.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;As an aside, existential terror is a powerful weapon, and it was interesting to
observe its effects on one&#x27;s thoughts and approaches to life. I am well-aware
that there are no reliable methods of predicting earthquakes to any precise
extent, yet when on the day of the earthquake someone blurted out a hoax that
&quot;there&#x27;s a stronger one coming at 8:45am&quot;, for a few moments it seemed like the
most inevitable and obvious thing in the world. I think I&#x27;ve revisited that
highly instructive moment more often than the earthquake itself.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Even though it&#x27;s impossible not to be affected by this, people in IT, and
primarily in software, seem to be in a unique position to handle this situation
better than the average worker. There &lt;strong&gt;will&lt;/strong&gt; be consequences, but the vast
amount of money in tech means there&#x27;s less chance of being fired, especially in
times of enormous reliance on the tech infrastructure. The level of
technological literacy gives us an enormous advantage in navigating the
inevitable mess during the initial period of adjustment. A lot of us have been
able to seamlessly switch to working from home, if we haven&#x27;t already been doing
so.&lt;/p&gt;
&lt;p&gt;I believe this gives us a fair deal of responsibility, too: it&#x27;s increasingly
important to use our skills to help the ones in need. Large-scale tragedies take
a psychological and organizational toll, and &lt;a href=&quot;https://coronavirustechhandbook.com/home&quot;&gt;we have tools to
help&lt;/a&gt;. This means
being aware of the fact that the technology we produce is not as obvious as it
might seem, and that people often need assistance and support which isn&#x27;t a sign
of weakness or lack of competence, but rather a natural consequence of using a
new tool in an unfamiliar setting. It also means using the free time that
isolation gives us to help people and organizations by providing them with
necessary technological infrastructure and assistance.&lt;/p&gt;
&lt;p&gt;More in-depth political analyses have been written by more eloquent and
better-read comrades over at &lt;a href=&quot;https://syllabus.pirate.care/topic/coronanotes/&quot;&gt;Pirate Care, focused on COVID-19 in
particular&lt;/a&gt;, and by &lt;a href=&quot;http://tom.medak.click/posts/earthquake/&quot;&gt;Tomislav, focused
on the pandemic in combination with the
earthquake&lt;/a&gt;. I can just echo that I
find it important not to let our imagination atrophy and our empathy to subside,
and that I hope the lessons we learn here will be the ones of solidarity and
care. ☭&lt;/p&gt;
</content>
    
    <category term="journal"></category>
    
  </entry>
  
  <entry>
    <title type="html">Book Review: “How to Read a Book”</title>
    <link href="https://nikola.plejic.com/blog/book-review-how-to-read-a-book" rel="alternate"></link>
    <published>2020-01-09T14:11:00+01:00</published>
    <updated>2020-01-09T14:11:00+01:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2020-01-09:/blog/book-review-how-to-read-a-book</id>
    <summary type="html">I don&#x27;t really review the books I read, but I decided to write a short blurb about the oft-recommended “How to Read a Book: The Classic Guide to Intelligent Reading” by  Mortimer J. Adler and Charles Van Doren.
</summary>
    <content type="html">&lt;p&gt;I don’t really review the books I read, but I decided to write a short blurb
about the oft-recommended “How to Read a Book: The Classic Guide to Intelligent
Reading” by  Mortimer J. Adler and Charles Van Doren. I’ve originally posted it
on
&lt;a href=&quot;https://www.goodreads.com/review/show/3126410471?type=review#rating_257202960&quot;&gt;Goodreads&lt;/a&gt;,
but I’m publishing it here, too, for good measure:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There’s a lot to not like about this book: the slightly hermetic style, the
occasional sexist slur, the subtly condescending tone, its exclusive–and,
grantedly, somewhat apologetic–orientation to the “Western” literary canon,
and the fact that the “recommended reading list” includes a single non-male
author.&lt;/p&gt;
&lt;p&gt;Keeping in mind that it was written in the 1940s, and despite these
non-negligible shortcomings, I still find the book thoroughly insightful and
valuable for what it is: a manual for analytical and comparative reading of
“difficult” books, for whatever definition of “difficult” the reader might
choose. It’s a deeply practical book, sometimes to a fault, and many of its
takeaways might seem obvious. Yet, when outlined in a systematic and formal
way, with plenty of examples and illustrations, I believe they give a good
framework for approaching demanding literature.&lt;/p&gt;
&lt;p&gt;Most importantly, the book forces you to think critically about the act of
reading, and this might be its greatest contribution of all: it has certainly
made me think about the way I approach books, and it has given me a few new
tools to do so.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    
    <category term="book review"></category>
    
  </entry>
  
  <entry>
    <title type="html">2019: A Year In Review</title>
    <link href="https://nikola.plejic.com/blog/2019-a-year-in-review" rel="alternate"></link>
    <published>2020-01-03T10:20:00+01:00</published>
    <updated>2020-01-03T10:20:00+01:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2020-01-03:/blog/2019-a-year-in-review</id>
    <summary type="html">...wherein I write my first yearly review.
</summary>
    <content type="html">&lt;p&gt;I never wrote one of these, but I’ve come to realize that I find reading other
people’s posts enjoyable and vaguely inspirational.&lt;/p&gt;
&lt;p&gt;Without further ado, some things that stood out for me in 2019…&lt;/p&gt;
&lt;h3&gt;“Academics”&lt;/h3&gt;
&lt;p&gt;In 2018, I have started pursuing a &lt;a href=&quot;http://www.openuniversity.edu/courses/qualifications/q64-phy&quot;&gt;BSc in Physics at The Open
University&lt;/a&gt;. I
transferred some credits from my previous unfinished studies, and ended up with
four courses to go before earning the degree.&lt;/p&gt;
&lt;p&gt;I have finished—with distinction—two of them in the year 2018/2019: “The Quantum
World” (an undergrad quantum physics course) and “Electromagnetism” (an
undergrad course in classical electrodynamics).&lt;/p&gt;
&lt;p&gt;The entire pursuit was (and continues to be) fairly challenging. Distance
learning is an interesting feat that seems to be working well. I believe it
eliminates an entire class of fallacies I’m fairly prone on making, primarily
the one of confusing “presence” with actual work.&lt;/p&gt;
&lt;p&gt;This was also my most prominent “personal project” of the year, and it seems
this is very likely to be the case for 2020 as well.&lt;/p&gt;
&lt;h3&gt;Meetups, Conferences &amp;amp; Talks&lt;/h3&gt;
&lt;p&gt;A couple of colleagues and I have started the &lt;a href=&quot;https://www.meetup.com/Zagreb-Rust-Meetup/&quot;&gt;Zagreb Rust
meetup&lt;/a&gt;. It’s been reasonably
successful, attracting a nice audience of 10-20 people at each of its eight
iterations.&lt;/p&gt;
&lt;p&gt;Talks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zagreb Rust Meetup: &lt;a href=&quot;http://nikola.plejic.com/blog/rust-web-services-zagreb-meetup/&quot;&gt;Developing web services in
Rust&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;WebCamp Zagreb 2019: &lt;a href=&quot;https://razmjenavjestina.gitlab.io/rust-workshop/&quot;&gt;Getting to grips with
Rust&lt;/a&gt; (a whole-day
introductory Rust workshop, with Alan Pavičić)&lt;/li&gt;
&lt;li&gt;Zagreb Rust Meetup: &lt;a href=&quot;https://gitlab.com/razmjenavjestina/rust-meetup-async/blob/master/rust_async.org&quot;&gt;Asynchronous programming and
Rust&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Travel&lt;/h3&gt;
&lt;p&gt;London, Sicily (Castelbuono, Cefalù, Palermo),
&lt;a href=&quot;https://www.flickr.com/photos/zweistein/albums/72157712072190681&quot;&gt;Dublin&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Books&lt;/h3&gt;
&lt;p&gt;A couple of books I’ve read that have been particularly impactful:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.retrievalpractice.org/make-it-stick&quot;&gt;Make it Stick: The Science of Successful
Learning&lt;/a&gt; ~ Peter C. Brown,
Henry L. Roediger, III, and Mark A. McDaniel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.scotthyoung.com/blog/ultralearning/&quot;&gt;Ultralearning: Timeless Techniques for Mastering Hard
Skills&lt;/a&gt; ~ Scott H. Young&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jamesclear.com/atomic-habits&quot;&gt;Atomic Habits: An Easy &amp;amp; Proven Way to Build Good Habits &amp;amp; Break Bad
Ones&lt;/a&gt; ~ James Clear&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.penguinrandomhouse.com/books/250954/three-moments-of-an-explosion-by-china-mieville/&quot;&gt;Three Moments of an
Explosion&lt;/a&gt;
~ China Miéville&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Music&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.last.fm/user/zweistein_hr&quot;&gt;Last.fm&lt;/a&gt; is still keeping track of the
vast majority of the music I listen to. I have yet to listen to a lot of albums
that were very prominent in 2019, but a few that stood out (with Bandcamp links
where available):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FKA twigs: Magdalene&lt;/li&gt;
&lt;li&gt;clipping.: &lt;a href=&quot;https://clppng.bandcamp.com/album/there-existed-an-addiction-to-blood&quot;&gt;There Existed An Addiction To
Blood&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Matmos: &lt;a href=&quot;https://matmos.bandcamp.com/album/plastic-anniversary&quot;&gt;Plastic
Anniversary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Inter Arma: &lt;a href=&quot;https://interarma.bandcamp.com/album/sulphur-english&quot;&gt;Sulphur
English&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Waste of Space Orchestra:
&lt;a href=&quot;https://wasteofspaceorchestra.bandcamp.com/album/syntheosis&quot;&gt;Syntheosis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Black Milk: &lt;a href=&quot;https://blackmilk.bandcamp.com/album/dive-ep&quot;&gt;DiVE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Alexander Noice: &lt;a href=&quot;https://orendarecords.bandcamp.com/album/noice&quot;&gt;NOICE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Liturgy: &lt;a href=&quot;https://liturgy.bandcamp.com/album/h-a-q-q&quot;&gt;H.A.Q.Q.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;LIUN + The Science Fiction Band: &lt;a href=&quot;https://luciacadotsch.bandcamp.com/album/time-rewind&quot;&gt;Time
Rewind&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dawn Ray’d: &lt;a href=&quot;https://dawnrayd.bandcamp.com/album/behold-sedition-plainsong&quot;&gt;Behold Sedition
Plainsong&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Cult of Luna: &lt;a href=&quot;https://cultofluna.bandcamp.com/album/a-dawn-to-fear&quot;&gt;A Dawn to
Fear&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sleater-Kinney: &lt;a href=&quot;https://sleaterkinney.bandcamp.com/album/the-center-wont-hold&quot;&gt;The Center Won’t
Hold&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Yatta: &lt;a href=&quot;https://purpletapepedigree.bandcamp.com/album/wahala&quot;&gt;WAHALA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Glen Hansard: &lt;a href=&quot;https://glenhansard.bandcamp.com/album/this-wild-willing&quot;&gt;This Wild
Willing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;William Basinski: &lt;a href=&quot;https://williambasinski.bandcamp.com/album/on-time-out-of-time&quot;&gt;On Time Out of
Time&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have also, repeatedly, returned to 2018’s “Safe in the Hands of Love” by Yves
Tumor and “&lt;a href=&quot;https://emmaruthrundle.bandcamp.com/album/on-dark-horses&quot;&gt;On Dark
Horses&lt;/a&gt;” by Emma Ruth
Rundle.&lt;/p&gt;
&lt;p&gt;I traditionally go to many concerts, and the following made a special impact:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vijay Iyer &amp;amp; Wadada Leo Smith&lt;/strong&gt; at Muzička akademija, Zagreb&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Godspeed You! Black Emperor&lt;/strong&gt; at Tvornica Kulture, Zagreb&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Homeboy Sandman &amp;amp; Edan&lt;/strong&gt; at Vintage Industrial Bar, Zagreb&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Peter Brötzmann &amp;amp; Heather Leigh&lt;/strong&gt; at KSET, Zagreb&lt;/li&gt;
&lt;li&gt;the entire lineup of Sarajevo Jazz Fest 2019, especially concerts by &lt;strong&gt;Miles
Okazaki&lt;/strong&gt;, &lt;strong&gt;The Ex&lt;/strong&gt; and &lt;strong&gt;Joelle Leandre&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Personal (Tech) Projects&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.mjuziq.com/&quot;&gt;mjuziq3&lt;/a&gt; is chugging along nicely with little to no
intervention on my side. This year it hasn’t seen much love, but its interface
has been updated to Bootstrap 4, and some of the interface elements have
received a facelift.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://gitlab.com/nikolaplejic/mc&quot;&gt;mc&lt;/a&gt; is a small project for exploring Mars
Climate data I have started working on with a couple of people from the
Atmospheric Physics group at The Open University. Unfortunately, it hasn’t made
much progress.&lt;/p&gt;
&lt;h3&gt;Other&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;enjoying my exploration of the tasty world of coffee&lt;br /&gt;
&lt;small&gt;(equipment: &lt;a href=&quot;https://www.wilfa.co.uk/product/kitchen/black-aroma/&quot;&gt;Wilfa
Svart&lt;/a&gt;, &lt;a href=&quot;https://www.hario.jp/sp_v60series.html&quot;&gt;Hario
V60&lt;/a&gt;,
&lt;a href=&quot;https://aeropress.com/&quot;&gt;Aeropress&lt;/a&gt;)&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;politically, this year has been depressing, both globally and locally&lt;br /&gt;
&lt;small&gt;The support for politics of solidarity has continued its decline, and
while people luckily haven’t given up, it’s hard to be an optimist. I have no
answers nor contributions here, but it has occupied a fair share of my mental
bandwidth throughout the year.&lt;/small&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Plans for 2020&lt;/h3&gt;
&lt;p&gt;The primary goal is to graduate and figure out if I want to pursue my academic
“career” any further. Graduation assumes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a passing grade in the &lt;em&gt;Deterministic and stochastic dynamics&lt;/em&gt; course I’m
currently attending;&lt;/li&gt;
&lt;li&gt;a passing grade in the end-of-degree project course which involves an
extensive literature review of a chosen field of Physics.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Project-wise:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;encode some of my thoughts on and experiences with microservice-oriented web
application architectures in Rust into a series of posts, code examples,
and/or libraries;&lt;/li&gt;
&lt;li&gt;bring &lt;code&gt;mc&lt;/code&gt; into a usable (and useful) state;&lt;/li&gt;
&lt;li&gt;containerize all of my personal infrastructure (I have a dream of being able
to seamlessly move pieces of infra among a couple of servers as needed);&lt;/li&gt;
&lt;li&gt;add a few more sources into &lt;code&gt;mjuziq3&lt;/code&gt; and rethink its interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Skill-wise:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;learn some embedded programming &amp;amp; basic electronics skills in order to be able
to follow things like &lt;a href=&quot;https://trmm.net/Ikea&quot;&gt;these&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;become comfortable with a development environment for one of the more
prominent operating systems for the
&lt;a href=&quot;https://www.pine64.org/pinephone/&quot;&gt;PinePhone&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;understand the basics of quantum computing, both theoretically and
practically.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Personally:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;finally achieve my weight goal of dropping below 80 kg;&lt;/li&gt;
&lt;li&gt;successfully spend the year living with my lovely partner.&lt;/li&gt;
&lt;/ul&gt;
</content>
    
    <category term="review"></category>
    
  </entry>
  
  <entry>
    <title type="html">Developing Web Services in Rust: my talk at the Zagreb Rust Meetup</title>
    <link href="https://nikola.plejic.com/blog/rust-web-services-zagreb-meetup" rel="alternate"></link>
    <published>2019-03-08T17:30:00+01:00</published>
    <updated>2019-03-08T17:30:00+01:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2019-03-08:/blog/rust-web-services-zagreb-meetup</id>
    <summary type="html">Links to slides and code examples from my talk on building web services in Rust.
</summary>
    <content type="html">&lt;p&gt;
I&#x27;ve given a short overview of Rust&#x27;s support for writing web services at the &lt;a href=&quot;https://www.meetup.com/Zagreb-Rust-Meetup/&quot;&gt;Zagreb Rust meetup&lt;/a&gt;. It was all in Croatian, but there&#x27;s some &lt;a href=&quot;https://gitlab.com/razmjenavjestina/rust-meetup-ws/&quot;&gt;code&lt;/a&gt; with the occasional comment in English which may or may not be useful.
&lt;/p&gt;
&lt;p&gt;
There&#x27;s also an &lt;a href=&quot;https://gitlab.com/razmjenavjestina/rust-meetup-ws/blob/master/rust-web-services.org&quot;&gt;org-mode file&lt;/a&gt; in the repository, containing the vast majority of the stuff I&#x27;ve covered in the talk. Incidentally, GitLab does a far better job at rendering org-mode files than GitHub does, so you can enjoy a beautiful render without notable loss of content.
&lt;/p&gt;
</content>
    
    <category term="talks"></category>
    
  </entry>
  
  <entry>
    <title type="html">Shoving Your Application Code Into the Web Server: my talk at WebCamp Zagreb 2018</title>
    <link href="https://nikola.plejic.com/blog/webcamp-zagreb-2018-nginx-openresty" rel="alternate"></link>
    <published>2018-10-12T00:00:00+02:00</published>
    <updated>2018-10-12T00:00:00+02:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2018-10-11:/blog/webcamp-zagreb-2018-nginx-openresty</id>
    <summary type="html">In 2018, I gave a talk on how to use Lua, nginx, and OpenResty as a full-blown asynchronous programming environment.
</summary>
    <content type="html">&lt;p&gt;It&#x27;s been a while since I&#x27;ve given a talk: my website says it&#x27;s been more than 3 years. This year I&#x27;ve decided to break that streak, and submitted a talk called &quot;Shoving Your Application Code Into the Web Server&quot; to &lt;a href=&quot;https://2018.webcampzg.org/&quot;&gt;WebCamp Zagreb&lt;/a&gt;, and it got picked! The talk served as a short introduction to the nginx module system with a focus on &lt;a href=&quot;http://openresty.org/&quot;&gt;OpenResty&lt;/a&gt; and its ecosystem.&lt;/p&gt;
&lt;p&gt;
The conference was a blast, as always. I wasn&#x27;t in the organizing team this year, but the crew did an amazing job (again, as always). Zagreb is lucky to have an event with such a lengthy and strong tradition.
&lt;/p&gt;
&lt;p&gt;
Below is a very approximate transcript of the talk along with the slides, skipping the boring introductory part where I talk about myself. It might contain some stuff I forgot to say during the talk, and it might be missing some stuff that I did say on the talk, but such is life. The structure was shamelessly borrowed from &lt;a href=&quot;http://idlewords.com/talks/&quot;&gt;Maciej Ceglowski&lt;/a&gt;. The page will be updated with a recording once it&#x27;s available.
&lt;/p&gt;
&lt;p&gt;
Clicking on a slide will open a larger version in a new window. You can also download the &lt;a href=&quot;https://nikola.plejic.com/talks/openresty/OpenResty_without_notes.pdf&quot;&gt;PDF with all of the slides&lt;/a&gt;.
&lt;/p&gt;
&lt;h3&gt;The Web Server&lt;/h3&gt;
&lt;div class=&quot;row slide&quot;&gt;
&lt;div class=&quot;col-md-5&quot;&gt;
&lt;a target=&quot;_blank&quot; href=&quot;/images/openresty_01.png&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;/images/openresty_01.png&quot;/&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;col-md-7&quot;&gt;
&lt;p&gt;
My day job mostly revolves around dealing with components that end up speaking HTTP, either between each other or with the outside world. And where there&#x27;s HTTP, there&#x27;s bound to be a web server.
&lt;/p&gt;
&lt;p&gt;
If you&#x27;re like me until a few years ago, you probably don&#x27;t think about the web server too much. Sure, you may have tacked on a few modules, and you may have written a few neat configuration files... but once it&#x27;s up and running, you probably think of it as this fairly stable black box that somehow turns incoming HTTP requests into something your webapp can understand. I hope one of the key takeaways of this talk that I&#x27;ll offer to you will be that your web server can be used to do much more than that.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;nginx&lt;/h3&gt;
&lt;div class=&quot;row slide&quot;&gt;
&lt;div class=&quot;col-md-5&quot;&gt;
&lt;a target=&quot;_blank&quot; href=&quot;/images/openresty_02.png&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;/images/openresty_02.png&quot;/&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;col-md-7&quot;&gt;
&lt;p&gt;
A prime example of a webserver is nginx. It&#x27;s been built back in 1999 in order to tackle the so called &lt;em&gt;c10k&lt;/em&gt; problem, which boils down to being able to handle 10 000 concurrent TCP/IP connections from a single machine. While this may sound trivial to you today with all of the hardware resources we have at our disposal, it was far less of a stroll 19 years ago.
&lt;/p&gt;
&lt;p&gt;
Today, nginx powers between 30% and 40% of the public internet. If your little corner of the public internet isn&#x27;t within this bracket, bummer &amp;mdash; we&#x27;ll mostly be dealing with nginx and its ecosystem throughout this talk. However, I hope this will at least make you consider using nginx for your next project.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;row slide&quot;&gt;
&lt;div class=&quot;col-md-5&quot;&gt;
&lt;a target=&quot;_blank&quot; href=&quot;/images/openresty_03.png&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;/images/openresty_03.png&quot;/&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;col-md-7&quot;&gt;
&lt;p&gt;
There are two properties of nginx that will be very important for this talk. The first is that nginx is &lt;em&gt;modular&lt;/em&gt;; i.e. it has an API and allows us to build extensions that augment its functionality.
&lt;/p&gt;
&lt;p&gt;
The second important property is that it&#x27;s built on an &lt;em&gt;asynchronous, event-driven architecture&lt;/em&gt;, which is the key differentiating factor that allowed it to tackle the c10k problem in 1999, when most web servers used a thread- or process-based approach to handling multiple concurrent connections.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;row slide&quot;&gt;
&lt;div class=&quot;col-md-5&quot;&gt;
&lt;a target=&quot;_blank&quot; href=&quot;/images/openresty_04.png&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;/images/openresty_04.png&quot;/&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;col-md-7&quot;&gt;
&lt;p&gt;
nginx has a very rich module system, encompassing modules for most of web-development-related tasks you might imagine. Parsing JSON, querying PostgreSQL databases and various other data stores, authenticating on LDAP servers &amp;mdash; you name it.
&lt;/p&gt;
&lt;p&gt;
The limiting factor is that the functionality of these modules is exposed through the nginx configuration language. While this is neat for those times when you simply want to map an HTTP location to a simple SQL query and return its result as a JSON object, doing any sort of serious business logic simply isn&#x27;t viable with the configuration language nginx provides.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;row slide&quot;&gt;
&lt;div class=&quot;col-md-5&quot;&gt;
&lt;a target=&quot;_blank&quot; href=&quot;/images/openresty_05.png&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;/images/openresty_05.png&quot;/&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;col-md-7&quot;&gt;
&lt;p&gt;
Occasionally, you just might want that tiny bit of non-trivial business logic in there. For example, you might want to authenticate on an LDAP instance and ask a Postgres DB about the upstream server to which you need to forward your HTTP request. Or, you might want to add some additional HTTP headers before forwarding the request further, with the headers depending on some heavy business logic. Or you might simply want to change the wire transfer format because something behind your web server doesn&#x27;t speak plain old HTTP 1.1.
&lt;/p&gt;
&lt;p&gt;
These are all legitimate requirements that might not warrant a whole webapp on their own, but might not fit into the architecture of your existing webapp (or webapps). Since you have all of the modules needed within nginx already, it would be really nice if you could somehow use them to do at least some of these tasks.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;row slide&quot;&gt;
&lt;div class=&quot;col-md-5&quot;&gt;
&lt;a target=&quot;_blank&quot; href=&quot;/images/openresty_06.png&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;/images/openresty_06.png&quot;/&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;col-md-7&quot;&gt;
&lt;p&gt;
So, we come to the central question of this talk: what if we could script these nginx modules with something other than the nginx configuration language?
&lt;/p&gt;
&lt;p&gt;
Let&#x27;s put that aside for a moment and talk about Lua for a little bit...
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;Lua&lt;/h3&gt;
&lt;div class=&quot;row slide&quot;&gt;
&lt;div class=&quot;col-md-5&quot;&gt;
&lt;a target=&quot;_blank&quot; href=&quot;/images/openresty_07.png&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;/images/openresty_07.png&quot;/&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;col-md-7&quot;&gt;
&lt;p&gt;
Lua is a nice, small dynamic programming language with very clear semantics and a minimum of two amazing implementations. It&#x27;s not entirely unlike JavaScript, but back when it was originally conceived, it was meant to compete with Scheme and a neat little language called Tcl.
&lt;/p&gt;
&lt;p&gt;
It&#x27;s written in ANSI C, which means it&#x27;s highly portable: you can run Lua on any system that has a compliant compiler, which is basically any system in existence. Lua is also trivially embeddable, meaning you can simply include it into your existing C/C++ app and use its beautiful API to allow your users to script your software.
&lt;/p&gt;
&lt;p&gt;
Another thing Lua has going for it is LuaJIT, which is arguably the best dynamic language just-in-time compiler in the world. This, of course, comes with a 400-page disclaimer, but whether you&#x27;re convinced or not, LuaJIT is an engineering marvel: it&#x27;s an insanely well-optimized and performant VM worth looking into.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;row slide&quot;&gt;
&lt;div class=&quot;col-md-5&quot;&gt;
&lt;a target=&quot;_blank&quot; href=&quot;/images/openresty_08.png&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;/images/openresty_08.png&quot;/&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;col-md-7&quot;&gt;
&lt;p&gt;
Here are a few examples of Lua which should allow you to get a feel for the language if you&#x27;ve never seen it before.
&lt;/p&gt;
&lt;p&gt;
This first example is a very obvious factorial function, nothing too exciting...
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;row slide&quot;&gt;
&lt;div class=&quot;col-md-5&quot;&gt;
&lt;a target=&quot;_blank&quot; href=&quot;/images/openresty_09.png&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;/images/openresty_09.png&quot;/&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;col-md-7&quot;&gt;
&lt;p&gt;
This other example, shamelessly borrowed from &lt;em&gt;Programming In Lua, 1st ed.&lt;/em&gt;, outlines some less obvious features of the language like the module system and first-class functions.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;row slide&quot;&gt;
&lt;div class=&quot;col-md-5&quot;&gt;
&lt;a target=&quot;_blank&quot; href=&quot;/images/openresty_10.png&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;/images/openresty_10.png&quot;/&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;col-md-7&quot;&gt;
&lt;p&gt;
So, we know that Lua is easily embeddable in C, and we also know that nginx is written in C... The question kinda asks itself: what if we could use Lua to script some of those nginx modules (and more)?
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;ngx_http_lua_module&lt;/h3&gt;
&lt;div class=&quot;row slide&quot;&gt;
&lt;div class=&quot;col-md-5&quot;&gt;
&lt;a target=&quot;_blank&quot; href=&quot;/images/openresty_11.png&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;/images/openresty_11.png&quot;/&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;col-md-7&quot;&gt;
&lt;p&gt;
Luckily, far more capable people than me already came to this brilliant and completely non-obvious conclusion, and built &lt;em&gt;ngx_http_lua_module&lt;/em&gt;. This module allows us to embed Lua code in various phases of nginx&#x27;s worker process, displayed in the handy chart on the slide.
&lt;/p&gt;
&lt;p&gt;
The two big ones we&#x27;ll be dealing with today are &lt;em&gt;content_by_lua&lt;/em&gt; and &lt;em&gt;balancer_by_lua&lt;/em&gt; just because they&#x27;re the most obvious, but all of them are fairly useful.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;row slide&quot;&gt;
&lt;div class=&quot;col-md-5&quot;&gt;
&lt;a target=&quot;_blank&quot; href=&quot;/images/openresty_12.png&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;/images/openresty_12.png&quot;/&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;col-md-7&quot;&gt;
&lt;p&gt;
Let&#x27;s say you&#x27;ve been tasked by the business with a very important task of coming up with a &lt;code&gt;/brew&lt;/code&gt; endpoint that:
&lt;ul&gt;
&lt;li&gt;responds with HTTP 418 &quot;I&#x27;m a teapot&quot; if it finds the words &quot;coffee&quot; or &quot;beer&quot; within the response;&lt;/li&gt;
&lt;li&gt;responds with HTTP 200 &quot;OK&quot; if it finds the words &quot;tea&quot; in the response;&lt;/li&gt;
&lt;li&gt;responds with HTTP 400 &quot;Bad Request&quot; in any other case.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We’ve all been there.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;
You could start with a fairly simple nginx configuration file like the one on the slide, the only real difference being the &lt;code&gt;content_by_lua_block&lt;/code&gt; that allows us to execute arbitrary Lua code in order to respond to the HTTP request on this location.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;row slide&quot;&gt;
&lt;div class=&quot;col-md-5&quot;&gt;
&lt;a target=&quot;_blank&quot; href=&quot;/images/openresty_13.png&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;/images/openresty_13.png&quot;/&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;col-md-7&quot;&gt;
&lt;p&gt;
...and your arbitrary Lua code might look something like this.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;row slide&quot;&gt;
&lt;div class=&quot;col-md-5&quot;&gt;
&lt;a target=&quot;_blank&quot; href=&quot;/images/openresty_14.png&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;/images/openresty_14.png&quot;/&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;col-md-7&quot;&gt;
&lt;p&gt;
Now let&#x27;s say you&#x27;ve been tasked with the far less common and far less important task of forwarding your incoming HTTP requests to an upstream that&#x27;s dynamically defined in a Redis datastore.
&lt;/p&gt;
&lt;p&gt;
You might start again with a fairly simple nginx configuration file, defining that all of your incoming requests should be forwarded to an upstream called &lt;code&gt;backend&lt;/code&gt;. This upstream would be defined with a fake IP address, and a &lt;code&gt;balancer_by_lua_block&lt;/code&gt; that would allow us to execute arbitrary Lua code in order to set the &lt;em&gt;real&lt;/em&gt; upstream location.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;row slide&quot;&gt;
&lt;div class=&quot;col-md-5&quot;&gt;
&lt;a target=&quot;_blank&quot; href=&quot;/images/openresty_15.png&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;/images/openresty_15.png&quot;/&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;col-md-7&quot;&gt;
&lt;p&gt;
...and again, the arbitrary Lua code might look something like this. This isn&#x27;t necessarily executable and lacks a lot of error handling logic, but the gist of it is there: you query a Redis instance in order to get the upstream host and the port, and then use the exposed APIs in order to set the upstream peer to the parameters you just read.
&lt;/p&gt;
&lt;p&gt;
This looks deceptively simple, and by simply looking at this you would probably say that this code is 100% synchronous. But, your Redis instance might be in China... or down. You wouldn&#x27;t want your nginx worker process waiting for the Redis response! While it&#x27;s waiting, it&#x27;s unable to process any more incoming HTTP requests, basically murdering your performance (and, almost certainly, access to your webapp in general).
&lt;/p&gt;
&lt;p&gt;
However, using the magick from nginx&#x27;s APIs and ngx_http_lua_module, all of the &lt;code&gt;resty.*&lt;/code&gt; and &lt;code&gt;ngx.*&lt;/code&gt; APIs you see are completely non-blocking, allowing your worker process to keep on processing further HTTP requests.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;OpenResty&lt;/h3&gt;
&lt;div class=&quot;row slide&quot;&gt;
&lt;div class=&quot;col-md-5&quot;&gt;
&lt;a target=&quot;_blank&quot; href=&quot;/images/openresty_16.png&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;/images/openresty_16.png&quot;/&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;col-md-7&quot;&gt;
&lt;p&gt;
I hope you&#x27;re intrigued by now, but there&#x27;s a catch: ngx_http_lua_module isn&#x27;t included in nginx by default. This means you either have to depend on your operating system having a package (many do), or build it yourself.
&lt;/p&gt;
&lt;p&gt;
Enter OpenResty!
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;row slide&quot;&gt;
&lt;div class=&quot;col-md-5&quot;&gt;
&lt;a target=&quot;_blank&quot; href=&quot;/images/openresty_17.png&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;/images/openresty_17.png&quot;/&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;col-md-7&quot;&gt;
&lt;p&gt;
OpenResty is a bundle that contains nginx, LuaJIT, and a bunch of non-blocking libraries that allow us to do many of the things we&#x27;ve talked about.
&lt;/p&gt;
&lt;p&gt;
It has been used by the likes of Tumblr, Alibaba, CloudFlare, and many others. CloudFlare has since moved on from OpenResty, but it had used it for a long period of time for many of its load balancing needs; they have also employed the principal developer of OpenResty and financed a lot of the development behind the project.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;row slide&quot;&gt;
&lt;div class=&quot;col-md-5&quot;&gt;
&lt;a target=&quot;_blank&quot; href=&quot;/images/openresty_18.png&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;/images/openresty_18.png&quot;/&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;col-md-7&quot;&gt;
&lt;p&gt;
Since ngx_http_lua_module is a fairly central part of this whole thing, you&#x27;ll often times hear &quot;ngx_http_lua_module&quot; and &quot;OpenResty&quot; used interchangeably. Don&#x27;t let this confuse you, and for all intents and purposes, this is the same thing.
&lt;/p&gt;
&lt;p&gt;
While your ops practices may vary and you might want to build the entire thing yourself, OpenResty seems to be the preferred way of using nginx with the Lua module.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;Non-trivial Usage&lt;/h3&gt;
&lt;div class=&quot;row slide&quot;&gt;
&lt;div class=&quot;col-md-5&quot;&gt;
&lt;a target=&quot;_blank&quot; href=&quot;/images/openresty_19.png&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;/images/openresty_19.png&quot;/&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;col-md-7&quot;&gt;
&lt;p&gt;
All of our examples so far have been fairly simple. I do hope no one believes that keeping your business logic in nginx configuration files is a good idea, though! In order to write actual working software with this, we do need a few more tools.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;row slide&quot;&gt;
&lt;div class=&quot;col-md-5&quot;&gt;
&lt;a target=&quot;_blank&quot; href=&quot;/images/openresty_20.png&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;/images/openresty_20.png&quot;/&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;col-md-7&quot;&gt;
&lt;p&gt;
ngx_http_lua_module does allow us to load Lua code from files on the filesystem instead of hardcoded blocks in the config file: we can use &lt;code&gt;*_by_lua_file&lt;/code&gt; instead of &lt;code&gt;*_by_lua_block&lt;/code&gt;. This allows us to nicely structure the code using standard Lua mechanisms like modules.
&lt;/p&gt;
&lt;p&gt;
Since we&#x27;re using a standard Lua runtime within nginx, LuaRocks is fair game: we can use it to download &amp; load 3rd party modules from the LuaRocks repos.
&lt;/p&gt;
&lt;p&gt;
For testing, you can use standard Lua tools like busted to unit test your Lua modules. For end-to-end testing you can use Test::Nginx::Socket, a Perl module written by the author of OpenResty, which allows you to define your nginx configuration, HTTP request and HTTP response in a single unholy amalgamation of a file (gotta love Perl developers!). It will then load an nginx instance with that configuration, execute the HTTP request and assert the equality of the responses.
&lt;/p&gt;
&lt;p&gt;
Since the focus of OpenResty is high-performance code, profiling is important. Again, the author of OpenResty has a nice set of SystemTap-based scripts which allow you to do all kinds of on-CPU and off-CPU profiling, and generate flame graphs in order to identify slow (or blocking!) parts of your code.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;What&#x27;s Not To Like?&lt;/h3&gt;
&lt;div class=&quot;row slide&quot;&gt;
&lt;div class=&quot;col-md-5&quot;&gt;
&lt;a target=&quot;_blank&quot; href=&quot;/images/openresty_21.png&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;/images/openresty_21.png&quot;/&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;col-md-7&quot;&gt;
&lt;p&gt;
One of the first things people notice when diving into any kind of Lua development is that the ecosystem is fragmented. LuaJIT is in maintenance mode, and is compatible with the reference implementation, PUC-Lua, until (give-or-take) version 5.2. PUC-Lua has since moved on, and is currently heading towards version 5.4.
&lt;/p&gt;
&lt;p&gt;
Operationally, this isn&#x27;t that huge of an issue: most of the community is focused on LuaJIT simply because of its insane performance. However, it&#x27;s unclear whether this will be the case for forever.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;row slide&quot;&gt;
&lt;div class=&quot;col-md-5&quot;&gt;
&lt;a target=&quot;_blank&quot; href=&quot;/images/openresty_22.png&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;/images/openresty_22.png&quot;/&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;col-md-7&quot;&gt;
&lt;p&gt;
The second problem is: it&#x27;s not easy being asynchronous. Even in runtimes that push asynchronicity by default, like Go and node.js, it&#x27;s not always easy to guarantee non-blocking behavior. This is even more prominent in Lua, where asynchronicity isn&#x27;t the focus.
&lt;/p&gt;
&lt;p&gt;
This can be remedied by only using the libraries from the nginx and OpenResty ecosystems that are built with this in mind. If this is not an option, an alternative is to dig into the nginx C API and write the library yourself in a non-blocking fashion, which may or may not be viable depending on your familiarity with C.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;Final Words&lt;/h3&gt;
&lt;div class=&quot;row slide&quot;&gt;
&lt;div class=&quot;col-md-5&quot;&gt;
&lt;a target=&quot;_blank&quot; href=&quot;/images/openresty_23.png&quot;&gt;
&lt;img alt=&quot;&quot; src=&quot;/images/openresty_23.png&quot;/&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;col-md-7&quot;&gt;
&lt;p&gt;
With all of this said and done, we come to what could comfortably have been an alternate title of this talk: OpenResty gives you the ability to configure your web server in a Turing-complete programming language. But even more than that, OpenResty allows you to do it using a very comfortable, highly performant programming language.
&lt;/p&gt;
&lt;p&gt;
In theory, you could write your entire webapp using OpenResty. In practice, this will heavily depend on the availability of async libraries and the overall fitness of your project to nginx&#x27;s architecture. However, if you do have a project that fits into the asynchronous, event-driven nature offered by this ecosystem, I do hope this talk managed to convince you to give OpenResty a go.
&lt;/p&gt;
&lt;p&gt;
Thank you!
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
    
    <category term="webcamp"></category>
    
    <category term="talks"></category>
    
  </entry>
  
  <entry>
    <title type="html">Miscellaneous Org Mode Tips &amp;amp; Tricks</title>
    <link href="https://nikola.plejic.com/blog/org-mode-tips-tricks" rel="alternate"></link>
    <published>2017-10-20T10:08:31+02:00</published>
    <updated>2017-10-20T10:08:31+02:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2017-10-20:/blog/org-mode-tips-tricks</id>
    <summary type="html">Google Calendar export, project management &amp; Gantt charts with Task&amp;shy;Juggler, spacemacs&#x27; org-agenda transient state.
</summary>
    <content type="html">&lt;p&gt;&lt;a href=&quot;http://orgmode.org/&quot;&gt;Org mode&lt;/a&gt; is one of the main culprits for My Great Switch to Emacs of 2016. I&#x27;ve been very fond of the idea of &lt;em&gt;my life in plain text&lt;/em&gt;; I&#x27;ve seen it in action a few times, and it always felt like magic in a very portable file format.&lt;/p&gt;
&lt;p&gt;I&#x27;m still a rather noobish user of Emacs: as a former Vim user, I&#x27;m very happy with my Spacemacs setup, yet it&#x27;s very unamusing. But, I think I&#x27;ve collected a few interesting org mode tips &amp;amp; tricks that people have shown some interest in:&lt;/p&gt;
&lt;h3 id=&quot;export-to-google-calendar&quot;&gt;Export to Google Calendar&lt;/h3&gt;
&lt;p&gt;I&#x27;m a big fan of the agenda view, but I&#x27;m also a heavy Google Calendar user. I never really wanted a true two-way integration between the two, but some sort of a setup where my org mode schedule would show up in my calendar sounded good.&lt;/p&gt;
&lt;p&gt;Org mode supports exporting your agenda to iCal, so it&#x27;s just a matter of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;running this command periodically,&lt;/li&gt;
&lt;li&gt;making sure the resulting .ics file is available over the internet, and&lt;/li&gt;
&lt;li&gt;importing the .ics file into Google Calendar as a new calendar.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The solution to #1 is a ridiculously simple timer I have in my &lt;code&gt;.spacemacs&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&quot;lisp&quot;&gt;(defun export-org-agenda ()
  (if (eq major-mode &amp;#39;org-mode)
      (org-icalendar-combine-agenda-files)))
(with-eval-after-load &#x27;org
  (setq org-ics-autosave
        (run-at-time &amp;quot;1 min&amp;quot; 3600 &amp;#39;export-org-agenda)))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The only &amp;quot;smart&amp;quot; thing about the function above is that it&#x27;ll run only if you have an org buffer open anywhere in Emacs. I vaguely remember having some issues with &lt;code&gt;org-icalendar-combine-agenda-files&lt;/code&gt; when it would run in a non-org buffer.&lt;/p&gt;
&lt;p&gt;I have outsourced hosting this file to Dropbox. You can configure the path to the resulting iCal file with&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&quot;lisp&quot;&gt;(setq org-icalendar-combined-agenda-file &amp;quot;~/Dropbox/cal.ics&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dropbox can generate a publicly-accessible URL for this file, and you can then import it to Google Calendar, solving #3. Alternatively, a few more lines of Elisp can be added to the timer to copy the file to a remote server.&lt;/p&gt;
&lt;h3 id=&quot;project-management-gantt-charts-in-org-mode&quot;&gt;Project Management &amp;amp; Gantt Charts in Org Mode&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;There has to be a way of creating Gantt charts from org mode files! -- me, mid-2017&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Enter &lt;a href=&quot;http://taskjuggler.org/&quot;&gt;TaskJuggler&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Org mode has &lt;a href=&quot;http://orgmode.org/worg/org-tutorials/org-taskjuggler.html&quot;&gt;some support for creating &lt;code&gt;.tjp&lt;/code&gt; files&lt;/a&gt; from org mode outlines. It barely scratches the surface of what TaskJuggler can do, but it supports the basics (assignments, dependencies), and generates decent reports out of the box, including nifty Gantt charts.&lt;/p&gt;
&lt;p&gt;The docs linked above are slightly outdated, i.e. they cover an old version of TaskJuggler that used Qt. The new version of TaskJuggler has no UI, but rather just a CLI tool that spits out HTML files that can be viewed in the browser.&lt;/p&gt;
&lt;p&gt;One property that I found quite useful is &lt;code&gt;start&lt;/code&gt;: TaskJuggler will try to automatically allocate time for the tasks based on your assignment and dependencies, but often you&#x27;ll have a set start time for your task. Slap &lt;code&gt;:start: 2017-10-18&lt;/code&gt; to your task and it will start on October 18th; this will also take this fact into consideration while automatically scheduling the rest.&lt;/p&gt;
&lt;p&gt;If you&#x27;re working in a larger team, the automatic resource allocation feature is a lifesaver. For anyone doing any sort of project management, I strongly suggest looking into this.&lt;/p&gt;
&lt;h3 id=&quot;spacemacs-org-agenda-transient-state&quot;&gt;Spacemacs: Org Agenda Transient State&lt;/h3&gt;
&lt;p&gt;I stumbled on this by accident while fat-fingering the spacebar and Alt keys, but &lt;a href=&quot;http://spacemacs.org/layers/+emacs/org/README.html#org-agenda-transient-state&quot;&gt;the transient state for the org mode agenda&lt;/a&gt; is a well-documented feature.&lt;/p&gt;
&lt;p&gt;In the agenda view, hit &lt;code&gt;meta + Space&lt;/code&gt; (usually &lt;code&gt;Alt + Space&lt;/code&gt;), and you&#x27;ll get a nifty minibuffer with a bunch of options.&lt;/p&gt;
&lt;p&gt;Since I have my agenda open at all times on a separate workspace, the one I use the most is &lt;code&gt;ft&lt;/code&gt; (filter by tag) — I usually display only my work tasks when I get to work in the morning, and then switch to my personal tasks in the afternoon. &lt;code&gt;fd&lt;/code&gt; deletes all active filters.&lt;/p&gt;
</content>
    
    <category term="emacs"></category>
    
  </entry>
  
  <entry>
    <title type="html">We Made a Conference (For Fun and No Profit)</title>
    <link href="https://nikola.plejic.com/blog/we-made-a-conference-webcamp-2017" rel="alternate"></link>
    <published>2017-10-15T00:00:00+02:00</published>
    <updated>2017-10-15T00:00:00+02:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2017-10-14:/blog/we-made-a-conference-webcamp-2017</id>
    <summary type="html">A short write-up on the organizational aspects of the WebCamp Zagreb 2017 conference, where I coordinated the sponsorship aspect of the story.
</summary>
    <content type="html">&lt;p&gt;Last week I&#x27;ve had the pleasure and the opportunity to work with &lt;a href=&quot;https://2017.webcampzg.org/team/&quot;&gt;a team of fine people&lt;/a&gt; on delivering another &lt;a href=&quot;https://2017.webcampzg.org/&quot;&gt;WebCamp Zagreb conference&lt;/a&gt;. WebCamp is a yearly community event organized by members and friends of various meetups and user groups in Zagreb on a fully volunteer basis.&lt;/p&gt;
&lt;p&gt;I&#x27;ve joined WebCamp in early 2016, after a few of the core organizing members left due to lack of time. Before that, I&#x27;ve visited as an attendee and a speaker. I was thrilled that a big, non-profit conference with no corporate brain-washing took place in Zagreb, so I stepped up and joined the organization.&lt;/p&gt;
&lt;p&gt;Since then, I&#x27;ve been responsible for managing the day-to-day administrative and accounting issues for our little NGO, and coordinating the sponsorships of the conference.&lt;/p&gt;
&lt;p&gt;
    &lt;img alt=&quot;WebCamp Zagreb 2017 Opening Word&quot; src=&quot;/images/wczg_intro.jpg&quot;/&gt;
&lt;/p&gt;
&lt;h3 id=&quot;how-to-organize-a-conference-without-really-knowing-what-youre-doing&quot;&gt;How to Organize a Conference Without Really Knowing What You&#x27;re Doing&lt;/h3&gt;
&lt;p&gt;In early 2016, I had no idea what I&#x27;m doing. I had experience doing the paperwork chores because I ran my own company, but NGOs have their own set of subtly different rules. Fundraising-wise, WebCamp &lt;strong&gt;was&lt;/strong&gt; an established conference with quite a reputation by then, so I &lt;em&gt;kinda&lt;/em&gt; assumed that we shouldn&#x27;t have too much trouble finding sponsors, but my experience in actual sales were non-existent.&lt;/p&gt;
&lt;p&gt;That fact is visible in the 2016 budget: the income was noticeably lower than in 2015, mostly due to the lack of sponsors. We weren&#x27;t able to find a diamond sponsor, and the interest was tangibly lower. Ultimately, we managed cut a few expenses here and there, and the net balance of the conference was positive. We delivered a decent event which even left us a lump of capital for the 2017 edition.&lt;/p&gt;
&lt;p&gt;That whole episode was somewhat defeating. It&#x27;s hard to convince yourself to continue doing something when you have hard proof you&#x27;re not doing it all too well. But a sample of &lt;em&gt;one&lt;/em&gt; isn&#x27;t really statistically relevant, and not a really good argument for quitting. The team was pretty enthusiastic despite the initial reluctance, so we decided to give it another go.&lt;/p&gt;
&lt;h3 id=&quot;how-to-organize-a-conference-with-a-bit-more-insight-and-a-few-good-tips&quot;&gt;How to Organize a Conference With a Bit More Insight and a Few Good Tips&lt;/h3&gt;
&lt;p&gt;Based on a tip by our &lt;a href=&quot;http://webcamp.si&quot;&gt;friends from Slovenia&lt;/a&gt;, we have decided to do one additional thing which has worked well for them: we sent out a &amp;quot;call for sponsors&amp;quot; email to our mailing list asking our newsletter subscribers to help us recruit sponsors within the companies they work for, or to simply suggest any ideas for companies we could contact. In parallel, I have sent out a bunch of emails both cold and hot, and... waited.&lt;/p&gt;
&lt;p&gt;It turned out to be quite a success. We sold out almost all of our sponsorship tiers, the income was the highest so far, and this year we have a &lt;strong&gt;really&lt;/strong&gt; decent sum of capital for the next WebCamp, as well as any other projects that we might want to do.&lt;/p&gt;
&lt;p&gt;There are a few other things worth mentioning that aren&#x27;t a consequence of the budget (or at least not a direct one): we&#x27;ve had the lowest amount of no-shows yet (below 5%), we introduced a talk committee with several trusted members of the community which resulted in some of the best WebCamp talks yet, and more.&lt;/p&gt;
&lt;h3 id=&quot;see-you-next-year&quot;&gt;See You Next Year?&lt;/h3&gt;
&lt;p&gt;Organizing an event for 800+ people for two days is no easy feat. WebCamp, luckily, has a really motivated team, and a set of partners that make things easier. At times, it&#x27;s incredibly frustrating, but the net result is a bunch of new acquaintances, an incredible number of fun chats with the visitors, and an event that seems to be important for the regional tech community.&lt;/p&gt;
&lt;p&gt;
    &lt;img alt=&quot;WebCamp Zagreb 2017 Volunteers and Organizers&quot; src=&quot;/images/wczg_team.jpg&quot;/&gt;
&lt;/p&gt;
&lt;p&gt;I&#x27;m especially glad to see a significant number of people from abroad are visiting the conference, and sharing knowledge and information. I hope this trend will continue, and I hope WebCamp as an NGO will continue serving as a catalyst for these practices in the future — through the conference, and beyond.&lt;/p&gt;
</content>
    
    <category term="webcamp"></category>
    
  </entry>
  
  <entry>
    <title type="html">Music I&#x27;ve Listened To - Week of March 7th</title>
    <link href="https://nikola.plejic.com/blog/music-listened-mar-7" rel="alternate"></link>
    <published>2016-03-13T00:00:00+01:00</published>
    <updated>2016-03-13T00:00:00+01:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2016-03-12:/blog/music-listened-mar-7</id>
    <summary type="html">I try to listen to a lot of fresh, interesting music. Here&#x27;s a choice of 5 records that have especially caught my interest during the last week.
</summary>
    <content type="html">&lt;p&gt;I try to listen to a lot of fresh, interesting music. Here&#x27;s a choice of
5 records that have especially caught my interest during the last week.&lt;/p&gt;
&lt;h3&gt;&lt;i&gt;Ministry of Spontaneous Composition&lt;/i&gt; by D.C. Improvisers Collective&lt;/h3&gt;
&lt;p&gt;
&lt;em&gt;
Source:
&lt;a href=&quot;http://avantmusicnews.com/2016/03/09/amn-picks-of-the-week-dc-improvisers-collective-tomonari-nozaki-harvey-valdes-trio-sophia-yarnwire-rhyton-nonsun/&quot;&gt;Avant Music News&lt;/a&gt;,
preview:
&lt;a href=&quot;https://dcic.bandcamp.com/album/ministry-of-spontaneous-composition&quot;&gt;Bandcamp&lt;/a&gt;
&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;I&#x27;m a sucker for witty and funny album &amp;amp; song titles, and that&#x27;s one
of the primary reasons this record piqued my interest. It&#x27;s a brilliant,
interesting feat by this Washington D.C. based improv collective. Sincerely
humorous, eclectic, and approachable without ever winding up in the
prosaic, it&#x27;s one of my favorite jazz-related releases of the year so
far.&lt;/p&gt;
&lt;h3&gt;&lt;i&gt;Skáphe²&lt;/i&gt; by Skáphe&lt;/h3&gt;
&lt;p&gt;
&lt;em&gt;
Source:
&lt;a href=&quot;http://www.angrymetalguy.com/skaphe-skaphe%C2%B2-review/&quot;&gt;Angry Metal Guy&lt;/a&gt;,
preview:
&lt;a href=&quot;https://skaphe.bandcamp.com/album/sk-phe-2&quot;&gt;Bandcamp&lt;/a&gt;
&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;If there&#x27;s one record I&#x27;ve listened to in my life that I&#x27;d have to pick
out that represents hopelessness and the nihilistic in music, Skáphe² would
probably come to mind first. Unlike other releases in this vein, Skaphe
offers no catharsis. Even the short hint of optimism in the album&#x27;s final
track serves only as a reminder of what could&#x27;ve been - but by then, the
band made damn sure you&#x27;re aware that it never will be.&lt;/p&gt;
&lt;h3&gt;&lt;i&gt;On the Nature of Thingness&lt;/i&gt; by International Contemporary Ensemble&lt;/h3&gt;
&lt;p&gt;
&lt;em&gt;
Source:
&lt;a href=&quot;http://avantmusicnews.com/2016/03/03/amn-picks-of-the-week-ice-dan-weiss-adam-rudolph-george-hurd/&quot;&gt;Avant Music News&lt;/a&gt;,
info:
&lt;a href=&quot;http://www.starkland.com/st223/index.htm&quot;&gt;Starkland&lt;/a&gt;
&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;ICE is a US-based collective dedicated to playing contemporary classical
music. On the record, they play music composed by two of their members.
It&#x27;s a tour-de-force of modern composed music played with an array of
unusual instruments like parts of a broken music box. It also includes an
intriguing interpretation of Hugo Ball&#x27;s &lt;i&gt;Dada Manifesto&lt;/i&gt; called
&quot;Dada&quot;, which was probably the piece that caught the most of my
attention.&lt;/p&gt;
&lt;h3&gt;&lt;i&gt;Blister the Maw&lt;/i&gt; by Sonance&lt;/h3&gt;
&lt;p&gt;
&lt;em&gt;
Info:
&lt;a href=&quot;http://www.holyroarrecords.com/products/568294-sonance-blister-the-maw-cassette-preorder&quot;&gt;Holy Roar Records&lt;/a&gt;
&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;Combining noise, ambient and post-hardcore / sludge is nothing too new.
However, Sonance takes it to the next level on this short cassette.  The
soundscapes in the first and longest piece are almost soundtrack-like (a
very evil, tormenting soundtrack), peaking into a wall of guitar drones,
noise, screams, and haunting whispers. Resolution comes in the form of the
acoustic short track &quot;Cherry&quot;, but doesn&#x27;t last long - the album&#x27;s second
half is more classically sludgy, with great, crushing guitar work.&lt;/p&gt;
&lt;h3&gt;&lt;i&gt;Different Selves&lt;/i&gt; by Shapednoise&lt;/h3&gt;
&lt;p&gt;
&lt;em&gt;
Source:
&lt;a href=&quot;https://acloserlisten.com/2015/11/17/shapednoise-different-selves/&quot;&gt;A Closer Listen&lt;/a&gt;
&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;You could think of &lt;i&gt;Different Selves&lt;/i&gt; as an electronic companion to
Skáphe&#x27;s record. The underlying assumption, to me, seems to be similar:
complete abandonment of hope and any kind of optimism - not just in human
existence, but the entire universe. Dark, heavy music obviously inspired by
techno and industrial traditions, but with heavy influence of noise and
compositional tendencies in modern electronic music. Shaping the noise
indeed.&lt;/p&gt;
</content>
    
    <category term="music"></category>
    
  </entry>
  
  <entry>
    <title type="html">Impressions from WebCamp Ljubljana 2015</title>
    <link href="https://nikola.plejic.com/blog/webcamp-ljubljana-2015-impressions" rel="alternate"></link>
    <published>2015-03-17T10:45:37+01:00</published>
    <updated>2015-03-17T10:45:37+01:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2015-03-17:/blog/webcamp-ljubljana-2015-impressions</id>
    <summary type="html">Folks from Zagreb go on a field trip &amp;amp; visit WebCamp Ljubljana!
</summary>
    <content type="html">&lt;p&gt;I&#x27;m a huge fan of conferences: I find it to be an excellent way of absorbing new ideas, and meeting new people who deal with things which may be outside of your comfort zone. I especially like community conferences, as they tend to be far more relaxed, inclusive, and untainted by corporate interests.&lt;/p&gt;
&lt;p&gt;That&#x27;s why I really love &lt;a href=&quot;http://www.webcamp.si/&quot;&gt;WebCamp Ljubljana&lt;/a&gt;: it ticks all of the checkboxes above, and I really find the community over there interesting and inspiring. I&#x27;ve tried to visit most (if not all) of the editions so far, and it was nice seeing it grow from a tiny barcamp to a decently sized conference without losing any of the positive vibe.&lt;/p&gt;
&lt;p&gt;Eight of us from several programming communities from Zagreb decided to rent a van and visit this year&#x27;s edition.&lt;/p&gt;
&lt;p&gt;Due to almost-standard last-minute preps for my talk, I had to miss two interesting talks, but I did manage to catch &lt;a href=&quot;https://twitter.com/lmuzinic&quot;&gt;Luka&lt;/a&gt;&#x27;s talk titled &quot;What to do when a client wants to serve 110 million geotargeted banners from a VPS?&quot;, and &lt;a href=&quot;https://twitter.com/iElectric&quot;&gt;Domen&lt;/a&gt;&#x27;s talk on revolutions in Linux distributions, both of which were really really good and informative.&lt;/p&gt;
&lt;p&gt;Although Domen&#x27;s talk covered a LOT more ground than just NixOS, one of my main takeaways and the primary to-do list item is checking out NixOS in a bit more detail. It seems like a potentially excellent take on package and configuration management at the OS-level.&lt;/p&gt;
&lt;p&gt;Luka&#x27;s talk was an interesting mixture of advice on soft- and hard-skills, but I think it primarily served as a reminder we shouldn&#x27;t ignore the non-tech aspects of our field and be afraid of stepping outside of our comfort zone when we&#x27;re trying to solve a problem. It reminded me of, and motivated me to re-read &lt;a href=&quot;http://blog.codinghorror.com/the-ten-commandments-of-egoless-programming/&quot;&gt;The Ten Commandments of Egoless Programming&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This year I gave a &lt;a href=&quot;http://nikola.plejic.com/talks/clojureintro2/&quot;&gt;talk on Clojure&lt;/a&gt; which was a bit of a different take on the identically named and themed &lt;a href=&quot;http://nikola.plejic.com/talks/clojureintro/&quot;&gt;talk from WebCamp Zagreb&lt;/a&gt;. I definitely liked this version of the talk better, and it seemed to be accepted well by the audience &amp;mdash; hopefully the audience shared my positive sentiments.&lt;/p&gt;
&lt;p&gt;Lightning talks held after the lunch break were also fun: I love the way the organizers made sure the talks really were &quot;lightning&quot;, and thus were all presented from a single laptop, with a person from the organizing committee changing slides and making sure everyone gets at most 5 minutes for their talk. &lt;a href=&quot;https://twitter.com/zeljkofilipin/&quot;&gt;Željko&lt;/a&gt;, another member of our delegation from Zagreb, gave a lightning talk on solving Rubik&#x27;s cubes.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/ihabunek&quot;&gt;Ivan&lt;/a&gt; also represented the Croatian community and held a lightning talk on &lt;a href=&quot;http://2015.webcampzg.org/&quot;&gt;WebCamp Zagreb&lt;/a&gt;, a not-entirely-different conference taking place in Zagreb on October 3rd &amp;amp; 4th. We (Ivan, Luka and I) had five tickets for the conference to give out during our talks, and it was nice to see there was interest from our friends and colleagues from neighboring countries. Yay!&lt;/p&gt;
&lt;p&gt;Our friends from &lt;a href=&quot;http://phpsrbija.rs/&quot;&gt;PHP Srbija&lt;/a&gt;, the Serbian PHP community presented their conference on software architecture and design patterns called &lt;a href=&quot;http://soliday.phpsrbija.rs/&quot;&gt;SoliDay&lt;/a&gt;. The lineup at that conference is amazing, and I&#x27;ll definitely go and visit.&lt;/p&gt;
&lt;p&gt;The sponsors were quite interesting, thus I finally had the chance to try &lt;a href=&quot;http://cognitea.com/&quot;&gt;CogniTea&lt;/a&gt;. It&#x27;s tastier than it sounds, and I like the concept a lot. Unfortunately, their intl. shipping is a bit too much, but I might give it a go every now and then.&lt;/p&gt;
&lt;p&gt;All in all, I&#x27;ve enjoyed the conference, and I&#x27;m looking forward to upcoming editions. I&#x27;ve managed to catch up with a lot of familiar folks, and have a chat with some new people as well, which definitely made the trip to Ljubljana worth it.&lt;/p&gt;
</content>
    
    <category term="webcamp"></category>
    
  </entry>
  
  <entry>
    <title type="html">Forcing Korma to use UTF-8 in MySQL connections</title>
    <link href="https://nikola.plejic.com/blog/korma-clojure-mysql-unicode-utf8" rel="alternate"></link>
    <published>2015-02-04T15:02:48+01:00</published>
    <updated>2015-02-04T15:02:48+01:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2015-02-04:/blog/korma-clojure-mysql-unicode-utf8</id>
    <summary type="html">Fixing non-ASCII inserts.
</summary>
    <content type="html">&lt;p&gt;I&#x27;m a huge fan of &lt;a href=&quot;https://github.com/korma/Korma&quot;&gt;Korma&lt;/a&gt;, a Clojure DSL for relational databases. It makes handling connections (c3p0 for the win!) and writing queries in Clojure a breeze, and so far I haven&#x27;t found any huge drawbacks.&lt;/p&gt;
&lt;p&gt;One of the issues I have run into is inserting UTF-8 encoded data &amp;mdash; any non-ASCII characters would end up as a question mark (&quot;?&quot;) in the database. This led me to believe that Korma isn&#x27;t defaulting to the UTF-8 encoding, so I went my merry way to find a way to convince it to do so. GitHub &lt;a href=&quot;https://github.com/korma/Korma/issues/150&quot;&gt;Issue #150&lt;/a&gt; pointed me in the right direction, but the ultimate solution was lurking in the somewhat unrelated &lt;a href=&quot;https://github.com/korma/Korma/issues/213&quot;&gt;Issue #213&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&#x27;ve used the default &lt;code&gt;(defdb quux (mysql ...))&lt;/code&gt; way of establishing a connection, but that one doesn&#x27;t allow us to define the encoding. The trick is to pass the entire &quot;raw&quot; connection map by hand:&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&quot;clojure&quot;&gt;(defdb quux {:classname &quot;com.mysql.jdbc.Driver&quot;
             :subprotocol &quot;mysql&quot;
             :subname &quot;//localhost:3306/quux&quot;
             :useUnicode &quot;yes&quot;
             :characterEncoding &quot;UTF-8&quot;
             :delimiters &quot;`&quot;
             :user &quot;zerocool&quot;
             :password &quot;hunter2&quot;})&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&#x27;s about it! Happy hacking.&lt;/p&gt;
</content>
    
    <category term="clojure"></category>
    
  </entry>
  
  <entry>
    <title type="html">EuroClojure 2014: Notes &amp;amp; Impressions</title>
    <link href="https://nikola.plejic.com/blog/euroclojure-2014-notes-impressions" rel="alternate"></link>
    <published>2014-06-30T10:13:50+02:00</published>
    <updated>2014-06-30T10:13:50+02:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2014-06-30:/blog/euroclojure-2014-notes-impressions</id>
    <summary type="html">EuroClojure 2014 was a blast!
</summary>
    <content type="html">&lt;p&gt;Although &lt;a href=&quot;http://clojure.org/&quot;&gt;Clojure&lt;/a&gt; isn&#x27;t our company&#x27;s primary language,
  we&#x27;ve decided to go ahead and visit this year&#x27;s
  &lt;a href=&quot;http://www.euroclojure.com&quot;/&gt;EuroClojure&lt;/a&gt; in Krakow &amp;mdash; I&#x27;ve always been
  impressed by the community behind the language, and the list of talks and speakers, as well
  as the recent developments in the Clojure ecosystem, guaranteed it won&#x27;t be boring.&lt;/p&gt;
&lt;p&gt;Long story short: it was worth every minute spent on travel &amp;mdash; plane tickets were
  ridiculously expensive so we decided to drive. Approx. five hundred miles in one direction
  does take its toll, so I turned out to be exhausted after the trip, a sentiment which
  lingered throughout our stay in Krakow. Oh well, win some, lose some &amp;mdash; Central Europe
  is quite nice this time of year.&lt;/p&gt;
&lt;p&gt;Luckily for me, I still don&#x27;t have a driver&#x27;s license, so the burden of driving fell onto
  my good friend and business partner, Boni, who took it like a champ that he is. :)&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p&gt;Don&amp;#39;t remember the last time I&amp;#39;ve attended a conf. where I was totally thrilled and jam-packed with new info after every talk. &lt;a href=&quot;https://twitter.com/hashtag/EuroClojure?src=hash&quot;&gt;#EuroClojure&lt;/a&gt;&lt;/p&gt;&amp;mdash; Nikola Plejic (@nikolaplejic) &lt;a href=&quot;https://twitter.com/nikolaplejic/statuses/482264583307288576&quot;&gt;June 26, 2014&lt;/a&gt;&lt;/blockquote&gt;&lt;script async src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;h3&gt;The Conference&lt;/h3&gt;
&lt;p&gt;The conference itself was top-notch, both content-wise and organizationally. I really
  liked the more relaxed, informal, hacker-ish atmosphere. The venue made that pretty easy
  &amp;mdash; a beautiful, cozy &lt;a href=&quot;http://manggha.pl/&quot;&gt;museum of Japanese art and
  technology&lt;/a&gt;, right next to the southern bank of the Vistula river, not too far from
  the city center.&lt;/p&gt;
&lt;p&gt;As I tweeted at some point, I don&#x27;t remember the last time I went to a conference where
  I thoroughly enjoyed each and every talk, and learned a bunch of cool stuff along the way.
  The eclecticism of the talks was impressive, and I applaud all of the speakers on their
  far from trivial efforts. I think a lot of conferences could learn a thing or two about
  appropriately expanding their list of topics and interests from EuroClojure.&lt;/p&gt;
&lt;p&gt;What follows are some of my notes and impressions from a couple of selected talks
  &amp;mdash; ones which hit close to home, or caused an &quot;aha!&quot; moment of sorts. For &lt;em&gt;slightly&lt;/em&gt;
  more thorough notes, I strongly suggest you take a look at
  &lt;a href=&quot;https://gist.github.com/philandstuff/299cda371c7e74b03f18&quot;&gt;Philip Potter&#x27;s
    incredible writeup.&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;The Talks&lt;/h3&gt;
&lt;p&gt;When I say &quot;eclecticism&quot;, I do mean it: the whirlwind started with
  &lt;a href=&quot;https://twitter.com/fergbyrne&quot;&gt;Fergal Byrne&lt;/a&gt;&#x27;s
  talk on
  &lt;strong&gt;&lt;a href=&quot;http://fergalbyrne.github.io/euroclojure/euroclojure.html#/&quot;&gt;
      Hierarchical Temporal Memory&lt;/a&gt;&lt;/strong&gt;, an intriguing approach to machine
  intelligence using state-of-the-art neuroscience research. I wasn&#x27;t previously familiar
  with HTM, but the talk was pretty high-level, cumulating with an introduction to Fergal&#x27;s
  &lt;a href=&quot;http://fergalbyrne.github.io/&quot;&gt;Clortex&lt;/a&gt;, an equivalent of
  &lt;a href=&quot;http://numenta.org/nupic.html&quot;&gt;NuPIC&lt;/a&gt; in Clojure. His description of software
  development as more of a science rather than engineering resonated pretty well.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/apassionforcode&quot;&gt;Gary Crawford&lt;/a&gt;&#x27;s talk on
  &lt;strong&gt;&lt;a href=&quot;http://www.slideshare.net/garycrawford/using-clojure-for-sentiment-analysis-of-the-twittersphere-euroclojur&quot;&gt;
      sentiment analysis of tweets&lt;/a&gt;&lt;/strong&gt; was just what
  the doctor ordered &amp;mdash; it&#x27;s something we&#x27;ve been working on at Neutrino. His
  interesting approach uses Redis&#x27; bit operations for categorization and quick population
  counts, something I definitely plan on exploring further. Along with his theatrical
  delivery of the Leiningen quote, the mention of
  &lt;a href=&quot;http://martinfowler.com/bliki/Datensparsamkeit.html&quot;&gt;Datensparsamkeit&lt;/a&gt; and
  his plea for privacy awareness when collecting data turned out to be one of the more
  memorable moments of the conference.&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p&gt;The best thing about Idris is that it lets you make condescending remarks about Haskells type system - &lt;a href=&quot;https://twitter.com/ctford&quot;&gt;@ctford&lt;/a&gt;  &lt;a href=&quot;https://twitter.com/hashtag/euroclojure?src=hash&quot;&gt;#euroclojure&lt;/a&gt;&lt;/p&gt;&amp;mdash; Erik Assum (@slipset) &lt;a href=&quot;https://twitter.com/slipset/statuses/482508480948224000&quot;&gt;June 27, 2014&lt;/a&gt;&lt;/blockquote&gt;&lt;script async src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/ctford&quot;&gt;Chris Ford&lt;/a&gt;&#x27;s talk on &lt;strong&gt;Idris&lt;/strong&gt;
  was a surprising one. Although he barely mentioned Clojure,
  it was a great, succinct overview of Idris&#x27; type system motivated by the explanation of
  the Curry-Howard correspondence: types being propositions (or theorems if you&#x27;d like),
  and functions being proofs. A nice dash of advanced type systems at a dynamic language
  conference, with a refreshing approach not as focused on theory. Good to see Clojure
  devs open to Idris! :)&lt;/p&gt;
&lt;p&gt;Day two was also a lot about &lt;strong&gt;Om&lt;/strong&gt;, with both &lt;a href=&quot;https://twitter.com/swannodette&quot;&gt;
    David Nolen&lt;/a&gt;&#x27;s keynote, and &lt;a href=&quot;https://twitter.com/AnnaPawlicka&quot;&gt;Anna
    Pawlicka&lt;/a&gt;&#x27;s &lt;a href=&quot;https://github.com/apawlicka/om-data-vis&quot;&gt;example-packed&lt;/a&gt;
  &lt;a href=&quot;http://www.slideshare.net/annapawlicka/reactive-data-visualisations-with-om&quot;&gt;talk&lt;/a&gt;
  on reactive data visualizations. Both talks finally made a couple of
  things about Om and React click, and ultimately made me
  &lt;a href=&quot;https://github.com/nikolaplejic/lsyscljs/&quot;&gt;play around&lt;/a&gt; with the libs over
  the weekend. First impressions are brilliant, and even in its alpha stages
  &lt;a href=&quot;https://github.com/swannodette/om&quot;&gt;Om&lt;/a&gt; has a bunch
  of potential to significantly change the way we think and act about UIs (it was about time!).&lt;/p&gt;
&lt;h3&gt;The Bottom Line&lt;/h3&gt;
&lt;p&gt;I&#x27;m doing great injustice by stopping here because there&#x27;s a lot to be said about
  each of the talks, but Philip&#x27;s notes linked above, as well as the eventual videos of
  the talks, will probably be saying a lot more than I ever could. I&#x27;m definitely looking
  forward to tinkering with a lot of cool new things presented &amp;mdash; it really is an
  exciting time to be interested in new languages &amp;amp; technologies.&lt;/p&gt;
&lt;p&gt;Thanks to the organizers, thanks to the speakers, and thanks to everyone present.
  Until next year! :)&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;
</content>
    
    <category term="clojure"></category>
    
  </entry>
  
  <entry>
    <title type="html">On Asking the Right Questions in Internet Communities</title>
    <link href="https://nikola.plejic.com/blog/on-asking-the-right-questions-in-internet-communities" rel="alternate"></link>
    <published>2014-05-18T12:28:32+02:00</published>
    <updated>2014-05-18T12:28:32+02:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2014-05-18:/blog/on-asking-the-right-questions-in-internet-communities</id>
    <summary type="html">A rant on asking questions online.
</summary>
    <content type="html">&lt;p&gt;As a member of a multitude of programming communities during the past 10-12 years, I&#x27;ve always been frustrated and
somewhat intrigued by people who jump onto a board or a Facebook group asking for someone to contact them in order to
explain &quot;a thing or two&quot; about technology X or feature Y instead of simply asking the question there and then.&lt;/p&gt;
&lt;p&gt;The Xs and Ys are usually so broad that there&#x27;s no clear indication on whether it&#x27;s some low-level kernel-layer issue
the person is having, or a trivial 30-second CSS problem. So I&#x27;d like to stress out a very important, yet neglected part
of a developer&#x27;s toolbox:&lt;/p&gt;
&lt;h3&gt;You Really, Really Need to Know How to Ask the Right Question&lt;/h3&gt;
&lt;p&gt;When you&#x27;re asking a question online, you&#x27;re more-or-less expecting someone to drop whatever they&#x27;re doing and spend
a certain amount of time to come up with a piece of information, very likely to your significant benefit. Thus, it&#x27;s
almost crucial to make the job as easy as possible for that person.&lt;/p&gt;
&lt;p&gt;By spending some time and thoroughly researching a question, and formulating it in a clear, non-ambiguous way, you&#x27;re
not only showing respect towards the person who&#x27;s about to give you an answer, you&#x27;re also making sure the
&lt;strong&gt;right&lt;/strong&gt; person gives you the answer.&lt;/p&gt;
&lt;h3&gt;Vague Questions Give Vague Answers&lt;/h3&gt;
&lt;p&gt;When I see a well-formulated question, it&#x27;s immediately obvious whether I can answer it constructively. The clearer
that is, the more likely I am to write an answer. The less vague the question, the less time needs to be spent on
hunting for additional information possibly crucial for a correct answer.&lt;/p&gt;
&lt;p&gt;Hunting for details or further explanations of the problem in order to answer someone&#x27;s question for free isn&#x27;t a
favorite passtime activity of many. The amount of hunting and the degree of triviality of the details are directly
correlated with the chances of someone simply giving up and spending their time on something more productive.&lt;/p&gt;
&lt;h3&gt;Asking the Right Question Is Half Of The Answer&lt;/h3&gt;
&lt;p&gt;By taking the time to formulate a question, you&#x27;ll need to explain a lot of the nitty gritty details to yourself
before outsourcing that to a random stranger. This is not only a brilliant learning experience in itself, it&#x27;s also
a great opportunity to make sure you&#x27;re not missing something very obvious.&lt;/p&gt;
&lt;p&gt;You&#x27;ll need to make sure you understand every step of the way up to the point of encountering the problem, and
very often that&#x27;s the key step towards solving the problem on your own. I&#x27;ve spent a lot of time carefully writing
forum posts and StackOverflow questions just to get to that &quot;AHA!&quot; moment, resolving the issue by myself.&lt;/p&gt;
&lt;h3&gt;A Little Effort Goes a Long Way&lt;/h3&gt;
&lt;p&gt;People wrote entire essays and HOWTOs on the subject. One of my favorites is Eric S. Raymond&#x27;s
&lt;a href=&quot;http://www.catb.org/~esr/faqs/smart-questions.html&quot;&gt;How To Ask Questions The Smart Way&lt;/a&gt; which should
be required reading for anyone asking questions in any shape or form, ever. It&#x27;s a lengthy, but excellent summary
of things to keep in mind when asking for help.&lt;/p&gt;
&lt;p&gt;Ultimately, by investing some time into a proper inquiry, you&#x27;ll not only help yourself by making sure your
question gets answered quickly and precisely &amp;mdash; you&#x27;ll also help your fellow programmers in distress by
making it easier to find the very likely answer using search engines when they encounter a similar problem.&lt;/p&gt;
&lt;p&gt;This is &lt;strong&gt;the&lt;/strong&gt; key non-technical tool in your arsenal: use it well, and everyone benefits; use
it badly, and you&#x27;ll be ignored, get a low quality answer, or be called out for lack of respect towards fellow
community members.&lt;/p&gt;
</content>
    
    <category term="journal"></category>
    
  </entry>
  
  <entry>
    <title type="html">Developing and Deploying ASP.NET MVC Applications On Ubuntu Linux with Mono, nginx and MySQL</title>
    <link href="https://nikola.plejic.com/blog/asp-net-mvc-on-ubuntu-linux-mono-nginx-mysql" rel="alternate"></link>
    <published>2011-03-21T13:10:04+01:00</published>
    <updated>2011-03-21T13:10:04+01:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2011-03-21:/blog/asp-net-mvc-on-ubuntu-linux-mono-nginx-mysql</id>
    <summary type="html">A short guide to running Microsoft&#x27;s web stack on Linux, and connecting it to a MySQL database.
</summary>
    <content type="html">&lt;p&gt;&lt;img class=&quot;alignleft size-full wp-image-408&quot; title=&quot;Mono&quot; src=&quot;http://nikola.plejic.com/blog/wp-content/uploads/2011/03/mono.png&quot; alt=&quot;Mono&quot; align=&quot;left&quot; width=&quot;167&quot; height=&quot;41&quot;&gt;Mono is moving forward at an impressive pace: the team at Novell and the Mono community deserve some massive respect. In the more recent versions, support for ASP.NET MVC emerged and the new Microsoft library became a part of the core. Combined with XSP (the Mono web server) and its FastCGI server, it became possible to serve ASP.NET MVC applications from your Linux machines.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This post is a quick summary of my first steps in creating a development environment and setting up a server for ASP.NET MVC on Linux.&lt;/strong&gt; Tools of the trade will be Ubuntu 10.04 (Lucid Lynx), the nginx web server and XSP’s FastCGI server. I’ll assume you have a working setup featuring nginx and MySQL on your server – configuring these is beyond the scope of this article.&lt;span id=&quot;more-386&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;padding-left: 30px;&quot;&gt;
&lt;p style=&quot;border-left: 3px solid #000; padding-left: 5px;&quot;&gt;Much of this was never tested in a production environment. I have yet to develop a non-trivial application running on top of all of this and I can’t guarantee everything is bug-free and 100% functional. &lt;a href=&quot;http://www.mono-project.com/Companies_Using_Mono&quot;&gt;People are using Mono in production&lt;/a&gt;, the whole thing looks and feels really solid, but definitely make sure you test everything before diving in.&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Mono.GetLastVersion();&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Ubuntu depends on Mono quite a lot, so don’t expect to find the latest and greatest version in your package manager.&lt;/strong&gt; There is some comfort in the form of&amp;nbsp;&lt;a href=&quot;http://badgerports.org/&quot;&gt;Badgerports&lt;/a&gt;, but it’s LTS-only, and it’s usually a bit behind the latest Mono stable. The solution is to compile Mono from source, which is actually a lot easier than it sounds.&lt;/p&gt;
&lt;div style=&quot;padding-left: 30px;&quot;&gt;
&lt;p style=&quot;border-left: 3px solid #000; padding-left: 5px;&quot;&gt;If you feel you can live with an older version of Mono and are using a long-term supported release of Ubuntu, go ahead and grab the Badgerports repository and install their Mono packages. The crew is doing awesome work and the backport works great. Compiling stuff from scratch means you have to keep an eye out for security updates and recompile when necessary to keep your server safe, which can be stressful. If you really like living on the edge, follow the instructions below.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The whole process is made easy by a &lt;a href=&quot;https://github.com/firegrass/mono-installer-script&quot;&gt;nice shell script written by Patrick McEvoy&lt;/a&gt; which does all the heavy lifting. The script is nicely written, so if you don’t like running random stuff from the web as root (and you shouldn’t!), feel free to take a peek, see what it does and do the whole thing by hand.&lt;/p&gt;
&lt;p&gt;Clone the Git repo or fetch the script directly from GitHub and see what the script does by typing &lt;code&gt;./mono_build.sh -h&lt;/code&gt; (you’ll have to &lt;code&gt;chmod +x mono-build-sh&lt;/code&gt; if you already didn’t). &lt;strong&gt;The choice between the correct flags depends on what you’re configuring&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;for my development machine, I chose to build “just Mono” (the -r flag), and then added gnome-sharp and monodevelop afterwards (-m mono-addins gnome-sharp gnome-desktop-sharp monodevelop);&lt;/li&gt;
&lt;li&gt;for my VPS, I chose to build “just Mono”, without any additional modules.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Run the script with your selected parameters (don’t forget to specify the prefix!) and grab a cup of coffee as it could definitely take a while.&lt;/p&gt;
&lt;div style=&quot;padding-left: 30px;&quot;&gt;
&lt;p style=&quot;border-left: 3px solid #000; padding-left: 5px;&quot;&gt;You may get compile errors while installing MonoDevelop. Depending on your current Mono configuration, you may need to uncheck certain MonoDevelop packages in the configure phase: I only checked “main”, “extras/MonoDevelop.Database” and “extras/MonoDevelop.Debugger.Gdb”; the “extras/BooBinding” and “extras/MonoDevelop.MonoDroid” packages I tried to install caused the compiler to choke. If you make a mistake in this phase, go to the MonoDevelop source directory, and do a &lt;code&gt;sudo ./configure --select&lt;/code&gt;; &amp;nbsp;choose the packages and then try to recompile with &lt;code&gt;mono_build.sh&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;When finished, &lt;strong&gt;you should have a fully-functioning version of Mono in a directory of your own choice.&lt;/strong&gt; Follow the instructions to enable and test your new installation, and buy Patrick a beer for his awesome work.&lt;/p&gt;
&lt;h3&gt;Setting up nginx and FastCGI&lt;/h3&gt;
&lt;div style=&quot;padding-left: 30px;&quot;&gt;
&lt;p style=&quot;border-left: 3px solid #000; padding-left: 5px;&quot;&gt;You don’t need to set up FCGI on your development machine – you can happily use the standalone XSP which was built as a development server. XSP loads automatically when you run your app from MonoDevelop.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;img class=&quot;alignleft size-full wp-image-412&quot; title=&quot;nginx&quot; src=&quot;http://nikola.plejic.com/blog/wp-content/uploads/2011/03/nginx.gif&quot; alt=&quot;nginx&quot; align=&quot;left&quot; width=&quot;121&quot; height=&quot;32&quot;&gt;XSP provides a FastCGI server, which is an excellent way to make Mono and nginx talk.&lt;/strong&gt; For this to work, you’ll need to know the exact location of the &lt;code&gt;fastcgi-mono-serverX&lt;/code&gt; (where X is one of { “”, “2″, “4″ }, depending on the ASP.NET version you’d like to use). If you installed the Badgerports backport, it’s probably in your &lt;code&gt;PATH&lt;/code&gt;; if you compiled from source, it’s in &lt;code&gt;$PREFIX/bin/fastcgi-mono-serverX&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now we need to point nginx to the FastCGI binary. &lt;strong&gt;Here’s a sample configuration file&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;code&gt; &lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
    server_name {SERVER};
    access_log {ACCESSLOG};
    root {ROOT};
&lt;pre&gt;&lt;code&gt;# magick start!
location / {
index index.html index.htm default.aspx Default.aspx;
# DEFAULTROUTE is the default route of your app; e.g. Home/Index
fastcgi_index {DEFAULTROUTE};
# choose a free port; e.g. 9001
fastcgi_pass 127.0.0.1:{PORT};
include /etc/nginx/fastcgi_params;
}

# /Content contains just static files - we don&#x27;t need
# no FCGI to serve those!
location /Content/ {
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;You can easily deploy your ASP.NET application to {ROOT} by using MonoDevelop’s “Deploy to Web” functionality (Tools – Deploy to Web).&lt;/p&gt;
&lt;p&gt;Now, edit /etc/nginx/fastcgi_params and add the following two lines defining certain environment variables the FastCGI server expects to find:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;fastcgi_param  PATH_INFO          &quot;&quot;;&lt;br&gt;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Finally, start the FastCGI server itself:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$PREFIX/bin/fastcgi-mono-server2 /applications={SERVER}:/:{ROOT} /socket=tcp:127.0.0.1:{PORT} &amp;amp;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Restart nginx and your application should be ready at the server_name of your choice. However, &lt;strong&gt;manually starting up FCGI isn’t too exciting.&lt;/strong&gt; Fortunately, there’s an &lt;a href=&quot;http://tomi.developmententity.sk/Blog/Post/2&quot;&gt;awesome script written by Tomas Bosak&lt;/a&gt; which automates that part – follow Tomas’ instructions to install the script, but make sure to update the path to the FastCGI binary if you compiled from source.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://nikola.plejic.com/blog/wp-content/uploads/2011/03/aspnetlinux.png&quot; rel=&quot;lightbox[386]&quot;&gt;&lt;img class=&quot;size-medium wp-image-416 aligncenter&quot; title=&quot;ASP.NET on Mono - we have proof!&quot; src=&quot;http://nikola.plejic.com/blog/wp-content/uploads/2011/03/aspnetlinux-300x73.png&quot; alt=&quot;ASP.NET on Mono&quot; width=&quot;300&quot; height=&quot;73&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Another option would be to use nginx to proxy requests to a standalone XSP instance: it should be fairly straightforward, but I didn’t try it at all.&lt;/p&gt;
&lt;h3&gt;Mono &amp;lt;3 MySQL and Fluent NHibernate&lt;/h3&gt;
&lt;p&gt;&lt;img class=&quot;alignleft size-full wp-image-414&quot; title=&quot;mysql&quot; src=&quot;http://nikola.plejic.com/blog/wp-content/uploads/2011/03/mysql.png&quot; alt=&quot;mysql&quot; align=&quot;left&quot; width=&quot;110&quot; height=&quot;57&quot;&gt;Web applications usually work with some kind of a database. &lt;strong&gt;There are several &lt;a href=&quot;http://mono-project.com/Database_Access&quot;&gt;ADO.NET providers working with Mono&lt;/a&gt; for different database servers like MySQL, PosgreSQL and Microsoft SQL Server.&lt;/strong&gt; MySQL provides the &lt;a href=&quot;http://dev.mysql.com/downloads/connector/net/&quot;&gt;Connector/Net library&lt;/a&gt;, which is a fully-managed ADO.NET provider. Setting it up is easy: download the library, unzip and add a reference to &lt;code&gt;mysql.data.dll&lt;/code&gt; in MonoDevelop. Also note you’ll have to use the DLL from the “v2/” folder. There’s a &lt;a href=&quot;http://mono-project.com/MySQL&quot;&gt;quick &amp;amp; dirty tutorial on the Mono project website&lt;/a&gt;, and &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.1/en/connector-net.html&quot;&gt;in-depth documentation on the MySQL website&lt;/a&gt; which should have enough information to get you up &amp;amp; running.&lt;/p&gt;
&lt;div style=&quot;padding-left: 30px;&quot;&gt;
&lt;p style=&quot;border-left: 3px solid #000; padding-left: 5px;&quot;&gt;If you run into a “connection refused” message while trying to connect with MySQL, take a peek in your /etc/mysql/my.cnf: you should either have an uncommented line in there saying “skip-networking”, or &amp;nbsp;a directive which says “bind_address = 127.0.0.1″, depending on your MySQL version.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;If you’d like to use Fluent NHibernate with Mono – good news!&lt;/strong&gt; It works perfectly without any hacks: just &lt;a href=&quot;http://fluentnhibernate.org/&quot;&gt;download Fluent NHibernate&lt;/a&gt; and reference it in your project. Here’s a sample CreateSessionFactory() method for MySQL:&lt;/p&gt;
&lt;p&gt;&lt;code&gt; &lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;private static ISessionFactory CreateSessionFactory() {
    string connStr = &quot;server=localhost;user={USER};database={DB};port={PORT};password={PWD}&quot;;
    return Fluently.Configure()
    .Database(
        MySQLConfiguration.Standard.ConnectionString()
    )
    .Mappings(m =&amp;gt; m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly()))
    .BuildSessionFactory();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Voilà.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;ASP.NET MVC 3, WebMatrix, future…&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.mono-project.com/Release_Notes_Mono_2.10#ASP.NET_MVC3_Support&quot;&gt;Mono 2.10 should support ASP.NET MVC 3&lt;/a&gt;, although it’s not yet bundled with Mono as is the case with previous versions. There is also some preliminary support for &lt;a href=&quot;http://blog.neteril.org/2011/01/22/webmatrix-data-on-mono/&quot;&gt;WebMatrix in the form of WebMatrix.Data.dll&lt;/a&gt; and &lt;a href=&quot;http://www.mono-project.com/Release_Notes_Mono_2.10#Razor_and_WebPages&quot;&gt;Razor&lt;/a&gt;. I didn’t have the time to play with any of these, so if you have some experience in setting it up, please share them in the comments.&lt;/p&gt;
&lt;p&gt;I really like C# and ASP.NET MVC and &lt;strong&gt;I enjoy the idea of running .NET web applications on top of my preferred OS&lt;/strong&gt;. This is something I’ll definitely be tinkering with in the future. For any questions, comments, advice or suggestions, feel free to use the comment form below, &lt;a href=&quot;http://twitter.com/nikolaplejic&quot;&gt;mention me on Twitter&lt;/a&gt; or contact me by e-mail on &lt;a href=&quot;mailto:nikola@plejic.com&quot;&gt;nikola@plejic.com&lt;/a&gt;.&lt;/p&gt;
</content>
    
    <category term="web"></category>
    
    <category term="asp.net"></category>
    
  </entry>
  
  <entry>
    <title type="html">F#: Funkcijsko programiranje za .NET (WebUG, studeni 2010.)</title>
    <link href="https://nikola.plejic.com/blog/f-funkcijsko-programiranje-za-net-webug-studeni-2010" rel="alternate"></link>
    <published>2010-10-19T16:37:32+02:00</published>
    <updated>2010-10-19T16:37:32+02:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2010-10-19:/blog/f-funkcijsko-programiranje-za-net-webug-studeni-2010</id>
    <summary type="html">Materijali s predavanja o F#-u.
</summary>
    <content type="html">&lt;p&gt;18. studenoga sam na sastanku Web User Groupa održao &lt;strong&gt;predavanje o &lt;a href=&quot;http://en.wikipedia.org/wiki/F_Sharp_(programming_language)&quot;&gt;F#-u&lt;/a&gt;&lt;/strong&gt;, višeparadigmatskom (no naglašeno funkcijskom) jeziku za CLR. Nije trivijalno strpati mali uvod u funkcijsko programiranje i cijeli novi programski jezik u ispod sat vremena, ali se nadam da sam makar dijelom u tome uspio.&lt;/p&gt;
&lt;p&gt;Od danas su dostupni i &lt;a href=&quot;http://www.webug.com.hr/201011/&quot;&gt;materijali sa sastanka&lt;/a&gt; koji uključuju i moju &lt;strong&gt;prezentaciju i Visual Studio 2010 solution s primjerima&lt;/strong&gt;. Ukoliko nemate VS2010, vrijedi napomenuti da &lt;a href=&quot;http://fsxplat.codeplex.com/&quot;&gt;F# kompajler bez problema radi i na Monou&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Predavanje će, u malo drugačijem izdanju, biti reprizirano na sljedećem sastanku &lt;a href=&quot;http://wiki.razmjenavjestina.org/index.php/LangGang&quot;&gt;Lang Ganga&lt;/a&gt; u klubu Mama koji se događa svake prve nedjelje u mjesecu.&lt;/p&gt;
</content>
    
    <category term="dotnet"></category>
    
  </entry>
  
  <entry>
    <title type="html">File upload in Clojure &amp;amp; Compojure</title>
    <link href="https://nikola.plejic.com/blog/file-upload-in-clojure-compojure" rel="alternate"></link>
    <published>2010-09-02T18:47:50+02:00</published>
    <updated>2010-09-02T18:47:50+02:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2010-09-02:/blog/file-upload-in-clojure-compojure</id>
    <summary type="html">How to handle multipart HTTP POST equests in compojure.
</summary>
    <content type="html">&lt;p&gt;&lt;a href=&quot;http://compojure.org/&quot;&gt;Compojure&lt;/a&gt; is coming to be a really nice framework which is, together with the excellent &lt;a href=&quot;http://github.com/cgrand/enlive&quot;&gt;Enlive&lt;/a&gt; templating/transformation library, enough to make this Lisp n00b take a shot at developing a toy project or two in a Lisp dialect. I struggled a bit today to do a file upload: it&amp;#8217;s a relatively recent feature in the framework and although it&amp;#8217;s pretty straightforward, it took me a while to get it up to speed. Here&amp;#8217;s a really basic and primitive example which assumes you have clojure.contrib, Ring, Compojure and Enlive installed.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-315&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The key step is to wrap your upload handling route with the &lt;code&gt;wrap-multipart-params&lt;/code&gt; middleware from the &lt;code&gt;ring.middleware.multipart-params&lt;/code&gt; namespace. The route responsible for the file upload is the latter one:&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&quot;clojure&quot;&gt;(defroutes public-routes
      (GET &quot;/&quot; [] (render (index)))
        (mp/wrap-multipart-params
            (POST &quot;/file&quot; {params :params} (upload-file (get params &quot;file&quot;)))))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(&lt;code&gt;file&lt;/code&gt; in the &lt;code&gt;(get params &quot;file&quot;)&lt;/code&gt; call is the name of the &lt;code&gt;input&lt;/code&gt; field.)&lt;/p&gt;
&lt;p&gt;Next, here&amp;#8217;s the &lt;code&gt;upload-file&lt;/code&gt; handler function called by the route which just takes the file and copies it to a file named &lt;code&gt;file.out&lt;/code&gt; in the current project directory:&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&quot;clojure&quot;&gt;(defn upload-file
          [file]
                (ds/copy (file :tempfile) (ds/file-str &quot;file.out&quot;))
                      (render (upload-success)))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(&lt;code&gt;ds&lt;/code&gt; is an alias for the &lt;code&gt;clojure.contrib.duck-streams&lt;/code&gt; namespace, and &lt;code&gt;render&lt;/code&gt; is a function which takes a template and returns its string representation. &lt;code&gt;upload-success&lt;/code&gt; is an Enlive template.)&lt;/p&gt;
&lt;p&gt;Voila! Not hard at all. Also check out the &lt;a href=&quot;http://gist.github.com/562624&quot;&gt;gist with complete code and template files&lt;/a&gt;.&lt;/p&gt;
</content>
    
    <category term="clojure"></category>
    
  </entry>
  
  <entry>
    <title type="html">(G)Vim: postavljanje opcija u ovisnosti o direktoriju</title>
    <link href="https://nikola.plejic.com/blog/gvim-postavljanje-opcija-u-ovisnosti-o-direktoriju" rel="alternate"></link>
    <published>2010-02-25T20:58:17+01:00</published>
    <updated>2010-02-25T20:58:17+01:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2010-02-25:/blog/gvim-postavljanje-opcija-u-ovisnosti-o-direktoriju</id>
    <summary type="html">Učitavanje vim konfiguracije ovisno o direktoriju.
</summary>
    <content type="html">&lt;p&gt;Paralelni rad na nekoliko različitih projekata&lt;sup&gt;1&lt;/sup&gt; može biti zanimljiv, ali i frustrirajuć ukoliko ti projekti koriste različite konvencije za pisanje koda. Vim spašava stvar sa svojih &lt;a href=&quot;http://stackoverflow.com/questions/1889602/multiple-vim-configurations/1889707&quot;&gt;nekoliko načina za korištenje paralelnih konfiguracija&lt;/a&gt;.&lt;span id=&quot;more-274&quot;&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;p&gt;Svako rješenje ima svojih prednosti, no najjednostavnijim se i najefikasnijim u mojem slučaju pokazalo dodavanje sljedeće linije u ~/.vimrc:&lt;/p&gt;
  &lt;pre lang=&quot;vim&quot;&gt;
au BufRead,BufNewFile /path/do/foldera/* setl noexpandtab
  &lt;/pre&gt;
  &lt;p&gt;Gornji primjer će za sve fileove koji se nalaze unutar foldera /path/do/foldera (i ispod njega) koristiti &amp;#8220;prave&amp;#8221; tabove umjesto spaceova koji su moja defaultna konfiguracija. Hvala, Vim.&lt;/p&gt;
  &lt;p&gt;&lt;sup&gt;1&lt;/sup&gt; &lt;i&gt;(&amp;#8220;Paralelni rad na nekoliko različitih projekata&amp;#8221; ujedno i vrlo dobro opisuje razloge radi kojih je ovaj blog mrtav više od pola godine.)&lt;/i&gt;&lt;/p&gt;
</content>
    
    <category term="vim"></category>
    
  </entry>
  
  <entry>
    <title type="html">Zašto Wolfram|Alpha neće ubiti Google i zašto to nije bitno</title>
    <link href="https://nikola.plejic.com/blog/zasto-wolframalpha-nece-ubiti-google-i-zasto-to-nije-bitno" rel="alternate"></link>
    <published>2009-05-21T14:52:09+02:00</published>
    <updated>2009-05-21T14:52:09+02:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2009-05-21:/blog/zasto-wolframalpha-nece-ubiti-google-i-zasto-to-nije-bitno</id>
    <summary type="html">Od svog predstavljanja, Wolfram|Alpha ne prestaje privlačiti pozornost tehnološki osvještenijeg dijela populacije. Reakcije su mnoge, od izrazito pozitivnih do izrazito negativnih, a mnoge od njih pokazuju određeno nerazumijevanje koncepta same aplikacije.
</summary>
    <content type="html">&lt;p&gt;Od svog predstavljanja, Wolfram|Alpha ne prestaje privlačiti pozornost tehnološki osvještenijeg dijela populacije. Reakcije su mnoge, od izrazito pozitivnih do izrazito negativnih, a mnoge od njih pokazuju određeno nerazumijevanje koncepta same aplikacije.&lt;span id=&quot;more-219&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Tko i što je Wolfram Research?&lt;/h3&gt;
&lt;p&gt;&lt;img class=&quot;size-full wp-image-222&quot; title=&quot;wolframlogo&quot; src=&quot;http://nikola.plejic.com/blog/wp-content/uploads/2009/05/wolframlogo.jpg&quot; alt=&quot;Wolfram Research - Makers of Mathematica&quot; width=&quot;200&quot; height=&quot;135&quot; align=&quot;left&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Prije nego što krenemo u detaljniji pogled u Alphu treba predstaviti njihove stvaraoce &amp;#8212; &lt;a href=&quot;http://www.wolfram.com/&quot;&gt;Wolfram Research&lt;/a&gt;, na čijem čelu stoji karizmatični i ponešto kontroverzni &lt;a href=&quot;http://en.wikipedia.org/wiki/Stephen_Wolfram&quot;&gt;Stephen Wolfram&lt;/a&gt;. Wolframovci su najpoznatiji po iznimno moćnoj &lt;a href=&quot;http://en.wikipedia.org/wiki/Mathematica&quot;&gt;Mathematici&lt;/a&gt;, softveru s kojim su upoznate generacije inženjera različitih struka i koji obuhvaća alate za računalnu algebru, numeričke kalkulacije, statistiku i još mnogo grana matematike, a u sebi sadrži bogatu bazu astronomskih, fizikalnih, kemijskih, lingvističkih, financijskih i inih podataka na koje se ti alati mogu primijeniti.&lt;/p&gt;
&lt;h3&gt;Zašto Alpha nije ni Google ni Wikipedija&lt;/h3&gt;
&lt;p&gt;Wolfram|Alpha je praktički Mathematica na steroidima prenesena na web, s (blago rečeno) nadopunjenom bazom kojoj se upiti šalju engleskim jezikom. Za sada sam primijetio dvije glavne zamjerke koje se protežu kroz većinu osvrta: &lt;a href=&quot;http://www.techcrunch.com/2009/05/15/putting-wolfram-alpha-to-the-test-not-super-impressed-but-here-are-50-invites/&quot;&gt;starost podataka&lt;/a&gt; i &lt;a href=&quot;http://rep.hr/vijesti/internet/tresla-se-brda-rodio-se-wolfram-alpha/423/&quot;&gt;nedostatak određenih informacija&lt;/a&gt;. Oba problema su poprilično ozbiljna ukoliko se Alpha promatra kao tražilica, od čega će Wolframovci vrlo vjerojatno teško moći pobjeći s obzirom na već stvoreni dojam i na &lt;em&gt;user interface&lt;/em&gt; koji izrazito podsjeća na, primjerice, Google.&lt;/p&gt;
&lt;p&gt;No, već u logotipu stoji da Alpha nije tražilica, nego &lt;em&gt;computational knowledge engine&lt;/em&gt;&lt;a name=&quot;foothref&quot; href=&quot;#footnote&quot;&gt;*&lt;/a&gt;, te stoga prikuplja &lt;strong&gt;podatke&lt;/strong&gt;, i to strukturirane podatke kojima zna manipulirati. To otprilike znači da imate nevjerojatno veliku bazu (10+ &lt;em&gt;trilijuna&lt;/em&gt; redova) s kojom možete vršiti raznorazne kalkulacije. Evo nekoliko primjera (klik za veću sliku):&lt;/p&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;&lt;a rel=&quot;lightbox&quot; href=&quot;http://nikola.plejic.com/blog/wp-content/uploads/2009/05/internetusers.png&quot;&gt;&lt;img class=&quot;size-medium wp-image-227&quot; title=&quot;internetusers&quot; src=&quot;http://nikola.plejic.com/blog/wp-content/uploads/2009/05/internetusers-300x207.png&quot; alt=&quot;Usporedba korisnika interneta u Europi i Americi&quot; width=&quot;300&quot; height=&quot;207&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;lightbox&quot; href=&quot;http://nikola.plejic.com/blog/wp-content/uploads/2009/05/stanovnici.png&quot;&gt;&lt;img class=&quot;size-medium wp-image-227&quot; src=&quot;http://nikola.plejic.com/blog/wp-content/uploads/2009/05/stanovnici-300x207.png&quot; alt=&quot;Eksponencijalna funkcija s omjerom stanovnika Beograda i Zagreba kao argumentom&quot; width=&quot;300&quot; height=&quot;207&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a rel=&quot;lightbox&quot; href=&quot;http://nikola.plejic.com/blog/wp-content/uploads/2009/05/integracija.png&quot;&gt;&lt;img class=&quot;size-medium wp-image-234&quot; src=&quot;http://nikola.plejic.com/blog/wp-content/uploads/2009/05/integracija-300x293.png&quot; alt=&quot;Površina New Yorka pomnožena s određenim integralom funkcije e^(x^2)&quot; width=&quot;300&quot; height=&quot;293&quot; /&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;Iz ovog vrlo malog uzorka je vidljiva prava moć Alphe. Podaci možda nisu najaktualniji, ali aktualnost lagano pada u drugi plan jer podatke nije toliko teško aktualizirati koliko je teško razviti ovakve alate za manipulaciju. Upravo tu leži glavna razlika između Alphe i svega ostaloga: ostali mogu imati najaktualnije podatke na svijetu, ali s njima ne mogu ništa, osim ih prikazati krajnjem korisniku. (Disclaimer: Google navodno radi na svom odgovoru, &lt;a href=&quot;http://blogoscoped.com/archive/2009-05-12-n39.html&quot;&gt;Google Squaredu&lt;/a&gt;, ali o tome ćemo kad to vidimo.)&lt;/p&gt;
&lt;h3&gt;Koga briga?&lt;/h3&gt;
&lt;p&gt;Iako mnogo ljudi koristi tražilice i enciklopedije, mali broj njih zapravo želi raditi kompleksne matematičke manipulacije podacima na koje naiđu. No, Wolfram Alpha može poslužiti mnogo širem krugu ljudi od znanstvenika:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;s obzirom na bogatu bazu &lt;a href=&quot;http://www58.wolframalpha.com/examples/MathematicalFunctions.html&quot;&gt;matematičkih funkcija&lt;/a&gt; i podataka iz prirodnih i društvenih znanosti, može pomoći osnovnoškolcima i srednjoškolcima u lakšem razumijevanju gradiva,&lt;/li&gt;
&lt;li&gt;izrazito pojednostavljuje istraživanje (ne samo znanstveno, nego i istraživanje za članak na vašem blogu) s obzirom da stavlja fokus na &lt;strong&gt;podatak&lt;/strong&gt;, što izrazito povećava omjer signala i šuma,&lt;/li&gt;
&lt;li&gt;olakšava stavljanje podataka u kontekst jednostavnim manipulacijama (npr. omjerima),&lt;/li&gt;
&lt;li&gt;igranje podacima može biti zabavno :).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Ni Wolfram nije savršen&amp;#8230;&lt;/h3&gt;
&lt;p&gt;Da ne bi sve ostalo na pohvalama, Wolfram ima još puno posla. Neki &lt;a href=&quot;http://www58.wolframalpha.com/input/?i=ljubljana+to+zagreb+%2F+ljubljana+to+wien&quot;&gt;relativno&lt;/a&gt; &lt;a href=&quot;http://www58.wolframalpha.com/input/?i=Log[population+of+new+york]&quot;&gt;jednostavni&lt;/a&gt; upiti još ne rade, a iako je zadavanje upita na engleskom odličan feature koji funkcionira dosta dobro, osobno bih volio vidjeti i neki egzaktniji način izvlačenja podataka iz baze (primjera radi, Population[New York] umjesto &amp;#8220;population of new york&amp;#8221;). API je za sada ograničen i ne postoji neka detaljnija dokumentacija niti primjer izrade aplikacija koje bi se bazirale na Alphi.&lt;/p&gt;
&lt;p&gt;No uz sve to, smatram da će ovakvi servisi uvelike olakšati život ljudima koji traže i obrađuju informacije. Ne, Alpha neće ubiti Google jer vam neće reći kako implementirati binarno stablo u C-u, niti će ubiti Wikipediju jer vam neće objasniti zašto je došlo do trenutnog teritorijalnog spora Hrvatske i Slovenije, ali neće biti ni obrnuto jer trenutno aktualni web servisi nisu svjesni podataka kojima raspolažu koliko je to Alpha.&lt;/p&gt;
</content>
    
    <category term="hr"></category>
    
  </entry>
  
  <entry>
    <title type="html">Creative Commons knjige o informatici i programiranju</title>
    <link href="https://nikola.plejic.com/blog/creative-commons-knjige-o-informatici-i-programiranju" rel="alternate"></link>
    <published>2008-08-18T20:05:24+02:00</published>
    <updated>2008-08-18T20:05:24+02:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2008-08-18:/blog/creative-commons-knjige-o-informatici-i-programiranju</id>
    <summary type="html">Dobre, besplatne, otvorene knjige o IT-ju.
</summary>
    <content type="html">&lt;p&gt;Na internetu je moguće pronaći mnoštvo tutoriala o širokom spektru tema iz informatike, no rijetko što može zamijeniti dobru knjigu. S druge strane, knjige mogu biti (pre)skupe i vrlo teško dostupne, pogotovo ako nemate luksuz posjedovanja kreditne kartice za online kupovinu.&lt;/p&gt;
&lt;p&gt;Zahvaljujući dobroj volji autora (i izdavača), neke su od knjiga koje se smatraju klasicima literature iz područja informatike i programiranja dostupne besplatno, a ponekad i pod vrlo liberalnim licencama. Donosim tri takve: dvije &lt;em&gt;hardcore&lt;/em&gt; programerske i jednu pravno-filozofsku.&lt;span id=&quot;more-56&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;http://mitpress.mit.edu/sicp/full-text/book/book.html&quot;&gt;Abelson &amp;amp; Sussman: Structure and Interpretation of Computer Programs&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Tzv. &lt;em&gt;wizard book&lt;/em&gt; (po čarobnjaku na naslovnoj stranici) je definitivno jedan od &lt;em&gt;the&lt;/em&gt; udžbenika iz programiranja po kojemu su uvodne kolegije iz programiranja učile generacije na &lt;a href=&quot;http://www.mit.edu/&quot;&gt;MIT&lt;/a&gt;-ju. Koristeći Scheme (dijalekt Lispa), objašnjava temeljne koncepte iz računalnih znanosti, npr. apstrakciju i rekurziju.&lt;/p&gt;
&lt;p&gt;U &lt;a href=&quot;http://nikola.plejic.com/blog/linkdump-funkcionalno-programiranje-u-pythonu-uvod-u-haskell/&quot;&gt;jednom&lt;/a&gt; od prethodnih linkdumpova sam objavio i link na video zapise Abelsonovih i Sussmanovih predavanja koja, nažalost, slijede prvo izdanje knjige. Autori napominju da će predavanja biti korisna i vlasnicima drugog izdanja.&lt;/p&gt;
&lt;p&gt;Knjiga je objavljena pod &lt;a href=&quot;http://creativecommons.org/licenses/by-nc/3.0/&quot;&gt;Creative Commons Attribution-Noncommercial 3.0&lt;/a&gt; licencom, čime je dopušteno nesmetano modificiranje i distribuiranje rada za nekomercijalnu uporabu, uz navođenje izvornih autora.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;http://thinking-forth.sourceforge.net/&quot;&gt;Leo Brodie: Thinking Forth&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Još jedna knjiga koja se smatra klasikom—možda u manjoj mjeri od prethodne, što vjerojatno duguje opskurnijem jeziku za kojeg je napisana. No, principi koje objašnjava su univerzalni i neki od njih su nedavno ponovno otkriveni u tzv. eXtreme Programming paradigmi.&lt;/p&gt;
&lt;p&gt;Podnaslov knjige je &lt;em&gt;A Language and Philosophy for Solving Problems&lt;/em&gt;, i bavi se upravo time—dizajnom, analizom i implementacijom rješenja problema. Uz smiješne ilustracije i puno humora, vrlo detaljno opisuje razvoj programa, ali i neke stvari koje se u ovakvoj knjizi ne očekuju, npr. odnos s klijentima.&lt;/p&gt;
&lt;p&gt;Knjiga je skenirana, OCR-ana, obrađena u LaTeXu i objavljena pod &lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/&quot;&gt;Creative Commons Attribution-Noncommercial-Share Alike 2.0&lt;/a&gt; licencom.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;http://www.free-culture.cc/freecontent/&quot;&gt;Lawrence Lessig: Free Culture&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Iako nije direktno povezana s programiranjem, s informatikom definitivno jest. Lawrence Lessig je jedan od osnivača &lt;a href=&quot;http://creativecommons.org/&quot;&gt;Creative Commonsa&lt;/a&gt;, organizacije koja je &amp;#8216;izmislila&amp;#8217; licence pod kojima su gore navedene knjige izdane.&lt;/p&gt;
&lt;p&gt;U ovoj se knjizi Lessig bavi copyrightom, intelektualnim vlasništvom i ostalim stvarima za koje nas &amp;#8216;digitalno doba&amp;#8217; tjera na razmišljanje i redefiniranje. Dostupna je pod &lt;a href=&quot;http://creativecommons.org/licenses/by-nc/1.0/&quot;&gt;Creative Commons Attribution-Noncommercial 1.0&lt;/a&gt; licencom.&lt;/p&gt;
&lt;p&gt;Ove tri knjige bi vas u svakom slučaju trebale držati zauzetim neko vrijeme. Ukoliko sam propustio neku vrijednu spomena, svakako mi javite u komentarima.&lt;/p&gt;
</content>
    
    <category term="hr"></category>
    
  </entry>
  
  <entry>
    <title type="html">Zašto neki developeri misle da su pametniji od drugih</title>
    <link href="https://nikola.plejic.com/blog/zasto-neki-developeri-misle-da-su-pametniji-od-drugih" rel="alternate"></link>
    <published>2008-07-31T10:01:22+02:00</published>
    <updated>2008-07-31T10:01:22+02:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2008-07-31:/blog/zasto-neki-developeri-misle-da-su-pametniji-od-drugih</id>
    <summary type="html">Relativno sam nedavno na Redditu pronašao interesantan dokument pod nazivom Programmer Competency Matrix. Par dana nakon toga sam se ponovno sjetio dotičnog i, zaboravivši link, krenuo u potragu na Googleu.
</summary>
    <content type="html">&lt;p&gt;Relativno sam nedavno na Redditu pronašao interesantan dokument pod nazivom &lt;a href=&quot;http://www.indiangeek.net/wp-content/uploads/Programmer%20competency%20matrix.htm&quot;&gt;Programmer Competency Matrix&lt;/a&gt;. Par dana nakon toga sam se ponovno sjetio dotičnog i &amp;#8211; zaboravivši link &amp;#8211; krenuo u potragu na Googleu. Usput sam naletio na nekoliko članaka na blogovima koji komentiraju tablicu, od kojih mi je &lt;a href=&quot;http://gadgetopia.com/post/6452&quot;&gt;jedan&lt;/a&gt; posebno zapeo za oko.&lt;span id=&quot;more-25&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Autor, naime, opravdava svoj nezadovoljavajući uspjeh na &amp;#8220;testu&amp;#8221; činjenicom da je on web developer, dok je tablica dizajnirana za &lt;em&gt;čiste programere&lt;/em&gt;. Ne ulazeći u semantiku pojma &amp;#8220;čisti programer&amp;#8221; (koja mi nikako nije jasna), stav članka me izrazito iznenadio. Imam osjećaj kao da autor smatra da je njegovo neznanje sasvim prirodno i opravdano samo zato jer se on bavi &amp;#8211; webom.&lt;/p&gt;
&lt;p&gt;Zadnji put kad sam ja provjeravao, svi smo mi pisali &lt;strong&gt;programe&lt;/strong&gt;. I web i offline aplikacije ovise o gotovo identičnim resursima &amp;#8211; obje koriste CPU vrijeme, memoriju i prostor na disku. I u web aplikacijama se podaci mogu provlačiti kroz kompleksne algoritme kod kojih je itekako bitna potrošnja tih resursa.&lt;/p&gt;
&lt;p&gt;Svakako, neke od stvari navedenih u tablici nisu &lt;em&gt;neophodne&lt;/em&gt; prosječnom web developeru. Čemu onda sve to? Dublje (teorijsko) poznavanje područja kojim se bavite nerijetko nagrađuje mnogim stvarima koje možete primijeniti u praksi i razumijevanjem stvari koje već primjenjujete. Uostalom, &lt;a href=&quot;http://www.joelonsoftware.com/&quot;&gt;Joel&lt;/a&gt; je o potrebi poznavanja low-level stvari pisao već &lt;a href=&quot;http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html&quot;&gt;nekoliko&lt;/a&gt; &lt;a href=&quot;http://www.joelonsoftware.com/articles/fog0000000319.html&quot;&gt;puta&lt;/a&gt; i sve to objasnio puno bolje od mene.&lt;/p&gt;
&lt;p&gt;U proteklih tjedan-dva sam pročitao nekoliko &lt;a href=&quot;http://itmanagement.earthweb.com/entdev/article.php/11070_3761921_1&quot;&gt;članaka&lt;/a&gt; u kojima se na web development gleda s visoka, kao na manje vrijedan dio programiranja (link samo na jedan jer sam ostale zaboravio bookmarkirati &amp;#8211; tko prati &lt;a href=&quot;http://www.reddit.com/&quot;&gt;Reddit&lt;/a&gt; i &lt;a href=&quot;http://www.dzone.com/&quot;&gt;DZone&lt;/a&gt; će se sigurno sjetiti još pokojeg). Stavovi slični onima u gore navedenom postu autorima tih članaka sigurno nisu odmogli u formiranju takvog mišljenja.&lt;/p&gt;
</content>
    
    <category term="hr"></category>
    
  </entry>
  
  <entry>
    <title type="html">Open source softver za matematiku i prirodne znanosti</title>
    <link href="https://nikola.plejic.com/blog/open-source-softver-za-matematiku-i-prirodne-znanosti" rel="alternate"></link>
    <published>2008-07-22T12:00:07+02:00</published>
    <updated>2008-07-22T12:00:07+02:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2008-07-22:/blog/open-source-softver-za-matematiku-i-prirodne-znanosti</id>
    <summary type="html">Budući da je open source softver vrlo raširen u znanosti (zapravo, tamo je sve i počelo), bilo bi neobično da ne postoje besplatne, otvorene alternative koje će biti i više nego dovoljne prosječnom studentu i entuzijastu, a sigurno će zadovoljiti i potrebe nekih od zahtjevnijih korisnika.
</summary>
    <content type="html">&lt;p&gt;Svatko tko se ikada imalo intenzivnije bavio prirodnim znanostima čiji je jezik sporazumijevanja matematika, morao se upoznati s jednom od mnogobrojnih programskih paketa za numeričku ili simboličku kalkulaciju.&lt;/p&gt;
&lt;p&gt;Mathematica, MATLAB i Origin su neki od najpopularnijih, no iako su to odlične aplikacije, mnoge će vrlo brzo odbiti njihova cijena. Naime, samo studentska licenca za Wolframovu Mathematicu košta 80 funti (blizu 800 kn), dok je MATLAB za studentski džep nešto jeftiniji &amp;#8211; 99 dolara (oko 450 kn).&lt;span id=&quot;more-5&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Neki fakulteti nude svojim studentima besplatne licence za neke od navedenih aplikacija. Problemi nastaju ukoliko niste na jednom od tih fakulteta i/ili se time bavite čisto rekreativno &amp;#8211; u tom slučaju vam cijene mogu ubiti početni entuzijazam i natjerati vas da se odete baviti mrvicu isplativijim hobijem.&lt;/p&gt;
&lt;p&gt;No, nije sve tako crno. Budući da je open source softver vrlo raširen u znanosti (zapravo, tamo je sve i počelo), bilo bi neobično da ne postoje besplatne, otvorene alternative koje će biti i više nego dovoljne prosječnom studentu i entuzijastu, a sigurno će zadovoljiti i potrebe nekih od zahtjevnijih korisnika.&lt;/p&gt;
&lt;p&gt;Navedeni softver ne moraju nužno koristiti samo doktori matematike. Iako većina softvera iz ove kategorije neće dobiti nagradu za najintuitivniju aplikaciju s korisničke strane, uz malo podešavanja i truda može odlično poslužiti i srednjoškolcima i osnovnoškolcima pri savladavanju nekih matematičkih koncepata i često zaboravljenog i zanemarenog &amp;#8220;igranja&amp;#8221; s matematikom.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;http://www.gnu.org/software/octave/&quot;&gt;GNU Octave&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img class=&quot;alignleft size-medium wp-image-9&quot; style=&quot;float: left;&quot; title=&quot;ossmath_octave&quot; src=&quot;http://nikola.plejic.com/blog/wp-content/uploads/2008/07/ossmath_octave.jpg&quot; alt=&quot;GNU Octave&quot; width=&quot;266&quot; height=&quot;148&quot; /&gt;&lt;em&gt;Konkurira: FORTRAN-u, MATLAB-u&lt;br /&gt;
Licenca: GNU GPL&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;GNU Octave je programski jezik prvenstveno namijenjen numeričkom računanju. Donekle je kompatibilan s MATLAB-om, a kompatibilnost se &amp;#8211; navodno &amp;#8211; iz verzije u verziju poboljšava.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.gnu.org/software/octave/about.html&quot;&gt;About&lt;/a&gt; stranica navodi da Octave ima alate za rješavanje problema iz linearne algebre, nalaženje korijena nelinearnih jednadžbi, rad s polinomima i integraciju običnih funkcija i običnih diferencijalnih jednadžbi, među ostalim.&lt;/p&gt;
&lt;p&gt;Octave je nastao kao reakcija na FORTRAN, kao prateći softver udžbenika za kemijski inžinjering. Ukoliko ste upoznati s MATLAB-om, jezik vam ne bi trebao biti problem, a ukoliko niste, odličan (iako nedovršen) tutorial se nalazi &lt;a href=&quot;http://wiki.aims.ac.za/mediawiki/index.php/Octave&quot;&gt;ovdje&lt;/a&gt;. Octave je trenutno u verziji 3.0.1 i dostupan je za &lt;a href=&quot;http://www.gnu.org/software/octave/download.html&quot;&gt;download&lt;/a&gt; sa &lt;a href=&quot;http://www.gnu.org/software/octave/&quot;&gt;službene stranice&lt;/a&gt; projekta.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;http://www.gnuplot.info&quot;&gt;gnuplot&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img class=&quot;alignright size-medium wp-image-11&quot; style=&quot;float: right;&quot; title=&quot;ossmath_gnuplot&quot; src=&quot;http://nikola.plejic.com/blog/wp-content/uploads/2008/07/ossmath_gnuplot-300x177.png&quot; alt=&quot;gnuplot&quot; width=&quot;214&quot; height=&quot;126&quot; /&gt;&lt;em&gt;Licenca: source kod je dostupan, ali &lt;a href=&quot;http://www.gnuplot.info/faq/faq.html#SECTION00036000000000000000&quot;&gt;redistribucija modificiranih verzija nije dopuštena&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Gnuplot je besplatni alat za dvodimenzionalno ili trodimenzionalno plotanje (pametni izraz za &amp;#8220;crtanje&amp;#8221;) podataka i funkcija. Podržava mnoštvo formata za output, među kojima i znanstvenicima omiljeni LaTeX. Vrlo je &lt;a href=&quot;http://gnuplot.sourceforge.net/demo_4.2/&quot;&gt;moćan&lt;/a&gt;, a može se koristiti i u sklopu Octavea, kao engine za plotanje.&lt;/p&gt;
&lt;p&gt;Iako ima &amp;#8220;gnu&amp;#8221; u imenu, gnuplot nema veze s &amp;#8220;onim&amp;#8221; GNU-om, i licenca mu ne dopušta redistribuciju modificirane verzije programa. Trenutno je u verziji 4.2 i može se &lt;a href=&quot;http://www.gnuplot.info/download.html&quot;&gt;naći&lt;/a&gt; na &lt;a href=&quot;http://www.gnuplot.info&quot;&gt;službenim stranicama&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;http://axiom-wiki.newsynthesis.org/FrontPage&quot;&gt;Axiom&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img class=&quot;alignleft size-medium wp-image-12&quot; style=&quot;float: left;&quot; title=&quot;ossmath_axiom&quot; src=&quot;http://nikola.plejic.com/blog/wp-content/uploads/2008/07/ossmath_axiom.png&quot; alt=&quot;Axiom&quot; width=&quot;147&quot; height=&quot;55&quot; /&gt;&lt;em&gt;Konkurira: Mathematici&lt;br /&gt;
Licenca: Modificirana BSD licenca&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ovo je vjerojatno najkompleksniji i najstariji ovdje predstavljeni projekt. Razvoj je započet 1973. u IBM-u, a od tada je bio pod raznim tvrtkama. Danas ga održava Tim Daly, bivši glavni developer projekta.&lt;/p&gt;
&lt;p&gt;Axiom je CAS (Computer Algebra System) s interaktivnim okruženjem, vlastitim programskim jezikom i velikim skupom libraryja za numeričke, simboličke i algebarske proračune.&lt;/p&gt;
&lt;p&gt;Najbolje mjesto za informacije je &lt;a href=&quot;http://axiom-wiki.newsynthesis.org/FrontPage&quot;&gt;wiki&lt;/a&gt; na kojem možete interaktivno koristiti Axiom (zajedno s drugim softverom kao što je Sage, Maxima i sl.) bez potrebe za instalacijom na vlastito računalo.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;http://www.geogebra.org/cms/&quot;&gt;Geogebra&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Licenca: GNU GPL&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;alignnone size-medium wp-image-13&quot; title=&quot;ossmath_geogebra&quot; src=&quot;http://nikola.plejic.com/blog/wp-content/uploads/2008/07/ossmath_geogebra-300x47.png&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;47&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ukoliko vam je sve ovo prekomplicirano, tu je Geogebra. Mali, jednostavan, ali moćan program napisan u Javi namijenjen je prvenstveno školama (osnovnim i srednjim). Najviše je fokusiran na geometriju, ali može i derivirati i integrirati neke funkcije.&lt;/p&gt;
&lt;p&gt;Geogebra je odlično dokumentirana i dovoljno je jednostavna da se može (i trebala bi se) naći u svakoj učionici na satovima matematike za lakše i brže razumijevanje gradiva, pogotovo trigonometrijskih funkcija, derivacija i integrala.&lt;/p&gt;
&lt;p&gt;Trenutno je u verziji 3 i dostupna je za &lt;a href=&quot;http://www.geogebra.org/download/install.htm&quot;&gt;download&lt;/a&gt; sa &lt;a href=&quot;http://www.geogebra.org/cms/&quot;&gt;službene stranice&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Ima toga još!&lt;/h3&gt;
&lt;p&gt;Na Ubuntu wikiju postoji odjeljak &lt;a href=&quot;https://help.ubuntu.com/community/UbuntuScience&quot;&gt;UbuntuScience&lt;/a&gt; gdje možete pronaći još mnogo vezanih aplikacija s linkovima na njihove stranice. Bez brige, iako se radi o Ubuntu wikiju, većina navedenog softvera radi i na drugim platformama.&lt;/p&gt;
</content>
    
    <category term="hr"></category>
    
  </entry>
  
  <entry>
    <title type="html">Programiranje i informatika – Je li fakultet potreban?</title>
    <link href="https://nikola.plejic.com/blog/programiranje-i-informatika-je-li-fakultet-potreban" rel="alternate"></link>
    <published>2008-07-01T14:40:26+02:00</published>
    <updated>2008-07-01T14:40:26+02:00</updated>
    <author>
      <name>Nikola Plejić</name>
    </author>
    <id>tag:nikola.plejic.com,2008-07-01:/blog/programiranje-i-informatika-je-li-fakultet-potreban</id>
    <summary type="html">U posljednje vrijeme po raznim forumima relativno često naletim na thread gdje mladi (budući) developeri razmišljaju o odabiru srednje škole ili fakulteta. S obzirom da nerijetko dobivam takva pitanja od svojih poznanika, a u sličnoj situaciji sam nedavno bio i sam, imao sam prilike dugo i intenzivno razmišljati o ovoj temi.
</summary>
    <content type="html">&lt;p&gt;U posljednje vrijeme po raznim forumima relativno često naletim na thread gdje mladi (budući) developeri razmišljaju o odabiru srednje škole ili fakulteta. S obzirom da nerijetko dobivam takva pitanja od svojih poznanika, a u sličnoj situaciji sam nedavno bio i sam, imao sam prilike dugo i intenzivno razmišljati o toj temi. Prosječan razgovor s dotičnom žrtvom sada izgleda nekako ovako.&lt;span id=&quot;more-6&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Želite li programirati?&lt;/h3&gt;
&lt;p&gt;&lt;img class=&quot;alignright size-medium wp-image-8&quot; style=&quot;float: right;&quot; title=&quot;sxc_progfaksevi02&quot; src=&quot;http://nikola.plejic.com/blog/wp-content/uploads/2008/07/sxc_progfaksevi02.jpg&quot; alt=&quot;&quot; width=&quot;250&quot; height=&quot;188&quot; /&gt;Prvo što savjetujem svima je da dobro razmisle je li programiranje nešto s čime se žele baviti do kraja života. Programiranje može biti vrlo zabavno, no pojam zabave jednog četrnaestogodišnjaka i dvadesetpetogodišnjaka zasigurno nije identičan.&lt;/p&gt;
&lt;p&gt;Naravno, očekivati od osnovnoškolca (pa čak i ponekog maturanta) da pokuša zamisliti bi li ga/ju dotični posao ispunjavao u srednjim godinama je nerealno, ali svatko s malo iskustva u ovom području mu/joj može dati okvirnu sliku nekakvog prosječnog posla u IT sektoru.&lt;/p&gt;
&lt;h3&gt;Fakultet možda nije bitan, ali&amp;#8230;&lt;/h3&gt;
&lt;p&gt;Nadalje, naglasim da formalno obrazovanje u ovom području ljudske djelatnosti na kraju krajeva i nije toliko bitno. Profil ljudi koje sam imao prilike upoznati, a koji se profesionalno bave webom i programiranjem općenito je impresivno raznolik: tu ima sociologa, matematičara, fizičara, fitness trenera, filozofa, informatologa, elektrotehničara (visokog i srednjeg stupnja obrazovanja), ekonoma&amp;#8230;&lt;/p&gt;
&lt;p&gt;U biti, puno je lakše navesti struke koje nisam susreo tijekom proteklih nekoliko godina &amp;#8211; veterinari mi prvi padaju napamet, ali sam siguran da ćete me ubrzo razuvjeriti.&lt;/p&gt;
&lt;p&gt;Nakon početnog šoka &amp;#8220;pa u biti taj fakultet ti baš i nije tol&amp;#8217;ko bitan&amp;#8221; stavom, ravnotežu u svemiru održi činjenica da je, bez obzira na faks, potrebno uložiti puno (ovo obično izrazito naglasim i popratim grotesknim gestama čime pokušavam naglasiti koliko je puno to &amp;#8220;puno&amp;#8221;) &lt;em&gt;ex privata diligentia&lt;/em&gt; rada na vlastitom skupu vještina koji, naravno, ovisi u području u koje se predmet ove rasprave želi usmjeriti (web, desktop, znanost&amp;#8230;).&lt;/p&gt;
&lt;h3&gt;Hrvatski fakulteti za programere&lt;/h3&gt;
&lt;p&gt;Oni koji prežive do ovog trenutka i ustraju u razgovoru, ovdje obično zahtijevaju neku konačnu preporuku srednje škole ili fakulteta, unatoč mom silnom trudu da konačni odgovor izbjegnem i &amp;#8220;brigo moja prijeđi na drugoga&amp;#8221; metodom taj savjet prepustim nekome drugom.&lt;/p&gt;
&lt;p&gt;Što se srednje škole tiče, tu obično preporučim neku gimnaziju &amp;#8211; ne nužno prirodoslovno-matematičku, iako ta jest najprirodnije usmjerenje u ovom slučaju. Gimnazija, koliko god nepraktična bila, ipak koliko-toliko drži ljude podalje od nekog fah-idiotizma i fah-elitizma, a nudi dovoljno prostora za manevriranje i ako se početno usmjerenje promaši.&lt;/p&gt;
&lt;p&gt;Moj izbor fakulteta je sljedeći, i to ovim redoslijedom:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://www.math.hr/Default.aspx?art=2011&amp;amp;sec=297&quot;&gt;Matematika i računarstvo&lt;/a&gt; na &lt;a href=&quot;http://www.math.hr/Default.aspx&quot;&gt;Matematičkom odjelu&lt;/a&gt; &lt;a href=&quot;http://www.pmf.hr/&quot;&gt;Prirodoslovno-matematičkog fakulteta&lt;/a&gt; u Zagrebu&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.fer.hr/diplomski_studij/rac&quot;&gt;Računarstvo&lt;/a&gt; na &lt;a href=&quot;http://www.fer.hr/&quot;&gt;Fakultetu elektrotehnike i računarstva&lt;/a&gt; u Zagrebu (kroz neki od ponuđenih profila)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.foi.hr/studiji/ipi.html&quot;&gt;Informacijsko i programsko inženjerstvo&lt;/a&gt; na &lt;a href=&quot;http://www.foi.hr/index.html&quot;&gt;Fakultetu organizacije i informatike&lt;/a&gt; u Varaždinu&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://informatika.tvz.hr/&quot;&gt;Informatika&lt;/a&gt; na &lt;a href=&quot;http://www.tvz.hr/&quot;&gt;Tehničkom veleučilištu&lt;/a&gt; u Zagrebu&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;N.B. da su svi gornji studiji, izuzev zadnjeg, diplomski (onih +2 u 3+2 &amp;#8220;bolonjskom&amp;#8221; sustavu). Prijedlozi pod brojevima 2, 3 i 4 su poprilično očiti i vjerujem da ih ne treba dodatno pojašnjavati. To je ono što otprilike svatko tko dođe po savjet želi čuti, i ono što sam zna.&lt;/p&gt;
&lt;p&gt;Na prvi navedeni prijedlog se većina zgnuša, ili ga šutke zanemari. No, nakon dvije godine na PMF-u (doduše, na &lt;a href=&quot;http://www.phy.hr/&quot;&gt;drugom odsjeku&lt;/a&gt;) smatram da je to fakultet koji može oblikovati stvarno kvalitetnog developera.&lt;/p&gt;
&lt;p&gt;Program na Matematičkom odsjeku mi se čini jako kvalitetnim, a stečeno znanje matematike je nešto što se nikako ne smije podcijeniti. Također, matematika je osnova svih informacijskih znanosti i poznavanje te (subjektivno, predivne) znanosti osobi koja se planira baviti programiranjem nikako neće biti na odmet.&lt;/p&gt;
&lt;h3&gt;﻿&lt;span style=&quot;font-size: small;&quot;&gt;Koju srednju školu / fakultet odabrati?&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img class=&quot;alignleft alignnone size-medium wp-image-7&quot; style=&quot;float: left;&quot; title=&quot;sxc_progfaksevi01&quot; src=&quot;http://nikola.plejic.com/blog/wp-content/uploads/2008/07/sxc_progfaksevi01.jpg&quot; alt=&quot;&quot; width=&quot;250&quot; height=&quot;214&quot; /&gt;Odabir dobre srednje škole i fakulteta je svakako nešto što budućem developeru može pomoći, no nikako nije presudno. U zadnje vrijeme sam svjedok sve većem broju ljudi koji su inače jako dobri u ovom području, a biraju srednje škole i fakultete koji nisu nužno vezani uz informatiku.&lt;/p&gt;
&lt;p&gt;Razloga je mnogo &amp;#8211; neki od njih stvarno žele graditi karijeru u nekom drugom području, neke izrazito zanima &amp;#8220;taj drugi&amp;#8221; fakultet i smatraju da i uz to mogu ostati konkurentni kao developeri, neki žele imati plan B u slučaju da im se ovaj posao zgadi, propadne i sl.&lt;/p&gt;
&lt;p&gt;Iz moje perspektive, to nikako nije loša praksa. Činjenica je da, i uz fakultet vezan uz informacijske znanosti, treba mnogo raditi na vlastitom skillsetu; ja još čekam na obrazovnu ustanovu koja će osobu pripremiti na situacije s kojima se prosječan developer svakodnevno susreće u &amp;#8220;stvarnom svijetu&amp;#8221;.&lt;/p&gt;
&lt;h3&gt;Iz komentara&lt;/h3&gt;
&lt;p&gt;Komentatori su mi skrenuli pozornost na dva članka koja se bave sličnom problematikom. Jedan je članak &lt;a href=&quot;http://www.softwave.info/&quot;&gt;Berislava Lopca&lt;/a&gt;, pod nazivom &lt;a href=&quot;http://www.softwave.info/business/kodiranje-i-obrazovanje/&quot;&gt;Kodiranje i obrazovanje&lt;/a&gt;, a drugi &lt;a href=&quot;http://snaxors.com/blog&quot;&gt;Tonija Aničića&lt;/a&gt; &lt;a href=&quot;http://snaxors.com/blog/koji-fakultet-skolu-tecaj-da-zavrsim-ako-zelim-raditi-web-stranice/&quot;&gt;Koji fakultet / školu / tečaj da završim ako želim raditi web stranice?&lt;/a&gt;. Oba su popraćena interesantnim raspravama koje svakako vrijedi pročitati.&lt;/p&gt;
&lt;p&gt;Ukoliko vas programiranje toliko ne zanima i više ste marketinški tip, Mario Frančešević donosi &lt;a href=&quot;http://www.seekandhit.com/blog/opcenito/koja-znanja-treba-imati-internet-marketing-strucnjak/&quot;&gt;pregled vještina&lt;/a&gt; koje osoba koja se planira baviti internet marketingom. Mario je u komentarima također poslao link na interesantan članak iz Wall Street Journala pod nazivom &lt;a href=&quot;http://online.wsj.com/article/SB121858688764535107.html?mod=rss_Today%27s_Most_Popular&quot;&gt;For Most People, College Is a Waste of Time&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Također, u &lt;a href=&quot;http://nikola.plejic.com/blog/programiranje-i-informatika-je-li-fakultet-potreban/#comments&quot;&gt;komentarima&lt;/a&gt; možete pročitati i iskustva nekih ljudi koji su kroz fakultet (ili njegov nedostatak) već prošli, pa skoknite do tamo, pročitajte što kažu i pridružite se raspravi.&lt;/p&gt;
</content>
    
    <category term="hr"></category>
    
  </entry>
  
</feed>