Poměr bílé barvy v obrázku v php

Následují kus kódu udělá přesně to, co je v nadpisu. Prakticky převede obrázek (jpg) do 256 barev, projde pixel po pixelu a zjistí jejich barvy. Pokud je bílá (s nějakou malou rezervou), tak se zaznamená. No a na konec se vypočte poměr vůči všem pixelům.

Před vlastní aplikací doporučuji, pokud je obrázek příliš velký, jeho zmenšení. Mělo by stačit v pohodě maximálně 1000px na delší stranu.

$tmp = imagecreatefromjpeg($file);
$width = imagesX($tmp);
$height = imagesY($tmp);
$pixels = $width * $height;
imagetruecolortopalette($tmp, false, 256);
$white = 0;
for ($i=0;$i<$height;$i++) {
  for ($j=0;$j<$width;$j++) {
    $rgb=imagecolorsforindex($tmp,imagecolorat($tmp,$j,$i));
    if ($rgb['red']>=245 && $rgb['green']>=245 && $rgb['blue']>=245) {
      $white++;
    }
  }
}
$ratio = round($white/$pixels*100);

libmariadb-dev ubuntu 20.04

Pokud se snažíte instalovat knihovnu mariadb do pythonu, a nelze to, tak může být problém v knihovně libidn2-0 verze 2.3.0-1.

Pokud vidíte při spuštění

sudo apt-cache policy libidn2-0

toto

tedy, že máte instalovanou verzi 2.3.0-1, nainstalujte si verzi 2.2.0-2

sudo apt-get install libidn2-0=2.2.0-2

Všechny příkazy za sebou

sudo apt-get install libmariadb3
sudo apt-get install libidn2-0=2.2.0-2
sudo apt-get install libmariadb-dev
sudo pip3 install mariadb

Pokud vám v pythonu nebude fungovat připojení, mrkněte se, jakým způsobem se hlásíte do databáze. Pokud vidíte něco jiného než mysql_native_password, změňte to

sudo mysql -u root -p
SELECT User, Host, Plugin FROM mysql.user;
UPDATE mysql.user SET plugin = 'mysql_native_password' WHERE User='your_db_login_name';
FLUSH PRIVILEGES;

Bez záloh do upgradu nelez

To si tak provádíte upgrade Ubuntu 18.04.5 LTS na 20.04.1 LTS přes terminál, a vše jede jak po drátkách. Při aktualizaci mariadb databáze mrknete na rozdílové configy, a odklepnete, aby systém ponechal stávající. A pak se objeví toto:

Konfigurační soubor „/etc/mysql/mariadb.conf.d/50-server.cnf“
 ==> Od doby instalace byl změněn (vámi nebo skriptem).
 ==> Distributor poskytl upravenou verzi.
   Co s tím chcete udělat ? Možné volby jsou:
    Y nebo I : nainstalovat verzi z balíku
    N nebo O : ponechat současnou verzi
        D    : zobrazit rozdíl mezi verzemi
        Z    : spustit shell a prozkoumat situaci
 Výchozí akcí je ponechání současné verze.
*** 50-server.cnf (Y/I/N/O/D/Z) [předvoleno=N] ? 
this is very strange!  see /tmp/mysql-symlink-restore-e1Njxz/README...

Říkám si OK, this is very strange. Ale ignoruju, protože instalace pokračuje rychle dál a řádek se pousouvá z dohledu. Vše se úspěšně dokončilo. Aspoň na první pohled.

Další den se přihlašuji k databázi a nějak moc to nefunguje. Do řiti! Kam zmizely všechny databáze? Jo kurva, je to strange. Ani vidu, ani slechu. Prostě se doslova vypařily. V logu nevidím kromě toho strange řádku nic podezřelého.

Naštěstí si držím na druhém disku zálohy všech databázi, aktualizované vždy v noci. Takže ve finále se zas tak moc nestalo. Holt jsem udělal kompletní obnovu. Na developer mašině je to cajk.

A co si z toho vzít? Bez záloh do upgradu nelez!

Jak odstranit emoji

Objevila se u mne potřeba ošetřit uživatelské texty tak, aby neobsahovaly emoji a podobné patvary, které umožňuje UTF-8 kódování. Pár napsaných funkcí jsem objevil, ale nic, co by bylo bezchybné. No a tak jsem přemýšlel co s tím, a netrvalo dlouho, a předkládám vlastní řešení.

Je to jednoduché. Stačí uživatelský vstup v UTF-8 převést do kódování WINDOWS-1250 a zpět, s příznakem IGNORE. Veškerý bordel, který WINDOWS-1250 neumí, se ztratí. Hotovo, dobrá práce :)

