Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Программирование в среде .NET (ASP.NET,ADO.NET) на C#/VB.NET

Автор: Macht59
Дата сообщения: 06.01.2012 01:28
Вопрос по реализации паттерна Singleton.
Почему он работает?


Код:
public class Singleton
{
/// Защищенный конструктор нужен, чтобы предотвратить создание экземпляра класса Singleton
protected Singleton() { }

private sealed class SingletonCreator
{
private static readonly Singleton instance = new Singleton();
public static Singleton Instance
{
get
{
return instance;
}
}
}

public static Singleton Instance
{
get { return SingletonCreator.Instance; }
}

public int PropertyForTests { get; set; }
}
Автор: Molniev
Дата сообщения: 06.01.2012 09:17
Macht59

Цитата:
private static readonly Singleton instance = new Singleton();
Мне так кажется (и я скорее всего ошибаюсь) что каждый раз создается новый экземпляр класса Singleton. Поясните почему я не прав.

Нет. Вы абсолютна правы)) new - вызывает конструктор и пытается создать новый объект класса (странно, что это факт вызывает вопрос). Но доступного то конструктора нету - вот ничто и не работает.

Ваш коды должен выглядеть примерно в таком ключе:

Код: Singleton s = Singleton.Instance;
s.PropertyForTests = 0;
Автор: May_Johnson
Дата сообщения: 06.01.2012 21:48
*facepalm*

Macht59
По поводу вашего вопроса

Цитата:
Почему он работает?


instance это статический член класса SingletonCreator. Статические члены инициализируются только один раз. Вне зависимости от колличества обращений, или колличества создаваемых экземпляров класса к которому они принадлежат.

Molniev

Цитата:
Зачем извращаться с конструкторами если статические классы и есть реализация этого паттерна в чистом виде?


не смотря на кажущююся похожесть, статический класс и синглтон все же разные вещи.
вот тут хорошо написано :
http://dotnet.dzone.com/news/c-singleton-pattern-vs-static-
Автор: Molniev
Дата сообщения: 07.01.2012 09:49
May_Johnson
Я понимаю разница между и несколько погорячился отписывая, что это реализация в чистом виде. В итоге написанл неправильно)) Просто для большого класса задач, где подходит паттерн одиночки достаточно статического класса или же достаточно при небольших изменениях логики работы с ним.
Автор: ComradG
Дата сообщения: 11.01.2012 20:38
товарищи, кто-нибудь встречал предварительную спецификацию c# 5 в сети ил все же это пока миф? четверку нашел на сайте M$, а пятерки нет, но есть несколько статей про грядущие новвоведения. в чем подвох?
Автор: moverast
Дата сообщения: 12.01.2012 10:07
подскажите пожалуйста как на C# (Visual Studio 2010. FW 4.0) сохранить в файл дамп памяти процесса?
мне нужно сделать аналог функции в диспетчере задач "Создать файл дампа памяти".
как альтернатива можете подсказать как сделать дамп из командной строки(cmd).
PS: без привлечения сторонних программ, то есть средствами операционной системы(Windows 7/Server 2008 R2).
Автор: AftarJjet
Дата сообщения: 23.01.2012 00:04
Как скрыть эту беду от злобных антивирусов? Пароль - shell.
Это же не зловред...
Автор: AftarJjet
Дата сообщения: 23.01.2012 02:52
...Это не зловред, это веб-шелл для удобной работы на сайтах, в среде .NET.
Автор: ComradG
Дата сообщения: 23.01.2012 09:17
AftarJjet
программно? или вообще? если программно, то накатить простенький обфускатор, благо в .NET предусмотрено достаточно классов шифрования, а так... так, скорее это тема по вирям, и самым простым, что можно сделать - натянуть пакер\криптор, который обламывает рога антивирям.

кто-нибудь пользовался в своих проектах API'шной функцией DeviceIoControl? давеча возникла необходимость навалять программку, проверяющую открыт ли на данный момент лоток CD-привода или все же закрыт, в итоге вспомнил про DeviceIoControl, но до сего дня я не сталкивался с необходимость юзать ее в C#, так что, пожалуйста, если не сложно помогите разобраться с оной задачкой, а то после кодинга на ассемблере C# кажется чем-то с далекой планеты. заранее благодарен.
Автор: o_l_i_ve_r_89
Дата сообщения: 23.01.2012 11:15
В програме написаной на С# использую подключение по SSH к серверу, при выполнении функции: RunCommand(tcpdump -s 0 host IPadress -w file.cap &), программа дальше не выполняется, а зависает та как ждет пока нажмется Enter. Как можно сделать чтоб в этой же команде отправить enter или как то по другому чтоб программа выполнялась дальше. Подскажите пожалуйста кто что знает по этому поводу.........
Автор: Andryshok
Дата сообщения: 25.01.2012 08:36
o_l_i_ve_r_89 а System.Diagnostics.Process.Start("прога...",strCmdText) не подойдет ?

