PHPmailer – problém s memory limitem

Při odesílání e-mailu s větší přílohou pomocí phpmaileru můžete narazit na situaci, kdy vám PHP ohlásí překročení povoleného množství paměti a skript se ukončí. Chybová hláška pak vypadá následovně:

Fatal error: Allowed memory size of 16777216 bytes exhausted
(tried to allocate 6123456 bytes)
in {........}/class.phpmailer.php on line 1262

Paměťový limit je 16 MB, skript jej celý vyčerpá.

Zjevným řešením by bylo navýšit paměťový limit v PHP. Ne vždy je tu ta možnost. Proto přichází na řadu řešení spočívající v úpravě zdrojového kódu phpmaileru.

Když se podíváte na řádek, označený v předchozí chybové hlášce, uvidíte tam něco takového:

$encoded = chunk_split(base64_encode($str), 76, $this->LE);

Tento kód vezme data z proměnné $str (4 MB), provede base64_encode, která data nafoukne na 5.3 MB, a takto upravená data předá funkci chunk_split, která udělá další kopii, přičemž za každý 76. bajt vloží ukončení řádku. Proměnná $encoded tak bude obsahovat něco kolem 5.9 MB dat. Když to všechno spočítáme, dostaneme se na 15.2 MB, což je 16 MB hranici nebezpečně blízko.

Přitom by stačilo využít toho, že není třeba uschovávat původní data. Předmětný řádek by se dal přepsat na:

$b64 = base64_encode($str);
unset($str);
$encoded = chunk_split($b64, 76, $this->LE);
unset($b64);

Pomocí unset()ů na druhém a čtvrtém řádku uvolníme proměnné, které již nepotřebujeme. Po prvním řádku zabereme 4 MB + 5,3 MB paměti. Po druhém řádku už jenom 5,3 MB (4 MB část smažeme). Po třetím řádku pak máme 5,3 MB + 5,9 MB s tím, že na čtvrtém řádku 5,3 MB opět uvolníme.

Nevýhodou zmíněného postupu je fakt, že si smažeme obsah proměnných $str a $b64. Pokud s těmito proměnnými chceme později pracovat, máme smůlu.

Zařazeno do kategorie PHP | Označeno štítkem , | Přidat komentář

Dokumenty Google – černá obrazovka

Pokud používáte tabulky (ala Excel) v Dokumentech Google, může se vám při použití Internet Exploreru ve verzi 8 stát, že oblast, ve které byste běžně viděli buňky a jejich obsah, nahradila jednolitá černá plocha.

Oprava je vcelku jednoduchá, stačí změnit nastavení zabezpečení v Internet Exploreru.

Otevřete menu Nástroje, položku Možnosti Internetu. Zvolte kartu Zabezpečení, klikněte na zónu Internet (obrázek zeměkoule), ve spodní části okna pak na tlačítko nadepsané „Vlastní úroveň…“. V otevřeném okně vyhledejte položku Ovládací prvky ActiveX a moduly plug-in a u podpoložky nadepsané Chování skriptů a binárních souborů zvolte možnost Povolit. Klikněte na OK a odsouhlaste provedení změn v zóně zabezpečení. Zavřete Možnosti Internetu a znovu načtěte stránku s tabulkou, problém by měl zmizet.

Zařazeno do kategorie Jak udělám? | Přidat komentář

Asus WL-520gC jako WiFi klient

Doma máme kabelový internet, který je po bytě šířen přes Wi-fi. Výhodou je dostupnost kdekoliv, nevýhodou je, že každý PC musí mít vlastní bezdrátový adaptér. Notebooky jsou v pohodě, ty mají adaptéry vestavěné, ale se dvěma stolními PC v pracovně byl problém. Nakonec se mi podařilo sehnat 2 adaptéry – jeden nějaký 802.11b do PCI a druhý Airlive WT-2000USB do USB. Nějakou dobu to fungovalo, rychlost nic moc. Přemýšlel jsem nad řešením a nakonec jsem se rozhodl pro bezdrátového klienta se switchem. „Hlavní“ router je Asus WL-520gU, takže jsem chtěl taktéž něco od Asusu. Vybral jsem jeden z nejlevnějších routerů, co mají – WL-520gC. Oproti modelu „gU“ nemá USB port, možná mu chybí i něco dalšího, ale to neřeším.

