Светящийся Мост Мира в Тбилиси

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

Мост Мира (87.69КиБ)

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

Светодиоды в Мосте Мира (26.38КиБ)

Удивил меня и факт их наличия, и то, что они днём тоже работали. Выглядит восхитительно. Соединены они едва заметными проводками, идущими внутри стекла горизонтально, если сильно не приглядываться, они совершенно неразличимы.

7 комментариев

Паспорта в гостинице «Вере Палас» (Тбилиси) в открытом доступе

Забавно с безопасностью обстоят дела в гостинице «Вере Палас», что в Тбилиси. Я, конечно, поделился своей тревогой с персоналом гостиницы, надеюсь они исправять ситуацию.

В общем, стоит подключиться к их бесплатному вайфаю, как в сети обнаруживается несколько компьютеров. Один из них, открытый всем ветрам «giorgi-pc» — это компьютер рецепшена, где хранятся, в частности, сканы паспортов всех постояльцев.

К примеру, я нашёл паспорт своей жены:

Паспорта постояльцев (25.24КиБ)

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

13 комментариев

Мой «Макбук» всё

Яблоко сгнило (43.90КиБ)

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

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

14 комментариев

История с кладбищ

Я очень люблю историю. Точнее нет, не совсем так. Изучая историю в той форме, которая принята в наших учебных заведениях, я рискую порвать рот от зевоты; если не ошибаюсь, у меня по этому предмету всегда тройка была. Я очень люблю вступать с историей в непосредственный контакт.

Нет ничего лучше для меня на отдыхе, чем залезть на какие-нибудь развалины, а страна без истории (Эмираты, например), вызывает у меня неприятие и скуку.

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

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

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

Первые три из деревни Старая Письмянка Лениногорского района. На первом можно разобрать «Здесь покоится В…», если я правильно помню, там дальше было имя «Василий» и дата — декабрь 1890 года.

Погребальный памятник из камня с надписью «ЗДЕСЬ ПОКОИТСЯ СЕРГЕЙ» на фоне весенней зелени и деревьев.
Выцветшая надпись на старом каменном надгробии: «ЗДЕСЬ ПОКОИТСЯ...», остальной текст практически нечитаем из-за выветривания и мха.

Вторая могила — Семёна Емельяновича Выдрина, написано, кажется, на церковнославянском, а может в то время все так писали, даты-то нет:

Старый потёртый надгробный камень с выцветшей надписью на русском языке, стоящий среди высокой травы и молодых растений на кладбище.

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

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

Следующая могила из села Старое Исаково Бугульминского района, если правильно помню. Надпись хорошо видно — первого мая 1901 похоронен Шулешкин Александр Трофимович, 15 июля 1835 года рождения. Фамилия удивительно знакомая, кажется, я когда-то уже с ней сталкивался, изучая историю тех мест.

Сейчас сходу нашёлся только протокол заседания Самарского губернского земского собрания от 16-17 января 1898 г. (когда-то эти места к Самаре относились), где упоминается «гласный А.Т. Шулешкин», может это он и есть — по годам подходит.

Погребальный камень с надписью «Здесь погребено тело жены моей Елены Ивановны, умершей 15-го мая 1845 года, в возрасте 30 лет

Дальше две безымянные могилы из Нового Исакова и Дубовки Бугульминского района. Если на первой ещё угадываются какие-то полустёртые письмена, но на второй их, кажется, и не было никогда.

Старая каменная плита с вырезанным крестом лежит на земле среди травы и земли, частично покрытая тенью от ветки.

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

Так что обитателю безвестной могилы в Дубовке ещё повезло — от него хоть камень остался, хоть уже и не узнать кем он был или хотя бы как его звали.

Старый обветшалый камень с вырезанным крестом, покрытый мхом, стоит на земле среди сухих листьев и молодой зелени.

8 комментариев

Скачивалка документов из архивов ЭлАра

Написала мне одна читательница по поводу моей утилиты для скачивания документов из электронных архивов ЭлАра. Оказывается, помимо самарского, моя утилита вполне нормально работает и с тобольским. Что ж, наверняка есть ещё архивы с которыми она совместима, поэтому в новую версию я добавил необязательный параметр host, который позволяет указать другой адрес (по-умолчанию используется самарский):

