Важно! Ретрансляция.

Как я уже писал, в панике и беспорядке драпаю я на другой блогхостинг
http://cdriper.blogspot.com/2011/04/blog-post.html

Собственно, последний этап переезда -- настроил ретрансляцию оттуда в жж, так что если кто-то желает читать меня исключительно через френдленту, то прошу любить, жаловать и френдить cdriper_rss. Он почти как настоящий, только бот.

Ретрансляцию делал через http://rss2lj.net, за этот замечательный сервис спасибо david_m.



Комменты там не закрываю, так что если хотите поучаствовать вместе со мной в приумножении энтропии в этом несовершенном мире, то комментить можете и там, и там, и еще в твиттере, и еще в фейсбуке!

На этом все, возможно это последняя запись.

зы. Собираюсь более подробно отписаться о моих приключениях с настройкой ретрансляции...

зы2. Картинки нормально не постятся, rss2lj вчера не мог больше 5 тыщ записей запостить -- скопилась очередь, многие регулярно выходящие журналы перестали обновляться, френдлента полупустая...
И не спрашивайте меня, почему я не хочу больше вести свой блог в жж

Маршрутизируй это!

С первого апреля (и это не шутка!) перешел на новый интернет пакет с входящей скоростью 50 мегабит. Желающие получит порцию жопожжения могут принять к сведению, что счастье это стоит меньше $10 в месяц.

Интернет в доме раздавался стареньким, но бодреньким, роутером Linksys WRT54GL. Большой ПК был подключен к нему шнурком, всё остальное хозяйство, состоящее из ноутбука, iPad’а и пары смарфтонов, пользовалось Wi-Fi сетью. С приходом в дом новых скоростей, старый роутер, со своей пиковой скоростью LAN->WAN в каких-то жалких 30 мегабит, стал узким местом. В воскресенье утром я передернул кабель из роутера в ПК, увидел заявленные честные 50 мегабит в speedtest’е, 11.3 мегабайта в секунду в торрент клиенте (видать, зацепило локальных сидов; Linksys же больше 3-х метров никогда не давал), и даже посмотрел, прикола ради, на IP-TV (роутер был старый и не дружил с мультикастами).



В общем, диагноз на лицо, остро встал вопрос выбора нового роутера.

Если не пытаться сильно изгаляться, то ассортимент роутеров в нашей деревне крайне скромный. В поле зрения попало буквально несколько моделей D-Link и ASUS. Полез читать обзоры, обращая внимание, в первую голову, на пиковые скорости обмена LAN->WAN. У ASUS’ов тут оказалось все довольно печально, причем даже относительно дорогой RT-N16 с гигабитными портами давал жалкие 130 мегабит, и понятно, что при этом бюджетные модели, вроде RT-N13U, не дотягивали до сотки, выдавая в тестах 60-70 мегабит. Поэтому брендовость, кавайная веб-морда для настройки и USB порт пошли лесом, я стал смотреть в сторону D-Link DIR-615.

Маленькая ремарка. Да, я отлично знаю что D-Link глючное гавно. Именно поэтому у меня в свое время оказался Linksys. Едем дальше.

Посмотрел тесты DIR-615, почитал отзывы. Со скоростями в тестах было все нормально. Отзывы, как и для любого роутера в принципе -- противоречивы, но в целом довольно позитивны, особенно с учетом цены железки. Многие обрели счастье, прошившись на dd-wrt. С IP-TV проблем быть не должно было, PPPoE Russia поддерживается, и даже сраные, горячо любимые народом, DIR-300 без проблем дружат с мультикастом.

Роутер без проблем нашелся в ближайшем компьютером магазине.
Веб морда у D-Link’ов, в принципе, сносная. В плане настроек довольно богатая. Слава Б-гу, ее не сделали на русском, потому что, боюсь, что в тот день, когда я увижу морду настройки роутера на русском языке, меня хватит удар... Что достает в D-Link’ах после Linksys -- это значительно более долгая процедура перехода роутера в рабочее состояние после подачи питания или сброса (некоторые DIR-300 грузятся больше минуты!), а также тот факт, что применение большого числа настроек требует минимум 10-15 секунд ожидания, а то и перезагрузки роутера... С другой стороны, делаешь эти все вещи только один раз, так что это не очень критично.
Настройка хозяйства заняла пару минут, я приступил к тестированию.

