Киндъл

Обичам да чета, но често ми липсва мотивация да го правя. Бих прочел много книги, ако имах време за това. Или поне така си казвам. Реално ми се налага да чета доста – най-вече литература, свързана с работата ми, докато съм в офиса. Същевременно се опитвам и да уча, а идеята да се взирам в PDF-и на лаптопа след цял ден работа, ми се струва… непривлекателна. Най-лошата част е седенето. Пък да четеш от компютър в леглото е ужасна работа – адската машина бълва горещ въздух като духалка в момичешко общежитие в зимна вечер и същевременно ѝ е невъзможно да застане в положение, при което да ти е удобно да боравиш с нея или дори да гледаш в дисплея.

Киндъл

Затова си взех Киндъл. Отделих известно време в чудене кой от предлаганите модели да си взема, като изборът ми беше между два модела – този с копчетата и този без (Paperwhite). Стигнах до извода, че предпочитам да не дам шейсет лева допълнително за чувствителен на допир екран и, което реално е по-привлекателно, подсветка, понеже тъкмо това предлага Paperwhite в повече спрямо стандартния модел. Е, има и други разлики, които обаче не успяха да ме грабнат – по-висока разредителна способност (която не усетих в магазина) и промени в софтуера, които обаче не са от някакво особено важно естество, а по-скоро свързани с допълнителни (и безполезни, поне за мен) възможности.

След седмица в чакане моят Киндъл беше вече при мен и се оказа точно това, което бях искал. Като човек, който не е притежавал подобно устойство досега, ми е невъзможно да направя каквото и да е сравнение с друго устройство, но нищо не ми пречи да изредя нещата, които ми харесват и тези, които не съвсем… Нека първо започна с негативите.

Амазон.ком са алчни и искат парите ни. Някъде четох, че Киндъл се продавал на производствената си цена и Амазон разчитали на печалбата си от закупени книги. Не виждам нищо лошо в това, щом така е решил маркетинговият им отдел. Но имам против да ми искат данните на кредитната карта при регистрация, за да съм имал удоволствието да мога да си закупя книги от техния уебмагазин само с един клик (за щастие тази стъпка може да се пропусне). Противопоставям се и на идеята някои от функциите, предлагани от софтуера на устроиството, да са налични само за потребители, регистрирали картата си със своя акаунт. За щастие става дума за не особено полезни неща като опцията за споделяне на цитати в социалните мрежи.

Гадно е да четеш PDF файлове. Една страница от такъв документ рядко се побира хубаво на екрана на устройството. Не можете да промените размера на буквите, но можете да използвате приближение. За нещастие това ви принуждава да се придвижвате из страницата, използвайки клавиатурата и значително влошава навигацията. Заобиколка е да смените ориентацията на екрана в режим пейзаж – напасването на страницата е по ширина, така че по този начин получавате по-голям размер на показваната страница.

Киндъл не може да пише на кирилица. Нека отбележа, че Киндъл се справя отлично с визуализирането на кирилица – тоест не по-зле отколкото с латиницата. Но за сметка на това, не може да я използва за писане. Разполагате с опции за търсене, за водене на бележки, за създаване на колекции… И никъде не можете да използвате кирилица, което напълно обезсмисля търсенето в литература на български език и прави втората опция неприятна, особено ако сте като мен и не тачите шльокавицата. Не че ще искате да водите някакви особени бележки, когато се налага да навигирате из виртуална клавиатура с четирите клавиша с посоки.

Засега това са негативите. А сега плюсовете.

