понедельник, 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