pozitronik: (Yarr)
Как сегодня стало известно, WinAmp - всё.
Как страшно жить! WinAmp был одной из первых программ, которой я начинал пользоваться, и одной из немногих, доживших до современности. Ещё была Опера, но, как мы понимаем, она тоже всё. Из трёх китов, на которых держится моя маленькая цифровая Вселенная, остался только Total Commander - и он, хвала Позитрону, не только не собирается помирать, напротив - буквально на днях Гислер должен разродиться очередным мажорным релизом.
Как вы поняли, винампом я пользуюсь до сих пор - и буду пользоваться в обозримом будущем. Это, к счастью, не браузер, который без постоянных обновлений становится бесполезен. Стандарты музыкального кодирования не меняются уже много лет, да и API плеера позволяют без проблем впиливать поддержку чего-то нового, если уж на то пошло. Так что в этом плане ничего не меняется.
Но из-за этого я не просто ощущаю себя олдфагом, я кажусь самому себе замшелым пердуном. Согласно опросу очень много людей предпочитают слушать музыку в браузере - для меня это такой же труднопредставимый кошмар, как поедание супа жопой. Чуть меньшая часть опрошенных пользуются AIMP - ну что, видел я его, ничего плохого сказать не могу, но и хорошего тоже.
Просто винампушка за... пятнадцать, получается, лет, абсолютно подогнался под мои нужды, и менять его на что-то - это всё равно, что переучиваться на левшу: сложно, неэффективно, и, к счастью, незачем.

Так что я подожду с надгробной речью.
pozitronik: (Унитазный котэ)
Представьте, что после долгого тестирования вышла новая версия Windows или MacOS X. И что в ней не работает какая-то очевидная и нужная вещь, например - нельзя подключить второй монитор, или не переключается раскладка клавиатуры. Короче, такая вещь, которая отлавливается даже не на тестировании, а в процессе написания кода этой ОС.
Даже если такое действительно возможно - а я попросил это представить - то через сколько минут выйдет патч, исправляющий проблему, как думаете? Я думаю - в худшем случае - через сутки.

Так вот, в Ubuntu 13.10, вышедшей 17 октября реально не работает переключение раскладок хоткеями, и официального патча нет до сих пор. Неофициальный патч вышел пару дней назад (охренеть оперативность) а до того приходилось чинить красноглазо:

sudo apt-get purge indicator-keyboard
gsettings set org.gnome.desktop.input-sources xkb-options "['grp:caps_toggle']" && setxkbmap -option grp:switch,grp:caps_toggle,grp_led:caps us,ru && setxkbmap -option grp:switch,grp:ctrl_shift_toggle,lv3:rctrl_switch,misc:typo,grp_led:caps us,ru


Это к тому, что раз в несколько лет я смотрю на этот дистрибутив для домохозяек и делаю выводы. И нынешний вывод - с таким QA вендекапец не состоится.
pozitronik: (Sheridan)
По моим ощущениям - полезно, но много неоднозначностей. Основных недостатка два: первый - одновременно шло по три доклада и приходилось выбирать, второй - по теме доклада не всегда было можно определить, о чём пойдёт речь. Сами доклады - все до единого - не содержали каких-то откровений; всё это могло быть выложено (и, большей частью - действительно выложено) в паблик и доступно для изучения. Но в паре случаев живое общение с докладчиками было действительно очень полезно.

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

jQuery, по словам Дэйва, не медленный, он не создаёт никакого отдельного слоя исполнения, это просто JS-библиотека (капитанства в докладах было очень много). Все проблемы - от использования неэффективных техник.
Как пример, приводилось два селектора:

$(':hidden') и $('.hidden').

(подразумевается, что .hidden{display:none})

Первый селектор (а, точнее, jQuery псевдоселектор) будет работать на порядок медленнее, поскольку он не реализован в браузерах, и jQuery реализует его самостоятельно. А для этого приходится пройти по всему DOM, находя скрытые объекты.
Выборку же по классу jQuery может передать браузеру, который, по понятным причинам, сделает это моментально.

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

Дэйв старательно избегал упоминал сравнений jQuery с другими JS-фреймворками, которые, по тестам, на одних и тех же операциях, оказывались в два-три раза быстрее. Простим ему это, ведь нелегко хаять собственное детище =)
К тому же Дэйв не упомянул об основной загвоздке: никого не волнует скорость работы бибилиотеки, самого JS, или даже всего браузера в целом. Важно, насколько быстро под это всё можно писать production code, а jQuery тут - безальтернативный вариант.

На следующий доклад пришлось выбирать между Всеволодом Шмыровым (он должен был рассказать о geoQuery) и Ильёй Кантором, который рассказывал об особенностях и продвинутых техниках использования событий в jQuery. Я выбрал Кантора, и не пожалел: это, пожалуй, был самый интересный и полезный доклад, с конкретными примерами и наглядной демонстрацией. Очень надеюсь, что запись доклада будет выложена в открытый доступ, а пока приведу несколько конкретных примеров:
- Различия между stopPropagation() и stopImmediatePropagation(). Оба метода останавливают всплытие события по DOM, но с одним отличием: stopImmediatePropagation() останавливает все всплытия всех событий для всех родителей объекта. Тут же это отличие было показано на примере реализации простейшего валидатора форм (запрещался сабмит формы при наличии невалидных полей в ней).
- Почему return(false) и preventDefault - это одно и то же.
- Как правильно создавать через jQuery объекты в цикле с передачей им внешнего параметра через одно из свойств объекта. Тут же обнаружилось, что один и тот же код тут ведёт себя по разному на jQuery 1.x и 2.x; Илья не растерялся и тут же объяснил причины такого поведения.
- Самое вкусное: рассказ о том, как назначаются обработчики событий в jQuery, чем они отличаются от нативных обработчиков, и к каким могут привести к проблемам. Простой пример:

for (var i=1;i<100;i++){
var d=$('div').onclick(function(){...});
$('#somediv').append(d);
}

$('#somediv').remove();//Или нативно, через delete, хотя тут уже не помню точно

Исполнение этого кода было показано в профайлере: использование памяти очевидным образом росло при создании каждого объекта, однако память не освобождалась при удалении родительского объекта. Оказалось, что у jQuery есть что-то вроде глобального массива назначенных событий, которые нельзя так просто взять и удалить.
Quick & dirty trick для обхода этой ситуации - делать объекту detach (а потом уже удалять, при необходимости).
- Собздание собственных событий. jQuery имеет API, через которое можно создать собственное событие (например - onchange, действительно работающий при изменении содержимого поля, а не при потере изменённым полем фокуса, как реализовано нативно) и т.д. Отличная штука для создания того же валидатора, обязательно нужно разобраться и применять.

С одной стороны - ничего такого, чего нельзя было обнаружить на api.jquery.com или learn.javascript.ru. Но Илья оказался прекрасным докладчиком, и великолепно отвечал даже на реально заковыристые вопросы.

Затем я послушал доклад Эрика Манна, он рассказывал о WebWorkers - способе реализации многопоточного JS в HTML5 и собственной обёртке над ними (menehune.js). Я, к сожалению, почти не знаком с HTML5, поэтому не смог оценить значимость доклада и полезность обёртки, но отметку потестить WebWorkers себе поставил. Презентация Эрика есть тут: http://eam.me/jqru2013.


Манн показывает работу многопоточного HTML5-приложения на примере "шекспировских мартышек".


Доклад Дмитрия Кузнецова из 2ГИС был очень неплох. Он описал процесс создания фронтенда 2ГИС, попробую кратко передать суть.
Обычно проект проходит через три стадии - дизайн, разработку и тестирование, и на всех трёх стадиях в проект вовлечены разные специалисты - дизайнер, программист, тестировщик. Однако сам процесс перехода между стадиями крайне важен, т.к. должен передаваться контекст разработки. Дизайнер не только должен нарисовать красивый и удобный интерфейс, он должен понимать, как верстальщик будет его реализовывать, какие сложности при этом возникнут. Верстальщик должен понимать, для чего JS-программистами будут использоваться те или иные элементы, и как облегчить им жизнь. Что обязателен двусторонний фидбек по всей линейке разработки, чтобы вся команда понимала, что к чему.
В связи с этим предложен разбивать эти три стадии на целых восемь:
1) Разбиение интерфейса на модули
2) Описание форматов данных и всех состояний каждого модуля.
3) Я прослушал =)
4) Вёрстка
5) Анимация
6) DOM-тесты и контентные тесты
7) Реализация внутримодульной логики
8) И, наконец, интеграция модулей.

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

Четвёртым был ещё один отличный доклад посвящённый разработке адаптивного дизайна на jQuery. Дмитрий Демидовский из AGIMA рассказал, как нужно адаптировать дизайн сайтов к современным (и не очень) мобильным устройствам. Теория была коротка: используем управление загрузкой (подгрузка контента по мере необходимости), адаптируем не только интерфейс но и способы взаимодействия (жесты, акселерометры и прочие мобильные удобства), вместо парсинга юзерагента используем feature detection. Плюс, сайт должен работать без JS (хотя бы базово) потому что мобильные устройства могут относительно долго загружать JS и даже совсем его не загрузить.
А дальше шла практика - Дмитрий рассказал о куче jQuery-плагинов, реализующих вышеописанные приятности даже там, где этого нативно нет (например, поддержку тач-событий на Blackberry) и других техниках:
- Поддержка жестов: jGesture/Hammer.js
- Адаптация изображений: стандартные способы (задания max-width:100%, вывод разных изображений для разных разрешений, использование SVG) и новые: использование HTML5-тега (поддерживает несколько src) и эмуляция тега с помощью плагина jQueryPicture.
- Отложенная загрузка контента и скриптов: jQuery Lazy Load, GetScript.
- Использование аппаратного ускорения - переделка всех JS-анимаций на CSS transform и CSS transitions. Два плагина, позволяющих без правок кода сделать это для jQuery.animate() - jQueryTransit и jQuery Animate Enhanced.
- Проблемы создания навигационных меню на мобильниках: недостаточно места для горизонтального меню, проблемы с поддержкой pozition:fixed, остановка исполнения JS на iOS-устройствах при касании экрана. Решение проблем: дизайнерские методы (переделка меню) и эмуляция скроллинга: от банального overflow:scroll в родительском контейнере до плагинов jQuery Nice Scroll и Tiny Scrollbar.
- Почему слайдеры - это хорошо, но иногда - плохо. Проблемы использования слайдеров с видео и "тяжёлым" контентом.
- Поддержка JQueryUI на мобильных устройствах (плагин TouchPunch).

И, в финале, методики тестирования на мобильных устройствах.
В общем - крайне полезный с практической точки зрения доклад, очень понравилось.

