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.

Czytaj dalej »

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 {
	hdr := *(*reflect.SliceHeader)(unsafe.Pointer(&bytes))
	return *(*string)(unsafe.Pointer(&reflect.StringHeader{
		Data: hdr.Data,
		Len:  hdr.Len,
	}))
}

func Bytes(str string) []byte {
	hdr := *(*reflect.StringHeader)(unsafe.Pointer(&str))
	return *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{
		Data: hdr.Data,
		Len:  hdr.Len,
		Cap:  hdr.Len,
	}))
}

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

Czytaj dalej »

PSA: Creating world-unreadable files

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.

Czytaj dalej »

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.

Czytaj dalej »

Strach

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

English version available on The Codeless Code.

Niedawno przyjęty do świątyni mnich zbliżył się do mistrza.

― Otrzymałem zadanie dodania kilku nowych funkcji do systemu obsługi zamówień Cesarskiego Szewca, ale nie jestem w stanie zrozumieć, jak on działa. Logika jest rozproszona pomiędzy wiele aplikacji zaimplementowanych przy użyciu najróżniejszych technologii. Zamiast stworzyć wspólne biblioteki, autorzy najzwyklej skopiowali fragmenty kodu pomiędzy różnymi miejscami, często wprowadzając subtelne rozbieżności. Zadania pracujące w tle wyszukują i modyfikują rekordy w bazie danych bez żadnego udokumentowanego powodu. Sama baza danych wydaje się spiskować przeciwko mnie: prosta modyfikacja jednej tabeli może wyzwolić kaskadę zmian w wielu innych.

Czytaj dalej »

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:

Czytaj dalej »

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.

Czytaj dalej »

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
Terminal window presenting right prompt behaviour.

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).

Czytaj dalej »

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 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:

Czytaj dalej »

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?

Czytaj dalej »

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.

Czytaj dalej »

Progress in Games

Michał ‘mina86’ Nazarewicz | 25 listopada 2013

“…and this pun with savegames in GTA.” my friend laughed.

“What pun? What savegames?” I asked with a blank stare.

“You know, ‘Jesus saves’.” he explained looking at me like I’m crazy.

“Wait, you could save game in GTA?” I raised my brow in disbelief.

That’s how I found out about savegames in GTA. This was years after I finished the game, twice, completing each city in one go. But as fun as GTA was, it wasn’t the game I spent most time playing. That title goes to Doom 2. To this day, I put it at the top of all FPS games ever.

Why do I mention those old, long forgotten titles? Let’s fast forward a little.

Apocalypse

I don’t usually buy games on a tangible medium. Doom 3, however, is one of the few that sits on my shelve. When I played it though, I had this uneasy feeling… Something wasn’t right. Almost as if I didn’t get what I had hoped for. The game was dark, and slow. Encounters with monsters jumping out from the darkness, were separated by journeys through dark corridors. Dim lights showed you the way in the darkness as you slowly progressed in each level, but did not reveal the danger, as that was hidden in dark corners.

I’m not a great writer, so that’s probably why I overused “dark” in the above paragraph. To my defence, so did id Software. In some respects, Doom 3 felt like a technical demo of their shiny rendering engine. The team went overboard with all the new features, and instead of creating a successor of a game I love so much, they’ve created a poor attempt at duplicating System Shock 2 (a game which even with its “outdated” graphics is much more enjoyable and immersive then Doom 3)… or something… I don’t know what exactly to be honest.

Fortunately, there’s also Classic Doom 3. A mod created by Flaming Sheep Software. It is a remake of shareware levels of the original Doom, and it is wonderful. It’s fast paced, with energetic music, no unneeded interruptions, no cut-scenes, and as far as I’m concerned, that’s the game I wanted id Software to make. It’s a pity they didn’t.

Czytaj dalej »

The Internship

Michał ‘mina86’ Nazarewicz | 7 października 2013

Due to my current position, I’ve been asked about The Internship several times. Having very low expectations about that title, I’d actually been avoiding it and thus were unable to comment. I have a very special place for watching films that I don’t expect to be good though — a plane. Here I am, flying to Pittsburgh, and those are some of my thoughts.

Most importantly, apart from being filmed at Google Mountain View campus and with some of the Google employees starring in it, the film has very little to do with Google. This should not be a surprise though. In particular, it does not show how Google internships work. I should know, I host an intern. In no particular order:

  • It’s perfectly fine to go for a beer with your boss. I do it all the time. In fact, a customary way of saying goodbye to an intern is going out with the team.
  • It’s perfectly fine to date a fellow Googler or be married to one for that matter. The usual caveats apply, like you shouldn’t date your manager or report. If in doubt, ask HR and they’ll figure something out.
  • Yes, food in cafeterias and µkitchens is free. Working at Google you may in fact get so used to it, that you’ll end up taking a ‘free’ fruit in Starbucks.
  • You actually can take food home but be reasonable about it. Some offices offers plastic containers during dinner so one can take a hot meal home. Moreover, noöne will mind if you take a snack every now and then. Mountain View campus also serves lunch on weekends.
  • Googlers are not such introverts so as to being unable to talk.
  • I may be stating the obvious, but there’s no ‘winner team’ and each intern is evaluated individually. It wouldn’t make sense any other way. In fact, interns are not teamed up together nor given tasks to work on their own (i.e. without Googler’s help).
  • This again may be obvious, but for the sake of completeness, interns never work on such broad variety of subjects. Writing an app, tech support and finding clients? No one would be able to all of do that. Interns are given a specific task in a scope of the team they are in.
  • You don’t take a full big GBus to take a few people to a restaurant. But yes, something like GBus does exists, and it’s a shuttle service taking Googlers to and from offices in Bay Area. And they are awesome — convenient and even have WiFi.
  • Yes, the terms Noogler and Googly, as well as, Noogler’s hats and TGIFs are all real. Even though the last one does not take place on Fridays in all offices. There are also other terms. The two I can recall from the top of my head are: Zoogler — Googler working at the Zürich office — and Spoogler — spouse of a Googler. Their usage varies; some people don’t particularly like them.

Other then that, the film wasn’t really funny, but the story had a few highlights, like that fact that you won’t get a job at Google if you are a jerk.

Czytaj dalej »

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";
}

Czytaj dalej »

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:

Czytaj dalej »

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.

Czytaj dalej »

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.

Czytaj dalej »

CMA po polsku

Michał ‘mina86’ Nazarewicz | 22 stycznia 2013

Będę miał dzisiaj przyjemność prezentować Contiguous Memory Allocator na seminarium dyplomowym (CMA jest bowiem tematem mojej pracy). Dostępny jest również referat opisujący z większą ilością detali zawartość slajdów. Aktualizacja: Z racji, że jestem już po obronie, dodaję również link do pracy inżynierskiej.

Prezentacja nie opisuje sposobu użycia CMA zatem po więcej szczegółów odsyłam do materiałów z LCE 2012. No i oczywiście jest również strona mina86.com/cma/, z której linkuję do przeróżnych materiałów dotyczących CMA.

CMA on LCE/ELCE 2012

Michał ‘mina86’ Nazarewicz | 7 listopada 2012

LinuxCon / Embedded Linux Conference Europe 2012 is nearly over, and I had a pleasure of talking about the Contiguous Memory Allocator. The slides from the talk are embedded below, are available for download from Google Drive, and their source code can be accessed at GitHub.

Unfortunately, in contrast to other LCE/ELCE conferences, talks were not recorded, so the video of the presentation is not available.

For more links regarding CMA, I have set up a resource page at mina86.com/cma/. Beside the link to the final CMA patchset and to the LCE/ELCE presentation, it links to various articles and patches relating to CMA directly or indirectly.

Czytaj dalej »

LazyProxy in Python

Michał ‘mina86’ Nazarewicz | 8 lipca 2012

Paths of destiny lead mysterious ways. Not so long ago, I was a hard-core C hacker and now, I spend a lot of the time coding in Python.

In somehow related news, I have discovered that my search-foo is not good enough, when I was unable to find a decent implementations of several design patterns in Python.

What I needed was a generic proxy that would defer initialisation of an object to the moment it is first used. Here is what I came up with:

class LazyProxy(object):
    __slots__ = '__get'

    def __init__(self, cls, *args, **kw):
        object.__setattr__(self, '_LazyProxy__get',
                           lambda: self.__set(cls(*args, **kw)))

    def __set(self, obj):
        object.__setattr__(self, '_LazyProxy__get', lambda: obj)
        return obj

    def __getattr__(self, name):
        return getattr(self.__get(), name)

    def __setattr__(self, name, value):
        return setattr(self.__get(), name, value)

    def __delattr__(self, name):
        return delattr(self.__get(), name)

