воскресенье, 27 декабря 2009 г.

Flajaxian FileUploader

После долгих изысканий я наконец-то нашел достойный компонент для асинхронной закачки файлов на сервер в ASP.NET (в моем случае 2.0) - Flajaxian FileUploader.

Источник: http://flajaxianfileupload.codeplex.com/
Help: http://www.flajaxian.com/flajaxian.com/FileUploader2.0Help.html
Видео (англ.): http://blog.bodurov.com/how-to-use-flajaxian-fileuploader-video-basics

В моем примере представлен собственно сам компонент загрузки файлов на сервер, в данном случае графических файлов. Контроль Image, показывающий уже загруженое изображение, и скрытая кнопка. Все это находится внутри Update Panel. После того как файл загружен эмулируется нажатие на скрытую кнопку и происходит обновление контрола Image и мы тут же видим только что загруженное изображение.
Код расположенный на моей aspx странице:

  1. <fieldset>
  2. <legend class="legend" onclick="slideBlock('blockBOLogo');">Reseller logo for Back End (please ensure your logo size is 415x70 pixels only)legend>
  3. <div id="blockBOLogo" class="blockLogo">
  4. <asp:ScriptManager ID="ScriptManager1" runat="server">
  5. asp:ScriptManager>
  6. <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
  7. <ContentTemplate>

  8. <asp:Image ID="imgBOLogo" runat="server" CssClass="imageResellerLogoBO"/>
  9. <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" style="display:none;"/>
  10. <br/><br/>
  11. <fjx:FileUploader ID="FileUploader1" runat="server"
  12. UseInsideUpdatePanel="true"
  13. RequestAsPostBack="true"
  14. OnFileReceived="FileUploader1_FileReceived"
  15. PageUrl="~/ResellerEdit.aspx?proj=HOTEL&id_reseller=2"
  16. SuppressQueryStringParametersOnUploadUrl="false"

  17. JsFunc_FileStateChanged="fn_fileStateChanged"

  18. CssUrl="~/Control/Style/FileUploader.css"
  19. TransparentBackground="true"
  20. ImagesPath="~/Control/Image/Uploader/"
  21. BrowseButtonUrl="Browse.gif"
  22. BrowseButtonOverUrl="BrowseOver.gif"
  23. BrowseButtonPressedUrl="BrowseOver.gif"
  24. BrowseButtonDisabledUrl="Browse.gif"
  25. UploadButtonUrl="Upload.gif"
  26. UploadButtonOverUrl="UploadOver.gif"
  27. UploadButtonPressedUrl="UploadOver.gif"
  28. UploadButtonDisabledUrl="Upload.gif"
  29. CancelButtonUrl="Cancel.gif"
  30. CancelButtonOverUrl="CancelOver.gif"
  31. CancelButtonPressedUrl="Cancel.gif"

  32. ProgressBorderSize="0"
  33. ProgressBorderColor="#fff1dd"
  34. ProgressBackUrl="ProgressBackground.gif"
  35. ProgressForeUrl="ProgressFore.gif"

  36. MaxNumberFiles="1" MaxFileNumberReachedMessage="You can select only up to {0} files in one queue"
  37. MaxFileSize="2MB" MaxFileSizeReachedMessage="No files bigger than {0} are allowed"
  38. AllowedFileTypes="Web Images (Jpeg, Gig, Png):*.jpg;*.jpeg;*.png;*.gif"

  39. >
  40. <Adapters>
  41. <fjx:ThumbGeneratorAdapter Runat="server"
  42. Extensions="jpg;jpeg;gif;png;bmp" FolderName="/Control/Upload"
  43. Suffix="_thumb" MaximumWidth="200" MaximumHeight="200" />

  44. <fjx:FileSaverAdapter Runat="server" FolderName="/Control/Upload" />

  45. Adapters>
  46. fjx:FileUploader>

  47. ContentTemplate>
  48. asp:UpdatePanel>
  49. div>
  50. fieldset>
  51. <script type="text/javascript">
  52. function fn_fileStateChanged(uploader, file, httpStatus, isLast) {
  53. Flajaxian.fileStateChanged(uploader, file, httpStatus, isLast);
  54. if (file.state > Flajaxian.File_Uploading) {
  55. document.getElementById("<%= Button1.ClientID %>").click();
  56. }
  57. }
  58. script>
