С козулей из Ижевска

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

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

Купи козулю (91.20КиБ)

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

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

Комикс: круги

Давно комикс-стрипы не советовал. Новое-свежее, жижист с ником Как Всё Глупо начал рисовать комиксы, верх минимализма: одни круги и надписи. Мне нравится, рекомендую. Интересно, когда сюжеты кончатся?

Комикс «Круги» (2.87КиБ)

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

Генерируемый задний фон

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

10 PRINT CHR$(205.5+RND(1));: GOTO 10

Выводит вот такой фон (скриншот с «Командора 64», поэтому цвета такие):

Фон из слешей (27.66КиБ)

Для тех, кто не понимает этот архаичный язык, перепишу на Пайтоне:

import random; while 1: print random.choice(u'╱╲'),

и ПХП:

for(;;) flush(print '/\\'[mt_rand(0, 1)+.5]);

На «Хабре» статья пробегала, где автор пытался сделать то же при помощи CSS, не справился и сделал генерацию на серверной стороне — на PHP. Он высказывал мысль использовать для этого JS, но то ли не смог, то ли отбросил её по каким-то иным причинам.

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

Сначала результат (в левом верхнем углу фрагмент нормального размера):

Фон в виде лабиринта (31.46КиБ)

Теперь посмотрим код. Я убрал всё лишнее, подробности можно посмотреть в разделе «Храню»:

!function(c) {
    var ctx = document.getCSSCanvasContext ? 
        document.getCSSCanvasContext("2d", "maze", c.width, c.height):
        c.getContext("2d");

    ctx.font      = "10px monospace";
    ctx.fillStyle = '#36f';
    ctx.fillRect(0, 0, c.width, c.height);

    ctx.fillStyle = '#068';

    for (var y = 7, ly = c.height; y < ly; y += 8) {
        for (var x = -1, lx = c.width; x < lx; x+= 4) {
            ctx.fillText("/\\".charAt(Math.random() + .5), x, y);
        }
    }

    if (!document.mozSetImageElement && !document.getCSSCanvasContext) {
        document.getElementsByTagName('body')[0].style.backgroundImage='url(' + c.toDataURL("image/png") + ')';
    }

}(document.getElementById('maze'));

Внутрь функции у меня передаётся объект «канваса» (размером 99×96, подогнан под шрифт).

В первой строке проверяется наличие метода «getCSSCanvasContext», он работает только в браузерах, основанных на Вебките (Хром, Сафари) и позволяет напрямую использовать «канвас» для задника, нужно только в CSS указать идентификатор:

body { background: -webkit-canvas(maze); }

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

Связь «канваса» и задника для браузеров на «Геко» (ФайрФокса и менее известных) в Джаваскрипте не видна, она полностью на стороне CSS:

body { background: -moz-element(#maze); }

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

В последних строках я проверяют доступен ли метод для указания «-moz-element», нет ли метода для рисования «канвасом» прямо в задник, если нет, то перевожу картинку из «канваса» в dataURI и добавляю её в таком виде на фон тега BODY. Таким образом, этот код работает и для «Оперы» с «Эксплорером» (начиная с девятого).

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

Потрясающая история деревянной мыши

На «Хабре» статья появилась как некий Валентин Озеров создал компанию «Кликвуд» по производству деревянных мышей ручной работы. Статья называется «Деревянная мышь. История проекта» и читается на одном дыхании. Очень впечатлило.

Там весь процесс создания, от пластилинового прототипа до рабочего образца.

А вот что не впечатлило и расстроило, так это следующий кусок:

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

Итог: пытался списаться, наверное, с десятком возможных производителей кабельной продукции, никому не интересно возиться с моим заказом. Даже не спрашивали, какой километраж мне нужен. Итог: в России такой кабель не купить и не произвести. Грустно. Но мы не привыкли отступать.

Иду на Alibaba.com. Нахожу первого попавшегося китайского производителя, пишу письмо и буквально через несколько часов получаю ответ: сделаем для вас любой кабель! Я в шоке. Кидаю ему спецификацию, денег на доставку, и через неделю получаю образец. Вот это да! А я почти три месяца потерял, пытаюсь патриотично разместить заказ в России. Оказалось, что китайцы совершенно спокойно могут сделать мне кабель с внешним диаметром 2,5 мм.

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

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

Из документации по «Сфинксу»…

Из документации по поисковому движку «Сфинкс» (смешную фразу я выделил):

If this requirement is not met, different bad things can happen. For instance, Sphinx can crash with an internal assertion while indexing; or produce strange results when searching due to conflicting IDs. Also, a 1000-pound gorilla might eventually come out of your display and start throwing barrels at you. You’ve been warned.

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

Возраст объектива Кэнона

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

Возраст зашифрован в первых двух цифрах десятизначного серийного номера, который должен выглядеть так: ДД П ССССССС, где «ДД» — код даты, «П» — скорее всего номер партии, а «ССССССС» — уникальный номер объектива.

Вбейте в строку адреса браузера следующий код:

javascript:isNaN(n=prompt('Введите первые две цифры номера вашего объектива:')-61)||alert((n+=(n<6)*100)%2512+'/'+~~(2010+n/12))

нажмите «Enter», введите в появившееся окно первые две цифры с объектива, снова нажмите «Enter», получите дату изготовления.

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

Angry Spy

Что-то я ничего не понимаю. Зачем приложению «Angry Birds Roost» нужны следующие полномочия на моём смартфоне?

Требуются: встречи, контакты, удостоверение телефона, удостоверение владельца, съёмка фото и видео, службы определения местоположения, воспроизведение мультимедия, микрофон, службы данных, служба push-уведомлений, датчик движения и направления

Зачем это всё (разве что кроме «службы push-уведомлений») бесплатному агрегатору мусора про разъярённых птиц?

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

Разворот односвязного списка за O(n) (память — O(1)) на Гугл Гоу

Вчера друг подвозил меня до дома, я решил, пока в пробке, попрограмировать на «Гоу». Практики давненько не было, язык уже начинает забываться, не модули, это ерунда, а сами конструкции, вот что неприятно.

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

package main

import (
    "os"
    "bufio"
)

// тип для односвязного списка
type links struct {
    Next *links
    Value string
}

// вывод на печать односвязаного списка
func (chain *links) Print() {
    for chain != nil {
        os.Stdout.WriteString(chain.Value)

        chain = chain.Next
    }
}

// разворачиваем односвязный список за O(n)
func (chain *links) Reverse() *links {
    if chain == nil || chain.Next == nil {
        return chain
    }

    left, next := chain, chain.Next.Next
    chain = chain.Next
    left.Next = nil

    for {
        chain.Next = left

        if next == nil {
            break
        }

        left, chain, next = chain, next, next.Next
    }

    return chain
}

// Создаём список из чего-нибудь, умеющего выдавать по одной строке за раз
func CreateFromReader(readline func() *string) *links {
    var chain, start *links = nil, nil

    for {
        if line := readline(); line != nil {
            link := &links{ nil, *line }

            if chain == nil {
                chain, start = link, link
            } else {
                chain.Next, chain = link, link
            }

        } else {
            return start
        }
    }

    return nil
}

// Точка входа
func main() {
    if len(os.Args) < 2 {
        os.Exit(1)
    }

    f, err := os.OpenFile(os.Args[1], os.O_RDONLY, 0666)

    if err != nil {
        os.Exit(2)
    }

    defer f.Close()

    r := bufio.NewReader(f)

    CreateFromReader(
        func() (*string) {
            if line, e := r.ReadString('\n'); e == nil {
                return &line
            }

            return nil
        },
    ).Reverse().Print()
}

Список создаётся из файла, который нужно передать программе первым параметром. Вообще, вся реализация разворота — в методе Reverse класса links, остальное — заполнение структуры и вывод на печать. Оцените как мало надо кода, чтобы решить это задание.

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

Как вы подрались в первый раз?

Вспоминал недавно когда и при каких обстоятельствах в первый раз дрался.

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

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

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

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

А вы когда в первый раз подрались? Почему? Победили?

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

Современный миф о матери Терезе

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

Очень интересные Показания Арупа Чаттерджи (Aroup Chatterjee) перед комитетом по беатификации (канонизации) Матери Терезы в феврале 1998 года. Почитайте.

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

Казань ✈ Эль-Фуджайра ✈ Казань

C 30 декабря по 6 января будем с женой с ОАЭ, в Эль-Фуджайре, в отеле Iberotel Miramar Al Aqah Beach Resort 5★. 

Отель (81.94КиБ)

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

В итоге, до конца дня ошибку поправили и тур достался нам. Я так думаю, если бы не эта ошибка, то эти туры, скорее всего, были уже распроданы.

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

Исчезновение фамилий

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

Из газеты «Советская Чувашия».

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

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

Тем временем, у меня появились первые сведения о поколениях, которые могли родиться в 18-м веке (или в самом начале 19-го, точных дат ещё нет).

И ещё одно открытие — имя Ко́нон (мужское имя, переводится с древнегреческого как «трудящийся»). За отсутствием фамилий уже неясно родственник или просто упоминается рядом.

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

Польза Луркмора

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

Есть и от него польза!

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

Ошибка в Lubuntu 12.10 на Toshiba AC100

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

"Couldn't find android boot partition on /dev/mmcblk0" and /etc/initramfs/post-update.d//flash-kernel exited with return code 1

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

sudo apt-get install abootimg

И всё заработает.

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

Скрипт для перевода даты из старого стиля в новый

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

function Jul2Greg(day, month, year) {
    // «сахар» для создания даты
    var d = function(day, month, year) {
        return new Date(year, month - 1, day, 12, 12, 12);
    }

    var date = d(day, month, year);

    // коррекция дней исходя из года
    var correction = date <= d(28, 2, 1700) ? 10 : 0 | (year / 100 - 17 + 11);

    // корректируем левый конец диапазона
    if (year % 100 == 0 && month < 3) {
        correction--;
    }

    return d(day + correction, month, year);
}

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

Горячие клавиши на Toshiba AC100 в Ubuntu

В Лубунте (Lubuntu), которой я недавно ставил на Тошибу жены, почему-то не настроены горячие клавиши, идущие на смартбуке верхним рядом. Написал конфиг для программы input-event-daemon, может пригодится кому-нибудь. Дополнительно нужно поставить пакеты xdotool и wmctrl, остальное уже в Лубунте есть:

[Global]
# следим за событиями клавиатуры
listen = /dev/input/event0
# События крышки
listen = /dev/input/event4

[Keys]
# уменьшение яркости
META + F6 = echo $((`cat /sys/class/backlight/pwm-backlight/brightness` - 10)) > /sys/class/backlight/pwm-backlight/brightness
# увеличение яркости
META + F7 = echo $((`cat /sys/class/backlight/pwm-backlight/brightness` + 10)) > /sys/class/backlight/pwm-backlight/brightness
# включение/отключение радиомодулей (вайфай, блютуз)
META + F8 = rfkill $(rfkill list | fgrep -q yes && echo un)block all
# включение/выключение звука
META + F12 = a=$(amixer sget Master|fgrep -q '[off]'&&echo un)mute; for m in Master Speaker Headphone; do amixer -q sset "$m" $a; done
# показать/скрыть рабочий стол
MENU = wmctrl -k $(wmctrl -m|fgrep -q OFF&&echo on||echo off)
# уменьшить громкость
META + F10 = v=$((`amixer get Master|awk -F[\[%] '/[0-9]+%/ {print $2; exit}'`-10)); [ $v -lt 0 ] && v=0;amixer set Master $v%
# увеличить громкость
META + F11 = v=$((`amixer get Master|awk -F[\[%] '/[0-9]+%/ {print $2; exit}'`+10)); [ $v -gt 100 ] && v=100;amixer set Master $v%
# клавиша поиска теперь вызывает искалку
SEARCH = catfish &
# скриншот экрана на рабочий стол
META + SYSRQ = scrot 'screen-%Y-%m-%d_%s.png' -e 'chown "'$SUDO_USER'" "$f"; mv "$f" "/home/'$SUDO_USER'/Desktop"'
# Клавиша Delete, как в Маке
META + BACKSPACE = xdotool key Delete

[Switches]
# Сброс звуковой карты на подъём крышки
LID:0 =  alsaucm -c tegraalc5632 reset

В качестве клавиши «Fn» выступает клавиша с «домиком», именно она опознаётся программой как «META». Последняя строка добавлена, что исправить глюк — у меня иногда после того, как устройство просыпается, звуковая плата из спячки не выходит.

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

Конец сарая

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

Чаще всего это старая машина, шкаф или дом.

Наверное в фильмах это выглядит как отличный способ снять стресс или выпустить пар.

Как-то, когда я учился в школе, моей бабушке, которая жила в частном секторе моего родного города (деревня Письмянка внутри города Лениногорска), понадобилось разломать старый сарайчик около дома. Я часто помогал бабушке по огороду и дому, тут тоже вызвался помочь.

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

В общем, врут всё в кино.

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

«Чистый веб» Яндекса

У «Яндекса» как-то незаметно проект «Чистый веб» вышел. Ещё я в этом проекте участвовал. Дописывал плагин для phpBB, правда тот, который там дают скачать (зачем-то вместе с phpBB внутри) другой совсем, переписан под PHP 4.1 и у меня смутные воспоминания, что я его под вторую версию писал, а этот под третью.

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

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

Ещё один пульт GAL

GAL LM-1000L (131.86КиБ)

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

Интересно, кто и для чего их покупает. Такие размеры — перебор, я думаю.

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

Плохо живём?

Напомним, правительство решило получить дополнительные 200 млрд рублей в казну путем введения налога на роскошь. По мнению Минэкономразвития богачами можно считать владельцев домов с площадью более 1000 квадратных метров и автомобилей мощностью более 250 лошадиных сил (благо, такую информацию можно найти в реестрах налоговиков).

По мнению главы Минэкономразвития Эльвиры Набиуллиной, под этот налог не должно попасть более 10% населения.

Пишет «Комсомольская правда» о налоге на роскошь. Я читаю это так: примерно каждый десятый в России имеет квартиру более 1000 м² или автомобиль мощностью более 250 лошадиных сил.

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

← сюда туда →