Czytaj dalej »

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.

Czytaj dalej »

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:

Czytaj dalej »

0 is ambiguous

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

It has been a long time since my last entry. In fact, it was so long, that this condition has already been pointed out pushing me into finally writing something. 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++.

Czytaj dalej »

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.

Czytaj dalej »

Python, wrażenia

Michał ‘mina86’ Nazarewicz | 31 stycznia 2010

Niedawno miałem okazję stworzyć trochę kodu w Pythonie. Popisałem sobie w nim kilka dni i muszę przyznać… język jest tragiczny, zastanowię się kilka razy zanim po raz kolejny go użyję.

Wpis ten dedykuję pewnej osobie, która ciągle mi przypomina, abym pisał nowe wpisy. :)

Czytaj dalej »

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 PC was incorrect. “No problem” I thought as I started typing ntpdate but before finishing I realised 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 have neither — nor was looking at GKrellM on another PC — that’s just lame.

“I wish there was a NTP-over-HTTP protocol” I dreamed sighting. And then, a few curses on the IT department later, I came up with an idea…

Czytaj dalej »

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.

Czytaj dalej »

x86_64, wrażenia

Michał ‘mina86’ Nazarewicz | 18 lipca 2008

64-bitowe procesory x86_64, x64, amd64, intel64, czy jak je tam chcemy zwać, zdobywają coraz większą popularność. Jest również coraz więcej systemów operacyjnych wykorzystujących ich potencjalne możliwości. Nareszcie pozbyliśmy się problemu przekręcenie licznika w 2038! Nareszcie możemy zaadresować 1 TiB fizycznej pamięci (to, że nasza płyta główna obsługuje 3 GiB, a jak mamy szczęście 3,5 GiB to już szczegół). Nareszcie mamy 48-bitową (tj. 256 TiB) logiczną przestrzeń adresową! Do tego dochodzi lepsza obsługa instrukcji SIMD, więcej rejestrów, 64-bitowa arytmetyka itp.

Rzecz jasna nie ma nic za darmo. Za te udogodnienia musimy płacić i bynajmniej nie chodzi mi o pieniądze, bo to raczej najmniej istotne — istotniejszą kwestią jest większe zużycie pamięci z powodu użycia ośmiobajtowych wskaźników, czy wyrównania stosu do ośmiu bajtów nawet jeżeli zrzucamy na niego liczbę 32-bitową. Do tego dochodzi jeszcze bardziej skomplikowany, a przez to wolniejszy, proces tłumaczenia adresów logicznych na adresy fizyczne.

Czytaj dalej »

Masowe wysyłanie listów

Michał ‘mina86’ Nazarewicz | 3 lipca 2008

W tekście poniższym opiszę jak i dlaczego właśnie tak należy wysyłać masowe listy (tj. do wielu osób jednocześnie). Dość często zdarza mi się otrzymywać wiadomości z przerośniętą listą adresatów, z których połowy nawet nie znam — jest to zdecydowanie niedobry sposób na rozsyłanie korespondencji!

Czytaj dalej »

Sieci Komputerowe

Michał ‘mina86’ Nazarewicz | 16 czerwca 2008

Ponownie coś z serii „ja juz zaliczyłem na 5,0, a może komuś się przyda”. Odpowiedzi na pytania przygotowawcze przed kolokwium z przedmiotu Sieci komputerowe II. Jak w przypadku poprzedneigo wpisu, plik ten największą wartość ma dla studentów Elektroniki Politechniki Warszawskiej, ale może też ktoś inny będzie miał ochotę przejrzeć.

Systemy Operacyjne

Michał ‘mina86’ Nazarewicz | 16 czerwca 2008

Coś z serii „ja już zaliczyłem na pięć, a może komuś się przyda”, czyli przygotowany przeze mnie plik z odpowiedziami na pytania przygotowawcze do egzaminu z przedmiotu Systemy operacyjne. Zapewne największa wartość mają one dla studentów Elektroniki Politechniki Warszawskiej, niemniej jednak może ktoś się tym zainteresuje.

Czytaj dalej »

ARP ping

Michał ‘mina86’ Nazarewicz | 6 czerwca 2008