А ентер мона отправить например так
SendKeys.SendWait("~"); - отправка Enter - вроде так
Автор: siriusall
Дата сообщения: 30.01.2012 10:53
Добрый день.
Как можно изменить формат вывода даты, уже всу голову сломал.
Переехали на новый сервак, и тперь у нас день, месяц год.

даты новостей в access, на сайте цепляются <%=rs("Date")%> и как переправить не понятно.
Автор: ComradG
Дата сообщения: 30.01.2012 11:25
siriusall

Цитата:
Как можно изменить формат вывода даты?
смотря что имеется в виду. если об использовании инвариантной культуры, то:
Код: using System;
using System.Globalization;
...
DateTime now = new DateTime();
Console.WriteLine(now.ToString(CultureInfo.InvariantCulture));
Автор: siriusall
Дата сообщения: 30.01.2012 11:31
ComradG
Спасибо, я читал там статьи, нашел вот :
<% Session.LCID=2058
'OR use the VBScript SetLocale function to set the locale.
Response.Write FormatDateTime( Now(), 2)
'The Constant 2 is for obtaining the vbShortDate.
%>

не помогло, и глоболизацию пробывал тоже не помогает

Страно то что в админке дата у новости кажет нормально, а на сайте в американский формат уходит.
Автор: Mextrom
Дата сообщения: 30.01.2012 11:47
siriusall
Здесь есть пример использования формата даты и времени (Plat.Datau.ToString("yyyy-MM-dd HH:mm:ss.FFF")) и ссылка на страницу со справкой.

Цитата:
Страно то что в админке дата у новости кажет нормально, а на сайте в американский формат уходит.

Культура (CultureInfo) на машинах разная.
Автор: siriusall
Дата сообщения: 30.01.2012 11:52
Mextrom
Как она может быть разной? админка сайта и и сам сайт?
Автор: ComradG
Дата сообщения: 30.01.2012 12:02
siriusall
насколько мне не изменяет память, то разность культур зависит далеко не в последнюю очередь от локали. в статье "локализация"вроде довольно подробно рассматриваются культуры.
Автор: siriusall
Дата сообщения: 30.01.2012 12:05
Все проблему решил, если кому интересно или малоли:

<% = FormatMediumDate(rs("date")) %>

<%
Function FormatMediumDate(DateValue)
Dim strYYYY
Dim strMM
Dim strDD

strYYYY = CStr(DatePart("yyyy", DateValue))

strMM = CStr(DatePart("m", DateValue))
If Len(strMM) = 1 Then strMM = "0" & strMM

strDD = CStr(DatePart("d", DateValue))
If Len(strDD) = 1 Then strDD = "0" & strDD

FormatMediumDate = strMM & "/" & strDD & "/" & strYYYY

End Function
%>
Автор: LuckyStrike
Дата сообщения: 18.02.2012 12:20
Здравствуйте.....помогите пожалуйста!
пишу программу которая по нажатию кнопки отправляет сообщение на почту. через smtp сервер.

SmtpClient Smtp = new SmtpClient("smtp.mail.ru", 25);
Smtp.Credentials = new NetworkCredential("maa_69@mail.ru", "пароль");

MailMessage Message = new MailMessage();
Message.From = new MailAddress("stepan_m01@mail.ru");
Message.To.Add(new MailAddress("maa_69@mail.ru"));
Message.Subject = "WAND";
Message.Body = "Сообщение";
Smtp.Send(Message);
но выскакиевает ошибка:
Неправильная последовательность команд. Ответ сервера: Administrative prohibition -- authorization required. Users in your domain are not allowed to send email without authorization. See http://help.mail.ru/mail-help/mailer/popsmtp for details.

Добавлено:
хотя нет, исправлюсь.....ошибка вот такая
"Синтаксическая ошибка в аргументах или параметрах. Ответ сервера: sender address must match authenticated user"
Автор: Mextrom
Дата сообщения: 19.02.2012 10:27
LuckyStrike
По-моему, перепутаны адреса From и To. Или Credentials. Свойство Credentials должно содержать данные отправителя, в приведённом коде - данные получателя.
Автор: LuckyStrike
Дата сообщения: 20.02.2012 12:46
да спасибо) все так и есть)
Автор: LuckyStrike
Дата сообщения: 21.02.2012 11:45
Еще раз здравствуйте уважаемые программеры! Пишу программу для сравнения 2х картинок PSNR, вот прилагающий код:

Код:
public static double MSE(Bitmap bmp1, Bitmap bmp2)
{
double mse = 0;
Color bmpcolor1 = new Color();
Color bmpcolor2 = new Color();
for (int i = 0; i < bmp1.Width; i++)
{
for (int j = 0; j < bmp1.Height; j++)
{
for (int i1 = 0; i1 < bmp1.Width; i1++)
{
for (int j1 = 0; j1 < bmp1.Height; j1++)
{
bmpcolor1 = bmp1.GetPixel(i1, j1);
}
}
for (int i2 = 0; i2 < bmp2.Width; i2++)
{
for (int j2 = 0; j2 < bmp2.Height; j2++)
{
bmpcolor2 = bmp2.GetPixel(i2, j2);
}
}

mse = 1 / (bmp1.Width * bmp1.Height) * Math.Pow(Math.Abs(int.Parse(bmpcolor1.ToString()) - int.Parse(bmpcolor2.ToString())), 2);

}
}
return mse;
}

private void рассчитатьPSNRToolStripMenuItem_Click(object sender, EventArgs e)
{
Bitmap bmp1 = new Bitmap(pictureBox1.Image);
Bitmap bmp2 = new Bitmap(pictureBox2.Image);
int depth1 = Image.GetPixelFormatSize(bmp1.PixelFormat);
int depth2 = Image.GetPixelFormatSize(bmp2.PixelFormat);
double MAX = Math.Pow(2,depth1)-1;
double PSNR = 20 * Math.Log10(MAX / Math.Sqrt(MSE(bmp1, bmp2)));
label4.Text = PSNR.ToString();
}
Автор: Mextrom
Дата сообщения: 22.02.2012 08:57
LuckyStrike
Метод расчёта MSE я бы написал так:
Код: static double CalcMSE(Bitmap bmp1, Bitmap bmp2)
{
double mse = 0.0;
for (int i = 0; i < bmp1.Width; i++)
{
for (int j = 0; j < bmp1.Height; j++)
{
mse += Math.Pow(Math.Abs(int.Parse(bmp1.GetPixel(i, j).ToArgb().ToString()) - int.Parse(bmp2.GetPixel(i, j).ToString())), 2);
}
}
mse *= 1.0 / (bmp1.Width * bmp1.Height);
return mse;
}
Автор: LuckyStrike
Дата сообщения: 22.02.2012 10:42
То есть, простым языком при подсчете MSE для цыетных получаеться, я так понимаю?
mse *= 1.0 / ((bmp1.Width * bmp1.Height)*3);


Добавлено:
или плюс еще в цикле складывать mse по трем цветам оттдельно??

Добавлено:
Mextrom
вот посмотри если можешь, ошибка перестала выскакивать, но в подсчете PSNR пишет бесконечность

Код:
public static double MSE(Bitmap bmp1, Bitmap bmp2)
{
double mse = 0;
double mseR = 0;
double mseG = 0;
double mseB = 0;
for (int i = 0; i < bmp1.Width; i++)
{
for (int j = 0; j < bmp1.Height; j++)
{
mseR += Math.Pow(Math.Abs(bmp1.GetPixel(i, j).R - bmp2.GetPixel(i, j).R), 2);
mseG += Math.Pow(Math.Abs(bmp1.GetPixel(i, j).G - bmp2.GetPixel(i, j).G), 2);
mseB += Math.Pow(Math.Abs(bmp1.GetPixel(i, j).B - bmp2.GetPixel(i, j).B), 2);
mse += mseR + mseG + mseB;
}
}
mse *= 1 / ((bmp1.Width * bmp1.Height)*3);
return mse;
}
Автор: Mextrom
Дата сообщения: 22.02.2012 14:49
LuckyStrike
Я пробовал делать так
Код: using System;
using System.Drawing;

namespace PSNR
{
class Program
{
static void Main(string[] args)
{
string path1 = "d:/downloads/PSNR-example-base.png";
string path2 = "d:/downloads/PSNR-example-comp-30.jpg";
string path3 = "d:/downloads/PSNR-example-comp-90.jpg";

Bitmap bmp1 = (Bitmap)Bitmap.FromFile(path1);
Bitmap bmp2 = (Bitmap)Bitmap.FromFile(path2);
Bitmap bmp3 = (Bitmap)Bitmap.FromFile(path3);

Console.WriteLine(CalcPSNR(bmp1, bmp1)); // должна получиться бесконечность
Console.WriteLine(CalcPSNR(bmp1, bmp2));
Console.WriteLine(CalcPSNR(bmp1, bmp3));
}

private static double CalcMSE(Bitmap bmp1, Bitmap bmp2)
{
double mse = 0;
double mseR = 0;
double mseG = 0;
double mseB = 0;
for (int i = 0; i < bmp1.Width; i++)
{
for (int j = 0; j < bmp1.Height; j++)
{
mseR += Math.Pow(bmp1.GetPixel(i, j).R - bmp2.GetPixel(i, j).R, 2);
mseG += Math.Pow(bmp1.GetPixel(i, j).G - bmp2.GetPixel(i, j).G, 2);
mseB += Math.Pow(bmp1.GetPixel(i, j).B - bmp2.GetPixel(i, j).B, 2);
}
}
mse = (mseR + mseG + mseB) / ((bmp1.Width * bmp1.Height) * 3);
return mse;
}

private static double CalcPSNR(Bitmap bmp1, Bitmap bmp2)
{
double max = Bitmap.GetPixelFormatSize(bmp1.PixelFormat);
double psnr = 20.0 * Math.Log10(max / Math.Sqrt(CalcMSE(bmp1, bmp2)));
return psnr;
}
}
}