Router jsem připojil, chtěl nastavit režim klienta a zjistil jsem, že nevím jak na to. Trochu jsem pogooglil a na diskusním fóru CzC jsem se dočetl, že je potřeba neoriginální firmware a speciální nastavení. Firmware jsem našel na joyce.cz na stránce „Ke stažení„. Stáhl jsem soubor wl520gc-klientský-fw-s-regulací, rozbalil, nahrál do routeru. Následovalo nastavení podle přiloženého souboru:

1. [Wireless]->[Interface], nastavte SSID WL-520GC podle SSID rodičovského AP
2. [Wireless]->[Advanced], nastavte „Extended Mode“ na „Station“
3. [IP Config]->[WAN & LAN], nastavte „WAN Mode“ na „Disable, Automatic LAN IP“
4. [IP Config]->[WAN & LAN], nastavte „WAN Connection Type“ na „Automatic IP“

K tomu jsem doplnil body (kvůli připojení k hlavnímu routeru přes wifi):

5. [Wireless]->[Interface], nastavte Authentication Method na WPA-Personal-Auto, WPA Encryption na TKIP, vyplnit heslo.
6. [IP Config]->[DHCP Server], Enable: No
7. [IP Config]->[WAN&LAN]->LAN IP Setting->IP address: [192.168.2.1] (přičemž hlavní server má 192.168.1.1/255.255.255.0)

Nový router funguje jako WiFi klient – přeposílá požadavky z dvou počítačů z pracovny na hlavní router, který je buď posílá ostatním WiFi klientům a nebo do internetu přes kabel.

Zařazeno do kategorie Jak udělám? | Přidat komentář

Shánění televize

Od velkého stěhování v loňském květnu jsme byli bez televize. Nechyběla nám, po chvíli si i okolí zvyklo na to, že nemá smysl se nás ptát „viděli jste…?“. Přesto můj dlouhodobý plán s televizí počítal (spíše kvůli sledování filmů a zahraničních seriálů než Ordinací a Ulic). Po ustálení finanční situace na přelomu roku jsem se začal o aktuální nabídku více zajímat. Vzhledem k velikosti obýváku mi jako nejrozumnější volba přišla úhlopříčka 37″. Cenově jsem se chtěl vlézt do 18 tisíc korun.

K některým značkám nemám důvěru, takže jsem se zaměřil na výrobky Samsung, LG, Sony, Panasonic, Philips. Po rychlém porovnání parametrů jsem zjistil, že to zřejmě bude Samsung nebo LG, neboť ostatní značky přesahovaly vymezený cenový limit. Hned z kraje se největším favoritem stal Samsung LE37B650, který disponoval možností připojení k Internetu, přehrávání filmů (i HD) z USB, a také vestavěnými DVB-T a DVB-C tunery. Prozkoumal jsem nejrůznější zahraniční recenze, pročetl fóra na tvfreak.cz, diskuse na CzC a měl jsem jasno. Pak nastal druhý krok – podívat se na televizi v reálu. Obešel jsem pár obchodů, ale v 37″ nic. Viděl jsem jenom 32″ a 40″ model, kvalita obrazu mi přišla dostatečná, u 37″ jsem neočkával žádné odlišnosti.

