Michał ‘mina86’ Nazarewicz | 26 lutego 2019

This may have been obvious, but I’ve just learned that browsers ignore Expires header when the user manually reloads the page (as in by pressing F5 or choosing Reload option).

I’ve run into this when testing how Firefox treats pages which ‘never’ expire. To my surprise, the browser made requests for files it had a fresh copy of in its cache. To see behaviour much more representative of the experience of a returning user, one should select the address bar (Alt+D does the trick) and then press Return to navigate to the current page again. Hitting Reload is more akin, though not exactly the same, to the first visit.

Of course, all of the above applies to the max-age directive of the Cache-Control header as well.

Moral of the story? Make sure you test the actual real-life scenarios before making any decisions.

# Setting up Tor hidden service

Michał ‘mina86’ Nazarewicz | 17 lutego 2019

Anyone can think of myriad reasons to run a Tor hidden service. Surely many unsavoury endeavours spring to mind but of course, there are as many noble ones. There are also various pragmatic causes like circumventing lousy NATs. Me? I just wanted to play around with my router.

Configuring a hidden service is actually straightforward so to make things more interesting, this article will cover configuring a hidden service on a Turris Omnia router with the help of Linux Containers to maximise isolation of components. While some steps will be Omnia-specific, most translate easily to other systems, so this post may be applicable regardless of the distribution used.

# Java: String↔char[]

Michał ‘mina86’ Nazarewicz | 9 lutego 2019

Do you recall when I decided to abuse Go’s run-time and play with string[]byte conversion? Fun times… I wonder if we could do the same to Java?

To remind ourselves of the ‘problem’, strings in Java are immutable but because Java has no concept of ownership or const keyword (can we move the industry to Rust already?) to make true on that promise, Java run-time has to make a defensive copy each time a new string is created or when string’s characters are returned.

Alas, do not despair! There is another way (exception handling elided for brevity):

private static Field getValueField() {
final Field field = String.class.getDeclaredField("value");
field.setAccessible(true);
/* Test that it works. */
final char[] chars = new char[]{'F', 'o', 'o'};
final String string = new String();
field.set(string, chars);
if (string.equals("Foo") && field.get(string) == chars) {
return field;
}
throw new UnsupportedOperationException(
"UnsafeString not supported by the run-time");
}

private final static Field valueField = getValueField();

public static String fromChars(final char[] chars) {
final String string = new String();
valueField.set(string, chars);
return string;
}

public static char[] toChars(final String string) {
return (char[]) valueField.get(string);
}

However. There is a twist…

# Calculating sRGB↔XYZ matrix

Michał ‘mina86’ Nazarewicz | 3 lutego 2019

I’ve recently found myself in need of an sRGB↔XYZ transformation matrix expressed to the maximum possible precision. Sources on the Internet typically limit the precision to just a few decimal places so I've decided to do the calculations by myself.

What we’re looking for is a 3-by-3 matrix $$M$$ which, when multiplied by red, green and blue coördinates of a colour, produces its XYZ coördinates. In other words, a change of basis matrix from a space whose basis vectors are sRGB’s primary colours: $$M = \begin{bmatrix} X_r & X_g & Y_b \\ Y_r & Y_g & Y_b \\ Z_r & Z_g & Z_b \end{bmatrix}$$

# PSA: Yes, 64-byte key file is OK

Michał ‘mina86’ Nazarewicz | 4 kwietnia 2017

In an earlier entry I’ve changed generated key file used for disk encryption from 4096 to meagre 64 bytes. I gave no mention of that adjustment considering it unimportant but have since been enquired about security of such a short password.

Rest assured, a 64-byte key file is sufficient for any symmetric encryption (disk encryption being one example) and anything more does not improve security.

# Go: string↔[]byte

Michał ‘mina86’ Nazarewicz | 28 lutego 2017

Yes… I’ve started coding in Go recently. It lacks many things but the one feature relevant to this post is const keyword. Arrays and slices in particular are always mutable and so equivalent of C’s const char * does not exist.

On the other hand, strings are immutable which means that conversion between a string and []byte requires memory allocation and copying of the data¹. Often this might be acceptable but to squeeze every last cycle the following two functions might help achieve zero-copy implementation:

func String(bytes []byte) string {
Data: hdr.Data,
Len:  hdr.Len,
}))
}

func Bytes(str string) []byte {
Data: hdr.Data,
Len:  hdr.Len,
Cap:  hdr.Len,
}))
}

