Home

Пн, 23 Ноя, 2009, 01:42
Vim одним окном

Я однажды жаловался, что нельзя-де сделать так, чтобы при открытии очередного файла из Фара он открывался бы в уже запущенном экземпляре vimа. Оказывается, можно и это.

Сначала запускается vim-сервер: vim --servername foo. Затем любая команда типа vim --servername foo --remote-tab bar.txt открывает bar.txt в серверном экземпляре, названном foo (в отдельном табе).

Для этого vim должен быть собран с фичей clentserver (:help remote.txt); для виндовой версии 7.2 это так.

Прусь несказанно.

Upd. Теперь у меня в Фаре стоит такой вызов внешнего редактора по Alt-F4:
start cmd /c vim --servername vim --remote-tab !.!

Сб, 21 Ноя, 2009, 15:15
Vim: удалить и вставить

Одна из сил vimа в том, что называется {motion}, то есть некое движение. Например, нажимая w, я перемещаюсь к началу следующего слова. А 3w перескочит к началу третьего слова. Ну, этим никого не удивишь: в обычном редакторе можно нажать Ctrl и стрелку вправо. Три раза.

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

Но основная сила в том, что {motion} может комбинироваться с операторами. Если я жму yw, то оператор y (yank = copy) копирует текст от сих и до начала следующего слова. А если y% (например, на вызове функции), то от сих и до закрывающей круглой скобки (то есть весь вызов целиком, вместе со всеми вложенными скобками). А если yi" (i = inner), находясь где-нибудь внутри строки, ограниченной кавычками, то всё содержимое этой строки. Ну и так далее.

Идём дальше. Допустим, есть такой код:

if (check_err(errhp, OCIParamGet(stmtp, OCI_HTYPE_STMT, errhp, (dvoid**)&parmp, i) )) {

И захотел я заменить в нём выделенный вызов функции на другой, который предварительно скопировал (с помощью %, конечно). Встав на начало вызова (в начале строки для этого достаточно fO, что переместит нас к первой букве O), приходится сначала удалить ненужный вызов: d% (d = delete), а затем вставить скопированное. Но поскольку d сам по себе копирует удалённое (то есть работает как cut), то скопированное ранее надо извлечь из специального регистра "0: "0P (P = put, то есть paste).

Посчитаем нажатия: d%"0P, 5 штук. Много. Хочется такой оператор, чтобы удалял {motion} и сразу вставлял на его место скопированный текст. А такого почему-то нет. Хотя подобную операцию приходтся проделывать довольно часто.

К счастью, у нас есть help :map-operator, а в хелпе есть прекрасные примеры, с помощью которых можно шаманить, даже не до конца всё понимая. В итоге рисуется такая функция:

function! PutInstead(type, ...)
  let sel_save = &selection
  let &selection = "inclusive"

  if a:0
    silent exe "normal! `<" . a:type . "`>d\"0P"
  elseif a:type == 'line'
    silent exe "normal! '[V']d\"0P"
  elseif a:type == 'block'
    silent exe "normal! `[\<C-V>`]d\"0P"
  else
    silent exe "normal! `[v`]d\"0P"
  endif

  let &selection = sel_save
endfunction

Она маппится на запятую:

nmap <silent> , :set opfunc=PutInsteadg@
vmap <silent> , :<C-U>call PutInstead(visualmode(), 1)

После этого вся процедура требует двух нажатий: ,%. Почему запятая? Ну просто все клавиши уже напичканы функциями, а запятая среди них самая ненужная.

Вс, 15 Ноя, 2009, 21:49
Указатели, латынь и математика

Есть две вещи, которым традиционно учат в университетах в курсе компьютерных наук и которые многие люди никогда полностью по-настоящему так и не понимают: указатели и рекурсия. ... Эй, в 1900 г. латынь и греческий были обязательными предметами в колледже не потому, что они были как-то необходимы в жизни, но потому, что их знание было одним из обязательных признаков образованного человека. ... «Латынь тренирует ваш ум. Тренирует вашу память. Распутывание предложений на латыни — это отличное упражнение для ума, настоящая интеллектуальная головоломка, и хорошее введение в логическое мышление» — писал Скотт Баркер. Но я не смог найти ни одного университета, который до сих пор преподаёт латынь в обязательном порядке. Неужели указатели и рекурсия — это латынь и греческий компьютерных наук?
— Джоэл Спольски, «Опасности обучения на Java».

Математика может оказаться для компьютерных наук тем же, чем в своё время стала латынь для прочих образовательных предметов. ... Мы продолжаем делать вид, будто математика связана с программированием, несмотря на то, что времена, когда это действительно было так, давно миновали.
— Роберт Гласс, «Креативное программирование».

Пт, 13 Ноя, 2009, 17:47
Oracle Call Interface

Рассуждая в начале года про vim и dbext, я пришёл к выводу, что вызов sql*plus для выполнения запросов не годится, так как он некорректно обрабатывает «широкие» таблицы. И что надо писать свою программку.™

На чём её писать? Нужно что-то такое, чтобы работало на тех же платформах, где и vim. Причём не хотелось бы, чтобы потреблялось много ресурсов — ну неохота мне ждать, пока запустится какая-нибудь виртуальная машина только ради того, чтобы выбрать sysdate из dual. Так что пусть будет Си + OCI.

OCI оказался мудрёным, выборка sysdate вылилась чуть не в две сотни строчек, которые для истории лежат под катом )