Тобольский архив (8.71КиБ)

Утилита лежит там же — на «ГитХабе».

5 комментариев

Валентина Терешкова

Фотография советской космонавта Валентины Терешковой в скафандре с медалями и подписью внизу, лежащая на конвертах.
Фотография Валентины Терешковой с автографом

Не знаю, рассказывают ли сейчас в школах кто такая Валентина Терешкова, когда я там учился, её имя произносили рядом с Гагариным и Леоновым.

Первая в мире женщина-космонавт! И сейчас полёты не сахар, как серьёзно физически готовят будущих космонавтов, а подумайте как леталось первым космонавтам, как было тяжело психологически и физически, вот что говорит «Википедия»:

Во время обучения она проходила тренировки на устойчивость организма к факторам космического полёта. Тренировки включали в себя термокамеру, где надо было находиться в лётном комбинезоне при температуре +70 °C и влажности 30 %, сурдокамеру — изолированное от звуков помещение, где каждая кандидатка должна была провести 10 суток.

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

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

Нашёл фото совершенно случайно в кафе, [где почти каждый день обедаю (это кафе в хостеле «I&I»), очень дружественное и приятное место. Там на подоконниках лежат разные штуки советский времён, большей частью хлам, а вот альбом с этикетками меня заинтересовал, потому и наткнулся на фото.

10 комментариев

Грузия — прекрасна!

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

Для начала, нам сильно повезло — весь тур выкупила какая-то компания, под корпоратив, но трое их сотрудников не оформили какие-то нужные документы (я подозреваю, что паспорта) и три места в туре достались нам — мне, жене и братишке. Поскольку на чужом корпоративе нам делать нечего, компания «Жарков-тур», через которую мы летали, организовала нам за те же деньги индивидуальную поездку — со своим гидом и водителем комфортабельного микроавтобуса.

Поэтому мы могли выбирать куда поехать, например, мы заглянули в город Го́ри, в дом, где родился Сталин и соответствующмй музей.

Второе везение — за пять дней в Грузии не было ни капельки дождя, стояла прекрасная, солнечная погода, +25—28˚Ц. Лишь когда мы поехали в аэропорт, в Батуми всё-таки пошёл дождь.

Везение номер три — это перелёты. Летели мы в обоих случаях через Москву. При полёте «туда» до пересадки у нас было три часа, которые съелись на полуторачасовое ожидание самолётом в воздухе посадки в Домодедове, почему-то её всё никак не разрешали, а потом — на долгое (около часа) получение багажа.

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

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

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

Больше всего мы провели времени в Тбисили и Батуми. Ребята, там почему-то очень чисто, но никакой армии дворников (как в Москве) я не заметил. В Батуми строят свои отели все известные сети — Шератон, Хилтон, Редиссон и так далее. Очень хорошо, что мы приехали весной — всё цвело, в том числе Ботанический сад Батуми. Отдельной похвалы заслуживает и дельфинарий этого города — за насыщенное, впечатляющее, получасовое выступление. Я был в нескольких дельфинариях, но такого восторга ни разу не испытывал.

Теперь еда. Грузинская кухня — это очень вкусно, ребята! Бешенно вкусно! Мы много чего ели, но больше всего почему-то запомнился хачапури по-аджарски, наверное потому, что я сначала понятия не имел как его есть, а теперь научился и втянулся. Помню, мы его заказали в Ульяновске в грузинском ресторанчике и смотели на него, как бараны на новые ворота. А ещё в Грузии довольно дёшево. В ресторане над Алазанской долиной, на пятом этаже, открытой площадке башни-ресторана с отличным видом на долину и водопадик, мы поели (салат, суп, второе, чай) на… 400 рублей с каждого! В хорошем ресторане на берегу Чёрного моря (пол со стеклянными фрагментами, под ногами — море), вдвое дешевле. А ещё в каждом ресторане предлагают минеральную воду, только не Боржоми, а несколько видов другой, более мягкой, столовой, а не лечебной.

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

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

Что не понравилось. В Грузии везде курят. В кафе, ресторанах, на улицах, хозяин магазинчика преспокойно закурил при нас в помещении, в ресторане «Привет из Батума», в котором мы в последний раз ужинали, курил весь зал, целиком, только дети не курили, зато их родители смолили рядом с ними вовсю. Наш экскурсовод рассказала, что с курением пытались бороться, но законопроект не прошёл.

В остальном же страна прекрасна, очень рекомендую как-нибудь туда съездить и убедиться в этом лично. Ничего себе «несколько слов» получилось…

8 комментариев

Слово «мама» — значит «еда»

Цитата с «Дёрти»:

Наиболее полное исследование над словами «мама» и «папа» как универсальными терминами было проведено лингвистом Романом Якобсоном. Он объяснил, что для человека наиболее простыми для воспроизведения являются открытые гласные звуки. Дети могут произносить гласные звуки с первых дней жизни. Что они и делают. Постоянно. Как только они начинают экспериментировать с другими звуками, они пробуют самые простые согласные. Обычно они начинают со звуков, производимых с закрытыми губами, так называемых «губных согласных», например, [m], [p], [b]. Дети собирают всю энергию, чтобы вытолкнуть этот новый гласный звук «мммм», а затем расслабляют рот в наиболее простом открытом гласном «а». Добавляя сюда естественное повторение в детской речи (лепет), мы получаем «ма—ма», «ба—ба», «па—па» и так далее.

Так почему же дети все—таки тяготеют к звуку [m], а не [p] или [b]? Конечно же, из—за женской груди. Звук [m] — самый простой для детского рта, приложенного к теплой аппетитной груди. Даже став взрослыми мы продолжаем ассоциировать «мммм» с чем—то вкусненьким. То же делает и ребенок.

Якобсон в своей работе полагает, что ребенок не имеет ни малейшего понятия о том, что вас зовут мамой или папой или как—то еще. Слово «мама» не значит «я люблю тебя, дорогая женщина—ангел, принесшая в жертву сон, карьеру и упругость ягодиц». Оно значит «еда».

Так что когда ребенок зовет папу «мамой» и все больше начинает тревожиться, что папа не становится «мамой», на самом деле он не зовет свою мать. Он способен понять, что волосатый плоскогрудый болван, который пытается петь колыбельную, не является Главным Блоком Раздачи Еды №1. А Главный Блок Раздачи Еды №1 или хотя бы подходящий латексный заменитель, который этот Блок обычно носит с собой, должен быть доставлен немедленно.

Я ещё, учась в школе, сообразил, что слово «мама», вероятно, так распространено во всех языках, потому что его проще всего произнести, что бы оно там не значило. Но я думал, что оно ничего не значит для младенца, просто какие-то звуки, ан нет, учёные считают, что оно имеет отношение к желанию поесть.

Кстати, на татарский «мама» переводится как «эни́», но я не знаю считают ли татары детское «мама» аналогом своего «эни», надо будет поспрашивать. А в грузинском «мама» (მამა) означает «отец», тогда как «мать» звучит как «деда» (დედა).

17 комментариев

4G в Казани

Неожиданно заработал «4Джи» в смартфоне, голос идёт по старинке, а интернет через сеть нового поколения. Скорости космическими не назвать, но по ощущениям стало побыстрее — как на вайфае.

4G, Мегафон (51.93КиБ)

Я сегодня пошёл симку менять, прежняя, резанная под мини-сим, померла, воспользовавшись случаем сменил её на нормальную мини-сим. Меняя, увидел на симке надпись «LTE» и спросил у персонала что это значит. Оказалось — теперь в некоторых смартфонах доступен режим ЛТЕ для интернета. У нас ЛТЕ уже давненько, но на только для УСБ-модемов, симка из которых (если вставить её в смарт) позвонить никуда не позволяла. В общем, нужны, как я понял: специальная симка, телефон, поддерживающий российский ЛТЕ (у меня — Нокия 920, причём нужна самая последняя прошивка) и что-то включить в «личном кабинете» (мне сотрудницы сами включили).

Работает «4Джи» пока только у «Мегафона», впрочем могу ошибаться, за новостями других компаний я не слежу — у меня-то как раз «Мегафон».

8 комментариев

Сенсор внезапного движения

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

На ноутах с твёрдотельным накопителем (ССД), этого сенсора обычно не бывает — он там не нужен. Например, на моём Макбуке Эйр его не было, нет его и на 15″ Макбуке Про с Ретиной моего друга, я специально смотрел — в этих ноутах нет жёстких дисков. В Макбуках Про предыдущей модели, без Ретины и с жёстким диском, сенсор, естественно, был.

Каково же было моё удивление, когда я обнаружил, после покупки Макбука Про 13″, что в сведениях о системе есть упомянутый сенсор:

Сенсор внезапного движения (148.70КиБ)

Думаю, его просто забыли убрать, наверное это рудимент прежней модели Макбука. Но наличие сенсора не говорит о том, что он работает. Я сегодня потратил пару часов, чтобы разобраться как в Маке читают этот сенсор и написал вот такую программу на Си:

// 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).

2 комментария

Берём «Макбук» со стола, экран гаснет или блокируется

В предыдущей заметке я писал, что обнаружил сенсор внезапного движения у своего «Макбука». Решил извлечь практическую пользу из этого — написал программу на Си, которая отправляет ноут в спячку, стоит поднять его со стола:

// 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);
}

27 комментариев

Разрушенные церкви бугульминского района Татарстана

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

Я в последние майские праздники ездил по некоторым кладбищам бавлинского и бугульминского районов Татарстана — искал могилы своих предков, заодно заехал в парочку разрушенных церквей.

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

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

Разрушенная кирпичная церковь с обвалившейся штукатуркой и отсутствующей крышей, стоящая на зелёном холме под голубым небом с облаками.
Вид изнутри разрушенного здания: обвалившаяся кирпичная кладка купола, оголённые деревянные балки перекрытий и облупившаяся штукатурка стен под ясным небом.
Обветшавшая стена с облупившейся штукатуркой, трещиной и остатками росписи, обрамлённая красным кирпичом.
Почерневшая и облупившаяся фреска в прямоугольной нише с надписью кириллицей, частично сохранившая зелёные и коричневые тона на фоне осыпавшейся штукатурки.

На второй серии снимков — Храм Петра и Павла из села Ключёвка, я о нём уже писал когда-то. Судя по документам, в этом храме крестили мою прабабушку по маминой линии. Вероятный год постройки — 1809, на чьи средства построен храм мне неизвестно, но село основано купцом Рыковом, возможно он и стал спонсором. В храме много фресок, где ещё угадываются контуры сцен и надписей, кое-что даже ещё пока выглядит очень неплохо, но само здание открыто всем ветрам, крыша провалилась, значит всё это будет ветшать.

12 комментариев

MacGreener

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

Я немного изменил алгоритм и внёс ещё одно важное изменение: теперь, если «Мак» поставить на стол, он проснётся. Напомню, программа работает только при наличии соотвествующего датчика. Рядом с исходным кодом лежит скомпилированная версия.

11 комментариев

Angel. Pushkin

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

Чтобы технари полюбили поэзию, надо всего лишь заменять в стихах некоторые слова на английские:

Angel В дверях eden’a angel нежный Главой поникшею сиял, А daemon мрачный и мятежный Над hellish abyss’ом летал.

Дух отрицанья, дух сомненья На духа чистого взирал И heat невольный умиленья Впервые смутно познавал.

«I’m sorry, — рёк,— тебя я видел, И ты недаром мне сиял: Не все я в sky возненавидел, Не все я в sea презирал».

Правда здорово и современно?

28 комментариев

Идентификаторы в C#

Я тут Си-шарп начал учить, удивляюсь всему, как ребёнок, с первых же страниц.

Идентификаторы (42.74КиБ)

Обратите внимание на строку 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

21 комментарий

Шутка про женщин на C#

Придумалась шутка про женщин на языке Си-шарп:

class Woman {
    public static bool operator true (Woman question) {
        return false;
    }

    public static bool operator false (Woman question) {
        return false;
    }
}

5 комментариев

Обнаружение Ретины

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

Наиболее животрепещущий вопрос — подготовка изображений для Ретины.

