Приехал с Украины.

26.08.2010

Приехал со Львова. Выписали на границе штраф за то, что слишком много на Украине отдыхал (ладно хоть за тунеядство статью не оформили).

Повидался со всеми, с кем хотел и кто хотел повидаться со мной (пересечение этих множеств совсем небольшое, зато качественное).

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

Чётко и по делу.

21.07.2010

Слова чётко и по делу часто звучат как оскорбление. Мама до сих пор обижается на фразу «говори по делу» – дела-то никакого нет, просто есть желание отнять немного моего времени. Инстинкт.

На любой вопрос всегда желание ответить мягко и уклончиво. Не как профессиональные болтологи политики, но в таком же стиле.

Однако жизнь подтверждает, что прямые вопросы и ответы выгоднее. Особенно насчёт денег. Например, есть заказчик с проектом на Zend Framework. Одни из лучших моих переговоров, если б не один пункт – отсутствие суммы. Но она оказалась вполне адекватной.

Дата – восьмое число. Зелёным – мой текст.

Датой началы работы будем считать сегодняшний день. Т.к. по сути и вчера, и сегодня, и завтра загрузка не полная будет. А первый расчет я планирую через неделю, на середину-конец недели (21/24)
Хотя возможно, 17-го и 31-го расчет сделаем, чтобы в следующем месяце тоже в середине и конце месяца могли нормально расчитаться. Но это уточнить смогу наверняка только к концу следующей недели

По поводу дата начала – хорошо, думаю это справедливо.
По авансу – это не очень хороший вариант. Аванс показывает серьёзность намерений.

Понял вас. По авансу тогда рассмотрим вариант перевода в начале следующей недели (пн-вт)

Понедельник меня вполне устроит, но давайте тогда договоримся, что не «рассмотрим», а что это именно дата аванса. Хорошо? Или вам нужно время что бы решить?

Нет, нормально

Тяжелая жизнь демонов.

07.07.2010

Есть у меня скрипт – отправляет\принимает udp-пакеты. Размер – 19 строк.
Решил я сделать из него демона. На php это не сложно. Самый короткий вариант – «if (pcntl_fork()) exit;».
Однако я решил, что демон должен запускать несколько процессов, что управляться он должен через «./server start|stop|restart», что должен выводить цветные сообщения в консоль и понимать параметры -h и -v. И добавил копирайт. Всё как у взрослых. Теперь 129 строк.

P.S. Почему-то не могу собраться и написать о жизни.

Дислокация.

27.06.2010

Пришло время опять сменить место дислокации.

Пока не знаю, куда поеду, но поеду – факт.

Инстинкты.

13.06.2010

Я понял, почему одни люди говорят другим, что делать. Понял с другой стороны.

Это инстинкт. Головы практически всех пусты и если в твоей голове есть хоть что-то, жизненно необходимо для выживания племени, что бы ты сказал это остальным. Пришло тебе в голову, что надо идти охотиться, говори всем. Если у всех пусто, эта мысль займёт мозг и все пойдут. Ну а в случае двух мыслителей одновременно, всё определяется рангом. Глубина мысли не важна, важно наличие.

А постоянно поучающие друг-друга интеллегенты – это просто баг. Когда омега говорит что-то, альфа даёт ему подзатыльник, что бы так больше не делал, а если мысль здравая – присваивает. А сейчас просто некому раздавать подзатыльники – племя разобщено, иерархия не строгая.

Собрался сейчас поработать – в голове пусто. Да, можно напрячься и придумать, что сделать, но пока не напрягся – пусто. Может раньше на автомате напрягался, а может роились мусорные мысли постоянно, а сейчас не так уже. Может просветление приближается. А может – симптом деградации мозга, которая начинается примерно в моём возрасте. Всё новое надо делать молодым.

JAVA.

30.05.2010

Сегодня я расскажу вам про яву. Это такие сигареты. Это такой динозавр. Наверное думаете, что они давно вымерли? Это устаревшие данные. По новейшим данным, известным ведущим палеонтологам, до наших времён сохранилось как минимум два вида этих удивительнейших животных. Архитектура x86 и язык Java (COBOL – это не динозавр, это протоплазма). Оба вида сформировались в древнейшие времена и благодаря естественному внутривидовому отбору научились выживать практически в любых условиях. Одни атомы в нетбуках чего стоят.

Впрочем, наша сегодняшняя тема – JAVA. Боевой клич этого животного – «write once, run anywhere». Неудачный клич, ибо практически никто его повторить не может, при попытке его произнести получается «write once, test anywhere». И это неспроста. Богатый и обширный набор правил безопастности, различающихся в зависимости от платформы и способа запуска кода превращает тестирование из правила хорошего тона в жизненную необходимость, без которой можно запросто умереть от от какой-нибудь IO.error.

Рассмотрим несколько подвидов, объединённых общим ареалом обитания – java for web. Информация об этих подвидах не систематизирована, разрознена, зачастую старая, как сами динозавры. Впрочем, это увеличивает ценность специалистов по изучению Java – джаво’логов.