Лесна употреба. Киндъл разполага с прекрасна издръжливост, преди да заплаче за ток от USB порта на компютъра ви. Понеже електронното мастило не хаби енергия, докато изобразява дадена страница, няма да ви се налага да изключвате устройството изцяло. Когато приключите с четенето, просто натискате бутона за заключване, разположен отдолу на корпуса, и вашият Киндъл показва красива картинка – скрийнсейвър с писателска тематика и си седи на бюрото, в чантата ви или където сте го оставили, в очакване да го събудите, при което след секунда в просветване на зелена лампичка до същия този бутон, той ще се събуди точно там, където сте го приспали. Винаги е готов и ако имате пет минути свободно време, можете спокойно да ги прекарате в четене. Няма и да правя ставнение с лаптопа. Къндъл помни докъде сте стигнали с всяка книга. Книжките могат да се подреждат в колекции. Ако не са PDF файлове, може да им се променя шрифтът и разстоянието между буквите, както и между редовете. Ориентацията на устройството може да се променя във всички четири посоки, което намирам за особено полезно, ако чета сутрин в леглото.

Send to Kindle. Това е прекрасната функция, позволяваща ви да си изпращате книги по електронната поща. След регистрация на устройството, получавате имейл адрес към домейна kindle.com, чието име можете да промените. Там не можете да четете пощата си, но за сметка на това всяка книга, която изпратите към него, ще се появи на вашия Киндъл, когато го свържете към Wi-Fi. Няма да се тревожите, че адресът ви може да изтече в интернет и да го глътне някой бот, за да получавате непоискани търговски съобщения и на четеца си за електронни книги. Защото можете да обособите списък с пощенски адреси, от които искате да получавате документи. По подразбиране там фигурира само имейлът, който сте дали при регистрация, но към него можете да прибавяте и цели домейни.

Управление на книгите. Това се отнася най-вече за начина, по който новите книги се озовават на устройството. Компютъра в единия край на USB кабела, устройството в другия и дърпате файловете, които искате да четете, в четеца. Направо като реклама на цифровизацията. Той може да е леко капризен и да не иска да храносмила някои от форматите, които, както разбирам, са по-широко разпространени, но тях лесно можете да конвертирате в нещо, което се поддържа чрез софтуер например като Calibre (a.ivo.qa/hc). Предполагам, че да сваляте книги от Амазон е дори по-лесно.

Екранът. Изглежда като хартия и е прекрасно ясен. И най-вече, можете да четете право срещу слънцето. Това не е положителна черта конкретно на този четец, но пък за сметка на това май ми е любимата. След това е Send to Kindle.

Речниците. Устройството идва комплектовано с различни речници и то на няколко езика. Докато четете текст на чужд език, можете да маркирате която и да е дума и да проверите определението ѝ в речника, който освен това разполага със симоними, примери и други благинки. Може да се ползва и отделно. Доколкото разбирам, Амазон предлагат и допълнителни речници, а ако информацията, която ви дават, не ви е достатъчна, имате възможност да потърсите и в Гугъл или Уикипедия, използвайки вградения браузър. До него всъщност трябва да прибягвате само в краен случай, понеже, да кажем, че още е в експериментален стадий на разработка :)

Общо взето това е мнението ми засега. То може и да се промени, например след първото изпускане на пода, нещо, което неизбежно се случва с всеки чуплив хардуер, който ми попадне в ръцете, или пък след като ползвам четеца повече от седмица (редакция: вече го изпуснах и само се олющи по краищата). Но в момента определено не съжалявам за покупката си. Напоследък четенето не е било толкова удобно. За приятно – вече ще ви излъжа. Но това не зависи от четеца, а от настроението, обстановката и хората, с които го правиш.

Един плюс и един минус на Билла

Магазин Билла

Докато се редях преди няколко часа на опашка в конкурентна верига, се сетих как в Билла това нямаше да се случи и ми дойде вдъхновение да напиша няколко реда по въпроса.

Моята история с веригата с лигав италиански палячо за талисман е, че на две крачки от офиса има един голяям Билла магазин и миналото лято неведнъж и не два пъти съм се хранил с храна, взета оттам.

