Monday, October 6, 2008

Thursday, October 2, 2008

Disabled Recycle Bin

В новой сборке винды на работе предустановлена настройка "не помещать удаляемые файлы в корзину" и в свойствах корзины все настройки заблокированы. Запарился искать в инете как включить. Пришлось спросить у админа... Вот рецепт:

Установить значение ключа NoRecycleFiles = 0 в ветке HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer

Saturday, September 13, 2008

Подключить usb-диск по сети

Стал я таскать с собой переносной винт.
На работу пришел - красота : свой винт быстро, удобно, безопасно.
Домой пришел - проблема : подключать к ноуту провода мерзко. Решил подключить сетевым диском. Т.е. прихожу, втыкаю в сервер винт, права даю только себе по сети, наслаждаюсь беспроводным винтом. Без проблем не обошлось.
Подключил, расшарил, надо теперь подключить сетевой диск с паролем от учетной записи на сервере (домена нет. все на рабочих группах). Пытаюсь подключить - а он мне
"The Network folder specified is currently mapped using a different user name and password."

Нашелся добрый Travis, который подсказал в своем блоге, что нужно либо по айпи адресу подключать, либо убить у себя шару IPC$

Tuesday, August 19, 2008

Знаки вопроса в far

Ночью надо спать...
Нет, не обязательно спать ночь. Можно днем. Но спать надо...
Седня за***лся от того, что в Far у меня вместо русских букв отображались знаки вопроса. Прям все имена файлов в виде ?????????.txt
Обыскался в инете в чем дело. В форумах находил обсуждение проблем со шрифтами, но нигде такого случая, как у меня.
Долго я не мог вспомнить, что поменял в региональных настройках язык для программ не поддерживающих юникод.... Исправил на русский, ребутнулся и все заработало.

(п.с.: 4ый час утра. на улице духота. гремит гром, дождя нет. завтра на работу.)

Monday, August 18, 2008

Hide navigation bar in blogger

Наткнулся седня на совет, как убрать navigation bar из своего блога на блоггере.

дословный копипаст:


если Вы не хотите чтобы вверху вашего блога на Blogger.com был виден Navbar (служебный бар-полоска от Блоггера), тогда вставте в Ваш шаблон, в раздел стилей, эти строки:

#navbar-iframe {
height: 0px;
visibility: hidden;
display: none;
}

все, теперь этот Navbar буден невидим для пользователя.

Sunday, August 17, 2008

Default button & Default focus in user controls.

Возникла задача устанавливать фокус ввода на нужный контрол внутри user control и выбирать кнопку, которую надо нажать, когда в TextBox нажимают "Enter".

1) Для назначения чего нажимать при нажатии "Enter" легко удалось найти решение в инете:
пишется джава-скрипт

function TestEnterKey(btn)
{
if (document.all)
{
if (event.keyCode == 13)
{
event.returnValue=false;
event.cancel = true;
document.getElementById(btn).click();
}
}
}


и метод, который будет его привязывать к контролу
    /// <summary>
/// Adds js to TextBox, that hits Button on pressing "Enter".
/// </summary>
/// <param name="baseControl">Control, that contains textbox and button.</param>
/// <param name="textBoxName">Text box, to which js should be added.</param>
/// <param name="buttonName">Button, that we should hit on pressing Enter.</param>
public static void AddDefaultButton(this Control baseControl, string textBoxName, string buttonName)
{
TextBox tb = ((TextBox) baseControl.FindControl(textBoxName));
tb.Attributes.Add("onkeypress",
"TestEnterKey(\"" +
baseControl.FindControl(buttonName).ClientID +
"\");");
}


теперь это можно использовать так:
PasswordRecovery1.UserNameTemplateContainer.AddDefaultButton("UserName", "SubmitButton");
PasswordRecovery1.QuestionTemplateContainer.AddDefaultButton("Answer", "SubmitButton1");


2) Сложнее оказалось с выставлением контрола, который будет выбираться по умолчанию.
Мне не удалось найти решение, которое меня полностью удовлетворило. В основной своей массе решения были пригодны либо только для серверных контролов и использовали методы Focuse(), SetFocuse(control), либо привязывали джава-скрипт к событию формы типа <form ... onload="some_java_script">. Последнее решение наиболее близко подходит к тому, что надо было мне. Но с ним есть беда: как привязывать джава-скприпт из user control? если внитри user control есть несполько панелек, и только одна из них видима в тот или иной postback, или, например, контрол состоит из шагов мастера, что собственно тоже самое, тогда надо определить несколько контролов, которые будут дефолтными и только на один из них в итоге будет выставлен фокус.

