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

Веднага прилагам прилагам пример. Решаваме(незнайно защо) да си правим база данни със всички квартали и градовете, в които се намират в България. Таблицата ни е с три полета: id, city, residential. Таблицата ни, най-просто може да бъде създадена така:

CREATE TABLE residentials (
id int(10) NOT NULL auto_increment,
city varchar(32),
residential varchar(32),
PRIMARY KEY (id)
);

Очевадно е, че няма как да сложим уникалност на нито едно от двете полета, поради простата причина, че квартали с името “Изток”, “Запад”, “Надежда”… има в почти всеки град. Но е лишено от всякаква логика да имаме два записа:

+----+------------+-------------+
| id |    city    | residential |
+----+------------+-------------+
| 1  | Пазарджик  |   Запад     |
| 2  | Пазарджик  |   Запад     |
+---+-------------+-------------+

Ясно е, че трябва да се лишим с единия от записите. И ако говорим за сравнително голям обем от информация и респективно сравнително голям брой дублирани записи, то вместо да убиваме отговорника за съдържанието има едно по-интелигентно решение, за което научих от неволята :D

ALTER IGNORE TABLE residentials ADD UNIQUE INDEX(city,residential);

Това ни лишава от страшно много болежки, псувни, но за жалост не и от живота на отговорника за съдържанието :D

П.П: Страшно много пъти ми е трябвало такова решение и всеки път го търся като в бездънна яма. Вече си го имам запазено :)

С Киро коментирахме кой framework как причинява болка на потребителите си. Затова следва един лаконичен въпрос, целящ единствено да покаже броя и вида на мазохистите, посещаващи този блог. Харесайте си един отговор, за статистиката:

Кой framework предпочитате?

View Results

Loading ... Loading ...

Ако някога просто сте се чудили дали е трудно да се напише робот – не, не е. Трудната част идва, когато трябва да обработите събраната информация. И понеже сега са празници и мен, както обикновено, ме мързи – няма да се занимавам изобщо с обработване. Затова пък ще ви покажа как да напишете кратък скрипт, който да се разходи из списък от сайтове. Простият ни паяк ще изрови всички линкове до някаква дълбочина. Естествено, това е възможно да бъде променено, според нуждите ни – филтриране на нежелани сайтове, избягване на повторения, преглеждане само на определени линкове (например rss емисии). Но ние ще предположим, че мрежата ни от линкове е <внимание – математика> дърво, в което всички върхове са “добри”, тоест са във вида “протокол://домейн/адрес” <край на математиката>

&lt; ?php
 
class Crawler {
 
  private $history = array();
  private $path = array();
  private $curl;
  private $depth;
 
  public function __construct($agent, $links, $_depth) {
 
    foreach($links as $l)
      array_push($this-&gt;path, array(
	'url' =&gt; $l,
        'depth' =&gt; 0
      ));
 
    $this-&gt;curl = curl_init();
    curl_setopt($this-&gt;curl, CURLOPT_USERAGENT, $agent);
 
    $this-&gt;depth = $_depth;
  }
 
  private function getContent($url) {
 
    // url на текущата страница
    curl_setopt($this-&gt;curl, CURLOPT_URL, $url); 
 
    // спираме ехото и пазим резултата в низ
    curl_setopt ($this-&gt;curl, CURLOPT_RETURNTRANSFER, 1);
    return curl_exec ($this-&gt;curl);
  }
 
  public function crawl() {
 
    while(count($this-&gt;path)) {
      if(  isset($this-&gt;path[0]['url']) &amp;&amp;
          $this-&gt;path[0]['deth'] &lt; $this-&gt;depth )  {
 
	$document = $this-&gt;getContent($this-&gt;path[0]['url']);
        $links = $this-&gt;getSuccessors($document);
        foreach($links as $l)
	  array_push($this-&gt;path, array(
	      'url' =&gt; $l,
	      'depth' =&gt; $this-&gt;path[0]['depth'] +1;
	  ));
 
      }
 
      array_push($this-&gt;history, $this-&gt;path[0]['url']);
      array_shift($this-&gt;path);
    }
 
    return $this-&gt;history;
  }
 
  public function getSuccessors($document) {
 
    $page = new DOMDocument();
    @$page-&gt;loadHTML($content);
    $xpath = new DOMXPath($page);
 
    // вадим всички <a> тагове от документа
    $anchors = $xpath-&gt;evaluate("//a");
 
   // тук ще пазим линковете
    $hrefs = array();
 
    foreach($anchors as $a)
      array_push($hrefs, $a-&gt;getAttribute('href'));
 
    return $hrefs;
  }
 
};  
 
$links = array("http://www4u.org");
$www4uCrawler = new Crawler("www4u crawler v.1.example", $links, 2);
$www4uLinks = $www4uCrawler-&gt;crawl();
print_r $www4uLinks;
 
