Archiv rubriky: IT

Přidané GDI+ a rozpadlý build

Včera jsem si zase užil. Do poměrně základního hlavičkového souboru bylo přidáno

#include <gdiplus.h>

a společný build se lehce rozsypal. Zajímavé bylo, že zlobily zásadně starší projekty a chyby byly hlášeny v systémových headerech. Typ chyb byl dvojí.

t:\include\GdiplusImaging.h(22) : error C2065: 'ImageFormatUndefined' : undeclared identifier
t:\include\GdiplusImaging.h(22) : error C2501: 'DEFINE_GUID' : missing storage-class or type specifiers
t:\include\GdiplusImaging.h(22) : error C2078: too many initializers
t:\include\GdiplusImaging.h(23) : error C2065: 'ImageFormatMemoryBMP' : undeclared identifier
t:\include\GdiplusImaging.h(23) : error C2501: 'DEFINE_GUID' : missing storage-class or type specifiers
t:\include\GdiplusImaging.h(23) : error C2374: 'DEFINE_GUID' : redefinition; multiple initialization
        t:\include\GdiplusImaging.h(22) : see declaration of 'DEFINE_GUID'
t:\include\GdiplusImaging.h(23) : error C2078: too many initializers
t:\include\GdiplusImaging.h(24) : error C2065: 'ImageFormatBMP' : undeclared identifier
t:\include\GdiplusImaging.h(24) : error C2501: 'DEFINE_GUID' : missing storage-class or type specifiers
t:\include\GdiplusImaging.h(24) : error C2374: 'DEFINE_GUID' : redefinition; multiple initialization
        t:\include\GdiplusImaging.h(22) : see declaration of 'DEFINE_GUID'

příčina je celkem zřejmá, chybí definice makra DEFINE_GUID. Tímto byly postiženy projekty, které vznikly ještě ve Visual C++ 4.2 (nebo dokonce starším). V těch novějších totiž stdafx.h standardně obsahuje

#ifndef _AFX_NO_OLE_SUPPORT
#include <afxole.h>         // MFC OLE classes
#include <afxodlgs.h>       // MFC OLE dialog classes
#include <afxdisp.h>        // MFC Automation classes
#endif

což makro DEFINE_GUID definuje. Minimální include pro správné fungování nechávám P.T. publiku jako snadný domácí úkol.

Druhá chyba vypadala následovně

t:\include\GdiplusFlat.h(267) : error C2955: 'iterator' : use of class template requires template argument list
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\utility(71) : see declaration of 'iterator'
t:\include\GdiplusFlat.h(270) : error C2955: 'iterator' : use of class template requires template argument list
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\utility(71) : see declaration of 'iterator'
t:\include\GdiplusFlat.h(273) : error C2955: 'iterator' : use of class template requires template argument list
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\utility(71) : see declaration of 'iterator'
t:\include\GdiplusFlat.h(277) : error C2955: 'iterator' : use of class template requires template argument list
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\utility(71) : see declaration of 'iterator'
t:\include\GdiplusFlat.h(281) : error C2955: 'iterator' : use of class template requires template argument list
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\utility(71) : see declaration of 'iterator'
t:\include\GdiplusFlat.h(285) : error C2955: 'iterator' : use of class template requires template argument list
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\utility(71) : see declaration of 'iterator'
t:\include\GdiplusFlat.h(289) : error C2955: 'iterator' : use of class template requires template argument list
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\utility(71) : see declaration of 'iterator'
t:\include\GdiplusFlat.h(293) : error C2955: 'iterator' : use of class template requires template argument list
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\utility(71) : see declaration of 'iterator'
t:\include\GdiplusFlat.h(296) : error C2955: 'iterator' : use of class template requires template argument list
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\utility(71) : see declaration of 'iterator'
t:\include\GdiplusFlat.h(299) : error C2955: 'iterator' : use of class template requires template argument list
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\utility(71) : see declaration of 'iterator'
t:\include\GdiplusFlat.h(302) : error C2955: 'iterator' : use of class template requires template argument list
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\utility(71) : see declaration of 'iterator'
t:\include\GdiplusFlat.h(305) : error C2955: 'iterator' : use of class template requires template argument list
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\utility(71) : see declaration of 'iterator'
t:\include\GdiplusFlat.h(308) : error C2955: 'iterator' : use of class template requires template argument list
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\utility(71) : see declaration of 'iterator'
t:\include\GdiplusFlat.h(312) : error C2955: 'iterator' : use of class template requires template argument list
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\utility(71) : see declaration of 'iterator'
t:\include\GdiplusFlat.h(1438) : error C2955: 'map' : use of class template requires template argument list
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\map(140) : see declaration of 'map'

