Tuesday

use of hashtable in javascript

here is an example of usage of hashtable in javascript.For example I want to asociate specific buttonId
with specific grid Id I could create following hashtable:
 
var GridsButtons = {
'AGroupsListGrid' :'DelA',
'BGroupsListGrid' :'DelB'
};


Then I could use it in code :
 var buttonid = GridsButtons[gid]; 


asp.net mvc ajax post from javascript

Following example demonstrate how to submit form in asp.net MVC for strict type view based on model:
(view has this instruction oin top:
@model MyModel
):

javascript part:
      
<script type="text/javascript">
$(document).ready(function() {
$("#GoButton").click(function() {
var frm = $(this).closest('form');
var params = frm.serialize();
$.ajax({
type: 'POST',
url: '@Url.ApplicationAction("MyPostAction", "myController")',
data: params,
cache: false,
success: function (data) {
alert('Completed');
},
error: function (xhr, data, message) {
//console.log(data + ": " + message);
},
dataType: "json"
});
return false;
});
});
</script>


on server side model variable will have updated with all values submitted in form and will have following parameters:
 
[HttpPost]
public ActionResult MyPostAction(MyModel model)
{

return Json("Ok");
}




jquery events with example

Following example demonstrate how to use jQuery events:
To trigger event use this code :

 $document.trigger('Grid_CheckBox_Click',gridId,this); 

Grid_CheckBox_Click is the name of my event.

to Subscribe to event use this code:
 
$(document).bind('Grid_CheckBox_Click', function (e, elem) {
MyFunction(e);
});


Thursday

mvc radiobuttonfor example

below is an example of creating mvc radio button control for boolean model myBoolProperty property
 
@Html.LabelFor( m => m.myBoolProperty)
@Html.RadioButtonFor(m => m.myBoolProperty, true)
@StringResources.Submitted
@Html.RadioButtonFor(m => m.myBoolProperty, false)
@StringResources.Fulfillment


Tuesday

mercurial server multiple repositories

Serving multiple repositories using hg serve.


Here's my hgweb.config file:


[paths]
project-a = C:/hg/project-a/
library-b = C:/hg/library-b/

I start hg serve with this command:


hg serve --address 127.0.0.1 --port 8000 --webdir-conf C:/hg/hgweb.config --encoding utf8



Monday

Уроки




Урок 1 (он же главный): Найдите наикратчайший из способов удовлетворить потребность и не напрягайте пользователей деталями.

Нам через день предлагают добавить ту или иную фишку. Первый вопрос которым мы задаемся — а какому проценту наших пользователей это понадобиться. Если меньше 5% — мы этого делать не будем.

Урок 2 (вообще-то продолжение первого): ненужная большинству функциональность вредна поскольку усложняет понимание.

Вот как мы расправились с некоторыми из сложностей:

  1. Программа должна была работать с несколькими проектами/работами. Однако для большинства достаточно создать только один проект выбрав несколько баз для бэкапа. Мы сделали так, что программа сама открывает тот же проект, что и в прошлый раз и соединяется с тем же SQL сервером — так что большинство даже и не задумывается, что можно работать с несколькими проектами.
  2. SQL Connection String — до сих пор самая сложная часть для пользователя. При первом запуске мы, не спрашивая пользователя, перебираем самые распространенные Connection String, так что, открыв программу, большинство пользователей уже подключились к серверу и видят список своих баз данных.
  3. Посылка писем — чтобы не напрягать пользователей с настройкой SMTP мы по умолчанию посылаем письма через веб-сервис на своем сервере. Для бесплатных пользователей фишка бесплатна на неделю, а потом можно либо купить платную версию либо пользоваться своим Gmail или другим SMTP сервером.
  4. Расписание — большинству требуется Full Backup один раз в день. Что и можно сделать на основной форме. Для более продвинутых все настройки спрятаны за кнопкой Settings.

Деньги


Поработав немного, мы сделали первую версию программки. Далее мы поставили ее во все shareware-сайты и оставили комментарии на форумах по этой теме. Понемногу пошли клиенты. Через два месяца после выпуска нас заметила одна большая компания, продукт которой был основан на SQL и его пользователи с небольшими техническими знаниями были сами ответственны за бэкап. Для них мы подходили идеально и они послали всех своих пользователей к нам. Кроме этого они даже взяли на себя заботу по тех поддержке. Деньги потекли рекой.

Основная версия (Standard) стоит сейчас $59. Для тех компаний для которых это не деньги — у нас есть Professional с добавкой AES encryption за $69. Для экономных — Lite (максимум 5 баз данных) за $29. С год назад я прочитал какую-то статью о том, что цены на странице Prices нужно подавать от больших к малым дабы пользователю, испуганному первыми большими цифрами, цифра в середине показалась относительно скромной. Мы подумали: что бы такого выпустить дорогого чтобы пугать пользователей? Так родилась идея Lifetime-версии за $199 (сейчас $149) с бесплатными пожизненными обновлениями. И мы очень удивились когда ее стали бодро покупать!

Потом товарищ подкинул другую идею, которая принесла тысячи долларов. В добавок к продуктам мы продаем за небольшие деньги еще и Extended Support (тем, кто его купил — особое внимание при поддержке) и бесплатное обновление на 1 год (по умолчанию — 1 месяц). Дополнительные усилия близки к 0, а деньги понемногу капают…

Урок 3 — дайте пользователю заплатить столько, сколько он хочет и может.

Пиратство и жадность


С первых дней существования мы решили тратить только минимум времени на борьбу с пиратством. В программе зашит алгоритм на проверку лицензионного ключа который несложно взломать. Идея такова: если человек запускает keygen для взлома — он вряд ли заплатил бы за программу без этого. А так — будет пользоваться и, возможно, когда остепенится, тогда и почувствует потребность заплатить.
Многие устанавливают ключик на несколько машин — мы просто посылаем вежливые письма с напоминанием, что это неправильно. Компании в цивилизованных странах стараются договоренности соблюдать и покупают недостающие лицензии. С менее цивилизованными мы могли бы справиться добавив активацию, но это усложнило бы жизнь для большинства честных клиентов. И опять же: нами пользуются и это уже хорошо.

Урок 4 — концентрируйтесь на продукте, а не на защите. Пират сегодня — клиент завтра.

Большинству вполне хватает бесплатной версии в которой можно делать то же самое, что и в стандартной, только с ограничением в две базы данных. Благодарный народ даже пожертвования предлагает. Да мы и рады: когда потребности вырастут, тогда и заплатят, а заодно боремся с бесплатными самоделками.
Недавно мы добавили бэкапы в Amazon S3, Google Drive и Dropbox. Сначала было желание брать дополнительные деньги. Но решили не напрягать пользователей и просто добавить к существующим версиям. Будет больше пользователей — значит и доходы вырастут.

Урок 5 — довольные клиенты важнее сиюминутного наполнения карманов.

Friday

py2exe mechanize

I've got problem with including mechanize into py2exe package.
I resolved this problem by
  1. uninstalling packages by running easy_install with -m key

easy_install -m mechanize
easy_install -m MultiPartPostHandler

  1. physically removing .eggs files from python2.X/site-packages/MYPACKAGE.egg
  1. installing packages with -Z key

easy_install.exe -Z mechanize
easy_install.exe -Z MultiPartPostHandler


Pomodoro technique game

imagemagic add text to image

rem different types of text annotations on existing images rem cyan yellow orange gold rem -gravity SouthWest rem draw text and anno...