Pull to refresh
52
0
Олег @OlegTar

User

Send message

Эмуляция блокировки видимости с помощью with в JavaScript

Reading time1 min
Views967

За нахождение хорошей фотографии спасибо ant99 а также фотографу.
Некоторое время назад я писал о том, как блокировать видимость в JavaScript с помощью конструкции let. Как оказалось из комментариев, let (как и JavaScript 1.7-1.8.5) поддерживается только браузерами на основе обезьянок и Rhino. Меня постигло разочарование, но минут 15 назад я придумал (хотя это громко сказано, наверное, и до меня было уже придумал кто-то) костыль для не такого красивого, но тем не менее рабочего кода. Он использует конструкцию with (да, я знаю, что она причислена к Bad Parts из-за ненужности и неэффективности, но вот прямо сейчас я опровергну первое утверждение).

Поехали
Total votes 99: ↑68 and ↓31+37
Comments36

Запускаем сторонний код в песочнице

Reading time8 min
Views5.5K
Как гласит статья из Википедии, Песочница — механизм для безопасного исполнения программ. Песочницы часто используют для запуска непротестированного кода, непроверенного кода из неизвестных источников, а также для запуска и обнаружения вирусов.

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

В статье пойдет речь об атаках, которые могут совершать злоумышленники и о методах безопасного выполнения стороннего кода.
Читать дальше →
Total votes 97: ↑92 and ↓5+87
Comments25

Просмотр видео не уходя с сайта

Reading time2 min
Views4.2K
imageВсем уже давно понятно, что видео в интернете вещь необходимая. Но многие форумы, социальные сети и в том числе хабрахабр не всегда позволяют встроить видео в комментарий или тему. Хабрахабр к счастью только в комментарии не позволяет видео встроить, а на большинстве форумов даже в теме видео не встроить. И вот этот скрипт немного облегчит нашу с вами жизнь в сети (он работает на всех сайтах, а не только на хабрахабре).

Скрипт подменяет обработку ссылок на видеосайты: youtube.com, vimeo.com и twitvid.com таким образом, что по клику на ссылке (на видео), прямо в странице будет встроен видеоплеер. Получается, чтобы посмотреть видео никуда уходить с сайта не надо! Нажал на ссылку, посмотрел и закрыл.
Читать дальше →
Total votes 52: ↑48 and ↓4+44
Comments61

Работа с FLA

Reading time3 min
Views6.2K
Плохо, хорошо

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

Частично содержание данной статьи пересекается со статьей Валерии Маллаевой О fla-исходниках.
Читать дальше →
Total votes 88: ↑72 and ↓16+56
Comments64

Как выбрать VPS хостинг

Reading time4 min
Views24K
Неприятности начались с того момента, когда мой любимый американский хостер вдруг перенес мой многолетний аккаунт на новый сервер и установил хитрый лимит на память php для всего аккаунта. И вроде бы memory_limit 90M на первый взгляд достаточно для любого сайта, но этот лимит действует на весь аккаунт в целом. Т.е. сайты, расположенные на одном аккаунте, начинают «душить» друг друга. Начались проблемы с форумом phpbb посещаемостью всего 2000 уников в сутки. При превышении лимита памяти сервер отдавал 500 ошибку.

Опытные люди, не читая далее, сразу скажут, что предложила мне техподдержка: конечно же переход на их VPS. Для отечественного хостинга это обычное дело, но от буржуев я такое услышал впервые. Выход в таком случае один — переход на другой хостинг, ибо с «террористами переговоров не ведут» да и 15$ за их 300Mb VPS мне показалось несколько дороговато.

Выбрал Open VZ VPS в России 768Mb за ~500 рублей. Все поставил, вроде работает. Но тут черт меня дернул перед сменой DNS проверить нагрузку с помощью loadimpact.com и меня накрыл тихий ужас: при одновременном доступе к сайту 50 посетителей страницы грузились по 60 секунд.
Читать дальше →
Total votes 91: ↑82 and ↓9+73
Comments95

Распознавание некоторых современных CAPTCHA

Reading time15 min
Views79K
Именно так называлась работа, представленная мной на Балтийском научно-инженерном конкурсе, и принёсшая мне очаровательную бумажку с римской единичкой, а также новенький ноутбук.

