Здравейте,
Най-сетне www4u.org може да се похвали с нов хост от SuperHosting.bg. Трансферирането на домейна от ICN към SuperHosting мина изключително леко. Просто два имейла получих за цялата операция, която траеше 6 дни.

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

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

Веднага прилагам прилагам пример. Решаваме(незнайно защо) да си правим база данни със всички квартали и градовете, в които се намират в България. Таблицата ни е с три полета: 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

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

  • facebook
  • bbc
  • youtube
  • ebay
  • games
  • news
  • hotmail
  • bebo
  • yahoo
  • jobs

Допреди няколко минути всяка страница в резултатите на Google беше определяна като опасна за сигурността на потребителските машини. Интересно…наистина това е полезна възможност, търсачката да ни казва коя страница е опасна, но това граничеше повече с параноя :D Иво Станков направи един доста приятен Screenshot, според който Google се САМОопределят като опасни…опасна работа са тез хорица :D

http://img.edno23.com/attachments/1233416799733488.jpg

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

Интересно ми е дали ще хвъркат клавиатури, мишки и уволнения или ще се размине…

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

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

View Results

Loading ... Loading ...

Не искам да кажа нещо кой знае какво, но все пак…

the-good-the-bad-and-the-ugly

Тей, тей…тръгнало е на картинки значи, а ? Е, време е да ви разкрия малко вътрешна статистика.

www4u-private-stats

Вярно, че коментарите не са кой знае колко, но все пак числото 137 както знаем е много специално. ;)

Дразнят ли ви сайтовете, които изглеждат зле, ако сте с тъмна тема (tyxo…)? И мен. И за да не ви псуват потребителите – слагайте едно такова нещо в началото на css файла ви:

 html{color:#000;background:#FFF;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;}fieldset,img{border:0;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}table{border-collapse:collapse;border-spacing:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}li{list-style:none;}caption,th{text-align:left;}q:before,q:after{content:'';}abbr,acronym{border:0;font-variant:normal;}sup{vertical-align:text-top;}sub{vertical-align:text-bottom;}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit;font-size:100%;}legend{color:#000;}del,ins{text-decoration:none;}

Само 699 символа е, а си спестявате недоволни потребители ;)

В този празничен ден, има-няма 10 часа преди да посрещнем 2009 година е хубаво да се обърнем назад. Да направим еднo ретроспективно връщане на лентата, както се казва. Днес ще се се фокусираме над издънките на 2008 година.

Нещото, което много време се очакваше беше електронното записване на малчугани в детските градини. Тогава аз писах, Жоро направи серия от постове, озаглавени Сирма и детските градини…а и още много, много хора писаха. Реално погледнато това си беше издънка на Сирма, наистина. Но като се сетя, че снощи бях да пия бира с Емуто в After Art (бившото “Мачу Пичку”) и офиса на Сирма беше точно до тоалетните на кръчмата…може да си представите какво означава сериозност. А самата издънка стана и заради това, че Windows сървърите не издържаха на “напрежението”. Кофти тръпка, а ? :)

Седмица-две преди да навърша пълнолетие бях решил да направя нещо полезно. Да сигнализирам за фишинг в онзи прекрасен сайт cybercrime.bg. Сами може би се се сещате, че това нещо НЕ РАБОТИ. Или поне тогава. Тогава отразих този проблем. Разбира се – половин година по-късно го отстраниха…май. Но веднага стана ясно, че са си наели някое хлапе да им направи сайта. Та просто то се е осрало с една Contact форма. Тъпо. Издънка. ГДБОП, НСБОП, МВР и всички други интересни институции винаги са били некадърни.

Почти когато Май месец привършваше – нещо понамириса на мърша. Този път от ПИБ (Първа Инвестиционна Банка). Имаше слухове, че ще фалира, тъкмо започваше и икономическата криза. Интересно беше да гледам паниката на хората. Тогава ПИБ почнаха да правят и рекламите с Бербатов и какво ли още не. Дори си направиха официален блог, който още тогава разбрах, че е дефектен и ментеризиран. Тъй и писах. За щастие /тяхно/ – послушаха ме за permlink структурата. От там нататък…че съдържанието, което генерират е плачевно – плачевно е. Никога няма да съм пациент на ПИБ.

А като по-горе споменах за разни институции със странни акроними /или абервиатури/ -нека припомня, че избомбиха много брутално сайта на ВКС (Върховен Касационен Съд). И тогава много се смях. Некадърници…кой ги кара да си правят Windows сървъри ?! Да не би мирно седяло…нали ? ;)

Тъй като ми е ден на уеб издънки – най-голямата издънка за тази година (поне за мен) беше пускането на Data.BG 2.0. Мисля, че за точно тях няма да пиша, защото много уважавам хората, които направиха дизайна и съответно написаха кода за Data.bg. Друг е въпроса, че хората от дейта са нямали достатъчно сили да спазят сроковете. Нека да са живи и здрави…и да правят повече импресии.

Дано новата…2009 да ни поднесе още повече гафове.

Наздраве!

Ако някога просто сте се чудили дали е трудно да се напише робот – не, не е. Трудната част идва, когато трябва да обработите събраната информация. И понеже сега са празници и мен, както обикновено, ме мързи – няма да се занимавам изобщо с обработване. Затова пък ще ви покажа как да напишете кратък скрипт, който да се разходи из списък от сайтове. Простият ни паяк ще изрови всички линкове до някаква дълбочина. Естествено, това е възможно да бъде променено, според нуждите ни – филтриране на нежелани сайтове, избягване на повторения, преглеждане само на определени линкове (например 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 код без да съм тествал) – кажете и ще го оправя ;)

Наближават интересни празници. Празници, които изразходват много алкохол. Миналата година Киро поздрави за нова година. Тази година аз поздравявам всички, които четат с:

Весели празници! И 99 бутилки бира!

Приятно празнуване и не забравяйте да изпиете поне 0011000100110000 бири в името на празника :)

Поздрави, www4u.org

TopBloglog image