Программка отлично скомпилировалась gcc под cygwin следующим образом:

gcc -o test.exe -I%ORACLE_HOME%\oci\include test.c %ORACLE_HOME%\bin\oci.dll

Но как же я привык к исключениям! Страдаю без них. И как же я отвык от вот этого:

   6585 [main] test 196 _cygtls::handle_exceptions: Exception: STATUS_ACCESS_VIOLATION
  10471 [main] test 196 open_stackdumpfile: Dumping stack trace to test.exe.stackdump

PL/SQL forever! (Кстати, DB2 с недавних пор поддерживает PL/SQL, так что...)

Пн, 9 Ноя, 2009, 19:11
Протвинские новости

Давно не появлялся в Протвино, а там столько всего нового сразу...

Во-первых, вдоль по трассе М2 на изрядное расстояние от Москвы протянули освещение. Это приятно, потому что в ночное время и по скоростной ездить не очень комфортно. Вот бы ещё сделать по три ряда в каждую сторону до Серпухова.

Во-вторых, ИФВЭ отобрали у минатома и отдали миннауки, слив с курчатником и ещё несколькими институтами. И вроде никакой он уже не ИФВЭ, а как-то по-другому называется. Жесть.

В-третьих, накрылся «Самохвал», лишив город единственного приличного продуктового магазина. Теперь у нас «Магнит» вместо «Восхода», «Пятёрочка» вместо «Руси», «Дикси» вместо «Юбилейного» и «Копейка» вместо «Самохвала». Буэ.

В-четвёртых, около ЗАГСа (который, в продолжение темы, занял место почты на Лесном) устроили хрень в виде двух журавлей, вьющих гнездо, и на забор вокруг оной молодожёны теперь радостно вешают замочки. Ну ума у людей, ни фантазии. То ли дело наши монстры, которых мы повесили на забор теоркорпуса ещё в школе:

Наверняка есть и ещё что-то, достойное внимания, но за один вечер больше не успелось.

Пн, 9 Ноя, 2009, 18:10
Книги: октябрь

Томас Кун, «Структура научных революций» (КПК)

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

Интересной показалась мысль о том, что парадигмы нельзя воспринимать, как разные интерпретации одних и тех же фактов. То есть нельзя сначала накопить наблюдения, а потом спокойно теоретизировать: парадигма диктует, на что именно вообще имеет смысл смотреть и под каким углом. Для Куна учёный после смены парадигмы живёт в другом мире.

Стивен Хокинг, «Краткая история времени»

Парадигмы менять нелегко — что экспериментально проверено этой книгой, взятой у [info]sergg_rw. Физик-теоретик Стивен Хокинг на пальцах рассказывает о современных научных воззрениях — о теории относительности, квантовой механике и о том, как подружить все четыре вида взаимодействий в рамках единой теории.

Мозг не выдерживает и взрывается. С горя перечитал, что говорилось про искривление пространства в «Астровитянке» — легче особо не стало. Про кварки вообще молчу. «Если человек не понимает проблемы, то пишет много формул, а если понимает — то всего две» — говорил Горькавый устами одного из профессоров колледжа. Хокинг обошёлся одной.

Марина и Сергей Дяченко, «Пещера» (КПК)

Книга приятно удивила. Дочитав до середины, я решил, будто знаю, о чём она («эксперимент на тему: что, если в человеке отделить звериное от собственно человеческого» — что-то в таком духе), но книга неожиданно оказалась более глубокой. Возможно, самая серьёзная вещь у Дяченок, которую я читал. Им бы ещё научиться завершать свои произведения...

