В TCPServer (Ruby), как я могу получить IP/MAC от клиента?

Я хотел бы предложить другой угол проблеме расстояния между OO и RDB: история.

Любое программное обеспечение имеет модель действительности, которая является до некоторой степени абстракцией действительности. Никакая компьютерная программа не может получить все сложности действительности, и программы записаны только для решения ряда проблем от действительности. Поэтому любая модель программного обеспечения является сокращением действительности. Иногда модель программного обеспечения вынуждает действительность уменьшить себя. Как то, когда Вы хотите, чтобы компания по прокату автомобилей зарезервировала любой автомобиль для Вас, пока это сине и имеет сплавы, но оператор не может соответствовать, потому что Ваш запрос не поместится в компьютер.

RDB прибывает из очень старой традиции помещения информации в таблицы, названные учетом. Учет был сделан на бумаге, затем на перфокартах, затем в компьютерах. Но учет уже является сокращением действительности. Учет вынудил людей следовать за его системой так долго, что это стало принятой действительностью. Вот почему относительно легко сделать программное обеспечение для учета, учет имел свою информационную модель, задолго до того, как компьютер пришел.

, Учитывая важность хороших систем учета и принятие Вы добираетесь от любых управляющих делами, эти системы стали очень усовершенствованными. Основы базы данных являются теперь очень прочными, и никто не сомневается в хранении жизненных данных в чем-то таким образом защищенном.

я предполагаю, что OO, должно быть, пришло, когда люди нашли, что другие аспекты действительности более трудно смоделировать, чем учет (который уже является моделью). OO стало очень успешной идеей, но постоянство данных OO относительно слаборазвито. RDB/Accounting имел легкие победы, но OO является намного более крупным полем (в основном все, что не считает).

Столь многие из нас хотели использовать OO, но мы все еще хотим безопасное устройство хранения данных наших данных. Что может быть более безопасным, чем хранить наши данные тот же путь, как уважаемая система учета делает? Это - соблазнительные перспективы, но все мы сталкиваемся с теми же ловушками. Очень немногие позаботились думать о персистентности OO по сравнению с широкомасштабными усилиями промышленностью RDB, кто обладал преимуществом традиции и положения учета.

Prevayler и db4o являются некоторыми предложениями, я уверен, что существуют другие, о которых я не услышал, но ни один, казалось, не получил половину нажатия как, скажем, спящий режим.

к Хранить Ваши объекты в старых добрых файлах, даже кажется, не относятся серьезно для многопользовательских приложений и особенно веб-приложений.

В моей повседневной борьбе для закрытия пропасти между OO и RDB я использую OO как можно больше, но пытаюсь свести наследование к минимуму. Я не часто использую SPS. Я буду использовать материал расширенного запроса только в аспектах, которые похожи на учет.

я буду счастливо supprised, когда пропасть будет закрыта навсегда. Я думаю, что решение прибудет, когда Oracle запустит что-то как "Основа Экземпляра объекта Oracle". Для реального завоевывания популярность это должно будет иметь имя заверения.

5
задан a0rtega 16 August 2009 в 11:26
поделиться

2 ответа

Используйте socket.addr :

irb(main):011:0> socket.addr
=> ["AF_INET", 50000, "localhost", "127.0.0.1"]

Возвращает массив, показывающий тип сокета, порт и информацию о хосте.

Относительно поиска MAC-адреса , Я не знаю ни одного встроенного. Если вам нужен локальный MAC-адрес, вы можете использовать гем "macaddr" Ара Ховарда. Если вам нужен удаленный MAC-адрес, вы можете использовать программу командной строки arp и проанализировать ее вывод. Обратите внимание, что это будет действительно только в том случае, если удаленная машина находится в той же локальной сети, поскольку MAC-адреса не передаются через нелокальные сети.

5
ответ дан 18 December 2019 в 14:49
поделиться

System.Drawing.Imaging действительно дает вам дополнительный контроль над сжатием изображения, если вы передаете кодек JPEG и устанавливаете для параметра кодировщика значение «Качество», которое, по сути, представляет собой процент удержания.

Вот функция, которую я использую с параметром «image / jpeg» для получения кодека JPEG. (Это не связано со сжатием как таковым , но для перегрузок Image.Save , которые принимают EncoderParameters , требуется ImageCodecInfo вместо ] ImageFormat .)

//  assumes an encoder for "image/jpeg" will be available.
public static ImageCodecInfo GetCodec( string mimeType )
{ 
    ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders(); 

    for( int i = 0;  i < encoders.Length;  i++ )
        if( encoders[i].MimeType == mimeType )
            return encoders[i];

    return null; 
}

Затем вы можете установить параметры кодировщика перед сохранением изображения.

EncoderParameters ep = new EncoderParameters(2);
ep.Param[0] = new EncoderParameter( Encoder.Quality,    percentRetention ); // 1-100
ep.Param[1] = new EncoderParameter( Encoder.ColorDepth, colorDepth ); // e.g. 24L

(Существуют и другие параметры кодировщика - см. Документацию.

Итак, соберите все вместе, и вы можете сказать

image.Save( outFile, GetCodec("image/jpeg"), ep );

(Я сохраняю кодек и параметры в статических значениях, поскольку они используются снова и снова , но я хотел упростить пример здесь.)

Надеюсь, это поможет!

РЕДАКТИРОВАТЬ: Если вы масштабируете изображения, у вас также есть некоторый контроль над качеством. Да, это очень «черный ящик», но я считаю, что это работает хорошо. Вот настройки «хорошо и медленно» (которые вам нужно установить перед вызовом DrawImage, но вы можете найти «быстрые и грязные» версии.

// good & slow
graphics.SmoothingMode      = SmoothingMode.HighQuality;
graphics.InterpolationMode  = InterpolationMode.HighQualityBicubic;
graphics.PixelOffsetMode    = PixelOffsetMode.HighQuality;
graphics.CompositingQuality = CompositingQuality.HighQuality;
-121 --- 4997326) -

Ruby 1.8.7:

>> fam, port, *addr = socket.getpeername.unpack('nnC4')
=> [4098, 80, 209, 191, 122, 70]
>> addr
=> [209, 191, 122, 70]
>> addr.join('.')
=> "209.191.122.70"

Ruby 1.9 делает его немного более простым:

>> port, ip = Socket.unpack_sockaddr_in(socket.getpeername)
=> [80, "209.191.122.70"]
>> ip
=> "209.191.122.70"
8
ответ дан 18 December 2019 в 14:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: