Про вакцины

Президент Калифорнийской некоммерческой корпорации «Natural Woman, Natural Man, Inc.» Джок Даблдей предложил $20000 первому из врачей или руководителей фармацевтических компаний, кто публично выпьет смесь стандартных добавок, имеющихся в большинстве вакцин, в том же количестве, которое, в соответствии с рекомендациями Центра Профилактики и Контроля заболеваемости США 2000г, получал шестилетний ребенок.

Эта смесь не будет содержать действующего начала вакцины — живых или убитых вирусов или бактерий. В её состав войдут только стандартные добавки к вакцине в их обычных формах и пропорциях (…)

—  с сайта «Вакцинация — панацея или смерть».

Хотя тут речь идёт немного о другом, но и с самими вакцинами мне совершенно ничего не понятно. Где правда, не говоря уже об истине? Заказал на «Озоне» книгу «»Беспощадная иммунизация — правда о прививках», Александра Котока (в формате fb2 не смог найти), жду.

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

Кредитка vs. наличные

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

Я в магазинах в России спрашиваю принимают ли они банковские карты, а там ситуация обратная — вопрос в том принимаются ли наличные.

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

Пинг-понг

Журналисты «Look at me» взяли небольшое интервью для статьи «Пинг-понг жив»:

Мужчина в чёрной футболке с надписью «Такси не нужно» стоит с ракеткой для настольного тенниса у стола в помещении с кирпичными стенами.

«В пинг-понг играю года два. Начал играть, когда тесть купил стол для пинг-понга, а потом сам купил ракетку. Одеваться для игры стараюсь спортивно. Вот сегодня у меня не очень удачные джинсы, например. Поскольку пинг-понг — очень подвижная игра, широко шагать в них неудобно. Ракетка у меня своя, склеенная — отдельно покупал основание и резиновые накладки. Вообще, у ракеток очень разные характеристики, все зависит от стиля игры. Я защитник — редко нападаю, стараюсь снизить скорость игры. Как у самоучки, техника у меня довольно-таки плохая, и все мои движения кажутся игрокам очень странными, поэтому их сложно „читать“. Я беру неожиданностью, а кроме того, как коронный прием я использую „тычки“ — резкие, короткие движения. Это неправильно с точки зрения техники, потому что они малоконтрольные, и надо очень долго тренироваться, чтобы они получились, но, в то же время, это неожиданный и эффективный прием».

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

Пайтон: замкнувшее замыкание

Есть немало вещей, которые мне не нравятся в Пайтоне. Не так давно мы на работе наткнулись ещё на одну.

У нас есть код, который выглядит примерно так (можно написать и одну функцию, но так нагляднее):

def outer(useless = None):
    def inner():
        if useless is None:
            print "Pichal'ka"

    return inner

outer()()

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

Теперь меняем код:

def outer(useless = None):
    def inner():
        if useless is None:
            print "Pichal'ka"

        # тут много кода, начало мы уже потеряли
        if False: useless = None

    return inner

outer()()

Запускаем код и видим (Пайтон 2.6.5):

Traceback (most recent call last):
  File "sample.py", line 10, in <module>
    outer()()
  File "sample.py", line 3, in inner
    if useless is None:
UnboundLocalError: local variable 'useless' referenced before assignment

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

Избавиться от эффекта можно, изменив прототип внутренней функции на «inner(useless=useless)».

То же, кстати, происходит при импорте модуля:

import random

def outer():
    print random.choice
    #import random

outer()

Раскомментируйте строчку со вторым импортом и получите ошибку.

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

Я не придумал хороших причин так делать с точки зрения языка (может их кто-то из читателей тут меня поправит?), поэтому считаю, что так сделали для упрощения интерпретатора.

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

Сколько есть способов восстановить chmod?

Иногда на собеседованиях спрашивают такую задачу, на соображалку: предположим вы случайно сняли права исполнения с команды chmod. Как их восстановить?

