Оказывается, в «Википедии» есть раздел на старославянском с пятью сотнями страниц:
Для корректного отображения старославянской азбуки предлагается поставить сторонний шрифт.
Интересно, что, несмотря на древность языка (?-? века), читается и понимается он вполне неплохо. Хотя, вряд ли это в точности тот язык — ведь статьи писались уже в наше время и под влиянием церковнославянского, который хоть и похож, но гораздо современнее.
Печальные новости — Яндекс закрыл загрузку файлов на «Народ.Диск» в пользу «Яндекс.Диска». Разница между ними в том, что первый был файлообменником, а второй — облачное хранилище. Теперь всё место ограничено 20 гигабайтами, а если не приглашать друзей — десятью. Очень жаль, на мой взгляд, «Народ» был единственным вменяемым местом для хранения больших файлов.
Читал на «хабре» про алгоритм sleepsort и благополучно забыл про него. Сегодня решил посмотреть, как его можно реализовать на C#.
Первой идеей было использовать Parallel.ForEach, но, как выяснилось, количество активных потоков в нём регулируется количеством ядер процессора и фазой Луны — стартуют они не одновременно, а ждут завершения предыдущих. Поэтому сделал через Thread:
using System;
using System.Threading;
class SleepSort
{
static void ThreadWorker(object number)
{
Thread.Sleep(100 * (int)number);
Console.WriteLine(number);
}
static public void Sort(int[] numbers)
{
foreach (int number in numbers)
{
new Thread(ThreadWorker).Start(number);
}
}
}
class Program
{
static void Main()
{
SleepSort.Sort(new int[] { 7, 9, 8, 10, 6, 5, 1, 3, 2, 4 });
Console.ReadKey(true);
}
}
Умножение на 100 при задержке сделано неспроста — точности при отдельных миллисекундах не получается и потоки начинают завершаться в абы каком порядке. Конечно, практического применения у алгоритма нет, но выгядит весело =)
А вы знали, что лишние подсказки из полей ввода с автодополнением можно удалить нажатием Delete? Я не знал. Схожее чувство было, когда я узнал что в «проводнике» Windows можно перейти к файлу быстро напечатав первые буквы его названия.
Обидно, что сейчас вместо идеи «есть много способов сделать это» операционные системы потихоньку переходят к максимальному упрощению — всё-таки «интуитивный» и «удобный» далеко не всегда значат одно и то же. Например, клавиатура в устройствах на iOS полностью интуитивная, клавиатура Swype для Android — нет. Но если потратить время на чтение инструкции, вторая будет намного удобнее и быстрее.
В Windows XP функция Beep пищала системным динамиком, но в «Семёрке» её поведение изменили, теперь звук перенаправляется на звуковую карту, что совсем не так весело.
Как выяснилось, пищать спикером всё ещё можно, но делать это придется напрямую (по ссылке пример на C#). Вот, если кому надо, то же самое, но на Delphi:
function Inp32(PortAdr: word): byte; stdcall; external 'inpout32.dll';
function Out32(PortAdr: word; Data: byte): byte; stdcall; external 'inpout32.dll';
procedure MyBeep(tone, duration: integer);
var
n,m: integer;
begin
if tone <> 0 then
begin
n := 1193180 div tone;
Out32($43,182);
Out32($42,n and $FF);
Out32($42,(n shr 8) and $FF);
m := Inp32($61);
Out32($61,m or $03);
end;
Sleep(duration);
m := Inp32($61);
Out32($61,m and $FC);
end;
Теперь пара слов об inpout32.dll. Скачать её можно отсюда, это модифицированная версия, которая, несмотря на название, работает и в x32 и в x64 редакциях Windows. Для прямого доступа к портам устанавливается драйвер, что накладывает ограничения:
Программу в первый раз нужно запускать с правами администратора. Если планируется наличие установщика, то в конце установки можно запустить InstallDriver.exe.
Пользователя нужно предупредить, так как многие антивирусы следят за установкой драйверов.
64-битная версия драйвера подписана, так что проблем с разрешением на установку не будет.
Чуть доработал движок блога — теперь в комментариях можно использовать Gravatar. А тот, кто аватарку не указал, получит рожицу, автоматически сгенерированную на основе имени, примерно вот такую:
По интернету уже довольно давно ходит картинка, показывающая как разные браузеры обрабатывают толстые границы с точками. С тех пор ничего не изменилось. Но, как выяснилось, чтобы поймать баги, достаточно границы в один пиксель! Во время создания сайта у меня был код, похожий на этот:
Когда мне провели оптоволокно, я пошел в магазин и купил первый попавшийся роутер — ASUS RT-N10+. Вот он:
Обошлось это чудо в 1300 рублей. Родная прошивка была очень удобной, с «домохозяйским» интерфейсом, но тормозила. Через пару лет выяснилось, что, скорости больше 30 мегабит этот девайс уже не переваривает — торрент клиент на этой скорости завешивал его практически полностью.
Тогда я стал искать альтернативные прошивки. Самая известная — DD-WRT. Я поставил сборку под мой роутер, но был разочарован — скорость работы не возросла (как я узнал позже, драйвера использовались те же, что в родной прошивке), а те настройки, которые до этого делались парой кликов (вроде переброса порта для IPTV) можно было сделать только через правку конфигов. И это при том, что веб интерфейс просто перегружен всевозможными опциями. Других прошивок я на тот момент не нашел и на это дело забил.
Но совсем недавно я наткнулся на Wive-NG и, о чудо, у них оказалась сборка под моё железо! Все нужные настройки остались на месте, а роутер перестал резать скорость (оказывается, у меня 20 мегабит на передачу). Расскажу об установке.
С тех пор, как в интернет-домены внедрили поддержу юникода, было много споров. Например, китайский адрес не сможет набрать никто кроме самих китайцев из-за отсутствия нужных раскладок клавиатуры. А как вам адрес, который в принципе нельзя набрать, потому что там нарисован снеговик? Вот он — ?.net =)
Конечно, это такая же «буква» как и остальные — можно добавить его, отредактировав раскладку клавиатуры, или скопировать из таблицы символов. Или использовать Punycode: xn--n3h.net. Но все равно впечатляет.
Вот и наступил 2013. Праздничного настроения в этот раз не было, в детстве Новый Год и День Рождения были самыми счастливыми днями, а теперь как-то уже и не так весело. Надеюсь, этот год будет хорошим.