Řádky 266 a 267 souboru GdiplusFlat.h vypadají následovně

GpStatus WINGDIPAPI
GdipCreatePathIter(GpPathIterator **iterator, GpPath* path);

shnilého je něco s tím iterátorem. A skutečně, ve všech takto zasažených projektech se někde v jiných hlavičkách vyskytlo

using namespace std;

plus patřičný include headeru STL. A tam skutečně byl zaveden iterator coby templátová třída. V tomto případě bylo správným řešením odstranění tohoto poklesku (spíše zločinu) z patřičných headerů.
using namespace … nemá v hlavičkových souborech co dělat. Nikdy.

Rubriky: IT | Štítky: , | Napsat komentář

Modifikace WordPressu II.

Tak si zvykám na WordPress a dívám se co by kdyby. Od minulého reportu jsem udělal pár úprav.

  • Pohrál jsem si s linky v pravém sloupci. Udělal jsem tři rubriky, sport, umění a programování. Chtěl jsem aby se v tomto pořadí i vypsaly. Plugin k tomuto účelu jsem nenašel, tak jsem se ponořil do zdrojáku a
  • … rádcové našli. Za seznam odkazů je zodpovědná třída WP_Widget_Links definovaná v wp-includes/default-widgets.php a v její metodě widget() se volá funkce wp_list_bookmarks. A ta má dle reference přichystaný „parametr“ category_orderby s default hodnotou name (tím se potvrzuje můj názor, že by default je to podle abecedy), která může nabývat ještě hodnot id, slug a count a s trochou snahy je hodnota id přesně to, co jsem hledal. Tak jsem to maličko oháčkoval na

    wp_list_bookmarks(apply_filters('widget_links_args', array(
    'title_before' => $before_title, 'title_after' => $after_title,
    'category_before' => $before_widget, 'category_after' => $after_widget,
    'show_images' => $show_images, 'show_description' => $show_description,
    'show_name' => $show_name, 'show_rating' => $show_rating,
    'category' => $category, 'class' => 'linkcat widget',
    'category_orderby' => 'id'
    )));

    a voilà. Jenom mi vrtalo hlavou, co je to ten slug ordering. Ten slimák mi tam nějak nepasoval.
  • … tak jsem popátral a slug je vysvětlený tady (chtělo to lepší zadání do Googlu) a v kontextu, ve kterém to mám já, se to česky jmenuje Název v URL pro rubriku odkazů. A je to přesně to co potřebuji. Slugy jsem nastavil na 01-sport, 02-umeni, 03-programovani; ‚category_orderby‘ => ‚slug‘ a je to. Psal jsem o tom průběžně v českém fóru o WordPressu
  • Čistě ze cvičných důvodů jsem registroval blog do Toplistu a při té příležitosti jsem nasadil plugin toplist.cz
Rubriky: IT | Napsat komentář

Modifikace WordPressu I.

Zkusil jsem si trochu pohrát s WordPressem, abych ho dostal trochu do rukou. Postupně jsem udělal následující

  • Přešel jsem na hezká URL. Znamenalo to pro mě ručně vytvořit .htaccess, neb tam ještě žádný nebyl.
  • Nainstaloval jsem plugin Sidebar Login. Chtěl jsem u něj ještě v PHP odstranit avatara, ale je to slíbené coby konfigurace do některé z následujících verzí. Tak jsem to nechal tak.
  • Prošel jsem Lightroom a vyrobil pár výřezů vhodných jako banner. Formát 4.75 : 1 je docela problematický, škoda že nejsem Panoramix.
  • Na automatické změny banneru jsem použil plugin Twenty ten header rotator.

Pro tuto chvíli vše.

Rubriky: IT | 1 komentář

Adobe Lightroom a Google Picasa

Na zpracování digitálních a skenovaných analogových fotografií používám Adobe Lightroom a to už od jeho raných verzí. Tak nějak mi vyhovuje. Pokud bylo potřeba fotky publikovat, tak mi stačila schopnost Lightroomu generovat prezentace (do značné míry statické) a ty pak ftpovat na vlastní nebo firemní hosting. Primitivní, ale účinné. Z dlouhodobého hlediska se to ale dost blbě udržuje a navíc ten buzz kolem Web 2.0 (+, ++, +++) mě přivedl na myšlenku publikace na Google Picasa (zvlášť, když gmail už používám).

