Sep 19

Дааа… Если в линуксе большая часть програм пишутся по принципу “лучше много отдельных прог + некий стандарт связи между ними”, то в винде большие программы становятся все больше и больше, фичастее и фичастее. Одной из таких программ стала Nero. Если раньше слово “Nero” обозначало только программу для записи дисков (сейчас это Nero Express + Nero Burning Rom), то сейчас Nero превращается в огроменного монстра, который управляет всем, что хоть немного связано с CD/DVD. Явная монструозность стала проявлятся с 7-й версии - лично я только тогда впервые услышал отзывы типа “200мб - нихера себе, что они туда запихали”…

К чему я все это - встречайте мегамонстра - Nero 8. Да, фич куча, но весит эта хрень целый гигабайт (инсталляха) - я просто хренею.

PS. Я до сих пор юзаю под виндой Small CD Writer - пишет все что мне нужно + весит 420кб.

PPS. Еще можно вспомнить продукты Adobe (CS -> CS2 -> CS3: 150 -> 300 ->450мб), но это еще ладно - возьмите MS Office. Был нормальный пакет: 200-300мб (эт я про 2003й), а 2007й весит уже DVD, причем добавилось, имхо - не настолько много.

Ужас, куда мы катимся.

written by FX Poster

Sep 18

Очень познавательная статья про ООП в JS. Для новичков в JS и для тех, кто средне в нем шарит - самое оно. Для тех, кто вообще не в теме - ООП в этом замечательном языке реализовано не на основе классов и обьектов, как экземпляров классов, к чему многие (очень многие) привыкли, а на основе прототипов. Подробнее - википедия, как всегда рулит.

После этой статьи и статьи википедии очень советую взять какой-нибудь из JS-фреймворков (Prototype, JQuery, гугл рулит) и поизучать их код - эффект будет еще круче, чем от статей, но основы нужно же знать. ;)

written by FX Poster \\ tags:

Sep 18

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

Мое решение:

$filename = "test.txt";

class Tree {
    var $children = array();
    var $level;
    var $name;
}

function display($tree) {
    // кто знает, как вывести n строк подряд - подскажите
    for($i = 0; $i < $tree->level; $i++) echo "\\t";
    echo $tree->name . "n";
    foreach($tree->children as &$child)
        display($child);
}

$root = new Tree();
$root->level = -1;
$nodes = array($root);

foreach(file($filename) as $record)
{
    $record = preg_replace('/\\n|\\r\\n/', '', $record);
    list($id, $parent_id, $name) = explode('|', $record);

    $parent = $nodes[$parent_id];
    $node = new Tree();
    $node->level = $parent->level + 1;
    $node->name = $name;
    $parent->children[] = $node;
    $nodes[$id] = $node;
}

foreach($root->children as $child)
    display($child);

written by FX Poster

Sep 15

05.jpg
Днепропетровску - 231! Развлекательная программа - ИМХО супер! Днепропетровчане, оторвемся на славу!?!?!?

UPD: Погуляли классно, только что домой пришел. Разочаровало только то, что в реале всё получилось не так, как планировалось: концерты были другие, кое-чего вообще не было - жаль.

PS. Оказывается сегодня еще и у Google день рождения!

written by FX Poster

Sep 14

Зашел сегодня на блог одного знакомого. И тогда и сейчас у него было обьявление о наборе программистов в его фирму, писать на PHP. В качестве “пробы” предлагалось, да и предлагается, решить такую задачу:

Есть текстовый файл, в котором находится описание дерева в следующем виде:

node_id|parent_id|node_name

parent_id - id родителя, если оно равно 0 - это корневой узел.

Задача: отобразить этот файл в виде дерева, с отступами для каждого уровня табуляциями (первый уровень - ноль табуляций, второй уровень - одна, и т.д.).

Файл-пример содержит:

1|0|Electronics
2|0|Video
3|0|Photo
4|1|MP3 player
5|1|TV
6|4|iPod
7|6|Shuffle
8|3|SLR
9|8|DSLR
10|9|Nikon
11|9|Canon
12|11|20D

Ответом должно быть:

Electronics
	MP3 player
		iPod
			Shuffle
	TV
Video
Photo
	SLR
		DSLR
			Nikon
			Canon
				20D

Тут еще заметки относительно решения есть.