Czas jakiś temu zainstała u mnie potrzeba sprawdzenia, na komputerze bez przydzielonego adresu sieciowego, czy komputer o danym adresie istnieje. Chciałem mianowicie, zależnie od wyników sprawdzenia skonfigurować sieć statycznie lub dynamicznie. Stosunkowo szybko doszedłem do wniosku, iż szczególną uwagę należy zwrócić na protokół ARP.

W protokole Ethernet urządzenia są rozpoznawane za pomocą adresów MAC, a więc, aby móc wysłać pakiet do komputera o danym IP należy najpierw poznać jego adres sprzętowy. Do tego właśnie służy protokół ARP (gwoli ścisłości, może on być wykorzystany również przy innych protokołach warstwy drugiej i trzeciej).

Jak to działa? Pierwsza strona rozsyła do wszystkich (na adres broadcast, tj. FF:FF:FF:FF:FF:FF) zapytanie, wypełniając swój adres IPMAC oraz adres IP, o który chce się zapytać. W odpowiedzi, druga strona wysyła ramkę z oboma adresami, swoimi i komputera wysyłającego pytanie.

Nie każdy zdaje sobie sprawę, iż protokół ten można wykorzystywać nawet jeżeli nie ma się swojego adresu sieciowego — wówczas w odpowiednie pole wpisujemy same zera. W niczym to nie przeszkadza — w żadnym momencie protokół warstwy trzeciej nie jest wszak wykorzystywany.

Warto wspomnieć, iż mechanizm ten jest wykorzystywany przez klienty DHCP, do sprawdzania (na wszelki wypadek), czy adres im nadany jest faktycznie wolny — nazywa się to Adress Conflict Detection.

Dla zainteresowanych aplikacja, która próbuje wykryć adres sprzętowy urządzenia o podanym adresie sieciowym.

Double-checked locking pattern

Michał ‘mina86’ Nazarewicz | 29 kwietnia 2008

Jakiś czas temu w pewnych okolicznościach poruszony został wzorzec double-checked locking singleton, który jak powszechnie wiadomo nie jest do końca poprawny. Wynikła z tego krótka dyskusja, której kompilację pozwolę sobie wkleić poniżej (gdyż nie jest ona ogólnie dostępna, a nie lubię, gdy informacje się marnują).

Czytaj dalej »

Ochrona stosu

Michał ‘mina86’ Nazarewicz | 8 kwietnia 2008

Prezentacja, którą omawiałem w trakcie prelekcji na 5. Sesji linuksowej traktująca o mechanizmie ochrony stosu polegającym na dodaniu strażnika pomiędzy adresem powrotu, a zmiennymi lokalnymi funkcji. Archiwum tar zawiera również proste programy, które były prezentowane w trakcie wykładu. Na stronach serwisu TechIT dostępne jest nagranie wykładu.

Stałość fizyczna i logiczna w C++

Michał ‘mina86’ Nazarewicz | 21 marca 2008

Chciałbym zaprezentować pewien tekst, który przygotowałem na jeden z przedmiotów na studiach. Traktuje on o modyfikatorze const i mutable oraz określa pojęcie stałości logicznej czyli niezmienności zachowania obiektu, gdy patrzymy z zewnątrz. Może komuś się to przyda. Czekam również na wszelkie komentarze.

Czytaj dalej »

Transmisja cyfrowa

Michał ‘mina86’ Nazarewicz | 13 lutego 2008

Zainspirowany wpisem Michała Górnego postanowiłem napisać coś o transmisji cyfrowej. Wszak wielkości w naturze rzadko kiedy występują w postaci cyfrowej--aby się takiej doszukać należy zejść aż do poziomu cząstek elementarnych i analizowanie spinów i innych niezrozumiałych dla zwykłego człowieka parametrów. Jak więc to się dzieje, że komputer operuje na bitach? Co to w ogóle ta telewizja cyfrowa?

Czytaj dalej »

Komentarz to, czy może skrypt?

Michał ‘mina86’ Nazarewicz | 12 lutego 2008

Przenosząc się na Joggera straciłem sporo czasu na dochodzenie czemu skrypty, które zamieszczałem nie działały tak jak powinny (tzn. nie działały w ogóle). Okazało się, że zależnie od typu MIME strony skrypty są różnie interpretowane. A dokładniej mechanizmy ochrony skryptów.