Я решил подумать сколько способов исправить эту ситуацию я знаю.

Первый способ — скопировать chmod с соседней машины при помощи scp, sshfs и т. п. Если такая машина имеется, конечно.

Способ второй:

cp /bin/sh ~/chmod2
cat /bin/chmod > ~/chmod2
sudo ~/chmod2 +x /bin/chmod
rm ~/chmod2

Третий способ (при условии, что у вас какой-то дистрибутив, использующий пакеты, у меня способ для Debian):

sudo apt-get --reinstall install `dpkg -S /bin/chmod | cut -f1 -d:`

Способ четвёртый:

gcc -x c - <<CHMOD
#include <sys/stat.h>
main(){chmod("/bin/chmod", S_IXUSR | S_IXGRP | S_IXOTH);}
CHMOD

sudo ./a.out
rm a.out

Кто ещё знает способы?

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

Группа → служба

Стал руководителем службы разработчиков внутренних сервисов «Яндекса».

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

Террористов бояться — метро не ходить

На перегоне «Чистые пруды» — «Красные ворота» ко мне подходит молодой мужчина: светлоглазый, белесо-рыжеватый, в чем-то ярко-желтом. Подбивает клинья, спрашивает, что читаю. (…)

Приглашает посидеть в кафе. Вежливо говорю «Спасибо, нет» и продолжаю читать, не смотря на него и не реагируя на дальнейшие реплики. Тот заявляет: на следующей мы с тобой выйдем. Замолкает. Через 15 секунд — станция. Тот требует выйти, угрожая, что иначе закричит, ЧТО Я ШИХАДКА, позовет милицию и меня посадят. (…)

Мужчина кричит на весь вагон: «Люди, в вагоне шахидка, спасайтесь! Люди, она — смертница! СМЕРТНИЦА!», дергает меня сильней, я слетаю с места. (…)

Смотрю на оставшихся мужчин и не понимаю, почему они мне не помогают, видно же по ним, что не трусы?! Соображаю, что приняли за истеричную семейную пару и не решаются вмешаться: грубую силу-то мужик не применяет. Кричу: «Мы НЕ ЗНАКОМЫ!» Тут же с места срываются «вахаббиты» и пара парней славянской внешности, оттесняют мужика на станцию, потом трое остаются со мной в остановленном из-за паники вагоне и успокаивают.

Из ЖЖ несостоявшейся «смертницы».

Из этой истории целых два интересных вывода.

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

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

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

Если интересно, можно ещё и послушать, там подробнее.

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

Опоздали на самолёт

Полукупе (18.89КиБ)

В первый раз в жизни опоздали с женой на самолёт. Я расcчитывал время — когда надо выйти с работы, чтобы успеть домой, доехать на метро до вокзала, а оттуда уехать в аэропорт по расписанию. В одном месте опечатался на час, в итоге опоздали на регистрацию на десять минут. Увы, как мы ни просили, на борт нас не взяли.

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

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

Монк и обувь

Заметил, что в сериале «Детектив Монк» главный герой-чистюля, Эдриан Монк, который убирает свою квартиру несколько раз в день и панически боится микробов, грязи и прочего (около 300 фобий), тем не менее не снимает обувь, входя к себе в дом, и не заставляет гостей это делать.

Видимо при всех странностях Монка, снимать обувь в квартире, по американским меркам, уж чрезмерно странно.

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

Советские деньги

Советские деньги (22.94КиБ)

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

Есть ещё небольшая коробка монет, которые остались у родителей с тех времён. А у вас сохранились советские деньги? Что вы с ними планируете делать? Хранить? Выкинуть? Продать?

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

Изменения в speeddial новой альфы «Оперы»

Ребята из «Оперы» экспериментируют с возможностями SpeedDial в своём браузере. Помните, я писал о специальных версиях некоторых сервисов «Яндекса» для SpeedDial?

