&^ в Google Go

Отличная иллюстрация того как важны мелочи в документации…

Читал чужой исходный код на «Гоу» и обнаружил необычную конструкцию:

v &^= 1 >> n

Почесал голову, не понял что это и пошёл читать документацию. Выяснилось, что эту конструкцию я когда-то упустил при чтении документации и означает она «bit clear (and not)», то есть является противополжностью „|=“, не ставит бит, а очищает его. Более того, есть ещё унарная операция «^», которая инвертирует все биты в числе (соблюдая размер его типа), вот как они работают:

package main

func main() {
    var test byte = 250

    println(test) // 250 (11111010)
    
    test = ^test
    println(test) // 5 (00000101)

    test &^= 4   //    (00000100)
    println(test) // 1 (00000001)
}

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

Алгоритм линейного счётчика на Google Go (golang)

Не смог отказать себе в удовольствии и попрактиковаться в «Гоу», написал и выложил на Гитхаб реализацию алгоритма линейного счётчика на Гугл Гоу. Значения, которые надо подсчитать поступают на стандартный вход, есть один параметр командной строки — «size», позволяющий задать размер вектора в битах (по-умолчанию — 10000).

Подсчёт 1 000 000 значений (8.81КиБ)

Подсчёт на моём ноуте одного миллиона уникальных значений занимает примерно 6,5 секунд. Погрешность с вектором длиной 100 тысяч бит (≈3КиБ) — 7,6%.

Чтобы скомпилировать программу новым (версии 1 и выше) компилятором «Гоу», нужно запустить следующую команду:

go build linear-counter.go

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

Алгоритм линейного счётчика: десять бит в одном бите

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

Упомянул его в разговоре знакомый математик К.Н., за что ему большое спасибо! По этому алгоритму нашлась замечательная статья «Линейный счётчик», с понятным объяснением, добавить к которому нечего, но я всё-таки приведу у себя его краткое описание.

Сначала для чего алгоритм применяется и чем он замечателен.

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

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

Но есть способ лучше! Алгоритм линейного счётчика.

Оказывается, если взять вектор в 1000 бит и 1000 раз установливать в нём в единицу случайный (с равномерным распределением) бит (некоторые биты будут установлены в единицу несколько раз), то нулей останется примерно около 370. Эта оценка получается из 1/e ≈ 0,36787944117… ≈ 0,37, подробнее есть в другой статье на том же сайте.

Таким образом, если мы встречаем битовый вектор длины n, в котором примерно 63% (100 − 0,37 × 100 = 63) единиц, то над этим вектором было произведено n операций установки бита в единицу, при условии, что биты выбирались случайно и равномерно.

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

Демо алгоритма линейного счётчика (10.68КиБ)

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

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

Список доменов, запрещённых к регистрации в зоне «.рф»

Оказывается существует список доменов, которые запрещено регистрировать в зоне «.рф». Полюбопытствуйте, расширьте свой словарный запас! Старательные люди собирали, там более четырёх тысяч доменов. Например, «взятьзамягкоеместо.рф» или «похабник.рф».

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

curl -so- http://flisti.ru/stop-list.txt |
iconv -f cp1251 | awk -F'[\t\.]' 'BEGIN {srand()} $3 {print rand(), $3}' |
sort -n | awk '{print $2; exit}' | tee >(cut -c1 | tr '[:lower:]' '[:upper:]') |
sed -n '1s/^.//;1h;2p;2g;2p' | tr -d '\n' ; echo '!'

Или можно так:

curl -so- http://flisti.ru/stop-list.txt | iconv -f cp1251 |
awk 'BEGIN {srand()} {print rand()"."$2}' |
sort -nt. | head -1 | cut -f2 -d. |
tee >(cut -c1 | tr '[:lower:]' '[:upper:]') | tail -r | tr -d '\n' | xargs -I? echo ?! | cut -c1,3-

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

curl -so- http://flisti.ru/stop-list.txt |
iconv -f cp1251 | awk -F'[\t\.]' 'BEGIN {srand()} $3 {print rand(), $3}' |
sort -n | awk '{print $2"!"; exit}'

Вариант для «баша», но без awk:

curl -so- http://flisti.ru/stop-list.txt |
iconv -f cp1251 | grep -Eo '\s.+рф' | cat -b |
tee >(echo $((`wc -l`*$RANDOM/32768))) | tail -r |
grep -w `head -1` | cut -f3 | cut -d. -f1 | xargs -I? echo ?!

Почему-то мне нравится программировать на «баше», остановиться не могу…

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

Финализированные конструкторы под разными именами

Вчера вечером подумалось, что если в PHP сделать следующее, будет ошибка или нет:

class A {
    final public function a() {
        echo 1;
    }
}

class B extends A {
    public function b() {
        echo 2;
    }
}

$o = new B();

Интересно тут то, что не сразу видно в чём вообще загвоздка. Ну или я бы увидел не сразу, думаю, если бы сам этот пример не придумал. Кажется, все уже отвыкли в PHP от «старых» конструкторов, где конструктором считается метод, имя которого совпадает с именем класса (если нет метода «__construct»).

От осознания этого факта дополнительно отвлекают ничего незначащие имена классов и методов.

Проблема же в том, что в первом классе конструктор финализирован, его дальше переопределять нельзя. Но у второго класса имя конструктора другое. Вот и вопрос — что будет? От PHP можно чего угодно ожидать.

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

Fatal error: Cannot override final A::a() with B::b() in test.php on line 12

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

Всякая мелочь одним постом-10

На сайте «Антропогенез» — разбор ошибок в лекции «Оценка теории эволюции» богослова Алексея Ильича Осипова на канале «Культура» (шла 26 апреля 2012 года). Очень интересный обзор, я прояснил для себя массу мутных моментов.

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

В ЖЖ «Планетарум» статья, показавшаяся мне несколько несвязаной, но очень интересной об ошибках соединения, персонально для меня интересно, что я ошибки в тестах из статьи не совершил, а кроме того, в статье есть хорошее объяснение парадокса Монти Холла, почитайте.

Некоторые врачи совсем офонарели — в качестве лечения назначают гомеопатию, рассказ от одного жижиста, жене и сыну которого назначили «Оциллококцинум».

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

День зависимости от интернета

С 29-го декабря по утро шестрого января, пока мы были с женой в ОАЭ, провёл без интернета. Ни одного сайта, твита, сообщения в аське или скайпе, почтового сообщения, ничего. Никакой необычайной тяги, например, проверить почту, за этот срок не ощутил. Было немного неудобно — ни погоду посмотреть, ни прочитать что-нибудь об Эмиратах, а так, в целом, никакой «зависимости от интернета» у себя не почувствовал.

Правда, по приезде ощутил неудобство: пришлось просмотреть тонну почты, пролистать кучу статей на «Хабре», прочитать накопившуюся РСС-ленту — профессия обязывает быть в курсе определённых вещей.

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

Американские логотипы в ОАЭ

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

Я, конечно, понимаю — меня куча айтишников читает, людей, которым кажется, что все вокруг знают или должны знать английский язык. Кстати, айтишники — это те же люди, 90% которых, сталкиваясь каждый день со словами «procedure», «hotkeys» и «character», не в состоянии правильно их прочитать.

Я сегодня из ОАЭ вернулся, привёз свежий аргумент. Эмираты — страна, где очень многие знают английский (часто на уровне «мой английский две кровать», но всё же), большинство надписей продублировано и на английском тоже. Тем не менее, куча компаний почесалась локализовать свои логотипы. Извините за качество, всё-таки посещал я страну не ради логотипов, поэтому снимал их как получится.

Фасад здания Starbucks с вывеской на арабском и английском языках, зелёным логотипом и рекламным баннером справа; видны вход, окна, зонты и автомобили на переднем плане.
Заправка ADNOC Oasis с рестораном Subway, белая машина на переднем плане, скалистый склон на заднем плане.
Улица с движущимися автомобилями и зданиями, включая красное здание с арабской надписью на вывеске.
Фасад ресторана KFC с красной вывеской, на которой изображён полковник Сандерс и арабская надпись «KFC
Вход в ресторан McDonald's с вывеской на английском и арабском языках, меню на экранах и посетители у кассы

Смотрите, «Старбакс», «Сабвей», «Пицца Хат», «КФЦ», «МакДональдс» перевели свои названия на арабский и никому это странным не кажется. У нас же, после 90-х, когда на рынке была тьма-тьмущая всяких непереведённых «сникерсов» люди считают, логотипы и названия локализовывать не нужно.

Кстати, я знаю девушку, которая многие годы в магазинах спрашивала «Зуп» («7up») и её понимали.

С наступившим Новым годом вас!

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

Плохо живём?

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

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

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

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

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

GAL LM-1000L (131.86КиБ)

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

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

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

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

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

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

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

Конец сарая

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

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

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

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

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

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

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

Горячие клавиши на 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 комментария

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

Часто перевожу даты из  календаря в григорианский (со старого стиля на новый), так как занимаюсь исследованием своих предков. Устал использовать для этого всякие веб-сервисы, написал по-быстрому 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 комментария

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Отель (81.94КиБ)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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