Короче такого решения я не нашил и пришлось написать велосипед.
Сделал так:
Написал метод:
    /// <summary>
/// Adds client-side script, that sets focus to the specified control.
/// </summary>
/// <param name="sender">Control that should be focused.</param>
/// <param name="e">Some other stuff, that isn't used here.</param>
public static void SetFocus(object sender, EventArgs e)
{
Control control = (Control) sender;
if (control != null)
{
string script = string.Format("setFocus(\"{0}\");", control.ClientID);
control.Page.ClientScript.RegisterStartupScript(typeof(string), Guid.NewGuid().ToString(), script, true);
}
}

, который привязывает к странице следующий скрипт:
function setFocus(ctrl)
{
var control = document.getElementById(ctrl);
if( control != null )
{
control.focus();
}
}

в итоге использовать это можно так:
PasswordRecovery1.UserNameTemplateContainer.FindControl("UserName").PreRender += Utils.SetFocus;
PasswordRecovery1.QuestionTemplateContainer.FindControl("Answer").PreRender += Utils.SetFocus;

Wednesday, August 6, 2008

IIS: two web-sites with different domains on one web-server

Всегда меня удивляло, что в IIS 6 на Windows XP только один веб-сайт и нельзя сделать второй. Сегодня я задался вопросом, как задать двум и более сайтам на своем веб-сервере разные доменные адреса типа aaa.com, bbb.com. Как выяснилось на моем веб-сервере с моей ОС это невозможно. Нужно либо ставить винду 2003, либо, что проще, поставить IIS 7. На лаптопе с вистой таких проблем нет :)

Wednesday, July 30, 2008

Easy encrypt/decrypt in .Net

Задался я целью побыстрому зашифровать/расшифровать небольшую строчку на asp странице. Как полагается поискал готовое. Нашел несколько ужасных реализаций. Например, на CodeProject автор статьи наляпал изрядное кол-во грубых ошибок. Имхо, это непростительно при написании статьи. Но код в статье на codeproject хоть и бажный, но изредка работает, если попадутся удачная строка и ключ.. Однако, все это еще цветочки по сравнению с говнокодом, который я нашел в msdn. Тут явно не обошлось без поочередного творчества индуса и китайца... Ихний код у меня не сработал ни разу. И сдается мне что вероятность его срабатывания стремится к нулю...
Короче, ничего приемлимого я не нашел и, к сожалению, пришлось делать велосипед:

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

class Members
{
[STAThread]
static void Main()
{
Random random = new Random(DateTime.Now.Millisecond);
for (int i = 0; i < 100000; i++)
{
string source = (Guid.NewGuid().ToString() + Guid.NewGuid()).Substring(0, random.Next(Guid.Empty.ToString().Length));
string supperKey = (Guid.NewGuid().ToString() + Guid.NewGuid()).Substring(0, random.Next(Guid.Empty.ToString().Length));
string encrypted = Cryptor.Encrypt(source, supperKey);
string decrypted = Cryptor.Decrypt(encrypted, supperKey);
if (source != decrypted)
throw new ApplicationException("This shit should never happen!!!");
}
}

}

// <summary>
/// SymmCrypto is a wrapper of System.Security.Cryptography.SymmetricAlgorithm classes
/// and simplifies the interface. It supports customized SymmetricAlgorithm as well.
/// </summary>
public static class Cryptor
{
private static readonly SymmetricAlgorithm mobjCryptoService;

/// <remarks>
/// Constructor for using an intrinsic .Net SymmetricAlgorithm class.
/// </remarks>
static Cryptor()
{
//mobjCryptoService = new DESCryptoServiceProvider();
//mobjCryptoService = new RC2CryptoServiceProvider();
mobjCryptoService = new RijndaelManaged();
}

/// <remarks>
/// Depending on the legal key size limitations of a specific CryptoService provider
/// and length of the private key provided, padding the secret key with space character
/// to meet the legal size of the algorithm.
/// </remarks>
private static byte[] GetLegalKey(string Key)
{
int max = mobjCryptoService.LegalKeySizes[0].MaxSize;
int min = mobjCryptoService.LegalKeySizes[0].MinSize;
string sTemp;
int keyLength = Key.Length * 8;
if (keyLength > max)
{
sTemp = Key.Remove(max / 8);
}
else if (keyLength < min)
{
sTemp = Key.PadRight(min / 8, ' ');
}
else if (min < keyLength && keyLength < max)
{
sTemp = Key.Remove(min / 8);
}// else (keyLength == min | max => do nothing
else
{
sTemp = Key;
}
return Encoding.ASCII.GetBytes(sTemp);
}

private static byte[] GetLegalIV(string Key)
{
int min = mobjCryptoService.LegalBlockSizes[0].MinSize;
int keyLength = Key.Length * 8;
string sTemp;
if (keyLength > min)
{
sTemp = Key.Remove(min / 8);
}
else
{
sTemp = keyLength < min ? Key.PadRight(min / 8, ' ') : Key;
}
return Encoding.ASCII.GetBytes(sTemp);
}

public static string Encrypt(string Source, string Key)
{
byte[] bytIn = Encoding.ASCII.GetBytes(Source);
MemoryStream ms = new MemoryStream();
mobjCryptoService.Key = GetLegalKey(Key);
mobjCryptoService.IV = GetLegalIV(Key);
mobjCryptoService.Padding = PaddingMode.Zeros;
ICryptoTransform encrypto = mobjCryptoService.CreateEncryptor();
CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);
cs.Write(bytIn, 0, bytIn.Length);
cs.FlushFinalBlock();
byte[] bytOut = ms.GetBuffer();
int length = Source.Length > 0 && Source.Length % mobjCryptoService.IV.Length > 0
? (Source.Length / (mobjCryptoService.IV.Length) + 1) * mobjCryptoService.IV.Length
: Source.Length;
return Convert.ToBase64String(bytOut, 0, length);
}