К сожалению, «Опера» их разломала в свежей альфе, зато добавила новую возможность, которой очень нехватало: специальным заголовком или мета-тегом можно указать время обновления страницы в speeddial.

Preview-refresh: 10

или

<meta http-equiv="preview-refresh" content="10" />

Время указывается в секундах. Кстати, теперь можно надёжно узнать через media queries, что «Опера» показывает страницу в SpeedDial: достаточно проверить, что «view-mode» в значении «minimized»; помимо этого есть возможность указать произвольное изображения для миниатюры (об этом лучше почитать подробнее в блоге «Оперы»).

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

Почтовый клиент в виде IM

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

У вас такого не бывает? Конечно, когда надо ответить на длинное письмо с кучей цитат, да ещё, если это часть сложного треда, то лучше это делать в почтовике, но у меня таких только 10% всей переписки.

И я вот тут подумал — а нет ли почтового (SMTP/IMAP4) клиента в виде IM (как это сейчас по-русски называется? интернет-пейджера?)? Никто не видел? Я посмотрел плагины к «Миранде» (там обычно на любую тему есть что-то), ничего подходящего. Может существует что-то такое, а?

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

Лайки (не про собак)

Хочу провести эксперимент — поставил под каждым постом «лайки» с трёх социальных сетей («Вконтакте», «Фейсбук», «Твиттер»), посмотрим что получится, если я их правильно настроил, конечно.

Пока меня смущает, что они очень медленно загружаются.

Добавлено позднее: из-за «Хрома» придётся убрать «лайки» внутрь поста, иначе он подвисает секунд на 10.

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

Турция

Sherwood Breezes Resort (79.83КиБ)

Со второго по девятое апреля едем в Турцию, в Анталию, отель «Sherwood Breezes Resort» 5★. Не знаю почему, но оба чувствуем нечеловеческую усталость, хочется отдохнуть.

Планируем поваляться немного на пляже и съездить в Стамбул на экскурсию, я много слышал хорошего об этом городе от своего доброго знакомого Саида Кадырова (он там жил и работал). В море, увы, будет холодно — обещают температуру воды что-то около +18°C.

Кто был в Турции, расскажите что нужно знать? Куда ещё можно съездить, куда ходить, куда не ходить?

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

Одно из различий Python и JavaScript

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

Суть в том, что в Пайтоне метод ходит в гости со своим контекстом:

class A:
    test = 'A'
    def show(self): print self.test

class B: test = 'B'

a, b = A(), B()

show = a.show
b.show = a.show

show() # A
b.show() # A

Тогда как в JavaScript такой код будет работать совершенно иначе, там методы в чужой монастырь со своим уставом не ходят (если их не попросить):

var test = 'global';

A = function () {
    this.test = 'A',
    this.show = function () { alert(this.test) }
};

B = function () { this.test = 'B'; }

a = new A(); b = new B();

b.show =  a.show
show = a.show

show() // global
b.show() // B
b.show.apply(a) // A

Появление «global» наверное надо разъяснить тем, кто JS знает плохо. На самом деле первая строчка (в данном случае) может читаться как «window.test = ’global’», а «show = a.show» как «window.show = a.show», тогда, должно быть, всё более-менее встаёт на свои места.

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

Как посмотреть какие каналы WiFi используются

Скриншот программы inSSIDer 2.0 Mini: таблица Wi-Fi сетей с SSID, RSSI, каналом, типом шифрования и скоростью.
inSSIDer

У Паши Катурова увидел хорошую программу под Windows, называется inSSIDer 2 (есть и под Linux, кстати), позволяет посмотреть какой канал Wi-Fi наименее загружен вашими соседями.

Если упрощённо, чем больше Wi-Fi точек на канале (чем больше точек делят одну частоту), тем больше они друг другу мешают, тем ниже скорость. Так что надо выбирать канал наименее нагруженный, в идеале — свободный.

Моя точка (по уровню сигнала легко понять, что я её назвал «WiMAX») работала на каналах №№1 и 5. На первом висят уже несколько точек, поэтому я переместил свою точку на третий и седьмой каналы (стоит походить по квартире, в разных участках могут быть видны различные точки).

Кстати, легко видеть, что трое моих соседей используют шифрование WEP, которое взламывается минут за 10—15 и ни одна из точек (кроме моей) не поддерживает полноскоростную категорию «n».

Добавлено: в комментариях (спасибо!) напомнили о проблеме, которую я уже успел начисто забыть: каналы WiFi перекрываются. Есть хорошая картинка, показывающая как именно они перекрыты, заодно она объясняет почему все мои соседи выбрали канал 1, 6 или 11. Руководствуясь этими данными, я выключил второй канал (всё равно устройств «n» у меня пока нет) и переставил свою точку на 13.

На закладке «2.4 GHz Channels» (это частота, на которой работают устройства категорий «b», «g» и «n»), можно визуально оценить как ваша точка использует частоты и где располагаются точки соседей. У меня сейчас картина такая:

График амплитуды Wi-Fi каналов: Akado_24, HomeNet (7997444), ak_88_10, akavita_11, WiMAX.
Распределение по частотам

Как видно я занимаю канал №13, который частично перекрывается с каналами 8—12, уровень сигнала моей точки у меня в квартире заметно выше соседских, кроме того, половина моего канала никем, кроме меня не занята.

При густой «населённости» правило, видимо, такое: старайтесь не делить канал с точками, которые приближаются к вашей по уровню сигнала.

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

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

Перепрошил Intel WiFi 5100 ABG → ABN

Этот набор букв в заголовке означает, что благополучно перешил свой WiFi-адаптер в ноутбуке и теперь он поддерживает категорию «n» (категория «g», конечно, тоже поддерживается). Спасибо читателю Mixa за ссылку.

Скриншот окна «Диспетчер устройств» Windows с раскрытым разделом «Сетевые адаптеры», где видны Intel(R) 82567LM Gigabit Network Connection и Intel(R) WiFi Link 5100 AGN.
ABN

Если вы хотите повторить мой путь, то учтите, что можно легко запортить карту, а восстановление испорченной карты дело непростое. Итак, если вы решились (я перепрошивал из-под Windows 7), то помните — вы всё делаете на свой страх и риск.

Для начала вам потребуется последняя версия программы RW-Everything.

Шаг второй — нужно выяснить адрес вашей карты. Для этого откройте диспетчер устройств и найдите там ресурсы вашей карты, как на скриншоте:

Свойства устройства Intel(R) WiFi Link 5100 ABG: вкладка «Дополнительно», раздел «Параметры ресурсов» — диапазон памяти 00000000F69FE000–00000000F69FFFFFF, IRQ 4.
Ресурсы карты

Как видно, адрес моей карты — F69FE000. Убедитесь, что правильно копируете это число. Это важно.

Скачайте скрипт, который поможет вам сдампить текущие данные вашей карты, во второй строчке этого скрипта замените «########» на адрес вашей карты.

Запустите RW-Everything, выберите в меню «Command» (Access → Command), нажмите F3, выберите скаченный файл и дождитесь выполнения скрипта. В конце его работы в корне диска «C» у вас запишется файл RWLOG.TXT. Не удаляйте его, если испортите карту, он вам пригодится (я описывать процесс восстановления не буду).

Скачиваете скрипт, который пропатчит вашу карту, опять же, вместо «########» нужно написать адрес вашей карты.

Снова открываете в меню «Command», в длинное текстовое поле копируете скрипт (с заменённым адресом), нажимаете «Enter», когда скрипт завершит свою работу (курсор станет обычным, а в окне под текстовым полем появится лог работы скрипта), перезагружаете компьютер.

Молитесь. В нормальном случае, Windows скажет, что обнаружено новое устройство и поставит драйвер для карты Intel 5100 ABN. Если карта пропала, то, увы, что-то пошло не так. Попробуйте прочитать форум на IXBT, посвящённый этой теме и восстановить карту.

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

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

