31.03.2006

Жалобы на разнобразие финских имен

Мало того, что раньше, в Йоэнсуу, в университете у нас был админ Юха, у меня сосед Юхо и коллега Юкка... и я все время путался... Так еще и сейчас два коллеги - Теппо и Теро. Тоже путаюсь. =)

Путь

"Старый пердун. Сидел бы дома, никому не мешал бы, а то нет, выполз на дорогу. Идет, расклячившись, весь тротуар занял. А как его обгонять? Я на автобус опаздываю, а он, блин, еле тащится. Что ж он до сих пор-то не сдох?..."
* * *
- Мам, а мам! Смотри! Дедушка с лыжными палками! Он лыжник, да?
- Сколько раз я тебе говорила, не показывай пальцами! Нет, он не лыжник. Просто он старенький, и палочки помогают ему.
* * *
"Вот ведь человек... Еле идет, а не сдается. Молодец. Видно, что тяжело ему, так все равно идет и идет. Медленно, но верно. Мне б такое упорство.
Хотя, наверное, привыкаешь к небыстрому ритму жизни. И выходишь из дома заранее, и делаешь поправку на погоду, и вообще далеко не ходишь - до магазина только и обратно."
* * *
"О, опять этот забавный старик. Ведь регулярно ходит, молодец. Не сидит дома, не тухнет от безделья. Выбирается на улицу. Для здоровья полезно."
* * *
Старик шел знакомой дорогой, широко расставляя руки и упираясь обеими палками в обочины тротуара. Этот путь он проделывал дважды в неделю - по средам и пятницам. Главное, не поскользнуться, потому как сам он встать не сможет, а прохожих мало, да и не факт, что кто-нибудь бросится помогать.
Осталось пройти немного - полторы сотни метров или пять минут. Через пять минут он откроет дверь, войдет и проковыляет в дальний угол. Там закажет пива и напьется, напьется отвратительно, как делал это всю жизнь, каждую среду и пятницу.

29.03.2006

Юмор в новостях

Замечательная заметка на Gazeta.ru. Особенно мне понравилась фраза "студентам приходится самим позировать друг другу без одежды, чтобы их коллеги могли изучить форму черепа". =)

Футбол: результаты, обсуждение, предыстория

Реал Мадрид и Ювентус провели серию товарищеских матчей. Результаты сведены в таблицу.









Real Madrid Juventus
1 0
0 1
1 0
0 2
1 2
0 1


Во всех шести матчах Реал выступал в роли принимающей стороны. Время начала серии - около 17:30 по среднеевропейскому времени (18:30 по локальному). Реалом играл Лаури, Ювентусом - я.

Наше противостояние в Pro Evolution Soccer продолжается уже довольно давно. Традиционно Лаури играет Реалом, а я - Ювентусом (немного пошло, ИМХО, играть Реалом - командой звезд =)). В самом начале постоянно выигрывал я. Спустя какое-то время и до последней серии стал выигрывать Лаури. Вчера борьба шла на равных.

Лаури пришел в компанию на три месяца позже меня. (Ох, это значит, что работаю в компании я вдвое дольше его! =)) Взяли его по результатам работы над Xmas Game. Подозреваю, за эти три месяца он успел принести компании больше пользы, чем я. =)

Jaska is back in the town

Офис... десять часов. Время, когда все должны быть уже на рабочем месте. Пустые темные комнаты, тишина. Из 35 человек программистов на месте всего лишь семеро. Спрашиваю, в чем дело? Калле задумался... Потом сообразил: вчера в город приехал Ясин, один из наших remote-девелоперов.

Ты мне больше не подружка, ты мне больше не дружок

Несколько размышлений о френдовании.

Слишком уж серьезно народ относится к понятию "френд". Довольно регулярно встречаются записи типа "расфрендил такого-то, бо не сошлись взглядами". Иные выдают вообще перлы типа "расфрендил такого-то, потому как у него во френдах такой-то". У меня сразу всплывает образ скандальной бабы с коммунальной кухни.
ИМХО, не стоит переводить термин "френд" дословно. "Френд" - это не друг... и даже не кандидат в друзья. Это просто человек, который пишет интересные (для тебя) вещи. Порой, с диаметрально противоположной точки зрения.
И я, честно говоря, предпочту иметь во френд-ленте одного человека с неприемлимыми для меня взглядами, позволяющего мне взглянуть на вещи с новой для меня стороны, чем пачку единомышленников, пишущих ни о чем.
Кстати, был у меня момент... после одного из постов я принципиально перестал его читать. Не читал примерно с полгода, и, наверное, зря. Наверняка пропустил несколько интересных и необычных мыслей.

