Сообщения

Сообщения за 2011
Мыслители встречаются редко, практики еще реже, но реже всего - мыслители-практики. - Фредерик Брукс, "Мифической человеко-месяц"
Мне кажется, что при освоении программирования труднее всего привыкнуть к требованию совершенства. - Фредерик Брукс, "Мифической человеко-месяц"
Программист, подобно поэту, работает почти непосредственно с чистой мыслью. Он строит свои замки в воздухе и из воздуха, творя силой воображения. - Фредерик Брукс, "Мифической человеко-месяц"

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) . ")";
Абстракция - один из главных способов борьбы со сложностью реального мира. - Стив Макконнелл, "Совершенный код"

PHP и MySQL - основные функции

Изображение
Соединение с сервером. mysql_connect  - открывает временное соединение с сервером, т.е.соединение будет автоматически закрыто после завершения скрипта. mysql_pconnect  - открывает постоянное соединение с сервером, т.е. соединение не будет закрыто после завершения скрипта. Позволяет снизить нагрузку на сервер при большом количестве SQL-запросов. Важно: использование данной функции возможно только в том случае, когда PHP установлен как модуль. Пример настройки PHP на сервере Apache в режиме mod_php: 1) Добавить в httpd.conf   в  разделе загрузки модулей: LoadModule php5_module "C:/php/php5apache2_2.dll" 2) Добавить в httpd.conf в блок <IfModule mime_module>: AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps mysql_close   - закрывает временное соединение с сервером. mysql_ping  - проверяет соединение с сервером. Если результат false - предпринимается попытка восстановить соединение. Соединение с базой данных. mysql_select

Online Tools

Изображение
codepad  - выбираем язык программирования (С++, PHP, Ruby, Lua и т.п.), пишем код и смотрим что получилось. Отличная штука, когда нужно сделать это по-быстрому. Кроме посмотреть, можно также сохранить, загрузить, поделиться. Flex Style Explorer  - позволяет исследовать влияние случайных значений параметров стилей на внешний вид Flex-компонентов. Т.е. выбираем из списка тот или иной компонент интерфейса и выставляем параметры стиля в те или иные значения. Кроме посмотреть, можно также сохранить настройки в виде CSS. md5(); - возвращает хеш строки. Или строку из хеша.    RegExr  - верный инструмент для тестирования регулярных выражений. Rubular  - редактор регулярных выражений в среде Ruby. Генератор HTML + CSS шаблонов  - жертвуем 5 бесценных секунд нашей жизни на выбор основных параметров макета сайта (ширина, шапка, сайдбары и т.п.) и получаем в награду архив "содержащий 2 файла: HTML и CSS, представляющие из себя базовую разметку (каркас) для вашего будущего сайта&qu

Конвертируем Ruby-приложение в exe

Изображение
Exerb  - утилита от японского программиста  Yuya Kato. Скачиваем, распаковываем и выполняем в командной строке setup.rb. Теперь попробуем что-нибудь упаковать в exe. Переходим в директорию Ruby-проекта, где у нас к примеру находится скрипт test.rb и выполняем в командной строке:  exerb test.rb  Помимо скриптов, exe-файл содержит среду Ruby, таким образом скрипт без проблем запустится в системе, где  Ruby  не установлен.  Единственное, что не удалось при тесте Exerb - запустить приложение Ruby + Qt, но с этой задачей без проблем справилась вторая утилита -  RubyScript2Exe - от Erik Veenstra. Э та утилита представляет из себя один единственный скрипт. Выполняем его в командной строке, передав в качестве аргумента название файла, который хотим упаковать в exe. RubyScript2Exe не только прекрасно справляется с упаковкой сложных проектов, но и имеет великолепную документацию . 
Явные требования помогают гарантировать, что функциональность системы определяется пользователем, а не программистом.  - Стив Макконнелл, "Совершенный код"

Из XML в ArrayCollection : Error #1034: Type Coercion failed )

Изображение
Ошибка возникает при чтении данных  в ArrayCollection   из xml-файла, который содержит только один узел . В этом случае данные передаются не в виде Array, но в виде Object -  отсюда и недоразумение. Чтобы избежать ошибки - вводим проверку на тип полученных данных: if  (event.result.nodes.node is ArrayCollection) {           ar =  event.result.nodes.node; } else if  (event.result.nodes.node is ObjectProxy) {           ar = new ArrayCollection(ArrayUtil.toArray(event.result.nodes.node)); }

Как сменить пароль root в MySQL

Изображение
Открываем my.ini ("C:\Program Files\MySQL\MySQL Server 5.1") и добавляем в конце файла строку " skip-grant-tables ". Перезапускам сервис MySQL. Заходим в консоль, жмем Enter вместо пароля и выполняем запрос: mysql> UPDATE mysql.user SET Password=PASSWORD(’new password’) WHERE User=’root’; mysql> FLUSH PRIVILEGES; Открываем my.ini и удаляем строку "skip-grant-tables". Перезапускам MySQL.

Резервное копирование базы данных по расписанию

Изображение
Задача : а) в назначенный час запустить резервное копирование mysql-базы данных, б) переслать файл дампа по электронной почте. И, конечно, все это должно произойти без нашего участия, т.е. само по себе. Что нам понадобится: PHP 5 - для выполнения скрипта; Task Scheduler - он же "планировщик"; mysqldump - утилита для создания дампа mysql-базы данных; Swift Mailer - PHP-библиотека для работы с почтой. Резервное копирование.  Для запуска mysqldump воспользуемся php-функцией exec, в которую в качестве аргумента передадим строку с параметрами вызова mysqldump (подробнее о mysqldump тут ). $q = "mysqldump -uroot -ppass database > "; $file = "d:/backup-" . date("d-m-Y") . ".sql"; exec($q . $file); Отправка дампа по электронной почте . Пересылать дамп будем через smtp.mail.ru. Дописываем в скрипте: require_once 'Swift-4.0.6/lib/swift_required.php'; $transport = Swift_SmtpTransport::newInstance('smtp.inbox.ru', 2

Апельсиновое желе

Нашел сегодня в почте в черновиках - рецепт апельсинового желе. Много приятных воспоминаний связано у меня с этим десертом... В общем, пусть первый пост в этом блоге будет вкусным )  Компоненты: 2 ст. л. желатина, 1 кг сочных апельсинов (6—7 шт. ), 0, 5 стакана воды, 1—2 ст. л. сахара. Приготовление: Замочить желатин в 100 мл воды, пусть набухает. Апельсины хорошо вы­мыть, срезать верхушки (примерно 1/4 часть пло­да). Выдавить из них немного сока и аккуратно, чайной ложечкой, выскоблить мякоть так, что­бы не повредилась кожица. Делать это следует над посудой, в которую будет стекать сок. Выда­вить из мякоти сок. Кусочки мякоти, попавшие в сок, отцеживать не надо. Это придаст десерту особую пикантность. В кастрюльку положить набухший желатин и на медленном огне, постоянно помешивая, растворить его (кипеть жидкость не должна, ина­че желатин потеряет свои желирующие свойст­ва). В другой кастрюльке нагреть немного апель­синовый сок, попробовать и при необходимости добавить сахар. Влит