&^ в Google Go
Отличная иллюстрация того как важны мелочи в документации…
Читал чужой исходный код на «Гоу» и обнаружил необычную конструкцию:
v &^= 1 >> nПочесал голову, не понял что это и пошёл читать документацию. Выяснилось, что эту конструкцию я
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», позволяющий задать размер вектора в битах

Подсчёт на моём ноуте одного миллиона уникальных значений занимает примерно 6,5 секунд. Погрешность с вектором длиной 100 тысяч бит (≈3КиБ) — 7,6%.
Чтобы скомпилировать программу новым (версии 1 и выше) компилятором «Гоу», нужно запустить следующую команду:
go build linear-counter.goАлгоритм линейного счётчика: десять бит в одном бите
Простите за «жёлтый» заголовок, но алгоритм, если не разобраться, похож на магию и мне очень хотелось бы привлечь ваше внимание к нему. Впрочем, я детально в нём разобрался, но всё равно радуюсь, как ребёнок.
Упомянул его в разговоре знакомый математик К.Н., за что ему большое спасибо! По этому алгоритму нашлась замечательная статья «Линейный счётчик», с понятным объяснением, добавить к которому нечего, но я
Сначала для чего алгоритм применяется и чем он замечателен.
Представьте, что вам нужно посчитать количество уникальных значений в огромном объёме данных, если вам это нужно сделать точно, то выбора особого нет — нужно будет сохранять все поступающие значения в память и проверять, не встретили ли мы уже их. Если уникальных значений очень много, это может съесть всю нашу память, но выбора, повторяю нет.
Если же вам годится и приблизительная оценка, можно использовать хеширующую функцию, тогда
Но есть способ лучше! Алгоритм линейного счётчика.
Оказывается, если взять вектор в 1000 бит и 1000 раз установливать в нём в единицу случайный (с равномерным распределением) бит (некоторые биты будут установлены в единицу несколько раз), то нулей останется примерно около 370. Эта оценка получается из 1/e ≈ 0,36787944117… ≈ 0,37, подробнее есть в другой статье на том же сайте.
Таким образом, если мы встречаем битовый вектор длины n, в котором примерно 63% (100 − 0,37 × 100 = 63) единиц, то над этим вектором было произведено n операций установки бита в единицу, при условии, что биты выбирались случайно и равномерно.
Отсюда, если взять битовый вектор достаточной длины, хешировать входные значения

Хорошо это работает только на больших числах, я для наглядности сделал небольшое демо работы алгоритма линейного счётчика, там пятьдесят входных значений и вектор размером в 30 бит. Так как чисел немного, то и результаты иногда скачут сильно, но на миллионах значений погрешность выравнивается.
Список доменов, запрещённых к регистрации в зоне «.рф»
Оказывается существует список доменов, которые запрещено регистрировать в зоне «.рф». Полюбопытствуйте, расширьте свой словарный запас! Старательные люди собирали, там более четырёх тысяч доменов. Например, «взятьзамягкоеместо.рф» или «похабник.рф».
Вот вам ругающийся однострочник на «баше», чтобы учить каждый день новое слово:
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 ?!Финализированные конструкторы под разными именами
Вчера вечером подумалось, что если в 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
Всякая мелочь одним постом-10
На сайте «Антропогенез» — разбор ошибок в лекции «Оценка теории эволюции» богослова Алексея Ильича Осипова на канале «Культура» (шла 26 апреля 2012 года). Очень интересный обзор, я прояснил для себя массу мутных моментов.
Там же очень интересный материал, связанный с предыдущим «13 мифов об эволюции человека».
В ЖЖ «Планетарум» статья, показавшаяся мне несколько несвязаной, но очень интересной об ошибках соединения, персонально для меня интересно, что я ошибки в тестах из статьи не совершил, а кроме того, в статье есть хорошее объяснение парадокса Монти Холла, почитайте.
Некоторые врачи совсем офонарели — в качестве лечения назначают гомеопатию, рассказ от одного жижиста, жене и сыну которого назначили «Оциллококцинум».
День зависимости от интернета
Правда, по приезде ощутил неудобство: пришлось просмотреть тонну почты, пролистать кучу статей на «Хабре», прочитать накопившуюся
Американские логотипы в ОАЭ
Я уже не раз, не два и не три рассказывал о своей точке зрения на написание иностранных логотипов — что они должны писаться на местном языке.
Я, конечно, понимаю — меня куча айтишников читает, людей, которым кажется, что все вокруг знают или должны знать английский язык. Кстати, айтишники — это те же люди, 90% которых, сталкиваясь каждый день со словами «procedure», «hotkeys» и «character», не в состоянии правильно их прочитать.
Я сегодня из ОАЭ вернулся, привёз свежий аргумент. Эмираты — страна, где очень многие знают английский (часто на уровне «мой английский две кровать», но всё же), большинство надписей продублировано и на английском тоже. Тем не менее, куча компаний почесалась локализовать свои логотипы. Извините за качество,





Смотрите, «Старбакс», «Сабвей», «Пицца Хат», «КФЦ», «МакДональдс» перевели свои названия на арабский и никому это странным не кажется. У нас же, после
Кстати, я знаю девушку, которая многие годы в магазинах спрашивала «Зуп» («7up») и её понимали.
С наступившим Новым годом вас!
Плохо живём?
Напомним, правительство решило получить дополнительные 200 млрд рублей в казну путем введения налога на роскошь. По мнению Минэкономразвития богачами можно считать владельцев домов с площадью более 1000 квадратных метров и автомобилей мощностью более 250 лошадиных сил (благо, такую информацию можно найти в реестрах налоговиков).
По мнению главы Минэкономразвития Эльвиры Набиуллиной, под этот налог не должно попасть более 10% населения.
Пишет «Комсомольская правда» о налоге на роскошь. Я читаю это так: примерно каждый десятый в России имеет квартиру более 1000 м² или автомобиль мощностью более 250 лошадиных сил.
Ещё один пульт GAL