public static string Decrypt(string Source, string Key)
{
byte[] bytIn = Convert.FromBase64String(Source);
MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length);
mobjCryptoService.Key = GetLegalKey(Key);
mobjCryptoService.IV = GetLegalIV(Key);
mobjCryptoService.Padding = PaddingMode.Zeros;
ICryptoTransform encrypto = mobjCryptoService.CreateDecryptor();
CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read);
StreamReader sr = new StreamReader(cs);
string result = sr.ReadToEnd();
return result.TrimEnd('\0');
}

}

Monday, July 14, 2008

Compilation error: "... System.EnterpriseServices.dll could not be found"

Злые админы переставили мне винду.
Поставил я iis, vs, создаю новый website, жму F5, получаю что-то типа

Compilation error: "... System.EnterpriseServices.dll could not be found"

порылся в инете, были разные решения. одно из них - добавить reference на System.EnterpriseServices ручками к проекту. это прокатило, но каждый раз добавлять ручками... дело ясное, что дело темное. помогла repair фреймворка 2.0. прям через add or remove programs -> ms .net framework 2.0 -> change/remove -> repair и все сразу заработало даже безе ребута :)

No ASPNET account

Поставили мне злые админы новую винду.
Поставил я себе iis, vs, а пользователь aspnet почему-то не создался.
Проблема решилась так:
C:\WINXP\Microsoft.NET\Framework\v2.0.50727>aspnet_regiis.exe -r

нашел решение тут

Thursday, June 19, 2008

IIS + SQLEXPRESS + Forms authentication + App_Data/ASPNETDB.MDF

Что-то долго я тупил пытаясь задеплоить тестовый сайтик с Forms аутенификацией на IIS.
Итак, что запомнилось:

1) если стоит vs2005 + sql server 2005 (NOT EXPRESS), тогда у меня возникала проблема с добавлением файла aspnetdb.mdf в папку app_data. выскакивало сообщение вида:
=========================================================================
Connections to SQL Server files (*.mdf) require SQL Server Express 2005
to function properly. Please verify the installation of the component or
download from the URL:
http://go.microsoft.com/fwlink/?LinkId=49251
=========================================================================

Заставить работать студию через не экспресс сервер у меня не получилось, хотя, слабо верится в то, что это невозможно. Короче решил проблему установкой экспресс сервера, тем более, что многие startup kits расчитаны именно на экспресс. Следущим после установки шагом надо поправить имя сервера в настройках студии Tools->Options->Database Tools->Data Connections->SQL Server Instance Name(blank for default): SQLEXPRESS
Должно помочь.
Еще после установки SSE(SQL Server Express) хорошо бы поменять connectionString в файле windows/microsoft.net/frameworks/v.2.0..../config/mashine.config
заменить старую строку для LocalSqlServer на новую такую:


2) если в студии все замечательно работает, страница login.aspx грузится, login контрол работает, пользователи авторизовываются, но когда переносишь сайт на IIS появляются ошибки, то надо сделать следующее:
а) в свойствах виртуальной директории дать правать на execute всей папке с сайтом + права на write папке app_data
б) дать аналогичные права пользователю aspnet на папку на винте, где лежит сам сайт
в) в web.config в membership provider задать аттрибут applicationName. я задал одно и тоже applicationName во всех провайдерах, в свойствах виртуальной директории и еще в таблице aspnet_Applications в файле ASPNETDB.MDF. Возможно это лишнее, но проверять надобность таких действий сейчас уже лень.