Понеже вече загатнах за плюса, ще започна с него – не пазарувам в други големи хранителни магазини, но за първи път в Билла познах удобството на експресната каса. Това е каса, на която можете да се наредите, единствено ако искате да си купите осем или по-малко продукта. Тоест няма да ви се наложи да чакате лелката или дядото, купуващи запаси за цялата зима, да минат преди вас. А в нашата Билла има поне четири такива каси и повечето пъти, когато съм там, по-голямата част от тях работят! И нещата стават бързо и просто, и храната ви не изтива тотално само докато си платите за нея, както ми се случи тази вечер в другата верига. С мързела да си стопля яденето в микровълновата може да ви се струвам неубедителен, но оценката идва едва когато бързате за нещо, пред вас има четирима души с колички, а не можете да ги помолите да минете първи.

А сега и за големия минус – дори да ви се наложеше да чакате на опашка с яденето два дена, нямаше да изгубите нищо освен времето си, защото храната и пет минути, след като сте я купили, и две седмици по-късно, едва ли ще има вкус по-приятен от този на подметка на обувка. Сериозно, не купувайте нищо от топлата витрина. По-добре си стойте гладни или дайте парите си на някой просяк. Лично аз за противния вкус на храната в Билла имам три възможни обяснения:

  1. Използват продукти с отминал срок на годност;
  2. Използват продукти с отминаващ срок на годност;
  3. Готвачът им е взет от джунглата, неграмотен е, за да прочете една готварска книга и няма вкусови рецептори в устата си, и не може да усеща миризми.

Да, точно толкова гадна е храната в Билла. Да не решите, че само в този магазин е така – амѝ! – ял съм Биллина храна и в магазина в нашия град, пак си беше гадна. При нас обаче бях решил повече да не си купувам нищо от топлата витрина и удържах на обещанието си. А тук нямаше как.

В обобщение ще кажа – по дяволите бързото обслужване, хапнете като хората. Не яжте нищо от топлата витрина на Билла и денят ви ще бъде с една идея по-добър.

Телефонни измами в Самоков

Четвъртък, пети юли. В девет часа сутринта на телефона у дома се звъни.

Телефона вдига майка ми. Тя е в Самоков, аз работя в София. В слушалката прозвучават думи, сподавени в хлипове. „Катастрофа… счупени крайници… страх ме е, ще умра.“

Очевидно телефонните измамници претърпяват известно развитие. Вече не им се налага да целят напосоки пола на евентуалните дъщеря или син на жертвата. Когато плачем, гласовете ни си приличат. Когато сме разтревожени, пропускаме важни подробности.

Схемата продължава по очакван начин – телефонът е взет от ръцете на страдащото дете, за да може разговорът да се поеме от лице с по-голям авторитет. В различните разкази „добрият човек, който иска да ни помогне“ може да е лекар или пък инспектор от полицията.

В нашия случай е дори по-специален – професор по медицина.

„Професорът“ обяснява, че не му е удобно да говори с този номер – телефонът е стационарен и иска името на своята жертва и мобилен телефон. Получава първото име на майка ми (очевидно много разтревожена) и нейния номер.

„Добрият лекар“ навярно смята, че е на път да успее, но всъщност е допуснал малка грешка. Докато „агонизиращото дете“ е на телефона, майка ми се обръща към него със специално обръщение, с което ме нарича. „Професорът“ се подвежда и решава, че става дума за момиче.

Превъплатил се в ролята на лице с дългогодишен опит и дълбоки познания, измамникът започва да обяснява надлъж и нашир с какво „може да ѝ се помогне“, „тя“ от какво се нуждае и „на нея“ какво ще ѝ дойде добре. Не успява да научи какво е сбъркал, когато телефонът се тряска.

Самоковската полиция пък не иска да научава нищо.

„И други хора се оплакаха,“ казва неназован полицайски служител – „Но ние няма какво да направим, номерът е бил скрит.“ И допълва: „Трябвало е да го подмамите да дойде и ние да го хванем.“

Накрая уверява майка ми да не губи вяра – били напът да заловят измамника.

* * *