Первое, и самое главное -- скорость LAN->WAN я получил как при прямом подключении, т.е. самые что ни на есть честные 100 мегабит. Собственно, только ради этого я на этой апгрейд и пошел.

Второе -- появилась поддержка 802.11n. Правда, единственный девайс в доме, который поддерживал n, оказался iPad. Для него переход на более свежий стандарт в speedtest’е дал 30 мегабит, вместо 20 мегабит при g подключении. До максимума канала в 50 мегабит, который без проблем показывает большой ПК, далековато.
С wi-fi вылезла одна проблема. Если поставить на точке mixed mode, с поддержкой всех трех стандартов, то ноутбук почему-то упорно подключается в b режиме и выдает соответствующие скорости. Проблему смог забороть только залочив режим на 802.11g (удивительно, но режим g + n не помогал). При этом скорости обмена жирными файлами между ПК и ноутом стала в районе 2-х метров в секунду, а вот старый роутер прокачивался почти до двух с половиной.



Ну и самая жопа была с мультикастами и IP-TV, ибо с полпинка ни хуя не заработало.
Угробил несколько часов личного времени на копание в теме, но вопрос так и не решил.
На форуме провайдера нашлась очень интересная тема (эх, нашел бы я ее раньше, может и не спешил бы 615-й покупать), где выяснилось, что конкретно E4 ревизия (а разные ревизии это фактически разные устройства) иногда в режиме автоматического получения IP на WAN не получает какие-то там маршруты, из-за чего IP-TV не работает.
Перепрошиваться на официальные прошивки тут совершенно бессмысленно (а я в ходе бесчисленных экспериментов успел сменить парочку бета версий) и единственный путь -- ставить DD-WRT, который с мультикастом тоже не сильно дружит, что означает увлекательное шаманство из серии горячо-холодно с волшебными скриптами, по ходу пьесы разгребая всякие веселые глюки в остальной функциональности альтернативной прошивки.
Плюнул я на все это дело, ибо телека у меня дома уже лет восемь как нет, и если и возникает желание его посмотреть, то буквально пару раз в году, когда идет live трансляция бокса.
В общем, D-Link такой D-Link. С другой стороны, за свои $60+ нормальные роутер. Главное теперь, чтобы стабильно работал (да, бывает и такое).

В очередной раз подумал о том, через какую жопу все-таки идет TV вещание в IP, когда бедные пользователи должны часами сношаться, чтобы получить какой-то результат. Я понимаю, что мультикаст это просто спасение для провайдера, но, блин, это все это выходит слишком геморрно и сложно для простого смертного. Что уж говорить, если даже я, не самый последний чайник, так и не смог заставить играть VLC плеер с готового плейлиста, который давал провайдер. Вот не работал он и хоть тресни! Что-то получилось только с альтернативным плеером, который, с другой стороны, крайне неудачен в настройке и имеет выносящую мозг эргономику... Отдельная песня -- как люди трахаются, чтобы решить вопрос нормального просмотра TV по wi-fi или на сторонних медиаплеерах -- это просто поэмы можно писать!
В общем, проблема имеется, и используемые технологии в этой области как-то совсем не user friendly...

На этой оптимистической ноте заканчиваю, пока!

зы. Как последние дни работает жж вы знаете. Я больше десяти часов не мог запостить эту запись. Особенно цинично на этом фоне выглядит пришедшее утром письмо "We hope you're enjoying your LiveJournal Paid Account trial!"

Про API

Евгений Кирпичев затронул тему, о которой рано или поздно задумывается любой мало-мальски опытный программист -- тему о том, должен ли быть доступ к относительно низкоуровневым вещам в объектно-ориентированном стиле.
http://antilamer.livejournal.com/351635.html