Už ani nevím proč, ale rozhodl jsem se chvíli vyčkat, patrně kvůli možnosti poklesu cen. Očekávané se stalo skutečným a televize se dala pořídit o 1000 Kč levněji. Bohužel všichni „lepší“ (rozuměj zavedení) prodejci s možností vyzvednutí v Brně (mall.cz a T.S.Bohemia) deklarovali, že zboží není skladem, dodací lhůta neznámá. U mall.cz jsem vyplnil formulář pro hlídání dostupnosti. Po pár dnech mi přišel e-mail, že zboží je skladem. Než jsem stihl zareagovat (asi 15 minut), bylo již opět vyprodáno. Napsal jsem do T.S.Bohemia, odkud se ozvali, že předpokládají dodávku během týdne, ale že si mám zboží objednat. Nakonec jsem tak učinil a od té doby nic. V TSB o budoucích dodávkách nevěděli, technická podpora Samsung také nedokázala odhadnout datum.

Začal jsem se tedy poohlížet po něčem jiném ve stejné cenové kategorii. Moje pozornost se obrátila k LG 37LH7000 – nejvyšší model v dosluhující řadě ne-LED televizí. Parametrově podobný jak Samsung, akorát bez DVB-C tuneru a bez připojení k Internetu. DVB-C tuneru byla škoda, připojení k Internetu můžu řešit notebookem připojeným přes HDMI (a takto bych vlastně mohl i přehrávat filmy bez USB). Cena byla o dalších 1000 Kč nižší. Stejně jako dříve jsem ani tento model neviděl naživo (měli 32″ a 42″ modely). Zarazil mě také cenový rozdíl – v Euronicsu v brněnském Shopping parku měli 32″ model za 15990 Kč (stejná cena, jako u mall.cz za 37″), zatímco 37″ model se u nich dá pořídit za 25000 Kč (no nekupte to takhle výhodně!). Pokud vše dobře půjde, tak si TV dnes vyzvednu v brněnském výdejním místě na Baštách. Moc rád to tam nemám, špatně se tam parkuje. Během víkendu to pak dám do kupy – snad bude DVB-T tuner citlivější než ten v notebooku, novou anténu se mi kupovat nechce.

Zařazeno do kategorie E-shopy | Označeno štítkem , , | Přidat komentář

Broušení bruslí v Brně

Před nedávnem jsem si koupil brusle – v Gigasportu měli akci na Botas Crypton 161, dokonce i ve velikosti 47, takže nebylo co řešit. Rybník mám 200 metrů od domu. Nové brusle se nabroušené neprodávají. Na radu souseda jsem zajel do Rosic na zimní stadion, ale zřejmě ve špatnou dobu – nikdo nikde. O pár dní později jsem vymyslel akční plán – cestou z práce se stavit v nově vybudovaných hokejových halách na ul. Střední (naproti Boby centru). Na dotaz mi bylo odpovězeno, že pán, co brousí brusle, je momentálně na ledové ploše, a že si mám počkat. Po čtvrt hodince jsem vytočil číslo, uvedené na jejich stránkách a nesetkal se s žádnou odezvou. Protože již bylo kolem 15.00, zamířil jsem na kluziště na Vodovu, kde měli brousit právě od tří. Do areálu jsem byl vpuštěn zdarma (stánek s broušením je až za hlavní branou), vystál jsem krátkou frontu a pak nechal brusle nabrousit za 35 Kč/pár. Mohu tedy broušení bruslí na Vodově jen doporučit.

Zařazeno do kategorie Zkušenosti | Označeno štítkem , | Přidat komentář

Vlastní vyhledávač od Googlu – nezobrazování reklam konkurence

Někteří z vás určitě používají vyhledávač od googlu postavený na platformě Google Custom Search (GCS). Pokud nejste škola nebo neziskovka, musíte ve výsledcích vyhledávání zobrazovat reklamu. Pro šikovného konkurenta tak vytváříte místo, na které si může umístit svou reklamu a „krást“ vám zákazníky. Tomu lze naštěstí poměrně jednoduše zabránit. Služba GCS umožňuje propojit svůj účet s účtem Google AdSense. Pokud tedy takový máte, naklikáte si propojení, a ze zobrazovaných reklam vám poplynou nějaké drobné. Nyní se dostáváme k hlavnímu hřebu večera… Přes AdSense můžete také zakázat zobrazování některých reklam. V záložce AdSense Setup klikněte na Competitive Filter a do zobrazovaného políčka zadejte URL konkurentova webu. Od tohoto okamžiku se přestanou reklamy konkurenta zobrazovat.

