Сообщения

Android - второй опыт

Изображение
Написал вторую программку под Android - сборник цитат и афоризмов. В этот раз столкнулся только с двумя проблемами: SimpleAdapter и проверка состояния сетевого подключения. SimpleAdapter Есть список авторов цитат, который загружается с удаленного сайта в формате xml:  <authors>   <author>     <id/>      <name/>     <link_to_image/>     <quote/>   </author> </authors> т.е. имя автора, ссылка на аватар и его последняя (новая) цитата. Все это надо отобразить в ListView так, чтобы в каждой строке были и имя автора и его аватар и цитата.  Разбираем данные из xml (ради экономии места обработку исключений пропускаем): HttpResponse resp = client.execute(request); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(resp.getEntity().getContent()); doc.getDocumentEle...

ActionMailer - медленное обновление страницы после отправки сообщения

Изображение
Есть два способа, как уменьшить задержку обновления страницы сайта, после нажатия на кнопку "отправить сообщение". Первый - настроить на сервере, где находится сайт, почтовый сервер, через который будут отправляться почта. Второй - использовать асинхронную отправку сообщений, чем сейчас и займемся. Самый простой способ реализации асинхронной отправки почты - использование плагина delayed_job. Добавляем в Gemfile:  gem 'delayed_job_active_record' и выполняем из директории проекта: bundle install rails g delayed_job:active_record rake db:migrate   Открываем контроллер и изменяем: AdminMailer.alert_message().deliver на AdminMailer.delay.alert_message() Осталось только выполнить в консоли: rake jobs:work Теперь обновление страницы будет происходит практически мгновенно, а в консоли можно будет отслеживать состояние отложенных заданий. 

RubyOnRails и Paperclip

Изображение
Шпаргалка по использованию Paperclip (плагин для работы с изображениями) в проектах RubyOnRails. Установка Прежде всего необходимо установить библиотеку ImageMagic, которая используется Paperclip для масштабирования изображений: sudo apt-get install libmagick9-dev После чего устанавливаем Paperclip: прописываем в Gemfile "gem 'paperclip'" и выполняем bundle install. Использование Модель с одним изображением. В качестве примера добавим аватар к модели User: rails g paperclip User avatar rake db:migrate Открываем User.rb и пишем: attr_accessible :avatar has_attached_file :avatar, :styles => { :small => '28x28#', :medium => '48x48#' } Т.е. мы сделали аватар доступным для редактирования и задали два стиля: "small" и "medium". Добавляем в форму редактирования профиля пользователя поле для выбора изображения: <%= f.file_field :avatar %> и - для отображения аватара пользователя - прописываем наприм...

RubyOnRails - генерация sitemap

Изображение
Этот день должен был наступить, и он наступил - мне окончательно надоело обновлять sitemap ручками! И, поборов природную лень, я таки реализовал для  своего сайта  автоматическую генерацию sitemap.xml. Делается все просто. Создаем контроллер SitemapController: def index   @urls = ['http://ptica-govorun.ru/', 'http://ptica-govorun.ru/authors']   @quotes = Quote.all   @quotes.each do |q|     @urls.push( url_for :controller => 'quotes', :action => 'show',  :id => q.id)   end   headers['Content-Type'] = 'application/xml'   render :layout => false end Создаем index.rxml в директории views/sitemap/ xml.instruct! :xml, :version => '1.0' xml.tag! 'urlset', 'xmlns' => "http://www.sitemaps.org/schemas/sitemap/0.9" do   @urls.each do |url|     xml.tag! 'url' do       xml.tag! 'loc', url     end   end end И редактируем routes.rb: match "/sitemap.xml", :to =...

Как выделить таб в TabNavigator

Изображение
При изменении текущей вкладки в  TabNavigator, например, посредством selectedIndex, или через состояния, возникает такая проблема - активным остается таб предыдущей вкладки. Столкнулся с этой проблемой уже давно, но нашел решение только сегодня - помогло чтение документации) Решение очень простое - реализуем TabNavigator в виде компонента, внутри которого прописываем метод, принимающий индекс нужной вкладки: tabBar.selectedIndex = index;

Грязный Гарри 5

Изображение
Крутые фразочки от Гарри Каллахена

Android - первый опыт

Изображение
Написал первое приложение под Android - калькулятор расчета стоимости печати, с возможностью оформлять заказы в типографии онлайн. Программировать  под Android понравилось, сейчас думаю, чтобы еще написать) А пока небольшой список проблем, с которыми пришлось столкнуться. 1. По сценарию, получив стоимость изготовления буклета или листовки, пользователь должен иметь возможность отправить результаты расчета в типографию, т.е. оформить заказ онлайн. Для этого приложение должно получить разрешение на использование интернета - android.permission.INTERNET. С первого раза у меня это не получилось. Со второго - тоже) Проблема оказалась во мне - вместо "uses-permission" записал в манифесте " user -permission". Стыдно об этом рассказывать, но если погуглить - я не первый, кто наступил на эти грабли) 2. При получении заявки на сервере обнаруживаем в теле письма кракозябры. Решается изменением кодировки при формировании запроса: String url = Calc.CREATE_ORDER + "...

