Во время компиляции SimpleBrowser понадобится библиотека System.Web.Razor. Чтобы ее получить, достаточно установить ASP.NET MVC 3. Весит где-то 20 мегабайт. После установки сразу должно все скомпилироваться (может быть нужно будет перезагрузить студию).
четверг, 27 сентября 2012 г.
Побеждаем NCrunch: "Невозможно загрузить файл или сборку"
Иногда бывает так, что проект компилируется, запускается, тесты через visual studio работают, а вот NCrunch не хочет работать и выдает ошибку:
"C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\TeamTest\Microsoft.TeamTest.targets (14): Невозможно загрузить файл или сборку "Project2, Version=0.5.0.0, Culture=neutral, PublicKeyToken=null" или один из зависимых от них компонентов. Не удается найти указанный файл."Т.е. он не может найти какой-то там файл и из-за этого не удается скомпилировать проект. В этом случае:
- Меню NCrunch → Configuration → All solutions. И меняем настройки
Log to output window = True (по-умолчанию False),
Logging verbosity = Detailed (по-умолчанию Summary). - Меню View → Output. Там выбираем "Show output from" = NCrunch Output.
- Если надо, то в окне NCrunch Tests жмем правой кнопкой по проблемному проекту → Rebuild...
- Теперь выделяем весь лог, копируем и вставляем в какой-нибудь текстовый редактор.
Там может быть что-то типа такого:
Could not resolve this reference. Could not locate the assembly "SimpleBrowser, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors.И далее будут указаны места, в которых он искал этот файл. Тогда:
- Идем в NCrunch → Configuration. Выбираем тот проект, про который он писал в самой первой ошибке "невозможно загрузить файл или сборку..." (у меня это Project2).
- Additional files to include → Жмем кнопку "..." и добавляем недостающие файлы. Обычно они уже есть в папке bin\Debug.
После этого все должно нормально работать.
воскресенье, 11 марта 2012 г.
Serialize CookieContainer to string
Как сериализовать CookieContainer в строку, а затем получить его обратно.
private static string SerializeCookiesToString(CookieContainer cookieContainer)
{
using (var stream = new MemoryStream())
{
try
{
new BinaryFormatter().Serialize(stream, cookieContainer);
return Convert.ToBase64String(stream.ToArray());
}
catch (Exception)
{
return string.Empty;
}
}
}
private static CookieContainer DeSerializeCookiesFromString(string cookies)
{
try
{
using (var stream = new MemoryStream(Convert.FromBase64String(cookies)))
{
return (CookieContainer)new BinaryFormatter().Deserialize(stream);
}
}
catch (Exception)
{
return new CookieContainer();
}
}
понедельник, 19 сентября 2011 г.
Как в javascript переименовать функцию
Переименовать уже существующую функцию не так-то просто. Но возможно:
// при помощи этой функции будем переименовывать
Object.defineProperty(
Object.prototype,
'renameProperty',
{
writable : false, // Cannot alter this property
enumerable : false, // Will not show up in a for-in loop.
configurable : false, // Cannot be deleted via the delete operator
value : function (oldName, newName) {
// Check for the old property name to
// avoid a ReferenceError in strict mode.
if (this.hasOwnProperty(oldName)) {
this[newName] = this[oldName];
delete this[oldName];
}
return this;
}
}
);
// сам пример. переименовываем функцию NIRV.repaintMain в NIRV.repaintMain2
NIRV.renameProperty("repaintMain", "repaintMain2");
NIRV.repaintMain = function() {
NIRV.repaintMain2();
$("li.task.completed").each(AddReaddButton);
};
Этот вариант может не везде работать. Я его взял здесь. Там есть и другая функция для переименования.среда, 31 августа 2011 г.
Как в javascript обернуть функцию
Однажды мне для юзерскрипта потребовалось обернуть функцию. Вот есть функция repaintMain. Мне нужно обернуть ее, т.е. чтобы когда она вызывается, то сперва бы вызывался ее оригинальный код, а потом мой.
Оказывается, в джаваскрипте это делается довольно просто:
Еще есть способ оборачивания через переименование функции.
Кроме того, есть довольно продвинутые способы оборачивания функции. Которыми можно пользоваться вот так:
Оказывается, в джаваскрипте это делается довольно просто:
repaintMain2 = repaintMain;
repaintMain = function() {
repaintMain2.apply(this, arguments);;
$("li.task.completed").each(AddReaddButton);
};
Узнал об этом способе здесь.Еще есть способ оборачивания через переименование функции.
Кроме того, есть довольно продвинутые способы оборачивания функции. Которыми можно пользоваться вот так:
var beforeExecute = function() { ... }
var afterExecute = function() { ... }
myFunc = wrap(myFunc, beforeExecute, afterExecute);
воскресенье, 14 августа 2011 г.
Работа с git-репозиторием GitEnterprise
В качестве приватного git-репозитория для личных проектов я выбрал (см. апдейт в конце поста) http://www.gitenterprise.com/. Смотрите pricing бесплатного акка: сколько угодно репозиториев, 1 гб места, до 10 пользователей.
Это скорее памятка для самого себя. Обычная ситуация: уже начал что-то делать и стало ясно, что надо бы репозиторий создать, причем хорошо бы удаленный, для бэкапа.
1. https://gitent-scm.com/gitent/ - создаем новый репозиторий.
2. На вкладке Main перем ссылку на репозиторий (https).
3. SmartGit - Remote -> Manage Remotes -> Add. Указываем ссылку, любое название (например gitent-scm.com). Вроде бы предложит ввести пароль (от акка на gitent-scm.com).
4. Жмем Push. Если будет спрашивать, то жмем кнопку Configure.
5. Все должно быть в порядке.
6. Если появилось сообщение "you cannot push changes not committed by you", то смотрим здесь и, возможно, здесь.
Другой вариант, через создание нового репозитория (думаю, это какой-то левый вариант):
Шаги 1 и 2 такие же как в первом варианте.
3. SmartGit - выбираем Clone, указываем ссылку, жмем далее. Он предложит всякие пароли ввести.
4. Git working tree. Нужно указать пустую папку. Например: I:\work\MyProject.
5. И все. Если у нас уже есть проект, то копируем туда файлы и делаем первый коммит.
Update. Я сейчас перелез на bitbucket.org - он бесплатный, есть гит, а так же вики и issue-трекер (как на гитхабе).
Это скорее памятка для самого себя. Обычная ситуация: уже начал что-то делать и стало ясно, что надо бы репозиторий создать, причем хорошо бы удаленный, для бэкапа.
1. https://gitent-scm.com/gitent/ - создаем новый репозиторий.
2. На вкладке Main перем ссылку на репозиторий (https).
3. SmartGit - Remote -> Manage Remotes -> Add. Указываем ссылку, любое название (например gitent-scm.com). Вроде бы предложит ввести пароль (от акка на gitent-scm.com).
4. Жмем Push. Если будет спрашивать, то жмем кнопку Configure.
5. Все должно быть в порядке.
6. Если появилось сообщение "you cannot push changes not committed by you", то смотрим здесь и, возможно, здесь.
Другой вариант, через создание нового репозитория (думаю, это какой-то левый вариант):
Шаги 1 и 2 такие же как в первом варианте.
3. SmartGit - выбираем Clone, указываем ссылку, жмем далее. Он предложит всякие пароли ввести.
4. Git working tree. Нужно указать пустую папку. Например: I:\work\MyProject.
5. И все. Если у нас уже есть проект, то копируем туда файлы и делаем первый коммит.
Update. Я сейчас перелез на bitbucket.org - он бесплатный, есть гит, а так же вики и issue-трекер (как на гитхабе).
вторник, 2 августа 2011 г.
Чеклист по безопасности ПО
Коммент из поста на хабре "Аудит. «Черный ящик»".
Для разработчиков (я имею в виду именно тех, кто пишет новые системы, а не прикручивает взятые из интернета готовые решения), вся защита сводится к очень короткому списку:
- Валидируйте все входящие и исходящие данные по структуре и типам;
- Не клейте SQL конкатенацией строк никогда, кроме случаев фреймворков (но во фреймворках можно и код более качественно писать, сделав дополнительную валидацию всех склеиваемых фрагментов);
- Как можно чаще делайте кеширование чтобы избежать повторяющихся запросов и лишних нагрузок (кеш на диске, в памяти в специальных хеш-СУБД и т.д.);
- Разделяйте систему для разработки (закрытую от внешнего мира) и продакшен систему (из которой нужно удалить половину, а оставшееся минифицировать и «утоптать» по максимуму);
- Всегда предусматривайте блокировку запросов по IP, если с них идет странная активность (пользователь не сгенерирует 100 запросов в минуту и не будет долбить сервер 24 часа напролет, пользователи — люди, они едят и спят) (с разумными лимитами)
- Определяйте попытки SQL-инъекций и XSS-инъекций, не просто их фильтруйте, а блокируйте IP
Ярлыки:
architecture,
best practices,
checklist,
coding,
development,
habrahabr,
security,
sql
Подписаться на:
Сообщения (Atom)