Где-то полгода назад я пробовал ее решить. Решил. Очень по идиотскому, даже вспоминать не хочется. Сейчас вот зашел на блог и захотелось опять попробовать решить задачу… И вот сейчас хочется услышать/увидеть ваши решения. Интересует именно алгоритм, писать можете на любом языке (для C++-ников предлагаю вставить вместо разделителя “|” пробел, чтобы не парится с считыванием из файла).

PS. Моим новым решением я тоже поделюсь… Потом. ;)

PPS. JQuery 1.2 - объявлен новый пользовательский интерфейс для платформы Java - Да… Не перевелись еще идиоты на Руси…

written by FX Poster \\ tags:

Sep 13
День программиста — неофициальный праздник программистов, отмечаемый на 256-й день года. Число 256 (28) выбрано, потому что это количество чисел, которое можно выразить с помощью одного байта. В невисокосные этот праздник попадает на 13 сентября, a в високосные годы — на 12 сентября.

Все программисты - примите мои поздравления!

PS. О празднике я сам узнал только сегодня утром. Был приятно удивлен. :)

written by FX Poster

Sep 12

Была одна девченка… Давно… Любил… ОЧЕНЬ СИЛЬНО ЛЮБИЛ! Долго любил… Даже когда расстались любил… А оказалась она распоследней сукой… А я - распоследним ослом… 3 года жизни - впустую…

written by FX Poster

Sep 12

Нечасто я читаю посты из блога “Юмор” на хабре. Обычно смотрю на название и забиваю. Но тут…

В общем - читать всем обязательно!

PS. Это первый пост, который я пишу не из браузера:
gnome-blog.png

written by FX Poster

Sep 09

Позавчера обратился ко мне один из заказчиков с проблемкой…

Проблема заключалась в следующем - после переноса всех скриптов и бд с одного хостинга на другой возникла проблема - не открывались страницы, отличные от главной. После просмотра кода (код, кстати, ужасный) - догадался в чем проблема - на старом хостинге в PHP флаг register_globals был включен, в новом - выключен, поэтому код типа:

if($id > 0)  {
    // загружаем страничку, соответствующую данному id
} else {
    // загружаем index
}

совсем не работал (переменной $id в глобальном пространстве имен не было). Через пару минут в голову пришло решение - эмулировать работу флага register_globals. Где-то я уже видел такое решение, кажется в Joomla’е, но искать времени особо не было.

В итоге получилось следующее решение:

function register_globals_array($array)
{
    foreach($array as $key => $value)
        if(preg_match("/[a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*/", $key))
            $GLOBALS[$key] = $value;
}

function register_globals()
{
    register_globals_array($_GET);
    register_globals_array($_POST);
    register_globals_array($_COOKIE);
    register_globals_array($_ENV);
    register_globals_array($_SERVER);
}

Пользуйтесь на здоровье.

PS. Да… Ну почему бОльшая часть кода на PHP написана так херово… :(

written by FX Poster \\ tags:

Sep 01

Не спится. Сижу пишу scaffolding для Zend Framework. Возникла проблема - для того, чтобы реализовать полноценное редактирование/удаление записей в таблице нужно добавить к стандартному классу Zend_Db_Table_Row одну public-функцию. Вот теперь сижу и думаю - насколько “правильно” будет просто открыть файл с этим классом и дописать функцию по сравнению с порождением подклассов.

С точки зрения проектировщика - этого делать не стоит. лучше породить подкласс. Но в данном случае прийдется порождать подкласс не только от Zend_Db_Table_Row, но и от Zend_Db_Table, а может и еще чего-то. Чего делать ну вообще не хочется - там кода писать абсолютно тупого - ну просто дофига (возможно я преувеличиваю немного, но все же…).

Чтобы вы делали в моем случае?

Да… Все больше и больше понимаю “недоразвитость” PHP. Если уж делать язык динамически типизированным и объектно-ориентированным - почему нельзя было сделать это нормально? Примеры “нормальных” языков в этом плане привести несложно - Python, Ruby, JavaScript.

В питоне такое “добавление” метода к классу решалось бы так:

def some_name(self):
    ...
Class.new_func = some_name

В JavaScript и того легче:

Class.new_func = function() {...}

А в PHP… Эх…

written by FX Poster \\ tags: , , ,