[info]halturin


Абсорбент мысли

В основном про разработку, Linux, GNOME... ну и за жизнь чуток.


"Древо жизни". Фильм. АдЪ для вашего рассудка.
[info]halturin
 Сходил, посмотрел. Вот мое мнение: Это какой-то аццкий трешак от режисера-наркомана, сидящего под постоянным передозом лсд. идея фильма понятна, но этот галюциногенный набор картинок длиной в два с половиной часа(!!!), преподносимый как сюжетный ряд, распознаваем только в таком же обдолбанном состоянии как и автор этого фильма. посему, еже ли и решительно настроены на поход в кинотеатр, без тяжелой наркоты весь дзен этой утопии рассудка вам не осилить!

Вообще, этот шлак мне напомнил всем знаменитое творение человечества - "Черный квадрат" Малевича. Только такие же шизики, как сам Малевич, в состоянии разглядеть в этой мазне правильной формы какие-то замысловатые хитросплетения бытия нашего бренного. Лично для меня сей опус творчесва, покажи мне его в детстве, мог спровоцировать неиспровимую психологическую травму. Аминь всевышнему, этот бред я увидел уже в психологически вооруженном состоянии и на философский вопрос - "А что ты видишь в этой картине?" - я с твердой уверенностью могу заявить - негра, ворующего рубероид ацки темной ночью. Собственно, это было отступление, но суть ровно та же самая.

Все это "древо жизни" есть катастрофически изуродованное психологическими травмами автора, усугубленное его неизлечимой зависимости к тяжелым наркотикам, адово творение. Можно и дальше выкручивать метафоры, благо просторы великого и могучего растянулись сильно дальше моего словарного запаса, но как-то лень :).

Хотя... настоятельно рекомендую этот фильм суицидально настроенным меланхоликам, для усиления их решимости шагнуть в бездну с крыши какого-нибудь небоскреба.
  • 5
  • Leave a comment
  • Add to Memories

Ubuntu. 3G. Perfect.
[info]halturin
Наконец-то купил симку в свой ноут, который апгрейднул на предмет 3G/GPS модема. Не знаю как GPS, но GSM заработал, как говорится, из коробки. Собственно эти строки пишу вайя мегафон трыгэ :). В трее нетворк менеджер заботливо показал, что я сижу на мобильной связи буковкой гэ.



скорость дюже славбовата



ну да ладно, поюзаем-посмотрим. в любом случае, у желтополосатых дело до 3G сильно не всегда доходит, а про качество связи скромно промолчу.

И снова вимлайк для хрома
[info]halturin
Не так давно писал про Vrome (Vim-like расширение для хрома). По началу дюже понравилось, но его глючность таки вынудила меня удалить его. Пару месяцев без удобной навигации каждый раз меня заставляло вспоминать этот плагин, но возвращаться на него не было желания. Не стерпел я боле этих мытарств и решил еще раз окунуться в поиски. Ура. Нашел. Vimium. Надеюсь с ним мы поладим. На первый взгляд расклад хоткеев гораздо удобней. Ну что ж, посмотрим. Мну в экстазе :).

По мотивам статьи об Agile на хабре.
[info]halturin
Собственно вот он, виновник этого поста - http://habrahabr.ru/blogs/agile/117180/

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

"1. Вы не будете тратить время на оценки" - первая же причина столь бредовая, что и комментировать не нужно. Или кому-то разжевать?

"2. Вам будет проще объяснять руководству, почему это было таааак дооолго" - основная беда горе-разработчиков это юношеский максимализм, из-за которого им кажется, что это бизнес на них наботает, а не наоборот. Стоит ли говорить, что именно бизнес является заказчиком разработок и именно он не только в праве, но и _обязан_ требовать стоимость и сроки разработки. Если не в состоянии правильно оценить объем работы, значит здесь два варианта - либо обтекаемые требования (о чем нужно сообщить заказчику и заранее обозначить все риски), либо ты не еще не достаточно квалифицирован, чтобы занимать позицию, от которой зависит принятие решения.


