Štítky

auta (18) běh (34) beskydy (13) brusle (34) cukroví (11) divadlo (1) DIY (2) filmy (17) golf (1) hory (37) IT (68) jednokolka (1) kola (109) kolce (10) koloběžky (4) koncert (4) koně (1) létání (20) lezení (22) literatura (8) lodě (2) lyže (130) motorky (61) osobni (1) osobní (102) plavání (4) posilování (2) potraviny (27) příroda (8) recenze (3) recepty (62) sauna (1) squash (3) tanec (3) telefony (19) turistika (60) USA (58) vlaky (4) vysocina (3) wakeboarding (1) závod (1) závody (84) ZLM (66)
Zobrazují se příspěvky se štítkemIT. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemIT. Zobrazit všechny příspěvky

čtvrtek 31. března 2022

Úspěšná záchrana dat z HDD Seagate Barracuda 7200.12, 500GB, ST3500413AS s controllerem 100535704 REV C

Poslat HDD do věčných lovišť nebylo nepřekvapivě vůbec těžké. Mnohem těžší bylo rozhodnutí komu svěřit záchranu nezálohovaných dat (snad mi pomůže výmluva, že disk nebyl můj). S vidinou vysokých nákladů na takovou operaci jsem se opět zcela nepřekvapivě rozhodl pro svépomocnou cestu, zvláště po posilnění docíleném zhlédnutím několika instruktážních videí na trubkách. S trochou štěstí nejde o raketovou vědu. To štěstí se dá dokonce kvalifikovat. Zkrátka pokud vám odešel HDD nikoliv po mechanické stránce, ale spíše následkem statické elektřiny a to tak, že to neodnesl jeden konkrétní integrovaný obvod (často nazýván BIOS disku), nemusí být cesta ke štěstí příliš trnitá. BTW soudě podle videí, inzerátů na eBay a mnoha webů jsem nabyl přesvědčení (nepopírám, že může být zcela mylné), že BIOS obvykle neodejde a vy že tak máte poměrně slušnou naději na úspěch.


Postup opravy demonstrovaný na disku Seagate Barracuda 7200.12, 500GB, ST3500413AS s controllerem 100535704 REV C:

  • zakupte totožný disk nebo disk totožné série s ideálně stejným controllerem, popř. zkuste dohledat, které verze/revize controlleru jsou zaměnitelné 
  • odmontujte controllery z obou disků
  • přepájejte BIOS z vadné desky controlleru na desku funkčního controlleru ze zakoupeného disku
  • namontujte controllery zpět (prohozeně)

Jak asi tušíte, existují jistá úskalí, např.:

  • dohledání nabídky prodeje hromady let starého disku
  • málokdo má v inzerátech nafocenou zadní stranu disku a ještě ve správném úhlu, aby byla čitelná verze controlleru
  • absence příslušného Torx bitu/šroubováku ve vašem nářadí
  • přepájení SMD IO (BIOSu) nemusí být úkol splnitelný trafopájkou po dědečkovi

Ve výsledku jsem měl typicky více štěstí než rozumu, po prolezení sto padesáti inzerátů, oslovení deseti lidí s prosbou o nafocení PCB jsem se dostal k mechanicky vadnému disku téže série byť o velikosti 160 GB, avšak se shodnou revizí controlleru. Po předchozích zkušenostech s opravou controlleru pračky a vysloužení si ocenění "největší prase s pájkou v ruce, které jsem spatřil od začátku střední školy" jsem povrchovou (de)montáž nechal na profíkovi, který na to potřeboval asi tak tři minuty a to se u toho stihl bezpochyby nasvačit a skouknout oblíbené video na internetu. Když už nic, tak jsem si aspoň PCB přimontoval zpět sám...  A přece se točí!

neděle 15. listopadu 2020

JPEG jména, tagy, chyby a nápravy

 Nalezení skenovaných fotografií, tj. těch které nemají rozumná časová razítka:

find ./ -maxdepth 2 -follow -type f -iname "*.jpg" -exec sh -c "exiv2 -pt {} | grep -q 'CanoScan 9000F' && echo {} >> list.txt"  \;


Nastavení časových razítek JPEG (Exif) na základě jmen adresářů:

for file_name in `cat list.txt`; do exiv2 -M"set Exif.Image.DateTime ${file_name:2:4}:${file_name:7:2}:${file_name:10:2} 12:00:00" -M"set Exif.Photo.DateTimeOriginal ${file_name:2:4}:${file_name:7:2}:${file_name:10:2} 12:00:00" $file_name; done 


V případě, že by časové razítko ve fotografiích bylo, ale nebylo zrovna správně, můžete ho lehce posunout, např. -25 let, -1 měsíc, -26 dní, +6 hodin, +40min 

for file_name in `cat list.txt`; do exiv2 -Y -25 -O -1 -D -26 -a 6:40 $file_name; done

A závěrečné přejmenování všech fotografií na základě časových razítek:

for file_name in `ls */*.[jJ][pP][gG]`; do [[ $file_name =~ [0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]_[0-9][0-9]-[0-9][0-9]-[0-9][0-9]_.* ]] || exiv2 -r '%Y-%m-%d_%H-%M-%S_:basename:' rename $file_name; done

Předpokládaná adresářová struktura:

photos/2020-10-11_turistika_karlova-studanka
photos/2020-10-12_turistika_karlova-studanka

úterý 26. září 2017

Nezapomínejte na "vystoupit a nastoupit" aneb Lenovo T430 bez zvuku na baterku (Windows 7)

Historické Lenovo T430 se stalo objektem, ve kterém jsem už poměrně dávno objevil jeden problém, po vypojení adaptéru přestalo přehrávat zvuk. Sice mě to naštvalo, to protože mám rád fungující věci, ale nějaká jiná činnost byla tehdy přednější, tak jsem nad tím mávl rukou. Zkrátka scénář "jedu na baterku a něco poslouchám" je u mě vzácný. Když se mi to stalo po druhé, tak jsem odhodlaně začal sjíždět Internet a hledat tento problém a jeho řešení dle co nejspecifičtěji zadané kombinace klíčových slov v domnění, že ThinkPad komunita je stále velice aktivní. Bohužel ve výsledku to znamenalo ztrátu desítek minut, možná pár hodin, aniž bych problém vyřešil, žádné z nabízených řešení nefungovalo, navíc symptomy často disponovaly nějakou drobnou odlišností.

Dnes se mi to stalo znovu. Znovu jsem tupě otevřel browser a zcela nečekaně a netypicky otevřel Microsoftí web, kde jsem nalezl několik rad, jak postupovat, upozorňuji jak postupovat v případě jakéhokoliv HW. Přirozeně se šlo od té nejtriviálnější rady v podobě kontroly vypnutého zařízení pro přehrávání zvuku... Potupně a postupně jsem zkoušel všechny rady a už druhá zafungovala - odeberte ovladač zvukové karty a restartujte počítač. Vlastně jde, po: "Zkoušeli jste to vypnout a znovu zapnout", o druhou základní implementaci metody "vystoupit a nastoupit". Zamrzelo mě, že jsem na takovou blbost nepřišel sám, hned, už dávno... Ale co, poučení pro příště, nepodceňovat ty nejjednodušší metody.


pátek 15. září 2017

Jak hromadně přejmenovat JPEG soubory, tak aby jejich jméno tvořil čas pořízení vyčtený z EXIFu


Proč? Aneb motivace...

Přijedete z dovolené a sejde se vám několik tisíc fotografií z různých zdrojů. Pokud jste zvyklí, tak jako já, procházet fotografie chronologicky a odmazávat nejvíce nepovedené, vyvstane před vámi úkol seřadit je dle data pořízení. Mnohdy se však stává, že čas vytvoření/modifikace souboru (rozuměj fotografie) obsahuje nějaký nesmysl, který vážně ani vzdáleně nekoreluje se skutečným časem pořízení. Jako nejlepší varianta se mi jeví využít čas z EXIFu, ale takto řadit JPEGy rozhodně neumí každý "editor" a hlavně to neumí ten můj. A proto jsem se rozhodl procházet fotografie seřazené dle názvu s tím, že každou fotografii přejmenuji dle času jejího pořízení a za něj nalepím původní název, to kvůli sekvencím fotografií, kterých typicky vznikne během jedné vteřiny několik a přinesly by tak nechtěné konflikty během přejmenování.

