Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
900
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
952
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
942
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1727
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6088
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4400
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
?айл в истории репозитория Subversion?gfffg
Можно ли заглянуть в историю репозитория Subversion для файлов с определенным именем (еще лучше было бы для них иметь подстановочный поиск)?
Я хочу посмотреть, был ли файл .bat зафиксирован в репозитории в какой-то момент в прошлом, но с тех пор был удален в более поздних обновлениях. Даже дамп истории файлов при каждой ревизии будет работать, так как я могу просто grep выводить данные. Я просмотрел руководство, но не смог найти хорошего способа сделать это.
Журналы для каждой фиксации являются описательными, поэтому я не могу просто просматривать сообщения журнала, чтобы увидеть, какие изменения были сделаны. Я предполагаю, что у Subversion есть способ восстановить это?
gfffgttaaggsvn,repository,ttaagggfffg
TortoiseSVN может очень легко искать журналы, и в моей системе я могу ввести ".plg" в поле поиска и найти все добавления, изменения и удаления для этих файлов.
Без Tortoise единственный способ, который я могу придумать, это сделать grep полных журнала или разобрать журналы и сделать свой собственный поиск индикаторов 'A' и 'D' в файле, который вы ищете (используйте svn log --verbose для получения путей к файлам).
svn log --verbose | grep .bat
llpp
Я предполагаю, что вы используете клиент командной строки SVN. Дайте TortoiseSVN попробовать. Его диалог "Show Log" позволяет искать комментарии, имена файлов и авторов.
http://tortoisesvn.net/downloads
PS: только Windows.
llpp
svn войти в .bat
llpp
Лично я бы использовал
svnadmin dump -r1:HEAD /path/to/repo/
Передайте его в меньшее число и найдите or grep с некоторым контекстом.
llpp
TortoiseSVN полностью сладкий. Я не могу представить себе, как справляюсь с подрывной деятельностью без него.
Кроме того, если вы используете Eclipse, я бы рекомендовал вам плагин Subclipse.
llppminhojkhonОтображение строк в нескольких Столбцах в Asp.net Gridviewgfffg
По умолчанию каждая строка Gridview сопоставляется с каждой строкой в datatable или наборе данных, прикрепленном к ее источнику данных. Но что делать, если я хочу отобразить эти строки в нескольких столбцах. Например, если он имеет 10 строк, 5 строк должны отображаться в 2 столбцах рядом друг с другом. Также я могу сделать это с сеткой Infragistics. Разве это возможно?
gfffgttaaggasp.net,gridview,infragistics,ultrawebgrid,ttaagggfffg
Вместо этого можно использовать элемент управления DataList . Он имеет свойство RepeatColumns , которое позволяет определить количество столбцов, которые вы хотите отобразить.
В .NET Framework 3.5 есть еще лучшее решение-управление ListView . Дополнительную информацию об использовании элемента управления ListView можно найти здесь .
llpp
Если это чисто кодирующее упражнение, то привяжитесь к событию RowDataBound из Gridview. Таким образом, вы можете сделать:
e.Row.Cells(2).Text = e.Row.Cells(1).Text
Это позволит поместить текст из столбца 1 в столбец 2 после его извлечения из базы данных. Вы также можете динамически создавать столбцы, используя аналогичный метод.
Перечитывая,я думаю, что неправильно понимаю вашу проблему.
llpp
Разве вы не можете просто поставить два одинаковых связанных столбца один за другим?
llppminhojkhonПрофилирование / Оптимизация (Sharepoint 2007) Веб-Частейgfffg
Мне просто интересно, какие варианты существуют для правильной работы веб-частей measure/profile/optimize ASP.net 2.0, особенно для Sharepoint 2007?
Поскольку веб-части являются слоем на другом уровне технологии, получение использования ресурсов, открытых дескрипторов и прочего только для веб-части кажется немного сложным.
Кто-нибудь знает некоторые хорошие инструменты или методы для профилирования и оптимизации веб-частей?
gfffgttaaggasp.net,sharepoint,ttaagggfffg
У меня был успех профилирования SharePoint 2010 с Eqatec Profiler . Бонус заключается в том, что у них есть бесплатная версия. Поскольку он работал в SharePoint 2010, я ожидаю, что он будет работать с SharePoint 2007.
Вот как я получил его работу с SharePoint 2010: http://blogs.visigo.com/chriscoulson/performance-profiling-a-sharepoint-2010-project-using-eqatec-profiler/
llpp
Я обнаружил, что разделение всей бизнес-логики на отдельный DLL, который легко тестируется на единицу, было самым простым методом для меня. Но, честно говоря, я действительно не нашел никакого хорошего способа, кроме того, что я только что упомянул. То же самое было верно для меня с Facebook приложений в последнее время. Я думаю, что это распространено для любого приложения, которое работает внутри другой платформы. Особенно, когда производительность и тестирование, где никогда не было целью, когда разработчики платформы начали строить систему.
llpp
Когда мы начинали с SP2003, мы беспокоились о том, чтобы не закрывать соединение в приложениях или веб-частях. Мы использовали следующий запрос, чтобы проверить, будет ли увеличиваться базовое число подключений (не считая начального всплеска) по мере использования приложения на сервере разработки:
Имя SELECT, sysdatabases.name , sysprocesses.status, last_batch от sysprocesses, системной, где sysprocesses.dbid = sysdatabases.dbid и nt_username = ' СП обслуживание счета и (wfe1 с хоста='', имя=' WFE2 ') и sysprocesses.dbid = 10 Приказа last_batch алфавиту
(замените значения, выделенные жирным шрифтом, на значения, соответствующие вашей среде)
Мы не пробовали это с момента обновления до MOSS, хотя.
llppminhojkhonPHP с SQL Server 2005+gfffg
В настоящее время у нас есть гибридная установка ASP/PHP, подключающаяся к базе данных SQL Server 2005. Но вся работа с запросами выполняется на стороне клиента, я хотел бы переместить часть этого в PHP.
Какой драйвер и / или строка подключения необходимы для подключения к Sql Svr и каков синтаксис для использования в PHP?
Обновление: OK поэтому я определенно пытался избежать использования чего-либо, связанного с копированием DLLs и т. д. Я посмотрю на драйвер SQL2K5PHP (спасибо Винсент). @jcarrascal для ясности, под "client side" я имею в виду наше приложение-это внутреннее веб-приложение , которое работает как HTA, со всеми запросами, выполняемыми через javascript вызовов к ASP, который фактически отправляет запрос DB.
gfffgttaaggphp,sql-server,ttaagggfffg
У вас есть два варианта:
1) расширение php_mssql: если вы хотите что-то, что имеет тот же API mysql и mysqli имеет, то используйте расширение php_mssql. Но есть подвох, в комплекте ntwdblib.dll файл с PHP не работает. Вы должны найти этот файл из установки SQL Server 2000 или вы можете найти его в Интернете. Этот API предположительно не очень надежен, но я использую его без проблем в течение примерно одного года.
2) драйвер Microsoft SQL Server 2005 PHP : если вы хотите что-то более современное, но у которого нет того же API и отсутствуют некоторые важные функции (mssql_num_rows). Большой плюс в том, что он поддерживается Microsoft и, вероятно, будет работать с будущей версией.
llpp
Просто используйте функцию mssql_connect() следующим образом:
$conn = mssql_connect('localhost', 'sa' , '123456')
or die('Can\'t connect.');
mssql_select_db('database', $conn)
or die('Can\'t select the database');
Функции, относящиеся к серверу SQL, определены в руководстве PHP для драйвера MSSQL .
Хоть один вопрос, "all the query work is done on the client side" WTF? :Д
llpp
PHP предоставляет расширение для доступа к базам данных Microsoft SQL Server. Чтобы использовать расширение сервера SQL, все, что требуется, - это активировать расширение в файле конфигурации PHP.
Подробности на странице MSDN
llppminhojkhonRuby блоков/Java closures в Cgfffg
Я пытался понять, как работают блоки Ruby, и для этого я пытался реализовать их в C.
Один из простых способов реализации closures-передать void* в окружающий стек в функцию closure/function, но блоки Ruby также обрабатывают операторы returns и break из области, которая использует блок.
loop do
break i if (i >= 4000)
i *= 2
end
Я думаю, что одно из предложений closures для Java работает так же.
Итак, как бы вы реализовали Ruby-blocks/Java-closures в C?
gfffgttaaggjava,c,ruby,ttaagggfffg
Понятие closures требует понятия контекстов. Контекст C основан на стеке и регистрах CPU, поэтому для создания block/closure, вам нужно иметь возможность корректно (и повторно) манипулировать указателем стека и хранить/восстанавливать регистры по мере необходимости.
Это делается интерпретаторами или виртуальными машинами таким образом, чтобы иметь структуру context или что-то подобное, а не использовать стек и регистры напрямую. Эта структура отслеживает стек и, возможно, некоторые регистры, если вы разрабатываете регистр на основе VM. По крайней мере, это самый простой способ сделать это (хотя и немного менее эффективный, чем на самом деле правильное отображение вещей).
llpp
Я на самом деле ничего из этого не реализовал, так что возьмите его с мешком соли.
Закрытие состоит из двух частей: среды данных и среды кода. Как вы уже сказали, вы, вероятно, можете передать void* для обработки ссылок на данные. Вероятно, вы можете использовать setjmp и longjmp для реализации нелинейных переходов потока управления, которые требуются для разрыва Ruby.
Если вы хотите closures, вы, вероятно, должны программировать на языке, который действительно поддерживает их. :-)
UPDATE: в Clang происходят интересные вещи. Они создали прототип закрытия для C. http://lists.cs.uiuc.edu/pipermail/cfe-dev/2008-August/002670.html может оказаться интересным чтением.
llpp
Есть хороший набор слайдов на блоках Ruby как часть курса "Rails with Passion":
Это охватывает представление блока, то, как они получают передаваемые Аргументы и выполняются, а также еще более глубокие вещи, такие как объекты Proc. Это очень ясно объясняется.
Тогда, возможно, будет интересно посмотреть, как ребята из JRuby обрабатывали их в своем разборе на Java. Взгляните на источник в codehaus .
llppminhojkhonДженерики в c# и доступ к статическим членам Тgfffg
Мой вопрос касается c# и как получить доступ к статическим мемберам ... Ну, я действительно не знаю, как это объяснить (что в некотором роде плохо для вопроса, не так ли?) Я просто дам вам пример кода:
Class test<T>{
int method1(Obj Parameter1){
//in here I want to do something which I would explain as
T.TryParse(Parameter1);
//my problem is that it does not work ... I get an error.
//just to explain: if I declare test<int> (with type Integer)
//I want my sample code to call int.TryParse(). If it were String
//it should have been String.TryParse()
}
}
Так что спасибо вам, ребята, за ваши ответы (кстати, вопрос в том, как бы я решил эту проблему без получения ошибки). Это, наверное, довольно простой вопрос для вас!
Спасибо, Никлас
Edit: спасибо всем за ваши ответы!
Хотя я думаю, что фраза try - catch является самой элегантной, я знаю по своему опыту работы с vb, что это действительно может быть облом. Я использовал его один раз, и мне потребовалось около 30 минут, чтобы запустить программу, которая позже заняла всего 2 минуты для вычисления только потому, что я избегал try - catch.
Вот почему я выбрал утверждение swich в качестве лучшего ответа. Это делает код более сложным, но с другой стороны, я думаю, что он будет относительно быстрым и относительно легким для чтения. (Хотя я все еще думаю, что должен быть более элегантный способ ... может быть, на следующем языке, который я изучаю: P )
Хотя, если у вас есть какое-то другое предложение, я все еще жду (и готов принять участие)
gfffgttaaggc#,generics,static,methods,data-access,ttaagggfffg
Проблема заключается в том, что TryParse нигде не определен в интерфейсе или базовом классе, поэтому вы не можете сделать предположение, что тип, переданный в ваш класс, будет иметь эту функцию. Если вы не можете каким-то образом сдерживать T, вы будете часто сталкиваться с этим.
llpp
Чтобы получить доступ к члену определенного класса или интерфейса, необходимо использовать ключевое слово Where и указать интерфейс или базовый класс, содержащий этот метод.
В приведенном выше экземпляре TryParse не происходит из интерфейса или базового класса, поэтому то, что вы пытаетесь сделать выше, невозможно. Лучше всего просто использовать Convert.ChangeType и оператор try/catch.
class test<T>
{
T Method(object P)
{
try {
return (T)Convert.ChangeType(P, typeof(T));
} catch(Exception e) {
return null;
}
}
}
llpp
Короткий ответ, вы не можете.
Длинный ответ, вы можете обмануть:
public class Example
{
internal static class Support
{
private delegate bool GenericParser<T>(string s, out T o);
private static Dictionary<Type, object> parsers =
MakeStandardParsers();
private static Dictionary<Type, object> MakeStandardParsers()
{
Dictionary<Type, object> d = new Dictionary<Type, object>();
// You need to add an entry for every type you want to cope with.
d[typeof(int)] = new GenericParser<int>(int.TryParse);
d[typeof(long)] = new GenericParser<long>(long.TryParse);
d[typeof(float)] = new GenericParser<float>(float.TryParse);
return d;
}
public static bool TryParse<T>(string s, out T result)
{
return ((GenericParser<T>)parsers[typeof(T)])(s, out result);
}
}
public class Test<T>
{
public static T method1(string s)
{
T value;
bool success = Support.TryParse(s, out value);
return value;
}
}
public static void Main()
{
Console.WriteLine(Test<int>.method1("23"));
Console.WriteLine(Test<float>.method1("23.4"));
Console.WriteLine(Test<long>.method1("99999999999999"));
Console.ReadLine();
}
}
Я сделал статический словарь, содержащий делегат для метода TryParse каждого типа, который я мог бы использовать. Затем я написал универсальный метод для поиска словаря и передачи вызова соответствующему делегату. Поскольку каждый делегат имеет свой тип, я просто сохраняю их как ссылки на объекты и возвращаю их обратно к соответствующему универсальному типу при их извлечении. Обратите внимание, что ради простого примера я опустил проверку ошибок, например, чтобы проверить, есть ли у нас запись в словаре для данного типа.
llpp
Еще один способ сделать это, на этот раз некоторое отражение в миксе:
static class Parser
{
public static bool TryParse<TType>( string str, out TType x )
{
// Get the type on that TryParse shall be called
Type objType = typeof( TType );
// Enumerate the methods of TType
foreach( MethodInfo mi in objType.GetMethods() )
{
if( mi.Name == "TryParse" )
{
// We found a TryParse method, check for the 2-parameter-signature
ParameterInfo[] pi = mi.GetParameters();
if( pi.Length == 2 ) // Find TryParse( String, TType )
{
// Build a parameter list for the call
object[] paramList = new object[2] { str, default( TType ) };
// Invoke the static method
object ret = objType.InvokeMember( "TryParse", BindingFlags.InvokeMethod, null, null, paramList );
// Get the output value from the parameter list
x = (TType)paramList[1];
return (bool)ret;
}
}
}
// Maybe we should throw an exception here, because we were unable to find the TryParse
// method; this is not just a unable-to-parse error.
x = default( TType );
return false;
}
}
Следующим шагом будет попытка реализовать
public static TRet CallStaticMethod<TRet>( object obj, string methodName, params object[] args );
С полным соответствием типа параметра etc.
llpp
Неужели ты собираешься сделать что-то подобное:
Class test<T>
{
T method1(object Parameter1){
if( Parameter1 is T )
{
T value = (T) Parameter1;
//do something with value
return value;
}
else
{
//Parameter1 is not a T
return default(T); //or throw exception
}
}
}
К сожалению, вы не можете проверить наличие шаблона TryParse, поскольку он статичен , что, к сожалению, означает, что он не особенно хорошо подходит для универсальных моделей.
llpp
Единственный способ сделать именно то, что вы ищете, - это использовать отражение, чтобы проверить, существует ли метод для T.
Другой вариант-убедиться, что объект, который вы отправляете, является конвертируемым объектом, ограничив тип до IConvertible (все примитивные типы реализуют IConvertible). Это позволит вам очень гибко конвертировать ваш параметр в данный тип.
Class test<T>
{
int method1(IConvertible Parameter1){
IFormatProvider provider = System.Globalization.CultureInfo.CurrentCulture.GetFormat(typeof(T));
T temp = Parameter1.ToType(typeof(T), provider);
}
}
Вы также можете сделать вариацию на эту тему, используя вместо этого тип 'object', как это было изначально.
Class test<T>
{
int method1(object Parameter1){
if(Parameter1 is IConvertible) {
IFormatProvider provider = System.Globalization.CultureInfo.CurrentCulture.GetFormat(typeof(T));
T temp = Parameter1.ToType(typeof(T), provider);
} else {
// Do something else
}
}
}
llpp
ОК, ребята: спасибо за всю рыбу. Теперь с вашими ответами и моими исследованиями (особенно со статьей об ограничении родовых типов примитивами ) я представлю вам свое решение.
Class a<T>{
private void checkWetherTypeIsOK()
{
if (T is int || T is float //|| ... any other types you want to be allowed){
return true;
}
else {
throw new exception();
}
}
public static a(){
ccheckWetherTypeIsOK();
}
}
llpp
Это не совсем решение, но в некоторых сценариях это может быть хорошей альтернативой: мы можем передать дополнительный делегат универсальному методу.
Чтобы пояснить, что я имею в виду, давайте возьмем пример. Допустим, у нас есть какой-то универсальный фабричный метод, который должен создать экземпляр T, и мы хотим, чтобы он затем вызвал другой метод для уведомления или дополнительной инициализации.
Рассмотрим следующий простой класс:
public class Example
{
// ...
public static void PostInitCallback(Example example)
{
// Do something with the object...
}
}
И следующий статический метод:
public static T CreateAndInit<T>() where T : new()
{
var t = new T();
// Some initialization code...
return t;
}
Так что прямо сейчас мы должны были бы сделать:
var example = CreateAndInit<Example>();
Example.PostInitCallback(example);
Однако мы могли бы изменить наш метод, чтобы взять дополнительный делегат:
public delegate void PostInitCallback<T>(T t);
public static T CreateAndInit<T>(PostInitCallback<T> callback) where T : new()
{
var t = new T();
// Some initialization code...
callback(t);
return t;
}
А теперь мы можем изменить вызов на:
var example = CreateAndInit<Example>(Example.PostInitCallback);
Очевидно, что это полезно только в очень специфических сценариях. Но это самое чистое решение в том смысле, что мы получаем безопасность во время компиляции, здесь нет "hacking", и код очень прост.
llpp
Лучший код: ограничьте T до ValueType таким образом:
class test1<T> where T: struct
A "struct" здесь означает тип значения.
String - это класс, а не тип значения.
int, float, Enums - это все типы значений.
кстати компилятор не принимает вызов статических методов или доступ к статическим членам на 'type parameters', как в следующем примере, который не будет компилироваться :(
class MyStatic { public static int MyValue=0; }
class Test<T> where T: MyStatic
{
public void TheTest() { T.MyValue++; }
}
=> Ошибка 1 'T' - это 'type parameter', которая недопустима в данном контексте
SL.
llpp
Ты, наверное, не сможешь этого сделать.
Прежде всего, если бы это было возможно, Вам понадобилась бы более жесткая привязка к T, чтобы typechecker мог быть уверен, что все возможные замены для T на самом деле имеют статический метод с именем TryParse.
llpp
Возможно, вы захотите прочитать мой предыдущий пост об ограничении универсальных типов примитивами . Это может дать вам некоторые указания в ограничении типа, который может быть передан универсальному (так как TypeParse , очевидно, доступен только для заданного числа примитивов ( string.TryParse , очевидно, является исключением, что не имеет смысла).
Как только у вас будет больше дескриптора для типа, вы можете работать над попыткой его проанализировать. Вам может понадобиться немного уродливый переключатель там (чтобы вызвать правильный TryParse ), но я думаю, что вы можете достичь желаемой функциональности.
Если вам нужно, чтобы я объяснил что-либо из вышеперечисленного дальше, то, пожалуйста, спросите :)
llpp
Это не то, как работает статика. Вы должны думать о статике как о чем-то вроде глобального класса, даже если они распределены по целой куче типов. Моя рекомендация состоит в том, чтобы сделать его свойством внутри экземпляра T, который может получить доступ к необходимому статическому методу.
Кроме того, T-это фактический экземпляр чего-то, и, как и любой другой экземпляр, вы не можете получить доступ к статике для этого типа через созданное значение. Вот пример того, что нужно делать:
class a {
static StaticMethod1 ()
virtual Method1 ()
}
class b : a {
override Method1 () return StaticMethod1()
}
class c : a {
override Method1 () return "XYZ"
}
class generic<T>
where T : a {
void DoSomething () T.Method1()
}
llppminhojkhonМаксимальная длина поля заголовка типа содержимого MIME?gfffg
Я просто разрабатываю схему для таблицы базы данных, которая будет содержать сведения о вложениях email - их размер в байтах, имя файла и тип контента (т. е. "image/jpg", "audio/mp3", и т. д.).
Кто-нибудь знает максимальную длину, которую я могу ожидать от типа контента?
gfffgttaaggemail,mime,ttaagggfffg
Я надеюсь, что не ошибся, но похоже, что длина составляет максимум 127/127 или 255 всего .
RFC 4288 имеет ссылку в 4.2 (стр. 6):
Type and subtype names MUST conform to the following ABNF:
type-name = reg-name
subtype-name = reg-name
reg-name = 1*127reg-name-chars
reg-name-chars = ALPHA / DIGIT / "!" /
"#" / "$" / "&" / "." /
"+" / "-" / "^" / "_"
Мне не ясно, может ли суффикс +добавляться после 127,но это не так.
llpp
В RFC 6838, который является последним стандартом и устарел RFC4288, есть следующее утверждение.
"Также обратите внимание, что хотя этот синтаксис допускает имена длиной до 127 символов, ограничения реализации могут сделать такие длинные имена проблематичными. По этой причине <type-name> и <subtype-name> SHOULD должны быть ограничены 64 символами."
64+1+64 = 129.
Но я подозреваю, что стандарт должен означать: 63+1+63=127.
llpp
Мы запускаем систему SaaS, которая позволяет пользователям загружать файлы. Мы изначально разработали его для хранения типов MIME до 50 символов. За последние несколько дней мы видели несколько попыток загрузить 71-байтовые типы. Итак, мы переходим на 250. 100 казалось "good", но это всего лишь несколько больше, чем Макс, который мы видим сейчас. 500 кажется глупым, поэтому 250-это выбранный вариант.
llppminhojkhonСуществует ли система отслеживания ошибок/проблем, которая интегрируется с Mercurial?gfffg
Я уже использовал Trac / Subversion раньше, и мне очень нравится интеграция. Мой текущий проект использует Mercurial для распределенной разработки, и было бы неплохо иметь возможность отслеживать проблемы/ошибки и интегрировать это с Mercurial. Я понял, что это может быть сложно с природой DVCS.
gfffgttaaggmercurial,integration,bug-tracking,ttaagggfffg
Я также хотел бы добавить в этот список Редмайна . Я начал с Trac, но обнаружил, что поддержка mercurial (и административный интерфейс для всего) намного лучше в Redmine.
llpp
FogBugz имеет тесную интеграцию с Mercurial через их продукт печи .
llpp
TracMercurial интегрирует Trac с Mercurial. Assembla предоставляет бесплатный хостинг Mercurial с интеграцией Trac.
Идея заключается в том, что у вас есть центральный репозиторий в качестве основного и вы загружаете все дочерние изменения из локальных репозиториев в главный.
llpp
BugTracker.NET теперь поддерживает интеграцию Mercurial точно так же, как поддерживает Subversion и git. BugTracker.NET-это бесплатная система отслеживания ошибок с открытым исходным кодом ASP.NET.
Другие бесплатные трекеры ошибок с открытым исходным кодом, которые поддерживают Mercurial:
- Trac -
http://trac.edgewall.org/wiki/TracMercurial
- В Redmine -
http://www.redmine.org/wiki/1/RedmineRepositories
- Округлять -
https://www.mercurial-scm.org/wiki/Hook . Команда разработчиков Mercurial сама использует Roundup.
llppllppllpp
Bugs Everywhere -это распределенная система отслеживания ошибок, которая поддерживает Mercurial.
llpp
Jira интегрируется с помощью плагина. Это отличный инструмент.
llpp
Я только что собрал трекер ошибок командной строки под названием b для Mercurial, который, хотя и не такой мощный, как Trac и тому подобное, является именно тем, что требуется во многих ситуациях. Это лучшая функция, насколько легко ее настроить-установите расширение Mercurial, и все ваши РЕПО имеют в своем распоряжении трекер ошибок. Я нахожу это невероятно полезным на небольших проектах, которые я can't/don't хочу настроить с полноценным трекером, живущим где-то на сервере, просто hg b и вперед.
llpp
Недавно я разработал плагин Trac, который интегрирует некоторые функции Mercurial, которые плагин TracMercurial еще не поддерживает, он называется TracMercurialChangesetPlugin. Он позволяет искать в ваших наборах изменений, синхронизировать кэш, просматривать список изменений в ваших связанных билетах...
Вы можете прочитать об этом по адресу http://tumblr.com/x8tg5xbsh
llpp
Существует BugzillaExtension для добавления комментария к ошибке Bugzilla каждый раз, когда вы упоминаете ее номер.
llpp
Если вы готовы к другому предложению, вы можете попробовать Артемис .
Хотя я еще не использовал его, он выглядит достаточно легко.
llppminhojkhonКак вы внедряете двоичные данные в XML?gfffg
У меня есть два приложения, написанные на Java, которые взаимодействуют друг с другом с помощью XML сообщений по сети. Я использую парсер SAX на приемном конце, чтобы получить данные обратно из сообщений. Одним из требований является встраивание двоичных данных в сообщение XML, но SAX это не нравится. Кто-нибудь знает, как это сделать?
UPDATE: я получил это, работая с классом Base64 из библиотеки кодеков apache commons, На случай, если кто-то еще пытается сделать что-то подобное.
gfffgttaaggjava,xml,binary,binary-data,ttaagggfffg
Вы можете закодировать двоичные данные с помощью base64 и поместить их в элемент Base64; приведенная ниже статья является довольно хорошей по этому вопросу.
llpp
XML настолько универсален...
<DATA>
<BINARY>
<BIT index="0">0</BIT>
<BIT index="1">0</BIT>
<BIT index="2">1</BIT>
...
<BIT index="n">1</BIT>
</BINARY>
</DATA>
XML - это как насилие : если оно не решает вашу проблему, значит, вы используете его недостаточно.
EDIT:
BTW: Base64 + CDATA, вероятно, лучшее решение
(EDIT2:
Тот, кто поднимает меня, пожалуйста, также поднимает настоящий ответ. Мы же не хотим, чтобы какой-нибудь бедолага пришел сюда и фактически реализовал мой метод, потому что он был самым высоким рангом на SO, верно?)
llpp
Base64-это действительно правильный ответ, но CDATA-нет, это в основном говорит: "это может быть что угодно", однако это не должно быть просто что-то, это должны быть Base64 закодированные двоичные данные. Схема XML определяет base 64 binary как примитивный тип данных, который можно использовать в вашем xsd.
llpp
У меня была эта проблема только на прошлой неделе. Я должен был сериализовать файл PDF и отправить его, внутри файла XML, на сервер.
Если вы используете .NET, вы можете преобразовать двоичный файл непосредственно в строку base64 и вставить его в элемент XML.
string base64 = Convert.ToBase64String(File.ReadAllBytes(fileName));
Или же существует метод, встроенный прямо в объект XmlWriter. В моем конкретном случае мне пришлось включить пространство имен типа данных Microsoft:
StringBuilder sb = new StringBuilder();
System.Xml.XmlWriter xw = XmlWriter.Create(sb);
xw.WriteStartElement("doc");
xw.WriteStartElement("serialized_binary");
xw.WriteAttributeString("types", "dt", "urn:schemas-microsoft-com:datatypes", "bin.base64");
byte[] b = File.ReadAllBytes(fileName);
xw.WriteBase64(b, 0, b.Length);
xw.WriteEndElement();
xw.WriteEndElement();
string abc = sb.ToString();
Строка abc выглядит примерно так:
<?xml version="1.0" encoding="utf-16"?>
<doc>
<serialized_binary types:dt="bin.base64" xmlns:types="urn:schemas-microsoft-com:datatypes">
JVBERi0xLjMKJaqrrK0KNCAwIG9iago8PCAvVHlwZSAvSW5mbw...(plus lots more)
</serialized_binary>
</doc>
llpp
Обычно я кодирую двоичные данные в кодировке MIME Base64 или URL .
llpp
Попробуйте Base64 кодирование / декодирование ваших двоичных данных. Также загляните в разделы CDATA
llpp
Любая кодировка binary-to-text сделает трюк. Я использую что-то вроде этого
<data encoding="yEnc>
<![CDATA[ encoded binary data ]]>
</data>
llpp
Может быть, закодировать их в известный набор - что-то вроде базы 64 является популярным выбором.
llpp
Хотя другие ответы в основном хороши, вы можете попробовать другой, более экономичный метод кодирования, например yEnc. ( Ссылка на Википедию yEnc) с помощью yEnc также можно получить контрольную сумму справа "out of the box". Читайте и ссылки ниже. Конечно, поскольку XML не имеет собственного типа yEnc, ваша схема XML должна быть обновлена, чтобы правильно описать закодированный узел.
Почему: из-за стратегий кодирования base64/63, uuencode et al. кодировки увеличивают объем данных (накладные расходы), которые необходимо хранить и передавать примерно на 40% (против yEnc - это 1-2%). в зависимости от того, что вы кодируете, 40% накладные расходы могут быть/стать проблемой.
yEnc-Википедия аннотация:
https://en.wikipedia.org/wiki/YEnc
yEnc-это схема кодирования binary-to-text для передачи двоичных файлов в сообщениях на Usenet или по электронной почте. ... Дополнительным преимуществом yEnc по сравнению с предыдущими методами кодирования, такими как uuencode и Base64, является включение контрольной суммы CRC для проверки того, что декодированный файл был доставлен в целости и сохранности.
llpp
Base64 накладные расходы составляют 33%.
BaseXML для XML1.0 накладные расходы-это только 20% . Но это не стандарт, и пока есть только реализация C. Проверьте это, если вас интересует размер данных. Обратите внимание, что, однако, браузеры склонны реализовывать сжатие так, чтобы оно было менее необходимым.
Я разработал его после обсуждения в этой теме: кодирование двоичных данных в пределах XML: альтернативы base64 .
llpp
Вы также можете Uuencode исходные двоичные данные. Этот формат немного старше, но он делает то же самое, что и кодировка base63.
llpp
Если у вас есть контроль над форматом XML, вы должны вывернуть проблему наизнанку. Вместо того, чтобы прикреплять двоичный XML, вы должны подумать о том, как вложить документ, который имеет несколько частей, одна из которых содержит XML.
Традиционным решением для этого является архив (например, tar). Но если вы хотите сохранить вложенный документ в текстовом формате или если у вас нет доступа к библиотеке архивирования файлов, существует также стандартизированная схема, которая широко используется в email и HTTP, которая является multipart/* MIME с Content-Transfer-Encoding: binary .
Например, если ваши серверы взаимодействуют через HTTP и вы хотите отправить составной документ, основным из которых является документ XML, ссылающийся на двоичные данные, сообщение HTTP может выглядеть примерно так:
POST / HTTP/1.1
Content-Type: multipart/related; boundary="qd43hdi34udh34id344"
... other headers elided ...
--qd43hdi34udh34id344
Content-Type: application/xml
<myxml>
<data href="cid:data.bin"/>
</myxml>
--qd43hdi34udh34id344
Content-Id: <data.bin>
Content-type: application/octet-stream
Content-Transfer-Encoding: binary
... binary data ...
--qd43hdi34udh34id344--
Как и в приведенном выше примере, XML ссылается на двоичные данные в заключающей многоэлементной схеме, используя схему cid URI, которая является идентификатором заголовка Content-Id. Накладными расходами этой схемы будет только заголовок MIME. Аналогичная схема может быть использована и для ответа HTTP. Конечно, в протоколе HTTP у вас также есть возможность отправить составной документ в отдельный request/response.
Если вы хотите избежать обертывания ваших данных в составную часть, используйте data URI:
<myxml>
<data href="data:application/something;charset=utf-8;base64,dGVzdGRhdGE="/>
</myxml>
Но у этого есть накладные расходы base64.
llppminhojkhonКак скопировать файл в C#gfffg
Я хочу скопировать файл из A в B в C#. как это сделать?
gfffgttaaggc#,.net,file,ttaagggfffg
Без какого-либо кода обработки ошибок:
File.Copy(path, path2);
llpp
Метод File.Copy:
llpp
Используйте класс FileInfo.
FileInfo fi = new FileInfo("a.txt");
fi.CopyTo("b.txt");
llpp
System.IO.File.Copy
llpp
Это должно сработать!
using System.IO;
...
var path = //your current filePath
var outputPath = //the directory where you want your (.txt) file
File.Copy(path,outputPath);
llppminhojkhonКак я могу перенаправить пользователя на настраиваемую страницу 404 в ASP.NET MVC вместо того, чтобы бросать исключение?gfffg
Я хочу иметь возможность захватить исключение, которое возникает, когда пользователь запрашивает несуществующий контроллер, и перенаправить его на страницу 404. Как я могу это сделать?
Например, пользователь запрашивает http://www.nosite.com/paeges/1 ( должно быть /pages/). Как мне сделать так, чтобы они были перенаправлены на экран 404, а не на экран исключений?
gfffgttaaggasp.net-mvc,exception,routes,ttaagggfffg
Просто используйте маршрут:
// We couldn't find a route to handle the request. Show the 404 page.
routes.MapRoute("Error", "{*url}",
new { controller = "Error", action = "404" }
);
Поскольку это будет глобальный обработчик, поместите его полностью внизу под маршрутом по умолчанию.
llpp
Взгляните на эту страницу для маршрутизации ваших 404-ошибок на указанную страницу.
llpp
Нашел это на том же сайте- Стратегии для ресурса на основе 404s
llppminhojkhonАлгоритм для выполнения вычисления RFC в Javagfffg
RFC для класса Java-это набор всех методов, которые могут быть вызваны в ответ на сообщение объекту класса или каким-либо методом в классе.
RFC = M + R, где
M = количество методов в классе.
R = общее число других методов, непосредственно вызываемых из M.
Мышление C-это то .класс и J-это то .java файл, из которого нам нужно вычислить RFC.
class J{
a(){}
b(){}
c(){
e1.e();
e1.f();
e1.g();
}
h(){
i.k();
i.j();
}
m(){}
n(){
i.o();
i.p();
i.p();
i.p();
}
}
здесь M=6
и R=9 (Не беспокойтесь о вызове внутри цикла. Это рассматривается как один вызов)
Вычисление M легко. Загрузите C с помощью загрузчика классов и используйте отражение, чтобы получить количество методов.
Вычисление R не является прямым. Нам нужно подсчитать количество вызовов метода из класса. Только первый уровень.
Для вычисления R я должен использовать regex. Обычно формат будет (вызовы без использования . не учитываются)
[variable_name].[method_name]([zero or more parameters]);
или
[variable_name].[method_name]([zero or more parameters])
без точки с запятой, когда возврат вызова напрямую становится параметром для другого метода.
или
[variable_name].[method_name]([zero or more parameters]).method2();
это становится двумя вызовами метода
Какие еще шаблоны вызова метода вы можете придумать? Есть ли другой способ, кроме использования RegEx, который может быть использован для вычисления R.
UPDATE:
@McDowell
похоже, что с помощью BCEL я могу упростить весь процесс. Дай мне попробовать.
gfffgttaaggjava,regex,algorithm,reflection,ttaagggfffg
Вы можете использовать библиотеку разработки байтового кода с двоичными файлами. Вы можете использовать DescendingVisitor для посещения членов и ссылок класса. Я использовал его, чтобы найти зависимости классов .
Кроме того, вы можете повторно использовать некоторые модели исходных файлов. Я почти уверен, что редактор Java в Eclipse JDT поддерживается какой-то моделью.
llpp
Вы должны найти свой ответ в спецификации языка Java.
Вы забыли статический вызов метода, вызов метода внутри параметров...
llpp
Вызов метода с использованием отражения (имя метода находится в строке).
llpp
Включает ли M вызовы своих собственных методов? Или звонки на внутренние классы? Например:
class J {
a() { }
b() { this.a(); }
c() { jj.aa(); }
d() { i.k(); }
e() { this.f().a(); }
f() { return this; }
g() { i.m().n(); }
class JJ {
aa() { a(); }
}
}
Каково было бы значение M этого? Существует только три вызова функции для метода, не определенного в этом классе (вызовы в функциях d() и g()). Вы хотите включить вызовы внутренних классов или вызовы основного класса, сделанные во внутреннем классе? Вы хотите включить вызовы других методов в том же классе?
Если вы смотрите на любые вызовы методов, независимо от источника, то regex, вероятно, может работать, но будет сложно получить право (правильно ли ваш regex игнорирует строки, содержащие метод-вызов, подобный содержимому? Правильно ли он обрабатывает вызовы конструктора?). Если вы заботитесь об источнике вызова метода, то регулярные выражения, вероятно, не дадут вам то, что вы хотите. Вам нужно будет использовать отражение (хотя, к сожалению, я не знаю достаточно о отражении, чтобы быть полезным там).
llppminhojkhonКак остановить появление компонента MS Graph во время Interop?gfffg
При использовании Office Interop в C#, при вставке объекта диаграммы в документ MS Word приложение Grap загружается очень быстро, а затем исчезает. Есть ли способ предотвратить это? Я попытался установить свойство Visible экземпляра приложения в значение false без эффекта.
EDIT: свойство Visible вступает в силу, когда используется против Word при interopping,и оно не появляется. Я ожидал бы, что есть аналогичный способ сделать это для MS Graph.
gfffgttaaggc#,interop,ms-office,ttaagggfffg
Это обычное поведение для большого количества компонентов, размещенных в исполняемом двоичном файле. Хост-приложение запустится, а затем выполнит задание. Я не знаю, есть ли верный способ предотвратить это, поскольку у вас нет контроля над компонентом или над процессом, пока приложение не будет запущено и не ответит.
Хак, который я пробовал в прошлом (для чего-то совершенно не связанного), запускал процесс и постоянно обнаруживал, был ли создан его основной windows. Как только он был создан, я его прятал. Вы можете сделать это с помощью основного модуля неисправного приложения и надеяться, что это будет достаточно быстро, чтобы скрыть окно до того, как пользователь заметит. Затем вы создаете экземпляр своего компонента; компонент обычно перерабатывает существующий процесс, надеясь, что он имеет скрытое главное окно.
Я не могу гарантировать, что это сработает в вашей ситуации, но стоит попробовать, что проблема настолько важна, или если вы не найдете лучшего способа, конечно.
llppminhojkhonДля чего использовать Windows CardSpace?gfffg
Я делаю какую-то фанковую аутентификацию (и да, я знаю, open-id потрясающий, но опять же мой open-id не работает прямо сейчас!).
Натыкаясь на Windows CardSpace мне было интересно, использовал ли кто-нибудь это в реальной системе продукта. Если вы использовали его, каковы были плюсы и минусы для вас? И как я могу использовать его в моем open-id?
gfffgttaaggwindows,security,authentication,ttaagggfffg
Вы можете принимать информационные карточки на веб-сайте, используя дешевый и веселый сертификат (но не самоподписанный) или вообще без сертификата.
И да, я использовал его как часть производственной системы, которая выросла из доказательства концепции, которую я сделал в Microsoft.
Минусы: Если у вас нет сертификата EV SSL, вы получаете предупреждения. Код для разбора карты в лучшем случае неполный (вы должны взломать его для no-SSL), вы должны объяснить пользователям, что это такое.
Плюсы: ну, это более интересно; я использовал управляемые карты и выпускал их, а затем использовал их для проверки претензий; но для самоизданных карт; ну, это сильнее, чем пароль пользователя и не имеет тех же уязвимостей, что и OpenID.
llppminhojkhonКаков лучший способ различения отчетов Crystal?gfffg
Если у вас есть две версии одного и того же отчета (.rpt) и вы хотите установить, в чем именно заключаются различия, как лучше всего это сделать? Я видел некоторые коммерческие инструменты для этого, но я не слишком заинтересован в том, чтобы раздавать наличные деньги за то, что должно быть относительно прямолинейным. Могу ли я подключиться к Crystal API и просто перечислить все свойства каждого поля или что-то еще? Пожалуйста, кто-нибудь скажите мне, что где-то есть проект с открытым исходным кодом, который делает это... @:-)
@Kogus, не будет ли различение выходных данных в виде текста скрывать какие-либо различия в форматировании?
@ladoucep, я, кажется, не могу экспортировать отчет без данных.
gfffgttaaggcrystal-reports,diff,ttaagggfffg
Могу ли я подключиться к Crystal API и
просто перечислите все свойства
каждое поле или что-то в этом роде? Пожалуйста
кто-нибудь, скажите мне, что есть открытая дверь.
Исходный проект где-то, что делает
этот... @:-)
Есть на самом деле такой API. Я написал заявление VB6, чтобы сделать только то, что вы просили, и даже больше. Я думаю, что даже перенес его в VB.Net. Поскольку это было для моего собственного использования, я не потратил много времени, чтобы сделать его 'polished'. Я намеревался выпустить его, но у меня не было времени...
Другой подход, который я использовал в прошлом, заключается в создании приложения Access для управления большими проектами разработки отчетов. Одна из его многочисленных функций включает в себя возможность извлечения таблиц, используемых отчетом, а также операторов SQL, используемых его командами и выражениями SQL. Его цель-дать человеку глобальную перспективу того, какие отчеты используют какие таблицы. Наверное, он все еще где-то у меня...
** редактирование 1 **
BusinessObjects предприятие XI (R?) имеет функцию с именем 'Meta Manager'. Он будет периодически проверять содержимое репозитория и сохранять результаты в базу данных. Он использует службу Report-Application Service (RAS)для генерации метаданных. Это дополнительная, пятизначная лицензия, конечно.
** редактирование 2 **
Рассмотрите возможность использования PowerShell для выполнения работы: PsCrystal .
llpp
Один из полезных методов заключается в том, чтобы вывести обе версии отчета в обычный текст, а затем diff эти выходные данные.
Вы можете написать что-то, используя компонент crystal report, чтобы описать каждое свойство отчета, как вы описали. Затем вы можете вывести это в текст, и diff те . Я не знаю ни одного инструмента с открытым исходным кодом, который делает это для вас, но было бы не так уж трудно написать его.
@question в посте:
Дифференцирование выходных данных будет показывать изменения форматирования только в том случае, если изменились относительные позиции. Например, если бы у меня было вот это:
до:
Имя, фамилия, адресаты
после:
Фамилия, Имя, Адрес
Тогда это проявится как разница.
Но если бы я просто ударил по столбцу адреса на несколько пикселей или изменил его с обычного текста на полужирный, то вы правы, это не появилось бы.
llpp
Один из методов, который я использовал с большим успехом в прошлом, - это печать отчетов из обеих версий на основе одних и тех же данных. Затем я беру первую страницу из каждой версии, кладу одну поверх другой (важно не перепутать их) и подношу к окну. Как правило, довольно легко увидеть любые различия, и эти различия могут быть вручную аннотированы с помощью подходящего пишущего инструмента, такого как карандаш. Повторите процедуру для каждой страницы отчета.
Следует признать, что для больших отчетов это может быть довольно трудоемким и подверженным ошибкам, но эти ограничения можно преодолеть с терпением и осторожностью.
llppminhojkhonЛучший способ сохранить упорядоченный список windows (от самого последнего созданного до самого старого)?gfffg
Каков наилучший способ управления списком windows (сохраняя их в порядке), чтобы иметь возможность продвигать следующее окно на верхний уровень, когда текущее окно верхнего уровня закрыто.
Это для веб-приложения, поэтому мы используем jQuery Javascript.
Мы обсудили несколько упрощенных решений, таких как использование массива и просто обработка индекса [0] в качестве самого верхнего окна.
Мне интересно, есть ли потенциально более эффективная или полезная альтернатива тому, что мы провели мозговой штурм.
gfffgttaaggjavascript,ttaagggfffg
Я действительно не знаю javascript, но не могли бы вы создать стек windows?
llpp
Стек, если вы хотите просто закрыть окно сверху.
Очередь, если вам также нужно открыть windows в конце.
llpp
Стек / очередь в JS-это простой массив, которым можно управлять с помощью .push(val) , .pop(), .shift(val) и .unshift() .
llppminhojkhonБудучи как DRY, насколько это возможно в Ruby на Rails приложениеgfffg
В настоящее время я использую удивительный плагин attachment-fu для приложения Rails, но как начинающий разработчик я никогда не сталкивался с сценарием, подобным тому, в котором я оказался.
По сути, я использую плагин attachment-fu на двух уровнях.
- Это для пользовательских аватаров в классе user.
- Это разрешить вложения файлов ( PDFs и т. д.) В системе обмена сообщениями.
Мой вопрос заключается в том , какой наилучшей практикой использования было бы в этих ситуациях оставаться DRY , ясным и последовательным.
Очевидно, что нет смысла определять и выполнять плагин в обоих классах, но есть что-то очень странное для меня (возможно, необоснованное) о том, чтобы просто идти вперед и настраивать все это в классе божественного приложения.
Есть ли что-то между ними, или родительский класс-это путь?
Спасибо!
gfffgttaaggruby-on-rails,ruby,model-view-controller,attachment-fu,ttaagggfffg
В чем проблема DRY с определением параметров attachment_fu дважды?
Если файлы не имеют того же типа и хранятся в одном и том же месте, вы не будете повторять ничего в конфигурации.
Конечно, у вас будет два объявления has_attachment, но варианты будут в основном отличаться (одно объявление для ваших аватаров, а другое для ваших pdf и т. д.
99.99% кода для обработки вложений будет похоронен в библиотеках attachment_fu, ваш код конфигурации должен быть довольно DRY по умолчанию =)
llpp
Является ли поддержка Аватара "outsourcing" полностью для Граватара вариантом? Есть некоторые плагины Rails, которые будут отображать аватары, размещенные Gravatar. Возможно, Вам не придется заново изобретать колесо там.
llpp
То, что описывает wfarr, будет наследованием одной таблицы, что я сейчас делаю в этой ситуации. У меня есть одна таблица для активов, которая содержит все необходимые столбцы attachment_fu, плюс дополнительный столбец с именем type, который будет содержать фактическое имя модели. У меня есть модель для активов и дополнительные модели для конкретных типов загрузки, которые наследуются от активов:
asset.rb:
class Asset < ActiveRecord::Base
... attachment_fu logic ...
end
avatar.rb:
class Avatar < Asset
... avatar specific attachment_fu logic ...
end
pdf.rb:
class PDF < Asset
... PDF specific attachment_fu logic ...
end
llpp
Я бы склонялся к использованию родительского класса с подклассами для различных способов, которыми вы собираетесь фактически использовать вложения в своем приложении. Это может быть не решение DRYest, однако оно довольно хорошо поддается логическому шаблону.
llpp
Не могли бы вы использовать полиморфные Ассоциации ?
Я собираюсь поразить это в своем приложении с помощью attachment_fu, поэтому я не совсем уверен в attachment_fu, но для плагина old school File Column я бы использовал полиморфные Ассоциации.
Моя модель "file" будет:
class FileUpload < ActiveRecord::Base
belongs_to :fileable, :polymorphic => true
file_column :name
end
и тогда любые модели, которые нуждались в прикреплении файла, будут похожи:
class Company < ActiveRecord::Base
has_many :file_uploads, :as => :fileable
end
Столбец File больше не подходит, поскольку он борется с Safari 3.x и больше не поддерживается. Это было приятно и просто, хотя... Ах, старые добрые времена...
llpp
Для чего это стоит, Я думаю, что Патрик Беркли проделал хорошую работу с обработкой нескольких вложений через плагин Paperclip. Он изложил свою работу здесь:
llppminhojkhonЕсть ли какой-то способ передать данные PUSH с веб-сервера в браузер?gfffg
Конечно, я знаю о Ajax, но проблема с Ajax заключается в том, что браузер должен часто опрашивать сервер, чтобы узнать, есть ли новые данные. Это увеличивает нагрузку на сервер.
Есть ли какой-либо лучший метод (даже с использованием Ajax), кроме частого опроса сервера?
gfffgttaaggajax,webserver,comet,ttaagggfffg
Да, то, что вы ищете-это COMET http://en.wikipedia.org/wiki/Comet_(Программирование) . Другие хорошие условия использования Google для поиска AJAX-толчка и обратного-ajax.
llpp
Да, это называется обратный Ajax или комета . Comet-это в основном зонтичный термин для различных способов открытия долгоживущих запросов HTTP для передачи данных в реальном времени в веб-браузер. Я бы рекомендовал StreamHub Push Server , у них есть несколько классных демо-версий, и с ними гораздо проще начать работу, чем с любым другим сервером. Ознакомьтесь с руководством по началу работы с Comet и StreamHub для быстрого введения. Вы можете использовать выпуск Community Edition, который доступен для бесплатной загрузки, но ограничен 20 одновременными пользователями. Коммерческая версия хорошо стоит только для поддержки, плюс вы получаете SSL и Desktop .NET & Java клиентских адаптеров. Помощь доступна через группу Google, есть хорошая куча учебников в сети, а также адаптер GWT Comet .
llpp
В настоящее время вы должны использовать WebSockets.
Это стандарт 2011 года, который позволяет инициировать соединения с HTTP и затем обновить их до двухнаправленного обмена сообщениями между клиентом и сервером.
Вы можете легко инициировать соединение с javascript:
var ws = new WebSocket("ws://your.domain.com/somePathIfYouNeed?args=any");
ws.onmessage = function (evt)
{
var message = evt.data;
//decode message (with JSON or something) and do the needed
};
Обработка на стороне разъединения зависит от вашего стека tenchnology.
llpp
Посмотрите на Comet (пародия на то, что Ajax является чистящим средством и поэтому является Comet), который в основном "reverse Ajax." знает, что это требует длительного подключения к серверу для каждого пользователя, чтобы получать уведомления, поэтому будьте в курсе последствий производительности при написании вашего приложения.
llpp
Комета-это определенно то, что вы хотите. В зависимости от ваших требований к языку и фреймворку доступны различные серверные библиотеки. Например, WebSync-это IIS-интегрированный сервер comet для разработчиков ASP.NET/C#/IIS, а также есть куча других автономных серверов, если вам нужна более тесная интеграция с другими языками.
llpp
Я бы настоятельно рекомендовал потратить некоторое время на Comet, но я не знаю реальной реализации или библиотеки, которую вы могли бы использовать.
Для своего рода "callcenter control panel" веб-приложения, которое включало агент обновления и статус Очереди вызовов для живого центра обработки вызовов, мы разработали собственное решение, которое работает, но находится далеко от библиотеки, которую вы могли бы использовать.
Что мы сделали, так это внедрили небольшой сервис на сервере, который разговаривает с телефонной системой, ждет новых событий и поддерживает фотографию ситуации. Эта услуга предоставляет небольшой webserver.
Наши веб-клиенты подключаются через HTTP к этому webserver и запрашивают последнюю фотографию (закодированную в XML), отображают ее и затем снова идут, запрашивая новую фотографию. webserver в этот момент может:
- Верните новую фотографию, если она есть
- Заблокируйте клиента на несколько секунд (30 в нашей настройке), ожидая какого-то события для ocurr и изменения фотографии. Если в этот момент не было сгенерировано ни одного события, он возвращает ту же фотографию, но только для того, чтобы соединение оставалось живым и не требовало тайм-аута клиента.
Таким образом, при опросе клиентов он получает ответ максимум за 0-30 секунд. Если новое событие уже было сгенерировано, оно получает его немедленно), в противном случае оно блокируется до тех пор, пока не будет сгенерировано новое событие.
Это в основном опрос, но это несколько умный опрос, чтобы не перегревать webserver. Если комета не является вашим ответом, я уверен, что это может быть реализовано с использованием той же идеи, но с более широким использованием AJAX или кодированием в JSON для получения лучших результатов. Это было разработано до эпохи AJAX, так что есть много возможностей для улучшения.
Если кто-то может обеспечить фактическую легкую реализацию этого, отлично!
llpp
Интересной альтернативой Comet является использование сокетов в Flash.
llpp
Еще один, стандартный, способ - это SSE (серверные события, также известные как EventSource, после объекта JavaScript).
llpp
Комета была фактически придумана Алексом Расселом из Dojo Toolkit ( http://www.dojotoolkit.org ). Вот ссылка на дополнительную информацию http://cometdproject.dojotoolkit.org/
llpp
Возможно, стоит проверить Meteor Server , который является веб-сервером, предназначенным для COMET. Хорошая демо -версия, и она также используется twitterfall .
llpp
Есть и другие методы. Не уверен, что они "better" в вашей ситуации. У вас может быть Java applet, который подключается к серверу при загрузке страницы и ждет отправки материала сервером. Это было бы совсем немного медленнее при запуске, но позволило бы браузеру получать данные с сервера нечасто, без опроса.
llpp
Можно достичь того, к чему вы стремитесь, используя постоянные соединения http.
Посмотрите статью о комете в Википедии, это хорошее место для начала.
Вы не предоставляете много информации, но если вы смотрите на создание какого-то событийного сайта (a'La digg spy) или что-то в этом роде, вы, вероятно, будете смотреть на реализацию скрытого IFRAME, который соединяется с url, где соединение никогда не закрывается, а затем вы будете передавать теги сценариев с сервера на клиент для выполнения обновлений.
llpp
Вы можете использовать приложение Flash/Flex на клиенте с BlazeDS или LiveCycle на стороне сервера. Данные могут быть переданы клиенту с помощью соединения RTMP. Имейте в виду, что RTMP использует нестандартный порт. Но вы можете легко вернуться к опросу, если порт заблокирован.
llpp
Как только соединение открыто к серверу, его можно держать открытым, и сервер может толкать содержимое уже давно я сделал это с помощью multipart/x-mixed-replace , но это не сработало в IE.
Я думаю, что вы можете сделать умные вещи с опросом, который делает его более похожим на push, не отправляя содержимое неизмененных заголовков, но оставляя соединение открытым, но я никогда этого не делал.
llpp
пожалуйста, проверьте эту библиотеку https://github.com/SignalR/SignalR , чтобы узнать, как динамически передавать данные клиентам, когда они становятся доступными
llpp
Вы можете попробовать нашу кометную составляющую - хотя это очень экспериментально...!
llpp
Вы также можете просмотреть Java Pushlets, если вы используете jsp страниц.
llpp
Можно ли заглянуть в историю репозитория Subversion для файлов с определенным именем (еще лучше было бы для них иметь подстановочный поиск)?
Я хочу посмотреть, был ли файл .bat зафиксирован в репозитории в какой-то момент в прошлом, но с тех пор был удален в более поздних обновлениях. Даже дамп истории файлов при каждой ревизии будет работать, так как я могу просто grep выводить данные. Я просмотрел руководство, но не смог найти хорошего способа сделать это.
Журналы для каждой фиксации являются описательными, поэтому я не могу просто просматривать сообщения журнала, чтобы увидеть, какие изменения были сделаны. Я предполагаю, что у Subversion есть способ восстановить это?
TortoiseSVN может очень легко искать журналы, и в моей системе я могу ввести ".plg" в поле поиска и найти все добавления, изменения и удаления для этих файлов.
Без Tortoise единственный способ, который я могу придумать, это сделать grep полных журнала или разобрать журналы и сделать свой собственный поиск индикаторов 'A' и 'D' в файле, который вы ищете (используйте svn log --verbose для получения путей к файлам).
svn log --verbose | grep .bat
Я предполагаю, что вы используете клиент командной строки SVN. Дайте TortoiseSVN попробовать. Его диалог "Show Log" позволяет искать комментарии, имена файлов и авторов.
http://tortoisesvn.net/downloads
PS: только Windows.
svn войти в .bat
Лично я бы использовал
svnadmin dump -r1:HEAD /path/to/repo/
Передайте его в меньшее число и найдите or grep с некоторым контекстом.
TortoiseSVN полностью сладкий. Я не могу представить себе, как справляюсь с подрывной деятельностью без него.
Кроме того, если вы используете Eclipse, я бы рекомендовал вам плагин Subclipse.
По умолчанию каждая строка Gridview сопоставляется с каждой строкой в datatable или наборе данных, прикрепленном к ее источнику данных. Но что делать, если я хочу отобразить эти строки в нескольких столбцах. Например, если он имеет 10 строк, 5 строк должны отображаться в 2 столбцах рядом друг с другом. Также я могу сделать это с сеткой Infragistics. Разве это возможно?
Вместо этого можно использовать элемент управления DataList . Он имеет свойство RepeatColumns , которое позволяет определить количество столбцов, которые вы хотите отобразить.
В .NET Framework 3.5 есть еще лучшее решение-управление ListView . Дополнительную информацию об использовании элемента управления ListView можно найти здесь .
Если это чисто кодирующее упражнение, то привяжитесь к событию RowDataBound из Gridview. Таким образом, вы можете сделать:
e.Row.Cells(2).Text = e.Row.Cells(1).Text
Это позволит поместить текст из столбца 1 в столбец 2 после его извлечения из базы данных. Вы также можете динамически создавать столбцы, используя аналогичный метод.
Перечитывая,я думаю, что неправильно понимаю вашу проблему.
Разве вы не можете просто поставить два одинаковых связанных столбца один за другим?
Мне просто интересно, какие варианты существуют для правильной работы веб-частей measure/profile/optimize ASP.net 2.0, особенно для Sharepoint 2007?
Поскольку веб-части являются слоем на другом уровне технологии, получение использования ресурсов, открытых дескрипторов и прочего только для веб-части кажется немного сложным.
Кто-нибудь знает некоторые хорошие инструменты или методы для профилирования и оптимизации веб-частей?
У меня был успех профилирования SharePoint 2010 с Eqatec Profiler . Бонус заключается в том, что у них есть бесплатная версия. Поскольку он работал в SharePoint 2010, я ожидаю, что он будет работать с SharePoint 2007.
Вот как я получил его работу с SharePoint 2010: http://blogs.visigo.com/chriscoulson/performance-profiling-a-sharepoint-2010-project-using-eqatec-profiler/
Я обнаружил, что разделение всей бизнес-логики на отдельный DLL, который легко тестируется на единицу, было самым простым методом для меня. Но, честно говоря, я действительно не нашел никакого хорошего способа, кроме того, что я только что упомянул. То же самое было верно для меня с Facebook приложений в последнее время. Я думаю, что это распространено для любого приложения, которое работает внутри другой платформы. Особенно, когда производительность и тестирование, где никогда не было целью, когда разработчики платформы начали строить систему.
Когда мы начинали с SP2003, мы беспокоились о том, чтобы не закрывать соединение в приложениях или веб-частях. Мы использовали следующий запрос, чтобы проверить, будет ли увеличиваться базовое число подключений (не считая начального всплеска) по мере использования приложения на сервере разработки:
Имя SELECT, sysdatabases.name , sysprocesses.status, last_batch от sysprocesses, системной, где sysprocesses.dbid = sysdatabases.dbid и nt_username = ' СП обслуживание счета и (wfe1 с хоста='', имя=' WFE2 ') и sysprocesses.dbid = 10 Приказа last_batch алфавиту
(замените значения, выделенные жирным шрифтом, на значения, соответствующие вашей среде)
Мы не пробовали это с момента обновления до MOSS, хотя.
В настоящее время у нас есть гибридная установка ASP/PHP, подключающаяся к базе данных SQL Server 2005. Но вся работа с запросами выполняется на стороне клиента, я хотел бы переместить часть этого в PHP.
Какой драйвер и / или строка подключения необходимы для подключения к Sql Svr и каков синтаксис для использования в PHP?
Обновление: OK поэтому я определенно пытался избежать использования чего-либо, связанного с копированием DLLs и т. д. Я посмотрю на драйвер SQL2K5PHP (спасибо Винсент). @jcarrascal для ясности, под "client side" я имею в виду наше приложение-это внутреннее веб-приложение , которое работает как HTA, со всеми запросами, выполняемыми через javascript вызовов к ASP, который фактически отправляет запрос DB.
У вас есть два варианта:
1) расширение php_mssql: если вы хотите что-то, что имеет тот же API mysql и mysqli имеет, то используйте расширение php_mssql. Но есть подвох, в комплекте ntwdblib.dll файл с PHP не работает. Вы должны найти этот файл из установки SQL Server 2000 или вы можете найти его в Интернете. Этот API предположительно не очень надежен, но я использую его без проблем в течение примерно одного года.
2) драйвер Microsoft SQL Server 2005 PHP : если вы хотите что-то более современное, но у которого нет того же API и отсутствуют некоторые важные функции (mssql_num_rows). Большой плюс в том, что он поддерживается Microsoft и, вероятно, будет работать с будущей версией.
Просто используйте функцию mssql_connect() следующим образом:
$conn = mssql_connect('localhost', 'sa' , '123456')
or die('Can\'t connect.');
mssql_select_db('database', $conn)
or die('Can\'t select the database');
Функции, относящиеся к серверу SQL, определены в руководстве PHP для драйвера MSSQL .
Хоть один вопрос, "all the query work is done on the client side" WTF? :Д
PHP предоставляет расширение для доступа к базам данных Microsoft SQL Server. Чтобы использовать расширение сервера SQL, все, что требуется, - это активировать расширение в файле конфигурации PHP.
Подробности на странице MSDN
Я пытался понять, как работают блоки Ruby, и для этого я пытался реализовать их в C.
Один из простых способов реализации closures-передать void* в окружающий стек в функцию closure/function, но блоки Ruby также обрабатывают операторы returns и break из области, которая использует блок.
loop do
break i if (i >= 4000)
i *= 2
end
Я думаю, что одно из предложений closures для Java работает так же.
Итак, как бы вы реализовали Ruby-blocks/Java-closures в C?
Понятие closures требует понятия контекстов. Контекст C основан на стеке и регистрах CPU, поэтому для создания block/closure, вам нужно иметь возможность корректно (и повторно) манипулировать указателем стека и хранить/восстанавливать регистры по мере необходимости.
Это делается интерпретаторами или виртуальными машинами таким образом, чтобы иметь структуру context или что-то подобное, а не использовать стек и регистры напрямую. Эта структура отслеживает стек и, возможно, некоторые регистры, если вы разрабатываете регистр на основе VM. По крайней мере, это самый простой способ сделать это (хотя и немного менее эффективный, чем на самом деле правильное отображение вещей).
Я на самом деле ничего из этого не реализовал, так что возьмите его с мешком соли.
Закрытие состоит из двух частей: среды данных и среды кода. Как вы уже сказали, вы, вероятно, можете передать void* для обработки ссылок на данные. Вероятно, вы можете использовать setjmp и longjmp для реализации нелинейных переходов потока управления, которые требуются для разрыва Ruby.
Если вы хотите closures, вы, вероятно, должны программировать на языке, который действительно поддерживает их. :-)
UPDATE: в Clang происходят интересные вещи. Они создали прототип закрытия для C. http://lists.cs.uiuc.edu/pipermail/cfe-dev/2008-August/002670.html может оказаться интересным чтением.
Есть хороший набор слайдов на блоках Ruby как часть курса "Rails with Passion":
Это охватывает представление блока, то, как они получают передаваемые Аргументы и выполняются, а также еще более глубокие вещи, такие как объекты Proc. Это очень ясно объясняется.
Тогда, возможно, будет интересно посмотреть, как ребята из JRuby обрабатывали их в своем разборе на Java. Взгляните на источник в codehaus .
Мой вопрос касается c# и как получить доступ к статическим мемберам ... Ну, я действительно не знаю, как это объяснить (что в некотором роде плохо для вопроса, не так ли?) Я просто дам вам пример кода:
Class test<T>{
int method1(Obj Parameter1){
//in here I want to do something which I would explain as
T.TryParse(Parameter1);
//my problem is that it does not work ... I get an error.
//just to explain: if I declare test<int> (with type Integer)
//I want my sample code to call int.TryParse(). If it were String
//it should have been String.TryParse()
}
}
Так что спасибо вам, ребята, за ваши ответы (кстати, вопрос в том, как бы я решил эту проблему без получения ошибки). Это, наверное, довольно простой вопрос для вас!
Спасибо, Никлас
Edit: спасибо всем за ваши ответы!
Хотя я думаю, что фраза try - catch является самой элегантной, я знаю по своему опыту работы с vb, что это действительно может быть облом. Я использовал его один раз, и мне потребовалось около 30 минут, чтобы запустить программу, которая позже заняла всего 2 минуты для вычисления только потому, что я избегал try - catch.
Вот почему я выбрал утверждение swich в качестве лучшего ответа. Это делает код более сложным, но с другой стороны, я думаю, что он будет относительно быстрым и относительно легким для чтения. (Хотя я все еще думаю, что должен быть более элегантный способ ... может быть, на следующем языке, который я изучаю: P )
Хотя, если у вас есть какое-то другое предложение, я все еще жду (и готов принять участие)
Проблема заключается в том, что TryParse нигде не определен в интерфейсе или базовом классе, поэтому вы не можете сделать предположение, что тип, переданный в ваш класс, будет иметь эту функцию. Если вы не можете каким-то образом сдерживать T, вы будете часто сталкиваться с этим.
Чтобы получить доступ к члену определенного класса или интерфейса, необходимо использовать ключевое слово Where и указать интерфейс или базовый класс, содержащий этот метод.
В приведенном выше экземпляре TryParse не происходит из интерфейса или базового класса, поэтому то, что вы пытаетесь сделать выше, невозможно. Лучше всего просто использовать Convert.ChangeType и оператор try/catch.
class test<T>
{
T Method(object P)
{
try {
return (T)Convert.ChangeType(P, typeof(T));
} catch(Exception e) {
return null;
}
}
}
Короткий ответ, вы не можете.
Длинный ответ, вы можете обмануть:
public class Example
{
internal static class Support
{
private delegate bool GenericParser<T>(string s, out T o);
private static Dictionary<Type, object> parsers =
MakeStandardParsers();
private static Dictionary<Type, object> MakeStandardParsers()
{
Dictionary<Type, object> d = new Dictionary<Type, object>();
// You need to add an entry for every type you want to cope with.
d[typeof(int)] = new GenericParser<int>(int.TryParse);
d[typeof(long)] = new GenericParser<long>(long.TryParse);
d[typeof(float)] = new GenericParser<float>(float.TryParse);
return d;
}
public static bool TryParse<T>(string s, out T result)
{
return ((GenericParser<T>)parsers[typeof(T)])(s, out result);
}
}
public class Test<T>
{
public static T method1(string s)
{
T value;
bool success = Support.TryParse(s, out value);
return value;
}
}
public static void Main()
{
Console.WriteLine(Test<int>.method1("23"));
Console.WriteLine(Test<float>.method1("23.4"));
Console.WriteLine(Test<long>.method1("99999999999999"));
Console.ReadLine();
}
}
Я сделал статический словарь, содержащий делегат для метода TryParse каждого типа, который я мог бы использовать. Затем я написал универсальный метод для поиска словаря и передачи вызова соответствующему делегату. Поскольку каждый делегат имеет свой тип, я просто сохраняю их как ссылки на объекты и возвращаю их обратно к соответствующему универсальному типу при их извлечении. Обратите внимание, что ради простого примера я опустил проверку ошибок, например, чтобы проверить, есть ли у нас запись в словаре для данного типа.
Еще один способ сделать это, на этот раз некоторое отражение в миксе:
static class Parser
{
public static bool TryParse<TType>( string str, out TType x )
{
// Get the type on that TryParse shall be called
Type objType = typeof( TType );
// Enumerate the methods of TType
foreach( MethodInfo mi in objType.GetMethods() )
{
if( mi.Name == "TryParse" )
{
// We found a TryParse method, check for the 2-parameter-signature
ParameterInfo[] pi = mi.GetParameters();
if( pi.Length == 2 ) // Find TryParse( String, TType )
{
// Build a parameter list for the call
object[] paramList = new object[2] { str, default( TType ) };
// Invoke the static method
object ret = objType.InvokeMember( "TryParse", BindingFlags.InvokeMethod, null, null, paramList );
// Get the output value from the parameter list
x = (TType)paramList[1];
return (bool)ret;
}
}
}
// Maybe we should throw an exception here, because we were unable to find the TryParse
// method; this is not just a unable-to-parse error.
x = default( TType );
return false;
}
}
Следующим шагом будет попытка реализовать
public static TRet CallStaticMethod<TRet>( object obj, string methodName, params object[] args );
С полным соответствием типа параметра etc.
Неужели ты собираешься сделать что-то подобное:
Class test<T>
{
T method1(object Parameter1){
if( Parameter1 is T )
{
T value = (T) Parameter1;
//do something with value
return value;
}
else
{
//Parameter1 is not a T
return default(T); //or throw exception
}
}
}
К сожалению, вы не можете проверить наличие шаблона TryParse, поскольку он статичен , что, к сожалению, означает, что он не особенно хорошо подходит для универсальных моделей.
Единственный способ сделать именно то, что вы ищете, - это использовать отражение, чтобы проверить, существует ли метод для T.
Другой вариант-убедиться, что объект, который вы отправляете, является конвертируемым объектом, ограничив тип до IConvertible (все примитивные типы реализуют IConvertible). Это позволит вам очень гибко конвертировать ваш параметр в данный тип.
Class test<T>
{
int method1(IConvertible Parameter1){
IFormatProvider provider = System.Globalization.CultureInfo.CurrentCulture.GetFormat(typeof(T));
T temp = Parameter1.ToType(typeof(T), provider);
}
}
Вы также можете сделать вариацию на эту тему, используя вместо этого тип 'object', как это было изначально.
Class test<T>
{
int method1(object Parameter1){
if(Parameter1 is IConvertible) {
IFormatProvider provider = System.Globalization.CultureInfo.CurrentCulture.GetFormat(typeof(T));
T temp = Parameter1.ToType(typeof(T), provider);
} else {
// Do something else
}
}
}
ОК, ребята: спасибо за всю рыбу. Теперь с вашими ответами и моими исследованиями (особенно со статьей об ограничении родовых типов примитивами ) я представлю вам свое решение.
Class a<T>{
private void checkWetherTypeIsOK()
{
if (T is int || T is float //|| ... any other types you want to be allowed){
return true;
}
else {
throw new exception();
}
}
public static a(){
ccheckWetherTypeIsOK();
}
}
Это не совсем решение, но в некоторых сценариях это может быть хорошей альтернативой: мы можем передать дополнительный делегат универсальному методу.
Чтобы пояснить, что я имею в виду, давайте возьмем пример. Допустим, у нас есть какой-то универсальный фабричный метод, который должен создать экземпляр T, и мы хотим, чтобы он затем вызвал другой метод для уведомления или дополнительной инициализации.
Рассмотрим следующий простой класс:
public class Example
{
// ...
public static void PostInitCallback(Example example)
{
// Do something with the object...
}
}
И следующий статический метод:
public static T CreateAndInit<T>() where T : new()
{
var t = new T();
// Some initialization code...
return t;
}
Так что прямо сейчас мы должны были бы сделать:
var example = CreateAndInit<Example>();
Example.PostInitCallback(example);
Однако мы могли бы изменить наш метод, чтобы взять дополнительный делегат:
public delegate void PostInitCallback<T>(T t);
public static T CreateAndInit<T>(PostInitCallback<T> callback) where T : new()
{
var t = new T();
// Some initialization code...
callback(t);
return t;
}
А теперь мы можем изменить вызов на:
var example = CreateAndInit<Example>(Example.PostInitCallback);
Очевидно, что это полезно только в очень специфических сценариях. Но это самое чистое решение в том смысле, что мы получаем безопасность во время компиляции, здесь нет "hacking", и код очень прост.
Лучший код: ограничьте T до ValueType таким образом:
class test1<T> where T: struct
A "struct" здесь означает тип значения. String - это класс, а не тип значения. int, float, Enums - это все типы значений.
кстати компилятор не принимает вызов статических методов или доступ к статическим членам на 'type parameters', как в следующем примере, который не будет компилироваться :(
class MyStatic { public static int MyValue=0; }
class Test<T> where T: MyStatic
{
public void TheTest() { T.MyValue++; }
}
=> Ошибка 1 'T' - это 'type parameter', которая недопустима в данном контексте
SL.
Ты, наверное, не сможешь этого сделать.
Прежде всего, если бы это было возможно, Вам понадобилась бы более жесткая привязка к T, чтобы typechecker мог быть уверен, что все возможные замены для T на самом деле имеют статический метод с именем TryParse.
Возможно, вы захотите прочитать мой предыдущий пост об ограничении универсальных типов примитивами . Это может дать вам некоторые указания в ограничении типа, который может быть передан универсальному (так как TypeParse , очевидно, доступен только для заданного числа примитивов ( string.TryParse , очевидно, является исключением, что не имеет смысла).
Как только у вас будет больше дескриптора для типа, вы можете работать над попыткой его проанализировать. Вам может понадобиться немного уродливый переключатель там (чтобы вызвать правильный TryParse ), но я думаю, что вы можете достичь желаемой функциональности.
Если вам нужно, чтобы я объяснил что-либо из вышеперечисленного дальше, то, пожалуйста, спросите :)
Это не то, как работает статика. Вы должны думать о статике как о чем-то вроде глобального класса, даже если они распределены по целой куче типов. Моя рекомендация состоит в том, чтобы сделать его свойством внутри экземпляра T, который может получить доступ к необходимому статическому методу.
Кроме того, T-это фактический экземпляр чего-то, и, как и любой другой экземпляр, вы не можете получить доступ к статике для этого типа через созданное значение. Вот пример того, что нужно делать:
class a {
static StaticMethod1 ()
virtual Method1 ()
}
class b : a {
override Method1 () return StaticMethod1()
}
class c : a {
override Method1 () return "XYZ"
}
class generic<T>
where T : a {
void DoSomething () T.Method1()
}
Я просто разрабатываю схему для таблицы базы данных, которая будет содержать сведения о вложениях email - их размер в байтах, имя файла и тип контента (т. е. "image/jpg", "audio/mp3", и т. д.).
Кто-нибудь знает максимальную длину, которую я могу ожидать от типа контента?
Я надеюсь, что не ошибся, но похоже, что длина составляет максимум 127/127 или 255 всего .
RFC 4288 имеет ссылку в 4.2 (стр. 6):
Type and subtype names MUST conform to the following ABNF:
type-name = reg-name
subtype-name = reg-name
reg-name = 1*127reg-name-chars
reg-name-chars = ALPHA / DIGIT / "!" /
"#" / "$" / "&" / "." /
"+" / "-" / "^" / "_"
Мне не ясно, может ли суффикс +добавляться после 127,но это не так.
В RFC 6838, который является последним стандартом и устарел RFC4288, есть следующее утверждение.
"Также обратите внимание, что хотя этот синтаксис допускает имена длиной до 127 символов, ограничения реализации могут сделать такие длинные имена проблематичными. По этой причине <type-name> и <subtype-name> SHOULD должны быть ограничены 64 символами."
64+1+64 = 129.
Но я подозреваю, что стандарт должен означать: 63+1+63=127.
Мы запускаем систему SaaS, которая позволяет пользователям загружать файлы. Мы изначально разработали его для хранения типов MIME до 50 символов. За последние несколько дней мы видели несколько попыток загрузить 71-байтовые типы. Итак, мы переходим на 250. 100 казалось "good", но это всего лишь несколько больше, чем Макс, который мы видим сейчас. 500 кажется глупым, поэтому 250-это выбранный вариант.
Я уже использовал Trac / Subversion раньше, и мне очень нравится интеграция. Мой текущий проект использует Mercurial для распределенной разработки, и было бы неплохо иметь возможность отслеживать проблемы/ошибки и интегрировать это с Mercurial. Я понял, что это может быть сложно с природой DVCS.
Я также хотел бы добавить в этот список Редмайна . Я начал с Trac, но обнаружил, что поддержка mercurial (и административный интерфейс для всего) намного лучше в Redmine.
FogBugz имеет тесную интеграцию с Mercurial через их продукт печи .
TracMercurial интегрирует Trac с Mercurial. Assembla предоставляет бесплатный хостинг Mercurial с интеграцией Trac.
Идея заключается в том, что у вас есть центральный репозиторий в качестве основного и вы загружаете все дочерние изменения из локальных репозиториев в главный.
BugTracker.NET теперь поддерживает интеграцию Mercurial точно так же, как поддерживает Subversion и git. BugTracker.NET-это бесплатная система отслеживания ошибок с открытым исходным кодом ASP.NET.
Другие бесплатные трекеры ошибок с открытым исходным кодом, которые поддерживают Mercurial:
- Trac - http://trac.edgewall.org/wiki/TracMercurial
- В Redmine - http://www.redmine.org/wiki/1/RedmineRepositories
- Округлять - https://www.mercurial-scm.org/wiki/Hook . Команда разработчиков Mercurial сама использует Roundup.
Bugs Everywhere -это распределенная система отслеживания ошибок, которая поддерживает Mercurial.
Jira интегрируется с помощью плагина. Это отличный инструмент.
Я только что собрал трекер ошибок командной строки под названием b для Mercurial, который, хотя и не такой мощный, как Trac и тому подобное, является именно тем, что требуется во многих ситуациях. Это лучшая функция, насколько легко ее настроить-установите расширение Mercurial, и все ваши РЕПО имеют в своем распоряжении трекер ошибок. Я нахожу это невероятно полезным на небольших проектах, которые я can't/don't хочу настроить с полноценным трекером, живущим где-то на сервере, просто hg b и вперед.
Недавно я разработал плагин Trac, который интегрирует некоторые функции Mercurial, которые плагин TracMercurial еще не поддерживает, он называется TracMercurialChangesetPlugin. Он позволяет искать в ваших наборах изменений, синхронизировать кэш, просматривать список изменений в ваших связанных билетах...
Вы можете прочитать об этом по адресу http://tumblr.com/x8tg5xbsh
Существует BugzillaExtension для добавления комментария к ошибке Bugzilla каждый раз, когда вы упоминаете ее номер.
Если вы готовы к другому предложению, вы можете попробовать Артемис .
Хотя я еще не использовал его, он выглядит достаточно легко.
У меня есть два приложения, написанные на Java, которые взаимодействуют друг с другом с помощью XML сообщений по сети. Я использую парсер SAX на приемном конце, чтобы получить данные обратно из сообщений. Одним из требований является встраивание двоичных данных в сообщение XML, но SAX это не нравится. Кто-нибудь знает, как это сделать?
UPDATE: я получил это, работая с классом Base64 из библиотеки кодеков apache commons, На случай, если кто-то еще пытается сделать что-то подобное.
Вы можете закодировать двоичные данные с помощью base64 и поместить их в элемент Base64; приведенная ниже статья является довольно хорошей по этому вопросу.
XML настолько универсален...
<DATA>
<BINARY>
<BIT index="0">0</BIT>
<BIT index="1">0</BIT>
<BIT index="2">1</BIT>
...
<BIT index="n">1</BIT>
</BINARY>
</DATA>
XML - это как насилие : если оно не решает вашу проблему, значит, вы используете его недостаточно.
EDIT:
BTW: Base64 + CDATA, вероятно, лучшее решение
(EDIT2:
Тот, кто поднимает меня, пожалуйста, также поднимает настоящий ответ. Мы же не хотим, чтобы какой-нибудь бедолага пришел сюда и фактически реализовал мой метод, потому что он был самым высоким рангом на SO, верно?)
Base64-это действительно правильный ответ, но CDATA-нет, это в основном говорит: "это может быть что угодно", однако это не должно быть просто что-то, это должны быть Base64 закодированные двоичные данные. Схема XML определяет base 64 binary как примитивный тип данных, который можно использовать в вашем xsd.
У меня была эта проблема только на прошлой неделе. Я должен был сериализовать файл PDF и отправить его, внутри файла XML, на сервер.
Если вы используете .NET, вы можете преобразовать двоичный файл непосредственно в строку base64 и вставить его в элемент XML.
string base64 = Convert.ToBase64String(File.ReadAllBytes(fileName));
Или же существует метод, встроенный прямо в объект XmlWriter. В моем конкретном случае мне пришлось включить пространство имен типа данных Microsoft:
StringBuilder sb = new StringBuilder();
System.Xml.XmlWriter xw = XmlWriter.Create(sb);
xw.WriteStartElement("doc");
xw.WriteStartElement("serialized_binary");
xw.WriteAttributeString("types", "dt", "urn:schemas-microsoft-com:datatypes", "bin.base64");
byte[] b = File.ReadAllBytes(fileName);
xw.WriteBase64(b, 0, b.Length);
xw.WriteEndElement();
xw.WriteEndElement();
string abc = sb.ToString();
Строка abc выглядит примерно так:
<?xml version="1.0" encoding="utf-16"?>
<doc>
<serialized_binary types:dt="bin.base64" xmlns:types="urn:schemas-microsoft-com:datatypes">
JVBERi0xLjMKJaqrrK0KNCAwIG9iago8PCAvVHlwZSAvSW5mbw...(plus lots more)
</serialized_binary>
</doc>
Обычно я кодирую двоичные данные в кодировке MIME Base64 или URL .
Попробуйте Base64 кодирование / декодирование ваших двоичных данных. Также загляните в разделы CDATA
Любая кодировка binary-to-text сделает трюк. Я использую что-то вроде этого
<data encoding="yEnc>
<![CDATA[ encoded binary data ]]>
</data>
Может быть, закодировать их в известный набор - что-то вроде базы 64 является популярным выбором.
Хотя другие ответы в основном хороши, вы можете попробовать другой, более экономичный метод кодирования, например yEnc. ( Ссылка на Википедию yEnc) с помощью yEnc также можно получить контрольную сумму справа "out of the box". Читайте и ссылки ниже. Конечно, поскольку XML не имеет собственного типа yEnc, ваша схема XML должна быть обновлена, чтобы правильно описать закодированный узел.
Почему: из-за стратегий кодирования base64/63, uuencode et al. кодировки увеличивают объем данных (накладные расходы), которые необходимо хранить и передавать примерно на 40% (против yEnc - это 1-2%). в зависимости от того, что вы кодируете, 40% накладные расходы могут быть/стать проблемой.
yEnc-Википедия аннотация: https://en.wikipedia.org/wiki/YEnc yEnc-это схема кодирования binary-to-text для передачи двоичных файлов в сообщениях на Usenet или по электронной почте. ... Дополнительным преимуществом yEnc по сравнению с предыдущими методами кодирования, такими как uuencode и Base64, является включение контрольной суммы CRC для проверки того, что декодированный файл был доставлен в целости и сохранности.
Base64 накладные расходы составляют 33%.
BaseXML для XML1.0 накладные расходы-это только 20% . Но это не стандарт, и пока есть только реализация C. Проверьте это, если вас интересует размер данных. Обратите внимание, что, однако, браузеры склонны реализовывать сжатие так, чтобы оно было менее необходимым.
Я разработал его после обсуждения в этой теме: кодирование двоичных данных в пределах XML: альтернативы base64 .
Вы также можете Uuencode исходные двоичные данные. Этот формат немного старше, но он делает то же самое, что и кодировка base63.
Если у вас есть контроль над форматом XML, вы должны вывернуть проблему наизнанку. Вместо того, чтобы прикреплять двоичный XML, вы должны подумать о том, как вложить документ, который имеет несколько частей, одна из которых содержит XML.
Традиционным решением для этого является архив (например, tar). Но если вы хотите сохранить вложенный документ в текстовом формате или если у вас нет доступа к библиотеке архивирования файлов, существует также стандартизированная схема, которая широко используется в email и HTTP, которая является multipart/* MIME с Content-Transfer-Encoding: binary .
Например, если ваши серверы взаимодействуют через HTTP и вы хотите отправить составной документ, основным из которых является документ XML, ссылающийся на двоичные данные, сообщение HTTP может выглядеть примерно так:
POST / HTTP/1.1
Content-Type: multipart/related; boundary="qd43hdi34udh34id344"
... other headers elided ...
--qd43hdi34udh34id344
Content-Type: application/xml
<myxml>
<data href="cid:data.bin"/>
</myxml>
--qd43hdi34udh34id344
Content-Id: <data.bin>
Content-type: application/octet-stream
Content-Transfer-Encoding: binary
... binary data ...
--qd43hdi34udh34id344--
Как и в приведенном выше примере, XML ссылается на двоичные данные в заключающей многоэлементной схеме, используя схему cid URI, которая является идентификатором заголовка Content-Id. Накладными расходами этой схемы будет только заголовок MIME. Аналогичная схема может быть использована и для ответа HTTP. Конечно, в протоколе HTTP у вас также есть возможность отправить составной документ в отдельный request/response.
Если вы хотите избежать обертывания ваших данных в составную часть, используйте data URI:
<myxml>
<data href="data:application/something;charset=utf-8;base64,dGVzdGRhdGE="/>
</myxml>
Но у этого есть накладные расходы base64.
Я хочу скопировать файл из A в B в C#. как это сделать?
Без какого-либо кода обработки ошибок:
File.Copy(path, path2);
Метод File.Copy:
Используйте класс FileInfo.
FileInfo fi = new FileInfo("a.txt");
fi.CopyTo("b.txt");
System.IO.File.Copy
Это должно сработать!
using System.IO;
...
var path = //your current filePath
var outputPath = //the directory where you want your (.txt) file
File.Copy(path,outputPath);
Я хочу иметь возможность захватить исключение, которое возникает, когда пользователь запрашивает несуществующий контроллер, и перенаправить его на страницу 404. Как я могу это сделать?
Например, пользователь запрашивает http://www.nosite.com/paeges/1 ( должно быть /pages/). Как мне сделать так, чтобы они были перенаправлены на экран 404, а не на экран исключений?
Просто используйте маршрут:
// We couldn't find a route to handle the request. Show the 404 page.
routes.MapRoute("Error", "{*url}",
new { controller = "Error", action = "404" }
);
Поскольку это будет глобальный обработчик, поместите его полностью внизу под маршрутом по умолчанию.
Взгляните на эту страницу для маршрутизации ваших 404-ошибок на указанную страницу.
Нашел это на том же сайте- Стратегии для ресурса на основе 404s
RFC для класса Java-это набор всех методов, которые могут быть вызваны в ответ на сообщение объекту класса или каким-либо методом в классе. RFC = M + R, где M = количество методов в классе. R = общее число других методов, непосредственно вызываемых из M.
Мышление C-это то .класс и J-это то .java файл, из которого нам нужно вычислить RFC.
class J{
a(){}
b(){}
c(){
e1.e();
e1.f();
e1.g();
}
h(){
i.k();
i.j();
}
m(){}
n(){
i.o();
i.p();
i.p();
i.p();
}
}
здесь M=6 и R=9 (Не беспокойтесь о вызове внутри цикла. Это рассматривается как один вызов)
Вычисление M легко. Загрузите C с помощью загрузчика классов и используйте отражение, чтобы получить количество методов.
Вычисление R не является прямым. Нам нужно подсчитать количество вызовов метода из класса. Только первый уровень.
Для вычисления R я должен использовать regex. Обычно формат будет (вызовы без использования . не учитываются)
[variable_name].[method_name]([zero or more parameters]);
или
[variable_name].[method_name]([zero or more parameters])
без точки с запятой, когда возврат вызова напрямую становится параметром для другого метода. или
[variable_name].[method_name]([zero or more parameters]).method2();
это становится двумя вызовами метода
Какие еще шаблоны вызова метода вы можете придумать? Есть ли другой способ, кроме использования RegEx, который может быть использован для вычисления R.
UPDATE:
@McDowell
похоже, что с помощью BCEL я могу упростить весь процесс. Дай мне попробовать.
Вы можете использовать библиотеку разработки байтового кода с двоичными файлами. Вы можете использовать DescendingVisitor для посещения членов и ссылок класса. Я использовал его, чтобы найти зависимости классов .
Кроме того, вы можете повторно использовать некоторые модели исходных файлов. Я почти уверен, что редактор Java в Eclipse JDT поддерживается какой-то моделью.
Вы должны найти свой ответ в спецификации языка Java.
Вы забыли статический вызов метода, вызов метода внутри параметров...
Вызов метода с использованием отражения (имя метода находится в строке).
Включает ли M вызовы своих собственных методов? Или звонки на внутренние классы? Например:
class J {
a() { }
b() { this.a(); }
c() { jj.aa(); }
d() { i.k(); }
e() { this.f().a(); }
f() { return this; }
g() { i.m().n(); }
class JJ {
aa() { a(); }
}
}
Каково было бы значение M этого? Существует только три вызова функции для метода, не определенного в этом классе (вызовы в функциях d() и g()). Вы хотите включить вызовы внутренних классов или вызовы основного класса, сделанные во внутреннем классе? Вы хотите включить вызовы других методов в том же классе?
Если вы смотрите на любые вызовы методов, независимо от источника, то regex, вероятно, может работать, но будет сложно получить право (правильно ли ваш regex игнорирует строки, содержащие метод-вызов, подобный содержимому? Правильно ли он обрабатывает вызовы конструктора?). Если вы заботитесь об источнике вызова метода, то регулярные выражения, вероятно, не дадут вам то, что вы хотите. Вам нужно будет использовать отражение (хотя, к сожалению, я не знаю достаточно о отражении, чтобы быть полезным там).
При использовании Office Interop в C#, при вставке объекта диаграммы в документ MS Word приложение Grap загружается очень быстро, а затем исчезает. Есть ли способ предотвратить это? Я попытался установить свойство Visible экземпляра приложения в значение false без эффекта.
EDIT: свойство Visible вступает в силу, когда используется против Word при interopping,и оно не появляется. Я ожидал бы, что есть аналогичный способ сделать это для MS Graph.
Это обычное поведение для большого количества компонентов, размещенных в исполняемом двоичном файле. Хост-приложение запустится, а затем выполнит задание. Я не знаю, есть ли верный способ предотвратить это, поскольку у вас нет контроля над компонентом или над процессом, пока приложение не будет запущено и не ответит.
Хак, который я пробовал в прошлом (для чего-то совершенно не связанного), запускал процесс и постоянно обнаруживал, был ли создан его основной windows. Как только он был создан, я его прятал. Вы можете сделать это с помощью основного модуля неисправного приложения и надеяться, что это будет достаточно быстро, чтобы скрыть окно до того, как пользователь заметит. Затем вы создаете экземпляр своего компонента; компонент обычно перерабатывает существующий процесс, надеясь, что он имеет скрытое главное окно.
Я не могу гарантировать, что это сработает в вашей ситуации, но стоит попробовать, что проблема настолько важна, или если вы не найдете лучшего способа, конечно.
Я делаю какую-то фанковую аутентификацию (и да, я знаю, open-id потрясающий, но опять же мой open-id не работает прямо сейчас!).
Натыкаясь на Windows CardSpace мне было интересно, использовал ли кто-нибудь это в реальной системе продукта. Если вы использовали его, каковы были плюсы и минусы для вас? И как я могу использовать его в моем open-id?
Вы можете принимать информационные карточки на веб-сайте, используя дешевый и веселый сертификат (но не самоподписанный) или вообще без сертификата.
И да, я использовал его как часть производственной системы, которая выросла из доказательства концепции, которую я сделал в Microsoft.
Минусы: Если у вас нет сертификата EV SSL, вы получаете предупреждения. Код для разбора карты в лучшем случае неполный (вы должны взломать его для no-SSL), вы должны объяснить пользователям, что это такое.
Плюсы: ну, это более интересно; я использовал управляемые карты и выпускал их, а затем использовал их для проверки претензий; но для самоизданных карт; ну, это сильнее, чем пароль пользователя и не имеет тех же уязвимостей, что и OpenID.
Если у вас есть две версии одного и того же отчета (.rpt) и вы хотите установить, в чем именно заключаются различия, как лучше всего это сделать? Я видел некоторые коммерческие инструменты для этого, но я не слишком заинтересован в том, чтобы раздавать наличные деньги за то, что должно быть относительно прямолинейным. Могу ли я подключиться к Crystal API и просто перечислить все свойства каждого поля или что-то еще? Пожалуйста, кто-нибудь скажите мне, что где-то есть проект с открытым исходным кодом, который делает это... @:-)
@Kogus, не будет ли различение выходных данных в виде текста скрывать какие-либо различия в форматировании?
@ladoucep, я, кажется, не могу экспортировать отчет без данных.
Могу ли я подключиться к Crystal API и просто перечислите все свойства каждое поле или что-то в этом роде? Пожалуйста кто-нибудь, скажите мне, что есть открытая дверь. Исходный проект где-то, что делает этот... @:-)
Есть на самом деле такой API. Я написал заявление VB6, чтобы сделать только то, что вы просили, и даже больше. Я думаю, что даже перенес его в VB.Net. Поскольку это было для моего собственного использования, я не потратил много времени, чтобы сделать его 'polished'. Я намеревался выпустить его, но у меня не было времени...
Другой подход, который я использовал в прошлом, заключается в создании приложения Access для управления большими проектами разработки отчетов. Одна из его многочисленных функций включает в себя возможность извлечения таблиц, используемых отчетом, а также операторов SQL, используемых его командами и выражениями SQL. Его цель-дать человеку глобальную перспективу того, какие отчеты используют какие таблицы. Наверное, он все еще где-то у меня...
** редактирование 1 **
BusinessObjects предприятие XI (R?) имеет функцию с именем 'Meta Manager'. Он будет периодически проверять содержимое репозитория и сохранять результаты в базу данных. Он использует службу Report-Application Service (RAS)для генерации метаданных. Это дополнительная, пятизначная лицензия, конечно.
** редактирование 2 **
Рассмотрите возможность использования PowerShell для выполнения работы: PsCrystal .
Один из полезных методов заключается в том, чтобы вывести обе версии отчета в обычный текст, а затем diff эти выходные данные.
Вы можете написать что-то, используя компонент crystal report, чтобы описать каждое свойство отчета, как вы описали. Затем вы можете вывести это в текст, и diff те . Я не знаю ни одного инструмента с открытым исходным кодом, который делает это для вас, но было бы не так уж трудно написать его.
@question в посте: Дифференцирование выходных данных будет показывать изменения форматирования только в том случае, если изменились относительные позиции. Например, если бы у меня было вот это:
до: Имя, фамилия, адресаты
после: Фамилия, Имя, Адрес
Тогда это проявится как разница.
Но если бы я просто ударил по столбцу адреса на несколько пикселей или изменил его с обычного текста на полужирный, то вы правы, это не появилось бы.
Один из методов, который я использовал с большим успехом в прошлом, - это печать отчетов из обеих версий на основе одних и тех же данных. Затем я беру первую страницу из каждой версии, кладу одну поверх другой (важно не перепутать их) и подношу к окну. Как правило, довольно легко увидеть любые различия, и эти различия могут быть вручную аннотированы с помощью подходящего пишущего инструмента, такого как карандаш. Повторите процедуру для каждой страницы отчета.
Следует признать, что для больших отчетов это может быть довольно трудоемким и подверженным ошибкам, но эти ограничения можно преодолеть с терпением и осторожностью.
Каков наилучший способ управления списком windows (сохраняя их в порядке), чтобы иметь возможность продвигать следующее окно на верхний уровень, когда текущее окно верхнего уровня закрыто.
Это для веб-приложения, поэтому мы используем jQuery Javascript.
Мы обсудили несколько упрощенных решений, таких как использование массива и просто обработка индекса [0] в качестве самого верхнего окна.
Мне интересно, есть ли потенциально более эффективная или полезная альтернатива тому, что мы провели мозговой штурм.
Я действительно не знаю javascript, но не могли бы вы создать стек windows?
Стек, если вы хотите просто закрыть окно сверху. Очередь, если вам также нужно открыть windows в конце.
Стек / очередь в JS-это простой массив, которым можно управлять с помощью .push(val) , .pop(), .shift(val) и .unshift() .
В настоящее время я использую удивительный плагин attachment-fu для приложения Rails, но как начинающий разработчик я никогда не сталкивался с сценарием, подобным тому, в котором я оказался.
По сути, я использую плагин attachment-fu на двух уровнях.
- Это для пользовательских аватаров в классе user.
- Это разрешить вложения файлов ( PDFs и т. д.) В системе обмена сообщениями.
Мой вопрос заключается в том , какой наилучшей практикой использования было бы в этих ситуациях оставаться DRY , ясным и последовательным.
Очевидно, что нет смысла определять и выполнять плагин в обоих классах, но есть что-то очень странное для меня (возможно, необоснованное) о том, чтобы просто идти вперед и настраивать все это в классе божественного приложения.
Есть ли что-то между ними, или родительский класс-это путь?
Спасибо!
В чем проблема DRY с определением параметров attachment_fu дважды?
Если файлы не имеют того же типа и хранятся в одном и том же месте, вы не будете повторять ничего в конфигурации.
Конечно, у вас будет два объявления has_attachment, но варианты будут в основном отличаться (одно объявление для ваших аватаров, а другое для ваших pdf и т. д.
99.99% кода для обработки вложений будет похоронен в библиотеках attachment_fu, ваш код конфигурации должен быть довольно DRY по умолчанию =)
Является ли поддержка Аватара "outsourcing" полностью для Граватара вариантом? Есть некоторые плагины Rails, которые будут отображать аватары, размещенные Gravatar. Возможно, Вам не придется заново изобретать колесо там.
То, что описывает wfarr, будет наследованием одной таблицы, что я сейчас делаю в этой ситуации. У меня есть одна таблица для активов, которая содержит все необходимые столбцы attachment_fu, плюс дополнительный столбец с именем type, который будет содержать фактическое имя модели. У меня есть модель для активов и дополнительные модели для конкретных типов загрузки, которые наследуются от активов:
asset.rb:
class Asset < ActiveRecord::Base
... attachment_fu logic ...
end
avatar.rb:
class Avatar < Asset
... avatar specific attachment_fu logic ...
end
pdf.rb:
class PDF < Asset
... PDF specific attachment_fu logic ...
end
Я бы склонялся к использованию родительского класса с подклассами для различных способов, которыми вы собираетесь фактически использовать вложения в своем приложении. Это может быть не решение DRYest, однако оно довольно хорошо поддается логическому шаблону.
Не могли бы вы использовать полиморфные Ассоциации ?
Я собираюсь поразить это в своем приложении с помощью attachment_fu, поэтому я не совсем уверен в attachment_fu, но для плагина old school File Column я бы использовал полиморфные Ассоциации.
Моя модель "file" будет:
class FileUpload < ActiveRecord::Base
belongs_to :fileable, :polymorphic => true
file_column :name
end
и тогда любые модели, которые нуждались в прикреплении файла, будут похожи:
class Company < ActiveRecord::Base
has_many :file_uploads, :as => :fileable
end
Столбец File больше не подходит, поскольку он борется с Safari 3.x и больше не поддерживается. Это было приятно и просто, хотя... Ах, старые добрые времена...
Для чего это стоит, Я думаю, что Патрик Беркли проделал хорошую работу с обработкой нескольких вложений через плагин Paperclip. Он изложил свою работу здесь:
Конечно, я знаю о Ajax, но проблема с Ajax заключается в том, что браузер должен часто опрашивать сервер, чтобы узнать, есть ли новые данные. Это увеличивает нагрузку на сервер.
Есть ли какой-либо лучший метод (даже с использованием Ajax), кроме частого опроса сервера?
Да, то, что вы ищете-это COMET http://en.wikipedia.org/wiki/Comet_(Программирование) . Другие хорошие условия использования Google для поиска AJAX-толчка и обратного-ajax.
Да, это называется обратный Ajax или комета . Comet-это в основном зонтичный термин для различных способов открытия долгоживущих запросов HTTP для передачи данных в реальном времени в веб-браузер. Я бы рекомендовал StreamHub Push Server , у них есть несколько классных демо-версий, и с ними гораздо проще начать работу, чем с любым другим сервером. Ознакомьтесь с руководством по началу работы с Comet и StreamHub для быстрого введения. Вы можете использовать выпуск Community Edition, который доступен для бесплатной загрузки, но ограничен 20 одновременными пользователями. Коммерческая версия хорошо стоит только для поддержки, плюс вы получаете SSL и Desktop .NET & Java клиентских адаптеров. Помощь доступна через группу Google, есть хорошая куча учебников в сети, а также адаптер GWT Comet .
В настоящее время вы должны использовать WebSockets. Это стандарт 2011 года, который позволяет инициировать соединения с HTTP и затем обновить их до двухнаправленного обмена сообщениями между клиентом и сервером.
Вы можете легко инициировать соединение с javascript:
var ws = new WebSocket("ws://your.domain.com/somePathIfYouNeed?args=any");
ws.onmessage = function (evt)
{
var message = evt.data;
//decode message (with JSON or something) and do the needed
};
Обработка на стороне разъединения зависит от вашего стека tenchnology.
Посмотрите на Comet (пародия на то, что Ajax является чистящим средством и поэтому является Comet), который в основном "reverse Ajax." знает, что это требует длительного подключения к серверу для каждого пользователя, чтобы получать уведомления, поэтому будьте в курсе последствий производительности при написании вашего приложения.
Комета-это определенно то, что вы хотите. В зависимости от ваших требований к языку и фреймворку доступны различные серверные библиотеки. Например, WebSync-это IIS-интегрированный сервер comet для разработчиков ASP.NET/C#/IIS, а также есть куча других автономных серверов, если вам нужна более тесная интеграция с другими языками.
Я бы настоятельно рекомендовал потратить некоторое время на Comet, но я не знаю реальной реализации или библиотеки, которую вы могли бы использовать.
Для своего рода "callcenter control panel" веб-приложения, которое включало агент обновления и статус Очереди вызовов для живого центра обработки вызовов, мы разработали собственное решение, которое работает, но находится далеко от библиотеки, которую вы могли бы использовать.
Что мы сделали, так это внедрили небольшой сервис на сервере, который разговаривает с телефонной системой, ждет новых событий и поддерживает фотографию ситуации. Эта услуга предоставляет небольшой webserver.
Наши веб-клиенты подключаются через HTTP к этому webserver и запрашивают последнюю фотографию (закодированную в XML), отображают ее и затем снова идут, запрашивая новую фотографию. webserver в этот момент может:
- Верните новую фотографию, если она есть
- Заблокируйте клиента на несколько секунд (30 в нашей настройке), ожидая какого-то события для ocurr и изменения фотографии. Если в этот момент не было сгенерировано ни одного события, он возвращает ту же фотографию, но только для того, чтобы соединение оставалось живым и не требовало тайм-аута клиента.
Таким образом, при опросе клиентов он получает ответ максимум за 0-30 секунд. Если новое событие уже было сгенерировано, оно получает его немедленно), в противном случае оно блокируется до тех пор, пока не будет сгенерировано новое событие.
Это в основном опрос, но это несколько умный опрос, чтобы не перегревать webserver. Если комета не является вашим ответом, я уверен, что это может быть реализовано с использованием той же идеи, но с более широким использованием AJAX или кодированием в JSON для получения лучших результатов. Это было разработано до эпохи AJAX, так что есть много возможностей для улучшения.
Если кто-то может обеспечить фактическую легкую реализацию этого, отлично!
Интересной альтернативой Comet является использование сокетов в Flash.
Еще один, стандартный, способ - это SSE (серверные события, также известные как EventSource, после объекта JavaScript).
Комета была фактически придумана Алексом Расселом из Dojo Toolkit ( http://www.dojotoolkit.org ). Вот ссылка на дополнительную информацию http://cometdproject.dojotoolkit.org/
Возможно, стоит проверить Meteor Server , который является веб-сервером, предназначенным для COMET. Хорошая демо -версия, и она также используется twitterfall .
Есть и другие методы. Не уверен, что они "better" в вашей ситуации. У вас может быть Java applet, который подключается к серверу при загрузке страницы и ждет отправки материала сервером. Это было бы совсем немного медленнее при запуске, но позволило бы браузеру получать данные с сервера нечасто, без опроса.
Можно достичь того, к чему вы стремитесь, используя постоянные соединения http.
Посмотрите статью о комете в Википедии, это хорошее место для начала.
Вы не предоставляете много информации, но если вы смотрите на создание какого-то событийного сайта (a'La digg spy) или что-то в этом роде, вы, вероятно, будете смотреть на реализацию скрытого IFRAME, который соединяется с url, где соединение никогда не закрывается, а затем вы будете передавать теги сценариев с сервера на клиент для выполнения обновлений.
Вы можете использовать приложение Flash/Flex на клиенте с BlazeDS или LiveCycle на стороне сервера. Данные могут быть переданы клиенту с помощью соединения RTMP. Имейте в виду, что RTMP использует нестандартный порт. Но вы можете легко вернуться к опросу, если порт заблокирован.
Как только соединение открыто к серверу, его можно держать открытым, и сервер может толкать содержимое уже давно я сделал это с помощью multipart/x-mixed-replace , но это не сработало в IE.
Я думаю, что вы можете сделать умные вещи с опросом, который делает его более похожим на push, не отправляя содержимое неизмененных заголовков, но оставляя соединение открытым, но я никогда этого не делал.
пожалуйста, проверьте эту библиотеку https://github.com/SignalR/SignalR , чтобы узнать, как динамически передавать данные клиентам, когда они становятся доступными
Вы можете попробовать нашу кометную составляющую - хотя это очень экспериментально...!
Вы также можете просмотреть Java Pushlets, если вы используете jsp страниц.