Friday, August 31, 2012

Когда мне нечего написать

Когда мне нечего написать, я не пишу. Даже если пишу о том, что не пишу, когда писать не о чем. Это ведь даже правильно - не писать, когда нет темы для написания. И я не пишу. Когда не о чем писать. Но сейчас-то ведь не тот случай, когда мне не о чем написать, и я не пишу? А может, это как раз случай, когда... Ну, вроде понятно уже.
Примерно такая каша в голове последнее время. Примерно так же выглядят мои последние тесты. Примерно... С трудом вспоминаю, что происходит в тесте, написанном чуть больше недели назад. Не работает то, что работать должно. То, что работать не должно, тоже не работает. Великий язык Перл. Ага, write-only language. Сегодня впервые про это услышал. Люблю Перл, когда пишу на нем. Ненавижу нас обоих, глядя на то, что понаписал больше месяца назад. Хотел именно про это и рассказать, кстати. И сегодня же попалась статья на эту тему. Бывают же совпадения. Не редко. Что-то, заинтересовавшее меня, может так или иначе проявляться в окружающем мире.
Будьте осторожны со своими желаниями, они осуществимы. Но детали решают все. Хотел отдохнуть от работы - неделю провалялся больной. Хотел написать статью - прочитал что-то похожее. Но написать важнее, так сам себе доказываю, что думать не разучился. А ведь первые обзацы шли с трудом...

Следующие две строчки делают одно и то же (спасибо начальнику за второй вариант):
my $var = $x > $y ? $x : $y;
my $var = ($x, $y)[$x < $y];

