пятница, 12 сентября 2008 г.

Создание environment variables в Mac OSX Leopard

Рабочая инструкция

Установка 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 - тут рабочая инструкция

вторник, 1 июля 2008 г.

Ruby: hpricot error

Если у вас стоит задача распарсить / изменить какой то html, и вы пишете на ruby то на мой взгляд идеальный вариант - использование небольшой и быстрой библиотеки hpricot. Она написана на С поэтому работает довольно быстро (быстрее чем другие парсилки).

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. Добавляем туда
require 'rubygems'
require 'wirble'
Wirble.init
Wirble.colorize

понедельник, 26 мая 2008 г.

installing mc in ubuntu 8.04

Чтобы установить на ubuntu 8.04 midnight commander надо сначала добавить следующие источники
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 файл
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 выпоняем:
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.

Обычно, чтобы прочитать файл достаточно написать:
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. Соответственно чтобы изменить строку надо написать что то вроде этого:

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.