function remove_emoji($vstup=null) {
	$vystup=iconv("UTF-8","WINDOWS-1250//IGNORE",$vstup);
	$vystup=iconv("WINDOWS-1250","UTF-8",$vystup);
	return $vystup;
}

Chrome zmenšování obrázků

Chrome ve windows je tak trochu retard. Ve výchozím nastavení zmenšuje obrázky tak, že se mohou jevit jako rozmazané. V žádném jiném prohlížeči se to neděje.

Pokud tedy po něm potřebujete zobrazovat obrázky v jiné velikosti, než v jaké máte zdroj, je zapotřebí přidat do CSS toto:

img {
  image-rendering: -webkit-optimize-contrast;
}

Zabrání to tomu extrémnímu rozmazání, a přitom to pořád bude vyhlazené a nebude to rozpixelované.

Bohužel, toto řešení však negativně ovlivní safari na macu (kvůli stejnému webkit jádru), kdy naopak při změně obrázků k žádnému vyhlazování nedochází anebo jen minimálně, takže je nutné tento zásah omezit jen pro chrome. Na řadu tedy přichází CSS hack:

@media all and (-webkit-min-device-pixel-ratio:0) and (min-resolution: .001dpcm) {
  img {
    image-rendering: -webkit-optimize-contrast;
  }
}

Snad to bude nějakou dobu fungovat.

Gitlab si smazal produkční databázi

Někdo ve firmě Gitlab (padáka prý nedostane) udělal rm -rf na produkční databázi, tzn. smazal všechna data z ní…to se stát mě, tak to si pomalu hodím. Zálohu měli 6 hodin starou a tu dělali ručně kvůli nějakému útoku, který aktuálně řešili a který jim zatížil systém. Kdyby ji předtím ručně neudělali, tak jsou v řiti úplně, protože jim automatické zálohy nefungovaly správně, fail jak prase. A to těch automatických záloh dělali více různými metodami, ani jedna z nich neprodukovala korektní data. Mazec!

Pozitivní je přístup, kterým to firma řešila. Pravidelné informování o stavu (v dokumentu na google docs a na twitteru), v jakém se nálézá oprava a obnovat dat. Videostream (!), ve kterém několik lidí systém opravovalo a reagovalo na lidi v chatu.

Co si z toho vzít? Že na kritická data je ideální používat online mirror databáze, kdy se budou data replikovat a v případě podobného průseru nebude po obnově tak velká časová díra. Pokud toto není možné, tak dělat nějaké dumpy databáze co nejčastěji to bude možné. Aspoň co hodinu? Pokud je db velká nebo chceme šetřit výkon, tak alespoň kritické tabulky (u eshopu asi hlavně objednávky, stavy zboží skladu).

Ale hlavně, kontrolovat pravidelně, jestli zálohy fungují  v pořádku! Protože bez toho vám to bude na dvě věci…viz gitlab ;) Výpadek téměř celý den a záloha stará 6 hodin.

Stahování obrázků z pinterestu

Následující skript je jednoduchý parser, který dokáže stáhnout obrázky z nástěnky jakéhokoliv pinterest účtu spolu s odkazem na detail obrázku.

Nejprve funkce, která ukládá obrázky do adresáře temp.

function ulozobrazek($novynazev,$url,$sirka,$maxvyska=0) {
  $adresa=false;
  $urlbez=preg_replace('/\\?.*/', '', $url);
  $ext=str_replace('.','',strrchr($urlbez,'.'));
  $ext=strtolower($ext);
  if ($pos=strpos($ext,"?")) $ext=substr($ext,0,$pos);
  $novy="tmp_".$novynazev.".".$ext;
  if ($ext=="jpg" || $ext=="jpeg" || $ext=="gif" || $ext=="png") {
    @$file=fopen($url,"rb");
    if ($file) {
      $fc=fopen("temp/$novy","wb");
      while (!feof($file)) { 
        $line=fread($file,8192); 
        fwrite($fc,$line); 
      } 
      fclose($fc);
      $sku=exif_imagetype("temp/$novy");
      switch ($sku) {
        case 1:	// IMAGETYPE_GIF
          $opr="gif";
        break;
        case 2:	// IMAGETYPE_JPEG
          $opr="jpg";
        break;
        case 3:	// IMAGETYPE_PNG
          $opr="png";
        break;
        default:
          $opr=$ext;
        break;
      }
      if ($ext!=$opr) $ext=$opr;
      $novynazev=$novynazev.".jpg";
      if ($ext=="jpg") {
        $im=imagecreatefromjpeg("temp/$novy");
      } elseif ($ext=="gif") {
        $im=imagecreatefromgif("temp/$novy");
      } elseif ($ext=="png") {
        $im=imagecreatefrompng("temp/$novy");
      }
      $im_width=imagesx($im);
      $im_height=imagesy($im);
      $vyska=round($im_height*$sirka/$im_width);
      if ($maxvyska>0 && $vyska>$maxvyska) {
        $sirka=round($sirka/$vyska*$maxvyska);
        $vyska=$maxvyska;
      }
      $new_im=imagecreatetruecolor($sirka,$vyska);
      imagecopyresampled($new_im,$im,0,0,0,0,$sirka,$vyska,$im_width,$im_height);
      imagedestroy($im);
      imagejpeg($new_im,"temp/".$novynazev,80);
      @unlink("temp/".$novy);
      return("temp/".$novynazev);
    }
  }
  return($adresa);
}

