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

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 часов, в лучшем – неделя, что бы решить, что дальше со всем этим делать.

1625.

10.04.2010

Пришел на кухню, заглянул в холодильник. Беру творог.

Второй: – Не ешь творог.

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

И я действительно ем то, что есть, потому убедить троих, что рулет из осьминогов покупать не стоит, или то, что вместо 5 пачек самых дешёвых мюслей можно взять что-то более съедобное (да хоть картошки) задача не очень реальная (деньги на еду, понятно, общие).

Первый и второй тоже едят всё. Правда регулярно доставляют немного фана утверждениями, что они что-то не едят. Например сахар. Когда одна девушка купила полкило фруктозы, я успел посластить чай три раза. Первый и Второй сахар не едят. Магия. Когда кто-то купил 2 коробки конфет (наверное она же), я съел 2 конфетки. Больше не хотел – не очень их люблю. Первый и второй оба принципиально конфеты не едят, считают их плохой пищей. Потому, когда они доели первую коробку, Первый убедил Второго, что вторую нужно отдать соседям – что бы не съесть самим.

Впрочем, нужно отдать должное Первому – он достаточно последователен. После второго или третьего раза, когда я спросил, почему же он ест пиццу, если считает её плохой пищей и не любит, он действительно перестал её есть. Пожалуй, в следующий раз при случае я спрошу его про биг мак или биг тейсти из Макдональдса.

Впрочем дело по сути не в твороге, а в том, как Первый обосновывал. Я раньше не замечал, только последнее время начал – люди очень часто стремятся поменять что-то значимое на что-то совершенно пустое. Стремление понятно. Малопонятно ожидание человека, что ему действительно удастся поменять пустое на полное. Ещё менее мне понятно, когда я вижу, что поменять действительно удаётся.

Что пустое, а что полное? Слова и действия. Если один сказал, что нужно поступать так-то и сказал так, что с ним согласились окружающие, то уже не важно, правильный ли это поступок или нет, все ожидают, что ты будешь поступать именно так. Смешно. И не смешно одновременно. Про эксперемент Стэнли Милгрэма, думаю, знают все. Думаю, не ошибусь, если обобщу его – человек согласен подчиняться авторитету, даже если это вразрез с его убеждениями. Потому, если ты сначала смог словами сделать себе авторитет (а авторитет почти всегда – просто слова), то потом словами же можешь добиваться, что бы люди делали то, что тебе нужно. Главное не давить авторитетом, рассыпется, а убеждать правильно.

Немного зарисовок из жизни. В отличии от умозрительных примеров они не очень метко подходят к посту, зато, в отличии от умозрительных примеров, реальны.

Идем в кино на Алису. Все уже в зале, я купил кока-колы, тоже иду в зал. Купил её не в баре при кинотеатре, а в Ростиксе, в 20 метрах (это было в меге, всё под одной крышей). Какой-то охранник мне бросает – «с купленной не здесь нельзя». В ответ ему бросаю «окей», не замедляя шага. Чего он хотел? Поменять идиотскую фразу на ещё более идиотское действие от меня, что б я выкинул эту и купил точно такую колу ещё раз? Смешно. Действие можно поменять только на действие, но реально-то ему плевать, потому догонять меня (он не передо мной стоял, а сбоку болтал с кем-то) ему никакого интереса не было, он и не стал.

Положил бельё в машинку. Простыня, пододеяльник, две наволочки. Запустил. Второй – когда мало, запускай на восьмерке. Вроде бы все тут взрослые люди, но желание повоспитывать друг-друга у всех периодически возникает. Чего он хотел? Он мне сказал слова, а я в обмен буду стирать хлопковое постельное бельё на режиме «30 градусов, 30 минут»? И он наверняка действительно считает, что я должен так делать. Просто потому, что он так сказал.

Жаль, ничего значительного я сейчас не делаю, потому и примеры какие-то мелочные, но общая идея должна быть понятна – не меняй свои действия на чужие слова – не выгодно.

160