Ze względu na przeglądarki nie rozumiejące tagu script przyjęło się kod skryptu umieszczać w komentarzu. Przeglądarki wspierające skrypty domyślały się, że to tak naprawdę kod skryptu i jakoś sobie z tym radziły. Ku memu lekkiemu zdziwieniu odkryłem, że Opera i Firefox przestają wykonywać kod skryptu, gdy strona jest dostarczona jako application/xhtml+xml. Aby sprawę zbadać bardziej szczegółowo stworzyłem taką oto stronę testową:

Czytaj dalej »

Zabezpieczanie kodu strony WWW

Michał ‘mina86’ Nazarewicz | 12 lutego 2008

Niektórzy uważają, że użytkownik czytający ich stronę nie powinien mieć dostępu do niczego poza ostatecznym efektem renderowania strony. Najczęściej jest to spowodowane chęcią zabezpieczenia kodu HTML lub obrazków przed kopiowaniem i używaniem ich do własnych celów.

Czytaj dalej »

O kryptografii słów kilka

Michał ‘mina86’ Nazarewicz | 12 lutego 2008

Każdy człowiek ma jakieś tajemnice, których nie chce nikomu zdradzać. Równocześnie każdy ma sekrety, którymi chce się z kimś podzielić, ale tak, żeby nikt więcej ich nie poznał. Sytuacje takie mogą się zdarzać w codziennym życiu przeciętnego obywatela, w życiu dużej firmy lub całego państwa. Utrzymanie w tajemnicy pewnych tajemnic może się przyczynić do czyjegoś sukcesy lub porażki. Winston Churchill (1874-1965) przyznał, że złamanie kodów Enigmy przez trzech polskich matematyków (Mariana Rejewskiego (1905-1980), Jerzego Różyckiego (1906-1942) i Henryka Zygalskiego (1906-1978)) pozwoliło w znacznym stopniu skrócić czas wojny (i co za tym idzie, zmniejszyć liczbę ofiar).

Czytaj dalej »

Pierwsze kroki po zainstalowaniu Slackware’a

Michał ‘mina86’ Nazarewicz | 12 lutego 2008

W niniejszym artykule opiszę czynności, jakie zazwyczaj wykonuję zaraz po zainstalowaniu Slackware’a. Nie są to rzeczy, które doprowadzają do idealnego zabezpieczenia, olbrzymiego wzrostu wydajności, czu użyteczności systemu, ale raczej kroki wyważone pomiędzy tymi aspektami. Oczywiście, jest to opis tego co ja robję, więc niekoniecznie wszystko, co zostało tutaj opisane, będzie Ci odpowiadać.

UPDATE 18/04/08: Dodane TMOUT.

Czytaj dalej »

Wrażenia z Gentoo

Michał ‘mina86’ Nazarewicz | 12 lutego 2008

Ostatnio, przy okazji zmiany systemu plików z Reiser4 na ext3 postanowiłem zainstalować Gentoo. Głównym motywem był jednak nie system plików, a fakt posiadania 64 bitowego procesora, który nie jest wspierany przez Slackware - dystrybucję, którą używam. Tak, wiem o istnieniu Slamd64, ale od tej dystrybucji wolę trzymać się z daleka… (Update: Na chwilę obecną, gdy dodaję ten wpis do Joggera, mogę powiedzieć, że Slamd64 12.0 nie jest wcale takie złe i działa całkiem stabilnie i przyjemnie.)

Czytaj dalej »

Przywracanie możliwości bootwania GNU/Linuksa

Michał ‘mina86’ Nazarewicz | 12 lutego 2008

W artykule poniższym zamierzam opisać jak przywrócić LILO jako bootloader w sytuacji, gdy został on zastąpiony loaderem z Windowsów NT, co w efekcie powoduje niemożność uruchomienia GNU/Linuksa. Zakładam, że na dysku zainstalowany jest zarówno GNU/Linux (którego nie można uruchomić) oraz Windows z serii NT (w szczególności Windows 2000 i Windows XP, przy pozostałych Windowsach NT sprawa może wyglądać trochę inaczej). Co więcej, opis dotyczy LILO, ale ogólna idea może zostać zastosowana również w przypadku innych bootloaderów (zmieniają się jedynie pliki konfiguracyjne i polecenie updatowania bootloadera).

Czytaj dalej »