кусочек web.config:

    <membership defaultProvider="AspNetSqlMembershipProvider">
<providers>
<clear/>
<add
name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="RemoteDeployment"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="1"
passwordAttemptWindow="10"
passwordStrengthRegularExpression="" />
</providers>
</membership>
<profile defaultProvider="AspNetSqlProfileProvider">
<providers>
<clear/>
<add
name="AspNetSqlProfileProvider"
connectionStringName="LocalSqlServer"
applicationName="RemoteDeployment"
type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</profile>
<roleManager enabled="true" defaultProvider="AspNetSqlRoleProvider">
<providers>
<clear/>
<add
name="AspNetSqlRoleProvider"
connectionStringName="LocalSqlServer"
applicationName="RemoteDeployment"
type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add
name="AspNetWindowsTokenRoleProvider"
applicationName="RemoteDeployment"
type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</roleManager>



г) в SSE должен быть добавлен пользователь aspnet.
д) да!!! чуть не забыл: надо отключать базу aspnetdb.mdf в студии, если она открыта, и пытаешься логиниться через iis используя тотже aspnetdb.mdf, что уже открыт в студии. нето все будет валиться с ексепшеном:

System.Data.SqlClient.SqlException: Cannot open user default database. Login failed.
Login failed for user 'NT AUTHORITY\NETWORK SERVICE'.

для iis6 соответственно будет user 'NT AUTHORITY\ASPNET'

вроде все, что вспомнил

Wednesday, June 18, 2008

XmlDocument vs StringBuilder

Потестил перфоманс создания xml через XmlDocument и StringBuilder.
В моем приложении результаты получились такие:

XmlDocument: 0.2151
StringBuilder: 0.3114

В моем случае если записывать в Xml нечего, то надо было вернуть string.Empty. Для этого случая результаты такие:

XmlDocument: 0.00778
StringBuilder: 0.01386

кусочек кода на всякий случай:

        /// <summary>
/// Creates xml with calculated volume share values.
/// </summary>
/// <param name="suppliersData">Collection with calculated values.</param>
/// <param name="startIndex">Position of first supplier to be added into xml.</param>
/// <param name="endIndex">Position of last supplier to be added into xml.</param>
/// <returns>Xml with calculated data || empty string if there is no values to be loaded into db for specifeid portion of suppliers.</returns>
private static string GetVolumeShare(SupplierDataCollection suppliersData, int startIndex, int endIndex)
{
XmlDocument xmlDoc = new XmlDocument();
XmlNode root = xmlDoc.CreateElement("root");
for (int i = startIndex; i <= endIndex; i++)
{
SupplierData supplierData = suppliersData[i];
foreach (SupplierYearData supplierYearData in supplierData.YearVolumes)
{
foreach (SupplierCSData supplierCSData in supplierYearData.CSVolumes)
{
if (supplierCSData.CSVolumeShare > 0)
{
XmlNode child = xmlDoc.CreateElement("vs");
XmlAttribute childAttr = xmlDoc.CreateAttribute("SRMSId");
childAttr.Value = supplierData.SupplierId.ToString();
child.Attributes.Append(childAttr);
childAttr = xmlDoc.CreateAttribute("CS");
childAttr.Value = supplierCSData.CSId.ToString();
child.Attributes.Append(childAttr);
childAttr = xmlDoc.CreateAttribute("year");
childAttr.Value = supplierYearData.Year.ToString();
child.Attributes.Append(childAttr);
childAttr = xmlDoc.CreateAttribute("value");
childAttr.Value = supplierCSData.CSVolumeShare.ToString();
child.Attributes.Append(childAttr);
root.AppendChild(child);
}
}
}
}
if (root.ChildNodes.Count > 0)
xmlDoc.AppendChild(root);
string xmlData = xmlDoc.InnerXml;
return xmlData;
}

