Светящийся Мост Мира в Тбилиси
Я со вчерашнего дня в Тбилиси, вчера гуляли по городу. К сожалению, Тбилиси не раз сжигали подчистую, поэтому похвастаться множеством исторических зданий город не может (хотя они и попадаются), зато есть интересные новые постройки, например, Мост Мира (მშვიდობის ხიდი), пешеходный мост через реку Кура, недалеко от резиденции Саакашвили, действующего президента Грузии.

Красивее всего он выглядит в темноте, к сожалению, у меня не получился снимок — по всей его длине проходят волны света. Когда мы шли по нему днём, я с удивлением обнаружил в стеклянных стенках сотни светодиодов. На снимке плохо видно, но вот эти светлые квадратики — работающие светодиоды внутри стекла.

Удивил меня и факт их наличия, и то, что они днём тоже работали. Выглядит восхитительно. Соединены они едва заметными проводками, идущими внутри стекла горизонтально, если сильно не приглядываться, они совершенно неразличимы.
Паспорта в гостинице «Вере Палас» (Тбилиси) в открытом доступе
Забавно с безопасностью обстоят дела в гостинице «Вере Палас», что в Тбилиси. Я, конечно, поделился своей тревогой с персоналом гостиницы, надеюсь они исправять ситуацию.
В общем, стоит подключиться к их бесплатному вайфаю, как в сети обнаруживается несколько компьютеров. Один из них, открытый всем ветрам «
К примеру, я нашёл паспорт своей жены:

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

В предпоследний день в Грузии обнаружил, что
Обзвонил различных мастеров в Казани, которые занимаются ремонтов ноутов, замена обойдётся порядка 15 тысяч — верхнюю крышку разобрать на «Эйре» тяжело, а собрать правильно в кустарных условиях невозможно, поэтому меняют целиком. Подумываю о покупке нового «Макбука» в качестве альтернативы ремонту. Только пока не знаю как перенести приложения, через «Машину Времени» мне не хочется — много мусора скопилось, проще перенести что надо, чем чистить, что не надо, а другого способа я пока не знаю.
История с кладбищ
Я очень люблю историю. Точнее нет, не совсем так. Изучая историю в той форме, которая принята в наших учебных заведениях, я рискую порвать рот от зевоты; если не ошибаюсь, у меня по этому предмету всегда тройка была. Я очень люблю вступать с историей в непосредственный контакт.
Нет ничего лучше для меня на отдыхе, чем залезть
В России история размазана на огромные расстояния и раздавлена теми, для кого развалины просто развалины. И года не проходит, чтобы в Казани, где я живу, не снесли
На безрыбье, для меня и надгробье девятнадцатого века, встреченные случайно на кладбищах Татарстана — уже тревожащее душу прикосновение к истории.
Мы вчера вернулись из Лениногорска, навещали моих родителей, а кроме этого была запланирована поездка по кладбищам сёл и деревень, где жили родственники, я надеялся найти там
Первые три из деревни Старая Письмянка Лениногорского района. На первом можно разобрать «Здесь покоится В…», если я правильно помню, там дальше было имя «Василий» и дата — декабрь 1890 года.


Вторая могила — Семёна Емельяновича Выдрина, написано, кажется, на церковнославянском, а может в то время все так писали,
Третье надгробье валяется около чужой могилы, подпирает кирпичи оградки. Я уже очень торопился (в тот день мы объехали шесть деревень, да ещё и приехали с другого конца Татарстана), так что там написано никуда не записал, сейчас на фотографии я могу разобрать только слово «прахъ» и год — 1811, если не ошибаюсь.
Следующая могила из села Старое Исаково Бугульминского района, если правильно помню. Надпись хорошо видно — первого мая 1901 похоронен Шулешкин Александр Трофимович, 15 июля 1835 года рождения. Фамилия удивительно знакомая, кажется,
Сейчас сходу нашёлся только протокол заседания Самарского губернского земского собрания
Дальше две безымянные могилы из Нового Исакова и Дубовки Бугульминского района. Если на первой ещё угадываются
Так что обитателю безвестной могилы в Дубовке ещё повезло — от него хоть камень остался, хоть уже и не узнать кем он был или хотя бы как его звали.
Скачивалка документов из архивов ЭлАра
Написала мне одна читательница по поводу моей утилиты для скачивания документов из электронных архивов ЭлАра. Оказывается, помимо самарского, моя утилита вполне нормально работает и с тобольским. Что ж, наверняка есть ещё архивы с которыми она совместима, поэтому в новую версию я добавил необязательный параметр host, который позволяет указать другой адрес