Drobné upozornění: Pro provoz AdSense od 1. ledna 2010 musíte být registrován k DPH (protože poskytujete službu do jiné členské země EU).

Zařazeno do kategorie Jak udělám? | Označeno štítkem | Přidat komentář

Čeština v předmětu e-mailu (PHP)

Programátoři, kteří nevyužívají osvědčená řešení k posílání e-mailů (třeba phpmailer), občas narazí na problém s diakritikou (háčky, čárky) v předmětu e-mailu. Mají za to, že nastavení kódování v SMTP hlavičkách dostačuje. Předmět e-mailové zprávy se přenáší hlavičkami, jejichž kódování je omezeno na US-ASCII (tedy sedmibitové kódování, které neobsahuje žádné znaky s diakritikou). Pokud chceme v předmětu přenést diakritiku, využijeme rozšíření MIME, které definuje, jakým způsobem je možno v hlavičkách používat obsáhlejší znakové sady.

MIME určuje dva možné způsoby zápisu diakritiky do hlaviček. První je takzvaný „quoted-printable“, druhým pak „base64″. Obecný formát pro zápis je:

=?znaková sada?X?kódovaný text?=

kde „znaková sada“ určuje znakovou sadu původního textu (utf-8, windows-1250 atd.), X označuje, která ze dvou uvedených metod kódování byla použita (Q = quoted-printable, B = base64), a poslední částí je samotný text, zakódovaný uvedenou metodou.

Quoted-printable

Toto kódování přiřazuje každému bajtu vstupního textu tři bajty výstupu. Prvním znakem je rovnítko (=), následuje hexadecimální reprezentace ASCII kódu ukládaného znaku. Písmeno A se tedy zakóduje jako =41, písmeno Z jako =5A, písmeno á jako =E1. Aby nebyl kódovaný text zbytečně nafouknutý, stačí takto kódovat pouze znaky mimo rozsah tisknutelných znaků US-ASCII (tedy znaky s ordinálními hodnotami od 33 do 126), pochopitelně s výjimkou rovnítka, které se kódovat musí.

Vícebajtové znaky vícebajtových kódování (např. UTF-8) se zapisují po jednotlivých bajtech – český znak s diakritikou v UTF-8 tedy vyprodukuje =XY=XZ (tedy 6 znaků).

V PHP se dá quoted-printable vyrobit pomocí funkce imap_8bit(), celý předmět pak například pomocí
$predmet = "=?utf-8?Q?".imap_8bit($predmet)."?=";

kde $predmet je řetězec v UTF-8.

Base64

Toto kódování převádí posloupnost tří osmibitových znaků na čtyři znaky s šestibitovým kódováním. Výsledný text tedy není jednoduše čitelný (na rozdíl od quoted-printable, které se většinou dá dekódovat pouhým pohledem). V PHP nám k tomuto účelu poslouží funkce base64_encode(). Celý kód pro řetězec v UTF-8:

$predmet = "=?utf-8?B?".base64_encode($predmet)."?=";

Zařazeno do kategorie PHP | Označeno štítkem , | Počet komentářů: 2

Archlinux – mySQL – Table ‘mysql.servers’ doesn’t exist

Pokud se vám při úpravě oprávnění a jejich znovunačtení stane, že si mySQL postěžuje na neexistující tabulku mysql.servers, doporučuji provést jednoduchou opravu. Přesné umístění opravného skriptu se může distribuci od distribuce lišit, níže popsaný postup funguje v ArchLinuxu:

/usr/bin/mysql_fix_privilege_tables --password=hesloroot

Tím dojde k aktualizaci systémových tabulek mysql do podoby vyžadované aktuální verzí.

Zařazeno do kategorie MySQL | Označeno štítkem , | Přidat komentář

Nefunguje PHP skript spuštěný přes příkazový řádek