А вот напоследок я выбрал доклад о разработке интерфейсов на jQuery от Артура Столяра. Тема доклада была очень многообещающая (создание пользовательских интерфейсов на jQuery - действительно интересная задача), зал был переполнен.
Но, в итоге, Артур битый час рассказывал про какую-то фигню, без предисловий, без объяснений, без jQuery. Только в конце он сказал: вот так вот работает мой фреймворк ComfortUI, спрашивайте ваши ответы.
- То есть вы нам рассказывали про ваш косты... эээ... фреймворк? - спросил озадаченный слушатель.
- Да. Отличный фреймворк, позволяет проектировать интерфейсы взаимодействия независимо от дизайна и вёрстки.
- Отлично, но где используется этот фреймворк?
- Он используется мной, на сайте нашей компании (тут я зашёл с планшета на этот сайт, засмеялся, потом скормил его валидатору и засмеялся ещё раз).
- То есть, вы единственный человек, который его видел?
- Да. Но через месяц я выложу исходники на гитхаб.

Не смешно.

Ну и финальная сессия вопросов и ответов; я рассказал известную шутку: вопрос на stackoverflow "Как мне сложить два числа на JavaScript" и ответ "Не знаю, но где-то был такой плагин для jQuery", а затем спросил - есть ли проблема в том, что лёгкость jQuery плодит разработчиков, не понимающих основ, и как с этим бороться? Увы, разработчики ответили мне в капитанском стиле, что это, мол, не проблема jQuery.
Впрочем, были и другие интересные вопросы, неплохой диалог получился. И последующий фуршет тоже.

Это всё, что я могу рассказать о войне во Вьетнаме.
pozitronik: (Sheridan)
Подробности - наверное уже завтра, а то вымотался я. Было, в принципе, интересно, хотя я ожидал большего.

pozitronik: (Sheridan)
Новая дельфя вышла, умеет нативно под ондроед компилять. Пойду скомпиляю что-нить, раз уж я в жаву так нормально и не смог.
Ссылки во всех торрентах страны, а тут легальный триал.
pozitronik: (Sheridan)


Asus N56VB. Честный четырёхядерный i7 3630QM, 8Gb RAM, GT740M 2Gb, 1Tb HDD, матовый FullHD-экран, BR-привод. На удивление - отличный звук. Не пальцеломная клавиатура, отсутствие бесячих дополнительных кнопок. За 32800.
Сначала остановился на такой же модели но с более слабым видео за тридцатку. Потом подумал: лучше я чуть выбьюсь из лимита и пару дней буду питаться дошираком, зато потом не буду жалеть о узком месте в конфиге.

Я правда не знаю, отличный это ноутбук, хороший, или плохой. Я взял его тупо по начинке, и возможности дальнейшего апгрейда (обязательно заменю привод на SSD, и наращу память до 16Gb). После этого железки должно хватить лет на пять, тем более с учётом того, какое говно выкатили под видом некстген-консолей. Ну и конечно помацал ноут в магазине, всё устроило.

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

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

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

Что-то ещё говорить пока рано, буду собирать впечатления и выкладывать их в бложек.

Всем, кто натолкнул меня на мысли об покупке - ещё раз спасибо, без вас наверняка взял бы какое-нибудь оверпрайсное говно. Сейчас я попытаюсь почитать френдленту, а вы пока разводите срачик в комментариях.
pozitronik: (Sheridan)
Отлаживая одну штучку на работе, был вынужден попробовать мобильный фурифокс. И знаете, что? Он мне нравится.

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

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


Да, чтобы не сойти с ума от скуки, решил завтра таки выбрать себе ноут. Ещë одни выходные, занятые ничем - и я попросту поеду.
pozitronik: (Sheridan)
От создателя banionline.ru! На том же движке - eddim.ru. Давно хотел сделать каталог всех поедательных заведений города (а то совсем кабзда, не знаешь, куда девушку отвести, а так чик с мобилки, и всё понятно).

Имхо, получилось простенько и удобно, всё лишнее вырезал, а то, чего не хватало - дописал. Заодно обучил пыху братана, пусть занимается проектом теперь.
pozitronik: (Sheridan)
Снова подбил статистику по прослушанной музыке. Методика такая же, как в прошлый раз.
За без малого 5 месяцев я прослушал 312 альбом (в среднем, по два альбома в сутки). Общее же количество музыки у меня несколько выросло, и составляет 7223 альбома, таким образом прослушано и оценено у меня ~32,5% коллекции. Четыре процента за пять месяцев - нетрудно подсчитать, что такими темпами закончу я слушать свою музыку только через семь лет.
А теперь - графики:
ничего интересного )
pozitronik: (Default)
13:58 27.03.2013
Пилим восьмибитный процессор. Часть седьмая, баголовная.
Я две недели не публиковал описаний прогресса разработки процессора.
Тем не менее, это не значит, что я им не занимаюсь - занимаюсь, хотя, пожалуй, уже без той остервенелой увлечённости, что в начале, плюс, отвлекаюсь на другие занятия, да ещё сидел без клавиатуры несколько дней. Но даже с учётом всего этого, две недели - срок вполне достаточный для накопления очередной порции интересных доработок.
Я так думал, да. Всего за пару дней я переделал микросхемы, определяющие тип операндов и их количество, переделал командный блок (переупорядочил команды, добавил новые), добавил новые регистры - и очевидных проблем при этом не проявлялось. Вылезали, конечно, кое-какие баги, не найденные раньше, но ничего серьёзного.
Так что я начал было заниматься командами перехода по памяти, которые сплошь однобайтные - и оказалось, что мой управляемый счётчик неправильно работает на операции, описываемой как for ($=0;$i==0;$i++) - то есть команды без операндов им не воспринимались, что вело к неправильному разбору всей дальнейшей памяти.
Окей, проблема локализована, надо только переделать счётчик...
Я потратил на это неделю.
Read more... )

read more at Журнал Великого Позитроника

