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.
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
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");
}
}
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
@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.
Subskrybuj:
Posty (Atom)