Работа заключалась в распознавании CAPTCHA, используемых крупными операторами сотовой связи в формах отправки SMS, и демонстрации недостаточной эффективности применяемого ими подхода. Чтобы не задевать ничью гордость, будем называть этих операторов иносказательно: красный, жёлтый, зелёный и синий.

Читать дальше →
Total votes 319: ↑313 and ↓6+307
Comments148

Копирование объектов с помощью ByteArray

Reading time4 min
Views4.9K

Копирование простых объектов


Чаще всего ByteArray используют для копирования объектов. AMF сериализатор и десериализатор (не люблю эти слова, но не нашёл подходящего перевода) доступен через ByteArray API. Для дублирования объектов с помощью ByteArray мы будем использовать методы writeObject и readObject:

// Создаём пустой ByteArray
var stream:ByteArray = new ByteArray();
// Создаём объект
var parameters:Object = { age : 25, name : "Bob" };
// «Переводим» объект в формат AMF и сохраняем его в ByteArray
stream.writeObject( parameters );
// Сбрасываем позицию
stream.position = 0;
// Считываем объект
var objectCopy:Object = stream.readObject();

Читать дальше →
Total votes 44: ↑34 and ↓10+24
Comments10

Поиск пути в гексагональной сетке (AS3)

Reading time2 min
Views14K
imageЭта статья представляет собой описание компонента HexaPath, реализующего поиск пути по алгоритму А* в гексагональной сетке. В сети мной было найдено большое количество описаний алгоритма на примере квадратной сетки и некоторое количество реализаций, но ни одного упоминания о шестиугольной сетке. И я написал свою реализацию. Выкладываю исходники. Вдруг кому-нибудь понадобится это, а писать самому будет лень.

Читать дальше →
Total votes 96: ↑88 and ↓8+80
Comments48

Справочник, посвященный тонкостям JavaScript

Reading time1 min
Views3.6K
JavaScript Garden — справочник на английском, посвященный тонкостям JavaScript.

Из него я, например, узнал, что массивам можно задавать length:
var list = [1, 2, 3, 4, 5];
list.length = 3;
console.log(list); // => [1, 2, 3]
Читать дальше →
Total votes 86: ↑76 and ↓10+66
Comments43

CSS спрайты из командной строки

Reading time3 min
Views4.2K
Да, инструменты для создания CSS спрайтов существуют. Я даже сделал один такой сервис. Но они время от времени ломаются (как сейчас, мой). Но и командная многого стоит, и imagemagick. Давайте посмотрим, как мы можем создавать CSS спрайты только из командной строки.

Создание картинки


Начнем с того, что у нас есть список отдельных файлов:
$ ls

1.png  2.gif  dot.png  phoney.gif  tw.gif

  • — 1.png
  • — 2.gif
  • — dot.png
  • — phoney.gif
  • — tw.gif

Сделаем из них спрайт:
$ convert *png *gif -append result/result-sprite.png

Да, это все. Смотрим результат.

Читать дальше →
Total votes 139: ↑129 and ↓10+119
Comments22

Динамическое программирование. Классические задачи

Reading time8 min
Views324K
Здравствуй, Хабрахабр. В настоящий момент я работаю над учебным пособием по олимпиадному программированию, один из параграфов которого посвящен динамическому программированию. Ниже приведена выдержка из данного параграфа. Пытаясь объяснить данную тему как можно проще, я постарался сложные моменты сопроводить иллюстрациями. Мне интересно ваше мнение о том, насколько понятным получился данный материал. Также буду рад советам, какие еще задачи стоит включить в данный раздел.

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

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

Такие задачи решают методом динамического программирования, а под самим динамическим программированием понимают сведение задачи к подзадачам.
Читать дальше →
Total votes 105: ↑97 and ↓8+89
Comments72

Копируем исходный код без нумерации строк

Reading time6 min
Views22K

