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)
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: (Sheridan)
20:34 19.02.2013
Оргазм робокопа
Я с детства любил головоломки и конструкторы в любом их виде, от советских клонов "Лего" (такие были, да), до всяких там скандинавских кроссвордов (которые, как и обычные, мы с батей разгадывали наперегонки в неимоверных количествах).
Оставив место для ностальгии по тем детским увлечениям, я резко перепрыгну во времена учëбы в институте. Программирование я выбрал именно потому, что это головоломка и конструктор в одном флаконе, и по той же причине я любил предметы, также сочетавшие в себе эти свойства.
К примеру, замечательная дискретная математика. Я просто кончал радугой, выводя преобразования всяких конъюнкций и стрелок Пирса (ещё там был штрих Шефнера, но мне не нравилось, как он на меня шипел), строил связные графы и оперировал множествами. Такая-то годнота - и был еë курс мал и короток. Самый базовый уровень, явно недостаточный для подготовки хорошего программиста - по-хорошему, такое надо давать ещё в школе.
Потом было низкоуровневое программирование, здорово вскипятившее мне мозг. Пожалуй, самый лучший курс за всë время - и тоже непростительно куцый. Программирование на ассемблере в реальном режиме под DOS, никакого protected mode или работы с API любых OS. Только-только пошло что-то годное - как курс закончился; зато, блин, как же мы без метрологии или без экономики?
Но самой большой несправедливостью, до сих пор отзывающейся тянущей болью в сердце, является наш курс электротехники.
Электромашины никак не давались мне, и предмет этот был жуткой пыткой. Трëхфазные электродвигатели, сельсины (или синсины? до сих пор не знаю, что это такое), реле и прочий стафф - всë это было не головоломкой и не конструктором, а только грудой мусора, работающего на физических законах, которые я отказывался соблюдать не мог упорядочить и понять. Так что электротехнику я ненавидел до тех пор, пока курс не дошëл до проектирования логических элементов.
О, прекрасные полупроводники! Как только ШМИГИРИЛОВ, ДА-ДА, ИМЕННО В ВЕРХНЕМ РЕГИСТРЕ, рассказал, как на них реализуется любимая мной булева алгебра - я, наконец, осознал, зачем был этот год пыток электричеством! Вот оно - понял я - теперь мы будем проектировать свой процессор, со своей архитектурой, если не аналог 286, то 8080 уж точно! Создадим для него свой набор команд, и собственный ассемблер! Омайгад, как же круто!
Естественно, всë ограничилось лабой на проектирование простеньких сумматоров и мультиплексоров. Одно занятие!
Я разочаровался и ушëл в запой.

Собственно, вся эта портянка была только предисловием. Дело в том, что я тут наткнулся на вот такую штуку: Logisim. Это простой и понятный даже школьнику инструмент проектирования логических схем. И, как гласит его документация, в нормальных учебных заведениях этот софт [зависть]реально используют для учëбы [/зависть]. Я повозился с ним - и мне кажется, что несколько часов работы в этой программе стоят больше всего нашего курса электротехники. Я конкретно залип, начав сначала строить элементарные схемки, вроде тех же сумматоров. Потом, было, дёрнулся собрать что посложнее - и обнаружил, что позабыл все логические правила, как что из чего выводится. Ну это не беда, в сети есть учебники, рассчитанные на читателей любого уровня: я, например, вспоминал основы по этой методичке.