"3. Вы не даете обещаний, которые сложно выполнить" - читай последнее предложение п.2

"4. Вы не давите на команду" - знаете, чем больше живу, тем шуточная фраза "чем больше узнаю людей, тем больше нравятся собаки" все больше начинает походить на правду. Основная беда человека - лень. Это нормально. Она есть у каждого, но лишь маленькая толика умеет с ней "договариваться" и еще меньшая - управлять самомотивацией. К чему я это все. Да к тому, что без "прессинга" вы не запустите ни один проект. Но здесь надо понимать, что прессинг в этом случае - умение мотивировать команду без кнута. Хотите научиться? Почитайте соответствующую литературу. Лично мне понравилась вот эта.

"5. Вы фокусируетесь на важных вещах" - феерический бред. прокомментировать почему?

Самая беда в том, что этот опус прочитает уйма прыщавых студентов, которым на производстве придется объяснять/вдалбливать очевидные вещи. В основе любого производства лежит _планирование_! Любая организация процесса начинается с _планирования_! Даже эффективное управление собственным временем начинается с _планирования_! А чтобы нарисовать план работы что нужно сделать? правильно - разбить активности на подзадачи. А как понять, сколько будет длиться весь проект? правильно, нужно оценить каждую задачу по ресурсам и срокам.

без планирования вы можете заниматься только хобби. как только появляются деньги - появляются метрики по срокам реализации, ну и все последующие типа KPI/SLA.

Абстракция языков приводит к общему отупению.
[info]halturin
Еще несколько лет назад сидя в курилке и разговаривая о высоких материях мысли постепенно перешли в русло нашего профессионального бытия. Еще тогда сетовали меж собой на неквалифицированность подростающего поколения, ставшего жертвами абстракции пэхапе, делфи и иже с ними. Чем дальше живем, тем больше сей факт встречается на фоне профдейстельности. У себя в отделе мы ввели награду "Кавалер ордена говнокода". Уже несколько человек удостоились получить это "почетное" звание. Вчера, в очередной раз тыкали носом в говнокод аффтара опуса - суть задачи такова, что требовалось работать с 4 байтам и выставлять бинарные флаги, на что он сделал преобразование инта в двоичное число (ну здесь претензий нет), а дальше трансформировал бинарное число в строку вида и работал уже как с массивом. Слов нет. Другая беда - алгоритмическая хромота. Потребовалось чуточку модифицировать rlm_python для нужд производственных, что собственно и было сделано. Здесь уже приведу копипаст кода, дабы наглядней было:

  1. if (pRet == NULL)
  2.         goto failed;
  3.     
  4.     if (request == NULL)
  5.         goto okay;
  6.  
  7.     /*
  8.      *    The function returns either:
  9.      * 1. (returnvalue, replyTuple, configTuple[, requestUpdateTuple]), where
  10.      *  - returnvalue is one of the constants RLM_*
  11.      *  - replyTuple and configTuple are tuples of string
  12.      *     tuples of size 2
  13.      *
  14.      * 2. the function return value alone
  15.      *
  16.      * 3. None - default return value is set
  17.      *
  18.      * xxx This code is messy!
  19.      */
  20.     if (PyTuple_CheckExact(pRet)) {
  21.         PyObject *pTupleInt;
  22.         
  23.         tuplelen = PyTuple_GET_SIZE(pRet);
  24.         
  25.         if (tuplelen < 3 && tuplelen > 4) {
  26.             radlog(L_ERR, "rlm_python:%s: tuple must be (return, replyTuple, configTuple[, requestUpdateTuple])", funcname);
  27.             goto failed;
  28.         }
  29.         
  30.         pTupleInt = PyTuple_GET_ITEM(pRet, 0);
  31.         if (!PyInt_CheckExact(pTupleInt)) {
  32.             radlog(L_ERR, "rlm_python:%s: first tuple element not an integer", funcname);
  33.             goto failed;
  34.         }
  35.         /* Now have the return value */
  36.         ret = PyInt_AsLong(pTupleInt);
  37.         /* Reply item tuple */
  38.         python_vptuple(&request->reply->vps,
  39.                   PyTuple_GET_ITEM(pRet, 1), funcname);
  40.         /* Config item tuple */
  41.         python_vptuple(&request->config_items,
  42.                   PyTuple_GET_ITEM(pRet, 2), funcname);
  43.         
  44.         if (tuplelen == 3)
  45.             goto okay;
  46.         
  47.         python_vptuple(&request->packet->vps,
  48.                   PyTuple_GET_ITEM(pRet, 3), funcname);
  49.  
  50.     } else if (PyInt_CheckExact(pRet)) {
  51.         /* Just an integer */
  52.         ret = PyInt_AsLong(pRet);
  53.  
  54.     } else if (pRet == Py_None) {
  55.         /* returned 'None', return value defaults to "OK, continue." */
  56.         ret = RLM_MODULE_OK;
  57.     } else {
  58.         /* Not tuple or None */
  59.         radlog(L_ERR, "rlm_python:%s: function did not return a tuple or None", funcname);
  60.         goto failed;
  61.     }
  62.  
  63. okay:
  64.     Py_DECREF(pArgs);
  65.     Py_DECREF(pRet);
  66.     PyGILState_Release(gstate);
  67.     return ret;
  68.     
  69. failed:
  70.     python_error();
  71.     Py_XDECREF(pArgs);
  72.     Py_XDECREF(pRet);
  73.     PyGILState_Release(gstate);
  74.     
  75.     return -1;