Напомню, что Ретина — технология Эпл, ставшая уже нарицательной, заключающаяся в примерении экранов высокого разрешения (например, на моём ноуте это 2560×1600) с отображением на нём обычной графики так, как бы это выглядело на экранах вдвое низкого разрешения. При этом шрифт смотрится просто великолепно, как на бумаге, а вот с картинками беда.

В вебе бо́льшая часть графики выглядит не очень (хотя масса сайтов уже подготовилась). Для того, чтобы стало хорошо, все изображения надо готовить вдвое большего размера, при этом указывая для них в коде вдвое меньший размер, тогда проявляется вся мощь Ретины — будет видно самые мелкие детали изображения и пропадёт размытие.

Пока ещё не у всех Ретины, хочется, чтобы клиенты, у которых её нет, не грузили лишнего. К сожалению, загвоздка в том, что браузеры пока не научились сообщать серверу, что мы имеем дело с таким (пока) необычным экраном и есть только клиенские способы выяснить это.

Появилось уже несколько библиотек, которые на стороне клиента делают замены картинок на подходящие под тип экрана. Это всё равно вызывает лиший трафик, так как некоторые картинки успевают загрузиться, а если изображений много, замена, бывает, подтормаживает.

Насколько я вижу, даже в Эпл не придумали достойной альтернативы этой техники и у них сайт «улучшается» по мере загрузки — сначала грузятся обычные изображения, потом «ретиновые», если это необходимо.

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

А пока, у меня такое решение. Используем старые-добрые «печеньки» и mod_rewrite.

На стороне клиента первой строкой каждой нашей страницы ставим проверку по «ретиновые» экраны с установкой «печенья»:

<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à!

66 комментариев

Безо со

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

Тенденция заметна не только в Казани, но по всей России, например, недавно в самолёте «Эс-сэвена» слышал какую-то фразу, объявляемую при взлёте, где должен быть предлог с «о», но произнесли без, не могу её сейчас вспомнить.

Чек из «Мака» (44.45КиБ)

Мне кажется или эти предлоги всё-таки умирают?

22 комментария

exe2com под Линуксом и «Маком»

Если вам для чего-то понадобится (как мне) скомпилировать утилиту exe2com под «Маком», то, во-первых, нужно будет добавить в начало файла следующий код:

char *strlwr(char *string) {
  unsigned char *p;

  for (p = (unsigned char *)string; *p != 0; ++p)
    *p = (unsigned char)tolower (*p);
  return string;
}

А во-вторых, компилировать нужно с ключом -fno-builtin-exit:

gcc -fno-builtin-exit exe2com.c -o exec2com

После этого утилита нормально работает.

Оставить комментарий

Комик-стрипы и картинки Андрея Образцова

16 градаций Серого (87.54КиБ)

Давненько не рекомендовал комик-стрипы, исправляюсь, горячо рекомендую ЖЖ Андрея Образцова, образец творчества которого вы видите выше.

1 комментарий

Первые эксперименты с C#

Поучился обращаться к динамическим библиотекам «Мака» (dylib) из Си-шарпа. Не очень удобно, надо сказать. Вот во что превратилась моя функция macSleepAwake из сишной программы MacGreener:

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 строк.

8 комментариев

Как узнать, что пользователь печатает веб-страницу на принтере?

У нас тут задача в процессе производства продукта появилась — занести в лог, что пользователь сделал попытку печати чего-либо в браузере. Есть событие onbeforeprint, но оно есть только в Эксплорере и Файерфоксе.

Придумал такое решение — перед печатью браузер накладывает стиль CSS для печати, если он есть, этим можно воспользоваться:

@media print {
    body {
        background: url(http://example.org/user-tries-to-print.php);
    }
}

Браузер попытается загрузить фоновое изображение (и загружает, я попробовал), выполнится серверный скрипт и положит в логи то, что нужно.

15 комментариев

MacGreener C#

MacGreener C# (36.34КиБ)

Переписал МакГринер с Си на Си#. Основной код более-менее повторяется, но код получился более чем в два раза длинее.

Весь код разбит, преимущественно, на три класса — основной класс, где выполняется приложение, класс IOKit — низкоуровневые и чуть более высокоуровневые биндинги для библиотек МакОСи и IOKitMotionSensor — ещё более высокоуровневая обёртка над куском кода для опроса датчика.

Есть ещё два вспомогательных класса — IOKitException, класс кидаемых исключений и IOKitObject — класс всех ресурсов, которые требуется высвобождать (он следит за своевременным их высвобождением при помощи блока using).

Не знаю какую версию я буду дальше развивать (и буду ли), но версия на Си# более прожорлива — из-за фреймворка Mono, который требуется для исполнения программ на этом языке. Версия на Си# занимает в памяти 6,2Мб (+49,8Мб виртуальной), на Си — 840Кб (+18,6Мб виртуальной).

Хорошо, что мой братишка давно программирует на этом языке, с его консультациями в некоторых тонкостях удаётся разобраться быстрее.

Оставить комментарий

Бумага о рождении в СССР

Бумага о рождении (183.46КиБ)

Мама, перебирая старые бумаги, нашла привет из прошлого — вот такой листок ей дали в роддоме после моего рождения. Ему скоро 36 лет, как и мне. Не знаю, вручали ли его во всех роддомах СССР (поспрашивайте родителей, кстати, интересно), но по меньшей мере в одном роддоме одного города — да.

Кстати, у меня ещё один вопрос — что такое длина «53-36», почему два числа? (гусары, молчать!)

26 комментариев

Интэ́л

Я всю жизнь говорил «И́нтэл» и все окружающие меня люди произносили название этой корпорации именно так. Возможно, кто-то мне и говорил, что так неправильно, но я думал, что человек ошибается и не придавал значения. Сегодня не успел пропустить рекламу на «Ютубе» и услышал «Интэ́л», полез в «Википедию» разбираться, действительно «Интэ́л».

И от рекламы есть польза!

16 комментариев

Точка отсчёта

Китайское слово Тай-е буквально переводится как «самый дальний дедушка» (прадедушка). Такой титул присвоен в семье моей жены ее деду по отцовской линии. Когда мы ездили в Китай летом 2001 года, нашей первейшей обязанностью было навестить Тай-е. Семья бесконечно им гордится, ибо он дожил до 97 лет в добром здравии и с ясной головой. «Ему девяносто семь лет! — говорили мне все. — Вам непременно надо встретиться с ним!» Я и встретился с ним — бодрым, располагающим к себе Буддой в цветущем человеческом воплощении, с румяным лицом и по-прежнему острым умом. Однако вопрос о том, правда ли ему 97 лет, довольно интересен.

Тай-е родился на третий день двенадцатого лунного месяца лунного года и сы по традиционному летосчислению, принятому в поднебесной. По западному календарю это было 28 декабря 1905 года. Поскольку мой приезд пришелся на начало июля 2001 года, возраст Тай-е по современному западному исчислению в тот момент составлял 95¹⁄₂ лет и несколько дней. Так почему же все говорили, что ему 97 лет?

Потому что по старому китайскому стилю, которого и придерживался Тай-е, возраст его при рождении составлял один год, и к этому добавлялся год всякий раз, как наступал Новый год по лунному календарю — каковой случился 24 января 1906 года по нашему календарю, через 27 дней после его рождения. Он не прожил еще и месяца в этом мире, а ему уже было два года! Таким образом, когда наступил лунный Новый год в 2001 году (что случилось также 24 января, хотя вообще-то лунный Новый год может выпасть на любую дату между 21 января и 20 февраля), Самый Дальний Дедушка отпраздновал свое 97-летие.

«Простая одержимость». Бернхард Риман.

9 комментариев

Многозначная логика в действии

Это прекрасно чуть более, чем полностью, друзья!

random()>0.1 (15.26КиБ)

На скриншоте 213-я строка джавовского драйвера для Монги, внутри класса ConnectionStatus, метод update.

Мне ещё сама реализация нравится. Это же надо обладать таким сломанным мозгом, чтобы так написать. Ну почему вот так не сделать?

if (!_ok && Math.random() <= 0.1) {
    return res;
}

7 комментариев

← сюда туда →