private static string GetVolumeShareXml(SupplierDataCollection suppliersData, int startIndex, int endIndex)
{
StringBuilder sbChilds = null;
for (int i = startIndex; i <= endIndex; i++)
{
SupplierData supplierData = suppliersData[i];
foreach (SupplierYearData supplierYearData in supplierData.YearVolumes)
{
foreach (SupplierCSData supplierCSData in supplierYearData.CSVolumes)
{
if (supplierCSData.CSVolumeShare > 0)
{
if (sbChilds == null)
sbChilds = new StringBuilder();
/*
sbChilds.Append(
string.Format("<vs SRMSId=\"{0}\" CS=\"{1}\" year=\"{2}\" value=\"{3}\" />",
supplierData.SupplierId,
supplierCSData.CSId,
supplierYearData.Year,
supplierCSData.CSVolumeShare
)
);
*/
sbChilds.Append("<vs SRMSId=\"");
sbChilds.Append(supplierData.SupplierId);
sbChilds.Append("\" CS=\"");
sbChilds.Append(supplierCSData.CSId);
sbChilds.Append("\" year=\"");
sbChilds.Append(supplierYearData.Year);
sbChilds.Append("\" value=\"");
sbChilds.Append(supplierCSData.CSVolumeShare);
sbChilds.Append("\" />");
}
}
}
}
StringBuilder sbRoot = null;
if (sbChilds != null)
{
sbRoot = new StringBuilder();
sbRoot.Append("<root>");
sbRoot.Append(sbChilds);
sbRoot.Append("</root>");
}
return sbRoot != null ? sbRoot.ToString() : string.Empty;
}



П.С.: замена StringBuilder на string.Format никакого эффекта не дало, как собсно я и ожидал.

AnkhSVN - неплохо, но для маленьких проектов

Опробовал нынче плагин для студии AnkhSVN. Прикольная штука, но только для маленьких проектов. Дома на всяких моих мелочах отлично работает, но вот на работе... проект в 300тыс.строк не тянет. Студия при открытии надолго подвисает. Тормозит дольше чем Resharper.

Friday, March 28, 2008

Genius Navigator R820BT Bluetooth рулит и бибикает

Пользуюсь мышью Genius Navigator R820BT месяц. Очень доволен. Отличное решение для лэптопа. В начале казалась очень тяжелой. Работает от аккумуляторов очень долго. При работе 3-5 часов в день заряжал за месяц 3 раза. Причем не от того, что разрядилась, а просто как-то дико не заряжать совсем...
Из минусов - не на всех поверхностях работает хорошо, хотя может так работают все мыши :) Ведь с проводной не будешь работать на стеклянном столе или на одеяле.
И думаю это не геймерская мышь. Если хочется погамать, то лучше сесть за стол и подцепить обычную мышь, и желательно не к ноуту :)

Saturday, March 15, 2008

Blogger :: textarea tag & code to html converter

Помучился я с поиском того, как втыкать свой код в блог. Сначала хотел использовать тег textarea, но blogger заменяет <enter>'ы на <br>'ы. Долго искал как это побороть. Так и не нашел :) Зато нашел замечательный конвертер кода в html. Теперь блог будет выглядеть поприличнее.

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

Visual studio :: Отображение массивов в Watch

Давно меня бесило то, что массивы в watch отображаются весьма бестолково. И никак не получалось найти способа повлиять на это. Собственно я и сейчас не представляю как спросить у гугла то, что мне надо не зная названия класса-атрибута, который отвечает за отображение в watch.
Решение нашлось случайно, когда я смотрел "исходники" Dictionary. Заметил там аттрибут DebugDisplay.
Теперь, чтобы отображать в watch то, что мне надо - пишу подходящий wrapper. Например, чтобы в двумерном массиве посмотреть третью строку, пишу обертку для одномерного массива:

        [DebuggerDisplay("{_array[2]}")]
class DebugArray
{
double [] _array;
public DebugArray(int len)
{
_array = new double[len];
}
public double this[int i]
{
get { return _array[i]; }
set { _array[i] = value; }
}
}
, т.е. для массива будет отображаться значение третьего элемента, а не кол-во элементов. И использую массив таких врапперов для получения двумерного массива:
            List<DebugArray> v = new List<DebugArray>();
v.Add(new DebugArray(dimension));
v[0][3] = 0.123;
Собственно все весьма просто. Достаточно только знать о существовании аттрибута DebugDisplay :)

Friday, March 14, 2008

Serialization of Hashtable & Dictionary

Сегодня долго тупил почему у меня не сериализуется класс, у которого дальний предок - Dictionary. Тупил, искал в msdn до тех пор пока не полез в гугл. Гугл сразу выдал правильные ссылки прям по моей мессаге:

The constructor to deserialize an object of type 'SRM.BusinessLayer.Objects.Dictionary.MaterialFieldMemberCollection' was not found.
Все просто. Надо было добавить в класс конструктор:
protected MaterialFieldMemberCollection(SerializationInfo info, StreamingContext context) : base(info, context) { }

Monday, March 10, 2008

Кривость alglib? - нет. кривость рук...