JQuery и Rails - делаем кнопку "like it" со счетчиком

Изображение
В последнее время все больше и больше отдаю предпочтение JQuery в реализации разнообразных финтифлюшек для сайта. Это действительно мощный и впечатляющий инструмент, с помощью которого можно реализовать практически любую бредовую идею - красиво и по-настоящему эффектно! В общем, чем больше познаю JQuery, тем увереннее и монструознее (в лучшем смысле этого непонятного слова) себя ощущаю) Началось мое знакомство с JQuery с идеи прикрутить на http://ptica-govorun.ru/ форму для анонимного голосования за понравившиеся цитаты. Обязательное условие реализации - наличие счетчика и его обновление без перезагрузки страницы. Сделать это оказалось очень просто... 1. Добавляем в Gemfile: gem "jquery-rails" и выполняем bundle install. 2. Выполняем rails generate jquery:install после чего в public/javascripts/ должны появиться библиотеки JQuery и файл application.js. 3. Открываем application.js и пишем функцию для обработки submit-событий: jQuery.ajaxSetup({ 'befor...
Мыслители встречаются редко, практики еще реже, но реже всего - мыслители-практики. - Фредерик Брукс, "Мифической человеко-месяц"
Мне кажется, что при освоении программирования труднее всего привыкнуть к требованию совершенства. - Фредерик Брукс, "Мифической человеко-месяц"
Программист, подобно поэту, работает почти непосредственно с чистой мыслью. Он строит свои замки в воздухе и из воздуха, творя силой воображения. - Фредерик Брукс, "Мифической человеко-месяц"

RubyOnRails и Flex (продолжение)

Изображение
Задача: после того, как пользователь расчитает заказ в калькуляторе стоимости печати , у него может возникнуть желание сохранить данный расчет. Такую возможность имеют только зарегистрированные пользователи. Т.е. необходимо проверить - прошел ли пользователь авторизацию на сайте. Решение: проверим статус пользователя, т.е. пошлем из Flex-приложения GET-запрос в Rails-приложение, для чего создадим вот такой HTTP-сервис: <mx:HTTPService id="LoginReq" url="http://наш_домен/auth" result="httpLoginReqResultHandler(event)" useProxy="false" /> ... public function httpLoginReqResultHandler(event:ResultEvent):void {  var is_auth:Boolean = Boolean(event.result);  if (is_auth) { ... } else { ... } } ... <mx:Button id="btSave" click="{LoginReq.send()}"> Осталось только прописать в Rails-приложении метод auth: //orders_controller.rb def auth  render :text => signed_in? end //route...

RubyOnRails и Flex

Изображение
С самого начала, приступая к работе над сайтом типографии , я решил, что онлайн-калькулятор стоимости печати буду писать на Flex, но потом передумал и сделал на Ruby. Во-первых, потому что программировать на Ruby - это одно бесконечное удовольствие), а во-вторых, я, признаться, боялся, что будет не так просто подружить Rails и Flex, и что в итоге все обернется паникой и продолжительной депрессией. К удивлению, все оказалось более чем легко и просто (в чем я убедился, когда таки набрался решимости и переписал все с Ruby во Flex). Ниже опишу несколько задач по Rails + Flex и их решения. Задача: на стартовой странице сайта отображается список видов изделий (буклеты, листовки и т.п.), стоимость которых пользователь может посчитать в онлайн-калькуляторе. При клике на название изделия нужно а) загрузить страницу с калькулятором, б) передать  в калькулятор ID изделия, чтобы активировать режим расчета именно того изделия, которое выбрал пользователь на стартовой странице. Решение...

Определяем в Rails название города по IP посетителя сайта

Изображение
remote_ip = request.remote_ip result = Net::HTTP.get(URI.parse("http://ipgeobase.ru:7020/geo?ip=#{remote_ip}") ic = Iconv.new('UTF-8', 'WINDOWS-1251') conv_res = ic.iconv(result + ' ')[0..-2] Вот, собственно, и все. Название города в conv_res, вместе с названием региона и прочей информацией, которую выдает по IP замечательный ресурс ipgeobase.ru )

Загрузка файлов по FTP из Rails