Знаете ли, няма да коментирам случая. Мислех надълго и нашироко да плюя този и онзи и да соча с пръст. Да говоря за некомпетентността или нахалния мързел на полицая. Но не си струва. Искам единствено да ви посъветвам да бъдете нащрек.

Нека тази публикация бъде едно скромно предупреждение, че не е задължително лошите неща да се случват само на другите хора. И че не знаем кога как ще постъпим, ако животът на близките ни може да виси на косъм.

DIY: Приложение за съкращаване на URL

Goo.gl

Goo.gl е съкращаващата услуга на Google, достъпна само за регистрирани потребители на търсачката.

Има много причини да ползвате т.нар. съкратител на адреси, особено ако сте потребител на сайтове, където дължината на съобщенията, които изпращате, е ограничена. Или когато нямате възможност да форматирате своя коментар – дългите връзки разпокъсват написаното и идеите ви се губят. Или пък когато пишете SMS-и. Да не пропускаме и връзките с кирилски букви в тях – те често се конвертират към нечетимия за обикновения човек URI по учебник (по правило съдържащ само символите от ASCII, всеки друг знак се кодира). В резултат връзките са сякаш безкрайно дълги и абсолютно непрактични за споделяне.

Ето тук се намесват съкратителите – с помощта на кратък домейн от рода на is.gd или bit.ly и скрипт се създава кратка връзка от рода на bit.ly/NkMxvo, която пренасочва всеки любопитен посетител към желания от вас по-дълъг адрес.

Освен че е кратка, тази връзка често ви носи и допълнителни облаги, например възможността да следите статистики за нейното ползване – кой, кога и как е попаднал на нея. Всичко това зависи от вашия избор на услуга за скъсяване.

Не всички съкратители са направени да работят изцяло за вас – Туитър например ползва своя съкратител t.co за капсулиране на всеки един адрес, публикуван в съобщение из сайта с цел контрол над външното съдържание. Много медии, сред които National Geographic и New York Times също разполагат с подобни услуги, към които прибягват при споделяне на свое съдържание в интернет. Всъщност цели правителства са полудели по тази идея – руското например ползва krln.ru.

Е, в тази статия ще си създадем наш собствен скъсител на адреси.

На първо място ще отбележа, че знам, че съществуват няколко подобни проекта с отворен код, при това най-вероятно някои от тях са много добри. Не съм ги гледал. Всичко описано по-долу си е моя измислица и в качеството си на такава не претендира да е най-добрата измислица!

Задача

Имате дълга връзка, която желаете да скъсите. Чрез бланка посочвате въпросната връзка и по желание избирате кратко съчетание от букви, което да ѝ отговаря. Ако не посочите такова, системата сама ви избира.

Можете да следите последните връзки или да научите подробности за точно определен кратък адрес. Можете да следите кой и кога е използвал някоя препратка.

Веднъж съкратили каквото искате, споделяте краткия адрес с приятели,  колеги или непознати и когато те го посетят, системата ги отвежда на оригиналната локация, като си отбелязва откъде са се взели, какъв браузър и операционна система ползват, какъв е техният IP адрес и кога са дошли.

От какво се нуждаем?

На първо място – от каратък и лесен за запомняне домейн, който ще ползваме за нашия скъсител. Аз си имам bozhur.in – не е толкова кратък, но пък представлява т.нар. domain hack или с други думи комбинация от домейни от първо и второ ниво, подбрана така, че да изписва определена дума – в случая името Божурин. За примера ще ползваме By.Bozhur.in.

Останалото е като че ли по-лесно за осигуряване – трябва ни хостинг с поддръжка на PHP и MySQL.

Нека приемем, че всичко е налице и да пристъпим към действие!

Базата данни

Като начало ще си направим база от данни, където ще съхраняваме нашите данни.

Релационна диаграма за нашата база от данниНеобходими са ни само две таблици – „Връзки“, където ще записваме коя кратка връзка на кой URL отговаря. От любопитство ще си отбелязваме и датата на създаването ѝ – нищо чудно в последствие да ни е нужна при изготвяне на статистиките.