* This source code was highlighted with Source Code Highlighter.


смотрим на строки 44-48. Вот почему нельзя было написать просто...

  1.     if (tuplelen == 4)
  2.         python_vptuple(&request->packet->vps,
  3.                   PyTuple_GET_ITEM(pRet, 3), funcname);
* This source code was highlighted with Source Code Highlighter.


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

PS: вот, на закуску поржать:

-- Код выводит 1-е число месяца.
select TO_DATE(TO_CHAR(sysdate, 'YYYY') || '-' || TO_CHAR(sysdate, 'MM') || '-01', 'YYYY-MM-DD'from dual


* This source code was highlighted with Source Code Highlighter.
  • 1
  • Leave a comment
  • Add to Memories

О<thinkpad>ивание
[info]halturin
Моя слабость к thinkpad'ам проявляется уже не первый год. Особливо нравится их лэптопная клавиатура. Разумеется, когда я обнаружил для себя десктопный вариант, долго раздумывать не стал. ThinkPad USB Keyboard with TrackPoint 55Y9032


Уже месяц как дома работаю на этом девайсе. Экстаз неописуемый. Сейчас "для комплекта" присматриваюсь на их мышу

SQL. Групповая функция умножения.
[info]halturin
Никогда не возникала потребность, но сегодня на перекуре, обсуждая "академические" вопросы задались целью - а как реализовать сабж. Поясню - требуется реализовать функционал группового умножения результата выборки. Другими словами... в любой СУБД есть групповые функции типа SUM, COUNT, AVG и тд, но нет (ну не нашли мы :) ) функции умножения а-ля MUL. Мыслительные потуги привели сначала к такому результату:
select exp(sum(ln(abs(val)))) from (
 select 10 as val from dual
 union all
 select -2 from dual
 union all
 select 1 from dual
 union all
 select 1 from dual
 union all
 select 12 from dual
 )

В этом случае мы не учитываем знак результата (логарифм работает только с положительными числами). Помимо этого, логарифма от нуля не существует :). В конечном счете, с учетом отрицательных чисел и нулевых значений родился вот такой вариант :)
select exp(sum(ln(abs(valn))))*decode(mod(sum(sg),2),1,-1,1)*decode(sum(nul),0,1,0) from (
 select val, decode(val,0,1,val) as valn, decode(sign( val),-1,1,0,null,0) as sg, decode(sign( val),0,1,0) as nul from (
 select 10 as val from dual
 union all
 select -2 from dual
 union all
 select 1 from dual
 union all
 select 1 from dual
 union all
 select 12 from dual
 )
)