Jak na to? Linux/Cygwin + Bash + Exiv2


for file_name in `ls *.[jJ][pP][gG]`; do exiv2 -r '%Y-%m-%d_%H-%M-%S_:basename:' rename $file_name; done

Jak na to idempotentně? Linux/Cygwin + Bash + Exiv2

for file_name in `ls *.[jJ][pP][gG]`; do [[ $file_name =~ [0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]_[0-9][0-9]-[0-9][0-9]-[0-9][0-9]_.* ]] || exiv2 -r '%Y-%m-%d_%H-%M-%S_:basename:' rename $file_name; done


Jak na to idempotentně s přesunem do adresářů? Linux/Cygwin + Bash + Exiv2
for file_name in `ls *.[jJ][pP][gG]`; do [[ $file_name =~ [0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]_[0-9][0-9]-[0-9][0-9]-[0-9][0-9]_.* ]] || exiv2 -r '%Y-%m-%d_%H-%M-%S_:basename:' rename $file_name; done
for file_name in `ls *.[jJ][pP][gG]`; do [[ -d "../${file_name:0:10}_" ]] || mkdir "../${file_name:0:10}_"; done
for file_name in `ls *.[jJ][pP][gG]`; do mv $file_name ../${file_name:0:10}_; done

pondělí 31. října 2016

Tuníme prohlížeče

Firefox 49.0.2

about:config
browser.sessionstore.max_tabs_undo=0
browser.sessionstore.max_windows_undo=0

Chrome 54.0
chrome.exe --disable-features=AutomaticTabDiscarding
or
chrome://flags/#automatic-tab-discarding=Disabled

úterý 18. října 2016

Arduino aneb robky a drobky elektronické

Etymologie nemyje, ale ujasňuje
The picturesque town of Ivrea, which straddles the blue-green Dora Baltea River in northern Italy, is famous for its underdog kings. In 1002, King Arduin became the ruler of the country, only to be dethroned by King Henry II, of Germany, two years later.
Today, theBar di Re Arduino, a pub on a cobblestoned street in town, honors his memory, and that’s where an unlikely new king was born. The bar is the watering hole of Massimo Banzi, the Italian cofounder of the electronics project that he named Arduino in honor of the place.

Další troška etymologie nikoho ještě nezabila, stejně tak jako přídavek mytí
The personal name “Arduino” is derived from the Germanic name, Harduwin or Hardwin, composed fromhardu “strong, hardy” and wini “friend.” (Source.) It has cognates in French (Ardennes, site of the Battle of the Bulge in World War II) and English (the Forest of Arden in Warwickshire, the setting of Shakespeare’sAs You Like It).

Co má web https://www.arduino.cc/ společného s emailem a kokosem
Arduino uses the .cc domain extension, the country code for the tiny Cocos Islands, a territory of Australia. It’s the preferred domain of many Creative Commons (open source) projects—another example of when a non-dot-com domain is the more appropriate choice.

Nená
zvuhodná prasečina a nehledejte za tím knížete pornofolku



Jak (ne)/(po)/známe Arduino aneb Fritzing na scéně



Pojmy a dojmy z Wikipedie, bez kterých to neseje
Jednočipový počítač nebo také anglicky microcontroller (mikrokontrolér, MCU, µC) je většinou monolitický integrovaný obvod obsahující kompletní mikropočítač. Jednočipové počítače se vyznačují velkou spolehlivostí a kompaktností, proto jsou určeny především pro jednoúčelové aplikace jako je řízení, regulace apod.

Co to není a co je(ště)
  • devkit 
    • deska
    • mikrokontrolér
      • Atmel AVR 8b či jiný 
      • bootloader (typicky UART)
    • převodník USB/RS-232