Интервью: 5shots

Евгений Степанищев aka Volk, руководитель службы разработчиков внутреннего сервиса, на фото в синем свитере с узором, склонившись к столу.
5shots

Вышло интервью со мной на проекте «5 шотов».

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

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

Москва ✈ Нижнекамск → Лениногорск → Бугульма ✈ Москва

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

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

В общем, успешно: взял один из последних билетов «ЮТэйр» в Нижнекамск, оттуда на машине в Лениногорск, день там, потом на машине в Бугульму, оттуда авиакомпанией «АкБарс Авиа» в Москву. Итого, всю пятницу (18-го марта) буду в Лениногорске.

На всякий случай (для родителей) пишу рейсы и время сюда:

Москва → Нижнекамск, «ЮТэйр» UT 187, вылет 17 марта 21:10, прилёт 23:10 Бугульма → Москва, «АкБарс Авиа» БГ 529, вылет 19 марта 6:50, прилёт 8:20

К сожалению, жену так не отпустят, тем более, что у неё какая-то очередная сверка на работе.

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

Полупереваренные мысли в блоге

Я думаю, что для некоторой части читателей я побуду Капитаном Очевидностью, но нужно же и до остальных донести мысль, которую я сейчас попытаюсь сформулировать.

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

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

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

Этот момент надо чётко понимать. Когда-то эта, очень простая мысль, была мне как-то неочевидна. Я пытался оценивать человека по его блогу, теперь я понимаю, что это нужно делать с большой осторожностью. Примерно так, как я это делаю на собеседовании. Человек рассуждает — хорошо, в отдельные моменты времени он заблуждается — неважно, главное куда он придёт. А вот последнего в блоге часто и не видно.

В общем, блог — это стробоскоп в ночном клубе.

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

Аэропорт Бугульмы

Зимний вид здания аэропорта Бугульма с красной неоновой вывеской «АЭРОПОРТ» и зелёными надписями «БУГУЛЬМА» на крыше; на переднем плане — люди в зимней одежде на снегу.
Белый пассажирский самолёт стоит на заснеженном аэродроме, рядом с ним работают наземные специалисты в тёплой одежде.
Белый самолёт стоит на заснеженном аэродроме у терминала с вышкой; в кадре — силуэт человека у фюзеляжа и часть другого судна слева.

Я в первый раз побывал в аэропорту Бугульмы. Может показаться удивительным, что около такого небольшого (90 тысяч жителей) города есть аэропорт. На деле, он, конечно, работает ещё и окрестные города — Альметьевск (142 тысячи), Лениногорск (65 тысяч), Азнакаево (35 тысяч), кроме того, это нефтяной район, значит деньги, значит полёты. Правда принимает он только небольшие самолёты.

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

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

Хотя, может быть, дело в том, что девушка работала только месяц и ещё не успел «втянуться» в привычное в нашей сфере обслуживания равнодушное хамство.

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

Алушта

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

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

В Крыму уже потихоньку зеленеет, везде трава, многие деревья уже зелёные. И у моря хорошо.

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

Рапана

Рапана (49.97КиБ)

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

На фото это, например, самые правые два кусочка.

Чтобы попробовать правильно приготовленную рапану и вернуться обратно в гостиницу мы с Сашей прошли около семи километров.

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

Доверяете ли вы этому принте…

Doc_: Сейчас сетевой принтер подключал к семерке, так эта жужалица спросила меня, доверяю ли я этому принтеру. Doc_: Нет, сука, не доверяю! Doc_: Месяц назад пятихатку на тонер у меня занял и не отдает!

Цитата с «Башорга».

Смешная, но я-то видел эту надпись и читал её полностью, в отличие от этого петросяна. Там объясняется, что сейчас Windows будет скачивать драйвер принтера с самого принтера (то есть внутри у него где-то хранится драйвер для Windows и принтер его может предоставить).