Можно, конечно, еще дальше фетишь наводить и избавляться от вложенных запросов, но уже лень. Главное концепт отработали :)

Свод плюсов "Слона".
[info]halturin
Давно хотел сделать подобную подборку плюсов PostgreSQL перед MySQL да все руки никак не доходили. И вот это сделал другой добрый человек :). Делаю копипаст, дабы не потерялось.

  • лучшая работа со подзапросами

  • схемы - часто очень удобно пользоваться как пространствами имен

  • чеки - позволяют дополнительно проверять данные перед сохранением

  • рулы - позволяют создавать обновляемые вьюхи

  • каскадное удаление при дропе таблицы или колонки - мускуль попросит удалять все сначала ручками

  • наследование таблиц

  • триггеры: временное отключение, триггерные функции, табличные триггеры. Временное отключение бесценно при накатывании миграций, триггерные функции можно использовать повторно

  • отсутствие кучи ограничений внутри триггеров и функций типа обновить таблицу на которой был вызван триггер и т.п.

  • сиквенсы - позволяют реализовать паттерн "поле идентификации"

  • внешние ключи: составные, отложенная проверка. Отложенная проверка полезна, когда не нужно проверять целостность во время транзакции и можно отложить это до конца транзакции

  • индексы по выражению, составные, частичные и хэш индексы, возможность задавать порядок, конкурентное создание индекса

  • сам язык SQL мощнее - включает исключения и много чего другого

  • можно писать на любом языке (Java, C, PHP и др)

  • библиотека полнотекстового поиска и куча других полезных библиотек, возможность создавать собственные библиотеки

  • рекурсивные запросы

  • запросы к XML данным

  • возможность задавать порядок вывода null полей

  • масштабирование на многоядерных системах (мускуль в этом отношении мертвый)

  • транзакционный DDL - возможность делать миграции схемы БД в транзакции.

  • простое добавление и удаление колонок. В постгре по сути изменяются метаданные таблицы, поэтому все происходит очень быстро в не зависимости от размера таблицы; а в мускуле удаление колонки может днями идти блокируя все на своем пути

  • умный оптимизатор запросов
Последняя версия 9.0 получила поддержку репликаций "из коробки", так что исчезла последняя причина оставаться на MySQL.

Источник

Креатифф по Undroid
[info]halturin
Ы :) забавно.

http://satyadhika.wordpress.com/2010/07/18/undroid-unix-android-burg-theme/




PS: картинку undroid я нарисовал в прошлом году.

Dropquest. +1Gb
[info]halturin
 Вчера прошел квест от дропбокса, за что они на халяву дают 1Гб. Таким образом, теперь можно не напрягаясь после регистрации сделать себе 3.5Гб - при регистрации дают 2Гб, 0.5 Гб дают за выполнение нескольких инструкций (пройти 6 шагов обучения, как пользоваться этим сервисом). 

Вообще, лично мне дюже сильно понравился сервис. Отныне там хранится вся моя техническая библиотека. Плюс закинул туда всякие .vimrc, .bashrc и тд. Теперь на трех компьютерах (домашнем стационарнике, ноуте и на работе) у меня все под рукой. Еще одна фича, которой я периодически пользуюсь - уходя на работу копирую свежескаченный ASOT (250Мб в среднем), а по приходу на работу он уже там ;). Ну и в довесок - есть клиент для андроида, посему скачать и почитать нужную книжку на телефоне крайне просто.

Кто еще не начал пользоваться, регистрация здесь.

PS: это не реклама сервиса, а просто выражение восторга. это действительно удобный сервис. Они одни из немногих, кто заботится об удобстве пользования их услугой. как только не будет хватать места, обязательно куплю за денежку. оно того стоит.

UPD: как пройти квест

You are viewing [info]halturin's journal