Стоп, тут технически необразованый читатель спросит меня: а, собственно, что это вообще такое вот? Мудоплексоры какие-то, агебра булимическая, одна история лучше другой просто!
Так вот: булева алгебра и логические законы - это, собственно, то, благодаря чему работают все наши компьютеры, телефоны, и прочая цифровая техника.
Благодаря некоторым физическим законам (которые я сейчас понимаю не лучше прежнего) возможно создание полупроводниковых элементов, на которых, в свою очередь, реализуются элементы логические. То есть такие, которые оперируют только понятиями "истина" или "ложь"; в нашем аналоговом мире оказалось очень удобно кодировать эти понятия лепездричеством. Есть напряжение на контакте - "истина" (1), нет - "ложь" (0). Поскольку понятий у нас всего два, то и базовых операций над ними немного - но комбинируя эти базовые операции (реализованные, как раз, логическими элементами), можно вывести всё более сложные; за основами отошлю в вышеуказанную методичку. Суть же в том, что можно задать любое непротиворечивое логическое правило (или их набор), записать его формулой, а по этой формуле построить электрическую схему.
Собственно, вся электронная начинка наших девайсов и состоит из таких схем. Конечно, очень сложных, но, тем не менее: сверхсовременный многоядерный йоба-процессор на этом уровне ничем не отличается от логических машин середины прошлого века. А уж про то, что комбинациями нулей и единичек можно кодировать абсолютно любую информацию - про это я рассказывать не буду, о таком стыдно не знать.
Но хватит теории. Слева я нарисовал простейший полусумматор, реализованный только базовыми элементами - НЕ/И/ИЛИ (инвертор,/конъюнктор/дизъюнктор или, в сишной нотации, !/&/|), - два бита на вход, их сумма в двоичном виде на выходе:
Справа такой же сумматор, но в нём меньше "деталек" - из базовых элементов можно собрать новую деталь - ИСКЛЮЧАЮЩЕЕ ИЛИ (он же XOR), или, с тем же успехом, воспользоваться уже встроенной в программу деталью. Кстати, по умолчанию программа использует ANSI-стандарт изображения элементов, но в настройках можно переключиться на другие стандарты, кому как удобнее.

Собранные схемы можно использовать для дальнейшего конструирования. Так, например, из полусумматоров собирается сумматор, оперирующий уже тремя битами (то есть умеющий считать уже от нуля до трёх, а не до двух, как полусумматор):
Из сумматоров можно собрать более сложные устройства, складывающие любые числа, но это уже не так интересно - просто повторение пройденного.
А вот что показалось мне действительно интересным - так это создать схему, выводящую на восьмисегментный индикатор шестнадцатиричное представление двоичного числа, закодированного в четырёхбитном регистре (четыре бита кодируют числа от 0x0 до 0xF). Индикатор в программу встроен, позиция контактов у него аналогична индикатору TIL321 от Texas Instruments. Восьмой контакт, кстати, не понадобится - он отвечает за сегмент точки, таким образом на входе получается четыре бита, на выходе - семь.

Для начала я сделал таблицу, расписывающую, какие сегменты (R1 - R7) должны гореть при той или иной цифре, а также представление этой цифры в двоичном коде (A,B,C,D):

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

(!A&!B&C&!D)|(!A&!B&C&D)|(!A&B&!C&!D)|(!A&B&!C&D)|(!A&B&C&!D)|(A&!B&!C&!D)|(A&!B&!C&D)|(A&!B&C&!D)|(A&!B&C&D)|(A&B&!C&D)|(A&B&C&!D)|(A&B&C&D)

Это правило вполне рабочее, и уже по нему можно построить схему, которая даже будет включать нужный сегмент:
Но понятно, что такая схема - это дерьмос собачес, и инженера, который такое воплотит в кремний, ШМИГИРИЛОВ будет анально сношать в пукан магнитным сердечником. Чтобы сберечь пукан, применяю чудеса логических законов для получения эквивалентного правила:

!A&(!B&C)|B&(!C|!D))|A(!B|B&(C|D))

Если вы дочитали до этого места, сейчас вы ругаетесь. Примерно так: каким это хреном автор выкинул больше половины закорючек?
На самом деле я выкинул все промежуточные приведения и расчёты - а их там на несколько страниц, если с подробностями, которые вам тут совершенно неинтересно будет читать (а мне лениво писать) Поначалу я себе так и расписывал, тратя по несколько часов на одно правило. Потом, когда запомнил законы - стал пропускать промежуточные записи, тратя минут по десять на правило. А потом совсем научился, и стал записывать правило, просто глядя на таблицу; в этом действительно нет ничего сложного, если уметь в логику.