Часто пользуюсь библиотекой alglib.
И вот переписал я сегодня одну программу с шарпа на плюсы - работать стало медленней на порядки. В обоих вариантах использовал модуль решения ду из alglib.
Замерил скорость отработки 10^6 шагов по рунгекутту там и там:
плюсы 24.5 сек
шарп 0.5 сек
Списываю это на кривость транслятора из algoPascal в alglib. Но надо конечно разбираться...

добавлено:
Поразбирался. Нашлось множество подводных камней, и наверное еще далеко не все.
Первое что сделал - избавился от массивов alglib. Не помогло. Изначально казалось, что вся проблема должна быть в алглибе и его надстройке в виде массивов, которые нумеруются с 1, а не с нуля. Однако, переход на обычные double[] ничего не дал.
Главная причина тормозов оказалась весьма тупа. Надо было включить оптимизацию /Ox и запускать не из IDE (из-под ide работает в разы медленнее).
Потом выяснилось еще, что точность DateTime.Now оставляет желать лучшего. Заменил на Stopwatch.
Написал тестовые примеры для замера скорости:
1) на шарпе


int rep = 1000000;
double d = 0;
for (int i = 0; i < rep; i++)
{
int arrLen = 100;
double[] arr = new double[arrLen];
for (int j = 0; j < arrLen; j++)
arr[j] = j;
for (int j = 0; j < arrLen; j++)
d += arr[j];
}


2) и на плюсах:

double d = 0;
for (int i = 0; i < rep; i++)
{
double* arr = new double[size];
for (int j = 0; j < size; j++)
arr[j] = j;
for (int j = 0; j < size; j++)
d += arr[j];
delete[] arr;
}

Однако, и этого мало. По прежнему код на шарпе работал быстрее на 40%. Полез искать в инете, как можно оптимизировать код на плюсах. На rsdn нашел такой совет:
заменить

double* arr = new double[size];
for (int j = 0; j < size; j++)
d += arr[j];

на

double* arr = new double[size];
double* iter = arr;
double* endIter = arr + size - 1;
int j = 0;
iter = arr;
while (iter < endIter)
{
d += *iter;
iter++;
}

если я все правильно понял, то авторы этого совета ошиблись у себя забыв, что нумерация массива идет от нуля. поэтому endIter = arr + size - 1, а не arrIter = arr + size. хороший пример преимущества шарпа - на надо мучить мозги ерундой.
такая замена дала прирост производительности на 10%, но до сих пор обогнать шарп у меня не получилось.

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

Vista :: Отключение автоматического определения типа папки

Чтоб отключить эту гадость:


[-HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\Bags]

[HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\Bags\AllFolders\Shell]
“FolderType”=”NotSpecified”


Чтоб вернуть:

[-HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\Bags\AllFolders]

(с) сперто

Monday, March 3, 2008

Windows Media Player нашел нужный кодек

На днях меня порадовал Windows Media Player. Есть у меня один видео файл, который ничем не открывался. Ставил я разные кодек-паки и никак не мог подобрать подходящий. Собственно никакого алгоритма подбора нужного кодек-пака у меня нет, поэтому просто перебирал. А решение оказалось в самом неожиданном месте. WMP в отличие от всех других плееров сразу предложил загрузить нужный кодек с инета. Хотя самим ВМП пользоваться неудобно, но эта вот его фича оказалась очень полезной. Раньше думал вообще убить его, а теперь точно оставлю, по крайней мере до тех пор, пока не найду другой лучший плеер с такой же фичей.

Tuesday, February 26, 2008

Влияние языка на алгоритм

Блога для бреда у меня нет. Поэтому напишу эту мысль сюда, притянув ее к теме решений. Решение о том, какой язык выбрать. :-)
Подтолкнула меня сделать эту заметку такая ситуация. Написал я некий алгоритм на delphi. Вышел он с первого взгляда обыкновенным. Но не работал :-D
Попробывал я его поотлаживать - ошибку не нахожу.
Переписал снуля. Получилось не многим лучше.
Переписал на C# - заработало.
Тут можно конечно сказать, что я просто третий раз переписал и получилось, а смена языка тут как бы не при чем. Однако, мне так не показалось. Объясняю свою мысль так: гибкость шарпа позволила решить задачу сначала влоб, а потом переделать под оптимизированный алгоритм. Причем переделки были столь незначительные, что получилось не посадить ошибки.
Вдаваться в подробности кода я не хочу. Это вот такое мое субъективное имхо.
И как-то когда писать просто, то думать проще. Алгоритм получился весьма прозрачный, хотя делает все тоже самое.
Одно плохо - производительность. Хотя это я еще померию и постараюсь записать результаты сюдаже...

