четверг, 21 ноября 2013 г.

Несколько слов о загрузке файлов с помощью Resumable.js

На днях познакомился с javascript-плагином для загрузки файлов Resumable.js и его код на GitHub-e. Вот появились некоторые соображения по поводу загрузки файлов.

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

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

Используя стандартный способ загрузки в HTML '<input type="file">' (php-пример)  пользователь, который загружает большой файл, должен ждать долгое время. Для него не понятно, насколько реально загружен файл, будет ли удачной загрузка, возникнут ли ошибок при загрузке, придется ли начинать загрузку заново. С появлением HTML5 FILE API (пример) можно решить эту проблему, реализовав возможность возобновлять загрузку файлов с того состояние, в котором они были прерваны, а не начинать все с самого начала. Такая возможность есть и у Resumable.js. Есть ограничения на браузеры, в которых доступна эта возможность (Firefox 4+ и Chrome 11+).

Общая идея о том, как это реализовано. Resumable.js разбивает файл на несколько небольших фрагментов (chunk), используя HTML5 FILE API.  Затем каждый фрагмент загружается по одному, пока весь файл не будет загружен. Если какой-то из фрагментов файла невозможно загрузить правильно, то этот фрагмент будет загружен повторно.

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

Продолжение следует =)

четверг, 7 ноября 2013 г.

Zip и Unzip файлов в Ubuntu

Столкнулся с простой задачей, нужно создать zip-архив и нужно распаковать zip-архив под Ubuntu.

Решение было быстро найдено в Google. Здесь основные команды, что бы не забыть.

Установка архиватора

По умолчанию в Ubuntu не установлены zip/unzip инструменты, поэтому их нужно установить:

# sudo apt-get install zip
# sudo apt-get install unzip
или

# sudo apt-get install zip unzip
Работа с архивами

Для создания архива data.zip из всех файлов в текущей директории, т.е. взять все файлы из текущей директории, где вы сейчас находитесь, сжать их и положить в архив data.zip, нужно выполнить следующую команду:

# zip data *
Замечание: расширение .zip будет добавлено автоматически командой zip. Мы указываем только имя архива.

Если нужно добавить в архив не только все файлы в текущей директории, но и все поддиректории, то используем команду:
# zip -r data *
Вывести список всех файлов в архиве data.zip
# unzip -l data.zip
Извлечь все файлы и поддиректории из архива data.zip в текущую директорию:
# unzip data.zip
Извлечь из архива data.zip файл с именем index.html:
# unzip data.zip index.html
Извлечь из архива data.zip все файлы из директории /tmp:

четверг, 5 января 2012 г.

Передача переменных в Ruby.

Привет.
Вот на дворе уже и новый 2012 год. Поздравляю всех с этим событием. Конец СВЕТА отменили, поэтому продолжаем жить дальше и познавать что-то новое.

Для начала простой пример1.
Пусть есть 2 переменные: var1 и var2.
var1 = 'I am var1'
var2 = var1

Какие значения имеют var1 и var2?
Правильный ответ:
var1  #=>  'I am var1'
var2  #=>  'I am var1'

А теперь давайте сделаем так:
var1 = 'I am not var1'
Какие теперь значения имеют var1 и var2?

Правильный ответ:
var1  #=> 'I am not var1' 
var2  #=> 'I am var1'

У вас не возник вопрос почему?
Ответ прост: var2 никогда не была var1, а просто указывала на тот же объект, что и var1. Новым присваиванием мы изменили ссылку на объект на который указывает var1.

Теперь еще раз =)

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

Пример2:
a = "abcdefg"
b = a
b #=> "abcdefg"
a[3] = 'R'
b #=> "abcRefg"

то есть при изменении значения переменной a, неявно изменилось и значение b, так как они содержат ссылку на один объект.

Всех с наступающим Рождеством.
Удачи.

четверг, 22 сентября 2011 г.

Как дробные числа в целые превращались.

Не для кого не секрет, что математические операции с целыми числами более быстрее, чем с вещественными числами, т.е. использовать int быстрее, чем float, double и т.д.

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

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

Проще говоря: у нас есть исходное число (T = 3.5), мы выбираем минимальное число, которым будим дробить (измерять) исходное число (h=0.1). Теперь преобразуем исходное число в новое целое число, используя минимальное число (i=T/h=3.5/0.1=35).

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

Основной минус бросается в глаза сразу, если h=0.3, а T=3.5, то i = 11.666, что не соответствует тому, о чем мы говорили выше. Выбираете h, как степень 10 (10^(-1) = 0.1 и т.д.).

Вот такой интересный подход. Говорят, что это позволило избавиться от многих ошибок с округлением. =)

Спасибо за внимание. 

среда, 21 сентября 2011 г.

Возвращение из отпуска

Привет, друзья.

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

Политика публикаций не изменится: 2 сообщения в неделю =)
Формат постов также не должна изменится: буду пытаться кратко и по делу рассказать о затронутой теме.

Всегда приветствуются ваши комментарии. Пишите.

До встречи.
Удачи. 

четверг, 11 августа 2011 г.

Делегирование в RubyOnRails (method delegate in RubyOnRails)


Всем привет!

Сегодня расскажу про метод delegate в RubyOnRails.

Его назначение: позволяет вызывать методы других объектов как свои собственные.

Использовать его просто:
delegate [один или несколько методов], to: => [целевой класс]

[один или несколько методов] - названия методов из целевого класса.
Имена методов записываются как символы или как строки. Несколько методов разделяются запятой.
Пример: :hello, :goodbye, :start, :end
[целевой класс] - название имени класса в который будут делегироваться запросы на вызов метода.
Пример кода:
Есть класс Greeter
class Greeter < ActiveRecord::Base
    def hello()   "hello"   end
    def goodbye() "goodbye" end
  end

Мы хотим в классе Foo делегировать вызов метода hello классу Greeter
  class Foo < ActiveRecord::Base
    belongs_to :greeter
    delegate :hello, :to => :greeter
  end

Тогда вызывая у объекта класса Foo метод hello получим:
  Foo.new.hello   # => "hello"

Если попытаемся вызвать другой метод класса Greeter - goodbye, то получим ошибку.
  Foo.new.goodbye # => NoMethodError: undefined method `goodbye' for #<Foo:0x1af30c>
Это только один из способов использования delegate.
Спасибо за внимание.
Удачи.