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

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

Генерируемый задний фон
Я
10 PRINT CHR$(205.5+RND(1));: GOTO 10Выводит вот такой фон (скриншот с «Командора 64», поэтому цвета такие):

Для тех, кто не понимает этот архаичный язык, перепишу на Пайтоне:
import random; while 1: print random.choice(u'╱╲'),и ПХП:
for(;;) flush(print '/\\'[mt_rand(0, 1)+.5]);На «Хабре» статья пробегала, где автор пытался сделать то же при помощи CSS, не справился и сделал генерацию на серверной стороне — на PHP. Он высказывал мысль использовать для этого JS, но то ли не смог, то ли отбросил её
В общем, решил я попробовать сделать это на стороне клиента, на «канвасе», заодно посмотреть конструкции, которые позволяют ставить «канвас» в качестве задника, давно руки чесались.
Сначала результат (в левом верхнем углу фрагмент нормального размера):

Теперь посмотрим код. Я убрал всё лишнее, подробности можно посмотреть в разделе «Храню»:
!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» — идентификатор моего «канваса». Делать больше ничего не нужно, любой элемент с этим «айди» размножится в качестве фона.
В последних строках я проверяют доступен ли метод для указания «-
Потрясающая история деревянной мыши
На «Хабре» статья появилась как некий Валентин Озеров создал компанию «Кликвуд» по производству деревянных мышей ручной работы. Статья называется «Деревянная мышь. История проекта» и читается на одном дыхании. Очень впечатлило.
Там весь процесс создания, от пластилинового прототипа до рабочего образца.
А вот что не впечатлило и расстроило, так это следующий кусок:
Порой кажется, что при создании изделия кабель — самая несущественная часть изделия. Чего проще — купить в магазине нужное количество кабеля и распаять его. Плевое дело. Но, увы, не у нас в России. Порой кажется, что у нас промышленность уже не приспособлена делать ничего сложнее чугунных утюгов. Попытки найти кабель вылились в трехнедельные поиски и перетряхивание ассортимента абсолютно всех производителей российской кабельной продукции…
Итог: пытался списаться, наверное, с десятком возможных производителей кабельной продукции, никому не интересно возиться с моим заказом. Даже не спрашивали, какой километраж мне нужен. Итог: в России такой кабель не купить и не произвести. Грустно. Но мы не привыкли отступать.
Иду на Alibaba.com. Нахожу первого попавшегося китайского производителя, пишу письмо и буквально через несколько часов получаю ответ: сделаем для вас любой кабель! Я в шоке. Кидаю ему спецификацию, денег на доставку, и через неделю получаю образец. Вот это да! А я почти три месяца потерял, пытаюсь патриотично разместить заказ в России. Оказалось, что китайцы совершенно спокойно могут сделать мне кабель с внешним диаметром 2,5 мм.
Китайцы в кратчайшие сроки сделали ему кабель по его спецификации, прислали несколько образцов, довели кабель до ума. В России даже не попытались прикинуть выгодно ли будет этим заняться. Выводы сделайте сами.
Из документации по «Сфинксу»…
Из документации по поисковому движку «Сфинкс» (смешную фразу я выделил):
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.
Возраст объектива Кэнона
Возраст зашифрован в первых двух цифрах десятизначного серийного номера, который должен выглядеть так: ДД П ССССССС, где «ДД» — код даты, «П» — скорее всего номер партии, а «ССССССС» — уникальный номер объектива.
Вбейте в строку адреса браузера следующий код:
javascript:isNaN(n=prompt('Введите первые две цифры номера вашего объектива:')-61)||alert((n+=(n<6)*100)%2512+'/'+~~(2010+n/12))нажмите «Enter», введите в появившееся окно первые две цифры с объектива, снова нажмите «Enter», получите дату изготовления.
Angry Spy
Требуются: встречи, контакты, удостоверение телефона, удостоверение владельца, съёмка фото и видео, службы определения местоположения, воспроизведение мультимедия, микрофон, службы данных, служба
push-уведомлений, датчик движения и направления
Зачем это всё (разве что кроме «службы
Разворот односвязного списка за 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, остальное — заполнение структуры и вывод на печать. Оцените как мало надо кода, чтобы решить это задание.
Как вы подрались в первый раз?
Вспоминал недавно когда и при каких обстоятельствах в первый раз дрался.
Помню смутно, но, кажется, это было в начальных классах, что послужило поводом не знаю, мало ли поводов для драки в таком возрасте? Помню, что мальчик был из моего класса, чёрноволосый татарин, лицо хорошо помню, а имя — нет. Запомнилось, что дрались у раздевалки, в моей школе №7 (это в Лениногорске, где я жил всё детство), на первом этаже. Помню были зрители, тоже из класса, кто — не помню.
Хорошо помню, что драку я проиграл, запомнилась ещё раковина,
Ещё
Больше ничего и не вспоминается. На уровне
А вы когда в первый раз подрались? Почему? Победили?
Современный миф о матери Терезе
Много лет меня тревожило несовпадение слов Матери Терезы и ее дел, и некоторые факты из этого ряда я сейчас представлю. Мать Тереза говорила много тысяч раз, что она «подбирала» людей на улицах Калькутты. Она подробно остановилась на этом в своей Нобелевской речи. Но ее орден никогда не «подбирал» отверженных с улиц Калькутты. Орден — не «скорая помощь» для беднейших из бедных. Если вы сообщите в Калигат об умирающем нищем, вам сухо порекомендуют позвонить 102 (Калькуттская служба «скорой помощи»), чтобы их машина доставила умирающего в Калигат.
Очень интересные Показания Арупа Чаттерджи (Aroup Chatterjee) перед комитетом по беатификации (канонизации) Матери Терезы в феврале 1998 года. Почитайте.
Казань ✈ Эль-Фуджайра ✈ Казань
C 30 декабря по 6 января будем с женой с ОАЭ,

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

Фирма «Гал» не перестаёт удивлять, я пару лет назад уже фотографировал их пульт. Я нашёл на одном из сайтов размеры этого, вроде они как у предыдущего, но чисто визуально мне этот показался гораздо больше.
Интересно, кто и для чего их покупает. Такие размеры — перебор, я думаю.
Плохо живём?
Напомним, правительство решило получить дополнительные 200 млрд рублей в казну путем введения налога на роскошь. По мнению Минэкономразвития богачами можно считать владельцев домов с площадью более 1000 квадратных метров и автомобилей мощностью более 250 лошадиных сил (благо, такую информацию можно найти в реестрах налоговиков).
По мнению главы Минэкономразвития Эльвиры Набиуллиной, под этот налог не должно попасть более 10% населения.
Пишет «Комсомольская правда» о налоге на роскошь. Я читаю это так: примерно каждый десятый в России имеет квартиру более 1000 м² или автомобиль мощностью более 250 лошадиных сил.