Depending on the length of the strings, the difference in performance might be noticeable:

Michał ‘mina86’ Nazarewicz | 5 lutego 2017

I’ve been reading tutorials on using key files for disk encryption. Common approach for creating such a file is:

Step 1: Create a random key file

head -c 4096 /dev/urandom >keyfile

Step 2: Make the file readable by owner only

chmod 400 keyfile

*sighs* Please, stop doing this and spreading that method. The correct way of achieving the effect is:

Step 1: Create a random key file readable by owner only

(umask 077; head -c 64 /dev/random >keyfile)

Or if the file needs to be created as root while command is run by a different user:

Step 1: Create a random key file readable by root only

sudo sh -c 'umask 077; head -c 64 /dev/random >keyfile'

The first method creates the file as world-readable¹ and before its permission are changed anyone can read it. The second method creates the file as readable only by its owner from the very beginning thus preventing the secret disclosure.

# Generating random reals

Michał ‘mina86’ Nazarewicz | 26 grudnia 2016

A well known way of generating random floating point numbers in the presence of a pseudo-random number generator (PRNG) is to divide output of the latter by one plus its maximum possible return value.

extern uint64_t random_uint64(void);

double random_double(void) {
return random_uint64() / (UINT64_MAX + 1.0);
}

This method is simple, effective, inefficient and wrong on a few levels.

Michał ‘mina86’ Nazarewicz | 25 listopada 2016

Tak, ponownie nadeszła ta pora raku. Musisz się postarać, jeśli chcesz być/pozostać ulubioną ciocią, wujkiem, bratem, siostrą lub rodzicem. Ale jak z szerokiego asortymentu zabawek, wybrać najlepszy prezent?

Niestety nie mam odpowiedzi na wszystkie pytania, ale poniższy diagram może pomóc w przynajmniej jednym aspekcie:

# Python tips and tricks

Michał ‘mina86’ Nazarewicz | 1 września 2016

Python! My old nemesis, we meet again. Actually, we meet all the time, but despite that there are always things which I cannot quite remember how to do and need to look them up. To help with the searching, here there are collected in one post:

# Website move

Michał ‘mina86’ Nazarewicz | 1 kwietnia 2016

(photo Ikiwaner, CC-BY-SA)

Some regular visitors of the web site may be aware that the page used to run on Jogger.pl platform. Some will also be aware that the service closes shop, an act which forced me to move to another hosting.

In moving the page, I’ve tried to keep old URLs work so even though canonical locations for posts have changed, the old links should result in a correct redirect.

This is also true for feeds but while Jogger provided customisation options (RSS and Atom, excerpts only, no HTML and posts count), currently only full-content HTML Atom feeds limited to newest ten entries are provided.

If anything broke for you, please do let me know at mina86@mina86.com.

I have not yet figured out what to do with comments which is why commenting is currently unavailable. Since I want my whole page to be completely static, I’m planning on using a third-party widget. So far I’ve narrowed the choice down to HTML Comment Box and the new hotness, Spot.IM. Any suggestions are also welcome.

On the bright side, the page now loads five times faster! Jogger.pl took its sweet time when generating responses. A static page and better optimised infrastructure of my current provider allows to drop response time from 300 to 60 ms.

# On Unicode

Michał ‘mina86’ Nazarewicz | 25 października 2015

There are a lot of misconceptions about Unicode. Most are there because people assume what they know about ASCII or ISO-8859-* is true about Unicode. They are usually harmless but they tend to creep into minds of people who work with text which leads to badly designed software and technical decisions made based on false information.

Without further ado, here’s a few facts about Unicode that might surprise you.

# Bash right prompt

Michał ‘mina86’ Nazarewicz | 28 września 2015

There are multiple ways to customise Bash prompt. There’s no need to look for long to find plethora of examples with fancy, colourful PS1s. What have been a bit problematic is having text on the right of the input line. In this article I’ll try to address that shortcoming.

## Getting text on the right

The typical approach is using PROMPT_COMMAND to output desired content. The variable specifies a shell code Bash executes prior to rendering the primary prompt (i.e. PS1).

The idea is to align text to the right and then using carrier return move the cursor back to the beginning of the line where Bash will start rendering its prompt. Let’s look at an example of showing time in various locations:

__command_rprompt() {
local times= n=$COLUMNS tz for tz in ZRH:Europe/Zurich PIT:US/Eastern \ MTV:US/Pacific TOK:Asia/Tokyo; do [$n -gt 40 ] || break
times="$times${tz%%:*}\e[30;1m:\e[0;36;1m"
times="$times$(TZ=${tz#*:} date +%H:%M)\e[0m" n=$(( $n - 10 )) done [ -z "$times" ] || printf "%${n}s$times\\r" ''
}
PROMPT_COMMAND=__command_rprompt

## Clearing the line on execution

It has one annoying issue. The right text reminds on screen even after executing a command. Typically this is a matter of aesthetic but it also makes copying and pasting session history more convoluted.

A manual solution is to use redraw-current-line readline function (e.g. often bound to C-l). It clears the line and prints the prompt and whatever input has been entered thus far. PROMPT_COMMAND is not executed so the right text does not reappear.

Lack of automation can be addressed with a tiny bit of readline magic and a ~/.inputrc file which deserves much more fame than what it usually gets.

Tricky part is bindind C-m and C-j to two readline functions, redraw-current-line followed by accept-line, which is normally not possible. This limitation can be overcome by binding the key sequences to a different sequence which will be interpreted recursively.

To test that idea it’s enough to execute:

bind '\C-l:redraw-current-line'
bind '\M-\C-j:accept-line'
bind '\C-j:"\C-l\M-\C-j"' '\C-m:"\C-j"'

Making this permanent is as easy as adding the following lines to ~/.inputrc:

$if Bash "\C-l": redraw-current-line "\e\C-j": accept-line "\C-j": "\C-l\e\C-j" "\C-m": "\C-l\e\C-j"$endif

With that, the right prompt will disappear as soon as the shell command is executed. (Note the use of \M- in bind command vs. \e in ~/.inputrc file).

# Mobile is the Future

Michał ‘mina86’ Nazarewicz | 17 marca 2015

(photo Cory Doctorow, CC-BY-SA)

A few days ago I received an email from Google Wembaster Tools saying no more no less but: ‘Your webpage sucks on mobile devices!’ Or something. Now that I think of it, I could have been worded slightly differently. The gist was the same though.

I never really paid that much attention to how my site looks on phones and tables. I’ve made sure it loaded and looked, but apart from that never spent much time on the issue. I always thought optimising for a small screen would be a lengthy and painful process. How mistaken I was!

In my defence, when I last looked at the problem, state of mobile browsers was different; now there are really just two things to do. First of all, add a viewport meta tag, e.g.:

<meta name=viewport
content="width=device-width, initial-scale=1">

and then use min-width or max-width CSS media queries. Admittedly the second part may take some time, but if your layout uses simple markup rather than being TABLE-based, reading the excellent article on A List Apart might turn out to be the most time consuming step.

If you haven’t already, do take a look at whether your website looks reasonably well on small screens. Apparently mobile is the future, or some such.

The ‘bad’ news is that I’ve dropped endless scroll feature. This is because in narrow layout the sidebar moves to the bottom and endless scrolling would make it unreachable since it would run away all the time.

# The time has come to stand up for the GPL

Michał ‘mina86’ Nazarewicz | 11 marca 2015

For people who know me it should come with no surprise that I support free software in most forms it can take. I also believe that if someone gives you something at zero price, basic courtesy dictates that you follow wishes of that person. This is why when Software Freedom Conservancy started a GPL Compliance Project for Linux Developers I didn’t hesitate even for a minute to offer little Linux copyright I held to help the effort.

Most importantly though, it is why I fully support Conservancy in taking legal action against VMware which for years has been out of compliance with Linux’s license.

If you care about free software, the GPL or want more projects like OpenWrt, consider donating to help Christoph Hellwig and the Conservancy with their legal battle against this multi-billion-dollar corporation who for some reason decided to free-ride on other people’s work without respecting their wishes.

If you don’t feel like, or for whatever reason cannot donate, twitting something along the lines of ‘Play by the rules, @VMware. I defend the #GPL with Christoph & @Conservancy. #DTRTvmware Help at https://sfconservancy.org/supporter/’ or otherwise spreading the word will help as well. Oh, and in case you were, like I was, wondering — DTRT stands for ‘do the right thing’.

And if you want to know more:

# Miscellaneous tips and tricks

Michał ‘mina86’ Nazarewicz | 14 grudnia 2014

Don’t you hate when you need to do something you had done before, but cannot remember how exactly? I’ve been in that situation several times and sometimes looking up for a correct method turned out considerably harder than it should. To alleviate the need for future Googling, here’s a bag of notes I can reference easily:

Looking for Python stuff? Those are now in separate post:

# Bose QuietComfort 15 vs. JH Audio 13

Michał ‘mina86’ Nazarewicz | 25 maja 2014

A few years back I bought Bose QuietComfort 15 headphones. It was around the time I discovered just how noisy things can get at the altitude of around 10 km. QC15s turned out to be a life saver making an unbearable flights slightly more bearable.

A few months ago I decided to risk substantial amount of money and got custom-made JH Audio in-ear monitors (or IEMs), model JH13 Pro — the risk was especially big since, for obvious reasons, they couldn’t be resold. Was it worth it?

# Map-reduce explained

Michał ‘mina86’ Nazarewicz | 18 maja 2014

Outside of functional programming context, map-reduce refers to a technique for processing data. Thanks to properties of map and reduce operations, computations which can be expressed using them can be highly parallelised, which allows for faster processing of high volumes of data.

If you’ve ever wondered how tools such as Apache Hadoop work, you’re at the right page. In this article I’ll explain what map and reduce are and later also introduce a shuffle phase.

# Review of the EU copyright rules

Michał ‘mina86’ Nazarewicz | 31 stycznia 2014

This is a public service announcement to inform you, if you are not yet aware, that European Union is asking for input on the review of copyright rules. The deadline for submission of the questionnaire is 5th of February so if you want to give your opinion you should hurry.

Answering 80 questions may not be your idea of fun. Fortunately you don’t have to answer all of the questions plus to makes matter easier you can use a simplified web-form at copywrongs.eu or read a simple guide by Amelia Andersdotter, a Swedish Pirate Party politician and Member of the European Parliament.

For more news coverage, head to EFF or TorrentFreak.

# Slackware post install

Michał ‘mina86’ Nazarewicz | 25 stycznia 2014

Same as my previous article written in Polish, this text will describe some steps I take after installing Slackware Linux. I try to strike a balance between performance, security and usability, but not everything written here may work for everyone. You have been warned.

# A.I.

Michał ‘mina86’ Nazarewicz | 22 września 2013

While cleaning Tiny Applications Collection a little I’ve dropped both artificial intelligence scripts. However, not wanting to let them disappear, I’ve decided to post them here for posterity.

The first one is an eight line of code version that might just be what Sid wrote as his first program ever:

#!/usr/bin/perl -wWtT
while (<>) {
if (/[aeiouyAEIOUY][^a-zA-Z]*$/) { print "Yes.\n"; } elsif (!/^\s*$/) {
print "No.\n";
}
}

The second one is an “improved” six-line version akin to Pitr’s code:

#!/usr/bin/perl -wWtTn
if (/[aeiouyAEIOUY][^a-zA-Z]*$/) { print "No!\n"; } elsif (!/^\s*$/) {
print "Yes.\n";
}

# Standard-agnostic HTML code

Michał ‘mina86’ Nazarewicz | 17 lipca 2013

HTML has gone quite a long way since its inception. This means a lot of new features but also some small incompatibilities which may pose issues in certain situations. For instance, when posting a code snippet for others to include on their websites, it’s best if it works correctly on as many sites as possible which implies being compatible with as many versions of HTML as possible. But how to create a snippet that works both in HTML and XHTML? Here are a few tips:

# CSS sprites as background

Michał ‘mina86’ Nazarewicz | 6 maja 2013

CSS sprites aren’t anything new. They have been around for years now, and are one of the methods to optimise website load time. The idea is to incorporate several images into a single bigger one and in this way decrease number of round trips between HTTP server and a browser.

In its traditional use, CSS sprites work as a replacement for images and cannot be used as a background. But background is exactly how I’d implemented quote image left of long quotes and flags indicating language paragraph was written in, e.g.:

A few of the entries on my blog have text both in English and Polish. On those, I use some simple icons to indicate which is which:

Polish flag on the left indicates paragraph is written in Polish.

Union Jack on the left indicates paragraph is written in English.

After a bit of playing around I finally figured out how to get this working, and even though there are some caveats, sprites can be used as a top-left no-repeat background image as well.

# The fifth generation

Michał ‘mina86’ Nazarewicz | 29 marca 2013

This day must have come sooner or later. Even more so since I love squeezing every byte out of the data being sent over the network, which is why source of this website is so unreadable (don’t worry though, readable sources are available in a git repository).

