Как стать автором
Поиск
Написать публикацию
Обновить
0
Александр Агуленко @agulread⁠-⁠only

Пользователь

Отправить сообщение

Silverlight + Augmented reality + Shaders

Время на прочтение6 мин
Количество просмотров3K
Привет всем.

Я люблю работать с Silverlight, и вот недавно натолкнулся на Дополненную реальность с использованием Silverlight. Про неё и на Хабре уже писали, и в блогах довольно много написано, но я всё же немного повторюсь. Сама идея дополненной реальности интересна, но я хотел использовать её как-то необычно. И вот недавно руки дошли до изучения пиксельных шейдеров. Стало интересно попробовать соединить это вместе.

Если интересно, что из этого получилось, то Добро пожаловать под кат:
Читать дальше →

Стековый язык программирования на JavaScript в 34 строки

Время на прочтение3 мин
Количество просмотров2.4K

Информация для тех кто не знает что такое стековый язык:

Следующая строка подло скопирована с Wikipedia
Стековый язык программирования — это язык программирования, в котором для передачи параметров используется машинная модель стека.

О языке

Язык будет очень простым, так например функции могут принимать только один параметр, но тем не менее будет возможность сопоставления с образцом. Присутствует всего лишь один тип, а именно число.

Функция с сопоставлением будет определяться следующим образом:
value name = operations
Где value это шаблон для сопоставления, a operations это тело функции.

Если же определяется функция без сопоставления то она будет записана следующим образом:
name = operations
Но в теле функции можно использовать константу op значением которой будет операнд с котором была вызвана функция то-есть вершина стека.

Что-бы ввести в стек значение нужно просто ввести число.

А что-бы перевести верхний элемент стека в переменную нужно написать:
-> name
Из стандартных операция будут только + — * /

Так например функция увеличения элемента с вершины стека на 1 будет записана так:
++ = op 1 +

А вот для реализации функция факториала потребуется сопоставление с образцом и кодом будет:
0 ! = 1
! = op 1 - ! op *




Реализация

Будет написан только интерпретатор, который будет реализован как контекст.
Работу с этим контекстом будет осуществлять отдельный скрипт. В подробности которого мы вдаваться не будем. Скажу лишь то что он выводит в «консоль» вершину стека или 'nil'

Первые шаги

Первым делом мы как и полагается опишем контекст как конструктор и обозначим его HContext

HContext = function(){
this.stack = []; //Стек
this.vars = []; // Переменные
this.funs = []; //Функции

}


Затем создадим самую главную функцию 'run' аргументом которой будет код, а сама функция разделять его на лексемы и затем если окажется что это определение функции она вызовет нужную функцию иначе она вызовет функцию выполнения кода.

this.run = function(code){
lexems = code.split(' ');
if(lexems.oneOf('=')){
this.define(lexems);}else{
this.exec(lexems,'');}}

Примечание:те кто внимательно читали код могли заметить метод oneOf, это метод из так называемого мной extend.js который был написан мной после того как я прочитал фразу «Если тебе что то нужно, но этого еще нет, то создай это сам.», в дальнейшем функции из этой библиотеки также будут применяться.

Теперь напишем функцию exec которая будет выполнять код. В самом начале если аргумент op не определен то присвоим ему значение 3.

Затем создадим цикл который будет шагать по массиву из лексем и в зависимости от лексемы выполнять различные операции.
Если это 'op' — положить значение op в стек.
Если это число — положить его в стек.
Если есть переменная с таким именем — положить её значение в стек.
Если есть функция с таким именем — вызвать её. Функция call
Если одна из математических операция — вызовем её. Функция mathOp
А если это -> — увеличим счетчик на 1 и присвоим переменной имя которой есть текущая лексема значение с вершины стека.

this.exec = function(code,op){
op = op || 0;
for(var cp=0;cp<code.length;cp++){
if(code[cp]=='op'){this.stack.push(op)}
else if(code[cp].isNum()){this.stack.push(parseFloat(code[cp]))}
else if(this.vars[code[cp]] != undefined){this.stack.push(this.vars[code[cp]])}
else if(this.funs[code[cp]] != undefined){this.call(code[cp])}
else if(this.mathOps.oneOf(code[cp])){this.mathOp(code[cp])}
else if(code[cp] == '->'){cp++;this.vars[code[cp]]=this.stack.pop();}}}//


Математические операции


Создадим массив с возможными математическими операциями.
this.mathOps = ['+','-','*','/'];