А это просто шутка:
sub first_and_last_quarters($) {
    my $arr_ref = shift;    
    return [@{$arr_ref}[0..($#{$arr_ref}/4)], @{$arr_ref}[(3*($#{$arr_ref}/4))..$#{$arr_ref}]];
}
Работать должно. Попробуйте теперь заменить $arr_ref на $_[0].

Friday, August 10, 2012

Парное программирование и музыка

Много мыслей в голове, а как начать пост - не знаю. Даже не знаю, о чем именно хочу написать. Расскажу, пожалуй, про музыку. Вот как было раньше? Услышал где-то песню, понравилась, услышал еще - не понравилось. На этом все и заканчивалось. Потом что-то поменялось (появился интернет): понравившаяся песня скачивалась, к ней скачивался альбом и дискография всей группы. Песни практически не слушались, просто занимали место на компьютере.
А что сейчас? Кажется, ничего не поменялось. Но это видимость. Последнее время за то, что я слушаю, отвечает она. Это она виновата в том, что я по-хорошему послушал Queen. Это из-за нее я прослушал всю дискографию Rise Against. Влюбился в Bohemian Rhapsody. Порадовался вместе с Сэло и люды и Тролль гнет ель. Плакал от '39. Восхищался Мельницей. Не останавливался вместе с Don't stop me now и Fat Bottomed Girls. И это не в прошедшем времени на самом-то деле.
Весь предыдущий абзац посвящен Willi. Так уж вышло.

А еще мы с Яськой практиковали парное программирование. Ну как парное: она пишет, я троллю. Хотя пару раз вырывал клавиатуру из ее уставших рук и писал сам. Сегодня решили поменяться ролями: выяснилось, что кодит она лучше, чем троллит.
Сама же практика парного программирования весьма хороша - код действительно получается качественне. И читаемее и правильнее. Кстати, я придумал, как нам сделать один совершенно неочевидный момент совершенно очевидным. Какая замечательная тавтология.

Получился какой-то ясин пост. Ну и пусть.

Thursday, August 2, 2012

doctorhead.ru

Если вы когда-нибудь будете гулять по Нижнему Новгороду и совершенно случайно рядом с вами окажется здание 6 по улице Ванеева, то не откажите себе в удовольствии зайти в уютный магазин doctorhead.ru. Два молодых человека помогут вам подобрать наушники под любимую вами музыку с учетом всех ваших требований. Если с собой у вас не окажется плеера, вам предложат местный - один из тех, что есть в магазине. Если вам очень повезет, то на плеере окажется часовая wav'ка с Classic Queen, где на 8-й минуте вы сможете оценить звучание любых наушников.

PS возможно, в магазине работают не два молодых человека (а больше)
PS' на 8-й минуте Bohemian Rhapsody (последние две минуты)
PS'' так и не смог определиться, но остановился на паре вариантов, обязательно зайду к ним еще

Wednesday, July 25, 2012

Без названия #1

Мне вдруг сегодня вспомнился один занятный случай из далекого прошлого. Дело было в летнем лагере, мне лет 13. В один из последних дней нам устроили глобальный тимбилдинг, как ныне говорят: всем выдали пачку порезанных ниток и пустые бусы с меленьким навесным замочком и парой ключиков. Один ключ, понятное дело, себе, другой - самому близкому человеку в лагере. А вот ниточки на бусы можно было повязывать кому угодно, только при этом надо было объяснить, с чего вдруг такая вольность в поведении. В тот день я чем-то отравился и довольно долго отлеживался в палате. В итоге бусы к концу дня бусы у меня пустые, ключа два, да еще и пучок ниток. Ну я и пошел всем доказывать, как они мне дороги и как я всем благодарен (сарказма нет, с ребятами из своего отряда я очень подружился). Подхожу к девушке, спрашиваю: "Где, мол, твои бусы?". А она как-то так обрадовалась, удивилась: "Ты хочешь мне повязать?!". Ниточку я успешно отдал, и даже взамен получил, кажется. А сейчас вот вспомнил тот случай и задумался: да что ж в этом было такого? Мы примерно 10 дней целыми сутками все вместе были, сплачивались по полной, а ниточку повязать - это уже слишком? Да я ж там всех любил примерно одинаково, мне это в радость было - дарить ниточки и теплые слова. Вывод тут какой: мы, люди, часто уделяем слишком много внимания совершенно незначительным вещам. А значительность определяем для себя сами.

Что-то затянулось вступление, я ж про другое хотел рассказать. Вот есть в мире масса языков программирования, многие из них очень широко распространены, некоторые я знаю. Больше всего мне приходится писать на Perl'е. Это восхитительно ужасный язык программирования. Столько всего можно сделать в одну строчку и получить от этого такой гиковский кайф, что захочется продолжать и продолжать. Но вот через неделю этот код проще переписать, чем прочитать...
Но если уж писать на перле, то извольте освоить сложные конструкции типа хэша хэшей хэшей. Вот о них и хочу рассказать.
Есть у нас хэш:
my %hash = (
    'first'  => 1,
    'second' => [1..10],
    'third'  => 'string here'
);
Второй элемент есть не что иное как ссылка на массив, т.е. общая структура чуть сложнее самой простой. Напишем простенькую функцию для распечатки такой структуры:
sub print_my_hash($) {
    my $ref = shift;
    map {
        if (ref($ref->{$_}) eq 'ARRAY') {
            print join(', ', @{$ref->{$_}}), "\n";
        } else {
            print $ref->{$_}, "\n";
        }
    } keys %{$ref};
    print "\n";
}
Если обнаруживаем ссылку на массив - обрабатываем отдельно. При распечатке получим вот это:







Пока делал скрин и, не побоюсь этого слова, обрезал его, чуть с ума не сошел: в убунте сначала пришлось найти приложение, которое бы могло это сделать, а потом убедить его работать так, как мне надо, а не так, как создатель пожелал. Уфф, не отвлекаюсь.

Вернемся к коду: все распечаталось как мы ожидали (я-то точно). Теперь скопируем наш хэш в другой:
my %copy = %hash;
Было не сложно, правда? Распечатаем и его:








Ура, отличий нет, копирование прошло успешно.
Теперь возьмем и поменям какой-нибудь элемент массива в новом хэше и распечатаем его:
$copy{'second'}->[4] = 100500;
print_my_hash(\%copy);




Все опять именно так, как ожидалось.

Внимание, сейчас будет развязка. Приготовились? Точно? Уверены? Вопросы уже достали? Ок, заканчиваю издеваться над теми, кто правдами или неправдами дочитал до этого момента: что находится в пятом элементе (индекс = 4) массива в первом хэше?
Вопрос выглядит совершенно по-идиотски, если вы пишете/писали на C. Он даже для опытных перлописцев слишком прост. Но прежде чем назвать меня профнепригодным представьте себе конструкцию из хэша с десятком полей, значениями которого могут быть и скаляры (в перле это и строки и числа), и хэши, и ссылки на массивы и хэши. Скажете, можно без этого? Наверно, но это же перл, это нормально. Правильный ответ, кстати, 100500.

К чему я это? Извольте: все современные фреймверки и языки программирования сильно абстрагируют обычного программиста (меня) от реально происходящих в машине событий. Ничто не заменит мяса в колбасе базовых знаний ОС, структур данных и умения работать с памятью.

Полный код и постскриптумы:
#!/usr/bin/perl

use strict;
use warnings;

sub print_my_hash($) {
    my $ref = shift;
    map {
        if (ref($ref->{$_}) eq 'ARRAY') {
            print join(', ', @{$ref->{$_}}), "\n";
        } else {
            print $ref->{$_}, "\n";
        }
    } keys %{$ref};
    print "\n";
}

my %hash = (
    'first'  => 1,
    'second' => [1..10],
    'third'  => 'string here'
);
print_my_hash(\%hash);

my %copy = %hash;
print_my_hash(\%copy);

$copy{'second'}->[4] = 100500;
print_my_hash(\%copy);

print_my_hash(\%hash);

PS: зачем я объединил два разных поста в один? Не знаю, само собой.
PPS: с описанным примером сталкивался в реальной работе дважды или трижды. Всегда все было не так очевидно, как в описанном здесь примере, и связано было, в основном, с перлофичами.
PPPS: код подсвечен с помощью этого: http://tohtml.com, а написан с помощью Sublim
PPPPS: убунта неприятно удивила, но в венду не перезагружусь
PPPPPS: в блогспоте мне не нравится - неудобно писать свои мысли, настраивать форматирование и пр.

Sunday, July 22, 2012

О чем вообще говорят мужчины

Вечер пятницы, офис маленькой никому неизвестной компании, уже пора бы домой. Но мы с Сашей не уходим - ждем. Звонок. Приехал Андрей. Выходим, едем ко мне. Надо бы закупиться разными гадостями, чтобы ударить ими по здоровью.
- Чем завтракать будем? Вообще что-то планируется?
- Яичницу пожарим. Надо только хлеба взять.
Из гадостей взяли колу и чипсов, все стандартно.
 - Вы есть-то хотите? Можем по-хорошему поужинать. Картошка, салатик.
 - Да!
Ох, студенты :) Веселая кассирша просит автограф и говорит, что будет плакать, если я не вернусь. Обещаю зайти еще и мы уходим.
 - Тут кухня, вот комната.
Моем картошку, огурцы, помидоры.
 - Огурцы попадаются горькие. Саш, ты должен их все попробовать. Андрей, вот сковорода, нож, картошка. Мы верим в тебя.
Режу салатик, Андрей помогает посолить, Саша твитит. В соседней комнате лежит зеркалка, но кому она нужна, если в телефоне есть камера?
 - Я не хипстер!
 - А сколько ты набрал в хипстер-тесте?
 - 100%.
 - Теперь скажи еще раз, что ты не хипстер.
Картошка готова. Салат тоже. Раскладываем по тарелкам, едим. Вкусно. Мы все молодцы.
 - Салат надо доедать. Саш?
- Ага, а то будешь потом голодными зимними вечерами вспоминать, что когда-то не доел.

- Посасывая палец...

- Чужой.
Теперь на столе персики, кола. Кажется, пора высыпать чипсы. Разработчики мы или нет?
 - Как же можно делать эти проектики? Надо разрабатывать комплекс! Лет на 20-30.
Ага. Разговор плавно и не очень перетекает с темы на тему. Как на личном?
 - Саш, ну хоть ты нас порадуй.
 - Я гей, мужики.
Время за полночь. Вторая двухлитровка колы открыта, пачка чипсов тоже не первая. Что там на счет комплексов-то?
 - В коде всегда надо оставлять только тебе известные баги. И писать его надо так, чтобы никто ничего не разобрал. Так станешь незаменимым сотрудником.
 - Убивать...
Нет, серьезно, что там с комплексом?
 - А комплекс неполноценности тебя не устраивает?
Почему бы не заняться исследованием влияние повышения температуры в районах, населенных сусликами, и последствиями этого повышения? Захват сусликами новых территорий... Бред.
 - В мире после атомной войны не будет коммуникаций. Приборы будут сломаны или просто бесполезны. Для передачи информации выжившие люди смогут использовать тараканов.
 - Перспективная разработка. Пару миллиардов на первые два года исследований можно смело закладывать. Плюс 30 лет по доработку. Вот тебе и комплекс.
Половина 5 утра. Отвозим Сашу до места его пребывания, едем обратно.
 - Мы с тобой спать-то вообще будем?
 - Ну не прям с тобой.
Тяжело засыпать, когда снаружи начинается день. В голове формируется текст, звучит Radio Ga Ga и фраза "двойной хлопок и ладони вверх".

Friday, February 10, 2012

Отдам плагин в хорошие руки

Есть такой замечательный редактор - Sublime Text 2. Даже несмотря на мою любовь к Notepad++ могу смело заявить: "Sublime лучше!". Кто не верит - проверяйте сами.
    Но речь не о самом редакторе. Я написал для него небольшой и никому не нужный плагин. Написал сам, используя все свои познания в Python'е и написании плагинов для Sublime. Плагин нужен для одной простой вещи: узнать кто написал строчку под курсором. Узнает он это из системы контроля версий Git. В целом даже работает.
    Так как выкидывать его жалко (я ж время потратил) а развивать его не планирую (он же никому не нужен!), то решил код опубликовать тут. Ну и сам файлик приложил.
    По вопросам копирайта: данным постом подтверждаю, что не претендую и в дальнейшем упоминаться автором приведенного ниже кода, не потребую никаких отчислений и прочей фигни (но если вы сможете заработать на этом, я вас, кем бы вы ни были, скорее всего прокляну. Шутка).


Вот код (подсвечено с помощью этого):
Copy Source | Copy HTML
  1. import sublime, sublime_plugin
  2. import os, re
  3. class GitWho(sublime_plugin.TextCommand):
  4.     def run(self, edit):
  5.         v = self.view
  6.         file_name = v.file_name()
  7.         line, col = v.rowcol(v.sel()[ 0].begin())
  8.         line += 1
  9.         cwd = os.getcwd() # save current work directory...
  10.         os.chdir(os.path.dirname(file_name)) # ... to use git ...
  11.         output = os.popen("git blame -L " + str(line) + "," + str(line) + " " + file_name).read()
  12.         os.chdir(cwd) # ... and reset it back
  13.         tmp = re.search('\((.*) (\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2} [+-]\d{4})', output)
  14.         if tmp:
  15.             author, date, time = tmp.group(1), tmp.group(2), tmp.group(3)
  16.             sublime.status_message('Changed by ' + author + ' on ' + date + ' at ' + time)
  17.         else:
  18.             sublime.status_message('Cannot blame this file')


Возможные проблемы в плагине:
  • неправильный номер строки: в редакторе они нумеруются с 1, а в Git'е? (это надо проверить, а мне уже не хочется)
Предлагаемые улучшения:
  • поддержка всех широко распространненых систем контроля версий
  • определения авторства не только строки под курсором, но и выделенного блока

Чтобы попробовать плагин нужно прочитать вот эту статью, чтобы научиться :)

Tuesday, November 15, 2011

Путь до Сарова был страшно опасен...

    Полон опасностей путь из Н.Новгорода до Сарова. Причины как всегда две - дураки и дороги.
    Сразу за дивеевской развилкой хорошая дорога заканчивается и начинается обычная - с кочками, ямами и без разметки. И если первые две проблемы не так заметны на моем Renault Sandero (хвала конструкторам за потрясающую подвеску!), то вот полосочки иметь хотелось бы. Пусть хоть на ночь их наклеивают :)
    Возвращаясь к дуракам (я в главной роли) и дорогам (см. выше): темно, еду примерно 100 км/ч, передо мной девятка (ВАЗ 21099), за мной еще несколько машин. С горки на горку, в поворот, снова на горку, с горки... БРЕВНО! Хорошее такой бревно (кажется березовое) лежит прямо поперек дороги. Первым в него влетает девятка, затем уже я. Что делает неопытный (я) водитель в такой ситауции? Правильно, тормозит. Удар, подскок, странный рев, тянет на встречку (там никого, к счастью) и потрясающее ощущение от езды на спущенном колесе.
    Прижимаюсь к обочине со своей стороны, включаю аварийку, осматриваюсь. Девятка стоит чуть в впереди, но вскоре уезжает. Выхожу, кричу что-то машине, быстро едущей в сторону бревна. Но, видимо, я его куда-то утащил, т.к. все остальные едут нормально. Осматриваю машину. Бампер цел, спущено только переднее левое колесо, но зато полностью. Ставлю запаску (летнюю, еще заводскую). Начинаю ехать. Рев самодельной гоночной машины преследует меня остаток пути. Подобный звук мне знаком еще с шестерки (ВАЗ 21063), защиту-то по молодости не раз поджимал. Но на своей машине звук как серпом... ножом по сердцу. Быстро ехать боюсь: а вдруг не защита? Да и одно летнее колесо впереди уверенности не прибавляет.
    Вечером все думал - а чего это колесо спустило? Проткнул? Когда менял ничего особенного не заметил, но я не приглядывался. А вот утром внимательно осмотрел колесо:
Диск немного погнут с внешней стороны

Внутри хуже - часть диска просто отколота

Да и вообще диска два - трещина по всему диску
    Вобщем диску конец, а вот резина цела.

    В результате как я и ожидал - защита прижалась к кузову и выхлопной трубе, отсюда и рев. Чтобы доехать до НН обратно перекинули зимнее колесо вперед. Тут всплыла еще одна проблема - на внутренней стороне балона грыжа. Нет худа без добра - не залез бы, не узнал. А кто знает что с ним дальше будет... Так что менять придется и баллон тоже.