Итак, по сокращённому правилу получается такая схема:

Причём, благодаря всё тем же логическим законам, схема может быть и такой (количество элементов одно, а контакты разные), они полностью эквивалентны:

Но не суть.
В итоге, потратив некоторое время (если честно, меня так увлёк процесс, что я даже не мог заснуть), я нарисовал схему полностью:
Да, собственного удовольствия ради я снова использовал только базовые элементы; введи я, скажем, тот же XOR - схема выглядела бы (но не была на самом деле!) на порядок проще и меньше. Например, если не выпендриваться, и заключить каждую цепь в отдельный блок, то схема будет выглядеть лишь так:
Смотрим на работу:
Кайф испытываю неописуемый, хочется даже написать про это в бложек... WAIT, AW SHIT!
Файл со схемой можно загрузить по ссылке.

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

Поскольку мой блог читают, в основном, люди с техническим образованием и Констпаус, думаю, что это было интересно.

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 Журнал Великого Позитроника

pozitronik: (Default)
14:07 07.02.2013
О чистке зубов
С самых ранних лет я не любил чистить зубы. Первой причиной было то, что они всё равно постоянно выпадали, чисть их, или не чисть, второй - то, что привкус зубной пасты портил вкус завтрака. До сих пор помню как мама однажды принесла откуда-то настоящий грейпфрут, я съел свою дольку за завтраком и долго плевался, узнав, что цитрусы после зубной пасты есть категорически невкусно.
Потому лет до десяти зубы я чистил как-то так, без энтузиазма. Что, соответственно, участило мою встречу со стоматологами и ужасными советскими пыточными бормашинами.
Знаете, перспектива встречи с визжащей бормашиной и врачом-садистом (я уверен, что в те времена в зубники могли идти работать только латентные маньяки - и это нормально, нужно обращать свои недостатки в достоинства) сильно усилила мой зубоочистительный энтузиазм.
Осталась проблема с изменением вкуса. К тому же, думал я, какой смысл чистить зубы ДО завтрака, если после завтрака их всё равно надо чистить заново?
Мой детский (но уже проявляющий зачатки одарённости) ум сложил логические факты и выработал идею, которая позже закрепилась в привычку: я начал чистить зубы по утрам дважды - до завтрака без пасты, и после завтрака - с пастой. И делаю так до сих пор.

Удивительно, но никто из родственников и знакомых больше так не делает. Я недоумеваю - почему? Это же абсолютно логично и эффективно.

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

pozitronik: (Default)
21:44 05.02.2013
Из жизни пресмыкающихся
Возникла задача: сделать определённому юзеру больно запрет на удаление определённого каталога (да ещё лежащего в его пользовательском каталоге). Читать-смотреть можно, удалять-изменять - нельзя. Только сделать это надо непременно из командной строки - чтобы была возможность автоматизировать действие (ну а то галочки в свойствах безопасности каждый может проставить).
Казалось бы - icacls делает всё, что надо.
Где-то с этой мыслёй я провозился два часа, не добившись результата. Как только выставляю через icacls запрет на удаление объекта - пропадает возможность просмотра каталога (при этом права те, которые нужны). Выставляю права на просмотр/чтение - появляется возможность удалять (а запрет на удаление в правах всё остаётся по прежнему).
Это не говоря уж о том, что многие ключи в консольной справке icacls выглядят совершенно одинаково, и никаких пояснений этому не даётся. Например:
R - доступ только на чтение
RC - чтение
GR - общее чтение
RD - чтение данных, перечисление содержимого папки

Вот чем они отличаются?

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

Ладно, я же дипломированный сантехник по компьютерам. Должна быть возможность просмотреть ACL, в формате, понимаемом утилитой. Останется поставить разрешения мышкой, посмотреть ACL, а затем его тупо копировать. Тем более, что в MSDN написано - вызвать icacls для объекта без параметров, он и покажет все права.
Пытаюсь - еггог.