Автор: LuckyStrike
Дата сообщения: 22.02.2012 20:19
ну max вроде как бы надо брать по первой картинке 2^b-1, b - глубина картинки, вроде так

Добавлено:
и смотри, ты получаеться по модулю не берешь разность, там по можулю надо

Добавлено:
я короче их исходной картинки конвертирую в yuv и потом их сравниваю, и бесконечность все равно появляется. хз че делать(
Автор: Mextrom
Дата сообщения: 22.02.2012 23:50
LuckyStrike

Цитата:
ну max вроде как бы надо брать по первой картинке 2^b-1, b - глубина картинки, вроде так

Как я понял, предполагается, что глубина у картинок одинаковая. У меня - разная. Хотя если у png просто не учитывать альфа-канал, то одинаковая.

Цитата:
и смотри, ты получаеться по модулю не берешь разность, там по можулю надо

Разность всё равно возводится в квадрат, так что не понятно, зачем там вообще модуль. Либо я что-то не так понял в формуле. Матан уже благополучно забыл...

Цитата:
я короче их исходной картинки конвертирую в yuv и потом их сравниваю, и бесконечность все равно появляется. хз че делать(

Бесконечность получается, когда сравниваются одинаковые картинки, т.к. среднеквадратичное отклонение равно нулю. У меня бесконечность вылезла, когда я сравнивал исходную картинку саму с собой. В двух других случая у меня получилось примерно 15 и 20 дБ (вместо 36 и 45). Перепроверь, что с чем сравниваешь.
Автор: LuckyStrike
Дата сообщения: 23.02.2012 07:40

Цитата:
Бесконечность получается, когда сравниваются одинаковые картинки, т.к. среднеквадратичное отклонение равно нулю. У меня бесконечность вылезла, когда я сравнивал исходную картинку саму с собой. В двух других случая у меня получилось примерно 15 и 20 дБ (вместо 36 и 45). Перепроверь, что с чем сравниваешь.

вот я сравниваю исходную, и конвертированую, вот код конвертора из RGB в YUV
[code]
private void RGB_to_YUVToolStripMenuItem_Click(object sender, EventArgs e)
{
Bitmap bmp = new Bitmap(pictureBox1.Image);
for (int i = 0; i < bmp.Width; i++)
{
for (int j = 0; j < bmp.Height; j++)
{
Color bmpColor = bmp.GetPixel(i, j);
y = clip((int)(0.299 * bmpColor.R + 0.587 * bmpColor.G + 0.144 * bmpColor.B));
u = clip((int)(-0.14713 * bmpColor.R - 0.28886 * bmpColor.G + 0.436 * bmpColor.B));
v = clip((int)(0.615 * bmpColor.R - 0.51499 * bmpColor.G - 0.10001 * bmpColor.B));
bmp.SetPixel(i, j, Color.FromArgb(y, u, v));
}
}
pictureBox2.Image = bmp;
pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage;
}
[\code]
по идеи значения пикселей разные, и должна же быть разница PSNR, а выходит бесконечность
Автор: Mextrom
Дата сообщения: 23.02.2012 12:28
LuckyStrike
В твоём методе я строку Bitmap bmp = new Bitmap(pictureBox1.Image); заменил на Bitmap bmp = new Bitmap(pictureBox1.Image.Width, pictureBox1.Image.Height);, остальное всё то же самое.
Результаты для тех же картинок: бесконечность для сравнения исходной с самой собой, 21 и 27 соответственно для сравнения исходной с двумя другими.
Только сам метод конвертации странный. Ты получаешь yuv компоненты, а потом используешь их как rgb. Смотрел, что за изображение в итоге получается? У меня картинка становится красной.
Автор: LuckyStrike
Дата сообщения: 23.02.2012 13:27
Ну да, так и есть вроде бы...у меня тоже красная она становиться, правда не всегда, бывает и фиолетовая
вот ссылка про YUV http://ru.wikipedia.org/wiki/YUV

Добавлено:
и картинки я беру обычные из винды которые, из папки мои изображения......может просто разрешение для них большое, поэтому пснр считает бесконечность??

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102

Предыдущая тема: Как удалить/добавить/отключить/включить устройство?


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.