Бывает при выводе информации требуется ее декорировать для лучшего восприятия, нередко оформление сопровождается в том числе и текстом. При выделении и копировании этой информации, оформление копировать не нужно, т.к. нужна только сама информация, и желательно в исходном виде. То есть при копировании часть выделенного текста не должна попадать в буфер обмена.
В моем случае это исходный код, который сопровождается нумерацией строк, так нагляднее и есть возможность сослаться на строку кода. Однако, если мы хотим скопировать часть кода, то он должен копироваться без номера строки.
Многие highlighter'ы этим грешат, при копировании кода копируют в том числе и номера строк. Выходят из ситуации по разному: либо используют хитрую верстку, при которой возможно несовпадении нумерации со строками (можно заметить на github например), или используют специальную кнопку, которая показывает в отдельном окне код без форматирования. Мне показались эти подходы неудовлетворительными, потому решил найти другое решение.
В данной заметке я опишу решение, к которому в итоге пришел. Решение, конечно, частное, но может кому то оказаться полезным в решении собственных задач.
Читать дальше →
Total votes 88: ↑83 and ↓5+78
Comments66

Масштабирование веб-приложений с помощью HMVC

Reading time13 min
Views18K
Последние десять лет мы наблюдаем второй цикл веб-дизайна – сайты превращаются в приложения и уже практически не появляется новых проектов, не обладающих некой долей интерактивности. Увеличение сложности ПО, разрабатываемого для интернета, вызвало необходимость в структурированном и взвешенном проектировании приложений.

На сегодняшний день наиболее часто используемым паттерном проектирования сайтов является Модель-Вид-Контроллер (MVC). Повсеместное его использование отчасти вызвано успехом и популярностью фреймворка Ruby on Rails. Сейчас MVC является практически синонимом веб-разработки среди всех платформ.

При выполнении задач, активно нагружающих процессор, современные сайты все больше полагаются на выделенные ресурсы. Этому, в частности, поспособствовало открытие компаниями Amazon и Google облачных сервисов, которые позволяют разработчикам существенно уменьшить нагрузку на процессоры их собственных серверов. Каждый сервис обычно проектируется в виде отдельного элемента ПО, который запускается внутри своего домена и использует свои собственные ресурсы.

Когда имеешь дело со скромными бюджетами, обычно довольно сложно убедить клиентов в преимуществах финансирования более чем одного завершенного фрагмента программного обеспечения. Как показывает мой опыт, множество из них придерживаются мнения, что масштабируемость не является актуальной задачей. Они «с нетерпением ждут того дня, когда придется этим обеспокоиться».

Для уменьшения первоначальных вложений обычно принимают решение о том, что приложение должно быть спроектировано в виде целостной программы, содержащей все требуемые функции. Если сайт быстро обретет популярность, это станет проблемой. У меня остались не очень приятные впечатления от рефакторинга плохо масштабируемых кодовых баз. К тому же, это может потребовать большого количества ресурсов и денег. В идеале приложения должны расти по мере необходимости и не требовать в процессе этого крупных финансовых затрат.
Читать дальше →
Total votes 58: ↑49 and ↓9+40
Comments41

Полулегальное воровство печеньками

Level of difficultyEasy
Reading time5 min
Views56K
Часть хабралюдей честные и бескорыстные и привлекают их всякие техническия штучкэ. Но кое-кто кое-где у нас порой и не столь бескорыстен. Честно жить не хочет. Я расскажу вам о том, как можно по сути воровать, но при этом не выходя за рамки уголовного кодекса. Эдак с $15,000,000.
Читать дальше →
Total votes 312: ↑295 and ↓17+278
Comments135

Мой подход к проектированию веб-сайтов

Reading time4 min
Views41K

Прелюдия


image Вероятно, всем известно и все прекрасно понимают, что главной частью в работе над программным продуктом, будь то сайт или настольное приложение, является совсем не процесс написания кода. Под словом главный я не подразумеваю время, которое уходит на этапы разработки, я имею ввиду наиболее важный этап, который определяет успешность дальнейшей работы над проектом. Трудно будет получить автомобиль, если на бумаге уже расписано создание велосипеда!

В рамках данной статьи я поделюсь своим опытом проектирования сайтов средней сложности. Данный подход зарекомендовал себя понятным как разработчикам, так и клиентам. Я не собираюсь открывать Америку, представленные ниже инструменты всем прекрасно знакомы. Суть данной статьи как раз в том, что бы продемонстрировать насколько просто можно представить достаточно сложные задачи.