Я бы рассматривал эту проблему немного в другой формулировке -- не ОО vs процедурность, а высокоуровневый доступ vs низкоуровневый доступ. Низкий уровень это классика вроде berkeley sockets или Windows API. Более высокий -- что-то на плюсах, с классами, в стиле хотя бы MFC. Отмечу, что подавляющее большинство классических сишных API handle based, и, по факту, тоже являются объектно-ориентированными, просто выражены на языке, без нормальной поддержки этой парадигмы.

Что я могу сказать по поводу проблемы API? Есть две стороны одной медали.

Сторона первая. Хороший высокоуровневый API лучше хорошего низкоуровневого.
Но! Спроектировать хороший высокоуровневый API, иной раз, намного сложнее, чем хороший низкоуровневый, при этом хороший низкоуровневый API лучше плохого высокоуровневого (ваш Кэп). И отдельная история -- ужасы кривого низкоуровневого API обычно относительно легко спрятать за красивым высокоуровневым API, а вот городить высокоуровневый API поверх кривого высокоуровневого не самое веселое занятие.

Плюсы высокоуровневого подхода, по-моему, очевидно. Ваш нетипизированный handle based ужас получает типизацию и RAII (спасающий от утечек этих самых хэндов).

Ну а в какое гавно превращается любой классический сишный API через какое-то время знают, думаю, все.
Классика -- berkeley sockets, создателям которого надо отрывать и руки, и яйца
http://cd-riper.livejournal.com/89832.html
Причем меня поражает та настойчивость, с которой сопровождающие API люди пытаются, всеми правдами и неправдами, впихнуть все новшества в прокрустово ложе существующих функций, любыми силами избегая добавления новых. На хрена спрашивается? Неужели случится что-то страшное, если к функции socket() добавить еще функцию socket_ipv6()?

Все мы знаем на что похож тот же Win32 API [1]. Те же самые прелести любого низкоуровневого интерфейса -- волшебные флаги, куча какого-то reserved стафа, union like подходы, sizeof в полях структур, сплошные брутальные приведения типов. Неужели кому-то нравиться ковыряться в этом гавне?

Аргумент о том, что мол на уровне высокоуровневого API очень трудно развиваться и сохранять совместимость, я не принимаю. Во-первых, есть множество примеров, показывающих, что это не так. Смотри тот же .NET. Во-вторых, в том же .NET вопрос несовместимости решен очень просто -- на машине может стоять множество разных версий фреймворка и старые приложения могут использовать именно ту версию, под которую они были написаны. И, в-третьих, если необходимо внести какие-то летальные изменения в существующий интерфейс, то породить все нужные ошибки компиляции в местах, где нужно что-то подправить под новую версию, в разы проще в высокоуровневом решении, а не в низкоуровневом, где типизация отсутствует в огромном числе мест.

Но есть и другая сторона проблемы.
Си это стандарт де-факто в огромном числе случаев. Большое число более высокоуровневых языков программирования умеют интегрироваться с сишным кодом. Сишный компилятор, в отличии от плюсового, есть практически под любую платформу или микроконтроллер. Си намного проще C++, и этот язык имеет значительно более простые и беспроблемные двоичные интерфейсы (ABI). И, как я уже писал, поверх низкоуровневого API обычно много легче городить какие-то надстройки.

Но мы, увы, живем не в идеальном мире, поэтому “маємо те, що маємо”.
Я за свою профессиональную карьеру порядком понаписывал плюсовых (и не только) врапперов вокруг сишных API (от Win32 до всяких сокетов и zlib’ов), и могу сказать, что обычно исходные сишные интерфейсы представляют собой страшное и очень печальное зрелище, и как ими можно пользоваться в трезвом уме и здравой памяти я не представляю. Равно как и не понимаю вещей, вроде сишных парсеров XML -- это что-то запредельное...

Как-то так.

[1] Справедливости ради, Microsoft иногда не пытается засунуть все в одну функцию, и рядом со старой функцией вроде Create() создает новую CreateEx() или что-то в таком духе.

Судьба

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

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

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

Кстати, через несколько лет, снова на день рождения, мне таки подарили калькулятор, причем военный[1], программируемый, МК-61[2]. Но в те годы мечты мои росли вместе со мной -- я уже чертовски хотел "спектрум".