Самый известный вид – java applet – является и самым старым. Приживается хорошо, но плохо обучается новым трюкам. Потому считается на данный момент вымирающим. Если, например, захочется обучить его медиа-штучкам (звук, видео), то первое, что вы найдёте – JMF. Но принюхайтесь внимательнее, что это? Нафталин? Вряд ли, он практически весь выветрился с 1999 года, которым датирован мануал по JMF. Если заглянуть в зазеркалье, можно там найти FMJ. Здесь нафталином пахнет намного сильнее – всего-то три года консервации. JMC – ещё одна забавная аббревиатура, которую можно выучить для того, что бы поддержать разговор в приличном обществе (если общество, в котором разговаривают о веб-подвидах java, можно назвать приличным).

Теперь про JavaWS. Нет, это не ещё одна жалкая попытка научить животное работать с видео. Это ещё одно животное. Java Web Start. Самое первое внешнее отличие, которое бросится вам в глаза – это особый метод деплоя. Конечно, вам необходимо знать, что такое деплой, что бы увидеть всю прелесть JNLP.

Подвид JavaFX. Многими исследователями выделяется в отдельный вид, JavaFX Script. Значительно более молодой, а потому более прыткий, чем предыдущие два. Унаследовал от JavaWS сакральное отношение к процессу деплоя (процесс, чем-то сходный с размножением). Характеризуется повышенной способностью обучения всяким современным фокусам (которая, впрочем, всё равно невысока – научить можно, но врожденных инстинктов, помогающих в этом, немного). А так же – плохой выживаемостью в диких условиях. Для своего питания требует специального корма JavaFX Desktop Runtime. Корм этот доставляется по первому требованию в места обитания JavaFX абсолютно бесплатно, однако не каждый, кто хотел бы приютить на время у себя зверька, согласен завозить и специальный корм. Потому ареол обитания JavaFX намного меньше, чем у Java Applet или JavaWS (для них корм уже есть в 70% домов, его завозят при строительстве).

Отдельного упоминания заслуживает обряд посвящения, так называемого «подписывания», который может пройти любой код. После прохождения этого обряда код, теперь считающийся взрослым может пройти туда, куда детям вход воспрещён. Конечно, это накладывает на взрослых и обязательства. Когда взрослый код приходит, он обязан сообщить о своём приходе громко и чётко. Детям же это делать не обязательно, пока они тихо играют в своей песочнице, внимания на них никто не обращает.

Забавно то, что детям об обряде не говорят – их просто не пускают в места для взрослых, без объяснения причин. Есть гипотеза, что это часть обряда – только тот код, что сам изъявил желание стать взрослым, достоин стать таковым. Кстати, у разных подвидов обряды практически не различаются, а вот строгость ограничения детей, не прошедших обряд – разнится. Например, детские особи JavaWS иногда могут получать доступ к локальным ресурсам, чего детям Applet не дозволяется никогда.

Это была передача «Забавная IT-Биология», с вами её бессменный ведущий, Secret. Увидимся в следующем выпуске!

Symfony task logging / criteria sql builder.

24.04.2010

С разработчиками symfony и propel у меня слишком разные взгляды на типичные ошибки и полноту документации. Полтора часа, что бы обнаружить, что поле таблицы названо зарезервированным словом – это слишком много.

А дело было так.
Делаю таск (т.е. скрипт), что бы пропинговать некоторое количество доменов. Делаю запрос к базе – получить домен. Не проходит. Код элементарный, типа такого.

$criteria=new Criteria();
$criteria->add(DomainPeer::CHECKED,false);
$page=DomainPeer::doSelectOne($criteria);

Причем не проходит именно запрос.

[wrapped: SQLSTATE[HY000]: General error: 1 near «INDEX»: syntax error]

Делаю запрос одного домена в консоли – работает. Понятно – дело в запросе, который генерит пропель. Тут бы мне и догадаться что дело в зарезервированном слове, но мозг работает только на один шаг вперёд.

Нужно посмотреть, какой запрос происходит. Благо, узнать в symfony, какой запрос делает propel можно элементарно

$c = clone $criteria;
$params=array();
if (!$c->hasSelectClause()) DomainPeer::addSelectColumns($c);
echo BasePeer::createSelectSql($c,$params);

Но как найти эту функцию – createSelectSql, когда ты ещё не знаешь её названия? Я полагаю, что это должно быть в документации. Однако листание оной ни к чему не привело. Открыв гугл я просто понял свою беспомощность перед задачей – сформулировать вопрос.

symfony show builded sql query
symfony propel show query
criteria get result query
propel criteria get query
propel criteria getquery
criteria итоговый запрос
show sql symfony

Максимум, что находится – смотрите в логах или веб-панели. Но логов нет. Что ж, то, что логов в тасках нет, я знал и ранее, но не знал, почему. Тут бы мне залезть в кишки ORM, поставить пару var_dump и всё-таки выяснить, какой запрос делается к базе. Но решил разобраться, как включить логи. Я полагаю, что это должно быть в документации. Однако листание оной ни к чему не привело. Открыв гугл я просто понял свою беспомощность перед задачей – разобрать миллион страниц, отвечающих не на тот вопрос.