?&gt;</a>

Това е видът на класа ни. Параметрите, които подаваме на __construct са съответно $agentUser-agent, с който ще се представяме, $links – неасоциативен масив, пълен с линкове (които на практика са низове) и $_depth – максимална дълбочина на ровене. Добре е да се отбележи, че в този си вид паякът не се съобразява с <meta name=”robots” />, а се разхожда като слон в стъкларски магазин, без да гледа къде стъпва ;) . Това, което правим е:

  1. да направим от всеки елемент на $links асоциативен масив ($path), като url е оригиналният елемент, а depth – текущата дълбочина
  2. ако $path[0]['depth'] е по-малко от максималната дълбочина (все още трябва да обхождаме) – добавяме в края на $path всички линкове от $path[0]['url'], добавяме $path[0]['url'] към $history и изтриваме $path[0]
  3. когато count($path) стане 0 – връщаме всички обходени линкове ($history)
  4. показваме историята на обхождането

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


Забележка: за статията ви трябват php-xml и php версията на библиотеката cURL (или, за по-кратко – PHP 5.1 и нагоре). Ако намерите бъг, който държите да бъде поправен (вероятно ще има, не съм толкова велик, че да пиша bugless код без да съм тествал) – кажете и ще го оправя ;)

Вярвам, че всеки попаднал на тази страница си е имал работа с този мета таг. Въпреки широкото му разпространение обаче някои от най-известните търсачки дори не поддържат всичките възможности, предложени от W3C.  Синтаксисът е сравнително прост:

<meta name="robots" value="{зададена стойност}" />

Стойностите, които могат да се дадат на robots meta таг:

  • index – Позволява на търсещата машина да индексира цялата страница(зададена е по подразбиране)
  • noindex – Забранява на паяка да индексира страницата ви(идеален за страници, които е по-добре да не попадат в резултатите на търсачката…)
  • follow – Позволява на паяка да проследява всички линкове в страницата
  • nofollow – Респективно – обратното. Забранява проследяването на линковете.(ако линквате към кофти места, продажба на линкове…)
  • none – При поставяне на none като стойност, се подразбира: noindex, nofollow a.k.a Казвате на търсачката нито да индексира нито следва линковете из страничката ви
  • noarchive – Забранява кеширането на страницата ви. По този начин търсачката няма да предоставя кеширани копия от преди X дни на вашата страница
  • nocache – Изпълнява същата функция като noarchive, но за MSN/Live търсачката на MS.(Хъх..странно, Microsoft да не се съгласи с общоприет стандарт… :D )
  • nosnippet – Забранява на търсещата машина да показва в резултатите си отделни части от текста в страницата ви и респективно забранява кеширането й.
  • noodp – Забранява на търсещата машина да използва описанието за тази страница от DMOZ(a.k.a ODP)
  • noydir – Със същата функционалност като noodp, но за Yahoo! Directory

Информация за robots meta-таговете от самите търсачки:

И разбира се, официалната robots.txt страница :)

Подръжката на meta robots стойности от най-известните търсачки:

Robots value Google Yahoo! MSN / Live Ask
index Да Да Да Да
noindex Да Да Да Да
none Да Не е сигурно Не е сигурно Да
follow Да Не е сигурно Не е сигурно Да
nofollow Да Да Да Да
noarchive Да Да Да Да
nosnippet Да Не Не Не
noodp Да Да Да Не
noydir Не се използва Да Не се използва Не се използва

Специално отношение към  отделни паяци

Освен общи правила за всички роботи, можете да прилагате такива и персонално в robots.txt файла.  Имената на по-известните ботове:

  • Google – GOOGLEBOT
  • Yahoo! – SLURP
  • MSN/Live – MSNBOT
  • Ask – TEOMA

Еми това е :) Надявам се ръководството да ви се е сторило полезно :P

Източник:  Yoast.net

Няколко пъти отварям темата за permlink structure на WordPress и пак получих мейл относно съдържанието на .htaccess

.htaccess трябва да съдържа:


RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Ако някой има проблем със структурата може да се обърне към българските форуми за WordPress.

Поздрави, Краси.

В последните няколко години стана доста популярно т.нар. SEO състезание. Само по себе си SEO състезанието представлява съревнование между ентусиасти с цел техните сайтове да излязат на първо място в google (най-често) при търсене на дадена дума. За тази статия думата, която ще използваме е ytrewq (qwerty написано наопаки) и състезанието е организирано от компанията OptimizeYourMind.

За да се обяви и организира едно такова състезание компанията OptimizeYourMind трябва да е заделила определена сума пари за награден фонд. Да речем, че е заделила 1750$, които ще разделят първите трима по резултат, съответно