Monday, February 11, 2008

su в windows vista

runas в висте == аналог никсовой команды su.
У меня по началу эта команда никак не хотела работать. Все дело было в том, что я отключил службу "Вторичный вход в систему". Теперь все прекрасно работает.
Пользуюсь так:
win+r
runas /u:Admin cmd
ввожу пароль админа и попадаю в консоль с правами админа.

Wednesday, February 6, 2008

Подводные камни в оптимизации служб Vista

Основная проблема при отключении служб, как в xp, так и в vista - недостаток информации и описания службы, которую намереваешься отключить. Найти хорошего мана, в котором было бы _подробно_ описано за что отвечает та или иная служба мне до сих пор не удалось. Поэтому основной мой метод выбора служб для отключения - метод проб и ошибок. В vista появились новые службы, т.е. новый повод для ошибок.
Первая моя ошибка была в отключении службы Ready Boost. На первый взгляд, судя по описаниям, эта служба ответственна за использование съемных носителей для дополнения озу. Я этим не пользуюсь и пользоваться вроде как не намерен, т.к. собираюсь докупить озу, а не заменять ее флешкой. Поэтому сразу решил отключить. Однако, после этого перестала запускаться панель управления.
Вторая ошибка - перевод службы "Служба профилей пользователей(User profile service)" из режима Auto в режим Manual. В описаниях находил только ссылки на то, что эта служба используется совместно с UAC, который я отключил уже давно. Поэтому решил, что раз эта User profile service нужна для UAC, то лучше ее перевести в режим ручного запуска, чтоб не грузилась зря. Однако, после перевода в режим Manual и перезагрузки сбились пользовательские настройки всего и вся. Фаерфокс даже предложил импортировать закладки из эксплорера. Не загрузились некоторые проги, которые стоят в авторане, ну и т.д. и т.п.

П.С.: при настройке служб обычно пользуюсь вот этими ресурсами:
Windows Vista SP1 Services Information Introduction by Black Viper
Services | ITsVISTA - The Ultimate Windows Vista Resource
Службы Windows Vista

добавлено 12 февраля 2008г:
Еще зря отключил службу "Вторичный вход в систему", т.к. перестала работать команда runas в cmd. И еще решил вернуть UAC. Попробую с ним сжиться. На линухе вроде получалось.

Еще хотелось бы что-ть написать про KtmRm для координатора распределенных
транзакций, Диспетчер сеансов диспетчера окон рабочего стола,

Sunday, February 3, 2008

Мой новый HP 6710b

Наверное надо оставить пару записей про новый ноут. Хоть отнести такие записи к "решениям" можно с боольшой натяжкой, но всеже можно притянуть, что это вроде как решение о покупке. Итак, что понравилось и что не понравилось. Про понравилось наверное особо не стоит. А вот не понравилось следующее. Сначала не нравилось, что клавиатура прожимается по краям. Однако, на второй день выяснил, что снизу есть два не затянутых винта, которые и крепят клавиатуру. Зато теперь после трех дней использования ноут начал скрипеть, издавая позорные звуки, когда его беру за передний край. Еще не понравилось качество софта, идущего в комплекте. Большую часть софта отключил, но от остался Credental Manager, который управляет такой приятной особенностью как fingerprint reader. И этот самый менеджер выглядит не очень. Окно с настройками загружается долго(хотя и сильно. наверное секунд 5, однако за такое время грузится firefox, у которого функционал...), сами настройки весьма странные. Долго бился над отключением этого менеджера в браузерах. Потом сами настройки глючат и сбиваются. Вроде отключил autofingerprint capture, а он все равно через некоторое время начинает всплывать, говоря, что не может идентифицировать мое запястье. Настройки устроены таким образом, что в каждом новом окне по-умолчанию менеджер предлагает сохранить пароль. Имхо, это полнейшая тупость. Нужно было сделать режим обучения и режим работы, как во всех фаерволах. Либо разработчики - криворукие индусы, либо я так и не нашел такой настройки, и они все равно криворукие индусы.
Время работы от батареи пока не засекал, но летит оно быстро, хотя наверное пару часов интенсивной работы он выдерживает.
Еще не понравились дополнительные кнопки. Выполнены они в каком-то полусенсорном виде. Т.е. нет механического хода. Нажимаются непонятно как, непонятно куда надо давить, и не понятно надавилось или нет. В предыдущих моделях было лучше.
Еще про клавиатуру: когда быстро печатаю (обычно за 250 знаков в минуту) задеваю пальцами за соседние кнопки. Выглядит это так. Когда нажимаю кнопку в нижнем ряду, и еще не отпустив до конца пытаюсь перенести палец на верхний ряд, то задеваю за клавиши среднего ряда. Конечно можно сказать, что руки кривые, но я печатаю не первый год и раньше с такой проблемой не сталкивался.
Что касается шума - шумит. Не сильно, но шумит. Особенно при работе от сети в режиме высокой производительности. При экономии энергии обычно вентиляторы не включаются и все более мение тихо.
Еще не закрыт заглушкой слот для док станции. Особенно при отсутствии такой станции, имхо заглушка не помешала бы.
Что еще пока даже не знаю. Остальное вроде все нормально.
Мучаюсь сейчас с вистой. Приходится многое перенастраивать. Иначе никак. Но это уже другая тема...