А теперь определим функцию. которая будет брать два верхних значения из стека и класть результат операции на верх стека.

this.mathOp = function(op){
nums = [this.stack.pop(),this.stack.pop()];
this.stack.push(eval(nums[1] + ' ' + op + ' ' + nums[0]));}


Функции

А теперь поговорим о функциях, как уже было сказано будет сопоставления но его реализация будет очень простой за счет простой модели хранения функций.
Функции будут храниться в списке funs, и при этом каждая функция будет списком в котором элементом с ключом 'op' будет функция без сопоставления, а все остальные будут с сопоставлением и при этом ключ и будет шаблоном для сопоставления.

Напишем метод определения функции:

this.define = function(code){
eq = code.pos('='); //Определим позицию знака равно
op = code[eq-2] || 'op'; //Шаблоном будет элементом с ключом на 2 меньше знака = но если его нет то 'op'
name = code[eq-1]; //Именем будет элементом с ключом на 1
cmds = code.slice(eq+1); //А телом будут все элементы с ключом на 1 больше
if(this.funs[name] == undefined){this.funs[name] = [];} //Если функция с данным именем отсутствует, то определим
this.funs[name][op] = cmds; //Теперь занесем это в массив функций}


А теперь будем вызывать функции, для этого выделим метод call (Большинство, а особенно программисты на ассемблере точно не найдут название смешным)

this.call = function(fun){
op = this.stack.pop(); //Получаем операнд
cd = this.funs[fun][op] || this.funs[fun]['op']; //Ищем функцию с совпадением иначе берем универсальную
this.exec(cd,op);} //И выполняем её код


Попробовать:

Псевдо-консоль находится тут. Там же расположены примеры.

MODx — собственный ajax календарь событий/новостей без Ditto

Время на прочтение8 мин
Количество просмотров11K
Задали мне тут намедни задачку: сделать календарь событий на ModX Evolution.
Движок этот я искренне люблю, за его небывалую гибкость и лично мне понятность.

Задача показалась простой, но по мере выполнения встретился с парой сложных моментов.
Итак, кто хочет сделать у себя на сайте календарик с всплывающим списком событий — прошу под хаброкат!

Читать дальше →

Библиотека CssUserAgent

Время на прочтение2 мин
Количество просмотров1.1K
На просторах англоязычного интернета наткнулся на javascript библиотеку с говорящим названием CssUserAgent. Если говорить вкратце, то при загрузке страницы на тег html навешиваются классы следующего вида:
ua-browsername
ua-browsername-major
ua-browsername-major-minor
ua-browsername-major-minor-build
ua-browsername-major-minor-build-revision

Под катом описание профита.
Читать дальше →

Восстановление сохраненного пароля pppoe сессии из маршрутизатора

Время на прочтение2 мин
Количество просмотров33K
Бывает ситуация, когда вы уже пару лет пользуетесь интернетом через свой роутер и, что естественно, забыли или потеряли пароль. Тут в голову приходит мысль приобрести новый девайс, вы сломя голову идете в магазин, покупаете, приносите домой и… понимаете что пароля нигде нет. Но как любой мыслящий человек вы понимаете что маршрутизатор все помнит, осталось только его убедить рассказать его. Можно было бы проверить его в настройках роутера, но, к сожалению, этот способ подходит не для всех моделей. Я вам расскажу об универсальном способе узнать пароль.

Вам понадобятся:
1) Ваш маршрутизатор
2) Патч-корд (обычный, не кросс)
3) Компьютер с Linux на борту.

Читать дальше →

Выращиваем программы

Время на прочтение2 мин
Количество просмотров4.1K
image Прошли новогодние праздники и я вспомнил про BrainFuck. Писать свой морской бой желания не было, а хотелось как в сказке «Ну ка, проги, пишитесь сами!».
Читать дальше →

Обратная польская запись на языке ассемблера с синтаксисом AT&T

Время на прочтение4 мин
Количество просмотров6.6K
Данная программа изначально была написана как небольшая лабораторная работа по курсу машинно-ориентированного программирования программирования, но в последствии появилась мысль представить её сообществу. Именно потому что алгоритм реализован не на языке ассемблера с синтаксисом Intel, а на языке ассемблера с синтаксисом AT&T.
Читать дальше →

Расширение Google Chrome для отправки смс

Время на прочтение1 мин
Количество просмотров3.6K
Всех с прошедшими праздниками!

Прошлое расширение для Firefox было достаточно популярно. Поэтому решил не останавливаться и сделать расширение для Google Chrome.

Расширение можно качать тут. Работает начиная с браузеров версии 5.

Есть настройка для открытия окна не в попапе, а в отдельном окне.

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

Для добавления Вашего оператора оставляйте задания в проект на code.google.com. Лучше оставлять любой контакт как с Вами связаться для тестирования нового оператора.

На данный момент работают
1. Теле2
2. Мегафон-Сибирь


Список операторов можно посмотреть на странице дополнения

UPD: 4 января 2011 время 22-13 (НСК) сервер не отвечает. Просьба не паниковать, налаживаю связь с сервером. Без сервера расширение пока не будет работать.

UPD: 5 января 2011 время 9-40 (НСК) сервер все еще мертв :(. Сейчас делаю возможность переключения сервера, и убираю постоянные запросы к серверу. Как выложу — дам знать в топике

UPD: 5 января 2011 время 10-41 (НСК) сервер ребутнули хардварно. Обновил дополнение (версия 1.0.2) чтобы не грузило сервер, теперь запрос на новых операторов будет лишь один раз в сутки, чуть позже добавлю возможность обновлять через опции. Просьба оттестировать.

CGI-программирование на ассемблере?!? – Легко!

Время на прочтение11 мин
Количество просмотров13K
Статья гуляет в интернете уже довольно давно, но, как автор думаю имею право на ее перепост здесь. Многое (если не все) написаное здесь устарело, и может показаться бесполезным с первого взгляда, однако пройдя этот путь, спустя 6 лет могу сказать, это не оказалось лишним. Итак.
В этой статье я хочу рассказать о CGI интерфейсе вообще, его реализации для windows и использовании при написании CGI-программ языка ассемблер в частности. В рамки этой статьи не входит полное описание CGI, так-как в Интернете материала по этому вопросу просто море и пересказывать все это здесь я просто не вижу смысла.
Читать дальше →

Программирование на калькуляторе

Время на прочтение5 мин
Количество просмотров89K
Здравствуйте, хабражители. Думаю, многие из вас слышали о программируемых калькуляторах (а некоторые даже использовали их). Как ни странно, здесь я не нашел ни одной статьи, рассказывающей о такой интересной вещи, и поэтому решил восполнить этот пробел и рассказать об основах программирования на калькуляторах.

Некоторое время назад я нашел у себя в кладовке старый «Электроника МК-61», принадлежавший моему папе. Естественно, я не мог упустить такой шанс освоить не совсем «стандартное» программирование на калькуляторе. (В случае, если у вас нет программируемого калькулятора, вы можете скачать эмулятор здесь)
Читать дальше →

Создаем объёмный блок с тенью средствами CSS3

Время на прочтение3 мин
Количество просмотров14K
День, когда стандарт CSS3 будет официально утвержден, а все популярные браузеры начнут его отображать приблизит нас, верстальщиков, к нашему же «раю верстальщиков» в несколько раз. Пока же заглянем в будущее и узнаем, как можно создать псевдо-3D блок используя только css и html.
показывай, кудесник

Шикарный эффект для checkbox и radio-button на CSS3

Время на прочтение1 мин
Количество просмотров8.4K

Вот такой шикарный эффект для чекбоксов и радио-кнопок был реализован швейцарским CSS3-гуру. В качестве иконок были использованы символы из шрифта Pictos.

Демо: lab.simurai.com/css/umbrui
К сожалению, демо пока работает только в Safari и Chrome (с небольшими дефектами).

Вёрстка колонками средствами CSS3

Время на прочтение3 мин
Количество просмотров20K
Отличительной особенностью полиграфического дизайна является повсеместное применение колоночной верстки. И тому есть веские основания.

Во-первых, глаз лучше воспринимает строки текста состоящие из 8 до 12 слов. Во-вторых, можно гораздо лучше организовать колонки и уменьшить количество пустого пространства на странице. Долгое время это являлось исключительным преимуществом полиграфии. В вебе же приходилось всячески извращаться. Но теперь CSS3 позволяет создавать колоночную верстку без использования JavaScript.
Читать дальше →

[Заметка] Кроссбраузерный text-overflow в 7 строках

Время на прочтение2 мин
Количество просмотров2.3K
style.css

.habr span
{
    display:block;
    overflow:hidden;
    white-space:nowrap;
    width:100%;
    -moz-binding:url("ellipsisxul.xml#ellipsis");
    text-overflow:ellipsis;
    -o-text-overflow:ellipsis;
}

Читать дальше →

Пошаговое описание создания простого приложения для Samsung Bada

Время на прочтение8 мин
Количество просмотров9.8K

Предварительные замечания


Здравствуйте. Хотелось бы прежде всего поздравить всех с наступившим Новым Годом и сразу перейти к делу. Эта статья будет посвящена вопросу создания простых программ для Bada — операционной системы для мобильных устройств, которые выпускает корейская Samsung. Заранее хочу сказать, что под катом простой рецепт изготовления простого приложения без пространных рассуждений о оптимальности и стройности кода.
На Хабре уже есть довольно обстоятельные статьи, которые посвящены Bada, например эта и эта, но вот пошагового описания создания приложения для новичков нет. Кому интересно — прошу под кат.

Читать дальше →

Tips & tricks в разработке букмарклетов

Время на прочтение6 мин
Количество просмотров2.7K
Так получилось, что в течение нескольких месяцев я занимался разработкой букмарклетов, сделав их около десятка. Использовал как jQuery, так и native JavaScript. О том, с какими подводными камнями я столкнулся, что нового узнал и нашел — об этом пойдет речь под катом.
Читать дальше →

Делаем TV-программу в виде расширения для chrome

Время на прочтение4 мин
Количество просмотров1.7K

Лирической отступление


Я долго бродил по галерее расширений для chrome, так и не нашёл расширения типа TV-программа, которое бы парсело офф. сайты TV-каналов и показывало программу при нажатие на иконку расширения. Поэтому решил его написать, сейчас я расскажу о процессе его создания.
Читать дальше →

Кроссбраузерный text-overflow \(^_^)/

Время на прочтение5 мин
Количество просмотров27K
В случае, когда текст не влезает в ширину блока, есть несколько вариантов его визуализации:
  1. Разрешить ему вылезать за пределы блока. В большинстве случаев смотрится весьма косячно.
  2. Обрезать текст по границе блока. То же смотрится некузяво.
  3. Обрезать и нарисовать скроллинг. Это вообще жуть какая-то.
  4. Обрезать и сделать плавное затухание к краю так чтобы места обрезания букв не было видно. Сложно применять в случае неоднородного фона. Приходится вручную прятать затухание, когда текст имеет ширину меньше или равную ширине блока.
  5. Укорачивать текст, вставляя вконце многоточие.
О реализации последней стратегии и пойдёт далее речь...

А теперь долгожданное порево

extsrc.js — загружаем все скрипты асинхронно и уже после отрисовки страницы (даже с document.write)

Время на прочтение4 мин
Количество просмотров21K
Хочу Вам рассказать о штуке, которую я изобрел сегодня, чтобы ускорить процесс загрузки сайтов. Все вы знаете, что <script src="..."></script> задерживает отрисовку страницы, пока не загрузится этот скрипт. Если их десятки — это может сереьезно замедлить работу сайта — в результате пользователь 20 секунд пялится на пустую (или недорисованную) страницу из-за какого-нибудь тупящего социального виджета (умножить на десяток этих виджетов).

Не правда ли было бы круто, если бы можно было сказать <script extsrc="..."></script> ("extsrc" = "грузи потом"), чтобы скрипты загружались после того как страница отрисована?

Все бы хорошо, но есть document.write… Сегодня я наконец решил его проблему — представляю extsrc.js — скрипт, который запустит все скрипты после отрисовки страницы (даже если они содержат document.write — и правильно отрисуется все).

Результат? Супер-быстрая загрузка страниц, даже если там море всяких внешних скриптов.

Использование:

Заменяем <script src="..."> на <script extsrc="...">.

Итого получается:

<script src="http://whiteposts.com/extsrc_js/extsrc.js"></script>
<script extsrc="..."></script>

все остальное под катом

Flash-приложение под iPad без проблем с размером экрана и пикселинга

Время на прочтение4 мин
Количество просмотров4.1K
Привет!
Прошло не так много времени с тех пор, как Flash стал доступен на яблочных мобильных устройствах. Судя по мануалу из официального пэкэджера от Adobe, сборка Flash-приложения на iPhone — достаточно тривиальная задача.
Однако, дела с iPad обстоят не так, как хотелось бы.

В статье приведен тайный рецепт, как создать Flash-приложение именно под iPad.
Доставляет!

Информация

В рейтинге
Не участвует
Откуда
Новосибирск, Новосибирская обл., Россия
Дата рождения
Зарегистрирован
Активность