1. 1000$
2. 500$
3. 250$

Самата обява за такъв конкурс се пуска седмица-две преди официалния старт. Много голям процент от хората, които поне малко отбират от Интернет ще са съгласни да се съревновават с оргомната конкуренция.

Какво да използваме за състезанието

Тук мнението е много субективно. Повечето хора предпочитат да използват open source системи за управление на съдържанието. Но все пак има и хора, които разчитат на чист xHTML и много препратки от сайтове/блогове на техни приятели/познати.

Ние ще заложим на блог системата WordPress по няколко причини:

  • лесно се борави с нея
  • съдържанието се възприема по-приятелски в търсачките
  • има много “ефекти”, които ще ни помогнат

лесно се борави с неяWordPress е преведен на много езици и това позволява хора, които например нямат добри познания по английски език да боравят с нея. Много страни си имат и форуми за WordPress и хората могат да се обърнат винаги към тях за помощ

съдържанието се възприема по-приятелски в търсачките – това ще е една от основните ни цели да използваме WordPress за това състезание. Дори си има опция дали сайта, който се задвижва от WordPress да се възприема по-добре в търсачките. Това ще улесни много нашата крайна цел – първо място при търсене на ytrewq.

има много “ефекти”, които ще ни помогнат – в хранилището на WordPress има много плъгини, които помагат за SEO състезанието, в което ще участваме. Има плъгини, които дори оптимизират картинките. Шаренията от гледна точка на плъгини, които ще помогнат за това SEO състезание е много живописна.

Не става само с ядене…

Предполагам много от хората, които списват в блогове си имат сериозен опит и са човъркали WordPress из основи. Хрумват ми няколко начина да оптимизираме WordPress за оптимална производителност.

Собствен домейн – в днешно време има хостинг провайдери, които предлагат хостинг+домейн име за буквално жълти стотинки. Ние теоретично ще закупим някой икономичен хостинг план и домейн име. Домейн името, за което ще проверим първо е разбира се ytrewq, като ще се надяваме да е свободно за регистрация в областта .org – домейните от тази област се възприемат по-човешки от търсачките. Я, свободно е! Е, след като се дадена поръчката за домейн име и хостинг, една банкова транзакция ни дели от заветната цел – SEO състезанието. След благополучно превеждане на необходимата сума на хостинг провайдера вече сме собственици на ytrewq.org и започваме важната работа.

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

Концепция за съдържанието – съдържанието, което ще генерираме всъщност е безсмислено. Както и цялото състезание, но след като сме се хванали на хорото и сме дали пари – очакваме възвращаемост. Поради тази причина категориите може би не са чак толкова нужни. За това създаваме нова категория, която ще кръстим ytrewq. По подразбиране slug-ът на категорията си остава ytrewq. Него няма да го закачаме. От тук нататък – съдържанието, което ще генерираме отива в тази категория. Защо slug-ът има значение ще разберем по-надолу.

Същинско съдържание – както вече казахме малко по-горе -> какво точно ще списваме няма голямо значение. Важно е да знаем, че във всеки пост трябва да се съдържа думичката ytrewq поне веднъж. Нали целта ни е да заблудим алгоритъма на търсачките ;)
Освен съдържанието обаче идва и един много интересен момент, който много от участващите в SEO състезание не забелязват и не обръщат внимание. Това е именно…

структурата на URL на всеки постинг. За това ние ще използваме именно гъвкавата редакция на permlink structure на нашия WordPress. За целта отиваме в административния панел на WordPress -> Settings -> Permlinks и в полето Custom structure използваме един малък тарикатлък. В полето пишем:

/ytrewq/%postname%.ytrewq

По този начин Структурата Permanent link на всеки постинг ще изглежда така:

http://ytrewq.org/ytrewq/postname.ytrewq

За да бъде всичко тип-топ трябва да се грижим и всеки постинг да има определен и точен slug. Ще избягваме заглавията на постингите да са на кирилица.

Но за да работи всичко трябва да имаме един .htaccess, в който да пише:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Това е.

Като за финал…

До тук беше с оптимизацията на WordPress. Ако следвате съветите, в тази статия може би ще имате късмет в някое SEO състезание. От тук нататък остава да се опитвате ежедневно да генерирате съдържание, да правите впечатление на хора, които да поставят препратки към сайта, който използвате за SEO състезанието. Можете да се чувствате свободни да вземате идеи от тази статия. Надявам се да е била полезна и наистина да има ефект от нея.

P.S. не забравяйте, че примерите, които съм дал са използвани само и единствено в статията и всякакво съвпадение с реални домейни, SEO състезания и компании са напълно случайни :)