So yeah. I’ve switched this website to HTML5 with some of it’s new elements and optional tags removed. After years of using XHTML 1.1 it feels a bit weird not closing tags, but I guess a few saved bytes are worth it, aren’t they? ;)

I’ve even got my electric slash working in Emacs’s html-mode (ie. if I press slash after < sign, inner most element is closed automatically).

Unfortunately, not all is so shiny. For some reason, automatic pagination on entries list page and “load content” link stopped working under Opera. The way those work is by making an XMLHttpRequest and injecting portion of the fetched document in appropriate place. For some reason, Opera ends up with a DOMException: INVALID_STATE_ERR.

# SSL and dropping “www.” with mod_rewrite

Michał ‘mina86’ Nazarewicz | 10 lutego 2013

Surprisingly I couldn’t find any HTTPS-aware examples how to drop the www. prefix from web hosts in Apache, so I had to come up with one myself. Firstly, the following lines need to find their way to the end of Apache configuration file (/etc/httpd/conf/httpd.conf or something):

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^www\.(.*)$RewriteRule ^(.*)$ http://%1$1 [L,R=301] Secondly, analogous lines need to be added inside of the <VirtualHost _default_:443> directive of mod_ssl configuration file (/etc/httpd/conf.d/ssl.conf or similar), like so: <VirtualHost _default_:443> # … various directives … # Here’s what needs to be added: RewriteEngine on RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^(.*)$https://%1$1 [L,R=301]
</VirtualHost>

Now, after a restart, Apache will drop the www. prefix for both secure and insecure connections.

# Deep Dive into Contiguous Memory Allocator

Michał ‘mina86’ Nazarewicz | 10 czerwca 2012

This is the first part of an extended version of an LWN article on CMA. It contains much more detail on how to use CMA, and a lot of boring code samples. Should you be more interested in an overview, consider reading the original instead.

Contiguous Memory Allocator (or CMA) has been developed to allow big physically contiguous memory allocations. By initialising early at boot time and with some fairly intrusive changes to Linux memory management, it is able to allocate big memory chunks without a need to grab memory for exclusive use.

Simple in principle, it grew to be a quite complicated system which requires coöperation between boot-time allocator, buddy system, DMA subsystem, and some architecture-specific code. Still, all that complexity is usually hidden away and normal users won’t be exposed to it. Depending on perspective, CMA appears slightly different and there are different things to be done and look for.

# Null: The never-ending story

Michał ‘mina86’ Nazarewicz | 27 marca 2011

I have already mentioned some problems with the null pointer but my recent discovery knocked my socks off.

By now, it should come with no surprise to anyone that 0 in pointer context acts as a null pointer (no matter of its actual representation). Moreover, it takes only a tiny bit of experimenting to figure out that expressions like (int)0 do as well. The latter is in itself a bit of a pita but it is conforming to the C++ standard which says:

# Braid

Michał ‘mina86’ Nazarewicz | 25 grudnia 2010

I’ve just finished Braid. Not an impressive achievement, I admit, but just as I finished the last world (or should I say the first) I immediatelly felt the need to spread the word about this wonderful game. (I do need to apologise at this point for yet another non-technical entry on my blog.)

I probably wouldn’t get myself to writing anything about the game if I hadn’t seen Video Games are Art talk by Kellee Santiego of That Game Company, who, as it turns out, mentions Braid. (Not that I consider the speech to be particularly interesting or well presented — on the contrary, in my opinion it is unstructured with rather poor arguments — but it somehow stuck in my memory.)

# Prime numbers less than 100

Michał ‘mina86’ Nazarewicz | 12 grudnia 2010

Anyone working in a big corporation must have been hit by some “funny” mail from a coworker that helps everyone gets through the day. No different at my office — at one point all engineers have been challenged to write the shortest code in C that prints all prime numbers (and only prime numbers) less than a hundred each on separate line.

This is an interesting brain-teaser so posting it here so others may choose to think about it while their code’s compiling.

Of course, a “C program” needs not to be taken too seriously — depending on not too far fetched undefined behaviours of given implementation is all right (but please do not use system or exec family of calls ;) ).

# 0 is ambiguous

Michał ‘mina86’ Nazarewicz | 24 października 2010

It has been a long time since my last entry, so inspired by Adriaan de Groot’s entry, I decided to write something about 0, NULL and upcoming nullptr.

