wtorek, października 29, 2013

A jednak bug w oprogramowaniu Toyoty

Trzy lata temu przewidywałem, że problemy z pedałem przyśpieszenia w Toyotach to błąd w firmware. Niestety z teoretycznymi liczbami miałem rację. Strach jeździć z takim oprogramowaniem silnika. Ze skryptu sądowego: Toyota Camry 2005 poruszająca się z prędkością ok. 100 km/h potrzebuje mniej więcej 3,5 metra na zresetowanie komputera (125 milisekund). Żeby zresetować komputer bez watchdoga trzeba wyłączyć i włączyć stacyjkę, a w przypadku keyless-go wyjąć pilota z samochodu (sic!!!), włożyć go ponownie i nacisnąć przycisk startu. 11 000 zmiennych globalnych, funkcje o cyklomatycznej złożoności powyżej 50, stosowanie rekurencji przy za małym stosie. Żeby zadziałał watchdog od hamowania trzeba najpierw zdjąć nogę z hamulca a potem wcisnąć mocno. Watchdogi w ESP nie monitorują głównego procesora.

sobota, października 26, 2013

Ambassada

Na koniec w paru momentach widzimy Warszawę jaką mogła by być, z nowoczesnymi wieżowcami, z żydowskimi handlarzami na ulicach, Marszałkowską bazującą na zabudowanie z początku dwudziestego wieku. Ile to miasto straciło kulturowo i cywilizacyjnie przez taki a nie inny bieg historii.

Darski gra trochę drętwo, ale z subtelnym kawałkiem na gitarze jest mocny. Więckiewicz jest jak zawsze dobry.

poniedziałek, października 21, 2013

Właściwy człowiek na właściwym miejscu



Opakowanie na banana


Kwarcogranit

Kwarcogranit albo kwarc techniczny to materiał powstały przez uwibrowanie pod wysokim ciśnieniem i temperaturą zmielonego kwarcu, żywic, pigmentów i innych dodatków odpowiadających za unikalność wzoru (np. odłami szkła, lustra, porcelany itp.). Z płyt produktu można tworzyć blaty kuchenne, podłogi, elewacje. Produceni oferują też tworzenie prawie dowolnych obiektów z tego materiału np. zlewozmywaków - te są szlifowane wraz z blatem pod kątem 45 stopi i spajane silikonem tworząc ładną jednolitą powierzchnię kuchenną. Kwarcogranit przy średnio intensywnym użytkowaniu odporny jest na zadrapania. W przypadku ustawicznego rzucania/drapania sztućcami, stawiania gorącej patelni lepiej sprawdzi się zlew standardowy podwieszany ceramiczny/granitowy np. Franke, Blanco. Kwarcogranit (Technistone, Silestone) nie jest odporny na nagłą zmianę temperatury i w miejscu zestawienia gorącej blachy do pieczenia może popękać. Nie zacznie się jednak topić/zmieniać kształt jak konglomerat z rudą aluminium i akrylem (Corian, Staron, Kerrock).







czwartek, października 17, 2013

NestedJarClassLoader

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.net.JarURLConnection;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.HashMap;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;


public class NestedJarClassLoader extends URLClassLoader {

private HashMap jarCache = new HashMap();

@Override
public InputStream getResourceAsStream(String s) {
byte[] data = jarCache.get(s);
if (data==null)
data = jarCache.get("/"+s);
return (data!=null) ? new ByteArrayInputStream(data) : null;
}

@Override
public URL findResource(String name) {
return null; // not supported
}

@Override
public Class loadClass(String s) throws ClassNotFoundException {
byte[] bc = jarCache.get(s+".class");
if (bc!=null)
return super.defineClass(s, bc, 0, bc.length);
return super.loadClass(s);
}

public NestedJarClassLoader(URL url) throws Exception {
super(new URL[] {}, NestedJarClassLoader.class.getClassLoader());
String sURL = url.toString();
String u = url.toString().substring(4);
String name = new File(u.substring(9)).getName();
URL firstJarUrl = new URL(sURL.substring(0, sURL.lastIndexOf("/")+1));
JarFile jf = ((JarURLConnection)firstJarUrl.openConnection()).getJarFile();
InputStream is = jf.getInputStream(jf.getEntry(name));
byte[] binaryJar = new byte[is.available()];
/* read through compressed stream is tricky */
int n = 0;
int cnt = 0;
do {
n = is.read(binaryJar, cnt, binaryJar.length - cnt);
if (n>0)
cnt += n;
}
while (n > 0);
ZipInputStream zis = new ZipInputStream(new ByteArrayInputStream(binaryJar));
ZipEntry ze = null;
while ((ze = zis.getNextEntry()) != null) {
byte[] buff = new byte[4096];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int s = 0;
do {
s = zis.read(buff);
if (s>0)
baos.write(buff, 0, s);
}
while (s > 0);
if (baos.size() > 0 && ze.getName() != null) {
jarCache.put(ze.getName(), baos.toByteArray());
if (ze.getName().endsWith(".class")) {
String className = ze.getName().replace('$', '.').replace('/', '.');
jarCache.put(className, baos.toByteArray());
}
}
}
}

public static void main(String[] args) throws Exception {
URL url = new URL("jar:file:C://tibco/bw/5.10/hotfix/lib/tibcoverage.jar!/tdi.jar");
NestedJarClassLoader ucl = new NestedJarClassLoader(url);
ucl.loadClass("tdi.com.tibco.pe.Logger");
}
}

poniedziałek, października 07, 2013

Beckers

Testery Beckers można kupić w Leroy Merlin Strefa Wnętrza (Ostrobramska) - 4,95 zł za 50 ml. Teoretyczna wydajność to 0,75m^2. Przy surowej ścianie spada do 0,3m^2. Na zdjęciu pistacja, aqua i lawenda. Światło wpadające do pomieszczenia w różnych porach dnia i o różnej pogodzie ma inne temperatury barwowe - przykładowo: w ciepły dzień po południu do koloru ściany będzie dodawany beżowy i pistacja będzie miejscami wyglądać jak banan. Im mniej światła tym kolory farby są bardziej wyraziste - aqua i lavender bardziej przypominają zwykły niebieski i fioletowy.



Zarządzanie zasobami w projekcie

Przełączanie się między kontekstami/zadaniami jest kosztowne nie tylko w przypadku systemu operacyjnego ale też w przypadku pracujących ludzi. Jak zatem pogodzić N projektów i jednego pracownika? Jeden projekt na dzień - dana osoba jest przydzielona do projektu na 100% w ten sam cyklicznie powtarzający się dzień tygodnia np. poniedziałek. W innym projekcie uczestniczy we wtorki. Jeśli projekt jest ważny/priorytetowy to osoba jest przydzielona do niego w piątki i poniedziałki. Co jeśli nie można zebrać danego zespołu w dany dzień/spełnić warunków brzegowych niezbędnych do startu kolejnej iteracji? Ludzie czekają na zaistnienie sprzyjających okoliczności za sprawą kierownika projektu, a jeśli po dwóch godzinach stan się nie zmieni to przechodzą do swoich bieżących nieprojektowych zadań. Dzień taki z punktu widzenia kierownika projektu jest zmarnowany - z tak odebranej kary powinien wyciągnąć wnioski. Jeżeli nie starcza dni tygodnia do podziału, to w oczywisty sposób brakuje ludzi do wykonywania pracy.