Zdali půjde nějak hladce spojit? Půjde. Jeffrey Friedl napsal plugin do Lightroomu a to i do verze 1.3+.

Co k tomu říct víc? Funguje to, díky Jeffe!

Rubriky: IT | Štítky: , | Napsat komentář

Upgrade WordPressu II.

Přišla nová verze WordPressu, čili je čas k upgradu. Pořád mám hosting se safe modem, takže jdeme jako minule. Stejně jako minule, největší problém je rekurentní mazání ftp adresářů. Protože nemám žádný vlastní obsah, tak zachovávám pouze soubor wp-config.php, jinak mažu vše a dělám čistou instalaci. První přihlášení po upgradu, upgrade databáze, vše se zdá být OK. Zdá. Při zobrazení hlavní stránky blogu dostávám … prázdnou stránku. Nepropadám panice a zjišťuji, že 3.0.1 nemá default templatu, kterou jsem používal, ale jedinou templatu twentyten. Když ji zvolím jako vybranou, blog se rozjíždí. Uff.

Bádám, jak bych mohl nahradit banner nějakým vlastním. Strýček Google pomáhá.

  1. Je potřeba vytvořit dva obrázky certoryje.jpg zvící 940*180 a certoryje-thumbnail.jpg o rozměru 230*48.
  2. Ty nahrát do wp-content/themes/twentyten/images/headers
  3. V wp-content/themes/twentyten je potřeba v souboru functions.php upravit
    register_default_headers( array(
    'berries' => array(
    'url' => '%s/images/headers/berries.jpg',
    'thumbnail_url' => '%s/images/headers/berries-thumbnail.jpg',
    /* translators: header image description */
    'description' => __( 'Berries', 'twentyten' )
    ),
    'cherryblossom' => array(
    'url' => '%s/images/headers/cherryblossoms.jpg',
    'thumbnail_url' => '%s/images/headers/cherryblossoms-thumbnail.jpg',
    /* translators: header image description */
    'description' => __( 'Cherry Blossoms', 'twentyten' )
    ),
    'concave' => array(
    'url' => '%s/images/headers/concave.jpg',
    'thumbnail_url' => '%s/images/headers/concave-thumbnail.jpg',
    /* translators: header image description */
    'description' => __( 'Concave', 'twentyten' )
    ),
    'fern' => array(
    'url' => '%s/images/headers/fern.jpg',
    'thumbnail_url' => '%s/images/headers/fern-thumbnail.jpg',
    /* translators: header image description */
    'description' => __( 'Fern', 'twentyten' )
    ),
    'forestfloor' => array(
    'url' => '%s/images/headers/forestfloor.jpg',
    'thumbnail_url' => '%s/images/headers/forestfloor-thumbnail.jpg',
    /* translators: header image description */
    'description' => __( 'Forest Floor', 'twentyten' )
    ),
    'inkwell' => array(
    'url' => '%s/images/headers/inkwell.jpg',
    'thumbnail_url' => '%s/images/headers/inkwell-thumbnail.jpg',
    /* translators: header image description */
    'description' => __( 'Inkwell', 'twentyten' )
    ),
    'path' => array(
    'url' => '%s/images/headers/path.jpg',
    'thumbnail_url' => '%s/images/headers/path-thumbnail.jpg',
    /* translators: header image description */
    'description' => __( 'Path', 'twentyten' )
    ),
    'sunset' => array(
    'url' => '%s/images/headers/sunset.jpg',
    'thumbnail_url' => '%s/images/headers/sunset-thumbnail.jpg',
    /* translators: header image description */
    'description' => __( 'Sunset', 'twentyten' )
    ),
    'certoryje' => array(
    'url' => '%s/images/headers/certoryje.jpg',
    'thumbnail_url' => '%s/images/headers/certoryje-thumbnail.jpg',
    /* translators: header image description */
    'description' => __( 'Certoryje', 'twentyten' )
    )
    ) );

    Je tam přidána poslední sekce (počínaje ‚certoryje‘) a předchozí čárka
  4. Pak už jen v administraci vzhled|záhlaví vybrat nový banner
Rubriky: IT | Napsat komentář