Утилита лежит там же — на «ГитХабе».
Валентина Терешкова
Не знаю, рассказывают ли сейчас в школах кто такая Валентина Терешкова, когда я там учился, её имя произносили рядом с Гагариным и Леоновым.
Первая в мире
Во время обучения она проходила тренировки на устойчивость организма к факторам космического полёта. Тренировки включали в себя термокамеру, где надо было находиться в лётном комбинезоне при температуре +70 °C и влажности 30 %, сурдокамеру — изолированное от звуков помещение, где каждая кандидатка должна была провести 10 суток.
Удивительно найти было эту фотку в старых альбомах
Нашёл фото совершенно случайно в кафе, [где почти каждый день обедаю (это кафе в хостеле «I&I»), очень дружественное и приятное место. Там на подоконниках лежат разные штуки советский времён, большей частью хлам, а вот альбом с этикетками меня заинтересовал, потому и наткнулся на фото.
Грузия — прекрасна!
Надо
Для начала, нам сильно повезло — весь тур выкупила
Поэтому мы могли выбирать куда поехать, например, мы заглянули в город Го́ри, в дом, где родился Сталин и соответствующмй музей.
Второе везение — за пять дней в Грузии не было ни капельки дождя, стояла прекрасная, солнечная погода, +25—28˚Ц. Лишь когда мы поехали в аэропорт, в Батуми
Везение номер три — это перелёты. Летели мы в обоих случаях через Москву. При полёте «туда» до пересадки у нас было три часа, которые съелись на полуторачасовое ожидание самолётом в воздухе посадки в Домодедове,
На обратном рейсе было ещё веселее — зазор между прилётом в Москву и вылетом был один час 15 минут и мы очень боялись не успеть на самолёт. Для этого нам нужно было любой ценой взять багаж в ручную кладь (сомнения были по поводу небольшого чемоданчика, который иногда заставляют сдавать в багажное отделение). Сначала нас попросили сдать его в багаж на досмотре — мы везли с собой пару бутылочек масла из виноградных семечек из Грузии, жена расстроилась по поводу того, что из Грузии ничего памятного не привезём, на досматривающего это подействовало и он махнул рукой — забирайте. Потом оказалось, что самолёт дали очень маленький, не лезет наш чемодан на полки для багажа, но, к счастью, сидели мы на втором ряду (регистрировались последними и нам достались места из «бизнеса», самолёт был полностью выкуплен) и у одного из наших мест было приличное место для ног, куда влез чемодан. В аэропорту мы бежали, как угорелые, в итоге даже пришлось ожидать посадки пятнадцать минут.
Сама же Грузия понравилась очень. Никакого напряжённого отношения к русским мы не заметили,
Что меня радует как любителя истории — в Грузии этой самой истории много, старые монастыри, старые здания, всего много, но не в одном месте, к сожалению. Мы проехали ⅔ страны и шесть городов, чтобы побольше увидеть.
Больше всего мы провели времени в Тбисили и Батуми. Ребята, там
Теперь еда. Грузинская кухня — это очень вкусно, ребята! Бешенно вкусно! Мы много чего ели, но больше всего
Ещё я благодарен весне в Грузии за то, что это не сезон — море холодное. Туристов мало и в разгар дня город выглядел, как Казань в пять утра — немного людей, немного машин. Тихо, спокойно, красиво. В высокий сезон много туристов из Украины, оттуда, кстати, можно попасть в Грузию очень дёшево — всего 110 долларов самолёт туда и обратно из Харькова.
Отельной строкой про полицию. Сотрудники подтянутые, форма аккуратная, девушки — на высоких каблуках, на место ДТП мчатся моментально, на хорошей скорости. Я первый раз в жизни видел, чтобы полицейский остановил поток машин, чтобы перевести бабульку через дорогу.
Что не понравилось. В Грузии везде курят. В кафе, ресторанах, на улицах, хозяин магазинчика преспокойно закурил при нас в помещении, в ресторане «Привет из Батума», в котором мы в последний раз ужинали, курил весь зал, целиком, только дети не курили, зато их родители смолили рядом с ними вовсю. Наш экскурсовод рассказала, что с курением пытались бороться, но законопроект не прошёл.
В остальном же страна прекрасна, очень рекомендую
Слово «мама» — значит «еда»
Цитата с «Дёрти»:
Наиболее полное исследование над словами «мама» и «папа» как универсальными терминами было проведено лингвистом Романом Якобсоном. Он объяснил, что для человека наиболее простыми для воспроизведения являются открытые гласные звуки. Дети могут произносить гласные звуки с первых дней жизни. Что они и делают. Постоянно. Как только они начинают экспериментировать с другими звуками, они пробуют самые простые согласные. Обычно они начинают со звуков, производимых с закрытыми губами, так называемых «губных согласных», например, [m], [p], [b]. Дети собирают всю энергию, чтобы вытолкнуть этот новый гласный звук «мммм», а затем расслабляют рот в наиболее простом открытом гласном «а». Добавляя сюда естественное повторение в детской речи (лепет), мы получаем «ма—ма», «ба—ба», «па—па» и так далее.
Так почему же дети все—таки тяготеют к звуку [m], а не [p] или [b]? Конечно же, из—за женской груди. Звук [m] — самый простой для детского рта, приложенного к теплой аппетитной груди. Даже став взрослыми мы продолжаем ассоциировать «мммм» с чем—то вкусненьким. То же делает и ребенок.
Якобсон в своей работе полагает, что ребенок не имеет ни малейшего понятия о том, что вас зовут мамой или папой или как—то еще. Слово «мама» не значит «я люблю тебя, дорогая женщина—ангел, принесшая в жертву сон, карьеру и упругость ягодиц». Оно значит «еда».
Так что когда ребенок зовет папу «мамой» и все больше начинает тревожиться, что папа не становится «мамой», на самом деле он не зовет свою мать. Он способен понять, что волосатый плоскогрудый болван, который пытается петь колыбельную, не является Главным Блоком Раздачи Еды №1. А Главный Блок Раздачи Еды №1 или хотя бы подходящий латексный заменитель, который этот Блок обычно носит с собой, должен быть доставлен немедленно.
Я ещё, учась в школе, сообразил, что слово «мама», вероятно, так распространено во всех языках, потому что его проще всего произнести, что бы оно там не значило. Но я думал, что оно ничего не значит для младенца, просто
Кстати, на татарский «мама» переводится как «эни́», но я не знаю считают ли татары детское «мама» аналогом своего «эни», надо будет поспрашивать. А в грузинском «мама» (მამა) означает «отец», тогда как «мать» звучит как «деда» (დედა).
4G в Казани
Неожиданно заработал «4Джи» в смартфоне, голос идёт по старинке, а интернет через сеть нового поколения. Скорости космическими не назвать, но по ощущениям стало побыстрее — как на вайфае.

Я сегодня пошёл симку менять, прежняя, резанная
Работает «4Джи» пока только у «Мегафона», впрочем могу ошибаться, за новостями других компаний я не слежу —
Сенсор внезапного движения
Очень давно, на всех носимых устройствах, оснащённых жёстким диском (ноута, смартфонах) появился сенсор внезапного движения. В жёстком диске считывающая головка находится, не касаясь, над поверхностью диска с данными. Если ноут резко поднять, головка может чиркнуть по поверхности диска и испортить его. Для этого нужен сенсор внезапного движения (акселерометр), он реагирует на ускорение в любую сторону и «паркует» головку — уводит её в зону, где она ничего не может повредить.
На ноутах с твёрдотельным накопителем (ССД), этого сенсора обычно не бывает — он там не нужен. Например, на моём Макбуке Эйр его не было, нет его и на 15″ Макбуке Про с Ретиной моего друга, я специально смотрел — в этих ноутах нет жёстких дисков. В Макбуках Про предыдущей модели, без Ретины и с жёстким диском, сенсор, естественно, был.
Каково же было моё удивление, когда я обнаружил, после покупки Макбука Про 13″, что в сведениях о системе есть упомянутый сенсор:

Думаю, его просто забыли убрать, наверное это рудимент прежней модели Макбука. Но наличие сенсора не говорит о том, что он работает. Я сегодня потратил пару часов, чтобы разобраться как в Маке читают этот сенсор и написал вот такую программу на Си:
// MacbookPro (OS X 10.5+) SMS reading. Evgeny Stepanischev May 2013
// gcc -framework IOKit motion.c
#include <IOKit/IOKitLib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define RETURNONFAIL(code) do { if (errcode != KERN_SUCCESS) {\
fprintf(stderr, "Error code: 0x%Xn", GETCODE(errcode));\
return code;\
} } while (0)
#define GETCODE(err) ((err)&0x3fff)
typedef struct {
int16_t x;
int16_t y;
int16_t z;
} ostruct;
int main() {
mach_port_t masterPort;
kern_return_t errcode;
io_iterator_t iterator;
io_object_t service;
io_connect_t connect;
void *in;
ostruct *out;
size_t osize = 40, isize = 40;
errcode = IOMasterPort(MACH_PORT_NULL, &masterPort);
RETURNONFAIL(-1);
CFMutableDictionaryRef matchingDictionary = IOServiceMatching("SMCMotionSensor");
errcode = IOServiceGetMatchingServices(masterPort, matchingDictionary, &iterator);
RETURNONFAIL(-2);
service = IOIteratorNext(iterator);
IOObjectRelease(iterator);
if (service == kIOReturnNoDevice) {
return -3;
}
errcode = IOServiceOpen(service, mach_task_self(), 0, &connect);
IOObjectRelease(service);
RETURNONFAIL(-4);
in = malloc(isize);
out = malloc(osize);
if (in == NULL || out == NULL) {
return -6;
}
memset(out, 0, osize);
memset(in, 1, isize);
errcode = IOConnectCallStructMethod(connect, 5, in, osize, out, &isize);
RETURNONFAIL(-5);
printf("%d, %d, %d\n", (*out).x, (*out).y, (*out).z);
return 0;
}Программа выводит три числа: показатели наклона влево/вправо, назад/вперёд и показатель ускорения, который меняется, если ноут резко поднять или опустить.
Размер структуры 40 и второй параметр функции IOConnectCallStructMethod («5») — «магические» значения, первое — фиксированный размер буфера, который требуется функции, второе — номер вызываемой функции в ядре (SMCMotionSensor).
Берём «Макбук» со стола, экран гаснет или блокируется
В предыдущей заметке я писал, что обнаружил сенсор внезапного движения у своего «Макбука». Решил извлечь практическую пользу из этого — написал программу на Си, которая отправляет ноут в спячку, стоит поднять его со стола:
// gcc -framework CoreFoundation -framework IOKit gethensleep.c -o getthensleep
// Evgeny Stepanischev May 2013
#include <IOKit/IOKitLib.h>
#include <CoreFoundation/CoreFoundation.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdbool.h>
#include <sys/param.h>
#define RETURNONFAIL(code) do { if (errcode != KERN_SUCCESS) {\
fprintf(stderr, "Error code: 0x%Xn", GETCODE(errcode));\
return code;\
} } while (0)
#define GETCODE(err) ((err)&0x3fff)
#define THRESHOLD 0.2
typedef struct {
int16_t x;
int16_t y;
int16_t z;
} ostruct;
void macSleep() {
io_registry_entry_t r = IORegistryEntryFromPath(
kIOMasterPortDefault,
"IOService:/IOResources/IODisplayWrangler"
);
if (r) {
IORegistryEntrySetCFProperty(r, CFSTR("IORequestIdle"), kCFBooleanTrue);
IOObjectRelease(r);
}
}
int main() {
mach_port_t masterPort;
kern_return_t errcode;
io_iterator_t iterator;
io_object_t service;
io_connect_t connect;
void *in;
ostruct *out;
size_t osize = 40, isize = 40;
errcode = IOMasterPort(MACH_PORT_NULL, &masterPort);
RETURNONFAIL(-1);
CFMutableDictionaryRef matchingDictionary = IOServiceMatching("SMCMotionSensor");
errcode = IOServiceGetMatchingServices(masterPort, matchingDictionary, &iterator);
RETURNONFAIL(-2);
service = IOIteratorNext(iterator);
IOObjectRelease(iterator);
if (service == kIOReturnNoDevice) {
return -3;
}
errcode = IOServiceOpen(service, mach_task_self(), 0, &connect);
IOObjectRelease(service);
RETURNONFAIL(-4);
in = malloc(isize);
out = malloc(osize);
if (in == NULL || out == NULL) {
return -6;
}
memset(out, 0, osize);
memset(in, 1, isize);
int16_t prevz;
bool inited = false;
for(;;) {
errcode = IOConnectCallStructMethod(connect, 5, in, osize, out, &isize);
RETURNONFAIL(-5);
if (inited) {
float min = MIN(prevz, (*out).z);
float max = MAX(prevz, (*out).z);
if (max) {
float dev = 1 - min / max;
if (dev > THRESHOLD) {
macSleep();
}
}
} else {
inited = true;
}
prevz = (*out).z;
usleep(10000);
}
return 0;
}Порог срабатывания (0.2) я подобрал экспериментальным путём. Скомпилировать можно компилятором gcc (входит в XCode), строка компиляции указана первой в приведёном коде. Можно засунуть в автозагрузку и наслаждаться эффектом.
Кстати, если хотите, то можно вместо спячки заставить ноут заблокировать экран (т. е. показать экран логина), для этого надо вместо функции macSleep вызвать другую:
// нужно добавить ещё один ключ компиляции: -framework ApplicationServices
#include <ApplicationServices/ApplicationServices.h>
void macLock () {
CGSCreateLoginSession(NULL);
}Разрушенные церкви бугульминского района Татарстана
У меня есть хобби, о котором, возможно, многие успели забыть (на время холодов я сделал паузу) — люблю фотографировать полуразрушенные храмы и церкви. В них есть
Я в последние майские праздники ездил по некоторым кладбищам бавлинского и бугульминского районов Татарстана — искал могилы своих предков, заодно заехал в парочку разрушенных церквей.


Первая — церковь Вознесения, построенная в 1764 году на деньги П.И. Рычкова в селе Спасское (Бугульминский район), объект культурного наследия республиканского значения. Внутрь уже не попасть, церковь начали восстанавливать, но в один из пристроев вход ещё открыт. На стенах и вокруг здания в кустах есть интерсные восьмиугольники, увенчанные короной, в которых




На второй серии снимков — Храм Петра и Павла из села Ключёвка, я о нём уже писал
MacGreener
Выложил утилиту, которую описывал недавно (используя датчики «Макбука Про», заставляет его засыпать, если его поднять со стола) на «Гитхаб», назвал её MacGreener. Не знаю как сейчас, а раньше «зелёный» (green) в технике ассоциировался с экономией электроэнергии, так как этой утилитой я делаю «Мак» «зеленее» (greener), отсюда и название.
Я немного изменил алгоритм и внёс ещё одно важное изменение: теперь, если «Мак» поставить на стол, он проснётся. Напомню, программа работает только при наличии соотвествующего датчика. Рядом с исходным кодом лежит скомпилированная версия.
Angel. Pushkin
Многие
Чтобы технари полюбили поэзию, надо всего лишь заменять в стихах некоторые слова на английские:
Angel В дверях eden’a angel нежный Главой поникшею сиял, А daemon мрачный и мятежный Над hellish abyss’ом летал.
Дух отрицанья, дух сомненья На духа чистого взирал И heat невольный умиленья Впервые смутно познавал.
«I’m sorry, — рёк,— тебя я видел, И ты недаром мне сиял: Не все я в sky возненавидел, Не все я в sea презирал».
Правда здорово и современно?
Идентификаторы в C#
Я тут

Обратите внимание на строку 9, тут любопытно, я встречал языки, где в качестве имён переменных можно использовать символы Юникода (тот же ПХП), а тут, мало того, можно писать юникодные символы с использованием
Например, у меня, в качестве имени переменной, используется символ «усмехающееся кошачье лицо со смешинками в глазах» (не всем видно будет — ?). Со вторым идентификатором ещё интереснее.
Если вам нужно использовать в качестве идентификатора зарезервированное слово (ну вот надо, а максимально подходящее английское слово является зарезервированным), можно предварить его «собачкой» и в таком виде использовать (см. строку 10).
Программа выше компилируется и выполняется без ошибок.
А вот вещь по которой я скучал: фигурные скобки создают локальную область видимости (как в Перле), правда я не могу определить переменную в этом блоке, которая уже есть в локальном блоке выше, причём только до замыкания, удивительное правило.
Ну да ладно, в общем, вот такой код не скомпилируется, будет ошибка в последней строке, сообщающая об отсутствие переменной @string:
{
string @string = @"string ""string""";
Console.WriteLine (@string.Insert (1, "tt"));
}
Console.WriteLine (@string); // ошибка!Вещь, с которой не ожидал столкнуться — автоматическое приведение типов. Я
byte байтраз = 3, байтдва = 5;
// строка кода ниже выведет System.Int32 (а не System.Byte, как я ожидал)
// арифметические операции определены только для типов int и больше,
// поэтому произойдёт преобразование типов
Console.WriteLine ((байтраз + байтдва).GetType());
Console.WriteLine ("Первый байт равен: " + байтраз); // строки спокойно складываются с числамиЕщё интересная вещь — отключение проверки переполнения (в нормальной ситуации вызовется исключение), видимо для совместимости с сишным поведением:
int int1, int2;
unchecked {
int1 = int2 = System.Int32.MaxValue;
int1 += int2;
}
Console.WriteLine (int1); // выведет -2Шутка про женщин на C#
Придумалась шутка про женщин на языке
class Woman {
public static bool operator true (Woman question) {
return false;
}
public static bool operator false (Woman question) {
return false;
}
}Обнаружение Ретины
Поскольку у меня теперь «Макбук» с Ретиной, я изучаю вопрос как сделать сайты пригодными к отображению на таких экранах. Возможно читатели с Ретинами уже заметили
Наиболее животрепещущий вопрос — подготовка изображений для Ретины.
Напомню, что Ретина — технология Эпл, ставшая уже нарицательной, заключающаяся в примерении экранов высокого разрешения (например, на моём ноуте это 2560×1600) с отображением на нём обычной графики так, как бы это выглядело на экранах вдвое низкого разрешения. При этом шрифт смотрится просто великолепно, как на бумаге, а вот с картинками беда.
В вебе бо́льшая часть графики выглядит не очень (хотя масса сайтов уже подготовилась). Для того, чтобы стало хорошо, все изображения надо готовить вдвое большего размера, при этом указывая для них в коде вдвое меньший размер, тогда проявляется вся мощь Ретины — будет видно самые мелкие детали изображения и пропадёт размытие.
Пока ещё не у всех Ретины, хочется, чтобы клиенты, у которых её нет, не грузили лишнего. К сожалению, загвоздка в том, что браузеры пока не научились сообщать серверу, что мы имеем дело с таким (пока) необычным экраном и есть только клиенские способы выяснить это.
Появилось уже несколько библиотек, которые на стороне клиента делают замены картинок на подходящие под тип экрана. Это всё равно вызывает лиший трафик, так как некоторые картинки успевают загрузиться, а если изображений много, замена, бывает, подтормаживает.
Насколько я вижу, даже в Эпл не придумали достойной альтернативы этой техники и у них сайт «улучшается» по мере загрузки — сначала грузятся обычные изображения, потом «ретиновые», если это необходимо.
Вообще, у Джипега, например, есть прогрессивная загрузка — по мере загрузки «прогрессивное» изображение не грузится сверху вниз, а становится всё чётче и чётче (хорошая иллюстрация этого есть в одном из параграфов «Ководства»). Надо будет поэксперементировать в эту сторону — нельзя ли прервать передачу на нужной детализации, если экран не «ретиновый».
А пока, у меня такое решение. Используем
На стороне клиента первой строкой каждой нашей страницы ставим проверку по «ретиновые» экраны с установкой «печенья»:
<script>if(window.devicePixelRatio>=2)document.cookie='retina=1'</script>Этот скрипт выполнится первым и все дальнейшие запросы на сервер будут содержать строку «retina=1», если мы имеем дело с Ретиной. Все изображения, для которых у нас есть две копии — обычная и «ретиновая» (в два раза большая) называем одинаково, но с постфиксом «@2x» для большей, при этом в коде указываем данные разрешения для более мелкой картинки:
<img src="/images/owl@2x.jpg" width="400" height="560" alt="Совушка">Сейчас, конечно, Апач теряет популярность, но я воспользуюсь синтаксисом mod_rewrite, желающие могут переделать в Энжин Икс
RewriteEngine On
RewriteCond %{HTTP_COOKIE} !retina=1
RewriteRule (.*)@2x\.(gif|jpe?g|png|webp) $1.$2 [L,NC]Этот код означает, что если не установлено «печенье» «retina=1», то нужно убрать постфикс «@2x» из имени картинки.
В итоге, если у нас Ретина, «печенька» ставится в самом начале, все дальнейшие запросы к серверу идут с ней и картинки грузятся как указано в коде — например, если указано «owl@2x.jpg», то эта картинка и грузится.
Если у нас обычный экран, «печеньки» нет, запросы к серверу идут без неё и из картинок вырезается постфикс «@2x», т. е. картинка «cat.jpg» грузится по своему имени, а вместо «owl@2x.jpg» загрузится «owl.jpg».
Voilà!
Безо со
Начал замечать, что из речи (письменной и даже устной!) начинает пропадать вариант предлогов с буквой «о» на конце: безо, со, во, ко. Уже всё чаще слышу «к времени» (а не «ко времени»), «без всяких» (а не «безо всяких») и так далее.
Тенденция заметна не только в Казани, но по всей России, например, недавно в самолёте

Мне кажется или эти предлоги
exe2com под Линуксом и «Маком»
Если вам
char *strlwr(char *string) {
unsigned char *p;
for (p = (unsigned char *)string; *p != 0; ++p)
*p = (unsigned char)tolower (*p);
return string;
}gcc -fno-builtin-exit exe2com.c -o exec2comПосле этого утилита нормально работает.
Комик-стрипы и картинки Андрея Образцова

Давненько не рекомендовал
Первые эксперименты с C#
Поучился обращаться к динамическим библиотекам «Мака» (dylib)
using System;
using System.Runtime.InteropServices;
using MonoMac;
using MonoMac.CoreFoundation;
using MonoMac.ObjCRuntime;
namespace MacGreenerFragment
{
class SleepAwake
{
[DllImport ("IOKit", CharSet = CharSet.Ansi)]
static extern int IORegistryEntryFromPath (IntPtr masterPort, string path);
[DllImport ("IOKit")]
static extern void IOObjectRelease (int @object);
[DllImport ("IOKit")]
static extern void IORegistryEntrySetCFProperty(int entry, IntPtr propertyName, IntPtr property);
static void macSleepAwake(bool sleep)
{
var handle = Dlfcn.dlopen (Constants.CoreFoundationLibrary, 0);
IntPtr True = Dlfcn.GetIntPtr (handle, "kCFBooleanTrue");
IntPtr False = Dlfcn.GetIntPtr (handle, "kCFBooleanFalse");
int r = IORegistryEntryFromPath(IntPtr.Zero, "IOService:/IOResources/IODisplayWrangler");
if (r != 0) {
IORegistryEntrySetCFProperty(r, ((CFString)"IORequestIdle").Handle, sleep ? True : False);
IOObjectRelease(r);
}
}
}
}На Си это 11 строк.
Как узнать, что пользователь печатает веб-страницу на принтере?
У нас тут задача в процессе производства продукта появилась — занести в лог, что пользователь сделал попытку печати
Придумал такое решение — перед печатью браузер накладывает стиль CSS для печати, если он есть, этим можно воспользоваться:
@media print {
body {
background: url(http://example.org/user-tries-to-print.php);
}
}Браузер попытается загрузить фоновое изображение (и загружает, я попробовал), выполнится серверный скрипт и положит в логи то, что нужно.
MacGreener C#

Переписал МакГринер с Си на Си#. Основной код
Весь код разбит, преимущественно, на три класса — основной класс, где выполняется приложение, класс IOKit — низкоуровневые и чуть более высокоуровневые биндинги для библиотек МакОСи и IOKitMotionSensor — ещё более высокоуровневая обёртка над куском кода для опроса датчика.
Есть ещё два вспомогательных класса — IOKitException, класс кидаемых исключений и IOKitObject — класс всех ресурсов, которые требуется высвобождать (он следит за своевременным их высвобождением при помощи блока using).
Не знаю какую версию я буду дальше развивать (и буду ли), но версия на Си# более прожорлива —
Хорошо, что мой братишка давно программирует на этом языке, с его консультациями в некоторых тонкостях удаётся разобраться быстрее.
Бумага о рождении в СССР

Мама, перебирая старые бумаги, нашла привет из прошлого — вот такой листок ей дали в роддоме после моего рождения. Ему скоро 36 лет, как и мне. Не знаю, вручали ли его во всех роддомах СССР (поспрашивайте родителей, кстати, интересно), но по меньшей мере в одном роддоме одного города — да.
Кстати, у меня ещё один вопрос — что такое длина
Интэ́л
Я всю жизнь говорил «И́нтэл» и все окружающие меня люди произносили название этой корпорации именно так. Возможно,
И от рекламы есть польза!
Точка отсчёта
Китайское слово
Тай-е буквально переводится как «самый дальний дедушка» (прадедушка). Такой титул присвоен в семье моей жены ее деду по отцовской линии. Когда мы ездили в Китай летом 2001 года, нашей первейшей обязанностью было навеститьТай-е. Семья бесконечно им гордится, ибо он дожил до 97 лет в добром здравии и с ясной головой. «Ему девяносто семь лет! — говорили мне все. — Вам непременно надо встретиться с ним!» Я и встретился с ним — бодрым, располагающим к себе Буддой в цветущем человеческом воплощении, с румяным лицоми по-прежнему острым умом. Однако вопрос о том, правда ли ему 97 лет, довольно интересен.
Тай-е родился на третий день двенадцатого лунного месяца лунного года и сы по традиционному летосчислению, принятому в поднебесной. По западному календарю это было 28 декабря 1905 года. Поскольку мой приезд пришелся на начало июля 2001 года, возрастТай-е по современному западному исчислению в тот момент составлял 95¹⁄₂ лет и несколько дней. Так почему же все говорили, что ему 97 лет?Потому что по старому китайскому стилю, которого и придерживался
Тай-е, возраст его при рождении составлял один год, и к этому добавлялся год всякий раз, как наступал Новый год по лунному календарю — каковой случился 24 января 1906 года по нашему календарю, через 27 дней после его рождения. Он не прожил еще и месяца в этом мире, а ему уже было два года! Таким образом, когда наступил лунный Новый год в 2001 году (что случилось также 24 января, хотявообще-то лунный Новый год может выпасть на любую дату между 21 января и 20 февраля), Самый Дальний Дедушка отпраздновал свое97-летие.
«Простая одержимость». Бернхард Риман.
Многозначная логика в действии
Это прекрасно чуть более, чем полностью, друзья!

На скриншоте
Мне ещё сама реализация нравится. Это же надо обладать таким сломанным мозгом, чтобы так написать. Ну почему вот так не сделать?
if (!_ok && Math.random() <= 0.1) {
return res;
}