pozitronik: (Sheridan)
02:25 21.03.2013
Грустная сетевая футурология

Картинка для привлечения внимания

Пройдёт время, и происходящий ныне сетевой беспредел будет вспоминаться с некоторым недоумением - "а что, неужели и правда была цензура?". Вернее - вспоминаться не будет, как не вспоминается ныне засилье падонкоффского сленга, или даже недавний совсем шухер с Фукусимой. Останется напоминанием только статейка в википедии с упоминанием наиболее значимых вех развития цензуры и финальной датой её отмены.
К сожалению, эту дату вам не назовёт сейчас никто - по крайней мере, пока у власти находится незаконно самоназначившее себя правительство, во главе с ботоксным крошкой Цахесом. И вполне очевидно, что сейчас даже не пик активности, а только начало разгона информационно-блокирующей машины, которое вполне может вылиться в то, что уже существует в Китае. В вариант полного запрета интернета я всё-таки не верю - и не потому, что технически это нереально, а потому, что это лишит хозяев телекомов больших доходов.
Но хватит о политоте, давайте пофантазируем как жить в условиях грядущей тотальной информационной цензуры.

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

Способ первый, анонимный.
Тотальный переход в распределённые анонимные сети. TOR, I2P, Freenet. Реалистичный, уже на текущий момент, вариант.
Что дальше: анонимные сети получают резкий толчок развития, пользоваться ими научится любой чайник, как, в своё время, это произошло с торрентами. Интерфейс софта упростится (сейчас ещё есть что упрощать), система станет удобнее, внутрисетевые скорости вырастут за счёт увеличения числа юзеров. Стопятьсот кубических зигабайт нецензурируемого киберпространства, где будут свои аналоги ютубов с ЦП, спокойно соседствующие с безобидными форумами любителей игры в "Космических рейнджеров" (где, как известно, можно торговать наркотиками, и даже употреблять вещества, так что и игру, и её обсуждения обязательно запретят).
Однако, выходить через TOR в "нормальный" интернет будет всё сложнее и сложнее. Туннели будут отслеживаться и блокироваться на магистральном уровне (реализуют уж как-нибудь). Рунет расслоится, и приватные сети (вернее - одна большая скрытосеть) будут существовать отдельно от плавающего на поверхности цензурированного добра.
Конечно же, скрытосети объявят вне закона.
Доступ в сеть будет предоставляться только при наличии специальной шпионской программы, установленной на пользовательском устройстве. Программа будет отслеживать попытки подключения к скрытосетям, и стучать об этом, сломать же её будет крайне сложно - она будет обновлять саму себя с провайдерского сервера каждый раз.
Но что с выходом в международные интернеты? Естественно, международный траффик будет поначалу просто фаерволлиться (как в Китае). Найдут способ резать VPN, вполне возможно - начнут ограничивать доступ к неподконтрольным IP (введут белые списки, вместо чёрных).
В конце концов, скрытосети если и не будут побеждены совсем, то их затруднят работу настолько, что пользоваться ими станет даже менее комфортно, чем сейчас.

Способ второй: олдфажно-векторный.
Поскольку каналы выхода в сеть прямо или косвенно контролируются правительством, вполне очевидным решением будет создание собственных каналов и собственных сетей. И это не то, чтобы нереалистично - напротив, именно в этом виде существовала сеть в свои золотые годы. Правда, это была другая сеть, нежели интернет - я говорю о Фидонет (и прочих левонетах).
При этом вовсе не обязательно откатываться на FTN-технологии образца девяностых, достаточно заимствовать принципы, подстроив их под реалии современности. Телефонная линия сейчас есть не у каждого, зато почти у всех есть WiFi. Wimax-оборудование тоже вполне доступно, ну и старые-добрые домовые сети с лапшой меж этажами тоже никто не отменял, много где они вполне ещё живы. В конце концов - можно и достать с полок старинные "Зуксели", да и флоппинеты вполне можно возродить.
Конечно, нужно решить проблему роутинга в таких сетях, но это тема отдельной статьи. В комменты к блогозаписи кастуется Мицгол, мне крайне любопытно, что гуру скажет по этому поводу.
Естественно, организация таких сетей будет жесточайше караться. Потому сети надо планировать так, чтобы они были как можно более децентрализованными. Ну не смогут же ловить всех, кто шифрованный радиоканал до соседского дома сделал (хотя попытки наверняка будут).

Способ третий: конспирационно-несуществующий.
Создаётся ресурс, вполне себе доступный по обычному IP. Ресурс представляет собой этакие концентрированные интернеты - там и социалочка, и бложеки, и свои ютубы, и прочие ништяки.
Но вход внутрь только для "своих", по логину, паролю и отпечатку пятки. Остальные видят фото котят, играющих с президентом в бадминтон.
Попасть внутрь можно только по приглашению "своего" с поручительством двух партийных. За упоминание о бойцовском клубе ресурсе за его пределами - обструкция и исключение из партии. За вынос информации вовне - аналогично.
Минусы очевидны, и с некоторой стороны даже выглядят плюсами. Запретить доступ к ресурсу - как бы незачто, пока вовнутрь не попадёт чиновник. При достаточном соблюдении конспирации, ресурс будет жить достаточно долго,.
Я более чем уверен, что такой ресурс уже есть (и это не лепра), и если магистр ордена решит меня пригласить, то пусть пишет в личку.

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

Послесловие.
Я фантазировал "что", но не говорил "как". Свои "каки" и "чтоки" предлагайте в комментариях.

read more at Журнал Великого Позитроника