Михаил Анчаров, «Фантастическая трилогия» («Сода-солнце», «Голубая жилка Афродиты», «Поводырь крокодила») (КПК)

«Cоду-солнце» мне с год-другой назад подсунула [info]hufuga, за что ей большое человеческое спасибо. Сейчас снова перечитал, а попутно выяснилось, что это трилогия, так что прочитал всё вместе. (Также попутно выяснилось, что Анчаров ещё и первый бард, зачинатель авторской песни.)

«Cода-солнце» — прекрасная вещь, «нелепо правдивая и потому фантастическая история, ибо что такое фантастика, как не правда, доведённая до абсурда?». У неё есть такая лёгкость и внутренний ритм, что решительно невозможно оторваться от текста до самого конца. Остальные два рассказа более фантасмагоричны, что ли.

Пн, 9 Ноя, 2009, 17:40
Любимовка-2009: день и вечер

Напоследок ещё несколько снимков.

5 кадров, 744 K )

Пн, 2 Ноя, 2009, 12:25
Любимовка-2009: рассвет

Спрашивается, что такого в этой Любимовке, что мы ездим туда каждый год (а некоторые вот уже 20 лет)? Да ничего особенного, какие-то самые простые радости жизни: посмотреть на звёзды, встретить рассвет на реке, поесть ухи из котелка на берегу, посидеть у костра, вдохнуть аромат свежевыпеченного хлеба, созерцать, ни о чём не думая...

В Любимовке всё это счастье волшебным образом сходится в одном месте и в одно время.

6 кадров, 608 K )

Вс, 1 Ноя, 2009, 21:47
Любимовка-2009: ночь

Маленькая ночная туманная прелюдия.

4 кадра, 258 K )

Сб, 31 Окт, 2009, 17:57
Y2K Bug

ГУК ЦКИ «Меридиан», обитель совка.

Сб, 31 Окт, 2009, 01:14
Про тимбилдинг

Во всех книжках_про говорится о том, как важен тимбилдинг: собрать народ в неформальной обстановке в надежде на то, что среди них завяжутся какие-то отношения и получится команда. Но нигде я не встречал о том, чтобы собрать вместе поработавшую команду, раздёрганную нелёгкой жизнью по разным местам и проектам. Чего-то они все недопонимают, ведь это так здорово!

Чт, 22 Окт, 2009, 15:35
Hardware

Технологии развиваются так быстро, что каждый раз, когда наконец соберёшься проапгрейдить домашний компьютер, оказывается, что проще купить новый. На этот раз выяснилось, что приличные диски IDE уже не делают, надо переходить на SATA. Ну что ж, новый так новый.

Основная засада старого компа — хроническое отсутствие свободного места (250 Gb); по мелочи хотелось увеличить ОЗУ (768 Mb), уменьшить шум (два вентилятора на корпусе + кулеры процессора, видеокарты и блока питания = пылесос) и поменять ЭЛТ на ЖК.

Проблема места была решена приобретением двух «полторашек» WD Caviar Green 1.5 Tb — один основной, другой для резервного копирования. С зеркальным райдом решил не связываться. Может и зря, но у меня не было уверенности, что при выходе из строя одного диска второй без проблем заработает автономно, а проверять ломало. Пока использую старый добрый xcopy, а вообще надо будет поискать утилиту™ для синхронизации дисков.

После того, как скопировал все архивные CD и DVD с фотографиями, осталось порядка терабайта. Должно хватить надолго, учитывая, что за мегапиксельностью я не гонюсь да и снимаю реже, чем хотелось бы. Должен отметить, что болванки прочитались все без каких-либо проблем, даже записанные семь-восемь лет назад. Но только на родном приводе TEAC, на котором они нарезались (его пришлось заменить на другой, чёрный). Новый привод Optiarc не сумел прочитать практически ничего. Да, я всегда любил TEAC (куда он, кстати, делся?) и не доверял Sony, но факт: узким местом были вовсе не болванки, а привод — если бы он накрылся, с архивом были бы большие проблемы. Но всё, долой болванки: стоимость гигабайта на винте уже настолько мала, что проще всё хранить на жёстких дисках.

Борьба с шумом не была маниакальной, но всё же вылилась в покупку не самого простого корпуса Antec Mini P180. По сравнению с моим старым InWin’ом здесь всё круто: винты крепятся на резиновых втулочках, на макушке вращается огромный тихий вентилятор, ну и всё такое. Плюс к этому сами винты тихие (не даром green), блок питания тоже с большим кулером, а видеокарта меня вполне устроила встроенная в маму (ASUSTeK M4A78-EM).

Кстати, за счёт того, что на маме уже всё есть, а вместе с IDE ушла в прошлое магия джамперов, собирать компьютеры совсем просто. Повтыкал компоненты — и всё заработало с первого раза.

К процессору особых пожеланий не было, но, как давний поклонник AMD, остановился на двуядерном Атлоне. RAW-конвертор теперь просто летает. Памяти два гига, скромненько.

Насчёт монитора особого выбора не было. По достоверным слухам, единственные пригодные для работы с фотографиями мониторы сейчас делает NEC на матрице S-IPS. У меня теперь 20-дюймовый MultiSync LCD2090UXi. Стоит он, конечно, как всё остальное вместе взятое, но он того стоит. Знающие люди утверждают, что для полного счастья его ещё надо периодически калибровать, но мне пока и так хорошо, тащусь от цветов и незаваленных теней.

Ср, 21 Окт, 2009, 15:45
Cast a multiset spell

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

Иными словами:

create table t(
  n number
);
insert into t(n) values (1);
insert into t(n) values (2);
insert into t(n) values (3);
Запрос должен вернуть:
1
2
2
3
3
3

Решение меня ошарашило )

Ср, 21 Окт, 2009, 14:54
Граматеи

Ценник в столовой: «Розачка с карицей». Я в шоке, дорогая редакция.

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

Пн, 12 Окт, 2009, 18:01
Музыкальное

Заслушав до дыр Нопфлера (Before Gas And TV уже называл, а ещё So Far From The Clyde! Ну и Border Reiver, Cleaning My Gun и Get Lucky, конечно), решил посмотреть, что вокруг ещё новенького.

Оказалось, что я как-то пропустил альбом Ника Кэйва Grinderman, записанный ещё в 2007 году. Вообще последние альбомы Кэйва мне перестали нравится, что Abattoir Blues, что Dig Lazarus Dig — какие-то они стали невыразительные. А вот Grinderman ничего так, с настроением.

Ещё нашёл у Пикника Железные мантры 2008 года. По первому впечатлению — сплошной перепев прошлых тем и мелодий. Такое складывается чувство, что совсем исписались ребята, всё достойное заканчивается на Говорит и показывает, ну может ещё Королевство кривых с натяжкой. А жаль.

Пн, 5 Окт, 2009, 21:26
Книги: сентябрь

Марина и Сергей Дяченко, «Скитальцы» и «Пандем» (КПК)

«Скитальцы» — фэнтези-серия из четырёх рассказов про одно, в общем-то, и то же: когда всё против них, герои преодолевают себя, даже не имея особой надежды на успех. «Шрам» весьма понравился, «Привратник» — необходимая для него прелюдия, а вот последние два — как-то не очень.

«Пандем» — идеи прогрессорства живут... но побеждают ли? Хороший рассказ.

Борис Акунин, «Сокол и Ласточка»

«Остров сокровищ» на новый лад под фандоринским соусом. Собственно, после Стивенсона в этом жанре трудо сказать что-то новое.

Питер Гудлиф, «Ремесло программиста»

Как все ораторы, которые ставят себе целью исчерпать тему, он исчерпал терпение слушателей.
— Оскар Уайльд.

Автор пытался охватить всё, связанное с программированием; книга вышла большой, но на редкость поверхностной. Может оказаться полезной для начинающих в качестве обзора.

А самое главное, он назвал vi «печально известным редактором» и поставил его в один ряд с Блокнотом. Goodliffe sucks.

Вт, 29 Сент, 2009, 10:31
Я, ты, он, она

Человек склонен персонифицировать сложные вещи; так, мы говорим о характере и причудах своей машины и часто называем её по имени. Однажды братец, обсуждая это со своими друзьями, пришёл к выводу, что машина чаще представляется в женском роде (после чего наша девятка была немедленно названа «Серёгой», но это отдельный случай).

Похоже, что у них там машины тоже «девочки» — вот из новой песни Нопфлера «Border Reiver» про водителя грузовика:

She’s shining in the sun
My Scotstoun lassie

А вот вы как называете свою... свой... своё транспортное средство?

Пн, 28 Сент, 2009, 15:11
Hush, little baby

