Ma is tanultam valami újat

Ma megtanultam, hogy hogyan lehet úgy jogosultságot állítani, hogy csak a fájlokra vagy csak a könyvtárakra legyen érvényes a változtatás

find /konyvtar/eleresi/utvonala -type f -print0 | xargs -0 chmod 664

A /konyvtar/eleresi/utvonala alatt szereplő minden állomány jogosultságát 664-re állítja; a tulajdonos és a csoport is írhatja olvashatja a fájlokat, mindenki más csak olvashat.

find /konyvtar/eleresi/utvonala -type d -print0 | xargs -0 chmod 775

Ugyanazon az elérési út alatt található könyvtárakat mindenki megnyithatja és olvashatja, de írni csak a tulajdonos és a csoport írhatja.

Tisztább, szárazabb, gyorsabb mint MC-ben végigmászni minden könyvtáron.

Safari és a #:#kKsw#:#charset szabály

Akkor a mai napon egy életre megtanultam, hogy a Safari nem ismeri/nem érti a CSS #:#kKsw#:#charset szabályt. Ezzel a szabállyal értelmezési hibába fut bele, emiatt a következő szabályok értelmezésével is problémák lesznek.

Először csak az tűnt fel, hogy az #:#kKsw#:#import-al behúzott további CSS-ek egyszerűen nem érvényesülnek az oldalon, de a barátom volt, és egy 2008 márciusi fórum téma rávilágított, hogy Webkit hiányosságáról.

Hogy mi is az a Dropbox és mire is használható?

Délután kiküldtem néhány Dropbox meghívót. Pár perc múlva nekem is szegeződöt a kérdés: “Szóval mire való ez a Dropbox?” Hát íme a válasz:

Dropbox logoA Dropbox által nyújtott szolgáltatás lényegében egy pendrive, pendrive nélkül. Egy kicsi kliens programot kell telepíteni arra a gépre ahonnan használni szeretnéd a szolgáltatást. Telepítés után a felhasználó könyvtárában létrejön egy Dropbox, My Dropbox, vagy valami hasonló nevű könyvtár (az elnevezés és a hely – amennyire láttam – függ az operációs rendszertől, és a kliens beállításoktól). Amit beleteszel valamit, akkor az rövid időn belül feltöltődik egy szerverre. A szerver azon részéhez csak te férsz hozzá, illetve azok, akikkek egy-egy alkönyváradat megosztottad.

A feltöltés sebessége, természetesen függ a sávszélességedtől. Minden olyan gépen, ahol szintén telepítve van a kliens szoftver (és be vagy jelentkezve vele), amint érzi, hogy frissülés van, azonnal elkezdi a szinkronizációt.

A regisztráció után rendelkezésre álló tárhely mérete 2Gb, ami bővül, ha meghívsz más felhasználókat, vagy ha anyagilag támogatod a szolgáltatást (magyarul fizetsz pénzt). Tapasztalatom szerint a mindennapi használat során ez a 2Gb több mint elég.

A cégen belül használjuk kb. fél éve, layout-ok, és főleg dokumentumok megosztására. Eddig szinte csak beledobáltuk a dolgokat (értsd: még nem nagyon kellett törölni semmit), most járunk kb 460M foglaltságnál.

Használat során  arra figyelni kell, hogy minden változás a gépen levő Dropbox mappában azonnal szinkronizálódik a szerverrel, ahonnan (elméletileg) van “undelete” (visszaállítás) funkció, de még ezt nem próbáltam hogy működik-e.

Ha másik gépről akarod elérni a cuccaidat, akkor nem feltétlen kell telepíteni a klienst, a webes felületen keresztül is le tudod kapkodni a dolgokat.

Számora az egyik leghasznosabb az egészben, hogy pl. egy 20×20-as képért nem kell e-mail klienst nyitni levelet írni, címezni, csatolni,  csak bevágom a megosztott mappába, és egyből meg is kapja akire tartozik.

Drupal submit gombok cseréje

Elég sokszor belefutottam már Drupal smink készítésekor, hogy az űrlapok elküldésére szolgáló “Beküldés” gombot is formázni kell. Az legegyszerűbb eset, amikor egyszerű színezésről van szó. Ha fix szélességű gombokkat szeretnénk látni, akkor egy háttérkép beállításával bármilyen bonyolult formázás “megvalósítható”. Viszont most változó szélességű gombok szerepelnek a tervben, lekerekített szélekkel.

Persze megint elkezdtem egyenként felülírni az űrlapokat, amit kissé körülményesnek éreztem. És, mivel, az oldalon szereplő minden gombot így kell formázni, kicsit jobban megvizsgáltam a kódot, és felfedeztem, hogy megváltoztatható az alapértelmezett működés. A smink template.php végére írtam a következőt:

function phptemplate_button( $element ) {
	// Make sure not to overwrite classes.
	if ( isset( $element[ '#attributes' ][ 'class' ] ) ) {
		$element[ '#attributes' ][ 'class' ] =
			'form-'.$element[ '#button_type' ].' '.
			$element[ '#attributes' ][ 'class' ];
	}
	else {
		$element[ '#attributes' ][ 'class' ] =
			'form-'.$element['#button_type' ];
	}

	$name = ( empty( $element[ '#name' ] ) ? '' : 'name="'. $element[ '#name' ] .'" ' );
	$value = check_plain( $element[ '#value'] );
	$attribs = drupal_attributes( $element[ '#attributes' ] );

	return
		'<button type="submit" value="'.$value.'">'.
		'<span>'.$element[ '#value' ].'</span></button>';
}

Extra CSS classok beállítása WordPress widgetekre

Többször is felmerült már, egy-egy WordPress sablon fejlesztésekor, hogy a widget-eket, a sidebar regisztrálásakor megadott CSS osztályok mellet, további osztályokkal is felruházzam. Jó lett volna megjelölni pl. az elsőt, az utolsót, vagy minden másodikat, harmadikat. A legutolsó munkámnál egyszerűen nem találtam kerülő megoldást, elengedhetetlenné vált ennek a megvalósítása.

A WP widgetekért felelős kódjait végigbogarászva bukkantam a dynamic_sidebar_params filter tag-ra. Ezen a ponton lehet a widget-ek által is megkapott paramétereken szűrő függvényeket futtatni. Lássuk a kódot:

<?php
function widget_param_filter( $params ) {
    $id = $params[0]['id'];
    static $counter;
    static $counts;
    if ( is_null( $counter ) ) {
        $counter = array();
    }
    if ( is_null( $counts ) ) {
        $counts = array();
        $sidebars_widgets = wp_get_sidebars_widgets();
        foreach ( $sidebars_widgets as $sidebar_id => $widgets ) {
            $counts[ $sidebar_id ] = count( $widgets );
        }
    }
    if ( !isset( $counter[ $id ] ) ) {
        $counter[ $id ] = 0;
    }
    $count = $counter[ $id ];
    $class = array();
    $m = array();
    $alowedQuotes = "['\"]";
    if ( preg_match( '/\sclass=('.$alowedQuotes.')(?P<class>.*?)\\1/', $params[0]['before_widget'], $m ) ) {
        $class = array( $m['class'] );
    }
    if ( $count == 0 ) {
        $class[] = 'first';
    }
    if ( $count + 1 == $counts[ $id ] ) {
        $class[] = 'last';
    }
    $class[] = ( $count % 2 ) ? 'odd' : 'even';
    switch ( $count % 3 ) {
        case '0' : $class[] = 'one-thirds'; break;
        case '1' : $class[] = 'two-thirds'; break;
        case '2' : $class[] = 'three-thirds'; break;
    }
    switch ( $count % 4 ) {
        case '0' : $class[] = 'one-fourth'; break;
        case '1' : $class[] = 'two-fourth'; break;
        case '2' : $class[] = 'three-fourth'; break;
        case '3' : $class[] = 'four-fourth'; break;
    }
    if ( count( $m['class'] ) &gt; 0 ) {
        $params[0]['before_widget'] = preg_replace( '/\sclass=('.$alowedQuotes.').*?\\1/', '', $params[0]['before_widget'], 1 );
    }
    elseif ( preg_match( '/< \w+/', $params[0]['before_widget'] ) ) {
        $params[0]['before_widget'] = preg_replace( '/<(\w)+/', '<$1', $params[0]['before_widget'], 1 );
    }
    else {
        $params[0]['before_widget'] = '<div>';
        $params[0]['after_widget'] .= '';
    }
    $counter[ $id ]++;
    return $params;
}
add_filter( 'dynamic_sidebar_params', 'widget_param_filter' );

A két static változót használjuk számolásra. A függvény első hívásakor állítódik be a $counter változó értéke, mely egy, a regisztrált oldalsávokban található elemek számát tartalmazzó tömb. A $counts is egy tömb, melyben azt tartjuk nyílván, hogy adott oldalsávban éppen hanyadik widget-et bővítjük.

Ezután kinyerjük az eddig beállított osztályokat, és elkezdjük összeszedni a sorban elfoglalt hely szerintieket. Ha az aktuáls számláló nulla, akkor ez az első, ha egyel kisebb mint az elemek száma akkor ez az utolsó. Ha a számláló értéke osztható kettővel akkor páros (odd), ha nem akkor páratlan (even). Még megállapítja hanyadik harmad, és hanyadik negyednél jár.

Utolsó lépésben lecseréljük az eddigi osztályokat az összeszedettre. Ha nincs beállítva semmilyen osztály, akkor a legkülső HTML tag kapja meg mint új attributumot. Ha a határoló kód üres, akkor beállítunk egy div elemet az előbb összeszedett osztályokkal (és egyúttal a zárót is bővítjük, az előbbi div záró felével).

Ezt a kódot a használt téma functions.php állományába kell elhelyezni