pozitronik: (Sheridan)
14:39 13.03.2013
Пилим восьмибитный процессор. Часть шестая: улучшение архитектуры и снова ассемблер.
После вынужденного перерыва снова возвращаюсь к своей архиувлекательной разработке. Оставил я её в каком-то промежуточном состоянии: например, минимальный набор команд реализован, возможность менять значения в памяти есть - а перехода на нужный адрес нет (хотя всё необходимое для реализации такой команды есть, саму команду я не запилил).
Непорядок.
В общем, я достаточно долго думал и прикидывал, что делать дальше, и как лучше это что делать. Пришёл к следующему выводу: нужно менять структуру команд, пилить уже условные переходы и циклы. После этого - уже всё, настоящий хардкор.
Что плохо в текущих командах? Они были взяты от балды, и шли не в логическом порядке: скажем за логическим XOR шло арифметическое SUM, потом опять логический SHL. Добавь я сейчас команду SUB (вычитание) - её пришлось бы помещать вновь за логической командой, а не рядом с SUM, где ей самое место. Нет, если пользоваться ассемблером - то пофиг, в каком порядке идут опкоды, но при трейсе обработки команд с упорядоченными командами удобнее.
Дальше: команда NOP. Много ли можно придумать программ, где ничего не делающий операнд реально нужен? В крайнем случае для пропуска такта можно использовать MOV A,A.
Итого я пересмотрел набор команд, и выглядит теперь он так:

ОпкодКомандаОписание
0x0 MEM Переходы по памяти
0x1 MOV Пересылка значения
0x2 XOR Логическое ИЛИ-НЕ
0x3 OR Логическое ИЛИ
0x4 AND Логическое И
0x5 SHL Левое смещение
0x6 SHR Правое смещение
0x7 SUM Арифметическое сложение
0x8 SUB Арифметическое вычитание
0x9 MUL Арифметическое умножение
0xA DIV Арифметическое деление
0xB STACK Работа со стеком
Описание команд переходов и работы со стеком чуть ниже.
Как видите - изменился и набор и порядок. При этом пока четыре опкода остаются свободными - я даже не знаю, какие команды можно ими задать. Возможно, при расширении архитектуры появятся какие-то команды (например опкод, выводящий "Hello, world!", таким образом, делающий возможным написание такой программы размером в один байт).
Думаю, с опкодами 0x1 - 0xA вопросов не возникло. Другое дело - 0x0, обозначающий различные переходы по памяти. Как одной командой можно закодировать их все?
Тут стоит вспомнить, как переходы реализованы в x86. Самый простой, безусловный переход вызывается так:
JMP @ADDRESS
где ADDRESS указывает на адрес в памяти, на который нужно совершить переход.
Соответственно, команда в памяти представлена двумя последовательностями бит: одна кодирует команду JMP, другая шифрует адрес. Просто и логично.
Read more... )

read more at Журнал Великого Позитроника

pozitronik: (Sheridan)
Есть идея и потребность написать программу для работы с файлообменником Mega (ну вы слышали про "наследника мегааплоада"). Файлообменник даёт 50Гб халявного места, и не имеет ограничений по скорости работы.
Имеется API (документация) по работе с файлообменником, но описано оно крайне скудно, и примеров нет. Тем не менее, Julien Marchand разобрался с ним, и написал примеры (статья, проект на GitHub), которые здорово облегчают понимание. Проект вроде бы работает, по крайней мере мне удалось его установить и получить им листинг файлов на сервере. Проблема только в том, что этот код написан на Python, а этого языка я ещё не знаю.
Через какое-то время я разберусь, и попытаюсь что-то сделать сам, но работа пошла бы куда быстрее, если бы мне помог кто-нибудь, знающий Python. Пойдёт также вариант с примерами на других ЯП (Perl, PHP, Delphi), но таковых я не нагуглил.
Есть тут питонисты?

Предупреждая вопрос "зачем это надо, ведь всё прекрасно работает через браузер?": хочу написать тулзу для автоматического бекапа + плагин для Total Commander.
pozitronik: (Sheridan)
11:42 05.03.2013
Пилим восьмибитный процессор. Часть пятая: ассемблер, тесты, запуск.
Небольшое предисловие, которое должно было быть в самой первой статье по этой теме:
Я понятия не имею, как правильно проектировать процессоры. И как неправильно - тоже. Я просто играюсь в конструктор, делаю ошибки, перекраиваю схемы на лету и наслаждаюсь этим забавным и увлекательным процессом.
Перечитывая предыдущие части, я нахожу в них заметное количество косяков и откровенных глупостей. Скажем, я так и не определился с архитектурой процессора, вроде сначала задумав сделать что-то RISC-подобное, но временами замахиваясь на CISC, и огребая от сложности реализации откатывался обратно. В итоге же получается, что я во многом копирую единственную знакомую мне архитектуру x86.
Поэтому: эти статьи рассказывают о том, как делаю я, а не о том, как надо.

Но окей, перейду к делу.
Поскольку теперь у нас есть контроллер памяти и минимально необходимые для функционирования ядра схемы, нужно попытаться собрать их все вместе и оттестировать. Пока набор инструкций крайне мал, тестирование процессора можно производить так: подать ему на вход все возможные наборы инструкций и посмотреть, как он их обработает. При этом следует учесть, что большая часть ошибочных инструкций не отлавливается - подай мы на вход несуществующую команду или несовместимый набор параметров - процессор поведёт себя непредсказуемо. Но отлов ошибок оставляю на потом, сейчас важнее и интереснее проверить работу на корректном наборе инструкций.
Итак, как выглядит вся схема в сборе:Read more... )