След като преди няколко месеца(почти 7, ако не се лъжа) писах за валидация на embed кода от youtube. Тогава се домогнах до помощта на SWFObject, но както вероятно знаете, той не се поддържа от Internet Explorer, а вероятно на всички е известно, че IE се използва от най-много интернет потребители.

Това как този браузър не спазва стандарти, има N-брой уязвимости и т.н. няма да го коментирам в тази статия. Отдавна е коментирано подобно нещо :) Сега към новината.

Йовко Ламбрев написа валиден код, с който да си импортвате youtube клипчетата, без това да ви разваля валидацията на страницата. Ако е валидна де. Аз лично държа на валидацията и трите блога, които поддържам са с валиден XHTML 1.0

Ако сега поискате embed код от youtube.com ще получите, код от такъв тип:

1
2
3
4
5
6
7
8
<object width="425" height="344"><param name="movie" 
value="http://www.youtube.com/v/E6dVfYGTyFw&hl=en&fs=1">
</param><param name="allowFullScreen" value="true"></param>
<embed src="http://www.youtube.com/v/E6dVfYGTyFw&hl=en&fs=1"
type="application/x-shockwave-flash" allowfullscreen="true" 
width="425" height="344">
</embed>
</object>

Както вероятно знаете, той е НЕвалиден :) Ето и кодът написа от Йовко:

1
2
3
4
5
6
<object type="application/x-shockwave-flash" 
data="http://www.youtube.com/v/E6dVfYGTyFw&amp;hl=en&amp;fs=1" 
style="width:425px; height:344px;">
<param name="movie" 
value="http://www.youtube.com/v/E6dVfYGTyFw&amp;hl=en&amp;fs=1" />
</object>

Прекалено съм сънен за да го изпробвам, но съм сигурен, че той го е тествал и под различни браузъри(грешка, която аз не направих в предишния пост за embed валидация на кода от youtube и останах адски озадачен от IE).

Е, това е…дерзайте :)

От много време искам да напиша този пост. Все не стига или време, или желание. Е сега явно е ударил часът. Замисляли ли сте се, кои са основните  елементи в дадена страница?

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

Повечето дизайнери/програмисти смятат, че ако то ще се използва в истинските му размери, т.е. няма да бъде преоразмерявано, няма нужда да му се укажат стойностите на широчина(width) и височина(height). И действително, дори да не ги укажете, всичко се визуализира нормално и Вие решавате “щом работи, няма нужда да се указват”. Е да, ама не.

При зареждането на страницата, ако не са указани размери на изображението, то браузърът по подразбиране задава размери 10×10 и поставя останалите елементи от страница, докато се зареди изображението. В не един и два случая обаче, размерите на изображението се оказват други, те се поправят, и елементите трябва да се пренаредят. Това бави зареждането на страницата, а ние далеч не желаем това.

Ясно е, че е неудобно всеки път, да проверяваме какъв е размера на изображението, което включваме в дадена странца. Защо да не автоматизираме този процес? За целта написах един прост клас scf4u(SimpleClassFunctions4you), с две функции. Ще използвам този клас, като дописвам и други такива функции, които ще видите в следващите статии.

Сега към кода на първата функция:

Прочети цялата публикация »

Попадна ми един интересен пост на Inter-Sectionst. Доста е интересен и затова реших освен оригиналния линк към поста, да му направя кратко резюме. Още в началото се оспорва масовото мнение, че портфолиото не ти ли е пълно с проекти и нямаш ли красиво, препълнено с безмислици и локуми CV, не ставаш. И аз споделям идеята на Даниел.

Сега към съществото на поста. Ето кои са 6-те основни качества, които се приема, че трябва да притежаваме, за да се наречем програмисти:

Прочети цялата публикация »

Реших да направя един прост тест на тема валидация. Заблуденият екип на www4u й отдава голямо значение и ето как се ражда едно проучване. Лично аз останах доста учуден. Сайтове и блогове, с изключително полезно и качествено съдържание на тема web development и хората поддържащи такива местенца в родната ни мрежа, не винаги обръщат голямо внимание на валидния код.

Ето и къде какво казва валидаторът на w3c:
http://ayanev.com Failed validation, 368 Errors
http://devstorming.com Failed validation, 108 Errors
http://webmasterbg.com/seo/ Passed validation, 1 warning(s)
http://bgdev.org/ Failed validation, 18 Errors
http://www.ivostankov.net/ Failed validation, 14 Errors
http://www.webmasterbg.org/ Failed validation, 1 Errors
http://web-tourist.net/ Passed validation, 92 warning(s)
http://www4u.org Passed validation

Това е само началният вариант на списъка, той ще бъде разширяван все по-често и по-често. С най-добри чувства към всички горепосочените сайтове, аз и/или колегата сме чести посетители на повечето от тях.

Бъдете 2.0… Валидирайте се!

TopBloglog image