<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <atom:link href="https://jacek.zlydach.pl/blog/feed.xml" rel="self" type="application/rss+xml"/>
    <title>Jacek Złydach - blog</title>
    <link>https://jacek.zlydach.pl/blog/</link>
    <lastBuildDate>Tue, 25 Jan 2022 12:54:25 +0100</lastBuildDate>
    <description>Blog of Jacek Złydach - a programmer and science enthusiast.</description>
    <generator>Regenerate2</generator>
    <managingEditor>temporal.pl@gmail.com (Jacek Złydach)</managingEditor>
    <webMaster>temporal.pl@gmail.com (Jacek Złydach)</webMaster>
    <ttl>1440</ttl>
    <copyright>© 2017, 2018, 2019, 2020, 2021, 2022, Jacek Złydach</copyright>
    <item>
      <title>Blocking distractions with a Mikrotik router</title>
      <link>https://jacek.zlydach.pl/blog/2020-05-25-blocking-distractions-with-mikrotik-router.html</link>
      <guid isPermaLink="true">https://jacek.zlydach.pl/blog/2020-05-25-blocking-distractions-with-mikrotik-router.html</guid>
      <pubDate>Mon, 25 May 2020 16:00:00 +0200</pubDate>
      <category domain="https://jacek.zlydach.pl/blog/tags/mikrotik.html">Mikrotik</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/procrastination.html">procrastination</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/productivity.html">productivity</category>
      <description><![CDATA[Quick tip on how to use a Mikrotik router to filter unwanted sites on select LAN devices, within specified time range.]]></description>
    </item>    <item>
      <title>Introducing Tracer - A Tracing Profiler for Common Lisp</title>
      <link>https://jacek.zlydach.pl/blog/2020-02-04-introducing-tracer-a-tracing-profiler-for-common-lisp.html</link>
      <guid isPermaLink="true">https://jacek.zlydach.pl/blog/2020-02-04-introducing-tracer-a-tracing-profiler-for-common-lisp.html</guid>
      <pubDate>Tue, 04 Feb 2020 03:31:00 +0100</pubDate>
      <category domain="https://jacek.zlydach.pl/blog/tags/programming.html">programming</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/common-lisp.html">Common Lisp</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/lisp.html">Lisp</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/performance.html">performance</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/gamedev.html">gamedev</category>
      <description><![CDATA[A tracing profiler is a great thing to have, so I wrote one for Common Lisp. Or at least for SBCL, for now.]]></description>
    </item>    <item>
      <title>Static local variables in Common Lisp</title>
      <link>https://jacek.zlydach.pl/blog/2020-01-11-static-variables-in-common-lisp.html</link>
      <guid isPermaLink="true">https://jacek.zlydach.pl/blog/2020-01-11-static-variables-in-common-lisp.html</guid>
      <pubDate>Sat, 11 Jan 2020 00:20:00 +0100</pubDate>
      <category domain="https://jacek.zlydach.pl/blog/tags/programming.html">programming</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/performance.html">performance</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/common-lisp.html">Common Lisp</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/lisp.html">Lisp</category>
      <description><![CDATA[How to make a Common Lisp equivalent of a C/C++ static variable, and when such thing is useful.]]></description>
    </item>    <item>
      <title>Advertising is a cancer on society</title>
      <link>https://jacek.zlydach.pl/blog/2019-07-31-ads-as-cancer.html</link>
      <guid isPermaLink="true">https://jacek.zlydach.pl/blog/2019-07-31-ads-as-cancer.html</guid>
      <pubDate>Wed, 31 Jul 2019 20:00:00 +0200</pubDate>
      <category domain="https://jacek.zlydach.pl/blog/tags/advertising.html">advertising</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/marketing.html">marketing</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/cancer.html">cancer</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/beliefs.html">beliefs</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/privacy.html">privacy</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/surveillance.html">surveillance</category>
      <description><![CDATA[A detailed explanation of why I keep saying that advertising is a cancer on modern society.]]></description>
    </item>    <item>
      <title>Algebraic Effects - You Can Touch This!</title>
      <link>https://jacek.zlydach.pl/blog/2019-07-24-algebraic-effects-you-can-touch-this.html</link>
      <guid isPermaLink="true">https://jacek.zlydach.pl/blog/2019-07-24-algebraic-effects-you-can-touch-this.html</guid>
      <pubDate>Wed, 24 Jul 2019 14:20:00 +0200</pubDate>
      <category domain="https://jacek.zlydach.pl/blog/tags/algebraic-effects.html">algebraic effects</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/programming.html">programming</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/javascript.html">JavaScript</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/common-lisp.html">Common Lisp</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/lisp.html">Lisp</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/scheme.html">Scheme</category>
      <description><![CDATA[The so-called "algebraic effects" aren't only theoretical work; a subset of it has been used in practice for decades. In this post, I'll show you where and how.]]></description>
    </item>    <item>
      <title>Serving directories over HTTP with Emacs</title>
      <link>https://jacek.zlydach.pl/blog/2018-05-29-serving-directories-over-http-with-emacs.html</link>
      <guid isPermaLink="true">https://jacek.zlydach.pl/blog/2018-05-29-serving-directories-over-http-with-emacs.html</guid>
      <pubDate>Tue, 29 May 2018 07:30:00 +0200</pubDate>
      <category domain="https://jacek.zlydach.pl/blog/tags/emacs.html">Emacs</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/emacs-lisp.html">Emacs Lisp</category>
      <description><![CDATA[A handy utility for serving contents of files and directories locally, over HTTP, with Emacs.]]></description>
    </item>    <item>
      <title>Going far, going small</title>
      <link>https://jacek.zlydach.pl/blog/2018-01-06-going-far-going-small.html</link>
      <guid isPermaLink="true">https://jacek.zlydach.pl/blog/2018-01-06-going-far-going-small.html</guid>
      <pubDate>Sat, 06 Jan 2018 13:00:00 +0100</pubDate>
      <category domain="https://jacek.zlydach.pl/blog/tags/career.html">career</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/space.html">space</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/biology.html">biology</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/biotech.html">biotech</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/newspace.html">NewSpace</category>
      <description><![CDATA[An introduction to and rationale of my planned career pivot to spacetech and/or biotech.]]></description>
    </item>    <item>
      <title>Lisp, Raspberry Pi 3 and ditching Wordpress</title>
      <link>https://jacek.zlydach.pl/blog/2016-04-23-lisp-raspberry-pi-3-and-ditching-wordpress.html</link>
      <guid isPermaLink="true">https://jacek.zlydach.pl/blog/2016-04-23-lisp-raspberry-pi-3-and-ditching-wordpress.html</guid>
      <pubDate>Sat, 23 Apr 2016 13:23:37 +0200</pubDate>
      <category domain="https://jacek.zlydach.pl/blog/tags/old-blog.html">Old blog</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/wordpress.html">wordpress</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/webmasterka.html">webmasterka</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/lisp.html">Lisp</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/common-lisp.html">Common Lisp</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/emacs.html">Emacs</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/org-mode.html">org-mode</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/raspberry-pi.html">Raspberry Pi</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/hardware-hacking.html">hardware hacking</category>
      <description><![CDATA[Few quick updates.

I've been playing with Lisp and Raspberry Pi some more recently. I got an external TFT screen (a cheap Chinese one) to work and managed to fire up some lispbuilder-sdl example programs. You can see it in action <a href="https://www.youtube.com/watch?v=5srink61IGY">in this YouTube video</a>. By the way, setting that TFT screen up was a bit annoying and is something I plan to describe in full for posterity.

Speaking of which, yeah, I got a Raspberry Pi 3. It's just like RPi2, except it has on-board Wi-Fi and Bluetooth - so it's much more convenient to use. SBCL still cannot into threads on ARM, so for now I recommend sticking to CCL, as previously advised.

Oh, by the way, I made some <a href="https://github.com/TeMPOraL/cl-wiringpi2">bindings to WiringPi 2 for Common Lisp</a>. Also,<a href="https://github.com/TeMPOraL/nyan-mode"> Nyan Mode got an update too</a> (and there's <a href="https://github.com/TeMPOraL/nyan-mode/tree/dev">an experimental click-to-scroll feature on the dev branch</a>)!

Now for the big news - I'm finally through dealing with Wordpress. I was planning to eventually ditch it one day and migrate to a simpler system of my own making (written in Common Lisp, of course!), but the recent hack I fell victim of made me convinced that the change must happen sooner rather than later. I'm not sure how the new blog / home site will look like, but I have some design goals:
<ul>
<li>Maintaining of original URLs of all archival posts. <a href="https://www.w3.org/Provider/Style/URI.html">Cool URIs don't change</a>, etc.</li>
<li>Efficiency. The blog itself will probably be handled by a static site generator (I'm <a href="https://github.com/kingcons/coleslaw">exploring options</a> at the moment). I don't see the reason to burn so much coal a Wordpress invocation does for what amounts to a bunch of static page with text and images.</li>
<li>Emacs-based management, via Org Mode in particular. I hope to reach the ability to write posts purely in Org Mode, and have them published straight from Emacs, automagically updating stuff like sitemaps and RSS feeds.</li>
<li>A decent support for storing essays and wiki-like-articles (that require versioning and easy viewing of change history as well as linking to old versions).</li>
</ul>

See you soon!
]]></description>
    </item>    <item>
      <title>Getting AltGr to run on Ubuntu under VirtualBox on Windows</title>
      <link>https://jacek.zlydach.pl/blog/2015-03-09-getting-altgr-to-run-on-ubuntu-under-virtualbox-on-windows.html</link>
      <guid isPermaLink="true">https://jacek.zlydach.pl/blog/2015-03-09-getting-altgr-to-run-on-ubuntu-under-virtualbox-on-windows.html</guid>
      <pubDate>Mon, 09 Mar 2015 00:53:35 +0100</pubDate>
      <category domain="https://jacek.zlydach.pl/blog/tags/old-blog.html">Old blog</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/windows.html">Windows</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/porady.html">porady</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/linux.html">Linux</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/stumpwm.html">StumpWM</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/ubuntu.html">Ubuntu</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/virtualbox.html">VirtualBox</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/keyboard.html">keyboard</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/problem.html">problem</category>
      <description><![CDATA[<em>I need to dump this arcane piece of knowledge somewhere so it will get indexed by Google and maybe make things easier to find for the next person who has this problem.</em>

So you installed a Linux in a VirtualBox under Windows machine, and now your Right Alt (aka. AltGr) started to work like CTRL under Linux? Here's a quick solution that makes no sense whatsoever, but works.

Go to the VirtualBox Manager window, open File-&gt;Preferences, and under Input tab uncheck the Auto Capture Keyboard option. Ta da, your AltGr should be working properly now. As a side effect, your Alt+Tab combo will <em>stop</em> working, being captured by Windows now. Also, make sure that when a VirtualBox pop-up shows up, asking you to capture keyboard, you click Cancel - otherwise AltGr will get back to being broken again until you &quot;uncapture&quot; input, by e.g. switching to host Windows system.

Source: about an hour or two in total wasted on three different occasions to find <a href="http://superuser.com/questions/681350/using-windows-as-a-virtualbox-host-how-i-can-get-altgr-behavior-on-linux-guest">this SuperUser answer</a>.

Now that it's fixed, I can finally get back to playing with <a href="https://stumpwm.github.io/">StumpWM</a>.
]]></description>
    </item>    <item>
      <title>Lisp on Raspberry Pi 2, Part 1 - Setting Up</title>
      <link>https://jacek.zlydach.pl/blog/2015-03-07-lisp-on-raspberry-pi-2-part-1-setting-up.html</link>
      <guid isPermaLink="true">https://jacek.zlydach.pl/blog/2015-03-07-lisp-on-raspberry-pi-2-part-1-setting-up.html</guid>
      <pubDate>Sat, 07 Mar 2015 18:48:35 +0100</pubDate>
      <category domain="https://jacek.zlydach.pl/blog/tags/old-blog.html">Old blog</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/porady.html">porady</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/roboty.html">roboty</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/lisp.html">Lisp</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/common-lisp.html">Common Lisp</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/emacs.html">Emacs</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/raspberry-pi.html">Raspberry Pi</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/home-automation.html">home automation</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/hardware-hacking.html">hardware hacking</category>
      <description><![CDATA[<em>(As you might have noticed, I started writing some posts in English now. I've been meaning to do that for some, maintaining two language versions for each post, but this has proven to be too much work. So for now, posts that may be useful for a wider (international) audience will be written in English.)</em>

<em>[trigger warning: Lisp]</em>

So recently I got myself a brand, new <a href="http://www.raspberrypi.org/products/raspberry-pi-2-model-b/">Raspberry Pi 2</a>. It's the first time I'm playing around with such platform, so I'm still exploring the possible applications. And of course the, first thing I thought about is how to get a decent Lisp working on it. This series of posts will describe my experiences with the process of setting up a Lisp environment and using it for basic hardware development.

For those of you who don't know, Raspberry Pi is a small computer based on ARM architecture, with storage provided via SD card and a bunch of general-purpose IO (GPIO) pins for interfacing with other electronics. It's two main features are low power requirements and <a href="http://readwrite.com/2014/05/07/arduino-vs-raspberry-pi-projects-diy-platform">being something between an Arduino and an actual PC</a>.

<strong>Setting up the Pi</strong>
I don't want to go into too many details, as the process is well covered in various tutorials. What I did is, I took the SD card from my cell phone (Raspberry Pi 2 uses microSD cards instead of SD the previous one required) and flashed it with Raspbian, a Debian Linux derivative. I plugged a screen and a keyboard to it on the first run, and later just left it running headless attached to my home router, configuring the latter to always assign the same IP address to the Pi.

Since Raspberry Pi is an ARM machine, my choice of Common Lisp implementations were limited. Fortunately, the two most popular (and the ones I like the most) implementations - SBCL and CCL - both support ARM architecture<a name="POST_LISP_RPI_1_MT_1" href="blog/2015-03-07-lisp-on-raspberry-pi-2-part-1-setting-up.html#POST_LISP_RPI_1_FN_1"><sup>[1]</sup></a>.<span class="sidenote"><a name="POST_LISP_RPI_1_FN_1" href="blog/2015-03-07-lisp-on-raspberry-pi-2-part-1-setting-up.html#POST_LISP_RPI_1_MT_1"><sup>[1]</sup></a> - There's also ECL (Embeddable Common Lisp) that apparently works well on ARMs, but I haven't looked at it in like three years, so I decided to skip it for now.</span> I favour those two implementations because they are the most robust and performant of those freely available<a name="POST_LISP_RPI_1_MT_2" href="blog/2015-03-07-lisp-on-raspberry-pi-2-part-1-setting-up.html#POST_LISP_RPI_1_FN_2"><sup>[2]</sup></a>.

The conventional wisdom goes like this: SBCL is the best choice on Linux, and CCL is the best on Windows<a name="POST_LISP_RPI_1_MT_3" href="blog/2015-03-07-lisp-on-raspberry-pi-2-part-1-setting-up.html#POST_LISP_RPI_1_FN_3"><sup>[3]</sup></a> and MacOS. But in case of Raspberry Pi, even though I'm running Linux, I ended up using CCL<span class="sidenote"><a name="POST_LISP_RPI_1_FN_2" href="blog/2015-03-07-lisp-on-raspberry-pi-2-part-1-setting-up.html#POST_LISP_RPI_1_MT_2"><sup>[2]</sup></a> - There're <a href="http://franz.com/products/allegro-common-lisp/">Allegro CL</a> and <a href="http://www.lispworks.com/">LispWorks</a> that are cool and professional and all, but I don't quite feel like shelling out money for it just yet. Also, I don't think they work on ARM.</span> instead of SBCL, because the former has native threading support while the latter does not (for now). And threading makes all the difference - Raspberry Pi 2 has only 900MHz processor, but it's quad-core. You can really feel the speed gains coming from parallelism when doing any kind of interactive work.

For the sake of completeness, I shall describe the installation of both implementations.<span class="sidenote"><a name="POST_LISP_RPI_1_FN_3" href="blog/2015-03-07-lisp-on-raspberry-pi-2-part-1-setting-up.html#POST_LISP_RPI_1_MT_3"><sup>[3]</sup></a> - Mostly because SBCL on Windows tends to crash and print messages about <a href="http://allen-poole.com/wordpress/2011/01/your-kitten-of-death-awaits-sbc/">some Kitten of Death</a>.</span>

<strong><em>SBCL</em></strong>
There is nothing fancy in SBCL installation process - just go to the <a href="http://www.sbcl.org/platform-table.html">SBCL download page</a> and download the newest build for the Linux ARMhf platform. Extract the downloaded file (<code lang="text" inline="inline">tar -xvjf filename.tar.bz2</code>, in case you don't remember ;)) and follow instructions from the INSTALL file.

<strong><em>CCL</em></strong>
Go to the <a href="http://ccl.clozure.com/download.html">CCL download page</a> and fetch the newest CCL for ARM. Unpack it (<code lang="text" inline="inline">tar -xvvzf filename.tar.gz</code> this time ;)). You will have an <code lang="text" inline="inline">armcl</code> executable file, which is the CCL executable. However, if you go and actually run it, it may crash. If so, it means you'll need to rebuild the Lisp kernel for your platform.

Go to the <code lang="text" inline="inline">lisp-kernel/linuxarm</code> directory. Make sure you have an uncommented line in the <code lang="text" inline="inline">float_abi.mk</code> file that says <code lang="text" inline="inline">FLOAT_ABI_OPTION = -mfloat-abi=hard</code>. Then, run <code lang="text" inline="inline">make</code> inside the <code lang="text" inline="inline">lisp-kernel/linuxarm</code> directory. After the compilation process finishes, you should have a working <code lang="text" inline="inline">armcl</code> executable.

<strong>Working with Lisp on a remote machine</strong>
Having a Lisp on a Raspberry Pi is a good excuse to learn how to develop a Lisp program remotely. This involves editing remote files on a local machine and executing Lisp code remotely.

Since the best IDE for Common Lisp is Emacs with SLIME, let's see how this <del>operating system</del> <ins>editor</ins> can help us.

<strong><em>Connecting to a remote Lisp</em></strong>
First of all, you need to make sure you have fresh versions of SLIME on both your Pi and the machine you want to connect from. Use Quicklisp (<code lang="lisp" inline="inline"><span class="no-paren-fx"><span class="paren1">(<span class="no-paren-fx">ql:quickload <span class="keyword">:SWANK</span></span>)</span></span></code>) on the former, and Emacs package manager (or direct download) on the latter<a name="POST_LISP_RPI_1_MT_4" href="blog/2015-03-07-lisp-on-raspberry-pi-2-part-1-setting-up.html#POST_LISP_RPI_1_FN_4"><sup>[4]</sup></a>.<span class="sidenote"><a name="POST_LISP_RPI_1_FN_4" href="blog/2015-03-07-lisp-on-raspberry-pi-2-part-1-setting-up.html#POST_LISP_RPI_1_MT_4"><sup>[4]</sup></a> - You could also install SLIME locally via QuickLisp. Do a <code lang="lisp" inline="inline"><span class="no-paren-fx"><span class="paren1">(<span class="no-paren-fx">ql:quickload <span class="keyword">:quicklisp-slime-helper</span></span>)</span></span></code> and follow instructions from <a href="https://github.com/quicklisp/quicklisp-slime-helper">here</a>. I've heard that this is <em>*the*</em> recommended way of installing SLIME now, but I haven't tested it yet.</span>

After that's done, you need to run a SWANK server in your Lisp instance and make sure you can establish a secure connection with it.

A good way to approach it is to use <a href="https://help.ubuntu.com/community/SSH/OpenSSH/PortForwarding">SSH port forwarding</a>. If you want to connect to your Lisp instance, establish an SSH connection with port tunneling, using a command like this:

<pre><code lang="bash">ssh -L 8885:localhost:4005 user@raspberrypi</code></pre>

It's just a normal SSH connection, but additionally, it will securely map the port 8885 on your machine to the remote 4005 port.

On the remote side, inside your Lisp image, run the following code:
<pre><code lang="lisp"><span class="no-paren-fx"><span class="paren1">(<span class="no-paren-fx">swank:create-server <span class="keyword">:port</span> 4005 <span class="keyword">:dont-close</span> t</span>)</span></span></code></pre>

It's a good idea to run your Lisp under screen or tmux, so that you can leave the program running and only connect (with port forwarding) to the Raspberry Pi when you need to do actual development.

When you've done all this, all that remains is to switch to your local Emacs instance and do <code lang="text" inline="inline">M-x slime-connect</code> and connect SLIME to the port 4005. You should be able to execute code on Raspberry Pi via Lisp REPL now.

With SLIME connected, you'll also be able to use shortcuts like <code lang="text" inline="inline">C-c C-c</code> to dynamically evaluate any opened code inside the remote Lisp image.

<strong><em>Editing code remotely</em></strong>
Developing on a remote machine involves changing code on it. You may of course set up git repository and clone it on both local and remote machine, but doing commit-push-pull dance to move the code around is tiring. Fortunately, Emacs gives you a way to directly edit files on a remote machine.

This feature is known as TRAMP (<em>Transparent Remote Access, Multiple Protocols</em>), and comes with Emacs by default. It allows you to edit files over various protocols as if they were just local files on your hard drive<a name="POST_LISP_RPI_1_MT_5" href="blog/2015-03-07-lisp-on-raspberry-pi-2-part-1-setting-up.html#POST_LISP_RPI_1_FN_5"><sup>[5]</sup></a>.<span class="sidenote"><a name="POST_LISP_RPI_1_FN_5" href="blog/2015-03-07-lisp-on-raspberry-pi-2-part-1-setting-up.html#POST_LISP_RPI_1_MT_5"><sup>[5]</sup></a> - It's primary use, however, seems to be editing files as a superuser. If you want to access a file with superuser rights, instead of launching a new Emacs instance with <code lang="bash" inline="inline">sudo</code>, you can use TRAMP like this: <code lang="text" inline="inline">C-x C-f /sudo:root@localhost:/</code> - at this point you will be prompted for your password and, after successful authorization, you can continue typing in the path of the file you want to visit.</span>

To use it over SSH with the Raspberry Pi, open the file using <code lang="text" inline="inline">C-x C-f</code>, but enter a path like this:
<pre><code lang="text">/ssh:user@raspberrypi:/</code></pre>

You will be then prompted for password, and after successful authorization, you will see that you're able to access remote device's file system. You can now open your remote file, and any changes you save to it will be written directly on the remote device.

Emacs of course caches the established connection, so you don't have to give your password again to save data or open more remote files.

Note however, that there's a caveat - after you leave Emacs idle for some time (like, half an hour or more) the connection timeouts, and it's easy for Emacs to get stuck trying to reconnect. It's a weird problem I don't have any solution for yet. There is a lot written about it on <a href="http://www.emacswiki.org/emacs/TrampMode#toc3">Emacs Wiki</a> though, so make sure to check it out, and in the meantime, be prepared to kill Emacs after you're done with remote work.

<strong>Using Lisp for something interesting</strong>
So now that we have a working Lisp on a Raspberry Pi and a proper development setup, what interesting things can we do with it? Well, this post is already too long, so I will leave that for later - but as a little sneak peak, so far I've managed to run a webserver that exposes readings from internal <a href="http://en.wikipedia.org/wiki/System_on_a_chip">SOC</a> temperature sensor and external thermometer. Stay tuned for this and more lispy stuff on Raspberry Pi.
]]></description>
    </item>    <item>
      <title>Hacking the life-CAP</title>
      <link>https://jacek.zlydach.pl/blog/2015-03-03-hacking-the-life-cap.html</link>
      <guid isPermaLink="true">https://jacek.zlydach.pl/blog/2015-03-03-hacking-the-life-cap.html</guid>
      <pubDate>Tue, 03 Mar 2015 00:43:12 +0100</pubDate>
      <category domain="https://jacek.zlydach.pl/blog/tags/old-blog.html">Old blog</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/humor.html">Humor</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/uczucia.html">uczucia</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/cap-theorem.html">CAP Theorem</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/random.html">random</category>
      <description><![CDATA[<em>(tekst czekał na opublikowanie sporo czasu; dopiero teraz udało mi się go jednak poprawić i dokończyć)</em>

<span class="sidenote"><sup><a name="POST_LIFECAP_FN_1" href="blog/2015-03-03-hacking-the-life-cap.html#POST_LIFECAP_MT_1">[1]</a></sup> Przez &quot;hobby&quot; rozumiem tu zajęcie, które ma ogromną wartość dla danego człowieka ale nie jest jego głównym źródłem utrzymania; &quot;związki&quot; obejmują relacje romantyczne i rodzinne - dziewczyna, żona, najbliźsi krewni.</span>Ostatnio Bambucza na łamach swego bloga przedstawił interesującą koncepcję pod nazwą &quot;life CAP theorem&quot;. Zachęcam do przeczytania <a href="http://bucza.wordpress.com/2014/10/15/teoria-cap-w-zyciu/">jego artykułu</a>. W bardzo dużym skrócie, znany w kręgu bazodanowców <a href="http://en.wikipedia.org/wiki/CAP_theorem">CAP theorem</a> mówi: &quot;spójność, dostępność, odporność na podział - wybierz dwa&quot;. Life-CAP analogicznie głosi, &quot;praca, hobby, związki - wybierz dwa&quot;<sup><a name="POST_LIFECAP_MT_1" href="blog/2015-03-03-hacking-the-life-cap.html#POST_LIFECAP_FN_1">[1]</a></sup>.

<span class="sidenote"><sup><a name="POST_LIFECAP_FN_2" href="blog/2015-03-03-hacking-the-life-cap.html#POST_LIFECAP_MT_2">[2]</a></sup> Zabawna obserwacja - angielskie słowo <em>cap</em> oznacza górne ogranicznenie nałożone na jakiś zasób lub czynność.</span>Bucza w swoim tekście sugeruje, że jesteśmy skazani na niewolnictwo wobec life-CAPa, który narzuca ograniczenie<sup><a name="POST_LIFECAP_MT_2" href="blog/2015-03-03-hacking-the-life-cap.html#POST_LIFECAP_FN_2">[2]</a></sup> na to, na jakich problemach możemy się skupić w życiu. Przychodzi mi jednak do głowy kilka innych podejść do tego problemu.

<strong>Faktycznie wybierz dwa</strong>
<span class="sidenote"><sup><a name="POST_LIFECAP_FN_3" href="blog/2015-03-03-hacking-the-life-cap.html#POST_LIFECAP_MT_3">[3]</a></sup> Nie wydaje się to najrozsądniejsze z punktu widzenia wychowawczego, dlatego coraz więcej bogatych ludzi decyduje się na użycie swych zasobów do stworzenie dzieciom jedynie siatki bezpieczeństwa, równocześnie zachęcając je do przedsiębiorczości i zarabiania na siebie. A skoro już mowa o siatce bezpieczeństwa, to opcja wyrzucenia pracy z równania jest dostępna również dla ludzi na zasiłkach i w przyszłości, miejmy nadzieję, dla jak największej liczby osób. <a href="https://news.ycombinator.com/item?id=8987073">Jak to rzekł pewien mędrzec z HackerNews</a>, <q>No job is the
goal. No money is the problem.</q>.</span>Oczywiście można sobie dobrze radzić w życiu wybierając dwa z trzech. Większość<sup><a href="http://xkcd.com/907/">[citation needed]</a></sup> ludzi zdaje się żyć w trybie &quot;praca + związki&quot;. Znamy też <a href="http://en.wikipedia.org/wiki/Nikola_Tesla#Relationships">historie ludzi, których wyborem było &quot;praca + hobby&quot;</a>. Wreszcie niejedno dziecko bogatego człowieka może spokojnie żyć wybierając &quot;hobby + związki&quot;<sup><a name="POST_LIFECAP_MT_3" href="blog/2015-03-03-hacking-the-life-cap.html#POST_LIFECAP_FN_3">[3]</a></sup>.

Widać więc wyraźnie, że da się dobrze żyć nie walcząc z life-CAPem. Ale czy są jakieś metody na jego obejście?

<strong>Zlej wybory ze sobą</strong>
Czasem można zlać ze sobą opcje w life-CAP, redukując problem do prostego &quot;wybierz dwa z dwóch&quot;. Świętym Graalem dzisiejszej zachodniej kultury jest praca będąca równocześnie pasją - jest to jednak dużo cięższe do osiągnięcia niż się wydaje (bez oszukiwania samego siebie) i wymaga czasu oraz <a href="http://en.wikipedia.org/wiki/Social_mobility">mobilności społecznej</a>.

Inną opcją jest połączenie hobby i związków. W idealnej sytuacji Twój partner i/lub najbliższa rodzina dzieli z Tobą wspólną pasję. Ponownie, jest to czasochłonne do osiągnięcia, ale czasem można temu pomóc na drodze autoselekcji. Jako ekstremalny przykład na myśl przychodzą mi małe społeczności religijne, w których życie rodzinne i wiara są bardzo silnie ze sobą splecione, a członkowie takiego ugrupowania zwykle wiążą się wewnątrz niego.

Wreszcie warto przyjrzeć się połączeniu w jedno pracy i związku. To występuje chyba głównie na studiach (<code lang="perl" inline="inline">s/praca/nauka/</code>) i we wspólnie prowadzonej działalności. Ma szansę być bardzo spełniające, aczkolwiek problemy zawodowe mają poważną tendencję do przeciekania w życie osobiste.

Oczywiście można być też Elonem Muskiem - zlać pracę i hobby w jedno, po czym wywalić związki i <a href="http://www.inc.com/elon-musk/elon-musk-tesla-spacex-profits-are-not-our-primary-goal.html">zająć się ratowaniem świata</a>.

<center><img src="old-blog/download/posts/lifeCAP/elon_musk.jpg" alt="Elon Musk">
<em>(źródło: R. Kikuo Johnson via <a href="http://www.bloomberg.com/bw/articles/2012-09-13/elon-musk-the-21st-century-industrialist">Bloomberg</a>)</em></center>

<strong>PWM</strong>
<span class="sidenote"><sup><a name="POST_LIFECAP_FN_4" href="blog/2015-03-03-hacking-the-life-cap.html#POST_LIFECAP_MT_4">[4]</a></sup> Dosłownie &quot;równowaga między życiem a pracą&quot;; język polski jest jak zwykle taki nieporęczny...</span>Typowy sposób radzenia sobie z life-CAPem to tzw. work-life balance<sup><a name="POST_LIFECAP_MT_4" href="blog/2015-03-03-hacking-the-life-cap.html#POST_LIFECAP_FN_4">[4]</a></sup>. Pewną ilość czasu alokuje się na pracę, a pozostały przełącza się pomiędzy hobby a związkami.

W elektronice cyfrowej istnieje pojęcie PWM (<a href="http://en.wikipedia.org/wiki/Pulse-width_modulation">Pulse-width Modulation</a>) - jest to trick pozwalający uzyskać coś wyglądającego jak sygnał analogowy mając do dyspozycji jedyne wyjście cyfrowe. Stale i szybko przełączając się między stanem niskim i wysokim, &quot;włączonym i wyłączonym&quot; jesteśmy w stanie uzyskać coś, co przypomina sygnał analogowy - jego wartość regulujemy przez stosunek czasu spędzonego w stanie wysokim do czasu spędzonego w stanie niskim<sup><a name="POST_LIFECAP_MT_5" href="blog/2015-03-03-hacking-the-life-cap.html#POST_LIFECAP_FN_5">[5]</a></sup>.<span class="sidenote"><sup><a name="POST_LIFECAP_FN_5" href="blog/2015-03-03-hacking-the-life-cap.html#POST_LIFECAP_MT_5">[5]</a></sup> Prosty przykład - zapalanie i gaszenie światła; jeśli bardzo szybko przełączamy światło, to dla oka będzie wydawało się ono przygaszone - jasność zależeć będzie od tego, jak długo trzymamy je włączone a jak długo wyłączone w czasie tego przełączania; właśnie tak układy typu Arduino implementują regulację siły świecenia diodki.</span>

Słowem-kluczem występującym w poprzednich dwóch akapitach jest &quot;przełączanie się&quot;. Co stanie się, gdy zastosujemy PWM do problemu life-CAP, zaczynając przełączać się wielokrotnie i bardzo szybko między dwoma stanami?

<ul>
<li>praca vs. hobby - Twój szef myśli, że pracujesz, a Ty jesteś zajęty robieniem czegoś pożytecznego</li>
<li>hobby vs. związki - Twój partner/rodzina czują się zadbani, a Ty jesteś zajęty robieniem czegoś pożytecznego</li>
<li>praca vs. związki - wykonalne chyba tylko jeśli pracujesz z rodziną/partnerem; nie wiem, czy zdrowe dla obu, ale w granicy jest to jak zlanie tych dwóch wyborów</li>
</ul>

Wiadomo, że mózg ludzki - tak jak i procesor - nie lubi ciągłych zmian kontekstu. Pracując w intensywnym PWMie można mieć jednak konteksty dwóch różnych rzeczy zawieszony &quot;w powietrzu&quot;, zamieniając je ze sobą zanim któryś zdąży wyparować z pamięci krótkoterminowej<sup><a name="POST_LIFECAP_MT_6" href="blog/2015-03-03-hacking-the-life-cap.html#POST_LIFECAP_FN_6">[6]</a></sup>.<span class="sidenote"><sup><a name="POST_LIFECAP_FN_6" href="blog/2015-03-03-hacking-the-life-cap.html#POST_LIFECAP_MT_6">[6]</a></sup> Chyba. Tak mi się wydaje. Czytanie HackerNews w czasie pisania postów nie pomaga.</span>

Kolejną istotną rzeczą jest to, że partnerzy nie lubią jak się ich napędza PWM-em ;). Do wyboru są tu dwie opcje - albo trzeba tego PWMa robić tak szybko, że nie zauważą przełączeń, albo drogą selekcji związać się z taką osobą, która ten tryb pracy zniesie.

<strong>Olać te wybory, dajcie Modafinil</strong>
Wersja dla ambitnych i nietolerujących tego, że życie stawia przed nimi głupie problemy. Więcej komentarza nie trzeba.

(i ze wszystkich dostępnych w tym momencie, ta chyba ta najbardziej mnie urzeka)

<strong>Wersja patologiczna - PWM na wszystko</strong>
Może na Modafinilu się tak da, aczkolwiek z zewnątrz będzie to wyglądało jak chaos z rękami i nogami, robiący wszystko na raz.

Więc, Czytelniku, jakie są Twoje metody na life-CAP?
]]></description>
    </item>    <item>
      <title>Common Lisp and Docker</title>
      <link>https://jacek.zlydach.pl/blog/2015-01-14-common-lisp-and-docker.html</link>
      <guid isPermaLink="true">https://jacek.zlydach.pl/blog/2015-01-14-common-lisp-and-docker.html</guid>
      <pubDate>Wed, 14 Jan 2015 00:42:50 +0100</pubDate>
      <category domain="https://jacek.zlydach.pl/blog/tags/old-blog.html">Old blog</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/narzedzia.html">narzędzia</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/webmasterka.html">webmasterka</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/lisp.html">Lisp</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/common-lisp.html">Common Lisp</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/emacs.html">Emacs</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/docker.html">Docker</category>
      <description><![CDATA[Recently I've been doing some web development in Common Lisp (and even getting paid for it!). I must say, I'm quite enjoying it (definitely more than the other language I usually earn my bread with, that shall remain unnamed). I'll be posting more about it soon.

Lately, I've been using <a href="https://www.docker.com/">Docker</a> to separate project components into containers, each with its own filesystem and isolated environment. I've modified <a href="https://github.com/davazp/docker-sbcl">some code</a> <a href="https://github.com/davazp/docker-quicksbcl">I found</a> <a href="https://github.com/krrrcks/docker-ccl-swank/">around the web</a> to create Dockerfiles for current versions of SBCL and CCL, the two popular open source Common Lisp implementations.

<ul>
<li><a href="https://github.com/TeMPOraL/docker-quicksbcl">SBCL 1.2.6 x86-64</a></li>
<li><a href="https://github.com/TeMPOraL/docker-quickccl">CCL 1.10/linux x86</a></li>
</ul>

They're quite rudimentary in their functionality - they only fetch the current (as of this post) version of Lisp and Quicklisp. I've decided not to put code that starts up SWANK by default - I believe enabling remote REPL access should be a decision of the project that is built on top of those Dockerfiles. Adding SWANK support is very simple though; just run this when you're starting your application: 

<pre><code lang="lisp"><span class="no-paren-fx"><span class="paren1">(<span class="no-paren-fx">ql:quickload <span class="keyword">:swank</span></span>)</span>
<span class="paren1">(<span class="no-paren-fx">setf <span class="special">swank::*LOOPBACK-INTERFACE*</span> <span class="string">&quot;0.0.0.0&quot;</span></span>)</span>
<span class="paren1">(<span class="no-paren-fx">swank:create-server <span class="keyword">:port</span> 4005 <span class="keyword">:dont-close</span> t</span>)</span></span></code></pre>

and map SWANK port when doing <code inline="inline">docker run</code>:

<pre><code lang="bash">docker run --name=&quot;your-app&quot; -v `pwd`/src:/var/src -p 4005:4005 -ti -d yourname/app</code></pre>

and you can connect to it via <code inline="inline">M-x slime-connect</code> straight from your Emacs.

It's actually quite easy to bundle that in your own Dockerfile for your app. For SBCL, it could look like this:

<pre><code lang="text">FROM temporal/quicksbcl

ADD ./startup.lisp /tmp/startup.lisp

CMD sbcl --load /tmp/startup.lisp
EXPOSE 4005</code></pre>

Where <code inline="inline">temporal/quicksbcl</code> stands for the name you gave for the SBCL container you built and <code inline="inline">startup.lisp</code> is the file you use to boot up your application, in which you could put the SWANK start code from above. The code for CCL is very similar, so I'll leave it out as an exercise to the reader :P.

Feel free to use and modify those Docker scripts as you wish. Since I'm not really good at Docker yet, those scripts could likely use some improvements. All issues and pull requests are welcome! And stay tuned for the upcoming posts about Lisp and web development!

]]></description>
    </item>    <item>
      <title>"Stała delta" w grach - prezentacja</title>
      <link>https://jacek.zlydach.pl/blog/2013-11-01-stala-delta-w-grach-prezentacja.html</link>
      <guid isPermaLink="true">https://jacek.zlydach.pl/blog/2013-11-01-stala-delta-w-grach-prezentacja.html</guid>
      <pubDate>Fri, 01 Nov 2013 23:23:26 +0100</pubDate>
      <category domain="https://jacek.zlydach.pl/blog/tags/old-blog.html">Old blog</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/tworzenie-gier.html">Tworzenie gier</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/delta.html">delta</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/staly-krok.html">stały krok</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/fixed-timestep.html">fixed timestep</category>
      <description><![CDATA[Dawno temu zdarzyło mi się <a href="articles/jak-nalezy-pisac-aktualizacje-stanu-gry.html">popełnić artykuł</a> o tym, jak pisać aktualizację stanu gry - pętlę główną i przyległości. Artykuł w szczególności skupiał się na tym, dlaczego dobrze jest korzystać ze &quot;stałej delty&quot; - wykonywać update'y fizyki/logiki z ustalonym krokiem czasowym.

Jakiś czas temu przygotowałem też w ramach studiów krótką prezentację opartą o ten artykuł, którą dzisiaj przypadkiem znalazłem na dysku. Poniżej znajdują się linki do prezentacji oraz handoutu, który wydrukowałem i rozdałem wszystkim obecnym na sali.

<a href="old-blog/download/posts/fixed_step/prezentacja_final.pdf">(prezentacja - PDF)</a>
<a href="old-blog/download/posts/fixed_step/handout.pdf">(handout - PDF)</a>

Koncepcję drukowania handoutów i rozdawania ich słuchaczom prezentacji podkradłem od Edwarda Tufte, który <a href="http://www.edwardtufte.com/bboard/q-and-a-fetch-msg?msg_id=00001B">wspominał czasami</a> m.in. o korzyściach płynących z wysokiej rozdzielczości papieru i możliwości wyraźnego zobaczenia zdjęć/schematów z prezentacji.
]]></description>
    </item>    <item>
      <title>Więcej Nyan Cata w Emacsie</title>
      <link>https://jacek.zlydach.pl/blog/2013-08-13-wiecej-nyan-cata-w-emacsie.html</link>
      <guid isPermaLink="true">https://jacek.zlydach.pl/blog/2013-08-13-wiecej-nyan-cata-w-emacsie.html</guid>
      <pubDate>Tue, 13 Aug 2013 01:14:36 +0200</pubDate>
      <category domain="https://jacek.zlydach.pl/blog/tags/old-blog.html">Old blog</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/lisp.html">Lisp</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/emacs.html">Emacs</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/nyan-cat.html">Nyan Cat</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/pop-tart-cat.html">Pop Tart Cat</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/nyanmacs.html">Nyanmacs</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/nyan-mode-el.html">nyan-mode.el</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/build-something-amazing.html">Build Something Amazing</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/emacs-lisp.html">Emacs Lisp</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/lulz.html">lulz</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/5-minutes-of-internet-fame.html">5 minutes of Internet fame</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/vi.html">vi</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/vim.html">vim</category>
      <description><![CDATA[Miło mi odkryć, że <a href="https://github.com/PuercoPop">Javier Olaechea</a> zainspirował się moim <a href="blog/2011-08-25-introducing-nyan-mode-el-turn-your-emacs-into-nyanmacs.html">Nyan Mode</a> i stworzył nowe rozszerzenie - tym razem dodające Nyan Cata do &quot;znaku zachęty&quot; eshell'a. Screen poniżej.

<center><a href="old-blog/download/posts/nyan-prompt/nyan-prompt.png"><img src="old-blog/download/posts/nyan-prompt/nyan-prompt-450px.png" alt="Nyan Cat w prompt'cie eshell'a."></a></center>

(<a href="https://github.com/PuercoPop/nyan-prompt">Github</a>)

Ponadto, zarówno Nyan Mode jak i Nyan Prompt są dostępne do instalacji w Emacs 24 za pomocą managera paczek<a href="blog/2013-08-13-wiecej-nyan-cata-w-emacsie.html#POST_NYANPROMPT_FN_1" name="POST_NYANPROMPT_MT_1">*</a><span class="sidenote"><a href="blog/2013-08-13-wiecej-nyan-cata-w-emacsie.html#POST_NYANPROMPT_MT_1" name="POST_NYANPROMPT_FN_1">*</a> - tak, ze względu na ilość rozszerzeń, Emacs dorobił się w końcu własnego managera pakietów. Jak to mówią, świetny system operacyjny ;).</span>, z <a href="http://melpa.milkbox.net/">repozytorium MELPA</a>.

Vimowcy, gdzie jest wasz Nyan Cat? ;).
]]></description>
    </item>    <item>
      <title>Usprawnij pracę z wyrażeniami regularnymi</title>
      <link>https://jacek.zlydach.pl/blog/2013-08-10-usprawnij-prace-z-wyrazeniami-regularnymi.html</link>
      <guid isPermaLink="true">https://jacek.zlydach.pl/blog/2013-08-10-usprawnij-prace-z-wyrazeniami-regularnymi.html</guid>
      <pubDate>Sat, 10 Aug 2013 04:49:35 +0200</pubDate>
      <category domain="https://jacek.zlydach.pl/blog/tags/old-blog.html">Old blog</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/porady.html">porady</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/php.html">PHP</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/regexp.html">regexp</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/debuggex.html">Debuggex</category>
      <description><![CDATA[Ah, dawno nic nie wrzucałem ;). Chciałbym się dziś podzielić dwoma poradami związanymi z <a href="https://en.wikipedia.org/wiki/Regular_expression">regex'ami (wyrażeniami regularnymi)</a>.

<strong>Komentarze w wyrażeniach regularnych</strong>
Szybkie pytanie: co dopasowuje poniższe wyrażenie regularne?
<pre><code lang="php">preg_match('/.*(?=.{6,})(?=.*\d)(?=.*[a-zA-Z]).*/', $something);</code></pre>

Myślę, że nawet <a href="http://xkcd.com/208/">wprawionemu w bojach</a> programiście przetworzenie tego wyrażenia zajmie krótką chwilę. W praktyce wyrażenia regularne szybko robią się skomplikowane, ekstremalnie  trudne w czytaniu i jeszcze trudniejsze w debugowaniu. Można jednak te problemy rozwiązać za pomocą odrobiny formatowania i dodania komentarzy.

<pre><code lang="php">preg_match('/^
            .*              # Match any number of characters...
            (?=.{6,})       # ... AND match at least 6 characters (lookahead) ...
            (?=.*\d)        # ... AND match one digit after any number of characters (lookahead) ...
            (?=.*[a-zA-Z])  # ... AND match one letter after any number of characters (lookahead) ...
            .*              # ... AND allow any number of characters later.
            $/x', $password);</code></pre>
Prawda, że czytelniej?

Modyfikator <code inline="inline">x</code> powoduje, że wszystkie niewyescape'owane białe znaki zostaną zignorowane, a wszystko od znaku <code inline="inline">#</code> do końca linii zostanie potraktowane jako komentarz i zignorowane.

O możliwości komentowania wyrażeń regularnych dowiedziałem się z artykułu <a href="http://net.tutsplus.com/tutorials/php/advanced-regular-expression-tips-and-techniques/">Advanced Regular Expression Tips and Techniques</a>. Zachęcam do jego przeczytania - jest tam więcej ciekawych porad, m.in. na temat callbacków czy nadawania nazw grupom.

<strong>Debugger do regexpów</strong>
Istnieje świetne narzędzie do analizy i debugowania regexpów - <a href="http://www.debuggex.com/">Debuggex</a>. Wyświetla on strukturę wyrażenia graficznie, pozwalając na analizę krok po kroku.

Spójrzmy na przykład z poprzedniej części tego posta:
<img src="old-blog/download/posts/regexp/regexp.png">

Prawdziwa potęga tego narzędzia objawia się przy bardzo złożonych wyrażeniach regularnych, jak na przykład:
<pre><code>^(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?:\w+:\w+@)?(?:(?:[-\w]+\.)+(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))(?::[\d]{1,5})?(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|\/)+|\?|#)?(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&amp;(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?$</code></pre>

Polecam skopiowanie powyższego wyrażenia do Debuggexa. Z jednej strony widać wyraźnie, jak ten regexp działa i do czego służy; z drugiej strony, sekcja <em>Some random matches</em> pokazuje, jak dziwne rzeczy przejdą przez nie poprawnie.

<strong>Uwaga o wydajności wyrażeń regularnych</strong>
Jak zapewne wielu programistów, którzy swą przygodę zaczęli od programowania gier, jestem sceptycznie nastawiony do wszelkich rzeczy pracujących na stringach. W szczególności, regexpy mogą na pierwszy rzut oka wydawać się wysoce niewydajne - ot skomplikowane dopasowanie tekstu zapisane w formie tekstu. Z pewnością napisanie tego w formie normalnego kodu - acz dłuższe - musi być wydajniejsze, prawda?

Otóż nie. Wyrażenia regularne są tak na prawdę programem - są (bardzo skondensowanym) opisem <a href="http://pl.wikipedia.org/wiki/Automat_sko%C5%84czony">maszyny stanów</a>, przez którą dopasowywany tekst stopniowo przechodzi, i jeśli uda się doprowadzić tę maszynę do stanu terminalnego, to dopasowanie jest uznawane za udane. Co to dokładnie znaczy? Polecam przyglądnąć się jeszcze raz rysunkom, które tworzy Debuggex - to dokładnie struktura tejże maszyny stanów. Taki system reprezentowany jest w programie w sposób bardzo wydajny; prawdopodobnie dużo wydajniejszy od naiwnego parsera, którego moglibyśmy napisać w niewielkiej liczbie linii kodu.

Co więcej, niektóre języki programowania (jak na przykład <a href="http://weitz.de/cl-ppcre/#create-scanner">Common Lisp</a> lub <a href="http://stackoverflow.com/questions/1720191/java-util-regex-importance-of-pattern-compile">Java</a>) pozwalają <em>prekompilować wyrażenia regularne</em> - jeżeli spodziewamy się, że dane wyrażenie regularne będzie używane wielokrotnie w czasie działania programu, to możemy zbudować maszynę stanów tylko raz (w przeciwieństwie do tworzenia jej na nowo za każdym razem, gdy chcemy dopasować jakiś napis), a następnie używać jej wszędzie tam, gdzie potrzebujemy korzystać z danego wyrażenia regularnego. Są nawet języki, które <a href="http://stackoverflow.com/questions/209906/compile-regex-in-php">kompilują regexpy automatycznie</a>.
]]></description>
    </item>    <item>
      <title>Eseje Paula Grahama w języku polskim</title>
      <link>https://jacek.zlydach.pl/blog/2013-02-06-eseje-paula-grahama-w-jezyku-polskim.html</link>
      <guid isPermaLink="true">https://jacek.zlydach.pl/blog/2013-02-06-eseje-paula-grahama-w-jezyku-polskim.html</guid>
      <pubDate>Wed, 06 Feb 2013 00:25:06 +0100</pubDate>
      <category domain="https://jacek.zlydach.pl/blog/tags/old-blog.html">Old blog</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/webmasterka.html">webmasterka</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/lisp.html">Lisp</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/common-lisp.html">Common Lisp</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/eseje.html">eseje</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/paul-graham.html">Paul Graham</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/tlumaczenia.html">tłumaczenia</category>
      <description><![CDATA[Jakieś dwa tygodnie temu udało mi się w końcu <a href="https://esejepg.pl/">wypuścić projekt, nad którym pracowałem po godzinach już od dłuższego czasu</a>, a w zamyśle miałem ponad rok - chodzi o tłumaczenie <a href="http://paulgraham.com/articles.html">esejów Paula Grahama</a> na język polski.

Wstępnie przetłumaczonych jest 9 esejów (większość przez Asię, której pomoc jest nieoceniona); kolejne dojdą z czasem (wszelka pomoc mile widziana!). Wybraliśmy na początek kilka najbardziej charakterystycznych tekstów Grahama na cały przekrój tematów - jest więc <a href="https://esejepg.pl/eseje/todo.html">coś</a> <a href="https://esejepg.pl/eseje/hs.html">ogólnego</a>, <a href="https://esejepg.pl/eseje/hw.html">tekst dla startupowców i fanów drukarek 3D</a>, coś dla <a href="https://esejepg.pl/eseje/progbot.html">programistów</a>, <a href="https://esejepg.pl/eseje/makersschedule.html">managerów</a> oraz <a href="https://esejepg.pl/eseje/fix.html">odrobina humoru</a> :).

Nie mam teraz niestety czasu na porządny press release, dlatego na razie wrzucę jedynie link - <a href="https://esejepg.pl/">https://esejepg.pl</a>. Jak skończy mi się sesja, to napiszę coś więcej - praca nad tym serwisem dostarczyła mi trochę ciekawych lekcji w zakresie webdevelopmentu, prowizorycznego hackingu oraz bycia tłumaczem.

Stay tuned and <a href="https://esejepg.pl/eseje/procrastination.html">keep reading</a> :).