A následuje skript, který uloží posledních 12 pinů z nástěnky uživatele pinterest (https://cz.pinterest.com/pinterest/pins/) jako obrázky a vrátí řetězec obrázků s odkazy v proměnné $data.

$data = '';
$subject = file_get_contents('https://cz.pinterest.com/pinterest/pins/');
$pattern = '/\"orig\": \{\"url\": \"(.*?)\", \"width\":/si';
preg_match_all($pattern, $subject, $matches);
$i=0;
foreach ($matches[1] as $item) {
  $item=str_replace("\\","",$item);
  $nazevobrazku=time().$plusobrazek;
  $nazevobrazku="pinterest_".sha1($nazevobrazku);
  $plusobrazek++;
  $vratobrazek=ulozobrazek($nazevobrazku,$item,100);
  if ($vratobrazek) {
    list($sirka,$vyska)=getimagesize($vratobrazek);
    $data .= '<a href="https://cz.pinterest.com/pinterest/pins/" target="_blank"><img src="' . $vratobrazek . '" style="width:'.$sirka.'px;height:'.$vyska.'px;margin-bottom:5px;"></a>';
    $i++;
    if ($i==12) break;
  }
}

Volání funkce ulozobrazek si můžete upravit a nastavit potřebnou maximální šířku, případně i výšku uloženého obrázku.

Swiftmailer dvojité tečky (double dot)

Pokud jste si oblíbili pro odesílání emailů knihovnu swiftmailer, možná jste při rozesílce hromadných emailů narazili na problém tzv. double dot.

Projevuje se to tak, že v rámci odesílacího cyklu při každém druhém a dalším emailu se nahradí tečka dvěmi tečkami na začátku každého řádku začínajího právě tečkou. Pokud do emailu vkládáte css styly, tak je velmi pravděpodobné, že se vás to dotýká. Aktuálně funguje následující kus kódu, který stačí vložit do odesílacího skriptu.

Swift_Preferences::getInstance()->setCacheType('null');

Zvýraznění výsledků vyhledávání

Jednoduchá funkce pro zvýraznění výsledků ve vyhledávání. Všechny nálezy označí třídou marked.

function highlightStr($needle,$haystack) {
    if (strlen($haystack) < 1 || strlen($needle) < 1) {
        return $haystack;
    }
    preg_match_all("/$needle+/i", $haystack, $matches, PREG_SET_ORDER);
    if (is_array($matches[0]) && count($matches[0]) >= 1) {
        foreach ($matches[0] as $match) {
            $haystack = str_replace($match, '<span class="marked">'.$match.'</span>', $haystack);
        }
    }
    return $haystack;
}

Načítání recenzí z heureky

Pokud chcete na eshop načítat recenze obchodu z heureky, můžete použít mnou vytvořený skript, který se o vše postará. Součástí jsou také obrázky hvězdiček a css soubor pro zobrazení na stránkách.

Celé to funguje tak, že se nejprve stáhne XML soubor z heureky (je zapotřebí nejprve nastavit v souboru heureka-recenze.php URL), ten se celý projde a rozparsuje, a následně se data uloží do textových souborů. Můžete si to vše upravit, aby se to nahrávalo do databáze. Pro každý rok se vytváří jeden textový soubor, ten pak stačí includovat do stránky.

Načítání se spouští přes soubor heureka-recenze.php, doporučuji dát do cronu jednou denně. Adresáři heureka_recenze nastavte právo zápisu (777). A tady je to celé ke stažení.