Видимо, я уже ждал подсознательно такой подляны, поэтому что сразу полез перепроверять на сервер (W2008R2). На сервере это работает. Также, как и опция /setowner, и ещё несколько опций, которые, по каким-то непонятным причинам, отсутствуют в icacls на Win7Pro.

Ну вот какого хрена, а?

Ладно, делаю, что придумал. Выставляю права, смотрю список прав:

username:(OI)(CI)(DENY)(D,Rc,WDAC,WO)
username:(OI)(CI)(W,RD,REA,X,DC,RA)


(при этом все доступы такие, как и требуются)

Из этого получаю вот такую команду:

icacls "путь к каталогу" /inheritance:d /remove username /grant username:(OI)(CI)(W,RD,REA,X,DC,RA) /deny username:(OI)(CI)(d,Rc,WDAC,WO)

Поясню: опция /inheritance:d нужна для того, чтобы отменить наследование прав от вышестоящего каталога, владельцем которого пользователь является, при этом не стирая их, а копируя. /remove нужно, чтобы удалить прежде выставленные права пользователя (иначе вносимые права просто допишутся к имеющимся).

Вроде оно. Но при попытке обратиться к этому каталогу из под указанного пользователя возникает ошибка отсутствия доступа (хотя все права остаются ровно теми же)!
Иду в свойства, меняю ЛЮБОЕ из них, возвращаю обратно (т.е. не меняется НИЧЕГО) - всё начинает работать.

Вы видите в этом логику? Я нет.
Ковыряю дальше.

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

Нефть

Feb. 3rd, 2013 03:20 pm
pozitronik: (Sheridan)
14:38 03.02.2013

Нефть

Мы бредём по пустоши к бункеру, проклиная палящее солнце, от которого не спасают плотные шерстяные куфии. Среди жалких лачуг надземный этаж бункера, огороженный бетонным забором, на контрасте смотрится дворцом падишаха из сказочной Аграбы. А вокруг — только пыль, людей у лачуг не видно — хотя, может быть, тут уже и вправду никто не живёт.
В сотне метров до ворот мы садимся прямо на дорогу. Она еле обнаружима — ни ноги, ни колёса не оставляют следов на этой засохшей, почти застекленевшей корке; разве что гусеницы танка смогут оставить несколько царапин. Но сходить с этого едва заметного пути нельзя — мины. Через некоторое время к нам подходит охранник с собакой и автоматом. С вышек за забором его прикрывают невидимые нам снайпера. Собака рычит и нервничает.
Мой напарник начинает говорить с охранником по-арабски. Я, хотя и закутан в бурнус, на этом языке не говорю. Понимаю достаточно. Напарник — тоже далеко не араб, но местные обычаи требуют именно этого: арабской одежды, арабских обычаев, даже зовёмся мы здесь арабскими именами. На истинное лицо и национальность всем насрать, они для местных просто не существуют.
«Мы по приглашению халифа Рамзана» — говорит напарник охраннику, добавляя несколько ритуальных фраз. Охранник с кем-то совещается по рации, и после короткого ответа даёт знак подниматься, ведя нас к воротам.
За воротами нас обыскивают. Каждая складочка тела не только обследуется охраной, но и обнюхивается собаками. Я стараюсь не менять выражение лица, когда клыкастая морда тыкается в мои гениталии. Одного движения бровью может оказаться достаточно для того, чтобы охрана открыла по нам огонь. Затем нас просвечивают рентгеном.
Но, наконец, с обыском закончено. Мы одеваемся, собираем вытряхнутые рюкзаки, и идём по кажущемуся бесконечным коридору. Он петляет во всех направлениях — вниз-вправо-вниз-влево-вверх... Уверен, что несколько раз мы прошли по одному и тому же участку. Прямой путь должен быть гораздо короче, к тому же я знаю, что есть лифт. Но нас положено вести по тоннелю, то ли чтобы запутать, то ли, чтобы создалось ложное впечатление о размерах бункера.
Впрочем, приблизительные размеры мне всё равно известны — я видел разведданные с геоспутника. Бункер и вправду огромен, это настоящий небоскрёб, зарытый в землю. Крепость, абсолютно защищённая и автономная.
Наконец, наши блуждания заканчиваются. Перед последней дверью мы снимаем обувь и входим внутрь босиком. Охранник удовлетворённо кивает, как будто мы прошли очередную проверку.
Внутри — настоящий дворец. Высокие потолки, в которых сделаны фальшивые окна с лампами дневного света. Ковры, покрывающие каждый квадратный сантиметр пола — кроме тех мест, где из него растут деревья. В нескольких метрах от входа стоит знаменитый золотой «Хаммер» Рамзана — и тут наверняка достаточно места для того, чтобы на нём кататься.
Охранник передаёт нас слуге, который, семеня, ведёт нас в царские покои. Проходя мимо «Хаммера» я еле удерживаюсь от того, чтобы прикоснуться к нему. Но сдерживаюсь; это охранники скрылись с наших глаз, а не мы – с их.
Халиф Рамзан встречает напарника как старого знакомого, и они обмениваются ритуальными фразами на чеченском, который я знаю ещё хуже, чем арабский. Меня же он сначала словно не замечает, и только завершив приветствие, начинает спрашивать, из вежливости переходя на русский язык.
«Кто это сегодня с тобой, Махмуд?» — как бы невзначай интересуется Рамзан, неловко улыбаясь. Он похож на свой портрет — добродушная улыбка на округлом, бородатом лице, мохнатые брови, смешно оттопыренные уши — этакий полукарикатурный добрячок. Невозможно поверить, что этот добряк в расшитом золотом халате, в прошлую войну собственноручно перерезал шеи пленным перед камерой.
«Это мой друг Ибрагим, — отвечает напарник, — он теперь работает вместе со мной вместо Абу». Рамзан кивает: «Я слышал о том, что случилось с Абу, — и обращается ко мне, — здравствуй, Ибрагим». Я отвечаю тщательно выученным приветствием на чеченском, Рамзан отвечает мне. Я слегка расслабляюсь — после обмена приветствиями с хозяином, мы считаемся гостями, и по закону гостеприимства, считаемся неприкосновенными.
Без лишних слов Рамзан ведёт нас в зал удовольствия. Так называется выложенная кафелем небольшая комната с несколькими стоящими в ряд кушетками. Она напоминает обычный больничный кабинет — то ли запахом антисептиков, то ли бактерицидными ультрафиолетовыми лампами, включающимися, пока в зале никого нет.
Пока мы достаём из рюкзаков пакеты, Рамзан снимает штаны и укладывается на кушетку. Бесшумно появившаяся медсестра берёт у нас конец шланга, присоединяет к нему одноразовый наконечник, и вводит его Рамзану в прямую кишку. Напарник набирает на электронном замке пакета свою часть кода, затем я набираю свою. Чёрная маслянистая жидкость начинает стекать по шлангу; через несколько секунд Рамзан уже стонет от удовольствия. По телу пробегает дрожь, потом его начинает трясти так, что медсестра пытается пристегнуть Рамзана к кушетке ремнями. Он, крича что-то на чеченском, с силой отталкивает её, сестра встаёт с пола, потирает ушибленное место, и убирает ремни.
Мы выходим из зала удовольствий, оставляя Рамзана наедине с его нефтяным кайфом. Тот же — или уже другой, они все на одно лицо — слуга ведёт нас в гостевую залу, где уже разлит по пиалам ароматный чай, а на подносах лежат фрукты и сладости. Ждать хозяина не имеет смысла — у него впереди несколько часов блаженного погружения в нефть — и мы разваливаемся на подушках.
Пока мы едим, начинает темнеть. Конечно же, это только снижают яркость лампы, но иллюзия полнейшая. Ощущение наступающей ночи дополняет пение цикад — и я даже не уверен, что это запись. Напарник откинулся на спину и, кажется, дремлет, я же продолжаю щипать виноград, которого на столе десятки сортов.
Из наступившей темноты прожектор выхватывает несколько женских тел, воздевших руки к потолку — хотя так и хочется сказать «к небу». Пение цикад сменяет музыка, девушки начинают танцевать. Из одежды на них только газовые, полупрозрачные, платки и ожерелья, прикрывающие соски огромных грудей, покачивающихся в ритм танцу.
«Хороши?» — я вздрагиваю от неожиданности, обнаружив рядом с собой Рамзана. Он расслабленно улыбается, но от его карикатурной доброты уже нет и следа; черты лица словно заострились. Возможно, это из-за освещения, но, что вероятнее — из-за наркотика. Взглядом Рамзан указывает на предметы вопроса, которые в танце изгибаются в неподвластных уму позах.
«Да, Рамзан, — отвечаю я, — очень хороши. А понравилась ли тебе нефть?». Рамзан смеётся: «Очень, очень понравилась! Передайте вашему царю, что пока он присылает такие подарки, мы будем с ним хорошими друзьями».
Мы какое-то время молча наслаждаемся зрелищем.
«Выбирай» — говорит Рамзан, царским жестом указывая на танцовщиц, когда их божественное шоу, наконец, заканчивается. И я выбираю.
«Рамзан, — говорю я, — перед тем, как уединиться с прекрасной гурией, я бы хотел посетить отхожее место, ибо, боюсь, переусердствовал с угощением». Халиф снова улыбается, хлопает в ладоши, и слуга ведёт меня в царскую уборную.
Как оказывается, у Рамзана есть не только золотой «Хаммер». В уборной всё сделано из чистого золота, даже ручка зубной щётки, не говоря уже о таких вещах, как унитаз. На стене висит телевизор, включающийся сам собой, как только я устраиваюсь на очке. Показывает телевизор самую пошлую и прозаическую порнуху.
Закончив своё дело, я запускаю руку в экскременты, и, покопавшись, нахожу несколько яблочных зёрнышек. На самом деле это капсулы с крохотной дозой бесцветного нейротоксина — и я давлю одну из них прямо над щетинками золотой зубной щёткой халифа.

Нейротоксин, попав на слизистую оболочку, запустит медленную и неизбежную смерть. Через неделю Рамзан тяжело заболеет и скоропостижно скончается — и никто не сможет связать его смерть ни с нами, ни с нашими заказчиками. А о том, чтобы в голове преемника Рамзана были только нужные нам мысли — об этом мы позаботимся.
Ведь нефть — это не единственное средство.



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

pozitronik: (Sheridan)
14:36 25.01.2013
Квартирный вопрос
О чём может мечтать холостой провинциал, не имеющий ни постоянного жилья, ни нормальной работы, ни достойного образования? О чуде, которое моментально исправит хотя бы половину перечисленных неприятностей. Например — о внезапно появившейся московской супруге, которая тут же устроит его старшим протирателем штанов в собственную фирму, заодно поселив на своей жилплощади. Можно даже не в особняк на Рублёвке, достаточно пятикомнатной квартиры в шаговой доступности от метрополитена — Жорик Семка был бы рад и тому. По правде сказать, он был бы рад и куда меньшей халяве — но мечтать, как говорится, не вредно.
Вот Жорик и мечтал, выходя на всю мощность мечтательного аппарата где-то ко второй баклажке химического пойла, которое по явному недоразумению выдавалось за пиво. Полёту фантазии помогал телевизор, оптимистично рассказывающий о том, как с каждым днём жить простому российскому гражданину становится всё лучше и лучше.
— Знаменитый актёр Жерар Депардье принял из рук президента российский паспорт, а власти Мордовии подарили новоиспечённому россиянину квартиру в одной из новостроек Саранска — с неизменной улыбкой сообщала ведущая новостей.
— И мы все знаем имя этого гражданина! — вспомнил Жора бородатый анекдот, выключая телевизор. Чёрт, он бы тоже не отказался от жилья в Саранске... а где это вообще? Где-то на Волге, кажется? Волга... Жорик слышал от родителей, что их семья корнями тоже откуда-то с волжских деревень, но где была та деревня хотя бы приблизительно — не знал. Мама о своей деревенской жизни рассказывать не любила — судя по подслушанному однажды разговору, вышла у неё какая-то серьёзная размолвка со своей матерью, жориной бабкой. А спросить сейчас — уже не у кого, разве что съездить на кладбище, к могилке маминой. А ведь давно не ездил, ох, давно...
— Жерар, млять... — обозлённо рявкнул Жора на выключенный телевизор, стараясь отвлечься от нежданного укора совести. — Я тоже почти Жерар! Путину напишу, пусть мне тоже квартиру даст! Или, лучше, позвоню — должен же у него телефон быть...
Тут, как по совпадению, из телефона, брошенного Жориком заряжаться на тумбочку, завопил поставленный на входящие вызовы "Гангнам стайл!".Читать дальше )

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