В „Посещения“ пазим куп любопитни работи – кой, кога и откъде идва. Таблицата ще свържем с „Връзки“ посредством външен ключ.

Сега да създадем и самите таблици.

Таблица „Връзки“:

CREATE TABLE `links` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `link` varchar(255) NOT NULL UNIQUE,
  `url` varchar(255) NOT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE utf8_bin;

… и таблица „Посещения“:

CREATE TABLE `visits` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `vip` varchar(16) DEFAULT NULL,
  `referer` varchar(255) DEFAULT NULL,
  `agent` varchar(255) DEFAULT NULL,
  `lid` int(10) unsigned DEFAULT NULL,
  `when` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY `lid` REFERENCES links(`id`)
  ON DELETE CASCADE
 ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE utf8_bin;

След като сме готови с базата от данни, е време да напишем и малко код…

Програмна реализация

By.Bozhur.in – файловеЦялото действие ще е описано в рамките на три файла с общ размер около 7kB.

Накратко, index.php ще получава заявките от страна на потребителя, ще прави проверка в базата данни на какъв адрес отговаря подадената кратка връзка, ще пренасочва потребителя в тази посока и ще си записва данни за него в таблица „Посещения“.

Manage.php ще се грижи за административните функции – него ще ползваме, когато искаме да създадем нова препратка, да изтрием предишна или да преглеждаме събраните данни.

И най-накрая, link.php съдържа описанието на цялата тази функционалност, която първите два файла реализират. Именно този link.php ще напишем първо.

link.php

<?php
	/* By Bozhurin Quick Link Script (by.bozhur.in)
	 * 2012 © Ivaylo Bozhurin (dev at bozhur dot in)
	*/

class Linker {

	// Конструктор за клас Linker
	function Linker() {
		// Подразбираща се часова зона
		date_default_timezone_set('Europe/Helsinki');

		// Данни за връзка с базата данни – хост, потребителско име, парола
		$this->connexion = mysql_connect("localhost", "LinkDB", "PASSWORD") or die(mysql_error());
		mysql_query("SET CHARACTER SET utf8");
		mysql_query("SET NAMES utf8");
		mysql_query("SET SQL_SAFE_UPDATES=1");

		// Избираме базата данни
		mysql_select_db("LinkDB", $this->connexion) or die(mysql_error());
	}

	// Връща информация за конкретна кратка връзка
	function Get($link) {
		$q = "SELECT * FROM by_links WHERE link='" .mysql_real_escape_string($link). "' LIMIT 1";
		$res = mysql_query($q, $this->connexion);
		return mysql_fetch_array($res, MYSQL_ASSOC);
	}

	// Проверява дали предоставеното кратко име е заето (съществува ли в БД)
	function There($link) {
		$q = "SELECT id FROM by_links WHERE link='".mysql_real_escape_string($link)."'";
		$res = mysql_query($q, $this->connexion);
		return mysql_num_rows($res);
	}

	// Връща данните за определен брой кратки връзки
	function GetLinks($limit) {
		$q = "SELECT * FROM by_links WHERE 1 ORDER BY created DESC LIMIT $limit";
		$res = mysql_query($q, $this->connexion);
		for($i=0; $a[$i] = mysql_fetch_array($res, MYSQL_ASSOC); $i++); // Любимият ми for-цикъл!!!
		return $a;
	}		

	/* Вмъква информация за нова кратка връзка.
	 * За вход приема съкращаван адрес ($url) и
	 * кратка връзка ($link)
	 */
	function Insert($url, $link, $ip) {
		$q = "INSERT INTO by_links(url, link, ip) VALUES ('".
			 mysql_real_escape_string($url) ."', '".
			 mysql_real_escape_string($link) ."', '".
			 mysql_real_escape_string($ip) ."')";

		$res = mysql_query($q, $this->connexion);
		return mysql_affected_rows($res);
	}

