Archive for the ‘programování’ Category

Ztracená hodina

Čtvrtek, Únor 7th, 2008

Právě jsem ztrávil téměř hodinu přemítáním nad tím, jestli je větší tupec PHP nebo já.

Měl jsem kód v tomto smyslu:

$a = array(
                1 =>"one",
                3 =>"two",
                5 => "three"
          );
foreach($a as $key=>&$val) {
        if($key == 3) {
                unset($a[$key]);
        } else {
                $val = 'changed';
        }
        unset($key, $val);

}
print_r($a);

Očekávaný výstup byl:

Array
(
    [1] => changed
    [5] => changed
)

ale já pořád dostával:

Array
(
    [1] => changed
    [5] => three
)

Když už jsem došel do stádia, kdy jsem byl přesvědčen, že větší blbec je PHP, otevřel jsem bugzillu PHP a po chvíli neuspěšného hledání stejné chyby jsem zakládal nový bug report.

Jeden z prvních údajů, které jsem ale musel vyplnit, bylo verze PHP. Používám 5.2.0, což je mimo jiné aktuálně i verze v Debian stable, což je náš hosting. Tato verze ale na výběr nebyla a byl jsem instruován upgradovat na 5.2.5. Pokorně jsem poslechl a stáhl 5.2.5. K mé zlosti se problém v této verzi už neobjevuje. Ani v changelogu jsem ale nenašel žádný záznam, který by se této chyby týkal.

Vzhledem k tomu, že Debian asi jen tak upgradovat nebude, budu muset najít nějaký způsob, jak to obejít.

C++ round

Sobota, Leden 19th, 2008

27. 1. 2008 Aktualizováno: Někdo mě emailem upozornil (za což děkuji), že moje řešení funguje pouze pro kladná čísla. Zde je řešení, které nabízí on (mírně upravené, aby fungovalo po pouhém Cut&Paste :-) ):

#include <cmath>
int function round(double num) {
  char sign = static_cast<char>(num/fabs(num));
  return static_cast<int>(sign* (fabs(num)+ 0.5));
}

Původně jsem zde vlastně měl funkci, která také fungovala dobře jak pro kladná, tak pro záporná čísla:

#include <cmath>
int function round(double num) {
  return static_cast<int>(floor(num+0.5));
}

(Celý příspěvek…)</in­t></cmath></in­t></char></cmat­h>

Vltava.cz ukládá hesla v plain textu

Úterý, Říjen 23rd, 2007

Vltava hesla v plain-text Internetový obchod www.vltava.cz ukládá hesla svých uživatelů v nezašifrované podobě. (Zjistit to jde například podle toho, že jsou ochotni vám zapomenuté heslo poslat emailem.)

Osobně nechápu, jak systém, velikosti www.vltava.cz může obsahovat tak amatérskou chybu a ještě ke všemu potencionální bezpečnostní díru.

Tajuplné MySQL

Pondělí, Září 24th, 2007

English version of this post available here

MySQL někdy dokáže překvapit. Teď jsem například narazil na toto: Mám tento SQL dotaz:

SELECT id, username, locked, c.*,
(SELECT COUNT(*)
FROM web_login_users
WHERE user=id AND (NOW()-last_action)<600) AS login_count
FROM web_users
LEFT JOIN web_user_information AS c ON (id=user)

Ten bez problému funguje a jako jeden ze sloupců se vrátí sloupec login_count. Chtěl jsem vybrat pouze řádky, kde je login_count větší než jedna. Intuitivně jsem zkusil toto:

SELECT id, username, locked, c.*,
(SELECT COUNT(*)
FROM web_login_users
WHERE user=id AND (NOW()-last_action)<600) as login_count
FROM web_users
LEFT JOIN web_user_information AS c ON (id=user)
WHERE login_count > 1

To ale nefunguje. MySQL hlásí, že nezná sloupec login_count.

Zajímavé je, že toto funguje:

SELECT id, username, locked, c.*,
(SELECT COUNT(*) FROM web_login_users
WHERE user=id AND (NOW()-last_action)<600) AS login_count
FROM web_users
LEFT JOIN web_user_information AS c ON (id=user)
ORDER BY login_count
Bude se to muset zřejmě obejít přes JOIN.

Po několika pokusech a konzultaci s kamarádem se vzdávám.

Pokus s JOIN

SELECT id, username, locked, c.*,
COUNT(login_users.user) AS login_count
FROM web_users
LEFT JOIN web_user_information AS c ON (id=user)
LEFT OUTER JOIN web_login_users AS login_users
ON (user=id AND (NOW()-last_action)<600)
WHERE login_count > 0

končí stejnou hláškou jako předešlé (Unknown column ‚login_count‘ in ‚where clause‘).

Toto se mi sice nelíbí, ale alespoň to funguje:

SELECT id, username, locked, c.*,
(SELECT COUNT(*) FROM web_login_users WHERE
user=id AND (NOW()-last_action)<600) AS login_count
FROM web_users LEFT JOIN web_user_information AS c ON (id=user)
WHERE (SELECT COUNT(*) FROM web_login_users
WHERE user=id AND (NOW()-last_action)<600) > 0