pozitronik: (Sheridan)
21:26 14.01.2013
Про разработку, хостинги и SEO
Несколько месяцев назад мне пришлось понемногу начать вникать в способы раскрутки сайтов - в основном для того, чтобы оптимизировать под это дело движок нашего крутого стартапчика. Вник, оптимизировал, да так, что посещаемость начала расти скачкообразно.
После этого начались заметные проблемы с хостингом - а хостились мы на majordomo. Сайт при наплыве пользователей постоянно отваливался, а обновлять его вообще было сущим наказанием. Судя по всему, промежуточный nginx у них настроен так, что кеширует статичные файлы, и обновляет кеш очень редко. Из-за этого исправлений не было видно целыми сутками.
Конечно, это нас не устраивало, и мы подумывали о переезде на нормальный VPS. Но не успели - в конце декабря majordomo совсем сдох.
То есть вообще. FTP хостинга был доступен только в read only, а сайт ложился от малейшего чиха. До техподдержки было не достучаться, и только четвёртого января пришла рассылка о том, что у них накрылась волосатым куском мяса ZFS, и что починят через четыре дня, не раньше. Пять дней они молчали. Не было инфы ни на сайте, ни в админке хостинга, нигде. Я, конечно, сам работал в саппортах, и тоже косячил - но пять дней, пусть даже новогодних, без оповещения - это что-то за гранью.
Притом, что интересно, наша популярность росла, и даже на полудохлый сайт умудрялось заходить несколько сотен посетителей в день.
Седьмого января хостинг лёг окончательно, а саппорт включил окончательного дурачка.
Конечно мы при первой же возможности переехали, и теперь всё хорошо. Остаётся только жалеть о потерянной посещаемости (она наверняка продолжала бы расти эти дни).

А ещё попиарю одну доделку, может кому пригодится: https://github.com/pozitronik/fc-trackbar
Это моя доработка проекта FC-TrackBar, слайдера для выбора диапазонов значений, написанного на JavaScript (полное описание и примеры есть тут). Проект, судя по всему, заброшен, а жаль: из виденных мной подобных JS-контролов этот оказался самым удачным. До этого я пользовался DoubleTrackBar by Homm, но в нём оказалось слишком много недостатков (например, он не умеет инициализироваться с предустановленными значениями).
Короче, я дописал в FC-TrackBar метод onMoveEnd (событие, вызываемое при окончании перемещения ползунков), и прибил багу с некорректной инициализацией правого ползунка.

Всем бань, посоны.

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

pozitronik: (Default)
17:00 14.01.2013
Шеридан во вторую мировую.
Был очень удивлён, увидав капитана Шеридана на этой фотографии. Неужто Великая Машина с Эпсилона-3 помотала его по времени куда больше, чем рассказано Стражинским?



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 Apr. 23rd, 2025 01:24 pm
Powered by Dreamwidth Studios