Skvělou MySQL funkcí, o které mnoho lidí neví, je GROUP_CONCAT. Ve skutečnosti jsem ji neznal já a přišla mi velmi vhod.

Jednoduchý příklad použití: Máme v tabulce statisíce, možná milióny řádků typu
Id  | ProductID  | Tag

Máme několik tagů u každého ProductId a chceme vypsat všechny Tagy pro vybrané ProductId.

Tohle u jednoho produktu snadno vyřešíme SELECTem. Pokud bychom ale chtěli vypsat v jedné tabulce všechny Produkty s jejich tagy, asi bychom to museli složit pomocí skriptu, možná nějak přes JOINT.

Ale právě k tomu je zde GROUP_CONCAT()

  1. SELECT `ProductId`,
  2. GROUP_CONCAT(DISTINCT `Tag` SEPARATOR ',') as tags
  3. FROM `keywords`
  4. GROUP BY ProductId

Výsledek pak vypadá nějak takto:

ProductID  Tags
1          reality,průmyslové,pronájem,skladování,sklady
2          software,blog,hardware,it,novinky,názory
3          kilimandžáro,afrika
4          hudba

Poznámka, nicméně důležitá. MySQL má nastavenu max. délku výstupního řetězce na 1024 znaků, určutě je vhodná vyšší hodnota.

  1. mysql_query("SET group_concat_max_len = 4096");
Hlasujte pro tento článek:
  • Bookmarky.cz
  • Digg
  • del.icio.us
  • Google
  • Linkuj
  • Vybrali.sme
  • E-mail this story to a friend!
  • Facebook
  • LinkedIn

Ta hrůza, když najednou zjistíte, že vaše aplikace vypadá v jiném DPI tak nějak rozmazaně. Co s tím?

1. vytvořit soubor dpiAware.manifest

  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  2. <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  3. <dependency>
  4. <dependentAssembly>
  5. <assemblyIdentity
  6. type="win32"
  7. name="Microsoft.Windows.Common-Controls"
  8. version="6.0.0.0"
  9. publicKeyToken="6595b64144ccf1df"
  10. language="*"
  11. processorArchitecture="*"/>
  12. </dependentAssembly>
  13. </dependency>
  14. <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
  15. <security>
  16. <requestedPrivileges>
  17. <requestedExecutionLevel
  18. level="asInvoker"
  19. uiAccess="false"/>
  20. </requestedPrivileges>
  21. </security>
  22. </trustInfo>
  23. <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
  24. <asmv3:windowsSettings
  25. xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
  26. <dpiAware>True/PM</dpiAware>
  27. </asmv3:windowsSettings>
  28. </asmv3:application>
  29. </assembly>

Nastavíme v rozbalovací nabídce Project options > Application > Runtime themes > Use custom manifest a v poli pod ním vložíme odkaz na náš nový soubor.

Teď ještě message handler, který nám zajistí, aby se změna rozlišení vyhodnocovala i za běhu programu.

  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Winapi.Windows, Winapi.Messages, Vcl.Controls, Vcl.Forms;
  7.  
  8. const
  9. WM_DPICHANGED = 736; // 0x02E0
  10.  
  11. type
  12. TForm1 = class(TForm)
  13. private
  14.    procedure WMDpiChanged(var Message: TMessage); message WM_DPICHANGED;
  15. public
  16. end;
  17.  
  18. var
  19. Form1: TForm1;
  20. implementation
  21. {$R *.dfm}
  22. {-$DEFINE DELPHI_STYLE_SCALING}
  23.  procedure TForm1.WMDpiChanged(var Message: TMessage);
  24. {$IFDEF DELPHI_STYLE_SCALING}
  25. function FontHeightAtDpi(aDPI, aFontSize: integer): integer;
  26.   var
  27.    tmpCanvas: TCanvas;
  28.   begin
  29.    tmpCanvas := TCanvas.Create;
  30.    try
  31.      tmpCanvas.Handle := GetDC(0);
  32.      tmpCanvas.Font.Assign(self.Font);
  33.      tmpCanvas.Font.PixelsPerInch := aDPI; //must be set BEFORE size
  34.      tmpCanvas.Font.size := aFontSize;
  35.      result := tmpCanvas.TextHeight('0');
  36.    finally
  37.     tmpCanvas.free;
  38.    end;
  39. end;
  40. {$ENDIF}
  41.  
  42. begin
  43.   inherited;
  44.   {$IFDEF DELPHI_STYLE_SCALING}
  45.     ChangeScale(FontHeightAtDpi(LOWORD(Message.wParam), self.Font.Size),
  46.     FontHeightAtDpi(self.PixelsPerInch, self.Font.Size));
  47.   {$ELSE}
  48.     ChangeScale(LOWORD(Message.wParam), self.PixelsPerInch);
  49.   {$ENDIF}
  50.   self.PixelsPerInch := LOWORD(Message.wParam);
  51. end;
  52. end.
