пятница, 12 сентября 2008 г.
Установка MySQL/Ruby gem на Mac OS X Leopard
1. ставим mysql
2. добавляем в .profile
alias mysql=/usr/local/mysql/bin/mysql
alias mysqladmin=/usr/local/mysql/bin/mysqladmin
3. задаем root пароль
mysqladmin -u root password NEWPASSWORD
или меняем
mysqladmin -u root -p oldpassword newpass
4. ставим gem - тут рабочая инструкция
2. добавляем в .profile
alias mysql=/usr/local/mysql/bin/mysql
alias mysqladmin=/usr/local/mysql/bin/mysqladmin
3. задаем root пароль
mysqladmin -u root password NEWPASSWORD
или меняем
mysqladmin -u root -p oldpassword newpass
4. ставим gem - тут рабочая инструкция
вторник, 1 июля 2008 г.
Ruby: hpricot error
Если у вас стоит задача распарсить / изменить какой то html, и вы пишете на ruby то на мой взгляд идеальный вариант - использование небольшой и быстрой библиотеки hpricot. Она написана на С поэтому работает довольно быстро (быстрее чем другие парсилки).
Hpricot позволяет анализировать и редактировать html с помощью css селекторов или xpath селекторов. Вобщем очень удобно и просто.
Инструкция для установки.
Но у hpricot есть небольшие проблемки, например иногда при создании документа:
возникает ошибка
Оказывается бывает такое из-за каких-то последовательностей символов в html. Эти ошбки постепенно фиксятся разработчиками, но буквально сегодня у меня она возникала, парсер падал из-за того, что в html была последовательность символов "\r\n". Так как мне эти символы совсем не нужны я их просто вырезаю.
Hpricot позволяет анализировать и редактировать html с помощью css селекторов или xpath селекторов. Вобщем очень удобно и просто.
Инструкция для установки.
Но у hpricot есть небольшие проблемки, например иногда при создании документа:
require 'hpricot'
doc = Hpricot "some html"
возникает ошибка
ArgumentError. negative string size (or size too big).
Оказывается бывает такое из-за каких-то последовательностей символов в html. Эти ошбки постепенно фиксятся разработчиками, но буквально сегодня у меня она возникала, парсер падал из-за того, что в html была последовательность символов "\r\n". Так как мне эти символы совсем не нужны я их просто вырезаю.
html.gsub!("\r\n", "")
doc = Hpricot html
понедельник, 23 июня 2008 г.
wirble: tab-completion and coloring for irb
Wirble - это отличная утилитка для ruby программистов. Она добавляет в irb расцветку синтаксиса и tab-completion.
Установка:
1. sudo gem install -y wirble
2. nano ~/.irbrc
3. Добавляем туда
Установка:
1. sudo gem install -y wirble
2. nano ~/.irbrc
3. Добавляем туда
require 'rubygems'
require 'wirble'
Wirble.init
Wirble.colorize
понедельник, 26 мая 2008 г.
installing mc in ubuntu 8.04
Чтобы установить на ubuntu 8.04 midnight commander надо сначала добавить следующие источники
в файл /etc/apt/sources.list
далее как обычно sudo apt-get install mc
deb http://archive.ubuntu.com/ubuntu/ hardy main restricted universe
deb-src http://archive.ubuntu.com/ubuntu/ hardy main restricted universe
в файл /etc/apt/sources.list
далее как обычно sudo apt-get install mc
auto load rubygems
Чтобы не забыть и не искать по 100 раз.
Чтобы не писать в каждом файле require 'rubygems' надо создать environment variable RUBYOPT=rubygems
Для unix добавить строки в .profile файл
Чтобы не писать в каждом файле require 'rubygems' надо создать environment variable RUBYOPT=rubygems
Для unix добавить строки в .profile файл
export RUBYOPT=rubygems
Dell wireless 1505 in ubuntu 8.04
Пару дней назад купил ноутбук dell latitude d630 в нем стоит dell wireless 1505 draft wifi модуль (он же broadcom 4328). Под ubuntu 8.04 он автоматически не определяется, чтобы включить его необходимо иметь windows драйвер (у меня он лежал в папке c:\drivers\network\R174291) и ndiswrapper. Ndiswrapper реализует Windows kernel API и NDIS API (Network Driver Interface Specification) внутри ядра Linux, поэтому становиться возможным использовать windows драйвер. У меня все работает с версией 1.52
Чтобы установить ndiswrapper выпоняем:
После этого переходим в папку с драйвером и выполняем
Теперь wifi должен включиться, индикатор загореться.
После перезагрузки компа wifi снова disabled пока не выполнена команда sudo modprobe ndiswrapper поэтому надо сделать, чтобы она выполнялась при старте системы
Это можно сделать по разному например так.
Чтобы установить ndiswrapper выпоняем:
sudo apt-get -y install build-essential
tar zxvf ndiswrapper-1.52.tar.gz
cd ndis*
sudo make uninstall
sudo make
sudo make install
После этого переходим в папку с драйвером и выполняем
sudo ndiswrapper -i bcmwl5.inf
sudo modprobe ndiswrapper
Теперь wifi должен включиться, индикатор загореться.
После перезагрузки компа wifi снова disabled пока не выполнена команда sudo modprobe ndiswrapper поэтому надо сделать, чтобы она выполнялась при старте системы
Это можно сделать по разному например так.
среда, 21 мая 2008 г.
Ruby: file upload
В ruby есть библиотека для работы с http протоколом 'net/http'. Но по неизвестным причинам она не умеет аплоадить файлы на сервер. Эту функциональность приходиться реализовывать самостоятельно. Для этого необходимо сформировать правильный POST запрос, формат которого подробно описан в rfc1867.
Для тех кому лень читать - запрос выглядит примерно так:
Запрос не сложный, реализация тоже.
Пример использования:
Для тех кому лень читать - запрос выглядит примерно так:
Content-type: multipart/form-data, boundary=AaB03x
--AaB03x
content-disposition: form-data; name="parameter_name"
Parameter value
--AaB03x
content-disposition: form-data; name="name"; filename="file_name"
Content-Type: text/plain (зависит от типа файла)
... содержание файла ...
--AaB03x--
Запрос не сложный, реализация тоже.
require 'net/http'
class MultipartPostRequest
#
# url = URI.parse('http://test.com/path')
# post = MultipartPostRequest.create(url,
# { :file => File.open(filename), :filename => filename })
# res = Net::HTTP.start(url.host, url.port) do |http|
# http.request(post)
# end
#
def self.create(uri, pars)
post = Net::HTTP::Post.new(uri.path)
boundary = (rand*1000000000).to_i.to_s
post.set_content_type("multipart/form-data", {:boundary => boundary})
body = ""
pars.each do |key, value|
body << "--#{boundary}\r\n"
append_post_parameter(body, key, value)
end
body << "--#{boundary}--"
post.content_length = body.length
post.body = body
return post
end
def self.append_post_parameter(body, key, value)
if value.class == File
body << "Content-disposition: form-data; name=\"#{key}\";\
filename=\"#{File.basename(value.path)}\"\r\n"
body << "Content-type: application\r\n"
body << "Content-Transfer-Encoding: binary\r\n\r\n"
body << value.binmode.read
body << "\r\n"
else
body << "Content-disposition: form-data; name=\"#{key}\"\r\n\r\n"
body << "#{value}\r\n"
end
end
end
Пример использования:
uri = URI.parse('http://test.com/path')
post = MultipartPostRequest.create(uri,
{ :file => File.open(filename), :another => "parameter" })
res = Net::HTTP.start(uri.host, uri.port) do |http|
http.request(post)
end
вторник, 13 мая 2008 г.
Ruby: reading binary files
Столкнулся с неожиданным в ruby.
Обычно, чтобы прочитать файл достаточно написать:
но оказывется это хорошо работает только если файл текстовый. Если же файл бинарный, то он может прочитаться не полностью, видимо встречается какой-то символ который воспринимается как конец файла (какой именно еще не выяснил).
Пример:
Чтобы прочитать такой файл правильно надо использовать binmode
Обычно, чтобы прочитать файл достаточно написать:
content = File.open("filename").readно оказывется это хорошо работает только если файл текстовый. Если же файл бинарный, то он может прочитаться не полностью, видимо встречается какой-то символ который воспринимается как конец файла (какой именно еще не выяснил).
Пример:
File.size("c:\\bg.png") # => 15096
File.open("c:\\bg.png").read.length # => 4002
Чтобы прочитать такой файл правильно надо использовать binmode
File.open("c:\\bg.png").binmode.read.length # => 15096
понедельник, 10 марта 2008 г.
Ruby: str += "s" vs. str << "s"
Вообще довольно тривиальная вещь, но для меня она явилась некоторой неожиданностью.
Возможно из-за того, что последние 3 года я все время писал программы на .net я как-то привык к тому, что строки являются immutable. Соответственно чтобы изменить строку надо написать что то вроде этого:
Этот же подход я по привычке стал использовать в ruby (1.8), но оказалось что это очень, очень медленно и гораздо быстрее выполняется конкатенация строк так:
Вот тест:
Результаты такие:
То есть "<<" работает примерно в 100 раз быстрее. Видимо из-за того что не создает новых объектов.
Возможно из-за того, что последние 3 года я все время писал программы на .net я как-то привык к тому, что строки являются immutable. Соответственно чтобы изменить строку надо написать что то вроде этого:
string str = "first";
str += "second";
Этот же подход я по привычке стал использовать в ruby (1.8), но оказалось что это очень, очень медленно и гораздо быстрее выполняется конкатенация строк так:
str = "first"
str << "second"
Вот тест:
require 'benchmark'
include Benchmark
str1, str2 = "", ""
bm(6) do |x|
x.report("<<") { 100000.times { str1 << "1" } }
x.report("+=") { 100000.times { str2 += "1" } }
end
Результаты такие:
user system total real
<< 0.094000 0.000000 0.094000 ( 0.094000)
+= 9.125000 0.000000 9.125000 ( 9.125000)
То есть "<<" работает примерно в 100 раз быстрее. Видимо из-за того что не создает новых объектов.
четверг, 7 февраля 2008 г.
WPF Application Quality Guide
Пару дней назад Microsoft выпустила первую версию своих рекомендаций о том как улучшить автоматизированное тестированиеи WPF приложений
Смотреть тут.
Скачать сразу doc.
Смотреть тут.
Скачать сразу doc.
Подписаться на:
Сообщения (Atom)