Вопрос состоит в том доверяю ли я этому устройству, так как с него сейчас мне в систему будут ставится какие-то файлы. Теоретически они могут быть вредоносными (трояны, вирусы и так далее).

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

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

Музей истории Симферополя

Граммофон (19.61КиБ)

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

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

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

Контур размагничивания

«Починил» телевизор в отеле. У меня в номере два телевизора, оба с кинескопом, один намагнитился — в этом случае на экране появляются различные цветовые пятна (в моём — малиновые по краям).

Как говорится «хозяину на заметку». Хотя телевизоры с кинескопом встречаются всё реже, тем не менее, встречаются. В каждом таком телевизоре есть специальным контур размагничивания. Чтобы он сработал, нужно выключить телевизор кнопкой на телевизоре, потом подождать минут 20, после чего можно включать обратно.

В моём случае, это полностью избавило телевизор от цветных пятен.

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

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

Чудеса с Гугл.Ридером

Почему-то Гугл.Ридер перестал читать мой RSS комментариев. Я ничего не менял, а он не читает. Попробовать удалить и добавить, ничего не вышло. Не понимаю в чём дело.

Добавлено позднее: неожиданно пришли комментарии. Правда не все. Видимо, Гугл лихорадит.

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

WebDAV

Пытаюсь настроить WebDAV, чтобы им можно было пользоваться на nginx. Пока не получилось. Модуль WebDAV из nginx не умеет обрабатывать OPTIONS и PROPFIND, из-за этого клиенты не видят листинг директории. Решение простое — дать nginx обрабатывать то, что он умеет, а OPTIONS и PROPFIND отпроксировать куда-то ещё.

Для этого я взял davserver — небольшой сервер, написанный на Пайтоне. У него два достоинства: он на Пайтоне и он есть в Debian-пакетах.

Выяснилось, что это плохая идея.

Во-первых, на PROPFIND что-то отдаётся, но это что-то клиент не понимает.

Во-вторых, оказалось, что когда формируется листинг PROPFIND, в качестве базового URL там используется имя хоста из параметров запуска (там у меня localhost), а не из заголовка «host» запроса. Это я починил, поправив код.

В-третьих (это выяснилось, когда я полез в исходники), сервер писали какие-то дикие люди и он мне однозначно изнутри не понравился. Я это использовать не хочу. Например, вот так они создают директорию:

try:
            os.system("mkdir '%s'" % path)
            self._log('mkcol: Created new collection %s' % path)
            return 201

Кажется, они даже не заморачиваются экранированием спецсимволов в path, правда я бегло смотрел.

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

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

«Парсер» студии Лебедева и thttpd

Сегодня потратил часть дня, чтобы выяснить, что Парсер не заработает с thttpd.

Вообще, мне очень нравится веб-сервер nginx, но, увы, nginx не поддерживает CGI, а Парсер работает либо так, либо как модуль Apache. Поэтому я решил взять какой-нибудь простой веб-сервер, который поддерживает CGI и поставить его позади nginx.

Что-то у меня с nginx в последнее время любовь как-то не складывается.

У меня Ubuntu 10.04, поэтому я всё поставил из пакетов, Парсер в том числе, пакет неофициальный, я его нашёл в разделе прислали пользователи.

После того как я всё настроил, ничего не заработало. Отладка через strace быстро показала, что Парсер падает. Я его перекомпилировал. Если будете перекомпилировать, вот мой рецепт.

Я поставил следующие пакеты (легко допускаю, что где-то поставил лишнего, так как ориентировался по названиям): libgmime2.1-dev libgmime-2.4-2 glibc-2.10-1 libgc1c2 bison.

В каталог /opt/pcre-8.12 я положил свежую версию PCRE, в /opt/pcre лежит скомпилированная версия. Строка компиляции получилась вот такая:

CPPFLAGS='-I/opt/pcre-8.12 -I/opt/pcre/include/' \
./configure --prefix=/opt/parser3/ --with-shared-gc --with-static-pcre=/opt/pcre
make
sudo make install