Изображение
$ rails g controller Ftp upload ../app/controllers/ftp_controller.rb require 'net/ftp' class FtpController < ApplicationController   def upload     ftp = Net::FTP.new('сервер')     ftp.passive = true     ftp.login(user = "пользователь", passwd="пароль")     ftp.putbinaryfile("путь к файлу", File.basename("название файла"))     ftp.quit()   end end Все просто. Устанавливаем соединение с ftp-сервером и передаем путь к файлу. Но если нам неизвестен путь к файлу? Тогда все становится несколько сложнее. Для примера - добавим форму, где пользователь может выбрать файл для загрузки... ../app/views/ftp/_ftp.html.erb <% form_tag '/upload', :method => :post, :multipart => true do %> <label>Выберите файл</label><%= file_field 'upload', 'filedata' %> <%= submit_tag "Поехали!" %> <% end %> Редактируем контроллер - def upload   file = params[:upload]...

Rails 3 + Apache + Passenger на Ubuntu 11.04

Изображение
Разворачиваем по-быстрому Rails 3 + Apache + Passenger на Ubuntu 11.04 GIT $ sudo apt-get install git-core RVM $ sudo apt-get install curl $ bash < <(curl -s https://rvm.beginrescueend.com/install/rvm) Редактируем ~/.bashrc - добавляем строку -  [[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"   Перезапускаем терминал и выполняем -   $ type rvm | head -1  Если результат " rvm is a function " - установка прошла успешно. RUBY $ rvm pkg install zlib $ rvm install 1.8.7 --with-zlib-dir=$rvm_path/usr $ rvm --create use 1.8.7@myapp Проверяем - $ ruby -v RAILS $ gem install rails --version 3.0.7 Проверяем - $ rails -v APACHE $ sudo apt-get install apache2 PASSENGER $ gem install passenger $ passenger-install-apache2-module Тут придется повозиться. Установщик модуля проверит наличие необходимых компонентов и выдаст инструкции по установке недостающих. Выполняем эти инструкции. Все должно установиться без проблем, за искл...

Mongrel и Rails 3

Изображение
Удалось таки запустить! Делается так - прописываем в Gemfile - gem "mongrel", "1.2.0.pre2" gem "cgi_multipart_eof_fix" gem "fastthread" gem "prototype-rails", "0.3.1" - выполняем bundle install и запускаем rails s.

Правило № 2

Изображение
Нашел на flashflex.com статью Dos And Donts Of Professional Flex Development от Garry Smith. Правила "хорошего" и "дурного" тона профессиональной Flex-разработки. Одно из них: Правило № 2. Не используйте WYSIWYG редактор в Flex Builder . Помню, однажды мне порекомендовали обратить внимание на FDT . Начал было разбираться, но потерял всякий интерес, как только обнаружил, что там отсутствует WYSIWYG редактор.  Прошли годы. Теперь я использую FlashDevelop, в котором тоже нет режима "design", но сегодня это уже не кажется мне равносильным слепоте) Почему WYSIWYG - в нашем случае - это действительно плохо? Ведь, кажется, что данный подход дает более полный контроль над приложением - мы сразу видим то, что хотим  получить. Более того, такой подход упрощает разработку - код "пишется сам", режим "design" заслоняет от нас код, и вот это "преимущество" на практике оборачивается в самый главный недостаток.  Отстранившись от кода - л...

Flex и SWC-библиотеки

Изображение
SWC-файлы представляют из себя архивы, которые могут содержать классы, компоненты, или такие ресурсы, как графика и шрифты. Объединенные в библиотеку, все эти элементы могут быть доступны для совместного использования несколькими приложениями. Как собрать SWC-библиотеку в Flex Builder 1. Создайте проект библиотеки (File -> New -> Flex Library Project). 2. Добавьте в src нужные файлы. Допустим, что в src\org\mylib\class - мы поместили файлы классов, в src \org\mylib\ img - графику, в src \org\mylib\ css - файл css-стилей. 3. В свойствах проекта, в разделе Flex Library Build Path отмечаем на вкладках Classes и Assets - классы и ресурсы, которые будут включены в библиотеку, после чего в папке bin будет создан SWC-файл. Как добавить SWC-библиотеку в проект Project -> Properties -> Flex Build Path -> Library Path -> Add SWC... Работа с SWC-библиотекой SWC-библиотека  создана и подключена к проекту. Теперь извлечем из нее графику и  css-ст...

Error #1054: Unknown column 'Array' in 'where clause

Изображение
Наступаю на эти грабли не в первый раз, и что-то подсказывает мне, что не в последний.  Стыдно конечно, но кто из нас не пытался запихнуть массив PHP в sql-конструкцию WHERE IN ? ) Правильный путь: $sql = "SELECT SUM(cost) FROM task "         . "WHERE task.idorder IN (" . implode(',', $array) . ")";