Ezer felől hallom, hogy egy trendi tech geek GTD eszköze a Gmail és kizárólag a Gmail. Nincs Mail.app, sem Thunderbird de még csak iCal sem. Egy szimpla böngésző és kész. Már többször is próbálkoztam hasonlóval, mindeddig hiába.

Nálam a levelezés kondicionálódott valamely – platformtól függő – levelezőklienssel, amelytől egyszerűen nem vagyok képes megválni! Windowson és Linuxon Thunderbird, Mac-en Mail.app. Gmail-ről, IMAP-en keresztül szinkronizálom le a leveleket. Ha minden kötél szakad, akkor böngészőből még mindig bármikor és bárhol rá tudok kukkantani a fiókomra.
Ami nagyon megfog a böngészőből való levelezésben, hogy egy helyen el tudom érni a levelezésemet, a naptáramat és a naptárba integrált todo listámat is. Nem kell görcsölni szinkronizálással. Ott van minden és kész. De mikor oda kerülök, hogy levelet kell írnom és a böngésző bambul rám eközben, akkor elbizonytalanodok. Nem megy. Fapados és ingerszegény. Egy fél napom ráment, hogy erre megint rájöjjek
A szemfülesebbek már biztosan ezer éve tudják, nekem azonban csak tegnap tűnt föl, hogy a Google Apps e-mail fiók adminisztrációban lehet beállítani Catch-all címet:

Benjaminnál olvastam a módszerről, de akkoriban még máshol hosztoltam a leveleimet és ott nem volt lehetőségem ilyen beállításra. Ma azonban épp ügyes-bajos dolgaimat intéztem és közben a Google Apps for Domains admin oldalán kötöttem ki, amikor is észrevettem a beállítási lehetőséget.
Tömören arról van itt szó, hogy be tudunk állítani egy e-mail fiókot amely elnyel minden olyan levelet amelyet úgymond ismeretlen címzettnek küldtek. Tehát amelyet olyan címre küldtek ami nem létezik (és persze alias sincs rá). Benjamin módszerét alkalmazva minden olyan oldalon ahol regisztrációhoz e-mail címet kell megadni, lehet használni az oldal_neve@domainem.hu formát (pl.: pass.inda.hu@domainem.hu). Ezután ha elkezdenek spammelni az adott címen akkor könnyen ki lehet szűrni a nem kívánt leveleket. A módszer igazi ereje azonban abban rejlik, hogy ezáltal könnyen kideríthető, hogy hol szivárogtatták ki az e-mail címet (bár ilyet ugye senki sem tesz
).
Ezt a Gmail kezdettől fogva támogatja? Csak én nem vettem ezt eddig észre???
Szerettem volna egy egyszerű, minimalista kis alkalmazást készíteni a Zend Framework segítségével, Ajax-os hívások kiszolgálására, de nem találtam egyetlen példát sem ami valóban az egyszerűséget és a lényegi működést lett volna hivatott bemutatni. Egészen addig amíg bele nem botlottam William Graham Ajax 101: A Simple Example of Using Ajax with the Zend Framework című írásába. Ezen a példán dolgozgattam, gyurmázgattam egy kicsit az alábbi eredménnyel:

Tényleg csak a lényeg van benne, semmi extra. A kliens oldalon begépelt szöveget megfordítja vagy változatlanul hagyja szerver oldalon, persze oldal újratöltés nélkül. Persze az érdemi munkát a Prototype library végzi, de a Zend_Json osztály is besegít a munkába. A lényegi részek az alábbiak:
index.php
<?php
error_reporting(E_ALL|E_STRICT);
date_default_timezone_set('Europe/Budapest');
set_include_path('.' . PATH_SEPARATOR . './library'
. PATH_SEPARATOR . './application/models/'
. PATH_SEPARATOR . get_include_path());
include "Zend/Loader.php";
Zend_Loader::loadClass('Zend_Controller_Front');
$frontController = Zend_Controller_Front::getInstance();
$frontController->throwExceptions(true);
$frontController->setControllerDirectory('./application/controllers');
$frontController->dispatch();
IndexController.php
<?php
class IndexController extends Zend_Controller_Action
{
function init() {
$this->view->baseUrl = $this->_request->getBaseUrl();
Zend_Loader::loadClass('Zend_Debug');
Zend_Loader::loadClass('Zend_Json');
}
function indexAction() {
$this->view->title = "Zend Ajax 101";
}
function getDataAction() {
$this->_helper->viewRenderer->setNoRender();
$state = $this->_request->getParam('state');
$data = Zend_Json::decode($state);
sleep(1);
switch ($data['func']) {
case 'reverse':
echo "The text reversed: " . strrev($data['intext']) . "!!";
break;
default:
echo "The text received: " . $data['intext'] . "!!";
}
}
}
index.phtml
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title><?php echo $this->title; ?></title>
<link rel="stylesheet" href="public/styles/boxy.css" type="text/css" media="screen" title="no title" charset="utf-8">
<script type="text/javascript" src="public/scripts/prototype.js"></script>
<script type="text/javascript" src="public/scripts/ajax_funcs.js"></script>
</head>
<body>
<p>
<input type="text" name="intext" value="" id="intext" />
<input type="button" name="buttonReverse" value="Reverse" id="buttonReverse" OnClick="callAjax('intext', 'reverse')" />
<input type="button" name="buttonNormal" value="Normal" id="buttonNormal" OnClick="callAjax('intext')" />
</p>
<img src="public/images/loader.gif" id="update" style="display: none"/>
<span id="hello">boring pre-Ajax-call text ...</span>
</body>
</html>
ajax_funcs.js
function callAjax(s, method)
{
if (method===undefined) method='';
if (method == 'reverse')
var data = {func: 'reverse', intext: $F(s)};
else
var data = {func: '', intext: $F(s)};
var myAjax = new Ajax.Updater('hello', 'index/getData',
{
method: 'post',
parameters: {state: Object.toJSON(data)},
onCreate: function(transport) {
$('update').show();
$('hello').innerHTML = "Loading...";
},
onComplete: function(transport) {
$('update').hide();
}
}
);
}
Küzdöttem a Zend Framework-kel, hogy beolvassa a ‘content:encoded’ tag-eket egy RSS feedből. Az alábbi kóddal sikerült:
public function indexAction()
{
$ns = array
(
'content' => 'http://purl.org/rss/1.0/modules/content/',
'wfw' => 'http://wellformedweb.org/CommentAPI/',
'dc' => 'http://purl.org/dc/elements/1.1/',
);
Zend_Loader::loadClass('Zend_Feed');
try {
$rssFeed = Zend_Feed::import('http://blog.linuxforge.hu/feed');
} catch (Zend_Feed_Exception $e) {
echo "Exception caught importing feed: {$e->getMessage()}\n";
exit;
}
$channel = array(
'title' => $rssFeed->title(),
'link' => $rssFeed->link(),
'description' => $rssFeed->description(),
'items' => array(),
);
$i = 0;
$xml = new SimpleXMLElement($rssFeed->saveXML());
foreach ($rssFeed as $item) {
$content = $xml->channel->item[$i++]->children($ns['content']);
$channel['items'][] = array(
'title' => $item->title(),
'link' => $item->link(),
'description' => $item->description(),
'content' => trim($content->encoded),
);
}
$this->view->channel = $channel;
}
Az IE6-nak még mindig meglehetősen nagy felhasználói tábora van. Erre a hallomáson túl abból is következtetek, hogy az általam hozzáférhető site-ok statisztikáit böngészve még mindig jelentős számú 6-os verziójú Internet Explorer tűnik fel. Bár közismert, hogy mennyire bugos ez a böngésző, – a felhasználói táborára való tekintettel – továbbra sem szabad megfeledkezni az IE6-al történő tesztelésről. Meglehetősen gusztustalan hibák és oldalszéthullások tudnak ilyenkor előjönni, melyeket illik mielőbb javítani.
Az egyik “kedvenc” bugom hogy a div-re illesztett
stílussal nem képes megbirkózni és ahelyett, hogy az érintett div-et középre igazítaná, mozdulatlanul hagyja. A <center> tag ugyebár nem szabványos és legjobb tudomásom szerint nem illik használni így nemrég valami szabványos css hack után kezdtem kutakodni (tapasztaltabb designerektől, webprogramozóktól elnézést kérek). Találtam is egy szép megoldást ami nem gyengén lepett meg. Valahol azt írták, hogy az érintett div-nek adjunk egy
attribútumot. Megmondom őszintén kicsit furának találtam és nem igazán hittem benne, hogy működni fog, de bejött. Tehát
text-align: center;
margin: 1em auto;
és az általam tesztelt böngészőkkel (IE6, IE7, Firefox, Camino, Safari 2, Safari 3 Beta) a kívánt célt sikerült elérni.
A böngészőtesztek elvégzésére egyébként két nagyon hasznos oldalt tudok ajánlani:
- IE NetRenderer: kifejezetten Internet Exploreres renderelést tesz lehetővé. Az on-line renderelt képet azonnal megjeleníti. IE7, IE6, IE5.5 valamint IE7-IE6 Mixed és Difference szolgáltatásokat nyújt. Ez utóbbi két funkció külön érdekessé teszi a szolgáltatást.
- BrowserShots: Az összes ismertebb böngésző, különböző operációs rendszereken történő renderelését teszi lehetővé. Az eredmény sokkal lassabban érkezik mint ez IE NetRenderer esetén – saját tapasztalatom alapján akár fél óra is lehet -, ami teljesen helyénvaló hiszen sokkal több munkát végez. Plusz pont továbbá, hogy az végeredményeket egy zip fájlban is elérhetővé teszik letöltésre.