Фирма «Гал» не перестаёт удивлять, я пару лет назад уже фотографировал их пульт. Я нашёл на одном из сайтов размеры этого, вроде они как у предыдущего, но чисто визуально мне этот показался гораздо больше.
Интересно, кто и для чего их покупает. Такие размеры — перебор, я думаю.
«Чистый веб» Яндекса
У «Яндекса»
Остался ли там
Конец сарая
Посматривая сегодня за едой в экран ноутбука на пилотную серию «Американской истории ужасов», там как раз шла сцена как два подростка битами разбивали старинный дом, вспомнил, что в разговорах с друзьями и приятелями частенько всплывает одна и та же тема — об их желании битой или кувалдой
Чаще всего это старая машина, шкаф или дом.
Наверное в фильмах это выглядит как отличный способ снять стресс или выпустить пар.
Мне дали старый тупой увесистый топор и я пошёл крушить сарайку. Вот что я вам скажу, ребята. Первую пару минут это даже
В общем, врут всё в кино.
Горячие клавиши на Toshiba AC100 в Ubuntu
В Лубунте (Lubuntu), которой я недавно ставил на Тошибу жены,
[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». Последняя строка добавлена, что исправить глюк — у меня иногда после того, как устройство просыпается, звуковая плата из спячки не выходит.
Скрипт для перевода даты из старого стиля в новый
Часто перевожу даты из календаря в григорианский (со старого стиля на новый), так как занимаюсь исследованием своих предков. Устал использовать для этого всякие
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);
}Ошибка в Lubuntu 12.10 на Toshiba AC100
Я сегодня Линукс Лубунту поставил на Тошибу
"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И всё заработает.
Польза Луркмора
Я тут внезапно обнаружил, ребята, на «Луркморе» прекрасные статьи по физике, которые коротко и понятно (хотя с несколько дебильными шуточками, но зато так пугливых меньше тошнит от науки) объясняют теорию струн, теорию относительности и квантовую механику. На том уровне, на котором неподготовленный читатель ещё сможет
Есть и от него польза!
Исчезновение фамилий
Поэтому в 1888 году был опубликован специальный указ Сената, гласивший: «…Как обнаруживает практика, и между лицами, рожденными в законном браке, встречается много лиц, не имеющих фамилий, то есть носящих так называемые фамилии по отчеству, что вызывает существенные недоразумения и даже иногда злоупотребления… Именоваться определенной фамилией составляет не только право, но и обязанность всякого полноправного лица, и означение фамилии на некоторых документах требуется самим законом.»
Из газеты «Советская Чувашия».
Я
Я даже
Тем временем, у меня появились первые сведения о поколениях, которые могли родиться
И ещё одно открытие — имя Ко́нон (мужское имя, переводится с древнегреческого как «трудящийся»). За отсутствием фамилий уже неясно родственник или просто упоминается рядом.
Казань ✈ Эль-Фуджайра ✈ Казань
C 30 декабря по 6 января будем с женой с ОАЭ,

Добавлено позднее: Кстати, нам сильно повезло с этим туром, как оказалось. Когда менеджер, подбиравшая нам тур (спасибо ей огромное за упорство) нашла это предложение для нас, оказалось, что обратных билетов на нужную дату нет. Она догадалась заглянуть
В итоге, до конца дня ошибку поправили и тур достался нам. Я так думаю, если бы не эта ошибка, то эти туры, скорее всего, были уже распроданы.
Современный миф о матери Терезе
Много лет меня тревожило несовпадение слов Матери Терезы и ее дел, и некоторые факты из этого ряда я сейчас представлю. Мать Тереза говорила много тысяч раз, что она «подбирала» людей на улицах Калькутты. Она подробно остановилась на этом в своей Нобелевской речи. Но ее орден никогда не «подбирал» отверженных с улиц Калькутты. Орден — не «скорая помощь» для беднейших из бедных. Если вы сообщите в Калигат об умирающем нищем, вам сухо порекомендуют позвонить 102 (Калькуттская служба «скорой помощи»), чтобы их машина доставила умирающего в Калигат.
Очень интересные Показания Арупа Чаттерджи (Aroup Chatterjee) перед комитетом по беатификации (канонизации) Матери Терезы в феврале 1998 года. Почитайте.
Как вы подрались в первый раз?
Вспоминал недавно когда и при каких обстоятельствах в первый раз дрался.
Помню смутно, но, кажется, это было в начальных классах, что послужило поводом не знаю, мало ли поводов для драки в таком возрасте? Помню, что мальчик был из моего класса, чёрноволосый татарин, лицо хорошо помню, а имя — нет. Запомнилось, что дрались у раздевалки, в моей школе №7 (это в Лениногорске, где я жил всё детство), на первом этаже. Помню были зрители, тоже из класса, кто — не помню.
Хорошо помню, что драку я проиграл, запомнилась ещё раковина,
Ещё
Больше ничего и не вспоминается. На уровне
А вы когда в первый раз подрались? Почему? Победили?