После того как я стал пользоваться собранным мною Парсером, что-то в браузер я получил, но всё было не то. Причём при запуске из консоли, я получал на экран результат работы скрипта.

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

Я создал небольшой shell-скрипт, в который накидал разных переменных окружения, необходимых по стандарту для CGI и подбором выяснил, что для Парсера критично наличие переменных GATEWAY_INTERFACE, SCRIPT_NAME, PATH_INFO и PATH_TRANSLATED. Вот небольшой пример:

if(cgi) {
                // few absolute obligatory
                const char* path_info=getenv("PATH_INFO");
                if(!path_info)
                        SAPI::die("CGI: illegal call (missing PATH_INFO)");
                const char* script_name=getenv("SCRIPT_NAME");
                if(!script_name)
                                SAPI::die("CGI: illegal call (missing SCRIPT_NAME)");
                // … ещё много кода …
        }

При помощи CGI, написанного на bash, я выгрузил все переменные окружения, которые предоставляет thttpd (у меня версия 2.25b), оказалось, что двух последних переменных в дампе нет. Причём в интернете эта проблема уже поднималась (правда без связи с Парсером) и была успешна разрешена авторами thttpd. Наверное в последней версии что-то сломали.

Добавлено: я что-то явно делаю не так. Я попробовал ещё сервер mini-httpd, там в changelog есть такая фраза: «Added PATH_INFO to CGI environment», но я опять же не вижу эту переменную в окружении. В исходниках так же упоминаются обе переменных «PATH_…».

Добавлено ещё позже: так, по коду выходит следующее: если mini-httpd или thttpd находит файл по URL на файловой системе сразу, то PATH-переменные не заполняется, но заполняется SCRIPT_NAME, если не находит, то алгоритм отрезает путь до первого слеша и кладёт орезанное в PATH_INFO, формируя PATH_TRANSLATED из этого пути, присоединяя к нему рабочий каталог.

При этом куда-то пропадает SCRIPT_NAME, в коде я ещё не нашёл куда и почему. Но, похоже, для Парсера mini-httpd и thttpd (у них один автор) не подойдут.

Чтобы понимать:

http://example.org/cgi-bin/test.cgi — формируется SCRIPT_NAME, но не PATH_INFO и PATH_TRANSLATED
http://example.org/cgi-bin/test.cgi/ — формируется PATH_INFO и PATH_TRANSLATED, но не SCRIPT_NAME

И ещё позднее: попробовал веб-серверы Boa, Bozohttpd и Cherokee. Парсер с ними не заработал, причина та же — нехватает переменных. Очень похоже, что Парсер сильно неправ в своей трактовке протокола CGI.

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

«Парсер» студии Лебедева и nginx

Смог запустить Парсер на nginx. Поставил FastCGI-сервер SimpleCGI, он принимает на вход FastCGI-запрос и запускает по нему CGI-программу. Написан на Перле, который я хорошо знаю, поэтому мне сразу видно как его можно настроить. Настройки nginx получились следующие:

server {
        listen 80;

        server_name  parser.internal;
        set $root /var/www/parser;
        root $root;

        location ~ \.(p|cgi)$ {
            include fastcgi_params;
            fastcgi_pass unix:/var/www/cgiwrap-dispatch.sock;
            fastcgi_param  SCRIPT_NAME  $fastcgi_script_name;
            fastcgi_param  PATH_INFO    $fastcgi_script_name;
            fastcgi_param  PATH_TRANSLATED $root$fastcgi_script_name;
            fastcgi_param  SCRIPT_FILENAME  $root$fastcgi_script_name;
        }
}

SimpleCGI после запуска создаёт файловый сокет «cgiwrap-dispatch.sock» к которому и обращается nginx.

Причём, что интересно, с SimpleCGI спокойно работает и Парсер из пакета, на который я жаловался, что он падает из-под thttpd.