Hlasujte pro tento článek:
  • Bookmarky.cz
  • Digg
  • del.icio.us
  • Google
  • Linkuj
  • Vybrali.sme
  • E-mail this story to a friend!
  • Facebook
  • LinkedIn

Tento kus MySQL dotazu v tabulce (kromě pár zbytečných hodnot které jsou tam jen pro názornost) by měl spočítat čas strávený na projektu nebo klientově webu. Počítá se jen čas mezi záznamy, který nepřesáhne např. 30 minut (já mám 01:30:00).
Stačí k tomu tabulku, kde logujeme čas a ip adresu.

  1. SET @last:=NULL;
  2. SELECT
  3. @last,
  4. dtime,
  5. if(TIMEDIFF(dtime,@last) < TIME('00:30:00'),TIMEDIFF(dtime,@last),0) as worktime,
  6. @last:=dtime
  7. FROM custsite_stats WHERE ip="86.115.160.9"
  8. ORDER BY id

Výsledek zřejmě bude třeba sečíst v PHP.
Pokud přijdete na to,jak to sečíst rovnou v MySql, je tady dole místo pro komentáře.

Update:
Čas je třeba sčítat pomocí ADDTIME(), výsledný dotaz vypadá takto:

  1. SET @before:=NULL;SET @cnt:=TIME('0:0:0');SET @threshold=TIME('0:30:0');
  2. SELECT
  3. @before,
  4. dtime,
  5. if(TIMEDIFF(dtime,@before) < @threshold,TIMEDIFF(dtime,@before),0) as `worktime`,
  6. @cnt:= ADDTIME (
  7.    @cnt,
  8.    if(TIMEDIFF(dtime,@before) < @threshold,TIMEDIFF(dtime,@before),0)
  9. ) as `sum`
  10. ,@before:=dtime
  11. FROM custsite_stats
  12. WHERE ip="86.115.160.9"
Hlasujte pro tento článek:
  • Bookmarky.cz
  • Digg
  • del.icio.us
  • Google
  • Linkuj
  • Vybrali.sme
  • E-mail this story to a friend!
  • Facebook
  • LinkedIn

Podpora SVG ve Windows

Jak si nastavit Windows 10, abychom mohli prohlížet .svg soubory?

Na rovinu, nativní podpora vektorového formátu je od Microsoftu stále nulová. Naštěstí nám jiní hodní a moudří programátoři připravili zdarma řešení. K tomu, abychom mohli běžně hledat a všelijak zacházet s obrázky ve formátu svg, si stačí stáhnout rozšíření pro explorer (nikoliv IE).

Instalační soubor najdete na https://svgextension.codeplex.com/

A co standalone aplikace?

Z free aplikací jsem zkusil FastStone, ale ten zůstal v minulém století.

Můžete ale přemluvit XnViewMP. Pokud se vám jej podaří asociovat na .svg, pak jej i zobrazí. Ale pokud po něm chcete katalogový náhled, najednou je to problém. Programátoři tam totiž nastavili blokování.

Najdete to v Settings > Browser > File list > Custom filter > Exclude, na konci seznamu. Hledá se to špatně, ale pak stačí odmazat poslední dva formáty. Radši se podívejte na obrázek.

xnview_svg_support_sm

Poznámka: Platí pro verzi XnViewMP 0.78, ve verzi (0.81) se SVG obrázky nezobrazují. V dalších verzích by to mělo být opraveno.

Elvis operátor – ?:

28. 11. 2015 | V kategorii PHP | Přidejte komentář

Elvis operátor je jen takové drobné vylepšení ternárního operátoru, které ovšem dokáže zpřehlednit kód, ale není vhodný úplně všude.
Prostě taková blbost. Ale líbí se mi ten smajlík s patkou.

  1. $varOne   = $_GET['var_one'] ?: null;
Hlasujte pro tento článek:
  • Bookmarky.cz
  • Digg
  • del.icio.us
  • Google
  • Linkuj
  • Vybrali.sme
  • E-mail this story to a friend!
  • Facebook
  • LinkedIn

další články »