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 aren’t anything new. They have been around for years, and are one of the methods to optimise website’s load time. The idea is to incorporate multiple images into one and in this way decrease number of round trips between the server and the browser.
In its traditional use, CSS sprites work as a replacement for images and cannot be used as a background. Alas that is exactly what I wanted to do with a quote and flag icons like the following:
Update: This website has evolved slightly since 2013. The flags are no longer used (replaced by content negotiation) and quote sprite icon has been replaced by an SVG. While I no longer use this technique, it is of course still valid.
After some playing around I’ve finally figured out how to get this working. Even though there are some caveats, sprites can be used as a top-left no-repeat background image as well.
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.
@mastersthesis{Nazarewicz2013bsc,
title = {Alokacja ciągłych fizycznie obszarów pamięci w systemie {Linux}},
author = {Michał Nazarewicz},
year = 2013,
school = {WEiTI/ISE, PW},
address = {Warszawa},
type = {Praca inżynierska},
urn = {urn:pw-repo:WUT2a4eca3283974485823865112329121d},
url = {https:/mina86.com/2013/cma-po-polsku/}
}
ACM
Michał Nazarewicz. 2013. Alokacja ciągłych fizycznie obszarów pamięci w systemie Linux. Praca inżynierska. WEiTI/ISE, PW, Warszawa. https:/mina86.com/2013/cma-po-polsku/
APA
Nazarewicz, M. (2013). Alokacja ciągłych fizycznie obszarów pamięci w systemie Linux [Praca inżynierska, WEiTI/ISE, PW]. https:/mina86.com/2013/cma-po-polsku/
IEEE
M. Nazarewicz, „Alokacja ciągłych fizycznie obszarów pamięci w systemie Linux,” Praca inżynierska, WEiTI/ISE, PW, Warszawa, 2013. [Online]. https:/mina86.com/2013/cma-po-polsku/
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ą 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.
@inproceedings{Nazarewicz2012lce,
title = {{Contiguous Memory Allocator}: {Allocating} Big Chunks of Physically Contiguous Memory},
author = {Michał Nazarewicz},
booktitle = {LinuxCon Europe},
year = 2012,
month = nov,
day = 6,
address = {Barcelona, Spain},
url = {https://events.static.linuxfound.org/images/stories/pdf/lceu2012_nazarwicz.pdf}
}
ACM
Michał Nazarewicz. 2012. Contiguous Memory Allocator: Allocating Big Chunks of Physically Contiguous Memory. In LinuxCon Europe, Barcelona, Spain. Retrieved from https://events.static.linuxfound.org/images/stories/pdf/lceu2012_nazarwicz.pdf
APA
Nazarewicz, M. (2012, November). Contiguous Memory Allocator: Allocating Big Chunks of Physically Contiguous Memory. LinuxCon Europe. https://events.static.linuxfound.org/images/stories/pdf/lceu2012_nazarwicz.pdf
IEEE
M. Nazarewicz, “Contiguous Memory Allocator: Allocating Big Chunks of Physically Contiguous Memory,” Nov. 2012. [Online]. Available: https://events.static.linuxfound.org/images/stories/pdf/lceu2012_nazarwicz.pdf
LinuxCon / Embedded Linux Conference Europe 2012 is nearly over, and I had a pleasure of talking about the Contiguous Memory Allocator. Slides from the talk are available for download 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.
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:
This is an extended version of an LWN article on CMA. It contains more detail on how to use CMA and a lot of boring code samples.
Contiguous Memory Allocator (or CMA) has been developed to allow large 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 large memory chunks without a need to grab memory for exclusive use.
Simple in principle, it grew to be a quite complicated system which requires cooperation 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.
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:
Anyone working in a major company 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; not that I can see how that would help).
By the way, if you’re interested in how this challenge looks solved in Rust, I’ve described that as well.
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++.