Читать дальше →
Total votes 177: ↑152 and ↓25+127
Comments68

Алгоритмы поиска в строке

Reading time4 min
Views187K

Постановка задачи поиска в строке


Часто приходится сталкиваться со специфическим поиском, так называемым поиском строки (поиском в строке). Пусть есть некоторый текст Т и слово (или образ) W. Необходимо найти первое вхождение этого слова в указанном тексте. Это действие типично для любых систем обработки текстов. (Элементы массивов Т и W – символы некоторого конечного алфавита – например, {0, 1}, или {a, …, z}, или {а, …, я}.)

Наиболее типичным приложением такой задачи является документальный поиск: задан фонд документов, состоящих из последовательности библиографических ссылок, каждая ссылка сопровождается «дескриптором», указывающим тему соответствующей ссылки. Надо найти некоторые ключевые слова, встречающиеся среди дескрипторов. Мог бы иметь место, например, запрос «Программирование» и «Java». Такой запрос можно трактовать следующим образом: существуют ли статьи, обладающие дескрипторами «Программирование» и «Java».

Поиск строки формально определяется следующим образом. Пусть задан массив Т из N элементов и массив W из M элементов, причем 0<M≤N. Поиск строки обнаруживает первое вхождение W в Т, результатом будем считать индекс i, указывающий на первое с начала строки (с начала массива Т) совпадение с образом (словом).
Пример. Требуется найти все вхождения образца W = abaa в текст T=abcabaabcabca.

Образец входит в текст только один раз, со сдвигом S=3, индекс i=4.
Читать дальше →
Total votes 86: ↑66 and ↓20+46
Comments38

Алгоритм Дейкстры. Поиск оптимальных маршрутов на графе

Reading time3 min
Views432K
Из многих алгоритмов поиска кратчайших маршрутов на графе, на Хабре я нашел только описание алгоритма Флойда-Уоршалла. Этот алгоритм находит кратчайшие пути между всеми вершинами графа и их длину. В этой статье я опишу принцип работы алгоритма Дейкстры, который находит оптимальные маршруты и их длину между одной конкретной вершиной (источником) и всеми остальными вершинами графа. Недостаток данного алгоритма в том, что он будет некорректно работать если граф имеет дуги отрицательного веса.

Для примера возьмем такой ориентированный граф G:

image

Читать дальше →
Total votes 91: ↑62 and ↓29+33
Comments31

Видеохостинг своими руками

Reading time6 min
Views66K
Эта статья о некоторых технических аспектах реализации бесплатного сервиса для загрузки, хранения и просмотра видео. Будут рассмотрены вопросы настройки серверного программного обеспечения, даны примеры команд для конвертации видео и примеры кода на языке PHP.
Читать дальше →
Total votes 126: ↑126 and ↓0+126
Comments108

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

Reading time3 min
Views2.3K

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

Следующая строка подло скопирована с 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);} //И выполняем её код


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

Псевдо-консоль находится тут. Там же расположены примеры.
Total votes 39: ↑31 and ↓8+23
Comments9

Разработка с использованием паттерна проектирования Model-View-ViewModel на примере Twitter клиента шаг за шагом

Reading time12 min
Views41K
Введение

Статья посвящена работе с MVVM и WPF. В ней описывается процесс разработки twitter client. Процесс разработки разбит на шаги. В конце каждого шага читатель параллельно пишущий приложение должен иметь работающее приложение. Каждый последующий шаг добавляет какую-то функциональность к написанному на предыдущем шаге. Используется thirdparty библиотека TweetSharp. Ссылку на исходный код, а так же оригинал статьи, написанный мной на английском, можно найти тут.
Статья рассчитана на новичков в WPF разработке. Но предполагается, что читатель имеет некоторый начальный опыт работы с WPF, в частности освоил data binding.
Я не буду писать зачем нужно использовать MVVM – считаю, что об этом хорошо написано в статье “Приложения WPF с шаблоном проектирования модель-представление-модель представления” от Джоша Смита. Если вы не хотите читать эту статью – просто поверьте мне – неверное спроектированное GUI в случае с WPF превращается в большую головную боль.

Читать дальше →
Total votes 54: ↑43 and ↓11+32
Comments24

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Works in
Registered
Activity