read more at Журнал Великого Позитроника

pozitronik: (Sheridan)
10:19 04.03.2013
Пилим восьмибитный процессор. Часть четвёртая: подготовка ко взлёту.


Я, наконец-то, смог снова вернуться к своей разработке. Чувствую, что она "не отпустит" меня, пока не доведу дело до конца.
В этой части я расскажу о довольно значительных изменениях и доработках в схеме процессора. Их уровень уже таков, что процессор выполняет несложные программы; ещё немного - и надо будет писать ассемблер, большие программы в машинных кодах писать очень неудобно.

В прошлой записи я остановился на блоке регистров. Он вполне закончен, к нему возвращаться, пока что, нужды нет.
Следующим логичным шагом стала бы реализация стека. Сделать его оказалось не так уж сложно, но вот когда я попытался с ним работать, возникли затруднения.
Если помните, я решил организовать работу со стеком посредством обычных операндов, вместо того, чтобы использовать стандартные команды работы со стеком PUSH и POP. Такое решение приводило к следующей логике работы: ничего не мешало брать или помещать данные в стек, но изменять их оказалось сложно. Вместо одной операции (и, соответственно, одного такта) получалось три: взять значение, изменить значение, вернуть значение. Хотя текущая схема позволяет оптимизировать порядок исполнения (изменение может производиться одновременно со считыванием либо записью), всё равно это требовало какого-то механизма синхронизации, что было неудобно и усложняло схему.
После некоторых раздумий я отказался от идеи подобной работы со стеком, и решил реализовать классические PUSH и POP.
Это, конечно, лишило меня целых двух опкодов (на самом деле, я думаю обойтись одним), однако такое решение позволило внести упрощения в логику работы процессора и его подсхем. Например, теперь схема определения количества параметров команды OpC сократилась в разы (два десятка элементов против нескольких сотен ранее) - поскольку теперь у каждой команды одно и то же количество параметров независимо от их типа:
Read more... )




read more at Журнал Великого Позитроника

pozitronik: (Sheridan)
00:35 28.02.2013
Пилим восьмибитный процессор. Часть третья: ядро и блок регистров.
Эта часть будет очень короткой, не смотря на то, что должна бы, по идее, описывать самую сложную часть процессора. Дело в том, что как раз на проектировании ядра я остановился.

Что такое ядро, и чем оно должно заниматься? Чёткого ответа на оба вопроса нет, но обобщённо - это именно та часть схемы, которая занимается выполнением инструкций. Ему на вход подали команду - он отдал результат на выход.
Со входом на данный момент более-менее порядок: контроллер памяти успешно читает и парсит команды, подавая их на вход ядру. Что дальше?
Взглянем на набросок схемы, которым представлено текущее видение ядра:
Read more... )

read more at Журнал Великого Позитроника

pozitronik: (Sheridan)
19:29 26.02.2013
Пилим восьмибитный процессор. Часть вторая: разбор команд и управляемый счётчик.


Итак, у меня есть примерное представление о том, каким должен быть процессор, какие данные он будет получать на вход, какие данные будут у него на выходе, но довольно мало понимания того, как он устроен внутри. Классический чёрный ящик.
Но любой программист знает: для выполнения сложной задачи её нужно разбить на маленькие и решать по порядку. Забегая вперёд скажу: рисование логических схем - это то же программирование, только вместо участков кода используем логические преобразования, вот и всё.
Я начал с памяти. Её, как помнится, 2048 бит - 256 блоков по байту. В Logisim есть встроенный элемент "ОЗУ", в котором настраиваются как разрядность данных, так и разрядность адреса.

Да, пока не забыл: я не стал морочиться, реализуя всю логику на базовых элементах (которых, как вы знаете, если читали предыдущие посты, три - И/ИЛИ/НЕ). Та же ОЗУ (дальше я продолжу называть её проcто памятью, что не совсем верно технически, но зато привычно) состоит из регистров, каждый из которых имеет свой адрес (т.е. у меня 256 регистров). Регистры состоят из триггеров, каждый из которых хранит состояние одного бита (так что у меня - восемь триггеров в регистре). Каждый триггер, в зависимости от типа, можно реализовать различной логикой, например T-триггер реализуется восемью элементами ИЛИ-НЕ. Итого: 16 простейших элементов в триггере, восемь триггеров в регистре, 256 регистров - итого 32768 элементов! И не будем сейчас о том, что сами элементы эти тоже состоят из транзисторов, иначе это число возрастёт ещё на порядок.
В общем - не мучить себя и вас, использовать готовое. В конце концов, когда мы программируем, то не используем только базовые команды, а работаем и с функциями языка - ну так и тут то же самое.
Read more... )




read more at Журнал Великого Позитроника

pozitronik: (Sheridan)
19:25 25.02.2013
Пилим восьмибитный процессор. Часть первая: теория.
Вступление к посту.
Изначально я не хотел разбивать статью на несколько частей, ограничившись одним подробным постом только по окончанию работы. Но обстоятельства вынуждают меня переключиться на другую задачу, так что я решил просто сбросить сюда информацию о том, что уже сделано, иначе наверняка что-то забуду (это не учитывая того, что я УЖЕ забыл).
К тому же объём информации предполагается таким, что его всё равно лучше разбить на несколько частей.
Наслаждайтесь!