Máte skript, který běžně spouštíte přes prohlížeč a vše nádherně funguje. Jednoho dne si třeba řeknete, že by bylo pěkné spouštět tenhle skript automaticky třeba pomocí CRONu. Cron nastavíte, skript se spustí, ale nefunguje (například se nepřipojí k databázi). Čím to je?

Za prvé – musíte includovat nějaký soubor (v našem příkladu třeba s nastavením přihlašovacích údajů k databázi).

Za druhé – musíte tento soubor includovat pomocí relativní cesty (tzn. např. include './nastaveni.php';).

V čem tedy vězí problém? Skript spouštěný přes konzoli (přes CLI verzi PHP) nevezme jako aktuální adresář ten, ve kterém je umístěn skript, nýbrž ten, který mu předá shell. PHP tedy nemůže najít includovaný soubor (protože se dívá do špatného adresáře) a include selže.

Jak z toho ven? Je to jednoduché. Používejte absolutní adresování, nejlépe založené na skutečném umístění souboru. Konkrétně tedy například

include './nastaveni.php';

nahraďte za

include dirname(__FILE__).'/nastaveni.php';

A vše poběží tak, jak má.

Zařazeno do kategorie PHP | Označeno štítkem | Přidat komentář

Obnova dat / záchrana dat

Snad většina uživatelů se již setkala s tím, že se buď jim samotným nebo nějakým známým, ztratila data v důsledku poruchy počítače. Ať už se jedná například o firemní korespondenci disku, nebo třeba fotky z dovolené na paměťové kartě, nemusí být ztráta vždy definitivní. Existují v zásadě dvě možnosti, jak situaci řešit. Ta první je spíše pro pokročilejší uživatele a pro ty, jejichž data nemají takovou hodnotu, aby zaplatili nemalou částku za obnovu dat nějaké firmě. Tím se dostáváme ke druhé možnosti, kterou je využití služeb specializovaných firem na obnovu dat z poškozených disků nebo paměťových karet.

První varianta spočívá ve dvou krocích:

1) pokud možno zazálohovat obsah paměťové karty nebo disku (pro případ, že bychom data na disku pokusem o obnovu poškodili ještě více, můžeme si zpět nahrát tuto zálohu a zkusit to znovu jiným způsobem) – pro tento účel je vhodné použít některý z programů pro vytvoření bitové kopie disku (nebo jen konkrétního oddílu/partition) – v linuxu třeba program dd.

2) v závislosti na typu poškození a typu souborového systému zvolíme vhodný program. Pro začátek může stačit třeba chkdsk, který se standardně distribuuje s Windows a umí pracovat se souborovými systémy FAT, FAT32 a NTFS. Na menší poškození, které se dají vyřešit nalezením a zpracováním kopie tabulky FAT nebo MFT, obvykle stačí. Pokud tomu tak není, tak je vhodné využít některý ze specializovaných programů – třeba NTFS Recovery od DiskInternals. V případě, že se nám nepodaří úspěšně obnovit data z disku, přehrajeme na disk zálohu, kterou jsme vytvořili v bodě 1 a zkusíme jiný program.

Pokud si na obnovu svépomocí netroufáme, nebo jde-li zjevně o hardwarovou chybu disku, přenecháme raději záchranu dat specializovaným firmám. Ty obvykle disk analyzují, a na základě analýzy stanoví cenu za obnovu dat na disku. Tyto firmy můžeme nalézt např. pomocí Googlu. Může být vhodné při hledání přidat do hledaného výrazu i vaše umístění, abyste nemuseli disk posílat poštou ani jej vozit někam daleko. Pro mě by vhodné výrazy pro hledání mohly být:

  • obnova dat Brno
  • záchrana dat Brno
  • záchrana harddisku
  • obnovení smazaných dat

Na závěr vám přeji, ať tyto starosti nikdy nemusíte řešit a připomínám základní pravidlo: zálohovat, zálohovat, zálohovat!

Zařazeno do kategorie Jak udělám? | Označeno štítkem | Přidat komentář