24.03.2006

Вы будете смеяться, но...

...продолжение swap-эпопеи
В ходе обсуждения с одним из коллег-начальников, попробовал вставить swap в какой-нибудь контест.

C source


int get_gcd( int a, int b )
{
while (1)
{
if (b == 0)
return a;
a %= b;
a ^= b ^= a ^= b;
}
}

int get_gcd_2( int a, int b )
{
while (1)
{
if (b == 0)
return a;
a %= b;
{
int c = a;
a = b;
b = c;
}
}
}








RVCT codeGCC code
get_gcd PROC
PUSH {r4,lr}
MOV r4,r1
|L1.8|
CMP r4,#0
POPEQ {r4,pc}
MOV r1,r4
BL __aeabi_idivmod
EOR r0,r1,r4
EOR r4,r0,r4
EOR r0,r4,r0

B |L1.8|
ENDP

get_gcd_2 PROC
PUSH {r4,lr}
B |L1.68|
|L1.48|
CMP r4,#0
POPEQ {r4,pc}
MOV r1,r4
BL __aeabi_idivmod
MOV r0,r4
|L1.68|
MOV r4,r1

B |L1.48|
ENDP
get_gcd:
mov ip, sp
stmfd sp!, {r4, fp, ip, lr, pc}
sub fp, ip, #4
mov r4, r1
.L4:
cmp r4, #0
beq .L5
mov r1, r4
bl __modsi3
eor r0, r0, r4
eor r4, r4, r0
eor r0, r0, r4

b .L4
.L5:
ldmea fp, {r4, fp, sp, lr}
bx lr

get_gcd_2:
mov ip, sp
stmfd sp!, {r4, fp, ip, lr, pc}
sub fp, ip, #4
mov r4, r1
.L10:
cmp r4, #0
beq .L11
mov r1, r4
bl __modsi3
mov r3, r0
mov r0, r4
mov r4, r3

b .L10
.L11:
ldmea fp, {r4, fp, sp, lr}
bx lr




C source


void swap_memory( int* array, int len )
{
int i;

for (i = 0; i < (len / 1); i++)
{
array[i] ^= array[len - i - 1] ^= array[i] ^= array[len - i - 1];
}
}

void swap_memory_2( int* array, int len )
{
int i;

for (i = 0; i < (len / 1); i++)
{
int c = array[i];
array[i] = array[len - i - 1];
array[len - i - 1] = c;
}
}