I will try to be informative and explain what the whole buzz is about and then give my opinion about nullptr. Let us first inspect how a null pointer can be donated in C and C++.

# New C features proposal

Michał ‘mina86’ Nazarewicz | 18 kwietnia 2010

As the committee gathered to discuss how the new C standard will look like I did some thinking of my own. I thought about features that I would love to see in C. I even collected thoughts of my twisted mind and condensed them into a text file.

What is outrageous is that since I believe information and ideas want to be free and shared I have decided to post my concepts on the net instead of imprisoning them in my wicked brain.

Maybe someone will find it useful somehow. Maybe even some committee member will read those and bring them out on the next meeting.

# NTP over HTTP

Michał ‘mina86’ Nazarewicz | 16 stycznia 2010

Sitting in a dark office, after swearing for hours at ATI video cards I noticed time on my computer was incorrect. ‘No problem,’ I thought as I started typing ntpdate. That’s where it struck me that our beloved IT department had blocked most of the Internet. Checking the time on a watch or a mobile phone was not an option — I had neither — nor was looking at GKrellM on another PC — that’s just lame.

‘I wish there was a NTP-over-HTTP protocol’ I sighed. And then I realised there was…

# Total Control Exchange (No Caps Lock)

Michał ‘mina86’ Nazarewicz | 11 października 2009

Have you ever wondered why Caps Lock, a key you press twice a decade (once to turn it on and then to turn it off), is in such a lucrative position on the keyboard? And how about Ctrl? Compared to Caps Lock it seems like miles away. If you think about it old unix keyboards with those keys swapped seem to got it right.

I’ve gone one step further and recommend turning Caps Lock into Ctrl key altogether. In this article I will describe how to do that in various systems and platforms. But lets start with some propaganda.

# Rozszerzenie tabbed dla urxvt

Michał ‘mina86’ Nazarewicz | 16 maja 2009

Jakiś czas temu, zmodyfikowałem rozszerzenie tabbed dla rxvt-unicode dodając parę pożytecznych funkcji. Upstream jakoś tego nie chciał, a potem ludzie zaczęli dodawać jeszcze inne zmiany i tak powstał fork o nazwie tabbedex. Kod można przeglądać w repozytorium na GitHubie lub sklonować git://github.com/mina86/urxvt-tabbedex.git

tabbedex ma bardzo dużo zmian, i raczej daremne byłoby wymienianie ich wszystkich tutaj chociażby z racji tego, że lista szybko stałaby się nieaktualna. Z tego powodu, zachęcam do przejrzenia kodu źródłowego, który ma na początku komentarz z listą zmian.

# Publiczne repozytorium gita

Michał ‘mina86’ Nazarewicz | 12 listopada 2008

W końcu zebrałem się i po wypełnieniu odpowiednich formalności stworzyłem zbiór publicznych repozytoriów gita z różnymi rzeczami napisanymi przeze mnie. W chwili obecnej, najciekawszym jest chyba repozytorium dot-files zawierające różne moje pliki konfiguracyjne — może komuś się na coś przydadzą. :)

# ls-cmd.pl

Michał ‘mina86’ Nazarewicz | 15 kwietnia 2008

Coś dla prawdziwych uniksowych geeków: Skrypt, który powoduje, że dobrze znana komenda ls działa w Irssi jak powinna, czyli wyświetla listę osób na kanale (samo ls, bez slasha).

Michał ‘mina86’ Nazarewicz | 26 lutego 2008

Skrypt implementujący zaawansowane algorytmy sztucznej inteligencji odpowiadający na pytania zadawane na kanale. Może udzielać odpowiedzi albo na wszystkie pytania albo tylko na te napisane bezpośrednio do nas (tzn. poprzedzone naszym nickiem).

# MPD now playing dla Irssi

Michał ‘mina86’ Nazarewicz | 26 lutego 2008

W miarę prosty skrypt wypisujący tytuł obecnie odgrywanej w MPD piosenki. Posiada również unikalną funkcję automatycznej odpowiedzi na informacje wysyłane przez innych użytkowników.

# bitlbee query auto

Michał ‘mina86’ Nazarewicz | 20 lutego 2008

Ciekawy patch do bitlbee pozwalający na automatyczne ignorowanie, odrzucanie lub akceptowanie żądań o autoryzację. Można np. przefiltrować wszystkie wiadomości zawierające adresy URL, co znacznie zmniejsza ilość spamu. Można też ustawić akceptowanie wszystkich pozostałych zadań.