	// Изтрива данни за връзка от БД
	function Delete($link) {
		$q = "DELETE FROM by_links WHERE link='" .mysql_real_escape_string($link). "'";
		$res = mysql_query($q, $this->connexion);
		return mysql_affected_rows($res);
	}		

	// Въвежда данни в таблица „Посещения“
	function AddStats($lid, $vip, $ref, $agent) {
		$q = "INSERT INTO by_visits(lid, vip, referer, agent) VALUES (".
			 mysql_real_escape_string($lid) . ", '" .
			 mysql_real_escape_string($vip) . "', '" .
			 mysql_real_escape_string($ref) . "', '" .
			 mysql_real_escape_string($agent) . "')";
		$res = mysql_query($q, $this->connexion);
		return mysql_affected_rows($res);
	}
}
$linker = new Linker;

?>

Вече имаме всичко необходимо, за да пишем и четем от базата данни. Време е да направим страницата за администрация.

manage.php

Този файл ще се състои от две части – PHP скрипт, описващ въвеждането на данни, изпратени от бланка с метод post и XHTML описание на самата страница, включително бланката.

Нека първо направим скриптовата част. За нуждите на нашия пример тя ще реализира три неща – добавяне на нова препратка, премахване на съществуваща и извеждане на кратки данни за такава.

<?php
	include_once 'link.php'; 

	// Добавяне на препратка
	if($_POST["act"] == "add"){
		/* Ако потребителят представи желана кратка връзка и тя не е заета
		 * я вписваме в БД.
		*/
		if(($_POST["link"] != "") && (!$linker->There($_POST["link"]))){
			$linker->Insert($_POST["url"], $_POST["link"]);
		}

		// Иначе скриптът генерира случайна и вписва нея в БД.
		else {
			for(; $linker->There($_POST["link"] = substr(md5(uniqid()), 0, 5)); );
			$linker->Insert($_POST["url"], $_POST["link"]);
		}
	}

	// Премахване на препратка
	if(isset($_GET["del"])) {
		$linker->Delete($_GET["del"]);
	}

	// Шпиониране за препратка
	if($_POST["act"] == "spy"){
		$data = $linker->Get($_POST["link"]);

		if($data["id"] == "") $error = "Въвели сте несъществуваща връзка.<br />Ако искате, можете да си създадете такава.";
	}
?>