RVCT codeGCC code
swap_memory PROC
MOV r2,#0
PUSH {lr}
B |L1.64|
|L1.12|
SUB r3,r1,r2
ADD r3,r0,r3,LSL #2
LDR lr,[r3,#-4]
LDR r12,[r0,r2,LSL #2]
EOR r12,r12,lr
STR r12,[r0,r2,LSL #2]
LDR lr,[r3,#-4]
EOR r12,r12,lr
STR r12,[r3,#-4]
LDR r3,[r0,r2,LSL #2]
EOR r3,r12,r3
STR r3,[r0,r2,LSL #2]

ADD r2,r2,#1
|L1.64|
CMP r2,r1
BLT |L1.12|
POP {pc}
ENDP

swap_memory_2 PROC
MOV r2,#0
PUSH {lr}
|L1.84|
CMP r2,r1
POPGE {pc}
SUB r12,r1,r2
ADD r12,r0,r12,LSL #2
LDR lr,[r12,#-4]
LDR r3,[r0,r2,LSL #2]
STR lr,[r0,r2,LSL #2]

ADD r2,r2,#1
STR r3,[r12,#-4]
B |L1.84|
ENDP
swap_memory:
mov ip, sp
stmfd sp!, {r4, r5, r6, fp, ip, lr, pc}
sub fp, ip, #4
mov lr, #0
mov r4, r1
cmp lr, r4
mov r5, r0
bge .L3
mvn r6, #3
mov ip, r5
.L5:
ldr r0, [ip, #0]
rsb r1, lr, r4
add r1, r5, r1, asl #2
ldr r3, [r1, r6]
eor r0, r0, r3
str r0, [ip, #0]
ldr r2, [r1, r6]
eor r2, r2, r0
str r2, [r1, r6]
ldr r3, [ip, #0]
eor r3, r3, r2
str r3, [ip], #4

add lr, lr, #1
cmp lr, r4
blt .L5
.L3:
ldmea fp, {r4, r5, r6, fp, sp, lr}
bx lr

swap_memory_2:
mov ip, sp
stmfd sp!, {r4, r5, fp, ip, lr, pc}
sub fp, ip, #4
mov ip, #0
mov r4, r1
cmp ip, r4
bge .L9
mvn r5, #3
mov lr, r0
.L11:
rsb r3, ip, r4
add r3, r0, r3, asl #2
ldr r2, [r3, r5]
ldr r1, [lr, #0]
str r2, [lr], #4
str r1, [r3, r5]

add ip, ip, #1
cmp ip, r4
blt .L11
.L9:
ldmea fp, {r4, r5, fp, sp, lr}
bx lr


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

23.03.2006

В догонку...

...к экспериментам со swap. Еще два компилятора - под процессоры ARM, RVCT (компилятор от ARM) и gcc из Symbian SDK.



















 Метод 1Метод 2
C source code
void f0( int a, int b );
void f1( )
{
static int a = 0;
static int b = 0;

a ^= b ^= a ^= b;
f0(a, b);
}
void f0( int a, int b );

void f2( )
{
static int a = 0;
static int b = 0;

{
int c;
c = a;
a = b;
b = c;
}

f0(a, b);
}
RVCT
[armcc -O3 -S]
||f1|| PROC
LDR r2,|L1.32|
LDM r2,{r0,r1} ; a@f1_0, b@f1_1
EOR r0,r0,r1
EOR r1,r0,r1
EOR r0,r1,r0
STR r1,[r2,#4] ; b@f1_1
STR r0,[r2,#0] ; a@f1_0

B ||f0||
|L1.32|
DCD ||.data$0||
ENDP

||f2|| PROC
LDR r2,|L1.20|
LDR r0,[r2,#4] ; a@f2_0, b@f2_1
LDR r1,[r2,#0]
STM r2,{r0,r1} ; a@f2_0, b@f2_1

B ||f0||
|L1.20|
DCD ||.data$0||
ENDP
Symbian SDK gcc
[gcc -O3 -S]
f1:
mov ip, sp
stmfd sp!, {fp, ip, lr, pc}
ldr r3, .L2
ldr r2, .L2+4
ldr r0, [r3, #0]
ldr r1, [r2, #0]
eor r0, r0, r1
str r0, [r3, #0]
eor r1, r1, r0
str r1, [r2, #0]
eor r0, r0, r1
str r0, [r3, #0]

sub fp, ip, #4
bl f0
ldmea fp, {fp, sp, lr}
bx lr

f2:
mov ip, sp
stmfd sp!, {fp, ip, lr, pc}
ldr r2, .L2
ldr r3, .L2+4
ldr r0, [r2, #0]
ldr r1, [r3, #0]
str r0, [r3, #0]
str r1, [r2, #0]

sub fp, ip, #4
bl f0
ldmea fp, {fp, sp, lr}
bx lr


P.S. Стоит, пожалуй, обратить внимание и на то, что в данных случаях RVCT выигрывает у Symbian's gcc =).

Трюк со switch/case


Любопытна реализация конструкции switch/case в компиляторе RVCT для процессоров ARM. Довольно специфическая вещь, но, может быть, кому-нибудь пригодится - в качестве примера.
Данный трюк используется при компиляции кода в режиме THUMB. Этот режим используется для получения компактного кода для процессоров ARM.
Итак, условия:

  • конструкция switch/case;

  • ключ switch является целочисленным;

  • значения в case-метках идут "почти" подряд (т.е., возможны пропуски);

  • используется пять и более case-меток.


Пример:

int a;
...
switch (a)
{
case 10:
return 123;
case 11:
return 43;
case 12:
return 12;
case 13:
return 21;
case 15:
return 98;
}
return 1;

В этом случае RVCT генерирует вызов специальной процедуры __ARM_switch8 и сразу после точки вызова - таблицу переходов. Таблица переходов состоит из (n + 2) байтов плюс байт для выравнивания по границе слова (n - число case-меток).
Таблица переходов имеет следующий вид:











СмещениеЗначение
0Число case-меток
1Смещение до первой case-метки
2Смещение до второй case-метки
3Смещение до третьей case-метки
......
nСмещение до n-ой case-метки
n + 1Смещение до default-метки (default-метка может быть неявной)
[n + 2]Дополнение до границы слова (если нужно)


В функцию передается номер case-метки a. После этого выполняются следующие действия:

  1. По адресу [lp] считывается число case-меток n;

  2. Переданный номер case-метки a "обрезается" по отрезку [0..n];

  3. Выполняется переход по адресу, указанному в таблице по индексу a.


lp - адрес возврата из процедуры.
Для приведенного выше примера код выглядит следующим образом (значиние a содержится в регистре r0):

SUBS r0,r0,#0xa
BL __ARM_switch8
DCB 0x06,0x04
DCB 0x06,0x08
DCB 0x0a,
0x0e
DCB 0x0c,0x0e

Красным цветом выделены переходы по неявной default-метке. В частности, такой переход выполняется в случае, если значение a равно 14.

22.03.2006

Форменные удобства

Тимо, наш пиар-мэнеджер, весь день проходил сегодня в тельняшке. Довольно забавно было видеть, как то, что в моем представлении ассоциируется с рабоче-походной одеждой, может довольно неплохо смотреться в офисе.
Тельняшку для Тимо привез я из Питера. Хотя и до этого у Тимо уже была одна. Тимо по достоинству оценил удобство этой части форменной одежды во время занятий скалолазанием. А вот что в тельняшке делать не стоит (опять-таки, по информации от Тимо) - так это идти в бар. С большой вероятностью человека в тельняхе примут за гея - какой-то стереотип, связанный с французскими голубыми.
У финнов, кстати, тоже есть аналог тельняхи - зеленый форменный свитер. В нем ходить не пробовал, но выглядит довольно удобно.

21.03.2006

Результаты дня

Доволен. Так и шел с работы - с улыбкой во всю физиономию. =) Второй low-level hack за последние три рабочих дня - и система заработала. О подробностях, может, напишу чуть позднее.
По итогам двух low-level hack'ов Сампо, лидер проекта, вручил мне шоколадного зайца. На самом деле, заяц был выдан Сампо с неделю назад, но Сампо, как выясняется, не любит шоколад (полезный коллега =)). Еще один повод для веселья. =)

20.03.2006

Это он, это он - ленинградский почтальон

Мозилловское творение замучало окончательно. Какое-то все неуклюжее, медленное и чем дольше висит в панели задач, тем медленнее работает. К тому же и в system tray свернуть его у меня не получилось.
Решил вернуться к старому доброму The Bat!. Впрочем, к сожалению, не совсем доброму - за использование этой программы надо платить. И, похоже, в отличие от не менее старой и доброй Opera, разработчики Бэта делать свое детище бесплатным не собираются. Еще один минус The Bat! (в моих глазах) - это отсутствие версии под *nix-системы.
Зато у этого клиента есть обширные настройки, прячется он в system tray без проблем и довольно быстр. (Честно говоря, достойной замены ему я так и не нашел.)
А платить... ну что ж, пройдет trial period - и либо куплю студенческую лицензию (благо, еще студент), либо... вернусь на ThunderBird (поступок из области "мыши плакали, кололись, но кактус ели" =)).

Как <b><i>не</i></b> создаются креативы

или из записок лже-статиста. =)
Ведь бывает же так... Ходишь-ходишь... Мысль тебя мучает. Интересная. И заходишь ты к ней с одной стороны. Потом с другой. И так примеришься, и этак. И ведь мысль-то любопытная! И запостить в жж вроде как не стыдно.
И вот обсасываешь ты ее день-другой-два... И вот уже три коронных фразы придумал - одной пост начать, вторую куда-нибудь в середину запихать, а третья - в заключение.
И вот - момент. Открываешь окошко браузера и пишешь. Сам процесс опущу - слишком он уж короткий. Нажимаешь клавишу "Update Journal" и... мда.
Из трех коронных фраз в тексте всплывают максимум две. Вернее, размер поста позволяет говорить о том, что они не всплывают в тексте, а, так сказать, составляют его. =) Из них только одна по форме достойна называться "коронной", да и ту убивает контекст. =)
И тут ты понимаешь, что не только не переплюнул каких-нибудь 'а или 'а, а лучше б вообще и не писал. =)
К чему это я? Читайте, в общем, френд-ленту. Она интересная. =)

UPD: И к Фрумичу, и к Косте Иночкину отношусь с уважением. =)

19.03.2006

И опять поезда

Наконец-то дошли руки сделать то, чего хотел сделать давно - сфотографировать любимое место в финских поездах. =)
34,43 КБ
Это, конечно же, вагон-ресторан. На этой фотографии - вагон-ресторан, который цепляется, в основном, к дальним поездам. Дальние поезда обычно составляются из вагонов старого типа (внешне напоминающие наши, российские). И в старых вагонах-ресторанах, на мой взгляд, потрясающе уютно.
Нет, конечно, новые поезда (Intercity, Intercity-2) тоже удобны. Но там слишком много белого пластика.

Городские наблюдения

Удивительно много финнов возят в колясках довольно взрослых детей. Кто-то мне по этому поводу сказал (за правдивость не ручаюсь), что для мам (или пап, хотя в основном с колясками встречаются все-таки мамы) с колясками проезд в автобусе бесплатный. Что ж, звучит похоже.
Апофеозом была сегодняшняя встреча с негритянской семьей в автобусе (в Хельсинки очень много эмигрантов из Сомали, пожалуй, даже больше, чем из России) - негритянка-мать и двое детей, девочка лет, наверное, десяти и парень лет пяти минимум. Парень, выйдя из автобуса, сел в коляску. Причем размер коляски позволял предположить, что рассчитана она если не на большую куклу, то максимум на полуторагодовалого ребенка.

17.03.2006

Снова программерское: задача

Дано:
* Проект пересобирается полностью 12 минут в одной конфигурации;
* Нужна сборка в двух конфигурациях;
* Для перехода из режима отладки в режим сборки надо поменять локаль в Windows и перезагрузиться (иначе некоторые символы в релизе будут отображаться неверно; отладка с целевой локалью невозможна).

Внимание, вопрос! Какого, спрашивается, хухрена в Windows XP не реализована нормальная поддержка UNICODE, стандартизованного в июне 1992 года?
Дополнительный вопрос на пятерку: сколько раз упомянул мать какого-то Билла программист, собирающий проект?

13.03.2006

Red Hot Chili Peppers

С неделю назад Сампо пришел, довольный, и протянул мне пакетик с семенами.
- Что это? - хмыкнул я. - Конопля?
- Нет. Семена перца чили. Мы их заказывали с месяц назад, и наконец-то нам их доставили.
Оказалось, что в результате регулярного посещения индийского ресторанчика и соревнования там, кто быстрее съест острое блюдо, возникла идея попробовать собственноручно вырастить острые перцы. (Кстати, лидер в негласном соревновании по поеданию острой пищи - Янне. У него жена - кореянка, сам он не раз был в Корее, вот и привык. А острота блюд... Пробовал я. "Ну, да. Ну, ужас. Но не ужас-ужас-ужас!")
В итоге, с какими-то приключениями через какого-то специального мужика ребята добыли семена. В тот же день принесли земли и картонных ячеек из под яиц. Засадили плантации, изгнав с солнечных пятен печатные платы.
Сегодня Сампо обнаружил первых три ростка. Весь день оживленно обсуждали. Я узнал, что, оказывается, в растение каким-то образом надо вкручивать шурупы - мол, страдая, растение дает более острые плоды. Кто-то предложил попросить Панну, нашего сэйлс-менеджера, читать растениям пресс-релизы, но потом сошлись на мнении, что это слишком жестоко.
Ждем результатов. Я уже выдвинул идею засадить землю рисом.

Задумчивое

...с одно из митингов (в смысле, собраний).
- Мобильный телефон на данный момент является прибором, обладающим наибольшей концентрацией хайтека в мире.
А ведь верно. Тем более, если рассматривать смартфоны с камерами-плеерами-радио.

12.03.2006

Оперное

На ЛОРе появилась новость о прохождении девятой Оперой одного из тестов на соответствие броузеров вэб-стандартам. Обсуждение новости (местами просто флейм) уже перевалило за две сотни комментариев, что, в общем, нестранно - стоит кому-либо на ЛОРе похвалить/поругать Оперу/Файерфокс/FreeBSD/Linux/что-нибудь еще, как налетает толпа противников и поклонников и начинают рвать друг другу виртуальные глотки. =)
А я просто попробовал прогнать этот тест на том, что установлено дома. Кстати, особого смысла в полном соответствии вэб-стандартам, равно как и в успешном прохождении данных тестов я не вижу. ИМХО, вэб-стандарты - это как наука, для того, чтобы быть коммерчески успешным, не обязательно полностью им соответствовать.














09.03.2006

Не стреляйте в программиста...

- Как я могу тебя отблагодарить за твои ответы?
- Перестать задавать вопросы.
(с) bash.org.ru

nickname: nickname2 - девелопер, мля
nickname: на форуме ему объясняют как под его драйвером играть %)
(с) bash.org.ru

07.03.2006

Назрел вопрос...

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

Харе кришна по-фински

Иду с работы. На Александеринкату подходит парень вполне обычного вида, протягивает руку для рукопожатия:
- Терве... (и далее - длинная фраза по-фински)
- Экскьюзми, ай донт спик финниш.
Неохотно стягиваю перчатку и жму руку в ответ... Надо учиться игнорировать нежелательные рукопожатия.
- Оу, энд вот лэнгвич ду ю спик?
Вот! Вот это вопрос, способный застать врасплох. Интересно, это мой английский настолько плох, что даже непонятно, что это английский, или просто кто-то не тормоз?..
- Эмм... Инглиш.
Парень обрадованно достал флаер на финском и всучил мне.
- Зере из ан индиан пати. Ю вэлкам.
- Угу.
- Окей, бай! Ит воз найс ту мит ю.
- Бай.
Флаер рассказывал про какую-то кришнаитскую тусовку. Ну их нафиг. Еще стану таким же.

Квикшот

То, что должно получиться
 
Opera 8.52
 
Internet Explorer 6.0
 
Internet Explorer 7 beta 2 (взято по одной из ссылок из комментариев к новости на ЛОРе)

Задорные финские манекены
Задорные финские манекены

Куусиярви

В выходные ездили на Куусиярви.
Умеют все-таки люди обеспечивать себе отдых. Несколько проложенных лыжных трасс (с подсветкой в ночное время). Маленькая круговая - чуть больше километра вокруг озерца, большая круговая - около десяти километров, несколько ответвлений, если верить карте. После пробежки - сауна. Для желающих - прорубь.
Кстати, про сауну. Вообще-то к финским общественным саунам я до сих пор относился с неуважением. Народ бегает туда-сюда, камни не просыхают, дверь не закрывается, хорошо, если удается согреться.
Но на Куусиярви одно из отделений (помеченное 80-100) поразило. Во-первых, оно было подозрительно маленькое. Во-вторых, там было подозрительно мало народу - всего один финн, цветом напоминавший знамена Красной Армии. Ну, фиг с ним, решили попробовать.
В первые пять секунд я радовался - наконец-то горячая сауна. В следующие пять секунд я стал недоумевающе ощупывать обожженные уши. Еще пяти секунд мне хватило на то, чтобы понять, что в этом отделении я не задержусь. И пять секунд - на выход. =) Так то. =)

День Рождения по-фински

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

01.03.2006

Талма

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

На всех склонах подъемники были не T-образные, а дисковые. Да ладно, черт бы с ним, подумаешь, пропускаемость подъемника из-за этого ниже в полтора-два раза, так, блин, само устройство вызвало бурю восторга. Крепление штока к тросу подъемника не фиксировано. На подходе задеваешь ногой спицу-датчик, дальше хватаешь, с позволения сказать, хрень, вставляешь куда надо и та начинает двигаться. Хай-тек, ипонамама.

Со второго раза я умудрился устоять на доске при начале движения, с третьего поборол рывок в начале подъема. Позже, в момент начала подъема, вцеплялся в палку железной хваткой с выражением дикого ужаса на физиономии. =) И даже не форсил, застегивая ногу на подъеме. Пару раз в начале подъема шток вырывало из-под ног, еле ловил руками.

Мучался не я один. Подъемник работал, "а бабушки все падали и падали..."

А склоны, кстати, неплохие.

Программерский бред

Не помню, с чего, но чего-то задумался о довольно обыденной процедуре swap. На память пришли два метода - естественный (с использованием временной переменной) и навороченный (с использованием xor; подсмотрен мною довольно давно в книжке Бруно Бабэ).
Формально оба метода используют всего три операции. Или не три? Решил проверить - просто подсмотреть, сколько инструкций ассемблера реально использует каждый из методов.
Реализовал оба метода (хотя для трех и одной строчки кода "реализовал" - громкое слово). Пометил обе переменные как volatile для того, чтобы компиляторы не удаляли неиспользуемые переменные. Прогнал через два компилятора (gcc и Microsoft Visual C++ 6.0) c ключами оптимизации по скорости. Результат свел в таблицу.

"swap" technique tests





























  Method 1 Method 2
C source code
void test( )
{
volatile int a;
volatile int b;
int tmp;

tmp = a;
a = b;
b = tmp;
}
void test( )
{
volatile int a;
volatile int b;

a ^= b ^= a ^= b;
}
MsVC 6.0 assembly output

[cl /c /O2 /Fatest.asm test.c]
4 assembler instructions

_test  PROC NEAR  ; COMDAT
; File test.c
; Line 2
push ecx
; Line 7
mov eax, DWORD PTR _a$[esp+4]
; Line 8
mov ecx, DWORD PTR _b$[esp+4]
mov DWORD PTR _a$[esp+4], ecx
; Line 9
mov DWORD PTR _b$[esp+4], eax
; Line 10
pop ecx
ret 0
_test ENDP
12 assembler instructions

_test   PROC NEAR  ; COMDAT
; Line 2
sub esp, 8
; Line 6
mov eax, DWORD PTR _b$[esp+8]
mov ecx, DWORD PTR _a$[esp+8]
xor eax, ecx
mov DWORD PTR _a$[esp+8], eax
mov edx, DWORD PTR _b$[esp+8]
mov eax, DWORD PTR _a$[esp+8]
xor edx, eax
mov DWORD PTR _b$[esp+8], edx
mov ecx, DWORD PTR _b$[esp+8]
mov edx, DWORD PTR _a$[esp+8]
xor ecx, edx
mov DWORD PTR _a$[esp+8], ecx

; Line 7
add esp, 8
ret 0
_test1 ENDP
GCC 3.4.4 assebly output

[gcc.exe -S -O3 test.c]
4 assembler instructions

_test:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl -4(%ebp), %edx
movl -8(%ebp), %eax
movl %eax, -4(%ebp)
movl %edx, -8(%ebp)

leave
ret
12 assembler instructions

_test:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl -4(%ebp), %ecx
movl -8(%ebp), %edx
xorl %edx, %ecx
movl %ecx, -4(%ebp)
movl -4(%ebp), %ecx
movl -8(%ebp), %eax
xorl %eax, %ecx
movl %ecx, -8(%ebp)
movl -8(%ebp), %eax
movl -4(%ebp), %edx
xorl %edx, %eax
movl %eax, -4(%ebp)

leave
ret


Число инструкций для первого метода - 4 для обоих компиляторов. Для второго - 12, то есть в три (!!!) раза больше. Правда, из этих двенадцати три инструкции оперируют только регистрами, но, в общем, это не спасает.
Конечно, тесты довольно искусственные, но, в общем, похоже, что использование блока кода
int a, b;
...
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
...

дает значительный выигрыш по сравнению с использованием строчки
a ^= b ^= a ^= b;

И при этом памяти используется ничуть не больше.
То есть, данная строчка является не более чем программерскими понтами. =)
Кстати, реализация swap вручную дала бы выигрыш всего в одну инструкцию:
    mov eax,  DWORD PTR _a$[esp+4]
xchg eax, DWORD PTR _b$[esp+4]
mov DWORD PTR _a$[esp+4], eax