PS. @Bambucha, ja wiem, że projekt jest <a href="https://github.com/TeMPOraL/esejepg/">Open Source</a>, ale zdejmij proszę jego przypadkiem stworzony przez Ciebie mirror, bo ma już większy Page Rank niż oryginał, a nie posiada nawet wygenerowanych CSSów :P.
]]></description>
    </item>    <item>
      <title>Hackerspace Kraków</title>
      <link>https://jacek.zlydach.pl/blog/2012-12-15-hackerspace-krakow.html</link>
      <guid isPermaLink="true">https://jacek.zlydach.pl/blog/2012-12-15-hackerspace-krakow.html</guid>
      <pubDate>Sat, 15 Dec 2012 00:40:10 +0100</pubDate>
      <category domain="https://jacek.zlydach.pl/blog/tags/old-blog.html">Old blog</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/krakow.html">Kraków</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/hackerspace-krakow.html">Hackerspace Kraków</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/hackerspace.html">Hackerspace</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/fablab.html">FabLab</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/cnc.html">CNC</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/druk-3d.html">druk 3D</category>
      <description><![CDATA[Od niedawna w Krakowie działa już <a href="http://en.wikipedia.org/wiki/Hackerspace">Hackerspace</a>! Przez jakiś czas nieformalnie, a teraz już jako oficjalna fundacja, Hackerspace Kraków (w skrócie, HS KRK) zaprasza wszystkich entuzjastów programowania i elektroniki, konstruktorów, designerów i wszystkie inne kreatywne osoby do wspólnego hackowania<a href="blog/2012-12-15-hackerspace-krakow.html#POST_HSKRK_FN_1" name="POST_HSKRK_MT_1">*</a><span class="sidenote"><a href="blog/2012-12-15-hackerspace-krakow.html#POST_HSKRK_MT_1" name="POST_HSKRK_FN_1">*</a> - dla przypomnienia; haker <strong>nie</strong> jest osobą łamiącą zabezpieczenia komputerowe w niecnym celu; na takie osoby mówimy cracker. Hakerzy to wynalazcy, to ludzie, którym ogromną przyjemność sprawia kreatywność, tworzenie czegoś z niczego i robieni rzeczy z pozoru niemożliwych. Na temat istoty bycia hakerem i znaczenia słowa hacking wiele słów napisali <a href="http://paulgraham.com/gba.html">Paul Graham</a> i <a href="http://www.catb.org/~esr/faqs/hacker-howto.html">Eric S. Raymond</a>. Patrz też <a href="http://www.catb.org/jargon/html/H/hacker.html"><em>hacker</em></a> w słowniku Jargon File. Jeśli szukasz przykładów, myśl o MacGyverze albo Leondardo da Vinci.</span>! Ale pewnie, Czytelniku, zapytasz - o co chodzi? Śpieszę z wyjaśnieniem.

<strong>Hackerspaces</strong>

Idea Hackerspace'ów jest w naszym kraju jeszcze dość mało znana, pomimo tego, że takowe jednostki działają już w <a href="https://hackerspace.pl/">Warszawie</a> i <a href="http://nigmalabs.org/">Poznaniu</a>. Nie ma jednej dobrej definicji by określić, czym jest Hackerspace, ale osobiście najbardziej lubię ilustrować go jako <strong>skrzyżowanie biblioteki publicznej z warsztatem</strong>. Jest to <strong>miejsce</strong>, gdzie leżą narzędzia (np. lutownice, spawarki, laserowe wycinarki czy drukarki 3D), które nie zawsze ma się w domu. Jest to miejsce, gdzie każdy kto chce - programista, elektronik, stolarz, designer, lub inny wykonawca - może przyjść i popracować nad swoim projektem w towarzystwie innych twórczych osób, które chętnie posłużą pomocą i podzielą się swoją wiedzą. Wreszcie jest to <strong>społeczność </strong>osób twórczych, które razem chcą coś budować, uczyć się nawzajem i zmieniać świat - lokalnie i globalnie - na lepsze.

Po opisowej definicji czas na trochę konkretów. Na świecie Hackerspace'ów jest już ponad tysiąc(!); ich listę i informacje na ich temat można znaleźć na <a href="http://hackerspaces.org/">wspólnej, międzynarodowej stronie Hackerspaces</a>. Niektóre z nich są potężne - przykładowo niemiecki <a href="http://hackerspaces.org/wiki/C-base">c-base</a> ma ponad 700m<sup>2</sup> powierzchni! Hackerspace'y dysponują różnymi narzędziami i zajmują się wieloma rzeczami - jedne specjalizują się w elektronice, inne w programowaniu, jeszcze inne pracują z drewnem, jedzeniem, tekstyliami czy biochemią. Typowy HS zaczyna wyspecjalizowany, i wraz z napływem nowych członków rozszerza zakres działalności. Wszystkie są silnie związane z inicjatywami Open Source i <a href="http://pl.wikipedia.org/wiki/Open_Hardware">Open Hardware</a>. Środowisko Hackerspaces wyrobiło też już sobie swoje specyficzne zwyczaje; na przykład <a href="http://hackerspaces.org/wiki/Global_Hackerspace_Cupcake_Challenge_2012">konkurs na wysyłanie cupcake'ów pocztą tak, żeby się nie rozpadły w transporcie</a>.

<center><img src="old-blog/download/posts/hskrk/logo.png" alt="Logo Hackerspace Kraków"></center>

<blockquote><a href="https://twitter.com/wprzyb/status/279028199747354626/photo/1">&quot;Welcome to Hackerspace Kraków. The place where everything is made up and the points don't matter.&quot;</a></blockquote>

Krakowski HS działa już od wakacji 2012. Założyli go Maria Skrzypek, Mateusz Herych i Mirek Woźniak. Dość szybko wyrosła jednak wokół niego całkiem spora społeczność. Na początku zaczynaliśmy, jeszcze bez lokalu, z <a href="http://blog.hackerspace-krk.pl/post/35057115885/a-wild-arduino-appears">warsztatami Arduino</a>. Były one bardzo udane, przyciągnęły sporo fanów, z których wielu stało się teraz aktywnymi członkami HSu. Niedługo później udało się ostatecznie zdobyć lokal. Formalnie więc, działamy od listopada, a oficjalne otwarcie planujemy zaraz po Nowym Roku.

<center><iframe width="450" height="253" src="http://www.youtube.com/embed/6TOCDHi-8NI" frameborder="0" allowfullscreen=""></iframe></center>

Fizycznie, Hackerspace Kraków mieści się <a href="https://maps.google.com/maps?q=Radziwi%C5%82%C5%82owska+20%2F2,+Krak%C3%B3w,+Poland&amp;hl=en&amp;ie=UTF8&amp;ll=50.0632,19.946848&amp;spn=0.005572,0.009645&amp;sll=37.0625,-95.677068&amp;sspn=55.586984,79.013672&amp;t=h&amp;hnear=Radziwi%C5%82%C5%82owska+20,+Krak%C3%B3w,+ma%C5%82opolskie,+Poland&amp;z=17">przy ul. Radziwiłłowskiej 20/2</a> - w samym centrum Krakowa. Przez ostatnie miesiące lokal był intensywnie remontowany (przez członków HSu, własnymi siłami, w czasie wolnym<a href="blog/2012-12-15-hackerspace-krakow.html#POST_HSKRK_FN_2" name="POST_HSKRK_MT_2">**</a><span class="sidenote"><a href="blog/2012-12-15-hackerspace-krakow.html#POST_HSKRK_MT_2" name="POST_HSKRK_FN_2">**</a> - strasznie fajna zabawa; szlifierki oscylacyjne i opalarki są pr0!</span>). Jest w nim mnóstwo miejsca - prawie 80 metrów powierzchni i cztery metry wysokości <a href="blog/2012-12-15-hackerspace-krakow.html#POST_HSKRK_FN_3" name="POST_HSKRK_MT_3">***</a>! Docelowo planujemy, by był on otwarty 24 godziny na dobę dla aktywnych członków HSu (jak tylko ogarniemy sprawę zamków), natomiast w ciągu dnia, gdy w środku jest ktoś &quot;z załogi&quot;, zapraszamy wszystkich - nie trzeba być członkiem HSu, żeby móc wpaść i popracować!<span class="sidenote"><a href="blog/2012-12-15-hackerspace-krakow.html#POST_HSKRK_MT_3" name="POST_HSKRK_FN_3">***</a> - przyszłe sekcje <a href="http://en.wikipedia.org/wiki/Unmanned_aerial_vehicle">UAV</a> oraz rakietowe HS KRK się cieszą ;).</span>

<strong>Instytut Mirakologii Hackerspace Kraków</strong>

Czym się zajmujemy? Większość z nas to programiści i/lub elektronicy, stąd obecnie skupiamy się na &quot;lekkich&quot; projektach. Nie jest to jednak jedyny obszar zainteresowania - rozwija się też tu grupa zainteresowana... szydełkowaniem! HS był też współorganizatorem <a href="http://www.krakdroid.pl/">konferencji KrakDroid</a>, która właśnie się odbywa. Jednakże głównym obszarem działań obecnie jest przyhackerspace'owy front drukarek 3D - budujemy ich aż 14, w tym jedną dla samego Hackerspace'a. O druku 3D (i <a href="http://reprap.org/wiki/Wallace">Wallace'u</a>, którego składam) napiszę w kolejnym poście; dość powiedzieć, że jest to fascynujący temat, i że HS KRK to najlepsze miejsce dla każdego, kto chce się zacząć tym interesować. Są też osoby chętne do wystartowania projektów związanych z frezarkami CNC i innym ciekawym sprzętem.

Większość komunikacji odbywa się obecnie przez <a href="https://groups.google.com/forum/?fromgroups#!forum/hackerspace-krk">mailową grupę dyskusyjną</a>. Planujemy niedługo uruchomić Hackerspace'owe Wiki z informacjami oraz Reddita na dyskusje - do tego czasu jednak trzymamy się Google Groups.

Jeśli chcesz dołączyć do Hackerspace Kraków, to zachęcam do <a href="https://groups.google.com/forum/?fromgroups#!forum/hackerspace-krk">zapisania się na grupę</a> i do aktywnego udziału! Śledź też <a href="http://blog.hackerspace-krk.pl/">bloga Hackerspace Kraków</a>!

<strong>W moim mieście nie ma Hackerspace'a :(.</strong>

Szkoda :(. Ale nic nie stoi na przeszkodzie, żebyś go założył(a)! Dobry poradnik jak zrobić dokładnie to <a href="http://www.adafruit.com/blog/2012/11/12/how-to-start-a-hackerspace/">napisała niedawno Limor &quot;Ladyada&quot; Fried</a>. Wystarczy, że znajdziesz kilka osób chętnych do hackowania razem z Tobą. Każdy istniejący Hackerspace (w tym nasz) chętnie pomoże poradami związanymi z zakładaniem takiego miejsca.

<strong>Poza Hackerspace'ami</strong>
Bardzo pokrewną do Hackerspaces inicjatywą są <a href="http://en.wikipedia.org/wiki/Fab_lab">FabLab'y, Fabrication Laboratories</a>. Od HS różnią się one tym, że są skupione na wytwarzaniu fizycznych obiektów za pomocą wycinarek, frezarek, drukarek i innych maszyn - chociaż tak na prawdę granica jest płynna, i nie zawsze wiadomo, kiedy coś jest FabLabem, a kiedy Hackerspace'm. W chwili obecnej powstaje też krakowski FabLab, ale jest to temat na innego posta, którego napiszę, jak będę coś o nim więcej wiedział :).

A w międzyczasie, miłego hackowania wszystkim i <a href="http://blog.hackerspace-krk.pl/">zapraszamy do Hackerspace Kraków</a>!

<strong>Patrz także</strong>
<ul>
<li><a href="https://speakerdeck.com/mmskrzyp/czym-jest-hackerspace">&quot;Czym jest Hackerspace&quot;</a> - prezentacja Marii Skrzypek o Hackerspace Kraków.</li>
<li><a href="http://www.krakowpost.com/pdf/Krakow_Post_issue_96.pdf">&quot;Hackerspace Kraków: Creating the Ministry of Geekdom&quot;</a> - artykuł Mirka Woźniaka w <a href="http://www.krakowpost.com/">Krakow Post</a> (na str. 29).</li>
</ul>
]]></description>
    </item>    <item>
      <title>Autostopem przez Informatykę</title>
      <link>https://jacek.zlydach.pl/blog/2012-11-19-autostopem-przez-informatyke.html</link>
      <guid isPermaLink="true">https://jacek.zlydach.pl/blog/2012-11-19-autostopem-przez-informatyke.html</guid>
      <pubDate>Mon, 19 Nov 2012 16:53:47 +0100</pubDate>
      <category domain="https://jacek.zlydach.pl/blog/tags/old-blog.html">Old blog</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/narzedzia.html">narzędzia</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/porady.html">porady</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/prezentacje-multimedialne.html">prezentacje multimedialne</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/lisp.html">Lisp</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/common-lisp.html">Common Lisp</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/emacs.html">Emacs</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/vim.html">vim</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/haskell.html">Haskell</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/j.html">J</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/r.html">R</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/s.html">S</category>
      <description><![CDATA[Korzystając z dodatkowego ruchu sprezentowanego mi przez kogoś życzliwego na forum Informatyki Stosowanej (witam), wrzucę dawno zapomnianą prezentację z <a href="http://www.noc.up.krakow.pl/">zeszłorocznej Nocy Informatyka</a>, na której przemawiałem n/t Lispu, wszechświata i całej reszty.

<object id="prezi_b38e7a210a5aa7296ae91db2ca8f9afded3c36ed" name="prezi_b38e7a210a5aa7296ae91db2ca8f9afded3c36ed" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="450" height="400"><param name="movie" value="http://prezi.com/bin/preziloader.swf"></param><param name="allowfullscreen" value="true"></param><param name="allowscriptaccess" value="always"></param><param name="bgcolor" value="#ffffff"></param><param name="flashvars" value="prezi_id=b38e7a210a5aa7296ae91db2ca8f9afded3c36ed&amp;lock_to_path=0&amp;color=ffffff&amp;autoplay=no&amp;autohide_ctrls=0"></param><embed id="preziEmbed_b38e7a210a5aa7296ae91db2ca8f9afded3c36ed" name="preziEmbed_b38e7a210a5aa7296ae91db2ca8f9afded3c36ed" src="http://prezi.com/bin/preziloader.swf" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="450" height="400" bgcolor="#ffffff" flashvars="prezi_id=b38e7a210a5aa7296ae91db2ca8f9afded3c36ed&amp;lock_to_path=0&amp;color=ffffff&amp;autoplay=no&amp;autohide_ctrls=0"></embed></object>
]]></description>
    </item>    <item>
      <title>Jak ambitny jest Twój projekt?</title>
      <link>https://jacek.zlydach.pl/blog/2012-09-13-jak-ambitny-jest-twoj-projekt.html</link>
      <guid isPermaLink="true">https://jacek.zlydach.pl/blog/2012-09-13-jak-ambitny-jest-twoj-projekt.html</guid>
      <pubDate>Thu, 13 Sep 2012 01:52:37 +0200</pubDate>
      <category domain="https://jacek.zlydach.pl/blog/tags/old-blog.html">Old blog</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/hacker-news.html">Hacker News</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/startup.html">startup</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/ai.html">AI</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/ratowanie-swiata.html">ratowanie świata</category>
      <description><![CDATA[W jednej z <a href="http://news.ycombinator.com/item?id=4509934">ostatnich dyskusji na HackerNews</a>, poświęconej najbardziej ambitnym i przerażającym pomysłom na startupy, Eliezer Yudkowsky<a href="blog/2012-09-13-jak-ambitny-jest-twoj-projekt.html#POST_YUDKOWSKYSCALE_FN_1" name="POST_YUDKOWSKYSCALE_MT_1">*</a><span class="sidenote"><a href="blog/2012-09-13-jak-ambitny-jest-twoj-projekt.html#POST_YUDKOWSKYSCALE_MT_1" name="POST_YUDKOWSKYSCALE_FN_1">*</a> - badacz AI znany m.in. z założenia <a href="http://lesswrong.com/">LessWrong</a> i <a href="http://wiki.lesswrong.com/wiki/Sequences">świetnych tekstów n/t prawdziwej i sztucznej inteligencji</a> (długa lektura, ale polecam; jedna z najsensowniejszych rzeczy, jakie w życiu czytałem).</span> stworzył nową skalę ambicji, którą pozwolę sobie tutaj, przetłumaczoną, zacytować:

<strong><a href="http://news.ycombinator.com/item?id=4510702">Skala Ambicji Yudkowsky'ego</a></strong><a href="blog/2012-09-13-jak-ambitny-jest-twoj-projekt.html#POST_YUDKOWSKYSCALE_FN_2" name="POST_YUDKOWSKYSCALE_MT_2">**</a>
<blockquote cite="http://news.ycombinator.com/item?id=4510702">
Czy mógłbyś powiedzieć, gdzie najstraszniejszy i najbardziej ambitny przekonywujący pitch wypadł na poniższej skali?
<ol>
<li>Zbudujemy następnego Facebooka!</li>
<li>Zbudujemy następne Apple!</li>
<li>Nasz produkt stworzy rozległe zmiany polityczne! Stworzy to poważną rewolucję ekonomiczną w przynajmniej jednym kraju! (<a href="http://en.wikipedia.org/wiki/Seasteading">Seasteading</a> byłoby zmianą na tym poziomie gdyby zadziałało; udane stworzenie nowego kraju jest mniej-więcej na tym poziomie zmian.)</li>
<li>Nasz produkt to następna broń jądrowa. Nie chcecie, żeby wpadła w niepowołane ręce, prawda?</li>
<li>To będzie odpowiednikiem wynalezienia elektryczności, jeśli się uda.</li>
<li>Stworzymy lekarstwo zwiększające IQ tworząc podstawową zmianę w warunkach bytu ludzkości.</li>
<li>Stworzymy poważną, <a href="http://en.wikipedia.org/wiki/K._Eric_Drexler">Drexlerowską</a> nanotechnologię molekularną.</li>
<li>Wgramy mózg ludzki do komputera.</li>
<li>Zbudujemy rekurencyjnie samoulepszającą się sztuczną inteligencję.</li>
<li>Wydaje nam się, że wiemy jak włamać się do komputerów, na których chodzi wszechświat.</li>
</ol>
</blockquote><span class="sidenote"><a href="blog/2012-09-13-jak-ambitny-jest-twoj-projekt.html#POST_YUDKOWSKYSCALE_MT_2" name="POST_YUDKOWSKYSCALE_FN_2">**</a> - nazwa <a href="http://news.ycombinator.com/item?id=4510765">nadana przez użytkownika ph0rque</a>.</span>

Więc, jak ambitny jest Twój start-up? :).
]]></description>
    </item>    <item>
      <title>Wymieniamy ekran w Kindle 3</title>
      <link>https://jacek.zlydach.pl/blog/2012-08-30-wymieniamy-ekran-w-kindle-3.html</link>
      <guid isPermaLink="true">https://jacek.zlydach.pl/blog/2012-08-30-wymieniamy-ekran-w-kindle-3.html</guid>
      <pubDate>Thu, 30 Aug 2012 21:39:40 +0200</pubDate>
      <category domain="https://jacek.zlydach.pl/blog/tags/old-blog.html">Old blog</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/life-hacks.html">life hacks</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/porady.html">porady</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/naprawa.html">naprawa</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/kindle.html">Kindle</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/ekran.html">ekran</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/hardware.html">hardware</category>
      <description><![CDATA[Pewnego dnia pękł mi ekran od Kindle'a. Wynik tego wyglądał tak, jak na zdjęciu poniżej:

<a href="old-blog/download/posts/KindleFixing/kindlefix3.jpg"><center><img src="old-blog/download/posts/KindleFixing/kindlefix3-450px.jpg" alt="Kindle z pękniętym ekranem; działa jedynie mały fragment wyświetlacza na dole."><br>(Oops...)</center></a>

Złamany wyświetlacz uczynił urządzenie bezużytecznym. Ponieważ gwarancja już minęła, miałem do wyboru:
<ul>
<li>kupić nowego Kindle'a - 700-800zł</li>
<li>oddać go do serwisu na wymianę wyświetlacza - ok. 500zł</li>
<li>zamówić nowy ekran z Chin i wymienić samemu - ok. 150zł</li>
</ul>

Ostatnia opcja, oprócz znacznych oszczędności, niosła ze sobą najwięcej frajdy, więc na nią w końcu się zdecydowałem. Jak więc wymienić ekran w Kindle 3?

<strong>Wymieniamy ekran</strong>
Wystarczy pogrzebać odrobinę w Internecie, by znaleźć <a href="http://kindlescreen.wordpress.com/2012/07/25/kindle/">bardzo dobry poradnik</a> wymiany ekranu oraz <a href="http://www.youtube.com/watch?v=6BhTqbslijc">video pokazujące jak rozebrać urządzenie na części</a>. Zgodnie z poradnikiem, krok pierwszy to zamówienie potrzebnego komponentu przez Internet. Rekomendowany portal <a href="http://www.aliexpress.com/">Aliexpress</a> był dużo tańszy od eBay'a. Kilka kliknięć i zlecenie złożone, nowy ekran leci sobie z Chin. Kraj ten znajduje się bardzo daleko od Polski, skoro przewidywany czas dostawy pocztą lotniczą wynosił 15-30 dni, jednak superszybkie samoloty wyrobiły się w 12 dni. Towar przyszedł zgodny z zamówieniem, ale zapakowany w pudełko po bliżej nieokreślonym odtwarzaczu MP5<a href="blog/2012-08-30-wymieniamy-ekran-w-kindle-3.html#POST_KINDLEFIX_FN_1" name="POST_KINDLEFIX_MT_1">*</a><span class="sidenote"><a href="blog/2012-08-30-wymieniamy-ekran-w-kindle-3.html#POST_KINDLEFIX_MT_1" name="POST_KINDLEFIX_FN_1">*</a> - bez producenta, bez kodu kreskowego.</span>, sporą ilość folii bąbelkowej i taśmy pakowej. Mając już wszystko co potrzeba, można było przystąpić do pracy.

Krok pierwszy to zdjęcie tyłu obudowy. Nie miałem otwieraka i nie chciało mi się szukać patyczków do lodów<a href="blog/2012-08-30-wymieniamy-ekran-w-kindle-3.html#POST_KINDLEFIX_FN_2" name="POST_KINDLEFIX_MT_2">**</a><span class="sidenote"><a href="blog/2012-08-30-wymieniamy-ekran-w-kindle-3.html#POST_KINDLEFIX_MT_2" name="POST_KINDLEFIX_FN_2">**</a> - tych akurat mam sporo, dzięki uprzejmości byłej pracowniczki osiedlowego Lewiatana ;).</span>, więc poradziłem sobie nożem, ale nie polecam tej techniki - nawet cienkie ostrze jest zwykle zbyt grube i może zostawić ślady na obudowie. Chociaż wszystko jest tu na plastikowe zatrzaski, nie ma co się stresować - tylna część obudowy jest wytrzymała i ciężko byłoby ją uszkodzić. Po jej zdjęciu można przejść do kroku drugiego, czyli...

<a href="old-blog/download/posts/KindleFixing/kindlefix2.jpg"><center><img src="old-blog/download/posts/KindleFixing/kindlefix2-450px.jpg" alt="Scary electronics!"><br>(Straszna elektronika jest straszna)</center></a>

...odkręcenia elektroniki od ekranu. Zgodnie z poradnikiem, należy wykręcić szereg śrubek, usuwając po drodze baterię i odczepiając przyłącze ekranu od płytki. Poniżej zamieszczam obrazek <a href="http://kindlescreen.wordpress.com/2012/07/25/kindle/">&quot;pożyczony&quot; ze wspomnianego poradnika</a>; na żółto zaznaczono śrubki, które należy usunąć; na czerwono zaznaczyłem jeszcze dwie śrubki, które w moim przypadku wydawały się być konieczne do całkowitego odczepienia płytki od obudowy. Śrubki są małe i łatwo je zgubić; swoje trzymałem w plastikowym pudełku, ale jeśli komuś nie chce się szukać, to na niebiesko zaznaczyłem na rysunku dwie bardzo silnie magnetyczne powierzchnie, które przypadkiem odkryłem w czasie pracy :).

<a href="old-blog/download/posts/KindleFixing/chassis1.jpg"><center><img src="old-blog/download/posts/KindleFixing/chassis1-450px.jpg" alt="Co odkręcić..."><br>(Mała instrukcja co odkręcić)</center></a>

Po udanej operacji odkręcania miałem w ręku przednią część obudowy z przyklejonym do niej ekranem. W tym momencie wystarczyło już oderwać ekran (siłą, to tylko klej) od obudowy i zamienić na nowy, przekleić gąbkę z tasiemki na starym ekranie na to samo miejsce na nowym ekranie, a następnie skręcić i złożyć całość.

<a href="old-blog/download/posts/KindleFixing/IMG_20120828_100700.jpg"><center><img src="old-blog/download/posts/KindleFixing/IMG_20120828_100700-450px.jpg" alt="Co odkręcić..."><br>
(Kindle tuż PRZED wymianą wyświetlacza)</center></a>

W trakcie składania Kindle'a do kupy okazało się, że nowy ekran się nie odświeża - na szczęście przyczyną była rozładowana bateria; po trzech godzinach ładowania wszystko działało już bez zarzutu. Nie licząc podładowania, cała procedura trwała około godzinę, z czego większość czasu zajęło odkręcanie kilkunastu małych śrubek za pomocą nie do końca pasującego śrubokręta<a href="blog/2012-08-30-wymieniamy-ekran-w-kindle-3.html#POST_KINDLEFIX_FN_3" name="POST_KINDLEFIX_MT_3">***</a><span class="sidenote"><a href="blog/2012-08-30-wymieniamy-ekran-w-kindle-3.html#POST_KINDLEFIX_MT_3" name="POST_KINDLEFIX_FN_3">***</a> - tego też nie polecam; główki śrubek są wytrzymałe, ale nie aż tak, by ich nie zepsuć jak się jest nieostrożnym. Na szczęście nie były mocno przykręcone.</span>.

