úterý 26. března 2019

Testing nonexistence in etcd v3+

In a project I use etcd as a persistent store of state information of the system. etcd is a great piece of software and suits my needs. Till today I tried to determin, how to code a transaction condition to test non existence.

Nothing is mentioned in the doc.

And it is suprisingly easy.

Just test version of the key/val. For nonexisting key it evaluates as equals to zero.

If you want to do a transaction testing existence of one key and non existence of the other you can use following  transaction:


#!/bin/sh

etcdctl del --prefix test-

etcdctl put test-xxx "ahoj"
etcdctl del test-yyy "lidi"

etcdctl txn -i <<__eof test-xxx="" ver=""> "0"
ver("test-yyy") = "0" 

put test-success yeah

put test-failure nay

__EOF

etcdctl get --prefix test-

neděle 4. listopadu 2018

Nginx Proxy With lets encrypt using Docker compose

I invested some work in managing my little hosted server more efficiently.
I use docker to run my services for a long time now. My budget for hosted machine is too small to start even single node Kubernetes which is my preferred way to manage containers. I ended up in using docker compose.

There is a little drawback in using compose. Every compose file creates it's own network by default and for my scenario, when I use the single server to host multiple domains through nginx proxy container it did not work as expected.

When multiple compose configurations are started, each has its own config and by default each runs in separate network.

Here is a simple trick which will do it.

 Create dedicated network prior starting it all and connect all the compose configurations to this network by default instead letting the compose create a network per configuration.

I start my reverse proxy containers using following compose:

version: '2'

services:

  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "nginx-proxy-vhosts:/etc/nginx/vhost.d"
      - "nginx-proxy-html:/usr/share/nginx/html"
      - "/var/run/docker.sock:/tmp/docker.sock:ro"
      - "nginx-proxy-certs:/etc/nginx/certs"

  letsencrypt-nginx-proxy-companion:
    image: jrcs/letsencrypt-nginx-proxy-companion
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    volumes_from:
      - "nginx-proxy"

volumes:
  nginx-proxy-vhosts:
  nginx-proxy-html:
  nginx-proxy-certs:
 

networks:
   default:
     external:
        name: proxy      


The last lines starting with networks will do it.

If you want to expose the service through this proxy, add the same section at the end of compose file. Eg:

version: '2'

services:
  some.service.name:
    image: php:apache
    environment:
      VIRTUAL_HOST: your.own.domain
      LETSENCRYPT_HOST:
your.own.domain
      LETSENCRYPT_EMAIL: your.own@email.xxx
    volumes:
      - "./html:/var/www/html"

networks:
  default:
    external:
      name: proxy





And that is all ... for today

úterý 2. ledna 2018

IOTA IRI remote authentication

When installing IOT IRI atm you can start it with authentication enabled. As the IRI developers really like trytes and trits and their home made curl hash (which by the way was proved a bit broken), the authentication uses the curl  for hashing the password. No documentation for this feature so some code digging was necessary to find the answer on how to configure remote authentication.

The configuration option can look like this:
  • in iri.ini
    REMOTE_AUTH =iota:DRDR...SRCJ
  • in command line arguments
    --remote-auth iota: DRDR...SRCJ
Above config means when prompted for password, you enter username "iota" and password "password".

To generate passwor hash use following script:

const Curl=require("iota.lib.js/lib/crypto/curl/curl.js")
const a2t=require("iota.lib.js/lib/utils/asciiToTrytes.js")
const conv=require("iota.lib.js/lib/crypto/converter/converter.js")
const IOTA=require("iota.lib.js")

let password=process.argv[2]
if ( ! password ) {
console.log("Usage: node hash-password.js ascii-password-to-hash")
process.exit(1)
}
let pwdTrytes = a2t.toTrytes(password)
let pwdTrits = conv.trits(pwdTrytes)
let curl=new Curl()
curl.initialize()
curl.absorb(pwdTrits, 0, pwdTrits.length)
let out=[]
curl.squeeze(out, 0, Curl.HASH_LENGTH)
console.log(conv.trytes(out))


This example is part of iota-experiments.







úterý 8. srpna 2017

Konverze S-JTSK (Křovák) do WSG84 (GSM) pomocí PROJ4.JS

Ač nejsem odborníkem, přes kartografii, projekce, občas mám potřebu konvertovat souřadnice dostupné od ČÚZK např. v rámci výměnného referenčního formátu exportovaného z RÚIAN. Dlouho jsem hledal nástroj, který by byl dobře dostupný s mými znalostmi a hlavně, který bych mohl zařadit do vlastních konverzních rutin. Cčková knihovna PROJ.4 je pro mě příliš komplikovaná pro moje občasné hrátky. Začal jsem tedy příkazovou řádkou konkrétně příkazem cs2cs a při nedávné další iteraci konvertoru jsem narazil na dlouho hledané.

Existuje port PROJ.4  projektu jako nativní javascript knihovna pro node.js - proj4.js.

Použití pro převod mezi systémy zmíněnými v titulku (S-JSTK do WSG84) je triviální.

Instalujeme modul:
npm install --save proj4

importujeme knihovnu
const proj4 = require('proj4')
definujeme projekce
proj4.defs("EPSG:4326","+proj=longlat +datum=WGS84 +no_defs");
proj4.defs("EPSG:5514","+proj=krovak +lat_0=49.5 +lon_0=24.83333333333333 +alpha=30.28813972222222 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +towgs84=589,76,480,0,0,0,0 +units=m +no_defs");



a provedeme vlastní konverzi podle potřeby:
console.log(proj4("EPSG:5514","EPSG:4326",[-710056.96,-1116931.88]));

a kupupříkladu pro indexaci v Elasticsearch 

let gps=proj4("EPSG:5514","EPSG:4326",[-710056.96,-1116931.88])
let data={
   location: {
        lat:gps[1],
        lon:gps[0]

   }
 


sobota 14. května 2016

dash cam to timelapse

My dash cam produces AVI video file every 5 minutes. I decided to create timelapse from the videos on linux using ffmpeg. Following the inspiration
I created following script

for f in *.AVI; do echo "file $f" >> files.txt; done 

[a file called "files.txt" is created] 

#create scaled timelapse 
ffmpeg -f concat -i files.txt -an -vcodec libx264 -filter:v 'setpts=0.05*PTS,scale=640:480' dashcam.mov

Happlink (formerly Plug-Up) Security KEY on Fedora 23

After several hours I managd to get Plug-Up SecureKEY U2F token working on Fedora 23. Some Ubuntu ubased advisory recommends to add an udev rule in a form of [not working]:

SUBSYSTEM=="usb", ATTRS{idVendor}=="2581", ATTRS{idProduct}=="f1d0", MODE="0660", GROUP="[the right  group user is member of]"  

After many minutes of google-fu I managed to get it working. The magic spell is this:

# Happlink (formerly Plug-Up) Security KEY
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="2581", ATTRS{idProduct}=="f1d0", TAG+="uaccess"


and the spell should be written into /etc/udev/rules.d/10-sec-key.rules

then run udevadm trigger


Sources:

http://www.ha-obsession.net/2016/04/fedora-23-kde-using-gpg-yubikey4-pcscd.html

http://askubuntu.com/questions/674064/happlink-plug-up-fido-u2f-security-key-why-it-doesnt-work-immediately-in-ubuntu


neděle 29. listopadu 2015

Print images on POS printer

For some unimportant reason I have mini thermal bluetooth printer IMP006A (ordered from alibaba.com). It is reliable piece of HW which I spent some time playing with.

Here you can see the result. Except receipts the printer can be used to print images. Here I share the piece of java code that does the magic.

The image to be printed must be in PBM format max. 373 px width. During the printing process the image is rotated 90 degrees clockwise.

You can use ImageMagick convert utility to prepare the image for printing.

convert  saturn.png \
        -rotate -90 \
        -scale x373  \
        -dither FloydSteinberg \
        -colors 2 \
         image.pbm

Where saturn.png is the input image of any kind ImageMagick can read. 
image.pbm is the resulting pbm image ready to be printed. 

The image is 
  • saturn.png - read from a file
  • -rotate -90 - rotated 90 degrees CCW
  • -scale x373 - scaled to full width of paper
  • - dither ... -colors 2 - color are reduced to 2 (BW) using dithering to render shades of gray on BW device
  • image.pbm - converson result is written to a file
Then if you have the code compiled just run:

java  printqr.PrintQR  image.pbm

And you will get image.prn containg a set of commands for the printer to print the image. Use linux command line to send the data to the printer.

Use USB to connect the printer to Linux box. When connected to linux box with recent distro (tested on Fedora 20), the printer will be accessible as /dev/usb/lp0. By default the device is accessible for root (and lp group members) only. Send the data to the printer usinf gollowing command:

sudo sh -c 'cat image.prn > /dev/usb.lp0'

And that's all. 

For illustration (click to enlarge):



Code:


package printqr;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Random;

/** Maximum image printed width (input height - the image is rotated) should be 373 px
  *
  * To prepare image for printing:
  * convert saturn.png  -rotate -90 -scale x373 -dither FloydSteinberg -colors 2 image.pbm
  *  or
  * convert saturn.png   -rotate -90 -scale x373 -dither Riemersma -colors 2 image.pbm
  *
  *
 * */

public class PrintQR {
    final static int[] wsChars=new int[] {' ','\n','\t'};
   
    public static void main(String[] args){
        FileInputStream fis=null;
        FileOutputStream fos=null;
        try {
           
            //prepare image name
            String inputImage="image.pbm";
            if (args.length>0)
                inputImage=args[0];
           
            if (! inputImage.endsWith(".pbm"))
                throw new IllegalArgumentException("Input image must be NetBPM PBM format with .pbm extension.");
           
            //open and read image
            fis=new FileInputStream(inputImage);
            //read header
            expectChar(fis,'P');           
            expectChar(fis,'4');
            expectWhitespace(fis);
            int width=readDecimal(fis);
            int height=readDecimal(fis);
           
            //read data
            int rowWidthBytes= width%8 == 0 ? width / 8 : width / 8 +1 ;
            int dataLength=rowWidthBytes*height;
            byte[] data=new byte[dataLength];
            int off=0;
            int remaining=dataLength;
            while (remaining>0){
                int cnt=fis.read(data, off, remaining);
                remaining-=cnt;
                off+=cnt;
            }
           
            System.out.printf("Loaded image %d x %d\n", width, height);
           
            fos=new FileOutputStream(inputImage.replace(".pbm", ".prn"));
           
            //reset printer
            fos.write(new byte[]{0x1b,0x40});
           
            //set linespacing 0
            fos.write(new byte[]{0x1b,0x33,0x00});
           
            //print image
            printBitmap24pinDoubleDensity(width, height, data, fos);
           
        }
        catch (Exception e){
            e.printStackTrace();
        }
        finally {
            if (fos!=null) try {fos.close();}catch (Exception e){};
            if (fis!=null) try {fos.close();}catch (Exception e){};
        }
    }

    /**
     * Sends image to the printer in the right format with the right commands
     * @param width
     * @param height
     * @param data
     * @param fos
     * @throws IOException
     */
    private static void printBitmap24pinDoubleDensity(int width, int height, byte[] data,
            FileOutputStream fos) throws IOException {
        int bWidth=width%8 == 0 ? width / 8 : width / 8 +1;
        int hLow=(height) & 0x000000ff;
        int hHigh= ( (height) >> 8 )& 0x000000ff;
       
        for (int x=0; x< bWidth; x+=3){
            // ESC * m nL nH d1... dk
            // m - 0x21 for 24 pin printer double density
            // nL/nH - low/high byte of number of "strokes", each stroke consists of 24 dots (8 bytes)
            // data should be (nL+nH*256)*3 bytes
            fos.write(new byte[]{0x1b,0x2a,0x21,(byte)hLow,(byte)hHigh});
           
            //get appropriate data from image - for the operation concider image rotated 90 deg CCW
            for (int y=height-1; y>=0; y--){
                fos.write(new byte[]{
                        get(data,x,y,bWidth, height),
                        get(data,x+1,y,bWidth, height),
                        get(data,x+2,y,bWidth, height),
                });
            }
            fos.write('\n');
        }
    }
   
    /**
     * Extracts byte of image data - the image is like this in mempory 
     *  ----------------X----------------------->
     * |          0        1        2        3        4        5
     * | 0 ........ ........ ........ ........ ........ ........
     * | 1 ........ ........ ........ ........ ........ ........
     * | 2 ........ ........ .####### ######## ........ ........
     * Y 3 ........ ........ .####### ####.... ........ ........
     * | 4 ........ ........ .######. ........ ........ ........
     * | 5 ........ ........ .#...... ........ ........ ........
     * | 6 ........ ........ .#...... ........ ........ ........
     * V 7 #.#.#.#. .#.#.#.# ....#... ........ ........ ........
     *
     * First triplet sent to printer is
     * this [0,7],[1,7],[2,7]
     * then [0,6],[1,6],[2,6]
     * then [0,5],[1,5],[2,5]
     * and so on
     *
     * This effectively rotates image CCW 90 deg.   
     *
     * @param data
     * @param x
     * @param y
     * @param bWidth
     * @param height
     * @return
     */
    public static byte get(byte[] data, int x, int y, int bWidth, int height){
        if( x>= bWidth ) return 0; //handle request beyond image for images not %24 print height
        int idx=y*bWidth+x;
        if (idx<0 || idx>=data.length)
            return 0;
        return data[idx];
    }
   
    public static int expectChar(InputStream is, int expectedChar)
        throws IOException
    {
        int readChar=is.read();
        if (readChar==expectedChar) return readChar;
       
        throw
            new IllegalStateException(String.format("Expected %c found %c",expectedChar, readChar));
    }
   
    public static int expectWhitespace(InputStream is)
            throws IOException
    {
        int readChar=is.read();
        if (isWhitespace(readChar)) return readChar;
        throw
            new IllegalStateException(String.format("Expected whitecpace found %c",readChar));
    }
   
    public static int readDecimal(InputStream is)
        throws IOException
    {
        int accumulator=0;
        while (true){
            int c=is.read();
            if (isWhitespace(c)) return accumulator;
            else
                if (c>='0' && c<='9') accumulator=accumulator*10+(c-'0');
                else
                    throw
                        new IllegalStateException(String.format("Expected digit or whitecpace found %c",c));
        }       
    }
   
    public static boolean isWhitespace(int c){
        for (int i=0; i<wsChars.length; i++){
            if (c==wsChars[i]) return true;
        }
        return false;
    }


    /** not tested */
    private static void printBitmap9pin(int width, int height, byte[] data,
            FileOutputStream fos) throws IOException {
        int bWidth=width%8 == 0 ? width / 8 : width / 8 +1;
        int hLow=height & 0x000000ff;
        int hHigh= ( height >> 8 )& 0x000000ff;
       
        for (int x=0; x< bWidth; x++){
            fos.write(new byte[]{0x1b,0x2a,0x00,(byte)hLow,(byte)hHigh});
            for (int y=height-1; y>=0; y--){
                fos.write(get(data,x,y,bWidth, height));
            }
            fos.write('\n');
        }
    }

    /** not tested */
    private static void printBitmap9pinDoubleDensity(int width, int height, byte[] data,
            FileOutputStream fos) throws IOException {
        int bWidth=width%8 == 0 ? width / 8 : width / 8 +1;
        int hLow=height & 0x000000ff;
        int hHigh= ( height >> 8 )& 0x000000ff;
       
        for (int x=0; x< bWidth; x++){
            fos.write(new byte[]{0x1b,0x2a,0x01,(byte)hLow,(byte)hHigh});
            for (int y=height-1; y>=0; y--){
                fos.write(get(data,x,y,bWidth, height));
            }
            fos.write('\n');
        }
    }
}








Licence Creative Commons
Graphical printing tool for POS printer, jehož autorem je LRA, podléhá licenci Creative Commons Uveďte původ-Zachovejte licenci 4.0 Mezinárodní .

čtvrtek 26. února 2015

.. on a trip to the C world again

Testing lua embedding and mongoose http server.
Lua is great to implement business logic in the C based app.
It lets you bee less woried about memory leaks, stack overruns, invalid pointer etc.

úterý 24. února 2015

online collaboration in realtime

Some projects for online collaboration:
http://etherpad.org/ - realtime colaboration for text editing
http://socket.io/  - bidirectional realtime communication platform
http://XMPP.org - realtime presence & message protocol

středa 18. února 2015

Tune SSL on Apache 2.4/Windows

Today I spent some time to tune Apache SSL settings to be Grade A at https://www.ssllabs.com/ssltest/.
Finding the equilibrium point between compatibility and transport security took some time. To save yours, I'm sharing the final configuration here.

Some notes at first. I favored security over backward compatibility and so some older (very old in fact) browsers will fail to establish connection. I tried to cope with all failed tests, but not succseeded. There stil are some Failed tests. Those tests are not affecting the main purpose of the server.

  1. Download and install the latest Apache 2.4 binaries to overcome known CVE
  2. I'm using http://www.startssl.com/ as the server certification authority.
  3. Tune SSL Protocol and Ciphersuites and some others at a server level (httpd.conf)
    1. SSLProtocol all -SSLv2 -SSLv3
    2. SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH EDH+aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS"
    3. SSLHonorCipherOrder on
    4. SSLUseStapling On
    5. SSLStaplingCache shmcb:logs/ssl_stapling(32768)
  4. Add HTTP Strict Transport Security
    1. Enable headers module: 
      1. LoadModule headers_module modules/mod_headers.so
         
    2. Set header to require HSTS at the VirtualHost level
      1. Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
And you are done.


pátek 13. února 2015

... DIY electronics

From time to time I learn about new DIY electronic project. Here I will sumarize all of them in a short notice:

littleBits

Creations are constructed by placing bits&pieces together glued by magnetic force and connected by contacts. Cloud enabled.
SmartHome Kit - $249 per 14 modules -  $17/module.

SAM

Standalone bits equiped with bluetooth low energy connectivity connected by SW configuration. Battery in a module lasts from 3 weeks of operation (button) to 1 hour (motor). MicroUSB charger.
Cloud enabled.
SAM Pro  - GBP 349 per 11 modules -  GBP31/module



úterý 13. ledna 2015

... backup with Areca

I'm giving try to Areca backup tool which seems as a good multiplatform (Java) tool for simple backup tasks on a workstation and small server.
It is featuring pretty usable GUI and command line interface for common backup tasks.



pondělí 6. října 2014

... and another Apache httpd story ... client authentication of proxied requests

Centos/RHEL 6.3, apache httpd 2.2.15
The goal is - let te httpd listens at port 80 plain unencrypted HTTP requests. The request will be forwared  to https://some.site/ where there is a HTTPS with client authentication.

Findings:

Client certificate key/cert file format (directive SSLProxyMachineCertificateFile):
  • key + certificate need to be in single PEM file looking something like
    -----BEGIN RSA PRIVATE KEY-----
    MIIE...
    ...
    ...
    ...
    -----END RSA PRIVATE KEY-----
    -----BEGIN CERTIFICATE-----
    MII...

    ...
    .,
    ...
    -----END CERTIFICATE-----
  • mind the RSA part (emphasized above)  of private key header - some openssl versions use the header with and some without the RSA letters
  • without RSA
  • my version of apache httpd wants it there
Re-negotioation at the server side is not supported. The server should be configured to protect every request with client auth. To avoid TLS renegotiation when entering protected resource, SSLClientVerify should be configured at VirtualHost level or server level.

After above changes were made server started and operated as expected.

References:
http://apache-http-server.18135.x6.nabble.com/Apache-fails-to-start-if-SSLProxyMachineCertificateFile-does-not-contain-RSA-td5009238.html


pondělí 29. září 2014

Apache httpd 2.4.6 hangs not servicing HTTPS

A lot of pain ... till solution found
# Apparently this fixes an issue with Apache 2.4.6 on Windows hanging
# when serving requests from Internet Explorer 10/11.
# see http://stijndewitt.wordpress.com/2014/01/10/apache-hangs-ie11/
AcceptFilter http none
AcceptFilter https none



neděle 7. září 2014

... Google Authenticator or Doogee DG800 strange error

After purchasing new chinese Android phone I needed to install Google Authenticator. But had no luck. The application worked fine but ... generated codes did not work. I tried other phones and came to a strange conclusion. The other Doogee DG800 I had show she same codes. Bud all other Android phones shown different codes. For sure all the phones shared the same secret.  The strange thing was the codes were different in some digits only. Typical difference looked like this 605678 - 604356.

As the authenticator codes are derived using hash function (RFC 6238 - TOTP), in case of an error there should be completely different results.

Fortunately - authenticator is an open source software. I cloned the repository and built my own version for debugging.

And here is the source of difference. During the computation a piece of a hash value is taken, converted to integer and then divided by a power of 10 and the remainder is the code:

int code =  truncatedHas % (int)Math.pow(10, codeLength);

On the problematic phone the result of power computation was this:
 Math.pow(10, codeLength): 999999,99999999

After cast to integer the result was 999999.

This is the answer - wrong result from system runtime library because the Math.pow function computes doubles which can be not so precise.

It is rare but it happens.

I'm going to  send a patch which does not uses double computation.

UPDATE: Issue was discussed at Stack Overflow. The main cause is a bug in the phone platform library.

úterý 26. srpna 2014

... firefox 30+ disabled NTLMv1 over insecure connection

NTLMv1 is known to be insecure but if you need it new setting was introduced:
network.negotiate-auth.allow-insecure-ntlm-v1 - defaults to false and NTLMv1 auth request is silently ignored when sent over HTTP. Set it to true to force NTLMv1authentication prompt.

Disclaimer: NTLMv1 over HTTP is considered insecure - you should know what are you doing

pátek 22. srpna 2014

... nssm - non sucking service manager

Seems really usable - new to me.
Why I like it ... it is able to start any command as a service and has several options for service shutdown (Send Ctrl-C, send WM_CLOSE,kill process)

http://nssm.cc/usage


úterý 20. května 2014

Chrome native messaging on windows

Problem:
When developing extension using native messaging you need to develop so called native messaging host - exe which is registered with chrome and  spawned by chrome when requested by the extension.
Chrome uses pipes to communicate with the host. The pipe is connected to stdin/stdout descriptors in the host process.
There is a drawback on windows - default stdin mode is TEXT. But in this mode once 0x1A is passed through, the C library closes the pipe and the host is terminated because 0x1A id end of file marker.

Solution:
Before reading attempt from the pipe set the mode to binary (defaults to text) using following code snippet:

_setmode( _fileno( stdin ), _O_BINARY )

Reference: http://msdn.microsoft.com/cs-cz/library/tw4k6df8.aspx

čtvrtek 10. dubna 2014

Convert SSH public key to a form for .authorized_hosts

Evary time i need this command it takes me minutes to retrieve the right form from my memory. Let's take a note :)

ssh-keygen -i -f pem -f ~/.ssh/id_rsa.pub

neděle 23. března 2014

Error 'LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt - Solved

No Visual Studio 2012 installed just SP1 of Visual Studio 2010.

Found this (no solution, but direction): http://stackoverflow.com/questions/10888391/error-link-fatal-error-lnk1123-failure-during-conversion-to-coff-file-inval

But it did not help.

Found this(almost solusion): http://social.msdn.microsoft.com/Forums/vstudio/en-US/d10adba0-e082-494a-bb16-2bfc039faa80/vs2012-rc-installation-breaks-vs2010-c-projects?forum=vssetup

It pointed me to the root cause - bad version od cvtres.exe which depends on missing msvcr100_clr0400.dll.

Solution: downloaded http://www.dll-files.com/dllindex/dll-files.shtml?msvcr100_clr0400

I downloaded the right version (32bit) of the file and stored it next to cvtres.exe and BINGO!!! compiling with no error.

Sahme on MS ... and shame on MS problem resolution culture. Searching the root cause is seldom seen. Uninstall/Reinstall is the only advice in most of dicussions.
 

 

neděle 8. září 2013

... chromcast like experience on smart tv

No dongle is needed to experience chromcast on SmartTV. In my case LG brand. The youtube app on the TV sucks. It's slow realllyyy sllooow. It's hard to use using only the tv remote. It's hard to use even using much better smart phone remote.       Now ... it is easy to send the youtube video from smart phone youtube app to she big screed of the smart tv.

Try it if you can!

pondělí 19. srpna 2013

... čajnafoun

... dorazil balík z dx.com obsahující telefon N6300. Cena podle kurzu Paypal 3814Kč ($184.60). Po připočtení služby České pošty v rámci celního řízení (180Kč, ale v balíku toho bylo víc, takže do ceny telefonu promítnuto jen částečně) a vyměřeného cla a DPH je reálná nákupní cena 4780Kč.

Telefon dorazil se dvěma kryty - jeden klasický "tenký" - jen zadní kryt. Druhý je pro "tlustší" variantu s větší baterkou a zkládá se ze zadního krytu a z přiklápěčího krytu displeje.

Telefon dorazil se dvěma bateriemi - jedna 1800mAh pro použití s "tenkým" krytem a druhá 2500mAh pro použití s "tlustším" krytem.

Balení dále obsahuje sluchátka, čínský nabíjecí adaptér, USB kabel a již nalepený screen protector.

UPDATE: Nevýhoda čajnafounu se ukázala díky mé nešikovnosti. A teď se nesmějte, protože to bude smutný příběh. Čajnafoun mi spadl do polevky. Fakt. A konektorem napred. A od te doby ... spise nefunguje, nez funguje. Takze jsem musel rychle hledat nahradu. A našel jsem téměř shodně vybavený trochu menší Gigabyte Aku A1. A při nákupu mi nabídli pojistku proti pohromám za 500Kč příplatek. A protože jsem stejnou pojistku využil nedávno u telefonu dětí, kývnul jsem na ni. V případě pádu do polévky by mi ho opravili za drobnou spoluúčast.

čtvrtek 8. srpna 2013

Installing GlusterFS 3.4 on Fedora 19

I was trying to install GlusterFS on Fedora 19. There were some problems which I describe here.

At first ... disable SeLinux on every Gluster node by changing /etc/selinux/config and set entry SELINUX=disabled

Packages of GlusterFS are part of Fedora 19 repository. Installation is easy.
I used following command:

sudo yum install glusterfs glusterfs-api glusterfs-fuse \
   glusterfs-server glusterfs-geo-replication 

After the packages are installed glusterd service is started. To connect the cluster nodes following command need to be issued:

sudo gluster peer probe the-other-node-ip 

But the command failed:

peer probe: failed: Probe returned with unknown errno 10

After some research using resources mentioned bellow I found the source of the problem (as usually): the firewall. Fedora 19 (and 18 already) includes firewalld.

Thing twice before changing your firewall settings. As I use virtualization and host only networking, I moved my host-only interface to the trusted zone:

sudo firewall-cmd --permanent --zone=trusted --add-interface=p7p1
sudo firewall-cmd --permanent --zone=trusted --change-interface=p7p1
sudo systemctl restart firewalld.service

To verify interface move submit:
 
sudo firewall-cmd --zone=public --list-all
sudo firewall-cmd --zone=trusted --list-all



References:

středa 7. srpna 2013

Psycho v letním kině

Dnešní promítání Psycho v letním kině mělo neopakovatelnou atmosféru. Ve chvílích, kdy film graduje se zvedl vítr přicházející bouřky .... ve scéně s Normanovou matkou ve sklepě se plátno divoce vlnilo ve větru a umocňovalo tak atmosféru filmu. Těsně před koncem plátno poryvům větru neodolalo a padlo. Úplně poslední scény s detailním záběrem do tváře Normana jsme sledovali na stěně domu daleko za původním plátnem a obličej byl tudíž obří .... nádhera.

neděle 4. srpna 2013

Convert Windows 7 Professional SP1 image from VMWare Workstation 8 to VirtualBox

I tried to  convert Windows 7 Professional SP1 running as guest in VMWare Workstation 8 to Oracle VirtualBox. The suggested scenario is to use ovftool from VMWare distribution to create OVF machine and VMDK disk image.

At the VirtualBox side the scenario suggests to Import appliance. Unfortunatelly the process fails with message "Could not find a storage controller named 'SCSI Controller'."

After some research following steps lead to working Windows guest in VirtualBox based on exported VMWare image.

I created VirtualBox machine from scratch with all settings left with their default values except memory (enlarged to 1GB) and I attached existing VMDK disk image created with ovftool (see above). Windows guest boot failed in BSOD until the disk was attached using SAS controler with LsiLogic type.

neděle 7. července 2013

Convert XML to CSV example

Input CSV

 <?xml version="1.0" encoding="utf-8"?>  
 <detail id="1243">  
  <nazev>Praktický lékař pro dospělé</nazev>  
  <jmeno>MUDr. Nomen Omen</jmeno>  
  <adresa>Street 1/234, 18000 City 8</adresa>  
  <telefon>89879076</telefon>  
  <fax/>  
  <ico>8908078</ico>  
  <poradove-cislo>000</poradove-cislo>  
  <poradove-cislo-det-prac>000</poradove-cislo-det-prac>  
  <nazev-zrizovatele>Fyzická osoba</nazev-zrizovatele>  
  <druh-zz>320 Samost.ordinace prakt.lék.pro dospělé</druh-zz>  
  <email>nomen-omen@mailer.ru</email>  
  <www/>  
 </detail>  

XSLT template file - takes one parametr output-header - when true, header is output first, output is Tab separated, no escaping nor quoting is done

 <xsl:stylesheet version="1.0"  
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
  <xsl:output method="text" omit-xml-declaration="yes" indent="no"/>  
  <xsl:param name="output-header" value="false"/>  
  <xsl:template match="/">  
   <xsl:if test="$output-header='true'">  
    <xsl:value-of select="concat('id','&#x09;')"/>  
    <xsl:value-of select="concat('type','&#x09;')"/>  
    <xsl:value-of select="concat('nazev','&#x09;')"/>  
    <xsl:value-of select="concat('jmeno','&#x09;')"/>  
    <xsl:value-of select="concat('adresa','&#x09;')"/>  
    <xsl:value-of select="concat('telefon','&#x09;')"/>  
    <xsl:value-of select="concat('fax','&#x09;')"/>  
    <xsl:value-of select="concat('ico','&#x09;')"/>  
    <xsl:value-of select="concat('poradove-cislo','&#x09;')"/>  
    <xsl:value-of select="concat('poradove-cislo-det-prac','&#x09;')"/>  
    <xsl:value-of select="concat('nazev-zrizovatele','&#x09;')"/>  
    <xsl:value-of select="concat('druh-zz','&#x09;')"/>  
    <xsl:value-of select="concat('email','&#x09;')"/>  
    <xsl:value-of select="concat('www','')"/>  
    <xsl:text>  
 </xsl:text>  
   </xsl:if>  
   <xsl:for-each select="//detail">  
    <xsl:value-of select="concat(@id,'&#x09;')"/>  
    <xsl:value-of select="concat('detail','&#x09;')"/>  
    <xsl:value-of select="concat(nazev,'&#x09;')"/>  
    <xsl:value-of select="concat(jmeno,'&#x09;')"/>  
    <xsl:value-of select="concat(adresa,'&#x09;')"/>  
    <xsl:value-of select="concat(telefon,'&#x09;')"/>  
    <xsl:value-of select="concat(fax,'&#x09;')"/>  
    <xsl:value-of select="concat(ico,'&#x09;')"/>  
    <xsl:value-of select="concat(poradove-cislo,'&#x09;')"/>  
    <xsl:value-of select="concat(poradove-cislo-det-prac,'&#x09;')"/>  
    <xsl:value-of select="concat(nazev-zrizovatele,'&#x09;')"/>  
    <xsl:value-of select="concat(druh-zz,'&#x09;')"/>  
    <xsl:value-of select="concat(email,'&#x09;')"/>  
    <xsl:value-of select="concat(www,'')"/>  
    <xsl:text>  
 </xsl:text>  
   </xsl:for-each></xsl:template>  
 </xsl:stylesheet>  

Customization: use your own element names, template matching rule and whatever to process more complex XMLs. Keep the structure (spaces, line ends) of the  tailing <xsl:text> to get proper line ends at the right places.

pondělí 10. června 2013

Create independent distribution of certain cygwin utility

In some cases you can find some cygwin utility useful for windows and you don't want or can't fully install cygwin. There is a handy utility called cygcheck which you can use to extract information about  certain cygwin executable dependencies. You can use the information to create standalone distribution directory of the utility. Following command extracts xmllint utility into /tmp/distro with all dependant DLLs.

mkdir /tmp/distro && cygcheck $(which xmllint) | \
grep cygwin |sed -e "s/^ \\+//" | \
cygpath -f - | \
while read x; do cp -v $x /tmp/distro; done


pátek 18. ledna 2013

... a way out of Windows symlink permission hell

For some reasons we needed to create symlinks on a Windows fileshare. Our environment was symlink ready (Win7 & WinServer 2008R2 & SMB2 everywhere). We started to try ... it sometimes worked sometimes not. Sometimes we received "You do not have sufficient privilege to perform this operation". Frustrating.
Finally we managed to make it working. We can now create symlinks from our server app directly in a shared folder.

Prerequisites
  • Windows 7+ and Windows Server 2008 R2 + and SMB2 enabled

Fileserver setup
  • the user willing to create symlinks must be 
    • granted "Create symbolic link" privilege (use Local Security Policy tool on the server)
    • granted modify right for the folder containing the symlink
Client setup
  • the user willing to create symlinks must be granted "Create symbolic link" privilege (use Local Security Policy tool on the client)
  • the right to  create symlinks must not originate from Administrators group -> the right must be granted directly to the user or indirectly via a security group
  • the user should not be a member of the Administrators group or the Administrators group should not bring the Create symlink permission (UAC disables the permission when it comes from the Administrators group --- UAC is EVIL)
  • depending on the link type used, the client computer must be able to resolve symlinks of certain type
    • turn symlink evaluation on using command (enables all kind of symlinks)
      • fsutil behavior set symlinkevaluation L2L:1 L2R:1 R2L:1 R2R:1 
If everything goes well you should be able to invoke following command to create directory symlink:

mklink /d \\server1\links-are-here\this-is-a-link \\server2\data-are-here\this-is-a-link-target

sobota 15. prosince 2012

... relativita v praxi

V roce 2009 zemřelo v USA 33 800 lidí při dopravních nehodách (zdroj). V průměru ~93 mrtvých denně. Málokdy si jich někdo všimne.

čtvrtek 29. listopadu 2012

Zákony pro lidi

... konečně ... asi pozdě jsem našel ...  už nějaký čas fungují http://www.zakonyprolidi.cz
je smutné, že podobnou aplikaci nevytvořila státní správa, ale komerční organizace. 

úterý 31. července 2012

... a pak že nerostou ....

Nestyďte se zaslabší zrak, a klidně si kliknětě pro plnou velikost fotky.



pátek 25. května 2012

Windows ACL hell solution

Error message "Access denied" makes me crazy. Whenever I see this message unexpectedly on windows computer I know that next few minutes/hours will be painful.

Windows access rights apparatus is overcomplicated for most uses. When advanced settings are combined with inheritance. When playing with ACLs man gets easily at the edge madness.

After several tries things are getting worse and worse. You can end up with a folder you can't do anything with. No rights left to you even if you are member of the Administrators group.

Following three steps should help in most cases (There are rare cases it will not help connected mainly to inability in taking ownership). Being administrator is the only prerequisite.

Steps to survive ACL hell:
  1. Taking the ownership - As a member of Administrators group you have all the power to own anything (any object) on a local system. And when there is another owner you can seize the object at your will. 
    • takeown /F file-or-folder 
    • you can use /R to do it recursively 
  2. Reseting rights - After membership is taken it is possible to get rid of all explicitly assigned ACLs using.
    • icacls file-or-folder /reset /T
  1. Test effective rights - using file Properties tab Security button Advanced tab Effective permissions - you can test whatever user you want and get his or here effective permissions.

Good luck!

 

čtvrtek 24. května 2012

...obětování plechovým bohům

... dnes před desátou na Jižní spojce probíhal obřad obětování plechovým bohům. V kruhu alegorických vozů s modrými blikajícími světly uprostřed rozpáleného asfaltového pruhu ležela oběť. Nehybná v paprscích zářícího slunce s nákrčníkem. U oběti v nábožné úctě v pokleku několik ceremoniářů dohlíželo na obřad. V obětišti jakoby se čas zastavil. Od obětiště se táhla dlouhá řada účastníků. Někteří ukrytí uvnitř svých plechových bohů, někteří poblíž.

středa 28. března 2012

... dsquery needs to be elevated to query memberOf

Today after an hour of pain I have discovered weird beavior od dsquery command. I was trying to reproduce my yesterday work. Yesterday I queried users based on their membership using following filter in dsquery *.

(&(objectClass=inetOrgPerson)(memberOf=GROUPDN))

Yesterday it worked. Today .. no user is found. After a fair ammount of time I found a solution. Queires containing memberOf as part of the filter need to be executed inisde ELEVATED prompt.

Let me scream again .. UAC on the server is EVIL.

pátek 2. března 2012

Arduino Uno serial communication

Disclaimer: following procedure worked for me. Obviously there is no  guarantee that it will work for you but there is pretty high probability of success. Improper handling can damage or destroy the board but it is unlikely. 

Great little Arduino has one drawback for "production" operation. After (USB)serial port is connected from PC, the unit resets.

The feature is suitable for development - each serial connect enables upload of the code. But it is annoying during production when you may need to connect to your Arduino to collect data. There is a HW solution.

There is a RESET-EN trace on the board (see below - it is located in the green circle marked with RESET-EN label). When the RESET-EN trace is cut (see the red line below - be rough enough when cutting to be sure it is cut) the serial communication initiated resets are disabled. The trace can be soldered again in the future (see Arduino.cc section Automatic (software) reset for reference).



After the RESET-EN trace is cut PC can connect and disconnect the serial and Arduino does not reset. On Linux simple shell scripts can be used to collect the data. Attention - uploading the new code to the Arduino might be a little less comfortable. To upload the new code use the following procedure (i can't find the link of the site where I have discover this procedure):
  1. prepare the sketch in the Arduino IDE
  2. place the mouse pointer at the upload button on the screen
  3. press and hold reset button on the Arduino board 
  4. fix your eyes on RX LED on the Arduino board
  5. click the upload icon in the Arduino IDE
  6. look at the RX LED and after it flashes once release the reset button
  7. look at the Arduino IDE to whether upload was successfull
  8. when the upload fails don't worry and try again with a little different timing of reset button release
  9. it needs little practising but it definitely works for me
  10. ... be patient :-)     
Or you can use alternative approach :
  1. prepare the sketch in the Arduino IDE
  2. place the mouse pointer at the upload button on the screen
  3. look at the status bar of the Arduino IDE
  4. press upload button 
  5. "Compiling sketch ..." will be displayed in the status bar
  6. After several seconds it changes to "Uploading ..."
  7. Press reset on the Arduino board as soon as possible after "Uploading .." comes up
  8. keep practising and you will succsseed

At first the correct serial setup is needed. To setup serial port to be readable using shell utilities use:

stty -F dev/ttyXXX cs8 9600 raw

And then you can use basci text utils to process Arduino output. To read 5 lines from Arduino to a file use:

cat /dev/ttyXXX | head -n 5 > data.txt

And to write command to Arduino just:

echo -n CMD > /dev/ttyXXX

Good luck ...



čtvrtek 22. prosince 2011

... telepatie na venkove

Ve venkovské hromadné dopravě se setkávám s řidiči telepaty. Nastoupím do autobusu, požádám o lístek a řidič kouka. A já koukám. A řidič kouká a mlčí a čeká, až zaplatím. A já mlčím a koukám a čekám, až sedozvím, kolik mám zaplatit. Snaží se mi řidič sfělit cenu ponocí mimosmyslového vnímání? Pokud ano, fatálně zklamu. Potupen prokázanou neschopností přijmout myšlenkovou zprávu použiji nakonec zastaralou metodu založenou na hlasivkami řízené rozechvívání vzduchu a vyslovím otázku. Když platím částku spíše tušenou ze zabručení šoféra, připadám si, nepatřičně, porušuji místní zvyky - nutím řidič mluvit. Snad mi teď v době ánoc bude odpuštěno.

středa 21. prosince 2011

úterý 29. listopadu 2011

... LG Optimus 2x Gingebread - získání root

Návod pro získání root na LG Optimus 2x po upradu firmware na verzi Gingerbread najdete tady: http://forum.xda-developers.com/showthread.php?t=1327599
Odkazovaný balíček s utilitou obsahuje i verzi pro linux včetně příslušných skriptů.
Po vybalení stačí odpovídajícím souborům nastavit příznak spustitelného souboru a během chvilky máte root.

A ano, první krok se provádí tak, že se vyndá baterka a do telefonu BEZ BATERIE a se stisknutými OBĚMA tlačítky pro řízení hlasitosti zasune USB kabel připojený do počítače. Tlačítka držte stisknutá po celou dobu, kdy probíhá instalace recovery. Za těcho předpokladů se telefon začne počítači hlásit jako NVidia zařízení (v linuxu v lsusb a není třeba instalovat ovladače, na Win je potřeba nainstalovat přiložené ovladače) a je možné (ve Win po instalaci ovladače) provést nahrání recovery pomocí skritpu flash-recovery-int.sh (recovery pak pracuje s interní SD kartou). Instalace proběhne celkem rychle a vypíše zhruba toto:
Nvflash started
rcm version 0X20001
System Information:
   chip name: unknown
   chip id: 0x20 major: 1 minor: 3
   chip sku: 0xf
   chip uid: 0x0288420543801457
   macrovision: disabled
   hdcp: enabled
   sbk burned: false
   dk burned: false
   boot device: emmc
   operating mode: 3
   device config strap: 0
   device config fuse: 17
   sdram config strap: 0

downloading bootloader -- load address: 0x108000 entry point: 0x108000
sending file: fastboot.bin
/ 1024992/1024992 bytes sent
fastboot.bin sent successfully
waiting for bootloader to initialize
bootloader downloaded successfully
sending file: cwm-int.img
- 3672064/3672064 bytes sent
cwm-int.img sent successfully
Po instalaci vyčkejte cca 10 sekund (pro jistotu) a poté vytáhněte kabel z telefonu. Zkompletujte (baterie) a stiskněte tlačítko (pouze) snižování hlasitosti, držte stisknuté a přidejte stisk tlačítka pro zapnutí. Obě držte stisknutá, telefon se začne zapínat, objeví se logo LG a poté pod ním problikne haló. Teď je možné tlačítka uvolnit a telefon nastartuje v režimu ClockWorkMod recovery. Režim se ovládá pomocí tlačítek hlasitosti (pohyb kurzoru) a vypínacího tlačítka (potvzení výběru menu). Dále pak postupujte dle obvyklého postupu instalací SU ze zip souboru.

středa 2. listopadu 2011

Test typu osobnosti


Zkusil jsem test typu osobnosti  a pak jsem si přečetl, co jsem vlastně zač

Srdečně Váš

INTP


Mýty o introvertech

Zdroj: http://www.carlkingdom.com/10-myths-about-introverts
Překlad: na základě výstupu s google translatoru jsem jen lehce začistil (překladatel ze mě nikdy nebude)  

Mýtus č. 1 - introverti neradi mluví.
To není pravda. Introverti prostě nemluví, pokud nemají co říct. Nenávidí tlachání. Nechte introverta mluvit o něčem, co je zajímá, a nezavřou pusu celé dny.  

Mýtus č. 2 - introverti jsou plaší
Stydlivost nemá nic společného s tím, že někdo je introvert. Introverti se nemusí bát lidí. To, co potřebují, je důvod pro spolupráci. Nedruží se s lidmi jen proto, aby se družili. Pokud chcete mluvit s introvertem, prostě začněte mluvit. Buďte slušní.  

Mýtus č. 3 - introverti jsou hrubí.
Introverti často nevidí důvod pro chození kolem horké kaše a pro zbytečné zdvořilosti. Chtějí, aby každý byl přímý a upřímný. Bohužel, tento přístup není pro většinu lidí akceptovatelný, takže introverti cítí velký tlak, aby se vyrovnali s něčím, co je pro ně vyčerpávající.  

Mýtus č. 4 - introverti nemají rádi lidi.
Naopak, introverti si nesmírně váží těch několika přítel, které mají. Své blízké přátele mohou spočítat na jedné ruce. Pokud máte štěstí na introvert je váš kamarád, máte pravděpodobně věrného spojence na celý život. Jakmile si získáte jejich respekt jako opravdoví lidé, jste jejich.

Mýtus č. 5 - introverti se neradi pohybují na veřejnosti.
Nesmysl. Introverti prostě chodí ven jen na nezbytně nutnou dobu. Také se rádi vyhnou komplikacím, které jsou s pohybem na veřejnosti spojené. Potřebná data a zkušenosti, která potřebují, získají rychle a zbytečně se na veřejnosti nezdržují. Co nejrychleji se chtějí doistat domů, aby získané zpracovali a aby se dobili. Ve skutečnosti, je právě dobíjení pro introverty charakteristické a zásadní.  

Mýtus č. 6 - introverti vždy chtějí být sami.
Introverti jsou naprosto spokojeni s vlastními myšlenkami. Hodně přemýslejí. Sní s otevřenýma očima. Jsou rádi, když mají o čem přemýšlet, řešit hádanky. Ale mohou zůstat neuvěřitelně osamělí, pokud nemají s kým sdílet své objevy. Touží po opravdovém a upřímném spojení s jednou osobou najednou.  

Mýtus č. 7 - introverti jsou divní.
Introverti jsou často individualisty. Nejdou s davem. Raději jsou oceňování za nové způsoby, jak žít. Myslí sami za sebe a tak mají často problém s normami. Nedělají většinu rozhodnutí na základě toho, co je populární a módní.

Mýtus č. 8 - introverti jsou podivíni.
Introverti jsou lidé, kteří se v první řadě dívají dovnitř, věnovat zvláštní pozornostsvým vlastním myšlenkám a emocím. To neznamená, že nejsou schopni věnovat pozornost tomu, co se děje kolem nich, jen jejich vnitřní svět je pro ně mnohem více podnětný a obohacující.

Mýtus č. 9 - introverti nevědí, jak se uvolnit a bavit se.
Introverti typicky relaxují doma nebo v přírodě, a ne na frekventovaných veřejných místech. Introverti nevyhledávají vzrušení a adrenalin. Na příliš rušném místě, kde se hodně mluví a je hluk, uzavřou se. Jejich mozky jsou příliš citlivé na neurotransmitter zvaný dopamin. Introverti a extroverti mají odlišné dominantní nervové spoje. Stačí se podívat se nahoru.  

Mýtus 10 - introvert se může "napravit" a stát se extrovertem.
Svět bez introvertů by svět s spousty vědců, hudebníků, umělců, básníků, filmařů, lékařů, matematiků, spisovatelů a filozofů. Jak již bylo řečeno, stále existuje mnoho technik, extrovert se může naučit interakci s introverty. (Ano, obrátil tento vztah, abych ukázal, jak zkreslené je vnímání naší společnosti.) Introvert se nemůže "napravit", a zaslouží si úctu k jejich přirozenému temperamentu a příspěvku pro lidskou rasu. Ve skutečnosti jedna studie (Silverman, 1986) ukázala, že procento introverze se zvyšuje s IQ.

Pro introverty může být velmi destruktivní snaha zapřít sami sebe, aby zapadli do našeho světa, kde dominují extroverti. Stejně jako u jiných menšin, taková snaha může skončit nenávistí vůči sobě samému vycházející z rozdílnosti. Pokud si myslíte, že jste introvert, doporučuji vám prozkoumat toto téma a hledat další introverty pro porovnání. Není na introvertech, aby podléhali tlaku, aby se pokusili stát "normální". Extroverti by nás měli uznat a respektovat a také musíme respektovat sami sebe.

neděle 28. srpna 2011

... exporting windows protected private key

Yes, it is possible to export use private keys and machine private keys. Thanks to mimikatz tool it is easy.http://www.blogger.com/img/blank.gifhttp://www.bloghttp://www.blogger.com/img/blank.gifger.com/img/blank.gif
Just download mimikatz utility from http://www.gentilkiwi.com/outils-s44-t-mimikatz.htm (ZIP direct link).

After downloading extract content of the ZIP file. Run mimikatz utility and in the command prompt enter:

dumpkey /force /medium

All user and machine private keys will be exported in pfx file (password:mimikatz).

Enjoy!

... windows internals tools

A set of utilities I find useful to inspect Windows internals: http://www.nirsoft.net/

úterý 2. srpna 2011

... linux monitoring with nmon

When using my Linux desktop things sometimes turn bad. Disk spins, CPU maxed everything's so slow.
WTF is happening to my system?
A lot of utilities will give me an overview: top, htop, iotop etc.

nmon to rule them all, nmon to find them,
nmon to bring them all and in the darkness bind them

Nmon is a Swiss knife when you want to know what's happening under the hood of your PreCious ...

Nmon is also able to collect data for later processing.

středa 27. července 2011

... e-kniha ...poprvé legálně

... je to tak. Po mnoha knihách přečtených z piratských kopií jsem právě objednal první e-knihu. Abych z toho měl úplně dobrý pocit, představoval bych si cenu ještě o pár korun nižší, než je 160Kč. Kolem stovky třeba baťovských 99Kč by se mi líbilo.

Jelikož nakupuji na palmknihy.cz poprvé, ještě musím počkat, než mi přijde aktivační kód poštou. Ano tou papírovou. Prozatím mi jde stáhnout první třetina knihy.

Jsem zvědav, jestli za peníze bude lepší formátování, které je v případě pirátských eknih žalostné.

čtvrtek 21. července 2011

... ranní šálek zloby

Albert, akce, kola za půl darma. Asiat s plným košíkem "koly v akci". Pokladní s nelíčenou radostí posílá potenciálního platícího zákazníka do háje. Kolu si prý může koupit nejvýše po 12 kusech: "12 kusů na osobu, musíte to vyložit, tady to máte napsané na letáku" říká tónem, který nezastírá zášť. Zmatený muž s košíkem plným pet-lahví couvá prodírá se frontou zpět mezi regály. Mezi pokladními se rozvine debata na téma 'no co oni si myslí, nakoupí to tu za desetikorunu a pak to bude támhle za zatáčkou prodávat za pade, hrůza'. Soulad názoru napříč pokladnami a štamgasti ve frontě zachmuřeně pokyvují. Vlna podpory okolostojících a spolupracujících dodá pokladní sílu: "A stravenky taky neberem, jenom hotovost" křičí do vzdalujících se mužových zad s úšklebkem a nadšená svým totálním vítězstvím za mužem vyplázne jazyk. Debatu s kolegyněmi končí větou:"No ty vo'e maj to přece v tom letáku napsaný, ne?"

... přešla mě chuť na snídani částečně z toho jedu, co vyvrhla pokladní ze svých útrob a částečně proto, že jsem sice nepokyvoval, nemručel souhlasně, ale neřekl jsem ani slovo. ... srabe, zní mi v hlavě, když mi automat míchá kávu.

...exot

Chodím po Praze v pláštěnce. Já a lidé, co používají hůl. Kolemjdouci se otáčejí jen za mnou a me je sucho.

úterý 12. července 2011

...install Fedore 15 on Dell D630 - wifi

All installed in basic distro except the firmware. Firmware can be installed using following link:
http://flakrat.blogspot.com/2010/05/how-to-enable-broadcom-bcm4312-wifi-in.html

pondělí 11. července 2011

.. čtyři dohody

... v podání Jaroslava Duška úžasné

čtvrtek 7. července 2011

... Jeseníky a nevyzpytatelné počasí

Totéž místo (přečerpávací elektrárna Dlouhé Stráně horní nádrž) při dvou návštěvách:


pátek 1. července 2011

... realityshow

... konec pohody domácí kanceláře

Domácí kancelář je trend. Homeoffice ... Jsem trendy a v domácí kanceláři občas pracuji. Do včerejška byla klidnějším místem, než náš firemní openspace. Dneska to skončilo. Začaly totiž prázdniny. Děti okupují domácí zábavní centrum, občas se ozývá dunění hudby, občas dunění výbuchů v nějaké střílečce a když se nic neozývá, znervozním a mám nutkání se podívat, jakou že lumpárnu zase vymýšlejí. Příjemně překvapili. Žádná lupmárna. Zmizeli ven...

... dopolední pracovnědenní klid se ale do bytu vrátí zase až v září.

pátek 17. června 2011

... městská policie pomáhá

Bloudím po Střešovicích a jedna uzavírka za druhou mě mezi vilkami vedou téměř jistě úplně špatným směrem. Těch uzavírek z důvodu jakýchsi stavebních prací je asi víc, než se dá na prstech spočítat. Nakonec nalézám uličku, která vede "mým směrem". Jelikož jsem už v časové tísní, vjíždím do uličky i přesto, že vjezd zdobí značka "Průjezd zakázán".

Pomalu projíždím uličkou když v dálce zahlédnu zářící vesty policistů. Vím, že páchám přestupek. Přestupek z donucení. Zastavuji uprostřed ulice a parkuji. Vypnu motor a obejdu auto. Pak jedu dál a policista na konci ulice se na mě vrhá jako sup na mršinu.

Nepřekvapuje mě to a tak mám tentokrát odpověď nachystanou (nečekané situace). Chyba lávky. Dle předchozích mnoha setkání s policií jsem již připraven na standardní postup. Stahuji okénko a očekávám základní policajtskou frázi: "Dobrý den, pane řidiči, předložte ... atd.".
Policista se nakloní do okénka a tónem obvykle používaným ve vztahu dospělý/káraně dítě pronese: "A vy tady děláte co!?"

Takovou neomalenost a aroganci jsem nečekal a veškerá moje příprava je v háji. Bez dalšího jen procedím, že jsem byl támhle na návštěvě. To pro změnu vyvede z konceptu policistu (1:1). Stojí, kouká a až k mým uším doléhá rachocení myšlenkového soukolí, které se ztěžka vyrovnává s nečekanou situací. Jevil jsem se policistovi jako snadná kořist a najednou mu unikám mezi prsty. Složitý výpočet v policistově hlavě doběhl zdárně ke konci a vyhodnotil mě jako ztracený případ slovy: "Tak já vám to tedy budu pro dnešek věřit!".

Odjíždím a v zrcátku sleduji kolegy řidiče, kteří opravdu byli překvapeni a svůj dnešní boj prohráli. Mě v hlavě vězí všechny možné odpovědi a nakonec vítězí následující:
Policista: A vy tu děláte co!?
Já: Dobrý den, pane policisto, co pro vás mohu udělat?

Přemýšlím, zda morální hledisko převáží ručičku váhy spíše na stranu mou "únik oběti buzerace" nebo na stranu policie "únik vytáčejícího se grázla". Sám se samozřejmě stojím na své straně (kdo už také jiný). Průjezd celou čtvrtí je komplikovaný. Mnoho zavřených ulic a pro neznalého bludiště. Jaké měla policie možnosti situaci řešit? Dočasně změnit dopravní značení a po dobu uzavírek umožnit průjezd jednou z mála nerozkopaných ulic, vylepšit dopravní značení pro usnadnění průjezdu.

Místo toho pokutování na konci jedné z mála průjezdných ulic.

... kurz adekvatního jednání v nečekaných situacích

Mám problém. Když se vyskytne nečekaná situace, neumím reagovat. Mám teď na mysli především nečekané převážne verbální interakce s lidmi. Situace: n2kdo někde na mě nečekaně vybafne. Mě napadá miliarda trefných, vtipných, účinných a vubec cool odpovědí, jak daného člověka odpálkovat, pobavit, potěšit, naštvat. Problém je v tom, že ty odpovědi mě napadají v průběhu následujícího dne či dvou. V okamžiku, kdy je potřebuji, mám hlavu úplně vymetenou a většinou řeknu úplnou blbost a "lepším" případě se zakoktám.

Celá věc mi značně komplikuje mou životní roli prudiče a šťoury.

Ovšem o to víc šťourám se zpožděním.

... a kde všude nám letos maturovali

Lokality, kde se prováděla maturitní zkouška - dohledový systém maturitních digitalizačních pracovišť

neděle 12. června 2011

Spring Tool Suite 2.7.0M1 depencies problem in Grails project

After transfering my project from one computer to the other I have started with fresh STS installation. When I have tried to open my Grails project every grails command failed due to some strange class not found exception. I reviewed the project and found Grails Dependencies uninitialized. Even if I tried to Refresh Dependencies using Grails tools this command failed the same way as every previous.
After some more investigation I focused on my user profile Grails cache. When I compared the old project and the newly created one grails cache the directories were different.
I deleted the old project grails cache in my profile ($HOME/.grails/project-name) and invoked Refresh dependencies again. Finally it worked.

I hope this can help some of you. Happy grailing.

úterý 1. února 2011

... děkujeme odcházíme

Dnes odpočet na stránkách lékařské odborářské kampaně ukazuje 27 dnů do odchodu nemocničních lékařů z důvodu jejich platového nedocenění. Musím říci, že s lékaři do jisté míry sympatizuji. Forma protestu a zejména jeho načasování už se mi tolik nelíbí. Že v systému péče je cosi shnilé mi ukázala následující paradoxní situace.

Shell, Jižní spojka. Rádio hlásí, že ministr zdravotnictví právě přislíbil, že v systému veřejného zdravotního pojištění najde 2 miliardy korun na vylepšení platové situace lékařů. Vystupuji z auta a tankuji. Vedle mě zastaví krásné bílé BMW X6. Auto bratru za půldruhého milionu. Za oknem mělo cedulku: "LÉKAŘ". To jsou paradoxy.



Tak si říkám, jestli po zachrastění prasátkem zdravotnického systému bude BMW spíš smutnější, ale někteří mladí lékaři budou mít o klidnější spaní s hypoteční smlouvou pod polštářem, nebo jestli BMW zaplesá a mladé lékaře bude hypoteční smlouva tlačit ve spánku stejně jako dosud.

... tramvajový thriller

Po příjemném posezení s bývalými kolegy jsem se vracel domů noční tramvají. Příběh, který se mi v tramvaji odehrával před očima či lépe řečeno ušima, stojí za zaznamenání. V tramvaji samotné příjemně hřálo topení. Venku mrzlo, až praštělo. Na sedadle přes uličku seděl mladík. Sympatický avšak ve stavu, který měl do střízlivosti daleko. U ucha telefon a probíhala konverzace, z níž jsem mohl zaznamenat pouze jednu stranu:
"... a kde teda si káámo?"
"... jak nevíš? Tak najdi nějakou zastávku."
"... to je jedno, že to tam neznáš, já to taky neznám. Káámo, ja jsem se probudil na konečný a tramvaják mě vyhodil na mráz. Sídliště Řepy, káámo, konec světa."
"... no a na jaký jsi teda zastávce? ... co že? jaká dálnice?"
"... prostě najdi ňákou zastávku a řekni mi, kde seš a já pro tebe dojedu, kámo"
"... káámo ... slyšíš mě? kááámo !?"

Sbírá telefon, který mu upadl na zem a snaží se vytočit číslo, ale trvá mu to.

"... kámo .. si tam?"
"... no to teda je mráz kure*skej, snad 20 stupňů. Si dej ruce do kapes, kámo."
"... a zvládněš to? no to mi neřikej, že by te mohla rozložit jedna pražská zima, káámo, dej siruce do kapes, káámo"
"... kámo ? si oukej káámo?"
"... káámo ... tak najdi ňákou zastávku a přečti mi, kde seš."
"... no a nemáš na telefonu gepesku? ... nemáš si kupovat takový šmejdy, káámo"
"... jo? a jaká je to teda zastávka?"
"... no mě už neni zima, já sem v tramvaji, ale venku mrzne, kaamo, asi dvacet"
"... hej .. kámo ... slyšíš mě? ... slyšíš mě?
nějakou dobu mlčí, snaží se vytočit číslo .... dlouho se mu nedaří se dovolat
"... hej kámo si oukej? ...kámo "
"... já jsem v tramvaji, dojedu na Lazarskou, tam přesednu a pojedu na hlavák a pak vlakem domu, káámo"
"... no a v jakým čísle jedeš? ... "
vstává a rozhlíží se po vývěskách rozhlíží se a pak s ptá
".. prosimvas, co je tohle za tramvaj?"
"... já taky jedu 58 tak to jedeš dobře káámo"
uklidněn končí hovor a usedá a v zápětí usíná a tramvaj dojíždí na Lazarskou
mladík spokojeně spí ...
tramvaj dlouho stojí a čeká na rozjezd
mladík se probere .. a znovu bere telefon
"... no jo to už jsi na Andělu. Tak seď v tramvaji a dojeď na Lazarskou a pak už domu trefíš."
"... jo já jsem taky rád, že sem zase v civilizaci, sídliště řepy, taková prdel světa káámo a tramvaják mě tam vykop na konečný"
najednou se zarazí z rozhlédne
"prosimvás, co je tohle za zastávku"
dozvídá se, že Lazarská, vystřelí z tramvaje a jde hledat přestup
...
...
"... káámo to je kosa co?"
pronáší zase do telefonu, když najde svůj přestup a znovu se vrací do naší tramvaje a usedá
"... co rodina? na rodinu se vyprdni... co by mohli mít za řeči? prostě jsme slavili Vendovo mimino ..."
"... káámo .. a jsem na Václaváku, prádička, za chvilku sedím ve vlaku a za 20 minut jsem doma"

Tak snad našel ten správný vlak a jeho kamarád trefil domů Podle zpráv minulou noc nikdo v Praze nezmrzl. Zato Vendovo mimino bude zdravý jak řípa.

středa 26. ledna 2011

Můj osobní předčítač Android

Kolona. Auta se šnečím tempem posunují kupředu. Já sedím v jednom z nich. Možná si říkáte, že trpím. Očekáváte, že hladina adrenalinu stoupá kvůli stresu. Ještě nedávno byste měli pravdu. Čas je v dnešním světě příliš cenná komodita a nechat ho zbůhdarma utíkat mezi prsty jen kvůli nutnosti dopravit se z místa na místo a nepříjemné náhodě, kdy banální dopravní nehoda zastavila dopravní tepnu.
Vedle mě na sedadle leží kouzelná krabička. Mluvící kouzelná krabička. Příjemný ženský hlas mi předčítá zajímavou knihu. Čte bezvadně, srozumitelně, česky. Nemluví však skutečná žena. Hlas je syntetizovaný v krabičce a předčítá elektronickou knihu do krabičky nahranou. Tou krabičkou je telefon HTC Hero vybavený systémem Android (v mém případě froydvillain 1.7.2 tedy Android 2.2 Froyo). Základní službou OS Android je hlasová syntéza. Bohužel v základní verzi neumí česky (ukázka na konci článku). 
UPDATE 18.4.2017: Na Google Play je možné stánout aplikaci Google Text To Speech, která v aktuální verzi poprvé obsahuje podporu TTS v češtině zdarma.


Update  4.1.2017: SVOX se v posledních měsících ukazuje jako nespolehlivý zdroj, jazyky jdou i nadále kupovat, ale není možné stahnout jazyková data. Proto po nákupu okamžiťe zkontrolujte funkčnost a případně využijte možnost vrácení peněz. V tuto chvíli je ekvivalentním řešením nákup Hlas Vocalizer, kde je navíc možnost volby ze dvou hlasů.

Díky firmě SVOX a jejím mobilním řešením pro syntézu řeči je však možné Androida naučit česky mluvit během pár chvil. Pomocí Play obchodu do telefonu nainstalujte TTS engine (SVOX Classic TTS). V nastavení tohoto poskytovatele syntézy řeči aktivujte. Dále budete potřebovat český slovník pro syntézu hlasu, který si musíte koupit jako placenou aplikaci za necelé 3 dolary (a to se vyplatí, věřte mi).
Na SVOX mě navedl článek popisující instalaci tohoto TTS řešení.
UPDATE 9.1.2012:Alternativou SVOX může být řečový syntezátor Acapella
UPDATE 18.4.2017: Další placenou alternativou je Vocalizer 

Nyní už umí Android česky.

Aby mohl předčítat knihy, je ještě potřeba najít čtečku eknih s podporou hlasového výstupu. Ačkoli je čteček pro Androida mnoho, našel jsem pouze jedinou, http://www.blogger.com/img/blank.gifhttp://www.blogger.com/img/blank.gifhttp://www.blogger.com/img/blank.gifkterá umí předčítat tak, aby čtení bylo použitelné. Opět jde o program, který je třeba si koupit. Je jím Moon+ Reader Pro, přičemž právě Pro je důležité, protože v základní verzi čtečka neumí použít TTS. Tentokrát je cena necelých 5 dolarů (opět musím dodat "a to se vyplatí"). Za cenu necelých 8 dolarů (cca 160Kč) dostanete velmi kvalitní a funkční software.

UPDATE 28.3.2012: Nyní již několik dnů používám k předčítání CoolReader, který je zdarma a funguje skoro stejně dobře, jako výše zmiňovaný placený MoonReader.  Takže stačí zakoupit SVOX jazyk, CoolReader lze získat zdarma.

UPDATE 9.3.2014: A další kandidát na bezva čtečku s hlasovým výstupem. FBReader s FBReader TTS+ pluginem. To + na konci je důležité - výrobce Hyperionics a vše gratis.

Ne všechno je úplně dokonalé, existuje pár mušek. SVOX někdy dělá mezi větami příliš dlouhé pomlky. Při vypnutém displeji občas přestane číst (telefon usne?), ale to je možná způsobeno nastavením čtečky. Po ťuknutí na tlačítko rozsvěcející displej čtení pokračuje.

Po instalaci tohoto programového vybavení již můžete do telefonu nahrát svou první eknihu. Čtečka rozumí formátu epub. K jeho výrobě vám zajisté pomůže SW pro správu vaší eknihovny Calibre.

Bohužel dnes není prakticky možné zakoupit eknihu v češtině oficiálně. Když to jde (www.rajknih.cz) nutí vás prodejce využívat propritárních čteček vynucujících DRM a s Androidem jste nahraní o syntéze řeči ani nemluvě.

UPDATE 22.8.2014: Již  třetím rokem jsem spokojeným zákazníkem palmknihy.cz a někdy kosmas.cz
UPDATE 4.1.2017: Alza také není k zahození, mají většinu ebook nabídky.
No a pokud nestačí eknihy, ale občas je třeba nechat si přečíst webovou stránku, DOC, DOCX, PDF nebo kus textu z klipboardu telefonu, pak sáhnu po  Voice Aloud Read, který dokáže přečíst kde co. Stačí odpovídající text nasdílet do aplikace.

Přeji mnoho pěkných "čtenářských" zážitků.