Добавлено позже: если нужно указать путь до auto.p, то можно добавить «fastcgi_param CGI_PARSER_CONFIG путь/до/auto.p».

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

Заведения в Симферополе

На светлом столе лежат журнал «Юность» №5 за 1981 год с иллюстрацией деревьев и домиков и толстая книга «Детская Энциклопедия» в жёлтой обложке с силуэтом ребёнка.
Уютный уголок с белым стеллажом, заполненным книгами, деревянным столом, зелёным диваном с декоративными подушками и цветочными обоями на стене.
Старая книга М. Горького «Счетъ» с портретом автора на обложке лежит на столе рядом с раскрытой книгой и чеком.
Уютный интерьер кафе с кирпичной аркой, патинированными обоями, подвесными светильниками и портретом на стене; видна часть зала с круглыми столами и креслами.

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

Утром завтракали в «Горьком» — ресторанчике, посвящённом литературе и Горькому, интерьер заставлен советскими ещё книгами, стилизация отлично выдержана. Счёт приносят внутри книги (есть на снимках).

Прекрасно осознаю, кстати, где таятся недостатки города, но я там не бываю, к чему мне? Я же тут не живу, буду радоваться тому, что турист.

Выяснил сколько примерно стоит квартира. Однокомнатные продаются примерно за $36—50K, причём зависимость чуть не чёткая — метр стоит около $1K. Жаль, что не сходил в краеведческий музей, если приеду ещё раз, надо будет посетить.

Завтра уже улетаем, в середине дня.

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

Полтонны багажа

500кг (43.35КиБ)

Никогда не видели как выглядят багажные бирки для кучи сумок в полтонны весом? Я тоже не видел раньше, а в Симферополе увидел и сфотографировал. На фотографии можно примерно подсчитать сколько их там.

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

Стапанищев

Кстати, никто не знает, имеет ли значение правильность написания фамилии на билете на самолёт? У меня есть убеждённость, что имеет, иначе вообще какой смысл печатать на нём фамилии?

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

И вот в кассе фамилию на билете напечатали неверно. На билете было написано «Стапанищев», а не Степанищев.

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

Нужны ли были такие усилия?

Добавлено: похоже, беспокоился я зря, смотрите комментарии.

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

Почему водку пьют, отставив локоть

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

Анна-Лена Лаурен. «У них что-то с головой, у этих русских».

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

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

bo.lk

А домен bo.lk до сих пор свободен. Стоит 25000 шриланкийских рупий (плюс налог 12%), получается около $250. Не, покупать не буду, но имя хорошее.

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

Магия гитхаба

Прочувствовал магию «Гитхаба». Я сейчас дописываю один плагин для phpBB (это популярный движок форумов), в процессе написания нашёл ошибку в плагине automod (плагин, который нужен чтобы ставить другие плагины).

Поскольку automod выложен в git-репозитории на github, всё что нужно — зарегистрироваться, нажать кнопку «fork», склонировать репозиторий себе на машину, исправить ошибки, сделать commit/push и отослать pull request.

Авторы automod, когда увидят мой запрос, сделают merge с моей новой веткой и мои изменения помогут сделать мир лучше.

Очень просто и круто.

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

Алиас для /etc/init.d/… restart

Устал я писать каждый раз строки вида «sudo /etc/init.d/nginx restart» для перезапуска многочисленных серверов, поэтому сделал себе короткий алиас. Я бы не упомянул об этом, если бы не два отличия.

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

Вот что получилось (у меня это в .bashrc):

rst () { command sudo /etc/init.d/$@ restart; }

function _rst() {
    local cur

    cur=${COMP_WORDS[COMP_CWORD]}
    if [ 1 -eq ${COMP_CWORD} ]; then
        COMPREPLY=( $(compgen -f -- /etc/init.d/$cur | xargs -n1 basename -- ) )
    else
        COMPREPLY=()
    fi
}

complete -F _rst rst

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

← сюда туда →