Programistyczne WTF jakie Was spotkały

11

Windows calc
Wpisujemy 4√, otrzymujemy 2
Odejmujemy 2, otrzymujemy.. ;)

Jeszcze fajniej widać, jak najpierw odejmiemy 1 by zniknął nam pierwiastek z górnej linii. Można wtedy kogoś posadzić przed kompem, gdzie widnieje jedynie cyfra 1 i kazać mu odjąć 1.

2

Internet Exploder 11
W ustawieniach Internet Options ustawiony i dostępny tylko jeden język: Polski
OS: angielski.
W IE otwiera mi się automatem strona MSN (taki onet od MS).

Na stronie dostępne języki (WTF #1):

  • Taal kiezen
  • Belgie (Nederlands) - NL
  • Belgique (Francais) - FR

Oczywiście strona wyświetla się w którymś z nich.
Przy próbie zmiany: "Internet Explorer has stopped working" (WTF #2).

8

Znalezione dzisiaj, od około 10 lat to tak działa:

void SetFooData()
{
    string foo1 = "";
    string foo2 = "";
    string foo3 = "";
    try
    {
        var data = Bar.Baz.Foos["Foo1"];
        if(data != null) foo1 = data;
    }
    catch { }
    try
    {
        var data = Bar.Baz.Foos["Foo2"];
        if(data != null) foo2 = data;
    }
    catch { }
    try { }
    catch 
    {
        var data = Bar.Baz.Foos["Foo3"];
        if(data != null) foo3 = data;
    }
    ...
}

Jak ktoś nie zauważył to chodzi o ostatni try/catch :D

1
class PDOMemcached extends PDO {
 
    // ...

    public function beginTransaction() {
        return $this->_transaction_count++ == 0 && parent::beginTransaction();
    }

    public function commit() {
        return $this->_transaction_count > 0 && $this->_transaction_count-- == 1 && parent::commit();
    }

    public function rollBack() {
        return $this->_transaction_count > 0 && parent::rollBack() && !($this->_transaction_count = 0);
    }

    // ...

}

Taki trik, żeby można było wywołać metodę w której jest begin, commit i rollBack kilka razy (lub wiele metod różnych metod), i żeby wszystko było w jednej transakcji. Szkoda, że w którymś miejscu wpadło nie w tego ifa co trzeba i się to rozjeżdża. Pytanie w którym...

9

Okres kolokwiów na połowę semestru ma się już ku końcowi, zatem czas wrócić do normalnego trybu pracy.
Podstawy Programowania na PWr, lekcja 4.
Dziedziczenie

Na początek złota myśl: (pod koniec będzie lepsza) "Jeżeli nie ma konstruktora, wywołany zostaje konstruktor domniemany". Złota myśl w sumie tylko dla mnie, bo domniemany i domyślny to ponoć synonimy, ale jeszcze nigdy nie spotkałem się z tym, żeby ktoś nazwał konstruktora domyślnego "domniemanym".

Baboli tym razem dosyć mało, bo bardziej to przypominało wykład, niż ćwiczenia. Mało kodu, więcej gadania.

Przy omawianiu rzutowania powstało coś takiego:

class Punkt {
	int x, y;
	public Punkt() {...}
}

class Punkt3D extends Punkt {
	int z;
	public3D() {...}
}

To public3D to mam nadzieję literówka. Później doszło do samej prezentacji rzutowania:

Punkt p = new Punkt();
Punkt3D p3 = (Punkt3D)p;
p3.x = 1;
p3.y = 2;
p3.z = 3;

Druga linijka ClassCastException. Po napisaniu tego kwiatka prowadzący zaczął opowiadać o rzutowaniu w górę i w dół, o różnych mechanikach i tak dalej, by nagle po 10 minutach takiego gadania podkreślić byka i powiedzieć, że to się skompiluje, ale nie uruchomi. Szkoda, że większość grupy zdążyła już to przepisać, a przez te parę minut gadania pewnie zasnąć i nawet nie zwrócili na to uwagi. Gdyby nie moja chęć napisania tego sprawozdania, pewnie też bym nie zauważył :P

Następnie przystąpiliśmy do pisania konkretnego kodu. Mamy mieć klasę abstrakcyjną Pracownik (ale to, że powinna być abstrakcyjna, to najwyraźniej tylko ja wiedziałem) oraz rozszerzające je klasy Urzednik i Robotnik. Te dwie klasy różnią się metodą wyliczania pensji, ale sam kod obliczania nie jest potrzebny do życia.

class Pracownik {
	private String nazwisko;
	private double etat;
	
	public Pracownik(String nazwisko, double etat) {
		this.nazwisko = nazwisko;
		this.etat = etat;
	}
}

class Urzednik extends Pracownik {
	private double placaPodst;
	private int procPremii;
	
	public Urzednik(String nazwisko, double etat, double placa, int proc) {
		this.placaPodst = placa;
		this.procPremii = proc;
		super(nazwisko, etat);
	}
	
	public double obliczWyplate() {
		...
		return w;
	}
}

Wszystko spoko, poza konstruktorem Urzednik i super na końcu zamiast na początku, co da nam błąd, z którym nie zgodzi się nawet kompilator (prowadzący przedstawia do tej pory wszystkie sytuacje tak, jakby kompilator był łagodny jak baranek i brał wszystko jak leci, a wredna VM rzuca nam jakimiś wyjątkami)..

Klasa Robotnik wyglądała dobrze (nawet super był w dobrym miejscu), ale zaciekawiło mnie, gdy zaraz po napisaniu pól składowych:

class Robotnik extends Pracownik {
	private double stawkaGodz;
	private double przepGodz;
	private final double limit = 200;
	...
	public double obliczWyplate() {
		...
		return w;
	}
}

Pan prowadzący powiedział, że zmienna z atrybutem final jest stała, więc... musi mieć z góry podaną wartość. Ktoś tu pomylił się ze static final.

Następnie padło zadanie: Napisać klasę przechowującą wszystkich pracowników w jednej tabeli. Dodatkowo klasa ta ma zawierać metodę obliczającą sumę wypłat Robotników. Postanowiłem zbawić dzisiejsze zajęcia i zgłosiłem się do odpowiedzi, funkcja zliczająca wyglądała mniej-więcej tak:

(nazwa metody została mi wymuszona, sorry)

public double sumaWypRob() {
	double suma = 0.0;
	for (int i = 0; i < tab.length; i++) {
		if (tab[i] instanceof Robotnik) {
			Robotnik r = (Robotnik)tab[i];
			suma += r.obliczWyplate();
		}
	}
	System.out.println(suma);
	return suma;
}

Dlaczego przed return dałem wyświetlenie do konsoli? Bo tak pan prowadzący kazał. Połowa funkcji, jakie realizujemy na laboratoriach (z tym samym panem), ma za zadanie jednocześnie zwrócić wartość i wyświetlić w konsoli, co jest mocno wkurzające, gdy wartość z takiej funkcji może być przydatna gdzieś indziej i musimy łamać zasadę DRY, żeby przypadkiem nie wyświetlić jednej linijki dwa razy (raz w kodzie innej funkcji, raz w "teście").

Na koniec pan prowadzący powiedział, że cały blok if można by też zastąpić prostym suma += tab[i].obliczWyplate();. Mniejsza o to, że nie sumuje to pensji samych robotników, a wszystkich pracowników. Ważniejsze jest IMHO to, że obliczWyplate() nie istnieje w klasie Pracownik.

Na sam koniec tego mojego (słusznego chyba) bólu odbytu poprawna złota myśl, która pojawiła się na początku wykładu razem z omawianiem pojęcia dziedziczenia:

Dziedziczenie uaktywnia programowanie, czego nie było w programowaniu klasycznym, proceduralnym.

6

Można powiedzieć, że przejąłem ten temat? Zaczynam żałować, że piszę tu, a nie na mikroblogu, załapałyby się punkty do reputacji.
Podstawy Programowania na PWr, lekcja 5.
Kolekcje
Prowadzący poszedł zgodnie z historią Javy - zaczęliśmy od klasy zawierającej tablicę typu Object, mogącą przechowywać wszystko. Znowu użył na coś listopodobnego określenia "tablica dynamiczna".

Klasa Tablica ma mieć metody Object get(int i), void set(int i, Object o) i void resize(int i), przy czym samym resize się nie zajmowaliśmy, bo robiliśmy to kilka razy na poprzednich zajęciach. Zaskakujące było, że nagle przeszliśmy z nazw polskich na angielskie.

public class Tablica {
    Object[] tab;
    Tablica(int rozm)
    { tab = new Object[rozm]; }

    void resize(int i) {
        ...
    }

Teraz piszemy metodę get.

Object get(int i)
    { if (i > tab.length || i < 0)
        throw new ArrayIndexOutOfBoundsException(){}
    else
        return tab[i];
}

Brzydkie klamry, brak jednego średnika. if miał sprawdzać, czy indeks znajduje się wewnątrz tablicy, na szczęście ktoś poprawił na i >= tab.length.
Ciekawostka dla osób nieumiejących Javy: ArrayIndexOutOfBoundsException jest rzucane automatycznie, gdy wyjdziemy poza indeks, więc jeżeli chcemy rzucać ten wyjątek w razie przekroczenia, to równie dobrze moglibyśmy po prostu napisać Object get(int i) { return tab[i]; } i wyjdzie na to samo.

void set(int i, Object o)
    { if (i < 0)
        throw new ArrayIndexOutOfBoundsException{}
        else
        { if (i >= tab.length)
            resize(i+1);
        }
        tab[i] = 0;
}

Pomijając dziwadło w postaci wyjątku, to się skompiluje i zadziała. Szkoda.

Po szybkim omówieniu typów generycznych i iteratorów (ale o znacznie prostszym foreach nikt nie wspomniał), zajęliśmy się kolekcjami. Podzieliliśmy je na trzy grupy: listy List, zbiory Set i mapy Map. Wśród ciekawostek, jakie na ich temat usłyszeliśmy, było m. in. to, że:

  • Obiekty przechowywane w HashSet i HashMap muszą posiadać metodę hashCode(). Szkoda, że mają ją wszystkie cholerne obiekty w Javie. Jasne, że lepiej byłoby napisać swój, ale nie jest to obowiązkowe do działania, w przeciwieństwie do tego, co próbował wmówić prowadzący.
  • Obiekty przechowywane w TreeSet i klucze w TreeMap muszą implementować interfejs Comparable. Szkoda, że to nieprawda - można dostarczyć swój Comparator<T>, możemy go nie dostarczać, ale na pewno nie ma żadnych wymogów co do elementów tam przechowywanych.
  • Obiekty przechowywane w HashSet i TreeSet muszą posiadać metodę equals(). Patrz pkt 1.

DODATKOWO (i jak to usłyszałem, to ledwo powstrzymałem się od śmiechopłaczu) TreeSet nie musi mieć equals() (mimo, że i tak ma), bo musi (zgodnie z punktem 2.) implementować Comparable, więc ma metodę compareTo(), która zastąpi equals().

0

visual studio 2017 debugger podaje inne wartości niż są w trakcie egzekucji -.-
1268bae241.png

0

Właśnie znalazłem

 Thread.Sleep(1 * 1000)
5

Z cyklu ... bo manager musi wiedzieć wszystko.

Jakiś czas temu przyszedł do mnie kierownik projektu i poprosił abym rzucił okiem na jeden projekt bo odświeżanie listy zadań trwa 10 min ... No więc siadłem do bazy danych i zauważyłem, że każda zmiana statusu zadania (a na jeden rekord przypada kilkadziesiąt zmian w zależności od złożoności nawet kilkaset) odkładana jest w postaci rekordu w oddzielnej tabeli z datą zmiany i statusem. Sęk w tym, że chcąc pokazać status w oknie głównym gość, który to robił wyciągał rekord o najnowszej dacie z tej tabeli i dorzucał do aktualnego zapytania. Jak sobie pewnie sami zdajecie sprawę trwało to w nieskończoność. Postanowiłem zatem pozbyć się tej tabeli na rzecz pola i zamiast insert do osobnej tabeli robiłem update na statusie. Rozwiązanie konsultowane z osobami, które już wcześniej siedziały w projekcie, a nawet z kierownikiem projektu. Wszytko działa szybko i bezproblemowo.

W dniu dzisiejszym po niemal roku od powyższej modyfikacji przychodzi klient (a dokładnie manager od klienta) i pyta dlaczego mu raport z czasem pracy pracownika per zadanie nie działa. No więc zaglądam do tego raportu i co ... tak tak raport był oparty o sumowanie dat z tabeli, którą wywaliłem :D

Odpowiedź na dziś: "Nie ma takiej funkcjonalności, tamten raport był testowy. Możemy przygotować taką modyfikację odpłatnie" :D

10
public String getId(boolean doYouWantRealIdOrJustKI) {
	if (doYouWantRealIdOrJustKI) {
		return super.getId();
	} else {
		return this.getId();
	}
}
3
@RepositoryEventHandler
public class EventHandler {

    @Autowired
    private ItemRepository itemRepository;

    @HandleAfterSave
    public void handleItemDeleted(Item item) {
        if (isDeleted(item)) {
            itemRepository.delete(item);
        }
    }

    private boolean isDeleted(Item item) {
        return item.getPersonName() == null &&
                item.getType() == null &&
                item.getSubject() == null &&
                item.getDetails() == null &&
                item.getContactInformation() == null;
    }
}
12

Podstawy Programowania na PWr, lekcja 6.
** Strumienie **
Za wiele rzeczy się ciekawych nie działo, ale imponująco wyglądała obsługa wyjątków.

 try {
	...
catch } (FileNotFoundException ex) { ... }

Ta klamra między catch a nawiasami to nie literówka. Znaczy, to jest literówka, ale nie moja. Przy drugim przykładzie prowadzący na wszelki wypadek spojrzał do kartki, żeby przypomnieć sobie, jak się stawiało klamry w try...catch.

Jeszcze jeden przykład obsługi wyjątków:

try {
	try {
		//tworzenie strumienia
	} catch (FileNotFoundException ex) { ... }
	//wczytywanie/zapisywanie oraz zamknięcie strumieni
} catch (IOException ex) { ... }

Dla nieobeznanych z Javą: Wyjątek FileNotFoundException jest klasą rozszerzającą IOException i całość zadziałałaby bez wewnęrznego bloku try.
screenshot-20161216200040.png

Pomijam fakt, że jeżeli już koniecznie chcemy obsłużyć FNFex inaczej, niż IOex, to można dać dwa bloki catch obok siebie. Prowadzący stwierdził, że takiego zapisu, jaki jest powyżej, przy czytaniu z pliku się nie pominie!

(po czym stworzyliśmy wspólnymi siłami przykład kopiowania zawartości jednego pliku do drugiego i tam jednak pominęliśmy ten wewnętrzny try...catch)

5

Twoja sesja wygasła.

Wiele stron powiela ten sam błąd. Scenariusz jest następujący:

  1. otwieram stronę z jakimś formularzem
  2. nic z nim nie robię, zajmuję się czymś innym
  3. po wcale nie takim dłuższym czasie (10 minut, pół godziny, godzina...) powracam do formularza i pieczołowicie wypełniam
  4. zatwierdzam formularz
  5. błąd.

Noż co to niby daje takie „wygaśnięcie sesji” na samym początku, kiedy jeszcze nic nie jest wypełnione? Czy takim wielkim obciążeniem dla serwera byłaby sesja np. 24-godzinna?

2

Fragment klasy odpowiedzialnej za aktualizację bazy danych z allegrowym WebAPI (aktualizacja kategorii, pól sprzedaży itd.); wycinek z jednego z firmowych systemów (tak w sumie to ex-wycinek, bo właśnie to poprawiam popijając melisę):

<?php

/* ... */

$this->switchDatabaseConnection('tymczasowa-baza');

/** unicorns here */

//zaczekaj aż wszyskim wskoczy update
sleep(5);
//zrzut tabeli z kategoriami na nową
if (self::$local == 1) {
	exec(
		'c:\costam\mysqldump -u root --default-character-set=utf8 nazwa-bazy nazwa-tabeli > C:\costam\nazwa-tabeli.sql'
	);
} else {
	exec(
		'mysqldump -u root --password=haslo-do-bazy --default-character-set=utf8 nazwa-bazy nazwa-tabeli > '
		. APP_DIR . 'costam' . DIRECTORY_SEPARATOR . 'nazwa-tabeli.sql'
	);
}

if (self::$local == 1) {
	//drop na kategorie
	exec('C:\costam\mysql -u root nazwa-bazy drop table nazwa-tabeli');
	//import
	exec(
		'C:\costam\mysql -u root --default-character-set=utf8 nazwa-bazy < C:\costam\nazwa-tabeli.sql'
	);
} else {
	//drop na kategorie
	exec('mysql -u root --password=haslo-do-bazy nazwa-bazy drop table nazwa-tabeli');
	//import
	exec(
		'mysql -u root --password=haslo-do-bazy --default-character-set=utf8 nazwa-tabeli < ' . APP_DIR . 'costam'
		. DIRECTORY_SEPARATOR . 'nazwa-tabeli.sql'
	);
}

/** unicorns here */

$this->switchDatabaseConnection('zwyczajna-baza');

Poza unicorns here i usunięciem danych do bazy, formatowanie i komentarze oryginalne.
Ktoś nie wiedział, że MySQL obsługuje transakcje i postanowił to obejść...

4

Na stronie zamiast wiadomości Cośtam jest źle: xyz pojawia się nieustannie Cośtam jest źl xyz - szybki test i okazuje się, iż do widoku wiadomość trafia już w takiej formie, choć w kontrolerze jest zapisana prawidłowo.

Chwilka na opis sytuacji: w kontrolerach, jeśli chce się wyświetlić wiadomość, należy napisać:

$this->flassMessenger->addMessage('i:Jakaś informacja.');
$this->flassMessenger->addMessage('e:Jakiś błąd.');

(i: oznacza właśnie informację, e: - błąd)

Wszystkie wiadomości z flash messengera są automatycznie przesyłane do widoku pod koniec przetwarzania kontrolera - i, jako że ktoś był leniwy, zamiast zrobić sprawdzanie czy dana wiadomość zaczyna się od i:/e: i usunąć tylko ten początek, zrobił tak, że sprawdzał, czy gdziekolwiek w wiadomości znajduje się ten ciąg znaków, a potem podmieniał go na pusty :D - przez co jakiekolwiek wystąpienie i: oraz e: w wiadomości było usuwane.

Abstrahując oczywiście od tego, iż oczywiście samo wywołanie powinno bardziej przypominać addMessage(MSG_ERROR, 'test'); niż zabawy z takimi magicznymi ciągami wewnątrz wiadomości, lecz tak dużej porcji kodu póki co nie zamierzam refaktoryzować :-P

5

Mały bonus do lekcji programowania na PWr, który sobie przypomniałem.
Tworząc konstruktora np. TreeSet, można jako argument dać obiekt implementujący interfejs Comparator<T>, aby wraz z dodawaniem elementów do zbioru zachowywana była jakaś kolejność.
Ponieważ jednak nie omawialiśmy czegoś takiego, jak interfejsy, prowadzący stwierdził, że wystarczy dać w konstruktorze obiekt dowolnej klasy zawierającej metodę int compare(T a, T b), po czym powstał kod:

class Porownanie {
   int compare(Pracownik a, Pracownik b) {
    //...
  }
} 
//...
TreeSet<Pracownik> pracownicy = new TreeSet(new Porownanie());
0

Dziś na DSM trzeba było dodać do istniejącej liczby godzin spędzonych nad zadaniem (3) kolejne godziny (6,5). PM wyszło 18, teamleadowi 10 :D

[edit]
Na innym DSM z czterech godzin zadania trzeba było zdjąć dwie. Scrum Master pyta - ale zdjąć, czy zostawić?

1

Powiodła się aktualizacja?
https://bogdan.students.wmi.amu.edu.pl/images/jestem_za_a_nawet_przeciw.png
(Nie mogę wstawić obrazka do postu, w oknie edycji działa u mnie tylko przycisk "Zapisz").

10

Aktualnie grzebię w takim jednym projekcie i napotykam różne cudowne rozwiązania
37 pustych linii

 <!--
Ty Cholerny złodzieju. Zostaw tę stronę w spokoju i 
weź się za coś pożytecznego do roboty.

Zgodnie z art. 158 & 1 Ustawy d dnia 4 lutego 1994 roku
 o Prawie Autorskim i Prawach Pokrewnych,
 "kto przwywłaszcza sobie autorstwo albo wprowadza
 w błąd co do autorstwa całości lub części cudzego 
utworu albo artystycznego wykonania, podlega grzywnie,
 karze ograniczenia wolności albo pozbawienia wolności do lat 3."

-->

30 pustych linii i kod html content'u

plik1.php

<?php
require 'strony/funkcje/config.php';
require 'strony/funkcje/config3.php';
...

config3.php

 <?php
require 'strony/funkcje/czas.php';
?>

czas.php

<?php
 //======================================================================
//Funkcje
	function MinZ($minB)
{

	if($minB == 0) $minB="00";
	if($minB == 1) $minB="01";
	if($minB == 2) $minB="02";
	if($minB == 3) $minB="03";
	if($minB == 4) $minB="04";
	if($minB == 5) $minB="05";
	if($minB == 6) $minB="06";
	if($minB == 7) $minB="07";
	if($minB == 8) $minB="08";
	if($minB == 9) $minB="09";

return $minB;

}	


	function GodzZ($GodzB)
{

	if($GodzB == 0) $GodzB="00";
	if($GodzB == 1) $GodzB="01";
	if($GodzB == 2) $GodzB="02";
	if($GodzB == 3) $GodzB="03";
	if($GodzB == 4) $GodzB="04";
	if($GodzB == 5) $GodzB="05";
	if($GodzB == 6) $GodzB="06";
	if($GodzB == 7) $GodzB="07";
	if($GodzB == 8) $GodzB="08";
	if($GodzB == 9) $GodzB="09";

return $GodzB;

}	
//======================================================================

srand(time());
$liczbax = (rand()%25000);

//
//Zakres dat w zapytaniach SQL
$SRok=date('Y');
$SMiesiac=date('n');
$SDzien=date('j');
//
?>

Takowoż wyglądają funkcje choć są rzadko deklarowane, głównie opieramy się na include jakichś pliczków, które zawierają kawałek kodu

Takie switch'e

 
switch ($IDS) {
    case 0:
        $IDSTablicy='NS_0';
        $IDSTablicyPL='i';
        break;
    case 1:
        $IDSTablicy='NS_1';
        $IDSTablicyPL='i - 1';
        break;
    case 2:
        $IDSTablicy='NS_2';
        $IDSTablicyPL='i - 2';
        break;
    case 3:
        $IDSTablicy='NS_3';
        $IDSTablicyPL='i - 3';
        break;
    case 4:
        $IDSTablicy='NS_4';
        $IDSTablicyPL='i - 4';
        break;
    case 5:
        $IDSTablicy='NS_5';
        $IDSTablicyPL='i - 5';
        break;
    case 6:
        $IDSTablicy='NS_6';
        $IDSTablicyPL='i - 6';
        break;         
    case 7:
        $IDSTablicy='NS_7';
        $IDSTablicyPL='i - 7';
        break;
    case 8:
        $IDSTablicy='NS_8';
        $IDSTablicyPL='i - 8';
        break;
    case 9:
        $IDSTablicy='NS_9';
        $IDSTablicyPL='i - 9';
        break;
    case 10:
        $IDSTablicy='NS_10';
        $IDSTablicyPL='i - 10';
        break;
    case 11:
        $IDSTablicy='NS_11';
        $IDSTablicyPL='i - 11';
        break;
    case 12:
       $IDSTablicy='NS_12';
       $IDSTablicyPL='i - 12';
        break;
    case 13:
       $IDSTablicy='NS_13';
       $IDSTablicyPL='i - 13';
        break;
    case 14:
       $IDSTablicy='NS_14';
       $IDSTablicyPL='i - 14';
        break; 


}

a także piramidy if'ów

 
if ($Stacje['TD1E']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='1E';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
}

if ($Stacje['TD1W']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='1W';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
} 

if ($Stacje['TD2E']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='2E';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
}

if ($Stacje['TD2W']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='2W';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
} 

if ($Stacje['TD3E']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='3E';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
}

if ($Stacje['TD3W']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='3W';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
} 

if ($Stacje['TD4E']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='4E';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
}

if ($Stacje['TD4W']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='4W';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
} 

if ($Stacje['TD5E']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='5E';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
}

if ($Stacje['TD5W']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='5W';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
} 

if ($Stacje['TD6E']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='6E';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
}

if ($Stacje['TD6W']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='6W';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
} 

if ($Stacje['TD7E']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='7E';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
}

if ($Stacje['TD7W']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='7W';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
} 

if ($Stacje['TD8E']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='8E';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
}

if ($Stacje['TD8W']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='8W';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
} 

if ($Stacje['TD9E']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='9E';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
}

if ($Stacje['TD9W']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='9W';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
} 

if ($Stacje['TD10E']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='10E';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
}

if ($Stacje['TD10W']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='10W';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
} 

if ($Stacje['TD11E']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='11E';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
}

if ($Stacje['TD11W']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='11W';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
} 

if ($Stacje['TD12E']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='12E';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
}

if ($Stacje['TD12W']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='12W';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
} 

if ($Stacje['TD13W']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='13W';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
}

if ($Stacje['TD14W']['CzyAktywny'] == '1') {
	$IDVMSDSTAT='14W';
	include 'strony/funkcje/vmsy/vmsd/main-id-p-wp-1.php';
}

oraz takie

 if ($rek3['IDTablicy']=='NS_0') {
	$NazwaStacjiDA=$NazwaStacjiW0;
	$OdlegloscK=$Odleglosc;
}
if ($rek3['IDTablicy']=='NS_1') {
	$NazwaStacjiDA=$NS_1;
	$OdlegloscK=$Odleglosc + $L_1;
}

if ($rek3['IDTablicy']=='NS_2') {
	 $NazwaStacjiDA=$NS_2;
	 $OdlegloscK=$Odleglosc + $L_1 + $L_2;
}

if ($rek3['IDTablicy']=='NS_3') {
	$NazwaStacjiDA=$NS_3;
	$OdlegloscK=$Odleglosc + $L_1 + $L_2 + $L_3;
}

if ($rek3['IDTablicy']=='NS_4') {
	$NazwaStacjiDA=$NS_4;
	$OdlegloscK=$Odleglosc + $L_1 + $L_2 + $L_3 + $L_4;
}

if ($rek3['IDTablicy']=='NS_5') {
	$NazwaStacjiDA=$NS_5;
	$OdlegloscK=$Odleglosc + $L_1 + $L_2 + $L_3 + $L_4 + $L_5;
}

if ($rek3['IDTablicy']=='NS_6') {
	$NazwaStacjiDA=$NS_6;
	$OdlegloscK=$Odleglosc + $L_1 + $L_2 + $L_3 + $L_4 + $L_5 + $L_6;
}

if ($rek3['IDTablicy']=='NS_7') {
	$NazwaStacjiDA=$NS_7;
	$OdlegloscK=$Odleglosc + $L_1 + $L_2 + $L_3 + $L_4 + $L_5 + $L_6 + $L_7;
}

if ($rek3['IDTablicy']=='NS_8') {
	$NazwaStacjiDA=$NS_8;
	$OdlegloscK=$Odleglosc + $L_1 + $L_2 + $L_3 + $L_4 + $L_5 + $L_6 + $L_7 + $L_8;
}

if ($rek3['IDTablicy']=='NS_9') {
	$NazwaStacjiDA=$NS_9;
	$OdlegloscK=$Odleglosc + $L_1 + $L_2 + $L_3 + $L_4 + $L_5 + $L_6 + $L_7 + $L_8 + $L_9;
}

if ($rek3['IDTablicy']=='NS_10') {
	$NazwaStacjiDA=$NS_10;
	$OdlegloscK=$Odleglosc + $L_1 + $L_2 + $L_3 + $L_4 + $L_5 + $L_6 + $L_7 + $L_8 + $L_9 + $L_10;
}

if ($rek3['IDTablicy']=='NS_11') {
	$NazwaStacjiDA=$NS_11;
	$OdlegloscK=$Odleglosc + $L_1 + $L_2 + $L_3 + $L_4 + $L_5 + $L_6 + $L_7 + $L_8 + $L_9 + $L_10 + $L_11;
}


if ($rek3['IDTablicy']=='NS_12') {
	$NazwaStacjiDA=$NS_12;
	$OdlegloscK=$Odleglosc + $L_1 + $L_2 + $L_3 + $L_4 + $L_5 + $L_6 + $L_7 + $L_8 + $L_9 + $L_10 + $L_11 + $L_12;
}
if ($rek3['IDTablicy']=='NS_13') {
	$NazwaStacjiDA=$NS_13;
	$OdlegloscK=$Odleglosc + $L_1 + $L_2 + $L_3 + $L_4 + $L_5 + $L_6 + $L_7 + $L_8 + $L_9 + $L_10 + $L_11 + $L_12 + $L_13;
}

if ($rek3['IDTablicy']=='NS_14') {
	$NazwaStacjiDA=$NS_14;
	$OdlegloscK=$Odleglosc + $L_1 + $L_2 + $L_3 + $L_4 + $L_5 + $L_6 + $L_7 + $L_8 + $L_9 + $L_10 + $L_11 + $L_12 + $L_13 + $L_14;
}

@Edit à propos if gdzie są include z warunkiem 'CzyAktywny' jest jeszcze taki kawałek kodu przed nimi

        $wynik = mysql_query("SELECT * FROM Tablice WHERE CzyAktywny=1")
        or die("Błąd w zapytaniu!");
        $rek = mysql_fetch_array($wynik);
        
    
do {

		$Stacje[$rek['NazwaStacji']]['ZezwolNaTrybAuto'] = $rek['ZezwolNaTrybAuto'];
		$Stacje[$rek['NazwaStacji']]['CzyAktywny'] = $rek['CzyAktywny'];
				
		$Stacje[$rek['NazwaStacji']]['Tryb1'] = $rek['ModeS1'];
		$Stacje[$rek['NazwaStacji']]['CzasSekwencji1'] = $rek['CzasSekwencji1'];
		$Stacje[$rek['NazwaStacji']]['Znak1S1'] = $rek['Z1S1'];
		$Stacje[$rek['NazwaStacji']]['Znak2S1'] = $rek['Z2S1'];
		$Stacje[$rek['NazwaStacji']]['Znak3S1'] = $rek['Z3S1'];
		
		$Stacje[$rek['NazwaStacji']]['Tekst1S1'] = $rek['Tekst1S1'];
		$Stacje[$rek['NazwaStacji']]['Tekst2S1'] =  $rek['Tekst2S1'];
		$Stacje[$rek['NazwaStacji']]['Tekst3S1'] =  $rek['Tekst3S1'];
		
		
		$Stacje[$rek['NazwaStacji']]['Tryb2'] = $rek['ModeS2'];
		$Stacje[$rek['NazwaStacji']]['CzasSekwencji2'] = $rek['CzasSekwencji2'];
		$Stacje[$rek['NazwaStacji']]['Znak1S2'] = $rek['Z1S2'];
		$Stacje[$rek['NazwaStacji']]['Znak2S2'] = $rek['Z2S2'];
		$Stacje[$rek['NazwaStacji']]['Znak3S2'] = $rek['Z3S2'];
		
		$Stacje[$rek['NazwaStacji']]['Tekst1S2'] = $rek['Tekst1S2'];
		$Stacje[$rek['NazwaStacji']]['Tekst2S2'] =  $rek['Tekst2S2'];
		$Stacje[$rek['NazwaStacji']]['Tekst3S2'] =  $rek['Tekst3S2'];
		
		
		$Stacje[$rek['NazwaStacji']]['Tryb3'] = $rek['ModeS3'];
		$Stacje[$rek['NazwaStacji']]['CzasSekwencji3'] = $rek['CzasSekwencji3'];
		$Stacje[$rek['NazwaStacji']]['Znak1S3'] = $rek['Z1S3'];
		$Stacje[$rek['NazwaStacji']]['Znak2S3'] = $rek['Z2S3'];
		$Stacje[$rek['NazwaStacji']]['Znak3S3'] = $rek['Z3S3'];
		
		$Stacje[$rek['NazwaStacji']]['Tekst1S3'] = $rek['Tekst1S3'];
		$Stacje[$rek['NazwaStacji']]['Tekst2S3'] =  $rek['Tekst2S3'];
		$Stacje[$rek['NazwaStacji']]['Tekst3S3'] =  $rek['Tekst3S3'];
			
	   } while($rek = mysql_fetch_array($wynik));

0

W takiej jednej firmie klienta programista wypuszcza na świat 100 portów do komunikacji z urządzeniami, na prostych socketach i czyta przychodzące bajciki bez autoryzacji firewall etc. Jego wytłumaczeniem jest "i tak nikt nie zna protokołu komunikacji". Mnie brakło słów.

5

WTF wlasnej roboty. Usprawniam sobie prace robiac automatyzacje w bashu. W przypływie geniuszu nazwalem zmienna do przechowywania sciezki PATH. A potem stracilem godzine by znalezc dlaczego wiekszosc polecen zwraca not found (kilka skryptow wolanych kaskadowo wiec nie bylo widac na poerwszy rzut oka).

0

Trafiłem w Pythonie (3,6.0) na taki sposób tworzenia listy l, że efekt poleceń

random.shuffle(l)
l.sort()

jest losowy, a dokładniej, to metoda sort nie zmienia listy. Sposobu na razie nie podaję, może ktoś potraktuje to jako zagadkę.

1

@bogdans:

import random

class X:
    def __init__(self, x):
        self.x = x
    
    def __repr__(self):
        return str(self.x)

    def __lt__(self, other):
        return False

lst = [X(x) for x in range(10)]
random.shuffle(lst)
print(lst)
lst.sort()
print(lst)

Tylko po co ;)

0
  */
public class Configuration implements WebRobotConfigurable{
    
    public final HashMap<String, String[]> args;
    public static final String ARGS_HTML_ATTRIBUTES = "html_attributes";
    public static final String ARGS_INIT_URL = "init_url";
    public static final String ARGS_PREFIXES = "prefixes";
    public static final String ARGS_SUFIXES = "sufixes";
    public static final String ARGS_SPEED_MILISECONDS = "movement_speed";
    public static final String ARGS_TIME_LIMIT = "time_limit";
    public static final String ARGS_CONVERT_RELATIVE_PATHS = "relative_paths";
    
    @Override
    public String getInitURL() {
      return args.get(Configuration.ARGS_INIT_URL)[0];
    }
 
    public Configuration(Builder builder){
        this.args = builder.args;
    }
    
   public static class Builder{
         private HashMap<String, String[]> args = new HashMap();
    
    public Builder initURL(String url){
        this.args.put(Configuration.ARGS_INIT_URL, new String[]{url});
        return this;
    }
    
    public Builder htmlAtribbutes(String[] htmlAttributes){
        args.put(Configuration.ARGS_HTML_ATTRIBUTES, htmlAttributes);
        return this;
    }
    
      public Builder prefixes(String[] prefixes){
        this.args.put(Configuration.ARGS_PREFIXES, prefixes);
        return this;
    }
      
        public Builder suffixes(String[] sufixes){
        this.args.put(Configuration.ARGS_PREFIXES, sufixes);
        return this;
    }
        
        public Builder delay(int delay){
            this.args.put(Configuration.ARGS_SPEED_MILISECONDS, new String[]{Integer.toString(delay)});
            return this;
        }
        
        public Builder timeLimit(int limit){
            this.args.put(Configuration.ARGS_TIME_LIMIT, new String[]{Integer.toString(limit)});
            return this;
        }
       
        public Builder convertRelativePaths(boolean include){
            this.args.put(Configuration.ARGS_CONVERT_RELATIVE_PATHS, new String[]{Boolean.toString(include)});
            return this;
        }
        
        public Configuration build(){
            return new Configuration(this);
        }
 }

}

0

@0x200x20: dużo prościej i z wbudowanymi przeciążeniami:

g = [1, 1.0, True]
lst = 5*g
random.shuffle(lst)
lst.sort()
print(lst)

Wygląd posortowanej listy

[1.0, True, 1, 1, True, 1, True, 1, True, 1.0, True, 1.0, 1, 1.0, 1.0]

jest dość surrealistyczny

0

@fasadin: , nie. Jak Python nie wie jak porównać, to jest błąd wykonania:

>>> lst = [3,"3"]
>>> lst.sort()
Traceback (most recent call last):
  File "<pyshell#187>", line 1, in <module>
    lst.sort()
TypeError: '<' not supported between instances of 'str' and 'int'
0

Z kodu .netowego klienta CAS'a:

if (serviceResponse.IsAuthenticationFailure)
{
	try
	{
		AuthenticationFailure authFailureResponse = (AuthenticationFailure) serviceResponse.Item;
		throw new TicketValidationException(authFailureResponse.Message, authFailureResponse.Code);
	}
	catch
	{
		throw new TicketValidationException("CAS ticket could not be validated.");
	}
}
0

@fasadin: wtf jest w tym, ze w bloku try rzucany jest wyjatek, ktory jest od razu lapany przez catch, w ktorym rzucany jest kolejny, inny, wyjatek.

Rownie dobrze mozna bylo napisac:

 if (serviceResponse.IsAuthenticationFailure)
{
    throw new TicketValidationException("CAS ticket could not be validated.");
}

Efekt ten sam a o ile mniej kodu ;)

2

https://developer.apple.com/reference/security/1394733-seckeychaincopyaccess?language=objc

macOS 10.2+

	SecAccessRef access = NULL;
	result = SecKeychainCopyAccess(customKeychain, &access);
	if (result != errSecSuccess)
	{
		NSAssert(result != errSecUnimplemented, @"Documentation says about errSecUnimplemented: Function or operation not implemented.");
		return result;
	}

A zgadnijcie co się dzieje z tą asercją! A używam Mac OS 10.12!

1
var updateTranslator = new ContactUpdateTransformer()

0 użytkowników online, w tym zalogowanych: 0, gości: 0