Мои мечты совпали с финансовыми возможностями родителей только в 96-м году, когда я поимел дома настоящий 486-й компьютер. Удивительно, но в отличии от младшего брата, я использовал его не только для игр, но и для программирования -- это дело мне очень нравилось еще со школьных лет... Кстати, и программировать я научился будучи в гостях у той самой бабушки, у которой я первый раз узнал что такое "калькулятор": буквально за один вечер, на основе какой-то нехитрой книжки, я освоил бейсик для ZX-Spectrum (который принадлежал моему дяде -- тетка к тому времени уже вышла замуж).

Я все это к чему вспомнил. Анализируя свои детские восторги от знакомства с вычислительной техникой, прихожу к выводу, что, в конечном счете, все это было не случайно, и полностью предопределило мое главное занятие в жизни [3].

Пятиминутка ностальгии окончена.

[1] Эпитет "военный" родом из моего детства. Как и положено мелкой особи мужского пола мне очень нравилась военная тема, поэтому самой большой похвалой чего-либо было именно это слово. Например, собирают меня в садик, а я не хочу одевать колготки. Вот мне и говорят "ты чего?! это же военные колготки! все солдаты носят такие!".
[2] http://ru.wikipedia.org/wiki/Электроника_МК-61
[3] Нет, это не ведение блога.

Так закалялась сталь!

На самом деле, на этом месте должен был бы располагаться краткий отчет о концерте Slayer + Megadeth, который состоялся 13-го марта в Киеве, дык, обстоятельства, предшествующие этому концерту, оказались столь увлекательными, что я решил поделиться за одной и ими.



I.

В Киев я прибыл в субботу 12-го, за день до мероприятия.
Жить я должен был у старинного знакомого, с которым не виделся два года. Он предложил приехать на день раньше, так как в планах был еще поход на концерт Федорова, на который, уже по факту приезда, было решено забить и предаться исключительно пьянке, которая, ясный хобот, началась с самого утра.
В общем, к вечеру субботы мы с моим боевым товарищем Димой (ник которого я называть не буду по причине затянувшегося процесса саморебрендинга) выпили уже порядочно, но тут, очень кстати, подтянулись еще люди со свежими силами. Потом был веселый поход в ближайший супермаркет (по официальной версии за 20-ю ватными лампочками в люстру и солью), и пьянка финишировала только к трем часам ночи, правда, лично я свалил в кровать несколько раньше, так как имею одну нехорошую особенность. Нет, речь идет не о развитом инстинкте алкогольного самосохранения -- я категорически не могу спать в поездах, что всегда приводит к одним и тем же последствиям: в день приезда, часикам к двенадцати, меня начинает самым подлым образом вырубать, причем, понятное дело, этот упадок сил почти всегда усугубляется порядочными возлияниями.
Collapse )

Загрузочное

В этой заметке хочу написать об околозагрузочных вещах, которые мы делали в рамках нашего проекта на основе камня от Analog Devices BF-537 (семейство Blackfin). Постараюсь писать не сильно заумно, чтобы картина была более менее понятна не только специалистам, но и особо пытливым гражданским.

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

Камень BF-537, что у этого зверя есть в наличии? I/O области у него нет, есть единое плоское 32-х разрядное адресное пространство, в котором наблюдается:
- область, на которую отображается внешняя SDRAM (до 512 метров)
- четыре асинхронные банка памяти по мегабайту каждый (в эти банки обычно подключают параллельную флеш память)
- boot ROM (2k), намертво вшит в процессор, именно с него происходит начало работы камня
- несколько банков, на которые отображается внутренняя RAM камня; в этих областях можно напрямую хранить данные или исполнять код, либо использовать эти регионы как кэши (в случае работы с памятью на внешней шине)
- область с множеством регистров для управления процессором и периферией (в некоторых архитектурах эти вещи размещают в I/O).



Перво-наперво решался вопрос "где хранить программу". Параллельный флеш отпал практически сразу, причем не столько из-за цены вопроса, сколько из-за того, что процессор больше 4х метров этого дела адресовать не может, а это очень и очень мало. Поэтому решили использовать флеш последовательный, подключенный к SPI шине.
Collapse )