Мой новый модем Acorp W422G

Обзавелся новым модемом, чтобы подключить свой новоиспеченный ноут по WiFi.
Хочется сделать пару замечаний. Самый первый интересный момент - кнопочка питания. На первый взгляд модем как две капли воды похож на старенький LAN120, однако помимо бросающейся в глаза антенны и 4х разъемов LAN, есть еще сбоку кнопочка включения питания. Я ее по началу не заметил и минут 15 мучился включая модем :-)
Еще хочется заметить, что модем греется не меньше старого. Пока почему-то не получается настроить port forwarding, хотя делаю вроде все как и раньше. Зато тут хорошо работает Upnp. В старом модеме надо было его перезагружать, чтобы upnp выдал правильный адрес. Еще столкнулся с такой проблемой: хотел все интерфейсы свалить в одну группу, т.к. делить трафик не собираюсь. Поэтому добавил все SSID в одну группу с Ethernet'ами. После этого отвалился WiFi. Почему до меня так и не дошло. Еле вспомнил, что делал, хотел уже настройки сбрасывать...
Добавлено 9 февраля 2008:
С портфорвардингом все по прежнему странно. С одной стороны он работает в ряде программ. Например, для передачи файлов по аське. Но по прежнему в PeerWeb DC++ активный режим работает только при включении поддержки Upnp.
И еще новость : при интенсивной работе подвисает соединение. Не знаю пока с чем это связано (с модемом или с оборудованием на АТС), но факт - сегодня при работе на скоростях больше 5Мбс уже дважды подвисало соединение WAN за 2 часа. Приходилось передергивать телефонный провод (простейшее стредство перезапустить соединение).

Tuesday, January 22, 2008

Польза от трехуровневой структуры бизнесслоя

Сегодня до меня дошло, в чем выгода от нашей трехуровневой структуры бизнесслоя. Толковых разъяснений от коллег я либо не получил, либо не понял. Но вот сегодня сам обнаружил эту выгоду, про которую мне сказали "делай так, потом поймешь почему". Структура у нас собственно состоит из трех "слоев": менеджеры, контроллеры, мапперы.
Для каждого условного модуля программы создаются все три слоя. Слой мапперов содержит функции получающие информацию из базы и сохраняющие ее в классы-контейнеры, в которых преимущественно отсутствует всякая логика, т.е. в классе есть только поля. Условно выше маппера действует контроллер, который получает вызовом маппера объекты-контейнеры и из них образует более сложные объекты, которые уже должны быть готовы для передачи фронтенду. Однако, есть еще слой менеджеров, в котором объекты полученные в контроллере могут быть закешированы, либо может происходить проверка прав пользователя на получение объекта. Так вот для меня до сих пор оставалось загадкой, почему бы не поместить логику контроллера в менеджер и использовать тем самым двухуровневую структуру. С мапперами вроде все ясно. Польза маппера в том, что он является интерфейсом для одной хранимой процедуры. Затем комбинации таких интерфейсов можно использовать для сборки различных объектов. А вот польза от выделения контроллера от меня как-то тупо ускользала. Однако, теперь мне все кажется весьма просто. Польза от выделения контроллера как раз в отделении кеширования и проверки прав доступа. Дело в том, что если мне в новом методе менеджера понадобится получить объект, который можно получить другим уже готовым методом менеджера, то может возникнуть ситуация, когда нужна другая проверка прав, либо отсутствие кеширования. И обойти в этом случае уже существующую проверку прав в уже готовом методе менеджера можно выделением всей его логики, не связанной с проверкой прав, в контроллер. И вызывать уже соответственно один контроллер в двух методах менеджера с разными проверками и разным кешированием. Все.
П.С.: Однако, хочется заметить, что выделить логику менеджера в контроллер можно и после ее создания в менеджере. Так что можно этот рефракториг и отложить, чтобы не усложнять себе сразу задачу.