enable logs for tasks symfony
get setting value symfony
tasks site:symfony-project.org
enable log tasks symfony
enable logging tasks symfony

Все страницы радостно рассказывают мне про опцию logging_enabled, которую достаточно включить. Про неё, конечно, я знал и ранее и она, конечно, не помогает, иначе история была б вдвое короче. Но вот почему она не помогает? Я полагаю, что это должно быть в документации. Однако листание оной ни к чему не привело. Открыв гугл я просто понял свою беспомощность перед задачей – найти ответ на вопрос, который никто не задавал.

logging_enabled tasks symfony

Решил понять, почему не работают логи, сделав запись в логи самостоятельно. Сделать это не сложно.

sfConfig::set(’sf_logging_enabled’,true);
if (sfConfig::get(’sf_logging_enabled’))
{
sfContext::getInstance()->getLogger()->info(«test»);
}

И код этот выдаёт ошибку, мол The «default» context does not exist. Вот только почему в тасках нет контекста? Я полагаю, что это должно быть в документации. Однако листание оной ни к чему не привело. Открыв гугл я просто понял, какой они предоставляют замечательный сервис – можно всегда легко и просто найти ответ на интересующий тебя вопрос

The «default» context does not exist. symfony.

$configuration = ProjectConfiguration::getApplicationConfiguration(‘work’, ‘dev’, true);
sfContext::createInstance($configuration);

Делаем контекст, смотрим логи (после создания контекста опция logging_enabled обрела смысл и логи появились). В логах пусто. Какой-то хлам и ни слова про запрос. Нужен ход конём – делаем тестовый модуль и наконец-то открываем наш сомнительный код через браузер. Видим и полные логи и веб-дебаггер.

Apr 24 04:31:58 symfony [err] {sfPropelLogger} SQLSTATE[HY000]: General error: 1 near «INDEX»: syntax error
Apr 24 04:31:58 symfony [err] {PropelException} [wrapped: SQLSTATE[HY000]: General error: 1 near «INDEX»: syntax error]

Забавно, ведь это мы уже видели в самом начале. К тому же прошло уже почти полтора часа и пришла пора догадываться. Стало понятно, что без кишков не обойтись. Трейс-лог показал мне, где искать нужный мне код – открыл BasePeer, открыл там функцию doSelect, перед $con->prepare($sql) поставил echo $sql. Тот запрос, который появился на странице, вбил в консоль и сразу всё увидел – sqlite-у не нравится, что у меня одна из колонок называется INDEX.

Спасибо за внимание.
156

Весёлый интернет.

24.04.2010

Забавный тут интернет.

Есть пар 3g-модемов, которыми пользуются Imbolc и его девушка. И халявный вай-фай, который ловит только на окне и только у меня. Пробовали подключаться с других ноутов – не выходит, в чём баг – не понятно.

На следующий день появился замечательный роутер asus RT-N12. Его замечательность проявляется не только в том, что он – 802.11n (т.е. вайфай до 300 мбит/с), но и в интересном режиме работы – как повторитель вай-фая.

Странность в том, что подключиться сам по себе к этой халявной вай-фай сети он не может, как не могут и 3 разных ноута, которые тут есть. То есть, включить его, настроить как повторитель, а потом подключиться к сети нельзя – не работает. Вай-фай есть, а интернета нет.

Но всё работает, если к этому пазлу добавить мой ноут. Подходишь к окну, подключаешься к сети, потом включаешь роутер. После этого интернет ловится по всей квартире (только у меня на ноуте). Повторитель точно работает – если роутер выключить, интернет сразу пропадает и воспользоваться им опять можно только на окне.

Ещё один забавный момент – роутера нет в сети. Халявный есть – без пароля. А нашего асуса нет.

Есть, правда, у этой схемы пара минусов. Один понятен – нужно подходить к окну, что бы подключиться. Второй – увеличение латентности сети. Это DNS-ы гавно. Поставил гугловские себе – страницы открываются намного быстрее. Может на роутере поставить, пусть остальные порадуются?

Думаю.

16.04.2010

Смотрел серию Хауса про девушку-блоггера. Много думал.

Смотрел День Триффидов. Отличную идею экранизируют уже третий раз. Не смотрел первые два варианта, но третья попытка не удалась. Чуть-чуть надо было. Плевать на игру актёров, плевать на декорации, просто сценариста на неделю на улицу выгнать, что б жизненного опыта набрался. И всё было бы отлично.

Смотрел Скалолаза. Эх, снимали ж боевики. Сейчас больше сопли какие-то.

Вроде б определился с дальнейшей жизнью.

Game over.

15.04.2010

Ну вот всё и закончилось. Как всегда неожиданно. Странная особенность всех ожидаемых событий без точной даты (и очень многих – с датой точной) – приходят в довольно неожиданный момент.

Я сейчас один в трёхкомнатной квартире в Москве. Есть деньги, ноутбук, интернет. Нет ни одного обязательства. Моя жизнь снова в моих руках. И есть, в худшем случае 12 часов, в лучшем – неделя, что бы решить, что дальше со всем этим делать.