Да разпишем сега и външния облик. Освен бланки, там ще се съдържа и малко PHP код, използван да покажем последните трийсет препратки, както и информация за конкретна връзка, когато такава е поискана.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

	<head>

		<meta http-equiv="content-type" content="text/html;charset=utf-8" />
		<meta http-equiv="Content-Style-Type" content="text/css" />

		<meta name="Author" content="Ивайло Божурин" />
		<meta name="copyright" content="Copyright 2012" /> 		

		<title>By Bozhurin > Управление</title>
	</head>
	<body>
		<div style="float: left; margin: 10px;">
		<div style="width: 360px; border-radius: 6px; padding: 0px 6px 6px 6px;
		            text-align: center; font-size: 16px; background: #92AECA; color: #292995;">

			<form action="manage" method="post">

				<h1>Създай нова връзка</h1>
				<input type="text" name="url" size="32" value="http://"
				       style="background: #9EC1E2; border-radius: 2px; border: 1px solid #5C88B2;" />
				<br />

				<h2>Пряк път по желание</h2>
				http://<strong>by.bozhur.in/</strong>
				<input type="text" name="link" size="5"
				       style="background: #9EC1E2; border-radius: 2px; border: 1px solid #5C88B2;" />
				<br /><br />

				<input type="hidden" name="act" value="add" />
				<input type="submit" value="Добави" />

			</form>
		</div>

		<div style="width: 360px; border-radius: 6px; padding: 0px 6px 6px 6px; 

		            text-align: center; font-size: 16px; background: #92AECA; color: #292995;">

			<form action="manage" method="post">

				<h1>Разузнай съществуваща</h1>

				http://<strong>by.bozhur.in/</strong>
				<input type="text" name="link" size="5" style="background: #9EC1E2;
				             border-radius: 2px; border: 1px solid #5C88B2;" />

				<input type="hidden" name="act" value="spy" />
				<input type="submit" value="Търси" />

			</form>
		</div>
		</div>

		<div style="float: left; margin: 10px;">
		<div style="width: 360px; border-radius: 6px; padding: 0px 6px 6px 6px;
		            text-align: center; font-size: 16px; background: #92AECA; color: #292995;">

			<h1>Списък адреси</h1>

			<ul style="text-align: left">

		<?
		  // Извеждаме последните трийсет създадени адреса
		   $list = $linker->GetLinks(30);

			foreach($list as $l) {
				if($l["id"] != "")
					echo '<li><a href="'.$l["url"].'">'.str_replace("http://", "", $l["url"]).
					     '</a> (<a href="http://by.bozhur.in/'.$l["link"].'">'
					     .$l["link"].'</a>) '.
						 '<a href="http://by.bozhur.in/manage&amp;del='.$l["link"].
						 '"><img src="http://media.tsarstva.bg/icons/delete.png" '.
						 'style="vertical-align: middle" title="Изтрий" alt="Изтрий" border="0" /></a></li>';
			}
		?>

			</ul>
		</div>

		<? // Ако потребителят е поискал справка за адрес...
			if(isset($data)) {
		?>

		<div style="width: 360px; border-radius: 6px; padding: 0px 6px 6px 6px;
		           text-align: center; font-size: 16px; background: #92AECA; color: #292995;">

			<h1>Данни за адрес</h1>

		<? if($error) echo $error;
			else echo '<a href="'.$data["url"].'">'.str_replace("http://", "", $data["url"]).
			          '</a> (<a href="http://by.bozhur.in/'.$data["link"].'">'.$data["link"].'</a>)<br />';
		?>

		<? } ?>

		</div>
	</body>
</html>

CSS стиловете в горния код могат да са малко объркващи при четене, но пък страницата ни няма да изглежда съвсем ужасно. Ето я и нея:

Външен вид на страницата за управление

Вече сме на финалната права. Ще завършим системата с направата на index.php.

index.php

<?php
	if($_GET["go"] != "") {
		if($_GET["go"] == "manage") {
			include_once 'manage.php';
			exit;
		}
		include_once 'link.php';
		$l = $linker->Get($_GET["go"]);

		if($l["id"] != "") {
			$linker->AddStats($l["id"], $_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_REFERER'], $_SERVER['HTTP_USER_AGENT']);
			header("Location: ".$l["url"]."");
		}
		else {
			header("Location: http://tsarstva.bg/sh/372/url-shortener/#несъществуващ");
		}
	}
	else header("Location: http://tsarstva.bg/sh/372/url-shortener/");
?>

Ако я оставим в този вид, системата би работила с адреси от типа на by.bozhur.in/?go=blog. Ние обаче целим възможно най-кратки връзки, затова ни остава едно последно действие – да си направим похдодящ .htaccess файл, който да да взима всичко след последната наклонена черта и да го пренаписва по подходящ за нас начин.

Както можете да видите от индексния файл, нямаме намерение да осигуряваме директен достъп до manage.php. Напротив, дори ще го направим невъзможен. Вместо това ще го включваме, подавайки „manage“ като входна стойност на go (by.bozhur.in/manage).

.htaccess

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_URI} !index
RewriteRule (.*) index.php?go=$1

 Това е всичко!

Разбира се, в този вид има още много неща, които бихме могли да подобрим. Най-малкото, към момента никъде не правим статистика. Но това вече остава за домашно. Важното е, че имаме една скромна, но все пак ефективна система, която да ни отърве от дългите хипервръзки и да улесни нашето онлайн общуване.