Немногим ранее я рассказал о том, как меня увлекло проектирование логических схем в программе Logisim. Потренировавшись на простых схемах, я решил разработать процессор. И чтобы всё по настоящему, с исполнением машинного кода и полнотой Тьюринга.
Для тех, кто не в теме - краткий ликбез. Процессор в электронике - устройство, которому на вход подаются команды и, иногда, их параметры (как правило, закодированные последовательностью битов), на выходе получаются результаты выполнения этих команд над этими данными. Пример простейшего процессора - схема, выполняющая инкремент/декремент поданного на вход значения в зависимости от наличия сигнала на другом входе.
Полнота Тьюринга - свойство исполнителя (т.е. того же процессора) вычислять результат абсолютно любой вычислимой функции. То есть даже простейший тьюринг-полный процессор (если ему предоставить ресурс в виде бесконечной памяти) способен посчитать всё не хуже каких-нибудь пентиумов - только, скорее всего, программа будет сложнее, а исполнение займёт больше шагов. Пример того самого тьюринг-полного процессора - машина Тьюринга, придуманная знаменитым английским пидорасом великим английским математиком Аланом Тьюрингом; дабы не сверзиться в пучину всяких теорий вычислимости отправлю вас в Википедию. Впрочем, если вы пропустите этот момент - ничего страшного не случится, надеюсь - я обещаю писать так, чтобы понятно было даже человеку, далёкому от IT (но людям, знакомым с информатикой понять будет легче).

Началу проектирования в Logisim предшествовали обширные прикидки логики на бумаге. Нужно было решить следующие вопросы:
- Разрядность процессора.
- Набор команд.
- Архитектура.
- Порядок следования данных (big-endian или little-endian).
- и ещё куча всего, что просто не приходило сразу в голову.

Сначала я хотел делать четырёхбитный процессор, который, в принципе, покрывал бы ту же машину Тюринга: ну а то, четырёх бит достаточно для операций из 16 команд над алфавитом в 15 символов + 0!
Но я хотел сделать не простенькую игрушку, а что-то, работающее с архитектурой фон Неймана.

И снова ликбез.
Большинство современных компьютеров реализуют именно архитектуру фон Неймана. В ней программа (набор команд) хранится там же, где и данные, которые программа (вернее, процессор, эту команду исполняющий) обрабатывает. То есть программа сама должна определять, где у неё код, а где - данные, и что из этого и в каком виде надо скармливать процессору. Эта архитектура гибкая (например, программа может сама менять свой код) и просто реализуемая, но, при этом, подвержена ошибкам, вроде переполнения буфера (одна программа бесконтрольно пишет много данных, они не умещаются в отведённый участок памяти, залезают в код другой программы, которая, при выполнении вылетает - или запускает чужой код).
А есть ещё Гарвардская архитектура, в ней код и данные хранятся раздельно. Представьте, что у вас в компе две отдельных устройства ОЗУ, которые друг с другом не взаимодействуют и не пересекаются. И когда программа запускается, её исполняемый код грузится в одно устройство, а данные, с которыми она работает - в другую. Там уже никаких переполнений буфера (по крайней мере, они не должны быть так тривиальны, как в фон Неймане), да и исполнение происходит быстрее (процессору не нужно ждать данных, следующих за инструкцией, они всегда доступны на одном из устройств) - но с гибкостью там никак, да и по реализации она сложнее в несколько раз, в зависимости от подхода. Тем не менее, эта архитектура используется во встраиваемых устройствах, где скорость и надёжность важны, а гибкость - нет.

Реализовать четырёхбитный процессор с архитектурой фон Неймана, конечно, можно. Но возникает слишком уж много ограничений.
Например, если принять, что размер команды равен размеру данных (т.е. тем же четырём битам), то получаем ограничение в 16 инструкций, из которых только минимальный набор инструкций для работы с памятью займёт половину. Затем, процессор должен определить, что обозначают данные, которые ему передали. Константу? Номер регистра? Адрес в памяти? То есть после команды ещё должно быть что-то вроде маркера типа данных - а это ещё по два бита на параметр. И, наконец, четыре бита ограничивают максимально адресуемую память всего 64 байтами (16 адресов по 4 бита).
Всё это решаемо. Можно, например, разграничить размер машинного слова: командное слово считать равным восьми битам, а команды брать четырёхбитные. И адреса тоже брать не четырёхбитные, а восьмибитные. И ещё маркеры типов данных куда-нить пристроить... И дрючиться, высчитывая смещения в памяти, вместо работы с аккуратными идентичными последовательностями.
Но почему бы сразу не сделать восемь бит, благо в Logisim разрядность элементов переключается на лету? На сём и остановился.
Кстати, первый процессор от Intel 4004, хоть и был четырёхбитным, мог адресовать 640 байт памяти, а команд в нём было аж 46. Впрочем, это достигалось тем, что он, как раз, был построен по Гарвардской архитектуре - там с этим проще.

С набором команд тоже пришлось подумать. Делать много команд - усложнять разработку процессора, делать мало команд - усложнять разработку под процессор. Так что я исходил из того, что нужно реализовать самые основные, а потом, по мере необходимости, добавлять остальные.
Затем я посмотрел, с чем будут работать команды. Что будет в моём процессоре:
- Восемь восьмибитных регистров, от A до H (один из которых флаговый, один - адресный, остальные пока решено сделать регистрами общего назначения).
- Память (восьмибитный процессор адресует 256 адресов по восемь бит - итого аж два килобайта).
- Отдельный стек (об этом ниже).
- Ну и просто числа (константы).
Изначально - четыре типа данных, на перечисление которых нужно два бита. Если у каждой команды по два параметра (например, MOV A,B), то получается, что нужно засунуть набор "команда"+4 бита в пространство, кратное восьми битам. Брать шестнадцать бит - несколько избыточно, восемь - как-то маловато (четыре бита на команду - не от этого ли я хотел убежать?).
Но, тем не менее, я выбрал именно восьмибитный размер опкода. Я рассудил так: вряд ли меня хватит для реализации более чем 16 полноценных команд. А если хватит - расширить размер опкода можно будет без проблем.