* This source code was highlighted with Source Code Highlighter.

Адаптер "fjx:FileSaverAdapter" (строчка 51) отвечает за сохранение фалов на диск, если вы планируете сохранять загружаемый файл сразу в базу (смотри пример ниже), то можете просто удалить строчку "fjx:FileSaverAdapter".

Адаптер "fjx:ThumbGeneratorAdapter" очень интересен. Он налету создает превьюшки загружаемых графических файлов.


Вот пример серверных методов подвешенных на события выше приведенного кода:

  1. protected void FileUploader1_FileReceived(object sender, com.flajaxian.FileReceivedEventArgs e)
  2. {
  3. curProject = Utils.getParamString(Global.ManagementArgumnet.Project);

  4. curId = Utils.getParamInt(Global.ManagementArgumnet.ResellerId);

  5. int maxSizeAllowed = 2000000;
  6. int contentLenght = e.File.ContentLength;
  7. if (contentLenght <>
  8. {
  9. Stream stream = (Stream)e.File.InputStream;

  10. if (stream != null)
  11. {
  12. Reseller.TrySaveImage(curProject, curId, Library.ImageType.ResellerLogoBO, stream, contentLenght);

  13. }
  14. }
  15. }

  16. protected void Button1_Click(object sender, EventArgs e)
  17. {
  18. int rand = new Random().Next(0, 100000);

  19. imgBOLogo.ImageUrl = imgBOLogo.ImageUrl + "&random=" + rand;
  20. imgBOLogo.Visible = true;
  21. imgBOLogo.DataBind();

  22. UpdatePanel1.Update();
  23. }
* This source code was highlighted with Source Code Highlighter.

пятница, 25 декабря 2009 г.

Использование классической клавиатуры

Я решил и здесь поместить мою спонтанную статью о расположении клавишь на клавиатуре (http://trendclub.ru/blogs/wepc/2866), о которой я упоминал в предыдущем посте. Не смотря на то, что статья была написана, прямо скажем, на скорую руку, эта идея была выстраданна на собственном опыте и я действительно прочувстовал необходимость ее реализации. И так:

Использование классической клавиатуры

Даешь классический вариант расположения клавиш! Самые чаcто используемые клавиши это стрелки и навигационные клавиши (Insert, Delete, Home, End, Page Up, Page Down). Не стоит расталкивать эти клавиши куда попало, оставьте их на своем классическом месте.

Простота и классика

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

Классическая клавиатура

Клиентам больше не нужно судорожно разыскивать клавиши на клавиатуре - они всегда на своем месте! На работе, дома, в гостях и на любимом нотубуке - везде класическое расположение клавишь.

Рынок наводнен различными вариантами клавиатур: (псевдо-)эргономичные, разделенные, выгнутые, геймерские и т.п. Ноутбучные клавиатуры это вообще отдельный разговор, различе вариантов расположения неоторых клавиш просто сводит с ума. Даешь классический вариант расположения клавишь! Самые чаcто используемые клавиши это стрелки и навигационные клавиши (Insert, Delete, Home, End, Page Up, Page Down). Для меня, классическим рассположением, этих наиболее важных клавиш, является следующее:
"Insert" "Home" "PageUp"
"Delete" "End" "PageDown"
______"Вверх"_______
"Влево" "Вниз" "Вправо"

Понятно, что на маленьких нетбуках, такое было бы просто расточительством сильно ограниченной площади, но к примеру для 15-дюймовых нуотбуков это вполне приемлемо. Что касается, так называемой, цифровой клавиатуры - она изначально дублирует все уже имеющиеся клавиши, что на мой взгляд излишне.
Это был вариант номер один.
Теперь вариант номер два.
Берем "стандартную" клавиатуру, ее основные части слева направо: "основной блок клавишь" "навигационные клавиши (представлены выше)" "цифровая часть (включает дублирубщие клавиши)". Т.к. "цифровая часть" содержит теже самые навигационные клавиши, мы можем исключить весь блок навигацонных клавиш. Останется: "основной блок клавишь" "цифровая часть (включает дублирубщие клавиши)". И опять же оставим все клавиши на своих местах! :)

четверг, 24 декабря 2009 г.

Не удержался и выдвинул свою маленькую идею на конкурс от TrendClub "Придумай компьютер своей мечты" (http://trendclub.ru/wepc).
И о ужос!
Для начала с первой попытки не удалось отправить зявку (статью) - вылезла сервреная ошибка php файла, жаль не сохранил ее.
Потом отдельно зарегился на сайте и тогда уже все получилось, вот: http://trendclub.ru/blogs/wepc/2866
Ну почти все.
Нельзя редактировать свою статью, но что хуже нельзя редактировать свои комментарии!
:(
Жаль, очень жаль. Я облажался, а отредактировать или удалить уже не могу.

среда, 16 декабря 2009 г.

IT менеджер - переводчик

Клиент, обращаясь в тех. поддержку IT проекта, выражает свою мысль в понятных ему терминах. Он может путать определения, называть части проекта как ему заблагорассудиться и т.д. У нас например клиенты могут вместо discount сказать promotion, вместо promotion - %age discount... Вообщем клиент говорит на своем обычном человеческом языке. И от этого никуда не деться, ведь клиентов много, всех не научишь называть вещи своими, устоявишимися внутри проекта, именами, нельзя научить всех клиентов говорить на языке разработчиков. Но это и не нужно.
Между клиентом и разработчиком (developer-ом) должен быть посредник - менеджер проекта, вот именно он должен переводить обычный человеческий язык клиента на язык которым оперируют разработчик - язык внутренних терминов проекта.
Менеджер проекта должен быть перводчиком, который преобразует пожелание от клиента о новой фиче, аля "I need daily rate %-age promotion discount" в что-то более внятное.
Конечно это только одна из обязанностей менеджера проекта и скорее всего частный случай, актуальный лишь для моего настоящего места работы... но вот наболело и все тут.
Надоело получать письма клиентов, которые вышестоящее начальство неглядя переправляет мне, лишь дописывая "Can you please have a look at below request...".

четверг, 10 декабря 2009 г.

Заметки о деловой переписке

Когда порядочная организация получает email от кого бы то ни было, она просто обязана ответить хоть что-нибудь, даже стандартного автоматического письма о том, что ваш запрос получен и будет обработан - уже достаточно.

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

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

Опять же было бы не плохо если бы любая деловая почта первично обрабатывалась в течение 3 дней.

Это же просто не прилично игнорировать важные email-ы! Когда же культура придет в массы?! Вы еще скажите, что почтальон ваше письмо потерял, что почерк не разборчивый или кошка сгрызла конверт!

пятница, 4 декабря 2009 г.

Интересные вопросы на удаленном собеседовании на удаленную вакансию разработчика:

1) Есть код:
...
public static void A(int a)
{
a = 10;
}
public static void B(string s)
{
s = "AAA";
}
public static void C(MyOwnClass cc)
{
cc.field = 25;
}
...
В чем различие этих методов и получаемого при вызове результата?
2) В чём смысл паттерна "Абстрактная фабрика"? Когда его стоит применять, а когда - нет?
3) Напишите (без дополнительных материалов, естественно) балансировку бинарного дерева на C#.
4) У вас есть очень большой (намного больше объема доступной оперативной памяти) файл, состоящий из записей фиксированного размера. Запись состоит из, предположим, идентификатора (числа) и некоторых данных. Записи не упорядочены. Задача - упорядочить записи максимально эффективным образом. Каким образом вы будете решать указанную задачу?
Мой первый пост на новом месте
Новый клиент на нашем проекте принес мне новые знания.
1. Не стоит ограничивать длинну поля почтового индека (postcode) 8-ю символами, потому что на Кипре индекс может быть вот такой: 8820 PAPHOS. Итог - делаем postcode длинной 12 символов
2. Валюта STG. Что это? Оказывается это тот же самый фунт стерлинг GBP, а именно сокращение от слова Sterling.