Okolo Arduina obšírnější cestička

  • vznikl 2005 viz https://www.arduino.cc/
  • open HW + open SW (vývojová deska, Arduino IDE, knihovny)
  • široká komunita
  • Shield aneb rozšiřující deska
  • příklad HW
    • Arduino Uno, Atmel AVR ATmega328P, 32KiB Flash, 1KiB EEPROM, 2KiB SRAM, 14 I/O, 6 PWM, 6 analog
    • cena originál 650Kč versus Čína 90Kč

Poznámky bez oplzlých poznámek
  • rozkol USA/Itálie (ochranná známka), 2016 split 
  • historie Wiring/Arduino
  • pozor na ovladače USB/RS-232
    • FTDI versus CH340
  • pozor na čínské klony, údajně vykazují slušnou úmrtnost >10% (zejména napájecí obvody)

Tradiční ramp up Arduino Uno R3

Online ramp up Arduino Uno R3

    V čem to budeme programovat
    • obecně by to šlo v ledasčem, ale my použijeme standardní vývojové prostředky (Arduino IDE) a Arduino language
    • Arduino language je založen na Wiring language a je implementovaný v C/C++ což v praxi znamená, že bude programovat v C/C++, ale zapomeneme na main()
    • prostředky jazyka nalezneme v referenční příručce - https://www.arduino.cc/en/Reference/HomePage
    • program je tvořen dvěma sekcemi
      • setup() - vykoná se jednou při startu programu
      • loop() - nekonečná smyčka, která se pustí po dokončení funkce setup()

    Co si vyzkoušíme
    • rozsvítit diodu
    • rozblikat diodu
    • zabzučet
    • zjistit, zda je zmáčklé tlačítko
    • vypsat něco na sériový port
    • použit nějaké čidlo

    Rozsvěcujeme diodu
    #define LED 12 
    void setup() {
      pinMode(LED, OUTPUT);
      digitalWrite(LED, HIGH);
    void loop() {
    }


    Blikáme diodou
    • zapojení neměníme
    #define LED 12
    #define ON_MS 1000
    #define OFF_MS 300 
    void setup() {
      pinMode(LED, OUTPUT);
    }
    void loop() {
        digitalWrite(LED, HIGH);
        delay(ON_MS);
        digitalWrite(LED, LOW);
        delay(OFF_MS);
    }

    Bzučíme
    • je libo trochu muziky?
    #define BUZZER 12
    #define MIN_FREQUENCY 500
    #define MAX_FREQUENCY 16000
    #define DELTA_FREQUENCY 500
    #define ON_MS 500 
    void setup() {
    void loop() {
      int frequency = MIN_FREQUENCY;
      while (frequency < MAX_FREQUENCY) {
        tone(BUZZER, frequency);
        frequency += DELTA_FREQUENCY;
        delay(ON_MS);
      }
    }


    Kdo na to mákl
    #define LED 13#define BUTTON 12 
    int buttonState = 0;
    void setup() {  pinMode(LED, OUTPUT);  pinMode(BUTTON, INPUT);} 
    void loop() {  buttonState = digitalRead(BUTTON);
      if (buttonState == HIGH) {    digitalWrite(LED, HIGH);  } else {    digitalWrite(LED, LOW);  }}



    Paralelně? Neblázněte! Série frčí
    • držte si klobouky
    #define MAX 100 
    int counter = 0;
    void setup() {
      Serial.begin(9600);
    void loop() {
      counter = (counter + 1) % MAX;
     
      Serial.print(counter);
      Serial.println(" = hodnota pocitadla");
    }

    Teplota a vlhkost nám to komplikuje
    • a stejně je to jednoduché aneb použití knihoven v praxi
    #include "DHT.h"
    #define DHTPIN 13    // what digital pin we're connected to
    // Uncomment whatever type you're using!
    #define DHTTYPE DHT11   // DHT 11//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321//#define DHTTYPE DHT21   // DHT 21 (AM2301)
    // Connect pin 1 (on the left) of the sensor to +5V// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1// to 3.3V instead of 5V!// Connect pin 2 of the sensor to whatever your DHTPIN is// Connect pin 4 (on the right) of the sensor to GROUND// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor
    // Initialize DHT sensor.// Note that older versions of this library took an optional third parameter to// tweak the timings for faster processors.  This parameter is no longer needed// as the current DHT reading algorithm adjusts itself to work on faster procs.DHT dht(DHTPIN, DHTTYPE); 
    void setup() {  Serial.begin(9600);  Serial.println("DHT11 test!");
      dht.begin();} 
    void loop() {  // Wait a few seconds between measurements.  delay(2000);
      // Reading temperature or humidity takes about 250 milliseconds!  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)  float h = dht.readHumidity();  // Read temperature as Celsius (the default)  float t = dht.readTemperature();  // Read temperature as Fahrenheit (isFahrenheit = true)  float f = dht.readTemperature(true);
      // Check if any reads failed and exit early (to try again).  if (isnan(h) || isnan(t) || isnan(f)) {    Serial.println("Failed to read from DHT sensor!");    return;  }
      // Compute heat index in Fahrenheit (the default)  float hif = dht.computeHeatIndex(f, h);  // Compute heat index in Celsius (isFahreheit = false)  float hic = dht.computeHeatIndex(t, h, false);
      Serial.print("Humidity: ");  Serial.print(h);  Serial.print(" %\t");  Serial.print("Temperature: ");  Serial.print(t);  Serial.print(" *C ");  Serial.print(f);  Serial.print(" *F\t");  Serial.print("Heat index: ");  Serial.print(hic);  Serial.print(" *C ");  Serial.print(hif);  Serial.println(" *F");}


    Reference

    Ukázka cen jednotlivých hraček z ebaye


    pondělí 21. března 2016

    Copy JPEG's metadata using exiv2

    #!/bin/sh

    METADATA_EXT='.exv'
    SRC_METADATA_FILE=${1%.*}$METADATA_EXT
    TGT_METADATA_FILE=${2%.*}$METADATA_EXT

    exiv2 ex $1
    mv $SRC_METADATA_FILE $TGT_METADATA_FILE
    exiv2 in $2
    rm $TGT_METADATA_FILE 

    úterý 8. března 2016

    How to disable Fn+F4 on ThinkPad (Windows 7 Professional)

    Instructions:

    • Run Lenovo Power Controls
    • Switch do Advanced
    • Select Global Power Settings Tab
    • Find Events
    • Enable Checkbox: Apply the settings to all power plans
    • Select Do Nothing from Drop Down List Sleep button:


    čtvrtek 3. prosince 2015

    How to permanently change Time Zone in Oracle Linux Server 6.7

    Add following commands into the file '~/.bash_profile' or '~/.profile':

    • TZ='Europe/Prague'; export TZ  

    It is funny and sad at the same time, that "Internet" knows dozens of ways how to do such a thing but most of them are definitely useless. I love Linux too... Where are my Windows?

    pondělí 23. listopadu 2015

    Repair corrupted ZIP File

    Oddly enough, just use WinRAR (in time of writting this memo, version 5.30 for Windows x64).

    Instructions
    • open corrupted ZIP file
    • select Tools -> Repair archive
    Note
    • My ZIP archive have contained hundreds of jpegs, the repair have consisted in the shortening of ZIP file it means I have lost all jpegs behind the point of break.

    pátek 16. října 2015

    Lesk a bída (a to především) androidích aplikací pro sport

    Po předlouhém rozjímání jsem se rozhodl vyměnit letitý, a nutno zmínit, nepoužívaný pulsmetr Echowell Ruby 200 za BT obojek, který bych mohl používat s mobilem. Postupem času jsem zjistil, že mi je klasický pulsmetr k ničemu, netrénuji a i kdybych trénoval, tak asi ne podle něj, protože bych jistě netrénoval sám a ve skupině to zkrátka moc dobře nejde, buď makáte s ostatními nebo sami podle pulsáku...

    Možná si říkáte, proč vyhazovat peníze za něco, co člověk nepoužívá? No asi proto, aby to člověk začal používat :-)

    Rozhodl pro kombinaci BT (Bluetooth Smart/Bluetooth Low Energy) obojku a mobilu, který tak jako tak u sebe nosím. Jestliže mi nepřijde zajímavé znát aktuální hodnoty tepové frekvence, tak naopak mi přijde nanejvýš zajímavé znát průběh tepové frekvence, lokální a globální extrémy a další statistické údaje získané během různých aktivit, od spánku až po závody...

    Motivaci znáte, zbývá už jen poslední krok a tím je aplikace pro mobilní telefon (Android 4.4), která dokáže zaznamenávat a exportovat průběh tepové frekvence buď samotně a nebo jako součást sportovního záznamu (v podobě KML, KMZ, TCX, GPX, CSV, ...) A tu leží, běží a letí kámen úrazu. Mé nenáročné představě (aspoň tak se mi připadala na začátku této odyssey) nevyhovuje bezvýhradně žádná aplikace, kterou jsem testoval a jakože jich bylo...

    A co že jsem to očekával?
    • bude zdarma (ideálně bez reklam)
    • nebudu se muset u kohokoliv registrovat
    • dokáže se připojit k BLE obojku, číst z něho data a ty posléze umožní uložit a vyexportovat
    • může být naprosto jednoduchá a jednoúčelová

    No a jak to dopadlo vidíte níže:
    • HRS2015 - nesmysl (jen dokumentace, rozcestník nějaké konference)
    • mapmyfitness - bez registrace nic
    • Strava - bez registrace nic
    • Eldomondo - bez registrace nic
    • Elite HRV - bez registrace nic
    • Heart Rate Plus - bez Google účtu nic
    • RunKeeper lite - bez podpory HRS
    • Kardiograf - bez podpory HRS
    • BPMonitor - bez podpory HRS
    • HB Observer - bez podpory HRS, stojí za vyzkoušení (měří HR asi pomocí akcelerometrů)
    • Runkeeper - nenajde HRS
    • Exercise Logger - nenajde HRS
    • Polar Beat - nenajde HRS
    • Sensor BLE Con - nenajde HRS
    • Graphical - nenajde HRS
    • Data Logger - nenajde HRS
    • Vernier Graphical Analysis - nenajde RHS
    • BLE Heart Rate Watch Face - nenajde HRS
    • Beacon Scanner & Logger (free)- nenajde HRS
    • MyTracks - nenajde HRS

    • Icardio - spárovaný s HRS, ale nefunguje
    • CySmart - spárovaný s HRS, zobrazuje poskytované služby HRS

    • BLE Heart Rate Monitor - zobrazuje tepovku, jinak nic nefunguje

    • HRMonitor - funguje, pro export dat nutná placená verze
    • HRM BLE - funguje 10min, pak jsou funkce omezeny
    • Pulsometr - fungoval, ale nyní stále páda

    • OruxMaps - zobrazuje HRS, nevím zda je možné zaznamenávat trasu, široké možnosti app, stojí za vyzkoušení
    • SenseView - jediná aplikace, která umí téměř vše, co od ní očekávám, ale má jiné zaměření, takže UI není zcela ideální pro mé potřeby

    Jak vidíte, nalezl jsem z nemála aplikací jednu jedinou, která jakžtakž splňuje mé, doufám ne neobvyklé, požadavky. Tímto nechci tvrdit, že jich neexistuje více, ale po této veleúspěšné sondě jsem se rozhodl neztrácet čas dalším hledáním a pokud mi nebude SenseView dostatečně vyhovovat, napíši si raději vlastní appku :-)



    čtvrtek 24. září 2015

    Konkatenace mp3

    Jak rychle spojit několik mp3 v jedinou velikou?

    • Windows CMD
      • type *.mp3 > ../concatenated.mp3
    • Linux BASH
      • cat *.mp3 > ../concatenated.mp3

    středa 26. srpna 2015

    IT friendly ovoce, díl 2

    Druhý díl, zdálo se, skončené ságy jednoho z jednodílných seriálů, které jsou nepřímo zodpovědné za existenci tohoto blogu, je tady!

    Dnes (rozuměj ve skutečnosti průběhu posledních několika měsíců a vlastně i těch nenastalých) si ukážeme výhodnost jednotlivých druhů ovoce z pohledu nákladů. To co nás bude zajímat, je podíl jedlé a nejedlé části ovoce. Výsledkem bude vážený průměr ukazující kolik procent ovoce je jedlého. Ano, vážený průměr nebude jistě to pravé, rozhled omezený horizontem mého nikoliv matematického vzdělání mi napovídá, že lepším řešením by byla aproximace v podobě matematické funkce, jejímž podkladem by byl graf zobrazující funkční závislost mezi váhou ovoce a podílem jeho jedlé složky. Vždyť asi stěží můžeme předpokládat, že u většiny ovoce bude jedlý podíl závislý na váze či objemu (která na váze jistě lineárně závislá není) lineárně. Proto si poznamenám všechny změřené hodnoty a možná z nich časem vykouzlím relevantnější závěry. Jakákoliv relevantnost je stále pouze hypotetická a je oboustranně omezena moji subjektivitou... Co je tím myšleno? Třeba definice jedlé a nejedlé části ovoce, každý to má totiž jinak. Např. já jako dámička nejím slupky banánů, citrusů, jadřince a stopky jablek a hrušek apod.

    Banán - 65%, [154g/100g, 144g/96g, 136g/89g, 136g/88g,]
    Bluma - 94%, [63g/59g,]
    Broskev - 98%, [212g/207g,]
    Citrón - 56%, [89g/50g,]
    Grapefruit - 70%, [480g/347g, 410/272g]
    Grapefruit sweet - 52%, [282g/148g]
    Hruška - 92%, [130g/120g,]
    Jablko - 93%, [72g/67g,]
    Meruňka
    Nektarinka - 94%, [108g/101g,]
    Pomeranč - 67%, [340g/227g,]
    Vinné hrozny - 98%, [491g/479g,]


    středa 10. prosince 2014

    Ubuntu 14.04 LTS - je to k něčemu dobré?

    Ano i ne, toť závěr pro ty, které zajímá soud a ne cesta jak jsem k němu došel :-) Místo sáhodlouhých řečí se na to podíváme zkratkovitě v bodech.

    Pro:
    • Out of the box funguje většina klávesnicových vychytávek na Lenovo ThinkPad T400, no konečně...
    • USB Tethering s prehistorickým Androidem, to co na Windows vyžaduje instalaci Bůh ví kolika SW, tady běží out of the box, stabilněji a lépe než na Windows, tleskám.
    • Uživatelské rozhraní konečně vypadá vcelku použitelně a vážně jde i používat.
    • Někde níže si stěžuji na chybějící kodeky pro video, hudbu (mp3) a další, je sice opruz, že to není v základu předinstalované, nicméně "automatická" instalace na stisk tlačítka funguje, to také nebývalo vždycky zvykem.
    • Scrollování TrackPointem funguje out of the box, takže není nutné s každou novou verzí Ubuntu hledat nový postup na zprovoznění téhle core funkcionality tohoto geniálního kousku HW.
    • Instalace systému je příjemná, stabilní a vcelku rychlá.

    Proti:
    • To že správně nefunguje přihlašovací dialog je epic fail, probudíte NB, kliknete do textového pole pro zadání hesla a psané znaky se neobjevují... Workaround? Přepnout uživatele na toho samého, pak už to jde...
    • Přepínání klávesnic je dalším epic failem, mám tři, občas se stane, že vidíte zvolenou českou klávesnici, ale české znaky nepíšete, protože ve skutečnosti je aktivní úplně jiná...
    • Remapování kláves zdaleka nefunguje dobře, minimálně ve spojení s více "klávesnicemi" viz předešlý bod, tady to vypadá na slušný bug.
    • Výdrž baterie se nezdá být příliš chvalitebnou.
    • Nechápu, proč na modifikaci čehokoliv je potřeba instalovat další SW, nešlo by ho mít nainstalovaný v základu a někde jen přepínat jednoduchou/kompletní nabídku nastavení?
    • Zase ty licence, proč na přehrání mp3, videa na Internetu potřebuji instaloval další tuny SW, rád bych out of the box funkcionalitu...

    pondělí 24. listopadu 2014

    pátek 21. listopadu 2014

    Přemapování kláves Back/Forward na PageUp/PageDown na Thinkpadu T400 v Ubuntu 14.04 LTS

    Mnozí vlastníci notebooků Lenovo T400 a mnohých dalších řad dobře znají situaci, kdy se při vyplňování dlouhých formulářů ve webovém prohlížeči ukliknou a místo některé ze šipek stisknou jednu z kláves Back/Forward, která způsobí přechod na předchozí/následující stránku, což je obyčejně spojeno se ztrátou dat ve formuláři. Jedním z mnoha řešení tohoto otravného chování je přemapování těchto kláves na PageUp/PageDown. Používáte-li Ubuntu 14.04 LTS (a mnohé další verze Ubuntu popř. jiné distribuce) můžete se o tuto akci postarat těmito způsoby:

    1) Dočasné přemapování pro aktuální X sezení

    xmodmap -e 'keycode 166=Prior'
    xmodmap -e 'keycode 167=Next'
    

    2) Trvalé přemapování

    cat > ~/.Xmodmap <<EOF 
    keycode 166=Prior 
    keycode 167=Next 
    EOF
    

    středa 1. října 2014

    Chybějící playback device ve Windows 7 Professional (64bit)

    Občas se stane, že vám z karty "Playback" v "Control Panel" - "Sound" zmizí zařízení pro přehrávání zvuků "Playback Devices". Může se to stát např. tak, že je disablujete. Následkem toho se vám v "System Tray" může objevit červený křížek přes diablovanou ikonu reproduktoru sloužící zejména k nastavení hlasitosti. Postup jak takové zařízení vrátit je jednoduchý, ale pro mě byl dosti nečekaný:
    • Control Panel - Sound - Playback
    • right mouse click do bílé plochy pod nápisem "Select a playback device bellow to modify its settings:"
    • v popup menu zatrhněte checkbox "Show Disabled Devices"
    • objeví se disablovaná zařízení ("Playback Devices")
    • right mouse click na ikonu hledaného zařízení
    • v popup menu left mouse click na "Enable"

    Print Screen aktuálního okna


    • Alt + PrtScr (aktuální okno)
    • PrtScr (celá obrazovka(y))

    Java unit testy a změna static final fieldů

    Při psaní unit testů se čas od času dostanete do situace, kdy by se hodilo změnit hodnotu static final fieldů. Jeden z nejjednodušších a zároveň nejšpinavějších triků je využití reflexe. Ukážeme si to na příkladu.

    Mějme následující třídu, kterou chceme otestovat:
    public class Foo {
    
        public static  String BAR = "bar";
    
        public Foo() {
        }
    
        public static int fooMethod(final String fooParameter) {
            try {
                if (!BAR.isEmpty()) {
                    return ((BAR + fooParameter).length());
                } else {
                    throw new IllegalArgumentException();
                }
            } catch (IllegalArgumentException e) {
                throw new RuntimeException();
            }
        }
    }
    

    A příslušný unit test:

    import java.lang.reflect.Field;
    import java.lang.reflect.Modifier;
    
    import org.junit.Test;
    
    public class FooTest {
    
        @Test(expected = RuntimeException.class)
        public void testFooMethodEmptyStaticFinalField() throws Exception {
            // set public static field BAR to empty string to be able test
            Field staticField = Foo.class.getDeclaredField("BAR");
            staticField.setAccessible(true);
            Field staticFieldModifiers = staticField.getClass().getDeclaredField("modifiers");
            staticFieldModifiers.setAccessible(true);
            staticFieldModifiers.setInt(staticField, staticField.getModifiers() & ~Modifier.FINAL);
            staticField.set(null, "");
    
            Foo.fooMethod("any vaue");
        }
    }
    
    
    Původní třídu však musíme modifikovat následujícím způsobem:
    public class Foo {
    
        public static  String BAR = new String("bar");
    
        public Foo() {
        }
    
        public static int fooMethod(final String fooParameter) {
            try {
                if (!BAR.isEmpty()) {
                    return ((BAR + fooParameter).length());
                } else {
                    throw new IllegalArgumentException();
                }
            } catch (IllegalArgumentException e) {
                throw new RuntimeException();
            }
        }
    }
    
    A voila...