Czego się nauczyliśmy? Dobrze jest poczuć, że nawet XXI-wieczne wysokotechnologiczne urządzenia da się, przynajmniej w ograniczonym stopniu, naprawić samemu. W Internecie pełno jest poradników i instrukcji naprawy przeróżnej elektroniki; są nawet <a href="http://www.ifixit.com/">całe strony</a> temu poświęcone. Niektóre zabiegi wymagają większych umiejętności i specjalistycznego sprzętu, ale sporo rzeczy można zrobić samemu, przy praktycznie zerowej wiedzy elektronicznej. Wystarczy przestać się bać<a href="blog/2012-08-30-wymieniamy-ekran-w-kindle-3.html#POST_KINDLEFIX_FN_4" name="POST_KINDLEFIX_MT_4">****</a>.<span class="sidenote"><a href="blog/2012-08-30-wymieniamy-ekran-w-kindle-3.html#POST_KINDLEFIX_MT_4" name="POST_KINDLEFIX_FN_4">****</a> - Fakt, operujemy na sprzęcie za kilkaset, czy nawet kilka tysięcy złotych, ale w wielu przypadkach nie trzeba niczego więcej poza cierpliwością, systematycznością oraz opanowaniem.</span> Podpisuję się pod <a href="http://www.ifixit.com/Manifesto">Self-Repair Manifesto</a> - samodzielna naprawa wiele uczy, oszczędza pieniądze i łączy emocjonalnie z naprawionym przedmiotem, który teraz jest już rzeczywiście unikatowy.
]]></description>
    </item>
  </channel>
</rss>