Не так давно мне повстречалась книжка «Mother Goose Rhymes» — всякие небольшие детские английские стишки с русскими переводами, а иногда и несколькими. Это само по себе увлекательно, но особенно я обрадовался, встретив колыбельную:

Hush, little baby, don’t say a word,
Daddy’s gonna buy you a mockingbird.

Вот, оказывается, откуда эти строчки в металликовском «Enter Sandman»! А ещё в нём упомянается детская молитва:

Now I lay me down to sleep,
I pray the Lord my soul to keep.
Should I die before I wake,
I pray the Lord my soul to take.

Она же, кстати, звучала в одном из фильмов про Фредди Крюгера, где её перевели вот так:

Я ложусь к исходу дня,
Пусть Господь хранит меня.
Если я умру во сне,
Пусть он вспомнит обо мне.

Но понял я это не сразу, а когда случайно сопоставил то и другое: перевод «подошёл».

P.S. Оказалось, что в английской википедии про всё уже давно написано. И про Enter Sandman, и про Hush, Little Baby, и про Now I Lay Me Down To Sleep тоже. Им-то хорошо, для них это привычный фольклор...

Ср, 23 Сент, 2009, 18:23
Тестирование запросов

Возвращаясь к Физерсу, работе с унаследованным кодом и тестированию. Допустим, мы осознали, что блочное тестирование рулит, и хотим претворить его в жизнь. Что для этого нужно? Для начала неплохо бы найти что-то наподобие xUnit для языка PL/SQL. Оказывается, есть и такое, например utPLSQL, разработанный небезызвестним Стивеном Фейерштейном.

Дальше мы берём первую попавшуюся функцию, смотрим на неё... И понимаем, что необходимо описать контекст, в котором ведётся разработка.

Есть довольно большая ERP-система, а конкретно — Oracle E-Business Suite (не побоюсь этого слова). Код, который пишется, можно условно поделить на две неравные половины: «отчёты» и «программы». «Отчёты» только читают данные, их отличает минимум логики на уровне PL/SQL, но тяжёлые и сложные SQL-запросы. «Программы» что-то делают с базой; обычно это довольно много PL/SQL-кода и не столь тяжёлые, но всё-таки сложные запросы.

Понятно, что блочное тестирование лучше всего работает для функций без побочных эффектов. Тогда нет проблем вызвать функцию дцать раз с разными параметрами и сравнить результаты с ожидаемым. Как быть, если функция зависит от состояния БД или изменяет его?

Физерс рекомендует нещадно разрывать зависимости от базы, отделяя мухи от котлет, то есть логику от выборки данных. Надо ли этим увлекаться? Не уверен, поскольку так можно погубить наглядность, достигаемую за счёт тесной интеграции SQL с процедурным языком в PL/SQL.

Но, допустим, так или иначе весь не-SQL-код протестирован. Какое тестовое покрытие мы получим? В наших реалиях — небольшое, поскольку, во-первых, «отчётов» всё равно больше, и во-вторых, для «программ» правильная выборка (как и правильное изменение БД) также критически важна. Значит, надо научиться тестировать SQL.

Если функция изменяет состояние БД, это протестировать достаточно просто. Можно запомнить состояние до изменения и сравнить его с состоянием после изменения. Как правило, мы понимаем, как отобразить функциональные требования на состояние таблиц.

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

Проблема в том, что единый с точки зрения функционала объект с точки зрения реализации может быть размазан по десятку-другому разных таблиц. Какие-то объекты можно создавать с помощью API, но какие-то — нет. А аккуратно заполнять все необходимые таблицы — тяжело и ненадёжно, так как связи между таблицами хитрые, а на уровне базы нет никакой проверки целостности. Более того, в некоторых случаях нужно дополнительно запускать ряд программ, совершающих над созданными объектами какие-то действия: можно себе представить, во что выливается, например, имитации закрытия финансового периода!

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

Что приходит в голову, так это не создавать новые объекты, а просто найти в БД подходящие из уже существующих — база-то большая. Это проще, но есть три но. Во-первых, какого-нибудь интересного случая может не оказаться, но на нём-то всё и сломается в будущем. Во-вторых, тест может получиться невоспроизводимым, поскольку состояние БД всё время меняется. Во-третьих, кто сказал, что мы сможем правильно найти объект с заданным свойством? Мы ведь, собственно, и собираемся протестировать правильность такой выборки.

Итак, вопрос, на котором я пока застрял: как тестировать запросы? Идеи? Возможно, есть какая-то литература на эту тему?

20 most recent