[en] Fixing Ubuntu boot process after restoring tar backups to newly formatted disk (with UUID changed)

Mostly note to my self for futu­re reference.

What they don’t tell You in the tar bac­kup tuto­rial is that it’s not eno­ugh to edit /etc/fstab (and the­ir instruc­tions for grub are for grub-legacy).

Becau­se after resto­ring you pro­ba­bly have new par­ti­tion UUIDs, you must:

  • boot livecd
  • mount your root fs
  • mount -B /dev /rootfs/dev, etc. (with proc and sys at least) to be able to chro­ot from livecd to your root fs
  • chroot /rootfs
  • edit /etc/fstab and chan­ge UUIDs the­re (new ones you can get using blkid
  • do sudo dpkg-reconfigure -plow grub-pc to auto­ma­ti­cal­ly upgra­de grub con­fig files, just let it install to the drive(s) it was on
  • do update-initramfs -u so UUID sto­red insi­de ini­tramfs get upda­ted, too

Then you sho­uld be able to boot it.

[en] Fix PNG images dark in IE

IE can’t do any­thing right. If you save some gra­phi­cal ele­ments to PNG, and try to put them on an area with CSS-defi­ned color, the­re will be a dif­fe­ren­ce even if you used the same color in the PNG — IE ren­ders PNGs dar­ker than it sho­uld. The reason for this is misin­ter­pre­ta­tion of gAMA fra­me saved in PNGs that makes it possi­ble to bet­ter color-match pic­tu­res. The fix is to remo­ve this fra­me, and doing it on Ubun­tu is as easy as:

aptitude install pngcrush
cd your-graphics-directory
mkdir fixed
find . -type f -exec pngcrush -d fixed -rem cHRM -rem gAMA -rem iCCP -rem sRGB {} \;

Now you have a „fixed” direc­to­ry whe­re you have PNGs that will work pro­per­ly in IE (and are a bit smal­ler which is a nice side effect). If you’re sure they­’re ok, just do

mv fixed/* ./
rmdir fixed

Tha­t’s all.

[en] Fix irregularity of Java Timer and ScheduledThreadPoolExecutor

Using Java Timer class one can sche­du­le a task for recur­ring exe­cu­tion. Even tho­ugh Sche­du­led­Th­re­ad­Po­olE­xe­cu­tor makes it possi­ble to cre­ate timers with nano­se­cond reso­lu­tion (but bewa­re of under­ly­ing ope­ra­ting sys­tem clock pre­ci­sion!), regu­la­ri­ty of task exe­cu­tion is by default awful.

I have run into this once and had to expla­in the custo­mer that it’s not fixa­ble. When I measu­red the delay betwe­en timer exe­cu­tions, etc. it tur­ned out that doing as much as new Thread(runnable).start() usu­al­ly takes 1 – 5 mil­li­se­conds, but at times it takes two orders of magni­tu­de lon­ger: even half a second!

Same custo­mer, other pro­ject and this time I tho­ught of a reason for this beha­vio­ur: gar­ba­ge col­lec­tion. I star­ted with cal­ling System.gc() expli­ci­tly insi­de measu­red code and it takes 200 – 500 mil­li­se­conds! So it must be it.

Is the­re a solu­tion? Of cour­se the­re is. It’s cal­led The Con­cur­rent Low Pau­se Col­lec­tor and has been in Java sin­ce ver­sion 5. Read the lin­ked artic­le for many, many deta­ils, but shor­tly just add:

-XX:+UseConcMarkSweepGC

to the usu­al java ‑jar com­mand and the gar­ba­ge col­lec­tion will be done in paral­lel with your code exe­cu­tion. Of cour­se it’s no gol­den bul­let, it makes ove­rall per­for­man­ce wor­se (now inste­ad of 1 – 5 mil­li­se­conds, a sin­gle loop pass takes 4 – 10 mil­li­se­conds), but for this par­ti­cu­lar use, it makes Timer regu­la­ri­ty bet­ter by two orders of magnitude.