Для начала я решил сделать шесть основных команд. Ниже приведена таблица, описывающая набор инструкций и типы данных, с которыми они работают:

Код (hex)


Мнемоника


Действие и параметры


0x0


NOP


Пропуск такта.


0x1


MOV


Копирование (не перемещение!) значения в приёмник.

MOV [R|S|M],[R|S|M|V]


0x2


XOR


Побитовый XOR значений. Результат помещается в приёмник.

XOR [R|S|M],[R|S|M|V]


0x3


SUM


Суммирование значений. Результат помещается в приёмник.

SUM [R|S|M],[R|S|M|V]


0x4


SHL


Левое смещение приёмника на указанное количество позиций.

SHL [R|S|M],[R|S|M|V]


0x5


SHR


Правое смещение приёмника на указанное количество позиций.

SHL [R|S|M],[R|S|M|V]

Обозначения: R – регистр (значение указанного регистра), M – память (значение по указанному адресу), V – значение (константа), S – стек (если указан в качестве приёмника – добавление в стек, в качестве отправителя – изъятие из стека).

Оставшиеся десять команд запланированы под условные переходы и остальную математику.
Да, типы данных пронумерованы просто: 00 - константа, 01 - регистр, 10 - стек, 11 - память.
Возьмём байт, скупо отведённый на команду, верхние четыре бита в нём считаем кодом команды, пятый и шестой бит - типом первого операнда, седьмой и восьмой бит - типом второго операнда.
Например, опкод команды MOV, пересылающей данные из регистра в память будет выглядеть так: 00011101. Та же команда, заносящая значение в регистр будет выглядеть как 00010100, а команда левого сдвига верхушки стека на заданное число - 01001000.

Кстати, о стеке. Он у меня необычный по двум причинам (чтобы понять необычность которых, нужно всё-таки знать, что такое стек).
Первая: я не стал реализовывать стек в основной памяти. Её и так мало (два килобайта, напомню), да плюс на адресацию стека нужно выделять, как минимум, один регистр. При этом совершенно ничего не мешает добавить в нашу схему ещё два килобайта памяти, и использовать под стек уже её (да, это отход от фон Неймана, да...). Это даже не ограничивает многозадачность, ежели таковую когда-нибудь придётся реализовать на этом процессоре, - стековую память точно так же можно поделить на участки по количеству исполняемых программ.
Вторая: у меня нет привычных по ассемблеру для x86 команд PUSH и POP (или аналогичных им). Во-первых, выделять ажно две отдельные команды из имеющегося лимита ой, как не хотелось. Во-вторых, ещё при изучении ассемблера, мне было интересно - а почему бы не сделать именно так? В итоге, команда MOV S,[V|R|M] должна работать аналогично PUSH [V|R|M], а MOV [R|M],S - аналогично POP. Команда MOV S,S хоть и не запрещена, но никакого действия не выполнит (при этом она не будет равна NOP по количеству тактов).

Итого, в результате у меня набралось данных на вполне себе ассемблер для моего ещё не созданного процессора. Ниже приведу примеры команд и трансляцию их в шеснадцатеричный и двоичные коды:
MOV [1Ah],10h (записать число в память)-> 0x1C 0x1A 0x10 -> 00011100 00011010 00010000
SUM B,C (прибавить к значению регистра B значение регистра С) -> 0x35 0x01 0x02 -> 00110101 00000001 00000010
XOR S,S (обнулить значение на верхушке стека) -> 0x2A -> 00101010 (параметров у команды нет, то, что работа проводится со стеком, процессор должен понимать из опкода).
и т.д.

И последнее, что осталось - определить и формализовать алгоритм работы процессора. У меня в первом приближении получилось вот что:
1. Считать байт по адресу, на который указывает адресный регистр (adr), в буфер команды, инкрементировав adr.
2. Определить количество параметров команды = pcount.
3. Инкрементируя значение адресного регистра, считывать параметры в соответствующие буфера (n_param в n_buffer) pcount раз.
4. Выполнить команду.
5. Вернуться к шагу 1.

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

С теорией, по большей части - всё.

Конец первой части. В следующей - практика: опишу создание парсера команд, контроллера памяти, блока регистров и управляемого цикла.
Продолжение следует.

read more at Журнал Великого Позитроника

pozitronik: (Default)
00:48 14.02.2013
Goodnight, sweet prince
Опера теперь будет на WebKit.
Не знаю, хорошо это, или плохо - но уверен, что это будет уже не тот браузер, который я люблю.

read more at Журнал Великого Позитроника

pozitronik: (Default)
20:30 07.02.2013
Слава прогрессу
Нарастил в пекарне память до 8Гб (из того расчёта, что DDR2 дешевле уже никогда не будет). Обошлось в копейки; переносясь мысленно на годы назад с ужасом вспоминаю цены на плашки и их объёмы: Первая пекарня долго жила на 32Мб, потом с миру по нитке в неё втыкались другие плашки, и так до 256Мб. Вторая пекарня была с гигабайтом, кажется, потом доросла до двух.
Надеюсь, теперь не будет лагать цива и сервера в виртуалке.

read more at Журнал Великого Позитроника

December 2016

S M T W T F S
    123
45678910
1112131415 1617
18192021222324
25262728293031

Syndicate

RSS Atom

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 3rd, 2025 07:48 am
Powered by Dreamwidth Studios